summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.hgignore1
-rwxr-xr-x[-rw-r--r--].hgtags43
-rw-r--r--BuildParams54
-rw-r--r--autobuild.xml244
-rwxr-xr-xbuild.sh70
-rw-r--r--doc/contributions.txt27
-rw-r--r--etc/message.xml28
-rw-r--r--indra/cmake/00-Common.cmake2
-rw-r--r--indra/cmake/CMakeLists.txt3
-rw-r--r--indra/cmake/Copy3rdPartyLibs.cmake23
-rw-r--r--indra/cmake/FindHUNSPELL.cmake38
-rw-r--r--indra/cmake/GooglePerfTools.cmake40
-rw-r--r--indra/cmake/Havok.cmake83
-rw-r--r--indra/cmake/Hunspell.cmake22
-rw-r--r--indra/cmake/LLAddBuildTest.cmake9
-rw-r--r--indra/cmake/LLConvexDecomposition.cmake12
-rw-r--r--indra/cmake/LLPhysicsExtensions.cmake35
-rw-r--r--indra/cmake/Linking.cmake3
-rw-r--r--indra/cmake/Variables.cmake4
-rw-r--r--indra/cmake/ViewerMiscLibs.cmake8
-rw-r--r--indra/integration_tests/llui_libtest/CMakeLists.txt3
-rw-r--r--indra/llcharacter/llcharacter.cpp6
-rw-r--r--indra/llcharacter/llhandmotion.cpp60
-rw-r--r--indra/llcharacter/llmotioncontroller.cpp17
-rw-r--r--indra/llcommon/CMakeLists.txt1
-rw-r--r--indra/llcommon/indra_constants.h1
-rw-r--r--indra/llcommon/llallocator.cpp2
-rw-r--r--indra/llcommon/llcursortypes.cpp6
-rw-r--r--indra/llcommon/llcursortypes.h6
-rw-r--r--indra/llcommon/llerror.cpp9
-rw-r--r--indra/llcommon/llerror.h7
-rw-r--r--indra/llcommon/llerrorcontrol.h2
-rw-r--r--indra/llcommon/llhandle.h (renamed from indra/llui/llhandle.h)58
-rw-r--r--indra/llcommon/llinitparam.h16
-rw-r--r--indra/llcommon/llmemory.cpp12
-rw-r--r--indra/llcommon/llmemory.h45
-rw-r--r--indra/llcommon/llpointer.h6
-rw-r--r--indra/llcommon/llregistry.h30
-rw-r--r--indra/llcommon/llsd.cpp1
-rw-r--r--indra/llcommon/llsdserialize.cpp83
-rw-r--r--indra/llcommon/llsdserialize.h2
-rw-r--r--indra/llcommon/llstatenums.h77
-rw-r--r--indra/llcommon/llstl.h51
-rw-r--r--indra/llcommon/llstrider.h10
-rw-r--r--indra/llcommon/llstring.h3
-rw-r--r--indra/llcommon/lltypeinfolookup.h141
-rw-r--r--indra/llcommon/lluuid.cpp171
-rw-r--r--indra/llcommon/lluuid.h173
-rw-r--r--indra/llcommon/llversionviewer.h4
-rw-r--r--indra/llimage/llimage.cpp9
-rw-r--r--indra/llimage/llimage.h2
-rwxr-xr-x[-rw-r--r--]indra/llimage/llimagej2c.cpp0
-rw-r--r--indra/llinventory/llparcel.cpp67
-rw-r--r--indra/llinventory/llparcel.h9
-rw-r--r--indra/llkdu/llimagej2ckdu.cpp4
-rw-r--r--indra/llkdu/llimagej2ckdu.h1
-rw-r--r--indra/llkdu/llkdumem.h1
-rwxr-xr-x[-rw-r--r--]indra/llkdu/tests/llimagej2ckdu_test.cpp19
-rw-r--r--indra/llmath/CMakeLists.txt1
-rw-r--r--indra/llmath/llcamera.h12
-rw-r--r--indra/llmath/llmath.h6
-rw-r--r--indra/llmath/llmatrix3a.h2
-rw-r--r--indra/llmath/llmatrix4a.h2
-rw-r--r--indra/llmath/lloctree.h147
-rw-r--r--indra/llmath/llplane.h4
-rw-r--r--indra/llmath/llsimdmath.h3
-rw-r--r--indra/llmath/llsimdtypes.inl2
-rw-r--r--indra/llmath/llvector4a.cpp8
-rw-r--r--indra/llmath/llvector4a.h6
-rw-r--r--indra/llmath/llvector4a.inl1
-rw-r--r--indra/llmath/llvector4logical.h2
-rw-r--r--indra/llmath/llvolume.cpp53
-rw-r--r--indra/llmath/llvolume.h5
-rw-r--r--indra/llmath/llvolumeoctree.cpp6
-rw-r--r--indra/llmath/llvolumeoctree.h35
-rw-r--r--indra/llmath/tests/alignment_test.cpp128
-rw-r--r--indra/llmessage/llavatarnamecache.cpp20
-rw-r--r--indra/llmessage/llcurl.cpp218
-rw-r--r--indra/llmessage/llcurl.h65
-rw-r--r--indra/llmessage/llsdmessagereader.cpp2
-rw-r--r--indra/llmessage/llurlrequest.cpp5
-rw-r--r--indra/llmessage/message_prehash.cpp3
-rw-r--r--indra/llmessage/message_prehash.h3
-rw-r--r--indra/llmessage/tests/llhttpclient_test.cpp1
-rw-r--r--indra/llprimitive/CMakeLists.txt2
-rw-r--r--indra/llprimitive/llmodel.cpp3
-rwxr-xr-x[-rw-r--r--]indra/llprimitive/llprimitive.cpp31
-rw-r--r--indra/llprimitive/llprimitive.h7
-rw-r--r--indra/llprimitive/object_flags.h65
-rw-r--r--indra/llrender/CMakeLists.txt2
-rw-r--r--indra/llrender/llcubemap.cpp2
-rw-r--r--indra/llrender/llfontgl.cpp10
-rw-r--r--indra/llrender/llfontgl.h2
-rw-r--r--indra/llrender/llgl.cpp90
-rw-r--r--indra/llrender/llgl.h29
-rw-r--r--indra/llrender/llglheaders.h13
-rw-r--r--indra/llrender/llglslshader.cpp11
-rw-r--r--indra/llrender/llglslshader.h4
-rw-r--r--indra/llrender/llglstates.h5
-rwxr-xr-x[-rw-r--r--]indra/llrender/llimagegl.cpp140
-rwxr-xr-x[-rw-r--r--]indra/llrender/llimagegl.h19
-rw-r--r--indra/llrender/llrender.cpp39
-rw-r--r--indra/llrender/llrender.h1
-rw-r--r--indra/llrender/llrendernavprim.cpp59
-rw-r--r--indra/llrender/llrendernavprim.h49
-rw-r--r--indra/llrender/llrendertarget.cpp47
-rw-r--r--indra/llrender/llrendertarget.h9
-rw-r--r--indra/llrender/llshadermgr.cpp44
-rw-r--r--indra/llrender/llshadermgr.h2
-rw-r--r--indra/llrender/llvertexbuffer.cpp274
-rw-r--r--indra/llrender/llvertexbuffer.h39
-rw-r--r--indra/llui/CMakeLists.txt6
-rwxr-xr-x[-rw-r--r--]indra/llui/llcontainerview.cpp0
-rw-r--r--indra/llui/lllineeditor.cpp306
-rw-r--r--indra/llui/lllineeditor.h33
-rw-r--r--indra/llui/llmenugl.cpp10
-rw-r--r--indra/llui/llmenugl.h6
-rw-r--r--indra/llui/llnotifications.cpp4
-rw-r--r--indra/llui/llnotificationtemplate.h2
-rw-r--r--indra/llui/llscrollcontainer.cpp3
-rw-r--r--indra/llui/llscrolllistctrl.cpp21
-rw-r--r--indra/llui/llscrolllistctrl.h2
-rw-r--r--indra/llui/llspellcheck.cpp505
-rw-r--r--indra/llui/llspellcheck.h93
-rw-r--r--indra/llui/llspellcheckmenuhandler.h46
-rw-r--r--indra/llui/lltextbase.cpp273
-rw-r--r--indra/llui/lltextbase.h31
-rw-r--r--indra/llui/lltextbox.cpp2
-rw-r--r--indra/llui/lltexteditor.cpp38
-rw-r--r--indra/llui/llui.cpp6
-rw-r--r--indra/llui/lluictrlfactory.h14
-rw-r--r--indra/llui/llviewmodel.h1
-rw-r--r--indra/llwindow/llkeyboard.cpp2
-rw-r--r--indra/llwindow/llkeyboard.h12
-rw-r--r--indra/llwindow/llkeyboardmacosx.cpp17
-rw-r--r--indra/llwindow/llkeyboardsdl.cpp20
-rw-r--r--indra/llwindow/llkeyboardwin32.cpp60
-rw-r--r--indra/llwindow/llwindowwin32.cpp10
-rw-r--r--indra/llxml/llcontrol.cpp14
-rw-r--r--indra/llxml/llcontrol.h8
-rwxr-xr-x[-rw-r--r--]indra/newview/CMakeLists.txt82
-rw-r--r--indra/newview/app_settings/autoreplace.xml8330
-rw-r--r--indra/newview/app_settings/cmd_line.xml46
-rw-r--r--indra/newview/app_settings/keywords.ini92
-rwxr-xr-x[-rw-r--r--]indra/newview/app_settings/logcontrol.xml0
-rwxr-xr-x[-rw-r--r--]indra/newview/app_settings/settings.xml502
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/alphaNonIndexedNoColorF.glsl8
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/avatarF.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/bumpF.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/diffuseAlphaMaskF.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/diffuseAlphaMaskIndexedF.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/diffuseAlphaMaskNoColorF.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/diffuseF.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/diffuseIndexedF.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/multiPointLightF.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/multiSpotLightF.glsl5
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/pointLightF.glsl7
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/pointLightV.glsl10
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/shadowCubeV.glsl44
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/softenLightF.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/spotLightF.glsl103
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/sunLightSSAOF.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/terrainF.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/treeF.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/waterF.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/interface/clipF.glsl46
-rw-r--r--indra/newview/app_settings/shaders/class1/interface/clipV.glsl38
-rw-r--r--indra/newview/app_settings/shaders/class1/interface/occlusionCubeV.glsl38
-rw-r--r--indra/newview/app_settings/shaders/class1/interface/pathfindingF.glsl37
-rw-r--r--indra/newview/app_settings/shaders/class1/interface/pathfindingNoNormalV.glsl42
-rw-r--r--indra/newview/app_settings/shaders/class1/interface/pathfindingV.glsl54
-rw-r--r--indra/newview/app_settings/shaders/class1/objects/indexedTextureV.glsl4
-rw-r--r--indra/newview/app_settings/shaders/class1/transform/binormalV.glsl36
-rw-r--r--indra/newview/app_settings/shaders/class1/transform/colorV.glsl36
-rw-r--r--indra/newview/app_settings/shaders/class1/transform/normalV.glsl36
-rw-r--r--indra/newview/app_settings/shaders/class1/transform/positionV.glsl40
-rw-r--r--indra/newview/app_settings/shaders/class1/transform/texcoordV.glsl35
-rw-r--r--indra/newview/app_settings/shaders/class2/deferred/alphaF.glsl42
-rw-r--r--indra/newview/app_settings/shaders/class2/deferred/alphaNonIndexedF.glsl40
-rw-r--r--indra/newview/app_settings/shaders/class2/deferred/alphaNonIndexedNoColorF.glsl48
-rw-r--r--indra/newview/app_settings/shaders/class2/deferred/multiSpotLightF.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class2/deferred/softenLightF.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class2/deferred/spotLightF.glsl124
-rw-r--r--indra/newview/app_settings/shaders/class2/deferred/sunLightF.glsl47
-rw-r--r--indra/newview/app_settings/shaders/class2/deferred/sunLightSSAOF.glsl51
-rw-r--r--indra/newview/featuretable.txt1
-rw-r--r--indra/newview/featuretable_xp.txt1
-rwxr-xr-xindra/newview/llagent.cpp720
-rw-r--r--indra/newview/llagent.h84
-rw-r--r--indra/newview/llagentaccess.cpp25
-rw-r--r--indra/newview/llagentaccess.h10
-rwxr-xr-x[-rw-r--r--]indra/newview/llagentwearables.cpp0
-rwxr-xr-x[-rw-r--r--]indra/newview/llagentwearables.h0
-rwxr-xr-x[-rw-r--r--]indra/newview/llappearancemgr.cpp9
-rw-r--r--indra/newview/llappviewer.cpp78
-rw-r--r--indra/newview/llappviewer.h1
-rw-r--r--indra/newview/llappviewerlinux.cpp2
-rw-r--r--indra/newview/llappviewerwin32.cpp2
-rw-r--r--indra/newview/llautoreplace.cpp771
-rw-r--r--indra/newview/llautoreplace.h228
-rw-r--r--indra/newview/llchathistory.cpp9
-rw-r--r--indra/newview/lldrawable.cpp170
-rw-r--r--indra/newview/lldrawable.h33
-rw-r--r--indra/newview/lldrawpool.cpp46
-rw-r--r--indra/newview/lldrawpool.h8
-rw-r--r--indra/newview/lldrawpoolalpha.cpp16
-rw-r--r--indra/newview/lldrawpoolavatar.cpp82
-rw-r--r--indra/newview/lldrawpoolbump.cpp12
-rw-r--r--indra/newview/lldrawpoolterrain.cpp34
-rw-r--r--indra/newview/lldrawpoolterrain.h1
-rw-r--r--indra/newview/lldrawpooltree.cpp16
-rw-r--r--indra/newview/lldriverparam.cpp26
-rw-r--r--indra/newview/lldriverparam.h10
-rw-r--r--indra/newview/lldynamictexture.cpp8
-rw-r--r--indra/newview/lldynamictexture.h12
-rw-r--r--indra/newview/llface.cpp1282
-rw-r--r--indra/newview/llface.h26
-rw-r--r--indra/newview/llfavoritesbar.cpp4
-rw-r--r--indra/newview/llfavoritesbar.h2
-rw-r--r--indra/newview/llfeaturemanager.cpp1
-rw-r--r--indra/newview/llfilepicker.cpp24
-rw-r--r--indra/newview/llfilepicker.h1
-rw-r--r--indra/newview/llflexibleobject.cpp205
-rw-r--r--indra/newview/llflexibleobject.h15
-rw-r--r--indra/newview/llfloaterautoreplacesettings.cpp641
-rw-r--r--indra/newview/llfloaterautoreplacesettings.h117
-rw-r--r--indra/newview/llfloaterbuycontents.cpp4
-rw-r--r--indra/newview/llfloaterbvhpreview.cpp10
-rw-r--r--indra/newview/llfloaterimagepreview.cpp10
-rw-r--r--indra/newview/llfloaterland.cpp60
-rwxr-xr-xindra/newview/llfloatermodelpreview.cpp31
-rw-r--r--indra/newview/llfloatermodelpreview.h5
-rw-r--r--indra/newview/llfloatermodelwizard.cpp795
-rw-r--r--indra/newview/llfloatermodelwizard.h140
-rw-r--r--indra/newview/llfloaterpathfindingcharacters.cpp326
-rw-r--r--indra/newview/llfloaterpathfindingcharacters.h97
-rw-r--r--indra/newview/llfloaterpathfindingconsole.cpp1273
-rw-r--r--indra/newview/llfloaterpathfindingconsole.h220
-rw-r--r--indra/newview/llfloaterpathfindinglinksets.cpp745
-rw-r--r--indra/newview/llfloaterpathfindinglinksets.h134
-rw-r--r--indra/newview/llfloaterpathfindingobjects.cpp866
-rw-r--r--indra/newview/llfloaterpathfindingobjects.h176
-rwxr-xr-xindra/newview/llfloaterpreference.cpp45
-rw-r--r--indra/newview/llfloaterpreference.h2
-rw-r--r--indra/newview/llfloaterregioninfo.cpp147
-rw-r--r--indra/newview/llfloaterregioninfo.h4
-rw-r--r--indra/newview/llfloaterspellchecksettings.cpp491
-rw-r--r--indra/newview/llfloaterspellchecksettings.h68
-rw-r--r--indra/newview/llfloatertexturefetchdebugger.cpp158
-rw-r--r--indra/newview/llfloatertexturefetchdebugger.h5
-rw-r--r--indra/newview/llfloatertools.cpp27
-rw-r--r--indra/newview/llfloatertopobjects.cpp92
-rw-r--r--indra/newview/llfloatertopobjects.h4
-rw-r--r--indra/newview/llfolderview.cpp33
-rw-r--r--indra/newview/llfolderview.h2
-rw-r--r--indra/newview/llfolderviewitem.cpp4
-rw-r--r--indra/newview/llfolderviewitem.h1
-rw-r--r--indra/newview/llgroupmgr.cpp55
-rw-r--r--indra/newview/llgroupmgr.h6
-rw-r--r--indra/newview/llimfloater.cpp4
-rw-r--r--indra/newview/llinventorybridge.cpp34
-rw-r--r--indra/newview/llinventorybridge.h3
-rw-r--r--indra/newview/llinventoryfunctions.cpp50
-rw-r--r--indra/newview/llinventoryfunctions.h1
-rwxr-xr-x[-rw-r--r--]indra/newview/llinventorymodel.cpp5
-rw-r--r--indra/newview/llinventorypanel.cpp1
-rw-r--r--indra/newview/lllocationinputctrl.cpp72
-rw-r--r--indra/newview/lllocationinputctrl.h30
-rw-r--r--indra/newview/llmachineid.cpp18
-rw-r--r--indra/newview/llmaniprotate.cpp24
-rw-r--r--indra/newview/llmanipscale.cpp30
-rw-r--r--indra/newview/llmaniptranslate.cpp48
-rw-r--r--indra/newview/llmarketplacefunctions.cpp16
-rwxr-xr-xindra/newview/llmeshrepository.cpp2
-rw-r--r--indra/newview/llmoveview.cpp4
-rw-r--r--indra/newview/llmutelist.cpp25
-rw-r--r--indra/newview/llnamelistctrl.cpp25
-rw-r--r--indra/newview/llnamelistctrl.h43
-rw-r--r--indra/newview/llnearbychatbar.cpp2
-rw-r--r--indra/newview/llnotificationhandlerutil.cpp20
-rw-r--r--indra/newview/llpanelcontents.cpp4
-rw-r--r--indra/newview/llpaneleditwearable.cpp1
-rw-r--r--indra/newview/llpanelface.cpp80
-rw-r--r--indra/newview/llpanelface.h9
-rw-r--r--indra/newview/llpanelgroupinvite.cpp13
-rw-r--r--indra/newview/llpanellandmedia.cpp1
-rw-r--r--indra/newview/llpanellogin.cpp450
-rw-r--r--indra/newview/llpanellogin.h19
-rw-r--r--indra/newview/llpanelmaininventory.cpp1
-rw-r--r--indra/newview/llpanelnearbymedia.cpp2
-rw-r--r--indra/newview/llpanelobject.cpp73
-rw-r--r--indra/newview/llpanelobject.h7
-rw-r--r--indra/newview/llpanelpathfindingrebakenavmesh.cpp269
-rw-r--r--indra/newview/llpanelpathfindingrebakenavmesh.h96
-rw-r--r--indra/newview/llpanelpermissions.cpp55
-rw-r--r--indra/newview/llpanelvolume.cpp35
-rw-r--r--indra/newview/llpanelvolume.h4
-rw-r--r--indra/newview/llpathfindingcharacter.cpp99
-rw-r--r--indra/newview/llpathfindingcharacter.h63
-rw-r--r--indra/newview/llpathfindingcharacterlist.cpp69
-rw-r--r--indra/newview/llpathfindingcharacterlist.h47
-rw-r--r--indra/newview/llpathfindinglinkset.cpp387
-rw-r--r--indra/newview/llpathfindinglinkset.h108
-rw-r--r--indra/newview/llpathfindinglinksetlist.cpp196
-rw-r--r--indra/newview/llpathfindinglinksetlist.h57
-rw-r--r--indra/newview/llpathfindingmanager.cpp1049
-rw-r--r--indra/newview/llpathfindingmanager.h127
-rw-r--r--indra/newview/llpathfindingnavmesh.cpp205
-rw-r--r--indra/newview/llpathfindingnavmesh.h91
-rw-r--r--indra/newview/llpathfindingnavmeshstatus.cpp145
-rw-r--r--indra/newview/llpathfindingnavmeshstatus.h77
-rw-r--r--indra/newview/llpathfindingnavmeshzone.cpp423
-rw-r--r--indra/newview/llpathfindingnavmeshzone.h128
-rw-r--r--indra/newview/llpathfindingobject.cpp162
-rw-r--r--indra/newview/llpathfindingobject.h80
-rw-r--r--indra/newview/llpathfindingobjectlist.cpp112
-rw-r--r--indra/newview/llpathfindingobjectlist.h67
-rw-r--r--indra/newview/llpathfindingpathtool.cpp467
-rw-r--r--indra/newview/llpathfindingpathtool.h138
-rw-r--r--indra/newview/llphysicsmotion.cpp77
-rw-r--r--indra/newview/llpolymesh.cpp210
-rw-r--r--indra/newview/llpolymesh.h52
-rw-r--r--indra/newview/llpolymorph.cpp165
-rw-r--r--indra/newview/llpolymorph.h18
-rw-r--r--indra/newview/llselectmgr.cpp500
-rw-r--r--indra/newview/llselectmgr.h39
-rw-r--r--indra/newview/llsidepaneliteminfo.cpp2
-rw-r--r--indra/newview/llsidepaneltaskinfo.cpp57
-rw-r--r--indra/newview/llsidepaneltaskinfo.h2
-rw-r--r--indra/newview/llslurl.cpp64
-rw-r--r--indra/newview/llslurl.h8
-rw-r--r--indra/newview/llspatialpartition.cpp537
-rw-r--r--indra/newview/llspatialpartition.h129
-rwxr-xr-x[-rw-r--r--]indra/newview/llstartup.cpp116
-rwxr-xr-x[-rw-r--r--]indra/newview/llstartup.h2
-rw-r--r--indra/newview/llstatusbar.cpp2
-rw-r--r--indra/newview/llsurface.cpp21
-rw-r--r--indra/newview/llsurface.h1
-rw-r--r--indra/newview/llsurfacepatch.cpp14
-rw-r--r--indra/newview/lltexlayerparams.h20
-rw-r--r--indra/newview/lltextureatlas.cpp1
-rw-r--r--indra/newview/lltexturecache.cpp188
-rw-r--r--indra/newview/lltexturecache.h17
-rw-r--r--indra/newview/lltexturectrl.cpp71
-rw-r--r--indra/newview/lltexturectrl.h12
-rwxr-xr-xindra/newview/lltexturefetch.cpp611
-rw-r--r--indra/newview/lltexturefetch.h93
-rwxr-xr-x[-rw-r--r--]indra/newview/lltextureview.cpp6
-rw-r--r--indra/newview/lltoastnotifypanel.cpp18
-rw-r--r--indra/newview/lltooldraganddrop.cpp18
-rw-r--r--indra/newview/lltooldraganddrop.h14
-rw-r--r--indra/newview/lltoolgrab.cpp18
-rw-r--r--indra/newview/lltoolmgr.cpp2
-rw-r--r--indra/newview/lltoolmgr.h6
-rw-r--r--indra/newview/lltoolmorph.cpp3
-rw-r--r--indra/newview/lltoolpie.cpp6
-rw-r--r--indra/newview/lltracker.cpp2
-rw-r--r--indra/newview/llurldispatcher.cpp12
-rwxr-xr-x[-rw-r--r--]indra/newview/llviewerassetstats.cpp0
-rwxr-xr-x[-rw-r--r--]indra/newview/llviewerassetstats.h0
-rw-r--r--indra/newview/llvieweraudio.cpp61
-rw-r--r--indra/newview/llvieweraudio.h7
-rw-r--r--indra/newview/llviewercamera.h13
-rw-r--r--indra/newview/llviewercontrol.cpp37
-rw-r--r--indra/newview/llviewerdisplay.cpp75
-rw-r--r--indra/newview/llviewerfloaterreg.cpp14
-rwxr-xr-x[-rw-r--r--]indra/newview/llviewerinventory.cpp0
-rw-r--r--indra/newview/llviewerjointattachment.cpp24
-rwxr-xr-x[-rw-r--r--]indra/newview/llviewerjointmesh.cpp6
-rwxr-xr-x[-rw-r--r--]indra/newview/llviewerjointmesh.h0
-rw-r--r--indra/newview/llviewermenu.cpp227
-rw-r--r--indra/newview/llviewermenu.h10
-rwxr-xr-xindra/newview/llviewermessage.cpp495
-rw-r--r--indra/newview/llviewermessage.h14
-rw-r--r--indra/newview/llviewernetwork.cpp721
-rw-r--r--indra/newview/llviewernetwork.h204
-rw-r--r--indra/newview/llviewerobject.cpp422
-rw-r--r--indra/newview/llviewerobject.h54
-rw-r--r--indra/newview/llviewerobjectlist.cpp179
-rw-r--r--indra/newview/llviewerobjectlist.h4
-rw-r--r--indra/newview/llviewerparcelmgr.cpp76
-rw-r--r--indra/newview/llviewerparcelmgr.h11
-rw-r--r--indra/newview/llviewerpartsim.cpp2
-rw-r--r--indra/newview/llviewerpartsim.h2
-rw-r--r--indra/newview/llviewerregion.cpp50
-rw-r--r--indra/newview/llviewerregion.h5
-rw-r--r--indra/newview/llviewershadermgr.cpp323
-rw-r--r--indra/newview/llviewershadermgr.h16
-rwxr-xr-x[-rw-r--r--]indra/newview/llviewerstats.cpp31
-rwxr-xr-x[-rw-r--r--]indra/newview/llviewerstats.h5
-rw-r--r--indra/newview/llviewertexture.cpp112
-rwxr-xr-x[-rw-r--r--]indra/newview/llviewertexture.h7
-rw-r--r--indra/newview/llviewertextureanim.cpp26
-rw-r--r--indra/newview/llviewertextureanim.h11
-rw-r--r--indra/newview/llviewertexturelist.cpp181
-rw-r--r--indra/newview/llviewertexturelist.h3
-rw-r--r--indra/newview/llviewervisualparam.h8
-rwxr-xr-xindra/newview/llviewerwindow.cpp56
-rwxr-xr-x[-rw-r--r--]indra/newview/llvoavatar.cpp74
-rwxr-xr-x[-rw-r--r--]indra/newview/llvoavatar.h18
-rwxr-xr-x[-rw-r--r--]indra/newview/llvoavatarself.cpp60
-rwxr-xr-x[-rw-r--r--]indra/newview/llvoavatarself.h12
-rw-r--r--indra/newview/llvograss.cpp180
-rw-r--r--indra/newview/llvograss.h2
-rw-r--r--indra/newview/llvoground.cpp15
-rw-r--r--indra/newview/llvoground.h2
-rw-r--r--indra/newview/llvopartgroup.cpp283
-rw-r--r--indra/newview/llvopartgroup.h25
-rw-r--r--indra/newview/llvosky.cpp3
-rw-r--r--indra/newview/llvosky.h2
-rw-r--r--indra/newview/llvosurfacepatch.cpp68
-rw-r--r--indra/newview/llvotree.cpp23
-rw-r--r--indra/newview/llvotree.h2
-rw-r--r--indra/newview/llvovolume.cpp1380
-rw-r--r--indra/newview/llvovolume.h12
-rw-r--r--indra/newview/llvowater.cpp15
-rw-r--r--indra/newview/llvowater.h2
-rw-r--r--indra/newview/llvowlsky.cpp4
-rw-r--r--indra/newview/llvowlsky.h2
-rw-r--r--indra/newview/llweb.cpp4
-rw-r--r--indra/newview/llworld.cpp14
-rw-r--r--indra/newview/pipeline.cpp1381
-rw-r--r--indra/newview/pipeline.h29
-rw-r--r--indra/newview/res/lltoolpathfinding.curbin0 -> 2238 bytes
-rw-r--r--indra/newview/res/lltoolpathfindingpathend.curbin0 -> 2238 bytes
-rw-r--r--indra/newview/res/lltoolpathfindingpathendadd.curbin0 -> 2238 bytes
-rw-r--r--indra/newview/res/lltoolpathfindingpathstart.curbin0 -> 2238 bytes
-rw-r--r--indra/newview/res/lltoolpathfindingpathstartadd.curbin0 -> 2238 bytes
-rw-r--r--indra/newview/res/viewerRes.rc6
-rw-r--r--indra/newview/skins/default/colors.xml1622
-rw-r--r--indra/newview/skins/default/textures/icons/Pathfinding_Dirty.pngbin0 -> 553 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/Pathfinding_Disabled.pngbin0 -> 384 bytes
-rw-r--r--indra/newview/skins/default/textures/textures.xml5
-rw-r--r--indra/newview/skins/default/textures/widgets/Arrow_Left.pngbin0 -> 311 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/Arrow_Right.pngbin0 -> 313 bytes
-rw-r--r--indra/newview/skins/default/xui/da/floater_model_wizard.xml241
-rw-r--r--indra/newview/skins/default/xui/da/notifications.xml1
-rw-r--r--indra/newview/skins/default/xui/da/panel_login.xml32
-rw-r--r--indra/newview/skins/default/xui/de/floater_hardware_settings.xml4
-rw-r--r--indra/newview/skins/default/xui/de/floater_model_wizard.xml208
-rw-r--r--indra/newview/skins/default/xui/de/floater_stats.xml3
-rw-r--r--indra/newview/skins/default/xui/de/floater_texture_ctrl.xml31
-rw-r--r--indra/newview/skins/default/xui/de/floater_texture_fetch_debugger.xml62
-rw-r--r--indra/newview/skins/default/xui/de/floater_window_size.xml15
-rw-r--r--indra/newview/skins/default/xui/de/menu_viewer.xml11
-rw-r--r--indra/newview/skins/default/xui/de/notifications.xml36
-rw-r--r--indra/newview/skins/default/xui/de/panel_login.xml32
-rw-r--r--indra/newview/skins/default/xui/de/panel_script_question_toast.xml4
-rw-r--r--indra/newview/skins/default/xui/de/panel_volume_pulldown.xml15
-rw-r--r--indra/newview/skins/default/xui/de/strings.xml6
-rw-r--r--indra/newview/skins/default/xui/en/floater_about.xml19
-rw-r--r--indra/newview/skins/default/xui/en/floater_about_land.xml74
-rw-r--r--indra/newview/skins/default/xui/en/floater_autoreplace.xml289
-rw-r--r--indra/newview/skins/default/xui/en/floater_chat_bar.xml1
-rw-r--r--indra/newview/skins/default/xui/en/floater_im_session.xml8
-rw-r--r--indra/newview/skins/default/xui/en/floater_model_preview.xml74
-rw-r--r--indra/newview/skins/default/xui/en/floater_model_wizard.xml841
-rw-r--r--indra/newview/skins/default/xui/en/floater_my_inventory.xml2
-rw-r--r--indra/newview/skins/default/xui/en/floater_pathfinding_characters.xml209
-rw-r--r--indra/newview/skins/default/xui/en/floater_pathfinding_console.xml419
-rw-r--r--indra/newview/skins/default/xui/en/floater_pathfinding_linksets.xml589
-rw-r--r--indra/newview/skins/default/xui/en/floater_preview_notecard.xml1
-rw-r--r--indra/newview/skins/default/xui/en/floater_spellcheck.xml160
-rw-r--r--indra/newview/skins/default/xui/en/floater_spellcheck_import.xml116
-rw-r--r--indra/newview/skins/default/xui/en/floater_stats.xml63
-rw-r--r--indra/newview/skins/default/xui/en/floater_texture_ctrl.xml20
-rw-r--r--indra/newview/skins/default/xui/en/floater_texture_fetch_debugger.xml769
-rw-r--r--indra/newview/skins/default/xui/en/floater_tools.xml117
-rw-r--r--indra/newview/skins/default/xui/en/floater_top_objects.xml62
-rw-r--r--indra/newview/skins/default/xui/en/menu_inventory.xml8
-rw-r--r--indra/newview/skins/default/xui/en/menu_object.xml334
-rw-r--r--indra/newview/skins/default/xui/en/menu_text_editor.xml79
-rw-r--r--indra/newview/skins/default/xui/en/menu_viewer.xml67
-rw-r--r--indra/newview/skins/default/xui/en/notifications.xml654
-rw-r--r--indra/newview/skins/default/xui/en/panel_edit_pick.xml1
-rw-r--r--indra/newview/skins/default/xui/en/panel_group_invite.xml4
-rw-r--r--indra/newview/skins/default/xui/en/panel_group_notices.xml4
-rw-r--r--indra/newview/skins/default/xui/en/panel_login.xml466
-rw-r--r--indra/newview/skins/default/xui/en/panel_navmesh_rebake.xml45
-rw-r--r--indra/newview/skins/default/xui/en/panel_nearby_chat_bar.xml1
-rw-r--r--indra/newview/skins/default/xui/en/panel_preferences_chat.xml29
-rw-r--r--indra/newview/skins/default/xui/en/panel_region_estate.xml4
-rw-r--r--indra/newview/skins/default/xui/en/panel_status_bar.xml1
-rw-r--r--indra/newview/skins/default/xui/en/panel_toolbar_view.xml4
-rw-r--r--indra/newview/skins/default/xui/en/panel_volume_pulldown.xml318
-rw-r--r--indra/newview/skins/default/xui/en/sidepanel_inventory.xml2
-rw-r--r--indra/newview/skins/default/xui/en/sidepanel_item_info.xml4
-rw-r--r--indra/newview/skins/default/xui/en/sidepanel_task_info.xml1126
-rw-r--r--indra/newview/skins/default/xui/en/strings.xml235
-rw-r--r--indra/newview/skins/default/xui/en/teleport_strings.xml8
-rw-r--r--indra/newview/skins/default/xui/en/widgets/location_input.xml16
-rw-r--r--indra/newview/skins/default/xui/es/floater_hardware_settings.xml4
-rw-r--r--indra/newview/skins/default/xui/es/floater_model_wizard.xml208
-rw-r--r--indra/newview/skins/default/xui/es/floater_stats.xml3
-rw-r--r--indra/newview/skins/default/xui/es/floater_texture_ctrl.xml31
-rw-r--r--indra/newview/skins/default/xui/es/floater_texture_fetch_debugger.xml62
-rw-r--r--indra/newview/skins/default/xui/es/floater_window_size.xml15
-rw-r--r--indra/newview/skins/default/xui/es/menu_viewer.xml9
-rw-r--r--indra/newview/skins/default/xui/es/notifications.xml46
-rw-r--r--indra/newview/skins/default/xui/es/panel_login.xml32
-rw-r--r--indra/newview/skins/default/xui/es/panel_script_question_toast.xml4
-rw-r--r--indra/newview/skins/default/xui/es/panel_volume_pulldown.xml14
-rw-r--r--indra/newview/skins/default/xui/es/strings.xml6
-rw-r--r--indra/newview/skins/default/xui/fr/floater_about_land.xml4
-rw-r--r--indra/newview/skins/default/xui/fr/floater_camera.xml2
-rw-r--r--indra/newview/skins/default/xui/fr/floater_edit_day_cycle.xml10
-rw-r--r--indra/newview/skins/default/xui/fr/floater_environment_settings.xml2
-rw-r--r--indra/newview/skins/default/xui/fr/floater_god_tools.xml4
-rw-r--r--indra/newview/skins/default/xui/fr/floater_hardware_settings.xml4
-rw-r--r--indra/newview/skins/default/xui/fr/floater_land_holdings.xml2
-rw-r--r--indra/newview/skins/default/xui/fr/floater_model_preview.xml2
-rw-r--r--indra/newview/skins/default/xui/fr/floater_model_wizard.xml208
-rw-r--r--indra/newview/skins/default/xui/fr/floater_preview_animation.xml2
-rw-r--r--indra/newview/skins/default/xui/fr/floater_stats.xml5
-rw-r--r--indra/newview/skins/default/xui/fr/floater_texture_ctrl.xml31
-rw-r--r--indra/newview/skins/default/xui/fr/floater_texture_fetch_debugger.xml62
-rw-r--r--indra/newview/skins/default/xui/fr/floater_tools.xml2
-rw-r--r--indra/newview/skins/default/xui/fr/floater_top_objects.xml12
-rw-r--r--indra/newview/skins/default/xui/fr/floater_window_size.xml15
-rw-r--r--indra/newview/skins/default/xui/fr/menu_viewer.xml14
-rw-r--r--indra/newview/skins/default/xui/fr/notifications.xml37
-rw-r--r--indra/newview/skins/default/xui/fr/panel_login.xml32
-rw-r--r--indra/newview/skins/default/xui/fr/panel_preferences_move.xml2
-rw-r--r--indra/newview/skins/default/xui/fr/panel_region_debug.xml4
-rw-r--r--indra/newview/skins/default/xui/fr/panel_region_environment.xml2
-rw-r--r--indra/newview/skins/default/xui/fr/panel_region_general.xml2
-rw-r--r--indra/newview/skins/default/xui/fr/panel_region_terrain.xml4
-rw-r--r--indra/newview/skins/default/xui/fr/panel_script_question_toast.xml4
-rw-r--r--indra/newview/skins/default/xui/fr/panel_snapshot_inventory.xml2
-rw-r--r--indra/newview/skins/default/xui/fr/panel_snapshot_local.xml4
-rw-r--r--indra/newview/skins/default/xui/fr/panel_snapshot_options.xml4
-rw-r--r--indra/newview/skins/default/xui/fr/panel_snapshot_postcard.xml2
-rw-r--r--indra/newview/skins/default/xui/fr/strings.xml6
-rw-r--r--indra/newview/skins/default/xui/it/floater_hardware_settings.xml4
-rw-r--r--indra/newview/skins/default/xui/it/floater_model_wizard.xml208
-rw-r--r--indra/newview/skins/default/xui/it/floater_stats.xml3
-rw-r--r--indra/newview/skins/default/xui/it/floater_texture_ctrl.xml31
-rw-r--r--indra/newview/skins/default/xui/it/floater_texture_fetch_debugger.xml62
-rw-r--r--indra/newview/skins/default/xui/it/floater_window_size.xml15
-rw-r--r--indra/newview/skins/default/xui/it/menu_viewer.xml9
-rw-r--r--indra/newview/skins/default/xui/it/notifications.xml36
-rw-r--r--indra/newview/skins/default/xui/it/panel_login.xml32
-rw-r--r--indra/newview/skins/default/xui/it/panel_script_question_toast.xml4
-rw-r--r--indra/newview/skins/default/xui/it/panel_volume_pulldown.xml15
-rw-r--r--indra/newview/skins/default/xui/it/strings.xml6
-rw-r--r--indra/newview/skins/default/xui/ja/floater_hardware_settings.xml4
-rw-r--r--indra/newview/skins/default/xui/ja/floater_model_wizard.xml208
-rw-r--r--indra/newview/skins/default/xui/ja/floater_stats.xml3
-rw-r--r--indra/newview/skins/default/xui/ja/floater_texture_ctrl.xml31
-rw-r--r--indra/newview/skins/default/xui/ja/floater_texture_fetch_debugger.xml62
-rw-r--r--indra/newview/skins/default/xui/ja/floater_window_size.xml15
-rw-r--r--indra/newview/skins/default/xui/ja/menu_viewer.xml10
-rw-r--r--indra/newview/skins/default/xui/ja/notifications.xml36
-rw-r--r--indra/newview/skins/default/xui/ja/panel_login.xml32
-rw-r--r--indra/newview/skins/default/xui/ja/panel_script_question_toast.xml4
-rw-r--r--indra/newview/skins/default/xui/ja/strings.xml6
-rw-r--r--indra/newview/skins/default/xui/pl/notifications.xml1
-rw-r--r--indra/newview/skins/default/xui/pl/panel_login.xml31
-rw-r--r--indra/newview/skins/default/xui/pl/panel_volume_pulldown.xml14
-rw-r--r--indra/newview/skins/default/xui/pt/floater_hardware_settings.xml4
-rw-r--r--indra/newview/skins/default/xui/pt/floater_model_wizard.xml208
-rw-r--r--indra/newview/skins/default/xui/pt/floater_stats.xml3
-rw-r--r--indra/newview/skins/default/xui/pt/floater_texture_ctrl.xml31
-rw-r--r--indra/newview/skins/default/xui/pt/floater_texture_fetch_debugger.xml62
-rw-r--r--indra/newview/skins/default/xui/pt/floater_window_size.xml15
-rw-r--r--indra/newview/skins/default/xui/pt/menu_viewer.xml9
-rw-r--r--indra/newview/skins/default/xui/pt/notifications.xml36
-rw-r--r--indra/newview/skins/default/xui/pt/panel_login.xml32
-rw-r--r--indra/newview/skins/default/xui/pt/panel_script_question_toast.xml4
-rw-r--r--indra/newview/skins/default/xui/pt/strings.xml6
-rw-r--r--indra/newview/skins/default/xui/ru/floater_hardware_settings.xml4
-rw-r--r--indra/newview/skins/default/xui/ru/floater_model_wizard.xml208
-rw-r--r--indra/newview/skins/default/xui/ru/floater_stats.xml3
-rw-r--r--indra/newview/skins/default/xui/ru/floater_texture_ctrl.xml15
-rw-r--r--indra/newview/skins/default/xui/ru/floater_texture_fetch_debugger.xml62
-rw-r--r--indra/newview/skins/default/xui/ru/floater_window_size.xml15
-rw-r--r--indra/newview/skins/default/xui/ru/menu_viewer.xml10
-rw-r--r--indra/newview/skins/default/xui/ru/notifications.xml36
-rw-r--r--indra/newview/skins/default/xui/ru/panel_login.xml32
-rw-r--r--indra/newview/skins/default/xui/ru/panel_script_question_toast.xml4
-rw-r--r--indra/newview/skins/default/xui/ru/strings.xml8
-rw-r--r--indra/newview/skins/default/xui/tr/floater_hardware_settings.xml4
-rw-r--r--indra/newview/skins/default/xui/tr/floater_model_wizard.xml208
-rw-r--r--indra/newview/skins/default/xui/tr/floater_stats.xml3
-rw-r--r--indra/newview/skins/default/xui/tr/floater_texture_ctrl.xml15
-rw-r--r--indra/newview/skins/default/xui/tr/floater_texture_fetch_debugger.xml62
-rw-r--r--indra/newview/skins/default/xui/tr/floater_window_size.xml15
-rw-r--r--indra/newview/skins/default/xui/tr/menu_viewer.xml10
-rw-r--r--indra/newview/skins/default/xui/tr/notifications.xml36
-rw-r--r--indra/newview/skins/default/xui/tr/panel_login.xml32
-rw-r--r--indra/newview/skins/default/xui/tr/panel_script_question_toast.xml4
-rw-r--r--indra/newview/skins/default/xui/tr/strings.xml8
-rw-r--r--indra/newview/skins/default/xui/zh/notifications.xml3
-rw-r--r--indra/newview/skins/default/xui/zh/panel_login.xml32
-rw-r--r--indra/newview/skins/steam/xui/da/strings.xml4483
-rw-r--r--indra/newview/skins/steam/xui/de/strings.xml5018
-rw-r--r--indra/newview/skins/steam/xui/en/strings.xml3761
-rw-r--r--indra/newview/skins/steam/xui/es/strings.xml4925
-rw-r--r--indra/newview/skins/steam/xui/fr/strings.xml5018
-rw-r--r--indra/newview/skins/steam/xui/it/strings.xml4928
-rw-r--r--indra/newview/skins/steam/xui/ja/strings.xml5018
-rw-r--r--indra/newview/skins/steam/xui/pl/strings.xml4340
-rw-r--r--indra/newview/skins/steam/xui/pt/strings.xml4885
-rw-r--r--indra/newview/skins/steam/xui/ru/strings.xml5024
-rw-r--r--indra/newview/skins/steam/xui/tr/strings.xml5025
-rw-r--r--indra/newview/skins/steam/xui/zh/strings.xml4454
-rw-r--r--indra/newview/tests/llagentaccess_test.cpp94
-rw-r--r--indra/newview/tests/lllogininstance_test.cpp8
-rw-r--r--indra/newview/tests/llslurl_test.cpp199
-rwxr-xr-x[-rw-r--r--]indra/newview/tests/llviewerassetstats_test.cpp0
-rw-r--r--indra/newview/tests/llviewernetwork_test.cpp697
-rw-r--r--indra/newview/viewer_manifest.py16
-rw-r--r--indra/test/test.cpp29
613 files changed, 99250 insertions, 13370 deletions
diff --git a/.hgignore b/.hgignore
index 501f9e6abe..b367090227 100644
--- a/.hgignore
+++ b/.hgignore
@@ -25,6 +25,7 @@ indra/lib/mono/indra/*.exe
indra/lib/mono/indra/*.pdb
indra/lib/python/eventlet/
indra/llwindow/glh/glh_linear.h
+indra/newview/app_settings/dictionaries
indra/newview/app_settings/mozilla
indra/newview/app_settings/mozilla-runtime-*
indra/newview/app_settings/mozilla_debug
diff --git a/.hgtags b/.hgtags
index 6dd9a0e111..795ab610ea 100644..100755
--- a/.hgtags
+++ b/.hgtags
@@ -150,6 +150,8 @@ a9abb9633a266c8d2fe62411cfd1c86d32da72bf 2.7.1-release
09984bfa6cae17e0f72d02b75c1b7393c65eecfc 2.7.5-beta1
e1ed60913230dd64269a7f7fc52cbc6004f6d52c 2.8.0-start
502f6a5deca9365ddae57db4f1e30172668e171e 2.8.1-start
+c04e68e1b0034fd0a20815ae24c77e5f8428e822 DRTVWR-188
+888768f162d2c0a8de1dcc5fb9a08bd8bd120a6b DRTVWR-175
2a3965b3ad202df7ea25d2be689291bb14a1280e DRTVWR-155
6866d9df6efbd441c66451debd376d21211de39c DRTVWR-68_2.7.5-release
6866d9df6efbd441c66451debd376d21211de39c 2.7.5-release
@@ -264,6 +266,7 @@ c6175c955a19e9b9353d242889ec1779b5762522 3.2.5-release
16f8e2915f3f2e4d732fb3125daf229cb0fd1875 DRTVWR-114_3.2.8-beta1
37dd400ad721e2a89ee820ffc1e7e433c68f3ca2 3.2.9-start
16f8e2915f3f2e4d732fb3125daf229cb0fd1875 3.2.8-beta1
+089e5c84b2dece68f2b016c842ef9b5de4786842 DRTVWR-161
987425b1acf4752379b2e1eb20944b4b35d67a85 DRTVWR-115_3.2.8-beta2
987425b1acf4752379b2e1eb20944b4b35d67a85 3.2.8-beta2
51b2fd52e36aab8f670e0874e7e1472434ec4b4a DRTVWR-113_3.2.8-release
@@ -286,6 +289,9 @@ d5f263687f43f278107363365938f0a214920a4b 3.3.0-beta1
28b95a6a28dca3338d9a1f4f204b96678df9f6a5 viewer-beta-candidate
b43cd25be49e3984ff5361cefad020e069131d98 3.3.1-start
3e2fca4ed1a0dc9fe6d8a6664e71098bb035a367 DRTVWR-125
+dffd0457ee0745de65bf95f0642a5c9e46b8e2f0 viewer-beta-candidate
+3e2fca4ed1a0dc9fe6d8a6664e71098bb035a367 viewer-beta-candidate
+3e2fca4ed1a0dc9fe6d8a6664e71098bb035a367 viewer-beta-candidate
3e2fca4ed1a0dc9fe6d8a6664e71098bb035a367 3.3.1-start
28b95a6a28dca3338d9a1f4f204b96678df9f6a5 3.3.1-beta1
1dc545e44617975da2a4a32fe303386c687a6ca1 viewer-beta-candidate
@@ -300,7 +306,13 @@ c623bbc854b6f7ee1b33a3718f76715046aa2937 viewer-release-candidate
675668bd24d3bea570814f71762a2a806f7e1b8d viewer-release-candidate
675668bd24d3bea570814f71762a2a806f7e1b8d 3.3.2-release
675668bd24d3bea570814f71762a2a806f7e1b8d viewer-release-candidate
+050e48759337249130f684b4a21080b683f61732 DRTVWR-168
+b9d0170b62eb1c7c3adaa37a0b13a833e5e659f9 DRTVWR-171
+c08e2ac17a99973b2a94477659220b99b8847ae2 DRTVWR-163
+600f3b3920d94de805ac6dc8bb6def9c069dd360 DRTVWR-162
600f3b3920d94de805ac6dc8bb6def9c069dd360 DRTVWR-162
+9a78ac13f047056f788c4734dd91aebfe30970e3 DRTVWR-157
+a716684aa7c07c440b1de5815b8a1f3dd3fd8bfb DRTVWR-159
24a7281bef42bd4430ceb25db8b195449c2c7de3 DRTVWR-153
15e90b52dc0297921b022b90d10d797436b8a1bd viewer-release-candidate
6414ecdabc5d89515b08d1f872cf923ed3a5523a DRTVWR-148
@@ -317,3 +329,34 @@ fdcc08a4f20ae9bb060f4693c8980d216534efdf 3.3.3-beta2
af5f3e43e6e4424b1da19d9e16f6b853a7b822ed DRTVWR-169
4b3c68199a86cabaa5d9466d7b0f7e141e901d7a 3.3.3-beta3
6428242e124b523813bfaf4c45b3d422f0298c81 3.3.3-release
+57d221de3df94f90b55204313c2cef044a3c0ae2 DRTVWR-176
+09ef7fd1b0781f33b8a3a9af6236b7bcb4831910 DRTVWR-170
+005dfe5c4c377207d065fb27858d2eb0b53b143a DRTVWR-167
+f87bfbe0b62d26f451d02a47c80ebef6b9168fc2 3.3.4-beta1
+f87bfbe0b62d26f451d02a47c80ebef6b9168fc2 DRTVWR-158
+f87bfbe0b62d26f451d02a47c80ebef6b9168fc2 3.3.4-beta1
+cbea6356ce9cb0c313b6777f10c5c14783264fcc DRTVWR-174
+bce218b2b45b730b22cc51e4807aa8b571cadef3 DRTVWR-173
+f91d003091a61937a044652c4c674447f7dcbb7a 3.3.4-beta1
+82b5330bc8b17d0d4b598832e9c5a92e90075682 3.3.4-beta2
+eb539c65e6ee26eea2bf373af2d0f4b52dc91289 DRTVWR-177
+4ad8a3afe40e0200309e3ada68932c4295ac2795 DRTVWR-179
+a8057e1b9a1246b434a27405be35e030f7d28b0c 3.3.4-beta3
+4281aa899fb2cedb7a9ca7ce91c5c29d4aa69594 DRTVWR-180
+9cd174d3a54d93d409a7c346a15b8bfb40fc58f4 DRTVWR-184
+47f0d08ba7ade0a3905074009067c6d3df7e16ae DRTVWR-190
+5c08e1d8edd871807153603b690e3ee9dbb548aa DRTVWR-183
+6c75f220b103db1420919c8b635fe53e2177f318 3.3.4-beta4
+ab2ffc547c8a8950ff187c4f6c95e5334fab597b 3.3.4-beta5
+28e100d0379a2b0710c57647a28fc5239d3d7b99 3.3.4-release
+a8b3eca451a9eaab59987efb0ab1c4217e3f2dcc DRTVWR-182
+1f27cdfdc54246484f8afbbe42ce48e954175cbd 3.4.0-beta1
+81f6b745ef27f5915fd07f988fdec9944f2bb73e DRTVWR-186
+78ca0bbf43a92e8914d4cfa87d69a6717ef7d4cf DRTVWR-194
+cc953f00956be52cc64c30637bbeec310eea603f DRTVWR-181
+9ee9387789701d597130f879d9011a4958753862 DRTVWR-189
+e9732c739c8a72a590216951505ea9c76a526a84 DRTVWR-193
+33a2fc7a910ae29ff8b4850316ed7fbff9f64d33 DRTVWR-195
+421126293dcbde918e0da027ca0ab9deb5b4fbf2 DRTVWR-192
+4b2c52aecb7a75de31dbb12d9f5b9a251d8707be DRTVWR-191
+7602f61c804a512764e349c034c02ddabeefebc4 DRTVWR-196
diff --git a/BuildParams b/BuildParams
index 6f1af583f0..ebfc640023 100644
--- a/BuildParams
+++ b/BuildParams
@@ -18,7 +18,7 @@ build_CYGWIN_Debug = false
email_status_this_is_os = true
# Limit extent of codeticket updates to revisions after...
-codeticket_since = 2.2.0-release
+codeticket_since = 3.3.0-release
# ========================================
# Viewer Development
@@ -43,18 +43,20 @@ integration_viewer-development.viewer_channel = "Second Life Development"
integration_viewer-development.login_channel = "Second Life Development"
integration_viewer-development.build_viewer_update_version_manager = false
integration_viewer-development.email = viewer-development-builds@lists.secondlife.com
-integration_viewer-development.build_enforce_coding_policy = true
-integration_viewer-development.codeticket_add_context = true
+integration_viewer-development.build_enforce_coding_policy = false
+integration_viewer-development.codeticket_add_context = false
viewer-beta.viewer_channel = "Second Life Beta Viewer"
viewer-beta.login_channel = "Second Life Beta Viewer"
viewer-beta.build_debug_release_separately = true
viewer-beta.build_viewer_update_version_manager = true
+viewer-beta.codeticket_add_context = false
viewer-release.viewer_channel = "Second Life Release"
viewer-release.login_channel = "Second Life Release"
viewer-release.build_debug_release_separately = true
viewer-release.build_viewer_update_version_manager = true
+viewer-release.codeticket_add_context = false
# ========================================
# mesh-development
@@ -112,31 +114,27 @@ viewer-mesh.login_channel = "Project Viewer - Mesh"
viewer-mesh.viewer_grid = aditi
viewer-mesh.email = shining@lists.lindenlab.com
-# ================
-# oz
-# ================
-
-Snowstorm_viewer-project-review.build_debug_release_separately = true
-Snowstorm_viewer-project-review.codeticket_add_context = true
-Snowstorm_viewer-project-review.viewer_channel = "Project Viewer - Snowstorm Team"
-Snowstorm_viewer-project-review.login_channel = "Project Viewer - Snowstorm Team"
-Snowstorm_viewer-project-review.codeticket_add_context = true
-
-oz_viewer-devreview.build_debug_release_separately = true
-oz_viewer-devreview.codeticket_add_context = false
-oz_viewer-devreview.build_enforce_coding_policy = true
-oz_viewer-devreview.email = oz@lindenlab.com
-
-oz_viewer-trial.build_debug_release_separately = true
-oz_viewer-trial.codeticket_add_context = false
-oz_viewer-trial.build_enforce_coding_policy = true
-oz_viewer-trial.email = oz@lindenlab.com
-
-oz_viewer-beta-review.build_debug_release_separately = true
-oz_viewer-beta-review.codeticket_add_context = false
-oz_viewer-beta-review.viewer_channel = "Second Life Beta Viewer"
-oz_viewer-beta-review.login_channel = "Second Life Beta Viewer"
-oz_viewer-beta-review.email = oz@lindenlab.com
+# ========================================
+# viewer-adult-check
+# ========================================
+
+viewer-adult-check.viewer_channel = "Project Viewer - AdultCheck"
+viewer-adult-check.login_channel = "Project Viewer - AdultCheck"
+viewer-adult-check.viewer_grid = agni
+viewer-adult-check.build_debug_release_separately = true
+viewer-adult-check.build_CYGWIN_Debug = false
+viewer-adult-check.build_viewer_update_version_manager = false
+
+# ========================================
+# viewer-pathfinding
+# ========================================
+
+viewer-pathfinding.viewer_channel = "Project Viewer - Pathfinding"
+viewer-pathfinding.login_channel = "Project Viewer - Pathfinding"
+viewer-pathfinding.viewer_grid = agni
+viewer-pathfinding.build_debug_release_separately = true
+viewer-pathfinding.build_CYGWIN_Debug = false
+viewer-pathfinding.build_viewer_update_version_manager = false
# =================================================================
# asset delivery 2010 projects
diff --git a/autobuild.xml b/autobuild.xml
index ba57d09f86..2f6e67ad65 100644
--- a/autobuild.xml
+++ b/autobuild.xml
@@ -363,6 +363,54 @@
</map>
</map>
</map>
+ <key>dictionaries</key>
+ <map>
+ <key>license</key>
+ <string>various open</string>
+ <key>license_file</key>
+ <string>LICENSES/dictionaries.txt</string>
+ <key>name</key>
+ <string>dictionaries</string>
+ <key>platforms</key>
+ <map>
+ <key>darwin</key>
+ <map>
+ <key>archive</key>
+ <map>
+ <key>hash</key>
+ <string>06a6c49eb1873e95623d3d2d07aee903</string>
+ <key>url</key>
+ <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-dictionaries/rev/259873/arch/Darwin/installer/dictionaries-1-darwin-20120616.tar.bz2</string>
+ </map>
+ <key>name</key>
+ <string>darwin</string>
+ </map>
+ <key>linux</key>
+ <map>
+ <key>archive</key>
+ <map>
+ <key>hash</key>
+ <string>4f0ca21d27e0cd0b002149062b0a4b25</string>
+ <key>url</key>
+ <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-dictionaries/rev/259873/arch/Linux/installer/dictionaries-1-linux-20120616.tar.bz2</string>
+ </map>
+ <key>name</key>
+ <string>linux</string>
+ </map>
+ <key>windows</key>
+ <map>
+ <key>archive</key>
+ <map>
+ <key>hash</key>
+ <string>7520d75f6af325328322201c888191d4</string>
+ <key>url</key>
+ <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-dictionaries/rev/259873/arch/CYGWIN/installer/dictionaries-1-windows-20120616.tar.bz2</string>
+ </map>
+ <key>name</key>
+ <string>windows</string>
+ </map>
+ </map>
+ </map>
<key>elfio</key>
<map>
<key>license</key>
@@ -855,6 +903,54 @@
</map>
</map>
</map>
+ <key>havok-source</key>
+ <map>
+ <key>license</key>
+ <string>havok-ares</string>
+ <key>license_file</key>
+ <string>LICENSES/havok.txt</string>
+ <key>name</key>
+ <string>havok-source</string>
+ <key>platforms</key>
+ <map>
+ <key>darwin</key>
+ <map>
+ <key>archive</key>
+ <map>
+ <key>hash</key>
+ <string>efaf5cb3e861d44518eb03f4c406f03c</string>
+ <key>url</key>
+ <string>http://s3-proxy.lindenlab.com/private-builds-secondlife-com/hg/repo/falcon_3p-havok-source/rev/261536/arch/Darwin/installer/havok_source-2012.1-darwin-20120710.tar.bz2</string>
+ </map>
+ <key>name</key>
+ <string>darwin</string>
+ </map>
+ <key>linux</key>
+ <map>
+ <key>archive</key>
+ <map>
+ <key>hash</key>
+ <string>50037fff3fd3356a073cdae88348c9ab</string>
+ <key>url</key>
+ <string>http://s3-proxy.lindenlab.com/private-builds-secondlife-com/hg/repo/falcon_3p-havok-source/rev/261536/arch/Linux/installer/havok_source-2012.1-linux-20120711.tar.bz2</string>
+ </map>
+ <key>name</key>
+ <string>linux</string>
+ </map>
+ <key>windows</key>
+ <map>
+ <key>archive</key>
+ <map>
+ <key>hash</key>
+ <string>cd6638f5a03469654615730c16889a60</string>
+ <key>url</key>
+ <string>http://s3-proxy.lindenlab.com/private-builds-secondlife-com/hg/repo/falcon_3p-havok-source/rev/261536/arch/CYGWIN/installer/havok_source-2012.1-windows-20120710.tar.bz2</string>
+ </map>
+ <key>name</key>
+ <string>windows</string>
+ </map>
+ </map>
+ </map>
<key>jpeglib</key>
<map>
<key>license</key>
@@ -966,9 +1062,9 @@
<key>archive</key>
<map>
<key>hash</key>
- <string>d91e1f483209cd3eba04135c6a59e829</string>
+ <string>a5b2dff0d97b643227a58473e5c57906</string>
<key>url</key>
- <string>http://s3-proxy.lindenlab.com/private-builds-secondlife-com/hg/repo/3p-kdu-private/rev/221672/arch/Darwin/installer/kdu-6.4.1-darwin-20110218.tar.bz2</string>
+ <string>http://s3-proxy.lindenlab.com/private-builds-secondlife-com/hg/repo/3p-kdu-private/rev/256978/arch/Darwin/installer/kdu-7.0.0-darwin-20120515.tar.bz2</string>
</map>
<key>name</key>
<string>darwin</string>
@@ -990,9 +1086,57 @@
<key>archive</key>
<map>
<key>hash</key>
- <string>6cd9f36465ef73a3df34bf2b3bba2ced</string>
+ <string>6d80d35524e1c0c32d3385014d02d48c</string>
<key>url</key>
- <string>http://s3-proxy.lindenlab.com/private-builds-secondlife-com/hg/repo/3p-kdu-private/rev/221672/arch/CYGWIN/installer/kdu-6.4.1-windows-20110218.tar.bz2</string>
+ <string>http://s3-proxy.lindenlab.com/private-builds-secondlife-com/hg/repo/3p-kdu-private/rev/256978/arch/CYGWIN/installer/kdu-7.0.0-windows-20120515.tar.bz2</string>
+ </map>
+ <key>name</key>
+ <string>windows</string>
+ </map>
+ </map>
+ </map>
+ <key>libhunspell</key>
+ <map>
+ <key>license</key>
+ <string>libhunspell</string>
+ <key>license_file</key>
+ <string>LICENSES/hunspell.txt</string>
+ <key>name</key>
+ <string>libhunspell</string>
+ <key>platforms</key>
+ <map>
+ <key>darwin</key>
+ <map>
+ <key>archive</key>
+ <map>
+ <key>hash</key>
+ <string>6f5db0ef258df6e5c93c843ec559db6d</string>
+ <key>url</key>
+ <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-hunspell/rev/259874/arch/Darwin/installer/libhunspell-1.3.2-darwin-20120616.tar.bz2</string>
+ </map>
+ <key>name</key>
+ <string>darwin</string>
+ </map>
+ <key>linux</key>
+ <map>
+ <key>archive</key>
+ <map>
+ <key>hash</key>
+ <string>0c432d2626aea2e91a56335879c92965</string>
+ <key>url</key>
+ <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-hunspell/rev/259874/arch/Linux/installer/libhunspell-1.3.2-linux-20120616.tar.bz2</string>
+ </map>
+ <key>name</key>
+ <string>linux</string>
+ </map>
+ <key>windows</key>
+ <map>
+ <key>archive</key>
+ <map>
+ <key>hash</key>
+ <string>6a140e5620826aa5e587b4157f57b389</string>
+ <key>url</key>
+ <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-hunspell/rev/259874/arch/CYGWIN/installer/libhunspell-1.3.2-windows-20120616.tar.bz2</string>
</map>
<key>name</key>
<string>windows</string>
@@ -1095,14 +1239,14 @@
</map>
</map>
</map>
- <key>llconvexdecomposition</key>
+ <key>llphysicsextensions_source</key>
<map>
<key>license</key>
- <string>havok</string>
+ <string>TEMPORARY</string>
<key>license_file</key>
- <string>on_file</string>
+ <string>LICENSES/llphysicsextensions.txt</string>
<key>name</key>
- <string>llconvexdecomposition</string>
+ <string>llphysicsextensions_source</string>
<key>platforms</key>
<map>
<key>darwin</key>
@@ -1110,9 +1254,11 @@
<key>archive</key>
<map>
<key>hash</key>
- <string>362654a472ef7368d4c803ae3fb89d95</string>
+ <string>0578fa67ef9906c6aaa326f51db2669f</string>
+ <key>hash_algorithm</key>
+ <string>md5</string>
<key>url</key>
- <string>http://s3-proxy.lindenlab.com/private-builds-secondlife-com/hg/repo/3p-llconvexdecomposition/rev/238959/arch/Darwin/installer/llconvexdecomposition-0.1-darwin-20110819.tar.bz2</string>
+ <string>http://s3-proxy.lindenlab.com/private-builds-secondlife-com/hg/repo/llphysicsextensions-source/rev/263415/arch/Darwin/installer/llphysicsextensions_source-0.3-darwin-20120814.tar.bz2</string>
</map>
<key>name</key>
<string>darwin</string>
@@ -1122,9 +1268,9 @@
<key>archive</key>
<map>
<key>hash</key>
- <string>c7801d899daec5338fbe95053255b7e7</string>
+ <string>b706fdeed4ce2182d434043dc33d9d1d</string>
<key>url</key>
- <string>http://s3-proxy.lindenlab.com/private-builds-secondlife-com/hg/repo/3p-llconvexdecomposition/rev/238959/arch/Linux/installer/llconvexdecomposition-0.1-linux-20110819.tar.bz2</string>
+ <string>http://s3-proxy.lindenlab.com/private-builds-secondlife-com/hg/repo/llphysicsextensions-source/rev/263415/arch/Linux/installer/llphysicsextensions_source-0.3-linux-20120814.tar.bz2</string>
</map>
<key>name</key>
<string>linux</string>
@@ -1134,23 +1280,25 @@
<key>archive</key>
<map>
<key>hash</key>
- <string>6ecf2f85f03c5ae87fe45769566a5660</string>
+ <string>0cebd359ea732a7db363d88f9886a1ef</string>
<key>url</key>
- <string>http://s3-proxy.lindenlab.com/private-builds-secondlife-com/hg/repo/3p-llconvexdecomposition/rev/238959/arch/CYGWIN/installer/llconvexdecomposition-0.1-windows-20110819.tar.bz2</string>
+ <string>http://s3-proxy.lindenlab.com/private-builds-secondlife-com/hg/repo/llphysicsextensions-source/rev/263415/arch/CYGWIN/installer/llphysicsextensions_source-0.3-windows-20120814.tar.bz2</string>
</map>
<key>name</key>
<string>windows</string>
</map>
</map>
+ <key>version</key>
+ <string>0.2</string>
</map>
- <key>llconvexdecompositionstub</key>
+ <key>llphysicsextensions_stub</key>
<map>
<key>license</key>
- <string>lgpl</string>
+ <string>TEMPORARY</string>
<key>license_file</key>
- <string>LICENSES/LLConvexDecompositionStubLicense.txt</string>
+ <string>LICENSES/llphysicsextensions.txt</string>
<key>name</key>
- <string>llconvexdecompositionstub</string>
+ <string>llphysicsextensions_stub</string>
<key>platforms</key>
<map>
<key>darwin</key>
@@ -1158,9 +1306,11 @@
<key>archive</key>
<map>
<key>hash</key>
- <string>a5f53e09f67271fd50f1131ffdda9d27</string>
+ <string>3ae798d4dfb54a1d806ee5f8b31f7626</string>
+ <key>hash_algorithm</key>
+ <string>md5</string>
<key>url</key>
- <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-llconvexdecompositionstub/rev/238958/arch/Darwin/installer/llconvexdecompositionstub-0.3-darwin-20110819.tar.bz2</string>
+ <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/llphysicsextensions-stub/rev/263415/arch/Darwin/installer/llphysicsextensions_stub-0.3-darwin-20120814.tar.bz2</string>
</map>
<key>name</key>
<string>darwin</string>
@@ -1170,9 +1320,9 @@
<key>archive</key>
<map>
<key>hash</key>
- <string>0006a964f1497f55a5f181b7042d2d22</string>
+ <string>aa8a2f25e8629cf5e6a96cc0eb93de8e</string>
<key>url</key>
- <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-llconvexdecompositionstub/rev/238958/arch/Linux/installer/llconvexdecompositionstub-0.3-linux-20110819.tar.bz2</string>
+ <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/llphysicsextensions-stub/rev/263415/arch/Linux/installer/llphysicsextensions_stub-0.3-linux-20120814.tar.bz2</string>
</map>
<key>name</key>
<string>linux</string>
@@ -1182,14 +1332,16 @@
<key>archive</key>
<map>
<key>hash</key>
- <string>b859e7e3bb03ebb467f0309f46422995</string>
+ <string>3ea4cee6a8dd4c89fbfd3ad6abd703c2</string>
<key>url</key>
- <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-llconvexdecompositionstub/rev/238958/arch/CYGWIN/installer/llconvexdecompositionstub-0.3-windows-20110819.tar.bz2</string>
+ <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/llphysicsextensions-stub/rev/263415/arch/CYGWIN/installer/llphysicsextensions_stub-0.3-windows-20120814.tar.bz2</string>
</map>
<key>name</key>
<string>windows</string>
</map>
</map>
+ <key>version</key>
+ <string>0.2</string>
</map>
<key>llqtwebkit</key>
<map>
@@ -1762,8 +1914,12 @@
</map>
<key>package_description</key>
<map>
+ <key>description</key>
+ <string>Spell checking dictionaries</string>
+ <key>license</key>
+ <string>various open</string>
<key>name</key>
- <string>viewer_development</string>
+ <string>dictionaries</string>
<key>platforms</key>
<map>
<key>common</key>
@@ -2303,6 +2459,18 @@
</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>
@@ -2379,6 +2547,18 @@
</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>
@@ -2455,6 +2635,18 @@
</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>Release</string>
+ <string>--startup</string>
+ <string>secondlife-bin</string>
+ </array>
<key>options</key>
<array>
<string>-G</string>
@@ -2473,6 +2665,8 @@
<string>windows</string>
</map>
</map>
+ <key>version</key>
+ <string>1.0</string>
</map>
<key>type</key>
<string>autobuild</string>
diff --git a/build.sh b/build.sh
index 8ca3208087..b5876738e6 100755
--- a/build.sh
+++ b/build.sh
@@ -15,6 +15,12 @@
# * The basic convention is that the build name can be mapped onto a mercurial URL,
# which is also used as the "branch" name.
+check_for()
+{
+ if [ -e "$2" ]; then found_dict='FOUND'; else found_dict='MISSING'; fi
+ echo "$1 ${found_dict} '$2' " 1>&2
+}
+
build_dir_Darwin()
{
echo build-darwin-i386
@@ -59,6 +65,8 @@ pre_build()
&& [ -r "$master_message_template_checkout/message_template.msg" ] \
&& template_verifier_master_url="-DTEMPLATE_VERIFIER_MASTER_URL=file://$master_message_template_checkout/message_template.msg"
+ check_for "Before 'autobuild configure'" ${build_dir}/packages/dictionaries
+
"$AUTOBUILD" configure -c $variant -- \
-DPACKAGE:BOOL=ON \
-DRELEASE_CRASH_REPORTING:BOOL=ON \
@@ -67,7 +75,33 @@ pre_build()
-DGRID:STRING="\"$viewer_grid\"" \
-DLL_TESTS:BOOL="$run_tests" \
-DTEMPLATE_VERIFIER_OPTIONS:STRING="$template_verifier_options" $template_verifier_master_url
- end_section "Pre$variant"
+
+ check_for "After 'autobuild configure'" ${build_dir}/packages/dictionaries
+
+ end_section "Pre$variant"
+}
+
+package_llphysicsextensions_tpv()
+{
+ begin_section "PhysicsExtensions_TPV"
+ tpv_status=0
+ if [ "$variant" = "Release" ]
+ then
+ llpetpvcfg=$build_dir/packages/llphysicsextensions/autobuild-tpv.xml
+ "$AUTOBUILD" build --verbose --config-file $llpetpvcfg -c Tpv
+
+ # capture the package file name for use in upload later...
+ PKGTMP=`mktemp -t pgktpv.XXXXXX`
+ trap "rm $PKGTMP* 2>/dev/null" 0
+ "$AUTOBUILD" package --verbose --config-file $llpetpvcfg > $PKGTMP
+ tpv_status=$?
+ sed -n -e 's/^wrote *//p' $PKGTMP > $build_dir/llphysicsextensions_package
+ else
+ echo "Do not provide llphysicsextensions_tpv for $variant"
+ llphysicsextensions_package=""
+ fi
+ end_section "PhysicsExtensions_TPV"
+ return $tpv_status
}
build()
@@ -76,13 +110,21 @@ build()
if $build_viewer
then
begin_section "Viewer$variant"
- if "$AUTOBUILD" build --no-configure -c $variant
+ check_for "Before 'autobuild build'" ${build_dir}/packages/dictionaries
+
+ "$AUTOBUILD" build --no-configure -c $variant
+ viewer_build_ok=$?
+ end_section "Viewer$variant"
+ package_llphysicsextensions_tpv
+ tpvlib_build_ok=$?
+ if [ $viewer_build_ok -eq 0 -a $tpvlib_build_ok -eq 0 ]
then
echo true >"$build_dir"/build_ok
else
echo false >"$build_dir"/build_ok
fi
- end_section "Viewer$variant"
+ check_for "After 'autobuild configure'" ${build_dir}/packages/dictionaries
+
fi
}
@@ -172,7 +214,10 @@ eval "$("$AUTOBUILD" source_environment)"
# dump environment variables for debugging
env|sort
+check_for "Before 'autobuild install'" ${build_dir}/packages/dictionaries
+
+check_for "After 'autobuild install'" ${build_dir}/packages/dictionaries
# Now run the build
succeeded=true
build_processes=
@@ -196,11 +241,6 @@ do
mkdir -p "$build_dir"
mkdir -p "$build_dir/tmp"
- # Install packages.
- begin_section "AutobuildInstall"
- "$AUTOBUILD" install --verbose --skip-license-check
- end_section "AutobuildInstall"
-
if pre_build "$variant" "$build_dir" >> "$build_log" 2>&1
then
if $build_link_parallel
@@ -270,13 +310,25 @@ then
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
Release)
+ # Upload crash reporter files
for symbolfile in $symbolfiles
do
upload_item symbolfile "$build_dir/$symbolfile" binary/octet-stream
done
+
+ # Upload the llphysicsextensions_tpv package, if one was produced
+ if [ -r "$build_dir/llphysicsextensions_package" ]
+ then
+ llphysicsextensions_package=$(cat $build_dir/llphysicsextensions_package)
+ upload_item private_artifact "$llphysicsextensions_package" binary/octet-stream
+ else
+ echo "No llphysicsextensions_package"
+ fi
+ ;;
+ *)
+ echo "Skipping mapfile for $last_built_variant"
;;
esac
diff --git a/doc/contributions.txt b/doc/contributions.txt
index f0b9a4eecc..3218624f76 100644
--- a/doc/contributions.txt
+++ b/doc/contributions.txt
@@ -174,6 +174,7 @@ Ansariel Hiller
VWR-26150
STORM-1685
STORM-1713
+ STORM-1899
Aralara Rajal
Ardy Lay
STORM-859
@@ -297,6 +298,8 @@ Cherry Cheevers
ChickyBabes Zuzu
Christopher Organiser
Ciaran Laval
+Cinder Roxley
+ STORM-1703
Clara Young
Coaldust Numbers
VWR-1095
@@ -471,6 +474,7 @@ Hiro Sommambulist
VWR-143
Hitomi Tiponi
STORM-1741
+ STORM-1862
Holger Gilruth
Horatio Freund
Hoze Menges
@@ -623,14 +627,26 @@ Jonathan Yap
STORM-1799
STORM-1796
STORM-1807
+ STORM-1812
+ STORM-1820
+ STORM-1839
+ STORM-1842
STORM-1808
STORM-637
STORM-1822
STORM-1809
STORM-1793
STORM-1810
+ STORM-1877
+ STORM-1860
+ STORM-1852
+ STORM-1870
+ STORM-1872
+ STORM-1858
+ STORM-1862
Kadah Coba
STORM-1060
+ STORM-1843
Jondan Lundquist
Josef Munster
Josette Windlow
@@ -725,6 +741,9 @@ Marc2 Sands
Marianne McCann
Marine Kelley
STORM-281
+MartinRJ Fayray
+ STORM-1844
+ STORM-1845
Matthew Anthony
Matthew Dowd
VWR-1344
@@ -1052,6 +1071,8 @@ Simon Nolan
Sini Nubalo
Sitearm Madonna
SLB Wirefly
+Slee Mayo
+ SEC-1075
snowy Sidran
SpacedOut Frye
VWR-34
@@ -1091,9 +1112,12 @@ Sudane Erato
Synystyr Texan
Takeda Terrawyng
TankMaster Finesmith
+ OPEN-140
+ OPEN-142
STORM-1100
- STORM-1602
STORM-1258
+ STORM-1602
+ STORM-1868
VWR-26622
Talamasca
Tali Rosca
@@ -1289,6 +1313,7 @@ Zi Ree
VWR-24017
VWR-25588
STORM-1790
+ STORM-1842
Zipherius Turas
VWR-76
VWR-77
diff --git a/etc/message.xml b/etc/message.xml
index 3445975545..6d8160abb5 100644
--- a/etc/message.xml
+++ b/etc/message.xml
@@ -385,14 +385,6 @@
<key>trusted-sender</key>
<boolean>true</boolean>
</map>
-
- <key>ParcelMediaURLFilter</key>
- <map>
- <key>flavor</key>
- <string>llsd</string>
- <key>trusted-sender</key>
- <boolean>false</boolean>
- </map>
<key>ParcelNavigateMedia</key>
<map>
@@ -546,8 +538,24 @@
<key>trusted-sender</key>
<boolean>true</boolean>
</map>
-
- <!-- UDPDeprecated Messages -->
+
+ <key>NavMeshStatusUpdate</key>
+ <map>
+ <key>flavor</key>
+ <string>llsd</string>
+ <key>trusted-sender</key>
+ <boolean>true</boolean>
+ </map>
+
+ <key>AgentStateUpdate</key>
+ <map>
+ <key>flavor</key>
+ <string>llsd</string>
+ <key>trusted-sender</key>
+ <boolean>true</boolean>
+ </map>
+
+ <!-- UDPDeprecated Messages -->
<key>ScriptRunningReply</key>
<map>
<key>flavor</key>
diff --git a/indra/cmake/00-Common.cmake b/indra/cmake/00-Common.cmake
index 98eeed09b3..487b581056 100644
--- a/indra/cmake/00-Common.cmake
+++ b/indra/cmake/00-Common.cmake
@@ -51,6 +51,7 @@ if (WINDOWS)
set(CMAKE_CXX_FLAGS_RELEASE
"${CMAKE_CXX_FLAGS_RELEASE} ${LL_CXX_FLAGS} /O2 /Zi /MD /MP /Ob2 -D_SECURE_STL=0 -D_HAS_ITERATOR_DEBUGGING=0"
CACHE STRING "C++ compiler release options" FORCE)
+ set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /LARGEADDRESSAWARE")
set(CMAKE_CXX_STANDARD_LIBRARIES "")
set(CMAKE_C_STANDARD_LIBRARIES "")
@@ -69,6 +70,7 @@ if (WINDOWS)
/Oy-
/Zc:wchar_t-
/arch:SSE2
+ /fp:fast
)
# Are we using the crummy Visual Studio KDU build workaround?
diff --git a/indra/cmake/CMakeLists.txt b/indra/cmake/CMakeLists.txt
index 279d577a27..569034a6fb 100644
--- a/indra/cmake/CMakeLists.txt
+++ b/indra/cmake/CMakeLists.txt
@@ -37,12 +37,12 @@ set(cmake_SOURCE_FILES
GLOD.cmake
GStreamer010Plugin.cmake
GooglePerfTools.cmake
+ Hunspell.cmake
JPEG.cmake
LLAddBuildTest.cmake
LLAudio.cmake
LLCharacter.cmake
LLCommon.cmake
- LLConvexDecomposition.cmake
LLCrashLogger.cmake
LLDatabase.cmake
LLImage.cmake
@@ -53,6 +53,7 @@ set(cmake_SOURCE_FILES
LLMessage.cmake
LLPlugin.cmake
LLPrimitive.cmake
+ LLPhysicsExtensions.cmake
LLRender.cmake
LLScene.cmake
LLTestCommand.cmake
diff --git a/indra/cmake/Copy3rdPartyLibs.cmake b/indra/cmake/Copy3rdPartyLibs.cmake
index 394db362b1..9f05c4cff2 100644
--- a/indra/cmake/Copy3rdPartyLibs.cmake
+++ b/indra/cmake/Copy3rdPartyLibs.cmake
@@ -41,6 +41,7 @@ if(WINDOWS)
libeay32.dll
libcollada14dom22-d.dll
glod.dll
+ libhunspell.dll
)
set(release_src_dir "${ARCH_PREBUILT_DIRS_RELEASE}")
@@ -53,12 +54,13 @@ if(WINDOWS)
libeay32.dll
libcollada14dom22.dll
glod.dll
+ libhunspell.dll
)
- if(USE_GOOGLE_PERFTOOLS)
+ if(USE_TCMALLOC)
set(debug_files ${debug_files} libtcmalloc_minimal-debug.dll)
set(release_files ${release_files} libtcmalloc_minimal.dll)
- endif(USE_GOOGLE_PERFTOOLS)
+ endif(USE_TCMALLOC)
if (FMOD)
set(debug_files ${debug_files} fmod.dll)
@@ -212,11 +214,12 @@ elseif(DARWIN)
libexpat.1.5.2.dylib
libexpat.dylib
libGLOD.dylib
- libllqtwebkit.dylib
- libminizip.a
+ libllqtwebkit.dylib
+ libminizip.a
libndofdev.dylib
+ libhunspell-1.3.0.dylib
libexception_handler.dylib
- libcollada14dom.dylib
+ libcollada14dom.dylib
)
# fmod is statically linked on darwin
@@ -257,24 +260,28 @@ elseif(LINUX)
libdb-5.1.so
libexpat.so
libexpat.so.1
- libglod.so
+ libglod.so
libgmock_main.so
libgmock.so.0
libgmodule-2.0.so
libgobject-2.0.so
libgtest_main.so
libgtest.so.0
- libminizip.so
+ libhunspell-1.3.so.0.0.0
+ libminizip.so
libopenal.so
libopenjpeg.so
libssl.so
- libtcmalloc_minimal.so
libuuid.so.16
libuuid.so.16.0.22
libssl.so.1.0.0
libfontconfig.so.1.4.4
)
+ if (USE_TCMALLOC)
+ set(release_files ${release_files} "libtcmalloc_minimal.so")
+ endif (USE_TCMALLOC)
+
if (FMOD)
set(release_files ${release_files} "libfmod-3.75.so")
endif (FMOD)
diff --git a/indra/cmake/FindHUNSPELL.cmake b/indra/cmake/FindHUNSPELL.cmake
new file mode 100644
index 0000000000..6faf22959c
--- /dev/null
+++ b/indra/cmake/FindHUNSPELL.cmake
@@ -0,0 +1,38 @@
+# -*- cmake -*-
+
+# - Find HUNSPELL
+# This module defines
+# HUNSPELL_INCLUDE_DIR, where to find libhunspell.h, etc.
+# HUNSPELL_LIBRARY, the library needed to use HUNSPELL.
+# HUNSPELL_FOUND, If false, do not try to use HUNSPELL.
+
+find_path(HUNSPELL_INCLUDE_DIR hunspell.h
+ PATH_SUFFIXES hunspell
+ )
+
+set(HUNSPELL_NAMES ${HUNSPELL_NAMES} libhunspell-1.3.0 libhunspell)
+find_library(HUNSPELL_LIBRARY
+ NAMES ${HUNSPELL_NAMES}
+ )
+
+if (HUNSPELL_LIBRARY AND HUNSPELL_INCLUDE_DIR)
+ set(HUNSPELL_FOUND "YES")
+else (HUNSPELL_LIBRARY AND HUNSPELL_INCLUDE_DIR)
+ set(HUNSPELL_FOUND "NO")
+endif (HUNSPELL_LIBRARY AND HUNSPELL_INCLUDE_DIR)
+
+
+if (HUNSPELL_FOUND)
+ if (NOT HUNSPELL_FIND_QUIETLY)
+ message(STATUS "Found Hunspell: Library in '${HUNSPELL_LIBRARY}' and header in '${HUNSPELL_INCLUDE_DIR}' ")
+ endif (NOT HUNSPELL_FIND_QUIETLY)
+else (HUNSPELL_FOUND)
+ if (HUNSPELL_FIND_REQUIRED)
+ message(FATAL_ERROR " * * *\nCould not find HUNSPELL library! * * *")
+ endif (HUNSPELL_FIND_REQUIRED)
+endif (HUNSPELL_FOUND)
+
+mark_as_advanced(
+ HUNSPELL_LIBRARY
+ HUNSPELL_INCLUDE_DIR
+ )
diff --git a/indra/cmake/GooglePerfTools.cmake b/indra/cmake/GooglePerfTools.cmake
index d9f91193be..09501e0406 100644
--- a/indra/cmake/GooglePerfTools.cmake
+++ b/indra/cmake/GooglePerfTools.cmake
@@ -1,20 +1,34 @@
# -*- cmake -*-
include(Prebuilt)
+# If you want to enable or disable TCMALLOC in viewer builds, this is the place.
+# set ON or OFF as desired.
+set (USE_TCMALLOC ON)
+
if (STANDALONE)
include(FindGooglePerfTools)
else (STANDALONE)
if (WINDOWS)
- use_prebuilt_binary(tcmalloc)
- set(TCMALLOC_LIBRARIES
- debug libtcmalloc_minimal-debug
- optimized libtcmalloc_minimal)
+ if (USE_TCMALLOC)
+ use_prebuilt_binary(tcmalloc)
+ set(TCMALLOC_LIBRARIES
+ debug libtcmalloc_minimal-debug
+ optimized libtcmalloc_minimal)
+ set(TCMALLOC_LINK_FLAGS "/INCLUDE:__tcmalloc")
+ else (USE_TCMALLOC)
+ set(TCMALLOC_LIBRARIES)
+ set(TCMALLOC_LINK_FLAGS)
+ endif (USE_TCMALLOC)
set(GOOGLE_PERFTOOLS_FOUND "YES")
endif (WINDOWS)
if (LINUX)
- use_prebuilt_binary(tcmalloc)
- set(TCMALLOC_LIBRARIES
- tcmalloc)
+ if (USE_TCMALLOC)
+ use_prebuilt_binary(tcmalloc)
+ set(TCMALLOC_LIBRARIES
+ tcmalloc)
+ else (USE_TCMALLOC)
+ set(TCMALLOC_LIBRARIES)
+ endif (USE_TCMALLOC)
set(PROFILER_LIBRARIES profiler)
set(GOOGLE_PERFTOOLS_INCLUDE_DIR
${LIBS_PREBUILT_DIR}/include)
@@ -29,13 +43,19 @@ if (GOOGLE_PERFTOOLS_FOUND)
endif (GOOGLE_PERFTOOLS_FOUND)
if (WINDOWS)
- set(USE_GOOGLE_PERFTOOLS ON)
+ set(USE_GOOGLE_PERFTOOLS ON)
endif (WINDOWS)
if (USE_GOOGLE_PERFTOOLS)
- set(TCMALLOC_FLAG -ULL_USE_TCMALLOC=1)
+ if (USE_TCMALLOC)
+ set(TCMALLOC_FLAG -DLL_USE_TCMALLOC=1)
+ else (USE_TCMALLOC)
+ set(TCMALLOC_FLAG -ULL_USE_TCMALLOC)
+ endif (USE_TCMALLOC)
+endif (USE_GOOGLE_PERFTOOLS)
+
+if (USE_GOOGLE_PERFTOOLS)
include_directories(${GOOGLE_PERFTOOLS_INCLUDE_DIR})
set(GOOGLE_PERFTOOLS_LIBRARIES ${TCMALLOC_LIBRARIES} ${STACKTRACE_LIBRARIES} ${PROFILER_LIBRARIES})
else (USE_GOOGLE_PERFTOOLS)
- set(TCMALLOC_FLAG -ULL_USE_TCMALLOC)
endif (USE_GOOGLE_PERFTOOLS)
diff --git a/indra/cmake/Havok.cmake b/indra/cmake/Havok.cmake
new file mode 100644
index 0000000000..5c0768abfa
--- /dev/null
+++ b/indra/cmake/Havok.cmake
@@ -0,0 +1,83 @@
+# -*- cmake -*-
+
+use_prebuilt_binary(havok-source)
+set(Havok_INCLUDE_DIRS ${LIBS_PREBUILT_DIR}/include/havok/Source)
+list(APPEND Havok_INCLUDE_DIRS ${LIBS_PREBUILT_DIR}/include/havok/Demo)
+
+set(HAVOK_DEBUG_LIBRARY_PATH ${LIBS_PREBUILT_DIR}/lib/debug/havok-fulldebug)
+set(HAVOK_RELEASE_LIBRARY_PATH ${LIBS_PREBUILT_DIR}/lib/release/havok)
+
+if (LL_DEBUG_HAVOK)
+ if (WIN32)
+ # Always link relwithdebinfo to havok-hybrid on windows.
+ set(HAVOK_RELWITHDEBINFO_LIBRARY_PATH ${LIBS_PREBUILT_DIR}/lib/debug/havok-hybrid)
+ else (WIN32)
+ set(HAVOK_RELWITHDEBINFO_LIBRARY_PATH ${LIBS_PREBUILT_DIR}/lib/debug/havok-fulldebug)
+ endif (WIN32)
+else (LL_DEBUG_HAVOK)
+ set(HAVOK_RELWITHDEBINFO_LIBRARY_PATH ${LIBS_PREBUILT_DIR}/lib/release/havok)
+endif (LL_DEBUG_HAVOK)
+
+set(HAVOK_LIBS
+ hkBase
+ hkCompat
+ hkGeometryUtilities
+ hkInternal
+ hkSerialize
+ hkSceneData
+ hkpCollide
+ hkpUtilities
+ hkpConstraintSolver
+ hkpDynamics
+ hkpInternal
+ hkaiInternal
+ hkaiPathfinding
+ hkaiAiPhysicsBridge
+ hkcdInternal
+ hkcdCollide
+ hkpVehicle
+ hkVisualize
+ hkaiVisualize
+ hkgpConvexDecomposition
+)
+
+unset(HK_DEBUG_LIBRARIES)
+unset(HK_RELEASE_LIBRARIES)
+unset(HK_RELWITHDEBINFO_LIBRARIES)
+
+foreach(HAVOK_LIB ${HAVOK_LIBS})
+ find_library(HAVOK_DEBUG_LIB_${HAVOK_LIB} ${HAVOK_LIB} PATHS ${HAVOK_DEBUG_LIBRARY_PATH})
+ find_library(HAVOK_RELEASE_LIB_${HAVOK_LIB} ${HAVOK_LIB} PATHS ${HAVOK_RELEASE_LIBRARY_PATH})
+ find_library(HAVOK_RELWITHDEBINFO_LIB_${HAVOK_LIB} ${HAVOK_LIB} PATHS ${HAVOK_RELWITHDEBINFO_LIBRARY_PATH})
+
+ if(LINUX)
+ set(cmd "mkdir")
+ set(debug_dir "${HAVOK_DEBUG_LIBRARY_PATH}/${HAVOK_LIB}")
+ set(release_dir "${HAVOK_RELEASE_LIBRARY_PATH}/${HAVOK_LIB}")
+ set(relwithdebinfo_dir "${HAVOK_RELWITHDEBINFO_LIBRARY_PATH}/${HAVOK_LIB}")
+
+ exec_program( ${cmd} ${HAVOK_DEBUG_LIBRARY_PATH} ARGS ${debug_dir} OUTPUT_VARIABLE rv)
+ exec_program( ${cmd} ${HAVOK_RELEASE_LIBRARY_PATH} ARGS ${release_dir} OUTPUT_VARIABLE rv)
+ exec_program( ${cmd} ${HAVOK_RELWITHDEBINFO_LIBRARY_PATH} ARGS ${relwithdebinfo_dir} OUTPUT_VARIABLE rv)
+
+ set(cmd "ar")
+ set(arg " -xv")
+ set(arg "${arg} ../lib${HAVOK_LIB}.a")
+ exec_program( ${cmd} ${debug_dir} ARGS ${arg} OUTPUT_VARIABLE rv)
+ exec_program( ${cmd} ${release_dir} ARGS ${arg} OUTPUT_VARIABLE rv)
+ exec_program( ${cmd} ${relwithdebinfo_dir} ARGS ${arg} OUTPUT_VARIABLE rv)
+
+ file(GLOB extracted_debug "${debug_dir}/*.o")
+ file(GLOB extracted_release "${release_dir}/*.o")
+ file(GLOB extracted_relwithdebinfo "${relwithdebinfo_dir}/*.o")
+ list(APPEND HK_DEBUG_LIBRARIES ${extracted_debug})
+ list(APPEND HK_RELEASE_LIBRARIES ${extracted_release})
+ list(APPEND HK_RELWITHDEBINFO_LIBRARIES ${extracted_relwithdebinfo})
+ else(LINUX)
+ # Win32
+ list(APPEND HK_DEBUG_LIBRARIES ${HAVOK_DEBUG_LIB_${HAVOK_LIB}})
+ list(APPEND HK_RELEASE_LIBRARIES ${HAVOK_RELEASE_LIB_${HAVOK_LIB}})
+ list(APPEND HK_RELWITHDEBINFO_LIBRARIES ${HAVOK_RELWITHDEBINFO_LIB_${HAVOK_LIB}})
+ endif (LINUX)
+endforeach(HAVOK_LIB)
+
diff --git a/indra/cmake/Hunspell.cmake b/indra/cmake/Hunspell.cmake
new file mode 100644
index 0000000000..0c9cf93316
--- /dev/null
+++ b/indra/cmake/Hunspell.cmake
@@ -0,0 +1,22 @@
+# -*- cmake -*-
+include(Prebuilt)
+
+set(HUNSPELL_FIND_QUIETLY ON)
+set(HUNSPELL_FIND_REQUIRED ON)
+
+if (STANDALONE)
+ include(FindHUNSPELL)
+else (STANDALONE)
+ use_prebuilt_binary(libhunspell)
+ if (WINDOWS)
+ set(HUNSPELL_LIBRARY libhunspell)
+ elseif(DARWIN)
+ set(HUNSPELL_LIBRARY hunspell-1.3.0)
+ elseif(LINUX)
+ set(HUNSPELL_LIBRARY hunspell-1.3)
+ else()
+ message(FATAL_ERROR "Invalid platform")
+ endif()
+ set(HUNSPELL_INCLUDE_DIRS ${LIBS_PREBUILT_DIR}/include/hunspell)
+ use_prebuilt_binary(dictionaries)
+endif (STANDALONE)
diff --git a/indra/cmake/LLAddBuildTest.cmake b/indra/cmake/LLAddBuildTest.cmake
index 08feab6e36..a6f69a09e9 100644
--- a/indra/cmake/LLAddBuildTest.cmake
+++ b/indra/cmake/LLAddBuildTest.cmake
@@ -205,6 +205,15 @@ FUNCTION(LL_ADD_INTEGRATION_TEST
SET_TARGET_PROPERTIES(INTEGRATION_TEST_${testname} PROPERTIES COMPILE_FLAGS -I"${TUT_INCLUDE_DIR}")
endif(STANDALONE)
+ if (WINDOWS)
+ SET_TARGET_PROPERTIES(INTEGRATION_TEST_${testname}
+ PROPERTIES
+ LINK_FLAGS "/debug /NODEFAULTLIB:LIBCMT /SUBSYSTEM:WINDOWS ${TCMALLOC_LINK_FLAGS}"
+ LINK_FLAGS_DEBUG "/NODEFAULTLIB:\"LIBCMT;LIBCMTD;MSVCRT\" /INCREMENTAL:NO"
+ LINK_FLAGS_RELEASE ""
+ )
+ endif (WINDOWS)
+
# Add link deps to the executable
if(TEST_DEBUG)
message(STATUS "TARGET_LINK_LIBRARIES(INTEGRATION_TEST_${testname} ${libraries})")
diff --git a/indra/cmake/LLConvexDecomposition.cmake b/indra/cmake/LLConvexDecomposition.cmake
deleted file mode 100644
index 8e44504782..0000000000
--- a/indra/cmake/LLConvexDecomposition.cmake
+++ /dev/null
@@ -1,12 +0,0 @@
-# -*- 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/LLPhysicsExtensions.cmake b/indra/cmake/LLPhysicsExtensions.cmake
new file mode 100644
index 0000000000..e6afee762e
--- /dev/null
+++ b/indra/cmake/LLPhysicsExtensions.cmake
@@ -0,0 +1,35 @@
+# -*- cmake -*-
+include(Prebuilt)
+
+# There are three possible solutions to provide the llphysicsextensions:
+# - The full source package, selected by -DHAVOK:BOOL=ON
+# - The stub source package, selected by -DHAVOK:BOOL=OFF
+# - The prebuilt package available to those with sublicenses, selected by -DHAVOK_TPV:BOOL=ON
+
+if (INSTALL_PROPRIETARY)
+ set(HAVOK ON CACHE BOOL "Use Havok physics library")
+endif (INSTALL_PROPRIETARY)
+
+
+# Note that the use_prebuilt_binary macros below do not in fact include binaries;
+# the llphysicsextensions_* packages are source only and are built here.
+# The source package and the stub package both build libraries of the same name.
+
+if (HAVOK)
+ include(Havok)
+ use_prebuilt_binary(llphysicsextensions_source)
+ set(LLPHYSICSEXTENSIONS_SRC_DIR ${LIBS_PREBUILT_DIR}/llphysicsextensions/src)
+ set(LLPHYSICSEXTENSIONS_LIBRARIES llphysicsextensions)
+
+elseif (HAVOK_TPV)
+ use_prebuilt_binary(llphysicsextensions_tpv)
+ set(LLPHYSICSEXTENSIONS_LIBRARIES llphysicsextensions_tpv)
+
+else (HAVOK)
+ use_prebuilt_binary(llphysicsextensions_stub)
+ set(LLPHYSICSEXTENSIONS_SRC_DIR ${LIBS_PREBUILT_DIR}/llphysicsextensions/stub)
+ set(LLPHYSICSEXTENSIONS_LIBRARIES llphysicsextensionsstub)
+
+endif (HAVOK)
+
+set(LLPHYSICSEXTENSIONS_INCLUDE_DIRS ${LIBS_PREBUILT_DIR}/include/llphysicsextensions)
diff --git a/indra/cmake/Linking.cmake b/indra/cmake/Linking.cmake
index 47f944f9a5..c3e3a80fd0 100644
--- a/indra/cmake/Linking.cmake
+++ b/indra/cmake/Linking.cmake
@@ -38,9 +38,8 @@ if (NOT "${CMAKE_BUILD_TYPE}" STREQUAL "Release")
# packages/lib/release directory to deal with autobuild packages that don't
# provide (e.g.) lib/debug libraries.
list(APPEND AUTOBUILD_LIBS_INSTALL_DIRS ${ARCH_PREBUILT_DIRS_RELEASE})
- message(STATUS "CMAKE_BUILD_TYPE = ${CMAKE_BUILD_TYPE}, extending AUTOBUILD_LIBS_INSTALL_DIRS")
endif (NOT "${CMAKE_BUILD_TYPE}" STREQUAL "Release")
-message(STATUS "For ${CMAKE_BUILD_TYPE}, AUTOBUILD_LIBS_INSTALL_DIRS: ${AUTOBUILD_LIBS_INSTALL_DIRS}")
+
link_directories(${AUTOBUILD_LIBS_INSTALL_DIRS})
if (LINUX)
diff --git a/indra/cmake/Variables.cmake b/indra/cmake/Variables.cmake
index 4cbf7aa043..56ced20abf 100644
--- a/indra/cmake/Variables.cmake
+++ b/indra/cmake/Variables.cmake
@@ -101,8 +101,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.0")
+ set(CMAKE_OSX_SYSROOT macosx10.6)
+ set(CMAKE_XCODE_ATTRIBUTE_GCC_VERSION "com.apple.compilers.llvmgcc42")
set(CMAKE_XCODE_ATTRIBUTE_DEBUG_INFORMATION_FORMAT dwarf-with-dsym)
# NOTE: To attempt an i386/PPC Universal build, add this on the configure line:
diff --git a/indra/cmake/ViewerMiscLibs.cmake b/indra/cmake/ViewerMiscLibs.cmake
index df013b1665..5b00c989a4 100644
--- a/indra/cmake/ViewerMiscLibs.cmake
+++ b/indra/cmake/ViewerMiscLibs.cmake
@@ -2,15 +2,9 @@
include(Prebuilt)
if (NOT STANDALONE)
+ use_prebuilt_binary(libhunspell)
use_prebuilt_binary(libuuid)
use_prebuilt_binary(slvoice)
use_prebuilt_binary(fontconfig)
endif(NOT STANDALONE)
-if(VIEWER AND NOT STANDALONE)
- if(EXISTS ${CMAKE_SOURCE_DIR}/newview/res/have_artwork_bundle.marker)
- message(STATUS "We seem to have an artwork bundle in the tree - brilliant.")
- else(EXISTS ${CMAKE_SOURCE_DIR}/newview/res/have_artwork_bundle.marker)
- message(FATAL_ERROR "Didn't find an artwork bundle - this needs to be downloaded separately and unpacked into this tree. You can probably get it from the same place you got your viewer source. Thanks!")
- endif(EXISTS ${CMAKE_SOURCE_DIR}/newview/res/have_artwork_bundle.marker)
-endif(VIEWER AND NOT STANDALONE)
diff --git a/indra/integration_tests/llui_libtest/CMakeLists.txt b/indra/integration_tests/llui_libtest/CMakeLists.txt
index 633ad84159..91c9f20c10 100644
--- a/indra/integration_tests/llui_libtest/CMakeLists.txt
+++ b/indra/integration_tests/llui_libtest/CMakeLists.txt
@@ -18,6 +18,7 @@ include(LLWindow)
include(LLUI)
include(LLVFS) # ugh, needed for LLDir
include(LLXML)
+include(Hunspell)
include(Linking)
# include(Tut)
@@ -31,6 +32,7 @@ include_directories(
${LLVFS_INCLUDE_DIRS}
${LLWINDOW_INCLUDE_DIRS}
${LLXML_INCLUDE_DIRS}
+ ${LIBS_PREBUILD_DIR}/include/hunspell
)
set(llui_libtest_SOURCE_FILES
@@ -78,6 +80,7 @@ target_link_libraries(llui_libtest
${LLIMAGEJ2COJ_LIBRARIES}
${OS_LIBRARIES}
${GOOGLE_PERFTOOLS_LIBRARIES}
+ ${HUNSPELL_LIBRARY}
)
if (WINDOWS)
diff --git a/indra/llcharacter/llcharacter.cpp b/indra/llcharacter/llcharacter.cpp
index c9fb8534f1..0a6a8f9fa6 100644
--- a/indra/llcharacter/llcharacter.cpp
+++ b/indra/llcharacter/llcharacter.cpp
@@ -189,6 +189,7 @@ void LLCharacter::requestStopMotion( LLMotion* motion)
//-----------------------------------------------------------------------------
static LLFastTimer::DeclareTimer FTM_UPDATE_ANIMATION("Update Animation");
static LLFastTimer::DeclareTimer FTM_UPDATE_HIDDEN_ANIMATION("Update Hidden Anim");
+static LLFastTimer::DeclareTimer FTM_UPDATE_MOTIONS("Update Motions");
void LLCharacter::updateMotions(e_update_t update_type)
{
@@ -206,7 +207,10 @@ void LLCharacter::updateMotions(e_update_t update_type)
mMotionController.unpauseAllMotions();
}
bool force_update = (update_type == FORCE_UPDATE);
- mMotionController.updateMotions(force_update);
+ {
+ LLFastTimer t(FTM_UPDATE_MOTIONS);
+ mMotionController.updateMotions(force_update);
+ }
}
}
diff --git a/indra/llcharacter/llhandmotion.cpp b/indra/llcharacter/llhandmotion.cpp
index 63937d8255..696dba0d95 100644
--- a/indra/llcharacter/llhandmotion.cpp
+++ b/indra/llcharacter/llhandmotion.cpp
@@ -132,18 +132,68 @@ BOOL LLHandMotion::onUpdate(F32 time, U8* joint_mask)
{
if (mNewPose != HAND_POSE_RELAXED && mNewPose != mCurrentPose)
{
- mCharacter->setVisualParamWeight(gHandPoseNames[mNewPose], 0.f);
+ // Only set param weight for poses other than
+ // default (HAND_POSE_SPREAD); HAND_POSE_SPREAD
+ // is not an animatable morph!
+ if (mNewPose != HAND_POSE_SPREAD)
+ {
+ mCharacter->setVisualParamWeight(gHandPoseNames[mNewPose], 0.f);
+ }
+
+ // Reset morph weight for current pose back to its
+ // full extend or it might be stuck somewhere in the middle if a
+ // pose is requested and the old pose is requested again shortly
+ // after while still blending to the other pose!
+ if (mCurrentPose != HAND_POSE_SPREAD)
+ {
+ mCharacter->setVisualParamWeight(gHandPoseNames[mCurrentPose], 1.f);
+ }
+
+ // Update visual params now if we won't blend
+ if (mCurrentPose == HAND_POSE_RELAXED)
+ {
+ mCharacter->updateVisualParams();
+ }
}
mNewPose = HAND_POSE_RELAXED;
}
else
{
- // this is a new morph we didn't know about before
- if (*requestedHandPose != mNewPose && mNewPose != mCurrentPose && mNewPose != HAND_POSE_SPREAD)
+ // Sometimes we seem to get garbage here, with poses that are out of bounds.
+ // So check for a valid pose first.
+ if (*requestedHandPose >= 0 && *requestedHandPose < NUM_HAND_POSES)
+ {
+ // This is a new morph we didn't know about before:
+ // Reset morph weight for both current and new pose
+ // back their starting values while still blending.
+ if (*requestedHandPose != mNewPose && mNewPose != mCurrentPose)
+ {
+ if (mNewPose != HAND_POSE_SPREAD)
+ {
+ mCharacter->setVisualParamWeight(gHandPoseNames[mNewPose], 0.f);
+ }
+
+ // Reset morph weight for current pose back to its full extend
+ // or it might be stuck somewhere in the middle if a pose is
+ // requested and the old pose is requested again shortly after
+ // while still blending to the other pose!
+ if (mCurrentPose != HAND_POSE_SPREAD)
+ {
+ mCharacter->setVisualParamWeight(gHandPoseNames[mCurrentPose], 1.f);
+ }
+
+ // Update visual params now if we won't blend
+ if (mCurrentPose == *requestedHandPose)
+ {
+ mCharacter->updateVisualParams();
+ }
+ }
+ mNewPose = *requestedHandPose;
+ }
+ else
{
- mCharacter->setVisualParamWeight(gHandPoseNames[mNewPose], 0.f);
+ llwarns << "Requested hand pose out of range. Ignoring requested pose." << llendl;
}
- mNewPose = *requestedHandPose;
}
mCharacter->removeAnimationData("Hand Pose");
diff --git a/indra/llcharacter/llmotioncontroller.cpp b/indra/llcharacter/llmotioncontroller.cpp
index bb892f4a7f..4f6351709e 100644
--- a/indra/llcharacter/llmotioncontroller.cpp
+++ b/indra/llcharacter/llmotioncontroller.cpp
@@ -542,6 +542,8 @@ void LLMotionController::updateIdleActiveMotions()
//-----------------------------------------------------------------------------
// updateMotionsByType()
//-----------------------------------------------------------------------------
+static LLFastTimer::DeclareTimer FTM_MOTION_ON_UPDATE("Motion onUpdate");
+
void LLMotionController::updateMotionsByType(LLMotion::LLMotionBlendType anim_type)
{
BOOL update_result = TRUE;
@@ -699,7 +701,10 @@ void LLMotionController::updateMotionsByType(LLMotion::LLMotionBlendType anim_ty
}
// perform motion update
- update_result = motionp->onUpdate(mAnimTime - motionp->mActivationTimestamp, last_joint_signature);
+ {
+ LLFastTimer t(FTM_MOTION_ON_UPDATE);
+ update_result = motionp->onUpdate(mAnimTime - motionp->mActivationTimestamp, last_joint_signature);
+ }
}
//**********************
@@ -810,7 +815,7 @@ void LLMotionController::updateMotions(bool force_update)
// Always cap the number of loaded motions
purgeExcessMotions();
-
+
// Update timing info for this time step.
if (!mPaused)
{
@@ -832,6 +837,7 @@ void LLMotionController::updateMotions(bool force_update)
}
updateLoadingMotions();
+
return;
}
@@ -850,7 +856,7 @@ void LLMotionController::updateMotions(bool force_update)
}
updateLoadingMotions();
-
+
resetJointSignatures();
if (mPaused && !force_update)
@@ -861,11 +867,12 @@ void LLMotionController::updateMotions(bool force_update)
{
// update additive motions
updateAdditiveMotions();
+
resetJointSignatures();
-
+
// update all regular motions
updateRegularMotions();
-
+
if (use_quantum)
{
mPoseBlender.blendAndCache(TRUE);
diff --git a/indra/llcommon/CMakeLists.txt b/indra/llcommon/CMakeLists.txt
index dd7b8c6eb8..36a8319189 100644
--- a/indra/llcommon/CMakeLists.txt
+++ b/indra/llcommon/CMakeLists.txt
@@ -174,6 +174,7 @@ set(llcommon_HEADER_FILES
llfoldertype.h
llformat.h
llframetimer.h
+ llhandle.h
llhash.h
llheartbeat.h
llhttpstatuscodes.h
diff --git a/indra/llcommon/indra_constants.h b/indra/llcommon/indra_constants.h
index 0745696ef3..0da83720bd 100644
--- a/indra/llcommon/indra_constants.h
+++ b/indra/llcommon/indra_constants.h
@@ -62,6 +62,7 @@ enum LAND_STAT_FLAGS
STAT_FILTER_BY_PARCEL = 0x00000001,
STAT_FILTER_BY_OWNER = 0x00000002,
STAT_FILTER_BY_OBJECT = 0x00000004,
+ STAT_FILTER_BY_PARCEL_NAME = 0x00000008,
STAT_REQUEST_LAST_ENTRY = 0x80000000,
};
diff --git a/indra/llcommon/llallocator.cpp b/indra/llcommon/llallocator.cpp
index 6f6abefc67..87654b5b97 100644
--- a/indra/llcommon/llallocator.cpp
+++ b/indra/llcommon/llallocator.cpp
@@ -27,7 +27,7 @@
#include "linden_common.h"
#include "llallocator.h"
-#if LL_USE_TCMALLOC
+#if (LL_USE_TCMALLOC && LL_USE_HEAP_PROFILER)
#include "google/heap-profiler.h"
#include "google/commandlineflags_public.h"
diff --git a/indra/llcommon/llcursortypes.cpp b/indra/llcommon/llcursortypes.cpp
index e987c397bd..ec60097195 100644
--- a/indra/llcommon/llcursortypes.cpp
+++ b/indra/llcommon/llcursortypes.cpp
@@ -69,6 +69,12 @@ ECursorType getCursorFromString(const std::string& cursor_string)
cursor_string_table["UI_CURSOR_TOOLSIT"] = UI_CURSOR_TOOLSIT;
cursor_string_table["UI_CURSOR_TOOLBUY"] = UI_CURSOR_TOOLBUY;
cursor_string_table["UI_CURSOR_TOOLOPEN"] = UI_CURSOR_TOOLOPEN;
+ cursor_string_table["UI_CURSOR_TOOLPATHFINDING"] = UI_CURSOR_TOOLPATHFINDING;
+ cursor_string_table["UI_CURSOR_TOOLPATHFINDINGPATHSTART"] = UI_CURSOR_TOOLPATHFINDING_PATH_START;
+ cursor_string_table["UI_CURSOR_TOOLPATHFINDINGPATHSTARTADD"] = UI_CURSOR_TOOLPATHFINDING_PATH_START_ADD;
+ cursor_string_table["UI_CURSOR_TOOLPATHFINDINGPATHEND"] = UI_CURSOR_TOOLPATHFINDING_PATH_END;
+ cursor_string_table["UI_CURSOR_TOOLPATHFINDINGPATHENDADD"] = UI_CURSOR_TOOLPATHFINDING_PATH_END_ADD;
+ cursor_string_table["UI_CURSOR_TOOLNO"] = UI_CURSOR_TOOLNO;
}
std::map<std::string,U32>::const_iterator iter = cursor_string_table.find(cursor_string);
diff --git a/indra/llcommon/llcursortypes.h b/indra/llcommon/llcursortypes.h
index bacb0a80ba..cb6d6636a0 100644
--- a/indra/llcommon/llcursortypes.h
+++ b/indra/llcommon/llcursortypes.h
@@ -65,6 +65,12 @@ enum ECursorType {
UI_CURSOR_TOOLSIT,
UI_CURSOR_TOOLBUY,
UI_CURSOR_TOOLOPEN,
+ UI_CURSOR_TOOLPATHFINDING,
+ UI_CURSOR_TOOLPATHFINDING_PATH_START,
+ UI_CURSOR_TOOLPATHFINDING_PATH_START_ADD,
+ UI_CURSOR_TOOLPATHFINDING_PATH_END,
+ UI_CURSOR_TOOLPATHFINDING_PATH_END_ADD,
+ UI_CURSOR_TOOLNO,
UI_CURSOR_COUNT // Number of elements in this enum (NOT a cursor)
};
diff --git a/indra/llcommon/llerror.cpp b/indra/llcommon/llerror.cpp
index 7e6eee0f3c..9b0141eb76 100644
--- a/indra/llcommon/llerror.cpp
+++ b/indra/llcommon/llerror.cpp
@@ -534,7 +534,7 @@ namespace
}
- void commonInit(const std::string& dir)
+ void commonInit(const std::string& dir, bool log_to_stderr = true)
{
LLError::Settings::reset();
@@ -542,7 +542,8 @@ namespace
LLError::setFatalFunction(LLError::crashAndLoop);
LLError::setTimeFunction(LLError::utcTime);
- if (shouldLogToStderr())
+ // log_to_stderr is only false in the unit and integration tests to keep builds quieter
+ if (log_to_stderr && shouldLogToStderr())
{
LLError::addRecorder(new RecordToStderr(stderrLogWantsTime()));
}
@@ -580,9 +581,9 @@ namespace LLError
#endif
}
- void initForApplication(const std::string& dir)
+ void initForApplication(const std::string& dir, bool log_to_stderr)
{
- commonInit(dir);
+ commonInit(dir, log_to_stderr);
}
void setPrintLocation(bool print)
diff --git a/indra/llcommon/llerror.h b/indra/llcommon/llerror.h
index b3e604f8e8..b65b410153 100644
--- a/indra/llcommon/llerror.h
+++ b/indra/llcommon/llerror.h
@@ -35,7 +35,7 @@
#include "stdtypes.h"
-/* Error Logging Facility
+/** Error Logging Facility
Information for most users:
@@ -100,7 +100,6 @@
even release. Which means you can use them to help debug even when deployed
to a real grid.
*/
-
namespace LLError
{
enum ELevel
@@ -143,9 +142,13 @@ namespace LLError
CallSite(ELevel, const char* file, int line,
const std::type_info& class_info, const char* function, const char* broadTag, const char* narrowTag, bool printOnce);
+#ifdef LL_LIBRARY_INCLUDE
+ bool shouldLog();
+#else // LL_LIBRARY_INCLUDE
bool shouldLog()
{ return mCached ? mShouldLog : Log::shouldLog(*this); }
// this member function needs to be in-line for efficiency
+#endif // LL_LIBRARY_INCLUDE
void invalidate();
diff --git a/indra/llcommon/llerrorcontrol.h b/indra/llcommon/llerrorcontrol.h
index d53a819d88..480654b1a2 100644
--- a/indra/llcommon/llerrorcontrol.h
+++ b/indra/llcommon/llerrorcontrol.h
@@ -62,7 +62,7 @@ namespace LLError
// logs to stderr, syslog, and windows debug log
// the identity string is used for in the syslog
- LL_COMMON_API void initForApplication(const std::string& dir);
+ LL_COMMON_API void initForApplication(const std::string& dir, bool log_to_stderr = true);
// resets all logging settings to defaults needed by applicaitons
// logs to stderr and windows debug log
// sets up log configuration from the file logcontrol.xml in dir
diff --git a/indra/llui/llhandle.h b/indra/llcommon/llhandle.h
index 37c657dd92..6af5e198d6 100644
--- a/indra/llui/llhandle.h
+++ b/indra/llcommon/llhandle.h
@@ -31,6 +31,10 @@
#include <boost/type_traits/is_convertible.hpp>
#include <boost/utility/enable_if.hpp>
+/**
+ * Helper object for LLHandle. Don't instantiate these directly, used
+ * exclusively by LLHandle.
+ */
class LLTombStone : public LLRefCount
{
public:
@@ -42,15 +46,37 @@ private:
mutable void* mTarget;
};
-// LLHandles are used to refer to objects whose lifetime you do not control or influence.
-// Calling get() on a handle will return a pointer to the referenced object or NULL,
-// if the object no longer exists. Note that during the lifetime of the returned pointer,
-// you are assuming that the object will not be deleted by any action you perform,
-// or any other thread, as normal when using pointers, so avoid using that pointer outside of
-// the local code block.
-//
-// https://wiki.lindenlab.com/mediawiki/index.php?title=LLHandle&oldid=79669
-
+/**
+ * LLHandles are used to refer to objects whose lifetime you do not control or influence.
+ * Calling get() on a handle will return a pointer to the referenced object or NULL,
+ * if the object no longer exists. Note that during the lifetime of the returned pointer,
+ * you are assuming that the object will not be deleted by any action you perform,
+ * or any other thread, as normal when using pointers, so avoid using that pointer outside of
+ * the local code block.
+ *
+ * https://wiki.lindenlab.com/mediawiki/index.php?title=LLHandle&oldid=79669
+ *
+ * The implementation is like some "weak pointer" implementations. When we
+ * can't control the lifespan of the referenced object of interest, we can
+ * still instantiate a proxy object whose lifespan we DO control, and store in
+ * the proxy object a dumb pointer to the actual target. Then we just have to
+ * ensure that on destruction of the target object, the proxy's dumb pointer
+ * is set NULL.
+ *
+ * LLTombStone is our proxy object. LLHandle contains an LLPointer to the
+ * LLTombStone, so every copy of an LLHandle increments the LLTombStone's ref
+ * count as usual.
+ *
+ * One copy of the LLHandle, specifically the LLRootHandle, must be stored in
+ * the referenced object. Destroying the LLRootHandle is what NULLs the
+ * proxy's target pointer.
+ *
+ * Minor optimization: we want LLHandle's mTombStone to always be a valid
+ * LLPointer, saving some conditionals in dereferencing. That's the
+ * getDefaultTombStone() mechanism. The default LLTombStone object's target
+ * pointer is always NULL, so it's semantically identical to allowing
+ * mTombStone to be invalid.
+ */
template <typename T>
class LLHandle
{
@@ -108,6 +134,14 @@ private:
}
};
+/**
+ * LLRootHandle isa LLHandle which must be stored in the referenced object.
+ * You can either store it directly and explicitly bind(this), or derive from
+ * LLHandleProvider (q.v.) which automates that for you. The essential point
+ * is that destroying the LLRootHandle (as a consequence of destroying the
+ * referenced object) calls unbind(), setting the LLTombStone's target pointer
+ * NULL.
+ */
template <typename T>
class LLRootHandle : public LLHandle<T>
{
@@ -144,8 +178,10 @@ private:
LLRootHandle(const LLRootHandle& other) {};
};
-// Use this as a mixin for simple classes that need handles and when you don't
-// want handles at multiple points of the inheritance hierarchy
+/**
+ * Use this as a mixin for simple classes that need handles and when you don't
+ * want handles at multiple points of the inheritance hierarchy
+ */
template <typename T>
class LLHandleProvider
{
diff --git a/indra/llcommon/llinitparam.h b/indra/llcommon/llinitparam.h
index 99983a19cb..9a6d1eff5c 100644
--- a/indra/llcommon/llinitparam.h
+++ b/indra/llcommon/llinitparam.h
@@ -35,7 +35,7 @@
#include <boost/shared_ptr.hpp>
#include "llerror.h"
-#include "lltypeinfolookup.h"
+#include "llstl.h"
namespace LLInitParam
{
@@ -212,14 +212,6 @@ namespace LLInitParam
public:
- struct CompareTypeID
- {
- bool operator()(const std::type_info* lhs, const std::type_info* rhs) const
- {
- return lhs->before(*rhs);
- }
- };
-
typedef std::vector<std::pair<std::string, bool> > name_stack_t;
typedef std::pair<name_stack_t::iterator, name_stack_t::iterator> name_stack_range_t;
typedef std::vector<std::string> possible_values_t;
@@ -228,9 +220,9 @@ namespace LLInitParam
typedef bool (*parser_write_func_t)(Parser& parser, const void*, name_stack_t&);
typedef boost::function<void (name_stack_t&, S32, S32, const possible_values_t*)> parser_inspect_func_t;
- typedef LLTypeInfoLookup<parser_read_func_t> parser_read_func_map_t;
- typedef LLTypeInfoLookup<parser_write_func_t> parser_write_func_map_t;
- typedef LLTypeInfoLookup<parser_inspect_func_t> parser_inspect_func_map_t;
+ typedef std::map<const std::type_info*, parser_read_func_t> parser_read_func_map_t;
+ typedef std::map<const std::type_info*, parser_write_func_t> parser_write_func_map_t;
+ typedef std::map<const std::type_info*, parser_inspect_func_t> parser_inspect_func_map_t;
Parser(parser_read_func_map_t& read_map, parser_write_func_map_t& write_map, parser_inspect_func_map_t& inspect_map)
: mParseSilently(false),
diff --git a/indra/llcommon/llmemory.cpp b/indra/llcommon/llmemory.cpp
index 3b9758f996..afaf366668 100644
--- a/indra/llcommon/llmemory.cpp
+++ b/indra/llcommon/llmemory.cpp
@@ -61,6 +61,18 @@ BOOL LLMemory::sEnableMemoryFailurePrevention = FALSE;
LLPrivateMemoryPoolManager::mem_allocation_info_t LLPrivateMemoryPoolManager::sMemAllocationTracker;
#endif
+void ll_assert_aligned_func(uintptr_t ptr,U32 alignment)
+{
+#ifdef SHOW_ASSERT
+ // Redundant, place to set breakpoints.
+ if (ptr%alignment!=0)
+ {
+ llwarns << "alignment check failed" << llendl;
+ }
+ llassert(ptr%alignment==0);
+#endif
+}
+
//static
void LLMemory::initClass()
{
diff --git a/indra/llcommon/llmemory.h b/indra/llcommon/llmemory.h
index bbbdaa6497..9dd776ff57 100644
--- a/indra/llcommon/llmemory.h
+++ b/indra/llcommon/llmemory.h
@@ -27,7 +27,6 @@
#define LLMEMORY_H
#include "llmemtype.h"
-#if LL_DEBUG
inline void* ll_aligned_malloc( size_t size, int align )
{
void* mem = malloc( size + (align - 1) + sizeof(void*) );
@@ -43,10 +42,11 @@ inline void ll_aligned_free( void* ptr )
free( ((void**)ptr)[-1] );
}
+#if !LL_USE_TCMALLOC
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);
+ return _aligned_malloc(size, 16);
#elif defined(LL_DARWIN)
return malloc(size); // default osx malloc is 16 byte aligned.
#else
@@ -58,21 +58,38 @@ inline void* ll_aligned_malloc_16(size_t size) // returned hunk MUST be freed wi
#endif
}
+inline void* ll_aligned_realloc_16(void* ptr, size_t size) // returned hunk MUST be freed with ll_aligned_free_16().
+{
+#if defined(LL_WINDOWS)
+ return _aligned_realloc(ptr, size, 16);
+#elif defined(LL_DARWIN)
+ return realloc(ptr,size); // default osx malloc is 16 byte aligned.
+#else
+ return realloc(ptr,size); // FIXME not guaranteed to be aligned.
+#endif
+}
+
inline void ll_aligned_free_16(void *p)
{
#if defined(LL_WINDOWS)
- _mm_free(p);
+ _aligned_free(p);
#elif defined(LL_DARWIN)
return free(p);
#else
free(p); // posix_memalign() is compatible with heap deallocator
#endif
}
+#else // USE_TCMALLOC
+// ll_aligned_foo_16 are not needed with tcmalloc
+#define ll_aligned_malloc_16 malloc
+#define ll_aligned_realloc_16 realloc
+#define ll_aligned_free_16 free
+#endif // USE_TCMALLOC
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);
+ return _aligned_malloc(size, 32);
#elif defined(LL_DARWIN)
return ll_aligned_malloc( size, 32 );
#else
@@ -87,22 +104,13 @@ inline void* ll_aligned_malloc_32(size_t size) // returned hunk MUST be freed wi
inline void ll_aligned_free_32(void *p)
{
#if defined(LL_WINDOWS)
- _mm_free(p);
+ _aligned_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
#ifndef __DEBUG_PRIVATE_MEM__
#define __DEBUG_PRIVATE_MEM__ 0
@@ -512,4 +520,13 @@ void LLPrivateMemoryPoolTester::operator delete[](void* addr)
// LLSingleton moved to llsingleton.h
+LL_COMMON_API void ll_assert_aligned_func(uintptr_t ptr,U32 alignment);
+
+#ifdef SHOW_ASSERT
+#define ll_assert_aligned(ptr,alignment) ll_assert_aligned_func(reinterpret_cast<uintptr_t>(ptr),((U32)alignment))
+#else
+#define ll_assert_aligned(ptr,alignment)
+#endif
+
+
#endif
diff --git a/indra/llcommon/llpointer.h b/indra/llcommon/llpointer.h
index affa040602..88c09c8dca 100644
--- a/indra/llcommon/llpointer.h
+++ b/indra/llcommon/llpointer.h
@@ -140,6 +140,10 @@ public:
}
protected:
+#ifdef LL_LIBRARY_INCLUDE
+ void ref();
+ void unref();
+#else
void ref()
{
if (mPointer)
@@ -162,7 +166,7 @@ protected:
}
}
}
-
+#endif
protected:
Type* mPointer;
};
diff --git a/indra/llcommon/llregistry.h b/indra/llcommon/llregistry.h
index 36d7f7a44c..853c427a13 100644
--- a/indra/llcommon/llregistry.h
+++ b/indra/llcommon/llregistry.h
@@ -31,30 +31,16 @@
#include <boost/type_traits.hpp>
#include "llsingleton.h"
-#include "lltypeinfolookup.h"
+#include "llstl.h"
template <typename T>
-class LLRegistryDefaultComparator
+struct LLRegistryDefaultComparator
{
- bool operator()(const T& lhs, const T& rhs) { return lhs < rhs; }
-};
-
-template <typename KEY, typename VALUE>
-struct LLRegistryMapSelector
-{
- typedef std::map<KEY, VALUE> type;
-};
-
-template <typename VALUE>
-struct LLRegistryMapSelector<std::type_info*, VALUE>
-{
- typedef LLTypeInfoLookup<VALUE> type;
-};
-
-template <typename VALUE>
-struct LLRegistryMapSelector<const std::type_info*, VALUE>
-{
- typedef LLTypeInfoLookup<VALUE> type;
+ bool operator()(const T& lhs, const T& rhs) const
+ {
+ using std::less;
+ return less<T>()(lhs, rhs);
+ }
};
template <typename KEY, typename VALUE, typename COMPARATOR = LLRegistryDefaultComparator<KEY> >
@@ -72,7 +58,7 @@ public:
{
friend class LLRegistry<KEY, VALUE, COMPARATOR>;
public:
- typedef typename LLRegistryMapSelector<KEY, VALUE>::type registry_map_t;
+ typedef std::map<KEY, VALUE, COMPARATOR> registry_map_t;
bool add(ref_const_key_t key, ref_const_value_t value)
{
diff --git a/indra/llcommon/llsd.cpp b/indra/llcommon/llsd.cpp
index e295e3c621..8276ec836a 100644
--- a/indra/llcommon/llsd.cpp
+++ b/indra/llcommon/llsd.cpp
@@ -269,6 +269,7 @@ namespace
virtual LLSD::UUID asUUID() const { return LLUUID(mValue); }
virtual LLSD::Date asDate() const { return LLDate(mValue); }
virtual LLSD::URI asURI() const { return LLURI(mValue); }
+ virtual int size() const { return mValue.size(); }
};
LLSD::Integer ImplString::asInteger() const
diff --git a/indra/llcommon/llsdserialize.cpp b/indra/llcommon/llsdserialize.cpp
index b419101b7e..7f4f670ed0 100644
--- a/indra/llcommon/llsdserialize.cpp
+++ b/indra/llcommon/llsdserialize.cpp
@@ -55,6 +55,10 @@ static const char LEGACY_NON_HEADER[] = "<llsd>";
const std::string LLSD_BINARY_HEADER("LLSD/Binary");
const std::string LLSD_XML_HEADER("LLSD/XML");
+//used to deflate a gzipped asset (currently used for navmeshes)
+#define windowBits 15
+#define ENABLE_ZLIB_GZIP 32
+
/**
* LLSDSerialize
*/
@@ -2096,7 +2100,7 @@ bool unzip_llsd(LLSD& data, std::istream& is, S32 size)
strm.next_in = in;
S32 ret = inflateInit(&strm);
-
+
do
{
strm.avail_out = CHUNK;
@@ -2159,12 +2163,87 @@ bool unzip_llsd(LLSD& data, std::istream& is, S32 size)
llwarns << "Failed to unzip LLSD block" << llendl;
free(result);
return false;
- }
+ }
}
free(result);
return true;
}
+//This unzip function will only work with a gzip header and trailer - while the contents
+//of the actual compressed data is the same for either format (gzip vs zlib ), the headers
+//and trailers are different for the formats.
+U8* unzip_llsdNavMesh( bool& valid, unsigned int& outsize, std::istream& is, S32 size )
+{
+ U8* result = NULL;
+ U32 cur_size = 0;
+ z_stream strm;
+
+ const U32 CHUNK = 0x4000;
+ 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 = inflateInit2(&strm, windowBits | ENABLE_ZLIB_GZIP );
+ 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;
+ valid = 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;
+ valid = 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);
+ valid = false;
+ return NULL;
+ }
+
+ //result now points to the decompressed LLSD block
+ {
+ outsize= cur_size;
+ valid = true;
+ }
+
+ return result;
+}
diff --git a/indra/llcommon/llsdserialize.h b/indra/llcommon/llsdserialize.h
index 99a3ea3cd4..86e3fc864c 100644
--- a/indra/llcommon/llsdserialize.h
+++ b/indra/llcommon/llsdserialize.h
@@ -793,5 +793,5 @@ 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);
-
+LL_COMMON_API U8* unzip_llsdNavMesh( bool& valid, unsigned int& outsize,std::istream& is, S32 size);
#endif // LL_LLSDSERIALIZE_H
diff --git a/indra/llcommon/llstatenums.h b/indra/llcommon/llstatenums.h
index 9033d8eb43..81c4085d16 100644
--- a/indra/llcommon/llstatenums.h
+++ b/indra/llcommon/llstatenums.h
@@ -28,41 +28,48 @@
enum
{
- LL_SIM_STAT_TIME_DILATION, // 0
- LL_SIM_STAT_FPS,
- LL_SIM_STAT_PHYSFPS,
- LL_SIM_STAT_AGENTUPS,
- LL_SIM_STAT_FRAMEMS,
- LL_SIM_STAT_NETMS, // 5
- LL_SIM_STAT_SIMOTHERMS,
- LL_SIM_STAT_SIMPHYSICSMS,
- LL_SIM_STAT_AGENTMS,
- LL_SIM_STAT_IMAGESMS,
- LL_SIM_STAT_SCRIPTMS, // 10
- LL_SIM_STAT_NUMTASKS,
- LL_SIM_STAT_NUMTASKSACTIVE,
- LL_SIM_STAT_NUMAGENTMAIN,
- LL_SIM_STAT_NUMAGENTCHILD,
- LL_SIM_STAT_NUMSCRIPTSACTIVE, // 15
- LL_SIM_STAT_LSLIPS,
- LL_SIM_STAT_INPPS,
- LL_SIM_STAT_OUTPPS,
- LL_SIM_STAT_PENDING_DOWNLOADS,
- LL_SIM_STAT_PENDING_UPLOADS, // 20
- LL_SIM_STAT_VIRTUAL_SIZE_KB,
- LL_SIM_STAT_RESIDENT_SIZE_KB,
- LL_SIM_STAT_PENDING_LOCAL_UPLOADS,
- LL_SIM_STAT_TOTAL_UNACKED_BYTES,
- LL_SIM_STAT_PHYSICS_PINNED_TASKS, // 25
- LL_SIM_STAT_PHYSICS_LOD_TASKS,
- LL_SIM_STAT_SIMPHYSICSSTEPMS,
- LL_SIM_STAT_SIMPHYSICSSHAPEMS,
- LL_SIM_STAT_SIMPHYSICSOTHERMS,
- LL_SIM_STAT_SIMPHYSICSMEMORY, // 30
- LL_SIM_STAT_SCRIPT_EPS,
- LL_SIM_STAT_SIMSPARETIME,
- LL_SIM_STAT_SIMSLEEPTIME,
- LL_SIM_STAT_IOPUMPTIME,
+ LL_SIM_STAT_TIME_DILATION = 0,
+ LL_SIM_STAT_FPS = 1,
+ LL_SIM_STAT_PHYSFPS = 2,
+ LL_SIM_STAT_AGENTUPS = 3,
+ LL_SIM_STAT_FRAMEMS = 4,
+ LL_SIM_STAT_NETMS = 5,
+ LL_SIM_STAT_SIMOTHERMS = 6,
+ LL_SIM_STAT_SIMPHYSICSMS = 7,
+ LL_SIM_STAT_AGENTMS = 8,
+ LL_SIM_STAT_IMAGESMS = 9,
+ LL_SIM_STAT_SCRIPTMS = 10,
+ LL_SIM_STAT_NUMTASKS = 11,
+ LL_SIM_STAT_NUMTASKSACTIVE = 12,
+ LL_SIM_STAT_NUMAGENTMAIN = 13,
+ LL_SIM_STAT_NUMAGENTCHILD = 14,
+ LL_SIM_STAT_NUMSCRIPTSACTIVE = 15,
+ LL_SIM_STAT_LSLIPS = 16,
+ LL_SIM_STAT_INPPS = 17,
+ LL_SIM_STAT_OUTPPS = 18,
+ LL_SIM_STAT_PENDING_DOWNLOADS = 19,
+ LL_SIM_STAT_PENDING_UPLOADS = 20,
+ LL_SIM_STAT_VIRTUAL_SIZE_KB = 21,
+ LL_SIM_STAT_RESIDENT_SIZE_KB = 22,
+ LL_SIM_STAT_PENDING_LOCAL_UPLOADS = 23,
+ LL_SIM_STAT_TOTAL_UNACKED_BYTES = 24,
+ LL_SIM_STAT_PHYSICS_PINNED_TASKS = 25,
+ LL_SIM_STAT_PHYSICS_LOD_TASKS = 26,
+ LL_SIM_STAT_SIMPHYSICSSTEPMS = 27,
+ LL_SIM_STAT_SIMPHYSICSSHAPEMS = 28,
+ LL_SIM_STAT_SIMPHYSICSOTHERMS = 29,
+ LL_SIM_STAT_SIMPHYSICSMEMORY = 30,
+ LL_SIM_STAT_SCRIPT_EPS = 31,
+ LL_SIM_STAT_SIMSPARETIME = 32,
+ LL_SIM_STAT_SIMSLEEPTIME = 33,
+ LL_SIM_STAT_IOPUMPTIME = 34,
+ LL_SIM_STAT_PCTSCRIPTSRUN = 35,
+ LL_SIM_STAT_REGION_IDLE = 36, // dataserver only
+ LL_SIM_STAT_REGION_IDLE_POSSIBLE = 37, // dataserver only
+ LL_SIM_STAT_SIMAISTEPTIMEMS = 38,
+ LL_SIM_STAT_SKIPPEDAISILSTEPS_PS = 39,
+ LL_SIM_STAT_PCTSTEPPEDCHARACTERS = 40
+
};
#endif
diff --git a/indra/llcommon/llstl.h b/indra/llcommon/llstl.h
index 8ad12c9a03..d3941e1bc9 100644
--- a/indra/llcommon/llstl.h
+++ b/indra/llcommon/llstl.h
@@ -33,6 +33,7 @@
#include <vector>
#include <set>
#include <deque>
+#include <typeinfo>
// Use to compare the first element only of a pair
// e.g. typedef std::set<std::pair<int, Data*>, compare_pair<int, Data*> > some_pair_set_t;
@@ -470,4 +471,54 @@ llbind2nd(const _Operation& __oper, const _Tp& __x)
return llbinder2nd<_Operation>(__oper, _Arg2_type(__x));
}
+/**
+ * Compare std::type_info* pointers a la std::less. We break this out as a
+ * separate function for use in two different std::less specializations.
+ */
+inline
+bool before(const std::type_info* lhs, const std::type_info* rhs)
+{
+#if LL_LINUX && defined(__GNUC__) && ((__GNUC__ < 4) || (__GNUC__ == 4 && __GNUC_MINOR__ < 4))
+ // If we're building on Linux with gcc, and it's either gcc 3.x or
+ // 4.{0,1,2,3}, then we have to use a workaround. Note that we use gcc on
+ // Mac too, and some people build with gcc on Windows (cygwin or mingw).
+ // On Linux, different load modules may produce different type_info*
+ // pointers for the same type. Have to compare name strings to get good
+ // results.
+ return strcmp(lhs->name(), rhs->name()) < 0;
+#else // not Linux, or gcc 4.4+
+ // Just use before(), as we normally would
+ return lhs->before(*rhs);
+#endif
+}
+
+/**
+ * Specialize std::less<std::type_info*> to use std::type_info::before().
+ * See MAINT-1175. It is NEVER a good idea to directly compare std::type_info*
+ * because, on Linux, you might get different std::type_info* pointers for the
+ * same type (from different load modules)!
+ */
+namespace std
+{
+ template <>
+ struct less<const std::type_info*>:
+ public std::binary_function<const std::type_info*, const std::type_info*, bool>
+ {
+ bool operator()(const std::type_info* lhs, const std::type_info* rhs) const
+ {
+ return before(lhs, rhs);
+ }
+ };
+
+ template <>
+ struct less<std::type_info*>:
+ public std::binary_function<std::type_info*, std::type_info*, bool>
+ {
+ bool operator()(std::type_info* lhs, std::type_info* rhs) const
+ {
+ return before(lhs, rhs);
+ }
+ };
+} // std
+
#endif // LL_LLSTL_H
diff --git a/indra/llcommon/llstrider.h b/indra/llcommon/llstrider.h
index f4c43bac61..ed9284d2c5 100644
--- a/indra/llcommon/llstrider.h
+++ b/indra/llcommon/llstrider.h
@@ -44,6 +44,15 @@ public:
const LLStrider<Object>& operator = (Object *first) { mObjectp = first; return *this;}
void setStride (S32 skipBytes) { mSkip = (skipBytes ? skipBytes : sizeof(Object));}
+ LLStrider<Object> operator+(const S32& index)
+ {
+ LLStrider<Object> ret;
+ ret.mBytep = mBytep + mSkip*index;
+ ret.mSkip = mSkip;
+
+ return ret;
+ }
+
void skip(const U32 index) { mBytep += mSkip*index;}
U32 getSkip() const { return mSkip; }
Object* get() { return mObjectp; }
@@ -51,6 +60,7 @@ public:
Object& operator *() { return *mObjectp; }
Object* operator ++(int) { Object* old = mObjectp; mBytep += mSkip; return old; }
Object* operator +=(int i) { mBytep += mSkip*i; return mObjectp; }
+
Object& operator[](U32 index) { return *(Object*)(mBytep + (mSkip * index)); }
};
diff --git a/indra/llcommon/llstring.h b/indra/llcommon/llstring.h
index 09733e8e2a..119efc7957 100644
--- a/indra/llcommon/llstring.h
+++ b/indra/llcommon/llstring.h
@@ -183,6 +183,9 @@ public:
static bool isPunct(char a) { return ispunct((unsigned char)a) != 0; }
static bool isPunct(llwchar a) { return iswpunct(a) != 0; }
+ static bool isAlpha(char a) { return isalpha((unsigned char)a) != 0; }
+ static bool isAlpha(llwchar a) { return iswalpha(a) != 0; }
+
static bool isAlnum(char a) { return isalnum((unsigned char)a) != 0; }
static bool isAlnum(llwchar a) { return iswalnum(a) != 0; }
diff --git a/indra/llcommon/lltypeinfolookup.h b/indra/llcommon/lltypeinfolookup.h
index 7510cc12ed..0b6862444e 100644
--- a/indra/llcommon/lltypeinfolookup.h
+++ b/indra/llcommon/lltypeinfolookup.h
@@ -12,10 +12,50 @@
#if ! defined(LL_LLTYPEINFOLOOKUP_H)
#define LL_LLTYPEINFOLOOKUP_H
-#include "llsortedvector.h"
+#include <boost/unordered_map.hpp>
+#include <boost/functional/hash.hpp>
+#include <boost/optional.hpp>
+#include <functional> // std::binary_function
#include <typeinfo>
/**
+ * The following helper classes are based on the Boost.Unordered documentation:
+ * http://www.boost.org/doc/libs/1_45_0/doc/html/unordered/hash_equality.html
+ */
+
+/**
+ * Compute hash for a string passed as const char*
+ */
+struct const_char_star_hash: public std::unary_function<const char*, std::size_t>
+{
+ std::size_t operator()(const char* str) const
+ {
+ std::size_t seed = 0;
+ for ( ; *str; ++str)
+ {
+ boost::hash_combine(seed, *str);
+ }
+ return seed;
+ }
+};
+
+/**
+ * Compute equality for strings passed as const char*
+ *
+ * I (nat) suspect that this is where the default behavior breaks for the
+ * const char* values returned from std::type_info::name(). If you compare the
+ * two const char* pointer values, as a naive, unspecialized implementation
+ * will surely do, they'll compare unequal.
+ */
+struct const_char_star_equal: public std::binary_function<const char*, const char*, bool>
+{
+ bool operator()(const char* lhs, const char* rhs) const
+ {
+ return strcmp(lhs, rhs) == 0;
+ }
+};
+
+/**
* LLTypeInfoLookup is specifically designed for use cases for which you might
* consider std::map<std::type_info*, VALUE>. We have several such data
* structures in the viewer. The trouble with them is that at least on Linux,
@@ -23,88 +63,55 @@
* different load modules will produce different std::type_info*.
* LLTypeInfoLookup contains a workaround to address this issue.
*
- * Specifically, when we don't find the passed std::type_info*,
- * LLTypeInfoLookup performs a linear search over registered entries to
- * compare name() strings. Presuming that this succeeds, we cache the new
- * (previously unrecognized) std::type_info* to speed future lookups.
- *
- * This worst-case fallback search (linear search with string comparison)
- * should only happen the first time we look up a given type from a particular
- * load module other than the one from which we initially registered types.
- * (However, a lookup which wouldn't succeed anyway will always have
- * worst-case performance.) This class is probably best used with less than a
- * few dozen different types.
+ * The API deliberately diverges from std::map in several respects:
+ * * It avoids iterators, not only begin()/end() but also as return values
+ * from insert() and find(). This bypasses transform_iterator overhead.
+ * * Since we literally use compile-time types as keys, the essential insert()
+ * and find() methods accept the key type as a @em template parameter,
+ * accepting and returning value_type as a normal runtime value. This is to
+ * permit future optimization (e.g. compile-time type hashing) without
+ * changing the API.
*/
template <typename VALUE>
class LLTypeInfoLookup
{
+ // Use this for our underlying implementation: lookup by
+ // std::type_info::name() string. This is one of the rare cases in which I
+ // dare use const char* directly, rather than std::string, because I'm
+ // sure that every value returned by std::type_info::name() is static.
+ // HOWEVER, specify our own hash + equality functors: naively comparing
+ // distinct const char* values won't work.
+ typedef boost::unordered_map<const char*, VALUE,
+ const_char_star_hash, const_char_star_equal> impl_map_type;
+
public:
- typedef LLTypeInfoLookup<VALUE> self;
- typedef LLSortedVector<const std::type_info*, VALUE> vector_type;
- typedef typename vector_type::key_type key_type;
- typedef typename vector_type::mapped_type mapped_type;
- typedef typename vector_type::value_type value_type;
- typedef typename vector_type::iterator iterator;
- typedef typename vector_type::const_iterator const_iterator;
+ typedef VALUE value_type;
LLTypeInfoLookup() {}
- iterator begin() { return mVector.begin(); }
- iterator end() { return mVector.end(); }
- const_iterator begin() const { return mVector.begin(); }
- const_iterator end() const { return mVector.end(); }
- bool empty() const { return mVector.empty(); }
- std::size_t size() const { return mVector.size(); }
-
- std::pair<iterator, bool> insert(const std::type_info* key, const VALUE& value)
- {
- return insert(value_type(key, value));
- }
-
- std::pair<iterator, bool> insert(const value_type& pair)
- {
- return mVector.insert(pair);
- }
+ bool empty() const { return mMap.empty(); }
+ std::size_t size() const { return mMap.size(); }
- // const find() forwards to non-const find(): this can alter mVector!
- const_iterator find(const std::type_info* key) const
+ template <typename KEY>
+ bool insert(const value_type& value)
{
- return const_cast<self*>(this)->find(key);
+ // Obtain and store the std::type_info::name() string as the key.
+ // Return just the bool from std::map::insert()'s return pair.
+ return mMap.insert(typename impl_map_type::value_type(typeid(KEY).name(), value)).second;
}
- // non-const find() caches previously-unknown type_info* to speed future
- // lookups.
- iterator find(const std::type_info* key)
+ template <typename KEY>
+ boost::optional<value_type> find() const
{
- iterator found = mVector.find(key);
- if (found != mVector.end())
- {
- // If LLSortedVector::find() found, great, we're done.
- return found;
- }
- // Here we didn't find the passed type_info*. On Linux, though, even
- // for the same type, typeid(sametype) produces a different type_info*
- // when used in different load modules. So the fact that we didn't
- // find the type_info* we seek doesn't mean this type isn't
- // registered. Scan for matching name() string.
- for (typename vector_type::iterator ti(mVector.begin()), tend(mVector.end());
- ti != tend; ++ti)
- {
- if (std::string(ti->first->name()) == key->name())
- {
- // This unrecognized 'key' is for the same type as ti->first.
- // To speed future lookups, insert a new entry that lets us
- // look up ti->second using this same 'key'.
- return insert(key, ti->second).first;
- }
- }
- // We simply have never seen a type with this type_info* from any load
- // module.
- return mVector.end();
+ // Use the std::type_info::name() string as the key.
+ typename impl_map_type::const_iterator found = mMap.find(typeid(KEY).name());
+ if (found == mMap.end())
+ return boost::optional<value_type>();
+ return found->second;
}
private:
- vector_type mVector;
+ impl_map_type mMap;
};
#endif /* ! defined(LL_LLTYPEINFOLOOKUP_H) */
diff --git a/indra/llcommon/lluuid.cpp b/indra/llcommon/lluuid.cpp
index 5d452ac4e4..db8c9c85ab 100644
--- a/indra/llcommon/lluuid.cpp
+++ b/indra/llcommon/lluuid.cpp
@@ -922,3 +922,174 @@ LLAssetID LLTransactionID::makeAssetID(const LLUUID& session) const
}
return result;
}
+
+// Construct
+LLUUID::LLUUID()
+{
+ setNull();
+}
+
+
+// Faster than copying from memory
+ void LLUUID::setNull()
+{
+ U32 *word = (U32 *)mData;
+ word[0] = 0;
+ word[1] = 0;
+ word[2] = 0;
+ word[3] = 0;
+}
+
+
+// Compare
+ bool LLUUID::operator==(const LLUUID& rhs) const
+{
+ U32 *tmp = (U32 *)mData;
+ U32 *rhstmp = (U32 *)rhs.mData;
+ // Note: binary & to avoid branching
+ return
+ (tmp[0] == rhstmp[0]) &
+ (tmp[1] == rhstmp[1]) &
+ (tmp[2] == rhstmp[2]) &
+ (tmp[3] == rhstmp[3]);
+}
+
+
+ bool LLUUID::operator!=(const LLUUID& rhs) const
+{
+ U32 *tmp = (U32 *)mData;
+ U32 *rhstmp = (U32 *)rhs.mData;
+ // Note: binary | to avoid branching
+ return
+ (tmp[0] != rhstmp[0]) |
+ (tmp[1] != rhstmp[1]) |
+ (tmp[2] != rhstmp[2]) |
+ (tmp[3] != rhstmp[3]);
+}
+
+/*
+// JC: This is dangerous. It allows UUIDs to be cast automatically
+// to integers, among other things. Use isNull() or notNull().
+ LLUUID::operator bool() const
+{
+ U32 *word = (U32 *)mData;
+ return (word[0] | word[1] | word[2] | word[3]) > 0;
+}
+*/
+
+ BOOL LLUUID::notNull() const
+{
+ U32 *word = (U32 *)mData;
+ return (word[0] | word[1] | word[2] | word[3]) > 0;
+}
+
+// Faster than == LLUUID::null because doesn't require
+// as much memory access.
+ BOOL LLUUID::isNull() const
+{
+ U32 *word = (U32 *)mData;
+ // If all bits are zero, return !0 == TRUE
+ return !(word[0] | word[1] | word[2] | word[3]);
+}
+
+// Copy constructor
+ LLUUID::LLUUID(const LLUUID& rhs)
+{
+ U32 *tmp = (U32 *)mData;
+ U32 *rhstmp = (U32 *)rhs.mData;
+ tmp[0] = rhstmp[0];
+ tmp[1] = rhstmp[1];
+ tmp[2] = rhstmp[2];
+ tmp[3] = rhstmp[3];
+}
+
+ LLUUID::~LLUUID()
+{
+}
+
+// Assignment
+ LLUUID& LLUUID::operator=(const LLUUID& rhs)
+{
+ // No need to check the case where this==&rhs. The branch is slower than the write.
+ U32 *tmp = (U32 *)mData;
+ U32 *rhstmp = (U32 *)rhs.mData;
+ tmp[0] = rhstmp[0];
+ tmp[1] = rhstmp[1];
+ tmp[2] = rhstmp[2];
+ tmp[3] = rhstmp[3];
+
+ return *this;
+}
+
+
+ LLUUID::LLUUID(const char *in_string)
+{
+ if (!in_string || in_string[0] == 0)
+ {
+ setNull();
+ return;
+ }
+
+ set(in_string);
+}
+
+ LLUUID::LLUUID(const std::string& in_string)
+{
+ if (in_string.empty())
+ {
+ setNull();
+ return;
+ }
+
+ set(in_string);
+}
+
+// IW: DON'T "optimize" these w/ U32s or you'll scoogie the sort order
+// IW: this will make me very sad
+ bool LLUUID::operator<(const LLUUID &rhs) const
+{
+ U32 i;
+ for( i = 0; i < (UUID_BYTES - 1); i++ )
+ {
+ if( mData[i] != rhs.mData[i] )
+ {
+ return (mData[i] < rhs.mData[i]);
+ }
+ }
+ return (mData[UUID_BYTES - 1] < rhs.mData[UUID_BYTES - 1]);
+}
+
+ bool LLUUID::operator>(const LLUUID &rhs) const
+{
+ U32 i;
+ for( i = 0; i < (UUID_BYTES - 1); i++ )
+ {
+ if( mData[i] != rhs.mData[i] )
+ {
+ return (mData[i] > rhs.mData[i]);
+ }
+ }
+ return (mData[UUID_BYTES - 1] > rhs.mData[UUID_BYTES - 1]);
+}
+
+ U16 LLUUID::getCRC16() const
+{
+ // A UUID is 16 bytes, or 8 shorts.
+ U16 *short_data = (U16*)mData;
+ U16 out = 0;
+ out += short_data[0];
+ out += short_data[1];
+ out += short_data[2];
+ out += short_data[3];
+ out += short_data[4];
+ out += short_data[5];
+ out += short_data[6];
+ out += short_data[7];
+ return out;
+}
+
+ U32 LLUUID::getCRC32() const
+{
+ U32 *tmp = (U32*)mData;
+ return tmp[0] + tmp[1] + tmp[2] + tmp[3];
+}
diff --git a/indra/llcommon/lluuid.h b/indra/llcommon/lluuid.h
index 726be4a82d..0b9e7d0cd0 100644
--- a/indra/llcommon/lluuid.h
+++ b/indra/llcommon/lluuid.h
@@ -129,177 +129,6 @@ public:
typedef std::vector<LLUUID> uuid_vec_t;
-// Construct
-inline LLUUID::LLUUID()
-{
- setNull();
-}
-
-
-// Faster than copying from memory
-inline void LLUUID::setNull()
-{
- U32 *word = (U32 *)mData;
- word[0] = 0;
- word[1] = 0;
- word[2] = 0;
- word[3] = 0;
-}
-
-
-// Compare
-inline bool LLUUID::operator==(const LLUUID& rhs) const
-{
- U32 *tmp = (U32 *)mData;
- U32 *rhstmp = (U32 *)rhs.mData;
- // Note: binary & to avoid branching
- return
- (tmp[0] == rhstmp[0]) &
- (tmp[1] == rhstmp[1]) &
- (tmp[2] == rhstmp[2]) &
- (tmp[3] == rhstmp[3]);
-}
-
-
-inline bool LLUUID::operator!=(const LLUUID& rhs) const
-{
- U32 *tmp = (U32 *)mData;
- U32 *rhstmp = (U32 *)rhs.mData;
- // Note: binary | to avoid branching
- return
- (tmp[0] != rhstmp[0]) |
- (tmp[1] != rhstmp[1]) |
- (tmp[2] != rhstmp[2]) |
- (tmp[3] != rhstmp[3]);
-}
-
-/*
-// JC: This is dangerous. It allows UUIDs to be cast automatically
-// to integers, among other things. Use isNull() or notNull().
-inline LLUUID::operator bool() const
-{
- U32 *word = (U32 *)mData;
- return (word[0] | word[1] | word[2] | word[3]) > 0;
-}
-*/
-
-inline BOOL LLUUID::notNull() const
-{
- U32 *word = (U32 *)mData;
- return (word[0] | word[1] | word[2] | word[3]) > 0;
-}
-
-// Faster than == LLUUID::null because doesn't require
-// as much memory access.
-inline BOOL LLUUID::isNull() const
-{
- U32 *word = (U32 *)mData;
- // If all bits are zero, return !0 == TRUE
- return !(word[0] | word[1] | word[2] | word[3]);
-}
-
-// Copy constructor
-inline LLUUID::LLUUID(const LLUUID& rhs)
-{
- U32 *tmp = (U32 *)mData;
- U32 *rhstmp = (U32 *)rhs.mData;
- tmp[0] = rhstmp[0];
- tmp[1] = rhstmp[1];
- tmp[2] = rhstmp[2];
- tmp[3] = rhstmp[3];
-}
-
-inline LLUUID::~LLUUID()
-{
-}
-
-// Assignment
-inline LLUUID& LLUUID::operator=(const LLUUID& rhs)
-{
- // No need to check the case where this==&rhs. The branch is slower than the write.
- U32 *tmp = (U32 *)mData;
- U32 *rhstmp = (U32 *)rhs.mData;
- tmp[0] = rhstmp[0];
- tmp[1] = rhstmp[1];
- tmp[2] = rhstmp[2];
- tmp[3] = rhstmp[3];
-
- return *this;
-}
-
-
-inline LLUUID::LLUUID(const char *in_string)
-{
- if (!in_string || in_string[0] == 0)
- {
- setNull();
- return;
- }
-
- set(in_string);
-}
-
-inline LLUUID::LLUUID(const std::string& in_string)
-{
- if (in_string.empty())
- {
- setNull();
- return;
- }
-
- set(in_string);
-}
-
-// IW: DON'T "optimize" these w/ U32s or you'll scoogie the sort order
-// IW: this will make me very sad
-inline bool LLUUID::operator<(const LLUUID &rhs) const
-{
- U32 i;
- for( i = 0; i < (UUID_BYTES - 1); i++ )
- {
- if( mData[i] != rhs.mData[i] )
- {
- return (mData[i] < rhs.mData[i]);
- }
- }
- return (mData[UUID_BYTES - 1] < rhs.mData[UUID_BYTES - 1]);
-}
-
-inline bool LLUUID::operator>(const LLUUID &rhs) const
-{
- U32 i;
- for( i = 0; i < (UUID_BYTES - 1); i++ )
- {
- if( mData[i] != rhs.mData[i] )
- {
- return (mData[i] > rhs.mData[i]);
- }
- }
- return (mData[UUID_BYTES - 1] > rhs.mData[UUID_BYTES - 1]);
-}
-
-inline U16 LLUUID::getCRC16() const
-{
- // A UUID is 16 bytes, or 8 shorts.
- U16 *short_data = (U16*)mData;
- U16 out = 0;
- out += short_data[0];
- out += short_data[1];
- out += short_data[2];
- out += short_data[3];
- out += short_data[4];
- out += short_data[5];
- out += short_data[6];
- out += short_data[7];
- return out;
-}
-
-inline U32 LLUUID::getCRC32() const
-{
- U32 *tmp = (U32*)mData;
- return tmp[0] + tmp[1] + tmp[2] + tmp[3];
-}
-
// Helper structure for ordering lluuids in stl containers.
// eg: std::map<LLUUID, LLWidget*, lluuid_less> widget_map;
@@ -329,3 +158,5 @@ public:
};
#endif
+
+
diff --git a/indra/llcommon/llversionviewer.h b/indra/llcommon/llversionviewer.h
index bfb30f900f..bcc661a920 100644
--- a/indra/llcommon/llversionviewer.h
+++ b/indra/llcommon/llversionviewer.h
@@ -28,8 +28,8 @@
#define LL_LLVERSIONVIEWER_H
const S32 LL_VERSION_MAJOR = 3;
-const S32 LL_VERSION_MINOR = 3;
-const S32 LL_VERSION_PATCH = 3;
+const S32 LL_VERSION_MINOR = 4;
+const S32 LL_VERSION_PATCH = 1;
const S32 LL_VERSION_BUILD = 0;
const char * const LL_CHANNEL = "Second Life Developer";
diff --git a/indra/llimage/llimage.cpp b/indra/llimage/llimage.cpp
index 6775b005f4..e6b838c5b2 100644
--- a/indra/llimage/llimage.cpp
+++ b/indra/llimage/llimage.cpp
@@ -292,11 +292,16 @@ LLImageRaw::LLImageRaw(U16 width, U16 height, S8 components)
++sRawImageCount;
}
-LLImageRaw::LLImageRaw(U8 *data, U16 width, U16 height, S8 components)
+LLImageRaw::LLImageRaw(U8 *data, U16 width, U16 height, S8 components, bool no_copy)
: LLImageBase()
{
mMemType = LLMemType::MTYPE_IMAGERAW;
- if(allocateDataSize(width, height, components))
+
+ if(no_copy)
+ {
+ setDataAndSize(data, width, height, components);
+ }
+ else if(allocateDataSize(width, height, components))
{
memcpy(getData(), data, width*height*components);
}
diff --git a/indra/llimage/llimage.h b/indra/llimage/llimage.h
index 46e6d1a901..99023351c2 100644
--- a/indra/llimage/llimage.h
+++ b/indra/llimage/llimage.h
@@ -189,7 +189,7 @@ protected:
public:
LLImageRaw();
LLImageRaw(U16 width, U16 height, S8 components);
- LLImageRaw(U8 *data, U16 width, U16 height, S8 components);
+ LLImageRaw(U8 *data, U16 width, U16 height, S8 components, bool no_copy = false);
// Construct using createFromFile (used by tools)
//LLImageRaw(const std::string& filename, bool j2c_lowest_mip_only = false);
diff --git a/indra/llimage/llimagej2c.cpp b/indra/llimage/llimagej2c.cpp
index 452aad25cb..452aad25cb 100644..100755
--- a/indra/llimage/llimagej2c.cpp
+++ b/indra/llimage/llimagej2c.cpp
diff --git a/indra/llinventory/llparcel.cpp b/indra/llinventory/llparcel.cpp
index 433076c7a9..a871bcbb25 100644
--- a/indra/llinventory/llparcel.cpp
+++ b/indra/llinventory/llparcel.cpp
@@ -193,8 +193,6 @@ void LLParcel::init(const LLUUID &owner_id,
mMediaWidth = 0;
mMediaHeight = 0;
setMediaCurrentURL(LLStringUtil::null);
- mMediaURLFilterEnable = FALSE;
- mMediaURLFilterList = LLSD::emptyArray();
mMediaAllowNavigate = TRUE;
mMediaURLTimeout = 0.0f;
mMediaPreventCameraZoom = FALSE;
@@ -336,38 +334,6 @@ void LLParcel::setMediaURLResetTimer(F32 time)
mMediaResetTimer.setTimerExpirySec(time);
}
-void LLParcel::setMediaURLFilterList(LLSD list)
-{
- // sanity check LLSD
- // must be array of strings
- if (!list.isArray())
- {
- return;
- }
-
- for (S32 i = 0; i < list.size(); i++)
- {
- if (!list[i].isString())
- return;
- }
-
- // can't be too big
- const S32 MAX_SIZE = 50;
- if (list.size() > MAX_SIZE)
- {
- LLSD new_list = LLSD::emptyArray();
-
- for (S32 i = 0; i < llmin(list.size(), MAX_SIZE); i++)
- {
- new_list.append(list[i]);
- }
-
- list = new_list;
- }
-
- mMediaURLFilterList = list;
-}
-
// virtual
void LLParcel::setLocalID(S32 local_id)
{
@@ -622,34 +588,6 @@ BOOL LLParcel::importAccessEntry(std::istream& input_stream, LLAccessEntry* entr
return input_stream.good();
}
-BOOL LLParcel::importMediaURLFilter(std::istream& input_stream, std::string& url)
-{
- skip_to_end_of_next_keyword("{", input_stream);
-
- while(input_stream.good())
- {
- skip_comments_and_emptyspace(input_stream);
- std::string line, keyword, value;
- get_line(line, input_stream, MAX_STRING);
- get_keyword_and_value(keyword, value, line);
-
- if ("}" == keyword)
- {
- break;
- }
- else if ("url" == keyword)
- {
- url = value;
- }
- else
- {
- llwarns << "Unknown keyword in parcel media url filter section: <"
- << keyword << ">" << llendl;
- }
- }
- return input_stream.good();
-}
-
// Assumes we are in a block "ParcelData"
void LLParcel::packMessage(LLMessageSystem* msg)
{
@@ -696,8 +634,6 @@ void LLParcel::packMessage(LLSD& msg)
msg["media_allow_navigate"] = getMediaAllowNavigate();
msg["media_prevent_camera_zoom"] = getMediaPreventCameraZoom();
msg["media_url_timeout"] = getMediaURLTimeout();
- msg["media_url_filter_enable"] = getMediaURLFilterEnable();
- msg["media_url_filter_list"] = getMediaURLFilterList();
msg["group_id"] = getGroupID();
msg["pass_price"] = mPassPrice;
msg["pass_hours"] = mPassHours;
@@ -789,7 +725,6 @@ void LLParcel::unpackMessage(LLMessageSystem* msg)
msg->getString("MediaLinkSharing", "MediaCurrentURL", buffer);
setMediaCurrentURL(buffer);
msg->getU8 ( "MediaLinkSharing", "MediaAllowNavigate", mMediaAllowNavigate );
- msg->getU8 ( "MediaLinkSharing", "MediaURLFilterEnable", mMediaURLFilterEnable );
msg->getU8 ( "MediaLinkSharing", "MediaPreventCameraZoom", mMediaPreventCameraZoom );
msg->getF32( "MediaLinkSharing", "MediaURLTimeout", mMediaURLTimeout);
}
@@ -1250,8 +1185,6 @@ void LLParcel::clearParcel()
mMediaWidth = 0;
mMediaHeight = 0;
setMediaCurrentURL(LLStringUtil::null);
- setMediaURLFilterList(LLSD::emptyArray());
- setMediaURLFilterEnable(FALSE);
setMediaAllowNavigate(TRUE);
setMediaPreventCameraZoom(FALSE);
setMediaURLTimeout(0.0f);
diff --git a/indra/llinventory/llparcel.h b/indra/llinventory/llparcel.h
index e36d0b20d2..499f690e76 100644
--- a/indra/llinventory/llparcel.h
+++ b/indra/llinventory/llparcel.h
@@ -45,7 +45,7 @@ const S32 PARCEL_UNIT_AREA = 16;
const F32 PARCEL_HEIGHT = 50.f;
//Height above ground which parcel boundries exist for explicitly banned avatars
-const F32 BAN_HEIGHT = 768.f;
+const F32 BAN_HEIGHT = 5000.f;
// Maximum number of entries in an access list
const S32 PARCEL_MAX_ACCESS_LIST = 300;
@@ -247,8 +247,6 @@ public:
void setMediaWidth(S32 width);
void setMediaHeight(S32 height);
void setMediaCurrentURL(const std::string& url);
- void setMediaURLFilterEnable(U8 enable) { mMediaURLFilterEnable = enable; }
- void setMediaURLFilterList(LLSD list);
void setMediaAllowNavigate(U8 enable) { mMediaAllowNavigate = enable; }
void setMediaURLTimeout(F32 timeout) { mMediaURLTimeout = timeout; }
void setMediaPreventCameraZoom(U8 enable) { mMediaPreventCameraZoom = enable; }
@@ -310,7 +308,6 @@ public:
// BOOL importStream(std::istream& input_stream);
BOOL importAccessEntry(std::istream& input_stream, LLAccessEntry* entry);
- BOOL importMediaURLFilter(std::istream& input_stream, std::string& url);
// BOOL exportStream(std::ostream& output_stream);
void packMessage(LLMessageSystem* msg);
@@ -354,8 +351,6 @@ public:
U8 getMediaAutoScale() const { return mMediaAutoScale; }
U8 getMediaLoop() const { return mMediaLoop; }
const std::string& getMediaCurrentURL() const { return mMediaCurrentURL; }
- U8 getMediaURLFilterEnable() const { return mMediaURLFilterEnable; }
- LLSD getMediaURLFilterList() const { return mMediaURLFilterList; }
U8 getMediaAllowNavigate() const { return mMediaAllowNavigate; }
F32 getMediaURLTimeout() const { return mMediaURLTimeout; }
U8 getMediaPreventCameraZoom() const { return mMediaPreventCameraZoom; }
@@ -651,8 +646,6 @@ protected:
U8 mMediaLoop;
std::string mMediaCurrentURL;
LLUUID mMediaID;
- U8 mMediaURLFilterEnable;
- LLSD mMediaURLFilterList;
U8 mMediaAllowNavigate;
U8 mMediaPreventCameraZoom;
F32 mMediaURLTimeout;
diff --git a/indra/llkdu/llimagej2ckdu.cpp b/indra/llkdu/llimagej2ckdu.cpp
index cf88de12b4..0c0a844b73 100644
--- a/indra/llkdu/llimagej2ckdu.cpp
+++ b/indra/llkdu/llimagej2ckdu.cpp
@@ -1179,7 +1179,7 @@ LLKDUDecodeState::LLKDUDecodeState(kdu_tile tile, kdu_byte *buf, S32 row_gap)
llassert(mDims == comp_dims); // Safety check; the caller has ensured this
}
bool use_shorts = (mComps[c].get_bit_depth(true) <= 16);
- mLines[c].pre_create(&mAllocator,mDims.size.x,mReversible[c],use_shorts);
+ mLines[c].pre_create(&mAllocator,mDims.size.x,mReversible[c],use_shorts,0,0);
if (res.which() == 0) // No DWT levels used
{
mEngines[c] = kdu_decoder(res.access_subband(LL_BAND),&mAllocator,use_shorts);
@@ -1223,7 +1223,7 @@ separation between consecutive rows in the real buffer. */
{
for (c = 0; c < mNumComponents; c++)
{
- mEngines[c].pull(mLines[c],true);
+ mEngines[c].pull(mLines[c]);
}
if ((mNumComponents >= 3) && mUseYCC)
{
diff --git a/indra/llkdu/llimagej2ckdu.h b/indra/llkdu/llimagej2ckdu.h
index 9ab0b9e4a7..fb1f6535ba 100644
--- a/indra/llkdu/llimagej2ckdu.h
+++ b/indra/llkdu/llimagej2ckdu.h
@@ -32,6 +32,7 @@
//
// KDU core header files
//
+#define KDU_NO_THREADS
#include "kdu_elementary.h"
#include "kdu_messaging.h"
#include "kdu_params.h"
diff --git a/indra/llkdu/llkdumem.h b/indra/llkdu/llkdumem.h
index 9d923fc367..dbdf88b2d9 100644
--- a/indra/llkdu/llkdumem.h
+++ b/indra/llkdu/llkdumem.h
@@ -28,6 +28,7 @@
#define LL_LLKDUMEM_H
// Support classes for reading and writing from memory buffers in KDU
+#define KDU_NO_THREADS
#include "kdu_image.h"
#include "kdu_elementary.h"
#include "kdu_messaging.h"
diff --git a/indra/llkdu/tests/llimagej2ckdu_test.cpp b/indra/llkdu/tests/llimagej2ckdu_test.cpp
index beee99a522..b675153b2e 100644..100755
--- a/indra/llkdu/tests/llimagej2ckdu_test.cpp
+++ b/indra/llkdu/tests/llimagej2ckdu_test.cpp
@@ -127,7 +127,6 @@ kdu_subband kdu_resolution::access_subband(int ) { kdu_subband a; return a; }
void kdu_resolution::get_dims(kdu_dims& ) { }
int kdu_resolution::which() { return 0; }
int kdu_resolution::get_valid_band_indices(int &) { return 1; }
-kdu_decoder::kdu_decoder(kdu_subband , kdu_sample_allocator*, bool , float, int, kdu_thread_env*, kdu_thread_queue*) { }
kdu_synthesis::kdu_synthesis(kdu_resolution, kdu_sample_allocator*, bool, float, kdu_thread_env*, kdu_thread_queue*) { }
kdu_params::kdu_params(const char*, bool, bool, bool, bool, bool) { }
kdu_params::~kdu_params() { }
@@ -153,7 +152,6 @@ void kdu_codestream::destroy() { }
void kdu_codestream::collect_timing_stats(int ) { }
void kdu_codestream::set_max_bytes(kdu_long, bool, bool ) { }
void kdu_codestream::get_valid_tiles(kdu_dims& ) { }
-void kdu_codestream::create(siz_params*, kdu_compressed_target*, kdu_dims*, int, kdu_long ) { }
void kdu_codestream::create(kdu_compressed_source*, kdu_thread_env*) { }
void kdu_codestream::apply_input_restrictions( int, int, int, int, kdu_dims*, kdu_component_access_mode ) { }
void kdu_codestream::get_subsampling(int , kdu_coords&, bool ) { }
@@ -175,7 +173,7 @@ kdu_block* kdu_subband::open_block(kdu_coords, int*, kdu_thread_env*) { return N
bool kdu_codestream_comment::put_text(const char*) { return false; }
void kdu_customize_warnings(kdu_message*) { }
void kdu_customize_errors(kdu_message*) { }
-void kdu_convert_ycc_to_rgb(kdu_line_buf&, kdu_line_buf&, kdu_line_buf&, int) { }
+
kdu_long kdu_multi_analysis::create(kdu_codestream, kdu_tile, bool, kdu_roi_image*, bool, int, kdu_thread_env*, kdu_thread_queue*, bool ) { kdu_long a = 0; return a; }
siz_params::siz_params() : kdu_params(NULL, false, false, false, false, false) { }
void siz_params::finalize(bool ) { }
@@ -184,6 +182,21 @@ int siz_params::write_marker_segment(kdu_output*, kdu_params*, int) { return 0;
bool siz_params::check_marker_segment(kdu_uint16, int, kdu_byte a[], int&) { return false; }
bool siz_params::read_marker_segment(kdu_uint16, int, kdu_byte a[], int) { return false; }
+#ifdef LL_LINUX
+// Linux use the old pre KDU v7.0.0
+// *TODO: Supress this legacy stubbs once Linux migrates to v7.0.0
+kdu_decoder::kdu_decoder(kdu_subband , kdu_sample_allocator*, bool , float, int, kdu_thread_env*, kdu_thread_queue*) { }
+void kdu_codestream::create(siz_params*, kdu_compressed_target*, kdu_dims*, int, kdu_long ) { }
+void kdu_convert_ycc_to_rgb(kdu_line_buf&, kdu_line_buf&, kdu_line_buf&, int) { }
+#else
+kdu_decoder::kdu_decoder(kdu_subband , kdu_sample_allocator*, bool , float, int, kdu_thread_env*, kdu_thread_queue*, int) { }
+void kdu_codestream::create(siz_params*, kdu_compressed_target*, kdu_dims*, int, kdu_long, kdu_thread_env* ) { }
+void (*kdu_convert_ycc_to_rgb_rev16)(kdu_int16*,kdu_int16*,kdu_int16*,int);
+void (*kdu_convert_ycc_to_rgb_irrev16)(kdu_int16*,kdu_int16*,kdu_int16*,int);
+void (*kdu_convert_ycc_to_rgb_rev32)(kdu_int32*,kdu_int32*,kdu_int32*,int);
+void (*kdu_convert_ycc_to_rgb_irrev32)(float*,float*,float*,int);
+#endif
+
// -------------------------------------------------------------------------------------------
// TUT
// -------------------------------------------------------------------------------------------
diff --git a/indra/llmath/CMakeLists.txt b/indra/llmath/CMakeLists.txt
index b5e59c1ca3..5865ae030c 100644
--- a/indra/llmath/CMakeLists.txt
+++ b/indra/llmath/CMakeLists.txt
@@ -117,6 +117,7 @@ if (LL_TESTS)
# INTEGRATION TESTS
set(test_libs llmath llcommon ${LLCOMMON_LIBRARIES} ${WINDOWS_LIBRARIES})
# TODO: Some of these need refactoring to be proper Unit tests rather than Integration tests.
+ LL_ADD_INTEGRATION_TEST(alignment "" "${test_libs}")
LL_ADD_INTEGRATION_TEST(llbbox llbbox.cpp "${test_libs}")
LL_ADD_INTEGRATION_TEST(llquaternion llquaternion.cpp "${test_libs}")
LL_ADD_INTEGRATION_TEST(mathmisc "" "${test_libs}")
diff --git a/indra/llmath/llcamera.h b/indra/llmath/llcamera.h
index ec67b91d05..0b591be622 100644
--- a/indra/llmath/llcamera.h
+++ b/indra/llmath/llcamera.h
@@ -60,7 +60,7 @@ static const F32 MAX_FIELD_OF_VIEW = 175.f * DEG_TO_RAD;
// roll(), pitch(), yaw()
// etc...
-
+LL_ALIGN_PREFIX(16)
class LLCamera
: public LLCoordFrame
{
@@ -108,7 +108,7 @@ public:
};
private:
- LLPlane mAgentPlanes[7]; //frustum planes in agent space a la gluUnproject (I'm a bastard, I know) - DaveP
+ LL_ALIGN_16(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.
@@ -116,13 +116,13 @@ private:
S32 mViewHeightInPixels; // for ViewHeightInPixels() only
F32 mNearPlane;
F32 mFarPlane;
- LLPlane mLocalPlanes[4];
+ LL_ALIGN_16(LLPlane mLocalPlanes[4]);
F32 mFixedDistance; // Always return this distance, unless < 0
LLVector3 mFrustCenter; // center of frustum and radius squared for ultra-quick exclusion test
F32 mFrustRadiusSquared;
- LLPlane mWorldPlanes[PLANE_NUM];
- LLPlane mHorizPlanes[HORIZ_PLANE_NUM];
+ LL_ALIGN_16(LLPlane mWorldPlanes[PLANE_NUM]);
+ LL_ALIGN_16(LLPlane mHorizPlanes[HORIZ_PLANE_NUM]);
U32 mPlaneCount; //defaults to 6, if setUserClipPlane is called, uses user supplied clip plane in
@@ -208,7 +208,7 @@ protected:
void calculateFrustumPlanes(F32 left, F32 right, F32 top, F32 bottom);
void calculateFrustumPlanesFromWindow(F32 x1, F32 y1, F32 x2, F32 y2);
void calculateWorldFrustumPlanes();
-};
+} LL_ALIGN_POSTFIX(16);
#endif
diff --git a/indra/llmath/llmath.h b/indra/llmath/llmath.h
index 9297bcbac2..b93f89d674 100644
--- a/indra/llmath/llmath.h
+++ b/indra/llmath/llmath.h
@@ -85,7 +85,7 @@ const F32 F_ALMOST_ONE = 1.0f - F_ALMOST_ZERO;
const F32 FP_MAG_THRESHOLD = 0.0000001f;
// TODO: Replace with logic like is_approx_equal
-inline BOOL is_approx_zero( F32 f ) { return (-F_APPROXIMATELY_ZERO < f) && (f < F_APPROXIMATELY_ZERO); }
+inline bool is_approx_zero( F32 f ) { return (-F_APPROXIMATELY_ZERO < f) && (f < F_APPROXIMATELY_ZERO); }
// These functions work by interpreting sign+exp+mantissa as an unsigned
// integer.
@@ -111,13 +111,13 @@ inline BOOL is_approx_zero( F32 f ) { return (-F_APPROXIMATELY_ZERO < f) && (f <
// WARNING: Infinity is comparable with F32_MAX and negative
// infinity is comparable with F32_MIN
-inline BOOL is_approx_equal(F32 x, F32 y)
+inline bool is_approx_equal(F32 x, F32 y)
{
const S32 COMPARE_MANTISSA_UP_TO_BIT = 0x02;
return (std::abs((S32) ((U32&)x - (U32&)y) ) < COMPARE_MANTISSA_UP_TO_BIT);
}
-inline BOOL is_approx_equal(F64 x, F64 y)
+inline bool is_approx_equal(F64 x, F64 y)
{
const S64 COMPARE_MANTISSA_UP_TO_BIT = 0x02;
return (std::abs((S32) ((U64&)x - (U64&)y) ) < COMPARE_MANTISSA_UP_TO_BIT);
diff --git a/indra/llmath/llmatrix3a.h b/indra/llmath/llmatrix3a.h
index adb7e3389d..9916cfd2da 100644
--- a/indra/llmath/llmatrix3a.h
+++ b/indra/llmath/llmatrix3a.h
@@ -111,7 +111,7 @@ public:
protected:
- LLVector4a mColumns[3];
+ LL_ALIGN_16(LLVector4a mColumns[3]);
};
diff --git a/indra/llmath/llmatrix4a.h b/indra/llmath/llmatrix4a.h
index 27cf5b79f6..c4cefdb4fa 100644
--- a/indra/llmath/llmatrix4a.h
+++ b/indra/llmath/llmatrix4a.h
@@ -34,7 +34,7 @@
class LLMatrix4a
{
public:
- LLVector4a mMatrix[4];
+ LL_ALIGN_16(LLVector4a mMatrix[4]);
inline void clear()
{
diff --git a/indra/llmath/lloctree.h b/indra/llmath/lloctree.h
index 1b11e83b4a..c3f6f7de2a 100644
--- a/indra/llmath/lloctree.h
+++ b/indra/llmath/lloctree.h
@@ -31,7 +31,6 @@
#include "v3math.h"
#include "llvector4a.h"
#include <vector>
-#include <set>
#define OCT_ERRS LL_WARNS("OctreeErrors")
@@ -79,16 +78,18 @@ public:
typedef LLOctreeTraveler<T> oct_traveler;
typedef LLTreeTraveler<T> tree_traveler;
- typedef typename std::set<LLPointer<T> > element_list;
- typedef typename element_list::iterator element_iter;
- typedef typename element_list::const_iterator const_element_iter;
+ typedef LLPointer<T>* element_list;
+ typedef LLPointer<T>* element_iter;
+ typedef const LLPointer<T>* const_element_iter;
typedef typename std::vector<LLTreeListener<T>*>::iterator tree_listener_iter;
- typedef typename std::vector<LLOctreeNode<T>* > child_list;
+ typedef LLOctreeNode<T>** child_list;
+ typedef LLOctreeNode<T>** child_iter;
+
typedef LLTreeNode<T> BaseType;
typedef LLOctreeNode<T> oct_node;
typedef LLOctreeListener<T> oct_listener;
- /*void* operator new(size_t size)
+ void* operator new(size_t size)
{
return ll_aligned_malloc_16(size);
}
@@ -96,7 +97,7 @@ public:
void operator delete(void* ptr)
{
ll_aligned_free_16(ptr);
- }*/
+ }
LLOctreeNode( const LLVector4a& center,
const LLVector4a& size,
@@ -105,6 +106,9 @@ public:
: mParent((oct_node*)parent),
mOctant(octant)
{
+ mData = NULL;
+ mDataEnd = NULL;
+
mCenter = center;
mSize = size;
@@ -123,6 +127,16 @@ public:
{
BaseType::destroyListeners();
+ for (U32 i = 0; i < mElementCount; ++i)
+ {
+ mData[i]->setBinIndex(-1);
+ mData[i] = NULL;
+ }
+
+ free(mData);
+ mData = NULL;
+ mDataEnd = NULL;
+
for (U32 i = 0; i < getChildCount(); i++)
{
delete getChild(i);
@@ -219,12 +233,17 @@ public:
}
void accept(oct_traveler* visitor) { visitor->visit(this); }
- virtual bool isLeaf() const { return mChild.empty(); }
+ virtual bool isLeaf() const { return mChildCount == 0; }
U32 getElementCount() const { return mElementCount; }
+ bool isEmpty() const { return mElementCount == 0; }
element_list& getData() { return mData; }
const element_list& getData() const { return mData; }
-
+ element_iter getDataBegin() { return mData; }
+ element_iter getDataEnd() { return mDataEnd; }
+ const_element_iter getDataBegin() const { return mData; }
+ const_element_iter getDataEnd() const { return mDataEnd; }
+
U32 getChildCount() const { return mChildCount; }
oct_node* getChild(U32 index) { return mChild[index]; }
const oct_node* getChild(U32 index) const { return mChild[index]; }
@@ -289,7 +308,7 @@ public:
virtual bool insert(T* data)
{
- if (data == NULL)
+ if (data == NULL || data->getBinIndex() != -1)
{
OCT_ERRS << "!!! INVALID ELEMENT ADDED TO OCTREE BRANCH !!!" << llendl;
return false;
@@ -302,13 +321,16 @@ public:
if ((getElementCount() < gOctreeMaxCapacity && contains(data->getBinRadius()) ||
(data->getBinRadius() > getSize()[0] && parent && parent->getElementCount() >= gOctreeMaxCapacity)))
{ //it belongs here
- //if this is a redundant insertion, error out (should never happen)
- llassert(mData.find(data) == mData.end());
+ mElementCount++;
+ mData = (element_list) realloc(mData, sizeof(LLPointer<T>)*mElementCount);
- mData.insert(data);
- BaseType::insert(data);
+ //avoid unref on uninitialized memory
+ memset(mData+mElementCount-1, 0, sizeof(LLPointer<T>));
- mElementCount = mData.size();
+ mData[mElementCount-1] = data;
+ mDataEnd = mData + mElementCount;
+ data->setBinIndex(mElementCount-1);
+ BaseType::insert(data);
return true;
}
else
@@ -342,10 +364,16 @@ public:
if( lt == 0x7 )
{
- mData.insert(data);
- BaseType::insert(data);
+ mElementCount++;
+ mData = (element_list) realloc(mData, sizeof(LLPointer<T>)*mElementCount);
+
+ //avoid unref on uninitialized memory
+ memset(mData+mElementCount-1, 0, sizeof(LLPointer<T>));
- mElementCount = mData.size();
+ mData[mElementCount-1] = data;
+ mDataEnd = mData + mElementCount;
+ data->setBinIndex(mElementCount-1);
+ BaseType::insert(data);
return true;
}
@@ -394,23 +422,59 @@ public:
return false;
}
+ void _remove(T* data, S32 i)
+ { //precondition -- mElementCount > 0, idx is in range [0, mElementCount)
+
+ mElementCount--;
+ data->setBinIndex(-1);
+
+ if (mElementCount > 0)
+ {
+ if (mElementCount != i)
+ {
+ mData[i] = mData[mElementCount]; //might unref data, do not access data after this point
+ mData[i]->setBinIndex(i);
+ }
+
+ mData[mElementCount] = NULL; //needed for unref
+ mData = (element_list) realloc(mData, sizeof(LLPointer<T>)*mElementCount);
+ mDataEnd = mData+mElementCount;
+ }
+ else
+ {
+ mData[0] = NULL; //needed for unref
+ free(mData);
+ mData = NULL;
+ mDataEnd = NULL;
+ }
+
+ notifyRemoval(data);
+ checkAlive();
+ }
+
bool remove(T* data)
{
- if (mData.find(data) != mData.end())
- { //we have data
- mData.erase(data);
- mElementCount = mData.size();
- notifyRemoval(data);
- checkAlive();
- return true;
- }
- else if (isInside(data))
+ S32 i = data->getBinIndex();
+
+ if (i >= 0 && i < mElementCount)
+ {
+ if (mData[i] == data)
+ { //found it
+ _remove(data, i);
+ llassert(data->getBinIndex() == -1);
+ return true;
+ }
+ }
+
+ if (isInside(data))
{
oct_node* dest = getNodeAt(data);
if (dest != this)
{
- return dest->remove(data);
+ bool ret = dest->remove(data);
+ llassert(data->getBinIndex() == -1);
+ return ret;
}
}
@@ -429,19 +493,20 @@ public:
//node is now root
llwarns << "!!! OCTREE REMOVING FACE BY ADDRESS, SEVERE PERFORMANCE PENALTY |||" << llendl;
node->removeByAddress(data);
+ llassert(data->getBinIndex() == -1);
return true;
}
void removeByAddress(T* data)
{
- if (mData.find(data) != mData.end())
+ for (U32 i = 0; i < mElementCount; ++i)
{
- mData.erase(data);
- mElementCount = mData.size();
- notifyRemoval(data);
- llwarns << "FOUND!" << llendl;
- checkAlive();
- return;
+ if (mData[i] == data)
+ { //we have data
+ _remove(data, i);
+ llwarns << "FOUND!" << llendl;
+ return;
+ }
}
for (U32 i = 0; i < getChildCount(); i++)
@@ -453,8 +518,8 @@ public:
void clearChildren()
{
- mChild.clear();
mChildCount = 0;
+
U32* foo = (U32*) mChildMap;
foo[0] = foo[1] = 0xFFFFFFFF;
}
@@ -516,7 +581,7 @@ public:
mChildMap[child->getOctant()] = mChildCount;
- mChild.push_back(child);
+ mChild[mChildCount] = child;
++mChildCount;
child->setParent(this);
@@ -543,9 +608,12 @@ public:
mChild[index]->destroy();
delete mChild[index];
}
- mChild.erase(mChild.begin() + index);
+
--mChildCount;
+ mChild[index] = mChild[mChildCount];
+
+
//rebuild child map
U32* foo = (U32*) mChildMap;
foo[0] = foo[1] = 0xFFFFFFFF;
@@ -601,11 +669,12 @@ protected:
oct_node* mParent;
U8 mOctant;
- child_list mChild;
+ LLOctreeNode<T>* mChild[8];
U8 mChildMap[8];
U32 mChildCount;
element_list mData;
+ element_iter mDataEnd;
U32 mElementCount;
};
diff --git a/indra/llmath/llplane.h b/indra/llmath/llplane.h
index a611894721..3c32441b11 100644
--- a/indra/llmath/llplane.h
+++ b/indra/llmath/llplane.h
@@ -36,6 +36,8 @@
// The plane normal = [A, B, C]
// The closest approach = D / sqrt(A*A + B*B + C*C)
+
+LL_ALIGN_PREFIX(16)
class LLPlane
{
public:
@@ -94,7 +96,7 @@ public:
private:
LLVector4a mV;
-};
+} LL_ALIGN_POSTFIX(16);
diff --git a/indra/llmath/llsimdmath.h b/indra/llmath/llsimdmath.h
index c7cdf7b32c..01458521ec 100644
--- a/indra/llmath/llsimdmath.h
+++ b/indra/llmath/llsimdmath.h
@@ -67,11 +67,10 @@ template <typename T> T* LL_NEXT_ALIGNED_ADDRESS_64(T* address)
#define LL_ALIGN_16(var) LL_ALIGN_PREFIX(16) var LL_ALIGN_POSTFIX(16)
-
-
#include <xmmintrin.h>
#include <emmintrin.h>
+#include "llmemory.h"
#include "llsimdtypes.h"
#include "llsimdtypes.inl"
diff --git a/indra/llmath/llsimdtypes.inl b/indra/llmath/llsimdtypes.inl
index 712239e425..e905c84954 100644
--- a/indra/llmath/llsimdtypes.inl
+++ b/indra/llmath/llsimdtypes.inl
@@ -62,6 +62,7 @@ inline LLSimdScalar operator/(const LLSimdScalar& a, const LLSimdScalar& b)
inline LLSimdScalar operator-(const LLSimdScalar& a)
{
static LL_ALIGN_16(const U32 signMask[4]) = {0x80000000, 0x80000000, 0x80000000, 0x80000000 };
+ ll_assert_aligned(signMask,16);
return _mm_xor_ps(*reinterpret_cast<const LLQuad*>(signMask), a);
}
@@ -146,6 +147,7 @@ inline LLSimdScalar& LLSimdScalar::operator/=(const LLSimdScalar& rhs)
inline LLSimdScalar LLSimdScalar::getAbs() const
{
static const LL_ALIGN_16(U32 F_ABS_MASK_4A[4]) = { 0x7FFFFFFF, 0x7FFFFFFF, 0x7FFFFFFF, 0x7FFFFFFF };
+ ll_assert_aligned(F_ABS_MASK_4A,16);
return _mm_and_ps( mQ, *reinterpret_cast<const LLQuad*>(F_ABS_MASK_4A));
}
diff --git a/indra/llmath/llvector4a.cpp b/indra/llmath/llvector4a.cpp
index b66b7a7076..6edeb0fefe 100644
--- a/indra/llmath/llvector4a.cpp
+++ b/indra/llmath/llvector4a.cpp
@@ -24,6 +24,7 @@
* $/LicenseInfo$
*/
+#include "llmemory.h"
#include "llmath.h"
#include "llquantize.h"
@@ -44,7 +45,10 @@ extern const LLVector4a LL_V4A_EPSILON = reinterpret_cast<const LLVector4a&> ( F
assert(dst != NULL);
assert(bytes > 0);
assert((bytes % sizeof(F32))== 0);
-
+ ll_assert_aligned(src,16);
+ ll_assert_aligned(dst,16);
+ assert(bytes%16==0);
+
F32* end = dst + (bytes / sizeof(F32) );
if (bytes > 64)
@@ -189,6 +193,8 @@ void LLVector4a::quantize16( const LLVector4a& low, const LLVector4a& high )
LLVector4a oneOverDelta;
{
static LL_ALIGN_16( const F32 F_TWO_4A[4] ) = { 2.f, 2.f, 2.f, 2.f };
+ ll_assert_aligned(F_TWO_4A,16);
+
LLVector4a two; two.load4a( F_TWO_4A );
// Here we use _mm_rcp_ps plus one round of newton-raphson
diff --git a/indra/llmath/llvector4a.h b/indra/llmath/llvector4a.h
index 596082509d..0526793d3a 100644
--- a/indra/llmath/llvector4a.h
+++ b/indra/llmath/llvector4a.h
@@ -32,6 +32,7 @@ class LLRotation;
#include <assert.h>
#include "llpreprocessor.h"
+#include "llmemory.h"
///////////////////////////////////
// FIRST TIME USERS PLEASE READ
@@ -46,6 +47,7 @@ class LLRotation;
// LLVector3/LLVector4.
/////////////////////////////////
+LL_ALIGN_PREFIX(16)
class LLVector4a
{
public:
@@ -82,6 +84,7 @@ public:
}
// Copy words 16-byte blocks from src to dst. Source and destination must not overlap.
+ // Source and dest must be 16-byte aligned and size must be multiple of 16.
static void memcpyNonAliased16(F32* __restrict dst, const F32* __restrict src, size_t bytes);
////////////////////////////////////
@@ -90,6 +93,7 @@ public:
LLVector4a()
{ //DO NOT INITIALIZE -- The overhead is completely unnecessary
+ ll_assert_aligned(this,16);
}
LLVector4a(F32 x, F32 y, F32 z, F32 w = 0.f)
@@ -313,7 +317,7 @@ public:
private:
LLQuad mQ;
-};
+} LL_ALIGN_POSTFIX(16);
inline void update_min_max(LLVector4a& min, LLVector4a& max, const LLVector4a& p)
{
diff --git a/indra/llmath/llvector4a.inl b/indra/llmath/llvector4a.inl
index 7ad22a5631..7c52ffef21 100644
--- a/indra/llmath/llvector4a.inl
+++ b/indra/llmath/llvector4a.inl
@@ -475,6 +475,7 @@ inline void LLVector4a::setLerp(const LLVector4a& lhs, const LLVector4a& rhs, F3
inline LLBool32 LLVector4a::isFinite3() const
{
static LL_ALIGN_16(const U32 nanOrInfMask[4]) = { 0x7f800000, 0x7f800000, 0x7f800000, 0x7f800000 };
+ ll_assert_aligned(nanOrInfMask,16);
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 ));
diff --git a/indra/llmath/llvector4logical.h b/indra/llmath/llvector4logical.h
index dd66b09d43..c5698f7cea 100644
--- a/indra/llmath/llvector4logical.h
+++ b/indra/llmath/llvector4logical.h
@@ -27,6 +27,7 @@
#ifndef LL_VECTOR4LOGICAL_H
#define LL_VECTOR4LOGICAL_H
+#include "llmemory.h"
////////////////////////////
// LLVector4Logical
@@ -77,6 +78,7 @@ public:
inline LLVector4Logical& invert()
{
static const LL_ALIGN_16(U32 allOnes[4]) = { 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF };
+ ll_assert_aligned(allOnes,16);
mQ = _mm_andnot_ps( mQ, *(LLQuad*)(allOnes) );
return *this;
}
diff --git a/indra/llmath/llvolume.cpp b/indra/llmath/llvolume.cpp
index cc9744756f..53d56e96da 100644
--- a/indra/llmath/llvolume.cpp
+++ b/indra/llmath/llvolume.cpp
@@ -95,17 +95,6 @@ const S32 SCULPT_MIN_AREA_DETAIL = 1;
extern BOOL gDebugGL;
-void assert_aligned(void* ptr, uintptr_t alignment)
-{
-#if 0
- uintptr_t t = (uintptr_t) ptr;
- if (t%alignment != 0)
- {
- llerrs << "Alignment check failed." << llendl;
- }
-#endif
-}
-
BOOL check_same_clock_dir( const LLVector3& pt1, const LLVector3& pt2, const LLVector3& pt3, const LLVector3& norm)
{
LLVector3 test = (pt2-pt1)%(pt3-pt2);
@@ -328,16 +317,16 @@ public:
LLVector4a& min = node->mExtents[0];
LLVector4a& max = node->mExtents[1];
- if (!branch->getData().empty())
+ if (!branch->isEmpty())
{ //node has data, find AABB that binds data set
- const LLVolumeTriangle* tri = *(branch->getData().begin());
+ const LLVolumeTriangle* tri = *(branch->getDataBegin());
//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)
+ branch->getDataBegin(); iter != branch->getDataEnd(); ++iter)
{ //for each triangle in node
//stretch by triangles in node
@@ -352,7 +341,7 @@ public:
max.setMax(max, *tri->mV[2]);
}
}
- else if (!branch->getChildren().empty())
+ else if (!branch->isLeaf())
{ //no data, but child nodes exist
LLVolumeOctreeListener* child = (LLVolumeOctreeListener*) branch->getChild(0)->getListener(0);
@@ -6962,14 +6951,14 @@ void LLVolumeFace::resizeVertices(S32 num_verts)
if (num_verts)
{
mPositions = (LLVector4a*) ll_aligned_malloc_16(sizeof(LLVector4a)*num_verts);
- assert_aligned(mPositions, 16);
+ ll_assert_aligned(mPositions, 16);
mNormals = (LLVector4a*) ll_aligned_malloc_16(sizeof(LLVector4a)*num_verts);
- assert_aligned(mNormals, 16);
+ ll_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);
+ ll_assert_aligned(mTexCoords, 16);
}
else
{
@@ -6993,14 +6982,17 @@ void LLVolumeFace::pushVertex(const LLVector4a& pos, const LLVector4a& norm, con
// S32 old_size = mNumVertices*16;
//positions
- mPositions = (LLVector4a*) realloc(mPositions, new_size);
+ mPositions = (LLVector4a*) ll_aligned_realloc_16(mPositions, new_size);
+ ll_assert_aligned(mPositions,16);
//normals
- mNormals = (LLVector4a*) realloc(mNormals, new_size);
-
+ mNormals = (LLVector4a*) ll_aligned_realloc_16(mNormals, new_size);
+ ll_assert_aligned(mNormals,16);
+
//tex coords
new_size = ((new_verts*8)+0xF) & ~0xF;
- mTexCoords = (LLVector2*) realloc(mTexCoords, new_size);
+ mTexCoords = (LLVector2*) ll_aligned_realloc_16(mTexCoords, new_size);
+ ll_assert_aligned(mTexCoords,16);
//just clear binormals
@@ -7053,7 +7045,8 @@ void LLVolumeFace::pushIndex(const U16& idx)
S32 old_size = ((mNumIndices*2)+0xF) & ~0xF;
if (new_size != old_size)
{
- mIndices = (U16*) realloc(mIndices, new_size);
+ mIndices = (U16*) ll_aligned_realloc_16(mIndices, new_size);
+ ll_assert_aligned(mIndices,16);
}
mIndices[mNumIndices++] = idx;
@@ -7094,12 +7087,12 @@ void LLVolumeFace::appendFace(const LLVolumeFace& face, LLMatrix4& mat_in, LLMat
}
//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);
+ mPositions = (LLVector4a*) ll_aligned_realloc_16(mPositions, new_count*sizeof(LLVector4a));
+ ll_assert_aligned(mPositions, 16);
+ mNormals = (LLVector4a*) ll_aligned_realloc_16(mNormals, new_count*sizeof(LLVector4a));
+ ll_assert_aligned(mNormals, 16);
+ mTexCoords = (LLVector2*) ll_aligned_realloc_16(mTexCoords, (new_count*sizeof(LLVector2)+0xF) & ~0xF);
+ ll_assert_aligned(mTexCoords, 16);
mNumVertices = new_count;
@@ -7145,7 +7138,7 @@ void LLVolumeFace::appendFace(const LLVolumeFace& face, LLMatrix4& mat_in, LLMat
new_count = mNumIndices + face.mNumIndices;
//allocate new index buffer
- mIndices = (U16*) realloc(mIndices, (new_count*sizeof(U16)+0xF) & ~0xF);
+ mIndices = (U16*) ll_aligned_realloc_16(mIndices, (new_count*sizeof(U16)+0xF) & ~0xF);
//get destination address into new index buffer
U16* dst_idx = mIndices+mNumIndices;
diff --git a/indra/llmath/llvolume.h b/indra/llmath/llvolume.h
index 76cf9de613..2e6f9e2f71 100644
--- a/indra/llmath/llvolume.h
+++ b/indra/llmath/llvolume.h
@@ -54,6 +54,7 @@ class LLVolumeTriangle;
#include "llstrider.h"
#include "v4coloru.h"
#include "llrefcount.h"
+#include "llpointer.h"
#include "llfile.h"
//============================================================================
@@ -919,6 +920,10 @@ public:
LLVector2* mTexCoords;
U16* mIndices;
+ //vertex buffer filled in by LLFace to cache this volume face geometry in vram
+ // (declared as a LLPointer to LLRefCount to avoid dependency on LLVertexBuffer)
+ mutable LLPointer<LLRefCount> mVertexBuffer;
+
std::vector<S32> mEdge;
//list of skin weights for rigged volumes
diff --git a/indra/llmath/llvolumeoctree.cpp b/indra/llmath/llvolumeoctree.cpp
index b5a935c2b5..cc83cb7235 100644
--- a/indra/llmath/llvolumeoctree.cpp
+++ b/indra/llmath/llvolumeoctree.cpp
@@ -131,7 +131,7 @@ void LLOctreeTriangleRayIntersect::traverse(const LLOctreeNode<LLVolumeTriangle>
void LLOctreeTriangleRayIntersect::visit(const LLOctreeNode<LLVolumeTriangle>* node)
{
for (LLOctreeNode<LLVolumeTriangle>::const_element_iter iter =
- node->getData().begin(); iter != node->getData().end(); ++iter)
+ node->getDataBegin(); iter != node->getDataEnd(); ++iter)
{
const LLVolumeTriangle* tri = *iter;
@@ -236,8 +236,8 @@ void LLVolumeOctreeValidate::visit(const LLOctreeNode<LLVolumeTriangle>* branch)
}
//children fit, check data
- for (LLOctreeNode<LLVolumeTriangle>::const_element_iter iter = branch->getData().begin();
- iter != branch->getData().end(); ++iter)
+ for (LLOctreeNode<LLVolumeTriangle>::const_element_iter iter = branch->getDataBegin();
+ iter != branch->getDataEnd(); ++iter)
{
const LLVolumeTriangle* tri = *iter;
diff --git a/indra/llmath/llvolumeoctree.h b/indra/llmath/llvolumeoctree.h
index 688d91dc40..9ae34a0c4e 100644
--- a/indra/llmath/llvolumeoctree.h
+++ b/indra/llmath/llvolumeoctree.h
@@ -37,9 +37,19 @@
class LLVolumeTriangle : public LLRefCount
{
public:
+ void* operator new(size_t size)
+ {
+ return ll_aligned_malloc_16(size);
+ }
+
+ void operator delete(void* ptr)
+ {
+ ll_aligned_free_16(ptr);
+ }
+
LLVolumeTriangle()
{
-
+ mBinIndex = -1;
}
LLVolumeTriangle(const LLVolumeTriangle& rhs)
@@ -58,21 +68,38 @@ public:
}
- LLVector4a mPositionGroup;
+ LL_ALIGN_16(LLVector4a mPositionGroup);
const LLVector4a* mV[3];
U16 mIndex[3];
F32 mRadius;
+ mutable S32 mBinIndex;
+
virtual const LLVector4a& getPositionGroup() const;
virtual const F32& getBinRadius() const;
+
+ S32 getBinIndex() const { return mBinIndex; }
+ void setBinIndex(S32 idx) const { mBinIndex = idx; }
+
+
};
class LLVolumeOctreeListener : public LLOctreeListener<LLVolumeTriangle>
{
public:
+ void* operator new(size_t size)
+ {
+ return ll_aligned_malloc_16(size);
+ }
+
+ void operator delete(void* ptr)
+ {
+ ll_aligned_free_16(ptr);
+ }
+
LLVolumeOctreeListener(LLOctreeNode<LLVolumeTriangle>* node);
~LLVolumeOctreeListener();
@@ -99,8 +126,8 @@ public:
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
+ LL_ALIGN_16(LLVector4a mBounds[2]); // bounding box (center, size) of this node and all its children (tight fit to objects)
+ LL_ALIGN_16(LLVector4a mExtents[2]); // extents (min, max) of this node and all its children
};
class LLOctreeTriangleRayIntersect : public LLOctreeTraveler<LLVolumeTriangle>
diff --git a/indra/llmath/tests/alignment_test.cpp b/indra/llmath/tests/alignment_test.cpp
new file mode 100644
index 0000000000..ac0c45ae6f
--- /dev/null
+++ b/indra/llmath/tests/alignment_test.cpp
@@ -0,0 +1,128 @@
+/**
+ * @file v3dmath_test.cpp
+ * @author Vir
+ * @date 2011-12
+ * @brief v3dmath test cases.
+ *
+ * $LicenseInfo:firstyear=2011&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2011, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+// Tests related to allocating objects with alignment constraints, particularly for SSE support.
+
+#include "linden_common.h"
+#include "../test/lltut.h"
+#include "../llmath.h"
+#include "../llsimdmath.h"
+#include "../llvector4a.h"
+
+void* operator new(size_t size)
+{
+ return ll_aligned_malloc_16(size);
+}
+
+void operator delete(void *p)
+{
+ ll_aligned_free_16(p);
+}
+
+namespace tut
+{
+
+#define is_aligned(ptr,alignment) ((reinterpret_cast<uintptr_t>(ptr))%(alignment)==0)
+#define is_aligned_relative(ptr,base_ptr,alignment) ((reinterpret_cast<uintptr_t>(ptr)-reinterpret_cast<uintptr_t>(base_ptr))%(alignment)==0)
+
+struct alignment_test {};
+
+typedef test_group<alignment_test> alignment_test_t;
+typedef alignment_test_t::object alignment_test_object_t;
+tut::alignment_test_t tut_alignment_test("LLAlignment");
+
+LL_ALIGN_PREFIX(16)
+class MyVector4a
+{
+ LLQuad mQ;
+} LL_ALIGN_POSTFIX(16);
+
+
+// Verify that aligned allocators perform as advertised.
+template<> template<>
+void alignment_test_object_t::test<1>()
+{
+# ifdef LL_DEBUG
+ skip("This test fails on Windows when compiled in debug mode.");
+# endif
+
+ const int num_tests = 7;
+ void *align_ptr;
+ for (int i=0; i<num_tests; i++)
+ {
+ align_ptr = ll_aligned_malloc_16(sizeof(MyVector4a));
+ ensure("ll_aligned_malloc_16 failed", is_aligned(align_ptr,16));
+
+ align_ptr = ll_aligned_realloc_16(align_ptr,2*sizeof(MyVector4a));
+ ensure("ll_aligned_realloc_16 failed", is_aligned(align_ptr,16));
+
+ ll_aligned_free_16(align_ptr);
+
+ align_ptr = ll_aligned_malloc_32(sizeof(MyVector4a));
+ ensure("ll_aligned_malloc_32 failed", is_aligned(align_ptr,32));
+ ll_aligned_free_32(align_ptr);
+ }
+}
+
+// In-place allocation of objects and arrays.
+template<> template<>
+void alignment_test_object_t::test<2>()
+{
+ MyVector4a vec1;
+ ensure("LLAlignment vec1 unaligned", is_aligned(&vec1,16));
+
+ MyVector4a veca[12];
+ ensure("LLAlignment veca unaligned", is_aligned(veca,16));
+}
+
+// Heap allocation of objects and arrays.
+template<> template<>
+void alignment_test_object_t::test<3>()
+{
+# ifdef LL_DEBUG
+ skip("This test fails on Windows when compiled in debug mode.");
+# endif
+
+ const int ARR_SIZE = 7;
+ for(int i=0; i<ARR_SIZE; i++)
+ {
+ MyVector4a *vecp = new MyVector4a;
+ ensure("LLAlignment vecp unaligned", is_aligned(vecp,16));
+ delete vecp;
+ }
+
+ MyVector4a *veca = new MyVector4a[ARR_SIZE];
+ ensure("LLAligment veca base", is_aligned(veca,16));
+ for(int i=0; i<ARR_SIZE; i++)
+ {
+ std::cout << "veca[" << i << "]" << std::endl;
+ ensure("LLAlignment veca member unaligned", is_aligned(&veca[i],16));
+ }
+}
+
+}
diff --git a/indra/llmessage/llavatarnamecache.cpp b/indra/llmessage/llavatarnamecache.cpp
index 97f2792686..fbc3cc6de2 100644
--- a/indra/llmessage/llavatarnamecache.cpp
+++ b/indra/llmessage/llavatarnamecache.cpp
@@ -87,6 +87,9 @@ namespace LLAvatarNameCache
/// Time when unrefreshed cached names were checked last
static F64 sLastExpireCheck;
+ /// Time-to-live for a temp cache entry.
+ const F64 TEMP_CACHE_ENTRY_LIFETIME = 60.0;
+
//-----------------------------------------------------------------------
// Internal methods
//-----------------------------------------------------------------------
@@ -274,7 +277,7 @@ void LLAvatarNameCache::handleAgentError(const LLUUID& agent_id)
{
// there is no existing cache entry, so make a temporary name from legacy
LL_WARNS("AvNameCache") << "LLAvatarNameCache get legacy for agent "
- << agent_id << LL_ENDL;
+ << agent_id << LL_ENDL;
gCacheName->get(agent_id, false, // legacy compatibility
boost::bind(&LLAvatarNameCache::legacyNameCallback,
_1, _2, _3));
@@ -287,13 +290,14 @@ void LLAvatarNameCache::handleAgentError(const LLUUID& agent_id)
// Clear this agent from the pending list
LLAvatarNameCache::sPendingQueue.erase(agent_id);
- const LLAvatarName& av_name = existing->second;
+ LLAvatarName& av_name = existing->second;
LL_DEBUGS("AvNameCache") << "LLAvatarNameCache use cache for agent "
<< agent_id
<< "user '" << av_name.mUsername << "' "
<< "display '" << av_name.mDisplayName << "' "
<< "expires in " << av_name.mExpires - LLFrameTimer::getTotalSeconds() << " seconds"
<< LL_ENDL;
+ av_name.mExpires = LLFrameTimer::getTotalSeconds() + TEMP_CACHE_ENTRY_LIFETIME; // reset expiry time so we don't constantly rerequest.
}
}
@@ -402,10 +406,12 @@ void LLAvatarNameCache::legacyNameCallback(const LLUUID& agent_id,
<< LL_ENDL;
buildLegacyName(full_name, &av_name);
- // Don't add to cache, the data already exists in the legacy name system
- // cache and we don't want or need duplicate storage, because keeping the
- // two copies in sync is complex.
- processName(agent_id, av_name, false);
+ // Add to cache, because if we don't we'll keep rerequesting the
+ // same record forever. buildLegacyName should always guarantee
+ // that these records expire reasonably soon
+ // (in TEMP_CACHE_ENTRY_LIFETIME seconds), so if the failure was due
+ // to something temporary we will eventually request and get the right data.
+ processName(agent_id, av_name, true);
}
void LLAvatarNameCache::requestNamesViaLegacy()
@@ -583,7 +589,7 @@ void LLAvatarNameCache::buildLegacyName(const std::string& full_name,
av_name->mDisplayName = full_name;
av_name->mIsDisplayNameDefault = true;
av_name->mIsTemporaryName = true;
- av_name->mExpires = F64_MAX; // not used because these are not cached
+ av_name->mExpires = LLFrameTimer::getTotalSeconds() + TEMP_CACHE_ENTRY_LIFETIME;
LL_DEBUGS("AvNameCache") << "LLAvatarNameCache::buildLegacyName "
<< full_name
<< LL_ENDL;
diff --git a/indra/llmessage/llcurl.cpp b/indra/llmessage/llcurl.cpp
index 5ea9b58300..b4ac984d57 100644
--- a/indra/llmessage/llcurl.cpp
+++ b/indra/llmessage/llcurl.cpp
@@ -935,8 +935,8 @@ bool LLCurlThread::CurlRequest::processRequest()
if(!completed)
{
- setPriority(LLQueuedThread::PRIORITY_LOW) ;
- }
+ setPriority(LLQueuedThread::PRIORITY_LOW) ;
+ }
}
return completed ;
@@ -946,7 +946,7 @@ void LLCurlThread::CurlRequest::finishRequest(bool completed)
{
if(mMulti->isDead())
{
- mCurlThread->deleteMulti(mMulti) ;
+ mCurlThread->deleteMulti(mMulti) ;
}
else
{
@@ -990,6 +990,7 @@ void LLCurlThread::killMulti(LLCurl::Multi* multi)
return ;
}
+
multi->markDead() ;
}
@@ -1095,7 +1096,9 @@ void LLCurlRequest::get(const std::string& url, LLCurl::ResponderPtr responder)
{
getByteRange(url, headers_t(), 0, -1, responder);
}
-
+
+// Note: (length==0) is interpreted as "the rest of the file", i.e. the whole file if (offset==0) or
+// the remainder of the file if not.
bool LLCurlRequest::getByteRange(const std::string& url,
const headers_t& headers,
S32 offset, S32 length,
@@ -1113,6 +1116,11 @@ bool LLCurlRequest::getByteRange(const std::string& url,
std::string range = llformat("Range: bytes=%d-%d", offset,offset+length-1);
easy->slist_append(range.c_str());
}
+ else if (offset > 0)
+ {
+ std::string range = llformat("Range: bytes=%d-", offset);
+ easy->slist_append(range.c_str());
+ }
easy->setHeaders();
bool res = addEasy(easy);
return res;
@@ -1238,6 +1246,208 @@ S32 LLCurlRequest::getQueued()
return queued;
}
+LLCurlTextureRequest::LLCurlTextureRequest(S32 concurrency) :
+ LLCurlRequest(),
+ mConcurrency(concurrency),
+ mInQueue(0),
+ mMutex(NULL),
+ mHandleCounter(1),
+ mTotalIssuedRequests(0),
+ mTotalReceivedBits(0)
+{
+ mGlobalTimer.reset();
+}
+
+LLCurlTextureRequest::~LLCurlTextureRequest()
+{
+ mRequestMap.clear();
+
+ for(req_queue_t::iterator iter = mCachedRequests.begin(); iter != mCachedRequests.end(); ++iter)
+ {
+ delete *iter;
+ }
+ mCachedRequests.clear();
+}
+
+//return 0: success
+// > 0: cached handle
+U32 LLCurlTextureRequest::getByteRange(const std::string& url,
+ const headers_t& headers,
+ S32 offset, S32 length, U32 pri,
+ LLCurl::ResponderPtr responder, F32 delay_time)
+{
+ U32 ret_val = 0;
+ bool success = false;
+
+ if(mInQueue < mConcurrency && delay_time < 0.f)
+ {
+ success = LLCurlRequest::getByteRange(url, headers, offset, length, responder);
+ }
+
+ LLMutexLock lock(&mMutex);
+
+ if(success)
+ {
+ mInQueue++;
+ mTotalIssuedRequests++;
+ }
+ else
+ {
+ request_t* request = new request_t(mHandleCounter, url, headers, offset, length, pri, responder);
+ if(delay_time > 0.f)
+ {
+ request->mStartTime = mGlobalTimer.getElapsedTimeF32() + delay_time;
+ }
+
+ mCachedRequests.insert(request);
+ mRequestMap[mHandleCounter] = request;
+ ret_val = mHandleCounter;
+ mHandleCounter++;
+
+ if(!mHandleCounter)
+ {
+ mHandleCounter = 1;
+ }
+ }
+
+ return ret_val;
+}
+
+void LLCurlTextureRequest::completeRequest(S32 received_bytes)
+{
+ LLMutexLock lock(&mMutex);
+
+ llassert_always(mInQueue > 0);
+
+ mInQueue--;
+ mTotalReceivedBits += received_bytes * 8;
+}
+
+void LLCurlTextureRequest::nextRequests()
+{
+ if(mCachedRequests.empty() || mInQueue >= mConcurrency)
+ {
+ return;
+ }
+
+ F32 cur_time = mGlobalTimer.getElapsedTimeF32();
+
+ req_queue_t::iterator iter;
+ {
+ LLMutexLock lock(&mMutex);
+ iter = mCachedRequests.begin();
+ }
+ while(1)
+ {
+ request_t* request = *iter;
+ if(request->mStartTime < cur_time)
+ {
+ if(!LLCurlRequest::getByteRange(request->mUrl, request->mHeaders, request->mOffset, request->mLength, request->mResponder))
+ {
+ break;
+ }
+
+ LLMutexLock lock(&mMutex);
+ ++iter;
+ mInQueue++;
+ mTotalIssuedRequests++;
+ mCachedRequests.erase(request);
+ mRequestMap.erase(request->mHandle);
+ delete request;
+
+ if(iter == mCachedRequests.end() || mInQueue >= mConcurrency)
+ {
+ break;
+ }
+ }
+ else
+ {
+ LLMutexLock lock(&mMutex);
+ ++iter;
+ if(iter == mCachedRequests.end() || mInQueue >= mConcurrency)
+ {
+ break;
+ }
+ }
+ }
+
+ return;
+}
+
+void LLCurlTextureRequest::updatePriority(U32 handle, U32 pri)
+{
+ if(!handle)
+ {
+ return;
+ }
+
+ LLMutexLock lock(&mMutex);
+
+ std::map<S32, request_t*>::iterator iter = mRequestMap.find(handle);
+ if(iter != mRequestMap.end())
+ {
+ request_t* req = iter->second;
+
+ if(req->mPriority != pri)
+ {
+ mCachedRequests.erase(req);
+ req->mPriority = pri;
+ mCachedRequests.insert(req);
+ }
+ }
+}
+
+void LLCurlTextureRequest::removeRequest(U32 handle)
+{
+ if(!handle)
+ {
+ return;
+ }
+
+ LLMutexLock lock(&mMutex);
+
+ std::map<S32, request_t*>::iterator iter = mRequestMap.find(handle);
+ if(iter != mRequestMap.end())
+ {
+ request_t* req = iter->second;
+ mRequestMap.erase(iter);
+ mCachedRequests.erase(req);
+ delete req;
+ }
+}
+
+bool LLCurlTextureRequest::isWaiting(U32 handle)
+{
+ if(!handle)
+ {
+ return false;
+ }
+
+ LLMutexLock lock(&mMutex);
+ return mRequestMap.find(handle) != mRequestMap.end();
+}
+
+U32 LLCurlTextureRequest::getTotalReceivedBits()
+{
+ LLMutexLock lock(&mMutex);
+
+ U32 bits = mTotalReceivedBits;
+ mTotalReceivedBits = 0;
+ return bits;
+}
+
+U32 LLCurlTextureRequest::getTotalIssuedRequests()
+{
+ LLMutexLock lock(&mMutex);
+ return mTotalIssuedRequests;
+}
+
+S32 LLCurlTextureRequest::getNumRequests()
+{
+ LLMutexLock lock(&mMutex);
+ return mInQueue;
+}
+
////////////////////////////////////////////////////////////////////////////
// For generating one easy request
// associated with a single multi request
diff --git a/indra/llmessage/llcurl.h b/indra/llmessage/llcurl.h
index d6a7714d4c..20ebd86c06 100644
--- a/indra/llmessage/llcurl.h
+++ b/indra/llmessage/llcurl.h
@@ -414,6 +414,71 @@ private:
BOOL mProcessing;
};
+//for texture fetch only
+class LLCurlTextureRequest : public LLCurlRequest
+{
+public:
+ LLCurlTextureRequest(S32 concurrency);
+ ~LLCurlTextureRequest();
+
+ U32 getByteRange(const std::string& url, const headers_t& headers, S32 offset, S32 length, U32 pri, LLCurl::ResponderPtr responder, F32 delay_time = -1.f);
+ void nextRequests();
+ void completeRequest(S32 received_bytes);
+
+ void updatePriority(U32 handle, U32 pri);
+ void removeRequest(U32 handle);
+
+ U32 getTotalReceivedBits();
+ U32 getTotalIssuedRequests();
+ S32 getNumRequests();
+ bool isWaiting(U32 handle);
+
+private:
+ LLMutex mMutex;
+ S32 mConcurrency;
+ S32 mInQueue; //request currently in queue.
+ U32 mHandleCounter;
+ U32 mTotalIssuedRequests;
+ U32 mTotalReceivedBits;
+
+ typedef struct _request_t
+ {
+ _request_t(U32 handle, const std::string& url, const headers_t& headers, S32 offset, S32 length, U32 pri, LLCurl::ResponderPtr responder) :
+ mHandle(handle), mUrl(url), mHeaders(headers), mOffset(offset), mLength(length), mPriority(pri), mResponder(responder), mStartTime(0.f)
+ {}
+
+ U32 mHandle;
+ std::string mUrl;
+ LLCurlRequest::headers_t mHeaders;
+ S32 mOffset;
+ S32 mLength;
+ LLCurl::ResponderPtr mResponder;
+ U32 mPriority;
+ F32 mStartTime; //start time to issue this request
+ } request_t;
+
+ struct request_compare
+ {
+ bool operator()(const request_t* lhs, const request_t* rhs) const
+ {
+ if(lhs->mPriority != rhs->mPriority)
+ {
+ return lhs->mPriority > rhs->mPriority; // higher priority in front of queue (set)
+ }
+ else
+ {
+ return (U32)lhs < (U32)rhs;
+ }
+ }
+ };
+
+ typedef std::set<request_t*, request_compare> req_queue_t;
+ req_queue_t mCachedRequests;
+ std::map<S32, request_t*> mRequestMap;
+
+ LLFrameTimer mGlobalTimer;
+};
+
class LLCurlEasyRequest
{
public:
diff --git a/indra/llmessage/llsdmessagereader.cpp b/indra/llmessage/llsdmessagereader.cpp
index 3d8ca2ad9f..a6fccd2a56 100644
--- a/indra/llmessage/llsdmessagereader.cpp
+++ b/indra/llmessage/llsdmessagereader.cpp
@@ -276,7 +276,7 @@ S32 getElementSize(const LLSD& llsd)
case LLSD::TypeReal:
return sizeof(F64);
case LLSD::TypeString:
- return llsd.asString().size();
+ return llsd.size();
case LLSD::TypeUUID:
return sizeof(LLUUID);
case LLSD::TypeDate:
diff --git a/indra/llmessage/llurlrequest.cpp b/indra/llmessage/llurlrequest.cpp
index a16f5c7bf0..f3f0007205 100644
--- a/indra/llmessage/llurlrequest.cpp
+++ b/indra/llmessage/llurlrequest.cpp
@@ -289,6 +289,8 @@ LLIOPipe::EStatus LLURLRequest::handleError(
}
static LLFastTimer::DeclareTimer FTM_PROCESS_URL_REQUEST("URL Request");
+static LLFastTimer::DeclareTimer FTM_PROCESS_URL_REQUEST_GET_RESULT("Get Result");
+static LLFastTimer::DeclareTimer FTM_URL_PERFORM("Perform");
// virtual
LLIOPipe::EStatus LLURLRequest::process_impl(
@@ -358,7 +360,6 @@ LLIOPipe::EStatus LLURLRequest::process_impl(
{
PUMP_DEBUG;
LLIOPipe::EStatus status = STATUS_BREAK;
- static LLFastTimer::DeclareTimer FTM_URL_PERFORM("Perform");
{
LLFastTimer t(FTM_URL_PERFORM);
if(!mDetail->mCurlRequest->wait())
@@ -371,8 +372,6 @@ LLIOPipe::EStatus LLURLRequest::process_impl(
{
CURLcode result;
- static LLFastTimer::DeclareTimer FTM_PROCESS_URL_REQUEST_GET_RESULT("Get Result");
-
bool newmsg = false;
{
LLFastTimer t(FTM_PROCESS_URL_REQUEST_GET_RESULT);
diff --git a/indra/llmessage/message_prehash.cpp b/indra/llmessage/message_prehash.cpp
index e71fb96540..d7658862da 100644
--- a/indra/llmessage/message_prehash.cpp
+++ b/indra/llmessage/message_prehash.cpp
@@ -943,7 +943,6 @@ char const* const _PREHASH_SysGPU = LLMessageStringTable::getInstance()->getStri
char const* const _PREHASH_AvatarInterestsReply = LLMessageStringTable::getInstance()->getString("AvatarInterestsReply");
char const* const _PREHASH_StartLure = LLMessageStringTable::getInstance()->getString("StartLure");
char const* const _PREHASH_SysRAM = LLMessageStringTable::getInstance()->getString("SysRAM");
-char const* const _PREHASH_ObjectPosition = LLMessageStringTable::getInstance()->getString("ObjectPosition");
char const* const _PREHASH_SitPosition = LLMessageStringTable::getInstance()->getString("SitPosition");
char const* const _PREHASH_StartTime = LLMessageStringTable::getInstance()->getString("StartTime");
char const* const _PREHASH_BornOn = LLMessageStringTable::getInstance()->getString("BornOn");
@@ -999,7 +998,6 @@ char const* const _PREHASH_SnapshotID = LLMessageStringTable::getInstance()->get
char const* const _PREHASH_Aspect = LLMessageStringTable::getInstance()->getString("Aspect");
char const* const _PREHASH_ParamSize = LLMessageStringTable::getInstance()->getString("ParamSize");
char const* const _PREHASH_VoteCast = LLMessageStringTable::getInstance()->getString("VoteCast");
-char const* const _PREHASH_CastsShadows = LLMessageStringTable::getInstance()->getString("CastsShadows");
char const* const _PREHASH_EveryoneMask = LLMessageStringTable::getInstance()->getString("EveryoneMask");
char const* const _PREHASH_ObjectSpinUpdate = LLMessageStringTable::getInstance()->getString("ObjectSpinUpdate");
char const* const _PREHASH_MaturePublish = LLMessageStringTable::getInstance()->getString("MaturePublish");
@@ -1048,7 +1046,6 @@ char const* const _PREHASH_SimIP = LLMessageStringTable::getInstance()->getStrin
char const* const _PREHASH_GodID = LLMessageStringTable::getInstance()->getString("GodID");
char const* const _PREHASH_TeleportMinPrice = LLMessageStringTable::getInstance()->getString("TeleportMinPrice");
char const* const _PREHASH_VoteItem = LLMessageStringTable::getInstance()->getString("VoteItem");
-char const* const _PREHASH_ObjectRotation = LLMessageStringTable::getInstance()->getString("ObjectRotation");
char const* const _PREHASH_SitRotation = LLMessageStringTable::getInstance()->getString("SitRotation");
char const* const _PREHASH_SnapSelection = LLMessageStringTable::getInstance()->getString("SnapSelection");
char const* const _PREHASH_SoundTrigger = LLMessageStringTable::getInstance()->getString("SoundTrigger");
diff --git a/indra/llmessage/message_prehash.h b/indra/llmessage/message_prehash.h
index dd2c2dbd64..da2b613f53 100644
--- a/indra/llmessage/message_prehash.h
+++ b/indra/llmessage/message_prehash.h
@@ -943,7 +943,6 @@ extern char const* const _PREHASH_SysGPU;
extern char const* const _PREHASH_AvatarInterestsReply;
extern char const* const _PREHASH_StartLure;
extern char const* const _PREHASH_SysRAM;
-extern char const* const _PREHASH_ObjectPosition;
extern char const* const _PREHASH_SitPosition;
extern char const* const _PREHASH_StartTime;
extern char const* const _PREHASH_BornOn;
@@ -999,7 +998,6 @@ extern char const* const _PREHASH_SnapshotID;
extern char const* const _PREHASH_Aspect;
extern char const* const _PREHASH_ParamSize;
extern char const* const _PREHASH_VoteCast;
-extern char const* const _PREHASH_CastsShadows;
extern char const* const _PREHASH_EveryoneMask;
extern char const* const _PREHASH_ObjectSpinUpdate;
extern char const* const _PREHASH_MaturePublish;
@@ -1048,7 +1046,6 @@ extern char const* const _PREHASH_SimIP;
extern char const* const _PREHASH_GodID;
extern char const* const _PREHASH_TeleportMinPrice;
extern char const* const _PREHASH_VoteItem;
-extern char const* const _PREHASH_ObjectRotation;
extern char const* const _PREHASH_SitRotation;
extern char const* const _PREHASH_SnapSelection;
extern char const* const _PREHASH_SoundTrigger;
diff --git a/indra/llmessage/tests/llhttpclient_test.cpp b/indra/llmessage/tests/llhttpclient_test.cpp
index 843c3bcc4b..e338d4ec71 100644
--- a/indra/llmessage/tests/llhttpclient_test.cpp
+++ b/indra/llmessage/tests/llhttpclient_test.cpp
@@ -258,6 +258,7 @@ namespace tut
void HTTPClientTestObject::test<1>()
{
LLHTTPClient::get(local_server, newResult());
+
runThePump();
ensureStatusOK();
ensure("result object wasn't destroyed", mResultDeleted);
diff --git a/indra/llprimitive/CMakeLists.txt b/indra/llprimitive/CMakeLists.txt
index 7d0e313ff3..e4d9de7eb6 100644
--- a/indra/llprimitive/CMakeLists.txt
+++ b/indra/llprimitive/CMakeLists.txt
@@ -7,12 +7,14 @@ include(LLCommon)
include(LLMath)
include(LLMessage)
include(LLXML)
+include(LLPhysicsExtensions)
include_directories(
${LLCOMMON_INCLUDE_DIRS}
${LLMATH_INCLUDE_DIRS}
${LLMESSAGE_INCLUDE_DIRS}
${LLXML_INCLUDE_DIRS}
+ ${LLPHYSICSEXTENSIONS_INCLUDE_DIRS}
${LIBS_PREBUILT_DIR}/include/collada
${LIBS_PREBUILT_DIR}/include/collada/1.4
)
diff --git a/indra/llprimitive/llmodel.cpp b/indra/llprimitive/llmodel.cpp
index cb32a510b8..28ed051c55 100644
--- a/indra/llprimitive/llmodel.cpp
+++ b/indra/llprimitive/llmodel.cpp
@@ -1026,7 +1026,8 @@ void LLModel::setVolumeFaceData(
if (tc.get())
{
- LLVector4a::memcpyNonAliased16((F32*) face.mTexCoords, (F32*) tc.get(), num_verts*2*sizeof(F32));
+ U32 tex_size = (num_verts*2*sizeof(F32)+0xF)&~0xF;
+ LLVector4a::memcpyNonAliased16((F32*) face.mTexCoords, (F32*) tc.get(), tex_size);
}
else
{
diff --git a/indra/llprimitive/llprimitive.cpp b/indra/llprimitive/llprimitive.cpp
index 30532247ac..6dee192783 100644..100755
--- a/indra/llprimitive/llprimitive.cpp
+++ b/indra/llprimitive/llprimitive.cpp
@@ -149,7 +149,8 @@ bool LLPrimitive::cleanupVolumeManager()
LLPrimitive::LLPrimitive()
: mTextureList(),
mNumTEs(0),
- mMiscFlags(0)
+ mMiscFlags(0),
+ mNumBumpmapTEs(0)
{
mPrimitiveCode = 0;
@@ -237,7 +238,10 @@ void LLPrimitive::setAllTETextures(const LLUUID &tex_id)
//===============================================================
void LLPrimitive::setTE(const U8 index, const LLTextureEntry& te)
{
- mTextureList.copyTexture(index, te);
+ if(mTextureList.copyTexture(index, te) != TEM_CHANGE_NONE && te.getBumpmap() > 0)
+ {
+ mNumBumpmapTEs++;
+ }
}
S32 LLPrimitive::setTETexture(const U8 index, const LLUUID &id)
@@ -316,6 +320,7 @@ S32 LLPrimitive::setTERotation(const U8 index, const F32 r)
//===============================================================
S32 LLPrimitive::setTEBumpShinyFullbright(const U8 index, const U8 bump)
{
+ updateNumBumpmap(index, bump);
return mTextureList.setBumpShinyFullbright(index, bump);
}
@@ -326,11 +331,13 @@ S32 LLPrimitive::setTEMediaTexGen(const U8 index, const U8 media)
S32 LLPrimitive::setTEBumpmap(const U8 index, const U8 bump)
{
+ updateNumBumpmap(index, bump);
return mTextureList.setBumpMap(index, bump);
}
S32 LLPrimitive::setTEBumpShiny(const U8 index, const U8 bump_shiny)
{
+ updateNumBumpmap(index, bump_shiny);
return mTextureList.setBumpShiny(index, bump_shiny);
}
@@ -1445,6 +1452,26 @@ void LLPrimitive::takeTextureList(LLPrimTextureList& other_list)
mTextureList.take(other_list);
}
+void LLPrimitive::updateNumBumpmap(const U8 index, const U8 bump)
+{
+ LLTextureEntry* te = getTE(index);
+ if(!te)
+ {
+ return;
+ }
+
+ U8 old_bump = te->getBumpmap();
+ if(old_bump > 0)
+ {
+ mNumBumpmapTEs--;
+ }
+ if((bump & TEM_BUMP_MASK) > 0)
+ {
+ mNumBumpmapTEs++;
+ }
+
+ return;
+}
//============================================================================
// Moved from llselectmgr.cpp
diff --git a/indra/llprimitive/llprimitive.h b/indra/llprimitive/llprimitive.h
index 998016f8f6..8dcaa8c740 100644
--- a/indra/llprimitive/llprimitive.h
+++ b/indra/llprimitive/llprimitive.h
@@ -421,7 +421,8 @@ public:
inline BOOL isAvatar() const;
inline BOOL isSittingAvatar() const;
inline BOOL isSittingAvatarOnGround() const;
-
+ inline bool hasBumpmap() const { return mNumBumpmapTEs > 0;}
+
void setFlags(U32 flags) { mMiscFlags = flags; }
void addFlags(U32 flags) { mMiscFlags |= flags; }
void removeFlags(U32 flags) { mMiscFlags &= ~flags; }
@@ -435,6 +436,9 @@ public:
inline static BOOL isPrimitive(const LLPCode pcode);
inline static BOOL isApp(const LLPCode pcode);
+private:
+ void updateNumBumpmap(const U8 index, const U8 bump);
+
protected:
LLPCode mPrimitiveCode; // Primitive code
LLVector3 mVelocity; // how fast are we moving?
@@ -444,6 +448,7 @@ protected:
LLPrimTextureList mTextureList; // list of texture GUIDs, scales, offsets
U8 mMaterial; // Material code
U8 mNumTEs; // # of faces on the primitve
+ U8 mNumBumpmapTEs; // number of bumpmap TEs.
U32 mMiscFlags; // home for misc bools
public:
diff --git a/indra/llprimitive/object_flags.h b/indra/llprimitive/object_flags.h
index 94c559d757..31dbd15ae0 100644
--- a/indra/llprimitive/object_flags.h
+++ b/indra/llprimitive/object_flags.h
@@ -28,43 +28,47 @@
#define LL_OBJECT_FLAGS_H
// downstream flags from sim->viewer
-const U32 FLAGS_USE_PHYSICS = 0x00000001;
-const U32 FLAGS_CREATE_SELECTED = 0x00000002;
-const U32 FLAGS_OBJECT_MODIFY = 0x00000004;
-const U32 FLAGS_OBJECT_COPY = 0x00000008;
-const U32 FLAGS_OBJECT_ANY_OWNER = 0x00000010;
-const U32 FLAGS_OBJECT_YOU_OWNER = 0x00000020;
-const U32 FLAGS_SCRIPTED = 0x00000040;
-const U32 FLAGS_HANDLE_TOUCH = 0x00000080;
-const U32 FLAGS_OBJECT_MOVE = 0x00000100;
-const U32 FLAGS_TAKES_MONEY = 0x00000200;
-const U32 FLAGS_PHANTOM = 0x00000400;
-const U32 FLAGS_INVENTORY_EMPTY = 0x00000800;
+const U32 FLAGS_USE_PHYSICS = (1U << 0);
+const U32 FLAGS_CREATE_SELECTED = (1U << 1);
+const U32 FLAGS_OBJECT_MODIFY = (1U << 2);
+const U32 FLAGS_OBJECT_COPY = (1U << 3);
+const U32 FLAGS_OBJECT_ANY_OWNER = (1U << 4);
+const U32 FLAGS_OBJECT_YOU_OWNER = (1U << 5);
+const U32 FLAGS_SCRIPTED = (1U << 6);
+const U32 FLAGS_HANDLE_TOUCH = (1U << 7);
+const U32 FLAGS_OBJECT_MOVE = (1U << 8);
+const U32 FLAGS_TAKES_MONEY = (1U << 9);
+const U32 FLAGS_PHANTOM = (1U << 10);
+const U32 FLAGS_INVENTORY_EMPTY = (1U << 11);
-const U32 FLAGS_JOINT_HINGE = 0x00001000;
-const U32 FLAGS_JOINT_P2P = 0x00002000;
-const U32 FLAGS_JOINT_LP2P = 0x00004000;
-// const U32 FLAGS_JOINT_WHEEL = 0x00008000;
-const U32 FLAGS_INCLUDE_IN_SEARCH = 0x00008000;
+const U32 FLAGS_AFFECTS_NAVMESH = (1U << 12);
+const U32 FLAGS_CHARACTER = (1U << 13);
+const U32 FLAGS_VOLUME_DETECT = (1U << 14);
+const U32 FLAGS_INCLUDE_IN_SEARCH = (1U << 15);
-const U32 FLAGS_ALLOW_INVENTORY_DROP = 0x00010000;
-const U32 FLAGS_OBJECT_TRANSFER = 0x00020000;
-const U32 FLAGS_OBJECT_GROUP_OWNED = 0x00040000;
-//const U32 FLAGS_OBJECT_YOU_OFFICER = 0x00080000;
+const U32 FLAGS_ALLOW_INVENTORY_DROP = (1U << 16);
+const U32 FLAGS_OBJECT_TRANSFER = (1U << 17);
+const U32 FLAGS_OBJECT_GROUP_OWNED = (1U << 18);
+//const U32 FLAGS_UNUSED_000 = (1U << 19); // was FLAGS_OBJECT_YOU_OFFICER
-const U32 FLAGS_CAMERA_DECOUPLED = 0x00100000;
-const U32 FLAGS_ANIM_SOURCE = 0x00200000;
-const U32 FLAGS_CAMERA_SOURCE = 0x00400000;
+const U32 FLAGS_CAMERA_DECOUPLED = (1U << 20);
+const U32 FLAGS_ANIM_SOURCE = (1U << 21);
+const U32 FLAGS_CAMERA_SOURCE = (1U << 22);
-const U32 FLAGS_CAST_SHADOWS = 0x00800000;
+//const U32 FLAGS_UNUSED_001 = (1U << 23); // was FLAGS_CAST_SHADOWS
-const U32 FLAGS_OBJECT_OWNER_MODIFY = 0x10000000;
+//const U32 FLAGS_UNUSED_002 = (1U << 24);
+//const U32 FLAGS_UNUSED_003 = (1U << 25);
+//const U32 FLAGS_UNUSED_004 = (1U << 26);
+//const U32 FLAGS_UNUSED_005 = (1U << 27);
-const U32 FLAGS_TEMPORARY_ON_REZ = 0x20000000;
-const U32 FLAGS_TEMPORARY = 0x40000000;
-const U32 FLAGS_ZLIB_COMPRESSED = 0x80000000;
+const U32 FLAGS_OBJECT_OWNER_MODIFY = (1U << 28);
-const U32 FLAGS_LOCAL = FLAGS_ANIM_SOURCE | FLAGS_CAMERA_SOURCE;
+const U32 FLAGS_TEMPORARY_ON_REZ = (1U << 29);
+//const U32 FLAGS_UNUSED_006 = (1U << 30); // was FLAGS_TEMPORARY
+//const U32 FLAGS_UNUSED_007 = (1U << 31); // was FLAGS_ZLIB_COMPRESSED
+
+const U32 FLAGS_LOCAL = FLAGS_ANIM_SOURCE | FLAGS_CAMERA_SOURCE;
typedef enum e_havok_joint_type
{
@@ -77,4 +81,3 @@ typedef enum e_havok_joint_type
} EHavokJointType;
#endif
-
diff --git a/indra/llrender/CMakeLists.txt b/indra/llrender/CMakeLists.txt
index 5c13df9f81..516af93316 100644
--- a/indra/llrender/CMakeLists.txt
+++ b/indra/llrender/CMakeLists.txt
@@ -36,6 +36,7 @@ set(llrender_SOURCE_FILES
llglslshader.cpp
llimagegl.cpp
llpostprocess.cpp
+ llrendernavprim.cpp
llrendersphere.cpp
llshadermgr.cpp
lltexture.cpp
@@ -59,6 +60,7 @@ set(llrender_HEADER_FILES
llimagegl.h
llpostprocess.h
llrender.h
+ llrendernavprim.h
llrendersphere.h
llshadermgr.h
lltexture.h
diff --git a/indra/llrender/llcubemap.cpp b/indra/llrender/llcubemap.cpp
index 45a3b18179..362452d837 100644
--- a/indra/llrender/llcubemap.cpp
+++ b/indra/llrender/llcubemap.cpp
@@ -81,7 +81,7 @@ void LLCubeMap::initGL()
{
U32 texname = 0;
- LLImageGL::generateTextures(1, &texname);
+ LLImageGL::generateTextures(LLTexUnit::TT_CUBE_MAP, GL_RGB8, 1, &texname);
for (int i = 0; i < 6; i++)
{
diff --git a/indra/llrender/llfontgl.cpp b/indra/llrender/llfontgl.cpp
index fccbf37a8d..4dc2fcd714 100644
--- a/indra/llrender/llfontgl.cpp
+++ b/indra/llrender/llfontgl.cpp
@@ -422,6 +422,16 @@ S32 LLFontGL::renderUTF8(const std::string &text, S32 begin_offset, S32 x, S32 y
}
// font metrics - override for LLFontFreetype that returns units of virtual pixels
+F32 LLFontGL::getAscenderHeight() const
+{
+ return mFontFreetype->getAscenderHeight() / sScaleY;
+}
+
+F32 LLFontGL::getDescenderHeight() const
+{
+ return mFontFreetype->getDescenderHeight() / sScaleY;
+}
+
S32 LLFontGL::getLineHeight() const
{
return llceil(mFontFreetype->getAscenderHeight() / sScaleY) + llceil(mFontFreetype->getDescenderHeight() / sScaleY);
diff --git a/indra/llrender/llfontgl.h b/indra/llrender/llfontgl.h
index 74bdbb43e7..5ed5d2c4eb 100644
--- a/indra/llrender/llfontgl.h
+++ b/indra/llrender/llfontgl.h
@@ -115,6 +115,8 @@ public:
S32 renderUTF8(const std::string &text, S32 begin_offset, S32 x, S32 y, const LLColor4 &color, HAlign halign, VAlign valign, U8 style = NORMAL, ShadowType shadow = NO_SHADOW) const;
// font metrics - override for LLFontFreetype that returns units of virtual pixels
+ F32 getAscenderHeight() const;
+ F32 getDescenderHeight() const;
S32 getLineHeight() const;
S32 getWidth(const std::string& utf8text) const;
diff --git a/indra/llrender/llgl.cpp b/indra/llrender/llgl.cpp
index 628a8d6131..0b56b3889c 100644
--- a/indra/llrender/llgl.cpp
+++ b/indra/llrender/llgl.cpp
@@ -249,6 +249,12 @@ PFNGLTEXIMAGE3DMULTISAMPLEPROC glTexImage3DMultisample = NULL;
PFNGLGETMULTISAMPLEFVPROC glGetMultisamplefv = NULL;
PFNGLSAMPLEMASKIPROC glSampleMaski = NULL;
+//transform feedback (4.0 core)
+PFNGLBEGINTRANSFORMFEEDBACKPROC glBeginTransformFeedback = NULL;
+PFNGLENDTRANSFORMFEEDBACKPROC glEndTransformFeedback = NULL;
+PFNGLTRANSFORMFEEDBACKVARYINGSPROC glTransformFeedbackVaryings = NULL;
+PFNGLBINDBUFFERRANGEPROC glBindBufferRange = NULL;
+
//GL_ARB_debug_output
PFNGLDEBUGMESSAGECONTROLARBPROC glDebugMessageControlARB = NULL;
PFNGLDEBUGMESSAGEINSERTARBPROC glDebugMessageInsertARB = NULL;
@@ -421,6 +427,7 @@ LLGLManager::LLGLManager() :
mHasDrawBuffers(FALSE),
mHasTextureRectangle(FALSE),
mHasTextureMultisample(FALSE),
+ mHasTransformFeedback(FALSE),
mMaxSampleMaskWords(0),
mMaxColorTextureSamples(0),
mMaxDepthTextureSamples(0),
@@ -558,7 +565,8 @@ bool LLGLManager::initGL()
parse_gl_version( &mDriverVersionMajor,
&mDriverVersionMinor,
&mDriverVersionRelease,
- &mDriverVersionVendorString );
+ &mDriverVersionVendorString,
+ &mGLVersionString);
mGLVersion = mDriverVersionMajor + mDriverVersionMinor * .1f;
@@ -938,7 +946,6 @@ void LLGLManager::initExtensions()
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");
glh_init_extensions("GL_ARB_texture_cube_map");
@@ -963,11 +970,14 @@ void LLGLManager::initExtensions()
ExtensionExists("GL_EXT_packed_depth_stencil", gGLHExts.mSysExts);
#endif
+ mHasMipMapGeneration = mHasFramebufferObject || mGLVersion >= 1.4f;
+
mHasDrawBuffers = ExtensionExists("GL_ARB_draw_buffers", gGLHExts.mSysExts);
mHasBlendFuncSeparate = ExtensionExists("GL_EXT_blend_func_separate", gGLHExts.mSysExts);
mHasTextureRectangle = ExtensionExists("GL_ARB_texture_rectangle", gGLHExts.mSysExts);
mHasTextureMultisample = ExtensionExists("GL_ARB_texture_multisample", gGLHExts.mSysExts);
mHasDebugOutput = ExtensionExists("GL_ARB_debug_output", gGLHExts.mSysExts);
+ mHasTransformFeedback = mGLVersion >= 4.f ? TRUE : FALSE;
#if !LL_DARWIN
mHasPointParameters = !mIsATI && ExtensionExists("GL_ARB_point_parameters", gGLHExts.mSysExts);
#endif
@@ -1207,7 +1217,14 @@ void LLGLManager::initExtensions()
glTexImage3DMultisample = (PFNGLTEXIMAGE3DMULTISAMPLEPROC) GLH_EXT_GET_PROC_ADDRESS("glTexImage3DMultisample");
glGetMultisamplefv = (PFNGLGETMULTISAMPLEFVPROC) GLH_EXT_GET_PROC_ADDRESS("glGetMultisamplefv");
glSampleMaski = (PFNGLSAMPLEMASKIPROC) GLH_EXT_GET_PROC_ADDRESS("glSampleMaski");
- }
+ }
+ if (mHasTransformFeedback)
+ {
+ glBeginTransformFeedback = (PFNGLBEGINTRANSFORMFEEDBACKPROC) GLH_EXT_GET_PROC_ADDRESS("glBeginTransformFeedback");
+ glEndTransformFeedback = (PFNGLENDTRANSFORMFEEDBACKPROC) GLH_EXT_GET_PROC_ADDRESS("glEndTransformFeedback");
+ glTransformFeedbackVaryings = (PFNGLTRANSFORMFEEDBACKVARYINGSPROC) GLH_EXT_GET_PROC_ADDRESS("glTransformFeedbackVaryings");
+ glBindBufferRange = (PFNGLBINDBUFFERRANGEPROC) GLH_EXT_GET_PROC_ADDRESS("glBindBufferRange");
+ }
if (mHasDebugOutput)
{
glDebugMessageControlARB = (PFNGLDEBUGMESSAGECONTROLARBPROC) GLH_EXT_GET_PROC_ADDRESS("glDebugMessageControlARB");
@@ -1964,6 +1981,7 @@ LLGLState::LLGLState(LLGLenum state, S32 enabled) :
case GL_COLOR_MATERIAL:
case GL_FOG:
case GL_LINE_STIPPLE:
+ case GL_POLYGON_STIPPLE:
mState = 0;
break;
}
@@ -2052,7 +2070,7 @@ void LLGLManager::initGLStates()
////////////////////////////////////////////////////////////////////////////////
-void parse_gl_version( S32* major, S32* minor, S32* release, std::string* vendor_specific )
+void parse_gl_version( S32* major, S32* minor, S32* release, std::string* vendor_specific, std::string* version_string )
{
// GL_VERSION returns a null-terminated string with the format:
// <major>.<minor>[.<release>] [<vendor specific>]
@@ -2068,6 +2086,8 @@ void parse_gl_version( S32* major, S32* minor, S32* release, std::string* vendor
return;
}
+ version_string->assign(version);
+
std::string ver_copy( version );
S32 len = (S32)strlen( version ); /* Flawfinder: ignore */
S32 i = 0;
@@ -2429,3 +2449,65 @@ LLGLSquashToFarClip::~LLGLSquashToFarClip()
gGL.matrixMode(LLRender::MM_MODELVIEW);
}
+
+
+LLGLSyncFence::LLGLSyncFence()
+{
+#ifdef GL_ARB_sync
+ mSync = 0;
+#endif
+}
+
+LLGLSyncFence::~LLGLSyncFence()
+{
+#ifdef GL_ARB_sync
+ if (mSync)
+ {
+ glDeleteSync(mSync);
+ }
+#endif
+}
+
+void LLGLSyncFence::placeFence()
+{
+#ifdef GL_ARB_sync
+ if (mSync)
+ {
+ glDeleteSync(mSync);
+ }
+ mSync = glFenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0);
+#endif
+}
+
+bool LLGLSyncFence::isCompleted()
+{
+ bool ret = true;
+#ifdef GL_ARB_sync
+ if (mSync)
+ {
+ GLenum status = glClientWaitSync(mSync, 0, 1);
+ if (status == GL_TIMEOUT_EXPIRED)
+ {
+ ret = false;
+ }
+ }
+#endif
+ return ret;
+}
+
+void LLGLSyncFence::wait()
+{
+#ifdef GL_ARB_sync
+ if (mSync)
+ {
+ while (glClientWaitSync(mSync, 0, FENCE_WAIT_TIME_NANOSECONDS) == GL_TIMEOUT_EXPIRED)
+ { //track the number of times we've waited here
+ static S32 waits = 0;
+ waits++;
+ }
+ }
+#endif
+}
+
+
+
diff --git a/indra/llrender/llgl.h b/indra/llrender/llgl.h
index 5a33c98708..964495a3ab 100644
--- a/indra/llrender/llgl.h
+++ b/indra/llrender/llgl.h
@@ -104,6 +104,7 @@ public:
BOOL mHasDepthClamp;
BOOL mHasTextureRectangle;
BOOL mHasTextureMultisample;
+ BOOL mHasTransformFeedback;
S32 mMaxSampleMaskWords;
S32 mMaxColorTextureSamples;
S32 mMaxDepthTextureSamples;
@@ -141,6 +142,7 @@ public:
S32 mGLSLVersionMajor;
S32 mGLSLVersionMinor;
std::string mDriverVersionVendorString;
+ std::string mGLVersionString;
S32 mVRAM; // VRAM in MB
S32 mGLMaxVertexRange;
@@ -417,13 +419,38 @@ public:
virtual void updateGL() = 0;
};
+const U32 FENCE_WAIT_TIME_NANOSECONDS = 1000; //1 ms
+
+class LLGLFence
+{
+public:
+ virtual void placeFence() = 0;
+ virtual bool isCompleted() = 0;
+ virtual void wait() = 0;
+};
+
+class LLGLSyncFence : public LLGLFence
+{
+public:
+#ifdef GL_ARB_sync
+ GLsync mSync;
+#endif
+
+ LLGLSyncFence();
+ virtual ~LLGLSyncFence();
+
+ void placeFence();
+ bool isCompleted();
+ void wait();
+};
+
extern LLMatrix4 gGLObliqueProjectionInverse;
#include "llglstates.h"
void init_glstates();
-void parse_gl_version( S32* major, S32* minor, S32* release, std::string* vendor_specific );
+void parse_gl_version( S32* major, S32* minor, S32* release, std::string* vendor_specific, std::string* version_string );
extern BOOL gClothRipple;
extern BOOL gHeadlessClient;
diff --git a/indra/llrender/llglheaders.h b/indra/llrender/llglheaders.h
index d61ec707f0..a0727b8686 100644
--- a/indra/llrender/llglheaders.h
+++ b/indra/llrender/llglheaders.h
@@ -528,6 +528,13 @@ extern PFNGLTEXIMAGE3DMULTISAMPLEPROC glTexImage3DMultisample;
extern PFNGLGETMULTISAMPLEFVPROC glGetMultisamplefv;
extern PFNGLSAMPLEMASKIPROC glSampleMaski;
+//transform feedback (4.0 core)
+extern PFNGLBEGINTRANSFORMFEEDBACKPROC glBeginTransformFeedback;
+extern PFNGLENDTRANSFORMFEEDBACKPROC glEndTransformFeedback;
+extern PFNGLTRANSFORMFEEDBACKVARYINGSPROC glTransformFeedbackVaryings;
+extern PFNGLBINDBUFFERRANGEPROC glBindBufferRange;
+
+
#elif LL_WINDOWS
//----------------------------------------------------------------------------
// LL_WINDOWS
@@ -759,6 +766,12 @@ extern PFNGLTEXIMAGE3DMULTISAMPLEPROC glTexImage3DMultisample;
extern PFNGLGETMULTISAMPLEFVPROC glGetMultisamplefv;
extern PFNGLSAMPLEMASKIPROC glSampleMaski;
+//transform feedback (4.0 core)
+extern PFNGLBEGINTRANSFORMFEEDBACKPROC glBeginTransformFeedback;
+extern PFNGLENDTRANSFORMFEEDBACKPROC glEndTransformFeedback;
+extern PFNGLTRANSFORMFEEDBACKVARYINGSPROC glTransformFeedbackVaryings;
+extern PFNGLBINDBUFFERRANGEPROC glBindBufferRange;
+
//GL_ARB_debug_output
extern PFNGLDEBUGMESSAGECONTROLARBPROC glDebugMessageControlARB;
extern PFNGLDEBUGMESSAGEINSERTARBPROC glDebugMessageInsertARB;
diff --git a/indra/llrender/llglslshader.cpp b/indra/llrender/llglslshader.cpp
index 4b7e639aed..7cbf39096e 100644
--- a/indra/llrender/llglslshader.cpp
+++ b/indra/llrender/llglslshader.cpp
@@ -129,7 +129,9 @@ void LLGLSLShader::unload()
}
BOOL LLGLSLShader::createShader(vector<string> * attributes,
- vector<string> * uniforms)
+ vector<string> * uniforms,
+ U32 varying_count,
+ const char** varyings)
{
//reloading, reset matrix hash values
for (U32 i = 0; i < LLRender::NUM_MATRIX_MODES; ++i)
@@ -172,6 +174,13 @@ BOOL LLGLSLShader::createShader(vector<string> * attributes,
mFeatures.mIndexedTextureChannels = llmin(mFeatures.mIndexedTextureChannels, 1);
}
+#ifdef GL_INTERLEAVED_ATTRIBS
+ if (varying_count > 0 && varyings)
+ {
+ glTransformFeedbackVaryings(mProgramObject, varying_count, varyings, GL_INTERLEAVED_ATTRIBS);
+ }
+#endif
+
// Map attributes and uniforms
if (success)
{
diff --git a/indra/llrender/llglslshader.h b/indra/llrender/llglslshader.h
index 7873fe3c4e..5c68cb46eb 100644
--- a/indra/llrender/llglslshader.h
+++ b/indra/llrender/llglslshader.h
@@ -76,7 +76,9 @@ public:
void unload();
BOOL createShader(std::vector<std::string> * attributes,
- std::vector<std::string> * uniforms);
+ std::vector<std::string> * uniforms,
+ U32 varying_count = 0,
+ const char** varyings = NULL);
BOOL attachObject(std::string object);
void attachObject(GLhandleARB object);
void attachObjects(GLhandleARB* objects = NULL, S32 count = 0);
diff --git a/indra/llrender/llglstates.h b/indra/llrender/llglstates.h
index e26aead676..0e2c3bcb44 100644
--- a/indra/llrender/llglstates.h
+++ b/indra/llrender/llglstates.h
@@ -59,7 +59,6 @@ protected:
LLGLEnable mColorMaterial;
LLGLDisable mAlphaTest, mBlend, mCullFace, mDither, mFog,
mLineSmooth, mLineStipple, mNormalize, mPolygonSmooth,
- mTextureGenQ, mTextureGenR, mTextureGenS, mTextureGenT,
mGLMultisample;
public:
LLGLSDefault()
@@ -76,10 +75,6 @@ public:
mLineStipple(GL_LINE_STIPPLE),
mNormalize(GL_NORMALIZE),
mPolygonSmooth(GL_POLYGON_SMOOTH),
- mTextureGenQ(GL_TEXTURE_GEN_Q),
- mTextureGenR(GL_TEXTURE_GEN_R),
- mTextureGenS(GL_TEXTURE_GEN_S),
- mTextureGenT(GL_TEXTURE_GEN_T),
mGLMultisample(GL_MULTISAMPLE_ARB)
{ }
};
diff --git a/indra/llrender/llimagegl.cpp b/indra/llrender/llimagegl.cpp
index c04a3f6b41..a4d7872ec2 100644..100755
--- a/indra/llrender/llimagegl.cpp
+++ b/indra/llrender/llimagegl.cpp
@@ -42,6 +42,10 @@
//----------------------------------------------------------------------------
const F32 MIN_TEXTURE_LIFETIME = 10.f;
+//which power of 2 is i?
+//assumes i is a power of 2 > 0
+U32 wpo2(U32 i);
+
//statics
U32 LLImageGL::sUniqueCount = 0;
@@ -50,7 +54,8 @@ S32 LLImageGL::sGlobalTextureMemoryInBytes = 0;
S32 LLImageGL::sBoundTextureMemoryInBytes = 0;
S32 LLImageGL::sCurBoundTextureMemory = 0;
S32 LLImageGL::sCount = 0;
-std::list<U32> LLImageGL::sDeadTextureList;
+LLImageGL::dead_texturelist_t LLImageGL::sDeadTextureList[LLTexUnit::TT_NONE];
+U32 LLImageGL::sCurTexName = 1;
BOOL LLImageGL::sGlobalUseAnisotropic = FALSE;
F32 LLImageGL::sLastFrameTime = 0.f;
@@ -232,9 +237,11 @@ S32 LLImageGL::dataFormatComponents(S32 dataformat)
//----------------------------------------------------------------------------
+static LLFastTimer::DeclareTimer FTM_IMAGE_UPDATE_STATS("Image Stats");
// static
void LLImageGL::updateStats(F32 current_time)
{
+ LLFastTimer t(FTM_IMAGE_UPDATE_STATS);
sLastFrameTime = current_time;
sBoundTextureMemoryInBytes = sCurBoundTextureMemory;
sCurBoundTextureMemory = 0;
@@ -416,6 +423,7 @@ void LLImageGL::init(BOOL usemipmaps)
mTarget = GL_TEXTURE_2D;
mBindTarget = LLTexUnit::TT_TEXTURE;
mHasMipMaps = false;
+ mMipLevels = -1;
mIsResident = 0;
@@ -470,7 +478,7 @@ bool LLImageGL::checkSize(S32 width, S32 height)
return check_power_of_two(width) && check_power_of_two(height);
}
-void LLImageGL::setSize(S32 width, S32 height, S32 ncomponents)
+void LLImageGL::setSize(S32 width, S32 height, S32 ncomponents, S32 discard_level)
{
if (width != mWidth || height != mHeight || ncomponents != mComponents)
{
@@ -503,6 +511,11 @@ void LLImageGL::setSize(S32 width, S32 height, S32 ncomponents)
width >>= 1;
height >>= 1;
}
+
+ if(discard_level > 0)
+ {
+ mMaxDiscardLevel = llmax(mMaxDiscardLevel, (S8)discard_level);
+ }
}
else
{
@@ -606,8 +619,24 @@ void LLImageGL::setImage(const U8* data_in, BOOL data_hasmips)
is_compressed = true;
}
+
+
+ if (mUseMipMaps)
+ {
+ //set has mip maps to true before binding image so tex parameters get set properly
+ gGL.getTexUnit(0)->unbind(mBindTarget);
+ mHasMipMaps = true;
+ mTexOptionsDirty = true;
+ setFilteringOption(LLTexUnit::TFO_ANISOTROPIC);
+ }
+ else
+ {
+ mHasMipMaps = false;
+ }
+
llverify(gGL.getTexUnit(0)->bind(this));
+
if (mUseMipMaps)
{
if (data_hasmips)
@@ -620,6 +649,9 @@ void LLImageGL::setImage(const U8* data_in, BOOL data_hasmips)
S32 w = getWidth(d);
S32 h = getHeight(d);
S32 gl_level = d-mCurrentDiscardLevel;
+
+ mMipLevels = llmax(mMipLevels, gl_level);
+
if (d > mCurrentDiscardLevel)
{
data_in -= dataFormatBytes(mFormatPrimary, w, h); // see above comment
@@ -662,10 +694,6 @@ void LLImageGL::setImage(const U8* data_in, BOOL data_hasmips)
{
if (mAutoGenMips)
{
- if (!gGLManager.mHasFramebufferObject)
- {
- glTexParameteri(LLTexUnit::getInternalType(mBindTarget), GL_GENERATE_MIPMAP_SGIS, TRUE);
- }
stop_glerror();
{
// LLFastTimer t2(FTM_TEMP4);
@@ -679,6 +707,11 @@ void LLImageGL::setImage(const U8* data_in, BOOL data_hasmips)
S32 w = getWidth(mCurrentDiscardLevel);
S32 h = getHeight(mCurrentDiscardLevel);
+ mMipLevels = wpo2(llmax(w, h));
+
+ //use legacy mipmap generation mode
+ glTexParameteri(mTarget, GL_GENERATE_MIPMAP, GL_TRUE);
+
LLImageGL::setManualImage(mTarget, 0, mFormatInternal,
w, h,
mFormatPrimary, mFormatType,
@@ -694,16 +727,10 @@ void LLImageGL::setImage(const U8* data_in, BOOL data_hasmips)
stop_glerror();
}
}
-
- if (gGLManager.mHasFramebufferObject)
- {
- glGenerateMipmap(LLTexUnit::getInternalType(mBindTarget));
- }
}
else
{
// Create mips by hand
- // about 30% faster than autogen on ATI 9800, 50% slower on nVidia 4800
// ~4x faster than gluBuild2DMipmaps
S32 width = getWidth(mCurrentDiscardLevel);
S32 height = getHeight(mCurrentDiscardLevel);
@@ -713,6 +740,9 @@ void LLImageGL::setImage(const U8* data_in, BOOL data_hasmips)
const U8* cur_mip_data = 0;
S32 prev_mip_size = 0;
S32 cur_mip_size = 0;
+
+ mMipLevels = nummips;
+
for (int m=0; m<nummips; m++)
{
if (m==0)
@@ -777,10 +807,10 @@ void LLImageGL::setImage(const U8* data_in, BOOL data_hasmips)
{
llerrs << "Compressed Image has mipmaps but data does not (can not auto generate compressed mips)" << llendl;
}
- mHasMipMaps = true;
}
else
{
+ mMipLevels = 0;
S32 w = getWidth();
S32 h = getHeight();
if (is_compressed)
@@ -812,7 +842,6 @@ void LLImageGL::setImage(const U8* data_in, BOOL data_hasmips)
}
}
- mHasMipMaps = false;
}
stop_glerror();
mGLTextureCreated = true;
@@ -836,14 +865,13 @@ BOOL LLImageGL::preAddToAtlas(S32 discard_level, const LLImageRaw* raw_image)
llassert(mCurrentDiscardLevel >= 0);
discard_level = mCurrentDiscardLevel;
}
- discard_level = llclamp(discard_level, 0, (S32)mMaxDiscardLevel);
-
+
// Actual image width/height = raw image width/height * 2^discard_level
S32 w = raw_image->getWidth() << discard_level;
S32 h = raw_image->getHeight() << discard_level;
// setSize may call destroyGLTexture if the size does not match
- setSize(w, h, raw_image->getComponents());
+ setSize(w, h, raw_image->getComponents(), discard_level);
if( !mHasExplicitFormat )
{
@@ -1025,23 +1053,65 @@ BOOL LLImageGL::setSubImageFromFrameBuffer(S32 fb_x, S32 fb_y, S32 x_pos, S32 y_
}
// static
-void LLImageGL::generateTextures(S32 numTextures, U32 *textures)
+void LLImageGL::generateTextures(LLTexUnit::eTextureType type, U32 format, S32 numTextures, U32 *textures)
{
- glGenTextures(numTextures, (GLuint*)textures);
+ bool empty = true;
+
+ dead_texturelist_t::iterator iter = sDeadTextureList[type].find(format);
+
+ if (iter != sDeadTextureList[type].end())
+ {
+ empty = iter->second.empty();
+ }
+
+ for (S32 i = 0; i < numTextures; ++i)
+ {
+ if (!empty)
+ {
+ textures[i] = iter->second.front();
+ iter->second.pop_front();
+ empty = iter->second.empty();
+ }
+ else
+ {
+ textures[i] = sCurTexName++;
+ }
+ }
}
// static
-void LLImageGL::deleteTextures(S32 numTextures, U32 *textures, bool immediate)
+void LLImageGL::deleteTextures(LLTexUnit::eTextureType type, U32 format, S32 mip_levels, S32 numTextures, U32 *textures, bool immediate)
{
- for (S32 i = 0; i < numTextures; i++)
+ if (gGLManager.mInited)
{
- sDeadTextureList.push_back(textures[i]);
- }
+ if (format == 0 || type == LLTexUnit::TT_CUBE_MAP || mip_levels == -1)
+ { //unknown internal format or unknown number of mip levels, not safe to reuse
+ glDeleteTextures(numTextures, textures);
+ }
+ else
+ {
+ for (S32 i = 0; i < numTextures; ++i)
+ { //remove texture from VRAM by setting its size to zero
+ for (S32 j = 0; j <= mip_levels; j++)
+ {
+ gGL.getTexUnit(0)->bindManual(type, textures[i]);
+
+ glTexImage2D(LLTexUnit::getInternalType(type), j, format, 0, 0, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
+ }
+
+ llassert(std::find(sDeadTextureList[type][format].begin(),
+ sDeadTextureList[type][format].end(), textures[i]) ==
+ sDeadTextureList[type][format].end());
- if (immediate)
+ sDeadTextureList[type][format].push_back(textures[i]);
+ }
+ }
+ }
+
+ /*if (immediate)
{
LLImageGL::deleteDeadTextures();
- }
+ }*/
}
// static
@@ -1166,10 +1236,11 @@ BOOL LLImageGL::createGLTexture()
if(mTexName)
{
- glDeleteTextures(1, (reinterpret_cast<GLuint*>(&mTexName))) ;
+ LLImageGL::deleteTextures(mBindTarget, mFormatInternal, mMipLevels, 1, (reinterpret_cast<GLuint*>(&mTexName))) ;
}
- glGenTextures(1, (GLuint*)&mTexName);
+
+ LLImageGL::generateTextures(mBindTarget, mFormatInternal, 1, &mTexName);
stop_glerror();
if (!mTexName)
{
@@ -1197,8 +1268,7 @@ BOOL LLImageGL::createGLTexture(S32 discard_level, const LLImageRaw* imageraw, S
llassert(mCurrentDiscardLevel >= 0);
discard_level = mCurrentDiscardLevel;
}
- discard_level = llclamp(discard_level, 0, (S32)mMaxDiscardLevel);
-
+
// Actual image width/height = raw image width/height * 2^discard_level
S32 raw_w = imageraw->getWidth() ;
S32 raw_h = imageraw->getHeight() ;
@@ -1206,7 +1276,7 @@ BOOL LLImageGL::createGLTexture(S32 discard_level, const LLImageRaw* imageraw, S
S32 h = raw_h << discard_level;
// setSize may call destroyGLTexture if the size does not match
- setSize(w, h, imageraw->getComponents());
+ setSize(w, h, imageraw->getComponents(), discard_level);
if( !mHasExplicitFormat )
{
@@ -1282,7 +1352,7 @@ BOOL LLImageGL::createGLTexture(S32 discard_level, const U8* data_in, BOOL data_
}
else
{
- LLImageGL::generateTextures(1, &mTexName);
+ LLImageGL::generateTextures(mBindTarget, mFormatInternal, 1, &mTexName);
stop_glerror();
{
llverify(gGL.getTexUnit(0)->bind(this));
@@ -1327,7 +1397,7 @@ BOOL LLImageGL::createGLTexture(S32 discard_level, const U8* data_in, BOOL data_
{
sGlobalTextureMemoryInBytes -= mTextureMemory;
- LLImageGL::deleteTextures(1, &old_name);
+ LLImageGL::deleteTextures(mBindTarget, mFormatInternal, mMipLevels, 1, &old_name);
stop_glerror();
}
@@ -1456,7 +1526,7 @@ void LLImageGL::deleteDeadTextures()
{
bool reset = false;
- while (!sDeadTextureList.empty())
+ /*while (!sDeadTextureList.empty())
{
GLuint tex = sDeadTextureList.front();
sDeadTextureList.pop_front();
@@ -1478,7 +1548,7 @@ void LLImageGL::deleteDeadTextures()
glDeleteTextures(1, &tex);
stop_glerror();
- }
+ }*/
if (reset)
{
@@ -1496,7 +1566,7 @@ void LLImageGL::destroyGLTexture()
mTextureMemory = 0;
}
- LLImageGL::deleteTextures(1, &mTexName);
+ LLImageGL::deleteTextures(mBindTarget, mFormatInternal, mMipLevels, 1, &mTexName);
mCurrentDiscardLevel = -1 ; //invalidate mCurrentDiscardLevel.
mTexName = 0;
mGLTextureCreated = FALSE ;
diff --git a/indra/llrender/llimagegl.h b/indra/llrender/llimagegl.h
index f34b9fa91a..cf3c484c79 100644..100755
--- a/indra/llrender/llimagegl.h
+++ b/indra/llrender/llimagegl.h
@@ -45,8 +45,16 @@ class LLImageGL : public LLRefCount
{
friend class LLTexUnit;
public:
- static std::list<U32> sDeadTextureList;
+ static U32 sCurTexName;
+ //previously used but now available texture names
+ // sDeadTextureList[<usage>][<internal format>]
+ typedef std::map<U32, std::list<U32> > dead_texturelist_t;
+ static dead_texturelist_t sDeadTextureList[LLTexUnit::TT_NONE];
+
+ // These 2 functions replace glGenTextures() and glDeleteTextures()
+ static void generateTextures(LLTexUnit::eTextureType type, U32 format, S32 numTextures, U32 *textures);
+ static void deleteTextures(LLTexUnit::eTextureType type, U32 format, S32 mip_levels, S32 numTextures, U32 *textures, bool immediate = false);
static void deleteDeadTextures();
// Size calculation
@@ -92,14 +100,10 @@ protected:
public:
virtual void dump(); // debugging info to llinfos
- void setSize(S32 width, S32 height, S32 ncomponents);
+ void setSize(S32 width, S32 height, S32 ncomponents, S32 discard_level = -1);
void setComponents(S32 ncomponents) { mComponents = (S8)ncomponents ;}
void setAllowCompression(bool allow) { mAllowCompression = allow; }
- // These 3 functions currently wrap glGenTextures(), glDeleteTextures(), and glTexImage2D()
- // for tracking purposes and will be deprecated in the future
- static void generateTextures(S32 numTextures, U32 *textures);
- static void deleteTextures(S32 numTextures, U32 *textures, bool immediate = false);
static void setManualImage(U32 target, S32 miplevel, S32 intformat, S32 width, S32 height, U32 pixformat, U32 pixtype, const void *pixels, bool allow_compression = true);
BOOL createGLTexture() ;
@@ -217,7 +221,8 @@ protected:
LLGLenum mTarget; // Normally GL_TEXTURE2D, sometimes something else (ex. cube maps)
LLTexUnit::eTextureType mBindTarget; // Normally TT_TEXTURE, sometimes something else (ex. cube maps)
bool mHasMipMaps;
-
+ S32 mMipLevels;
+
LLGLboolean mIsResident;
S8 mComponents;
diff --git a/indra/llrender/llrender.cpp b/indra/llrender/llrender.cpp
index 93bac4c779..4597d06260 100644
--- a/indra/llrender/llrender.cpp
+++ b/indra/llrender/llrender.cpp
@@ -408,12 +408,14 @@ void LLTexUnit::unbind(eTextureType type)
if (mIndex < 0) return;
+ //always flush and activate for consistency
+ // some code paths assume unbind always flushes and sets the active texture
+ gGL.flush();
+ activate();
+
// Disabled caching of binding state.
if (mCurrTexType == type)
{
- gGL.flush();
-
- activate();
mCurrTexture = 0;
if (LLGLSLShader::sNoFixedFunction && type == LLTexUnit::TT_TEXTURE)
{
@@ -464,11 +466,25 @@ void LLTexUnit::setTextureFilteringOption(LLTexUnit::eTextureFilterOptions optio
}
else if (option >= TFO_BILINEAR)
{
- glTexParameteri(sGLTextureType[mCurrTexType], GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+ if (mHasMipMaps)
+ {
+ glTexParameteri(sGLTextureType[mCurrTexType], GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST);
+ }
+ else
+ {
+ glTexParameteri(sGLTextureType[mCurrTexType], GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+ }
}
else
{
- glTexParameteri(sGLTextureType[mCurrTexType], GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+ if (mHasMipMaps)
+ {
+ glTexParameteri(sGLTextureType[mCurrTexType], GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST);
+ }
+ else
+ {
+ glTexParameteri(sGLTextureType[mCurrTexType], GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+ }
}
if (gGLManager.mHasAnisotropic)
@@ -632,7 +648,7 @@ void LLTexUnit::setTextureCombiner(eTextureBlendOp op, eTextureBlendSrc src1, eT
gGL.flush();
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE_ARB);
}
-
+
// We want an early out, because this function does a LOT of stuff.
if ( ( (isAlpha && (mCurrAlphaOp == op) && (mCurrAlphaSrc1 == src1) && (mCurrAlphaSrc2 == src2))
|| (!isAlpha && (mCurrColorOp == op) && (mCurrColorSrc1 == src1) && (mCurrColorSrc2 == src2)) ) && !gGL.mDirty)
@@ -1421,6 +1437,17 @@ void LLRender::matrixMode(U32 mode)
mMatrixMode = mode;
}
+U32 LLRender::getMatrixMode()
+{
+ if (mMatrixMode >= MM_TEXTURE0 && mMatrixMode <= MM_TEXTURE3)
+ { //always return MM_TEXTURE if current matrix mode points at any texture matrix
+ return MM_TEXTURE;
+ }
+
+ return mMatrixMode;
+}
+
+
void LLRender::loadIdentity()
{
flush();
diff --git a/indra/llrender/llrender.h b/indra/llrender/llrender.h
index fa5f7f311d..78a310e525 100644
--- a/indra/llrender/llrender.h
+++ b/indra/llrender/llrender.h
@@ -346,6 +346,7 @@ public:
void loadIdentity();
void multMatrix(const GLfloat* m);
void matrixMode(U32 mode);
+ U32 getMatrixMode();
const glh::matrix4f& getModelviewMatrix();
const glh::matrix4f& getProjectionMatrix();
diff --git a/indra/llrender/llrendernavprim.cpp b/indra/llrender/llrendernavprim.cpp
new file mode 100644
index 0000000000..ca72964832
--- /dev/null
+++ b/indra/llrender/llrendernavprim.cpp
@@ -0,0 +1,59 @@
+/**
+* @file llrendernavprim.cpp
+* @brief Implementation of llrendernavprim
+* @author Prep@lindenlab.com
+*
+* $LicenseInfo:firstyear=2012&license=viewerlgpl$
+* Second Life Viewer Source Code
+* Copyright (C) 2012, Linden Research, Inc.
+*
+* This library is free software; you can redistribute it and/or
+* modify it under the terms of the GNU Lesser General Public
+* License as published by the Free Software Foundation;
+* version 2.1 of the License only.
+*
+* This library is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this library; if not, write to the Free Software
+* 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 "llrendernavprim.h"
+
+#include "llrender.h"
+#include "llvertexbuffer.h"
+#include "v4coloru.h"
+#include "v3math.h"
+
+//=============================================================================
+LLRenderNavPrim gRenderNav;
+//=============================================================================
+void LLRenderNavPrim::renderLLTri( const LLVector3& a, const LLVector3& b, const LLVector3& c, const LLColor4U& color ) const
+{
+ LLColor4 cV(color);
+ gGL.color4fv( cV.mV );
+ gGL.begin(LLRender::TRIANGLES);
+ {
+ gGL.vertex3fv( a.mV );
+ gGL.vertex3fv( b.mV );
+ gGL.vertex3fv( c.mV );
+ }
+ gGL.end();
+}
+//=============================================================================
+void LLRenderNavPrim::renderNavMeshVB( U32 mode, LLVertexBuffer* pVBO, int vertCnt )
+{
+ pVBO->setBuffer( LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_COLOR | LLVertexBuffer::MAP_NORMAL );
+ pVBO->drawArrays( mode, 0, vertCnt );
+}
+//=============================================================================
diff --git a/indra/llrender/llrendernavprim.h b/indra/llrender/llrendernavprim.h
new file mode 100644
index 0000000000..a3a5dfec3a
--- /dev/null
+++ b/indra/llrender/llrendernavprim.h
@@ -0,0 +1,49 @@
+/**
+* @file llrendernavprim.h
+* @brief Header file for llrendernavprim
+* @author Prep@lindenlab.com
+*
+* $LicenseInfo:firstyear=2012&license=viewerlgpl$
+* Second Life Viewer Source Code
+* Copyright (C) 2012, Linden Research, Inc.
+*
+* This library is free software; you can redistribute it and/or
+* modify it under the terms of the GNU Lesser General Public
+* License as published by the Free Software Foundation;
+* version 2.1 of the License only.
+*
+* This library is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this library; if not, write to the Free Software
+* 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_LLRENDERNAVPRIM_H
+#define LL_LLRENDERNAVPRIM_H
+
+#include "stdtypes.h"
+
+class LLColor4U;
+class LLVector3;
+class LLVertexBuffer;
+
+
+class LLRenderNavPrim
+{
+public:
+ //Draw simple tri
+ void renderLLTri( const LLVector3& a, const LLVector3& b, const LLVector3& c, const LLColor4U& color ) const;
+ //Draw the contents of vertex buffer
+ void renderNavMeshVB( U32 mode, LLVertexBuffer* pVBO, int vertCnt );
+private:
+};
+
+extern LLRenderNavPrim gRenderNav;
+
+#endif // LL_LLRENDERNAVPRIM_H
diff --git a/indra/llrender/llrendertarget.cpp b/indra/llrender/llrendertarget.cpp
index 780f1dc484..cc5c232380 100644
--- a/indra/llrender/llrendertarget.cpp
+++ b/indra/llrender/llrendertarget.cpp
@@ -55,7 +55,6 @@ bool LLRenderTarget::sUseFBO = false;
LLRenderTarget::LLRenderTarget() :
mResX(0),
mResY(0),
- mTex(0),
mFBO(0),
mDepth(0),
mStencil(0),
@@ -70,6 +69,42 @@ LLRenderTarget::~LLRenderTarget()
release();
}
+void LLRenderTarget::resize(U32 resx, U32 resy, U32 color_fmt)
+{
+ //for accounting, get the number of pixels added/subtracted
+ S32 pix_diff = (resx*resy)-(mResX*mResY);
+
+ mResX = resx;
+ mResY = resy;
+
+ for (U32 i = 0; i < mTex.size(); ++i)
+ { //resize color attachments
+ gGL.getTexUnit(0)->bindManual(mUsage, mTex[i]);
+ LLImageGL::setManualImage(LLTexUnit::getInternalType(mUsage), 0, color_fmt, mResX, mResY, GL_RGBA, GL_UNSIGNED_BYTE, NULL, false);
+ sBytesAllocated += pix_diff*4;
+ }
+
+ if (mDepth)
+ { //resize depth attachment
+ if (mStencil)
+ {
+ //use render buffers where stencil buffers are in play
+ glBindRenderbuffer(GL_RENDERBUFFER, mDepth);
+ glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, mResX, mResY);
+ glBindRenderbuffer(GL_RENDERBUFFER, 0);
+ }
+ else
+ {
+ gGL.getTexUnit(0)->bindManual(mUsage, mDepth);
+ U32 internal_type = LLTexUnit::getInternalType(mUsage);
+ LLImageGL::setManualImage(internal_type, 0, GL_DEPTH_COMPONENT24, mResX, mResY, GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, NULL, false);
+ }
+
+ sBytesAllocated += pix_diff*4;
+ }
+}
+
+
bool LLRenderTarget::allocate(U32 resx, U32 resy, U32 color_fmt, bool depth, bool stencil, LLTexUnit::eTextureType usage, bool use_fbo, S32 samples)
{
stop_glerror();
@@ -135,7 +170,7 @@ bool LLRenderTarget::addColorAttachment(U32 color_fmt)
}
U32 tex;
- LLImageGL::generateTextures(1, &tex);
+ LLImageGL::generateTextures(mUsage, color_fmt, 1, &tex);
gGL.getTexUnit(0)->bindManual(mUsage, tex);
stop_glerror();
@@ -193,6 +228,7 @@ bool LLRenderTarget::addColorAttachment(U32 color_fmt)
}
mTex.push_back(tex);
+ mInternalFormat.push_back(color_fmt);
if (gDebugGL)
{ //bind and unbind to validate target
@@ -217,7 +253,7 @@ bool LLRenderTarget::allocateDepth()
}
else
{
- LLImageGL::generateTextures(1, &mDepth);
+ LLImageGL::generateTextures(mUsage, GL_DEPTH_COMPONENT24, 1, &mDepth);
gGL.getTexUnit(0)->bindManual(mUsage, mDepth);
U32 internal_type = LLTexUnit::getInternalType(mUsage);
@@ -294,7 +330,7 @@ void LLRenderTarget::release()
}
else
{
- LLImageGL::deleteTextures(1, &mDepth, true);
+ LLImageGL::deleteTextures(mUsage, 0, 0, 1, &mDepth, true);
stop_glerror();
}
mDepth = 0;
@@ -326,8 +362,9 @@ void LLRenderTarget::release()
if (mTex.size() > 0)
{
sBytesAllocated -= mResX*mResY*4*mTex.size();
- LLImageGL::deleteTextures(mTex.size(), &mTex[0], true);
+ LLImageGL::deleteTextures(mUsage, mInternalFormat[0], 0, mTex.size(), &mTex[0], true);
mTex.clear();
+ mInternalFormat.clear();
}
mResX = mResY = 0;
diff --git a/indra/llrender/llrendertarget.h b/indra/llrender/llrendertarget.h
index 2735ab21c5..e1a51304f1 100644
--- a/indra/llrender/llrendertarget.h
+++ b/indra/llrender/llrendertarget.h
@@ -57,8 +57,6 @@
*/
-class LLMultisampleBuffer;
-
class LLRenderTarget
{
public:
@@ -74,6 +72,12 @@ public:
//multiple calls will release previously allocated resources
bool allocate(U32 resx, U32 resy, U32 color_fmt, bool depth, bool stencil, LLTexUnit::eTextureType usage = LLTexUnit::TT_TEXTURE, bool use_fbo = false, S32 samples = 0);
+ //resize existing attachments to use new resolution and color format
+ // CAUTION: if the GL runs out of memory attempting to resize, this render target will be undefined
+ // DO NOT use for screen space buffers or for scratch space for an image that might be uploaded
+ // DO use for render targets that resize often and aren't likely to ruin someone's day if they break
+ void resize(U32 resx, U32 resy, U32 color_fmt);
+
//add color buffer attachment
//limit of 4 color attachments per render target
bool addColorAttachment(U32 color_fmt);
@@ -142,6 +146,7 @@ protected:
U32 mResX;
U32 mResY;
std::vector<U32> mTex;
+ std::vector<U32> mInternalFormat;
U32 mFBO;
U32 mDepth;
bool mStencil;
diff --git a/indra/llrender/llshadermgr.cpp b/indra/llrender/llshadermgr.cpp
index 5a6e6cab3e..b6a9a6b653 100644
--- a/indra/llrender/llshadermgr.cpp
+++ b/indra/llrender/llshadermgr.cpp
@@ -643,7 +643,7 @@ GLhandleARB LLShaderMgr::loadShaderFile(const std::string& filename, S32 & shade
text[count++] = strdup("#define textureCube texture\n");
text[count++] = strdup("#define texture2DLod textureLod\n");
text[count++] = strdup("#define shadow2D(a,b) vec2(texture(a,b))\n");
-
+
if (major_version > 1 || minor_version >= 40)
{ //GLSL 1.40 replaces texture2DRect et al with texture
text[count++] = strdup("#define texture2DRect texture\n");
@@ -702,7 +702,7 @@ GLhandleARB LLShaderMgr::loadShaderFile(const std::string& filename, S32 & shade
if (texture_index_channels > 1)
{
- text[count++] = strdup("VARYING_FLAT ivec4 vary_texture_index;\n");
+ text[count++] = strdup("VARYING_FLAT int vary_texture_index;\n");
}
text[count++] = strdup("vec4 diffuseLookup(vec2 texcoord)\n");
@@ -716,20 +716,33 @@ GLhandleARB LLShaderMgr::loadShaderFile(const std::string& filename, S32 & shade
}
else if (major_version > 1 || minor_version >= 30)
{ //switches are supported in GLSL 1.30 and later
- text[count++] = strdup("\tvec4 ret = vec4(1,0,1,1);\n");
- text[count++] = strdup("\tswitch (vary_texture_index.r)\n");
- text[count++] = strdup("\t{\n");
-
- //switch body
- for (S32 i = 0; i < texture_index_channels; ++i)
- {
- std::string case_str = llformat("\t\tcase %d: ret = texture2D(tex%d, texcoord); break;\n", i, i);
- text[count++] = strdup(case_str.c_str());
+ if (gGLManager.mIsNVIDIA)
+ { //switches are unreliable on some NVIDIA drivers
+ for (U32 i = 0; i < texture_index_channels; ++i)
+ {
+ std::string if_string = llformat("\t%sif (vary_texture_index == %d) { return texture2D(tex%d, texcoord); }\n", i > 0 ? "else " : "", i, i);
+ text[count++] = strdup(if_string.c_str());
+ }
+ text[count++] = strdup("\treturn vec4(1,0,1,1);\n");
+ text[count++] = strdup("}\n");
}
+ else
+ {
+ text[count++] = strdup("\tvec4 ret = vec4(1,0,1,1);\n");
+ text[count++] = strdup("\tswitch (vary_texture_index)\n");
+ text[count++] = strdup("\t{\n");
+
+ //switch body
+ for (S32 i = 0; i < texture_index_channels; ++i)
+ {
+ std::string case_str = llformat("\t\tcase %d: return texture2D(tex%d, texcoord);\n", i, i);
+ text[count++] = strdup(case_str.c_str());
+ }
- text[count++] = strdup("\t}\n");
- text[count++] = strdup("\treturn ret;\n");
- text[count++] = strdup("}\n");
+ text[count++] = strdup("\t}\n");
+ text[count++] = strdup("\treturn ret;\n");
+ text[count++] = strdup("}\n");
+ }
}
else
{ //should never get here. Indexed texture rendering requires GLSL 1.30 or later
@@ -1026,6 +1039,9 @@ void LLShaderMgr::initAttribsAndUniforms()
mReservedUniforms.push_back("size");
mReservedUniforms.push_back("falloff");
+ mReservedUniforms.push_back("box_center");
+ mReservedUniforms.push_back("box_size");
+
mReservedUniforms.push_back("minLuminance");
mReservedUniforms.push_back("maxExtractAlpha");
diff --git a/indra/llrender/llshadermgr.h b/indra/llrender/llshadermgr.h
index f792faa8f0..7a16b7c20f 100644
--- a/indra/llrender/llshadermgr.h
+++ b/indra/llrender/llshadermgr.h
@@ -97,6 +97,8 @@ public:
LIGHT_CENTER,
LIGHT_SIZE,
LIGHT_FALLOFF,
+ BOX_CENTER,
+ BOX_SIZE,
GLOW_MIN_LUMINANCE,
GLOW_MAX_EXTRACT_ALPHA,
diff --git a/indra/llrender/llvertexbuffer.cpp b/indra/llrender/llvertexbuffer.cpp
index 823c6b9dc5..28a14b23b9 100644
--- a/indra/llrender/llvertexbuffer.cpp
+++ b/indra/llrender/llvertexbuffer.cpp
@@ -38,12 +38,6 @@
#include "llglslshader.h"
#include "llmemory.h"
-#if LL_DARWIN
-#define LL_VBO_POOLING 1
-#else
-#define LL_VBO_POOLING 0
-#endif
-
//Next Highest Power Of Two
//helper function, returns first number > v that is a power of 2, or v if v is already a power of 2
U32 nhpo2(U32 v)
@@ -71,6 +65,7 @@ U32 wpo2(U32 i)
const U32 LL_VBO_BLOCK_SIZE = 2048;
+const U32 LL_VBO_POOL_MAX_SEED_SIZE = 256*1024;
U32 vbo_block_size(U32 size)
{ //what block size will fit size?
@@ -83,6 +78,7 @@ U32 vbo_block_index(U32 size)
return vbo_block_size(size)/LL_VBO_BLOCK_SIZE;
}
+const U32 LL_VBO_POOL_SEED_COUNT = vbo_block_index(LL_VBO_POOL_MAX_SEED_SIZE);
//============================================================================
@@ -95,6 +91,11 @@ LLVBOPool LLVertexBuffer::sDynamicIBOPool(GL_DYNAMIC_DRAW_ARB, GL_ELEMENT_ARRAY_
U32 LLVBOPool::sBytesPooled = 0;
U32 LLVBOPool::sIndexBytesPooled = 0;
+U32 LLVBOPool::sCurGLName = 1;
+
+std::list<U32> LLVertexBuffer::sAvailableVAOName;
+U32 LLVertexBuffer::sCurVAOName = 1;
+
U32 LLVertexBuffer::sAllocatedIndexBytes = 0;
U32 LLVertexBuffer::sIndexCount = 0;
@@ -119,69 +120,55 @@ bool LLVertexBuffer::sUseStreamDraw = true;
bool LLVertexBuffer::sUseVAO = false;
bool LLVertexBuffer::sPreferStreamDraw = false;
-const U32 FENCE_WAIT_TIME_NANOSECONDS = 10000; //1 ms
-class LLGLSyncFence : public LLGLFence
+U32 LLVBOPool::genBuffer()
{
-public:
-#ifdef GL_ARB_sync
- GLsync mSync;
-#endif
-
- LLGLSyncFence()
- {
-#ifdef GL_ARB_sync
- mSync = 0;
-#endif
- }
+ U32 ret = 0;
- virtual ~LLGLSyncFence()
+ if (mGLNamePool.empty())
{
-#ifdef GL_ARB_sync
- if (mSync)
- {
- glDeleteSync(mSync);
- }
-#endif
+ ret = sCurGLName++;
}
-
- void placeFence()
+ else
{
-#ifdef GL_ARB_sync
- if (mSync)
- {
- glDeleteSync(mSync);
- }
- mSync = glFenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0);
-#endif
+ ret = mGLNamePool.front();
+ mGLNamePool.pop_front();
}
- void wait()
+ return ret;
+}
+
+void LLVBOPool::deleteBuffer(U32 name)
+{
+ if (gGLManager.mInited)
{
-#ifdef GL_ARB_sync
- if (mSync)
- {
- while (glClientWaitSync(mSync, 0, FENCE_WAIT_TIME_NANOSECONDS) == GL_TIMEOUT_EXPIRED)
- { //track the number of times we've waited here
- static S32 waits = 0;
- waits++;
- }
- }
-#endif
- }
+ LLVertexBuffer::unbind();
+ glBindBufferARB(mType, name);
+ glBufferDataARB(mType, 0, NULL, mUsage);
-};
+ llassert(std::find(mGLNamePool.begin(), mGLNamePool.end(), name) == mGLNamePool.end());
+ mGLNamePool.push_back(name);
+
+ glBindBufferARB(mType, 0);
+ }
+}
-volatile U8* LLVBOPool::allocate(U32& name, U32 size)
+
+LLVBOPool::LLVBOPool(U32 vboUsage, U32 vboType)
+: mUsage(vboUsage), mType(vboType)
+{
+ mMissCount.resize(LL_VBO_POOL_SEED_COUNT);
+ std::fill(mMissCount.begin(), mMissCount.end(), 0);
+}
+
+volatile U8* LLVBOPool::allocate(U32& name, U32 size, bool for_seed)
{
llassert(vbo_block_size(size) == size);
volatile U8* ret = NULL;
-#if LL_VBO_POOLING
-
U32 i = vbo_block_index(size);
if (mFreeList.size() <= i)
@@ -189,12 +176,18 @@ volatile U8* LLVBOPool::allocate(U32& name, U32 size)
mFreeList.resize(i+1);
}
- if (mFreeList[i].empty())
+ if (mFreeList[i].empty() || for_seed)
{
//make a new buffer
- glGenBuffersARB(1, &name);
+ name = genBuffer();
+
glBindBufferARB(mType, name);
+ if (!for_seed && i < LL_VBO_POOL_SEED_COUNT)
+ { //record this miss
+ mMissCount[i]++;
+ }
+
if (mType == GL_ARRAY_BUFFER_ARB)
{
LLVertexBuffer::sAllocatedBytes += size;
@@ -215,6 +208,25 @@ volatile U8* LLVBOPool::allocate(U32& name, U32 size)
}
glBindBufferARB(mType, 0);
+
+ if (for_seed)
+ { //put into pool for future use
+ llassert(mFreeList.size() > i);
+
+ Record rec;
+ rec.mGLName = name;
+ rec.mClientData = ret;
+
+ if (mType == GL_ARRAY_BUFFER_ARB)
+ {
+ sBytesPooled += size;
+ }
+ else
+ {
+ sIndexBytesPooled += size;
+ }
+ mFreeList[i].push_back(rec);
+ }
}
else
{
@@ -232,33 +244,6 @@ volatile U8* LLVBOPool::allocate(U32& name, U32 size)
mFreeList[i].pop_front();
}
-#else //no pooling
-
- glGenBuffersARB(1, &name);
- glBindBufferARB(mType, name);
-
- if (mType == GL_ARRAY_BUFFER_ARB)
- {
- LLVertexBuffer::sAllocatedBytes += size;
- }
- else
- {
- LLVertexBuffer::sAllocatedIndexBytes += size;
- }
-
- if (LLVertexBuffer::sDisableVBOMapping || mUsage != GL_DYNAMIC_DRAW_ARB)
- {
- glBufferDataARB(mType, size, 0, mUsage);
- ret = (U8*) ll_aligned_malloc_16(size);
- }
- else
- { //always use a true hint of static draw when allocating non-client-backed buffers
- glBufferDataARB(mType, size, 0, GL_STATIC_DRAW_ARB);
- }
-
- glBindBufferARB(mType, 0);
-
-#endif
return ret;
}
@@ -267,50 +252,49 @@ void LLVBOPool::release(U32 name, volatile U8* buffer, U32 size)
{
llassert(vbo_block_size(size) == size);
-#if LL_VBO_POOLING
-
- U32 i = vbo_block_index(size);
-
- llassert(mFreeList.size() > i);
+ deleteBuffer(name);
+ ll_aligned_free_16((U8*) buffer);
- Record rec;
- rec.mGLName = name;
- rec.mClientData = buffer;
-
- if (buffer == NULL)
+ if (mType == GL_ARRAY_BUFFER_ARB)
{
- glDeleteBuffersARB(1, &rec.mGLName);
+ LLVertexBuffer::sAllocatedBytes -= size;
}
else
{
- if (mType == GL_ARRAY_BUFFER_ARB)
- {
- sBytesPooled += size;
- }
- else
- {
- sIndexBytesPooled += size;
- }
- mFreeList[i].push_back(rec);
+ LLVertexBuffer::sAllocatedIndexBytes -= size;
}
-#else //no pooling
- glDeleteBuffersARB(1, &name);
- ll_aligned_free_16((U8*) buffer);
+}
- if (mType == GL_ARRAY_BUFFER_ARB)
+void LLVBOPool::seedPool()
+{
+ U32 dummy_name = 0;
+
+ if (mFreeList.size() < LL_VBO_POOL_SEED_COUNT)
{
- LLVertexBuffer::sAllocatedBytes -= size;
+ mFreeList.resize(LL_VBO_POOL_SEED_COUNT);
}
- else
+
+ for (U32 i = 0; i < LL_VBO_POOL_SEED_COUNT; i++)
{
- LLVertexBuffer::sAllocatedIndexBytes -= size;
+ if (mMissCount[i] > mFreeList[i].size())
+ {
+ U32 size = i*LL_VBO_BLOCK_SIZE;
+
+ S32 count = mMissCount[i] - mFreeList[i].size();
+ for (U32 j = 0; j < count; ++j)
+ {
+ allocate(dummy_name, size, true);
+ }
+ }
}
-#endif
}
+
+
+
void LLVBOPool::cleanup()
{
- U32 size = 1;
+ U32 size = LL_VBO_BLOCK_SIZE;
for (U32 i = 0; i < mFreeList.size(); ++i)
{
@@ -320,8 +304,8 @@ void LLVBOPool::cleanup()
{
Record& r = l.front();
- glDeleteBuffersARB(1, &r.mGLName);
-
+ deleteBuffer(r.mGLName);
+
if (r.mClientData)
{
ll_aligned_free_16((void*) r.mClientData);
@@ -341,8 +325,11 @@ void LLVBOPool::cleanup()
}
}
- size *= 2;
+ size += LL_VBO_BLOCK_SIZE;
}
+
+ //reset miss counts
+ std::fill(mMissCount.begin(), mMissCount.end(), 0);
}
@@ -376,6 +363,41 @@ U32 LLVertexBuffer::sGLMode[LLRender::NUM_MODES] =
GL_LINE_LOOP,
};
+//static
+U32 LLVertexBuffer::getVAOName()
+{
+ U32 ret = 0;
+
+ if (!sAvailableVAOName.empty())
+ {
+ ret = sAvailableVAOName.front();
+ sAvailableVAOName.pop_front();
+ }
+ else
+ {
+#ifdef GL_ARB_vertex_array_object
+ glGenVertexArrays(1, &ret);
+#endif
+ }
+
+ return ret;
+}
+
+//static
+void LLVertexBuffer::releaseVAOName(U32 name)
+{
+ sAvailableVAOName.push_back(name);
+}
+
+
+//static
+void LLVertexBuffer::seedPools()
+{
+ sStreamVBOPool.seedPool();
+ sDynamicVBOPool.seedPool();
+ sStreamIBOPool.seedPool();
+ sDynamicIBOPool.seedPool();
+}
//static
void LLVertexBuffer::setupClientArrays(U32 data_mask)
@@ -985,7 +1007,7 @@ LLVertexBuffer::~LLVertexBuffer()
if (mGLArray)
{
#if GL_ARB_vertex_array_object
- glDeleteVertexArrays(1, &mGLArray);
+ releaseVAOName(mGLArray);
#endif
}
@@ -1211,10 +1233,10 @@ void LLVertexBuffer::updateNumVerts(S32 nverts)
llassert(nverts >= 0);
- if (nverts >= 65535)
+ if (nverts > 65536)
{
llwarns << "Vertex buffer overflow!" << llendl;
- nverts = 65535;
+ nverts = 65536;
}
U32 needed_size = calcOffsets(mTypeMask, mOffsets, nverts);
@@ -1270,7 +1292,7 @@ void LLVertexBuffer::allocateBuffer(S32 nverts, S32 nindices, bool create)
if (gGLManager.mHasVertexArrayObject && useVBOs() && (LLRender::sGLCoreProfile || sUseVAO))
{
#if GL_ARB_vertex_array_object
- glGenVertexArrays(1, &mGLArray);
+ mGLArray = getVAOName();
#endif
setupVertexArray();
}
@@ -1306,7 +1328,7 @@ void LLVertexBuffer::setupVertexArray()
1, //TYPE_WEIGHT,
4, //TYPE_WEIGHT4,
4, //TYPE_CLOTHWEIGHT,
- 4, //TYPE_TEXTURE_INDEX
+ 1, //TYPE_TEXTURE_INDEX
};
U32 attrib_type[] =
@@ -1323,7 +1345,7 @@ void LLVertexBuffer::setupVertexArray()
GL_FLOAT, //TYPE_WEIGHT,
GL_FLOAT, //TYPE_WEIGHT4,
GL_FLOAT, //TYPE_CLOTHWEIGHT,
- GL_UNSIGNED_BYTE, //TYPE_TEXTURE_INDEX
+ GL_UNSIGNED_INT, //TYPE_TEXTURE_INDEX
};
bool attrib_integer[] =
@@ -2140,6 +2162,16 @@ void LLVertexBuffer::flush()
}
}
+// bind for transform feedback (quick 'n dirty)
+void LLVertexBuffer::bindForFeedback(U32 channel, U32 type, U32 index, U32 count)
+{
+#ifdef GL_TRANSFORM_FEEDBACK_BUFFER
+ U32 offset = mOffsets[type] + sTypeSize[type]*index;
+ U32 size= (sTypeSize[type]*count);
+ glBindBufferRange(GL_TRANSFORM_FEEDBACK_BUFFER, channel, mGLBuffer, offset, size);
+#endif
+}
+
// Set for rendering
void LLVertexBuffer::setBuffer(U32 data_mask)
{
@@ -2291,10 +2323,10 @@ void LLVertexBuffer::setupVertexBuffer(U32 data_mask)
stop_glerror();
volatile U8* base = useVBOs() ? (U8*) mAlignedOffset : mMappedData;
- /*if ((data_mask & mTypeMask) != data_mask)
+ if (gDebugGL && ((data_mask & mTypeMask) != data_mask))
{
llerrs << "LLVertexBuffer::setupVertexBuffer missing required components for supplied data mask." << llendl;
- }*/
+ }
if (LLGLSLShader::sNoFixedFunction)
{
@@ -2370,7 +2402,7 @@ void LLVertexBuffer::setupVertexBuffer(U32 data_mask)
#if !LL_DARWIN
S32 loc = TYPE_TEXTURE_INDEX;
void *ptr = (void*) (base + mOffsets[TYPE_VERTEX] + 12);
- glVertexAttribIPointer(loc, 4, GL_UNSIGNED_BYTE, LLVertexBuffer::sTypeSize[TYPE_VERTEX], ptr);
+ glVertexAttribIPointer(loc, 1, GL_UNSIGNED_INT, LLVertexBuffer::sTypeSize[TYPE_VERTEX], ptr);
#endif
}
if (data_mask & MAP_VERTEX)
diff --git a/indra/llrender/llvertexbuffer.h b/indra/llrender/llvertexbuffer.h
index 7477dec3ad..11fa4ab6a0 100644
--- a/indra/llrender/llvertexbuffer.h
+++ b/indra/llrender/llvertexbuffer.h
@@ -57,23 +57,28 @@ public:
static U32 sBytesPooled;
static U32 sIndexBytesPooled;
- LLVBOPool(U32 vboUsage, U32 vboType)
- : mUsage(vboUsage)
- , mType(vboType)
- {}
+ static U32 sCurGLName;
+ LLVBOPool(U32 vboUsage, U32 vboType);
+
const U32 mUsage;
const U32 mType;
//size MUST be a power of 2
- volatile U8* allocate(U32& name, U32 size);
+ volatile U8* allocate(U32& name, U32 size, bool for_seed = false);
//size MUST be the size provided to allocate that returned the given name
void release(U32 name, volatile U8* buffer, U32 size);
+ //batch allocate buffers to be provided to the application on demand
+ void seedPool();
+
//destroy all records in mFreeList
void cleanup();
+ U32 genBuffer();
+ void deleteBuffer(U32 name);
+
class Record
{
public:
@@ -81,17 +86,15 @@ public:
volatile U8* mClientData;
};
+ std::list<U32> mGLNamePool;
+
typedef std::list<Record> record_list_t;
std::vector<record_list_t> mFreeList;
-};
+ std::vector<U32> mMissCount;
-class LLGLFence
-{
-public:
- virtual void placeFence() = 0;
- virtual void wait() = 0;
};
+
//============================================================================
// base class
class LLPrivateMemoryPool;
@@ -125,13 +128,22 @@ public:
static LLVBOPool sStreamIBOPool;
static LLVBOPool sDynamicIBOPool;
+ static std::list<U32> sAvailableVAOName;
+ static U32 sCurVAOName;
+
static bool sUseStreamDraw;
static bool sUseVAO;
static bool sPreferStreamDraw;
+ static void seedPools();
+
+ static U32 getVAOName();
+ static void releaseVAOName(U32 name);
+
static void initClass(bool use_vbo, bool no_vbo_mapping);
static void cleanupClass();
static void setupClientArrays(U32 data_mask);
+ static void pushPositions(U32 mode, const LLVector4a* pos, U32 count);
static void drawArrays(U32 mode, const std::vector<LLVector3>& pos, const std::vector<LLVector3>& norm);
static void drawElements(U32 mode, const LLVector4a* pos, const LLVector2* tc, S32 num_indices, const U16* indicesp);
@@ -208,7 +220,6 @@ protected:
void destroyGLIndices();
void updateNumVerts(S32 nverts);
void updateNumIndices(S32 nindices);
- bool useVBOs() const;
void unmapBuffer();
public:
@@ -218,6 +229,8 @@ public:
volatile U8* mapVertexBuffer(S32 type, S32 index, S32 count, bool map_range);
volatile U8* mapIndexBuffer(S32 index, S32 count, bool map_range);
+ void bindForFeedback(U32 channel, U32 type, U32 index, U32 count);
+
// set for rendering
virtual void setBuffer(U32 data_mask); // calls setupVertexBuffer() if data_mask is not 0
void flush(); //flush pending data to GL memory
@@ -240,12 +253,14 @@ public:
bool getNormalStrider(LLStrider<LLVector3>& strider, S32 index=0, S32 count = -1, bool map_range = false);
bool getBinormalStrider(LLStrider<LLVector3>& strider, S32 index=0, S32 count = -1, bool map_range = false);
bool getColorStrider(LLStrider<LLColor4U>& strider, S32 index=0, S32 count = -1, bool map_range = false);
+ bool getTextureIndexStrider(LLStrider<LLColor4U>& strider, S32 index=0, S32 count = -1, bool map_range = false);
bool getEmissiveStrider(LLStrider<LLColor4U>& strider, S32 index=0, S32 count = -1, bool map_range = false);
bool getWeightStrider(LLStrider<F32>& strider, S32 index=0, S32 count = -1, bool map_range = false);
bool getWeight4Strider(LLStrider<LLVector4>& strider, S32 index=0, S32 count = -1, bool map_range = false);
bool getClothWeightStrider(LLStrider<LLVector4>& strider, S32 index=0, S32 count = -1, bool map_range = false);
+ bool useVBOs() const;
bool isEmpty() const { return mEmpty; }
bool isLocked() const { return mVertexLocked || mIndexLocked; }
S32 getNumVerts() const { return mNumVerts; }
diff --git a/indra/llui/CMakeLists.txt b/indra/llui/CMakeLists.txt
index 20c3456a56..d92b6aa1c0 100644
--- a/indra/llui/CMakeLists.txt
+++ b/indra/llui/CMakeLists.txt
@@ -23,6 +23,7 @@ include_directories(
${LLWINDOW_INCLUDE_DIRS}
${LLVFS_INCLUDE_DIRS}
${LLXML_INCLUDE_DIRS}
+ ${LIBS_PREBUILD_DIR}/include/hunspell
)
set(llui_SOURCE_FILES
@@ -84,6 +85,7 @@ set(llui_SOURCE_FILES
llsearcheditor.cpp
llslider.cpp
llsliderctrl.cpp
+ llspellcheck.cpp
llspinctrl.cpp
llstatbar.cpp
llstatgraph.cpp
@@ -153,7 +155,6 @@ set(llui_HEADER_FILES
llflyoutbutton.h
llfocusmgr.h
llfunctorregistry.h
- llhandle.h
llhelp.h
lliconctrl.h
llkeywords.h
@@ -191,6 +192,8 @@ set(llui_HEADER_FILES
llscrolllistitem.h
llsliderctrl.h
llslider.h
+ llspellcheck.h
+ llspellcheckmenuhandler.h
llspinctrl.h
llstatbar.h
llstatgraph.h
@@ -260,6 +263,7 @@ target_link_libraries(llui
${LLXUIXML_LIBRARIES}
${LLXML_LIBRARIES}
${LLMATH_LIBRARIES}
+ ${HUNSPELL_LIBRARY}
${LLCOMMON_LIBRARIES} # must be after llimage, llwindow, llrender
)
diff --git a/indra/llui/llcontainerview.cpp b/indra/llui/llcontainerview.cpp
index e08ccb0b78..e08ccb0b78 100644..100755
--- a/indra/llui/llcontainerview.cpp
+++ b/indra/llui/llcontainerview.cpp
diff --git a/indra/llui/lllineeditor.cpp b/indra/llui/lllineeditor.cpp
index d0fbf4b913..48d49af588 100644
--- a/indra/llui/lllineeditor.cpp
+++ b/indra/llui/lllineeditor.cpp
@@ -45,6 +45,7 @@
#include "llkeyboard.h"
#include "llrect.h"
#include "llresmgr.h"
+#include "llspellcheck.h"
#include "llstring.h"
#include "llwindow.h"
#include "llui.h"
@@ -65,6 +66,7 @@ const S32 SCROLL_INCREMENT_ADD = 0; // make space for typing
const S32 SCROLL_INCREMENT_DEL = 4; // make space for baskspacing
const F32 AUTO_SCROLL_TIME = 0.05f;
const F32 TRIPLE_CLICK_INTERVAL = 0.3f; // delay between double and triple click. *TODO: make this equal to the double click interval?
+const F32 SPELLCHECK_DELAY = 0.5f; // delay between the last keypress and spell checking the word the cursor is on
const std::string PASSWORD_ASTERISK( "\xE2\x80\xA2" ); // U+2022 BULLET
@@ -88,6 +90,7 @@ LLLineEditor::Params::Params()
background_image_focused("background_image_focused"),
select_on_focus("select_on_focus", false),
revert_on_esc("revert_on_esc", true),
+ spellcheck("spellcheck", false),
commit_on_focus_lost("commit_on_focus_lost", true),
ignore_tab("ignore_tab", true),
is_password("is_password", false),
@@ -134,6 +137,9 @@ LLLineEditor::LLLineEditor(const LLLineEditor::Params& p)
mIgnoreArrowKeys( FALSE ),
mIgnoreTab( p.ignore_tab ),
mDrawAsterixes( p.is_password ),
+ mSpellCheck( p.spellcheck ),
+ mSpellCheckStart(-1),
+ mSpellCheckEnd(-1),
mSelectAllonFocusReceived( p.select_on_focus ),
mSelectAllonCommit( TRUE ),
mPassDelete(FALSE),
@@ -151,7 +157,8 @@ LLLineEditor::LLLineEditor(const LLLineEditor::Params& p)
mHighlightColor(p.highlight_color()),
mPreeditBgColor(p.preedit_bg_color()),
mGLFont(p.font),
- mContextMenuHandle()
+ mContextMenuHandle(),
+ mAutoreplaceCallback()
{
llassert( mMaxLengthBytes > 0 );
@@ -177,6 +184,12 @@ LLLineEditor::LLLineEditor(const LLLineEditor::Params& p)
updateTextPadding();
setCursor(mText.length());
+ if (mSpellCheck)
+ {
+ LLSpellChecker::setSettingsChangeCallback(boost::bind(&LLLineEditor::onSpellCheckSettingsChange, this));
+ }
+ mSpellCheckTimer.reset();
+
setPrevalidateInput(p.prevalidate_input_callback());
setPrevalidate(p.prevalidate_callback());
@@ -195,7 +208,6 @@ LLLineEditor::~LLLineEditor()
gFocusMgr.releaseFocusIfNeeded( this );
}
-
void LLLineEditor::onFocusReceived()
{
gEditMenuHandler = this;
@@ -519,6 +531,99 @@ void LLLineEditor::selectAll()
updatePrimary();
}
+bool LLLineEditor::getSpellCheck() const
+{
+ return (LLSpellChecker::getUseSpellCheck()) && (!mReadOnly) && (mSpellCheck);
+}
+
+const std::string& LLLineEditor::getSuggestion(U32 index) const
+{
+ return (index < mSuggestionList.size()) ? mSuggestionList[index] : LLStringUtil::null;
+}
+
+U32 LLLineEditor::getSuggestionCount() const
+{
+ return mSuggestionList.size();
+}
+
+void LLLineEditor::replaceWithSuggestion(U32 index)
+{
+ for (std::list<std::pair<U32, U32> >::const_iterator it = mMisspellRanges.begin(); it != mMisspellRanges.end(); ++it)
+ {
+ if ( (it->first <= (U32)mCursorPos) && (it->second >= (U32)mCursorPos) )
+ {
+ deselect();
+
+ // Delete the misspelled word
+ mText.erase(it->first, it->second - it->first);
+
+ // Insert the suggestion in its place
+ LLWString suggestion = utf8str_to_wstring(mSuggestionList[index]);
+ mText.insert(it->first, suggestion);
+ setCursor(it->first + (S32)suggestion.length());
+
+ break;
+ }
+ }
+ mSpellCheckStart = mSpellCheckEnd = -1;
+}
+
+void LLLineEditor::addToDictionary()
+{
+ if (canAddToDictionary())
+ {
+ LLSpellChecker::instance().addToCustomDictionary(getMisspelledWord(mCursorPos));
+ }
+}
+
+bool LLLineEditor::canAddToDictionary() const
+{
+ return (getSpellCheck()) && (isMisspelledWord(mCursorPos));
+}
+
+void LLLineEditor::addToIgnore()
+{
+ if (canAddToIgnore())
+ {
+ LLSpellChecker::instance().addToIgnoreList(getMisspelledWord(mCursorPos));
+ }
+}
+
+bool LLLineEditor::canAddToIgnore() const
+{
+ return (getSpellCheck()) && (isMisspelledWord(mCursorPos));
+}
+
+std::string LLLineEditor::getMisspelledWord(U32 pos) const
+{
+ for (std::list<std::pair<U32, U32> >::const_iterator it = mMisspellRanges.begin(); it != mMisspellRanges.end(); ++it)
+ {
+ if ( (it->first <= pos) && (it->second >= pos) )
+ {
+ return wstring_to_utf8str(mText.getWString().substr(it->first, it->second - it->first));
+ }
+ }
+ return LLStringUtil::null;
+}
+
+bool LLLineEditor::isMisspelledWord(U32 pos) const
+{
+ for (std::list<std::pair<U32, U32> >::const_iterator it = mMisspellRanges.begin(); it != mMisspellRanges.end(); ++it)
+ {
+ if ( (it->first <= pos) && (it->second >= pos) )
+ {
+ return true;
+ }
+ }
+ return false;
+}
+
+void LLLineEditor::onSpellCheckSettingsChange()
+{
+ // Recheck the spelling on every change
+ mMisspellRanges.clear();
+ mSpellCheckStart = mSpellCheckEnd = -1;
+}
BOOL LLLineEditor::handleDoubleClick(S32 x, S32 y, MASK mask)
{
@@ -866,6 +971,12 @@ void LLLineEditor::addChar(const llwchar uni_char)
LLUI::reportBadKeystroke();
}
+ if (!mReadOnly && mAutoreplaceCallback != NULL)
+ {
+ // call callback
+ mAutoreplaceCallback(mText, mCursorPos);
+ }
+
getWindow()->hideCursorUntilMouseMove();
}
@@ -1058,9 +1169,8 @@ void LLLineEditor::cut()
LLUI::reportBadKeystroke();
}
else
- if( mKeystrokeCallback )
{
- mKeystrokeCallback( this );
+ onKeystroke();
}
}
}
@@ -1187,9 +1297,8 @@ void LLLineEditor::pasteHelper(bool is_primary)
LLUI::reportBadKeystroke();
}
else
- if( mKeystrokeCallback )
{
- mKeystrokeCallback( this );
+ onKeystroke();
}
}
}
@@ -1442,9 +1551,10 @@ BOOL LLLineEditor::handleKeyHere(KEY key, MASK mask )
// Notify owner if requested
if (!need_to_rollback && handled)
{
- if (mKeystrokeCallback)
+ onKeystroke();
+ if ( (!selection_modified) && (KEY_BACKSPACE == key) )
{
- mKeystrokeCallback(this);
+ mSpellCheckTimer.setTimerExpirySec(SPELLCHECK_DELAY);
}
}
}
@@ -1497,12 +1607,11 @@ BOOL LLLineEditor::handleUnicodeCharHere(llwchar uni_char)
// Notify owner if requested
if( !need_to_rollback && handled )
{
- if( mKeystrokeCallback )
- {
- // HACK! The only usage of this callback doesn't do anything with the character.
- // We'll have to do something about this if something ever changes! - Doug
- mKeystrokeCallback( this );
- }
+ // HACK! The only usage of this callback doesn't do anything with the character.
+ // We'll have to do something about this if something ever changes! - Doug
+ onKeystroke();
+
+ mSpellCheckTimer.setTimerExpirySec(SPELLCHECK_DELAY);
}
}
return handled;
@@ -1531,9 +1640,7 @@ void LLLineEditor::doDelete()
if (!prevalidateInput(text_to_delete))
{
- if( mKeystrokeCallback )
- mKeystrokeCallback( this );
-
+ onKeystroke();
return;
}
setCursor(getCursor() + 1);
@@ -1549,10 +1656,9 @@ void LLLineEditor::doDelete()
}
else
{
- if( mKeystrokeCallback )
- {
- mKeystrokeCallback( this );
- }
+ onKeystroke();
+
+ mSpellCheckTimer.setTimerExpirySec(SPELLCHECK_DELAY);
}
}
}
@@ -1624,6 +1730,10 @@ void LLLineEditor::draw()
background.stretch( -mBorderThickness );
S32 lineeditor_v_pad = (background.getHeight() - mGLFont->getLineHeight()) / 2;
+ if (mSpellCheck)
+ {
+ lineeditor_v_pad += 1;
+ }
drawBackground();
@@ -1698,14 +1808,14 @@ void LLLineEditor::draw()
{
S32 select_left;
S32 select_right;
- if( mSelectionStart < getCursor() )
+ if (mSelectionStart < mSelectionEnd)
{
select_left = mSelectionStart;
- select_right = getCursor();
+ select_right = mSelectionEnd;
}
else
{
- select_left = getCursor();
+ select_left = mSelectionEnd;
select_right = mSelectionStart;
}
@@ -1749,7 +1859,7 @@ void LLLineEditor::draw()
if( (rendered_pixels_right < (F32)mTextRightEdge) && (rendered_text < text_len) )
{
// unselected, right side
- mGLFont->render(
+ rendered_text += mGLFont->render(
mText, mScrollHPos + rendered_text,
rendered_pixels_right, text_bottom,
text_color,
@@ -1763,7 +1873,7 @@ void LLLineEditor::draw()
}
else
{
- mGLFont->render(
+ rendered_text = mGLFont->render(
mText, mScrollHPos,
rendered_pixels_right, text_bottom,
text_color,
@@ -1778,6 +1888,101 @@ void LLLineEditor::draw()
mBorder->setVisible(FALSE); // no more programmatic art.
#endif
+ if ( (getSpellCheck()) && (mText.length() > 2) )
+ {
+ // Calculate start and end indices for the first and last visible word
+ U32 start = prevWordPos(mScrollHPos), end = nextWordPos(mScrollHPos + rendered_text);
+
+ if ( (mSpellCheckStart != start) || (mSpellCheckEnd != end) )
+ {
+ const LLWString& text = mText.getWString().substr(start, end);
+
+ // Find the start of the first word
+ U32 word_start = 0, word_end = 0;
+ while ( (word_start < text.length()) && (!LLStringOps::isAlpha(text[word_start])) )
+ {
+ word_start++;
+ }
+
+ // Iterate over all words in the text block and check them one by one
+ mMisspellRanges.clear();
+ while (word_start < text.length())
+ {
+ // Find the end of the current word (special case handling for "'" when it's used as a contraction)
+ word_end = word_start + 1;
+ while ( (word_end < text.length()) &&
+ ((LLWStringUtil::isPartOfWord(text[word_end])) ||
+ ((L'\'' == text[word_end]) && (word_end + 1 < text.length()) &&
+ (LLStringOps::isAlnum(text[word_end - 1])) && (LLStringOps::isAlnum(text[word_end + 1])))) )
+ {
+ word_end++;
+ }
+ if (word_end > text.length())
+ {
+ break;
+ }
+
+ // Don't process words shorter than 3 characters
+ std::string word = wstring_to_utf8str(text.substr(word_start, word_end - word_start));
+ if ( (word.length() >= 3) && (!LLSpellChecker::instance().checkSpelling(word)) )
+ {
+ mMisspellRanges.push_back(std::pair<U32, U32>(start + word_start, start + word_end));
+ }
+
+ // Find the start of the next word
+ word_start = word_end + 1;
+ while ( (word_start < text.length()) && (!LLWStringUtil::isPartOfWord(text[word_start])) )
+ {
+ word_start++;
+ }
+ }
+
+ mSpellCheckStart = start;
+ mSpellCheckEnd = end;
+ }
+
+ // Draw squiggly lines under any (visible) misspelled words
+ for (std::list<std::pair<U32, U32> >::const_iterator it = mMisspellRanges.begin(); it != mMisspellRanges.end(); ++it)
+ {
+ // Skip over words that aren't (partially) visible
+ if ( ((it->first < start) && (it->second < start)) || (it->first > end) )
+ {
+ continue;
+ }
+
+ // Skip the current word if the user is still busy editing it
+ if ( (!mSpellCheckTimer.hasExpired()) && (it->first <= (U32)mCursorPos) && (it->second >= (U32)mCursorPos) )
+ {
+ continue;
+ }
+
+ S32 pxWidth = getRect().getWidth();
+ S32 pxStart = findPixelNearestPos(it->first - getCursor());
+ if (pxStart > pxWidth)
+ {
+ continue;
+ }
+ S32 pxEnd = findPixelNearestPos(it->second - getCursor());
+ if (pxEnd > pxWidth)
+ {
+ pxEnd = pxWidth;
+ }
+
+ S32 pxBottom = (S32)(text_bottom + mGLFont->getDescenderHeight());
+
+ gGL.color4ub(255, 0, 0, 200);
+ while (pxStart + 1 < pxEnd)
+ {
+ gl_line_2d(pxStart, pxBottom, pxStart + 2, pxBottom - 2);
+ if (pxStart + 3 < pxEnd)
+ {
+ gl_line_2d(pxStart + 2, pxBottom - 3, pxStart + 4, pxBottom - 1);
+ }
+ pxStart += 4;
+ }
+ }
+ }
+
// If we're editing...
if( hasFocus())
{
@@ -2109,6 +2314,15 @@ void LLLineEditor::setSelectAllonFocusReceived(BOOL b)
mSelectAllonFocusReceived = b;
}
+void LLLineEditor::onKeystroke()
+{
+ if (mKeystrokeCallback)
+ {
+ mKeystrokeCallback(this);
+ }
+
+ mSpellCheckStart = mSpellCheckEnd = -1;
+}
void LLLineEditor::setKeystrokeCallback(callback_t callback, void* user_data)
{
@@ -2231,10 +2445,9 @@ void LLLineEditor::updatePreedit(const LLWString &preedit_string,
// Update of the preedit should be caused by some key strokes.
mKeystrokeTimer.reset();
- if( mKeystrokeCallback )
- {
- mKeystrokeCallback( this );
- }
+ onKeystroke();
+
+ mSpellCheckTimer.setTimerExpirySec(SPELLCHECK_DELAY);
}
BOOL LLLineEditor::getPreeditLocation(S32 query_offset, LLCoordGL *coord, LLRect *bounds, LLRect *control) const
@@ -2386,7 +2599,38 @@ void LLLineEditor::showContextMenu(S32 x, S32 y)
S32 screen_x, screen_y;
localPointToScreen(x, y, &screen_x, &screen_y);
- menu->show(screen_x, screen_y);
+
+ setCursorAtLocalPos(x);
+ if (hasSelection())
+ {
+ if ( (mCursorPos < llmin(mSelectionStart, mSelectionEnd)) || (mCursorPos > llmax(mSelectionStart, mSelectionEnd)) )
+ {
+ deselect();
+ }
+ else
+ {
+ setCursor(llmax(mSelectionStart, mSelectionEnd));
+ }
+ }
+
+ bool use_spellcheck = getSpellCheck(), is_misspelled = false;
+ if (use_spellcheck)
+ {
+ mSuggestionList.clear();
+
+ // If the cursor is on a misspelled word, retrieve suggestions for it
+ std::string misspelled_word = getMisspelledWord(mCursorPos);
+ if ((is_misspelled = !misspelled_word.empty()) == true)
+ {
+ LLSpellChecker::instance().getSuggestions(misspelled_word, mSuggestionList);
+ }
+ }
+
+ menu->setItemVisible("Suggestion Separator", (use_spellcheck) && (!mSuggestionList.empty()));
+ menu->setItemVisible("Add to Dictionary", (use_spellcheck) && (is_misspelled));
+ menu->setItemVisible("Add to Ignore", (use_spellcheck) && (is_misspelled));
+ menu->setItemVisible("Spellcheck Separator", (use_spellcheck) && (is_misspelled));
+ menu->show(screen_x, screen_y, this);
}
}
diff --git a/indra/llui/lllineeditor.h b/indra/llui/lllineeditor.h
index 2518dbe3c7..71dd53f608 100644
--- a/indra/llui/lllineeditor.h
+++ b/indra/llui/lllineeditor.h
@@ -40,6 +40,7 @@
#include "llframetimer.h"
#include "lleditmenuhandler.h"
+#include "llspellcheckmenuhandler.h"
#include "lluictrl.h"
#include "lluiimage.h"
#include "lluistring.h"
@@ -54,7 +55,7 @@ class LLButton;
class LLContextMenu;
class LLLineEditor
-: public LLUICtrl, public LLEditMenuHandler, protected LLPreeditor
+: public LLUICtrl, public LLEditMenuHandler, protected LLPreeditor, public LLSpellCheckMenuHandler
{
public:
@@ -86,6 +87,7 @@ public:
Optional<bool> select_on_focus,
revert_on_esc,
+ spellcheck,
commit_on_focus_lost,
ignore_tab,
is_password;
@@ -146,6 +148,24 @@ public:
virtual void deselect();
virtual BOOL canDeselect() const;
+ // LLSpellCheckMenuHandler overrides
+ /*virtual*/ bool getSpellCheck() const;
+
+ /*virtual*/ const std::string& getSuggestion(U32 index) const;
+ /*virtual*/ U32 getSuggestionCount() const;
+ /*virtual*/ void replaceWithSuggestion(U32 index);
+
+ /*virtual*/ void addToDictionary();
+ /*virtual*/ bool canAddToDictionary() const;
+
+ /*virtual*/ void addToIgnore();
+ /*virtual*/ bool canAddToIgnore() const;
+
+ // Spell checking helper functions
+ std::string getMisspelledWord(U32 pos) const;
+ bool isMisspelledWord(U32 pos) const;
+ void onSpellCheckSettingsChange();
+
// view overrides
virtual void draw();
virtual void reshape(S32 width,S32 height,BOOL called_from_parent=TRUE);
@@ -169,6 +189,9 @@ public:
virtual BOOL setTextArg( const std::string& key, const LLStringExplicit& text );
virtual BOOL setLabelArg( const std::string& key, const LLStringExplicit& text );
+ typedef boost::function<void(LLUIString&, S32&)> autoreplace_callback_t;
+ autoreplace_callback_t mAutoreplaceCallback;
+ void setAutoreplaceCallback(autoreplace_callback_t cb) { mAutoreplaceCallback = cb; }
void setLabel(const LLStringExplicit &new_label) { mLabel = new_label; }
const std::string& getLabel() { return mLabel.getString(); }
@@ -223,6 +246,7 @@ public:
void setSelectAllonFocusReceived(BOOL b);
void setSelectAllonCommit(BOOL b) { mSelectAllonCommit = b; }
+ void onKeystroke();
typedef boost::function<void (LLLineEditor* caller, void* user_data)> callback_t;
void setKeystrokeCallback(callback_t callback, void* user_data);
@@ -322,6 +346,13 @@ protected:
S32 mLastSelectionStart;
S32 mLastSelectionEnd;
+ bool mSpellCheck;
+ S32 mSpellCheckStart;
+ S32 mSpellCheckEnd;
+ LLTimer mSpellCheckTimer;
+ std::list<std::pair<U32, U32> > mMisspellRanges;
+ std::vector<std::string> mSuggestionList;
+
LLTextValidate::validate_func_t mPrevalidateFunc;
LLTextValidate::validate_func_t mPrevalidateInputFunc;
diff --git a/indra/llui/llmenugl.cpp b/indra/llui/llmenugl.cpp
index ff6928ffda..efb9848a90 100644
--- a/indra/llui/llmenugl.cpp
+++ b/indra/llui/llmenugl.cpp
@@ -3854,7 +3854,7 @@ void LLContextMenu::setVisible(BOOL visible)
}
// Takes cursor position in screen space?
-void LLContextMenu::show(S32 x, S32 y)
+void LLContextMenu::show(S32 x, S32 y, LLView* spawning_view)
{
if (getChildList()->empty())
{
@@ -3908,6 +3908,14 @@ void LLContextMenu::show(S32 x, S32 y)
setRect(rect);
arrange();
+ if (spawning_view)
+ {
+ mSpawningViewHandle = spawning_view->getHandle();
+ }
+ else
+ {
+ mSpawningViewHandle.markDead();
+ }
LLView::setVisible(TRUE);
}
diff --git a/indra/llui/llmenugl.h b/indra/llui/llmenugl.h
index 36f3ba34b9..67b3e1fbe6 100644
--- a/indra/llui/llmenugl.h
+++ b/indra/llui/llmenugl.h
@@ -670,7 +670,7 @@ public:
virtual void draw ();
- virtual void show (S32 x, S32 y);
+ virtual void show (S32 x, S32 y, LLView* spawning_view = NULL);
virtual void hide ();
virtual BOOL handleHover ( S32 x, S32 y, MASK mask );
@@ -683,10 +683,14 @@ public:
LLHandle<LLContextMenu> getHandle() { return getDerivedHandle<LLContextMenu>(); }
+ LLView* getSpawningView() const { return mSpawningViewHandle.get(); }
+ void setSpawningView(LLHandle<LLView> spawning_view) { mSpawningViewHandle = spawning_view; }
+
protected:
BOOL mHoveredAnyItem;
LLMenuItemGL* mHoverItem;
LLRootHandle<LLContextMenu> mHandle;
+ LLHandle<LLView> mSpawningViewHandle;
};
diff --git a/indra/llui/llnotifications.cpp b/indra/llui/llnotifications.cpp
index 09480968a6..629eef2c3b 100644
--- a/indra/llui/llnotifications.cpp
+++ b/indra/llui/llnotifications.cpp
@@ -1488,6 +1488,10 @@ bool LLNotifications::loadTemplates()
{
replaceFormText(notification.form_ref.form, "$canceltext", notification.form_ref.form_template.cancel_text);
}
+ if(notification.form_ref.form_template.help_text.isProvided())
+ {
+ replaceFormText(notification.form_ref.form, "$helptext", notification.form_ref.form_template.help_text);
+ }
if(notification.form_ref.form_template.ignore_text.isProvided())
{
replaceFormText(notification.form_ref.form, "$ignoretext", notification.form_ref.form_template.ignore_text);
diff --git a/indra/llui/llnotificationtemplate.h b/indra/llui/llnotificationtemplate.h
index 72973789db..b3b0bae862 100644
--- a/indra/llui/llnotificationtemplate.h
+++ b/indra/llui/llnotificationtemplate.h
@@ -121,6 +121,7 @@ struct LLNotificationTemplate
Optional<std::string> yes_text,
no_text,
cancel_text,
+ help_text,
ignore_text;
TemplateRef()
@@ -128,6 +129,7 @@ struct LLNotificationTemplate
yes_text("yestext"),
no_text("notext"),
cancel_text("canceltext"),
+ help_text("helptext"),
ignore_text("ignoretext")
{}
};
diff --git a/indra/llui/llscrollcontainer.cpp b/indra/llui/llscrollcontainer.cpp
index 9b7e30bb04..2fd187a526 100644
--- a/indra/llui/llscrollcontainer.cpp
+++ b/indra/llui/llscrollcontainer.cpp
@@ -389,12 +389,11 @@ void LLScrollContainer::calcVisibleSize( S32 *visible_width, S32 *visible_height
{
*show_h_scrollbar = TRUE;
*visible_height -= scrollbar_size;
-
+ // Note: Do *not* recompute *show_v_scrollbar here because with
// The view inside the scroll container should not be extended
// to container's full height to ensure the correct computation
// of *show_v_scrollbar after subtracting horizontal scrollbar_size.
- // Must retest now that visible_height has changed
if( !*show_v_scrollbar && ((doc_height - *visible_height) > 1) )
{
*show_v_scrollbar = TRUE;
diff --git a/indra/llui/llscrolllistctrl.cpp b/indra/llui/llscrolllistctrl.cpp
index b3e1b63db5..b3499693dd 100644
--- a/indra/llui/llscrolllistctrl.cpp
+++ b/indra/llui/llscrolllistctrl.cpp
@@ -389,6 +389,22 @@ std::vector<LLScrollListItem*> LLScrollListCtrl::getAllSelected() const
return ret;
}
+S32 LLScrollListCtrl::getNumSelected() const
+{
+ S32 numSelected = 0;
+
+ for(item_list::const_iterator iter = mItemList.begin(); iter != mItemList.end(); ++iter)
+ {
+ LLScrollListItem* item = *iter;
+ if (item->getSelected())
+ {
+ ++numSelected;
+ }
+ }
+
+ return numSelected;
+}
+
S32 LLScrollListCtrl::getFirstSelectedIndex() const
{
S32 CurSelectedIndex = 0;
@@ -2704,6 +2720,11 @@ BOOL LLScrollListCtrl::hasSortOrder() const
return !mSortColumns.empty();
}
+void LLScrollListCtrl::clearSortOrder()
+{
+ mSortColumns.clear();
+}
+
void LLScrollListCtrl::clearColumns()
{
column_map_t::iterator itor;
diff --git a/indra/llui/llscrolllistctrl.h b/indra/llui/llscrolllistctrl.h
index ae8aea9245..e83794e173 100644
--- a/indra/llui/llscrolllistctrl.h
+++ b/indra/llui/llscrolllistctrl.h
@@ -257,6 +257,7 @@ public:
LLScrollListItem* getFirstSelected() const;
virtual S32 getFirstSelectedIndex() const;
std::vector<LLScrollListItem*> getAllSelected() const;
+ S32 getNumSelected() const;
LLScrollListItem* getLastSelectedItem() const { return mLastSelected; }
// iterate over all items
@@ -373,6 +374,7 @@ public:
std::string getSortColumnName();
BOOL getSortAscending() { return mSortColumns.empty() ? TRUE : mSortColumns.back().second; }
BOOL hasSortOrder() const;
+ void clearSortOrder();
S32 selectMultiple( uuid_vec_t ids );
// conceptually const, but mutates mItemList
diff --git a/indra/llui/llspellcheck.cpp b/indra/llui/llspellcheck.cpp
new file mode 100644
index 0000000000..a189375fbe
--- /dev/null
+++ b/indra/llui/llspellcheck.cpp
@@ -0,0 +1,505 @@
+/**
+ * @file llspellcheck.cpp
+ * @brief Spell checking functionality
+ *
+ * $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 "lldir.h"
+#include "llsdserialize.h"
+
+#include "llspellcheck.h"
+#if LL_WINDOWS
+ #include <hunspell/hunspelldll.h>
+ #pragma comment(lib, "libhunspell.lib")
+#else
+ #include <hunspell/hunspell.hxx>
+#endif
+
+static const std::string DICT_DIR = "dictionaries";
+static const std::string DICT_FILE_CUSTOM = "user_custom.dic";
+static const std::string DICT_FILE_IGNORE = "user_ignore.dic";
+
+static const std::string DICT_FILE_MAIN = "dictionaries.xml";
+static const std::string DICT_FILE_USER = "user_dictionaries.xml";
+
+LLSD LLSpellChecker::sDictMap;
+LLSpellChecker::settings_change_signal_t LLSpellChecker::sSettingsChangeSignal;
+
+LLSpellChecker::LLSpellChecker()
+ : mHunspell(NULL)
+{
+ // Load initial dictionary information
+ refreshDictionaryMap();
+}
+
+LLSpellChecker::~LLSpellChecker()
+{
+ delete mHunspell;
+}
+
+bool LLSpellChecker::checkSpelling(const std::string& word) const
+{
+ if ( (!mHunspell) || (word.length() < 3) || (0 != mHunspell->spell(word.c_str())) )
+ {
+ return true;
+ }
+ if (mIgnoreList.size() > 0)
+ {
+ std::string word_lower(word);
+ LLStringUtil::toLower(word_lower);
+ return (mIgnoreList.end() != std::find(mIgnoreList.begin(), mIgnoreList.end(), word_lower));
+ }
+ return false;
+}
+
+S32 LLSpellChecker::getSuggestions(const std::string& word, std::vector<std::string>& suggestions) const
+{
+ suggestions.clear();
+ if ( (!mHunspell) || (word.length() < 3) )
+ {
+ return 0;
+ }
+
+ char** suggestion_list; int suggestion_cnt = 0;
+ if ( (suggestion_cnt = mHunspell->suggest(&suggestion_list, word.c_str())) != 0 )
+ {
+ for (int suggestion_index = 0; suggestion_index < suggestion_cnt; suggestion_index++)
+ {
+ suggestions.push_back(suggestion_list[suggestion_index]);
+ }
+ mHunspell->free_list(&suggestion_list, suggestion_cnt);
+ }
+ return suggestions.size();
+}
+
+// static
+const LLSD LLSpellChecker::getDictionaryData(const std::string& dict_language)
+{
+ for (LLSD::array_const_iterator it = sDictMap.beginArray(); it != sDictMap.endArray(); ++it)
+ {
+ const LLSD& dict_entry = *it;
+ if (dict_language == dict_entry["language"].asString())
+ {
+ return dict_entry;
+ }
+ }
+ return LLSD();
+}
+
+// static
+bool LLSpellChecker::hasDictionary(const std::string& dict_language, bool check_installed)
+{
+ const LLSD dict_info = getDictionaryData(dict_language);
+ return dict_info.has("language") && ( (!check_installed) || (dict_info["installed"].asBoolean()) );
+}
+
+// static
+void LLSpellChecker::setDictionaryData(const LLSD& dict_info)
+{
+ const std::string dict_language = dict_info["language"].asString();
+ if (dict_language.empty())
+ {
+ return;
+ }
+
+ for (LLSD::array_iterator it = sDictMap.beginArray(); it != sDictMap.endArray(); ++it)
+ {
+ LLSD& dict_entry = *it;
+ if (dict_language == dict_entry["language"].asString())
+ {
+ dict_entry = dict_info;
+ return;
+ }
+ }
+ sDictMap.append(dict_info);
+ return;
+}
+
+// static
+void LLSpellChecker::refreshDictionaryMap()
+{
+ const std::string app_path = getDictionaryAppPath();
+ const std::string user_path = getDictionaryUserPath();
+
+ // Load dictionary information (file name, friendly name, ...)
+ llifstream user_file(user_path + DICT_FILE_MAIN, std::ios::binary);
+ if ( (!user_file.is_open()) || (0 == LLSDSerialize::fromXMLDocument(sDictMap, user_file)) || (0 == sDictMap.size()) )
+ {
+ llifstream app_file(app_path + DICT_FILE_MAIN, std::ios::binary);
+ if ( (!app_file.is_open()) || (0 == LLSDSerialize::fromXMLDocument(sDictMap, app_file)) || (0 == sDictMap.size()) )
+ {
+ return;
+ }
+ }
+
+ // Load user installed dictionary information
+ llifstream custom_file(user_path + DICT_FILE_USER, std::ios::binary);
+ if (custom_file.is_open())
+ {
+ LLSD custom_dict_map;
+ LLSDSerialize::fromXMLDocument(custom_dict_map, custom_file);
+ for (LLSD::array_iterator it = custom_dict_map.beginArray(); it != custom_dict_map.endArray(); ++it)
+ {
+ LLSD& dict_info = *it;
+ dict_info["user_installed"] = true;
+ setDictionaryData(dict_info);
+ }
+ custom_file.close();
+ }
+
+ // Look for installed dictionaries
+ std::string tmp_app_path, tmp_user_path;
+ for (LLSD::array_iterator it = sDictMap.beginArray(); it != sDictMap.endArray(); ++it)
+ {
+ LLSD& sdDict = *it;
+ tmp_app_path = (sdDict.has("name")) ? app_path + sdDict["name"].asString() : LLStringUtil::null;
+ tmp_user_path = (sdDict.has("name")) ? user_path + sdDict["name"].asString() : LLStringUtil::null;
+ sdDict["installed"] =
+ (!tmp_app_path.empty()) && ((gDirUtilp->fileExists(tmp_user_path + ".dic")) || (gDirUtilp->fileExists(tmp_app_path + ".dic")));
+ }
+
+ sSettingsChangeSignal();
+}
+
+void LLSpellChecker::addToCustomDictionary(const std::string& word)
+{
+ if (mHunspell)
+ {
+ mHunspell->add(word.c_str());
+ }
+ addToDictFile(getDictionaryUserPath() + DICT_FILE_CUSTOM, word);
+ sSettingsChangeSignal();
+}
+
+void LLSpellChecker::addToIgnoreList(const std::string& word)
+{
+ std::string word_lower(word);
+ LLStringUtil::toLower(word_lower);
+ if (mIgnoreList.end() == std::find(mIgnoreList.begin(), mIgnoreList.end(), word_lower))
+ {
+ mIgnoreList.push_back(word_lower);
+ addToDictFile(getDictionaryUserPath() + DICT_FILE_IGNORE, word_lower);
+ sSettingsChangeSignal();
+ }
+}
+
+void LLSpellChecker::addToDictFile(const std::string& dict_path, const std::string& word)
+{
+ std::vector<std::string> word_list;
+
+ if (gDirUtilp->fileExists(dict_path))
+ {
+ llifstream file_in(dict_path, std::ios::in);
+ if (file_in.is_open())
+ {
+ std::string word; int line_num = 0;
+ while (getline(file_in, word))
+ {
+ // Skip over the first line since that's just a line count
+ if (0 != line_num)
+ {
+ word_list.push_back(word);
+ }
+ line_num++;
+ }
+ }
+ else
+ {
+ // TODO: show error message?
+ return;
+ }
+ }
+
+ word_list.push_back(word);
+
+ llofstream file_out(dict_path, std::ios::out | std::ios::trunc);
+ if (file_out.is_open())
+ {
+ file_out << word_list.size() << std::endl;
+ for (std::vector<std::string>::const_iterator itWord = word_list.begin(); itWord != word_list.end(); ++itWord)
+ {
+ file_out << *itWord << std::endl;
+ }
+ file_out.close();
+ }
+}
+
+bool LLSpellChecker::isActiveDictionary(const std::string& dict_language) const
+{
+ return
+ (mDictLanguage == dict_language) ||
+ (mDictSecondary.end() != std::find(mDictSecondary.begin(), mDictSecondary.end(), dict_language));
+}
+
+void LLSpellChecker::setSecondaryDictionaries(dict_list_t dict_list)
+{
+ if (!getUseSpellCheck())
+ {
+ return;
+ }
+
+ // Check if we're only adding secondary dictionaries, or removing them
+ dict_list_t dict_add(llmax(dict_list.size(), mDictSecondary.size())), dict_rem(llmax(dict_list.size(), mDictSecondary.size()));
+ dict_list.sort();
+ mDictSecondary.sort();
+ dict_list_t::iterator end_added = std::set_difference(dict_list.begin(), dict_list.end(), mDictSecondary.begin(), mDictSecondary.end(), dict_add.begin());
+ dict_list_t::iterator end_removed = std::set_difference(mDictSecondary.begin(), mDictSecondary.end(), dict_list.begin(), dict_list.end(), dict_rem.begin());
+
+ if (end_removed != dict_rem.begin()) // We can't remove secondary dictionaries so we need to recreate the Hunspell instance
+ {
+ mDictSecondary = dict_list;
+
+ std::string dict_language = mDictLanguage;
+ initHunspell(dict_language);
+ }
+ else if (end_added != dict_add.begin()) // Add the new secondary dictionaries one by one
+ {
+ const std::string app_path = getDictionaryAppPath();
+ const std::string user_path = getDictionaryUserPath();
+ for (dict_list_t::const_iterator it_added = dict_add.begin(); it_added != end_added; ++it_added)
+ {
+ const LLSD dict_entry = getDictionaryData(*it_added);
+ if ( (!dict_entry.isDefined()) || (!dict_entry["installed"].asBoolean()) )
+ {
+ continue;
+ }
+
+ const std::string strFileDic = dict_entry["name"].asString() + ".dic";
+ if (gDirUtilp->fileExists(user_path + strFileDic))
+ {
+ mHunspell->add_dic((user_path + strFileDic).c_str());
+ }
+ else if (gDirUtilp->fileExists(app_path + strFileDic))
+ {
+ mHunspell->add_dic((app_path + strFileDic).c_str());
+ }
+ }
+ mDictSecondary = dict_list;
+ sSettingsChangeSignal();
+ }
+}
+
+void LLSpellChecker::initHunspell(const std::string& dict_language)
+{
+ if (mHunspell)
+ {
+ delete mHunspell;
+ mHunspell = NULL;
+ mDictLanguage.clear();
+ mDictFile.clear();
+ mIgnoreList.clear();
+ }
+
+ const LLSD dict_entry = (!dict_language.empty()) ? getDictionaryData(dict_language) : LLSD();
+ if ( (!dict_entry.isDefined()) || (!dict_entry["installed"].asBoolean()) || (!dict_entry["is_primary"].asBoolean()))
+ {
+ sSettingsChangeSignal();
+ return;
+ }
+
+ const std::string app_path = getDictionaryAppPath();
+ const std::string user_path = getDictionaryUserPath();
+ if (dict_entry.has("name"))
+ {
+ const std::string filename_aff = dict_entry["name"].asString() + ".aff";
+ const std::string filename_dic = dict_entry["name"].asString() + ".dic";
+ if ( (gDirUtilp->fileExists(user_path + filename_aff)) && (gDirUtilp->fileExists(user_path + filename_dic)) )
+ {
+ mHunspell = new Hunspell((user_path + filename_aff).c_str(), (user_path + filename_dic).c_str());
+ }
+ else if ( (gDirUtilp->fileExists(app_path + filename_aff)) && (gDirUtilp->fileExists(app_path + filename_dic)) )
+ {
+ mHunspell = new Hunspell((app_path + filename_aff).c_str(), (app_path + filename_dic).c_str());
+ }
+ if (!mHunspell)
+ {
+ return;
+ }
+
+ mDictLanguage = dict_language;
+ mDictFile = dict_entry["name"].asString();
+
+ if (gDirUtilp->fileExists(user_path + DICT_FILE_CUSTOM))
+ {
+ mHunspell->add_dic((user_path + DICT_FILE_CUSTOM).c_str());
+ }
+
+ if (gDirUtilp->fileExists(user_path + DICT_FILE_IGNORE))
+ {
+ llifstream file_in(user_path + DICT_FILE_IGNORE, std::ios::in);
+ if (file_in.is_open())
+ {
+ std::string word; int idxLine = 0;
+ while (getline(file_in, word))
+ {
+ // Skip over the first line since that's just a line count
+ if (0 != idxLine)
+ {
+ LLStringUtil::toLower(word);
+ mIgnoreList.push_back(word);
+ }
+ idxLine++;
+ }
+ }
+ }
+
+ for (dict_list_t::const_iterator it = mDictSecondary.begin(); it != mDictSecondary.end(); ++it)
+ {
+ const LLSD dict_entry = getDictionaryData(*it);
+ if ( (!dict_entry.isDefined()) || (!dict_entry["installed"].asBoolean()) )
+ {
+ continue;
+ }
+
+ const std::string filename_dic = dict_entry["name"].asString() + ".dic";
+ if (gDirUtilp->fileExists(user_path + filename_dic))
+ {
+ mHunspell->add_dic((user_path + filename_dic).c_str());
+ }
+ else if (gDirUtilp->fileExists(app_path + filename_dic))
+ {
+ mHunspell->add_dic((app_path + filename_dic).c_str());
+ }
+ }
+ }
+
+ sSettingsChangeSignal();
+}
+
+// static
+const std::string LLSpellChecker::getDictionaryAppPath()
+{
+ std::string dict_path = gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, DICT_DIR, "");
+ return dict_path;
+}
+
+// static
+const std::string LLSpellChecker::getDictionaryUserPath()
+{
+ std::string dict_path = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, DICT_DIR, "");
+ if (!gDirUtilp->fileExists(dict_path))
+ {
+ LLFile::mkdir(dict_path);
+ }
+ return dict_path;
+}
+
+// static
+bool LLSpellChecker::getUseSpellCheck()
+{
+ return (LLSpellChecker::instanceExists()) && (LLSpellChecker::instance().mHunspell);
+}
+
+// static
+bool LLSpellChecker::canRemoveDictionary(const std::string& dict_language)
+{
+ // Only user-installed inactive dictionaries can be removed
+ const LLSD dict_info = getDictionaryData(dict_language);
+ return
+ (dict_info["user_installed"].asBoolean()) &&
+ ( (!getUseSpellCheck()) || (!LLSpellChecker::instance().isActiveDictionary(dict_language)) );
+}
+
+// static
+void LLSpellChecker::removeDictionary(const std::string& dict_language)
+{
+ if (!canRemoveDictionary(dict_language))
+ {
+ return;
+ }
+
+ LLSD dict_map = loadUserDictionaryMap();
+ for (LLSD::array_const_iterator it = dict_map.beginArray(); it != dict_map.endArray(); ++it)
+ {
+ const LLSD& dict_info = *it;
+ if (dict_info["language"].asString() == dict_language)
+ {
+ const std::string dict_dic = getDictionaryUserPath() + dict_info["name"].asString() + ".dic";
+ if (gDirUtilp->fileExists(dict_dic))
+ {
+ LLFile::remove(dict_dic);
+ }
+ const std::string dict_aff = getDictionaryUserPath() + dict_info["name"].asString() + ".aff";
+ if (gDirUtilp->fileExists(dict_aff))
+ {
+ LLFile::remove(dict_aff);
+ }
+ dict_map.erase(it - dict_map.beginArray());
+ break;
+ }
+ }
+ saveUserDictionaryMap(dict_map);
+
+ refreshDictionaryMap();
+}
+
+// static
+LLSD LLSpellChecker::loadUserDictionaryMap()
+{
+ LLSD dict_map;
+ llifstream dict_file(getDictionaryUserPath() + DICT_FILE_USER, std::ios::binary);
+ if (dict_file.is_open())
+ {
+ LLSDSerialize::fromXMLDocument(dict_map, dict_file);
+ dict_file.close();
+ }
+ return dict_map;
+}
+
+// static
+void LLSpellChecker::saveUserDictionaryMap(const LLSD& dict_map)
+{
+ llofstream dict_file(getDictionaryUserPath() + DICT_FILE_USER, std::ios::trunc);
+ if (dict_file.is_open())
+ {
+ LLSDSerialize::toPrettyXML(dict_map, dict_file);
+ dict_file.close();
+ }
+}
+
+// static
+boost::signals2::connection LLSpellChecker::setSettingsChangeCallback(const settings_change_signal_t::slot_type& cb)
+{
+ return sSettingsChangeSignal.connect(cb);
+}
+
+// static
+void LLSpellChecker::setUseSpellCheck(const std::string& dict_language)
+{
+ if ( (((dict_language.empty()) && (getUseSpellCheck())) || (!dict_language.empty())) &&
+ (LLSpellChecker::instance().mDictLanguage != dict_language) )
+ {
+ LLSpellChecker::instance().initHunspell(dict_language);
+ }
+}
+
+// static
+void LLSpellChecker::initClass()
+{
+ if (sDictMap.isUndefined())
+ {
+ refreshDictionaryMap();
+ }
+}
diff --git a/indra/llui/llspellcheck.h b/indra/llui/llspellcheck.h
new file mode 100644
index 0000000000..4ab80195ea
--- /dev/null
+++ b/indra/llui/llspellcheck.h
@@ -0,0 +1,93 @@
+/**
+ * @file llspellcheck.h
+ * @brief Spell checking functionality
+ *
+ * $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 LLSPELLCHECK_H
+#define LLSPELLCHECK_H
+
+#include "llsingleton.h"
+#include "llui.h"
+#include <boost/signals2.hpp>
+
+class Hunspell;
+
+class LLSpellChecker : public LLSingleton<LLSpellChecker>, public LLInitClass<LLSpellChecker>
+{
+ friend class LLSingleton<LLSpellChecker>;
+ friend class LLInitClass<LLSpellChecker>;
+protected:
+ LLSpellChecker();
+ ~LLSpellChecker();
+
+public:
+ void addToCustomDictionary(const std::string& word);
+ void addToIgnoreList(const std::string& word);
+ bool checkSpelling(const std::string& word) const;
+ S32 getSuggestions(const std::string& word, std::vector<std::string>& suggestions) const;
+protected:
+ void addToDictFile(const std::string& dict_path, const std::string& word);
+ void initHunspell(const std::string& dict_language);
+
+public:
+ typedef std::list<std::string> dict_list_t;
+
+ const std::string& getPrimaryDictionary() const { return mDictLanguage; }
+ const dict_list_t& getSecondaryDictionaries() const { return mDictSecondary; }
+ bool isActiveDictionary(const std::string& dict_language) const;
+ void setSecondaryDictionaries(dict_list_t dict_list);
+
+ static bool canRemoveDictionary(const std::string& dict_language);
+ static const std::string getDictionaryAppPath();
+ static const std::string getDictionaryUserPath();
+ static const LLSD getDictionaryData(const std::string& dict_language);
+ static const LLSD& getDictionaryMap() { return sDictMap; }
+ static bool getUseSpellCheck();
+ static bool hasDictionary(const std::string& dict_language, bool check_installed = false);
+ static void refreshDictionaryMap();
+ static void removeDictionary(const std::string& dict_language);
+ static void setUseSpellCheck(const std::string& dict_language);
+protected:
+ static LLSD loadUserDictionaryMap();
+ static void setDictionaryData(const LLSD& dict_info);
+ static void saveUserDictionaryMap(const LLSD& dict_map);
+
+public:
+ typedef boost::signals2::signal<void()> settings_change_signal_t;
+ static boost::signals2::connection setSettingsChangeCallback(const settings_change_signal_t::slot_type& cb);
+protected:
+ static void initClass();
+
+protected:
+ Hunspell* mHunspell;
+ std::string mDictLanguage;
+ std::string mDictFile;
+ dict_list_t mDictSecondary;
+ std::vector<std::string> mIgnoreList;
+
+ static LLSD sDictMap;
+ static settings_change_signal_t sSettingsChangeSignal;
+};
+
+#endif // LLSPELLCHECK_H
diff --git a/indra/llui/llspellcheckmenuhandler.h b/indra/llui/llspellcheckmenuhandler.h
new file mode 100644
index 0000000000..d5c95bad39
--- /dev/null
+++ b/indra/llui/llspellcheckmenuhandler.h
@@ -0,0 +1,46 @@
+/**
+ * @file llspellcheckmenuhandler.h
+ * @brief Interface used by spell check menu handling
+ *
+ * $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 LLSPELLCHECKMENUHANDLER_H
+#define LLSPELLCHECKMENUHANDLER_H
+
+class LLSpellCheckMenuHandler
+{
+public:
+ virtual bool getSpellCheck() const { return false; }
+
+ virtual const std::string& getSuggestion(U32 index) const { return LLStringUtil::null; }
+ virtual U32 getSuggestionCount() const { return 0; }
+ virtual void replaceWithSuggestion(U32 index){}
+
+ virtual void addToDictionary() {}
+ virtual bool canAddToDictionary() const { return false; }
+
+ virtual void addToIgnore() {}
+ virtual bool canAddToIgnore() const { return false; }
+};
+
+#endif // LLSPELLCHECKMENUHANDLER_H
diff --git a/indra/llui/lltextbase.cpp b/indra/llui/lltextbase.cpp
index 7aeeae298f..3815eec447 100644
--- a/indra/llui/lltextbase.cpp
+++ b/indra/llui/lltextbase.cpp
@@ -32,6 +32,7 @@
#include "lllocalcliprect.h"
#include "llmenugl.h"
#include "llscrollcontainer.h"
+#include "llspellcheck.h"
#include "llstl.h"
#include "lltextparser.h"
#include "lltextutil.h"
@@ -155,6 +156,7 @@ LLTextBase::Params::Params()
plain_text("plain_text",false),
track_end("track_end", false),
read_only("read_only", false),
+ spellcheck("spellcheck", false),
v_pad("v_pad", 0),
h_pad("h_pad", 0),
clip("clip", true),
@@ -181,6 +183,9 @@ LLTextBase::LLTextBase(const LLTextBase::Params &p)
mFontShadow(p.font_shadow),
mPopupMenu(NULL),
mReadOnly(p.read_only),
+ mSpellCheck(p.spellcheck),
+ mSpellCheckStart(-1),
+ mSpellCheckEnd(-1),
mCursorColor(p.cursor_color),
mFgColor(p.text_color),
mBorderVisible( p.border_visible ),
@@ -246,6 +251,12 @@ LLTextBase::LLTextBase(const LLTextBase::Params &p)
addChild(mDocumentView);
}
+ if (mSpellCheck)
+ {
+ LLSpellChecker::setSettingsChangeCallback(boost::bind(&LLTextBase::onSpellCheckSettingsChange, this));
+ }
+ mSpellCheckTimer.reset();
+
createDefaultSegment();
updateRects();
@@ -280,12 +291,23 @@ bool LLTextBase::truncate()
if (getLength() >= S32(mMaxTextByteLength / 4))
{
// Have to check actual byte size
- LLWString text(getWText());
- S32 utf8_byte_size = wstring_utf8_length(text);
+ S32 utf8_byte_size = 0;
+ LLSD value = getViewModel()->getValue();
+ if (value.type() == LLSD::TypeString)
+ {
+ // save a copy for strings.
+ utf8_byte_size = value.size();
+ }
+ else
+ {
+ // non string LLSDs need explicit conversion to string
+ utf8_byte_size = value.asString().size();
+ }
+
if ( utf8_byte_size > mMaxTextByteLength )
{
// Truncate safely in UTF-8
- std::string temp_utf8_text = wstring_to_utf8str(text);
+ std::string temp_utf8_text = value.asString();
temp_utf8_text = utf8str_truncate( temp_utf8_text, mMaxTextByteLength );
LLWString text = utf8str_to_wstring( temp_utf8_text );
// remove extra bit of current string, to preserve formatting, etc.
@@ -530,8 +552,92 @@ void LLTextBase::drawText()
return;
}
+ // Perform spell check if needed
+ if ( (getSpellCheck()) && (getWText().length() > 2) )
+ {
+ // Calculate start and end indices for the spell checking range
+ S32 start = line_start, end = getLineEnd(last_line);
+
+ if ( (mSpellCheckStart != start) || (mSpellCheckEnd != end) )
+ {
+ const LLWString& wstrText = getWText();
+ mMisspellRanges.clear();
+
+ segment_set_t::const_iterator seg_it = getSegIterContaining(start);
+ while (mSegments.end() != seg_it)
+ {
+ LLTextSegmentPtr text_segment = *seg_it;
+ if ( (text_segment.isNull()) || (text_segment->getStart() >= end) )
+ {
+ break;
+ }
+
+ if (!text_segment->canEdit())
+ {
+ ++seg_it;
+ continue;
+ }
+
+ // Combine adjoining text segments into one
+ U32 seg_start = text_segment->getStart(), seg_end = llmin(text_segment->getEnd(), end);
+ while (mSegments.end() != ++seg_it)
+ {
+ text_segment = *seg_it;
+ if ( (text_segment.isNull()) || (!text_segment->canEdit()) || (text_segment->getStart() >= end) )
+ {
+ break;
+ }
+ seg_end = llmin(text_segment->getEnd(), end);
+ }
+
+ // Find the start of the first word
+ U32 word_start = seg_start, word_end = -1;
+ while ( (word_start < wstrText.length()) && (!LLStringOps::isAlpha(wstrText[word_start])) )
+ {
+ word_start++;
+ }
+
+ // Iterate over all words in the text block and check them one by one
+ while (word_start < seg_end)
+ {
+ // Find the end of the current word (special case handling for "'" when it's used as a contraction)
+ word_end = word_start + 1;
+ while ( (word_end < seg_end) &&
+ ((LLWStringUtil::isPartOfWord(wstrText[word_end])) ||
+ ((L'\'' == wstrText[word_end]) &&
+ (LLStringOps::isAlnum(wstrText[word_end - 1])) && (LLStringOps::isAlnum(wstrText[word_end + 1])))) )
+ {
+ word_end++;
+ }
+ if (word_end > seg_end)
+ {
+ break;
+ }
+
+ // Don't process words shorter than 3 characters
+ std::string word = wstring_to_utf8str(wstrText.substr(word_start, word_end - word_start));
+ if ( (word.length() >= 3) && (!LLSpellChecker::instance().checkSpelling(word)) )
+ {
+ mMisspellRanges.push_back(std::pair<U32, U32>(word_start, word_end));
+ }
+
+ // Find the start of the next word
+ word_start = word_end + 1;
+ while ( (word_start < seg_end) && (!LLWStringUtil::isPartOfWord(wstrText[word_start])) )
+ {
+ word_start++;
+ }
+ }
+ }
+
+ mSpellCheckStart = start;
+ mSpellCheckEnd = end;
+ }
+ }
+
LLTextSegmentPtr cur_segment = *seg_iter;
+ std::list<std::pair<U32, U32> >::const_iterator misspell_it = std::lower_bound(mMisspellRanges.begin(), mMisspellRanges.end(), std::pair<U32, U32>(line_start, 0));
for (S32 cur_line = first_line; cur_line < last_line; cur_line++)
{
S32 next_line = cur_line + 1;
@@ -566,7 +672,8 @@ void LLTextBase::drawText()
cur_segment = *seg_iter;
}
- S32 clipped_end = llmin( line_end, cur_segment->getEnd() ) - cur_segment->getStart();
+ S32 seg_end = llmin(line_end, cur_segment->getEnd());
+ S32 clipped_end = seg_end - cur_segment->getStart();
if (mUseEllipses // using ellipses
&& clipped_end == line_end // last segment on line
@@ -578,6 +685,46 @@ void LLTextBase::drawText()
text_rect.mRight -= 2;
}
+ // Draw squiggly lines under any visible misspelled words
+ while ( (mMisspellRanges.end() != misspell_it) && (misspell_it->first < seg_end) && (misspell_it->second > seg_start) )
+ {
+ // Skip the current word if the user is still busy editing it
+ if ( (!mSpellCheckTimer.hasExpired()) && (misspell_it->first <= (U32)mCursorPos) && (misspell_it->second >= (U32)mCursorPos) )
+ {
+ ++misspell_it;
+ continue;
+ }
+
+ U32 misspell_start = llmax<U32>(misspell_it->first, seg_start), misspell_end = llmin<U32>(misspell_it->second, seg_end);
+ S32 squiggle_start = 0, squiggle_end = 0, pony = 0;
+ cur_segment->getDimensions(seg_start - cur_segment->getStart(), misspell_start - seg_start, squiggle_start, pony);
+ cur_segment->getDimensions(misspell_start - cur_segment->getStart(), misspell_end - misspell_start, squiggle_end, pony);
+ squiggle_start += text_rect.mLeft;
+
+ pony = (squiggle_end + 3) / 6;
+ squiggle_start += squiggle_end / 2 - pony * 3;
+ squiggle_end = squiggle_start + pony * 6;
+
+ S32 squiggle_bottom = text_rect.mBottom + (S32)cur_segment->getStyle()->getFont()->getDescenderHeight();
+
+ gGL.color4ub(255, 0, 0, 200);
+ while (squiggle_start + 1 < squiggle_end)
+ {
+ gl_line_2d(squiggle_start, squiggle_bottom, squiggle_start + 2, squiggle_bottom - 2);
+ if (squiggle_start + 3 < squiggle_end)
+ {
+ gl_line_2d(squiggle_start + 2, squiggle_bottom - 3, squiggle_start + 4, squiggle_bottom - 1);
+ }
+ squiggle_start += 4;
+ }
+
+ if (misspell_it->second > seg_end)
+ {
+ break;
+ }
+ ++misspell_it;
+ }
+
text_rect.mLeft = (S32)(cur_segment->draw(seg_start - cur_segment->getStart(), clipped_end, selection_left, selection_right, text_rect));
seg_start = clipped_end + cur_segment->getStart();
@@ -592,8 +739,7 @@ void LLTextBase::drawText()
S32 LLTextBase::insertStringNoUndo(S32 pos, const LLWString &wstr, LLTextBase::segment_vec_t* segments )
{
- LLWString text(getWText());
- S32 old_len = text.length(); // length() returns character length
+ S32 old_len = getLength(); // length() returns character length
S32 insert_len = wstr.length();
pos = getEditableIndex(pos, true);
@@ -653,8 +799,7 @@ S32 LLTextBase::insertStringNoUndo(S32 pos, const LLWString &wstr, LLTextBase::s
}
}
- text.insert(pos, wstr);
- getViewModel()->setDisplay(text);
+ getViewModel()->getEditableDisplay().insert(pos, wstr);
if ( truncate() )
{
@@ -669,7 +814,6 @@ S32 LLTextBase::insertStringNoUndo(S32 pos, const LLWString &wstr, LLTextBase::s
S32 LLTextBase::removeStringNoUndo(S32 pos, S32 length)
{
- LLWString text(getWText());
segment_set_t::iterator seg_iter = getSegIterContaining(pos);
while(seg_iter != mSegments.end())
{
@@ -715,8 +859,7 @@ S32 LLTextBase::removeStringNoUndo(S32 pos, S32 length)
++seg_iter;
}
- text.erase(pos, length);
- getViewModel()->setDisplay(text);
+ getViewModel()->getEditableDisplay().erase(pos, length);
// recreate default segment in case we erased everything
createDefaultSegment();
@@ -733,9 +876,7 @@ S32 LLTextBase::overwriteCharNoUndo(S32 pos, llwchar wc)
{
return 0;
}
- LLWString text(getWText());
- text[pos] = wc;
- getViewModel()->setDisplay(text);
+ getViewModel()->getEditableDisplay()[pos] = wc;
onValueChange(pos, pos + 1);
needsReflow(pos);
@@ -1103,6 +1244,99 @@ void LLTextBase::deselect()
mIsSelecting = FALSE;
}
+bool LLTextBase::getSpellCheck() const
+{
+ return (LLSpellChecker::getUseSpellCheck()) && (!mReadOnly) && (mSpellCheck);
+}
+
+const std::string& LLTextBase::getSuggestion(U32 index) const
+{
+ return (index < mSuggestionList.size()) ? mSuggestionList[index] : LLStringUtil::null;
+}
+
+U32 LLTextBase::getSuggestionCount() const
+{
+ return mSuggestionList.size();
+}
+
+void LLTextBase::replaceWithSuggestion(U32 index)
+{
+ for (std::list<std::pair<U32, U32> >::const_iterator it = mMisspellRanges.begin(); it != mMisspellRanges.end(); ++it)
+ {
+ if ( (it->first <= (U32)mCursorPos) && (it->second >= (U32)mCursorPos) )
+ {
+ deselect();
+
+ // Delete the misspelled word
+ removeStringNoUndo(it->first, it->second - it->first);
+
+ // Insert the suggestion in its place
+ LLWString suggestion = utf8str_to_wstring(mSuggestionList[index]);
+ insertStringNoUndo(it->first, utf8str_to_wstring(mSuggestionList[index]));
+ setCursorPos(it->first + (S32)suggestion.length());
+
+ break;
+ }
+ }
+ mSpellCheckStart = mSpellCheckEnd = -1;
+}
+
+void LLTextBase::addToDictionary()
+{
+ if (canAddToDictionary())
+ {
+ LLSpellChecker::instance().addToCustomDictionary(getMisspelledWord(mCursorPos));
+ }
+}
+
+bool LLTextBase::canAddToDictionary() const
+{
+ return (getSpellCheck()) && (isMisspelledWord(mCursorPos));
+}
+
+void LLTextBase::addToIgnore()
+{
+ if (canAddToIgnore())
+ {
+ LLSpellChecker::instance().addToIgnoreList(getMisspelledWord(mCursorPos));
+ }
+}
+
+bool LLTextBase::canAddToIgnore() const
+{
+ return (getSpellCheck()) && (isMisspelledWord(mCursorPos));
+}
+
+std::string LLTextBase::getMisspelledWord(U32 pos) const
+{
+ for (std::list<std::pair<U32, U32> >::const_iterator it = mMisspellRanges.begin(); it != mMisspellRanges.end(); ++it)
+ {
+ if ( (it->first <= pos) && (it->second >= pos) )
+ {
+ return wstring_to_utf8str(getWText().substr(it->first, it->second - it->first));
+ }
+ }
+ return LLStringUtil::null;
+}
+
+bool LLTextBase::isMisspelledWord(U32 pos) const
+{
+ for (std::list<std::pair<U32, U32> >::const_iterator it = mMisspellRanges.begin(); it != mMisspellRanges.end(); ++it)
+ {
+ if ( (it->first <= pos) && (it->second >= pos) )
+ {
+ return true;
+ }
+ }
+ return false;
+}
+
+void LLTextBase::onSpellCheckSettingsChange()
+{
+ // Recheck the spelling on every change
+ mMisspellRanges.clear();
+ mSpellCheckStart = mSpellCheckEnd = -1;
+}
// Sets the scrollbar from the cursor position
void LLTextBase::updateScrollFromCursor()
@@ -1685,6 +1919,8 @@ static LLUIImagePtr image_from_icon_name(const std::string& icon_name)
}
}
+static LLFastTimer::DeclareTimer FTM_PARSE_HTML("Parse HTML");
+
void LLTextBase::appendTextImpl(const std::string &new_text, const LLStyle::Params& input_params)
{
LLStyle::Params style_params(input_params);
@@ -1693,15 +1929,13 @@ void LLTextBase::appendTextImpl(const std::string &new_text, const LLStyle::Para
S32 part = (S32)LLTextParser::WHOLE;
if (mParseHTML && !style_params.is_link) // Don't search for URLs inside a link segment (STORM-358).
{
+ LLFastTimer _(FTM_PARSE_HTML);
S32 start=0,end=0;
LLUrlMatch match;
std::string text = new_text;
while ( LLUrlRegistry::instance().findUrl(text, match,
boost::bind(&LLTextBase::replaceUrl, this, _1, _2, _3)) )
{
-
- LLTextUtil::processUrlMatch(&match,this);
-
start = match.getStart();
end = match.getEnd()+1;
@@ -1737,6 +1971,8 @@ void LLTextBase::appendTextImpl(const std::string &new_text, const LLStyle::Para
}
}
+ LLTextUtil::processUrlMatch(&match,this);
+
// move on to the rest of the text after the Url
if (end < (S32)text.length())
{
@@ -1760,8 +1996,11 @@ void LLTextBase::appendTextImpl(const std::string &new_text, const LLStyle::Para
}
}
+static LLFastTimer::DeclareTimer FTM_APPEND_TEXT("Append Text");
+
void LLTextBase::appendText(const std::string &new_text, bool prepend_newline, const LLStyle::Params& input_params)
{
+ LLFastTimer _(FTM_APPEND_TEXT);
if (new_text.empty())
return;
diff --git a/indra/llui/lltextbase.h b/indra/llui/lltextbase.h
index 0549141b72..90b147cee1 100644
--- a/indra/llui/lltextbase.h
+++ b/indra/llui/lltextbase.h
@@ -30,6 +30,7 @@
#include "v4color.h"
#include "lleditmenuhandler.h"
+#include "llspellcheckmenuhandler.h"
#include "llstyle.h"
#include "llkeywords.h"
#include "llpanel.h"
@@ -230,7 +231,8 @@ typedef LLPointer<LLTextSegment> LLTextSegmentPtr;
///
class LLTextBase
: public LLUICtrl,
- protected LLEditMenuHandler
+ protected LLEditMenuHandler,
+ public LLSpellCheckMenuHandler
{
public:
friend class LLTextSegment;
@@ -259,6 +261,7 @@ public:
border_visible,
track_end,
read_only,
+ spellcheck,
allow_scroll,
plain_text,
wrap,
@@ -311,6 +314,24 @@ public:
/*virtual*/ BOOL canDeselect() const;
/*virtual*/ void deselect();
+ // LLSpellCheckMenuHandler overrides
+ /*virtual*/ bool getSpellCheck() const;
+
+ /*virtual*/ const std::string& getSuggestion(U32 index) const;
+ /*virtual*/ U32 getSuggestionCount() const;
+ /*virtual*/ void replaceWithSuggestion(U32 index);
+
+ /*virtual*/ void addToDictionary();
+ /*virtual*/ bool canAddToDictionary() const;
+
+ /*virtual*/ void addToIgnore();
+ /*virtual*/ bool canAddToIgnore() const;
+
+ // Spell checking helper functions
+ std::string getMisspelledWord(U32 pos) const;
+ bool isMisspelledWord(U32 pos) const;
+ void onSpellCheckSettingsChange();
+
// used by LLTextSegment layout code
bool getWordWrap() { return mWordWrap; }
bool getUseEllipses() { return mUseEllipses; }
@@ -540,6 +561,14 @@ protected:
BOOL mIsSelecting; // Are we in the middle of a drag-select?
+ // spell checking
+ bool mSpellCheck;
+ S32 mSpellCheckStart;
+ S32 mSpellCheckEnd;
+ LLTimer mSpellCheckTimer;
+ std::list<std::pair<U32, U32> > mMisspellRanges;
+ std::vector<std::string> mSuggestionList;
+
// configuration
S32 mHPad; // padding on left of text
S32 mVPad; // padding above text
diff --git a/indra/llui/lltextbox.cpp b/indra/llui/lltextbox.cpp
index 6a905b7ec0..11cfa1d263 100644
--- a/indra/llui/lltextbox.cpp
+++ b/indra/llui/lltextbox.cpp
@@ -150,7 +150,7 @@ S32 LLTextBox::getTextPixelHeight()
LLSD LLTextBox::getValue() const
{
- return LLSD(getText());
+ return getViewModel()->getValue();
}
BOOL LLTextBox::setTextArg( const std::string& key, const LLStringExplicit& text )
diff --git a/indra/llui/lltexteditor.cpp b/indra/llui/lltexteditor.cpp
index 9720dded6c..144b6960a1 100644
--- a/indra/llui/lltexteditor.cpp
+++ b/indra/llui/lltexteditor.cpp
@@ -54,6 +54,7 @@
#include "llwindow.h"
#include "lltextparser.h"
#include "llscrollcontainer.h"
+#include "llspellcheck.h"
#include "llpanel.h"
#include "llurlregistry.h"
#include "lltooltip.h"
@@ -77,6 +78,7 @@ template class LLTextEditor* LLView::getChild<class LLTextEditor>(
const S32 UI_TEXTEDITOR_LINE_NUMBER_MARGIN = 32;
const S32 UI_TEXTEDITOR_LINE_NUMBER_DIGITS = 4;
const S32 SPACES_PER_TAB = 4;
+const F32 SPELLCHECK_DELAY = 0.5f; // delay between the last keypress and spell checking the word the cursor is on
///////////////////////////////////////////////////////////////////
@@ -1953,7 +1955,38 @@ void LLTextEditor::showContextMenu(S32 x, S32 y)
S32 screen_x, screen_y;
localPointToScreen(x, y, &screen_x, &screen_y);
- mContextMenu->show(screen_x, screen_y);
+
+ setCursorAtLocalPos(x, y, false);
+ if (hasSelection())
+ {
+ if ( (mCursorPos < llmin(mSelectionStart, mSelectionEnd)) || (mCursorPos > llmax(mSelectionStart, mSelectionEnd)) )
+ {
+ deselect();
+ }
+ else
+ {
+ setCursorPos(llmax(mSelectionStart, mSelectionEnd));
+ }
+ }
+
+ bool use_spellcheck = getSpellCheck(), is_misspelled = false;
+ if (use_spellcheck)
+ {
+ mSuggestionList.clear();
+
+ // If the cursor is on a misspelled word, retrieve suggestions for it
+ std::string misspelled_word = getMisspelledWord(mCursorPos);
+ if ((is_misspelled = !misspelled_word.empty()) == true)
+ {
+ LLSpellChecker::instance().getSuggestions(misspelled_word, mSuggestionList);
+ }
+ }
+
+ mContextMenu->setItemVisible("Suggestion Separator", (use_spellcheck) && (!mSuggestionList.empty()));
+ mContextMenu->setItemVisible("Add to Dictionary", (use_spellcheck) && (is_misspelled));
+ mContextMenu->setItemVisible("Add to Ignore", (use_spellcheck) && (is_misspelled));
+ mContextMenu->setItemVisible("Spellcheck Separator", (use_spellcheck) && (is_misspelled));
+ mContextMenu->show(screen_x, screen_y, this);
}
@@ -2838,6 +2871,9 @@ void LLTextEditor::setKeystrokeCallback(const keystroke_signal_t::slot_type& cal
void LLTextEditor::onKeyStroke()
{
mKeystrokeSignal(this);
+
+ mSpellCheckStart = mSpellCheckEnd = -1;
+ mSpellCheckTimer.setTimerExpirySec(SPELLCHECK_DELAY);
}
//virtual
diff --git a/indra/llui/llui.cpp b/indra/llui/llui.cpp
index b5e27616b7..87bf518aa1 100644
--- a/indra/llui/llui.cpp
+++ b/indra/llui/llui.cpp
@@ -831,7 +831,11 @@ void gl_stippled_line_3d( const LLVector3& start, const LLVector3& end, const LL
gGL.flush();
glLineWidth(2.5f);
- glLineStipple(2, 0x3333 << shift);
+
+ if (!LLGLSLShader::sNoFixedFunction)
+ {
+ glLineStipple(2, 0x3333 << shift);
+ }
gGL.begin(LLRender::LINES);
{
diff --git a/indra/llui/lluictrlfactory.h b/indra/llui/lluictrlfactory.h
index d612ad5005..4e54354731 100644
--- a/indra/llui/lluictrlfactory.h
+++ b/indra/llui/lluictrlfactory.h
@@ -31,18 +31,10 @@
#include "llinitparam.h"
#include "llregistry.h"
#include "llxuiparser.h"
+#include "llstl.h"
class LLView;
-// sort functor for typeid maps
-struct LLCompareTypeID
-{
- bool operator()(const std::type_info* lhs, const std::type_info* rhs) const
- {
- return lhs->before(*rhs);
- }
-};
-
// lookup widget constructor funcs by widget name
template <typename DERIVED_TYPE>
class LLChildRegistry : public LLRegistrySingleton<std::string, LLWidgetCreatorFunc, DERIVED_TYPE>
@@ -71,14 +63,14 @@ protected:
// lookup widget name by type
class LLWidgetNameRegistry
-: public LLRegistrySingleton<const std::type_info*, std::string, LLWidgetNameRegistry , LLCompareTypeID>
+: public LLRegistrySingleton<const std::type_info*, std::string, LLWidgetNameRegistry>
{};
// lookup function for generating empty param block by widget type
// this is used for schema generation
//typedef const LLInitParam::BaseBlock& (*empty_param_block_func_t)();
//class LLDefaultParamBlockRegistry
-//: public LLRegistrySingleton<const std::type_info*, empty_param_block_func_t, LLDefaultParamBlockRegistry, LLCompareTypeID>
+//: public LLRegistrySingleton<const std::type_info*, empty_param_block_func_t, LLDefaultParamBlockRegistry>
//{};
extern LLFastTimer::DeclareTimer FTM_WIDGET_SETUP;
diff --git a/indra/llui/llviewmodel.h b/indra/llui/llviewmodel.h
index 763af5d8a2..ef2e314799 100644
--- a/indra/llui/llviewmodel.h
+++ b/indra/llui/llviewmodel.h
@@ -102,6 +102,7 @@ public:
// New functions
/// Get the stored value in string form
const LLWString& getDisplay() const { return mDisplay; }
+ LLWString& getEditableDisplay() { mDirty = true; mUpdateFromDisplay = true; return mDisplay; }
/**
* Set the display string directly (see LLTextEditor). What the user is
diff --git a/indra/llwindow/llkeyboard.cpp b/indra/llwindow/llkeyboard.cpp
index 53cecf9d4a..8b356ba138 100644
--- a/indra/llwindow/llkeyboard.cpp
+++ b/indra/llwindow/llkeyboard.cpp
@@ -46,7 +46,7 @@ LLKeyStringTranslatorFunc* LLKeyboard::mStringTranslator = NULL; // Used for l10
// Class Implementation
//
-LLKeyboard::LLKeyboard() : mCallbacks(NULL), mNumpadDistinct(ND_NUMLOCK_OFF)
+LLKeyboard::LLKeyboard() : mCallbacks(NULL)
{
S32 i;
diff --git a/indra/llwindow/llkeyboard.h b/indra/llwindow/llkeyboard.h
index ba472cfde5..c155c1b362 100644
--- a/indra/llwindow/llkeyboard.h
+++ b/indra/llwindow/llkeyboard.h
@@ -63,14 +63,6 @@ class LLWindowCallbacks;
class LLKeyboard
{
public:
- typedef enum e_numpad_distinct
- {
- ND_NEVER,
- ND_NUMLOCK_OFF,
- ND_NUMLOCK_ON
- } ENumpadDistinct;
-
-public:
LLKeyboard();
virtual ~LLKeyboard();
@@ -107,8 +99,6 @@ public:
static BOOL keyFromString(const std::string& str, KEY *key); // False on failure
static std::string stringFromKey(KEY key);
static std::string stringFromAccelerator( MASK accel_mask, KEY key );
- e_numpad_distinct getNumpadDistinct() { return mNumpadDistinct; }
- void setNumpadDistinct(e_numpad_distinct val) { mNumpadDistinct = val; }
void setCallbacks(LLWindowCallbacks *cbs) { mCallbacks = cbs; }
F32 getKeyElapsedTime( KEY key ); // Returns time in seconds since key was pressed.
@@ -135,8 +125,6 @@ protected:
static LLKeyStringTranslatorFunc* mStringTranslator; // Used for l10n + PC/Mac/Linux accelerator labeling
- e_numpad_distinct mNumpadDistinct;
-
EKeyboardInsertMode mInsertMode;
static std::map<KEY,std::string> sKeysToNames;
diff --git a/indra/llwindow/llkeyboardmacosx.cpp b/indra/llwindow/llkeyboardmacosx.cpp
index ecc2631669..7f8f303517 100644
--- a/indra/llwindow/llkeyboardmacosx.cpp
+++ b/indra/llwindow/llkeyboardmacosx.cpp
@@ -299,28 +299,11 @@ void LLKeyboardMacOSX::scanKeyboard()
BOOL LLKeyboardMacOSX::translateNumpadKey( const U16 os_key, KEY *translated_key )
{
- if(mNumpadDistinct == ND_NUMLOCK_ON)
- {
- std::map<U16, KEY>::iterator iter= mTranslateNumpadMap.find(os_key);
- if(iter != mTranslateNumpadMap.end())
- {
- *translated_key = iter->second;
- return TRUE;
- }
- }
return translateKey(os_key, translated_key);
}
U16 LLKeyboardMacOSX::inverseTranslateNumpadKey(const KEY translated_key)
{
- if(mNumpadDistinct == ND_NUMLOCK_ON)
- {
- std::map<KEY, U16>::iterator iter= mInvTranslateNumpadMap.find(translated_key);
- if(iter != mInvTranslateNumpadMap.end())
- {
- return iter->second;
- }
- }
return inverseTranslateKey(translated_key);
}
diff --git a/indra/llwindow/llkeyboardsdl.cpp b/indra/llwindow/llkeyboardsdl.cpp
index 4bb9603368..7c9aa1d340 100644
--- a/indra/llwindow/llkeyboardsdl.cpp
+++ b/indra/llwindow/llkeyboardsdl.cpp
@@ -312,29 +312,11 @@ void LLKeyboardSDL::scanKeyboard()
BOOL LLKeyboardSDL::translateNumpadKey( const U16 os_key, KEY *translated_key)
{
- if(mNumpadDistinct == ND_NUMLOCK_ON)
- {
- std::map<U16, KEY>::iterator iter= mTranslateNumpadMap.find(os_key);
- if(iter != mTranslateNumpadMap.end())
- {
- *translated_key = iter->second;
- return TRUE;
- }
- }
- BOOL success = translateKey(os_key, translated_key);
- return success;
+ return translateKey(os_key, translated_key);
}
U16 LLKeyboardSDL::inverseTranslateNumpadKey(const KEY translated_key)
{
- if(mNumpadDistinct == ND_NUMLOCK_ON)
- {
- std::map<KEY, U16>::iterator iter= mInvTranslateNumpadMap.find(translated_key);
- if(iter != mInvTranslateNumpadMap.end())
- {
- return iter->second;
- }
- }
return inverseTranslateKey(translated_key);
}
diff --git a/indra/llwindow/llkeyboardwin32.cpp b/indra/llwindow/llkeyboardwin32.cpp
index df78816bd6..be3fe5deb0 100644
--- a/indra/llwindow/llkeyboardwin32.cpp
+++ b/indra/llwindow/llkeyboardwin32.cpp
@@ -299,69 +299,13 @@ void LLKeyboardWin32::scanKeyboard()
BOOL LLKeyboardWin32::translateExtendedKey(const U16 os_key, const MASK mask, KEY *translated_key)
{
- if(mNumpadDistinct == ND_NUMLOCK_ON)
- {
- std::map<U16, KEY>::iterator iter = mTranslateNumpadMap.find(os_key);
- if (iter != mTranslateNumpadMap.end())
- {
- *translated_key = iter->second;
- return TRUE;
- }
- }
-
- BOOL success = translateKey(os_key, translated_key);
- if(mNumpadDistinct != ND_NEVER) {
- if(!success) return success;
- if(mask & MASK_EXTENDED)
- {
- // this is where we'd create new keycodes for extended keys
- // the set of extended keys includes the 'normal' arrow keys and
- // the pgup/dn/insert/home/end/delete cluster above the arrow keys
- // see http://windowssdk.msdn.microsoft.com/en-us/library/ms646280.aspx
-
- // only process the return key if numlock is off
- if(((mNumpadDistinct == ND_NUMLOCK_OFF &&
- !(GetKeyState(VK_NUMLOCK) & 1))
- || mNumpadDistinct == ND_NUMLOCK_ON) &&
- *translated_key == KEY_RETURN) {
- *translated_key = KEY_PAD_RETURN;
- }
- }
- else
- {
- // the non-extended keys, those are in the numpad
- switch (*translated_key)
- {
- case KEY_LEFT:
- *translated_key = KEY_PAD_LEFT; break;
- case KEY_RIGHT:
- *translated_key = KEY_PAD_RIGHT; break;
- case KEY_UP:
- *translated_key = KEY_PAD_UP; break;
- case KEY_DOWN:
- *translated_key = KEY_PAD_DOWN; break;
- case KEY_HOME:
- *translated_key = KEY_PAD_HOME; break;
- case KEY_END:
- *translated_key = KEY_PAD_END; break;
- case KEY_PAGE_UP:
- *translated_key = KEY_PAD_PGUP; break;
- case KEY_PAGE_DOWN:
- *translated_key = KEY_PAD_PGDN; break;
- case KEY_INSERT:
- *translated_key = KEY_PAD_INS; break;
- case KEY_DELETE:
- *translated_key = KEY_PAD_DEL; break;
- }
- }
- }
- return success;
+ return translateKey(os_key, translated_key);
}
U16 LLKeyboardWin32::inverseTranslateExtendedKey(const KEY translated_key)
{
// if numlock is on, then we need to translate KEY_PAD_FOO to the corresponding number pad number
- if((mNumpadDistinct == ND_NUMLOCK_ON) && (GetKeyState(VK_NUMLOCK) & 1))
+ if(GetKeyState(VK_NUMLOCK) & 1)
{
std::map<KEY, U16>::iterator iter = mInvTranslateNumpadMap.find(translated_key);
if (iter != mInvTranslateNumpadMap.end())
diff --git a/indra/llwindow/llwindowwin32.cpp b/indra/llwindow/llwindowwin32.cpp
index e07fbddb94..9a4dd41c4e 100644
--- a/indra/llwindow/llwindowwin32.cpp
+++ b/indra/llwindow/llwindowwin32.cpp
@@ -367,6 +367,10 @@ LLWindowWin32::LLWindowWin32(LLWindowCallbacks* callbacks,
U32 fsaa_samples)
: LLWindow(callbacks, fullscreen, flags)
{
+
+ //MAINT-516 -- force a load of opengl32.dll just in case windows went sideways
+ LoadLibrary(L"opengl32.dll");
+
mFSAASamples = fsaa_samples;
mIconResource = gIconResource;
mOverrideAspectRatio = 0.f;
@@ -1698,6 +1702,12 @@ void LLWindowWin32::initCursors()
mCursor[ UI_CURSOR_TOOLSIT ] = LoadCursor(module, TEXT("TOOLSIT"));
mCursor[ UI_CURSOR_TOOLBUY ] = LoadCursor(module, TEXT("TOOLBUY"));
mCursor[ UI_CURSOR_TOOLOPEN ] = LoadCursor(module, TEXT("TOOLOPEN"));
+ mCursor[ UI_CURSOR_TOOLPATHFINDING ] = LoadCursor(module, TEXT("TOOLPATHFINDING"));
+ mCursor[ UI_CURSOR_TOOLPATHFINDING_PATH_START_ADD ] = LoadCursor(module, TEXT("TOOLPATHFINDINGPATHSTARTADD"));
+ mCursor[ UI_CURSOR_TOOLPATHFINDING_PATH_START ] = LoadCursor(module, TEXT("TOOLPATHFINDINGPATHSTART"));
+ mCursor[ UI_CURSOR_TOOLPATHFINDING_PATH_END ] = LoadCursor(module, TEXT("TOOLPATHFINDINGPATHEND"));
+ mCursor[ UI_CURSOR_TOOLPATHFINDING_PATH_END_ADD ] = LoadCursor(module, TEXT("TOOLPATHFINDINGPATHENDADD"));
+ mCursor[ UI_CURSOR_TOOLNO ] = LoadCursor(module, TEXT("TOOLNO"));
// Color cursors
mCursor[ UI_CURSOR_TOOLPLAY ] = loadColorCursor(TEXT("TOOLPLAY"));
diff --git a/indra/llxml/llcontrol.cpp b/indra/llxml/llcontrol.cpp
index 0809d95628..53d9380f4f 100644
--- a/indra/llxml/llcontrol.cpp
+++ b/indra/llxml/llcontrol.cpp
@@ -201,7 +201,8 @@ void LLControlVariable::setValue(const LLSD& new_value, bool saved_value)
}
LLSD storable_value = getComparableValue(new_value);
- bool value_changed = llsd_compare(getValue(), storable_value) == FALSE;
+ LLSD original_value = getValue();
+ bool value_changed = llsd_compare(original_value, storable_value) == FALSE;
if(saved_value)
{
// If we're going to save this value, return to default but don't fire
@@ -237,7 +238,7 @@ void LLControlVariable::setValue(const LLSD& new_value, bool saved_value)
if(value_changed)
{
- mCommitSignal(this, storable_value);
+ firePropertyChanged(original_value);
}
}
@@ -249,12 +250,13 @@ void LLControlVariable::setDefaultValue(const LLSD& value)
// *NOTE: Default values are not saved, only read.
LLSD comparable_value = getComparableValue(value);
- bool value_changed = (llsd_compare(getValue(), comparable_value) == FALSE);
+ LLSD original_value = getValue();
+ bool value_changed = (llsd_compare(original_value, comparable_value) == FALSE);
resetToDefault(false);
mValues[0] = comparable_value;
if(value_changed)
{
- firePropertyChanged();
+ firePropertyChanged(original_value);
}
}
@@ -277,6 +279,8 @@ void LLControlVariable::resetToDefault(bool fire_signal)
{
//The first setting is always the default
//Pop to it and fire off the listener
+ LLSD originalValue = mValues.back();
+
while(mValues.size() > 1)
{
mValues.pop_back();
@@ -284,7 +288,7 @@ void LLControlVariable::resetToDefault(bool fire_signal)
if(fire_signal)
{
- firePropertyChanged();
+ firePropertyChanged(originalValue);
}
}
diff --git a/indra/llxml/llcontrol.h b/indra/llxml/llcontrol.h
index 597031ec70..9a3a40e476 100644
--- a/indra/llxml/llcontrol.h
+++ b/indra/llxml/llcontrol.h
@@ -98,7 +98,7 @@ class LLControlVariable : public LLRefCount
public:
typedef boost::signals2::signal<bool(LLControlVariable* control, const LLSD&), boost_boolean_combiner> validate_signal_t;
- typedef boost::signals2::signal<void(LLControlVariable* control, const LLSD&)> commit_signal_t;
+ typedef boost::signals2::signal<void(LLControlVariable* control, const LLSD&, const LLSD&)> commit_signal_t;
private:
std::string mName;
@@ -146,11 +146,11 @@ public:
void setHiddenFromSettingsEditor(bool hide);
void setComment(const std::string& comment);
- void firePropertyChanged()
+private:
+ void firePropertyChanged(const LLSD &pPreviousValue)
{
- mCommitSignal(this, mValues.back());
+ mCommitSignal(this, mValues.back(), pPreviousValue);
}
-private:
LLSD getComparableValue(const LLSD& value);
bool llsd_compare(const LLSD& a, const LLSD & b);
};
diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt
index 0a267cbad0..753dbd7438 100644..100755
--- a/indra/newview/CMakeLists.txt
+++ b/indra/newview/CMakeLists.txt
@@ -13,16 +13,17 @@ include(EXPAT)
include(FMOD)
include(OPENAL)
include(FindOpenGL)
+include(Hunspell)
include(JsonCpp)
include(LLAudio)
include(LLCharacter)
include(LLCommon)
-include(LLConvexDecomposition)
include(LLImage)
include(LLImageJ2COJ)
include(LLInventory)
include(LLMath)
include(LLMessage)
+include(LLPhysicsExtensions)
include(LLPlugin)
include(LLPrimitive)
include(LLRender)
@@ -44,6 +45,8 @@ include(VisualLeakDetector)
include(GLOD)
include(CMakeCopyIfDifferent)
+add_subdirectory(${LLPHYSICSEXTENSIONS_SRC_DIR} llphysicsextensions)
+
include_directories(
${DBUSGLIB_INCLUDE_DIRS}
${JSONCPP_INCLUDE_DIR}
@@ -51,13 +54,14 @@ include_directories(
${LLAUDIO_INCLUDE_DIRS}
${LLCHARACTER_INCLUDE_DIRS}
${LLCOMMON_INCLUDE_DIRS}
- ${LLCONVEXDECOMP_INCLUDE_DIRS}
+ ${LLPHYSICS_INCLUDE_DIRS}
${FMOD_INCLUDE_DIR}
${LLIMAGE_INCLUDE_DIRS}
${LLKDU_INCLUDE_DIRS}
${LLINVENTORY_INCLUDE_DIRS}
${LLMATH_INCLUDE_DIRS}
${LLMESSAGE_INCLUDE_DIRS}
+ ${LLPHYSICSEXTENSIONS_INCLUDE_DIRS}
${LLPLUGIN_INCLUDE_DIRS}
${LLPRIMITIVE_INCLUDE_DIRS}
${LLRENDER_INCLUDE_DIRS}
@@ -70,6 +74,7 @@ include_directories(
${LLLOGIN_INCLUDE_DIRS}
${UPDATER_INCLUDE_DIRS}
${LIBS_PREBUILT_DIR}/include/collada
+ ${LIBS_PREBUILD_DIR}/include/hunspell
${OPENAL_LIB_INCLUDE_DIRS}
${LIBS_PREBUILT_DIR}/include/collada/1.4
)
@@ -96,6 +101,7 @@ set(viewer_SOURCE_FILES
llassetuploadresponders.cpp
llattachmentsmgr.cpp
llaudiosourcevo.cpp
+ llautoreplace.cpp
llavataractions.cpp
llavatariconctrl.cpp
llavatarlist.cpp
@@ -167,6 +173,7 @@ set(viewer_SOURCE_FILES
llfloaterabout.cpp
llfloaterbvhpreview.cpp
llfloaterauction.cpp
+ llfloaterautoreplacesettings.cpp
llfloateravatar.cpp
llfloateravatarpicker.cpp
llfloateravatartextures.cpp
@@ -210,12 +217,15 @@ set(viewer_SOURCE_FILES
llfloatermemleak.cpp
llfloatermodelpreview.cpp
llfloatermodeluploadbase.cpp
- llfloatermodelwizard.cpp
llfloaternamedesc.cpp
llfloaternotificationsconsole.cpp
llfloaterobjectweights.cpp
llfloateropenobject.cpp
llfloateroutbox.cpp
+ llfloaterpathfindingcharacters.cpp
+ llfloaterpathfindingconsole.cpp
+ llfloaterpathfindinglinksets.cpp
+ llfloaterpathfindingobjects.cpp
llfloaterpay.cpp
llfloaterperms.cpp
llfloaterpostprocess.cpp
@@ -232,6 +242,7 @@ set(viewer_SOURCE_FILES
llfloatersidepanelcontainer.cpp
llfloatersnapshot.cpp
llfloatersounddevices.cpp
+ llfloaterspellchecksettings.cpp
llfloatertelehub.cpp
llfloatertestinspectors.cpp
llfloatertestlistview.cpp
@@ -384,6 +395,7 @@ set(viewer_SOURCE_FILES
llpanelonlinestatus.cpp
llpaneloutfitedit.cpp
llpaneloutfitsinventory.cpp
+ llpanelpathfindingrebakenavmesh.cpp
llpanelpeople.cpp
llpanelpeoplemenus.cpp
llpanelpermissions.cpp
@@ -412,6 +424,17 @@ set(viewer_SOURCE_FILES
llparcelselection.cpp
llparticipantlist.cpp
llpatchvertexarray.cpp
+ llpathfindingcharacter.cpp
+ llpathfindingcharacterlist.cpp
+ llpathfindinglinkset.cpp
+ llpathfindinglinksetlist.cpp
+ llpathfindingmanager.cpp
+ llpathfindingnavmesh.cpp
+ llpathfindingnavmeshstatus.cpp
+ llpathfindingnavmeshzone.cpp
+ llpathfindingobject.cpp
+ llpathfindingobjectlist.cpp
+ llpathfindingpathtool.cpp
llphysicsmotion.cpp
llphysicsshapebuilderutil.cpp
llplacesinventorybridge.cpp
@@ -654,6 +677,7 @@ set(viewer_HEADER_FILES
llassetuploadresponders.h
llattachmentsmgr.h
llaudiosourcevo.h
+ llautoreplace.h
llavataractions.h
llavatariconctrl.h
llavatarlist.h
@@ -725,6 +749,7 @@ set(viewer_HEADER_FILES
llfloaterabout.h
llfloaterbvhpreview.h
llfloaterauction.h
+ llfloaterautoreplacesettings.h
llfloateravatar.h
llfloateravatarpicker.h
llfloateravatartextures.h
@@ -768,12 +793,15 @@ set(viewer_HEADER_FILES
llfloatermemleak.h
llfloatermodelpreview.h
llfloatermodeluploadbase.h
- llfloatermodelwizard.h
llfloaternamedesc.h
llfloaternotificationsconsole.h
llfloaterobjectweights.h
llfloateropenobject.h
llfloateroutbox.h
+ llfloaterpathfindingcharacters.h
+ llfloaterpathfindingconsole.h
+ llfloaterpathfindinglinksets.h
+ llfloaterpathfindingobjects.h
llfloaterpay.h
llfloaterperms.h
llfloaterpostprocess.h
@@ -790,6 +818,7 @@ set(viewer_HEADER_FILES
llfloatersidepanelcontainer.h
llfloatersnapshot.h
llfloatersounddevices.h
+ llfloaterspellchecksettings.h
llfloatertelehub.h
llfloatertestinspectors.h
llfloatertestlistview.h
@@ -936,6 +965,7 @@ set(viewer_HEADER_FILES
llpanelonlinestatus.h
llpaneloutfitedit.h
llpaneloutfitsinventory.h
+ llpanelpathfindingrebakenavmesh.h
llpanelpeople.h
llpanelpeoplemenus.h
llpanelpermissions.h
@@ -959,6 +989,17 @@ set(viewer_HEADER_FILES
llparcelselection.h
llparticipantlist.h
llpatchvertexarray.h
+ llpathfindingcharacter.h
+ llpathfindingcharacterlist.h
+ llpathfindinglinkset.h
+ llpathfindinglinksetlist.h
+ llpathfindingmanager.h
+ llpathfindingnavmesh.h
+ llpathfindingnavmeshstatus.h
+ llpathfindingnavmeshzone.h
+ llpathfindingobject.h
+ llpathfindingobjectlist.h
+ llpathfindingpathtool.h
llphysicsmotion.h
llphysicsshapebuilderutil.h
llplacesinventorybridge.h
@@ -1308,6 +1349,11 @@ if (WINDOWS)
res/lltoolgrab.cur
res/lltoolland.cur
res/lltoolpan.cur
+ res/lltoolpathfinding.cur
+ res/lltoolpathfindingpathend.cur
+ res/lltoolpathfindingpathendadd.cur
+ res/lltoolpathfindingpathstart.cur
+ res/lltoolpathfindingpathstartadd.cur
res/lltoolpipette.cur
res/lltoolrotate.cur
res/lltoolscale.cur
@@ -1515,11 +1561,9 @@ set(PACKAGE ON CACHE BOOL
if (WINDOWS)
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 /INCLUDE:__tcmalloc"
+ LINK_FLAGS "/debug /NODEFAULTLIB:LIBCMT /SUBSYSTEM:WINDOWS ${TCMALLOC_LINK_FLAGS}"
LINK_FLAGS_DEBUG "/NODEFAULTLIB:\"LIBCMT;LIBCMTD;MSVCRT\" /INCREMENTAL:NO"
- LINK_FLAGS_RELEASE ""
+ LINK_FLAGS_RELEASE "/FORCE:MULTIPLE /MAP\"secondlife-bin.MAP\" /OPT:REF"
)
if(USE_PRECOMPILED_HEADERS)
set_target_properties(
@@ -1536,7 +1580,7 @@ if (WINDOWS)
# In the meantime, if you have any ideas on how to easily maintain one list, either here or in viewer_manifest.py
# and have the build deps get tracked *please* tell me about it.
- if(USE_GOOGLE_PERFTOOLS)
+ if(USE_TCMALLOC)
# Configure a var for tcmalloc location, if used.
# Note the need to specify multiple names explicitly.
set(GOOGLE_PERF_TOOLS_SOURCE
@@ -1544,7 +1588,7 @@ if (WINDOWS)
${SHARED_LIB_STAGING_DIR}/RelWithDebInfo/libtcmalloc_minimal.dll
${SHARED_LIB_STAGING_DIR}/Debug/libtcmalloc_minimal-debug.dll
)
- endif(USE_GOOGLE_PERFTOOLS)
+ endif(USE_TCMALLOC)
set(COPY_INPUT_DEPENDENCIES
@@ -1574,6 +1618,9 @@ if (WINDOWS)
${SHARED_LIB_STAGING_DIR}/RelWithDebInfo/msvcp100.dll
${SHARED_LIB_STAGING_DIR}/Debug/msvcr100d.dll
${SHARED_LIB_STAGING_DIR}/Debug/msvcp100d.dll
+ ${SHARED_LIB_STAGING_DIR}/Release/libhunspell.dll
+ ${SHARED_LIB_STAGING_DIR}/RelWithDebInfo/libhunspell.dll
+ ${SHARED_LIB_STAGING_DIR}/Debug/libhunspell.dll
${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/SLVoice.exe
${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/vivoxsdk.dll
${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/ortp.dll
@@ -1724,6 +1771,17 @@ if (WINDOWS)
#${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/event_host.tar.bz2)
endif (PACKAGE)
+elseif (DARWIN)
+ set_target_properties(${VIEWER_BINARY_NAME}
+ PROPERTIES
+ LINK_FLAGS_RELEASE "${LINK_FLAGS_RELEASE} -Xlinker -dead_strip -Xlinker -map -Xlinker ${CMAKE_CURRENT_BINARY_DIR}/${VIEWER_BINARY_NAME}.MAP"
+ )
+else (WINDOWS)
+ # Linux
+ set_target_properties(${VIEWER_BINARY_NAME}
+ PROPERTIES
+ LINK_FLAGS_RELEASE "${LINK_FLAGS_RELEASE} -Wl,--Map=${VIEWER_BINARY_NAME}.MAP"
+ )
endif (WINDOWS)
# *NOTE - this list is very sensitive to ordering, test carefully on all
@@ -1752,6 +1810,7 @@ target_link_libraries(${VIEWER_BINARY_NAME}
${LLMATH_LIBRARIES}
${LLCOMMON_LIBRARIES}
${NDOF_LIBRARY}
+ ${HUNSPELL_LIBRARY}
${viewer_LIBRARIES}
${BOOST_PROGRAM_OPTIONS_LIBRARY}
${BOOST_REGEX_LIBRARY}
@@ -1770,7 +1829,8 @@ target_link_libraries(${VIEWER_BINARY_NAME}
${OPENSSL_LIBRARIES}
${CRYPTO_LIBRARIES}
${LLLOGIN_LIBRARIES}
- ${LLCONVEXDECOMP_LIBRARY}
+ ${LLPHYSICS_LIBRARIES}
+ ${LLPHYSICSEXTENSIONS_LIBRARIES}
${TCMALLOC_LIBRARIES}
)
diff --git a/indra/newview/app_settings/autoreplace.xml b/indra/newview/app_settings/autoreplace.xml
new file mode 100644
index 0000000000..09d19f7b04
--- /dev/null
+++ b/indra/newview/app_settings/autoreplace.xml
@@ -0,0 +1,8330 @@
+<llsd>
+ <array>
+ <map>
+ <key>name</key>
+ <string>Abbreviations</string>
+ <key>replacements</key>
+ <map>
+ <key>afaic</key>
+ <string>As far as I am concerned</string>
+ <key>afaik</key>
+ <string>As far as I know</string>
+ <key>afk</key>
+ <string>away from keyboard</string>
+ <key>atm</key>
+ <string>at the moment</string>
+ <key>bbiab</key>
+ <string>be back in a bit</string>
+ <key>bbl</key>
+ <string>be back later</string>
+ <key>brb</key>
+ <string>be right back</string>
+ <key>btw</key>
+ <string>by the way</string>
+ <key>fyi</key>
+ <string>For your information</string>
+ <key>fwiw</key>
+ <string>For what its worth</string>
+ <key>gtg</key>
+ <string>got to go</string>
+ <key>idk</key>
+ <string>I don't know</string>
+ <key>iirc</key>
+ <string>if I recall correctly</string>
+ <key>imho</key>
+ <string>in my humble opinion</string>
+ <key>imo</key>
+ <string>in my opinion</string>
+ <key>irl</key>
+ <string>in real life</string>
+ <key>np</key>
+ <string>no problem</string>
+ <key>nsfw</key>
+ <string>not safe for work</string>
+ <key>nvm</key>
+ <string>nevermind</string>
+ <key>tc</key>
+ <string>take care</string>
+ <key>thx</key>
+ <string>thanks</string>
+ <key>ttfn</key>
+ <string>ta-ta for now</string>
+ <key>ttyl</key>
+ <string>talk to you later</string>
+ <key>ty</key>
+ <string>thank you</string>
+ <key>tyvm</key>
+ <string>thank you very much</string>
+ <key>wb</key>
+ <string>welcome back</string>
+ <key>yw</key>
+ <string>you&apos;re welcome</string>
+ <key>yvw</key>
+ <string>you&apos;re very welcome</string>
+ </map>
+ </map>
+ <map>
+ <key>name</key>
+ <string>Spelling Corrections</string>
+ <key>replacements</key>
+ <map>
+ <key>Amercia</key>
+ <string>America</string>
+ <key>Bernouilli</key>
+ <string>Bernoulli</string>
+ <key>Blitzkreig</key>
+ <string>Blitzkrieg</string>
+ <key>Bonnano</key>
+ <string>Bonanno</string>
+ <key>Brasillian</key>
+ <string>Brazilian</string>
+ <key>Britian</key>
+ <string>Britain</string>
+ <key>Brittish</key>
+ <string>British</string>
+ <key>Buddah</key>
+ <string>Buddha</string>
+ <key>Buddist</key>
+ <string>Buddhist</string>
+ <key>Cambrige</key>
+ <string>Cambridge</string>
+ <key>Capetown</key>
+ <string>Cape Town</string>
+ <key>Carmalite</key>
+ <string>Carmelite</string>
+ <key>Carnagie</key>
+ <string>Carnegie</string>
+ <key>Carnagie-Mellon</key>
+ <string>Carnegie-Mellon</string>
+ <key>Carnigie</key>
+ <string>Carnegie</string>
+ <key>Carnigie-Mellon</key>
+ <string>Carnegie-Mellon</string>
+ <key>Carribbean</key>
+ <string>Caribbean</string>
+ <key>Carribean</key>
+ <string>Caribbean</string>
+ <key>Carthagian</key>
+ <string>Carthaginian</string>
+ <key>Cataline</key>
+ <string>Catiline</string>
+ <key>Ceasar</key>
+ <string>Caesar</string>
+ <key>Celcius</key>
+ <string>Celsius</string>
+ <key>Champange</key>
+ <string>Champagne</string>
+ <key>Cincinatti</key>
+ <string>Cincinnati</string>
+ <key>Cincinnatti</key>
+ <string>Cincinnati</string>
+ <key>Conneticut</key>
+ <string>Connecticut</string>
+ <key>Dardenelles</key>
+ <string>Dardanelles</string>
+ <key>Dravadian</key>
+ <string>Dravidian</string>
+ <key>Enlish</key>
+ <string>English</string>
+ <key>Europian</key>
+ <string>European</string>
+ <key>Europians</key>
+ <string>Europeans</string>
+ <key>Eurpean</key>
+ <string>European</string>
+ <key>Eurpoean</key>
+ <string>European</string>
+ <key>Farenheit</key>
+ <string>Fahrenheit</string>
+ <key>Febuary</key>
+ <string>February</string>
+ <key>Feburary</key>
+ <string>February</string>
+ <key>Flemmish</key>
+ <string>Flemish</string>
+ <key>Formalhaut</key>
+ <string>Fomalhaut</string>
+ <key>Foundland</key>
+ <string>Newfoundland</string>
+ <key>Fransiscan</key>
+ <string>Franciscan</string>
+ <key>Fransiscans</key>
+ <string>Franciscans</string>
+ <key>Galations</key>
+ <string>Galatians</string>
+ <key>Gameboy</key>
+ <string>Game Boy</string>
+ <key>Ghandi</key>
+ <string>Gandhi</string>
+ <key>Godounov</key>
+ <string>Godunov</string>
+ <key>Gothenberg</key>
+ <string>Gothenburg</string>
+ <key>Gottleib</key>
+ <string>Gottlieb</string>
+ <key>Guaduloupe</key>
+ <string>Guadalupe</string>
+ <key>Guadulupe</key>
+ <string>Guadalupe</string>
+ <key>Guatamala</key>
+ <string>Guatemala</string>
+ <key>Guatamalan</key>
+ <string>Guatemalan</string>
+ <key>Guilia</key>
+ <string>Giulia</string>
+ <key>Guilio</key>
+ <string>Giulio</string>
+ <key>Guiness</key>
+ <string>Guinness</string>
+ <key>Guiseppe</key>
+ <string>Giuseppe</string>
+ <key>Habsbourg</key>
+ <string>Habsburg</string>
+ <key>Hallowean</key>
+ <string>Halloween</string>
+ <key>Heidelburg</key>
+ <string>Heidelberg</string>
+ <key>Ihaca</key>
+ <string>Ithaca</string>
+ <key>Israelies</key>
+ <string>Israelis</string>
+ <key>Janurary</key>
+ <string>January</string>
+ <key>Januray</key>
+ <string>January</string>
+ <key>Japanes</key>
+ <string>Japanese</string>
+ <key>Johanine</key>
+ <string>Johannine</string>
+ <key>Jospeh</key>
+ <string>Joseph</string>
+ <key>Juadaism</key>
+ <string>Judaism</string>
+ <key>Juadism</key>
+ <string>Judaism</string>
+ <key>Lybia</key>
+ <string>Libya</string>
+ <key>Malcom</key>
+ <string>Malcolm</string>
+ <key>Massachussets</key>
+ <string>Massachusetts</string>
+ <key>Massachussetts</key>
+ <string>Massachusetts</string>
+ <key>Mediteranean</key>
+ <string>Mediterranean</string>
+ <key>Michagan</key>
+ <string>Michigan</string>
+ <key>Misouri</key>
+ <string>Missouri</string>
+ <key>Missisipi</key>
+ <string>Mississippi</string>
+ <key>Missisippi</key>
+ <string>Mississippi</string>
+ <key>Monserrat</key>
+ <string>Montserrat</string>
+ <key>Montnana</key>
+ <string>Montana</string>
+ <key>Morisette</key>
+ <string>Morissette</string>
+ <key>Morrisette</key>
+ <string>Morissette</string>
+ <key>Mythraic</key>
+ <string>Mithraic</string>
+ <key>Naploeon</key>
+ <string>Napoleon</string>
+ <key>Napolean</key>
+ <string>Napoleon</string>
+ <key>Napoleonian</key>
+ <string>Napoleonic</string>
+ <key>Nazereth</key>
+ <string>Nazareth</string>
+ <key>Newyorker</key>
+ <string>New Yorker</string>
+ <key>Novermber</key>
+ <string>November</string>
+ <key>Nullabour</key>
+ <string>Nullarbor</string>
+ <key>Nuremburg</key>
+ <string>Nuremberg</string>
+ <key>Palistian</key>
+ <string>Palestinian</string>
+ <key>Palistinian</key>
+ <string>Palestinian</string>
+ <key>Palistinians</key>
+ <string>Palestinians</string>
+ <key>Papanicalou</key>
+ <string>Papanicolaou</string>
+ <key>Peloponnes</key>
+ <string>Peloponnesus</string>
+ <key>Pennyslvania</key>
+ <string>Pennsylvania</string>
+ <key>Pharoah</key>
+ <string>Pharaoh</string>
+ <key>Philipines</key>
+ <string>Philippines</string>
+ <key>Phillipine</key>
+ <string>Philippine</string>
+ <key>Phillipines</key>
+ <string>Philippines</string>
+ <key>Phillippines</key>
+ <string>Philippines</string>
+ <key>Phonecian</key>
+ <string>Phoenecian</string>
+ <key>Portugese</key>
+ <string>Portuguese</string>
+ <key>Postdam</key>
+ <string>Potsdam</string>
+ <key>Premonasterians</key>
+ <string>Premonstratensians</string>
+ <key>Pucini</key>
+ <string>Puccini</string>
+ <key>Puertorrican</key>
+ <string>Puerto Rican</string>
+ <key>Puertorricans</key>
+ <string>Puerto Ricans</string>
+ <key>Queenland</key>
+ <string>Queensland</string>
+ <key>Rockerfeller</key>
+ <string>Rockefeller</string>
+ <key>Russion</key>
+ <string>Russian</string>
+ <key>Sanhedrim</key>
+ <string>Sanhedrin</string>
+ <key>Saterday</key>
+ <string>Saturday</string>
+ <key>Saterdays</key>
+ <string>Saturdays</string>
+ <key>Sionist</key>
+ <string>Zionist</string>
+ <key>Sionists</key>
+ <string>Zionists</string>
+ <key>Sixtin</key>
+ <string>Sistine</string>
+ <key>Skagerak</key>
+ <string>Skagerrak</string>
+ <key>Tolkein</key>
+ <string>Tolkien</string>
+ <key>Tuscon</key>
+ <string>Tucson</string>
+ <key>Ukranian</key>
+ <string>Ukrainian</string>
+ <key>UnitesStates</key>
+ <string>UnitedStates</string>
+ <key>Yementite</key>
+ <string>Yemenite</string>
+ <key>abandonned</key>
+ <string>abandoned</string>
+ <key>aberation</key>
+ <string>aberration</string>
+ <key>abilties</key>
+ <string>abilities</string>
+ <key>abilty</key>
+ <string>ability</string>
+ <key>abondon</key>
+ <string>abandon</string>
+ <key>abondoned</key>
+ <string>abandoned</string>
+ <key>abondoning</key>
+ <string>abandoning</string>
+ <key>abondons</key>
+ <string>abandons</string>
+ <key>aborigene</key>
+ <string>aborigine</string>
+ <key>abortificant</key>
+ <string>abortifacient</string>
+ <key>abreviate</key>
+ <string>abbreviate</string>
+ <key>abreviated</key>
+ <string>abbreviated</string>
+ <key>abreviation</key>
+ <string>abbreviation</string>
+ <key>abritrary</key>
+ <string>arbitrary</string>
+ <key>absail</key>
+ <string>abseil</string>
+ <key>absailing</key>
+ <string>abseiling</string>
+ <key>absense</key>
+ <string>absence</string>
+ <key>absolutly</key>
+ <string>absolutely</string>
+ <key>absorbsion</key>
+ <string>absorption</string>
+ <key>absorbtion</key>
+ <string>absorption</string>
+ <key>abundacies</key>
+ <string>abundances</string>
+ <key>abundancies</key>
+ <string>abundances</string>
+ <key>abundunt</key>
+ <string>abundant</string>
+ <key>abutts</key>
+ <string>abuts</string>
+ <key>acadamy</key>
+ <string>academy</string>
+ <key>acadmic</key>
+ <string>academic</string>
+ <key>accademic</key>
+ <string>academic</string>
+ <key>accademy</key>
+ <string>academy</string>
+ <key>acccused</key>
+ <string>accused</string>
+ <key>accelleration</key>
+ <string>acceleration</string>
+ <key>accension</key>
+ <string>ascension</string>
+ <key>acceptence</key>
+ <string>acceptance</string>
+ <key>acceptible</key>
+ <string>acceptable</string>
+ <key>accessable</key>
+ <string>accessible</string>
+ <key>accidentaly</key>
+ <string>accidentally</string>
+ <key>accidently</key>
+ <string>accidentally</string>
+ <key>acclimitization</key>
+ <string>acclimatization</string>
+ <key>accomadate</key>
+ <string>accommodate</string>
+ <key>accomadated</key>
+ <string>accommodated</string>
+ <key>accomadates</key>
+ <string>accommodates</string>
+ <key>accomadating</key>
+ <string>accommodating</string>
+ <key>accomadation</key>
+ <string>accommodation</string>
+ <key>accomadations</key>
+ <string>accommodations</string>
+ <key>accomdate</key>
+ <string>accommodate</string>
+ <key>accomodate</key>
+ <string>accommodate</string>
+ <key>accomodated</key>
+ <string>accommodated</string>
+ <key>accomodates</key>
+ <string>accommodates</string>
+ <key>accomodating</key>
+ <string>accommodating</string>
+ <key>accomodation</key>
+ <string>accommodation</string>
+ <key>accomodations</key>
+ <string>accommodations</string>
+ <key>accompanyed</key>
+ <string>accompanied</string>
+ <key>accordeon</key>
+ <string>accordion</string>
+ <key>accordian</key>
+ <string>accordion</string>
+ <key>accoring</key>
+ <string>according</string>
+ <key>accoustic</key>
+ <string>acoustic</string>
+ <key>accquainted</key>
+ <string>acquainted </string>
+ <key>accrediation</key>
+ <string>accreditation</string>
+ <key>accredidation</key>
+ <string>accreditation</string>
+ <key>accross</key>
+ <string>across</string>
+ <key>accussed</key>
+ <string>accused</string>
+ <key>acedemic</key>
+ <string>academic</string>
+ <key>acheive</key>
+ <string>achieve</string>
+ <key>acheived</key>
+ <string>achieved</string>
+ <key>acheivement</key>
+ <string>achievement</string>
+ <key>acheivements</key>
+ <string>achievements</string>
+ <key>acheives</key>
+ <string>achieves</string>
+ <key>acheiving</key>
+ <string>achieving</string>
+ <key>acheivment</key>
+ <string>achievement</string>
+ <key>acheivments</key>
+ <string>achievements</string>
+ <key>achievment</key>
+ <string>achievement</string>
+ <key>achievments</key>
+ <string>achievements</string>
+ <key>achivement</key>
+ <string>achievement</string>
+ <key>achivements</key>
+ <string>achievements</string>
+ <key>acknowldeged</key>
+ <string>acknowledged</string>
+ <key>acknowledgeing</key>
+ <string>acknowledging</string>
+ <key>ackward</key>
+ <string>awkward</string>
+ <key>acommodate</key>
+ <string>accommodate</string>
+ <key>acomplish</key>
+ <string>accomplish</string>
+ <key>acomplished</key>
+ <string>accomplished</string>
+ <key>acomplishment</key>
+ <string>accomplishment</string>
+ <key>acomplishments</key>
+ <string>accomplishments</string>
+ <key>acording</key>
+ <string>according</string>
+ <key>acordingly</key>
+ <string>accordingly</string>
+ <key>acquaintence</key>
+ <string>acquaintance</string>
+ <key>acquaintences</key>
+ <string>acquaintances</string>
+ <key>acquiantence</key>
+ <string>acquaintance</string>
+ <key>acquiantences</key>
+ <string>acquaintances</string>
+ <key>acquited</key>
+ <string>acquitted</string>
+ <key>activites</key>
+ <string>activities</string>
+ <key>activly</key>
+ <string>actively</string>
+ <key>actualy</key>
+ <string>actually</string>
+ <key>acuracy</key>
+ <string>accuracy</string>
+ <key>acused</key>
+ <string>accused</string>
+ <key>acustom</key>
+ <string>accustom</string>
+ <key>acustommed</key>
+ <string>accustomed</string>
+ <key>adavanced</key>
+ <string>advanced</string>
+ <key>adbandon</key>
+ <string>abandon</string>
+ <key>additinally</key>
+ <string>additionally</string>
+ <key>additionaly</key>
+ <string>additionally</string>
+ <key>additonal</key>
+ <string>additional</string>
+ <key>additonally</key>
+ <string>additionally</string>
+ <key>addmission</key>
+ <string>admission</string>
+ <key>addopt</key>
+ <string>adopt</string>
+ <key>addopted</key>
+ <string>adopted</string>
+ <key>addoptive</key>
+ <string>adoptive</string>
+ <key>addres</key>
+ <string>address</string>
+ <key>addresable</key>
+ <string>addressable</string>
+ <key>addresed</key>
+ <string>addressed</string>
+ <key>addresing</key>
+ <string>addressing</string>
+ <key>addressess</key>
+ <string>addresses</string>
+ <key>addtion</key>
+ <string>addition</string>
+ <key>addtional</key>
+ <string>additional</string>
+ <key>adecuate</key>
+ <string>adequate</string>
+ <key>adequit</key>
+ <string>adequate</string>
+ <key>adhearing</key>
+ <string>adhering</string>
+ <key>adherance</key>
+ <string>adherence</string>
+ <key>admendment</key>
+ <string>amendment</string>
+ <key>admininistrative</key>
+ <string>administrative</string>
+ <key>adminstered</key>
+ <string>administered</string>
+ <key>adminstrate</key>
+ <string>administrate</string>
+ <key>adminstration</key>
+ <string>administration</string>
+ <key>adminstrative</key>
+ <string>administrative</string>
+ <key>adminstrator</key>
+ <string>administrator</string>
+ <key>admissability</key>
+ <string>admissibility</string>
+ <key>admissable</key>
+ <string>admissible</string>
+ <key>admited</key>
+ <string>admitted</string>
+ <key>admitedly</key>
+ <string>admittedly</string>
+ <key>adn</key>
+ <string>and</string>
+ <key>adolecent</key>
+ <string>adolescent</string>
+ <key>adquire</key>
+ <string>acquire</string>
+ <key>adquired</key>
+ <string>acquired</string>
+ <key>adquires</key>
+ <string>acquires</string>
+ <key>adquiring</key>
+ <string>acquiring</string>
+ <key>adres</key>
+ <string>address</string>
+ <key>adresable</key>
+ <string>addressable</string>
+ <key>adresing</key>
+ <string>addressing</string>
+ <key>adress</key>
+ <string>address</string>
+ <key>adressable</key>
+ <string>addressable</string>
+ <key>adressed</key>
+ <string>addressed</string>
+ <key>adressing</key>
+ <string>addressing</string>
+ <key>adventrous</key>
+ <string>adventurous</string>
+ <key>advertisment</key>
+ <string>advertisement</string>
+ <key>advertisments</key>
+ <string>advertisements</string>
+ <key>advesary</key>
+ <string>adversary</string>
+ <key>adviced</key>
+ <string>advised</string>
+ <key>aeriel</key>
+ <string>aerial</string>
+ <key>aeriels</key>
+ <string>aerials</string>
+ <key>afair</key>
+ <string>affair</string>
+ <key>afficianados</key>
+ <string>aficionados</string>
+ <key>afficionado</key>
+ <string>aficionado</string>
+ <key>afficionados</key>
+ <string>aficionados</string>
+ <key>affilate</key>
+ <string>affiliate</string>
+ <key>affilliate</key>
+ <string>affiliate</string>
+ <key>affort</key>
+ <string>afford</string>
+ <key>aforememtioned</key>
+ <string>aforementioned</string>
+ <key>againnst</key>
+ <string>against</string>
+ <key>agains</key>
+ <string>against</string>
+ <key>agaisnt</key>
+ <string>against</string>
+ <key>aganist</key>
+ <string>against</string>
+ <key>aggaravates</key>
+ <string>aggravates</string>
+ <key>aggreed</key>
+ <string>agreed</string>
+ <key>aggreement</key>
+ <string>agreement</string>
+ <key>aggregious</key>
+ <string>egregious</string>
+ <key>aggresive</key>
+ <string>aggressive</string>
+ <key>agian</key>
+ <string>again</string>
+ <key>agianst</key>
+ <string>against</string>
+ <key>agin</key>
+ <string>again</string>
+ <key>agina</key>
+ <string>again</string>
+ <key>aginst</key>
+ <string>against</string>
+ <key>agravate</key>
+ <string>aggravate</string>
+ <key>agre</key>
+ <string>agree</string>
+ <key>agred</key>
+ <string>agreed</string>
+ <key>agreeement</key>
+ <string>agreement</string>
+ <key>agreemnt</key>
+ <string>agreement</string>
+ <key>agregate</key>
+ <string>aggregate</string>
+ <key>agregates</key>
+ <string>aggregates</string>
+ <key>agreing</key>
+ <string>agreeing</string>
+ <key>agression</key>
+ <string>aggression</string>
+ <key>agressive</key>
+ <string>aggressive</string>
+ <key>agressively</key>
+ <string>aggressively</string>
+ <key>agressor</key>
+ <string>aggressor</string>
+ <key>agricuture</key>
+ <string>agriculture</string>
+ <key>agrieved</key>
+ <string>aggrieved</string>
+ <key>ahev</key>
+ <string>have</string>
+ <key>ahppen</key>
+ <string>happen</string>
+ <key>ahve</key>
+ <string>have</string>
+ <key>aicraft</key>
+ <string>aircraft</string>
+ <key>aiport</key>
+ <string>airport</string>
+ <key>airbourne</key>
+ <string>airborne</string>
+ <key>aircaft</key>
+ <string>aircraft</string>
+ <key>aircrafts</key>
+ <string>aircraft</string>
+ <key>airporta</key>
+ <string>airports</string>
+ <key>airrcraft</key>
+ <string>aircraft</string>
+ <key>aisian</key>
+ <string>asian</string>
+ <key>albiet</key>
+ <string>albeit</string>
+ <key>alchohol</key>
+ <string>alcohol</string>
+ <key>alchoholic</key>
+ <string>alcoholic</string>
+ <key>alchol</key>
+ <string>alcohol</string>
+ <key>alcholic</key>
+ <string>alcoholic</string>
+ <key>alcohal</key>
+ <string>alcohol</string>
+ <key>alcoholical</key>
+ <string>alcoholic</string>
+ <key>aledge</key>
+ <string>allege</string>
+ <key>aledged</key>
+ <string>alleged</string>
+ <key>aledges</key>
+ <string>alleges</string>
+ <key>alege</key>
+ <string>allege</string>
+ <key>aleged</key>
+ <string>alleged</string>
+ <key>alegience</key>
+ <string>allegiance</string>
+ <key>algebraical</key>
+ <string>algebraic</string>
+ <key>algorhitms</key>
+ <string>algorithms</string>
+ <key>algoritm</key>
+ <string>algorithm</string>
+ <key>algoritms</key>
+ <string>algorithms</string>
+ <key>alientating</key>
+ <string>alienating</string>
+ <key>alledge</key>
+ <string>allege</string>
+ <key>alledged</key>
+ <string>alleged</string>
+ <key>alledgedly</key>
+ <string>allegedly</string>
+ <key>alledges</key>
+ <string>alleges</string>
+ <key>allegedely</key>
+ <string>allegedly</string>
+ <key>allegedy</key>
+ <string>allegedly</string>
+ <key>allegely</key>
+ <string>allegedly</string>
+ <key>allegence</key>
+ <string>allegiance</string>
+ <key>allegience</key>
+ <string>allegiance</string>
+ <key>allign</key>
+ <string>align</string>
+ <key>alligned</key>
+ <string>aligned</string>
+ <key>alliviate</key>
+ <string>alleviate</string>
+ <key>allopone</key>
+ <string>allophone</string>
+ <key>allopones</key>
+ <string>allophones</string>
+ <key>allready</key>
+ <string>already</string>
+ <key>allthough</key>
+ <string>although</string>
+ <key>alltime</key>
+ <string>all-time</string>
+ <key>alltogether</key>
+ <string>altogether</string>
+ <key>almsot</key>
+ <string>almost</string>
+ <key>alochol</key>
+ <string>alcohol</string>
+ <key>alomst</key>
+ <string>almost</string>
+ <key>alot</key>
+ <string>a lot</string>
+ <key>alotted</key>
+ <string>allotted</string>
+ <key>alowed</key>
+ <string>allowed</string>
+ <key>alowing</key>
+ <string>allowing</string>
+ <key>alreayd</key>
+ <string>already</string>
+ <key>alse</key>
+ <string>else</string>
+ <key>alsot</key>
+ <string>also</string>
+ <key>alternitives</key>
+ <string>alternatives</string>
+ <key>altho</key>
+ <string>although</string>
+ <key>althought</key>
+ <string>although</string>
+ <key>altough</key>
+ <string>although</string>
+ <key>alusion</key>
+ <string>allusion</string>
+ <key>alwasy</key>
+ <string>always</string>
+ <key>alwyas</key>
+ <string>always</string>
+ <key>amalgomated</key>
+ <string>amalgamated</string>
+ <key>amatuer</key>
+ <string>amateur</string>
+ <key>amature</key>
+ <string>armature</string>
+ <key>amendmant</key>
+ <string>amendment</string>
+ <key>amerliorate</key>
+ <string>ameliorate</string>
+ <key>amke</key>
+ <string>make</string>
+ <key>amking</key>
+ <string>making</string>
+ <key>ammend</key>
+ <string>amend</string>
+ <key>ammended</key>
+ <string>amended</string>
+ <key>ammendment</key>
+ <string>amendment</string>
+ <key>ammendments</key>
+ <string>amendments</string>
+ <key>ammount</key>
+ <string>amount</string>
+ <key>ammused</key>
+ <string>amused</string>
+ <key>amoung</key>
+ <string>among</string>
+ <key>amoungst</key>
+ <string>amongst</string>
+ <key>amung</key>
+ <string>among</string>
+ <key>amunition</key>
+ <string>ammunition</string>
+ <key>analagous</key>
+ <string>analogous</string>
+ <key>analitic</key>
+ <string>analytic</string>
+ <key>analogeous</key>
+ <string>analogous</string>
+ <key>anarchim</key>
+ <string>anarchism</string>
+ <key>anarchistm</key>
+ <string>anarchism</string>
+ <key>anbd</key>
+ <string>and</string>
+ <key>ancestory</key>
+ <string>ancestry</string>
+ <key>ancilliary</key>
+ <string>ancillary</string>
+ <key>androgenous</key>
+ <string>androgynous</string>
+ <key>androgeny</key>
+ <string>androgyny</string>
+ <key>anihilation</key>
+ <string>annihilation</string>
+ <key>aniversary</key>
+ <string>anniversary</string>
+ <key>annoint</key>
+ <string>anoint</string>
+ <key>annointed</key>
+ <string>anointed</string>
+ <key>annointing</key>
+ <string>anointing</string>
+ <key>annoints</key>
+ <string>anoints</string>
+ <key>annouced</key>
+ <string>announced</string>
+ <key>annualy</key>
+ <string>annually</string>
+ <key>annuled</key>
+ <string>annulled</string>
+ <key>anohter</key>
+ <string>another</string>
+ <key>anomolies</key>
+ <string>anomalies</string>
+ <key>anomolous</key>
+ <string>anomalous</string>
+ <key>anomoly</key>
+ <string>anomaly</string>
+ <key>anonimity</key>
+ <string>anonymity</string>
+ <key>anounced</key>
+ <string>announced</string>
+ <key>anouncement</key>
+ <string>announcement</string>
+ <key>ansalisation</key>
+ <string>nasalisation</string>
+ <key>ansalization</key>
+ <string>nasalization</string>
+ <key>ansestors</key>
+ <string>ancestors</string>
+ <key>antartic</key>
+ <string>antarctic</string>
+ <key>anthromorphization</key>
+ <string>anthropomorphization</string>
+ <key>anthropolgist</key>
+ <string>anthropologist</string>
+ <key>anthropolgy</key>
+ <string>anthropology</string>
+ <key>anual</key>
+ <string>annual</string>
+ <key>anulled</key>
+ <string>annulled</string>
+ <key>anwsered</key>
+ <string>answered</string>
+ <key>anyhwere</key>
+ <string>anywhere</string>
+ <key>anyother</key>
+ <string>any other</string>
+ <key>anytying</key>
+ <string>anything</string>
+ <key>aparent</key>
+ <string>apparent</string>
+ <key>aparment</key>
+ <string>apartment</string>
+ <key>apenines</key>
+ <string>apennines</string>
+ <key>aplication</key>
+ <string>application</string>
+ <key>aplied</key>
+ <string>applied</string>
+ <key>apolegetics</key>
+ <string>apologetics</string>
+ <key>apon</key>
+ <string>apron</string>
+ <key>apparant</key>
+ <string>apparent</string>
+ <key>apparantly</key>
+ <string>apparently</string>
+ <key>appart</key>
+ <string>apart</string>
+ <key>appartment</key>
+ <string>apartment</string>
+ <key>appartments</key>
+ <string>apartments</string>
+ <key>appealling</key>
+ <string>appealing</string>
+ <key>appeareance</key>
+ <string>appearance</string>
+ <key>appearence</key>
+ <string>appearance</string>
+ <key>appearences</key>
+ <string>appearances</string>
+ <key>apperance</key>
+ <string>appearance</string>
+ <key>apperances</key>
+ <string>appearances</string>
+ <key>appereance</key>
+ <string>appearance</string>
+ <key>appereances</key>
+ <string>appearances</string>
+ <key>applicaiton</key>
+ <string>application</string>
+ <key>applicaitons</key>
+ <string>applications</string>
+ <key>appologies</key>
+ <string>apologies</string>
+ <key>appology</key>
+ <string>apology</string>
+ <key>apprearance</key>
+ <string>appearance</string>
+ <key>apprieciate</key>
+ <string>appreciate</string>
+ <key>approachs</key>
+ <string>approaches</string>
+ <key>appropiate</key>
+ <string>appropriate</string>
+ <key>appropraite</key>
+ <string>appropriate</string>
+ <key>appropropiate</key>
+ <string>appropriate</string>
+ <key>approproximate</key>
+ <string>approximate</string>
+ <key>approxamately</key>
+ <string>approximately</string>
+ <key>approxiately</key>
+ <string>approximately</string>
+ <key>approximitely</key>
+ <string>approximately</string>
+ <key>aprehensive</key>
+ <string>apprehensive</string>
+ <key>apropriate</key>
+ <string>appropriate</string>
+ <key>aproximate</key>
+ <string>approximate</string>
+ <key>aproximately</key>
+ <string>approximately</string>
+ <key>aquaduct</key>
+ <string>aqueduct</string>
+ <key>aquaintance</key>
+ <string>acquaintance</string>
+ <key>aquainted</key>
+ <string>acquainted</string>
+ <key>aquiantance</key>
+ <string>acquaintance</string>
+ <key>aquire</key>
+ <string>acquire</string>
+ <key>aquired</key>
+ <string>acquired</string>
+ <key>aquiring</key>
+ <string>acquiring</string>
+ <key>aquisition</key>
+ <string>acquisition</string>
+ <key>aquitted</key>
+ <string>acquitted</string>
+ <key>aranged</key>
+ <string>arranged</string>
+ <key>arangement</key>
+ <string>arrangement</string>
+ <key>arbitarily</key>
+ <string>arbitrarily</string>
+ <key>arbitary</key>
+ <string>arbitrary</string>
+ <key>archaelogists</key>
+ <string>archaeologists</string>
+ <key>archaelogy</key>
+ <string>archaeology</string>
+ <key>archaoelogy</key>
+ <string>archaeology</string>
+ <key>archaology</key>
+ <string>archaeology</string>
+ <key>archeaologist</key>
+ <string>archaeologist</string>
+ <key>archeaologists</key>
+ <string>archaeologists</string>
+ <key>archetect</key>
+ <string>architect</string>
+ <key>archetects</key>
+ <string>architects</string>
+ <key>archetectural</key>
+ <string>architectural</string>
+ <key>archetecturally</key>
+ <string>architecturally</string>
+ <key>archetecture</key>
+ <string>architecture</string>
+ <key>archiac</key>
+ <string>archaic</string>
+ <key>archictect</key>
+ <string>architect</string>
+ <key>archimedian</key>
+ <string>archimedean</string>
+ <key>architecht</key>
+ <string>architect</string>
+ <key>architechturally</key>
+ <string>architecturally</string>
+ <key>architechture</key>
+ <string>architecture</string>
+ <key>architechtures</key>
+ <string>architectures</string>
+ <key>architectual</key>
+ <string>architectural</string>
+ <key>archtype</key>
+ <string>archetype</string>
+ <key>archtypes</key>
+ <string>archetypes</string>
+ <key>aready</key>
+ <string>already</string>
+ <key>areodynamics</key>
+ <string>aerodynamics</string>
+ <key>argubly</key>
+ <string>arguably</string>
+ <key>arguement</key>
+ <string>argument</string>
+ <key>arguements</key>
+ <string>arguments</string>
+ <key>arised</key>
+ <string>arose</string>
+ <key>arival</key>
+ <string>arrival</string>
+ <key>armamant</key>
+ <string>armament</string>
+ <key>armistace</key>
+ <string>armistice</string>
+ <key>arogant</key>
+ <string>arrogant</string>
+ <key>arogent</key>
+ <string>arrogant</string>
+ <key>aroud</key>
+ <string>around</string>
+ <key>arrangment</key>
+ <string>arrangement</string>
+ <key>arrangments</key>
+ <string>arrangements</string>
+ <key>arround</key>
+ <string>around</string>
+ <key>artical</key>
+ <string>article</string>
+ <key>artice</key>
+ <string>article</string>
+ <key>articel</key>
+ <string>article</string>
+ <key>artifical</key>
+ <string>artificial</string>
+ <key>artifically</key>
+ <string>artificially</string>
+ <key>artillary</key>
+ <string>artillery</string>
+ <key>arund</key>
+ <string>around</string>
+ <key>asetic</key>
+ <string>ascetic</string>
+ <key>asfar</key>
+ <string>as far</string>
+ <key>asign</key>
+ <string>assign</string>
+ <key>aslo</key>
+ <string>also</string>
+ <key>asociated</key>
+ <string>associated</string>
+ <key>asorbed</key>
+ <string>absorbed</string>
+ <key>asphyxation</key>
+ <string>asphyxiation</string>
+ <key>assasin</key>
+ <string>assassin</string>
+ <key>assasinate</key>
+ <string>assassinate</string>
+ <key>assasinated</key>
+ <string>assassinated</string>
+ <key>assasinates</key>
+ <string>assassinates</string>
+ <key>assasination</key>
+ <string>assassination</string>
+ <key>assasinations</key>
+ <string>assassinations</string>
+ <key>assasined</key>
+ <string>assassinated</string>
+ <key>assasins</key>
+ <string>assassins</string>
+ <key>assassintation</key>
+ <string>assassination</string>
+ <key>assemple</key>
+ <string>assemble</string>
+ <key>assertation</key>
+ <string>assertion</string>
+ <key>asside</key>
+ <string>aside</string>
+ <key>assisnate</key>
+ <string>assassinate</string>
+ <key>assit</key>
+ <string>assist</string>
+ <key>assitant</key>
+ <string>assistant</string>
+ <key>assocation</key>
+ <string>association</string>
+ <key>assoicate</key>
+ <string>associate</string>
+ <key>assoicated</key>
+ <string>associated</string>
+ <key>assoicates</key>
+ <string>associates</string>
+ <key>assosication</key>
+ <string>assassination</string>
+ <key>asssassans</key>
+ <string>assassins</string>
+ <key>assualt</key>
+ <string>assault</string>
+ <key>assualted</key>
+ <string>assaulted</string>
+ <key>assymetric</key>
+ <string>asymmetric</string>
+ <key>assymetrical</key>
+ <string>asymmetrical</string>
+ <key>asteriod</key>
+ <string>asteroid</string>
+ <key>asthetic</key>
+ <string>aesthetic</string>
+ <key>asthetical</key>
+ <string>aesthetical</string>
+ <key>asthetically</key>
+ <string>aesthetically</string>
+ <key>asume</key>
+ <string>assume</string>
+ <key>aswell</key>
+ <string>as well</string>
+ <key>atain</key>
+ <string>attain</string>
+ <key>atempting</key>
+ <string>attempting</string>
+ <key>atheistical</key>
+ <string>atheistic</string>
+ <key>athenean</key>
+ <string>athenian</string>
+ <key>atheneans</key>
+ <string>athenians</string>
+ <key>athiesm</key>
+ <string>atheism</string>
+ <key>athiest</key>
+ <string>atheist</string>
+ <key>atorney</key>
+ <string>attorney</string>
+ <key>atribute</key>
+ <string>attribute</string>
+ <key>atributed</key>
+ <string>attributed</string>
+ <key>atributes</key>
+ <string>attributes</string>
+ <key>attaindre</key>
+ <string>attainder</string>
+ <key>attemp</key>
+ <string>attempt</string>
+ <key>attemped</key>
+ <string>attempted</string>
+ <key>attemt</key>
+ <string>attempt</string>
+ <key>attemted</key>
+ <string>attempted</string>
+ <key>attemting</key>
+ <string>attempting</string>
+ <key>attemts</key>
+ <string>attempts</string>
+ <key>attendence</key>
+ <string>attendance</string>
+ <key>attendent</key>
+ <string>attendant</string>
+ <key>attendents</key>
+ <string>attendants</string>
+ <key>attened</key>
+ <string>attended</string>
+ <key>attension</key>
+ <string>attention</string>
+ <key>attitide</key>
+ <string>attitude</string>
+ <key>attributred</key>
+ <string>attributed</string>
+ <key>attrocities</key>
+ <string>atrocities</string>
+ <key>audeince</key>
+ <string>audience</string>
+ <key>auromated</key>
+ <string>automated</string>
+ <key>austrailia</key>
+ <string>Australia</string>
+ <key>austrailian</key>
+ <string>Australian</string>
+ <key>auther</key>
+ <string>author</string>
+ <key>authobiographic</key>
+ <string>autobiographic</string>
+ <key>authobiography</key>
+ <string>autobiography</string>
+ <key>authorative</key>
+ <string>authoritative</string>
+ <key>authorites</key>
+ <string>authorities</string>
+ <key>authorithy</key>
+ <string>authority</string>
+ <key>authoritiers</key>
+ <string>authorities</string>
+ <key>authoritive</key>
+ <string>authoritative</string>
+ <key>authrorities</key>
+ <string>authorities</string>
+ <key>autochtonous</key>
+ <string>autochthonous</string>
+ <key>autoctonous</key>
+ <string>autochthonous</string>
+ <key>automaticly</key>
+ <string>automatically</string>
+ <key>automibile</key>
+ <string>automobile</string>
+ <key>automonomous</key>
+ <string>autonomous</string>
+ <key>autor</key>
+ <string>author</string>
+ <key>autority</key>
+ <string>authority</string>
+ <key>auxilary</key>
+ <string>auxiliary</string>
+ <key>auxillaries</key>
+ <string>auxiliaries</string>
+ <key>auxillary</key>
+ <string>auxiliary</string>
+ <key>auxilliaries</key>
+ <string>auxiliaries</string>
+ <key>auxilliary</key>
+ <string>auxiliary</string>
+ <key>availabe</key>
+ <string> available</string>
+ <key>availablity</key>
+ <string>availability</string>
+ <key>availaible</key>
+ <string>available</string>
+ <key>availble</key>
+ <string>available</string>
+ <key>availiable</key>
+ <string>available</string>
+ <key>availible</key>
+ <string>available</string>
+ <key>avalable</key>
+ <string>available</string>
+ <key>avalance</key>
+ <string>avalanche</string>
+ <key>avaliable</key>
+ <string>available</string>
+ <key>avation</key>
+ <string>aviation</string>
+ <key>avengence</key>
+ <string>a vengeance</string>
+ <key>averageed</key>
+ <string>averaged</string>
+ <key>avilable</key>
+ <string>available</string>
+ <key>awared</key>
+ <string>awarded</string>
+ <key>awya</key>
+ <string>away</string>
+ <key>baceause</key>
+ <string>because</string>
+ <key>backgorund</key>
+ <string>background</string>
+ <key>backrounds</key>
+ <string>backgrounds</string>
+ <key>bakc</key>
+ <string>back</string>
+ <key>banannas</key>
+ <string>bananas</string>
+ <key>bandwith</key>
+ <string>bandwidth</string>
+ <key>bankrupcy</key>
+ <string>bankruptcy</string>
+ <key>banruptcy</key>
+ <string>bankruptcy</string>
+ <key>baout</key>
+ <string>about</string>
+ <key>basicaly</key>
+ <string>basically</string>
+ <key>basicly</key>
+ <string>basically</string>
+ <key>bcak</key>
+ <string>back</string>
+ <key>beachead</key>
+ <string>beachhead</string>
+ <key>beacuse</key>
+ <string>because</string>
+ <key>beastiality</key>
+ <string>bestiality</string>
+ <key>beatiful</key>
+ <string>beautiful</string>
+ <key>beaurocracy</key>
+ <string>bureaucracy</string>
+ <key>beaurocratic</key>
+ <string>bureaucratic</string>
+ <key>beautyfull</key>
+ <string>beautiful</string>
+ <key>becamae</key>
+ <string>became</string>
+ <key>becames</key>
+ <string>becomes</string>
+ <key>becasue</key>
+ <string>because</string>
+ <key>beccause</key>
+ <string>because</string>
+ <key>becomeing</key>
+ <string>becoming</string>
+ <key>becomming</key>
+ <string>becoming</string>
+ <key>becouse</key>
+ <string>because</string>
+ <key>becuase</key>
+ <string>because</string>
+ <key>bedore</key>
+ <string>before</string>
+ <key>befoer</key>
+ <string>before</string>
+ <key>beggin</key>
+ <string>begin</string>
+ <key>begginer</key>
+ <string>beginner</string>
+ <key>begginers</key>
+ <string>beginners</string>
+ <key>beggining</key>
+ <string>beginning</string>
+ <key>begginings</key>
+ <string>beginnings</string>
+ <key>beggins</key>
+ <string>begins</string>
+ <key>begining</key>
+ <string>beginning</string>
+ <key>beginnig</key>
+ <string>beginning</string>
+ <key>behavour</key>
+ <string>behavior</string>
+ <key>beleagured</key>
+ <string>beleaguered</string>
+ <key>beleif</key>
+ <string>belief</string>
+ <key>beleive</key>
+ <string>believe</string>
+ <key>beleived</key>
+ <string>believed</string>
+ <key>beleives</key>
+ <string>believes</string>
+ <key>beleiving</key>
+ <string>believing</string>
+ <key>beligum</key>
+ <string>belgium</string>
+ <key>belive</key>
+ <string>believe</string>
+ <key>belived</key>
+ <string>believed</string>
+ <key>belives</key>
+ <string>believes</string>
+ <key>belligerant</key>
+ <string>belligerent</string>
+ <key>bellweather</key>
+ <string>bellwether</string>
+ <key>bemusemnt</key>
+ <string>bemusement</string>
+ <key>beneficary</key>
+ <string>beneficiary</string>
+ <key>beng</key>
+ <string>being</string>
+ <key>benificial</key>
+ <string>beneficial</string>
+ <key>benifit</key>
+ <string>benefit</string>
+ <key>benifits</key>
+ <string>benefits</string>
+ <key>bergamont</key>
+ <string>bergamot</string>
+ <key>beseige</key>
+ <string>besiege</string>
+ <key>beseiged</key>
+ <string>besieged</string>
+ <key>beseiging</key>
+ <string>besieging</string>
+ <key>betwen</key>
+ <string>between</string>
+ <key>beween</key>
+ <string>between</string>
+ <key>bewteen</key>
+ <string>between</string>
+ <key>bilateraly</key>
+ <string>bilaterally</string>
+ <key>billingualism</key>
+ <string>bilingualism</string>
+ <key>binominal</key>
+ <string>binomial</string>
+ <key>bizzare</key>
+ <string>bizarre</string>
+ <key>blaim</key>
+ <string>blame</string>
+ <key>blaimed</key>
+ <string>blamed</string>
+ <key>blessure</key>
+ <string>blessing</string>
+ <key>bodydbuilder</key>
+ <string>bodybuilder</string>
+ <key>bombardement</key>
+ <string>bombardment</string>
+ <key>bombarment</key>
+ <string>bombardment</string>
+ <key>bondary</key>
+ <string>boundary</string>
+ <key>borke</key>
+ <string>broke</string>
+ <key>boundry</key>
+ <string>boundary</string>
+ <key>bouyancy</key>
+ <string>buoyancy</string>
+ <key>bouyant</key>
+ <string>buoyant</string>
+ <key>boyant</key>
+ <string>buoyant</string>
+ <key>breakthough</key>
+ <string>breakthrough</string>
+ <key>breakthroughts</key>
+ <string>breakthroughs</string>
+ <key>breif</key>
+ <string>brief</string>
+ <key>breifly</key>
+ <string>briefly</string>
+ <key>brethen</key>
+ <string>brethren</string>
+ <key>bretheren</key>
+ <string>brethren</string>
+ <key>briliant</key>
+ <string>brilliant</string>
+ <key>brillant</key>
+ <string>brilliant</string>
+ <key>brimestone</key>
+ <string>brimstone</string>
+ <key>broacasted</key>
+ <string>broadcast</string>
+ <key>broadacasting</key>
+ <string>broadcasting</string>
+ <key>broady</key>
+ <string>broadly</string>
+ <key>buisness</key>
+ <string>business</string>
+ <key>buisnessman</key>
+ <string>businessman</string>
+ <key>buoancy</key>
+ <string>buoyancy</string>
+ <key>burried</key>
+ <string>buried</string>
+ <key>busineses</key>
+ <string>businesses</string>
+ <key>busness</key>
+ <string>business</string>
+ <key>bussiness</key>
+ <string>business</string>
+ <key>caculater</key>
+ <string>calculator</string>
+ <key>cacuses</key>
+ <string>caucuses</string>
+ <key>cahracters</key>
+ <string>characters</string>
+ <key>calaber</key>
+ <string>caliber</string>
+ <key>calculater</key>
+ <string>calculator</string>
+ <key>calculs</key>
+ <string>calculus</string>
+ <key>calenders</key>
+ <string>calendars</string>
+ <key>caligraphy</key>
+ <string>calligraphy</string>
+ <key>caluclate</key>
+ <string>calculate</string>
+ <key>caluclated</key>
+ <string>calculated</string>
+ <key>caluculate</key>
+ <string>calculate</string>
+ <key>caluculated</key>
+ <string>calculated</string>
+ <key>calulate</key>
+ <string>calculate</string>
+ <key>calulated</key>
+ <string>calculated</string>
+ <key>calulater</key>
+ <string>calculator</string>
+ <key>camoflage</key>
+ <string>camouflage</string>
+ <key>campain</key>
+ <string>campaign</string>
+ <key>campains</key>
+ <string>campaigns</string>
+ <key>candadate</key>
+ <string>candidate</string>
+ <key>candiate</key>
+ <string>candidate</string>
+ <key>candidiate</key>
+ <string>candidate</string>
+ <key>cannister</key>
+ <string>canister</string>
+ <key>cannisters</key>
+ <string>canisters</string>
+ <key>cannnot</key>
+ <string>cannot</string>
+ <key>cannonical</key>
+ <string>canonical</string>
+ <key>cannotation</key>
+ <string>connotation</string>
+ <key>cannotations</key>
+ <string>connotations</string>
+ <key>cant</key>
+ <string>can&apos;t</string>
+ <key>caost</key>
+ <string>coast</string>
+ <key>caperbility</key>
+ <string>capability</string>
+ <key>capible</key>
+ <string>capable</string>
+ <key>captial</key>
+ <string>capital</string>
+ <key>captued</key>
+ <string>captured</string>
+ <key>capturd</key>
+ <string>captured</string>
+ <key>carachter</key>
+ <string>character</string>
+ <key>caracterized</key>
+ <string>characterized</string>
+ <key>carcas</key>
+ <string>carcass</string>
+ <key>carefull</key>
+ <string>careful</string>
+ <key>careing</key>
+ <string>caring</string>
+ <key>carismatic</key>
+ <string>charismatic</string>
+ <key>carnege</key>
+ <string>carnage</string>
+ <key>carnige</key>
+ <string>carnage</string>
+ <key>carniverous</key>
+ <string>carnivorous</string>
+ <key>carreer</key>
+ <string>career</string>
+ <key>carrers</key>
+ <string>careers</string>
+ <key>cartdridge</key>
+ <string>cartridge</string>
+ <key>carthographer</key>
+ <string>cartographer</string>
+ <key>cartilege</key>
+ <string>cartilage</string>
+ <key>cartilidge</key>
+ <string>cartilage</string>
+ <key>cartrige</key>
+ <string>cartridge</string>
+ <key>casette</key>
+ <string>cassette</string>
+ <key>casion</key>
+ <string>caisson</string>
+ <key>cassawory</key>
+ <string>cassowary</string>
+ <key>cassowarry</key>
+ <string>cassowary</string>
+ <key>casulaties</key>
+ <string>casualties</string>
+ <key>casulaty</key>
+ <string>casualty</string>
+ <key>catagories</key>
+ <string>categories</string>
+ <key>catagorized</key>
+ <string>categorized</string>
+ <key>catagory</key>
+ <string>category</string>
+ <key>catapillar</key>
+ <string>caterpillar</string>
+ <key>catapillars</key>
+ <string>caterpillars</string>
+ <key>catapiller</key>
+ <string>caterpillar</string>
+ <key>catapillers</key>
+ <string>caterpillars</string>
+ <key>catepillar</key>
+ <string>caterpillar</string>
+ <key>catepillars</key>
+ <string>caterpillars</string>
+ <key>catergorize</key>
+ <string>categorize</string>
+ <key>catergorized</key>
+ <string>categorized</string>
+ <key>caterpilar</key>
+ <string>caterpillar</string>
+ <key>caterpilars</key>
+ <string>caterpillars</string>
+ <key>caterpiller</key>
+ <string>caterpillar</string>
+ <key>caterpillers</key>
+ <string>caterpillars</string>
+ <key>cathlic</key>
+ <string>catholic</string>
+ <key>catholocism</key>
+ <string>catholicism</string>
+ <key>catterpilar</key>
+ <string>caterpillar</string>
+ <key>catterpilars</key>
+ <string>caterpillars</string>
+ <key>catterpillar</key>
+ <string>caterpillar</string>
+ <key>catterpillars</key>
+ <string>caterpillars</string>
+ <key>cattleship</key>
+ <string>battleship</string>
+ <key>causalities</key>
+ <string>casualties</string>
+ <key>cellpading</key>
+ <string>cellpadding</string>
+ <key>cementary</key>
+ <string>cemetery</string>
+ <key>cemetarey</key>
+ <string>cemetery</string>
+ <key>cemetaries</key>
+ <string>cemeteries</string>
+ <key>cemetary</key>
+ <string>cemetery</string>
+ <key>cencus</key>
+ <string>census</string>
+ <key>censur</key>
+ <string>censor</string>
+ <key>cententenial</key>
+ <string>centennial</string>
+ <key>centruies</key>
+ <string>centuries</string>
+ <key>centruy</key>
+ <string>century</string>
+ <key>ceratin</key>
+ <string>certain</string>
+ <key>cerimonial</key>
+ <string>ceremonial</string>
+ <key>cerimonies</key>
+ <string>ceremonies</string>
+ <key>cerimonious</key>
+ <string>ceremonious</string>
+ <key>cerimony</key>
+ <string>ceremony</string>
+ <key>ceromony</key>
+ <string>ceremony</string>
+ <key>certainity</key>
+ <string>certainty</string>
+ <key>certian</key>
+ <string>certain</string>
+ <key>chalenging</key>
+ <string>challenging</string>
+ <key>challange</key>
+ <string>challenge</string>
+ <key>challanged</key>
+ <string>challenged</string>
+ <key>challege</key>
+ <string>challenge</string>
+ <key>changable</key>
+ <string>changeable</string>
+ <key>charachter</key>
+ <string>character</string>
+ <key>charachters</key>
+ <string>characters</string>
+ <key>charactersistic</key>
+ <string>characteristic</string>
+ <key>charactor</key>
+ <string>character </string>
+ <key>charactors</key>
+ <string>characters</string>
+ <key>charasmatic</key>
+ <string>charismatic</string>
+ <key>charaterized</key>
+ <string>characterized</string>
+ <key>chariman</key>
+ <string>chairman</string>
+ <key>charistics</key>
+ <string>characteristics</string>
+ <key>cheif</key>
+ <string>chief</string>
+ <key>cheifs</key>
+ <string>chiefs</string>
+ <key>chemcial</key>
+ <string>chemical</string>
+ <key>chemcially</key>
+ <string>chemically</string>
+ <key>chemestry</key>
+ <string>chemistry</string>
+ <key>chemicaly</key>
+ <string>chemically</string>
+ <key>childbird</key>
+ <string>childbirth</string>
+ <key>childen</key>
+ <string>children</string>
+ <key>choosen</key>
+ <string>chosen</string>
+ <key>chracter</key>
+ <string>character</string>
+ <key>chuch</key>
+ <string>church</string>
+ <key>churchs</key>
+ <string>churches</string>
+ <key>circulaton</key>
+ <string>circulation</string>
+ <key>circumsicion</key>
+ <string>circumcision</string>
+ <key>circut</key>
+ <string>circuit</string>
+ <key>ciricuit</key>
+ <string>circuit</string>
+ <key>ciriculum</key>
+ <string>curriculum</string>
+ <key>civillian</key>
+ <string>civilian</string>
+ <key>claer</key>
+ <string>clear</string>
+ <key>claerer</key>
+ <string>clearer</string>
+ <key>claerly</key>
+ <string>clearly</string>
+ <key>claimes</key>
+ <string>claims</string>
+ <key>clas</key>
+ <string>class</string>
+ <key>clasic</key>
+ <string>classic</string>
+ <key>clasical</key>
+ <string>classical</string>
+ <key>clasically</key>
+ <string>classically</string>
+ <key>cleareance</key>
+ <string>clearance</string>
+ <key>clera</key>
+ <string>clear</string>
+ <key>clincial</key>
+ <string>clinical</string>
+ <key>clinicaly</key>
+ <string>clinically</string>
+ <key>cmo</key>
+ <string>com</string>
+ <key>cmoputer</key>
+ <string>computer</string>
+ <key>co-incided</key>
+ <string>coincided</string>
+ <key>coctail</key>
+ <string>cocktail</string>
+ <key>coform</key>
+ <string>conform</string>
+ <key>cognizent</key>
+ <string>cognizant</string>
+ <key>coincedentally</key>
+ <string>coincidentally</string>
+ <key>colaborations</key>
+ <string>collaborations</string>
+ <key>colateral</key>
+ <string>collateral</string>
+ <key>colelctive</key>
+ <string>collective</string>
+ <key>collaberative</key>
+ <string>collaborative</string>
+ <key>collecton</key>
+ <string>collection</string>
+ <key>collegue</key>
+ <string>colleague</string>
+ <key>collegues</key>
+ <string>colleagues</string>
+ <key>collonade</key>
+ <string>colonnade</string>
+ <key>collonies</key>
+ <string>colonies</string>
+ <key>collony</key>
+ <string>colony </string>
+ <key>collosal</key>
+ <string>colossal</string>
+ <key>colonizators</key>
+ <string>colonizers</string>
+ <key>comander</key>
+ <string>commander</string>
+ <key>comando</key>
+ <string>commando</string>
+ <key>comandos</key>
+ <string>commandos</string>
+ <key>comany</key>
+ <string>company</string>
+ <key>comapany</key>
+ <string>company</string>
+ <key>comback</key>
+ <string>comeback</string>
+ <key>combanations</key>
+ <string>combinations</string>
+ <key>combinatins</key>
+ <string>combinations</string>
+ <key>combusion</key>
+ <string>combustion</string>
+ <key>comdemnation</key>
+ <string>condemnation</string>
+ <key>comemmorates</key>
+ <string>commemorates</string>
+ <key>comemoretion</key>
+ <string>commemoration</string>
+ <key>comision</key>
+ <string>commission</string>
+ <key>comisioned</key>
+ <string>commissioned</string>
+ <key>comisioner</key>
+ <string>commissioner</string>
+ <key>comisioning</key>
+ <string>commissioning</string>
+ <key>comisions</key>
+ <string>commissions</string>
+ <key>comission</key>
+ <string>commission</string>
+ <key>comissioned</key>
+ <string>commissioned</string>
+ <key>comissioner</key>
+ <string>commissioner</string>
+ <key>comissioning</key>
+ <string>commissioning</string>
+ <key>comissions</key>
+ <string>commissions</string>
+ <key>comited</key>
+ <string>committed</string>
+ <key>comiting</key>
+ <string>committing</string>
+ <key>comitted</key>
+ <string>committed</string>
+ <key>comittee</key>
+ <string>committee</string>
+ <key>comitting</key>
+ <string>committing</string>
+ <key>commandoes</key>
+ <string>commandos</string>
+ <key>commedic</key>
+ <string>comedic</string>
+ <key>commemerative</key>
+ <string>commemorative</string>
+ <key>commemmorate</key>
+ <string>commemorate</string>
+ <key>commemmorating</key>
+ <string>commemorating</string>
+ <key>commerical</key>
+ <string>commercial</string>
+ <key>commerically</key>
+ <string>commercially</string>
+ <key>commericial</key>
+ <string>commercial</string>
+ <key>commericially</key>
+ <string>commercially</string>
+ <key>commerorative</key>
+ <string>commemorative</string>
+ <key>comming</key>
+ <string>coming</string>
+ <key>comminication</key>
+ <string>communication</string>
+ <key>commision</key>
+ <string>commission</string>
+ <key>commisioned</key>
+ <string>commissioned</string>
+ <key>commisioner</key>
+ <string>commissioner</string>
+ <key>commisioning</key>
+ <string>commissioning</string>
+ <key>commisions</key>
+ <string>commissions</string>
+ <key>commited</key>
+ <string>committed</string>
+ <key>commitee</key>
+ <string>committee</string>
+ <key>commiting</key>
+ <string>committing</string>
+ <key>committe</key>
+ <string>committee</string>
+ <key>committment</key>
+ <string>commitment</string>
+ <key>committments</key>
+ <string>commitments</string>
+ <key>commmemorated</key>
+ <string>commemorated</string>
+ <key>commongly</key>
+ <string>commonly</string>
+ <key>commonweath</key>
+ <string>commonwealth</string>
+ <key>commuications</key>
+ <string>communications</string>
+ <key>commuinications</key>
+ <string>communications</string>
+ <key>communciation</key>
+ <string>communication</string>
+ <key>communiation</key>
+ <string>communication</string>
+ <key>communites</key>
+ <string>communities</string>
+ <key>compability</key>
+ <string>compatibility</string>
+ <key>comparision</key>
+ <string>comparison</string>
+ <key>comparisions</key>
+ <string>comparisons</string>
+ <key>comparitive</key>
+ <string>comparative</string>
+ <key>comparitively</key>
+ <string>comparatively</string>
+ <key>compatabilities</key>
+ <string>compatibilities</string>
+ <key>compatability</key>
+ <string>compatibility</string>
+ <key>compatable</key>
+ <string>compatible</string>
+ <key>compatablities</key>
+ <string>compatibilities</string>
+ <key>compatablity</key>
+ <string>compatibility</string>
+ <key>compatiable</key>
+ <string>compatible</string>
+ <key>compatiblities</key>
+ <string>compatibilities</string>
+ <key>compatiblity</key>
+ <string>compatibility</string>
+ <key>compeitions</key>
+ <string>competitions</string>
+ <key>compensantion</key>
+ <string>compensation</string>
+ <key>competance</key>
+ <string>competence</string>
+ <key>competant</key>
+ <string>competent</string>
+ <key>competative</key>
+ <string>competitive</string>
+ <key>competion</key>
+ <string>competition</string>
+ <key>competitiion</key>
+ <string>competition</string>
+ <key>competive</key>
+ <string>competitive</string>
+ <key>competiveness</key>
+ <string>competitiveness</string>
+ <key>comphrehensive</key>
+ <string>comprehensive</string>
+ <key>compitent</key>
+ <string>competent</string>
+ <key>completedthe</key>
+ <string>completed the</string>
+ <key>completelyl</key>
+ <string>completely</string>
+ <key>completetion</key>
+ <string>completion</string>
+ <key>complier</key>
+ <string>compiler</string>
+ <key>componant</key>
+ <string>component</string>
+ <key>comprable</key>
+ <string>comparable</string>
+ <key>comprimise</key>
+ <string>compromise</string>
+ <key>compulsary</key>
+ <string>compulsory</string>
+ <key>compulsery</key>
+ <string>compulsory</string>
+ <key>computarized</key>
+ <string>computerized</string>
+ <key>concensus</key>
+ <string>consensus</string>
+ <key>concider</key>
+ <string>consider</string>
+ <key>concidered</key>
+ <string>considered</string>
+ <key>concidering</key>
+ <string>considering</string>
+ <key>conciders</key>
+ <string>considers</string>
+ <key>concieted</key>
+ <string>conceited</string>
+ <key>concieved</key>
+ <string>conceived</string>
+ <key>concious</key>
+ <string>conscious</string>
+ <key>conciously</key>
+ <string>consciously</string>
+ <key>conciousness</key>
+ <string>consciousness</string>
+ <key>condamned</key>
+ <string>condemned</string>
+ <key>condemmed</key>
+ <string>condemned</string>
+ <key>condidtion</key>
+ <string>condition</string>
+ <key>condidtions</key>
+ <string>conditions</string>
+ <key>conditionsof</key>
+ <string>conditions of</string>
+ <key>conected</key>
+ <string>connected</string>
+ <key>conection</key>
+ <string>connection</string>
+ <key>conesencus</key>
+ <string>consensus</string>
+ <key>confidental</key>
+ <string>confidential</string>
+ <key>confidentally</key>
+ <string>confidentially</string>
+ <key>confids</key>
+ <string>confides</string>
+ <key>configureable</key>
+ <string>configurable</string>
+ <key>confortable</key>
+ <string>comfortable</string>
+ <key>congradulations</key>
+ <string>congratulations</string>
+ <key>congresional</key>
+ <string>congressional</string>
+ <key>conived</key>
+ <string>connived</string>
+ <key>conjecutre</key>
+ <string>conjecture</string>
+ <key>conjuction</key>
+ <string>conjunction</string>
+ <key>conotations</key>
+ <string>connotations</string>
+ <key>conquerd</key>
+ <string>conquered</string>
+ <key>conquerer</key>
+ <string>conqueror</string>
+ <key>conquerers</key>
+ <string>conquerors</string>
+ <key>conqured</key>
+ <string>conquered</string>
+ <key>conscent</key>
+ <string>consent</string>
+ <key>consciouness</key>
+ <string>consciousness</string>
+ <key>consdider</key>
+ <string>consider</string>
+ <key>consdidered</key>
+ <string>considered</string>
+ <key>consdiered</key>
+ <string>considered</string>
+ <key>consectutive</key>
+ <string>consecutive</string>
+ <key>consenquently</key>
+ <string>consequently</string>
+ <key>consentrate</key>
+ <string>concentrate</string>
+ <key>consentrated</key>
+ <string>concentrated</string>
+ <key>consentrates</key>
+ <string>concentrates</string>
+ <key>consept</key>
+ <string>concept</string>
+ <key>consequentually</key>
+ <string>consequently</string>
+ <key>consequeseces</key>
+ <string>consequences</string>
+ <key>consern</key>
+ <string>concern</string>
+ <key>conserned</key>
+ <string>concerned</string>
+ <key>conserning</key>
+ <string>concerning</string>
+ <key>conservitive</key>
+ <string>conservative</string>
+ <key>consiciousness</key>
+ <string>consciousness</string>
+ <key>consicousness</key>
+ <string>consciousness</string>
+ <key>considerd</key>
+ <string>considered</string>
+ <key>consideres</key>
+ <string>considered</string>
+ <key>consious</key>
+ <string>conscious</string>
+ <key>consistant</key>
+ <string>consistent</string>
+ <key>consistantly</key>
+ <string>consistently</string>
+ <key>consituencies</key>
+ <string>constituencies</string>
+ <key>consituency</key>
+ <string>constituency</string>
+ <key>consituted</key>
+ <string>constituted</string>
+ <key>consitution</key>
+ <string>constitution</string>
+ <key>consitutional</key>
+ <string>constitutional</string>
+ <key>consolodate</key>
+ <string>consolidate</string>
+ <key>consolodated</key>
+ <string>consolidated</string>
+ <key>consonent</key>
+ <string>consonant</string>
+ <key>consonents</key>
+ <string>consonants</string>
+ <key>consorcium</key>
+ <string>consortium</string>
+ <key>conspiracys</key>
+ <string>conspiracies</string>
+ <key>conspiriator</key>
+ <string>conspirator</string>
+ <key>constaints</key>
+ <string>constraints</string>
+ <key>constanly</key>
+ <string>constantly</string>
+ <key>constarnation</key>
+ <string>consternation</string>
+ <key>constatn</key>
+ <string>constant</string>
+ <key>constinually</key>
+ <string>continually</string>
+ <key>constituant</key>
+ <string>constituent</string>
+ <key>constituants</key>
+ <string>constituents</string>
+ <key>constituion</key>
+ <string>constitution</string>
+ <key>constituional</key>
+ <string>constitutional</string>
+ <key>consttruction</key>
+ <string>construction</string>
+ <key>constuction</key>
+ <string>construction</string>
+ <key>consulant</key>
+ <string>consultant</string>
+ <key>consumate</key>
+ <string>consummate</string>
+ <key>consumated</key>
+ <string>consummated</string>
+ <key>contaiminate</key>
+ <string>contaminate</string>
+ <key>containes</key>
+ <string>contains</string>
+ <key>contamporaries</key>
+ <string>contemporaries</string>
+ <key>contamporary</key>
+ <string>contemporary</string>
+ <key>contempoary</key>
+ <string>contemporary</string>
+ <key>contemporaneus</key>
+ <string>contemporaneous</string>
+ <key>contempory</key>
+ <string>contemporary</string>
+ <key>contendor</key>
+ <string>contender</string>
+ <key>contibute</key>
+ <string>contribute </string>
+ <key>contibuted</key>
+ <string>contributed </string>
+ <key>contibutes</key>
+ <string>contributes </string>
+ <key>contigent</key>
+ <string>contingent</string>
+ <key>contined</key>
+ <string>continued</string>
+ <key>continous</key>
+ <string>continuous</string>
+ <key>continously</key>
+ <string>continuously</string>
+ <key>continueing</key>
+ <string>continuing</string>
+ <key>contravercial</key>
+ <string>controversial</string>
+ <key>contraversy</key>
+ <string>controversy</string>
+ <key>contributer</key>
+ <string>contributor</string>
+ <key>contributers</key>
+ <string>contributors</string>
+ <key>contritutions</key>
+ <string>contributions</string>
+ <key>controled</key>
+ <string>controlled</string>
+ <key>controling</key>
+ <string>controlling</string>
+ <key>controll</key>
+ <string>control</string>
+ <key>controlls</key>
+ <string>controls</string>
+ <key>controvercial</key>
+ <string>controversial</string>
+ <key>controvercy</key>
+ <string>controversy</string>
+ <key>controveries</key>
+ <string>controversies</string>
+ <key>controversal</key>
+ <string>controversial</string>
+ <key>controversey</key>
+ <string>controversy</string>
+ <key>controvertial</key>
+ <string>controversial</string>
+ <key>controvery</key>
+ <string>controversy</string>
+ <key>contruction</key>
+ <string>construction</string>
+ <key>conveinent</key>
+ <string>convenient</string>
+ <key>convenant</key>
+ <string>covenant</string>
+ <key>convential</key>
+ <string>conventional</string>
+ <key>convertables</key>
+ <string>convertibles</string>
+ <key>convertion</key>
+ <string>conversion</string>
+ <key>conveyer</key>
+ <string>conveyor</string>
+ <key>conviced</key>
+ <string>convinced</string>
+ <key>convienient</key>
+ <string>convenient</string>
+ <key>coordiantion</key>
+ <string>coordination</string>
+ <key>coorperations</key>
+ <string>corporations</string>
+ <key>copmetitors</key>
+ <string>competitors</string>
+ <key>coputer</key>
+ <string>computer</string>
+ <key>copywrite</key>
+ <string>copyright</string>
+ <key>coridal</key>
+ <string>cordial</string>
+ <key>cornmitted</key>
+ <string>committed</string>
+ <key>corosion</key>
+ <string>corrosion</string>
+ <key>corparate</key>
+ <string>corporate</string>
+ <key>corperations</key>
+ <string>corporations</string>
+ <key>correcters</key>
+ <string>correctors</string>
+ <key>correponding</key>
+ <string>corresponding</string>
+ <key>correposding</key>
+ <string>corresponding</string>
+ <key>correspondant</key>
+ <string>correspondent</string>
+ <key>correspondants</key>
+ <string>correspondents</string>
+ <key>corridoors</key>
+ <string>corridors</string>
+ <key>corrispond</key>
+ <string>correspond</string>
+ <key>corrispondant</key>
+ <string>correspondent</string>
+ <key>corrispondants</key>
+ <string>correspondents</string>
+ <key>corrisponded</key>
+ <string>corresponded</string>
+ <key>corrisponding</key>
+ <string>corresponding</string>
+ <key>corrisponds</key>
+ <string>corresponds</string>
+ <key>costitution</key>
+ <string>constitution</string>
+ <key>coucil</key>
+ <string>council</string>
+ <key>counries</key>
+ <string>countries</string>
+ <key>countains</key>
+ <string>contains</string>
+ <key>countires</key>
+ <string>countries</string>
+ <key>coururier</key>
+ <string>courier</string>
+ <key>coverted</key>
+ <string>converted</string>
+ <key>cpoy</key>
+ <string>copy</string>
+ <key>creaeted</key>
+ <string>created</string>
+ <key>creedence</key>
+ <string>credence</string>
+ <key>critereon</key>
+ <string>criterion</string>
+ <key>criterias</key>
+ <string>criteria</string>
+ <key>criticists</key>
+ <string>critics</string>
+ <key>critising</key>
+ <string>criticising</string>
+ <key>critisising</key>
+ <string>criticising</string>
+ <key>critisism</key>
+ <string>criticism</string>
+ <key>critisisms</key>
+ <string>criticisms</string>
+ <key>critisize</key>
+ <string>criticise</string>
+ <key>critisized</key>
+ <string>criticised</string>
+ <key>critisizes</key>
+ <string>criticises</string>
+ <key>critisizing</key>
+ <string>criticising</string>
+ <key>critized</key>
+ <string>criticized</string>
+ <key>critizing</key>
+ <string>criticizing</string>
+ <key>crockodiles</key>
+ <string>crocodiles</string>
+ <key>crowm</key>
+ <string>crown</string>
+ <key>crtical</key>
+ <string>critical</string>
+ <key>crticised</key>
+ <string>criticised</string>
+ <key>crucifiction</key>
+ <string>crucifixion</string>
+ <key>crusies</key>
+ <string>cruises</string>
+ <key>crystalisation</key>
+ <string>crystallisation</string>
+ <key>culiminating</key>
+ <string>culminating</string>
+ <key>cumulatative</key>
+ <string>cumulative</string>
+ <key>curch</key>
+ <string>church</string>
+ <key>curcuit</key>
+ <string>circuit</string>
+ <key>currenly</key>
+ <string>currently</string>
+ <key>curriculem</key>
+ <string>curriculum</string>
+ <key>cxan</key>
+ <string>cyan</string>
+ <key>cyclinder</key>
+ <string>cylinder</string>
+ <key>dacquiri</key>
+ <string>daiquiri</string>
+ <key>dael</key>
+ <string>deal</string>
+ <key>dalmation</key>
+ <string>dalmatian</string>
+ <key>damenor</key>
+ <string>demeanor</string>
+ <key>dammage</key>
+ <string>damage</string>
+ <key>daugher</key>
+ <string>daughter</string>
+ <key>debateable</key>
+ <string>debatable</string>
+ <key>decendant</key>
+ <string>descendant</string>
+ <key>decendants</key>
+ <string>descendants</string>
+ <key>decendent</key>
+ <string>descendant</string>
+ <key>decendents</key>
+ <string>descendants</string>
+ <key>decideable</key>
+ <string>decidable</string>
+ <key>decidely</key>
+ <string>decidedly</string>
+ <key>decieved</key>
+ <string>deceived</string>
+ <key>decison</key>
+ <string>decision</string>
+ <key>decomissioned</key>
+ <string>decommissioned</string>
+ <key>decomposit</key>
+ <string>decompose</string>
+ <key>decomposited</key>
+ <string>decomposed</string>
+ <key>decompositing</key>
+ <string>decomposing</string>
+ <key>decomposits</key>
+ <string>decomposes</string>
+ <key>decress</key>
+ <string>decrees</string>
+ <key>decribe</key>
+ <string>describe</string>
+ <key>decribed</key>
+ <string>described</string>
+ <key>decribes</key>
+ <string>describes</string>
+ <key>decribing</key>
+ <string>describing</string>
+ <key>dectect</key>
+ <string>detect</string>
+ <key>defendent</key>
+ <string>defendant</string>
+ <key>defendents</key>
+ <string>defendants</string>
+ <key>deffensively</key>
+ <string>defensively</string>
+ <key>deffine</key>
+ <string>define</string>
+ <key>deffined</key>
+ <string>defined</string>
+ <key>definance</key>
+ <string>defiance</string>
+ <key>definate</key>
+ <string>definite</string>
+ <key>definately</key>
+ <string>definitely</string>
+ <key>definatly</key>
+ <string>definitely</string>
+ <key>definetly</key>
+ <string>definitely</string>
+ <key>definining</key>
+ <string>defining</string>
+ <key>definit</key>
+ <string>definite</string>
+ <key>definitly</key>
+ <string>definitely</string>
+ <key>definiton</key>
+ <string>definition</string>
+ <key>defintion</key>
+ <string>definition</string>
+ <key>degrate</key>
+ <string>degrade</string>
+ <key>delagates</key>
+ <string>delegates</string>
+ <key>delapidated</key>
+ <string>dilapidated</string>
+ <key>delerious</key>
+ <string>delirious</string>
+ <key>delevopment</key>
+ <string>development</string>
+ <key>deliberatly</key>
+ <string>deliberately</string>
+ <key>delusionally</key>
+ <string>delusively</string>
+ <key>demenor</key>
+ <string>demeanor</string>
+ <key>demographical</key>
+ <string>demographic</string>
+ <key>demolision</key>
+ <string>demolition</string>
+ <key>demorcracy</key>
+ <string>democracy</string>
+ <key>demostration</key>
+ <string>demonstration</string>
+ <key>denegrating</key>
+ <string>denigrating</string>
+ <key>densly</key>
+ <string>densely</string>
+ <key>deparment</key>
+ <string>department</string>
+ <key>deparmental</key>
+ <string>departmental</string>
+ <key>deparments</key>
+ <string>departments</string>
+ <key>dependance</key>
+ <string>dependence</string>
+ <key>dependancy</key>
+ <string>dependency</string>
+ <key>dependant</key>
+ <string>dependent</string>
+ <key>deram</key>
+ <string>dream</string>
+ <key>deriviated</key>
+ <string>derived</string>
+ <key>derivitive</key>
+ <string>derivative</string>
+ <key>derogitory</key>
+ <string>derogatory</string>
+ <key>descendands</key>
+ <string>descendants</string>
+ <key>descibed</key>
+ <string>described</string>
+ <key>descision</key>
+ <string>decision</string>
+ <key>descisions</key>
+ <string>decisions</string>
+ <key>descriibes</key>
+ <string>describes</string>
+ <key>descripters</key>
+ <string>descriptors</string>
+ <key>descripton</key>
+ <string>description</string>
+ <key>desctruction</key>
+ <string>destruction</string>
+ <key>descuss</key>
+ <string>discuss</string>
+ <key>desgined</key>
+ <string>designed</string>
+ <key>deside</key>
+ <string>decide</string>
+ <key>desigining</key>
+ <string>designing</string>
+ <key>desinations</key>
+ <string>destinations</string>
+ <key>desintegrated</key>
+ <string>disintegrated</string>
+ <key>desintegration</key>
+ <string>disintegration</string>
+ <key>desireable</key>
+ <string>desirable</string>
+ <key>desitned</key>
+ <string>destined</string>
+ <key>desktiop</key>
+ <string>desktop</string>
+ <key>desorder</key>
+ <string>disorder</string>
+ <key>desoriented</key>
+ <string>disoriented</string>
+ <key>desparate</key>
+ <string>desperate</string>
+ <key>despict</key>
+ <string>depict</string>
+ <key>despiration</key>
+ <string>desperation</string>
+ <key>dessicated</key>
+ <string>desiccated</string>
+ <key>dessigned</key>
+ <string>designed</string>
+ <key>destablized</key>
+ <string>destabilized</string>
+ <key>destory</key>
+ <string>destroy</string>
+ <key>detailled</key>
+ <string>detailed</string>
+ <key>detatched</key>
+ <string>detached</string>
+ <key>deteoriated</key>
+ <string>deteriorated</string>
+ <key>deteriate</key>
+ <string>deteriorate</string>
+ <key>deterioriating</key>
+ <string>deteriorating</string>
+ <key>determinining</key>
+ <string>determining</string>
+ <key>detremental</key>
+ <string>detrimental</string>
+ <key>devasted</key>
+ <string>devastated</string>
+ <key>develope</key>
+ <string>develop</string>
+ <key>developement</key>
+ <string>development</string>
+ <key>developped</key>
+ <string>developed</string>
+ <key>develpment</key>
+ <string>development</string>
+ <key>devels</key>
+ <string>delves</string>
+ <key>devestated</key>
+ <string>devastated</string>
+ <key>devestating</key>
+ <string>devastating</string>
+ <key>devide</key>
+ <string>divide</string>
+ <key>devided</key>
+ <string>divided</string>
+ <key>devistating</key>
+ <string>devastating</string>
+ <key>devolopement</key>
+ <string>development</string>
+ <key>diablical</key>
+ <string>diabolical</string>
+ <key>diamons</key>
+ <string>diamonds</string>
+ <key>diaster</key>
+ <string>disaster</string>
+ <key>dichtomy</key>
+ <string>dichotomy</string>
+ <key>diconnects</key>
+ <string>disconnects</string>
+ <key>dicover</key>
+ <string>discover</string>
+ <key>dicovered</key>
+ <string>discovered</string>
+ <key>dicovering</key>
+ <string>discovering</string>
+ <key>dicovers</key>
+ <string>discovers</string>
+ <key>dicovery</key>
+ <string>discovery</string>
+ <key>dicussed</key>
+ <string>discussed</string>
+ <key>didnt</key>
+ <string>didn&apos;t</string>
+ <key>diea</key>
+ <string>idea</string>
+ <key>dieing</key>
+ <string>dying</string>
+ <key>dieties</key>
+ <string>deities</string>
+ <key>diety</key>
+ <string>deity</string>
+ <key>diferent</key>
+ <string>different</string>
+ <key>diferrent</key>
+ <string>different</string>
+ <key>differentiatiations</key>
+ <string>differentiations</string>
+ <key>differnt</key>
+ <string>different</string>
+ <key>difficulity</key>
+ <string>difficulty</string>
+ <key>diffrent</key>
+ <string>different</string>
+ <key>dificulties</key>
+ <string>difficulties</string>
+ <key>dificulty</key>
+ <string>difficulty</string>
+ <key>dimenions</key>
+ <string>dimensions</string>
+ <key>dimention</key>
+ <string>dimension</string>
+ <key>dimentional</key>
+ <string>dimensional</string>
+ <key>dimentions</key>
+ <string>dimensions</string>
+ <key>dimesnional</key>
+ <string>dimensional</string>
+ <key>diminuitive</key>
+ <string>diminutive</string>
+ <key>dimunitive</key>
+ <string>diminutive</string>
+ <key>diosese</key>
+ <string>diocese</string>
+ <key>diphtong</key>
+ <string>diphthong</string>
+ <key>diphtongs</key>
+ <string>diphthongs</string>
+ <key>diplomancy</key>
+ <string>diplomacy</string>
+ <key>dipthong</key>
+ <string>diphthong</string>
+ <key>dipthongs</key>
+ <string>diphthongs</string>
+ <key>dirived</key>
+ <string>derived</string>
+ <key>disagreeed</key>
+ <string>disagreed</string>
+ <key>disapeared</key>
+ <string>disappeared</string>
+ <key>disapointing</key>
+ <string>disappointing</string>
+ <key>disappearred</key>
+ <string>disappeared</string>
+ <key>disaproval</key>
+ <string>disapproval</string>
+ <key>disasterous</key>
+ <string>disastrous</string>
+ <key>disatisfaction</key>
+ <string>dissatisfaction</string>
+ <key>disatisfied</key>
+ <string>dissatisfied</string>
+ <key>disatrous</key>
+ <string>disastrous</string>
+ <key>discontentment</key>
+ <string>discontent</string>
+ <key>discribe</key>
+ <string>describe</string>
+ <key>discribed</key>
+ <string>described</string>
+ <key>discribes</key>
+ <string>describes</string>
+ <key>discribing</key>
+ <string>describing</string>
+ <key>disctinction</key>
+ <string>distinction</string>
+ <key>disctinctive</key>
+ <string>distinctive</string>
+ <key>disemination</key>
+ <string>dissemination</string>
+ <key>disenchanged</key>
+ <string>disenchanted</string>
+ <key>disiplined</key>
+ <string>disciplined</string>
+ <key>disobediance</key>
+ <string>disobedience</string>
+ <key>disobediant</key>
+ <string>disobedient</string>
+ <key>disolved</key>
+ <string>dissolved</string>
+ <key>disover</key>
+ <string>discover</string>
+ <key>dispair</key>
+ <string>despair</string>
+ <key>disparingly</key>
+ <string>disparagingly</string>
+ <key>dispence</key>
+ <string>dispense</string>
+ <key>dispenced</key>
+ <string>dispensed</string>
+ <key>dispencing</key>
+ <string>dispensing</string>
+ <key>dispicable</key>
+ <string>despicable</string>
+ <key>dispite</key>
+ <string>despite</string>
+ <key>dispostion</key>
+ <string>disposition</string>
+ <key>disproportiate</key>
+ <string>disproportionate</string>
+ <key>disputandem</key>
+ <string>disputandum</string>
+ <key>disricts</key>
+ <string>districts</string>
+ <key>dissagreement</key>
+ <string>disagreement</string>
+ <key>dissapear</key>
+ <string>disappear</string>
+ <key>dissapearance</key>
+ <string>disappearance</string>
+ <key>dissapeared</key>
+ <string>disappeared</string>
+ <key>dissapearing</key>
+ <string>disappearing</string>
+ <key>dissapears</key>
+ <string>disappears</string>
+ <key>dissappear</key>
+ <string>disappear</string>
+ <key>dissappears</key>
+ <string>disappears</string>
+ <key>dissappointed</key>
+ <string>disappointed</string>
+ <key>dissarray</key>
+ <string>disarray</string>
+ <key>dissobediance</key>
+ <string>disobedience</string>
+ <key>dissobediant</key>
+ <string>disobedient</string>
+ <key>dissobedience</key>
+ <string>disobedience</string>
+ <key>dissobedient</key>
+ <string>disobedient</string>
+ <key>distiction</key>
+ <string>distinction</string>
+ <key>distingish</key>
+ <string>distinguish</string>
+ <key>distingished</key>
+ <string>distinguished</string>
+ <key>distingishes</key>
+ <string>distinguishes</string>
+ <key>distingishing</key>
+ <string>distinguishing</string>
+ <key>distingquished</key>
+ <string>distinguished</string>
+ <key>distrubution</key>
+ <string>distribution</string>
+ <key>distruction</key>
+ <string>destruction</string>
+ <key>distructive</key>
+ <string>destructive</string>
+ <key>ditributed</key>
+ <string>distributed</string>
+ <key>diversed</key>
+ <string>diverged</string>
+ <key>divice</key>
+ <string>device</string>
+ <key>divison</key>
+ <string>division</string>
+ <key>divisons</key>
+ <string>divisions</string>
+ <key>doccument</key>
+ <string>document</string>
+ <key>doccumented</key>
+ <string>documented</string>
+ <key>doccuments</key>
+ <string>documents</string>
+ <key>docrines</key>
+ <string>doctrines</string>
+ <key>doctines</key>
+ <string>doctrines</string>
+ <key>documenatry</key>
+ <string>documentary</string>
+ <key>doens</key>
+ <string>does</string>
+ <key>doesnt</key>
+ <string>doesn&apos;t</string>
+ <key>doign</key>
+ <string>doing</string>
+ <key>dominaton</key>
+ <string>domination</string>
+ <key>dominent</key>
+ <string>dominant</string>
+ <key>dominiant</key>
+ <string>dominant</string>
+ <key>donig</key>
+ <string>doing</string>
+ <key>dont</key>
+ <string>don&apos;t</string>
+ <key>dosen&apos;t</key>
+ <string>doesn&apos;t</string>
+ <key>doub</key>
+ <string>doubt</string>
+ <key>doulbe</key>
+ <string>double</string>
+ <key>dowloads</key>
+ <string>downloads</string>
+ <key>dramtic</key>
+ <string>dramatic</string>
+ <key>draughtman</key>
+ <string>draughtsman</string>
+ <key>dreasm</key>
+ <string>dreams</string>
+ <key>driectly</key>
+ <string>directly</string>
+ <key>drnik</key>
+ <string>drink</string>
+ <key>druming</key>
+ <string>drumming</string>
+ <key>drummless</key>
+ <string>drumless</string>
+ <key>dupicate</key>
+ <string>duplicate</string>
+ <key>durig</key>
+ <string>during</string>
+ <key>durring</key>
+ <string>during</string>
+ <key>duting</key>
+ <string>during</string>
+ <key>dyas</key>
+ <string>dryas</string>
+ <key>eahc</key>
+ <string>each</string>
+ <key>ealier</key>
+ <string>earlier</string>
+ <key>earlies</key>
+ <string>earliest</string>
+ <key>earnt</key>
+ <string>earned</string>
+ <key>ecclectic</key>
+ <string>eclectic</string>
+ <key>eceonomy</key>
+ <string>economy</string>
+ <key>ecidious</key>
+ <string>deciduous</string>
+ <key>eclispe</key>
+ <string>eclipse</string>
+ <key>ecomonic</key>
+ <string>economic</string>
+ <key>ect</key>
+ <string>etc</string>
+ <key>eearly</key>
+ <string>early</string>
+ <key>efel</key>
+ <string>evil</string>
+ <key>effeciency</key>
+ <string>efficiency</string>
+ <key>effecient</key>
+ <string>efficient</string>
+ <key>effeciently</key>
+ <string>efficiently</string>
+ <key>efficency</key>
+ <string>efficiency</string>
+ <key>efficent</key>
+ <string>efficient</string>
+ <key>efficently</key>
+ <string>efficiently</string>
+ <key>efford</key>
+ <string>effort</string>
+ <key>effords</key>
+ <string>efforts</string>
+ <key>effulence</key>
+ <string>effluence</string>
+ <key>eigth</key>
+ <string>eight</string>
+ <key>eiter</key>
+ <string>either</string>
+ <key>elction</key>
+ <string>election</string>
+ <key>electic</key>
+ <string>electric</string>
+ <key>electon</key>
+ <string>electron</string>
+ <key>electrial</key>
+ <string>electrical</string>
+ <key>electricly</key>
+ <string>electrically</string>
+ <key>electricty</key>
+ <string>electricity</string>
+ <key>elementay</key>
+ <string>elementary</string>
+ <key>eleminated</key>
+ <string>eliminated</string>
+ <key>eleminating</key>
+ <string>eliminating</string>
+ <key>eles</key>
+ <string>eels</string>
+ <key>eletricity</key>
+ <string>electricity</string>
+ <key>elicided</key>
+ <string>elicited</string>
+ <key>eligable</key>
+ <string>eligible</string>
+ <key>elimentary</key>
+ <string>elementary</string>
+ <key>ellected</key>
+ <string>elected</string>
+ <key>elphant</key>
+ <string>elephant</string>
+ <key>embarass</key>
+ <string>embarrass</string>
+ <key>embarassed</key>
+ <string>embarrassed</string>
+ <key>embarassing</key>
+ <string>embarrassing</string>
+ <key>embarassment</key>
+ <string>embarrassment</string>
+ <key>embargos</key>
+ <string>embargoes</string>
+ <key>embarras</key>
+ <string>embarrass</string>
+ <key>embarrased</key>
+ <string>embarrassed</string>
+ <key>embarrasing</key>
+ <string>embarrassing</string>
+ <key>embarrasment</key>
+ <string>embarrassment</string>
+ <key>embezelled</key>
+ <string>embezzled</string>
+ <key>emblamatic</key>
+ <string>emblematic</string>
+ <key>eminate</key>
+ <string>emanate</string>
+ <key>eminated</key>
+ <string>emanated</string>
+ <key>emision</key>
+ <string>emission</string>
+ <key>emited</key>
+ <string>emitted</string>
+ <key>emiting</key>
+ <string>emitting</string>
+ <key>emition</key>
+ <string>emission</string>
+ <key>emmediately</key>
+ <string>immediately</string>
+ <key>emmigrated</key>
+ <string>immigrated</string>
+ <key>emminently</key>
+ <string>eminently</string>
+ <key>emmisaries</key>
+ <string>emissaries</string>
+ <key>emmisarries</key>
+ <string>emissaries</string>
+ <key>emmisarry</key>
+ <string>emissary</string>
+ <key>emmisary</key>
+ <string>emissary</string>
+ <key>emmision</key>
+ <string>emission</string>
+ <key>emmisions</key>
+ <string>emissions</string>
+ <key>emmited</key>
+ <string>emitted</string>
+ <key>emmiting</key>
+ <string>emitting</string>
+ <key>emmitted</key>
+ <string>emitted</string>
+ <key>emmitting</key>
+ <string>emitting</string>
+ <key>emnity</key>
+ <string>enmity</string>
+ <key>emperical</key>
+ <string>empirical</string>
+ <key>emphaised</key>
+ <string>emphasised</string>
+ <key>emphsis</key>
+ <string>emphasis</string>
+ <key>emphysyma</key>
+ <string>emphysema</string>
+ <key>emprisoned</key>
+ <string>imprisoned</string>
+ <key>enameld</key>
+ <string>enameled</string>
+ <key>enchancement</key>
+ <string>enhancement</string>
+ <key>encouraing</key>
+ <string>encouraging</string>
+ <key>encryptiion</key>
+ <string>encryption</string>
+ <key>encylopedia</key>
+ <string>encyclopedia</string>
+ <key>endevors</key>
+ <string>endeavors</string>
+ <key>endevour</key>
+ <string>endeavour</string>
+ <key>endig</key>
+ <string>ending</string>
+ <key>endolithes</key>
+ <string>endoliths</string>
+ <key>enduce</key>
+ <string>induce</string>
+ <key>ened</key>
+ <string>need</string>
+ <key>enflamed</key>
+ <string>inflamed</string>
+ <key>enforceing</key>
+ <string>enforcing</string>
+ <key>engagment</key>
+ <string>engagement</string>
+ <key>engeneer</key>
+ <string>engineer</string>
+ <key>engeneering</key>
+ <string>engineering</string>
+ <key>engieneer</key>
+ <string>engineer</string>
+ <key>engieneers</key>
+ <string>engineers</string>
+ <key>enlargment</key>
+ <string>enlargement</string>
+ <key>enlargments</key>
+ <string>enlargements</string>
+ <key>enourmous</key>
+ <string>enormous</string>
+ <key>enourmously</key>
+ <string>enormously</string>
+ <key>ensconsed</key>
+ <string>ensconced</string>
+ <key>entaglements</key>
+ <string>entanglements</string>
+ <key>enteratinment</key>
+ <string>entertainment</string>
+ <key>enthusiatic</key>
+ <string>enthusiastic</string>
+ <key>entitity</key>
+ <string>entity</string>
+ <key>entitlied</key>
+ <string>entitled</string>
+ <key>entrepeneur</key>
+ <string>entrepreneur</string>
+ <key>entrepeneurs</key>
+ <string>entrepreneurs</string>
+ <key>enviorment</key>
+ <string>environment</string>
+ <key>enviormental</key>
+ <string>environmental</string>
+ <key>enviormentally</key>
+ <string>environmentally</string>
+ <key>enviorments</key>
+ <string>environments</string>
+ <key>enviornment</key>
+ <string>environment</string>
+ <key>enviornmental</key>
+ <string>environmental</string>
+ <key>enviornmentalist</key>
+ <string>environmentalist</string>
+ <key>enviornmentally</key>
+ <string>environmentally</string>
+ <key>enviornments</key>
+ <string>environments</string>
+ <key>enviroment</key>
+ <string>environment</string>
+ <key>enviromental</key>
+ <string>environmental</string>
+ <key>enviromentalist</key>
+ <string>environmentalist</string>
+ <key>enviromentally</key>
+ <string>environmentally</string>
+ <key>enviroments</key>
+ <string>environments</string>
+ <key>envolutionary</key>
+ <string>evolutionary</string>
+ <key>envrionments</key>
+ <string>environments</string>
+ <key>enxt</key>
+ <string>next</string>
+ <key>epidsodes</key>
+ <string>episodes</string>
+ <key>epsiode</key>
+ <string>episode</string>
+ <key>equialent</key>
+ <string>equivalent</string>
+ <key>equilibium</key>
+ <string>equilibrium</string>
+ <key>equilibrum</key>
+ <string>equilibrium</string>
+ <key>equiped</key>
+ <string>equipped</string>
+ <key>equippment</key>
+ <string>equipment</string>
+ <key>equitorial</key>
+ <string>equatorial</string>
+ <key>equivelant</key>
+ <string>equivalent</string>
+ <key>equivelent</key>
+ <string>equivalent</string>
+ <key>equivilant</key>
+ <string>equivalent</string>
+ <key>equivilent</key>
+ <string>equivalent</string>
+ <key>equivlalent</key>
+ <string>equivalent</string>
+ <key>erally</key>
+ <string>really</string>
+ <key>eratic</key>
+ <string>erratic</string>
+ <key>eratically</key>
+ <string>erratically</string>
+ <key>eraticly</key>
+ <string>erratically</string>
+ <key>errupted</key>
+ <string>erupted</string>
+ <key>esential</key>
+ <string>essential</string>
+ <key>esitmated</key>
+ <string>estimated</string>
+ <key>esle</key>
+ <string>else</string>
+ <key>especialy</key>
+ <string>especially</string>
+ <key>essencial</key>
+ <string>essential</string>
+ <key>essense</key>
+ <string>essence</string>
+ <key>essentail</key>
+ <string>essential</string>
+ <key>essentialy</key>
+ <string>essentially</string>
+ <key>essentual</key>
+ <string>essential</string>
+ <key>essesital</key>
+ <string>essential</string>
+ <key>estabishes</key>
+ <string>establishes</string>
+ <key>establising</key>
+ <string>establishing</string>
+ <key>ethnocentricm</key>
+ <string>ethnocentrism</string>
+ <key>ethose</key>
+ <string>those</string>
+ <key>evenhtually</key>
+ <string>eventually</string>
+ <key>eventally</key>
+ <string>eventually</string>
+ <key>eventhough</key>
+ <string>even though</string>
+ <key>eventially</key>
+ <string>eventually</string>
+ <key>eventualy</key>
+ <string>eventually</string>
+ <key>everthing</key>
+ <string>everything</string>
+ <key>everytime</key>
+ <string>every time</string>
+ <key>everyting</key>
+ <string>everything</string>
+ <key>eveyr</key>
+ <string>every</string>
+ <key>evidentally</key>
+ <string>evidently</string>
+ <key>exagerate</key>
+ <string>exaggerate</string>
+ <key>exagerated</key>
+ <string>exaggerated</string>
+ <key>exagerates</key>
+ <string>exaggerates</string>
+ <key>exagerating</key>
+ <string>exaggerating</string>
+ <key>exagerrate</key>
+ <string>exaggerate</string>
+ <key>exagerrated</key>
+ <string>exaggerated</string>
+ <key>exagerrates</key>
+ <string>exaggerates</string>
+ <key>exagerrating</key>
+ <string>exaggerating</string>
+ <key>examinated</key>
+ <string>examined</string>
+ <key>exampt</key>
+ <string>exempt</string>
+ <key>exapansion</key>
+ <string>expansion</string>
+ <key>excact</key>
+ <string>exact</string>
+ <key>excange</key>
+ <string>exchange</string>
+ <key>excecute</key>
+ <string>execute</string>
+ <key>excecuted</key>
+ <string>executed</string>
+ <key>excecutes</key>
+ <string>executes</string>
+ <key>excecuting</key>
+ <string>executing</string>
+ <key>excecution</key>
+ <string>execution</string>
+ <key>excedded</key>
+ <string>exceeded</string>
+ <key>excelent</key>
+ <string>excellent</string>
+ <key>excell</key>
+ <string>excel</string>
+ <key>excellance</key>
+ <string>excellence</string>
+ <key>excellant</key>
+ <string>excellent</string>
+ <key>excells</key>
+ <string>excels</string>
+ <key>excercise</key>
+ <string>exercise</string>
+ <key>exchanching</key>
+ <string>exchanging</string>
+ <key>excisted</key>
+ <string>existed</string>
+ <key>exculsivly</key>
+ <string>exclusively</string>
+ <key>execising</key>
+ <string>exercising</string>
+ <key>exection</key>
+ <string>execution</string>
+ <key>exectued</key>
+ <string>executed</string>
+ <key>exeedingly</key>
+ <string>exceedingly</string>
+ <key>exelent</key>
+ <string>excellent</string>
+ <key>exellent</key>
+ <string>excellent</string>
+ <key>exemple</key>
+ <string>example</string>
+ <key>exept</key>
+ <string>except</string>
+ <key>exeptional</key>
+ <string>exceptional</string>
+ <key>exerbate</key>
+ <string>exacerbate</string>
+ <key>exerbated</key>
+ <string>exacerbated</string>
+ <key>exerciese</key>
+ <string>exercises</string>
+ <key>exerpt</key>
+ <string>excerpt</string>
+ <key>exerpts</key>
+ <string>excerpts</string>
+ <key>exersize</key>
+ <string>exercise</string>
+ <key>exerternal</key>
+ <string>external</string>
+ <key>exhalted</key>
+ <string>exalted</string>
+ <key>exhibtion</key>
+ <string>exhibition</string>
+ <key>exibition</key>
+ <string>exhibition</string>
+ <key>exibitions</key>
+ <string>exhibitions</string>
+ <key>exicting</key>
+ <string>exciting</string>
+ <key>exinct</key>
+ <string>extinct</string>
+ <key>existance</key>
+ <string>existence</string>
+ <key>existant</key>
+ <string>existent</string>
+ <key>existince</key>
+ <string>existence</string>
+ <key>exliled</key>
+ <string>exiled</string>
+ <key>exludes</key>
+ <string>excludes</string>
+ <key>exmaple</key>
+ <string>example</string>
+ <key>exonorate</key>
+ <string>exonerate</string>
+ <key>exoskelaton</key>
+ <string>exoskeleton</string>
+ <key>expalin</key>
+ <string>explain</string>
+ <key>expatriot</key>
+ <string>expatriate</string>
+ <key>expeced</key>
+ <string>expected</string>
+ <key>expecially</key>
+ <string>especially</string>
+ <key>expeditonary</key>
+ <string>expeditionary</string>
+ <key>expeiments</key>
+ <string>experiments</string>
+ <key>expell</key>
+ <string>expel</string>
+ <key>expells</key>
+ <string>expels</string>
+ <key>experiance</key>
+ <string>experience</string>
+ <key>experianced</key>
+ <string>experienced</string>
+ <key>expiditions</key>
+ <string>expeditions</string>
+ <key>expierence</key>
+ <string>experience</string>
+ <key>explaination</key>
+ <string>explanation</string>
+ <key>explaning</key>
+ <string>explaining</string>
+ <key>explictly</key>
+ <string>explicitly</string>
+ <key>exploititive</key>
+ <string>exploitative</string>
+ <key>explotation</key>
+ <string>exploitation</string>
+ <key>expropiated</key>
+ <string>expropriated</string>
+ <key>expropiation</key>
+ <string>expropriation</string>
+ <key>exressed</key>
+ <string>expressed</string>
+ <key>extemely</key>
+ <string>extremely</string>
+ <key>extention</key>
+ <string>extension</string>
+ <key>extentions</key>
+ <string>extensions</string>
+ <key>extered</key>
+ <string>exerted</string>
+ <key>extermist</key>
+ <string>extremist</string>
+ <key>extint</key>
+ <string>extinct</string>
+ <key>extradiction</key>
+ <string>extradition</string>
+ <key>extraterrestial</key>
+ <string>extraterrestrial</string>
+ <key>extraterrestials</key>
+ <string>extraterrestrials</string>
+ <key>extravagent</key>
+ <string>extravagant</string>
+ <key>extrememly</key>
+ <string>extremely</string>
+ <key>extremeophile</key>
+ <string>extremophile</string>
+ <key>extremly</key>
+ <string>extremely</string>
+ <key>extrordinarily</key>
+ <string>extraordinarily</string>
+ <key>extrordinary</key>
+ <string>extraordinary</string>
+ <key>eyar</key>
+ <string>year</string>
+ <key>eyars</key>
+ <string>years</string>
+ <key>eyasr</key>
+ <string>years</string>
+ <key>faciliate</key>
+ <string>facilitate</string>
+ <key>faciliated</key>
+ <string>facilitated</string>
+ <key>faciliates</key>
+ <string>facilitates</string>
+ <key>facilites</key>
+ <string>facilities</string>
+ <key>facillitate</key>
+ <string>facilitate</string>
+ <key>facinated</key>
+ <string>fascinated</string>
+ <key>facist</key>
+ <string>fascist</string>
+ <key>familes</key>
+ <string>families</string>
+ <key>familliar</key>
+ <string>familiar</string>
+ <key>famoust</key>
+ <string>famous</string>
+ <key>fanatism</key>
+ <string>fanaticism</string>
+ <key>fatc</key>
+ <string>fact</string>
+ <key>faught</key>
+ <string>fought</string>
+ <key>favoutrable</key>
+ <string>favourable</string>
+ <key>feasable</key>
+ <string>feasible</string>
+ <key>fedreally</key>
+ <string>federally</string>
+ <key>feromone</key>
+ <string>pheromone</string>
+ <key>fertily</key>
+ <string>fertility</string>
+ <key>fianite</key>
+ <string>finite</string>
+ <key>fianlly</key>
+ <string>finally</string>
+ <key>ficticious</key>
+ <string>fictitious</string>
+ <key>fictious</key>
+ <string>fictitious</string>
+ <key>fidn</key>
+ <string>find</string>
+ <key>fiercly</key>
+ <string>fiercely</string>
+ <key>fightings</key>
+ <string>fighting</string>
+ <key>filiament</key>
+ <string>filament</string>
+ <key>fimilies</key>
+ <string>families</string>
+ <key>finacial</key>
+ <string>financial</string>
+ <key>finaly</key>
+ <string>finally</string>
+ <key>financialy</key>
+ <string>financially</string>
+ <key>firends</key>
+ <string>friends</string>
+ <key>firts</key>
+ <string>first</string>
+ <key>fisionable</key>
+ <string>fissionable</string>
+ <key>flamable</key>
+ <string>flammable</string>
+ <key>flawess</key>
+ <string>flawless</string>
+ <key>fleed</key>
+ <string>fled</string>
+ <key>florescent</key>
+ <string>fluorescent</string>
+ <key>flourescent</key>
+ <string>fluorescent</string>
+ <key>flourine</key>
+ <string>fluorine</string>
+ <key>fluorish</key>
+ <string>flourish</string>
+ <key>follwoing</key>
+ <string>following</string>
+ <key>folowing</key>
+ <string>following</string>
+ <key>fomed</key>
+ <string>formed</string>
+ <key>fomr</key>
+ <string>from</string>
+ <key>fonetic</key>
+ <string>phonetic</string>
+ <key>fontrier</key>
+ <string>fontier</string>
+ <key>foootball</key>
+ <string>football</string>
+ <key>forbad</key>
+ <string>forbade</string>
+ <key>forbiden</key>
+ <string>forbidden</string>
+ <key>foreward</key>
+ <string>foreword</string>
+ <key>forfiet</key>
+ <string>forfeit</string>
+ <key>forhead</key>
+ <string>forehead</string>
+ <key>foriegn</key>
+ <string>foreign</string>
+ <key>formallize</key>
+ <string>formalize</string>
+ <key>formallized</key>
+ <string>formalized</string>
+ <key>formaly</key>
+ <string>formally</string>
+ <key>formelly</key>
+ <string>formerly</string>
+ <key>formidible</key>
+ <string>formidable</string>
+ <key>formost</key>
+ <string>foremost</string>
+ <key>forsaw</key>
+ <string>foresaw</string>
+ <key>forseeable</key>
+ <string>foreseeable</string>
+ <key>fortelling</key>
+ <string>foretelling</string>
+ <key>forunner</key>
+ <string>forerunner</string>
+ <key>foucs</key>
+ <string>focus</string>
+ <key>foudn</key>
+ <string>found</string>
+ <key>fougth</key>
+ <string>fought</string>
+ <key>foundaries</key>
+ <string>foundries</string>
+ <key>foundary</key>
+ <string>foundry</string>
+ <key>fourties</key>
+ <string>forties</string>
+ <key>fourty</key>
+ <string>forty</string>
+ <key>fouth</key>
+ <string>fourth</string>
+ <key>foward</key>
+ <string>forward</string>
+ <key>freind</key>
+ <string>friend</string>
+ <key>freindly</key>
+ <string>friendly</string>
+ <key>frequentily</key>
+ <string>frequently</string>
+ <key>frome</key>
+ <string>from</string>
+ <key>fromed</key>
+ <string>formed</string>
+ <key>froniter</key>
+ <string>frontier</string>
+ <key>fucntion</key>
+ <string>function</string>
+ <key>fucntioning</key>
+ <string>functioning</string>
+ <key>fufill</key>
+ <string>fulfill</string>
+ <key>fufilled</key>
+ <string>fulfilled</string>
+ <key>fulfiled</key>
+ <string>fulfilled</string>
+ <key>fullfill</key>
+ <string>fulfill</string>
+ <key>fullfilled</key>
+ <string>fulfilled</string>
+ <key>fundametal</key>
+ <string>fundamental</string>
+ <key>fundametals</key>
+ <string>fundamentals</string>
+ <key>funguses</key>
+ <string>fungi</string>
+ <key>funtion</key>
+ <string>function</string>
+ <key>furuther</key>
+ <string>further</string>
+ <key>futher</key>
+ <string>further</string>
+ <key>futhermore</key>
+ <string>furthermore</string>
+ <key>galatic</key>
+ <string>galactic</string>
+ <key>gallaxies</key>
+ <string>galaxies</string>
+ <key>galvinized</key>
+ <string>galvanized</string>
+ <key>ganerate</key>
+ <string>generate</string>
+ <key>ganes</key>
+ <string>games</string>
+ <key>ganster</key>
+ <string>gangster</string>
+ <key>garantee</key>
+ <string>guarantee</string>
+ <key>garanteed</key>
+ <string>guaranteed</string>
+ <key>garantees</key>
+ <string>guarantees</string>
+ <key>garnison</key>
+ <string>garrison</string>
+ <key>gaurantee</key>
+ <string>guarantee</string>
+ <key>gauranteed</key>
+ <string>guaranteed</string>
+ <key>gaurantees</key>
+ <string>guarantees</string>
+ <key>gaurd</key>
+ <string>guard</string>
+ <key>gaurentee</key>
+ <string>guarantee</string>
+ <key>gaurenteed</key>
+ <string>guaranteed</string>
+ <key>gaurentees</key>
+ <string>guarantees</string>
+ <key>geneological</key>
+ <string>genealogical</string>
+ <key>geneologies</key>
+ <string>genealogies</string>
+ <key>geneology</key>
+ <string>genealogy</string>
+ <key>generaly</key>
+ <string>generally</string>
+ <key>generatting</key>
+ <string>generating</string>
+ <key>genialia</key>
+ <string>genitalia</string>
+ <key>geographicial</key>
+ <string>geographical</string>
+ <key>geometrician</key>
+ <string>geometer</string>
+ <key>geometricians</key>
+ <string>geometers</string>
+ <key>gerat</key>
+ <string>great</string>
+ <key>glight</key>
+ <string>flight</string>
+ <key>gnawwed</key>
+ <string>gnawed</string>
+ <key>godess</key>
+ <string>goddess</string>
+ <key>godesses</key>
+ <string>goddesses</string>
+ <key>gogin</key>
+ <string>going</string>
+ <key>goign</key>
+ <string>going</string>
+ <key>gonig</key>
+ <string>going</string>
+ <key>gouvener</key>
+ <string>governor</string>
+ <key>govement</key>
+ <string>government</string>
+ <key>govenment</key>
+ <string>government</string>
+ <key>govenrment</key>
+ <string>government</string>
+ <key>goverance</key>
+ <string>governance</string>
+ <key>goverment</key>
+ <string>government</string>
+ <key>govermental</key>
+ <string>governmental</string>
+ <key>governer</key>
+ <string>governor</string>
+ <key>governmnet</key>
+ <string>government</string>
+ <key>govorment</key>
+ <string>government</string>
+ <key>govormental</key>
+ <string>governmental</string>
+ <key>govornment</key>
+ <string>government</string>
+ <key>gracefull</key>
+ <string>graceful</string>
+ <key>graet</key>
+ <string>great</string>
+ <key>grafitti</key>
+ <string>graffiti</string>
+ <key>gramatically</key>
+ <string>grammatically</string>
+ <key>grammaticaly</key>
+ <string>grammatically</string>
+ <key>grammer</key>
+ <string>grammar</string>
+ <key>grat</key>
+ <string>great</string>
+ <key>gratuitious</key>
+ <string>gratuitous</string>
+ <key>greatful</key>
+ <string>grateful</string>
+ <key>greatfully</key>
+ <string>gratefully</string>
+ <key>greif</key>
+ <string>grief</string>
+ <key>gridles</key>
+ <string>griddles</string>
+ <key>gropu</key>
+ <string>group</string>
+ <key>grwo</key>
+ <string>grow</string>
+ <key>guage</key>
+ <string>gauge</string>
+ <key>guarentee</key>
+ <string>guarantee</string>
+ <key>guarenteed</key>
+ <string>guaranteed</string>
+ <key>guarentees</key>
+ <string>guarantees</string>
+ <key>guerilla</key>
+ <string>guerrilla</string>
+ <key>guerillas</key>
+ <string>guerrillas</string>
+ <key>guerrila</key>
+ <string>guerrilla</string>
+ <key>guerrilas</key>
+ <string>guerrillas</string>
+ <key>guidence</key>
+ <string>guidance</string>
+ <key>gunanine</key>
+ <string>guanine</string>
+ <key>gurantee</key>
+ <string>guarantee</string>
+ <key>guranteed</key>
+ <string>guaranteed</string>
+ <key>gurantees</key>
+ <string>guarantees</string>
+ <key>guttaral</key>
+ <string>guttural</string>
+ <key>gutteral</key>
+ <string>guttural</string>
+ <key>habaeus</key>
+ <string>habeas</string>
+ <key>habeus</key>
+ <string>habeas</string>
+ <key>haemorrage</key>
+ <string>haemorrhage</string>
+ <key>haev</key>
+ <string>have</string>
+ <key>halp</key>
+ <string>help</string>
+ <key>hapen</key>
+ <string>happen</string>
+ <key>hapened</key>
+ <string>happened</string>
+ <key>hapening</key>
+ <string>happening</string>
+ <key>happend</key>
+ <string>happened</string>
+ <key>happended</key>
+ <string>happened</string>
+ <key>happenned</key>
+ <string>happened</string>
+ <key>harased</key>
+ <string>harassed</string>
+ <key>harases</key>
+ <string>harasses</string>
+ <key>harasment</key>
+ <string>harassment</string>
+ <key>harasments</key>
+ <string>harassments</string>
+ <key>harassement</key>
+ <string>harassment</string>
+ <key>harras</key>
+ <string>harass</string>
+ <key>harrased</key>
+ <string>harassed</string>
+ <key>harrases</key>
+ <string>harasses</string>
+ <key>harrasing</key>
+ <string>harassing</string>
+ <key>harrasment</key>
+ <string>harassment</string>
+ <key>harrasments</key>
+ <string>harassments</string>
+ <key>harrassed</key>
+ <string>harassed</string>
+ <key>harrasses</key>
+ <string>harassed</string>
+ <key>harrassing</key>
+ <string>harassing</string>
+ <key>harrassment</key>
+ <string>harassment</string>
+ <key>harrassments</key>
+ <string>harassments</string>
+ <key>hasnt</key>
+ <string>hasn&apos;t</string>
+ <key>haviest</key>
+ <string>heaviest</string>
+ <key>headquarer</key>
+ <string>headquarter</string>
+ <key>headquater</key>
+ <string>headquarter</string>
+ <key>headquatered</key>
+ <string>headquartered</string>
+ <key>headquaters</key>
+ <string>headquarters</string>
+ <key>healthercare</key>
+ <string>healthcare</string>
+ <key>heared</key>
+ <string>heard</string>
+ <key>heathy</key>
+ <string>healthy</string>
+ <key>heigher</key>
+ <string>higher</string>
+ <key>heirarchy</key>
+ <string>hierarchy</string>
+ <key>heiroglyphics</key>
+ <string>hieroglyphics</string>
+ <key>helment</key>
+ <string>helmet</string>
+ <key>helpfull</key>
+ <string>helpful</string>
+ <key>helpped</key>
+ <string>helped</string>
+ <key>hemmorhage</key>
+ <string>hemorrhage</string>
+ <key>herad</key>
+ <string>heard</string>
+ <key>heridity</key>
+ <string>heredity</string>
+ <key>heroe</key>
+ <string>hero</string>
+ <key>heros</key>
+ <string>heroes</string>
+ <key>hertiage</key>
+ <string>heritage</string>
+ <key>hertzs</key>
+ <string>hertz</string>
+ <key>hesistant</key>
+ <string>hesitant</string>
+ <key>heterogenous</key>
+ <string>heterogeneous</string>
+ <key>hieght</key>
+ <string>height</string>
+ <key>hierachical</key>
+ <string>hierarchical</string>
+ <key>hierachies</key>
+ <string>hierarchies</string>
+ <key>hierachy</key>
+ <string>hierarchy</string>
+ <key>hierarcical</key>
+ <string>hierarchical</string>
+ <key>hierarcy</key>
+ <string>hierarchy</string>
+ <key>hieroglph</key>
+ <string>hieroglyph</string>
+ <key>hieroglphs</key>
+ <string>hieroglyphs</string>
+ <key>higer</key>
+ <string>higher</string>
+ <key>higest</key>
+ <string>highest</string>
+ <key>higway</key>
+ <string>highway</string>
+ <key>hillarious</key>
+ <string>hilarious</string>
+ <key>himselv</key>
+ <string>himself</string>
+ <key>hinderance</key>
+ <string>hindrance</string>
+ <key>hinderence</key>
+ <string>hindrance</string>
+ <key>hindrence</key>
+ <string>hindrance</string>
+ <key>hipopotamus</key>
+ <string>hippopotamus</string>
+ <key>hismelf</key>
+ <string>himself</string>
+ <key>histocompatability</key>
+ <string>histocompatibility</string>
+ <key>historicians</key>
+ <string>historians</string>
+ <key>hitsingles</key>
+ <string>hit singles</string>
+ <key>holliday</key>
+ <string>holiday</string>
+ <key>homestate</key>
+ <string>home state</string>
+ <key>homogeneize</key>
+ <string>homogenize</string>
+ <key>homogeneized</key>
+ <string>homogenized</string>
+ <key>honory</key>
+ <string>honorary</string>
+ <key>horrifing</key>
+ <string>horrifying</string>
+ <key>hosited</key>
+ <string>hoisted</string>
+ <key>hospitible</key>
+ <string>hospitable</string>
+ <key>hounour</key>
+ <string>honour</string>
+ <key>housr</key>
+ <string>hours</string>
+ <key>howver</key>
+ <string>however</string>
+ <key>hsitorians</key>
+ <string>historians</string>
+ <key>hstory</key>
+ <string>history</string>
+ <key>hten</key>
+ <string>then</string>
+ <key>htere</key>
+ <string>there</string>
+ <key>htey</key>
+ <string>they</string>
+ <key>htikn</key>
+ <string>think</string>
+ <key>hting</key>
+ <string>thing</string>
+ <key>htink</key>
+ <string>think</string>
+ <key>htis</key>
+ <string>this</string>
+ <key>humer</key>
+ <string>humor</string>
+ <key>humerous</key>
+ <string>humorous</string>
+ <key>huminoid</key>
+ <string>humanoid</string>
+ <key>humoural</key>
+ <string>humoral</string>
+ <key>humurous</key>
+ <string>humorous</string>
+ <key>husban</key>
+ <string>husband</string>
+ <key>hvae</key>
+ <string>have</string>
+ <key>hvaing</key>
+ <string>having</string>
+ <key>hvea</key>
+ <string>have</string>
+ <key>hwihc</key>
+ <string>which</string>
+ <key>hwile</key>
+ <string>while</string>
+ <key>hwole</key>
+ <string>whole</string>
+ <key>hydogen</key>
+ <string>hydrogen</string>
+ <key>hydropile</key>
+ <string>hydrophile</string>
+ <key>hydropilic</key>
+ <string>hydrophilic</string>
+ <key>hydropobe</key>
+ <string>hydrophobe</string>
+ <key>hydropobic</key>
+ <string>hydrophobic</string>
+ <key>hygeine</key>
+ <string>hygiene</string>
+ <key>hypocracy</key>
+ <string>hypocrisy</string>
+ <key>hypocrasy</key>
+ <string>hypocrisy</string>
+ <key>hypocricy</key>
+ <string>hypocrisy</string>
+ <key>hypocrit</key>
+ <string>hypocrite</string>
+ <key>hypocrits</key>
+ <string>hypocrites</string>
+ <key>i</key>
+ <string>I</string>
+ <key>iconclastic</key>
+ <string>iconoclastic</string>
+ <key>idaeidae</key>
+ <string>idea</string>
+ <key>idaes</key>
+ <string>ideas</string>
+ <key>idealogies</key>
+ <string>ideologies</string>
+ <key>idealogy</key>
+ <string>ideology</string>
+ <key>identicial</key>
+ <string>identical</string>
+ <key>identifers</key>
+ <string>identifiers</string>
+ <key>ideosyncratic</key>
+ <string>idiosyncratic</string>
+ <key>idesa</key>
+ <string>ideas</string>
+ <key>idiosyncracy</key>
+ <string>idiosyncrasy</string>
+ <key>illegimacy</key>
+ <string>illegitimacy</string>
+ <key>illegitmate</key>
+ <string>illegitimate</string>
+ <key>illess</key>
+ <string>illness</string>
+ <key>illiegal</key>
+ <string>illegal</string>
+ <key>illution</key>
+ <string>illusion</string>
+ <key>ilness</key>
+ <string>illness</string>
+ <key>ilogical</key>
+ <string>illogical</string>
+ <key>imagenary</key>
+ <string>imaginary</string>
+ <key>imagin</key>
+ <string>imagine</string>
+ <key>imaginery</key>
+ <string>imaginary</string>
+ <key>imcomplete</key>
+ <string>incomplete</string>
+ <key>imediately</key>
+ <string>immediately</string>
+ <key>imense</key>
+ <string>immense</string>
+ <key>immediatley</key>
+ <string>immediately</string>
+ <key>immediatly</key>
+ <string>immediately</string>
+ <key>immidately</key>
+ <string>immediately</string>
+ <key>immidiately</key>
+ <string>immediately</string>
+ <key>immitate</key>
+ <string>imitate</string>
+ <key>immitated</key>
+ <string>imitated</string>
+ <key>immitating</key>
+ <string>imitating</string>
+ <key>immitator</key>
+ <string>imitator</string>
+ <key>immunosupressant</key>
+ <string>immunosuppressant</string>
+ <key>impecabbly</key>
+ <string>impeccably</string>
+ <key>impedence</key>
+ <string>impedance</string>
+ <key>implamenting</key>
+ <string>implementing</string>
+ <key>impliment</key>
+ <string>implement</string>
+ <key>implimented</key>
+ <string>implemented</string>
+ <key>imploys</key>
+ <string>employs</string>
+ <key>importamt</key>
+ <string>important</string>
+ <key>imprioned</key>
+ <string>imprisoned</string>
+ <key>imprisonned</key>
+ <string>imprisoned</string>
+ <key>improvision</key>
+ <string>improvisation</string>
+ <key>improvments</key>
+ <string>improvements</string>
+ <key>inablility</key>
+ <string>inability</string>
+ <key>inaccessable</key>
+ <string>inaccessible</string>
+ <key>inadiquate</key>
+ <string>inadequate</string>
+ <key>inadquate</key>
+ <string>inadequate</string>
+ <key>inadvertant</key>
+ <string>inadvertent</string>
+ <key>inadvertantly</key>
+ <string>inadvertently</string>
+ <key>inagurated</key>
+ <string>inaugurated</string>
+ <key>inaguration</key>
+ <string>inauguration</string>
+ <key>inappropiate</key>
+ <string>inappropriate</string>
+ <key>inaugures</key>
+ <string>inaugurates</string>
+ <key>inbalance</key>
+ <string>imbalance</string>
+ <key>inbalanced</key>
+ <string>imbalanced</string>
+ <key>inbetween</key>
+ <string>between</string>
+ <key>incarcirated</key>
+ <string>incarcerated</string>
+ <key>incidentially</key>
+ <string>incidentally</string>
+ <key>incidently</key>
+ <string>incidentally</string>
+ <key>inclreased</key>
+ <string>increased</string>
+ <key>includ</key>
+ <string>include</string>
+ <key>includng</key>
+ <string>including</string>
+ <key>incompatabilities</key>
+ <string>incompatibilities</string>
+ <key>incompatability</key>
+ <string>incompatibility</string>
+ <key>incompatable</key>
+ <string>incompatible</string>
+ <key>incompatablities</key>
+ <string>incompatibilities</string>
+ <key>incompatablity</key>
+ <string>incompatibility</string>
+ <key>incompatiblities</key>
+ <string>incompatibilities</string>
+ <key>incompatiblity</key>
+ <string>incompatibility</string>
+ <key>incompetance</key>
+ <string>incompetence</string>
+ <key>incompetant</key>
+ <string>incompetent</string>
+ <key>incomptable</key>
+ <string>incompatible</string>
+ <key>incomptetent</key>
+ <string>incompetent</string>
+ <key>inconsistant</key>
+ <string>inconsistent</string>
+ <key>incoroporated</key>
+ <string>incorporated</string>
+ <key>incorperation</key>
+ <string>incorporation</string>
+ <key>incorportaed</key>
+ <string>incorporated</string>
+ <key>incorprates</key>
+ <string>incorporates</string>
+ <key>incorruptable</key>
+ <string>incorruptible</string>
+ <key>incramentally</key>
+ <string>incrementally</string>
+ <key>increadible</key>
+ <string>incredible</string>
+ <key>incredable</key>
+ <string>incredible</string>
+ <key>inctroduce</key>
+ <string>introduce</string>
+ <key>inctroduced</key>
+ <string>introduced</string>
+ <key>incuding</key>
+ <string>including</string>
+ <key>incunabla</key>
+ <string>incunabula</string>
+ <key>indefinately</key>
+ <string>indefinitely</string>
+ <key>indefineable</key>
+ <string>undefinable</string>
+ <key>indefinitly</key>
+ <string>indefinitely</string>
+ <key>indentical</key>
+ <string>identical</string>
+ <key>indepedantly</key>
+ <string>independently</string>
+ <key>indepedence</key>
+ <string>independence</string>
+ <key>independance</key>
+ <string>independence</string>
+ <key>independant</key>
+ <string>independent</string>
+ <key>independantly</key>
+ <string>independently</string>
+ <key>independece</key>
+ <string>independence</string>
+ <key>independendet</key>
+ <string>independent</string>
+ <key>indespensable</key>
+ <string>indispensable</string>
+ <key>indespensible</key>
+ <string>indispensable</string>
+ <key>indictement</key>
+ <string>indictment</string>
+ <key>indigineous</key>
+ <string>indigenous</string>
+ <key>indipendence</key>
+ <string>independence</string>
+ <key>indipendent</key>
+ <string>independent</string>
+ <key>indipendently</key>
+ <string>independently</string>
+ <key>indispensible</key>
+ <string>indispensable</string>
+ <key>indisputible</key>
+ <string>indisputable</string>
+ <key>indisputibly</key>
+ <string>indisputably</string>
+ <key>indite</key>
+ <string>indict</string>
+ <key>individualy</key>
+ <string>individually</string>
+ <key>indpendent</key>
+ <string>independent</string>
+ <key>indpendently</key>
+ <string>independently</string>
+ <key>indulgue</key>
+ <string>indulge</string>
+ <key>indutrial</key>
+ <string>industrial</string>
+ <key>indviduals</key>
+ <string>individuals</string>
+ <key>inefficienty</key>
+ <string>inefficiently</string>
+ <key>inevatible</key>
+ <string>inevitable</string>
+ <key>inevitible</key>
+ <string>inevitable</string>
+ <key>inevititably</key>
+ <string>inevitably</string>
+ <key>infalability</key>
+ <string>infallibility</string>
+ <key>infallable</key>
+ <string>infallible</string>
+ <key>infectuous</key>
+ <string>infectious</string>
+ <key>infered</key>
+ <string>inferred</string>
+ <key>infilitrate</key>
+ <string>infiltrate</string>
+ <key>infilitrated</key>
+ <string>infiltrated</string>
+ <key>infilitration</key>
+ <string>infiltration</string>
+ <key>infinit</key>
+ <string>infinite</string>
+ <key>inflamation</key>
+ <string>inflammation</string>
+ <key>influencial</key>
+ <string>influential</string>
+ <key>influented</key>
+ <string>influenced</string>
+ <key>infomation</key>
+ <string>information</string>
+ <key>informtion</key>
+ <string>information</string>
+ <key>infrantryman</key>
+ <string>infantryman</string>
+ <key>infrigement</key>
+ <string>infringement</string>
+ <key>ingenius</key>
+ <string>ingenious</string>
+ <key>ingreediants</key>
+ <string>ingredients</string>
+ <key>inhabitans</key>
+ <string>inhabitants</string>
+ <key>inherantly</key>
+ <string>inherently</string>
+ <key>inheritence</key>
+ <string>inheritance</string>
+ <key>inital</key>
+ <string>initial</string>
+ <key>initally</key>
+ <string>initially</string>
+ <key>initation</key>
+ <string>initiation</string>
+ <key>initiaitive</key>
+ <string>initiative</string>
+ <key>inlcuding</key>
+ <string>including</string>
+ <key>inmigrant</key>
+ <string>immigrant</string>
+ <key>inmigrants</key>
+ <string>immigrants</string>
+ <key>innoculated</key>
+ <string>inoculated</string>
+ <key>inocence</key>
+ <string>innocence</string>
+ <key>inofficial</key>
+ <string>unofficial</string>
+ <key>inot</key>
+ <string>into</string>
+ <key>inpeach</key>
+ <string>impeach</string>
+ <key>inpolite</key>
+ <string>impolite</string>
+ <key>inprisonment</key>
+ <string>imprisonment</string>
+ <key>inproving</key>
+ <string>improving</string>
+ <key>insectiverous</key>
+ <string>insectivorous</string>
+ <key>insensative</key>
+ <string>insensitive</string>
+ <key>inseperable</key>
+ <string>inseparable</string>
+ <key>insistance</key>
+ <string>insistence</string>
+ <key>insitution</key>
+ <string>institution</string>
+ <key>insitutions</key>
+ <string>institutions</string>
+ <key>inspite</key>
+ <string>in spite</string>
+ <key>instade</key>
+ <string>instead</string>
+ <key>instatance</key>
+ <string>instance</string>
+ <key>institue</key>
+ <string>institute</string>
+ <key>instuction</key>
+ <string>instruction</string>
+ <key>instuments</key>
+ <string>instruments</string>
+ <key>instutionalized</key>
+ <string>institutionalized</string>
+ <key>instutions</key>
+ <string>intuitions</string>
+ <key>insurence</key>
+ <string>insurance</string>
+ <key>intelectual</key>
+ <string>intellectual</string>
+ <key>inteligence</key>
+ <string>intelligence</string>
+ <key>inteligent</key>
+ <string>intelligent</string>
+ <key>intenational</key>
+ <string>international</string>
+ <key>intented</key>
+ <string>intended</string>
+ <key>intepretation</key>
+ <string>interpretation</string>
+ <key>intepretator</key>
+ <string>interpretor</string>
+ <key>interational</key>
+ <string>international</string>
+ <key>interbread</key>
+ <string>interbreed</string>
+ <key>interchangable</key>
+ <string>interchangeable</string>
+ <key>interchangably</key>
+ <string>interchangeably</string>
+ <key>intercontinetal</key>
+ <string>intercontinental</string>
+ <key>intered</key>
+ <string>interred</string>
+ <key>interelated</key>
+ <string>interrelated</string>
+ <key>interferance</key>
+ <string>interference</string>
+ <key>interfereing</key>
+ <string>interfering</string>
+ <key>intergrated</key>
+ <string>integrated</string>
+ <key>intergration</key>
+ <string>integration</string>
+ <key>interm</key>
+ <string>interim</string>
+ <key>internation</key>
+ <string>international</string>
+ <key>interpet</key>
+ <string>interpret</string>
+ <key>interrim</key>
+ <string>interim</string>
+ <key>interrugum</key>
+ <string>interregnum</string>
+ <key>intertaining</key>
+ <string>entertaining</string>
+ <key>interupt</key>
+ <string>interrupt</string>
+ <key>intervines</key>
+ <string>intervenes</string>
+ <key>intevene</key>
+ <string>intervene</string>
+ <key>intial</key>
+ <string>initial</string>
+ <key>intially</key>
+ <string>initially</string>
+ <key>intrduced</key>
+ <string>introduced</string>
+ <key>intrest</key>
+ <string>interest</string>
+ <key>introdued</key>
+ <string>introduced</string>
+ <key>intruduced</key>
+ <string>introduced</string>
+ <key>intrument</key>
+ <string>instrument</string>
+ <key>intrumental</key>
+ <string>instrumental</string>
+ <key>intruments</key>
+ <string>instruments</string>
+ <key>intrusted</key>
+ <string>entrusted</string>
+ <key>intutive</key>
+ <string>intuitive</string>
+ <key>intutively</key>
+ <string>intuitively</string>
+ <key>inudstry</key>
+ <string>industry</string>
+ <key>inventer</key>
+ <string>inventor</string>
+ <key>invertibrates</key>
+ <string>invertebrates</string>
+ <key>investingate</key>
+ <string>investigate</string>
+ <key>involvment</key>
+ <string>involvement</string>
+ <key>irelevent</key>
+ <string>irrelevant</string>
+ <key>iresistable</key>
+ <string>irresistible</string>
+ <key>iresistably</key>
+ <string>irresistibly</string>
+ <key>iresistible</key>
+ <string>irresistible</string>
+ <key>iresistibly</key>
+ <string>irresistibly</string>
+ <key>iritable</key>
+ <string>irritable</string>
+ <key>iritated</key>
+ <string>irritated</string>
+ <key>ironicly</key>
+ <string>ironically</string>
+ <key>irregardless</key>
+ <string>regardless</string>
+ <key>irrelevent</key>
+ <string>irrelevant</string>
+ <key>irreplacable</key>
+ <string>irreplaceable</string>
+ <key>irresistable</key>
+ <string>irresistible</string>
+ <key>irresistably</key>
+ <string>irresistibly</string>
+ <key>isnt</key>
+ <string>isn&apos;t</string>
+ <key>issueing</key>
+ <string>issuing</string>
+ <key>itnroduced</key>
+ <string>introduced</string>
+ <key>iunior</key>
+ <string>junior</string>
+ <key>iwll</key>
+ <string>will</string>
+ <key>iwth</key>
+ <string>with</string>
+ <key>jaques</key>
+ <string>jacques</string>
+ <key>jeapardy</key>
+ <string>jeopardy</string>
+ <key>jewllery</key>
+ <string>jewellery</string>
+ <key>jouney</key>
+ <string>journey</string>
+ <key>journied</key>
+ <string>journeyed</string>
+ <key>journies</key>
+ <string>journeys</string>
+ <key>jstu</key>
+ <string>just</string>
+ <key>jsut</key>
+ <string>just</string>
+ <key>judical</key>
+ <string>judicial</string>
+ <key>judisuary</key>
+ <string>judiciary</string>
+ <key>juducial</key>
+ <string>judicial</string>
+ <key>juristiction</key>
+ <string>jurisdiction</string>
+ <key>juristictions</key>
+ <string>jurisdictions</string>
+ <key>kindergarden</key>
+ <string>kindergarten</string>
+ <key>klenex</key>
+ <string>kleenex</string>
+ <key>knifes</key>
+ <string>knives</string>
+ <key>knive</key>
+ <string>knife</string>
+ <key>knowlege</key>
+ <string>knowledge</string>
+ <key>knowlegeable</key>
+ <string>knowledgeable</string>
+ <key>knwo</key>
+ <string>know</string>
+ <key>knwos</key>
+ <string>knows</string>
+ <key>konw</key>
+ <string>know</string>
+ <key>konws</key>
+ <string>knows</string>
+ <key>kwno</key>
+ <string>know</string>
+ <key>labatory</key>
+ <string>laboratory</string>
+ <key>labratory</key>
+ <string>laboratory</string>
+ <key>laguage</key>
+ <string>language</string>
+ <key>laguages</key>
+ <string>languages</string>
+ <key>larg</key>
+ <string>large</string>
+ <key>largst</key>
+ <string>largest</string>
+ <key>larrry</key>
+ <string>larry</string>
+ <key>lastr</key>
+ <string>last</string>
+ <key>lattitude</key>
+ <string>latitude</string>
+ <key>launhed</key>
+ <string>launched</string>
+ <key>lavae</key>
+ <string>larvae</string>
+ <key>layed</key>
+ <string>laid</string>
+ <key>lazyness</key>
+ <string>laziness</string>
+ <key>leage</key>
+ <string>league</string>
+ <key>leanr</key>
+ <string>learn</string>
+ <key>leathal</key>
+ <string>lethal</string>
+ <key>lefted</key>
+ <string>left</string>
+ <key>legitamate</key>
+ <string>legitimate</string>
+ <key>legitmate</key>
+ <string>legitimate</string>
+ <key>leibnitz</key>
+ <string>leibniz</string>
+ <key>lenght</key>
+ <string>length</string>
+ <key>leran</key>
+ <string>learn</string>
+ <key>lerans</key>
+ <string>learns</string>
+ <key>leutenant</key>
+ <string>lieutenant</string>
+ <key>levetate</key>
+ <string>levitate</string>
+ <key>levetated</key>
+ <string>levitated</string>
+ <key>levetates</key>
+ <string>levitates</string>
+ <key>levetating</key>
+ <string>levitating</string>
+ <key>levle</key>
+ <string>level</string>
+ <key>liasion</key>
+ <string>liaison</string>
+ <key>liason</key>
+ <string>liaison</string>
+ <key>liasons</key>
+ <string>liaisons</string>
+ <key>libary</key>
+ <string>library</string>
+ <key>libell</key>
+ <string>libel</string>
+ <key>libguistic</key>
+ <string>linguistic</string>
+ <key>libguistics</key>
+ <string>linguistics</string>
+ <key>libitarianisn</key>
+ <string>libertarianism</string>
+ <key>lieing</key>
+ <string>lying</string>
+ <key>liek</key>
+ <string>like</string>
+ <key>liekd</key>
+ <string>liked</string>
+ <key>liesure</key>
+ <string>leisure</string>
+ <key>lieuenant</key>
+ <string>lieutenant</string>
+ <key>lieved</key>
+ <string>lived</string>
+ <key>liftime</key>
+ <string>lifetime</string>
+ <key>lightyear</key>
+ <string>light year</string>
+ <key>lightyears</key>
+ <string>light years</string>
+ <key>likelyhood</key>
+ <string>likelihood</string>
+ <key>linnaena</key>
+ <string>linnaean</string>
+ <key>lippizaner</key>
+ <string>lipizzaner</string>
+ <key>liquify</key>
+ <string>liquefy</string>
+ <key>liscense</key>
+ <string>license</string>
+ <key>lisence</key>
+ <string>license</string>
+ <key>lisense</key>
+ <string>license</string>
+ <key>listners</key>
+ <string>listeners</string>
+ <key>litature</key>
+ <string>literature</string>
+ <key>literaly</key>
+ <string>literally</string>
+ <key>literture</key>
+ <string>literature</string>
+ <key>littel</key>
+ <string>little</string>
+ <key>litterally</key>
+ <string>literally</string>
+ <key>liuke</key>
+ <string>like</string>
+ <key>livley</key>
+ <string>lively</string>
+ <key>lmits</key>
+ <string>limits</string>
+ <key>loev</key>
+ <string>love</string>
+ <key>lonelyness</key>
+ <string>loneliness</string>
+ <key>longitudonal</key>
+ <string>longitudinal</string>
+ <key>lonley</key>
+ <string>lonely</string>
+ <key>lonly</key>
+ <string>lonely</string>
+ <key>loosing</key>
+ <string>losing</string>
+ <key>lotharingen</key>
+ <string>lothringen</string>
+ <key>lsat</key>
+ <string>last</string>
+ <key>lukid</key>
+ <string>likud</string>
+ <key>lveo</key>
+ <string>love</string>
+ <key>lvoe</key>
+ <string>love</string>
+ <key>maching</key>
+ <string>machine</string>
+ <key>mackeral</key>
+ <string>mackerel</string>
+ <key>magasine</key>
+ <string>magazine</string>
+ <key>magincian</key>
+ <string>magician</string>
+ <key>magnificient</key>
+ <string>magnificent</string>
+ <key>magolia</key>
+ <string>magnolia</string>
+ <key>mailny</key>
+ <string>mainly</string>
+ <key>maintainance</key>
+ <string>maintenance</string>
+ <key>maintainence</key>
+ <string>maintenance</string>
+ <key>maintance</key>
+ <string>maintenance</string>
+ <key>maintenence</key>
+ <string>maintenance</string>
+ <key>maintinaing</key>
+ <string>maintaining</string>
+ <key>maintioned</key>
+ <string>mentioned</string>
+ <key>majoroty</key>
+ <string>majority</string>
+ <key>maked</key>
+ <string>marked</string>
+ <key>makse</key>
+ <string>makes</string>
+ <key>maltesian</key>
+ <string>Maltese</string>
+ <key>mamal</key>
+ <string>mammal</string>
+ <key>mamalian</key>
+ <string>mammalian</string>
+ <key>managable</key>
+ <string>manageable</string>
+ <key>managment</key>
+ <string>management</string>
+ <key>maneouvre</key>
+ <string>manoeuvre</string>
+ <key>maneouvred</key>
+ <string>manoeuvred</string>
+ <key>maneouvres</key>
+ <string>manoeuvres</string>
+ <key>maneouvring</key>
+ <string>manoeuvring</string>
+ <key>manisfestations</key>
+ <string>manifestations</string>
+ <key>manoeuverability</key>
+ <string>maneuverability</string>
+ <key>manouver</key>
+ <string>maneuver</string>
+ <key>manouverability</key>
+ <string>maneuverability</string>
+ <key>manouverable</key>
+ <string>maneuverable</string>
+ <key>manouvers</key>
+ <string>maneuvers</string>
+ <key>mantained</key>
+ <string>maintained</string>
+ <key>manuever</key>
+ <string>maneuver</string>
+ <key>manuevers</key>
+ <string>maneuvers</string>
+ <key>manufacturedd</key>
+ <string>manufactured</string>
+ <key>manufature</key>
+ <string>manufacture</string>
+ <key>manufatured</key>
+ <string>manufactured</string>
+ <key>manufaturing</key>
+ <string>manufacturing</string>
+ <key>manuver</key>
+ <string>maneuver</string>
+ <key>mariage</key>
+ <string>marriage</string>
+ <key>marjority</key>
+ <string>majority</string>
+ <key>markes</key>
+ <string>marks</string>
+ <key>marketting</key>
+ <string>marketing</string>
+ <key>marmelade</key>
+ <string>marmalade</string>
+ <key>marrage</key>
+ <string>marriage</string>
+ <key>marraige</key>
+ <string>marriage</string>
+ <key>marrtyred</key>
+ <string>martyred</string>
+ <key>marryied</key>
+ <string>married</string>
+ <key>massmedia</key>
+ <string>mass media</string>
+ <key>masterbation</key>
+ <string>masturbation</string>
+ <key>mataphysical</key>
+ <string>metaphysical</string>
+ <key>materalists</key>
+ <string>materialist</string>
+ <key>mathamatics</key>
+ <string>mathematics</string>
+ <key>mathematican</key>
+ <string>mathematician</string>
+ <key>mathematicas</key>
+ <string>mathematics</string>
+ <key>matheticians</key>
+ <string>mathematicians</string>
+ <key>mathmatically</key>
+ <string>mathematically</string>
+ <key>mathmatician</key>
+ <string>mathematician</string>
+ <key>mathmaticians</key>
+ <string>mathematicians</string>
+ <key>mccarthyst</key>
+ <string>mccarthyist</string>
+ <key>mchanics</key>
+ <string>mechanics</string>
+ <key>meaninng</key>
+ <string>meaning</string>
+ <key>mear</key>
+ <string>wear</string>
+ <key>mechandise</key>
+ <string>merchandise</string>
+ <key>medacine</key>
+ <string>medicine</string>
+ <key>medeival</key>
+ <string>medieval</string>
+ <key>medevial</key>
+ <string>medieval</string>
+ <key>mediciney</key>
+ <string>mediciny</string>
+ <key>medievel</key>
+ <string>medieval</string>
+ <key>mediterainnean</key>
+ <string>mediterranean</string>
+ <key>meerkrat</key>
+ <string>meerkat</string>
+ <key>melieux</key>
+ <string>milieux</string>
+ <key>membranaphone</key>
+ <string>membranophone</string>
+ <key>memeber</key>
+ <string>member</string>
+ <key>menally</key>
+ <string>mentally</string>
+ <key>meranda</key>
+ <string>Miranda</string>
+ <key>mercentile</key>
+ <string>mercantile</string>
+ <key>messanger</key>
+ <string>messenger</string>
+ <key>messenging</key>
+ <string>messaging</string>
+ <key>metalic</key>
+ <string>metallic</string>
+ <key>metalurgic</key>
+ <string>metallurgic</string>
+ <key>metalurgical</key>
+ <string>metallurgical</string>
+ <key>metalurgy</key>
+ <string>metallurgy</string>
+ <key>metamorphysis</key>
+ <string>metamorphosis</string>
+ <key>metaphoricial</key>
+ <string>metaphorical</string>
+ <key>meterologist</key>
+ <string>meteorologist</string>
+ <key>meterology</key>
+ <string>meteorology</string>
+ <key>methaphor</key>
+ <string>metaphor</string>
+ <key>methaphors</key>
+ <string>metaphors</string>
+ <key>micoscopy</key>
+ <string>microscopy</string>
+ <key>midwifes</key>
+ <string>midwives</string>
+ <key>mileau</key>
+ <string>milieu</string>
+ <key>milennia</key>
+ <string>millennia</string>
+ <key>milennium</key>
+ <string>millennium</string>
+ <key>mileu</key>
+ <string>milieu</string>
+ <key>miliary</key>
+ <string>military</string>
+ <key>milion</key>
+ <string>million</string>
+ <key>miliraty</key>
+ <string>military</string>
+ <key>millenia</key>
+ <string>millennia</string>
+ <key>millenial</key>
+ <string>millennial</string>
+ <key>millenialism</key>
+ <string>millennialism</string>
+ <key>millenium</key>
+ <string>millennium</string>
+ <key>millepede</key>
+ <string>millipede</string>
+ <key>millioniare</key>
+ <string>millionaire</string>
+ <key>millitary</key>
+ <string>military</string>
+ <key>millon</key>
+ <string>million</string>
+ <key>miltary</key>
+ <string>military</string>
+ <key>minature</key>
+ <string>miniature</string>
+ <key>minerial</key>
+ <string>mineral</string>
+ <key>miniscule</key>
+ <string>minuscule</string>
+ <key>ministery</key>
+ <string>ministry</string>
+ <key>minstries</key>
+ <string>ministries</string>
+ <key>minstry</key>
+ <string>ministry</string>
+ <key>minumum</key>
+ <string>minimum</string>
+ <key>mirrorred</key>
+ <string>mirrored</string>
+ <key>miscelaneous</key>
+ <string>miscellaneous</string>
+ <key>miscellanious</key>
+ <string>miscellaneous</string>
+ <key>miscellanous</key>
+ <string>miscellaneous</string>
+ <key>mischeivous</key>
+ <string>mischievous</string>
+ <key>mischevious</key>
+ <string>mischievous</string>
+ <key>mischievious</key>
+ <string>mischievous</string>
+ <key>misdameanor</key>
+ <string>misdemeanor</string>
+ <key>misdameanors</key>
+ <string>misdemeanors</string>
+ <key>misdemenor</key>
+ <string>misdemeanor</string>
+ <key>misdemenors</key>
+ <string>misdemeanors</string>
+ <key>misfourtunes</key>
+ <string>misfortunes</string>
+ <key>misile</key>
+ <string>missile</string>
+ <key>mispell</key>
+ <string>misspell</string>
+ <key>mispelled</key>
+ <string>misspelled</string>
+ <key>mispelling</key>
+ <string>misspelling</string>
+ <key>missen</key>
+ <string>mizzen</string>
+ <key>missle</key>
+ <string>missile</string>
+ <key>missonary</key>
+ <string>missionary</string>
+ <key>misterious</key>
+ <string>mysterious</string>
+ <key>mistery</key>
+ <string>mystery</string>
+ <key>misteryous</key>
+ <string>mysterious</string>
+ <key>mkae</key>
+ <string>make</string>
+ <key>mkaes</key>
+ <string>makes</string>
+ <key>mkaing</key>
+ <string>making</string>
+ <key>mkea</key>
+ <string>make</string>
+ <key>moderm</key>
+ <string>modem</string>
+ <key>modle</key>
+ <string>model</string>
+ <key>moent</key>
+ <string>moment</string>
+ <key>moeny</key>
+ <string>money</string>
+ <key>mohammedans</key>
+ <string>muslims</string>
+ <key>moil</key>
+ <string>soil</string>
+ <key>moleclues</key>
+ <string>molecules</string>
+ <key>momento</key>
+ <string>memento</string>
+ <key>monestaries</key>
+ <string>monasteries</string>
+ <key>monestary</key>
+ <string>monastery</string>
+ <key>monickers</key>
+ <string>monikers</string>
+ <key>monolite</key>
+ <string>monolithic</string>
+ <key>montains</key>
+ <string>mountains</string>
+ <key>montanous</key>
+ <string>mountainous</string>
+ <key>monts</key>
+ <string>months</string>
+ <key>montypic</key>
+ <string>monotypic</string>
+ <key>moreso</key>
+ <string>more so</string>
+ <key>morgage</key>
+ <string>mortgage</string>
+ <key>morroccan</key>
+ <string>moroccan</string>
+ <key>morrocco</key>
+ <string>morocco</string>
+ <key>morroco</key>
+ <string>morocco</string>
+ <key>mortage</key>
+ <string>mortgage</string>
+ <key>mosture</key>
+ <string>moisture</string>
+ <key>motiviated</key>
+ <string>motivated</string>
+ <key>mounth</key>
+ <string>month</string>
+ <key>movei</key>
+ <string>movie</string>
+ <key>movment</key>
+ <string>movement</string>
+ <key>mroe</key>
+ <string>more</string>
+ <key>mucuous</key>
+ <string>mucous</string>
+ <key>muder</key>
+ <string>murder</string>
+ <key>mudering</key>
+ <string>murdering</string>
+ <key>muhammadan</key>
+ <string>muslim</string>
+ <key>multicultralism</key>
+ <string>multiculturalism</string>
+ <key>multipled</key>
+ <string>multiplied</string>
+ <key>multiplers</key>
+ <string>multipliers</string>
+ <key>munbers</key>
+ <string>numbers</string>
+ <key>muncipalities</key>
+ <string>municipalities</string>
+ <key>muncipality</key>
+ <string>municipality</string>
+ <key>munnicipality</key>
+ <string>municipality</string>
+ <key>muscels</key>
+ <string>muscles</string>
+ <key>muscial</key>
+ <string>musical</string>
+ <key>muscician</key>
+ <string>musician</string>
+ <key>muscicians</key>
+ <string>musicians</string>
+ <key>mutiliated</key>
+ <string>mutilated</string>
+ <key>myraid</key>
+ <string>myriad</string>
+ <key>mysef</key>
+ <string>myself</string>
+ <key>mysogynist</key>
+ <string>misogynist</string>
+ <key>mysogyny</key>
+ <string>misogyny</string>
+ <key>mysterous</key>
+ <string>mysterious</string>
+ <key>naieve</key>
+ <string>naive</string>
+ <key>naturaly</key>
+ <string>naturally</string>
+ <key>naturely</key>
+ <string>naturally</string>
+ <key>naturual</key>
+ <string>natural</string>
+ <key>naturually</key>
+ <string>naturally</string>
+ <key>neccesarily</key>
+ <string>necessarily</string>
+ <key>neccesary</key>
+ <string>necessary</string>
+ <key>neccessarily</key>
+ <string>necessarily</string>
+ <key>neccessary</key>
+ <string>necessary</string>
+ <key>neccessities</key>
+ <string>necessities</string>
+ <key>necesarily</key>
+ <string>necessarily</string>
+ <key>necesary</key>
+ <string>necessary</string>
+ <key>necessiate</key>
+ <string>necessitate</string>
+ <key>neglible</key>
+ <string>negligible</string>
+ <key>negligable</key>
+ <string>negligible</string>
+ <key>negociate</key>
+ <string>negotiate</string>
+ <key>negociation</key>
+ <string>negotiation</string>
+ <key>negociations</key>
+ <string>negotiations</string>
+ <key>negotation</key>
+ <string>negotiation</string>
+ <key>neice</key>
+ <string>niece</string>
+ <key>neigborhood</key>
+ <string>neighborhood</string>
+ <key>neigbour</key>
+ <string>neighbour</string>
+ <key>neigbourhood</key>
+ <string>neighbourhood</string>
+ <key>neolitic</key>
+ <string>neolithic</string>
+ <key>nessasarily</key>
+ <string>necessarily</string>
+ <key>nessecary</key>
+ <string>necessary</string>
+ <key>nestin</key>
+ <string>nesting</string>
+ <key>neverthless</key>
+ <string>nevertheless</string>
+ <key>newletters</key>
+ <string>newsletters</string>
+ <key>nickle</key>
+ <string>nickel</string>
+ <key>nightfa;;</key>
+ <string>nightfall</string>
+ <key>nightime</key>
+ <string>nighttime</string>
+ <key>nineth</key>
+ <string>ninth</string>
+ <key>ninteenth</key>
+ <string>nineteenth</string>
+ <key>ninties</key>
+ <string>1990s</string>
+ <key>ninty</key>
+ <string>ninety</string>
+ <key>nkow</key>
+ <string>know</string>
+ <key>nkwo</key>
+ <string>know</string>
+ <key>nmae</key>
+ <string>name</string>
+ <key>noncombatents</key>
+ <string>noncombatants</string>
+ <key>nonsence</key>
+ <string>nonsense</string>
+ <key>nontheless</key>
+ <string>nonetheless</string>
+ <key>noone</key>
+ <string>no one</string>
+ <key>norhern</key>
+ <string>northern</string>
+ <key>northen</key>
+ <string>northern</string>
+ <key>northereastern</key>
+ <string>northeastern</string>
+ <key>notabley</key>
+ <string>notably</string>
+ <key>noteable</key>
+ <string>notable</string>
+ <key>noteably</key>
+ <string>notably</string>
+ <key>noteriety</key>
+ <string>notoriety</string>
+ <key>noth</key>
+ <string>north</string>
+ <key>nothern</key>
+ <string>northern</string>
+ <key>noticable</key>
+ <string>noticeable</string>
+ <key>noticably</key>
+ <string>noticeably</string>
+ <key>noticeing</key>
+ <string>noticing</string>
+ <key>noticible</key>
+ <string>noticeable</string>
+ <key>notwhithstanding</key>
+ <string>notwithstanding</string>
+ <key>noveau</key>
+ <string>nouveau</string>
+ <key>nowdays</key>
+ <string>nowadays</string>
+ <key>nowe</key>
+ <string>now</string>
+ <key>nto</key>
+ <string>not</string>
+ <key>nucular</key>
+ <string>nuclear</string>
+ <key>nuculear</key>
+ <string>nuclear</string>
+ <key>nuisanse</key>
+ <string>nuisance</string>
+ <key>numberous</key>
+ <string>numerous</string>
+ <key>nusance</key>
+ <string>nuisance</string>
+ <key>nutritent</key>
+ <string>nutrient</string>
+ <key>nutritents</key>
+ <string>nutrients</string>
+ <key>nuturing</key>
+ <string>nurturing</string>
+ <key>obediance</key>
+ <string>obedience</string>
+ <key>obediant</key>
+ <string>obedient</string>
+ <key>obession</key>
+ <string>obsession</string>
+ <key>obssessed</key>
+ <string>obsessed</string>
+ <key>obstacal</key>
+ <string>obstacle</string>
+ <key>obstancles</key>
+ <string>obstacles</string>
+ <key>obstruced</key>
+ <string>obstructed</string>
+ <key>ocasion</key>
+ <string>occasion</string>
+ <key>ocasional</key>
+ <string>occasional</string>
+ <key>ocasionally</key>
+ <string>occasionally</string>
+ <key>ocasionaly</key>
+ <string>occasionally</string>
+ <key>ocasioned</key>
+ <string>occasioned</string>
+ <key>ocasions</key>
+ <string>occasions</string>
+ <key>ocassion</key>
+ <string>occasion</string>
+ <key>ocassional</key>
+ <string>occasional</string>
+ <key>ocassionally</key>
+ <string>occasionally</string>
+ <key>ocassionaly</key>
+ <string>occasionally</string>
+ <key>ocassioned</key>
+ <string>occasioned</string>
+ <key>ocassions</key>
+ <string>occasions</string>
+ <key>occaison</key>
+ <string>occasion</string>
+ <key>occassion</key>
+ <string>occasion</string>
+ <key>occassional</key>
+ <string>occasional</string>
+ <key>occassionally</key>
+ <string>occasionally</string>
+ <key>occassionaly</key>
+ <string>occasionally</string>
+ <key>occassioned</key>
+ <string>occasioned</string>
+ <key>occassions</key>
+ <string>occasions</string>
+ <key>occationally</key>
+ <string>occasionally</string>
+ <key>occour</key>
+ <string>occur</string>
+ <key>occurance</key>
+ <string>occurrence</string>
+ <key>occurances</key>
+ <string>occurrences</string>
+ <key>occured</key>
+ <string>occurred</string>
+ <key>occurence</key>
+ <string>occurrence</string>
+ <key>occurences</key>
+ <string>occurrences</string>
+ <key>occuring</key>
+ <string>occurring</string>
+ <key>occurr</key>
+ <string>occur</string>
+ <key>occurrance</key>
+ <string>occurrence</string>
+ <key>occurrances</key>
+ <string>occurrences</string>
+ <key>octohedra</key>
+ <string>octahedra</string>
+ <key>octohedral</key>
+ <string>octahedral</string>
+ <key>octohedron</key>
+ <string>octahedron</string>
+ <key>ocuntries</key>
+ <string>countries</string>
+ <key>ocuntry</key>
+ <string>country</string>
+ <key>ocurr</key>
+ <string>occur</string>
+ <key>ocurrance</key>
+ <string>occurrence</string>
+ <key>ocurred</key>
+ <string>occurred</string>
+ <key>ocurrence</key>
+ <string>occurrence</string>
+ <key>offcers</key>
+ <string>officers</string>
+ <key>offcially</key>
+ <string>officially</string>
+ <key>offereings</key>
+ <string>offerings</string>
+ <key>offical</key>
+ <string>official</string>
+ <key>offically</key>
+ <string>officially</string>
+ <key>officals</key>
+ <string>officials</string>
+ <key>officaly</key>
+ <string>officially</string>
+ <key>officialy</key>
+ <string>officially</string>
+ <key>offred</key>
+ <string>offered</string>
+ <key>oftenly</key>
+ <string>often</string>
+ <key>oging</key>
+ <string>going</string>
+ <key>omision</key>
+ <string>omission</string>
+ <key>omited</key>
+ <string>omitted</string>
+ <key>omiting</key>
+ <string>omitting</string>
+ <key>omlette</key>
+ <string>omelette</string>
+ <key>ommision</key>
+ <string>omission</string>
+ <key>ommited</key>
+ <string>omitted</string>
+ <key>ommiting</key>
+ <string>omitting</string>
+ <key>ommitted</key>
+ <string>omitted</string>
+ <key>ommitting</key>
+ <string>omitting</string>
+ <key>omniverous</key>
+ <string>omnivorous</string>
+ <key>omniverously</key>
+ <string>omnivorously</string>
+ <key>omre</key>
+ <string>more</string>
+ <key>onot</key>
+ <string>note</string>
+ <key>onxy</key>
+ <string>onyx</string>
+ <key>onyl</key>
+ <string>only</string>
+ <key>openess</key>
+ <string>openness</string>
+ <key>oponent</key>
+ <string>opponent</string>
+ <key>oportunity</key>
+ <string>opportunity</string>
+ <key>opose</key>
+ <string>oppose</string>
+ <key>oposite</key>
+ <string>opposite</string>
+ <key>oposition</key>
+ <string>opposition</string>
+ <key>oppenly</key>
+ <string>openly</string>
+ <key>oppinion</key>
+ <string>opinion</string>
+ <key>opponant</key>
+ <string>opponent</string>
+ <key>oppononent</key>
+ <string>opponent</string>
+ <key>oppositition</key>
+ <string>opposition</string>
+ <key>oppossed</key>
+ <string>opposed</string>
+ <key>opprotunity</key>
+ <string>opportunity</string>
+ <key>opression</key>
+ <string>oppression</string>
+ <key>opressive</key>
+ <string>oppressive</string>
+ <key>opthalmic</key>
+ <string>ophthalmic</string>
+ <key>opthalmologist</key>
+ <string>ophthalmologist</string>
+ <key>opthalmology</key>
+ <string>ophthalmology</string>
+ <key>opthamologist</key>
+ <string>ophthalmologist</string>
+ <key>optmizations</key>
+ <string>optimizations</string>
+ <key>optomism</key>
+ <string>optimism</string>
+ <key>orded</key>
+ <string>ordered</string>
+ <key>organim</key>
+ <string>organism</string>
+ <key>organistion</key>
+ <string>organisation</string>
+ <key>organiztion</key>
+ <string>organization</string>
+ <key>orgin</key>
+ <string>origin</string>
+ <key>orginal</key>
+ <string>original</string>
+ <key>orginally</key>
+ <string>originally</string>
+ <key>orginize</key>
+ <string>organise</string>
+ <key>oridinarily</key>
+ <string>ordinarily</string>
+ <key>origanaly</key>
+ <string>originally</string>
+ <key>originall</key>
+ <string>original</string>
+ <key>originaly</key>
+ <string>originally</string>
+ <key>originially</key>
+ <string>originally</string>
+ <key>originnally</key>
+ <string>originally</string>
+ <key>origional</key>
+ <string>original</string>
+ <key>orignally</key>
+ <string>originally</string>
+ <key>orignially</key>
+ <string>originally</string>
+ <key>otehr</key>
+ <string>other</string>
+ <key>oublisher</key>
+ <string>publisher</string>
+ <key>ouevre</key>
+ <string>oeuvre</string>
+ <key>oustanding</key>
+ <string>outstanding</string>
+ <key>overshaddowed</key>
+ <string>overshadowed</string>
+ <key>overthere</key>
+ <string>over there</string>
+ <key>overwelming</key>
+ <string>overwhelming</string>
+ <key>overwheliming</key>
+ <string>overwhelming</string>
+ <key>owrk</key>
+ <string>work</string>
+ <key>owudl</key>
+ <string>would</string>
+ <key>oxigen</key>
+ <string>oxygen</string>
+ <key>oximoron</key>
+ <string>oxymoron</string>
+ <key>p0enis</key>
+ <string>penis</string>
+ <key>paide</key>
+ <string>paid</string>
+ <key>paitience</key>
+ <string>patience</string>
+ <key>palce</key>
+ <string>place</string>
+ <key>paleolitic</key>
+ <string>paleolithic</string>
+ <key>paliamentarian</key>
+ <string>parliamentarian</string>
+ <key>pallete</key>
+ <string>palette</string>
+ <key>pamflet</key>
+ <string>pamphlet</string>
+ <key>pamplet</key>
+ <string>pamphlet</string>
+ <key>pantomine</key>
+ <string>pantomime</string>
+ <key>paralel</key>
+ <string>parallel</string>
+ <key>paralell</key>
+ <string>parallel</string>
+ <key>paralelly</key>
+ <string>parallelly</string>
+ <key>paralely</key>
+ <string>parallelly</string>
+ <key>parallely</key>
+ <string>parallelly</string>
+ <key>paranthesis</key>
+ <string>parenthesis</string>
+ <key>paraphenalia</key>
+ <string>paraphernalia</string>
+ <key>parellels</key>
+ <string>parallels</string>
+ <key>parituclar</key>
+ <string>particular</string>
+ <key>parliment</key>
+ <string>parliament</string>
+ <key>parrakeets</key>
+ <string>parakeets</string>
+ <key>parralel</key>
+ <string>parallel</string>
+ <key>parrallel</key>
+ <string>parallel</string>
+ <key>parrallell</key>
+ <string>parallel</string>
+ <key>parrallelly</key>
+ <string>parallelly</string>
+ <key>parrallely</key>
+ <string>parallelly</string>
+ <key>partialy</key>
+ <string>partially</string>
+ <key>particually</key>
+ <string>particularly</string>
+ <key>particualr</key>
+ <string>particular</string>
+ <key>particuarly</key>
+ <string>particularly</string>
+ <key>particularily</key>
+ <string>particularly</string>
+ <key>particulary</key>
+ <string>particularly</string>
+ <key>pary</key>
+ <string>party</string>
+ <key>pased</key>
+ <string>passed</string>
+ <key>pasengers</key>
+ <string>passengers</string>
+ <key>passerbys</key>
+ <string>passersby</string>
+ <key>pasttime</key>
+ <string>pastime</string>
+ <key>pastural</key>
+ <string>pastoral</string>
+ <key>paticular</key>
+ <string>particular</string>
+ <key>pattented</key>
+ <string>patented</string>
+ <key>pavillion</key>
+ <string>pavilion</string>
+ <key>payed</key>
+ <string>paid</string>
+ <key>pblisher</key>
+ <string>publisher</string>
+ <key>pbulisher</key>
+ <string>publisher</string>
+ <key>peacefuland</key>
+ <string>peaceful and</string>
+ <key>peageant</key>
+ <string>pageant</string>
+ <key>peculure</key>
+ <string>peculiar</string>
+ <key>pedestrain</key>
+ <string>pedestrian</string>
+ <key>peformed</key>
+ <string>performed</string>
+ <key>peice</key>
+ <string>piece</string>
+ <key>penatly</key>
+ <string>penalty</string>
+ <key>penerator</key>
+ <string>penetrator</string>
+ <key>penisula</key>
+ <string>peninsula</string>
+ <key>penisular</key>
+ <string>peninsular</string>
+ <key>penninsula</key>
+ <string>peninsula</string>
+ <key>penninsular</key>
+ <string>peninsular</string>
+ <key>pennisula</key>
+ <string>peninsula</string>
+ <key>pensinula</key>
+ <string>peninsula</string>
+ <key>peom</key>
+ <string>poem</string>
+ <key>peoms</key>
+ <string>poems</string>
+ <key>peopel</key>
+ <string>people</string>
+ <key>peotry</key>
+ <string>poetry</string>
+ <key>perade</key>
+ <string>parade</string>
+ <key>percepted</key>
+ <string>perceived</string>
+ <key>percieve</key>
+ <string>perceive</string>
+ <key>percieved</key>
+ <string>perceived</string>
+ <key>perenially</key>
+ <string>perennially</string>
+ <key>perfomance</key>
+ <string>performance</string>
+ <key>perfomers</key>
+ <string>performers</string>
+ <key>performence</key>
+ <string>performance</string>
+ <key>performes</key>
+ <string>performed</string>
+ <key>perhasp</key>
+ <string>perhaps</string>
+ <key>perheaps</key>
+ <string>perhaps</string>
+ <key>perhpas</key>
+ <string>perhaps</string>
+ <key>peripathetic</key>
+ <string>peripatetic</string>
+ <key>peristent</key>
+ <string>persistent</string>
+ <key>perjery</key>
+ <string>perjury</string>
+ <key>perjorative</key>
+ <string>pejorative</string>
+ <key>permanant</key>
+ <string>permanent</string>
+ <key>permenant</key>
+ <string>permanent</string>
+ <key>permenantly</key>
+ <string>permanently</string>
+ <key>permissable</key>
+ <string>permissible</string>
+ <key>perogative</key>
+ <string>prerogative</string>
+ <key>peronal</key>
+ <string>personal</string>
+ <key>perosnality</key>
+ <string>personality</string>
+ <key>perphas</key>
+ <string>perhaps</string>
+ <key>perpindicular</key>
+ <string>perpendicular</string>
+ <key>perseverence</key>
+ <string>perseverance</string>
+ <key>persistance</key>
+ <string>persistence</string>
+ <key>persistant</key>
+ <string>persistent</string>
+ <key>personel</key>
+ <string>personnel</string>
+ <key>personell</key>
+ <string>personnel</string>
+ <key>personnell</key>
+ <string>personnel</string>
+ <key>persuded</key>
+ <string>persuaded</string>
+ <key>persue</key>
+ <string>pursue</string>
+ <key>persued</key>
+ <string>pursued</string>
+ <key>persuing</key>
+ <string>pursuing</string>
+ <key>persuit</key>
+ <string>pursuit</string>
+ <key>persuits</key>
+ <string>pursuits</string>
+ <key>pertubation</key>
+ <string>perturbation</string>
+ <key>pertubations</key>
+ <string>perturbations</string>
+ <key>pessiary</key>
+ <string>pessary</string>
+ <key>petetion</key>
+ <string>petition</string>
+ <key>phenomenom</key>
+ <string>phenomenon</string>
+ <key>phenomenonal</key>
+ <string>phenomenal</string>
+ <key>phenomenonly</key>
+ <string>phenomenally</string>
+ <key>phenomonenon</key>
+ <string>phenomenon</string>
+ <key>phenomonon</key>
+ <string>phenomenon</string>
+ <key>phenonmena</key>
+ <string>phenomena</string>
+ <key>philisopher</key>
+ <string>philosopher</string>
+ <key>philisophical</key>
+ <string>philosophical</string>
+ <key>philisophy</key>
+ <string>philosophy</string>
+ <key>phillosophically</key>
+ <string>philosophically</string>
+ <key>philospher</key>
+ <string>philosopher</string>
+ <key>philosphies</key>
+ <string>philosophies</string>
+ <key>philosphy</key>
+ <string>philosophy</string>
+ <key>phongraph</key>
+ <string>phonograph</string>
+ <key>phylosophical</key>
+ <string>philosophical</string>
+ <key>physicaly</key>
+ <string>physically</string>
+ <key>piblisher</key>
+ <string>publisher</string>
+ <key>pich</key>
+ <string>pitch</string>
+ <key>pilgrimmage</key>
+ <string>pilgrimage</string>
+ <key>pilgrimmages</key>
+ <string>pilgrimages</string>
+ <key>pinapple</key>
+ <string>pineapple</string>
+ <key>pinnaple</key>
+ <string>pineapple</string>
+ <key>pinoneered</key>
+ <string>pioneered</string>
+ <key>plagarism</key>
+ <string>plagiarism</string>
+ <key>planation</key>
+ <string>plantation</string>
+ <key>planed</key>
+ <string>planned</string>
+ <key>plantiff</key>
+ <string>plaintiff</string>
+ <key>plateu</key>
+ <string>plateau</string>
+ <key>plausable</key>
+ <string>plausible</string>
+ <key>playright</key>
+ <string>playwright</string>
+ <key>playwrite</key>
+ <string>playwright</string>
+ <key>playwrites</key>
+ <string>playwrights</string>
+ <key>pleasent</key>
+ <string>pleasant</string>
+ <key>plebicite</key>
+ <string>plebiscite</string>
+ <key>plesant</key>
+ <string>pleasant</string>
+ <key>poenis</key>
+ <string>penis</string>
+ <key>poeoples</key>
+ <string>peoples</string>
+ <key>poety</key>
+ <string>poetry</string>
+ <key>poisin</key>
+ <string>poison</string>
+ <key>polical</key>
+ <string>political</string>
+ <key>polinator</key>
+ <string>pollinator</string>
+ <key>polinators</key>
+ <string>pollinators</string>
+ <key>politican</key>
+ <string>politician</string>
+ <key>politicans</key>
+ <string>politicians</string>
+ <key>poltical</key>
+ <string>political</string>
+ <key>polute</key>
+ <string>pollute</string>
+ <key>poluted</key>
+ <string>polluted</string>
+ <key>polutes</key>
+ <string>pollutes</string>
+ <key>poluting</key>
+ <string>polluting</string>
+ <key>polution</key>
+ <string>pollution</string>
+ <key>polyphonyic</key>
+ <string>polyphonic</string>
+ <key>polysaccaride</key>
+ <string>polysaccharide</string>
+ <key>polysaccharid</key>
+ <string>polysaccharide</string>
+ <key>pomegranite</key>
+ <string>pomegranate</string>
+ <key>pomotion</key>
+ <string>promotion</string>
+ <key>poportional</key>
+ <string>proportional</string>
+ <key>popoulation</key>
+ <string>population</string>
+ <key>popularaty</key>
+ <string>popularity</string>
+ <key>populare</key>
+ <string>popular</string>
+ <key>populer</key>
+ <string>popular</string>
+ <key>portait</key>
+ <string>portrait</string>
+ <key>portayed</key>
+ <string>portrayed</string>
+ <key>portraing</key>
+ <string>portraying</string>
+ <key>portuguease</key>
+ <string>portuguese</string>
+ <key>portugues</key>
+ <string>Portuguese</string>
+ <key>posess</key>
+ <string>possess</string>
+ <key>posessed</key>
+ <string>possessed</string>
+ <key>posesses</key>
+ <string>possesses</string>
+ <key>posessing</key>
+ <string>possessing</string>
+ <key>posession</key>
+ <string>possession</string>
+ <key>posessions</key>
+ <string>possessions</string>
+ <key>posion</key>
+ <string>poison</string>
+ <key>positon</key>
+ <string>position</string>
+ <key>possable</key>
+ <string>possible</string>
+ <key>possably</key>
+ <string>possibly</string>
+ <key>posseses</key>
+ <string>possesses</string>
+ <key>possesing</key>
+ <string>possessing</string>
+ <key>possesion</key>
+ <string>possession</string>
+ <key>possessess</key>
+ <string>possesses</string>
+ <key>possibile</key>
+ <string>possible</string>
+ <key>possibilty</key>
+ <string>possibility</string>
+ <key>possiblility</key>
+ <string>possibility</string>
+ <key>possiblilty</key>
+ <string>possibility</string>
+ <key>possiblities</key>
+ <string>possibilities</string>
+ <key>possiblity</key>
+ <string>possibility</string>
+ <key>possition</key>
+ <string>position</string>
+ <key>posthomous</key>
+ <string>posthumous</string>
+ <key>postion</key>
+ <string>position</string>
+ <key>postive</key>
+ <string>positive</string>
+ <key>potatos</key>
+ <string>potatoes</string>
+ <key>potrait</key>
+ <string>portrait</string>
+ <key>potrayed</key>
+ <string>portrayed</string>
+ <key>poulations</key>
+ <string>populations</string>
+ <key>poverful</key>
+ <string>powerful</string>
+ <key>poweful</key>
+ <string>powerful</string>
+ <key>powerfull</key>
+ <string>powerful</string>
+ <key>ppublisher</key>
+ <string>publisher</string>
+ <key>practial</key>
+ <string>practical</string>
+ <key>practially</key>
+ <string>practically</string>
+ <key>practicaly</key>
+ <string>practically</string>
+ <key>practicioner</key>
+ <string>practitioner</string>
+ <key>practicioners</key>
+ <string>practitioners</string>
+ <key>practicly</key>
+ <string>practically</string>
+ <key>practioner</key>
+ <string>practitioner</string>
+ <key>practioners</key>
+ <string>practitioners</string>
+ <key>prairy</key>
+ <string>prairie</string>
+ <key>prarie</key>
+ <string>prairie</string>
+ <key>praries</key>
+ <string>prairies</string>
+ <key>pratice</key>
+ <string>practice</string>
+ <key>preample</key>
+ <string>preamble</string>
+ <key>precedessor</key>
+ <string>predecessor</string>
+ <key>preceed</key>
+ <string>precede</string>
+ <key>preceeded</key>
+ <string>preceded</string>
+ <key>preceeding</key>
+ <string>preceding</string>
+ <key>preceeds</key>
+ <string>precedes</string>
+ <key>precentage</key>
+ <string>percentage</string>
+ <key>precice</key>
+ <string>precise</string>
+ <key>precisly</key>
+ <string>precisely</string>
+ <key>precurser</key>
+ <string>precursor</string>
+ <key>predecesors</key>
+ <string>predecessors</string>
+ <key>predicatble</key>
+ <string>predictable</string>
+ <key>predicitons</key>
+ <string>predictions</string>
+ <key>predomiantly</key>
+ <string>predominately</string>
+ <key>prefered</key>
+ <string>preferred</string>
+ <key>prefering</key>
+ <string>preferring</string>
+ <key>preferrably</key>
+ <string>preferably</string>
+ <key>pregancies</key>
+ <string>pregnancies</string>
+ <key>preiod</key>
+ <string>period</string>
+ <key>preliferation</key>
+ <string>proliferation</string>
+ <key>premeire</key>
+ <string>premiere</string>
+ <key>premeired</key>
+ <string>premiered</string>
+ <key>premillenial</key>
+ <string>premillennial</string>
+ <key>preminence</key>
+ <string>preeminence</string>
+ <key>premission</key>
+ <string>permission</string>
+ <key>preocupation</key>
+ <string>preoccupation</string>
+ <key>prepair</key>
+ <string>prepare</string>
+ <key>prepartion</key>
+ <string>preparation</string>
+ <key>prepatory</key>
+ <string>preparatory</string>
+ <key>preperation</key>
+ <string>preparation</string>
+ <key>preperations</key>
+ <string>preparations</string>
+ <key>preriod</key>
+ <string>period</string>
+ <key>presedential</key>
+ <string>presidential</string>
+ <key>presense</key>
+ <string>presence</string>
+ <key>presidenital</key>
+ <string>presidential</string>
+ <key>presidental</key>
+ <string>presidential</string>
+ <key>presitgious</key>
+ <string>prestigious</string>
+ <key>prespective</key>
+ <string>perspective</string>
+ <key>prestigeous</key>
+ <string>prestigious</string>
+ <key>prestigous</key>
+ <string>prestigious</string>
+ <key>presumabely</key>
+ <string>presumably</string>
+ <key>presumibly</key>
+ <string>presumably</string>
+ <key>pretection</key>
+ <string>protection</string>
+ <key>prevelant</key>
+ <string>prevalent</string>
+ <key>preverse</key>
+ <string>perverse</string>
+ <key>previvous</key>
+ <string>previous</string>
+ <key>pricipal</key>
+ <string>principal</string>
+ <key>priciple</key>
+ <string>principle</string>
+ <key>priestood</key>
+ <string>priesthood</string>
+ <key>primarly</key>
+ <string>primarily</string>
+ <key>primative</key>
+ <string>primitive</string>
+ <key>primatively</key>
+ <string>primitively</string>
+ <key>primatives</key>
+ <string>primitives</string>
+ <key>primordal</key>
+ <string>primordial</string>
+ <key>priveledges</key>
+ <string>privileges</string>
+ <key>privelege</key>
+ <string>privilege</string>
+ <key>priveleged</key>
+ <string>privileged</string>
+ <key>priveleges</key>
+ <string>privileges</string>
+ <key>privelige</key>
+ <string>privilege</string>
+ <key>priveliged</key>
+ <string>privileged</string>
+ <key>priveliges</key>
+ <string>privileges</string>
+ <key>privelleges</key>
+ <string>privileges</string>
+ <key>privilage</key>
+ <string>privilege</string>
+ <key>priviledge</key>
+ <string>privilege</string>
+ <key>priviledges</key>
+ <string>privileges</string>
+ <key>privledge</key>
+ <string>privilege</string>
+ <key>privte</key>
+ <string>private</string>
+ <key>probabilaty</key>
+ <string>probability</string>
+ <key>probablistic</key>
+ <string>probabilistic</string>
+ <key>probablly</key>
+ <string>probably</string>
+ <key>probalibity</key>
+ <string>probability</string>
+ <key>probaly</key>
+ <string>probably</string>
+ <key>probelm</key>
+ <string>problem</string>
+ <key>proccess</key>
+ <string>process</string>
+ <key>proccessing</key>
+ <string>processing</string>
+ <key>procede</key>
+ <string>proceed</string>
+ <key>proceded</key>
+ <string>proceeded</string>
+ <key>procedes</key>
+ <string>proceeds</string>
+ <key>procedger</key>
+ <string>procedure</string>
+ <key>proceding</key>
+ <string>proceeding</string>
+ <key>procedings</key>
+ <string>proceedings</string>
+ <key>proceedure</key>
+ <string>procedure</string>
+ <key>proces</key>
+ <string>process</string>
+ <key>processer</key>
+ <string>processor</string>
+ <key>proclaimation</key>
+ <string>proclamation</string>
+ <key>proclamed</key>
+ <string>proclaimed</string>
+ <key>proclaming</key>
+ <string>proclaiming</string>
+ <key>proclomation</key>
+ <string>proclamation</string>
+ <key>profesion</key>
+ <string>profession</string>
+ <key>profesor</key>
+ <string>professor</string>
+ <key>professer</key>
+ <string>professor</string>
+ <key>proffesed</key>
+ <string>professed</string>
+ <key>proffesion</key>
+ <string>profession</string>
+ <key>proffesional</key>
+ <string>professional</string>
+ <key>proffesor</key>
+ <string>professor</string>
+ <key>profilic</key>
+ <string>prolific</string>
+ <key>progessed</key>
+ <string>progressed</string>
+ <key>programable</key>
+ <string>programmable</string>
+ <key>progrom</key>
+ <string>program</string>
+ <key>progroms</key>
+ <string>programs</string>
+ <key>prohabition</key>
+ <string>prohibition</string>
+ <key>prologomena</key>
+ <string>prolegomena</string>
+ <key>prominance</key>
+ <string>prominence</string>
+ <key>prominant</key>
+ <string>prominent</string>
+ <key>prominantly</key>
+ <string>prominently</string>
+ <key>prominately</key>
+ <string>prominently</string>
+ <key>promiscous</key>
+ <string>promiscuous</string>
+ <key>promotted</key>
+ <string>promoted</string>
+ <key>pronomial</key>
+ <string>pronominal</string>
+ <key>pronouced</key>
+ <string>pronounced</string>
+ <key>pronounched</key>
+ <string>pronounced</string>
+ <key>pronounciation</key>
+ <string>pronunciation</string>
+ <key>proove</key>
+ <string>prove</string>
+ <key>prooved</key>
+ <string>proved</string>
+ <key>prophacy</key>
+ <string>prophecy</string>
+ <key>propietary</key>
+ <string>proprietary</string>
+ <key>propmted</key>
+ <string>prompted</string>
+ <key>propoganda</key>
+ <string>propaganda</string>
+ <key>propogate</key>
+ <string>propagate</string>
+ <key>propogates</key>
+ <string>propagates</string>
+ <key>propogation</key>
+ <string>propagation</string>
+ <key>propostion</key>
+ <string>proposition</string>
+ <key>propotions</key>
+ <string>proportions</string>
+ <key>propper</key>
+ <string>proper</string>
+ <key>propperly</key>
+ <string>properly</string>
+ <key>proprietory</key>
+ <string>proprietary</string>
+ <key>proseletyzing</key>
+ <string>proselytizing</string>
+ <key>protaganist</key>
+ <string>protagonist</string>
+ <key>protaganists</key>
+ <string>protagonists</string>
+ <key>protocal</key>
+ <string>protocol</string>
+ <key>protoganist</key>
+ <string>protagonist</string>
+ <key>protrayed</key>
+ <string>portrayed</string>
+ <key>protruberance</key>
+ <string>protuberance</string>
+ <key>protruberances</key>
+ <string>protuberances</string>
+ <key>prouncements</key>
+ <string>pronouncements</string>
+ <key>provacative</key>
+ <string>provocative</string>
+ <key>provded</key>
+ <string>provided</string>
+ <key>provicial</key>
+ <string>provincial</string>
+ <key>provinicial</key>
+ <string>provincial</string>
+ <key>provisiosn</key>
+ <string>provision</string>
+ <key>provisonal</key>
+ <string>provisional</string>
+ <key>proximty</key>
+ <string>proximity</string>
+ <key>pseudononymous</key>
+ <string>pseudonymous</string>
+ <key>pseudonyn</key>
+ <string>pseudonym</string>
+ <key>psuedo</key>
+ <string>pseudo</string>
+ <key>psycology</key>
+ <string>psychology</string>
+ <key>psyhic</key>
+ <string>psychic</string>
+ <key>pubilsher</key>
+ <string>publisher</string>
+ <key>pubisher</key>
+ <string>publisher</string>
+ <key>publiaher</key>
+ <string>publisher</string>
+ <key>publically</key>
+ <string>publicly</string>
+ <key>publicaly</key>
+ <string>publicly</string>
+ <key>publicher</key>
+ <string>publisher</string>
+ <key>publihser</key>
+ <string>publisher</string>
+ <key>publisehr</key>
+ <string>publisher</string>
+ <key>publiser</key>
+ <string>publisher</string>
+ <key>publisger</key>
+ <string>publisher</string>
+ <key>publisheed</key>
+ <string>published</string>
+ <key>publisherr</key>
+ <string>publisher</string>
+ <key>publishher</key>
+ <string>publisher</string>
+ <key>publishor</key>
+ <string>publisher</string>
+ <key>publishre</key>
+ <string>publisher</string>
+ <key>publissher</key>
+ <string>publisher</string>
+ <key>publlisher</key>
+ <string>publisher</string>
+ <key>publsiher</key>
+ <string>publisher</string>
+ <key>publusher</key>
+ <string>publisher</string>
+ <key>puchasing</key>
+ <string>purchasing</string>
+ <key>pulisher</key>
+ <string>publisher</string>
+ <key>pumkin</key>
+ <string>pumpkin</string>
+ <key>puplisher</key>
+ <string>publisher</string>
+ <key>puritannical</key>
+ <string>puritanical</string>
+ <key>purposedly</key>
+ <string>purposely</string>
+ <key>purpotedly</key>
+ <string>purportedly</string>
+ <key>pursuade</key>
+ <string>persuade</string>
+ <key>pursuaded</key>
+ <string>persuaded</string>
+ <key>pursuades</key>
+ <string>persuades</string>
+ <key>pususading</key>
+ <string>persuading</string>
+ <key>puting</key>
+ <string>putting</string>
+ <key>pwoer</key>
+ <string>power</string>
+ <key>pyscic</key>
+ <string>psychic</string>
+ <key>qtuie</key>
+ <string>quiet</string>
+ <key>quantaty</key>
+ <string>quantity</string>
+ <key>quantitiy</key>
+ <string>quantity</string>
+ <key>quarantaine</key>
+ <string>quarantine</string>
+ <key>questonable</key>
+ <string>questionable</string>
+ <key>quicklyu</key>
+ <string>quickly</string>
+ <key>quinessential</key>
+ <string>quintessential</string>
+ <key>quitted</key>
+ <string>quit</string>
+ <key>quizes</key>
+ <string>quizzes</string>
+ <key>qutie</key>
+ <string>quiet</string>
+ <key>rabinnical</key>
+ <string>rabbinical</string>
+ <key>racaus</key>
+ <string>raucous</string>
+ <key>radiactive</key>
+ <string>radioactive</string>
+ <key>radify</key>
+ <string>ratify</string>
+ <key>raelly</key>
+ <string>really</string>
+ <key>rarified</key>
+ <string>rarefied</string>
+ <key>reaccurring</key>
+ <string>recurring</string>
+ <key>reacing</key>
+ <string>reaching</string>
+ <key>reacll</key>
+ <string>recall</string>
+ <key>readmition</key>
+ <string>readmission</string>
+ <key>realitvely</key>
+ <string>relatively</string>
+ <key>realsitic</key>
+ <string>realistic</string>
+ <key>realtions</key>
+ <string>relations</string>
+ <key>realy</key>
+ <string>really</string>
+ <key>realyl</key>
+ <string>really</string>
+ <key>reasearch</key>
+ <string>research</string>
+ <key>rebiulding</key>
+ <string>rebuilding</string>
+ <key>rebllions</key>
+ <string>rebellions</string>
+ <key>rebounce</key>
+ <string>rebound</string>
+ <key>reccomend</key>
+ <string>recommend</string>
+ <key>reccomendations</key>
+ <string>recommendations</string>
+ <key>reccomended</key>
+ <string>recommended</string>
+ <key>reccomending</key>
+ <string>recommending</string>
+ <key>reccommend</key>
+ <string>recommend</string>
+ <key>reccommended</key>
+ <string>recommended</string>
+ <key>reccommending</key>
+ <string>recommending</string>
+ <key>reccuring</key>
+ <string>recurring</string>
+ <key>receeded</key>
+ <string>receded</string>
+ <key>receeding</key>
+ <string>receding</string>
+ <key>receivedfrom</key>
+ <string>received from</string>
+ <key>recepient</key>
+ <string>recipient</string>
+ <key>recepients</key>
+ <string>recipients</string>
+ <key>receving</key>
+ <string>receiving</string>
+ <key>rechargable</key>
+ <string>rechargeable</string>
+ <key>reched</key>
+ <string>reached</string>
+ <key>recide</key>
+ <string>reside</string>
+ <key>recided</key>
+ <string>resided</string>
+ <key>recident</key>
+ <string>resident</string>
+ <key>recidents</key>
+ <string>residents</string>
+ <key>reciding</key>
+ <string>residing</string>
+ <key>reciepents</key>
+ <string>recipients</string>
+ <key>reciept</key>
+ <string>receipt</string>
+ <key>recieve</key>
+ <string>receive</string>
+ <key>recieved</key>
+ <string>received</string>
+ <key>reciever</key>
+ <string>receiver</string>
+ <key>recievers</key>
+ <string>receivers</string>
+ <key>recieves</key>
+ <string>receives</string>
+ <key>recieving</key>
+ <string>receiving</string>
+ <key>recipiant</key>
+ <string>recipient</string>
+ <key>recipiants</key>
+ <string>recipients</string>
+ <key>recived</key>
+ <string>received</string>
+ <key>recivership</key>
+ <string>receivership</string>
+ <key>recogise</key>
+ <string>recognise</string>
+ <key>recogize</key>
+ <string>recognize</string>
+ <key>recomend</key>
+ <string>recommend</string>
+ <key>recomended</key>
+ <string>recommended</string>
+ <key>recomending</key>
+ <string>recommending</string>
+ <key>recomends</key>
+ <string>recommends</string>
+ <key>recommedations</key>
+ <string>recommendations</string>
+ <key>reconaissance</key>
+ <string>reconnaissance</string>
+ <key>reconcilation</key>
+ <string>reconciliation</string>
+ <key>reconized</key>
+ <string>recognized</string>
+ <key>reconnaisance</key>
+ <string>reconnaissance</string>
+ <key>reconnaissence</key>
+ <string>reconnaissance</string>
+ <key>recontructed</key>
+ <string>reconstructed</string>
+ <key>recordproducer</key>
+ <string>record producer</string>
+ <key>recquired</key>
+ <string>required</string>
+ <key>recrational</key>
+ <string>recreational</string>
+ <key>recrod</key>
+ <string>record</string>
+ <key>recuiting</key>
+ <string>recruiting</string>
+ <key>recuring</key>
+ <string>recurring</string>
+ <key>recurrance</key>
+ <string>recurrence</string>
+ <key>rediculous</key>
+ <string>ridiculous</string>
+ <key>reedeming</key>
+ <string>redeeming</string>
+ <key>reenforced</key>
+ <string>reinforced</string>
+ <key>refect</key>
+ <string>reflect</string>
+ <key>refedendum</key>
+ <string>referendum</string>
+ <key>referal</key>
+ <string>referral</string>
+ <key>referece</key>
+ <string>reference</string>
+ <key>refereces</key>
+ <string>references</string>
+ <key>refered</key>
+ <string>referred</string>
+ <key>referemce</key>
+ <string>reference</string>
+ <key>referemces</key>
+ <string>references</string>
+ <key>referencs</key>
+ <string>references</string>
+ <key>referenece</key>
+ <string>reference</string>
+ <key>refereneced</key>
+ <string>referenced</string>
+ <key>refereneces</key>
+ <string>references</string>
+ <key>referiang</key>
+ <string>referring</string>
+ <key>refering</key>
+ <string>referring</string>
+ <key>refernce</key>
+ <string>references</string>
+ <key>refernces</key>
+ <string>references</string>
+ <key>referrence</key>
+ <string>reference</string>
+ <key>referrences</key>
+ <string>references</string>
+ <key>referrs</key>
+ <string>refers</string>
+ <key>reffered</key>
+ <string>referred</string>
+ <key>refference</key>
+ <string>reference</string>
+ <key>reffering</key>
+ <string>referring</string>
+ <key>refrence</key>
+ <string>reference</string>
+ <key>refrences</key>
+ <string>references</string>
+ <key>refrers</key>
+ <string>refers</string>
+ <key>refridgeration</key>
+ <string>refrigeration</string>
+ <key>refridgerator</key>
+ <string>refrigerator</string>
+ <key>refromist</key>
+ <string>reformist</string>
+ <key>refusla</key>
+ <string>refusal</string>
+ <key>regardes</key>
+ <string>regards</string>
+ <key>regluar</key>
+ <string>regular</string>
+ <key>reguarly</key>
+ <string>regularly</string>
+ <key>regulaion</key>
+ <string>regulation</string>
+ <key>regulaotrs</key>
+ <string>regulators</string>
+ <key>regularily</key>
+ <string>regularly</string>
+ <key>rehersal</key>
+ <string>rehearsal</string>
+ <key>reicarnation</key>
+ <string>reincarnation</string>
+ <key>reigining</key>
+ <string>reigning</string>
+ <key>reknown</key>
+ <string>renown</string>
+ <key>reknowned</key>
+ <string>renowned</string>
+ <key>rela</key>
+ <string>real</string>
+ <key>relaly</key>
+ <string>really</string>
+ <key>relatiopnship</key>
+ <string>relationship</string>
+ <key>relativly</key>
+ <string>relatively</string>
+ <key>relected</key>
+ <string>reelected</string>
+ <key>releive</key>
+ <string>relieve</string>
+ <key>releived</key>
+ <string>relieved</string>
+ <key>releiver</key>
+ <string>reliever</string>
+ <key>releses</key>
+ <string>releases</string>
+ <key>relevence</key>
+ <string>relevance</string>
+ <key>relevent</key>
+ <string>relevant</string>
+ <key>reliablity</key>
+ <string>reliability</string>
+ <key>relient</key>
+ <string>reliant</string>
+ <key>religeous</key>
+ <string>religious</string>
+ <key>religous</key>
+ <string>religious</string>
+ <key>religously</key>
+ <string>religiously</string>
+ <key>relinqushment</key>
+ <string>relinquishment</string>
+ <key>relitavely</key>
+ <string>relatively</string>
+ <key>relized</key>
+ <string>realized</string>
+ <key>relpacement</key>
+ <string>replacement</string>
+ <key>remaing</key>
+ <string>remaining</string>
+ <key>remeber</key>
+ <string>remember</string>
+ <key>rememberable</key>
+ <string>memorable</string>
+ <key>rememberance</key>
+ <string>remembrance</string>
+ <key>remembrence</key>
+ <string>remembrance</string>
+ <key>remenant</key>
+ <string>remnant</string>
+ <key>remenicent</key>
+ <string>reminiscent</string>
+ <key>reminent</key>
+ <string>remnant</string>
+ <key>reminescent</key>
+ <string>reminiscent</string>
+ <key>reminscent</key>
+ <string>reminiscent</string>
+ <key>reminsicent</key>
+ <string>reminiscent</string>
+ <key>rendevous</key>
+ <string>rendezvous</string>
+ <key>rendezous</key>
+ <string>rendezvous</string>
+ <key>renedered</key>
+ <string>rende</string>
+ <key>renewl</key>
+ <string>renewal</string>
+ <key>rennovate</key>
+ <string>renovate</string>
+ <key>rennovated</key>
+ <string>renovated</string>
+ <key>rennovating</key>
+ <string>renovating</string>
+ <key>rennovation</key>
+ <string>renovation</string>
+ <key>rentors</key>
+ <string>renters</string>
+ <key>reoccurrence</key>
+ <string>recurrence</string>
+ <key>reorganision</key>
+ <string>reorganisation</string>
+ <key>repatition</key>
+ <string>repetition</string>
+ <key>repectively</key>
+ <string>respectively</string>
+ <key>repeition</key>
+ <string>repetition</string>
+ <key>repentence</key>
+ <string>repentance</string>
+ <key>repentent</key>
+ <string>repentant</string>
+ <key>repeteadly</key>
+ <string>repeatedly</string>
+ <key>repetion</key>
+ <string>repetition</string>
+ <key>repid</key>
+ <string>rapid</string>
+ <key>reponse</key>
+ <string>response</string>
+ <key>reponsible</key>
+ <string>responsible</string>
+ <key>reportadly</key>
+ <string>reportedly</string>
+ <key>represantative</key>
+ <string>representative</string>
+ <key>representive</key>
+ <string>representative</string>
+ <key>representives</key>
+ <string>representatives</string>
+ <key>reproducable</key>
+ <string>reproducible</string>
+ <key>reprtoire</key>
+ <string>repertoire</string>
+ <key>repsectively</key>
+ <string>respectively</string>
+ <key>reptition</key>
+ <string>repetition</string>
+ <key>requirment</key>
+ <string>requirement</string>
+ <key>requred</key>
+ <string>required</string>
+ <key>resaurant</key>
+ <string>restaurant</string>
+ <key>resembelance</key>
+ <string>resemblance</string>
+ <key>resembes</key>
+ <string>resembles</string>
+ <key>resemblence</key>
+ <string>resemblance</string>
+ <key>resevoir</key>
+ <string>reservoir</string>
+ <key>residental</key>
+ <string>residential</string>
+ <key>resignement</key>
+ <string>resignment</string>
+ <key>resistable</key>
+ <string>resistible</string>
+ <key>resistence</key>
+ <string>resistance</string>
+ <key>resistent</key>
+ <string>resistant</string>
+ <key>respectivly</key>
+ <string>respectively</string>
+ <key>responce</key>
+ <string>response</string>
+ <key>responibilities</key>
+ <string>responsibilities</string>
+ <key>responisble</key>
+ <string>responsible</string>
+ <key>responnsibilty</key>
+ <string>responsibility</string>
+ <key>responsability</key>
+ <string>responsibility</string>
+ <key>responsibile</key>
+ <string>responsible</string>
+ <key>responsibilites</key>
+ <string>responsibilities</string>
+ <key>responsiblities</key>
+ <string>responsibilities</string>
+ <key>responsiblity</key>
+ <string>responsibility</string>
+ <key>ressemblance</key>
+ <string>resemblance</string>
+ <key>ressemble</key>
+ <string>resemble</string>
+ <key>ressembled</key>
+ <string>resembled</string>
+ <key>ressemblence</key>
+ <string>resemblance</string>
+ <key>ressembling</key>
+ <string>resembling</string>
+ <key>resssurecting</key>
+ <string>resurrecting</string>
+ <key>ressurect</key>
+ <string>resurrect</string>
+ <key>ressurected</key>
+ <string>resurrected</string>
+ <key>ressurection</key>
+ <string>resurrection</string>
+ <key>ressurrection</key>
+ <string>resurrection</string>
+ <key>restarant</key>
+ <string>restaurant</string>
+ <key>restarants</key>
+ <string>restaurants</string>
+ <key>restaraunt</key>
+ <string>restaurant</string>
+ <key>restaraunteur</key>
+ <string>restaurateur</string>
+ <key>restaraunteurs</key>
+ <string>restaurateurs</string>
+ <key>restaraunts</key>
+ <string>restaurants</string>
+ <key>restauranteurs</key>
+ <string>restaurateurs</string>
+ <key>restauration</key>
+ <string>restoration</string>
+ <key>restauraunt</key>
+ <string>restaurant</string>
+ <key>resteraunt</key>
+ <string>restaurant</string>
+ <key>resteraunts</key>
+ <string>restaurants</string>
+ <key>resticted</key>
+ <string>restricted</string>
+ <key>restraunt</key>
+ <string>restraint</string>
+ <key>resturant</key>
+ <string>restaurant</string>
+ <key>resturants</key>
+ <string>restaurants</string>
+ <key>resturaunt</key>
+ <string>restaurant</string>
+ <key>resturaunts</key>
+ <string>restaurants</string>
+ <key>resurecting</key>
+ <string>resurrecting</string>
+ <key>retalitated</key>
+ <string>retaliated</string>
+ <key>retalitation</key>
+ <string>retaliation</string>
+ <key>retreive</key>
+ <string>retrieve</string>
+ <key>returnd</key>
+ <string>returned</string>
+ <key>revaluated</key>
+ <string>reevaluated</string>
+ <key>reveiw</key>
+ <string>review</string>
+ <key>reveral</key>
+ <string>reversal</string>
+ <key>reversable</key>
+ <string>reversible</string>
+ <key>revolutionar</key>
+ <string>revolutionary</string>
+ <key>rewitten</key>
+ <string>rewritten</string>
+ <key>rewriet</key>
+ <string>rewrite</string>
+ <key>rference</key>
+ <string>reference</string>
+ <key>rferences</key>
+ <string>references</string>
+ <key>rhymme</key>
+ <string>rhyme</string>
+ <key>rhythem</key>
+ <string>rhythm</string>
+ <key>rhythim</key>
+ <string>rhythm</string>
+ <key>rhytmic</key>
+ <string>rhythmic</string>
+ <key>rigourous</key>
+ <string>rigorous</string>
+ <key>rininging</key>
+ <string>ringing</string>
+ <key>rised</key>
+ <string>rose</string>
+ <key>rococco</key>
+ <string>rococo</string>
+ <key>rocord</key>
+ <string>record</string>
+ <key>roomate</key>
+ <string>roommate</string>
+ <key>rougly</key>
+ <string>roughly</string>
+ <key>rucuperate</key>
+ <string>recuperate</string>
+ <key>rudimentatry</key>
+ <string>rudimentary</string>
+ <key>rulle</key>
+ <string>rule</string>
+ <key>runing</key>
+ <string>running</string>
+ <key>runnung</key>
+ <string>running</string>
+ <key>russina</key>
+ <string>Russian</string>
+ <key>rwite</key>
+ <string>write</string>
+ <key>rythem</key>
+ <string>rhythm</string>
+ <key>rythim</key>
+ <string>rhythm</string>
+ <key>rythm</key>
+ <string>rhythm</string>
+ <key>rythmic</key>
+ <string>rhythmic</string>
+ <key>rythyms</key>
+ <string>rhythms</string>
+ <key>sacrafice</key>
+ <string>sacrifice</string>
+ <key>sacreligious</key>
+ <string>sacrilegious</string>
+ <key>sacrifical</key>
+ <string>sacrificial</string>
+ <key>saftey</key>
+ <string>safety</string>
+ <key>safty</key>
+ <string>safety</string>
+ <key>salery</key>
+ <string>salary</string>
+ <key>sanctionning</key>
+ <string>sanctioning</string>
+ <key>sandwhich</key>
+ <string>sandwich</string>
+ <key>santioned</key>
+ <string>sanctioned</string>
+ <key>sargant</key>
+ <string>sergeant</string>
+ <key>sargeant</key>
+ <string>sergeant</string>
+ <key>satelite</key>
+ <string>satellite</string>
+ <key>satelites</key>
+ <string>satellites</string>
+ <key>satisfactority</key>
+ <string>satisfactorily</string>
+ <key>satric</key>
+ <string>satiric</string>
+ <key>satrical</key>
+ <string>satirical</string>
+ <key>satrically</key>
+ <string>satirically</string>
+ <key>sattelite</key>
+ <string>satellite</string>
+ <key>sattelites</key>
+ <string>satellites</string>
+ <key>saught</key>
+ <string>sought</string>
+ <key>saveing</key>
+ <string>saving</string>
+ <key>saxaphone</key>
+ <string>saxophone</string>
+ <key>scaleable</key>
+ <string>scalable</string>
+ <key>scandanavia</key>
+ <string>Scandinavia</string>
+ <key>scaricity</key>
+ <string>scarcity</string>
+ <key>scavanged</key>
+ <string>scavenged</string>
+ <key>schedual</key>
+ <string>schedule</string>
+ <key>scholarhip</key>
+ <string>scholarship</string>
+ <key>scholarstic</key>
+ <string>scholastic</string>
+ <key>scientfic</key>
+ <string>scientific</string>
+ <key>scientifc</key>
+ <string>scientific</string>
+ <key>scientis</key>
+ <string>scientist</string>
+ <key>scince</key>
+ <string>science</string>
+ <key>scinece</key>
+ <string>science</string>
+ <key>scirpt</key>
+ <string>script</string>
+ <key>scoll</key>
+ <string>scroll</string>
+ <key>screenwrighter</key>
+ <string>screenwriter</string>
+ <key>scrutinity</key>
+ <string>scrutiny</string>
+ <key>scuptures</key>
+ <string>sculptures</string>
+ <key>seach</key>
+ <string>search</string>
+ <key>seached</key>
+ <string>searched</string>
+ <key>seaches</key>
+ <string>searches</string>
+ <key>secratary</key>
+ <string>secretary</string>
+ <key>secretery</key>
+ <string>secretary</string>
+ <key>sedereal</key>
+ <string>sidereal</string>
+ <key>seeked</key>
+ <string>sought</string>
+ <key>segementation</key>
+ <string>segmentation</string>
+ <key>seguoys</key>
+ <string>segues</string>
+ <key>seige</key>
+ <string>siege</string>
+ <key>seing</key>
+ <string>seeing</string>
+ <key>seinor</key>
+ <string>senior</string>
+ <key>seldomly</key>
+ <string>seldom</string>
+ <key>senarios</key>
+ <string>scenarios</string>
+ <key>senstive</key>
+ <string>sensitive</string>
+ <key>sensure</key>
+ <string>censure</string>
+ <key>seperate</key>
+ <string>separate</string>
+ <key>seperated</key>
+ <string>separated</string>
+ <key>seperately</key>
+ <string>separately</string>
+ <key>seperates</key>
+ <string>separates</string>
+ <key>seperating</key>
+ <string>separating</string>
+ <key>seperation</key>
+ <string>separation</string>
+ <key>seperatism</key>
+ <string>separatism</string>
+ <key>seperatist</key>
+ <string>separatist</string>
+ <key>sepina</key>
+ <string>subpoena</string>
+ <key>sergent</key>
+ <string>sergeant</string>
+ <key>settelement</key>
+ <string>settlement</string>
+ <key>settlment</key>
+ <string>settlement</string>
+ <key>severeal</key>
+ <string>several</string>
+ <key>severley</key>
+ <string>severely</string>
+ <key>severly</key>
+ <string>severely</string>
+ <key>sevice</key>
+ <string>service</string>
+ <key>shadasloo</key>
+ <string>shadaloo</string>
+ <key>shaddow</key>
+ <string>shadow</string>
+ <key>shadoloo</key>
+ <string>shadaloo</string>
+ <key>shamen</key>
+ <string>shaman</string>
+ <key>sheat</key>
+ <string>sheath</string>
+ <key>sheild</key>
+ <string>shield</string>
+ <key>sherif</key>
+ <string>sheriff</string>
+ <key>shineing</key>
+ <string>shining</string>
+ <key>shiped</key>
+ <string>shipped</string>
+ <key>shiping</key>
+ <string>shipping</string>
+ <key>shopkeeepers</key>
+ <string>shopkeepers</string>
+ <key>shorly</key>
+ <string>shortly</string>
+ <key>shortwhile</key>
+ <string>short while</string>
+ <key>shoudl</key>
+ <string>should</string>
+ <key>shoudln</key>
+ <string>shouldn&apos;t</string>
+ <key>shouldnt</key>
+ <string>shouldn&apos;t</string>
+ <key>shreak</key>
+ <string>shriek</string>
+ <key>shrinked</key>
+ <string>shrunk</string>
+ <key>sicne</key>
+ <string>since</string>
+ <key>sideral</key>
+ <string>sidereal</string>
+ <key>siezure</key>
+ <string>seizure</string>
+ <key>siezures</key>
+ <string>seizures</string>
+ <key>siginificant</key>
+ <string>significant</string>
+ <key>signficant</key>
+ <string>significant</string>
+ <key>signficiant</key>
+ <string>significant</string>
+ <key>signfies</key>
+ <string>signifies</string>
+ <key>signifantly</key>
+ <string>significantly</string>
+ <key>significently</key>
+ <string>significantly</string>
+ <key>signifigant</key>
+ <string>significant</string>
+ <key>signifigantly</key>
+ <string>significantly</string>
+ <key>signitories</key>
+ <string>signatories</string>
+ <key>signitory</key>
+ <string>signatory</string>
+ <key>similarily</key>
+ <string>similarly</string>
+ <key>similiar</key>
+ <string>similar</string>
+ <key>similiarity</key>
+ <string>similarity</string>
+ <key>similiarly</key>
+ <string>similarly</string>
+ <key>simmilar</key>
+ <string>similar</string>
+ <key>simpley</key>
+ <string>simply</string>
+ <key>simplier</key>
+ <string>simpler</string>
+ <key>simultanous</key>
+ <string>simultaneous</string>
+ <key>simultanously</key>
+ <string>simultaneously</string>
+ <key>sincerley</key>
+ <string>sincerely</string>
+ <key>singsog</key>
+ <string>singsong</string>
+ <key>sinse</key>
+ <string>since</string>
+ <key>skateing</key>
+ <string>skating</string>
+ <key>slaugterhouses</key>
+ <string>slaughterhouses</string>
+ <key>slighly</key>
+ <string>slightly</string>
+ <key>slowy</key>
+ <string>slowly</string>
+ <key>smae</key>
+ <string>same</string>
+ <key>smealting</key>
+ <string>smelting</string>
+ <key>smoe</key>
+ <string>some</string>
+ <key>sneeks</key>
+ <string>sneaks</string>
+ <key>snese</key>
+ <string>sneeze</string>
+ <key>socalism</key>
+ <string>socialism</string>
+ <key>socities</key>
+ <string>societies</string>
+ <key>soem</key>
+ <string>some</string>
+ <key>sofware</key>
+ <string>software</string>
+ <key>sohw</key>
+ <string>show</string>
+ <key>soilders</key>
+ <string>soldiers</string>
+ <key>solatary</key>
+ <string>solitary</string>
+ <key>soley</key>
+ <string>solely</string>
+ <key>soliders</key>
+ <string>soldiers</string>
+ <key>soliliquy</key>
+ <string>soliloquy</string>
+ <key>soluable</key>
+ <string>soluble</string>
+ <key>somene</key>
+ <string>someone</string>
+ <key>somtimes</key>
+ <string>sometimes</string>
+ <key>somwhere</key>
+ <string>somewhere</string>
+ <key>sophicated</key>
+ <string>sophisticated</string>
+ <key>sophmore</key>
+ <string>sophomore</string>
+ <key>sorceror</key>
+ <string>sorcerer</string>
+ <key>sorrounding</key>
+ <string>surrounding</string>
+ <key>sotry</key>
+ <string>story</string>
+ <key>sotyr</key>
+ <string>story</string>
+ <key>soudn</key>
+ <string>sound</string>
+ <key>soudns</key>
+ <string>sounds</string>
+ <key>sould</key>
+ <string>could</string>
+ <key>sountrack</key>
+ <string>soundtrack</string>
+ <key>sourth</key>
+ <string>south</string>
+ <key>sourthern</key>
+ <string>southern</string>
+ <key>souvenier</key>
+ <string>souvenir</string>
+ <key>souveniers</key>
+ <string>souvenirs</string>
+ <key>soveits</key>
+ <string>soviets</string>
+ <key>sovereignity</key>
+ <string>sovereignty</string>
+ <key>soverign</key>
+ <string>sovereign</string>
+ <key>soverignity</key>
+ <string>sovereignty</string>
+ <key>soverignty</key>
+ <string>sovereignty</string>
+ <key>spainish</key>
+ <string>Spanish</string>
+ <key>speach</key>
+ <string>speech</string>
+ <key>specfic</key>
+ <string>specific</string>
+ <key>speciallized</key>
+ <string>specialized</string>
+ <key>specifiying</key>
+ <string>specifying</string>
+ <key>speciman</key>
+ <string>specimen</string>
+ <key>spectauclar</key>
+ <string>spectacular</string>
+ <key>spectaulars</key>
+ <string>spectaculars</string>
+ <key>spectum</key>
+ <string>spectrum</string>
+ <key>speices</key>
+ <string>species</string>
+ <key>spendour</key>
+ <string>splendour</string>
+ <key>spermatozoan</key>
+ <string>spermatozoon</string>
+ <key>spoace</key>
+ <string>space</string>
+ <key>sponser</key>
+ <string>sponsor</string>
+ <key>sponsered</key>
+ <string>sponsored</string>
+ <key>spontanous</key>
+ <string>spontaneous</string>
+ <key>sponzored</key>
+ <string>sponsored</string>
+ <key>spoonfulls</key>
+ <string>spoonfuls</string>
+ <key>sppeches</key>
+ <string>speeches</string>
+ <key>spreaded</key>
+ <string>spread</string>
+ <key>sprech</key>
+ <string>speech</string>
+ <key>spred</key>
+ <string>spread</string>
+ <key>spriritual</key>
+ <string>spiritual</string>
+ <key>spritual</key>
+ <string>spiritual</string>
+ <key>sqaure</key>
+ <string>square</string>
+ <key>stablility</key>
+ <string>stability</string>
+ <key>stainlees</key>
+ <string>stainless</string>
+ <key>staion</key>
+ <string>station</string>
+ <key>standars</key>
+ <string>standards</string>
+ <key>stange</key>
+ <string>strange</string>
+ <key>startegic</key>
+ <string>strategic</string>
+ <key>startegies</key>
+ <string>strategies</string>
+ <key>startegy</key>
+ <string>strategy</string>
+ <key>stateman</key>
+ <string>statesman</string>
+ <key>statememts</key>
+ <string>statements</string>
+ <key>statment</key>
+ <string>statement</string>
+ <key>steriods</key>
+ <string>steroids</string>
+ <key>sterotypes</key>
+ <string>stereotypes</string>
+ <key>stilus</key>
+ <string>stylus</string>
+ <key>stingent</key>
+ <string>stringent</string>
+ <key>stiring</key>
+ <string>stirring</string>
+ <key>stirrs</key>
+ <string>stirs</string>
+ <key>stlye</key>
+ <string>style</string>
+ <key>stomache</key>
+ <string>stomach</string>
+ <key>stong</key>
+ <string>strong</string>
+ <key>stopry</key>
+ <string>story</string>
+ <key>storeis</key>
+ <string>stories</string>
+ <key>storise</key>
+ <string>stories</string>
+ <key>stornegst</key>
+ <string>strongest</string>
+ <key>stoyr</key>
+ <string>story</string>
+ <key>stpo</key>
+ <string>stop</string>
+ <key>stradegies</key>
+ <string>strategies</string>
+ <key>stradegy</key>
+ <string>strategy</string>
+ <key>strat</key>
+ <string>start</string>
+ <key>stratagically</key>
+ <string>strategically</string>
+ <key>streemlining</key>
+ <string>streamlining</string>
+ <key>stregth</key>
+ <string>strength</string>
+ <key>strenghen</key>
+ <string>strengthen</string>
+ <key>strenghened</key>
+ <string>strengthened</string>
+ <key>strenghening</key>
+ <string>strengthening</string>
+ <key>strenght</key>
+ <string>strength</string>
+ <key>strenghten</key>
+ <string>strengthen</string>
+ <key>strenghtened</key>
+ <string>strengthened</string>
+ <key>strenghtening</key>
+ <string>strengthening</string>
+ <key>strengtened</key>
+ <string>strengthened</string>
+ <key>strenous</key>
+ <string>strenuous</string>
+ <key>strictist</key>
+ <string>strictest</string>
+ <key>strikely</key>
+ <string>strikingly</string>
+ <key>strnad</key>
+ <string>strand</string>
+ <key>stroy</key>
+ <string>story</string>
+ <key>structual</key>
+ <string>structural</string>
+ <key>stubborness</key>
+ <string>stubbornness</string>
+ <key>stucture</key>
+ <string>structure</string>
+ <key>stuctured</key>
+ <string>structured</string>
+ <key>studdy</key>
+ <string>study</string>
+ <key>studing</key>
+ <string>studying</string>
+ <key>stuggling</key>
+ <string>struggling</string>
+ <key>sturcture</key>
+ <string>structure</string>
+ <key>subcatagories</key>
+ <string>subcategories</string>
+ <key>subcatagory</key>
+ <string>subcategory</string>
+ <key>subconsiously</key>
+ <string>subconsciously</string>
+ <key>subjudgation</key>
+ <string>subjugation</string>
+ <key>submachne</key>
+ <string>submachine</string>
+ <key>subpecies</key>
+ <string>subspecies</string>
+ <key>subsidary</key>
+ <string>subsidiary</string>
+ <key>subsiduary</key>
+ <string>subsidiary</string>
+ <key>subsquent</key>
+ <string>subsequent</string>
+ <key>subsquently</key>
+ <string>subsequently</string>
+ <key>substace</key>
+ <string>substance</string>
+ <key>substancial</key>
+ <string>substantial</string>
+ <key>substatial</key>
+ <string>substantial</string>
+ <key>substituded</key>
+ <string>substituted</string>
+ <key>substract</key>
+ <string>subtract</string>
+ <key>substracted</key>
+ <string>subtracted</string>
+ <key>substracting</key>
+ <string>subtracting</string>
+ <key>substraction</key>
+ <string>subtraction</string>
+ <key>substracts</key>
+ <string>subtracts</string>
+ <key>subtances</key>
+ <string>substances</string>
+ <key>subterranian</key>
+ <string>subterranean</string>
+ <key>suburburban</key>
+ <string>suburban</string>
+ <key>succceeded</key>
+ <string>succeeded</string>
+ <key>succcesses</key>
+ <string>successes</string>
+ <key>succedded</key>
+ <string>succeeded</string>
+ <key>succeded</key>
+ <string>succeeded</string>
+ <key>succeds</key>
+ <string>succeeds</string>
+ <key>succesful</key>
+ <string>successful</string>
+ <key>succesfully</key>
+ <string>successfully</string>
+ <key>succesfuly</key>
+ <string>successfully</string>
+ <key>succesion</key>
+ <string>succession</string>
+ <key>succesive</key>
+ <string>successive</string>
+ <key>successfull</key>
+ <string>successful</string>
+ <key>successully</key>
+ <string>successfully</string>
+ <key>succsess</key>
+ <string>success</string>
+ <key>succsessfull</key>
+ <string>successful</string>
+ <key>suceed</key>
+ <string>succeed</string>
+ <key>suceeded</key>
+ <string>succeeded</string>
+ <key>suceeding</key>
+ <string>succeeding</string>
+ <key>suceeds</key>
+ <string>succeeds</string>
+ <key>sucesful</key>
+ <string>successful</string>
+ <key>sucesfully</key>
+ <string>successfully</string>
+ <key>sucesfuly</key>
+ <string>successfully</string>
+ <key>sucesion</key>
+ <string>succession</string>
+ <key>sucess</key>
+ <string>success</string>
+ <key>sucesses</key>
+ <string>successes</string>
+ <key>sucessful</key>
+ <string>successful</string>
+ <key>sucessfull</key>
+ <string>successful</string>
+ <key>sucessfully</key>
+ <string>successfully</string>
+ <key>sucessfuly</key>
+ <string>successfully</string>
+ <key>sucession</key>
+ <string>succession</string>
+ <key>sucessive</key>
+ <string>successive</string>
+ <key>sucessor</key>
+ <string>successor</string>
+ <key>sucessot</key>
+ <string>successor</string>
+ <key>sucide</key>
+ <string>suicide</string>
+ <key>sucidial</key>
+ <string>suicidal</string>
+ <key>sufferage</key>
+ <string>suffrage</string>
+ <key>sufferred</key>
+ <string>suffered</string>
+ <key>sufferring</key>
+ <string>suffering</string>
+ <key>sufficent</key>
+ <string>sufficient</string>
+ <key>sufficently</key>
+ <string>sufficiently</string>
+ <key>sumary</key>
+ <string>summary</string>
+ <key>sunglases</key>
+ <string>sunglasses</string>
+ <key>suop</key>
+ <string>soup</string>
+ <key>superceeded</key>
+ <string>superseded</string>
+ <key>superintendant</key>
+ <string>superintendent</string>
+ <key>suphisticated</key>
+ <string>sophisticated</string>
+ <key>suplimented</key>
+ <string>supplemented</string>
+ <key>supose</key>
+ <string>suppose</string>
+ <key>suposed</key>
+ <string>supposed</string>
+ <key>suposedly</key>
+ <string>supposedly</string>
+ <key>suposes</key>
+ <string>supposes</string>
+ <key>suposing</key>
+ <string>supposing</string>
+ <key>supplamented</key>
+ <string>supplemented</string>
+ <key>suppliementing</key>
+ <string>supplementing</string>
+ <key>suppoed</key>
+ <string>supposed</string>
+ <key>supposingly</key>
+ <string>supposedly</string>
+ <key>suppy</key>
+ <string>supply</string>
+ <key>supress</key>
+ <string>suppress</string>
+ <key>supressed</key>
+ <string>suppressed</string>
+ <key>supresses</key>
+ <string>suppresses</string>
+ <key>supressing</key>
+ <string>suppressing</string>
+ <key>suprise</key>
+ <string>surprise</string>
+ <key>suprised</key>
+ <string>surprised</string>
+ <key>suprising</key>
+ <string>surprising</string>
+ <key>suprisingly</key>
+ <string>surprisingly</string>
+ <key>suprize</key>
+ <string>surprise</string>
+ <key>suprized</key>
+ <string>surprised</string>
+ <key>suprizing</key>
+ <string>surprising</string>
+ <key>suprizingly</key>
+ <string>surprisingly</string>
+ <key>surfce</key>
+ <string>surface</string>
+ <key>surley</key>
+ <string>surely</string>
+ <key>suround</key>
+ <string>surround</string>
+ <key>surounded</key>
+ <string>surrounded</string>
+ <key>surounding</key>
+ <string>surrounding</string>
+ <key>suroundings</key>
+ <string>surroundings</string>
+ <key>surounds</key>
+ <string>surrounds</string>
+ <key>surplanted</key>
+ <string>supplanted</string>
+ <key>surpress</key>
+ <string>suppress</string>
+ <key>surpressed</key>
+ <string>suppressed</string>
+ <key>surprize</key>
+ <string>surprise</string>
+ <key>surprized</key>
+ <string>surprised</string>
+ <key>surprizing</key>
+ <string>surprising</string>
+ <key>surprizingly</key>
+ <string>surprisingly</string>
+ <key>surrended</key>
+ <string>surrendered</string>
+ <key>surrepetitious</key>
+ <string>surreptitious</string>
+ <key>surrepetitiously</key>
+ <string>surreptitiously</string>
+ <key>surreptious</key>
+ <string>surreptitious</string>
+ <key>surreptiously</key>
+ <string>surreptitiously</string>
+ <key>surronded</key>
+ <string>surrounded</string>
+ <key>surrouded</key>
+ <string>surrounded</string>
+ <key>surrouding</key>
+ <string>surrounding</string>
+ <key>surrundering</key>
+ <string>surrendering</string>
+ <key>surveilence</key>
+ <string>surveillance</string>
+ <key>surveill</key>
+ <string>surveil</string>
+ <key>surveyer</key>
+ <string>surveyor</string>
+ <key>surviver</key>
+ <string>survivor</string>
+ <key>survivers</key>
+ <string>survivors</string>
+ <key>survivied</key>
+ <string>survived</string>
+ <key>suseptable</key>
+ <string>susceptible</string>
+ <key>suseptible</key>
+ <string>susceptible</string>
+ <key>suspention</key>
+ <string>suspension</string>
+ <key>swaer</key>
+ <string>swear</string>
+ <key>swaers</key>
+ <string>swears</string>
+ <key>swepth</key>
+ <string>swept</string>
+ <key>swiming</key>
+ <string>swimming</string>
+ <key>syas</key>
+ <string>says</string>
+ <key>symetrical</key>
+ <string>symmetrical</string>
+ <key>symetrically</key>
+ <string>symmetrically</string>
+ <key>symetry</key>
+ <string>symmetry</string>
+ <key>symettric</key>
+ <string>symmetric</string>
+ <key>symmetral</key>
+ <string>symmetric</string>
+ <key>symmetricaly</key>
+ <string>symmetrically</string>
+ <key>synagouge</key>
+ <string>synagogue</string>
+ <key>syncronization</key>
+ <string>synchronization</string>
+ <key>synonomous</key>
+ <string>synonymous</string>
+ <key>synonymns</key>
+ <string>synonyms</string>
+ <key>synphony</key>
+ <string>symphony</string>
+ <key>syphyllis</key>
+ <string>syphilis</string>
+ <key>sypmtoms</key>
+ <string>symptoms</string>
+ <key>syrap</key>
+ <string>syrup</string>
+ <key>sysmatically</key>
+ <string>systematically</string>
+ <key>sytem</key>
+ <string>system</string>
+ <key>sytle</key>
+ <string>style</string>
+ <key>tabacco</key>
+ <string>tobacco</string>
+ <key>tahn</key>
+ <string>than</string>
+ <key>taht</key>
+ <string>that</string>
+ <key>talekd</key>
+ <string>talked</string>
+ <key>targetted</key>
+ <string>targeted</string>
+ <key>targetting</key>
+ <string>targeting</string>
+ <key>tast</key>
+ <string>taste</string>
+ <key>tath</key>
+ <string>that</string>
+ <key>tattooes</key>
+ <string>tattoos</string>
+ <key>taxanomic</key>
+ <string>taxonomic</string>
+ <key>taxanomy</key>
+ <string>taxonomy</string>
+ <key>teached</key>
+ <string>taught</string>
+ <key>techician</key>
+ <string>technician</string>
+ <key>techicians</key>
+ <string>technicians</string>
+ <key>techiniques</key>
+ <string>techniques</string>
+ <key>technitian</key>
+ <string>technician</string>
+ <key>technnology</key>
+ <string>technology</string>
+ <key>technolgy</key>
+ <string>technology</string>
+ <key>teh</key>
+ <string>the</string>
+ <key>tehy</key>
+ <string>they</string>
+ <key>telelevision</key>
+ <string>television</string>
+ <key>televsion</key>
+ <string>television</string>
+ <key>telphony</key>
+ <string>telephony</string>
+ <key>temerature</key>
+ <string>temperature</string>
+ <key>tempalte</key>
+ <string>template</string>
+ <key>tempaltes</key>
+ <string>templates</string>
+ <key>temparate</key>
+ <string>temperate</string>
+ <key>temperarily</key>
+ <string>temporarily</string>
+ <key>temperment</key>
+ <string>temperament</string>
+ <key>tempertaure</key>
+ <string>temperature</string>
+ <key>temperture</key>
+ <string>temperature</string>
+ <key>temprary</key>
+ <string>temporary</string>
+ <key>tenacle</key>
+ <string>tentacle</string>
+ <key>tenacles</key>
+ <string>tentacles</string>
+ <key>tendacy</key>
+ <string>tendency</string>
+ <key>tendancies</key>
+ <string>tendencies</string>
+ <key>tendancy</key>
+ <string>tendency</string>
+ <key>tennisplayer</key>
+ <string>tennis player</string>
+ <key>tepmorarily</key>
+ <string>temporarily</string>
+ <key>terrestial</key>
+ <string>terrestrial</string>
+ <key>terriories</key>
+ <string>territories</string>
+ <key>terriory</key>
+ <string>territory</string>
+ <key>territorist</key>
+ <string>terrorist</string>
+ <key>territoy</key>
+ <string>territory</string>
+ <key>terroist</key>
+ <string>terrorist</string>
+ <key>testiclular</key>
+ <string>testicular</string>
+ <key>tghe</key>
+ <string>the</string>
+ <key>thast</key>
+ <string>that&apos;s</string>
+ <key>theather</key>
+ <string>theater</string>
+ <key>theese</key>
+ <string>these</string>
+ <key>theif</key>
+ <string>thief</string>
+ <key>theives</key>
+ <string>thieves</string>
+ <key>themselfs</key>
+ <string>themselves</string>
+ <key>themslves</key>
+ <string>themselves</string>
+ <key>ther</key>
+ <string>there</string>
+ <key>therafter</key>
+ <string>thereafter</string>
+ <key>therby</key>
+ <string>thereby</string>
+ <key>theri</key>
+ <string>their</string>
+ <key>theyre</key>
+ <string>they&apos;re</string>
+ <key>thgat</key>
+ <string>that</string>
+ <key>thge</key>
+ <string>the</string>
+ <key>thier</key>
+ <string>their</string>
+ <key>thign</key>
+ <string>thing</string>
+ <key>thigns</key>
+ <string>things</string>
+ <key>thigsn</key>
+ <string>things</string>
+ <key>thikn</key>
+ <string>think</string>
+ <key>thikning</key>
+ <string>thinking</string>
+ <key>thikns</key>
+ <string>thinks</string>
+ <key>thiunk</key>
+ <string>think</string>
+ <key>thn</key>
+ <string>then</string>
+ <key>thna</key>
+ <string>than</string>
+ <key>thne</key>
+ <string>then</string>
+ <key>thnig</key>
+ <string>thing</string>
+ <key>thnigs</key>
+ <string>things</string>
+ <key>thoughout</key>
+ <string>throughout</string>
+ <key>threatend</key>
+ <string>threatened</string>
+ <key>threatning</key>
+ <string>threatening</string>
+ <key>threee</key>
+ <string>three</string>
+ <key>threshhold</key>
+ <string>threshold</string>
+ <key>thrid</key>
+ <string>third</string>
+ <key>throrough</key>
+ <string>thorough</string>
+ <key>throughly</key>
+ <string>thoroughly</string>
+ <key>throught</key>
+ <string>throat</string>
+ <key>througout</key>
+ <string>throughout</string>
+ <key>thru</key>
+ <string>through</string>
+ <key>thsi</key>
+ <string>this</string>
+ <key>thsoe</key>
+ <string>those</string>
+ <key>thta</key>
+ <string>that</string>
+ <key>thyat</key>
+ <string>that</string>
+ <key>tiem</key>
+ <string>time</string>
+ <key>tihkn</key>
+ <string>think</string>
+ <key>tihs</key>
+ <string>this</string>
+ <key>timne</key>
+ <string>time</string>
+ <key>tiome</key>
+ <string>time</string>
+ <key>tje</key>
+ <string>the</string>
+ <key>tjhe</key>
+ <string>the</string>
+ <key>tjpanishad</key>
+ <string>upanishad</string>
+ <key>tkae</key>
+ <string>take</string>
+ <key>tkaes</key>
+ <string>takes</string>
+ <key>tkaing</key>
+ <string>taking</string>
+ <key>tlaking</key>
+ <string>talking</string>
+ <key>tobbaco</key>
+ <string>tobacco</string>
+ <key>todays</key>
+ <string>today&apos;s</string>
+ <key>todya</key>
+ <string>today</string>
+ <key>toghether</key>
+ <string>together</string>
+ <key>toke</key>
+ <string>took</string>
+ <key>tolerence</key>
+ <string>tolerance</string>
+ <key>tomatos</key>
+ <string>tomatoes</string>
+ <key>tommorow</key>
+ <string>tomorrow</string>
+ <key>tommorrow</key>
+ <string>tomorrow</string>
+ <key>tongiht</key>
+ <string>tonight</string>
+ <key>toriodal</key>
+ <string>toroidal</string>
+ <key>tormenters</key>
+ <string>tormentors</string>
+ <key>tornadoe</key>
+ <string>tornado</string>
+ <key>torpeados</key>
+ <string>torpedoes</string>
+ <key>torpedos</key>
+ <string>torpedoes</string>
+ <key>tothe</key>
+ <string>to the</string>
+ <key>toubles</key>
+ <string>troubles</string>
+ <key>tounge</key>
+ <string>tongue</string>
+ <key>tourch</key>
+ <string>torch</string>
+ <key>towords</key>
+ <string>towards</string>
+ <key>towrad</key>
+ <string>toward</string>
+ <key>tradionally</key>
+ <string>traditionally</string>
+ <key>traditionaly</key>
+ <string>traditionally</string>
+ <key>traditionnal</key>
+ <string>traditional</string>
+ <key>traditition</key>
+ <string>tradition</string>
+ <key>tradtionally</key>
+ <string>traditionally</string>
+ <key>trafficed</key>
+ <string>trafficked</string>
+ <key>trafficing</key>
+ <string>trafficking</string>
+ <key>trafic</key>
+ <string>traffic</string>
+ <key>trancendent</key>
+ <string>transcendent</string>
+ <key>trancending</key>
+ <string>transcending</string>
+ <key>tranform</key>
+ <string>transform</string>
+ <key>tranformed</key>
+ <string>transformed</string>
+ <key>transcendance</key>
+ <string>transcendence</string>
+ <key>transcendant</key>
+ <string>transcendent</string>
+ <key>transcendentational</key>
+ <string>transcendental</string>
+ <key>transcripting</key>
+ <string>transcribing</string>
+ <key>transending</key>
+ <string>transcending</string>
+ <key>transesxuals</key>
+ <string>transsexuals</string>
+ <key>transfered</key>
+ <string>transferred</string>
+ <key>transfering</key>
+ <string>transferring</string>
+ <key>transformaton</key>
+ <string>transformation</string>
+ <key>transistion</key>
+ <string>transition</string>
+ <key>translater</key>
+ <string>translator</string>
+ <key>translaters</key>
+ <string>translators</string>
+ <key>transmissable</key>
+ <string>transmissible</string>
+ <key>transporation</key>
+ <string>transportation</string>
+ <key>tremelo</key>
+ <string>tremolo</string>
+ <key>tremelos</key>
+ <string>tremolos</string>
+ <key>triguered</key>
+ <string>triggered</string>
+ <key>triology</key>
+ <string>trilogy</string>
+ <key>troling</key>
+ <string>trolling</string>
+ <key>troup</key>
+ <string>troupe</string>
+ <key>troups</key>
+ <string>troops</string>
+ <key>truely</key>
+ <string>truly</string>
+ <key>trustworthyness</key>
+ <string>trustworthiness</string>
+ <key>turnk</key>
+ <string>trunk</string>
+ <key>tust</key>
+ <string>trust</string>
+ <key>twelth</key>
+ <string>twelfth</string>
+ <key>twon</key>
+ <string>town</string>
+ <key>twpo</key>
+ <string>two</string>
+ <key>tyhat</key>
+ <string>that</string>
+ <key>tyhe</key>
+ <string>they</string>
+ <key>typcial</key>
+ <string>typical</string>
+ <key>typicaly</key>
+ <string>typically</string>
+ <key>tyranies</key>
+ <string>tyrannies</string>
+ <key>tyrany</key>
+ <string>tyranny</string>
+ <key>tyrranies</key>
+ <string>tyrannies</string>
+ <key>tyrrany</key>
+ <string>tyranny</string>
+ <key>ubiquitious</key>
+ <string>ubiquitous</string>
+ <key>ublisher</key>
+ <string>publisher</string>
+ <key>uise</key>
+ <string>use</string>
+ <key>ultimely</key>
+ <string>ultimately</string>
+ <key>unacompanied</key>
+ <string>unaccompanied</string>
+ <key>unahppy</key>
+ <string>unhappy</string>
+ <key>unanymous</key>
+ <string>unanimous</string>
+ <key>unathorised</key>
+ <string>unauthorised</string>
+ <key>unavailible</key>
+ <string>unavailable</string>
+ <key>unballance</key>
+ <string>unbalance</string>
+ <key>unbeknowst</key>
+ <string>unbeknownst</string>
+ <key>unbeleivable</key>
+ <string>unbelievable</string>
+ <key>uncertainity</key>
+ <string>uncertainty</string>
+ <key>unchallengable</key>
+ <string>unchallengeable</string>
+ <key>unchangable</key>
+ <string>unchangeable</string>
+ <key>uncompetive</key>
+ <string>uncompetitive</string>
+ <key>unconcious</key>
+ <string>unconscious</string>
+ <key>unconciousness</key>
+ <string>unconsciousness</string>
+ <key>unconfortability</key>
+ <string>discomfort</string>
+ <key>uncontitutional</key>
+ <string>unconstitutional</string>
+ <key>unconvential</key>
+ <string>unconventional</string>
+ <key>undecideable</key>
+ <string>undecidable</string>
+ <key>understoon</key>
+ <string>understood</string>
+ <key>undesireable</key>
+ <string>undesirable</string>
+ <key>undetecable</key>
+ <string>undetectable</string>
+ <key>undoubtely</key>
+ <string>undoubtedly</string>
+ <key>undreground</key>
+ <string>underground</string>
+ <key>uneccesary</key>
+ <string>unnecessary</string>
+ <key>unecessary</key>
+ <string>unnecessary</string>
+ <key>unequalities</key>
+ <string>inequalities</string>
+ <key>unforetunately</key>
+ <string>unfortunately</string>
+ <key>unforgetable</key>
+ <string>unforgettable</string>
+ <key>unforgiveable</key>
+ <string>unforgivable</string>
+ <key>unfortunatley</key>
+ <string>unfortunately</string>
+ <key>unfortunatly</key>
+ <string>unfortunately</string>
+ <key>unfourtunately</key>
+ <string>unfortunately</string>
+ <key>unihabited</key>
+ <string>uninhabited</string>
+ <key>unilateraly</key>
+ <string>unilaterally</string>
+ <key>unilatreal</key>
+ <string>unilateral</string>
+ <key>unilatreally</key>
+ <string>unilaterally</string>
+ <key>uninterruped</key>
+ <string>uninterrupted</string>
+ <key>uninterupted</key>
+ <string>uninterrupted</string>
+ <key>univeral</key>
+ <string>universal</string>
+ <key>univeristies</key>
+ <string>universities</string>
+ <key>univeristy</key>
+ <string>university</string>
+ <key>univerity</key>
+ <string>university</string>
+ <key>universtiy</key>
+ <string>university</string>
+ <key>univesities</key>
+ <string>universities</string>
+ <key>univesity</key>
+ <string>university</string>
+ <key>unkown</key>
+ <string>unknown</string>
+ <key>unlikey</key>
+ <string>unlikely</string>
+ <key>unmanouverable</key>
+ <string>unmaneuverable</string>
+ <key>unmistakeably</key>
+ <string>unmistakably</string>
+ <key>unneccesarily</key>
+ <string>unnecessarily</string>
+ <key>unneccesary</key>
+ <string>unnecessary</string>
+ <key>unneccessarily</key>
+ <string>unnecessarily</string>
+ <key>unneccessary</key>
+ <string>unnecessary</string>
+ <key>unnecesarily</key>
+ <string>unnecessarily</string>
+ <key>unnecesary</key>
+ <string>unnecessary</string>
+ <key>unoffical</key>
+ <string>unofficial</string>
+ <key>unoperational</key>
+ <string>nonoperational</string>
+ <key>unoticeable</key>
+ <string>unnoticeable</string>
+ <key>unplease</key>
+ <string>displease</string>
+ <key>unplesant</key>
+ <string>unpleasant</string>
+ <key>unprecendented</key>
+ <string>unprecedented</string>
+ <key>unprecidented</key>
+ <string>unprecedented</string>
+ <key>unrepentent</key>
+ <string>unrepentant</string>
+ <key>unrepetant</key>
+ <string>unrepentant</string>
+ <key>unrepetent</key>
+ <string>unrepentant</string>
+ <key>unsed</key>
+ <string>unused</string>
+ <key>unsubstanciated</key>
+ <string>unsubstantiated</string>
+ <key>unsuccesful</key>
+ <string>unsuccessful</string>
+ <key>unsuccesfully</key>
+ <string>unsuccessfully</string>
+ <key>unsuccessfull</key>
+ <string>unsuccessful</string>
+ <key>unsucesful</key>
+ <string>unsuccessful</string>
+ <key>unsucesfuly</key>
+ <string>unsuccessfully</string>
+ <key>unsucessful</key>
+ <string>unsuccessful</string>
+ <key>unsucessfull</key>
+ <string>unsuccessful</string>
+ <key>unsucessfully</key>
+ <string>unsuccessfully</string>
+ <key>unsuprised</key>
+ <string>unsurprised</string>
+ <key>unsuprising</key>
+ <string>unsurprising</string>
+ <key>unsuprisingly</key>
+ <string>unsurprisingly</string>
+ <key>unsuprized</key>
+ <string>unsurprised</string>
+ <key>unsuprizing</key>
+ <string>unsurprising</string>
+ <key>unsuprizingly</key>
+ <string>unsurprisingly</string>
+ <key>unsurprized</key>
+ <string>unsurprised</string>
+ <key>unsurprizing</key>
+ <string>unsurprising</string>
+ <key>unsurprizingly</key>
+ <string>unsurprisingly</string>
+ <key>untill</key>
+ <string>until</string>
+ <key>untranslateable</key>
+ <string>untranslatable</string>
+ <key>unuseable</key>
+ <string>unusable</string>
+ <key>unusuable</key>
+ <string>unusable</string>
+ <key>unviersity</key>
+ <string>university</string>
+ <key>unwarrented</key>
+ <string>unwarranted</string>
+ <key>unweildly</key>
+ <string>unwieldy</string>
+ <key>unwieldly</key>
+ <string>unwieldy</string>
+ <key>upcomming</key>
+ <string>upcoming</string>
+ <key>upgradded</key>
+ <string>upgraded</string>
+ <key>upto</key>
+ <string>up to</string>
+ <key>usally</key>
+ <string>usually</string>
+ <key>useage</key>
+ <string>usage</string>
+ <key>usefull</key>
+ <string>useful</string>
+ <key>usefuly</key>
+ <string>usefully</string>
+ <key>useing</key>
+ <string>using</string>
+ <key>usualy</key>
+ <string>usually</string>
+ <key>ususally</key>
+ <string>usually</string>
+ <key>vaccum</key>
+ <string>vacuum</string>
+ <key>vaccume</key>
+ <string>vacuum</string>
+ <key>vacinity</key>
+ <string>vicinity</string>
+ <key>vaguaries</key>
+ <string>vagaries</string>
+ <key>vaieties</key>
+ <string>varieties</string>
+ <key>vailidty</key>
+ <string>validity</string>
+ <key>valetta</key>
+ <string>valletta</string>
+ <key>valuble</key>
+ <string>valuable</string>
+ <key>valueable</key>
+ <string>valuable</string>
+ <key>varations</key>
+ <string>variations</string>
+ <key>varient</key>
+ <string>variant</string>
+ <key>variey</key>
+ <string>variety</string>
+ <key>varing</key>
+ <string>varying</string>
+ <key>varities</key>
+ <string>varieties</string>
+ <key>varity</key>
+ <string>variety</string>
+ <key>vasall</key>
+ <string>vassal</string>
+ <key>vasalls</key>
+ <string>vassals</string>
+ <key>vegatarian</key>
+ <string>vegetarian</string>
+ <key>vegitable</key>
+ <string>vegetable</string>
+ <key>vegitables</key>
+ <string>vegetables</string>
+ <key>vegtable</key>
+ <string>vegetable</string>
+ <key>vehicule</key>
+ <string>vehicle</string>
+ <key>vell</key>
+ <string>well</string>
+ <key>venemous</key>
+ <string>venomous</string>
+ <key>vengance</key>
+ <string>vengeance</string>
+ <key>vengence</key>
+ <string>vengeance</string>
+ <key>verfication</key>
+ <string>verification</string>
+ <key>verison</key>
+ <string>version</string>
+ <key>verisons</key>
+ <string>versions</string>
+ <key>vermillion</key>
+ <string>vermilion</string>
+ <key>versitilaty</key>
+ <string>versatility</string>
+ <key>versitlity</key>
+ <string>versatility</string>
+ <key>vetween</key>
+ <string>between</string>
+ <key>veyr</key>
+ <string>very</string>
+ <key>vigeur</key>
+ <string>vigor</string>
+ <key>vigilence</key>
+ <string>vigilance</string>
+ <key>vigourous</key>
+ <string>vigorous</string>
+ <key>villian</key>
+ <string>villain</string>
+ <key>villification</key>
+ <string>vilification</string>
+ <key>villify</key>
+ <string>vilify</string>
+ <key>villin</key>
+ <string>villain</string>
+ <key>vincinity</key>
+ <string>vicinity</string>
+ <key>violentce</key>
+ <string>violence</string>
+ <key>virtualy</key>
+ <string>virtually</string>
+ <key>virutal</key>
+ <string>virtual</string>
+ <key>virutally</key>
+ <string>virtually</string>
+ <key>visable</key>
+ <string>visible</string>
+ <key>visably</key>
+ <string>visibly</string>
+ <key>visting</key>
+ <string>visiting</string>
+ <key>vistors</key>
+ <string>visitors</string>
+ <key>vitories</key>
+ <string>victories</string>
+ <key>volcanoe</key>
+ <string>volcano</string>
+ <key>voleyball</key>
+ <string>volleyball</string>
+ <key>volontary</key>
+ <string>voluntary</string>
+ <key>volonteer</key>
+ <string>volunteer</string>
+ <key>volonteered</key>
+ <string>volunteered</string>
+ <key>volonteering</key>
+ <string>volunteering</string>
+ <key>volonteers</key>
+ <string>volunteers</string>
+ <key>volounteer</key>
+ <string>volunteer</string>
+ <key>volounteered</key>
+ <string>volunteered</string>
+ <key>volounteering</key>
+ <string>volunteering</string>
+ <key>volounteers</key>
+ <string>volunteers</string>
+ <key>volumne</key>
+ <string>volume</string>
+ <key>vreity</key>
+ <string>variety</string>
+ <key>vrey</key>
+ <string>very</string>
+ <key>vriety</key>
+ <string>variety</string>
+ <key>vulnerablility</key>
+ <string>vulnerability</string>
+ <key>vyer</key>
+ <string>very</string>
+ <key>vyre</key>
+ <string>very</string>
+ <key>waht</key>
+ <string>what</string>
+ <key>wanna</key>
+ <string>want to</string>
+ <key>warantee</key>
+ <string>warranty</string>
+ <key>wardobe</key>
+ <string>wardrobe</string>
+ <key>warrent</key>
+ <string>warrant</string>
+ <key>warrriors</key>
+ <string>warriors</string>
+ <key>wasnt</key>
+ <string>wasn&apos;t</string>
+ <key>wass</key>
+ <string>was</string>
+ <key>watn</key>
+ <string>want</string>
+ <key>wayword</key>
+ <string>wayward</string>
+ <key>weaponary</key>
+ <string>weaponry</string>
+ <key>weas</key>
+ <string>was</string>
+ <key>wehn</key>
+ <string>when</string>
+ <key>weild</key>
+ <string>wield</string>
+ <key>weilded</key>
+ <string>wielded</string>
+ <key>wendsay</key>
+ <string>Wednesday</string>
+ <key>wensday</key>
+ <string>Wednesday</string>
+ <key>wereabouts</key>
+ <string>whereabouts</string>
+ <key>whant</key>
+ <string>want</string>
+ <key>whants</key>
+ <string>wants</string>
+ <key>whcih</key>
+ <string>which</string>
+ <key>wheras</key>
+ <string>whereas</string>
+ <key>wherease</key>
+ <string>whereas</string>
+ <key>whereever</key>
+ <string>wherever</string>
+ <key>whic</key>
+ <string>which</string>
+ <key>whihc</key>
+ <string>which</string>
+ <key>whith</key>
+ <string>with</string>
+ <key>whlch</key>
+ <string>which</string>
+ <key>whn</key>
+ <string>when</string>
+ <key>wholey</key>
+ <string>wholly</string>
+ <key>wholy</key>
+ <string>holy</string>
+ <key>whta</key>
+ <string>what</string>
+ <key>whther</key>
+ <string>whether</string>
+ <key>wich</key>
+ <string>which</string>
+ <key>widesread</key>
+ <string>widespread</string>
+ <key>wief</key>
+ <string>wife</string>
+ <key>wierd</key>
+ <string>weird</string>
+ <key>wiew</key>
+ <string>view</string>
+ <key>wih</key>
+ <string>with</string>
+ <key>wiht</key>
+ <string>with</string>
+ <key>wille</key>
+ <string>will</string>
+ <key>willingless</key>
+ <string>willingness</string>
+ <key>wirting</key>
+ <string>writing</string>
+ <key>withdrawl</key>
+ <string>withdrawal</string>
+ <key>witheld</key>
+ <string>withheld</string>
+ <key>withh</key>
+ <string>with</string>
+ <key>withing</key>
+ <string>within</string>
+ <key>withold</key>
+ <string>withhold</string>
+ <key>witht</key>
+ <string>with</string>
+ <key>witn</key>
+ <string>with</string>
+ <key>wiull</key>
+ <string>will</string>
+ <key>wnat</key>
+ <string>want</string>
+ <key>wnated</key>
+ <string>wanted</string>
+ <key>wnats</key>
+ <string>wants</string>
+ <key>wohle</key>
+ <string>whole</string>
+ <key>wokr</key>
+ <string>work</string>
+ <key>wokring</key>
+ <string>working</string>
+ <key>wonderfull</key>
+ <string>wonderful</string>
+ <key>wont</key>
+ <string>won&apos;t</string>
+ <key>wordlwide</key>
+ <string>worldwide</string>
+ <key>workststion</key>
+ <string>workstation</string>
+ <key>worls</key>
+ <string>world</string>
+ <key>worstened</key>
+ <string>worsened</string>
+ <key>woudl</key>
+ <string>would</string>
+ <key>wresters</key>
+ <string>wrestlers</string>
+ <key>wriet</key>
+ <string>write</string>
+ <key>writen</key>
+ <string>written</string>
+ <key>wroet</key>
+ <string>wrote</string>
+ <key>wrok</key>
+ <string>work</string>
+ <key>wroking</key>
+ <string>working</string>
+ <key>wtih</key>
+ <string>with</string>
+ <key>wupport</key>
+ <string>support</string>
+ <key>xenophoby</key>
+ <string>xenophobia</string>
+ <key>yaching</key>
+ <string>yachting</string>
+ <key>yaer</key>
+ <string>year</string>
+ <key>yaerly</key>
+ <string>yearly</string>
+ <key>yaers</key>
+ <string>years</string>
+ <key>yatch</key>
+ <string>yacht</string>
+ <key>yearm</key>
+ <string>year</string>
+ <key>yeasr</key>
+ <string>years</string>
+ <key>yeild</key>
+ <string>yield</string>
+ <key>yeilding</key>
+ <string>yielding</string>
+ <key>yera</key>
+ <string>year</string>
+ <key>yeras</key>
+ <string>years</string>
+ <key>yersa</key>
+ <string>years</string>
+ <key>yotube</key>
+ <string>YouTube</string>
+ <key>youre</key>
+ <string>you&apos;re</string>
+ <key>youseff</key>
+ <string>yousef</string>
+ <key>youself</key>
+ <string>yourself</string>
+ <key>ytou</key>
+ <string>you</string>
+ <key>yuo</key>
+ <string>you</string>
+ <key>zeebra</key>
+ <string>zebra</string>
+ </map>
+ </map>
+ </array>
+</llsd>
diff --git a/indra/newview/app_settings/cmd_line.xml b/indra/newview/app_settings/cmd_line.xml
index be79f91919..7ab7787d77 100644
--- a/indra/newview/app_settings/cmd_line.xml
+++ b/indra/newview/app_settings/cmd_line.xml
@@ -101,7 +101,7 @@
<key>grid</key>
<map>
<key>desc</key>
- <string>Specify the name of the grid, local, or an IP address to connect to.</string>
+ <string>Specify the name of the grid to connect to.</string>
<key>count</key>
<integer>1</integer>
<key>map-to</key>
@@ -117,16 +117,6 @@
<string>h</string>
</map>
- <key>helperuri</key>
- <map>
- <key>desc</key>
- <string>helper web CGI prefix to use</string>
- <key>count</key>
- <integer>1</integer>
- <key>map-to</key>
- <string>CmdLineHelperURI</string>
- </map>
-
<key>ignorepixeldepth</key>
<map>
<key>desc</key>
@@ -163,7 +153,7 @@
<key>map-to</key>
<string>UserLogFile</string>
</map>
-
+
<key>login</key>
<map>
<key>desc</key>
@@ -174,28 +164,6 @@
<string>UserLoginInfo</string>
</map>
- <key>loginpage</key>
- <map>
- <key>desc</key>
- <string>Login authentication page to use.</string>
- <key>count</key>
- <integer>1</integer>
- <key>map-to</key>
- <string>LoginPage</string>
- </map>
-
- <key>loginuri</key>
- <map>
- <key>desc</key>
- <string>login server and CGI script to use</string>
- <key>count</key>
- <integer>1</integer>
- <key>compose</key>
- <boolean>true</boolean>
- <key>map-to</key>
- <string>CmdLineLoginURI</string>
- </map>
-
<key>logmetrics</key>
<map>
<key>desc</key>
@@ -226,7 +194,7 @@
<map>
<key>map-to</key>
<string>NoAudio</string>
- </map>
+ </map>
<key>noinvlib</key>
<map>
@@ -242,7 +210,7 @@
<string>User will not get any notifications. NOTE: All notifications that occur will get added to ignore file for future runs.</string>
<key>map-to</key>
<string>IgnoreAllNotifications</string>
- </map>
+ </map>
<key>nopreload</key>
<map>
@@ -321,7 +289,7 @@
<key>map-to</key>
<string>QuitAfterSeconds</string>
</map>
-
+
<key>replaysession</key>
<map>
<key>desc</key>
@@ -335,7 +303,7 @@
<key>map-to</key>
<string>RotateRight</string>
</map>
-
+
<key>safe</key>
<map>
<key>desc</key>
@@ -389,7 +357,7 @@
<key>count</key>
<integer>1</integer>
<key>map-to</key>
- <string>SkinFolder</string>
+ <string>SkinCurrent</string>
</map>
<key>slurl</key>
diff --git a/indra/newview/app_settings/keywords.ini b/indra/newview/app_settings/keywords.ini
index 318b69438a..6120f22ba4 100644
--- a/indra/newview/app_settings/keywords.ini
+++ b/indra/newview/app_settings/keywords.ini
@@ -559,6 +559,98 @@ STATUS_NOT_SUPPORTED Feature not supported
STATUS_INTERNAL_ERROR An internal error occurred
STATUS_WHITELIST_FAILED URL failed to pass whitelist
+PROFILE_NONE Disables profiling
+PROFILE_SCRIPT_MEMORY Enables memory profiling
+
+RC_DATA_FLAGS TODO: add documentation
+RC_DETECT_PHANTOM TODO: add documentation
+RC_GET_LINK_NUM TODO: add documentation
+RC_GET_NORMAL TODO: add documentation
+RC_GET_ROOT_KEY TODO: add documentation
+RC_MAX_HITS TODO: add documentation
+RC_REJECT_TYPES Optional parameter set in llCastRay() to reject hit against certain object types.
+RC_REJECT_AGENTS Bit mask for RC_REJECT_TYPES, rejects hits against avatars.
+RC_REJECT_PHYSICAL Bit mask for RC_REJECT_TYPES, rejects hits against moving objects.
+RC_REJECT_NONPHYSICAL Bit mask for RC_REJECT_TYPES, rejects hits against non-moving objects.
+RC_REJECT_LAND Bit mask for RC_REJECT_TYPES, rejects hits against the terrian.
+
+RCERR_CAST_TIME_EXCEEDED TODO: add documentation
+RCERR_SIM_PERF_LOW TODO: add documentation
+RCERR_UNKNOWN TODO: add documentation
+
+ESTATE_ACCESS_ALLOWED_AGENT_ADD TODO: add documentation
+ESTATE_ACCESS_ALLOWED_AGENT_REMOVE TODO: add documentation
+ESTATE_ACCESS_ALLOWED_GROUP_ADD TODO: add documentation
+ESTATE_ACCESS_ALLOWED_GROUP_REMOVE TODO: add documentation
+ESTATE_ACCESS_BANNED_AGENT_ADD TODO: add documentation
+ESTATE_ACCESS_BANNED_AGENT_REMOVE TODO: add documentation
+
+DENSITY TODO: add documentation
+FRICTION TODO: add documentation
+RESTITUTION TODO: add documentation
+GRAVITY_MULTIPLIER TODO: add documentation
+
+KFM_COMMAND TODO: add documentation
+KFM_CMD_PLAY TODO: add documentation
+KFM_CMD_STOP TODO: add documentation
+KFM_CMD_PAUSE TODO: add documentation
+KFM_CMD_SET_MODE TODO: add documentation
+KFM_MODE TODO: add documentation
+KFM_FORWARD TODO: add documentation
+KFM_LOOP TODO: add documentation
+KFM_PING_PONG TODO: add documentation
+KFM_REVERSE TODO: add documentation
+KFM_DATA TODO: add documentation
+KFM_ROTATION TODO: add documentation
+KFM_TRANSLATION TODO: add documentation
+
+CHARACTER_CMD_STOP TODO: add documentation
+CHARACTER_CMD_JUMP TODO: add documentation
+
+CHARACTER_DESIRED_SPEED TODO: add documentation
+CHARACTER_RADIUS TODO: add documentation
+CHARACTER_LENGTH TODO: add documentation
+CHARACTER_ORIENTATION TODO: add documentation
+CHARACTER_AVOIDANCE_MODE TODO: add documentation
+PURSUIT_OFFSET TODO: add documentation
+REQUIRE_LINE_OF_SIGHT TODO: add documentation
+PURSUIT_FUZZ_FACTOR TODO: add documentation
+PURSUIT_INTERCEPT TODO: add documentation
+FORCE_DIRECT_PATH TODO: add documentation
+VERTICAL TODO: add documentation
+HORIZONTAL TODO: add documentation
+AVOID_CHARACTERS TODO: add documentation
+AVOID_DYNAMIC_OBSTACLES TODO: add documentation
+
+PU_EVADE_HIDDEN Triggered when an llEvade character thinks it has hidden from its pursuer.
+PU_EVADE_SPOTTED Triggered when an llEvade character switches from hiding to running
+PU_FAILURE_INVALID_GOAL Goal is not on the navigation-mesh and cannot be reached.
+PU_FAILURE_INVALID_START Character cannot navigate from the current location - e.g., the character is off the navmesh or too high above it.
+PU_FAILURE_NO_VALID_DESTINATION There's no good place for the character to go - e.g., it is patrolling and all the patrol points are now unreachable.
+PU_FAILURE_OTHER Unknown failure
+PU_FAILURE_TARGET_GONE Target (for llPursue or llEvade) can no longer be tracked - e.g., it left the region or is an avatar that is now more than about 30m outside the region.
+PU_FAILURE_UNREACHABLE Goal is no longer reachable for some reason - e.g., an obstacle blocks the path.
+PU_GOAL_REACHED Character has reached the goal and will stop or choose a new goal (if wandering).
+PU_SLOWDOWN_DISTANCE_REACHED Character is near current goal.
+
+CHARACTER_TYPE TODO: add documentation
+CHARACTER_TYPE_A TODO: add documentation
+CHARACTER_TYPE_B TODO: add documentation
+CHARACTER_TYPE_C TODO: add documentation
+CHARACTER_TYPE_D TODO: add documentation
+CHARACTER_TYPE_NONE TODO: add documentation
+
+TRAVERSAL_TYPE TODO: add documentation
+TRAVERSAL_TYPE_SLOW TODO: add documentation
+TRAVERSAL_TYPE_FAST TODO: add documentation
+TRAVERSAL_TYPE_NONE TODO: add documentation
+
+CHARACTER_MAX_ACCEL TODO: add documentation
+CHARACTER_MAX_DECEL TODO: add documentation
+CHARACTER_MAX_ANGULAR_SPEED TODO: add documentation
+CHARACTER_MAX_ANGULAR_ACCEL TODO: add documentation
+CHARACTER_TURN_SPEED_MULTIPLIER TODO: add documentation
+
# string constants
[word .1, .3, .5]
NULL_KEY Indicates an empty key
diff --git a/indra/newview/app_settings/logcontrol.xml b/indra/newview/app_settings/logcontrol.xml
index 64122bbb6c..64122bbb6c 100644..100755
--- a/indra/newview/app_settings/logcontrol.xml
+++ b/indra/newview/app_settings/logcontrol.xml
diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml
index c9b4de0140..5e42fc29f7 100644..100755
--- a/indra/newview/app_settings/settings.xml
+++ b/indra/newview/app_settings/settings.xml
@@ -148,7 +148,7 @@
<key>Value</key>
<integer>1</integer>
</map>
- <key>ApplyTextureImmediately</key>
+ <key>TextureLivePreview</key>
<map>
<key>Comment</key>
<string>Preview selections in texture picker immediately</string>
@@ -335,6 +335,17 @@
<key>Value</key>
<integer>1</integer>
</map>
+ <key>AutoReplace</key>
+ <map>
+ <key>Comment</key>
+ <string>Replaces keywords with a configured word or phrase</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
<key>AutoAcceptNewInventory</key>
<map>
<key>Comment</key>
@@ -3259,6 +3270,17 @@
<key>Value</key>
<integer>0</integer>
</map>
+ <key>FastCacheFetchEnabled</key>
+ <map>
+ <key>Comment</key>
+ <string>Enable texture fast cache fetching if set</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <string>1</string>
+ </map>
<key>FeatureManagerHTTPTable</key>
<map>
<key>Comment</key>
@@ -4293,6 +4315,17 @@
<key>Value</key>
<integer>0</integer>
</map>
+ <key>InventoryInboxToggleState</key>
+ <map>
+ <key>Comment</key>
+ <string>Stores the open/closed state of inventory Received items panel</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
<key>InventoryLinking</key>
<map>
<key>Comment</key>
@@ -5001,7 +5034,7 @@
<key>LoginLocation</key>
<map>
<key>Comment</key>
- <string>Login location ('last', 'home')</string>
+ <string>Default Login location ('last', 'home') preference</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
@@ -6101,7 +6134,7 @@
<key>NextLoginLocation</key>
<map>
<key>Comment</key>
- <string>Location to log into by default.</string>
+ <string>Location to log into for this session - set from command line or the login panel, cleared following a successfull login.</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
@@ -6356,17 +6389,6 @@
<key>Value</key>
<integer>0</integer>
</map>
- <key>NumpadControl</key>
- <map>
- <key>Comment</key>
- <string>How numpad keys control your avatar. 0 = Like the normal arrow keys, 1 = Numpad moves avatar when numlock is off, 2 = Numpad moves avatar regardless of numlock (use this if you have no numlock)</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>S32</string>
- <key>Value</key>
- <integer>0</integer>
- </map>
<key>ObjectCacheEnabled</key>
<map>
<key>Comment</key>
@@ -7274,7 +7296,7 @@
<key>WebContentWindowLimit</key>
<map>
<key>Comment</key>
- <string>Maximum number of web brower windows that can be open at once in the Web content floater (0 for no limit)</string>
+ <string>Maximum number of web browser windows that can be open at once in the Web content floater (0 for no limit)</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
@@ -8079,7 +8101,7 @@
<key>Type</key>
<string>F32</string>
<key>Value</key>
- <real>0</real>
+ <real>-0.007</real>
</map>
<key>RenderShadowOffsetError</key>
<map>
@@ -8093,6 +8115,18 @@
<real>0</real>
</map>
+ <key>RenderDepthPrePass</key>
+ <map>
+ <key>Comment</key>
+ <string>EXPERIMENTAL: Prime the depth buffer with simple prim geometry before rendering with textures.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+
<key>RenderDepthOfField</key>
<map>
<key>Comment</key>
@@ -9172,7 +9206,7 @@
<key>RenderUseVAO</key>
<map>
<key>Comment</key>
- <string>Use GL Vertex Array Objects</string>
+ <string>[EXPERIMENTAL] Use GL Vertex Array Objects</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
@@ -9180,7 +9214,19 @@
<key>Value</key>
<integer>0</integer>
</map>
- <key>RenderVBOMappingDisable</key>
+ <key>RenderUseTransformFeedback</key>
+ <map>
+ <key>Comment</key>
+ <string>[EXPERIMENTAL] Use transform feedback shaders for LoD updates</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+
+ <key>RenderVBOMappingDisable</key>
<map>
<key>Comment</key>
<string>Disable VBO glMapBufferARB</string>
@@ -10754,6 +10800,83 @@
<key>Value</key>
<integer>0</integer>
</map>
+ <key>TextureFetchSource</key>
+ <map>
+ <key>Comment</key>
+ <string>Debug use: Source to fetch textures</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>S32</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>TextureFetchUpdateHighPriority</key>
+ <map>
+ <key>Comment</key>
+ <string>Number of high priority textures to update per frame</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>S32</string>
+ <key>Value</key>
+ <integer>32</integer>
+ </map>
+ <key>TextureFetchUpdateMaxMediumPriority</key>
+ <map>
+ <key>Comment</key>
+ <string>Maximum number of medium priority textures to update per frame</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>S32</string>
+ <key>Value</key>
+ <integer>256</integer>
+ </map>
+ <key>TextureFetchUpdateMinMediumPriority</key>
+ <map>
+ <key>Comment</key>
+ <string>Minimum number of medium priority textures to update per frame</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>S32</string>
+ <key>Value</key>
+ <integer>32</integer>
+ </map>
+ <key>TextureFetchUpdatePriorityThreshold</key>
+ <map>
+ <key>Comment</key>
+ <string>Threshold under which textures will be considered too low priority and skipped for update</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <integer>0.0</integer>
+ </map>
+ <key>TextureFetchUpdateSkipLowPriority</key>
+ <map>
+ <key>Comment</key>
+ <string>Flag indicating if we want to skip textures with too low of a priority</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>TextureFetchUpdatePriorities</key>
+ <map>
+ <key>Comment</key>
+ <string>Number of priority texture to update per frame</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>S32</string>
+ <key>Value</key>
+ <integer>32</integer>
+ </map>
<key>TextureLoadFullRes</key>
<map>
<key>Comment</key>
@@ -10863,7 +10986,8 @@
<string>F32</string>
<key>Value</key>
<real>0.1</real>
- </map> <key>ToolTipFadeTime</key>
+ </map>
+ <key>ToolTipFadeTime</key>
<map>
<key>Comment</key>
<string>Seconds over which tooltip fades away</string>
@@ -12227,6 +12351,17 @@
<key>Value</key>
<integer>1</integer>
</map>
+ <key>RenderSynchronousOcclusion</key>
+ <map>
+ <key>Comment</key>
+ <string>Don't let occlusion queries get more than one frame behind (block until they complete).</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
<key>RenderDelayVBUpdate</key>
<map>
<key>Comment</key>
@@ -12260,6 +12395,28 @@
<key>Value</key>
<real>10.0</real>
</map>
+ <key>SpellCheck</key>
+ <map>
+ <key>Comment</key>
+ <string>Enable spellchecking on line and text editors</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>SpellCheckDictionary</key>
+ <map>
+ <key>Comment</key>
+ <string>Current primary and secondary dictionaries used for spell checking</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>English (United States),Second Life Glossary</string>
+ </map>
<key>UseNewWalkRun</key>
<map>
<key>Comment</key>
@@ -13595,5 +13752,312 @@
<key>Value</key>
<integer>0</integer>
</map>
+ <key>PathfindingRetrieveNeighboringRegion</key>
+ <map>
+ <key>Comment</key>
+ <string>Download a neighboring region when visualizing a pathfinding navmesh (default val 99 means do not download neighbors).</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>U32</string>
+ <key>Value</key>
+ <integer>99</integer>
+ </map>
+ <key>PathfindingNavMeshClear</key>
+ <map>
+ <key>Comment</key>
+ <string>Background color when displaying pathfinding navmesh.</string>
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>Color4</string>
+ <key>Value</key>
+ <array>
+ <real>0</real>
+ <real>0</real>
+ <real>0</real>
+ <real>1.0</real>
+ </array>
+ </map>
+ <key>PathfindingWalkable</key>
+ <map>
+ <key>Comment</key>
+ <string>Color of walkable objects when displaying pathfinding navmesh object types.</string>
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>Color4</string>
+ <key>Value</key>
+ <array>
+ <real>0.45490196078431372549019607843137</real>
+ <real>0.93333333333333333333333333333333</real>
+ <real>0.38823529411764705882352941176471</real>
+ <real>1.0</real>
+ </array>
+ </map>
+ <key>PathfindingObstacle</key>
+ <map>
+ <key>Comment</key>
+ <string>Color of static obstacle objects when displaying pathfinding navmesh object types.</string>
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>Color4</string>
+ <key>Value</key>
+ <array>
+ <real>1.0</real>
+ <real>0.0</real>
+ <real>0.0</real>
+ <real>1.0</real>
+ </array>
+ </map>
+ <key>PathfindingMaterial</key>
+ <map>
+ <key>Comment</key>
+ <string>Color of material volumes when displaying pathfinding navmesh object types.</string>
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>Color4</string>
+ <key>Value</key>
+ <array>
+ <real>0.5</real>
+ <real>0.0</real>
+ <real>1.0</real>
+ <real>0.3</real>
+ </array>
+ </map>
+ <key>PathfindingExclusion</key>
+ <map>
+ <key>Comment</key>
+ <string>Color of exclusion volumes when displaying pathfinding navmesh object types.</string>
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>Color4</string>
+ <key>Value</key>
+ <array>
+ <real>1.0</real>
+ <real>1.0</real>
+ <real>0.0</real>
+ <real>0.3</real>
+ </array>
+ </map>
+ <key>PathfindingConnectedEdge</key>
+ <map>
+ <key>Comment</key>
+ <string>Color of a connected (crossable) edge when displaying pathfinding navmesh.</string>
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>Color4</string>
+ <key>Value</key>
+ <array>
+ <real>0.86</real>
+ <real>0.86</real>
+ <real>0.86</real>
+ <real>1.0</real>
+ </array>
+ </map>
+ <key>PathfindingBoundaryEdge</key>
+ <map>
+ <key>Comment</key>
+ <string>Color of a boundary (non-crossable) edge when displaying pathfinding navmesh.</string>
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>Color4</string>
+ <key>Value</key>
+ <array>
+ <real>1.0</real>
+ <real>0.0</real>
+ <real>0.0</real>
+ <real>1.0</real>
+ </array>
+ </map>
+ <key>PathfindingHeatColorBase</key>
+ <map>
+ <key>Comment</key>
+ <string>Color of the least walkable value when displaying the pathfinding navmesh as a heatmap.</string>
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>Color4</string>
+ <key>Value</key>
+ <array>
+ <real>1.0</real>
+ <real>0.0</real>
+ <real>0.0</real>
+ <real>1.0</real>
+ </array>
+ </map>
+ <key>PathfindingHeatColorMax</key>
+ <map>
+ <key>Comment</key>
+ <string>Color of the most walkable value when displaying the pathfinding navmesh as a heatmap.</string>
+ <key>Persist</key>
+ <integer>0</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>PathfindingFaceColor</key>
+ <map>
+ <key>Comment</key>
+ <string>Color of the faces when displaying the default view of the pathfinding navmesh.</string>
+ <key>Persist</key>
+ <integer>0</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>PathfindingTestPathValidEndColor</key>
+ <map>
+ <key>Comment</key>
+ <string>Color of the pathfinding test-pathing tool end-point when the path is valid.</string>
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>Color4</string>
+ <key>Value</key>
+ <array>
+ <real>0.78</real>
+ <real>0.47</real>
+ <real>0.0</real>
+ <real>1.0</real>
+ </array>
+ </map>
+ <key>PathfindingTestPathInvalidEndColor</key>
+ <map>
+ <key>Comment</key>
+ <string>Color of the pathfinding test-pathing tool end-point when the path is invalid.</string>
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>Color4</string>
+ <key>Value</key>
+ <array>
+ <real>1.0</real>
+ <real>0.0</real>
+ <real>1.0</real>
+ <real>1.0</real>
+ </array>
+ </map>
+ <key>PathfindingTestPathColor</key>
+ <map>
+ <key>Comment</key>
+ <string>Color of the pathfinding test-path when the path is valid.</string>
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>Color4</string>
+ <key>Value</key>
+ <array>
+ <real>1.0</real>
+ <real>0.59</real>
+ <real>0.0</real>
+ <real>0.9</real>
+ </array>
+ </map>
+ <key>PathfindingAmbiance</key>
+ <map>
+ <key>Comment</key>
+ <string>Ambiance of lit pathfinding navmesh displays.</string>
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>0.5</real>
+ </map>
+
+ <key>PathfindingXRayTint</key>
+ <map>
+ <key>Comment</key>
+ <string>Amount to darken/lighten x-ray lines in pathfinding display.</string>
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>0.8</real>
+ </map>
+
+ <key>PathfindingXRayOpacity</key>
+ <map>
+ <key>Comment</key>
+ <string>Opacity of xray lines in pathfinding display.</string>
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>0.25</real>
+ </map>
+
+ <key>PathfindingXRayWireframe</key>
+ <map>
+ <key>Comment</key>
+ <string>Render pathfinding navmesh xray as a wireframe.</string>
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+
+ <key>PathfindingLineWidth</key>
+ <map>
+ <key>Comment</key>
+ <string>Width of volume outlines in pathfinding navmesh display.</string>
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>2.0</real>
+ </map>
+
+ <key>PathfindingLineOffset</key>
+ <map>
+ <key>Comment</key>
+ <string>Depth offset of volume outlines in pathfinding display.</string>
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>2.3</real>
+ </map>
+
+ <key>PathfindingWaterColor</key>
+ <map>
+ <key>Comment</key>
+ <string>Color of water plane when displaying pathfinding navmesh.</string>
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>Color4</string>
+ <key>Value</key>
+ <array>
+ <real>0.0</real>
+ <real>0.0</real>
+ <real>1.0</real>
+ <real>1.0</real>
+ </array>
+ </map>
</map>
</llsd>
diff --git a/indra/newview/app_settings/shaders/class1/deferred/alphaNonIndexedNoColorF.glsl b/indra/newview/app_settings/shaders/class1/deferred/alphaNonIndexedNoColorF.glsl
index cb87b754b4..1113a9845b 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/alphaNonIndexedNoColorF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/alphaNonIndexedNoColorF.glsl
@@ -31,6 +31,8 @@ out vec4 frag_color;
#define frag_color gl_FragColor
#endif
+uniform float minimum_alpha;
+
uniform sampler2DRect depthMap;
uniform sampler2D diffuseMap;
@@ -70,9 +72,15 @@ void main()
vec4 diff= texture2D(diffuseMap,vary_texcoord0.xy);
+ if (diff.a < minimum_alpha)
+ {
+ discard;
+ }
+
vec4 col = vec4(vary_ambient + vary_directional.rgb, 1.0);
vec4 color = diff * col;
+
color.rgb = atmosLighting(color.rgb);
color.rgb = scaleSoftClip(color.rgb);
diff --git a/indra/newview/app_settings/shaders/class1/deferred/avatarF.glsl b/indra/newview/app_settings/shaders/class1/deferred/avatarF.glsl
index 46d2aa4877..bfd9b9b3eb 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/avatarF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/avatarF.glsl
@@ -46,6 +46,6 @@ void main()
frag_data[0] = vec4(diff.rgb, 0.0);
frag_data[1] = vec4(0,0,0,0);
vec3 nvn = normalize(vary_normal);
- frag_data[2] = vec4(nvn.xy * 0.5 + 0.5, nvn.z, 0.0);
+ frag_data[2] = vec4(nvn.xyz * 0.5 + 0.5, 0.0);
}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/bumpF.glsl b/indra/newview/app_settings/shaders/class1/deferred/bumpF.glsl
index 680eadb852..23c4ea2fff 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/bumpF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/bumpF.glsl
@@ -52,5 +52,5 @@ void main()
frag_data[1] = vertex_color.aaaa; // spec
//frag_data[1] = vec4(vec3(vertex_color.a), vertex_color.a+(1.0-vertex_color.a)*vertex_color.a); // spec - from former class3 - maybe better, but not so well tested
vec3 nvn = normalize(tnorm);
- frag_data[2] = vec4(nvn.xy * 0.5 + 0.5, nvn.z, 0.0);
+ frag_data[2] = vec4(nvn.xyz * 0.5 + 0.5, 0.0);
}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/diffuseAlphaMaskF.glsl b/indra/newview/app_settings/shaders/class1/deferred/diffuseAlphaMaskF.glsl
index b2027d3a5d..c1fa9e4aac 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/diffuseAlphaMaskF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/diffuseAlphaMaskF.glsl
@@ -49,6 +49,6 @@ void main()
frag_data[0] = vec4(col.rgb, 0.0);
frag_data[1] = vec4(0,0,0,0); // spec
vec3 nvn = normalize(vary_normal);
- frag_data[2] = vec4(nvn.xy * 0.5 + 0.5, nvn.z, 0.0);
+ frag_data[2] = vec4(nvn.xyz * 0.5 + 0.5, 0.0);
}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/diffuseAlphaMaskIndexedF.glsl b/indra/newview/app_settings/shaders/class1/deferred/diffuseAlphaMaskIndexedF.glsl
index ead384b07c..4c68123fac 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/diffuseAlphaMaskIndexedF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/diffuseAlphaMaskIndexedF.glsl
@@ -48,5 +48,5 @@ void main()
frag_data[0] = vec4(col.rgb, 0.0);
frag_data[1] = vec4(0,0,0,0);
vec3 nvn = normalize(vary_normal);
- frag_data[2] = vec4(nvn.xy * 0.5 + 0.5, nvn.z, 0.0);
+ frag_data[2] = vec4(nvn.xyz * 0.5 + 0.5, 0.0);
}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/diffuseAlphaMaskNoColorF.glsl b/indra/newview/app_settings/shaders/class1/deferred/diffuseAlphaMaskNoColorF.glsl
index f73fa6f231..ad65c7d330 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/diffuseAlphaMaskNoColorF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/diffuseAlphaMaskNoColorF.glsl
@@ -49,6 +49,6 @@ void main()
frag_data[0] = vec4(col.rgb, 0.0);
frag_data[1] = vec4(0,0,0,0); // spec
vec3 nvn = normalize(vary_normal);
- frag_data[2] = vec4(nvn.xy * 0.5 + 0.5, nvn.z, 0.0);
+ frag_data[2] = vec4(nvn.xyz * 0.5 + 0.5, 0.0);
}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/diffuseF.glsl b/indra/newview/app_settings/shaders/class1/deferred/diffuseF.glsl
index 227aa2aae3..86390bdd83 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/diffuseF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/diffuseF.glsl
@@ -42,6 +42,6 @@ void main()
frag_data[1] = vertex_color.aaaa; // spec
//frag_data[1] = vec4(vec3(vertex_color.a), vertex_color.a+(1.0-vertex_color.a)*vertex_color.a); // spec - from former class3 - maybe better, but not so well tested
vec3 nvn = normalize(vary_normal);
- frag_data[2] = vec4(nvn.xy * 0.5 + 0.5, nvn.z, 0.0);
+ frag_data[2] = vec4(nvn.xyz * 0.5 + 0.5, 0.0);
}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/diffuseIndexedF.glsl b/indra/newview/app_settings/shaders/class1/deferred/diffuseIndexedF.glsl
index d442e5403a..788b966af8 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/diffuseIndexedF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/diffuseIndexedF.glsl
@@ -41,5 +41,5 @@ void main()
frag_data[1] = vertex_color.aaaa; // spec
//frag_data[1] = vec4(vec3(vertex_color.a), vertex_color.a+(1.0-vertex_color.a)*vertex_color.a); // spec - from former class3 - maybe better, but not so well tested
vec3 nvn = normalize(vary_normal);
- frag_data[2] = vec4(nvn.xy * 0.5 + 0.5, nvn.z, 0.0);
+ frag_data[2] = vec4(nvn.xyz * 0.5 + 0.5, 0.0);
}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/multiPointLightF.glsl b/indra/newview/app_settings/shaders/class1/deferred/multiPointLightF.glsl
index 4d01eeb64e..7e79317543 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/multiPointLightF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/multiPointLightF.glsl
@@ -79,7 +79,7 @@ void main()
}
vec3 norm = texture2DRect(normalMap, frag.xy).xyz;
- norm = vec3((norm.xy-0.5)*2.0,norm.z); // unpack norm
+ norm = (norm.xyz-0.5)*2.0; // unpack norm
norm = normalize(norm);
vec4 spec = texture2DRect(specularRect, frag.xy);
vec3 diff = texture2DRect(diffuseRect, frag.xy).rgb;
diff --git a/indra/newview/app_settings/shaders/class1/deferred/multiSpotLightF.glsl b/indra/newview/app_settings/shaders/class1/deferred/multiSpotLightF.glsl
index 75de47614c..bff87cb6aa 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/multiSpotLightF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/multiSpotLightF.glsl
@@ -55,8 +55,6 @@ uniform float far_clip;
uniform vec3 proj_origin; //origin of projection to be used for angular attenuation
uniform float sun_wash;
-uniform int proj_shadow_idx;
-uniform float shadow_fade;
uniform vec3 center;
uniform vec3 color;
@@ -143,7 +141,8 @@ void main()
discard;
}
- vec3 norm = texture2DRect(normalMap, frag.xy).xyz*2.0-1.0;
+ vec3 norm = texture2DRect(normalMap, frag.xy).xyz;
+ norm = vec3((norm.xy-0.5)*2.0, norm.z);
norm = normalize(norm);
float l_dist = -dot(lv, proj_n);
diff --git a/indra/newview/app_settings/shaders/class1/deferred/pointLightF.glsl b/indra/newview/app_settings/shaders/class1/deferred/pointLightF.glsl
index 19800a8b8e..75757b26c8 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/pointLightF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/pointLightF.glsl
@@ -42,12 +42,13 @@ uniform sampler2DRect depthMap;
uniform vec3 env_mat[3];
uniform float sun_wash;
-uniform vec3 center;
uniform vec3 color;
uniform float falloff;
uniform float size;
VARYING vec4 vary_fragcoord;
+VARYING vec3 trans_center;
+
uniform vec2 screen_res;
uniform mat4 inv_proj;
@@ -74,7 +75,7 @@ void main()
frag.xy *= screen_res;
vec3 pos = getPosition(frag.xy).xyz;
- vec3 lv = center.xyz-pos;
+ vec3 lv = trans_center.xyz-pos;
float dist2 = dot(lv,lv);
dist2 /= size;
if (dist2 > 1.0)
@@ -83,7 +84,7 @@ void main()
}
vec3 norm = texture2DRect(normalMap, frag.xy).xyz;
- norm = vec3((norm.xy-0.5)*2.0,norm.z); // unpack norm
+ norm = (norm.xyz-0.5)*2.0; // unpack norm
float da = dot(norm, lv);
if (da < 0.0)
{
diff --git a/indra/newview/app_settings/shaders/class1/deferred/pointLightV.glsl b/indra/newview/app_settings/shaders/class1/deferred/pointLightV.glsl
index cb14e6d4e8..9491421236 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/pointLightV.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/pointLightV.glsl
@@ -24,16 +24,22 @@
*/
uniform mat4 modelview_projection_matrix;
+uniform mat4 modelview_matrix;
ATTRIBUTE vec3 position;
+uniform vec3 center;
+uniform float size;
+
VARYING vec4 vary_fragcoord;
+VARYING vec3 trans_center;
void main()
{
//transform vertex
- vec4 pos = modelview_projection_matrix * vec4(position.xyz, 1.0);
+ vec3 p = position*sqrt(size)+center;
+ vec4 pos = modelview_projection_matrix * vec4(p.xyz, 1.0);
vary_fragcoord = pos;
-
+ trans_center = (modelview_matrix*vec4(center.xyz, 1.0)).xyz;
gl_Position = pos;
}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/shadowCubeV.glsl b/indra/newview/app_settings/shaders/class1/deferred/shadowCubeV.glsl
new file mode 100644
index 0000000000..6195e2f1ec
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/deferred/shadowCubeV.glsl
@@ -0,0 +1,44 @@
+/**
+ * @file shadowCubeV.glsl
+ *
+ * $LicenseInfo:firstyear=2011&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+uniform mat4 modelview_projection_matrix;
+
+ATTRIBUTE vec3 position;
+
+VARYING vec4 post_pos;
+
+uniform vec3 box_center;
+uniform vec3 box_size;
+
+void main()
+{
+ //transform vertex
+ vec3 p = position*box_size+box_center;
+ vec4 pos = modelview_projection_matrix*vec4(p.xyz, 1.0);
+
+ post_pos = pos;
+
+ gl_Position = vec4(pos.x, pos.y, pos.w*0.5, pos.w);
+}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/softenLightF.glsl b/indra/newview/app_settings/shaders/class1/deferred/softenLightF.glsl
index 66e3cf6d13..89448e2167 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/softenLightF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/softenLightF.glsl
@@ -277,7 +277,7 @@ void main()
float depth = texture2DRect(depthMap, tc.xy).r;
vec3 pos = getPosition_d(tc, depth).xyz;
vec3 norm = texture2DRect(normalMap, tc).xyz;
- norm = vec3((norm.xy-0.5)*2.0,norm.z); // unpack norm
+ norm = (norm.xyz-0.5)*2.0; // unpack norm
float da = max(dot(norm.xyz, sun_dir.xyz), 0.0);
diff --git a/indra/newview/app_settings/shaders/class1/deferred/spotLightF.glsl b/indra/newview/app_settings/shaders/class1/deferred/spotLightF.glsl
index 7ed8ed3370..cca63872de 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/spotLightF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/spotLightF.glsl
@@ -24,18 +24,21 @@
*/
-#extension GL_ARB_texture_rectangle : enable
-
#ifdef DEFINE_GL_FRAGCOLOR
out vec4 frag_color;
#else
#define frag_color gl_FragColor
#endif
+//class 1 -- no shadows
+
+#extension GL_ARB_texture_rectangle : enable
+
uniform sampler2DRect diffuseRect;
uniform sampler2DRect specularRect;
uniform sampler2DRect depthMap;
uniform sampler2DRect normalMap;
+uniform samplerCube environmentMap;
uniform sampler2D noiseMap;
uniform sampler2D projectionMap;
@@ -46,6 +49,7 @@ uniform vec3 proj_n;
uniform float proj_focus; //distance from plane to begin blurring
uniform float proj_lod; //(number of mips in proj map)
uniform float proj_range; //range between near clip and far clip plane of projection
+uniform float proj_ambient_lod;
uniform float proj_ambiance;
uniform float near_clip;
uniform float far_clip;
@@ -53,19 +57,66 @@ uniform float far_clip;
uniform vec3 proj_origin; //origin of projection to be used for angular attenuation
uniform float sun_wash;
-uniform vec3 center;
uniform vec3 color;
uniform float falloff;
uniform float size;
VARYING vec4 vary_fragcoord;
+VARYING vec3 trans_center;
+
uniform vec2 screen_res;
uniform mat4 inv_proj;
+vec4 texture2DLodSpecular(sampler2D projectionMap, vec2 tc, float lod)
+{
+ vec4 ret = texture2DLod(projectionMap, tc, lod);
+
+ vec2 dist = tc-vec2(0.5);
+
+ float det = max(1.0-lod/(proj_lod*0.5), 0.0);
+
+ float d = dot(dist,dist);
+
+ ret *= min(clamp((0.25-d)/0.25, 0.0, 1.0)+det, 1.0);
+
+ return ret;
+}
+
+vec4 texture2DLodDiffuse(sampler2D projectionMap, vec2 tc, float lod)
+{
+ vec4 ret = texture2DLod(projectionMap, tc, lod);
+
+ vec2 dist = vec2(0.5) - abs(tc-vec2(0.5));
+
+ float det = min(lod/(proj_lod*0.5), 1.0);
+
+ float d = min(dist.x, dist.y);
+
+ float edge = 0.25*det;
+
+ ret *= clamp(d/edge, 0.0, 1.0);
+
+ return ret;
+}
+
+vec4 texture2DLodAmbient(sampler2D projectionMap, vec2 tc, float lod)
+{
+ vec4 ret = texture2DLod(projectionMap, tc, lod);
+
+ vec2 dist = tc-vec2(0.5);
+
+ float d = dot(dist,dist);
+
+ ret *= min(clamp((0.25-d)/0.25, 0.0, 1.0), 1.0);
+
+ return ret;
+}
+
+
vec4 getPosition(vec2 pos_screen)
{
- float depth = texture2DRect(depthMap, pos_screen.xy).a;
+ float depth = texture2DRect(depthMap, pos_screen.xy).r;
vec2 sc = pos_screen.xy*2.0;
sc /= screen_res;
sc -= vec2(1.0,1.0);
@@ -84,16 +135,16 @@ void main()
frag.xy *= screen_res;
vec3 pos = getPosition(frag.xy).xyz;
- vec3 lv = center.xyz-pos.xyz;
+ vec3 lv = trans_center.xyz-pos.xyz;
float dist2 = dot(lv,lv);
dist2 /= size;
if (dist2 > 1.0)
{
discard;
}
-
+
vec3 norm = texture2DRect(normalMap, frag.xy).xyz;
- norm = vec3((norm.xy-0.5)*2.0,norm.z); // unpack norm
+ norm = vec3((norm.xy-0.5)*2.0, norm.z);
norm = normalize(norm);
float l_dist = -dot(lv, proj_n);
@@ -107,7 +158,11 @@ void main()
proj_tc.xyz /= proj_tc.w;
float fa = falloff+1.0;
- float dist_atten = clamp(1.0-(dist2-1.0*(1.0-fa))/fa, 0.0, 1.0);
+ float dist_atten = min(1.0-(dist2-1.0*(1.0-fa))/fa, 1.0);
+ if (dist_atten <= 0.0)
+ {
+ discard;
+ }
lv = proj_origin-pos.xyz;
lv = normalize(lv);
@@ -125,32 +180,32 @@ void main()
proj_tc.y > 0.0)
{
float lit = 0.0;
+ float amb_da = proj_ambiance;
+
if (da > 0.0)
{
float diff = clamp((l_dist-proj_focus)/proj_range, 0.0, 1.0);
float lod = diff * proj_lod;
- vec4 plcol = texture2DLod(projectionMap, proj_tc.xy, lod);
+ vec4 plcol = texture2DLodDiffuse(projectionMap, proj_tc.xy, lod);
vec3 lcol = color.rgb * plcol.rgb * plcol.a;
lit = da * dist_atten * noise;
col = lcol*lit*diff_tex;
+ amb_da += (da*0.5)*proj_ambiance;
}
- float diff = clamp((proj_range-proj_focus)/proj_range, 0.0, 1.0);
- float lod = diff * proj_lod;
- vec4 amb_plcol = texture2DLod(projectionMap, proj_tc.xy, lod);
- //float amb_da = mix(proj_ambiance, proj_ambiance*max(-da, 0.0), max(da, 0.0));
- float amb_da = proj_ambiance;
-
+ //float diff = clamp((proj_range-proj_focus)/proj_range, 0.0, 1.0);
+ vec4 amb_plcol = texture2DLodAmbient(projectionMap, proj_tc.xy, proj_lod);
+
amb_da += (da*da*0.5+0.5)*proj_ambiance;
-
+
amb_da *= dist_atten * noise;
-
+
amb_da = min(amb_da, 1.0-lit);
-
+
col += amb_da*color.rgb*diff_tex.rgb*amb_plcol.rgb*amb_plcol.a;
}
@@ -168,18 +223,22 @@ void main()
{
vec3 pfinal = pos + ref * dot(pdelta, proj_n)/ds;
- vec3 stc = (proj_mat * vec4(pfinal.xyz, 1.0)).xyz;
+ vec4 stc = (proj_mat * vec4(pfinal.xyz, 1.0));
if (stc.z > 0.0)
{
- stc.xy /= stc.z+proj_near;
-
+ stc.xy /= stc.w;
+
+ float fatten = clamp(spec.a*spec.a+spec.a*0.5, 0.25, 1.0);
+
+ stc.xy = (stc.xy - vec2(0.5)) * fatten + vec2(0.5);
+
if (stc.x < 1.0 &&
stc.y < 1.0 &&
stc.x > 0.0 &&
stc.y > 0.0)
{
- vec4 scol = texture2DLod(projectionMap, stc.xy, proj_lod-spec.a*proj_lod);
+ vec4 scol = texture2DLodSpecular(projectionMap, stc.xy, proj_lod-spec.a*proj_lod);
col += dist_atten*scol.rgb*color.rgb*scol.a*spec.rgb;
}
}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/sunLightSSAOF.glsl b/indra/newview/app_settings/shaders/class1/deferred/sunLightSSAOF.glsl
index 2422d73a3e..bac74cbbef 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/sunLightSSAOF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/sunLightSSAOF.glsl
@@ -123,7 +123,7 @@ void main()
vec4 pos = getPosition(pos_screen);
vec3 norm = texture2DRect(normalMap, pos_screen).xyz;
- norm = vec3((norm.xy-0.5)*2.0,norm.z); // unpack norm
+ norm = (norm.xyz-0.5)*2.0; // unpack norm
frag_color[0] = 1.0;
frag_color[1] = calcAmbientOcclusion(pos, norm);
diff --git a/indra/newview/app_settings/shaders/class1/deferred/terrainF.glsl b/indra/newview/app_settings/shaders/class1/deferred/terrainF.glsl
index 8a5e482e80..daf1cc7ea2 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/terrainF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/terrainF.glsl
@@ -56,6 +56,6 @@ void main()
frag_data[0] = vec4(outColor.rgb, 0.0);
frag_data[1] = vec4(0,0,0,0);
vec3 nvn = normalize(vary_normal);
- frag_data[2] = vec4(nvn.xy * 0.5 + 0.5, nvn.z, 0.0);
+ frag_data[2] = vec4(nvn.xyz * 0.5 + 0.5, 0.0);
}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/treeF.glsl b/indra/newview/app_settings/shaders/class1/deferred/treeF.glsl
index 6cf6106b51..da253846ef 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/treeF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/treeF.glsl
@@ -48,5 +48,5 @@ void main()
frag_data[0] = vec4(vertex_color.rgb*col.rgb, 0.0);
frag_data[1] = vec4(0,0,0,0);
vec3 nvn = normalize(vary_normal);
- frag_data[2] = vec4(nvn.xy * 0.5 + 0.5, nvn.z, 0.0);
+ frag_data[2] = vec4(nvn.xyz * 0.5 + 0.5, 0.0);
}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/waterF.glsl b/indra/newview/app_settings/shaders/class1/deferred/waterF.glsl
index 42dc7c0980..3427d6db57 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/waterF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/waterF.glsl
@@ -161,5 +161,5 @@ void main()
frag_data[0] = vec4(color.rgb, 0.5); // diffuse
frag_data[1] = vec4(0.5,0.5,0.5, 0.95); // speccolor*spec, spec
- frag_data[2] = vec4(screenspacewavef.xy*0.5+0.5, screenspacewavef.z, screenspacewavef.z*0.5); // normalxyz, displace
+ frag_data[2] = vec4(screenspacewavef.xyz*0.5+0.5, screenspacewavef.z*0.5); // normalxyz, displace
}
diff --git a/indra/newview/app_settings/shaders/class1/interface/clipF.glsl b/indra/newview/app_settings/shaders/class1/interface/clipF.glsl
new file mode 100644
index 0000000000..ac2bc8703b
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/interface/clipF.glsl
@@ -0,0 +1,46 @@
+/**
+ * @file debugF.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2011, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 frag_color;
+#else
+#define frag_color gl_FragColor
+#endif
+
+uniform vec4 color;
+uniform vec4 clip_plane;
+
+VARYING vec3 vary_position;
+
+
+void main()
+{
+ if (dot(vary_position,clip_plane.xyz)+clip_plane.w < 0.0)
+ {
+ discard;
+ }
+
+ frag_color = color;
+}
diff --git a/indra/newview/app_settings/shaders/class1/interface/clipV.glsl b/indra/newview/app_settings/shaders/class1/interface/clipV.glsl
new file mode 100644
index 0000000000..e376b25a71
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/interface/clipV.glsl
@@ -0,0 +1,38 @@
+/**
+ * @file debugV.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2011, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+uniform mat4 modelview_projection_matrix;
+uniform mat4 modelview_matrix;
+
+ATTRIBUTE vec3 position;
+
+VARYING vec3 vary_position;
+
+void main()
+{
+ vary_position = (modelview_matrix*vec4(position.xyz,1.0)).xyz;
+ gl_Position = modelview_projection_matrix * vec4(position.xyz, 1.0);
+}
+
diff --git a/indra/newview/app_settings/shaders/class1/interface/occlusionCubeV.glsl b/indra/newview/app_settings/shaders/class1/interface/occlusionCubeV.glsl
new file mode 100644
index 0000000000..5c479d27a9
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/interface/occlusionCubeV.glsl
@@ -0,0 +1,38 @@
+/**
+ * @file occlusionCubeV.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+uniform mat4 modelview_projection_matrix;
+
+ATTRIBUTE vec3 position;
+
+uniform vec3 box_center;
+uniform vec3 box_size;
+
+void main()
+{
+ vec3 p = position*box_size+box_center;
+ gl_Position = modelview_projection_matrix * vec4(p.xyz, 1.0);
+}
+
diff --git a/indra/newview/app_settings/shaders/class1/interface/pathfindingF.glsl b/indra/newview/app_settings/shaders/class1/interface/pathfindingF.glsl
new file mode 100644
index 0000000000..7379360e17
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/interface/pathfindingF.glsl
@@ -0,0 +1,37 @@
+/**
+ * @file pathfindingF.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 frag_color;
+#else
+#define frag_color gl_FragColor
+#endif
+
+VARYING vec4 vertex_color;
+
+void main()
+{
+ frag_color = vertex_color;
+}
diff --git a/indra/newview/app_settings/shaders/class1/interface/pathfindingNoNormalV.glsl b/indra/newview/app_settings/shaders/class1/interface/pathfindingNoNormalV.glsl
new file mode 100644
index 0000000000..19fa607307
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/interface/pathfindingNoNormalV.glsl
@@ -0,0 +1,42 @@
+/**
+ * @file pathfindingV.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+uniform mat4 modelview_projection_matrix;
+
+ATTRIBUTE vec3 position;
+ATTRIBUTE vec4 diffuse_color;
+
+VARYING vec4 vertex_color;
+
+uniform float tint;
+uniform float alpha_scale;
+
+void main()
+{
+ gl_Position = modelview_projection_matrix * vec4(position.xyz, 1.0);
+
+ vertex_color = vec4(diffuse_color.rgb * tint, diffuse_color.a*alpha_scale);
+}
+
diff --git a/indra/newview/app_settings/shaders/class1/interface/pathfindingV.glsl b/indra/newview/app_settings/shaders/class1/interface/pathfindingV.glsl
new file mode 100644
index 0000000000..91f252cf1e
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/interface/pathfindingV.glsl
@@ -0,0 +1,54 @@
+/**
+ * @file pathfindingV.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+uniform mat4 modelview_projection_matrix;
+
+ATTRIBUTE vec3 position;
+ATTRIBUTE vec4 diffuse_color;
+ATTRIBUTE vec3 normal;
+
+VARYING vec4 vertex_color;
+
+uniform float tint;
+uniform float ambiance;
+uniform float alpha_scale;
+
+void main()
+{
+ gl_Position = modelview_projection_matrix * vec4(position.xyz, 1.0);
+
+ vec3 l1 = vec3(-0.75, 1, 1.0)*0.5;
+ vec3 l2 = vec3(0.5, -0.6, 0.4)*0.25;
+ vec3 l3 = vec3(0.5, -0.8, 0.3)*0.5;
+
+ float lit = max(dot(normal, l1), 0.0);
+ lit += max(dot(normal, l2), 0.0);
+ lit += max(dot(normal, l3), 0.0);
+
+ lit = clamp(lit, ambiance, 1.0);
+
+ vertex_color = vec4(diffuse_color.rgb * tint * lit, diffuse_color.a*alpha_scale);
+}
+
diff --git a/indra/newview/app_settings/shaders/class1/objects/indexedTextureV.glsl b/indra/newview/app_settings/shaders/class1/objects/indexedTextureV.glsl
index 7c0699d72f..ca29bf3143 100644
--- a/indra/newview/app_settings/shaders/class1/objects/indexedTextureV.glsl
+++ b/indra/newview/app_settings/shaders/class1/objects/indexedTextureV.glsl
@@ -23,9 +23,9 @@
* $/LicenseInfo$
*/
-ATTRIBUTE ivec4 texture_index;
+ATTRIBUTE int texture_index;
-VARYING_FLAT ivec4 vary_texture_index;
+VARYING_FLAT int vary_texture_index;
void passTextureIndex()
{
diff --git a/indra/newview/app_settings/shaders/class1/transform/binormalV.glsl b/indra/newview/app_settings/shaders/class1/transform/binormalV.glsl
new file mode 100644
index 0000000000..44f1aa34a0
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/transform/binormalV.glsl
@@ -0,0 +1,36 @@
+/**
+ * @file binormalV.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+uniform mat3 normal_matrix;
+
+ATTRIBUTE vec3 binormal;
+
+VARYING vec4 binormal_out;
+
+void main()
+{
+ binormal_out = vec4(normal_matrix * binormal, 0.0);
+}
+
diff --git a/indra/newview/app_settings/shaders/class1/transform/colorV.glsl b/indra/newview/app_settings/shaders/class1/transform/colorV.glsl
new file mode 100644
index 0000000000..59c4a7d895
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/transform/colorV.glsl
@@ -0,0 +1,36 @@
+/**
+ * @file colorV.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+uniform int color_in;
+
+ATTRIBUTE vec3 position;
+
+VARYING int color_out;
+
+void main()
+{
+ color_out = color_in;
+}
+
diff --git a/indra/newview/app_settings/shaders/class1/transform/normalV.glsl b/indra/newview/app_settings/shaders/class1/transform/normalV.glsl
new file mode 100644
index 0000000000..a213aa0ae8
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/transform/normalV.glsl
@@ -0,0 +1,36 @@
+/**
+ * @file normalV.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+uniform mat3 normal_matrix;
+
+ATTRIBUTE vec3 normal;
+
+VARYING vec4 normal_out;
+
+void main()
+{
+ normal_out = vec4(normalize(normal_matrix * normal), 0.0);
+}
+
diff --git a/indra/newview/app_settings/shaders/class1/transform/positionV.glsl b/indra/newview/app_settings/shaders/class1/transform/positionV.glsl
new file mode 100644
index 0000000000..01eed18de4
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/transform/positionV.glsl
@@ -0,0 +1,40 @@
+/**
+ * @file positionV.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+uniform mat4 modelview_matrix;
+
+uniform int texture_index_in;
+
+ATTRIBUTE vec3 position;
+
+VARYING vec3 position_out;
+VARYING int texture_index_out;
+
+void main()
+{
+ texture_index_out = texture_index_in;
+ position_out = (modelview_matrix*vec4(position, 1.0)).xyz;
+}
+
diff --git a/indra/newview/app_settings/shaders/class1/transform/texcoordV.glsl b/indra/newview/app_settings/shaders/class1/transform/texcoordV.glsl
new file mode 100644
index 0000000000..0e074f3cec
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/transform/texcoordV.glsl
@@ -0,0 +1,35 @@
+/**
+ * @file texcoordV.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+
+ATTRIBUTE vec2 texcoord0;
+
+VARYING vec2 texcoord_out;
+
+void main()
+{
+ texcoord_out = texcoord0;
+}
+
diff --git a/indra/newview/app_settings/shaders/class2/deferred/alphaF.glsl b/indra/newview/app_settings/shaders/class2/deferred/alphaF.glsl
index 8db4cb58cf..12706f130b 100644
--- a/indra/newview/app_settings/shaders/class2/deferred/alphaF.glsl
+++ b/indra/newview/app_settings/shaders/class2/deferred/alphaF.glsl
@@ -34,10 +34,10 @@ out vec4 frag_color;
VARYING vec4 vertex_color;
VARYING vec2 vary_texcoord0;
-uniform sampler2DRectShadow shadowMap0;
-uniform sampler2DRectShadow shadowMap1;
-uniform sampler2DRectShadow shadowMap2;
-uniform sampler2DRectShadow shadowMap3;
+uniform sampler2DShadow shadowMap0;
+uniform sampler2DShadow shadowMap1;
+uniform sampler2DShadow shadowMap2;
+uniform sampler2DShadow shadowMap3;
uniform sampler2DRect depthMap;
uniform mat4 shadow_matrix[6];
@@ -58,22 +58,22 @@ uniform float shadow_bias;
uniform mat4 inv_proj;
-float pcfShadow(sampler2DRectShadow shadowMap, vec4 stc)
+float pcfShadow(sampler2DShadow shadowMap, vec4 stc)
{
stc.xyz /= stc.w;
stc.z += shadow_bias;
-
- stc.x = floor(stc.x + fract(stc.y*12345)); // add some chaotic jitter to X sample pos according to Y to disguise the snapping going on here
+
+ stc.x = floor(stc.x*shadow_res.x + fract(stc.y*shadow_res.y*12345))/shadow_res.x; // add some chaotic jitter to X sample pos according to Y to disguise the snapping going on here
- float cs = shadow2DRect(shadowMap, stc.xyz).x;
+ float cs = shadow2D(shadowMap, stc.xyz).x;
float shadow = cs;
-
- shadow += shadow2DRect(shadowMap, stc.xyz+vec3(2.0, 1.5, 0.0)).x;
- shadow += shadow2DRect(shadowMap, stc.xyz+vec3(1.0, -1.5, 0.0)).x;
- shadow += shadow2DRect(shadowMap, stc.xyz+vec3(-1.0, 1.5, 0.0)).x;
- shadow += shadow2DRect(shadowMap, stc.xyz+vec3(-2.0, -1.5, 0.0)).x;
-
- return shadow*0.2;
+
+ shadow += shadow2D(shadowMap, stc.xyz+vec3(2.0/shadow_res.x, 1.5/shadow_res.y, 0.0)).x;
+ shadow += shadow2D(shadowMap, stc.xyz+vec3(1.0/shadow_res.x, -1.5/shadow_res.y, 0.0)).x;
+ shadow += shadow2D(shadowMap, stc.xyz+vec3(-1.0/shadow_res.x, 1.5/shadow_res.y, 0.0)).x;
+ shadow += shadow2D(shadowMap, stc.xyz+vec3(-2.0/shadow_res.x, -1.5/shadow_res.y, 0.0)).x;
+
+ return shadow*0.2;
}
@@ -99,8 +99,7 @@ void main()
if (spos.z < near_split.z)
{
lpos = shadow_matrix[3]*spos;
- lpos.xy *= shadow_res;
-
+
float w = 1.0;
w -= max(spos.z-far_split.z, 0.0)/transition_domain.z;
shadow += pcfShadow(shadowMap3, lpos)*w;
@@ -111,8 +110,7 @@ void main()
if (spos.z < near_split.y && spos.z > far_split.z)
{
lpos = shadow_matrix[2]*spos;
- lpos.xy *= shadow_res;
-
+
float w = 1.0;
w -= max(spos.z-far_split.y, 0.0)/transition_domain.y;
w -= max(near_split.z-spos.z, 0.0)/transition_domain.z;
@@ -123,8 +121,7 @@ void main()
if (spos.z < near_split.x && spos.z > far_split.y)
{
lpos = shadow_matrix[1]*spos;
- lpos.xy *= shadow_res;
-
+
float w = 1.0;
w -= max(spos.z-far_split.x, 0.0)/transition_domain.x;
w -= max(near_split.y-spos.z, 0.0)/transition_domain.y;
@@ -135,8 +132,7 @@ void main()
if (spos.z > far_split.x)
{
lpos = shadow_matrix[0]*spos;
- lpos.xy *= shadow_res;
-
+
float w = 1.0;
w -= max(near_split.x-spos.z, 0.0)/transition_domain.x;
diff --git a/indra/newview/app_settings/shaders/class2/deferred/alphaNonIndexedF.glsl b/indra/newview/app_settings/shaders/class2/deferred/alphaNonIndexedF.glsl
index 33958a5010..228dc104ac 100644
--- a/indra/newview/app_settings/shaders/class2/deferred/alphaNonIndexedF.glsl
+++ b/indra/newview/app_settings/shaders/class2/deferred/alphaNonIndexedF.glsl
@@ -31,17 +31,16 @@ out vec4 frag_color;
#define frag_color gl_FragColor
#endif
-uniform sampler2DRectShadow shadowMap0;
-uniform sampler2DRectShadow shadowMap1;
-uniform sampler2DRectShadow shadowMap2;
-uniform sampler2DRectShadow shadowMap3;
+uniform sampler2DShadow shadowMap0;
+uniform sampler2DShadow shadowMap1;
+uniform sampler2DShadow shadowMap2;
+uniform sampler2DShadow shadowMap3;
uniform sampler2DRect depthMap;
uniform sampler2D diffuseMap;
uniform mat4 shadow_matrix[6];
uniform vec4 shadow_clip;
uniform vec2 screen_res;
-uniform vec2 shadow_res;
vec3 atmosLighting(vec3 light);
vec3 scaleSoftClip(vec3 light);
@@ -54,6 +53,7 @@ VARYING vec3 vary_pointlight_col;
VARYING vec2 vary_texcoord0;
VARYING vec4 vertex_color;
+uniform vec2 shadow_res;
uniform float shadow_bias;
uniform mat4 inv_proj;
@@ -71,22 +71,22 @@ vec4 getPosition(vec2 pos_screen)
return pos;
}
-float pcfShadow(sampler2DRectShadow shadowMap, vec4 stc)
+float pcfShadow(sampler2DShadow shadowMap, vec4 stc)
{
stc.xyz /= stc.w;
stc.z += shadow_bias;
- stc.x = floor(stc.x + fract(stc.y*12345)); // add some chaotic jitter to X sample pos according to Y to disguise the snapping going on here
+ stc.x = floor(stc.x*shadow_res.x + fract(stc.y*12345))/shadow_res.x; // add some chaotic jitter to X sample pos according to Y to disguise the snapping going on here
- float cs = shadow2DRect(shadowMap, stc.xyz).x;
+ float cs = shadow2D(shadowMap, stc.xyz).x;
float shadow = cs;
-
- shadow += shadow2DRect(shadowMap, stc.xyz+vec3(2.0, 1.5, 0.0)).x;
- shadow += shadow2DRect(shadowMap, stc.xyz+vec3(1.0, -1.5, 0.0)).x;
- shadow += shadow2DRect(shadowMap, stc.xyz+vec3(-1.0, 1.5, 0.0)).x;
- shadow += shadow2DRect(shadowMap, stc.xyz+vec3(-2.0, -1.5, 0.0)).x;
+
+ shadow += shadow2D(shadowMap, stc.xyz+vec3(2.0/shadow_res.x, 1.5/shadow_res.y, 0.0)).x;
+ shadow += shadow2D(shadowMap, stc.xyz+vec3(1.0/shadow_res.x, -1.5/shadow_res.y, 0.0)).x;
+ shadow += shadow2D(shadowMap, stc.xyz+vec3(-1.0/shadow_res.x, 1.5/shadow_res.y, 0.0)).x;
+ shadow += shadow2D(shadowMap, stc.xyz+vec3(-2.0/shadow_res.x, -1.5/shadow_res.y, 0.0)).x;
- return shadow*0.2;
+ return shadow*0.2;
}
@@ -112,8 +112,7 @@ void main()
if (spos.z < near_split.z)
{
lpos = shadow_matrix[3]*spos;
- lpos.xy *= shadow_res;
-
+
float w = 1.0;
w -= max(spos.z-far_split.z, 0.0)/transition_domain.z;
shadow += pcfShadow(shadowMap3, lpos)*w;
@@ -124,8 +123,7 @@ void main()
if (spos.z < near_split.y && spos.z > far_split.z)
{
lpos = shadow_matrix[2]*spos;
- lpos.xy *= shadow_res;
-
+
float w = 1.0;
w -= max(spos.z-far_split.y, 0.0)/transition_domain.y;
w -= max(near_split.z-spos.z, 0.0)/transition_domain.z;
@@ -136,8 +134,7 @@ void main()
if (spos.z < near_split.x && spos.z > far_split.y)
{
lpos = shadow_matrix[1]*spos;
- lpos.xy *= shadow_res;
-
+
float w = 1.0;
w -= max(spos.z-far_split.x, 0.0)/transition_domain.x;
w -= max(near_split.y-spos.z, 0.0)/transition_domain.y;
@@ -148,8 +145,7 @@ void main()
if (spos.z > far_split.x)
{
lpos = shadow_matrix[0]*spos;
- lpos.xy *= shadow_res;
-
+
float w = 1.0;
w -= max(near_split.x-spos.z, 0.0)/transition_domain.x;
diff --git a/indra/newview/app_settings/shaders/class2/deferred/alphaNonIndexedNoColorF.glsl b/indra/newview/app_settings/shaders/class2/deferred/alphaNonIndexedNoColorF.glsl
index ba6f3ace53..c3950a10e1 100644
--- a/indra/newview/app_settings/shaders/class2/deferred/alphaNonIndexedNoColorF.glsl
+++ b/indra/newview/app_settings/shaders/class2/deferred/alphaNonIndexedNoColorF.glsl
@@ -31,17 +31,18 @@ out vec4 frag_color;
#define frag_color gl_FragColor
#endif
-uniform sampler2DRectShadow shadowMap0;
-uniform sampler2DRectShadow shadowMap1;
-uniform sampler2DRectShadow shadowMap2;
-uniform sampler2DRectShadow shadowMap3;
+uniform float minimum_alpha;
+
+uniform sampler2DShadow shadowMap0;
+uniform sampler2DShadow shadowMap1;
+uniform sampler2DShadow shadowMap2;
+uniform sampler2DShadow shadowMap3;
uniform sampler2DRect depthMap;
uniform sampler2D diffuseMap;
uniform mat4 shadow_matrix[6];
uniform vec4 shadow_clip;
uniform vec2 screen_res;
-uniform vec2 shadow_res;
vec3 atmosLighting(vec3 light);
vec3 scaleSoftClip(vec3 light);
@@ -53,6 +54,8 @@ VARYING vec3 vary_position;
VARYING vec3 vary_pointlight_col;
VARYING vec2 vary_texcoord0;
+uniform vec2 shadow_res;
+
uniform float shadow_bias;
uniform mat4 inv_proj;
@@ -70,20 +73,20 @@ vec4 getPosition(vec2 pos_screen)
return pos;
}
-float pcfShadow(sampler2DRectShadow shadowMap, vec4 stc)
+float pcfShadow(sampler2DShadow shadowMap, vec4 stc)
{
stc.xyz /= stc.w;
stc.z += shadow_bias;
- stc.x = floor(stc.x + fract(stc.y*12345)); // add some chaotic jitter to X sample pos according to Y to disguise the snapping going on here
+ stc.x = floor(stc.x*shadow_res.x + fract(stc.y*12345))/shadow_res.x; // add some chaotic jitter to X sample pos according to Y to disguise the snapping going on here
+ float cs = shadow2D(shadowMap, stc.xyz).x;
- float cs = shadow2DRect(shadowMap, stc.xyz).x;
float shadow = cs;
- shadow += shadow2DRect(shadowMap, stc.xyz+vec3(2.0, 1.5, 0.0)).x;
- shadow += shadow2DRect(shadowMap, stc.xyz+vec3(1.0, -1.5, 0.0)).x;
- shadow += shadow2DRect(shadowMap, stc.xyz+vec3(-1.0, 1.5, 0.0)).x;
- shadow += shadow2DRect(shadowMap, stc.xyz+vec3(-2.0, -1.5, 0.0)).x;
+ shadow += shadow2D(shadowMap, stc.xyz+vec3(2.0/shadow_res.x, 1.5/shadow_res.y, 0.0)).x;
+ shadow += shadow2D(shadowMap, stc.xyz+vec3(1.0/shadow_res.x, -1.5/shadow_res.y, 0.0)).x;
+ shadow += shadow2D(shadowMap, stc.xyz+vec3(-1.0/shadow_res.x, 1.5/shadow_res.y, 0.0)).x;
+ shadow += shadow2D(shadowMap, stc.xyz+vec3(-2.0/shadow_res.x, -1.5/shadow_res.y, 0.0)).x;
return shadow*0.2;
}
@@ -97,6 +100,13 @@ void main()
float shadow = 0.0;
vec4 pos = vec4(vary_position, 1.0);
+ vec4 diff = texture2D(diffuseMap,vary_texcoord0.xy);
+
+ if (diff.a < minimum_alpha)
+ {
+ discard;
+ }
+
vec4 spos = pos;
if (spos.z > -shadow_clip.w)
@@ -111,8 +121,7 @@ void main()
if (spos.z < near_split.z)
{
lpos = shadow_matrix[3]*spos;
- lpos.xy *= shadow_res;
-
+
float w = 1.0;
w -= max(spos.z-far_split.z, 0.0)/transition_domain.z;
shadow += pcfShadow(shadowMap3, lpos)*w;
@@ -123,8 +132,7 @@ void main()
if (spos.z < near_split.y && spos.z > far_split.z)
{
lpos = shadow_matrix[2]*spos;
- lpos.xy *= shadow_res;
-
+
float w = 1.0;
w -= max(spos.z-far_split.y, 0.0)/transition_domain.y;
w -= max(near_split.z-spos.z, 0.0)/transition_domain.z;
@@ -135,8 +143,7 @@ void main()
if (spos.z < near_split.x && spos.z > far_split.y)
{
lpos = shadow_matrix[1]*spos;
- lpos.xy *= shadow_res;
-
+
float w = 1.0;
w -= max(spos.z-far_split.x, 0.0)/transition_domain.x;
w -= max(near_split.y-spos.z, 0.0)/transition_domain.y;
@@ -147,8 +154,7 @@ void main()
if (spos.z > far_split.x)
{
lpos = shadow_matrix[0]*spos;
- lpos.xy *= shadow_res;
-
+
float w = 1.0;
w -= max(near_split.x-spos.z, 0.0)/transition_domain.x;
@@ -164,8 +170,6 @@ void main()
shadow = 1.0;
}
- vec4 diff = texture2D(diffuseMap,vary_texcoord0.xy);
-
vec4 col = vec4(vary_ambient + vary_directional.rgb*shadow, 1.0);
vec4 color = diff * col;
diff --git a/indra/newview/app_settings/shaders/class2/deferred/multiSpotLightF.glsl b/indra/newview/app_settings/shaders/class2/deferred/multiSpotLightF.glsl
index f7f1f649ce..5621e47ab7 100644
--- a/indra/newview/app_settings/shaders/class2/deferred/multiSpotLightF.glsl
+++ b/indra/newview/app_settings/shaders/class2/deferred/multiSpotLightF.glsl
@@ -154,7 +154,7 @@ void main()
}
vec3 norm = texture2DRect(normalMap, frag.xy).xyz;
- norm = vec3((norm.xy-0.5)*2.0,norm.z); // unpack norm
+ norm = (norm.xyz-0.5)*2.0; // unpack norm
norm = normalize(norm);
float l_dist = -dot(lv, proj_n);
diff --git a/indra/newview/app_settings/shaders/class2/deferred/softenLightF.glsl b/indra/newview/app_settings/shaders/class2/deferred/softenLightF.glsl
index a137bea30f..9df9d75905 100644
--- a/indra/newview/app_settings/shaders/class2/deferred/softenLightF.glsl
+++ b/indra/newview/app_settings/shaders/class2/deferred/softenLightF.glsl
@@ -279,7 +279,7 @@ void main()
float depth = texture2DRect(depthMap, tc.xy).r;
vec3 pos = getPosition_d(tc, depth).xyz;
vec3 norm = texture2DRect(normalMap, tc).xyz;
- norm = vec3((norm.xy-0.5)*2.0,norm.z); // unpack norm
+ norm = (norm.xyz-0.5)*2.0; // unpack norm
float da = max(dot(norm.xyz, sun_dir.xyz), 0.0);
diff --git a/indra/newview/app_settings/shaders/class2/deferred/spotLightF.glsl b/indra/newview/app_settings/shaders/class2/deferred/spotLightF.glsl
index 99a277fbfc..6d6ad6d565 100644
--- a/indra/newview/app_settings/shaders/class2/deferred/spotLightF.glsl
+++ b/indra/newview/app_settings/shaders/class2/deferred/spotLightF.glsl
@@ -31,8 +31,6 @@ out vec4 frag_color;
#define frag_color gl_FragColor
#endif
-VARYING vec4 vertex_color;
-
uniform sampler2DRect diffuseRect;
uniform sampler2DRect specularRect;
uniform sampler2DRect depthMap;
@@ -49,6 +47,7 @@ uniform vec3 proj_n;
uniform float proj_focus; //distance from plane to begin blurring
uniform float proj_lod; //(number of mips in proj map)
uniform float proj_range; //range between near clip and far clip plane of projection
+uniform float proj_ambient_lod;
uniform float proj_ambiance;
uniform float near_clip;
uniform float far_clip;
@@ -58,16 +57,65 @@ uniform float sun_wash;
uniform int proj_shadow_idx;
uniform float shadow_fade;
-VARYING vec4 vary_light;
+uniform float size;
+uniform vec3 color;
+uniform float falloff;
+VARYING vec3 trans_center;
VARYING vec4 vary_fragcoord;
uniform vec2 screen_res;
uniform mat4 inv_proj;
+vec4 texture2DLodSpecular(sampler2D projectionMap, vec2 tc, float lod)
+{
+ vec4 ret = texture2DLod(projectionMap, tc, lod);
+
+ vec2 dist = tc-vec2(0.5);
+
+ float det = max(1.0-lod/(proj_lod*0.5), 0.0);
+
+ float d = dot(dist,dist);
+
+ ret *= min(clamp((0.25-d)/0.25, 0.0, 1.0)+det, 1.0);
+
+ return ret;
+}
+
+vec4 texture2DLodDiffuse(sampler2D projectionMap, vec2 tc, float lod)
+{
+ vec4 ret = texture2DLod(projectionMap, tc, lod);
+
+ vec2 dist = vec2(0.5) - abs(tc-vec2(0.5));
+
+ float det = min(lod/(proj_lod*0.5), 1.0);
+
+ float d = min(dist.x, dist.y);
+
+ float edge = 0.25*det;
+
+ ret *= clamp(d/edge, 0.0, 1.0);
+
+ return ret;
+}
+
+vec4 texture2DLodAmbient(sampler2D projectionMap, vec2 tc, float lod)
+{
+ vec4 ret = texture2DLod(projectionMap, tc, lod);
+
+ vec2 dist = tc-vec2(0.5);
+
+ float d = dot(dist,dist);
+
+ ret *= min(clamp((0.25-d)/0.25, 0.0, 1.0), 1.0);
+
+ return ret;
+}
+
+
vec4 getPosition(vec2 pos_screen)
{
- float depth = texture2DRect(depthMap, pos_screen.xy).a;
+ float depth = texture2DRect(depthMap, pos_screen.xy).r;
vec2 sc = pos_screen.xy*2.0;
sc /= screen_res;
sc -= vec2(1.0,1.0);
@@ -85,6 +133,15 @@ void main()
frag.xyz = frag.xyz*0.5+0.5;
frag.xy *= screen_res;
+ vec3 pos = getPosition(frag.xy).xyz;
+ vec3 lv = trans_center.xyz-pos.xyz;
+ float dist2 = dot(lv,lv);
+ dist2 /= size;
+ if (dist2 > 1.0)
+ {
+ discard;
+ }
+
float shadow = 1.0;
if (proj_shadow_idx >= 0)
@@ -96,17 +153,8 @@ void main()
shadow = min(sh[proj_shadow_idx]+shadow_fade, 1.0);
}
- vec3 pos = getPosition(frag.xy).xyz;
- vec3 lv = vary_light.xyz-pos.xyz;
- float dist2 = dot(lv,lv);
- dist2 /= vary_light.w;
- if (dist2 > 1.0)
- {
- discard;
- }
-
vec3 norm = texture2DRect(normalMap, frag.xy).xyz;
- norm = vec3((norm.xy-0.5)*2.0,norm.z); // unpack norm
+ norm = (norm.xyz-0.5)*2.0; // unpack norm
norm = normalize(norm);
float l_dist = -dot(lv, proj_n);
@@ -119,8 +167,12 @@ void main()
proj_tc.xyz /= proj_tc.w;
- float fa = vertex_color.a+1.0;
- float dist_atten = clamp(1.0-(dist2-1.0*(1.0-fa))/fa, 0.0, 1.0);
+ float fa = falloff+1.0;
+ float dist_atten = min(1.0-(dist2-1.0*(1.0-fa))/fa, 1.0);
+ if (dist_atten <= 0.0)
+ {
+ discard;
+ }
lv = proj_origin-pos.xyz;
lv = normalize(lv);
@@ -138,37 +190,33 @@ void main()
proj_tc.y > 0.0)
{
float lit = 0.0;
+ float amb_da = proj_ambiance;
+
if (da > 0.0)
{
float diff = clamp((l_dist-proj_focus)/proj_range, 0.0, 1.0);
float lod = diff * proj_lod;
- vec4 plcol = texture2DLod(projectionMap, proj_tc.xy, lod);
+ vec4 plcol = texture2DLodDiffuse(projectionMap, proj_tc.xy, lod);
- vec3 lcol = vertex_color.rgb * plcol.rgb * plcol.a;
+ vec3 lcol = color.rgb * plcol.rgb * plcol.a;
lit = da * dist_atten * noise;
col = lcol*lit*diff_tex*shadow;
- }
-
- float diff = clamp((proj_range-proj_focus)/proj_range, 0.0, 1.0);
- float lod = diff * proj_lod;
- vec4 amb_plcol = texture2DLod(projectionMap, proj_tc.xy, lod);
- //float amb_da = mix(proj_ambiance, proj_ambiance*max(-da, 0.0), max(da, 0.0));
- float amb_da = proj_ambiance;
- if (da > 0.0)
- {
amb_da += (da*0.5)*(1.0-shadow)*proj_ambiance;
}
+ //float diff = clamp((proj_range-proj_focus)/proj_range, 0.0, 1.0);
+ vec4 amb_plcol = texture2DLodAmbient(projectionMap, proj_tc.xy, proj_lod);
+
amb_da += (da*da*0.5+0.5)*proj_ambiance;
-
+
amb_da *= dist_atten * noise;
-
+
amb_da = min(amb_da, 1.0-lit);
-
- col += amb_da*vertex_color.rgb*diff_tex.rgb*amb_plcol.rgb*amb_plcol.a;
+
+ col += amb_da*color.rgb*diff_tex.rgb*amb_plcol.rgb*amb_plcol.a;
}
@@ -185,19 +233,23 @@ void main()
{
vec3 pfinal = pos + ref * dot(pdelta, proj_n)/ds;
- vec3 stc = (proj_mat * vec4(pfinal.xyz, 1.0)).xyz;
+ vec4 stc = (proj_mat * vec4(pfinal.xyz, 1.0));
if (stc.z > 0.0)
{
- stc.xy /= stc.z+proj_near;
-
+ stc.xy /= stc.w;
+
+ float fatten = clamp(spec.a*spec.a+spec.a*0.5, 0.25, 1.0);
+
+ stc.xy = (stc.xy - vec2(0.5)) * fatten + vec2(0.5);
+
if (stc.x < 1.0 &&
stc.y < 1.0 &&
stc.x > 0.0 &&
stc.y > 0.0)
{
- vec4 scol = texture2DLod(projectionMap, stc.xy, proj_lod-spec.a*proj_lod);
- col += dist_atten*scol.rgb*vertex_color.rgb*scol.a*spec.rgb*shadow;
+ vec4 scol = texture2DLodSpecular(projectionMap, stc.xy, proj_lod-spec.a*proj_lod);
+ col += dist_atten*scol.rgb*color.rgb*scol.a*spec.rgb*shadow;
}
}
}
diff --git a/indra/newview/app_settings/shaders/class2/deferred/sunLightF.glsl b/indra/newview/app_settings/shaders/class2/deferred/sunLightF.glsl
index db3d760359..890486c4b1 100644
--- a/indra/newview/app_settings/shaders/class2/deferred/sunLightF.glsl
+++ b/indra/newview/app_settings/shaders/class2/deferred/sunLightF.glsl
@@ -35,10 +35,10 @@ out vec4 frag_color;
uniform sampler2DRect depthMap;
uniform sampler2DRect normalMap;
-uniform sampler2DRectShadow shadowMap0;
-uniform sampler2DRectShadow shadowMap1;
-uniform sampler2DRectShadow shadowMap2;
-uniform sampler2DRectShadow shadowMap3;
+uniform sampler2DShadow shadowMap0;
+uniform sampler2DShadow shadowMap1;
+uniform sampler2DShadow shadowMap2;
+uniform sampler2DShadow shadowMap3;
uniform sampler2DShadow shadowMap4;
uniform sampler2DShadow shadowMap5;
@@ -55,10 +55,10 @@ VARYING vec2 vary_fragcoord;
uniform mat4 inv_proj;
uniform vec2 screen_res;
-uniform vec2 shadow_res;
uniform vec2 proj_shadow_res;
uniform vec3 sun_dir;
+uniform vec2 shadow_res;
uniform float shadow_bias;
uniform float shadow_offset;
@@ -78,30 +78,31 @@ vec4 getPosition(vec2 pos_screen)
return pos;
}
-float pcfShadow(sampler2DRectShadow shadowMap, vec4 stc, float scl, vec2 pos_screen)
+float pcfShadow(sampler2DShadow shadowMap, vec4 stc, float scl, vec2 pos_screen)
{
stc.xyz /= stc.w;
- stc.z += shadow_bias*scl;
+ stc.z += shadow_bias;
- stc.x = floor(stc.x + fract(pos_screen.y*0.666666666)); // add some jitter to X sample pos according to Y to disguise the snapping going on here
+ stc.x = floor(stc.x*shadow_res.x + fract(pos_screen.y*0.666666666))/shadow_res.x; // add some jitter to X sample pos according to Y to disguise the snapping going on here
+ float cs = shadow2D(shadowMap, stc.xyz).x;
- float cs = shadow2DRect(shadowMap, stc.xyz).x;
float shadow = cs;
- shadow += shadow2DRect(shadowMap, stc.xyz+vec3(2.0, 1.5, 0.0)).x;
- shadow += shadow2DRect(shadowMap, stc.xyz+vec3(1.0, -1.5, 0.0)).x;
- shadow += shadow2DRect(shadowMap, stc.xyz+vec3(-2.0, 1.5, 0.0)).x;
- shadow += shadow2DRect(shadowMap, stc.xyz+vec3(-1.0, -1.5, 0.0)).x;
+ shadow += shadow2D(shadowMap, stc.xyz+vec3(2.0/shadow_res.x, 1.5/shadow_res.y, 0.0)).x;
+ shadow += shadow2D(shadowMap, stc.xyz+vec3(1.0/shadow_res.x, -1.5/shadow_res.y, 0.0)).x;
+ shadow += shadow2D(shadowMap, stc.xyz+vec3(-2.0/shadow_res.x, 1.5/shadow_res.y, 0.0)).x;
+ shadow += shadow2D(shadowMap, stc.xyz+vec3(-1.0/shadow_res.x, -1.5/shadow_res.y, 0.0)).x;
+
- return shadow*0.2;
+ return shadow*0.2;
}
-float pcfShadow(sampler2DShadow shadowMap, vec4 stc, float scl, vec2 pos_screen)
+float pcfSpotShadow(sampler2DShadow shadowMap, vec4 stc, float scl, vec2 pos_screen)
{
stc.xyz /= stc.w;
stc.z += spot_shadow_bias*scl;
stc.x = floor(proj_shadow_res.x * stc.x + fract(pos_screen.y*0.666666666)) / proj_shadow_res.x; // snap
-
+
float cs = shadow2D(shadowMap, stc.xyz).x;
float shadow = cs;
@@ -125,7 +126,7 @@ void main()
vec4 pos = getPosition(pos_screen);
vec4 nmap4 = texture2DRect(normalMap, pos_screen);
- nmap4 = vec4((nmap4.xy-0.5)*2.0,nmap4.z,nmap4.w); // unpack norm
+ nmap4 = vec4((nmap4.xyz-0.5)*2.0,nmap4.w); // unpack norm
float displace = nmap4.w;
vec3 norm = nmap4.xyz;
@@ -162,8 +163,7 @@ void main()
if (spos.z < near_split.z)
{
lpos = shadow_matrix[3]*spos;
- lpos.xy *= shadow_res;
-
+
float w = 1.0;
w -= max(spos.z-far_split.z, 0.0)/transition_domain.z;
shadow += pcfShadow(shadowMap3, lpos, 0.25, pos_screen)*w;
@@ -174,8 +174,7 @@ void main()
if (spos.z < near_split.y && spos.z > far_split.z)
{
lpos = shadow_matrix[2]*spos;
- lpos.xy *= shadow_res;
-
+
float w = 1.0;
w -= max(spos.z-far_split.y, 0.0)/transition_domain.y;
w -= max(near_split.z-spos.z, 0.0)/transition_domain.z;
@@ -186,7 +185,6 @@ void main()
if (spos.z < near_split.x && spos.z > far_split.y)
{
lpos = shadow_matrix[1]*spos;
- lpos.xy *= shadow_res;
float w = 1.0;
w -= max(spos.z-far_split.x, 0.0)/transition_domain.x;
@@ -198,7 +196,6 @@ void main()
if (spos.z > far_split.x)
{
lpos = shadow_matrix[0]*spos;
- lpos.xy *= shadow_res;
float w = 1.0;
w -= max(near_split.x-spos.z, 0.0)/transition_domain.x;
@@ -237,11 +234,11 @@ void main()
//spotlight shadow 1
vec4 lpos = shadow_matrix[4]*spos;
- frag_color[2] = pcfShadow(shadowMap4, lpos, 0.8, pos_screen);
+ frag_color[2] = pcfSpotShadow(shadowMap4, lpos, 0.8, pos_screen);
//spotlight shadow 2
lpos = shadow_matrix[5]*spos;
- frag_color[3] = pcfShadow(shadowMap5, lpos, 0.8, pos_screen);
+ frag_color[3] = pcfSpotShadow(shadowMap5, lpos, 0.8, pos_screen);
//frag_color.rgb = pos.xyz;
//frag_color.b = shadow;
diff --git a/indra/newview/app_settings/shaders/class2/deferred/sunLightSSAOF.glsl b/indra/newview/app_settings/shaders/class2/deferred/sunLightSSAOF.glsl
index dfe108eb01..2dcd3d656f 100644
--- a/indra/newview/app_settings/shaders/class2/deferred/sunLightSSAOF.glsl
+++ b/indra/newview/app_settings/shaders/class2/deferred/sunLightSSAOF.glsl
@@ -34,10 +34,10 @@ out vec4 frag_color;
uniform sampler2DRect depthMap;
uniform sampler2DRect normalMap;
-uniform sampler2DRectShadow shadowMap0;
-uniform sampler2DRectShadow shadowMap1;
-uniform sampler2DRectShadow shadowMap2;
-uniform sampler2DRectShadow shadowMap3;
+uniform sampler2DShadow shadowMap0;
+uniform sampler2DShadow shadowMap1;
+uniform sampler2DShadow shadowMap2;
+uniform sampler2DShadow shadowMap3;
uniform sampler2DShadow shadowMap4;
uniform sampler2DShadow shadowMap5;
uniform sampler2D noiseMap;
@@ -55,10 +55,11 @@ VARYING vec2 vary_fragcoord;
uniform mat4 inv_proj;
uniform vec2 screen_res;
-uniform vec2 shadow_res;
uniform vec2 proj_shadow_res;
uniform vec3 sun_dir;
+uniform vec2 shadow_res;
+
uniform float shadow_bias;
uniform float shadow_offset;
@@ -139,30 +140,30 @@ float calcAmbientOcclusion(vec4 pos, vec3 norm)
return min(ret, 1.0);
}
-float pcfShadow(sampler2DRectShadow shadowMap, vec4 stc, float scl, vec2 pos_screen)
+float pcfShadow(sampler2DShadow shadowMap, vec4 stc, float scl, vec2 pos_screen)
{
stc.xyz /= stc.w;
- stc.z += shadow_bias*scl;
+ stc.z += shadow_bias;
- stc.x = floor(stc.x + fract(pos_screen.y*0.666666666));
+ stc.x = floor(stc.x*shadow_res.x + fract(pos_screen.y*0.666666666))/shadow_res.x;
+ float cs = shadow2D(shadowMap, stc.xyz).x;
- float cs = shadow2DRect(shadowMap, stc.xyz).x;
float shadow = cs;
- shadow += shadow2DRect(shadowMap, stc.xyz+vec3(2.0, 1.5, 0.0)).x;
- shadow += shadow2DRect(shadowMap, stc.xyz+vec3(1.0, -1.5, 0.0)).x;
- shadow += shadow2DRect(shadowMap, stc.xyz+vec3(-1.0, 1.5, 0.0)).x;
- shadow += shadow2DRect(shadowMap, stc.xyz+vec3(-2.0, -1.5, 0.0)).x;
-
+ shadow += shadow2D(shadowMap, stc.xyz+vec3(2.0/shadow_res.x, 1.5/shadow_res.y, 0.0)).x;
+ shadow += shadow2D(shadowMap, stc.xyz+vec3(1.0/shadow_res.x, -1.5/shadow_res.y, 0.0)).x;
+ shadow += shadow2D(shadowMap, stc.xyz+vec3(-1.0/shadow_res.x, 1.5/shadow_res.y, 0.0)).x;
+ shadow += shadow2D(shadowMap, stc.xyz+vec3(-2.0/shadow_res.x, -1.5/shadow_res.y, 0.0)).x;
+
return shadow*0.2;
}
-float pcfShadow(sampler2DShadow shadowMap, vec4 stc, float scl, vec2 pos_screen)
+float pcfSpotShadow(sampler2DShadow shadowMap, vec4 stc, float scl, vec2 pos_screen)
{
stc.xyz /= stc.w;
stc.z += spot_shadow_bias*scl;
stc.x = floor(proj_shadow_res.x * stc.x + fract(pos_screen.y*0.666666666)) / proj_shadow_res.x; // snap
-
+
float cs = shadow2D(shadowMap, stc.xyz).x;
float shadow = cs;
@@ -186,7 +187,7 @@ void main()
vec4 pos = getPosition(pos_screen);
vec4 nmap4 = texture2DRect(normalMap, pos_screen);
- nmap4 = vec4((nmap4.xy-0.5)*2.0,nmap4.z,nmap4.w); // unpack norm
+ nmap4 = vec4((nmap4.xyz-0.5)*2.0,nmap4.w); // unpack norm
float displace = nmap4.w;
vec3 norm = nmap4.xyz;
@@ -223,8 +224,7 @@ void main()
if (spos.z < near_split.z)
{
lpos = shadow_matrix[3]*spos;
- lpos.xy *= shadow_res;
-
+
float w = 1.0;
w -= max(spos.z-far_split.z, 0.0)/transition_domain.z;
shadow += pcfShadow(shadowMap3, lpos, 0.25, pos_screen)*w;
@@ -235,8 +235,7 @@ void main()
if (spos.z < near_split.y && spos.z > far_split.z)
{
lpos = shadow_matrix[2]*spos;
- lpos.xy *= shadow_res;
-
+
float w = 1.0;
w -= max(spos.z-far_split.y, 0.0)/transition_domain.y;
w -= max(near_split.z-spos.z, 0.0)/transition_domain.z;
@@ -247,8 +246,7 @@ void main()
if (spos.z < near_split.x && spos.z > far_split.y)
{
lpos = shadow_matrix[1]*spos;
- lpos.xy *= shadow_res;
-
+
float w = 1.0;
w -= max(spos.z-far_split.x, 0.0)/transition_domain.x;
w -= max(near_split.y-spos.z, 0.0)/transition_domain.y;
@@ -259,8 +257,7 @@ void main()
if (spos.z > far_split.x)
{
lpos = shadow_matrix[0]*spos;
- lpos.xy *= shadow_res;
-
+
float w = 1.0;
w -= max(near_split.x-spos.z, 0.0)/transition_domain.x;
@@ -298,11 +295,11 @@ void main()
//spotlight shadow 1
vec4 lpos = shadow_matrix[4]*spos;
- frag_color[2] = pcfShadow(shadowMap4, lpos, 0.8, pos_screen);
+ frag_color[2] = pcfSpotShadow(shadowMap4, lpos, 0.8, pos_screen);
//spotlight shadow 2
lpos = shadow_matrix[5]*spos;
- frag_color[3] = pcfShadow(shadowMap5, lpos, 0.8, pos_screen);
+ frag_color[3] = pcfSpotShadow(shadowMap5, lpos, 0.8, pos_screen);
//frag_color.rgb = pos.xyz;
//frag_color.b = shadow;
diff --git a/indra/newview/featuretable.txt b/indra/newview/featuretable.txt
index e8a109e661..eeb632acaf 100644
--- a/indra/newview/featuretable.txt
+++ b/indra/newview/featuretable.txt
@@ -520,6 +520,7 @@ Disregard128DefaultDrawDistance 1 0
list ATIOldDriver
RenderAvatarVP 0 0
RenderAvatarCloth 0 0
+RenderVBOEnable 1 0
// ATI cards generally perform better when not using VBOs for streaming data
diff --git a/indra/newview/featuretable_xp.txt b/indra/newview/featuretable_xp.txt
index 398a64378e..a945f7a693 100644
--- a/indra/newview/featuretable_xp.txt
+++ b/indra/newview/featuretable_xp.txt
@@ -517,6 +517,7 @@ Disregard128DefaultDrawDistance 1 0
list ATIOldDriver
RenderAvatarVP 0 0
RenderAvatarCloth 0 0
+RenderVBOEnable 1 0
// ATI cards generally perform better when not using VBOs for streaming data
diff --git a/indra/newview/llagent.cpp b/indra/newview/llagent.cpp
index 3367604753..447836910d 100755
--- a/indra/newview/llagent.cpp
+++ b/indra/newview/llagent.cpp
@@ -56,6 +56,7 @@
#include "llnavigationbar.h" // to show/hide navigation bar when changing mouse look state
#include "llnearbychatbar.h"
#include "llnotificationsutil.h"
+#include "llpanelpathfindingrebakenavmesh.h"
#include "llpaneltopinfobar.h"
#include "llparcel.h"
#include "llrendersphere.h"
@@ -81,6 +82,7 @@
#include "llviewermenu.h"
#include "llviewerobjectlist.h"
#include "llviewerparcelmgr.h"
+#include "llviewerregion.h"
#include "llviewerstats.h"
#include "llviewerwindow.h"
#include "llvoavatarself.h"
@@ -112,6 +114,105 @@ const F32 MAX_FIDGET_TIME = 20.f; // seconds
// The agent instance.
LLAgent gAgent;
+class LLTeleportRequest
+{
+public:
+ enum EStatus
+ {
+ kPending,
+ kStarted,
+ kFailed,
+ kRestartPending
+ };
+
+ LLTeleportRequest();
+ virtual ~LLTeleportRequest();
+
+ EStatus getStatus() const {return mStatus;};
+ void setStatus(EStatus pStatus) {mStatus = pStatus;};
+
+ virtual bool canRestartTeleport();
+
+ virtual void startTeleport() = 0;
+ virtual void restartTeleport();
+
+protected:
+
+private:
+ EStatus mStatus;
+};
+
+class LLTeleportRequestViaLandmark : public LLTeleportRequest
+{
+public:
+ LLTeleportRequestViaLandmark(const LLUUID &pLandmarkId);
+ virtual ~LLTeleportRequestViaLandmark();
+
+ virtual bool canRestartTeleport();
+
+ virtual void startTeleport();
+ virtual void restartTeleport();
+
+protected:
+ inline const LLUUID &getLandmarkId() const {return mLandmarkId;};
+
+private:
+ LLUUID mLandmarkId;
+};
+
+class LLTeleportRequestViaLure : public LLTeleportRequestViaLandmark
+{
+public:
+ LLTeleportRequestViaLure(const LLUUID &pLureId, BOOL pIsLureGodLike);
+ virtual ~LLTeleportRequestViaLure();
+
+ virtual bool canRestartTeleport();
+
+ virtual void startTeleport();
+
+protected:
+ inline BOOL isLureGodLike() const {return mIsLureGodLike;};
+
+private:
+ BOOL mIsLureGodLike;
+};
+
+class LLTeleportRequestViaLocation : public LLTeleportRequest
+{
+public:
+ LLTeleportRequestViaLocation(const LLVector3d &pPosGlobal);
+ virtual ~LLTeleportRequestViaLocation();
+
+ virtual bool canRestartTeleport();
+
+ virtual void startTeleport();
+ virtual void restartTeleport();
+
+protected:
+ inline const LLVector3d &getPosGlobal() const {return mPosGlobal;};
+
+private:
+ LLVector3d mPosGlobal;
+};
+
+
+class LLTeleportRequestViaLocationLookAt : public LLTeleportRequestViaLocation
+{
+public:
+ LLTeleportRequestViaLocationLookAt(const LLVector3d &pPosGlobal);
+ virtual ~LLTeleportRequestViaLocationLookAt();
+
+ virtual bool canRestartTeleport();
+
+ virtual void startTeleport();
+ virtual void restartTeleport();
+
+protected:
+
+private:
+
+};
+
//--------------------------------------------------------------------
// Statics
//
@@ -243,8 +344,20 @@ LLAgent::LLAgent() :
mbTeleportKeepsLookAt(false),
mAgentAccess(new LLAgentAccess(gSavedSettings)),
+ mGodLevelChangeSignal(),
mCanEditParcel(false),
mTeleportSourceSLURL(new LLSLURL),
+ mTeleportRequest(),
+ mTeleportFinishedSlot(),
+ mTeleportFailedSlot(),
+ mIsMaturityRatingChangingDuringTeleport(false),
+ mMaturityRatingChange(0U),
+ mIsDoSendMaturityPreferenceToServer(false),
+ mMaturityPreferenceRequestId(0U),
+ mMaturityPreferenceResponseId(0U),
+ mMaturityPreferenceNumRetries(0U),
+ mLastKnownRequestMaturity(SIM_ACCESS_MIN),
+ mLastKnownResponseMaturity(SIM_ACCESS_MIN),
mTeleportState( TELEPORT_NONE ),
mRegionp(NULL),
@@ -330,9 +443,21 @@ void LLAgent::init()
gSavedSettings.getControl("PreferredMaturity")->getValidateSignal()->connect(boost::bind(&LLAgent::validateMaturity, this, _2));
gSavedSettings.getControl("PreferredMaturity")->getSignal()->connect(boost::bind(&LLAgent::handleMaturity, this, _2));
+ mLastKnownResponseMaturity = static_cast<U8>(gSavedSettings.getU32("PreferredMaturity"));
+ mLastKnownRequestMaturity = mLastKnownResponseMaturity;
+ mIsDoSendMaturityPreferenceToServer = true;
LLViewerParcelMgr::getInstance()->addAgentParcelChangedCallback(boost::bind(&LLAgent::parcelChangedCallback));
+ if (!mTeleportFinishedSlot.connected())
+ {
+ mTeleportFinishedSlot = LLViewerParcelMgr::getInstance()->setTeleportFinishedCallback(boost::bind(&LLAgent::handleTeleportFinished, this));
+ }
+ if (!mTeleportFailedSlot.connected())
+ {
+ mTeleportFailedSlot = LLViewerParcelMgr::getInstance()->setTeleportFailedCallback(boost::bind(&LLAgent::handleTeleportFailed, this));
+ }
+
mInitialized = TRUE;
}
@@ -342,6 +467,14 @@ void LLAgent::init()
void LLAgent::cleanup()
{
mRegionp = NULL;
+ if (mTeleportFinishedSlot.connected())
+ {
+ mTeleportFinishedSlot.disconnect();
+ }
+ if (mTeleportFailedSlot.connected())
+ {
+ mTeleportFailedSlot.disconnect();
+ }
}
//-----------------------------------------------------------------------------
@@ -1869,6 +2002,7 @@ void LLAgent::endAnimationUpdateUI()
LLChicletBar::getInstance()->setVisible(TRUE);
LLPanelStandStopFlying::getInstance()->setVisible(TRUE);
+ LLPanelPathfindingRebakeNavmesh::getInstance()->setVisible(TRUE);
LLToolMgr::getInstance()->setCurrentToolset(gBasicToolset);
@@ -1978,6 +2112,7 @@ void LLAgent::endAnimationUpdateUI()
LLChicletBar::getInstance()->setVisible(FALSE);
LLPanelStandStopFlying::getInstance()->setVisible(FALSE);
+ LLPanelPathfindingRebakeNavmesh::getInstance()->setVisible(FALSE);
// clear out camera lag effect
gAgentCamera.clearCameraLag();
@@ -2371,49 +2506,278 @@ bool LLAgent::isAdult() const
return mAgentAccess->isAdult();
}
-void LLAgent::setTeen(bool teen)
-{
- mAgentAccess->setTeen(teen);
-}
-
//static
int LLAgent::convertTextToMaturity(char text)
{
return LLAgentAccess::convertTextToMaturity(text);
}
-bool LLAgent::sendMaturityPreferenceToServer(int preferredMaturity)
+class LLMaturityPreferencesResponder : public LLHTTPClient::Responder
{
- if (!getRegion())
- return false;
+public:
+ LLMaturityPreferencesResponder(LLAgent *pAgent, U8 pPreferredMaturity, U8 pPreviousMaturity);
+ virtual ~LLMaturityPreferencesResponder();
+
+ virtual void result(const LLSD &pContent);
+ virtual void error(U32 pStatus, const std::string& pReason);
+
+protected:
+
+private:
+ U8 parseMaturityFromServerResponse(const LLSD &pContent);
+
+ LLAgent *mAgent;
+ U8 mPreferredMaturity;
+ U8 mPreviousMaturity;
+};
+
+LLMaturityPreferencesResponder::LLMaturityPreferencesResponder(LLAgent *pAgent, U8 pPreferredMaturity, U8 pPreviousMaturity)
+ : LLHTTPClient::Responder(),
+ mAgent(pAgent),
+ mPreferredMaturity(pPreferredMaturity),
+ mPreviousMaturity(pPreviousMaturity)
+{
+}
+
+LLMaturityPreferencesResponder::~LLMaturityPreferencesResponder()
+{
+}
+
+void LLMaturityPreferencesResponder::result(const LLSD &pContent)
+{
+ U8 actualMaturity = parseMaturityFromServerResponse(pContent);
+
+ if (actualMaturity != mPreferredMaturity)
+ {
+ llwarns << "while attempting to change maturity preference from '" << LLViewerRegion::accessToString(mPreviousMaturity)
+ << "' to '" << LLViewerRegion::accessToString(mPreferredMaturity) << "', the server responded with '"
+ << LLViewerRegion::accessToString(actualMaturity) << "' [value:" << static_cast<U32>(actualMaturity) << ", llsd:"
+ << pContent << "]" << llendl;
+ }
+ mAgent->handlePreferredMaturityResult(actualMaturity);
+}
+
+void LLMaturityPreferencesResponder::error(U32 pStatus, const std::string& pReason)
+{
+ llwarns << "while attempting to change maturity preference from '" << LLViewerRegion::accessToString(mPreviousMaturity)
+ << "' to '" << LLViewerRegion::accessToString(mPreferredMaturity) << "', we got an error because '"
+ << pReason << "' [status:" << pStatus << "]" << llendl;
+ mAgent->handlePreferredMaturityError();
+}
+
+U8 LLMaturityPreferencesResponder::parseMaturityFromServerResponse(const LLSD &pContent)
+{
+ // stinson 05/24/2012 Pathfinding regions have re-defined the response behavior. In the old server code,
+ // if you attempted to change the preferred maturity to the same value, the response content would be an
+ // undefined LLSD block. In the new server code with pathfinding, the response content should always be
+ // defined. Thus, the check for isUndefined() can be replaced with an assert after pathfinding is merged
+ // into server trunk and fully deployed.
+ U8 maturity = SIM_ACCESS_MIN;
+ if (pContent.isUndefined())
+ {
+ maturity = mPreferredMaturity;
+ }
+ else
+ {
+ llassert(!pContent.isUndefined());
+ llassert(pContent.isMap());
- // Update agent access preference on the server
- std::string url = getRegion()->getCapability("UpdateAgentInformation");
- if (!url.empty())
+ if (!pContent.isUndefined() && pContent.isMap())
+ {
+ // stinson 05/24/2012 Pathfinding regions have re-defined the response syntax. The if statement catches
+ // the new syntax, and the else statement catches the old syntax. After pathfinding is merged into
+ // server trunk and fully deployed, we can remove the else statement.
+ if (pContent.has("access_prefs"))
+ {
+ llassert(pContent.has("access_prefs"));
+ llassert(pContent.get("access_prefs").isMap());
+ llassert(pContent.get("access_prefs").has("max"));
+ llassert(pContent.get("access_prefs").get("max").isString());
+ if (pContent.get("access_prefs").isMap() && pContent.get("access_prefs").has("max") &&
+ pContent.get("access_prefs").get("max").isString())
+ {
+ LLSD::String actualPreference = pContent.get("access_prefs").get("max").asString();
+ LLStringUtil::trim(actualPreference);
+ maturity = LLViewerRegion::shortStringToAccess(actualPreference);
+ }
+ }
+ else if (pContent.has("max"))
+ {
+ llassert(pContent.get("max").isString());
+ if (pContent.get("max").isString())
+ {
+ LLSD::String actualPreference = pContent.get("max").asString();
+ LLStringUtil::trim(actualPreference);
+ maturity = LLViewerRegion::shortStringToAccess(actualPreference);
+ }
+ }
+ }
+ }
+
+ return maturity;
+}
+
+void LLAgent::handlePreferredMaturityResult(U8 pServerMaturity)
+{
+ // Update the number of responses received
+ ++mMaturityPreferenceResponseId;
+ llassert(mMaturityPreferenceResponseId <= mMaturityPreferenceRequestId);
+
+ // Update the last known server maturity response
+ mLastKnownResponseMaturity = pServerMaturity;
+
+ // Ignore all responses if we know there are more unanswered requests that are expected
+ if (mMaturityPreferenceResponseId == mMaturityPreferenceRequestId)
{
- // Set new access preference
- LLSD access_prefs = LLSD::emptyMap();
- if (preferredMaturity == SIM_ACCESS_PG)
+ // If we received a response that matches the last known request, then we are good
+ if (mLastKnownRequestMaturity == mLastKnownResponseMaturity)
{
- access_prefs["max"] = "PG";
+ mMaturityPreferenceNumRetries = 0;
+ reportPreferredMaturitySuccess();
+ llassert(static_cast<U8>(gSavedSettings.getU32("PreferredMaturity")) == mLastKnownResponseMaturity);
}
- else if (preferredMaturity == SIM_ACCESS_MATURE)
+ // Else, the viewer is out of sync with the server, so let's try to re-sync with the
+ // server by re-sending our last known request. Cap the re-tries at 3 just to be safe.
+ else if (++mMaturityPreferenceNumRetries <= 3)
{
- access_prefs["max"] = "M";
+ llinfos << "Retrying attempt #" << mMaturityPreferenceNumRetries << " to set viewer preferred maturity to '"
+ << LLViewerRegion::accessToString(mLastKnownRequestMaturity) << "'" << llendl;
+ sendMaturityPreferenceToServer(mLastKnownRequestMaturity);
}
- if (preferredMaturity == SIM_ACCESS_ADULT)
+ // Else, the viewer is style out of sync with the server after 3 retries, so inform the user
+ else
{
- access_prefs["max"] = "A";
+ mMaturityPreferenceNumRetries = 0;
+ reportPreferredMaturityError();
+ }
+ }
+}
+
+void LLAgent::handlePreferredMaturityError()
+{
+ // Update the number of responses received
+ ++mMaturityPreferenceResponseId;
+ llassert(mMaturityPreferenceResponseId <= mMaturityPreferenceRequestId);
+
+ // Ignore all responses if we know there are more unanswered requests that are expected
+ if (mMaturityPreferenceResponseId == mMaturityPreferenceRequestId)
+ {
+ mMaturityPreferenceNumRetries = 0;
+
+ // If we received a response that matches the last known request, then we are synced with
+ // the server, but not quite sure why we are
+ if (mLastKnownRequestMaturity == mLastKnownResponseMaturity)
+ {
+ llwarns << "Got an error but maturity preference '" << LLViewerRegion::accessToString(mLastKnownRequestMaturity)
+ << "' seems to be in sync with the server" << llendl;
+ reportPreferredMaturitySuccess();
+ }
+ // Else, the more likely case is that the last request does not match the last response,
+ // so inform the user
+ else
+ {
+ reportPreferredMaturityError();
+ }
+ }
+}
+
+void LLAgent::reportPreferredMaturitySuccess()
+{
+ // If there is a pending teleport request waiting for the maturity preference to be synced with
+ // the server, let's start the pending request
+ if (hasPendingTeleportRequest())
+ {
+ startTeleportRequest();
+ }
+}
+
+void LLAgent::reportPreferredMaturityError()
+{
+ // If there is a pending teleport request waiting for the maturity preference to be synced with
+ // the server, we were unable to successfully sync with the server on maturity preference, so let's
+ // just raise the screen.
+ mIsMaturityRatingChangingDuringTeleport = false;
+ if (hasPendingTeleportRequest())
+ {
+ setTeleportState(LLAgent::TELEPORT_NONE);
+ }
+
+ // Get the last known maturity request from the user activity
+ std::string preferredMaturity = LLViewerRegion::accessToString(mLastKnownRequestMaturity);
+ LLStringUtil::toLower(preferredMaturity);
+
+ // Get the last known maturity response from the server
+ std::string actualMaturity = LLViewerRegion::accessToString(mLastKnownResponseMaturity);
+ LLStringUtil::toLower(actualMaturity);
+
+ // Notify the user
+ LLSD args = LLSD::emptyMap();
+ args["PREFERRED_MATURITY"] = preferredMaturity;
+ args["ACTUAL_MATURITY"] = actualMaturity;
+ LLNotificationsUtil::add("MaturityChangeError", args);
+
+ // Check the saved settings to ensure that we are consistent. If we are not consistent, update
+ // the viewer, but do not send anything to server
+ U8 localMaturity = static_cast<U8>(gSavedSettings.getU32("PreferredMaturity"));
+ if (localMaturity != mLastKnownResponseMaturity)
+ {
+ bool tmpIsDoSendMaturityPreferenceToServer = mIsDoSendMaturityPreferenceToServer;
+ mIsDoSendMaturityPreferenceToServer = false;
+ llinfos << "Setting viewer preferred maturity to '" << LLViewerRegion::accessToString(mLastKnownResponseMaturity) << "'" << llendl;
+ gSavedSettings.setU32("PreferredMaturity", static_cast<U32>(mLastKnownResponseMaturity));
+ mIsDoSendMaturityPreferenceToServer = tmpIsDoSendMaturityPreferenceToServer;
+ }
+}
+
+bool LLAgent::isMaturityPreferenceSyncedWithServer() const
+{
+ return (mMaturityPreferenceRequestId == mMaturityPreferenceResponseId);
+}
+
+void LLAgent::sendMaturityPreferenceToServer(U8 pPreferredMaturity)
+{
+ // Only send maturity preference to the server if enabled
+ if (mIsDoSendMaturityPreferenceToServer)
+ {
+ // Increment the number of requests. The handlers manage a separate count of responses.
+ ++mMaturityPreferenceRequestId;
+
+ // Update the last know maturity request
+ mLastKnownRequestMaturity = pPreferredMaturity;
+
+ // Create a response handler
+ LLHTTPClient::ResponderPtr responderPtr = LLHTTPClient::ResponderPtr(new LLMaturityPreferencesResponder(this, pPreferredMaturity, mLastKnownResponseMaturity));
+
+ // If we don't have a region, report it as an error
+ if (getRegion() == NULL)
+ {
+ responderPtr->error(0U, "region is not defined");
+ }
+ else
+ {
+ // Find the capability to send maturity preference
+ std::string url = getRegion()->getCapability("UpdateAgentInformation");
+
+ // If the capability is not defined, report it as an error
+ if (url.empty())
+ {
+ responderPtr->error(0U, "capability 'UpdateAgentInformation' is not defined for region");
+ }
+ else
+ {
+ // Set new access preference
+ LLSD access_prefs = LLSD::emptyMap();
+ access_prefs["max"] = LLViewerRegion::accessToShortString(pPreferredMaturity);
+
+ LLSD body = LLSD::emptyMap();
+ body["access_prefs"] = access_prefs;
+ llinfos << "Sending viewer preferred maturity to '" << LLViewerRegion::accessToString(pPreferredMaturity)
+ << "' via capability to: " << url << llendl;
+ LLSD headers;
+ LLHTTPClient::post(url, body, responderPtr, headers, 30.0f);
+ }
}
-
- LLSD body = LLSD::emptyMap();
- body["access_prefs"] = access_prefs;
- llinfos << "Sending access prefs update to " << (access_prefs["max"].asString()) << " via capability to: "
- << url << llendl;
- LLHTTPClient::post(url, body, new LLHTTPClient::Responder()); // Ignore response
- return true;
}
- return false;
}
BOOL LLAgent::getAdminOverride() const
@@ -2434,11 +2798,12 @@ void LLAgent::setAdminOverride(BOOL b)
void LLAgent::setGodLevel(U8 god_level)
{
mAgentAccess->setGodLevel(god_level);
+ mGodLevelChangeSignal(god_level);
}
-void LLAgent::setAOTransition()
+LLAgent::god_level_change_slot_t LLAgent::registerGodLevelChanageListener(god_level_change_callback_t pGodLevelChangeCallback)
{
- mAgentAccess->setTransition();
+ return mGodLevelChangeSignal.connect(pGodLevelChangeCallback);
}
const LLAgentAccess& LLAgent::getAgentAccess()
@@ -2451,9 +2816,9 @@ bool LLAgent::validateMaturity(const LLSD& newvalue)
return mAgentAccess->canSetMaturity(newvalue.asInteger());
}
-void LLAgent::handleMaturity(const LLSD& newvalue)
+void LLAgent::handleMaturity(const LLSD &pNewValue)
{
- sendMaturityPreferenceToServer(newvalue.asInteger());
+ sendMaturityPreferenceToServer(static_cast<U8>(pNewValue.asInteger()));
}
//----------------------------------------------------------------------------
@@ -3388,7 +3753,7 @@ void LLAgent::clearVisualParams(void *data)
// protected
bool LLAgent::teleportCore(bool is_local)
{
- if(TELEPORT_NONE != mTeleportState)
+ if ((TELEPORT_NONE != mTeleportState) && (mTeleportState != TELEPORT_PENDING))
{
llwarns << "Attempt to teleport when already teleporting." << llendl;
return false;
@@ -3466,6 +3831,102 @@ bool LLAgent::teleportCore(bool is_local)
return true;
}
+bool LLAgent::hasRestartableFailedTeleportRequest()
+{
+ return ((mTeleportRequest != NULL) && (mTeleportRequest->getStatus() == LLTeleportRequest::kFailed) &&
+ mTeleportRequest->canRestartTeleport());
+}
+
+void LLAgent::restartFailedTeleportRequest()
+{
+ if (hasRestartableFailedTeleportRequest())
+ {
+ mTeleportRequest->setStatus(LLTeleportRequest::kRestartPending);
+ startTeleportRequest();
+ }
+}
+
+void LLAgent::clearTeleportRequest()
+{
+ mTeleportRequest.reset();
+}
+
+void LLAgent::setMaturityRatingChangeDuringTeleport(U8 pMaturityRatingChange)
+{
+ mIsMaturityRatingChangingDuringTeleport = true;
+ mMaturityRatingChange = pMaturityRatingChange;
+}
+
+bool LLAgent::hasPendingTeleportRequest()
+{
+ return ((mTeleportRequest != NULL) &&
+ ((mTeleportRequest->getStatus() == LLTeleportRequest::kPending) ||
+ (mTeleportRequest->getStatus() == LLTeleportRequest::kRestartPending)));
+}
+
+void LLAgent::startTeleportRequest()
+{
+ if (hasPendingTeleportRequest())
+ {
+ if (!isMaturityPreferenceSyncedWithServer())
+ {
+ gTeleportDisplay = TRUE;
+ setTeleportState(TELEPORT_PENDING);
+ }
+ else
+ {
+ switch (mTeleportRequest->getStatus())
+ {
+ case LLTeleportRequest::kPending :
+ mTeleportRequest->setStatus(LLTeleportRequest::kStarted);
+ mTeleportRequest->startTeleport();
+ break;
+ case LLTeleportRequest::kRestartPending :
+ llassert(mTeleportRequest->canRestartTeleport());
+ mTeleportRequest->setStatus(LLTeleportRequest::kStarted);
+ mTeleportRequest->restartTeleport();
+ break;
+ default :
+ llassert(0);
+ break;
+ }
+ }
+ }
+}
+
+void LLAgent::handleTeleportFinished()
+{
+ clearTeleportRequest();
+ if (mIsMaturityRatingChangingDuringTeleport)
+ {
+ // notify user that the maturity preference has been changed
+ std::string maturityRating = LLViewerRegion::accessToString(mMaturityRatingChange);
+ LLStringUtil::toLower(maturityRating);
+ LLSD args;
+ args["RATING"] = maturityRating;
+ LLNotificationsUtil::add("PreferredMaturityChanged", args);
+ mIsMaturityRatingChangingDuringTeleport = false;
+ }
+}
+
+void LLAgent::handleTeleportFailed()
+{
+ if (mTeleportRequest != NULL)
+ {
+ mTeleportRequest->setStatus(LLTeleportRequest::kFailed);
+ }
+ if (mIsMaturityRatingChangingDuringTeleport)
+ {
+ // notify user that the maturity preference has been changed
+ std::string maturityRating = LLViewerRegion::accessToString(mMaturityRatingChange);
+ LLStringUtil::toLower(maturityRating);
+ LLSD args;
+ args["RATING"] = maturityRating;
+ LLNotificationsUtil::add("PreferredMaturityChanged", args);
+ mIsMaturityRatingChangingDuringTeleport = false;
+ }
+}
+
void LLAgent::teleportRequest(
const U64& region_handle,
const LLVector3& pos_local,
@@ -3498,6 +3959,12 @@ void LLAgent::teleportRequest(
// Landmark ID = LLUUID::null means teleport home
void LLAgent::teleportViaLandmark(const LLUUID& landmark_asset_id)
{
+ mTeleportRequest = LLTeleportRequestPtr(new LLTeleportRequestViaLandmark(landmark_asset_id));
+ startTeleportRequest();
+}
+
+void LLAgent::doTeleportViaLandmark(const LLUUID& landmark_asset_id)
+{
LLViewerRegion *regionp = getRegion();
if(regionp && teleportCore())
{
@@ -3513,6 +3980,12 @@ void LLAgent::teleportViaLandmark(const LLUUID& landmark_asset_id)
void LLAgent::teleportViaLure(const LLUUID& lure_id, BOOL godlike)
{
+ mTeleportRequest = LLTeleportRequestPtr(new LLTeleportRequestViaLure(lure_id, godlike));
+ startTeleportRequest();
+}
+
+void LLAgent::doTeleportViaLure(const LLUUID& lure_id, BOOL godlike)
+{
LLViewerRegion* regionp = getRegion();
if(regionp && teleportCore())
{
@@ -3544,24 +4017,33 @@ void LLAgent::teleportViaLure(const LLUUID& lure_id, BOOL godlike)
// James Cook, July 28, 2005
void LLAgent::teleportCancel()
{
- LLViewerRegion* regionp = getRegion();
- if(regionp)
+ if (!hasPendingTeleportRequest())
{
- // send the message
- LLMessageSystem* msg = gMessageSystem;
- msg->newMessage("TeleportCancel");
- msg->nextBlockFast(_PREHASH_Info);
- msg->addUUIDFast(_PREHASH_AgentID, getID());
- msg->addUUIDFast(_PREHASH_SessionID, getSessionID());
- sendReliableMessage();
- }
- gTeleportDisplay = FALSE;
+ LLViewerRegion* regionp = getRegion();
+ if(regionp)
+ {
+ // send the message
+ LLMessageSystem* msg = gMessageSystem;
+ msg->newMessage("TeleportCancel");
+ msg->nextBlockFast(_PREHASH_Info);
+ msg->addUUIDFast(_PREHASH_AgentID, getID());
+ msg->addUUIDFast(_PREHASH_SessionID, getSessionID());
+ sendReliableMessage();
+ }
+ }
+ clearTeleportRequest();
gAgent.setTeleportState( LLAgent::TELEPORT_NONE );
}
void LLAgent::teleportViaLocation(const LLVector3d& pos_global)
{
+ mTeleportRequest = LLTeleportRequestPtr(new LLTeleportRequestViaLocation(pos_global));
+ startTeleportRequest();
+}
+
+void LLAgent::doTeleportViaLocation(const LLVector3d& pos_global)
+{
LLViewerRegion* regionp = getRegion();
U64 handle = to_region_handle(pos_global);
LLSimInfo* info = LLWorldMap::getInstance()->simInfoFromHandle(handle);
@@ -3604,6 +4086,12 @@ void LLAgent::teleportViaLocation(const LLVector3d& pos_global)
// Teleport to global position, but keep facing in the same direction
void LLAgent::teleportViaLocationLookAt(const LLVector3d& pos_global)
{
+ mTeleportRequest = LLTeleportRequestPtr(new LLTeleportRequestViaLocationLookAt(pos_global));
+ startTeleportRequest();
+}
+
+void LLAgent::doTeleportViaLocationLookAt(const LLVector3d& pos_global)
+{
mbTeleportKeepsLookAt = true;
gAgentCamera.setFocusOnAvatar(FALSE, ANIMATE); // detach camera form avatar, so it keeps direction
U64 region_handle = to_region_handle(pos_global);
@@ -4045,5 +4533,149 @@ LLAgentQueryManager::~LLAgentQueryManager()
{
}
-// EOF
+//-----------------------------------------------------------------------------
+// LLTeleportRequest
+//-----------------------------------------------------------------------------
+
+LLTeleportRequest::LLTeleportRequest()
+ : mStatus(kPending)
+{
+}
+
+LLTeleportRequest::~LLTeleportRequest()
+{
+}
+
+bool LLTeleportRequest::canRestartTeleport()
+{
+ return false;
+}
+
+void LLTeleportRequest::restartTeleport()
+{
+ llassert(0);
+}
+
+//-----------------------------------------------------------------------------
+// LLTeleportRequestViaLandmark
+//-----------------------------------------------------------------------------
+
+LLTeleportRequestViaLandmark::LLTeleportRequestViaLandmark(const LLUUID &pLandmarkId)
+ : LLTeleportRequest(),
+ mLandmarkId(pLandmarkId)
+{
+}
+
+LLTeleportRequestViaLandmark::~LLTeleportRequestViaLandmark()
+{
+}
+
+bool LLTeleportRequestViaLandmark::canRestartTeleport()
+{
+ return true;
+}
+
+void LLTeleportRequestViaLandmark::startTeleport()
+{
+ gAgent.doTeleportViaLandmark(getLandmarkId());
+}
+
+void LLTeleportRequestViaLandmark::restartTeleport()
+{
+ gAgent.doTeleportViaLandmark(getLandmarkId());
+}
+
+//-----------------------------------------------------------------------------
+// LLTeleportRequestViaLure
+//-----------------------------------------------------------------------------
+
+LLTeleportRequestViaLure::LLTeleportRequestViaLure(const LLUUID &pLureId, BOOL pIsLureGodLike)
+ : LLTeleportRequestViaLandmark(pLureId),
+ mIsLureGodLike(pIsLureGodLike)
+{
+}
+
+LLTeleportRequestViaLure::~LLTeleportRequestViaLure()
+{
+}
+
+bool LLTeleportRequestViaLure::canRestartTeleport()
+{
+ // stinson 05/17/2012 : cannot restart a teleport via lure because of server-side restrictions
+ // The current scenario is as follows:
+ // 1. User A initializes a request for User B to teleport via lure
+ // 2. User B accepts the teleport via lure request
+ // 3. The server sees the init request from User A and the accept request from User B and matches them up
+ // 4. The server then removes the paired requests up from the "queue"
+ // 5. The server then fails User B's teleport for reason of maturity level (for example)
+ // 6. User B's viewer prompts user to increase their maturity level profile value.
+ // 7. User B confirms and accepts increase in maturity level
+ // 8. User B's viewer then attempts to teleport via lure again
+ // 9. This request will time-out on the viewer-side because User A's initial request has been removed from the "queue" in step 4
+
+ return false;
+}
+
+void LLTeleportRequestViaLure::startTeleport()
+{
+ gAgent.doTeleportViaLure(getLandmarkId(), isLureGodLike());
+}
+//-----------------------------------------------------------------------------
+// LLTeleportRequestViaLocation
+//-----------------------------------------------------------------------------
+
+LLTeleportRequestViaLocation::LLTeleportRequestViaLocation(const LLVector3d &pPosGlobal)
+ : LLTeleportRequest(),
+ mPosGlobal(pPosGlobal)
+{
+}
+
+LLTeleportRequestViaLocation::~LLTeleportRequestViaLocation()
+{
+}
+
+bool LLTeleportRequestViaLocation::canRestartTeleport()
+{
+ return true;
+}
+
+void LLTeleportRequestViaLocation::startTeleport()
+{
+ gAgent.doTeleportViaLocation(getPosGlobal());
+}
+
+void LLTeleportRequestViaLocation::restartTeleport()
+{
+ gAgent.doTeleportViaLocation(getPosGlobal());
+}
+
+//-----------------------------------------------------------------------------
+// LLTeleportRequestViaLocationLookAt
+//-----------------------------------------------------------------------------
+
+LLTeleportRequestViaLocationLookAt::LLTeleportRequestViaLocationLookAt(const LLVector3d &pPosGlobal)
+ : LLTeleportRequestViaLocation(pPosGlobal)
+{
+}
+
+LLTeleportRequestViaLocationLookAt::~LLTeleportRequestViaLocationLookAt()
+{
+}
+
+bool LLTeleportRequestViaLocationLookAt::canRestartTeleport()
+{
+ return true;
+}
+
+void LLTeleportRequestViaLocationLookAt::startTeleport()
+{
+ gAgent.doTeleportViaLocationLookAt(getPosGlobal());
+}
+
+void LLTeleportRequestViaLocationLookAt::restartTeleport()
+{
+ gAgent.doTeleportViaLocationLookAt(getPosGlobal());
+}
+
+// EOF
diff --git a/indra/newview/llagent.h b/indra/newview/llagent.h
index 740770bbdf..99904e118c 100644
--- a/indra/newview/llagent.h
+++ b/indra/newview/llagent.h
@@ -35,6 +35,8 @@
#include "llcoordframe.h" // for mFrameAgent
#include "llvoavatardefines.h"
+#include <boost/function.hpp>
+#include <boost/shared_ptr.hpp>
#include <boost/signals2.hpp>
extern const BOOL ANIMATE;
@@ -56,6 +58,9 @@ class LLAgentAccess;
class LLSLURL;
class LLPauseRequestHandle;
class LLUIColor;
+class LLTeleportRequest;
+
+typedef boost::shared_ptr<LLTeleportRequest> LLTeleportRequestPtr;
//--------------------------------------------------------------------
// Types
@@ -539,7 +544,8 @@ public:
TELEPORT_MOVING = 3, // Viewer has received destination location from source simulator
TELEPORT_START_ARRIVAL = 4, // Transition to ARRIVING. Viewer has received avatar update, etc., from destination simulator
TELEPORT_ARRIVING = 5, // Make the user wait while content "pre-caches"
- TELEPORT_LOCAL = 6 // Teleporting in-sim without showing the progress screen
+ TELEPORT_LOCAL = 6, // Teleporting in-sim without showing the progress screen
+ TELEPORT_PENDING = 7
};
public:
@@ -556,9 +562,6 @@ private:
// Teleport Actions
//--------------------------------------------------------------------
public:
- void teleportRequest(const U64& region_handle,
- const LLVector3& pos_local, // Go to a named location home
- bool look_at_from_camera = false);
void teleportViaLandmark(const LLUUID& landmark_id); // Teleport to a landmark
void teleportHome() { teleportViaLandmark(LLUUID::null); } // Go home
void teleportViaLure(const LLUUID& lure_id, BOOL godlike); // To an invited location
@@ -572,6 +575,44 @@ protected:
//--------------------------------------------------------------------
// Teleport State
//--------------------------------------------------------------------
+
+public:
+ bool hasRestartableFailedTeleportRequest();
+ void restartFailedTeleportRequest();
+ void clearTeleportRequest();
+ void setMaturityRatingChangeDuringTeleport(U8 pMaturityRatingChange);
+
+private:
+ friend class LLTeleportRequest;
+ friend class LLTeleportRequestViaLandmark;
+ friend class LLTeleportRequestViaLure;
+ friend class LLTeleportRequestViaLocation;
+ friend class LLTeleportRequestViaLocationLookAt;
+
+ LLTeleportRequestPtr mTeleportRequest;
+ boost::signals2::connection mTeleportFinishedSlot;
+ boost::signals2::connection mTeleportFailedSlot;
+
+ bool mIsMaturityRatingChangingDuringTeleport;
+ U8 mMaturityRatingChange;
+
+ bool hasPendingTeleportRequest();
+ void startTeleportRequest();
+
+ void teleportRequest(const U64& region_handle,
+ const LLVector3& pos_local, // Go to a named location home
+ bool look_at_from_camera = false);
+ void doTeleportViaLandmark(const LLUUID& landmark_id); // Teleport to a landmark
+ void doTeleportViaLure(const LLUUID& lure_id, BOOL godlike); // To an invited location
+ void doTeleportViaLocation(const LLVector3d& pos_global); // To a global location - this will probably need to be deprecated
+ void doTeleportViaLocationLookAt(const LLVector3d& pos_global);// To a global location, preserving camera rotation
+
+ void handleTeleportFinished();
+ void handleTeleportFailed();
+
+ //--------------------------------------------------------------------
+ // Teleport State
+ //--------------------------------------------------------------------
public:
ETeleportState getTeleportState() const { return mTeleportState; }
void setTeleportState(ETeleportState state);
@@ -614,8 +655,6 @@ public:
const LLAgentAccess& getAgentAccess();
BOOL canManageEstate() const;
BOOL getAdminOverride() const;
- // ! BACKWARDS COMPATIBILITY ! This function can go away after the AO transition (see llstartup.cpp).
- void setAOTransition();
private:
LLAgentAccess * mAgentAccess;
@@ -631,6 +670,16 @@ public:
void requestEnterGodMode();
void requestLeaveGodMode();
+ typedef boost::function<void (U8)> god_level_change_callback_t;
+ typedef boost::signals2::signal<void (U8)> god_level_change_signal_t;
+ typedef boost::signals2::connection god_level_change_slot_t;
+
+ god_level_change_slot_t registerGodLevelChanageListener(god_level_change_callback_t pGodLevelChangeCallback);
+
+private:
+ god_level_change_signal_t mGodLevelChangeSignal;
+
+
//--------------------------------------------------------------------
// Maturity
//--------------------------------------------------------------------
@@ -650,13 +699,28 @@ public:
bool isTeen() const;
bool isMature() const;
bool isAdult() const;
- void setTeen(bool teen);
void setMaturity(char text);
- static int convertTextToMaturity(char text);
- bool sendMaturityPreferenceToServer(int preferredMaturity); // ! "U8" instead of "int"?
+ static int convertTextToMaturity(char text);
+
+private:
+ bool mIsDoSendMaturityPreferenceToServer;
+ unsigned int mMaturityPreferenceRequestId;
+ unsigned int mMaturityPreferenceResponseId;
+ unsigned int mMaturityPreferenceNumRetries;
+ U8 mLastKnownRequestMaturity;
+ U8 mLastKnownResponseMaturity;
+
+ bool isMaturityPreferenceSyncedWithServer() const;
+ void sendMaturityPreferenceToServer(U8 pPreferredMaturity);
+
+ friend class LLMaturityPreferencesResponder;
+ void handlePreferredMaturityResult(U8 pServerMaturity);
+ void handlePreferredMaturityError();
+ void reportPreferredMaturitySuccess();
+ void reportPreferredMaturityError();
// Maturity callbacks for PreferredMaturity control variable
- void handleMaturity(const LLSD& newvalue);
+ void handleMaturity(const LLSD &pNewValue);
bool validateMaturity(const LLSD& newvalue);
diff --git a/indra/newview/llagentaccess.cpp b/indra/newview/llagentaccess.cpp
index 08a33ab04a..c4ee321e04 100644
--- a/indra/newview/llagentaccess.cpp
+++ b/indra/newview/llagentaccess.cpp
@@ -33,8 +33,7 @@ LLAgentAccess::LLAgentAccess(LLControlGroup& savedSettings) :
mSavedSettings(savedSettings),
mAccess(SIM_ACCESS_PG),
mAdminOverride(false),
- mGodLevel(GOD_NOT),
- mAOTransition(false)
+ mGodLevel(GOD_NOT)
{
}
@@ -133,18 +132,6 @@ bool LLAgentAccess::isAdult() const
return mAccess >= SIM_ACCESS_ADULT;
}
-void LLAgentAccess::setTeen(bool teen)
-{
- if (teen)
- {
- mAccess = SIM_ACCESS_PG;
- }
- else
- {
- mAccess = SIM_ACCESS_MATURE;
- }
-}
-
//static
int LLAgentAccess::convertTextToMaturity(char text)
{
@@ -182,16 +169,6 @@ void LLAgentAccess::setMaturity(char text)
mSavedSettings.setU32("PreferredMaturity", preferred_access);
}
-void LLAgentAccess::setTransition()
-{
- mAOTransition = true;
-}
-
-bool LLAgentAccess::isInTransition() const
-{
- return mAOTransition;
-}
-
bool LLAgentAccess::canSetMaturity(S32 maturity)
{
if (isGodlike()) // Gods can always set their Maturity level
diff --git a/indra/newview/llagentaccess.h b/indra/newview/llagentaccess.h
index 2e98e4eea1..4e851b0aa0 100644
--- a/indra/newview/llagentaccess.h
+++ b/indra/newview/llagentaccess.h
@@ -59,13 +59,10 @@ public:
bool isMature() const;
bool isAdult() const;
- void setTeen(bool teen);
void setMaturity(char text);
static int convertTextToMaturity(char text);
- void setTransition(); // sets the transition bit, which defaults to false
- bool isInTransition() const;
bool canSetMaturity(S32 maturity);
private:
@@ -73,13 +70,6 @@ private:
U8 mGodLevel;
bool mAdminOverride;
- // this should be deleted after the 60-day AO transition.
- // It should be safe to remove it in Viewer 2009
- // It's set by a special short-term flag in login.cgi
- // called ao_transition. When that's gone, this can go, along with
- // all of the code that depends on it.
- bool mAOTransition;
-
LLControlGroup& mSavedSettings;
};
diff --git a/indra/newview/llagentwearables.cpp b/indra/newview/llagentwearables.cpp
index e441f21f90..e441f21f90 100644..100755
--- a/indra/newview/llagentwearables.cpp
+++ b/indra/newview/llagentwearables.cpp
diff --git a/indra/newview/llagentwearables.h b/indra/newview/llagentwearables.h
index 5932be21c6..5932be21c6 100644..100755
--- a/indra/newview/llagentwearables.h
+++ b/indra/newview/llagentwearables.h
diff --git a/indra/newview/llappearancemgr.cpp b/indra/newview/llappearancemgr.cpp
index faadfb4b87..6d67e098a6 100644..100755
--- a/indra/newview/llappearancemgr.cpp
+++ b/indra/newview/llappearancemgr.cpp
@@ -229,12 +229,13 @@ LLUpdateAppearanceOnDestroy::LLUpdateAppearanceOnDestroy(bool update_base_outfit
LLUpdateAppearanceOnDestroy::~LLUpdateAppearanceOnDestroy()
{
- LL_INFOS("Avatar") << self_av_string() << "done update appearance on destroy" << LL_ENDL;
-
- selfStopPhase("update_appearance_on_destroy");
-
if (!LLApp::isExiting())
{
+ // speculative fix for MAINT-1150
+ LL_INFOS("Avatar") << self_av_string() << "done update appearance on destroy" << LL_ENDL;
+
+ selfStopPhase("update_appearance_on_destroy");
+
LLAppearanceMgr::instance().updateAppearanceFromCOF(mUpdateBaseOrder);
}
}
diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp
index ed04b5bf38..c9458857d1 100644
--- a/indra/newview/llappviewer.cpp
+++ b/indra/newview/llappviewer.cpp
@@ -89,11 +89,13 @@
#include "lllogininstance.h"
#include "llprogressview.h"
#include "llvocache.h"
+#include "llvopartgroup.h"
#include "llweb.h"
#include "llsecondlifeurls.h"
#include "llupdaterservice.h"
#include "llcallfloater.h"
#include "llfloatertexturefetchdebugger.h"
+#include "llspellcheck.h"
// Linden library includes
#include "llavatarnamecache.h"
@@ -107,6 +109,7 @@
#include "llvfsthread.h"
#include "llvolumemgr.h"
#include "llxfermanager.h"
+#include "llphysicsextensions.h"
#include "llnotificationmanager.h"
#include "llnotifications.h"
@@ -117,6 +120,7 @@
// Third party library includes
#include <boost/bind.hpp>
#include <boost/foreach.hpp>
+#include <boost/algorithm/string.hpp>
@@ -375,6 +379,9 @@ void init_default_trans_args()
default_trans_args.insert("CAPITALIZED_APP_NAME");
default_trans_args.insert("SECOND_LIFE_GRID");
default_trans_args.insert("SUPPORT_SITE");
+ // This URL shows up in a surprising number of places in various skin
+ // files. We really only want to have to maintain a single copy of it.
+ default_trans_args.insert("create_account_url");
}
//----------------------------------------------------------------------------
@@ -625,6 +632,7 @@ LLAppViewer::LLAppViewer() :
mPurgeOnExit(false),
mSecondInstance(false),
mSavedFinalSnapshot(false),
+ mSavePerAccountSettings(false), // don't save settings on logout unless login succeeded.
mForceGraphicsDetail(false),
mQuitRequested(false),
mLogoutRequestSent(false),
@@ -675,6 +683,9 @@ bool LLAppViewer::init()
// initialize SSE options
LLVector4a::initClass();
+ //initialize particle index pool
+ LLVOPartGroup::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");
@@ -1162,6 +1173,8 @@ void LLAppViewer::checkMemory()
static LLFastTimer::DeclareTimer FTM_MESSAGES("System Messages");
static LLFastTimer::DeclareTimer FTM_SLEEP("Sleep");
+static LLFastTimer::DeclareTimer FTM_YIELD("Yield");
+
static LLFastTimer::DeclareTimer FTM_TEXTURE_CACHE("Texture Cache");
static LLFastTimer::DeclareTimer FTM_DECODE("Image Decode");
static LLFastTimer::DeclareTimer FTM_VFS("VFS Thread");
@@ -1347,6 +1360,7 @@ bool LLAppViewer::mainLoop()
// yield some time to the os based on command line option
if(mYieldTime >= 0)
{
+ LLFastTimer t(FTM_YIELD);
ms_sleep(mYieldTime);
}
@@ -1602,6 +1616,9 @@ bool LLAppViewer::cleanup()
// shut down mesh streamer
gMeshRepo.shutdown();
+ // shut down Havok
+ LLPhysicsExtensions::quitSystem();
+
// Must clean up texture references before viewer window is destroyed.
if(LLHUDManager::instanceExists())
{
@@ -1796,6 +1813,13 @@ bool LLAppViewer::cleanup()
{
llinfos << "Not saving per-account settings; don't know the account name yet." << llendl;
}
+ // Only save per account settings if the previous login succeeded, otherwise
+ // we might end up with a cleared out settings file in case a previous login
+ // failed after loading per account settings.
+ else if (!mSavePerAccountSettings)
+ {
+ llinfos << "Not saving per-account settings; last login was not successful." << llendl;
+ }
else
{
gSavedPerAccountSettings.saveToFile(gSavedSettings.getString("PerAccountSettingsFile"), TRUE);
@@ -2550,6 +2574,19 @@ bool LLAppViewer::initConfiguration()
//gDirUtilp->setSkinFolder("default");
}
+ if (gSavedSettings.getBOOL("SpellCheck"))
+ {
+ std::list<std::string> dict_list;
+ std::string dict_setting = gSavedSettings.getString("SpellCheckDictionary");
+ boost::split(dict_list, dict_setting, boost::is_any_of(std::string(",")));
+ if (!dict_list.empty())
+ {
+ LLSpellChecker::setUseSpellCheck(dict_list.front());
+ dict_list.pop_front();
+ LLSpellChecker::instance().setSecondaryDictionaries(dict_list);
+ }
+ }
+
mYieldTime = gSavedSettings.getS32("YieldTime");
// Read skin/branding settings if specified.
@@ -2631,14 +2668,6 @@ 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"))
{
//
@@ -2686,12 +2715,27 @@ bool LLAppViewer::initConfiguration()
}
}
- // need to do this here - need to have initialized global settings first
+ // NextLoginLocation is set from the command line option
std::string nextLoginLocation = gSavedSettings.getString( "NextLoginLocation" );
if ( !nextLoginLocation.empty() )
{
+ LL_DEBUGS("AppInit")<<"set start from NextLoginLocation: "<<nextLoginLocation<<LL_ENDL;
LLStartUp::setStartSLURL(LLSLURL(nextLoginLocation));
- };
+ }
+ else if ( ( clp.hasOption("login") || clp.hasOption("autologin"))
+ && !clp.hasOption("url")
+ && !clp.hasOption("slurl"))
+ {
+ // If automatic login from command line with --login switch
+ // init StartSLURL location.
+ std::string start_slurl_setting = gSavedSettings.getString("LoginLocation");
+ LL_DEBUGS("AppInit") << "start slurl setting '" << start_slurl_setting << "'" << LL_ENDL;
+ LLStartUp::setStartSLURL(LLSLURL(start_slurl_setting));
+ }
+ else
+ {
+ // the login location will be set by the login panel (see LLPanelLogin)
+ }
gLastRunVersion = gSavedSettings.getString("LastRunVersion");
@@ -3075,8 +3119,8 @@ void LLAppViewer::writeSystemInfo()
gDebugInfo["OSInfo"] = getOSInfo().getOSStringSimple();
// The user is not logged on yet, but record the current grid choice login url
- // which may have been the intended grid. This can b
- gDebugInfo["GridName"] = LLGridManager::getInstance()->getGridLabel();
+ // which may have been the intended grid.
+ gDebugInfo["GridName"] = LLGridManager::getInstance()->getGridId();
// *FIX:Mani - move this down in llappviewerwin32
#ifdef LL_WINDOWS
@@ -4312,6 +4356,10 @@ void LLAppViewer::idle()
{
return;
}
+ if (gTeleportDisplay)
+ {
+ return;
+ }
gViewerWindow->updateUI();
@@ -5009,6 +5057,10 @@ void LLAppViewer::handleLoginComplete()
mOnLoginCompleted();
writeDebugInfo();
+
+ // we logged in successfully, so save settings on logout
+ llinfos << "Login successful, per account settings will be saved on log out." << llendl;
+ mSavePerAccountSettings=true;
}
void LLAppViewer::launchUpdater()
@@ -5026,7 +5078,7 @@ void LLAppViewer::launchUpdater()
#endif
// *TODO change userserver to be grid on both viewer and sim, since
// userserver no longer exists.
- query_map["userserver"] = LLGridManager::getInstance()->getGridLabel();
+ query_map["userserver"] = LLGridManager::getInstance()->getGridId();
query_map["channel"] = LLVersionInfo::getChannel();
// *TODO constantize this guy
// *NOTE: This URL is also used in win_setup/lldownloader.cpp
diff --git a/indra/newview/llappviewer.h b/indra/newview/llappviewer.h
index f7d019ccba..ae3c795d1e 100644
--- a/indra/newview/llappviewer.h
+++ b/indra/newview/llappviewer.h
@@ -247,6 +247,7 @@ private:
bool mPurgeOnExit;
bool mSavedFinalSnapshot;
+ bool mSavePerAccountSettings; // only save per account settings if login succeeded
bool mForceGraphicsDetail;
diff --git a/indra/newview/llappviewerlinux.cpp b/indra/newview/llappviewerlinux.cpp
index 48d02dfeaa..e8d8efdc0a 100644
--- a/indra/newview/llappviewerlinux.cpp
+++ b/indra/newview/llappviewerlinux.cpp
@@ -365,7 +365,7 @@ void LLAppViewerLinux::handleCrashReporting(bool reportFreeze)
const char * cmdargv[] =
{cmd.c_str(),
"-user",
- (char*)LLGridManager::getInstance()->getGridLabel().c_str(),
+ (char*)LLGridManager::getInstance()->getGridId().c_str(),
"-name",
LLAppViewer::instance()->getSecondLifeTitle().c_str(),
NULL};
diff --git a/indra/newview/llappviewerwin32.cpp b/indra/newview/llappviewerwin32.cpp
index bad60a9757..53c77fa22e 100644
--- a/indra/newview/llappviewerwin32.cpp
+++ b/indra/newview/llappviewerwin32.cpp
@@ -130,6 +130,8 @@ int APIENTRY WINMAIN(HINSTANCE hInstance,
// This results in a 2-3x improvement in opening a new Inventory window (which uses a large numebr of allocations)
// Note: This won't work when running from the debugger unless the _NO_DEBUG_HEAP environment variable is set to 1
+ // Enable to get mem debugging within visual studio.
+ //_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
_CrtSetDbgFlag(0); // default, just making explicit
ULONG ulEnableLFH = 2;
diff --git a/indra/newview/llautoreplace.cpp b/indra/newview/llautoreplace.cpp
new file mode 100644
index 0000000000..0f1ce2bcd0
--- /dev/null
+++ b/indra/newview/llautoreplace.cpp
@@ -0,0 +1,771 @@
+/**
+ * @file llautoreplace.cpp
+ * @brief Auto Replace Manager
+ *
+ * $LicenseInfo:firstyear=2012&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2012, Linden Research, Inc.
+ *
+ * This library is free software; you 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.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+#include "llautoreplace.h"
+#include "llsdserialize.h"
+#include "llboost.h"
+#include "llcontrol.h"
+#include "llviewercontrol.h"
+#include "llnotificationsutil.h"
+
+LLAutoReplace* LLAutoReplace::sInstance;
+
+const char* LLAutoReplace::SETTINGS_FILE_NAME = "autoreplace.xml";
+
+LLAutoReplace::LLAutoReplace()
+{
+}
+
+LLAutoReplace::~LLAutoReplace()
+{
+ sInstance = NULL;
+}
+
+void LLAutoReplace::autoreplaceCallback(LLUIString& inputText, S32& cursorPos)
+{
+ static LLCachedControl<bool> perform_autoreplace(gSavedSettings, "AutoReplace");
+ if(perform_autoreplace)
+ {
+ S32 wordEnd = cursorPos-1;
+ LLWString text = inputText.getWString();
+
+ bool atSpace = (text[wordEnd] == ' ');
+ bool haveWord = (LLWStringUtil::isPartOfWord(text[wordEnd]));
+
+ if (atSpace || haveWord)
+ {
+ if (atSpace && wordEnd > 0)
+ {
+ // find out if this space immediately follows a word
+ wordEnd--;
+ haveWord = (LLWStringUtil::isPartOfWord(text[wordEnd]));
+ }
+ if (haveWord)
+ {
+ // wordEnd points to the end of a word, now find the start of the word
+ std::string word;
+ S32 wordStart = wordEnd;
+ for ( S32 backOne = wordStart - 1;
+ backOne >= 0 && LLWStringUtil::isPartOfWord(text[backOne]);
+ backOne--
+ )
+ {
+ wordStart--; // walk wordStart back to the beginning of the word
+ }
+ LL_DEBUGS("AutoReplace")<<"wordStart: "<<wordStart<<" wordEnd: "<<wordEnd<<LL_ENDL;
+ std::string strText = std::string(text.begin(), text.end());
+ std::string lastWord = strText.substr(wordStart, wordEnd-wordStart+1);
+ std::string replacementWord( mSettings.replaceWord( lastWord ) );
+
+ if ( replacementWord != lastWord )
+ {
+ // The last word is one for which we have a replacement
+ if (atSpace)
+ {
+ // replace the last word in the input
+ LLWString strNew = utf8str_to_wstring(replacementWord);
+ LLWString strOld = utf8str_to_wstring(lastWord);
+ int size_change = strNew.size() - strOld.size();
+
+ text.replace(wordStart,lastWord.length(),strNew);
+ inputText = wstring_to_utf8str(text);
+ cursorPos+=size_change;
+ }
+ }
+ }
+ }
+ }
+}
+
+LLAutoReplace* LLAutoReplace::getInstance()
+{
+ if(!sInstance)
+ {
+ sInstance = new LLAutoReplace();
+ sInstance->loadFromSettings();
+ }
+ return sInstance;
+}
+
+std::string LLAutoReplace::getUserSettingsFileName()
+{
+ std::string path=gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, "");
+
+ if (!path.empty())
+ {
+ path = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, SETTINGS_FILE_NAME);
+ }
+ return path;
+}
+
+std::string LLAutoReplace::getAppSettingsFileName()
+{
+ std::string path=gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "");
+
+ if (!path.empty())
+ {
+ path = gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, SETTINGS_FILE_NAME);
+ }
+ else
+ {
+ LL_ERRS("AutoReplace") << "Failed to get app settings directory name" << LL_ENDL;
+ }
+ return path;
+}
+
+LLAutoReplaceSettings LLAutoReplace::getSettings()
+{
+ return mSettings;
+}
+
+void LLAutoReplace::setSettings(const LLAutoReplaceSettings& newSettings)
+{
+ mSettings.set(newSettings);
+ /// Make the newSettings active and write them to user storage
+ saveToUserSettings();
+}
+
+void LLAutoReplace::loadFromSettings()
+{
+ std::string filename=getUserSettingsFileName();
+ if (filename.empty())
+ {
+ LL_INFOS("AutoReplace") << "no valid user settings directory." << LL_ENDL;
+ }
+ if(gDirUtilp->fileExists(filename))
+ {
+ LLSD userSettings;
+ llifstream file;
+ file.open(filename.c_str());
+ if (file.is_open())
+ {
+ LLSDSerialize::fromXML(userSettings, file);
+ }
+ file.close();
+ if ( mSettings.setFromLLSD(userSettings) )
+ {
+ LL_INFOS("AutoReplace") << "settings loaded from '" << filename << "'" << LL_ENDL;
+ }
+ else
+ {
+ LL_WARNS("AutoReplace") << "invalid settings found in '" << filename << "'" << LL_ENDL;
+ }
+ }
+ else // no user settings found, try application settings
+ {
+ std::string defaultName = getAppSettingsFileName();
+ LL_INFOS("AutoReplace") << " user settings file '" << filename << "' not found"<< LL_ENDL;
+
+ bool gotSettings = false;
+ if(gDirUtilp->fileExists(defaultName))
+ {
+ LLSD appDefault;
+ llifstream file;
+ file.open(defaultName.c_str());
+ if (file.is_open())
+ {
+ LLSDSerialize::fromXMLDocument(appDefault, file);
+ }
+ file.close();
+
+ if ( mSettings.setFromLLSD(appDefault) )
+ {
+ LL_INFOS("AutoReplace") << "settings loaded from '" << defaultName.c_str() << "'" << LL_ENDL;
+ gotSettings = true;
+ }
+ else
+ {
+ LL_WARNS("AutoReplace") << "invalid settings found in '" << defaultName.c_str() << "'" << LL_ENDL;
+ }
+ }
+
+ if ( ! gotSettings )
+ {
+ if (mSettings.setFromLLSD(mSettings.getExampleLLSD()))
+ {
+ LL_WARNS("AutoReplace") << "no settings found; loaded example." << LL_ENDL;
+ }
+ else
+ {
+ LL_WARNS("AutoReplace") << "no settings found and example invalid!" << LL_ENDL;
+ }
+ }
+ }
+}
+
+void LLAutoReplace::saveToUserSettings()
+{
+ std::string filename=getUserSettingsFileName();
+ llofstream file;
+ file.open(filename.c_str());
+ LLSDSerialize::toPrettyXML(mSettings.getAsLLSD(), file);
+ file.close();
+ LL_INFOS("AutoReplace") << "settings saved to '" << filename << "'" << LL_ENDL;
+}
+
+// ================================================================
+// LLAutoReplaceSettings
+// ================================================================
+
+const std::string LLAutoReplaceSettings::AUTOREPLACE_LIST_NAME = "name"; ///< key for looking up list names
+const std::string LLAutoReplaceSettings::AUTOREPLACE_LIST_REPLACEMENTS = "replacements"; ///< key for looking up replacement map
+
+LLAutoReplaceSettings::LLAutoReplaceSettings()
+{
+}
+
+LLAutoReplaceSettings::LLAutoReplaceSettings(const LLAutoReplaceSettings& settings)
+{
+ // copy all values through fundamental type intermediates for thread safety
+ mLists = LLSD::emptyArray();
+
+ for ( LLSD::array_const_iterator list = settings.mLists.beginArray(), listEnd = settings.mLists.endArray();
+ list != listEnd;
+ list++
+ )
+ {
+ if ( (*list).isMap() ) // can fail due to LLSD-30: ignore it
+ {
+ LLSD listMap = LLSD::emptyMap();
+ std::string listName = (*list)[AUTOREPLACE_LIST_NAME];
+ listMap[AUTOREPLACE_LIST_NAME] = listName;
+ listMap[AUTOREPLACE_LIST_REPLACEMENTS] = LLSD::emptyMap();
+
+ for ( LLSD::map_const_iterator
+ entry = (*list)[AUTOREPLACE_LIST_REPLACEMENTS].beginMap(),
+ entriesEnd = (*list)[AUTOREPLACE_LIST_REPLACEMENTS].endMap();
+ entry != entriesEnd;
+ entry++
+ )
+ {
+ std::string keyword = entry->first;
+ std::string replacement = entry->second.asString();
+ listMap[AUTOREPLACE_LIST_REPLACEMENTS].insert(keyword, LLSD(replacement));
+ }
+
+ mLists.append(listMap);
+ }
+ }
+}
+
+void LLAutoReplaceSettings::set(const LLAutoReplaceSettings& newSettings)
+{
+ mLists = newSettings.mLists;
+}
+
+bool LLAutoReplaceSettings::setFromLLSD(const LLSD& settingsFromLLSD)
+{
+ bool settingsValid = true;
+
+ if ( settingsFromLLSD.isArray() )
+ {
+ for ( LLSD::array_const_iterator
+ list = settingsFromLLSD.beginArray(),
+ listEnd = settingsFromLLSD.endArray();
+ settingsValid && list != listEnd;
+ list++
+ )
+ {
+ if ( (*list).isDefined() ) // can be undef due to LLSD-30: ignore it
+ {
+ settingsValid = listIsValid(*list);
+ }
+ }
+ }
+ else
+ {
+ settingsValid = false;
+ LL_WARNS("AutoReplace") << "settings are not an array" << LL_ENDL;
+ }
+
+ if ( settingsValid )
+ {
+ mLists = settingsFromLLSD;
+ }
+ else
+ {
+ LL_WARNS("AutoReplace") << "invalid settings discarded; using hard coded example" << LL_ENDL;
+ }
+
+ return settingsValid;
+}
+
+bool LLAutoReplaceSettings::listNameMatches( const LLSD& list, const std::string name )
+{
+ return list.isMap()
+ && list.has(AUTOREPLACE_LIST_NAME)
+ && list[AUTOREPLACE_LIST_NAME].asString() == name;
+}
+
+const LLSD* LLAutoReplaceSettings::getListEntries(std::string listName)
+{
+ const LLSD* returnedEntries = NULL;
+ for( LLSD::array_const_iterator list = mLists.beginArray(), endList = mLists.endArray();
+ returnedEntries == NULL && list != endList;
+ list++
+ )
+ {
+ const LLSD& thisList = *list;
+ if ( listNameMatches(thisList, listName) )
+ {
+ returnedEntries = &thisList[AUTOREPLACE_LIST_REPLACEMENTS];
+ }
+ }
+ return returnedEntries;
+}
+
+std::string LLAutoReplaceSettings::replacementFor(std::string keyword, std::string listName)
+{
+ std::string replacement;
+ bool foundList = false;
+ for( LLSD::array_const_iterator list = mLists.beginArray(), endList = mLists.endArray();
+ ! foundList && list != endList;
+ list++
+ )
+ {
+ const LLSD& thisList = *list;
+ if ( listNameMatches(thisList, listName) )
+ {
+ foundList = true; // whether there is a replacement or not, we're done
+ if ( thisList.isMap()
+ && thisList.has(AUTOREPLACE_LIST_REPLACEMENTS)
+ && thisList[AUTOREPLACE_LIST_REPLACEMENTS].has(keyword)
+ )
+ {
+ replacement = thisList[AUTOREPLACE_LIST_REPLACEMENTS][keyword].asString();
+ LL_DEBUGS("AutoReplace")<<"'"<<keyword<<"' -> '"<<replacement<<"'"<<LL_ENDL;
+ }
+ }
+ if (!foundList)
+ {
+ LL_WARNS("AutoReplace")<<"failed to find list '"<<listName<<"'"<<LL_ENDL;
+ }
+ }
+ if (replacement.empty())
+ {
+ LL_WARNS("AutoReplace")<<"failed to find '"<<keyword<<"'"<<LL_ENDL;
+ }
+ return replacement;
+}
+
+LLSD LLAutoReplaceSettings::getListNames()
+{
+ LL_DEBUGS("AutoReplace")<<"====="<<LL_ENDL;
+ LLSD toReturn = LLSD::emptyArray();
+ S32 counter=0;
+ for( LLSD::array_const_iterator list = mLists.beginArray(), endList = mLists.endArray();
+ list != endList;
+ list++
+ )
+ {
+ const LLSD& thisList = *list;
+ if ( thisList.isMap() )
+ {
+ if ( thisList.has(AUTOREPLACE_LIST_NAME) )
+ {
+ std::string name = thisList[AUTOREPLACE_LIST_NAME].asString();
+ LL_DEBUGS("AutoReplace")<<counter<<" '"<<name<<"'"<<LL_ENDL;
+ toReturn.append(LLSD(name));
+ }
+ else
+ {
+ LL_ERRS("AutoReplace") <<counter<<" ! MISSING "<<AUTOREPLACE_LIST_NAME<< LL_ENDL;
+ }
+ }
+ else
+ {
+ LL_WARNS("AutoReplace")<<counter<<" ! not a map: "<<LLSD::typeString(thisList.type())<< LL_ENDL;
+ }
+ counter++;
+ }
+ LL_DEBUGS("AutoReplace")<<"^^^^^^"<<LL_ENDL;
+ return toReturn;
+}
+
+bool LLAutoReplaceSettings::listIsValid(const LLSD& list)
+{
+ bool listValid = true;
+ if ( ! list.isMap() )
+ {
+ listValid = false;
+ LL_WARNS("AutoReplace") << "list is not a map" << LL_ENDL;
+ }
+ else if ( ! list.has(AUTOREPLACE_LIST_NAME)
+ || ! list[AUTOREPLACE_LIST_NAME].isString()
+ || list[AUTOREPLACE_LIST_NAME].asString().empty()
+ )
+ {
+ listValid = false;
+ LL_WARNS("AutoReplace")
+ << "list found without " << AUTOREPLACE_LIST_NAME
+ << " (or it is empty)"
+ << LL_ENDL;
+ }
+ else if ( ! list.has(AUTOREPLACE_LIST_REPLACEMENTS) || ! list[AUTOREPLACE_LIST_REPLACEMENTS].isMap() )
+ {
+ listValid = false;
+ LL_WARNS("AutoReplace") << "list '" << list[AUTOREPLACE_LIST_NAME].asString() << "' without " << AUTOREPLACE_LIST_REPLACEMENTS << LL_ENDL;
+ }
+ else
+ {
+ for ( LLSD::map_const_iterator
+ entry = list[AUTOREPLACE_LIST_REPLACEMENTS].beginMap(),
+ entriesEnd = list[AUTOREPLACE_LIST_REPLACEMENTS].endMap();
+ listValid && entry != entriesEnd;
+ entry++
+ )
+ {
+ if ( ! entry->second.isString() )
+ {
+ listValid = false;
+ LL_WARNS("AutoReplace")
+ << "non-string replacement value found in list '"
+ << list[AUTOREPLACE_LIST_NAME].asString() << "'"
+ << LL_ENDL;
+ }
+ }
+ }
+
+ return listValid;
+}
+
+const LLSD* LLAutoReplaceSettings::exportList(std::string listName)
+{
+ const LLSD* exportedList = NULL;
+ for ( LLSD::array_const_iterator list = mLists.beginArray(), listEnd = mLists.endArray();
+ exportedList == NULL && list != listEnd;
+ list++
+ )
+ {
+ if ( listNameMatches(*list, listName) )
+ {
+ const LLSD& namedList = (*list);
+ exportedList = &namedList;
+ }
+ }
+ return exportedList;
+}
+
+bool LLAutoReplaceSettings::listNameIsUnique(const LLSD& newList)
+{
+ bool nameIsUnique = true;
+ // this must always be called with a valid list, so it is safe to assume it has a name
+ std::string newListName = newList[AUTOREPLACE_LIST_NAME].asString();
+ for ( LLSD::array_const_iterator list = mLists.beginArray(), listEnd = mLists.endArray();
+ nameIsUnique && list != listEnd;
+ list++
+ )
+ {
+ if ( listNameMatches(*list, newListName) )
+ {
+ LL_WARNS("AutoReplace")<<"duplicate list name '"<<newListName<<"'"<<LL_ENDL;
+ nameIsUnique = false;
+ }
+ }
+ return nameIsUnique;
+}
+
+/* static */
+void LLAutoReplaceSettings::createEmptyList(LLSD& emptyList)
+{
+ emptyList = LLSD::emptyMap();
+ emptyList[AUTOREPLACE_LIST_NAME] = "Empty";
+ emptyList[AUTOREPLACE_LIST_REPLACEMENTS] = LLSD::emptyMap();
+}
+
+/* static */
+void LLAutoReplaceSettings::setListName(LLSD& list, const std::string& newName)
+{
+ list[AUTOREPLACE_LIST_NAME] = newName;
+}
+
+/* static */
+std::string LLAutoReplaceSettings::getListName(LLSD& list)
+{
+ std::string name;
+ if ( list.isMap() && list.has(AUTOREPLACE_LIST_NAME) && list[AUTOREPLACE_LIST_NAME].isString() )
+ {
+ name = list[AUTOREPLACE_LIST_NAME].asString();
+ }
+ return name;
+}
+
+LLAutoReplaceSettings::AddListResult LLAutoReplaceSettings::addList(const LLSD& newList)
+{
+ AddListResult result;
+ if ( listIsValid( newList ) )
+ {
+ if ( listNameIsUnique( newList ) )
+ {
+ mLists.append(newList);
+ result = AddListOk;
+ }
+ else
+ {
+ LL_WARNS("AutoReplace") << "attempt to add duplicate name" << LL_ENDL;
+ result = AddListDuplicateName;
+ }
+ }
+ else
+ {
+ LL_WARNS("AutoReplace") << "attempt to add invalid list" << LL_ENDL;
+ result = AddListInvalidList;
+ }
+ return result;
+}
+
+bool LLAutoReplaceSettings::removeReplacementList(std::string listName)
+{
+ bool found = false;
+ for( S32 index = 0; !found && mLists[index].isDefined(); index++ )
+ {
+ if( listNameMatches(mLists.get(index), listName) )
+ {
+ LL_DEBUGS("AutoReplace")<<"list '"<<listName<<"'"<<LL_ENDL;
+ mLists.erase(index);
+ found = true;
+ }
+ }
+ return found;
+}
+
+/// Move the named list up in the priority order
+bool LLAutoReplaceSettings::increaseListPriority(std::string listName)
+{
+ LL_DEBUGS("AutoReplace")<<listName<<LL_ENDL;
+ bool found = false;
+ S32 search_index, previous_index;
+ LLSD targetList;
+ // The following is working around the fact that LLSD arrays containing maps also seem to have undefined entries... see LLSD-30
+ previous_index = -1;
+ for ( search_index = 0, targetList = mLists[0];
+ !found && search_index < mLists.size();
+ search_index += 1, targetList = mLists[search_index]
+ )
+ {
+ if ( targetList.isMap() )
+ {
+ if ( listNameMatches( targetList, listName) )
+ {
+ LL_DEBUGS("AutoReplace")<<"found at "<<search_index<<", previous is "<<previous_index<<LL_ENDL;
+ found = true;
+ if (previous_index >= 0)
+ {
+ LL_DEBUGS("AutoReplace") << "erase "<<search_index<<LL_ENDL;
+ mLists.erase(search_index);
+ LL_DEBUGS("AutoReplace") << "insert at "<<previous_index<<LL_ENDL;
+ mLists.insert(previous_index, targetList);
+ }
+ else
+ {
+ LL_WARNS("AutoReplace") << "attempted to move top list up" << LL_ENDL;
+ }
+ }
+ else
+ {
+ previous_index = search_index;
+ }
+ }
+ else
+ {
+ LL_DEBUGS("AutoReplace") << search_index<<" is "<<LLSD::typeString(targetList.type())<<LL_ENDL;
+ }
+ }
+ return found;
+}
+
+/// Move the named list down in the priority order
+bool LLAutoReplaceSettings::decreaseListPriority(std::string listName)
+{
+ LL_DEBUGS("AutoReplace")<<listName<<LL_ENDL;
+ S32 found_index = -1;
+ S32 search_index;
+ for ( search_index = 0;
+ found_index == -1 && search_index < mLists.size();
+ search_index++
+ )
+ {
+ if ( listNameMatches( mLists[search_index], listName) )
+ {
+ LL_DEBUGS("AutoReplace")<<"found at index "<<search_index<<LL_ENDL;
+ found_index = search_index;
+ }
+ }
+ if (found_index != -1)
+ {
+ S32 next_index;
+ for ( next_index = found_index+1;
+ next_index < mLists.size() && ! mLists[next_index].isMap();
+ next_index++
+ )
+ {
+ // skipping over any undefined slots (see LLSD-30)
+ LL_WARNS("AutoReplace")<<next_index<<" ! not a map: "<<LLSD::typeString(mLists[next_index].type())<< LL_ENDL;
+ }
+ if ( next_index < mLists.size() )
+ {
+ LLSD next_list = mLists[next_index];
+ LL_DEBUGS("AutoReplace") << "erase "<<next_index<<LL_ENDL;
+ mLists.erase(next_index);
+ LL_DEBUGS("AutoReplace") << "insert at "<<found_index<<LL_ENDL;
+ mLists.insert(found_index, next_list);
+ }
+ else
+ {
+ LL_WARNS("AutoReplace") << "attempted to move bottom list down" << LL_ENDL;
+ }
+ }
+ else
+ {
+ LL_WARNS("AutoReplace") << "not found" << LL_ENDL;
+ }
+ return (found_index != -1);
+}
+
+
+std::string LLAutoReplaceSettings::replaceWord(const std::string currentWord)
+{
+ std::string returnedWord = currentWord; // in case no replacement is found
+ static LLCachedControl<bool> autoreplace_enabled(gSavedSettings, "AutoReplace");
+ if ( autoreplace_enabled )
+ {
+ LL_DEBUGS("AutoReplace")<<"checking '"<<currentWord<<"'"<< LL_ENDL;
+ //loop through lists in order
+ bool found = false;
+ for( LLSD::array_const_iterator list = mLists.beginArray(), endLists = mLists.endArray();
+ ! found && list != endLists;
+ list++
+ )
+ {
+ const LLSD& checkList = *list;
+ const LLSD& replacements = checkList[AUTOREPLACE_LIST_REPLACEMENTS];
+
+ if ( replacements.has(currentWord) )
+ {
+ found = true;
+ LL_DEBUGS("AutoReplace")
+ << " found in list '" << checkList[AUTOREPLACE_LIST_NAME].asString()
+ << " => '" << replacements[currentWord].asString() << "'"
+ << LL_ENDL;
+ returnedWord = replacements[currentWord].asString();
+ }
+ }
+ }
+ return returnedWord;
+}
+
+bool LLAutoReplaceSettings::addEntryToList(LLWString keyword, LLWString replacement, std::string listName)
+{
+ bool added = false;
+
+ if ( ! keyword.empty() && ! replacement.empty() )
+ {
+ bool isOneWord = true;
+ for (S32 character = 0; isOneWord && character < keyword.size(); character++ )
+ {
+ if ( ! LLWStringUtil::isPartOfWord(keyword[character]) )
+ {
+ LL_WARNS("AutoReplace") << "keyword '" << wstring_to_utf8str(keyword) << "' not a single word (len "<<keyword.size()<<" '"<<character<<"')" << LL_ENDL;
+ isOneWord = false;
+ }
+ }
+
+ if ( isOneWord )
+ {
+ bool listFound = false;
+ for( LLSD::array_iterator list = mLists.beginArray(), endLists = mLists.endArray();
+ ! listFound && list != endLists;
+ list++
+ )
+ {
+ if ( listNameMatches(*list, listName) )
+ {
+ listFound = true;
+ (*list)[AUTOREPLACE_LIST_REPLACEMENTS][wstring_to_utf8str(keyword)]=wstring_to_utf8str(replacement);
+ }
+ }
+ if (listFound)
+ {
+ added = true;
+ }
+ else
+ {
+ LL_WARNS("AutoReplace") << "list '" << listName << "' not found" << LL_ENDL;
+ }
+ }
+ }
+
+ return added;
+}
+
+bool LLAutoReplaceSettings::removeEntryFromList(std::string keyword, std::string listName)
+{
+ bool found = false;
+ for( LLSD::array_iterator list = mLists.beginArray(), endLists = mLists.endArray();
+ ! found && list != endLists;
+ list++
+ )
+ {
+ if ( listNameMatches(*list, listName) )
+ {
+ found = true;
+ (*list)[AUTOREPLACE_LIST_REPLACEMENTS].erase(keyword);
+ }
+ }
+ if (!found)
+ {
+ LL_WARNS("AutoReplace") << "list '" << listName << "' not found" << LL_ENDL;
+ }
+ return found;
+}
+
+LLSD LLAutoReplaceSettings::getExampleLLSD()
+{
+ LL_DEBUGS("AutoReplace")<<LL_ENDL;
+ LLSD example = LLSD::emptyArray();
+
+ example[0] = LLSD::emptyMap();
+ example[0][AUTOREPLACE_LIST_NAME] = "Example List 1";
+ example[0][AUTOREPLACE_LIST_REPLACEMENTS] = LLSD::emptyMap();
+ example[0][AUTOREPLACE_LIST_REPLACEMENTS]["keyword1"] = "replacement string 1";
+ example[0][AUTOREPLACE_LIST_REPLACEMENTS]["keyword2"] = "replacement string 2";
+
+ example[1] = LLSD::emptyMap();
+ example[1][AUTOREPLACE_LIST_NAME] = "Example List 2";
+ example[1][AUTOREPLACE_LIST_REPLACEMENTS] = LLSD::emptyMap();
+ example[1][AUTOREPLACE_LIST_REPLACEMENTS]["mistake1"] = "correction 1";
+ example[1][AUTOREPLACE_LIST_REPLACEMENTS]["mistake2"] = "correction 2";
+
+ return example;
+}
+
+const LLSD& LLAutoReplaceSettings::getAsLLSD()
+{
+ return mLists;
+}
+
+LLAutoReplaceSettings::~LLAutoReplaceSettings()
+{
+}
diff --git a/indra/newview/llautoreplace.h b/indra/newview/llautoreplace.h
new file mode 100644
index 0000000000..30b1fd2c65
--- /dev/null
+++ b/indra/newview/llautoreplace.h
@@ -0,0 +1,228 @@
+/**
+ * @file llautoreplace.h
+ * @brief Auto Replace Manager
+ * $LicenseInfo:firstyear=2012&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2012, Linden Research, Inc.
+ *
+ * This library is free software; you 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.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+#ifndef LLAUTOREPLACE_H
+#define LLAUTOREPLACE_H
+
+#include "lllineeditor.h"
+
+class LLAutoReplace;
+
+/** The configuration data for the LLAutoReplace object
+ *
+ * This is a separate class so that the LLFloaterAutoReplaceSettings
+ * can have a copy of the configuration to manipulate before committing
+ * the changes back to the LLAutoReplace singleton that provides the
+ * autoreplace callback.
+ */
+class LLAutoReplaceSettings
+{
+ public:
+ LLAutoReplaceSettings();
+ ~LLAutoReplaceSettings();
+
+ /// Constructor for creating a tempory copy of the current settings
+ LLAutoReplaceSettings(const LLAutoReplaceSettings& settings);
+
+ /// Replace the current settings with new ones and save them to the user settings file
+ void set(const LLAutoReplaceSettings& newSettings);
+
+ /// Load the current settings read from an LLSD file
+ bool setFromLLSD(const LLSD& settingsFromLLSD);
+ ///< @returns whether or not the settingsFromLLSD were valid
+
+ // ================================================================
+ ///@{ @name List Operations
+ // ================================================================
+
+ /// @returns the configured list names as an LLSD Array of strings
+ LLSD getListNames();
+
+ /// Status values returned from the addList method
+ typedef enum
+ {
+ AddListOk,
+ AddListDuplicateName,
+ AddListInvalidList,
+ } AddListResult;
+
+ /// Inserts a new list at the end of the priority order
+ AddListResult addList(const LLSD& newList);
+
+ /// Removes the named list, @returns false if not found
+ bool removeReplacementList(std::string listName);
+
+ /// Move the named list up in the priority order
+ bool increaseListPriority(std::string listName);
+ ///< @returns false if the list is not found
+
+ /// Move the named list down in the priority order
+ bool decreaseListPriority(std::string listName);
+ ///< @returns false if the list is not found
+
+ /// Get a copy of just one list (for saving to an export file)
+ const LLSD* exportList(std::string listName);
+ /// @returns an LLSD map
+
+ /// Checks for required elements, and that each has the correct type.
+ bool listIsValid(const LLSD& listSettings);
+
+ /// Checks for required elements, and that each has the correct type.
+ bool listNameIs(const LLSD& listSettings);
+
+ /// Checks to see if a new lists name conflicts with one in the settings
+ bool listNameIsUnique(const LLSD& newList);
+ /// @note must be called with LLSD that has passed listIsValid
+
+ /// Initializes emptyList to an empty list named 'Empty'
+ static void createEmptyList(LLSD& emptyList);
+
+ /// Resets the name of a list to a new value
+ static void setListName(LLSD& list, const std::string& newName);
+
+ /// Gets the name of a list
+ static std::string getListName(LLSD& list);
+
+ ///@}
+ // ================================================================
+ ///@{ @name Replacement Entry Operations
+ // ================================================================
+
+ /// Get the replacements specified by a given list
+ const LLSD* getListEntries(std::string listName);
+ ///< @returns an LLSD Map of keyword -> replacement test pairs
+
+ /// Get the replacement for the keyword from the specified list
+ std::string replacementFor(std::string keyword, std::string listName);
+
+ /// Adds a keywword/replacement pair to the named list
+ bool addEntryToList(LLWString keyword, LLWString replacement, std::string listName);
+
+ /// Removes the keywword and its replacement from the named list
+ bool removeEntryFromList(std::string keyword, std::string listName);
+
+ /**
+ * Look for currentWord in the lists in order, returning any substitution found
+ * If no configured substitution is found, returns currentWord
+ */
+ std::string replaceWord(const std::string currentWord /**< word to search for */ );
+
+ /// Provides a hard-coded example of settings
+ LLSD getExampleLLSD();
+
+ /// Get the actual settings as LLSD
+ const LLSD& getAsLLSD();
+ ///< @note for use only in AutoReplace::saveToUserSettings
+
+ private:
+ /// Efficiently and safely compare list names
+ bool listNameMatches( const LLSD& list, const std::string name );
+
+ /// The actual llsd data structure
+ LLSD mLists;
+
+ static const std::string AUTOREPLACE_LIST_NAME; ///< key for looking up list names
+ static const std::string AUTOREPLACE_LIST_REPLACEMENTS; ///< key for looking up replacement map
+
+ /**<
+ * LLSD structure of the lists
+ * - The configuration is an array (mLists),
+ * - Each entry in the array is a replacement list
+ * - Each replacement list is a map with three keys:
+ * @verbatim
+ * "name" String the name of the list
+ * "replacements" Map keyword -> replacement pairs
+ *
+ * <llsd>
+ * <array>
+ * <map>
+ * <key>name</key> <string>List 1</string>
+ * <key>data</key>
+ * <map>
+ * <key>keyword1</key> <string>replacement1</string>
+ * <key>keyword2</key> <string>replacement2</string>
+ * </map>
+ * </map>
+ * <map>
+ * <key>name</key> <string>List 2</string>
+ * <key>data</key>
+ * <map>
+ * <key>keyword1</key> <string>replacement1</string>
+ * <key>keyword2</key> <string>replacement2</string>
+ * </map>
+ * </map>
+ * </array>
+ * </llsd>
+ * @endverbatim
+ */
+};
+
+/** Provides a facility to auto-replace text dynamically as it is entered.
+ *
+ * When the end of a word is detected (defined as any punctuation character,
+ * or any whitespace except newline or return), the preceding word is used
+ * as a lookup key in an ordered list of maps. If a match is found in any
+ * map, the keyword is replaced by the associated value from the map.
+ *
+ * See the autoreplaceCallback method for how to add autoreplace functionality
+ * to a text entry tool.
+ */
+class LLAutoReplace : public LLSingleton<LLAutoReplace>
+{
+ public:
+ LLAutoReplace();
+ ~LLAutoReplace();
+
+ /// @return a pointer to the active instance
+ static LLAutoReplace* getInstance();
+
+ /// Callback that provides the hook for use in text entry methods
+ void autoreplaceCallback(LLUIString& inputText, S32& cursorPos);
+
+ /// Get a copy of the current settings
+ LLAutoReplaceSettings getSettings();
+
+ /// Commit new settings after making changes
+ void setSettings(const LLAutoReplaceSettings& settings);
+
+ private:
+ friend class LLSingleton<LLAutoReplace>;
+ static LLAutoReplace* sInstance; ///< the active settings instance
+
+ LLAutoReplaceSettings mSettings; ///< configuration information
+
+ /// Read settings from persistent storage
+ void loadFromSettings();
+
+ /// Make the newSettings active and write them to user storage
+ void saveToUserSettings();
+
+ /// Compute the user settings file name
+ std::string getUserSettingsFileName();
+
+ /// Compute the (read-ony) application settings file name
+ std::string getAppSettingsFileName();
+
+ /// basename for the settings files
+ static const char* SETTINGS_FILE_NAME;
+};
+
+#endif /* LLAUTOREPLACE_H */
diff --git a/indra/newview/llchathistory.cpp b/indra/newview/llchathistory.cpp
index f530d10ddc..84e73e96fa 100644
--- a/indra/newview/llchathistory.cpp
+++ b/indra/newview/llchathistory.cpp
@@ -495,7 +495,7 @@ protected:
void showInfoCtrl()
{
- if (mAvatarID.isNull() || mFrom.empty() || SYSTEM_FROM == mFrom) return;
+ if (mAvatarID.isNull() || mFrom.empty() || CHAT_SOURCE_SYSTEM == mSourceType) return;
if (!sInfoCtrl)
{
@@ -689,8 +689,11 @@ void LLChatHistory::clear()
mLastFromID = LLUUID::null;
}
+static LLFastTimer::DeclareTimer FTM_APPEND_MESSAGE("Append Chat Message");
+
void LLChatHistory::appendMessage(const LLChat& chat, const LLSD &args, const LLStyle::Params& input_append_params)
{
+ LLFastTimer _(FTM_APPEND_MESSAGE);
bool use_plain_text_chat_history = args["use_plain_text_chat_history"].asBoolean();
llassert(mEditor);
@@ -783,7 +786,7 @@ void LLChatHistory::appendMessage(const LLChat& chat, const LLSD &args, const LL
timestamp_style.color(timestamp_color);
timestamp_style.readonly_color(timestamp_color);
}
- mEditor->appendText("[" + chat.mTimeStr + "] ", mEditor->getText().size() != 0, timestamp_style);
+ mEditor->appendText("[" + chat.mTimeStr + "] ", mEditor->getLength() != 0, timestamp_style);
if (utf8str_trim(chat.mFromName).size() != 0)
{
@@ -842,7 +845,7 @@ void LLChatHistory::appendMessage(const LLChat& chat, const LLSD &args, const LL
else
{
view = getHeader(chat, style_params, args);
- if (mEditor->getText().size() == 0)
+ if (mEditor->getLength() == 0)
p.top_pad = 0;
else
p.top_pad = mTopHeaderPad;
diff --git a/indra/newview/lldrawable.cpp b/indra/newview/lldrawable.cpp
index 21b21c152a..4eda2b92b3 100644
--- a/indra/newview/lldrawable.cpp
+++ b/indra/newview/lldrawable.cpp
@@ -57,6 +57,8 @@ const F32 MIN_SHADOW_CASTER_RADIUS = 2.0f;
static LLFastTimer::DeclareTimer FTM_CULL_REBOUND("Cull Rebound");
+extern bool gShiftFrame;
+
////////////////////////
//
@@ -97,7 +99,6 @@ void LLDrawable::init()
mPositionGroup.clear();
mExtents[0].clear();
mExtents[1].clear();
- mQuietCount = 0;
mState = 0;
mVObjp = NULL;
@@ -108,6 +109,8 @@ void LLDrawable::init()
mGeneration = -1;
mBinRadius = 1.f;
+ mBinIndex = -1;
+
mSpatialBridge = NULL;
}
@@ -403,6 +406,8 @@ void LLDrawable::makeActive()
if (!isRoot() && !mParent->isActive())
{
mParent->makeActive();
+ //NOTE: linked set will now NEVER become static
+ mParent->setState(LLDrawable::ACTIVE_CHILD);
}
//all child objects must also be active
@@ -422,41 +427,27 @@ void LLDrawable::makeActive()
if (mVObjp->getPCode() == LL_PCODE_VOLUME)
{
- if (mVObjp->isFlexible())
- {
- return;
- }
- }
-
- if (mVObjp->getPCode() == LL_PCODE_VOLUME)
- {
gPipeline.markRebuild(this, LLDrawable::REBUILD_VOLUME, TRUE);
}
updatePartition();
}
- if (isRoot())
- {
- mQuietCount = 0;
- }
- else
- {
- getParent()->mQuietCount = 0;
- }
+ llassert(isAvatar() || isRoot() || mParent->isActive());
}
void LLDrawable::makeStatic(BOOL warning_enabled)
{
- if (isState(ACTIVE))
+ if (isState(ACTIVE) &&
+ !isState(ACTIVE_CHILD) &&
+ !mVObjp->isAttachment() &&
+ !mVObjp->isFlexible())
{
- clearState(ACTIVE);
-
- if (mParent.notNull() && mParent->isActive() && warning_enabled)
- {
- LL_WARNS_ONCE("Drawable") << "Drawable becomes static with active parent!" << LL_ENDL;
- }
+ clearState(ACTIVE | ANIMATED_CHILD);
+ //drawable became static with active parent, not acceptable
+ llassert(mParent.isNull() || !mParent->isActive() || !warning_enabled);
+
LLViewerObject::const_child_list_t& child_list = mVObjp->getChildren();
for (LLViewerObject::child_list_t::const_iterator iter = child_list.begin();
iter != child_list.end(); iter++)
@@ -483,8 +474,8 @@ void LLDrawable::makeStatic(BOOL warning_enabled)
mSpatialBridge->markDead();
setSpatialBridge(NULL);
}
+ updatePartition();
}
- updatePartition();
}
// Returns "distance" between target destination and resulting xfrom
@@ -538,9 +529,9 @@ F32 LLDrawable::updateXform(BOOL undamped)
target_rot = new_rot;
target_scale = new_scale;
}
- else
+ else if (mVObjp->getAngularVelocity().isExactlyZero())
{
- // snap to final position
+ // snap to final position (only if no target omega is applied)
dist_squared = 0.0f;
if (getVOVolume() && !isRoot())
{ //child prim snapping to some position, needs a rebuild
@@ -549,15 +540,25 @@ F32 LLDrawable::updateXform(BOOL undamped)
}
}
- if ((mCurrentScale != target_scale) ||
- (!isRoot() &&
- (dist_squared >= MIN_INTERPOLATE_DISTANCE_SQUARED ||
- !mVObjp->getAngularVelocity().isExactlyZero() ||
- target_pos != mXform.getPosition() ||
- target_rot != mXform.getRotation())))
- { //child prim moving or scale change requires immediate rebuild
+ LLVector3 vec = mCurrentScale-target_scale;
+
+ if (vec*vec > MIN_INTERPOLATE_DISTANCE_SQUARED)
+ { //scale change requires immediate rebuild
+ mCurrentScale = target_scale;
gPipeline.markRebuild(this, LLDrawable::REBUILD_POSITION, TRUE);
}
+ else if (!isRoot() &&
+ (!mVObjp->getAngularVelocity().isExactlyZero() ||
+ dist_squared > 0.f))
+ { //child prim moving relative to parent, tag as needing to be rendered atomically and rebuild
+ dist_squared = 1.f; //keep this object on the move list
+ if (!isState(LLDrawable::ANIMATED_CHILD))
+ {
+ setState(LLDrawable::ANIMATED_CHILD);
+ gPipeline.markRebuild(this, LLDrawable::REBUILD_ALL, TRUE);
+ mVObjp->dirtySpatialGroup();
+ }
+ }
else if (!getVOVolume() && !isAvatar())
{
movePartition();
@@ -568,9 +569,7 @@ F32 LLDrawable::updateXform(BOOL undamped)
mXform.setRotation(target_rot);
mXform.setScale(LLVector3(1,1,1)); //no scale in drawable transforms (IT'S A RULE!)
mXform.updateMatrix();
-
- mCurrentScale = target_scale;
-
+
if (mSpatialBridge)
{
gPipeline.markMoved(mSpatialBridge, FALSE);
@@ -596,7 +595,11 @@ void LLDrawable::moveUpdatePipeline(BOOL moved)
// Update the face centers.
for (S32 i = 0; i < getNumFaces(); i++)
{
- getFace(i)->updateCenterAgent();
+ LLFace* face = getFace(i);
+ if (face)
+ {
+ face->updateCenterAgent();
+ }
}
}
@@ -622,8 +625,6 @@ BOOL LLDrawable::updateMove()
return FALSE;
}
- makeActive();
-
BOOL done;
if (isState(MOVE_UNDAMPED))
@@ -632,6 +633,7 @@ BOOL LLDrawable::updateMove()
}
else
{
+ makeActive();
done = updateMoveDamped();
}
return done;
@@ -651,7 +653,6 @@ BOOL LLDrawable::updateMoveUndamped()
}
mVObjp->clearChanged(LLXform::MOVED);
-
return TRUE;
}
@@ -703,6 +704,11 @@ void LLDrawable::updateDistance(LLCamera& camera, bool force_update)
return;
}
+ if (gShiftFrame)
+ {
+ return;
+ }
+
//switch LOD with the spatial group to avoid artifacts
//LLSpatialGroup* sg = getSpatialGroup();
@@ -727,7 +733,8 @@ void LLDrawable::updateDistance(LLCamera& camera, bool force_update)
for (S32 i = 0; i < getNumFaces(); i++)
{
LLFace* facep = getFace(i);
- if (force_update || facep->getPoolType() == LLDrawPool::POOL_ALPHA)
+ if (facep &&
+ (force_update || facep->getPoolType() == LLDrawPool::POOL_ALPHA))
{
LLVector4a box;
box.setSub(facep->mExtents[1], facep->mExtents[0]);
@@ -771,18 +778,6 @@ void LLDrawable::updateTexture()
if (getVOVolume())
{
- /*if (isActive())
- {
- if (isRoot())
- {
- mQuietCount = 0;
- }
- else
- {
- getParent()->mQuietCount = 0;
- }
- }*/
-
gPipeline.markRebuild(this, LLDrawable::REBUILD_MATERIAL, TRUE);
}
}
@@ -811,14 +806,19 @@ void LLDrawable::shiftPos(const LLVector4a &shift_vector)
mXform.setPosition(mVObjp->getPositionAgent());
}
- mXform.setRotation(mVObjp->getRotation());
- mXform.setScale(1,1,1);
mXform.updateMatrix();
if (isStatic())
{
LLVOVolume* volume = getVOVolume();
- if (!volume)
+
+ bool rebuild = (!volume &&
+ getRenderType() != LLPipeline::RENDER_TYPE_TREE &&
+ getRenderType() != LLPipeline::RENDER_TYPE_TERRAIN &&
+ getRenderType() != LLPipeline::RENDER_TYPE_SKY &&
+ getRenderType() != LLPipeline::RENDER_TYPE_GROUND);
+
+ if (rebuild)
{
gPipeline.markRebuild(this, LLDrawable::REBUILD_ALL, TRUE);
}
@@ -826,13 +826,16 @@ void LLDrawable::shiftPos(const LLVector4a &shift_vector)
for (S32 i = 0; i < getNumFaces(); i++)
{
LLFace *facep = getFace(i);
- facep->mCenterAgent += LLVector3(shift_vector.getF32ptr());
- facep->mExtents[0].add(shift_vector);
- facep->mExtents[1].add(shift_vector);
-
- if (!volume && facep->hasGeometry())
+ if (facep)
{
- facep->clearVertexBuffer();
+ facep->mCenterAgent += LLVector3(shift_vector.getF32ptr());
+ facep->mExtents[0].add(shift_vector);
+ facep->mExtents[1].add(shift_vector);
+
+ if (rebuild && facep->hasGeometry())
+ {
+ facep->clearVertexBuffer();
+ }
}
}
@@ -940,6 +943,12 @@ void LLDrawable::updateUVMinMax()
{
}
+LLSpatialGroup* LLDrawable::getSpatialGroup() const
+{
+ llassert((mSpatialGroupp == NULL) ? getBinIndex() == -1 : getBinIndex() != -1);
+ return mSpatialGroupp;
+}
+
void LLDrawable::setSpatialGroup(LLSpatialGroup *groupp)
{
/*if (mSpatialGroupp && (groupp != mSpatialGroupp))
@@ -954,11 +963,16 @@ void LLDrawable::setSpatialGroup(LLSpatialGroup *groupp)
for (S32 i = 0; i < getNumFaces(); ++i)
{
LLFace* facep = getFace(i);
- facep->clearVertexBuffer();
+ if (facep)
+ {
+ facep->clearVertexBuffer();
+ }
}
}
mSpatialGroupp = groupp;
+
+ llassert((mSpatialGroupp == NULL) ? getBinIndex() == -1 : getBinIndex() != -1);
}
LLSpatialPartition* LLDrawable::getSpatialPartition()
@@ -1081,6 +1095,8 @@ LLSpatialBridge::LLSpatialBridge(LLDrawable* root, BOOL render_by_group, U32 dat
mDrawable = root;
root->setSpatialBridge(this);
+ mBinIndex = -1;
+
mRenderType = mDrawable->mRenderType;
mDrawableType = mDrawable->mRenderType;
@@ -1384,6 +1400,11 @@ void LLSpatialBridge::updateDistance(LLCamera& camera_in, bool force_update)
markDead();
return;
}
+
+ if (gShiftFrame)
+ {
+ return;
+ }
if (mDrawable->getVObj())
{
@@ -1462,7 +1483,13 @@ void LLSpatialBridge::cleanupReferences()
LLDrawable::cleanupReferences();
if (mDrawable)
{
- mDrawable->setSpatialGroup(NULL);
+ LLSpatialGroup* group = mDrawable->getSpatialGroup();
+ if (group)
+ {
+ group->mOctreeNode->remove(mDrawable);
+ mDrawable->setSpatialGroup(NULL);
+ }
+
if (mDrawable->getVObj())
{
LLViewerObject::const_child_list_t& child_list = mDrawable->getVObj()->getChildren();
@@ -1473,7 +1500,12 @@ void LLSpatialBridge::cleanupReferences()
LLDrawable* drawable = child->mDrawable;
if (drawable)
{
- drawable->setSpatialGroup(NULL);
+ LLSpatialGroup* group = drawable->getSpatialGroup();
+ if (group)
+ {
+ group->mOctreeNode->remove(drawable);
+ drawable->setSpatialGroup(NULL);
+ }
}
}
}
@@ -1529,10 +1561,10 @@ BOOL LLDrawable::isAnimating() const
return TRUE;
}
- if (!isRoot() && !mVObjp->getAngularVelocity().isExactlyZero())
- {
+ /*if (!isRoot() && !mVObjp->getAngularVelocity().isExactlyZero())
+ { //target omega
return TRUE;
- }
+ }*/
return FALSE;
}
diff --git a/indra/newview/lldrawable.h b/indra/newview/lldrawable.h
index e268640a21..b1e32bdb5b 100644
--- a/indra/newview/lldrawable.h
+++ b/indra/newview/lldrawable.h
@@ -59,6 +59,7 @@ class LLViewerTexture;
const U32 SILHOUETTE_HIGHLIGHT = 0;
// All data for new renderer goes into this class.
+LL_ALIGN_PREFIX(16)
class LLDrawable : public LLRefCount
{
public:
@@ -75,6 +76,16 @@ public:
static void initClass();
+ void* operator new(size_t size)
+ {
+ return ll_aligned_malloc_16(size);
+ }
+
+ void operator delete(void* ptr)
+ {
+ ll_aligned_free_16(ptr);
+ }
+
LLDrawable() { init(); }
MEM_TYPE_NEW(LLMemType::MTYPE_DRAWABLE);
@@ -109,6 +120,9 @@ public:
F32 getIntensity() const { return llmin(mXform.getScale().mV[0], 4.f); }
S32 getLOD() const { return mVObjp ? mVObjp->getLOD() : 1; }
F32 getBinRadius() const { return mBinRadius; }
+ S32 getBinIndex() const { return mBinIndex; }
+ void setBinIndex(S32 index) const { mBinIndex = index; }
+
void getMinMax(LLVector3& min,LLVector3& max) const { mXform.getMinMax(min,max); }
LLXformMatrix* getXform() { return &mXform; }
@@ -194,7 +208,7 @@ public:
S32 findReferences(LLDrawable *drawablep); // Not const because of @#$! iterators...
void setSpatialGroup(LLSpatialGroup *groupp);
- LLSpatialGroup *getSpatialGroup() const { return mSpatialGroupp; }
+ LLSpatialGroup *getSpatialGroup() const;
LLSpatialPartition* getSpatialPartition();
// Statics
@@ -277,11 +291,13 @@ public:
HAS_ALPHA = 0x04000000,
RIGGED = 0x08000000,
PARTITION_MOVE = 0x10000000,
+ ANIMATED_CHILD = 0x20000000,
+ ACTIVE_CHILD = 0x40000000,
} EDrawableFlags;
private: //aligned members
- LLVector4a mExtents[2];
- LLVector4a mPositionGroup;
+ LL_ALIGN_16(LLVector4a mExtents[2]);
+ LL_ALIGN_16(LLVector4a mPositionGroup);
public:
LLXformMatrix mXform;
@@ -290,8 +306,6 @@ public:
LLPointer<LLDrawable> mParent;
F32 mDistanceWRTCamera;
-
- S32 mQuietCount;
static S32 getCurrentFrame() { return sCurVisible; }
static S32 getMinVisFrameRange();
@@ -314,6 +328,7 @@ private:
mutable U32 mVisible;
F32 mRadius;
F32 mBinRadius;
+ mutable S32 mBinIndex;
S32 mGeneration;
LLVector3 mCurrentScale;
@@ -322,7 +337,7 @@ private:
static U32 sNumZombieDrawables;
static LLDynamicArrayPtr<LLPointer<LLDrawable> > sDeadList;
-};
+} LL_ALIGN_POSTFIX(16);
inline LLFace* LLDrawable::getFace(const S32 i) const
@@ -333,12 +348,14 @@ inline LLFace* LLDrawable::getFace(const S32 i) const
if ((U32) i >= mFaces.size())
{
- llerrs << "Invalid face index." << llendl;
+ llwarns << "Invalid face index." << llendl;
+ return NULL;
}
if (!mFaces[i])
{
- llerrs << "Null face found." << llendl;
+ llwarns << "Null face found." << llendl;
+ return NULL;
}
return mFaces[i];
diff --git a/indra/newview/lldrawpool.cpp b/indra/newview/lldrawpool.cpp
index 35f8a85796..94dd927d26 100644
--- a/indra/newview/lldrawpool.cpp
+++ b/indra/newview/lldrawpool.cpp
@@ -116,6 +116,7 @@ LLDrawPool::LLDrawPool(const U32 type)
sNumDrawPools++;
mId = sNumDrawPools;
mVertexShaderLevel = 0;
+ mSkipRender = false;
}
LLDrawPool::~LLDrawPool()
@@ -253,48 +254,6 @@ void LLFacePool::dirtyTextures(const std::set<LLViewerFetchedTexture*>& textures
{
}
-// static
-S32 LLFacePool::drawLoop(face_array_t& face_list)
-{
- S32 res = 0;
- if (!face_list.empty())
- {
- for (std::vector<LLFace*>::iterator iter = face_list.begin();
- iter != face_list.end(); iter++)
- {
- LLFace *facep = *iter;
- res += facep->renderIndexed();
- }
- }
- return res;
-}
-
-// static
-S32 LLFacePool::drawLoopSetTex(face_array_t& face_list, S32 stage)
-{
- S32 res = 0;
- if (!face_list.empty())
- {
- for (std::vector<LLFace*>::iterator iter = face_list.begin();
- iter != face_list.end(); iter++)
- {
- LLFace *facep = *iter;
- gGL.getTexUnit(stage)->bind(facep->getTexture(), TRUE) ;
- gGL.getTexUnit(0)->activate();
- res += facep->renderIndexed();
- }
- }
- return res;
-}
-
-void LLFacePool::drawLoop()
-{
- if (!mDrawFace.empty())
- {
- drawLoop(mDrawFace);
- }
-}
-
void LLFacePool::enqueue(LLFace* facep)
{
mDrawFace.push_back(facep);
@@ -442,7 +401,7 @@ void LLRenderPass::renderTexture(U32 type, U32 mask)
void LLRenderPass::pushBatches(U32 type, U32 mask, BOOL texture, BOOL batch_textures)
{
- for (LLCullResult::drawinfo_list_t::iterator i = gPipeline.beginRenderMap(type); i != gPipeline.endRenderMap(type); ++i)
+ for (LLCullResult::drawinfo_iterator i = gPipeline.beginRenderMap(type); i != gPipeline.endRenderMap(type); ++i)
{
LLDrawInfo* pparams = *i;
if (pparams)
@@ -460,6 +419,7 @@ void LLRenderPass::applyModelMatrix(LLDrawInfo& params)
gGL.loadMatrix(gGLModelView);
if (params.mModelMatrix)
{
+ llassert(gGL.getMatrixMode() == LLRender::MM_MODELVIEW);
gGL.multMatrix((GLfloat*) params.mModelMatrix->mMatrix);
}
gPipeline.mMatrixOpCount++;
diff --git a/indra/newview/lldrawpool.h b/indra/newview/lldrawpool.h
index 64774d06df..ab9bb9e611 100644
--- a/indra/newview/lldrawpool.h
+++ b/indra/newview/lldrawpool.h
@@ -77,6 +77,9 @@ public:
S32 getId() const { return mId; }
U32 getType() const { return mType; }
+ BOOL getSkipRenderFlag() const { return mSkipRender;}
+ void setSkipRenderFlag( BOOL flag ) { mSkipRender = flag; }
+
virtual LLViewerTexture *getDebugTexture();
virtual void beginRenderPass( S32 pass );
virtual void endRenderPass( S32 pass );
@@ -113,6 +116,7 @@ protected:
S32 mVertexShaderLevel;
S32 mId;
U32 mType; // Type of draw pool
+ BOOL mSkipRender;
};
class LLRenderPass : public LLDrawPool
@@ -186,10 +190,6 @@ public:
void buildEdges();
- static S32 drawLoop(face_array_t& face_list);
- static S32 drawLoopSetTex(face_array_t& face_list, S32 stage);
- void drawLoop();
-
void addFaceReference(LLFace *facep);
void removeFaceReference(LLFace *facep);
diff --git a/indra/newview/lldrawpoolalpha.cpp b/indra/newview/lldrawpoolalpha.cpp
index 5b62dbc560..b4f6bf9383 100644
--- a/indra/newview/lldrawpoolalpha.cpp
+++ b/indra/newview/lldrawpoolalpha.cpp
@@ -348,7 +348,7 @@ void LLDrawPoolAlpha::render(S32 pass)
void LLDrawPoolAlpha::renderAlphaHighlight(U32 mask)
{
- for (LLCullResult::sg_list_t::iterator i = gPipeline.beginAlphaGroups(); i != gPipeline.endAlphaGroups(); ++i)
+ for (LLCullResult::sg_iterator i = gPipeline.beginAlphaGroups(); i != gPipeline.endAlphaGroups(); ++i)
{
LLSpatialGroup* group = *i;
if (group->mSpatialPartition->mRenderByGroup &&
@@ -385,7 +385,7 @@ void LLDrawPoolAlpha::renderAlpha(U32 mask)
BOOL use_shaders = gPipeline.canUseVertexShaders();
- for (LLCullResult::sg_list_t::iterator i = gPipeline.beginAlphaGroups(); i != gPipeline.endAlphaGroups(); ++i)
+ for (LLCullResult::sg_iterator i = gPipeline.beginAlphaGroups(); i != gPipeline.endAlphaGroups(); ++i)
{
LLSpatialGroup* group = *i;
llassert(group);
@@ -405,6 +405,18 @@ void LLDrawPoolAlpha::renderAlpha(U32 mask)
{
LLDrawInfo& params = **k;
+ if ((params.mVertexBuffer->getTypeMask() & mask) != mask)
+ { //FIXME!
+ llwarns << "Missing required components, skipping render batch." << llendl;
+ continue;
+ }
+
+ if ((params.mVertexBuffer->getTypeMask() & mask) != mask)
+ { //FIXME!
+ llwarns << "Missing required components, skipping render batch." << llendl;
+ continue;
+ }
+
LLRenderPass::applyModelMatrix(params);
diff --git a/indra/newview/lldrawpoolavatar.cpp b/indra/newview/lldrawpoolavatar.cpp
index 0103373fd2..730ad1a364 100644
--- a/indra/newview/lldrawpoolavatar.cpp
+++ b/indra/newview/lldrawpoolavatar.cpp
@@ -261,7 +261,9 @@ void LLDrawPoolAvatar::beginPostDeferredAlpha()
sRenderingSkinned = TRUE;
gPipeline.bindDeferredShader(*sVertexProgram);
-
+
+ sVertexProgram->setMinimumAlpha(0.2f);
+
sDiffuseChannel = sVertexProgram->enableTexture(LLViewerShaderMgr::DIFFUSE_MAP);
}
@@ -1034,9 +1036,13 @@ void LLDrawPoolAvatar::endDeferredSkinned()
gGL.getTexUnit(0)->activate();
}
+static LLFastTimer::DeclareTimer FTM_RENDER_AVATARS("renderAvatars");
+
void LLDrawPoolAvatar::renderAvatars(LLVOAvatar* single_avatar, S32 pass)
{
+ LLFastTimer t(FTM_RENDER_AVATARS);
+
if (pass == -1)
{
for (S32 i = 1; i < getNumPasses(); i++)
@@ -1193,15 +1199,6 @@ void LLDrawPoolAvatar::renderAvatars(LLVOAvatar* single_avatar, S32 pass)
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);
@@ -1217,20 +1214,8 @@ void LLDrawPoolAvatar::renderAvatars(LLVOAvatar* single_avatar, S32 pass)
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;
}
@@ -1428,7 +1413,7 @@ void LLDrawPoolAvatar::updateRiggedFaceVertexBuffer(LLVOAvatar* avatar, LLFace*
void LLDrawPoolAvatar::renderRigged(LLVOAvatar* avatar, U32 type, bool glow)
{
- if (avatar->isSelf() && !gAgent.needsRenderAvatar() || !gMeshRepo.meshRezEnabled())
+ if (avatar->isSelf() && !gAgent.needsRenderAvatar())
{
return;
}
@@ -1557,8 +1542,12 @@ void LLDrawPoolAvatar::renderDeferredRiggedBump(LLVOAvatar* avatar)
renderRigged(avatar, RIGGED_DEFERRED_BUMP);
}
+static LLFastTimer::DeclareTimer FTM_RIGGED_VBO("Rigged VBO");
+
void LLDrawPoolAvatar::updateRiggedVertexBuffers(LLVOAvatar* avatar)
{
+ LLFastTimer t(FTM_RIGGED_VBO);
+
//update rigged vertex buffers
for (U32 type = 0; type < NUM_RIGGED_PASSES; ++type)
{
@@ -1630,17 +1619,56 @@ void LLDrawPoolAvatar::renderRiggedFullbrightShiny(LLVOAvatar* avatar)
void LLDrawPoolAvatar::renderRiggedAlpha(LLVOAvatar* avatar)
{
- renderRigged(avatar, RIGGED_ALPHA);
+ if (!mRiggedFace[RIGGED_ALPHA].empty())
+ {
+ 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);
+
+ renderRigged(avatar, RIGGED_ALPHA);
+ }
}
void LLDrawPoolAvatar::renderRiggedFullbrightAlpha(LLVOAvatar* avatar)
{
- renderRigged(avatar, RIGGED_FULLBRIGHT_ALPHA);
+ if (!mRiggedFace[RIGGED_FULLBRIGHT_ALPHA].empty())
+ {
+ 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);
+
+ renderRigged(avatar, RIGGED_FULLBRIGHT_ALPHA);
+ }
}
void LLDrawPoolAvatar::renderRiggedGlow(LLVOAvatar* avatar)
{
- renderRigged(avatar, RIGGED_GLOW, true);
+ if (!mRiggedFace[RIGGED_GLOW].empty())
+ {
+ 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);
+
+ renderRigged(avatar, RIGGED_GLOW, true);
+
+ gGL.setColorMask(true, false);
+ gGL.setSceneBlendType(LLRender::BT_ALPHA);
+ }
}
diff --git a/indra/newview/lldrawpoolbump.cpp b/indra/newview/lldrawpoolbump.cpp
index 6f71e6ebc8..a264eae302 100644
--- a/indra/newview/lldrawpoolbump.cpp
+++ b/indra/newview/lldrawpoolbump.cpp
@@ -847,12 +847,12 @@ void LLDrawPoolBump::renderDeferred(S32 pass)
LLFastTimer ftm(FTM_RENDER_BUMP);
U32 type = LLRenderPass::PASS_BUMP;
- LLCullResult::drawinfo_list_t::iterator begin = gPipeline.beginRenderMap(type);
- LLCullResult::drawinfo_list_t::iterator end = gPipeline.endRenderMap(type);
+ LLCullResult::drawinfo_iterator begin = gPipeline.beginRenderMap(type);
+ LLCullResult::drawinfo_iterator end = gPipeline.endRenderMap(type);
U32 mask = LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_TEXCOORD0 | LLVertexBuffer::MAP_BINORMAL | LLVertexBuffer::MAP_NORMAL | LLVertexBuffer::MAP_COLOR;
- for (LLCullResult::drawinfo_list_t::iterator i = begin; i != end; ++i)
+ for (LLCullResult::drawinfo_iterator i = begin; i != end; ++i)
{
LLDrawInfo& params = **i;
@@ -1448,10 +1448,10 @@ void LLBumpImageList::onSourceLoaded( BOOL success, LLViewerTexture *src_vi, LLI
void LLDrawPoolBump::renderBump(U32 type, U32 mask)
{
- LLCullResult::drawinfo_list_t::iterator begin = gPipeline.beginRenderMap(type);
- LLCullResult::drawinfo_list_t::iterator end = gPipeline.endRenderMap(type);
+ LLCullResult::drawinfo_iterator begin = gPipeline.beginRenderMap(type);
+ LLCullResult::drawinfo_iterator end = gPipeline.endRenderMap(type);
- for (LLCullResult::drawinfo_list_t::iterator i = begin; i != end; ++i)
+ for (LLCullResult::drawinfo_iterator i = begin; i != end; ++i)
{
LLDrawInfo& params = **i;
diff --git a/indra/newview/lldrawpoolterrain.cpp b/indra/newview/lldrawpoolterrain.cpp
index b95d8296fa..9bc32fddbd 100644
--- a/indra/newview/lldrawpoolterrain.cpp
+++ b/indra/newview/lldrawpoolterrain.cpp
@@ -294,6 +294,35 @@ void LLDrawPoolTerrain::renderShadow(S32 pass)
//glCullFace(GL_BACK);
}
+
+void LLDrawPoolTerrain::drawLoop()
+{
+ if (!mDrawFace.empty())
+ {
+ for (std::vector<LLFace*>::iterator iter = mDrawFace.begin();
+ iter != mDrawFace.end(); iter++)
+ {
+ LLFace *facep = *iter;
+
+ LLMatrix4* model_matrix = &(facep->getDrawable()->getRegion()->mRenderMatrix);
+
+ if (model_matrix != gGLLastMatrix)
+ {
+ llassert(gGL.getMatrixMode() == LLRender::MM_MODELVIEW);
+ gGLLastMatrix = model_matrix;
+ gGL.loadMatrix(gGLModelView);
+ if (model_matrix)
+ {
+ gGL.multMatrix((GLfloat*) model_matrix->mMatrix);
+ }
+ gPipeline.mMatrixOpCount++;
+ }
+
+ facep->renderIndexed();
+ }
+ }
+}
+
void LLDrawPoolTerrain::renderFullShader()
{
// Hack! Get the region that this draw pool is rendering from!
@@ -566,7 +595,8 @@ void LLDrawPoolTerrain::renderFull4TU()
gGL.matrixMode(LLRender::MM_TEXTURE);
gGL.loadIdentity();
gGL.translatef(-1.f, 0.f, 0.f);
-
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
+
// Set alpha texture and do lighting modulation
gGL.getTexUnit(3)->setTextureColorBlend(LLTexUnit::TBO_MULT, LLTexUnit::TBS_PREV_COLOR, LLTexUnit::TBS_VERT_COLOR);
gGL.getTexUnit(3)->setTextureAlphaBlend(LLTexUnit::TBO_REPLACE, LLTexUnit::TBS_TEX_ALPHA);
@@ -714,6 +744,7 @@ void LLDrawPoolTerrain::renderFull2TU()
gGL.matrixMode(LLRender::MM_TEXTURE);
gGL.loadIdentity();
gGL.translatef(-1.f, 0.f, 0.f);
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
// Care about alpha only
gGL.getTexUnit(0)->setTextureColorBlend(LLTexUnit::TBO_REPLACE, LLTexUnit::TBS_PREV_COLOR);
@@ -753,6 +784,7 @@ void LLDrawPoolTerrain::renderFull2TU()
gGL.matrixMode(LLRender::MM_TEXTURE);
gGL.loadIdentity();
gGL.translatef(-2.f, 0.f, 0.f);
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
// Care about alpha only
gGL.getTexUnit(0)->setTextureColorBlend(LLTexUnit::TBO_REPLACE, LLTexUnit::TBS_PREV_COLOR);
diff --git a/indra/newview/lldrawpoolterrain.h b/indra/newview/lldrawpoolterrain.h
index 283ed87f1a..2163d087e1 100644
--- a/indra/newview/lldrawpoolterrain.h
+++ b/indra/newview/lldrawpoolterrain.h
@@ -83,6 +83,7 @@ protected:
void renderFull2TU();
void renderFull4TU();
void renderFullShader();
+ void drawLoop();
};
#endif // LL_LLDRAWPOOLSIMPLE_H
diff --git a/indra/newview/lldrawpooltree.cpp b/indra/newview/lldrawpooltree.cpp
index 3165a3516c..fedbd782dc 100644
--- a/indra/newview/lldrawpooltree.cpp
+++ b/indra/newview/lldrawpooltree.cpp
@@ -37,6 +37,7 @@
#include "llviewershadermgr.h"
#include "llrender.h"
#include "llviewercontrol.h"
+#include "llviewerregion.h"
S32 LLDrawPoolTree::sDiffTex = 0;
static LLGLSLShader* shader = NULL;
@@ -104,8 +105,23 @@ void LLDrawPoolTree::render(S32 pass)
{
LLFace *face = *iter;
LLVertexBuffer* buff = face->getVertexBuffer();
+
if(buff)
{
+ LLMatrix4* model_matrix = &(face->getDrawable()->getRegion()->mRenderMatrix);
+
+ if (model_matrix != gGLLastMatrix)
+ {
+ gGLLastMatrix = model_matrix;
+ gGL.loadMatrix(gGLModelView);
+ if (model_matrix)
+ {
+ llassert(gGL.getMatrixMode() == LLRender::MM_MODELVIEW);
+ gGL.multMatrix((GLfloat*) model_matrix->mMatrix);
+ }
+ gPipeline.mMatrixOpCount++;
+ }
+
buff->setBuffer(LLDrawPoolTree::VERTEX_DATA_MASK);
buff->drawRange(LLRender::TRIANGLES, 0, buff->getNumVerts()-1, buff->getNumIndices(), 0);
gPipeline.addTrianglesDrawn(buff->getNumIndices());
diff --git a/indra/newview/lldriverparam.cpp b/indra/newview/lldriverparam.cpp
index 64eb11fc9b..885cae1737 100644
--- a/indra/newview/lldriverparam.cpp
+++ b/indra/newview/lldriverparam.cpp
@@ -155,6 +155,7 @@ LLDriverParam::LLDriverParam(LLVOAvatar *avatarp) :
mAvatarp(avatarp),
mWearablep(NULL)
{
+ mDefaultVec.clear();
}
LLDriverParam::LLDriverParam(LLWearable *wearablep) :
@@ -162,6 +163,7 @@ LLDriverParam::LLDriverParam(LLWearable *wearablep) :
mAvatarp(NULL),
mWearablep(wearablep)
{
+ mDefaultVec.clear();
}
LLDriverParam::~LLDriverParam()
@@ -341,18 +343,19 @@ F32 LLDriverParam::getTotalDistortion()
return sum;
}
-const LLVector3 &LLDriverParam::getAvgDistortion()
+const LLVector4a &LLDriverParam::getAvgDistortion()
{
// It's not actually correct to take the average of averages, but it good enough here.
- LLVector3 sum;
+ LLVector4a sum;
+ sum.clear();
S32 count = 0;
for( entry_list_t::iterator iter = mDriven.begin(); iter != mDriven.end(); iter++ )
{
LLDrivenEntry* driven = &(*iter);
- sum += driven->mParam->getAvgDistortion();
+ sum.add(driven->mParam->getAvgDistortion());
count++;
}
- sum /= (F32)count;
+ sum.mul( 1.f/(F32)count);
mDefaultVec = sum;
return mDefaultVec;
@@ -375,21 +378,22 @@ F32 LLDriverParam::getMaxDistortion()
}
-LLVector3 LLDriverParam::getVertexDistortion(S32 index, LLPolyMesh *poly_mesh)
+LLVector4a LLDriverParam::getVertexDistortion(S32 index, LLPolyMesh *poly_mesh)
{
- LLVector3 sum;
+ LLVector4a sum;
+ sum.clear();
for( entry_list_t::iterator iter = mDriven.begin(); iter != mDriven.end(); iter++ )
{
LLDrivenEntry* driven = &(*iter);
- sum += driven->mParam->getVertexDistortion( index, poly_mesh );
+ sum.add(driven->mParam->getVertexDistortion( index, poly_mesh ));
}
return sum;
}
-const LLVector3* LLDriverParam::getFirstDistortion(U32 *index, LLPolyMesh **poly_mesh)
+const LLVector4a* LLDriverParam::getFirstDistortion(U32 *index, LLPolyMesh **poly_mesh)
{
mCurrentDistortionParam = NULL;
- const LLVector3* v = NULL;
+ const LLVector4a* v = NULL;
for( entry_list_t::iterator iter = mDriven.begin(); iter != mDriven.end(); iter++ )
{
LLDrivenEntry* driven = &(*iter);
@@ -404,7 +408,7 @@ const LLVector3* LLDriverParam::getFirstDistortion(U32 *index, LLPolyMesh **poly
return v;
};
-const LLVector3* LLDriverParam::getNextDistortion(U32 *index, LLPolyMesh **poly_mesh)
+const LLVector4a* LLDriverParam::getNextDistortion(U32 *index, LLPolyMesh **poly_mesh)
{
llassert( mCurrentDistortionParam );
if( !mCurrentDistortionParam )
@@ -432,7 +436,7 @@ const LLVector3* LLDriverParam::getNextDistortion(U32 *index, LLPolyMesh **poly_
}
// We're already in the middle of a param's distortions, so get the next one.
- const LLVector3* v = driven->mParam->getNextDistortion( index, poly_mesh );
+ const LLVector4a* v = driven->mParam->getNextDistortion( index, poly_mesh );
if( (!v) && (iter != mDriven.end()) )
{
// This param is finished, so start the next param. It might not have any
diff --git a/indra/newview/lldriverparam.h b/indra/newview/lldriverparam.h
index fb1b44458c..7a4d711d4e 100644
--- a/indra/newview/lldriverparam.h
+++ b/indra/newview/lldriverparam.h
@@ -105,18 +105,18 @@ public:
// LLViewerVisualParam Virtual functions
/*virtual*/ F32 getTotalDistortion();
- /*virtual*/ const LLVector3& getAvgDistortion();
+ /*virtual*/ const LLVector4a& getAvgDistortion();
/*virtual*/ F32 getMaxDistortion();
- /*virtual*/ LLVector3 getVertexDistortion(S32 index, LLPolyMesh *poly_mesh);
- /*virtual*/ const LLVector3* getFirstDistortion(U32 *index, LLPolyMesh **poly_mesh);
- /*virtual*/ const LLVector3* getNextDistortion(U32 *index, LLPolyMesh **poly_mesh);
+ /*virtual*/ LLVector4a getVertexDistortion(S32 index, LLPolyMesh *poly_mesh);
+ /*virtual*/ const LLVector4a* getFirstDistortion(U32 *index, LLPolyMesh **poly_mesh);
+ /*virtual*/ const LLVector4a* getNextDistortion(U32 *index, LLPolyMesh **poly_mesh);
protected:
F32 getDrivenWeight(const LLDrivenEntry* driven, F32 input_weight);
void setDrivenWeight(LLDrivenEntry *driven, F32 driven_weight, bool upload_bake);
- LLVector3 mDefaultVec; // temp holder
+ LLVector4a mDefaultVec; // temp holder
typedef std::vector<LLDrivenEntry> entry_list_t;
entry_list_t mDriven;
LLViewerVisualParam* mCurrentDistortionParam;
diff --git a/indra/newview/lldynamictexture.cpp b/indra/newview/lldynamictexture.cpp
index bf8338e5f2..fa42b157a7 100644
--- a/indra/newview/lldynamictexture.cpp
+++ b/indra/newview/lldynamictexture.cpp
@@ -129,7 +129,7 @@ void LLViewerDynamicTexture::preRender(BOOL clear_depth)
llassert(mFullHeight <= 512);
llassert(mFullWidth <= 512);
- if (gGLManager.mHasFramebufferObject && gPipeline.mWaterDis.isComplete())
+ if (gGLManager.mHasFramebufferObject && gPipeline.mWaterDis.isComplete() && !gGLManager.mIsATI)
{ //using offscreen render target, just use the bottom left corner
mOrigin.set(0, 0);
}
@@ -216,14 +216,12 @@ BOOL LLViewerDynamicTexture::updateAllInstances()
return TRUE;
}
-#if 0 //THIS CAUSES MAINT-1092
- bool use_fbo = gGLManager.mHasFramebufferObject && gPipeline.mWaterDis.isComplete();
+ bool use_fbo = gGLManager.mHasFramebufferObject && gPipeline.mWaterDis.isComplete() && !gGLManager.mIsATI;
if (use_fbo)
{
gPipeline.mWaterDis.bindTarget();
}
-#endif
LLGLSLShader::bindNoShader();
LLVertexBuffer::unbind();
@@ -258,12 +256,10 @@ BOOL LLViewerDynamicTexture::updateAllInstances()
}
}
-#if 0
if (use_fbo)
{
gPipeline.mWaterDis.flush();
}
-#endif
return ret;
}
diff --git a/indra/newview/lldynamictexture.h b/indra/newview/lldynamictexture.h
index e18090545d..c51e7d1e1a 100644
--- a/indra/newview/lldynamictexture.h
+++ b/indra/newview/lldynamictexture.h
@@ -36,6 +36,16 @@
class LLViewerDynamicTexture : public LLViewerTexture
{
public:
+ void* operator new(size_t size)
+ {
+ return ll_aligned_malloc_16(size);
+ }
+
+ void operator delete(void* ptr)
+ {
+ ll_aligned_free_16(ptr);
+ }
+
enum
{
LL_VIEWER_DYNAMIC_TEXTURE = LLViewerTexture::DYNAMIC_TEXTURE,
@@ -85,7 +95,7 @@ protected:
protected:
BOOL mClamp;
LLCoordGL mOrigin;
- LLCamera mCamera;
+ LL_ALIGN_16(LLCamera mCamera);
typedef std::set<LLViewerDynamicTexture*> instance_list_t;
static instance_list_t sInstances[ LLViewerDynamicTexture::ORDER_COUNT ];
diff --git a/indra/newview/llface.cpp b/indra/newview/llface.cpp
index 4108d69e82..4a0c94df33 100644
--- a/indra/newview/llface.cpp
+++ b/indra/newview/llface.cpp
@@ -44,11 +44,14 @@
#include "llsky.h"
#include "llviewercamera.h"
#include "llviewertexturelist.h"
+#include "llvopartgroup.h"
#include "llvosky.h"
#include "llvovolume.h"
#include "pipeline.h"
#include "llviewerregion.h"
#include "llviewerwindow.h"
+#include "llviewershadermgr.h"
+
#define LL_MAX_INDICES_COUNT 1000000
@@ -56,7 +59,6 @@ BOOL LLFace::sSafeRenderSelect = TRUE; // FALSE
#define DOTVEC(a,b) (a.mV[0]*b.mV[0] + a.mV[1]*b.mV[1] + a.mV[2]*b.mV[2])
-
/*
For each vertex, given:
B - binormal
@@ -161,8 +163,10 @@ void LLFace::init(LLDrawable* drawablep, LLViewerObject* objp)
mGeomCount = 0;
mGeomIndex = 0;
mIndicesCount = 0;
- mIndicesIndex = 0;
- mIndexInTex = 0;
+
+ //special value to indicate uninitialized position
+ mIndicesIndex = 0xFFFFFFFF;
+
mTexture = NULL;
mTEOffset = -1;
mTextureIndex = 255;
@@ -177,12 +181,6 @@ void LLFace::init(LLDrawable* drawablep, LLViewerObject* objp)
mFaceColor = LLColor4(1,0,0,1);
- mLastVertexBuffer = mVertexBuffer;
- mLastGeomCount = mGeomCount;
- mLastGeomIndex = mGeomIndex;
- mLastIndicesCount = mIndicesCount;
- mLastIndicesIndex = mIndicesIndex;
-
mImportanceToCamera = 0.f ;
mBoundingSphereRadius = 0.0f ;
@@ -203,6 +201,12 @@ void LLFace::destroy()
mTexture->removeFace(this) ;
}
+ if (isState(LLFace::PARTICLE))
+ {
+ LLVOPartGroup::freeVBSlot(getGeomIndex()/4);
+ clearState(LLFace::PARTICLE);
+ }
+
if (mDrawPoolp)
{
if (this->isState(LLFace::RIGGED) && mDrawPoolp->getType() == LLDrawPool::POOL_AVATAR)
@@ -313,7 +317,20 @@ void LLFace::setTexture(LLViewerTexture* tex)
void LLFace::dirtyTexture()
{
- gPipeline.markTextured(getDrawable());
+ LLDrawable* drawablep = getDrawable();
+
+ if (mVObjp.notNull() && mVObjp->getVolume() &&
+ mTexture.notNull() && mTexture->getComponents() == 4)
+ { //dirty texture on an alpha object should be treated as an LoD update
+ LLVOVolume* vobj = drawablep->getVOVolume();
+ if (vobj)
+ {
+ vobj->mLODChanged = TRUE;
+ }
+ gPipeline.markRebuild(drawablep, LLDrawable::REBUILD_VOLUME, FALSE);
+ }
+
+ gPipeline.markTextured(drawablep);
}
void LLFace::switchTexture(LLViewerTexture* new_texture)
@@ -372,7 +389,6 @@ void LLFace::setSize(S32 num_vertices, S32 num_indices, bool align)
mGeomCount = num_vertices;
mIndicesCount = num_indices;
mVertexBuffer = NULL;
- mLastVertexBuffer = NULL;
}
llassert(verify());
@@ -765,12 +781,6 @@ BOOL LLFace::genVolumeBBoxes(const LLVolume &volume, S32 f,
LLMatrix4a mat_normal;
mat_normal.loadu(mat_normal_in);
- //if (mDrawablep->isState(LLDrawable::REBUILD_VOLUME))
- //{ //vertex buffer no longer valid
- // mVertexBuffer = NULL;
- // mLastVertexBuffer = NULL;
- //}
-
//VECTORIZE THIS
LLVector4a min,max;
@@ -1032,30 +1042,13 @@ bool LLFace::calcAlignedPlanarTE(const LLFace* align_to, LLVector2* res_st_offs
void LLFace::updateRebuildFlags()
{
- if (!mDrawablep->isState(LLDrawable::REBUILD_VOLUME))
- {
- BOOL moved = TRUE;
- if (mLastVertexBuffer == mVertexBuffer &&
- !mVertexBuffer->isEmpty())
- { //this face really doesn't need to be regenerated, try real hard not to do so
- if (mLastGeomCount == mGeomCount &&
- mLastGeomIndex == mGeomIndex &&
- mLastIndicesCount == mIndicesCount &&
- mLastIndicesIndex == mIndicesIndex)
- { //data is in same location in vertex buffer
- moved = FALSE;
- }
- }
- mLastMoveTime = gFrameTimeSeconds;
-
- if (moved)
- {
- mDrawablep->setState(LLDrawable::REBUILD_VOLUME);
- }
+ if (mDrawablep->isState(LLDrawable::REBUILD_VOLUME))
+ { //this rebuild is zero overhead (direct consequence of some change that affects this face)
+ mLastUpdateTime = gFrameTimeSeconds;
}
else
- {
- mLastUpdateTime = gFrameTimeSeconds;
+ { //this rebuild is overhead (side effect of some change that does not affect this face)
+ mLastMoveTime = gFrameTimeSeconds;
}
}
@@ -1094,6 +1087,73 @@ bool LLFace::canRenderAsMask()
}
+static LLFastTimer::DeclareTimer FTM_FACE_GEOM_VOLUME("Volume VB Cache");
+
+//static
+void LLFace::cacheFaceInVRAM(const LLVolumeFace& vf)
+{
+ LLFastTimer t(FTM_FACE_GEOM_VOLUME);
+ U32 mask = LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_TEXCOORD0 |
+ LLVertexBuffer::MAP_BINORMAL | LLVertexBuffer::MAP_NORMAL;
+
+ if (vf.mWeights)
+ {
+ mask |= LLVertexBuffer::MAP_WEIGHT4;
+ }
+
+ LLVertexBuffer* buff = new LLVertexBuffer(mask, GL_STATIC_DRAW_ARB);
+ vf.mVertexBuffer = buff;
+
+ buff->allocateBuffer(vf.mNumVertices, 0, true);
+
+ LLStrider<LLVector4a> f_vert;
+ LLStrider<LLVector3> f_binorm;
+ LLStrider<LLVector3> f_norm;
+ LLStrider<LLVector2> f_tc;
+
+ buff->getBinormalStrider(f_binorm);
+ buff->getVertexStrider(f_vert);
+ buff->getNormalStrider(f_norm);
+ buff->getTexCoord0Strider(f_tc);
+
+ for (U32 i = 0; i < vf.mNumVertices; ++i)
+ {
+ *f_vert++ = vf.mPositions[i];
+ (*f_binorm++).set(vf.mBinormals[i].getF32ptr());
+ *f_tc++ = vf.mTexCoords[i];
+ (*f_norm++).set(vf.mNormals[i].getF32ptr());
+ }
+
+ if (vf.mWeights)
+ {
+ LLStrider<LLVector4> f_wght;
+ buff->getWeight4Strider(f_wght);
+ for (U32 i = 0; i < vf.mNumVertices; ++i)
+ {
+ (*f_wght++).set(vf.mWeights[i].getF32ptr());
+ }
+ }
+
+ buff->flush();
+}
+
+//helper function for pushing primitives for transform shaders and cleaning up
+//uninitialized data on the tail, plus tracking number of expected primitives
+void push_for_transform(LLVertexBuffer* buff, U32 source_count, U32 dest_count)
+{
+ if (source_count > 0 && dest_count >= source_count) //protect against possible U32 wrapping
+ {
+ //push source primitives
+ buff->drawArrays(LLRender::POINTS, 0, source_count);
+ U32 tail = dest_count-source_count;
+ for (U32 i = 0; i < tail; ++i)
+ { //copy last source primitive into each element in tail
+ buff->drawArrays(LLRender::POINTS, source_count-1, 1);
+ }
+ gPipeline.mTransformFeedbackPrimitives += dest_count;
+ }
+}
+
static LLFastTimer::DeclareTimer FTM_FACE_GET_GEOM("Face Geom");
static LLFastTimer::DeclareTimer FTM_FACE_GEOM_POSITION("Position");
static LLFastTimer::DeclareTimer FTM_FACE_GEOM_NORMAL("Normal");
@@ -1111,7 +1171,6 @@ static LLFastTimer::DeclareTimer FTM_FACE_TEX_DEFAULT("Default");
static LLFastTimer::DeclareTimer FTM_FACE_TEX_QUICK("Quick");
static LLFastTimer::DeclareTimer FTM_FACE_TEX_QUICK_NO_XFORM("No Xform");
static LLFastTimer::DeclareTimer FTM_FACE_TEX_QUICK_XFORM("Xform");
-
static LLFastTimer::DeclareTimer FTM_FACE_TEX_QUICK_PLANAR("Quick Planar");
BOOL LLFace::getGeometryVolume(const LLVolume& volume,
@@ -1139,21 +1198,25 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume,
{
if (num_indices + (S32) mIndicesIndex > mVertexBuffer->getNumIndices())
{
- llwarns << "Index buffer overflow!" << llendl;
- llwarns << "Indices Count: " << mIndicesCount
- << " VF Num Indices: " << num_indices
- << " Indices Index: " << mIndicesIndex
- << " VB Num Indices: " << mVertexBuffer->getNumIndices() << llendl;
- llwarns << "Last Indices Count: " << mLastIndicesCount
- << " Last Indices Index: " << mLastIndicesIndex
- << " Face Index: " << f
- << " Pool Type: " << mPoolType << llendl;
+ if (gDebugGL)
+ {
+ llwarns << "Index buffer overflow!" << llendl;
+ llwarns << "Indices Count: " << mIndicesCount
+ << " VF Num Indices: " << num_indices
+ << " Indices Index: " << mIndicesIndex
+ << " VB Num Indices: " << mVertexBuffer->getNumIndices() << llendl;
+ llwarns << " Face Index: " << f
+ << " Pool Type: " << mPoolType << llendl;
+ }
return FALSE;
}
if (num_vertices + mGeomIndex > mVertexBuffer->getNumVerts())
{
- llwarns << "Vertex buffer overflow!" << llendl;
+ if (gDebugGL)
+ {
+ llwarns << "Vertex buffer overflow!" << llendl;
+ }
return FALSE;
}
}
@@ -1284,17 +1347,10 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume,
LLMatrix4a mat_normal;
mat_normal.loadu(mat_norm_in);
- //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);
-
F32 r = 0, os = 0, ot = 0, ms = 0, mt = 0, cos_ang = 0, sin_ang = 0;
-
+ bool do_xform = false;
if (rebuild_tcoord)
{
- LLFastTimer t(FTM_FACE_GEOM_TEXTURE);
- bool do_xform;
-
if (tep)
{
r = tep->getRotation();
@@ -1323,599 +1379,757 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume,
{
do_xform = false;
}
+ }
+
+ static LLCachedControl<bool> use_transform_feedback(gSavedSettings, "RenderUseTransformFeedback");
+
+#ifdef GL_TRANSFORM_FEEDBACK_BUFFER
+ if (use_transform_feedback &&
+ gTransformPositionProgram.mProgramObject && //transform shaders are loaded
+ mVertexBuffer->useVBOs() && //target buffer is in VRAM
+ !rebuild_weights && //TODO: add support for weights
+ !volume.isUnique()) //source volume is NOT flexi
+ { //use transform feedback to pack vertex buffer
+
+ LLVertexBuffer* buff = (LLVertexBuffer*) vf.mVertexBuffer.get();
+
+ if (vf.mVertexBuffer.isNull() || buff->getNumVerts() != vf.mNumVertices)
+ {
+ mVObjp->getVolume()->genBinormals(f);
+ LLFace::cacheFaceInVRAM(vf);
+ buff = (LLVertexBuffer*) vf.mVertexBuffer.get();
+ }
+
+ LLGLSLShader* cur_shader = LLGLSLShader::sCurBoundShaderPtr;
+
+ gGL.pushMatrix();
+ gGL.loadMatrix((GLfloat*) mat_vert_in.mMatrix);
+
+ if (rebuild_pos)
+ {
+ LLFastTimer t(FTM_FACE_GEOM_POSITION);
+ gTransformPositionProgram.bind();
+
+ mVertexBuffer->bindForFeedback(0, LLVertexBuffer::TYPE_VERTEX, mGeomIndex, mGeomCount);
+
+ U8 index = mTextureIndex < 255 ? mTextureIndex : 0;
+
+ S32 val = 0;
+ U8* vp = (U8*) &val;
+ vp[0] = index;
+ vp[1] = 0;
+ vp[2] = 0;
+ vp[3] = 0;
+
+ gTransformPositionProgram.uniform1i("texture_index_in", val);
+ glBeginTransformFeedback(GL_POINTS);
+ buff->setBuffer(LLVertexBuffer::MAP_VERTEX);
+
+ push_for_transform(buff, vf.mNumVertices, mGeomCount);
+
+ glEndTransformFeedback();
+ }
+
+ if (rebuild_color)
+ {
+ LLFastTimer t(FTM_FACE_GEOM_COLOR);
+ gTransformColorProgram.bind();
+
+ mVertexBuffer->bindForFeedback(0, LLVertexBuffer::TYPE_COLOR, mGeomIndex, mGeomCount);
+
+ S32 val = *((S32*) color.mV);
+
+ gTransformColorProgram.uniform1i("color_in", val);
+ glBeginTransformFeedback(GL_POINTS);
+ buff->setBuffer(LLVertexBuffer::MAP_VERTEX);
+ push_for_transform(buff, vf.mNumVertices, mGeomCount);
+ glEndTransformFeedback();
+ }
+
+ if (rebuild_emissive)
+ {
+ LLFastTimer t(FTM_FACE_GEOM_EMISSIVE);
+ gTransformColorProgram.bind();
+
+ mVertexBuffer->bindForFeedback(0, LLVertexBuffer::TYPE_EMISSIVE, mGeomIndex, mGeomCount);
+
+ U8 glow = (U8) llclamp((S32) (getTextureEntry()->getGlow()*255), 0, 255);
+
+ S32 glow32 = glow |
+ (glow << 8) |
+ (glow << 16) |
+ (glow << 24);
+
+ gTransformColorProgram.uniform1i("color_in", glow32);
+ glBeginTransformFeedback(GL_POINTS);
+ buff->setBuffer(LLVertexBuffer::MAP_VERTEX);
+ push_for_transform(buff, vf.mNumVertices, mGeomCount);
+ glEndTransformFeedback();
+ }
+
+ if (rebuild_normal)
+ {
+ LLFastTimer t(FTM_FACE_GEOM_NORMAL);
+ gTransformNormalProgram.bind();
+
+ mVertexBuffer->bindForFeedback(0, LLVertexBuffer::TYPE_NORMAL, mGeomIndex, mGeomCount);
- //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);
+ glBeginTransformFeedback(GL_POINTS);
+ buff->setBuffer(LLVertexBuffer::MAP_NORMAL);
+ push_for_transform(buff, vf.mNumVertices, mGeomCount);
+ glEndTransformFeedback();
+ }
- LLQuaternion bump_quat;
- if (mDrawablep->isActive())
+ if (rebuild_binormal)
{
- bump_quat = LLQuaternion(mDrawablep->getRenderMatrix());
+ LLFastTimer t(FTM_FACE_GEOM_BINORMAL);
+ gTransformBinormalProgram.bind();
+
+ mVertexBuffer->bindForFeedback(0, LLVertexBuffer::TYPE_BINORMAL, mGeomIndex, mGeomCount);
+
+ glBeginTransformFeedback(GL_POINTS);
+ buff->setBuffer(LLVertexBuffer::MAP_BINORMAL);
+ push_for_transform(buff, vf.mNumVertices, mGeomCount);
+ glEndTransformFeedback();
}
-
- if (bump_code)
+
+ if (rebuild_tcoord)
{
- mVObjp->getVolume()->genBinormals(f);
- F32 offset_multiple;
- switch( bump_code )
- {
- case BE_NO_BUMP:
- offset_multiple = 0.f;
- break;
- case BE_BRIGHTNESS:
- case BE_DARKNESS:
- if( mTexture.notNull() && mTexture->hasGLTexture())
- {
- // 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;
+ LLFastTimer t(FTM_FACE_GEOM_TEXTURE);
+ gTransformTexCoordProgram.bind();
+
+ mVertexBuffer->bindForFeedback(0, LLVertexBuffer::TYPE_TEXCOORD0, mGeomIndex, mGeomCount);
+
+ glBeginTransformFeedback(GL_POINTS);
+ buff->setBuffer(LLVertexBuffer::MAP_TEXCOORD0);
+ push_for_transform(buff, vf.mNumVertices, mGeomCount);
+ glEndTransformFeedback();
- default: // Standard bumpmap textures. Assumed to be 256x256
- offset_multiple = 1.f / 256;
- break;
- }
+ bool do_bump = bump_code && mVertexBuffer->hasDataType(LLVertexBuffer::TYPE_TEXCOORD1);
- F32 s_scale = 1.f;
- F32 t_scale = 1.f;
- if( tep )
+ if (do_bump)
{
- 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);
+ mVertexBuffer->bindForFeedback(0, LLVertexBuffer::TYPE_TEXCOORD1, mGeomIndex, mGeomCount);
+ glBeginTransformFeedback(GL_POINTS);
+ buff->setBuffer(LLVertexBuffer::MAP_TEXCOORD0);
+ push_for_transform(buff, vf.mNumVertices, mGeomCount);
+ glEndTransformFeedback();
+ }
}
- U8 texgen = getTextureEntry()->getTexGen();
- if (rebuild_tcoord && texgen != LLTextureEntry::TEX_GEN_DEFAULT)
- { //planar texgen needs binormals
- mVObjp->getVolume()->genBinormals(f);
+ glBindBufferARB(GL_TRANSFORM_FEEDBACK_BUFFER, 0);
+
+ gGL.popMatrix();
+
+ if (cur_shader)
+ {
+ cur_shader->bind();
}
+ }
+ else
+#endif
+ {
+ //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);
- U8 tex_mode = 0;
-
- if (isState(TEXTURE_ANIM))
+ if (rebuild_tcoord)
{
- LLVOVolume* vobj = (LLVOVolume*) (LLViewerObject*) mVObjp;
- tex_mode = vobj->mTexAnimMode;
+ LLFastTimer t(FTM_FACE_GEOM_TEXTURE);
+
+ //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);
- if (!tex_mode)
+ LLQuaternion bump_quat;
+ if (mDrawablep->isActive())
{
- clearState(TEXTURE_ANIM);
+ bump_quat = LLQuaternion(mDrawablep->getRenderMatrix());
}
- else
+
+ if (bump_code)
{
- os = ot = 0.f;
- r = 0.f;
- cos_ang = 1.f;
- sin_ang = 0.f;
- ms = mt = 1.f;
+ mVObjp->getVolume()->genBinormals(f);
+ F32 offset_multiple;
+ switch( bump_code )
+ {
+ case BE_NO_BUMP:
+ offset_multiple = 0.f;
+ break;
+ case BE_BRIGHTNESS:
+ case BE_DARKNESS:
+ if( mTexture.notNull() && mTexture->hasGLTexture())
+ {
+ // 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;
- do_xform = false;
+ default: // Standard bumpmap textures. Assumed to be 256x256
+ offset_multiple = 1.f / 256;
+ break;
+ }
+
+ F32 s_scale = 1.f;
+ F32 t_scale = 1.f;
+ if( tep )
+ {
+ 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);
}
- if (getVirtualSize() >= MIN_TEX_ANIM_SIZE)
- { //don't override texture transform during tc bake
- tex_mode = 0;
+ U8 texgen = getTextureEntry()->getTexGen();
+ if (rebuild_tcoord && texgen != LLTextureEntry::TEX_GEN_DEFAULT)
+ { //planar texgen needs binormals
+ mVObjp->getVolume()->genBinormals(f);
}
- }
- LLVector4a scalea;
- scalea.load3(scale.mV);
+ U8 tex_mode = 0;
+
+ if (isState(TEXTURE_ANIM))
+ {
+ LLVOVolume* vobj = (LLVOVolume*) (LLViewerObject*) mVObjp;
+ tex_mode = vobj->mTexAnimMode;
- bool do_bump = bump_code && mVertexBuffer->hasDataType(LLVertexBuffer::TYPE_TEXCOORD1);
- bool do_tex_mat = tex_mode && mTextureMatrix;
+ 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 (!in_atlas && !do_bump)
- { //not in atlas or not bump mapped, might be able to do a cheap update
- mVertexBuffer->getTexCoord0Strider(tex_coords, mGeomIndex, mGeomCount);
+ do_xform = false;
+ }
- if (texgen != LLTextureEntry::TEX_GEN_PLANAR)
- {
- LLFastTimer t(FTM_FACE_TEX_QUICK);
- if (!do_tex_mat)
+ if (getVirtualSize() >= MIN_TEX_ANIM_SIZE)
+ { //don't override texture transform during tc bake
+ tex_mode = 0;
+ }
+ }
+
+ LLVector4a scalea;
+ scalea.load3(scale.mV);
+
+ bool do_bump = bump_code && mVertexBuffer->hasDataType(LLVertexBuffer::TYPE_TEXCOORD1);
+ bool do_tex_mat = tex_mode && mTextureMatrix;
+
+ if (!in_atlas && !do_bump)
+ { //not in atlas or not bump mapped, might be able to do a cheap update
+ mVertexBuffer->getTexCoord0Strider(tex_coords, mGeomIndex, mGeomCount);
+
+ if (texgen != LLTextureEntry::TEX_GEN_PLANAR)
{
- if (!do_xform)
- {
- LLFastTimer t(FTM_FACE_TEX_QUICK_NO_XFORM);
- LLVector4a::memcpyNonAliased16((F32*) tex_coords.get(), (F32*) vf.mTexCoords, num_vertices*2*sizeof(F32));
- }
- else
+ LLFastTimer t(FTM_FACE_TEX_QUICK);
+ if (!do_tex_mat)
{
- LLFastTimer t(FTM_FACE_TEX_QUICK_XFORM);
- F32* dst = (F32*) tex_coords.get();
- LLVector4a* src = (LLVector4a*) vf.mTexCoords;
+ if (!do_xform)
+ {
+ LLFastTimer t(FTM_FACE_TEX_QUICK_NO_XFORM);
+ S32 tc_size = (num_vertices*2*sizeof(F32)+0xF) & ~0xF;
+ LLVector4a::memcpyNonAliased16((F32*) tex_coords.get(), (F32*) vf.mTexCoords, tc_size);
+ }
+ else
+ {
+ LLFastTimer t(FTM_FACE_TEX_QUICK_XFORM);
+ F32* dst = (F32*) tex_coords.get();
+ LLVector4a* src = (LLVector4a*) vf.mTexCoords;
- LLVector4a trans;
- trans.splat(-0.5f);
+ LLVector4a trans;
+ trans.splat(-0.5f);
- LLVector4a rot0;
- rot0.set(cos_ang, -sin_ang, cos_ang, -sin_ang);
+ LLVector4a rot0;
+ rot0.set(cos_ang, -sin_ang, cos_ang, -sin_ang);
- LLVector4a rot1;
- rot1.set(sin_ang, cos_ang, sin_ang, cos_ang);
+ LLVector4a rot1;
+ rot1.set(sin_ang, cos_ang, sin_ang, cos_ang);
- LLVector4a scale;
- scale.set(ms, mt, ms, mt);
+ LLVector4a scale;
+ scale.set(ms, mt, ms, mt);
- LLVector4a offset;
- offset.set(os+0.5f, ot+0.5f, os+0.5f, ot+0.5f);
+ LLVector4a offset;
+ offset.set(os+0.5f, ot+0.5f, os+0.5f, ot+0.5f);
- LLVector4Logical mask;
- mask.clear();
- mask.setElement<2>();
- mask.setElement<3>();
+ LLVector4Logical mask;
+ mask.clear();
+ mask.setElement<2>();
+ mask.setElement<3>();
- U32 count = num_vertices/2 + num_vertices%2;
+ U32 count = num_vertices/2 + num_vertices%2;
- for (S32 i = 0; i < count; i++)
+ for (S32 i = 0; i < count; i++)
+ {
+ LLVector4a res = *src++;
+ xform4a(res, trans, mask, rot0, rot1, offset, scale);
+ res.store4a(dst);
+ dst += 4;
+ }
+ }
+ }
+ else
+ { //do tex mat, no texgen, no atlas, no bump
+ for (S32 i = 0; i < num_vertices; i++)
{
- LLVector4a res = *src++;
- xform4a(res, trans, mask, rot0, rot1, offset, scale);
- res.store4a(dst);
- dst += 4;
+ 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;
}
}
}
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;
- }
- }
- }
- else
- { //no bump, no atlas, tex gen planar
- LLFastTimer t(FTM_FACE_TEX_QUICK_PLANAR);
- if (do_tex_mat)
- {
- for (S32 i = 0; i < num_vertices; i++)
- {
- 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);
+ { //no bump, no atlas, tex gen planar
+ LLFastTimer t(FTM_FACE_TEX_QUICK_PLANAR);
+ if (do_tex_mat)
+ {
+ for (S32 i = 0; i < num_vertices; i++)
+ {
+ 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];
+ 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;
+ *tex_coords++ = tc;
+ }
}
- }
- 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);
+ 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);
+ xform(tc, cos_ang, sin_ang, os, ot, ms, mt);
- *tex_coords++ = tc;
+ *tex_coords++ = tc;
+ }
}
}
- }
- if (map_range)
- {
- mVertexBuffer->flush();
+ if (map_range)
+ {
+ mVertexBuffer->flush();
+ }
}
- }
- else
- { //either bump mapped or in atlas, just do the whole expensive loop
- LLFastTimer t(FTM_FACE_TEX_DEFAULT);
- mVertexBuffer->getTexCoord0Strider(tex_coords, mGeomIndex, mGeomCount, map_range);
+ else
+ { //either bump mapped or in atlas, just do the whole expensive loop
+ LLFastTimer t(FTM_FACE_TEX_DEFAULT);
+ mVertexBuffer->getTexCoord0Strider(tex_coords, mGeomIndex, mGeomCount, map_range);
- std::vector<LLVector2> bump_tc;
+ std::vector<LLVector2> bump_tc;
- for (S32 i = 0; i < num_vertices; i++)
- {
- LLVector2 tc(vf.mTexCoords[i]);
+ for (S32 i = 0; i < num_vertices; i++)
+ {
+ LLVector2 tc(vf.mTexCoords[i]);
- LLVector4a& norm = vf.mNormals[i];
+ LLVector4a& norm = vf.mNormals[i];
- LLVector4a& center = *(vf.mCenter);
+ LLVector4a& center = *(vf.mCenter);
- if (texgen != LLTextureEntry::TEX_GEN_DEFAULT)
- {
- LLVector4a vec = vf.mPositions[i];
+ if (texgen != LLTextureEntry::TEX_GEN_DEFAULT)
+ {
+ LLVector4a vec = vf.mPositions[i];
- vec.mul(scalea);
+ vec.mul(scalea);
+
+ 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;
+ }
+ }
- switch (texgen)
+ if (tex_mode && mTextureMatrix)
{
- case LLTextureEntry::TEX_GEN_PLANAR:
- 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];
+ }
+ 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.
+ //
+
+ 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 LLTextureEntry::TEX_GEN_SPHERICAL:
- sphericalProjection(tc, norm, center, vec);
+ 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 LLTextureEntry::TEX_GEN_CYLINDRICAL:
- cylindricalProjection(tc, norm, center, vec);
+ 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;
- }
- }
+ }
+
+ tc.mV[0] = tcoord_xoffset + tcoord_xscale * tc.mV[0] ;
+ tc.mV[1] = tcoord_yoffset + tcoord_yscale * tc.mV[1] ;
+ }
+
- if (tex_mode && mTextureMatrix)
- {
- 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 (do_bump)
+ {
+ bump_tc.push_back(tc);
+ }
}
- else
+
+ if (map_range)
{
- xform(tc, cos_ang, sin_ang, os, ot, ms, mt);
+ mVertexBuffer->flush();
}
- if(in_atlas)
+ if (do_bump)
{
- //
- //manually calculate tex-coord per vertex for varying address modes.
- //should be removed if shader can handle this.
- //
-
- S32 int_part = 0 ;
- switch(mTexture->getAddressMode())
+ mVertexBuffer->getTexCoord1Strider(tex_coords2, mGeomIndex, mGeomCount, map_range);
+
+ for (S32 i = 0; i < num_vertices; i++)
{
- 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
+ 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())
{
- tc.mV[0] -= int_part ;
+ LLVector3 t;
+ t.set(binormal.getF32ptr());
+ t *= bump_quat;
+ binormal.load3(t.mV);
}
- 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;
+ binormal.normalize3fast();
+ LLVector2 tc = bump_tc[i];
+ tc += LLVector2( bump_s_primary_light_ray.dot3(tangent).getF32(), bump_t_primary_light_ray.dot3(binormal).getF32() );
+
+ *tex_coords2++ = tc;
}
-
- tc.mV[0] = tcoord_xoffset + tcoord_xscale * tc.mV[0] ;
- tc.mV[1] = tcoord_yoffset + tcoord_yscale * tc.mV[1] ;
- }
-
-
- *tex_coords++ = tc;
- if (do_bump)
- {
- bump_tc.push_back(tc);
- }
- }
-
- if (map_range)
- {
- mVertexBuffer->flush();
- }
- if (do_bump)
- {
- mVertexBuffer->getTexCoord1Strider(tex_coords2, mGeomIndex, mGeomCount, map_range);
-
- for (S32 i = 0; i < num_vertices; i++)
- {
- 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())
+ if (map_range)
{
- LLVector3 t;
- t.set(binormal.getF32ptr());
- t *= bump_quat;
- binormal.load3(t.mV);
+ mVertexBuffer->flush();
}
-
- binormal.normalize3fast();
- LLVector2 tc = bump_tc[i];
- tc += LLVector2( bump_s_primary_light_ray.dot3(tangent).getF32(), bump_t_primary_light_ray.dot3(binormal).getF32() );
-
- *tex_coords2++ = tc;
- }
-
- if (map_range)
- {
- mVertexBuffer->flush();
}
}
}
- }
- if (rebuild_pos)
- {
- LLFastTimer t(FTM_FACE_GEOM_POSITION);
- llassert(num_vertices > 0);
+ if (rebuild_pos)
+ {
+ LLFastTimer t(FTM_FACE_GEOM_POSITION);
+ llassert(num_vertices > 0);
- mVertexBuffer->getVertexStrider(vert, mGeomIndex, mGeomCount, map_range);
+ mVertexBuffer->getVertexStrider(vert, mGeomIndex, mGeomCount, map_range);
- LLMatrix4a mat_vert;
- mat_vert.loadu(mat_vert_in);
-
- LLVector4a* src = vf.mPositions;
- volatile F32* dst = (volatile F32*) vert.get();
+ LLMatrix4a mat_vert;
+ mat_vert.loadu(mat_vert_in);
- volatile F32* end = dst+num_vertices*4;
- LLVector4a res;
+ LLVector4a* src = vf.mPositions;
+ volatile F32* dst = (volatile F32*) vert.get();
- LLVector4a texIdx;
+ volatile F32* end = dst+num_vertices*4;
+ LLVector4a res;
- U8 index = mTextureIndex < 255 ? mTextureIndex : 0;
+ LLVector4a texIdx;
- F32 val = 0.f;
- U8* vp = (U8*) &val;
- vp[0] = index;
- vp[1] = 0;
- vp[2] = 0;
- vp[3] = 0;
+ S32 index = mTextureIndex < 255 ? mTextureIndex : 0;
- llassert(index <= LLGLSLShader::sIndexedTextureChannels-1);
+ F32 val = 0.f;
+ S32* vp = (S32*) &val;
+ *vp = index;
+
+ llassert(index <= LLGLSLShader::sIndexedTextureChannels-1);
- LLVector4Logical mask;
- mask.clear();
- mask.setElement<3>();
+ LLVector4Logical mask;
+ mask.clear();
+ mask.setElement<3>();
- texIdx.set(0,0,0,val);
+ texIdx.set(0,0,0,val);
- {
- LLFastTimer t(FTM_FACE_POSITION_STORE);
- LLVector4a tmp;
-
- do
- {
- mat_vert.affineTransform(*src++, res);
- tmp.setSelectWithMask(mask, texIdx, res);
- tmp.store4a((F32*) dst);
- dst += 4;
+ {
+ LLFastTimer t(FTM_FACE_POSITION_STORE);
+ LLVector4a tmp;
+
+ do
+ {
+ mat_vert.affineTransform(*src++, res);
+ tmp.setSelectWithMask(mask, texIdx, res);
+ tmp.store4a((F32*) dst);
+ dst += 4;
+ }
+ while(dst < end);
}
- while(dst < end);
- }
- {
- LLFastTimer t(FTM_FACE_POSITION_PAD);
- S32 aligned_pad_vertices = mGeomCount - num_vertices;
- res.set(res[0], res[1], res[2], 0.f);
+ {
+ LLFastTimer t(FTM_FACE_POSITION_PAD);
+ S32 aligned_pad_vertices = mGeomCount - num_vertices;
+ res.set(res[0], res[1], res[2], 0.f);
+
+ while (aligned_pad_vertices > 0)
+ {
+ --aligned_pad_vertices;
+ res.store4a((F32*) dst);
+ dst += 4;
+ }
+ }
- while (aligned_pad_vertices > 0)
+ if (map_range)
{
- --aligned_pad_vertices;
- res.store4a((F32*) dst);
- dst += 4;
+ mVertexBuffer->flush();
}
}
- if (map_range)
- {
- mVertexBuffer->flush();
- }
- }
- if (rebuild_normal)
- {
- LLFastTimer t(FTM_FACE_GEOM_NORMAL);
- mVertexBuffer->getNormalStrider(norm, mGeomIndex, mGeomCount, map_range);
- F32* normals = (F32*) norm.get();
+ if (rebuild_normal)
+ {
+ LLFastTimer t(FTM_FACE_GEOM_NORMAL);
+ mVertexBuffer->getNormalStrider(norm, mGeomIndex, mGeomCount, map_range);
+ F32* normals = (F32*) norm.get();
- for (S32 i = 0; i < num_vertices; i++)
- {
- LLVector4a normal;
- mat_normal.rotate(vf.mNormals[i], normal);
- normal.normalize3fast();
- normal.store4a(normals);
- normals += 4;
- }
+ for (S32 i = 0; i < num_vertices; i++)
+ {
+ LLVector4a normal;
+ mat_normal.rotate(vf.mNormals[i], normal);
+ normal.normalize3fast();
+ normal.store4a(normals);
+ normals += 4;
+ }
- if (map_range)
- {
- mVertexBuffer->flush();
+ if (map_range)
+ {
+ mVertexBuffer->flush();
+ }
}
- }
- if (rebuild_binormal)
- {
- LLFastTimer t(FTM_FACE_GEOM_BINORMAL);
- mVertexBuffer->getBinormalStrider(binorm, mGeomIndex, mGeomCount, map_range);
- F32* binormals = (F32*) binorm.get();
+ if (rebuild_binormal)
+ {
+ LLFastTimer t(FTM_FACE_GEOM_BINORMAL);
+ mVertexBuffer->getBinormalStrider(binorm, mGeomIndex, mGeomCount, map_range);
+ F32* binormals = (F32*) binorm.get();
- for (S32 i = 0; i < num_vertices; i++)
- {
- LLVector4a binormal;
- mat_normal.rotate(vf.mBinormals[i], binormal);
- binormal.normalize3fast();
- binormal.store4a(binormals);
- binormals += 4;
- }
+ for (S32 i = 0; i < num_vertices; i++)
+ {
+ LLVector4a binormal;
+ mat_normal.rotate(vf.mBinormals[i], binormal);
+ binormal.normalize3fast();
+ binormal.store4a(binormals);
+ binormals += 4;
+ }
- if (map_range)
- {
- mVertexBuffer->flush();
+ if (map_range)
+ {
+ mVertexBuffer->flush();
+ }
}
- }
- if (rebuild_weights && vf.mWeights)
- {
- LLFastTimer t(FTM_FACE_GEOM_WEIGHTS);
- mVertexBuffer->getWeight4Strider(wght, mGeomIndex, mGeomCount, map_range);
- F32* weights = (F32*) wght.get();
- LLVector4a::memcpyNonAliased16(weights, (F32*) vf.mWeights, num_vertices*4*sizeof(F32));
- if (map_range)
+ if (rebuild_weights && vf.mWeights)
{
- mVertexBuffer->flush();
+ LLFastTimer t(FTM_FACE_GEOM_WEIGHTS);
+ mVertexBuffer->getWeight4Strider(wght, mGeomIndex, mGeomCount, map_range);
+ F32* weights = (F32*) wght.get();
+ LLVector4a::memcpyNonAliased16(weights, (F32*) vf.mWeights, num_vertices*4*sizeof(F32));
+ if (map_range)
+ {
+ mVertexBuffer->flush();
+ }
}
- }
- if (rebuild_color && mVertexBuffer->hasDataType(LLVertexBuffer::TYPE_COLOR) )
- {
- LLFastTimer t(FTM_FACE_GEOM_COLOR);
- mVertexBuffer->getColorStrider(colors, mGeomIndex, mGeomCount, map_range);
+ if (rebuild_color && mVertexBuffer->hasDataType(LLVertexBuffer::TYPE_COLOR) )
+ {
+ LLFastTimer t(FTM_FACE_GEOM_COLOR);
+ mVertexBuffer->getColorStrider(colors, mGeomIndex, mGeomCount, map_range);
- LLVector4a src;
+ LLVector4a src;
- U32 vec[4];
- vec[0] = vec[1] = vec[2] = vec[3] = color.mAll;
+ U32 vec[4];
+ vec[0] = vec[1] = vec[2] = vec[3] = color.mAll;
- src.loadua((F32*) vec);
+ src.loadua((F32*) vec);
- F32* dst = (F32*) colors.get();
- S32 num_vecs = num_vertices/4;
- if (num_vertices%4 > 0)
- {
- ++num_vecs;
- }
+ F32* dst = (F32*) colors.get();
+ S32 num_vecs = num_vertices/4;
+ if (num_vertices%4 > 0)
+ {
+ ++num_vecs;
+ }
- for (S32 i = 0; i < num_vecs; i++)
- {
- src.store4a(dst);
- dst += 4;
- }
+ for (S32 i = 0; i < num_vecs; i++)
+ {
+ src.store4a(dst);
+ dst += 4;
+ }
- if (map_range)
- {
- mVertexBuffer->flush();
+ if (map_range)
+ {
+ mVertexBuffer->flush();
+ }
}
- }
- if (rebuild_emissive)
- {
- LLFastTimer t(FTM_FACE_GEOM_EMISSIVE);
- LLStrider<LLColor4U> emissive;
- mVertexBuffer->getEmissiveStrider(emissive, mGeomIndex, mGeomCount, map_range);
+ if (rebuild_emissive)
+ {
+ LLFastTimer t(FTM_FACE_GEOM_EMISSIVE);
+ LLStrider<LLColor4U> emissive;
+ mVertexBuffer->getEmissiveStrider(emissive, mGeomIndex, mGeomCount, map_range);
- U8 glow = (U8) llclamp((S32) (getTextureEntry()->getGlow()*255), 0, 255);
+ U8 glow = (U8) llclamp((S32) (getTextureEntry()->getGlow()*255), 0, 255);
- LLVector4a src;
+ LLVector4a src;
- U32 glow32 = glow |
- (glow << 8) |
- (glow << 16) |
- (glow << 24);
+ U32 glow32 = glow |
+ (glow << 8) |
+ (glow << 16) |
+ (glow << 24);
- U32 vec[4];
- vec[0] = vec[1] = vec[2] = vec[3] = glow32;
+ U32 vec[4];
+ vec[0] = vec[1] = vec[2] = vec[3] = glow32;
- src.loadua((F32*) vec);
+ src.loadua((F32*) vec);
- F32* dst = (F32*) emissive.get();
- S32 num_vecs = num_vertices/4;
- if (num_vertices%4 > 0)
- {
- ++num_vecs;
- }
+ F32* dst = (F32*) emissive.get();
+ S32 num_vecs = num_vertices/4;
+ if (num_vertices%4 > 0)
+ {
+ ++num_vecs;
+ }
- for (S32 i = 0; i < num_vecs; i++)
- {
- src.store4a(dst);
- dst += 4;
- }
+ for (S32 i = 0; i < num_vecs; i++)
+ {
+ src.store4a(dst);
+ dst += 4;
+ }
- if (map_range)
- {
- mVertexBuffer->flush();
+ if (map_range)
+ {
+ mVertexBuffer->flush();
+ }
}
}
+
if (rebuild_tcoord)
{
mTexExtents[0].setVec(0,0);
@@ -1932,12 +2146,6 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume,
}
- mLastVertexBuffer = mVertexBuffer;
- mLastGeomCount = mGeomCount;
- mLastGeomIndex = mGeomIndex;
- mLastIndicesCount = mIndicesCount;
- mLastIndicesIndex = mIndicesIndex;
-
return TRUE;
}
@@ -1959,6 +2167,12 @@ BOOL LLFace::hasMedia() const
const F32 LEAST_IMPORTANCE = 0.05f ;
const F32 LEAST_IMPORTANCE_FOR_LARGE_IMAGE = 0.3f ;
+void LLFace::resetVirtualSize()
+{
+ setVirtualSize(0.f);
+ mImportanceToCamera = 0.f;
+}
+
F32 LLFace::getTextureVirtualSize()
{
F32 radius;
@@ -2024,8 +2238,17 @@ BOOL LLFace::calcPixelArea(F32& cos_angle_to_view_dir, F32& radius)
LLVector4a t;
t.load3(camera->getOrigin().mV);
lookAt.setSub(center, t);
+
F32 dist = lookAt.getLength3().getF32();
- dist = llmax(dist-size.getLength3().getF32(), 0.f);
+ dist = llmax(dist-size.getLength3().getF32(), 0.001f);
+ //ramp down distance for nearby objects
+ if (dist < 16.f)
+ {
+ dist /= 16.f;
+ dist *= dist;
+ dist *= 16.f;
+ }
+
lookAt.normalize3fast() ;
//get area of circle around node
@@ -2516,7 +2739,6 @@ void LLFace::setVertexBuffer(LLVertexBuffer* buffer)
void LLFace::clearVertexBuffer()
{
mVertexBuffer = NULL;
- mLastVertexBuffer = NULL;
}
//static
diff --git a/indra/newview/llface.h b/indra/newview/llface.h
index 82e4ab61b7..de4d03351c 100644
--- a/indra/newview/llface.h
+++ b/indra/newview/llface.h
@@ -59,6 +59,17 @@ class LLFace
{
public:
+ void* operator new(size_t size)
+ {
+ return ll_aligned_malloc_16(size);
+ }
+
+ void operator delete(void* ptr)
+ {
+ ll_aligned_free_16(ptr);
+ }
+
+
LLFace(const LLFace& rhs)
{
*this = rhs;
@@ -79,10 +90,13 @@ public:
USE_FACE_COLOR = 0x0010,
TEXTURE_ANIM = 0x0020,
RIGGED = 0x0040,
+ PARTICLE = 0x0080,
};
static void initClass();
+ static void cacheFaceInVRAM(const LLVolumeFace& vf);
+
public:
LLFace(LLDrawable* drawablep, LLViewerObject* objp) { init(drawablep, objp); }
~LLFace() { destroy(); }
@@ -204,6 +218,7 @@ public:
F32 getTextureVirtualSize() ;
F32 getImportanceToCamera()const {return mImportanceToCamera ;}
+ void resetVirtualSize();
void setHasMedia(bool has_media) { mHasMedia = has_media ;}
BOOL hasMedia() const ;
@@ -222,7 +237,7 @@ public:
//vertex buffer tracking
void setVertexBuffer(LLVertexBuffer* buffer);
- void clearVertexBuffer(); //sets mVertexBuffer and mLastVertexBuffer to NULL
+ void clearVertexBuffer(); //sets mVertexBuffer to NULL
LLVertexBuffer* getVertexBuffer() const { return mVertexBuffer; }
U32 getRiggedVertexBufferDataMask() const;
S32 getRiggedIndex(U32 type) const;
@@ -255,8 +270,7 @@ public:
private:
LLPointer<LLVertexBuffer> mVertexBuffer;
- LLPointer<LLVertexBuffer> mLastVertexBuffer;
-
+
U32 mState;
LLFacePool* mDrawPoolp;
U32 mPoolType;
@@ -269,12 +283,6 @@ private:
U32 mIndicesIndex; // index into draw pool for indices (yeah, I know!)
S32 mIndexInTex ;
- //previous rebuild's geometry info
- U16 mLastGeomCount;
- U16 mLastGeomIndex;
- U32 mLastIndicesCount;
- U32 mLastIndicesIndex;
-
LLXformMatrix* mXform;
LLPointer<LLViewerTexture> mTexture;
LLPointer<LLDrawable> mDrawablep;
diff --git a/indra/newview/llfavoritesbar.cpp b/indra/newview/llfavoritesbar.cpp
index 575b613ccf..4cbc9cab4a 100644
--- a/indra/newview/llfavoritesbar.cpp
+++ b/indra/newview/llfavoritesbar.cpp
@@ -1191,7 +1191,7 @@ void LLFavoritesBarCtrl::doToSelected(const LLSD& userdata)
}
else if (action == "paste")
{
- pastFromClipboard();
+ pasteFromClipboard();
}
else if (action == "delete")
{
@@ -1239,7 +1239,7 @@ BOOL LLFavoritesBarCtrl::isClipboardPasteable() const
return TRUE;
}
-void LLFavoritesBarCtrl::pastFromClipboard() const
+void LLFavoritesBarCtrl::pasteFromClipboard() const
{
LLInventoryModel* model = &gInventory;
if(model && isClipboardPasteable())
diff --git a/indra/newview/llfavoritesbar.h b/indra/newview/llfavoritesbar.h
index 2f75b3bb0e..447d30f1f4 100644
--- a/indra/newview/llfavoritesbar.h
+++ b/indra/newview/llfavoritesbar.h
@@ -90,7 +90,7 @@ protected:
bool enableSelected(const LLSD& userdata);
void doToSelected(const LLSD& userdata);
BOOL isClipboardPasteable() const;
- void pastFromClipboard() const;
+ void pasteFromClipboard() const;
void showDropDownMenu();
diff --git a/indra/newview/llfeaturemanager.cpp b/indra/newview/llfeaturemanager.cpp
index ec2493dd2e..393f8b9d46 100644
--- a/indra/newview/llfeaturemanager.cpp
+++ b/indra/newview/llfeaturemanager.cpp
@@ -697,6 +697,7 @@ void LLFeatureManager::setGraphicsLevel(S32 level, bool skipFeatures)
LLViewerShaderMgr::sSkipReload = false;
LLViewerShaderMgr::instance()->setShaders();
+ gPipeline.refreshCachedSettings();
}
void LLFeatureManager::applyBaseMasks()
diff --git a/indra/newview/llfilepicker.cpp b/indra/newview/llfilepicker.cpp
index 8986a694f9..4bf5b26b3b 100644
--- a/indra/newview/llfilepicker.cpp
+++ b/indra/newview/llfilepicker.cpp
@@ -59,6 +59,7 @@ LLFilePicker LLFilePicker::sInstance;
#define RAW_FILTER L"RAW files (*.raw)\0*.raw\0"
#define MODEL_FILTER L"Model files (*.dae)\0*.dae\0"
#define SCRIPT_FILTER L"Script files (*.lsl)\0*.lsl\0"
+#define DICTIONARY_FILTER L"Dictionary files (*.dic; *.xcu)\0*.dic;*.xcu\0"
#endif
//
@@ -218,6 +219,10 @@ BOOL LLFilePicker::setupFilter(ELoadFilter filter)
mOFN.lpstrFilter = SCRIPT_FILTER \
L"\0";
break;
+ case FFLOAD_DICTIONARY:
+ mOFN.lpstrFilter = DICTIONARY_FILTER \
+ L"\0";
+ break;
default:
res = FALSE;
break;
@@ -643,6 +648,16 @@ Boolean LLFilePicker::navOpenFilterProc(AEDesc *theItem, void *info, void *callB
result = false;
}
}
+ else if (filter == FFLOAD_DICTIONARY)
+ {
+ if (fileInfo.filetype != 'DIC ' &&
+ fileInfo.filetype != 'XCU ' &&
+ (fileInfo.extension && (CFStringCompare(fileInfo.extension, CFSTR("dic"), kCFCompareCaseInsensitive) != kCFCompareEqualTo) &&
+ fileInfo.extension && (CFStringCompare(fileInfo.extension, CFSTR("xcu"), kCFCompareCaseInsensitive) != kCFCompareEqualTo)))
+ {
+ result = false;
+ }
+ }
if (fileInfo.extension)
{
@@ -1235,6 +1250,12 @@ static std::string add_script_filter_to_gtkchooser(GtkWindow *picker)
LLTrans::getString("script_files") + " (*.lsl)");
}
+static std::string add_dictionary_filter_to_gtkchooser(GtkWindow *picker)
+{
+ return add_simple_mime_filter_to_gtkchooser(picker, "text/plain",
+ LLTrans::getString("dictionary_files") + " (*.dic; *.xcu)");
+}
+
BOOL LLFilePicker::getSaveFile( ESaveFilter filter, const std::string& filename )
{
BOOL rtn = FALSE;
@@ -1371,6 +1392,9 @@ BOOL LLFilePicker::getOpenFile( ELoadFilter filter, bool blocking )
case FFLOAD_SCRIPT:
filtername = add_script_filter_to_gtkchooser(picker);
break;
+ case FFLOAD_DICTIONARY:
+ filtername = add_dictionary_filter_to_gtkchooser(picker);
+ break;
default:;
break;
}
diff --git a/indra/newview/llfilepicker.h b/indra/newview/llfilepicker.h
index a4d5d68ff5..55c665b9c7 100644
--- a/indra/newview/llfilepicker.h
+++ b/indra/newview/llfilepicker.h
@@ -85,6 +85,7 @@ public:
FFLOAD_MODEL = 9,
FFLOAD_COLLADA = 10,
FFLOAD_SCRIPT = 11,
+ FFLOAD_DICTIONARY = 12
};
enum ESaveFilter
diff --git a/indra/newview/llflexibleobject.cpp b/indra/newview/llflexibleobject.cpp
index 32a533570a..ef412a6bbf 100644
--- a/indra/newview/llflexibleobject.cpp
+++ b/indra/newview/llflexibleobject.cpp
@@ -44,6 +44,8 @@
#include "llvoavatar.h"
/*static*/ F32 LLVolumeImplFlexible::sUpdateFactor = 1.0f;
+std::vector<LLVolumeImplFlexible*> LLVolumeImplFlexible::sInstanceList;
+std::vector<S32> LLVolumeImplFlexible::sUpdateDelay;
static LLFastTimer::DeclareTimer FTM_FLEXIBLE_REBUILD("Rebuild");
static LLFastTimer::DeclareTimer FTM_DO_FLEXIBLE_UPDATE("Update");
@@ -65,13 +67,50 @@ LLVolumeImplFlexible::LLVolumeImplFlexible(LLViewerObject* vo, LLFlexibleObjectD
mFrameNum = 0;
mCollisionSphereRadius = 0.f;
mRenderRes = 1;
-
+
if(mVO->mDrawable.notNull())
{
mVO->mDrawable->makeActive() ;
}
+
+ mInstanceIndex = sInstanceList.size();
+ sInstanceList.push_back(this);
+ sUpdateDelay.push_back(0);
}//-----------------------------------------------
+LLVolumeImplFlexible::~LLVolumeImplFlexible()
+{
+ S32 end_idx = sInstanceList.size()-1;
+
+ if (end_idx != mInstanceIndex)
+ {
+ sInstanceList[mInstanceIndex] = sInstanceList[end_idx];
+ sInstanceList[mInstanceIndex]->mInstanceIndex = mInstanceIndex;
+ sUpdateDelay[mInstanceIndex] = sUpdateDelay[end_idx];
+ }
+
+ sInstanceList.pop_back();
+ sUpdateDelay.pop_back();
+}
+
+//static
+void LLVolumeImplFlexible::updateClass()
+{
+ std::vector<S32>::iterator delay_iter = sUpdateDelay.begin();
+
+ for (std::vector<LLVolumeImplFlexible*>::iterator iter = sInstanceList.begin();
+ iter != sInstanceList.end();
+ ++iter)
+ {
+ --(*delay_iter);
+ if (*delay_iter <= 0)
+ {
+ (*iter)->doIdleUpdate();
+ }
+ ++delay_iter;
+ }
+}
+
LLVector3 LLVolumeImplFlexible::getFramePosition() const
{
return mVO->getRenderPosition();
@@ -255,50 +294,28 @@ void LLVolumeImplFlexible::onSetVolume(const LLVolumeParams &volume_params, cons
{
}
-//---------------------------------------------------------------------------------
-// This calculates the physics of the flexible object. Note that it has to be 0
-// updated every time step. In the future, perhaps there could be an
-// optimization similar to what Havok does for objects that are stationary.
-//---------------------------------------------------------------------------------
-static LLFastTimer::DeclareTimer FTM_FLEXIBLE_UPDATE("Update Flexies");
-BOOL LLVolumeImplFlexible::doIdleUpdate(LLAgent &agent, LLWorld &world, const F64 &time)
-{
- if (mVO->mDrawable.isNull())
- {
- // Don't do anything until we have a drawable
- return FALSE; // (we are not initialized or updated)
- }
-
- BOOL force_update = mSimulateRes == 0 ? TRUE : FALSE;
- //flexible objects never go static
- mVO->mDrawable->mQuietCount = 0;
- if (!mVO->mDrawable->isRoot())
- {
- LLViewerObject* parent = (LLViewerObject*) mVO->getParent();
- parent->mDrawable->mQuietCount = 0;
- }
+void LLVolumeImplFlexible::updateRenderRes()
+{
+ LLDrawable* drawablep = mVO->mDrawable;
- LLFastTimer ftm(FTM_FLEXIBLE_UPDATE);
-
S32 new_res = mAttributes->getSimulateLOD();
- //number of segments only cares about z axis
- F32 app_angle = llround((F32) atan2( mVO->getScale().mV[2]*2.f, mVO->mDrawable->mDistanceWRTCamera) * RAD_TO_DEG, 0.01f);
+#if 1 //optimal approximation of previous behavior that doesn't rely on atan2
+ F32 app_angle = mVO->getScale().mV[2]/drawablep->mDistanceWRTCamera;
// Rendering sections increases with visible angle on the screen
- mRenderRes = (S32)(FLEXIBLE_OBJECT_MAX_SECTIONS*4*app_angle*DEG_TO_RAD/LLViewerCamera::getInstance()->getView());
- if (mRenderRes > FLEXIBLE_OBJECT_MAX_SECTIONS)
- {
- mRenderRes = FLEXIBLE_OBJECT_MAX_SECTIONS;
- }
-
+ mRenderRes = (S32) (12.f*app_angle);
+#else //legacy behavior
+ //number of segments only cares about z axis
+ F32 app_angle = llround((F32) atan2( mVO->getScale().mV[2]*2.f, drawablep->mDistanceWRTCamera) * RAD_TO_DEG, 0.01f);
- // Bottom cap at 1/4 the original number of sections
- if (mRenderRes < mAttributes->getSimulateLOD()-1)
- {
- mRenderRes = mAttributes->getSimulateLOD()-1;
- }
+ // Rendering sections increases with visible angle on the screen
+ mRenderRes = (S32)(FLEXIBLE_OBJECT_MAX_SECTIONS*4*app_angle*DEG_TO_RAD/LLViewerCamera::getInstance()->getView());
+#endif
+
+ mRenderRes = llclamp(mRenderRes, new_res-1, (S32) FLEXIBLE_OBJECT_MAX_SECTIONS);
+
// Throttle back simulation of segments we're not rendering
if (mRenderRes < new_res)
{
@@ -311,43 +328,74 @@ BOOL LLVolumeImplFlexible::doIdleUpdate(LLAgent &agent, LLWorld &world, const F6
setAttributesOfAllSections();
mInitialized = TRUE;
}
- if (!gPipeline.hasRenderDebugFeatureMask(LLPipeline::RENDER_DEBUG_FEATURE_FLEXIBLE))
- {
- return FALSE; // (we are not initialized or updated)
- }
-
- bool visible = mVO->mDrawable->isVisible();
+}
+//---------------------------------------------------------------------------------
+// This calculates the physics of the flexible object. Note that it has to be 0
+// updated every time step. In the future, perhaps there could be an
+// optimization similar to what Havok does for objects that are stationary.
+//---------------------------------------------------------------------------------
+static LLFastTimer::DeclareTimer FTM_FLEXIBLE_UPDATE("Update Flexies");
+void LLVolumeImplFlexible::doIdleUpdate()
+{
+ LLDrawable* drawablep = mVO->mDrawable;
- if (force_update && visible)
- {
- gPipeline.markRebuild(mVO->mDrawable, LLDrawable::REBUILD_POSITION, FALSE);
- }
- else if (visible &&
- !mVO->mDrawable->isState(LLDrawable::IN_REBUILD_Q1) &&
- mVO->getPixelArea() > 256.f)
+ if (drawablep)
{
- U32 id;
- F32 pixel_area = mVO->getPixelArea();
-
- if (mVO->isRootEdit())
- {
- id = mID;
- }
- else
+ //LLFastTimer ftm(FTM_FLEXIBLE_UPDATE);
+
+ //ensure drawable is active
+ drawablep->makeActive();
+
+ if (gPipeline.hasRenderDebugFeatureMask(LLPipeline::RENDER_DEBUG_FEATURE_FLEXIBLE))
{
- LLVOVolume* parent = (LLVOVolume*) mVO->getParent();
- id = parent->getVolumeInterfaceID();
- }
+ bool visible = drawablep->isVisible();
+
+ if ((mSimulateRes == 0) && visible)
+ {
+ updateRenderRes();
+ gPipeline.markRebuild(drawablep, LLDrawable::REBUILD_POSITION, FALSE);
+ }
+ else
+ {
+ F32 pixel_area = mVO->getPixelArea();
- U32 update_period = (U32) (LLViewerCamera::getInstance()->getScreenPixelArea()*0.01f/(pixel_area*(sUpdateFactor+1.f)))+1;
+ U32 update_period = (U32) (LLViewerCamera::getInstance()->getScreenPixelArea()*0.01f/(pixel_area*(sUpdateFactor+1.f)))+1;
+
+ if (visible)
+ {
+ if (!drawablep->isState(LLDrawable::IN_REBUILD_Q1) &&
+ mVO->getPixelArea() > 256.f)
+ {
+ U32 id;
+
+ if (mVO->isRootEdit())
+ {
+ id = mID;
+ }
+ else
+ {
+ LLVOVolume* parent = (LLVOVolume*) mVO->getParent();
+ id = parent->getVolumeInterfaceID();
+ }
+
+ if ((LLDrawable::getCurrentFrame()+id)%update_period == 0)
+ {
+ sUpdateDelay[mInstanceIndex] = (S32) update_period-1;
+
+ updateRenderRes();
+
+ gPipeline.markRebuild(drawablep, LLDrawable::REBUILD_POSITION, FALSE);
+ }
+ }
+ }
+ else
+ {
+ sUpdateDelay[mInstanceIndex] = (S32) update_period;
+ }
+ }
- if ((LLDrawable::getCurrentFrame()+id)%update_period == 0)
- {
- gPipeline.markRebuild(mVO->mDrawable, LLDrawable::REBUILD_POSITION, FALSE);
}
}
-
- return force_update;
}
inline S32 log2(S32 x)
@@ -368,8 +416,11 @@ void LLVolumeImplFlexible::doFlexibleUpdate()
LLPath *path = &volume->getPath();
if ((mSimulateRes == 0 || !mInitialized) && mVO->mDrawable->isVisible())
{
- mVO->markForUpdate(TRUE);
- if (!doIdleUpdate(gAgent, *LLWorld::getInstance(), 0.0))
+ BOOL force_update = mSimulateRes == 0 ? TRUE : FALSE;
+
+ doIdleUpdate();
+
+ if (!force_update || !gPipeline.hasRenderDebugFeatureMask(LLPipeline::RENDER_DEBUG_FEATURE_FLEXIBLE))
{
return; // we did not get updated or initialized, proceeding without can be dangerous
}
@@ -729,7 +780,11 @@ BOOL LLVolumeImplFlexible::doUpdateGeometry(LLDrawable *drawable)
else if (!mUpdated || rotated)
{
volume->mDrawable->setState(LLDrawable::REBUILD_POSITION);
- volume->dirtyMesh();
+ LLSpatialGroup* group = volume->mDrawable->getSpatialGroup();
+ if (group)
+ {
+ group->dirtyMesh();
+ }
volume->genBBoxes(isVolumeGlobal());
}
@@ -814,15 +869,17 @@ LLQuaternion LLVolumeImplFlexible::getEndRotation()
}//------------------------------------------------------------------
-void LLVolumeImplFlexible::updateRelativeXform()
+void LLVolumeImplFlexible::updateRelativeXform(bool force_identity)
{
LLQuaternion delta_rot;
LLVector3 delta_pos, delta_scale;
LLVOVolume* vo = (LLVOVolume*) mVO;
+ bool use_identity = vo->mDrawable->isSpatialRoot() || force_identity;
+
//matrix from local space to parent relative/global space
- delta_rot = vo->mDrawable->isSpatialRoot() ? LLQuaternion() : vo->mDrawable->getRotation();
- delta_pos = vo->mDrawable->isSpatialRoot() ? LLVector3(0,0,0) : vo->mDrawable->getPosition();
+ delta_rot = use_identity ? LLQuaternion() : vo->mDrawable->getRotation();
+ delta_pos = use_identity ? LLVector3(0,0,0) : vo->mDrawable->getPosition();
delta_scale = LLVector3(1,1,1);
// Vertex transform (4x4)
diff --git a/indra/newview/llflexibleobject.h b/indra/newview/llflexibleobject.h
index fef43d464d..beb281a906 100644
--- a/indra/newview/llflexibleobject.h
+++ b/indra/newview/llflexibleobject.h
@@ -70,15 +70,24 @@ struct LLFlexibleObjectSection
//---------------------------------------------------------
class LLVolumeImplFlexible : public LLVolumeInterface
{
+private:
+ static std::vector<LLVolumeImplFlexible*> sInstanceList;
+ static std::vector<S32> sUpdateDelay;
+ S32 mInstanceIndex;
+
public:
+ static void updateClass();
+
LLVolumeImplFlexible(LLViewerObject* volume, LLFlexibleObjectData* attributes);
+ ~LLVolumeImplFlexible();
// Implements LLVolumeInterface
U32 getID() const { return mID; }
LLVector3 getFramePosition() const;
LLQuaternion getFrameRotation() const;
LLVolumeInterfaceType getInterfaceType() const { return INTERFACE_FLEXIBLE; }
- BOOL doIdleUpdate(LLAgent &agent, LLWorld &world, const F64 &time);
+ void updateRenderRes();
+ void doIdleUpdate();
BOOL doUpdateGeometry(LLDrawable *drawable);
LLVector3 getPivotPosition() const;
void onSetVolume(const LLVolumeParams &volume_params, const S32 detail);
@@ -89,7 +98,7 @@ class LLVolumeImplFlexible : public LLVolumeInterface
bool isVolumeGlobal() const { return true; }
bool isActive() const { return true; }
const LLMatrix4& getWorldMatrix(LLXformMatrix* xform) const;
- void updateRelativeXform();
+ void updateRelativeXform(bool force_identity);
void doFlexibleUpdate(); // Called to update the simulation
void doFlexibleRebuild(); // Called to rebuild the geometry
void preRebuild();
@@ -128,7 +137,7 @@ class LLVolumeImplFlexible : public LLVolumeInterface
LLVector3 mCollisionSpherePosition;
F32 mCollisionSphereRadius;
U32 mID;
-
+
//--------------------------------------
// private methods
//--------------------------------------
diff --git a/indra/newview/llfloaterautoreplacesettings.cpp b/indra/newview/llfloaterautoreplacesettings.cpp
new file mode 100644
index 0000000000..7d1bcba978
--- /dev/null
+++ b/indra/newview/llfloaterautoreplacesettings.cpp
@@ -0,0 +1,641 @@
+/**
+ * @file llfloaterautoreplacesettings.cpp
+ * @brief Auto Replace List floater
+ *
+ * $LicenseInfo:firstyear=2012&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2012, Linden Research, Inc.
+ *
+ * This library is free software; you 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.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llfloaterautoreplacesettings.h"
+
+#include "llagentdata.h"
+#include "llcommandhandler.h"
+#include "llfloater.h"
+#include "lluictrlfactory.h"
+#include "llagent.h"
+#include "llpanel.h"
+#include "llbutton.h"
+#include "llcolorswatch.h"
+#include "llcombobox.h"
+#include "llview.h"
+#include "llhttpclient.h"
+#include "llbufferstream.h"
+#include "llcheckboxctrl.h"
+#include "llviewercontrol.h"
+
+#include "llui.h"
+#include "llcontrol.h"
+#include "llscrollingpanellist.h"
+#include "llautoreplace.h"
+#include "llfilepicker.h"
+#include "llfile.h"
+#include "llsdserialize.h"
+#include "llsdutil.h"
+
+#include "llchat.h"
+#include "llinventorymodel.h"
+#include "llhost.h"
+#include "llassetstorage.h"
+#include "roles_constants.h"
+#include "llviewertexteditor.h"
+#include <boost/tokenizer.hpp>
+
+#include <iosfwd>
+#include "llfloaterreg.h"
+#include "llinspecttoast.h"
+#include "llnotificationhandler.h"
+#include "llnotificationmanager.h"
+#include "llnotificationsutil.h"
+
+
+LLFloaterAutoReplaceSettings::LLFloaterAutoReplaceSettings(const LLSD& key)
+ : LLFloater(key)
+ , mSelectedListName("")
+ , mListNames(NULL)
+ , mReplacementsList(NULL)
+ , mKeyword(NULL)
+ , mPreviousKeyword("")
+ , mReplacement(NULL)
+{
+}
+
+void LLFloaterAutoReplaceSettings::onClose(bool app_quitting)
+{
+ cleanUp();
+}
+
+BOOL LLFloaterAutoReplaceSettings::postBuild(void)
+{
+ // get copies of the current settings that we will operate on
+ mEnabled = gSavedSettings.getBOOL("AutoReplace");
+ LL_DEBUGS("AutoReplace") << ( mEnabled ? "enabled" : "disabled") << LL_ENDL;
+
+ mSettings = LLAutoReplace::getInstance()->getSettings();
+
+ // global checkbox for whether or not autoreplace is active
+ LLUICtrl* enabledCheckbox = getChild<LLUICtrl>("autoreplace_enable");
+ enabledCheckbox->setCommitCallback(boost::bind(&LLFloaterAutoReplaceSettings::onAutoReplaceToggled, this));
+ enabledCheckbox->setValue(LLSD(mEnabled));
+
+ // top row list creation and deletion
+ getChild<LLUICtrl>("autoreplace_import_list")->setCommitCallback(boost::bind(&LLFloaterAutoReplaceSettings::onImportList,this));
+ getChild<LLUICtrl>("autoreplace_export_list")->setCommitCallback(boost::bind(&LLFloaterAutoReplaceSettings::onExportList,this));
+ getChild<LLUICtrl>("autoreplace_new_list")->setCommitCallback( boost::bind(&LLFloaterAutoReplaceSettings::onNewList,this));
+ getChild<LLUICtrl>("autoreplace_delete_list")->setCommitCallback(boost::bind(&LLFloaterAutoReplaceSettings::onDeleteList,this));
+
+ // the list of keyword->replacement lists
+ mListNames = getChild<LLScrollListCtrl>("autoreplace_list_name");
+ mListNames->setCommitCallback(boost::bind(&LLFloaterAutoReplaceSettings::onSelectList, this));
+ mListNames->setCommitOnSelectionChange(true);
+
+ // list ordering
+ getChild<LLUICtrl>("autoreplace_list_up")->setCommitCallback( boost::bind(&LLFloaterAutoReplaceSettings::onListUp,this));
+ getChild<LLUICtrl>("autoreplace_list_down")->setCommitCallback(boost::bind(&LLFloaterAutoReplaceSettings::onListDown,this));
+
+ // keyword->replacement entry add / delete
+ getChild<LLUICtrl>("autoreplace_add_entry")->setCommitCallback( boost::bind(&LLFloaterAutoReplaceSettings::onAddEntry,this));
+ getChild<LLUICtrl>("autoreplace_delete_entry")->setCommitCallback(boost::bind(&LLFloaterAutoReplaceSettings::onDeleteEntry,this));
+
+ // entry edits
+ mKeyword = getChild<LLLineEditor>("autoreplace_keyword");
+ mReplacement = getChild<LLLineEditor>("autoreplace_replacement");
+ getChild<LLUICtrl>("autoreplace_save_entry")->setCommitCallback(boost::bind(&LLFloaterAutoReplaceSettings::onSaveEntry, this));
+
+ // dialog termination ( Save Changes / Cancel )
+ getChild<LLUICtrl>("autoreplace_save_changes")->setCommitCallback(boost::bind(&LLFloaterAutoReplaceSettings::onSaveChanges, this));
+ getChild<LLUICtrl>("autoreplace_cancel")->setCommitCallback(boost::bind(&LLFloaterAutoReplaceSettings::onCancel, this));
+
+ // the list of keyword->replacement pairs
+ mReplacementsList = getChild<LLScrollListCtrl>("autoreplace_list_replacements");
+ mReplacementsList->setCommitCallback(boost::bind(&LLFloaterAutoReplaceSettings::onSelectEntry, this));
+ mReplacementsList->setCommitOnSelectionChange(true);
+
+ center();
+
+ mSelectedListName.clear();
+ updateListNames();
+ updateListNamesControls();
+ updateReplacementsList();
+
+ return true;
+}
+
+
+void LLFloaterAutoReplaceSettings::updateListNames()
+{
+ mListNames->deleteAllItems(); // start from scratch
+
+ LLSD listNames = mSettings.getListNames(); // Array of Strings
+
+ for ( LLSD::array_const_iterator entry = listNames.beginArray(), end = listNames.endArray();
+ entry != end;
+ ++entry
+ )
+ {
+ const std::string& listName = entry->asString();
+ mListNames->addSimpleElement(listName);
+ }
+
+ if (!mSelectedListName.empty())
+ {
+ mListNames->setSelectedByValue( LLSD(mSelectedListName), true );
+ }
+}
+
+void LLFloaterAutoReplaceSettings::updateListNamesControls()
+{
+ if ( mSelectedListName.empty() )
+ {
+ // There is no selected list
+
+ // Disable all controls that operate on the selected list
+ getChild<LLButton>("autoreplace_export_list")->setEnabled(false);
+ getChild<LLButton>("autoreplace_delete_list")->setEnabled(false);
+ getChild<LLButton>("autoreplace_list_up")->setEnabled(false);
+ getChild<LLButton>("autoreplace_list_down")->setEnabled(false);
+
+ mReplacementsList->deleteAllItems();
+ }
+ else
+ {
+ // Enable the controls that operate on the selected list
+ getChild<LLButton>("autoreplace_export_list")->setEnabled(true);
+ getChild<LLButton>("autoreplace_delete_list")->setEnabled(true);
+ getChild<LLButton>("autoreplace_list_up")->setEnabled(!selectedListIsFirst());
+ getChild<LLButton>("autoreplace_list_down")->setEnabled(!selectedListIsLast());
+ }
+}
+
+void LLFloaterAutoReplaceSettings::onSelectList()
+{
+ std::string previousSelectedListName = mSelectedListName;
+ // only one selection allowed
+ LLSD selected = mListNames->getSelectedValue();
+ if (selected.isDefined())
+ {
+ mSelectedListName = selected.asString();
+ LL_DEBUGS("AutoReplace")<<"selected list '"<<mSelectedListName<<"'"<<LL_ENDL;
+ }
+ else
+ {
+ mSelectedListName.clear();
+ LL_DEBUGS("AutoReplace")<<"unselected"<<LL_ENDL;
+ }
+
+ updateListNamesControls();
+
+ if ( previousSelectedListName != mSelectedListName )
+ {
+ updateReplacementsList();
+ }
+}
+
+void LLFloaterAutoReplaceSettings::onSelectEntry()
+{
+ LLSD selectedRow = mReplacementsList->getSelectedValue();
+ if (selectedRow.isDefined())
+ {
+ mPreviousKeyword = selectedRow.asString();
+ LL_DEBUGS("AutoReplace")<<"selected entry '"<<mPreviousKeyword<<"'"<<LL_ENDL;
+ mKeyword->setValue(selectedRow);
+ std::string replacement = mSettings.replacementFor(mPreviousKeyword, mSelectedListName );
+ mReplacement->setValue(replacement);
+ enableReplacementEntry();
+ mReplacement->setFocus(true);
+ }
+ else
+ {
+ // no entry selection, so the entry panel should be off
+ disableReplacementEntry();
+ LL_DEBUGS("AutoReplace")<<"no row selected"<<LL_ENDL;
+ }
+}
+
+void LLFloaterAutoReplaceSettings::updateReplacementsList()
+{
+ // start from scratch, since this should only be called when the list changes
+ mReplacementsList->deleteAllItems();
+
+ if ( mSelectedListName.empty() )
+ {
+ mReplacementsList->setEnabled(false);
+ getChild<LLButton>("autoreplace_add_entry")->setEnabled(false);
+ disableReplacementEntry();
+ }
+ else
+ {
+ // Populate the keyword->replacement list from the selected list
+ const LLSD* mappings = mSettings.getListEntries(mSelectedListName);
+ for ( LLSD::map_const_iterator entry = mappings->beginMap(), end = mappings->endMap();
+ entry != end;
+ entry++
+ )
+ {
+ LLSD row;
+ row["id"] = entry->first;
+ row["columns"][0]["column"] = "keyword";
+ row["columns"][0]["value"] = entry->first;
+ row["columns"][1]["column"] = "replacement";
+ row["columns"][1]["value"] = entry->second;
+
+ mReplacementsList->addElement(row, ADD_BOTTOM);
+ }
+
+ mReplacementsList->deselectAllItems(false /* don't call commit */);
+ mReplacementsList->setEnabled(true);
+
+ getChild<LLButton>("autoreplace_add_entry")->setEnabled(true);
+ disableReplacementEntry();
+ }
+}
+
+void LLFloaterAutoReplaceSettings::enableReplacementEntry()
+{
+ LL_DEBUGS("AutoReplace")<<LL_ENDL;
+ mKeyword->setEnabled(true);
+ mReplacement->setEnabled(true);
+ getChild<LLButton>("autoreplace_save_entry")->setEnabled(true);
+ getChild<LLButton>("autoreplace_delete_entry")->setEnabled(true);
+}
+
+void LLFloaterAutoReplaceSettings::disableReplacementEntry()
+{
+ LL_DEBUGS("AutoReplace")<<LL_ENDL;
+ mPreviousKeyword.clear();
+ mKeyword->clear();
+ mKeyword->setEnabled(false);
+ mReplacement->clear();
+ mReplacement->setEnabled(false);
+ getChild<LLButton>("autoreplace_save_entry")->setEnabled(false);
+ getChild<LLButton>("autoreplace_delete_entry")->setEnabled(false);
+}
+
+// called when the global settings checkbox is changed
+void LLFloaterAutoReplaceSettings::onAutoReplaceToggled()
+{
+ // set our local copy of the flag, copied to the global preference in onOk
+ mEnabled = childGetValue("autoreplace_enable").asBoolean();
+ LL_DEBUGS("AutoReplace")<< "autoreplace_enable " << ( mEnabled ? "on" : "off" ) << LL_ENDL;
+}
+
+// called when the List Up button is pressed
+void LLFloaterAutoReplaceSettings::onListUp()
+{
+ S32 selectedRow = mListNames->getFirstSelectedIndex();
+ LLSD selectedName = mListNames->getSelectedValue().asString();
+
+ if ( mSettings.increaseListPriority(selectedName) )
+ {
+ updateListNames();
+ updateListNamesControls();
+ }
+ else
+ {
+ LL_WARNS("AutoReplace")
+ << "invalid row ("<<selectedRow<<") selected '"<<selectedName<<"'"
+ <<LL_ENDL;
+ }
+}
+
+// called when the List Down button is pressed
+void LLFloaterAutoReplaceSettings::onListDown()
+{
+ S32 selectedRow = mListNames->getFirstSelectedIndex();
+ std::string selectedName = mListNames->getSelectedValue().asString();
+
+ if ( mSettings.decreaseListPriority(selectedName) )
+ {
+ updateListNames();
+ updateListNamesControls();
+ }
+ else
+ {
+ LL_WARNS("AutoReplace")
+ << "invalid row ("<<selectedRow<<") selected '"<<selectedName<<"'"
+ <<LL_ENDL;
+ }
+}
+
+// called when the Delete Entry button is pressed
+void LLFloaterAutoReplaceSettings::onDeleteEntry()
+{
+ LLSD selectedRow = mReplacementsList->getSelectedValue();
+ if (selectedRow.isDefined())
+ {
+ std::string keyword = selectedRow.asString();
+ mReplacementsList->deleteSelectedItems(); // delete from the control
+ mSettings.removeEntryFromList(keyword, mSelectedListName); // delete from the local settings copy
+ disableReplacementEntry(); // no selection active, so turn off the buttons
+ }
+}
+
+// called when the Import List button is pressed
+void LLFloaterAutoReplaceSettings::onImportList()
+{
+ LLFilePicker& picker = LLFilePicker::instance();
+ if( picker.getOpenFile( LLFilePicker::FFLOAD_XML) )
+ {
+ llifstream file;
+ file.open(picker.getFirstFile().c_str());
+ LLSD newList;
+ if (file.is_open())
+ {
+ LLSDSerialize::fromXMLDocument(newList, file);
+ }
+ file.close();
+
+ switch ( mSettings.addList(newList) )
+ {
+ case LLAutoReplaceSettings::AddListOk:
+ mSelectedListName = LLAutoReplaceSettings::getListName(newList);
+
+ updateListNames();
+ updateListNamesControls();
+ updateReplacementsList();
+ break;
+
+ case LLAutoReplaceSettings::AddListDuplicateName:
+ {
+ std::string newName = LLAutoReplaceSettings::getListName(newList);
+ LL_WARNS("AutoReplace")<<"name '"<<newName<<"' is in use; prompting for new name"<<LL_ENDL;
+ LLSD newPayload;
+ newPayload["list"] = newList;
+ LLSD args;
+ args["DUPNAME"] = newName;
+
+ LLNotificationsUtil::add("RenameAutoReplaceList", args, newPayload,
+ boost::bind(&LLFloaterAutoReplaceSettings::callbackListNameConflict, this, _1, _2));
+ }
+ break;
+
+ case LLAutoReplaceSettings::AddListInvalidList:
+ LLNotificationsUtil::add("InvalidAutoReplaceList");
+ LL_WARNS("AutoReplace") << "imported list was invalid" << LL_ENDL;
+
+ mSelectedListName.clear();
+ updateListNames();
+ updateListNamesControls();
+ updateReplacementsList();
+ break;
+
+ default:
+ LL_ERRS("AutoReplace") << "invalid AddListResult" << LL_ENDL;
+
+ }
+
+ }
+ else
+ {
+ LL_DEBUGS("AutoReplace") << "file selection failed for import list" << LL_ENDL;
+ }
+}
+
+void LLFloaterAutoReplaceSettings::onNewList()
+{
+ LLSD payload;
+ LLSD emptyList;
+ LLAutoReplaceSettings::createEmptyList(emptyList);
+ payload["list"] = emptyList;
+ LLSD args;
+
+ LLNotificationsUtil::add("AddAutoReplaceList", args, payload,
+ boost::bind(&LLFloaterAutoReplaceSettings::callbackNewListName, this, _1, _2));
+}
+
+bool LLFloaterAutoReplaceSettings::callbackNewListName(const LLSD& notification, const LLSD& response)
+{
+ LL_DEBUGS("AutoReplace")<<"called"<<LL_ENDL;
+
+ LLSD newList = notification["payload"]["list"];
+
+ if ( response.has("listname") && response["listname"].isString() )
+ {
+ std::string newName = response["listname"].asString();
+ LLAutoReplaceSettings::setListName(newList, newName);
+
+ switch ( mSettings.addList(newList) )
+ {
+ case LLAutoReplaceSettings::AddListOk:
+ LL_INFOS("AutoReplace") << "added new list '"<<newName<<"'"<<LL_ENDL;
+ mSelectedListName = newName;
+ updateListNames();
+ updateListNamesControls();
+ updateReplacementsList();
+ break;
+
+ case LLAutoReplaceSettings::AddListDuplicateName:
+ {
+ LL_WARNS("AutoReplace")<<"name '"<<newName<<"' is in use; prompting for new name"<<LL_ENDL;
+ LLSD newPayload;
+ newPayload["list"] = notification["payload"]["list"];
+ LLSD args;
+ args["DUPNAME"] = newName;
+
+ LLNotificationsUtil::add("RenameAutoReplaceList", args, newPayload,
+ boost::bind(&LLFloaterAutoReplaceSettings::callbackListNameConflict, this, _1, _2));
+ }
+ break;
+
+ case LLAutoReplaceSettings::AddListInvalidList:
+ LLNotificationsUtil::add("InvalidAutoReplaceList");
+
+ mSelectedListName.clear();
+ updateListNames();
+ updateListNamesControls();
+ updateReplacementsList();
+ break;
+
+ default:
+ LL_ERRS("AutoReplace") << "invalid AddListResult" << LL_ENDL;
+ }
+ }
+ else
+ {
+ LL_ERRS("AutoReplace") << "adding notification response" << LL_ENDL;
+ }
+ return false;
+}
+
+// callback for the RenameAutoReplaceList notification
+bool LLFloaterAutoReplaceSettings::callbackListNameConflict(const LLSD& notification, const LLSD& response)
+{
+ LLSD newList = notification["payload"]["list"];
+
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
+ switch ( option )
+ {
+ case 0:
+ // Replace current list
+ LL_INFOS("AutoReplace")<<"option 'replace current list' selected"<<LL_ENDL;
+
+ break;
+
+ case 1:
+ // Use New Name
+ LL_INFOS("AutoReplace")<<"option 'use new name' selected"<<LL_ENDL;
+ callbackNewListName(notification, response);
+ break;
+
+ default:
+ LL_ERRS("AutoReplace")<<"invalid selected option "<<option<<LL_ENDL;
+ }
+
+ return false;
+}
+
+void LLFloaterAutoReplaceSettings::onDeleteList()
+{
+ std::string listName= mListNames->getFirstSelected()->getColumn(0)->getValue().asString();
+ mSettings.removeReplacementList(listName); // remove from the copy of settings
+ mReplacementsList->deleteSelectedItems(); // remove from the scrolling list
+
+ mSelectedListName.clear();
+ updateListNames();
+ updateListNamesControls();
+ updateReplacementsList();
+}
+
+void LLFloaterAutoReplaceSettings::onExportList()
+{
+ std::string listName=mListNames->getFirstSelected()->getColumn(0)->getValue().asString();
+ const LLSD* list = mSettings.exportList(listName);
+ std::string listFileName = listName + ".xml";
+ LLFilePicker& picker = LLFilePicker::instance();
+ if( picker.getSaveFile( LLFilePicker::FFSAVE_XML, listFileName) )
+ {
+ llofstream file;
+ file.open(picker.getFirstFile().c_str());
+ LLSDSerialize::toPrettyXML(*list, file);
+ file.close();
+ }
+}
+
+void LLFloaterAutoReplaceSettings::onAddEntry()
+{
+ mPreviousKeyword.clear();
+ mReplacementsList->deselectAllItems(false /* don't call commit */);
+ mKeyword->clear();
+ mReplacement->clear();
+ enableReplacementEntry();
+ mKeyword->setFocus(true);
+}
+
+void LLFloaterAutoReplaceSettings::onSaveEntry()
+{
+ LL_DEBUGS("AutoReplace")<<"called"<<LL_ENDL;
+
+ if ( ! mPreviousKeyword.empty() )
+ {
+ // delete any existing value for the key that was editted
+ LL_INFOS("AutoReplace")
+ << "list '" << mSelectedListName << "' "
+ << "removed '" << mPreviousKeyword
+ << "'" << LL_ENDL;
+ mSettings.removeEntryFromList( mPreviousKeyword, mSelectedListName );
+ }
+
+ LLWString keyword = mKeyword->getWText();
+ LLWString replacement = mReplacement->getWText();
+ if ( mSettings.addEntryToList(keyword, replacement, mSelectedListName) )
+ {
+ // insert the new keyword->replacement pair
+ LL_INFOS("AutoReplace")
+ << "list '" << mSelectedListName << "' "
+ << "added '" << wstring_to_utf8str(keyword)
+ << "' -> '" << wstring_to_utf8str(replacement)
+ << "'" << LL_ENDL;
+
+ updateReplacementsList();
+ }
+ else
+ {
+ LLNotificationsUtil::add("InvalidAutoReplaceEntry");
+ LL_WARNS("AutoReplace")<<"invalid entry "
+ << "keyword '" << wstring_to_utf8str(keyword)
+ << "' replacement '" << wstring_to_utf8str(replacement)
+ << "'" << LL_ENDL;
+ }
+}
+
+void LLFloaterAutoReplaceSettings::onCancel()
+{
+ cleanUp();
+ closeFloater(false /* not quitting */);
+}
+
+void LLFloaterAutoReplaceSettings::onSaveChanges()
+{
+ // put our local copy of the settings into the active copy
+ LLAutoReplace::getInstance()->setSettings( mSettings );
+ // save our local copy of the global feature enable/disable value
+ gSavedSettings.setBOOL("AutoReplace", mEnabled);
+ cleanUp();
+ closeFloater(false /* not quitting */);
+}
+
+void LLFloaterAutoReplaceSettings::cleanUp()
+{
+
+}
+
+bool LLFloaterAutoReplaceSettings::selectedListIsFirst()
+{
+ bool isFirst = false;
+
+ if (!mSelectedListName.empty())
+ {
+ LLSD lists = mSettings.getListNames(); // an Array of Strings
+ LLSD first = lists.get(0);
+ if ( first.isString() && first.asString() == mSelectedListName )
+ {
+ isFirst = true;
+ }
+ }
+ return isFirst;
+}
+
+bool LLFloaterAutoReplaceSettings::selectedListIsLast()
+{
+ bool isLast = false;
+
+ if (!mSelectedListName.empty())
+ {
+ LLSD last;
+ LLSD lists = mSettings.getListNames(); // an Array of Strings
+ for ( LLSD::array_const_iterator list = lists.beginArray(), listEnd = lists.endArray();
+ list != listEnd;
+ list++
+ )
+ {
+ last = *list;
+ }
+ if ( last.isString() && last.asString() == mSelectedListName )
+ {
+ isLast = true;
+ }
+ }
+ return isLast;
+}
+
+/* TBD
+mOldText = getChild<LLLineEditor>("autoreplace_old_text");
+mNewText = getChild<LLLineEditor>("autoreplace_new_text");
+*/
diff --git a/indra/newview/llfloaterautoreplacesettings.h b/indra/newview/llfloaterautoreplacesettings.h
new file mode 100644
index 0000000000..629aea3e3c
--- /dev/null
+++ b/indra/newview/llfloaterautoreplacesettings.h
@@ -0,0 +1,117 @@
+/**
+ * @file llfloaterautoreplacesettings.h
+ * @brief Auto Replace List floater
+ * @copyright Copyright (c) 2011 LordGregGreg Back
+ *
+ * $LicenseInfo:firstyear=2012&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2012, Linden Research, Inc.
+ *
+ * This library is free software; you 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.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * $/LicenseInfo$
+ */
+
+#ifndef LLFLOATERAUTOREPLACESETTINGS_H
+#define LLFLOATERAUTOREPLACESETTINGS_H
+
+#include "llfloater.h"
+#include "llmediactrl.h"
+#include "llscrolllistctrl.h"
+#include "lllineeditor.h"
+
+#include "llviewerinventory.h"
+#include <boost/bind.hpp>
+#include "llautoreplace.h"
+
+class LLFloaterAutoReplaceSettings : public LLFloater
+{
+public:
+ LLFloaterAutoReplaceSettings(const LLSD& key);
+
+ /*virtual*/ BOOL postBuild();
+ /*virtual*/ void onClose(bool app_quitting);
+
+ void setData(void * data);
+
+private:
+
+ /** @{ @name Local Copies of Settings
+ * These are populated in the postBuild method with the values
+ * current when the floater is instantiated, and then either
+ * discarded when Cancel is pressed, or copied back to the active
+ * settings if Ok is pressed.
+ */
+ bool mEnabled; ///< the global preference for AutoReplace
+ LLAutoReplaceSettings mSettings; ///< settings being modified
+ /** @} */
+
+ /// convenience variable - the name of the currently selected list (if any)
+ std::string mSelectedListName;
+ /// the scrolling list of list names (one column, no headings, order manually controlled)
+ LLScrollListCtrl* mListNames;
+ /// the scroling list of keyword->replacement pairs
+ LLScrollListCtrl* mReplacementsList;
+
+ /// the keyword for the entry editing pane
+ LLLineEditor* mKeyword;
+ /// saved keyword value
+ std::string mPreviousKeyword;
+ /// the replacement for the entry editing pane
+ LLLineEditor* mReplacement;
+
+ /// callback for when the feature enable/disable checkbox changes
+ void onAutoReplaceToggled();
+ /// callback for when an entry in the list of list names is selected
+ void onSelectList();
+
+ void onImportList();
+ void onExportList();
+ void onNewList();
+ void onDeleteList();
+
+ void onListUp();
+ void onListDown();
+
+ void onSelectEntry();
+ void onAddEntry();
+ void onDeleteEntry();
+ void onSaveEntry();
+
+ void onSaveChanges();
+ void onCancel();
+
+ /// updates the contents of the mListNames
+ void updateListNames();
+ /// updates the controls associated with mListNames (depends on whether a name is selected or not)
+ void updateListNamesControls();
+ /// updates the contents of the mReplacementsList
+ void updateReplacementsList();
+ /// enables the components that should only be active when a keyword is selected
+ void enableReplacementEntry();
+ /// disables the components that should only be active when a keyword is selected
+ void disableReplacementEntry();
+
+ /// called from the AddAutoReplaceList notification dialog
+ bool callbackNewListName(const LLSD& notification, const LLSD& response);
+ /// called from the RenameAutoReplaceList notification dialog
+ bool callbackListNameConflict(const LLSD& notification, const LLSD& response);
+
+ bool selectedListIsFirst();
+ bool selectedListIsLast();
+
+ void cleanUp();
+};
+
+#endif // LLFLOATERAUTOREPLACESETTINGS_H
diff --git a/indra/newview/llfloaterbuycontents.cpp b/indra/newview/llfloaterbuycontents.cpp
index bca4b5e447..809d344d01 100644
--- a/indra/newview/llfloaterbuycontents.cpp
+++ b/indra/newview/llfloaterbuycontents.cpp
@@ -211,8 +211,8 @@ void LLFloaterBuyContents::inventoryChanged(LLViewerObject* obj,
BOOL item_is_multi = FALSE;
if ((inv_item->getFlags() & LLInventoryItemFlags::II_FLAGS_LANDMARK_VISITED
- || inv_item->getFlags() & LLInventoryItemFlags::II_FLAGS_OBJECT_HAS_MULTIPLE_ITEMS)
- && !(inv_item->getFlags() & LLInventoryItemFlags::II_FLAGS_WEARABLES_MASK))
+ || inv_item->getFlags() & LLInventoryItemFlags::II_FLAGS_OBJECT_HAS_MULTIPLE_ITEMS)
+ && !(inv_item->getFlags() & LLInventoryItemFlags::II_FLAGS_WEARABLES_MASK))
{
item_is_multi = TRUE;
}
diff --git a/indra/newview/llfloaterbvhpreview.cpp b/indra/newview/llfloaterbvhpreview.cpp
index ac33a05f42..fa0ad20fdb 100644
--- a/indra/newview/llfloaterbvhpreview.cpp
+++ b/indra/newview/llfloaterbvhpreview.cpp
@@ -1124,9 +1124,13 @@ BOOL LLPreviewAnimation::render()
LLVertexBuffer::unbind();
LLGLDepthTest gls_depth(GL_TRUE);
- LLDrawPoolAvatar *avatarPoolp = (LLDrawPoolAvatar *)avatarp->mDrawable->getFace(0)->getPool();
- avatarp->dirtyMesh();
- avatarPoolp->renderAvatars(avatarp); // renders only one avatar
+ LLFace* face = avatarp->mDrawable->getFace(0);
+ if (face)
+ {
+ LLDrawPoolAvatar *avatarPoolp = (LLDrawPoolAvatar *)face->getPool();
+ avatarp->dirtyMesh();
+ avatarPoolp->renderAvatars(avatarp); // renders only one avatar
+ }
}
gGL.color4f(1,1,1,1);
diff --git a/indra/newview/llfloaterimagepreview.cpp b/indra/newview/llfloaterimagepreview.cpp
index 92ee8ddac6..6b2492d927 100644
--- a/indra/newview/llfloaterimagepreview.cpp
+++ b/indra/newview/llfloaterimagepreview.cpp
@@ -704,9 +704,13 @@ BOOL LLImagePreviewAvatar::render()
// make sure alpha=0 shows avatar material color
LLGLDisable no_blend(GL_BLEND);
- LLDrawPoolAvatar *avatarPoolp = (LLDrawPoolAvatar *)avatarp->mDrawable->getFace(0)->getPool();
- gPipeline.enableLightsPreview();
- avatarPoolp->renderAvatars(avatarp); // renders only one avatar
+ LLFace* face = avatarp->mDrawable->getFace(0);
+ if (face)
+ {
+ LLDrawPoolAvatar *avatarPoolp = (LLDrawPoolAvatar *)face->getPool();
+ gPipeline.enableLightsPreview();
+ avatarPoolp->renderAvatars(avatarp); // renders only one avatar
+ }
}
gGL.popUIMatrix();
diff --git a/indra/newview/llfloaterland.cpp b/indra/newview/llfloaterland.cpp
index ee18c95b34..55f3d548ec 100644
--- a/indra/newview/llfloaterland.cpp
+++ b/indra/newview/llfloaterland.cpp
@@ -1865,23 +1865,8 @@ BOOL LLPanelLandOptions::postBuild()
childSetCommitCallback("ShowDirectoryCheck", onCommitAny, this);
- if (gAgent.getAgentAccess().isInTransition())
- {
- // during the AO transition, this combo has an Adult item.
- // Post-transition, it goes away. We can remove this conditional
- // after the transition and just use the "else" clause.
- mCategoryCombo = getChild<LLComboBox>( "land category with adult");
- childSetCommitCallback("land category with adult", onCommitAny, this);
- }
- else
- {
- // this is the code that should be preserved post-transition
- // you could also change the XML to set visibility and enabled true.
- mCategoryCombo = getChild<LLComboBox>( "land category");
- childSetCommitCallback("land category", onCommitAny, this);
- }
- mCategoryCombo->setVisible(true);
- mCategoryCombo->setEnabled(true);
+ mCategoryCombo = getChild<LLComboBox>( "land category");
+ childSetCommitCallback("land category", onCommitAny, this);
mMatureCtrl = getChild<LLCheckBoxCtrl>( "MatureCheck");
@@ -1901,6 +1886,7 @@ BOOL LLPanelLandOptions::postBuild()
mSnapshotCtrl->setCommitCallback( onCommitAny, this );
mSnapshotCtrl->setAllowNoTexture ( TRUE );
mSnapshotCtrl->setImmediateFilterPermMask(PERM_COPY | PERM_TRANSFER);
+ mSnapshotCtrl->setDnDFilterPermMask(PERM_COPY | PERM_TRANSFER);
mSnapshotCtrl->setNonImmediateFilterPermMask(PERM_COPY | PERM_TRANSFER);
}
else
@@ -2226,8 +2212,8 @@ void LLPanelLandOptions::onCommitAny(LLUICtrl *ctrl, void *userdata)
BOOL allow_damage = !self->mCheckSafe->get();
BOOL allow_fly = self->mCheckFly->get();
BOOL allow_landmark = TRUE; // cannot restrict landmark creation
- BOOL allow_group_scripts = self->mCheckGroupScripts->get() || self->mCheckOtherScripts->get();
BOOL allow_other_scripts = self->mCheckOtherScripts->get();
+ BOOL allow_group_scripts = self->mCheckGroupScripts->get() || allow_other_scripts;
BOOL allow_publish = FALSE;
BOOL mature_publish = self->mMatureCtrl->get();
BOOL push_restriction = self->mPushRestrictionCtrl->get();
@@ -2240,11 +2226,16 @@ void LLPanelLandOptions::onCommitAny(LLUICtrl *ctrl, void *userdata)
LLViewerRegion* region;
region = LLViewerParcelMgr::getInstance()->getSelectionRegion();
- if (!allow_other_scripts && region && region->getAllowDamage())
- {
-
- LLNotificationsUtil::add("UnableToDisableOutsideScripts");
- return;
+ if (region && region->getAllowDamage())
+ { // Damage is allowed on the region - server will always allow scripts
+ if ( (!allow_other_scripts && parcel->getParcelFlag(PF_ALLOW_OTHER_SCRIPTS)) ||
+ (!allow_group_scripts && parcel->getParcelFlag(PF_ALLOW_GROUP_SCRIPTS)) )
+ { // Don't allow turning off "Run Scripts" if damage is allowed in the region
+ self->mCheckOtherScripts->set(parcel->getParcelFlag(PF_ALLOW_OTHER_SCRIPTS)); // Restore UI to actual settings
+ self->mCheckGroupScripts->set(parcel->getParcelFlag(PF_ALLOW_GROUP_SCRIPTS));
+ LLNotificationsUtil::add("UnableToDisableOutsideScripts");
+ return;
+ }
}
// Push data into current parcel
@@ -2371,12 +2362,6 @@ LLPanelLandAccess::~LLPanelLandAccess()
void LLPanelLandAccess::refresh()
{
LLFloater* parent_floater = gFloaterView->getParentFloater(this);
-
- if (mListAccess)
- mListAccess->deleteAllItems();
- if (mListBanned)
- mListBanned->deleteAllItems();
-
LLParcel *parcel = mParcel->getParcel();
// Display options
@@ -2394,7 +2379,11 @@ void LLPanelLandAccess::refresh()
getChild<LLUICtrl>("GroupCheck")->setLabelArg("[GROUP]", group_name );
// Allow list
+ if (mListAccess)
{
+ // Clear the sort order so we don't re-sort on every add.
+ mListAccess->clearSortOrder();
+ mListAccess->deleteAllItems();
S32 count = parcel->mAccessList.size();
getChild<LLUICtrl>("AccessList")->setToolTipArg(LLStringExplicit("[LISTED]"), llformat("%d",count));
getChild<LLUICtrl>("AccessList")->setToolTipArg(LLStringExplicit("[MAX]"), llformat("%d",PARCEL_MAX_ACCESS_LIST));
@@ -2429,13 +2418,17 @@ void LLPanelLandAccess::refresh()
}
suffix.append(" " + parent_floater->getString("Remaining") + ")");
}
- if (mListAccess)
- mListAccess->addNameItem(entry.mID, ADD_DEFAULT, TRUE, suffix);
+ mListAccess->addNameItem(entry.mID, ADD_DEFAULT, TRUE, suffix);
}
+ mListAccess->sortByName(TRUE);
}
// Ban List
+ if(mListBanned)
{
+ // Clear the sort order so we don't re-sort on every add.
+ mListBanned->clearSortOrder();
+ mListBanned->deleteAllItems();
S32 count = parcel->mBanList.size();
getChild<LLUICtrl>("BannedList")->setToolTipArg(LLStringExplicit("[LISTED]"), llformat("%d",count));
@@ -2473,6 +2466,7 @@ void LLPanelLandAccess::refresh()
}
mListBanned->addNameItem(entry.mID, ADD_DEFAULT, TRUE, suffix);
}
+ mListBanned->sortByName(TRUE);
}
if(parcel->getRegionDenyAnonymousOverride())
@@ -2608,13 +2602,13 @@ void LLPanelLandAccess::refresh_ui()
getChildView("AccessList")->setEnabled(can_manage_allowed);
S32 allowed_list_count = parcel->mAccessList.size();
getChildView("add_allowed")->setEnabled(can_manage_allowed && allowed_list_count < PARCEL_MAX_ACCESS_LIST);
- BOOL has_selected = mListAccess->getSelectionInterface()->getFirstSelectedIndex() >= 0;
+ BOOL has_selected = (mListAccess && mListAccess->getSelectionInterface()->getFirstSelectedIndex() >= 0);
getChildView("remove_allowed")->setEnabled(can_manage_allowed && has_selected);
getChildView("BannedList")->setEnabled(can_manage_banned);
S32 banned_list_count = parcel->mBanList.size();
getChildView("add_banned")->setEnabled(can_manage_banned && banned_list_count < PARCEL_MAX_ACCESS_LIST);
- has_selected = mListBanned->getSelectionInterface()->getFirstSelectedIndex() >= 0;
+ has_selected = (mListBanned && mListBanned->getSelectionInterface()->getFirstSelectedIndex() >= 0);
getChildView("remove_banned")->setEnabled(can_manage_banned && has_selected);
}
}
diff --git a/indra/newview/llfloatermodelpreview.cpp b/indra/newview/llfloatermodelpreview.cpp
index 7448f2bb2a..a071f338ba 100755
--- a/indra/newview/llfloatermodelpreview.cpp
+++ b/indra/newview/llfloatermodelpreview.cpp
@@ -396,7 +396,6 @@ mCalculateBtn(NULL)
sInstance = this;
mLastMouseX = 0;
mLastMouseY = 0;
- mGLName = 0;
mStatusLock = new LLMutex(NULL);
mModelPreview = NULL;
@@ -498,7 +497,7 @@ BOOL LLFloaterModelPreview::postBuild()
text->setMouseDownCallback(boost::bind(&LLModelPreview::setPreviewLOD, mModelPreview, i));
}
}
- std::string current_grid = LLGridManager::getInstance()->getGridLabel();
+ std::string current_grid = LLGridManager::getInstance()->getGridId();
std::transform(current_grid.begin(),current_grid.end(),current_grid.begin(),::tolower);
std::string validate_url;
if (current_grid == "agni")
@@ -538,11 +537,6 @@ LLFloaterModelPreview::~LLFloaterModelPreview()
delete mModelPreview;
}
- if (mGLName)
- {
- LLImageGL::deleteTextures(1, &mGLName );
- }
-
delete mStatusLock;
mStatusLock = NULL;
}
@@ -4780,7 +4774,8 @@ void LLModelPreview::genBuffers(S32 lod, bool include_skin_weights)
if (vf.mTexCoords)
{
vb->getTexCoord0Strider(tc_strider);
- LLVector4a::memcpyNonAliased16((F32*) tc_strider.get(), (F32*) vf.mTexCoords, num_vertices*2*sizeof(F32));
+ S32 tex_size = (num_vertices*2*sizeof(F32)+0xF) & ~0xF;
+ LLVector4a::memcpyNonAliased16((F32*) tc_strider.get(), (F32*) vf.mTexCoords, tex_size);
}
if (vf.mNormals)
@@ -5053,15 +5048,7 @@ BOOL LLModelPreview::render()
LLRect preview_rect;
- LLFloaterModelWizard* floater_wizard = dynamic_cast<LLFloaterModelWizard*>(mFMP);
- if (floater_wizard)
- {
- preview_rect = floater_wizard->getPreviewRect();
- }
- else
- {
- preview_rect = mFMP->getChildView("preview_panel")->getRect();
- }
+ preview_rect = mFMP->getChildView("preview_panel")->getRect();
F32 aspect = (F32) preview_rect.getWidth()/preview_rect.getHeight();
@@ -5531,6 +5518,15 @@ BOOL LLModelPreview::render()
buffer->setBuffer(type_mask & buffer->getTypeMask());
gGL.diffuseColor4fv(material.mDiffuseColor.mV);
gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
+ if (material.mDiffuseMap.notNull())
+ {
+ if (material.mDiffuseMap->getDiscardLevel() > -1)
+ {
+ gGL.getTexUnit(0)->bind(material.mDiffuseMap, true);
+ mTextureSet.insert(material.mDiffuseMap.get());
+ }
+ }
+
buffer->draw(LLRender::TRIANGLES, buffer->getNumIndices(), 0);
gGL.diffuseColor3f(0.4f, 0.4f, 0.4f);
@@ -5605,7 +5601,6 @@ void LLModelPreview::setPreviewLOD(S32 lod)
combo_box->setCurrentByIndex((NUM_LOD-1)-mPreviewLOD); // combo box list of lods is in reverse order
mFMP->childSetText("lod_file_" + lod_name[mPreviewLOD], 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
diff --git a/indra/newview/llfloatermodelpreview.h b/indra/newview/llfloatermodelpreview.h
index 64324854a5..ab319c30d5 100644
--- a/indra/newview/llfloatermodelpreview.h
+++ b/indra/newview/llfloatermodelpreview.h
@@ -30,12 +30,12 @@
#include "llfloaternamedesc.h"
#include "lldynamictexture.h"
-#include "llfloatermodelwizard.h"
#include "llquaternion.h"
#include "llmeshrepository.h"
#include "llmodel.h"
#include "llthread.h"
#include "llviewermenufile.h"
+#include "llfloatermodeluploadbase.h"
class LLComboBox;
class LLJoint;
@@ -256,7 +256,6 @@ protected:
S32 mLastMouseX;
S32 mLastMouseY;
LLRect mPreviewRect;
- U32 mGLName;
static S32 sUploadAmount;
std::set<LLPointer<DecompRequest> > mCurRequest;
@@ -390,9 +389,7 @@ private:
protected:
friend class LLModelLoader;
friend class LLFloaterModelPreview;
- friend class LLFloaterModelWizard;
friend class LLFloaterModelPreview::DecompRequest;
- friend class LLFloaterModelWizard::DecompRequest;
friend class LLPhysicsDecomp;
LLFloater* mFMP;
diff --git a/indra/newview/llfloatermodelwizard.cpp b/indra/newview/llfloatermodelwizard.cpp
deleted file mode 100644
index b517b78e5a..0000000000
--- a/indra/newview/llfloatermodelwizard.cpp
+++ /dev/null
@@ -1,795 +0,0 @@
-/**
- * @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",
- "review",
- "upload"};
-
-static void swap_controls(LLUICtrl* first_ctrl, LLUICtrl* second_ctrl, bool first_ctr_visible);
-
-LLFloaterModelWizard::LLFloaterModelWizard(const LLSD& key)
- : LLFloaterModelUploadBase(key)
- ,mRecalculateGeometryBtn(NULL)
- ,mRecalculatePhysicsBtn(NULL)
- ,mRecalculatingPhysicsBtn(NULL)
- ,mCalculateWeightsBtn(NULL)
- ,mCalculatingWeightsBtn(NULL)
- ,mChooseFilePreviewPanel(NULL)
- ,mOptimizePreviewPanel(NULL)
- ,mPhysicsPreviewPanel(NULL)
-{
- 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.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);
- }
- }
-
- LLView* current_preview_panel = NULL;
-
- if (state == CHOOSE_FILE)
- {
- mModelPreview->mViewOption["show_physics"] = false;
-
- current_preview_panel = mChooseFilePreviewPanel;
-
- getChildView("close")->setVisible(false);
- getChildView("back")->setVisible(true);
- getChildView("back")->setEnabled(false);
- getChildView("next")->setVisible(true);
- getChildView("upload")->setVisible(false);
- getChildView("cancel")->setVisible(true);
- mCalculateWeightsBtn->setVisible(false);
- mCalculatingWeightsBtn->setVisible(false);
- }
-
- if (state == OPTIMIZE)
- {
- if (mLastEnabledState < state)
- {
- mModelPreview->genLODs(-1);
- }
-
- mModelPreview->mViewOption["show_physics"] = false;
-
- current_preview_panel = mOptimizePreviewPanel;
-
- getChildView("back")->setVisible(true);
- getChildView("back")->setEnabled(true);
- getChildView("close")->setVisible(false);
- getChildView("next")->setVisible(true);
- getChildView("upload")->setVisible(false);
- getChildView("cancel")->setVisible(true);
- mCalculateWeightsBtn->setVisible(false);
- mCalculatingWeightsBtn->setVisible(false);
- }
-
- if (state == PHYSICS)
- {
- if (mLastEnabledState < state)
- {
- mModelPreview->setPhysicsFromLOD(1);
-
- // Trigger the recalculate physics when first entering
- // the Physics step.
- onClickRecalculatePhysics();
- }
-
- mModelPreview->mViewOption["show_physics"] = true;
-
- current_preview_panel = mPhysicsPreviewPanel;
-
- getChildView("next")->setVisible(false);
- getChildView("upload")->setVisible(false);
- getChildView("close")->setVisible(false);
- getChildView("back")->setVisible(true);
- getChildView("back")->setEnabled(true);
- getChildView("cancel")->setVisible(true);
- mCalculateWeightsBtn->setVisible(true);
- mCalculatingWeightsBtn->setVisible(false);
- }
-
- if (state == REVIEW)
- {
-
- 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);
- mCalculateWeightsBtn->setVisible(false);
- mCalculatingWeightsBtn->setVisible(false);
- }
-
- if (state == UPLOAD)
- {
- getChildView("close")->setVisible(true);
- getChildView("next")->setVisible(false);
- getChildView("back")->setVisible(false);
- getChildView("upload")->setVisible(false);
- getChildView("cancel")->setVisible(false);
- mCalculateWeightsBtn->setVisible(false);
- mCalculatingWeightsBtn->setVisible(false);
- }
-
- if (current_preview_panel)
- {
- LLRect rect;
- current_preview_panel->localRectToOtherView(current_preview_panel->getLocalRect(), &rect, this);
-
- // Reduce the preview rect by 1 px to fit the borders
- rect.stretch(-1);
-
- if (rect != mPreviewRect)
- {
- mPreviewRect = rect;
- mModelPreview->refresh();
- }
- }
- updateButtons();
-}
-
-
-
-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);
- }
- }
-}
-
-void LLFloaterModelWizard::onClickSwitchToAdvanced()
-{
- LLFloaterModelPreview* floater_preview = LLFloaterReg::getTypedInstance<LLFloaterModelPreview>("upload_model");
- if (!floater_preview)
- {
- llwarns << "FLoater model preview not found." << llendl;
- return;
- }
-
- // Open floater model preview
- floater_preview->openFloater();
-
- // Close the wizard
- closeFloater();
-
- std::string filename = getChild<LLUICtrl>("lod_file")->getValue().asString();
- if (!filename.empty())
- {
- // Re-load the model to the floater model preview if it has been loaded
- // into the wizard.
- floater_preview->loadModel(3, filename);
- }
-}
-
-void LLFloaterModelWizard::onClickRecalculateGeometry()
-{
- S32 val = getChild<LLUICtrl>("accuracy_slider")->getValue().asInteger();
-
- mModelPreview->genLODs(-1, NUM_LOD - val);
-
- mModelPreview->refresh();
-}
-
-void LLFloaterModelWizard::onClickRecalculatePhysics()
-{
- // Hide the "Recalculate physics" button and show the "Recalculating..."
- // button instead.
- swap_controls(mRecalculatePhysicsBtn, mRecalculatingPhysicsBtn, false);
-
- executePhysicsStage("Decompose");
-}
-
-void LLFloaterModelWizard::onClickCalculateUploadFee()
-{
- swap_controls(mCalculateWeightsBtn, mCalculatingWeightsBtn, false);
-
- mModelPreview->rebuildUploadData();
-
- mUploadModelUrl.clear();
-
- gMeshRepo.uploadModel(mModelPreview->mUploadData, mModelPreview->mPreviewScale,
- true, false, false, mUploadModelUrl, false, getWholeModelFeeObserverHandle());
-}
-
-void LLFloaterModelWizard::loadModel()
-{
- 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 %
-}
-
-/*virtual*/
-void LLFloaterModelWizard::onPermissionsReceived(const LLSD& result)
-{
- std::string upload_status = result["mesh_upload_status"].asString();
- // BAP HACK: handle "" for case that MeshUploadFlag cap is broken.
- mHasUploadPerm = (("" == upload_status) || ("valid" == upload_status));
-
- getChildView("warning_label")->setVisible(!mHasUploadPerm);
- getChildView("warning_text")->setVisible(!mHasUploadPerm);
-}
-
-/*virtual*/
-void LLFloaterModelWizard::setPermissonsErrorStatus(U32 status, const std::string& reason)
-{
- llwarns << "LLFloaterModelWizard::setPermissonsErrorStatus(" << status << " : " << reason << ")" << llendl;
-}
-
-/*virtual*/
-void LLFloaterModelWizard::onModelPhysicsFeeReceived(const LLSD& result, std::string upload_url)
-{
- swap_controls(mCalculateWeightsBtn, mCalculatingWeightsBtn, true);
-
- // Enable the "Upload" buton if we have calculated the upload fee
- // and have the permission to upload.
- getChildView("upload")->setEnabled(mHasUploadPerm);
-
- mUploadModelUrl = upload_url;
-
- S32 fee = result["upload_price"].asInteger();
- childSetTextArg("review_fee", "[FEE]", llformat("%d", fee));
- childSetTextArg("charged_fee", "[FEE]", llformat("%d", fee));
-
- setState(REVIEW);
-}
-
-/*virtual*/
-void LLFloaterModelWizard::setModelPhysicsFeeErrorStatus(U32 status, const std::string& reason)
-{
- swap_controls(mCalculateWeightsBtn, mCalculatingWeightsBtn, true);
-
- // Disable the "Review" step if it has been previously enabled.
- modelChangedCallback();
-
- llwarns << "LLFloaterModelWizard::setModelPhysicsFeeErrorStatus(" << status << " : " << reason << ")" << llendl;
-
- setState(PHYSICS);
-}
-
-/*virtual*/
-void LLFloaterModelWizard::onModelUploadSuccess()
-{
- // success!
- setState(UPLOAD);
-}
-
-/*virtual*/
-void LLFloaterModelWizard::onModelUploadFailure()
-{
- // Failure. Make the user recalculate fees
- setState(PHYSICS);
- // Disable the "Review" step if it has been previously enabled.
- if (mLastEnabledState > PHYSICS)
- {
- mLastEnabledState = PHYSICS;
- }
-
- updateButtons();
-}
-
-//static
-void LLFloaterModelWizard::executePhysicsStage(std::string stage_name)
-{
- if (sInstance)
- {
- // Invert the slider value so that "performance" end is giving the least detailed physics,
- // and the "accuracy" end is giving the most detailed physics
- F64 physics_accuracy = 1 - sInstance->getChild<LLSliderCtrl>("physics_slider")->getValue().asReal();
-
- sInstance->mDecompParams["Retain%"] = physics_accuracy;
-
- 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);
- if(request->isValid())
- {
- 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
- assignData(mdl) ;
-}
-
-
-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");
- }
- else
- {
- // Decomp request is complete so we can enable the "Recalculate physics" button again.
- swap_controls(sInstance->mRecalculatePhysicsBtn, sInstance->mRecalculatingPhysicsBtn, true);
- }
-}
-
-
-BOOL LLFloaterModelWizard::postBuild()
-{
- 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>("upload")->setCommitCallback(boost::bind(&LLFloaterModelWizard::onUpload, this));
- getChild<LLUICtrl>("switch_to_advanced")->setCommitCallback(boost::bind(&LLFloaterModelWizard::onClickSwitchToAdvanced, this));
-
- mRecalculateGeometryBtn = getChild<LLButton>("recalculate_geometry_btn");
- mRecalculateGeometryBtn->setCommitCallback(boost::bind(&LLFloaterModelWizard::onClickRecalculateGeometry, this));
-
- mRecalculatePhysicsBtn = getChild<LLButton>("recalculate_physics_btn");
- mRecalculatePhysicsBtn->setCommitCallback(boost::bind(&LLFloaterModelWizard::onClickRecalculatePhysics, this));
-
- mRecalculatingPhysicsBtn = getChild<LLButton>("recalculating_physics_btn");
-
- mCalculateWeightsBtn = getChild<LLButton>("calculate");
- mCalculateWeightsBtn->setCommitCallback(boost::bind(&LLFloaterModelWizard::onClickCalculateUploadFee, this));
-
- mCalculatingWeightsBtn = getChild<LLButton>("calculating");
-
- mChooseFilePreviewPanel = getChild<LLView>("choose_file_preview_panel");
- mOptimizePreviewPanel = getChild<LLView>("optimize_preview_panel");
- mPhysicsPreviewPanel = getChild<LLView>("physics_preview_panel");
-
- LLUICtrl::EnableCallbackRegistry::ScopedRegistrar enable_registrar;
-
- enable_registrar.add("Next.OnEnable", boost::bind(&LLFloaterModelWizard::onEnableNext, this));
- enable_registrar.add("Back.OnEnable", boost::bind(&LLFloaterModelWizard::onEnableBack, this));
-
- mModelPreview = new LLModelPreview(512, 512, this);
- mModelPreview->setPreviewTarget(16.f);
- mModelPreview->setDetailsCallback(boost::bind(&LLFloaterModelWizard::setDetails, this, _1, _2, _3, _4, _5));
- mModelPreview->setModelLoadedCallback(boost::bind(&LLFloaterModelWizard::modelLoadedCallback, this));
- mModelPreview->setModelUpdatedCallback(boost::bind(&LLFloaterModelWizard::modelChangedCallback, this));
- mModelPreview->mViewOption["show_textures"] = true;
-
- center();
-
- setState(CHOOSE_FILE);
-
- childSetTextArg("import_dimensions", "[X]", LLStringUtil::null);
- childSetTextArg("import_dimensions", "[Y]", LLStringUtil::null);
- childSetTextArg("import_dimensions", "[Z]", LLStringUtil::null);
-
- initDecompControls();
-
- requestAgentUploadPermissions();
-
- 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));
- }
- }
-
- childSetTextArg("review_prim_equiv", "[EQUIV]", llformat("%d", mModelPreview->mResourceCost));
-}
-
-void LLFloaterModelWizard::modelLoadedCallback()
-{
- mLastEnabledState = CHOOSE_FILE;
- updateButtons();
-}
-
-void LLFloaterModelWizard::modelChangedCallback()
-{
- // Don't allow to proceed to the "Review" step if the model has changed
- // but the new upload fee hasn't been calculated yet.
- if (mLastEnabledState > PHYSICS)
- {
- mLastEnabledState = PHYSICS;
- }
-
- getChildView("upload")->setEnabled(false);
-
- updateButtons();
-}
-
-void LLFloaterModelWizard::onUpload()
-{
- mModelPreview->rebuildUploadData();
-
- gMeshRepo.uploadModel(mModelPreview->mUploadData, mModelPreview->mPreviewScale,
- true, false, false, mUploadModelUrl, true,
- LLHandle<LLWholeModelFeeObserver>(), getWholeModelUploadObserverHandle());
-}
-
-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);
- }
-}
-
-void LLFloaterModelWizard::draw()
-{
- refresh();
-
- LLFloater::draw();
-
- if (mModelPreview && mState < REVIEW)
- {
- mModelPreview->update();
-
- gGL.color3f(1.f, 1.f, 1.f);
-
- gGL.getTexUnit(0)->bind(mModelPreview);
-
- gGL.begin( LLRender::QUADS );
- {
- gGL.texCoord2f(0.f, 1.f);
- gGL.vertex2i(mPreviewRect.mLeft, mPreviewRect.mTop);
- gGL.texCoord2f(0.f, 0.f);
- gGL.vertex2i(mPreviewRect.mLeft, mPreviewRect.mBottom);
- gGL.texCoord2f(1.f, 0.f);
- gGL.vertex2i(mPreviewRect.mRight, mPreviewRect.mBottom);
- gGL.texCoord2f(1.f, 1.f);
- gGL.vertex2i(mPreviewRect.mRight, mPreviewRect.mTop);
- }
- gGL.end();
-
- gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
- }
-}
-
-// static
-void swap_controls(LLUICtrl* first_ctrl, LLUICtrl* second_ctrl, bool first_ctr_visible)
-{
- first_ctrl->setVisible(first_ctr_visible);
- second_ctrl->setVisible(!first_ctr_visible);
-}
diff --git a/indra/newview/llfloatermodelwizard.h b/indra/newview/llfloatermodelwizard.h
deleted file mode 100644
index db9b605777..0000000000
--- a/indra/newview/llfloatermodelwizard.h
+++ /dev/null
@@ -1,140 +0,0 @@
-/**
- * @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"
-#include "llfloatermodeluploadbase.h"
-
-
-class LLModelPreview;
-
-
-class LLFloaterModelWizard : public LLFloaterModelUploadBase
-{
-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 modelChangedCallback();
- void initDecompControls();
-
- // shows warning message if agent has no permissions to upload model
- /*virtual*/ void onPermissionsReceived(const LLSD& result);
-
- // called when error occurs during permissions request
- /*virtual*/ void setPermissonsErrorStatus(U32 status, const std::string& reason);
-
- /*virtual*/ void onModelPhysicsFeeReceived(const LLSD& result, std::string upload_url);
-
- /*virtual*/ void setModelPhysicsFeeErrorStatus(U32 status, const std::string& reason);
-
- /*virtual*/ void onModelUploadSuccess();
-
- /*virtual*/ void onModelUploadFailure();
-
- const LLRect& getPreviewRect() const { return mPreviewRect; }
-
- LLPhysicsDecomp::decomp_params mDecompParams;
- std::set<LLPointer<DecompRequest> > mCurRequest;
- std::string mStatusMessage;
- static void executePhysicsStage(std::string stage_name);
-
-private:
- enum EWizardState
- {
- CHOOSE_FILE = 0,
- OPTIMIZE,
- PHYSICS,
- REVIEW,
- UPLOAD
- };
-
- void setState(int state);
- void updateButtons();
- void onClickSwitchToAdvanced();
- void onClickRecalculateGeometry();
- void onClickRecalculatePhysics();
- void onClickCalculateUploadFee();
- void onClickCancel();
- void onClickBack();
- void onClickNext();
- bool onEnableNext();
- bool onEnableBack();
- void loadModel();
- void onPreviewLODCommit(LLUICtrl*);
- void onUpload();
-
- LLModelPreview* mModelPreview;
- LLRect mPreviewRect;
- int mState;
-
- S32 mLastMouseX;
- S32 mLastMouseY;
-
- U32 mLastEnabledState;
-
- LLButton* mRecalculateGeometryBtn;
- LLButton* mRecalculatePhysicsBtn;
- LLButton* mRecalculatingPhysicsBtn;
- LLButton* mCalculateWeightsBtn;
- LLButton* mCalculatingWeightsBtn;
-
- LLView* mChooseFilePreviewPanel;
- LLView* mOptimizePreviewPanel;
- LLView* mPhysicsPreviewPanel;
-};
-
-
-#endif
diff --git a/indra/newview/llfloaterpathfindingcharacters.cpp b/indra/newview/llfloaterpathfindingcharacters.cpp
new file mode 100644
index 0000000000..99d262344c
--- /dev/null
+++ b/indra/newview/llfloaterpathfindingcharacters.cpp
@@ -0,0 +1,326 @@
+/**
+* @file llfloaterpathfindingcharacters.cpp
+* @brief "Pathfinding characters" floater, allowing for identification of pathfinding characters and their cpu usage.
+* @author Stinson@lindenlab.com
+*
+* $LicenseInfo:firstyear=2012&license=viewerlgpl$
+* Second Life Viewer Source Code
+* Copyright (C) 2012, Linden Research, Inc.
+*
+* This library is free software; you can redistribute it and/or
+* modify it under the terms of the GNU Lesser General Public
+* License as published by the Free Software Foundation;
+* version 2.1 of the License only.
+*
+* This library is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this library; if not, write to the Free Software
+* 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 "llfloaterpathfindingcharacters.h"
+
+#include <string>
+
+#include "llcheckboxctrl.h"
+#include "llfloaterreg.h"
+#include "llfloaterpathfindingobjects.h"
+#include "llhandle.h"
+#include "llpathfindingcharacter.h"
+#include "llpathfindingcharacterlist.h"
+#include "llpathfindingmanager.h"
+#include "llpathfindingobject.h"
+#include "llpathfindingobjectlist.h"
+#include "llpathinglib.h"
+#include "llquaternion.h"
+#include "llsd.h"
+#include "lluicolortable.h"
+#include "lluuid.h"
+#include "llviewerobject.h"
+#include "llviewerobjectlist.h"
+#include "pipeline.h"
+#include "v3math.h"
+#include "v4color.h"
+
+LLHandle<LLFloaterPathfindingCharacters> LLFloaterPathfindingCharacters::sInstanceHandle;
+
+//---------------------------------------------------------------------------
+// LLFloaterPathfindingCharacters
+//---------------------------------------------------------------------------
+
+void LLFloaterPathfindingCharacters::onClose(bool pIsAppQuitting)
+{
+ // Hide any capsule that might be showing on floater close
+ hideCapsule();
+ LLFloaterPathfindingObjects::onClose( pIsAppQuitting );
+}
+
+BOOL LLFloaterPathfindingCharacters::isShowPhysicsCapsule() const
+{
+ return mShowPhysicsCapsuleCheckBox->get();
+}
+
+void LLFloaterPathfindingCharacters::setShowPhysicsCapsule(BOOL pIsShowPhysicsCapsule)
+{
+ mShowPhysicsCapsuleCheckBox->set(pIsShowPhysicsCapsule && (LLPathingLib::getInstance() != NULL));
+}
+
+BOOL LLFloaterPathfindingCharacters::isPhysicsCapsuleEnabled(LLUUID& id, LLVector3& pos, LLQuaternion& rot) const
+{
+ id = mSelectedCharacterId;
+ // Physics capsule is enable if the checkbox is enabled and if we can get the required render
+ // parameters for any selected object
+ return (isShowPhysicsCapsule() && getCapsuleRenderData(pos, rot ));
+}
+
+void LLFloaterPathfindingCharacters::openCharactersWithSelectedObjects()
+{
+ LLFloaterPathfindingCharacters *charactersFloater = LLFloaterReg::getTypedInstance<LLFloaterPathfindingCharacters>("pathfinding_characters");
+ charactersFloater->showFloaterWithSelectionObjects();
+}
+
+LLHandle<LLFloaterPathfindingCharacters> LLFloaterPathfindingCharacters::getInstanceHandle()
+{
+ if ( sInstanceHandle.isDead() )
+ {
+ LLFloaterPathfindingCharacters *floaterInstance = LLFloaterReg::findTypedInstance<LLFloaterPathfindingCharacters>("pathfinding_characters");
+ if (floaterInstance != NULL)
+ {
+ sInstanceHandle = floaterInstance->mSelfHandle;
+ }
+ }
+
+ return sInstanceHandle;
+}
+
+LLFloaterPathfindingCharacters::LLFloaterPathfindingCharacters(const LLSD& pSeed)
+ : LLFloaterPathfindingObjects(pSeed),
+ mShowPhysicsCapsuleCheckBox(NULL),
+ mSelectedCharacterId(),
+ mBeaconColor(),
+ mSelfHandle()
+{
+ mSelfHandle.bind(this);
+}
+
+LLFloaterPathfindingCharacters::~LLFloaterPathfindingCharacters()
+{
+}
+
+BOOL LLFloaterPathfindingCharacters::postBuild()
+{
+ mBeaconColor = LLUIColorTable::getInstance()->getColor("PathfindingCharacterBeaconColor");
+
+ mShowPhysicsCapsuleCheckBox = findChild<LLCheckBoxCtrl>("show_physics_capsule");
+ llassert(mShowPhysicsCapsuleCheckBox != NULL);
+ mShowPhysicsCapsuleCheckBox->setCommitCallback(boost::bind(&LLFloaterPathfindingCharacters::onShowPhysicsCapsuleClicked, this));
+ mShowPhysicsCapsuleCheckBox->setEnabled(LLPathingLib::getInstance() != NULL);
+
+ return LLFloaterPathfindingObjects::postBuild();
+}
+
+void LLFloaterPathfindingCharacters::requestGetObjects()
+{
+ LLPathfindingManager::getInstance()->requestGetCharacters(getNewRequestId(), boost::bind(&LLFloaterPathfindingCharacters::handleNewObjectList, this, _1, _2, _3));
+}
+
+LLSD LLFloaterPathfindingCharacters::convertObjectsIntoScrollListData(const LLPathfindingObjectListPtr pObjectListPtr)
+{
+ llassert(pObjectListPtr != NULL);
+ llassert(!pObjectListPtr->isEmpty());
+
+ LLSD scrollListData = LLSD::emptyArray();
+
+ for (LLPathfindingObjectList::const_iterator objectIter = pObjectListPtr->begin(); objectIter != pObjectListPtr->end(); ++objectIter)
+ {
+ const LLPathfindingCharacter *characterPtr = dynamic_cast<const LLPathfindingCharacter *>(objectIter->second.get());
+ LLSD element = buildCharacterScrollListData(characterPtr);
+ scrollListData.append(element);
+
+ if (characterPtr->hasOwner() && !characterPtr->hasOwnerName())
+ {
+ rebuildScrollListAfterAvatarNameLoads(characterPtr->getUUID());
+ }
+ }
+
+ return scrollListData;
+}
+
+void LLFloaterPathfindingCharacters::updateControlsOnScrollListChange()
+{
+ LLFloaterPathfindingObjects::updateControlsOnScrollListChange();
+ updateStateOnDisplayControls();
+ showSelectedCharacterCapsules();
+}
+
+S32 LLFloaterPathfindingCharacters::getNameColumnIndex() const
+{
+ return 0;
+}
+
+const LLColor4 &LLFloaterPathfindingCharacters::getBeaconColor() const
+{
+ return mBeaconColor;
+}
+
+LLPathfindingObjectListPtr LLFloaterPathfindingCharacters::getEmptyObjectList() const
+{
+ LLPathfindingObjectListPtr objectListPtr(new LLPathfindingCharacterList());
+ return objectListPtr;
+}
+
+void LLFloaterPathfindingCharacters::onShowPhysicsCapsuleClicked()
+{
+ if (LLPathingLib::getInstance() == NULL)
+ {
+ if (isShowPhysicsCapsule())
+ {
+ setShowPhysicsCapsule(FALSE);
+ }
+ }
+ else
+ {
+ if (mSelectedCharacterId.notNull() && isShowPhysicsCapsule())
+ {
+ showCapsule();
+ }
+ else
+ {
+ hideCapsule();
+ }
+ }
+}
+
+LLSD LLFloaterPathfindingCharacters::buildCharacterScrollListData(const LLPathfindingCharacter *pCharacterPtr) const
+{
+ LLSD columns;
+
+ columns[0]["column"] = "name";
+ columns[0]["value"] = pCharacterPtr->getName();
+
+ columns[1]["column"] = "description";
+ columns[1]["value"] = pCharacterPtr->getDescription();
+
+ columns[2]["column"] = "owner";
+ columns[2]["value"] = (pCharacterPtr->hasOwner()
+ ? (pCharacterPtr->hasOwnerName()
+ ? (pCharacterPtr->isGroupOwned()
+ ? (pCharacterPtr->getOwnerName() + " " + getString("character_owner_group"))
+ : pCharacterPtr->getOwnerName())
+ : getString("character_owner_loading"))
+ : getString("character_owner_unknown"));
+
+ S32 cpuTime = llround(pCharacterPtr->getCPUTime());
+ std::string cpuTimeString = llformat("%d", cpuTime);
+ LLStringUtil::format_map_t string_args;
+ string_args["[CPU_TIME]"] = cpuTimeString;
+
+ columns[3]["column"] = "cpu_time";
+ columns[3]["value"] = getString("character_cpu_time", string_args);
+
+ columns[4]["column"] = "altitude";
+ columns[4]["value"] = llformat("%1.0f m", pCharacterPtr->getLocation()[2]);
+
+ LLSD element;
+ element["id"] = pCharacterPtr->getUUID().asString();
+ element["column"] = columns;
+
+ return element;
+}
+
+void LLFloaterPathfindingCharacters::updateStateOnDisplayControls()
+{
+ int numSelectedItems = getNumSelectedObjects();;
+ bool isEditEnabled = ((numSelectedItems == 1) && (LLPathingLib::getInstance() != NULL));
+
+ mShowPhysicsCapsuleCheckBox->setEnabled(isEditEnabled);
+ if (!isEditEnabled)
+ {
+ setShowPhysicsCapsule(FALSE);
+ }
+}
+
+void LLFloaterPathfindingCharacters::showSelectedCharacterCapsules()
+{
+ // Hide any previous capsule
+ hideCapsule();
+
+ // Get the only selected object, or set the selected object to null if we do not have exactly
+ // one object selected
+ if (getNumSelectedObjects() == 1)
+ {
+ LLPathfindingObjectPtr selectedObjectPtr = getFirstSelectedObject();
+ mSelectedCharacterId = selectedObjectPtr->getUUID();
+ }
+ else
+ {
+ mSelectedCharacterId.setNull();
+ }
+
+ // Show any capsule if enabled
+ showCapsule();
+}
+
+void LLFloaterPathfindingCharacters::showCapsule() const
+{
+ if (mSelectedCharacterId.notNull() && isShowPhysicsCapsule())
+ {
+ LLPathfindingObjectPtr objectPtr = getFirstSelectedObject();
+ llassert(objectPtr != NULL);
+ if (objectPtr != NULL)
+ {
+ const LLPathfindingCharacter *character = dynamic_cast<const LLPathfindingCharacter *>(objectPtr.get());
+ llassert(mSelectedCharacterId == character->getUUID());
+ if (LLPathingLib::getInstance() != NULL)
+ {
+ LLPathingLib::getInstance()->createPhysicsCapsuleRep(character->getLength(), character->getRadius(),
+ character->isHorizontal(), character->getUUID());
+ }
+ }
+
+ gPipeline.hideObject(mSelectedCharacterId);
+ }
+}
+
+void LLFloaterPathfindingCharacters::hideCapsule() const
+{
+ if (mSelectedCharacterId.notNull())
+ {
+ gPipeline.restoreHiddenObject(mSelectedCharacterId);
+ }
+ if (LLPathingLib::getInstance() != NULL)
+ {
+ LLPathingLib::getInstance()->cleanupPhysicsCapsuleRepResiduals();
+ }
+}
+
+bool LLFloaterPathfindingCharacters::getCapsuleRenderData(LLVector3& pPosition, LLQuaternion& rot) const
+{
+ bool result = false;
+
+ // If we have a selected object, find the object on the viewer object list and return its
+ // position. Else, return false indicating that we either do not have a selected object
+ // or we cannot find the selected object on the viewer object list
+ if (mSelectedCharacterId.notNull())
+ {
+ LLViewerObject *viewerObject = gObjectList.findObject(mSelectedCharacterId);
+ if ( viewerObject != NULL )
+ {
+ rot = viewerObject->getRotation() ;
+ pPosition = viewerObject->getRenderPosition();
+ result = true;
+ }
+ }
+
+ return result;
+}
diff --git a/indra/newview/llfloaterpathfindingcharacters.h b/indra/newview/llfloaterpathfindingcharacters.h
new file mode 100644
index 0000000000..ef389ad428
--- /dev/null
+++ b/indra/newview/llfloaterpathfindingcharacters.h
@@ -0,0 +1,97 @@
+/**
+* @file llfloaterpathfindingcharacters.h
+* @brief "Pathfinding characters" floater, allowing for identification of pathfinding characters and their cpu usage.
+* @author Stinson@lindenlab.com
+*
+* $LicenseInfo:firstyear=2012&license=viewerlgpl$
+* Second Life Viewer Source Code
+* Copyright (C) 2012, Linden Research, Inc.
+*
+* This library is free software; you can redistribute it and/or
+* modify it under the terms of the GNU Lesser General Public
+* License as published by the Free Software Foundation;
+* version 2.1 of the License only.
+*
+* This library is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this library; if not, write to the Free Software
+* 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_LLFLOATERPATHFINDINGCHARACTERS_H
+#define LL_LLFLOATERPATHFINDINGCHARACTERS_H
+
+#include "llfloaterpathfindingobjects.h"
+#include "llhandle.h"
+#include "llpathfindingobjectlist.h"
+#include "lluuid.h"
+#include "v4color.h"
+
+class LLCheckBoxCtrl;
+class LLPathfindingCharacter;
+class LLQuaternion;
+class LLSD;
+class LLVector3;
+
+class LLFloaterPathfindingCharacters : public LLFloaterPathfindingObjects
+{
+public:
+ virtual void onClose(bool pIsAppQuitting);
+
+ BOOL isShowPhysicsCapsule() const;
+ void setShowPhysicsCapsule(BOOL pIsShowPhysicsCapsule);
+
+ BOOL isPhysicsCapsuleEnabled(LLUUID& id, LLVector3& pos, LLQuaternion& rot) const;
+
+ static void openCharactersWithSelectedObjects();
+ static LLHandle<LLFloaterPathfindingCharacters> getInstanceHandle();
+
+protected:
+ friend class LLFloaterReg;
+
+ LLFloaterPathfindingCharacters(const LLSD& pSeed);
+ virtual ~LLFloaterPathfindingCharacters();
+
+ virtual BOOL postBuild();
+
+ virtual void requestGetObjects();
+
+ virtual LLSD convertObjectsIntoScrollListData(const LLPathfindingObjectListPtr pObjectListPtr);
+
+ virtual void updateControlsOnScrollListChange();
+
+ virtual S32 getNameColumnIndex() const;
+ virtual const LLColor4 &getBeaconColor() const;
+
+ virtual LLPathfindingObjectListPtr getEmptyObjectList() const;
+
+private:
+ void onShowPhysicsCapsuleClicked();
+
+ LLSD buildCharacterScrollListData(const LLPathfindingCharacter *pCharacterPtr) const;
+
+ void updateStateOnDisplayControls();
+ void showSelectedCharacterCapsules();
+
+ void showCapsule() const;
+ void hideCapsule() const;
+
+ bool getCapsuleRenderData(LLVector3& pPosition, LLQuaternion& rot) const;
+
+ LLCheckBoxCtrl *mShowPhysicsCapsuleCheckBox;
+
+ LLUUID mSelectedCharacterId;
+
+ LLColor4 mBeaconColor;
+
+ LLRootHandle<LLFloaterPathfindingCharacters> mSelfHandle;
+ static LLHandle<LLFloaterPathfindingCharacters> sInstanceHandle;
+};
+
+#endif // LL_LLFLOATERPATHFINDINGCHARACTERS_H
diff --git a/indra/newview/llfloaterpathfindingconsole.cpp b/indra/newview/llfloaterpathfindingconsole.cpp
new file mode 100644
index 0000000000..298454724b
--- /dev/null
+++ b/indra/newview/llfloaterpathfindingconsole.cpp
@@ -0,0 +1,1273 @@
+/**
+* @file llfloaterpathfindingconsole.cpp
+* @brief "Pathfinding console" floater, allowing for viewing and testing of the pathfinding navmesh through Havok AI utilities.
+* @author Stinson@lindenlab.com
+*
+* $LicenseInfo:firstyear=2012&license=viewerlgpl$
+* Second Life Viewer Source Code
+* Copyright (C) 2012, Linden Research, Inc.
+*
+* This library is free software; you can redistribute it and/or
+* modify it under the terms of the GNU Lesser General Public
+* License as published by the Free Software Foundation;
+* version 2.1 of the License only.
+*
+* This library is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this library; if not, write to the Free Software
+* 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 "llfloaterpathfindingconsole.h"
+
+#include <vector>
+
+#include <boost/signals2.hpp>
+
+#include "llbutton.h"
+#include "llcheckboxctrl.h"
+#include "llcombobox.h"
+#include "llcontrol.h"
+#include "llenvmanager.h"
+#include "llfloaterpathfindingcharacters.h"
+#include "llfloaterpathfindinglinksets.h"
+#include "llfloaterreg.h"
+#include "llhandle.h"
+#include "llpanel.h"
+#include "llpathfindingnavmeshzone.h"
+#include "llpathfindingpathtool.h"
+#include "llpathinglib.h"
+#include "llsliderctrl.h"
+#include "llsd.h"
+#include "lltabcontainer.h"
+#include "lltextbase.h"
+#include "lltoolmgr.h"
+#include "lltoolfocus.h"
+#include "llviewercontrol.h"
+#include "llviewerparcelmgr.h"
+#include "pipeline.h"
+
+#define XUI_RENDER_HEATMAP_NONE 0
+#define XUI_RENDER_HEATMAP_A 1
+#define XUI_RENDER_HEATMAP_B 2
+#define XUI_RENDER_HEATMAP_C 3
+#define XUI_RENDER_HEATMAP_D 4
+
+#define XUI_CHARACTER_TYPE_NONE 0
+#define XUI_CHARACTER_TYPE_A 1
+#define XUI_CHARACTER_TYPE_B 2
+#define XUI_CHARACTER_TYPE_C 3
+#define XUI_CHARACTER_TYPE_D 4
+
+#define XUI_VIEW_TAB_INDEX 0
+#define XUI_TEST_TAB_INDEX 1
+
+#define SET_SHAPE_RENDER_FLAG(_flag,_type) _flag |= (1U << _type)
+
+#define CONTROL_NAME_RETRIEVE_NEIGHBOR "PathfindingRetrieveNeighboringRegion"
+#define CONTROL_NAME_WALKABLE_OBJECTS "PathfindingWalkable"
+#define CONTROL_NAME_STATIC_OBSTACLE_OBJECTS "PathfindingObstacle"
+#define CONTROL_NAME_MATERIAL_VOLUMES "PathfindingMaterial"
+#define CONTROL_NAME_EXCLUSION_VOLUMES "PathfindingExclusion"
+#define CONTROL_NAME_INTERIOR_EDGE "PathfindingConnectedEdge"
+#define CONTROL_NAME_EXTERIOR_EDGE "PathfindingBoundaryEdge"
+#define CONTROL_NAME_HEATMAP_MIN "PathfindingHeatColorBase"
+#define CONTROL_NAME_HEATMAP_MAX "PathfindingHeatColorMax"
+#define CONTROL_NAME_NAVMESH_FACE "PathfindingFaceColor"
+#define CONTROL_NAME_TEST_PATH_VALID_END "PathfindingTestPathValidEndColor"
+#define CONTROL_NAME_TEST_PATH_INVALID_END "PathfindingTestPathInvalidEndColor"
+#define CONTROL_NAME_TEST_PATH "PathfindingTestPathColor"
+#define CONTROL_NAME_WATER "PathfindingWaterColor"
+
+LLHandle<LLFloaterPathfindingConsole> LLFloaterPathfindingConsole::sInstanceHandle;
+
+//---------------------------------------------------------------------------
+// LLFloaterPathfindingConsole
+//---------------------------------------------------------------------------
+
+BOOL LLFloaterPathfindingConsole::postBuild()
+{
+ mViewTestTabContainer = findChild<LLTabContainer>("view_test_tab_container");
+ llassert(mViewTestTabContainer != NULL);
+ mViewTestTabContainer->setCommitCallback(boost::bind(&LLFloaterPathfindingConsole::onTabSwitch, this));
+
+ mViewTab = findChild<LLPanel>("view_panel");
+ llassert(mViewTab != NULL);
+
+ mShowLabel = findChild<LLTextBase>("show_label");
+ llassert(mShowLabel != NULL);
+
+ mShowWorldCheckBox = findChild<LLCheckBoxCtrl>("show_world");
+ llassert(mShowWorldCheckBox != NULL);
+ mShowWorldCheckBox->setCommitCallback(boost::bind(&LLFloaterPathfindingConsole::onShowWorldSet, this));
+
+ mShowWorldMovablesOnlyCheckBox = findChild<LLCheckBoxCtrl>("show_world_movables_only");
+ llassert(mShowWorldMovablesOnlyCheckBox != NULL);
+ mShowWorldMovablesOnlyCheckBox->setCommitCallback(boost::bind(&LLFloaterPathfindingConsole::onShowWorldMovablesOnlySet, this));
+
+ mShowNavMeshCheckBox = findChild<LLCheckBoxCtrl>("show_navmesh");
+ llassert(mShowNavMeshCheckBox != NULL);
+ mShowNavMeshCheckBox->setCommitCallback(boost::bind(&LLFloaterPathfindingConsole::onShowNavMeshSet, this));
+
+ mShowNavMeshWalkabilityLabel = findChild<LLTextBase>("show_walkability_label");
+ llassert(mShowNavMeshWalkabilityLabel != NULL);
+
+ mShowNavMeshWalkabilityComboBox = findChild<LLComboBox>("show_heatmap_mode");
+ llassert(mShowNavMeshWalkabilityComboBox != NULL);
+ mShowNavMeshWalkabilityComboBox->setCommitCallback(boost::bind(&LLFloaterPathfindingConsole::onShowWalkabilitySet, this));
+
+ mShowWalkablesCheckBox = findChild<LLCheckBoxCtrl>("show_walkables");
+ llassert(mShowWalkablesCheckBox != NULL);
+
+ mShowStaticObstaclesCheckBox = findChild<LLCheckBoxCtrl>("show_static_obstacles");
+ llassert(mShowStaticObstaclesCheckBox != NULL);
+
+ mShowMaterialVolumesCheckBox = findChild<LLCheckBoxCtrl>("show_material_volumes");
+ llassert(mShowMaterialVolumesCheckBox != NULL);
+
+ mShowExclusionVolumesCheckBox = findChild<LLCheckBoxCtrl>("show_exclusion_volumes");
+ llassert(mShowExclusionVolumesCheckBox != NULL);
+
+ mShowRenderWaterPlaneCheckBox = findChild<LLCheckBoxCtrl>("show_water_plane");
+ llassert(mShowRenderWaterPlaneCheckBox != NULL);
+
+ mShowXRayCheckBox = findChild<LLCheckBoxCtrl>("show_xray");
+ llassert(mShowXRayCheckBox != NULL);
+
+ mTestTab = findChild<LLPanel>("test_panel");
+ llassert(mTestTab != NULL);
+
+ mPathfindingViewerStatus = findChild<LLTextBase>("pathfinding_viewer_status");
+ llassert(mPathfindingViewerStatus != NULL);
+
+ mPathfindingSimulatorStatus = findChild<LLTextBase>("pathfinding_simulator_status");
+ llassert(mPathfindingSimulatorStatus != NULL);
+
+ mCtrlClickLabel = findChild<LLTextBase>("ctrl_click_label");
+ llassert(mCtrlClickLabel != NULL);
+
+ mShiftClickLabel = findChild<LLTextBase>("shift_click_label");
+ llassert(mShiftClickLabel != NULL);
+
+ mCharacterWidthLabel = findChild<LLTextBase>("character_width_label");
+ llassert(mCharacterWidthLabel != NULL);
+
+ mCharacterWidthSlider = findChild<LLSliderCtrl>("character_width");
+ llassert(mCharacterWidthSlider != NULL);
+ mCharacterWidthSlider->setCommitCallback(boost::bind(&LLFloaterPathfindingConsole::onCharacterWidthSet, this));
+
+ mCharacterWidthUnitLabel = findChild<LLTextBase>("character_width_unit_label");
+ llassert(mCharacterWidthUnitLabel != NULL);
+
+ mCharacterTypeLabel = findChild<LLTextBase>("character_type_label");
+ llassert(mCharacterTypeLabel != NULL);
+
+ mCharacterTypeComboBox = findChild<LLComboBox>("path_character_type");
+ llassert(mCharacterTypeComboBox != NULL);
+ mCharacterTypeComboBox->setCommitCallback(boost::bind(&LLFloaterPathfindingConsole::onCharacterTypeSwitch, this));
+
+ mPathTestingStatus = findChild<LLTextBase>("path_test_status");
+ llassert(mPathTestingStatus != NULL);
+
+ mClearPathButton = findChild<LLButton>("clear_path");
+ llassert(mClearPathButton != NULL);
+ mClearPathButton->setCommitCallback(boost::bind(&LLFloaterPathfindingConsole::onClearPathClicked, this));
+
+ mErrorColor = LLUIColorTable::instance().getColor("PathfindingErrorColor");
+ mWarningColor = LLUIColorTable::instance().getColor("PathfindingWarningColor");
+
+ if (LLPathingLib::getInstance() != NULL)
+ {
+ mPathfindingToolset = new LLToolset();
+ mPathfindingToolset->addTool(LLPathfindingPathTool::getInstance());
+ mPathfindingToolset->addTool(LLToolCamera::getInstance());
+ mPathfindingToolset->setShowFloaterTools(false);
+ }
+
+ updateCharacterWidth();
+ updateCharacterType();
+
+ return LLFloater::postBuild();
+}
+
+void LLFloaterPathfindingConsole::onOpen(const LLSD& pKey)
+{
+ LLFloater::onOpen(pKey);
+ //make sure we have a pathing system
+ if ( LLPathingLib::getInstance() == NULL )
+ {
+ setConsoleState(kConsoleStateLibraryNotImplemented);
+ llwarns <<"Errror: cannot find pathing library implementation."<<llendl;
+ }
+ else
+ {
+ if (!mNavMeshZoneSlot.connected())
+ {
+ mNavMeshZoneSlot = mNavMeshZone.registerNavMeshZoneListener(boost::bind(&LLFloaterPathfindingConsole::handleNavMeshZoneStatus, this, _1));
+ }
+
+ mIsNavMeshUpdating = false;
+ initializeNavMeshZoneForCurrentRegion();
+ registerSavedSettingsListeners();
+ fillInColorsForNavMeshVisualization();
+ }
+
+ if (!mRegionBoundarySlot.connected())
+ {
+ mRegionBoundarySlot = LLEnvManagerNew::instance().setRegionChangeCallback(boost::bind(&LLFloaterPathfindingConsole::onRegionBoundaryCross, this));
+ }
+
+ if (!mTeleportFailedSlot.connected())
+ {
+ mTeleportFailedSlot = LLViewerParcelMgr::getInstance()->setTeleportFailedCallback(boost::bind(&LLFloaterPathfindingConsole::onRegionBoundaryCross, this));
+ }
+
+ if (!mPathEventSlot.connected())
+ {
+ mPathEventSlot = LLPathfindingPathTool::getInstance()->registerPathEventListener(boost::bind(&LLFloaterPathfindingConsole::onPathEvent, this));
+ }
+
+ setDefaultInputs();
+ updatePathTestStatus();
+
+ if (mViewTestTabContainer->getCurrentPanelIndex() == XUI_TEST_TAB_INDEX)
+ {
+ switchIntoTestPathMode();
+ }
+}
+
+void LLFloaterPathfindingConsole::onClose(bool pIsAppQuitting)
+{
+ switchOutOfTestPathMode();
+
+ if (mPathEventSlot.connected())
+ {
+ mPathEventSlot.disconnect();
+ }
+
+ if (mTeleportFailedSlot.connected())
+ {
+ mTeleportFailedSlot.disconnect();
+ }
+
+ if (mRegionBoundarySlot.connected())
+ {
+ mRegionBoundarySlot.disconnect();
+ }
+
+ if (mNavMeshZoneSlot.connected())
+ {
+ mNavMeshZoneSlot.disconnect();
+ }
+
+ if (LLPathingLib::getInstance() != NULL)
+ {
+ mNavMeshZone.disable();
+ }
+ deregisterSavedSettingsListeners();
+
+ setDefaultInputs();
+ setConsoleState(kConsoleStateUnknown);
+ cleanupRenderableRestoreItems();
+
+ LLFloater::onClose(pIsAppQuitting);
+}
+
+LLHandle<LLFloaterPathfindingConsole> LLFloaterPathfindingConsole::getInstanceHandle()
+{
+ if (sInstanceHandle.isDead())
+ {
+ LLFloaterPathfindingConsole *floaterInstance = LLFloaterReg::findTypedInstance<LLFloaterPathfindingConsole>("pathfinding_console");
+ if (floaterInstance != NULL)
+ {
+ sInstanceHandle = floaterInstance->mSelfHandle;
+ }
+ }
+
+ return sInstanceHandle;
+}
+
+BOOL LLFloaterPathfindingConsole::isRenderNavMesh() const
+{
+ return mShowNavMeshCheckBox->get();
+}
+
+void LLFloaterPathfindingConsole::setRenderNavMesh(BOOL pIsRenderNavMesh)
+{
+ mShowNavMeshCheckBox->set(pIsRenderNavMesh);
+ setNavMeshRenderState();
+}
+
+BOOL LLFloaterPathfindingConsole::isRenderWalkables() const
+{
+ return mShowWalkablesCheckBox->get();
+}
+
+void LLFloaterPathfindingConsole::setRenderWalkables(BOOL pIsRenderWalkables)
+{
+ mShowWalkablesCheckBox->set(pIsRenderWalkables);
+}
+
+BOOL LLFloaterPathfindingConsole::isRenderStaticObstacles() const
+{
+ return mShowStaticObstaclesCheckBox->get();
+}
+
+void LLFloaterPathfindingConsole::setRenderStaticObstacles(BOOL pIsRenderStaticObstacles)
+{
+ mShowStaticObstaclesCheckBox->set(pIsRenderStaticObstacles);
+}
+
+BOOL LLFloaterPathfindingConsole::isRenderMaterialVolumes() const
+{
+ return mShowMaterialVolumesCheckBox->get();
+}
+
+void LLFloaterPathfindingConsole::setRenderMaterialVolumes(BOOL pIsRenderMaterialVolumes)
+{
+ mShowMaterialVolumesCheckBox->set(pIsRenderMaterialVolumes);
+}
+
+BOOL LLFloaterPathfindingConsole::isRenderExclusionVolumes() const
+{
+ return mShowExclusionVolumesCheckBox->get();
+}
+
+void LLFloaterPathfindingConsole::setRenderExclusionVolumes(BOOL pIsRenderExclusionVolumes)
+{
+ mShowExclusionVolumesCheckBox->set(pIsRenderExclusionVolumes);
+}
+
+BOOL LLFloaterPathfindingConsole::isRenderWorld() const
+{
+ return mShowWorldCheckBox->get();
+}
+
+void LLFloaterPathfindingConsole::setRenderWorld(BOOL pIsRenderWorld)
+{
+ mShowWorldCheckBox->set(pIsRenderWorld);
+ setWorldRenderState();
+}
+
+BOOL LLFloaterPathfindingConsole::isRenderWorldMovablesOnly() const
+{
+ return (mShowWorldCheckBox->get() && mShowWorldMovablesOnlyCheckBox->get());
+}
+
+void LLFloaterPathfindingConsole::setRenderWorldMovablesOnly(BOOL pIsRenderWorldMovablesOnly)
+{
+ mShowWorldMovablesOnlyCheckBox->set(pIsRenderWorldMovablesOnly);
+}
+
+BOOL LLFloaterPathfindingConsole::isRenderWaterPlane() const
+{
+ return mShowRenderWaterPlaneCheckBox->get();
+}
+
+void LLFloaterPathfindingConsole::setRenderWaterPlane(BOOL pIsRenderWaterPlane)
+{
+ mShowRenderWaterPlaneCheckBox->set(pIsRenderWaterPlane);
+}
+
+BOOL LLFloaterPathfindingConsole::isRenderXRay() const
+{
+ return mShowXRayCheckBox->get();
+}
+
+void LLFloaterPathfindingConsole::setRenderXRay(BOOL pIsRenderXRay)
+{
+ mShowXRayCheckBox->set(pIsRenderXRay);
+}
+
+LLPathingLib::LLPLCharacterType LLFloaterPathfindingConsole::getRenderHeatmapType() const
+{
+ LLPathingLib::LLPLCharacterType renderHeatmapType;
+
+ switch (mShowNavMeshWalkabilityComboBox->getValue().asInteger())
+ {
+ case XUI_RENDER_HEATMAP_NONE :
+ renderHeatmapType = LLPathingLib::LLPL_CHARACTER_TYPE_NONE;
+ break;
+ case XUI_RENDER_HEATMAP_A :
+ renderHeatmapType = LLPathingLib::LLPL_CHARACTER_TYPE_A;
+ break;
+ case XUI_RENDER_HEATMAP_B :
+ renderHeatmapType = LLPathingLib::LLPL_CHARACTER_TYPE_B;
+ break;
+ case XUI_RENDER_HEATMAP_C :
+ renderHeatmapType = LLPathingLib::LLPL_CHARACTER_TYPE_C;
+ break;
+ case XUI_RENDER_HEATMAP_D :
+ renderHeatmapType = LLPathingLib::LLPL_CHARACTER_TYPE_D;
+ break;
+ default :
+ renderHeatmapType = LLPathingLib::LLPL_CHARACTER_TYPE_NONE;
+ llassert(0);
+ break;
+ }
+
+ return renderHeatmapType;
+}
+
+void LLFloaterPathfindingConsole::setRenderHeatmapType(LLPathingLib::LLPLCharacterType pRenderHeatmapType)
+{
+ LLSD comboBoxValue;
+
+ switch (pRenderHeatmapType)
+ {
+ case LLPathingLib::LLPL_CHARACTER_TYPE_NONE :
+ comboBoxValue = XUI_RENDER_HEATMAP_NONE;
+ break;
+ case LLPathingLib::LLPL_CHARACTER_TYPE_A :
+ comboBoxValue = XUI_RENDER_HEATMAP_A;
+ break;
+ case LLPathingLib::LLPL_CHARACTER_TYPE_B :
+ comboBoxValue = XUI_RENDER_HEATMAP_B;
+ break;
+ case LLPathingLib::LLPL_CHARACTER_TYPE_C :
+ comboBoxValue = XUI_RENDER_HEATMAP_C;
+ break;
+ case LLPathingLib::LLPL_CHARACTER_TYPE_D :
+ comboBoxValue = XUI_RENDER_HEATMAP_D;
+ break;
+ default :
+ comboBoxValue = XUI_RENDER_HEATMAP_NONE;
+ llassert(0);
+ break;
+ }
+
+ mShowNavMeshWalkabilityComboBox->setValue(comboBoxValue);
+}
+
+LLFloaterPathfindingConsole::LLFloaterPathfindingConsole(const LLSD& pSeed)
+ : LLFloater(pSeed),
+ mSelfHandle(),
+ mViewTestTabContainer(NULL),
+ mViewTab(NULL),
+ mShowLabel(NULL),
+ mShowWorldCheckBox(NULL),
+ mShowWorldMovablesOnlyCheckBox(NULL),
+ mShowNavMeshCheckBox(NULL),
+ mShowNavMeshWalkabilityLabel(NULL),
+ mShowNavMeshWalkabilityComboBox(NULL),
+ mShowWalkablesCheckBox(NULL),
+ mShowStaticObstaclesCheckBox(NULL),
+ mShowMaterialVolumesCheckBox(NULL),
+ mShowExclusionVolumesCheckBox(NULL),
+ mShowRenderWaterPlaneCheckBox(NULL),
+ mShowXRayCheckBox(NULL),
+ mPathfindingViewerStatus(NULL),
+ mPathfindingSimulatorStatus(NULL),
+ mTestTab(NULL),
+ mCtrlClickLabel(),
+ mShiftClickLabel(),
+ mCharacterWidthLabel(),
+ mCharacterWidthUnitLabel(),
+ mCharacterWidthSlider(NULL),
+ mCharacterTypeLabel(),
+ mCharacterTypeComboBox(NULL),
+ mPathTestingStatus(NULL),
+ mClearPathButton(NULL),
+ mErrorColor(),
+ mWarningColor(),
+ mNavMeshZoneSlot(),
+ mNavMeshZone(),
+ mIsNavMeshUpdating(false),
+ mRegionBoundarySlot(),
+ mTeleportFailedSlot(),
+ mPathEventSlot(),
+ mPathfindingToolset(NULL),
+ mSavedToolset(NULL),
+ mSavedSettingRetrieveNeighborSlot(),
+ mSavedSettingWalkableSlot(),
+ mSavedSettingStaticObstacleSlot(),
+ mSavedSettingMaterialVolumeSlot(),
+ mSavedSettingExclusionVolumeSlot(),
+ mSavedSettingInteriorEdgeSlot(),
+ mSavedSettingExteriorEdgeSlot(),
+ mSavedSettingHeatmapMinSlot(),
+ mSavedSettingHeatmapMaxSlot(),
+ mSavedSettingNavMeshFaceSlot(),
+ mSavedSettingTestPathValidEndSlot(),
+ mSavedSettingTestPathInvalidEndSlot(),
+ mSavedSettingTestPathSlot(),
+ mSavedSettingWaterSlot(),
+ mConsoleState(kConsoleStateUnknown),
+ mRenderableRestoreList()
+{
+ mSelfHandle.bind(this);
+}
+
+LLFloaterPathfindingConsole::~LLFloaterPathfindingConsole()
+{
+}
+
+void LLFloaterPathfindingConsole::onTabSwitch()
+{
+ if (mViewTestTabContainer->getCurrentPanelIndex() == XUI_TEST_TAB_INDEX)
+ {
+ switchIntoTestPathMode();
+ }
+ else
+ {
+ switchOutOfTestPathMode();
+ }
+}
+
+void LLFloaterPathfindingConsole::onShowWorldSet()
+{
+ setWorldRenderState();
+ updateRenderablesObjects();
+}
+
+void LLFloaterPathfindingConsole::onShowWorldMovablesOnlySet()
+{
+ updateRenderablesObjects();
+}
+
+void LLFloaterPathfindingConsole::onShowNavMeshSet()
+{
+ setNavMeshRenderState();
+}
+
+void LLFloaterPathfindingConsole::onShowWalkabilitySet()
+{
+ if (LLPathingLib::getInstance() != NULL)
+ {
+ LLPathingLib::getInstance()->setNavMeshMaterialType(getRenderHeatmapType());
+ }
+}
+
+void LLFloaterPathfindingConsole::onCharacterWidthSet()
+{
+ updateCharacterWidth();
+}
+
+void LLFloaterPathfindingConsole::onCharacterTypeSwitch()
+{
+ updateCharacterType();
+}
+
+void LLFloaterPathfindingConsole::onClearPathClicked()
+{
+ clearPath();
+}
+
+void LLFloaterPathfindingConsole::handleNavMeshZoneStatus(LLPathfindingNavMeshZone::ENavMeshZoneRequestStatus pNavMeshZoneRequestStatus)
+{
+ switch (pNavMeshZoneRequestStatus)
+ {
+ case LLPathfindingNavMeshZone::kNavMeshZoneRequestUnknown :
+ setConsoleState(kConsoleStateUnknown);
+ break;
+ case LLPathfindingNavMeshZone::kNavMeshZoneRequestWaiting :
+ setConsoleState(kConsoleStateRegionLoading);
+ break;
+ case LLPathfindingNavMeshZone::kNavMeshZoneRequestChecking :
+ setConsoleState(kConsoleStateCheckingVersion);
+ break;
+ case LLPathfindingNavMeshZone::kNavMeshZoneRequestNeedsUpdate :
+ mIsNavMeshUpdating = true;
+ mNavMeshZone.refresh();
+ break;
+ case LLPathfindingNavMeshZone::kNavMeshZoneRequestStarted :
+ setConsoleState(kConsoleStateDownloading);
+ break;
+ case LLPathfindingNavMeshZone::kNavMeshZoneRequestCompleted :
+ mIsNavMeshUpdating = false;
+ setConsoleState(kConsoleStateHasNavMesh);
+ break;
+ case LLPathfindingNavMeshZone::kNavMeshZoneRequestNotEnabled :
+ setConsoleState(kConsoleStateRegionNotEnabled);
+ break;
+ case LLPathfindingNavMeshZone::kNavMeshZoneRequestError :
+ setConsoleState(kConsoleStateError);
+ break;
+ default:
+ setConsoleState(kConsoleStateUnknown);
+ llassert(0);
+ break;
+ }
+}
+
+void LLFloaterPathfindingConsole::onRegionBoundaryCross()
+{
+ initializeNavMeshZoneForCurrentRegion();
+ setRenderWorld(TRUE);
+ setRenderWorldMovablesOnly(FALSE);
+}
+
+void LLFloaterPathfindingConsole::onPathEvent()
+{
+ const LLPathfindingPathTool *pathToolInstance = LLPathfindingPathTool::getInstance();
+
+ mCharacterWidthSlider->setValue(LLSD(pathToolInstance->getCharacterWidth()));
+
+ LLSD characterType;
+ switch (pathToolInstance->getCharacterType())
+ {
+ case LLPathfindingPathTool::kCharacterTypeNone :
+ characterType = XUI_CHARACTER_TYPE_NONE;
+ break;
+ case LLPathfindingPathTool::kCharacterTypeA :
+ characterType = XUI_CHARACTER_TYPE_A;
+ break;
+ case LLPathfindingPathTool::kCharacterTypeB :
+ characterType = XUI_CHARACTER_TYPE_B;
+ break;
+ case LLPathfindingPathTool::kCharacterTypeC :
+ characterType = XUI_CHARACTER_TYPE_C;
+ break;
+ case LLPathfindingPathTool::kCharacterTypeD :
+ characterType = XUI_CHARACTER_TYPE_D;
+ break;
+ default :
+ characterType = XUI_CHARACTER_TYPE_NONE;
+ llassert(0);
+ break;
+ }
+ mCharacterTypeComboBox->setValue(characterType);
+
+ updatePathTestStatus();
+}
+
+void LLFloaterPathfindingConsole::setDefaultInputs()
+{
+ mViewTestTabContainer->selectTab(XUI_VIEW_TAB_INDEX);
+ setRenderWorld(TRUE);
+ setRenderWorldMovablesOnly(FALSE);
+ setRenderNavMesh(FALSE);
+ setRenderWalkables(FALSE);
+ setRenderMaterialVolumes(FALSE);
+ setRenderStaticObstacles(FALSE);
+ setRenderExclusionVolumes(FALSE);
+ setRenderWaterPlane(FALSE);
+ setRenderXRay(FALSE);
+}
+
+void LLFloaterPathfindingConsole::setConsoleState(EConsoleState pConsoleState)
+{
+ mConsoleState = pConsoleState;
+ updateControlsOnConsoleState();
+ updateViewerStatusOnConsoleState();
+ updateSimulatorStatusOnConsoleState();
+}
+
+void LLFloaterPathfindingConsole::setWorldRenderState()
+{
+ BOOL renderWorld = isRenderWorld();
+
+ mShowWorldMovablesOnlyCheckBox->setEnabled(renderWorld && mShowWorldCheckBox->getEnabled());
+ if (!renderWorld)
+ {
+ mShowWorldMovablesOnlyCheckBox->set(FALSE);
+ }
+}
+
+void LLFloaterPathfindingConsole::setNavMeshRenderState()
+{
+ BOOL renderNavMesh = isRenderNavMesh();
+
+ mShowNavMeshWalkabilityLabel->setEnabled(renderNavMesh);
+ mShowNavMeshWalkabilityComboBox->setEnabled(renderNavMesh);
+}
+
+void LLFloaterPathfindingConsole::updateRenderablesObjects()
+{
+ if ( isRenderWorldMovablesOnly() )
+ {
+ gPipeline.hidePermanentObjects( mRenderableRestoreList );
+ }
+ else
+ {
+ cleanupRenderableRestoreItems();
+ }
+}
+
+void LLFloaterPathfindingConsole::updateControlsOnConsoleState()
+{
+ switch (mConsoleState)
+ {
+ case kConsoleStateUnknown :
+ case kConsoleStateRegionNotEnabled :
+ case kConsoleStateRegionLoading :
+ mViewTestTabContainer->selectTab(XUI_VIEW_TAB_INDEX);
+ mViewTab->setEnabled(FALSE);
+ mShowLabel->setEnabled(FALSE);
+ mShowWorldCheckBox->setEnabled(FALSE);
+ mShowWorldMovablesOnlyCheckBox->setEnabled(FALSE);
+ mShowNavMeshCheckBox->setEnabled(FALSE);
+ mShowNavMeshWalkabilityLabel->setEnabled(FALSE);
+ mShowNavMeshWalkabilityComboBox->setEnabled(FALSE);
+ mShowWalkablesCheckBox->setEnabled(FALSE);
+ mShowStaticObstaclesCheckBox->setEnabled(FALSE);
+ mShowMaterialVolumesCheckBox->setEnabled(FALSE);
+ mShowExclusionVolumesCheckBox->setEnabled(FALSE);
+ mShowRenderWaterPlaneCheckBox->setEnabled(FALSE);
+ mShowXRayCheckBox->setEnabled(FALSE);
+ mTestTab->setEnabled(FALSE);
+ mCtrlClickLabel->setEnabled(FALSE);
+ mShiftClickLabel->setEnabled(FALSE);
+ mCharacterWidthLabel->setEnabled(FALSE);
+ mCharacterWidthUnitLabel->setEnabled(FALSE);
+ mCharacterWidthSlider->setEnabled(FALSE);
+ mCharacterTypeLabel->setEnabled(FALSE);
+ mCharacterTypeComboBox->setEnabled(FALSE);
+ mClearPathButton->setEnabled(FALSE);
+ clearPath();
+ break;
+ case kConsoleStateLibraryNotImplemented :
+ mViewTestTabContainer->selectTab(XUI_VIEW_TAB_INDEX);
+ mViewTab->setEnabled(FALSE);
+ mShowLabel->setEnabled(FALSE);
+ mShowWorldCheckBox->setEnabled(FALSE);
+ mShowWorldMovablesOnlyCheckBox->setEnabled(FALSE);
+ mShowNavMeshCheckBox->setEnabled(FALSE);
+ mShowNavMeshWalkabilityLabel->setEnabled(FALSE);
+ mShowNavMeshWalkabilityComboBox->setEnabled(FALSE);
+ mShowWalkablesCheckBox->setEnabled(FALSE);
+ mShowStaticObstaclesCheckBox->setEnabled(FALSE);
+ mShowMaterialVolumesCheckBox->setEnabled(FALSE);
+ mShowExclusionVolumesCheckBox->setEnabled(FALSE);
+ mShowRenderWaterPlaneCheckBox->setEnabled(FALSE);
+ mShowXRayCheckBox->setEnabled(FALSE);
+ mTestTab->setEnabled(FALSE);
+ mCtrlClickLabel->setEnabled(FALSE);
+ mShiftClickLabel->setEnabled(FALSE);
+ mCharacterWidthLabel->setEnabled(FALSE);
+ mCharacterWidthUnitLabel->setEnabled(FALSE);
+ mCharacterWidthSlider->setEnabled(FALSE);
+ mCharacterTypeLabel->setEnabled(FALSE);
+ mCharacterTypeComboBox->setEnabled(FALSE);
+ mClearPathButton->setEnabled(FALSE);
+ clearPath();
+ break;
+ case kConsoleStateCheckingVersion :
+ case kConsoleStateDownloading :
+ case kConsoleStateError :
+ mViewTestTabContainer->selectTab(XUI_VIEW_TAB_INDEX);
+ mViewTab->setEnabled(FALSE);
+ mShowLabel->setEnabled(FALSE);
+ mShowWorldCheckBox->setEnabled(FALSE);
+ mShowWorldMovablesOnlyCheckBox->setEnabled(FALSE);
+ mShowNavMeshCheckBox->setEnabled(FALSE);
+ mShowNavMeshWalkabilityLabel->setEnabled(FALSE);
+ mShowNavMeshWalkabilityComboBox->setEnabled(FALSE);
+ mShowWalkablesCheckBox->setEnabled(FALSE);
+ mShowStaticObstaclesCheckBox->setEnabled(FALSE);
+ mShowMaterialVolumesCheckBox->setEnabled(FALSE);
+ mShowExclusionVolumesCheckBox->setEnabled(FALSE);
+ mShowRenderWaterPlaneCheckBox->setEnabled(FALSE);
+ mShowXRayCheckBox->setEnabled(FALSE);
+ mTestTab->setEnabled(FALSE);
+ mCtrlClickLabel->setEnabled(FALSE);
+ mShiftClickLabel->setEnabled(FALSE);
+ mCharacterWidthLabel->setEnabled(FALSE);
+ mCharacterWidthUnitLabel->setEnabled(FALSE);
+ mCharacterWidthSlider->setEnabled(FALSE);
+ mCharacterTypeLabel->setEnabled(FALSE);
+ mCharacterTypeComboBox->setEnabled(FALSE);
+ mClearPathButton->setEnabled(FALSE);
+ clearPath();
+ break;
+ case kConsoleStateHasNavMesh :
+ mViewTab->setEnabled(TRUE);
+ mShowLabel->setEnabled(TRUE);
+ mShowWorldCheckBox->setEnabled(TRUE);
+ setWorldRenderState();
+ mShowNavMeshCheckBox->setEnabled(TRUE);
+ setNavMeshRenderState();
+ mShowWalkablesCheckBox->setEnabled(TRUE);
+ mShowStaticObstaclesCheckBox->setEnabled(TRUE);
+ mShowMaterialVolumesCheckBox->setEnabled(TRUE);
+ mShowExclusionVolumesCheckBox->setEnabled(TRUE);
+ mShowRenderWaterPlaneCheckBox->setEnabled(TRUE);
+ mShowXRayCheckBox->setEnabled(TRUE);
+ mTestTab->setEnabled(TRUE);
+ mCtrlClickLabel->setEnabled(TRUE);
+ mShiftClickLabel->setEnabled(TRUE);
+ mCharacterWidthLabel->setEnabled(TRUE);
+ mCharacterWidthUnitLabel->setEnabled(TRUE);
+ mCharacterWidthSlider->setEnabled(TRUE);
+ mCharacterTypeLabel->setEnabled(TRUE);
+ mCharacterTypeComboBox->setEnabled(TRUE);
+ mClearPathButton->setEnabled(TRUE);
+ break;
+ default :
+ llassert(0);
+ break;
+ }
+}
+
+void LLFloaterPathfindingConsole::updateViewerStatusOnConsoleState()
+{
+ std::string viewerStatusText("");
+ LLStyle::Params viewerStyleParams;
+
+ switch (mConsoleState)
+ {
+ case kConsoleStateUnknown :
+ viewerStatusText = getString("navmesh_viewer_status_unknown");
+ viewerStyleParams.color = mErrorColor;
+ break;
+ case kConsoleStateLibraryNotImplemented :
+ viewerStatusText = getString("navmesh_viewer_status_library_not_implemented");
+ viewerStyleParams.color = mErrorColor;
+ break;
+ case kConsoleStateRegionNotEnabled :
+ viewerStatusText = getString("navmesh_viewer_status_region_not_enabled");
+ viewerStyleParams.color = mErrorColor;
+ break;
+ case kConsoleStateRegionLoading :
+ viewerStatusText = getString("navmesh_viewer_status_region_loading");
+ viewerStyleParams.color = mWarningColor;
+ break;
+ case kConsoleStateCheckingVersion :
+ viewerStatusText = getString("navmesh_viewer_status_checking_version");
+ viewerStyleParams.color = mWarningColor;
+ break;
+ case kConsoleStateDownloading :
+ if (mIsNavMeshUpdating)
+ {
+ viewerStatusText = getString("navmesh_viewer_status_updating");
+ }
+ else
+ {
+ viewerStatusText = getString("navmesh_viewer_status_downloading");
+ }
+ viewerStyleParams.color = mWarningColor;
+ break;
+ case kConsoleStateHasNavMesh :
+ viewerStatusText = getString("navmesh_viewer_status_has_navmesh");
+ break;
+ case kConsoleStateError :
+ viewerStatusText = getString("navmesh_viewer_status_error");
+ viewerStyleParams.color = mErrorColor;
+ break;
+ default :
+ viewerStatusText = getString("navmesh_viewer_status_unknown");
+ viewerStyleParams.color = mErrorColor;
+ llassert(0);
+ break;
+ }
+
+ mPathfindingViewerStatus->setText((LLStringExplicit)viewerStatusText, viewerStyleParams);
+}
+
+void LLFloaterPathfindingConsole::updateSimulatorStatusOnConsoleState()
+{
+ std::string simulatorStatusText("");
+ LLStyle::Params simulatorStyleParams;
+
+ switch (mConsoleState)
+ {
+ case kConsoleStateUnknown :
+ case kConsoleStateLibraryNotImplemented :
+ case kConsoleStateRegionNotEnabled :
+ case kConsoleStateRegionLoading :
+ case kConsoleStateCheckingVersion :
+ case kConsoleStateError :
+ simulatorStatusText = getString("navmesh_simulator_status_unknown");
+ simulatorStyleParams.color = mErrorColor;
+ break;
+ case kConsoleStateDownloading :
+ case kConsoleStateHasNavMesh :
+ switch (mNavMeshZone.getNavMeshZoneStatus())
+ {
+ case LLPathfindingNavMeshZone::kNavMeshZonePending :
+ simulatorStatusText = getString("navmesh_simulator_status_pending");
+ simulatorStyleParams.color = mWarningColor;
+ break;
+ case LLPathfindingNavMeshZone::kNavMeshZoneBuilding :
+ simulatorStatusText = getString("navmesh_simulator_status_building");
+ simulatorStyleParams.color = mWarningColor;
+ break;
+ case LLPathfindingNavMeshZone::kNavMeshZoneSomePending :
+ simulatorStatusText = getString("navmesh_simulator_status_some_pending");
+ simulatorStyleParams.color = mWarningColor;
+ break;
+ case LLPathfindingNavMeshZone::kNavMeshZoneSomeBuilding :
+ simulatorStatusText = getString("navmesh_simulator_status_some_building");
+ simulatorStyleParams.color = mWarningColor;
+ break;
+ case LLPathfindingNavMeshZone::kNavMeshZonePendingAndBuilding :
+ simulatorStatusText = getString("navmesh_simulator_status_pending_and_building");
+ simulatorStyleParams.color = mWarningColor;
+ break;
+ case LLPathfindingNavMeshZone::kNavMeshZoneComplete :
+ simulatorStatusText = getString("navmesh_simulator_status_complete");
+ break;
+ default :
+ simulatorStatusText = getString("navmesh_simulator_status_unknown");
+ simulatorStyleParams.color = mErrorColor;
+ break;
+ }
+ break;
+ default :
+ simulatorStatusText = getString("navmesh_simulator_status_unknown");
+ simulatorStyleParams.color = mErrorColor;
+ llassert(0);
+ break;
+ }
+
+ mPathfindingSimulatorStatus->setText((LLStringExplicit)simulatorStatusText, simulatorStyleParams);
+}
+
+void LLFloaterPathfindingConsole::initializeNavMeshZoneForCurrentRegion()
+{
+ mNavMeshZone.disable();
+ mNavMeshZone.initialize();
+ mNavMeshZone.enable();
+ mNavMeshZone.refresh();
+ cleanupRenderableRestoreItems();
+}
+
+void LLFloaterPathfindingConsole::cleanupRenderableRestoreItems()
+{
+ if ( !mRenderableRestoreList.empty() )
+ {
+ gPipeline.restorePermanentObjects( mRenderableRestoreList );
+ mRenderableRestoreList.clear();
+ }
+ else
+ {
+ gPipeline.skipRenderingOfTerrain( false );
+ }
+}
+
+void LLFloaterPathfindingConsole::switchIntoTestPathMode()
+{
+ if (LLPathingLib::getInstance() != NULL)
+ {
+ llassert(mPathfindingToolset != NULL);
+ LLToolMgr *toolMgrInstance = LLToolMgr::getInstance();
+ if (toolMgrInstance->getCurrentToolset() != mPathfindingToolset)
+ {
+ mSavedToolset = toolMgrInstance->getCurrentToolset();
+ toolMgrInstance->setCurrentToolset(mPathfindingToolset);
+ }
+ }
+}
+
+void LLFloaterPathfindingConsole::switchOutOfTestPathMode()
+{
+ if (LLPathingLib::getInstance() != NULL)
+ {
+ llassert(mPathfindingToolset != NULL);
+ LLToolMgr *toolMgrInstance = LLToolMgr::getInstance();
+ if (toolMgrInstance->getCurrentToolset() == mPathfindingToolset)
+ {
+ toolMgrInstance->setCurrentToolset(mSavedToolset);
+ mSavedToolset = NULL;
+ }
+ }
+}
+
+void LLFloaterPathfindingConsole::updateCharacterWidth()
+{
+ LLPathfindingPathTool::getInstance()->setCharacterWidth(mCharacterWidthSlider->getValueF32());
+}
+
+void LLFloaterPathfindingConsole::updateCharacterType()
+{
+ LLPathfindingPathTool::ECharacterType characterType;
+
+ switch (mCharacterTypeComboBox->getValue().asInteger())
+ {
+ case XUI_CHARACTER_TYPE_NONE :
+ characterType = LLPathfindingPathTool::kCharacterTypeNone;
+ break;
+ case XUI_CHARACTER_TYPE_A :
+ characterType = LLPathfindingPathTool::kCharacterTypeA;
+ break;
+ case XUI_CHARACTER_TYPE_B :
+ characterType = LLPathfindingPathTool::kCharacterTypeB;
+ break;
+ case XUI_CHARACTER_TYPE_C :
+ characterType = LLPathfindingPathTool::kCharacterTypeC;
+ break;
+ case XUI_CHARACTER_TYPE_D :
+ characterType = LLPathfindingPathTool::kCharacterTypeD;
+ break;
+ default :
+ characterType = LLPathfindingPathTool::kCharacterTypeNone;
+ llassert(0);
+ break;
+ }
+
+ LLPathfindingPathTool::getInstance()->setCharacterType(characterType);
+}
+
+void LLFloaterPathfindingConsole::clearPath()
+{
+ LLPathfindingPathTool::getInstance()->clearPath();
+}
+
+void LLFloaterPathfindingConsole::updatePathTestStatus()
+{
+ std::string statusText("");
+ LLStyle::Params styleParams;
+
+ switch (LLPathfindingPathTool::getInstance()->getPathStatus())
+ {
+ case LLPathfindingPathTool::kPathStatusUnknown :
+ statusText = getString("pathing_unknown");
+ styleParams.color = mErrorColor;
+ break;
+ case LLPathfindingPathTool::kPathStatusChooseStartAndEndPoints :
+ statusText = getString("pathing_choose_start_and_end_points");
+ styleParams.color = mWarningColor;
+ break;
+ case LLPathfindingPathTool::kPathStatusChooseStartPoint :
+ statusText = getString("pathing_choose_start_point");
+ styleParams.color = mWarningColor;
+ break;
+ case LLPathfindingPathTool::kPathStatusChooseEndPoint :
+ statusText = getString("pathing_choose_end_point");
+ styleParams.color = mWarningColor;
+ break;
+ case LLPathfindingPathTool::kPathStatusHasValidPath :
+ statusText = getString("pathing_path_valid");
+ break;
+ case LLPathfindingPathTool::kPathStatusHasInvalidPath :
+ statusText = getString("pathing_path_invalid");
+ styleParams.color = mErrorColor;
+ break;
+ case LLPathfindingPathTool::kPathStatusNotEnabled :
+ statusText = getString("pathing_region_not_enabled");
+ styleParams.color = mErrorColor;
+ break;
+ case LLPathfindingPathTool::kPathStatusNotImplemented :
+ statusText = getString("pathing_library_not_implemented");
+ styleParams.color = mErrorColor;
+ break;
+ case LLPathfindingPathTool::kPathStatusError :
+ statusText = getString("pathing_error");
+ styleParams.color = mErrorColor;
+ break;
+ default :
+ statusText = getString("pathing_unknown");
+ styleParams.color = mErrorColor;
+ break;
+ }
+
+ mPathTestingStatus->setText((LLStringExplicit)statusText, styleParams);
+}
+
+
+BOOL LLFloaterPathfindingConsole::isRenderAnyShapes() const
+{
+ return (isRenderWalkables() || isRenderStaticObstacles() ||
+ isRenderMaterialVolumes() || isRenderExclusionVolumes());
+}
+
+U32 LLFloaterPathfindingConsole::getRenderShapeFlags()
+{
+ U32 shapeRenderFlag = 0U;
+
+ if (isRenderWalkables())
+ {
+ SET_SHAPE_RENDER_FLAG(shapeRenderFlag, LLPathingLib::LLST_WalkableObjects);
+ }
+ if (isRenderStaticObstacles())
+ {
+ SET_SHAPE_RENDER_FLAG(shapeRenderFlag, LLPathingLib::LLST_ObstacleObjects);
+ }
+ if (isRenderMaterialVolumes())
+ {
+ SET_SHAPE_RENDER_FLAG(shapeRenderFlag, LLPathingLib::LLST_MaterialPhantoms);
+ }
+ if (isRenderExclusionVolumes())
+ {
+ SET_SHAPE_RENDER_FLAG(shapeRenderFlag, LLPathingLib::LLST_ExclusionPhantoms);
+ }
+
+ return shapeRenderFlag;
+}
+
+void LLFloaterPathfindingConsole::registerSavedSettingsListeners()
+{
+ if (!mSavedSettingRetrieveNeighborSlot.connected())
+ {
+ mSavedSettingRetrieveNeighborSlot = gSavedSettings.getControl(CONTROL_NAME_RETRIEVE_NEIGHBOR)->getSignal()->connect(boost::bind(&LLFloaterPathfindingConsole::handleRetrieveNeighborChange, this, _1, _2));
+ }
+ if (!mSavedSettingWalkableSlot.connected())
+ {
+ mSavedSettingWalkableSlot = gSavedSettings.getControl(CONTROL_NAME_WALKABLE_OBJECTS)->getSignal()->connect(boost::bind(&LLFloaterPathfindingConsole::handleNavMeshColorChange, this, _1, _2));
+ }
+ if (!mSavedSettingStaticObstacleSlot.connected())
+ {
+ mSavedSettingStaticObstacleSlot = gSavedSettings.getControl(CONTROL_NAME_STATIC_OBSTACLE_OBJECTS)->getSignal()->connect(boost::bind(&LLFloaterPathfindingConsole::handleNavMeshColorChange, this, _1, _2));
+ }
+ if (!mSavedSettingMaterialVolumeSlot.connected())
+ {
+ mSavedSettingMaterialVolumeSlot = gSavedSettings.getControl(CONTROL_NAME_MATERIAL_VOLUMES)->getSignal()->connect(boost::bind(&LLFloaterPathfindingConsole::handleNavMeshColorChange, this, _1, _2));
+ }
+ if (!mSavedSettingExclusionVolumeSlot.connected())
+ {
+ mSavedSettingExclusionVolumeSlot = gSavedSettings.getControl(CONTROL_NAME_EXCLUSION_VOLUMES)->getSignal()->connect(boost::bind(&LLFloaterPathfindingConsole::handleNavMeshColorChange, this, _1, _2));
+ }
+ if (!mSavedSettingInteriorEdgeSlot.connected())
+ {
+ mSavedSettingInteriorEdgeSlot = gSavedSettings.getControl(CONTROL_NAME_INTERIOR_EDGE)->getSignal()->connect(boost::bind(&LLFloaterPathfindingConsole::handleNavMeshColorChange, this, _1, _2));
+ }
+ if (!mSavedSettingExteriorEdgeSlot.connected())
+ {
+ mSavedSettingExteriorEdgeSlot = gSavedSettings.getControl(CONTROL_NAME_EXTERIOR_EDGE)->getSignal()->connect(boost::bind(&LLFloaterPathfindingConsole::handleNavMeshColorChange, this, _1, _2));
+ }
+ if (!mSavedSettingHeatmapMinSlot.connected())
+ {
+ mSavedSettingHeatmapMinSlot = gSavedSettings.getControl(CONTROL_NAME_HEATMAP_MIN)->getSignal()->connect(boost::bind(&LLFloaterPathfindingConsole::handleNavMeshColorChange, this, _1, _2));
+ }
+ if (!mSavedSettingHeatmapMaxSlot.connected())
+ {
+ mSavedSettingHeatmapMaxSlot = gSavedSettings.getControl(CONTROL_NAME_HEATMAP_MAX)->getSignal()->connect(boost::bind(&LLFloaterPathfindingConsole::handleNavMeshColorChange, this, _1, _2));
+ }
+ if (!mSavedSettingNavMeshFaceSlot.connected())
+ {
+ mSavedSettingNavMeshFaceSlot = gSavedSettings.getControl(CONTROL_NAME_NAVMESH_FACE)->getSignal()->connect(boost::bind(&LLFloaterPathfindingConsole::handleNavMeshColorChange, this, _1, _2));
+ }
+ if (!mSavedSettingTestPathValidEndSlot.connected())
+ {
+ mSavedSettingTestPathValidEndSlot = gSavedSettings.getControl(CONTROL_NAME_TEST_PATH_VALID_END)->getSignal()->connect(boost::bind(&LLFloaterPathfindingConsole::handleNavMeshColorChange, this, _1, _2));
+ }
+ if (!mSavedSettingTestPathInvalidEndSlot.connected())
+ {
+ mSavedSettingTestPathInvalidEndSlot = gSavedSettings.getControl(CONTROL_NAME_TEST_PATH_INVALID_END)->getSignal()->connect(boost::bind(&LLFloaterPathfindingConsole::handleNavMeshColorChange, this, _1, _2));
+ }
+ if (!mSavedSettingTestPathSlot.connected())
+ {
+ mSavedSettingTestPathSlot = gSavedSettings.getControl(CONTROL_NAME_TEST_PATH)->getSignal()->connect(boost::bind(&LLFloaterPathfindingConsole::handleNavMeshColorChange, this, _1, _2));
+ }
+ if (!mSavedSettingWaterSlot.connected())
+ {
+ mSavedSettingWaterSlot = gSavedSettings.getControl(CONTROL_NAME_WATER)->getSignal()->connect(boost::bind(&LLFloaterPathfindingConsole::handleNavMeshColorChange, this, _1, _2));
+ }
+}
+
+void LLFloaterPathfindingConsole::deregisterSavedSettingsListeners()
+{
+ if (mSavedSettingRetrieveNeighborSlot.connected())
+ {
+ mSavedSettingRetrieveNeighborSlot.disconnect();
+ }
+ if (mSavedSettingWalkableSlot.connected())
+ {
+ mSavedSettingWalkableSlot.disconnect();
+ }
+ if (mSavedSettingStaticObstacleSlot.connected())
+ {
+ mSavedSettingStaticObstacleSlot.disconnect();
+ }
+ if (mSavedSettingMaterialVolumeSlot.connected())
+ {
+ mSavedSettingMaterialVolumeSlot.disconnect();
+ }
+ if (mSavedSettingExclusionVolumeSlot.connected())
+ {
+ mSavedSettingExclusionVolumeSlot.disconnect();
+ }
+ if (mSavedSettingInteriorEdgeSlot.connected())
+ {
+ mSavedSettingInteriorEdgeSlot.disconnect();
+ }
+ if (mSavedSettingExteriorEdgeSlot.connected())
+ {
+ mSavedSettingExteriorEdgeSlot.disconnect();
+ }
+ if (mSavedSettingHeatmapMinSlot.connected())
+ {
+ mSavedSettingHeatmapMinSlot.disconnect();
+ }
+ if (mSavedSettingHeatmapMaxSlot.connected())
+ {
+ mSavedSettingHeatmapMaxSlot.disconnect();
+ }
+ if (mSavedSettingNavMeshFaceSlot.connected())
+ {
+ mSavedSettingNavMeshFaceSlot.disconnect();
+ }
+ if (mSavedSettingTestPathValidEndSlot.connected())
+ {
+ mSavedSettingTestPathValidEndSlot.disconnect();
+ }
+ if (mSavedSettingTestPathInvalidEndSlot.connected())
+ {
+ mSavedSettingTestPathInvalidEndSlot.disconnect();
+ }
+ if (mSavedSettingTestPathSlot.connected())
+ {
+ mSavedSettingTestPathSlot.disconnect();
+ }
+ if (mSavedSettingWaterSlot.connected())
+ {
+ mSavedSettingWaterSlot.disconnect();
+ }
+}
+
+void LLFloaterPathfindingConsole::handleRetrieveNeighborChange(LLControlVariable *pControl, const LLSD &pNewValue)
+{
+ initializeNavMeshZoneForCurrentRegion();
+}
+
+void LLFloaterPathfindingConsole::handleNavMeshColorChange(LLControlVariable *pControl, const LLSD &pNewValue)
+{
+ fillInColorsForNavMeshVisualization();
+}
+
+void LLFloaterPathfindingConsole::fillInColorsForNavMeshVisualization()
+{
+ if (LLPathingLib::getInstance() != NULL)
+ {
+ LLPathingLib::NavMeshColors navMeshColors;
+
+ LLColor4 in = gSavedSettings.getColor4(CONTROL_NAME_WALKABLE_OBJECTS);
+ navMeshColors.mWalkable= LLColor4U(in);
+
+ in = gSavedSettings.getColor4(CONTROL_NAME_STATIC_OBSTACLE_OBJECTS);
+ navMeshColors.mObstacle= LLColor4U(in);
+
+ in = gSavedSettings.getColor4(CONTROL_NAME_MATERIAL_VOLUMES);
+ navMeshColors.mMaterial= LLColor4U(in);
+
+ in = gSavedSettings.getColor4(CONTROL_NAME_EXCLUSION_VOLUMES);
+ navMeshColors.mExclusion= LLColor4U(in);
+
+ in = gSavedSettings.getColor4(CONTROL_NAME_INTERIOR_EDGE);
+ navMeshColors.mConnectedEdge= LLColor4U(in);
+
+ in = gSavedSettings.getColor4(CONTROL_NAME_EXTERIOR_EDGE);
+ navMeshColors.mBoundaryEdge= LLColor4U(in);
+
+ navMeshColors.mHeatColorBase = gSavedSettings.getColor4(CONTROL_NAME_HEATMAP_MIN);
+
+ navMeshColors.mHeatColorMax = gSavedSettings.getColor4(CONTROL_NAME_HEATMAP_MAX);
+
+ in = gSavedSettings.getColor4(CONTROL_NAME_NAVMESH_FACE);
+ navMeshColors.mFaceColor= LLColor4U(in);
+
+ in = gSavedSettings.getColor4(CONTROL_NAME_TEST_PATH_VALID_END);
+ navMeshColors.mStarValid= LLColor4U(in);
+
+ in = gSavedSettings.getColor4(CONTROL_NAME_TEST_PATH_INVALID_END);
+ navMeshColors.mStarInvalid= LLColor4U(in);
+
+ in = gSavedSettings.getColor4(CONTROL_NAME_TEST_PATH);
+ navMeshColors.mTestPath= LLColor4U(in);
+
+ in = gSavedSettings.getColor4(CONTROL_NAME_WATER);
+ navMeshColors.mWaterColor= LLColor4U(in);
+
+ LLPathingLib::getInstance()->setNavMeshColors(navMeshColors);
+ }
+}
diff --git a/indra/newview/llfloaterpathfindingconsole.h b/indra/newview/llfloaterpathfindingconsole.h
new file mode 100644
index 0000000000..e999e57741
--- /dev/null
+++ b/indra/newview/llfloaterpathfindingconsole.h
@@ -0,0 +1,220 @@
+/**
+* @file llfloaterpathfindingconsole.h
+* @brief "Pathfinding console" floater, allowing for viewing and testing of the pathfinding navmesh through Havok AI utilities.
+* @author Stinson@lindenlab.com
+*
+* $LicenseInfo:firstyear=2012&license=viewerlgpl$
+* Second Life Viewer Source Code
+* Copyright (C) 2012, Linden Research, Inc.
+*
+* This library is free software; you can redistribute it and/or
+* modify it under the terms of the GNU Lesser General Public
+* License as published by the Free Software Foundation;
+* version 2.1 of the License only.
+*
+* This library is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this library; if not, write to the Free Software
+* 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_LLFLOATERPATHFINDINGCONSOLE_H
+#define LL_LLFLOATERPATHFINDINGCONSOLE_H
+
+#include <vector>
+
+#include <boost/signals2.hpp>
+
+#include "llfloater.h"
+#include "llhandle.h"
+#include "llpathfindingnavmeshzone.h"
+#include "llpathfindingpathtool.h"
+#include "llpathinglib.h"
+#include "v4color.h"
+
+class LLButton;
+class LLCheckBoxCtrl;
+class LLComboBox;
+class LLControlVariable;
+class LLPanel;
+class LLSD;
+class LLSliderCtrl;
+class LLTabContainer;
+class LLTextBase;
+class LLToolset;
+
+class LLFloaterPathfindingConsole
+: public LLFloater
+{
+ friend class LLFloaterReg;
+
+public:
+ virtual BOOL postBuild();
+ virtual void onOpen(const LLSD& pKey);
+ virtual void onClose(bool pIsAppQuitting);
+
+ static LLHandle<LLFloaterPathfindingConsole> getInstanceHandle();
+
+ BOOL isRenderNavMesh() const;
+ void setRenderNavMesh(BOOL pIsRenderNavMesh);
+
+ BOOL isRenderWalkables() const;
+ void setRenderWalkables(BOOL pIsRenderWalkables);
+
+ BOOL isRenderStaticObstacles() const;
+ void setRenderStaticObstacles(BOOL pIsRenderStaticObstacles);
+
+ BOOL isRenderMaterialVolumes() const;
+ void setRenderMaterialVolumes(BOOL pIsRenderMaterialVolumes);
+
+ BOOL isRenderExclusionVolumes() const;
+ void setRenderExclusionVolumes(BOOL pIsRenderExclusionVolumes);
+
+ BOOL isRenderWorld() const;
+ void setRenderWorld(BOOL pIsRenderWorld);
+
+ BOOL isRenderWorldMovablesOnly() const;
+ void setRenderWorldMovablesOnly(BOOL pIsRenderWorldMovablesOnly);
+
+ BOOL isRenderWaterPlane() const;
+ void setRenderWaterPlane(BOOL pIsRenderWaterPlane);
+
+ BOOL isRenderXRay() const;
+ void setRenderXRay(BOOL pIsRenderXRay);
+
+ BOOL isRenderAnyShapes() const;
+ U32 getRenderShapeFlags();
+
+ LLPathingLib::LLPLCharacterType getRenderHeatmapType() const;
+ void setRenderHeatmapType(LLPathingLib::LLPLCharacterType pRenderHeatmapType);
+ void onRegionBoundaryCross();
+protected:
+
+private:
+ typedef enum
+ {
+ kConsoleStateUnknown,
+ kConsoleStateLibraryNotImplemented,
+ kConsoleStateRegionNotEnabled,
+ kConsoleStateRegionLoading,
+ kConsoleStateCheckingVersion,
+ kConsoleStateDownloading,
+ kConsoleStateHasNavMesh,
+ kConsoleStateError
+ } EConsoleState;
+
+ // Does its own instance management, so clients not allowed
+ // to allocate or destroy.
+ LLFloaterPathfindingConsole(const LLSD& pSeed);
+ virtual ~LLFloaterPathfindingConsole();
+
+ void onTabSwitch();
+ void onShowWorldSet();
+ void onShowWorldMovablesOnlySet();
+ void onShowNavMeshSet();
+ void onShowWalkabilitySet();
+ void onCharacterWidthSet();
+ void onCharacterTypeSwitch();
+ void onClearPathClicked();
+
+ void handleNavMeshZoneStatus(LLPathfindingNavMeshZone::ENavMeshZoneRequestStatus pNavMeshZoneRequestStatus);
+
+ void onPathEvent();
+
+ void setDefaultInputs();
+ void setConsoleState(EConsoleState pConsoleState);
+ void setWorldRenderState();
+ void setNavMeshRenderState();
+ void updateRenderablesObjects();
+
+ void updateControlsOnConsoleState();
+ void updateViewerStatusOnConsoleState();
+ void updateSimulatorStatusOnConsoleState();
+
+ void initializeNavMeshZoneForCurrentRegion();
+
+ void switchIntoTestPathMode();
+ void switchOutOfTestPathMode();
+ void updateCharacterWidth();
+ void updateCharacterType();
+ void clearPath();
+ void updatePathTestStatus();
+
+ void registerSavedSettingsListeners();
+ void deregisterSavedSettingsListeners();
+ void handleRetrieveNeighborChange(LLControlVariable *pControl, const LLSD &pNewValue);
+ void handleNavMeshColorChange(LLControlVariable *pControl, const LLSD &pNewValue);
+ void fillInColorsForNavMeshVisualization();
+ void cleanupRenderableRestoreItems();
+
+ LLRootHandle<LLFloaterPathfindingConsole> mSelfHandle;
+ LLTabContainer *mViewTestTabContainer;
+ LLPanel *mViewTab;
+ LLTextBase *mShowLabel;
+ LLCheckBoxCtrl *mShowWorldCheckBox;
+ LLCheckBoxCtrl *mShowWorldMovablesOnlyCheckBox;
+ LLCheckBoxCtrl *mShowNavMeshCheckBox;
+ LLTextBase *mShowNavMeshWalkabilityLabel;
+ LLComboBox *mShowNavMeshWalkabilityComboBox;
+ LLCheckBoxCtrl *mShowWalkablesCheckBox;
+ LLCheckBoxCtrl *mShowStaticObstaclesCheckBox;
+ LLCheckBoxCtrl *mShowMaterialVolumesCheckBox;
+ LLCheckBoxCtrl *mShowExclusionVolumesCheckBox;
+ LLCheckBoxCtrl *mShowRenderWaterPlaneCheckBox;
+ LLCheckBoxCtrl *mShowXRayCheckBox;
+ LLTextBase *mPathfindingViewerStatus;
+ LLTextBase *mPathfindingSimulatorStatus;
+ LLPanel *mTestTab;
+ LLTextBase *mCtrlClickLabel;
+ LLTextBase *mShiftClickLabel;
+ LLTextBase *mCharacterWidthLabel;
+ LLTextBase *mCharacterWidthUnitLabel;
+ LLSliderCtrl *mCharacterWidthSlider;
+ LLTextBase *mCharacterTypeLabel;
+ LLComboBox *mCharacterTypeComboBox;
+ LLTextBase *mPathTestingStatus;
+ LLButton *mClearPathButton;
+
+ LLColor4 mErrorColor;
+ LLColor4 mWarningColor;
+
+ LLPathfindingNavMeshZone::navmesh_zone_slot_t mNavMeshZoneSlot;
+ LLPathfindingNavMeshZone mNavMeshZone;
+ bool mIsNavMeshUpdating;
+
+ boost::signals2::connection mRegionBoundarySlot;
+ boost::signals2::connection mTeleportFailedSlot;
+ LLPathfindingPathTool::path_event_slot_t mPathEventSlot;
+
+ LLToolset *mPathfindingToolset;
+ LLToolset *mSavedToolset;
+
+ boost::signals2::connection mSavedSettingRetrieveNeighborSlot;
+ boost::signals2::connection mSavedSettingWalkableSlot;
+ boost::signals2::connection mSavedSettingStaticObstacleSlot;
+ boost::signals2::connection mSavedSettingMaterialVolumeSlot;
+ boost::signals2::connection mSavedSettingExclusionVolumeSlot;
+ boost::signals2::connection mSavedSettingInteriorEdgeSlot;
+ boost::signals2::connection mSavedSettingExteriorEdgeSlot;
+ boost::signals2::connection mSavedSettingHeatmapMinSlot;
+ boost::signals2::connection mSavedSettingHeatmapMaxSlot;
+ boost::signals2::connection mSavedSettingNavMeshFaceSlot;
+ boost::signals2::connection mSavedSettingTestPathValidEndSlot;
+ boost::signals2::connection mSavedSettingTestPathInvalidEndSlot;
+ boost::signals2::connection mSavedSettingTestPathSlot;
+ boost::signals2::connection mSavedSettingWaterSlot;
+
+ EConsoleState mConsoleState;
+
+ std::vector<U32> mRenderableRestoreList;
+
+ static LLHandle<LLFloaterPathfindingConsole> sInstanceHandle;
+};
+
+#endif // LL_LLFLOATERPATHFINDINGCONSOLE_H
diff --git a/indra/newview/llfloaterpathfindinglinksets.cpp b/indra/newview/llfloaterpathfindinglinksets.cpp
new file mode 100644
index 0000000000..877bd0822d
--- /dev/null
+++ b/indra/newview/llfloaterpathfindinglinksets.cpp
@@ -0,0 +1,745 @@
+/**
+* @file llfloaterpathfindinglinksets.cpp
+* @brief "Pathfinding linksets" floater, allowing manipulation of the linksets on the current region.
+* @author Stinson@lindenlab.com
+*
+* $LicenseInfo:firstyear=2012&license=viewerlgpl$
+* Second Life Viewer Source Code
+* Copyright (C) 2012, Linden Research, Inc.
+*
+* This library is free software; you can redistribute it and/or
+* modify it under the terms of the GNU Lesser General Public
+* License as published by the Free Software Foundation;
+* version 2.1 of the License only.
+*
+* This library is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this library; if not, write to the Free Software
+* 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 "llfloaterpathfindinglinksets.h"
+
+#include <string>
+
+#include <boost/bind.hpp>
+
+#include "llagent.h"
+#include "llbutton.h"
+#include "llcombobox.h"
+#include "llfloaterpathfindingobjects.h"
+#include "llfloaterreg.h"
+#include "lllineeditor.h"
+#include "llnotificationsutil.h"
+#include "llpathfindinglinkset.h"
+#include "llpathfindinglinksetlist.h"
+#include "llpathfindingmanager.h"
+#include "llscrolllistitem.h"
+#include "llsd.h"
+#include "lltextbase.h"
+#include "lltextvalidate.h"
+#include "lluicolortable.h"
+#include "lluictrl.h"
+#include "v3math.h"
+#include "v4color.h"
+
+#define XUI_LINKSET_USE_NONE 0
+#define XUI_LINKSET_USE_WALKABLE 1
+#define XUI_LINKSET_USE_STATIC_OBSTACLE 2
+#define XUI_LINKSET_USE_DYNAMIC_OBSTACLE 3
+#define XUI_LINKSET_USE_MATERIAL_VOLUME 4
+#define XUI_LINKSET_USE_EXCLUSION_VOLUME 5
+#define XUI_LINKSET_USE_DYNAMIC_PHANTOM 6
+
+//---------------------------------------------------------------------------
+// LLFloaterPathfindingLinksets
+//---------------------------------------------------------------------------
+
+void LLFloaterPathfindingLinksets::openLinksetsWithSelectedObjects()
+{
+ LLFloaterPathfindingLinksets *linksetsFloater = LLFloaterReg::getTypedInstance<LLFloaterPathfindingLinksets>("pathfinding_linksets");
+ linksetsFloater->clearFilters();
+ linksetsFloater->showFloaterWithSelectionObjects();
+}
+
+LLFloaterPathfindingLinksets::LLFloaterPathfindingLinksets(const LLSD& pSeed)
+ : LLFloaterPathfindingObjects(pSeed),
+ mFilterByName(NULL),
+ mFilterByDescription(NULL),
+ mFilterByLinksetUse(NULL),
+ mEditLinksetUse(NULL),
+ mEditLinksetUseWalkable(NULL),
+ mEditLinksetUseStaticObstacle(NULL),
+ mEditLinksetUseDynamicObstacle(NULL),
+ mEditLinksetUseMaterialVolume(NULL),
+ mEditLinksetUseExclusionVolume(NULL),
+ mEditLinksetUseDynamicPhantom(NULL),
+ mLabelWalkabilityCoefficients(NULL),
+ mLabelEditA(NULL),
+ mLabelSuggestedUseA(NULL),
+ mEditA(NULL),
+ mLabelEditB(NULL),
+ mLabelSuggestedUseB(NULL),
+ mEditB(NULL),
+ mLabelEditC(NULL),
+ mLabelSuggestedUseC(NULL),
+ mEditC(NULL),
+ mLabelEditD(NULL),
+ mLabelSuggestedUseD(NULL),
+ mEditD(NULL),
+ mApplyEditsButton(NULL),
+ mBeaconColor()
+{
+}
+
+LLFloaterPathfindingLinksets::~LLFloaterPathfindingLinksets()
+{
+}
+
+BOOL LLFloaterPathfindingLinksets::postBuild()
+{
+ mBeaconColor = LLUIColorTable::getInstance()->getColor("PathfindingLinksetBeaconColor");
+
+ mFilterByName = findChild<LLLineEditor>("filter_by_name");
+ llassert(mFilterByName != NULL);
+ mFilterByName->setCommitCallback(boost::bind(&LLFloaterPathfindingLinksets::onApplyAllFilters, this));
+ mFilterByName->setSelectAllonFocusReceived(true);
+ mFilterByName->setCommitOnFocusLost(true);
+
+ mFilterByDescription = findChild<LLLineEditor>("filter_by_description");
+ llassert(mFilterByDescription != NULL);
+ mFilterByDescription->setCommitCallback(boost::bind(&LLFloaterPathfindingLinksets::onApplyAllFilters, this));
+ mFilterByDescription->setSelectAllonFocusReceived(true);
+ mFilterByDescription->setCommitOnFocusLost(true);
+
+ mFilterByLinksetUse = findChild<LLComboBox>("filter_by_linkset_use");
+ llassert(mFilterByLinksetUse != NULL);
+ mFilterByLinksetUse->setCommitCallback(boost::bind(&LLFloaterPathfindingLinksets::onApplyAllFilters, this));
+
+ childSetAction("apply_filters", boost::bind(&LLFloaterPathfindingLinksets::onApplyAllFilters, this));
+ childSetAction("clear_filters", boost::bind(&LLFloaterPathfindingLinksets::onClearFiltersClicked, this));
+
+ mEditLinksetUse = findChild<LLComboBox>("edit_linkset_use");
+ llassert(mEditLinksetUse != NULL);
+ mEditLinksetUse->clearRows();
+
+ mEditLinksetUseUnset = mEditLinksetUse->addElement(buildLinksetUseScrollListData(getString("linkset_choose_use"), XUI_LINKSET_USE_NONE));
+ llassert(mEditLinksetUseUnset != NULL);
+
+ mEditLinksetUseWalkable = mEditLinksetUse->addElement(buildLinksetUseScrollListData(getLinksetUseString(LLPathfindingLinkset::kWalkable), XUI_LINKSET_USE_WALKABLE));
+ llassert(mEditLinksetUseWalkable != NULL);
+
+ mEditLinksetUseStaticObstacle = mEditLinksetUse->addElement(buildLinksetUseScrollListData(getLinksetUseString(LLPathfindingLinkset::kStaticObstacle), XUI_LINKSET_USE_STATIC_OBSTACLE));
+ llassert(mEditLinksetUseStaticObstacle != NULL);
+
+ mEditLinksetUseDynamicObstacle = mEditLinksetUse->addElement(buildLinksetUseScrollListData(getLinksetUseString(LLPathfindingLinkset::kDynamicObstacle), XUI_LINKSET_USE_DYNAMIC_OBSTACLE));
+ llassert(mEditLinksetUseDynamicObstacle != NULL);
+
+ mEditLinksetUseMaterialVolume = mEditLinksetUse->addElement(buildLinksetUseScrollListData(getLinksetUseString(LLPathfindingLinkset::kMaterialVolume), XUI_LINKSET_USE_MATERIAL_VOLUME));
+ llassert(mEditLinksetUseMaterialVolume != NULL);
+
+ mEditLinksetUseExclusionVolume = mEditLinksetUse->addElement(buildLinksetUseScrollListData(getLinksetUseString(LLPathfindingLinkset::kExclusionVolume), XUI_LINKSET_USE_EXCLUSION_VOLUME));
+ llassert(mEditLinksetUseExclusionVolume != NULL);
+
+ mEditLinksetUseDynamicPhantom = mEditLinksetUse->addElement(buildLinksetUseScrollListData(getLinksetUseString(LLPathfindingLinkset::kDynamicPhantom), XUI_LINKSET_USE_DYNAMIC_PHANTOM));
+ llassert(mEditLinksetUseDynamicPhantom != NULL);
+
+ mEditLinksetUse->selectFirstItem();
+
+ mLabelWalkabilityCoefficients = findChild<LLTextBase>("walkability_coefficients_label");
+ llassert(mLabelWalkabilityCoefficients != NULL);
+
+ mLabelEditA = findChild<LLTextBase>("edit_a_label");
+ llassert(mLabelEditA != NULL);
+
+ mLabelSuggestedUseA = findChild<LLTextBase>("suggested_use_a_label");
+ llassert(mLabelSuggestedUseA != NULL);
+
+ mEditA = findChild<LLLineEditor>("edit_a_value");
+ llassert(mEditA != NULL);
+ mEditA->setPrevalidate(LLTextValidate::validateNonNegativeS32);
+ mEditA->setCommitCallback(boost::bind(&LLFloaterPathfindingLinksets::onWalkabilityCoefficientEntered, this, _1));
+
+ mLabelEditB = findChild<LLTextBase>("edit_b_label");
+ llassert(mLabelEditB != NULL);
+
+ mLabelSuggestedUseB = findChild<LLTextBase>("suggested_use_b_label");
+ llassert(mLabelSuggestedUseB != NULL);
+
+ mEditB = findChild<LLLineEditor>("edit_b_value");
+ llassert(mEditB != NULL);
+ mEditB->setPrevalidate(LLTextValidate::validateNonNegativeS32);
+ mEditB->setCommitCallback(boost::bind(&LLFloaterPathfindingLinksets::onWalkabilityCoefficientEntered, this, _1));
+
+ mLabelEditC = findChild<LLTextBase>("edit_c_label");
+ llassert(mLabelEditC != NULL);
+
+ mLabelSuggestedUseC = findChild<LLTextBase>("suggested_use_c_label");
+ llassert(mLabelSuggestedUseC != NULL);
+
+ mEditC = findChild<LLLineEditor>("edit_c_value");
+ llassert(mEditC != NULL);
+ mEditC->setPrevalidate(LLTextValidate::validateNonNegativeS32);
+ mEditC->setCommitCallback(boost::bind(&LLFloaterPathfindingLinksets::onWalkabilityCoefficientEntered, this, _1));
+
+ mLabelEditD = findChild<LLTextBase>("edit_d_label");
+ llassert(mLabelEditD != NULL);
+
+ mLabelSuggestedUseD = findChild<LLTextBase>("suggested_use_d_label");
+ llassert(mLabelSuggestedUseD != NULL);
+
+ mEditD = findChild<LLLineEditor>("edit_d_value");
+ llassert(mEditD != NULL);
+ mEditD->setPrevalidate(LLTextValidate::validateNonNegativeS32);
+ mEditD->setCommitCallback(boost::bind(&LLFloaterPathfindingLinksets::onWalkabilityCoefficientEntered, this, _1));
+
+ mApplyEditsButton = findChild<LLButton>("apply_edit_values");
+ llassert(mApplyEditsButton != NULL);
+ mApplyEditsButton->setCommitCallback(boost::bind(&LLFloaterPathfindingLinksets::onApplyChangesClicked, this));
+
+ return LLFloaterPathfindingObjects::postBuild();
+}
+
+void LLFloaterPathfindingLinksets::requestGetObjects()
+{
+ LLPathfindingManager::getInstance()->requestGetLinksets(getNewRequestId(), boost::bind(&LLFloaterPathfindingLinksets::handleNewObjectList, this, _1, _2, _3));
+}
+
+LLSD LLFloaterPathfindingLinksets::convertObjectsIntoScrollListData(const LLPathfindingObjectListPtr pObjectListPtr)
+{
+ llassert(pObjectListPtr != NULL);
+ llassert(!pObjectListPtr->isEmpty());
+
+ std::string nameFilter = mFilterByName->getText();
+ std::string descriptionFilter = mFilterByDescription->getText();
+ LLPathfindingLinkset::ELinksetUse linksetUseFilter = getFilterLinksetUse();
+ bool isFilteringName = !nameFilter.empty();
+ bool isFilteringDescription = !descriptionFilter.empty();
+ bool isFilteringLinksetUse = (linksetUseFilter != LLPathfindingLinkset::kUnknown);
+
+ LLSD scrollListData = LLSD::emptyArray();
+ const LLVector3& avatarPosition = gAgent.getPositionAgent();
+
+ if (isFilteringName || isFilteringDescription || isFilteringLinksetUse)
+ {
+ LLStringUtil::toUpper(nameFilter);
+ LLStringUtil::toUpper(descriptionFilter);
+ for (LLPathfindingObjectList::const_iterator objectIter = pObjectListPtr->begin(); objectIter != pObjectListPtr->end(); ++objectIter)
+ {
+ const LLPathfindingLinkset *linksetPtr = dynamic_cast<const LLPathfindingLinkset *>(objectIter->second.get());
+ std::string linksetName = (linksetPtr->isTerrain() ? getString("linkset_terrain_name") : linksetPtr->getName());
+ std::string linksetDescription = linksetPtr->getDescription();
+ LLStringUtil::toUpper(linksetName);
+ LLStringUtil::toUpper(linksetDescription);
+ if ((!isFilteringName || (linksetName.find(nameFilter) != std::string::npos)) &&
+ (!isFilteringDescription || (linksetDescription.find(descriptionFilter) != std::string::npos)) &&
+ (!isFilteringLinksetUse || (linksetPtr->getLinksetUse() == linksetUseFilter)))
+ {
+ LLSD element = buildLinksetScrollListData(linksetPtr, avatarPosition);
+ scrollListData.append(element);
+
+ if (linksetPtr->hasOwner() && !linksetPtr->hasOwnerName())
+ {
+ rebuildScrollListAfterAvatarNameLoads(linksetPtr->getUUID());
+ }
+ }
+ }
+ }
+ else
+ {
+ for (LLPathfindingObjectList::const_iterator objectIter = pObjectListPtr->begin(); objectIter != pObjectListPtr->end(); ++objectIter)
+ {
+ const LLPathfindingLinkset *linksetPtr = dynamic_cast<const LLPathfindingLinkset *>(objectIter->second.get());
+ LLSD element = buildLinksetScrollListData(linksetPtr, avatarPosition);
+ scrollListData.append(element);
+
+ if (linksetPtr->hasOwner() && !linksetPtr->hasOwnerName())
+ {
+ rebuildScrollListAfterAvatarNameLoads(linksetPtr->getUUID());
+ }
+ }
+ }
+
+ return scrollListData;
+}
+
+void LLFloaterPathfindingLinksets::updateControlsOnScrollListChange()
+{
+ LLFloaterPathfindingObjects::updateControlsOnScrollListChange();
+ updateEditFieldValues();
+ updateStateOnEditFields();
+ updateStateOnEditLinksetUse();
+}
+
+S32 LLFloaterPathfindingLinksets::getNameColumnIndex() const
+{
+ return 0;
+}
+
+const LLColor4 &LLFloaterPathfindingLinksets::getBeaconColor() const
+{
+ return mBeaconColor;
+}
+
+LLPathfindingObjectListPtr LLFloaterPathfindingLinksets::getEmptyObjectList() const
+{
+ LLPathfindingObjectListPtr objectListPtr(new LLPathfindingLinksetList());
+ return objectListPtr;
+}
+
+void LLFloaterPathfindingLinksets::requestSetLinksets(LLPathfindingObjectListPtr pLinksetList, LLPathfindingLinkset::ELinksetUse pLinksetUse, S32 pA, S32 pB, S32 pC, S32 pD)
+{
+ LLPathfindingManager::getInstance()->requestSetLinksets(getNewRequestId(), pLinksetList, pLinksetUse, pA, pB, pC, pD, boost::bind(&LLFloaterPathfindingLinksets::handleUpdateObjectList, this, _1, _2, _3));
+}
+
+void LLFloaterPathfindingLinksets::onApplyAllFilters()
+{
+ rebuildObjectsScrollList();
+}
+
+void LLFloaterPathfindingLinksets::onClearFiltersClicked()
+{
+ clearFilters();
+ rebuildObjectsScrollList();
+}
+
+void LLFloaterPathfindingLinksets::onWalkabilityCoefficientEntered(LLUICtrl *pUICtrl)
+{
+ LLLineEditor *pLineEditor = static_cast<LLLineEditor *>(pUICtrl);
+ llassert(pLineEditor != NULL);
+
+ const std::string &valueString = pLineEditor->getText();
+ S32 value;
+
+ if (LLStringUtil::convertToS32(valueString, value))
+ {
+ if ((value < LLPathfindingLinkset::MIN_WALKABILITY_VALUE) || (value > LLPathfindingLinkset::MAX_WALKABILITY_VALUE))
+ {
+ value = llclamp(value, LLPathfindingLinkset::MIN_WALKABILITY_VALUE, LLPathfindingLinkset::MAX_WALKABILITY_VALUE);
+ pLineEditor->setValue(LLSD(value));
+ }
+ }
+ else
+ {
+ pLineEditor->setValue(LLSD(LLPathfindingLinkset::MAX_WALKABILITY_VALUE));
+ }
+}
+
+void LLFloaterPathfindingLinksets::onApplyChangesClicked()
+{
+ applyEdit();
+}
+
+void LLFloaterPathfindingLinksets::clearFilters()
+{
+ mFilterByName->clear();
+ mFilterByDescription->clear();
+ setFilterLinksetUse(LLPathfindingLinkset::kUnknown);
+}
+
+void LLFloaterPathfindingLinksets::updateEditFieldValues()
+{
+ int numSelectedObjects = getNumSelectedObjects();
+ if (numSelectedObjects <= 0)
+ {
+ mEditLinksetUse->selectFirstItem();
+ mEditA->clear();
+ mEditB->clear();
+ mEditC->clear();
+ mEditD->clear();
+ }
+ else
+ {
+ LLPathfindingObjectPtr firstSelectedObjectPtr = getFirstSelectedObject();
+ llassert(firstSelectedObjectPtr != NULL);
+
+ const LLPathfindingLinkset *linkset = dynamic_cast<const LLPathfindingLinkset *>(firstSelectedObjectPtr.get());
+
+ setEditLinksetUse(linkset->getLinksetUse());
+ mEditA->setValue(LLSD(linkset->getWalkabilityCoefficientA()));
+ mEditB->setValue(LLSD(linkset->getWalkabilityCoefficientB()));
+ mEditC->setValue(LLSD(linkset->getWalkabilityCoefficientC()));
+ mEditD->setValue(LLSD(linkset->getWalkabilityCoefficientD()));
+ }
+}
+
+LLSD LLFloaterPathfindingLinksets::buildLinksetScrollListData(const LLPathfindingLinkset *pLinksetPtr, const LLVector3 &pAvatarPosition) const
+{
+ llassert(pLinksetPtr != NULL);
+ LLSD columns;
+
+ if (pLinksetPtr->isTerrain())
+ {
+ columns[0]["column"] = "name";
+ columns[0]["value"] = getString("linkset_terrain_name");
+
+ columns[1]["column"] = "description";
+ columns[1]["value"] = getString("linkset_terrain_description");
+
+ columns[2]["column"] = "owner";
+ columns[2]["value"] = getString("linkset_terrain_owner");
+
+ columns[3]["column"] = "land_impact";
+ columns[3]["value"] = getString("linkset_terrain_land_impact");
+
+ columns[4]["column"] = "dist_from_you";
+ columns[4]["value"] = getString("linkset_terrain_dist_from_you");
+ }
+ else
+ {
+ columns[0]["column"] = "name";
+ columns[0]["value"] = pLinksetPtr->getName();
+
+ columns[1]["column"] = "description";
+ columns[1]["value"] = pLinksetPtr->getDescription();
+
+ columns[2]["column"] = "owner";
+ columns[2]["value"] = (pLinksetPtr->hasOwner()
+ ? (pLinksetPtr->hasOwnerName()
+ ? (pLinksetPtr->isGroupOwned()
+ ? (pLinksetPtr->getOwnerName() + " " + getString("linkset_owner_group"))
+ : pLinksetPtr->getOwnerName())
+ : getString("linkset_owner_loading"))
+ : getString("linkset_owner_unknown"));
+
+ columns[3]["column"] = "land_impact";
+ columns[3]["value"] = llformat("%1d", pLinksetPtr->getLandImpact());
+
+ columns[4]["column"] = "dist_from_you";
+ columns[4]["value"] = llformat("%1.0f m", dist_vec(pAvatarPosition, pLinksetPtr->getLocation()));
+ }
+
+ columns[5]["column"] = "linkset_use";
+ std::string linksetUse = getLinksetUseString(pLinksetPtr->getLinksetUse());
+ if (pLinksetPtr->isTerrain())
+ {
+ linksetUse += (" " + getString("linkset_is_terrain"));
+ }
+ else if (!pLinksetPtr->isModifiable() && pLinksetPtr->canBeVolume())
+ {
+ linksetUse += (" " + getString("linkset_is_restricted_state"));
+ }
+ else if (pLinksetPtr->isModifiable() && !pLinksetPtr->canBeVolume())
+ {
+ linksetUse += (" " + getString("linkset_is_non_volume_state"));
+ }
+ else if (!pLinksetPtr->isModifiable() && !pLinksetPtr->canBeVolume())
+ {
+ linksetUse += (" " + getString("linkset_is_restricted_non_volume_state"));
+ }
+ columns[5]["value"] = linksetUse;
+
+ columns[6]["column"] = "a_percent";
+ columns[6]["value"] = llformat("%3d", pLinksetPtr->getWalkabilityCoefficientA());
+
+ columns[7]["column"] = "b_percent";
+ columns[7]["value"] = llformat("%3d", pLinksetPtr->getWalkabilityCoefficientB());
+
+ columns[8]["column"] = "c_percent";
+ columns[8]["value"] = llformat("%3d", pLinksetPtr->getWalkabilityCoefficientC());
+
+ columns[9]["column"] = "d_percent";
+ columns[9]["value"] = llformat("%3d", pLinksetPtr->getWalkabilityCoefficientD());
+
+ LLSD element;
+ element["id"] = pLinksetPtr->getUUID().asString();
+ element["column"] = columns;
+
+ return element;
+}
+
+LLSD LLFloaterPathfindingLinksets::buildLinksetUseScrollListData(const std::string &pLabel, S32 pValue) const
+{
+ LLSD columns;
+
+ columns[0]["column"] = "name";
+ columns[0]["value"] = pLabel;
+ columns[0]["font"] = "SANSSERIF";
+
+ LLSD element;
+ element["value"] = pValue;
+ element["column"] = columns;
+
+ return element;
+}
+
+bool LLFloaterPathfindingLinksets::isShowUnmodifiablePhantomWarning(LLPathfindingLinkset::ELinksetUse pLinksetUse) const
+{
+ bool isShowWarning = false;
+
+ if (pLinksetUse != LLPathfindingLinkset::kUnknown)
+ {
+ LLPathfindingObjectListPtr selectedObjects = getSelectedObjects();
+ if ((selectedObjects != NULL) && !selectedObjects->isEmpty())
+ {
+ const LLPathfindingLinksetList *linksetList = dynamic_cast<const LLPathfindingLinksetList *>(selectedObjects.get());
+ isShowWarning = linksetList->isShowUnmodifiablePhantomWarning(pLinksetUse);
+ }
+ }
+
+ return isShowWarning;
+}
+
+bool LLFloaterPathfindingLinksets::isShowCannotBeVolumeWarning(LLPathfindingLinkset::ELinksetUse pLinksetUse) const
+{
+ bool isShowWarning = false;
+
+ if (pLinksetUse != LLPathfindingLinkset::kUnknown)
+ {
+ LLPathfindingObjectListPtr selectedObjects = getSelectedObjects();
+ if ((selectedObjects != NULL) && !selectedObjects->isEmpty())
+ {
+ const LLPathfindingLinksetList *linksetList = dynamic_cast<const LLPathfindingLinksetList *>(selectedObjects.get());
+ isShowWarning = linksetList->isShowCannotBeVolumeWarning(pLinksetUse);
+ }
+ }
+
+ return isShowWarning;
+}
+
+void LLFloaterPathfindingLinksets::updateStateOnEditFields()
+{
+ int numSelectedItems = getNumSelectedObjects();
+ bool isEditEnabled = (numSelectedItems > 0);
+
+ mEditLinksetUse->setEnabled(isEditEnabled);
+
+ mLabelWalkabilityCoefficients->setEnabled(isEditEnabled);
+ mLabelEditA->setEnabled(isEditEnabled);
+ mLabelEditB->setEnabled(isEditEnabled);
+ mLabelEditC->setEnabled(isEditEnabled);
+ mLabelEditD->setEnabled(isEditEnabled);
+ mLabelSuggestedUseA->setEnabled(isEditEnabled);
+ mLabelSuggestedUseB->setEnabled(isEditEnabled);
+ mLabelSuggestedUseC->setEnabled(isEditEnabled);
+ mLabelSuggestedUseD->setEnabled(isEditEnabled);
+ mEditA->setEnabled(isEditEnabled);
+ mEditB->setEnabled(isEditEnabled);
+ mEditC->setEnabled(isEditEnabled);
+ mEditD->setEnabled(isEditEnabled);
+
+ mApplyEditsButton->setEnabled(isEditEnabled && (getMessagingState() == kMessagingComplete));
+}
+
+void LLFloaterPathfindingLinksets::updateStateOnEditLinksetUse()
+{
+ BOOL useWalkable = FALSE;
+ BOOL useStaticObstacle = FALSE;
+ BOOL useDynamicObstacle = FALSE;
+ BOOL useMaterialVolume = FALSE;
+ BOOL useExclusionVolume = FALSE;
+ BOOL useDynamicPhantom = FALSE;
+
+ LLPathfindingObjectListPtr selectedObjects = getSelectedObjects();
+ if ((selectedObjects != NULL) && !selectedObjects->isEmpty())
+ {
+ const LLPathfindingLinksetList *linksetList = dynamic_cast<const LLPathfindingLinksetList *>(selectedObjects.get());
+ linksetList->determinePossibleStates(useWalkable, useStaticObstacle, useDynamicObstacle, useMaterialVolume, useExclusionVolume, useDynamicPhantom);
+ }
+
+ mEditLinksetUseWalkable->setEnabled(useWalkable);
+ mEditLinksetUseStaticObstacle->setEnabled(useStaticObstacle);
+ mEditLinksetUseDynamicObstacle->setEnabled(useDynamicObstacle);
+ mEditLinksetUseMaterialVolume->setEnabled(useMaterialVolume);
+ mEditLinksetUseExclusionVolume->setEnabled(useExclusionVolume);
+ mEditLinksetUseDynamicPhantom->setEnabled(useDynamicPhantom);
+}
+
+void LLFloaterPathfindingLinksets::applyEdit()
+{
+ LLPathfindingLinkset::ELinksetUse linksetUse = getEditLinksetUse();
+
+ bool showUnmodifiablePhantomWarning = isShowUnmodifiablePhantomWarning(linksetUse);
+ bool showCannotBeVolumeWarning = isShowCannotBeVolumeWarning(linksetUse);
+
+ if (showUnmodifiablePhantomWarning || showCannotBeVolumeWarning)
+ {
+ LLPathfindingLinkset::ELinksetUse restrictedLinksetUse = LLPathfindingLinkset::getLinksetUseWithToggledPhantom(linksetUse);
+ LLSD substitutions;
+ substitutions["REQUESTED_TYPE"] = getLinksetUseString(linksetUse);
+ substitutions["RESTRICTED_TYPE"] = getLinksetUseString(restrictedLinksetUse);
+
+ std::string notificationName;
+ if (showUnmodifiablePhantomWarning && showCannotBeVolumeWarning)
+ {
+ notificationName = "PathfindingLinksets_SetLinksetUseMismatchOnRestrictedAndVolume";
+ }
+ else if (showUnmodifiablePhantomWarning)
+ {
+ notificationName = "PathfindingLinksets_SetLinksetUseMismatchOnRestricted";
+ }
+ else
+ {
+ notificationName = "PathfindingLinksets_SetLinksetUseMismatchOnVolume";
+ }
+ LLNotificationsUtil::add(notificationName, substitutions, LLSD(), boost::bind(&LLFloaterPathfindingLinksets::handleApplyEdit, this, _1, _2));
+ }
+ else
+ {
+ doApplyEdit();
+ }
+}
+
+void LLFloaterPathfindingLinksets::handleApplyEdit(const LLSD &pNotification, const LLSD &pResponse)
+{
+ if (LLNotificationsUtil::getSelectedOption(pNotification, pResponse) == 0)
+ {
+ doApplyEdit();
+ }
+}
+
+void LLFloaterPathfindingLinksets::doApplyEdit()
+{
+ LLPathfindingObjectListPtr selectedObjects = getSelectedObjects();
+ if ((selectedObjects != NULL) && !selectedObjects->isEmpty())
+ {
+ LLPathfindingLinkset::ELinksetUse linksetUse = getEditLinksetUse();
+ const std::string &aString = mEditA->getText();
+ const std::string &bString = mEditB->getText();
+ const std::string &cString = mEditC->getText();
+ const std::string &dString = mEditD->getText();
+ S32 aValue = static_cast<S32>(atoi(aString.c_str()));
+ S32 bValue = static_cast<S32>(atoi(bString.c_str()));
+ S32 cValue = static_cast<S32>(atoi(cString.c_str()));
+ S32 dValue = static_cast<S32>(atoi(dString.c_str()));
+
+
+ requestSetLinksets(selectedObjects, linksetUse, aValue, bValue, cValue, dValue);
+ }
+}
+
+std::string LLFloaterPathfindingLinksets::getLinksetUseString(LLPathfindingLinkset::ELinksetUse pLinksetUse) const
+{
+ std::string linksetUse;
+
+ switch (pLinksetUse)
+ {
+ case LLPathfindingLinkset::kWalkable :
+ linksetUse = getString("linkset_use_walkable");
+ break;
+ case LLPathfindingLinkset::kStaticObstacle :
+ linksetUse = getString("linkset_use_static_obstacle");
+ break;
+ case LLPathfindingLinkset::kDynamicObstacle :
+ linksetUse = getString("linkset_use_dynamic_obstacle");
+ break;
+ case LLPathfindingLinkset::kMaterialVolume :
+ linksetUse = getString("linkset_use_material_volume");
+ break;
+ case LLPathfindingLinkset::kExclusionVolume :
+ linksetUse = getString("linkset_use_exclusion_volume");
+ break;
+ case LLPathfindingLinkset::kDynamicPhantom :
+ linksetUse = getString("linkset_use_dynamic_phantom");
+ break;
+ case LLPathfindingLinkset::kUnknown :
+ default :
+ linksetUse = getString("linkset_use_dynamic_obstacle");
+ llassert(0);
+ break;
+ }
+
+ return linksetUse;
+}
+
+LLPathfindingLinkset::ELinksetUse LLFloaterPathfindingLinksets::getFilterLinksetUse() const
+{
+ return convertToLinksetUse(mFilterByLinksetUse->getValue());
+}
+
+void LLFloaterPathfindingLinksets::setFilterLinksetUse(LLPathfindingLinkset::ELinksetUse pLinksetUse)
+{
+ mFilterByLinksetUse->setValue(convertToXuiValue(pLinksetUse));
+}
+
+LLPathfindingLinkset::ELinksetUse LLFloaterPathfindingLinksets::getEditLinksetUse() const
+{
+ return convertToLinksetUse(mEditLinksetUse->getValue());
+}
+
+void LLFloaterPathfindingLinksets::setEditLinksetUse(LLPathfindingLinkset::ELinksetUse pLinksetUse)
+{
+ mEditLinksetUse->setValue(convertToXuiValue(pLinksetUse));
+}
+
+LLPathfindingLinkset::ELinksetUse LLFloaterPathfindingLinksets::convertToLinksetUse(LLSD pXuiValue) const
+{
+ LLPathfindingLinkset::ELinksetUse linkUse;
+
+ switch (pXuiValue.asInteger())
+ {
+ case XUI_LINKSET_USE_NONE :
+ linkUse = LLPathfindingLinkset::kUnknown;
+ break;
+ case XUI_LINKSET_USE_WALKABLE :
+ linkUse = LLPathfindingLinkset::kWalkable;
+ break;
+ case XUI_LINKSET_USE_STATIC_OBSTACLE :
+ linkUse = LLPathfindingLinkset::kStaticObstacle;
+ break;
+ case XUI_LINKSET_USE_DYNAMIC_OBSTACLE :
+ linkUse = LLPathfindingLinkset::kDynamicObstacle;
+ break;
+ case XUI_LINKSET_USE_MATERIAL_VOLUME :
+ linkUse = LLPathfindingLinkset::kMaterialVolume;
+ break;
+ case XUI_LINKSET_USE_EXCLUSION_VOLUME :
+ linkUse = LLPathfindingLinkset::kExclusionVolume;
+ break;
+ case XUI_LINKSET_USE_DYNAMIC_PHANTOM :
+ linkUse = LLPathfindingLinkset::kDynamicPhantom;
+ break;
+ default :
+ linkUse = LLPathfindingLinkset::kUnknown;
+ llassert(0);
+ break;
+ }
+
+ return linkUse;
+}
+
+LLSD LLFloaterPathfindingLinksets::convertToXuiValue(LLPathfindingLinkset::ELinksetUse pLinksetUse) const
+{
+ LLSD xuiValue;
+
+ switch (pLinksetUse)
+ {
+ case LLPathfindingLinkset::kUnknown :
+ xuiValue = XUI_LINKSET_USE_NONE;
+ break;
+ case LLPathfindingLinkset::kWalkable :
+ xuiValue = XUI_LINKSET_USE_WALKABLE;
+ break;
+ case LLPathfindingLinkset::kStaticObstacle :
+ xuiValue = XUI_LINKSET_USE_STATIC_OBSTACLE;
+ break;
+ case LLPathfindingLinkset::kDynamicObstacle :
+ xuiValue = XUI_LINKSET_USE_DYNAMIC_OBSTACLE;
+ break;
+ case LLPathfindingLinkset::kMaterialVolume :
+ xuiValue = XUI_LINKSET_USE_MATERIAL_VOLUME;
+ break;
+ case LLPathfindingLinkset::kExclusionVolume :
+ xuiValue = XUI_LINKSET_USE_EXCLUSION_VOLUME;
+ break;
+ case LLPathfindingLinkset::kDynamicPhantom :
+ xuiValue = XUI_LINKSET_USE_DYNAMIC_PHANTOM;
+ break;
+ default :
+ xuiValue = XUI_LINKSET_USE_NONE;
+ llassert(0);
+ break;
+ }
+
+ return xuiValue;
+}
diff --git a/indra/newview/llfloaterpathfindinglinksets.h b/indra/newview/llfloaterpathfindinglinksets.h
new file mode 100644
index 0000000000..342a64fc77
--- /dev/null
+++ b/indra/newview/llfloaterpathfindinglinksets.h
@@ -0,0 +1,134 @@
+/**
+* @file llfloaterpathfindinglinksets.h
+* @brief "Pathfinding linksets" floater, allowing manipulation of the linksets on the current region.
+* @author Stinson@lindenlab.com
+*
+* $LicenseInfo:firstyear=2012&license=viewerlgpl$
+* Second Life Viewer Source Code
+* Copyright (C) 2012, Linden Research, Inc.
+*
+* This library is free software; you can redistribute it and/or
+* modify it under the terms of the GNU Lesser General Public
+* License as published by the Free Software Foundation;
+* version 2.1 of the License only.
+*
+* This library is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this library; if not, write to the Free Software
+* 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_LLFLOATERPATHFINDINGLINKSETS_H
+#define LL_LLFLOATERPATHFINDINGLINKSETS_H
+
+#include <string>
+
+#include "llfloaterpathfindingobjects.h"
+#include "llpathfindinglinkset.h"
+#include "llpathfindingobjectlist.h"
+#include "v4color.h"
+
+class LLButton;
+class LLComboBox;
+class LLLineEditor;
+class LLScrollListItem;
+class LLSD;
+class LLTextBase;
+class LLUICtrl;
+class LLVector3;
+
+class LLFloaterPathfindingLinksets : public LLFloaterPathfindingObjects
+{
+public:
+ static void openLinksetsWithSelectedObjects();
+
+protected:
+ friend class LLFloaterReg;
+
+ LLFloaterPathfindingLinksets(const LLSD& pSeed);
+ virtual ~LLFloaterPathfindingLinksets();
+
+ virtual BOOL postBuild();
+
+ virtual void requestGetObjects();
+
+ virtual LLSD convertObjectsIntoScrollListData(const LLPathfindingObjectListPtr pObjectListPtr);
+
+ virtual void updateControlsOnScrollListChange();
+
+ virtual S32 getNameColumnIndex() const;
+ virtual const LLColor4 &getBeaconColor() const;
+
+ virtual LLPathfindingObjectListPtr getEmptyObjectList() const;
+
+private:
+ void requestSetLinksets(LLPathfindingObjectListPtr pLinksetList, LLPathfindingLinkset::ELinksetUse pLinksetUse, S32 pA, S32 pB, S32 pC, S32 pD);
+
+ void onApplyAllFilters();
+ void onClearFiltersClicked();
+ void onWalkabilityCoefficientEntered(LLUICtrl *pUICtrl);
+ void onApplyChangesClicked();
+
+ void clearFilters();
+
+ void updateEditFieldValues();
+ LLSD buildLinksetScrollListData(const LLPathfindingLinkset *pLinksetPtr, const LLVector3 &pAvatarPosition) const;
+ LLSD buildLinksetUseScrollListData(const std::string &pLabel, S32 pValue) const;
+
+ bool isShowUnmodifiablePhantomWarning(LLPathfindingLinkset::ELinksetUse pLinksetUse) const;
+ bool isShowCannotBeVolumeWarning(LLPathfindingLinkset::ELinksetUse pLinksetUse) const;
+
+ void updateStateOnEditFields();
+ void updateStateOnEditLinksetUse();
+
+ void applyEdit();
+ void handleApplyEdit(const LLSD &pNotification, const LLSD &pResponse);
+ void doApplyEdit();
+
+ std::string getLinksetUseString(LLPathfindingLinkset::ELinksetUse pLinksetUse) const;
+
+ LLPathfindingLinkset::ELinksetUse getFilterLinksetUse() const;
+ void setFilterLinksetUse(LLPathfindingLinkset::ELinksetUse pLinksetUse);
+
+ LLPathfindingLinkset::ELinksetUse getEditLinksetUse() const;
+ void setEditLinksetUse(LLPathfindingLinkset::ELinksetUse pLinksetUse);
+
+ LLPathfindingLinkset::ELinksetUse convertToLinksetUse(LLSD pXuiValue) const;
+ LLSD convertToXuiValue(LLPathfindingLinkset::ELinksetUse pLinksetUse) const;
+
+ LLLineEditor *mFilterByName;
+ LLLineEditor *mFilterByDescription;
+ LLComboBox *mFilterByLinksetUse;
+ LLComboBox *mEditLinksetUse;
+ LLScrollListItem *mEditLinksetUseUnset;
+ LLScrollListItem *mEditLinksetUseWalkable;
+ LLScrollListItem *mEditLinksetUseStaticObstacle;
+ LLScrollListItem *mEditLinksetUseDynamicObstacle;
+ LLScrollListItem *mEditLinksetUseMaterialVolume;
+ LLScrollListItem *mEditLinksetUseExclusionVolume;
+ LLScrollListItem *mEditLinksetUseDynamicPhantom;
+ LLTextBase *mLabelWalkabilityCoefficients;
+ LLTextBase *mLabelEditA;
+ LLTextBase *mLabelSuggestedUseA;
+ LLLineEditor *mEditA;
+ LLTextBase *mLabelEditB;
+ LLTextBase *mLabelSuggestedUseB;
+ LLLineEditor *mEditB;
+ LLTextBase *mLabelEditC;
+ LLTextBase *mLabelSuggestedUseC;
+ LLLineEditor *mEditC;
+ LLTextBase *mLabelEditD;
+ LLTextBase *mLabelSuggestedUseD;
+ LLLineEditor *mEditD;
+ LLButton *mApplyEditsButton;
+
+ LLColor4 mBeaconColor;
+};
+
+#endif // LL_LLFLOATERPATHFINDINGLINKSETS_H
diff --git a/indra/newview/llfloaterpathfindingobjects.cpp b/indra/newview/llfloaterpathfindingobjects.cpp
new file mode 100644
index 0000000000..e246265be9
--- /dev/null
+++ b/indra/newview/llfloaterpathfindingobjects.cpp
@@ -0,0 +1,866 @@
+/**
+* @file llfloaterpathfindingobjects.cpp
+* @brief Base class for both the pathfinding linksets and characters floater.
+* @author Stinson@lindenlab.com
+*
+* $LicenseInfo:firstyear=2012&license=viewerlgpl$
+* Second Life Viewer Source Code
+* Copyright (C) 2012, Linden Research, Inc.
+*
+* This library is free software; you can redistribute it and/or
+* modify it under the terms of the GNU Lesser General Public
+* License as published by the Free Software Foundation;
+* version 2.1 of the License only.
+*
+* This library is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this library; if not, write to the Free Software
+* 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 "llfloaterpathfindingobjects.h"
+
+#include <vector>
+
+#include <boost/bind.hpp>
+#include <boost/signals2.hpp>
+
+#include "llagent.h"
+#include "llavatarname.h"
+#include "llavatarnamecache.h"
+#include "llbutton.h"
+#include "llcheckboxctrl.h"
+#include "llenvmanager.h"
+#include "llfloater.h"
+#include "llfontgl.h"
+#include "llnotifications.h"
+#include "llnotificationsutil.h"
+#include "llpathfindingmanager.h"
+#include "llresmgr.h"
+#include "llscrolllistcell.h"
+#include "llscrolllistctrl.h"
+#include "llscrolllistitem.h"
+#include "llselectmgr.h"
+#include "llsd.h"
+#include "llstring.h"
+#include "llstyle.h"
+#include "lltextbase.h"
+#include "lluicolortable.h"
+#include "llviewermenu.h"
+#include "llviewerobject.h"
+#include "llviewerobjectlist.h"
+#include "llviewerregion.h"
+#include "v3dmath.h"
+#include "v3math.h"
+#include "v4color.h"
+
+#define DEFAULT_BEACON_WIDTH 6
+
+//---------------------------------------------------------------------------
+// LLFloaterPathfindingObjects
+//---------------------------------------------------------------------------
+
+void LLFloaterPathfindingObjects::onOpen(const LLSD &pKey)
+{
+ LLFloater::onOpen(pKey);
+
+ selectNoneObjects();
+ mObjectsScrollList->setCommitOnSelectionChange(TRUE);
+
+ if (!mSelectionUpdateSlot.connected())
+ {
+ mSelectionUpdateSlot = LLSelectMgr::getInstance()->mUpdateSignal.connect(boost::bind(&LLFloaterPathfindingObjects::onInWorldSelectionListChanged, this));
+ }
+
+ if (!mRegionBoundaryCrossingSlot.connected())
+ {
+ mRegionBoundaryCrossingSlot = LLEnvManagerNew::getInstance()->setRegionChangeCallback(boost::bind(&LLFloaterPathfindingObjects::onRegionBoundaryCrossed, this));
+ }
+
+ if (!mGodLevelChangeSlot.connected())
+ {
+ mGodLevelChangeSlot = gAgent.registerGodLevelChanageListener(boost::bind(&LLFloaterPathfindingObjects::onGodLevelChange, this, _1));
+ }
+
+ requestGetObjects();
+}
+
+void LLFloaterPathfindingObjects::onClose(bool pIsAppQuitting)
+{
+
+ if (mGodLevelChangeSlot.connected())
+ {
+ mGodLevelChangeSlot.disconnect();
+ }
+
+ if (mRegionBoundaryCrossingSlot.connected())
+ {
+ mRegionBoundaryCrossingSlot.disconnect();
+ }
+
+ if (mSelectionUpdateSlot.connected())
+ {
+ mSelectionUpdateSlot.disconnect();
+ }
+
+ mObjectsScrollList->setCommitOnSelectionChange(FALSE);
+ selectNoneObjects();
+
+ if (mObjectsSelection.notNull())
+ {
+ mObjectsSelection.clear();
+ }
+}
+
+void LLFloaterPathfindingObjects::draw()
+{
+ LLFloater::draw();
+
+ if (isShowBeacons())
+ {
+ std::vector<LLScrollListItem *> selectedItems = mObjectsScrollList->getAllSelected();
+ if (!selectedItems.empty())
+ {
+ int numSelectedItems = selectedItems.size();
+ S32 nameColumnIndex = getNameColumnIndex();
+ const LLColor4 &beaconColor = getBeaconColor();
+ const LLColor4 &beaconTextColor = getBeaconTextColor();
+ S32 beaconWidth = getBeaconWidth();
+
+ std::vector<LLViewerObject *> viewerObjects;
+ viewerObjects.reserve(numSelectedItems);
+
+ for (std::vector<LLScrollListItem *>::const_iterator selectedItemIter = selectedItems.begin();
+ selectedItemIter != selectedItems.end(); ++selectedItemIter)
+ {
+ const LLScrollListItem *selectedItem = *selectedItemIter;
+
+ LLViewerObject *viewerObject = gObjectList.findObject(selectedItem->getUUID());
+ if (viewerObject != NULL)
+ {
+ const std::string &objectName = selectedItem->getColumn(nameColumnIndex)->getValue().asString();
+ gObjectList.addDebugBeacon(viewerObject->getPositionAgent(), objectName, beaconColor, beaconTextColor, beaconWidth);
+ }
+ }
+ }
+ }
+}
+
+LLFloaterPathfindingObjects::LLFloaterPathfindingObjects(const LLSD &pSeed)
+ : LLFloater(pSeed),
+ mObjectsScrollList(NULL),
+ mMessagingStatus(NULL),
+ mRefreshListButton(NULL),
+ mSelectAllButton(NULL),
+ mSelectNoneButton(NULL),
+ mShowBeaconCheckBox(NULL),
+ mTakeButton(NULL),
+ mTakeCopyButton(NULL),
+ mReturnButton(NULL),
+ mDeleteButton(NULL),
+ mTeleportButton(NULL),
+ mLoadingAvatarNames(),
+ mDefaultBeaconColor(),
+ mDefaultBeaconTextColor(),
+ mErrorTextColor(),
+ mWarningTextColor(),
+ mMessagingState(kMessagingUnknown),
+ mMessagingRequestId(0U),
+ mObjectList(),
+ mObjectsSelection(),
+ mHasObjectsToBeSelected(false),
+ mObjectsToBeSelected(),
+ mSelectionUpdateSlot(),
+ mRegionBoundaryCrossingSlot()
+{
+}
+
+LLFloaterPathfindingObjects::~LLFloaterPathfindingObjects()
+{
+}
+
+BOOL LLFloaterPathfindingObjects::postBuild()
+{
+ mDefaultBeaconColor = LLUIColorTable::getInstance()->getColor("PathfindingDefaultBeaconColor");
+ mDefaultBeaconTextColor = LLUIColorTable::getInstance()->getColor("PathfindingDefaultBeaconTextColor");
+ mErrorTextColor = LLUIColorTable::getInstance()->getColor("PathfindingErrorColor");
+ mWarningTextColor = LLUIColorTable::getInstance()->getColor("PathfindingWarningColor");
+
+ mObjectsScrollList = findChild<LLScrollListCtrl>("objects_scroll_list");
+ llassert(mObjectsScrollList != NULL);
+ mObjectsScrollList->setCommitCallback(boost::bind(&LLFloaterPathfindingObjects::onScrollListSelectionChanged, this));
+ mObjectsScrollList->sortByColumnIndex(static_cast<U32>(getNameColumnIndex()), TRUE);
+
+ mMessagingStatus = findChild<LLTextBase>("messaging_status");
+ llassert(mMessagingStatus != NULL);
+
+ mRefreshListButton = findChild<LLButton>("refresh_objects_list");
+ llassert(mRefreshListButton != NULL);
+ mRefreshListButton->setCommitCallback(boost::bind(&LLFloaterPathfindingObjects::onRefreshObjectsClicked, this));
+
+ mSelectAllButton = findChild<LLButton>("select_all_objects");
+ llassert(mSelectAllButton != NULL);
+ mSelectAllButton->setCommitCallback(boost::bind(&LLFloaterPathfindingObjects::onSelectAllObjectsClicked, this));
+
+ mSelectNoneButton = findChild<LLButton>("select_none_objects");
+ llassert(mSelectNoneButton != NULL);
+ mSelectNoneButton->setCommitCallback(boost::bind(&LLFloaterPathfindingObjects::onSelectNoneObjectsClicked, this));
+
+ mShowBeaconCheckBox = findChild<LLCheckBoxCtrl>("show_beacon");
+ llassert(mShowBeaconCheckBox != NULL);
+
+ mTakeButton = findChild<LLButton>("take_objects");
+ llassert(mTakeButton != NULL);
+ mTakeButton->setCommitCallback(boost::bind(&LLFloaterPathfindingObjects::onTakeClicked, this));
+
+ mTakeCopyButton = findChild<LLButton>("take_copy_objects");
+ llassert(mTakeCopyButton != NULL);
+ mTakeCopyButton->setCommitCallback(boost::bind(&LLFloaterPathfindingObjects::onTakeCopyClicked, this));
+
+ mReturnButton = findChild<LLButton>("return_objects");
+ llassert(mReturnButton != NULL);
+ mReturnButton->setCommitCallback(boost::bind(&LLFloaterPathfindingObjects::onReturnClicked, this));
+
+ mDeleteButton = findChild<LLButton>("delete_objects");
+ llassert(mDeleteButton != NULL);
+ mDeleteButton->setCommitCallback(boost::bind(&LLFloaterPathfindingObjects::onDeleteClicked, this));
+
+ mTeleportButton = findChild<LLButton>("teleport_me_to_object");
+ llassert(mTeleportButton != NULL);
+ mTeleportButton->setCommitCallback(boost::bind(&LLFloaterPathfindingObjects::onTeleportClicked, this));
+
+ return LLFloater::postBuild();
+}
+
+void LLFloaterPathfindingObjects::requestGetObjects()
+{
+ llassert(0);
+}
+
+LLPathfindingManager::request_id_t LLFloaterPathfindingObjects::getNewRequestId()
+{
+ return ++mMessagingRequestId;
+}
+
+void LLFloaterPathfindingObjects::handleNewObjectList(LLPathfindingManager::request_id_t pRequestId, LLPathfindingManager::ERequestStatus pRequestStatus, LLPathfindingObjectListPtr pObjectList)
+{
+ llassert(pRequestId <= mMessagingRequestId);
+ if (pRequestId == mMessagingRequestId)
+ {
+ switch (pRequestStatus)
+ {
+ case LLPathfindingManager::kRequestStarted :
+ setMessagingState(kMessagingGetRequestSent);
+ break;
+ case LLPathfindingManager::kRequestCompleted :
+ mObjectList = pObjectList;
+ rebuildObjectsScrollList();
+ setMessagingState(kMessagingComplete);
+ break;
+ case LLPathfindingManager::kRequestNotEnabled :
+ clearAllObjects();
+ setMessagingState(kMessagingNotEnabled);
+ break;
+ case LLPathfindingManager::kRequestError :
+ clearAllObjects();
+ setMessagingState(kMessagingGetError);
+ break;
+ default :
+ clearAllObjects();
+ setMessagingState(kMessagingGetError);
+ llassert(0);
+ break;
+ }
+ }
+}
+
+void LLFloaterPathfindingObjects::handleUpdateObjectList(LLPathfindingManager::request_id_t pRequestId, LLPathfindingManager::ERequestStatus pRequestStatus, LLPathfindingObjectListPtr pObjectList)
+{
+ // We current assume that handleUpdateObjectList is called only when objects are being SET
+ llassert(pRequestId <= mMessagingRequestId);
+ if (pRequestId == mMessagingRequestId)
+ {
+ switch (pRequestStatus)
+ {
+ case LLPathfindingManager::kRequestStarted :
+ setMessagingState(kMessagingSetRequestSent);
+ break;
+ case LLPathfindingManager::kRequestCompleted :
+ if (mObjectList == NULL)
+ {
+ mObjectList = pObjectList;
+ }
+ else
+ {
+ mObjectList->update(pObjectList);
+ }
+ rebuildObjectsScrollList();
+ setMessagingState(kMessagingComplete);
+ break;
+ case LLPathfindingManager::kRequestNotEnabled :
+ clearAllObjects();
+ setMessagingState(kMessagingNotEnabled);
+ break;
+ case LLPathfindingManager::kRequestError :
+ clearAllObjects();
+ setMessagingState(kMessagingSetError);
+ break;
+ default :
+ clearAllObjects();
+ setMessagingState(kMessagingSetError);
+ llassert(0);
+ break;
+ }
+ }
+}
+
+void LLFloaterPathfindingObjects::rebuildObjectsScrollList()
+{
+ if (!mHasObjectsToBeSelected)
+ {
+ std::vector<LLScrollListItem*> selectedItems = mObjectsScrollList->getAllSelected();
+ int numSelectedItems = selectedItems.size();
+ if (numSelectedItems > 0)
+ {
+ mObjectsToBeSelected.reserve(selectedItems.size());
+ for (std::vector<LLScrollListItem*>::const_iterator itemIter = selectedItems.begin();
+ itemIter != selectedItems.end(); ++itemIter)
+ {
+ const LLScrollListItem *listItem = *itemIter;
+ mObjectsToBeSelected.push_back(listItem->getUUID());
+ }
+ }
+ }
+
+ S32 origScrollPosition = mObjectsScrollList->getScrollPos();
+ mObjectsScrollList->deleteAllItems();
+
+ if ((mObjectList != NULL) && !mObjectList->isEmpty())
+ {
+ LLSD scrollListData = convertObjectsIntoScrollListData(mObjectList);
+ llassert(scrollListData.isArray());
+
+ LLScrollListCell::Params cellParams;
+ cellParams.font = LLFontGL::getFontSansSerif();
+
+ for (LLSD::array_const_iterator rowElementIter = scrollListData.beginArray(); rowElementIter != scrollListData.endArray(); ++rowElementIter)
+ {
+ const LLSD &rowElement = *rowElementIter;
+
+ LLScrollListItem::Params rowParams;
+ llassert(rowElement.has("id"));
+ llassert(rowElement.get("id").isString());
+ rowParams.value = rowElement.get("id");
+
+ llassert(rowElement.has("column"));
+ llassert(rowElement.get("column").isArray());
+ const LLSD &columnElement = rowElement.get("column");
+ for (LLSD::array_const_iterator cellIter = columnElement.beginArray(); cellIter != columnElement.endArray(); ++cellIter)
+ {
+ const LLSD &cellElement = *cellIter;
+
+ llassert(cellElement.has("column"));
+ llassert(cellElement.get("column").isString());
+ cellParams.column = cellElement.get("column").asString();
+
+ llassert(cellElement.has("value"));
+ llassert(cellElement.get("value").isString());
+ cellParams.value = cellElement.get("value").asString();
+
+ rowParams.columns.add(cellParams);
+ }
+
+ mObjectsScrollList->addRow(rowParams);
+ }
+ }
+
+ mObjectsScrollList->selectMultiple(mObjectsToBeSelected);
+ if (mHasObjectsToBeSelected)
+ {
+ mObjectsScrollList->scrollToShowSelected();
+ }
+ else
+ {
+ mObjectsScrollList->setScrollPos(origScrollPosition);
+ }
+
+ mObjectsToBeSelected.clear();
+ mHasObjectsToBeSelected = false;
+
+ updateControlsOnScrollListChange();
+}
+
+LLSD LLFloaterPathfindingObjects::convertObjectsIntoScrollListData(const LLPathfindingObjectListPtr pObjectListPtr)
+{
+ llassert(0);
+ LLSD nullObjs = LLSD::emptyArray();
+ return nullObjs;
+}
+
+void LLFloaterPathfindingObjects::rebuildScrollListAfterAvatarNameLoads(const LLUUID &pAvatarId)
+{
+ std::set<LLUUID>::const_iterator iter = mLoadingAvatarNames.find(pAvatarId);
+ if (iter == mLoadingAvatarNames.end())
+ {
+ mLoadingAvatarNames.insert(pAvatarId);
+ LLAvatarNameCache::get(pAvatarId, boost::bind(&LLFloaterPathfindingObjects::handleAvatarNameLoads, this, _1, _2));
+ }
+}
+
+void LLFloaterPathfindingObjects::updateControlsOnScrollListChange()
+{
+ updateMessagingStatus();
+ updateStateOnListControls();
+ selectScrollListItemsInWorld();
+ updateStateOnActionControls();
+}
+
+void LLFloaterPathfindingObjects::updateControlsOnInWorldSelectionChange()
+{
+ updateStateOnActionControls();
+}
+
+S32 LLFloaterPathfindingObjects::getNameColumnIndex() const
+{
+ return 0;
+}
+
+const LLColor4 &LLFloaterPathfindingObjects::getBeaconColor() const
+{
+ return mDefaultBeaconColor;
+}
+
+const LLColor4 &LLFloaterPathfindingObjects::getBeaconTextColor() const
+{
+ return mDefaultBeaconTextColor;
+}
+
+S32 LLFloaterPathfindingObjects::getBeaconWidth() const
+{
+ return DEFAULT_BEACON_WIDTH;
+}
+
+void LLFloaterPathfindingObjects::showFloaterWithSelectionObjects()
+{
+ mObjectsToBeSelected.clear();
+
+ LLObjectSelectionHandle selectedObjectsHandle = LLSelectMgr::getInstance()->getSelection();
+ if (selectedObjectsHandle.notNull())
+ {
+ LLObjectSelection *selectedObjects = selectedObjectsHandle.get();
+ if (!selectedObjects->isEmpty())
+ {
+ for (LLObjectSelection::valid_iterator objectIter = selectedObjects->valid_begin();
+ objectIter != selectedObjects->valid_end(); ++objectIter)
+ {
+ LLSelectNode *object = *objectIter;
+ LLViewerObject *viewerObject = object->getObject();
+ mObjectsToBeSelected.push_back(viewerObject->getID());
+ }
+ }
+ }
+ mHasObjectsToBeSelected = true;
+
+ if (!isShown())
+ {
+ openFloater();
+ setVisibleAndFrontmost();
+ }
+ else
+ {
+ rebuildObjectsScrollList();
+ if (isMinimized())
+ {
+ setMinimized(FALSE);
+ }
+ setVisibleAndFrontmost();
+ }
+ setFocus(TRUE);
+}
+
+BOOL LLFloaterPathfindingObjects::isShowBeacons() const
+{
+ return mShowBeaconCheckBox->get();
+}
+
+void LLFloaterPathfindingObjects::clearAllObjects()
+{
+ selectNoneObjects();
+ mObjectsScrollList->deleteAllItems();
+ mObjectList.reset();
+}
+
+void LLFloaterPathfindingObjects::selectAllObjects()
+{
+ mObjectsScrollList->selectAll();
+}
+
+void LLFloaterPathfindingObjects::selectNoneObjects()
+{
+ mObjectsScrollList->deselectAllItems();
+}
+
+void LLFloaterPathfindingObjects::teleportToSelectedObject()
+{
+ std::vector<LLScrollListItem*> selectedItems = mObjectsScrollList->getAllSelected();
+ llassert(selectedItems.size() == 1);
+ if (selectedItems.size() == 1)
+ {
+ std::vector<LLScrollListItem*>::const_reference selectedItemRef = selectedItems.front();
+ const LLScrollListItem *selectedItem = selectedItemRef;
+ llassert(mObjectList != NULL);
+ LLVector3d teleportLocation;
+ LLViewerObject *viewerObject = gObjectList.findObject(selectedItem->getUUID());
+ if (viewerObject == NULL)
+ {
+ // If we cannot find the object in the viewer list, teleport to the last reported position
+ const LLPathfindingObjectPtr objectPtr = mObjectList->find(selectedItem->getUUID().asString());
+ teleportLocation = gAgent.getPosGlobalFromAgent(objectPtr->getLocation());
+ }
+ else
+ {
+ // If we can find the object in the viewer list, teleport to the known current position
+ teleportLocation = viewerObject->getPositionGlobal();
+ }
+ gAgent.teleportViaLocationLookAt(teleportLocation);
+ }
+}
+
+LLPathfindingObjectListPtr LLFloaterPathfindingObjects::getEmptyObjectList() const
+{
+ llassert(0);
+ LLPathfindingObjectListPtr objectListPtr(new LLPathfindingObjectList());
+ return objectListPtr;
+}
+
+int LLFloaterPathfindingObjects::getNumSelectedObjects() const
+{
+ return mObjectsScrollList->getNumSelected();
+}
+
+LLPathfindingObjectListPtr LLFloaterPathfindingObjects::getSelectedObjects() const
+{
+ LLPathfindingObjectListPtr selectedObjects = getEmptyObjectList();
+
+ std::vector<LLScrollListItem*> selectedItems = mObjectsScrollList->getAllSelected();
+ if (!selectedItems.empty())
+ {
+ for (std::vector<LLScrollListItem*>::const_iterator itemIter = selectedItems.begin();
+ itemIter != selectedItems.end(); ++itemIter)
+ {
+ LLPathfindingObjectPtr objectPtr = findObject(*itemIter);
+ if (objectPtr != NULL)
+ {
+ selectedObjects->update(objectPtr);
+ }
+ }
+ }
+
+ return selectedObjects;
+}
+
+LLPathfindingObjectPtr LLFloaterPathfindingObjects::getFirstSelectedObject() const
+{
+ LLPathfindingObjectPtr objectPtr;
+
+ std::vector<LLScrollListItem*> selectedItems = mObjectsScrollList->getAllSelected();
+ if (!selectedItems.empty())
+ {
+ objectPtr = findObject(selectedItems.front());
+ }
+
+ return objectPtr;
+}
+
+LLFloaterPathfindingObjects::EMessagingState LLFloaterPathfindingObjects::getMessagingState() const
+{
+ return mMessagingState;
+}
+
+void LLFloaterPathfindingObjects::setMessagingState(EMessagingState pMessagingState)
+{
+ mMessagingState = pMessagingState;
+ updateControlsOnScrollListChange();
+}
+
+void LLFloaterPathfindingObjects::onRefreshObjectsClicked()
+{
+ requestGetObjects();
+}
+
+void LLFloaterPathfindingObjects::onSelectAllObjectsClicked()
+{
+ selectAllObjects();
+}
+
+void LLFloaterPathfindingObjects::onSelectNoneObjectsClicked()
+{
+ selectNoneObjects();
+}
+
+void LLFloaterPathfindingObjects::onTakeClicked()
+{
+ handle_take();
+ requestGetObjects();
+}
+
+void LLFloaterPathfindingObjects::onTakeCopyClicked()
+{
+ handle_take_copy();
+}
+
+void LLFloaterPathfindingObjects::onReturnClicked()
+{
+ LLNotification::Params params("PathfindingReturnMultipleItems");
+ params.functor.function(boost::bind(&LLFloaterPathfindingObjects::handleReturnItemsResponse, this, _1, _2));
+
+ LLSD substitutions;
+ int numItems = getNumSelectedObjects();
+ substitutions["NUM_ITEMS"] = static_cast<LLSD::Integer>(numItems);
+ params.substitutions = substitutions;
+
+ if (numItems == 1)
+ {
+ LLNotifications::getInstance()->forceResponse(params, 0);
+ }
+ else if (numItems > 1)
+ {
+ LLNotifications::getInstance()->add(params);
+ }
+}
+
+void LLFloaterPathfindingObjects::onDeleteClicked()
+{
+ LLNotification::Params params("PathfindingDeleteMultipleItems");
+ params.functor.function(boost::bind(&LLFloaterPathfindingObjects::handleDeleteItemsResponse, this, _1, _2));
+
+ LLSD substitutions;
+ int numItems = getNumSelectedObjects();
+ substitutions["NUM_ITEMS"] = static_cast<LLSD::Integer>(numItems);
+ params.substitutions = substitutions;
+
+ if (numItems == 1)
+ {
+ LLNotifications::getInstance()->forceResponse(params, 0);
+ }
+ else if (numItems > 1)
+ {
+ LLNotifications::getInstance()->add(params);
+ }
+}
+
+void LLFloaterPathfindingObjects::onTeleportClicked()
+{
+ teleportToSelectedObject();
+}
+
+void LLFloaterPathfindingObjects::onScrollListSelectionChanged()
+{
+ updateControlsOnScrollListChange();
+}
+
+void LLFloaterPathfindingObjects::onInWorldSelectionListChanged()
+{
+ updateControlsOnInWorldSelectionChange();
+}
+
+void LLFloaterPathfindingObjects::onRegionBoundaryCrossed()
+{
+ requestGetObjects();
+}
+
+void LLFloaterPathfindingObjects::onGodLevelChange(U8 pGodLevel)
+{
+ requestGetObjects();
+}
+
+void LLFloaterPathfindingObjects::handleAvatarNameLoads(const LLUUID &pAvatarId, const LLAvatarName &pAvatarName)
+{
+ llassert(mLoadingAvatarNames.find(pAvatarId) != mLoadingAvatarNames.end());
+ mLoadingAvatarNames.erase(pAvatarId);
+ if (mLoadingAvatarNames.empty())
+ {
+ rebuildObjectsScrollList();
+ }
+}
+
+void LLFloaterPathfindingObjects::updateMessagingStatus()
+{
+ std::string statusText("");
+ LLStyle::Params styleParams;
+
+ switch (getMessagingState())
+ {
+ case kMessagingUnknown:
+ statusText = getString("messaging_initial");
+ styleParams.color = mErrorTextColor;
+ break;
+ case kMessagingGetRequestSent :
+ statusText = getString("messaging_get_inprogress");
+ styleParams.color = mWarningTextColor;
+ break;
+ case kMessagingGetError :
+ statusText = getString("messaging_get_error");
+ styleParams.color = mErrorTextColor;
+ break;
+ case kMessagingSetRequestSent :
+ statusText = getString("messaging_set_inprogress");
+ styleParams.color = mWarningTextColor;
+ break;
+ case kMessagingSetError :
+ statusText = getString("messaging_set_error");
+ styleParams.color = mErrorTextColor;
+ break;
+ case kMessagingComplete :
+ if (mObjectsScrollList->isEmpty())
+ {
+ statusText = getString("messaging_complete_none_found");
+ }
+ else
+ {
+ S32 numItems = mObjectsScrollList->getItemCount();
+ S32 numSelectedItems = mObjectsScrollList->getNumSelected();
+
+ LLLocale locale(LLStringUtil::getLocale());
+ std::string numItemsString;
+ LLResMgr::getInstance()->getIntegerString(numItemsString, numItems);
+
+ std::string numSelectedItemsString;
+ LLResMgr::getInstance()->getIntegerString(numSelectedItemsString, numSelectedItems);
+
+ LLStringUtil::format_map_t string_args;
+ string_args["[NUM_SELECTED]"] = numSelectedItemsString;
+ string_args["[NUM_TOTAL]"] = numItemsString;
+ statusText = getString("messaging_complete_available", string_args);
+ }
+ break;
+ case kMessagingNotEnabled :
+ statusText = getString("messaging_not_enabled");
+ styleParams.color = mErrorTextColor;
+ break;
+ default:
+ statusText = getString("messaging_initial");
+ styleParams.color = mErrorTextColor;
+ llassert(0);
+ break;
+ }
+
+ mMessagingStatus->setText((LLStringExplicit)statusText, styleParams);
+}
+
+void LLFloaterPathfindingObjects::updateStateOnListControls()
+{
+ switch (getMessagingState())
+ {
+ case kMessagingUnknown:
+ case kMessagingGetRequestSent :
+ case kMessagingSetRequestSent :
+ mRefreshListButton->setEnabled(FALSE);
+ mSelectAllButton->setEnabled(FALSE);
+ mSelectNoneButton->setEnabled(FALSE);
+ break;
+ case kMessagingGetError :
+ case kMessagingSetError :
+ case kMessagingNotEnabled :
+ mRefreshListButton->setEnabled(TRUE);
+ mSelectAllButton->setEnabled(FALSE);
+ mSelectNoneButton->setEnabled(FALSE);
+ break;
+ case kMessagingComplete :
+ {
+ int numItems = mObjectsScrollList->getItemCount();
+ int numSelectedItems = mObjectsScrollList->getNumSelected();
+ mRefreshListButton->setEnabled(TRUE);
+ mSelectAllButton->setEnabled(numSelectedItems < numItems);
+ mSelectNoneButton->setEnabled(numSelectedItems > 0);
+ }
+ break;
+ default:
+ llassert(0);
+ break;
+ }
+}
+
+void LLFloaterPathfindingObjects::updateStateOnActionControls()
+{
+ int numSelectedItems = mObjectsScrollList->getNumSelected();
+ bool isEditEnabled = (numSelectedItems > 0);
+
+ mShowBeaconCheckBox->setEnabled(isEditEnabled);
+ mTakeButton->setEnabled(isEditEnabled && visible_take_object());
+ mTakeCopyButton->setEnabled(isEditEnabled && enable_object_take_copy());
+ mReturnButton->setEnabled(isEditEnabled && enable_object_return());
+ mDeleteButton->setEnabled(isEditEnabled && enable_object_delete());
+ mTeleportButton->setEnabled(numSelectedItems == 1);
+}
+
+void LLFloaterPathfindingObjects::selectScrollListItemsInWorld()
+{
+ mObjectsSelection.clear();
+ LLSelectMgr::getInstance()->deselectAll();
+
+ std::vector<LLScrollListItem *> selectedItems = mObjectsScrollList->getAllSelected();
+ if (!selectedItems.empty())
+ {
+ int numSelectedItems = selectedItems.size();
+
+ std::vector<LLViewerObject *>viewerObjects;
+ viewerObjects.reserve(numSelectedItems);
+
+ for (std::vector<LLScrollListItem *>::const_iterator selectedItemIter = selectedItems.begin();
+ selectedItemIter != selectedItems.end(); ++selectedItemIter)
+ {
+ const LLScrollListItem *selectedItem = *selectedItemIter;
+
+ LLViewerObject *viewerObject = gObjectList.findObject(selectedItem->getUUID());
+ if (viewerObject != NULL)
+ {
+ viewerObjects.push_back(viewerObject);
+ }
+ }
+
+ if (!viewerObjects.empty())
+ {
+ mObjectsSelection = LLSelectMgr::getInstance()->selectObjectAndFamily(viewerObjects);
+ }
+ }
+}
+
+void LLFloaterPathfindingObjects::handleReturnItemsResponse(const LLSD &pNotification, const LLSD &pResponse)
+{
+ if (LLNotificationsUtil::getSelectedOption(pNotification, pResponse) == 0)
+ {
+ handle_object_return();
+ requestGetObjects();
+ }
+}
+
+void LLFloaterPathfindingObjects::handleDeleteItemsResponse(const LLSD &pNotification, const LLSD &pResponse)
+{
+ if (LLNotificationsUtil::getSelectedOption(pNotification, pResponse) == 0)
+ {
+ handle_object_delete();
+ requestGetObjects();
+ }
+}
+
+LLPathfindingObjectPtr LLFloaterPathfindingObjects::findObject(const LLScrollListItem *pListItem) const
+{
+ LLPathfindingObjectPtr objectPtr;
+
+ LLUUID uuid = pListItem->getUUID();
+ const std::string &uuidString = uuid.asString();
+ llassert(mObjectList != NULL);
+ objectPtr = mObjectList->find(uuidString);
+
+ return objectPtr;
+}
diff --git a/indra/newview/llfloaterpathfindingobjects.h b/indra/newview/llfloaterpathfindingobjects.h
new file mode 100644
index 0000000000..e8d446b598
--- /dev/null
+++ b/indra/newview/llfloaterpathfindingobjects.h
@@ -0,0 +1,176 @@
+/**
+* @file llfloaterpathfindingobjects.h
+* @brief Base class for both the pathfinding linksets and characters floater.
+* @author Stinson@lindenlab.com
+*
+* $LicenseInfo:firstyear=2012&license=viewerlgpl$
+* Second Life Viewer Source Code
+* Copyright (C) 2012, Linden Research, Inc.
+*
+* This library is free software; you can redistribute it and/or
+* modify it under the terms of the GNU Lesser General Public
+* License as published by the Free Software Foundation;
+* version 2.1 of the License only.
+*
+* This library is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this library; if not, write to the Free Software
+* 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_LLFLOATERPATHFINDINGOBJECTS_H
+#define LL_LLFLOATERPATHFINDINGOBJECTS_H
+
+#include <set>
+
+#include <boost/signals2.hpp>
+
+#include "llagent.h"
+#include "llfloater.h"
+#include "llpathfindingmanager.h"
+#include "llpathfindingobject.h"
+#include "llpathfindingobjectlist.h"
+#include "llselectmgr.h"
+#include "lluuid.h"
+#include "v4color.h"
+
+class LLAvatarName;
+class LLButton;
+class LLCheckBoxCtrl;
+class LLScrollListCtrl;
+class LLScrollListItem;
+class LLSD;
+class LLTextBase;
+
+class LLFloaterPathfindingObjects : public LLFloater
+{
+public:
+ virtual void onOpen(const LLSD &pKey);
+ virtual void onClose(bool pIsAppQuitting);
+ virtual void draw();
+
+protected:
+ friend class LLFloaterReg;
+
+ typedef enum
+ {
+ kMessagingUnknown,
+ kMessagingGetRequestSent,
+ kMessagingGetError,
+ kMessagingSetRequestSent,
+ kMessagingSetError,
+ kMessagingComplete,
+ kMessagingNotEnabled
+ } EMessagingState;
+
+ LLFloaterPathfindingObjects(const LLSD &pSeed);
+ virtual ~LLFloaterPathfindingObjects();
+
+ virtual BOOL postBuild();
+
+ virtual void requestGetObjects();
+ LLPathfindingManager::request_id_t getNewRequestId();
+ void handleNewObjectList(LLPathfindingManager::request_id_t pRequestId, LLPathfindingManager::ERequestStatus pRequestStatus, LLPathfindingObjectListPtr pObjectList);
+ void handleUpdateObjectList(LLPathfindingManager::request_id_t pRequestId, LLPathfindingManager::ERequestStatus pRequestStatus, LLPathfindingObjectListPtr pObjectList);
+
+ void rebuildObjectsScrollList();
+ virtual LLSD convertObjectsIntoScrollListData(const LLPathfindingObjectListPtr pObjectListPtr);
+
+ void rebuildScrollListAfterAvatarNameLoads(const LLUUID &pAvatarId);
+
+ virtual void updateControlsOnScrollListChange();
+ virtual void updateControlsOnInWorldSelectionChange();
+
+ virtual S32 getNameColumnIndex() const;
+ virtual const LLColor4 &getBeaconColor() const;
+ virtual const LLColor4 &getBeaconTextColor() const;
+ virtual S32 getBeaconWidth() const;
+
+ void showFloaterWithSelectionObjects();
+
+ BOOL isShowBeacons() const;
+ void clearAllObjects();
+ void selectAllObjects();
+ void selectNoneObjects();
+ void teleportToSelectedObject();
+
+ virtual LLPathfindingObjectListPtr getEmptyObjectList() const;
+ int getNumSelectedObjects() const;
+ LLPathfindingObjectListPtr getSelectedObjects() const;
+ LLPathfindingObjectPtr getFirstSelectedObject() const;
+
+ EMessagingState getMessagingState() const;
+
+private:
+ LLFloaterPathfindingObjects(const LLFloaterPathfindingObjects &pOther);
+
+ void setMessagingState(EMessagingState pMessagingState);
+
+ void onRefreshObjectsClicked();
+ void onSelectAllObjectsClicked();
+ void onSelectNoneObjectsClicked();
+ void onTakeClicked();
+ void onTakeCopyClicked();
+ void onReturnClicked();
+ void onDeleteClicked();
+ void onTeleportClicked();
+
+ void onScrollListSelectionChanged();
+ void onInWorldSelectionListChanged();
+ void onRegionBoundaryCrossed();
+ void onGodLevelChange(U8 pGodLevel);
+
+ void handleAvatarNameLoads(const LLUUID &pAvatarId, const LLAvatarName &pAvatarName);
+
+ void updateMessagingStatus();
+ void updateStateOnListControls();
+ void updateStateOnActionControls();
+ void selectScrollListItemsInWorld();
+
+ void handleReturnItemsResponse(const LLSD &pNotification, const LLSD &pResponse);
+ void handleDeleteItemsResponse(const LLSD &pNotification, const LLSD &pResponse);
+
+ LLPathfindingObjectPtr findObject(const LLScrollListItem *pListItem) const;
+
+ LLScrollListCtrl *mObjectsScrollList;
+ LLTextBase *mMessagingStatus;
+ LLButton *mRefreshListButton;
+ LLButton *mSelectAllButton;
+ LLButton *mSelectNoneButton;
+ LLCheckBoxCtrl *mShowBeaconCheckBox;
+
+ LLButton *mTakeButton;
+ LLButton *mTakeCopyButton;
+ LLButton *mReturnButton;
+ LLButton *mDeleteButton;
+ LLButton *mTeleportButton;
+
+ std::set<LLUUID> mLoadingAvatarNames;
+
+ LLColor4 mDefaultBeaconColor;
+ LLColor4 mDefaultBeaconTextColor;
+ LLColor4 mErrorTextColor;
+ LLColor4 mWarningTextColor;
+
+ EMessagingState mMessagingState;
+ LLPathfindingManager::request_id_t mMessagingRequestId;
+
+ LLPathfindingObjectListPtr mObjectList;
+
+ LLObjectSelectionHandle mObjectsSelection;
+
+ bool mHasObjectsToBeSelected;
+ uuid_vec_t mObjectsToBeSelected;
+
+ boost::signals2::connection mSelectionUpdateSlot;
+ boost::signals2::connection mRegionBoundaryCrossingSlot;
+ LLAgent::god_level_change_slot_t mGodLevelChangeSlot;
+};
+
+#endif // LL_LLFLOATERPATHFINDINGOBJECTS_H
diff --git a/indra/newview/llfloaterpreference.cpp b/indra/newview/llfloaterpreference.cpp
index 173b0e538c..5752f839ce 100755
--- a/indra/newview/llfloaterpreference.cpp
+++ b/indra/newview/llfloaterpreference.cpp
@@ -35,7 +35,7 @@
#include "llfloaterpreference.h"
#include "message.h"
-
+#include "llfloaterautoreplacesettings.h"
#include "llagent.h"
#include "llavatarconstants.h"
#include "llcheckboxctrl.h"
@@ -77,7 +77,7 @@
#include "llviewerthrottle.h"
#include "llvotree.h"
#include "llvosky.h"
-
+#include "llfloaterpathfindingconsole.h"
// linden library includes
#include "llavatarnamecache.h"
#include "llerror.h"
@@ -346,7 +346,9 @@ LLFloaterPreference::LLFloaterPreference(const LLSD& key)
mCommitCallbackRegistrar.add("Pref.BlockList", boost::bind(&LLFloaterPreference::onClickBlockList, this));
mCommitCallbackRegistrar.add("Pref.Proxy", boost::bind(&LLFloaterPreference::onClickProxySettings, this));
mCommitCallbackRegistrar.add("Pref.TranslationSettings", boost::bind(&LLFloaterPreference::onClickTranslationSettings, this));
-
+ mCommitCallbackRegistrar.add("Pref.AutoReplace", boost::bind(&LLFloaterPreference::onClickAutoReplace, this));
+ mCommitCallbackRegistrar.add("Pref.SpellChecker", boost::bind(&LLFloaterPreference::onClickSpellChecker, this));
+
sSkin = gSavedSettings.getString("SkinCurrent");
mCommitCallbackRegistrar.add("Pref.ClickActionChange", boost::bind(&LLFloaterPreference::onClickActionChange, this));
@@ -354,7 +356,7 @@ LLFloaterPreference::LLFloaterPreference(const LLSD& key)
gSavedSettings.getControl("NameTagShowUsernames")->getCommitSignal()->connect(boost::bind(&handleNameTagOptionChanged, _2));
gSavedSettings.getControl("NameTagShowFriends")->getCommitSignal()->connect(boost::bind(&handleNameTagOptionChanged, _2));
gSavedSettings.getControl("UseDisplayNames")->getCommitSignal()->connect(boost::bind(&handleDisplayNamesOptionChanged, _2));
-
+
LLAvatarPropertiesProcessor::getInstance()->addObserver( gAgent.getID(), this );
}
@@ -435,6 +437,8 @@ BOOL LLFloaterPreference::postBuild()
gSavedSettings.getControl("ChatBubbleOpacity")->getSignal()->connect(boost::bind(&LLFloaterPreference::onNameTagOpacityChange, this, _2));
+ gSavedSettings.getControl("PreferredMaturity")->getSignal()->connect(boost::bind(&LLFloaterPreference::onChangeMaturity, this));
+
LLTabContainer* tabcontainer = getChild<LLTabContainer>("pref core");
if (!tabcontainer->selectTab(gSavedSettings.getS32("LastPrefTab")))
tabcontainer->selectFirstTab();
@@ -604,6 +608,9 @@ void LLFloaterPreference::cancel()
// hide translation settings floater
LLFloaterReg::hideInstance("prefs_translation");
+ // hide translation settings floater
+ LLFloaterReg::hideInstance("prefs_autoreplace");
+
// cancel hardware menu
LLFloaterHardwareSettings* hardware_settings = LLFloaterReg::getTypedInstance<LLFloaterHardwareSettings>("prefs_hardware_settings");
if (hardware_settings)
@@ -625,6 +632,13 @@ void LLFloaterPreference::cancel()
{
advanced_proxy_settings->cancel();
}
+ //Need to reload the navmesh if the pathing console is up
+ LLHandle<LLFloaterPathfindingConsole> pathfindingConsoleHandle = LLFloaterPathfindingConsole::getInstanceHandle();
+ if ( !pathfindingConsoleHandle.isDead() )
+ {
+ LLFloaterPathfindingConsole* pPathfindingConsole = pathfindingConsoleHandle.get();
+ pPathfindingConsole->onRegionBoundaryCross();
+ }
}
void LLFloaterPreference::onOpen(const LLSD& key)
@@ -772,7 +786,15 @@ void LLFloaterPreference::onBtnOK()
llinfos << "Can't close preferences!" << llendl;
}
- LLPanelLogin::updateLocationCombo( false );
+ LLPanelLogin::updateLocationSelectorsVisibility();
+ //Need to reload the navmesh if the pathing console is up
+ LLHandle<LLFloaterPathfindingConsole> pathfindingConsoleHandle = LLFloaterPathfindingConsole::getInstanceHandle();
+ if ( !pathfindingConsoleHandle.isDead() )
+ {
+ LLFloaterPathfindingConsole* pPathfindingConsole = pathfindingConsoleHandle.get();
+ pPathfindingConsole->onRegionBoundaryCross();
+ }
+
}
// static
@@ -789,7 +811,7 @@ void LLFloaterPreference::onBtnApply( )
apply();
saveSettings();
- LLPanelLogin::updateLocationCombo( false );
+ LLPanelLogin::updateLocationSelectorsVisibility();
}
// static
@@ -931,7 +953,6 @@ void LLFloaterPreference::refreshSkin(void* data)
self->getChild<LLRadioGroup>("skin_selection", true)->setValue(sSkin);
}
-
void LLFloaterPreference::buildPopupLists()
{
LLScrollListCtrl& disabled_popups =
@@ -1515,6 +1536,16 @@ void LLFloaterPreference::onClickTranslationSettings()
LLFloaterReg::showInstance("prefs_translation");
}
+void LLFloaterPreference::onClickAutoReplace()
+{
+ LLFloaterReg::showInstance("prefs_autoreplace");
+}
+
+void LLFloaterPreference::onClickSpellChecker()
+{
+ LLFloaterReg::showInstance("prefs_spellchecker");
+}
+
void LLFloaterPreference::onClickActionChange()
{
mClickActionDirty = true;
diff --git a/indra/newview/llfloaterpreference.h b/indra/newview/llfloaterpreference.h
index ec5994e917..b71f7c647b 100644
--- a/indra/newview/llfloaterpreference.h
+++ b/indra/newview/llfloaterpreference.h
@@ -157,6 +157,8 @@ public:
void onClickBlockList();
void onClickProxySettings();
void onClickTranslationSettings();
+ void onClickAutoReplace();
+ void onClickSpellChecker();
void applyUIColor(LLUICtrl* ctrl, const LLSD& param);
void getUIColor(LLUICtrl* ctrl, const LLSD& param);
diff --git a/indra/newview/llfloaterregioninfo.cpp b/indra/newview/llfloaterregioninfo.cpp
index 17850ff35d..fe29bb38c7 100644
--- a/indra/newview/llfloaterregioninfo.cpp
+++ b/indra/newview/llfloaterregioninfo.cpp
@@ -287,8 +287,7 @@ void LLFloaterRegionInfo::processEstateOwnerRequest(LLMessageSystem* msg,void**)
//dispatch the message
dispatch.dispatch(request, invoice, strings);
- LLViewerRegion* region = gAgent.getRegion();
- panel->updateControls(region);
+ panel->updateControls(gAgent.getRegion());
}
@@ -1924,10 +1923,18 @@ void LLPanelEstateInfo::updateControls(LLViewerRegion* region)
BOOL manager = (region && region->isEstateManager());
setCtrlsEnabled(god || owner || manager);
+ BOOL has_allowed_avatar = getChild<LLNameListCtrl>("allowed_avatar_name_list")->getFirstSelected() ? TRUE : FALSE;
+ BOOL has_allowed_group = getChild<LLNameListCtrl>("allowed_group_name_list")->getFirstSelected() ? TRUE : FALSE;
+ BOOL has_banned_agent = getChild<LLNameListCtrl>("banned_avatar_name_list")->getFirstSelected() ? TRUE : FALSE;
+ BOOL has_estate_manager = getChild<LLNameListCtrl>("estate_manager_name_list")->getFirstSelected() ? TRUE : FALSE;
+
getChildView("add_allowed_avatar_btn")->setEnabled(god || owner || manager);
- getChildView("remove_allowed_avatar_btn")->setEnabled(god || owner || manager);
+ getChildView("remove_allowed_avatar_btn")->setEnabled(has_allowed_avatar && (god || owner || manager));
+ getChildView("allowed_avatar_name_list")->setEnabled(god || owner || manager);
+
getChildView("add_allowed_group_btn")->setEnabled(god || owner || manager);
- getChildView("remove_allowed_group_btn")->setEnabled(god || owner || manager);
+ getChildView("remove_allowed_group_btn")->setEnabled(has_allowed_group && (god || owner || manager) );
+ getChildView("allowed_group_name_list")->setEnabled(god || owner || manager);
// Can't ban people from mainland, orientation islands, etc. because this
// creates much network traffic and server load.
@@ -1935,14 +1942,15 @@ void LLPanelEstateInfo::updateControls(LLViewerRegion* region)
bool linden_estate = isLindenEstate();
bool enable_ban = (god || owner || manager) && !linden_estate;
getChildView("add_banned_avatar_btn")->setEnabled(enable_ban);
- getChildView("remove_banned_avatar_btn")->setEnabled(enable_ban);
+ getChildView("remove_banned_avatar_btn")->setEnabled(has_banned_agent && enable_ban);
+ getChildView("banned_avatar_name_list")->setEnabled(god || owner || manager);
getChildView("message_estate_btn")->setEnabled(god || owner || manager);
getChildView("kick_user_from_estate_btn")->setEnabled(god || owner || manager);
// estate managers can't add estate managers
getChildView("add_estate_manager_btn")->setEnabled(god || owner);
- getChildView("remove_estate_manager_btn")->setEnabled(god || owner);
+ getChildView("remove_estate_manager_btn")->setEnabled(has_estate_manager && (god || owner));
getChildView("estate_manager_name_list")->setEnabled(god || owner);
refresh();
@@ -1979,10 +1987,8 @@ bool LLPanelEstateInfo::refreshFromRegion(LLViewerRegion* region)
void LLPanelEstateInfo::updateChild(LLUICtrl* child_ctrl)
{
- if (checkRemovalButton(child_ctrl->getName()))
- {
- // do nothing
- }
+ // Ensure appropriate state of the management ui.
+ updateControls(gAgent.getRegion());
}
bool LLPanelEstateInfo::estateUpdate(LLMessageSystem* msg)
@@ -2080,23 +2086,8 @@ void LLPanelEstateInfo::refreshFromEstate()
getChild<LLUICtrl>("limit_payment")->setValue(estate_info.getDenyAnonymous());
getChild<LLUICtrl>("limit_age_verified")->setValue(estate_info.getDenyAgeUnverified());
- // If visible from mainland, disable the access allowed
- // UI, as anyone can teleport there.
- // However, gods need to be able to edit the access list for
- // linden estates, regardless of visibility, to allow object
- // and L$ transfers.
- {
- bool visible_from_mainland = estate_info.getIsExternallyVisible();
- bool god = gAgent.isGodlike();
- bool linden_estate = isLindenEstate();
-
- bool enable_agent = (!visible_from_mainland || (god && linden_estate));
- bool enable_group = enable_agent;
- bool enable_ban = !linden_estate;
-
- setAccessAllowedEnabled(enable_agent, enable_group, enable_ban);
- }
-
+ // Ensure appriopriate state of the management UI
+ updateControls(gAgent.getRegion());
refresh();
}
@@ -2225,47 +2216,6 @@ void LLPanelEstateInfo::setOwnerName(const std::string& name)
getChild<LLUICtrl>("estate_owner")->setValue(LLSD(name));
}
-void LLPanelEstateInfo::setAccessAllowedEnabled(bool enable_agent,
- bool enable_group,
- bool enable_ban)
-{
- getChildView("allow_resident_label")->setEnabled(enable_agent);
- getChildView("allowed_avatar_name_list")->setEnabled(enable_agent);
- getChildView("allowed_avatar_name_list")->setVisible( enable_agent);
- getChildView("add_allowed_avatar_btn")->setEnabled(enable_agent);
- getChildView("remove_allowed_avatar_btn")->setEnabled(enable_agent);
-
- // Groups
- getChildView("allow_group_label")->setEnabled(enable_group);
- getChildView("allowed_group_name_list")->setEnabled(enable_group);
- getChildView("allowed_group_name_list")->setVisible( enable_group);
- getChildView("add_allowed_group_btn")->setEnabled(enable_group);
- getChildView("remove_allowed_group_btn")->setEnabled(enable_group);
-
- // Ban
- getChildView("ban_resident_label")->setEnabled(enable_ban);
- getChildView("banned_avatar_name_list")->setEnabled(enable_ban);
- getChildView("banned_avatar_name_list")->setVisible( enable_ban);
- getChildView("add_banned_avatar_btn")->setEnabled(enable_ban);
- getChildView("remove_banned_avatar_btn")->setEnabled(enable_ban);
-
- // Update removal buttons if needed
- if (enable_agent)
- {
- checkRemovalButton("allowed_avatar_name_list");
- }
-
- if (enable_group)
- {
- checkRemovalButton("allowed_group_name_list");
- }
-
- if (enable_ban)
- {
- checkRemovalButton("banned_avatar_name_list");
- }
-}
-
void LLPanelEstateInfo::clearAccessLists()
{
LLNameListCtrl* name_list = getChild<LLNameListCtrl>("allowed_avatar_name_list");
@@ -2279,39 +2229,7 @@ void LLPanelEstateInfo::clearAccessLists()
{
name_list->deleteAllItems();
}
-}
-
-// enables/disables the "remove" button for the various allow/ban lists
-BOOL LLPanelEstateInfo::checkRemovalButton(std::string name)
-{
- std::string btn_name = "";
- if (name == "allowed_avatar_name_list")
- {
- btn_name = "remove_allowed_avatar_btn";
- }
- else if (name == "allowed_group_name_list")
- {
- btn_name = "remove_allowed_group_btn";
- }
- else if (name == "banned_avatar_name_list")
- {
- btn_name = "remove_banned_avatar_btn";
- }
- else if (name == "estate_manager_name_list")
- {
- //ONLY OWNER CAN ADD /DELET ESTATE MANAGER
- LLViewerRegion* region = gAgent.getRegion();
- if (region && (region->getOwner() == gAgent.getID()))
- {
- btn_name = "remove_estate_manager_btn";
- }
- }
-
- // enable the remove button if something is selected
- LLNameListCtrl* name_list = getChild<LLNameListCtrl>(name);
- getChildView(btn_name)->setEnabled(name_list && name_list->getFirstSelected() ? TRUE : FALSE);
-
- return (btn_name != "");
+ updateControls(gAgent.getRegion());
}
// static
@@ -2792,15 +2710,15 @@ bool LLDispatchSetEstateAccess::operator()(
if (allowed_agent_name_list)
{
- //allowed_agent_name_list->deleteAllItems();
+ // Don't sort these as we add them, sort them when we are done.
+ allowed_agent_name_list->clearSortOrder();
for (S32 i = 0; i < num_allowed_agents && i < ESTATE_MAX_ACCESS_IDS; i++)
{
LLUUID id;
memcpy(id.mData, strings[index++].data(), UUID_BYTES); /* Flawfinder: ignore */
allowed_agent_name_list->addNameItem(id);
}
- panel->getChildView("remove_allowed_avatar_btn")->setEnabled(allowed_agent_name_list->getFirstSelected() ? TRUE : FALSE);
- allowed_agent_name_list->sortByColumnIndex(0, TRUE);
+ allowed_agent_name_list->sortByName(TRUE);
}
}
@@ -2817,6 +2735,8 @@ bool LLDispatchSetEstateAccess::operator()(
if (allowed_group_name_list)
{
+ // Don't sort these as we add them, sort them when we are done.
+ allowed_group_name_list->clearSortOrder();
allowed_group_name_list->deleteAllItems();
for (S32 i = 0; i < num_allowed_groups && i < ESTATE_MAX_GROUP_IDS; i++)
{
@@ -2824,8 +2744,7 @@ bool LLDispatchSetEstateAccess::operator()(
memcpy(id.mData, strings[index++].data(), UUID_BYTES); /* Flawfinder: ignore */
allowed_group_name_list->addGroupNameItem(id);
}
- panel->getChildView("remove_allowed_group_btn")->setEnabled(allowed_group_name_list->getFirstSelected() ? TRUE : FALSE);
- allowed_group_name_list->sortByColumnIndex(0, TRUE);
+ allowed_group_name_list->sortByName(TRUE);
}
}
@@ -2849,15 +2768,16 @@ bool LLDispatchSetEstateAccess::operator()(
if (banned_agent_name_list)
{
- //banned_agent_name_list->deleteAllItems();
+ // Don't sort these as we add them, sort them when we are done.
+ banned_agent_name_list->clearSortOrder();
+
for (S32 i = 0; i < num_banned_agents && i < ESTATE_MAX_ACCESS_IDS; i++)
{
LLUUID id;
memcpy(id.mData, strings[index++].data(), UUID_BYTES); /* Flawfinder: ignore */
banned_agent_name_list->addNameItem(id);
}
- panel->getChildView("remove_banned_avatar_btn")->setEnabled(banned_agent_name_list->getFirstSelected() ? TRUE : FALSE);
- banned_agent_name_list->sortByColumnIndex(0, TRUE);
+ banned_agent_name_list->sortByName(TRUE);
}
}
@@ -2872,6 +2792,9 @@ bool LLDispatchSetEstateAccess::operator()(
panel->getChild<LLNameListCtrl>("estate_manager_name_list");
if (estate_manager_name_list)
{
+ // Don't sort these as we add them, sort them when we are done.
+ estate_manager_name_list->clearSortOrder();
+
estate_manager_name_list->deleteAllItems(); // Clear existing entries
// There should be only ESTATE_MAX_MANAGERS people in the list, but if the database gets more (SL-46107) don't
@@ -2883,11 +2806,13 @@ bool LLDispatchSetEstateAccess::operator()(
memcpy(id.mData, strings[index++].data(), UUID_BYTES); /* Flawfinder: ignore */
estate_manager_name_list->addNameItem(id);
}
- panel->getChildView("remove_estate_manager_btn")->setEnabled(estate_manager_name_list->getFirstSelected() ? TRUE : FALSE);
- estate_manager_name_list->sortByColumnIndex(0, TRUE);
+ estate_manager_name_list->sortByName(TRUE);
}
}
+ // Update the buttons which may change based on the list contents but also needs to account for general access features.
+ panel->updateControls(gAgent.getRegion());
+
return true;
}
diff --git a/indra/newview/llfloaterregioninfo.h b/indra/newview/llfloaterregioninfo.h
index e36ef4604b..f0499f1903 100644
--- a/indra/newview/llfloaterregioninfo.h
+++ b/indra/newview/llfloaterregioninfo.h
@@ -312,9 +312,6 @@ public:
const std::string getOwnerName() const;
void setOwnerName(const std::string& name);
- // If visible from mainland, allowed agent and allowed groups
- // are ignored, so must disable UI.
- void setAccessAllowedEnabled(bool enable_agent, bool enable_group, bool enable_ban);
protected:
virtual BOOL sendUpdate();
// confirmation dialog callback
@@ -324,7 +321,6 @@ protected:
void commitEstateManagers();
void clearAccessLists();
- BOOL checkRemovalButton(std::string name);
BOOL checkSunHourSlider(LLUICtrl* child_ctrl);
U32 mEstateID;
diff --git a/indra/newview/llfloaterspellchecksettings.cpp b/indra/newview/llfloaterspellchecksettings.cpp
new file mode 100644
index 0000000000..5ecdd11918
--- /dev/null
+++ b/indra/newview/llfloaterspellchecksettings.cpp
@@ -0,0 +1,491 @@
+/**
+ * @file llfloaterspellchecksettings.h
+ * @brief Spell checker settings floater
+ *
+* $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 "llcombobox.h"
+#include "llfilepicker.h"
+#include "llfloaterreg.h"
+#include "llfloaterspellchecksettings.h"
+#include "llscrolllistctrl.h"
+#include "llsdserialize.h"
+#include "llspellcheck.h"
+#include "lltrans.h"
+#include "llviewercontrol.h"
+#include "llnotificationsutil.h"
+
+#include <boost/algorithm/string.hpp>
+
+///----------------------------------------------------------------------------
+/// Class LLFloaterSpellCheckerSettings
+///----------------------------------------------------------------------------
+LLFloaterSpellCheckerSettings::LLFloaterSpellCheckerSettings(const LLSD& key)
+ : LLFloater(key)
+{
+}
+
+void LLFloaterSpellCheckerSettings::draw()
+{
+ LLFloater::draw();
+
+ std::vector<LLScrollListItem*> sel_items = getChild<LLScrollListCtrl>("spellcheck_available_list")->getAllSelected();
+ bool enable_remove = !sel_items.empty();
+ for (std::vector<LLScrollListItem*>::const_iterator sel_it = sel_items.begin(); sel_it != sel_items.end(); ++sel_it)
+ {
+ enable_remove &= LLSpellChecker::canRemoveDictionary((*sel_it)->getValue().asString());
+ }
+ getChild<LLUICtrl>("spellcheck_remove_btn")->setEnabled(enable_remove);
+}
+
+BOOL LLFloaterSpellCheckerSettings::postBuild(void)
+{
+ gSavedSettings.getControl("SpellCheck")->getSignal()->connect(boost::bind(&LLFloaterSpellCheckerSettings::refreshDictionaries, this, false));
+ LLSpellChecker::setSettingsChangeCallback(boost::bind(&LLFloaterSpellCheckerSettings::onSpellCheckSettingsChange, this));
+ getChild<LLUICtrl>("spellcheck_remove_btn")->setCommitCallback(boost::bind(&LLFloaterSpellCheckerSettings::onBtnRemove, this));
+ getChild<LLUICtrl>("spellcheck_import_btn")->setCommitCallback(boost::bind(&LLFloaterSpellCheckerSettings::onBtnImport, this));
+ getChild<LLUICtrl>("spellcheck_main_combo")->setCommitCallback(boost::bind(&LLFloaterSpellCheckerSettings::refreshDictionaries, this, false));
+ getChild<LLUICtrl>("spellcheck_moveleft_btn")->setCommitCallback(boost::bind(&LLFloaterSpellCheckerSettings::onBtnMove, this, "spellcheck_active_list", "spellcheck_available_list"));
+ getChild<LLUICtrl>("spellcheck_moveright_btn")->setCommitCallback(boost::bind(&LLFloaterSpellCheckerSettings::onBtnMove, this, "spellcheck_available_list", "spellcheck_active_list"));
+ center();
+ return true;
+}
+
+void LLFloaterSpellCheckerSettings::onBtnImport()
+{
+ LLFloaterReg::showInstance("prefs_spellchecker_import");
+}
+
+void LLFloaterSpellCheckerSettings::onBtnMove(const std::string& from, const std::string& to)
+{
+ LLScrollListCtrl* from_ctrl = findChild<LLScrollListCtrl>(from);
+ LLScrollListCtrl* to_ctrl = findChild<LLScrollListCtrl>(to);
+
+ LLSD row;
+ row["columns"][0]["column"] = "name";
+
+ std::vector<LLScrollListItem*> sel_items = from_ctrl->getAllSelected();
+ std::vector<LLScrollListItem*>::const_iterator sel_it;
+ for ( sel_it = sel_items.begin(); sel_it != sel_items.end(); ++sel_it)
+ {
+ row["value"] = (*sel_it)->getValue();
+ row["columns"][0]["value"] = (*sel_it)->getColumn(0)->getValue();
+ to_ctrl->addElement(row);
+ to_ctrl->setSelectedByValue( (*sel_it)->getValue(), true );
+ }
+ from_ctrl->deleteSelectedItems();
+}
+
+void LLFloaterSpellCheckerSettings::onClose(bool app_quitting)
+{
+ if (app_quitting)
+ {
+ // don't save anything
+ return;
+ }
+ LLFloaterReg::hideInstance("prefs_spellchecker_import");
+
+ std::list<std::string> list_dict;
+
+ LLComboBox* dict_combo = findChild<LLComboBox>("spellcheck_main_combo");
+ const std::string dict_name = dict_combo->getSelectedItemLabel();
+ if (!dict_name.empty())
+ {
+ list_dict.push_back(dict_name);
+
+ LLScrollListCtrl* list_ctrl = findChild<LLScrollListCtrl>("spellcheck_active_list");
+ std::vector<LLScrollListItem*> list_items = list_ctrl->getAllData();
+ for (std::vector<LLScrollListItem*>::const_iterator item_it = list_items.begin(); item_it != list_items.end(); ++item_it)
+ {
+ const std::string language = (*item_it)->getValue().asString();
+ if (LLSpellChecker::hasDictionary(language, true))
+ {
+ list_dict.push_back(language);
+ }
+ }
+ }
+ gSavedSettings.setString("SpellCheckDictionary", boost::join(list_dict, ","));
+}
+
+void LLFloaterSpellCheckerSettings::onOpen(const LLSD& key)
+{
+ refreshDictionaries(true);
+}
+
+void LLFloaterSpellCheckerSettings::onBtnRemove()
+{
+ std::vector<LLScrollListItem*> sel_items = getChild<LLScrollListCtrl>("spellcheck_available_list")->getAllSelected();
+ for (std::vector<LLScrollListItem*>::const_iterator sel_it = sel_items.begin(); sel_it != sel_items.end(); ++sel_it)
+ {
+ LLSpellChecker::instance().removeDictionary((*sel_it)->getValue().asString());
+ }
+}
+
+void LLFloaterSpellCheckerSettings::onSpellCheckSettingsChange()
+{
+ refreshDictionaries(true);
+}
+
+void LLFloaterSpellCheckerSettings::refreshDictionaries(bool from_settings)
+{
+ bool enabled = gSavedSettings.getBOOL("SpellCheck");
+ getChild<LLUICtrl>("spellcheck_moveleft_btn")->setEnabled(enabled);
+ getChild<LLUICtrl>("spellcheck_moveright_btn")->setEnabled(enabled);
+
+ // Populate the dictionary combobox
+ LLComboBox* dict_combo = findChild<LLComboBox>("spellcheck_main_combo");
+ std::string dict_cur = dict_combo->getSelectedItemLabel();
+ if ((dict_cur.empty() || from_settings) && (LLSpellChecker::getUseSpellCheck()))
+ {
+ dict_cur = LLSpellChecker::instance().getPrimaryDictionary();
+ }
+ dict_combo->clearRows();
+
+ const LLSD& dict_map = LLSpellChecker::getDictionaryMap();
+ if (dict_map.size())
+ {
+ for (LLSD::array_const_iterator dict_it = dict_map.beginArray(); dict_it != dict_map.endArray(); ++dict_it)
+ {
+ const LLSD& dict = *dict_it;
+ if ( (dict["installed"].asBoolean()) && (dict["is_primary"].asBoolean()) && (dict.has("language")) )
+ {
+ dict_combo->add(dict["language"].asString());
+ }
+ }
+ if (!dict_combo->selectByValue(dict_cur))
+ {
+ dict_combo->clear();
+ }
+ }
+ dict_combo->sortByName();
+ dict_combo->setEnabled(enabled);
+
+ // Populate the available and active dictionary list
+ LLScrollListCtrl* avail_ctrl = findChild<LLScrollListCtrl>("spellcheck_available_list");
+ LLScrollListCtrl* active_ctrl = findChild<LLScrollListCtrl>("spellcheck_active_list");
+
+ LLSpellChecker::dict_list_t active_list;
+ if ( ((!avail_ctrl->getItemCount()) && (!active_ctrl->getItemCount())) || (from_settings) )
+ {
+ if (LLSpellChecker::getUseSpellCheck())
+ {
+ active_list = LLSpellChecker::instance().getSecondaryDictionaries();
+ }
+ }
+ else
+ {
+ std::vector<LLScrollListItem*> active_items = active_ctrl->getAllData();
+ for (std::vector<LLScrollListItem*>::const_iterator item_it = active_items.begin(); item_it != active_items.end(); ++item_it)
+ {
+ std::string dict = (*item_it)->getValue().asString();
+ if (dict_cur != dict)
+ {
+ active_list.push_back(dict);
+ }
+ }
+ }
+
+ LLSD row;
+ row["columns"][0]["column"] = "name";
+
+ active_ctrl->clearRows();
+ active_ctrl->setEnabled(enabled);
+ for (LLSpellChecker::dict_list_t::const_iterator it = active_list.begin(); it != active_list.end(); ++it)
+ {
+ const std::string language = *it;
+ const LLSD dict = LLSpellChecker::getDictionaryData(language);
+ row["value"] = language;
+ row["columns"][0]["value"] = (!dict["user_installed"].asBoolean()) ? language : language + " " + LLTrans::getString("UserDictionary");
+ active_ctrl->addElement(row);
+ }
+ active_ctrl->sortByColumnIndex(0, true);
+ active_list.push_back(dict_cur);
+
+ avail_ctrl->clearRows();
+ avail_ctrl->setEnabled(enabled);
+ for (LLSD::array_const_iterator dict_it = dict_map.beginArray(); dict_it != dict_map.endArray(); ++dict_it)
+ {
+ const LLSD& dict = *dict_it;
+ const std::string language = dict["language"].asString();
+ if ( (dict["installed"].asBoolean()) && (active_list.end() == std::find(active_list.begin(), active_list.end(), language)) )
+ {
+ row["value"] = language;
+ row["columns"][0]["value"] = (!dict["user_installed"].asBoolean()) ? language : language + " " + LLTrans::getString("UserDictionary");
+ avail_ctrl->addElement(row);
+ }
+ }
+ avail_ctrl->sortByColumnIndex(0, true);
+}
+
+///----------------------------------------------------------------------------
+/// Class LLFloaterSpellCheckerImport
+///----------------------------------------------------------------------------
+LLFloaterSpellCheckerImport::LLFloaterSpellCheckerImport(const LLSD& key)
+ : LLFloater(key)
+{
+}
+
+BOOL LLFloaterSpellCheckerImport::postBuild(void)
+{
+ getChild<LLUICtrl>("dictionary_path_browse")->setCommitCallback(boost::bind(&LLFloaterSpellCheckerImport::onBtnBrowse, this));
+ getChild<LLUICtrl>("ok_btn")->setCommitCallback(boost::bind(&LLFloaterSpellCheckerImport::onBtnOK, this));
+ getChild<LLUICtrl>("cancel_btn")->setCommitCallback(boost::bind(&LLFloaterSpellCheckerImport::onBtnCancel, this));
+ center();
+ return true;
+}
+
+void LLFloaterSpellCheckerImport::onBtnBrowse()
+{
+ LLFilePicker& file_picker = LLFilePicker::instance();
+ if (!file_picker.getOpenFile(LLFilePicker::FFLOAD_DICTIONARY))
+ {
+ return;
+ }
+
+ std::string filepath = file_picker.getFirstFile();
+
+ const std::string extension = gDirUtilp->getExtension(filepath);
+ if ("xcu" == extension)
+ {
+ filepath = parseXcuFile(filepath);
+ if (filepath.empty())
+ {
+ return;
+ }
+ }
+
+ getChild<LLUICtrl>("dictionary_path")->setValue(filepath);
+
+ mDictionaryDir = gDirUtilp->getDirName(filepath);
+ mDictionaryBasename = gDirUtilp->getBaseFileName(filepath, true);
+ getChild<LLUICtrl>("dictionary_name")->setValue(mDictionaryBasename);
+}
+
+void LLFloaterSpellCheckerImport::onBtnCancel()
+{
+ closeFloater(false);
+}
+
+void LLFloaterSpellCheckerImport::onBtnOK()
+{
+ const std::string dict_dic = mDictionaryDir + gDirUtilp->getDirDelimiter() + mDictionaryBasename + ".dic";
+ const std::string dict_aff = mDictionaryDir + gDirUtilp->getDirDelimiter() + mDictionaryBasename + ".aff";
+ std::string dict_language = getChild<LLUICtrl>("dictionary_language")->getValue().asString();
+ LLStringUtil::trim(dict_language);
+
+ bool imported = false;
+ if ( dict_language.empty()
+ || mDictionaryDir.empty()
+ || mDictionaryBasename.empty()
+ || ! gDirUtilp->fileExists(dict_dic)
+ )
+ {
+ LLNotificationsUtil::add("SpellingDictImportRequired");
+ }
+ else
+ {
+ std::string settings_dic = LLSpellChecker::getDictionaryUserPath() + mDictionaryBasename + ".dic";
+ if ( copyFile( dict_dic, settings_dic ) )
+ {
+ if (gDirUtilp->fileExists(dict_aff))
+ {
+ std::string settings_aff = LLSpellChecker::getDictionaryUserPath() + mDictionaryBasename + ".aff";
+ if (copyFile( dict_aff, settings_aff ))
+ {
+ imported = true;
+ }
+ else
+ {
+ LLSD args = LLSD::emptyMap();
+ args["FROM_NAME"] = dict_aff;
+ args["TO_NAME"] = settings_aff;
+ LLNotificationsUtil::add("SpellingDictImportFailed", args);
+ }
+ }
+ else
+ {
+ LLSD args = LLSD::emptyMap();
+ args["DIC_NAME"] = dict_dic;
+ LLNotificationsUtil::add("SpellingDictIsSecondary", args);
+
+ imported = true;
+ }
+ }
+ else
+ {
+ LLSD args = LLSD::emptyMap();
+ args["FROM_NAME"] = dict_dic;
+ args["TO_NAME"] = settings_dic;
+ LLNotificationsUtil::add("SpellingDictImportFailed", args);
+ }
+ }
+
+ if ( imported )
+ {
+ LLSD custom_dict_info;
+ custom_dict_info["is_primary"] = (bool)gDirUtilp->fileExists(dict_aff);
+ custom_dict_info["name"] = mDictionaryBasename;
+ custom_dict_info["language"] = dict_language;
+
+ LLSD custom_dict_map;
+ llifstream custom_file_in(LLSpellChecker::getDictionaryUserPath() + "user_dictionaries.xml");
+ if (custom_file_in.is_open())
+ {
+ LLSDSerialize::fromXMLDocument(custom_dict_map, custom_file_in);
+ custom_file_in.close();
+ }
+
+ LLSD::array_iterator it = custom_dict_map.beginArray();
+ for (; it != custom_dict_map.endArray(); ++it)
+ {
+ LLSD& dict_info = *it;
+ if (dict_info["name"].asString() == mDictionaryBasename)
+ {
+ dict_info = custom_dict_info;
+ break;
+ }
+ }
+ if (custom_dict_map.endArray() == it)
+ {
+ custom_dict_map.append(custom_dict_info);
+ }
+
+ llofstream custom_file_out(LLSpellChecker::getDictionaryUserPath() + "user_dictionaries.xml", std::ios::trunc);
+ if (custom_file_out.is_open())
+ {
+ LLSDSerialize::toPrettyXML(custom_dict_map, custom_file_out);
+ custom_file_out.close();
+ }
+
+ LLSpellChecker::refreshDictionaryMap();
+ }
+
+ closeFloater(false);
+}
+
+bool LLFloaterSpellCheckerImport::copyFile(const std::string from, const std::string to)
+{
+ bool copied = false;
+ LLFILE* in = LLFile::fopen(from, "rb"); /* Flawfinder: ignore */
+ if (in)
+ {
+ LLFILE* out = LLFile::fopen(to, "wb"); /* Flawfinder: ignore */
+ if (out)
+ {
+ char buf[16384]; /* Flawfinder: ignore */
+ size_t readbytes;
+ bool write_ok = true;
+ while(write_ok && (readbytes = fread(buf, 1, 16384, in))) /* Flawfinder: ignore */
+ {
+ if (fwrite(buf, 1, readbytes, out) != readbytes)
+ {
+ LL_WARNS("SpellCheck") << "Short write" << LL_ENDL;
+ write_ok = false;
+ }
+ }
+ if ( write_ok )
+ {
+ copied = true;
+ }
+ fclose(out);
+ }
+ }
+ fclose(in);
+ return copied;
+}
+
+std::string LLFloaterSpellCheckerImport::parseXcuFile(const std::string& file_path) const
+{
+ LLXMLNodePtr xml_root;
+ if ( (!LLUICtrlFactory::getLayeredXMLNode(file_path, xml_root)) || (xml_root.isNull()) )
+ {
+ return LLStringUtil::null;
+ }
+
+ // Bury down to the "Dictionaries" parent node
+ LLXMLNode* dict_node = NULL;
+ for (LLXMLNode* outer_node = xml_root->getFirstChild(); outer_node && !dict_node; outer_node = outer_node->getNextSibling())
+ {
+ std::string temp;
+ if ( (outer_node->getAttributeString("oor:name", temp)) && ("ServiceManager" == temp) )
+ {
+ for (LLXMLNode* inner_node = outer_node->getFirstChild(); inner_node && !dict_node; inner_node = inner_node->getNextSibling())
+ {
+ if ( (inner_node->getAttributeString("oor:name", temp)) && ("Dictionaries" == temp) )
+ {
+ dict_node = inner_node;
+ break;
+ }
+ }
+ }
+ }
+
+ if (dict_node)
+ {
+ // Iterate over all child nodes until we find one that has a <value>DICT_SPELL</value> node
+ for (LLXMLNode* outer_node = dict_node->getFirstChild(); outer_node; outer_node = outer_node->getNextSibling())
+ {
+ std::string temp;
+ LLXMLNodePtr location_node, format_node;
+ for (LLXMLNode* inner_node = outer_node->getFirstChild(); inner_node; inner_node = inner_node->getNextSibling())
+ {
+ if (inner_node->getAttributeString("oor:name", temp))
+ {
+ if ("Locations" == temp)
+ {
+ inner_node->getChild("value", location_node, false);
+ }
+ else if ("Format" == temp)
+ {
+ inner_node->getChild("value", format_node, false);
+ }
+ }
+ }
+ if ( (format_node.isNull()) || ("DICT_SPELL" != format_node->getValue()) || (location_node.isNull()) )
+ {
+ continue;
+ }
+
+ // Found a list of file locations, return the .dic (if present)
+ std::list<std::string> location_list;
+ boost::split(location_list, location_node->getValue(), boost::is_any_of(std::string(" ")));
+ for (std::list<std::string>::iterator it = location_list.begin(); it != location_list.end(); ++it)
+ {
+ std::string& location = *it;
+ if ("\\" != gDirUtilp->getDirDelimiter())
+ LLStringUtil::replaceString(location, "\\", gDirUtilp->getDirDelimiter());
+ else
+ LLStringUtil::replaceString(location, "/", gDirUtilp->getDirDelimiter());
+ LLStringUtil::replaceString(location, "%origin%", gDirUtilp->getDirName(file_path));
+ if ("dic" == gDirUtilp->getExtension(location))
+ {
+ return location;
+ }
+ }
+ }
+ }
+
+ return LLStringUtil::null;
+}
diff --git a/indra/newview/llfloaterspellchecksettings.h b/indra/newview/llfloaterspellchecksettings.h
new file mode 100644
index 0000000000..eded3a9133
--- /dev/null
+++ b/indra/newview/llfloaterspellchecksettings.h
@@ -0,0 +1,68 @@
+/**
+ * @file llfloaterspellchecksettings.h
+ * @brief Spell checker settings floater
+ *
+* $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 LLFLOATERSPELLCHECKERSETTINGS_H
+#define LLFLOATERSPELLCHECKERSETTINGS_H
+
+#include "llfloater.h"
+
+class LLFloaterSpellCheckerSettings : public LLFloater
+{
+public:
+ LLFloaterSpellCheckerSettings(const LLSD& key);
+
+ /*virtual*/ void draw();
+ /*virtual*/ BOOL postBuild();
+ /*virtual*/ void onOpen(const LLSD& key);
+ /*virtual*/ void onClose(bool app_quitting);
+
+protected:
+ void onBtnImport();
+ void onBtnMove(const std::string& from, const std::string& to);
+ void onBtnRemove();
+ void onSpellCheckSettingsChange();
+ void refreshDictionaries(bool from_settings);
+};
+
+class LLFloaterSpellCheckerImport : public LLFloater
+{
+public:
+ LLFloaterSpellCheckerImport(const LLSD& key);
+
+ /*virtual*/ BOOL postBuild();
+
+protected:
+ void onBtnBrowse();
+ void onBtnCancel();
+ void onBtnOK();
+ bool copyFile(const std::string from, const std::string to);
+ std::string parseXcuFile(const std::string& file_path) const;
+
+ std::string mDictionaryDir;
+ std::string mDictionaryBasename;
+};
+
+#endif // LLFLOATERSPELLCHECKERSETTINGS_H
diff --git a/indra/newview/llfloatertexturefetchdebugger.cpp b/indra/newview/llfloatertexturefetchdebugger.cpp
index 2b34b72055..9157389187 100644
--- a/indra/newview/llfloatertexturefetchdebugger.cpp
+++ b/indra/newview/llfloatertexturefetchdebugger.cpp
@@ -59,12 +59,15 @@ LLFloaterTextureFetchDebugger::LLFloaterTextureFetchDebugger(const LLSD& key)
mCommitCallbackRegistrar.add("TexFetchDebugger.RefetchVisCache", boost::bind(&LLFloaterTextureFetchDebugger::onClickRefetchVisCache, this));
mCommitCallbackRegistrar.add("TexFetchDebugger.RefetchVisHTTP", boost::bind(&LLFloaterTextureFetchDebugger::onClickRefetchVisHTTP, this));
+ mCommitCallbackRegistrar.add("TexFetchDebugger.RefetchAllCache", boost::bind(&LLFloaterTextureFetchDebugger::onClickRefetchAllCache, this));
+ mCommitCallbackRegistrar.add("TexFetchDebugger.RefetchAllHTTP", boost::bind(&LLFloaterTextureFetchDebugger::onClickRefetchAllHTTP, this));
}
//----------------------------------------------
BOOL LLFloaterTextureFetchDebugger::postBuild(void)
{
mDebugger = LLAppViewer::getTextureFetch()->getFetchDebugger();
+ mStartStatus = (S32)LLTextureFetchDebugger::IDLE;
//set states for buttons
mButtonStateMap["start_btn"] = true;
@@ -76,8 +79,10 @@ BOOL LLFloaterTextureFetchDebugger::postBuild(void)
mButtonStateMap["decode_btn"] = false;
mButtonStateMap["gl_btn"] = false;
- mButtonStateMap["refetchviscache_btn"] = true;
- mButtonStateMap["refetchvishttp_btn"] = true;
+ mButtonStateMap["refetchviscache_btn"] = false;
+ mButtonStateMap["refetchvishttp_btn"] = false;
+ mButtonStateMap["refetchallcache_btn"] = false;
+ mButtonStateMap["refetchallhttp_btn"] = false;
updateButtons();
@@ -89,7 +94,7 @@ BOOL LLFloaterTextureFetchDebugger::postBuild(void)
LLFloaterTextureFetchDebugger::~LLFloaterTextureFetchDebugger()
{
//stop everything
- mDebugger->stopDebug();
+ mDebugger->setStopDebug();
}
void LLFloaterTextureFetchDebugger::updateButtons()
@@ -118,47 +123,81 @@ void LLFloaterTextureFetchDebugger::disableButtons()
childDisable("gl_btn");
childDisable("refetchviscache_btn");
childDisable("refetchvishttp_btn");
+ childDisable("refetchallcache_btn");
+ childDisable("refetchallhttp_btn");
+}
+void LLFloaterTextureFetchDebugger::setStartStatus(S32 status)
+{
+ llassert_always(LLTextureFetchDebugger::IDLE == (LLTextureFetchDebugger::e_debug_state)mStartStatus) ;
+ mStartStatus = status;
+}
+
+bool LLFloaterTextureFetchDebugger::idleStart()
+{
+ if(mStartStatus != (S32)LLTextureFetchDebugger::IDLE)
+ {
+ mDebugger->startWork((LLTextureFetchDebugger::e_debug_state)mStartStatus);
+ mStartStatus = (S32)LLTextureFetchDebugger::IDLE;
+ return true;
+ }
+
+ return false;
}
void LLFloaterTextureFetchDebugger::idle()
{
- LLTextureFetchDebugger::e_debug_state state = mDebugger->getState();
-
- if(mDebugger->update())
+ if(idleStart())
+ {
+ return;
+ }
+
+ const F32 max_time = 0.005f; //5ms
+ LLTextureFetchDebugger::e_debug_state state = mDebugger->getState();
+ if(mDebugger->update(max_time))
{
switch(state)
{
case LLTextureFetchDebugger::IDLE:
break;
- case LLTextureFetchDebugger::READ_CACHE:
- mButtonStateMap["cachewrite_btn"] = true;
- mButtonStateMap["decode_btn"] = true;
- updateButtons();
+ case LLTextureFetchDebugger::START_DEBUG:
+ mButtonStateMap["cacheread_btn"] = true;
+ mButtonStateMap["http_btn"] = true;
+ mButtonStateMap["refetchviscache_btn"] = true;
+ mButtonStateMap["refetchvishttp_btn"] = true;
+ mButtonStateMap["refetchallcache_btn"] = true;
+ mButtonStateMap["refetchallhttp_btn"] = true;
break;
- case LLTextureFetchDebugger::WRITE_CACHE:
- updateButtons();
+ case LLTextureFetchDebugger::READ_CACHE:
+ mButtonStateMap["decode_btn"] = true;
+ break;
+ case LLTextureFetchDebugger::WRITE_CACHE:
break;
case LLTextureFetchDebugger::DECODING:
- mButtonStateMap["gl_btn"] = true;
- updateButtons();
+ mButtonStateMap["gl_btn"] = true;
break;
case LLTextureFetchDebugger::HTTP_FETCHING:
mButtonStateMap["cacheread_btn"] = true;
mButtonStateMap["cachewrite_btn"] = true;
- mButtonStateMap["decode_btn"] = true;
- updateButtons();
+ mButtonStateMap["decode_btn"] = true;
break;
- case LLTextureFetchDebugger::GL_TEX:
- updateButtons();
+ case LLTextureFetchDebugger::GL_TEX:
break;
- case LLTextureFetchDebugger::REFETCH_VIS_CACHE:
- updateButtons();
- case LLTextureFetchDebugger::REFETCH_VIS_HTTP:
- updateButtons();
+ case LLTextureFetchDebugger::REFETCH_VIS_CACHE:
+ break;
+ case LLTextureFetchDebugger::REFETCH_VIS_HTTP:
+ break;
+ case LLTextureFetchDebugger::REFETCH_ALL_CACHE:
+ break;
+ case LLTextureFetchDebugger::REFETCH_ALL_HTTP:
break;
default:
break;
}
+
+ if(state != LLTextureFetchDebugger::IDLE)
+ {
+ updateButtons();
+ }
}
}
@@ -172,11 +211,10 @@ void LLFloaterTextureFetchDebugger::onClickStart()
{
disableButtons();
- mDebugger->startDebug();
+ setStartStatus((S32)LLTextureFetchDebugger::START_DEBUG);
mButtonStateMap["start_btn"] = false;
- mButtonStateMap["cacheread_btn"] = true;
- mButtonStateMap["http_btn"] = true;
+
updateButtons();
}
@@ -185,7 +223,9 @@ void LLFloaterTextureFetchDebugger::onClickClose()
setVisible(FALSE);
//stop everything
- mDebugger->stopDebug();
+ mDebugger->setStopDebug();
+
+ delete this;
}
void LLFloaterTextureFetchDebugger::onClickClear()
@@ -203,7 +243,7 @@ void LLFloaterTextureFetchDebugger::onClickClear()
updateButtons();
//stop everything
- mDebugger->stopDebug();
+ mDebugger->setStopDebug();
mDebugger->clearHistory();
}
@@ -211,49 +251,63 @@ void LLFloaterTextureFetchDebugger::onClickCacheRead()
{
disableButtons();
- mDebugger->debugCacheRead();
+ setStartStatus((S32)LLTextureFetchDebugger::READ_CACHE);
}
void LLFloaterTextureFetchDebugger::onClickCacheWrite()
{
disableButtons();
- mDebugger->debugCacheWrite();
+ setStartStatus((S32)LLTextureFetchDebugger::WRITE_CACHE);
}
void LLFloaterTextureFetchDebugger::onClickHTTPLoad()
{
disableButtons();
- mDebugger->debugHTTP();
+ setStartStatus((S32)LLTextureFetchDebugger::HTTP_FETCHING);
}
void LLFloaterTextureFetchDebugger::onClickDecode()
{
disableButtons();
- mDebugger->debugDecoder();
+ setStartStatus((S32)LLTextureFetchDebugger::DECODING);
}
void LLFloaterTextureFetchDebugger::onClickGLTexture()
{
disableButtons();
- mDebugger->debugGLTextureCreation();
+ setStartStatus((S32)LLTextureFetchDebugger::GL_TEX);
}
void LLFloaterTextureFetchDebugger::onClickRefetchVisCache()
{
disableButtons();
- mDebugger->debugRefetchVisibleFromCache();
+ setStartStatus((S32)LLTextureFetchDebugger::REFETCH_VIS_CACHE);
}
void LLFloaterTextureFetchDebugger::onClickRefetchVisHTTP()
{
disableButtons();
- mDebugger->debugRefetchVisibleFromHTTP();
+ setStartStatus((S32)LLTextureFetchDebugger::REFETCH_VIS_HTTP);
+}
+
+void LLFloaterTextureFetchDebugger::onClickRefetchAllCache()
+{
+ disableButtons();
+
+ setStartStatus((S32)LLTextureFetchDebugger::REFETCH_ALL_CACHE);
+}
+
+void LLFloaterTextureFetchDebugger::onClickRefetchAllHTTP()
+{
+ disableButtons();
+
+ setStartStatus((S32)LLTextureFetchDebugger::REFETCH_ALL_HTTP);
}
void LLFloaterTextureFetchDebugger::draw()
@@ -368,8 +422,22 @@ void LLFloaterTextureFetchDebugger::draw()
else
{
getChild<LLUICtrl>("total_time_refetch_vis_cache_label")->setTextArg("[TIME]", llformat("%.3f", mDebugger->getRefetchVisCacheTime()));
- getChild<LLUICtrl>("total_time_refetch_vis_cache_label")->setTextArg("[SIZE]", llformat("%d", mDebugger->getRefetchedData() >> 10));
- getChild<LLUICtrl>("total_time_refetch_vis_cache_label")->setTextArg("[PIXEL]", llformat("%.3f", mDebugger->getRefetchedPixels() / 1000000.f));
+ getChild<LLUICtrl>("total_time_refetch_vis_cache_label")->setTextArg("[SIZE]", llformat("%d", mDebugger->getRefetchedVisData() >> 10));
+ getChild<LLUICtrl>("total_time_refetch_vis_cache_label")->setTextArg("[PIXEL]", llformat("%.3f", mDebugger->getRefetchedVisPixels() / 1000000.f));
+ }
+
+ //total time on refetching all textures from cache
+ if(mDebugger->getRefetchAllCacheTime() < 0.f)
+ {
+ getChild<LLUICtrl>("total_time_refetch_all_cache_label")->setTextArg("[TIME]", std::string("----"));
+ getChild<LLUICtrl>("total_time_refetch_all_cache_label")->setTextArg("[SIZE]", std::string("----"));
+ getChild<LLUICtrl>("total_time_refetch_all_cache_label")->setTextArg("[PIXEL]", std::string("----"));
+ }
+ else
+ {
+ getChild<LLUICtrl>("total_time_refetch_all_cache_label")->setTextArg("[TIME]", llformat("%.3f", mDebugger->getRefetchAllCacheTime()));
+ getChild<LLUICtrl>("total_time_refetch_all_cache_label")->setTextArg("[SIZE]", llformat("%d", mDebugger->getRefetchedAllData() >> 10));
+ getChild<LLUICtrl>("total_time_refetch_all_cache_label")->setTextArg("[PIXEL]", llformat("%.3f", mDebugger->getRefetchedAllPixels() / 1000000.f));
}
//total time on refetching visible textures from http
@@ -382,8 +450,22 @@ void LLFloaterTextureFetchDebugger::draw()
else
{
getChild<LLUICtrl>("total_time_refetch_vis_http_label")->setTextArg("[TIME]", llformat("%.3f", mDebugger->getRefetchVisHTTPTime()));
- getChild<LLUICtrl>("total_time_refetch_vis_http_label")->setTextArg("[SIZE]", llformat("%d", mDebugger->getRefetchedData() >> 10));
- getChild<LLUICtrl>("total_time_refetch_vis_http_label")->setTextArg("[PIXEL]", llformat("%.3f", mDebugger->getRefetchedPixels() / 1000000.f));
+ getChild<LLUICtrl>("total_time_refetch_vis_http_label")->setTextArg("[SIZE]", llformat("%d", mDebugger->getRefetchedVisData() >> 10));
+ getChild<LLUICtrl>("total_time_refetch_vis_http_label")->setTextArg("[PIXEL]", llformat("%.3f", mDebugger->getRefetchedVisPixels() / 1000000.f));
+ }
+
+ //total time on refetching all textures from http
+ if(mDebugger->getRefetchAllHTTPTime() < 0.f)
+ {
+ getChild<LLUICtrl>("total_time_refetch_all_http_label")->setTextArg("[TIME]", std::string("----"));
+ getChild<LLUICtrl>("total_time_refetch_all_http_label")->setTextArg("[SIZE]", std::string("----"));
+ getChild<LLUICtrl>("total_time_refetch_all_http_label")->setTextArg("[PIXEL]", std::string("----"));
+ }
+ else
+ {
+ getChild<LLUICtrl>("total_time_refetch_all_http_label")->setTextArg("[TIME]", llformat("%.3f", mDebugger->getRefetchAllHTTPTime()));
+ getChild<LLUICtrl>("total_time_refetch_all_http_label")->setTextArg("[SIZE]", llformat("%d", mDebugger->getRefetchedAllData() >> 10));
+ getChild<LLUICtrl>("total_time_refetch_all_http_label")->setTextArg("[PIXEL]", llformat("%.3f", mDebugger->getRefetchedAllPixels() / 1000000.f));
}
LLFloater::draw();
diff --git a/indra/newview/llfloatertexturefetchdebugger.h b/indra/newview/llfloatertexturefetchdebugger.h
index 33012c6a3d..096ad88e07 100644
--- a/indra/newview/llfloatertexturefetchdebugger.h
+++ b/indra/newview/llfloatertexturefetchdebugger.h
@@ -53,6 +53,8 @@ public:
void onClickRefetchVisCache();
void onClickRefetchVisHTTP();
+ void onClickRefetchAllCache();
+ void onClickRefetchAllHTTP();
public:
void idle() ;
@@ -63,9 +65,12 @@ private:
void updateButtons();
void disableButtons();
+ void setStartStatus(S32 status);
+ bool idleStart();
private:
LLTextureFetchDebugger* mDebugger;
std::map<std::string, bool> mButtonStateMap;
+ S32 mStartStatus;
};
#endif // LL_FLOATER_TEXTURE_FETCH_DEBUGGER__H
diff --git a/indra/newview/llfloatertools.cpp b/indra/newview/llfloatertools.cpp
index 6978e6a430..99ebb0eb34 100644
--- a/indra/newview/llfloatertools.cpp
+++ b/indra/newview/llfloatertools.cpp
@@ -110,9 +110,6 @@ void click_show_more(void*);
void click_popup_info(void*);
void click_popup_done(void*);
void click_popup_minimize(void*);
-void click_popup_rotate_left(void*);
-void click_popup_rotate_reset(void*);
-void click_popup_rotate_right(void*);
void commit_slider_dozer_force(LLUICtrl *);
void click_apply_to_selection(void*);
void commit_radio_group_focus(LLUICtrl* ctrl);
@@ -136,6 +133,7 @@ public:
if(tools_floater)
{
tools_floater->updateLandImpacts();
+ tools_floater->dirty();
}
}
};
@@ -954,24 +952,6 @@ void commit_slider_zoom(LLUICtrl *ctrl)
gAgentCamera.setCameraZoomFraction(zoom_level);
}
-void click_popup_rotate_left(void*)
-{
- LLSelectMgr::getInstance()->selectionRotateAroundZ( 45.f );
- dialog_refresh_all();
-}
-
-void click_popup_rotate_reset(void*)
-{
- LLSelectMgr::getInstance()->selectionResetRotation();
- dialog_refresh_all();
-}
-
-void click_popup_rotate_right(void*)
-{
- LLSelectMgr::getInstance()->selectionRotateAroundZ( -45.f );
- dialog_refresh_all();
-}
-
void commit_slider_dozer_force(LLUICtrl *ctrl)
{
// the slider is logarithmic, so we exponentiate to get the actual force multiplier
@@ -1218,7 +1198,10 @@ void LLFloaterTools::getMediaState()
return;
}
- bool editable = (first_object->permModify() || selectedMediaEditable());
+ BOOL is_nonpermanent_enforced = (LLSelectMgr::getInstance()->getSelection()->getFirstRootNode()
+ && LLSelectMgr::getInstance()->selectGetRootsNonPermanentEnforced())
+ || LLSelectMgr::getInstance()->selectGetNonPermanentEnforced();
+ bool editable = is_nonpermanent_enforced && (first_object->permModify() || selectedMediaEditable());
// Check modify permissions and whether any selected objects are in
// the process of being fetched. If they are, then we're not editable
diff --git a/indra/newview/llfloatertopobjects.cpp b/indra/newview/llfloatertopobjects.cpp
index 87d048c15b..2d91a61b54 100644
--- a/indra/newview/llfloatertopobjects.cpp
+++ b/indra/newview/llfloatertopobjects.cpp
@@ -82,6 +82,7 @@ LLFloaterTopObjects::LLFloaterTopObjects(const LLSD& key)
mCommitCallbackRegistrar.add("TopObjects.Refresh", boost::bind(&LLFloaterTopObjects::onRefresh, this));
mCommitCallbackRegistrar.add("TopObjects.GetByObjectName", boost::bind(&LLFloaterTopObjects::onGetByObjectName, this));
mCommitCallbackRegistrar.add("TopObjects.GetByOwnerName", boost::bind(&LLFloaterTopObjects::onGetByOwnerName, this));
+ mCommitCallbackRegistrar.add("TopObjects.GetByParcelName", boost::bind(&LLFloaterTopObjects::onGetByParcelName, this));
mCommitCallbackRegistrar.add("TopObjects.CommitObjectsList",boost::bind(&LLFloaterTopObjects::onCommitObjectsList, this));
}
@@ -99,21 +100,6 @@ BOOL LLFloaterTopObjects::postBuild()
setDefaultBtn("show_beacon_btn");
- /*
- LLLineEditor* line_editor = getChild<LLLineEditor>("owner_name_editor");
- if (line_editor)
- {
- line_editor->setCommitOnFocusLost(FALSE);
- line_editor->setCommitCallback(onGetByOwnerName, this);
- }
-
- line_editor = getChild<LLLineEditor>("object_name_editor");
- if (line_editor)
- {
- line_editor->setCommitOnFocusLost(FALSE);
- line_editor->setCommitCallback(onGetByObjectName, this);
- }*/
-
mCurrentMode = STAT_REPORT_TOP_SCRIPTS;
mFlags = 0;
mFilter.clear();
@@ -168,9 +154,11 @@ void LLFloaterTopObjects::handleReply(LLMessageSystem *msg, void** data)
F32 score;
std::string name_buf;
std::string owner_buf;
+ std::string parcel_buf("unknown");
F32 mono_score = 0.f;
bool have_extended_data = false;
S32 public_urls = 0;
+ F32 script_memory = 0.f;
msg->getU32Fast(_PREHASH_ReportData, _PREHASH_TaskLocalID, task_local_id, block);
msg->getUUIDFast(_PREHASH_ReportData, _PREHASH_TaskID, task_id, block);
@@ -180,12 +168,18 @@ void LLFloaterTopObjects::handleReply(LLMessageSystem *msg, void** data)
msg->getF32Fast(_PREHASH_ReportData, _PREHASH_Score, score, block);
msg->getStringFast(_PREHASH_ReportData, _PREHASH_TaskName, name_buf, block);
msg->getStringFast(_PREHASH_ReportData, _PREHASH_OwnerName, owner_buf, block);
+
if(msg->has("DataExtended"))
{
have_extended_data = true;
msg->getU32("DataExtended", "TimeStamp", time_stamp, block);
msg->getF32("DataExtended", "MonoScore", mono_score, block);
msg->getS32("DataExtended", "PublicURLs", public_urls, block);
+ if (msg->getSize("DataExtended", "ParcelName") > 0)
+ {
+ msg->getString("DataExtended", "ParcelName", parcel_buf, block);
+ msg->getF32("DataExtended", "Size", script_memory, block);
+ }
}
LLSD element;
@@ -193,13 +187,14 @@ void LLFloaterTopObjects::handleReply(LLMessageSystem *msg, void** data)
element["id"] = task_id;
LLSD columns;
- columns[0]["column"] = "score";
- columns[0]["value"] = llformat("%0.3f", score);
- columns[0]["font"] = "SANSSERIF";
+ S32 column_num = 0;
+ columns[column_num]["column"] = "score";
+ columns[column_num]["value"] = llformat("%0.3f", score);
+ columns[column_num++]["font"] = "SANSSERIF";
- columns[1]["column"] = "name";
- columns[1]["value"] = name_buf;
- columns[1]["font"] = "SANSSERIF";
+ columns[column_num]["column"] = "name";
+ columns[column_num]["value"] = name_buf;
+ columns[column_num++]["font"] = "SANSSERIF";
// Owner names can have trailing spaces sent from server
LLStringUtil::trim(owner_buf);
@@ -215,28 +210,33 @@ void LLFloaterTopObjects::handleReply(LLMessageSystem *msg, void** data)
// ...just strip out legacy "Resident" name
owner_buf = LLCacheName::cleanFullName(owner_buf);
}
- columns[2]["column"] = "owner";
- columns[2]["value"] = owner_buf;
- columns[2]["font"] = "SANSSERIF";
-
- columns[3]["column"] = "location";
- columns[3]["value"] = llformat("<%0.1f,%0.1f,%0.1f>", location_x, location_y, location_z);
- columns[3]["font"] = "SANSSERIF";
- columns[4]["column"] = "time";
- columns[4]["type"] = "date";
- columns[4]["value"] = LLDate((time_t)time_stamp);
- columns[4]["font"] = "SANSSERIF";
+ columns[column_num]["column"] = "owner";
+ columns[column_num]["value"] = owner_buf;
+ columns[column_num++]["font"] = "SANSSERIF";
+
+ columns[column_num]["column"] = "location";
+ columns[column_num]["value"] = llformat("<%0.1f,%0.1f,%0.1f>", location_x, location_y, location_z);
+ columns[column_num++]["font"] = "SANSSERIF";
+
+ columns[column_num]["column"] = "parcel";
+ columns[column_num]["value"] = parcel_buf;
+ columns[column_num++]["font"] = "SANSSERIF";
+
+ columns[column_num]["column"] = "time";
+ columns[column_num]["type"] = "date";
+ columns[column_num]["value"] = LLDate((time_t)time_stamp);
+ columns[column_num++]["font"] = "SANSSERIF";
if (mCurrentMode == STAT_REPORT_TOP_SCRIPTS
&& have_extended_data)
{
- columns[5]["column"] = "mono_time";
- columns[5]["value"] = llformat("%0.3f", mono_score);
- columns[5]["font"] = "SANSSERIF";
+ columns[column_num]["column"] = "memory";
+ columns[column_num]["value"] = llformat("%0.0f", (script_memory / 1000.f));
+ columns[column_num++]["font"] = "SANSSERIF";
- columns[6]["column"] = "URLs";
- columns[6]["value"] = llformat("%d", public_urls);
- columns[6]["font"] = "SANSSERIF";
+ columns[column_num]["column"] = "URLs";
+ columns[column_num]["value"] = llformat("%d", public_urls);
+ columns[column_num++]["font"] = "SANSSERIF";
}
element["columns"] = columns;
list->addElement(element);
@@ -260,18 +260,18 @@ void LLFloaterTopObjects::handleReply(LLMessageSystem *msg, void** data)
{
setTitle(getString("top_scripts_title"));
list->setColumnLabel("score", getString("scripts_score_label"));
- list->setColumnLabel("mono_time", getString("scripts_mono_time_label"));
LLUIString format = getString("top_scripts_text");
format.setArg("[COUNT]", llformat("%d", total_count));
- format.setArg("[TIME]", llformat("%0.1f", mtotalScore));
+ format.setArg("[TIME]", llformat("%0.3f", mtotalScore));
getChild<LLUICtrl>("title_text")->setValue(LLSD(format));
}
else
{
setTitle(getString("top_colliders_title"));
list->setColumnLabel("score", getString("colliders_score_label"));
- list->setColumnLabel("mono_time", "");
+ list->setColumnLabel("URLs", "");
+ list->setColumnLabel("memory", "");
LLUIString format = getString("top_colliders_text");
format.setArg("[COUNT]", llformat("%d", total_count));
getChild<LLUICtrl>("title_text")->setValue(LLSD(format));
@@ -301,6 +301,7 @@ void LLFloaterTopObjects::updateSelectionInfo()
{
getChild<LLUICtrl>("object_name_editor")->setValue(sli->getColumn(1)->getValue().asString());
getChild<LLUICtrl>("owner_name_editor")->setValue(sli->getColumn(2)->getValue().asString());
+ getChild<LLUICtrl>("parcel_name_editor")->setValue(sli->getColumn(4)->getValue().asString());
}
}
@@ -480,6 +481,15 @@ void LLFloaterTopObjects::onGetByOwnerName()
onRefresh();
}
+
+void LLFloaterTopObjects::onGetByParcelName()
+{
+ mFlags = STAT_FILTER_BY_PARCEL_NAME;
+ mFilter = getChild<LLUICtrl>("parcel_name_editor")->getValue().asString();
+ onRefresh();
+}
+
+
void LLFloaterTopObjects::showBeacon()
{
LLScrollListCtrl* list = getChild<LLScrollListCtrl>("objects_list");
diff --git a/indra/newview/llfloatertopobjects.h b/indra/newview/llfloatertopobjects.h
index a608ca20f1..6edc46cf79 100644
--- a/indra/newview/llfloatertopobjects.h
+++ b/indra/newview/llfloatertopobjects.h
@@ -73,9 +73,7 @@ private:
void onGetByOwnerName();
void onGetByObjectName();
-
-// static void onGetByOwnerNameClicked(void* data) { onGetByOwnerName(NULL, data); };
-// static void onGetByObjectNameClicked(void* data) { onGetByObjectName(NULL, data); };
+ void onGetByParcelName();
void showBeacon();
diff --git a/indra/newview/llfolderview.cpp b/indra/newview/llfolderview.cpp
index 1fa194ab19..d4080ab3f7 100644
--- a/indra/newview/llfolderview.cpp
+++ b/indra/newview/llfolderview.cpp
@@ -562,7 +562,6 @@ void LLFolderView::reshape(S32 width, S32 height, BOOL called_from_parent)
{
width = scroll_rect.getWidth();
}
-
LLView::reshape(width, height, called_from_parent);
mReshapeSignal(mSelectedItems, FALSE);
}
@@ -2236,12 +2235,11 @@ void LLFolderView::doIdle()
arrangeAll();
}
- if (mFilter->isModified() && mFilter->isNotDefault())
- {
- mNeedsAutoSelect = TRUE;
- }
+ BOOL filter_modified_and_active = mFilter->isModified() && mFilter->isNotDefault();
+ mNeedsAutoSelect = filter_modified_and_active &&
+ !(gFocusMgr.childHasKeyboardFocus(this) || gFocusMgr.getMouseCapture());
mFilter->clearModified();
-
+
// filter to determine visibility before arranging
filterFromRoot();
@@ -2251,7 +2249,7 @@ void LLFolderView::doIdle()
LLFastTimer t3(FTM_AUTO_SELECT);
// select new item only if a filtered item not currently selected
LLFolderViewItem* selected_itemp = mSelectedItems.empty() ? NULL : mSelectedItems.back();
- if (!mAutoSelectOverride && (!selected_itemp || !selected_itemp->potentiallyFiltered()))
+ if (!mAutoSelectOverride && (!selected_itemp || !selected_itemp->potentiallyVisible()))
{
// these are named variables to get around gcc not binding non-const references to rvalues
// and functor application is inherently non-const to allow for stateful functors
@@ -2261,7 +2259,7 @@ void LLFolderView::doIdle()
// Open filtered folders for folder views with mAutoSelectOverride=TRUE.
// Used by LLPlacesFolderView.
- if (mAutoSelectOverride && !mFilter->getFilterSubString().empty())
+ if (!mFilter->getFilterSubString().empty())
{
// these are named variables to get around gcc not binding non-const references to rvalues
// and functor application is inherently non-const to allow for stateful functors
@@ -2553,6 +2551,25 @@ void LLFolderView::onRenamerLost()
}
}
+LLFolderViewItem* LLFolderView::getNextUnselectedItem()
+{
+ LLFolderViewItem* last_item = *mSelectedItems.rbegin();
+ LLFolderViewItem* new_selection = last_item->getNextOpenNode(FALSE);
+ while(new_selection && new_selection->isSelected())
+ {
+ new_selection = new_selection->getNextOpenNode(FALSE);
+ }
+ if (!new_selection)
+ {
+ new_selection = last_item->getPreviousOpenNode(FALSE);
+ while (new_selection && (new_selection->isInSelection()))
+ {
+ new_selection = new_selection->getPreviousOpenNode(FALSE);
+ }
+ }
+ return new_selection;
+}
+
LLInventoryFilter* LLFolderView::getFilter()
{
return mFilter;
diff --git a/indra/newview/llfolderview.h b/indra/newview/llfolderview.h
index da8bb15f8e..3f78312a98 100644
--- a/indra/newview/llfolderview.h
+++ b/indra/newview/llfolderview.h
@@ -207,6 +207,8 @@ public:
virtual void doDelete();
virtual BOOL canDoDelete() const;
+ LLFolderViewItem* getNextUnselectedItem();
+
// Public rename functionality - can only start the process
void startRenamingSelectedItem( void );
diff --git a/indra/newview/llfolderviewitem.cpp b/indra/newview/llfolderviewitem.cpp
index 515e544452..3aa16b4413 100644
--- a/indra/newview/llfolderviewitem.cpp
+++ b/indra/newview/llfolderviewitem.cpp
@@ -1098,6 +1098,10 @@ void LLFolderViewItem::draw()
}
}
+bool LLFolderViewItem::isInSelection() const
+{
+ return mIsSelected || (mParentFolder && mParentFolder->isInSelection());
+}
///----------------------------------------------------------------------------
/// Class LLFolderViewFolder
diff --git a/indra/newview/llfolderviewitem.h b/indra/newview/llfolderviewitem.h
index 3c7592046a..577b6b54a2 100644
--- a/indra/newview/llfolderviewitem.h
+++ b/indra/newview/llfolderviewitem.h
@@ -243,6 +243,7 @@ public:
virtual void destroyView();
BOOL isSelected() const { return mIsSelected; }
+ bool isInSelection() const;
void setUnselected() { mIsSelected = FALSE; }
diff --git a/indra/newview/llgroupmgr.cpp b/indra/newview/llgroupmgr.cpp
index efffd0f98e..aceb7f0614 100644
--- a/indra/newview/llgroupmgr.cpp
+++ b/indra/newview/llgroupmgr.cpp
@@ -63,7 +63,7 @@
#pragma warning(pop) // Restore all warnings to the previous state
#endif
-const U32 MAX_CACHED_GROUPS = 10;
+const U32 MAX_CACHED_GROUPS = 20;
//
// LLRoleActionSet
@@ -234,10 +234,16 @@ LLGroupMgrGroupData::LLGroupMgrGroupData(const LLUUID& id) :
mRoleDataComplete(FALSE),
mRoleMemberDataComplete(FALSE),
mGroupPropertiesDataComplete(FALSE),
- mPendingRoleMemberRequest(FALSE)
+ mPendingRoleMemberRequest(FALSE),
+ mAccessTime(0.0f)
{
}
+void LLGroupMgrGroupData::setAccessed()
+{
+ mAccessTime = (F32)LLFrameTimer::getTotalSeconds();
+}
+
BOOL LLGroupMgrGroupData::getRoleData(const LLUUID& role_id, LLRoleData& role_data)
{
role_data_map_t::const_iterator it;
@@ -1360,7 +1366,7 @@ void LLGroupMgr::processCreateGroupReply(LLMessageSystem* msg, void ** data)
LLGroupMgrGroupData* LLGroupMgr::createGroupData(const LLUUID& id)
{
- LLGroupMgrGroupData* group_datap;
+ LLGroupMgrGroupData* group_datap = NULL;
group_map_t::iterator existing_group = LLGroupMgr::getInstance()->mGroups.find(id);
if (existing_group == LLGroupMgr::getInstance()->mGroups.end())
@@ -1373,6 +1379,11 @@ LLGroupMgrGroupData* LLGroupMgr::createGroupData(const LLUUID& id)
group_datap = existing_group->second;
}
+ if (group_datap)
+ {
+ group_datap->setAccessed();
+ }
+
return group_datap;
}
@@ -1413,25 +1424,41 @@ void LLGroupMgr::notifyObservers(LLGroupChange gc)
void LLGroupMgr::addGroup(LLGroupMgrGroupData* group_datap)
{
- if (mGroups.size() > MAX_CACHED_GROUPS)
+ while (mGroups.size() >= MAX_CACHED_GROUPS)
{
- // get rid of groups that aren't observed
- for (group_map_t::iterator gi = mGroups.begin(); gi != mGroups.end() && mGroups.size() > MAX_CACHED_GROUPS / 2; )
+ // LRU: Remove the oldest un-observed group from cache until group size is small enough
+
+ F32 oldest_access = LLFrameTimer::getTotalSeconds();
+ group_map_t::iterator oldest_gi = mGroups.end();
+
+ for (group_map_t::iterator gi = mGroups.begin(); gi != mGroups.end(); ++gi )
{
observer_multimap_t::iterator oi = mObservers.find(gi->first);
if (oi == mObservers.end())
{
- // not observed
- LLGroupMgrGroupData* unobserved_groupp = gi->second;
- delete unobserved_groupp;
- mGroups.erase(gi++);
- }
- else
- {
- ++gi;
+ if (gi->second
+ && (gi->second->getAccessTime() < oldest_access))
+ {
+ oldest_access = gi->second->getAccessTime();
+ oldest_gi = gi;
+ }
}
}
+
+ if (oldest_gi != mGroups.end())
+ {
+ delete oldest_gi->second;
+ mGroups.erase(oldest_gi);
+ }
+ else
+ {
+ // All groups must be currently open, none to remove.
+ // Just add the new group anyway, but get out of this loop as it
+ // will never drop below max_cached_groups.
+ break;
+ }
}
+
mGroups[group_datap->getID()] = group_datap;
}
diff --git a/indra/newview/llgroupmgr.h b/indra/newview/llgroupmgr.h
index faf0531c10..df3cd17e03 100644
--- a/indra/newview/llgroupmgr.h
+++ b/indra/newview/llgroupmgr.h
@@ -86,7 +86,7 @@ public:
BOOL isInRole(const LLUUID& role_id) { return (mRolesList.find(role_id) != mRolesList.end()); }
-protected:
+private:
LLUUID mID;
S32 mContribution;
U64 mAgentPowers;
@@ -233,6 +233,9 @@ public:
BOOL isRoleMemberDataComplete() { return mRoleMemberDataComplete; }
BOOL isGroupPropertiesDataComplete() { return mGroupPropertiesDataComplete; }
+ F32 getAccessTime() const { return mAccessTime; }
+ void setAccessed();
+
public:
typedef std::map<LLUUID,LLGroupMemberData*> member_list_t;
typedef std::map<LLUUID,LLGroupRoleData*> role_list_t;
@@ -280,6 +283,7 @@ private:
BOOL mGroupPropertiesDataComplete;
BOOL mPendingRoleMemberRequest;
+ F32 mAccessTime;
};
struct LLRoleAction
diff --git a/indra/newview/llimfloater.cpp b/indra/newview/llimfloater.cpp
index f67464078b..63eedcdfea 100644
--- a/indra/newview/llimfloater.cpp
+++ b/indra/newview/llimfloater.cpp
@@ -56,7 +56,7 @@
#include "llrootview.h"
#include "llspeakers.h"
#include "llviewerchat.h"
-
+#include "llautoreplace.h"
LLIMFloater::LLIMFloater(const LLUUID& session_id)
: LLTransientDockableFloater(NULL, true, session_id),
@@ -255,6 +255,8 @@ BOOL LLIMFloater::postBuild()
mInputEditor->setMaxTextLength(1023);
// enable line history support for instant message bar
mInputEditor->setEnableLineHistory(TRUE);
+ // *TODO Establish LineEditor with autoreplace callback
+ mInputEditor->setAutoreplaceCallback(boost::bind(&LLAutoReplace::autoreplaceCallback, LLAutoReplace::getInstance(), _1, _2));
LLFontGL* font = LLViewerChat::getChatFont();
mInputEditor->setFont(font);
diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp
index b86c453d61..fce0b7c9c9 100644
--- a/indra/newview/llinventorybridge.cpp
+++ b/indra/newview/llinventorybridge.cpp
@@ -71,6 +71,9 @@
#include "llviewerwindow.h"
#include "llvoavatarself.h"
#include "llwearablelist.h"
+#include "lllandmarkactions.h"
+
+void copy_slurl_to_clipboard_callback_inv(const std::string& slurl);
// Marketplace outbox current disabled
#define ENABLE_MERCHANT_OUTBOX_CONTEXT_MENU 1
@@ -1355,7 +1358,10 @@ void LLItemBridge::performAction(LLInventoryModel* model, std::string action)
else if ("cut" == action)
{
cutToClipboard();
+ // MAINT-1197: This is temp code to work around a deselection/reselection bug. Please discard when merging CHUI.
+ LLFolderViewItem* item_to_select = mRoot->getNextUnselectedItem();
LLFolderView::removeCutItems();
+ mRoot->setSelection(item_to_select, item_to_select ? item_to_select->isOpen() : false, false);
return;
}
else if ("copy" == action)
@@ -1396,6 +1402,29 @@ void LLItemBridge::performAction(LLInventoryModel* model, std::string action)
const LLUUID outbox_id = getInventoryModel()->findCategoryUUIDForType(LLFolderType::FT_OUTBOX, false, false);
copy_item_to_outbox(itemp, outbox_id, LLUUID::null, LLToolDragAndDrop::getOperationId());
}
+ else if ("copy_slurl" == action)
+ {
+ LLViewerInventoryItem* item = static_cast<LLViewerInventoryItem*>(getItem());
+ if(item)
+ {
+ LLUUID asset_id = item->getAssetUUID();
+ LLLandmark* landmark = gLandmarkList.getAsset(asset_id);
+ if (landmark)
+ {
+ LLVector3d global_pos;
+ landmark->getGlobalPos(global_pos);
+ LLLandmarkActions::getSLURLfromPosGlobal(global_pos, &copy_slurl_to_clipboard_callback_inv, true);
+ }
+ }
+ }
+}
+
+void copy_slurl_to_clipboard_callback_inv(const std::string& slurl)
+{
+ gViewerWindow->getWindow()->copyTextToClipboard(utf8str_to_wstring(slurl));
+ LLSD args;
+ args["SLURL"] = slurl;
+ LLNotificationsUtil::add("CopySLURL", args);
}
void LLItemBridge::selectItem()
@@ -2743,7 +2772,10 @@ void LLFolderBridge::performAction(LLInventoryModel* model, std::string action)
else if ("cut" == action)
{
cutToClipboard();
+ // MAINT-1197: This is temp code to work around a deselection/reselection bug. Please discard when merging CHUI.
+ LLFolderViewItem* item_to_select = mRoot->getNextUnselectedItem();
LLFolderView::removeCutItems();
+ mRoot->setSelection(item_to_select, item_to_select ? item_to_select->isOpen() : false, false);
return;
}
else if ("copy" == action)
@@ -4397,6 +4429,7 @@ void LLLandmarkBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
}
items.push_back(std::string("Landmark Separator"));
+ items.push_back(std::string("url_copy"));
items.push_back(std::string("About Landmark"));
}
@@ -4405,6 +4438,7 @@ void LLLandmarkBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
// info panel can be shown at a time.
if ((flags & FIRST_SELECTED_ITEM) == 0)
{
+ disabled_items.push_back(std::string("url_copy"));
disabled_items.push_back(std::string("About Landmark"));
}
diff --git a/indra/newview/llinventorybridge.h b/indra/newview/llinventorybridge.h
index dc9e88d54d..118430efe1 100644
--- a/indra/newview/llinventorybridge.h
+++ b/indra/newview/llinventorybridge.h
@@ -197,6 +197,8 @@ public:
const LLUUID& uuid) :
LLInvFVBridge(inventory, root, uuid) {}
+ typedef boost::function<void(std::string& slurl)> slurl_callback_t;
+
virtual void performAction(LLInventoryModel* model, std::string action);
virtual void selectItem();
virtual void restoreItem();
@@ -214,7 +216,6 @@ public:
virtual BOOL isItemCopyable() const;
virtual BOOL hasChildren() const { return FALSE; }
virtual BOOL isUpToDate() const { return TRUE; }
-
/*virtual*/ void clearDisplayName() { mDisplayName.clear(); }
LLViewerInventoryItem* getItem() const;
diff --git a/indra/newview/llinventoryfunctions.cpp b/indra/newview/llinventoryfunctions.cpp
index ab5b082915..e98d3f88a6 100644
--- a/indra/newview/llinventoryfunctions.cpp
+++ b/indra/newview/llinventoryfunctions.cpp
@@ -440,7 +440,7 @@ void show_item_original(const LLUUID& item_uuid)
//sidetray inventory panel
LLSidepanelInventory *sidepanel_inventory = LLFloaterSidePanelContainer::getPanel<LLSidepanelInventory>("inventory");
- bool reset_inventory_filter = !floater_inventory->isInVisibleChain();
+ bool do_reset_inventory_filter = !floater_inventory->isInVisibleChain();
LLInventoryPanel* active_panel = LLInventoryPanel::getActiveInventoryPanel();
if (!active_panel)
@@ -460,37 +460,49 @@ void show_item_original(const LLUUID& item_uuid)
}
active_panel->setSelection(gInventory.getLinkedItemID(item_uuid), TAKE_FOCUS_NO);
- if(reset_inventory_filter)
+ if(do_reset_inventory_filter)
{
- //inventory floater
- bool floater_inventory_visible = false;
+ reset_inventory_filter();
+ }
+}
+
- LLFloaterReg::const_instance_list_t& inst_list = LLFloaterReg::getFloaterList("inventory");
- for (LLFloaterReg::const_instance_list_t::const_iterator iter = inst_list.begin(); iter != inst_list.end(); ++iter)
+void reset_inventory_filter()
+{
+ //inventory floater
+ bool floater_inventory_visible = false;
+
+ LLFloaterReg::const_instance_list_t& inst_list = LLFloaterReg::getFloaterList("inventory");
+ for (LLFloaterReg::const_instance_list_t::const_iterator iter = inst_list.begin(); iter != inst_list.end(); ++iter)
+ {
+ LLFloaterInventory* floater_inventory = dynamic_cast<LLFloaterInventory*>(*iter);
+ if (floater_inventory)
{
- LLFloaterInventory* floater_inventory = dynamic_cast<LLFloaterInventory*>(*iter);
- if (floater_inventory)
- {
- LLPanelMainInventory* main_inventory = floater_inventory->getMainInventoryPanel();
+ LLPanelMainInventory* main_inventory = floater_inventory->getMainInventoryPanel();
- main_inventory->onFilterEdit("");
+ main_inventory->onFilterEdit("");
- if(floater_inventory->getVisible())
- {
- floater_inventory_visible = true;
- }
+ if(floater_inventory->getVisible())
+ {
+ floater_inventory_visible = true;
}
}
- if(sidepanel_inventory && !floater_inventory_visible)
+ }
+
+ if(!floater_inventory_visible)
+ {
+ LLSidepanelInventory *sidepanel_inventory = LLFloaterSidePanelContainer::getPanel<LLSidepanelInventory>("inventory");
+ if (sidepanel_inventory)
{
LLPanelMainInventory* main_inventory = sidepanel_inventory->getMainInventoryPanel();
-
- main_inventory->onFilterEdit("");
+ if (main_inventory)
+ {
+ main_inventory->onFilterEdit("");
+ }
}
}
}
-
void open_outbox()
{
LLFloaterReg::showInstance("outbox");
diff --git a/indra/newview/llinventoryfunctions.h b/indra/newview/llinventoryfunctions.h
index 5cf9c528b0..909f7fd10b 100644
--- a/indra/newview/llinventoryfunctions.h
+++ b/indra/newview/llinventoryfunctions.h
@@ -56,6 +56,7 @@ void show_item_profile(const LLUUID& item_uuid);
void show_task_item_profile(const LLUUID& item_uuid, const LLUUID& object_id);
void show_item_original(const LLUUID& item_uuid);
+void reset_inventory_filter();
void rename_category(LLInventoryModel* model, const LLUUID& cat_id, const std::string& new_name);
diff --git a/indra/newview/llinventorymodel.cpp b/indra/newview/llinventorymodel.cpp
index 8092f3bf36..6e23d7c701 100644..100755
--- a/indra/newview/llinventorymodel.cpp
+++ b/indra/newview/llinventorymodel.cpp
@@ -822,6 +822,11 @@ U32 LLInventoryModel::updateItem(const LLViewerInventoryItem* item)
{
parent_id = findCategoryUUIDForType(LLFolderType::FT_LOST_AND_FOUND);
new_item->setParent(parent_id);
+ LLInventoryModel::update_list_t update;
+ LLInventoryModel::LLCategoryUpdate new_folder(parent_id, 1);
+ update.push_back(new_folder);
+ accountForUpdate(update);
+
}
item_array_t* item_array = get_ptr_in_map(mParentChildItemTree, parent_id);
if(item_array)
diff --git a/indra/newview/llinventorypanel.cpp b/indra/newview/llinventorypanel.cpp
index 71dd963f28..05c81957c6 100644
--- a/indra/newview/llinventorypanel.cpp
+++ b/indra/newview/llinventorypanel.cpp
@@ -966,6 +966,7 @@ void LLInventoryPanel::doToSelected(const LLSD& userdata)
void LLInventoryPanel::doCreate(const LLSD& userdata)
{
+ reset_inventory_filter();
menu_create_inventory_item(mFolderRoot, LLFolderBridge::sSelf.get(), userdata);
}
diff --git a/indra/newview/lllocationinputctrl.cpp b/indra/newview/lllocationinputctrl.cpp
index 025181ead5..8d9d70b50e 100644
--- a/indra/newview/lllocationinputctrl.cpp
+++ b/indra/newview/lllocationinputctrl.cpp
@@ -44,10 +44,14 @@
// newview includes
#include "llagent.h"
+#include "llenvmanager.h"
#include "llfloatersidepanelcontainer.h"
#include "llinventoryobserver.h"
#include "lllandmarkactions.h"
#include "lllandmarklist.h"
+#include "llpathfindingmanager.h"
+#include "llpathfindingnavmesh.h"
+#include "llpathfindingnavmeshstatus.h"
#include "llteleporthistory.h"
#include "llslurl.h"
#include "llstatusbar.h" // getHealth()
@@ -191,7 +195,9 @@ LLLocationInputCtrl::Params::Params()
damage_icon("damage_icon"),
damage_text("damage_text"),
see_avatars_icon("see_avatars_icon"),
- maturity_help_topic("maturity_help_topic")
+ maturity_help_topic("maturity_help_topic"),
+ pathfinding_dirty_icon("pathfinding_dirty_icon"),
+ pathfinding_disabled_icon("pathfinding_disabled_icon")
{
}
@@ -203,6 +209,9 @@ LLLocationInputCtrl::LLLocationInputCtrl(const LLLocationInputCtrl::Params& p)
mAddLandmarkBtn(NULL),
mForSaleBtn(NULL),
mInfoBtn(NULL),
+ mRegionCrossingSlot(),
+ mNavMeshSlot(),
+ mIsNavMeshDirty(false),
mLandmarkImageOn(NULL),
mLandmarkImageOff(NULL),
mIconMaturityGeneral(NULL),
@@ -270,7 +279,7 @@ LLLocationInputCtrl::LLLocationInputCtrl(const LLLocationInputCtrl::Params& p)
if (p.icon_maturity_general())
{
mIconMaturityGeneral = p.icon_maturity_general;
- }
+ }
if (p.icon_maturity_adult())
{
mIconMaturityAdult = p.icon_maturity_adult;
@@ -279,7 +288,7 @@ LLLocationInputCtrl::LLLocationInputCtrl(const LLLocationInputCtrl::Params& p)
{
mIconMaturityModerate = p.icon_maturity_moderate;
}
-
+
LLButton::Params maturity_button = p.maturity_button;
mMaturityButton = LLUICtrlFactory::create<LLButton>(maturity_button);
addChild(mMaturityButton);
@@ -336,7 +345,21 @@ LLLocationInputCtrl::LLLocationInputCtrl(const LLLocationInputCtrl::Params& p)
mParcelIcon[DAMAGE_ICON] = LLUICtrlFactory::create<LLIconCtrl>(damage_icon);
mParcelIcon[DAMAGE_ICON]->setMouseDownCallback(boost::bind(&LLLocationInputCtrl::onParcelIconClick, this, DAMAGE_ICON));
addChild(mParcelIcon[DAMAGE_ICON]);
-
+
+ LLIconCtrl::Params pathfinding_dirty_icon = p.pathfinding_dirty_icon;
+ pathfinding_dirty_icon.tool_tip = LLTrans::getString("LocationCtrlPathfindingDirtyTooltip");
+ pathfinding_dirty_icon.mouse_opaque = true;
+ mParcelIcon[PATHFINDING_DIRTY_ICON] = LLUICtrlFactory::create<LLIconCtrl>(pathfinding_dirty_icon);
+ mParcelIcon[PATHFINDING_DIRTY_ICON]->setMouseDownCallback(boost::bind(&LLLocationInputCtrl::onParcelIconClick, this, PATHFINDING_DIRTY_ICON));
+ addChild(mParcelIcon[PATHFINDING_DIRTY_ICON]);
+
+ LLIconCtrl::Params pathfinding_disabled_icon = p.pathfinding_disabled_icon;
+ pathfinding_disabled_icon.tool_tip = LLTrans::getString("LocationCtrlPathfindingDisabledTooltip");
+ pathfinding_disabled_icon.mouse_opaque = true;
+ mParcelIcon[PATHFINDING_DISABLED_ICON] = LLUICtrlFactory::create<LLIconCtrl>(pathfinding_disabled_icon);
+ mParcelIcon[PATHFINDING_DISABLED_ICON]->setMouseDownCallback(boost::bind(&LLLocationInputCtrl::onParcelIconClick, this, PATHFINDING_DISABLED_ICON));
+ addChild(mParcelIcon[PATHFINDING_DISABLED_ICON]);
+
LLTextBox::Params damage_text = p.damage_text;
damage_text.tool_tip = LLTrans::getString("LocationCtrlDamageTooltip");
damage_text.mouse_opaque = true;
@@ -391,6 +414,9 @@ LLLocationInputCtrl::LLLocationInputCtrl(const LLLocationInputCtrl::Params& p)
mLocationHistoryConnection = LLLocationHistory::getInstance()->setChangedCallback(
boost::bind(&LLLocationInputCtrl::onLocationHistoryChanged, this,_1));
+ mRegionCrossingSlot = LLEnvManagerNew::getInstance()->setRegionChangeCallback(boost::bind(&LLLocationInputCtrl::onRegionBoundaryCrossed, this));
+ createNavMeshStatusListenerForCurrentRegion();
+
mRemoveLandmarkObserver = new LLRemoveLandmarkObserver(this);
mAddLandmarkObserver = new LLAddLandmarkObserver(this);
gInventory.addObserver(mRemoveLandmarkObserver);
@@ -415,6 +441,8 @@ LLLocationInputCtrl::~LLLocationInputCtrl()
LLViewerParcelMgr::getInstance()->removeObserver(mParcelChangeObserver);
delete mParcelChangeObserver;
+ mRegionCrossingSlot.disconnect();
+ mNavMeshSlot.disconnect();
mCoordinatesControlConnection.disconnect();
mParcelPropertiesControlConnection.disconnect();
mParcelMgrConnection.disconnect();
@@ -636,6 +664,17 @@ void LLLocationInputCtrl::onMaturityButtonClicked()
LLUI::sHelpImpl->showTopic(mMaturityHelpTopic);
}
+void LLLocationInputCtrl::onRegionBoundaryCrossed()
+{
+ createNavMeshStatusListenerForCurrentRegion();
+}
+
+void LLLocationInputCtrl::onNavMeshStatusChange(const LLPathfindingNavMeshStatus &pNavMeshStatus)
+{
+ mIsNavMeshDirty = pNavMeshStatus.isValid() && (pNavMeshStatus.getStatus() != LLPathfindingNavMeshStatus::kComplete);
+ refreshParcelIcons();
+}
+
void LLLocationInputCtrl::onLandmarkLoaded(LLLandmark* lm)
{
(void) lm;
@@ -819,6 +858,7 @@ void LLLocationInputCtrl::refreshParcelIcons()
bool allow_scripts = vpm->allowAgentScripts(agent_region, current_parcel);
bool allow_damage = vpm->allowAgentDamage(agent_region, current_parcel);
bool see_avs = current_parcel->getSeeAVs();
+ bool pathfinding_dynamic_enabled = agent_region->dynamicPathfindingEnabled();
// Most icons are "block this ability"
mParcelIcon[VOICE_ICON]->setVisible( !allow_voice );
@@ -827,6 +867,9 @@ void LLLocationInputCtrl::refreshParcelIcons()
mParcelIcon[BUILD_ICON]->setVisible( !allow_build );
mParcelIcon[SCRIPTS_ICON]->setVisible( !allow_scripts );
mParcelIcon[DAMAGE_ICON]->setVisible( allow_damage );
+ mParcelIcon[PATHFINDING_DIRTY_ICON]->setVisible(mIsNavMeshDirty);
+ mParcelIcon[PATHFINDING_DISABLED_ICON]->setVisible(!mIsNavMeshDirty && !pathfinding_dynamic_enabled);
+
mDamageText->setVisible(allow_damage);
mParcelIcon[SEE_AVATARS_ICON]->setVisible( !see_avs );
@@ -1165,6 +1208,12 @@ void LLLocationInputCtrl::onParcelIconClick(EParcelIcon icon)
case BUILD_ICON:
LLNotificationsUtil::add("NoBuild");
break;
+ case PATHFINDING_DIRTY_ICON:
+ LLNotificationsUtil::add("PathfindingDirty");
+ break;
+ case PATHFINDING_DISABLED_ICON:
+ LLNotificationsUtil::add("DynamicPathfindingDisabled");
+ break;
case SCRIPTS_ICON:
{
LLViewerRegion* region = gAgent.getRegion();
@@ -1193,3 +1242,18 @@ void LLLocationInputCtrl::onParcelIconClick(EParcelIcon icon)
// no default to get compiler warning when a new icon gets added
}
}
+
+void LLLocationInputCtrl::createNavMeshStatusListenerForCurrentRegion()
+{
+ if (mNavMeshSlot.connected())
+ {
+ mNavMeshSlot.disconnect();
+ }
+
+ LLViewerRegion *currentRegion = gAgent.getRegion();
+ if (currentRegion != NULL)
+ {
+ mNavMeshSlot = LLPathfindingManager::getInstance()->registerNavMeshListenerForRegion(currentRegion, boost::bind(&LLLocationInputCtrl::onNavMeshStatusChange, this, _2));
+ LLPathfindingManager::getInstance()->requestGetNavMeshForRegion(currentRegion, true);
+ }
+}
diff --git a/indra/newview/lllocationinputctrl.h b/indra/newview/lllocationinputctrl.h
index ed47ba73e3..cd6fd24077 100644
--- a/indra/newview/lllocationinputctrl.h
+++ b/indra/newview/lllocationinputctrl.h
@@ -31,6 +31,7 @@
#include "lliconctrl.h" // Params
#include "lltextbox.h" // Params
#include "lllocationhistory.h"
+#include "llpathfindingnavmesh.h"
class LLLandmark;
@@ -40,6 +41,7 @@ class LLRemoveLandmarkObserver;
class LLParcelChangeObserver;
class LLMenuGL;
class LLTeleportHistoryItem;
+class LLPathfindingNavMeshStatus;
/**
* Location input control.
@@ -78,7 +80,9 @@ public:
build_icon,
scripts_icon,
damage_icon,
- see_avatars_icon;
+ see_avatars_icon,
+ pathfinding_dirty_icon,
+ pathfinding_disabled_icon;
Optional<LLTextBox::Params> damage_text;
Params();
};
@@ -110,13 +114,15 @@ private:
enum EParcelIcon
{
VOICE_ICON = 0,
- FLY_ICON, // 1
- PUSH_ICON, // 2
- BUILD_ICON, // 3
- SCRIPTS_ICON, // 4
- DAMAGE_ICON, // 5
- SEE_AVATARS_ICON, // 6
- ICON_COUNT // 7 total
+ FLY_ICON, // 1
+ PUSH_ICON, // 2
+ BUILD_ICON, // 3
+ SCRIPTS_ICON, // 4
+ DAMAGE_ICON, // 5
+ SEE_AVATARS_ICON, // 6
+ PATHFINDING_DIRTY_ICON, // 7
+ PATHFINDING_DISABLED_ICON,// 8
+ ICON_COUNT // 9 total
};
friend class LLUICtrlFactory;
@@ -155,11 +161,15 @@ private:
void onAddLandmarkButtonClicked();
void onAgentParcelChange();
void onMaturityButtonClicked();
+ void onRegionBoundaryCrossed();
+ void onNavMeshStatusChange(const LLPathfindingNavMeshStatus &pNavMeshStatus);
// callbacks
bool onLocationContextMenuItemEnabled(const LLSD& userdata);
void onLocationContextMenuItemClicked(const LLSD& userdata);
void onParcelIconClick(EParcelIcon icon);
+ void createNavMeshStatusListenerForCurrentRegion();
+
LLMenuGL* mLocationContextMenu;
LLButton* mAddLandmarkBtn;
LLButton* mForSaleBtn;
@@ -179,11 +189,15 @@ private:
boost::signals2::connection mParcelPropertiesControlConnection;
boost::signals2::connection mParcelMgrConnection;
boost::signals2::connection mLocationHistoryConnection;
+ boost::signals2::connection mRegionCrossingSlot;
+ LLPathfindingNavMesh::navmesh_slot_t mNavMeshSlot;
+ bool mIsNavMeshDirty;
LLUIImage* mLandmarkImageOn;
LLUIImage* mLandmarkImageOff;
LLPointer<LLUIImage> mIconMaturityGeneral;
LLPointer<LLUIImage> mIconMaturityAdult;
LLPointer<LLUIImage> mIconMaturityModerate;
+ LLPointer<LLUIImage> mIconPathfindingDynamic;
std::string mAddLandmarkTooltip;
std::string mEditLandmarkTooltip;
diff --git a/indra/newview/llmachineid.cpp b/indra/newview/llmachineid.cpp
index 778693876e..cd6473921d 100644
--- a/indra/newview/llmachineid.cpp
+++ b/indra/newview/llmachineid.cpp
@@ -252,12 +252,20 @@ S32 LLMachineID::getUniqueID(unsigned char *unique_id, size_t len)
if (has_static_unique_id)
{
memcpy ( unique_id, &static_unique_id, len);
- LL_DEBUGS("AppInit") << "UniqueID: " << unique_id[0] << unique_id[1]<< unique_id[2] << unique_id[3] << unique_id[4] << unique_id [5] << LL_ENDL;
+ LL_DEBUGS("AppInit") << "UniqueID: 0x";
+ // Code between here and LL_ENDL is not executed unless the LL_DEBUGS
+ // actually produces output
+ for (size_t i = 0; i < len; ++i)
+ {
+ // Copy each char to unsigned int to hexify. Sending an unsigned
+ // char to a std::ostream tries to represent it as a char, not
+ // what we want here.
+ unsigned byte = unique_id[i];
+ LL_CONT << std::hex << std::setw(2) << std::setfill('0') << byte;
+ }
+ // Reset default output formatting to avoid nasty surprises!
+ LL_CONT << std::dec << std::setw(0) << std::setfill(' ') << LL_ENDL;
return 1;
}
return 0;
}
-
-
-
-
diff --git a/indra/newview/llmaniprotate.cpp b/indra/newview/llmaniprotate.cpp
index a8da94f75e..826e8d560a 100644
--- a/indra/newview/llmaniprotate.cpp
+++ b/indra/newview/llmaniprotate.cpp
@@ -479,9 +479,12 @@ BOOL LLManipRotate::handleMouseUp(S32 x, S32 y, MASK mask)
{
LLSelectNode* selectNode = *iter;
LLViewerObject* object = selectNode->getObject();
+ LLViewerObject* root_object = (object == NULL) ? NULL : object->getRootEdit();
// have permission to move and object is root of selection or individually selected
- if (object->permMove() && (object->isRootEdit() || selectNode->mIndividualSelection))
+ if (object->permMove() && !object->isPermanentEnforced() &&
+ ((root_object == NULL) || !root_object->isPermanentEnforced()) &&
+ (object->isRootEdit() || selectNode->mIndividualSelection))
{
object->mUnselectedChildrenPositions.clear() ;
}
@@ -567,9 +570,12 @@ void LLManipRotate::drag( S32 x, S32 y )
{
LLSelectNode* selectNode = *iter;
LLViewerObject* object = selectNode->getObject();
+ LLViewerObject* root_object = (object == NULL) ? NULL : object->getRootEdit();
// have permission to move and object is root of selection or individually selected
- if (object->permMove() && (object->isRootEdit() || selectNode->mIndividualSelection))
+ if (object->permMove() && !object->isPermanentEnforced() &&
+ ((root_object == NULL) || !root_object->isPermanentEnforced()) &&
+ (object->isRootEdit() || selectNode->mIndividualSelection))
{
if (!object->isRootEdit())
{
@@ -621,9 +627,11 @@ void LLManipRotate::drag( S32 x, S32 y )
{
LLSelectNode* selectNode = *iter;
LLViewerObject* object = selectNode->getObject();
+ LLViewerObject* root_object = (object == NULL) ? NULL : object->getRootEdit();
// to avoid cumulative position changes we calculate the objects new position using its saved position
- if (object && object->permMove())
+ if (object && object->permMove() && !object->isPermanentEnforced() &&
+ ((root_object == NULL) || !root_object->isPermanentEnforced()))
{
LLVector3 center = gAgent.getPosAgentFromGlobal( mRotationCenter );
@@ -704,7 +712,10 @@ void LLManipRotate::drag( S32 x, S32 y )
{
LLSelectNode* selectNode = *iter;
LLViewerObject*cur = selectNode->getObject();
- if( cur->permModify() && cur->permMove() && !cur->isAvatar())
+ LLViewerObject *root_object = (cur == NULL) ? NULL : cur->getRootEdit();
+ if( cur->permModify() && cur->permMove() && !cur->isPermanentEnforced() &&
+ ((root_object == NULL) || !root_object->isPermanentEnforced()) &&
+ !cur->isAvatar())
{
selectNode->mLastRotation = cur->getRotation();
selectNode->mLastPositionLocal = cur->getPosition();
@@ -1871,7 +1882,10 @@ BOOL LLManipRotate::canAffectSelection()
{
virtual bool apply(LLViewerObject* objectp)
{
- return objectp->permMove() && (objectp->permModify() || !gSavedSettings.getBOOL("EditLinkedParts"));
+ LLViewerObject *root_object = (objectp == NULL) ? NULL : objectp->getRootEdit();
+ return objectp->permMove() && !objectp->isPermanentEnforced() &&
+ ((root_object == NULL) || !root_object->isPermanentEnforced()) &&
+ (objectp->permModify() || !gSavedSettings.getBOOL("EditLinkedParts"));
}
} func;
can_rotate = mObjectSelection->applyToObjects(&func);
diff --git a/indra/newview/llmanipscale.cpp b/indra/newview/llmanipscale.cpp
index f6df4cdfbf..00a0bf8894 100644
--- a/indra/newview/llmanipscale.cpp
+++ b/indra/newview/llmanipscale.cpp
@@ -826,7 +826,10 @@ void LLManipScale::drag( S32 x, S32 y )
{
LLSelectNode* selectNode = *iter;
LLViewerObject*cur = selectNode->getObject();
- if( cur->permModify() && cur->permMove() && !cur->isAvatar())
+ LLViewerObject *root_object = (cur == NULL) ? NULL : cur->getRootEdit();
+ if( cur->permModify() && cur->permMove() && !cur->isPermanentEnforced() &&
+ ((root_object == NULL) || !root_object->isPermanentEnforced()) &&
+ !cur->isAvatar())
{
selectNode->mLastScale = cur->getScale();
selectNode->mLastPositionLocal = cur->getPosition();
@@ -973,7 +976,10 @@ void LLManipScale::dragCorner( S32 x, S32 y )
{
LLSelectNode* selectNode = *iter;
LLViewerObject* cur = selectNode->getObject();
- if( cur->permModify() && cur->permMove() && !cur->isAvatar() )
+ LLViewerObject *root_object = (cur == NULL) ? NULL : cur->getRootEdit();
+ if( cur->permModify() && cur->permMove() && !cur->isPermanentEnforced() &&
+ ((root_object == NULL) || !root_object->isPermanentEnforced()) &&
+ !cur->isAvatar() )
{
const LLVector3& scale = selectNode->mSavedScale;
@@ -995,7 +1001,10 @@ void LLManipScale::dragCorner( S32 x, S32 y )
{
LLSelectNode* selectNode = *iter;
LLViewerObject* cur = selectNode->getObject();
- if( cur->permModify() && cur->permMove() && !cur->isAvatar() && cur->isRootEdit() )
+ LLViewerObject *root_object = (cur == NULL) ? NULL : cur->getRootEdit();
+ if( cur->permModify() && cur->permMove() && !cur->isPermanentEnforced() &&
+ ((root_object == NULL) || !root_object->isPermanentEnforced()) &&
+ !cur->isAvatar() && cur->isRootEdit() )
{
const LLVector3& scale = selectNode->mSavedScale;
cur->setScale( scale_factor * scale );
@@ -1043,7 +1052,10 @@ void LLManipScale::dragCorner( S32 x, S32 y )
{
LLSelectNode* selectNode = *iter;
LLViewerObject*cur = selectNode->getObject();
- if( cur->permModify() && cur->permMove() && !cur->isAvatar() && !cur->isRootEdit() )
+ LLViewerObject *root_object = (cur == NULL) ? NULL : cur->getRootEdit();
+ if( cur->permModify() && cur->permMove() && !cur->isPermanentEnforced() &&
+ ((root_object == NULL) || !root_object->isPermanentEnforced()) &&
+ !cur->isAvatar() && !cur->isRootEdit() )
{
const LLVector3& scale = selectNode->mSavedScale;
cur->setScale( scale_factor * scale, FALSE );
@@ -1251,7 +1263,10 @@ void LLManipScale::stretchFace( const LLVector3& drag_start_agent, const LLVecto
{
LLSelectNode* selectNode = *iter;
LLViewerObject*cur = selectNode->getObject();
- if( cur->permModify() && cur->permMove() && !cur->isAvatar() )
+ LLViewerObject *root_object = (cur == NULL) ? NULL : cur->getRootEdit();
+ if( cur->permModify() && cur->permMove() && !cur->isPermanentEnforced() &&
+ ((root_object == NULL) || !root_object->isPermanentEnforced()) &&
+ !cur->isAvatar() )
{
LLBBox cur_bbox = cur->getBoundingBoxAgent();
LLVector3 start_local = cur_bbox.agentToLocal( drag_start_agent );
@@ -2057,7 +2072,10 @@ BOOL LLManipScale::canAffectSelection()
{
virtual bool apply(LLViewerObject* objectp)
{
- return objectp->permModify() && objectp->permMove() && !objectp->isSeat();
+ LLViewerObject *root_object = (objectp == NULL) ? NULL : objectp->getRootEdit();
+ return objectp->permModify() && objectp->permMove() && !objectp->isPermanentEnforced() &&
+ ((root_object == NULL) || !root_object->isPermanentEnforced()) &&
+ !objectp->isSeat();
}
} func;
can_scale = mObjectSelection->applyToObjects(&func);
diff --git a/indra/newview/llmaniptranslate.cpp b/indra/newview/llmaniptranslate.cpp
index 3a88fbd96d..362308c176 100644
--- a/indra/newview/llmaniptranslate.cpp
+++ b/indra/newview/llmaniptranslate.cpp
@@ -60,6 +60,7 @@
#include "llworld.h"
#include "llui.h"
#include "pipeline.h"
+#include "llviewershadermgr.h"
const S32 NUM_AXES = 3;
const S32 MOUSE_DRAG_SLOP = 2; // pixels
@@ -687,7 +688,9 @@ BOOL LLManipTranslate::handleHover(S32 x, S32 y, MASK mask)
}
}
- if (object->permMove())
+ LLViewerObject* root_object = (object == NULL) ? NULL : object->getRootEdit();
+ if (object->permMove() && !object->isPermanentEnforced() &&
+ ((root_object == NULL) || !root_object->isPermanentEnforced()))
{
// handle attachments in local space
if (object->isAttachment() && object->mDrawable.notNull())
@@ -1580,7 +1583,11 @@ void LLManipTranslate::renderSnapGuides()
LLGLDepthTest gls_depth(GL_TRUE, GL_FALSE, GL_GREATER);
LLGLEnable stipple(GL_LINE_STIPPLE);
gGL.flush();
- glLineStipple(1, 0x3333);
+
+ if (!LLGLSLShader::sNoFixedFunction)
+ {
+ glLineStipple(1, 0x3333);
+ }
switch (mManipPart)
{
@@ -1645,17 +1652,28 @@ void LLManipTranslate::highlightIntersection(LLVector3 normal,
LLQuaternion grid_rotation,
LLColor4 inner_color)
{
- if (!gSavedSettings.getBOOL("GridCrossSections"))
+ if (!gSavedSettings.getBOOL("GridCrossSections") || !LLGLSLShader::sNoFixedFunction)
{
return;
}
+
+ LLGLSLShader* shader = LLGLSLShader::sCurBoundShaderPtr;
+
+
U32 types[] = { LLRenderPass::PASS_SIMPLE, LLRenderPass::PASS_ALPHA, LLRenderPass::PASS_FULLBRIGHT, LLRenderPass::PASS_SHINY };
U32 num_types = LL_ARRAY_SIZE(types);
GLuint stencil_mask = 0xFFFFFFFF;
//stencil in volumes
+
gGL.flush();
+
+ if (shader)
+ {
+ gClipProgram.bind();
+ }
+
{
glStencilMask(stencil_mask);
glClearStencil(1);
@@ -1666,6 +1684,7 @@ void LLManipTranslate::highlightIntersection(LLVector3 normal,
glStencilFunc(GL_ALWAYS, 0, stencil_mask);
gGL.setColorMask(false, false);
gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
+
gGL.diffuseColor4f(1,1,1,1);
//setup clip plane
@@ -1675,10 +1694,12 @@ void LLManipTranslate::highlightIntersection(LLVector3 normal,
normal = -normal;
}
F32 d = -(selection_center * normal);
- F64 plane[] = { normal.mV[0], normal.mV[1], normal.mV[2], d };
- LLGLEnable clip(GL_CLIP_PLANE0);
- glClipPlane(GL_CLIP_PLANE0, plane);
+ glh::vec4f plane(normal.mV[0], normal.mV[1], normal.mV[2], d );
+
+ gGL.getModelviewMatrix().inverse().mult_vec_matrix(plane);
+ gClipProgram.uniform4fv("clip_plane", 1, plane.v);
+
BOOL particles = gPipeline.hasRenderType(LLPipeline::RENDER_TYPE_PARTICLES);
BOOL clouds = gPipeline.hasRenderType(LLPipeline::RENDER_TYPE_CLOUDS);
@@ -1729,6 +1750,16 @@ void LLManipTranslate::highlightIntersection(LLVector3 normal,
F32 sz = mGridSizeMeters;
F32 tiles = sz;
+ if (shader)
+ {
+ shader->bind();
+ }
+
+ if (shader)
+ {
+ shader->bind();
+ }
+
//draw volume/plane intersections
{
gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
@@ -2281,7 +2312,10 @@ BOOL LLManipTranslate::canAffectSelection()
{
virtual bool apply(LLViewerObject* objectp)
{
- return objectp->permMove() && (objectp->permModify() || !gSavedSettings.getBOOL("EditLinkedParts"));
+ LLViewerObject *root_object = (objectp == NULL) ? NULL : objectp->getRootEdit();
+ return objectp->permMove() && !objectp->isPermanentEnforced() &&
+ ((root_object == NULL) || !root_object->isPermanentEnforced()) &&
+ (objectp->permModify() || !gSavedSettings.getBOOL("EditLinkedParts"));
}
} func;
can_move = mObjectSelection->applyToObjects(&func);
diff --git a/indra/newview/llmarketplacefunctions.cpp b/indra/newview/llmarketplacefunctions.cpp
index 93dd82957f..0b009b68f7 100644
--- a/indra/newview/llmarketplacefunctions.cpp
+++ b/indra/newview/llmarketplacefunctions.cpp
@@ -47,16 +47,16 @@ static std::string getMarketplaceDomain()
if (!LLGridManager::getInstance()->isInProductionGrid())
{
- const std::string& grid_label = LLGridManager::getInstance()->getGridLabel();
- const std::string& grid_label_lower = utf8str_tolower(grid_label);
+ const std::string& grid_id = LLGridManager::getInstance()->getGridId();
+ const std::string& grid_id_lower = utf8str_tolower(grid_id);
- if (grid_label_lower == "damballah")
+ if (grid_id_lower == "damballah")
{
domain = "secondlife-staging.com";
}
else
{
- domain = llformat("%s.lindenlab.com", grid_label_lower.c_str());
+ domain = llformat("%s.lindenlab.com", grid_id_lower.c_str());
}
}
@@ -336,13 +336,19 @@ namespace LLMarketplaceImport
// Interface class
//
+static const F32 MARKET_IMPORTER_UPDATE_FREQUENCY = 1.0f;
//static
void LLMarketplaceInventoryImporter::update()
{
if (instanceExists())
{
- LLMarketplaceInventoryImporter::instance().updateImport();
+ static LLTimer update_timer;
+ if (update_timer.hasExpired())
+ {
+ LLMarketplaceInventoryImporter::instance().updateImport();
+ update_timer.setTimerExpirySec(MARKET_IMPORTER_UPDATE_FREQUENCY);
+ }
}
}
diff --git a/indra/newview/llmeshrepository.cpp b/indra/newview/llmeshrepository.cpp
index c899e8991e..bc7f522848 100755
--- a/indra/newview/llmeshrepository.cpp
+++ b/indra/newview/llmeshrepository.cpp
@@ -1659,7 +1659,7 @@ void LLMeshUploadThread::requestWholeModelFee()
mCurlRequest->process();
//sleep for 10ms to prevent eating a whole core
apr_sleep(10000);
- } while (mCurlRequest->getQueued() > 0);
+ } while (!LLApp::isQuitting() && mCurlRequest->getQueued() > 0);
delete mCurlRequest;
mCurlRequest = NULL;
diff --git a/indra/newview/llmoveview.cpp b/indra/newview/llmoveview.cpp
index c3d8b91d67..93f7146fc8 100644
--- a/indra/newview/llmoveview.cpp
+++ b/indra/newview/llmoveview.cpp
@@ -686,7 +686,7 @@ void LLPanelStandStopFlying::onStopFlyingButtonClick()
gAgent.setFlying(FALSE);
setFocus(FALSE); // EXT-482
- setVisible(FALSE);
+ mStopFlyingButton->setVisible(FALSE);
}
/**
@@ -710,7 +710,7 @@ void LLPanelStandStopFlying::updatePosition()
left_tb_width = toolbar_left->getRect().getWidth();
}
- if(LLPanel* panel_ssf_container = getRootView()->getChild<LLPanel>("stand_stop_flying_container"))
+ if(LLPanel* panel_ssf_container = getRootView()->getChild<LLPanel>("state_management_buttons_container"))
{
panel_ssf_container->setOrigin(0, y_pos);
}
diff --git a/indra/newview/llmutelist.cpp b/indra/newview/llmutelist.cpp
index a7059eb519..54522bb7f6 100644
--- a/indra/newview/llmutelist.cpp
+++ b/indra/newview/llmutelist.cpp
@@ -44,6 +44,8 @@
#include "llmutelist.h"
+#include "pipeline.h"
+
#include <boost/tokenizer.hpp>
#include "lldispatcher.h"
@@ -192,6 +194,23 @@ BOOL LLMuteList::isLinden(const std::string& name) const
return last_name == "Linden";
}
+static LLVOAvatar* find_avatar(const LLUUID& id)
+{
+ LLViewerObject *obj = gObjectList.findObject(id);
+ while (obj && obj->isAttachment())
+ {
+ obj = (LLViewerObject *)obj->getParent();
+ }
+
+ if (obj && obj->isAvatar())
+ {
+ return (LLVOAvatar*)obj;
+ }
+ else
+ {
+ return NULL;
+ }
+}
BOOL LLMuteList::add(const LLMute& mute, U32 flags)
{
@@ -288,6 +307,12 @@ BOOL LLMuteList::add(const LLMute& mute, U32 flags)
LLViewerPartSim::getInstance()->clearParticlesByOwnerID(localmute.mID);
}
}
+ //mute local lights that are attached to the avatar
+ LLVOAvatar *avatarp = find_avatar(localmute.mID);
+ if (avatarp)
+ {
+ LLPipeline::removeMutedAVsLights(avatarp);
+ }
return TRUE;
}
}
diff --git a/indra/newview/llnamelistctrl.cpp b/indra/newview/llnamelistctrl.cpp
index 4e28d1f526..472c26e22d 100644
--- a/indra/newview/llnamelistctrl.cpp
+++ b/indra/newview/llnamelistctrl.cpp
@@ -336,7 +336,7 @@ LLScrollListItem* LLNameListCtrl::addNameItemRow(
// ...schedule a callback
LLAvatarNameCache::get(id,
boost::bind(&LLNameListCtrl::onAvatarNameCache,
- this, _1, _2));
+ this, _1, _2, item->getHandle()));
}
break;
}
@@ -392,7 +392,8 @@ void LLNameListCtrl::removeNameItem(const LLUUID& agent_id)
}
void LLNameListCtrl::onAvatarNameCache(const LLUUID& agent_id,
- const LLAvatarName& av_name)
+ const LLAvatarName& av_name,
+ LLHandle<LLNameListItem> item)
{
std::string name;
if (mShortNames)
@@ -400,17 +401,14 @@ void LLNameListCtrl::onAvatarNameCache(const LLUUID& agent_id,
else
name = av_name.getCompleteName();
- item_list::iterator iter;
- for (iter = getItemList().begin(); iter != getItemList().end(); iter++)
+ LLNameListItem* list_item = item.get();
+ if (list_item && list_item->getUUID() == agent_id)
{
- LLScrollListItem* item = *iter;
- if (item->getUUID() == agent_id)
+ LLScrollListCell* cell = list_item->getColumn(mNameColumnIndex);
+ if (cell)
{
- LLScrollListCell* cell = item->getColumn(mNameColumnIndex);
- if (cell)
- {
- cell->setValue(name);
- }
+ cell->setValue(name);
+ setNeedsSort();
}
}
@@ -431,3 +429,8 @@ void LLNameListCtrl::updateColumns()
}
}
}
+
+void LLNameListCtrl::sortByName(BOOL ascending)
+{
+ sortByColumnIndex(mNameColumnIndex,ascending);
+}
diff --git a/indra/newview/llnamelistctrl.h b/indra/newview/llnamelistctrl.h
index ca9956dc53..ba85e77c65 100644
--- a/indra/newview/llnamelistctrl.h
+++ b/indra/newview/llnamelistctrl.h
@@ -33,6 +33,26 @@
class LLAvatarName;
+/**
+ * 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).
+ */
+class LLNameListItem : public LLScrollListItem, public LLHandleProvider<LLNameListItem>
+{
+public:
+ LLUUID getUUID() const { return getValue()["uuid"].asUUID(); }
+protected:
+ friend class LLNameListCtrl;
+
+ LLNameListItem( const LLScrollListItem::Params& p )
+ : LLScrollListItem(p)
+ {
+ }
+};
+
+
class LLNameListCtrl
: public LLScrollListCtrl, public LLInstanceTracker<LLNameListCtrl>
{
@@ -110,12 +130,14 @@ public:
void setAllowCallingCardDrop(BOOL b) { mAllowCallingCardDrop = b; }
+ void sortByName(BOOL ascending);
+
/*virtual*/ void updateColumns();
/*virtual*/ void mouseOverHighlightNthItem( S32 index );
private:
void showInspector(const LLUUID& avatar_id, bool is_group);
- void onAvatarNameCache(const LLUUID& agent_id, const LLAvatarName& av_name);
+ void onAvatarNameCache(const LLUUID& agent_id, const LLAvatarName& av_name, LLHandle<LLNameListItem> item);
private:
S32 mNameColumnIndex;
@@ -124,24 +146,5 @@ private:
bool mShortNames; // display name only, no SLID
};
-/**
- * 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).
- */
-class LLNameListItem : public LLScrollListItem
-{
-public:
- LLUUID getUUID() const { return getValue()["uuid"].asUUID(); }
-
-protected:
- friend class LLNameListCtrl;
-
- LLNameListItem( const LLScrollListItem::Params& p )
- : LLScrollListItem(p)
- {
- }
-};
#endif
diff --git a/indra/newview/llnearbychatbar.cpp b/indra/newview/llnearbychatbar.cpp
index 00ff81724c..f8f0f7d243 100644
--- a/indra/newview/llnearbychatbar.cpp
+++ b/indra/newview/llnearbychatbar.cpp
@@ -52,6 +52,7 @@
#include "lltranslate.h"
#include "llresizehandle.h"
+#include "llautoreplace.h"
S32 LLNearbyChatBar::sLastSpecialChatChannel = 0;
@@ -89,6 +90,7 @@ BOOL LLNearbyChatBar::postBuild()
{
mChatBox = getChild<LLLineEditor>("chat_box");
+ mChatBox->setAutoreplaceCallback(boost::bind(&LLAutoReplace::autoreplaceCallback, LLAutoReplace::getInstance(), _1, _2));
mChatBox->setCommitCallback(boost::bind(&LLNearbyChatBar::onChatBoxCommit, this));
mChatBox->setKeystrokeCallback(&onChatBoxKeystroke, this);
mChatBox->setFocusLostCallback(boost::bind(&onChatBoxFocusLost, _1, this));
diff --git a/indra/newview/llnotificationhandlerutil.cpp b/indra/newview/llnotificationhandlerutil.cpp
index 7c6287967a..16c51138a9 100644
--- a/indra/newview/llnotificationhandlerutil.cpp
+++ b/indra/newview/llnotificationhandlerutil.cpp
@@ -128,6 +128,8 @@ const static std::string GRANTED_MODIFY_RIGHTS("GrantedModifyRights"),
FRIEND_ONLINE("FriendOnline"), FRIEND_OFFLINE("FriendOffline"),
SERVER_OBJECT_MESSAGE("ServerObjectMessage"),
TELEPORT_OFFERED("TeleportOffered"),
+ TELEPORT_OFFERED_MATURITY_EXCEEDED("TeleportOffered_MaturityExceeded"),
+ TELEPORT_OFFERED_MATURITY_BLOCKED("TeleportOffered_MaturityBlocked"),
TELEPORT_OFFER_SENT("TeleportOfferSent"),
IM_SYSTEM_MESSAGE_TIP("IMSystemMessageTip");
@@ -149,6 +151,8 @@ bool LLHandlerUtil::canLogToIM(const LLNotificationPtr& notification)
|| INVENTORY_DECLINED == notification->getName()
|| USER_GIVE_ITEM == notification->getName()
|| TELEPORT_OFFERED == notification->getName()
+ || TELEPORT_OFFERED_MATURITY_EXCEEDED == notification->getName()
+ || TELEPORT_OFFERED_MATURITY_BLOCKED == notification->getName()
|| TELEPORT_OFFER_SENT == notification->getName()
|| IM_SYSTEM_MESSAGE_TIP == notification->getName();
}
@@ -169,7 +173,9 @@ bool LLHandlerUtil::canSpawnIMSession(const LLNotificationPtr& notification)
{
return OFFER_FRIENDSHIP == notification->getName()
|| USER_GIVE_ITEM == notification->getName()
- || TELEPORT_OFFERED == notification->getName();
+ || TELEPORT_OFFERED == notification->getName()
+ || TELEPORT_OFFERED_MATURITY_EXCEEDED == notification->getName()
+ || TELEPORT_OFFERED_MATURITY_BLOCKED == notification->getName();
}
// static
@@ -177,7 +183,9 @@ bool LLHandlerUtil::canAddNotifPanelToIM(const LLNotificationPtr& notification)
{
return OFFER_FRIENDSHIP == notification->getName()
|| USER_GIVE_ITEM == notification->getName()
- || TELEPORT_OFFERED == notification->getName();
+ || TELEPORT_OFFERED == notification->getName()
+ || TELEPORT_OFFERED_MATURITY_EXCEEDED == notification->getName()
+ || TELEPORT_OFFERED_MATURITY_BLOCKED == notification->getName();
}
// static
@@ -185,7 +193,9 @@ bool LLHandlerUtil::isNotificationReusable(const LLNotificationPtr& notification
{
return OFFER_FRIENDSHIP == notification->getName()
|| USER_GIVE_ITEM == notification->getName()
- || TELEPORT_OFFERED == notification->getName();
+ || TELEPORT_OFFERED == notification->getName()
+ || TELEPORT_OFFERED_MATURITY_EXCEEDED == notification->getName()
+ || TELEPORT_OFFERED_MATURITY_BLOCKED == notification->getName();
}
// static
@@ -212,7 +222,9 @@ bool LLHandlerUtil::canSpawnToast(const LLNotificationPtr& notification)
if(OFFER_FRIENDSHIP == notification->getName()
|| USER_GIVE_ITEM == notification->getName()
- || TELEPORT_OFFERED == notification->getName())
+ || TELEPORT_OFFERED == notification->getName()
+ || TELEPORT_OFFERED_MATURITY_EXCEEDED == notification->getName()
+ || TELEPORT_OFFERED_MATURITY_BLOCKED == notification->getName())
{
// When ANY offer arrives, show toast, unless IM window is already open - EXT-5904
return ! isIMFloaterOpened(notification);
diff --git a/indra/newview/llpanelcontents.cpp b/indra/newview/llpanelcontents.cpp
index a64b4ec94d..77e1487f38 100644
--- a/indra/newview/llpanelcontents.cpp
+++ b/indra/newview/llpanelcontents.cpp
@@ -116,7 +116,7 @@ void LLPanelContents::getState(LLViewerObject *objectp )
// BUG? Check for all objects being editable?
bool editable = gAgent.isGodlike()
- || (objectp->permModify()
+ || (objectp->permModify() && !objectp->isPermanentEnforced()
&& ( objectp->permYouOwner() || ( !group_id.isNull() && gAgent.isInGroup(group_id) ))); // solves SL-23488
BOOL all_volume = LLSelectMgr::getInstance()->selectionAllPCode( LL_PCODE_VOLUME );
@@ -127,6 +127,8 @@ void LLPanelContents::getState(LLViewerObject *objectp )
((LLSelectMgr::getInstance()->getSelection()->getRootObjectCount() == 1)
|| (LLSelectMgr::getInstance()->getSelection()->getObjectCount() == 1)));
+ getChildView("button permissions")->setEnabled(!objectp->isPermanentEnforced());
+ mPanelInventoryObject->setEnabled(!objectp->isPermanentEnforced());
}
void LLPanelContents::refresh()
diff --git a/indra/newview/llpaneleditwearable.cpp b/indra/newview/llpaneleditwearable.cpp
index 03404e816b..d58d6d536c 100644
--- a/indra/newview/llpaneleditwearable.cpp
+++ b/indra/newview/llpaneleditwearable.cpp
@@ -574,6 +574,7 @@ static void init_texture_ctrl(LLPanelEditWearable* self, LLPanel* panel, const L
texture_ctrl->setAllowNoTexture(entry->mAllowNoTexture);
// Don't allow (no copy) or (notransfer) textures to be selected.
texture_ctrl->setImmediateFilterPermMask(PERM_NONE);
+ texture_ctrl->setDnDFilterPermMask(PERM_NONE);
texture_ctrl->setNonImmediateFilterPermMask(PERM_NONE);
}
}
diff --git a/indra/newview/llpanelface.cpp b/indra/newview/llpanelface.cpp
index 7301b305b2..202be9671b 100644
--- a/indra/newview/llpanelface.cpp
+++ b/indra/newview/llpanelface.cpp
@@ -38,6 +38,7 @@
#include "llfontgl.h"
// project includes
+#include "llagentdata.h"
#include "llbutton.h"
#include "llcheckboxctrl.h"
#include "llcolorswatch.h"
@@ -46,6 +47,7 @@
#include "llface.h"
#include "lllineeditor.h"
#include "llmediaentry.h"
+#include "llnotificationsutil.h"
#include "llresmgr.h"
#include "llselectmgr.h"
#include "llspinctrl.h"
@@ -104,27 +106,11 @@ BOOL LLPanelFace::postBuild()
mTextureCtrl->setOnCancelCallback( boost::bind(&LLPanelFace::onCancelTexture, this, _2) );
mTextureCtrl->setOnSelectCallback( boost::bind(&LLPanelFace::onSelectTexture, this, _2) );
mTextureCtrl->setDragCallback(boost::bind(&LLPanelFace::onDragTexture, this, _2));
+ mTextureCtrl->setOnTextureSelectedCallback(boost::bind(&LLPanelFace::onTextureSelectionChanged, this, _1));
mTextureCtrl->setFollowsTop();
mTextureCtrl->setFollowsLeft();
- // Don't allow (no copy) or (no transfer) textures to be selected during immediate mode
- mTextureCtrl->setImmediateFilterPermMask(PERM_COPY | PERM_TRANSFER);
- // Allow any texture to be used during non-immediate mode.
- mTextureCtrl->setNonImmediateFilterPermMask(PERM_NONE);
- LLAggregatePermissions texture_perms;
- if (LLSelectMgr::getInstance()->selectGetAggregateTexturePermissions(texture_perms))
- {
- BOOL can_copy =
- texture_perms.getValue(PERM_COPY) == LLAggregatePermissions::AP_EMPTY ||
- texture_perms.getValue(PERM_COPY) == LLAggregatePermissions::AP_ALL;
- BOOL can_transfer =
- texture_perms.getValue(PERM_TRANSFER) == LLAggregatePermissions::AP_EMPTY ||
- texture_perms.getValue(PERM_TRANSFER) == LLAggregatePermissions::AP_ALL;
- mTextureCtrl->setCanApplyImmediately(can_copy && can_transfer);
- }
- else
- {
- mTextureCtrl->setCanApplyImmediately(FALSE);
- }
+ mTextureCtrl->setImmediateFilterPermMask(PERM_NONE);
+ mTextureCtrl->setDnDFilterPermMask(PERM_COPY | PERM_TRANSFER);
}
mColorSwatch = getChild<LLColorSwatchCtrl>("colorswatch");
@@ -504,7 +490,7 @@ void LLPanelFace::getState()
&& objectp->getPCode() == LL_PCODE_VOLUME
&& objectp->permModify())
{
- BOOL editable = objectp->permModify();
+ BOOL editable = objectp->permModify() && !objectp->isPermanentEnforced();
// only turn on auto-adjust button if there is a media renderer and the media is loaded
getChildView("textbox autofix")->setEnabled(editable);
@@ -595,28 +581,6 @@ void LLPanelFace::getState()
}
- LLAggregatePermissions texture_perms;
- if(texture_ctrl)
- {
-// texture_ctrl->setValid( editable );
-
- if (LLSelectMgr::getInstance()->selectGetAggregateTexturePermissions(texture_perms))
- {
- BOOL can_copy =
- texture_perms.getValue(PERM_COPY) == LLAggregatePermissions::AP_EMPTY ||
- texture_perms.getValue(PERM_COPY) == LLAggregatePermissions::AP_ALL;
- BOOL can_transfer =
- texture_perms.getValue(PERM_TRANSFER) == LLAggregatePermissions::AP_EMPTY ||
- texture_perms.getValue(PERM_TRANSFER) == LLAggregatePermissions::AP_ALL;
- texture_ctrl->setCanApplyImmediately(can_copy && can_transfer);
- }
- else
- {
- texture_ctrl->setCanApplyImmediately(FALSE);
- }
- }
-
-
// planar align
bool align_planar = false;
bool identical_planar_aligned = false;
@@ -1190,3 +1154,35 @@ void LLPanelFace::onCommitPlanarAlign(LLUICtrl* ctrl, void* userdata)
self->sendTextureInfo();
}
+void LLPanelFace::onTextureSelectionChanged(LLInventoryItem* itemp)
+{
+ LLTextureCtrl* texture_ctrl = getChild<LLTextureCtrl>("texture control");
+ if (texture_ctrl)
+ {
+ LLUUID obj_owner_id;
+ std::string obj_owner_name;
+ LLSelectMgr::instance().selectGetOwner(obj_owner_id, obj_owner_name);
+
+ LLSaleInfo sale_info;
+ LLSelectMgr::instance().selectGetSaleInfo(sale_info);
+
+ bool can_copy = itemp->getPermissions().allowCopyBy(gAgentID); // do we have perm to copy this texture?
+ bool can_transfer = itemp->getPermissions().allowOperationBy(PERM_TRANSFER, gAgentID); // do we have perm to transfer this texture?
+ bool is_object_owner = gAgentID == obj_owner_id; // does object for which we are going to apply texture belong to the agent?
+ bool not_for_sale = !sale_info.isForSale(); // is object for which we are going to apply texture not for sale?
+
+ if (can_copy && can_transfer)
+ {
+ texture_ctrl->setCanApply(true, true);
+ return;
+ }
+
+ // if texture has (no-transfer) attribute it can be applied only for object which we own and is not for sale
+ texture_ctrl->setCanApply(false, can_transfer ? true : is_object_owner && not_for_sale);
+
+ if (gSavedSettings.getBOOL("TextureLivePreview"))
+ {
+ LLNotificationsUtil::add("LivePreviewUnavailable");
+ }
+ }
+}
diff --git a/indra/newview/llpanelface.h b/indra/newview/llpanelface.h
index 42be9b257f..3b5a9b1398 100644
--- a/indra/newview/llpanelface.h
+++ b/indra/newview/llpanelface.h
@@ -91,6 +91,15 @@ protected:
static void onClickAutoFix(void*);
static F32 valueGlow(LLViewerObject* object, S32 face);
+private:
+
+ /*
+ * Checks whether the selected texture from the LLFloaterTexturePicker can be applied to the currently selected object.
+ * If agent selects texture which is not allowed to be applied for the currently selected object,
+ * all controls of the floater texture picker which allow to apply the texture will be disabled.
+ */
+ void onTextureSelectionChanged(LLInventoryItem* itemp);
+
};
#endif
diff --git a/indra/newview/llpanelgroupinvite.cpp b/indra/newview/llpanelgroupinvite.cpp
index 7a15d93181..00dd206571 100644
--- a/indra/newview/llpanelgroupinvite.cpp
+++ b/indra/newview/llpanelgroupinvite.cpp
@@ -83,6 +83,7 @@ public:
LLTextBox *mGroupName;
std::string mOwnerWarning;
std::string mAlreadyInGroup;
+ std::string mTooManySelected;
bool mConfirmedOwnerInvite;
void (*mCloseCallback)(void* data);
@@ -185,6 +186,17 @@ void LLPanelGroupInvite::impl::submitInvitations()
role_member_pairs[item->getUUID()] = role_id;
}
+ const S32 MAX_GROUP_INVITES = 100; // Max invites per request. 100 to match server cap.
+ if (role_member_pairs.size() > MAX_GROUP_INVITES)
+ {
+ // Fail!
+ LLSD msg;
+ msg["MESSAGE"] = mTooManySelected;
+ LLNotificationsUtil::add("GenericAlert", msg);
+ (*mCloseCallback)(mCloseCallbackUserData);
+ return;
+ }
+
LLGroupMgr::getInstance()->sendGroupMemberInvites(mGroupID, role_member_pairs);
if(already_in_group)
@@ -621,6 +633,7 @@ BOOL LLPanelGroupInvite::postBuild()
mImplementation->mOwnerWarning = getString("confirm_invite_owner_str");
mImplementation->mAlreadyInGroup = getString("already_in_group");
+ mImplementation->mTooManySelected = getString("invite_selection_too_large");
update();
diff --git a/indra/newview/llpanellandmedia.cpp b/indra/newview/llpanellandmedia.cpp
index b3adfac8a2..26cd3ff1c1 100644
--- a/indra/newview/llpanellandmedia.cpp
+++ b/indra/newview/llpanellandmedia.cpp
@@ -85,6 +85,7 @@ BOOL LLPanelLandMedia::postBuild()
mMediaTextureCtrl->setCommitCallback( onCommitAny, this );
mMediaTextureCtrl->setAllowNoTexture ( TRUE );
mMediaTextureCtrl->setImmediateFilterPermMask(PERM_COPY | PERM_TRANSFER);
+ mMediaTextureCtrl->setDnDFilterPermMask(PERM_COPY | PERM_TRANSFER);
mMediaTextureCtrl->setNonImmediateFilterPermMask(PERM_COPY | PERM_TRANSFER);
mMediaAutoScaleCheck = getChild<LLCheckBoxCtrl>("media_auto_scale");
diff --git a/indra/newview/llpanellogin.cpp b/indra/newview/llpanellogin.cpp
index 76aadcd913..3bb3e5cf47 100644
--- a/indra/newview/llpanellogin.cpp
+++ b/indra/newview/llpanellogin.cpp
@@ -27,6 +27,7 @@
#include "llviewerprecompiledheaders.h"
#include "llpanellogin.h"
+#include "lllayoutstack.h"
#include "indra_constants.h" // for key and mask constants
#include "llfloaterreg.h"
@@ -104,7 +105,6 @@ public:
// Public methods
//---------------------------------------------------------------------------
LLPanelLogin::LLPanelLogin(const LLRect &rect,
- BOOL show_server,
void (*callback)(S32 option, void* user_data),
void *cb_data)
: LLPanel(),
@@ -119,7 +119,7 @@ LLPanelLogin::LLPanelLogin(const LLRect &rect,
// instance management
if (LLPanelLogin::sInstance)
{
- llwarns << "Duplicate instance of login view deleted" << llendl;
+ LL_WARNS("AppInit") << "Duplicate instance of login view deleted" << LL_ENDL;
// Don't leave bad pointer in gFocusMgr
gFocusMgr.setDefaultKeyboardFocus(NULL);
@@ -146,37 +146,73 @@ LLPanelLogin::LLPanelLogin(const LLRect &rect,
// change z sort of clickable text to be behind buttons
sendChildToBack(getChildView("forgot_password_text"));
+
+ LLComboBox* location_combo = getChild<LLComboBox>("start_location_combo");
+ updateLocationSelectorsVisibility(); // separate so that it can be called from preferences
+ location_combo->setFocusLostCallback(boost::bind(&LLPanelLogin::onLocationSLURL, this));
+
+ LLComboBox* server_choice_combo = getChild<LLComboBox>("server_combo");
+ server_choice_combo->setCommitCallback(boost::bind(&LLPanelLogin::onSelectServer, this));
- if(LLStartUp::getStartSLURL().getType() != LLSLURL::LOCATION)
+ // Load all of the grids, sorted, and then add a bar and the current grid at the top
+ server_choice_combo->removeall();
+
+ std::string current_grid = LLGridManager::getInstance()->getGrid();
+ std::map<std::string, std::string> known_grids = LLGridManager::getInstance()->getKnownGrids();
+ for (std::map<std::string, std::string>::iterator grid_choice = known_grids.begin();
+ grid_choice != known_grids.end();
+ grid_choice++)
{
- LLSLURL slurl(gSavedSettings.getString("LoginLocation"));
- LLStartUp::setStartSLURL(slurl);
+ if (!grid_choice->first.empty() && current_grid != grid_choice->first)
+ {
+ LL_DEBUGS("AppInit")<<"adding "<<grid_choice->first<<LL_ENDL;
+ server_choice_combo->add(grid_choice->second, grid_choice->first);
+ }
}
- updateLocationCombo(false);
-
- LLComboBox* server_choice_combo = sInstance->getChild<LLComboBox>("server_combo");
- server_choice_combo->setCommitCallback(onSelectServer, NULL);
- server_choice_combo->setFocusLostCallback(boost::bind(onServerComboLostFocus, _1));
- updateServerCombo();
+ server_choice_combo->sortByName();
+ server_choice_combo->addSeparator(ADD_TOP);
+ LL_DEBUGS("AppInit")<<"adding current "<<current_grid<<LL_ENDL;
+ server_choice_combo->add(LLGridManager::getInstance()->getGridLabel(),
+ current_grid,
+ ADD_TOP);
+ server_choice_combo->selectFirstItem();
+ LLSLURL start_slurl(LLStartUp::getStartSLURL());
+ if ( !start_slurl.isSpatial() ) // has a start been established by the command line or NextLoginLocation ?
+ {
+ // no, so get the preference setting
+ std::string defaultStartLocation = gSavedSettings.getString("LoginLocation");
+ LL_INFOS("AppInit")<<"default LoginLocation '"<<defaultStartLocation<<"'"<<LL_ENDL;
+ LLSLURL defaultStart(defaultStartLocation);
+ if ( defaultStart.isSpatial() )
+ {
+ LLStartUp::setStartSLURL(defaultStart);
+ }
+ else
+ {
+ LL_INFOS("AppInit")<<"no valid LoginLocation, using home"<<LL_ENDL;
+ LLSLURL homeStart(LLSLURL::SIM_LOCATION_HOME);
+ LLStartUp::setStartSLURL(homeStart);
+ }
+ }
+ else
+ {
+ LLPanelLogin::onUpdateStartSLURL(start_slurl); // updates grid if needed
+ }
+
childSetAction("connect_btn", onClickConnect, this);
- getChild<LLPanel>("login")->setDefaultBtn("connect_btn");
+ getChild<LLPanel>("links_login_panel")->setDefaultBtn("connect_btn");
std::string channel = LLVersionInfo::getChannel();
std::string version = llformat("%s (%d)",
LLVersionInfo::getShortVersion().c_str(),
LLVersionInfo::getBuild());
- //LLTextBox* channel_text = getChild<LLTextBox>("channel_text");
- //channel_text->setTextArg("[CHANNEL]", channel); // though not displayed
- //channel_text->setTextArg("[VERSION]", version);
- //channel_text->setClickedCallback(onClickVersion, this);
LLTextBox* forgot_password_text = getChild<LLTextBox>("forgot_password_text");
forgot_password_text->setClickedCallback(onClickForgotPassword, NULL);
- LLTextBox* create_new_account_text = getChild<LLTextBox>("create_new_account_text");
- create_new_account_text->setClickedCallback(onClickNewAccount, NULL);
+ childSetAction("create_new_account_btn", onClickNewAccount, NULL);
LLTextBox* need_help_text = getChild<LLTextBox>("login_help");
need_help_text->setClickedCallback(onClickHelp, NULL);
@@ -192,9 +228,6 @@ LLPanelLogin::LLPanelLogin(const LLRect &rect,
// Show last logged in user favorites in "Start at" combo.
addUsersWithFavoritesToUsername();
getChild<LLComboBox>("username_combo")->setTextChangedCallback(boost::bind(&LLPanelLogin::addFavoritesToStartLocation, this));
-
- updateLocationCombo(false);
-
}
void LLPanelLogin::addUsersWithFavoritesToUsername()
@@ -389,25 +422,27 @@ void LLPanelLogin::giveFocus()
// static
void LLPanelLogin::showLoginWidgets()
{
- // *NOTE: Mani - This may or may not be obselete code.
- // It seems to be part of the defunct? reg-in-client project.
- sInstance->getChildView("login_widgets")->setVisible( true);
- LLMediaCtrl* web_browser = sInstance->getChild<LLMediaCtrl>("login_html");
- sInstance->reshapeBrowser();
- // *TODO: Append all the usual login parameters, like first_login=Y etc.
- std::string splash_screen_url = LLGridManager::getInstance()->getLoginPage();
- web_browser->navigateTo( splash_screen_url, "text/html" );
- LLUICtrl* username_combo = sInstance->getChild<LLUICtrl>("username_combo");
- username_combo->setFocus(TRUE);
+ if (sInstance)
+ {
+ // *NOTE: Mani - This may or may not be obselete code.
+ // It seems to be part of the defunct? reg-in-client project.
+ sInstance->getChildView("login_widgets")->setVisible( true);
+ LLMediaCtrl* web_browser = sInstance->getChild<LLMediaCtrl>("login_html");
+ sInstance->reshapeBrowser();
+ // *TODO: Append all the usual login parameters, like first_login=Y etc.
+ std::string splash_screen_url = LLGridManager::getInstance()->getLoginPage();
+ web_browser->navigateTo( splash_screen_url, "text/html" );
+ LLUICtrl* username_combo = sInstance->getChild<LLUICtrl>("username_combo");
+ username_combo->setFocus(TRUE);
+ }
}
// static
void LLPanelLogin::show(const LLRect &rect,
- BOOL show_server,
void (*callback)(S32 option, void* user_data),
void* callback_data)
{
- new LLPanelLogin(rect, show_server, callback, callback_data);
+ new LLPanelLogin(rect, callback, callback_data);
if( !gFocusMgr.getKeyboardFocus() )
{
@@ -567,21 +602,6 @@ void LLPanelLogin::getFields(LLPointer<LLCredential>& credential,
remember = sInstance->getChild<LLUICtrl>("remember_check")->getValue();
}
-// static
-BOOL LLPanelLogin::isGridComboDirty()
-{
- BOOL user_picked = FALSE;
- if (!sInstance)
- {
- llwarns << "Attempted getServer with no login view shown" << llendl;
- }
- else
- {
- LLComboBox* combo = sInstance->getChild<LLComboBox>("server_combo");
- user_picked = combo->isDirty();
- }
- return user_picked;
-}
// static
BOOL LLPanelLogin::areCredentialFieldsDirty()
@@ -611,83 +631,86 @@ BOOL LLPanelLogin::areCredentialFieldsDirty()
// static
-void LLPanelLogin::updateLocationCombo( bool force_visible )
+void LLPanelLogin::updateLocationSelectorsVisibility()
{
- if (!sInstance)
+ if (sInstance)
{
- return;
+ BOOL show_start = gSavedSettings.getBOOL("ShowStartLocation");
+ sInstance->getChild<LLLayoutPanel>("start_location_panel")->setVisible(show_start);
+
+ BOOL show_server = gSavedSettings.getBOOL("ForceShowGrid");
+ sInstance->getChild<LLLayoutPanel>("grid_panel")->setVisible(show_server);
}
-
- LLComboBox* combo = sInstance->getChild<LLComboBox>("start_location_combo");
-
- switch(LLStartUp::getStartSLURL().getType())
- {
- case LLSLURL::LOCATION:
- {
-
- combo->setCurrentByIndex( 2 );
- combo->setTextEntry(LLStartUp::getStartSLURL().getLocationString());
- break;
- }
- case LLSLURL::HOME_LOCATION:
- combo->setCurrentByIndex(1);
- break;
- default:
- combo->setCurrentByIndex(0);
- break;
- }
-
- BOOL show_start = TRUE;
-
- if ( ! force_visible )
- show_start = gSavedSettings.getBOOL("ShowStartLocation");
-
- sInstance->getChildView("start_location_combo")->setVisible( show_start);
- sInstance->getChildView("start_location_text")->setVisible( show_start);
-
- BOOL show_server = gSavedSettings.getBOOL("ForceShowGrid");
- sInstance->getChildView("server_combo_text")->setVisible( show_server);
- sInstance->getChildView("server_combo")->setVisible( show_server);
}
-// static
-void LLPanelLogin::updateStartSLURL()
+// static - called from LLStartUp::setStartSLURL
+void LLPanelLogin::onUpdateStartSLURL(const LLSLURL& new_start_slurl)
{
if (!sInstance) return;
-
- LLComboBox* combo = sInstance->getChild<LLComboBox>("start_location_combo");
- S32 index = combo->getCurrentIndex();
-
- switch (index)
+
+ LL_DEBUGS("AppInit")<<new_start_slurl.asString()<<LL_ENDL;
+
+ LLComboBox* location_combo = sInstance->getChild<LLComboBox>("start_location_combo");
+ /*
+ * Determine whether or not the new_start_slurl modifies the grid.
+ *
+ * Note that some forms that could be in the slurl are grid-agnostic.,
+ * such as "home". Other forms, such as
+ * https://grid.example.com/region/Party%20Town/20/30/5
+ * specify a particular grid; in those cases we want to change the grid
+ * and the grid selector to match the new value.
+ */
+ enum LLSLURL::SLURL_TYPE new_slurl_type = new_start_slurl.getType();
+ switch ( new_slurl_type )
{
- case 0:
- {
- LLStartUp::setStartSLURL(LLSLURL(LLSLURL::SIM_LOCATION_LAST));
- break;
- }
- case 1:
+ case LLSLURL::LOCATION:
+ {
+ std::string slurl_grid = LLGridManager::getInstance()->getGrid(new_start_slurl.getGrid());
+ if ( ! slurl_grid.empty() ) // is that a valid grid?
{
- LLStartUp::setStartSLURL(LLSLURL(LLSLURL::SIM_LOCATION_HOME));
- break;
- }
- default:
- {
- LLSLURL slurl = LLSLURL(combo->getValue().asString());
- if(slurl.getType() == LLSLURL::LOCATION)
+ if ( slurl_grid != LLGridManager::getInstance()->getGrid() ) // new grid?
{
- // we've changed the grid, so update the grid selection
- LLStartUp::setStartSLURL(slurl);
+ // the slurl changes the grid, so update everything to match
+ LLGridManager::getInstance()->setGridChoice(slurl_grid);
+
+ // update the grid selector to match the slurl
+ LLComboBox* server_combo = sInstance->getChild<LLComboBox>("server_combo");
+ std::string server_label(LLGridManager::getInstance()->getGridLabel(slurl_grid));
+ server_combo->setSimple(server_label);
+
+ updateServer(); // to change the links and splash screen
}
- break;
- }
+ location_combo->setTextEntry(new_start_slurl.getLocationString());
+ }
+ else
+ {
+ // the grid specified by the slurl is not known
+ LLNotificationsUtil::add("InvalidLocationSLURL");
+ LL_WARNS("AppInit")<<"invalid LoginLocation:"<<new_start_slurl.asString()<<LL_ENDL;
+ location_combo->setTextEntry(LLStringUtil::null);
+ }
+ }
+ break;
+
+ case LLSLURL::HOME_LOCATION:
+ location_combo->setCurrentByIndex(1); // home location
+ break;
+
+ case LLSLURL::LAST_LOCATION:
+ location_combo->setCurrentByIndex(0); // last location
+ break;
+
+ default:
+ LL_WARNS("AppInit")<<"invalid login slurl, using home"<<LL_ENDL;
+ location_combo->setCurrentByIndex(1); // home location
+ break;
}
}
-
void LLPanelLogin::setLocation(const LLSLURL& slurl)
{
- LLStartUp::setStartSLURL(slurl);
- updateServer();
+ LL_DEBUGS("AppInit")<<"setting Location "<<slurl.asString()<<LL_ENDL;
+ LLStartUp::setStartSLURL(slurl); // calls onUpdateStartSLURL, above
}
// static
@@ -705,13 +728,14 @@ void LLPanelLogin::closePanel()
// static
void LLPanelLogin::setAlwaysRefresh(bool refresh)
{
- if (LLStartUp::getStartupState() >= STATE_LOGIN_CLEANUP) return;
-
- LLMediaCtrl* web_browser = sInstance->getChild<LLMediaCtrl>("login_html");
-
- if (web_browser)
+ if (sInstance && LLStartUp::getStartupState() < STATE_LOGIN_CLEANUP)
{
- web_browser->setAlwaysRefresh(refresh);
+ LLMediaCtrl* web_browser = sInstance->getChild<LLMediaCtrl>("login_html");
+
+ if (web_browser)
+ {
+ web_browser->setAlwaysRefresh(refresh);
+ }
}
}
@@ -761,7 +785,7 @@ void LLPanelLogin::loadLoginPage()
curl_free(curl_version);
// Grid
- char* curl_grid = curl_escape(LLGridManager::getInstance()->getGridLabel().c_str(), 0);
+ char* curl_grid = curl_escape(LLGridManager::getInstance()->getGridId().c_str(), 0);
oStr << "&grid=" << curl_grid;
curl_free(curl_grid);
@@ -775,27 +799,13 @@ void LLPanelLogin::loadLoginPage()
LLMediaCtrl* web_browser = sInstance->getChild<LLMediaCtrl>("login_html");
if (web_browser->getCurrentNavUrl() != oStr.str())
{
+ LL_DEBUGS("AppInit")<<oStr.str()<<LL_ENDL;
web_browser->navigateTo( oStr.str(), "text/html" );
}
}
void LLPanelLogin::handleMediaEvent(LLPluginClassMedia* /*self*/, EMediaEvent event)
{
- if(event == MEDIA_EVENT_NAVIGATE_COMPLETE)
- {
- LLMediaCtrl* web_browser = sInstance->getChild<LLMediaCtrl>("login_html");
- if (web_browser)
- {
- // *HACK HACK HACK HACK!
- /* Stuff a Tab key into the browser now so that the first field will
- ** get the focus! The embedded javascript on the page that properly
- ** sets the initial focus in a real web browser is not working inside
- ** the viewer, so this is an UGLY HACK WORKAROUND for now.
- */
- // Commented out as it's not reliable
- //web_browser->handleKey(KEY_TAB, MASK_NONE, false);
- }
- }
}
//---------------------------------------------------------------------------
@@ -812,15 +822,9 @@ void LLPanelLogin::onClickConnect(void *)
LLComboBox* combo = sInstance->getChild<LLComboBox>("server_combo");
LLSD combo_val = combo->getSelectedValue();
- if (combo_val.isUndefined())
- {
- combo_val = combo->getValue();
- }
- if(combo_val.isUndefined())
- {
- LLNotificationsUtil::add("StartRegionEmpty");
- return;
- }
+
+ // the grid definitions may come from a user-supplied grids.xml, so they may not be good
+ LL_DEBUGS("AppInit")<<"grid "<<combo_val.asString()<<LL_ENDL;
try
{
LLGridManager::getInstance()->setGridChoice(combo_val.asString());
@@ -828,13 +832,14 @@ void LLPanelLogin::onClickConnect(void *)
catch (LLInvalidGridName ex)
{
LLSD args;
- args["GRID"] = combo_val.asString();
+ args["GRID"] = ex.name();
LLNotificationsUtil::add("InvalidGrid", args);
return;
}
- updateStartSLURL();
- std::string username = sInstance->getChild<LLUICtrl>("username_combo")->getValue().asString();
+ // The start location SLURL has already been sent to LLStartUp::setStartSLURL
+
+ std::string username = sInstance->getChild<LLUICtrl>("username_combo")->getValue().asString();
if(username.empty())
{
@@ -877,7 +882,10 @@ void LLPanelLogin::onClickConnect(void *)
// static
void LLPanelLogin::onClickNewAccount(void*)
{
- LLWeb::loadURLExternal(sInstance->getString("create_account_url"));
+ if (sInstance)
+ {
+ LLWeb::loadURLExternal(LLTrans::getString("create_account_url"));
+ }
}
@@ -913,7 +921,7 @@ void LLPanelLogin::onPassKey(LLLineEditor* caller, void* user_data)
This->mPasswordModified = TRUE;
if (gKeyboard->getKeyDown(KEY_CAPSLOCK) && sCapslockDidNotification == FALSE)
{
-// *TODO: use another way to notify user about enabled caps lock, see EXT-6858
+ // *TODO: use another way to notify user about enabled caps lock, see EXT-6858
sCapslockDidNotification = TRUE;
}
}
@@ -921,113 +929,99 @@ void LLPanelLogin::onPassKey(LLLineEditor* caller, void* user_data)
void LLPanelLogin::updateServer()
{
- try
+ if (sInstance)
{
-
- updateServerCombo();
- // if they've selected another grid, we should load the credentials
- // for that grid and set them to the UI.
- if(sInstance && !sInstance->areCredentialFieldsDirty())
+ try
{
- LLPointer<LLCredential> credential = gSecAPIHandler->loadCredential(LLGridManager::getInstance()->getGrid());
- bool remember = sInstance->getChild<LLUICtrl>("remember_check")->getValue();
- sInstance->setFields(credential, remember);
- }
- // grid changed so show new splash screen (possibly)
- loadLoginPage();
- updateLocationCombo(LLStartUp::getStartSLURL().getType() == LLSLURL::LOCATION);
- }
- catch (LLInvalidGridName ex)
- {
- // do nothing
- }
-}
+ // if they've selected another grid, we should load the credentials
+ // for that grid and set them to the UI.
+ if(!sInstance->areCredentialFieldsDirty())
+ {
+ LLPointer<LLCredential> credential = gSecAPIHandler->loadCredential(LLGridManager::getInstance()->getGrid());
+ bool remember = sInstance->getChild<LLUICtrl>("remember_check")->getValue();
+ sInstance->setFields(credential, remember);
+ }
-void LLPanelLogin::updateServerCombo()
-{
- if (!sInstance)
- {
- return;
- }
- // We add all of the possible values, sorted, and then add a bar and the current value at the top
- LLComboBox* server_choice_combo = sInstance->getChild<LLComboBox>("server_combo");
- server_choice_combo->removeall();
+ // update the login panel links
+ bool system_grid = LLGridManager::getInstance()->isSystemGrid();
- std::map<std::string, std::string> known_grids = LLGridManager::getInstance()->getKnownGrids(!gSavedSettings.getBOOL("ShowBetaGrids"));
+ // Want to vanish not only create_new_account_btn, but also the
+ // title text over it, so turn on/off the whole layout_panel element.
+ sInstance->getChild<LLLayoutPanel>("links")->setVisible(system_grid);
+ sInstance->getChildView("forgot_password_text")->setVisible(system_grid);
- for (std::map<std::string, std::string>::iterator grid_choice = known_grids.begin();
- grid_choice != known_grids.end();
- grid_choice++)
- {
- if (!grid_choice->first.empty())
+ // grid changed so show new splash screen (possibly)
+ loadLoginPage();
+ }
+ catch (LLInvalidGridName ex)
{
- server_choice_combo->add(grid_choice->second, grid_choice->first);
+ LL_WARNS("AppInit")<<"server '"<<ex.name()<<"' selection failed"<<LL_ENDL;
+ LLSD args;
+ args["GRID"] = ex.name();
+ LLNotificationsUtil::add("InvalidGrid", args);
+ return;
}
}
- server_choice_combo->sortByName();
-
- server_choice_combo->addSeparator(ADD_TOP);
-
- server_choice_combo->add(LLGridManager::getInstance()->getGridLabel(),
- LLGridManager::getInstance()->getGrid(), ADD_TOP);
-
- server_choice_combo->selectFirstItem();
}
-// static
-void LLPanelLogin::onSelectServer(LLUICtrl*, void*)
+void LLPanelLogin::onSelectServer()
{
- // *NOTE: The paramters for this method are ignored.
- // LLPanelLogin::onServerComboLostFocus(LLFocusableElement* fe, void*)
- // calls this method.
- LL_INFOS("AppInit") << "onSelectServer" << LL_ENDL;
// The user twiddled with the grid choice ui.
// apply the selection to the grid setting.
LLPointer<LLCredential> credential;
- LLComboBox* combo = sInstance->getChild<LLComboBox>("server_combo");
- LLSD combo_val = combo->getSelectedValue();
- if (combo_val.isUndefined())
+ LLComboBox* server_combo = getChild<LLComboBox>("server_combo");
+ LLSD server_combo_val = server_combo->getSelectedValue();
+ LL_INFOS("AppInit") << "grid "<<server_combo_val.asString()<< LL_ENDL;
+ LLGridManager::getInstance()->setGridChoice(server_combo_val.asString());
+
+ /*
+ * Determine whether or not the value in the start_location_combo makes sense
+ * with the new grid value.
+ *
+ * Note that some forms that could be in the location combo are grid-agnostic,
+ * such as "MyRegion/128/128/0". There could be regions with that name on any
+ * number of grids, so leave them alone. Other forms, such as
+ * https://grid.example.com/region/Party%20Town/20/30/5 specify a particular
+ * grid; in those cases we want to clear the location.
+ */
+ LLComboBox* location_combo = getChild<LLComboBox>("start_location_combo");
+ S32 index = location_combo->getCurrentIndex();
+ switch (index)
{
- combo_val = combo->getValue();
+ case 0: // last location
+ case 1: // home location
+ // do nothing - these are grid-agnostic locations
+ break;
+
+ default:
+ {
+ std::string location = location_combo->getValue().asString();
+ LLSLURL slurl(location); // generata a slurl from the location combo contents
+ if ( slurl.getType() == LLSLURL::LOCATION
+ && slurl.getGrid() != LLGridManager::getInstance()->getGrid()
+ )
+ {
+ // the grid specified by the location is not this one, so clear the combo
+ location_combo->setCurrentByIndex(0); // last location on the new grid
+ location_combo->setTextEntry(LLStringUtil::null);
+ }
+ }
+ break;
}
-
- combo = sInstance->getChild<LLComboBox>("start_location_combo");
- combo->setCurrentByIndex(1);
- LLStartUp::setStartSLURL(LLSLURL(gSavedSettings.getString("LoginLocation")));
- LLGridManager::getInstance()->setGridChoice(combo_val.asString());
- // This new selection will override preset uris
- // from the command line.
+
updateServer();
- updateLocationCombo(false);
- updateLoginPanelLinks();
}
-void LLPanelLogin::onServerComboLostFocus(LLFocusableElement* fe)
+void LLPanelLogin::onLocationSLURL()
{
- if (!sInstance)
- {
- return;
- }
+ LLComboBox* location_combo = getChild<LLComboBox>("start_location_combo");
+ std::string location = location_combo->getValue().asString();
+ LL_DEBUGS("AppInit")<<location<<LL_ENDL;
- LLComboBox* combo = sInstance->getChild<LLComboBox>("server_combo");
- if(fe == combo)
- {
- onSelectServer(combo, NULL);
- }
+ LLStartUp::setStartSLURL(location); // calls onUpdateStartSLURL, above
}
-void LLPanelLogin::updateLoginPanelLinks()
-{
- LLSD grid_data;
- LLGridManager::getInstance()->getGridInfo(grid_data);
- bool system_grid = grid_data.has(GRID_IS_SYSTEM_GRID_VALUE);
-
- // need to call through sInstance, as it's called from onSelectServer, which
- // is static.
- sInstance->getChildView("create_new_account_text")->setVisible( system_grid);
- sInstance->getChildView("forgot_password_text")->setVisible( system_grid);
-}
std::string canonicalize_username(const std::string& name)
{
diff --git a/indra/newview/llpanellogin.h b/indra/newview/llpanellogin.h
index a439c4ff6b..c71cfc3783 100644
--- a/indra/newview/llpanellogin.h
+++ b/indra/newview/llpanellogin.h
@@ -44,7 +44,7 @@ class LLPanelLogin:
{
LOG_CLASS(LLPanelLogin);
public:
- LLPanelLogin(const LLRect &rect, BOOL show_server,
+ LLPanelLogin(const LLRect &rect,
void (*callback)(S32 option, void* user_data),
void *callback_data);
~LLPanelLogin();
@@ -57,7 +57,7 @@ public:
// hidden on startup for reg-in-client
static void showLoginWidgets();
- static void show(const LLRect &rect, BOOL show_server,
+ static void show(const LLRect &rect,
void (*callback)(S32 option, void* user_data),
void* callback_data);
@@ -65,11 +65,12 @@ public:
static void getFields(LLPointer<LLCredential>& credential, BOOL& remember);
- static BOOL isGridComboDirty();
static BOOL areCredentialFieldsDirty();
static void setLocation(const LLSLURL& slurl);
- static void updateLocationCombo(bool force_visible); // simply update the combo box
+ /// Call when preferences that control visibility may have changed
+ static void updateLocationSelectorsVisibility();
+
static void closePanel();
void setSiteIsAlive( bool alive );
@@ -82,22 +83,24 @@ public:
/*virtual*/ void handleMediaEvent(LLPluginClassMedia* self, EMediaEvent event);
static void updateServer(); // update the combo box, change the login page to the new server, clear the combo
+ /// to be called from LLStartUp::setStartSLURL
+ static void onUpdateStartSLURL(const LLSLURL& new_start_slurl);
+
private:
friend class LLPanelLoginListener;
void reshapeBrowser();
void addFavoritesToStartLocation();
void addUsersWithFavoritesToUsername();
+ void onSelectServer();
+ void onLocationSLURL();
+
static void onClickConnect(void*);
static void onClickNewAccount(void*);
static void onClickVersion(void*);
static void onClickForgotPassword(void*);
static void onClickHelp(void*);
static void onPassKey(LLLineEditor* caller, void* user_data);
- static void onSelectServer(LLUICtrl*, void*);
- static void onServerComboLostFocus(LLFocusableElement*);
static void updateServerCombo();
- static void updateStartSLURL();
- static void updateLoginPanelLinks();
private:
LLPointer<LLUIImage> mLogoImage;
diff --git a/indra/newview/llpanelmaininventory.cpp b/indra/newview/llpanelmaininventory.cpp
index c11597f532..9f3273da2d 100644
--- a/indra/newview/llpanelmaininventory.cpp
+++ b/indra/newview/llpanelmaininventory.cpp
@@ -306,6 +306,7 @@ void LLPanelMainInventory::newWindow()
void LLPanelMainInventory::doCreate(const LLSD& userdata)
{
+ reset_inventory_filter();
menu_create_inventory_item(getPanel()->getRootFolder(), NULL, userdata);
}
diff --git a/indra/newview/llpanelnearbymedia.cpp b/indra/newview/llpanelnearbymedia.cpp
index c01adc3c35..a50d9074f7 100644
--- a/indra/newview/llpanelnearbymedia.cpp
+++ b/indra/newview/llpanelnearbymedia.cpp
@@ -176,7 +176,7 @@ void LLPanelNearByMedia::handleMediaAutoPlayChanged(const LLSD& newvalue)
{
// update mParcelAudioAutoStart if AUTO_PLAY_MEDIA_SETTING changes
mParcelAudioAutoStart = gSavedSettings.getBOOL(LLViewerMedia::AUTO_PLAY_MEDIA_SETTING) &&
- gSavedSettings.getBOOL("MediaTentativeAutoPlay");
+ gSavedSettings.getBOOL("MediaTentativeAutoPlay");
}
/*virtual*/
diff --git a/indra/newview/llpanelobject.cpp b/indra/newview/llpanelobject.cpp
index 1f77e7a602..d87b565b32 100644
--- a/indra/newview/llpanelobject.cpp
+++ b/indra/newview/llpanelobject.cpp
@@ -119,7 +119,6 @@ BOOL LLPanelObject::postBuild()
mCheckPhantom = getChild<LLCheckBoxCtrl>("Phantom Checkbox Ctrl");
childSetCommitCallback("Phantom Checkbox Ctrl",onCommitPhantom,this);
-
// Position
mLabelPosition = getChild<LLTextBox>("label position");
mCtrlPosX = getChild<LLSpinCtrl>("Pos X");
@@ -245,6 +244,7 @@ BOOL LLPanelObject::postBuild()
mCtrlSculptTexture->setDropCallback( boost::bind(&LLPanelObject::onDropSculpt, this, _2 ));
// Don't allow (no copy) or (no transfer) textures to be selected during immediate mode
mCtrlSculptTexture->setImmediateFilterPermMask(PERM_COPY | PERM_TRANSFER);
+ mCtrlSculptTexture->setDnDFilterPermMask(PERM_COPY | PERM_TRANSFER);
// Allow any texture to be used during non-immediate mode.
mCtrlSculptTexture->setNonImmediateFilterPermMask(PERM_NONE);
LLAggregatePermissions texture_perms;
@@ -271,7 +271,7 @@ BOOL LLPanelObject::postBuild()
childSetCommitCallback("sculpt mirror control", onCommitSculptType, this);
mCtrlSculptInvert = getChild<LLCheckBoxCtrl>("sculpt invert control");
childSetCommitCallback("sculpt invert control", onCommitSculptType, this);
-
+
// Start with everyone disabled
clearCtrls();
@@ -283,7 +283,6 @@ LLPanelObject::LLPanelObject()
mIsPhysical(FALSE),
mIsTemporary(FALSE),
mIsPhantom(FALSE),
- mCastShadows(TRUE),
mSelectedType(MI_BOX),
mSculptTextureRevert(LLUUID::null),
mSculptTypeRevert(0)
@@ -342,9 +341,9 @@ void LLPanelObject::getState( )
}
// can move or rotate only linked group with move permissions, or sub-object with move and modify perms
- BOOL enable_move = objectp->permMove() && !objectp->isAttachment() && (objectp->permModify() || !gSavedSettings.getBOOL("EditLinkedParts"));
- BOOL enable_scale = objectp->permMove() && objectp->permModify();
- BOOL enable_rotate = objectp->permMove() && ( (objectp->permModify() && !objectp->isAttachment()) || !gSavedSettings.getBOOL("EditLinkedParts"));
+ BOOL enable_move = objectp->permMove() && !objectp->isPermanentEnforced() && ((root_objectp == NULL) || !root_objectp->isPermanentEnforced()) && !objectp->isAttachment() && (objectp->permModify() || !gSavedSettings.getBOOL("EditLinkedParts"));
+ BOOL enable_scale = objectp->permMove() && !objectp->isPermanentEnforced() && ((root_objectp == NULL) || !root_objectp->isPermanentEnforced()) && objectp->permModify();
+ BOOL enable_rotate = objectp->permMove() && !objectp->isPermanentEnforced() && ((root_objectp == NULL) || !root_objectp->isPermanentEnforced()) && ( (objectp->permModify() && !objectp->isAttachment()) || !gSavedSettings.getBOOL("EditLinkedParts"));
S32 selected_count = LLSelectMgr::getInstance()->getSelection()->getObjectCount();
BOOL single_volume = (LLSelectMgr::getInstance()->selectionAllPCode( LL_PCODE_VOLUME ))
@@ -462,9 +461,16 @@ void LLPanelObject::getState( )
getChildView("select_single")->setVisible( TRUE);
getChildView("select_single")->setEnabled(TRUE);
}
+
+ BOOL is_flexible = volobjp && volobjp->isFlexible();
+ BOOL is_permanent = root_objectp->flagObjectPermanent();
+ BOOL is_permanent_enforced = root_objectp->isPermanentEnforced();
+ BOOL is_character = root_objectp->flagCharacter();
+ llassert(!is_permanent || !is_character); // should never have a permanent object that is also a character
+
// Lock checkbox - only modifiable if you own the object.
BOOL self_owned = (gAgent.getID() == owner_id);
- mCheckLock->setEnabled( roots_selected > 0 && self_owned );
+ mCheckLock->setEnabled( roots_selected > 0 && self_owned && !is_permanent_enforced);
// More lock and debit checkbox - get the values
BOOL valid;
@@ -494,30 +500,27 @@ void LLPanelObject::getState( )
}
}
- BOOL is_flexible = volobjp && volobjp->isFlexible();
-
// Physics checkbox
- mIsPhysical = root_objectp->usePhysics();
+ mIsPhysical = root_objectp->flagUsePhysics();
+ llassert(!is_permanent || !mIsPhysical); // should never have a permanent object that is also physical
+
mCheckPhysics->set( mIsPhysical );
mCheckPhysics->setEnabled( roots_selected>0
&& (editable || gAgent.isGodlike())
- && !is_flexible);
+ && !is_flexible && !is_permanent);
mIsTemporary = root_objectp->flagTemporaryOnRez();
+ llassert(!is_permanent || !mIsTemporary); // should never has a permanent object that is also temporary
+
mCheckTemporary->set( mIsTemporary );
- mCheckTemporary->setEnabled( roots_selected>0 && editable );
+ mCheckTemporary->setEnabled( roots_selected>0 && editable && !is_permanent);
mIsPhantom = root_objectp->flagPhantom();
+ BOOL is_volume_detect = root_objectp->flagVolumeDetect();
+ llassert(!is_character || !mIsPhantom); // should never have a character that is also a phantom
mCheckPhantom->set( mIsPhantom );
- mCheckPhantom->setEnabled( roots_selected>0 && editable && !is_flexible );
+ mCheckPhantom->setEnabled( roots_selected>0 && editable && !is_flexible && !is_permanent_enforced && !is_character && !is_volume_detect);
-
-#if 0 // 1.9.2
- mCastShadows = root_objectp->flagCastShadows();
- mCheckCastShadows->set( mCastShadows );
- mCheckCastShadows->setEnabled( roots_selected==1 && editable );
-#endif
-
//----------------------------------------------------------------------------
S32 selected_item = MI_BOX;
@@ -555,7 +558,7 @@ void LLPanelObject::getState( )
{
// Only allowed to change these parameters for objects
// that you have permissions on AND are not attachments.
- enabled = root_objectp->permModify();
+ enabled = root_objectp->permModify() && !root_objectp->isPermanentEnforced();
// Volume type
const LLVolumeParams &volume_params = objectp->getVolume()->getParams();
@@ -1214,22 +1217,6 @@ void LLPanelObject::sendIsPhantom()
}
}
-void LLPanelObject::sendCastShadows()
-{
- BOOL value = mCheckCastShadows->get();
- if( mCastShadows != value )
- {
- LLSelectMgr::getInstance()->selectionUpdateCastShadows(value);
- mCastShadows = value;
-
- llinfos << "update cast shadows sent" << llendl;
- }
- else
- {
- llinfos << "update cast shadows not changed" << llendl;
- }
-}
-
// static
void LLPanelObject::onCommitParametric( LLUICtrl* ctrl, void* userdata )
{
@@ -1886,10 +1873,6 @@ void LLPanelObject::clearCtrls()
mCheckPhantom ->set(FALSE);
mCheckPhantom ->setEnabled( FALSE );
-#if 0 // 1.9.2
- mCheckCastShadows->set(FALSE);
- mCheckCastShadows->setEnabled( FALSE );
-#endif
// Disable text labels
mLabelPosition ->setEnabled( FALSE );
mLabelSize ->setEnabled( FALSE );
@@ -1977,14 +1960,6 @@ void LLPanelObject::onCommitPhantom( LLUICtrl* ctrl, void* userdata )
self->sendIsPhantom();
}
-// static
-void LLPanelObject::onCommitCastShadows( LLUICtrl* ctrl, void* userdata )
-{
- LLPanelObject* self = (LLPanelObject*) userdata;
- self->sendCastShadows();
-}
-
-
void LLPanelObject::onSelectSculpt(const LLSD& data)
{
LLTextureCtrl* mTextureCtrl = getChild<LLTextureCtrl>("sculpt texture control");
diff --git a/indra/newview/llpanelobject.h b/indra/newview/llpanelobject.h
index 475dfdaedb..c4cf27ab1a 100644
--- a/indra/newview/llpanelobject.h
+++ b/indra/newview/llpanelobject.h
@@ -64,7 +64,6 @@ public:
static void onCommitRotation( 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);
@@ -75,8 +74,7 @@ public:
void onSelectSculpt(const LLSD& data);
BOOL onDropSculpt(LLInventoryItem* item);
static void onCommitSculptType( LLUICtrl *ctrl, void* userdata);
-
-
+
protected:
void getState();
@@ -87,7 +85,6 @@ protected:
void sendIsTemporary();
void sendIsPhantom();
- void sendCastShadows();
void sendSculpt();
void getVolumeParams(LLVolumeParams& volume_params);
@@ -153,7 +150,6 @@ protected:
LLCheckBoxCtrl *mCheckPhysics;
LLCheckBoxCtrl *mCheckTemporary;
LLCheckBoxCtrl *mCheckPhantom;
- LLCheckBoxCtrl *mCheckCastShadows;
LLTextureCtrl *mCtrlSculptTexture;
LLTextBox *mLabelSculptType;
@@ -165,7 +161,6 @@ protected:
BOOL mIsPhysical; // to avoid sending "physical" when not changed
BOOL mIsTemporary; // to avoid sending "temporary" when not changed
BOOL mIsPhantom; // to avoid sending "phantom" when not changed
- BOOL mCastShadows; // to avoid sending "cast shadows" when not changed
S32 mSelectedType; // So we know what selected type we last were
LLUUID mSculptTextureRevert; // so we can revert the sculpt texture on cancel
diff --git a/indra/newview/llpanelpathfindingrebakenavmesh.cpp b/indra/newview/llpanelpathfindingrebakenavmesh.cpp
new file mode 100644
index 0000000000..7efb1a9227
--- /dev/null
+++ b/indra/newview/llpanelpathfindingrebakenavmesh.cpp
@@ -0,0 +1,269 @@
+/**
+* @file llpanelpathfindingrebakenavmesh.cpp
+* @brief Implementation of llpanelpathfindingrebakenavmesh
+* @author Prep@lindenlab.com
+*
+* $LicenseInfo:firstyear=2012&license=viewerlgpl$
+* Second Life Viewer Source Code
+* Copyright (C) 2012, Linden Research, Inc.
+*
+* This library is free software; you can redistribute it and/or
+* modify it under the terms of the GNU Lesser General Public
+* License as published by the Free Software Foundation;
+* version 2.1 of the License only.
+*
+* This library is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this library; if not, write to the Free Software
+* 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 "llpanelpathfindingrebakenavmesh.h"
+
+#include <boost/bind.hpp>
+#include <boost/signals2.hpp>
+
+#include "llagent.h"
+#include "llbutton.h"
+#include "llenvmanager.h"
+#include "llhints.h"
+#include "llnotificationsutil.h"
+#include "llpanel.h"
+#include "llpathfindingmanager.h"
+#include "llpathfindingnavmesh.h"
+#include "llpathfindingnavmeshstatus.h"
+#include "lltoolbar.h"
+#include "lltoolbarview.h"
+#include "lltooltip.h"
+#include "llviewerregion.h"
+
+LLPanelPathfindingRebakeNavmesh* LLPanelPathfindingRebakeNavmesh::getInstance()
+{
+ static LLPanelPathfindingRebakeNavmesh* panel = getPanel();
+ return panel;
+}
+
+BOOL LLPanelPathfindingRebakeNavmesh::postBuild()
+{
+ //Rebake button
+ mNavMeshRebakeButton = findChild<LLButton>("navmesh_btn");
+ llassert(mNavMeshRebakeButton != NULL);
+ mNavMeshRebakeButton->setCommitCallback(boost::bind(&LLPanelPathfindingRebakeNavmesh::onNavMeshRebakeClick, this));
+ LLHints::registerHintTarget("navmesh_btn", mNavMeshRebakeButton->getHandle());
+
+ //Sending rebake request
+ mNavMeshSendingButton = findChild<LLButton>("navmesh_btn_sending");
+ llassert(mNavMeshSendingButton != NULL);
+ LLHints::registerHintTarget("navmesh_btn_sending", mNavMeshSendingButton->getHandle());
+
+ //rebaking...
+ mNavMeshBakingButton = findChild<LLButton>("navmesh_btn_baking");
+ llassert(mNavMeshBakingButton != NULL);
+ LLHints::registerHintTarget("navmesh_btn_baking", mNavMeshBakingButton->getHandle());
+
+ setMode(kRebakeNavMesh_Default);
+
+ createNavMeshStatusListenerForCurrentRegion();
+
+ if ( !mRegionCrossingSlot.connected() )
+ {
+ mRegionCrossingSlot = LLEnvManagerNew::getInstance()->setRegionChangeCallback(boost::bind(&LLPanelPathfindingRebakeNavmesh::handleRegionBoundaryCrossed, this));
+ }
+
+ if (!mAgentStateSlot.connected())
+ {
+ mAgentStateSlot = LLPathfindingManager::getInstance()->registerAgentStateListener(boost::bind(&LLPanelPathfindingRebakeNavmesh::handleAgentState, this, _1));
+ }
+ LLPathfindingManager::getInstance()->requestGetAgentState();
+
+ return LLPanel::postBuild();
+}
+
+void LLPanelPathfindingRebakeNavmesh::draw()
+{
+ if (doDraw())
+ {
+ updatePosition();
+ LLPanel::draw();
+ }
+}
+
+BOOL LLPanelPathfindingRebakeNavmesh::handleToolTip( S32 x, S32 y, MASK mask )
+{
+ LLToolTipMgr::instance().unblockToolTips();
+
+ if (mNavMeshRebakeButton->getVisible())
+ {
+ LLToolTipMgr::instance().show(mNavMeshRebakeButton->getToolTip());
+ }
+ else if (mNavMeshSendingButton->getVisible())
+ {
+ LLToolTipMgr::instance().show(mNavMeshSendingButton->getToolTip());
+ }
+ else if (mNavMeshBakingButton->getVisible())
+ {
+ LLToolTipMgr::instance().show(mNavMeshBakingButton->getToolTip());
+ }
+
+ return LLPanel::handleToolTip(x, y, mask);
+}
+
+LLPanelPathfindingRebakeNavmesh::LLPanelPathfindingRebakeNavmesh()
+ : LLPanel(),
+ mCanRebakeRegion(FALSE),
+ mRebakeNavMeshMode(kRebakeNavMesh_Default),
+ mNavMeshRebakeButton(NULL),
+ mNavMeshSendingButton(NULL),
+ mNavMeshBakingButton(NULL),
+ mNavMeshSlot(),
+ mRegionCrossingSlot(),
+ mAgentStateSlot()
+{
+ // make sure we have the only instance of this class
+ static bool b = true;
+ llassert_always(b);
+ b=false;
+}
+
+LLPanelPathfindingRebakeNavmesh::~LLPanelPathfindingRebakeNavmesh()
+{
+}
+
+LLPanelPathfindingRebakeNavmesh* LLPanelPathfindingRebakeNavmesh::getPanel()
+{
+ LLPanelPathfindingRebakeNavmesh* panel = new LLPanelPathfindingRebakeNavmesh();
+ panel->buildFromFile("panel_navmesh_rebake.xml");
+ return panel;
+}
+
+void LLPanelPathfindingRebakeNavmesh::setMode(ERebakeNavMeshMode pRebakeNavMeshMode)
+{
+ if (pRebakeNavMeshMode == kRebakeNavMesh_Available)
+ {
+ LLNotificationsUtil::add("PathfindingRebakeNavmesh");
+ }
+ mNavMeshRebakeButton->setVisible(pRebakeNavMeshMode == kRebakeNavMesh_Available);
+ mNavMeshSendingButton->setVisible(pRebakeNavMeshMode == kRebakeNavMesh_RequestSent);
+ mNavMeshBakingButton->setVisible(pRebakeNavMeshMode == kRebakeNavMesh_InProgress);
+ mRebakeNavMeshMode = pRebakeNavMeshMode;
+}
+
+LLPanelPathfindingRebakeNavmesh::ERebakeNavMeshMode LLPanelPathfindingRebakeNavmesh::getMode() const
+{
+ return mRebakeNavMeshMode;
+}
+
+void LLPanelPathfindingRebakeNavmesh::onNavMeshRebakeClick()
+{
+ setMode(kRebakeNavMesh_RequestSent);
+ LLPathfindingManager::getInstance()->requestRebakeNavMesh(boost::bind(&LLPanelPathfindingRebakeNavmesh::handleRebakeNavMeshResponse, this, _1));
+}
+
+void LLPanelPathfindingRebakeNavmesh::handleAgentState(BOOL pCanRebakeRegion)
+{
+ mCanRebakeRegion = pCanRebakeRegion;
+}
+
+void LLPanelPathfindingRebakeNavmesh::handleRebakeNavMeshResponse(bool pResponseStatus)
+{
+ if (getMode() == kRebakeNavMesh_RequestSent)
+ {
+ setMode(pResponseStatus ? kRebakeNavMesh_InProgress : kRebakeNavMesh_Default);
+ }
+
+ if (!pResponseStatus)
+ {
+ LLNotificationsUtil::add("PathfindingCannotRebakeNavmesh");
+ }
+}
+
+void LLPanelPathfindingRebakeNavmesh::handleNavMeshStatus(const LLPathfindingNavMeshStatus &pNavMeshStatus)
+{
+ ERebakeNavMeshMode rebakeNavMeshMode = kRebakeNavMesh_Default;
+ if (pNavMeshStatus.isValid())
+ {
+ switch (pNavMeshStatus.getStatus())
+ {
+ case LLPathfindingNavMeshStatus::kPending :
+ case LLPathfindingNavMeshStatus::kRepending :
+ rebakeNavMeshMode = kRebakeNavMesh_Available;
+ break;
+ case LLPathfindingNavMeshStatus::kBuilding :
+ rebakeNavMeshMode = kRebakeNavMesh_InProgress;
+ break;
+ case LLPathfindingNavMeshStatus::kComplete :
+ rebakeNavMeshMode = kRebakeNavMesh_NotAvailable;
+ break;
+ default :
+ rebakeNavMeshMode = kRebakeNavMesh_Default;
+ llassert(0);
+ break;
+ }
+ }
+
+ setMode(rebakeNavMeshMode);
+}
+
+void LLPanelPathfindingRebakeNavmesh::handleRegionBoundaryCrossed()
+{
+ createNavMeshStatusListenerForCurrentRegion();
+ mCanRebakeRegion = FALSE;
+ LLPathfindingManager::getInstance()->requestGetAgentState();
+}
+
+void LLPanelPathfindingRebakeNavmesh::createNavMeshStatusListenerForCurrentRegion()
+{
+ if (mNavMeshSlot.connected())
+ {
+ mNavMeshSlot.disconnect();
+ }
+
+ LLViewerRegion *currentRegion = gAgent.getRegion();
+ if (currentRegion != NULL)
+ {
+ mNavMeshSlot = LLPathfindingManager::getInstance()->registerNavMeshListenerForRegion(currentRegion, boost::bind(&LLPanelPathfindingRebakeNavmesh::handleNavMeshStatus, this, _2));
+ LLPathfindingManager::getInstance()->requestGetNavMeshForRegion(currentRegion, true);
+ }
+}
+
+bool LLPanelPathfindingRebakeNavmesh::doDraw() const
+{
+ return (mCanRebakeRegion && (mRebakeNavMeshMode != kRebakeNavMesh_NotAvailable));
+}
+
+void LLPanelPathfindingRebakeNavmesh::updatePosition()
+{
+ S32 y_pos = 0;
+ S32 bottom_tb_center = 0;
+
+ if (LLToolBar* toolbar_bottom = gToolBarView->getChild<LLToolBar>("toolbar_bottom"))
+ {
+ y_pos = toolbar_bottom->getRect().getHeight();
+ bottom_tb_center = toolbar_bottom->getRect().getCenterX();
+ }
+
+ S32 left_tb_width = 0;
+ if (LLToolBar* toolbar_left = gToolBarView->getChild<LLToolBar>("toolbar_left"))
+ {
+ left_tb_width = toolbar_left->getRect().getWidth();
+ }
+
+ if(LLPanel* panel_ssf_container = getRootView()->getChild<LLPanel>("state_management_buttons_container"))
+ {
+ panel_ssf_container->setOrigin(0, y_pos);
+ }
+
+ S32 x_pos = bottom_tb_center-getRect().getWidth()/2 - left_tb_width + 113 /* width of stand/fly button */ + 10 /* margin */;
+
+ setOrigin( x_pos, 0);
+}
diff --git a/indra/newview/llpanelpathfindingrebakenavmesh.h b/indra/newview/llpanelpathfindingrebakenavmesh.h
new file mode 100644
index 0000000000..48764f2aa7
--- /dev/null
+++ b/indra/newview/llpanelpathfindingrebakenavmesh.h
@@ -0,0 +1,96 @@
+/**
+* @file llpanelpathfindingrebakenavmesh.h
+* @brief Header file for llpanelpathfindingrebakenavmesh
+* @author Prep@lindenlab.com
+*
+* $LicenseInfo:firstyear=2012&license=viewerlgpl$
+* Second Life Viewer Source Code
+* Copyright (C) 2012, Linden Research, Inc.
+*
+* This library is free software; you can redistribute it and/or
+* modify it under the terms of the GNU Lesser General Public
+* License as published by the Free Software Foundation;
+* version 2.1 of the License only.
+*
+* This library is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this library; if not, write to the Free Software
+* 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_LLPANELPATHFINDINGREBAKENAVMESH_H
+#define LL_LLPANELPATHFINDINGREBAKENAVMESH_H
+
+#include <boost/signals2.hpp>
+
+#include "llpanel.h"
+#include "llpathfindingmanager.h"
+#include "llpathfindingnavmesh.h"
+
+class LLButton;
+class LLPathfindingNavMeshStatus;
+
+class LLPanelPathfindingRebakeNavmesh : public LLPanel
+{
+
+ LOG_CLASS(LLPanelPathfindingRebakeNavmesh);
+
+public:
+ static LLPanelPathfindingRebakeNavmesh* getInstance();
+
+ virtual BOOL postBuild();
+
+ virtual void draw();
+ virtual BOOL handleToolTip( S32 x, S32 y, MASK mask );
+
+protected:
+
+private:
+ typedef enum
+ {
+ kRebakeNavMesh_Available,
+ kRebakeNavMesh_RequestSent,
+ kRebakeNavMesh_InProgress,
+ kRebakeNavMesh_NotAvailable,
+ kRebakeNavMesh_Default = kRebakeNavMesh_NotAvailable
+ } ERebakeNavMeshMode;
+
+ LLPanelPathfindingRebakeNavmesh();
+ virtual ~LLPanelPathfindingRebakeNavmesh();
+
+ static LLPanelPathfindingRebakeNavmesh* getPanel();
+
+ void setMode(ERebakeNavMeshMode pRebakeNavMeshMode);
+ ERebakeNavMeshMode getMode() const;
+
+ void onNavMeshRebakeClick();
+
+ void handleAgentState(BOOL pCanRebakeRegion);
+ void handleRebakeNavMeshResponse(bool pResponseStatus);
+ void handleNavMeshStatus(const LLPathfindingNavMeshStatus &pNavMeshStatus);
+ void handleRegionBoundaryCrossed();
+
+ void createNavMeshStatusListenerForCurrentRegion();
+
+ bool doDraw() const;
+ void updatePosition();
+
+ BOOL mCanRebakeRegion;
+ ERebakeNavMeshMode mRebakeNavMeshMode;
+
+ LLButton* mNavMeshRebakeButton;
+ LLButton* mNavMeshSendingButton;
+ LLButton* mNavMeshBakingButton;
+
+ LLPathfindingNavMesh::navmesh_slot_t mNavMeshSlot;
+ boost::signals2::connection mRegionCrossingSlot;
+ LLPathfindingManager::agent_state_slot_t mAgentStateSlot;
+};
+
+#endif // LL_LLPANELPATHFINDINGREBAKENAVMESH_H
diff --git a/indra/newview/llpanelpermissions.cpp b/indra/newview/llpanelpermissions.cpp
index 59130236f2..51ab7649a4 100644
--- a/indra/newview/llpanelpermissions.cpp
+++ b/indra/newview/llpanelpermissions.cpp
@@ -62,6 +62,7 @@
#include "llspinctrl.h"
#include "roles_constants.h"
#include "llgroupactions.h"
+#include "lltrans.h"
U8 string_value_to_click_action(std::string p_value);
@@ -180,6 +181,9 @@ void LLPanelPermissions::disableAll()
getChildView("perm_modify")->setEnabled(FALSE);
getChild<LLUICtrl>("perm_modify")->setValue(LLStringUtil::null);
+ getChildView("pathfinding_attributes_value")->setEnabled(FALSE);
+ getChild<LLUICtrl>("pathfinding_attributes_value")->setValue(LLStringUtil::null);
+
getChildView("Creator:")->setEnabled(FALSE);
getChild<LLUICtrl>("Creator Name")->setValue(LLStringUtil::null);
getChildView("Creator Name")->setEnabled(FALSE);
@@ -299,6 +303,9 @@ void LLPanelPermissions::refresh()
BOOL is_perm_modify = (LLSelectMgr::getInstance()->getSelection()->getFirstRootNode()
&& LLSelectMgr::getInstance()->selectGetRootsModify())
|| LLSelectMgr::getInstance()->selectGetModify();
+ BOOL is_nonpermanent_enforced = (LLSelectMgr::getInstance()->getSelection()->getFirstRootNode()
+ && LLSelectMgr::getInstance()->selectGetRootsNonPermanentEnforced())
+ || LLSelectMgr::getInstance()->selectGetNonPermanentEnforced();
const LLFocusableElement* keyboard_focus_view = gFocusMgr.getKeyboardFocus();
S32 string_index = 0;
@@ -307,12 +314,18 @@ void LLPanelPermissions::refresh()
getString("text modify info 1"),
getString("text modify info 2"),
getString("text modify info 3"),
- getString("text modify info 4")
+ getString("text modify info 4"),
+ getString("text modify info 5"),
+ getString("text modify info 6")
};
if (!is_perm_modify)
{
string_index += 2;
}
+ else if (!is_nonpermanent_enforced)
+ {
+ string_index += 4;
+ }
if (!is_one_object)
{
++string_index;
@@ -320,6 +333,34 @@ void LLPanelPermissions::refresh()
getChildView("perm_modify")->setEnabled(TRUE);
getChild<LLUICtrl>("perm_modify")->setValue(MODIFY_INFO_STRINGS[string_index]);
+ std::string pfAttrName;
+
+ if ((LLSelectMgr::getInstance()->getSelection()->getFirstRootNode()
+ && LLSelectMgr::getInstance()->selectGetRootsNonPathfinding())
+ || LLSelectMgr::getInstance()->selectGetNonPathfinding())
+ {
+ pfAttrName = "Pathfinding_Object_Attr_None";
+ }
+ else if ((LLSelectMgr::getInstance()->getSelection()->getFirstRootNode()
+ && LLSelectMgr::getInstance()->selectGetRootsPermanent())
+ || LLSelectMgr::getInstance()->selectGetPermanent())
+ {
+ pfAttrName = "Pathfinding_Object_Attr_Permanent";
+ }
+ else if ((LLSelectMgr::getInstance()->getSelection()->getFirstRootNode()
+ && LLSelectMgr::getInstance()->selectGetRootsCharacter())
+ || LLSelectMgr::getInstance()->selectGetCharacter())
+ {
+ pfAttrName = "Pathfinding_Object_Attr_Character";
+ }
+ else
+ {
+ pfAttrName = "Pathfinding_Object_Attr_MultiSelect";
+ }
+
+ getChildView("pathfinding_attributes_value")->setEnabled(TRUE);
+ getChild<LLUICtrl>("pathfinding_attributes_value")->setValue(LLTrans::getString(pfAttrName));
+
getChildView("Permissions:")->setEnabled(TRUE);
// Update creator text field
@@ -384,7 +425,7 @@ void LLPanelPermissions::refresh()
}
}
- getChildView("button set group")->setEnabled(owners_identical && (mOwnerID == gAgent.getID()));
+ getChildView("button set group")->setEnabled(owners_identical && (mOwnerID == gAgent.getID()) && is_nonpermanent_enforced);
getChildView("Name:")->setEnabled(TRUE);
LLLineEditor* LineEditorObjectName = getChild<LLLineEditor>("Object Name");
@@ -414,7 +455,7 @@ void LLPanelPermissions::refresh()
// figure out the contents of the name, description, & category
BOOL edit_name_desc = FALSE;
- if (is_one_object && objectp->permModify())
+ if (is_one_object && objectp->permModify() && !objectp->isPermanentEnforced())
{
edit_name_desc = TRUE;
}
@@ -594,12 +635,12 @@ void LLPanelPermissions::refresh()
BOOL has_change_perm_ability = FALSE;
BOOL has_change_sale_ability = FALSE;
- if (valid_base_perms &&
+ if (valid_base_perms && is_nonpermanent_enforced &&
(self_owned || (group_owned && gAgent.hasPowerInGroup(group_id, GP_OBJECT_MANIPULATE))))
{
has_change_perm_ability = TRUE;
}
- if (valid_base_perms &&
+ if (valid_base_perms && is_nonpermanent_enforced &&
(self_owned || (group_owned && gAgent.hasPowerInGroup(group_id, GP_OBJECT_SET_SALE))))
{
has_change_sale_ability = TRUE;
@@ -812,8 +853,8 @@ void LLPanelPermissions::refresh()
combo_click_action->setValue(LLSD(combo_value));
}
}
- getChildView("label click action")->setEnabled(is_perm_modify && all_volume);
- getChildView("clickaction")->setEnabled(is_perm_modify && all_volume);
+ getChildView("label click action")->setEnabled(is_perm_modify && is_nonpermanent_enforced && all_volume);
+ getChildView("clickaction")->setEnabled(is_perm_modify && is_nonpermanent_enforced && all_volume);
}
diff --git a/indra/newview/llpanelvolume.cpp b/indra/newview/llpanelvolume.cpp
index 12eea7844d..13b746dbab 100644
--- a/indra/newview/llpanelvolume.cpp
+++ b/indra/newview/llpanelvolume.cpp
@@ -68,6 +68,7 @@
#include "llworld.h"
#include "pipeline.h"
#include "llviewershadermgr.h"
+#include "llnotificationsutil.h"
#include "lldrawpool.h"
#include "lluictrlfactory.h"
@@ -77,13 +78,15 @@
#include "llviewercontrol.h"
#include "llmeshrepository.h"
+#include <boost/bind.hpp>
+
// "Features" Tab
BOOL LLPanelVolume::postBuild()
{
// Flexible Objects Parameters
{
- childSetCommitCallback("Flexible1D Checkbox Ctrl",onCommitIsFlexible,this);
+ childSetCommitCallback("Flexible1D Checkbox Ctrl", boost::bind(&LLPanelVolume::onCommitIsFlexible, this, _1, _2), NULL);
childSetCommitCallback("FlexNumSections",onCommitFlexible,this);
getChild<LLUICtrl>("FlexNumSections")->setValidateBeforeCommit(precommitValidate);
childSetCommitCallback("FlexGravity",onCommitFlexible,this);
@@ -255,7 +258,7 @@ void LLPanelVolume::getState( )
owners_identical = LLSelectMgr::getInstance()->selectGetOwner(owner_id, owner_name);
// BUG? Check for all objects being editable?
- BOOL editable = root_objectp->permModify();
+ BOOL editable = root_objectp->permModify() && !root_objectp->isPermanentEnforced();
BOOL single_volume = LLSelectMgr::getInstance()->selectionAllPCode( LL_PCODE_VOLUME )
&& LLSelectMgr::getInstance()->getSelection()->getObjectCount() == 1;
@@ -351,7 +354,7 @@ void LLPanelVolume::getState( )
getChild<LLUICtrl>("Flexible1D Checkbox Ctrl")->setValue(is_flexible);
if (is_flexible || (volobjp && volobjp->canBeFlexible()))
{
- getChildView("Flexible1D Checkbox Ctrl")->setEnabled(editable && single_volume && volobjp && !volobjp->isMesh());
+ getChildView("Flexible1D Checkbox Ctrl")->setEnabled(editable && single_volume && volobjp && !volobjp->isMesh() && !objectp->isPermanentEnforced());
}
else
{
@@ -495,7 +498,7 @@ void LLPanelVolume::getState( )
mComboPhysicsShapeType->add(getString("Convex Hull"), LLSD(2));
mComboPhysicsShapeType->setValue(LLSD(objectp->getPhysicsShapeType()));
- mComboPhysicsShapeType->setEnabled(editable);
+ mComboPhysicsShapeType->setEnabled(editable && !objectp->isPermanentEnforced() && ((root_objectp == NULL) || !root_objectp->isPermanentEnforced()));
mObject = objectp;
mRootObject = root_objectp;
@@ -873,10 +876,26 @@ void LLPanelVolume::onCommitFlexible( LLUICtrl* ctrl, void* userdata )
self->refresh();
}
-// static
-void LLPanelVolume::onCommitIsFlexible( LLUICtrl* ctrl, void* userdata )
+void LLPanelVolume::onCommitIsFlexible(LLUICtrl *, void*)
{
- LLPanelVolume* self = (LLPanelVolume*) userdata;
- self->sendIsFlexible();
+ if (mObject->flagObjectPermanent())
+ {
+ LLNotificationsUtil::add("PathfindingLinksets_ChangeToFlexiblePath", LLSD(), LLSD(), boost::bind(&LLPanelVolume::handleResponseChangeToFlexible, this, _1, _2));
+ }
+ else
+ {
+ sendIsFlexible();
+ }
}
+void LLPanelVolume::handleResponseChangeToFlexible(const LLSD &pNotification, const LLSD &pResponse)
+{
+ if (LLNotificationsUtil::getSelectedOption(pNotification, pResponse) == 0)
+ {
+ sendIsFlexible();
+ }
+ else
+ {
+ getChild<LLUICtrl>("Flexible1D Checkbox Ctrl")->setValue(FALSE);
+ }
+}
diff --git a/indra/newview/llpanelvolume.h b/indra/newview/llpanelvolume.h
index 0ef47db0d9..deb6b6f2a6 100644
--- a/indra/newview/llpanelvolume.h
+++ b/indra/newview/llpanelvolume.h
@@ -61,7 +61,7 @@ public:
static void onCommitIsLight( LLUICtrl* ctrl, void* userdata);
static void onCommitLight( LLUICtrl* ctrl, void* userdata);
- static void onCommitIsFlexible( LLUICtrl* ctrl, void* userdata);
+ 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);
@@ -84,6 +84,8 @@ protected:
void sendPhysicsRestitution(LLUICtrl* ctrl, void* userdata);
void sendPhysicsDensity(LLUICtrl* ctrl, void* userdata);
+ void handleResponseChangeToFlexible(const LLSD &pNotification, const LLSD &pResponse);
+
/*
LLTextBox* mLabelSelectSingleMessage;
// Light
diff --git a/indra/newview/llpathfindingcharacter.cpp b/indra/newview/llpathfindingcharacter.cpp
new file mode 100644
index 0000000000..00f2ebc4bb
--- /dev/null
+++ b/indra/newview/llpathfindingcharacter.cpp
@@ -0,0 +1,99 @@
+/**
+* @file llpathfindingcharacter.cpp
+* @brief Definition of a pathfinding character that contains various properties required for havok pathfinding.
+* @author Stinson@lindenlab.com
+*
+* $LicenseInfo:firstyear=2012&license=viewerlgpl$
+* Second Life Viewer Source Code
+* Copyright (C) 2012, Linden Research, Inc.
+*
+* This library is free software; you can redistribute it and/or
+* modify it under the terms of the GNU Lesser General Public
+* License as published by the Free Software Foundation;
+* version 2.1 of the License only.
+*
+* This library is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this library; if not, write to the Free Software
+* 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 "llpathfindingcharacter.h"
+
+#include <string>
+
+#include "llpathfindingobject.h"
+#include "llsd.h"
+
+#define CHARACTER_CPU_TIME_FIELD "cpu_time"
+#define CHARACTER_HORIZONTAL_FIELD "horizontal"
+#define CHARACTER_LENGTH_FIELD "length"
+#define CHARACTER_RADIUS_FIELD "radius"
+
+//---------------------------------------------------------------------------
+// LLPathfindingCharacter
+//---------------------------------------------------------------------------
+
+LLPathfindingCharacter::LLPathfindingCharacter(const std::string &pUUID, const LLSD& pCharacterData)
+ : LLPathfindingObject(pUUID, pCharacterData),
+ mCPUTime(0U),
+ mIsHorizontal(FALSE),
+ mLength(0.0f),
+ mRadius(0.0f)
+{
+ parseCharacterData(pCharacterData);
+}
+
+LLPathfindingCharacter::LLPathfindingCharacter(const LLPathfindingCharacter& pOther)
+ : LLPathfindingObject(pOther),
+ mCPUTime(pOther.mCPUTime),
+ mIsHorizontal(pOther.mIsHorizontal),
+ mLength(pOther.mLength),
+ mRadius(pOther.mRadius)
+{
+}
+
+LLPathfindingCharacter::~LLPathfindingCharacter()
+{
+}
+
+LLPathfindingCharacter& LLPathfindingCharacter::operator =(const LLPathfindingCharacter& pOther)
+{
+ dynamic_cast<LLPathfindingObject &>(*this) = pOther;
+
+ mCPUTime = pOther.mCPUTime;
+ mIsHorizontal = pOther.mIsHorizontal;
+ mLength = pOther.mLength;
+ mRadius = pOther.mRadius;
+
+ return *this;
+}
+
+void LLPathfindingCharacter::parseCharacterData(const LLSD &pCharacterData)
+{
+ llassert(pCharacterData.has(CHARACTER_CPU_TIME_FIELD));
+ llassert(pCharacterData.get(CHARACTER_CPU_TIME_FIELD).isReal());
+ mCPUTime = pCharacterData.get(CHARACTER_CPU_TIME_FIELD).asReal();
+
+ llassert(pCharacterData.has(CHARACTER_HORIZONTAL_FIELD));
+ llassert(pCharacterData.get(CHARACTER_HORIZONTAL_FIELD).isBoolean());
+ mIsHorizontal = pCharacterData.get(CHARACTER_HORIZONTAL_FIELD).asBoolean();
+
+ llassert(pCharacterData.has(CHARACTER_LENGTH_FIELD));
+ llassert(pCharacterData.get(CHARACTER_LENGTH_FIELD).isReal());
+ mLength = pCharacterData.get(CHARACTER_LENGTH_FIELD).asReal();
+
+ llassert(pCharacterData.has(CHARACTER_RADIUS_FIELD));
+ llassert(pCharacterData.get(CHARACTER_RADIUS_FIELD).isReal());
+ mRadius = pCharacterData.get(CHARACTER_RADIUS_FIELD).asReal();
+}
diff --git a/indra/newview/llpathfindingcharacter.h b/indra/newview/llpathfindingcharacter.h
new file mode 100644
index 0000000000..7cf9f401b0
--- /dev/null
+++ b/indra/newview/llpathfindingcharacter.h
@@ -0,0 +1,63 @@
+/**
+* @file llpathfindingcharacter.h
+* @brief Definition of a pathfinding character that contains various properties required for havok pathfinding.
+* @author Stinson@lindenlab.com
+*
+* $LicenseInfo:firstyear=2012&license=viewerlgpl$
+* Second Life Viewer Source Code
+* Copyright (C) 2012, Linden Research, Inc.
+*
+* This library is free software; you can redistribute it and/or
+* modify it under the terms of the GNU Lesser General Public
+* License as published by the Free Software Foundation;
+* version 2.1 of the License only.
+*
+* This library is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this library; if not, write to the Free Software
+* 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_LLPATHFINDINGCHARACTER_H
+#define LL_LLPATHFINDINGCHARACTER_H
+
+#include <string>
+
+#include "llpathfindingobject.h"
+
+class LLSD;
+
+class LLPathfindingCharacter : public LLPathfindingObject
+{
+public:
+ LLPathfindingCharacter(const std::string &pUUID, const LLSD &pCharacterData);
+ LLPathfindingCharacter(const LLPathfindingCharacter& pOther);
+ virtual ~LLPathfindingCharacter();
+
+ LLPathfindingCharacter& operator =(const LLPathfindingCharacter& pOther);
+
+ inline F32 getCPUTime() const {return mCPUTime;};
+
+ inline BOOL isHorizontal() const {return mIsHorizontal;};
+ inline F32 getLength() const {return mLength;};
+ inline F32 getRadius() const {return mRadius;};
+
+protected:
+
+private:
+ void parseCharacterData(const LLSD &pCharacterData);
+
+ F32 mCPUTime;
+
+ BOOL mIsHorizontal;
+ F32 mLength;
+ F32 mRadius;
+};
+
+#endif // LL_LLPATHFINDINGCHARACTER_H
diff --git a/indra/newview/llpathfindingcharacterlist.cpp b/indra/newview/llpathfindingcharacterlist.cpp
new file mode 100644
index 0000000000..12340cebfa
--- /dev/null
+++ b/indra/newview/llpathfindingcharacterlist.cpp
@@ -0,0 +1,69 @@
+/**
+* @file llpathfindingcharacterlist.cpp
+* @brief Implementation of llpathfindingcharacterlist
+* @author Stinson@lindenlab.com
+*
+* $LicenseInfo:firstyear=2012&license=viewerlgpl$
+* Second Life Viewer Source Code
+* Copyright (C) 2012, Linden Research, Inc.
+*
+* This library is free software; you can redistribute it and/or
+* modify it under the terms of the GNU Lesser General Public
+* License as published by the Free Software Foundation;
+* version 2.1 of the License only.
+*
+* This library is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this library; if not, write to the Free Software
+* 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 "llpathfindingcharacterlist.h"
+
+#include "llpathfindingcharacter.h"
+#include "llpathfindingobject.h"
+#include "llpathfindingobjectlist.h"
+#include "llsd.h"
+
+//---------------------------------------------------------------------------
+// LLPathfindingCharacterList
+//---------------------------------------------------------------------------
+
+LLPathfindingCharacterList::LLPathfindingCharacterList()
+ : LLPathfindingObjectList()
+{
+}
+
+LLPathfindingCharacterList::LLPathfindingCharacterList(const LLSD& pCharacterListData)
+ : LLPathfindingObjectList()
+{
+ parseCharacterListData(pCharacterListData);
+}
+
+LLPathfindingCharacterList::~LLPathfindingCharacterList()
+{
+}
+
+void LLPathfindingCharacterList::parseCharacterListData(const LLSD& pCharacterListData)
+{
+ LLPathfindingObjectMap &objectMap = getObjectMap();
+
+ for (LLSD::map_const_iterator characterDataIter = pCharacterListData.beginMap();
+ characterDataIter != pCharacterListData.endMap(); ++characterDataIter)
+ {
+ const std::string& uuid(characterDataIter->first);
+ const LLSD& characterData = characterDataIter->second;
+ LLPathfindingObjectPtr character(new LLPathfindingCharacter(uuid, characterData));
+ objectMap.insert(std::pair<std::string, LLPathfindingObjectPtr>(uuid, character));
+ }
+}
diff --git a/indra/newview/llpathfindingcharacterlist.h b/indra/newview/llpathfindingcharacterlist.h
new file mode 100644
index 0000000000..4ecf70001d
--- /dev/null
+++ b/indra/newview/llpathfindingcharacterlist.h
@@ -0,0 +1,47 @@
+/**
+* @file llpathfindingcharacterlist.h
+* @brief Header file for llpathfindingcharacterlist
+* @author Stinson@lindenlab.com
+*
+* $LicenseInfo:firstyear=2012&license=viewerlgpl$
+* Second Life Viewer Source Code
+* Copyright (C) 2012, Linden Research, Inc.
+*
+* This library is free software; you can redistribute it and/or
+* modify it under the terms of the GNU Lesser General Public
+* License as published by the Free Software Foundation;
+* version 2.1 of the License only.
+*
+* This library is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this library; if not, write to the Free Software
+* 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_LLPATHFINDINGCHARACTERLIST_H
+#define LL_LLPATHFINDINGCHARACTERLIST_H
+
+#include "llpathfindingobjectlist.h"
+
+class LLSD;
+
+class LLPathfindingCharacterList : public LLPathfindingObjectList
+{
+public:
+ LLPathfindingCharacterList();
+ LLPathfindingCharacterList(const LLSD& pCharacterListData);
+ virtual ~LLPathfindingCharacterList();
+
+protected:
+
+private:
+ void parseCharacterListData(const LLSD& pCharacterListData);
+};
+
+#endif // LL_LLPATHFINDINGCHARACTERLIST_H
diff --git a/indra/newview/llpathfindinglinkset.cpp b/indra/newview/llpathfindinglinkset.cpp
new file mode 100644
index 0000000000..fe4daabd89
--- /dev/null
+++ b/indra/newview/llpathfindinglinkset.cpp
@@ -0,0 +1,387 @@
+/**
+* @file llpathfindinglinkset.cpp
+* @brief Definition of a pathfinding linkset that contains various properties required for havok pathfinding.
+* @author Stinson@lindenlab.com
+*
+* $LicenseInfo:firstyear=2012&license=viewerlgpl$
+* Second Life Viewer Source Code
+* Copyright (C) 2012, Linden Research, Inc.
+*
+* This library is free software; you can redistribute it and/or
+* modify it under the terms of the GNU Lesser General Public
+* License as published by the Free Software Foundation;
+* version 2.1 of the License only.
+*
+* This library is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this library; if not, write to the Free Software
+* 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 "llpathfindinglinkset.h"
+
+#include <string>
+
+#include "llpathfindingobject.h"
+#include "llsd.h"
+
+#define LINKSET_LAND_IMPACT_FIELD "landimpact"
+#define LINKSET_MODIFIABLE_FIELD "modifiable"
+#define LINKSET_CATEGORY_FIELD "navmesh_category"
+#define LINKSET_CAN_BE_VOLUME "can_be_volume"
+#define LINKSET_PHANTOM_FIELD "phantom"
+#define LINKSET_WALKABILITY_A_FIELD "A"
+#define LINKSET_WALKABILITY_B_FIELD "B"
+#define LINKSET_WALKABILITY_C_FIELD "C"
+#define LINKSET_WALKABILITY_D_FIELD "D"
+
+#define LINKSET_CATEGORY_VALUE_INCLUDE 0
+#define LINKSET_CATEGORY_VALUE_EXCLUDE 1
+#define LINKSET_CATEGORY_VALUE_IGNORE 2
+
+//---------------------------------------------------------------------------
+// LLPathfindingLinkset
+//---------------------------------------------------------------------------
+
+const S32 LLPathfindingLinkset::MIN_WALKABILITY_VALUE(0);
+const S32 LLPathfindingLinkset::MAX_WALKABILITY_VALUE(100);
+
+LLPathfindingLinkset::LLPathfindingLinkset(const LLSD& pTerrainData)
+ : LLPathfindingObject(),
+ mIsTerrain(true),
+ mLandImpact(0U),
+ mIsModifiable(FALSE),
+ mCanBeVolume(FALSE),
+ mLinksetUse(kUnknown),
+ mWalkabilityCoefficientA(MIN_WALKABILITY_VALUE),
+ mWalkabilityCoefficientB(MIN_WALKABILITY_VALUE),
+ mWalkabilityCoefficientC(MIN_WALKABILITY_VALUE),
+ mWalkabilityCoefficientD(MIN_WALKABILITY_VALUE)
+{
+ parsePathfindingData(pTerrainData);
+}
+
+LLPathfindingLinkset::LLPathfindingLinkset(const std::string &pUUID, const LLSD& pLinksetData)
+ : LLPathfindingObject(pUUID, pLinksetData),
+ mIsTerrain(false),
+ mLandImpact(0U),
+ mIsModifiable(TRUE),
+ mCanBeVolume(TRUE),
+ mLinksetUse(kUnknown),
+ mWalkabilityCoefficientA(MIN_WALKABILITY_VALUE),
+ mWalkabilityCoefficientB(MIN_WALKABILITY_VALUE),
+ mWalkabilityCoefficientC(MIN_WALKABILITY_VALUE),
+ mWalkabilityCoefficientD(MIN_WALKABILITY_VALUE)
+{
+ parseLinksetData(pLinksetData);
+ parsePathfindingData(pLinksetData);
+}
+
+LLPathfindingLinkset::LLPathfindingLinkset(const LLPathfindingLinkset& pOther)
+ : LLPathfindingObject(pOther),
+ mIsTerrain(pOther.mIsTerrain),
+ mLandImpact(pOther.mLandImpact),
+ mIsModifiable(pOther.mIsModifiable),
+ mCanBeVolume(pOther.mCanBeVolume),
+ mLinksetUse(pOther.mLinksetUse),
+ mWalkabilityCoefficientA(pOther.mWalkabilityCoefficientA),
+ mWalkabilityCoefficientB(pOther.mWalkabilityCoefficientB),
+ mWalkabilityCoefficientC(pOther.mWalkabilityCoefficientC),
+ mWalkabilityCoefficientD(pOther.mWalkabilityCoefficientD)
+{
+}
+
+LLPathfindingLinkset::~LLPathfindingLinkset()
+{
+}
+
+LLPathfindingLinkset& LLPathfindingLinkset::operator =(const LLPathfindingLinkset& pOther)
+{
+ dynamic_cast<LLPathfindingObject &>(*this) = pOther;
+
+ mIsTerrain = pOther.mIsTerrain;
+ mLandImpact = pOther.mLandImpact;
+ mIsModifiable = pOther.mIsModifiable;
+ mCanBeVolume = pOther.mCanBeVolume;
+ mLinksetUse = pOther.mLinksetUse;
+ mWalkabilityCoefficientA = pOther.mWalkabilityCoefficientA;
+ mWalkabilityCoefficientB = pOther.mWalkabilityCoefficientB;
+ mWalkabilityCoefficientC = pOther.mWalkabilityCoefficientC;
+ mWalkabilityCoefficientD = pOther.mWalkabilityCoefficientD;
+
+ return *this;
+}
+
+BOOL LLPathfindingLinkset::isPhantom() const
+{
+ return isPhantom(getLinksetUse());
+}
+
+LLPathfindingLinkset::ELinksetUse LLPathfindingLinkset::getLinksetUseWithToggledPhantom(ELinksetUse pLinksetUse)
+{
+ BOOL isPhantom = LLPathfindingLinkset::isPhantom(pLinksetUse);
+ ENavMeshGenerationCategory navMeshGenerationCategory = getNavMeshGenerationCategory(pLinksetUse);
+
+ return getLinksetUse(!isPhantom, navMeshGenerationCategory);
+}
+
+bool LLPathfindingLinkset::isShowUnmodifiablePhantomWarning(ELinksetUse pLinksetUse) const
+{
+ return (!isModifiable() && (isPhantom() != isPhantom(pLinksetUse)));
+}
+
+bool LLPathfindingLinkset::isShowCannotBeVolumeWarning(ELinksetUse pLinksetUse) const
+{
+ return (!canBeVolume() && ((pLinksetUse == kMaterialVolume) || (pLinksetUse == kExclusionVolume)));
+}
+
+LLSD LLPathfindingLinkset::encodeAlteredFields(ELinksetUse pLinksetUse, S32 pA, S32 pB, S32 pC, S32 pD) const
+{
+ LLSD itemData;
+
+ if (!isTerrain() && (pLinksetUse != kUnknown) && (getLinksetUse() != pLinksetUse) &&
+ (canBeVolume() || ((pLinksetUse != kMaterialVolume) && (pLinksetUse != kExclusionVolume))))
+ {
+ if (isModifiable())
+ {
+ itemData[LINKSET_PHANTOM_FIELD] = static_cast<bool>(isPhantom(pLinksetUse));
+ }
+
+ itemData[LINKSET_CATEGORY_FIELD] = convertCategoryToLLSD(getNavMeshGenerationCategory(pLinksetUse));
+ }
+
+ if (mWalkabilityCoefficientA != pA)
+ {
+ itemData[LINKSET_WALKABILITY_A_FIELD] = llclamp(pA, MIN_WALKABILITY_VALUE, MAX_WALKABILITY_VALUE);
+ }
+
+ if (mWalkabilityCoefficientB != pB)
+ {
+ itemData[LINKSET_WALKABILITY_B_FIELD] = llclamp(pB, MIN_WALKABILITY_VALUE, MAX_WALKABILITY_VALUE);
+ }
+
+ if (mWalkabilityCoefficientC != pC)
+ {
+ itemData[LINKSET_WALKABILITY_C_FIELD] = llclamp(pC, MIN_WALKABILITY_VALUE, MAX_WALKABILITY_VALUE);
+ }
+
+ if (mWalkabilityCoefficientD != pD)
+ {
+ itemData[LINKSET_WALKABILITY_D_FIELD] = llclamp(pD, MIN_WALKABILITY_VALUE, MAX_WALKABILITY_VALUE);
+ }
+
+ return itemData;
+}
+
+void LLPathfindingLinkset::parseLinksetData(const LLSD &pLinksetData)
+{
+ llassert(pLinksetData.has(LINKSET_LAND_IMPACT_FIELD));
+ llassert(pLinksetData.get(LINKSET_LAND_IMPACT_FIELD).isInteger());
+ llassert(pLinksetData.get(LINKSET_LAND_IMPACT_FIELD).asInteger() >= 0);
+ mLandImpact = pLinksetData.get(LINKSET_LAND_IMPACT_FIELD).asInteger();
+
+ llassert(pLinksetData.has(LINKSET_MODIFIABLE_FIELD));
+ llassert(pLinksetData.get(LINKSET_MODIFIABLE_FIELD).isBoolean());
+ mIsModifiable = pLinksetData.get(LINKSET_MODIFIABLE_FIELD).asBoolean();
+}
+
+void LLPathfindingLinkset::parsePathfindingData(const LLSD &pLinksetData)
+{
+ bool isPhantom = false;
+ if (pLinksetData.has(LINKSET_PHANTOM_FIELD))
+ {
+ llassert(pLinksetData.get(LINKSET_PHANTOM_FIELD).isBoolean());
+ isPhantom = pLinksetData.get(LINKSET_PHANTOM_FIELD).asBoolean();
+ }
+
+ llassert(pLinksetData.has(LINKSET_CATEGORY_FIELD));
+ mLinksetUse = getLinksetUse(isPhantom, convertCategoryFromLLSD(pLinksetData.get(LINKSET_CATEGORY_FIELD)));
+
+ if (pLinksetData.has(LINKSET_CAN_BE_VOLUME))
+ {
+ llassert(pLinksetData.get(LINKSET_CAN_BE_VOLUME).isBoolean());
+ mCanBeVolume = pLinksetData.get(LINKSET_CAN_BE_VOLUME).asBoolean();
+ }
+
+ llassert(pLinksetData.has(LINKSET_WALKABILITY_A_FIELD));
+ llassert(pLinksetData.get(LINKSET_WALKABILITY_A_FIELD).isInteger());
+ mWalkabilityCoefficientA = pLinksetData.get(LINKSET_WALKABILITY_A_FIELD).asInteger();
+ llassert(mWalkabilityCoefficientA >= MIN_WALKABILITY_VALUE);
+ llassert(mWalkabilityCoefficientA <= MAX_WALKABILITY_VALUE);
+
+ llassert(pLinksetData.has(LINKSET_WALKABILITY_B_FIELD));
+ llassert(pLinksetData.get(LINKSET_WALKABILITY_B_FIELD).isInteger());
+ mWalkabilityCoefficientB = pLinksetData.get(LINKSET_WALKABILITY_B_FIELD).asInteger();
+ llassert(mWalkabilityCoefficientB >= MIN_WALKABILITY_VALUE);
+ llassert(mWalkabilityCoefficientB <= MAX_WALKABILITY_VALUE);
+
+ llassert(pLinksetData.has(LINKSET_WALKABILITY_C_FIELD));
+ llassert(pLinksetData.get(LINKSET_WALKABILITY_C_FIELD).isInteger());
+ mWalkabilityCoefficientC = pLinksetData.get(LINKSET_WALKABILITY_C_FIELD).asInteger();
+ llassert(mWalkabilityCoefficientC >= MIN_WALKABILITY_VALUE);
+ llassert(mWalkabilityCoefficientC <= MAX_WALKABILITY_VALUE);
+
+ llassert(pLinksetData.has(LINKSET_WALKABILITY_D_FIELD));
+ llassert(pLinksetData.get(LINKSET_WALKABILITY_D_FIELD).isInteger());
+ mWalkabilityCoefficientD = pLinksetData.get(LINKSET_WALKABILITY_D_FIELD).asInteger();
+ llassert(mWalkabilityCoefficientD >= MIN_WALKABILITY_VALUE);
+ llassert(mWalkabilityCoefficientD <= MAX_WALKABILITY_VALUE);
+}
+
+BOOL LLPathfindingLinkset::isPhantom(ELinksetUse pLinksetUse)
+{
+ BOOL retVal;
+
+ switch (pLinksetUse)
+ {
+ case kWalkable :
+ case kStaticObstacle :
+ case kDynamicObstacle :
+ retVal = false;
+ break;
+ case kMaterialVolume :
+ case kExclusionVolume :
+ case kDynamicPhantom :
+ retVal = true;
+ break;
+ case kUnknown :
+ default :
+ retVal = false;
+ llassert(0);
+ break;
+ }
+
+ return retVal;
+}
+
+LLPathfindingLinkset::ELinksetUse LLPathfindingLinkset::getLinksetUse(bool pIsPhantom, ENavMeshGenerationCategory pNavMeshGenerationCategory)
+{
+ ELinksetUse linksetUse = kUnknown;
+
+ if (pIsPhantom)
+ {
+ switch (pNavMeshGenerationCategory)
+ {
+ case kNavMeshGenerationIgnore :
+ linksetUse = kDynamicPhantom;
+ break;
+ case kNavMeshGenerationInclude :
+ linksetUse = kMaterialVolume;
+ break;
+ case kNavMeshGenerationExclude :
+ linksetUse = kExclusionVolume;
+ break;
+ default :
+ linksetUse = kUnknown;
+ llassert(0);
+ break;
+ }
+ }
+ else
+ {
+ switch (pNavMeshGenerationCategory)
+ {
+ case kNavMeshGenerationIgnore :
+ linksetUse = kDynamicObstacle;
+ break;
+ case kNavMeshGenerationInclude :
+ linksetUse = kWalkable;
+ break;
+ case kNavMeshGenerationExclude :
+ linksetUse = kStaticObstacle;
+ break;
+ default :
+ linksetUse = kUnknown;
+ llassert(0);
+ break;
+ }
+ }
+
+ return linksetUse;
+}
+
+LLPathfindingLinkset::ENavMeshGenerationCategory LLPathfindingLinkset::getNavMeshGenerationCategory(ELinksetUse pLinksetUse)
+{
+ ENavMeshGenerationCategory navMeshGenerationCategory;
+ switch (pLinksetUse)
+ {
+ case kWalkable :
+ case kMaterialVolume :
+ navMeshGenerationCategory = kNavMeshGenerationInclude;
+ break;
+ case kStaticObstacle :
+ case kExclusionVolume :
+ navMeshGenerationCategory = kNavMeshGenerationExclude;
+ break;
+ case kDynamicObstacle :
+ case kDynamicPhantom :
+ navMeshGenerationCategory = kNavMeshGenerationIgnore;
+ break;
+ case kUnknown :
+ default :
+ navMeshGenerationCategory = kNavMeshGenerationIgnore;
+ llassert(0);
+ break;
+ }
+
+ return navMeshGenerationCategory;
+}
+
+LLSD LLPathfindingLinkset::convertCategoryToLLSD(ENavMeshGenerationCategory pNavMeshGenerationCategory)
+{
+ LLSD llsd;
+
+ switch (pNavMeshGenerationCategory)
+ {
+ case kNavMeshGenerationIgnore :
+ llsd = static_cast<S32>(LINKSET_CATEGORY_VALUE_IGNORE);
+ break;
+ case kNavMeshGenerationInclude :
+ llsd = static_cast<S32>(LINKSET_CATEGORY_VALUE_INCLUDE);
+ break;
+ case kNavMeshGenerationExclude :
+ llsd = static_cast<S32>(LINKSET_CATEGORY_VALUE_EXCLUDE);
+ break;
+ default :
+ llsd = static_cast<S32>(LINKSET_CATEGORY_VALUE_IGNORE);
+ llassert(0);
+ break;
+ }
+
+ return llsd;
+}
+
+LLPathfindingLinkset::ENavMeshGenerationCategory LLPathfindingLinkset::convertCategoryFromLLSD(const LLSD &llsd)
+{
+ ENavMeshGenerationCategory navMeshGenerationCategory;
+
+ llassert(llsd.isInteger());
+ switch (llsd.asInteger())
+ {
+ case LINKSET_CATEGORY_VALUE_IGNORE :
+ navMeshGenerationCategory = kNavMeshGenerationIgnore;
+ break;
+ case LINKSET_CATEGORY_VALUE_INCLUDE :
+ navMeshGenerationCategory = kNavMeshGenerationInclude;
+ break;
+ case LINKSET_CATEGORY_VALUE_EXCLUDE :
+ navMeshGenerationCategory = kNavMeshGenerationExclude;
+ break;
+ default :
+ navMeshGenerationCategory = kNavMeshGenerationIgnore;
+ llassert(0);
+ break;
+ }
+
+ return navMeshGenerationCategory;
+}
diff --git a/indra/newview/llpathfindinglinkset.h b/indra/newview/llpathfindinglinkset.h
new file mode 100644
index 0000000000..73b4d6bad4
--- /dev/null
+++ b/indra/newview/llpathfindinglinkset.h
@@ -0,0 +1,108 @@
+/**
+* @file llpathfindinglinkset.h
+* @brief Definition of a pathfinding linkset that contains various properties required for havok pathfinding.
+* @author Stinson@lindenlab.com
+*
+* $LicenseInfo:firstyear=2012&license=viewerlgpl$
+* Second Life Viewer Source Code
+* Copyright (C) 2012, Linden Research, Inc.
+*
+* This library is free software; you can redistribute it and/or
+* modify it under the terms of the GNU Lesser General Public
+* License as published by the Free Software Foundation;
+* version 2.1 of the License only.
+*
+* This library is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this library; if not, write to the Free Software
+* 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_LLPATHFINDINGLINKSET_H
+#define LL_LLPATHFINDINGLINKSET_H
+
+#include <string>
+
+#include "llpathfindingobject.h"
+
+class LLSD;
+
+class LLPathfindingLinkset : public LLPathfindingObject
+{
+public:
+ typedef enum
+ {
+ kUnknown,
+ kWalkable,
+ kStaticObstacle,
+ kDynamicObstacle,
+ kMaterialVolume,
+ kExclusionVolume,
+ kDynamicPhantom
+ } ELinksetUse;
+
+ LLPathfindingLinkset(const LLSD &pTerrainData);
+ LLPathfindingLinkset(const std::string &pUUID, const LLSD &pLinksetData);
+ LLPathfindingLinkset(const LLPathfindingLinkset& pOther);
+ virtual ~LLPathfindingLinkset();
+
+ LLPathfindingLinkset& operator = (const LLPathfindingLinkset& pOther);
+
+ inline bool isTerrain() const {return mIsTerrain;};
+ inline U32 getLandImpact() const {return mLandImpact;};
+ BOOL isModifiable() const {return mIsModifiable;};
+ BOOL isPhantom() const;
+ BOOL canBeVolume() const {return mCanBeVolume;};
+ static ELinksetUse getLinksetUseWithToggledPhantom(ELinksetUse pLinksetUse);
+
+ inline ELinksetUse getLinksetUse() const {return mLinksetUse;};
+
+ inline S32 getWalkabilityCoefficientA() const {return mWalkabilityCoefficientA;};
+ inline S32 getWalkabilityCoefficientB() const {return mWalkabilityCoefficientB;};
+ inline S32 getWalkabilityCoefficientC() const {return mWalkabilityCoefficientC;};
+ inline S32 getWalkabilityCoefficientD() const {return mWalkabilityCoefficientD;};
+
+ bool isShowUnmodifiablePhantomWarning(ELinksetUse pLinksetUse) const;
+ bool isShowCannotBeVolumeWarning(ELinksetUse pLinksetUse) const;
+ LLSD encodeAlteredFields(ELinksetUse pLinksetUse, S32 pA, S32 pB, S32 pC, S32 pD) const;
+
+ static const S32 MIN_WALKABILITY_VALUE;
+ static const S32 MAX_WALKABILITY_VALUE;
+
+protected:
+
+private:
+ typedef enum
+ {
+ kNavMeshGenerationIgnore,
+ kNavMeshGenerationInclude,
+ kNavMeshGenerationExclude
+ } ENavMeshGenerationCategory;
+
+ void parseLinksetData(const LLSD &pLinksetData);
+ void parsePathfindingData(const LLSD &pLinksetData);
+
+ static BOOL isPhantom(ELinksetUse pLinksetUse);
+ static ELinksetUse getLinksetUse(bool pIsPhantom, ENavMeshGenerationCategory pNavMeshGenerationCategory);
+ static ENavMeshGenerationCategory getNavMeshGenerationCategory(ELinksetUse pLinksetUse);
+ static LLSD convertCategoryToLLSD(ENavMeshGenerationCategory pNavMeshGenerationCategory);
+ static ENavMeshGenerationCategory convertCategoryFromLLSD(const LLSD &llsd);
+
+ bool mIsTerrain;
+ U32 mLandImpact;
+ BOOL mIsModifiable;
+ BOOL mCanBeVolume;
+ ELinksetUse mLinksetUse;
+ S32 mWalkabilityCoefficientA;
+ S32 mWalkabilityCoefficientB;
+ S32 mWalkabilityCoefficientC;
+ S32 mWalkabilityCoefficientD;
+};
+
+#endif // LL_LLPATHFINDINGLINKSET_H
diff --git a/indra/newview/llpathfindinglinksetlist.cpp b/indra/newview/llpathfindinglinksetlist.cpp
new file mode 100644
index 0000000000..746fa342a1
--- /dev/null
+++ b/indra/newview/llpathfindinglinksetlist.cpp
@@ -0,0 +1,196 @@
+/**
+* @file llpathfindinglinksetlist.cpp
+* @brief Implementation of llpathfindinglinksetlist
+* @author Stinson@lindenlab.com
+*
+* $LicenseInfo:firstyear=2012&license=viewerlgpl$
+* Second Life Viewer Source Code
+* Copyright (C) 2012, Linden Research, Inc.
+*
+* This library is free software; you can redistribute it and/or
+* modify it under the terms of the GNU Lesser General Public
+* License as published by the Free Software Foundation;
+* version 2.1 of the License only.
+*
+* This library is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this library; if not, write to the Free Software
+* 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 "llpathfindinglinksetlist.h"
+
+#include <string>
+#include <map>
+
+#include "llpathfindinglinkset.h"
+#include "llpathfindingobject.h"
+#include "llpathfindingobjectlist.h"
+#include "llsd.h"
+
+//---------------------------------------------------------------------------
+// LLPathfindingLinksetList
+//---------------------------------------------------------------------------
+
+LLPathfindingLinksetList::LLPathfindingLinksetList()
+ : LLPathfindingObjectList()
+{
+}
+
+LLPathfindingLinksetList::LLPathfindingLinksetList(const LLSD& pLinksetListData)
+ : LLPathfindingObjectList()
+{
+ parseLinksetListData(pLinksetListData);
+}
+
+LLPathfindingLinksetList::~LLPathfindingLinksetList()
+{
+}
+
+LLSD LLPathfindingLinksetList::encodeObjectFields(LLPathfindingLinkset::ELinksetUse pLinksetUse, S32 pA, S32 pB, S32 pC, S32 pD) const
+{
+ LLSD listData;
+
+ for (const_iterator linksetIter = begin(); linksetIter != end(); ++linksetIter)
+ {
+ const LLPathfindingObjectPtr objectPtr = linksetIter->second;
+ const LLPathfindingLinkset *linkset = dynamic_cast<const LLPathfindingLinkset *>(objectPtr.get());
+
+ if (!linkset->isTerrain())
+ {
+ LLSD linksetData = linkset->encodeAlteredFields(pLinksetUse, pA, pB, pC, pD);
+ if (!linksetData.isUndefined())
+ {
+ const std::string& uuid(linksetIter->first);
+ listData[uuid] = linksetData;
+ }
+ }
+ }
+
+ return listData;
+}
+
+LLSD LLPathfindingLinksetList::encodeTerrainFields(LLPathfindingLinkset::ELinksetUse pLinksetUse, S32 pA, S32 pB, S32 pC, S32 pD) const
+{
+ LLSD terrainData;
+
+ for (const_iterator linksetIter = begin(); linksetIter != end(); ++linksetIter)
+ {
+ const LLPathfindingObjectPtr objectPtr = linksetIter->second;
+ const LLPathfindingLinkset *linkset = dynamic_cast<const LLPathfindingLinkset *>(objectPtr.get());
+
+ if (linkset->isTerrain())
+ {
+ terrainData = linkset->encodeAlteredFields(pLinksetUse, pA, pB, pC, pD);
+ break;
+ }
+ }
+
+ return terrainData;
+}
+
+bool LLPathfindingLinksetList::isShowUnmodifiablePhantomWarning(LLPathfindingLinkset::ELinksetUse pLinksetUse) const
+{
+ bool isShowWarning = false;
+
+ for (const_iterator objectIter = begin(); !isShowWarning && (objectIter != end()); ++objectIter)
+ {
+ const LLPathfindingObjectPtr objectPtr = objectIter->second;
+ const LLPathfindingLinkset *linkset = dynamic_cast<const LLPathfindingLinkset *>(objectPtr.get());
+ isShowWarning = linkset->isShowUnmodifiablePhantomWarning(pLinksetUse);
+ }
+
+ return isShowWarning;
+}
+
+bool LLPathfindingLinksetList::isShowCannotBeVolumeWarning(LLPathfindingLinkset::ELinksetUse pLinksetUse) const
+{
+ bool isShowWarning = false;
+
+ for (const_iterator objectIter = begin(); !isShowWarning && (objectIter != end()); ++objectIter)
+ {
+ const LLPathfindingObjectPtr objectPtr = objectIter->second;
+ const LLPathfindingLinkset *linkset = dynamic_cast<const LLPathfindingLinkset *>(objectPtr.get());
+ isShowWarning = linkset->isShowCannotBeVolumeWarning(pLinksetUse);
+ }
+
+ return isShowWarning;
+}
+
+void LLPathfindingLinksetList::determinePossibleStates(BOOL &pCanBeWalkable, BOOL &pCanBeStaticObstacle, BOOL &pCanBeDynamicObstacle,
+ BOOL &pCanBeMaterialVolume, BOOL &pCanBeExclusionVolume, BOOL &pCanBeDynamicPhantom) const
+{
+ pCanBeWalkable = FALSE;
+ pCanBeStaticObstacle = FALSE;
+ pCanBeDynamicObstacle = FALSE;
+ pCanBeMaterialVolume = FALSE;
+ pCanBeExclusionVolume = FALSE;
+ pCanBeDynamicPhantom = FALSE;
+
+ for (const_iterator objectIter = begin();
+ !(pCanBeWalkable && pCanBeStaticObstacle && pCanBeDynamicObstacle && pCanBeMaterialVolume && pCanBeExclusionVolume && pCanBeDynamicPhantom) && (objectIter != end());
+ ++objectIter)
+ {
+ const LLPathfindingObjectPtr objectPtr = objectIter->second;
+ const LLPathfindingLinkset *linkset = dynamic_cast<const LLPathfindingLinkset *>(objectPtr.get());
+
+ if (linkset->isTerrain())
+ {
+ pCanBeWalkable = TRUE;
+ }
+ else
+ {
+ if (linkset->isModifiable())
+ {
+ pCanBeWalkable = TRUE;
+ pCanBeStaticObstacle = TRUE;
+ pCanBeDynamicObstacle = TRUE;
+ pCanBeDynamicPhantom = TRUE;
+ if (linkset->canBeVolume())
+ {
+ pCanBeMaterialVolume = TRUE;
+ pCanBeExclusionVolume = TRUE;
+ }
+ }
+ else if (linkset->isPhantom())
+ {
+ pCanBeDynamicPhantom = TRUE;
+ if (linkset->canBeVolume())
+ {
+ pCanBeMaterialVolume = TRUE;
+ pCanBeExclusionVolume = TRUE;
+ }
+ }
+ else
+ {
+ pCanBeWalkable = TRUE;
+ pCanBeStaticObstacle = TRUE;
+ pCanBeDynamicObstacle = TRUE;
+ }
+ }
+ }
+}
+
+void LLPathfindingLinksetList::parseLinksetListData(const LLSD& pLinksetListData)
+{
+ LLPathfindingObjectMap &objectMap = getObjectMap();
+
+ for (LLSD::map_const_iterator linksetDataIter = pLinksetListData.beginMap();
+ linksetDataIter != pLinksetListData.endMap(); ++linksetDataIter)
+ {
+ const std::string& uuid(linksetDataIter->first);
+ const LLSD& linksetData = linksetDataIter->second;
+ LLPathfindingObjectPtr linksetPtr(new LLPathfindingLinkset(uuid, linksetData));
+ objectMap.insert(std::pair<std::string, LLPathfindingObjectPtr>(uuid, linksetPtr));
+ }
+}
diff --git a/indra/newview/llpathfindinglinksetlist.h b/indra/newview/llpathfindinglinksetlist.h
new file mode 100644
index 0000000000..77c6358640
--- /dev/null
+++ b/indra/newview/llpathfindinglinksetlist.h
@@ -0,0 +1,57 @@
+/**
+* @file llpathfindinglinksetlist.h
+* @brief Header file for llpathfindinglinksetlist
+* @author Stinson@lindenlab.com
+*
+* $LicenseInfo:firstyear=2012&license=viewerlgpl$
+* Second Life Viewer Source Code
+* Copyright (C) 2012, Linden Research, Inc.
+*
+* This library is free software; you can redistribute it and/or
+* modify it under the terms of the GNU Lesser General Public
+* License as published by the Free Software Foundation;
+* version 2.1 of the License only.
+*
+* This library is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this library; if not, write to the Free Software
+* 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_LLPATHFINDINGLINKSETLIST_H
+#define LL_LLPATHFINDINGLINKSETLIST_H
+
+#include "llpathfindinglinkset.h"
+#include "llpathfindingobjectlist.h"
+
+class LLSD;
+
+class LLPathfindingLinksetList : public LLPathfindingObjectList
+{
+public:
+ LLPathfindingLinksetList();
+ LLPathfindingLinksetList(const LLSD& pLinksetListData);
+ virtual ~LLPathfindingLinksetList();
+
+ LLSD encodeObjectFields(LLPathfindingLinkset::ELinksetUse pLinksetUse, S32 pA, S32 pB, S32 pC, S32 pD) const;
+ LLSD encodeTerrainFields(LLPathfindingLinkset::ELinksetUse pLinksetUse, S32 pA, S32 pB, S32 pC, S32 pD) const;
+
+ bool isShowUnmodifiablePhantomWarning(LLPathfindingLinkset::ELinksetUse pLinksetUse) const;
+ bool isShowCannotBeVolumeWarning(LLPathfindingLinkset::ELinksetUse pLinksetUse) const;
+
+ void determinePossibleStates(BOOL &pCanBeWalkable, BOOL &pCanBeStaticObstacle, BOOL &pCanBeDynamicObstacle,
+ BOOL &pCanBeMaterialVolume, BOOL &pCanBeExclusionVolume, BOOL &pCanBeDynamicPhantom) const;
+
+protected:
+
+private:
+ void parseLinksetListData(const LLSD& pLinksetListData);
+};
+
+#endif // LL_LLPATHFINDINGLINKSETLIST_H
diff --git a/indra/newview/llpathfindingmanager.cpp b/indra/newview/llpathfindingmanager.cpp
new file mode 100644
index 0000000000..2dd01e931e
--- /dev/null
+++ b/indra/newview/llpathfindingmanager.cpp
@@ -0,0 +1,1049 @@
+/**
+* @file llpathfindingmanager.cpp
+* @brief Implementation of llpathfindingmanager
+* @author Stinson@lindenlab.com
+*
+* $LicenseInfo:firstyear=2012&license=viewerlgpl$
+* Second Life Viewer Source Code
+* Copyright (C) 2012, Linden Research, Inc.
+*
+* This library is free software; you can redistribute it and/or
+* modify it under the terms of the GNU Lesser General Public
+* License as published by the Free Software Foundation;
+* version 2.1 of the License only.
+*
+* This library is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this library; if not, write to the Free Software
+* 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 "llpathfindingmanager.h"
+
+#include <string>
+#include <map>
+
+#include <boost/bind.hpp>
+#include <boost/function.hpp>
+#include <boost/shared_ptr.hpp>
+#include <boost/signals2.hpp>
+
+#include "llagent.h"
+#include "llhttpclient.h"
+#include "llhttpnode.h"
+#include "llnotificationsutil.h"
+#include "llpathfindingcharacterlist.h"
+#include "llpathfindinglinkset.h"
+#include "llpathfindinglinksetlist.h"
+#include "llpathfindingnavmesh.h"
+#include "llpathfindingnavmeshstatus.h"
+#include "llpathfindingobject.h"
+#include "llpathinglib.h"
+#include "llsingleton.h"
+#include "llsd.h"
+#include "lltrans.h"
+#include "lluuid.h"
+#include "llviewerregion.h"
+#include "llweb.h"
+
+#define CAP_SERVICE_RETRIEVE_NAVMESH "RetrieveNavMeshSrc"
+
+#define CAP_SERVICE_NAVMESH_STATUS "NavMeshGenerationStatus"
+
+#define CAP_SERVICE_OBJECT_LINKSETS "ObjectNavMeshProperties"
+#define CAP_SERVICE_TERRAIN_LINKSETS "TerrainNavMeshProperties"
+
+#define CAP_SERVICE_CHARACTERS "CharacterProperties"
+
+#define SIM_MESSAGE_NAVMESH_STATUS_UPDATE "/message/NavMeshStatusUpdate"
+#define SIM_MESSAGE_AGENT_STATE_UPDATE "/message/AgentStateUpdate"
+#define SIM_MESSAGE_BODY_FIELD "body"
+
+#define CAP_SERVICE_AGENT_STATE "AgentState"
+
+#define AGENT_STATE_CAN_REBAKE_REGION_FIELD "can_modify_navmesh"
+
+//---------------------------------------------------------------------------
+// LLNavMeshSimStateChangeNode
+//---------------------------------------------------------------------------
+
+class LLNavMeshSimStateChangeNode : public LLHTTPNode
+{
+public:
+ virtual void post(ResponsePtr pResponse, const LLSD &pContext, const LLSD &pInput) const;
+};
+
+LLHTTPRegistration<LLNavMeshSimStateChangeNode> gHTTPRegistrationNavMeshSimStateChangeNode(SIM_MESSAGE_NAVMESH_STATUS_UPDATE);
+
+
+//---------------------------------------------------------------------------
+// LLAgentStateChangeNode
+//---------------------------------------------------------------------------
+class LLAgentStateChangeNode : public LLHTTPNode
+{
+public:
+ virtual void post(ResponsePtr pResponse, const LLSD &pContext, const LLSD &pInput) const;
+};
+
+LLHTTPRegistration<LLAgentStateChangeNode> gHTTPRegistrationAgentStateChangeNode(SIM_MESSAGE_AGENT_STATE_UPDATE);
+
+//---------------------------------------------------------------------------
+// NavMeshStatusResponder
+//---------------------------------------------------------------------------
+
+class NavMeshStatusResponder : public LLHTTPClient::Responder
+{
+public:
+ NavMeshStatusResponder(const std::string &pCapabilityURL, LLViewerRegion *pRegion, bool pIsGetStatusOnly);
+ virtual ~NavMeshStatusResponder();
+
+ virtual void result(const LLSD &pContent);
+ virtual void error(U32 pStatus, const std::string& pReason);
+
+protected:
+
+private:
+ std::string mCapabilityURL;
+ LLViewerRegion *mRegion;
+ LLUUID mRegionUUID;
+ bool mIsGetStatusOnly;
+};
+
+//---------------------------------------------------------------------------
+// NavMeshResponder
+//---------------------------------------------------------------------------
+
+class NavMeshResponder : public LLHTTPClient::Responder
+{
+public:
+ NavMeshResponder(const std::string &pCapabilityURL, U32 pNavMeshVersion, LLPathfindingNavMeshPtr pNavMeshPtr);
+ virtual ~NavMeshResponder();
+
+ virtual void result(const LLSD &pContent);
+ virtual void error(U32 pStatus, const std::string& pReason);
+
+protected:
+
+private:
+ std::string mCapabilityURL;
+ U32 mNavMeshVersion;
+ LLPathfindingNavMeshPtr mNavMeshPtr;
+};
+
+//---------------------------------------------------------------------------
+// AgentStateResponder
+//---------------------------------------------------------------------------
+
+class AgentStateResponder : public LLHTTPClient::Responder
+{
+public:
+ AgentStateResponder(const std::string &pCapabilityURL);
+ virtual ~AgentStateResponder();
+
+ virtual void result(const LLSD &pContent);
+ virtual void error(U32 pStatus, const std::string& pReason);
+
+protected:
+
+private:
+ std::string mCapabilityURL;
+};
+
+
+//---------------------------------------------------------------------------
+// NavMeshRebakeResponder
+//---------------------------------------------------------------------------
+class NavMeshRebakeResponder : public LLHTTPClient::Responder
+{
+public:
+ NavMeshRebakeResponder(const std::string &pCapabilityURL, LLPathfindingManager::rebake_navmesh_callback_t pRebakeNavMeshCallback);
+ virtual ~NavMeshRebakeResponder();
+
+ virtual void result(const LLSD &pContent);
+ virtual void error(U32 pStatus, const std::string& pReason);
+
+protected:
+
+private:
+ std::string mCapabilityURL;
+ LLPathfindingManager::rebake_navmesh_callback_t mRebakeNavMeshCallback;
+};
+
+//---------------------------------------------------------------------------
+// LinksetsResponder
+//---------------------------------------------------------------------------
+
+class LinksetsResponder
+{
+public:
+ LinksetsResponder(LLPathfindingManager::request_id_t pRequestId, LLPathfindingManager::object_request_callback_t pLinksetsCallback, bool pIsObjectRequested, bool pIsTerrainRequested);
+ virtual ~LinksetsResponder();
+
+ void handleObjectLinksetsResult(const LLSD &pContent);
+ void handleObjectLinksetsError(U32 pStatus, const std::string &pReason, const std::string &pURL);
+ void handleTerrainLinksetsResult(const LLSD &pContent);
+ void handleTerrainLinksetsError(U32 pStatus, const std::string &pReason, const std::string &pURL);
+
+protected:
+
+private:
+ void sendCallback();
+
+ typedef enum
+ {
+ kNotRequested,
+ kWaiting,
+ kReceivedGood,
+ kReceivedError
+ } EMessagingState;
+
+ LLPathfindingManager::request_id_t mRequestId;
+ LLPathfindingManager::object_request_callback_t mLinksetsCallback;
+
+ EMessagingState mObjectMessagingState;
+ EMessagingState mTerrainMessagingState;
+
+ LLPathfindingObjectListPtr mObjectLinksetListPtr;
+ LLPathfindingObjectPtr mTerrainLinksetPtr;
+};
+
+typedef boost::shared_ptr<LinksetsResponder> LinksetsResponderPtr;
+
+//---------------------------------------------------------------------------
+// ObjectLinksetsResponder
+//---------------------------------------------------------------------------
+
+class ObjectLinksetsResponder : public LLHTTPClient::Responder
+{
+public:
+ ObjectLinksetsResponder(const std::string &pCapabilityURL, LinksetsResponderPtr pLinksetsResponsderPtr);
+ virtual ~ObjectLinksetsResponder();
+
+ virtual void result(const LLSD &pContent);
+ virtual void error(U32 pStatus, const std::string &pReason);
+
+protected:
+
+private:
+ std::string mCapabilityURL;
+ LinksetsResponderPtr mLinksetsResponsderPtr;
+};
+
+//---------------------------------------------------------------------------
+// TerrainLinksetsResponder
+//---------------------------------------------------------------------------
+
+class TerrainLinksetsResponder : public LLHTTPClient::Responder
+{
+public:
+ TerrainLinksetsResponder(const std::string &pCapabilityURL, LinksetsResponderPtr pLinksetsResponsderPtr);
+ virtual ~TerrainLinksetsResponder();
+
+ virtual void result(const LLSD &pContent);
+ virtual void error(U32 pStatus, const std::string &pReason);
+
+protected:
+
+private:
+ std::string mCapabilityURL;
+ LinksetsResponderPtr mLinksetsResponsderPtr;
+};
+
+//---------------------------------------------------------------------------
+// CharactersResponder
+//---------------------------------------------------------------------------
+
+class CharactersResponder : public LLHTTPClient::Responder
+{
+public:
+ CharactersResponder(const std::string &pCapabilityURL, LLPathfindingManager::request_id_t pRequestId, LLPathfindingManager::object_request_callback_t pCharactersCallback);
+ virtual ~CharactersResponder();
+
+ virtual void result(const LLSD &pContent);
+ virtual void error(U32 pStatus, const std::string &pReason);
+
+protected:
+
+private:
+ std::string mCapabilityURL;
+ LLPathfindingManager::request_id_t mRequestId;
+ LLPathfindingManager::object_request_callback_t mCharactersCallback;
+};
+
+//---------------------------------------------------------------------------
+// LLPathfindingManager
+//---------------------------------------------------------------------------
+
+LLPathfindingManager::LLPathfindingManager()
+ : LLSingleton<LLPathfindingManager>(),
+ mNavMeshMap(),
+ mAgentStateSignal()
+{
+}
+
+LLPathfindingManager::~LLPathfindingManager()
+{
+ quitSystem();
+}
+
+void LLPathfindingManager::initSystem()
+{
+ if (LLPathingLib::getInstance() == NULL)
+ {
+ LLPathingLib::initSystem();
+ }
+}
+
+void LLPathfindingManager::quitSystem()
+{
+ if (LLPathingLib::getInstance() != NULL)
+ {
+ LLPathingLib::quitSystem();
+ }
+}
+
+bool LLPathfindingManager::isPathfindingViewEnabled() const
+{
+ return (LLPathingLib::getInstance() != NULL);
+}
+
+bool LLPathfindingManager::isPathfindingEnabledForCurrentRegion() const
+{
+ return isPathfindingEnabledForRegion(getCurrentRegion());
+}
+
+bool LLPathfindingManager::isPathfindingEnabledForRegion(LLViewerRegion *pRegion) const
+{
+ std::string retrieveNavMeshURL = getRetrieveNavMeshURLForRegion(pRegion);
+ return !retrieveNavMeshURL.empty();
+}
+
+bool LLPathfindingManager::isAllowViewTerrainProperties() const
+{
+ LLViewerRegion* region = getCurrentRegion();
+ return (gAgent.isGodlike() || ((region != NULL) && region->canManageEstate()));
+}
+
+LLPathfindingNavMesh::navmesh_slot_t LLPathfindingManager::registerNavMeshListenerForRegion(LLViewerRegion *pRegion, LLPathfindingNavMesh::navmesh_callback_t pNavMeshCallback)
+{
+ LLPathfindingNavMeshPtr navMeshPtr = getNavMeshForRegion(pRegion);
+ return navMeshPtr->registerNavMeshListener(pNavMeshCallback);
+}
+
+void LLPathfindingManager::requestGetNavMeshForRegion(LLViewerRegion *pRegion, bool pIsGetStatusOnly)
+{
+ LLPathfindingNavMeshPtr navMeshPtr = getNavMeshForRegion(pRegion);
+
+ if (pRegion == NULL)
+ {
+ navMeshPtr->handleNavMeshNotEnabled();
+ }
+ else if (!pRegion->capabilitiesReceived())
+ {
+ navMeshPtr->handleNavMeshWaitForRegionLoad();
+ pRegion->setCapabilitiesReceivedCallback(boost::bind(&LLPathfindingManager::handleDeferredGetNavMeshForRegion, this, _1, pIsGetStatusOnly));
+ }
+ else if (!isPathfindingEnabledForRegion(pRegion))
+ {
+ navMeshPtr->handleNavMeshNotEnabled();
+ }
+ else
+ {
+ std::string navMeshStatusURL = getNavMeshStatusURLForRegion(pRegion);
+ llassert(!navMeshStatusURL.empty());
+ navMeshPtr->handleNavMeshCheckVersion();
+ LLHTTPClient::ResponderPtr navMeshStatusResponder = new NavMeshStatusResponder(navMeshStatusURL, pRegion, pIsGetStatusOnly);
+ LLHTTPClient::get(navMeshStatusURL, navMeshStatusResponder);
+ }
+}
+
+void LLPathfindingManager::requestGetLinksets(request_id_t pRequestId, object_request_callback_t pLinksetsCallback) const
+{
+ LLPathfindingObjectListPtr emptyLinksetListPtr;
+ LLViewerRegion *currentRegion = getCurrentRegion();
+
+ if (currentRegion == NULL)
+ {
+ pLinksetsCallback(pRequestId, kRequestNotEnabled, emptyLinksetListPtr);
+ }
+ else if (!currentRegion->capabilitiesReceived())
+ {
+ pLinksetsCallback(pRequestId, kRequestStarted, emptyLinksetListPtr);
+ currentRegion->setCapabilitiesReceivedCallback(boost::bind(&LLPathfindingManager::handleDeferredGetLinksetsForRegion, this, _1, pRequestId, pLinksetsCallback));
+ }
+ else
+ {
+ std::string objectLinksetsURL = getObjectLinksetsURLForCurrentRegion();
+ std::string terrainLinksetsURL = getTerrainLinksetsURLForCurrentRegion();
+ if (objectLinksetsURL.empty() || terrainLinksetsURL.empty())
+ {
+ pLinksetsCallback(pRequestId, kRequestNotEnabled, emptyLinksetListPtr);
+ }
+ else
+ {
+ pLinksetsCallback(pRequestId, kRequestStarted, emptyLinksetListPtr);
+
+ bool doRequestTerrain = isAllowViewTerrainProperties();
+ LinksetsResponderPtr linksetsResponderPtr(new LinksetsResponder(pRequestId, pLinksetsCallback, true, doRequestTerrain));
+
+ LLHTTPClient::ResponderPtr objectLinksetsResponder = new ObjectLinksetsResponder(objectLinksetsURL, linksetsResponderPtr);
+ LLHTTPClient::get(objectLinksetsURL, objectLinksetsResponder);
+
+ if (doRequestTerrain)
+ {
+ LLHTTPClient::ResponderPtr terrainLinksetsResponder = new TerrainLinksetsResponder(terrainLinksetsURL, linksetsResponderPtr);
+ LLHTTPClient::get(terrainLinksetsURL, terrainLinksetsResponder);
+ }
+ }
+ }
+}
+
+void LLPathfindingManager::requestSetLinksets(request_id_t pRequestId, const LLPathfindingObjectListPtr &pLinksetListPtr, LLPathfindingLinkset::ELinksetUse pLinksetUse, S32 pA, S32 pB, S32 pC, S32 pD, object_request_callback_t pLinksetsCallback) const
+{
+ LLPathfindingObjectListPtr emptyLinksetListPtr;
+
+ std::string objectLinksetsURL = getObjectLinksetsURLForCurrentRegion();
+ std::string terrainLinksetsURL = getTerrainLinksetsURLForCurrentRegion();
+ if (objectLinksetsURL.empty() || terrainLinksetsURL.empty())
+ {
+ pLinksetsCallback(pRequestId, kRequestNotEnabled, emptyLinksetListPtr);
+ }
+ else if ((pLinksetListPtr == NULL) || pLinksetListPtr->isEmpty())
+ {
+ pLinksetsCallback(pRequestId, kRequestCompleted, emptyLinksetListPtr);
+ }
+ else
+ {
+ const LLPathfindingLinksetList *linksetList = dynamic_cast<const LLPathfindingLinksetList *>(pLinksetListPtr.get());
+
+ LLSD objectPostData = linksetList->encodeObjectFields(pLinksetUse, pA, pB, pC, pD);
+ LLSD terrainPostData;
+ if (isAllowViewTerrainProperties())
+ {
+ terrainPostData = linksetList->encodeTerrainFields(pLinksetUse, pA, pB, pC, pD);
+ }
+
+ if (objectPostData.isUndefined() && terrainPostData.isUndefined())
+ {
+ pLinksetsCallback(pRequestId, kRequestCompleted, emptyLinksetListPtr);
+ }
+ else
+ {
+ pLinksetsCallback(pRequestId, kRequestStarted, emptyLinksetListPtr);
+
+ LinksetsResponderPtr linksetsResponderPtr(new LinksetsResponder(pRequestId, pLinksetsCallback, !objectPostData.isUndefined(), !terrainPostData.isUndefined()));
+
+ if (!objectPostData.isUndefined())
+ {
+ LLHTTPClient::ResponderPtr objectLinksetsResponder = new ObjectLinksetsResponder(objectLinksetsURL, linksetsResponderPtr);
+ LLHTTPClient::put(objectLinksetsURL, objectPostData, objectLinksetsResponder);
+ }
+
+ if (!terrainPostData.isUndefined())
+ {
+ LLHTTPClient::ResponderPtr terrainLinksetsResponder = new TerrainLinksetsResponder(terrainLinksetsURL, linksetsResponderPtr);
+ LLHTTPClient::put(terrainLinksetsURL, terrainPostData, terrainLinksetsResponder);
+ }
+ }
+ }
+}
+
+void LLPathfindingManager::requestGetCharacters(request_id_t pRequestId, object_request_callback_t pCharactersCallback) const
+{
+ LLPathfindingObjectListPtr emptyCharacterListPtr;
+
+ LLViewerRegion *currentRegion = getCurrentRegion();
+
+ if (currentRegion == NULL)
+ {
+ pCharactersCallback(pRequestId, kRequestNotEnabled, emptyCharacterListPtr);
+ }
+ else if (!currentRegion->capabilitiesReceived())
+ {
+ pCharactersCallback(pRequestId, kRequestStarted, emptyCharacterListPtr);
+ currentRegion->setCapabilitiesReceivedCallback(boost::bind(&LLPathfindingManager::handleDeferredGetCharactersForRegion, this, _1, pRequestId, pCharactersCallback));
+ }
+ else
+ {
+ std::string charactersURL = getCharactersURLForCurrentRegion();
+ if (charactersURL.empty())
+ {
+ pCharactersCallback(pRequestId, kRequestNotEnabled, emptyCharacterListPtr);
+ }
+ else
+ {
+ pCharactersCallback(pRequestId, kRequestStarted, emptyCharacterListPtr);
+
+ LLHTTPClient::ResponderPtr charactersResponder = new CharactersResponder(charactersURL, pRequestId, pCharactersCallback);
+ LLHTTPClient::get(charactersURL, charactersResponder);
+ }
+ }
+}
+
+LLPathfindingManager::agent_state_slot_t LLPathfindingManager::registerAgentStateListener(agent_state_callback_t pAgentStateCallback)
+{
+ return mAgentStateSignal.connect(pAgentStateCallback);
+}
+
+void LLPathfindingManager::requestGetAgentState()
+{
+ LLViewerRegion *currentRegion = getCurrentRegion();
+
+ if (currentRegion == NULL)
+ {
+ mAgentStateSignal(FALSE);
+ }
+ else
+ {
+ if (!currentRegion->capabilitiesReceived())
+ {
+ currentRegion->setCapabilitiesReceivedCallback(boost::bind(&LLPathfindingManager::handleDeferredGetAgentStateForRegion, this, _1));
+ }
+ else if (!isPathfindingEnabledForRegion(currentRegion))
+ {
+ mAgentStateSignal(FALSE);
+ }
+ else
+ {
+ std::string agentStateURL = getAgentStateURLForRegion(currentRegion);
+ llassert(!agentStateURL.empty());
+ LLHTTPClient::ResponderPtr responder = new AgentStateResponder(agentStateURL);
+ LLHTTPClient::get(agentStateURL, responder);
+ }
+ }
+}
+
+void LLPathfindingManager::requestRebakeNavMesh(rebake_navmesh_callback_t pRebakeNavMeshCallback)
+{
+ LLViewerRegion *currentRegion = getCurrentRegion();
+
+ if (currentRegion == NULL)
+ {
+ pRebakeNavMeshCallback(false);
+ }
+ else if (!isPathfindingEnabledForRegion(currentRegion))
+ {
+ pRebakeNavMeshCallback(false);
+ }
+ else
+ {
+ std::string navMeshStatusURL = getNavMeshStatusURLForCurrentRegion();
+ llassert(!navMeshStatusURL.empty());
+ LLSD postData;
+ postData["command"] = "rebuild";
+ LLHTTPClient::ResponderPtr responder = new NavMeshRebakeResponder(navMeshStatusURL, pRebakeNavMeshCallback);
+ LLHTTPClient::post(navMeshStatusURL, postData, responder);
+ }
+}
+
+void LLPathfindingManager::sendRequestGetNavMeshForRegion(LLPathfindingNavMeshPtr navMeshPtr, LLViewerRegion *pRegion, const LLPathfindingNavMeshStatus &pNavMeshStatus)
+{
+ if ((pRegion == NULL) || !pRegion->isAlive())
+ {
+ navMeshPtr->handleNavMeshNotEnabled();
+ }
+ else
+ {
+ std::string navMeshURL = getRetrieveNavMeshURLForRegion(pRegion);
+
+ if (navMeshURL.empty())
+ {
+ navMeshPtr->handleNavMeshNotEnabled();
+ }
+ else
+ {
+ navMeshPtr->handleNavMeshStart(pNavMeshStatus);
+ LLHTTPClient::ResponderPtr responder = new NavMeshResponder(navMeshURL, pNavMeshStatus.getVersion(), navMeshPtr);
+
+ LLSD postData;
+ LLHTTPClient::post(navMeshURL, postData, responder);
+ }
+ }
+}
+
+void LLPathfindingManager::handleDeferredGetAgentStateForRegion(const LLUUID &pRegionUUID)
+{
+ LLViewerRegion *currentRegion = getCurrentRegion();
+
+ if ((currentRegion != NULL) && (currentRegion->getRegionID() == pRegionUUID))
+ {
+ requestGetAgentState();
+ }
+}
+
+void LLPathfindingManager::handleDeferredGetNavMeshForRegion(const LLUUID &pRegionUUID, bool pIsGetStatusOnly)
+{
+ LLViewerRegion *currentRegion = getCurrentRegion();
+
+ if ((currentRegion != NULL) && (currentRegion->getRegionID() == pRegionUUID))
+ {
+ requestGetNavMeshForRegion(currentRegion, pIsGetStatusOnly);
+ }
+}
+
+void LLPathfindingManager::handleDeferredGetLinksetsForRegion(const LLUUID &pRegionUUID, request_id_t pRequestId, object_request_callback_t pLinksetsCallback) const
+{
+ LLViewerRegion *currentRegion = getCurrentRegion();
+
+ if ((currentRegion != NULL) && (currentRegion->getRegionID() == pRegionUUID))
+ {
+ requestGetLinksets(pRequestId, pLinksetsCallback);
+ }
+}
+
+void LLPathfindingManager::handleDeferredGetCharactersForRegion(const LLUUID &pRegionUUID, request_id_t pRequestId, object_request_callback_t pCharactersCallback) const
+{
+ LLViewerRegion *currentRegion = getCurrentRegion();
+
+ if ((currentRegion != NULL) && (currentRegion->getRegionID() == pRegionUUID))
+ {
+ requestGetCharacters(pRequestId, pCharactersCallback);
+ }
+}
+
+void LLPathfindingManager::handleNavMeshStatusRequest(const LLPathfindingNavMeshStatus &pNavMeshStatus, LLViewerRegion *pRegion, bool pIsGetStatusOnly)
+{
+ LLPathfindingNavMeshPtr navMeshPtr = getNavMeshForRegion(pNavMeshStatus.getRegionUUID());
+
+ if (!pNavMeshStatus.isValid())
+ {
+ navMeshPtr->handleNavMeshError();
+ }
+ else
+ {
+ if (navMeshPtr->hasNavMeshVersion(pNavMeshStatus))
+ {
+ navMeshPtr->handleRefresh(pNavMeshStatus);
+ }
+ else if (pIsGetStatusOnly)
+ {
+ navMeshPtr->handleNavMeshNewVersion(pNavMeshStatus);
+ }
+ else
+ {
+ sendRequestGetNavMeshForRegion(navMeshPtr, pRegion, pNavMeshStatus);
+ }
+ }
+}
+
+void LLPathfindingManager::handleNavMeshStatusUpdate(const LLPathfindingNavMeshStatus &pNavMeshStatus)
+{
+ LLPathfindingNavMeshPtr navMeshPtr = getNavMeshForRegion(pNavMeshStatus.getRegionUUID());
+
+ if (!pNavMeshStatus.isValid())
+ {
+ navMeshPtr->handleNavMeshError();
+ }
+ else
+ {
+ navMeshPtr->handleNavMeshNewVersion(pNavMeshStatus);
+ }
+}
+
+void LLPathfindingManager::handleAgentState(BOOL pCanRebakeRegion)
+{
+ mAgentStateSignal(pCanRebakeRegion);
+}
+
+LLPathfindingNavMeshPtr LLPathfindingManager::getNavMeshForRegion(const LLUUID &pRegionUUID)
+{
+ LLPathfindingNavMeshPtr navMeshPtr;
+ NavMeshMap::iterator navMeshIter = mNavMeshMap.find(pRegionUUID);
+ if (navMeshIter == mNavMeshMap.end())
+ {
+ navMeshPtr = LLPathfindingNavMeshPtr(new LLPathfindingNavMesh(pRegionUUID));
+ mNavMeshMap.insert(std::pair<LLUUID, LLPathfindingNavMeshPtr>(pRegionUUID, navMeshPtr));
+ }
+ else
+ {
+ navMeshPtr = navMeshIter->second;
+ }
+
+ return navMeshPtr;
+}
+
+LLPathfindingNavMeshPtr LLPathfindingManager::getNavMeshForRegion(LLViewerRegion *pRegion)
+{
+ LLUUID regionUUID;
+ if (pRegion != NULL)
+ {
+ regionUUID = pRegion->getRegionID();
+ }
+
+ return getNavMeshForRegion(regionUUID);
+}
+
+std::string LLPathfindingManager::getNavMeshStatusURLForCurrentRegion() const
+{
+ return getNavMeshStatusURLForRegion(getCurrentRegion());
+}
+
+std::string LLPathfindingManager::getNavMeshStatusURLForRegion(LLViewerRegion *pRegion) const
+{
+ return getCapabilityURLForRegion(pRegion, CAP_SERVICE_NAVMESH_STATUS);
+}
+
+std::string LLPathfindingManager::getRetrieveNavMeshURLForRegion(LLViewerRegion *pRegion) const
+{
+ return getCapabilityURLForRegion(pRegion, CAP_SERVICE_RETRIEVE_NAVMESH);
+}
+
+std::string LLPathfindingManager::getObjectLinksetsURLForCurrentRegion() const
+{
+ return getCapabilityURLForCurrentRegion(CAP_SERVICE_OBJECT_LINKSETS);
+}
+
+std::string LLPathfindingManager::getTerrainLinksetsURLForCurrentRegion() const
+{
+ return getCapabilityURLForCurrentRegion(CAP_SERVICE_TERRAIN_LINKSETS);
+}
+
+std::string LLPathfindingManager::getCharactersURLForCurrentRegion() const
+{
+ return getCapabilityURLForCurrentRegion(CAP_SERVICE_CHARACTERS);
+}
+
+std::string LLPathfindingManager::getAgentStateURLForRegion(LLViewerRegion *pRegion) const
+{
+ return getCapabilityURLForRegion(pRegion, CAP_SERVICE_AGENT_STATE);
+}
+
+std::string LLPathfindingManager::getCapabilityURLForCurrentRegion(const std::string &pCapabilityName) const
+{
+ return getCapabilityURLForRegion(getCurrentRegion(), pCapabilityName);
+}
+
+std::string LLPathfindingManager::getCapabilityURLForRegion(LLViewerRegion *pRegion, const std::string &pCapabilityName) const
+{
+ std::string capabilityURL("");
+
+ if (pRegion != NULL)
+ {
+ capabilityURL = pRegion->getCapability(pCapabilityName);
+ }
+
+ if (capabilityURL.empty())
+ {
+ llwarns << "cannot find capability '" << pCapabilityName << "' for current region '"
+ << ((pRegion != NULL) ? pRegion->getName() : "<null>") << "'" << llendl;
+ }
+
+ return capabilityURL;
+}
+
+LLViewerRegion *LLPathfindingManager::getCurrentRegion() const
+{
+ return gAgent.getRegion();
+}
+
+//---------------------------------------------------------------------------
+// LLNavMeshSimStateChangeNode
+//---------------------------------------------------------------------------
+
+void LLNavMeshSimStateChangeNode::post(ResponsePtr pResponse, const LLSD &pContext, const LLSD &pInput) const
+{
+ llassert(pInput.has(SIM_MESSAGE_BODY_FIELD));
+ llassert(pInput.get(SIM_MESSAGE_BODY_FIELD).isMap());
+ LLPathfindingNavMeshStatus navMeshStatus(pInput.get(SIM_MESSAGE_BODY_FIELD));
+ LLPathfindingManager::getInstance()->handleNavMeshStatusUpdate(navMeshStatus);
+}
+
+//---------------------------------------------------------------------------
+// LLAgentStateChangeNode
+//---------------------------------------------------------------------------
+
+void LLAgentStateChangeNode::post(ResponsePtr pResponse, const LLSD &pContext, const LLSD &pInput) const
+{
+ llassert(pInput.has(SIM_MESSAGE_BODY_FIELD));
+ llassert(pInput.get(SIM_MESSAGE_BODY_FIELD).isMap());
+ llassert(pInput.get(SIM_MESSAGE_BODY_FIELD).has(AGENT_STATE_CAN_REBAKE_REGION_FIELD));
+ llassert(pInput.get(SIM_MESSAGE_BODY_FIELD).get(AGENT_STATE_CAN_REBAKE_REGION_FIELD).isBoolean());
+ BOOL canRebakeRegion = pInput.get(SIM_MESSAGE_BODY_FIELD).get(AGENT_STATE_CAN_REBAKE_REGION_FIELD).asBoolean();
+
+ LLPathfindingManager::getInstance()->handleAgentState(canRebakeRegion);
+}
+
+//---------------------------------------------------------------------------
+// NavMeshStatusResponder
+//---------------------------------------------------------------------------
+
+NavMeshStatusResponder::NavMeshStatusResponder(const std::string &pCapabilityURL, LLViewerRegion *pRegion, bool pIsGetStatusOnly)
+ : LLHTTPClient::Responder(),
+ mCapabilityURL(pCapabilityURL),
+ mRegion(pRegion),
+ mRegionUUID(),
+ mIsGetStatusOnly(pIsGetStatusOnly)
+{
+ if (mRegion != NULL)
+ {
+ mRegionUUID = mRegion->getRegionID();
+ }
+}
+
+NavMeshStatusResponder::~NavMeshStatusResponder()
+{
+}
+
+void NavMeshStatusResponder::result(const LLSD &pContent)
+{
+ LLPathfindingNavMeshStatus navMeshStatus(mRegionUUID, pContent);
+ LLPathfindingManager::getInstance()->handleNavMeshStatusRequest(navMeshStatus, mRegion, mIsGetStatusOnly);
+}
+
+void NavMeshStatusResponder::error(U32 pStatus, const std::string& pReason)
+{
+ llwarns << "error with request to URL '" << mCapabilityURL << "' because " << pReason << " (statusCode:" << pStatus << ")" << llendl;
+ LLPathfindingNavMeshStatus navMeshStatus(mRegionUUID);
+ LLPathfindingManager::getInstance()->handleNavMeshStatusRequest(navMeshStatus, mRegion, mIsGetStatusOnly);
+}
+
+//---------------------------------------------------------------------------
+// NavMeshResponder
+//---------------------------------------------------------------------------
+
+NavMeshResponder::NavMeshResponder(const std::string &pCapabilityURL, U32 pNavMeshVersion, LLPathfindingNavMeshPtr pNavMeshPtr)
+ : LLHTTPClient::Responder(),
+ mCapabilityURL(pCapabilityURL),
+ mNavMeshVersion(pNavMeshVersion),
+ mNavMeshPtr(pNavMeshPtr)
+{
+}
+
+NavMeshResponder::~NavMeshResponder()
+{
+}
+
+void NavMeshResponder::result(const LLSD &pContent)
+{
+ mNavMeshPtr->handleNavMeshResult(pContent, mNavMeshVersion);
+}
+
+void NavMeshResponder::error(U32 pStatus, const std::string& pReason)
+{
+ mNavMeshPtr->handleNavMeshError(pStatus, pReason, mCapabilityURL, mNavMeshVersion);
+}
+
+//---------------------------------------------------------------------------
+// AgentStateResponder
+//---------------------------------------------------------------------------
+
+AgentStateResponder::AgentStateResponder(const std::string &pCapabilityURL)
+: LLHTTPClient::Responder()
+, mCapabilityURL(pCapabilityURL)
+{
+}
+
+AgentStateResponder::~AgentStateResponder()
+{
+}
+
+void AgentStateResponder::result(const LLSD &pContent)
+{
+ llassert(pContent.has(AGENT_STATE_CAN_REBAKE_REGION_FIELD));
+ llassert(pContent.get(AGENT_STATE_CAN_REBAKE_REGION_FIELD).isBoolean());
+ BOOL canRebakeRegion = pContent.get(AGENT_STATE_CAN_REBAKE_REGION_FIELD).asBoolean();
+ LLPathfindingManager::getInstance()->handleAgentState(canRebakeRegion);
+}
+
+void AgentStateResponder::error(U32 pStatus, const std::string &pReason)
+{
+ llwarns << "error with request to URL '" << mCapabilityURL << "' because " << pReason << " (statusCode:" << pStatus << ")" << llendl;
+ LLPathfindingManager::getInstance()->handleAgentState(FALSE);
+}
+
+
+//---------------------------------------------------------------------------
+// navmesh rebake responder
+//---------------------------------------------------------------------------
+NavMeshRebakeResponder::NavMeshRebakeResponder(const std::string &pCapabilityURL, LLPathfindingManager::rebake_navmesh_callback_t pRebakeNavMeshCallback)
+ : LLHTTPClient::Responder(),
+ mCapabilityURL(pCapabilityURL),
+ mRebakeNavMeshCallback(pRebakeNavMeshCallback)
+{
+}
+
+NavMeshRebakeResponder::~NavMeshRebakeResponder()
+{
+}
+
+void NavMeshRebakeResponder::result(const LLSD &pContent)
+{
+ mRebakeNavMeshCallback(true);
+}
+
+void NavMeshRebakeResponder::error(U32 pStatus, const std::string &pReason)
+{
+ llwarns << "error with request to URL '" << mCapabilityURL << "' because " << pReason << " (statusCode:" << pStatus << ")" << llendl;
+ mRebakeNavMeshCallback(false);
+}
+
+//---------------------------------------------------------------------------
+// LinksetsResponder
+//---------------------------------------------------------------------------
+
+LinksetsResponder::LinksetsResponder(LLPathfindingManager::request_id_t pRequestId, LLPathfindingManager::object_request_callback_t pLinksetsCallback, bool pIsObjectRequested, bool pIsTerrainRequested)
+ : mRequestId(pRequestId),
+ mLinksetsCallback(pLinksetsCallback),
+ mObjectMessagingState(pIsObjectRequested ? kWaiting : kNotRequested),
+ mTerrainMessagingState(pIsTerrainRequested ? kWaiting : kNotRequested),
+ mObjectLinksetListPtr(),
+ mTerrainLinksetPtr()
+{
+}
+
+LinksetsResponder::~LinksetsResponder()
+{
+}
+
+void LinksetsResponder::handleObjectLinksetsResult(const LLSD &pContent)
+{
+ mObjectLinksetListPtr = LLPathfindingObjectListPtr(new LLPathfindingLinksetList(pContent));
+
+ mObjectMessagingState = kReceivedGood;
+ if (mTerrainMessagingState != kWaiting)
+ {
+ sendCallback();
+ }
+}
+
+void LinksetsResponder::handleObjectLinksetsError(U32 pStatus, const std::string &pReason, const std::string &pURL)
+{
+ llwarns << "error with request to URL '" << pURL << "' because " << pReason << " (statusCode:" << pStatus << ")" << llendl;
+ mObjectMessagingState = kReceivedError;
+ if (mTerrainMessagingState != kWaiting)
+ {
+ sendCallback();
+ }
+}
+
+void LinksetsResponder::handleTerrainLinksetsResult(const LLSD &pContent)
+{
+ mTerrainLinksetPtr = LLPathfindingObjectPtr(new LLPathfindingLinkset(pContent));
+
+ mTerrainMessagingState = kReceivedGood;
+ if (mObjectMessagingState != kWaiting)
+ {
+ sendCallback();
+ }
+}
+
+void LinksetsResponder::handleTerrainLinksetsError(U32 pStatus, const std::string &pReason, const std::string &pURL)
+{
+ mTerrainMessagingState = kReceivedError;
+ if (mObjectMessagingState != kWaiting)
+ {
+ sendCallback();
+ }
+}
+
+void LinksetsResponder::sendCallback()
+{
+ llassert(mObjectMessagingState != kWaiting);
+ llassert(mTerrainMessagingState != kWaiting);
+ LLPathfindingManager::ERequestStatus requestStatus =
+ ((((mObjectMessagingState == kReceivedGood) || (mObjectMessagingState == kNotRequested)) &&
+ ((mTerrainMessagingState == kReceivedGood) || (mTerrainMessagingState == kNotRequested))) ?
+ LLPathfindingManager::kRequestCompleted : LLPathfindingManager::kRequestError);
+
+ if (mObjectMessagingState != kReceivedGood)
+ {
+ mObjectLinksetListPtr = LLPathfindingObjectListPtr(new LLPathfindingLinksetList());
+ }
+
+ if (mTerrainMessagingState == kReceivedGood)
+ {
+ mObjectLinksetListPtr->update(mTerrainLinksetPtr);
+ }
+
+ mLinksetsCallback(mRequestId, requestStatus, mObjectLinksetListPtr);
+}
+
+//---------------------------------------------------------------------------
+// ObjectLinksetsResponder
+//---------------------------------------------------------------------------
+
+ObjectLinksetsResponder::ObjectLinksetsResponder(const std::string &pCapabilityURL, LinksetsResponderPtr pLinksetsResponsderPtr)
+ : LLHTTPClient::Responder(),
+ mCapabilityURL(pCapabilityURL),
+ mLinksetsResponsderPtr(pLinksetsResponsderPtr)
+{
+}
+
+ObjectLinksetsResponder::~ObjectLinksetsResponder()
+{
+}
+
+void ObjectLinksetsResponder::result(const LLSD &pContent)
+{
+ mLinksetsResponsderPtr->handleObjectLinksetsResult(pContent);
+}
+
+void ObjectLinksetsResponder::error(U32 pStatus, const std::string &pReason)
+{
+ mLinksetsResponsderPtr->handleObjectLinksetsError(pStatus, pReason, mCapabilityURL);
+}
+
+//---------------------------------------------------------------------------
+// TerrainLinksetsResponder
+//---------------------------------------------------------------------------
+
+TerrainLinksetsResponder::TerrainLinksetsResponder(const std::string &pCapabilityURL, LinksetsResponderPtr pLinksetsResponsderPtr)
+ : LLHTTPClient::Responder(),
+ mCapabilityURL(pCapabilityURL),
+ mLinksetsResponsderPtr(pLinksetsResponsderPtr)
+{
+}
+
+TerrainLinksetsResponder::~TerrainLinksetsResponder()
+{
+}
+
+void TerrainLinksetsResponder::result(const LLSD &pContent)
+{
+ mLinksetsResponsderPtr->handleTerrainLinksetsResult(pContent);
+}
+
+void TerrainLinksetsResponder::error(U32 pStatus, const std::string &pReason)
+{
+ mLinksetsResponsderPtr->handleTerrainLinksetsError(pStatus, pReason, mCapabilityURL);
+}
+
+//---------------------------------------------------------------------------
+// CharactersResponder
+//---------------------------------------------------------------------------
+
+CharactersResponder::CharactersResponder(const std::string &pCapabilityURL, LLPathfindingManager::request_id_t pRequestId, LLPathfindingManager::object_request_callback_t pCharactersCallback)
+ : LLHTTPClient::Responder(),
+ mCapabilityURL(pCapabilityURL),
+ mRequestId(pRequestId),
+ mCharactersCallback(pCharactersCallback)
+{
+}
+
+CharactersResponder::~CharactersResponder()
+{
+}
+
+void CharactersResponder::result(const LLSD &pContent)
+{
+ LLPathfindingObjectListPtr characterListPtr = LLPathfindingObjectListPtr(new LLPathfindingCharacterList(pContent));
+ mCharactersCallback(mRequestId, LLPathfindingManager::kRequestCompleted, characterListPtr);
+}
+
+void CharactersResponder::error(U32 pStatus, const std::string &pReason)
+{
+ llwarns << "error with request to URL '" << mCapabilityURL << "' because " << pReason << " (statusCode:" << pStatus << ")" << llendl;
+
+ LLPathfindingObjectListPtr characterListPtr = LLPathfindingObjectListPtr(new LLPathfindingCharacterList());
+ mCharactersCallback(mRequestId, LLPathfindingManager::kRequestError, characterListPtr);
+}
diff --git a/indra/newview/llpathfindingmanager.h b/indra/newview/llpathfindingmanager.h
new file mode 100644
index 0000000000..c61ff244fc
--- /dev/null
+++ b/indra/newview/llpathfindingmanager.h
@@ -0,0 +1,127 @@
+/**
+* @file llpathfindingmanager.h
+* @brief Header file for llpathfindingmanager
+* @author Stinson@lindenlab.com
+*
+* $LicenseInfo:firstyear=2012&license=viewerlgpl$
+* Second Life Viewer Source Code
+* Copyright (C) 2012, Linden Research, Inc.
+*
+* This library is free software; you can redistribute it and/or
+* modify it under the terms of the GNU Lesser General Public
+* License as published by the Free Software Foundation;
+* version 2.1 of the License only.
+*
+* This library is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this library; if not, write to the Free Software
+* 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_LLPATHFINDINGMANAGER_H
+#define LL_LLPATHFINDINGMANAGER_H
+
+#include <string>
+#include <map>
+
+#include <boost/function.hpp>
+#include <boost/signals2.hpp>
+
+#include "llpathfindinglinkset.h"
+#include "llpathfindingobjectlist.h"
+#include "llpathfindingnavmesh.h"
+#include "llsingleton.h"
+
+class LLPathfindingNavMeshStatus;
+class LLUUID;
+class LLViewerRegion;
+
+class LLPathfindingManager : public LLSingleton<LLPathfindingManager>
+{
+ friend class LLNavMeshSimStateChangeNode;
+ friend class NavMeshStatusResponder;
+ friend class LLAgentStateChangeNode;
+ friend class AgentStateResponder;
+public:
+ typedef enum {
+ kRequestStarted,
+ kRequestCompleted,
+ kRequestNotEnabled,
+ kRequestError
+ } ERequestStatus;
+
+ LLPathfindingManager();
+ virtual ~LLPathfindingManager();
+
+ void initSystem();
+ void quitSystem();
+
+ bool isPathfindingViewEnabled() const;
+ bool isPathfindingEnabledForCurrentRegion() const;
+ bool isPathfindingEnabledForRegion(LLViewerRegion *pRegion) const;
+
+ bool isAllowViewTerrainProperties() const;
+
+ LLPathfindingNavMesh::navmesh_slot_t registerNavMeshListenerForRegion(LLViewerRegion *pRegion, LLPathfindingNavMesh::navmesh_callback_t pNavMeshCallback);
+ void requestGetNavMeshForRegion(LLViewerRegion *pRegion, bool pIsGetStatusOnly);
+
+ typedef U32 request_id_t;
+ typedef boost::function<void (request_id_t, ERequestStatus, LLPathfindingObjectListPtr)> object_request_callback_t;
+
+ void requestGetLinksets(request_id_t pRequestId, object_request_callback_t pLinksetsCallback) const;
+ void requestSetLinksets(request_id_t pRequestId, const LLPathfindingObjectListPtr &pLinksetListPtr, LLPathfindingLinkset::ELinksetUse pLinksetUse, S32 pA, S32 pB, S32 pC, S32 pD, object_request_callback_t pLinksetsCallback) const;
+
+ void requestGetCharacters(request_id_t pRequestId, object_request_callback_t pCharactersCallback) const;
+
+ typedef boost::function<void (BOOL)> agent_state_callback_t;
+ typedef boost::signals2::signal<void (BOOL)> agent_state_signal_t;
+ typedef boost::signals2::connection agent_state_slot_t;
+
+ agent_state_slot_t registerAgentStateListener(agent_state_callback_t pAgentStateCallback);
+ void requestGetAgentState();
+
+ typedef boost::function<void (bool)> rebake_navmesh_callback_t;
+ void requestRebakeNavMesh(rebake_navmesh_callback_t pRebakeNavMeshCallback);
+
+protected:
+
+private:
+ typedef std::map<LLUUID, LLPathfindingNavMeshPtr> NavMeshMap;
+
+ void sendRequestGetNavMeshForRegion(LLPathfindingNavMeshPtr navMeshPtr, LLViewerRegion *pRegion, const LLPathfindingNavMeshStatus &pNavMeshStatus);
+
+ void handleDeferredGetAgentStateForRegion(const LLUUID &pRegionUUID);
+ void handleDeferredGetNavMeshForRegion(const LLUUID &pRegionUUID, bool pIsGetStatusOnly);
+ void handleDeferredGetLinksetsForRegion(const LLUUID &pRegionUUID, request_id_t pRequestId, object_request_callback_t pLinksetsCallback) const;
+ void handleDeferredGetCharactersForRegion(const LLUUID &pRegionUUID, request_id_t pRequestId, object_request_callback_t pCharactersCallback) const;
+
+ void handleNavMeshStatusRequest(const LLPathfindingNavMeshStatus &pNavMeshStatus, LLViewerRegion *pRegion, bool pIsGetStatusOnly);
+ void handleNavMeshStatusUpdate(const LLPathfindingNavMeshStatus &pNavMeshStatus);
+
+ void handleAgentState(BOOL pCanRebakeRegion);
+
+ LLPathfindingNavMeshPtr getNavMeshForRegion(const LLUUID &pRegionUUID);
+ LLPathfindingNavMeshPtr getNavMeshForRegion(LLViewerRegion *pRegion);
+
+ std::string getNavMeshStatusURLForCurrentRegion() const;
+ std::string getNavMeshStatusURLForRegion(LLViewerRegion *pRegion) const;
+ std::string getRetrieveNavMeshURLForRegion(LLViewerRegion *pRegion) const;
+ std::string getObjectLinksetsURLForCurrentRegion() const;
+ std::string getTerrainLinksetsURLForCurrentRegion() const;
+ std::string getCharactersURLForCurrentRegion() const;
+ std::string getAgentStateURLForRegion(LLViewerRegion *pRegion) const;
+ std::string getCapabilityURLForCurrentRegion(const std::string &pCapabilityName) const;
+ std::string getCapabilityURLForRegion(LLViewerRegion *pRegion, const std::string &pCapabilityName) const;
+ LLViewerRegion *getCurrentRegion() const;
+
+ NavMeshMap mNavMeshMap;
+ agent_state_signal_t mAgentStateSignal;
+};
+
+#endif // LL_LLPATHFINDINGMANAGER_H
diff --git a/indra/newview/llpathfindingnavmesh.cpp b/indra/newview/llpathfindingnavmesh.cpp
new file mode 100644
index 0000000000..e01dd3a152
--- /dev/null
+++ b/indra/newview/llpathfindingnavmesh.cpp
@@ -0,0 +1,205 @@
+/**
+* @file llpathfindingnavmesh.cpp
+* @brief Implementation of llpathfindingnavmesh
+* @author Stinson@lindenlab.com
+*
+* $LicenseInfo:firstyear=2012&license=viewerlgpl$
+* Second Life Viewer Source Code
+* Copyright (C) 2012, Linden Research, Inc.
+*
+* This library is free software; you can redistribute it and/or
+* modify it under the terms of the GNU Lesser General Public
+* License as published by the Free Software Foundation;
+* version 2.1 of the License only.
+*
+* This library is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this library; if not, write to the Free Software
+* 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 "llpathfindingnavmesh.h"
+
+#include <string>
+
+#include "llpathfindingnavmeshstatus.h"
+#include "llsd.h"
+#include "llsdserialize.h"
+#include "lluuid.h"
+
+#define NAVMESH_VERSION_FIELD "navmesh_version"
+#define NAVMESH_DATA_FIELD "navmesh_data"
+
+//---------------------------------------------------------------------------
+// LLPathfindingNavMesh
+//---------------------------------------------------------------------------
+
+LLPathfindingNavMesh::LLPathfindingNavMesh(const LLUUID &pRegionUUID)
+ : mNavMeshStatus(pRegionUUID),
+ mNavMeshRequestStatus(kNavMeshRequestUnknown),
+ mNavMeshSignal(),
+ mNavMeshData()
+
+{
+}
+
+LLPathfindingNavMesh::~LLPathfindingNavMesh()
+{
+}
+
+LLPathfindingNavMesh::navmesh_slot_t LLPathfindingNavMesh::registerNavMeshListener(navmesh_callback_t pNavMeshCallback)
+{
+ return mNavMeshSignal.connect(pNavMeshCallback);
+}
+
+bool LLPathfindingNavMesh::hasNavMeshVersion(const LLPathfindingNavMeshStatus &pNavMeshStatus) const
+{
+ return ((mNavMeshStatus.getVersion() == pNavMeshStatus.getVersion()) &&
+ ((mNavMeshRequestStatus == kNavMeshRequestStarted) || (mNavMeshRequestStatus == kNavMeshRequestCompleted) ||
+ ((mNavMeshRequestStatus == kNavMeshRequestChecking) && !mNavMeshData.empty())));
+}
+
+void LLPathfindingNavMesh::handleNavMeshWaitForRegionLoad()
+{
+ setRequestStatus(kNavMeshRequestWaiting);
+}
+
+void LLPathfindingNavMesh::handleNavMeshCheckVersion()
+{
+ setRequestStatus(kNavMeshRequestChecking);
+}
+
+void LLPathfindingNavMesh::handleRefresh(const LLPathfindingNavMeshStatus &pNavMeshStatus)
+{
+ llassert(mNavMeshStatus.getRegionUUID() == pNavMeshStatus.getRegionUUID());
+ llassert(mNavMeshStatus.getVersion() == pNavMeshStatus.getVersion());
+ mNavMeshStatus = pNavMeshStatus;
+ if (mNavMeshRequestStatus == kNavMeshRequestChecking)
+ {
+ llassert(!mNavMeshData.empty());
+ setRequestStatus(kNavMeshRequestCompleted);
+ }
+ else
+ {
+ sendStatus();
+ }
+}
+
+void LLPathfindingNavMesh::handleNavMeshNewVersion(const LLPathfindingNavMeshStatus &pNavMeshStatus)
+{
+ llassert(mNavMeshStatus.getRegionUUID() == pNavMeshStatus.getRegionUUID());
+ if (mNavMeshStatus.getVersion() == pNavMeshStatus.getVersion())
+ {
+ mNavMeshStatus = pNavMeshStatus;
+ sendStatus();
+ }
+ else
+ {
+ mNavMeshData.clear();
+ mNavMeshStatus = pNavMeshStatus;
+ setRequestStatus(kNavMeshRequestNeedsUpdate);
+ }
+}
+
+void LLPathfindingNavMesh::handleNavMeshStart(const LLPathfindingNavMeshStatus &pNavMeshStatus)
+{
+ llassert(mNavMeshStatus.getRegionUUID() == pNavMeshStatus.getRegionUUID());
+ mNavMeshStatus = pNavMeshStatus;
+ setRequestStatus(kNavMeshRequestStarted);
+}
+
+void LLPathfindingNavMesh::handleNavMeshResult(const LLSD &pContent, U32 pNavMeshVersion)
+{
+ llassert(pContent.has(NAVMESH_VERSION_FIELD));
+ if (pContent.has(NAVMESH_VERSION_FIELD))
+ {
+ llassert(pContent.get(NAVMESH_VERSION_FIELD).isInteger());
+ llassert(pContent.get(NAVMESH_VERSION_FIELD).asInteger() >= 0);
+ U32 embeddedNavMeshVersion = static_cast<U32>(pContent.get(NAVMESH_VERSION_FIELD).asInteger());
+ llassert(embeddedNavMeshVersion == pNavMeshVersion); // stinson 03/13/2012 : does this ever occur?
+ if (embeddedNavMeshVersion != pNavMeshVersion)
+ {
+ llwarns << "Mismatch between expected and embedded navmesh versions occurred" << llendl;
+ pNavMeshVersion = embeddedNavMeshVersion;
+ }
+ }
+
+ if (mNavMeshStatus.getVersion() == pNavMeshVersion)
+ {
+ ENavMeshRequestStatus status;
+ if ( pContent.has(NAVMESH_DATA_FIELD) )
+ {
+ const LLSD::Binary &value = pContent.get(NAVMESH_DATA_FIELD).asBinary();
+ unsigned int binSize = value.size();
+ std::string newStr(reinterpret_cast<const char *>(&value[0]), binSize);
+ std::istringstream streamdecomp( newStr );
+ unsigned int decompBinSize = 0;
+ bool valid = false;
+ U8* pUncompressedNavMeshContainer = unzip_llsdNavMesh( valid, decompBinSize, streamdecomp, binSize ) ;
+ if ( !valid )
+ {
+ llwarns << "Unable to decompress the navmesh llsd." << llendl;
+ status = kNavMeshRequestError;
+ }
+ else
+ {
+ llassert(pUncompressedNavMeshContainer);
+ mNavMeshData.resize( decompBinSize );
+ memcpy( &mNavMeshData[0], &pUncompressedNavMeshContainer[0], decompBinSize );
+ status = kNavMeshRequestCompleted;
+ }
+ if ( pUncompressedNavMeshContainer )
+ {
+ free( pUncompressedNavMeshContainer );
+ }
+ }
+ else
+ {
+ llwarns << "No mesh data received" << llendl;
+ status = kNavMeshRequestError;
+ }
+ setRequestStatus(status);
+ }
+}
+
+void LLPathfindingNavMesh::handleNavMeshNotEnabled()
+{
+ mNavMeshData.clear();
+ setRequestStatus(kNavMeshRequestNotEnabled);
+}
+
+void LLPathfindingNavMesh::handleNavMeshError()
+{
+ mNavMeshData.clear();
+ setRequestStatus(kNavMeshRequestError);
+}
+
+void LLPathfindingNavMesh::handleNavMeshError(U32 pStatus, const std::string &pReason, const std::string &pURL, U32 pNavMeshVersion)
+{
+ llwarns << "error with request to URL '" << pURL << "' because " << pReason << " (statusCode:" << pStatus << ")" << llendl;
+ if (mNavMeshStatus.getVersion() == pNavMeshVersion)
+ {
+ handleNavMeshError();
+ }
+}
+
+void LLPathfindingNavMesh::setRequestStatus(ENavMeshRequestStatus pNavMeshRequestStatus)
+{
+ mNavMeshRequestStatus = pNavMeshRequestStatus;
+ sendStatus();
+}
+
+void LLPathfindingNavMesh::sendStatus()
+{
+ mNavMeshSignal(mNavMeshRequestStatus, mNavMeshStatus, mNavMeshData);
+}
diff --git a/indra/newview/llpathfindingnavmesh.h b/indra/newview/llpathfindingnavmesh.h
new file mode 100644
index 0000000000..7a844f54ce
--- /dev/null
+++ b/indra/newview/llpathfindingnavmesh.h
@@ -0,0 +1,91 @@
+/**
+* @file llpathfindingnavmesh.h
+* @brief Header file for llpathfindingnavmesh
+* @author Stinson@lindenlab.com
+*
+* $LicenseInfo:firstyear=2012&license=viewerlgpl$
+* Second Life Viewer Source Code
+* Copyright (C) 2012, Linden Research, Inc.
+*
+* This library is free software; you can redistribute it and/or
+* modify it under the terms of the GNU Lesser General Public
+* License as published by the Free Software Foundation;
+* version 2.1 of the License only.
+*
+* This library is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this library; if not, write to the Free Software
+* 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_LLPATHFINDINGNAVMESH_H
+#define LL_LLPATHFINDINGNAVMESH_H
+
+#include <string>
+
+#include <boost/shared_ptr.hpp>
+#include <boost/function.hpp>
+#include <boost/signals2.hpp>
+
+#include "llpathfindingnavmeshstatus.h"
+#include "llsd.h"
+
+class LLPathfindingNavMesh;
+class LLUUID;
+
+typedef boost::shared_ptr<LLPathfindingNavMesh> LLPathfindingNavMeshPtr;
+
+class LLPathfindingNavMesh
+{
+public:
+ typedef enum {
+ kNavMeshRequestUnknown,
+ kNavMeshRequestWaiting,
+ kNavMeshRequestChecking,
+ kNavMeshRequestNeedsUpdate,
+ kNavMeshRequestStarted,
+ kNavMeshRequestCompleted,
+ kNavMeshRequestNotEnabled,
+ kNavMeshRequestError
+ } ENavMeshRequestStatus;
+
+ typedef boost::function<void (ENavMeshRequestStatus, const LLPathfindingNavMeshStatus &, const LLSD::Binary &)> navmesh_callback_t;
+ typedef boost::signals2::signal<void (ENavMeshRequestStatus, const LLPathfindingNavMeshStatus &, const LLSD::Binary &)> navmesh_signal_t;
+ typedef boost::signals2::connection navmesh_slot_t;
+
+ LLPathfindingNavMesh(const LLUUID &pRegionUUID);
+ virtual ~LLPathfindingNavMesh();
+
+ navmesh_slot_t registerNavMeshListener(navmesh_callback_t pNavMeshCallback);
+
+ bool hasNavMeshVersion(const LLPathfindingNavMeshStatus &pNavMeshStatus) const;
+
+ void handleNavMeshWaitForRegionLoad();
+ void handleNavMeshCheckVersion();
+ void handleRefresh(const LLPathfindingNavMeshStatus &pNavMeshStatus);
+ void handleNavMeshNewVersion(const LLPathfindingNavMeshStatus &pNavMeshStatus);
+ void handleNavMeshStart(const LLPathfindingNavMeshStatus &pNavMeshStatus);
+ void handleNavMeshResult(const LLSD &pContent, U32 pNavMeshVersion);
+ void handleNavMeshNotEnabled();
+ void handleNavMeshError();
+ void handleNavMeshError(U32 pStatus, const std::string &pReason, const std::string &pURL, U32 pNavMeshVersion);
+
+protected:
+
+private:
+ void setRequestStatus(ENavMeshRequestStatus pNavMeshRequestStatus);
+ void sendStatus();
+
+ LLPathfindingNavMeshStatus mNavMeshStatus;
+ ENavMeshRequestStatus mNavMeshRequestStatus;
+ navmesh_signal_t mNavMeshSignal;
+ LLSD::Binary mNavMeshData;
+};
+
+#endif // LL_LLPATHFINDINGNAVMESH_H
diff --git a/indra/newview/llpathfindingnavmeshstatus.cpp b/indra/newview/llpathfindingnavmeshstatus.cpp
new file mode 100644
index 0000000000..2eaa6075ca
--- /dev/null
+++ b/indra/newview/llpathfindingnavmeshstatus.cpp
@@ -0,0 +1,145 @@
+/**
+* @file llpathfindingnavmeshstatus.cpp
+* @brief Implementation of llpathfindingnavmeshstatus
+* @author Stinson@lindenlab.com
+*
+* $LicenseInfo:firstyear=2012&license=viewerlgpl$
+* Second Life Viewer Source Code
+* Copyright (C) 2012, Linden Research, Inc.
+*
+* This library is free software; you can redistribute it and/or
+* modify it under the terms of the GNU Lesser General Public
+* License as published by the Free Software Foundation;
+* version 2.1 of the License only.
+*
+* This library is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this library; if not, write to the Free Software
+* 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 "llpathfindingnavmeshstatus.h"
+
+#include <string>
+
+#include "llsd.h"
+#include "llstring.h"
+#include "lluuid.h"
+
+#define REGION_FIELD "region_id"
+#define STATUS_FIELD "status"
+#define VERSION_FIELD "version"
+
+const std::string LLPathfindingNavMeshStatus::sStatusPending("pending");
+const std::string LLPathfindingNavMeshStatus::sStatusBuilding("building");
+const std::string LLPathfindingNavMeshStatus::sStatusComplete("complete");
+const std::string LLPathfindingNavMeshStatus::sStatusRepending("repending");
+
+
+//---------------------------------------------------------------------------
+// LLPathfindingNavMeshStatus
+//---------------------------------------------------------------------------
+
+LLPathfindingNavMeshStatus::LLPathfindingNavMeshStatus()
+ : mIsValid(false),
+ mRegionUUID(),
+ mVersion(0U),
+ mStatus(kComplete)
+{
+}
+
+LLPathfindingNavMeshStatus::LLPathfindingNavMeshStatus(const LLUUID &pRegionUUID)
+ : mIsValid(false),
+ mRegionUUID(pRegionUUID),
+ mVersion(0U),
+ mStatus(kComplete)
+{
+}
+
+LLPathfindingNavMeshStatus::LLPathfindingNavMeshStatus(const LLUUID &pRegionUUID, const LLSD &pContent)
+ : mIsValid(true),
+ mRegionUUID(pRegionUUID),
+ mVersion(0U),
+ mStatus(kComplete)
+{
+ parseStatus(pContent);
+}
+
+LLPathfindingNavMeshStatus::LLPathfindingNavMeshStatus(const LLSD &pContent)
+ : mIsValid(true),
+ mRegionUUID(),
+ mVersion(0U),
+ mStatus(kComplete)
+{
+ llassert(pContent.has(REGION_FIELD));
+ llassert(pContent.get(REGION_FIELD).isUUID());
+ mRegionUUID = pContent.get(REGION_FIELD).asUUID();
+
+ parseStatus(pContent);
+}
+
+LLPathfindingNavMeshStatus::LLPathfindingNavMeshStatus(const LLPathfindingNavMeshStatus &pOther)
+ : mIsValid(pOther.mIsValid),
+ mRegionUUID(pOther.mRegionUUID),
+ mVersion(pOther.mVersion),
+ mStatus(pOther.mStatus)
+{
+}
+
+LLPathfindingNavMeshStatus::~LLPathfindingNavMeshStatus()
+{
+}
+
+LLPathfindingNavMeshStatus &LLPathfindingNavMeshStatus::operator =(const LLPathfindingNavMeshStatus &pOther)
+{
+ mIsValid = pOther.mIsValid;
+ mRegionUUID = pOther.mRegionUUID;
+ mVersion = pOther.mVersion;
+ mStatus = pOther.mStatus;
+
+ return *this;
+}
+
+void LLPathfindingNavMeshStatus::parseStatus(const LLSD &pContent)
+{
+ llassert(pContent.has(VERSION_FIELD));
+ llassert(pContent.get(VERSION_FIELD).isInteger());
+ llassert(pContent.get(VERSION_FIELD).asInteger() >= 0);
+ mVersion = static_cast<U32>(pContent.get(VERSION_FIELD).asInteger());
+
+ llassert(pContent.has(STATUS_FIELD));
+ llassert(pContent.get(STATUS_FIELD).isString());
+ std::string status = pContent.get(STATUS_FIELD).asString();
+
+ if (LLStringUtil::compareStrings(status, sStatusPending) == 0)
+ {
+ mStatus = kPending;
+ }
+ else if (LLStringUtil::compareStrings(status, sStatusBuilding) == 0)
+ {
+ mStatus = kBuilding;
+ }
+ else if (LLStringUtil::compareStrings(status, sStatusComplete) == 0)
+ {
+ mStatus = kComplete;
+ }
+ else if (LLStringUtil::compareStrings(status, sStatusRepending) == 0)
+ {
+ mStatus = kRepending;
+ }
+ else
+ {
+ mStatus = kComplete;
+ llassert(0);
+ }
+}
diff --git a/indra/newview/llpathfindingnavmeshstatus.h b/indra/newview/llpathfindingnavmeshstatus.h
new file mode 100644
index 0000000000..74533fa484
--- /dev/null
+++ b/indra/newview/llpathfindingnavmeshstatus.h
@@ -0,0 +1,77 @@
+/**
+* @file llpathfindingnavmeshstatus.h
+* @brief Header file for llpathfindingnavmeshstatus
+* @author Stinson@lindenlab.com
+*
+* $LicenseInfo:firstyear=2012&license=viewerlgpl$
+* Second Life Viewer Source Code
+* Copyright (C) 2012, Linden Research, Inc.
+*
+* This library is free software; you can redistribute it and/or
+* modify it under the terms of the GNU Lesser General Public
+* License as published by the Free Software Foundation;
+* version 2.1 of the License only.
+*
+* This library is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this library; if not, write to the Free Software
+* 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_LLPATHFINDINGNAVMESHSTATUS_H
+#define LL_LLPATHFINDINGNAVMESHSTATUS_H
+
+#include <string>
+
+#include "lluuid.h"
+
+class LLSD;
+
+class LLPathfindingNavMeshStatus
+{
+public:
+ typedef enum
+ {
+ kPending,
+ kBuilding,
+ kComplete,
+ kRepending
+ } ENavMeshStatus;
+
+ LLPathfindingNavMeshStatus();
+ LLPathfindingNavMeshStatus(const LLUUID &pRegionUUID);
+ LLPathfindingNavMeshStatus(const LLUUID &pRegionUUID, const LLSD &pContent);
+ LLPathfindingNavMeshStatus(const LLSD &pContent);
+ LLPathfindingNavMeshStatus(const LLPathfindingNavMeshStatus &pOther);
+ virtual ~LLPathfindingNavMeshStatus();
+
+ LLPathfindingNavMeshStatus &operator =(const LLPathfindingNavMeshStatus &pOther);
+
+ bool isValid() const {return mIsValid;};
+ const LLUUID &getRegionUUID() const {return mRegionUUID;};
+ U32 getVersion() const {return mVersion;};
+ ENavMeshStatus getStatus() const {return mStatus;};
+
+protected:
+
+private:
+ void parseStatus(const LLSD &pContent);
+
+ bool mIsValid;
+ LLUUID mRegionUUID;
+ U32 mVersion;
+ ENavMeshStatus mStatus;
+
+ static const std::string sStatusPending;
+ static const std::string sStatusBuilding;
+ static const std::string sStatusComplete;
+ static const std::string sStatusRepending;
+};
+
+#endif // LL_LLPATHFINDINGNAVMESHSTATUS_H
diff --git a/indra/newview/llpathfindingnavmeshzone.cpp b/indra/newview/llpathfindingnavmeshzone.cpp
new file mode 100644
index 0000000000..e190dbba65
--- /dev/null
+++ b/indra/newview/llpathfindingnavmeshzone.cpp
@@ -0,0 +1,423 @@
+/**
+* @file llpathfindingnavmeshzone.cpp
+* @brief Implementation of llpathfindingnavmeshzone
+* @author Stinson@lindenlab.com
+*
+* $LicenseInfo:firstyear=2012&license=viewerlgpl$
+* Second Life Viewer Source Code
+* Copyright (C) 2012, Linden Research, Inc.
+*
+* This library is free software; you can redistribute it and/or
+* modify it under the terms of the GNU Lesser General Public
+* License as published by the Free Software Foundation;
+* version 2.1 of the License only.
+*
+* This library is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this library; if not, write to the Free Software
+* 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 "llpathfindingnavmeshzone.h"
+
+#include <vector>
+
+#include <boost/bind.hpp>
+#include <boost/function.hpp>
+#include <boost/shared_ptr.hpp>
+#include <boost/signals2.hpp>
+
+#include "llagent.h"
+#include "llpathfindingmanager.h"
+#include "llpathfindingnavmesh.h"
+#include "llpathfindingnavmeshstatus.h"
+#include "llpathinglib.h"
+#include "llsd.h"
+#include "lluuid.h"
+#include "llviewercontrol.h"
+#include "llviewerregion.h"
+
+#define CENTER_REGION 99
+
+//---------------------------------------------------------------------------
+// LLPathfindingNavMeshZone
+//---------------------------------------------------------------------------
+
+LLPathfindingNavMeshZone::LLPathfindingNavMeshZone()
+ : mNavMeshLocationPtrs(),
+ mNavMeshZoneRequestStatus(kNavMeshZoneRequestUnknown),
+ mNavMeshZoneSignal()
+{
+}
+
+LLPathfindingNavMeshZone::~LLPathfindingNavMeshZone()
+{
+}
+
+LLPathfindingNavMeshZone::navmesh_zone_slot_t LLPathfindingNavMeshZone::registerNavMeshZoneListener(navmesh_zone_callback_t pNavMeshZoneCallback)
+{
+ return mNavMeshZoneSignal.connect(pNavMeshZoneCallback);
+}
+
+void LLPathfindingNavMeshZone::initialize()
+{
+ mNavMeshLocationPtrs.clear();
+
+ NavMeshLocationPtr centerNavMeshPtr(new NavMeshLocation(CENTER_REGION, boost::bind(&LLPathfindingNavMeshZone::handleNavMeshLocation, this)));
+ mNavMeshLocationPtrs.push_back(centerNavMeshPtr);
+
+ U32 neighborRegionDir = gSavedSettings.getU32("PathfindingRetrieveNeighboringRegion");
+ if (neighborRegionDir != CENTER_REGION)
+ {
+ NavMeshLocationPtr neighborNavMeshPtr(new NavMeshLocation(neighborRegionDir, boost::bind(&LLPathfindingNavMeshZone::handleNavMeshLocation, this)));
+ mNavMeshLocationPtrs.push_back(neighborNavMeshPtr);
+ }
+}
+
+void LLPathfindingNavMeshZone::enable()
+{
+ for (NavMeshLocationPtrs::iterator navMeshLocationPtrIter = mNavMeshLocationPtrs.begin();
+ navMeshLocationPtrIter != mNavMeshLocationPtrs.end(); ++navMeshLocationPtrIter)
+ {
+ NavMeshLocationPtr navMeshLocationPtr = *navMeshLocationPtrIter;
+ navMeshLocationPtr->enable();
+ }
+}
+
+void LLPathfindingNavMeshZone::disable()
+{
+ for (NavMeshLocationPtrs::iterator navMeshLocationPtrIter = mNavMeshLocationPtrs.begin();
+ navMeshLocationPtrIter != mNavMeshLocationPtrs.end(); ++navMeshLocationPtrIter)
+ {
+ NavMeshLocationPtr navMeshLocationPtr = *navMeshLocationPtrIter;
+ navMeshLocationPtr->disable();
+ }
+}
+
+void LLPathfindingNavMeshZone::refresh()
+{
+ if (LLPathingLib::getInstance() != NULL)
+ {
+ LLPathingLib::getInstance()->cleanupResidual();
+ }
+
+ for (NavMeshLocationPtrs::iterator navMeshLocationPtrIter = mNavMeshLocationPtrs.begin();
+ navMeshLocationPtrIter != mNavMeshLocationPtrs.end(); ++navMeshLocationPtrIter)
+ {
+ NavMeshLocationPtr navMeshLocationPtr = *navMeshLocationPtrIter;
+ navMeshLocationPtr->refresh();
+ }
+}
+
+LLPathfindingNavMeshZone::ENavMeshZoneStatus LLPathfindingNavMeshZone::getNavMeshZoneStatus() const
+{
+ bool hasPending = false;
+ bool hasBuilding = false;
+ bool hasComplete = false;
+ bool hasRepending = false;
+
+ for (NavMeshLocationPtrs::const_iterator navMeshLocationPtrIter = mNavMeshLocationPtrs.begin();
+ navMeshLocationPtrIter != mNavMeshLocationPtrs.end(); ++navMeshLocationPtrIter)
+ {
+ const NavMeshLocationPtr navMeshLocationPtr = *navMeshLocationPtrIter;
+
+ switch (navMeshLocationPtr->getNavMeshStatus())
+ {
+ case LLPathfindingNavMeshStatus::kPending :
+ hasPending = true;
+ break;
+ case LLPathfindingNavMeshStatus::kBuilding :
+ hasBuilding = true;
+ break;
+ case LLPathfindingNavMeshStatus::kComplete :
+ hasComplete = true;
+ break;
+ case LLPathfindingNavMeshStatus::kRepending :
+ hasRepending = true;
+ break;
+ default :
+ hasPending = true;
+ llassert(0);
+ break;
+ }
+ }
+
+ ENavMeshZoneStatus zoneStatus = kNavMeshZoneComplete;
+ if (hasRepending || (hasPending && hasBuilding))
+ {
+ zoneStatus = kNavMeshZonePendingAndBuilding;
+ }
+ else if (hasComplete)
+ {
+ if (hasPending)
+ {
+ zoneStatus = kNavMeshZoneSomePending;
+ }
+ else if (hasBuilding)
+ {
+ zoneStatus = kNavMeshZoneSomeBuilding;
+ }
+ else
+ {
+ zoneStatus = kNavMeshZoneComplete;
+ }
+ }
+ else if (hasPending)
+ {
+ zoneStatus = kNavMeshZonePending;
+ }
+ else if (hasBuilding)
+ {
+ zoneStatus = kNavMeshZoneBuilding;
+ }
+
+ return zoneStatus;
+}
+
+void LLPathfindingNavMeshZone::handleNavMeshLocation()
+{
+ updateStatus();
+}
+
+void LLPathfindingNavMeshZone::updateStatus()
+{
+ bool hasRequestUnknown = false;
+ bool hasRequestWaiting = false;
+ bool hasRequestChecking = false;
+ bool hasRequestNeedsUpdate = false;
+ bool hasRequestStarted = false;
+ bool hasRequestCompleted = false;
+ bool hasRequestNotEnabled = false;
+ bool hasRequestError = false;
+
+ for (NavMeshLocationPtrs::const_iterator navMeshLocationPtrIter = mNavMeshLocationPtrs.begin();
+ navMeshLocationPtrIter != mNavMeshLocationPtrs.end(); ++navMeshLocationPtrIter)
+ {
+ const NavMeshLocationPtr navMeshLocationPtr = *navMeshLocationPtrIter;
+ switch (navMeshLocationPtr->getRequestStatus())
+ {
+ case LLPathfindingNavMesh::kNavMeshRequestUnknown :
+ hasRequestUnknown = true;
+ break;
+ case LLPathfindingNavMesh::kNavMeshRequestWaiting :
+ hasRequestWaiting = true;
+ break;
+ case LLPathfindingNavMesh::kNavMeshRequestChecking :
+ hasRequestChecking = true;
+ break;
+ case LLPathfindingNavMesh::kNavMeshRequestNeedsUpdate :
+ hasRequestNeedsUpdate = true;
+ break;
+ case LLPathfindingNavMesh::kNavMeshRequestStarted :
+ hasRequestStarted = true;
+ break;
+ case LLPathfindingNavMesh::kNavMeshRequestCompleted :
+ hasRequestCompleted = true;
+ break;
+ case LLPathfindingNavMesh::kNavMeshRequestNotEnabled :
+ hasRequestNotEnabled = true;
+ break;
+ case LLPathfindingNavMesh::kNavMeshRequestError :
+ hasRequestError = true;
+ break;
+ default :
+ hasRequestError = true;
+ llassert(0);
+ break;
+ }
+ }
+
+ ENavMeshZoneRequestStatus zoneRequestStatus = kNavMeshZoneRequestUnknown;
+ if (hasRequestWaiting)
+ {
+ zoneRequestStatus = kNavMeshZoneRequestWaiting;
+ }
+ else if (hasRequestNeedsUpdate)
+ {
+ zoneRequestStatus = kNavMeshZoneRequestNeedsUpdate;
+ }
+ else if (hasRequestChecking)
+ {
+ zoneRequestStatus = kNavMeshZoneRequestChecking;
+ }
+ else if (hasRequestStarted)
+ {
+ zoneRequestStatus = kNavMeshZoneRequestStarted;
+ }
+ else if (hasRequestError)
+ {
+ zoneRequestStatus = kNavMeshZoneRequestError;
+ }
+ else if (hasRequestUnknown)
+ {
+ zoneRequestStatus = kNavMeshZoneRequestUnknown;
+ }
+ else if (hasRequestCompleted)
+ {
+ zoneRequestStatus = kNavMeshZoneRequestCompleted;
+ }
+ else if (hasRequestNotEnabled)
+ {
+ zoneRequestStatus = kNavMeshZoneRequestNotEnabled;
+ }
+ else
+ {
+ zoneRequestStatus = kNavMeshZoneRequestError;
+ llassert(0);
+ }
+
+ if ((mNavMeshZoneRequestStatus != kNavMeshZoneRequestCompleted) &&
+ (zoneRequestStatus == kNavMeshZoneRequestCompleted))
+ {
+ llassert(LLPathingLib::getInstance() != NULL);
+ if (LLPathingLib::getInstance() != NULL)
+ {
+ LLPathingLib::getInstance()->processNavMeshData();
+ }
+ }
+
+ mNavMeshZoneRequestStatus = zoneRequestStatus;
+ mNavMeshZoneSignal(mNavMeshZoneRequestStatus);
+}
+
+//---------------------------------------------------------------------------
+// LLPathfindingNavMeshZone::NavMeshLocation
+//---------------------------------------------------------------------------
+
+LLPathfindingNavMeshZone::NavMeshLocation::NavMeshLocation(S32 pDirection, navmesh_location_callback_t pLocationCallback)
+ : mDirection(pDirection),
+ mRegionUUID(),
+ mHasNavMesh(false),
+ mNavMeshVersion(0U),
+ mNavMeshStatus(LLPathfindingNavMeshStatus::kComplete),
+ mLocationCallback(pLocationCallback),
+ mRequestStatus(LLPathfindingNavMesh::kNavMeshRequestUnknown),
+ mNavMeshSlot()
+{
+}
+
+LLPathfindingNavMeshZone::NavMeshLocation::~NavMeshLocation()
+{
+}
+
+void LLPathfindingNavMeshZone::NavMeshLocation::enable()
+{
+ clear();
+
+ LLViewerRegion *region = getRegion();
+ if (region == NULL)
+ {
+ mRegionUUID.setNull();
+ }
+ else
+ {
+ mRegionUUID = region->getRegionID();
+ mNavMeshSlot = LLPathfindingManager::getInstance()->registerNavMeshListenerForRegion(region, boost::bind(&LLPathfindingNavMeshZone::NavMeshLocation::handleNavMesh, this, _1, _2, _3));
+ }
+}
+
+void LLPathfindingNavMeshZone::NavMeshLocation::refresh()
+{
+ LLViewerRegion *region = getRegion();
+
+ if (region == NULL)
+ {
+ llassert(mRegionUUID.isNull());
+ LLPathfindingNavMeshStatus newNavMeshStatus(mRegionUUID);
+ LLSD::Binary nullData;
+ handleNavMesh(LLPathfindingNavMesh::kNavMeshRequestNotEnabled, newNavMeshStatus, nullData);
+ }
+ else
+ {
+ llassert(mRegionUUID == region->getRegionID());
+ LLPathfindingManager::getInstance()->requestGetNavMeshForRegion(region, false);
+ }
+}
+
+void LLPathfindingNavMeshZone::NavMeshLocation::disable()
+{
+ clear();
+}
+
+LLPathfindingNavMesh::ENavMeshRequestStatus LLPathfindingNavMeshZone::NavMeshLocation::getRequestStatus() const
+{
+ return mRequestStatus;
+}
+
+LLPathfindingNavMeshStatus::ENavMeshStatus LLPathfindingNavMeshZone::NavMeshLocation::getNavMeshStatus() const
+{
+ return mNavMeshStatus;
+}
+
+void LLPathfindingNavMeshZone::NavMeshLocation::handleNavMesh(LLPathfindingNavMesh::ENavMeshRequestStatus pNavMeshRequestStatus, const LLPathfindingNavMeshStatus &pNavMeshStatus, const LLSD::Binary &pNavMeshData)
+{
+ llassert(mRegionUUID == pNavMeshStatus.getRegionUUID());
+
+ if ((pNavMeshRequestStatus == LLPathfindingNavMesh::kNavMeshRequestCompleted) &&
+ (!mHasNavMesh || (mNavMeshVersion != pNavMeshStatus.getVersion())))
+ {
+ llassert(!pNavMeshData.empty());
+ mHasNavMesh = true;
+ mNavMeshVersion = pNavMeshStatus.getVersion();
+ llassert(LLPathingLib::getInstance() != NULL);
+ if (LLPathingLib::getInstance() != NULL)
+ {
+ LLPathingLib::getInstance()->extractNavMeshSrcFromLLSD(pNavMeshData, mDirection);
+ }
+ }
+
+ mRequestStatus = pNavMeshRequestStatus;
+ mNavMeshStatus = pNavMeshStatus.getStatus();
+ mLocationCallback();
+}
+
+void LLPathfindingNavMeshZone::NavMeshLocation::clear()
+{
+ mHasNavMesh = false;
+ mRequestStatus = LLPathfindingNavMesh::kNavMeshRequestUnknown;
+ mNavMeshStatus = LLPathfindingNavMeshStatus::kComplete;
+ if (mNavMeshSlot.connected())
+ {
+ mNavMeshSlot.disconnect();
+ }
+}
+
+LLViewerRegion *LLPathfindingNavMeshZone::NavMeshLocation::getRegion() const
+{
+ LLViewerRegion *region = NULL;
+
+ LLViewerRegion *currentRegion = gAgent.getRegion();
+ if (currentRegion != NULL)
+ {
+ if (mDirection == CENTER_REGION)
+ {
+ region = currentRegion;
+ }
+ else
+ {
+ //User wants to pull in a neighboring region
+ std::vector<S32> availableRegions;
+ currentRegion->getNeighboringRegionsStatus( availableRegions );
+ //Is the desired region in the available list
+ std::vector<S32>::iterator foundElem = std::find(availableRegions.begin(),availableRegions.end(),mDirection);
+ if ( foundElem != availableRegions.end() )
+ {
+ std::vector<LLViewerRegion*> neighborRegionsPtrs;
+ currentRegion->getNeighboringRegions( neighborRegionsPtrs );
+ region = neighborRegionsPtrs[foundElem - availableRegions.begin()];
+ }
+ }
+ }
+
+ return region;
+}
diff --git a/indra/newview/llpathfindingnavmeshzone.h b/indra/newview/llpathfindingnavmeshzone.h
new file mode 100644
index 0000000000..baa1cc5979
--- /dev/null
+++ b/indra/newview/llpathfindingnavmeshzone.h
@@ -0,0 +1,128 @@
+/**
+* @file llpathfindingnavmeshzone.h
+* @brief Header file for llpathfindingnavmeshzone
+* @author Stinson@lindenlab.com
+*
+* $LicenseInfo:firstyear=2012&license=viewerlgpl$
+* Second Life Viewer Source Code
+* Copyright (C) 2012, Linden Research, Inc.
+*
+* This library is free software; you can redistribute it and/or
+* modify it under the terms of the GNU Lesser General Public
+* License as published by the Free Software Foundation;
+* version 2.1 of the License only.
+*
+* This library is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this library; if not, write to the Free Software
+* 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_LLPATHFINDINGNAVMESHZONE_H
+#define LL_LLPATHFINDINGNAVMESHZONE_H
+
+#include <vector>
+
+#include <boost/shared_ptr.hpp>
+#include <boost/function.hpp>
+#include <boost/signals2.hpp>
+
+#include "llpathfindingnavmesh.h"
+#include "llpathfindingnavmeshstatus.h"
+#include "llsd.h"
+#include "lluuid.h"
+
+class LLViewerRegion;
+
+class LLPathfindingNavMeshZone
+{
+public:
+ typedef enum {
+ kNavMeshZoneRequestUnknown,
+ kNavMeshZoneRequestWaiting,
+ kNavMeshZoneRequestChecking,
+ kNavMeshZoneRequestNeedsUpdate,
+ kNavMeshZoneRequestStarted,
+ kNavMeshZoneRequestCompleted,
+ kNavMeshZoneRequestNotEnabled,
+ kNavMeshZoneRequestError
+ } ENavMeshZoneRequestStatus;
+
+ typedef enum {
+ kNavMeshZonePending,
+ kNavMeshZoneBuilding,
+ kNavMeshZoneSomePending,
+ kNavMeshZoneSomeBuilding,
+ kNavMeshZonePendingAndBuilding,
+ kNavMeshZoneComplete
+ } ENavMeshZoneStatus;
+
+ typedef boost::function<void (ENavMeshZoneRequestStatus)> navmesh_zone_callback_t;
+ typedef boost::signals2::signal<void (ENavMeshZoneRequestStatus)> navmesh_zone_signal_t;
+ typedef boost::signals2::connection navmesh_zone_slot_t;
+
+ LLPathfindingNavMeshZone();
+ virtual ~LLPathfindingNavMeshZone();
+
+ navmesh_zone_slot_t registerNavMeshZoneListener(navmesh_zone_callback_t pNavMeshZoneCallback);
+ void initialize();
+
+ void enable();
+ void disable();
+ void refresh();
+
+ ENavMeshZoneStatus getNavMeshZoneStatus() const;
+
+protected:
+
+private:
+ typedef boost::function<void (void)> navmesh_location_callback_t;
+ class NavMeshLocation
+ {
+ public:
+ NavMeshLocation(S32 pDirection, navmesh_location_callback_t pLocationCallback);
+ virtual ~NavMeshLocation();
+
+ void enable();
+ void refresh();
+ void disable();
+
+ LLPathfindingNavMesh::ENavMeshRequestStatus getRequestStatus() const;
+ LLPathfindingNavMeshStatus::ENavMeshStatus getNavMeshStatus() const;
+
+ protected:
+
+ private:
+ void handleNavMesh(LLPathfindingNavMesh::ENavMeshRequestStatus pNavMeshRequestStatus, const LLPathfindingNavMeshStatus &pNavMeshStatus, const LLSD::Binary &pNavMeshData);
+
+ void clear();
+ LLViewerRegion *getRegion() const;
+
+ S32 mDirection;
+ LLUUID mRegionUUID;
+ bool mHasNavMesh;
+ U32 mNavMeshVersion;
+ LLPathfindingNavMeshStatus::ENavMeshStatus mNavMeshStatus;
+ navmesh_location_callback_t mLocationCallback;
+ LLPathfindingNavMesh::ENavMeshRequestStatus mRequestStatus;
+ LLPathfindingNavMesh::navmesh_slot_t mNavMeshSlot;
+ };
+
+ typedef boost::shared_ptr<NavMeshLocation> NavMeshLocationPtr;
+ typedef std::vector<NavMeshLocationPtr> NavMeshLocationPtrs;
+
+ void handleNavMeshLocation();
+ void updateStatus();
+
+ NavMeshLocationPtrs mNavMeshLocationPtrs;
+ ENavMeshZoneRequestStatus mNavMeshZoneRequestStatus;
+ navmesh_zone_signal_t mNavMeshZoneSignal;
+};
+
+#endif // LL_LLPATHFINDINGNAVMESHZONE_H
diff --git a/indra/newview/llpathfindingobject.cpp b/indra/newview/llpathfindingobject.cpp
new file mode 100644
index 0000000000..916eceb4c8
--- /dev/null
+++ b/indra/newview/llpathfindingobject.cpp
@@ -0,0 +1,162 @@
+/**
+* @file llpathfindingobject.cpp
+* @brief Implementation of llpathfindingobject
+* @author Stinson@lindenlab.com
+*
+* $LicenseInfo:firstyear=2012&license=viewerlgpl$
+* Second Life Viewer Source Code
+* Copyright (C) 2012, Linden Research, Inc.
+*
+* This library is free software; you can redistribute it and/or
+* modify it under the terms of the GNU Lesser General Public
+* License as published by the Free Software Foundation;
+* version 2.1 of the License only.
+*
+* This library is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this library; if not, write to the Free Software
+* 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 "llpathfindingobject.h"
+
+#include <string>
+
+#include "llavatarname.h"
+#include "llavatarnamecache.h"
+#include "llsd.h"
+#include "lluuid.h"
+#include "v3math.h"
+
+#define PATHFINDING_OBJECT_NAME_FIELD "name"
+#define PATHFINDING_OBJECT_DESCRIPTION_FIELD "description"
+#define PATHFINDING_OBJECT_OWNER_FIELD "owner"
+#define PATHFINDING_OBJECT_POSITION_FIELD "position"
+#define PATHFINDING_OBJECT_IS_GROUP_OWNED_FIELD "owner_is_group"
+
+//---------------------------------------------------------------------------
+// LLPathfindingObject
+//---------------------------------------------------------------------------
+
+LLPathfindingObject::LLPathfindingObject()
+ : mUUID(),
+ mName(),
+ mDescription(),
+ mOwnerUUID(),
+ mHasOwnerName(false),
+ mOwnerName(),
+ mIsGroupOwned(false),
+ mLocation()
+{
+}
+
+LLPathfindingObject::LLPathfindingObject(const std::string &pUUID, const LLSD &pObjectData)
+ : mUUID(pUUID),
+ mName(),
+ mDescription(),
+ mOwnerUUID(),
+ mHasOwnerName(false),
+ mOwnerName(),
+ mIsGroupOwned(false),
+ mLocation()
+{
+ parseObjectData(pObjectData);
+}
+
+LLPathfindingObject::LLPathfindingObject(const LLPathfindingObject& pOther)
+ : mUUID(pOther.mUUID),
+ mName(pOther.mName),
+ mDescription(pOther.mDescription),
+ mOwnerUUID(pOther.mOwnerUUID),
+ mHasOwnerName(false),
+ mOwnerName(),
+ mIsGroupOwned(pOther.mIsGroupOwned),
+ mLocation(pOther.mLocation)
+{
+ fetchOwnerName();
+}
+
+LLPathfindingObject::~LLPathfindingObject()
+{
+}
+
+LLPathfindingObject &LLPathfindingObject::operator =(const LLPathfindingObject& pOther)
+{
+ mUUID = pOther.mUUID;
+ mName = pOther.mName;
+ mDescription = pOther.mDescription;
+ mOwnerUUID = pOther.mOwnerUUID;
+ fetchOwnerName();
+ mIsGroupOwned = pOther.mIsGroupOwned;
+ mLocation = pOther.mLocation;
+
+ return *this;
+}
+
+std::string LLPathfindingObject::getOwnerName() const
+{
+ std::string ownerName;
+
+ if (hasOwner())
+ {
+ ownerName = mOwnerName.getCompleteName();
+ }
+
+ return ownerName;
+}
+
+void LLPathfindingObject::parseObjectData(const LLSD &pObjectData)
+{
+ llassert(pObjectData.has(PATHFINDING_OBJECT_NAME_FIELD));
+ llassert(pObjectData.get(PATHFINDING_OBJECT_NAME_FIELD).isString());
+ mName = pObjectData.get(PATHFINDING_OBJECT_NAME_FIELD).asString();
+
+ llassert(pObjectData.has(PATHFINDING_OBJECT_DESCRIPTION_FIELD));
+ llassert(pObjectData.get(PATHFINDING_OBJECT_DESCRIPTION_FIELD).isString());
+ mDescription = pObjectData.get(PATHFINDING_OBJECT_DESCRIPTION_FIELD).asString();
+
+ llassert(pObjectData.has(PATHFINDING_OBJECT_OWNER_FIELD));
+ llassert(pObjectData.get(PATHFINDING_OBJECT_OWNER_FIELD).isUUID());
+ mOwnerUUID = pObjectData.get(PATHFINDING_OBJECT_OWNER_FIELD).asUUID();
+ fetchOwnerName();
+
+ if (pObjectData.has(PATHFINDING_OBJECT_IS_GROUP_OWNED_FIELD))
+ {
+ llassert(pObjectData.get(PATHFINDING_OBJECT_IS_GROUP_OWNED_FIELD).isBoolean());
+ mIsGroupOwned = pObjectData.get(PATHFINDING_OBJECT_IS_GROUP_OWNED_FIELD).asBoolean();
+ }
+
+ llassert(pObjectData.has(PATHFINDING_OBJECT_POSITION_FIELD));
+ llassert(pObjectData.get(PATHFINDING_OBJECT_POSITION_FIELD).isArray());
+ mLocation.setValue(pObjectData.get(PATHFINDING_OBJECT_POSITION_FIELD));
+}
+
+void LLPathfindingObject::fetchOwnerName()
+{
+ mHasOwnerName = false;
+ if (hasOwner())
+ {
+ mHasOwnerName = LLAvatarNameCache::get(mOwnerUUID, &mOwnerName);
+ if (!mHasOwnerName)
+ {
+ LLAvatarNameCache::get(mOwnerUUID, boost::bind(&LLPathfindingObject::handleAvatarNameFetch, this, _1, _2));
+ }
+ }
+}
+
+void LLPathfindingObject::handleAvatarNameFetch(const LLUUID &pOwnerUUID, const LLAvatarName &pAvatarName)
+{
+ llassert(mOwnerUUID == pOwnerUUID);
+ mOwnerName = pAvatarName;
+ mHasOwnerName = true;
+}
diff --git a/indra/newview/llpathfindingobject.h b/indra/newview/llpathfindingobject.h
new file mode 100644
index 0000000000..d45cc554fd
--- /dev/null
+++ b/indra/newview/llpathfindingobject.h
@@ -0,0 +1,80 @@
+/**
+* @file llpathfindingobject.h
+* @brief Header file for llpathfindingobject
+* @author Stinson@lindenlab.com
+*
+* $LicenseInfo:firstyear=2012&license=viewerlgpl$
+* Second Life Viewer Source Code
+* Copyright (C) 2012, Linden Research, Inc.
+*
+* This library is free software; you can redistribute it and/or
+* modify it under the terms of the GNU Lesser General Public
+* License as published by the Free Software Foundation;
+* version 2.1 of the License only.
+*
+* This library is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this library; if not, write to the Free Software
+* 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_LLPATHFINDINGOBJECT_H
+#define LL_LLPATHFINDINGOBJECT_H
+
+#include <string>
+
+#include <boost/shared_ptr.hpp>
+
+#include "llavatarname.h"
+#include "lluuid.h"
+#include "v3math.h"
+
+class LLPathfindingObject;
+class LLSD;
+
+typedef boost::shared_ptr<LLPathfindingObject> LLPathfindingObjectPtr;
+
+class LLPathfindingObject
+{
+public:
+ LLPathfindingObject();
+ LLPathfindingObject(const std::string &pUUID, const LLSD &pObjectData);
+ LLPathfindingObject(const LLPathfindingObject& pOther);
+ virtual ~LLPathfindingObject();
+
+ LLPathfindingObject& operator =(const LLPathfindingObject& pOther);
+
+ inline const LLUUID& getUUID() const {return mUUID;};
+ inline const std::string& getName() const {return mName;};
+ inline const std::string& getDescription() const {return mDescription;};
+ inline BOOL hasOwner() const {return mOwnerUUID.notNull();};
+ inline bool hasOwnerName() const {return mHasOwnerName;};
+ std::string getOwnerName() const;
+ inline BOOL isGroupOwned() const {return mIsGroupOwned;};
+ inline const LLVector3& getLocation() const {return mLocation;};
+
+protected:
+
+private:
+ void parseObjectData(const LLSD &pObjectData);
+
+ void fetchOwnerName();
+ void handleAvatarNameFetch(const LLUUID &pOwnerUUID, const LLAvatarName &pAvatarName);
+
+ LLUUID mUUID;
+ std::string mName;
+ std::string mDescription;
+ LLUUID mOwnerUUID;
+ bool mHasOwnerName;
+ LLAvatarName mOwnerName;
+ BOOL mIsGroupOwned;
+ LLVector3 mLocation;
+};
+
+#endif // LL_LLPATHFINDINGOBJECT_H
diff --git a/indra/newview/llpathfindingobjectlist.cpp b/indra/newview/llpathfindingobjectlist.cpp
new file mode 100644
index 0000000000..68a7e736e6
--- /dev/null
+++ b/indra/newview/llpathfindingobjectlist.cpp
@@ -0,0 +1,112 @@
+/**
+* @file llpathfindingobjectlist.cpp
+* @brief Implementation of llpathfindingobjectlist
+* @author Stinson@lindenlab.com
+*
+* $LicenseInfo:firstyear=2012&license=viewerlgpl$
+* Second Life Viewer Source Code
+* Copyright (C) 2012, Linden Research, Inc.
+*
+* This library is free software; you can redistribute it and/or
+* modify it under the terms of the GNU Lesser General Public
+* License as published by the Free Software Foundation;
+* version 2.1 of the License only.
+*
+* This library is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this library; if not, write to the Free Software
+* 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 "llpathfindingobjectlist.h"
+
+#include <string>
+#include <map>
+
+#include "llpathfindingobject.h"
+
+//---------------------------------------------------------------------------
+// LLPathfindingObjectList
+//---------------------------------------------------------------------------
+
+LLPathfindingObjectList::LLPathfindingObjectList()
+ : mObjectMap()
+{
+}
+
+LLPathfindingObjectList::~LLPathfindingObjectList()
+{
+}
+
+bool LLPathfindingObjectList::isEmpty() const
+{
+ return mObjectMap.empty();
+}
+
+void LLPathfindingObjectList::update(LLPathfindingObjectPtr pUpdateObjectPtr)
+{
+ if (pUpdateObjectPtr != NULL)
+ {
+ std::string updateObjectId = pUpdateObjectPtr->getUUID().asString();
+
+ LLPathfindingObjectMap::iterator foundObjectIter = mObjectMap.find(updateObjectId);
+ if (foundObjectIter == mObjectMap.end())
+ {
+ mObjectMap.insert(std::pair<std::string, LLPathfindingObjectPtr>(updateObjectId, pUpdateObjectPtr));
+ }
+ else
+ {
+ foundObjectIter->second = pUpdateObjectPtr;
+ }
+ }
+}
+
+void LLPathfindingObjectList::update(LLPathfindingObjectListPtr pUpdateObjectListPtr)
+{
+ if ((pUpdateObjectListPtr != NULL) && !pUpdateObjectListPtr->isEmpty())
+ {
+ for (LLPathfindingObjectMap::const_iterator updateObjectIter = pUpdateObjectListPtr->begin();
+ updateObjectIter != pUpdateObjectListPtr->end(); ++updateObjectIter)
+ {
+ const LLPathfindingObjectPtr updateObjectPtr = updateObjectIter->second;
+ update(updateObjectPtr);
+ }
+ }
+}
+
+LLPathfindingObjectPtr LLPathfindingObjectList::find(const std::string &pObjectId) const
+{
+ LLPathfindingObjectPtr objectPtr;
+
+ LLPathfindingObjectMap::const_iterator objectIter = mObjectMap.find(pObjectId);
+ if (objectIter != mObjectMap.end())
+ {
+ objectPtr = objectIter->second;
+ }
+
+ return objectPtr;
+}
+
+LLPathfindingObjectList::const_iterator LLPathfindingObjectList::begin() const
+{
+ return mObjectMap.begin();
+}
+
+LLPathfindingObjectList::const_iterator LLPathfindingObjectList::end() const
+{
+ return mObjectMap.end();
+}
+
+LLPathfindingObjectMap &LLPathfindingObjectList::getObjectMap()
+{
+ return mObjectMap;
+}
diff --git a/indra/newview/llpathfindingobjectlist.h b/indra/newview/llpathfindingobjectlist.h
new file mode 100644
index 0000000000..3ad8e8b096
--- /dev/null
+++ b/indra/newview/llpathfindingobjectlist.h
@@ -0,0 +1,67 @@
+/**
+* @file llpathfindingobjectlist.h
+* @brief Header file for llpathfindingobjectlist
+* @author Stinson@lindenlab.com
+*
+* $LicenseInfo:firstyear=2012&license=viewerlgpl$
+* Second Life Viewer Source Code
+* Copyright (C) 2012, Linden Research, Inc.
+*
+* This library is free software; you can redistribute it and/or
+* modify it under the terms of the GNU Lesser General Public
+* License as published by the Free Software Foundation;
+* version 2.1 of the License only.
+*
+* This library is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this library; if not, write to the Free Software
+* 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_LLPATHFINDINGOBJECTLIST_H
+#define LL_LLPATHFINDINGOBJECTLIST_H
+
+#include <string>
+#include <map>
+
+#include <boost/shared_ptr.hpp>
+
+#include "llpathfindingobject.h"
+
+class LLPathfindingObjectList;
+
+typedef boost::shared_ptr<LLPathfindingObjectList> LLPathfindingObjectListPtr;
+typedef std::map<std::string, LLPathfindingObjectPtr> LLPathfindingObjectMap;
+
+class LLPathfindingObjectList
+{
+public:
+ LLPathfindingObjectList();
+ virtual ~LLPathfindingObjectList();
+
+ bool isEmpty() const;
+
+ void update(LLPathfindingObjectPtr pUpdateObjectPtr);
+ void update(LLPathfindingObjectListPtr pUpdateObjectListPtr);
+
+ LLPathfindingObjectPtr find(const std::string &pObjectId) const;
+
+ typedef LLPathfindingObjectMap::const_iterator const_iterator;
+ const_iterator begin() const;
+ const_iterator end() const;
+
+
+protected:
+ LLPathfindingObjectMap &getObjectMap();
+
+private:
+ LLPathfindingObjectMap mObjectMap;
+};
+
+#endif // LL_LLPATHFINDINGOBJECTLIST_H
diff --git a/indra/newview/llpathfindingpathtool.cpp b/indra/newview/llpathfindingpathtool.cpp
new file mode 100644
index 0000000000..006755e20b
--- /dev/null
+++ b/indra/newview/llpathfindingpathtool.cpp
@@ -0,0 +1,467 @@
+/**
+* @file llpathfindingpathtool.cpp
+* @brief Implementation of llpathfindingpathtool
+* @author Stinson@lindenlab.com
+*
+* $LicenseInfo:firstyear=2012&license=viewerlgpl$
+* Second Life Viewer Source Code
+* Copyright (C) 2012, Linden Research, Inc.
+*
+* This library is free software; you can redistribute it and/or
+* modify it under the terms of the GNU Lesser General Public
+* License as published by the Free Software Foundation;
+* version 2.1 of the License only.
+*
+* This library is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this library; if not, write to the Free Software
+* 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 "llpathfindingpathtool.h"
+
+#include <boost/function.hpp>
+#include <boost/signals2.hpp>
+
+#include "llagent.h"
+#include "llpathfindingmanager.h"
+#include "llpathinglib.h"
+#include "llsingleton.h"
+#include "lltool.h"
+#include "llviewercamera.h"
+#include "llviewerregion.h"
+#include "llviewerwindow.h"
+
+#define PATH_TOOL_NAME "PathfindingPathTool"
+
+LLPathfindingPathTool::LLPathfindingPathTool()
+ : LLTool(PATH_TOOL_NAME),
+ LLSingleton<LLPathfindingPathTool>(),
+ mFinalPathData(),
+ mTempPathData(),
+ mPathResult(LLPathingLib::LLPL_NO_PATH),
+ mCharacterType(kCharacterTypeNone),
+ mPathEventSignal(),
+ mIsLeftMouseButtonHeld(false),
+ mIsMiddleMouseButtonHeld(false),
+ mIsRightMouseButtonHeld(false)
+{
+ setCharacterWidth(1.0f);
+ setCharacterType(mCharacterType);
+}
+
+LLPathfindingPathTool::~LLPathfindingPathTool()
+{
+}
+
+BOOL LLPathfindingPathTool::handleMouseDown(S32 pX, S32 pY, MASK pMask)
+{
+ BOOL returnVal = FALSE;
+
+ if (!mIsLeftMouseButtonHeld && !mIsMiddleMouseButtonHeld && !mIsRightMouseButtonHeld)
+ {
+ if (isAnyPathToolModKeys(pMask))
+ {
+ gViewerWindow->setCursor(isPointAModKeys(pMask)
+ ? UI_CURSOR_TOOLPATHFINDING_PATH_START_ADD
+ : UI_CURSOR_TOOLPATHFINDING_PATH_END_ADD);
+ computeFinalPoints(pX, pY, pMask);
+ mIsLeftMouseButtonHeld = true;
+ setMouseCapture(TRUE);
+ returnVal = TRUE;
+ }
+ else if (!isCameraModKeys(pMask))
+ {
+ gViewerWindow->setCursor(UI_CURSOR_TOOLNO);
+ mIsLeftMouseButtonHeld = true;
+ setMouseCapture(TRUE);
+ returnVal = TRUE;
+ }
+ }
+ mIsLeftMouseButtonHeld = true;
+
+ return returnVal;
+}
+
+BOOL LLPathfindingPathTool::handleMouseUp(S32 pX, S32 pY, MASK pMask)
+{
+ BOOL returnVal = FALSE;
+
+ if (mIsLeftMouseButtonHeld && !mIsMiddleMouseButtonHeld && !mIsRightMouseButtonHeld)
+ {
+ computeFinalPoints(pX, pY, pMask);
+ setMouseCapture(FALSE);
+ returnVal = TRUE;
+ }
+ mIsLeftMouseButtonHeld = false;
+
+ return returnVal;
+}
+
+BOOL LLPathfindingPathTool::handleMiddleMouseDown(S32 pX, S32 pY, MASK pMask)
+{
+ setMouseCapture(TRUE);
+ mIsMiddleMouseButtonHeld = true;
+ gViewerWindow->setCursor(UI_CURSOR_TOOLNO);
+
+ return TRUE;
+}
+
+BOOL LLPathfindingPathTool::handleMiddleMouseUp(S32 pX, S32 pY, MASK pMask)
+{
+ if (!mIsLeftMouseButtonHeld && mIsMiddleMouseButtonHeld && !mIsRightMouseButtonHeld)
+ {
+ setMouseCapture(FALSE);
+ }
+ mIsMiddleMouseButtonHeld = false;
+
+ return TRUE;
+}
+
+BOOL LLPathfindingPathTool::handleRightMouseDown(S32 pX, S32 pY, MASK pMask)
+{
+ setMouseCapture(TRUE);
+ mIsRightMouseButtonHeld = true;
+ gViewerWindow->setCursor(UI_CURSOR_TOOLNO);
+
+ return TRUE;
+}
+
+BOOL LLPathfindingPathTool::handleRightMouseUp(S32 pX, S32 pY, MASK pMask)
+{
+ if (!mIsLeftMouseButtonHeld && !mIsMiddleMouseButtonHeld && mIsRightMouseButtonHeld)
+ {
+ setMouseCapture(FALSE);
+ }
+ mIsRightMouseButtonHeld = false;
+
+ return TRUE;
+}
+
+BOOL LLPathfindingPathTool::handleDoubleClick(S32 pX, S32 pY, MASK pMask)
+{
+ return TRUE;
+}
+
+BOOL LLPathfindingPathTool::handleHover(S32 pX, S32 pY, MASK pMask)
+{
+ BOOL returnVal = FALSE;
+
+ if (!mIsLeftMouseButtonHeld && !mIsMiddleMouseButtonHeld && !mIsRightMouseButtonHeld && !isAnyPathToolModKeys(pMask))
+ {
+ gViewerWindow->setCursor(UI_CURSOR_TOOLPATHFINDING);
+ }
+
+ if (!mIsMiddleMouseButtonHeld && !mIsRightMouseButtonHeld && isAnyPathToolModKeys(pMask))
+ {
+ gViewerWindow->setCursor(isPointAModKeys(pMask)
+ ? (mIsLeftMouseButtonHeld ? UI_CURSOR_TOOLPATHFINDING_PATH_START_ADD : UI_CURSOR_TOOLPATHFINDING_PATH_START)
+ : (mIsLeftMouseButtonHeld ? UI_CURSOR_TOOLPATHFINDING_PATH_END_ADD : UI_CURSOR_TOOLPATHFINDING_PATH_END));
+ computeTempPoints(pX, pY, pMask);
+ returnVal = TRUE;
+ }
+ else
+ {
+ clearTemp();
+ computeFinalPath();
+ }
+
+ return returnVal;
+}
+
+BOOL LLPathfindingPathTool::handleKey(KEY pKey, MASK pMask)
+{
+ // Eat the escape key or else the camera tool will pick up and reset to default view. This,
+ // in turn, will cause some other methods to get called. And one of those methods will reset
+ // the current toolset back to the basic toolset. This means that the pathfinding path toolset
+ // will no longer be active, but typically with pathfinding path elements on screen.
+ return (pKey == KEY_ESCAPE);
+}
+
+LLPathfindingPathTool::EPathStatus LLPathfindingPathTool::getPathStatus() const
+{
+ EPathStatus status = kPathStatusUnknown;
+
+ if (LLPathingLib::getInstance() == NULL)
+ {
+ status = kPathStatusNotImplemented;
+ }
+ else if ((gAgent.getRegion() != NULL) && !gAgent.getRegion()->capabilitiesReceived())
+ {
+ status = kPathStatusUnknown;
+ }
+ else if (!LLPathfindingManager::getInstance()->isPathfindingEnabledForCurrentRegion())
+ {
+ status = kPathStatusNotEnabled;
+ }
+ else if (!hasFinalA() && !hasFinalB())
+ {
+ status = kPathStatusChooseStartAndEndPoints;
+ }
+ else if (!hasFinalA())
+ {
+ status = kPathStatusChooseStartPoint;
+ }
+ else if (!hasFinalB())
+ {
+ status = kPathStatusChooseEndPoint;
+ }
+ else if (mPathResult == LLPathingLib::LLPL_PATH_GENERATED_OK)
+ {
+ status = kPathStatusHasValidPath;
+ }
+ else if (mPathResult == LLPathingLib::LLPL_NO_PATH)
+ {
+ status = kPathStatusHasInvalidPath;
+ }
+ else
+ {
+ status = kPathStatusError;
+ }
+
+ return status;
+}
+
+F32 LLPathfindingPathTool::getCharacterWidth() const
+{
+ return mFinalPathData.mCharacterWidth;
+}
+
+void LLPathfindingPathTool::setCharacterWidth(F32 pCharacterWidth)
+{
+ mFinalPathData.mCharacterWidth = pCharacterWidth;
+ mTempPathData.mCharacterWidth = pCharacterWidth;
+ computeFinalPath();
+}
+
+LLPathfindingPathTool::ECharacterType LLPathfindingPathTool::getCharacterType() const
+{
+ return mCharacterType;
+}
+
+void LLPathfindingPathTool::setCharacterType(ECharacterType pCharacterType)
+{
+ mCharacterType = pCharacterType;
+
+ LLPathingLib::LLPLCharacterType characterType;
+ switch (pCharacterType)
+ {
+ case kCharacterTypeNone :
+ characterType = LLPathingLib::LLPL_CHARACTER_TYPE_NONE;
+ break;
+ case kCharacterTypeA :
+ characterType = LLPathingLib::LLPL_CHARACTER_TYPE_A;
+ break;
+ case kCharacterTypeB :
+ characterType = LLPathingLib::LLPL_CHARACTER_TYPE_B;
+ break;
+ case kCharacterTypeC :
+ characterType = LLPathingLib::LLPL_CHARACTER_TYPE_C;
+ break;
+ case kCharacterTypeD :
+ characterType = LLPathingLib::LLPL_CHARACTER_TYPE_D;
+ break;
+ default :
+ characterType = LLPathingLib::LLPL_CHARACTER_TYPE_NONE;
+ llassert(0);
+ break;
+ }
+ mFinalPathData.mCharacterType = characterType;
+ mTempPathData.mCharacterType = characterType;
+ computeFinalPath();
+}
+
+bool LLPathfindingPathTool::isRenderPath() const
+{
+ return (hasFinalA() || hasFinalB() || hasTempA() || hasTempB());
+}
+
+void LLPathfindingPathTool::clearPath()
+{
+ clearFinal();
+ clearTemp();
+ computeFinalPath();
+}
+
+LLPathfindingPathTool::path_event_slot_t LLPathfindingPathTool::registerPathEventListener(path_event_callback_t pPathEventCallback)
+{
+ return mPathEventSignal.connect(pPathEventCallback);
+}
+
+bool LLPathfindingPathTool::isAnyPathToolModKeys(MASK pMask) const
+{
+ return ((pMask & (MASK_CONTROL|MASK_SHIFT)) != 0);
+}
+
+bool LLPathfindingPathTool::isPointAModKeys(MASK pMask) const
+{
+ return ((pMask & MASK_CONTROL) != 0);
+}
+
+bool LLPathfindingPathTool::isPointBModKeys(MASK pMask) const
+{
+ return ((pMask & MASK_SHIFT) != 0);
+}
+
+bool LLPathfindingPathTool::isCameraModKeys(MASK pMask) const
+{
+ return ((pMask & MASK_ALT) != 0);
+}
+
+void LLPathfindingPathTool::getRayPoints(S32 pX, S32 pY, LLVector3 &pRayStart, LLVector3 &pRayEnd) const
+{
+ LLVector3 dv = gViewerWindow->mouseDirectionGlobal(pX, pY);
+ LLVector3 mousePos = LLViewerCamera::getInstance()->getOrigin();
+ pRayStart = mousePos;
+ pRayEnd = mousePos + dv * 150;
+}
+
+void LLPathfindingPathTool::computeFinalPoints(S32 pX, S32 pY, MASK pMask)
+{
+ LLVector3 rayStart, rayEnd;
+ getRayPoints(pX, pY, rayStart, rayEnd);
+
+ if (isPointAModKeys(pMask))
+ {
+ setFinalA(rayStart, rayEnd);
+ }
+ else if (isPointBModKeys(pMask))
+ {
+ setFinalB(rayStart, rayEnd);
+ }
+ computeFinalPath();
+}
+
+void LLPathfindingPathTool::computeTempPoints(S32 pX, S32 pY, MASK pMask)
+{
+ LLVector3 rayStart, rayEnd;
+ getRayPoints(pX, pY, rayStart, rayEnd);
+
+ if (isPointAModKeys(pMask))
+ {
+ setTempA(rayStart, rayEnd);
+ if (hasFinalB())
+ {
+ setTempB(getFinalBStart(), getFinalBEnd());
+ }
+ }
+ else if (isPointBModKeys(pMask))
+ {
+ if (hasFinalA())
+ {
+ setTempA(getFinalAStart(), getFinalAEnd());
+ }
+ setTempB(rayStart, rayEnd);
+ }
+ computeTempPath();
+}
+
+void LLPathfindingPathTool::setFinalA(const LLVector3 &pStartPoint, const LLVector3 &pEndPoint)
+{
+ mFinalPathData.mStartPointA = pStartPoint;
+ mFinalPathData.mEndPointA = pEndPoint;
+ mFinalPathData.mHasPointA = true;
+}
+
+bool LLPathfindingPathTool::hasFinalA() const
+{
+ return mFinalPathData.mHasPointA;
+}
+
+const LLVector3 &LLPathfindingPathTool::getFinalAStart() const
+{
+ return mFinalPathData.mStartPointA;
+}
+
+const LLVector3 &LLPathfindingPathTool::getFinalAEnd() const
+{
+ return mFinalPathData.mEndPointA;
+}
+
+void LLPathfindingPathTool::setTempA(const LLVector3 &pStartPoint, const LLVector3 &pEndPoint)
+{
+ mTempPathData.mStartPointA = pStartPoint;
+ mTempPathData.mEndPointA = pEndPoint;
+ mTempPathData.mHasPointA = true;
+}
+
+bool LLPathfindingPathTool::hasTempA() const
+{
+ return mTempPathData.mHasPointA;
+}
+
+void LLPathfindingPathTool::setFinalB(const LLVector3 &pStartPoint, const LLVector3 &pEndPoint)
+{
+ mFinalPathData.mStartPointB = pStartPoint;
+ mFinalPathData.mEndPointB = pEndPoint;
+ mFinalPathData.mHasPointB = true;
+}
+
+bool LLPathfindingPathTool::hasFinalB() const
+{
+ return mFinalPathData.mHasPointB;
+}
+
+const LLVector3 &LLPathfindingPathTool::getFinalBStart() const
+{
+ return mFinalPathData.mStartPointB;
+}
+
+const LLVector3 &LLPathfindingPathTool::getFinalBEnd() const
+{
+ return mFinalPathData.mEndPointB;
+}
+
+void LLPathfindingPathTool::setTempB(const LLVector3 &pStartPoint, const LLVector3 &pEndPoint)
+{
+ mTempPathData.mStartPointB = pStartPoint;
+ mTempPathData.mEndPointB = pEndPoint;
+ mTempPathData.mHasPointB = true;
+}
+
+bool LLPathfindingPathTool::hasTempB() const
+{
+ return mTempPathData.mHasPointB;
+}
+
+void LLPathfindingPathTool::clearFinal()
+{
+ mFinalPathData.mHasPointA = false;
+ mFinalPathData.mHasPointB = false;
+}
+
+void LLPathfindingPathTool::clearTemp()
+{
+ mTempPathData.mHasPointA = false;
+ mTempPathData.mHasPointB = false;
+}
+
+void LLPathfindingPathTool::computeFinalPath()
+{
+ mPathResult = LLPathingLib::LLPL_NO_PATH;
+ if (LLPathingLib::getInstance() != NULL)
+ {
+ mPathResult = LLPathingLib::getInstance()->generatePath(mFinalPathData);
+ }
+ mPathEventSignal();
+}
+
+void LLPathfindingPathTool::computeTempPath()
+{
+ mPathResult = LLPathingLib::LLPL_NO_PATH;
+ if (LLPathingLib::getInstance() != NULL)
+ {
+ mPathResult = LLPathingLib::getInstance()->generatePath(mTempPathData);
+ }
+ mPathEventSignal();
+}
diff --git a/indra/newview/llpathfindingpathtool.h b/indra/newview/llpathfindingpathtool.h
new file mode 100644
index 0000000000..97284265f1
--- /dev/null
+++ b/indra/newview/llpathfindingpathtool.h
@@ -0,0 +1,138 @@
+/**
+* @file llpathfindingpathtool.h
+* @brief Header file for llpathfindingpathtool
+* @author Stinson@lindenlab.com
+*
+* $LicenseInfo:firstyear=2012&license=viewerlgpl$
+* Second Life Viewer Source Code
+* Copyright (C) 2012, Linden Research, Inc.
+*
+* This library is free software; you can redistribute it and/or
+* modify it under the terms of the GNU Lesser General Public
+* License as published by the Free Software Foundation;
+* version 2.1 of the License only.
+*
+* This library is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this library; if not, write to the Free Software
+* 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_LLPATHFINDINGPATHTOOL_H
+#define LL_LLPATHFINDINGPATHTOOL_H
+
+#include <boost/function.hpp>
+#include <boost/signals2.hpp>
+
+#include "llpathinglib.h"
+#include "llsingleton.h"
+#include "lltool.h"
+
+class LLPathfindingPathTool : public LLTool, public LLSingleton<LLPathfindingPathTool>
+{
+public:
+ typedef enum
+ {
+ kPathStatusUnknown,
+ kPathStatusChooseStartAndEndPoints,
+ kPathStatusChooseStartPoint,
+ kPathStatusChooseEndPoint,
+ kPathStatusHasValidPath,
+ kPathStatusHasInvalidPath,
+ kPathStatusNotEnabled,
+ kPathStatusNotImplemented,
+ kPathStatusError
+ } EPathStatus;
+
+ typedef enum
+ {
+ kCharacterTypeNone,
+ kCharacterTypeA,
+ kCharacterTypeB,
+ kCharacterTypeC,
+ kCharacterTypeD
+ } ECharacterType;
+
+ LLPathfindingPathTool();
+ virtual ~LLPathfindingPathTool();
+
+ typedef boost::function<void (void)> path_event_callback_t;
+ typedef boost::signals2::signal<void (void)> path_event_signal_t;
+ typedef boost::signals2::connection path_event_slot_t;
+
+ virtual BOOL handleMouseDown(S32 pX, S32 pY, MASK pMask);
+ virtual BOOL handleMouseUp(S32 pX, S32 pY, MASK pMask);
+ virtual BOOL handleMiddleMouseDown(S32 pX, S32 pY, MASK pMask);
+ virtual BOOL handleMiddleMouseUp(S32 pX, S32 pY, MASK pMask);
+ virtual BOOL handleRightMouseDown(S32 pX, S32 pY, MASK pMask);
+ virtual BOOL handleRightMouseUp(S32 pX, S32 pY, MASK pMask);
+ virtual BOOL handleDoubleClick(S32 x, S32 y, MASK mask);
+
+ virtual BOOL handleHover(S32 pX, S32 pY, MASK pMask);
+
+ virtual BOOL handleKey(KEY pKey, MASK pMask);
+
+ EPathStatus getPathStatus() const;
+
+ F32 getCharacterWidth() const;
+ void setCharacterWidth(F32 pCharacterWidth);
+
+ ECharacterType getCharacterType() const;
+ void setCharacterType(ECharacterType pCharacterType);
+
+ bool isRenderPath() const;
+ void clearPath();
+
+ path_event_slot_t registerPathEventListener(path_event_callback_t pPathEventCallback);
+
+protected:
+
+private:
+ bool isAnyPathToolModKeys(MASK pMask) const;
+ bool isPointAModKeys(MASK pMask) const;
+ bool isPointBModKeys(MASK pMask) const;
+ bool isCameraModKeys(MASK pMask) const;
+
+ void getRayPoints(S32 pX, S32 pY, LLVector3 &pRayStart, LLVector3 &pRayEnd) const;
+ void computeFinalPoints(S32 pX, S32 pY, MASK pMask);
+ void computeTempPoints(S32 pX, S32 pY, MASK pMask);
+
+ void setFinalA(const LLVector3 &pStartPoint, const LLVector3 &pEndPoint);
+ bool hasFinalA() const;
+ const LLVector3 &getFinalAStart() const;
+ const LLVector3 &getFinalAEnd() const;
+
+ void setTempA(const LLVector3 &pStartPoint, const LLVector3 &pEndPoint);
+ bool hasTempA() const;
+
+ void setFinalB(const LLVector3 &pStartPoint, const LLVector3 &pEndPoint);
+ bool hasFinalB() const;
+ const LLVector3 &getFinalBStart() const;
+ const LLVector3 &getFinalBEnd() const;
+
+ void setTempB(const LLVector3 &pStartPoint, const LLVector3 &pEndPoint);
+ bool hasTempB() const;
+
+ void clearFinal();
+ void clearTemp();
+
+ void computeFinalPath();
+ void computeTempPath();
+
+ LLPathingLib::PathingPacket mFinalPathData;
+ LLPathingLib::PathingPacket mTempPathData;
+ LLPathingLib::LLPLResult mPathResult;
+ ECharacterType mCharacterType;
+ path_event_signal_t mPathEventSignal;
+ bool mIsLeftMouseButtonHeld;
+ bool mIsMiddleMouseButtonHeld;
+ bool mIsRightMouseButtonHeld;
+};
+
+#endif // LL_LLPATHFINDINGPATHTOOL_H
diff --git a/indra/newview/llphysicsmotion.cpp b/indra/newview/llphysicsmotion.cpp
index e124916c48..cb6989c9dd 100644
--- a/indra/newview/llphysicsmotion.cpp
+++ b/indra/newview/llphysicsmotion.cpp
@@ -67,6 +67,19 @@ inline F64 llsgn(const F64 a)
class LLPhysicsMotion
{
public:
+ typedef enum
+ {
+ SMOOTHING = 0,
+ MASS,
+ GRAVITY,
+ SPRING,
+ GAIN,
+ DAMPING,
+ DRAG,
+ MAX_EFFECT,
+ NUM_PARAMS
+ } eParamName;
+
/*
param_driver_name: The param that controls the params that are being affected by the physics.
joint_name: The joint that the body part is attached to. The joint is
@@ -98,6 +111,11 @@ public:
mPositionLastUpdate_local(0)
{
mJointState = new LLJointState;
+
+ for (U32 i = 0; i < NUM_PARAMS; ++i)
+ {
+ mParamCache[i] = NULL;
+ }
}
BOOL initialize();
@@ -111,16 +129,43 @@ public:
return mJointState;
}
protected:
- F32 getParamValue(const std::string& controller_key)
- {
- const controller_map_t::const_iterator& entry = mParamControllers.find(controller_key);
+
+ F32 getParamValue(eParamName param)
+ {
+ static std::string controller_key[] =
+ {
+ "Smoothing",
+ "Mass",
+ "Gravity",
+ "Spring",
+ "Gain",
+ "Damping",
+ "Drag",
+ "MaxEffect"
+ };
+
+ if (!mParamCache[param])
+ {
+ const controller_map_t::const_iterator& entry = mParamControllers.find(controller_key[param]);
if (entry == mParamControllers.end())
{
- return sDefaultController[controller_key];
+ return sDefaultController[controller_key[param]];
}
const std::string& param_name = (*entry).second.c_str();
- return mCharacter->getVisualParamWeight(param_name.c_str());
- }
+ mParamCache[param] = mCharacter->getVisualParam(param_name.c_str());
+ }
+
+ if (mParamCache[param])
+ {
+ return mParamCache[param]->getWeight();
+ }
+ else
+ {
+ return sDefaultController[controller_key[param]];
+ }
+ }
+
+
void setParamValue(LLViewerVisualParam *param,
const F32 new_value_local,
F32 behavior_maxeffect);
@@ -150,6 +195,8 @@ private:
F32 mLastTime;
+ LLVisualParam* mParamCache[NUM_PARAMS];
+
static default_controller_map_t sDefaultController;
};
@@ -427,7 +474,6 @@ BOOL LLPhysicsMotionController::onUpdate(F32 time, U8* joint_mask)
return TRUE;
}
-
// Return TRUE if character has to update visual params.
BOOL LLPhysicsMotion::onUpdate(F32 time)
{
@@ -471,15 +517,16 @@ BOOL LLPhysicsMotion::onUpdate(F32 time)
LLJoint *joint = mJointState->getJoint();
- const F32 behavior_mass = getParamValue("Mass");
- const F32 behavior_gravity = getParamValue("Gravity");
- const F32 behavior_spring = getParamValue("Spring");
- const F32 behavior_gain = getParamValue("Gain");
- const F32 behavior_damping = getParamValue("Damping");
- const F32 behavior_drag = getParamValue("Drag");
- const BOOL physics_test = FALSE; // Enable this to simulate bouncing on all parts.
+ const F32 behavior_mass = getParamValue(MASS);
+ const F32 behavior_gravity = getParamValue(GRAVITY);
+ const F32 behavior_spring = getParamValue(SPRING);
+ const F32 behavior_gain = getParamValue(GAIN);
+ const F32 behavior_damping = getParamValue(DAMPING);
+ const F32 behavior_drag = getParamValue(DRAG);
+ F32 behavior_maxeffect = getParamValue(MAX_EFFECT);
+
+ 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;
diff --git a/indra/newview/llpolymesh.cpp b/indra/newview/llpolymesh.cpp
index 450f9b2be7..70f3b5335e 100644
--- a/indra/newview/llpolymesh.cpp
+++ b/indra/newview/llpolymesh.cpp
@@ -129,22 +129,22 @@ void LLPolyMeshSharedData::freeMeshData()
{
mNumVertices = 0;
- delete [] mBaseCoords;
+ ll_aligned_free_16(mBaseCoords);
mBaseCoords = NULL;
- delete [] mBaseNormals;
+ ll_aligned_free_16(mBaseNormals);
mBaseNormals = NULL;
- delete [] mBaseBinormals;
+ ll_aligned_free_16(mBaseBinormals);
mBaseBinormals = NULL;
- delete [] mTexCoords;
+ ll_aligned_free_16(mTexCoords);
mTexCoords = NULL;
- delete [] mDetailTexCoords;
+ ll_aligned_free_16(mDetailTexCoords);
mDetailTexCoords = NULL;
- delete [] mWeights;
+ ll_aligned_free_16(mWeights);
mWeights = NULL;
}
@@ -229,15 +229,19 @@ U32 LLPolyMeshSharedData::getNumKB()
BOOL LLPolyMeshSharedData::allocateVertexData( U32 numVertices )
{
U32 i;
- mBaseCoords = new LLVector3[ numVertices ];
- mBaseNormals = new LLVector3[ numVertices ];
- mBaseBinormals = new LLVector3[ numVertices ];
- mTexCoords = new LLVector2[ numVertices ];
- mDetailTexCoords = new LLVector2[ numVertices ];
- mWeights = new F32[ numVertices ];
+ mBaseCoords = (LLVector4a*) ll_aligned_malloc_16(numVertices*sizeof(LLVector4a));
+ mBaseNormals = (LLVector4a*) ll_aligned_malloc_16(numVertices*sizeof(LLVector4a));
+ mBaseBinormals = (LLVector4a*) ll_aligned_malloc_16(numVertices*sizeof(LLVector4a));
+ mTexCoords = (LLVector2*) ll_aligned_malloc_16(numVertices*sizeof(LLVector2));
+ mDetailTexCoords = (LLVector2*) ll_aligned_malloc_16(numVertices*sizeof(LLVector2));
+ mWeights = (F32*) ll_aligned_malloc_16(numVertices*sizeof(F32));
for (i = 0; i < numVertices; i++)
{
- mWeights[i] = 0.f;
+ mBaseCoords[i].clear();
+ mBaseNormals[i].clear();
+ mBaseBinormals[i].clear();
+ mTexCoords[i].clear();
+ mWeights[i] = 0.f;
}
mNumVertices = numVertices;
return TRUE;
@@ -408,39 +412,47 @@ BOOL LLPolyMeshSharedData::loadMesh( const std::string& fileName )
allocateVertexData( numVertices );
- //----------------------------------------------------------------
- // Coords
- //----------------------------------------------------------------
- numRead = fread(mBaseCoords, 3*sizeof(float), numVertices, fp);
- llendianswizzle(mBaseCoords, sizeof(float), 3*numVertices);
- if (numRead != numVertices)
- {
- llerrs << "can't read Coordinates from " << fileName << llendl;
- return FALSE;
- }
-
- //----------------------------------------------------------------
- // Normals
- //----------------------------------------------------------------
- numRead = fread(mBaseNormals, 3*sizeof(float), numVertices, fp);
- llendianswizzle(mBaseNormals, sizeof(float), 3*numVertices);
- if (numRead != numVertices)
- {
- llerrs << " can't read Normals from " << fileName << llendl;
- return FALSE;
- }
-
- //----------------------------------------------------------------
- // Binormals
- //----------------------------------------------------------------
- numRead = fread(mBaseBinormals, 3*sizeof(float), numVertices, fp);
- llendianswizzle(mBaseBinormals, sizeof(float), 3*numVertices);
- if (numRead != numVertices)
- {
- llerrs << " can't read Binormals from " << fileName << llendl;
- return FALSE;
- }
-
+ for (U16 i = 0; i < numVertices; ++i)
+ {
+ //----------------------------------------------------------------
+ // Coords
+ //----------------------------------------------------------------
+ numRead = fread(&mBaseCoords[i], sizeof(float), 3, fp);
+ llendianswizzle(&mBaseCoords[i], sizeof(float), 3);
+ if (numRead != 3)
+ {
+ llerrs << "can't read Coordinates from " << fileName << llendl;
+ return FALSE;
+ }
+ }
+
+ for (U16 i = 0; i < numVertices; ++i)
+ {
+ //----------------------------------------------------------------
+ // Normals
+ //----------------------------------------------------------------
+ numRead = fread(&mBaseNormals[i], sizeof(float), 3, fp);
+ llendianswizzle(&mBaseNormals[i], sizeof(float), 3);
+ if (numRead != 3)
+ {
+ llerrs << " can't read Normals from " << fileName << llendl;
+ return FALSE;
+ }
+ }
+
+ for (U16 i = 0; i < numVertices; ++i)
+ {
+ //----------------------------------------------------------------
+ // Binormals
+ //----------------------------------------------------------------
+ numRead = fread(&mBaseBinormals[i], sizeof(float), 3, fp);
+ llendianswizzle(&mBaseBinormals[i], sizeof(float), 3);
+ if (numRead != 3)
+ {
+ llerrs << " can't read Binormals from " << fileName << llendl;
+ return FALSE;
+ }
+ }
//----------------------------------------------------------------
// TexCoords
@@ -767,21 +779,28 @@ LLPolyMesh::LLPolyMesh(LLPolyMeshSharedData *shared_data, LLPolyMesh *reference_
{
// 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);
+ S32 nverts = mSharedData->mNumVertices;
+ //make sure it's an even number of verts for alignment
+ nverts += nverts%2;
+ S32 nfloats = nverts * (
+ 4 + //coords
+ 4 + //normals
+ 4 + //weights
+ 2 + //coords
+ 4 + //scaled normals
+ 4 + //binormals
+ 4); //scaled binormals
+
//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;
+ S32 offset = 0;
+ mCoords = (LLVector4a*)(mVertexData + offset); offset += 4*nverts;
+ mNormals = (LLVector4a*)(mVertexData + offset); offset += 4*nverts;
+ mClothingWeights = (LLVector4a*)(mVertexData + offset); offset += 4*nverts;
+ mTexCoords = (LLVector2*)(mVertexData + offset); offset += 2*nverts;
+ mScaledNormals = (LLVector4a*)(mVertexData + offset); offset += 4*nverts;
+ mBinormals = (LLVector4a*)(mVertexData + offset); offset += 4*nverts;
+ mScaledBinormals = (LLVector4a*)(mVertexData + offset); offset += 4*nverts;
initializeForMorph();
}
}
@@ -906,7 +925,7 @@ void LLPolyMesh::dumpDiagInfo()
//-----------------------------------------------------------------------------
// getWritableCoords()
//-----------------------------------------------------------------------------
-LLVector4 *LLPolyMesh::getWritableCoords()
+LLVector4a *LLPolyMesh::getWritableCoords()
{
return mCoords;
}
@@ -914,7 +933,7 @@ LLVector4 *LLPolyMesh::getWritableCoords()
//-----------------------------------------------------------------------------
// getWritableNormals()
//-----------------------------------------------------------------------------
-LLVector4 *LLPolyMesh::getWritableNormals()
+LLVector4a *LLPolyMesh::getWritableNormals()
{
return mNormals;
}
@@ -922,7 +941,7 @@ LLVector4 *LLPolyMesh::getWritableNormals()
//-----------------------------------------------------------------------------
// getWritableBinormals()
//-----------------------------------------------------------------------------
-LLVector3 *LLPolyMesh::getWritableBinormals()
+LLVector4a *LLPolyMesh::getWritableBinormals()
{
return mBinormals;
}
@@ -931,7 +950,7 @@ LLVector3 *LLPolyMesh::getWritableBinormals()
//-----------------------------------------------------------------------------
// getWritableClothingWeights()
//-----------------------------------------------------------------------------
-LLVector4 *LLPolyMesh::getWritableClothingWeights()
+LLVector4a *LLPolyMesh::getWritableClothingWeights()
{
return mClothingWeights;
}
@@ -947,7 +966,7 @@ LLVector2 *LLPolyMesh::getWritableTexCoords()
//-----------------------------------------------------------------------------
// getScaledNormals()
//-----------------------------------------------------------------------------
-LLVector3 *LLPolyMesh::getScaledNormals()
+LLVector4a *LLPolyMesh::getScaledNormals()
{
return mScaledNormals;
}
@@ -955,7 +974,7 @@ LLVector3 *LLPolyMesh::getScaledNormals()
//-----------------------------------------------------------------------------
// getScaledBinormals()
//-----------------------------------------------------------------------------
-LLVector3 *LLPolyMesh::getScaledBinormals()
+LLVector4a *LLPolyMesh::getScaledBinormals()
{
return mScaledBinormals;
}
@@ -966,17 +985,17 @@ LLVector3 *LLPolyMesh::getScaledBinormals()
//-----------------------------------------------------------------------------
void LLPolyMesh::initializeForMorph()
{
- for (U32 i = 0; i < mSharedData->mNumVertices; ++i)
+ LLVector4a::memcpyNonAliased16((F32*) mCoords, (F32*) mSharedData->mBaseCoords, sizeof(LLVector4a) * mSharedData->mNumVertices);
+ LLVector4a::memcpyNonAliased16((F32*) mNormals, (F32*) mSharedData->mBaseNormals, sizeof(LLVector4a) * mSharedData->mNumVertices);
+ LLVector4a::memcpyNonAliased16((F32*) mScaledNormals, (F32*) mSharedData->mBaseNormals, sizeof(LLVector4a) * mSharedData->mNumVertices);
+ LLVector4a::memcpyNonAliased16((F32*) mBinormals, (F32*) mSharedData->mBaseNormals, sizeof(LLVector4a) * mSharedData->mNumVertices);
+ LLVector4a::memcpyNonAliased16((F32*) mScaledBinormals, (F32*) mSharedData->mBaseNormals, sizeof(LLVector4a) * mSharedData->mNumVertices);
+ LLVector4a::memcpyNonAliased16((F32*) mTexCoords, (F32*) mSharedData->mTexCoords, sizeof(LLVector2) * (mSharedData->mNumVertices + mSharedData->mNumVertices%2));
+
+ for (U32 i = 0; i < mSharedData->mNumVertices; ++i)
{
- mCoords[i] = LLVector4(mSharedData->mBaseCoords[i]);
- mNormals[i] = LLVector4(mSharedData->mBaseNormals[i]);
+ mClothingWeights[i].clear();
}
-
- 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);
}
//-----------------------------------------------------------------------------
@@ -1098,7 +1117,7 @@ BOOL LLPolySkeletalDistortionInfo::parseXml(LLXmlTreeNode* node)
LLPolySkeletalDistortion::LLPolySkeletalDistortion(LLVOAvatar *avatarp)
{
mAvatar = avatarp;
- mDefaultVec.setVec(0.001f, 0.001f, 0.001f);
+ mDefaultVec.splat(0.001f);
}
//-----------------------------------------------------------------------------
@@ -1171,8 +1190,12 @@ BOOL LLPolySkeletalDistortion::setInfo(LLPolySkeletalDistortionInfo *info)
//-----------------------------------------------------------------------------
// apply()
//-----------------------------------------------------------------------------
+static LLFastTimer::DeclareTimer FTM_POLYSKELETAL_DISTORTION_APPLY("Skeletal Distortion");
+
void LLPolySkeletalDistortion::apply( ESex avatar_sex )
{
+ LLFastTimer t(FTM_POLYSKELETAL_DISTORTION_APPLY);
+
F32 effective_weight = ( getSex() & avatar_sex ) ? mCurWeight : getDefaultWeight();
LLJoint* joint;
@@ -1228,11 +1251,14 @@ LLPolyMorphData *clone_morph_param_direction(const LLPolyMorphData *src_data,
{
LLPolyMorphData* cloned_morph_data = new LLPolyMorphData(*src_data);
cloned_morph_data->mName = name;
+ LLVector4a dir;
+ dir.load3(direction.mV);
+
for (U32 v=0; v < cloned_morph_data->mNumIndices; v++)
{
- cloned_morph_data->mCoords[v] = direction;
- cloned_morph_data->mNormals[v] = LLVector3(0,0,0);
- cloned_morph_data->mBinormals[v] = LLVector3(0,0,0);
+ cloned_morph_data->mCoords[v] = dir;
+ cloned_morph_data->mNormals[v].clear();
+ cloned_morph_data->mBinormals[v].clear();
}
return cloned_morph_data;
}
@@ -1243,17 +1269,27 @@ LLPolyMorphData *clone_morph_param_cleavage(const LLPolyMorphData *src_data,
{
LLPolyMorphData* cloned_morph_data = new LLPolyMorphData(*src_data);
cloned_morph_data->mName = name;
+
+ LLVector4a sc;
+ sc.splat(scale);
+
+ LLVector4a nsc;
+ nsc.set(scale, -scale, scale, scale);
+
for (U32 v=0; v < cloned_morph_data->mNumIndices; v++)
{
- cloned_morph_data->mCoords[v] = src_data->mCoords[v]*scale;
- cloned_morph_data->mNormals[v] = src_data->mNormals[v]*scale;
- cloned_morph_data->mBinormals[v] = src_data->mBinormals[v]*scale;
- if (cloned_morph_data->mCoords[v][1] < 0)
- {
- cloned_morph_data->mCoords[v][1] *= -1;
- cloned_morph_data->mNormals[v][1] *= -1;
- cloned_morph_data->mBinormals[v][1] *= -1;
- }
+ if (cloned_morph_data->mCoords[v][1] < 0)
+ {
+ cloned_morph_data->mCoords[v].setMul(src_data->mCoords[v],nsc);
+ cloned_morph_data->mNormals[v].setMul(src_data->mNormals[v],nsc);
+ cloned_morph_data->mBinormals[v].setMul(src_data->mBinormals[v],nsc);
+ }
+ else
+ {
+ cloned_morph_data->mCoords[v].setMul(src_data->mCoords[v],sc);
+ cloned_morph_data->mNormals[v].setMul(src_data->mNormals[v], sc);
+ cloned_morph_data->mBinormals[v].setMul(src_data->mBinormals[v],sc);
+ }
}
return cloned_morph_data;
}
diff --git a/indra/newview/llpolymesh.h b/indra/newview/llpolymesh.h
index ba2bf85570..ffb11a3f7e 100644
--- a/indra/newview/llpolymesh.h
+++ b/indra/newview/llpolymesh.h
@@ -73,9 +73,9 @@ private:
// vertex data
S32 mNumVertices;
- LLVector3 *mBaseCoords;
- LLVector3 *mBaseNormals;
- LLVector3 *mBaseBinormals;
+ LLVector4a *mBaseCoords;
+ LLVector4a *mBaseNormals;
+ LLVector4a *mBaseBinormals;
LLVector2 *mTexCoords;
LLVector2 *mDetailTexCoords;
F32 *mWeights;
@@ -217,41 +217,41 @@ public:
}
// Get coords
- const LLVector4 *getCoords() const{
+ const LLVector4a *getCoords() const{
return mCoords;
}
// non const version
- LLVector4 *getWritableCoords();
+ LLVector4a *getWritableCoords();
// Get normals
- const LLVector4 *getNormals() const{
+ const LLVector4a *getNormals() const{
return mNormals;
}
// Get normals
- const LLVector3 *getBinormals() const{
+ const LLVector4a *getBinormals() const{
return mBinormals;
}
// Get base mesh normals
- const LLVector3 *getBaseNormals() const{
+ const LLVector4a *getBaseNormals() const{
llassert(mSharedData);
return mSharedData->mBaseNormals;
}
// Get base mesh normals
- const LLVector3 *getBaseBinormals() const{
+ const LLVector4a *getBaseBinormals() const{
llassert(mSharedData);
return mSharedData->mBaseBinormals;
}
// intermediate morphed normals and output normals
- LLVector4 *getWritableNormals();
- LLVector3 *getScaledNormals();
+ LLVector4a *getWritableNormals();
+ LLVector4a *getScaledNormals();
- LLVector3 *getWritableBinormals();
- LLVector3 *getScaledBinormals();
+ LLVector4a *getWritableBinormals();
+ LLVector4a *getScaledBinormals();
// Get texCoords
const LLVector2 *getTexCoords() const {
@@ -275,9 +275,9 @@ public:
F32 *getWritableWeights() const;
- LLVector4 *getWritableClothingWeights();
+ LLVector4a *getWritableClothingWeights();
- const LLVector4 *getClothingWeights()
+ const LLVector4a *getClothingWeights()
{
return mClothingWeights;
}
@@ -341,17 +341,17 @@ protected:
// Single array of floats for allocation / deletion
F32 *mVertexData;
// deformed vertices (resulting from application of morph targets)
- LLVector4 *mCoords;
+ LLVector4a *mCoords;
// deformed normals (resulting from application of morph targets)
- LLVector3 *mScaledNormals;
+ LLVector4a *mScaledNormals;
// output normals (after normalization)
- LLVector4 *mNormals;
+ LLVector4a *mNormals;
// deformed binormals (resulting from application of morph targets)
- LLVector3 *mScaledBinormals;
+ LLVector4a *mScaledBinormals;
// output binormals (after normalization)
- LLVector3 *mBinormals;
+ LLVector4a *mBinormals;
// weight values that mark verts as clothing/skin
- LLVector4 *mClothingWeights;
+ LLVector4a *mClothingWeights;
// output texture coordinates
LLVector2 *mTexCoords;
@@ -419,17 +419,17 @@ public:
// LLViewerVisualParam Virtual functions
/*virtual*/ F32 getTotalDistortion() { return 0.1f; }
- /*virtual*/ const LLVector3& getAvgDistortion() { return mDefaultVec; }
+ /*virtual*/ const LLVector4a& getAvgDistortion() { return mDefaultVec; }
/*virtual*/ F32 getMaxDistortion() { return 0.1f; }
- /*virtual*/ LLVector3 getVertexDistortion(S32 index, LLPolyMesh *poly_mesh){return LLVector3(0.001f, 0.001f, 0.001f);}
- /*virtual*/ const LLVector3* getFirstDistortion(U32 *index, LLPolyMesh **poly_mesh){index = 0; poly_mesh = NULL; return &mDefaultVec;};
- /*virtual*/ const LLVector3* getNextDistortion(U32 *index, LLPolyMesh **poly_mesh){index = 0; poly_mesh = NULL; return NULL;};
+ /*virtual*/ LLVector4a getVertexDistortion(S32 index, LLPolyMesh *poly_mesh){return LLVector4a(0.001f, 0.001f, 0.001f);}
+ /*virtual*/ const LLVector4a* getFirstDistortion(U32 *index, LLPolyMesh **poly_mesh){index = 0; poly_mesh = NULL; return &mDefaultVec;};
+ /*virtual*/ const LLVector4a* getNextDistortion(U32 *index, LLPolyMesh **poly_mesh){index = 0; poly_mesh = NULL; return NULL;};
protected:
typedef std::map<LLJoint*, LLVector3> joint_vec_map_t;
joint_vec_map_t mJointScales;
joint_vec_map_t mJointOffsets;
- LLVector3 mDefaultVec;
+ LLVector4a mDefaultVec;
// Backlink only; don't make this an LLPointer.
LLVOAvatar *mAvatar;
};
diff --git a/indra/newview/llpolymorph.cpp b/indra/newview/llpolymorph.cpp
index cefd7df3fe..d25d1420ee 100644
--- a/indra/newview/llpolymorph.cpp
+++ b/indra/newview/llpolymorph.cpp
@@ -48,7 +48,7 @@ LLPolyMorphData::LLPolyMorphData(const std::string& morph_name)
mNumIndices = 0;
mCurrentIndex = 0;
mTotalDistortion = 0.f;
- mAvgDistortion.zeroVec();
+ mAvgDistortion.clear();
mMaxDistortion = 0.f;
mVertexIndices = NULL;
mCoords = NULL;
@@ -73,9 +73,9 @@ LLPolyMorphData::LLPolyMorphData(const LLPolyMorphData &rhs) :
{
const S32 numVertices = mNumIndices;
- mCoords = new LLVector3[numVertices];
- mNormals = new LLVector3[numVertices];
- mBinormals = new LLVector3[numVertices];
+ mCoords = new LLVector4a[numVertices];
+ mNormals = new LLVector4a[numVertices];
+ mBinormals = new LLVector4a[numVertices];
mTexCoords = new LLVector2[numVertices];
mVertexIndices = new U32[numVertices];
@@ -121,16 +121,16 @@ BOOL LLPolyMorphData::loadBinary(LLFILE *fp, LLPolyMeshSharedData *mesh)
//-------------------------------------------------------------------------
// allocate vertices
//-------------------------------------------------------------------------
- mCoords = new LLVector3[numVertices];
- mNormals = new LLVector3[numVertices];
- mBinormals = new LLVector3[numVertices];
+ mCoords = new LLVector4a[numVertices];
+ mNormals = new LLVector4a[numVertices];
+ mBinormals = new LLVector4a[numVertices];
mTexCoords = new LLVector2[numVertices];
// Actually, we are allocating more space than we need for the skiplist
mVertexIndices = new U32[numVertices];
mNumIndices = 0;
mTotalDistortion = 0.f;
mMaxDistortion = 0.f;
- mAvgDistortion.zeroVec();
+ mAvgDistortion.clear();
mMesh = mesh;
//-------------------------------------------------------------------------
@@ -152,36 +152,36 @@ BOOL LLPolyMorphData::loadBinary(LLFILE *fp, LLPolyMeshSharedData *mesh)
}
- numRead = fread(&mCoords[v].mV, sizeof(F32), 3, fp);
- llendianswizzle(&mCoords[v].mV, sizeof(F32), 3);
+ numRead = fread(&mCoords[v], sizeof(F32), 3, fp);
+ llendianswizzle(&mCoords[v], sizeof(F32), 3);
if (numRead != 3)
{
llwarns << "Can't read morph target vertex coordinates" << llendl;
return FALSE;
}
- F32 magnitude = mCoords[v].magVec();
+ F32 magnitude = mCoords[v].getLength3().getF32();
mTotalDistortion += magnitude;
- mAvgDistortion.mV[VX] += fabs(mCoords[v].mV[VX]);
- mAvgDistortion.mV[VY] += fabs(mCoords[v].mV[VY]);
- mAvgDistortion.mV[VZ] += fabs(mCoords[v].mV[VZ]);
+ LLVector4a t;
+ t.setAbs(mCoords[v]);
+ mAvgDistortion.add(t);
if (magnitude > mMaxDistortion)
{
mMaxDistortion = magnitude;
}
- numRead = fread(&mNormals[v].mV, sizeof(F32), 3, fp);
- llendianswizzle(&mNormals[v].mV, sizeof(F32), 3);
+ numRead = fread(&mNormals[v], sizeof(F32), 3, fp);
+ llendianswizzle(&mNormals[v], sizeof(F32), 3);
if (numRead != 3)
{
llwarns << "Can't read morph target normal" << llendl;
return FALSE;
}
- numRead = fread(&mBinormals[v].mV, sizeof(F32), 3, fp);
- llendianswizzle(&mBinormals[v].mV, sizeof(F32), 3);
+ numRead = fread(&mBinormals[v], sizeof(F32), 3, fp);
+ llendianswizzle(&mBinormals[v], sizeof(F32), 3);
if (numRead != 3)
{
llwarns << "Can't read morph target binormal" << llendl;
@@ -200,8 +200,8 @@ BOOL LLPolyMorphData::loadBinary(LLFILE *fp, LLPolyMeshSharedData *mesh)
mNumIndices++;
}
- mAvgDistortion = mAvgDistortion * (1.f/(F32)mNumIndices);
- mAvgDistortion.normVec();
+ mAvgDistortion.mul(1.f/(F32)mNumIndices);
+ mAvgDistortion.normalize3fast();
return TRUE;
}
@@ -367,9 +367,9 @@ BOOL LLPolyMorphTarget::parseData(LLXmlTreeNode* node)
//-----------------------------------------------------------------------------
// getVertexDistortion()
//-----------------------------------------------------------------------------
-LLVector3 LLPolyMorphTarget::getVertexDistortion(S32 requested_index, LLPolyMesh *mesh)
+LLVector4a LLPolyMorphTarget::getVertexDistortion(S32 requested_index, LLPolyMesh *mesh)
{
- if (!mMorphData || mMesh != mesh) return LLVector3::zero;
+ if (!mMorphData || mMesh != mesh) return LLVector4a::getZero();
for(U32 index = 0; index < mMorphData->mNumIndices; index++)
{
@@ -379,17 +379,17 @@ LLVector3 LLPolyMorphTarget::getVertexDistortion(S32 requested_index, LLPolyMesh
}
}
- return LLVector3::zero;
+ return LLVector4a::getZero();
}
//-----------------------------------------------------------------------------
// getFirstDistortion()
//-----------------------------------------------------------------------------
-const LLVector3 *LLPolyMorphTarget::getFirstDistortion(U32 *index, LLPolyMesh **poly_mesh)
+const LLVector4a *LLPolyMorphTarget::getFirstDistortion(U32 *index, LLPolyMesh **poly_mesh)
{
- if (!mMorphData) return &LLVector3::zero;
+ if (!mMorphData) return &LLVector4a::getZero();
- LLVector3* resultVec;
+ LLVector4a* resultVec;
mMorphData->mCurrentIndex = 0;
if (mMorphData->mNumIndices)
{
@@ -411,11 +411,11 @@ const LLVector3 *LLPolyMorphTarget::getFirstDistortion(U32 *index, LLPolyMesh **
//-----------------------------------------------------------------------------
// getNextDistortion()
//-----------------------------------------------------------------------------
-const LLVector3 *LLPolyMorphTarget::getNextDistortion(U32 *index, LLPolyMesh **poly_mesh)
+const LLVector4a *LLPolyMorphTarget::getNextDistortion(U32 *index, LLPolyMesh **poly_mesh)
{
- if (!mMorphData) return &LLVector3::zero;
+ if (!mMorphData) return &LLVector4a::getZero();
- LLVector3* resultVec;
+ LLVector4a* resultVec;
mMorphData->mCurrentIndex++;
if (mMorphData->mCurrentIndex < mMorphData->mNumIndices)
{
@@ -451,7 +451,7 @@ F32 LLPolyMorphTarget::getTotalDistortion()
//-----------------------------------------------------------------------------
// getAvgDistortion()
//-----------------------------------------------------------------------------
-const LLVector3& LLPolyMorphTarget::getAvgDistortion()
+const LLVector4a& LLPolyMorphTarget::getAvgDistortion()
{
if (mMorphData)
{
@@ -459,7 +459,7 @@ const LLVector3& LLPolyMorphTarget::getAvgDistortion()
}
else
{
- return LLVector3::zero;
+ return LLVector4a::getZero();
}
}
@@ -481,6 +481,8 @@ F32 LLPolyMorphTarget::getMaxDistortion()
//-----------------------------------------------------------------------------
// apply()
//-----------------------------------------------------------------------------
+static LLFastTimer::DeclareTimer FTM_APPLY_MORPH_TARGET("Apply Morph");
+
void LLPolyMorphTarget::apply( ESex avatar_sex )
{
if (!mMorphData || mNumMorphMasksPending > 0)
@@ -488,6 +490,8 @@ void LLPolyMorphTarget::apply( ESex avatar_sex )
return;
}
+ LLFastTimer t(FTM_APPLY_MORPH_TARGET);
+
mLastSex = avatar_sex;
// Check for NaN condition (NaN is detected if a variable doesn't equal itself.
@@ -508,15 +512,15 @@ void LLPolyMorphTarget::apply( ESex avatar_sex )
if (delta_weight != 0.f)
{
llassert(!mMesh->isLOD());
- LLVector4 *coords = mMesh->getWritableCoords();
+ LLVector4a *coords = mMesh->getWritableCoords();
- LLVector3 *scaled_normals = mMesh->getScaledNormals();
- LLVector4 *normals = mMesh->getWritableNormals();
+ LLVector4a *scaled_normals = mMesh->getScaledNormals();
+ LLVector4a *normals = mMesh->getWritableNormals();
- LLVector3 *scaled_binormals = mMesh->getScaledBinormals();
- LLVector3 *binormals = mMesh->getWritableBinormals();
+ LLVector4a *scaled_binormals = mMesh->getScaledBinormals();
+ LLVector4a *binormals = mMesh->getWritableBinormals();
- LLVector4 *clothing_weights = mMesh->getWritableClothingWeights();
+ LLVector4a *clothing_weights = mMesh->getWritableClothingWeights();
LLVector2 *tex_coords = mMesh->getWritableTexCoords();
F32 *maskWeightArray = (mVertMask) ? mVertMask->getMorphMaskWeights() : NULL;
@@ -531,31 +535,38 @@ void LLPolyMorphTarget::apply( ESex avatar_sex )
maskWeight = maskWeightArray[vert_index_morph];
}
- coords[vert_index_mesh] += LLVector4(mMorphData->mCoords[vert_index_morph] * delta_weight * maskWeight);
+
+ LLVector4a pos = mMorphData->mCoords[vert_index_morph];
+ pos.mul(delta_weight*maskWeight);
+ coords[vert_index_mesh].add(pos);
if (getInfo()->mIsClothingMorph && clothing_weights)
{
- LLVector3 clothing_offset = mMorphData->mCoords[vert_index_morph] * delta_weight * maskWeight;
- LLVector4* clothing_weight = &clothing_weights[vert_index_mesh];
- clothing_weight->mV[VX] += clothing_offset.mV[VX];
- clothing_weight->mV[VY] += clothing_offset.mV[VY];
- clothing_weight->mV[VZ] += clothing_offset.mV[VZ];
- clothing_weight->mV[VW] = maskWeight;
+ LLVector4a clothing_offset = mMorphData->mCoords[vert_index_morph];
+ clothing_offset.mul(delta_weight * maskWeight);
+ LLVector4a* clothing_weight = &clothing_weights[vert_index_mesh];
+ clothing_weight->add(clothing_offset);
+ clothing_weight->getF32ptr()[VW] = maskWeight;
}
// calculate new normals based on half angles
- 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] = LLVector4(normalized_normal);
+ LLVector4a norm = mMorphData->mNormals[vert_index_morph];
+ norm.mul(delta_weight*maskWeight*NORMAL_SOFTEN_FACTOR);
+ scaled_normals[vert_index_mesh].add(norm);
+ norm = scaled_normals[vert_index_mesh];
+ norm.normalize3fast();
+ normals[vert_index_mesh] = norm;
// calculate new binormals
- scaled_binormals[vert_index_mesh] += mMorphData->mBinormals[vert_index_morph] * delta_weight * maskWeight * NORMAL_SOFTEN_FACTOR;
- LLVector3 tangent = scaled_binormals[vert_index_mesh] % normalized_normal;
- LLVector3 normalized_binormal = normalized_normal % tangent;
- normalized_binormal.normVec();
- binormals[vert_index_mesh] = normalized_binormal;
-
+ LLVector4a binorm = mMorphData->mBinormals[vert_index_morph];
+ binorm.mul(delta_weight*maskWeight*NORMAL_SOFTEN_FACTOR);
+ scaled_binormals[vert_index_mesh].add(binorm);
+ LLVector4a tangent;
+ tangent.setCross3(scaled_binormals[vert_index_mesh], norm);
+ LLVector4a& normalized_binormal = binormals[vert_index_mesh];
+ normalized_binormal.setCross3(norm, tangent);
+ normalized_binormal.normalize3fast();
+
tex_coords[vert_index_mesh] += mMorphData->mTexCoords[vert_index_morph] * delta_weight * maskWeight;
}
@@ -582,7 +593,7 @@ void LLPolyMorphTarget::apply( ESex avatar_sex )
//-----------------------------------------------------------------------------
void LLPolyMorphTarget::applyMask(U8 *maskTextureData, S32 width, S32 height, S32 num_components, BOOL invert)
{
- LLVector4 *clothing_weights = getInfo()->mIsClothingMorph ? mMesh->getWritableClothingWeights() : NULL;
+ LLVector4a *clothing_weights = getInfo()->mIsClothingMorph ? mMesh->getWritableClothingWeights() : NULL;
if (!mVertMask)
{
@@ -596,29 +607,47 @@ void LLPolyMorphTarget::applyMask(U8 *maskTextureData, S32 width, S32 height, S3
if (maskWeights)
{
- LLVector4 *coords = mMesh->getWritableCoords();
- LLVector3 *scaled_normals = mMesh->getScaledNormals();
- LLVector3 *scaled_binormals = mMesh->getScaledBinormals();
+ LLVector4a *coords = mMesh->getWritableCoords();
+ LLVector4a *scaled_normals = mMesh->getScaledNormals();
+ LLVector4a *scaled_binormals = mMesh->getScaledBinormals();
LLVector2 *tex_coords = mMesh->getWritableTexCoords();
+ LLVector4Logical clothing_mask;
+ clothing_mask.clear();
+ clothing_mask.setElement<0>();
+ clothing_mask.setElement<1>();
+ clothing_mask.setElement<2>();
+
+
for(U32 vert = 0; vert < mMorphData->mNumIndices; vert++)
{
F32 lastMaskWeight = mLastWeight * maskWeights[vert];
S32 out_vert = mMorphData->mVertexIndices[vert];
// remove effect of existing masked morph
- 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;
+ LLVector4a t;
+ t = mMorphData->mCoords[vert];
+ t.mul(lastMaskWeight);
+ coords[out_vert].sub(t);
+
+ t = mMorphData->mNormals[vert];
+ t.mul(lastMaskWeight*NORMAL_SOFTEN_FACTOR);
+ scaled_normals[out_vert].sub(t);
+
+ t = mMorphData->mBinormals[vert];
+ t.mul(lastMaskWeight*NORMAL_SOFTEN_FACTOR);
+ scaled_binormals[out_vert].sub(t);
+
tex_coords[out_vert] -= mMorphData->mTexCoords[vert] * lastMaskWeight;
if (clothing_weights)
{
- LLVector3 clothing_offset = mMorphData->mCoords[vert] * lastMaskWeight;
- LLVector4* clothing_weight = &clothing_weights[out_vert];
- clothing_weight->mV[VX] -= clothing_offset.mV[VX];
- clothing_weight->mV[VY] -= clothing_offset.mV[VY];
- clothing_weight->mV[VZ] -= clothing_offset.mV[VZ];
+ LLVector4a clothing_offset = mMorphData->mCoords[vert];
+ clothing_offset.mul(lastMaskWeight);
+ LLVector4a* clothing_weight = &clothing_weights[out_vert];
+ LLVector4a t;
+ t.setSub(*clothing_weight, clothing_offset);
+ clothing_weight->setSelectWithMask(clothing_mask, t, *clothing_weight);
}
}
}
@@ -654,7 +683,7 @@ LLPolyVertexMask::~LLPolyVertexMask()
//-----------------------------------------------------------------------------
// generateMask()
//-----------------------------------------------------------------------------
-void LLPolyVertexMask::generateMask(U8 *maskTextureData, S32 width, S32 height, S32 num_components, BOOL invert, LLVector4 *clothing_weights)
+void LLPolyVertexMask::generateMask(U8 *maskTextureData, S32 width, S32 height, S32 num_components, BOOL invert, LLVector4a *clothing_weights)
{
// RN debug output that uses Image Debugger (http://www.cs.unc.edu/~baxter/projects/imdebug/)
// BOOL debugImg = FALSE;
@@ -698,7 +727,7 @@ void LLPolyVertexMask::generateMask(U8 *maskTextureData, S32 width, S32 height,
if (clothing_weights)
{
- clothing_weights[vertIndex].mV[VW] = mWeights[index];
+ clothing_weights[vertIndex].getF32ptr()[VW] = mWeights[index];
}
}
mWeightsGenerated = TRUE;
diff --git a/indra/newview/llpolymorph.h b/indra/newview/llpolymorph.h
index 8a024f2e9e..46e23b7792 100644
--- a/indra/newview/llpolymorph.h
+++ b/indra/newview/llpolymorph.h
@@ -58,14 +58,14 @@ public:
U32 mNumIndices;
U32* mVertexIndices;
U32 mCurrentIndex;
- LLVector3* mCoords;
- LLVector3* mNormals;
- LLVector3* mBinormals;
+ LLVector4a* mCoords;
+ LLVector4a* mNormals;
+ LLVector4a* mBinormals;
LLVector2* mTexCoords;
F32 mTotalDistortion; // vertex distortion summed over entire morph
F32 mMaxDistortion; // maximum single vertex distortion in a given morph
- LLVector3 mAvgDistortion; // average vertex distortion, to infer directionality of the morph
+ LLVector4a mAvgDistortion; // average vertex distortion, to infer directionality of the morph
LLPolyMeshSharedData* mMesh;
};
@@ -78,7 +78,7 @@ public:
LLPolyVertexMask(LLPolyMorphData* morph_data);
~LLPolyVertexMask();
- void generateMask(U8 *maskData, S32 width, S32 height, S32 num_components, BOOL invert, LLVector4 *clothing_weights);
+ void generateMask(U8 *maskData, S32 width, S32 height, S32 num_components, BOOL invert, LLVector4a *clothing_weights);
F32* getMorphMaskWeights();
@@ -157,11 +157,11 @@ public:
// LLViewerVisualParam Virtual functions
/*virtual*/ F32 getTotalDistortion();
- /*virtual*/ const LLVector3& getAvgDistortion();
+ /*virtual*/ const LLVector4a& getAvgDistortion();
/*virtual*/ F32 getMaxDistortion();
- /*virtual*/ LLVector3 getVertexDistortion(S32 index, LLPolyMesh *poly_mesh);
- /*virtual*/ const LLVector3* getFirstDistortion(U32 *index, LLPolyMesh **poly_mesh);
- /*virtual*/ const LLVector3* getNextDistortion(U32 *index, LLPolyMesh **poly_mesh);
+ /*virtual*/ LLVector4a getVertexDistortion(S32 index, LLPolyMesh *poly_mesh);
+ /*virtual*/ const LLVector4a* getFirstDistortion(U32 *index, LLPolyMesh **poly_mesh);
+ /*virtual*/ const LLVector4a* getNextDistortion(U32 *index, LLPolyMesh **poly_mesh);
void applyMask(U8 *maskData, S32 width, S32 height, S32 num_components, BOOL invert);
void addPendingMorphMask() { mNumMorphMasksPending++; }
diff --git a/indra/newview/llselectmgr.cpp b/indra/newview/llselectmgr.cpp
index eec2c0a521..c3c37141ed 100644
--- a/indra/newview/llselectmgr.cpp
+++ b/indra/newview/llselectmgr.cpp
@@ -276,7 +276,7 @@ void LLSelectMgr::overrideObjectUpdates()
virtual bool apply(LLSelectNode* selectNode)
{
LLViewerObject* object = selectNode->getObject();
- if (object && object->permMove())
+ if (object && object->permMove() && !object->isPermanentEnforced())
{
if (!selectNode->mLastPositionLocal.isExactlyZero())
{
@@ -390,7 +390,7 @@ LLObjectSelectionHandle LLSelectMgr::selectObjectAndFamily(LLViewerObject* obj,
// don't include an avatar.
LLViewerObject* root = obj;
- while(!root->isAvatar() && root->getParent() && !root->isJointChild())
+ while(!root->isAvatar() && root->getParent())
{
LLViewerObject* parent = (LLViewerObject*)root->getParent();
if (parent->isAvatar())
@@ -593,6 +593,12 @@ bool LLSelectMgr::linkObjects()
return true;
}
+ if (!LLSelectMgr::getInstance()->selectGetRootsNonPermanentEnforced())
+ {
+ LLNotificationsUtil::add("CannotLinkPermanent");
+ return true;
+ }
+
LLUUID owner_id;
std::string owner_name;
if (!LLSelectMgr::getInstance()->selectGetOwner(owner_id, owner_name))
@@ -638,7 +644,9 @@ bool LLSelectMgr::enableLinkObjects()
{
virtual bool apply(LLViewerObject* object)
{
- return object->permModify();
+ LLViewerObject *root_object = (object == NULL) ? NULL : object->getRootEdit();
+ return object->permModify() && !object->isPermanentEnforced() &&
+ ((root_object == NULL) || !root_object->isPermanentEnforced());
}
} func;
const bool firstonly = true;
@@ -651,10 +659,12 @@ bool LLSelectMgr::enableLinkObjects()
bool LLSelectMgr::enableUnlinkObjects()
{
LLViewerObject* first_editable_object = LLSelectMgr::getInstance()->getSelection()->getFirstEditableObject();
+ LLViewerObject *root_object = (first_editable_object == NULL) ? NULL : first_editable_object->getRootEdit();
bool new_value = LLSelectMgr::getInstance()->selectGetAllRootsValid() &&
first_editable_object &&
- !first_editable_object->isAttachment();
+ !first_editable_object->isAttachment() && !first_editable_object->isPermanentEnforced() &&
+ ((root_object == NULL) || !root_object->isPermanentEnforced());
return new_value;
}
@@ -674,7 +684,7 @@ void LLSelectMgr::deselectObjectAndFamily(LLViewerObject* object, BOOL send_to_s
// don't include an avatar.
LLViewerObject* root = object;
- while(!root->isAvatar() && root->getParent() && !root->isJointChild())
+ while(!root->isAvatar() && root->getParent())
{
LLViewerObject* parent = (LLViewerObject*)root->getParent();
if (parent->isAvatar())
@@ -955,7 +965,7 @@ void LLSelectMgr::highlightObjectOnly(LLViewerObject* objectp)
}
if ((gSavedSettings.getBOOL("SelectOwnedOnly") && !objectp->permYouOwner())
- || (gSavedSettings.getBOOL("SelectMovableOnly") && !objectp->permMove()))
+ || (gSavedSettings.getBOOL("SelectMovableOnly") && (!objectp->permMove() || objectp->isPermanentEnforced())))
{
// only select my own objects
return;
@@ -1387,7 +1397,7 @@ void LLSelectMgr::promoteSelectionToRoot()
}
LLViewerObject* parentp = object;
- while(parentp->getParent() && !(parentp->isRootEdit() || parentp->isJointChild()))
+ while(parentp->getParent() && !(parentp->isRootEdit()))
{
parentp = (LLViewerObject*)parentp->getParent();
}
@@ -1508,6 +1518,49 @@ struct LLSelectMgrSendFunctor : public LLSelectedObjectFunctor
}
};
+void LLObjectSelection::applyNoCopyTextureToTEs(LLViewerInventoryItem* item)
+{
+ if (!item)
+ {
+ return;
+ }
+ LLViewerTexture* image = LLViewerTextureManager::getFetchedTexture(item->getAssetUUID());
+
+ for (iterator iter = begin(); iter != end(); ++iter)
+ {
+ LLSelectNode* node = *iter;
+ LLViewerObject* object = (*iter)->getObject();
+ if (!object)
+ {
+ continue;
+ }
+
+ S32 num_tes = llmin((S32)object->getNumTEs(), (S32)object->getNumFaces());
+ bool texture_copied = false;
+ for (S32 te = 0; te < num_tes; ++te)
+ {
+ if (node->isTESelected(te))
+ {
+ //(no-copy) textures must be moved to the object's inventory only once
+ // without making any copies
+ if (!texture_copied)
+ {
+ LLToolDragAndDrop::handleDropTextureProtections(object, item, LLToolDragAndDrop::SOURCE_AGENT, LLUUID::null);
+ texture_copied = true;
+ }
+
+ // apply texture for the selected faces
+ LLViewerStats::getInstance()->incStat(LLViewerStats::ST_EDIT_TEXTURE_COUNT );
+ object->setTEImage(te, image);
+ dialog_refresh_all();
+
+ // send the update to the simulator
+ object->sendTEUpdate();
+ }
+ }
+ }
+}
+
//-----------------------------------------------------------------------------
// selectionSetImage()
//-----------------------------------------------------------------------------
@@ -1559,8 +1612,18 @@ void LLSelectMgr::selectionSetImage(const LLUUID& imageid)
}
return true;
}
- } setfunc(item, imageid);
- getSelection()->applyToTEs(&setfunc);
+ };
+
+ if (item && !item->getPermissions().allowOperationBy(PERM_COPY, gAgent.getID()))
+ {
+ getSelection()->applyNoCopyTextureToTEs(item);
+ }
+ else
+ {
+ f setfunc(item, imageid);
+ getSelection()->applyToTEs(&setfunc);
+ }
+
struct g : public LLSelectedObjectFunctor
{
@@ -2286,50 +2349,6 @@ void LLSelectMgr::packObjectIDAsParam(LLSelectNode* node, void *)
}
//-----------------------------------------------------------------------------
-// Rotation options
-//-----------------------------------------------------------------------------
-void LLSelectMgr::selectionResetRotation()
-{
- struct f : public LLSelectedObjectFunctor
- {
- virtual bool apply(LLViewerObject* object)
- {
- LLQuaternion identity(0.f, 0.f, 0.f, 1.f);
- object->setRotation(identity);
- if (object->mDrawable.notNull())
- {
- gPipeline.markMoved(object->mDrawable, TRUE);
- }
- object->sendRotationUpdate();
- return true;
- }
- } func;
- getSelection()->applyToRootObjects(&func);
-}
-
-void LLSelectMgr::selectionRotateAroundZ(F32 degrees)
-{
- LLQuaternion rot( degrees * DEG_TO_RAD, LLVector3(0,0,1) );
- struct f : public LLSelectedObjectFunctor
- {
- LLQuaternion mRot;
- f(const LLQuaternion& rot) : mRot(rot) {}
- virtual bool apply(LLViewerObject* object)
- {
- object->setRotation( object->getRotationEdit() * mRot );
- if (object->mDrawable.notNull())
- {
- gPipeline.markMoved(object->mDrawable, TRUE);
- }
- object->sendRotationUpdate();
- return true;
- }
- } func(rot);
- getSelection()->applyToRootObjects(&func);
-}
-
-
-//-----------------------------------------------------------------------------
// selectionTexScaleAutofit()
//-----------------------------------------------------------------------------
void LLSelectMgr::selectionTexScaleAutofit(F32 repeats_per_meter)
@@ -2543,6 +2562,340 @@ BOOL LLSelectMgr::selectGetRootsModify()
//-----------------------------------------------------------------------------
+// selectGetNonPermanentEnforced() - return TRUE if all objects are not
+// permanent enforced
+//-----------------------------------------------------------------------------
+BOOL LLSelectMgr::selectGetNonPermanentEnforced()
+{
+ for (LLObjectSelection::iterator iter = getSelection()->begin();
+ iter != getSelection()->end(); iter++ )
+ {
+ LLSelectNode* node = *iter;
+ LLViewerObject* object = node->getObject();
+ if( !object || !node->mValid )
+ {
+ return FALSE;
+ }
+ if( object->isPermanentEnforced())
+ {
+ return FALSE;
+ }
+ }
+ return TRUE;
+}
+
+//-----------------------------------------------------------------------------
+// selectGetRootsNonPermanentEnforced() - return TRUE if all root objects are
+// not permanent enforced
+//-----------------------------------------------------------------------------
+BOOL LLSelectMgr::selectGetRootsNonPermanentEnforced()
+{
+ for (LLObjectSelection::root_iterator iter = getSelection()->root_begin();
+ iter != getSelection()->root_end(); iter++ )
+ {
+ LLSelectNode* node = *iter;
+ LLViewerObject* object = node->getObject();
+ if( !node->mValid )
+ {
+ return FALSE;
+ }
+ if( object->isPermanentEnforced())
+ {
+ return FALSE;
+ }
+ }
+
+ return TRUE;
+}
+
+//-----------------------------------------------------------------------------
+// selectGetPermanent() - return TRUE if all objects are permanent
+//-----------------------------------------------------------------------------
+BOOL LLSelectMgr::selectGetPermanent()
+{
+ for (LLObjectSelection::iterator iter = getSelection()->begin();
+ iter != getSelection()->end(); iter++ )
+ {
+ LLSelectNode* node = *iter;
+ LLViewerObject* object = node->getObject();
+ if( !object || !node->mValid )
+ {
+ return FALSE;
+ }
+ if( !object->flagObjectPermanent())
+ {
+ return FALSE;
+ }
+ }
+ return TRUE;
+}
+
+//-----------------------------------------------------------------------------
+// selectGetRootsPermanent() - return TRUE if all root objects are
+// permanent
+//-----------------------------------------------------------------------------
+BOOL LLSelectMgr::selectGetRootsPermanent()
+{
+ for (LLObjectSelection::root_iterator iter = getSelection()->root_begin();
+ iter != getSelection()->root_end(); iter++ )
+ {
+ LLSelectNode* node = *iter;
+ LLViewerObject* object = node->getObject();
+ if( !node->mValid )
+ {
+ return FALSE;
+ }
+ if( !object->flagObjectPermanent())
+ {
+ return FALSE;
+ }
+ }
+
+ return TRUE;
+}
+
+//-----------------------------------------------------------------------------
+// selectGetCharacter() - return TRUE if all objects are character
+//-----------------------------------------------------------------------------
+BOOL LLSelectMgr::selectGetCharacter()
+{
+ for (LLObjectSelection::iterator iter = getSelection()->begin();
+ iter != getSelection()->end(); iter++ )
+ {
+ LLSelectNode* node = *iter;
+ LLViewerObject* object = node->getObject();
+ if( !object || !node->mValid )
+ {
+ return FALSE;
+ }
+ if( !object->flagCharacter())
+ {
+ return FALSE;
+ }
+ }
+ return TRUE;
+}
+
+//-----------------------------------------------------------------------------
+// selectGetRootsCharacter() - return TRUE if all root objects are
+// character
+//-----------------------------------------------------------------------------
+BOOL LLSelectMgr::selectGetRootsCharacter()
+{
+ for (LLObjectSelection::root_iterator iter = getSelection()->root_begin();
+ iter != getSelection()->root_end(); iter++ )
+ {
+ LLSelectNode* node = *iter;
+ LLViewerObject* object = node->getObject();
+ if( !node->mValid )
+ {
+ return FALSE;
+ }
+ if( !object->flagCharacter())
+ {
+ return FALSE;
+ }
+ }
+
+ return TRUE;
+}
+
+//-----------------------------------------------------------------------------
+// selectGetNonPathfinding() - return TRUE if all objects are not pathfinding
+//-----------------------------------------------------------------------------
+BOOL LLSelectMgr::selectGetNonPathfinding()
+{
+ for (LLObjectSelection::iterator iter = getSelection()->begin();
+ iter != getSelection()->end(); iter++ )
+ {
+ LLSelectNode* node = *iter;
+ LLViewerObject* object = node->getObject();
+ if( !object || !node->mValid )
+ {
+ return FALSE;
+ }
+ if( object->flagObjectPermanent() || object->flagCharacter())
+ {
+ return FALSE;
+ }
+ }
+ return TRUE;
+}
+
+//-----------------------------------------------------------------------------
+// selectGetRootsNonPathfinding() - return TRUE if all root objects are not
+// pathfinding
+//-----------------------------------------------------------------------------
+BOOL LLSelectMgr::selectGetRootsNonPathfinding()
+{
+ for (LLObjectSelection::root_iterator iter = getSelection()->root_begin();
+ iter != getSelection()->root_end(); iter++ )
+ {
+ LLSelectNode* node = *iter;
+ LLViewerObject* object = node->getObject();
+ if( !node->mValid )
+ {
+ return FALSE;
+ }
+ if( object->flagObjectPermanent() || object->flagCharacter())
+ {
+ return FALSE;
+ }
+ }
+
+ return TRUE;
+}
+
+//-----------------------------------------------------------------------------
+// selectGetNonPermanent() - return TRUE if all objects are not permanent
+//-----------------------------------------------------------------------------
+BOOL LLSelectMgr::selectGetNonPermanent()
+{
+ for (LLObjectSelection::iterator iter = getSelection()->begin();
+ iter != getSelection()->end(); iter++ )
+ {
+ LLSelectNode* node = *iter;
+ LLViewerObject* object = node->getObject();
+ if( !object || !node->mValid )
+ {
+ return FALSE;
+ }
+ if( object->flagObjectPermanent())
+ {
+ return FALSE;
+ }
+ }
+ return TRUE;
+}
+
+//-----------------------------------------------------------------------------
+// selectGetRootsNonPermanent() - return TRUE if all root objects are not
+// permanent
+//-----------------------------------------------------------------------------
+BOOL LLSelectMgr::selectGetRootsNonPermanent()
+{
+ for (LLObjectSelection::root_iterator iter = getSelection()->root_begin();
+ iter != getSelection()->root_end(); iter++ )
+ {
+ LLSelectNode* node = *iter;
+ LLViewerObject* object = node->getObject();
+ if( !node->mValid )
+ {
+ return FALSE;
+ }
+ if( object->flagObjectPermanent())
+ {
+ return FALSE;
+ }
+ }
+
+ return TRUE;
+}
+
+//-----------------------------------------------------------------------------
+// selectGetNonCharacter() - return TRUE if all objects are not character
+//-----------------------------------------------------------------------------
+BOOL LLSelectMgr::selectGetNonCharacter()
+{
+ for (LLObjectSelection::iterator iter = getSelection()->begin();
+ iter != getSelection()->end(); iter++ )
+ {
+ LLSelectNode* node = *iter;
+ LLViewerObject* object = node->getObject();
+ if( !object || !node->mValid )
+ {
+ return FALSE;
+ }
+ if( object->flagCharacter())
+ {
+ return FALSE;
+ }
+ }
+ return TRUE;
+}
+
+//-----------------------------------------------------------------------------
+// selectGetRootsNonCharacter() - return TRUE if all root objects are not
+// character
+//-----------------------------------------------------------------------------
+BOOL LLSelectMgr::selectGetRootsNonCharacter()
+{
+ for (LLObjectSelection::root_iterator iter = getSelection()->root_begin();
+ iter != getSelection()->root_end(); iter++ )
+ {
+ LLSelectNode* node = *iter;
+ LLViewerObject* object = node->getObject();
+ if( !node->mValid )
+ {
+ return FALSE;
+ }
+ if( object->flagCharacter())
+ {
+ return FALSE;
+ }
+ }
+
+ return TRUE;
+}
+
+
+//-----------------------------------------------------------------------------
+// selectGetEditableLinksets() - return TRUE if all objects are editable
+// pathfinding linksets
+//-----------------------------------------------------------------------------
+BOOL LLSelectMgr::selectGetEditableLinksets()
+{
+ for (LLObjectSelection::iterator iter = getSelection()->begin();
+ iter != getSelection()->end(); iter++ )
+ {
+ LLSelectNode* node = *iter;
+ LLViewerObject* object = node->getObject();
+ if( !object || !node->mValid )
+ {
+ return FALSE;
+ }
+ if (object->flagUsePhysics() ||
+ object->flagTemporaryOnRez() ||
+ object->flagCharacter() ||
+ object->flagVolumeDetect() ||
+ object->flagAnimSource() ||
+ (object->getRegion() != gAgent.getRegion()) ||
+ (!gAgent.isGodlike() &&
+ !gAgent.canManageEstate() &&
+ !object->permYouOwner() &&
+ !object->permMove()))
+ {
+ return FALSE;
+ }
+ }
+ return TRUE;
+}
+
+//-----------------------------------------------------------------------------
+// selectGetViewableCharacters() - return TRUE if all objects are characters
+// viewable within the pathfinding characters floater
+//-----------------------------------------------------------------------------
+BOOL LLSelectMgr::selectGetViewableCharacters()
+{
+ for (LLObjectSelection::iterator iter = getSelection()->begin();
+ iter != getSelection()->end(); iter++ )
+ {
+ LLSelectNode* node = *iter;
+ LLViewerObject* object = node->getObject();
+ if( !object || !node->mValid )
+ {
+ return FALSE;
+ }
+ if( !object->flagCharacter() ||
+ (object->getRegion() != gAgent.getRegion()))
+ {
+ return FALSE;
+ }
+ }
+ return TRUE;
+}
+
+//-----------------------------------------------------------------------------
// selectGetRootsTransfer() - return TRUE if current agent can transfer all
// selected root objects.
//-----------------------------------------------------------------------------
@@ -4121,8 +4474,7 @@ struct LLSelectMgrApplyFlags : public LLSelectedObjectFunctor
virtual bool apply(LLViewerObject* object)
{
if ( object->permModify() && // preemptive permissions check
- object->isRoot() && // don't send for child objects
- !object->isJointChild())
+ object->isRoot()) // don't send for child objects
{
object->setFlags( mFlags, mState);
}
@@ -4148,12 +4500,6 @@ void LLSelectMgr::selectionUpdatePhantom(BOOL is_phantom)
getSelection()->applyToObjects(&func);
}
-void LLSelectMgr::selectionUpdateCastShadows(BOOL cast_shadows)
-{
- LLSelectMgrApplyFlags func( FLAGS_CAST_SHADOWS, cast_shadows);
- getSelection()->applyToObjects(&func);
-}
-
//----------------------------------------------------------------------
// Helpful packing functions for sendObjectMessage()
//----------------------------------------------------------------------
@@ -5583,7 +5929,7 @@ void pushWireframe(LLDrawable* drawable)
for (S32 i = 0; i < volume->getNumVolumeFaces(); ++i)
{
const LLVolumeFace& face = volume->getVolumeFace(i);
- LLVertexBuffer::drawElements(LLRender::TRIANGLES, face.mPositions, face.mTexCoords, face.mNumIndices, face.mIndices);
+ LLVertexBuffer::drawElements(LLRender::TRIANGLES, face.mPositions, NULL, face.mNumIndices, face.mIndices);
}
}
@@ -5610,7 +5956,7 @@ void LLSelectNode::renderOneWireframe(const LLColor4& color)
if (shader)
{
- gHighlightProgram.bind();
+ gDebugProgram.bind();
}
gGL.matrixMode(LLRender::MM_MODELVIEW);
@@ -5983,8 +6329,6 @@ void LLSelectMgr::updateSelectionCenter()
// matches the root prim's (affecting the orientation of the manipulators).
bbox.addBBoxAgent( (mSelectedObjects->getFirstRootObject(TRUE))->getBoundingBoxAgent() );
- std::vector < LLViewerObject *> jointed_objects;
-
for (LLObjectSelection::iterator iter = mSelectedObjects->begin();
iter != mSelectedObjects->end(); iter++)
{
@@ -6002,11 +6346,6 @@ void LLSelectMgr::updateSelectionCenter()
}
bbox.addBBoxAgent( object->getBoundingBoxAgent() );
-
- if (object->isJointChild())
- {
- jointed_objects.push_back(object);
- }
}
LLVector3 bbox_center_agent = bbox.getCenterAgent();
@@ -6245,7 +6584,7 @@ BOOL LLSelectMgr::canSelectObject(LLViewerObject* object)
}
if ((gSavedSettings.getBOOL("SelectOwnedOnly") && !object->permYouOwner()) ||
- (gSavedSettings.getBOOL("SelectMovableOnly") && !object->permMove()))
+ (gSavedSettings.getBOOL("SelectMovableOnly") && (!object->permMove() || object->isPermanentEnforced())))
{
// only select my own objects
return FALSE;
@@ -6296,19 +6635,19 @@ void LLSelectMgr::setAgentHUDZoom(F32 target_zoom, F32 current_zoom)
bool LLObjectSelection::is_root::operator()(LLSelectNode *node)
{
LLViewerObject* object = node->getObject();
- return (object != NULL) && !node->mIndividualSelection && (object->isRootEdit() || object->isJointChild());
+ return (object != NULL) && !node->mIndividualSelection && (object->isRootEdit());
}
bool LLObjectSelection::is_valid_root::operator()(LLSelectNode *node)
{
LLViewerObject* object = node->getObject();
- return (object != NULL) && node->mValid && !node->mIndividualSelection && (object->isRootEdit() || object->isJointChild());
+ return (object != NULL) && node->mValid && !node->mIndividualSelection && (object->isRootEdit());
}
bool LLObjectSelection::is_root_object::operator()(LLSelectNode *node)
{
LLViewerObject* object = node->getObject();
- return (object != NULL) && (object->isRootEdit() || object->isJointChild());
+ return (object != NULL) && (object->isRootEdit());
}
LLObjectSelection::LLObjectSelection() :
@@ -6937,7 +7276,7 @@ LLSelectNode* LLObjectSelection::getFirstMoveableNode(BOOL get_root_first)
bool apply(LLSelectNode* node)
{
LLViewerObject* obj = node->getObject();
- return obj && obj->permMove();
+ return obj && obj->permMove() && !obj->isPermanentEnforced();
}
} func;
LLSelectNode* res = get_root_first ? getFirstRootNode(&func, TRUE) : getFirstNode(&func);
@@ -6975,9 +7314,10 @@ LLViewerObject* LLObjectSelection::getFirstDeleteableObject()
LLViewerObject* obj = node->getObject();
// you can delete an object if you are the owner
// or you have permission to modify it.
- if( obj && ( (obj->permModify()) ||
- (obj->permYouOwner()) ||
- (!obj->permAnyOwner()) )) // public
+ if( obj && !obj->isPermanentEnforced() &&
+ ( (obj->permModify()) ||
+ (obj->permYouOwner()) ||
+ (!obj->permAnyOwner()) )) // public
{
if( !obj->isAttachment() )
{
@@ -7017,7 +7357,7 @@ LLViewerObject* LLObjectSelection::getFirstMoveableObject(BOOL get_parent)
bool apply(LLSelectNode* node)
{
LLViewerObject* obj = node->getObject();
- return obj && obj->permMove();
+ return obj && obj->permMove() && !obj->isPermanentEnforced();
}
} func;
return getFirstSelectedObject(&func, get_parent);
@@ -7086,7 +7426,7 @@ bool LLSelectMgr::selectionMove(const LLVector3& displ,
{
obj = (*it)->getObject();
bool enable_pos = false, enable_rot = false;
- bool perm_move = obj->permMove();
+ bool perm_move = obj->permMove() && !obj->isPermanentEnforced();
bool perm_mod = obj->permModify();
LLVector3d sel_center(getSelectionCenterGlobal());
diff --git a/indra/newview/llselectmgr.h b/indra/newview/llselectmgr.h
index 87ada5ac6b..ecbb20df1b 100644
--- a/indra/newview/llselectmgr.h
+++ b/indra/newview/llselectmgr.h
@@ -307,6 +307,15 @@ public:
bool applyToRootNodes(LLSelectedNodeFunctor* func, bool firstonly = false);
bool applyToNodes(LLSelectedNodeFunctor* func, bool firstonly = false);
+ /*
+ * Used to apply (no-copy) textures to the selected object or
+ * selected face/faces of the object.
+ * This method moves (no-copy) texture to the object's inventory
+ * and doesn't make copy of the texture for each face.
+ * Then this only texture is used for all selected faces.
+ */
+ void applyNoCopyTextureToTEs(LLViewerInventoryItem* item);
+
ESelectType getSelectType() const { return mSelectType; }
private:
@@ -501,7 +510,6 @@ public:
void selectionUpdatePhysics(BOOL use_physics);
void selectionUpdateTemporary(BOOL is_temporary);
void selectionUpdatePhantom(BOOL is_ghost);
- void selectionUpdateCastShadows(BOOL cast_shadows);
void selectionDump();
BOOL selectionAllPCode(LLPCode code); // all objects have this PCode
@@ -539,8 +547,6 @@ public:
void selectionTexScaleAutofit(F32 repeats_per_meter);
void adjustTexturesByScale(BOOL send_to_sim, BOOL stretch);
- void selectionResetRotation(); // sets rotation quat to identity
- void selectionRotateAroundZ(F32 degrees);
bool selectionMove(const LLVector3& displ, F32 rx, F32 ry, F32 rz,
U32 update_type);
void sendSelectionMove();
@@ -563,6 +569,33 @@ public:
BOOL selectGetRootsModify();
BOOL selectGetModify();
+ // returns TRUE if is all objects are non-permanent-enforced
+ BOOL selectGetRootsNonPermanentEnforced();
+ BOOL selectGetNonPermanentEnforced();
+
+ // returns TRUE if is all objects are permanent
+ BOOL selectGetRootsPermanent();
+ BOOL selectGetPermanent();
+
+ // returns TRUE if is all objects are character
+ BOOL selectGetRootsCharacter();
+ BOOL selectGetCharacter();
+
+ // returns TRUE if is all objects are not permanent
+ BOOL selectGetRootsNonPathfinding();
+ BOOL selectGetNonPathfinding();
+
+ // returns TRUE if is all objects are not permanent
+ BOOL selectGetRootsNonPermanent();
+ BOOL selectGetNonPermanent();
+
+ // returns TRUE if is all objects are not character
+ BOOL selectGetRootsNonCharacter();
+ BOOL selectGetNonCharacter();
+
+ BOOL selectGetEditableLinksets();
+ BOOL selectGetViewableCharacters();
+
// returns TRUE if selected objects can be transferred.
BOOL selectGetRootsTransfer();
diff --git a/indra/newview/llsidepaneliteminfo.cpp b/indra/newview/llsidepaneliteminfo.cpp
index 1ce05da849..92c2863ffd 100644
--- a/indra/newview/llsidepaneliteminfo.cpp
+++ b/indra/newview/llsidepaneliteminfo.cpp
@@ -352,7 +352,7 @@ void LLSidepanelItemInfo::refreshFromItem(LLViewerInventoryItem* item)
getChildView("BtnCreator")->setEnabled(FALSE);
getChildView("LabelCreatorTitle")->setEnabled(FALSE);
getChildView("LabelCreatorName")->setEnabled(FALSE);
- getChild<LLUICtrl>("LabelCreatorName")->setValue(getString("unknown"));
+ getChild<LLUICtrl>("LabelCreatorName")->setValue(getString("unknown_multiple"));
}
////////////////
diff --git a/indra/newview/llsidepaneltaskinfo.cpp b/indra/newview/llsidepaneltaskinfo.cpp
index 64b82aa0bb..c351b1a128 100644
--- a/indra/newview/llsidepaneltaskinfo.cpp
+++ b/indra/newview/llsidepaneltaskinfo.cpp
@@ -61,6 +61,9 @@
#include "llspinctrl.h"
#include "roles_constants.h"
#include "llgroupactions.h"
+#include "lltextbase.h"
+#include "llstring.h"
+#include "lltrans.h"
///----------------------------------------------------------------------------
/// Class llsidepaneltaskinfo
@@ -146,6 +149,7 @@ BOOL LLSidepanelTaskInfo::postBuild()
mDAEditCost = getChild<LLUICtrl>("Edit Cost");
mDALabelClickAction = getChildView("label click action");
mDAComboClickAction = getChild<LLComboBox>("clickaction");
+ mDAPathfindingAttributes = getChild<LLTextBase>("pathfinding_attributes_value");
mDAB = getChildView("B:");
mDAO = getChildView("O:");
mDAG = getChildView("G:");
@@ -242,6 +246,9 @@ void LLSidepanelTaskInfo::disableAll()
mDAComboClickAction->clear();
}
+ mDAPathfindingAttributes->setEnabled(FALSE);
+ mDAPathfindingAttributes->setValue(LLStringUtil::null);
+
mDAB->setVisible(FALSE);
mDAO->setVisible(FALSE);
mDAG->setVisible(FALSE);
@@ -301,6 +308,8 @@ void LLSidepanelTaskInfo::refresh()
// BUG: fails if a root and non-root are both single-selected.
const BOOL is_perm_modify = (mObjectSelection->getFirstRootNode() && LLSelectMgr::getInstance()->selectGetRootsModify()) ||
LLSelectMgr::getInstance()->selectGetModify();
+ const BOOL is_nonpermanent_enforced = (mObjectSelection->getFirstRootNode() && LLSelectMgr::getInstance()->selectGetRootsNonPermanentEnforced()) ||
+ LLSelectMgr::getInstance()->selectGetNonPermanentEnforced();
S32 string_index = 0;
std::string MODIFY_INFO_STRINGS[] =
@@ -308,12 +317,18 @@ void LLSidepanelTaskInfo::refresh()
getString("text modify info 1"),
getString("text modify info 2"),
getString("text modify info 3"),
- getString("text modify info 4")
+ getString("text modify info 4"),
+ getString("text modify info 5"),
+ getString("text modify info 6")
};
if (!is_perm_modify)
{
string_index += 2;
}
+ else if (!is_nonpermanent_enforced)
+ {
+ string_index += 4;
+ }
if (!is_one_object)
{
++string_index;
@@ -321,6 +336,34 @@ void LLSidepanelTaskInfo::refresh()
getChildView("perm_modify")->setEnabled(TRUE);
getChild<LLUICtrl>("perm_modify")->setValue(MODIFY_INFO_STRINGS[string_index]);
+ std::string pfAttrName;
+
+ if ((mObjectSelection->getFirstRootNode()
+ && LLSelectMgr::getInstance()->selectGetRootsNonPathfinding())
+ || LLSelectMgr::getInstance()->selectGetNonPathfinding())
+ {
+ pfAttrName = "Pathfinding_Object_Attr_None";
+ }
+ else if ((mObjectSelection->getFirstRootNode()
+ && LLSelectMgr::getInstance()->selectGetRootsPermanent())
+ || LLSelectMgr::getInstance()->selectGetPermanent())
+ {
+ pfAttrName = "Pathfinding_Object_Attr_Permanent";
+ }
+ else if ((mObjectSelection->getFirstRootNode()
+ && LLSelectMgr::getInstance()->selectGetRootsCharacter())
+ || LLSelectMgr::getInstance()->selectGetCharacter())
+ {
+ pfAttrName = "Pathfinding_Object_Attr_Character";
+ }
+ else
+ {
+ pfAttrName = "Pathfinding_Object_Attr_MultiSelect";
+ }
+
+ mDAPathfindingAttributes->setEnabled(TRUE);
+ mDAPathfindingAttributes->setValue(LLTrans::getString(pfAttrName));
+
getChildView("Permissions:")->setEnabled(TRUE);
// Update creator text field
@@ -385,7 +428,7 @@ void LLSidepanelTaskInfo::refresh()
}
}
- getChildView("button set group")->setEnabled(owners_identical && (mOwnerID == gAgent.getID()));
+ getChildView("button set group")->setEnabled(owners_identical && (mOwnerID == gAgent.getID()) && is_nonpermanent_enforced);
getChildView("Name:")->setEnabled(TRUE);
LLLineEditor* LineEditorObjectName = getChild<LLLineEditor>("Object Name");
@@ -415,7 +458,7 @@ void LLSidepanelTaskInfo::refresh()
// figure out the contents of the name, description, & category
BOOL edit_name_desc = FALSE;
- if (is_one_object && objectp->permModify())
+ if (is_one_object && objectp->permModify() && !objectp->isPermanentEnforced())
{
edit_name_desc = TRUE;
}
@@ -595,12 +638,12 @@ void LLSidepanelTaskInfo::refresh()
BOOL has_change_perm_ability = FALSE;
BOOL has_change_sale_ability = FALSE;
- if (valid_base_perms &&
+ if (valid_base_perms && is_nonpermanent_enforced &&
(self_owned || (group_owned && gAgent.hasPowerInGroup(group_id, GP_OBJECT_MANIPULATE))))
{
has_change_perm_ability = TRUE;
}
- if (valid_base_perms &&
+ if (valid_base_perms && is_nonpermanent_enforced &&
(self_owned || (group_owned && gAgent.hasPowerInGroup(group_id, GP_OBJECT_SET_SALE))))
{
has_change_sale_ability = TRUE;
@@ -812,8 +855,8 @@ void LLSidepanelTaskInfo::refresh()
ComboClickAction->setCurrentByIndex((S32)click_action);
}
}
- getChildView("label click action")->setEnabled(is_perm_modify && all_volume);
- getChildView("clickaction")->setEnabled(is_perm_modify && all_volume);
+ getChildView("label click action")->setEnabled(is_perm_modify && is_nonpermanent_enforced && all_volume);
+ getChildView("clickaction")->setEnabled(is_perm_modify && is_nonpermanent_enforced && all_volume);
if (!getIsEditing())
{
diff --git a/indra/newview/llsidepaneltaskinfo.h b/indra/newview/llsidepaneltaskinfo.h
index be0fee2127..124229af06 100644
--- a/indra/newview/llsidepaneltaskinfo.h
+++ b/indra/newview/llsidepaneltaskinfo.h
@@ -41,6 +41,7 @@ class LLCheckBoxCtrl;
class LLComboBox;
class LLNameBox;
class LLViewerObject;
+class LLTextBase;
class LLSidepanelTaskInfo : public LLSidepanelInventorySubpanel
{
@@ -150,6 +151,7 @@ private:
LLUICtrl* mDAEditCost;
LLView* mDALabelClickAction;
LLComboBox* mDAComboClickAction;
+ LLTextBase* mDAPathfindingAttributes;
LLView* mDAB;
LLView* mDAO;
LLView* mDAG;
diff --git a/indra/newview/llslurl.cpp b/indra/newview/llslurl.cpp
index a853726dea..3a82233320 100644
--- a/indra/newview/llslurl.cpp
+++ b/indra/newview/llslurl.cpp
@@ -56,14 +56,13 @@ LLSLURL::LLSLURL(const std::string& slurl)
{
// by default we go to agni.
mType = INVALID;
- LL_INFOS("AppInit") << "SLURL: " << slurl << LL_ENDL;
+
if(slurl == SIM_LOCATION_HOME)
{
mType = HOME_LOCATION;
}
else if(slurl.empty() || (slurl == SIM_LOCATION_LAST))
{
-
mType = LAST_LOCATION;
}
else
@@ -80,6 +79,7 @@ LLSLURL::LLSLURL(const std::string& slurl)
// these slurls are typically passed in from the 'starting location' box on the login panel,
// where the user can type in <regionname>/<x>/<y>/<z>
std::string fixed_slurl = LLGridManager::getInstance()->getSLURLBase();
+
// the slurl that was passed in might have a prepended /, or not. So,
// we strip off the prepended '/' so we don't end up with http://slurl.com/secondlife/<region>/<x>/<y>/<z>
// or some such.
@@ -138,7 +138,7 @@ LLSLURL::LLSLURL(const std::string& slurl)
// so parse the grid name to derive the grid ID
if (!slurl_uri.hostName().empty())
{
- mGrid = LLGridManager::getInstance()->getGridByLabel(slurl_uri.hostName());
+ mGrid = LLGridManager::getInstance()->getGridId(slurl_uri.hostName());
}
else if(path_array[0].asString() == LLSLURL::SLURL_SECONDLIFE_PATH)
{
@@ -150,12 +150,13 @@ LLSLURL::LLSLURL(const std::string& slurl)
{
// for app style slurls, where no grid name is specified, assume the currently
// selected or logged in grid.
- mGrid = LLGridManager::getInstance()->getGrid();
+ mGrid = LLGridManager::getInstance()->getGridId();
}
if(mGrid.empty())
{
// we couldn't find the grid in the grid manager, so bail
+ LL_WARNS("AppInit")<<"unable to find grid"<<LL_ENDL;
return;
}
// set the type as appropriate.
@@ -334,7 +335,7 @@ LLSLURL::LLSLURL(const std::string& grid,
LLSLURL::LLSLURL(const std::string& region,
const LLVector3& position)
{
- *this = LLSLURL(LLGridManager::getInstance()->getGrid(),
+ *this = LLSLURL(LLGridManager::getInstance()->getGridId(),
region, position);
}
@@ -343,7 +344,7 @@ LLSLURL::LLSLURL(const std::string& grid,
const std::string& region,
const LLVector3d& global_position)
{
- *this = LLSLURL(grid,
+ *this = LLSLURL(LLGridManager::getInstance()->getGridId(grid),
region, LLVector3(global_position.mdV[VX],
global_position.mdV[VY],
global_position.mdV[VZ]));
@@ -353,7 +354,7 @@ LLSLURL::LLSLURL(const std::string& grid,
LLSLURL::LLSLURL(const std::string& region,
const LLVector3d& global_position)
{
- *this = LLSLURL(LLGridManager::getInstance()->getGrid(),
+ *this = LLSLURL(LLGridManager::getInstance()->getGridId(),
region, global_position);
}
@@ -426,7 +427,7 @@ std::string LLSLURL::getLoginString() const
unescaped_start << "last";
break;
default:
- LL_WARNS("AppInit") << "Unexpected SLURL type for login string" << (int)mType << LL_ENDL;
+ LL_WARNS("AppInit") << "Unexpected SLURL type ("<<(int)mType <<")for login string"<< LL_ENDL;
break;
}
return xml_escape_string(unescaped_start.str());
@@ -465,18 +466,47 @@ std::string LLSLURL::getLocationString() const
(int)llround(mPosition[1]),
(int)llround(mPosition[2]));
}
+
+// static
+const std::string LLSLURL::typeName[NUM_SLURL_TYPES] =
+{
+ "INVALID",
+ "LOCATION",
+ "HOME_LOCATION",
+ "LAST_LOCATION",
+ "APP",
+ "HELP"
+};
+
+std::string LLSLURL::getTypeString(SLURL_TYPE type)
+{
+ std::string name;
+ if ( type >= INVALID && type < NUM_SLURL_TYPES )
+ {
+ name = LLSLURL::typeName[type];
+ }
+ else
+ {
+ name = llformat("Out of Range (%d)",type);
+ }
+ return name;
+}
+
+
std::string LLSLURL::asString() const
{
std::ostringstream result;
- result << " mAppCmd:" << getAppCmd() <<
- " mAppPath:" + getAppPath().asString() <<
- " mAppQueryMap:" + getAppQueryMap().asString() <<
- " mAppQuery: " + getAppQuery() <<
- " mGrid: " + getGrid() <<
- " mRegion: " + getRegion() <<
- " mPosition: " <<
- " mType: " << mType <<
- " mPosition: " << mPosition;
+ result
+ << " mType: " << LLSLURL::getTypeString(mType)
+ << " mGrid: " + getGrid()
+ << " mRegion: " + getRegion()
+ << " mPosition: " << mPosition
+ << " mAppCmd:" << getAppCmd()
+ << " mAppPath:" + getAppPath().asString()
+ << " mAppQueryMap:" + getAppQueryMap().asString()
+ << " mAppQuery: " + getAppQuery()
+ ;
+
return result.str();
}
diff --git a/indra/newview/llslurl.h b/indra/newview/llslurl.h
index 1a3f0543dd..b86cf7949b 100644
--- a/indra/newview/llslurl.h
+++ b/indra/newview/llslurl.h
@@ -51,13 +51,15 @@ public:
static const char* SLURL_APP_PATH;
static const char* SLURL_REGION_PATH;
+ // if you modify this enumeration, update typeName as well
enum SLURL_TYPE {
INVALID,
LOCATION,
HOME_LOCATION,
LAST_LOCATION,
APP,
- HELP
+ HELP,
+ NUM_SLURL_TYPES // must be last
};
@@ -92,6 +94,10 @@ public:
std::string asString() const ;
protected:
+ static const std::string typeName[NUM_SLURL_TYPES];
+ /// Get a human-readable version of the type for logging
+ static std::string getTypeString(SLURL_TYPE type);
+
SLURL_TYPE mType;
// used for Apps and Help
diff --git a/indra/newview/llspatialpartition.cpp b/indra/newview/llspatialpartition.cpp
index 8e62b79d7f..06c87e57fc 100644
--- a/indra/newview/llspatialpartition.cpp
+++ b/indra/newview/llspatialpartition.cpp
@@ -68,6 +68,7 @@ const F32 SG_OCCLUSION_FUDGE = 0.25f;
#define assert_states_valid(x)
#endif
+extern bool gShiftFrame;
static U32 sZombieGroups = 0;
U32 LLSpatialGroup::sNodeCount = 0;
@@ -85,12 +86,32 @@ static F32 sCurMaxTexPriority = 1.f;
class LLOcclusionQueryPool : public LLGLNamePool
{
+public:
+ LLOcclusionQueryPool()
+ {
+ mCurQuery = 1;
+ }
+
protected:
+
+ std::list<GLuint> mAvailableName;
+ GLuint mCurQuery;
+
virtual GLuint allocateName()
{
- GLuint name;
- glGenQueriesARB(1, &name);
- return name;
+ GLuint ret = 0;
+
+ if (!mAvailableName.empty())
+ {
+ ret = mAvailableName.front();
+ mAvailableName.pop_front();
+ }
+ else
+ {
+ ret = mCurQuery++;
+ }
+
+ return ret;
}
virtual void releaseName(GLuint name)
@@ -98,7 +119,8 @@ protected:
#if LL_TRACK_PENDING_OCCLUSION_QUERIES
LLSpatialGroup::sPendingQueries.erase(name);
#endif
- glDeleteQueriesARB(1, &name);
+ llassert(std::find(mAvailableName.begin(), mAvailableName.end(), name) == mAvailableName.end());
+ mAvailableName.push_back(name);
}
};
@@ -259,79 +281,39 @@ U8* get_box_fan_indices_ptr(LLCamera* camera, const LLVector4a& center)
return (U8*) (sOcclusionIndices+cypher*8);
}
-
-static LLFastTimer::DeclareTimer FTM_BUILD_OCCLUSION("Build Occlusion");
-
-void LLSpatialGroup::buildOcclusion()
+//create a vertex buffer for efficiently rendering cubes
+LLVertexBuffer* ll_create_cube_vb(U32 type_mask, U32 usage)
{
- //if (mOcclusionVerts.isNull())
- {
- mOcclusionVerts = new LLVertexBuffer(LLVertexBuffer::MAP_VERTEX,
- LLVertexBuffer::sUseStreamDraw ? mBufferUsage : 0); //if GL has a hard time with VBOs, don't use them for occlusion culling.
- mOcclusionVerts->allocateBuffer(8, 64, true);
-
- LLStrider<U16> idx;
- mOcclusionVerts->getIndexStrider(idx);
- for (U32 i = 0; i < 64; i++)
- {
- *idx++ = sOcclusionIndices[i];
- }
- }
+ LLVertexBuffer* ret = new LLVertexBuffer(type_mask, usage);
- LLVector4a fudge;
- fudge.splat(SG_OCCLUSION_FUDGE);
-
- LLVector4a r;
- r.setAdd(mBounds[1], fudge);
+ ret->allocateBuffer(8, 64, true);
LLStrider<LLVector3> pos;
-
- {
- LLFastTimer t(FTM_BUILD_OCCLUSION);
- mOcclusionVerts->getVertexStrider(pos);
- }
+ LLStrider<U16> idx;
- {
- LLVector4a* v = (LLVector4a*) pos.get();
+ ret->getVertexStrider(pos);
+ ret->getIndexStrider(idx);
- 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;
- }
- }
-
+ pos[0] = LLVector3(-1,-1,-1);
+ pos[1] = LLVector3(-1,-1, 1);
+ pos[2] = LLVector3(-1, 1,-1);
+ pos[3] = LLVector3(-1, 1, 1);
+ pos[4] = LLVector3( 1,-1,-1);
+ pos[5] = LLVector3( 1,-1, 1);
+ pos[6] = LLVector3( 1, 1,-1);
+ pos[7] = LLVector3( 1, 1, 1);
+
+ for (U32 i = 0; i < 64; i++)
{
- mOcclusionVerts->flush();
- LLVertexBuffer::unbind();
+ idx[i] = sOcclusionIndices[i];
}
- clearState(LLSpatialGroup::OCCLUSION_DIRTY);
+ ret->flush();
+
+ return ret;
}
+static LLFastTimer::DeclareTimer FTM_BUILD_OCCLUSION("Build Occlusion");
BOOL earlyFail(LLCamera* camera, LLSpatialGroup* group);
@@ -394,8 +376,6 @@ LLSpatialGroup::~LLSpatialGroup()
}
}
- mOcclusionVerts = NULL;
-
LLMemType mt(LLMemType::MTYPE_SPACE_PARTITION);
clearDrawMap();
clearAtlasList() ;
@@ -550,6 +530,7 @@ void LLSpatialGroup::setVisible()
void LLSpatialGroup::validate()
{
+ ll_assert_aligned(this,64);
#if LL_OCTREE_PARANOIA_CHECK
sg_assert(!isState(DIRTY));
@@ -562,7 +543,7 @@ void LLSpatialGroup::validate()
validateDrawMap();
- for (element_iter i = getData().begin(); i != getData().end(); ++i)
+ for (element_iter i = getDataBegin(); i != getDataEnd(); ++i)
{
LLDrawable* drawable = *i;
sg_assert(drawable->getSpatialGroup() == this);
@@ -687,6 +668,11 @@ void LLSpatialGroup::rebuildGeom()
if (!isDead())
{
mSpatialPartition->rebuildGeom(this);
+
+ if (isState(LLSpatialGroup::MESH_DIRTY))
+ {
+ gPipeline.markMeshDirty(this);
+ }
}
}
@@ -699,6 +685,9 @@ void LLSpatialGroup::rebuildMesh()
}
static LLFastTimer::DeclareTimer FTM_REBUILD_VBO("VBO Rebuilt");
+static LLFastTimer::DeclareTimer FTM_ADD_GEOMETRY_COUNT("Add Geometry");
+static LLFastTimer::DeclareTimer FTM_CREATE_VB("Create VB");
+static LLFastTimer::DeclareTimer FTM_GET_GEOMETRY("Get Geometry");
void LLSpatialPartition::rebuildGeom(LLSpatialGroup* group)
{
@@ -720,27 +709,36 @@ void LLSpatialPartition::rebuildGeom(LLSpatialGroup* group)
//get geometry count
U32 index_count = 0;
U32 vertex_count = 0;
-
- addGeometryCount(group, vertex_count, index_count);
+
+ {
+ LLFastTimer t(FTM_ADD_GEOMETRY_COUNT);
+ addGeometryCount(group, vertex_count, index_count);
+ }
if (vertex_count > 0 && index_count > 0)
{ //create vertex buffer containing volume geometry for this node
- group->mBuilt = 1.f;
- if (group->mVertexBuffer.isNull() ||
- !group->mVertexBuffer->isWriteable() ||
- (group->mBufferUsage != group->mVertexBuffer->getUsage() && LLVertexBuffer::sEnableVBOs))
{
- group->mVertexBuffer = createVertexBuffer(mVertexDataMask, group->mBufferUsage);
- group->mVertexBuffer->allocateBuffer(vertex_count, index_count, true);
- stop_glerror();
+ LLFastTimer t(FTM_CREATE_VB);
+ group->mBuilt = 1.f;
+ if (group->mVertexBuffer.isNull() ||
+ !group->mVertexBuffer->isWriteable() ||
+ (group->mBufferUsage != group->mVertexBuffer->getUsage() && LLVertexBuffer::sEnableVBOs))
+ {
+ group->mVertexBuffer = createVertexBuffer(mVertexDataMask, group->mBufferUsage);
+ group->mVertexBuffer->allocateBuffer(vertex_count, index_count, true);
+ stop_glerror();
+ }
+ else
+ {
+ group->mVertexBuffer->resizeBuffer(vertex_count, index_count);
+ stop_glerror();
+ }
}
- else
+
{
- group->mVertexBuffer->resizeBuffer(vertex_count, index_count);
- stop_glerror();
+ LLFastTimer t(FTM_GET_GEOMETRY);
+ getGeometry(group);
}
-
- getGeometry(group);
}
else
{
@@ -762,7 +760,7 @@ BOOL LLSpatialGroup::boundObjects(BOOL empty, LLVector4a& minOut, LLVector4a& ma
{
const OctreeNode* node = mOctreeNode;
- if (node->getData().empty())
+ if (node->isEmpty())
{ //don't do anything if there are no objects
if (empty && mOctreeNode->getParent())
{ //only root is allowed to be empty
@@ -779,14 +777,14 @@ BOOL LLSpatialGroup::boundObjects(BOOL empty, LLVector4a& minOut, LLVector4a& ma
clearState(OBJECT_DIRTY);
//initialize bounding box to first element
- OctreeNode::const_element_iter i = node->getData().begin();
+ OctreeNode::const_element_iter i = node->getDataBegin();
LLDrawable* drawablep = *i;
const LLVector4a* minMax = drawablep->getSpatialExtents();
newMin = minMax[0];
newMax = minMax[1];
- for (++i; i != node->getData().end(); ++i)
+ for (++i; i != node->getDataEnd(); ++i)
{
drawablep = *i;
minMax = drawablep->getSpatialExtents();
@@ -927,16 +925,14 @@ void LLSpatialGroup::shift(const LLVector4a &offset)
mObjectExtents[0].add(offset);
mObjectExtents[1].add(offset);
- //if (!mSpatialPartition->mRenderByGroup)
+ if (!mSpatialPartition->mRenderByGroup &&
+ mSpatialPartition->mPartitionType != LLViewerRegion::PARTITION_TREE &&
+ mSpatialPartition->mPartitionType != LLViewerRegion::PARTITION_TERRAIN &&
+ mSpatialPartition->mPartitionType != LLViewerRegion::PARTITION_BRIDGE)
{
setState(GEOM_DIRTY);
gPipeline.markRebuild(this, TRUE);
}
-
- if (mOcclusionVerts.notNull())
- {
- setState(OCCLUSION_DIRTY);
- }
}
class LLSpatialSetState : public LLSpatialGroup::OctreeTraveler
@@ -1204,6 +1200,8 @@ LLSpatialGroup::LLSpatialGroup(OctreeNode* node, LLSpatialPartition* part) :
mCurUpdatingSlotp(NULL),
mCurUpdatingTexture (NULL)
{
+ ll_assert_aligned(this,16);
+
sNodeCount++;
LLMemType mt(LLMemType::MTYPE_SPACE_PARTITION);
@@ -1235,8 +1233,6 @@ LLSpatialGroup::LLSpatialGroup(OctreeNode* node, LLSpatialPartition* part) :
mVisible[i] = 0;
}
- mOcclusionVerts = NULL;
-
mRadius = 1;
mPixelArea = 1024.f;
}
@@ -1249,13 +1245,18 @@ void LLSpatialGroup::updateDistance(LLCamera &camera)
return;
}
+ if (gShiftFrame)
+ {
+ return;
+ }
+
#if !LL_RELEASE_FOR_DOWNLOAD
if (isState(LLSpatialGroup::OBJECT_DIRTY))
{
llerrs << "Spatial group dirty on distance update." << llendl;
}
#endif
- if (!getData().empty())
+ if (!isEmpty())
{
mRadius = mSpatialPartition->mRenderByGroup ? mObjectBounds[1].getLength3().getF32() :
(F32) mOctreeNode->getSize().getLength3().getF32();
@@ -1406,7 +1407,7 @@ void LLSpatialGroup::handleDestruction(const TreeNode* node)
LLMemType mt(LLMemType::MTYPE_SPACE_PARTITION);
setState(DEAD);
- for (element_iter i = getData().begin(); i != getData().end(); ++i)
+ for (element_iter i = getDataBegin(); i != getDataEnd(); ++i)
{
LLDrawable* drawable = *i;
if (drawable->getSpatialGroup() == this)
@@ -1465,10 +1466,14 @@ void LLSpatialGroup::handleChildRemoval(const OctreeNode* parent, const OctreeNo
unbound();
}
-void LLSpatialGroup::destroyGL()
+void LLSpatialGroup::destroyGL(bool keep_occlusion)
{
setState(LLSpatialGroup::GEOM_DIRTY | LLSpatialGroup::IMAGE_DIRTY);
- gPipeline.markRebuild(this, TRUE);
+
+ if (!keep_occlusion)
+ { //going to need a rebuild
+ gPipeline.markRebuild(this, TRUE);
+ }
mLastUpdateTime = gFrameTimeSeconds;
mVertexBuffer = NULL;
@@ -1476,24 +1481,29 @@ void LLSpatialGroup::destroyGL()
clearDrawMap();
- for (U32 i = 0; i < LLViewerCamera::NUM_CAMERAS; i++)
+ if (!keep_occlusion)
{
- if (mOcclusionQuery[i])
+ for (U32 i = 0; i < LLViewerCamera::NUM_CAMERAS; i++)
{
- sQueryPool.release(mOcclusionQuery[i]);
- mOcclusionQuery[i] = 0;
+ if (mOcclusionQuery[i])
+ {
+ sQueryPool.release(mOcclusionQuery[i]);
+ mOcclusionQuery[i] = 0;
+ }
}
}
- mOcclusionVerts = NULL;
- for (LLSpatialGroup::element_iter i = getData().begin(); i != getData().end(); ++i)
+ for (LLSpatialGroup::element_iter i = getDataBegin(); i != getDataEnd(); ++i)
{
LLDrawable* drawable = *i;
for (S32 j = 0; j < drawable->getNumFaces(); j++)
{
LLFace* facep = drawable->getFace(j);
- facep->clearVertexBuffer();
+ if (facep)
+ {
+ facep->clearVertexBuffer();
+ }
}
}
}
@@ -1556,15 +1566,13 @@ BOOL LLSpatialGroup::rebound()
mBounds[1].mul(0.5f);
}
- setState(OCCLUSION_DIRTY);
-
clearState(DIRTY);
return TRUE;
}
static LLFastTimer::DeclareTimer FTM_OCCLUSION_READBACK("Readback Occlusion");
-static LLFastTimer::DeclareTimer FTM_OCCLUSION_WAIT("Wait");
+static LLFastTimer::DeclareTimer FTM_OCCLUSION_WAIT("Occlusion Wait");
void LLSpatialGroup::checkOcclusion()
{
@@ -1584,7 +1592,9 @@ void LLSpatialGroup::checkOcclusion()
{
glGetQueryObjectuivARB(mOcclusionQuery[LLViewerCamera::sCurCameraID], GL_QUERY_RESULT_AVAILABLE_ARB, &available);
- if (mOcclusionIssued[LLViewerCamera::sCurCameraID] < gFrameCount)
+ static LLCachedControl<bool> wait_for_query(gSavedSettings, "RenderSynchronousOcclusion");
+
+ if (wait_for_query && mOcclusionIssued[LLViewerCamera::sCurCameraID] < gFrameCount)
{ //query was issued last frame, wait until it's available
S32 max_loop = 1024;
LLFastTimer t(FTM_OCCLUSION_WAIT);
@@ -1635,7 +1645,9 @@ void LLSpatialGroup::checkOcclusion()
else
{
assert_states_valid(this);
+
setOcclusionState(LLSpatialGroup::OCCLUDED, LLSpatialGroup::STATE_MODE_DIFF);
+
assert_states_valid(this);
}
@@ -1690,12 +1702,6 @@ void LLSpatialGroup::doOcclusion(LLCamera* camera)
mOcclusionQuery[LLViewerCamera::sCurCameraID] = sQueryPool.allocate();
}
- if (mOcclusionVerts.isNull() || isState(LLSpatialGroup::OCCLUSION_DIRTY))
- {
- LLFastTimer t(FTM_OCCLUSION_BUILD);
- 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.
@@ -1726,10 +1732,13 @@ void LLSpatialGroup::doOcclusion(LLCamera* camera)
glBeginQueryARB(mode, mOcclusionQuery[LLViewerCamera::sCurCameraID]);
}
- {
- LLFastTimer t(FTM_OCCLUSION_SET_BUFFER);
- mOcclusionVerts->setBuffer(LLVertexBuffer::MAP_VERTEX);
- }
+ LLGLSLShader* shader = LLGLSLShader::sCurBoundShaderPtr;
+ llassert(shader);
+
+ shader->uniform3fv(LLShaderMgr::BOX_CENTER, 1, mBounds[0].getF32ptr());
+ shader->uniform3f(LLShaderMgr::BOX_SIZE, mBounds[1][0]+SG_OCCLUSION_FUDGE,
+ mBounds[1][1]+SG_OCCLUSION_FUDGE,
+ mBounds[1][2]+SG_OCCLUSION_FUDGE);
if (!use_depth_clamp && mSpatialPartition->mDrawableType == LLDrawPool::POOL_VOIDWATER)
{
@@ -1738,12 +1747,12 @@ void LLSpatialGroup::doOcclusion(LLCamera* camera)
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);
+ gPipeline.mCubeVB->drawRange(LLRender::TRIANGLE_FAN, 0, 7, 8, 0);
+ gPipeline.mCubeVB->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]));
+ gPipeline.mCubeVB->drawRange(LLRender::TRIANGLE_FAN, 0, 7, 8, get_box_fan_indices(camera, mBounds[0]));
}
}
else
@@ -1751,12 +1760,12 @@ void LLSpatialGroup::doOcclusion(LLCamera* camera)
LLFastTimer t(FTM_OCCLUSION_DRAW);
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);
+ gPipeline.mCubeVB->drawRange(LLRender::TRIANGLE_FAN, 0, 7, 8, 0);
+ gPipeline.mCubeVB->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]));
+ gPipeline.mCubeVB->drawRange(LLRender::TRIANGLE_FAN, 0, 7, 8, get_box_fan_indices(camera, mBounds[0]));
}
}
@@ -1841,12 +1850,14 @@ BOOL LLSpatialPartition::remove(LLDrawable *drawablep, LLSpatialGroup *curp)
{
LLMemType mt(LLMemType::MTYPE_SPACE_PARTITION);
- drawablep->setSpatialGroup(NULL);
-
if (!curp->removeObject(drawablep))
{
OCT_ERRS << "Failed to remove drawable from octree!" << llendl;
}
+ else
+ {
+ drawablep->setSpatialGroup(NULL);
+ }
assert_octree_valid(mOctree);
@@ -2117,7 +2128,7 @@ public:
virtual void processGroup(LLSpatialGroup* group)
{
- llassert(!group->isState(LLSpatialGroup::DIRTY) && !group->getData().empty())
+ llassert(!group->isState(LLSpatialGroup::DIRTY) && !group->isEmpty())
if (mRes < 2)
{
@@ -2184,7 +2195,7 @@ public:
{
LLSpatialGroup::OctreeNode* branch = group->mOctreeNode;
- for (LLSpatialGroup::OctreeNode::const_element_iter i = branch->getData().begin(); i != branch->getData().end(); ++i)
+ for (LLSpatialGroup::OctreeNode::const_element_iter i = branch->getDataBegin(); i != branch->getDataEnd(); ++i)
{
LLDrawable* drawable = *i;
@@ -2308,7 +2319,7 @@ public:
LLSpatialGroup* group = (LLSpatialGroup*) state->getListener(0);
group->destroyGL();
- for (LLSpatialGroup::element_iter i = group->getData().begin(); i != group->getData().end(); ++i)
+ for (LLSpatialGroup::element_iter i = group->getDataBegin(); i != group->getDataEnd(); ++i)
{
LLDrawable* drawable = *i;
if (drawable->getVObj().notNull() && !group->mSpatialPartition->mRenderByGroup)
@@ -2480,18 +2491,21 @@ void pushVerts(LLSpatialGroup* group, U32 mask)
void pushVerts(LLFace* face, U32 mask)
{
- llassert(face->verify());
+ if (face)
+ {
+ llassert(face->verify());
- LLVertexBuffer* buffer = face->getVertexBuffer();
+ LLVertexBuffer* buffer = face->getVertexBuffer();
- if (buffer && (face->getGeomCount() >= 3))
- {
- buffer->setBuffer(mask);
- U16 start = face->getGeomStart();
- U16 end = start + face->getGeomCount()-1;
- U32 count = face->getIndicesCount();
- U16 offset = face->getIndicesStart();
- buffer->drawRange(LLRender::TRIANGLES, start, end, count, offset);
+ if (buffer && (face->getGeomCount() >= 3))
+ {
+ buffer->setBuffer(mask);
+ U16 start = face->getGeomStart();
+ U16 end = start + face->getGeomCount()-1;
+ U32 count = face->getIndicesCount();
+ U16 offset = face->getIndicesStart();
+ buffer->drawRange(LLRender::TRIANGLES, start, end, count, offset);
+ }
}
}
@@ -2615,7 +2629,7 @@ void renderOctree(LLSpatialGroup* group)
gGL.flush();
glLineWidth(1.f);
gGL.flush();
- for (LLSpatialGroup::element_iter i = group->getData().begin(); i != group->getData().end(); ++i)
+ for (LLSpatialGroup::element_iter i = group->getDataBegin(); i != group->getDataEnd(); ++i)
{
LLDrawable* drawable = *i;
if (!group->mSpatialPartition->isBridge())
@@ -2628,7 +2642,7 @@ void renderOctree(LLSpatialGroup* group)
for (S32 j = 0; j < drawable->getNumFaces(); j++)
{
LLFace* face = drawable->getFace(j);
- if (face->getVertexBuffer())
+ if (face && face->getVertexBuffer())
{
if (gFrameTimeSeconds - face->mLastUpdateTime < 0.5f)
{
@@ -2661,7 +2675,7 @@ void renderOctree(LLSpatialGroup* group)
}
else
{
- if (group->mBufferUsage == GL_STATIC_DRAW_ARB && !group->getData().empty()
+ if (group->mBufferUsage == GL_STATIC_DRAW_ARB && !group->isEmpty()
&& group->mSpatialPartition->mRenderByGroup)
{
col.setVec(0.8f, 0.4f, 0.1f, 0.1f);
@@ -2729,7 +2743,7 @@ void renderVisibility(LLSpatialGroup* group, LLCamera* camera)
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
BOOL render_objects = (!LLPipeline::sUseOcclusion || !group->isOcclusionState(LLSpatialGroup::OCCLUDED)) && group->isVisible() &&
- !group->getData().empty();
+ !group->isEmpty();
if (render_objects)
{
@@ -2757,19 +2771,6 @@ void renderVisibility(LLSpatialGroup* group, LLCamera* camera)
gGL.diffuseColor4f(0.f, 0.75f, 0.f, 0.5f);
pushBufferVerts(group, LLVertexBuffer::MAP_VERTEX);
}
- /*else if (camera && group->mOcclusionVerts.notNull())
- {
- LLVertexBuffer::unbind();
- group->mOcclusionVerts->setBuffer(LLVertexBuffer::MAP_VERTEX);
-
- gGL.diffuseColor4f(1.0f, 0.f, 0.f, 0.5f);
- group->mOcclusionVerts->drawRange(LLRender::TRIANGLE_FAN, 0, 7, 8, get_box_fan_indices(camera, group->mBounds[0]));
- glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
-
- gGL.diffuseColor4f(1.0f, 1.f, 1.f, 1.0f);
- group->mOcclusionVerts->drawRange(LLRender::TRIANGLE_FAN, 0, 7, 8, get_box_fan_indices(camera, group->mBounds[0]));
- glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
- }*/
}
}
@@ -2999,15 +3000,17 @@ void renderBoundingBox(LLDrawable* drawable, BOOL set_color = TRUE)
for (S32 i = 0; i < drawable->getNumFaces(); i++)
{
LLFace* facep = drawable->getFace(i);
+ if (facep)
+ {
+ ext = facep->mExtents;
- ext = facep->mExtents;
-
- pos.setAdd(ext[0], ext[1]);
- pos.mul(0.5f);
- size.setSub(ext[1], ext[0]);
- size.mul(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);
+ drawBoxOutline(pos,size);
+ }
}
//render drawable bounding box
@@ -3471,7 +3474,7 @@ void renderPhysicsShape(LLDrawable* drawable, LLVOVolume* volume)
void renderPhysicsShapes(LLSpatialGroup* group)
{
- for (LLSpatialGroup::OctreeNode::const_element_iter i = group->getData().begin(); i != group->getData().end(); ++i)
+ for (LLSpatialGroup::OctreeNode::const_element_iter i = group->getDataBegin(); i != group->getDataEnd(); ++i)
{
LLDrawable* drawable = *i;
LLVOVolume* volume = drawable->getVOVolume();
@@ -3495,24 +3498,30 @@ void renderPhysicsShapes(LLSpatialGroup* group)
LLViewerObject* object = drawable->getVObj();
if (object && object->getPCode() == LLViewerObject::LL_VO_SURFACE_PATCH)
{
+ gGL.pushMatrix();
+ gGL.multMatrix((F32*) object->getRegion()->mRenderMatrix.mMatrix);
//push face vertices for terrain
for (S32 i = 0; i < drawable->getNumFaces(); ++i)
{
LLFace* face = drawable->getFace(i);
- LLVertexBuffer* buff = face->getVertexBuffer();
- if (buff)
+ if (face)
{
- glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
+ LLVertexBuffer* buff = face->getVertexBuffer();
+ if (buff)
+ {
+ glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
- buff->setBuffer(LLVertexBuffer::MAP_VERTEX);
- gGL.diffuseColor3f(0.2f, 0.5f, 0.3f);
- buff->draw(LLRender::TRIANGLES, buff->getNumIndices(), 0);
+ buff->setBuffer(LLVertexBuffer::MAP_VERTEX);
+ gGL.diffuseColor3f(0.2f, 0.5f, 0.3f);
+ buff->draw(LLRender::TRIANGLES, buff->getNumIndices(), 0);
- gGL.diffuseColor3f(0.2f, 1.f, 0.3f);
- glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
- buff->draw(LLRender::TRIANGLES, buff->getNumIndices(), 0);
+ gGL.diffuseColor3f(0.2f, 1.f, 0.3f);
+ glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
+ buff->draw(LLRender::TRIANGLES, buff->getNumIndices(), 0);
+ }
}
}
+ gGL.popMatrix();
}
}
}
@@ -3534,6 +3543,7 @@ void renderTexturePriority(LLDrawable* drawable)
//LLViewerTexture* imagep = facep->getTexture();
//if (imagep)
+ if (facep)
{
//F32 vsize = imagep->mMaxVirtualSize;
@@ -3586,7 +3596,11 @@ void renderPoints(LLDrawable* drawablep)
gGL.diffuseColor3f(1,1,1);
for (S32 i = 0; i < drawablep->getNumFaces(); i++)
{
- gGL.vertex3fv(drawablep->getFace(i)->mCenterLocal.mV);
+ LLFace * face = drawablep->getFace(i);
+ if (face)
+ {
+ gGL.vertex3fv(face->mCenterLocal.mV);
+ }
}
gGL.end();
}
@@ -3767,7 +3781,11 @@ void renderLights(LLDrawable* drawablep)
for (S32 i = 0; i < drawablep->getNumFaces(); i++)
{
- pushVerts(drawablep->getFace(i), LLVertexBuffer::MAP_VERTEX);
+ LLFace * face = drawablep->getFace(i);
+ if (face)
+ {
+ pushVerts(face, LLVertexBuffer::MAP_VERTEX);
+ }
}
const LLVector4a* ext = drawablep->getSpatialExtents();
@@ -3808,7 +3826,7 @@ public:
LLVector3 center, size;
- if (branch->getData().empty())
+ if (branch->isEmpty())
{
gGL.diffuseColor3f(1.f,0.2f,0.f);
center.set(branch->getCenter().getF32ptr());
@@ -3844,8 +3862,8 @@ public:
}
gGL.begin(LLRender::TRIANGLES);
- for (LLOctreeNode<LLVolumeTriangle>::const_element_iter iter = branch->getData().begin();
- iter != branch->getData().end();
+ for (LLOctreeNode<LLVolumeTriangle>::const_element_iter iter = branch->getDataBegin();
+ iter != branch->getDataEnd();
++iter)
{
const LLVolumeTriangle* tri = *iter;
@@ -4082,7 +4100,7 @@ public:
if (gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_BBOXES))
{
- if (!group->getData().empty())
+ if (!group->isEmpty())
{
gGL.diffuseColor3f(0,0,1);
drawBoxOutline(group->mObjectBounds[0],
@@ -4090,7 +4108,7 @@ public:
}
}
- for (LLSpatialGroup::OctreeNode::const_element_iter i = branch->getData().begin(); i != branch->getData().end(); ++i)
+ for (LLSpatialGroup::OctreeNode::const_element_iter i = branch->getDataBegin(); i != branch->getDataEnd(); ++i)
{
LLDrawable* drawable = *i;
@@ -4169,18 +4187,21 @@ public:
for (U32 i = 0; i < drawable->getNumFaces(); ++i)
{
LLFace* facep = drawable->getFace(i);
- U8 index = facep->getTextureIndex();
- if (facep->mDrawInfo)
+ if (facep)
{
- if (index < 255)
+ U8 index = facep->getTextureIndex();
+ if (facep->mDrawInfo)
{
- if (facep->mDrawInfo->mTextureList.size() <= index)
- {
- llerrs << "Face texture index out of bounds." << llendl;
- }
- else if (facep->mDrawInfo->mTextureList[index] != facep->getTexture())
+ if (index < 255)
{
- llerrs << "Face texture index incorrect." << llendl;
+ if (facep->mDrawInfo->mTextureList.size()<= index)
+ {
+ llerrs << "Face texture index out of bounds." << llendl;
+ }
+ else if (facep->mDrawInfo->mTextureList[index] != facep->getTexture())
+ {
+ llerrs << "Face texture index incorrect." << llendl;
+ }
}
}
}
@@ -4276,7 +4297,7 @@ public:
return;
}
- for (LLSpatialGroup::OctreeNode::const_element_iter i = branch->getData().begin(); i != branch->getData().end(); ++i)
+ for (LLSpatialGroup::OctreeNode::const_element_iter i = branch->getDataBegin(); i != branch->getDataEnd(); ++i)
{
LLDrawable* drawable = *i;
@@ -4500,7 +4521,7 @@ public:
virtual void visit(const LLSpatialGroup::OctreeNode* branch)
{
- for (LLSpatialGroup::OctreeNode::const_element_iter i = branch->getData().begin(); i != branch->getData().end(); ++i)
+ for (LLSpatialGroup::OctreeNode::const_element_iter i = branch->getDataBegin(); i != branch->getDataEnd(); ++i)
{
check(*i);
}
@@ -4686,28 +4707,62 @@ LLVertexBuffer* LLGeometryManager::createVertexBuffer(U32 type_mask, U32 usage)
LLCullResult::LLCullResult()
{
+ mVisibleGroupsAllocated = 0;
+ mAlphaGroupsAllocated = 0;
+ mOcclusionGroupsAllocated = 0;
+ mDrawableGroupsAllocated = 0;
+ mVisibleListAllocated = 0;
+ mVisibleBridgeAllocated = 0;
+
+ mVisibleGroups = NULL;
+ mVisibleGroupsEnd = NULL;
+ mAlphaGroups = NULL;
+ mAlphaGroupsEnd = NULL;
+ mOcclusionGroups = NULL;
+ mOcclusionGroupsEnd = NULL;
+ mDrawableGroups = NULL;
+ mDrawableGroupsEnd = NULL;
+ mVisibleList = NULL;
+ mVisibleListEnd = NULL;
+ mVisibleBridge = NULL;
+ mVisibleBridgeEnd = NULL;
+
+ for (U32 i = 0; i < LLRenderPass::NUM_RENDER_TYPES; i++)
+ {
+ mRenderMap[i] = NULL;
+ mRenderMapEnd[i] = NULL;
+ mRenderMapAllocated[i] = 0;
+ }
+
clear();
}
+void LLCullResult::pushBack(void**& head, U32& count, void* val)
+{
+ count++;
+ head = (void**) realloc((void*) head, sizeof(void*) * count);
+ head[count-1] = val;
+}
+
void LLCullResult::clear()
{
mVisibleGroupsSize = 0;
- mVisibleGroupsEnd = mVisibleGroups.begin();
+ mVisibleGroupsEnd = mVisibleGroups;
mAlphaGroupsSize = 0;
- mAlphaGroupsEnd = mAlphaGroups.begin();
+ mAlphaGroupsEnd = mAlphaGroups;
mOcclusionGroupsSize = 0;
- mOcclusionGroupsEnd = mOcclusionGroups.begin();
+ mOcclusionGroupsEnd = mOcclusionGroups;
mDrawableGroupsSize = 0;
- mDrawableGroupsEnd = mDrawableGroups.begin();
+ mDrawableGroupsEnd = mDrawableGroups;
mVisibleListSize = 0;
- mVisibleListEnd = mVisibleList.begin();
+ mVisibleListEnd = mVisibleList;
mVisibleBridgeSize = 0;
- mVisibleBridgeEnd = mVisibleBridge.begin();
+ mVisibleBridgeEnd = mVisibleBridge;
for (U32 i = 0; i < LLRenderPass::NUM_RENDER_TYPES; i++)
@@ -4717,176 +4772,176 @@ void LLCullResult::clear()
mRenderMap[i][j] = 0;
}
mRenderMapSize[i] = 0;
- mRenderMapEnd[i] = mRenderMap[i].begin();
+ mRenderMapEnd[i] = mRenderMap[i];
}
}
-LLCullResult::sg_list_t::iterator LLCullResult::beginVisibleGroups()
+LLCullResult::sg_iterator LLCullResult::beginVisibleGroups()
{
- return mVisibleGroups.begin();
+ return mVisibleGroups;
}
-LLCullResult::sg_list_t::iterator LLCullResult::endVisibleGroups()
+LLCullResult::sg_iterator LLCullResult::endVisibleGroups()
{
return mVisibleGroupsEnd;
}
-LLCullResult::sg_list_t::iterator LLCullResult::beginAlphaGroups()
+LLCullResult::sg_iterator LLCullResult::beginAlphaGroups()
{
- return mAlphaGroups.begin();
+ return mAlphaGroups;
}
-LLCullResult::sg_list_t::iterator LLCullResult::endAlphaGroups()
+LLCullResult::sg_iterator LLCullResult::endAlphaGroups()
{
return mAlphaGroupsEnd;
}
-LLCullResult::sg_list_t::iterator LLCullResult::beginOcclusionGroups()
+LLCullResult::sg_iterator LLCullResult::beginOcclusionGroups()
{
- return mOcclusionGroups.begin();
+ return mOcclusionGroups;
}
-LLCullResult::sg_list_t::iterator LLCullResult::endOcclusionGroups()
+LLCullResult::sg_iterator LLCullResult::endOcclusionGroups()
{
return mOcclusionGroupsEnd;
}
-LLCullResult::sg_list_t::iterator LLCullResult::beginDrawableGroups()
+LLCullResult::sg_iterator LLCullResult::beginDrawableGroups()
{
- return mDrawableGroups.begin();
+ return mDrawableGroups;
}
-LLCullResult::sg_list_t::iterator LLCullResult::endDrawableGroups()
+LLCullResult::sg_iterator LLCullResult::endDrawableGroups()
{
return mDrawableGroupsEnd;
}
-LLCullResult::drawable_list_t::iterator LLCullResult::beginVisibleList()
+LLCullResult::drawable_iterator LLCullResult::beginVisibleList()
{
- return mVisibleList.begin();
+ return mVisibleList;
}
-LLCullResult::drawable_list_t::iterator LLCullResult::endVisibleList()
+LLCullResult::drawable_iterator LLCullResult::endVisibleList()
{
return mVisibleListEnd;
}
-LLCullResult::bridge_list_t::iterator LLCullResult::beginVisibleBridge()
+LLCullResult::bridge_iterator LLCullResult::beginVisibleBridge()
{
- return mVisibleBridge.begin();
+ return mVisibleBridge;
}
-LLCullResult::bridge_list_t::iterator LLCullResult::endVisibleBridge()
+LLCullResult::bridge_iterator LLCullResult::endVisibleBridge()
{
return mVisibleBridgeEnd;
}
-LLCullResult::drawinfo_list_t::iterator LLCullResult::beginRenderMap(U32 type)
+LLCullResult::drawinfo_iterator LLCullResult::beginRenderMap(U32 type)
{
- return mRenderMap[type].begin();
+ return mRenderMap[type];
}
-LLCullResult::drawinfo_list_t::iterator LLCullResult::endRenderMap(U32 type)
+LLCullResult::drawinfo_iterator LLCullResult::endRenderMap(U32 type)
{
return mRenderMapEnd[type];
}
void LLCullResult::pushVisibleGroup(LLSpatialGroup* group)
{
- if (mVisibleGroupsSize < mVisibleGroups.size())
+ if (mVisibleGroupsSize < mVisibleGroupsAllocated)
{
mVisibleGroups[mVisibleGroupsSize] = group;
}
else
{
- mVisibleGroups.push_back(group);
+ pushBack((void**&) mVisibleGroups, mVisibleGroupsAllocated, (void*) group);
}
++mVisibleGroupsSize;
- mVisibleGroupsEnd = mVisibleGroups.begin()+mVisibleGroupsSize;
+ mVisibleGroupsEnd = mVisibleGroups+mVisibleGroupsSize;
}
void LLCullResult::pushAlphaGroup(LLSpatialGroup* group)
{
- if (mAlphaGroupsSize < mAlphaGroups.size())
+ if (mAlphaGroupsSize < mAlphaGroupsAllocated)
{
mAlphaGroups[mAlphaGroupsSize] = group;
}
else
{
- mAlphaGroups.push_back(group);
+ pushBack((void**&) mAlphaGroups, mAlphaGroupsAllocated, (void*) group);
}
++mAlphaGroupsSize;
- mAlphaGroupsEnd = mAlphaGroups.begin()+mAlphaGroupsSize;
+ mAlphaGroupsEnd = mAlphaGroups+mAlphaGroupsSize;
}
void LLCullResult::pushOcclusionGroup(LLSpatialGroup* group)
{
- if (mOcclusionGroupsSize < mOcclusionGroups.size())
+ if (mOcclusionGroupsSize < mOcclusionGroupsAllocated)
{
mOcclusionGroups[mOcclusionGroupsSize] = group;
}
else
{
- mOcclusionGroups.push_back(group);
+ pushBack((void**&) mOcclusionGroups, mOcclusionGroupsAllocated, (void*) group);
}
++mOcclusionGroupsSize;
- mOcclusionGroupsEnd = mOcclusionGroups.begin()+mOcclusionGroupsSize;
+ mOcclusionGroupsEnd = mOcclusionGroups+mOcclusionGroupsSize;
}
void LLCullResult::pushDrawableGroup(LLSpatialGroup* group)
{
- if (mDrawableGroupsSize < mDrawableGroups.size())
+ if (mDrawableGroupsSize < mDrawableGroupsAllocated)
{
mDrawableGroups[mDrawableGroupsSize] = group;
}
else
{
- mDrawableGroups.push_back(group);
+ pushBack((void**&) mDrawableGroups, mDrawableGroupsAllocated, (void*) group);
}
++mDrawableGroupsSize;
- mDrawableGroupsEnd = mDrawableGroups.begin()+mDrawableGroupsSize;
+ mDrawableGroupsEnd = mDrawableGroups+mDrawableGroupsSize;
}
void LLCullResult::pushDrawable(LLDrawable* drawable)
{
- if (mVisibleListSize < mVisibleList.size())
+ if (mVisibleListSize < mVisibleListAllocated)
{
mVisibleList[mVisibleListSize] = drawable;
}
else
{
- mVisibleList.push_back(drawable);
+ pushBack((void**&) mVisibleList, mVisibleListAllocated, (void*) drawable);
}
++mVisibleListSize;
- mVisibleListEnd = mVisibleList.begin()+mVisibleListSize;
+ mVisibleListEnd = mVisibleList+mVisibleListSize;
}
void LLCullResult::pushBridge(LLSpatialBridge* bridge)
{
- if (mVisibleBridgeSize < mVisibleBridge.size())
+ if (mVisibleBridgeSize < mVisibleBridgeAllocated)
{
mVisibleBridge[mVisibleBridgeSize] = bridge;
}
else
{
- mVisibleBridge.push_back(bridge);
+ pushBack((void**&) mVisibleBridge, mVisibleBridgeAllocated, (void*) bridge);
}
++mVisibleBridgeSize;
- mVisibleBridgeEnd = mVisibleBridge.begin()+mVisibleBridgeSize;
+ mVisibleBridgeEnd = mVisibleBridge+mVisibleBridgeSize;
}
void LLCullResult::pushDrawInfo(U32 type, LLDrawInfo* draw_info)
{
- if (mRenderMapSize[type] < mRenderMap[type].size())
+ if (mRenderMapSize[type] < mRenderMapAllocated[type])
{
mRenderMap[type][mRenderMapSize[type]] = draw_info;
}
else
{
- mRenderMap[type].push_back(draw_info);
+ pushBack((void**&) mRenderMap[type], mRenderMapAllocated[type], (void*) draw_info);
}
++mRenderMapSize[type];
- mRenderMapEnd[type] = mRenderMap[type].begin() + mRenderMapSize[type];
+ mRenderMapEnd[type] = mRenderMap[type] + mRenderMapSize[type];
}
diff --git a/indra/newview/llspatialpartition.h b/indra/newview/llspatialpartition.h
index 1a93145cc5..f050df2b39 100644
--- a/indra/newview/llspatialpartition.h
+++ b/indra/newview/llspatialpartition.h
@@ -68,6 +68,16 @@ protected:
~LLDrawInfo();
public:
+ void* operator new(size_t size)
+ {
+ return ll_aligned_malloc_16(size);
+ }
+
+ void operator delete(void* ptr)
+ {
+ ll_aligned_free_16(ptr);
+ }
+
LLDrawInfo(const LLDrawInfo& rhs)
{
@@ -106,7 +116,7 @@ public:
F32 mPartSize;
F32 mVSize;
LLSpatialGroup* mGroup;
- LLFace* mFace; //associated face
+ LL_ALIGN_16(LLFace* mFace); //associated face
F32 mDistance;
U32 mDrawMode;
@@ -181,7 +191,7 @@ public:
};
};
-LL_ALIGN_PREFIX(64)
+LL_ALIGN_PREFIX(16)
class LLSpatialGroup : public LLOctreeListener<LLDrawable>
{
friend class LLSpatialPartition;
@@ -193,6 +203,16 @@ public:
*this = rhs;
}
+ void* operator new(size_t size)
+ {
+ return ll_aligned_malloc_16(size);
+ }
+
+ void operator delete(void* ptr)
+ {
+ ll_aligned_free_16(ptr);
+ }
+
const LLSpatialGroup& operator=(const LLSpatialGroup& rhs)
{
llerrs << "Illegal operation!" << llendl;
@@ -263,11 +283,10 @@ public:
SKIP_FRUSTUM_CHECK = 0x00000020,
IN_IMAGE_QUEUE = 0x00000040,
IMAGE_DIRTY = 0x00000080,
- OCCLUSION_DIRTY = 0x00000100,
- MESH_DIRTY = 0x00000200,
- NEW_DRAWINFO = 0x00000400,
- IN_BUILD_Q1 = 0x00000800,
- IN_BUILD_Q2 = 0x00001000,
+ MESH_DIRTY = 0x00000100,
+ NEW_DRAWINFO = 0x00000200,
+ IN_BUILD_Q1 = 0x00000400,
+ IN_BUILD_Q2 = 0x00000800,
STATE_MASK = 0x0000FFFF,
} eSpatialState;
@@ -313,10 +332,9 @@ public:
BOOL boundObjects(BOOL empty, LLVector4a& newMin, LLVector4a& newMax);
void unbound();
BOOL rebound();
- void buildOcclusion(); //rebuild mOcclusionVerts
void checkOcclusion(); //read back last occlusion query (if any)
void doOcclusion(LLCamera* camera); //issue occlusion query
- void destroyGL();
+ void destroyGL(bool keep_occlusion = false);
void updateDistance(LLCamera& camera);
BOOL needsUpdate();
@@ -327,8 +345,13 @@ public:
void dirtyGeom() { setState(GEOM_DIRTY); }
void dirtyMesh() { setState(MESH_DIRTY); }
+
+ //octree wrappers to make code more readable
element_list& getData() { return mOctreeNode->getData(); }
+ element_iter getDataBegin() { return mOctreeNode->getDataBegin(); }
+ element_iter getDataEnd() { return mOctreeNode->getDataEnd(); }
U32 getElementCount() const { return mOctreeNode->getElementCount(); }
+ bool isEmpty() const { return mOctreeNode->isEmpty(); }
void drawObjectBox(LLColor4 col);
@@ -372,12 +395,12 @@ public:
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;
+ LL_ALIGN_16(LLVector4a mBounds[2]); // bounding box (center, size) of this node and all its children (tight fit to objects)
+ LL_ALIGN_16(LLVector4a mExtents[2]); // extents (min, max) of this node and all its children
+ LL_ALIGN_16(LLVector4a mObjectExtents[2]); // extents (min, max) of objects in this node
+ LL_ALIGN_16(LLVector4a mObjectBounds[2]); // bounding box (center, size) of objects in this node
+ LL_ALIGN_16(LLVector4a mViewAngle);
+ LL_ALIGN_16(LLVector4a mLastUpdateViewAngle);
F32 mObjectBoxSize; //cached mObjectBounds[1].getLength3()
@@ -415,7 +438,6 @@ public:
LLSpatialPartition* mSpatialPartition;
LLPointer<LLVertexBuffer> mVertexBuffer;
- LLPointer<LLVertexBuffer> mOcclusionVerts;
GLuint mOcclusionQuery[LLViewerCamera::NUM_CAMERAS];
U32 mBufferUsage;
@@ -545,34 +567,39 @@ class LLCullResult
public:
LLCullResult();
- typedef std::vector<LLSpatialGroup*> sg_list_t;
- typedef std::vector<LLDrawable*> drawable_list_t;
- typedef std::vector<LLSpatialBridge*> bridge_list_t;
- typedef std::vector<LLDrawInfo*> drawinfo_list_t;
+ typedef LLSpatialGroup** sg_list_t;
+ typedef LLDrawable** drawable_list_t;
+ typedef LLSpatialBridge** bridge_list_t;
+ typedef LLDrawInfo** drawinfo_list_t;
+
+ typedef LLSpatialGroup** sg_iterator;
+ typedef LLSpatialBridge** bridge_iterator;
+ typedef LLDrawInfo** drawinfo_iterator;
+ typedef LLDrawable** drawable_iterator;
void clear();
- sg_list_t::iterator beginVisibleGroups();
- sg_list_t::iterator endVisibleGroups();
+ sg_iterator beginVisibleGroups();
+ sg_iterator endVisibleGroups();
- sg_list_t::iterator beginAlphaGroups();
- sg_list_t::iterator endAlphaGroups();
+ sg_iterator beginAlphaGroups();
+ sg_iterator endAlphaGroups();
bool hasOcclusionGroups() { return mOcclusionGroupsSize > 0; }
- sg_list_t::iterator beginOcclusionGroups();
- sg_list_t::iterator endOcclusionGroups();
+ sg_iterator beginOcclusionGroups();
+ sg_iterator endOcclusionGroups();
- sg_list_t::iterator beginDrawableGroups();
- sg_list_t::iterator endDrawableGroups();
+ sg_iterator beginDrawableGroups();
+ sg_iterator endDrawableGroups();
- drawable_list_t::iterator beginVisibleList();
- drawable_list_t::iterator endVisibleList();
+ drawable_iterator beginVisibleList();
+ drawable_iterator endVisibleList();
- bridge_list_t::iterator beginVisibleBridge();
- bridge_list_t::iterator endVisibleBridge();
+ bridge_iterator beginVisibleBridge();
+ bridge_iterator endVisibleBridge();
- drawinfo_list_t::iterator beginRenderMap(U32 type);
- drawinfo_list_t::iterator endRenderMap(U32 type);
+ drawinfo_iterator beginRenderMap(U32 type);
+ drawinfo_iterator endRenderMap(U32 type);
void pushVisibleGroup(LLSpatialGroup* group);
void pushAlphaGroup(LLSpatialGroup* group);
@@ -592,28 +619,41 @@ public:
void assertDrawMapsEmpty();
private:
+
+ void pushBack(void** &head, U32& count, void* val);
+
U32 mVisibleGroupsSize;
U32 mAlphaGroupsSize;
U32 mOcclusionGroupsSize;
U32 mDrawableGroupsSize;
U32 mVisibleListSize;
U32 mVisibleBridgeSize;
+
+ U32 mVisibleGroupsAllocated;
+ U32 mAlphaGroupsAllocated;
+ U32 mOcclusionGroupsAllocated;
+ U32 mDrawableGroupsAllocated;
+ U32 mVisibleListAllocated;
+ U32 mVisibleBridgeAllocated;
+
U32 mRenderMapSize[LLRenderPass::NUM_RENDER_TYPES];
sg_list_t mVisibleGroups;
- sg_list_t::iterator mVisibleGroupsEnd;
+ sg_iterator mVisibleGroupsEnd;
sg_list_t mAlphaGroups;
- sg_list_t::iterator mAlphaGroupsEnd;
+ sg_iterator mAlphaGroupsEnd;
sg_list_t mOcclusionGroups;
- sg_list_t::iterator mOcclusionGroupsEnd;
+ sg_iterator mOcclusionGroupsEnd;
sg_list_t mDrawableGroups;
- sg_list_t::iterator mDrawableGroupsEnd;
+ sg_iterator mDrawableGroupsEnd;
drawable_list_t mVisibleList;
- drawable_list_t::iterator mVisibleListEnd;
+ drawable_iterator mVisibleListEnd;
bridge_list_t mVisibleBridge;
- bridge_list_t::iterator mVisibleBridgeEnd;
+ bridge_iterator mVisibleBridgeEnd;
drawinfo_list_t mRenderMap[LLRenderPass::NUM_RENDER_TYPES];
- drawinfo_list_t::iterator mRenderMapEnd[LLRenderPass::NUM_RENDER_TYPES];
+ U32 mRenderMapAllocated[LLRenderPass::NUM_RENDER_TYPES];
+ drawinfo_iterator mRenderMapEnd[LLRenderPass::NUM_RENDER_TYPES];
+
};
@@ -657,6 +697,7 @@ class LLParticlePartition : public LLSpatialPartition
{
public:
LLParticlePartition();
+ virtual void rebuildGeom(LLSpatialGroup* group);
virtual void getGeometry(LLSpatialGroup* group);
virtual void addGeometryCount(LLSpatialGroup* group, U32 &vertex_count, U32& index_count);
virtual F32 calcPixelArea(LLSpatialGroup* group, LLCamera& camera);
@@ -671,10 +712,14 @@ public:
};
//spatial partition for grass (implemented in LLVOGrass.cpp)
-class LLGrassPartition : public LLParticlePartition
+class LLGrassPartition : public LLSpatialPartition
{
public:
LLGrassPartition();
+ virtual void getGeometry(LLSpatialGroup* group);
+ virtual void addGeometryCount(LLSpatialGroup* group, U32 &vertex_count, U32& index_count);
+protected:
+ U32 mRenderPass;
};
//class for wrangling geometry out of volumes (implemented in LLVOVolume.cpp)
diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp
index 6b0fc26db7..42648b82c2 100644..100755
--- a/indra/newview/llstartup.cpp
+++ b/indra/newview/llstartup.cpp
@@ -186,6 +186,7 @@
#include "llappearancemgr.h"
#include "llavatariconctrl.h"
#include "llvoicechannel.h"
+#include "llpathfindingmanager.h"
#include "lllogin.h"
#include "llevents.h"
@@ -361,6 +362,15 @@ bool idle_startup()
if ( STATE_FIRST == LLStartUp::getStartupState() )
{
+ static bool first_call = true;
+ if (first_call)
+ {
+ // Other phases get handled when startup state changes,
+ // need to capture the initial state as well.
+ LLStartUp::getPhases().startPhase(LLStartUp::getStartupStateString());
+ first_call = false;
+ }
+
gViewerWindow->showCursor();
gViewerWindow->getWindow()->setCursor(UI_CURSOR_WAIT);
@@ -720,12 +730,14 @@ bool idle_startup()
if (STATE_LOGIN_SHOW == LLStartUp::getStartupState())
{
- LL_DEBUGS("AppInit") << "Initializing Window" << LL_ENDL;
+ LL_DEBUGS("AppInit") << "Initializing Window, show_connect_box = "
+ << show_connect_box << LL_ENDL;
// if we've gone backwards in the login state machine, to this state where we show the UI
// AND the debug setting to exit in this case is true, then go ahead and bail quickly
if ( mLoginStatePastUI && gSavedSettings.getBOOL("QuitOnLoginActivated") )
{
+ LL_DEBUGS("AppInit") << "taking QuitOnLoginActivated exit" << LL_ENDL;
// no requirement for notification here - just exit
LLAppViewer::instance()->earlyExitNoNotify();
}
@@ -738,8 +750,10 @@ bool idle_startup()
// this startup phase more than once.
if (gLoginMenuBarView == NULL)
{
+ LL_DEBUGS("AppInit") << "initializing menu bar" << LL_ENDL;
display_startup();
initialize_edit_menu();
+ initialize_spellcheck_menu();
display_startup();
init_menus();
display_startup();
@@ -747,11 +761,13 @@ bool idle_startup()
if (show_connect_box)
{
+ LL_DEBUGS("AppInit") << "show_connect_box on" << LL_ENDL;
// Load all the name information out of the login view
// NOTE: Hits "Attempted getFields with no login view shown" warning, since we don't
// show the login view until login_show() is called below.
if (gUserCredential.isNull())
{
+ LL_DEBUGS("AppInit") << "loading credentials from gLoginHandler" << LL_ENDL;
display_startup();
gUserCredential = gLoginHandler.initializeLoginInfo();
display_startup();
@@ -768,17 +784,28 @@ bool idle_startup()
login_show();
display_startup();
// connect dialog is already shown, so fill in the names
- if (gUserCredential.notNull())
- {
- LLPanelLogin::setFields( gUserCredential, gRememberPassword);
- }
+ if (gUserCredential.notNull())
+ {
+ LLPanelLogin::setFields( gUserCredential, gRememberPassword);
+ }
display_startup();
LLPanelLogin::giveFocus();
+ if (gSavedSettings.getBOOL("FirstLoginThisInstall"))
+ {
+ LL_INFOS("AppInit") << "FirstLoginThisInstall, calling show_first_run_dialog()" << LL_ENDL;
+ show_first_run_dialog();
+ }
+ else
+ {
+ LL_DEBUGS("AppInit") << "FirstLoginThisInstall off" << LL_ENDL;
+ }
+
LLStartUp::setStartupState( STATE_LOGIN_WAIT ); // Wait for user input
}
else
{
+ LL_DEBUGS("AppInit") << "show_connect_box off, skipping to STATE_LOGIN_CLEANUP" << LL_ENDL;
// skip directly to message template verification
LLStartUp::setStartupState( STATE_LOGIN_CLEANUP );
}
@@ -995,7 +1022,7 @@ bool idle_startup()
if(STATE_LOGIN_AUTH_INIT == LLStartUp::getStartupState())
{
- gDebugInfo["GridName"] = LLGridManager::getInstance()->getGridLabel();
+ gDebugInfo["GridName"] = LLGridManager::getInstance()->getGridId();
// Update progress status and the display loop.
auth_desc = LLTrans::getString("LoginInProgress");
@@ -1159,7 +1186,6 @@ bool idle_startup()
LLVoiceClient::getInstance()->userAuthorized(gUserCredential->userID(), gAgentID);
// create the default proximal channel
LLVoiceChannel::initClass();
- LLGridManager::getInstance()->setFavorite();
LLStartUp::setStartupState( STATE_WORLD_INIT);
}
else
@@ -1922,7 +1948,8 @@ bool idle_startup()
{
llinfos << "gAgentStartLocation : " << gAgentStartLocation << llendl;
LLSLURL start_slurl = LLStartUp::getStartSLURL();
-
+ LL_DEBUGS("AppInit") << "start slurl "<<start_slurl.asString()<<LL_ENDL;
+
if (((start_slurl.getType() == LLSLURL::LOCATION) && (gAgentStartLocation == "url")) ||
((start_slurl.getType() == LLSLURL::LAST_LOCATION) && (gAgentStartLocation == "last")) ||
((start_slurl.getType() == LLSLURL::HOME_LOCATION) && (gAgentStartLocation == "home")))
@@ -2166,6 +2193,9 @@ bool idle_startup()
LLIMFloater::initIMFloater();
display_startup();
+ llassert(LLPathfindingManager::getInstance() != NULL);
+ LLPathfindingManager::getInstance()->initSystem();
+
return TRUE;
}
@@ -2181,21 +2211,13 @@ void login_show()
{
LL_INFOS("AppInit") << "Initializing Login Screen" << LL_ENDL;
-#ifdef LL_RELEASE_FOR_DOWNLOAD
- BOOL bUseDebugLogin = gSavedSettings.getBOOL("UseDebugLogin");
-#else
- BOOL bUseDebugLogin = TRUE;
-#endif
// Hide the toolbars: may happen to come back here if login fails after login agent but before login in region
if (gToolBarView)
{
gToolBarView->setVisible(FALSE);
}
- LLPanelLogin::show( gViewerWindow->getWindowRectScaled(),
- bUseDebugLogin || gSavedSettings.getBOOL("SecondLifeEnterprise"),
- login_callback, NULL );
-
+ LLPanelLogin::show( gViewerWindow->getWindowRectScaled(), login_callback, NULL );
}
// Callback for when login screen is closed. Option 0 = connect, option 1 = quit.
@@ -2274,7 +2296,7 @@ bool login_alert_status(const LLSD& notification, const LLSD& response)
// break;
case 2: // Teleport
// Restart the login process, starting at our home locaton
- LLStartUp::setStartSLURL(LLSLURL(LLSLURL::SIM_LOCATION_HOME));
+ LLStartUp::setStartSLURL(LLSLURL(LLSLURL::SIM_LOCATION_HOME));
LLStartUp::setStartupState( STATE_LOGIN_CLEANUP );
break;
default:
@@ -2707,9 +2729,10 @@ void LLStartUp::setStartupState( EStartupState state )
getStartupStateString() << " to " <<
startupStateToString(state) << LL_ENDL;
- sPhases->stopPhase(getStartupStateString());
+ getPhases().stopPhase(getStartupStateString());
gStartupState = state;
- sPhases->startPhase(getStartupStateString());
+ getPhases().startPhase(getStartupStateString());
+
postStartupState();
}
@@ -2826,25 +2849,33 @@ bool LLStartUp::dispatchURL()
void LLStartUp::setStartSLURL(const LLSLURL& slurl)
{
- sStartSLURL = slurl;
- switch(slurl.getType())
- {
- case LLSLURL::HOME_LOCATION:
- {
- gSavedSettings.setString("LoginLocation", LLSLURL::SIM_LOCATION_HOME);
- break;
- }
- case LLSLURL::LAST_LOCATION:
- {
- gSavedSettings.setString("LoginLocation", LLSLURL::SIM_LOCATION_LAST);
- break;
- }
- default:
- LLGridManager::getInstance()->setGridChoice(slurl.getGrid());
- break;
- }
+ LL_DEBUGS("AppInit")<<slurl.asString()<<LL_ENDL;
+
+ if ( slurl.isSpatial() )
+ {
+ std::string new_start = slurl.getSLURLString();
+ LL_DEBUGS("AppInit")<<new_start<<LL_ENDL;
+ sStartSLURL = slurl;
+ LLPanelLogin::onUpdateStartSLURL(slurl); // updates grid if needed
+
+ // remember that this is where we wanted to log in...if the login fails,
+ // the next attempt will default to the same place.
+ gSavedSettings.setString("NextLoginLocation", new_start);
+ // following a successful login, this is cleared
+ // and the default reverts to LoginLocation
+ }
+ else
+ {
+ LL_WARNS("AppInit")<<"Invalid start SLURL (ignored): "<<slurl.asString()<<LL_ENDL;
+ }
}
+// static
+LLSLURL& LLStartUp::getStartSLURL()
+{
+ return sStartSLURL;
+}
+
/**
* Read all proxy configuration settings and set up both the HTTP proxy and
* SOCKS proxy as needed.
@@ -3215,17 +3246,6 @@ bool process_login_success_response()
gSavedSettings.setU32("PreferredMaturity", preferredMaturity);
}
- // During the AO transition, this flag will be true. Then the flag will
- // go away. After the AO transition, this code and all the code that
- // uses it can be deleted.
- text = response["ao_transition"].asString();
- if (!text.empty())
- {
- if (text == "1")
- {
- gAgent.setAOTransition();
- }
- }
text = response["start_location"].asString();
if(!text.empty())
diff --git a/indra/newview/llstartup.h b/indra/newview/llstartup.h
index 3754aaf966..760e38890b 100644..100755
--- a/indra/newview/llstartup.h
+++ b/indra/newview/llstartup.h
@@ -111,7 +111,7 @@ public:
static void postStartupState();
static void setStartSLURL(const LLSLURL& slurl);
- static LLSLURL& getStartSLURL() { return sStartSLURL; }
+ static LLSLURL& getStartSLURL();
static bool startLLProxy(); // Initialize the SOCKS 5 proxy
diff --git a/indra/newview/llstatusbar.cpp b/indra/newview/llstatusbar.cpp
index 89240c982f..ff69c6e9fd 100644
--- a/indra/newview/llstatusbar.cpp
+++ b/indra/newview/llstatusbar.cpp
@@ -469,7 +469,7 @@ void LLStatusBar::onMouseEnterVolume()
LLRect vol_btn_rect = volbtn->getRect();
LLRect volume_pulldown_rect = mPanelVolumePulldown->getRect();
volume_pulldown_rect.setLeftTopAndSize(vol_btn_rect.mLeft -
- (volume_pulldown_rect.getWidth() - vol_btn_rect.getWidth())/2,
+ (volume_pulldown_rect.getWidth() - vol_btn_rect.getWidth()),
vol_btn_rect.mBottom,
volume_pulldown_rect.getWidth(),
volume_pulldown_rect.getHeight());
diff --git a/indra/newview/llsurface.cpp b/indra/newview/llsurface.cpp
index 66df7dae3e..f64a72a616 100644
--- a/indra/newview/llsurface.cpp
+++ b/indra/newview/llsurface.cpp
@@ -56,6 +56,7 @@
#include "lldrawable.h"
extern LLPipeline gPipeline;
+extern bool gShiftFrame;
LLColor4U MAX_WATER_COLOR(0, 48, 96, 240);
@@ -294,7 +295,7 @@ void LLSurface::initTextures()
mWaterObjp = (LLVOWater *)gObjectList.createObjectViewer(LLViewerObject::LL_VO_WATER, mRegionp);
gPipeline.createObject(mWaterObjp);
LLVector3d water_pos_global = from_region_handle(mRegionp->getHandle());
- water_pos_global += LLVector3d(128.0, 128.0, DEFAULT_WATER_HEIGHT);
+ water_pos_global += LLVector3d(128.0, 128.0, DEFAULT_WATER_HEIGHT); // region doesn't have a valid water height yet
mWaterObjp->setPositionGlobal(water_pos_global);
}
}
@@ -346,6 +347,19 @@ void LLSurface::getNeighboringRegions( std::vector<LLViewerRegion*>& uniqueRegio
}
}
+
+void LLSurface::getNeighboringRegionsStatus( std::vector<S32>& regions )
+{
+ S32 i;
+ for (i = 0; i < 8; i++)
+ {
+ if ( mNeighbors[i] != NULL )
+ {
+ regions.push_back( i );
+ }
+ }
+}
+
void LLSurface::connectNeighbor(LLSurface *neighborp, U32 direction)
{
S32 i;
@@ -608,6 +622,11 @@ void LLSurface::moveZ(const S32 x, const S32 y, const F32 delta)
void LLSurface::updatePatchVisibilities(LLAgent &agent)
{
+ if (gShiftFrame)
+ {
+ return;
+ }
+
LLVector3 pos_region = mRegionp->getPosRegionFromGlobal(gAgentCamera.getCameraPositionGlobal());
LLSurfacePatch *patchp;
diff --git a/indra/newview/llsurface.h b/indra/newview/llsurface.h
index a4ef4fe2de..8052fb0d18 100644
--- a/indra/newview/llsurface.h
+++ b/indra/newview/llsurface.h
@@ -142,6 +142,7 @@ public:
friend std::ostream& operator<<(std::ostream &s, const LLSurface &S);
void getNeighboringRegions( std::vector<LLViewerRegion*>& uniqueRegions );
+ void getNeighboringRegionsStatus( std::vector<S32>& regions );
public:
// Number of grid points on one side of a region, including +1 buffer for
diff --git a/indra/newview/llsurfacepatch.cpp b/indra/newview/llsurfacepatch.cpp
index 5077c2c7e1..a9ba2bce9c 100644
--- a/indra/newview/llsurfacepatch.cpp
+++ b/indra/newview/llsurfacepatch.cpp
@@ -43,6 +43,7 @@
#include "lldrawpool.h"
#include "noise.h"
+extern bool gShiftFrame;
extern U64 gFrameTime;
extern LLPipeline gPipeline;
@@ -218,7 +219,7 @@ void LLSurfacePatch::eval(const U32 x, const U32 y, const U32 stride, LLVector3
pos_agent.mV[VX] += x * mSurfacep->getMetersPerGrid();
pos_agent.mV[VY] += y * mSurfacep->getMetersPerGrid();
pos_agent.mV[VZ] = *(mDataZ + point_offset);
- *vertex = pos_agent;
+ *vertex = pos_agent-mVObjp->getRegion()->getOriginAgent();
LLVector3 rel_pos = pos_agent - mSurfacep->getOriginAgent();
LLVector3 tex_pos = rel_pos * (1.f/surface_stride);
@@ -366,10 +367,13 @@ void LLSurfacePatch::updateCameraDistanceRegion(const LLVector3 &pos_region)
{
if (LLPipeline::sDynamicLOD)
{
- LLVector3 dv = pos_region;
- dv -= mCenterRegion;
- mVisInfo.mDistance = llmax(0.f, (F32)(dv.magVec() - mRadius))/
- llmax(LLVOSurfacePatch::sLODFactor, 0.1f);
+ if (!gShiftFrame)
+ {
+ LLVector3 dv = pos_region;
+ dv -= mCenterRegion;
+ mVisInfo.mDistance = llmax(0.f, (F32)(dv.magVec() - mRadius))/
+ llmax(LLVOSurfacePatch::sLODFactor, 0.1f);
+ }
}
else
{
diff --git a/indra/newview/lltexlayerparams.h b/indra/newview/lltexlayerparams.h
index 74c22b0cdf..2c0da60b48 100644
--- a/indra/newview/lltexlayerparams.h
+++ b/indra/newview/lltexlayerparams.h
@@ -76,11 +76,11 @@ public:
// LLViewerVisualParam Virtual functions
/*virtual*/ F32 getTotalDistortion() { return 1.f; }
- /*virtual*/ const LLVector3& getAvgDistortion() { return mAvgDistortionVec; }
+ /*virtual*/ const LLVector4a& getAvgDistortion() { return mAvgDistortionVec; }
/*virtual*/ F32 getMaxDistortion() { return 3.f; }
- /*virtual*/ LLVector3 getVertexDistortion(S32 index, LLPolyMesh *poly_mesh) { return LLVector3(1.f, 1.f, 1.f);}
- /*virtual*/ const LLVector3* getFirstDistortion(U32 *index, LLPolyMesh **poly_mesh) { index = 0; poly_mesh = NULL; return &mAvgDistortionVec;};
- /*virtual*/ const LLVector3* getNextDistortion(U32 *index, LLPolyMesh **poly_mesh) { index = 0; poly_mesh = NULL; return NULL;};
+ /*virtual*/ LLVector4a getVertexDistortion(S32 index, LLPolyMesh *poly_mesh) { return LLVector4a(1.f, 1.f, 1.f);}
+ /*virtual*/ const LLVector4a* getFirstDistortion(U32 *index, LLPolyMesh **poly_mesh) { index = 0; poly_mesh = NULL; return &mAvgDistortionVec;};
+ /*virtual*/ const LLVector4a* getNextDistortion(U32 *index, LLPolyMesh **poly_mesh) { index = 0; poly_mesh = NULL; return NULL;};
// New functions
BOOL render( S32 x, S32 y, S32 width, S32 height );
@@ -94,7 +94,7 @@ private:
LLPointer<LLImageRaw> mStaticImageRaw;
BOOL mNeedsCreateTexture;
BOOL mStaticImageInvalid;
- LLVector3 mAvgDistortionVec;
+ LLVector4a mAvgDistortionVec;
F32 mCachedEffectiveWeight;
public:
@@ -155,18 +155,18 @@ public:
// LLViewerVisualParam Virtual functions
/*virtual*/ F32 getTotalDistortion() { return 1.f; }
- /*virtual*/ const LLVector3& getAvgDistortion() { return mAvgDistortionVec; }
+ /*virtual*/ const LLVector4a& getAvgDistortion() { return mAvgDistortionVec; }
/*virtual*/ F32 getMaxDistortion() { return 3.f; }
- /*virtual*/ LLVector3 getVertexDistortion(S32 index, LLPolyMesh *poly_mesh) { return LLVector3(1.f, 1.f, 1.f); }
- /*virtual*/ const LLVector3* getFirstDistortion(U32 *index, LLPolyMesh **poly_mesh) { index = 0; poly_mesh = NULL; return &mAvgDistortionVec;};
- /*virtual*/ const LLVector3* getNextDistortion(U32 *index, LLPolyMesh **poly_mesh) { index = 0; poly_mesh = NULL; return NULL;};
+ /*virtual*/ LLVector4a getVertexDistortion(S32 index, LLPolyMesh *poly_mesh) { return LLVector4a(1.f, 1.f, 1.f); }
+ /*virtual*/ const LLVector4a* getFirstDistortion(U32 *index, LLPolyMesh **poly_mesh) { index = 0; poly_mesh = NULL; return &mAvgDistortionVec;};
+ /*virtual*/ const LLVector4a* getNextDistortion(U32 *index, LLPolyMesh **poly_mesh) { index = 0; poly_mesh = NULL; return NULL;};
// New functions
LLColor4 getNetColor() const;
protected:
virtual void onGlobalColorChanged(bool upload_bake) {}
private:
- LLVector3 mAvgDistortionVec;
+ LLVector4a mAvgDistortionVec;
};
class LLTexLayerParamColorInfo : public LLViewerVisualParamInfo
diff --git a/indra/newview/lltextureatlas.cpp b/indra/newview/lltextureatlas.cpp
index d2e4b01732..f8c1bca8ae 100644
--- a/indra/newview/lltextureatlas.cpp
+++ b/indra/newview/lltextureatlas.cpp
@@ -116,7 +116,6 @@ LLGLuint LLTextureAtlas::insertSubTexture(LLImageGL* source_gl_tex, S32 discard_
return 0 ;
}
- glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP_SGIS, TRUE);
glTexSubImage2D(GL_TEXTURE_2D, 0, xoffset, yoffset, w, h,
mGLTexturep->getPrimaryFormat(), mGLTexturep->getFormatType(), raw_image->getData());
diff --git a/indra/newview/lltexturecache.cpp b/indra/newview/lltexturecache.cpp
index 8632890bbb..a61e2d5c86 100644
--- a/indra/newview/lltexturecache.cpp
+++ b/indra/newview/lltexturecache.cpp
@@ -50,6 +50,8 @@
const S32 TEXTURE_CACHE_ENTRY_SIZE = FIRST_PACKET_SIZE;//1024;
const F32 TEXTURE_CACHE_PURGE_AMOUNT = .20f; // % amount to reduce the cache by when it exceeds its limit
const F32 TEXTURE_CACHE_LRU_SIZE = .10f; // % amount for LRU list (low overhead to regenerate)
+const S32 TEXTURE_FAST_CACHE_ENTRY_OVERHEAD = sizeof(S32) * 4; //w, h, c, level
+const S32 TEXTURE_FAST_CACHE_ENTRY_SIZE = 16 * 16 * 4 + TEXTURE_FAST_CACHE_ENTRY_OVERHEAD;
class LLTextureCacheWorker : public LLWorkerClass
{
@@ -283,9 +285,12 @@ public:
LLTextureCacheRemoteWorker(LLTextureCache* cache, U32 priority, const LLUUID& id,
U8* data, S32 datasize, S32 offset,
S32 imagesize, // for writes
+ LLPointer<LLImageRaw> raw, S32 discardlevel,
LLTextureCache::Responder* responder)
: LLTextureCacheWorker(cache, priority, id, data, datasize, offset, imagesize, responder),
- mState(INIT)
+ mState(INIT),
+ mRawImage(raw),
+ mRawDiscardLevel(discardlevel)
{
}
@@ -303,6 +308,8 @@ private:
};
e_state mState;
+ LLPointer<LLImageRaw> mRawImage;
+ S32 mRawDiscardLevel;
};
@@ -559,6 +566,11 @@ bool LLTextureCacheRemoteWorker::doWrite()
if(idx < 0)
{
idx = mCache->setHeaderCacheEntry(mID, entry, mImageSize, mDataSize); // create the new entry.
+ if(idx >= 0)
+ {
+ //write to the fast cache.
+ llassert_always(mCache->writeToFastCache(idx, mRawImage, mRawDiscardLevel));
+ }
}
else
{
@@ -658,6 +670,7 @@ bool LLTextureCacheRemoteWorker::doWrite()
// Nothing else to do at that point...
done = true;
}
+ mRawImage = NULL;
// Clean up and exit
return done;
@@ -744,10 +757,14 @@ LLTextureCache::LLTextureCache(bool threaded)
mWorkersMutex(NULL),
mHeaderMutex(NULL),
mListMutex(NULL),
+ mFastCacheMutex(NULL),
mHeaderAPRFile(NULL),
mReadOnly(TRUE), //do not allow to change the texture cache until setReadOnly() is called.
mTexturesSizeTotal(0),
- mDoPurge(FALSE)
+ mDoPurge(FALSE),
+ mFastCachep(NULL),
+ mFastCachePoolp(NULL),
+ mFastCachePadBuffer(NULL)
{
}
@@ -755,6 +772,9 @@ LLTextureCache::~LLTextureCache()
{
clearDeleteList() ;
writeUpdatedEntries() ;
+ delete mFastCachep;
+ delete mFastCachePoolp;
+ FREE_MEM(LLImageBase::getPrivatePool(), mFastCachePadBuffer);
}
//////////////////////////////////////////////////////////////////////////////
@@ -879,15 +899,15 @@ BOOL LLTextureCache::isInLocal(const LLUUID& id)
//////////////////////////////////////////////////////////////////////////////
//static
-const S32 MAX_REASONABLE_FILE_SIZE = 512*1024*1024; // 512 MB
-F32 LLTextureCache::sHeaderCacheVersion = 1.4f;
-U32 LLTextureCache::sCacheMaxEntries = MAX_REASONABLE_FILE_SIZE / TEXTURE_CACHE_ENTRY_SIZE;
+F32 LLTextureCache::sHeaderCacheVersion = 1.7f;
+U32 LLTextureCache::sCacheMaxEntries = 1024 * 1024; //~1 million textures.
S64 LLTextureCache::sCacheMaxTexturesSize = 0; // no limit
const char* entries_filename = "texture.entries";
const char* cache_filename = "texture.cache";
const char* old_textures_dirname = "textures";
//change the location of the texture cache to prevent from being deleted by old version viewers.
const char* textures_dirname = "texturecache";
+const char* fast_cache_filename = "FastCache.cache";
void LLTextureCache::setDirNames(ELLPath location)
{
@@ -896,6 +916,7 @@ void LLTextureCache::setDirNames(ELLPath location)
mHeaderEntriesFileName = gDirUtilp->getExpandedFilename(location, textures_dirname, entries_filename);
mHeaderDataFileName = gDirUtilp->getExpandedFilename(location, textures_dirname, cache_filename);
mTexturesDirName = gDirUtilp->getExpandedFilename(location, textures_dirname);
+ mFastCacheFileName = gDirUtilp->getExpandedFilename(location, textures_dirname, fast_cache_filename);
}
void LLTextureCache::purgeCache(ELLPath location)
@@ -938,8 +959,8 @@ S64 LLTextureCache::initCache(ELLPath location, S64 max_size, BOOL texture_cache
{
llassert_always(getPending() == 0) ; //should not start accessing the texture cache before initialized.
- S64 header_size = (max_size * 2) / 10;
- S64 max_entries = header_size / TEXTURE_CACHE_ENTRY_SIZE;
+ S64 header_size = (max_size / 100) * 36; //0.36 * max_size
+ S64 max_entries = header_size / (TEXTURE_CACHE_ENTRY_SIZE + TEXTURE_FAST_CACHE_ENTRY_SIZE);
sCacheMaxEntries = (S32)(llmin((S64)sCacheMaxEntries, max_entries));
header_size = sCacheMaxEntries * TEXTURE_CACHE_ENTRY_SIZE;
max_size -= header_size;
@@ -981,6 +1002,7 @@ S64 LLTextureCache::initCache(ELLPath location, S64 max_size, BOOL texture_cache
purgeTextures(true); // calc mTexturesSize and make some room in the texture cache if we need it
llassert_always(getPending() == 0) ; //should not start accessing the texture cache before initialized.
+ openFastCache(true);
return max_size; // unused cache space
}
@@ -1751,7 +1773,7 @@ LLTextureCache::handle_t LLTextureCache::readFromCache(const LLUUID& id, U32 pri
LLMutexLock lock(&mWorkersMutex);
LLTextureCacheWorker* worker = new LLTextureCacheRemoteWorker(this, priority, id,
NULL, size, offset,
- 0, responder);
+ 0, NULL, 0, responder);
handle_t handle = worker->read();
mReaders[handle] = worker;
return handle;
@@ -1789,6 +1811,7 @@ bool LLTextureCache::readComplete(handle_t handle, bool abort)
LLTextureCache::handle_t LLTextureCache::writeToCache(const LLUUID& id, U32 priority,
U8* data, S32 datasize, S32 imagesize,
+ LLPointer<LLImageRaw> rawimage, S32 discardlevel,
WriteResponder* responder)
{
if (mReadOnly)
@@ -1807,12 +1830,159 @@ LLTextureCache::handle_t LLTextureCache::writeToCache(const LLUUID& id, U32 prio
LLMutexLock lock(&mWorkersMutex);
LLTextureCacheWorker* worker = new LLTextureCacheRemoteWorker(this, priority, id,
data, datasize, 0,
- imagesize, responder);
+ imagesize, rawimage, discardlevel, responder);
handle_t handle = worker->write();
mWriters[handle] = worker;
return handle;
}
+//called in the main thread
+LLPointer<LLImageRaw> LLTextureCache::readFromFastCache(const LLUUID& id, S32& discardlevel)
+{
+ U32 offset;
+ {
+ LLMutexLock lock(&mHeaderMutex);
+ id_map_t::const_iterator iter = mHeaderIDMap.find(id);
+ if(iter == mHeaderIDMap.end())
+ {
+ return NULL; //not in the cache
+ }
+
+ offset = iter->second;
+ }
+ offset *= TEXTURE_FAST_CACHE_ENTRY_SIZE;
+
+ U8* data;
+ S32 head[4];
+ {
+ LLMutexLock lock(&mFastCacheMutex);
+
+ openFastCache();
+
+ mFastCachep->seek(APR_SET, offset);
+
+ llassert_always(mFastCachep->read(head, TEXTURE_FAST_CACHE_ENTRY_OVERHEAD) == TEXTURE_FAST_CACHE_ENTRY_OVERHEAD);
+
+ S32 image_size = head[0] * head[1] * head[2];
+ if(!image_size) //invalid
+ {
+ closeFastCache();
+ return NULL;
+ }
+ discardlevel = head[3];
+
+ data = (U8*)ALLOCATE_MEM(LLImageBase::getPrivatePool(), image_size);
+ llassert_always(mFastCachep->read(data, image_size) == image_size);
+ closeFastCache();
+ }
+ LLPointer<LLImageRaw> raw = new LLImageRaw(data, head[0], head[1], head[2], true);
+
+ return raw;
+}
+
+//return the fast cache location
+bool LLTextureCache::writeToFastCache(S32 id, LLPointer<LLImageRaw> raw, S32 discardlevel)
+{
+ //rescale image if needed
+ S32 w, h, c;
+ w = raw->getWidth();
+ h = raw->getHeight();
+ c = raw->getComponents();
+ S32 i = 0 ;
+
+ while(((w >> i) * (h >> i) * c) > TEXTURE_FAST_CACHE_ENTRY_SIZE - TEXTURE_FAST_CACHE_ENTRY_OVERHEAD)
+ {
+ ++i ;
+ }
+
+ if(i)
+ {
+ w >>= i;
+ h >>= i;
+ if(w * h *c > 0) //valid
+ {
+ LLPointer<LLImageRaw> newraw = new LLImageRaw(raw->getData(), raw->getWidth(), raw->getHeight(), raw->getComponents());
+ newraw->scale(w, h) ;
+ raw = newraw;
+
+ discardlevel += i ;
+ }
+ }
+
+ //copy data
+ memcpy(mFastCachePadBuffer, &w, sizeof(S32));
+ memcpy(mFastCachePadBuffer + sizeof(S32), &h, sizeof(S32));
+ memcpy(mFastCachePadBuffer + sizeof(S32) * 2, &c, sizeof(S32));
+ memcpy(mFastCachePadBuffer + sizeof(S32) * 3, &discardlevel, sizeof(S32));
+ if(w * h * c > 0) //valid
+ {
+ memcpy(mFastCachePadBuffer + TEXTURE_FAST_CACHE_ENTRY_OVERHEAD, raw->getData(), w * h * c);
+ }
+ S32 offset = id * TEXTURE_FAST_CACHE_ENTRY_SIZE;
+
+ {
+ LLMutexLock lock(&mFastCacheMutex);
+
+ openFastCache();
+
+ mFastCachep->seek(APR_SET, offset);
+ llassert_always(mFastCachep->write(mFastCachePadBuffer, TEXTURE_FAST_CACHE_ENTRY_SIZE) == TEXTURE_FAST_CACHE_ENTRY_SIZE);
+
+ closeFastCache(true);
+ }
+
+ return true;
+}
+
+void LLTextureCache::openFastCache(bool first_time)
+{
+ if(!mFastCachep)
+ {
+ if(first_time)
+ {
+ if(!mFastCachePadBuffer)
+ {
+ mFastCachePadBuffer = (U8*)ALLOCATE_MEM(LLImageBase::getPrivatePool(), TEXTURE_FAST_CACHE_ENTRY_SIZE);
+ }
+ mFastCachePoolp = new LLVolatileAPRPool();
+ if (LLAPRFile::isExist(mFastCacheFileName, mFastCachePoolp))
+ {
+ mFastCachep = new LLAPRFile(mFastCacheFileName, APR_READ|APR_WRITE|APR_BINARY, mFastCachePoolp) ;
+ }
+ else
+ {
+ mFastCachep = new LLAPRFile(mFastCacheFileName, APR_CREATE|APR_READ|APR_WRITE|APR_BINARY, mFastCachePoolp) ;
+ }
+ }
+ else
+ {
+ mFastCachep = new LLAPRFile(mFastCacheFileName, APR_READ|APR_WRITE|APR_BINARY, mFastCachePoolp) ;
+ }
+
+ mFastCacheTimer.reset();
+ }
+ return;
+}
+
+void LLTextureCache::closeFastCache(bool forced)
+{
+ static const F32 timeout = 10.f ; //seconds
+
+ if(!mFastCachep)
+ {
+ return ;
+ }
+
+ if(!forced && mFastCacheTimer.getElapsedTimeF32() < timeout)
+ {
+ return ;
+ }
+
+ delete mFastCachep;
+ mFastCachep = NULL;
+ return;
+}
+
bool LLTextureCache::writeComplete(handle_t handle, bool abort)
{
lockWorkers();
diff --git a/indra/newview/lltexturecache.h b/indra/newview/lltexturecache.h
index dd0cc9b4bd..e3fc957fd2 100644
--- a/indra/newview/lltexturecache.h
+++ b/indra/newview/lltexturecache.h
@@ -36,6 +36,7 @@
class LLImageFormatted;
class LLTextureCacheWorker;
+class LLImageRaw;
class LLTextureCache : public LLWorkerThread
{
@@ -113,8 +114,9 @@ public:
handle_t readFromCache(const LLUUID& id, U32 priority, S32 offset, S32 size,
ReadResponder* responder);
bool readComplete(handle_t handle, bool abort);
- handle_t writeToCache(const LLUUID& id, U32 priority, U8* data, S32 datasize, S32 imagesize,
+ handle_t writeToCache(const LLUUID& id, U32 priority, U8* data, S32 datasize, S32 imagesize, LLPointer<LLImageRaw> rawimage, S32 discardlevel,
WriteResponder* responder);
+ LLPointer<LLImageRaw> readFromFastCache(const LLUUID& id, S32& discardlevel);
bool writeComplete(handle_t handle, bool abort = false);
void prioritizeWrite(handle_t handle);
@@ -171,12 +173,18 @@ private:
void lockHeaders() { mHeaderMutex.lock(); }
void unlockHeaders() { mHeaderMutex.unlock(); }
+ void openFastCache(bool first_time = false);
+ void closeFastCache(bool forced = false);
+ bool writeToFastCache(S32 id, LLPointer<LLImageRaw> raw, S32 discardlevel);
+
private:
// Internal
LLMutex mWorkersMutex;
LLMutex mHeaderMutex;
LLMutex mListMutex;
+ LLMutex mFastCacheMutex;
LLAPRFile* mHeaderAPRFile;
+ LLVolatileAPRPool* mFastCachePoolp;
typedef std::map<handle_t, LLTextureCacheWorker*> handle_map_t;
handle_map_t mReaders;
@@ -193,12 +201,17 @@ private:
// HEADERS (Include first mip)
std::string mHeaderEntriesFileName;
std::string mHeaderDataFileName;
+ std::string mFastCacheFileName;
EntriesInfo mHeaderEntriesInfo;
std::set<S32> mFreeList; // deleted entries
std::set<LLUUID> mLRU;
- typedef std::map<LLUUID,S32> id_map_t;
+ typedef std::map<LLUUID, S32> id_map_t;
id_map_t mHeaderIDMap;
+ LLAPRFile* mFastCachep;
+ LLFrameTimer mFastCacheTimer;
+ U8* mFastCachePadBuffer;
+
// BODIES (TEXTURES minus headers)
std::string mTexturesDirName;
typedef std::map<LLUUID,S32> size_map_t;
diff --git a/indra/newview/lltexturectrl.cpp b/indra/newview/lltexturectrl.cpp
index ed9faa0706..ec36cf48c2 100644
--- a/indra/newview/lltexturectrl.cpp
+++ b/indra/newview/lltexturectrl.cpp
@@ -97,6 +97,7 @@ public:
LLTextureCtrl* owner,
const std::string& label,
PermissionMask immediate_filter_perm_mask,
+ PermissionMask dnd_filter_perm_mask,
PermissionMask non_immediate_filter_perm_mask,
BOOL can_apply_immediately,
LLUIImagePtr fallback_image_name);
@@ -134,6 +135,9 @@ public:
void onFilterEdit(const std::string& search_string );
+ void setCanApply(bool can_preview, bool can_apply);
+ void setTextureSelectedCallback(texture_selected_callback cb) {mTextureSelectedCallback = cb;}
+
static void onBtnSetToDefault( void* userdata );
static void onBtnSelect( void* userdata );
static void onBtnCancel( void* userdata );
@@ -175,6 +179,7 @@ protected:
LLFilterEditor* mFilterEdit;
LLInventoryPanel* mInventoryPanel;
PermissionMask mImmediateFilterPermMask;
+ PermissionMask mDnDFilterPermMask;
PermissionMask mNonImmediateFilterPermMask;
BOOL mCanApplyImmediately;
BOOL mNoCopyTextureSelected;
@@ -184,12 +189,18 @@ protected:
LLRadioGroup* mModeSelector;
LLScrollListCtrl* mLocalScrollCtrl;
+
+private:
+ bool mCanApply;
+ bool mCanPreview;
+ texture_selected_callback mTextureSelectedCallback;
};
LLFloaterTexturePicker::LLFloaterTexturePicker(
LLTextureCtrl* owner,
const std::string& label,
PermissionMask immediate_filter_perm_mask,
+ PermissionMask dnd_filter_perm_mask,
PermissionMask non_immediate_filter_perm_mask,
BOOL can_apply_immediately,
LLUIImagePtr fallback_image)
@@ -205,9 +216,12 @@ LLFloaterTexturePicker::LLFloaterTexturePicker(
mActive( TRUE ),
mFilterEdit(NULL),
mImmediateFilterPermMask(immediate_filter_perm_mask),
+ mDnDFilterPermMask(dnd_filter_perm_mask),
mNonImmediateFilterPermMask(non_immediate_filter_perm_mask),
mContextConeOpacity(0.f),
- mSelectedItemPinned( FALSE )
+ mSelectedItemPinned( FALSE ),
+ mCanApply(true),
+ mCanPreview(true)
{
buildFromFile("floater_texture_ctrl.xml");
mCanApplyImmediately = can_apply_immediately;
@@ -319,7 +333,7 @@ BOOL LLFloaterTexturePicker::handleDragAndDrop(
if (xfer) item_perm_mask |= PERM_TRANSFER;
//PermissionMask filter_perm_mask = getFilterPermMask(); Commented out due to no-copy texture loss.
- PermissionMask filter_perm_mask = mImmediateFilterPermMask;
+ PermissionMask filter_perm_mask = mDnDFilterPermMask;
if ( (item_perm_mask & filter_perm_mask) == filter_perm_mask )
{
if (drop)
@@ -464,7 +478,7 @@ BOOL LLFloaterTexturePicker::postBuild()
mNoCopyTextureSelected = FALSE;
- getChild<LLUICtrl>("apply_immediate_check")->setValue(gSavedSettings.getBOOL("ApplyTextureImmediately"));
+ getChild<LLUICtrl>("apply_immediate_check")->setValue(gSavedSettings.getBOOL("TextureLivePreview"));
childSetCommitCallback("apply_immediate_check", onApplyImmediateCheck, this);
if (!mCanApplyImmediately)
@@ -546,7 +560,7 @@ void LLFloaterTexturePicker::draw()
// if we're inactive, gray out "apply immediate" checkbox
getChildView("show_folders_check")->setEnabled(mActive && mCanApplyImmediately && !mNoCopyTextureSelected);
- getChildView("Select")->setEnabled(mActive);
+ getChildView("Select")->setEnabled(mActive && mCanApply);
getChildView("Pipette")->setEnabled(mActive);
getChild<LLUICtrl>("Pipette")->setValue(LLToolMgr::getInstance()->getCurrentTool() == LLToolPipette::getInstance());
@@ -702,8 +716,7 @@ PermissionMask LLFloaterTexturePicker::getFilterPermMask()
void LLFloaterTexturePicker::commitIfImmediateSet()
{
- bool apply_immediate = getChild<LLUICtrl>("apply_immediate_check")->getValue().asBoolean();
- if (!mNoCopyTextureSelected && apply_immediate && mOwner)
+ if (!mNoCopyTextureSelected && mOwner && mCanApply)
{
mOwner->onFloaterCommit(LLTextureCtrl::TEXTURE_CHANGE);
}
@@ -713,6 +726,7 @@ void LLFloaterTexturePicker::commitIfImmediateSet()
void LLFloaterTexturePicker::onBtnSetToDefault(void* userdata)
{
LLFloaterTexturePicker* self = (LLFloaterTexturePicker*) userdata;
+ self->setCanApply(true, true);
if (self->mOwner)
{
self->setImageID( self->mOwner->getDefaultImageAssetID() );
@@ -724,6 +738,7 @@ void LLFloaterTexturePicker::onBtnSetToDefault(void* userdata)
void LLFloaterTexturePicker::onBtnWhite(void* userdata)
{
LLFloaterTexturePicker* self = (LLFloaterTexturePicker*) userdata;
+ self->setCanApply(true, true);
self->setImageID( self->mWhiteImageAssetID );
self->commitIfImmediateSet();
}
@@ -804,13 +819,17 @@ void LLFloaterTexturePicker::onSelectionChange(const std::deque<LLFolderViewItem
mNoCopyTextureSelected = FALSE;
if (itemp)
{
+ if (!mTextureSelectedCallback.empty())
+ {
+ mTextureSelectedCallback(itemp);
+ }
if (!itemp->getPermissions().allowCopyBy(gAgent.getID()))
{
mNoCopyTextureSelected = TRUE;
}
mImageAssetID = itemp->getAssetUUID();
mViewModel->setDirty(); // *TODO: shouldn't we be using setValue() here?
- if (user_action)
+ if (user_action && mCanPreview)
{
// only commit intentional selections, not implicit ones
commitIfImmediateSet();
@@ -947,7 +966,7 @@ void LLFloaterTexturePicker::onApplyImmediateCheck(LLUICtrl* ctrl, void *user_da
LLFloaterTexturePicker* picker = (LLFloaterTexturePicker*)user_data;
LLCheckBoxCtrl* check_box = (LLCheckBoxCtrl*)ctrl;
- gSavedSettings.setBOOL("ApplyTextureImmediately", check_box->get());
+ gSavedSettings.setBOOL("TextureLivePreview", check_box->get());
picker->updateFilterPermMask();
picker->commitIfImmediateSet();
@@ -958,6 +977,16 @@ void LLFloaterTexturePicker::updateFilterPermMask()
//mInventoryPanel->setFilterPermMask( getFilterPermMask() ); Commented out due to no-copy texture loss.
}
+void LLFloaterTexturePicker::setCanApply(bool can_preview, bool can_apply)
+{
+ getChildRef<LLUICtrl>("Select").setEnabled(can_apply);
+ getChildRef<LLUICtrl>("preview_disabled").setVisible(!can_preview);
+ getChildRef<LLUICtrl>("apply_immediate_check").setVisible(can_preview);
+
+ mCanApply = can_apply;
+ mCanPreview = can_preview ? gSavedSettings.getBOOL("TextureLivePreview") : false;
+}
+
void LLFloaterTexturePicker::onFilterEdit(const std::string& search_string )
{
std::string upper_case_search_string = search_string;
@@ -1108,6 +1137,15 @@ void LLTextureCtrl::setCanApplyImmediately(BOOL b)
}
}
+void LLTextureCtrl::setCanApply(bool can_preview, bool can_apply)
+{
+ LLFloaterTexturePicker* floaterp = dynamic_cast<LLFloaterTexturePicker*>(mFloaterHandle.get());
+ if( floaterp )
+ {
+ floaterp->setCanApply(can_preview, can_apply);
+ }
+}
+
void LLTextureCtrl::setVisible( BOOL visible )
{
if( !visible )
@@ -1188,12 +1226,19 @@ void LLTextureCtrl::showPicker(BOOL take_focus)
this,
mLabel,
mImmediateFilterPermMask,
+ mDnDFilterPermMask,
mNonImmediateFilterPermMask,
mCanApplyImmediately,
mFallbackImage);
mFloaterHandle = floaterp->getHandle();
+ LLFloaterTexturePicker* texture_floaterp = dynamic_cast<LLFloaterTexturePicker*>(floaterp);
+ if (texture_floaterp && mOnTextureSelectedCallback)
+ {
+ texture_floaterp->setTextureSelectedCallback(mOnTextureSelectedCallback);
+ }
+
LLFloater* root_floater = gFloaterView->getParentFloater(this);
if (root_floater)
root_floater->addDependentFloater(floaterp);
@@ -1318,6 +1363,16 @@ void LLTextureCtrl::onFloaterCommit(ETexturePickOp op, LLUUID id)
}
}
+void LLTextureCtrl::setOnTextureSelectedCallback(texture_selected_callback cb)
+{
+ mOnTextureSelectedCallback = cb;
+ LLFloaterTexturePicker* floaterp = dynamic_cast<LLFloaterTexturePicker*>(mFloaterHandle.get());
+ if (floaterp)
+ {
+ floaterp->setTextureSelectedCallback(cb);
+ }
+}
+
void LLTextureCtrl::setImageAssetName(const std::string& name)
{
LLPointer<LLUIImage> imagep = LLUI::getUIImage(name);
diff --git a/indra/newview/lltexturectrl.h b/indra/newview/lltexturectrl.h
index 3abe84dcc3..599d9c70c5 100644
--- a/indra/newview/lltexturectrl.h
+++ b/indra/newview/lltexturectrl.h
@@ -43,6 +43,7 @@ class LLViewerFetchedTexture;
// used for setting drag & drop callbacks.
typedef boost::function<BOOL (LLUICtrl*, LLInventoryItem*)> drag_n_drop_callback;
+typedef boost::function<void (LLInventoryItem*)> texture_selected_callback;
//////////////////////////////////////////////////////////////////////////////////////////
@@ -147,8 +148,12 @@ public:
void setCaption(const std::string& caption);
void setCanApplyImmediately(BOOL b);
+ void setCanApply(bool can_preview, bool can_apply);
+
void setImmediateFilterPermMask(PermissionMask mask)
{ mImmediateFilterPermMask = mask; }
+ void setDnDFilterPermMask(PermissionMask mask)
+ { mDnDFilterPermMask = mask; }
void setNonImmediateFilterPermMask(PermissionMask mask)
{ mNonImmediateFilterPermMask = mask; }
PermissionMask getImmediateFilterPermMask() { return mImmediateFilterPermMask; }
@@ -172,6 +177,11 @@ public:
void setOnSelectCallback(commit_callback_t cb) { mOnSelectCallback = cb; }
+ /*
+ * callback for changing texture selection in inventory list of texture floater
+ */
+ void setOnTextureSelectedCallback(texture_selected_callback cb);
+
void setShowLoadingPlaceholder(BOOL showLoadingPlaceholder);
LLViewerFetchedTexture* getTexture() { return mTexturep; }
@@ -185,6 +195,7 @@ private:
drag_n_drop_callback mDropCallback;
commit_callback_t mOnCancelCallback;
commit_callback_t mOnSelectCallback;
+ texture_selected_callback mOnTextureSelectedCallback;
LLPointer<LLViewerFetchedTexture> mTexturep;
LLUIColor mBorderColor;
LLUUID mImageItemID;
@@ -198,6 +209,7 @@ private:
std::string mLabel;
BOOL mAllowNoTexture; // If true, the user can select "none" as an option
PermissionMask mImmediateFilterPermMask;
+ PermissionMask mDnDFilterPermMask;
PermissionMask mNonImmediateFilterPermMask;
BOOL mCanApplyImmediately;
BOOL mCommitOnSelection;
diff --git a/indra/newview/lltexturefetch.cpp b/indra/newview/lltexturefetch.cpp
index 7e6dfbc9d9..7adf5212c2 100755
--- a/indra/newview/lltexturefetch.cpp
+++ b/indra/newview/lltexturefetch.cpp
@@ -151,7 +151,7 @@ public:
/*virtual*/ bool doWork(S32 param); // Called from LLWorkerThread::processRequest()
/*virtual*/ void finishWork(S32 param, bool completed); // called from finishRequest() (WORK THREAD)
/*virtual*/ bool deleteOK(); // called from update() (WORK THREAD)
-
+
~LLTextureFetchWorker();
// void relese() { --mActiveCount; }
@@ -196,6 +196,8 @@ private:
bool processSimulatorPackets();
bool writeToCacheComplete();
+ void removeFromHTTPQueue();
+
void lockWorkMutex() { mWorkMutex.lock(); }
void unlockWorkMutex() { mWorkMutex.unlock(); }
@@ -275,6 +277,8 @@ private:
S32 mRetryAttempt;
S32 mActiveCount;
U32 mGetStatus;
+ U32 mHTTPHandle;
+ F32 mDelay;
std::string mGetReason;
// Work Data
@@ -328,6 +332,7 @@ public:
mFetcher->mTextureInfo.setRequestCompleteTimeAndLog(mID, timeNow);
}
+ S32 data_size = 0;
lldebugs << "HTTP COMPLETE: " << mID << llendl;
LLTextureFetchWorker* worker = mFetcher->getWorker(mID);
if (worker)
@@ -349,7 +354,7 @@ public:
// llwarns << "CURL GET FAILED, status:" << status << " reason:" << reason << llendl;
}
- S32 data_size = worker->callbackHttpGet(channels, buffer, partial, success);
+ data_size = worker->callbackHttpGet(channels, buffer, partial, success);
if(log_texture_traffic && data_size > 0)
{
@@ -359,9 +364,7 @@ public:
gTotalTextureBytesPerBoostLevel[tex->getBoostLevel()] += data_size ;
}
}
-
- mFetcher->removeFromHTTPQueue(mID, data_size);
-
+
if (worker->mMetricsStartTime)
{
LLViewerAssetStatsFF::record_response_thread1(LLViewerAssetType::AT_TEXTURE,
@@ -376,9 +379,10 @@ public:
}
else
{
- mFetcher->removeFromHTTPQueue(mID);
- llwarns << "Worker not found: " << mID << llendl;
+ llwarns << "Worker not found: " << mID << llendl;
}
+
+ mFetcher->getCurlRequest().completeRequest(data_size);
}
virtual bool followRedir()
@@ -692,10 +696,12 @@ LLTextureFetchWorker::LLTextureFetchWorker(LLTextureFetch* fetcher,
mLastPacket(-1),
mTotalPackets(0),
mImageCodec(IMG_CODEC_INVALID),
- mMetricsStartTime(0)
+ mMetricsStartTime(0),
+ mHTTPHandle(0),
+ mDelay(-1.f)
{
mCanUseNET = mUrl.empty() ;
-
+
calcWorkPriority();
mType = host.isOk() ? LLImageBase::TYPE_AVATAR_BAKE : LLImageBase::TYPE_NORMAL;
// llinfos << "Create: " << mID << " mHost:" << host << " Discard=" << discard << llendl;
@@ -726,7 +732,19 @@ LLTextureFetchWorker::~LLTextureFetchWorker()
mFormattedImage = NULL;
clearPackets();
unlockWorkMutex();
- mFetcher->removeFromHTTPQueue(mID);
+
+ removeFromHTTPQueue();
+}
+
+void LLTextureFetchWorker::removeFromHTTPQueue()
+{
+ if(mHTTPHandle > 0)
+ {
+ llassert_always(mState == WAIT_HTTP_REQ);
+
+ mFetcher->getCurlRequest().removeRequest(mHTTPHandle);
+ mHTTPHandle = 0;
+ }
}
void LLTextureFetchWorker::clearPackets()
@@ -824,6 +842,7 @@ void LLTextureFetchWorker::setImagePriority(F32 priority)
mImagePriority = priority;
calcWorkPriority();
U32 work_priority = mWorkPriority | (getPriority() & LLWorkerThread::PRIORITY_HIGHBITS);
+ mFetcher->getCurlRequest().updatePriority(mHTTPHandle, mWorkPriority);
setPriority(work_priority);
}
}
@@ -851,8 +870,6 @@ void LLTextureFetchWorker::startWork(S32 param)
// Called from LLWorkerThread::processRequest()
bool LLTextureFetchWorker::doWork(S32 param)
{
- static const F32 FETCHING_TIMEOUT = 120.f;//seconds
-
LLMutexLock lock(&mWorkMutex);
if ((mFetcher->isQuitting() || getFlags(LLWorkerClass::WCF_DELETE_REQUESTED)))
@@ -912,6 +929,7 @@ bool LLTextureFetchWorker::doWork(S32 param)
mCacheWriteHandle = LLTextureCache::nullHandle();
mState = LOAD_FROM_TEXTURE_CACHE;
mInCache = FALSE;
+ mDelay = -1.f;
mDesiredSize = llmax(mDesiredSize, TEXTURE_CACHE_ENTRY_SIZE); // min desired size is TEXTURE_CACHE_ENTRY_SIZE
LL_DEBUGS("Texture") << mID << ": Priority: " << llformat("%8.0f",mImagePriority)
<< " Desired Discard: " << mDesiredDiscard << " Desired Size: " << mDesiredSize << LL_ENDL;
@@ -927,7 +945,7 @@ bool LLTextureFetchWorker::doWork(S32 param)
S32 size = mDesiredSize - offset;
if (size <= 0)
{
- mState = CACHE_POST;
+ mState = CACHE_POST; //have enough data, will fall to decode
return false;
}
mFileSize = 0;
@@ -944,7 +962,7 @@ bool LLTextureFetchWorker::doWork(S32 param)
offset, size, responder);
mCacheReadTimer.reset();
}
- else if (mUrl.empty())
+ else if (mUrl.empty() && mFetcher->canLoadFromCache())
{
setPriority(LLWorkerThread::PRIORITY_LOW | mWorkPriority); // Set priority first since Responder may change it
@@ -953,7 +971,7 @@ bool LLTextureFetchWorker::doWork(S32 param)
offset, size, responder);
mCacheReadTimer.reset();
}
- else if(mCanUseHTTP)
+ else if(!mUrl.empty() && mCanUseHTTP)
{
if (!(mUrl.compare(0, 7, "http://") == 0))
{
@@ -981,6 +999,9 @@ bool LLTextureFetchWorker::doWork(S32 param)
}
else
{
+ //
+ //This should never happen
+ //
return false;
}
}
@@ -1020,6 +1041,7 @@ bool LLTextureFetchWorker::doWork(S32 param)
LL_DEBUGS("Texture") << mID << ": Not in Cache" << LL_ENDL;
mState = LOAD_FROM_NETWORK;
}
+
// fall through
LLTextureFetch::sCacheHitRate.addValue(0.f);
}
@@ -1060,7 +1082,7 @@ bool LLTextureFetchWorker::doWork(S32 param)
}
if (mCanUseHTTP && !mUrl.empty())
{
- mState = LLTextureFetchWorker::SEND_HTTP_REQ;
+ mState = SEND_HTTP_REQ;
setPriority(LLWorkerThread::PRIORITY_HIGH | mWorkPriority);
if(mWriteToCacheState != NOT_WRITE)
{
@@ -1156,17 +1178,6 @@ bool LLTextureFetchWorker::doWork(S32 param)
{
if(mCanUseHTTP)
{
- //NOTE:
- //control the number of the http requests issued for:
- //1, not openning too many file descriptors at the same time;
- //2, control the traffic of http so udp gets bandwidth.
- //
- static const S32 MAX_NUM_OF_HTTP_REQUESTS_IN_QUEUE = 8 ;
- if(mFetcher->getNumHTTPRequests() > MAX_NUM_OF_HTTP_REQUESTS_IN_QUEUE)
- {
- return false ; //wait.
- }
-
mFetcher->removeFromNetworkQueue(this, false);
S32 cur_size = 0;
@@ -1179,6 +1190,7 @@ bool LLTextureFetchWorker::doWork(S32 param)
{
// We already have all the data, just decode it
mLoadedDiscard = mFormattedImage->getDiscardLevel();
+ setPriority(LLWorkerThread::PRIORITY_HIGH | mWorkPriority);
mState = DECODE_IMAGE;
return false;
}
@@ -1209,7 +1221,6 @@ bool LLTextureFetchWorker::doWork(S32 param)
setPriority(LLWorkerThread::PRIORITY_LOW | mWorkPriority);
mState = WAIT_HTTP_REQ;
- mFetcher->addToHTTPQueue(mID);
if (! mMetricsStartTime)
{
mMetricsStartTime = LLViewerAssetStatsFF::get_timestamp();
@@ -1221,8 +1232,16 @@ bool LLTextureFetchWorker::doWork(S32 param)
// Will call callbackHttpGet when curl request completes
std::vector<std::string> headers;
headers.push_back("Accept: image/x-j2c");
- res = mFetcher->mCurlGetRequest->getByteRange(mUrl, headers, offset, mRequestedSize,
- new HTTPGetResponder(mFetcher, mID, LLTimer::getTotalTime(), mRequestedSize, offset, true));
+ // If we try to fetch the whole file, we set the size to 0 so that we generate the correct curl range request
+ // Note: it looks a bit hacky but we need to limit this (size==0) to mean "whole file" to HTTP only as it messes up UDP fetching
+ if ((offset+mRequestedSize) == MAX_IMAGE_DATA_SIZE)
+ {
+ mRequestedSize = 0;
+ }
+ mHTTPHandle = mFetcher->mCurlGetRequest->getByteRange(mUrl, headers, offset, mRequestedSize, mWorkPriority,
+ new HTTPGetResponder(mFetcher, mID, LLTimer::getTotalTime(), mRequestedSize, offset, true), mDelay);
+ mDelay = -1.f; //reset
+ res = true;
}
if (!res)
{
@@ -1249,6 +1268,12 @@ bool LLTextureFetchWorker::doWork(S32 param)
S32 max_attempts;
if (mGetStatus == HTTP_NOT_FOUND)
{
+ if(mWriteToCacheState == NOT_WRITE) //map tiles
+ {
+ mState = DONE;
+ return true; // failed, means no map tile on the empty region.
+ }
+
mHTTPFailCount = max_attempts = 1; // Don't retry
llwarns << "Texture missing from server (404): " << mUrl << llendl;
@@ -1257,6 +1282,7 @@ bool LLTextureFetchWorker::doWork(S32 param)
{
mState = INIT ;
mCanUseHTTP = false ;
+ mUrl.clear();
setPriority(LLWorkerThread::PRIORITY_HIGH | mWorkPriority);
return false ;
}
@@ -1269,12 +1295,15 @@ bool LLTextureFetchWorker::doWork(S32 param)
++mHTTPFailCount;
max_attempts = mHTTPFailCount+1; // Keep retrying
LL_INFOS_ONCE("Texture") << "Texture server busy (503): " << mUrl << LL_ENDL;
+ mDelay = 2.0f; //delay 2 second to re-issue the http request
}
else
{
const S32 HTTP_MAX_RETRY_COUNT = 3;
max_attempts = HTTP_MAX_RETRY_COUNT + 1;
++mHTTPFailCount;
+ mDelay = 2.0f; //delay 2 second to re-issue the http request
+
llinfos << "HTTP GET failed for: " << mUrl
<< " Status: " << mGetStatus << " Reason: '" << mGetReason << "'"
<< " Attempt:" << mHTTPFailCount+1 << "/" << max_attempts << llendl;
@@ -1282,10 +1311,12 @@ bool LLTextureFetchWorker::doWork(S32 param)
if (mHTTPFailCount >= max_attempts)
{
+ mUrl.clear();
if (cur_size > 0)
{
// Use available data
mLoadedDiscard = mFormattedImage->getDiscardLevel();
+ setPriority(LLWorkerThread::PRIORITY_HIGH | mWorkPriority);
mState = DECODE_IMAGE;
return false;
}
@@ -1298,11 +1329,20 @@ bool LLTextureFetchWorker::doWork(S32 param)
}
else
{
+ setPriority(LLWorkerThread::PRIORITY_HIGH | mWorkPriority);
mState = SEND_HTTP_REQ;
return false; // retry
}
}
+ // Clear the url since we're done with the fetch
+ // Note: mUrl is used to check is fetching is required so failure to clear it will force an http fetch
+ // next time the texture is requested, even if the data have already been fetched.
+ if(mWriteToCacheState != NOT_WRITE)
+ {
+ mUrl.clear();
+ }
+
llassert_always(mBufferSize == cur_size + mRequestedSize);
if(!mBufferSize)//no data received.
{
@@ -1357,13 +1397,9 @@ bool LLTextureFetchWorker::doWork(S32 param)
}
else
{
- if(FETCHING_TIMEOUT < mRequestedTimer.getElapsedTimeF32())
- {
- //timeout, abort.
- mState = DONE;
- return true;
- }
-
+ //
+ //No need to timeout, the responder should be triggered automatically.
+ //
setPriority(LLWorkerThread::PRIORITY_LOW | mWorkPriority);
return false;
}
@@ -1495,7 +1531,7 @@ bool LLTextureFetchWorker::doWork(S32 param)
CacheWriteResponder* responder = new CacheWriteResponder(mFetcher, mID);
mCacheWriteHandle = mFetcher->mTextureCache->writeToCache(mID, cache_priority,
mFormattedImage->getData(), datasize,
- mFileSize, responder);
+ mFileSize, mRawImage, mDecodedDiscard, responder);
// fall through
}
@@ -1683,7 +1719,7 @@ S32 LLTextureFetchWorker::callbackHttpGet(const LLChannelDescriptors& channels,
S32 data_size = 0 ;
LLMutexLock lock(&mWorkMutex);
-
+ mHTTPHandle = 0;
if (mState != WAIT_HTTP_REQ)
{
llwarns << "callbackHttpGet for unrequested fetch worker: " << mID
@@ -1707,7 +1743,7 @@ S32 LLTextureFetchWorker::callbackHttpGet(const LLChannelDescriptors& channels,
mBuffer = (U8*)ALLOCATE_MEM(LLImageBase::getPrivatePool(), data_size);
buffer->readAfter(channels.in(), NULL, mBuffer, data_size);
mBufferSize += data_size;
- if (data_size < mRequestedSize && mRequestedDiscard == 0)
+ if (mRequestedSize == 0)
{
mHaveAllData = TRUE;
}
@@ -1733,6 +1769,7 @@ S32 LLTextureFetchWorker::callbackHttpGet(const LLChannelDescriptors& channels,
{
mRequestedSize = -1; // error
}
+
mLoaded = TRUE;
setPriority(LLWorkerThread::PRIORITY_HIGH | mWorkPriority);
@@ -1856,11 +1893,11 @@ LLTextureFetch::LLTextureFetch(LLTextureCache* cache, LLImageDecodeThread* image
mTextureCache(cache),
mImageDecodeThread(imagedecodethread),
mTextureBandwidth(0),
- mHTTPTextureBits(0),
- mTotalHTTPRequests(0),
mCurlGetRequest(NULL),
mQAMode(qa_mode),
mFetchDebugger(NULL),
+ mFetchSource(LLTextureFetch::FROM_ALL),
+ mOriginFetchSource(LLTextureFetch::FROM_ALL),
mFetcherLocked(FALSE)
{
mCurlPOSTRequestCount = 0;
@@ -1871,6 +1908,13 @@ LLTextureFetch::LLTextureFetch(LLTextureCache* cache, LLImageDecodeThread* image
if(LLTextureFetchDebugger::isEnabled())
{
mFetchDebugger = new LLTextureFetchDebugger(this, cache, imagedecodethread) ;
+ mFetchSource = (e_tex_source)gSavedSettings.getS32("TextureFetchSource");
+ if(mFetchSource < 0 && mFetchSource >= INVALID_SOURCE)
+ {
+ mFetchSource = LLTextureFetch::FROM_ALL;
+ gSavedSettings.setS32("TextureFetchSource", 0);
+ }
+ mOriginFetchSource = mFetchSource;
}
}
@@ -1940,6 +1984,8 @@ bool LLTextureFetch::createRequest(const std::string& url, const LLUUID& id, con
}
else
{
+ // If the requester knows nothing about the file, we fetch the smallest
+ // amount of data at the lowest resolution (highest discard level) possible.
desired_size = TEXTURE_CACHE_ENTRY_SIZE;
desired_discard = MAX_DISCARD_LEVEL;
}
@@ -2018,45 +2064,22 @@ void LLTextureFetch::removeFromNetworkQueue(LLTextureFetchWorker* worker, bool c
}
}
-// protected
-void LLTextureFetch::addToHTTPQueue(const LLUUID& id)
-{
- LLMutexLock lock(&mNetworkQueueMutex);
- mHTTPTextureQueue.insert(id);
- mTotalHTTPRequests++;
-}
-
-void LLTextureFetch::removeFromHTTPQueue(const LLUUID& id, S32 received_size)
-{
- LLMutexLock lock(&mNetworkQueueMutex);
- mHTTPTextureQueue.erase(id);
- mHTTPTextureBits += received_size * 8; // Approximate - does not include header bits
-}
-
void LLTextureFetch::deleteRequest(const LLUUID& id, bool cancel)
{
lockQueue() ;
LLTextureFetchWorker* worker = getWorkerAfterLock(id);
- if (worker)
- {
- size_t erased_1 = mRequestMap.erase(worker->mID);
- unlockQueue() ;
-
- llassert_always(erased_1 > 0) ;
-
- removeFromNetworkQueue(worker, cancel);
- llassert_always(!(worker->getFlags(LLWorkerClass::WCF_DELETE_REQUESTED))) ;
+ unlockQueue() ;
- worker->scheduleDelete();
- }
- else
- {
- unlockQueue() ;
- }
+ removeRequest(worker, cancel);
}
void LLTextureFetch::removeRequest(LLTextureFetchWorker* worker, bool cancel)
{
+ if(!worker)
+ {
+ return;
+ }
+
lockQueue() ;
size_t erased_1 = mRequestMap.erase(worker->mID);
unlockQueue() ;
@@ -2065,9 +2088,28 @@ void LLTextureFetch::removeRequest(LLTextureFetchWorker* worker, bool cancel)
removeFromNetworkQueue(worker, cancel);
llassert_always(!(worker->getFlags(LLWorkerClass::WCF_DELETE_REQUESTED))) ;
+ worker->removeFromHTTPQueue();
worker->scheduleDelete();
}
+void LLTextureFetch::deleteAllRequests()
+{
+ while(1)
+ {
+ lockQueue();
+ if(mRequestMap.empty())
+ {
+ unlockQueue() ;
+ break;
+ }
+
+ LLTextureFetchWorker* worker = mRequestMap.begin()->second;
+ unlockQueue() ;
+
+ removeRequest(worker, true);
+ }
+}
+
S32 LLTextureFetch::getNumRequests()
{
lockQueue() ;
@@ -2077,24 +2119,6 @@ S32 LLTextureFetch::getNumRequests()
return size ;
}
-S32 LLTextureFetch::getNumHTTPRequests()
-{
- mNetworkQueueMutex.lock() ;
- S32 size = (S32)mHTTPTextureQueue.size();
- mNetworkQueueMutex.unlock() ;
-
- return size ;
-}
-
-U32 LLTextureFetch::getTotalNumHTTPRequests()
-{
- mNetworkQueueMutex.lock() ;
- U32 size = mTotalHTTPRequests ;
- mNetworkQueueMutex.unlock() ;
-
- return size ;
-}
-
// call lockQueue() first!
LLTextureFetchWorker* LLTextureFetch::getWorkerAfterLock(const LLUUID& id)
{
@@ -2180,7 +2204,7 @@ bool LLTextureFetch::updateRequestPriority(const LLUUID& id, F32 priority)
{
worker->lockWorkMutex();
worker->setImagePriority(priority);
- worker->unlockWorkMutex();
+ worker->unlockWorkMutex();
res = true;
}
return res;
@@ -2262,15 +2286,7 @@ S32 LLTextureFetch::update(F32 max_time_ms)
{
static LLCachedControl<F32> band_width(gSavedSettings,"ThrottleBandwidthKBPS");
- {
- mNetworkQueueMutex.lock() ;
- mMaxBandwidth = band_width ;
-
- gTextureList.sTextureBits += mHTTPTextureBits ;
- mHTTPTextureBits = 0 ;
-
- mNetworkQueueMutex.unlock() ;
- }
+ mMaxBandwidth = band_width ;
S32 res = LLWorkerThread::update(max_time_ms);
@@ -2281,13 +2297,28 @@ S32 LLTextureFetch::update(F32 max_time_ms)
// won't work so don't bother trying
if (LLStartUp::getStartupState() > STATE_AGENT_SEND)
{
- sendRequestListToSimulators();
+ sendRequestListToSimulators();
}
}
if (!mThreaded)
{
commonUpdate();
+
+ if(mCurlGetRequest)
+ {
+ mCurlGetRequest->nextRequests();
+ }
+ }
+
+ if(mCurlGetRequest)
+ {
+ gTextureList.sTextureBits += mCurlGetRequest->getTotalReceivedBits();
+ }
+
+ if(mFetchDebugger)
+ {
+ mFetchDebugger->tryToStopDebug(); //check if need to stop debugger.
}
return res;
@@ -2317,7 +2348,7 @@ void LLTextureFetch::shutDownImageDecodeThread()
void LLTextureFetch::startThread()
{
// Construct mCurlGetRequest from Worker Thread
- mCurlGetRequest = new LLCurlRequest();
+ mCurlGetRequest = new LLCurlTextureRequest(8);
if(mFetchDebugger)
{
@@ -2342,6 +2373,8 @@ void LLTextureFetch::threadedUpdate()
{
llassert_always(mCurlGetRequest);
+ mCurlGetRequest->nextRequests();
+
// Limit update frequency
const F32 PROCESS_TIME = 0.05f;
static LLFrameTimer process_timer;
@@ -3154,6 +3187,7 @@ public:
llinfos << "Fetch Debugger : CURL GET FAILED, index = " << mIndex << ", status:" << status << " reason:" << reason << llendl;
}
mDebugger->callbackHTTP(mIndex, channels, buffer, partial, success);
+ mDebugger->getCurlGetRequest()->completeRequest(0);
}
virtual bool followRedir()
{
@@ -3176,7 +3210,8 @@ LLTextureFetchDebugger::LLTextureFetchDebugger(LLTextureFetch* fetcher, LLTextur
LLTextureFetchDebugger::~LLTextureFetchDebugger()
{
mFetchingHistory.clear();
- stopDebug();
+ mStopDebug = TRUE;
+ tryToStopDebug();
}
void LLTextureFetchDebugger::init()
@@ -3191,6 +3226,8 @@ void LLTextureFetchDebugger::init()
mTotalFetchingTime = 0.f;
mRefetchVisCacheTime = -1.f;
mRefetchVisHTTPTime = -1.f;
+ mRefetchAllCacheTime = -1.f;
+ mRefetchAllHTTPTime = -1.f;
mNumFetchedTextures = 0;
mNumCacheHits = 0;
@@ -3204,10 +3241,56 @@ void LLTextureFetchDebugger::init()
mRenderedDecodedData = 0;
mFetchedPixels = 0;
mRenderedPixels = 0;
- mRefetchedData = 0;
- mRefetchedPixels = 0;
+ mRefetchedVisData = 0;
+ mRefetchedVisPixels = 0;
+ mRefetchedAllData = 0;
+ mRefetchedAllPixels = 0;
mFreezeHistory = FALSE;
+ mStopDebug = FALSE;
+ mClearHistory = FALSE;
+}
+
+void LLTextureFetchDebugger::startWork(e_debug_state state)
+{
+ switch(state)
+ {
+ case IDLE:
+ break;
+ case START_DEBUG:
+ startDebug();
+ break;
+ case READ_CACHE:
+ debugCacheRead();
+ break;
+ case WRITE_CACHE:
+ debugCacheWrite();
+ break;
+ case DECODING:
+ debugDecoder();
+ break;
+ case HTTP_FETCHING:
+ debugHTTP();
+ break;
+ case GL_TEX:
+ debugGLTextureCreation();
+ break;
+ case REFETCH_VIS_CACHE:
+ debugRefetchVisibleFromCache();
+ break;
+ case REFETCH_VIS_HTTP:
+ debugRefetchVisibleFromHTTP();
+ break;
+ case REFETCH_ALL_CACHE:
+ debugRefetchAllFromCache();
+ break;
+ case REFETCH_ALL_HTTP:
+ debugRefetchAllFromHTTP();
+ break;
+ default:
+ break;
+ }
+ return;
}
void LLTextureFetchDebugger::startDebug()
@@ -3215,10 +3298,18 @@ void LLTextureFetchDebugger::startDebug()
//lock the fetcher
mFetcher->lockFetcher(true);
mFreezeHistory = TRUE;
+ mFetcher->resetLoadSource();
//clear the current fetching queue
gTextureList.clearFetchingRequests();
+ mState = START_DEBUG;
+}
+
+bool LLTextureFetchDebugger::processStartDebug(F32 max_time)
+{
+ mTimer.reset();
+
//wait for all works to be done
while(1)
{
@@ -3230,6 +3321,11 @@ void LLTextureFetchDebugger::startDebug()
{
break;
}
+
+ if(mTimer.getElapsedTimeF32() > max_time)
+ {
+ return false;
+ }
}
//collect statistics
@@ -3268,10 +3364,17 @@ void LLTextureFetchDebugger::startDebug()
}
mNumFetchedTextures = fetched_textures.size();
+
+ return true;
}
-void LLTextureFetchDebugger::stopDebug()
+void LLTextureFetchDebugger::tryToStopDebug()
{
+ if(!mStopDebug)
+ {
+ return;
+ }
+
//clear the current debug work
S32 size = mFetchingHistory.size();
switch(mState)
@@ -3300,37 +3403,71 @@ void LLTextureFetchDebugger::stopDebug()
break;
case GL_TEX:
break;
+ case REFETCH_VIS_CACHE:
+ break;
+ case REFETCH_VIS_HTTP:
+ break;
+ case REFETCH_ALL_CACHE:
+ mRefetchList.clear();
+ break;
+ case REFETCH_ALL_HTTP:
+ mRefetchList.clear();
+ break;
default:
break;
}
- while(1)
+ if(update(0.005f))
{
- if(update())
+ //unlock the fetcher
+ mFetcher->lockFetcher(false);
+ mFetcher->resetLoadSource();
+ mFreezeHistory = FALSE;
+ mStopDebug = FALSE;
+
+ if(mClearHistory)
{
- break;
+ mFetchingHistory.clear();
+ init();
+ mTotalFetchingTime = gDebugTimers[0].getElapsedTimeF32(); //reset
}
}
-
- //unlock the fetcher
- mFetcher->lockFetcher(false);
- mFreezeHistory = FALSE;
- mTotalFetchingTime = gDebugTimers[0].getElapsedTimeF32(); //reset
}
//called in the main thread and when the fetching queue is empty
void LLTextureFetchDebugger::clearHistory()
{
- mFetchingHistory.clear();
- init();
+ mClearHistory = TRUE;
}
void LLTextureFetchDebugger::addHistoryEntry(LLTextureFetchWorker* worker)
{
+ if(worker->mRawImage.isNull() || worker->mFormattedImage.isNull())
+ {
+ return;
+ }
+
if(mFreezeHistory)
{
- mRefetchedPixels += worker->mRawImage->getWidth() * worker->mRawImage->getHeight();
- mRefetchedData += worker->mFormattedImage->getDataSize();
+ if(mState == REFETCH_VIS_CACHE || mState == REFETCH_VIS_HTTP)
+ {
+ mRefetchedVisPixels += worker->mRawImage->getWidth() * worker->mRawImage->getHeight();
+ mRefetchedVisData += worker->mFormattedImage->getDataSize();
+ }
+ else
+ {
+ mRefetchedAllPixels += worker->mRawImage->getWidth() * worker->mRawImage->getHeight();
+ mRefetchedAllData += worker->mFormattedImage->getDataSize();
+
+ LLViewerFetchedTexture* tex = LLViewerTextureManager::findFetchedTexture(worker->mID);
+ if(tex && mRefetchList[tex].begin() != mRefetchList[tex].end())
+ {
+ if(worker->mDecodedDiscard == mFetchingHistory[mRefetchList[tex][0]].mDecodedLevel)
+ {
+ mRefetchList[tex].erase(mRefetchList[tex].begin());
+ }
+ }
+ }
return;
}
@@ -3342,9 +3479,8 @@ void LLTextureFetchDebugger::addHistoryEntry(LLTextureFetchWorker* worker)
mDecodedData += worker->mRawImage->getDataSize();
mFetchedPixels += worker->mRawImage->getWidth() * worker->mRawImage->getHeight();
- mFetchingHistory.push_back(FetchEntry(worker->mID, worker->mDesiredSize, worker->mDecodedDiscard, worker->mFormattedImage->getDataSize(), worker->mRawImage->getDataSize()));
- //mFetchingHistory.push_back(FetchEntry(worker->mID, worker->mDesiredSize, worker->mHaveAllData ? 0 : worker->mLoadedDiscard, worker->mFormattedImage->getComponents(),
- //worker->mDecodedDiscard, worker->mFormattedImage->getDataSize(), worker->mRawImage->getDataSize()));
+ mFetchingHistory.push_back(FetchEntry(worker->mID, worker->mDesiredSize, worker->mDecodedDiscard,
+ worker->mFormattedImage->getDataSize(), worker->mRawImage->getDataSize()));
}
void LLTextureFetchDebugger::lockCache()
@@ -3361,6 +3497,7 @@ void LLTextureFetchDebugger::debugCacheRead()
llassert_always(mState == IDLE);
mTimer.reset();
mState = READ_CACHE;
+ mCacheReadTime = -1.f;
S32 size = mFetchingHistory.size();
for(S32 i = 0 ; i < size ; i++)
@@ -3396,6 +3533,7 @@ void LLTextureFetchDebugger::debugCacheWrite()
llassert_always(mState == IDLE);
mTimer.reset();
mState = WRITE_CACHE;
+ mCacheWriteTime = -1.f;
S32 size = mFetchingHistory.size();
for(S32 i = 0 ; i < size ; i++)
@@ -3405,7 +3543,7 @@ void LLTextureFetchDebugger::debugCacheWrite()
mFetchingHistory[i].mCacheHandle = mTextureCache->writeToCache(mFetchingHistory[i].mID, LLWorkerThread::PRIORITY_NORMAL,
mFetchingHistory[i].mFormattedImage->getData(), mFetchingHistory[i].mFetchedSize,
mFetchingHistory[i].mDecodedLevel == 0 ? mFetchingHistory[i].mFetchedSize : mFetchingHistory[i].mFetchedSize + 1,
- new LLDebuggerCacheWriteResponder(this, i));
+ NULL, 0, new LLDebuggerCacheWriteResponder(this, i));
}
}
}
@@ -3424,6 +3562,7 @@ void LLTextureFetchDebugger::debugDecoder()
llassert_always(mState == IDLE);
mTimer.reset();
mState = DECODING;
+ mDecodingTime = -1.f;
S32 size = mFetchingHistory.size();
for(S32 i = 0 ; i < size ; i++)
@@ -3459,6 +3598,7 @@ void LLTextureFetchDebugger::debugHTTP()
mTimer.reset();
mState = HTTP_FETCHING;
+ mHTTPTime = -1.f;
S32 size = mFetchingHistory.size();
for (S32 i = 0 ; i < size ; i++)
@@ -3475,14 +3615,28 @@ void LLTextureFetchDebugger::debugHTTP()
S32 LLTextureFetchDebugger::fillCurlQueue()
{
- if (mNbCurlRequests == 24)
- return mNbCurlRequests;
-
+ if(mStopDebug) //stop
+ {
+ mNbCurlCompleted = mFetchingHistory.size();
+ return 0;
+ }
S32 size = mFetchingHistory.size();
+
+ if (mNbCurlRequests == size) //all issued
+ {
+ return 0;
+ }
+
+ S32 counter = 8;
+ mNbCurlRequests = 0;
for (S32 i = 0 ; i < size ; i++)
{
+ mNbCurlRequests++;
+
if (mFetchingHistory[i].mCurlState != FetchEntry::CURL_NOT_DONE)
+ {
continue;
+ }
std::string texture_url = mHTTPUrl + "/?texture_id=" + mFetchingHistory[i].mID.asString().c_str();
S32 requestedSize = mFetchingHistory[i].mRequestedSize;
// We request the whole file if the size was not set.
@@ -3491,16 +3645,11 @@ S32 LLTextureFetchDebugger::fillCurlQueue()
requestedSize = (requestedSize == 33554432 ? 0 : requestedSize);
std::vector<std::string> headers;
headers.push_back("Accept: image/x-j2c");
- bool res = mCurlGetRequest->getByteRange(texture_url, headers, 0, requestedSize, new LLDebuggerHTTPResponder(this, i));
- if (res)
- {
- mFetchingHistory[i].mCurlState = FetchEntry::CURL_IN_PROGRESS;
- mNbCurlRequests++;
- // Hack
- if (mNbCurlRequests == 24)
- break;
- }
- else
+ mCurlGetRequest->getByteRange(texture_url, headers, 0, requestedSize, 0x10000, new LLDebuggerHTTPResponder(this, i));
+
+ mFetchingHistory[i].mCurlState = FetchEntry::CURL_IN_PROGRESS;
+ counter--;
+ if(counter < 1)
{
break;
}
@@ -3513,7 +3662,7 @@ void LLTextureFetchDebugger::debugGLTextureCreation()
{
llassert_always(mState == IDLE);
mState = GL_TEX;
- std::vector<LLViewerFetchedTexture*> tex_list;
+ mTempTexList.clear();
S32 size = mFetchingHistory.size();
for(S32 i = 0 ; i < size ; i++)
@@ -3524,28 +3673,54 @@ void LLTextureFetchDebugger::debugGLTextureCreation()
if(tex && !tex->isForSculptOnly())
{
tex->destroyGLTexture() ;
- tex_list.push_back(tex);
+ mTempTexList.push_back(tex);
}
}
}
+
+ mGLCreationTime = -1.f;
+ mTempIndex = 0;
+ mHistoryListIndex = 0;
+
+ return;
+}
+bool LLTextureFetchDebugger::processGLCreation(F32 max_time)
+{
mTimer.reset();
- S32 j = 0 ;
- S32 size1 = tex_list.size();
- for(S32 i = 0 ; i < size && j < size1; i++)
+
+ bool done = true;
+ S32 size = mFetchingHistory.size();
+ S32 size1 = mTempTexList.size();
+ for(; mHistoryListIndex < size && mTempIndex < size1; mHistoryListIndex++)
{
- if(mFetchingHistory[i].mRawImage.notNull())
+ if(mFetchingHistory[mHistoryListIndex].mRawImage.notNull())
{
- if(mFetchingHistory[i].mID == tex_list[j]->getID())
+ if(mFetchingHistory[mHistoryListIndex].mID == mTempTexList[mTempIndex]->getID())
{
- tex_list[j]->createGLTexture(mFetchingHistory[i].mDecodedLevel, mFetchingHistory[i].mRawImage, 0, TRUE, tex_list[j]->getBoostLevel());
- j++;
+ mTempTexList[mTempIndex]->createGLTexture(mFetchingHistory[mHistoryListIndex].mDecodedLevel,
+ mFetchingHistory[mHistoryListIndex].mRawImage, 0, TRUE, mTempTexList[mTempIndex]->getBoostLevel());
+ mTempIndex++;
}
}
+
+ if(mTimer.getElapsedTimeF32() > max_time)
+ {
+ done = false;
+ break;
+ }
}
- mGLCreationTime = mTimer.getElapsedTimeF32() ;
- return;
+ if(mGLCreationTime < 0.f)
+ {
+ mGLCreationTime = mTimer.getElapsedTimeF32() ;
+ }
+ else
+ {
+ mGLCreationTime += mTimer.getElapsedTimeF32() ;
+ }
+
+ return done;
}
//clear fetching results of all textures.
@@ -3562,15 +3737,62 @@ void LLTextureFetchDebugger::clearTextures()
}
}
+void LLTextureFetchDebugger::makeRefetchList()
+{
+ mRefetchList.clear();
+ S32 size = mFetchingHistory.size();
+ for(S32 i = 0 ; i < size; i++)
+ {
+ LLViewerFetchedTexture* tex = LLViewerTextureManager::getFetchedTexture(mFetchingHistory[i].mID);
+ if(tex && tex->isJustBound()) //visible
+ {
+ continue; //the texture fetch pipeline will take care of visible textures.
+ }
+
+ mRefetchList[tex].push_back(i);
+ }
+}
+
+void LLTextureFetchDebugger::scanRefetchList()
+{
+ if(mStopDebug)
+ {
+ return;
+ }
+ if(!mRefetchNonVis)
+ {
+ return;
+ }
+
+ for(std::map< LLPointer<LLViewerFetchedTexture>, std::vector<S32> >::iterator iter = mRefetchList.begin();
+ iter != mRefetchList.end(); )
+ {
+ if(iter->second.empty())
+ {
+ gTextureList.setDebugFetching(iter->first, -1);
+ mRefetchList.erase(iter++); // This is the correct method to "erase and move on" in an std::map
+ }
+ else
+ {
+ gTextureList.setDebugFetching(iter->first, mFetchingHistory[iter->second[0]].mDecodedLevel);
+ ++iter;
+ }
+ }
+}
+
void LLTextureFetchDebugger::debugRefetchVisibleFromCache()
{
llassert_always(mState == IDLE);
mState = REFETCH_VIS_CACHE;
clearTextures();
-
+ mFetcher->setLoadSource(LLTextureFetch::FROM_ALL);
+
mTimer.reset();
mFetcher->lockFetcher(false);
+ mRefetchVisCacheTime = -1.f;
+ mRefetchedVisData = 0;
+ mRefetchedVisPixels = 0;
}
void LLTextureFetchDebugger::debugRefetchVisibleFromHTTP()
@@ -3578,17 +3800,60 @@ void LLTextureFetchDebugger::debugRefetchVisibleFromHTTP()
llassert_always(mState == IDLE);
mState = REFETCH_VIS_HTTP;
- clearCache();
clearTextures();
+ mFetcher->setLoadSource(LLTextureFetch::FROM_HTTP_ONLY);
mTimer.reset();
mFetcher->lockFetcher(false);
+ mRefetchVisHTTPTime = -1.f;
+ mRefetchedVisData = 0;
+ mRefetchedVisPixels = 0;
}
-bool LLTextureFetchDebugger::update()
+void LLTextureFetchDebugger::debugRefetchAllFromCache()
+{
+ llassert_always(mState == IDLE);
+ mState = REFETCH_ALL_CACHE;
+
+ clearTextures();
+ makeRefetchList();
+ mFetcher->setLoadSource(LLTextureFetch::FROM_ALL);
+
+ mTimer.reset();
+ mFetcher->lockFetcher(false);
+ mRefetchAllCacheTime = -1.f;
+ mRefetchedAllData = 0;
+ mRefetchedAllPixels = 0;
+ mRefetchNonVis = FALSE;
+}
+
+void LLTextureFetchDebugger::debugRefetchAllFromHTTP()
+{
+ llassert_always(mState == IDLE);
+ mState = REFETCH_ALL_HTTP;
+
+ clearTextures();
+ makeRefetchList();
+ mFetcher->setLoadSource(LLTextureFetch::FROM_HTTP_ONLY);
+
+ mTimer.reset();
+ mFetcher->lockFetcher(false);
+ mRefetchAllHTTPTime = -1.f;
+ mRefetchedAllData = 0;
+ mRefetchedAllPixels = 0;
+ mRefetchNonVis = TRUE;
+}
+
+bool LLTextureFetchDebugger::update(F32 max_time)
{
switch(mState)
{
+ case START_DEBUG:
+ if(processStartDebug(max_time))
+ {
+ mState = IDLE;
+ }
+ break;
case READ_CACHE:
if(!mTextureCache->update(1))
{
@@ -3615,6 +3880,7 @@ bool LLTextureFetchDebugger::update()
break;
case HTTP_FETCHING:
mCurlGetRequest->process();
+ mCurlGetRequest->nextRequests();
LLCurl::getCurlThread()->update(1);
if (!fillCurlQueue() && mNbCurlCompleted == mFetchingHistory.size())
{
@@ -3623,22 +3889,59 @@ bool LLTextureFetchDebugger::update()
}
break;
case GL_TEX:
- mState = IDLE;
+ if(processGLCreation(max_time))
+ {
+ mState = IDLE;
+ mTempTexList.clear();
+ }
break;
case REFETCH_VIS_CACHE:
if (LLAppViewer::getTextureFetch()->getNumRequests() == 0)
{
- mRefetchVisCacheTime = gDebugTimers[0].getElapsedTimeF32() - mTotalFetchingTime;
+ mRefetchVisCacheTime = mTimer.getElapsedTimeF32() ;
mState = IDLE;
mFetcher->lockFetcher(true);
+ mFetcher->resetLoadSource();
}
break;
case REFETCH_VIS_HTTP:
if (LLAppViewer::getTextureFetch()->getNumRequests() == 0)
{
- mRefetchVisHTTPTime = gDebugTimers[0].getElapsedTimeF32() - mTotalFetchingTime;
+ mRefetchVisHTTPTime = mTimer.getElapsedTimeF32() ;
+ mState = IDLE;
+ mFetcher->lockFetcher(true);
+ mFetcher->resetLoadSource();
+ }
+ break;
+ case REFETCH_ALL_CACHE:
+ scanRefetchList();
+ if (LLAppViewer::getTextureFetch()->getNumRequests() == 0)
+ {
+ if(!mRefetchNonVis)
+ {
+ mRefetchNonVis = TRUE; //start to fetch non-vis
+ scanRefetchList();
+ break;
+ }
+
+ mRefetchAllCacheTime = mTimer.getElapsedTimeF32() ;
+ mState = IDLE;
+ mFetcher->lockFetcher(true);
+ mFetcher->resetLoadSource();
+ mRefetchList.clear();
+ mRefetchNonVis = FALSE;
+ }
+ break;
+ case REFETCH_ALL_HTTP:
+ scanRefetchList();
+ if (LLAppViewer::getTextureFetch()->getNumRequests() == 0)
+ {
+ mRefetchAllHTTPTime = mTimer.getElapsedTimeF32() ;
mState = IDLE;
mFetcher->lockFetcher(true);
+ mFetcher->resetLoadSource();
+ mRefetchList.clear();
+ mRefetchNonVis = FALSE;
}
break;
default:
@@ -3679,7 +3982,6 @@ void LLTextureFetchDebugger::callbackHTTP(S32 id, const LLChannelDescriptors& ch
const LLIOPipe::buffer_ptr_t& buffer,
bool partial, bool success)
{
- mNbCurlRequests--;
if (success)
{
mFetchingHistory[id].mCurlState = FetchEntry::CURL_DONE;
@@ -3693,7 +3995,7 @@ void LLTextureFetchDebugger::callbackHTTP(S32 id, const LLChannelDescriptors& ch
U8* d_buffer = (U8*)ALLOCATE_MEM(LLImageBase::getPrivatePool(), data_size);
buffer->readAfter(channels.in(), NULL, d_buffer, data_size);
- llassert_always(mFetchingHistory[id].mFormattedImage.isNull());
+ mFetchingHistory[id].mFormattedImage = NULL;
{
// For now, create formatted image based on extension
std::string texture_url = mHTTPUrl + "/?texture_id=" + mFetchingHistory[id].mID.asString().c_str();
@@ -3715,6 +4017,7 @@ void LLTextureFetchDebugger::callbackHTTP(S32 id, const LLChannelDescriptors& ch
{
// Fetch will have to be redone
mFetchingHistory[id].mCurlState = FetchEntry::CURL_NOT_DONE;
+ mNbCurlRequests--;
}
else //skip
{
diff --git a/indra/newview/lltexturefetch.h b/indra/newview/lltexturefetch.h
index 107e1623b0..f5072a79f1 100644
--- a/indra/newview/lltexturefetch.h
+++ b/indra/newview/lltexturefetch.h
@@ -65,6 +65,7 @@ public:
bool createRequest(const std::string& url, const LLUUID& id, const LLHost& host, F32 priority,
S32 w, S32 h, S32 c, S32 discard, bool needs_aux, bool can_use_http);
void deleteRequest(const LLUUID& id, bool cancel);
+ void deleteAllRequests();
bool getRequestFinished(const LLUUID& id, S32& discard_level,
LLPointer<LLImageRaw>& raw, LLPointer<LLImageRaw>& aux);
bool updateRequestPriority(const LLUUID& id, F32 priority);
@@ -81,8 +82,6 @@ public:
U32& fetch_priority_p, F32& fetch_dtime_p, F32& request_dtime_p, bool& can_use_http);
void dump();
S32 getNumRequests() ;
- S32 getNumHTTPRequests() ;
- U32 getTotalNumHTTPRequests() ;
// Public for access by callbacks
S32 getPending();
@@ -101,7 +100,7 @@ public:
LLViewerAssetStats * main_stats);
void commandDataBreak();
- LLCurlRequest & getCurlRequest() { return *mCurlGetRequest; }
+ LLCurlTextureRequest & getCurlRequest() { return *mCurlGetRequest; }
bool isQAMode() const { return mQAMode; }
@@ -113,7 +112,6 @@ protected:
void addToNetworkQueue(LLTextureFetchWorker* worker);
void removeFromNetworkQueue(LLTextureFetchWorker* worker, bool cancel);
void addToHTTPQueue(const LLUUID& id);
- void removeFromHTTPQueue(const LLUUID& id, S32 received_size = 0);
void removeRequest(LLTextureFetchWorker* worker, bool cancel);
// Overrides from the LLThread tree
@@ -172,8 +170,8 @@ private:
LLTextureCache* mTextureCache;
LLImageDecodeThread* mImageDecodeThread;
- LLCurlRequest* mCurlGetRequest;
-
+ LLCurlTextureRequest* mCurlGetRequest;
+
// Map of all requests by UUID
typedef std::map<LLUUID,LLTextureFetchWorker*> map_t;
map_t mRequestMap;
@@ -188,11 +186,6 @@ private:
F32 mMaxBandwidth;
LLTextureInfo mTextureInfo;
- U32 mHTTPTextureBits;
-
- //debug use
- U32 mTotalHTTPRequests ;
-
// Out-of-band cross-thread command queue. This command queue
// is logically tied to LLQueuedThread's list of
// QueuedRequest instances and so must be covered by the
@@ -216,18 +209,34 @@ public:
// reporting due to either startup or a problem POSTing data.
static volatile bool svMetricsDataBreak;
+public:
+ //debug use
+ enum e_tex_source
+ {
+ FROM_ALL = 0,
+ FROM_HTTP_ONLY,
+ INVALID_SOURCE
+ };
private:
//debug use
LLTextureFetchDebugger* mFetchDebugger;
bool mFetcherLocked;
+
+ e_tex_source mFetchSource;
+ e_tex_source mOriginFetchSource;
public:
//debug use
LLTextureFetchDebugger* getFetchDebugger() { return mFetchDebugger;}
void lockFetcher(bool lock) { mFetcherLocked = lock;}
+
+ void setLoadSource(e_tex_source source) {mFetchSource = source;}
+ void resetLoadSource() {mFetchSource = mOriginFetchSource;}
+ bool canLoadFromCache() { return mFetchSource != FROM_HTTP_ONLY;}
};
//debug use
+class LLViewerFetchedTexture;
class LLTextureFetchDebugger
{
friend class LLTextureFetch;
@@ -239,6 +248,7 @@ public:
enum e_debug_state
{
IDLE = 0,
+ START_DEBUG,
READ_CACHE,
WRITE_CACHE,
DECODING,
@@ -301,13 +311,15 @@ private:
F32 mTotalFetchingTime;
F32 mRefetchVisCacheTime;
F32 mRefetchVisHTTPTime;
+ F32 mRefetchAllCacheTime;
+ F32 mRefetchAllHTTPTime;
LLTimer mTimer;
LLTextureFetch* mFetcher;
LLTextureCache* mTextureCache;
LLImageDecodeThread* mImageDecodeThread;
- LLCurlRequest* mCurlGetRequest;
+ LLCurlTextureRequest* mCurlGetRequest;
S32 mNumFetchedTextures;
S32 mNumCacheHits;
@@ -321,34 +333,39 @@ private:
U32 mRenderedDecodedData;
U32 mFetchedPixels;
U32 mRenderedPixels;
- U32 mRefetchedData;
- U32 mRefetchedPixels;
+ U32 mRefetchedVisData;
+ U32 mRefetchedVisPixels;
+ U32 mRefetchedAllData;
+ U32 mRefetchedAllPixels;
BOOL mFreezeHistory;
+ BOOL mStopDebug;
+ BOOL mClearHistory;
+ BOOL mRefetchNonVis;
std::string mHTTPUrl;
S32 mNbCurlRequests;
S32 mNbCurlCompleted;
+ std::map< LLPointer<LLViewerFetchedTexture>, std::vector<S32> > mRefetchList;
+ std::vector< LLPointer<LLViewerFetchedTexture> > mTempTexList;
+ S32 mTempIndex;
+ S32 mHistoryListIndex;
+
public:
- bool update(); //called in the main thread once per frame
+ bool update(F32 max_time); //called in the main thread once per frame
//fetching history
void clearHistory();
void addHistoryEntry(LLTextureFetchWorker* worker);
- void setCurlGetRequest(LLCurlRequest* request) { mCurlGetRequest = request;}
-
- void startDebug();
- void stopDebug(); //stop everything
- void debugCacheRead();
- void debugCacheWrite();
- void debugHTTP();
- void debugDecoder();
- void debugGLTextureCreation();
- void debugRefetchVisibleFromCache();
- void debugRefetchVisibleFromHTTP();
+ void setCurlGetRequest(LLCurlTextureRequest* request) { mCurlGetRequest = request;}
+ LLCurlTextureRequest* getCurlGetRequest() { return mCurlGetRequest;}
+ void startWork(e_debug_state state);
+ void setStopDebug() {mStopDebug = TRUE;}
+ void tryToStopDebug(); //stop everything
+
void callbackCacheRead(S32 id, bool success, LLImageFormatted* image,
S32 imagesize, BOOL islocal);
void callbackCacheWrite(S32 id, bool success);
@@ -372,8 +389,10 @@ public:
U32 getRenderedDecodedData() {return mRenderedDecodedData;}
U32 getFetchedPixels() {return mFetchedPixels;}
U32 getRenderedPixels() {return mRenderedPixels;}
- U32 getRefetchedData() {return mRefetchedData;}
- U32 getRefetchedPixels() {return mRefetchedPixels;}
+ U32 getRefetchedVisData() {return mRefetchedVisData;}
+ U32 getRefetchedVisPixels() {return mRefetchedVisPixels;}
+ U32 getRefetchedAllData() {return mRefetchedAllData;}
+ U32 getRefetchedAllPixels() {return mRefetchedAllPixels;}
F32 getCacheReadTime() {return mCacheReadTime;}
F32 getCacheWriteTime() {return mCacheWriteTime;}
@@ -383,11 +402,15 @@ public:
F32 getTotalFetchingTime() {return mTotalFetchingTime;}
F32 getRefetchVisCacheTime() {return mRefetchVisCacheTime;}
F32 getRefetchVisHTTPTime() {return mRefetchVisHTTPTime;}
+ F32 getRefetchAllCacheTime() {return mRefetchAllCacheTime;}
+ F32 getRefetchAllHTTPTime() {return mRefetchAllHTTPTime;}
private:
void init();
void clearTextures();//clear fetching results of all textures.
void clearCache();
+ void makeRefetchList();
+ void scanRefetchList();
void lockFetcher();
void unlockFetcher();
@@ -400,6 +423,20 @@ private:
S32 fillCurlQueue();
+ void startDebug();
+ void debugCacheRead();
+ void debugCacheWrite();
+ void debugHTTP();
+ void debugDecoder();
+ void debugGLTextureCreation();
+ void debugRefetchVisibleFromCache();
+ void debugRefetchVisibleFromHTTP();
+ void debugRefetchAllFromCache();
+ void debugRefetchAllFromHTTP();
+
+ bool processStartDebug(F32 max_time);
+ bool processGLCreation(F32 max_time);
+
private:
static bool sDebuggerEnabled;
public:
diff --git a/indra/newview/lltextureview.cpp b/indra/newview/lltextureview.cpp
index 425bf7ee87..c60b4155a0 100644..100755
--- a/indra/newview/lltextureview.cpp
+++ b/indra/newview/lltextureview.cpp
@@ -510,11 +510,11 @@ void LLGLTexMemBar::draw()
F32 discard_bias = LLViewerTexture::sDesiredDiscardBias;
F32 cache_usage = (F32)BYTES_TO_MEGA_BYTES(LLAppViewer::getTextureCache()->getUsage()) ;
F32 cache_max_usage = (F32)BYTES_TO_MEGA_BYTES(LLAppViewer::getTextureCache()->getMaxUsage()) ;
- S32 line_height = (S32)(LLFontGL::getFontMonospace()->getLineHeight() + .5f);
+ S32 line_height = LLFontGL::getFontMonospace()->getLineHeight();
S32 v_offset = 0;//(S32)((texture_bar_height + 2.2f) * mTextureView->mNumTextureBars + 2.0f);
F32 total_texture_downloaded = (F32)gTotalTextureBytes / (1024 * 1024);
F32 total_object_downloaded = (F32)gTotalObjectBytes / (1024 * 1024);
- U32 total_http_requests = LLAppViewer::getTextureFetch()->getTotalNumHTTPRequests() ;
+ U32 total_http_requests = LLAppViewer::getTextureFetch()->getCurlRequest().getTotalIssuedRequests() ;
//----------------------------------------------------------------------------
LLGLSUIDefault gls_ui;
LLColor4 text_color(1.f, 1.f, 1.f, 0.75f);
@@ -552,7 +552,7 @@ void LLGLTexMemBar::draw()
LLAppViewer::getTextureCache()->getNumReads(), LLAppViewer::getTextureCache()->getNumWrites(),
LLLFSThread::sLocal->getPending(),
LLImageRaw::sRawImageCount,
- LLAppViewer::getTextureFetch()->getNumHTTPRequests(),
+ LLAppViewer::getTextureFetch()->getCurlRequest().getNumRequests(),
LLAppViewer::getImageDecodeThread()->getPending(),
gTextureList.mCreateTextureList.size());
diff --git a/indra/newview/lltoastnotifypanel.cpp b/indra/newview/lltoastnotifypanel.cpp
index a473ee7ce0..602b924398 100644
--- a/indra/newview/lltoastnotifypanel.cpp
+++ b/indra/newview/lltoastnotifypanel.cpp
@@ -334,32 +334,24 @@ void LLToastNotifyPanel::updateButtonsLayout(const std::vector<index_button_pair
}
U32 ignore_btn_width = 0;
+ U32 mute_btn_pad = 0;
if (mIsScriptDialog && ignore_btn != NULL)
{
LLRect ignore_btn_rect(ignore_btn->getRect());
- S32 buttons_per_row = max_width / BUTTON_WIDTH; //assume that h_pad far less than BUTTON_WIDTH
- S32 ignore_btn_left = buttons_per_row * BUTTON_WIDTH + (buttons_per_row - 1) * h_pad - ignore_btn_rect.getWidth();
- if (ignore_btn_left + ignore_btn_rect.getWidth() > max_width)// make sure that the ignore button is in panel
- {
- ignore_btn_left = max_width - ignore_btn_rect.getWidth() - 2 * HPAD;
- }
+ S32 ignore_btn_left = max_width - ignore_btn_rect.getWidth();
ignore_btn_rect.setOriginAndSize(ignore_btn_left, BOTTOM_PAD,// always move ignore button at the bottom
ignore_btn_rect.getWidth(), ignore_btn_rect.getHeight());
ignore_btn->setRect(ignore_btn_rect);
ignore_btn_width = ignore_btn_rect.getWidth();
mControlPanel->addChild(ignore_btn, -1);
+ mute_btn_pad = 4 * HPAD; //only use a 4 * HPAD padding if an ignore button exists
}
if (mIsScriptDialog && mute_btn != NULL)
{
LLRect mute_btn_rect(mute_btn->getRect());
- S32 buttons_per_row = max_width / BUTTON_WIDTH; //assume that h_pad far less than BUTTON_WIDTH
// Place mute (Block) button to the left of the ignore button.
- S32 mute_btn_left = buttons_per_row * BUTTON_WIDTH + (buttons_per_row - 1) * h_pad - mute_btn_rect.getWidth() - ignore_btn_width - (h_pad / 2);
- if (mute_btn_left + mute_btn_rect.getWidth() > max_width) // make sure that the mute button is in panel
- {
- mute_btn_left = max_width - mute_btn_rect.getWidth() - 2 * HPAD;
- }
+ S32 mute_btn_left = max_width - mute_btn_rect.getWidth() - ignore_btn_width - mute_btn_pad;
mute_btn_rect.setOriginAndSize(mute_btn_left, BOTTOM_PAD,// always move mute button at the bottom
mute_btn_rect.getWidth(), mute_btn_rect.getHeight());
mute_btn->setRect(mute_btn_rect);
@@ -457,7 +449,7 @@ button_name_set_t getButtonDisableList(const std::string& notification_name, con
{
search_map = user_give_item_disable_map;
}
- else if("TeleportOffered" == notification_name)
+ else if(("TeleportOffered" == notification_name) || ("TeleportOffered_MaturityExceeded" == notification_name))
{
search_map = teleport_offered_disable_map;
}
diff --git a/indra/newview/lltooldraganddrop.cpp b/indra/newview/lltooldraganddrop.cpp
index 4f4eef0f3d..c69999981c 100644
--- a/indra/newview/lltooldraganddrop.cpp
+++ b/indra/newview/lltooldraganddrop.cpp
@@ -1007,7 +1007,14 @@ BOOL LLToolDragAndDrop::handleDropTextureProtections(LLViewerObject* hit_obj,
}
}
// Add the texture item to the target object's inventory.
- hit_obj->updateInventory(new_item, TASK_INVENTORY_ITEM_KEY, true);
+ if (LLAssetType::AT_TEXTURE == new_item->getType())
+ {
+ hit_obj->updateTextureInventory(new_item, TASK_INVENTORY_ITEM_KEY, true);
+ }
+ else
+ {
+ hit_obj->updateInventory(new_item, TASK_INVENTORY_ITEM_KEY, true);
+ }
// TODO: Check to see if adding the item was successful; if not, then
// we should return false here.
}
@@ -1022,7 +1029,14 @@ BOOL LLToolDragAndDrop::handleDropTextureProtections(LLViewerObject* hit_obj,
// *FIX: may want to make sure agent can paint hit_obj.
// Add the texture item to the target object's inventory.
- hit_obj->updateInventory(new_item, TASK_INVENTORY_ITEM_KEY, true);
+ if (LLAssetType::AT_TEXTURE == new_item->getType())
+ {
+ hit_obj->updateTextureInventory(new_item, TASK_INVENTORY_ITEM_KEY, true);
+ }
+ else
+ {
+ hit_obj->updateInventory(new_item, TASK_INVENTORY_ITEM_KEY, true);
+ }
// Force the object to update its refetch its inventory so it has this texture.
hit_obj->fetchInventoryFromServer();
// TODO: Check to see if adding the item was successful; if not, then
diff --git a/indra/newview/lltooldraganddrop.h b/indra/newview/lltooldraganddrop.h
index 245c2a23e6..41aee484db 100644
--- a/indra/newview/lltooldraganddrop.h
+++ b/indra/newview/lltooldraganddrop.h
@@ -93,6 +93,13 @@ public:
static S32 getOperationId() { return sOperationId; }
+ // deal with permissions of object, etc. returns TRUE if drop can
+ // proceed, otherwise FALSE.
+ static BOOL handleDropTextureProtections(LLViewerObject* hit_obj,
+ LLInventoryItem* item,
+ LLToolDragAndDrop::ESource source,
+ const LLUUID& src_id);
+
protected:
enum EDropTarget
{
@@ -219,13 +226,6 @@ protected:
// inventory items to determine if a drop would be ok.
static EAcceptance willObjectAcceptInventory(LLViewerObject* obj, LLInventoryItem* item);
- // deal with permissions of object, etc. returns TRUE if drop can
- // proceed, otherwise FALSE.
- static BOOL handleDropTextureProtections(LLViewerObject* hit_obj,
- LLInventoryItem* item,
- LLToolDragAndDrop::ESource source,
- const LLUUID& src_id);
-
public:
// helper functions
static BOOL isInventoryDropAcceptable(LLViewerObject* obj, LLInventoryItem* item) { return (ACCEPT_YES_COPY_SINGLE <= willObjectAcceptInventory(obj, item)); }
diff --git a/indra/newview/lltoolgrab.cpp b/indra/newview/lltoolgrab.cpp
index 319e2508e0..9907da0f0e 100644
--- a/indra/newview/lltoolgrab.cpp
+++ b/indra/newview/lltoolgrab.cpp
@@ -205,9 +205,9 @@ BOOL LLToolGrab::handleObjectHit(const LLPickInfo& info)
// Clicks on scripted or physical objects are temporary grabs, so
// not "Build mode"
- mHideBuildHighlight = script_touch || objectp->usePhysics();
+ mHideBuildHighlight = script_touch || objectp->flagUsePhysics();
- if (!objectp->usePhysics())
+ if (!objectp->flagUsePhysics())
{
if (script_touch)
{
@@ -222,18 +222,24 @@ BOOL LLToolGrab::handleObjectHit(const LLPickInfo& info)
if (gAgentCamera.cameraMouselook())
{
mMode = GRAB_LOCKED;
+ gViewerWindow->hideCursor();
+ gViewerWindow->moveCursorToCenter();
}
- else
+ else if (objectp->permMove() && !objectp->isPermanentEnforced())
{
mMode = GRAB_ACTIVE_CENTER;
+ gViewerWindow->hideCursor();
+ gViewerWindow->moveCursorToCenter();
+ }
+ else
+ {
+ mMode = GRAB_LOCKED;
}
- gViewerWindow->hideCursor();
- gViewerWindow->moveCursorToCenter();
}
}
- else if( !objectp->permMove() )
+ else if( objectp->flagCharacter() || !objectp->permMove() || objectp->isPermanentEnforced())
{
// if mouse is over a physical object without move permission, show feedback if user tries to move it.
mMode = GRAB_LOCKED;
diff --git a/indra/newview/lltoolmgr.cpp b/indra/newview/lltoolmgr.cpp
index ac01316462..a135ba70f5 100644
--- a/indra/newview/lltoolmgr.cpp
+++ b/indra/newview/lltoolmgr.cpp
@@ -91,6 +91,8 @@ LLToolMgr::LLToolMgr()
// gLandToolset = new LLToolset();
gMouselookToolset = new LLToolset();
gFaceEditToolset = new LLToolset();
+ gMouselookToolset->setShowFloaterTools(false);
+ gFaceEditToolset->setShowFloaterTools(false);
}
void LLToolMgr::initTools()
diff --git a/indra/newview/lltoolmgr.h b/indra/newview/lltoolmgr.h
index 12649cfba2..e7d1c56c83 100644
--- a/indra/newview/lltoolmgr.h
+++ b/indra/newview/lltoolmgr.h
@@ -89,7 +89,7 @@ protected:
class LLToolset
{
public:
- LLToolset() : mSelectedTool(NULL) {}
+ LLToolset() : mSelectedTool(NULL), mIsShowFloaterTools(true) {}
LLTool* getSelectedTool() { return mSelectedTool; }
@@ -105,10 +105,14 @@ public:
BOOL isToolSelected( S32 index );
+ void setShowFloaterTools(bool pShowFloaterTools) {mIsShowFloaterTools = pShowFloaterTools;};
+ bool isShowFloaterTools() const {return mIsShowFloaterTools;};
+
protected:
LLTool* mSelectedTool;
typedef std::vector<LLTool*> tool_list_t;
tool_list_t mToolList;
+ bool mIsShowFloaterTools;
};
// Globals
diff --git a/indra/newview/lltoolmorph.cpp b/indra/newview/lltoolmorph.cpp
index 718201e381..0d5daf129f 100644
--- a/indra/newview/lltoolmorph.cpp
+++ b/indra/newview/lltoolmorph.cpp
@@ -225,7 +225,8 @@ BOOL LLVisualParamHint::render()
LLViewerCamera::getInstance()->setPerspective(FALSE, mOrigin.mX, mOrigin.mY, mFullWidth, mFullHeight, FALSE);
- if (gAgentAvatarp->mDrawable.notNull())
+ if (gAgentAvatarp->mDrawable.notNull() &&
+ gAgentAvatarp->mDrawable->getFace(0))
{
LLDrawPoolAvatar *avatarPoolp = (LLDrawPoolAvatar *)gAgentAvatarp->mDrawable->getFace(0)->getPool();
LLGLDepthTest gls_depth(GL_TRUE, GL_TRUE);
diff --git a/indra/newview/lltoolpie.cpp b/indra/newview/lltoolpie.cpp
index b0d9bd5d70..3cd761b73b 100644
--- a/indra/newview/lltoolpie.cpp
+++ b/indra/newview/lltoolpie.cpp
@@ -312,7 +312,7 @@ BOOL LLToolPie::handleLeftClickPick()
// Switch to grab tool if physical or triggerable
if (object &&
!object->isAvatar() &&
- ((object->usePhysics() || (parent && !parent->isAvatar() && parent->usePhysics())) || touchable)
+ ((object->flagUsePhysics() || (parent && !parent->isAvatar() && parent->flagUsePhysics())) || touchable)
)
{
gGrabTransientTool = this;
@@ -596,8 +596,8 @@ BOOL LLToolPie::handleHover(S32 x, S32 y, MASK mask)
lldebugst(LLERR_USER_INPUT) << "hover handled by LLToolPie (inactive)" << llendl;
}
- else if ((object && !object->isAvatar() && object->usePhysics())
- || (parent && !parent->isAvatar() && parent->usePhysics()))
+ else if ((object && !object->isAvatar() && object->flagUsePhysics())
+ || (parent && !parent->isAvatar() && parent->flagUsePhysics()))
{
show_highlight = true;
gViewerWindow->setCursor(UI_CURSOR_TOOLGRAB);
diff --git a/indra/newview/lltracker.cpp b/indra/newview/lltracker.cpp
index bf1f8808a7..cbd16e873d 100644
--- a/indra/newview/lltracker.cpp
+++ b/indra/newview/lltracker.cpp
@@ -251,7 +251,7 @@ void LLTracker::render3D()
instance()->mBeaconText->setDoFade(FALSE);
}
- F32 dist = gFloaterWorldMap->getDistanceToDestination(instance()->mTrackedPositionGlobal, 0.0f);
+ F32 dist = gFloaterWorldMap->getDistanceToDestination(instance()->getTrackedPositionGlobal(), 0.0f);
if (dist < DESTINATION_REACHED_RADIUS)
{
instance()->stopTrackingAvatar();
diff --git a/indra/newview/llurldispatcher.cpp b/indra/newview/llurldispatcher.cpp
index 4240a38326..00b15a5f26 100644
--- a/indra/newview/llurldispatcher.cpp
+++ b/indra/newview/llurldispatcher.cpp
@@ -205,18 +205,18 @@ void LLURLDispatcherImpl::regionHandleCallback(U64 region_handle, const LLSLURL&
{
// we can't teleport cross grid at this point
- if((!LLGridManager::getInstance()->isSystemGrid(slurl.getGrid()) || !LLGridManager::getInstance()->isSystemGrid()) &&
- (slurl.getGrid() != LLGridManager::getInstance()->getGrid()))
+ if( LLGridManager::getInstance()->getGrid(slurl.getGrid())
+ != LLGridManager::getInstance()->getGrid())
{
LLSD args;
args["SLURL"] = slurl.getLocationString();
args["CURRENT_GRID"] = LLGridManager::getInstance()->getGridLabel();
- LLSD grid_info;
- LLGridManager::getInstance()->getGridInfo(slurl.getGrid(), grid_info);
+ std::string grid_label =
+ LLGridManager::getInstance()->getGridLabel(slurl.getGrid());
- if(grid_info.has(GRID_LABEL_VALUE))
+ if(!grid_label.empty())
{
- args["GRID"] = grid_info[GRID_LABEL_VALUE].asString();
+ args["GRID"] = grid_label;
}
else
{
diff --git a/indra/newview/llviewerassetstats.cpp b/indra/newview/llviewerassetstats.cpp
index 4c59fd0371..4c59fd0371 100644..100755
--- a/indra/newview/llviewerassetstats.cpp
+++ b/indra/newview/llviewerassetstats.cpp
diff --git a/indra/newview/llviewerassetstats.h b/indra/newview/llviewerassetstats.h
index 8319752230..8319752230 100644..100755
--- a/indra/newview/llviewerassetstats.h
+++ b/indra/newview/llviewerassetstats.h
diff --git a/indra/newview/llvieweraudio.cpp b/indra/newview/llvieweraudio.cpp
index 2447f5dea8..8d8c401dac 100644
--- a/indra/newview/llvieweraudio.cpp
+++ b/indra/newview/llvieweraudio.cpp
@@ -41,6 +41,7 @@
#include "llstartup.h"
#include "llviewerparcelmgr.h"
#include "llparcel.h"
+#include "llviewermessage.h"
/////////////////////////////////////////////////////////
@@ -49,15 +50,22 @@ LLViewerAudio::LLViewerAudio() :
mFadeState(FADE_IDLE),
mFadeTime(),
mIdleListnerActive(false),
- mForcedTeleportFade(false)
+ mForcedTeleportFade(false),
+ mWasPlaying(false)
{
mTeleportFailedConnection = LLViewerParcelMgr::getInstance()->
setTeleportFailedCallback(boost::bind(&LLViewerAudio::onTeleportFailed, this));
+ mTeleportFinishedConnection = LLViewerParcelMgr::getInstance()->
+ setTeleportFinishedCallback(boost::bind(&LLViewerAudio::onTeleportFinished, this, _1, _2));
+ mTeleportStartedConnection = LLViewerMessage::getInstance()->
+ setTeleportStartedCallback(boost::bind(&LLViewerAudio::onTeleportStarted, this));
}
LLViewerAudio::~LLViewerAudio()
{
mTeleportFailedConnection.disconnect();
+ mTeleportFinishedConnection.disconnect();
+ mTeleportStartedConnection.disconnect();
}
void LLViewerAudio::registerIdleListener()
@@ -67,7 +75,6 @@ void LLViewerAudio::registerIdleListener()
mIdleListnerActive = true;
doOnIdleRepeating(boost::bind(boost::bind(&LLViewerAudio::onIdleUpdate, this)));
}
-
}
void LLViewerAudio::startInternetStreamWithAutoFade(std::string streamURI)
@@ -245,16 +252,54 @@ F32 LLViewerAudio::getFadeVolume()
return fade_volume;
}
+void LLViewerAudio::onTeleportStarted()
+{
+ if (!LLViewerAudio::getInstance()->getForcedTeleportFade())
+ {
+ // Even though the music was turned off it was starting up (with autoplay disabled) occasionally
+ // after a failed teleport or after an intra-parcel teleport. Also, the music sometimes was not
+ // restarting after a successful intra-parcel teleport. Setting mWasPlaying fixes these issues.
+ LLViewerAudio::getInstance()->setWasPlaying(!gAudiop->getInternetStreamURL().empty());
+ LLViewerAudio::getInstance()->setForcedTeleportFade(true);
+ LLViewerAudio::getInstance()->startInternetStreamWithAutoFade(LLStringUtil::null);
+ LLViewerAudio::getInstance()->setNextStreamURI(LLStringUtil::null);
+ }
+}
+
void LLViewerAudio::onTeleportFailed()
{
- if (gAudiop)
+ // Calling audio_update_volume makes sure that the music stream is properly set to be restored to
+ // its previous value
+ audio_update_volume(false);
+
+ if (gAudiop && mWasPlaying)
+ {
+ LLParcel* parcel = LLViewerParcelMgr::getInstance()->getAgentParcel();
+ if (parcel)
+ {
+ mNextStreamURI = parcel->getMusicURL();
+ llinfos << "Teleport failed -- setting music stream to " << mNextStreamURI << llendl;
+ }
+ }
+ mWasPlaying = false;
+}
+
+void LLViewerAudio::onTeleportFinished(const LLVector3d& pos, const bool& local)
+{
+ // Calling audio_update_volume makes sure that the music stream is properly set to be restored to
+ // its previous value
+ audio_update_volume(false);
+
+ if (gAudiop && local && mWasPlaying)
{
LLParcel* parcel = LLViewerParcelMgr::getInstance()->getAgentParcel();
if (parcel)
{
mNextStreamURI = parcel->getMusicURL();
+ llinfos << "Intraparcel teleport -- setting music stream to " << mNextStreamURI << llendl;
}
}
+ mWasPlaying = false;
}
void init_audio()
@@ -360,15 +405,9 @@ void audio_update_volume(bool force_update)
// Streaming Music
if (gAudiop)
{
- if (progress_view_visible && !LLViewerAudio::getInstance()->getForcedTeleportFade())
- {
- LLViewerAudio::getInstance()->setForcedTeleportFade(true);
- LLViewerAudio::getInstance()->startInternetStreamWithAutoFade(LLStringUtil::null);
- LLViewerAudio::getInstance()->setNextStreamURI(LLStringUtil::null);
- }
-
- if (!progress_view_visible && LLViewerAudio::getInstance()->getForcedTeleportFade() == true)
+ if (!progress_view_visible && LLViewerAudio::getInstance()->getForcedTeleportFade())
{
+ LLViewerAudio::getInstance()->setWasPlaying(!gAudiop->getInternetStreamURL().empty());
LLViewerAudio::getInstance()->setForcedTeleportFade(false);
}
diff --git a/indra/newview/llvieweraudio.h b/indra/newview/llvieweraudio.h
index a3da9fc6b8..8c302c6549 100644
--- a/indra/newview/llvieweraudio.h
+++ b/indra/newview/llvieweraudio.h
@@ -66,6 +66,7 @@ public:
bool getForcedTeleportFade() { return mForcedTeleportFade; };
void setForcedTeleportFade(bool fade) { mForcedTeleportFade = fade;} ;
void setNextStreamURI(std::string stream) { mNextStreamURI = stream; } ;
+ void setWasPlaying(bool playing) { mWasPlaying = playing;} ;
private:
@@ -76,13 +77,17 @@ private:
LLFrameTimer stream_fade_timer;
bool mIdleListnerActive;
bool mForcedTeleportFade;
+ bool mWasPlaying;
boost::signals2::connection mTeleportFailedConnection;
+ boost::signals2::connection mTeleportFinishedConnection;
+ boost::signals2::connection mTeleportStartedConnection;
void registerIdleListener();
void deregisterIdleListener() { mIdleListnerActive = false; };
void startFading();
void onTeleportFailed();
-
+ void onTeleportFinished(const LLVector3d& pos, const bool& local);
+ void onTeleportStarted();
};
#endif //LL_VIEWER_H
diff --git a/indra/newview/llviewercamera.h b/indra/newview/llviewercamera.h
index 184033de42..b857c7fe89 100644
--- a/indra/newview/llviewercamera.h
+++ b/indra/newview/llviewercamera.h
@@ -51,9 +51,19 @@ const BOOL NOT_FOR_SELECTION = FALSE;
extern template class LLViewerCamera* LLSingleton<class LLViewerCamera>::getInstance();
#endif
+LL_ALIGN_PREFIX(16)
class LLViewerCamera : public LLCamera, public LLSingleton<LLViewerCamera>
{
public:
+ void* operator new(size_t size)
+ {
+ return ll_aligned_malloc_16(size);
+ }
+
+ void operator delete(void* ptr)
+ {
+ ll_aligned_free_16(ptr);
+ }
typedef enum
{
@@ -137,6 +147,7 @@ protected:
S16 mZoomSubregion;
public:
-};
+} LL_ALIGN_POSTFIX(16);
+
#endif // LL_LLVIEWERCAMERA_H
diff --git a/indra/newview/llviewercontrol.cpp b/indra/newview/llviewercontrol.cpp
index f2712e7590..dec1615246 100644
--- a/indra/newview/llviewercontrol.cpp
+++ b/indra/newview/llviewercontrol.cpp
@@ -71,8 +71,12 @@
#include "llpaneloutfitsinventory.h"
#include "llpanellogin.h"
#include "llpaneltopinfobar.h"
+#include "llspellcheck.h"
#include "llupdaterservice.h"
+// Third party library includes
+#include <boost/algorithm/string.hpp>
+
#ifdef TOGGLE_HACKED_GODLIKE_VIEWER
BOOL gHackGodmode = FALSE;
#endif
@@ -325,7 +329,7 @@ static bool handleJoystickChanged(const LLSD& newvalue)
static bool handleUseOcclusionChanged(const LLSD& newvalue)
{
- LLPipeline::sUseOcclusion = (newvalue.asBoolean() && gGLManager.mHasOcclusionQuery
+ LLPipeline::sUseOcclusion = (newvalue.asBoolean() && gGLManager.mHasOcclusionQuery && LLGLSLShader::sNoFixedFunction
&& LLFeatureManager::getInstance()->isFeatureAvailable("UseOcclusion") && !gUseWireframe) ? 2 : 0;
return true;
}
@@ -337,15 +341,6 @@ static bool handleUploadBakedTexOldChanged(const LLSD& newvalue)
}
-static bool handleNumpadControlChanged(const LLSD& newvalue)
-{
- if (gKeyboard)
- {
- gKeyboard->setNumpadDistinct(static_cast<LLKeyboard::e_numpad_distinct>(newvalue.asInteger()));
- }
- return true;
-}
-
static bool handleWLSkyDetailChanged(const LLSD&)
{
if (gSky.mVOWLSkyp.notNull())
@@ -501,6 +496,25 @@ bool handleForceShowGrid(const LLSD& newvalue)
return true;
}
+bool handleSpellCheckChanged()
+{
+ if (gSavedSettings.getBOOL("SpellCheck"))
+ {
+ std::list<std::string> dict_list;
+ std::string dict_setting = gSavedSettings.getString("SpellCheckDictionary");
+ boost::split(dict_list, dict_setting, boost::is_any_of(std::string(",")));
+ if (!dict_list.empty())
+ {
+ LLSpellChecker::setUseSpellCheck(dict_list.front());
+ dict_list.pop_front();
+ LLSpellChecker::instance().setSecondaryDictionaries(dict_list);
+ return true;
+ }
+ }
+ LLSpellChecker::setUseSpellCheck(LLStringUtil::null);
+ return true;
+}
+
bool toggle_agent_pause(const LLSD& newvalue)
{
if ( newvalue.asBoolean() )
@@ -637,7 +651,6 @@ void settings_setup_listeners()
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));
gSavedSettings.getControl("JoystickAxis1")->getSignal()->connect(boost::bind(&handleJoystickChanged, _2));
gSavedSettings.getControl("JoystickAxis2")->getSignal()->connect(boost::bind(&handleJoystickChanged, _2));
@@ -706,6 +719,8 @@ void settings_setup_listeners()
gSavedSettings.getControl("UpdaterServiceSetting")->getSignal()->connect(boost::bind(&toggle_updater_service_active, _2));
gSavedSettings.getControl("ForceShowGrid")->getSignal()->connect(boost::bind(&handleForceShowGrid, _2));
gSavedSettings.getControl("RenderTransparentWater")->getSignal()->connect(boost::bind(&handleRenderTransparentWaterChanged, _2));
+ gSavedSettings.getControl("SpellCheck")->getSignal()->connect(boost::bind(&handleSpellCheckChanged));
+ gSavedSettings.getControl("SpellCheckDictionary")->getSignal()->connect(boost::bind(&handleSpellCheckChanged));
}
#if TEST_CACHED_CONTROL
diff --git a/indra/newview/llviewerdisplay.cpp b/indra/newview/llviewerdisplay.cpp
index 0adb187dd2..d58ee05fb6 100644
--- a/indra/newview/llviewerdisplay.cpp
+++ b/indra/newview/llviewerdisplay.cpp
@@ -79,6 +79,7 @@
#include "llpostprocess.h"
extern LLPointer<LLViewerTexture> gStartTexture;
+extern bool gShiftFrame;
LLPointer<LLViewerTexture> gDisconnectedImagep = NULL;
@@ -162,8 +163,11 @@ void display_startup()
glClear(GL_DEPTH_BUFFER_BIT);
}
+static LLFastTimer::DeclareTimer FTM_UPDATE_CAMERA("Update Camera");
+
void display_update_camera()
{
+ LLFastTimer t(FTM_UPDATE_CAMERA);
LLMemType mt_uc(LLMemType::MTYPE_DISPLAY_UPDATE_CAMERA);
// TODO: cut draw distance down if customizing avatar?
// TODO: cut draw distance on per-parcel basis?
@@ -217,6 +221,11 @@ static LLFastTimer::DeclareTimer FTM_IMAGE_UPDATE_CLASS("Class");
static LLFastTimer::DeclareTimer FTM_IMAGE_UPDATE_BUMP("Bump");
static LLFastTimer::DeclareTimer FTM_IMAGE_UPDATE_LIST("List");
static LLFastTimer::DeclareTimer FTM_IMAGE_UPDATE_DELETE("Delete");
+static LLFastTimer::DeclareTimer FTM_RESIZE_WINDOW("Resize Window");
+static LLFastTimer::DeclareTimer FTM_HUD_UPDATE("HUD Update");
+static LLFastTimer::DeclareTimer FTM_DISPLAY_UPDATE_GEOM("Update Geom");
+static LLFastTimer::DeclareTimer FTM_TEXTURE_UNBIND("Texture Unbind");
+static LLFastTimer::DeclareTimer FTM_TELEPORT_DISPLAY("Teleport Display");
// Paint the display!
void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)
@@ -226,6 +235,7 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)
if (gWindowResized)
{ //skip render on frames where window has been resized
+ LLFastTimer t(FTM_RESIZE_WINDOW);
gGL.flush();
glClear(GL_COLOR_BUFFER_BIT);
gViewerWindow->getWindow()->swapBuffers();
@@ -362,6 +372,7 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)
if (gTeleportDisplay)
{
+ LLFastTimer t(FTM_TELEPORT_DISPLAY);
LLAppViewer::instance()->pingMainloopTimeout("Display:Teleport");
const F32 TELEPORT_ARRIVAL_DELAY = 2.f; // Time to preload the world before raising the curtain after we've actually already arrived.
@@ -383,15 +394,24 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)
const std::string& message = gAgent.getTeleportMessage();
switch( gAgent.getTeleportState() )
{
+ case LLAgent::TELEPORT_PENDING:
+ gTeleportDisplayTimer.reset();
+ gViewerWindow->setShowProgress(TRUE);
+ gViewerWindow->setProgressPercent(llmin(teleport_percent, 0.0f));
+ gAgent.setTeleportMessage(LLAgent::sTeleportProgressMessages["pending"]);
+ gViewerWindow->setProgressString(LLAgent::sTeleportProgressMessages["pending"]);
+ break;
+
case LLAgent::TELEPORT_START:
// Transition to REQUESTED. Viewer has sent some kind
// of TeleportRequest to the source simulator
gTeleportDisplayTimer.reset();
gViewerWindow->setShowProgress(TRUE);
- gViewerWindow->setProgressPercent(0);
+ gViewerWindow->setProgressPercent(llmin(teleport_percent, 0.0f));
gAgent.setTeleportState( LLAgent::TELEPORT_REQUESTED );
gAgent.setTeleportMessage(
LLAgent::sTeleportProgressMessages["requesting"]);
+ gViewerWindow->setProgressString(LLAgent::sTeleportProgressMessages["requesting"]);
break;
case LLAgent::TELEPORT_REQUESTED:
@@ -416,6 +436,7 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)
LLAgent::sTeleportProgressMessages["arriving"]);
gTextureList.mForceResetTextureStats = TRUE;
gAgentCamera.resetView(TRUE, TRUE);
+
break;
case LLAgent::TELEPORT_ARRIVING:
@@ -581,6 +602,7 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)
// *TODO: merge these two methods
{
+ LLFastTimer t(FTM_HUD_UPDATE);
LLMemType mt_uh(LLMemType::MTYPE_DISPLAY_UPDATE_HUD);
LLHUDManager::getInstance()->updateEffects();
LLHUDObject::updateAll();
@@ -588,6 +610,7 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)
}
{
+ LLFastTimer t(FTM_DISPLAY_UPDATE_GEOM);
LLMemType mt_ug(LLMemType::MTYPE_DISPLAY_UPDATE_GEOM);
const F32 max_geom_update_time = 0.005f*10.f*gFrameIntervalSeconds; // 50 ms/second update time
gPipeline.createObjects(max_geom_update_time);
@@ -597,6 +620,7 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)
}
gPipeline.updateGL();
+
stop_glerror();
S32 water_clip = 0;
@@ -622,11 +646,6 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)
LLSpatialGroup::sNoDelete = TRUE;
LLTexUnit::sWhiteTexture = LLViewerFetchedTexture::sWhiteImagep->getTexName();
- /*if (LLPipeline::sUseOcclusion && LLPipeline::sRenderDeferred)
- { //force occlusion on for all render types if doing deferred render (tighter shadow frustum)
- LLPipeline::sUseOcclusion = 3;
- }*/
-
S32 occlusion = LLPipeline::sUseOcclusion;
if (gDepthDirty)
{ //depth buffer is invalid, don't overwrite occlusion state
@@ -755,13 +774,13 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)
gTextureList.updateImages(max_image_decode_time);
}
- {
+ /*{
LLFastTimer t(FTM_IMAGE_UPDATE_DELETE);
//remove dead textures from GL
LLImageGL::deleteDeadTextures();
stop_glerror();
+ }*/
}
- }
LLGLState::checkStates();
LLGLState::checkClientArrays();
@@ -889,6 +908,28 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)
{
LLViewerCamera::sCurCameraID = LLViewerCamera::CAMERA_WORLD;
LLMemType mt_rg(LLMemType::MTYPE_DISPLAY_RENDER_GEOM);
+
+ if (gSavedSettings.getBOOL("RenderDepthPrePass") && LLGLSLShader::sNoFixedFunction)
+ {
+ gGL.setColorMask(false, false);
+
+ U32 types[] = {
+ LLRenderPass::PASS_SIMPLE,
+ LLRenderPass::PASS_FULLBRIGHT,
+ LLRenderPass::PASS_SHINY
+ };
+
+ U32 num_types = LL_ARRAY_SIZE(types);
+ gOcclusionProgram.bind();
+ for (U32 i = 0; i < num_types; i++)
+ {
+ gPipeline.renderObjects(types[i], LLVertexBuffer::MAP_VERTEX, FALSE);
+ }
+
+ gOcclusionProgram.unbind();
+ }
+
+
gGL.setColorMask(true, false);
if (LLPipeline::sRenderDeferred && !LLPipeline::sUnderWaterRender)
{
@@ -911,14 +952,18 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)
stop_glerror();
}
- for (U32 i = 0; i < gGLManager.mNumTextureImageUnits; i++)
- { //dummy cleanup of any currently bound textures
- if (gGL.getTexUnit(i)->getCurrType() != LLTexUnit::TT_NONE)
- {
- gGL.getTexUnit(i)->unbind(gGL.getTexUnit(i)->getCurrType());
- gGL.getTexUnit(i)->disable();
+ {
+ LLFastTimer t(FTM_TEXTURE_UNBIND);
+ for (U32 i = 0; i < gGLManager.mNumTextureImageUnits; i++)
+ { //dummy cleanup of any currently bound textures
+ if (gGL.getTexUnit(i)->getCurrType() != LLTexUnit::TT_NONE)
+ {
+ gGL.getTexUnit(i)->unbind(gGL.getTexUnit(i)->getCurrType());
+ gGL.getTexUnit(i)->disable();
+ }
}
}
+
LLAppViewer::instance()->pingMainloopTimeout("Display:RenderFlush");
if (to_texture)
@@ -984,6 +1029,8 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)
display_stats();
LLAppViewer::instance()->pingMainloopTimeout("Display:Done");
+
+ gShiftFrame = false;
}
void render_hud_attachments()
diff --git a/indra/newview/llviewerfloaterreg.cpp b/indra/newview/llviewerfloaterreg.cpp
index d0e0d0d826..1f7cf0cdd4 100644
--- a/indra/newview/llviewerfloaterreg.cpp
+++ b/indra/newview/llviewerfloaterreg.cpp
@@ -30,7 +30,7 @@
#include "llfloaterreg.h"
#include "llviewerfloaterreg.h"
-
+#include "llfloaterautoreplacesettings.h"
#include "llcompilequeue.h"
#include "llcallfloater.h"
#include "llfasttimerview.h"
@@ -78,12 +78,14 @@
#include "llfloaterlandholdings.h"
#include "llfloatermap.h"
#include "llfloatermemleak.h"
-#include "llfloatermodelwizard.h"
#include "llfloaternamedesc.h"
#include "llfloaternotificationsconsole.h"
#include "llfloaterobjectweights.h"
#include "llfloateropenobject.h"
#include "llfloateroutbox.h"
+#include "llfloaterpathfindingcharacters.h"
+#include "llfloaterpathfindinglinksets.h"
+#include "llfloaterpathfindingconsole.h"
#include "llfloaterpay.h"
#include "llfloaterperms.h"
#include "llfloaterpostprocess.h"
@@ -100,6 +102,7 @@
#include "llfloatersidepanelcontainer.h"
#include "llfloatersnapshot.h"
#include "llfloatersounddevices.h"
+#include "llfloaterspellchecksettings.h"
#include "llfloatertelehub.h"
#include "llfloatertestinspectors.h"
#include "llfloatertestlistview.h"
@@ -249,12 +252,18 @@ void LLViewerFloaterReg::registerFloaters()
LLFloaterReg::add("outgoing_call", "floater_outgoing_call.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLOutgoingCallDialog>);
LLFloaterPayUtil::registerFloater();
+ LLFloaterReg::add("pathfinding_characters", "floater_pathfinding_characters.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterPathfindingCharacters>);
+ LLFloaterReg::add("pathfinding_linksets", "floater_pathfinding_linksets.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterPathfindingLinksets>);
+ LLFloaterReg::add("pathfinding_console", "floater_pathfinding_console.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterPathfindingConsole>);
LLFloaterReg::add("people", "floater_people.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterSidePanelContainer>);
LLFloaterReg::add("places", "floater_places.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterSidePanelContainer>);
LLFloaterReg::add("preferences", "floater_preferences.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterPreference>);
LLFloaterReg::add("prefs_proxy", "floater_preferences_proxy.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterPreferenceProxy>);
LLFloaterReg::add("prefs_hardware_settings", "floater_hardware_settings.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterHardwareSettings>);
+ LLFloaterReg::add("prefs_spellchecker_import", "floater_spellcheck_import.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterSpellCheckerImport>);
LLFloaterReg::add("prefs_translation", "floater_translation_settings.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterTranslationSettings>);
+ LLFloaterReg::add("prefs_spellchecker", "floater_spellcheck.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterSpellCheckerSettings>);
+ LLFloaterReg::add("prefs_autoreplace", "floater_autoreplace.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterAutoReplaceSettings>);
LLFloaterReg::add("perm_prefs", "floater_perm_prefs.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterPerms>);
LLFloaterReg::add("picks", "floater_picks.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterSidePanelContainer>);
LLFloaterReg::add("pref_joystick", "floater_joystick.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterJoystick>);
@@ -304,7 +313,6 @@ void LLViewerFloaterReg::registerFloaters()
LLFloaterReg::add("upload_anim_anim", "floater_animation_anim_preview.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterAnimPreview>, "upload");
LLFloaterReg::add("upload_image", "floater_image_preview.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterImagePreview>, "upload");
LLFloaterReg::add("upload_model", "floater_model_preview.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterModelPreview>, "upload");
- LLFloaterReg::add("upload_model_wizard", "floater_model_wizard.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterModelWizard>);
LLFloaterReg::add("upload_script", "floater_script_preview.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterScriptPreview>, "upload");
LLFloaterReg::add("upload_sound", "floater_sound_preview.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterSoundPreview>, "upload");
diff --git a/indra/newview/llviewerinventory.cpp b/indra/newview/llviewerinventory.cpp
index b47a41c44c..b47a41c44c 100644..100755
--- a/indra/newview/llviewerinventory.cpp
+++ b/indra/newview/llviewerinventory.cpp
diff --git a/indra/newview/llviewerjointattachment.cpp b/indra/newview/llviewerjointattachment.cpp
index 4e14824e69..3a04bbed4f 100644
--- a/indra/newview/llviewerjointattachment.cpp
+++ b/indra/newview/llviewerjointattachment.cpp
@@ -127,7 +127,11 @@ void LLViewerJointAttachment::setupDrawable(LLViewerObject *object)
{
for (S32 face_num = 0; face_num < object->mDrawable->getNumFaces(); face_num++)
{
- object->mDrawable->getFace(face_num)->setState(LLFace::HUD_RENDER);
+ LLFace *face = object->mDrawable->getFace(face_num);
+ if (face)
+ {
+ face->setState(LLFace::HUD_RENDER);
+ }
}
}
@@ -146,7 +150,11 @@ void LLViewerJointAttachment::setupDrawable(LLViewerObject *object)
{
for (S32 face_num = 0; face_num < childp->mDrawable->getNumFaces(); face_num++)
{
- childp->mDrawable->getFace(face_num)->setState(LLFace::HUD_RENDER);
+ LLFace * face = childp->mDrawable->getFace(face_num);
+ if (face)
+ {
+ face->setState(LLFace::HUD_RENDER);
+ }
}
}
}
@@ -254,7 +262,11 @@ void LLViewerJointAttachment::removeObject(LLViewerObject *object)
{
for (S32 face_num = 0; face_num < object->mDrawable->getNumFaces(); face_num++)
{
- object->mDrawable->getFace(face_num)->clearState(LLFace::HUD_RENDER);
+ LLFace * face = object->mDrawable->getFace(face_num);
+ if (face)
+ {
+ face->clearState(LLFace::HUD_RENDER);
+ }
}
}
}
@@ -272,7 +284,11 @@ void LLViewerJointAttachment::removeObject(LLViewerObject *object)
{
for (S32 face_num = 0; face_num < childp->mDrawable->getNumFaces(); face_num++)
{
- childp->mDrawable->getFace(face_num)->clearState(LLFace::HUD_RENDER);
+ LLFace * face = childp->mDrawable->getFace(face_num);
+ if (face)
+ {
+ face->clearState(LLFace::HUD_RENDER);
+ }
}
}
}
diff --git a/indra/newview/llviewerjointmesh.cpp b/indra/newview/llviewerjointmesh.cpp
index f029ae5302..5d1aa870a3 100644..100755
--- a/indra/newview/llviewerjointmesh.cpp
+++ b/indra/newview/llviewerjointmesh.cpp
@@ -729,8 +729,10 @@ void LLViewerJointMesh::updateFaceData(LLFace *face, F32 pixel_area, BOOL damp_w
F32* vw = (F32*) vertex_weightsp.get();
F32* cw = (F32*) clothing_weightsp.get();
- LLVector4a::memcpyNonAliased16(tc, (F32*) mMesh->getTexCoords(), num_verts*2*sizeof(F32));
- LLVector4a::memcpyNonAliased16(vw, (F32*) mMesh->getWeights(), num_verts*sizeof(F32));
+ S32 tc_size = (num_verts*2*sizeof(F32)+0xF) & ~0xF;
+ LLVector4a::memcpyNonAliased16(tc, (F32*) mMesh->getTexCoords(), tc_size);
+ S32 vw_size = (num_verts*sizeof(F32)+0xF) & ~0xF;
+ LLVector4a::memcpyNonAliased16(vw, (F32*) mMesh->getWeights(), vw_size);
LLVector4a::memcpyNonAliased16(cw, (F32*) mMesh->getClothingWeights(), num_verts*4*sizeof(F32));
}
diff --git a/indra/newview/llviewerjointmesh.h b/indra/newview/llviewerjointmesh.h
index dd5dae1dc1..dd5dae1dc1 100644..100755
--- a/indra/newview/llviewerjointmesh.h
+++ b/indra/newview/llviewerjointmesh.h
diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp
index 34e916fec0..01a54509ef 100644
--- a/indra/newview/llviewermenu.cpp
+++ b/indra/newview/llviewermenu.cpp
@@ -60,6 +60,8 @@
#include "llfloatergodtools.h"
#include "llfloaterinventory.h"
#include "llfloaterland.h"
+#include "llfloaterpathfindingcharacters.h"
+#include "llfloaterpathfindinglinksets.h"
#include "llfloaterpay.h"
#include "llfloaterreporter.h"
#include "llfloatersearch.h"
@@ -86,6 +88,7 @@
#include "llrootview.h"
#include "llsceneview.h"
#include "llselectmgr.h"
+#include "llspellcheckmenuhandler.h"
#include "llstatusbar.h"
#include "lltextureview.h"
#include "lltoolcomp.h"
@@ -116,6 +119,7 @@
#include "lleconomy.h"
#include "lltoolgrab.h"
#include "llwindow.h"
+#include "llpathfindingmanager.h"
#include "boost/unordered_map.hpp"
using namespace LLVOAvatarDefines;
@@ -203,7 +207,6 @@ void near_sit_object();
BOOL is_selection_buy_not_take();
S32 selection_price();
BOOL enable_take();
-void handle_take();
void handle_object_show_inspector();
void handle_avatar_show_inspector();
bool confirm_take(const LLSD& notification, const LLSD& response, LLObjectSelectionHandle selection_handle);
@@ -300,7 +303,6 @@ BOOL enable_buy_land(void*);
void handle_test_male(void *);
void handle_test_female(void *);
-void handle_toggle_pg(void*);
void handle_dump_attachments(void *);
void handle_dump_avatar_local_textures(void*);
void handle_debug_avatar_textures(void*);
@@ -1643,23 +1645,6 @@ class LLAdvancedTestFemale : public view_listener_t
}
};
-
-
-///////////////
-// TOGGLE PG //
-///////////////
-
-
-class LLAdvancedTogglePG : public view_listener_t
-{
- bool handleEvent(const LLSD& userdata)
- {
- handle_toggle_pg(NULL);
- return true;
- }
-};
-
-
class LLAdvancedForceParamsToDefault : public view_listener_t
{
bool handleEvent(const LLSD& userdata)
@@ -2039,7 +2024,6 @@ class LLAdvancedCompressImage : public view_listener_t
};
-
/////////////////////////
// SHOW DEBUG SETTINGS //
/////////////////////////
@@ -2800,6 +2784,16 @@ bool enable_object_build()
return !enable_object_edit();
}
+bool enable_object_select_in_pathfinding_linksets()
+{
+ return LLPathfindingManager::getInstance()->isPathfindingEnabledForCurrentRegion() && LLSelectMgr::getInstance()->selectGetEditableLinksets();
+}
+
+bool enable_object_select_in_pathfinding_characters()
+{
+ return LLPathfindingManager::getInstance()->isPathfindingEnabledForCurrentRegion() && LLSelectMgr::getInstance()->selectGetViewableCharacters();
+}
+
class LLSelfRemoveAllAttachments : public view_listener_t
{
bool handleEvent(const LLSD& userdata)
@@ -3321,7 +3315,7 @@ void append_aggregate(std::string& string, const LLAggregatePermissions& ag_perm
bool enable_buy_object()
{
// In order to buy, there must only be 1 purchaseable object in
- // the selection manger.
+ // the selection manager.
if(LLSelectMgr::getInstance()->getSelection()->getRootObjectCount() != 1) return false;
LLViewerObject* obj = NULL;
LLSelectNode* node = LLSelectMgr::getInstance()->getSelection()->getFirstRootNode();
@@ -4199,8 +4193,9 @@ static bool get_derezzable_objects(
{
case DRD_TAKE_INTO_AGENT_INVENTORY:
case DRD_TRASH:
- if( (node->mPermissions->allowTransferTo(gAgent.getID()) && object->permModify())
- || (node->allowOperationOnNode(PERM_OWNER, GP_OBJECT_MANIPULATE)) )
+ if (!object->isPermanentEnforced() &&
+ ((node->mPermissions->allowTransferTo(gAgent.getID()) && object->permModify())
+ || (node->allowOperationOnNode(PERM_OWNER, GP_OBJECT_MANIPULATE))))
{
can_derez_current = TRUE;
}
@@ -4610,9 +4605,10 @@ BOOL enable_take()
return TRUE;
}
# endif
- if((node->mPermissions->allowTransferTo(gAgent.getID())
+ if(!object->isPermanentEnforced() &&
+ ((node->mPermissions->allowTransferTo(gAgent.getID())
&& object->permModify())
- || (node->mPermissions->getOwner() == gAgent.getID()))
+ || (node->mPermissions->getOwner() == gAgent.getID())))
{
return TRUE;
}
@@ -4864,6 +4860,22 @@ class LLToolsSaveToObjectInventory : public view_listener_t
}
};
+class LLToolsEnablePathfinding : public view_listener_t
+{
+ bool handleEvent(const LLSD& userdata)
+ {
+ return (LLPathfindingManager::getInstance() != NULL) && LLPathfindingManager::getInstance()->isPathfindingEnabledForCurrentRegion();
+ }
+};
+
+class LLToolsEnablePathfindingView : public view_listener_t
+{
+ bool handleEvent(const LLSD& userdata)
+ {
+ return (LLPathfindingManager::getInstance() != NULL) && LLPathfindingManager::getInstance()->isPathfindingEnabledForCurrentRegion() && LLPathfindingManager::getInstance()->isPathfindingViewEnabled();
+ }
+};
+
// Round the position of all root objects to the grid
class LLToolsSnapObjectXY : public view_listener_t
{
@@ -5122,6 +5134,84 @@ class LLEditDelete : public view_listener_t
}
};
+bool enable_object_return()
+{
+ return (!LLSelectMgr::getInstance()->getSelection()->isEmpty() &&
+ (gAgent.isGodlike() || can_derez(DRD_RETURN_TO_OWNER)));
+}
+
+void handle_spellcheck_replace_with_suggestion(const LLUICtrl* ctrl, const LLSD& param)
+{
+ const LLContextMenu* menu = dynamic_cast<const LLContextMenu*>(ctrl->getParent());
+ LLSpellCheckMenuHandler* spellcheck_handler = (menu) ? dynamic_cast<LLSpellCheckMenuHandler*>(menu->getSpawningView()) : NULL;
+ if ( (!spellcheck_handler) || (!spellcheck_handler->getSpellCheck()) )
+ {
+ return;
+ }
+
+ U32 index = 0;
+ if ( (!LLStringUtil::convertToU32(param.asString(), index)) || (index >= spellcheck_handler->getSuggestionCount()) )
+ {
+ return;
+ }
+
+ spellcheck_handler->replaceWithSuggestion(index);
+}
+
+bool visible_spellcheck_suggestion(LLUICtrl* ctrl, const LLSD& param)
+{
+ LLMenuItemGL* item = dynamic_cast<LLMenuItemGL*>(ctrl);
+ const LLContextMenu* menu = (item) ? dynamic_cast<const LLContextMenu*>(item->getParent()) : NULL;
+ const LLSpellCheckMenuHandler* spellcheck_handler = (menu) ? dynamic_cast<const LLSpellCheckMenuHandler*>(menu->getSpawningView()) : NULL;
+ if ( (!spellcheck_handler) || (!spellcheck_handler->getSpellCheck()) )
+ {
+ return false;
+ }
+
+ U32 index = 0;
+ if ( (!LLStringUtil::convertToU32(param.asString(), index)) || (index >= spellcheck_handler->getSuggestionCount()) )
+ {
+ return false;
+ }
+
+ item->setLabel(spellcheck_handler->getSuggestion(index));
+ return true;
+}
+
+void handle_spellcheck_add_to_dictionary(const LLUICtrl* ctrl)
+{
+ const LLContextMenu* menu = dynamic_cast<const LLContextMenu*>(ctrl->getParent());
+ LLSpellCheckMenuHandler* spellcheck_handler = (menu) ? dynamic_cast<LLSpellCheckMenuHandler*>(menu->getSpawningView()) : NULL;
+ if ( (spellcheck_handler) && (spellcheck_handler->canAddToDictionary()) )
+ {
+ spellcheck_handler->addToDictionary();
+ }
+}
+
+bool enable_spellcheck_add_to_dictionary(const LLUICtrl* ctrl)
+{
+ const LLContextMenu* menu = dynamic_cast<const LLContextMenu*>(ctrl->getParent());
+ const LLSpellCheckMenuHandler* spellcheck_handler = (menu) ? dynamic_cast<const LLSpellCheckMenuHandler*>(menu->getSpawningView()) : NULL;
+ return (spellcheck_handler) && (spellcheck_handler->canAddToDictionary());
+}
+
+void handle_spellcheck_add_to_ignore(const LLUICtrl* ctrl)
+{
+ const LLContextMenu* menu = dynamic_cast<const LLContextMenu*>(ctrl->getParent());
+ LLSpellCheckMenuHandler* spellcheck_handler = (menu) ? dynamic_cast<LLSpellCheckMenuHandler*>(menu->getSpawningView()) : NULL;
+ if ( (spellcheck_handler) && (spellcheck_handler->canAddToIgnore()) )
+ {
+ spellcheck_handler->addToIgnore();
+ }
+}
+
+bool enable_spellcheck_add_to_ignore(const LLUICtrl* ctrl)
+{
+ const LLContextMenu* menu = dynamic_cast<const LLContextMenu*>(ctrl->getParent());
+ const LLSpellCheckMenuHandler* spellcheck_handler = (menu) ? dynamic_cast<const LLSpellCheckMenuHandler*>(menu->getSpawningView()) : NULL;
+ return (spellcheck_handler) && (spellcheck_handler->canAddToIgnore());
+}
+
bool enable_object_delete()
{
bool new_value =
@@ -5137,6 +5227,49 @@ bool enable_object_delete()
return new_value;
}
+class LLObjectsReturnPackage
+{
+public:
+ LLObjectsReturnPackage() : mObjectSelection(), mReturnableObjects(), mError(), mFirstRegion(NULL) {};
+ ~LLObjectsReturnPackage()
+ {
+ mObjectSelection.clear();
+ mReturnableObjects.clear();
+ mError.clear();
+ mFirstRegion = NULL;
+ };
+
+ LLObjectSelectionHandle mObjectSelection;
+ LLDynamicArray<LLViewerObjectPtr> mReturnableObjects;
+ std::string mError;
+ LLViewerRegion *mFirstRegion;
+};
+
+static void return_objects(LLObjectsReturnPackage *objectsReturnPackage, const LLSD& notification, const LLSD& response)
+{
+ if (LLNotificationsUtil::getSelectedOption(notification, response) == 0)
+ {
+ // Ignore category ID for this derez destination.
+ derez_objects(DRD_RETURN_TO_OWNER, LLUUID::null, objectsReturnPackage->mFirstRegion, objectsReturnPackage->mError, &objectsReturnPackage->mReturnableObjects);
+ }
+
+ delete objectsReturnPackage;
+}
+
+void handle_object_return()
+{
+ if (!LLSelectMgr::getInstance()->getSelection()->isEmpty())
+ {
+ LLObjectsReturnPackage *objectsReturnPackage = new LLObjectsReturnPackage();
+ objectsReturnPackage->mObjectSelection = LLSelectMgr::getInstance()->getEditSelection();
+
+ // Save selected objects, so that we still know what to return after the confirmation dialog resets selection.
+ get_derezzable_objects(DRD_RETURN_TO_OWNER, objectsReturnPackage->mError, objectsReturnPackage->mFirstRegion, &objectsReturnPackage->mReturnableObjects);
+
+ LLNotificationsUtil::add("ReturnToOwner", LLSD(), LLSD(), boost::bind(&return_objects, objectsReturnPackage, _1, _2));
+ }
+}
+
void handle_object_delete()
{
@@ -5367,6 +5500,14 @@ void toggle_debug_menus(void*)
// }
//
+class LLCommunicateBlockList : public view_listener_t
+{
+ bool handleEvent(const LLSD& userdata)
+ {
+ LLFloaterSidePanelContainer::showPanel("people", "panel_block_list_sidetray", LLSD());
+ return true;
+ }
+};
class LLWorldSetHomeLocation : public view_listener_t
{
@@ -6490,6 +6631,7 @@ BOOL object_selected_and_point_valid()
(selection->getFirstRootObject()->getPCode() == LL_PCODE_VOLUME) &&
selection->getFirstRootObject()->permYouOwner() &&
selection->getFirstRootObject()->flagObjectMove() &&
+ !selection->getFirstRootObject()->flagObjectPermanent() &&
!((LLViewerObject*)selection->getFirstRootObject()->getRoot())->isAvatar() &&
(selection->getFirstRootObject()->getNVPair("AssetContainer") == NULL);
}
@@ -6738,15 +6880,6 @@ void handle_test_female(void*)
//gGestureList.requestResetFromServer( FALSE );
}
-void handle_toggle_pg(void*)
-{
- gAgent.setTeen( !gAgent.isTeen() );
-
- LLFloaterWorldMap::reloadIcons(NULL);
-
- llinfos << "PG status set to " << (S32)gAgent.isTeen() << llendl;
-}
-
void handle_dump_attachments(void*)
{
if(!isAgentAvatarValid()) return;
@@ -7006,8 +7139,8 @@ BOOL enable_save_into_inventory(void*)
return TRUE;
}
}
-#endif
return FALSE;
+#endif
}
class LLToolsEnableSaveToInventory : public view_listener_t
@@ -8072,6 +8205,19 @@ void initialize_edit_menu()
}
+void initialize_spellcheck_menu()
+{
+ LLUICtrl::CommitCallbackRegistry::Registrar& commit = LLUICtrl::CommitCallbackRegistry::currentRegistrar();
+ LLUICtrl::EnableCallbackRegistry::Registrar& enable = LLUICtrl::EnableCallbackRegistry::currentRegistrar();
+
+ commit.add("SpellCheck.ReplaceWithSuggestion", boost::bind(&handle_spellcheck_replace_with_suggestion, _1, _2));
+ enable.add("SpellCheck.VisibleSuggestion", boost::bind(&visible_spellcheck_suggestion, _1, _2));
+ commit.add("SpellCheck.AddToDictionary", boost::bind(&handle_spellcheck_add_to_dictionary, _1));
+ enable.add("SpellCheck.EnableAddToDictionary", boost::bind(&enable_spellcheck_add_to_dictionary, _1));
+ commit.add("SpellCheck.AddToIgnore", boost::bind(&handle_spellcheck_add_to_ignore, _1));
+ enable.add("SpellCheck.EnableAddToIgnore", boost::bind(&enable_spellcheck_add_to_ignore, _1));
+}
+
void initialize_menus()
{
// A parameterized event handler used as ctrl-8/9/0 zoom controls below.
@@ -8153,6 +8299,9 @@ void initialize_menus()
// Me > Movement
view_listener_t::addMenu(new LLAdvancedAgentFlyingInfo(), "Agent.getFlying");
+ // Communicate
+ view_listener_t::addMenu(new LLCommunicateBlockList(), "Communicate.BlockList");
+
// World menu
view_listener_t::addMenu(new LLWorldAlwaysRun(), "World.AlwaysRun");
view_listener_t::addMenu(new LLWorldCreateLandmark(), "World.CreateLandmark");
@@ -8208,6 +8357,9 @@ void initialize_menus()
view_listener_t::addMenu(new LLToolsEnableSaveToInventory(), "Tools.EnableSaveToInventory");
view_listener_t::addMenu(new LLToolsEnableSaveToObjectInventory(), "Tools.EnableSaveToObjectInventory");
+ view_listener_t::addMenu(new LLToolsEnablePathfinding(), "Tools.EnablePathfinding");
+ view_listener_t::addMenu(new LLToolsEnablePathfindingView(), "Tools.EnablePathfindingView");
+
// Help menu
// most items use the ShowFloater method
view_listener_t::addMenu(new LLToggleHowTo(), "Help.ToggleHowTo");
@@ -8311,7 +8463,6 @@ void initialize_menus()
view_listener_t::addMenu(new LLAdvancedTestMale(), "Advanced.TestMale");
view_listener_t::addMenu(new LLAdvancedTestFemale(), "Advanced.TestFemale");
- view_listener_t::addMenu(new LLAdvancedTogglePG(), "Advanced.TogglePG");
// Advanced > Character (toplevel)
view_listener_t::addMenu(new LLAdvancedForceParamsToDefault(), "Advanced.ForceParamsToDefault");
@@ -8498,6 +8649,10 @@ void initialize_menus()
enable.add("EnablePayAvatar", boost::bind(&enable_pay_avatar));
enable.add("EnableEdit", boost::bind(&enable_object_edit));
enable.add("VisibleBuild", boost::bind(&enable_object_build));
+ commit.add("Pathfinding.Linksets.Select", boost::bind(&LLFloaterPathfindingLinksets::openLinksetsWithSelectedObjects));
+ enable.add("EnableSelectInPathfindingLinksets", boost::bind(&enable_object_select_in_pathfinding_linksets));
+ commit.add("Pathfinding.Characters.Select", boost::bind(&LLFloaterPathfindingCharacters::openCharactersWithSelectedObjects));
+ enable.add("EnableSelectInPathfindingCharacters", boost::bind(&enable_object_select_in_pathfinding_characters));
view_listener_t::addMenu(new LLFloaterVisible(), "FloaterVisible");
view_listener_t::addMenu(new LLShowSidetrayPanel(), "ShowSidetrayPanel");
diff --git a/indra/newview/llviewermenu.h b/indra/newview/llviewermenu.h
index 87cb4efbc4..3515aa4302 100644
--- a/indra/newview/llviewermenu.h
+++ b/indra/newview/llviewermenu.h
@@ -39,6 +39,7 @@ class LLObjectSelection;
class LLSelectNode;
void initialize_edit_menu();
+void initialize_spellcheck_menu();
void init_menus();
void cleanup_menus();
@@ -93,11 +94,20 @@ void handle_object_touch();
bool enable_object_open();
void handle_object_open();
+bool visible_take_object();
+bool tools_visible_take_object();
+bool enable_object_take_copy();
+bool enable_object_return();
+bool enable_object_delete();
+
// Buy either contents or object itself
void handle_buy();
+void handle_take();
void handle_take_copy();
void handle_look_at_selection(const LLSD& param);
void handle_zoom_to_object(LLUUID object_id);
+void handle_object_return();
+void handle_object_delete();
void handle_buy_land();
diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp
index a9bff67f40..903f4437a7 100755
--- a/indra/newview/llviewermessage.cpp
+++ b/indra/newview/llviewermessage.cpp
@@ -42,6 +42,7 @@
#include "llinventorydefines.h"
#include "lllslconstants.h"
#include "llregionhandle.h"
+#include "llsd.h"
#include "llsdserialize.h"
#include "llteleportflags.h"
#include "lltransactionflags.h"
@@ -107,6 +108,7 @@
#include "llagentui.h"
#include "llpanelblockedlist.h"
#include "llpanelplaceprofile.h"
+#include "llviewerregion.h"
#include <boost/algorithm/string/split.hpp> //
#include <boost/regex.hpp>
@@ -132,6 +134,7 @@ static const U32 LLREQUEST_PERMISSION_THROTTLE_LIMIT = 5; // requests
static const F32 LLREQUEST_PERMISSION_THROTTLE_INTERVAL = 10.0f; // seconds
extern BOOL gDebugClicks;
+extern bool gShiftFrame;
// function prototypes
bool check_offer_throttle(const std::string& from_name, bool check_only);
@@ -1992,6 +1995,46 @@ bool lure_callback(const LLSD& notification, const LLSD& response)
}
static LLNotificationFunctorRegistration lure_callback_reg("TeleportOffered", lure_callback);
+bool mature_lure_callback(const LLSD& notification, const LLSD& response)
+{
+ S32 option = 0;
+ if (response.isInteger())
+ {
+ option = response.asInteger();
+ }
+ else
+ {
+ option = LLNotificationsUtil::getSelectedOption(notification, response);
+ }
+
+ LLUUID from_id = notification["payload"]["from_id"].asUUID();
+ LLUUID lure_id = notification["payload"]["lure_id"].asUUID();
+ BOOL godlike = notification["payload"]["godlike"].asBoolean();
+ U8 region_access = static_cast<U8>(notification["payload"]["region_maturity"].asInteger());
+
+ switch(option)
+ {
+ case 0:
+ {
+ // accept
+ gSavedSettings.setU32("PreferredMaturity", static_cast<U32>(region_access));
+ gAgent.setMaturityRatingChangeDuringTeleport(region_access);
+ gAgent.teleportViaLure(lure_id, godlike);
+ }
+ break;
+ case 1:
+ default:
+ // decline
+ send_simple_im(from_id,
+ LLStringUtil::null,
+ IM_LURE_DECLINED,
+ lure_id);
+ break;
+ }
+ return false;
+}
+static LLNotificationFunctorRegistration mature_lure_callback_reg("TeleportOffered_MaturityExceeded", mature_lure_callback);
+
bool goto_url_callback(const LLSD& notification, const LLSD& response)
{
std::string url = notification["payload"]["url"].asString();
@@ -2770,7 +2813,11 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
chat.mSourceType = CHAT_SOURCE_OBJECT;
- if(SYSTEM_FROM == name)
+ // To conclude that the source type of message is CHAT_SOURCE_SYSTEM it's not
+ // enough to check only from name (i.e. fromName = "Second Life"). For example
+ // source type of messages from objects called "Second Life" should not be CHAT_SOURCE_SYSTEM.
+ bool chat_from_system = (SYSTEM_FROM == name) && region_id.isNull() && position.isNull();
+ if(chat_from_system)
{
// System's UUID is NULL (fixes EXT-4766)
chat.mFromID = LLUUID::null;
@@ -2795,7 +2842,7 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
// Note: lie to Nearby Chat, pretending that this is NOT an IM, because
// IMs from obejcts don't open IM sessions.
LLNearbyChat* nearby_chat = LLNearbyChat::getInstance();
- if(SYSTEM_FROM != name && nearby_chat)
+ if(!chat_from_system && nearby_chat)
{
chat.mOwnerID = from_id;
LLSD args;
@@ -2814,7 +2861,7 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
//Object IMs send with from name: 'Second Life' need to be displayed also in notification toasts (EXT-1590)
- if (SYSTEM_FROM != name) break;
+ if (!chat_from_system) break;
LLSD substitutions;
substitutions["NAME"] = name;
@@ -2879,15 +2926,54 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
{
LLVector3 pos, look_at;
U64 region_handle(0);
- U8 region_access(0);
+ U8 region_access(SIM_ACCESS_MIN);
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;
+ std::string region_access_lc = LLStringUtil::null;
+
+ bool canUserAccessDstRegion = true;
+ bool doesUserRequireMaturityIncrease = false;
if (parse_lure_bucket(region_info, region_handle, pos, look_at, region_access))
{
region_access_str = LLViewerRegion::accessToString(region_access);
region_access_icn = LLViewerRegion::getAccessIcon(region_access);
+ region_access_lc = region_access_str;
+ LLStringUtil::toLower(region_access_lc);
+
+ if (!gAgent.isGodlike())
+ {
+ switch (region_access)
+ {
+ case SIM_ACCESS_MIN :
+ case SIM_ACCESS_PG :
+ break;
+ case SIM_ACCESS_MATURE :
+ if (gAgent.isTeen())
+ {
+ canUserAccessDstRegion = false;
+ }
+ else if (gAgent.prefersPG())
+ {
+ doesUserRequireMaturityIncrease = true;
+ }
+ break;
+ case SIM_ACCESS_ADULT :
+ if (!gAgent.isAdult())
+ {
+ canUserAccessDstRegion = false;
+ }
+ else if (!gAgent.prefersAdult())
+ {
+ doesUserRequireMaturityIncrease = true;
+ }
+ break;
+ default :
+ llassert(0);
+ break;
+ }
+ }
}
LLSD args;
@@ -2896,28 +2982,130 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
args["MESSAGE"] = message;
args["MATURITY_STR"] = region_access_str;
args["MATURITY_ICON"] = region_access_icn;
+ args["REGION_CONTENT_MATURITY"] = region_access_lc;
LLSD payload;
payload["from_id"] = from_id;
payload["lure_id"] = session_id;
payload["godlike"] = FALSE;
+ payload["region_maturity"] = region_access;
+
+ if (!canUserAccessDstRegion)
+ {
+ LLNotification::Params params("TeleportOffered_MaturityBlocked");
+ params.substitutions = args;
+ params.payload = payload;
+ LLPostponedNotification::add<LLPostponedOfferNotification>( params, from_id, false);
+ send_simple_im(from_id, LLTrans::getString("TeleportMaturityExceeded"), IM_NOTHING_SPECIAL, session_id);
+ send_simple_im(from_id, LLStringUtil::null, IM_LURE_DECLINED, session_id);
+ }
+ else if (doesUserRequireMaturityIncrease)
+ {
+ LLNotification::Params params("TeleportOffered_MaturityExceeded");
+ params.substitutions = args;
+ params.payload = payload;
+ LLPostponedNotification::add<LLPostponedOfferNotification>( params, from_id, false);
+ }
+ else
+ {
+ LLNotification::Params params("TeleportOffered");
+ params.substitutions = args;
+ params.payload = payload;
+ LLPostponedNotification::add<LLPostponedOfferNotification>( params, from_id, false);
+ }
- LLNotification::Params params("TeleportOffered");
- params.substitutions = args;
- params.payload = payload;
- LLPostponedNotification::add<LLPostponedOfferNotification>( params, from_id, false);
}
}
break;
case IM_GODLIKE_LURE_USER:
{
+ LLVector3 pos, look_at;
+ U64 region_handle(0);
+ U8 region_access(SIM_ACCESS_MIN);
+ 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;
+ std::string region_access_lc = LLStringUtil::null;
+
+ bool canUserAccessDstRegion = true;
+ bool doesUserRequireMaturityIncrease = false;
+
+ if (parse_lure_bucket(region_info, region_handle, pos, look_at, region_access))
+ {
+ region_access_str = LLViewerRegion::accessToString(region_access);
+ region_access_icn = LLViewerRegion::getAccessIcon(region_access);
+ region_access_lc = region_access_str;
+ LLStringUtil::toLower(region_access_lc);
+
+ if (!gAgent.isGodlike())
+ {
+ switch (region_access)
+ {
+ case SIM_ACCESS_MIN :
+ case SIM_ACCESS_PG :
+ break;
+ case SIM_ACCESS_MATURE :
+ if (gAgent.isTeen())
+ {
+ canUserAccessDstRegion = false;
+ }
+ else if (gAgent.prefersPG())
+ {
+ doesUserRequireMaturityIncrease = true;
+ }
+ break;
+ case SIM_ACCESS_ADULT :
+ if (!gAgent.isAdult())
+ {
+ canUserAccessDstRegion = false;
+ }
+ else if (!gAgent.prefersAdult())
+ {
+ doesUserRequireMaturityIncrease = true;
+ }
+ break;
+ default :
+ llassert(0);
+ break;
+ }
+ }
+ }
+
+ LLSD args;
+ // *TODO: Translate -> [FIRST] [LAST] (maybe)
+ args["NAME_SLURL"] = LLSLURL("agent", from_id, "about").getSLURLString();
+ args["MESSAGE"] = message;
+ args["MATURITY_STR"] = region_access_str;
+ args["MATURITY_ICON"] = region_access_icn;
+ args["REGION_CONTENT_MATURITY"] = region_access_lc;
LLSD payload;
payload["from_id"] = from_id;
payload["lure_id"] = session_id;
payload["godlike"] = TRUE;
- // do not show a message box, because you're about to be
- // teleported.
- LLNotifications::instance().forceResponse(LLNotification::Params("TeleportOffered").payload(payload), 0);
+ payload["region_maturity"] = region_access;
+
+ if (!canUserAccessDstRegion)
+ {
+ LLNotification::Params params("TeleportOffered_MaturityBlocked");
+ params.substitutions = args;
+ params.payload = payload;
+ LLPostponedNotification::add<LLPostponedOfferNotification>( params, from_id, false);
+ send_simple_im(from_id, LLTrans::getString("TeleportMaturityExceeded"), IM_NOTHING_SPECIAL, session_id);
+ send_simple_im(from_id, LLStringUtil::null, IM_LURE_DECLINED, session_id);
+ }
+ else if (doesUserRequireMaturityIncrease)
+ {
+ LLNotification::Params params("TeleportOffered_MaturityExceeded");
+ params.substitutions = args;
+ params.payload = payload;
+ LLPostponedNotification::add<LLPostponedOfferNotification>( params, from_id, false);
+ }
+ else
+ {
+ // do not show a message box, because you're about to be
+ // teleported.
+ LLNotifications::instance().forceResponse(LLNotification::Params("TeleportOffered").payload(payload), 0);
+ }
}
break;
@@ -3441,6 +3629,9 @@ void process_teleport_start(LLMessageSystem *msg, void**)
LL_DEBUGS("Messaging") << "Got TeleportStart with TeleportFlags=" << teleport_flags << ". gTeleportDisplay: " << gTeleportDisplay << ", gAgent.mTeleportState: " << gAgent.getTeleportState() << LL_ENDL;
+ // *NOTE: The server sends two StartTeleport packets when you are teleporting to a LM
+ LLViewerMessage::getInstance()->mTeleportStartedSignal();
+
if (teleport_flags & TELEPORT_FLAGS_DISABLE_CANCEL)
{
gViewerWindow->setProgressCancelButtonVisible(FALSE);
@@ -3460,11 +3651,17 @@ void process_teleport_start(LLMessageSystem *msg, void**)
make_ui_sound("UISndTeleportOut");
LL_INFOS("Messaging") << "Teleport initiated by remote TeleportStart message with TeleportFlags: " << teleport_flags << LL_ENDL;
+
// Don't call LLFirstUse::useTeleport here because this could be
// due to being killed, which would send you home, not to a Telehub
}
}
+boost::signals2::connection LLViewerMessage::setTeleportStartedCallback(teleport_started_callback_t cb)
+{
+ return mTeleportStartedSignal.connect(cb);
+}
+
void process_teleport_progress(LLMessageSystem* msg, void**)
{
LLUUID agent_id;
@@ -3734,6 +3931,7 @@ void process_avatar_init_complete(LLMessageSystem* msg, void**)
void process_agent_movement_complete(LLMessageSystem* msg, void**)
{
+ gShiftFrame = true;
gAgentMovementCompleted = true;
LLUUID agent_id;
@@ -4064,6 +4262,8 @@ void send_agent_update(BOOL force_send, BOOL send_reliable)
head_rot_chg = dot(last_head_rot, head_rotation);
+ //static S32 msg_number = 0; // Used for diagnostic log messages
+
if (force_send ||
(cam_center_chg.magVec() > TRANSLATE_THRESHOLD) ||
(head_rot_chg < THRESHOLD_HEAD_ROT_QDOT) ||
@@ -4072,19 +4272,20 @@ void send_agent_update(BOOL force_send, BOOL send_reliable)
control_flag_change != 0 ||
flag_change != 0)
{
-/*
+ /* Diagnotics to show why we send the AgentUpdate message. Also un-commment the msg_number code above and below this block
+ msg_number += 1;
if (head_rot_chg < THRESHOLD_HEAD_ROT_QDOT)
{
- //LL_INFOS("Messaging") << "head rot " << head_rotation << LL_ENDL;
- LL_INFOS("Messaging") << "head_rot_chg = " << head_rot_chg << LL_ENDL;
+ //LL_INFOS("Messaging") << " head rot " << head_rotation << LL_ENDL;
+ LL_INFOS("Messaging") << "msg " << msg_number << ", frame " << LLFrameTimer::getFrameCount() << ", head_rot_chg " << head_rot_chg << LL_ENDL;
}
if (cam_rot_chg.magVec() > ROTATION_THRESHOLD)
{
- LL_INFOS("Messaging") << "cam rot " << cam_rot_chg.magVec() << LL_ENDL;
+ LL_INFOS("Messaging") << "msg " << msg_number << ", frame " << LLFrameTimer::getFrameCount() << ", cam rot " << cam_rot_chg.magVec() << LL_ENDL;
}
if (cam_center_chg.magVec() > TRANSLATE_THRESHOLD)
{
- LL_INFOS("Messaging") << "cam center " << cam_center_chg.magVec() << LL_ENDL;
+ LL_INFOS("Messaging") << "msg " << msg_number << ", frame " << LLFrameTimer::getFrameCount() << ", cam center " << cam_center_chg.magVec() << LL_ENDL;
}
// if (drag_delta_chg.magVec() > TRANSLATE_THRESHOLD)
// {
@@ -4092,9 +4293,9 @@ void send_agent_update(BOOL force_send, BOOL send_reliable)
// }
if (control_flag_change)
{
- LL_INFOS("Messaging") << "dcf = " << control_flag_change << LL_ENDL;
+ LL_INFOS("Messaging") << "msg " << msg_number << ", frame " << LLFrameTimer::getFrameCount() << ", dcf = " << control_flag_change << LL_ENDL;
}
-*/
+ */
duplicate_count = 0;
}
@@ -4129,6 +4330,26 @@ void send_agent_update(BOOL force_send, BOOL send_reliable)
if (duplicate_count < DUP_MSGS && !gDisconnected)
{
+ /* More diagnostics to count AgentUpdate messages
+ static S32 update_sec = 0;
+ static S32 update_count = 0;
+ static S32 max_update_count = 0;
+ S32 cur_sec = lltrunc( LLTimer::getTotalSeconds() );
+ update_count += 1;
+ if (cur_sec != update_sec)
+ {
+ if (update_sec != 0)
+ {
+ update_sec = cur_sec;
+ //msg_number = 0;
+ max_update_count = llmax(max_update_count, update_count);
+ llinfos << "Sent " << update_count << " AgentUpdate messages per second, max is " << max_update_count << llendl;
+ }
+ update_sec = cur_sec;
+ update_count = 0;
+ }
+ */
+
LLFastTimer t(FTM_AGENT_UPDATE_SEND);
// Build the message
msg->newMessageFast(_PREHASH_AgentUpdate);
@@ -4297,8 +4518,6 @@ void process_kill_object(LLMessageSystem *mesgsys, void **user_data)
LL_DEBUGS("Messaging") << "Kill message for local " << local_id << LL_ENDL;
}
- LLSelectMgr::getInstance()->removeObjectFromSelections(id);
-
// ...don't kill the avatar
if (!(id == gAgentID))
{
@@ -4321,6 +4540,12 @@ void process_kill_object(LLMessageSystem *mesgsys, void **user_data)
gObjectList.mNumUnknownKills++;
}
}
+
+ // We should remove the object from selection after it is marked dead by gObjectList to make LLToolGrab,
+ // which is using the object, release the mouse capture correctly when the object dies.
+ // See LLToolGrab::handleHoverActive() and LLToolGrab::handleHoverNonPhysical().
+ LLSelectMgr::getInstance()->removeObjectFromSelections(id);
+
}
}
@@ -4630,6 +4855,18 @@ void process_sim_stats(LLMessageSystem *msg, void **user_data)
case LL_SIM_STAT_IOPUMPTIME:
LLViewerStats::getInstance()->mSimPumpIOMsec.addValue(stat_value);
break;
+ case LL_SIM_STAT_PCTSCRIPTSRUN:
+ LLViewerStats::getInstance()->mSimPctScriptsRun.addValue(stat_value);
+ break;
+ case LL_SIM_STAT_SIMAISTEPTIMEMS:
+ LLViewerStats::getInstance()->mSimSimAIStepMsec.addValue(stat_value);
+ break;
+ case LL_SIM_STAT_SKIPPEDAISILSTEPS_PS:
+ LLViewerStats::getInstance()->mSimSimSkippedSilhouetteSteps.addValue(stat_value);
+ break;
+ case LL_SIM_STAT_PCTSTEPPEDCHARACTERS:
+ LLViewerStats::getInstance()->mSimSimPctSteppedCharacters.addValue(stat_value);
+ break;
default:
// Used to be a commented out warning.
LL_DEBUGS("Messaging") << "Unknown stat id" << stat_id << LL_ENDL;
@@ -4739,7 +4976,7 @@ void process_avatar_animation(LLMessageSystem *mesgsys, void **user_data)
LLViewerObject* object = gObjectList.findObject(object_id);
if (object)
{
- object->mFlags |= FLAGS_ANIM_SOURCE;
+ object->setFlagsWithoutUpdate(FLAGS_ANIM_SOURCE, TRUE);
BOOL anim_found = FALSE;
LLVOAvatar::AnimSourceIterator anim_it = avatarp->mAnimationSources.find(object_id);
@@ -4886,7 +5123,7 @@ void process_set_follow_cam_properties(LLMessageSystem *mesgsys, void **user_dat
LLViewerObject* objectp = gObjectList.findObject(source_id);
if (objectp)
{
- objectp->mFlags |= FLAGS_CAMERA_SOURCE;
+ objectp->setFlagsWithoutUpdate(FLAGS_CAMERA_SOURCE, TRUE);
}
S32 num_objects = mesgsys->getNumberOfBlocks("CameraProperty");
@@ -5389,23 +5626,35 @@ static void process_money_balance_reply_extended(LLMessageSystem* msg)
}
}
-
-
-bool handle_special_notification_callback(const LLSD& notification, const LLSD& response)
+bool handle_prompt_for_maturity_level_change_callback(const LLSD& notification, const LLSD& response)
{
S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
if (0 == option)
{
// set the preference to the maturity of the region we're calling
- int preferredMaturity = notification["payload"]["_region_access"].asInteger();
- gSavedSettings.setU32("PreferredMaturity", preferredMaturity);
- gAgent.sendMaturityPreferenceToServer(preferredMaturity);
+ U8 preferredMaturity = static_cast<U8>(notification["payload"]["_region_access"].asInteger());
+ gSavedSettings.setU32("PreferredMaturity", static_cast<U32>(preferredMaturity));
+ }
+
+ return false;
+}
- // notify user that the maturity preference has been changed
- LLSD args;
- args["RATING"] = LLViewerRegion::accessToString(preferredMaturity);
- LLNotificationsUtil::add("PreferredMaturityChanged", args);
+bool handle_prompt_for_maturity_level_change_and_reteleport_callback(const LLSD& notification, const LLSD& response)
+{
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
+
+ if (0 == option)
+ {
+ // set the preference to the maturity of the region we're calling
+ U8 preferredMaturity = static_cast<U8>(notification["payload"]["_region_access"].asInteger());
+ gSavedSettings.setU32("PreferredMaturity", static_cast<U32>(preferredMaturity));
+ gAgent.setMaturityRatingChangeDuringTeleport(preferredMaturity);
+ gAgent.restartFailedTeleportRequest();
+ }
+ else
+ {
+ gAgent.clearTeleportRequest();
}
return false;
@@ -5414,39 +5663,148 @@ bool handle_special_notification_callback(const LLSD& notification, const LLSD&
// some of the server notifications need special handling. This is where we do that.
bool handle_special_notification(std::string notificationID, LLSD& llsdBlock)
{
- int regionAccess = llsdBlock["_region_access"].asInteger();
- llsdBlock["REGIONMATURITY"] = LLViewerRegion::accessToString(regionAccess);
+ U8 regionAccess = static_cast<U8>(llsdBlock["_region_access"].asInteger());
+ std::string regionMaturity = LLViewerRegion::accessToString(regionAccess);
+ LLStringUtil::toLower(regionMaturity);
+ llsdBlock["REGIONMATURITY"] = regionMaturity;
- // we're going to throw the LLSD in there in case anyone ever wants to use it
- LLNotificationsUtil::add(notificationID+"_Notify", llsdBlock);
+ bool returnValue = false;
+ LLNotificationPtr maturityLevelNotification;
+ std::string notifySuffix = "_Notify";
+ if (regionAccess == SIM_ACCESS_MATURE)
+ {
+ if (gAgent.isTeen())
+ {
+ gAgent.clearTeleportRequest();
+ maturityLevelNotification = LLNotificationsUtil::add(notificationID+"_AdultsOnlyContent", llsdBlock);
+ returnValue = true;
+
+ notifySuffix = "_NotifyAdultsOnly";
+ }
+ else if (gAgent.prefersPG())
+ {
+ maturityLevelNotification = LLNotificationsUtil::add(notificationID+"_Change", llsdBlock, llsdBlock, handle_prompt_for_maturity_level_change_callback);
+ returnValue = true;
+ }
+ else if (LLStringUtil::compareStrings(notificationID, "RegionEntryAccessBlocked") == 0)
+ {
+ maturityLevelNotification = LLNotificationsUtil::add(notificationID+"_PreferencesOutOfSync", llsdBlock, llsdBlock);
+ returnValue = true;
+ }
+ }
+ else if (regionAccess == SIM_ACCESS_ADULT)
+ {
+ if (!gAgent.isAdult())
+ {
+ gAgent.clearTeleportRequest();
+ maturityLevelNotification = LLNotificationsUtil::add(notificationID+"_AdultsOnlyContent", llsdBlock);
+ returnValue = true;
+
+ notifySuffix = "_NotifyAdultsOnly";
+ }
+ else if (gAgent.prefersPG() || gAgent.prefersMature())
+ {
+ maturityLevelNotification = LLNotificationsUtil::add(notificationID+"_Change", llsdBlock, llsdBlock, handle_prompt_for_maturity_level_change_callback);
+ returnValue = true;
+ }
+ else if (LLStringUtil::compareStrings(notificationID, "RegionEntryAccessBlocked") == 0)
+ {
+ maturityLevelNotification = LLNotificationsUtil::add(notificationID+"_PreferencesOutOfSync", llsdBlock, llsdBlock);
+ returnValue = true;
+ }
+ }
+
+ if ((maturityLevelNotification == NULL) || maturityLevelNotification->isIgnored())
+ {
+ // Given a simple notification if no maturityLevelNotification is set or it is ignore
+ LLNotificationsUtil::add(notificationID + notifySuffix, llsdBlock);
+ }
+
+ return returnValue;
+}
+
+// some of the server notifications need special handling. This is where we do that.
+bool handle_teleport_access_blocked(LLSD& llsdBlock)
+{
+ std::string notificationID("TeleportEntryAccessBlocked");
+ U8 regionAccess = static_cast<U8>(llsdBlock["_region_access"].asInteger());
+ std::string regionMaturity = LLViewerRegion::accessToString(regionAccess);
+ LLStringUtil::toLower(regionMaturity);
+ llsdBlock["REGIONMATURITY"] = regionMaturity;
+ bool returnValue = false;
+ LLNotificationPtr maturityLevelNotification;
+ std::string notifySuffix = "_Notify";
if (regionAccess == SIM_ACCESS_MATURE)
{
if (gAgent.isTeen())
{
- LLNotificationsUtil::add(notificationID+"_KB", llsdBlock);
- return true;
+ gAgent.clearTeleportRequest();
+ maturityLevelNotification = LLNotificationsUtil::add(notificationID+"_AdultsOnlyContent", llsdBlock);
+ returnValue = true;
+
+ notifySuffix = "_NotifyAdultsOnly";
}
else if (gAgent.prefersPG())
{
- LLNotificationsUtil::add(notificationID+"_Change", llsdBlock, llsdBlock, handle_special_notification_callback);
- return true;
+ if (gAgent.hasRestartableFailedTeleportRequest())
+ {
+ maturityLevelNotification = LLNotificationsUtil::add(notificationID+"_ChangeAndReTeleport", llsdBlock, llsdBlock, handle_prompt_for_maturity_level_change_and_reteleport_callback);
+ returnValue = true;
+ }
+ else
+ {
+ gAgent.clearTeleportRequest();
+ maturityLevelNotification = LLNotificationsUtil::add(notificationID+"_Change", llsdBlock, llsdBlock, handle_prompt_for_maturity_level_change_callback);
+ returnValue = true;
+ }
+ }
+ else
+ {
+ gAgent.clearTeleportRequest();
+ maturityLevelNotification = LLNotificationsUtil::add(notificationID+"_PreferencesOutOfSync", llsdBlock, llsdBlock, handle_prompt_for_maturity_level_change_callback);
+ returnValue = true;
}
}
else if (regionAccess == SIM_ACCESS_ADULT)
{
if (!gAgent.isAdult())
{
- LLNotificationsUtil::add(notificationID+"_KB", llsdBlock);
- return true;
+ gAgent.clearTeleportRequest();
+ maturityLevelNotification = LLNotificationsUtil::add(notificationID+"_AdultsOnlyContent", llsdBlock);
+ returnValue = true;
+
+ notifySuffix = "_NotifyAdultsOnly";
}
else if (gAgent.prefersPG() || gAgent.prefersMature())
{
- LLNotificationsUtil::add(notificationID+"_Change", llsdBlock, llsdBlock, handle_special_notification_callback);
- return true;
+ if (gAgent.hasRestartableFailedTeleportRequest())
+ {
+ maturityLevelNotification = LLNotificationsUtil::add(notificationID+"_ChangeAndReTeleport", llsdBlock, llsdBlock, handle_prompt_for_maturity_level_change_and_reteleport_callback);
+ returnValue = true;
+ }
+ else
+ {
+ gAgent.clearTeleportRequest();
+ maturityLevelNotification = LLNotificationsUtil::add(notificationID+"_Change", llsdBlock, llsdBlock, handle_prompt_for_maturity_level_change_callback);
+ returnValue = true;
+ }
+ }
+ else
+ {
+ gAgent.clearTeleportRequest();
+ maturityLevelNotification = LLNotificationsUtil::add(notificationID+"_PreferencesOutOfSync", llsdBlock, llsdBlock, handle_prompt_for_maturity_level_change_callback);
+ returnValue = true;
}
}
- return false;
+
+ if ((maturityLevelNotification == NULL) || maturityLevelNotification->isIgnored())
+ {
+ // Given a simple notification if no maturityLevelNotification is set or it is ignore
+ LLNotificationsUtil::add(notificationID + notifySuffix, llsdBlock);
+ }
+
+ return returnValue;
}
bool attempt_standard_notification(LLMessageSystem* msgsystem)
@@ -5490,16 +5848,20 @@ bool attempt_standard_notification(LLMessageSystem* msgsystem)
RegionEntryAccessBlocked
RegionEntryAccessBlocked_Notify
+ RegionEntryAccessBlocked_NotifyAdultsOnly
RegionEntryAccessBlocked_Change
- RegionEntryAccessBlocked_KB
+ RegionEntryAccessBlocked_AdultsOnlyContent
+ RegionEntryAccessBlocked_ChangeAndReTeleport
LandClaimAccessBlocked
LandClaimAccessBlocked_Notify
+ LandClaimAccessBlocked_NotifyAdultsOnly
LandClaimAccessBlocked_Change
- LandClaimAccessBlocked_KB
+ LandClaimAccessBlocked_AdultsOnlyContent
LandBuyAccessBlocked
LandBuyAccessBlocked_Notify
+ LandBuyAccessBlocked_NotifyAdultsOnly
LandBuyAccessBlocked_Change
- LandBuyAccessBlocked_KB
+ LandBuyAccessBlocked_AdultsOnlyContent
-----------------------------------------------------------------------*/
if (handle_special_notification(notificationID, llsdBlock))
@@ -5551,6 +5913,30 @@ void process_alert_message(LLMessageSystem *msgsystem, void **user_data)
}
}
+bool handle_not_age_verified_alert(const std::string &pAlertName)
+{
+ LLNotificationPtr notification = LLNotificationsUtil::add(pAlertName);
+ if ((notification == NULL) || notification->isIgnored())
+ {
+ LLNotificationsUtil::add(pAlertName + "_Notify");
+ }
+
+ return true;
+}
+
+bool handle_special_alerts(const std::string &pAlertName)
+{
+ bool isHandled = false;
+
+ if (LLStringUtil::compareStrings(pAlertName, "NotAgeVerified") == 0)
+ {
+
+ isHandled = handle_not_age_verified_alert(pAlertName);
+ }
+
+ return isHandled;
+}
+
void process_alert_core(const std::string& message, BOOL modal)
{
// HACK -- handle callbacks for specific alerts. It also is localized in notifications.xml
@@ -5574,7 +5960,10 @@ void process_alert_core(const std::string& message, BOOL modal)
// Allow the server to spawn a named alert so that server alerts can be
// translated out of English.
std::string alert_name(message.substr(ALERT_PREFIX.length()));
- LLNotificationsUtil::add(alert_name);
+ if (!handle_special_alerts(alert_name))
+ {
+ LLNotificationsUtil::add(alert_name);
+ }
}
else if (message.find(NOTIFY_PREFIX) == 0)
{
@@ -6160,6 +6549,9 @@ void process_teleport_failed(LLMessageSystem *msg, void**)
std::string big_reason;
LLSD args;
+ // Let the interested parties know that teleport failed.
+ LLViewerParcelMgr::getInstance()->onTeleportFailed();
+
// if we have additional alert data
if (msg->has(_PREHASH_AlertInfo) && msg->getSizeFast(_PREHASH_AlertInfo, _PREHASH_Message) > 0)
{
@@ -6189,7 +6581,7 @@ void process_teleport_failed(LLMessageSystem *msg, void**)
else
{
// change notification name in this special case
- if (handle_special_notification("RegionEntryAccessBlocked", llsd_block))
+ if (handle_teleport_access_blocked(llsd_block))
{
if( gAgent.getTeleportState() != LLAgent::TELEPORT_NONE )
{
@@ -6218,9 +6610,6 @@ void process_teleport_failed(LLMessageSystem *msg, void**)
LLNotificationsUtil::add("CouldNotTeleportReason", args);
- // Let the interested parties know that teleport failed.
- LLViewerParcelMgr::getInstance()->onTeleportFailed();
-
if( gAgent.getTeleportState() != LLAgent::TELEPORT_NONE )
{
gAgent.setTeleportState( LLAgent::TELEPORT_NONE );
diff --git a/indra/newview/llviewermessage.h b/indra/newview/llviewermessage.h
index 46bfb2dad0..594c22ed9c 100644
--- a/indra/newview/llviewermessage.h
+++ b/indra/newview/llviewermessage.h
@@ -37,6 +37,9 @@
#include "llnotifications.h"
#include "llextendedstatus.h"
+#include <boost/function.hpp>
+#include <boost/signals2.hpp>
+
//
// Forward declarations
//
@@ -205,6 +208,15 @@ bool highlight_offered_object(const LLUUID& obj_id);
void set_dad_inventory_item(LLInventoryItem* inv_item, const LLUUID& into_folder_uuid);
void set_dad_inbox_object(const LLUUID& object_id);
+class LLViewerMessage : public LLSingleton<LLViewerMessage>
+{
+public:
+ typedef boost::function<void()> teleport_started_callback_t;
+ typedef boost::signals2::signal<void()> teleport_started_signal_t;
+ boost::signals2::connection setTeleportStartedCallback(teleport_started_callback_t cb);
+
+ teleport_started_signal_t mTeleportStartedSignal;
+};
class LLOfferInfo : public LLNotificationResponderInterface
{
@@ -253,5 +265,3 @@ private:
void process_feature_disabled_message(LLMessageSystem* msg, void**);
#endif
-
-
diff --git a/indra/newview/llviewernetwork.cpp b/indra/newview/llviewernetwork.cpp
index ef5c65eb87..97f4c3e5fe 100644
--- a/indra/newview/llviewernetwork.cpp
+++ b/indra/newview/llviewernetwork.cpp
@@ -1,4 +1,4 @@
-/**
+/**
* @file llviewernetwork.cpp
* @author James Cook, Richard Nelson
* @brief Networking constants and globals for viewer.
@@ -6,21 +6,21 @@
* $LicenseInfo:firstyear=2006&license=viewerlgpl$
* Second Life Viewer Source Code
* Copyright (C) 2010, Linden Research, Inc.
- *
+ *
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation;
* version 2.1 of the License only.
- *
+ *
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
- *
+ *
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
+ *
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
@@ -34,13 +34,39 @@
#include "lltrans.h"
#include "llweb.h"
-
-const char* DEFAULT_LOGIN_PAGE = "http://viewer-login.agni.lindenlab.com/";
-const char* SYSTEM_GRID_SLURL_BASE = "secondlife://%s/secondlife/";
-const char* MAIN_GRID_SLURL_BASE = "http://maps.secondlife.com/secondlife/";
-const char* SYSTEM_GRID_APP_SLURL_BASE = "secondlife:///app";
+/// key used to store the grid, and the name attribute in the grid data
+const std::string GRID_VALUE = "keyname";
+/// the value displayed in the grid selector menu, and other human-oriented text
+const std::string GRID_LABEL_VALUE = "label";
+/// the value used on the --grid command line argument
+const std::string GRID_ID_VALUE = "grid_login_id";
+/// the url for the login cgi script
+const std::string GRID_LOGIN_URI_VALUE = "login_uri";
+///
+const std::string GRID_HELPER_URI_VALUE = "helper_uri";
+/// the splash page url
+const std::string GRID_LOGIN_PAGE_VALUE = "login_page";
+/// internal data on system grids
+const std::string GRID_IS_SYSTEM_GRID_VALUE = "system_grid";
+/// whether this is single or double names
+const std::string GRID_LOGIN_IDENTIFIER_TYPES = "login_identifier_types";
+
+// defines slurl formats associated with various grids.
+// we need to continue to support existing forms, as slurls
+// are shared between viewers that may not understand newer
+// forms.
+const std::string GRID_SLURL_BASE = "slurl_base";
+const std::string GRID_APP_SLURL_BASE = "app_slurl_base";
+
+const std::string DEFAULT_LOGIN_PAGE = "http://viewer-login.agni.lindenlab.com/";
+
+const std::string MAIN_GRID_LOGIN_URI = "https://login.agni.lindenlab.com/cgi-bin/login.cgi";
+
+const std::string MAIN_GRID_SLURL_BASE = "http://maps.secondlife.com/secondlife/";
+const std::string SYSTEM_GRID_APP_SLURL_BASE = "secondlife:///app";
+const char* SYSTEM_GRID_SLURL_BASE = "secondlife://%s/secondlife/";
const char* DEFAULT_SLURL_BASE = "https://%s/region/";
const char* DEFAULT_APP_SLURL_BASE = "x-grid-location-info://%s/app";
@@ -54,14 +80,17 @@ LLGridManager::LLGridManager()
// an attacker. Don't want someone snagging a password.
std::string grid_file = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS,
"grids.xml");
+ LL_DEBUGS("GridManager")<<LL_ENDL;
+
initialize(grid_file);
-
+
}
LLGridManager::LLGridManager(const std::string& grid_file)
{
// initialize with an explicity grid file for testing.
+ LL_DEBUGS("GridManager")<<LL_ENDL;
initialize(grid_file);
}
@@ -74,183 +103,83 @@ LLGridManager::LLGridManager(const std::string& grid_file)
//
// LLGridManager::initialze - initialize the list of known grids based
// on the fixed list of linden grids (fixed for security reasons)
-// the grids.xml file
-// and the command line.
+// and the grids.xml file
void LLGridManager::initialize(const std::string& grid_file)
{
// default grid list.
// Don't move to a modifiable file for security reasons,
mGrid.clear() ;
+
// set to undefined
mGridList = LLSD();
mGridFile = grid_file;
// as we don't want an attacker to override our grid list
// to point the default grid to an invalid grid
- addSystemGrid("None", "", "", "", DEFAULT_LOGIN_PAGE);
-
-
-
- addSystemGrid("Agni",
- MAINGRID,
- "https://login.agni.lindenlab.com/cgi-bin/login.cgi",
- "https://secondlife.com/helpers/",
- DEFAULT_LOGIN_PAGE);
- addSystemGrid("Aditi",
- "util.aditi.lindenlab.com",
- "https://login.aditi.lindenlab.com/cgi-bin/login.cgi",
+ addSystemGrid("Second Life Main Grid (Agni)",
+ MAINGRID,
+ MAIN_GRID_LOGIN_URI,
+ "https://secondlife.com/helpers/",
+ DEFAULT_LOGIN_PAGE,
+ "Agni");
+ addSystemGrid("Second Life Beta Test Grid (Aditi)",
+ "util.aditi.lindenlab.com",
+ "https://login.aditi.lindenlab.com/cgi-bin/login.cgi",
"http://aditi-secondlife.webdev.lindenlab.com/helpers/",
- DEFAULT_LOGIN_PAGE);
- addSystemGrid("Aruna",
- "util.aruna.lindenlab.com",
- "https://login.aruna.lindenlab.com/cgi-bin/login.cgi",
- "http://aruna-secondlife.webdev.lindenlab.com/helpers/",
- DEFAULT_LOGIN_PAGE);
- addSystemGrid("Bharati",
- "util.bharati.lindenlab.com",
- "https://login.bharati.lindenlab.com/cgi-bin/login.cgi",
- "http://bharati-secondlife.webdev.lindenlab.com/helpers/",
- DEFAULT_LOGIN_PAGE);
- addSystemGrid("Chandra",
- "util.chandra.lindenlab.com",
- "https://login.chandra.lindenlab.com/cgi-bin/login.cgi",
- "http://chandra-secondlife.webdev.lindenlab.com/helpers/",
- DEFAULT_LOGIN_PAGE);
- addSystemGrid("Damballah",
- "util.damballah.lindenlab.com",
- "https://login.damballah.lindenlab.com/cgi-bin/login.cgi",
- "http://damballah-secondlife.webdev.lindenlab.com/helpers/",
- DEFAULT_LOGIN_PAGE);
- addSystemGrid("Danu",
- "util.danu.lindenlab.com",
- "https://login.danu.lindenlab.com/cgi-bin/login.cgi",
- "http://danu-secondlife.webdev.lindenlab.com/helpers/",
- DEFAULT_LOGIN_PAGE);
- addSystemGrid("Durga",
- "util.durga.lindenlab.com",
- "https://login.durga.lindenlab.com/cgi-bin/login.cgi",
- "http://durga-secondlife.webdev.lindenlab.com/helpers/",
- DEFAULT_LOGIN_PAGE);
- addSystemGrid("Ganga",
- "util.ganga.lindenlab.com",
- "https://login.ganga.lindenlab.com/cgi-bin/login.cgi",
- "http://ganga-secondlife.webdev.lindenlab.com/helpers/",
- DEFAULT_LOGIN_PAGE);
- addSystemGrid("Mitra",
- "util.mitra.lindenlab.com",
- "https://login.mitra.lindenlab.com/cgi-bin/login.cgi",
- "http://mitra-secondlife.webdev.lindenlab.com/helpers/",
- DEFAULT_LOGIN_PAGE);
- addSystemGrid("Mohini",
- "util.mohini.lindenlab.com",
- "https://login.mohini.lindenlab.com/cgi-bin/login.cgi",
- "http://mohini-secondlife.webdev.lindenlab.com/helpers/",
- DEFAULT_LOGIN_PAGE);
- addSystemGrid("Nandi",
- "util.nandi.lindenlab.com",
- "https://login.nandi.lindenlab.com/cgi-bin/login.cgi",
- "http://nandi-secondlife.webdev.lindenlab.com/helpers/",
- DEFAULT_LOGIN_PAGE);
- addSystemGrid("Parvati",
- "util.parvati.lindenlab.com",
- "https://login.parvati.lindenlab.com/cgi-bin/login.cgi",
- "http://parvati-secondlife.webdev.lindenlab.com/helpers/",
- DEFAULT_LOGIN_PAGE);
- addSystemGrid("Radha",
- "util.radha.lindenlab.com",
- "https://login.radha.lindenlab.com/cgi-bin/login.cgi",
- "http://radha-secondlife.webdev.lindenlab.com/helpers/",
- DEFAULT_LOGIN_PAGE);
- addSystemGrid("Ravi",
- "util.ravi.lindenlab.com",
- "https://login.ravi.lindenlab.com/cgi-bin/login.cgi",
- "http://ravi-secondlife.webdev.lindenlab.com/helpers/",
- DEFAULT_LOGIN_PAGE);
- addSystemGrid("Siva",
- "util.siva.lindenlab.com",
- "https://login.siva.lindenlab.com/cgi-bin/login.cgi",
- "http://siva-secondlife.webdev.lindenlab.com/helpers/",
- DEFAULT_LOGIN_PAGE);
- addSystemGrid("Shakti",
- "util.shakti.lindenlab.com",
- "https://login.shakti.lindenlab.com/cgi-bin/login.cgi",
- "http://shakti-secondlife.webdev.lindenlab.com/helpers/",
- DEFAULT_LOGIN_PAGE);
- addSystemGrid("Soma",
- "util.soma.lindenlab.com",
- "https://login.soma.lindenlab.com/cgi-bin/login.cgi",
- "http://soma-secondlife.webdev.lindenlab.com/helpers/",
- DEFAULT_LOGIN_PAGE);
- addSystemGrid("Uma",
- "util.uma.lindenlab.com",
- "https://login.uma.lindenlab.com/cgi-bin/login.cgi",
- "http://uma-secondlife.webdev.lindenlab.com/helpers/",
- DEFAULT_LOGIN_PAGE);
- addSystemGrid("Vaak",
- "util.vaak.lindenlab.com",
- "https://login.vaak.lindenlab.com/cgi-bin/login.cgi",
- "http://vaak-secondlife.webdev.lindenlab.com/helpers/",
- DEFAULT_LOGIN_PAGE);
- addSystemGrid("Yami",
- "util.yami.lindenlab.com",
- "https://login.yami.lindenlab.com/cgi-bin/login.cgi",
- "http://yami-secondlife.webdev.lindenlab.com/helpers/",
- DEFAULT_LOGIN_PAGE);
- addSystemGrid("Local (Linden)",
- "localhost",
- "https://login.dmz.lindenlab.com/cgi-bin/login.cgi",
- "",
- DEFAULT_LOGIN_PAGE);
-
-
+ DEFAULT_LOGIN_PAGE,
+ "Aditi");
+
LLSD other_grids;
llifstream llsd_xml;
if (!grid_file.empty())
{
+ LL_INFOS("GridManager")<<"Grid configuration file '"<<grid_file<<"'"<<LL_ENDL;
llsd_xml.open( grid_file.c_str(), std::ios::in | std::ios::binary );
// parse through the gridfile, inserting grids into the list unless
- // they overwrite a linden grid.
- if( llsd_xml.is_open())
+ // they overwrite an existing grid.
+ if( llsd_xml.is_open())
{
LLSDSerialize::fromXMLDocument( other_grids, llsd_xml );
if(other_grids.isMap())
{
- for(LLSD::map_iterator grid_itr = other_grids.beginMap();
+ for(LLSD::map_iterator grid_itr = other_grids.beginMap();
grid_itr != other_grids.endMap();
++grid_itr)
{
LLSD::String key_name = grid_itr->first;
LLSD grid = grid_itr->second;
- // TODO: Make sure gridfile specified label is not
- // a system grid label
- LL_DEBUGS("GridManager") << "reading: " << key_name << LL_ENDL;
- if (mGridList.has(key_name) &&
- mGridList[key_name].has(GRID_IS_SYSTEM_GRID_VALUE))
+
+ std::string existingGrid = getGrid(grid);
+ if (mGridList.has(key_name) || !existingGrid.empty())
{
- LL_DEBUGS("GridManager") << "Cannot override grid " << key_name << " as it's a system grid" << LL_ENDL;
- // If the system grid does exist in the grids file, and it's marked as a favorite, set it as a favorite.
- if(grid_itr->second.has(GRID_IS_FAVORITE_VALUE) && grid_itr->second[GRID_IS_FAVORITE_VALUE].asBoolean() )
- {
- mGridList[key_name][GRID_IS_FAVORITE_VALUE] = TRUE;
- }
+ LL_WARNS("GridManager") << "Cannot override existing grid '" << key_name << "'; ignoring definition from '"<<grid_file<<"'" << LL_ENDL;
+ }
+ else if ( addGrid(grid) )
+ {
+ LL_INFOS("GridManager") << "added grid '"<<key_name<<"'"<<LL_ENDL;
}
else
{
- try
- {
- addGrid(grid);
- LL_DEBUGS("GridManager") << "Added grid: " << key_name << LL_ENDL;
- }
- catch (...)
- {
- }
+ LL_WARNS("GridManager") << "failed to add invalid grid '"<<key_name<<"'"<<LL_ENDL;
}
}
llsd_xml.close();
- }
- }
+ }
+ else
+ {
+ LL_WARNS("GridManager")<<"Failed to parse grid configuration '"<<grid_file<<"'"<<LL_ENDL;
+ }
+ }
+ else
+ {
+ LL_WARNS("GridManager")<<"Failed to open grid configuration '"<<grid_file<<"'"<<LL_ENDL;
+ }
+ }
+ else
+ {
+ LL_DEBUGS("GridManager")<<"no grid file specified"<<LL_ENDL;
}
-
+
// load a grid from the command line.
// if the actual grid name is specified from the command line,
// set it as the 'selected' grid.
@@ -259,50 +188,38 @@ void LLGridManager::initialize(const std::string& grid_file)
{
// try to find the grid assuming the command line parameter is
// the case-insensitive 'label' of the grid. ie 'Agni'
- mGrid = getGridByLabel(cmd_line_grid);
+ mGrid = getGrid(cmd_line_grid);
if(mGrid.empty())
{
- // if we couldn't find it, assume the
- // requested grid is the actual grid 'name' or index,
- // which would be the dns name of the grid (for non
- // linden hosted grids)
- // If the grid isn't there, that's ok, as it will be
- // automatically added later.
- mGrid = cmd_line_grid;
+ LL_WARNS("GridManager")<<"Unknown grid '"<<cmd_line_grid<<"'"<<LL_ENDL;
+ }
+ else
+ {
+ LL_INFOS("GridManager")<<"Command line specified '"<<cmd_line_grid<<"': "<<mGrid<<LL_ENDL;
}
-
}
else
{
// if a grid was not passed in via the command line, grab it from the CurrentGrid setting.
// if there's no current grid, that's ok as it'll be either set by the value passed
// in via the login uri if that's specified, or will default to maingrid
- mGrid = gSavedSettings.getString("CurrentGrid");
+ std::string last_grid = gSavedSettings.getString("CurrentGrid");
+ if ( ! getGrid(last_grid).empty() )
+ {
+ LL_INFOS("GridManager")<<"Using last grid: "<<last_grid<<LL_ENDL;
+ mGrid = last_grid;
+ }
+ else
+ {
+ LL_INFOS("GridManager")<<"Last grid '"<<last_grid<<"' not configured"<<LL_ENDL;
+ }
}
-
+
if(mGrid.empty())
{
// no grid was specified so default to maingrid
- LL_DEBUGS("GridManager") << "Setting grid to MAINGRID as no grid has been specified " << LL_ENDL;
+ LL_INFOS("GridManager") << "Default grid to "<<MAINGRID<< LL_ENDL;
mGrid = MAINGRID;
-
- }
-
- // generate a 'grid list' entry for any command line parameter overrides
- // or setting overides that we'll add to the grid list or override
- // any grid list entries with.
- LLSD grid = LLSD::emptyMap();
-
- if(mGridList.has(mGrid))
- {
- grid = mGridList[mGrid];
- }
- else
- {
- grid[GRID_VALUE] = mGrid;
- // add the grid with the additional values, or update the
- // existing grid if it exists with the given values
- addGrid(grid);
}
LLControlVariablePtr grid_control = gSavedSettings.getControl("CurrentGrid");
@@ -314,115 +231,105 @@ void LLGridManager::initialize(const std::string& grid_file)
// since above only triggers on changes, trigger the callback manually to initialize state
updateIsInProductionGrid();
- LL_DEBUGS("GridManager") << "Selected grid is " << mGrid << LL_ENDL;
setGridChoice(mGrid);
- if(mGridList[mGrid][GRID_LOGIN_URI_VALUE].isArray())
- {
- llinfos << "is array" << llendl;
- }
}
LLGridManager::~LLGridManager()
{
- saveFavorites();
}
-void LLGridManager::getGridInfo(const std::string &grid, LLSD& grid_info)
-{
-
- grid_info = mGridList[grid];
-
- // override any grid data with the command line info.
-
- LLSD cmd_line_login_uri = gSavedSettings.getLLSD("CmdLineLoginURI");
- if (cmd_line_login_uri.isString())
- {
- grid_info[GRID_LOGIN_URI_VALUE] = LLSD::emptyArray();
- grid_info[GRID_LOGIN_URI_VALUE].append(cmd_line_login_uri);
- }
-
- // override the helper uri if it was passed in
- std::string cmd_line_helper_uri = gSavedSettings.getString("CmdLineHelperURI");
- if(!cmd_line_helper_uri.empty())
- {
- grid_info[GRID_HELPER_URI_VALUE] = cmd_line_helper_uri;
- }
-
- // override the login page if it was passed in
- std::string cmd_line_login_page = gSavedSettings.getString("LoginPage");
- if(!cmd_line_login_page.empty())
- {
- grid_info[GRID_LOGIN_PAGE_VALUE] = cmd_line_login_page;
- }
-}
-
-
//
// LLGridManager::addGrid - add a grid to the grid list, populating the needed values
// if they're not populated yet.
//
-void LLGridManager::addGrid(LLSD& grid_data)
+bool LLGridManager::addGrid(LLSD& grid_data)
{
+ bool added = false;
if (grid_data.isMap() && grid_data.has(GRID_VALUE))
{
- std::string grid = utf8str_tolower(grid_data[GRID_VALUE]);
+ std::string grid = utf8str_tolower(grid_data[GRID_VALUE].asString());
- // grid should be in the form of a dns address
- if (!grid.empty() &&
- grid.find_first_not_of("abcdefghijklmnopqrstuvwxyz1234567890-_. ") != std::string::npos)
- {
- printf("grid name: %s", grid.c_str());
- throw LLInvalidGridName(grid);
- }
-
- // populate the other values if they don't exist
- if (!grid_data.has(GRID_LABEL_VALUE))
- {
- grid_data[GRID_LABEL_VALUE] = grid;
- }
- if (!grid_data.has(GRID_ID_VALUE))
- {
- grid_data[GRID_ID_VALUE] = grid;
- }
-
- // if the grid data doesn't include any of the URIs, then
- // generate them from the grid, which should be a dns address
- if (!grid_data.has(GRID_LOGIN_URI_VALUE))
+ if ( getGrid(grid_data[GRID_VALUE]).empty() && getGrid(grid).empty() )
{
- grid_data[GRID_LOGIN_URI_VALUE] = LLSD::emptyArray();
- grid_data[GRID_LOGIN_URI_VALUE].append(std::string("https://") +
- grid + "/cgi-bin/login.cgi");
- }
- // Populate to the default values
- if (!grid_data.has(GRID_LOGIN_PAGE_VALUE))
- {
- grid_data[GRID_LOGIN_PAGE_VALUE] = std::string("http://") + grid + "/app/login/";
- }
- if (!grid_data.has(GRID_HELPER_URI_VALUE))
- {
- grid_data[GRID_HELPER_URI_VALUE] = std::string("https://") + grid + "/helpers/";
+ std::string grid_id = grid_data.has(GRID_ID_VALUE) ? grid_data[GRID_ID_VALUE].asString() : "";
+ if ( getGrid(grid_id).empty() )
+ {
+ // populate the other values if they don't exist
+ if (!grid_data.has(GRID_LABEL_VALUE))
+ {
+ grid_data[GRID_LABEL_VALUE] = grid;
+ }
+ if (!grid_data.has(GRID_ID_VALUE))
+ {
+ grid_data[GRID_ID_VALUE] = grid;
+ }
+
+ // if the grid data doesn't include any of the URIs, then
+ // generate them from the grid, which should be a dns address
+ if (!grid_data.has(GRID_LOGIN_URI_VALUE))
+ {
+ grid_data[GRID_LOGIN_URI_VALUE] = LLSD::emptyArray();
+ grid_data[GRID_LOGIN_URI_VALUE].append(std::string("https://") +
+ grid + "/cgi-bin/login.cgi");
+ }
+ // Populate to the default values
+ if (!grid_data.has(GRID_LOGIN_PAGE_VALUE))
+ {
+ grid_data[GRID_LOGIN_PAGE_VALUE] = std::string("http://") + grid + "/app/login/";
+ }
+ if (!grid_data.has(GRID_HELPER_URI_VALUE))
+ {
+ grid_data[GRID_HELPER_URI_VALUE] = std::string("https://") + grid + "/helpers/";
+ }
+
+ if (!grid_data.has(GRID_LOGIN_IDENTIFIER_TYPES))
+ {
+ // non system grids and grids that haven't already been configured with values
+ // get both types of credentials.
+ grid_data[GRID_LOGIN_IDENTIFIER_TYPES] = LLSD::emptyArray();
+ grid_data[GRID_LOGIN_IDENTIFIER_TYPES].append(CRED_IDENTIFIER_TYPE_AGENT);
+ grid_data[GRID_LOGIN_IDENTIFIER_TYPES].append(CRED_IDENTIFIER_TYPE_ACCOUNT);
+ }
+
+ LL_DEBUGS("GridManager") <<grid<<"\n"
+ <<" id: "<<grid_data[GRID_ID_VALUE].asString()<<"\n"
+ <<" label: "<<grid_data[GRID_LABEL_VALUE].asString()<<"\n"
+ <<" login page: "<<grid_data[GRID_LOGIN_PAGE_VALUE].asString()<<"\n"
+ <<" helper page: "<<grid_data[GRID_HELPER_URI_VALUE].asString()<<"\n";
+ /* still in LL_DEBUGS */
+ for (LLSD::array_const_iterator login_uris = grid_data[GRID_LOGIN_URI_VALUE].beginArray();
+ login_uris != grid_data[GRID_LOGIN_URI_VALUE].endArray();
+ login_uris++)
+ {
+ LL_CONT << " login uri: "<<login_uris->asString()<<"\n";
+ }
+ LL_CONT << LL_ENDL;
+ mGridList[grid] = grid_data;
+ added = true;
+ }
+ else
+ {
+ LL_WARNS("GridManager")<<"duplicate grid id'"<<grid_id<<"' ignored"<<LL_ENDL;
+ }
}
-
- if (!grid_data.has(GRID_LOGIN_IDENTIFIER_TYPES))
+ else
{
- // non system grids and grids that haven't already been configured with values
- // get both types of credentials.
- grid_data[GRID_LOGIN_IDENTIFIER_TYPES] = LLSD::emptyArray();
- grid_data[GRID_LOGIN_IDENTIFIER_TYPES].append(CRED_IDENTIFIER_TYPE_AGENT);
- grid_data[GRID_LOGIN_IDENTIFIER_TYPES].append(CRED_IDENTIFIER_TYPE_ACCOUNT);
+ LL_WARNS("GridManager")<<"duplicate grid name '"<<grid<<"' ignored"<<LL_ENDL;
}
-
- LL_DEBUGS("GridManager") << "ADDING: " << grid << LL_ENDL;
- mGridList[grid] = grid_data;
}
+ else
+ {
+ LL_WARNS("GridManager")<<"invalid grid definition ignored"<<LL_ENDL;
+ }
+ return added;
}
//
// LLGridManager::addSystemGrid - helper for adding a system grid.
-void LLGridManager::addSystemGrid(const std::string& label,
- const std::string& name,
- const std::string& login,
+void LLGridManager::addSystemGrid(const std::string& label,
+ const std::string& name,
+ const std::string& login_uri,
const std::string& helper,
const std::string& login_page,
const std::string& login_id)
@@ -432,12 +339,12 @@ void LLGridManager::addSystemGrid(const std::string& label,
grid[GRID_LABEL_VALUE] = label;
grid[GRID_HELPER_URI_VALUE] = helper;
grid[GRID_LOGIN_URI_VALUE] = LLSD::emptyArray();
- grid[GRID_LOGIN_URI_VALUE].append(login);
+ grid[GRID_LOGIN_URI_VALUE].append(login_uri);
grid[GRID_LOGIN_PAGE_VALUE] = login_page;
- grid[GRID_IS_SYSTEM_GRID_VALUE] = TRUE;
+ grid[GRID_IS_SYSTEM_GRID_VALUE] = true;
grid[GRID_LOGIN_IDENTIFIER_TYPES] = LLSD::emptyArray();
grid[GRID_LOGIN_IDENTIFIER_TYPES].append(CRED_IDENTIFIER_TYPE_AGENT);
-
+
grid[GRID_APP_SLURL_BASE] = SYSTEM_GRID_APP_SLURL_BASE;
if (login_id.empty())
{
@@ -447,124 +354,187 @@ void LLGridManager::addSystemGrid(const std::string& label,
{
grid[GRID_ID_VALUE] = login_id;
}
-
- // only add the system grids beyond agni to the visible list
- // if we're building a debug version.
+
if (name == std::string(MAINGRID))
{
- grid[GRID_SLURL_BASE] = MAIN_GRID_SLURL_BASE;
- grid[GRID_IS_FAVORITE_VALUE] = TRUE;
+ grid[GRID_SLURL_BASE] = MAIN_GRID_SLURL_BASE;
}
else
{
- grid[GRID_SLURL_BASE] = llformat(SYSTEM_GRID_SLURL_BASE, label.c_str());
+ grid[GRID_SLURL_BASE] = llformat(SYSTEM_GRID_SLURL_BASE, grid[GRID_ID_VALUE].asString().c_str());
}
+
addGrid(grid);
}
// return a list of grid name -> grid label mappings for UI purposes
-std::map<std::string, std::string> LLGridManager::getKnownGrids(bool favorite_only)
+std::map<std::string, std::string> LLGridManager::getKnownGrids()
{
std::map<std::string, std::string> result;
for(LLSD::map_iterator grid_iter = mGridList.beginMap();
grid_iter != mGridList.endMap();
- grid_iter++)
+ grid_iter++)
{
- if(!favorite_only || grid_iter->second.has(GRID_IS_FAVORITE_VALUE))
- {
- result[grid_iter->first] = grid_iter->second[GRID_LABEL_VALUE].asString();
- }
+ result[grid_iter->first] = grid_iter->second[GRID_LABEL_VALUE].asString();
}
return result;
}
-
void LLGridManager::setGridChoice(const std::string& grid)
{
// Set the grid choice based on a string.
- // The string can be:
- // - a grid label from the gGridInfo table
- // - a hostname
- // - an ip address
-
- // loop through. We could do just a hash lookup but we also want to match
- // on label
- std::string grid_name = grid;
- if(!mGridList.has(grid_name))
+ LL_DEBUGS("GridManager")<<"requested "<<grid<<LL_ENDL;
+ std::string grid_name = getGrid(grid); // resolved either the name or the id to the name
+
+ if(!grid_name.empty())
{
- // case insensitive
- grid_name = getGridByLabel(grid);
+ LL_INFOS("GridManager")<<"setting "<<grid_name<<LL_ENDL;
+ mGrid = grid_name;
+ gSavedSettings.setString("CurrentGrid", grid_name);
+
+ updateIsInProductionGrid();
}
-
- if(grid_name.empty())
+ else
{
// the grid was not in the list of grids.
- LLSD grid_data = LLSD::emptyMap();
- grid_data[GRID_VALUE] = grid;
- addGrid(grid_data);
+ LL_WARNS("GridManager")<<"unknown grid "<<grid<<LL_ENDL;
}
- mGrid = grid;
- gSavedSettings.setString("CurrentGrid", grid);
-
- updateIsInProductionGrid();
}
-std::string LLGridManager::getGridByLabel( const std::string &grid_label, bool case_sensitive)
+std::string LLGridManager::getGrid( const std::string &grid )
{
- for(LLSD::map_iterator grid_iter = mGridList.beginMap();
- grid_iter != mGridList.endMap();
- grid_iter++)
+ std::string grid_name;
+
+ if (mGridList.has(grid))
+ {
+ // the grid was the long name, so we're good, return it
+ grid_name = grid;
+ }
+ else
{
- if (grid_iter->second.has(GRID_LABEL_VALUE))
+ // search the grid list for a grid with a matching id
+ for(LLSD::map_iterator grid_iter = mGridList.beginMap();
+ grid_name.empty() && grid_iter != mGridList.endMap();
+ grid_iter++)
{
- if (0 == (case_sensitive?LLStringUtil::compareStrings(grid_label, grid_iter->second[GRID_LABEL_VALUE].asString()):
- LLStringUtil::compareInsensitive(grid_label, grid_iter->second[GRID_LABEL_VALUE].asString())))
+ if (grid_iter->second.has(GRID_ID_VALUE))
{
- return grid_iter->first;
+ if (0 == (LLStringUtil::compareInsensitive(grid,
+ grid_iter->second[GRID_ID_VALUE].asString())))
+ {
+ // found a matching label, return this name
+ grid_name = grid_iter->first;
+ }
}
}
}
- return std::string();
+ return grid_name;
}
-void LLGridManager::getLoginURIs(std::vector<std::string>& uris)
+std::string LLGridManager::getGridLabel(const std::string& grid)
+{
+ std::string grid_label;
+ std::string grid_name = getGrid(grid);
+ if (!grid.empty())
+ {
+ grid_label = mGridList[grid_name][GRID_LABEL_VALUE].asString();
+ }
+ else
+ {
+ LL_WARNS("GridManager")<<"invalid grid '"<<grid<<"'"<<LL_ENDL;
+ }
+ LL_DEBUGS("GridManager")<<"returning "<<grid_label<<LL_ENDL;
+ return grid_label;
+}
+
+std::string LLGridManager::getGridId(const std::string& grid)
+{
+ std::string grid_id;
+ std::string grid_name = getGrid(grid);
+ if (!grid.empty())
+ {
+ grid_id = mGridList[grid_name][GRID_ID_VALUE].asString();
+ }
+ else
+ {
+ LL_WARNS("GridManager")<<"invalid grid '"<<grid<<"'"<<LL_ENDL;
+ }
+ LL_DEBUGS("GridManager")<<"returning "<<grid_id<<LL_ENDL;
+ return grid_id;
+}
+
+void LLGridManager::getLoginURIs(const std::string& grid, std::vector<std::string>& uris)
{
uris.clear();
- LLSD cmd_line_login_uri = gSavedSettings.getLLSD("CmdLineLoginURI");
- if (cmd_line_login_uri.isString())
- {
- uris.push_back(cmd_line_login_uri);
- return;
+ std::string grid_name = getGrid(grid);
+ if (!grid_name.empty())
+ {
+ for (LLSD::array_iterator llsd_uri = mGridList[grid_name][GRID_LOGIN_URI_VALUE].beginArray();
+ llsd_uri != mGridList[grid_name][GRID_LOGIN_URI_VALUE].endArray();
+ llsd_uri++)
+ {
+ uris.push_back(llsd_uri->asString());
+ }
}
- for (LLSD::array_iterator llsd_uri = mGridList[mGrid][GRID_LOGIN_URI_VALUE].beginArray();
- llsd_uri != mGridList[mGrid][GRID_LOGIN_URI_VALUE].endArray();
- llsd_uri++)
+ else
{
- uris.push_back(llsd_uri->asString());
+ LL_WARNS("GridManager")<<"invalid grid '"<<grid<<"'"<<LL_ENDL;
}
}
-std::string LLGridManager::getHelperURI()
+void LLGridManager::getLoginURIs(std::vector<std::string>& uris)
{
- std::string cmd_line_helper_uri = gSavedSettings.getString("CmdLineHelperURI");
- if(!cmd_line_helper_uri.empty())
+ getLoginURIs(mGrid, uris);
+}
+
+std::string LLGridManager::getHelperURI(const std::string& grid)
+{
+ std::string helper_uri;
+ std::string grid_name = getGrid(grid);
+ if (!grid_name.empty())
{
- return cmd_line_helper_uri;
+ helper_uri = mGridList[grid_name][GRID_HELPER_URI_VALUE].asString();
}
- return mGridList[mGrid][GRID_HELPER_URI_VALUE];
+ else
+ {
+ LL_WARNS("GridManager")<<"invalid grid '"<<grid<<"'"<<LL_ENDL;
+ }
+
+ LL_DEBUGS("GridManager")<<"returning "<<helper_uri<<LL_ENDL;
+ return helper_uri;
}
-std::string LLGridManager::getLoginPage()
+std::string LLGridManager::getLoginPage(const std::string& grid)
{
- // override the login page if it was passed in
- std::string cmd_line_login_page = gSavedSettings.getString("LoginPage");
- if(!cmd_line_login_page.empty())
+ std::string grid_login_page;
+ std::string grid_name = getGrid(grid);
+ if (!grid_name.empty())
+ {
+ grid_login_page = mGridList[grid_name][GRID_LOGIN_PAGE_VALUE].asString();
+ }
+ else
{
- return cmd_line_login_page;
- }
-
- return mGridList[mGrid][GRID_LOGIN_PAGE_VALUE];
+ LL_WARNS("GridManager")<<"invalid grid '"<<grid<<"'"<<LL_ENDL;
+ }
+ return grid_login_page;
+}
+
+std::string LLGridManager::getLoginPage()
+{
+ std::string login_page = mGridList[mGrid][GRID_LOGIN_PAGE_VALUE].asString();
+ LL_DEBUGS("GridManager")<<"returning "<<login_page<<LL_ENDL;
+ return login_page;
+}
+
+void LLGridManager::getLoginIdentifierTypes(LLSD& idTypes)
+{
+ idTypes = mGridList[mGrid][GRID_LOGIN_IDENTIFIER_TYPES];
+}
+
+std::string LLGridManager::getGridLoginID()
+{
+ return mGridList[mGrid][GRID_ID_VALUE];
}
void LLGridManager::updateIsInProductionGrid()
@@ -578,13 +548,19 @@ void LLGridManager::updateIsInProductionGrid()
if (uris.empty())
{
mIsInProductionGrid = true;
- return;
}
- LLStringUtil::toLower(uris[0]);
- if((uris[0].find("agni") != std::string::npos))
+ else
{
- mIsInProductionGrid = true;
- return;
+ for ( std::vector<std::string>::iterator uri_it = uris.begin();
+ ! mIsInProductionGrid && uri_it != uris.end();
+ uri_it++
+ )
+ {
+ if( MAIN_GRID_LOGIN_URI == *uri_it )
+ {
+ mIsInProductionGrid = true;
+ }
+ }
}
}
@@ -593,50 +569,53 @@ bool LLGridManager::isInProductionGrid()
return mIsInProductionGrid;
}
-void LLGridManager::saveFavorites()
+bool LLGridManager::isSystemGrid(const std::string& grid)
{
- // filter out just those marked as favorites
- LLSD output_grid_list = LLSD::emptyMap();
- for(LLSD::map_iterator grid_iter = mGridList.beginMap();
- grid_iter != mGridList.endMap();
- grid_iter++)
- {
- if(grid_iter->second.has(GRID_IS_FAVORITE_VALUE))
- {
- output_grid_list[grid_iter->first] = grid_iter->second;
- }
- }
- llofstream llsd_xml;
- llsd_xml.open( mGridFile.c_str(), std::ios::out | std::ios::binary);
- LLSDSerialize::toPrettyXML(output_grid_list, llsd_xml);
- llsd_xml.close();
-}
+ std::string grid_name = getGrid(grid);
+ return ( !grid_name.empty()
+ && mGridList.has(grid)
+ && mGridList[grid].has(GRID_IS_SYSTEM_GRID_VALUE)
+ && mGridList[grid][GRID_IS_SYSTEM_GRID_VALUE].asBoolean()
+ );
+}
// build a slurl for the given region within the selected grid
std::string LLGridManager::getSLURLBase(const std::string& grid)
{
- std::string grid_base;
- if(mGridList.has(grid) && mGridList[grid].has(GRID_SLURL_BASE))
+ std::string grid_base = "";
+ std::string grid_name = getGrid(grid);
+ if( ! grid_name.empty() && mGridList.has(grid_name) )
{
- return mGridList[grid][GRID_SLURL_BASE].asString();
- }
- else
- {
- return llformat(DEFAULT_SLURL_BASE, grid.c_str());
+ if (mGridList[grid_name].has(GRID_SLURL_BASE))
+ {
+ grid_base = mGridList[grid_name][GRID_SLURL_BASE].asString();
+ }
+ else
+ {
+ grid_base = llformat(DEFAULT_SLURL_BASE, grid_name.c_str());
+ }
}
+ LL_DEBUGS("GridManager")<<"returning '"<<grid_base<<"'"<<LL_ENDL;
+ return grid_base;
}
// build a slurl for the given region within the selected grid
std::string LLGridManager::getAppSLURLBase(const std::string& grid)
{
- std::string grid_base;
- if(mGridList.has(grid) && mGridList[grid].has(GRID_APP_SLURL_BASE))
- {
- return mGridList[grid][GRID_APP_SLURL_BASE].asString();
- }
- else
+ std::string grid_base = "";
+ std::string grid_name = getGrid(grid);
+ if(!grid_name.empty() && mGridList.has(grid))
{
- return llformat(DEFAULT_APP_SLURL_BASE, grid.c_str());
+ if (mGridList[grid].has(GRID_APP_SLURL_BASE))
+ {
+ grid_base = mGridList[grid][GRID_APP_SLURL_BASE].asString();
+ }
+ else
+ {
+ grid_base = llformat(DEFAULT_APP_SLURL_BASE, grid_name.c_str());
+ }
}
+ LL_DEBUGS("GridManager")<<"returning '"<<grid_base<<"'"<<LL_ENDL;
+ return grid_base;
}
diff --git a/indra/newview/llviewernetwork.h b/indra/newview/llviewernetwork.h
index 15e25b4952..3f56103b2e 100644
--- a/indra/newview/llviewernetwork.h
+++ b/indra/newview/llviewernetwork.h
@@ -27,113 +27,181 @@
#ifndef LL_LLVIEWERNETWORK_H
#define LL_LLVIEWERNETWORK_H
-
-extern const char* DEFAULT_LOGIN_PAGE;
-
-#define GRID_VALUE "name"
-#define GRID_LABEL_VALUE "label"
-#define GRID_ID_VALUE "grid_login_id"
-#define GRID_LOGIN_URI_VALUE "login_uri"
-#define GRID_HELPER_URI_VALUE "helper_uri"
-#define GRID_LOGIN_PAGE_VALUE "login_page"
-#define GRID_IS_SYSTEM_GRID_VALUE "system_grid"
-#define GRID_IS_FAVORITE_VALUE "favorite"
+
+// @TODO this really should be private, but is used in llslurl
#define MAINGRID "util.agni.lindenlab.com"
-#define GRID_LOGIN_IDENTIFIER_TYPES "login_identifier_types"
-// defines slurl formats associated with various grids.
-// we need to continue to support existing forms, as slurls
-// are shared between viewers that may not understand newer
-// forms.
-#define GRID_SLURL_BASE "slurl_base"
-#define GRID_APP_SLURL_BASE "app_slurl_base"
+/// Exception thrown when a grid is not valid
class LLInvalidGridName
{
public:
LLInvalidGridName(std::string grid) : mGrid(grid)
{
}
+ std::string name() { return mGrid; }
protected:
std::string mGrid;
};
-
/**
- * @brief A class to manage the grids available to the viewer
- * including persistance. This class also maintains the currently
- * selected grid.
- *
+ * @brief A singleton class to manage the grids available to the viewer.
+ *
+ * This class maintains several properties for each known grid, and provides
+ * interfaces for obtaining each of these properties given a specified
+ * grid. Grids are specified by either of two identifiers, each of which
+ * must be unique among all known grids:
+ * - grid name : DNS name for the grid
+ * - grid id : a short form (conventionally a single word)
+ *
+ * This class maintains the currently selected grid, and provides short
+ * form accessors for each of the properties of the selected grid.
**/
class LLGridManager : public LLSingleton<LLGridManager>
{
-public:
-
- // when the grid manager is instantiated, the default grids are automatically
- // loaded, and the grids favorites list is loaded from the xml file.
+ public:
+ /* ================================================================
+ * @name Initialization and Configuration
+ * @{
+ */
+ /// Instantiate the grid manager, load default grids, selects the default grid
LLGridManager(const std::string& grid_file);
LLGridManager();
~LLGridManager();
+ /// add grids from an external grids file
void initialize(const std::string& grid_file);
- // grid list management
-
- // add a grid to the list of grids
- void addGrid(LLSD& grid_info);
-
- // retrieve a map of grid-name <-> label
- // by default only return the user visible grids
- std::map<std::string, std::string> getKnownGrids(bool favorites_only=FALSE);
- void getGridInfo(const std::string& grid, LLSD &grid_info);
+ //@}
- // current grid management
+ /* ================================================================
+ * @name Grid Identifiers
+ * @{
+ * The id is a short form (typically one word) grid name,
+ * It should be used in URL path elements or parameters
+ *
+ * Each grid also has a "label", intented to be a user friendly
+ * descriptive form (it is used in the login panel grid menu, for example).
+ */
+ /// Return the name of a grid, given either its name or its id
+ std::string getGrid( const std::string &grid );
- // select a given grid as the current grid. If the grid
- // is not a known grid, then it's assumed to be a dns name for the
- // grid, and the various URIs will be automatically generated.
- void setGridChoice(const std::string& grid);
+ /// Get the id (short form selector) for a given grid
+ std::string getGridId(const std::string& grid);
+
+ /// Get the id (short form selector) for the selected grid
+ std::string getGridId() { return getGridId(mGrid); }
+
+ /// Get the user-friendly long form descriptor for a given grid
+ std::string getGridLabel(const std::string& grid);
+ /// Get the user-friendly long form descriptor for the selected grid
+ std::string getGridLabel() { return getGridLabel(mGrid); }
+
+ /// Retrieve a map of grid-name -> label
+ std::map<std::string, std::string> getKnownGrids();
+
+ //@}
+
+ /* ================================================================
+ * @name Login related properties
+ * @{
+ */
+
+ /**
+ * Get the login uris for the specified grid.
+ * The login uri for a grid is the target of the authentication request.
+ * A grid may have multple login uris, so they are returned as a vector.
+ */
+ void getLoginURIs(const std::string& grid, std::vector<std::string>& uris);
- std::string getGridLabel() { return mGridList[mGrid][GRID_LABEL_VALUE]; }
- std::string getGrid() const { return mGrid; }
+ /// Get the login uris for the selected grid
void getLoginURIs(std::vector<std::string>& uris);
- std::string getHelperURI();
- std::string getLoginPage();
- std::string getGridLoginID() { return mGridList[mGrid][GRID_ID_VALUE]; }
- std::string getLoginPage(const std::string& grid) { return mGridList[grid][GRID_LOGIN_PAGE_VALUE]; }
- void getLoginIdentifierTypes(LLSD& idTypes) { idTypes = mGridList[mGrid][GRID_LOGIN_IDENTIFIER_TYPES]; }
- // build a slurl for the given region within the selected grid
+ /// Get the URI for webdev help functions for the specified grid
+ std::string getHelperURI(const std::string& grid);
+
+ /// Get the URI for webdev help functions for the selected grid
+ std::string getHelperURI() { return getHelperURI(mGrid); }
+
+ /// Get the url of the splash page to be displayed prior to login
+ std::string getLoginPage(const std::string& grid_name);
+
+ /// Get the URI for the login splash page for the selected grid
+ std::string getLoginPage();
+
+ /// Get the id to be used as a short name in url path components or parameters
+ std::string getGridLoginID();
+
+ /// Get an array of the login types supported by the grid
+ void getLoginIdentifierTypes(LLSD& idTypes);
+ /**< the types are "agent" and "avatar";
+ * one means single-name (someone Resident) accounts and other first/last name accounts
+ * I am not sure which is which
+ */
+
+ //@}
+
+ /* ================================================================
+ * @name URL Construction Properties
+ * @{
+ */
+
+ /// Return the slurl prefix (everything up to but not including the region) for a given grid
std::string getSLURLBase(const std::string& grid);
+
+ /// Return the slurl prefix (everything up to but not including the region) for the selected grid
std::string getSLURLBase() { return getSLURLBase(mGrid); }
+ /// Return the application URL prefix for the given grid
std::string getAppSLURLBase(const std::string& grid);
+
+ /// Return the application URL prefix for the selected grid
std::string getAppSLURLBase() { return getAppSLURLBase(mGrid); }
-
- void getGridInfo(LLSD &grid_info) { getGridInfo(mGrid, grid_info); }
-
- std::string getGridByLabel( const std::string &grid_label, bool case_sensitive = false);
-
- bool isSystemGrid(const std::string& grid)
- {
- return mGridList.has(grid) &&
- mGridList[grid].has(GRID_IS_SYSTEM_GRID_VALUE) &&
- mGridList[grid][GRID_IS_SYSTEM_GRID_VALUE].asBoolean();
- }
+
+ //@}
+
+ /* ================================================================
+ * @name Selecting the current grid
+ * @{
+ * At initialization, the current grid is set by the first of:
+ * -# The value supplied by the --grid command line option (setting CmdLineGridChoice);
+ * Note that a default for this may be set at build time.
+ * -# The grid used most recently (setting CurrentGrid)
+ * -# The main grid (Agni)
+ */
+
+ /// Select a given grid as the current grid.
+ void setGridChoice(const std::string& grid);
+
+ /// Returns the name of the currently selected grid
+ std::string getGrid() const { return mGrid; }
+
+ //@}
+
+ /// Is the given grid one of the hard-coded default grids (Agni or Aditi)
+ bool isSystemGrid(const std::string& grid);
+
+ /// Is the selected grid one of the hard-coded default grids (Agni or Aditi)
bool isSystemGrid() { return isSystemGrid(mGrid); }
- // Mark this grid as a favorite that should be persisited on 'save'
- // this is currently used to persist a grid after a successful login
- void setFavorite() { mGridList[mGrid][GRID_IS_FAVORITE_VALUE] = TRUE; }
-
+
+ /// Is the selected grid a production grid?
bool isInProductionGrid();
- void saveFavorites();
- void clearFavorites();
+ /**
+ * yes, that's not a very helpful description.
+ * I don't really know why that is different from isSystemGrid()
+ * In practice, the implementation is that it
+ * @returns true if the login uri for the grid is the uri for MAINGRID
+ */
-protected:
+ private:
+
+ /// Add a grid to the list of grids
+ bool addGrid(LLSD& grid_info);
+ ///< @returns true if successfully added
void updateIsInProductionGrid();
- // helper function for adding the predefined grids
+ // helper function for adding the hard coded grids
void addSystemGrid(const std::string& label,
const std::string& name,
const std::string& login,
diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp
index cd300accb7..4ad0547379 100644
--- a/indra/newview/llviewerobject.cpp
+++ b/indra/newview/llviewerobject.cpp
@@ -199,6 +199,7 @@ LLViewerObject::LLViewerObject(const LLUUID &id, const LLPCode pcode, LLViewerRe
mID(id),
mLocalID(0),
mTotalCRC(0),
+ mListIndex(-1),
mTEImages(NULL),
mGLName(0),
mbCanSelect(TRUE),
@@ -235,7 +236,7 @@ LLViewerObject::LLViewerObject(const LLUUID &id, const LLPCode pcode, LLViewerRe
mNumFaces(0),
mTimeDilation(1.f),
mRotTime(0.f),
- mJointInfo(NULL),
+ mAngularVelocityRot(),
mState(0),
mMedia(NULL),
mClickAction(0),
@@ -265,6 +266,7 @@ LLViewerObject::LLViewerObject(const LLUUID &id, const LLPCode pcode, LLViewerRe
{
mPositionAgent = mRegionp->getOriginAgent();
}
+ resetRot();
LLViewerObject::sNumObjects++;
}
@@ -280,12 +282,6 @@ LLViewerObject::~LLViewerObject()
mInventory = NULL;
}
- if (mJointInfo)
- {
- delete mJointInfo;
- mJointInfo = NULL;
- }
-
if (mPartSourcep)
{
mPartSourcep->setDead();
@@ -336,9 +332,6 @@ void LLViewerObject::markDead()
if (getParent())
{
((LLViewerObject *)getParent())->removeChild(this);
- // go ahead and delete any jointinfo's that we find
- delete mJointInfo;
- mJointInfo = NULL;
}
// Mark itself as dead
@@ -432,7 +425,9 @@ void LLViewerObject::dump() const
llinfos << "PositionAgent: " << getPositionAgent() << llendl;
llinfos << "PositionGlobal: " << getPositionGlobal() << llendl;
llinfos << "Velocity: " << getVelocity() << llendl;
- if (mDrawable.notNull() && mDrawable->getNumFaces())
+ if (mDrawable.notNull() &&
+ mDrawable->getNumFaces() &&
+ mDrawable->getFace(0))
{
LLFacePool *poolp = mDrawable->getFace(0)->getPool();
if (poolp)
@@ -446,7 +441,7 @@ void LLViewerObject::dump() const
/*
llinfos << "Velocity: " << getVelocity() << llendl;
llinfos << "AnyOwner: " << permAnyOwner() << " YouOwner: " << permYouOwner() << " Edit: " << mPermEdit << llendl;
- llinfos << "UsePhysics: " << usePhysics() << " CanSelect " << mbCanSelect << " UserSelected " << mUserSelected << llendl;
+ llinfos << "UsePhysics: " << flagUsePhysics() << " CanSelect " << mbCanSelect << " UserSelected " << mUserSelected << llendl;
llinfos << "AppAngle: " << mAppAngle << llendl;
llinfos << "PixelArea: " << mPixelArea << llendl;
@@ -739,7 +734,7 @@ void LLViewerObject::addThisAndNonJointChildren(std::vector<LLViewerObject*>& ob
iter != mChildList.end(); iter++)
{
LLViewerObject* child = *iter;
- if ( (!child->isAvatar()) && (!child->isJointChild()))
+ if ( (!child->isAvatar()))
{
child->addThisAndNonJointChildren(objects);
}
@@ -789,7 +784,13 @@ BOOL LLViewerObject::setDrawableParent(LLDrawable* parentp)
}
LLDrawable* old_parent = mDrawable->mParent;
mDrawable->mParent = parentp;
-
+
+ if (parentp && mDrawable->isActive())
+ {
+ parentp->makeActive();
+ parentp->setState(LLDrawable::ACTIVE_CHILD);
+ }
+
gPipeline.markRebuild(mDrawable, LLDrawable::REBUILD_VOLUME, TRUE);
if( (old_parent != parentp && old_parent)
|| (parentp && parentp->isActive()))
@@ -1292,26 +1293,6 @@ U32 LLViewerObject::processUpdateMessage(LLMessageSystem *mesgsys,
}
}
- U8 joint_type = 0;
- mesgsys->getU8Fast(_PREHASH_ObjectData, _PREHASH_JointType, joint_type, block_num);
- if (joint_type)
- {
- // create new joint info
- if (!mJointInfo)
- {
- mJointInfo = new LLVOJointInfo;
- }
- mJointInfo->mJointType = (EHavokJointType) joint_type;
- mesgsys->getVector3Fast(_PREHASH_ObjectData, _PREHASH_JointPivot, mJointInfo->mPivot, block_num);
- mesgsys->getVector3Fast(_PREHASH_ObjectData, _PREHASH_JointAxisOrAnchor, mJointInfo->mAxisOrAnchor, block_num);
- }
- else if (mJointInfo)
- {
- // this joint info is no longer needed
- delete mJointInfo;
- mJointInfo = NULL;
- }
-
break;
}
@@ -1959,14 +1940,6 @@ U32 LLViewerObject::processUpdateMessage(LLMessageSystem *mesgsys,
cur_parentp->removeChild(this);
- if (mJointInfo && !parent_id)
- {
- // since this object is no longer parent-relative
- // we make sure we delete any joint info
- delete mJointInfo;
- mJointInfo = NULL;
- }
-
setChanged(MOVED | SILHOUETTE);
if (mDrawable.notNull())
@@ -2065,18 +2038,17 @@ U32 LLViewerObject::processUpdateMessage(LLMessageSystem *mesgsys,
}
}
- if (new_rot != mLastRot
+ if (new_rot != getRotation()
|| new_angv != old_angv)
{
- if (new_rot != mLastRot)
+ if (new_angv != old_angv)
{
- mLastRot = new_rot;
- setRotation(new_rot);
+ resetRot();
}
-
+
+ // Set the rotation of the object followed by adjusting for the accumulated angular velocity (llSetTargetOmega)
+ setRotation(new_rot * mAngularVelocityRot);
setChanged(ROTATED | SILHOUETTE);
-
- resetRot();
}
@@ -2094,9 +2066,15 @@ U32 LLViewerObject::processUpdateMessage(LLMessageSystem *mesgsys,
gPipeline.addDebugBlip(getPositionAgent(), color);
}
- if ((0.0f == vel_mag_sq) &&
- (0.0f == accel_mag_sq) &&
- (0.0f == getAngularVelocity().magVecSquared()))
+ const F32 MAG_CUTOFF = F_APPROXIMATELY_ZERO;
+
+ llassert(vel_mag_sq >= 0.f);
+ llassert(accel_mag_sq >= 0.f);
+ llassert(getAngularVelocity().magVecSquared() >= 0.f);
+
+ if ((MAG_CUTOFF >= vel_mag_sq) &&
+ (MAG_CUTOFF >= accel_mag_sq) &&
+ (MAG_CUTOFF >= getAngularVelocity().magVecSquared()))
{
mStatic = TRUE; // This object doesn't move!
}
@@ -2167,117 +2145,36 @@ BOOL LLViewerObject::isActive() const
-BOOL LLViewerObject::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time)
+void LLViewerObject::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time)
{
- static LLFastTimer::DeclareTimer ftm("Viewer Object");
- LLFastTimer t(ftm);
-
- if (mDead)
- {
- // It's dead. Don't update it.
- return TRUE;
- }
+ //static LLFastTimer::DeclareTimer ftm("Viewer Object");
+ //LLFastTimer t(ftm);
- // CRO - don't velocity interp linked objects!
- // Leviathan - but DO velocity interp joints
- if (!mStatic && sVelocityInterpolate && !isSelected())
+ if (!mDead)
{
- // calculate dt from last update
- F32 dt_raw = (F32)(time - mLastInterpUpdateSecs);
- F32 dt = mTimeDilation * dt_raw;
-
- if (!mJointInfo)
+ // CRO - don't velocity interp linked objects!
+ // Leviathan - but DO velocity interp joints
+ if (!mStatic && sVelocityInterpolate && !isSelected())
{
- applyAngularVelocity(dt);
- }
+ // calculate dt from last update
+ F32 dt_raw = (F32)(time - mLastInterpUpdateSecs);
+ F32 dt = mTimeDilation * dt_raw;
- LLViewerObject *parentp = (LLViewerObject *) getParent();
- if (mJointInfo)
- {
- if (parentp)
+ applyAngularVelocity(dt);
+
+ if (isAttachment())
{
- // do parent-relative stuff
- LLVector3 ang_vel = getAngularVelocity();
- F32 omega = ang_vel.magVecSquared();
- F32 angle = 0.0f;
- LLQuaternion dQ;
- if (omega > 0.00001f)
- {
- omega = sqrt(omega);
- angle = omega * dt;
- dQ.setQuat(angle, ang_vel);
- }
- LLVector3 pos = getPosition();
-
- if (HJT_HINGE == mJointInfo->mJointType)
- {
- // hinge = uniform circular motion
- LLVector3 parent_pivot = getVelocity();
- LLVector3 parent_axis = getAcceleration();
-
- angle = dt * (ang_vel * mJointInfo->mAxisOrAnchor); // AxisOrAnchor = axis
- dQ.setQuat(angle, mJointInfo->mAxisOrAnchor); // AxisOrAnchor = axis
- LLVector3 pivot_offset = pos - mJointInfo->mPivot; // pos in pivot-frame
- pivot_offset = pivot_offset * dQ; // new rotated pivot-frame pos
- pos = mJointInfo->mPivot + pivot_offset; // parent-frame
- LLViewerObject::setPosition(pos);
- LLQuaternion Q_PC = getRotation();
- setRotation(Q_PC * dQ);
- mLastInterpUpdateSecs = time;
- }
- else if (HJT_POINT == mJointInfo->mJointType)
- // || HJT_LPOINT == mJointInfo->mJointType)
- {
- // point-to-point = spin about axis and uniform circular motion
- // of axis about the pivot point
- //
- // NOTE: this interpolation scheme is not quite good enough to
- // reduce the bandwidth -- needs a gravitational correction.
- // Similarly for hinges with axes that deviate from vertical.
-
- LLQuaternion Q_PC = getRotation();
- Q_PC = Q_PC * dQ;
- setRotation(Q_PC);
-
- LLVector3 pivot_to_child = - mJointInfo->mAxisOrAnchor; // AxisOrAnchor = anchor
- pos = mJointInfo->mPivot + pivot_to_child * Q_PC;
- LLViewerObject::setPosition(pos);
- mLastInterpUpdateSecs = time;
- }
- /* else if (HJT_WHEEL == mJointInfo->mJointInfo)
- {
- // wheel = uniform rotation about axis, with linear
- // velocity interpolation (if any)
- LLVector3 parent_axis = getAcceleration(); // HACK -- accel stores the parent-axis (parent-frame)
-
- LLQuaternion Q_PC = getRotation();
-
- angle = dt * (parent_axis * ang_vel);
- dQ.setQuat(angle, parent_axis);
-
- Q_PC = Q_PC * dQ;
- setRotation(Q_PC);
-
- pos = getPosition() + dt * getVelocity();
- LLViewerObject::setPosition(pos);
- mLastInterpUpdateSecs = time;
- }*/
+ mLastInterpUpdateSecs = time;
+ return;
+ }
+ else
+ { // Move object based on it's velocity and rotation
+ interpolateLinearMotion(time, dt);
}
}
- else if (isAttachment())
- {
- mLastInterpUpdateSecs = time;
- return TRUE;
- }
- else
- { // Move object based on it's velocity and rotation
- interpolateLinearMotion(time, dt);
- }
- }
-
- updateDrawable(FALSE);
- return TRUE;
+ updateDrawable(FALSE);
+ }
}
@@ -2389,10 +2286,11 @@ void LLViewerObject::interpolateLinearMotion(const F64 & time, const F32 & dt)
{ // This will put the object underground, but we can't tell if it will stop
// at ground level or not
min_height = LLWorld::getInstance()->getMinAllowedZ(this, new_pos_global);
+ // Cap maximum height
+ new_pos.mV[VZ] = llmin(LLWorld::getInstance()->getRegionMaxHeight(), new_pos.mV[VZ]);
}
new_pos.mV[VZ] = llmax(min_height, new_pos.mV[VZ]);
- new_pos.mV[VZ] = llmin(LLWorld::getInstance()->getRegionMaxHeight(), new_pos.mV[VZ]);
// Check to see if it's going off the region
LLVector3 temp(new_pos);
@@ -2798,6 +2696,23 @@ void LLViewerObject::processTaskInvFile(void** user_data, S32 error_code, LLExtS
(object = gObjectList.findObject(ft->mTaskID)))
{
object->loadTaskInvFile(ft->mFilename);
+
+ LLInventoryObject::object_list_t::iterator it = object->mInventory->begin();
+ LLInventoryObject::object_list_t::iterator end = object->mInventory->end();
+ std::list<LLUUID>& pending_lst = object->mPendingInventoryItemsIDs;
+
+ for (; it != end && pending_lst.size(); ++it)
+ {
+ LLViewerInventoryItem* item = dynamic_cast<LLViewerInventoryItem*>(it->get());
+ if(item && item->getType() != LLAssetType::AT_CATEGORY)
+ {
+ std::list<LLUUID>::iterator id_it = std::find(pending_lst.begin(), pending_lst.begin(), item->getAssetUUID());
+ if (id_it != pending_lst.end())
+ {
+ pending_lst.erase(id_it);
+ }
+ }
+ }
}
else
{
@@ -2904,13 +2819,55 @@ void LLViewerObject::removeInventory(const LLUUID& item_id)
++mInventorySerialNum;
}
+bool LLViewerObject::isTextureInInventory(LLViewerInventoryItem* item)
+{
+ bool result = false;
+
+ if (item && LLAssetType::AT_TEXTURE == item->getType())
+ {
+ std::list<LLUUID>::iterator begin = mPendingInventoryItemsIDs.begin();
+ std::list<LLUUID>::iterator end = mPendingInventoryItemsIDs.end();
+
+ bool is_fetching = std::find(begin, end, item->getAssetUUID()) != end;
+ bool is_fetched = getInventoryItemByAsset(item->getAssetUUID()) != NULL;
+
+ result = is_fetched || is_fetching;
+ }
+
+ return result;
+}
+
+void LLViewerObject::updateTextureInventory(LLViewerInventoryItem* item, U8 key, bool is_new)
+{
+ if (item && !isTextureInInventory(item))
+ {
+ mPendingInventoryItemsIDs.push_back(item->getAssetUUID());
+ updateInventory(item, key, is_new);
+ }
+}
+
void LLViewerObject::updateInventory(
LLViewerInventoryItem* item,
U8 key,
bool is_new)
{
LLMemType mt(LLMemType::MTYPE_OBJECT);
-
+
+ std::list<LLUUID>::iterator begin = mPendingInventoryItemsIDs.begin();
+ std::list<LLUUID>::iterator end = mPendingInventoryItemsIDs.end();
+
+ bool is_fetching = std::find(begin, end, item->getAssetUUID()) != end;
+ bool is_fetched = getInventoryItemByAsset(item->getAssetUUID()) != NULL;
+
+ if (is_fetched || is_fetching)
+ {
+ return;
+ }
+ else
+ {
+ mPendingInventoryItemsIDs.push_back(item->getAssetUUID());
+ }
+
// This slices the object into what we're concerned about on the
// viewer. The simulator will take the permissions and transfer
// ownership.
@@ -3822,15 +3779,6 @@ void LLViewerObject::setPositionEdit(const LLVector3 &pos_edit, BOOL damped)
((LLViewerObject *)getParent())->setPositionEdit(pos_edit - position_offset);
updateDrawable(damped);
}
- else if (isJointChild())
- {
- // compute new parent-relative position
- LLViewerObject *parent = (LLViewerObject *) getParent();
- LLQuaternion inv_parent_rot = parent->getRotation();
- inv_parent_rot.transQuat();
- LLVector3 pos_parent = (pos_edit - parent->getPositionRegion()) * inv_parent_rot;
- LLViewerObject::setPosition(pos_parent, damped);
- }
else
{
LLViewerObject::setPosition(pos_edit, damped);
@@ -3844,8 +3792,7 @@ LLViewerObject* LLViewerObject::getRootEdit() const
{
const LLViewerObject* root = this;
while (root->mParent
- && !(root->mJointInfo
- || ((LLViewerObject*)root->mParent)->isAvatar()) )
+ && !((LLViewerObject*)root->mParent)->isAvatar())
{
root = (LLViewerObject*)root->mParent;
}
@@ -4038,38 +3985,6 @@ void LLViewerObject::sendMaterialUpdate() const
}
-// formerly send_object_rotation
-void LLViewerObject::sendRotationUpdate() const
-{
- LLViewerRegion* regionp = getRegion();
- if(!regionp) return;
- gMessageSystem->newMessageFast(_PREHASH_ObjectRotation);
- gMessageSystem->nextBlockFast(_PREHASH_AgentData);
- gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgent.getID() );
- gMessageSystem->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
- gMessageSystem->nextBlockFast(_PREHASH_ObjectData);
- gMessageSystem->addU32Fast(_PREHASH_ObjectLocalID, mLocalID);
- gMessageSystem->addQuatFast(_PREHASH_Rotation, getRotationEdit());
- //llinfos << "Sent rotation " << getRotationEdit() << llendl;
- gMessageSystem->sendReliable( regionp->getHost() );
-}
-
-/* Obsolete, we use MultipleObjectUpdate instead
-//// formerly send_object_position_global
-//void LLViewerObject::sendPositionUpdate() const
-//{
-// gMessageSystem->newMessageFast(_PREHASH_ObjectPosition);
-// gMessageSystem->nextBlockFast(_PREHASH_AgentData);
-// gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgent.getID() );
-// gMessageSystem->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
-// gMessageSystem->nextBlockFast(_PREHASH_ObjectData);
-// gMessageSystem->addU32Fast(_PREHASH_ObjectLocalID, mLocalID );
-// gMessageSystem->addVector3Fast(_PREHASH_Position, getPositionRegion());
-// LLViewerRegion* regionp = getRegion();
-// gMessageSystem->sendReliable(regionp->getHost());
-//}
-*/
-
//formerly send_object_shape(LLViewerObject *object)
void LLViewerObject::sendShapeUpdate()
{
@@ -4477,7 +4392,11 @@ U32 LLViewerObject::getNumVertices() const
num_faces = mDrawable->getNumFaces();
for (i = 0; i < num_faces; i++)
{
- num_vertices += mDrawable->getFace(i)->getGeomCount();
+ LLFace * facep = mDrawable->getFace(i);
+ if (facep)
+ {
+ num_vertices += facep->getGeomCount();
+ }
}
}
return num_vertices;
@@ -4492,7 +4411,11 @@ U32 LLViewerObject::getNumIndices() const
num_faces = mDrawable->getNumFaces();
for (i = 0; i < num_faces; i++)
{
- num_indices += mDrawable->getFace(i)->getIndicesCount();
+ LLFace * facep = mDrawable->getFace(i);
+ if (facep)
+ {
+ num_indices += facep->getIndicesCount();
+ }
}
}
return num_indices;
@@ -4578,19 +4501,11 @@ void LLViewerObject::clearIcon()
LLViewerObject* LLViewerObject::getSubParent()
{
- if (isJointChild())
- {
- return this;
- }
return (LLViewerObject*) getParent();
}
const LLViewerObject* LLViewerObject::getSubParent() const
{
- if (isJointChild())
- {
- return this;
- }
return (const LLViewerObject*) getParent();
}
@@ -4769,9 +4684,11 @@ void LLViewerObject::deleteParticleSource()
// virtual
void LLViewerObject::updateDrawable(BOOL force_damped)
{
- if (mDrawable.notNull() &&
- !mDrawable->isState(LLDrawable::ON_MOVE_LIST) &&
- isChanged(MOVED))
+ if (!isChanged(MOVED))
+ { //most common case, having an empty if case here makes for better branch prediction
+ }
+ else if (mDrawable.notNull() &&
+ !mDrawable->isState(LLDrawable::ON_MOVE_LIST))
{
BOOL damped_motion =
!isChanged(SHIFTED) && // not shifted between regions this frame and...
@@ -5136,7 +5053,7 @@ BOOL LLViewerObject::permAnyOwner() const
{
if (isRootEdit())
{
- return ((mFlags & FLAGS_OBJECT_ANY_OWNER) != 0);
+ return flagObjectAnyOwner();
}
else
{
@@ -5158,7 +5075,7 @@ BOOL LLViewerObject::permYouOwner() const
return TRUE;
}
# endif
- return ((mFlags & FLAGS_OBJECT_YOU_OWNER) != 0);
+ return flagObjectYouOwner();
#endif
}
else
@@ -5172,7 +5089,7 @@ BOOL LLViewerObject::permGroupOwner() const
{
if (isRootEdit())
{
- return ((mFlags & FLAGS_OBJECT_GROUP_OWNED) != 0);
+ return flagObjectGroupOwned();
}
else
{
@@ -5195,7 +5112,7 @@ BOOL LLViewerObject::permOwnerModify() const
return TRUE;
}
# endif
- return ((mFlags & FLAGS_OBJECT_OWNER_MODIFY) != 0);
+ return flagObjectOwnerModify();
#endif
}
else
@@ -5219,7 +5136,7 @@ BOOL LLViewerObject::permModify() const
return TRUE;
}
# endif
- return ((mFlags & FLAGS_OBJECT_MODIFY) != 0);
+ return flagObjectModify();
#endif
}
else
@@ -5243,7 +5160,7 @@ BOOL LLViewerObject::permCopy() const
return TRUE;
}
# endif
- return ((mFlags & FLAGS_OBJECT_COPY) != 0);
+ return flagObjectCopy();
#endif
}
else
@@ -5267,7 +5184,7 @@ BOOL LLViewerObject::permMove() const
return TRUE;
}
# endif
- return ((mFlags & FLAGS_OBJECT_MOVE) != 0);
+ return flagObjectMove();
#endif
}
else
@@ -5291,7 +5208,7 @@ BOOL LLViewerObject::permTransfer() const
return TRUE;
}
# endif
- return ((mFlags & FLAGS_OBJECT_TRANSFER) != 0);
+ return flagObjectTransfer();
#endif
}
else
@@ -5334,21 +5251,19 @@ void LLViewerObject::markForUpdate(BOOL priority)
}
}
+bool LLViewerObject::isPermanentEnforced() const
+{
+ return flagObjectPermanent() && (mRegionp != gAgent.getRegion()) && !gAgent.isGodlike();
+}
+
bool LLViewerObject::getIncludeInSearch() const
{
- return ((mFlags & FLAGS_INCLUDE_IN_SEARCH) != 0);
+ return flagIncludeInSearch();
}
void LLViewerObject::setIncludeInSearch(bool include_in_search)
{
- if (include_in_search)
- {
- mFlags |= FLAGS_INCLUDE_IN_SEARCH;
- }
- else
- {
- mFlags &= ~FLAGS_INCLUDE_IN_SEARCH;
- }
+ setFlags(FLAGS_INCLUDE_IN_SEARCH, include_in_search);
}
void LLViewerObject::setRegion(LLViewerRegion *regionp)
@@ -5387,8 +5302,8 @@ void LLViewerObject::updateRegion(LLViewerRegion *regionp)
bool LLViewerObject::specialHoverCursor() const
{
- return (mFlags & FLAGS_USE_PHYSICS)
- || (mFlags & FLAGS_HANDLE_TOUCH)
+ return flagUsePhysics()
+ || flagHandleTouch()
|| (mClickAction != 0);
}
@@ -5401,10 +5316,15 @@ void LLViewerObject::updateFlags(BOOL physics_changed)
gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgent.getID() );
gMessageSystem->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
gMessageSystem->addU32Fast(_PREHASH_ObjectLocalID, getLocalID() );
- gMessageSystem->addBOOLFast(_PREHASH_UsePhysics, usePhysics() );
+ gMessageSystem->addBOOLFast(_PREHASH_UsePhysics, flagUsePhysics() );
gMessageSystem->addBOOL("IsTemporary", flagTemporaryOnRez() );
gMessageSystem->addBOOL("IsPhantom", flagPhantom() );
- gMessageSystem->addBOOL("CastsShadows", flagCastShadows() );
+
+ // stinson 02/28/2012 : This CastsShadows BOOL is no longer used in either the viewer or the simulator
+ // The simulator code does not even unpack this value when the message is received.
+ // This could be potentially hijacked in the future for another use should the urgent need arise.
+ gMessageSystem->addBOOL("CastsShadows", FALSE );
+
if (physics_changed)
{
gMessageSystem->nextBlock("ExtraPhysics");
@@ -5419,6 +5339,19 @@ void LLViewerObject::updateFlags(BOOL physics_changed)
BOOL LLViewerObject::setFlags(U32 flags, BOOL state)
{
+ BOOL setit = setFlagsWithoutUpdate(flags, state);
+
+ // BUG: Sometimes viewer physics and simulator physics get
+ // out of sync. To fix this, always send update to simulator.
+// if (setit)
+ {
+ updateFlags();
+ }
+ return setit;
+}
+
+BOOL LLViewerObject::setFlagsWithoutUpdate(U32 flags, BOOL state)
+{
BOOL setit = FALSE;
if (state)
{
@@ -5436,21 +5369,17 @@ BOOL LLViewerObject::setFlags(U32 flags, BOOL state)
setit = TRUE;
}
}
-
- // BUG: Sometimes viewer physics and simulator physics get
- // out of sync. To fix this, always send update to simulator.
-// if (setit)
- {
- updateFlags();
- }
return setit;
}
void LLViewerObject::setPhysicsShapeType(U8 type)
{
mPhysicsShapeUnknown = false;
- mPhysicsShapeType = type;
- mCostStale = true;
+ if (type != mPhysicsShapeType)
+ {
+ mPhysicsShapeType = type;
+ mCostStale = true;
+ }
}
void LLViewerObject::setPhysicsGravity(F32 gravity)
@@ -5477,7 +5406,6 @@ U8 LLViewerObject::getPhysicsShapeType() const
{
if (mPhysicsShapeUnknown)
{
- mPhysicsShapeUnknown = false;
gObjectList.updatePhysicsFlags(this);
}
@@ -5499,8 +5427,13 @@ void LLViewerObject::applyAngularVelocity(F32 dt)
ang_vel *= 1.f/omega;
+ // calculate the delta increment based on the object's angular velocity
dQ.setQuat(angle, ang_vel);
+
+ // accumulate the angular velocity rotations to re-apply in the case of an object update
+ mAngularVelocityRot *= dQ;
+ // Just apply the delta increment to the current rotation
setRotation(getRotation()*dQ);
setChanged(MOVED | SILHOUETTE);
}
@@ -5509,6 +5442,9 @@ void LLViewerObject::applyAngularVelocity(F32 dt)
void LLViewerObject::resetRot()
{
mRotTime = 0.0f;
+
+ // Reset the accumulated angular velocity rotation
+ mAngularVelocityRot.loadIdentity();
}
U32 LLViewerObject::getPartitionType() const
diff --git a/indra/newview/llviewerobject.h b/indra/newview/llviewerobject.h
index c8152e1539..e60c8a8d52 100644
--- a/indra/newview/llviewerobject.h
+++ b/indra/newview/llviewerobject.h
@@ -88,18 +88,6 @@ typedef void (*inventory_callback)(LLViewerObject*,
S32 serial_num,
void*);
-// a small struct for keeping track of joints
-struct LLVOJointInfo
-{
- EHavokJointType mJointType;
- LLVector3 mPivot; // parent-frame
- // whether the below an axis or anchor (and thus its frame)
- // depends on the joint type:
- // HINGE ==> axis=parent-frame
- // P2P ==> anchor=child-frame
- LLVector3 mAxisOrAnchor;
-};
-
// for exporting textured materials from SL
struct LLMaterialExportInfo
{
@@ -157,7 +145,7 @@ public:
LLNameValue* getNVPair(const std::string& name) const; // null if no name value pair by that name
// Object create and update functions
- virtual BOOL idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time);
+ virtual void idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time);
// Types of media we can associate
enum { MEDIA_NONE = 0, MEDIA_SET = 1 };
@@ -188,8 +176,6 @@ public:
virtual void updateRadius() {};
virtual F32 getVObjRadius() const; // default implemenation is mDrawable->getRadius()
- BOOL isJointChild() const { return mJointInfo ? TRUE : FALSE; }
- EHavokJointType getJointType() const { return mJointInfo ? mJointInfo->mJointType : HJT_INVALID; }
// for jointed and other parent-relative hacks
LLViewerObject* getSubParent();
const LLViewerObject* getSubParent() const;
@@ -229,6 +215,8 @@ public:
const LLUUID &getID() const { return mID; }
U32 getLocalID() const { return mLocalID; }
U32 getCRC() const { return mTotalCRC; }
+ S32 getListIndex() const { return mListIndex; }
+ void setListIndex(S32 idx) { mListIndex = idx; }
virtual BOOL isFlexible() const { return FALSE; }
virtual BOOL isSculpted() const { return FALSE; }
@@ -308,7 +296,6 @@ public:
inline void setRotation(const F32 x, const F32 y, const F32 z, BOOL damped = FALSE);
inline void setRotation(const LLQuaternion& quat, BOOL damped = FALSE);
- void sendRotationUpdate() const;
/*virtual*/ void setNumTEs(const U8 num_tes);
/*virtual*/ void setTE(const U8 te, const LLTextureEntry &texture_entry);
@@ -432,12 +419,15 @@ public:
// manager until we have better iterators.
void updateInventory(LLViewerInventoryItem* item, U8 key, bool is_new);
void updateInventoryLocal(LLInventoryItem* item, U8 key); // Update without messaging.
+ void updateTextureInventory(LLViewerInventoryItem* item, U8 key, bool is_new);
LLInventoryObject* getInventoryObject(const LLUUID& item_id);
void getInventoryContents(LLInventoryObject::object_list_t& objects);
LLInventoryObject* getInventoryRoot();
LLViewerInventoryItem* getInventoryItemByAsset(const LLUUID& asset_id);
S16 getInventorySerial() const { return mInventorySerialNum; }
+ bool isTextureInInventory(LLViewerInventoryItem* item);
+
// These functions does viewer-side only object inventory modifications
void updateViewerInventoryAsset(
const LLViewerInventoryItem* item,
@@ -468,26 +458,37 @@ public:
BOOL permCopy() const;
BOOL permMove() const;
BOOL permTransfer() const;
- inline BOOL usePhysics() const { return ((mFlags & FLAGS_USE_PHYSICS) != 0); }
+ inline BOOL flagUsePhysics() const { return ((mFlags & FLAGS_USE_PHYSICS) != 0); }
+ inline BOOL flagObjectAnyOwner() const { return ((mFlags & FLAGS_OBJECT_ANY_OWNER) != 0); }
+ inline BOOL flagObjectYouOwner() const { return ((mFlags & FLAGS_OBJECT_YOU_OWNER) != 0); }
+ inline BOOL flagObjectGroupOwned() const { return ((mFlags & FLAGS_OBJECT_GROUP_OWNED) != 0); }
+ inline BOOL flagObjectOwnerModify() const { return ((mFlags & FLAGS_OBJECT_OWNER_MODIFY) != 0); }
+ inline BOOL flagObjectModify() const { return ((mFlags & FLAGS_OBJECT_MODIFY) != 0); }
+ inline BOOL flagObjectCopy() const { return ((mFlags & FLAGS_OBJECT_COPY) != 0); }
+ inline BOOL flagObjectMove() const { return ((mFlags & FLAGS_OBJECT_MOVE) != 0); }
+ inline BOOL flagObjectTransfer() const { return ((mFlags & FLAGS_OBJECT_TRANSFER) != 0); }
+ inline BOOL flagObjectPermanent() const { return ((mFlags & FLAGS_AFFECTS_NAVMESH) != 0); }
+ inline BOOL flagCharacter() const { return ((mFlags & FLAGS_CHARACTER) != 0); }
+ inline BOOL flagVolumeDetect() const { return ((mFlags & FLAGS_VOLUME_DETECT) != 0); }
+ inline BOOL flagIncludeInSearch() const { return ((mFlags & FLAGS_INCLUDE_IN_SEARCH) != 0); }
inline BOOL flagScripted() const { return ((mFlags & FLAGS_SCRIPTED) != 0); }
inline BOOL flagHandleTouch() const { return ((mFlags & FLAGS_HANDLE_TOUCH) != 0); }
inline BOOL flagTakesMoney() const { return ((mFlags & FLAGS_TAKES_MONEY) != 0); }
inline BOOL flagPhantom() const { return ((mFlags & FLAGS_PHANTOM) != 0); }
inline BOOL flagInventoryEmpty() const { return ((mFlags & FLAGS_INVENTORY_EMPTY) != 0); }
- inline BOOL flagCastShadows() const { return ((mFlags & FLAGS_CAST_SHADOWS) != 0); }
inline BOOL flagAllowInventoryAdd() const { return ((mFlags & FLAGS_ALLOW_INVENTORY_DROP) != 0); }
- inline BOOL flagTemporary() const { return ((mFlags & FLAGS_TEMPORARY) != 0); }
inline BOOL flagTemporaryOnRez() const { return ((mFlags & FLAGS_TEMPORARY_ON_REZ) != 0); }
inline BOOL flagAnimSource() const { return ((mFlags & FLAGS_ANIM_SOURCE) != 0); }
inline BOOL flagCameraSource() const { return ((mFlags & FLAGS_CAMERA_SOURCE) != 0); }
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 isPermanentEnforced() const;
bool getIncludeInSearch() const;
void setIncludeInSearch(bool include_in_search);
@@ -504,6 +505,7 @@ public:
void updateFlags(BOOL physics_changed = FALSE);
BOOL setFlags(U32 flag, BOOL state);
+ BOOL setFlagsWithoutUpdate(U32 flag, BOOL state);
void setPhysicsShapeType(U8 type);
void setPhysicsGravity(F32 gravity);
void setPhysicsFriction(F32 friction);
@@ -589,15 +591,20 @@ public:
// Last total CRC received from sim, used for caching
U32 mTotalCRC;
+ // index into LLViewerObjectList::mActiveObjects or -1 if not in list
+ S32 mListIndex;
+
LLPointer<LLViewerTexture> *mTEImages;
// Selection, picking and rendering variables
U32 mGLName; // GL "name" used by selection code
BOOL mbCanSelect; // true if user can select this object by clicking
+private:
// Grabbed from UPDATE_FLAGS
U32 mFlags;
+public:
// Sent to sim in UPDATE_FLAGS, received in ObjectPhysicsProperties
U8 mPhysicsShapeType;
F32 mPhysicsGravity;
@@ -684,6 +691,10 @@ protected:
F32 mAppAngle; // Apparent visual arc in degrees
F32 mPixelArea; // Apparent area in pixels
+ // IDs of of all items in the object's content which are added to the object's content,
+ // but not updated on the server yet. After item was updated, its ID will be removed from this list.
+ std::list<LLUUID> mPendingInventoryItemsIDs;
+
// This is the object's inventory from the viewer's perspective.
LLInventoryObject::object_list_t* mInventory;
class LLInventoryCallbackInfo
@@ -710,9 +721,8 @@ protected:
F32 mTimeDilation; // Time dilation sent with the object.
F32 mRotTime; // Amount (in seconds) that object has rotated according to angular velocity (llSetTargetOmega)
- LLQuaternion mLastRot; // last rotation received from the simulator
+ LLQuaternion mAngularVelocityRot; // accumulated rotation from the angular velocity computations
- LLVOJointInfo* mJointInfo;
U8 mState; // legacy
LLViewerObjectMedia* mMedia; // NULL if no media associated
U8 mClickAction;
diff --git a/indra/newview/llviewerobjectlist.cpp b/indra/newview/llviewerobjectlist.cpp
index 54ccfb9aae..e399b45cba 100644
--- a/indra/newview/llviewerobjectlist.cpp
+++ b/indra/newview/llviewerobjectlist.cpp
@@ -49,6 +49,8 @@
#include "llstring.h"
#include "llhudnametag.h"
#include "lldrawable.h"
+#include "llflexibleobject.h"
+#include "llviewertextureanim.h"
#include "xform.h"
#include "llsky.h"
#include "llviewercamera.h"
@@ -78,11 +80,9 @@
extern F32 gMinObjectDistance;
extern BOOL gAnimateTextures;
-void dialog_refresh_all();
+#define MAX_CONCURRENT_PHYSICS_REQUESTS 256
-#define CULL_VIS
-//#define ORPHAN_SPAM
-//#define IGNORE_DEAD
+void dialog_refresh_all();
// Global lists of objects - should go away soon.
LLViewerObjectList gObjectList;
@@ -386,9 +386,7 @@ void LLViewerObjectList::processObjectUpdate(LLMessageSystem *mesgsys,
}
else if (compressed)
{
- U8 compbuffer[2048];
S32 uncompressed_length = 2048;
- S32 compressed_length;
compressed_dp.reset();
U32 flags = 0;
@@ -397,24 +395,9 @@ void LLViewerObjectList::processObjectUpdate(LLMessageSystem *mesgsys,
mesgsys->getU32Fast(_PREHASH_ObjectData, _PREHASH_UpdateFlags, flags, i);
}
- // I don't think we ever use this flag from the server. DK 2010/12/09
- if (flags & FLAGS_ZLIB_COMPRESSED)
- {
- //llinfos << "TEST: flags & FLAGS_ZLIB_COMPRESSED" << llendl;
- compressed_length = mesgsys->getSizeFast(_PREHASH_ObjectData, i, _PREHASH_Data);
- mesgsys->getBinaryDataFast(_PREHASH_ObjectData, _PREHASH_Data, compbuffer, 0, i);
- uncompressed_length = 2048;
- uncompress(compressed_dpbuffer, (unsigned long *)&uncompressed_length,
- compbuffer, compressed_length);
- compressed_dp.assignBuffer(compressed_dpbuffer, uncompressed_length);
- }
- else
- {
- uncompressed_length = mesgsys->getSizeFast(_PREHASH_ObjectData, i, _PREHASH_Data);
- mesgsys->getBinaryDataFast(_PREHASH_ObjectData, _PREHASH_Data, compressed_dpbuffer, 0, i);
- compressed_dp.assignBuffer(compressed_dpbuffer, uncompressed_length);
- }
-
+ uncompressed_length = mesgsys->getSizeFast(_PREHASH_ObjectData, i, _PREHASH_Data);
+ mesgsys->getBinaryDataFast(_PREHASH_ObjectData, _PREHASH_Data, compressed_dpbuffer, 0, i);
+ compressed_dp.assignBuffer(compressed_dpbuffer, uncompressed_length);
if (update_type != OUT_TERSE_IMPROVED) // OUT_FULL_COMPRESSED only?
{
@@ -926,26 +909,33 @@ void LLViewerObjectList::update(LLAgent &agent, LLWorld &world)
const F64 frame_time = LLFrameTimer::getElapsedSeconds();
- std::vector<LLViewerObject*> kill_list;
- S32 num_active_objects = 0;
LLViewerObject *objectp = NULL;
// Make a copy of the list in case something in idleUpdate() messes with it
- std::vector<LLViewerObject*> idle_list;
-
+ static std::vector<LLViewerObject*> idle_list;
+
+ U32 idle_count = 0;
+
static LLFastTimer::DeclareTimer idle_copy("Idle Copy");
{
LLFastTimer t(idle_copy);
- idle_list.reserve( mActiveObjects.size() );
-
- for (std::set<LLPointer<LLViewerObject> >::iterator active_iter = mActiveObjects.begin();
+
+ for (std::vector<LLPointer<LLViewerObject> >::iterator active_iter = mActiveObjects.begin();
active_iter != mActiveObjects.end(); active_iter++)
{
objectp = *active_iter;
if (objectp)
{
- idle_list.push_back( objectp );
+ if (idle_count >= idle_list.size())
+ {
+ idle_list.push_back( objectp );
+ }
+ else
+ {
+ idle_list[idle_count] = objectp;
+ }
+ ++idle_count;
}
else
{ // There shouldn't be any NULL pointers in the list, but they have caused
@@ -955,10 +945,13 @@ void LLViewerObjectList::update(LLAgent &agent, LLWorld &world)
}
}
+ std::vector<LLViewerObject*>::iterator idle_end = idle_list.begin()+idle_count;
+
if (gSavedSettings.getBOOL("FreezeTime"))
- {
+ {
+
for (std::vector<LLViewerObject*>::iterator iter = idle_list.begin();
- iter != idle_list.end(); iter++)
+ iter != idle_end; iter++)
{
objectp = *iter;
if (objectp->isAvatar())
@@ -970,27 +963,23 @@ void LLViewerObjectList::update(LLAgent &agent, LLWorld &world)
else
{
for (std::vector<LLViewerObject*>::iterator idle_iter = idle_list.begin();
- idle_iter != idle_list.end(); idle_iter++)
+ idle_iter != idle_end; idle_iter++)
{
objectp = *idle_iter;
- if (!objectp->idleUpdate(agent, world, frame_time))
- {
- // If Idle Update returns false, kill object!
- kill_list.push_back(objectp);
- }
- else
- {
- num_active_objects++;
- }
- }
- for (std::vector<LLViewerObject*>::iterator kill_iter = kill_list.begin();
- kill_iter != kill_list.end(); kill_iter++)
- {
- objectp = *kill_iter;
- killObject(objectp);
+ llassert(objectp->isActive());
+ objectp->idleUpdate(agent, world, frame_time);
+
}
+
+ //update flexible objects
+ LLVolumeImplFlexible::updateClass();
+
+ //update animated textures
+ LLViewerTextureAnim::updateClass();
}
+
+
fetchObjectCosts();
fetchPhysicsFlags();
@@ -1057,7 +1046,7 @@ void LLViewerObjectList::update(LLAgent &agent, LLWorld &world)
*/
LLViewerStats::getInstance()->mNumObjectsStat.addValue((S32) mObjects.size());
- LLViewerStats::getInstance()->mNumActiveObjectsStat.addValue(num_active_objects);
+ LLViewerStats::getInstance()->mNumActiveObjectsStat.addValue(idle_count);
LLViewerStats::getInstance()->mNumSizeCulledStat.addValue(mNumSizeCulled);
LLViewerStats::getInstance()->mNumVisCulledStat.addValue(mNumVisCulled);
}
@@ -1078,8 +1067,6 @@ void LLViewerObjectList::fetchObjectCosts()
LLSD id_list;
U32 object_index = 0;
- U32 count = 0;
-
for (
std::set<LLUUID>::iterator iter = mStaleObjectCost.begin();
iter != mStaleObjectCost.end();
@@ -1096,7 +1083,7 @@ void LLViewerObjectList::fetchObjectCosts()
mStaleObjectCost.erase(iter++);
- if (count++ >= 450)
+ if (object_index >= MAX_CONCURRENT_PHYSICS_REQUESTS)
{
break;
}
@@ -1141,7 +1128,7 @@ void LLViewerObjectList::fetchPhysicsFlags()
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.
@@ -1151,12 +1138,14 @@ void LLViewerObjectList::fetchPhysicsFlags()
mPendingPhysicsFlags.insert(*iter);
id_list[object_index++] = *iter;
}
- }
- // id_list should now contain all
- // requests in mStalePhysicsFlags before, so clear
- // it now
- mStalePhysicsFlags.clear();
+ mStalePhysicsFlags.erase(iter++);
+
+ if (object_index >= MAX_CONCURRENT_PHYSICS_REQUESTS)
+ {
+ break;
+ }
+ }
if ( id_list.size() > 0 )
{
@@ -1218,7 +1207,7 @@ void LLViewerObjectList::cleanupReferences(LLViewerObject *objectp)
{
//llinfos << "Removing " << objectp->mID << " " << objectp->getPCodeString() << " from active list in cleanupReferences." << llendl;
objectp->setOnActiveList(FALSE);
- mActiveObjects.erase(objectp);
+ removeFromActiveList(objectp);
}
if (objectp->isOnMap())
@@ -1395,6 +1384,27 @@ void LLViewerObjectList::cleanDeadObjects(BOOL use_timer)
mNumDeadObjects = 0;
}
+void LLViewerObjectList::removeFromActiveList(LLViewerObject* objectp)
+{
+ S32 idx = objectp->getListIndex();
+ if (idx != -1)
+ { //remove by moving last element to this object's position
+ llassert(mActiveObjects[idx] == objectp);
+
+ objectp->setListIndex(-1);
+
+ S32 last_index = mActiveObjects.size()-1;
+
+ if (idx != last_index)
+ {
+ mActiveObjects[idx] = mActiveObjects[last_index];
+ mActiveObjects[idx]->setListIndex(idx);
+ }
+
+ mActiveObjects.pop_back();
+ }
+}
+
void LLViewerObjectList::updateActive(LLViewerObject *objectp)
{
LLMemType mt(LLMemType::MTYPE_OBJECT);
@@ -1409,16 +1419,35 @@ void LLViewerObjectList::updateActive(LLViewerObject *objectp)
if (active)
{
//llinfos << "Adding " << objectp->mID << " " << objectp->getPCodeString() << " to active list." << llendl;
- mActiveObjects.insert(objectp);
- objectp->setOnActiveList(TRUE);
+ S32 idx = objectp->getListIndex();
+ if (idx <= -1)
+ {
+ mActiveObjects.push_back(objectp);
+ objectp->setListIndex(mActiveObjects.size()-1);
+ objectp->setOnActiveList(TRUE);
+ }
+ else
+ {
+ llassert(idx < mActiveObjects.size());
+ llassert(mActiveObjects[idx] == objectp);
+
+ if (idx >= mActiveObjects.size() ||
+ mActiveObjects[idx] != objectp)
+ {
+ llwarns << "Invalid object list index detected!" << llendl;
+ }
+ }
}
else
{
//llinfos << "Removing " << objectp->mID << " " << objectp->getPCodeString() << " from active list." << llendl;
- mActiveObjects.erase(objectp);
+ removeFromActiveList(objectp);
objectp->setOnActiveList(FALSE);
}
}
+
+ llassert(objectp->isActive() || objectp->getListIndex() == -1);
+
}
void LLViewerObjectList::updateObjectCost(LLViewerObject* object)
@@ -1489,6 +1518,10 @@ void LLViewerObjectList::onPhysicsFlagsFetchFailure(const LLUUID& object_id)
mPendingPhysicsFlags.erase(object_id);
}
+static LLFastTimer::DeclareTimer FTM_SHIFT_OBJECTS("Shift Objects");
+static LLFastTimer::DeclareTimer FTM_PIPELINE_SHIFT("Pipeline Shift");
+static LLFastTimer::DeclareTimer FTM_REGION_SHIFT("Region Shift");
+
void LLViewerObjectList::shiftObjects(const LLVector3 &offset)
{
// This is called when we shift our origin when we cross region boundaries...
@@ -1500,6 +1533,8 @@ void LLViewerObjectList::shiftObjects(const LLVector3 &offset)
return;
}
+ LLFastTimer t(FTM_SHIFT_OBJECTS);
+
LLViewerObject *objectp;
for (vobj_list_t::iterator iter = mObjects.begin(); iter != mObjects.end(); ++iter)
{
@@ -1516,8 +1551,15 @@ void LLViewerObjectList::shiftObjects(const LLVector3 &offset)
}
}
- gPipeline.shiftObjects(offset);
- LLWorld::getInstance()->shiftRegions(offset);
+ {
+ LLFastTimer t(FTM_PIPELINE_SHIFT);
+ gPipeline.shiftObjects(offset);
+ }
+
+ {
+ LLFastTimer t(FTM_REGION_SHIFT);
+ LLWorld::getInstance()->shiftRegions(offset);
+ }
}
void LLViewerObjectList::repartitionObjects()
@@ -1721,7 +1763,10 @@ void LLViewerObjectList::generatePickList(LLCamera &camera)
LLViewerObject* last_objectp = NULL;
for (S32 face_num = 0; face_num < drawablep->getNumFaces(); face_num++)
{
- LLViewerObject* objectp = drawablep->getFace(face_num)->getViewerObject();
+ LLFace * facep = drawablep->getFace(face_num);
+ if (!facep) continue;
+
+ LLViewerObject* objectp = facep->getViewerObject();
if (objectp && objectp != last_objectp)
{
diff --git a/indra/newview/llviewerobjectlist.h b/indra/newview/llviewerobjectlist.h
index 64925f46ae..9936432a71 100644
--- a/indra/newview/llviewerobjectlist.h
+++ b/indra/newview/llviewerobjectlist.h
@@ -118,7 +118,9 @@ public:
void dirtyAllObjectInventory();
+ void removeFromActiveList(LLViewerObject* objectp);
void updateActive(LLViewerObject *objectp);
+
void updateAvatarVisibility();
// Selection related stuff
@@ -197,7 +199,7 @@ protected:
typedef std::vector<LLPointer<LLViewerObject> > vobj_list_t;
vobj_list_t mObjects;
- std::set<LLPointer<LLViewerObject> > mActiveObjects;
+ std::vector<LLPointer<LLViewerObject> > mActiveObjects;
vobj_list_t mMapObjects;
diff --git a/indra/newview/llviewerparcelmgr.cpp b/indra/newview/llviewerparcelmgr.cpp
index 9db784101d..77e382b8c7 100644
--- a/indra/newview/llviewerparcelmgr.cpp
+++ b/indra/newview/llviewerparcelmgr.cpp
@@ -82,7 +82,6 @@ LLPointer<LLViewerTexture> sBlockedImage;
LLPointer<LLViewerTexture> sPassImage;
// Local functions
-void optionally_start_music(const std::string& music_url);
void callback_start_music(S32 option, void* data);
void optionally_prepare_video(const LLParcel *parcelp);
void callback_prepare_video(S32 option, void* data);
@@ -546,9 +545,6 @@ LLParcelSelectionHandle LLViewerParcelMgr::selectLand(const LLVector3d &corner1,
mRequestResult = PARCEL_RESULT_NO_DATA;
- // clear the list of segments to prevent flashing
- resetSegments(mHighlightSegments);
-
mFloatingParcelSelection->setParcel(mCurrentParcel);
mCurrentParcelSelection->setParcel(NULL);
mCurrentParcelSelection = new LLParcelSelection(mCurrentParcel);
@@ -1589,7 +1585,7 @@ void LLViewerParcelMgr::processParcelProperties(LLMessageSystem *msg, void **use
if (instance->mTeleportInProgress)
{
instance->mTeleportInProgress = FALSE;
- instance->mTeleportFinishedSignal(gAgent.getPositionGlobal());
+ instance->mTeleportFinishedSignal(gAgent.getPositionGlobal(), false);
}
}
}
@@ -1662,9 +1658,6 @@ void LLViewerParcelMgr::processParcelProperties(LLMessageSystem *msg, void **use
// Request access list information for this land
parcel_mgr.sendParcelAccessListRequest(AL_ACCESS | AL_BAN);
- // Request the media url filter list for this land
- parcel_mgr.requestParcelMediaURLFilter();
-
// Request dwell for this land, if it's not public land.
parcel_mgr.mSelectedDwell = DWELL_NAN;
if (0 != local_id)
@@ -1773,13 +1766,13 @@ void LLViewerParcelMgr::processParcelProperties(LLMessageSystem *msg, void **use
};
}
-void optionally_start_music(const std::string& music_url)
+void LLViewerParcelMgr::optionally_start_music(const std::string& music_url)
{
if (gSavedSettings.getBOOL("AudioStreamingMusic"))
{
// only play music when you enter a new parcel if the UI control for this
// was not *explicitly* stopped by the user. (part of SL-4878)
- LLPanelNearByMedia* nearby_media_panel = gStatusBar->getNearbyMediaPanel();;
+ LLPanelNearByMedia* nearby_media_panel = gStatusBar->getNearbyMediaPanel();
if ((nearby_media_panel &&
nearby_media_panel->getParcelAudioAutoStart()) ||
// or they have expressed no opinion in the UI, but have autoplay on...
@@ -1993,67 +1986,6 @@ void LLViewerParcelMgr::sendParcelAccessListUpdate(U32 which)
}
}
-class LLParcelMediaURLFilterResponder : public LLHTTPClient::Responder
-{
- virtual void result(const LLSD& content)
- {
- LLViewerParcelMgr::getInstance()->receiveParcelMediaURLFilter(content);
- }
-};
-
-void LLViewerParcelMgr::requestParcelMediaURLFilter()
-{
- if (!mSelected)
- {
- return;
- }
-
- LLViewerRegion* region = LLWorld::getInstance()->getRegionFromPosGlobal( mWestSouth );
- if (!region)
- {
- return;
- }
-
- LLParcel* parcel = mCurrentParcel;
- if (!parcel)
- {
- llwarns << "no parcel" << llendl;
- return;
- }
-
- LLSD body;
- body["local-id"] = parcel->getLocalID();
- body["list"] = parcel->getMediaURLFilterList();
-
- std::string url = region->getCapability("ParcelMediaURLFilterList");
- if (!url.empty())
- {
- LLHTTPClient::post(url, body, new LLParcelMediaURLFilterResponder);
- }
- else
- {
- llwarns << "can't get ParcelMediaURLFilterList cap" << llendl;
- }
-}
-
-
-void LLViewerParcelMgr::receiveParcelMediaURLFilter(const LLSD &content)
-{
- if (content.has("list"))
- {
- LLParcel* parcel = LLViewerParcelMgr::getInstance()->mCurrentParcel;
- if (!parcel) return;
-
- if (content["local-id"].asInteger() == parcel->getLocalID())
- {
- parcel->setMediaURLFilterList(content["list"]);
-
- LLViewerParcelMgr::getInstance()->notifyObservers();
- }
- }
-}
-
-
void LLViewerParcelMgr::deedLandToGroup()
{
std::string group_name;
@@ -2559,7 +2491,7 @@ void LLViewerParcelMgr::onTeleportFinished(bool local, const LLVector3d& new_pos
{
// Local teleport. We already have the agent parcel data.
// Emit the signal immediately.
- getInstance()->mTeleportFinishedSignal(new_pos);
+ getInstance()->mTeleportFinishedSignal(new_pos, local);
}
else
{
diff --git a/indra/newview/llviewerparcelmgr.h b/indra/newview/llviewerparcelmgr.h
index cac8d8391c..6183b7e90e 100644
--- a/indra/newview/llviewerparcelmgr.h
+++ b/indra/newview/llviewerparcelmgr.h
@@ -78,8 +78,8 @@ class LLViewerParcelMgr : public LLSingleton<LLViewerParcelMgr>
{
public:
- typedef boost::function<void (const LLVector3d&)> teleport_finished_callback_t;
- typedef boost::signals2::signal<void (const LLVector3d&)> teleport_finished_signal_t;
+ typedef boost::function<void (const LLVector3d&, const bool& local)> teleport_finished_callback_t;
+ typedef boost::signals2::signal<void (const LLVector3d&, const bool&)> teleport_finished_signal_t;
typedef boost::function<void()> parcel_changed_callback_t;
typedef boost::signals2::signal<void()> parcel_changed_signal_t;
@@ -223,11 +223,6 @@ public:
// Takes an Access List flag, like AL_ACCESS or AL_BAN
void sendParcelAccessListRequest(U32 flags);
- // asks for the parcel's media url filter list
- void requestParcelMediaURLFilter();
- // receive the response
- void receiveParcelMediaURLFilter(const LLSD &content);
-
// Dwell is not part of the usual parcel update information because the
// simulator doesn't actually know the per-parcel dwell. Ack! We have
// to get it out of the database.
@@ -275,6 +270,8 @@ public:
// *NOTE: Taken out 2005-03-21. Phoenix.
//void makeLandmarkAtSelection();
+ static void optionally_start_music(const std::string& music_url);
+
static void processParcelOverlay(LLMessageSystem *msg, void **user_data);
static void processParcelProperties(LLMessageSystem *msg, void **user_data);
static void processParcelAccessListReply(LLMessageSystem *msg, void **user);
diff --git a/indra/newview/llviewerpartsim.cpp b/indra/newview/llviewerpartsim.cpp
index 6b3e04348a..345023dbfa 100644
--- a/indra/newview/llviewerpartsim.cpp
+++ b/indra/newview/llviewerpartsim.cpp
@@ -476,7 +476,7 @@ void LLViewerPartSim::checkParticleCount(U32 size)
LLViewerPartSim::LLViewerPartSim()
{
LLMemType mt(LLMemType::MTYPE_PARTICLES);
- sMaxParticleCount = gSavedSettings.getS32("RenderMaxPartCount");
+ sMaxParticleCount = llmin(gSavedSettings.getS32("RenderMaxPartCount"), LL_MAX_PARTICLE_COUNT);
static U32 id_seed = 0;
mID = ++id_seed;
}
diff --git a/indra/newview/llviewerpartsim.h b/indra/newview/llviewerpartsim.h
index 3e20f999c0..c9959c63ec 100644
--- a/indra/newview/llviewerpartsim.h
+++ b/indra/newview/llviewerpartsim.h
@@ -39,6 +39,8 @@ class LLViewerRegion;
class LLViewerTexture;
class LLVOPartGroup;
+#define LL_MAX_PARTICLE_COUNT 8192
+
typedef void (*LLVPCallback)(LLViewerPart &part, const F32 dt);
///////////////////
diff --git a/indra/newview/llviewerregion.cpp b/indra/newview/llviewerregion.cpp
index e3cb985ddb..effa368b7a 100644
--- a/indra/newview/llviewerregion.cpp
+++ b/indra/newview/llviewerregion.cpp
@@ -655,6 +655,31 @@ std::string LLViewerRegion::accessToShortString(U8 sim_access)
}
// static
+U8 LLViewerRegion::shortStringToAccess(const std::string &sim_access)
+{
+ U8 accessValue;
+
+ if (LLStringUtil::compareStrings(sim_access, "PG") == 0)
+ {
+ accessValue = SIM_ACCESS_PG;
+ }
+ else if (LLStringUtil::compareStrings(sim_access, "M") == 0)
+ {
+ accessValue = SIM_ACCESS_MATURE;
+ }
+ else if (LLStringUtil::compareStrings(sim_access, "A") == 0)
+ {
+ accessValue = SIM_ACCESS_ADULT;
+ }
+ else
+ {
+ accessValue = SIM_ACCESS_MIN;
+ }
+
+ return accessValue;
+}
+
+// static
void LLViewerRegion::processRegionInfo(LLMessageSystem* msg, void**)
{
// send it to 'observers'
@@ -1151,6 +1176,7 @@ void LLViewerRegion::getInfo(LLSD& info)
void LLViewerRegion::getSimulatorFeatures(LLSD& sim_features)
{
sim_features = mSimulatorFeatures;
+
}
void LLViewerRegion::setSimulatorFeatures(const LLSD& sim_features)
@@ -1461,7 +1487,8 @@ void LLViewerRegion::unpackRegionHandshake()
// all of our terrain stuff, by
if (compp->getParamsReady())
{
- getLand().dirtyAllPatches();
+ //this line creates frame stalls on region crossing and removing it appears to have no effect
+ //getLand().dirtyAllPatches();
}
else
{
@@ -1489,8 +1516,10 @@ void LLViewerRegion::unpackRegionHandshake()
void LLViewerRegionImpl::buildCapabilityNames(LLSD& capabilityNames)
{
+ capabilityNames.append("AgentState");
capabilityNames.append("AttachmentResources");
capabilityNames.append("AvatarPickerSearch");
+ capabilityNames.append("CharacterProperties");
capabilityNames.append("ChatSessionRequest");
capabilityNames.append("CopyInventoryFromNotecard");
capabilityNames.append("CreateInventoryCategory");
@@ -1519,10 +1548,11 @@ void LLViewerRegionImpl::buildCapabilityNames(LLSD& capabilityNames)
capabilityNames.append("LandResources");
capabilityNames.append("MapLayer");
capabilityNames.append("MapLayerGod");
- capabilityNames.append("MeshUploadFlag");
+ capabilityNames.append("MeshUploadFlag");
+ capabilityNames.append("NavMeshGenerationStatus");
capabilityNames.append("NewFileAgentInventory");
+ capabilityNames.append("ObjectNavMeshProperties");
capabilityNames.append("ParcelPropertiesUpdate");
- capabilityNames.append("ParcelMediaURLFilterList");
capabilityNames.append("ParcelNavigateMedia");
capabilityNames.append("ParcelVoiceInfoRequest");
capabilityNames.append("ProductInfoRequest");
@@ -1530,6 +1560,7 @@ void LLViewerRegionImpl::buildCapabilityNames(LLSD& capabilityNames)
capabilityNames.append("RemoteParcelRequest");
capabilityNames.append("RequestTextureDownload");
capabilityNames.append("ResourceCostSelected");
+ capabilityNames.append("RetrieveNavMeshSrc");
capabilityNames.append("SearchStatRequest");
capabilityNames.append("SearchStatTracking");
capabilityNames.append("SendPostcard");
@@ -1541,6 +1572,7 @@ void LLViewerRegionImpl::buildCapabilityNames(LLSD& capabilityNames)
capabilityNames.append("SetDisplayName");
capabilityNames.append("SimConsoleAsync");
capabilityNames.append("StartGroupProposal");
+ capabilityNames.append("TerrainNavMeshProperties");
capabilityNames.append("TextureStats");
capabilityNames.append("UntrustedSimulatorMessage");
capabilityNames.append("UpdateAgentInformation");
@@ -1555,7 +1587,7 @@ void LLViewerRegionImpl::buildCapabilityNames(LLSD& capabilityNames)
capabilityNames.append("ViewerMetrics");
capabilityNames.append("ViewerStartAuction");
capabilityNames.append("ViewerStats");
-
+
// Please add new capabilities alphabetically to reduce
// merge conflicts.
}
@@ -1794,7 +1826,10 @@ void LLViewerRegion::getNeighboringRegions( std::vector<LLViewerRegion*>& unique
{
mImpl->mLandp->getNeighboringRegions( uniqueRegions );
}
-
+void LLViewerRegion::getNeighboringRegionsStatus( std::vector<S32>& regions )
+{
+ mImpl->mLandp->getNeighboringRegionsStatus( regions );
+}
void LLViewerRegion::showReleaseNotes()
{
std::string url = this->getCapability("ServerReleaseNotes");
@@ -1827,4 +1862,9 @@ bool LLViewerRegion::meshRezEnabled() const
mSimulatorFeatures["MeshRezEnabled"].asBoolean());
}
+bool LLViewerRegion::dynamicPathfindingEnabled() const
+{
+ return ( mSimulatorFeatures.has("DynamicPathfindingEnabled") &&
+ mSimulatorFeatures["DynamicPathfindingEnabled"].asBoolean());
+}
diff --git a/indra/newview/llviewerregion.h b/indra/newview/llviewerregion.h
index c483c6ef52..c9fffaf30e 100644
--- a/indra/newview/llviewerregion.h
+++ b/indra/newview/llviewerregion.h
@@ -202,6 +202,7 @@ public:
// Returns "M", "PG", "A" etc.
static std::string accessToShortString(U8 sim_access);
+ static U8 shortStringToAccess(const std::string &sim_access);
// Return access icon name
static std::string getAccessIcon(U8 sim_access);
@@ -285,6 +286,9 @@ public:
void getSimulatorFeatures(LLSD& info);
void setSimulatorFeatures(const LLSD& info);
+
+ bool dynamicPathfindingEnabled() const;
+
typedef enum
{
CACHE_MISS_TYPE_FULL = 0,
@@ -325,6 +329,7 @@ public:
bool objectsCrossParcel(const std::vector<LLBBox>& boxes) const;
void getNeighboringRegions( std::vector<LLViewerRegion*>& uniqueRegions );
+ void getNeighboringRegionsStatus( std::vector<S32>& regions );
public:
struct CompareDistance
diff --git a/indra/newview/llviewershadermgr.cpp b/indra/newview/llviewershadermgr.cpp
index 10c61c01d5..4b0e0598f6 100644
--- a/indra/newview/llviewershadermgr.cpp
+++ b/indra/newview/llviewershadermgr.cpp
@@ -63,8 +63,16 @@ bool LLViewerShaderMgr::sSkipReload = false;
LLVector4 gShinyOrigin;
+//transform shaders
+LLGLSLShader gTransformPositionProgram;
+LLGLSLShader gTransformTexCoordProgram;
+LLGLSLShader gTransformNormalProgram;
+LLGLSLShader gTransformColorProgram;
+LLGLSLShader gTransformBinormalProgram;
+
//utility shaders
LLGLSLShader gOcclusionProgram;
+LLGLSLShader gOcclusionCubeProgram;
LLGLSLShader gCustomAlphaProgram;
LLGLSLShader gGlowCombineProgram;
LLGLSLShader gSplatTextureRectProgram;
@@ -72,6 +80,7 @@ LLGLSLShader gGlowCombineFXAAProgram;
LLGLSLShader gTwoTextureAddProgram;
LLGLSLShader gOneTextureNoColorProgram;
LLGLSLShader gDebugProgram;
+LLGLSLShader gClipProgram;
LLGLSLShader gAlphaMaskProgram;
//object shaders
@@ -134,6 +143,8 @@ LLGLSLShader gUnderWaterProgram;
//interface shaders
LLGLSLShader gHighlightProgram;
+LLGLSLShader gPathfindingProgram;
+LLGLSLShader gPathfindingNoNormalsProgram;
//avatar shader handles
LLGLSLShader gAvatarProgram;
@@ -178,6 +189,7 @@ LLGLSLShader gDeferredSunProgram;
LLGLSLShader gDeferredBlurLightProgram;
LLGLSLShader gDeferredSoftenProgram;
LLGLSLShader gDeferredShadowProgram;
+LLGLSLShader gDeferredShadowCubeProgram;
LLGLSLShader gDeferredShadowAlphaMaskProgram;
LLGLSLShader gDeferredAvatarShadowProgram;
LLGLSLShader gDeferredAttachmentShadowProgram;
@@ -437,7 +449,8 @@ void LLViewerShaderMgr::setShaders()
S32 wl_class = 2;
S32 water_class = 2;
S32 deferred_class = 0;
-
+ S32 transform_class = gGLManager.mHasTransformFeedback ? 1 : 0;
+
if (LLFeatureManager::getInstance()->isFeatureAvailable("RenderDeferred") &&
gSavedSettings.getBOOL("RenderDeferred") &&
gSavedSettings.getBOOL("RenderAvatarVP") &&
@@ -475,6 +488,7 @@ void LLViewerShaderMgr::setShaders()
gSky.mVOSkyp->forceSkyUpdate();
}
+
// Load lighting shaders
mVertexShaderLevel[SHADER_LIGHTING] = light_class;
mVertexShaderLevel[SHADER_INTERFACE] = light_class;
@@ -484,6 +498,7 @@ void LLViewerShaderMgr::setShaders()
mVertexShaderLevel[SHADER_EFFECT] = effect_class;
mVertexShaderLevel[SHADER_WINDLIGHT] = wl_class;
mVertexShaderLevel[SHADER_DEFERRED] = deferred_class;
+ mVertexShaderLevel[SHADER_TRANSFORM] = transform_class;
BOOL loaded = loadBasicShaders();
@@ -493,65 +508,110 @@ void LLViewerShaderMgr::setShaders()
gPipeline.mVertexShadersLoaded = 1;
// Load all shaders to set max levels
- loadShadersEnvironment();
- loadShadersWater();
- loadShadersWindLight();
- loadShadersEffects();
- loadShadersInterface();
-
- // Load max avatar shaders to set the max level
- mVertexShaderLevel[SHADER_AVATAR] = 3;
- mMaxAvatarShaderLevel = 3;
-
- 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;
-
- // cloth is a class3 shader
- if(avatar_cloth)
- {
- avatar_class = 3;
- }
+ loaded = loadShadersEnvironment();
+
+ if (loaded)
+ {
+ loaded = loadShadersWater();
+ }
+
+ if (loaded)
+ {
+ loaded = loadShadersWindLight();
+ }
+
+ if (loaded)
+ {
+ loaded = loadShadersEffects();
+ }
+
+ if (loaded)
+ {
+ loaded = loadShadersInterface();
+ }
+
+ if (loaded)
+
+ {
+ loaded = loadTransformShaders();
+ }
- // Set the actual level
- mVertexShaderLevel[SHADER_AVATAR] = avatar_class;
- loadShadersAvatar();
- if (mVertexShaderLevel[SHADER_AVATAR] != avatar_class)
- {
- if (mVertexShaderLevel[SHADER_AVATAR] == 0)
+ if (loaded)
+ {
+ // Load max avatar shaders to set the max level
+ mVertexShaderLevel[SHADER_AVATAR] = 3;
+ mMaxAvatarShaderLevel = 3;
+
+ 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;
+
+ // cloth is a class3 shader
+ if(avatar_cloth)
{
- gSavedSettings.setBOOL("RenderAvatarVP", FALSE);
+ avatar_class = 3;
}
- if(llmax(mVertexShaderLevel[SHADER_AVATAR]-1,0) >= 3)
+
+ // Set the actual level
+ mVertexShaderLevel[SHADER_AVATAR] = avatar_class;
+ loadShadersAvatar();
+ if (mVertexShaderLevel[SHADER_AVATAR] != avatar_class)
{
- avatar_cloth = true;
+ if (mVertexShaderLevel[SHADER_AVATAR] == 0)
+ {
+ gSavedSettings.setBOOL("RenderAvatarVP", FALSE);
+ }
+ if(llmax(mVertexShaderLevel[SHADER_AVATAR]-1,0) >= 3)
+ {
+ avatar_cloth = true;
+ }
+ else
+ {
+ avatar_cloth = false;
+ }
+ gSavedSettings.setBOOL("RenderAvatarCloth", avatar_cloth);
}
- else
+ }
+ else
+ { //hardware skinning not possible, neither is deferred rendering
+ mVertexShaderLevel[SHADER_AVATAR] = 0;
+ mVertexShaderLevel[SHADER_DEFERRED] = 0;
+
+ if (gSavedSettings.getBOOL("RenderAvatarVP"))
{
- avatar_cloth = false;
+ gSavedSettings.setBOOL("RenderDeferred", FALSE);
+ gSavedSettings.setBOOL("RenderAvatarCloth", FALSE);
+ gSavedSettings.setBOOL("RenderAvatarVP", FALSE);
}
- gSavedSettings.setBOOL("RenderAvatarCloth", avatar_cloth);
+
+ loadShadersAvatar(); // unloads
+
+ loaded = loadShadersObject();
}
}
- else
- { //hardware skinning not possible, neither is deferred rendering
- mVertexShaderLevel[SHADER_AVATAR] = 0;
- mVertexShaderLevel[SHADER_DEFERRED] = 0;
-
- if (gSavedSettings.getBOOL("RenderAvatarVP"))
- {
- gSavedSettings.setBOOL("RenderDeferred", FALSE);
- gSavedSettings.setBOOL("RenderAvatarCloth", FALSE);
- gSavedSettings.setBOOL("RenderAvatarVP", FALSE);
+
+ if (!loaded)
+ { //some shader absolutely could not load, try to fall back to a simpler setting
+ if (gSavedSettings.getBOOL("WindLightUseAtmosShaders"))
+ { //disable windlight and try again
+ gSavedSettings.setBOOL("WindLightUseAtmosShaders", FALSE);
+ reentrance = false;
+ setShaders();
+ return;
}
- loadShadersAvatar(); // unloads
- loadShadersObject();
- }
+ if (gSavedSettings.getBOOL("VertexShaderEnable"))
+ { //disable shaders outright and try again
+ gSavedSettings.setBOOL("VertexShaderEnable", FALSE);
+ reentrance = false;
+ setShaders();
+ return;
+ }
+ }
- if (!loadShadersDeferred())
- {
+ if (loaded && !loadShadersDeferred())
+ { //everything else succeeded but deferred failed, disable deferred and try again
gSavedSettings.setBOOL("RenderDeferred", FALSE);
reentrance = false;
setShaders();
@@ -600,9 +660,13 @@ void LLViewerShaderMgr::setShaders()
void LLViewerShaderMgr::unloadShaders()
{
gOcclusionProgram.unload();
+ gOcclusionCubeProgram.unload();
gDebugProgram.unload();
+ gClipProgram.unload();
gAlphaMaskProgram.unload();
gUIProgram.unload();
+ gPathfindingProgram.unload();
+ gPathfindingNoNormalsProgram.unload();
gCustomAlphaProgram.unload();
gGlowCombineProgram.unload();
gSplatTextureRectProgram.unload();
@@ -692,6 +756,12 @@ void LLViewerShaderMgr::unloadShaders()
gDeferredSkinnedBumpProgram.unload();
gDeferredSkinnedAlphaProgram.unload();
+ gTransformPositionProgram.unload();
+ gTransformTexCoordProgram.unload();
+ gTransformNormalProgram.unload();
+ gTransformColorProgram.unload();
+ gTransformBinormalProgram.unload();
+
mVertexShaderLevel[SHADER_LIGHTING] = 0;
mVertexShaderLevel[SHADER_OBJECT] = 0;
mVertexShaderLevel[SHADER_AVATAR] = 0;
@@ -700,6 +770,7 @@ void LLViewerShaderMgr::unloadShaders()
mVertexShaderLevel[SHADER_INTERFACE] = 0;
mVertexShaderLevel[SHADER_EFFECT] = 0;
mVertexShaderLevel[SHADER_WINDLIGHT] = 0;
+ mVertexShaderLevel[SHADER_TRANSFORM] = 0;
gPipeline.mVertexShadersLoaded = 0;
}
@@ -828,7 +899,7 @@ BOOL LLViewerShaderMgr::loadShadersEnvironment()
if (mVertexShaderLevel[SHADER_ENVIRONMENT] == 0)
{
gTerrainProgram.unload();
- return FALSE;
+ return TRUE;
}
if (success)
@@ -868,7 +939,7 @@ BOOL LLViewerShaderMgr::loadShadersWater()
gWaterProgram.unload();
gUnderWaterProgram.unload();
gTerrainWaterProgram.unload();
- return FALSE;
+ return TRUE;
}
if (success)
@@ -953,7 +1024,7 @@ BOOL LLViewerShaderMgr::loadShadersEffects()
gGlowExtractProgram.unload();
gPostColorFilterProgram.unload();
gPostNightVisionProgram.unload();
- return FALSE;
+ return TRUE;
}
if (success)
@@ -1013,6 +1084,7 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()
gDeferredBlurLightProgram.unload();
gDeferredSoftenProgram.unload();
gDeferredShadowProgram.unload();
+ gDeferredShadowCubeProgram.unload();
gDeferredShadowAlphaMaskProgram.unload();
gDeferredAvatarShadowProgram.unload();
gDeferredAttachmentShadowProgram.unload();
@@ -1200,7 +1272,7 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()
gDeferredSpotLightProgram.mName = "Deferred SpotLight Shader";
gDeferredSpotLightProgram.mShaderFiles.clear();
gDeferredSpotLightProgram.mShaderFiles.push_back(make_pair("deferred/pointLightV.glsl", GL_VERTEX_SHADER_ARB));
- gDeferredSpotLightProgram.mShaderFiles.push_back(make_pair("deferred/multiSpotLightF.glsl", GL_FRAGMENT_SHADER_ARB));
+ gDeferredSpotLightProgram.mShaderFiles.push_back(make_pair("deferred/spotLightF.glsl", GL_FRAGMENT_SHADER_ARB));
gDeferredSpotLightProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED];
success = gDeferredSpotLightProgram.createShader(NULL, NULL);
}
@@ -1209,7 +1281,7 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()
{
gDeferredMultiSpotLightProgram.mName = "Deferred MultiSpotLight Shader";
gDeferredMultiSpotLightProgram.mShaderFiles.clear();
- gDeferredMultiSpotLightProgram.mShaderFiles.push_back(make_pair("deferred/pointLightV.glsl", GL_VERTEX_SHADER_ARB));
+ gDeferredMultiSpotLightProgram.mShaderFiles.push_back(make_pair("deferred/multiPointLightV.glsl", GL_VERTEX_SHADER_ARB));
gDeferredMultiSpotLightProgram.mShaderFiles.push_back(make_pair("deferred/multiSpotLightF.glsl", GL_FRAGMENT_SHADER_ARB));
gDeferredMultiSpotLightProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED];
success = gDeferredMultiSpotLightProgram.createShader(NULL, NULL);
@@ -1368,6 +1440,16 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()
if (success)
{
+ gDeferredShadowCubeProgram.mName = "Deferred Shadow Cube Shader";
+ gDeferredShadowCubeProgram.mShaderFiles.clear();
+ gDeferredShadowCubeProgram.mShaderFiles.push_back(make_pair("deferred/shadowCubeV.glsl", GL_VERTEX_SHADER_ARB));
+ gDeferredShadowCubeProgram.mShaderFiles.push_back(make_pair("deferred/shadowF.glsl", GL_FRAGMENT_SHADER_ARB));
+ gDeferredShadowCubeProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED];
+ success = gDeferredShadowCubeProgram.createShader(NULL, NULL);
+ }
+
+ if (success)
+ {
gDeferredShadowAlphaMaskProgram.mName = "Deferred Shadow Alpha Mask Shader";
gDeferredShadowAlphaMaskProgram.mFeatures.mIndexedTextureChannels = LLGLSLShader::sIndexedTextureChannels;
gDeferredShadowAlphaMaskProgram.mShaderFiles.clear();
@@ -2410,7 +2492,7 @@ BOOL LLViewerShaderMgr::loadShadersAvatar()
gAvatarWaterProgram.unload();
gAvatarEyeballProgram.unload();
gAvatarPickProgram.unload();
- return FALSE;
+ return TRUE;
}
if (success)
@@ -2504,7 +2586,7 @@ BOOL LLViewerShaderMgr::loadShadersInterface()
if (mVertexShaderLevel[SHADER_INTERFACE] == 0)
{
gHighlightProgram.unload();
- return FALSE;
+ return TRUE;
}
if (success)
@@ -2529,6 +2611,26 @@ BOOL LLViewerShaderMgr::loadShadersInterface()
if (success)
{
+ gPathfindingProgram.mName = "Pathfinding Shader";
+ gPathfindingProgram.mShaderFiles.clear();
+ gPathfindingProgram.mShaderFiles.push_back(make_pair("interface/pathfindingV.glsl", GL_VERTEX_SHADER_ARB));
+ gPathfindingProgram.mShaderFiles.push_back(make_pair("interface/pathfindingF.glsl", GL_FRAGMENT_SHADER_ARB));
+ gPathfindingProgram.mShaderLevel = mVertexShaderLevel[SHADER_INTERFACE];
+ success = gPathfindingProgram.createShader(NULL, NULL);
+ }
+
+ if (success)
+ {
+ gPathfindingNoNormalsProgram.mName = "PathfindingNoNormals Shader";
+ gPathfindingNoNormalsProgram.mShaderFiles.clear();
+ gPathfindingNoNormalsProgram.mShaderFiles.push_back(make_pair("interface/pathfindingNoNormalV.glsl", GL_VERTEX_SHADER_ARB));
+ gPathfindingNoNormalsProgram.mShaderFiles.push_back(make_pair("interface/pathfindingF.glsl", GL_FRAGMENT_SHADER_ARB));
+ gPathfindingNoNormalsProgram.mShaderLevel = mVertexShaderLevel[SHADER_INTERFACE];
+ success = gPathfindingNoNormalsProgram.createShader(NULL, NULL);
+ }
+
+ if (success)
+ {
gCustomAlphaProgram.mName = "Custom Alpha Shader";
gCustomAlphaProgram.mShaderFiles.clear();
gCustomAlphaProgram.mShaderFiles.push_back(make_pair("interface/customalphaV.glsl", GL_VERTEX_SHADER_ARB));
@@ -2647,6 +2749,16 @@ BOOL LLViewerShaderMgr::loadShadersInterface()
if (success)
{
+ gOcclusionCubeProgram.mName = "Occlusion Cube Shader";
+ gOcclusionCubeProgram.mShaderFiles.clear();
+ gOcclusionCubeProgram.mShaderFiles.push_back(make_pair("interface/occlusionCubeV.glsl", GL_VERTEX_SHADER_ARB));
+ gOcclusionCubeProgram.mShaderFiles.push_back(make_pair("interface/occlusionF.glsl", GL_FRAGMENT_SHADER_ARB));
+ gOcclusionCubeProgram.mShaderLevel = mVertexShaderLevel[SHADER_INTERFACE];
+ success = gOcclusionCubeProgram.createShader(NULL, NULL);
+ }
+
+ if (success)
+ {
gDebugProgram.mName = "Debug Shader";
gDebugProgram.mShaderFiles.clear();
gDebugProgram.mShaderFiles.push_back(make_pair("interface/debugV.glsl", GL_VERTEX_SHADER_ARB));
@@ -2657,6 +2769,16 @@ BOOL LLViewerShaderMgr::loadShadersInterface()
if (success)
{
+ gClipProgram.mName = "Clip Shader";
+ gClipProgram.mShaderFiles.clear();
+ gClipProgram.mShaderFiles.push_back(make_pair("interface/clipV.glsl", GL_VERTEX_SHADER_ARB));
+ gClipProgram.mShaderFiles.push_back(make_pair("interface/clipF.glsl", GL_FRAGMENT_SHADER_ARB));
+ gClipProgram.mShaderLevel = mVertexShaderLevel[SHADER_INTERFACE];
+ success = gClipProgram.createShader(NULL, NULL);
+ }
+
+ if (success)
+ {
gAlphaMaskProgram.mName = "Alpha Mask Shader";
gAlphaMaskProgram.mShaderFiles.clear();
gAlphaMaskProgram.mShaderFiles.push_back(make_pair("interface/alphamaskV.glsl", GL_VERTEX_SHADER_ARB));
@@ -2682,7 +2804,7 @@ BOOL LLViewerShaderMgr::loadShadersWindLight()
{
gWLSkyProgram.unload();
gWLCloudProgram.unload();
- return FALSE;
+ return TRUE;
}
if (success)
@@ -2712,6 +2834,95 @@ BOOL LLViewerShaderMgr::loadShadersWindLight()
return success;
}
+BOOL LLViewerShaderMgr::loadTransformShaders()
+{
+ BOOL success = TRUE;
+
+ if (mVertexShaderLevel[SHADER_TRANSFORM] < 1)
+ {
+ gTransformPositionProgram.unload();
+ gTransformTexCoordProgram.unload();
+ gTransformNormalProgram.unload();
+ gTransformColorProgram.unload();
+ gTransformBinormalProgram.unload();
+ return TRUE;
+ }
+
+ if (success)
+ {
+ gTransformPositionProgram.mName = "Position Transform Shader";
+ gTransformPositionProgram.mShaderFiles.clear();
+ gTransformPositionProgram.mShaderFiles.push_back(make_pair("transform/positionV.glsl", GL_VERTEX_SHADER_ARB));
+ gTransformPositionProgram.mShaderLevel = mVertexShaderLevel[SHADER_TRANSFORM];
+
+ const char* varyings[] = {
+ "position_out",
+ "texture_index_out",
+ };
+
+ success = gTransformPositionProgram.createShader(NULL, NULL, 2, varyings);
+ }
+
+ if (success)
+ {
+ gTransformTexCoordProgram.mName = "TexCoord Transform Shader";
+ gTransformTexCoordProgram.mShaderFiles.clear();
+ gTransformTexCoordProgram.mShaderFiles.push_back(make_pair("transform/texcoordV.glsl", GL_VERTEX_SHADER_ARB));
+ gTransformTexCoordProgram.mShaderLevel = mVertexShaderLevel[SHADER_TRANSFORM];
+
+ const char* varyings[] = {
+ "texcoord_out",
+ };
+
+ success = gTransformTexCoordProgram.createShader(NULL, NULL, 1, varyings);
+ }
+
+ if (success)
+ {
+ gTransformNormalProgram.mName = "Normal Transform Shader";
+ gTransformNormalProgram.mShaderFiles.clear();
+ gTransformNormalProgram.mShaderFiles.push_back(make_pair("transform/normalV.glsl", GL_VERTEX_SHADER_ARB));
+ gTransformNormalProgram.mShaderLevel = mVertexShaderLevel[SHADER_TRANSFORM];
+
+ const char* varyings[] = {
+ "normal_out",
+ };
+
+ success = gTransformNormalProgram.createShader(NULL, NULL, 1, varyings);
+ }
+
+ if (success)
+ {
+ gTransformColorProgram.mName = "Color Transform Shader";
+ gTransformColorProgram.mShaderFiles.clear();
+ gTransformColorProgram.mShaderFiles.push_back(make_pair("transform/colorV.glsl", GL_VERTEX_SHADER_ARB));
+ gTransformColorProgram.mShaderLevel = mVertexShaderLevel[SHADER_TRANSFORM];
+
+ const char* varyings[] = {
+ "color_out",
+ };
+
+ success = gTransformColorProgram.createShader(NULL, NULL, 1, varyings);
+ }
+
+ if (success)
+ {
+ gTransformBinormalProgram.mName = "Binormal Transform Shader";
+ gTransformBinormalProgram.mShaderFiles.clear();
+ gTransformBinormalProgram.mShaderFiles.push_back(make_pair("transform/binormalV.glsl", GL_VERTEX_SHADER_ARB));
+ gTransformBinormalProgram.mShaderLevel = mVertexShaderLevel[SHADER_TRANSFORM];
+
+ const char* varyings[] = {
+ "binormal_out",
+ };
+
+ success = gTransformBinormalProgram.createShader(NULL, NULL, 1, varyings);
+ }
+
+
+ return success;
+}
+
std::string LLViewerShaderMgr::getShaderDirPrefix(void)
{
return gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "shaders/class");
diff --git a/indra/newview/llviewershadermgr.h b/indra/newview/llviewershadermgr.h
index 95eb551bf1..d6dd645e8c 100644
--- a/indra/newview/llviewershadermgr.h
+++ b/indra/newview/llviewershadermgr.h
@@ -54,6 +54,7 @@ public:
BOOL loadShadersWater();
BOOL loadShadersInterface();
BOOL loadShadersWindLight();
+ BOOL loadTransformShaders();
std::vector<S32> mVertexShaderLevel;
S32 mMaxAvatarShaderLevel;
@@ -69,6 +70,7 @@ public:
SHADER_WINDLIGHT,
SHADER_WATER,
SHADER_DEFERRED,
+ SHADER_TRANSFORM,
SHADER_COUNT
};
@@ -209,13 +211,24 @@ inline bool operator != (LLViewerShaderMgr::shader_iter const & a, LLViewerShade
extern LLVector4 gShinyOrigin;
+//transform shaders
+extern LLGLSLShader gTransformPositionProgram;
+extern LLGLSLShader gTransformTexCoordProgram;
+extern LLGLSLShader gTransformNormalProgram;
+extern LLGLSLShader gTransformColorProgram;
+extern LLGLSLShader gTransformBinormalProgram;
+
+
+
//utility shaders
extern LLGLSLShader gOcclusionProgram;
+extern LLGLSLShader gOcclusionCubeProgram;
extern LLGLSLShader gCustomAlphaProgram;
extern LLGLSLShader gGlowCombineProgram;
extern LLGLSLShader gSplatTextureRectProgram;
extern LLGLSLShader gGlowCombineFXAAProgram;
extern LLGLSLShader gDebugProgram;
+extern LLGLSLShader gClipProgram;
extern LLGLSLShader gAlphaMaskProgram;
//output tex0[tc0] + tex1[tc1]
@@ -288,6 +301,8 @@ extern LLGLSLShader gGlowExtractProgram;
//interface shaders
extern LLGLSLShader gHighlightProgram;
+extern LLGLSLShader gPathfindingProgram;
+extern LLGLSLShader gPathfindingNoNormalsProgram;
// avatar shader handles
extern LLGLSLShader gAvatarProgram;
@@ -328,6 +343,7 @@ extern LLGLSLShader gDeferredBlurLightProgram;
extern LLGLSLShader gDeferredAvatarProgram;
extern LLGLSLShader gDeferredSoftenProgram;
extern LLGLSLShader gDeferredShadowProgram;
+extern LLGLSLShader gDeferredShadowCubeProgram;
extern LLGLSLShader gDeferredShadowAlphaMaskProgram;
extern LLGLSLShader gDeferredPostProgram;
extern LLGLSLShader gDeferredCoFProgram;
diff --git a/indra/newview/llviewerstats.cpp b/indra/newview/llviewerstats.cpp
index 497e95c5e3..d1c6b7ea79 100644..100755
--- a/indra/newview/llviewerstats.cpp
+++ b/indra/newview/llviewerstats.cpp
@@ -233,6 +233,9 @@ LLViewerStats::LLViewerStats() :
mSimSimPhysicsStepMsec("simsimphysicsstepmsec"),
mSimSimPhysicsShapeUpdateMsec("simsimphysicsshapeupdatemsec"),
mSimSimPhysicsOtherMsec("simsimphysicsothermsec"),
+ mSimSimAIStepMsec("simsimaistepmsec"),
+ mSimSimSkippedSilhouetteSteps("simsimskippedsilhouettesteps"),
+ mSimSimPctSteppedCharacters("simsimpctsteppedcharacters"),
mSimAgentMsec("simagentmsec"),
mSimImagesMsec("simimagesmsec"),
mSimScriptMsec("simscriptmsec"),
@@ -244,6 +247,7 @@ LLViewerStats::LLViewerStats() :
mSimObjects("simobjects"),
mSimActiveObjects("simactiveobjects"),
mSimActiveScripts("simactivescripts"),
+ mSimPctScriptsRun("simpctscriptsrun"),
mSimInPPS("siminpps"),
mSimOutPPS("simoutpps"),
mSimPendingDownloads("simpendingdownloads"),
@@ -789,6 +793,24 @@ void send_stats()
system["gpu_class"] = (S32)LLFeatureManager::getInstance()->getGPUClass();
system["gpu_vendor"] = gGLManager.mGLVendorShort;
system["gpu_version"] = gGLManager.mDriverVersionVendorString;
+ system["opengl_version"] = gGLManager.mGLVersionString;
+
+ S32 shader_level = 0;
+ if (LLPipeline::sRenderDeferred)
+ {
+ shader_level = 3;
+ }
+ else if (gPipeline.canUseWindLightShadersOnObjects())
+ {
+ shader_level = 2;
+ }
+ else if (gPipeline.canUseVertexShaders())
+ {
+ shader_level = 1;
+ }
+
+
+ system["shader_level"] = shader_level;
LLSD &download = body["downloads"];
@@ -927,15 +949,8 @@ LLSD LLViewerStats::PhaseMap::dumpPhases()
for (phase_map_t::iterator iter = mPhaseMap.begin(); iter != mPhaseMap.end(); ++iter)
{
const std::string& phase_name = iter->first;
- result[phase_name]["completed"] = !(iter->second.getStarted());
+ result[phase_name]["completed"] = LLSD::Integer(!(iter->second.getStarted()));
result[phase_name]["elapsed"] = iter->second.getElapsedTimeF32();
-#if 0 // global stats for each phase seem like overkill here
- phase_stats_t::iterator stats_iter = sPhaseStats.find(phase_name);
- if (stats_iter != sPhaseStats.end())
- {
- result[phase_name]["stats"] = stats_iter->second.getData();
- }
-#endif
}
return result;
}
diff --git a/indra/newview/llviewerstats.h b/indra/newview/llviewerstats.h
index 750d963f69..554e4d647e 100644..100755
--- a/indra/newview/llviewerstats.h
+++ b/indra/newview/llviewerstats.h
@@ -71,6 +71,10 @@ public:
LLStat mSimSimPhysicsShapeUpdateMsec;
LLStat mSimSimPhysicsOtherMsec;
+ LLStat mSimSimAIStepMsec;
+ LLStat mSimSimSkippedSilhouetteSteps;
+ LLStat mSimSimPctSteppedCharacters;
+
LLStat mSimAgentMsec;
LLStat mSimImagesMsec;
LLStat mSimScriptMsec;
@@ -83,6 +87,7 @@ public:
LLStat mSimObjects;
LLStat mSimActiveObjects;
LLStat mSimActiveScripts;
+ LLStat mSimPctScriptsRun;
LLStat mSimInPPS;
LLStat mSimOutPPS;
diff --git a/indra/newview/llviewertexture.cpp b/indra/newview/llviewertexture.cpp
index d844aeb12a..8eb8717de2 100644
--- a/indra/newview/llviewertexture.cpp
+++ b/indra/newview/llviewertexture.cpp
@@ -62,6 +62,7 @@
#include "llmediaentry.h"
#include "llvovolume.h"
#include "llviewermedia.h"
+#include "lltexturecache.h"
///////////////////////////////////////////////////////////////////////////////
// statics
@@ -409,7 +410,11 @@ void LLViewerTextureManager::cleanup()
void LLViewerTexture::initClass()
{
LLImageGL::sDefaultGLTexture = LLViewerFetchedTexture::sDefaultImagep->getGLTexture() ;
- sTexelPixelRatio = gSavedSettings.getF32("TexelPixelRatio");
+
+ if(gSavedSettings.getBOOL("TextureFetchDebuggerEnabled"))
+ {
+ sTexelPixelRatio = gSavedSettings.getF32("TexelPixelRatio");
+ }
}
// static
@@ -1236,7 +1241,7 @@ void LLViewerFetchedTexture::init(bool firstinit)
mIsMissingAsset = FALSE;
mLoadedCallbackDesiredDiscardLevel = S8_MAX;
- mPauseLoadedCallBacks = TRUE ;
+ mPauseLoadedCallBacks = FALSE ;
mNeedsCreateTexture = FALSE;
@@ -1253,6 +1258,7 @@ void LLViewerFetchedTexture::init(bool firstinit)
mRequestDeltaTime = 0.f;
mForSculpt = FALSE ;
mIsFetched = FALSE ;
+ mInFastCacheList = FALSE;
mCachedRawImage = NULL ;
mCachedRawDiscardLevel = -1 ;
@@ -1266,6 +1272,8 @@ void LLViewerFetchedTexture::init(bool firstinit)
mLastReferencedSavedRawImageTime = 0.0f ;
mKeptSavedRawImageTime = 0.f ;
mLastCallBackActiveTime = 0.f;
+
+ mInDebug = FALSE;
}
LLViewerFetchedTexture::~LLViewerFetchedTexture()
@@ -1310,14 +1318,47 @@ void LLViewerFetchedTexture::cleanup()
mSavedRawDiscardLevel = -1;
}
+//access the fast cache
+void LLViewerFetchedTexture::loadFromFastCache()
+{
+ if(!mInFastCacheList)
+ {
+ return; //no need to access the fast cache.
+ }
+ mInFastCacheList = FALSE;
+
+ mRawImage = LLAppViewer::getTextureCache()->readFromFastCache(getID(), mRawDiscardLevel) ;
+ if(mRawImage.notNull())
+ {
+ mFullWidth = mRawImage->getWidth() << mRawDiscardLevel;
+ mFullHeight = mRawImage->getHeight() << mRawDiscardLevel;
+ setTexelsPerImage();
+
+ if(mFullWidth > MAX_IMAGE_SIZE || mFullHeight > MAX_IMAGE_SIZE)
+ {
+ //discard all oversized textures.
+ destroyRawImage();
+ setIsMissingAsset();
+ mRawDiscardLevel = INVALID_DISCARD_LEVEL ;
+ }
+ else
+ {
+ mRequestedDiscardLevel = mDesiredDiscardLevel + 1;
+ mIsRawImageValid = TRUE;
+ addToCreateTexture() ;
+ }
+ }
+}
+
void LLViewerFetchedTexture::setForSculpt()
{
static const S32 MAX_INTERVAL = 8 ; //frames
mForSculpt = TRUE ;
- if(isForSculptOnly() && !getBoundRecently())
+ if(isForSculptOnly() && hasGLTexture() && !getBoundRecently())
{
destroyGLTexture() ; //sculpt image does not need gl texture.
+ mTextureState = ACTIVE;
}
checkCachedRawSculptImage() ;
setMaxVirtualSizeResetInterval(MAX_INTERVAL) ;
@@ -1398,10 +1439,10 @@ void LLViewerFetchedTexture::dump()
// ONLY called from LLViewerFetchedTextureList
void LLViewerFetchedTexture::destroyTexture()
{
- if(LLImageGL::sGlobalTextureMemoryInBytes < sMaxDesiredTextureMemInBytes)//not ready to release unused memory.
- {
- return ;
- }
+ //if(LLImageGL::sGlobalTextureMemoryInBytes < sMaxDesiredTextureMemInBytes)//not ready to release unused memory.
+ //{
+ // return ;
+ //}
if (mNeedsCreateTexture)//return if in the process of generating a new texture.
{
return ;
@@ -1735,7 +1776,7 @@ F32 LLViewerFetchedTexture::calcDecodePriority()
S32 ddiscard = MAX_DISCARD_LEVEL - (S32)desired;
ddiscard = llclamp(ddiscard, 0, MAX_DELTA_DISCARD_LEVEL_FOR_PRIORITY);
priority = (ddiscard + 1) * PRIORITY_DELTA_DISCARD_LEVEL_FACTOR;
- setAdditionalDecodePriority(1.0f) ;//boost the textures without any data so far.
+ setAdditionalDecodePriority(0.1f) ;//boost the textures without any data so far.
}
else if ((mMinDiscardLevel > 0) && (cur_discard <= mMinDiscardLevel))
{
@@ -1836,8 +1877,6 @@ F32 LLViewerFetchedTexture::maxDecodePriority()
void LLViewerFetchedTexture::setDecodePriority(F32 priority)
{
- llassert(!mInImageList);
-
mDecodePriority = priority;
if(mDecodePriority < F_ALMOST_ZERO)
@@ -1898,6 +1937,20 @@ S32 LLViewerFetchedTexture::getCurrentDiscardLevelForFetching()
return current_discard ;
}
+bool LLViewerFetchedTexture::setDebugFetching(S32 debug_level)
+{
+ if(debug_level < 0)
+ {
+ mInDebug = FALSE;
+ return false;
+ }
+ mInDebug = TRUE;
+
+ mDesiredDiscardLevel = debug_level;
+
+ return true;
+}
+
bool LLViewerFetchedTexture::updateFetch()
{
static LLCachedControl<bool> textures_decode_disabled(gSavedSettings,"TextureDecodeDisabled");
@@ -1935,6 +1988,10 @@ bool LLViewerFetchedTexture::updateFetch()
{
return false; // process any raw image data in callbacks before replacing
}
+ if(mInFastCacheList)
+ {
+ return false;
+ }
S32 current_discard = getCurrentDiscardLevelForFetching() ;
S32 desired_discard = getDesiredDiscardLevel();
@@ -2052,6 +2109,10 @@ bool LLViewerFetchedTexture::updateFetch()
{
make_request = false;
}
+ else if(mDesiredDiscardLevel > getMaxDiscardLevel())
+ {
+ make_request = false;
+ }
else if (mNeedsCreateTexture || mIsMissingAsset)
{
make_request = false;
@@ -2060,6 +2121,11 @@ bool LLViewerFetchedTexture::updateFetch()
{
make_request = false;
}
+ else if(mCachedRawImage.notNull() && (current_discard < 0 || current_discard > mCachedRawDiscardLevel))
+ {
+ make_request = false;
+ switchToCachedImage() ; //use the cached raw data first
+ }
//else if (!isJustBound() && mCachedRawImageReady)
//{
// make_request = false;
@@ -2152,7 +2218,10 @@ bool LLViewerFetchedTexture::updateFetch()
void LLViewerFetchedTexture::clearFetchedResults()
{
- llassert_always(!mNeedsCreateTexture && !mIsFetching);
+ if(mNeedsCreateTexture || mIsFetching)
+ {
+ return ;
+ }
cleanup();
destroyGLTexture();
@@ -2167,11 +2236,13 @@ void LLViewerFetchedTexture::forceToDeleteRequest()
{
if (mHasFetcher)
{
- LLAppViewer::getTextureFetch()->deleteRequest(getID(), true);
mHasFetcher = FALSE;
mIsFetching = FALSE ;
- resetTextureStats();
}
+
+ resetTextureStats();
+
+ mDesiredDiscardLevel = getMaxDiscardLevel() + 1;
}
void LLViewerFetchedTexture::setIsMissingAsset()
@@ -2182,7 +2253,8 @@ void LLViewerFetchedTexture::setIsMissingAsset()
}
else
{
- llwarns << mUrl << ": Marking image as missing" << llendl;
+ //it is normal no map tile on an empty region.
+ //llwarns << mUrl << ": Marking image as missing" << llendl;
}
if (mHasFetcher)
{
@@ -2214,10 +2286,18 @@ void LLViewerFetchedTexture::setLoadedCallback( loaded_callback_func loaded_call
mLoadedCallbackDesiredDiscardLevel = llmin(mLoadedCallbackDesiredDiscardLevel, (S8)discard_level) ;
}
- if(mPauseLoadedCallBacks && !pause)
+ if(mPauseLoadedCallBacks)
{
- unpauseLoadedCallbacks(src_callback_list) ;
+ if(!pause)
+ {
+ unpauseLoadedCallbacks(src_callback_list) ;
+ }
}
+ else if(pause)
+ {
+ pauseLoadedCallbacks(src_callback_list) ;
+ }
+
LLLoadedCallbackEntry* entryp = new LLLoadedCallbackEntry(loaded_callback, discard_level, keep_imageraw, userdata, src_callback_list, this, pause);
mLoadedCallbackList.push_back(entryp);
diff --git a/indra/newview/llviewertexture.h b/indra/newview/llviewertexture.h
index f1105c3705..2ea9a07e9a 100644..100755
--- a/indra/newview/llviewertexture.h
+++ b/indra/newview/llviewertexture.h
@@ -436,6 +436,8 @@ public:
void setMinDiscardLevel(S32 discard) { mMinDesiredDiscardLevel = llmin(mMinDesiredDiscardLevel,(S8)discard); }
bool updateFetch();
+ bool setDebugFetching(S32 debug_level);
+ bool isInDebug() {return mInDebug;}
void clearFetchedResults(); //clear all fetched results, for debug use.
@@ -498,6 +500,9 @@ public:
void setCanUseHTTP(bool can_use_http) {mCanUseHTTP = can_use_http;}
void forceToDeleteRequest();
+ void loadFromFastCache();
+ void setInFastCacheList(bool in_list) { mInFastCacheList = in_list; }
+ bool isInFastCacheList() { return mInFastCacheList; }
protected:
/*virtual*/ void switchToCachedImage();
S32 getCurrentDiscardLevelForFetching() ;
@@ -516,6 +521,8 @@ private:
private:
BOOL mFullyLoaded;
+ BOOL mInDebug;
+ BOOL mInFastCacheList;
protected:
std::string mLocalFileName;
diff --git a/indra/newview/llviewertextureanim.cpp b/indra/newview/llviewertextureanim.cpp
index 9f1ac7c49c..2b364851a7 100644
--- a/indra/newview/llviewertextureanim.cpp
+++ b/indra/newview/llviewertextureanim.cpp
@@ -27,21 +27,37 @@
#include "llviewerprecompiledheaders.h"
#include "llviewertextureanim.h"
+#include "llvovolume.h"
#include "llmath.h"
#include "llerror.h"
-LLViewerTextureAnim::LLViewerTextureAnim() : LLTextureAnim()
+std::vector<LLViewerTextureAnim*> LLViewerTextureAnim::sInstanceList;
+
+LLViewerTextureAnim::LLViewerTextureAnim(LLVOVolume* vobj) : LLTextureAnim()
{
+ mVObj = vobj;
mLastFrame = -1.f; // Force an update initially
mLastTime = 0.f;
mOffS = mOffT = 0;
mScaleS = mScaleT = 1;
mRot = 0;
+
+ mInstanceIndex = sInstanceList.size();
+ sInstanceList.push_back(this);
}
LLViewerTextureAnim::~LLViewerTextureAnim()
{
+ S32 end_idx = sInstanceList.size()-1;
+
+ if (end_idx != mInstanceIndex)
+ {
+ sInstanceList[mInstanceIndex] = sInstanceList[end_idx];
+ sInstanceList[mInstanceIndex]->mInstanceIndex = mInstanceIndex;
+ }
+
+ sInstanceList.pop_back();
}
void LLViewerTextureAnim::reset()
@@ -50,6 +66,14 @@ void LLViewerTextureAnim::reset()
mTimer.reset();
}
+//static
+void LLViewerTextureAnim::updateClass()
+{
+ for (std::vector<LLViewerTextureAnim*>::iterator iter = sInstanceList.begin(); iter != sInstanceList.end(); ++iter)
+ {
+ (*iter)->mVObj->animateTextures();
+ }
+}
S32 LLViewerTextureAnim::animateTextures(F32 &off_s, F32 &off_t,
F32 &scale_s, F32 &scale_t,
diff --git a/indra/newview/llviewertextureanim.h b/indra/newview/llviewertextureanim.h
index dd7bd0cb90..abbfabceb9 100644
--- a/indra/newview/llviewertextureanim.h
+++ b/indra/newview/llviewertextureanim.h
@@ -30,10 +30,18 @@
#include "lltextureanim.h"
#include "llframetimer.h"
+class LLVOVolume;
+
class LLViewerTextureAnim : public LLTextureAnim
{
+private:
+ static std::vector<LLViewerTextureAnim*> sInstanceList;
+ S32 mInstanceIndex;
+
public:
- LLViewerTextureAnim();
+ static void updateClass();
+
+ LLViewerTextureAnim(LLVOVolume* vobj);
virtual ~LLViewerTextureAnim();
/*virtual*/ void reset();
@@ -51,6 +59,7 @@ public:
F32 mRot;
protected:
+ LLVOVolume* mVObj;
LLFrameTimer mTimer;
F64 mLastTime;
F32 mLastFrame;
diff --git a/indra/newview/llviewertexturelist.cpp b/indra/newview/llviewertexturelist.cpp
index 528e0080b7..e4669cde34 100644
--- a/indra/newview/llviewertexturelist.cpp
+++ b/indra/newview/llviewertexturelist.cpp
@@ -58,7 +58,7 @@
#include "pipeline.h"
#include "llappviewer.h"
#include "llxuiparser.h"
-#include "llagent.h"
+#include "llviewerdisplay.h"
////////////////////////////////////////////////////////////////////////////
@@ -276,6 +276,7 @@ void LLViewerTextureList::shutdown()
// Flush all of the references
mLoadingStreamList.clear();
mCreateTextureList.clear();
+ mFastCacheList.clear();
mUUIDMap.clear();
@@ -453,6 +454,8 @@ LLViewerFetchedTexture* LLViewerTextureList::createImage(const LLUUID &image_id,
LLGLenum primary_format,
LLHost request_from_host)
{
+ static LLCachedControl<bool> fast_cache_fetching_enabled(gSavedSettings, "FastCacheFetchEnabled");
+
LLPointer<LLViewerFetchedTexture> imagep ;
switch(texture_type)
{
@@ -490,6 +493,11 @@ LLViewerFetchedTexture* LLViewerTextureList::createImage(const LLUUID &image_id,
imagep->forceActive() ;
}
+ if(fast_cache_fetching_enabled)
+ {
+ mFastCacheList.insert(imagep);
+ imagep->setInFastCacheList(true);
+ }
return imagep ;
}
@@ -503,6 +511,7 @@ LLViewerFetchedTexture *LLViewerTextureList::findImage(const LLUUID &image_id)
void LLViewerTextureList::addImageToList(LLViewerFetchedTexture *image)
{
+ assert_main_thread();
llassert_always(mInitialized) ;
llassert(image);
if (image->isInImageList())
@@ -519,6 +528,7 @@ void LLViewerTextureList::addImageToList(LLViewerFetchedTexture *image)
void LLViewerTextureList::removeImageFromList(LLViewerFetchedTexture *image)
{
+ assert_main_thread();
llassert_always(mInitialized) ;
llassert(image);
if (!image->isInImageList())
@@ -593,16 +603,24 @@ static LLFastTimer::DeclareTimer FTM_IMAGE_MARK_DIRTY("Dirty Images");
static LLFastTimer::DeclareTimer FTM_IMAGE_UPDATE_PRIORITIES("Prioritize");
static LLFastTimer::DeclareTimer FTM_IMAGE_CALLBACKS("Callbacks");
static LLFastTimer::DeclareTimer FTM_IMAGE_FETCH("Fetch");
+static LLFastTimer::DeclareTimer FTM_FAST_CACHE_IMAGE_FETCH("Fast Cache Fetch");
static LLFastTimer::DeclareTimer FTM_IMAGE_CREATE("Create");
static LLFastTimer::DeclareTimer FTM_IMAGE_STATS("Stats");
void LLViewerTextureList::updateImages(F32 max_time)
{
- if(gAgent.getTeleportState() != LLAgent::TELEPORT_NONE)
+ static BOOL cleared = FALSE;
+ if(gTeleportDisplay)
{
- clearFetchingRequests();
+ if(!cleared)
+ {
+ clearFetchingRequests();
+ gPipeline.clearRebuildGroups();
+ cleared = TRUE;
+ }
return;
}
+ cleared = FALSE;
LLAppViewer::getTextureFetch()->setTextureBandwidth(LLViewerStats::getInstance()->mTextureKBitStat.getMeanPerSec());
@@ -613,6 +631,11 @@ void LLViewerTextureList::updateImages(F32 max_time)
LLViewerStats::getInstance()->mRawMemStat.addValue((F32)BYTES_TO_MEGA_BYTES(LLImageRaw::sGlobalRawMemory));
LLViewerStats::getInstance()->mFormattedMemStat.addValue((F32)BYTES_TO_MEGA_BYTES(LLImageFormatted::sGlobalFormattedMemory));
+ {
+ //loading from fast cache
+ LLFastTimer t(FTM_FAST_CACHE_IMAGE_FETCH);
+ max_time -= updateImagesLoadingFastCache(max_time);
+ }
{
LLFastTimer t(FTM_IMAGE_UPDATE_PRIORITIES);
@@ -673,14 +696,13 @@ void LLViewerTextureList::clearFetchingRequests()
return;
}
+ LLAppViewer::getTextureFetch()->deleteAllRequests();
+
for (image_priority_list_t::iterator iter = mImageList.begin();
iter != mImageList.end(); ++iter)
{
- LLViewerFetchedTexture* image = *iter;
- if(image->hasFetcher())
- {
- image->forceToDeleteRequest() ;
- }
+ LLViewerFetchedTexture* imagep = *iter;
+ imagep->forceToDeleteRequest() ;
}
}
@@ -688,10 +710,11 @@ void LLViewerTextureList::updateImagesDecodePriorities()
{
// Update the decode priority for N images each frame
{
- const size_t max_update_count = llmin((S32) (1024*gFrameIntervalSeconds) + 1, 32); //target 1024 textures per second
- S32 update_counter = llmin(max_update_count, mUUIDMap.size()/10);
+ static const S32 MAX_PRIO_UPDATES = gSavedSettings.getS32("TextureFetchUpdatePriorities"); // default: 32
+ const size_t max_update_count = llmin((S32) (MAX_PRIO_UPDATES*MAX_PRIO_UPDATES*gFrameIntervalSeconds) + 1, MAX_PRIO_UPDATES);
+ S32 update_counter = llmin(max_update_count, mUUIDMap.size());
uuid_map_t::iterator iter = mUUIDMap.upper_bound(mLastUpdateUUID);
- while(update_counter > 0 && !mUUIDMap.empty())
+ while ((update_counter-- > 0) && !mUUIDMap.empty())
{
if (iter == mUUIDMap.end())
{
@@ -699,13 +722,19 @@ void LLViewerTextureList::updateImagesDecodePriorities()
}
mLastUpdateUUID = iter->first;
LLPointer<LLViewerFetchedTexture> imagep = iter->second;
- ++iter; // safe to incrament now
+ ++iter; // safe to increment now
+
+ if(imagep->isInDebug())
+ {
+ update_counter--;
+ continue; //is in debug, ignore.
+ }
//
// Flush formatted images using a lazy flush
//
const F32 LAZY_FLUSH_TIMEOUT = 30.f; // stop decoding
- const F32 MAX_INACTIVE_TIME = 50.f; // actually delete
+ const F32 MAX_INACTIVE_TIME = 20.f; // actually delete
S32 min_refs = 3; // 1 for mImageList, 1 for mUUIDMap, 1 for local reference
S32 num_refs = imagep->getNumRefs();
@@ -754,7 +783,16 @@ void LLViewerTextureList::updateImagesDecodePriorities()
imagep->setInactive() ;
}
}
-
+
+ if (!imagep->isInImageList())
+ {
+ continue;
+ }
+ if(imagep->isInFastCacheList())
+ {
+ continue; //wait for loading from the fast cache.
+ }
+
imagep->processTextureStats();
F32 old_priority = imagep->getDecodePriority();
F32 old_priority_test = llmax(old_priority, 0.0f);
@@ -764,15 +802,35 @@ void LLViewerTextureList::updateImagesDecodePriorities()
if ((decode_priority_test < old_priority_test * .8f) ||
(decode_priority_test > old_priority_test * 1.25f))
{
- removeImageFromList(imagep);
+ mImageList.erase(imagep) ;
imagep->setDecodePriority(decode_priority);
- addImageToList(imagep);
+ mImageList.insert(imagep);
}
- update_counter--;
}
}
}
+void LLViewerTextureList::setDebugFetching(LLViewerFetchedTexture* tex, S32 debug_level)
+{
+ if(!tex->setDebugFetching(debug_level))
+ {
+ return;
+ }
+
+ const F32 DEBUG_PRIORITY = 100000.f;
+ F32 old_priority_test = llmax(tex->getDecodePriority(), 0.0f);
+ F32 decode_priority_test = DEBUG_PRIORITY;
+
+ // Ignore < 20% difference
+ if ((decode_priority_test < old_priority_test * .8f) ||
+ (decode_priority_test > old_priority_test * 1.25f))
+ {
+ removeImageFromList(tex);
+ tex->setDecodePriority(decode_priority_test);
+ addImageToList(tex);
+ }
+}
+
/*
static U8 get_image_type(LLViewerFetchedTexture* imagep, LLHost target_host)
{
@@ -827,6 +885,36 @@ F32 LLViewerTextureList::updateImagesCreateTextures(F32 max_time)
return create_timer.getElapsedTimeF32();
}
+F32 LLViewerTextureList::updateImagesLoadingFastCache(F32 max_time)
+{
+ if (gGLManager.mIsDisabled) return 0.0f;
+ if(mFastCacheList.empty())
+ {
+ return 0.f;
+ }
+
+ //
+ // loading texture raw data from the fast cache directly.
+ //
+
+ LLTimer timer;
+ image_list_t::iterator enditer = mFastCacheList.begin();
+ for (image_list_t::iterator iter = mFastCacheList.begin();
+ iter != mFastCacheList.end();)
+ {
+ image_list_t::iterator curiter = iter++;
+ enditer = iter;
+ LLViewerFetchedTexture *imagep = *curiter;
+ imagep->loadFromFastCache();
+ if (timer.getElapsedTimeF32() > max_time)
+ {
+ break;
+ }
+ }
+ mFastCacheList.erase(mFastCacheList.begin(), enditer);
+ return timer.getElapsedTimeF32();
+}
+
void LLViewerTextureList::forceImmediateUpdate(LLViewerFetchedTexture* imagep)
{
if(!imagep)
@@ -850,15 +938,24 @@ F32 LLViewerTextureList::updateImagesFetchTextures(F32 max_time)
{
LLTimer image_op_timer;
- // Update the decode priority for N images each frame
- // Make a list with 32 high priority entries + 256 cycled entries
- const size_t max_priority_count = llmin((S32) (256*10.f*gFrameIntervalSeconds)+1, 32);
- const size_t max_update_count = llmin((S32) (1024*10.f*gFrameIntervalSeconds)+1, 256);
+ // Update fetch for N images each frame
+ static const S32 MAX_HIGH_PRIO_COUNT = gSavedSettings.getS32("TextureFetchUpdateHighPriority"); // default: 32
+ static const S32 MAX_UPDATE_COUNT = gSavedSettings.getS32("TextureFetchUpdateMaxMediumPriority"); // default: 256
+ static const S32 MIN_UPDATE_COUNT = gSavedSettings.getS32("TextureFetchUpdateMinMediumPriority"); // default: 32
+ static const F32 MIN_PRIORITY_THRESHOLD = gSavedSettings.getF32("TextureFetchUpdatePriorityThreshold"); // default: 0.0
+ static const bool SKIP_LOW_PRIO = gSavedSettings.getBOOL("TextureFetchUpdateSkipLowPriority"); // default: false
+
+ size_t max_priority_count = llmin((S32) (MAX_HIGH_PRIO_COUNT*MAX_HIGH_PRIO_COUNT*gFrameIntervalSeconds)+1, MAX_HIGH_PRIO_COUNT);
+ max_priority_count = llmin(max_priority_count, mImageList.size());
+
+ size_t total_update_count = mUUIDMap.size();
+ size_t max_update_count = llmin((S32) (MAX_UPDATE_COUNT*MAX_UPDATE_COUNT*gFrameIntervalSeconds)+1, MAX_UPDATE_COUNT);
+ max_update_count = llmin(max_update_count, total_update_count);
- // 32 high priority entries
+ // MAX_HIGH_PRIO_COUNT high priority entries
typedef std::vector<LLViewerFetchedTexture*> entries_list_t;
entries_list_t entries;
- size_t update_counter = llmin(max_priority_count, mImageList.size());
+ size_t update_counter = max_priority_count;
image_priority_list_t::iterator iter1 = mImageList.begin();
while(update_counter > 0)
{
@@ -868,43 +965,46 @@ F32 LLViewerTextureList::updateImagesFetchTextures(F32 max_time)
update_counter--;
}
- // 256 cycled entries
- update_counter = llmin(max_update_count, mUUIDMap.size());
+ // MAX_UPDATE_COUNT cycled entries
+ update_counter = max_update_count;
if(update_counter > 0)
{
uuid_map_t::iterator iter2 = mUUIDMap.upper_bound(mLastFetchUUID);
- uuid_map_t::iterator iter2p = iter2;
- while(update_counter > 0)
+ while ((update_counter > 0) && (total_update_count > 0))
{
if (iter2 == mUUIDMap.end())
{
iter2 = mUUIDMap.begin();
}
- entries.push_back(iter2->second);
- iter2p = iter2++;
- update_counter--;
+ LLViewerFetchedTexture* imagep = iter2->second;
+ // Skip the textures where there's really nothing to do so to give some times to others. Also skip the texture if it's already in the high prio set.
+ if (!SKIP_LOW_PRIO || (SKIP_LOW_PRIO && ((imagep->getDecodePriority() > MIN_PRIORITY_THRESHOLD) || imagep->hasFetcher())))
+ {
+ entries.push_back(imagep);
+ update_counter--;
+ }
+
+ iter2++;
+ total_update_count--;
}
-
- mLastFetchUUID = iter2p->first;
}
S32 fetch_count = 0;
- S32 min_count = max_priority_count + max_update_count/4;
+ size_t min_update_count = llmin(MIN_UPDATE_COUNT,(S32)(entries.size()-max_priority_count));
+ S32 min_count = max_priority_count + min_update_count;
for (entries_list_t::iterator iter3 = entries.begin();
iter3 != entries.end(); )
{
LLViewerFetchedTexture* imagep = *iter3++;
-
- bool fetching = imagep->updateFetch();
- if (fetching)
+ fetch_count += (imagep->updateFetch() ? 1 : 0);
+ if (min_count <= min_update_count)
{
- fetch_count++;
+ mLastFetchUUID = imagep->getID();
}
- if (min_count <= 0 && image_op_timer.getElapsedTimeF32() > max_time)
+ if ((min_count-- <= 0) && (image_op_timer.getElapsedTimeF32() > max_time))
{
break;
}
- min_count--;
}
//if (fetch_count == 0)
//{
@@ -936,6 +1036,9 @@ void LLViewerTextureList::decodeAllImages(F32 max_time)
{
LLTimer timer;
+ //loading from fast cache
+ updateImagesLoadingFastCache(max_time);
+
// Update texture stats and priorities
std::vector<LLPointer<LLViewerFetchedTexture> > image_list;
for (image_priority_list_t::iterator iter = mImageList.begin();
diff --git a/indra/newview/llviewertexturelist.h b/indra/newview/llviewertexturelist.h
index e89997fe28..3dda973d3f 100644
--- a/indra/newview/llviewertexturelist.h
+++ b/indra/newview/llviewertexturelist.h
@@ -111,6 +111,7 @@ public:
void doPrefetchImages();
void clearFetchingRequests();
+ void setDebugFetching(LLViewerFetchedTexture* tex, S32 debug_level);
static S32 getMinVideoRamSetting();
static S32 getMaxVideoRamSetting(bool get_recommended = false);
@@ -120,6 +121,7 @@ private:
F32 updateImagesCreateTextures(F32 max_time);
F32 updateImagesFetchTextures(F32 max_time);
void updateImagesUpdateStats();
+ F32 updateImagesLoadingFastCache(F32 max_time);
void addImage(LLViewerFetchedTexture *image);
void deleteImage(LLViewerFetchedTexture *image);
@@ -173,6 +175,7 @@ public:
image_list_t mLoadingStreamList;
image_list_t mCreateTextureList;
image_list_t mCallbackList;
+ image_list_t mFastCacheList;
// Note: just raw pointers because they are never referenced, just compared against
std::set<LLViewerFetchedTexture*> mDirtyTextureList;
diff --git a/indra/newview/llviewervisualparam.h b/indra/newview/llviewervisualparam.h
index dd7751acd7..3bc95cbfbf 100644
--- a/indra/newview/llviewervisualparam.h
+++ b/indra/newview/llviewervisualparam.h
@@ -83,11 +83,11 @@ public:
// New Virtual functions
virtual F32 getTotalDistortion() = 0;
- virtual const LLVector3& getAvgDistortion() = 0;
+ virtual const LLVector4a& getAvgDistortion() = 0;
virtual F32 getMaxDistortion() = 0;
- virtual LLVector3 getVertexDistortion(S32 index, LLPolyMesh *mesh) = 0;
- virtual const LLVector3* getFirstDistortion(U32 *index, LLPolyMesh **mesh) = 0;
- virtual const LLVector3* getNextDistortion(U32 *index, LLPolyMesh **mesh) = 0;
+ virtual LLVector4a getVertexDistortion(S32 index, LLPolyMesh *mesh) = 0;
+ virtual const LLVector4a* getFirstDistortion(U32 *index, LLPolyMesh **mesh) = 0;
+ virtual const LLVector4a* getNextDistortion(U32 *index, LLPolyMesh **mesh) = 0;
// interface methods
F32 getDisplayOrder() const { return getInfo()->mEditGroupDisplayOrder; }
diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp
index 39e330ad66..1798d554b9 100755
--- a/indra/newview/llviewerwindow.cpp
+++ b/indra/newview/llviewerwindow.cpp
@@ -126,6 +126,7 @@
#include "llmorphview.h"
#include "llmoveview.h"
#include "llnavigationbar.h"
+#include "llpanelpathfindingrebakenavmesh.h"
#include "llpaneltopinfobar.h"
#include "llpopupview.h"
#include "llpreviewtexture.h"
@@ -175,6 +176,7 @@
#include "llviewershadermgr.h"
#include "llviewerstats.h"
#include "llvoavatarself.h"
+#include "llvopartgroup.h"
#include "llvovolume.h"
#include "llworld.h"
#include "llworldmapview.h"
@@ -613,7 +615,7 @@ public:
addText(xpos, ypos, llformat("%d/%d Mesh HTTP Requests/Retries", LLMeshRepository::sHTTPRequestCount,
LLMeshRepository::sHTTPRetryCount));
ypos += y_inc;
-
+
addText(xpos, ypos, llformat("%d/%d Mesh LOD Pending/Processing", LLMeshRepository::sLODPending, LLMeshRepository::sLODProcessing));
ypos += y_inc;
@@ -1553,8 +1555,12 @@ LLViewerWindow::LLViewerWindow(const Params& p)
LLNotifications::instance().getChannel("VW_alerts")->connectChanged(&LLViewerWindow::onAlert);
LLNotifications::instance().getChannel("VW_alertmodal")->connectChanged(&LLViewerWindow::onAlert);
- LLNotifications::instance().setIgnoreAllNotifications(gSavedSettings.getBOOL("IgnoreAllNotifications"));
- llinfos << "NOTE: ALL NOTIFICATIONS THAT OCCUR WILL GET ADDED TO IGNORE LIST FOR LATER RUNS." << llendl;
+ bool ignore = gSavedSettings.getBOOL("IgnoreAllNotifications");
+ LLNotifications::instance().setIgnoreAllNotifications(ignore);
+ if (ignore)
+ {
+ llinfos << "NOTE: ALL NOTIFICATIONS THAT OCCUR WILL GET ADDED TO IGNORE LIST FOR LATER RUNS." << llendl;
+ }
// Default to application directory.
LLViewerWindow::sSnapshotBaseName = "Snapshot";
@@ -1704,9 +1710,6 @@ LLViewerWindow::LLViewerWindow(const Params& p)
// Can't have spaces in settings.ini strings, so use underscores instead and convert them.
LLStringUtil::replaceChar(mOverlayTitle, '_', ' ');
- // sync the keyboard's setting with the saved setting
- gSavedSettings.getControl("NumpadControl")->firePropertyChanged();
-
mDebugText = new LLDebugText(this);
mWorldViewRectScaled = calcScaledRect(mWorldViewRectRaw, mDisplayScale);
@@ -1923,11 +1926,16 @@ void LLViewerWindow::initWorldUI()
getRootView()->addChild(gHUDView);
}
- LLPanel* panel_ssf_container = getRootView()->getChild<LLPanel>("stand_stop_flying_container");
+ LLPanel* panel_ssf_container = getRootView()->getChild<LLPanel>("state_management_buttons_container");
+
LLPanelStandStopFlying* panel_stand_stop_flying = LLPanelStandStopFlying::getInstance();
panel_ssf_container->addChild(panel_stand_stop_flying);
- panel_ssf_container->setVisible(TRUE);
+ LLPanelPathfindingRebakeNavmesh *panel_rebake_navmesh = LLPanelPathfindingRebakeNavmesh::getInstance();
+ panel_ssf_container->addChild(panel_rebake_navmesh);
+
+ panel_ssf_container->setVisible(TRUE);
+
// Load and make the toolbars visible
// Note: we need to load the toolbars only *after* the user is logged in and IW
if (gToolBarView)
@@ -1973,12 +1981,12 @@ void LLViewerWindow::shutdownViews()
gMorphView->setVisible(FALSE);
}
llinfos << "Global views cleaned." << llendl ;
-
+
// DEV-40930: Clear sModalStack. Otherwise, any LLModalDialog left open
// will crump with LL_ERRS.
LLModalDialog::shutdownModals();
llinfos << "LLModalDialog shut down." << llendl;
-
+
// destroy the nav bar, not currently part of gViewerWindow
// *TODO: Make LLNavigationBar part of gViewerWindow
if (LLNavigationBar::instanceExists())
@@ -1986,17 +1994,17 @@ void LLViewerWindow::shutdownViews()
delete LLNavigationBar::getInstance();
}
llinfos << "LLNavigationBar destroyed." << llendl ;
-
+
// destroy menus after instantiating navbar above, as it needs
// access to gMenuHolder
cleanup_menus();
llinfos << "menus destroyed." << llendl ;
-
+
// Delete all child views.
delete mRootView;
mRootView = NULL;
llinfos << "RootView deleted." << llendl ;
-
+
// Automatically deleted as children of mRootView. Fix the globals.
gStatusBar = NULL;
gIMMgr = NULL;
@@ -3168,8 +3176,7 @@ void LLViewerWindow::updateLayout()
|| (tool != LLToolPie::getInstance() // not default tool
&& tool != LLToolCompGun::getInstance() // not coming out of mouselook
&& !suppress_toolbox // not override in third person
- && LLToolMgr::getInstance()->getCurrentToolset() != gFaceEditToolset // not special mode
- && LLToolMgr::getInstance()->getCurrentToolset() != gMouselookToolset
+ && LLToolMgr::getInstance()->getCurrentToolset()->isShowFloaterTools()
&& (!captor || dynamic_cast<LLView*>(captor) != NULL))) // not dragging
{
// Force floater tools to be visible (unless minimized)
@@ -3523,8 +3530,11 @@ void LLViewerWindow::renderSelections( BOOL for_gl_pick, BOOL pick_parcel_walls,
{
LLSelectNode* nodep = *iter;
LLViewerObject* object = nodep->getObject();
+ LLViewerObject *root_object = (object == NULL) ? NULL : object->getRootEdit();
BOOL this_object_movable = FALSE;
- if (object->permMove() && (object->permModify() || selecting_linked_set))
+ if (object->permMove() && !object->isPermanentEnforced() &&
+ ((root_object == NULL) || !root_object->isPermanentEnforced()) &&
+ (object->permModify() || selecting_linked_set))
{
moveable_object_selected = TRUE;
this_object_movable = TRUE;
@@ -4660,6 +4670,8 @@ void LLViewerWindow::stopGL(BOOL save_state)
LLVOAvatar::destroyGL();
stop_glerror();
+ LLVOPartGroup::destroyGL();
+
LLViewerDynamicTexture::destroyGL();
stop_glerror();
@@ -4713,7 +4725,8 @@ void LLViewerWindow::restoreGL(const std::string& progress_message)
gBumpImageList.restoreGL();
LLViewerDynamicTexture::restoreGL();
LLVOAvatar::restoreGL();
-
+ LLVOPartGroup::restoreGL();
+
gResizeScreenTexture = TRUE;
gWindowResized = TRUE;
@@ -4759,8 +4772,11 @@ void LLViewerWindow::requestResolutionUpdate()
mResDirty = true;
}
+static LLFastTimer::DeclareTimer FTM_WINDOW_CHECK_SETTINGS("Window Settings");
+
void LLViewerWindow::checkSettings()
{
+ LLFastTimer t(FTM_WINDOW_CHECK_SETTINGS);
if (mStatesDirty)
{
gGL.refreshState();
@@ -5196,8 +5212,10 @@ void LLPickInfo::getSurfaceInfo()
if (objectp->mDrawable.notNull() && mObjectFace > -1)
{
LLFace* facep = objectp->mDrawable->getFace(mObjectFace);
-
- mUVCoords = facep->surfaceToTexture(mSTCoords, mIntersection, mNormal);
+ if (facep)
+ {
+ mUVCoords = facep->surfaceToTexture(mSTCoords, mIntersection, mNormal);
+ }
}
// and XY coords:
diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp
index eada77156e..366b6004be 100644..100755
--- a/indra/newview/llvoavatar.cpp
+++ b/indra/newview/llvoavatar.cpp
@@ -817,6 +817,7 @@ LLVOAvatar::~LLVOAvatar()
lldebugs << "LLVOAvatar Destructor (0x" << this << ") id:" << mID << llendl;
mRoot.removeAllChildren();
+ mJointMap.clear();
deleteAndClearArray(mSkeleton);
deleteAndClearArray(mCollisionVolumes);
@@ -961,7 +962,7 @@ void LLVOAvatar::deleteLayerSetCaches(bool clearAll)
}
if (mBakedTextureDatas[i].mMaskTexName)
{
- glDeleteTextures(1, (GLuint*)&(mBakedTextureDatas[i].mMaskTexName));
+ LLImageGL::deleteTextures(LLTexUnit::TT_TEXTURE, 0, -1, 1, (GLuint*)&(mBakedTextureDatas[i].mMaskTexName));
mBakedTextureDatas[i].mMaskTexName = 0 ;
}
}
@@ -1459,8 +1460,6 @@ void LLVOAvatar::onShift(const LLVector4a& shift_vector)
const LLVector3& shift = reinterpret_cast<const LLVector3&>(shift_vector);
mLastAnimExtents[0] += shift;
mLastAnimExtents[1] += shift;
- mNeedsImpostorUpdate = TRUE;
- mNeedsAnimUpdate = TRUE;
}
void LLVOAvatar::updateSpatialExtents(LLVector4a& newMin, LLVector4a &newMax)
@@ -1934,6 +1933,7 @@ void LLVOAvatar::buildCharacter()
// remove all of mRoot's children
//-------------------------------------------------------------------------
mRoot.removeAllChildren();
+ mJointMap.clear();
mIsBuilt = FALSE;
//-------------------------------------------------------------------------
@@ -2094,11 +2094,17 @@ void LLVOAvatar::releaseMeshData()
if (mDrawable.notNull())
{
LLFace* facep = mDrawable->getFace(0);
- facep->setSize(0, 0);
- for(S32 i = mNumInitFaces ; i < mDrawable->getNumFaces(); i++)
+ if (facep)
{
- facep = mDrawable->getFace(i);
facep->setSize(0, 0);
+ for(S32 i = mNumInitFaces ; i < mDrawable->getNumFaces(); i++)
+ {
+ facep = mDrawable->getFace(i);
+ if (facep)
+ {
+ facep->setSize(0, 0);
+ }
+ }
}
}
@@ -2183,15 +2189,20 @@ void LLVOAvatar::updateMeshData()
part_index-- ;
}
- LLFace* facep ;
+ LLFace* facep = NULL;
if(f_num < mDrawable->getNumFaces())
{
facep = mDrawable->getFace(f_num);
}
else
{
- facep = mDrawable->addFace(mDrawable->getFace(0)->getPool(), mDrawable->getFace(0)->getTexture()) ;
+ facep = mDrawable->getFace(0);
+ if (facep)
+ {
+ facep = mDrawable->addFace(facep->getPool(), facep->getTexture()) ;
+ }
}
+ if (!facep) continue;
// resize immediately
facep->setSize(num_vertices, num_indices);
@@ -2379,7 +2390,7 @@ S32 LLVOAvatar::setTETexture(const U8 te, const LLUUID& uuid)
}
}
-static LLFastTimer::DeclareTimer FTM_AVATAR_UPDATE("Update Avatar");
+static LLFastTimer::DeclareTimer FTM_AVATAR_UPDATE("Avatar Update");
static LLFastTimer::DeclareTimer FTM_JOINT_UPDATE("Update Joints");
//------------------------------------------------------------------------
@@ -2412,7 +2423,7 @@ void LLVOAvatar::dumpAnimationState()
//------------------------------------------------------------------------
// idleUpdate()
//------------------------------------------------------------------------
-BOOL LLVOAvatar::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time)
+void LLVOAvatar::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time)
{
LLMemType mt(LLMemType::MTYPE_AVATAR);
LLFastTimer t(FTM_AVATAR_UPDATE);
@@ -2420,12 +2431,12 @@ BOOL LLVOAvatar::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time)
if (isDead())
{
llinfos << "Warning! Idle on dead avatar" << llendl;
- return TRUE;
+ return;
}
if (!(gPipeline.hasRenderType(LLPipeline::RENDER_TYPE_AVATAR)))
{
- return TRUE;
+ return;
}
checkTextureLoading() ;
@@ -2508,8 +2519,6 @@ BOOL LLVOAvatar::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time)
idleUpdateNameTag( root_pos_last );
idleUpdateRenderCost();
-
- return TRUE;
}
void LLVOAvatar::idleUpdateVoiceVisualizer(bool voice_enabled)
@@ -2681,7 +2690,7 @@ void LLVOAvatar::idleUpdateMisc(bool detailed_update)
if (isImpostor() && !mNeedsImpostorUpdate)
{
- LLVector4a ext[2];
+ LL_ALIGN_16(LLVector4a ext[2]);
F32 distance;
LLVector3 angle;
@@ -4236,10 +4245,14 @@ U32 LLVOAvatar::renderSkinned(EAvatarRenderPass pass)
mNeedsSkin = FALSE;
mLastSkinTime = gFrameTimeSeconds;
- LLVertexBuffer* vb = mDrawable->getFace(0)->getVertexBuffer();
- if (vb)
+ LLFace * face = mDrawable->getFace(0);
+ if (face)
{
- vb->flush();
+ LLVertexBuffer* vb = face->getVertexBuffer();
+ if (vb)
+ {
+ vb->flush();
+ }
}
}
}
@@ -5122,7 +5135,20 @@ const LLUUID& LLVOAvatar::getID() const
// RN: avatar joints are multi-rooted to include screen-based attachments
LLJoint *LLVOAvatar::getJoint( const std::string &name )
{
- LLJoint* jointp = mRoot.findJoint(name);
+ joint_map_t::iterator iter = mJointMap.find(name);
+
+ LLJoint* jointp = NULL;
+
+ if (iter == mJointMap.end() || iter->second == NULL)
+ { //search for joint and cache found joint in lookup table
+ jointp = mRoot.findJoint(name);
+ mJointMap[name] = jointp;
+ }
+ else
+ { //return cached pointer
+ jointp = iter->second;
+ }
+
return jointp;
}
@@ -6650,7 +6676,7 @@ void LLVOAvatar::updateMeshTextures()
if(!isSelf())
{
src_callback_list = &mCallbackTextureList ;
- paused = mLoadedCallbacksPaused ;
+ paused = !isVisible();
}
std::vector<BOOL> is_layer_baked;
@@ -7195,7 +7221,7 @@ void LLVOAvatar::onFirstTEMessageReceived()
if(!isSelf())
{
src_callback_list = &mCallbackTextureList ;
- paused = mLoadedCallbacksPaused ;
+ paused = !isVisible();
}
for (U32 i = 0; i < mBakedTextureDatas.size(); i++)
@@ -7492,7 +7518,7 @@ void LLVOAvatar::onBakedTextureMasksLoaded( BOOL success, LLViewerFetchedTexture
}
U32 gl_name;
- LLImageGL::generateTextures(1, &gl_name );
+ LLImageGL::generateTextures(LLTexUnit::TT_TEXTURE, GL_ALPHA8, 1, &gl_name );
stop_glerror();
gGL.getTexUnit(0)->bindManual(LLTexUnit::TT_TEXTURE, gl_name);
@@ -7529,7 +7555,7 @@ void LLVOAvatar::onBakedTextureMasksLoaded( BOOL success, LLViewerFetchedTexture
maskData->mLastDiscardLevel = discard_level;
if (self->mBakedTextureDatas[baked_index].mMaskTexName)
{
- LLImageGL::deleteTextures(1, &(self->mBakedTextureDatas[baked_index].mMaskTexName));
+ LLImageGL::deleteTextures(LLTexUnit::TT_TEXTURE, 0, -1, 1, &(self->mBakedTextureDatas[baked_index].mMaskTexName));
}
self->mBakedTextureDatas[baked_index].mMaskTexName = gl_name;
found_texture_id = true;
@@ -8395,7 +8421,7 @@ BOOL LLVOAvatar::updateLOD()
BOOL res = updateJointLODs();
LLFace* facep = mDrawable->getFace(0);
- if (!facep->getVertexBuffer())
+ if (!facep || !facep->getVertexBuffer())
{
dirtyMesh(2);
}
diff --git a/indra/newview/llvoavatar.h b/indra/newview/llvoavatar.h
index 6fb56a4c0b..1adb680962 100644..100755
--- a/indra/newview/llvoavatar.h
+++ b/indra/newview/llvoavatar.h
@@ -93,6 +93,16 @@ protected:
**/
public:
+ void* operator new(size_t size)
+ {
+ return ll_aligned_malloc_16(size);
+ }
+
+ void operator delete(void* ptr)
+ {
+ ll_aligned_free_16(ptr);
+ }
+
LLVOAvatar(const LLUUID &id, const LLPCode pcode, LLViewerRegion *regionp);
virtual void markDead();
static void initClass(); // Initialize data that's only init'd once per class.
@@ -124,7 +134,7 @@ public:
U32 block_num,
const EObjectUpdateType update_type,
LLDataPacker *dp);
- virtual BOOL idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time);
+ virtual void idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time);
virtual BOOL updateLOD();
BOOL updateJointLODs();
void updateLODRiggedAttachments( void );
@@ -215,7 +225,7 @@ public:
bool isBuilt() const { return mIsBuilt; }
private: //aligned members
- LLVector4a mImpostorExtents[2];
+ LL_ALIGN_16(LLVector4a mImpostorExtents[2]);
private:
BOOL mSupportsAlphaLayers; // For backwards compatibility, TRUE for 1.23+ clients
@@ -356,6 +366,10 @@ public:
LLVector3 mHeadOffset; // current head position
LLViewerJoint mRoot;
+
+ typedef std::map<std::string, LLJoint*> joint_map_t;
+ joint_map_t mJointMap;
+
protected:
static BOOL parseSkeletonFile(const std::string& filename);
void buildCharacter();
diff --git a/indra/newview/llvoavatarself.cpp b/indra/newview/llvoavatarself.cpp
index d2609e5587..7a81063f83 100644..100755
--- a/indra/newview/llvoavatarself.cpp
+++ b/indra/newview/llvoavatarself.cpp
@@ -668,15 +668,13 @@ BOOL LLVOAvatarSelf::updateCharacter(LLAgent &agent)
}
// virtual
-BOOL LLVOAvatarSelf::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time)
+void LLVOAvatarSelf::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time)
{
- if (!isAgentAvatarValid())
+ if (isAgentAvatarValid())
{
- return TRUE;
+ LLVOAvatar::idleUpdate(agent, world, time);
+ idleUpdateTractorBeam();
}
- LLVOAvatar::idleUpdate(agent, world, time);
- idleUpdateTractorBeam();
- return TRUE;
}
// virtual
@@ -795,7 +793,7 @@ void LLVOAvatarSelf::stopMotionFromSource(const LLUUID& source_id)
LLViewerObject* object = gObjectList.findObject(source_id);
if (object)
{
- object->mFlags &= ~FLAGS_ANIM_SOURCE;
+ object->setFlagsWithoutUpdate(FLAGS_ANIM_SOURCE, FALSE);
}
}
@@ -2132,9 +2130,7 @@ LLSD LLVOAvatarSelf::metricsData()
{
// runway - add region info
LLSD result;
- result["id"] = getID();
result["rez_status"] = LLVOAvatar::rezStatusToString(getRezzedStatus());
- result["is_self"] = isSelf();
std::vector<S32> rez_counts;
LLVOAvatar::getNearbyRezzedStats(rez_counts);
result["nearby"] = LLSD::emptyMap();
@@ -2148,7 +2144,6 @@ LLSD LLVOAvatarSelf::metricsData()
result["timers"]["ruth"] = mRuthTimer.getElapsedTimeF32();
result["timers"]["invisible"] = mInvisibleTimer.getElapsedTimeF32();
result["timers"]["fully_loaded"] = mFullyLoadedTimer.getElapsedTimeF32();
- result["phases"] = getPhases().dumpPhases();
result["startup"] = LLStartUp::getPhases().dumpPhases();
return result;
@@ -2157,7 +2152,12 @@ LLSD LLVOAvatarSelf::metricsData()
class ViewerAppearanceChangeMetricsResponder: public LLCurl::Responder
{
public:
- ViewerAppearanceChangeMetricsResponder()
+ ViewerAppearanceChangeMetricsResponder( S32 expected_sequence,
+ volatile const S32 & live_sequence,
+ volatile bool & reporting_started):
+ mExpectedSequence(expected_sequence),
+ mLiveSequence(live_sequence),
+ mReportingStarted(reporting_started)
{
}
@@ -2176,14 +2176,44 @@ public:
error(status,reason);
}
}
+
+ // virtual
+ void error(U32 status_num, const std::string & reason)
+ {
+ }
+
+ // virtual
+ void result(const LLSD & content)
+ {
+ if (mLiveSequence == mExpectedSequence)
+ {
+ mReportingStarted = true;
+ }
+ }
+
+private:
+ S32 mExpectedSequence;
+ volatile const S32 & mLiveSequence;
+ volatile bool & mReportingStarted;
};
void LLVOAvatarSelf::sendAppearanceChangeMetrics()
{
// gAgentAvatarp->stopAllPhases();
+ static volatile bool reporting_started(false);
+ static volatile S32 report_sequence(0);
LLSD msg = metricsData();
msg["message"] = "ViewerAppearanceChangeMetrics";
+ msg["session_id"] = gAgentSessionID;
+ msg["agent_id"] = gAgentID;
+ msg["sequence"] = report_sequence;
+ msg["initial"] = !reporting_started;
+ msg["break"] = false;
+
+ // Update sequence number
+ if (S32_MAX == ++report_sequence)
+ report_sequence = 0;
LL_DEBUGS("Avatar") << avString() << "message: " << ll_pretty_print_sd(msg) << LL_ENDL;
std::string caps_url;
@@ -2196,8 +2226,10 @@ void LLVOAvatarSelf::sendAppearanceChangeMetrics()
{
LLCurlRequest::headers_t headers;
LLHTTPClient::post(caps_url,
- msg,
- new ViewerAppearanceChangeMetricsResponder);
+ msg,
+ new ViewerAppearanceChangeMetricsResponder(report_sequence,
+ report_sequence,
+ reporting_started));
}
}
@@ -2751,7 +2783,7 @@ void LLVOAvatarSelf::deleteScratchTextures()
namep;
namep = sScratchTexNames.getNextData() )
{
- LLImageGL::deleteTextures(1, (U32 *)namep );
+ LLImageGL::deleteTextures(LLTexUnit::TT_TEXTURE, 0, -1, 1, (U32 *)namep );
stop_glerror();
}
diff --git a/indra/newview/llvoavatarself.h b/indra/newview/llvoavatarself.h
index 543891ca63..7bd0c0bf93 100644..100755
--- a/indra/newview/llvoavatarself.h
+++ b/indra/newview/llvoavatarself.h
@@ -49,6 +49,16 @@ class LLVOAvatarSelf :
**/
public:
+ void* operator new(size_t size)
+ {
+ return ll_aligned_malloc_16(size);
+ }
+
+ void operator delete(void* ptr)
+ {
+ ll_aligned_free_16(ptr);
+ }
+
LLVOAvatarSelf(const LLUUID &id, const LLPCode pcode, LLViewerRegion *regionp);
virtual ~LLVOAvatarSelf();
virtual void markDead();
@@ -75,7 +85,7 @@ protected:
//--------------------------------------------------------------------
public:
/*virtual*/ void updateRegion(LLViewerRegion *regionp);
- /*virtual*/ BOOL idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time);
+ /*virtual*/ void idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time);
//--------------------------------------------------------------------
// LLCharacter interface and related
diff --git a/indra/newview/llvograss.cpp b/indra/newview/llvograss.cpp
index 8a79d564d3..566c33c0af 100644
--- a/indra/newview/llvograss.cpp
+++ b/indra/newview/llvograss.cpp
@@ -34,6 +34,7 @@
#include "llagentcamera.h"
#include "llnotificationsutil.h"
#include "lldrawable.h"
+#include "lldrawpoolalpha.h"
#include "llface.h"
#include "llsky.h"
#include "llsurface.h"
@@ -276,17 +277,17 @@ BOOL LLVOGrass::isActive() const
return TRUE;
}
-BOOL LLVOGrass::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time)
+void LLVOGrass::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time)
{
if (mDead || !(gPipeline.hasRenderType(LLPipeline::RENDER_TYPE_GRASS)))
{
- return TRUE;
+ return;
}
if (!mDrawable)
{
// So drones work.
- return TRUE;
+ return;
}
if(LLVOTree::isTreeRenderingStopped()) //stop rendering grass
@@ -296,14 +297,14 @@ BOOL LLVOGrass::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time)
mNumBlades = 0 ;
gPipeline.markRebuild(mDrawable, LLDrawable::REBUILD_ALL, TRUE);
}
- return TRUE ;
+ return;
}
else if(!mNumBlades)//restart grass rendering
{
mNumBlades = GRASS_MAX_BLADES ;
gPipeline.markRebuild(mDrawable, LLDrawable::REBUILD_ALL, TRUE);
- return TRUE ;
+ return;
}
if (mPatch && (mLastPatchUpdateTime != mPatch->getLastUpdateTime()))
@@ -311,7 +312,7 @@ BOOL LLVOGrass::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time)
gPipeline.markRebuild(mDrawable, LLDrawable::REBUILD_VOLUME, TRUE);
}
- return TRUE;
+ return;
}
@@ -380,8 +381,10 @@ BOOL LLVOGrass::updateLOD()
{
mNumBlades <<= 1;
}
-
- face->setSize(mNumBlades*8, mNumBlades*12);
+ if (face)
+ {
+ face->setSize(mNumBlades*8, mNumBlades*12);
+ }
gPipeline.markRebuild(mDrawable, LLDrawable::REBUILD_ALL, TRUE);
}
else if (num_blades <= (mNumBlades >> 1))
@@ -391,7 +394,10 @@ BOOL LLVOGrass::updateLOD()
mNumBlades >>=1;
}
- face->setSize(mNumBlades*8, mNumBlades*12);
+ if (face)
+ {
+ face->setSize(mNumBlades*8, mNumBlades*12);
+ }
gPipeline.markRebuild(mDrawable, LLDrawable::REBUILD_ALL, TRUE);
return TRUE;
}
@@ -449,14 +455,16 @@ void LLVOGrass::plantBlades()
}
LLFace *face = mDrawable->getFace(0);
+ if (face)
+ {
+ face->setTexture(getTEImage(0));
+ face->setState(LLFace::GLOBAL);
+ face->setSize(mNumBlades * 8, mNumBlades * 12);
+ face->setVertexBuffer(NULL);
+ face->setTEOffset(0);
+ face->mCenterLocal = mPosition + mRegionp->getOriginAgent();
+ }
- face->setTexture(getTEImage(0));
- face->setState(LLFace::GLOBAL);
- face->setSize(mNumBlades * 8, mNumBlades * 12);
- face->setVertexBuffer(NULL);
- face->setTEOffset(0);
- face->mCenterLocal = mPosition + mRegionp->getOriginAgent();
-
mDepth = (face->mCenterLocal - LLViewerCamera::getInstance()->getOrigin())*LLViewerCamera::getInstance()->getAtAxis();
mDrawable->setPosition(face->mCenterLocal);
mDrawable->movePartition();
@@ -486,6 +494,8 @@ void LLVOGrass::getGeometry(S32 idx,
LLColor4U color(255,255,255,255);
LLFace *face = mDrawable->getFace(idx);
+ if (!face)
+ return;
F32 width = sSpeciesTable[mSpecies]->mBladeSizeX;
F32 height = sSpeciesTable[mSpecies]->mBladeSizeY;
@@ -594,6 +604,7 @@ U32 LLVOGrass::getPartitionType() const
}
LLGrassPartition::LLGrassPartition()
+: LLSpatialPartition(LLDrawPoolAlpha::VERTEX_DATA_MASK | LLVertexBuffer::MAP_TEXTURE_INDEX, TRUE, GL_STREAM_DRAW_ARB)
{
mDrawableType = LLPipeline::RENDER_TYPE_GRASS;
mPartitionType = LLViewerRegion::PARTITION_GRASS;
@@ -604,6 +615,143 @@ LLGrassPartition::LLGrassPartition()
mBufferUsage = GL_DYNAMIC_DRAW_ARB;
}
+void LLGrassPartition::addGeometryCount(LLSpatialGroup* group, U32& vertex_count, U32& index_count)
+{
+ group->mBufferUsage = mBufferUsage;
+
+ mFaceList.clear();
+
+ LLViewerCamera* camera = LLViewerCamera::getInstance();
+ for (LLSpatialGroup::element_iter i = group->getDataBegin(); i != group->getDataEnd(); ++i)
+ {
+ LLDrawable* drawablep = *i;
+
+ if (drawablep->isDead())
+ {
+ continue;
+ }
+
+ LLAlphaObject* obj = (LLAlphaObject*) drawablep->getVObj().get();
+ obj->mDepth = 0.f;
+
+ if (drawablep->isAnimating())
+ {
+ group->mBufferUsage = GL_STREAM_DRAW_ARB;
+ }
+
+ U32 count = 0;
+ for (S32 j = 0; j < drawablep->getNumFaces(); ++j)
+ {
+ drawablep->updateFaceSize(j);
+
+ LLFace* facep = drawablep->getFace(j);
+ if ( !facep || !facep->hasGeometry())
+ {
+ continue;
+ }
+
+ if ((facep->getGeomCount() + vertex_count) <= 65536)
+ {
+ count++;
+ facep->mDistance = (facep->mCenterLocal - camera->getOrigin()) * camera->getAtAxis();
+ obj->mDepth += facep->mDistance;
+
+ mFaceList.push_back(facep);
+ vertex_count += facep->getGeomCount();
+ index_count += facep->getIndicesCount();
+ llassert(facep->getIndicesCount() < 65536);
+ }
+ else
+ {
+ facep->clearVertexBuffer();
+ }
+ }
+
+ obj->mDepth /= count;
+ }
+}
+
+static LLFastTimer::DeclareTimer FTM_REBUILD_GRASS_VB("Grass VB");
+
+void LLGrassPartition::getGeometry(LLSpatialGroup* group)
+{
+ LLMemType mt(LLMemType::MTYPE_SPACE_PARTITION);
+ LLFastTimer ftm(FTM_REBUILD_GRASS_VB);
+
+ std::sort(mFaceList.begin(), mFaceList.end(), LLFace::CompareDistanceGreater());
+
+ U32 index_count = 0;
+ U32 vertex_count = 0;
+
+ group->clearDrawMap();
+
+ LLVertexBuffer* buffer = group->mVertexBuffer;
+
+ LLStrider<U16> indicesp;
+ LLStrider<LLVector4a> verticesp;
+ LLStrider<LLVector3> normalsp;
+ LLStrider<LLVector2> texcoordsp;
+ LLStrider<LLColor4U> colorsp;
+
+ buffer->getVertexStrider(verticesp);
+ buffer->getNormalStrider(normalsp);
+ buffer->getColorStrider(colorsp);
+ buffer->getTexCoord0Strider(texcoordsp);
+ buffer->getIndexStrider(indicesp);
+
+ LLSpatialGroup::drawmap_elem_t& draw_vec = group->mDrawMap[mRenderPass];
+
+ for (std::vector<LLFace*>::iterator i = mFaceList.begin(); i != mFaceList.end(); ++i)
+ {
+ LLFace* facep = *i;
+ LLAlphaObject* object = (LLAlphaObject*) facep->getViewerObject();
+ facep->setGeomIndex(vertex_count);
+ facep->setIndicesIndex(index_count);
+ facep->setVertexBuffer(buffer);
+ facep->setPoolType(LLDrawPool::POOL_ALPHA);
+ object->getGeometry(facep->getTEOffset(), verticesp, normalsp, texcoordsp, colorsp, indicesp);
+
+ vertex_count += facep->getGeomCount();
+ index_count += facep->getIndicesCount();
+
+ S32 idx = draw_vec.size()-1;
+
+ BOOL fullbright = facep->isState(LLFace::FULLBRIGHT);
+ F32 vsize = facep->getVirtualSize();
+
+ if (idx >= 0 && draw_vec[idx]->mEnd == facep->getGeomIndex()-1 &&
+ draw_vec[idx]->mTexture == facep->getTexture() &&
+ (U16) (draw_vec[idx]->mEnd - draw_vec[idx]->mStart + facep->getGeomCount()) <= (U32) gGLManager.mGLMaxVertexRange &&
+ //draw_vec[idx]->mCount + facep->getIndicesCount() <= (U32) gGLManager.mGLMaxIndexRange &&
+ draw_vec[idx]->mEnd - draw_vec[idx]->mStart + facep->getGeomCount() < 4096 &&
+ draw_vec[idx]->mFullbright == fullbright)
+ {
+ draw_vec[idx]->mCount += facep->getIndicesCount();
+ draw_vec[idx]->mEnd += facep->getGeomCount();
+ draw_vec[idx]->mVSize = llmax(draw_vec[idx]->mVSize, vsize);
+ }
+ else
+ {
+ U32 start = facep->getGeomIndex();
+ U32 end = start + facep->getGeomCount()-1;
+ U32 offset = facep->getIndicesStart();
+ U32 count = facep->getIndicesCount();
+ LLDrawInfo* info = new LLDrawInfo(start,end,count,offset,facep->getTexture(),
+ //facep->getTexture(),
+ buffer, fullbright);
+ info->mExtents[0] = group->mObjectExtents[0];
+ info->mExtents[1] = group->mObjectExtents[1];
+ info->mVSize = vsize;
+ draw_vec.push_back(info);
+ //for alpha sorting
+ facep->setDrawInfo(info);
+ }
+ }
+
+ buffer->flush();
+ mFaceList.clear();
+}
+
// virtual
void LLVOGrass::updateDrawable(BOOL force_damped)
{
diff --git a/indra/newview/llvograss.h b/indra/newview/llvograss.h
index 00a59facf7..b9835b8802 100644
--- a/indra/newview/llvograss.h
+++ b/indra/newview/llvograss.h
@@ -73,7 +73,7 @@ public:
void plantBlades();
/*virtual*/ BOOL isActive() const; // Whether this object needs to do an idleUpdate.
- BOOL idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time);
+ /*virtual*/ void idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time);
/*virtual*/ BOOL lineSegmentIntersect(const LLVector3& start, const LLVector3& end,
S32 face = -1, // which face to check, -1 = ALL_SIDES
diff --git a/indra/newview/llvoground.cpp b/indra/newview/llvoground.cpp
index 0060f81ab5..97b7418b40 100644
--- a/indra/newview/llvoground.cpp
+++ b/indra/newview/llvoground.cpp
@@ -49,18 +49,8 @@ LLVOGround::~LLVOGround()
{
}
-BOOL LLVOGround::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time)
+void LLVOGround::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time)
{
- if (mDead || !(gPipeline.hasRenderType(LLPipeline::RENDER_TYPE_GROUND)))
- {
- return TRUE;
- }
-
- /*if (mDrawable)
- {
- gPipeline.markRebuild(mDrawable, LLDrawable::REBUILD_VOLUME, TRUE);
- }*/
- return TRUE;
}
@@ -82,6 +72,7 @@ LLDrawable *LLVOGround::createDrawable(LLPipeline *pipeline)
return mDrawable;
}
+// TO DO - this always returns TRUE,
BOOL LLVOGround::updateGeometry(LLDrawable *drawable)
{
LLStrider<LLVector3> verticesp;
@@ -96,6 +87,8 @@ BOOL LLVOGround::updateGeometry(LLDrawable *drawable)
if (drawable->getNumFaces() < 1)
drawable->addFace(poolp, NULL);
face = drawable->getFace(0);
+ if (!face)
+ return TRUE;
if (!face->getVertexBuffer())
{
diff --git a/indra/newview/llvoground.h b/indra/newview/llvoground.h
index 73b097327e..290579b4da 100644
--- a/indra/newview/llvoground.h
+++ b/indra/newview/llvoground.h
@@ -41,7 +41,7 @@ protected:
public:
LLVOGround(const LLUUID &id, const LLPCode pcode, LLViewerRegion *regionp);
- /*virtual*/ BOOL idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time);
+ /*virtual*/ void idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time);
// Graphical stuff for objects - maybe broken out into render class
// later?
diff --git a/indra/newview/llvopartgroup.cpp b/indra/newview/llvopartgroup.cpp
index 5c10a80b07..e4f9915e93 100644
--- a/indra/newview/llvopartgroup.cpp
+++ b/indra/newview/llvopartgroup.cpp
@@ -48,6 +48,120 @@ const F32 MAX_PART_LIFETIME = 120.f;
extern U64 gFrameTime;
+LLPointer<LLVertexBuffer> LLVOPartGroup::sVB = NULL;
+S32 LLVOPartGroup::sVBSlotFree[];
+S32* LLVOPartGroup::sVBSlotCursor = NULL;
+
+void LLVOPartGroup::initClass()
+{
+ for (S32 i = 0; i < LL_MAX_PARTICLE_COUNT; ++i)
+ {
+ sVBSlotFree[i] = i;
+ }
+
+ sVBSlotCursor = sVBSlotFree;
+}
+
+//static
+void LLVOPartGroup::restoreGL()
+{
+ sVB = new LLVertexBuffer(VERTEX_DATA_MASK, GL_STREAM_DRAW_ARB);
+ U32 count = LL_MAX_PARTICLE_COUNT;
+ sVB->allocateBuffer(count*4, count*6, true);
+
+ //indices and texcoords are always the same, set once
+ LLStrider<U16> indicesp;
+
+ LLStrider<LLVector4a> verticesp;
+
+ sVB->getIndexStrider(indicesp);
+ sVB->getVertexStrider(verticesp);
+
+ LLVector4a v;
+ v.set(0,0,0,0);
+
+
+ U16 vert_offset = 0;
+
+ for (U32 i = 0; i < LL_MAX_PARTICLE_COUNT; i++)
+ {
+ *indicesp++ = vert_offset + 0;
+ *indicesp++ = vert_offset + 1;
+ *indicesp++ = vert_offset + 2;
+
+ *indicesp++ = vert_offset + 1;
+ *indicesp++ = vert_offset + 3;
+ *indicesp++ = vert_offset + 2;
+
+ *verticesp++ = v;
+
+ vert_offset += 4;
+ }
+
+ LLStrider<LLVector2> texcoordsp;
+ sVB->getTexCoord0Strider(texcoordsp);
+
+ for (U32 i = 0; i < LL_MAX_PARTICLE_COUNT; i++)
+ {
+ *texcoordsp++ = LLVector2(0.f, 1.f);
+ *texcoordsp++ = LLVector2(0.f, 0.f);
+ *texcoordsp++ = LLVector2(1.f, 1.f);
+ *texcoordsp++ = LLVector2(1.f, 0.f);
+ }
+
+ sVB->flush();
+
+}
+
+//static
+void LLVOPartGroup::destroyGL()
+{
+ sVB = NULL;
+}
+
+//static
+S32 LLVOPartGroup::findAvailableVBSlot()
+{
+ if (sVBSlotCursor >= sVBSlotFree+LL_MAX_PARTICLE_COUNT)
+ { //no more available slots
+ return -1;
+ }
+
+ S32 ret = *sVBSlotCursor;
+ sVBSlotCursor++;
+
+ return ret;
+}
+
+bool ll_is_part_idx_allocated(S32 idx, S32* start, S32* end)
+{
+ while (start < end)
+ {
+ if (*start == idx)
+ { //not allocated (in free list)
+ return false;
+ }
+ ++start;
+ }
+
+ //allocated (not in free list)
+ return true;
+}
+
+//static
+void LLVOPartGroup::freeVBSlot(S32 idx)
+{
+ llassert(idx < LL_MAX_PARTICLE_COUNT && idx >= 0);
+ llassert(sVBSlotCursor > sVBSlotFree);
+ llassert(ll_is_part_idx_allocated(idx, sVBSlotCursor, sVBSlotFree+LL_MAX_PARTICLE_COUNT));
+
+ if (sVBSlotCursor > sVBSlotFree)
+ {
+ sVBSlotCursor--;
+ *sVBSlotCursor = idx;
+ }
+}
+
LLVOPartGroup::LLVOPartGroup(const LLUUID &id, const LLPCode pcode, LLViewerRegion *regionp)
: LLAlphaObject(id, pcode, regionp),
mViewerPartGroupp(NULL)
@@ -62,7 +176,6 @@ LLVOPartGroup::~LLVOPartGroup()
{
}
-
BOOL LLVOPartGroup::isActive() const
{
return FALSE;
@@ -83,9 +196,8 @@ void LLVOPartGroup::updateSpatialExtents(LLVector4a& newMin, LLVector4a& newMax)
mDrawable->setPositionGroup(pos);
}
-BOOL LLVOPartGroup::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time)
+void LLVOPartGroup::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time)
{
- return TRUE;
}
void LLVOPartGroup::setPixelAreaAndAngle(LLAgent &agent)
@@ -287,9 +399,6 @@ void LLVOPartGroup::getGeometry(S32 idx,
const LLViewerPart &part = *((LLViewerPart*) (mViewerPartGroupp->mParticles[idx]));
- U32 vert_offset = mDrawable->getFace(idx)->getGeomIndex();
-
-
LLVector4a part_pos_agent;
part_pos_agent.load3(part.mPosAgent.mV);
LLVector4a camera_agent;
@@ -361,33 +470,18 @@ void LLVOPartGroup::getGeometry(S32 idx,
verticesp->setAdd(ppamu, right);
(*verticesp++).getF32ptr()[3] = 0.f;
- //*verticesp++ = part_pos_agent + up - right;
- //*verticesp++ = part_pos_agent - up - right;
- //*verticesp++ = part_pos_agent + up + right;
- //*verticesp++ = part_pos_agent - up + right;
-
*colorsp++ = part.mColor;
*colorsp++ = part.mColor;
*colorsp++ = part.mColor;
*colorsp++ = part.mColor;
- *texcoordsp++ = LLVector2(0.f, 1.f);
- *texcoordsp++ = LLVector2(0.f, 0.f);
- *texcoordsp++ = LLVector2(1.f, 1.f);
- *texcoordsp++ = LLVector2(1.f, 0.f);
-
- *normalsp++ = normal;
- *normalsp++ = normal;
- *normalsp++ = normal;
- *normalsp++ = normal;
-
- *indicesp++ = vert_offset + 0;
- *indicesp++ = vert_offset + 1;
- *indicesp++ = vert_offset + 2;
-
- *indicesp++ = vert_offset + 1;
- *indicesp++ = vert_offset + 3;
- *indicesp++ = vert_offset + 2;
+ if (!(part.mFlags & LLPartData::LL_PART_EMISSIVE_MASK))
+ { //not fullbright, needs normal
+ *normalsp++ = normal;
+ *normalsp++ = normal;
+ *normalsp++ = normal;
+ *normalsp++ = normal;
+ }
}
U32 LLVOPartGroup::getPartitionType() const
@@ -412,6 +506,49 @@ LLHUDParticlePartition::LLHUDParticlePartition() :
mPartitionType = LLViewerRegion::PARTITION_HUD_PARTICLE;
}
+static LLFastTimer::DeclareTimer FTM_REBUILD_PARTICLE_VBO("Particle VBO");
+
+void LLParticlePartition::rebuildGeom(LLSpatialGroup* group)
+{
+ if (group->isDead() || !group->isState(LLSpatialGroup::GEOM_DIRTY))
+ {
+ return;
+ }
+
+ if (group->changeLOD())
+ {
+ group->mLastUpdateDistance = group->mDistance;
+ group->mLastUpdateViewAngle = group->mViewAngle;
+ }
+
+ LLFastTimer ftm(FTM_REBUILD_PARTICLE_VBO);
+
+ group->clearDrawMap();
+
+ //get geometry count
+ U32 index_count = 0;
+ U32 vertex_count = 0;
+
+ addGeometryCount(group, vertex_count, index_count);
+
+
+ if (vertex_count > 0 && index_count > 0)
+ {
+ group->mBuilt = 1.f;
+ //use one vertex buffer for all groups
+ group->mVertexBuffer = LLVOPartGroup::sVB;
+ getGeometry(group);
+ }
+ else
+ {
+ group->mVertexBuffer = NULL;
+ group->mBufferMap.clear();
+ }
+
+ group->mLastUpdateTime = gFrameTimeSeconds;
+ group->clearState(LLSpatialGroup::GEOM_DIRTY);
+}
+
void LLParticlePartition::addGeometryCount(LLSpatialGroup* group, U32& vertex_count, U32& index_count)
{
group->mBufferUsage = mBufferUsage;
@@ -419,7 +556,7 @@ void LLParticlePartition::addGeometryCount(LLSpatialGroup* group, U32& vertex_co
mFaceList.clear();
LLViewerCamera* camera = LLViewerCamera::getInstance();
- for (LLSpatialGroup::element_iter i = group->getData().begin(); i != group->getData().end(); ++i)
+ for (LLSpatialGroup::element_iter i = group->getDataBegin(); i != group->getDataEnd(); ++i)
{
LLDrawable* drawablep = *i;
@@ -431,11 +568,6 @@ void LLParticlePartition::addGeometryCount(LLSpatialGroup* group, U32& vertex_co
LLAlphaObject* obj = (LLAlphaObject*) drawablep->getVObj().get();
obj->mDepth = 0.f;
- if (drawablep->isAnimating())
- {
- group->mBufferUsage = GL_STREAM_DRAW_ARB;
- }
-
U32 count = 0;
for (S32 j = 0; j < drawablep->getNumFaces(); ++j)
{
@@ -447,13 +579,14 @@ void LLParticlePartition::addGeometryCount(LLSpatialGroup* group, U32& vertex_co
continue;
}
+ vertex_count += facep->getGeomCount();
+ index_count += facep->getIndicesCount();
+
count++;
facep->mDistance = (facep->mCenterLocal - camera->getOrigin()) * camera->getAtAxis();
obj->mDepth += facep->mDistance;
mFaceList.push_back(facep);
- vertex_count += facep->getGeomCount();
- index_count += facep->getIndicesCount();
llassert(facep->getIndicesCount() < 65536);
}
@@ -461,15 +594,13 @@ void LLParticlePartition::addGeometryCount(LLSpatialGroup* group, U32& vertex_co
}
}
-static LLFastTimer::DeclareTimer FTM_REBUILD_GRASS_VB("Grass VB");
-static LLFastTimer::DeclareTimer FTM_REBUILD_PARTICLE_VB("Particle VB");
+
+static LLFastTimer::DeclareTimer FTM_REBUILD_PARTICLE_GEOM("Particle Geom");
void LLParticlePartition::getGeometry(LLSpatialGroup* group)
{
LLMemType mt(LLMemType::MTYPE_SPACE_PARTITION);
- LLFastTimer ftm(mDrawableType == LLPipeline::RENDER_TYPE_GRASS ?
- FTM_REBUILD_GRASS_VB :
- FTM_REBUILD_PARTICLE_VB);
+ LLFastTimer ftm(FTM_REBUILD_PARTICLE_GEOM);
std::sort(mFaceList.begin(), mFaceList.end(), LLFace::CompareDistanceGreater());
@@ -489,21 +620,45 @@ void LLParticlePartition::getGeometry(LLSpatialGroup* group)
buffer->getVertexStrider(verticesp);
buffer->getNormalStrider(normalsp);
buffer->getColorStrider(colorsp);
- buffer->getTexCoord0Strider(texcoordsp);
- buffer->getIndexStrider(indicesp);
-
+
LLSpatialGroup::drawmap_elem_t& draw_vec = group->mDrawMap[mRenderPass];
for (std::vector<LLFace*>::iterator i = mFaceList.begin(); i != mFaceList.end(); ++i)
{
LLFace* facep = *i;
LLAlphaObject* object = (LLAlphaObject*) facep->getViewerObject();
- facep->setGeomIndex(vertex_count);
- facep->setIndicesIndex(index_count);
- facep->setVertexBuffer(buffer);
- facep->setPoolType(LLDrawPool::POOL_ALPHA);
- object->getGeometry(facep->getTEOffset(), verticesp, normalsp, texcoordsp, colorsp, indicesp);
+
+ if (!facep->isState(LLFace::PARTICLE))
+ { //set the indices of this face
+ S32 idx = LLVOPartGroup::findAvailableVBSlot();
+ if (idx >= 0)
+ {
+ facep->setGeomIndex(idx*4);
+ facep->setIndicesIndex(idx*6);
+ facep->setVertexBuffer(LLVOPartGroup::sVB);
+ facep->setPoolType(LLDrawPool::POOL_ALPHA);
+ facep->setState(LLFace::PARTICLE);
+ }
+ else
+ {
+ continue; //out of space in particle buffer
+ }
+ }
+
+ S32 geom_idx = (S32) facep->getGeomIndex();
+
+ LLStrider<U16> cur_idx = indicesp + facep->getIndicesStart();
+ LLStrider<LLVector4a> cur_vert = verticesp + geom_idx;
+ LLStrider<LLVector3> cur_norm = normalsp + geom_idx;
+ LLStrider<LLVector2> cur_tc = texcoordsp + geom_idx;
+ LLStrider<LLColor4U> cur_col = colorsp + geom_idx;
+
+ object->getGeometry(facep->getTEOffset(), cur_vert, cur_norm, cur_tc, cur_col, cur_idx);
+ llassert(facep->getGeomCount() == 4);
+ llassert(facep->getIndicesCount() == 6);
+
+
vertex_count += facep->getGeomCount();
index_count += facep->getIndicesCount();
@@ -512,18 +667,31 @@ void LLParticlePartition::getGeometry(LLSpatialGroup* group)
BOOL fullbright = facep->isState(LLFace::FULLBRIGHT);
F32 vsize = facep->getVirtualSize();
- if (idx >= 0 && draw_vec[idx]->mEnd == facep->getGeomIndex()-1 &&
+ bool batched = false;
+
+ if (idx >= 0 &&
draw_vec[idx]->mTexture == facep->getTexture() &&
- (U16) (draw_vec[idx]->mEnd - draw_vec[idx]->mStart + facep->getGeomCount()) <= (U32) gGLManager.mGLMaxVertexRange &&
- //draw_vec[idx]->mCount + facep->getIndicesCount() <= (U32) gGLManager.mGLMaxIndexRange &&
- draw_vec[idx]->mEnd - draw_vec[idx]->mStart + facep->getGeomCount() < 4096 &&
draw_vec[idx]->mFullbright == fullbright)
{
- draw_vec[idx]->mCount += facep->getIndicesCount();
- draw_vec[idx]->mEnd += facep->getGeomCount();
- draw_vec[idx]->mVSize = llmax(draw_vec[idx]->mVSize, vsize);
+ if (draw_vec[idx]->mEnd == facep->getGeomIndex()-1)
+ {
+ batched = true;
+ draw_vec[idx]->mCount += facep->getIndicesCount();
+ draw_vec[idx]->mEnd += facep->getGeomCount();
+ draw_vec[idx]->mVSize = llmax(draw_vec[idx]->mVSize, vsize);
+ }
+ else if (draw_vec[idx]->mStart == facep->getGeomIndex()+facep->getGeomCount()+1)
+ {
+ batched = true;
+ draw_vec[idx]->mCount += facep->getIndicesCount();
+ draw_vec[idx]->mStart -= facep->getGeomCount();
+ draw_vec[idx]->mOffset = facep->getIndicesStart();
+ draw_vec[idx]->mVSize = llmax(draw_vec[idx]->mVSize, vsize);
+ }
}
- else
+
+
+ if (!batched)
{
U32 start = facep->getGeomIndex();
U32 end = start + facep->getGeomCount()-1;
@@ -541,7 +709,6 @@ void LLParticlePartition::getGeometry(LLSpatialGroup* group)
}
}
- buffer->flush();
mFaceList.clear();
}
diff --git a/indra/newview/llvopartgroup.h b/indra/newview/llvopartgroup.h
index e58fed86d9..42c1252d01 100644
--- a/indra/newview/llvopartgroup.h
+++ b/indra/newview/llvopartgroup.h
@@ -31,24 +31,39 @@
#include "v3math.h"
#include "v3color.h"
#include "llframetimer.h"
+#include "llviewerpartsim.h"
+#include "llvertexbuffer.h"
class LLViewerPartGroup;
class LLVOPartGroup : public LLAlphaObject
{
public:
+
+ //vertex buffer for holding all particles
+ static LLPointer<LLVertexBuffer> sVB;
+ static S32 sVBSlotFree[LL_MAX_PARTICLE_COUNT];
+ static S32* sVBSlotCursor;
+
+ static void initClass();
+ static void restoreGL();
+ static void destroyGL();
+ static S32 findAvailableVBSlot();
+ static void freeVBSlot(S32 idx);
+
enum
{
- VERTEX_DATA_MASK = (1 << LLVertexBuffer::TYPE_VERTEX) |
- (1 << LLVertexBuffer::TYPE_NORMAL) |
- (1 << LLVertexBuffer::TYPE_TEXCOORD0) |
- (1 << LLVertexBuffer::TYPE_COLOR)
+ VERTEX_DATA_MASK = LLVertexBuffer::MAP_VERTEX |
+ LLVertexBuffer::MAP_NORMAL |
+ LLVertexBuffer::MAP_TEXCOORD0 |
+ LLVertexBuffer::MAP_COLOR |
+ LLVertexBuffer::MAP_TEXTURE_INDEX
};
LLVOPartGroup(const LLUUID &id, const LLPCode pcode, LLViewerRegion *regionp);
/*virtual*/ BOOL isActive() const; // Whether this object needs to do an idleUpdate.
- BOOL idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time);
+ void idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time);
virtual F32 getBinRadius();
virtual void updateSpatialExtents(LLVector4a& newMin, LLVector4a& newMax);
diff --git a/indra/newview/llvosky.cpp b/indra/newview/llvosky.cpp
index 312034022e..31358df85f 100644
--- a/indra/newview/llvosky.cpp
+++ b/indra/newview/llvosky.cpp
@@ -1052,9 +1052,8 @@ void LLVOSky::calcAtmospherics(void)
mFadeColor.setAlpha(0);
}
-BOOL LLVOSky::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time)
+void LLVOSky::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time)
{
- return TRUE;
}
BOOL LLVOSky::updateSky()
diff --git a/indra/newview/llvosky.h b/indra/newview/llvosky.h
index 6e6898d80a..2a150eccb9 100644
--- a/indra/newview/llvosky.h
+++ b/indra/newview/llvosky.h
@@ -461,7 +461,7 @@ public:
void cleanupGL();
void restoreGL();
- /*virtual*/ BOOL idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time);
+ /*virtual*/ void idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time);
BOOL updateSky();
// Graphical stuff for objects - maybe broken out into render class
diff --git a/indra/newview/llvosurfacepatch.cpp b/indra/newview/llvosurfacepatch.cpp
index bf6158eeaf..cb905d02da 100644
--- a/indra/newview/llvosurfacepatch.cpp
+++ b/indra/newview/llvosurfacepatch.cpp
@@ -80,9 +80,9 @@ public:
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
+ { //substitute tex coord 1 for tex coord 3
glClientActiveTextureARB(GL_TEXTURE3_ARB);
- glTexCoordPointer(2,GL_FLOAT, LLVertexBuffer::sTypeSize[TYPE_TEXCOORD0], (void*)(base + mOffsets[TYPE_TEXCOORD0]));
+ glTexCoordPointer(2,GL_FLOAT, LLVertexBuffer::sTypeSize[TYPE_TEXCOORD1], (void*)(base + mOffsets[TYPE_TEXCOORD1]));
glClientActiveTextureARB(GL_TEXTURE0_ARB);
}
if (data_mask & MAP_TEXCOORD2)
@@ -296,18 +296,20 @@ void LLVOSurfacePatch::updateFaceSize(S32 idx)
}
LLFace* facep = mDrawable->getFace(idx);
-
- S32 num_vertices = 0;
- S32 num_indices = 0;
-
- if (mLastStride)
+ if (facep)
{
- getGeomSizesMain(mLastStride, num_vertices, num_indices);
- getGeomSizesNorth(mLastStride, mLastNorthStride, num_vertices, num_indices);
- getGeomSizesEast(mLastStride, mLastEastStride, num_vertices, num_indices);
- }
+ S32 num_vertices = 0;
+ S32 num_indices = 0;
+
+ if (mLastStride)
+ {
+ getGeomSizesMain(mLastStride, num_vertices, num_indices);
+ getGeomSizesNorth(mLastStride, mLastNorthStride, num_vertices, num_indices);
+ getGeomSizesEast(mLastStride, mLastEastStride, num_vertices, num_indices);
+ }
- facep->setSize(num_vertices, num_indices);
+ facep->setSize(num_vertices, num_indices);
+ }
}
BOOL LLVOSurfacePatch::updateLOD()
@@ -322,30 +324,32 @@ void LLVOSurfacePatch::getGeometry(LLStrider<LLVector3> &verticesp,
LLStrider<U16> &indicesp)
{
LLFace* facep = mDrawable->getFace(0);
+ if (facep)
+ {
+ U32 index_offset = facep->getGeomIndex();
- U32 index_offset = facep->getGeomIndex();
-
- updateMainGeometry(facep,
- verticesp,
- normalsp,
- texCoords0p,
- texCoords1p,
- indicesp,
- index_offset);
- updateNorthGeometry(facep,
- verticesp,
- normalsp,
- texCoords0p,
- texCoords1p,
- indicesp,
- index_offset);
- updateEastGeometry(facep,
+ updateMainGeometry(facep,
verticesp,
normalsp,
texCoords0p,
texCoords1p,
indicesp,
index_offset);
+ updateNorthGeometry(facep,
+ verticesp,
+ normalsp,
+ texCoords0p,
+ texCoords1p,
+ indicesp,
+ index_offset);
+ updateEastGeometry(facep,
+ verticesp,
+ normalsp,
+ texCoords0p,
+ texCoords1p,
+ indicesp,
+ index_offset);
+ }
}
void LLVOSurfacePatch::updateMainGeometry(LLFace *facep,
@@ -864,7 +868,11 @@ void LLVOSurfacePatch::dirtyGeom()
if (mDrawable)
{
gPipeline.markRebuild(mDrawable, LLDrawable::REBUILD_ALL, TRUE);
- mDrawable->getFace(0)->setVertexBuffer(NULL);
+ LLFace* facep = mDrawable->getFace(0);
+ if (facep)
+ {
+ facep->setVertexBuffer(NULL);
+ }
mDrawable->movePartition();
}
}
diff --git a/indra/newview/llvotree.cpp b/indra/newview/llvotree.cpp
index 4564207da4..6687ce432f 100644
--- a/indra/newview/llvotree.cpp
+++ b/indra/newview/llvotree.cpp
@@ -339,11 +339,11 @@ U32 LLVOTree::processUpdateMessage(LLMessageSystem *mesgsys,
return retval;
}
-BOOL LLVOTree::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time)
+void LLVOTree::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time)
{
if (mDead || !(gPipeline.hasRenderType(LLPipeline::RENDER_TYPE_TREE)))
{
- return TRUE;
+ return;
}
S32 trunk_LOD = sMAX_NUM_TREE_LOD_LEVELS ;
@@ -374,7 +374,7 @@ BOOL LLVOTree::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time)
// *TODO: I don't know what's so special about trees
// that they don't get REBUILD_POSITION automatically
// at a higher level.
- const LLVector3 &this_position = getPositionAgent();
+ const LLVector3 &this_position = getPositionRegion();
if (this_position != mLastPosition)
{
gPipeline.markRebuild(mDrawable, LLDrawable::REBUILD_POSITION);
@@ -393,8 +393,6 @@ BOOL LLVOTree::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time)
}
mTrunkLOD = trunk_LOD;
-
- return TRUE;
}
const F32 TREE_BLEND_MIN = 1.f;
@@ -490,11 +488,16 @@ BOOL LLVOTree::updateGeometry(LLDrawable *drawable)
if(mTrunkLOD >= sMAX_NUM_TREE_LOD_LEVELS) //do not display the tree.
{
mReferenceBuffer = NULL ;
- mDrawable->getFace(0)->setVertexBuffer(NULL);
+ LLFace * facep = drawable->getFace(0);
+ if (facep)
+ {
+ facep->setVertexBuffer(NULL);
+ }
return TRUE ;
}
- if (mReferenceBuffer.isNull() || !mDrawable->getFace(0)->getVertexBuffer())
+ if (mDrawable->getFace(0) &&
+ (mReferenceBuffer.isNull() || !mDrawable->getFace(0)->getVertexBuffer()))
{
const F32 SRR3 = 0.577350269f; // sqrt(1/3)
const F32 SRR2 = 0.707106781f; // sqrt(1/2)
@@ -507,6 +510,7 @@ BOOL LLVOTree::updateGeometry(LLDrawable *drawable)
S32 lod;
LLFace *face = drawable->getFace(0);
+ if (!face) return TRUE;
face->mCenterAgent = getPositionAgent();
face->mCenterLocal = face->mCenterAgent;
@@ -837,10 +841,10 @@ void LLVOTree::updateMesh()
LLMatrix4 matrix;
// Translate to tree base HACK - adjustment in Z plants tree underground
- const LLVector3 &pos_agent = getPositionAgent();
+ const LLVector3 &pos_region = getPositionRegion();
//gGL.translatef(pos_agent.mV[VX], pos_agent.mV[VY], pos_agent.mV[VZ] - 0.1f);
LLMatrix4 trans_mat;
- trans_mat.setTranslation(pos_agent.mV[VX], pos_agent.mV[VY], pos_agent.mV[VZ] - 0.1f);
+ trans_mat.setTranslation(pos_region.mV[VX], pos_region.mV[VY], pos_region.mV[VZ] - 0.1f);
trans_mat *= matrix;
// Rotate to tree position and bend for current trunk/wind
@@ -879,6 +883,7 @@ void LLVOTree::updateMesh()
calcNumVerts(vert_count, index_count, mTrunkLOD, stop_depth, mDepth, mTrunkDepth, mBranches);
LLFace* facep = mDrawable->getFace(0);
+ if (!facep) return;
LLVertexBuffer* buff = new LLVertexBuffer(LLDrawPoolTree::VERTEX_DATA_MASK, GL_STATIC_DRAW_ARB);
buff->allocateBuffer(vert_count, index_count, TRUE);
facep->setVertexBuffer(buff);
diff --git a/indra/newview/llvotree.h b/indra/newview/llvotree.h
index 0554935539..52debc85ab 100644
--- a/indra/newview/llvotree.h
+++ b/indra/newview/llvotree.h
@@ -59,7 +59,7 @@ public:
void **user_data,
U32 block_num, const EObjectUpdateType update_type,
LLDataPacker *dp);
- /*virtual*/ BOOL idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time);
+ /*virtual*/ void idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time);
// Graphical stuff for objects - maybe broken out into render class later?
/*virtual*/ void render(LLAgent &agent);
diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp
index 080d1f774a..9c36cfee59 100644
--- a/indra/newview/llvovolume.cpp
+++ b/indra/newview/llvovolume.cpp
@@ -329,7 +329,7 @@ U32 LLVOVolume::processUpdateMessage(LLMessageSystem *mesgsys,
{
if (!mTextureAnimp)
{
- mTextureAnimp = new LLViewerTextureAnim();
+ mTextureAnimp = new LLViewerTextureAnim(this);
}
else
{
@@ -431,7 +431,7 @@ U32 LLVOVolume::processUpdateMessage(LLMessageSystem *mesgsys,
{
if (!mTextureAnimp)
{
- mTextureAnimp = new LLViewerTextureAnim();
+ mTextureAnimp = new LLViewerTextureAnim(this);
}
else
{
@@ -499,191 +499,168 @@ U32 LLVOVolume::processUpdateMessage(LLMessageSystem *mesgsys,
void LLVOVolume::animateTextures()
{
- F32 off_s = 0.f, off_t = 0.f, scale_s = 1.f, scale_t = 1.f, rot = 0.f;
- S32 result = mTextureAnimp->animateTextures(off_s, off_t, scale_s, scale_t, rot);
-
- if (result)
+ if (!mDead)
{
- if (!mTexAnimMode)
- {
- mFaceMappingChanged = TRUE;
- gPipeline.markTextured(mDrawable);
- }
- mTexAnimMode = result | mTextureAnimp->mMode;
-
- S32 start=0, end=mDrawable->getNumFaces()-1;
- if (mTextureAnimp->mFace >= 0 && mTextureAnimp->mFace <= end)
- {
- start = end = mTextureAnimp->mFace;
- }
-
- for (S32 i = start; i <= end; i++)
+ F32 off_s = 0.f, off_t = 0.f, scale_s = 1.f, scale_t = 1.f, rot = 0.f;
+ S32 result = mTextureAnimp->animateTextures(off_s, off_t, scale_s, scale_t, rot);
+
+ if (result)
{
- LLFace* facep = mDrawable->getFace(i);
- if(facep->getVirtualSize() <= MIN_TEX_ANIM_SIZE && facep->mTextureMatrix) continue;
-
- const LLTextureEntry* te = facep->getTextureEntry();
-
- if (!te)
+ if (!mTexAnimMode)
{
- continue;
+ mFaceMappingChanged = TRUE;
+ gPipeline.markTextured(mDrawable);
}
-
- if (!(result & LLViewerTextureAnim::ROTATE))
+ mTexAnimMode = result | mTextureAnimp->mMode;
+
+ S32 start=0, end=mDrawable->getNumFaces()-1;
+ if (mTextureAnimp->mFace >= 0 && mTextureAnimp->mFace <= end)
{
- te->getRotation(&rot);
+ start = end = mTextureAnimp->mFace;
}
- if (!(result & LLViewerTextureAnim::TRANSLATE))
- {
- te->getOffset(&off_s,&off_t);
- }
- if (!(result & LLViewerTextureAnim::SCALE))
+
+ for (S32 i = start; i <= end; i++)
{
- te->getScale(&scale_s, &scale_t);
- }
+ LLFace* facep = mDrawable->getFace(i);
+ if (!facep) continue;
+ if(facep->getVirtualSize() <= MIN_TEX_ANIM_SIZE && facep->mTextureMatrix) continue;
- if (!facep->mTextureMatrix)
- {
- facep->mTextureMatrix = new LLMatrix4();
- }
+ const LLTextureEntry* te = facep->getTextureEntry();
+
+ if (!te)
+ {
+ continue;
+ }
+
+ if (!(result & LLViewerTextureAnim::ROTATE))
+ {
+ te->getRotation(&rot);
+ }
+ if (!(result & LLViewerTextureAnim::TRANSLATE))
+ {
+ te->getOffset(&off_s,&off_t);
+ }
+ if (!(result & LLViewerTextureAnim::SCALE))
+ {
+ te->getScale(&scale_s, &scale_t);
+ }
+
+ if (!facep->mTextureMatrix)
+ {
+ facep->mTextureMatrix = new LLMatrix4();
+ }
- LLMatrix4& tex_mat = *facep->mTextureMatrix;
- tex_mat.setIdentity();
- LLVector3 trans ;
+ LLMatrix4& tex_mat = *facep->mTextureMatrix;
+ tex_mat.setIdentity();
+ LLVector3 trans ;
- if(facep->isAtlasInUse())
- {
- //
- //if use atlas for animated texture
- //apply the following transform to the animation matrix.
- //
-
- F32 tcoord_xoffset = 0.f ;
- F32 tcoord_yoffset = 0.f ;
- F32 tcoord_xscale = 1.f ;
- F32 tcoord_yscale = 1.f ;
if(facep->isAtlasInUse())
{
- const LLVector2* tmp = facep->getTexCoordOffset() ;
- tcoord_xoffset = tmp->mV[0] ;
- tcoord_yoffset = tmp->mV[1] ;
+ //
+ //if use atlas for animated texture
+ //apply the following transform to the animation matrix.
+ //
+
+ F32 tcoord_xoffset = 0.f ;
+ F32 tcoord_yoffset = 0.f ;
+ F32 tcoord_xscale = 1.f ;
+ F32 tcoord_yscale = 1.f ;
+ if(facep->isAtlasInUse())
+ {
+ const LLVector2* tmp = facep->getTexCoordOffset() ;
+ tcoord_xoffset = tmp->mV[0] ;
+ tcoord_yoffset = tmp->mV[1] ;
- tmp = facep->getTexCoordScale() ;
- tcoord_xscale = tmp->mV[0] ;
- tcoord_yscale = tmp->mV[1] ;
- }
- trans.set(LLVector3(tcoord_xoffset + tcoord_xscale * (off_s+0.5f), tcoord_yoffset + tcoord_yscale * (off_t+0.5f), 0.f));
+ tmp = facep->getTexCoordScale() ;
+ tcoord_xscale = tmp->mV[0] ;
+ tcoord_yscale = tmp->mV[1] ;
+ }
+ trans.set(LLVector3(tcoord_xoffset + tcoord_xscale * (off_s+0.5f), tcoord_yoffset + tcoord_yscale * (off_t+0.5f), 0.f));
- tex_mat.translate(LLVector3(-(tcoord_xoffset + tcoord_xscale * 0.5f), -(tcoord_yoffset + tcoord_yscale * 0.5f), 0.f));
- }
- else //non atlas
- {
- trans.set(LLVector3(off_s+0.5f, off_t+0.5f, 0.f));
- tex_mat.translate(LLVector3(-0.5f, -0.5f, 0.f));
- }
+ tex_mat.translate(LLVector3(-(tcoord_xoffset + tcoord_xscale * 0.5f), -(tcoord_yoffset + tcoord_yscale * 0.5f), 0.f));
+ }
+ else //non atlas
+ {
+ trans.set(LLVector3(off_s+0.5f, off_t+0.5f, 0.f));
+ tex_mat.translate(LLVector3(-0.5f, -0.5f, 0.f));
+ }
- LLVector3 scale(scale_s, scale_t, 1.f);
- LLQuaternion quat;
- quat.setQuat(rot, 0, 0, -1.f);
+ LLVector3 scale(scale_s, scale_t, 1.f);
+ LLQuaternion quat;
+ quat.setQuat(rot, 0, 0, -1.f);
- tex_mat.rotate(quat);
+ tex_mat.rotate(quat);
- LLMatrix4 mat;
- mat.initAll(scale, LLQuaternion(), LLVector3());
- tex_mat *= mat;
+ LLMatrix4 mat;
+ mat.initAll(scale, LLQuaternion(), LLVector3());
+ tex_mat *= mat;
- tex_mat.translate(trans);
+ tex_mat.translate(trans);
+ }
}
- }
- else
- {
- if (mTexAnimMode && mTextureAnimp->mRate == 0)
+ else
{
- U8 start, count;
-
- if (mTextureAnimp->mFace == -1)
- {
- start = 0;
- count = getNumTEs();
- }
- else
+ if (mTexAnimMode && mTextureAnimp->mRate == 0)
{
- start = (U8) mTextureAnimp->mFace;
- count = 1;
- }
+ U8 start, count;
- for (S32 i = start; i < start + count; i++)
- {
- if (mTexAnimMode & LLViewerTextureAnim::TRANSLATE)
+ if (mTextureAnimp->mFace == -1)
{
- setTEOffset(i, mTextureAnimp->mOffS, mTextureAnimp->mOffT);
+ start = 0;
+ count = getNumTEs();
}
- if (mTexAnimMode & LLViewerTextureAnim::SCALE)
+ else
{
- setTEScale(i, mTextureAnimp->mScaleS, mTextureAnimp->mScaleT);
+ start = (U8) mTextureAnimp->mFace;
+ count = 1;
}
- if (mTexAnimMode & LLViewerTextureAnim::ROTATE)
+
+ for (S32 i = start; i < start + count; i++)
{
- setTERotation(i, mTextureAnimp->mRot);
+ if (mTexAnimMode & LLViewerTextureAnim::TRANSLATE)
+ {
+ setTEOffset(i, mTextureAnimp->mOffS, mTextureAnimp->mOffT);
+ }
+ if (mTexAnimMode & LLViewerTextureAnim::SCALE)
+ {
+ setTEScale(i, mTextureAnimp->mScaleS, mTextureAnimp->mScaleT);
+ }
+ if (mTexAnimMode & LLViewerTextureAnim::ROTATE)
+ {
+ setTERotation(i, mTextureAnimp->mRot);
+ }
}
- }
- gPipeline.markTextured(mDrawable);
- mFaceMappingChanged = TRUE;
- mTexAnimMode = 0;
+ gPipeline.markTextured(mDrawable);
+ mFaceMappingChanged = TRUE;
+ mTexAnimMode = 0;
+ }
}
}
}
-BOOL LLVOVolume::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time)
-{
- LLViewerObject::idleUpdate(agent, world, time);
-
- static LLFastTimer::DeclareTimer ftm("Volume");
- LLFastTimer t(ftm);
- if (mDead || mDrawable.isNull())
- {
- return TRUE;
- }
-
- ///////////////////////
- //
- // Do texture animation stuff
- //
-
- if (mTextureAnimp && gAnimateTextures)
- {
- animateTextures();
- }
-
- // Dispatch to implementation
- if (mVolumeImpl)
+void LLVOVolume::updateTextures()
+{
+ const F32 TEXTURE_AREA_REFRESH_TIME = 5.f; // seconds
+ if (mTextureUpdateTimer.getElapsedTimeF32() > TEXTURE_AREA_REFRESH_TIME)
{
- mVolumeImpl->doIdleUpdate(agent, world, time);
- }
+ updateTextureVirtualSize();
- const S32 MAX_ACTIVE_OBJECT_QUIET_FRAMES = 40;
+ if (mDrawable.notNull() && !isVisible() && !mDrawable->isActive())
+ { //delete vertex buffer to free up some VRAM
+ LLSpatialGroup* group = mDrawable->getSpatialGroup();
+ if (group)
+ {
+ group->destroyGL(true);
- if (mDrawable->isActive())
- {
- if (mDrawable->isRoot() &&
- mDrawable->mQuietCount++ > MAX_ACTIVE_OBJECT_QUIET_FRAMES &&
- (!mDrawable->getParent() || !mDrawable->getParent()->isActive()))
- {
- mDrawable->makeStatic();
+ //flag the group as having changed geometry so it gets a rebuild next time
+ //it becomes visible
+ group->setState(LLSpatialGroup::GEOM_DIRTY | LLSpatialGroup::MESH_DIRTY | LLSpatialGroup::NEW_DRAWINFO);
+ }
}
- }
- return TRUE;
-}
-void LLVOVolume::updateTextures()
-{
- const F32 TEXTURE_AREA_REFRESH_TIME = 5.f; // seconds
- if (mTextureUpdateTimer.getElapsedTimeF32() > TEXTURE_AREA_REFRESH_TIME)
- {
- updateTextureVirtualSize();
- }
+ }
}
BOOL LLVOVolume::isVisible() const
@@ -715,7 +692,18 @@ void LLVOVolume::updateTextureVirtualSize(bool forced)
if(!forced)
{
if(!isVisible())
- {
+ { //don't load textures for non-visible faces
+ const S32 num_faces = mDrawable->getNumFaces();
+ for (S32 i = 0; i < num_faces; i++)
+ {
+ LLFace* face = mDrawable->getFace(i);
+ if (face)
+ {
+ face->setPixelArea(0.f);
+ face->setVirtualSize(0.f);
+ }
+ }
+
return ;
}
@@ -743,6 +731,7 @@ void LLVOVolume::updateTextureVirtualSize(bool forced)
for (S32 i = 0; i < num_faces; i++)
{
LLFace* face = mDrawable->getFace(i);
+ if (!face) continue;
const LLTextureEntry *te = face->getTextureEntry();
LLViewerTexture *imagep = face->getTexture();
if (!imagep || !te ||
@@ -833,7 +822,7 @@ void LLVOVolume::updateTextureVirtualSize(bool forced)
}
}
- S32 texture_discard = mSculptTexture->getDiscardLevel(); //try to match the texture
+ S32 texture_discard = mSculptTexture->getCachedRawImageLevel(); //try to match the texture
S32 current_discard = getVolume() ? getVolume()->getSculptLevel() : -2 ;
if (texture_discard >= 0 && //texture has some data available
@@ -889,8 +878,7 @@ void LLVOVolume::updateTextureVirtualSize(bool forced)
BOOL LLVOVolume::isActive() const
{
- return !mStatic || mTextureAnimp || (mVolumeImpl && mVolumeImpl->isActive()) ||
- (mDrawable.notNull() && mDrawable->isActive());
+ return !mStatic;
}
BOOL LLVOVolume::setMaterial(const U8 material)
@@ -1062,9 +1050,33 @@ BOOL LLVOVolume::setVolume(const LLVolumeParams &params_in, const S32 detail, bo
}
}
+
+ static LLCachedControl<bool> use_transform_feedback(gSavedSettings, "RenderUseTransformFeedback");
+
+ bool cache_in_vram = use_transform_feedback && gTransformPositionProgram.mProgramObject &&
+ (!mVolumeImpl || !mVolumeImpl->isVolumeUnique());
+
+ if (cache_in_vram)
+ { //this volume might be used as source data for a transform object, put it in vram
+ LLVolume* volume = getVolume();
+ for (S32 i = 0; i < volume->getNumFaces(); ++i)
+ {
+ const LLVolumeFace& face = volume->getVolumeFace(i);
+ if (face.mVertexBuffer.notNull())
+ { //already cached
+ break;
+ }
+ volume->genBinormals(i);
+ LLFace::cacheFaceInVRAM(face);
+ }
+ }
+
+
return TRUE;
}
+
+
return FALSE;
}
@@ -1116,7 +1128,7 @@ void LLVOVolume::sculpt()
S8 sculpt_components = 0;
const U8* sculpt_data = NULL;
- S32 discard_level = mSculptTexture->getDiscardLevel() ;
+ S32 discard_level = mSculptTexture->getCachedRawImageLevel() ;
LLImageRaw* raw_image = mSculptTexture->getCachedRawImage() ;
S32 max_discard = mSculptTexture->getMaxDiscardLevel();
@@ -1246,7 +1258,8 @@ BOOL LLVOVolume::calcLOD()
llround(radius, 0.01f));
- if (gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_LOD_INFO))
+ if (gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_LOD_INFO) &&
+ mDrawable->getFace(0))
{
//setDebugText(llformat("%.2f:%.2f, %d", debug_distance, radius, cur_detail));
@@ -1325,25 +1338,23 @@ void LLVOVolume::updateFaceFlags()
for (S32 i = 0; i < getVolume()->getNumFaces(); i++)
{
LLFace *face = mDrawable->getFace(i);
- if (!face)
+ if (face)
{
- return;
- }
-
- BOOL fullbright = getTE(i)->getFullbright();
- face->clearState(LLFace::FULLBRIGHT | LLFace::HUD_RENDER | LLFace::LIGHT);
+ BOOL fullbright = getTE(i)->getFullbright();
+ face->clearState(LLFace::FULLBRIGHT | LLFace::HUD_RENDER | LLFace::LIGHT);
- if (fullbright || (mMaterial == LL_MCODE_LIGHT))
- {
- face->setState(LLFace::FULLBRIGHT);
- }
- if (mDrawable->isLight())
- {
- face->setState(LLFace::LIGHT);
- }
- if (isHUDAttachment())
- {
- face->setState(LLFace::HUD_RENDER);
+ if (fullbright || (mMaterial == LL_MCODE_LIGHT))
+ {
+ face->setState(LLFace::FULLBRIGHT);
+ }
+ if (mDrawable->isLight())
+ {
+ face->setState(LLFace::LIGHT);
+ }
+ if (isHUDAttachment())
+ {
+ face->setState(LLFace::HUD_RENDER);
+ }
}
}
}
@@ -1380,6 +1391,8 @@ void LLVOVolume::regenFaces()
for (S32 i = 0; i < mNumFaces; i++)
{
LLFace* facep = count_changed ? addFace(i) : mDrawable->getFace(i);
+ if (!facep) continue;
+
facep->setTEOffset(i);
facep->setTexture(getTEImage(i));
facep->setViewerObject(this);
@@ -1416,7 +1429,7 @@ BOOL LLVOVolume::genBBoxes(BOOL force_global)
BOOL rebuild = mDrawable->isState(LLDrawable::REBUILD_VOLUME | LLDrawable::REBUILD_POSITION | LLDrawable::REBUILD_RIGGED);
-// bool rigged = false;
+ // bool rigged = false;
LLVolume* volume = mRiggedVolume;
if (!volume)
{
@@ -1471,11 +1484,11 @@ void LLVOVolume::preRebuild()
}
}
-void LLVOVolume::updateRelativeXform()
+void LLVOVolume::updateRelativeXform(bool force_identity)
{
if (mVolumeImpl)
{
- mVolumeImpl->updateRelativeXform();
+ mVolumeImpl->updateRelativeXform(force_identity);
return;
}
@@ -1495,15 +1508,16 @@ void LLVOVolume::updateRelativeXform()
mRelativeXform.invert();
mRelativeXformInvTrans.transpose();
}
- else if (drawable->isActive())
+ else if (drawable->isActive() || force_identity)
{
// setup relative transforms
LLQuaternion delta_rot;
LLVector3 delta_pos, delta_scale;
//matrix from local space to parent relative/global space
- delta_rot = drawable->isSpatialRoot() ? LLQuaternion() : mDrawable->getRotation();
- delta_pos = drawable->isSpatialRoot() ? LLVector3(0,0,0) : mDrawable->getPosition();
+ bool use_identity = force_identity || drawable->isSpatialRoot();
+ delta_rot = use_identity ? LLQuaternion() : mDrawable->getRotation();
+ delta_pos = use_identity ? LLVector3(0,0,0) : mDrawable->getPosition();
delta_scale = mDrawable->getScale();
// Vertex transform (4x4)
@@ -1604,7 +1618,11 @@ BOOL LLVOVolume::updateGeometry(LLDrawable *drawable)
return res;
}
- dirtySpatialGroup(drawable->isState(LLDrawable::IN_REBUILD_Q1));
+ LLSpatialGroup* group = drawable->getSpatialGroup();
+ if (group)
+ {
+ group->dirtyMesh();
+ }
BOOL compiled = FALSE;
@@ -1617,6 +1635,8 @@ BOOL LLVOVolume::updateGeometry(LLDrawable *drawable)
if (mVolumeChanged || mFaceMappingChanged )
{
+ dirtySpatialGroup(drawable->isState(LLDrawable::IN_REBUILD_Q1));
+
compiled = TRUE;
if (mVolumeChanged)
@@ -1635,6 +1655,8 @@ BOOL LLVOVolume::updateGeometry(LLDrawable *drawable)
}
else if ((mLODChanged) || (mSculptChanged))
{
+ dirtySpatialGroup(drawable->isState(LLDrawable::IN_REBUILD_Q1));
+
LLVolume *old_volumep, *new_volumep;
F32 old_lod, new_lod;
S32 old_num_faces, new_num_faces ;
@@ -1716,16 +1738,19 @@ BOOL LLVOVolume::updateGeometry(LLDrawable *drawable)
void LLVOVolume::updateFaceSize(S32 idx)
{
LLFace* facep = mDrawable->getFace(idx);
- if (idx >= getVolume()->getNumVolumeFaces())
- {
- facep->setSize(0,0, true);
- }
- else
+ if (facep)
{
- const LLVolumeFace& vol_face = getVolume()->getVolumeFace(idx);
- facep->setSize(vol_face.mNumVertices, vol_face.mNumIndices,
- true); // <--- volume faces should be padded for 16-byte alignment
+ if (idx >= getVolume()->getNumVolumeFaces())
+ {
+ facep->setSize(0,0, true);
+ }
+ else
+ {
+ const LLVolumeFace& vol_face = getVolume()->getVolumeFace(idx);
+ facep->setSize(vol_face.mNumVertices, vol_face.mNumIndices,
+ true); // <--- volume faces should be padded for 16-byte alignment
+ }
}
}
@@ -1815,9 +1840,13 @@ S32 LLVOVolume::setTEColor(const U8 te, const LLColor4& color)
}
else if (color != tep->getColor())
{
- if (color.mV[3] != tep->getColor().mV[3])
+ F32 old_alpha = tep->getColor().mV[3];
+ if (color.mV[3] != old_alpha)
{
gPipeline.markTextured(mDrawable);
+ //treat this alpha change as an LoD update since render batches may need to get rebuilt
+ mLODChanged = TRUE;
+ gPipeline.markRebuild(mDrawable, LLDrawable::REBUILD_VOLUME, FALSE);
}
retval = LLPrimitive::setTEColor(te, color);
if (mDrawable.notNull() && retval)
@@ -3098,6 +3127,7 @@ U32 LLVOVolume::getRenderCost(texture_cost_t &textures) const
for (S32 i = 0; i < num_faces; ++i)
{
const LLFace* face = drawablep->getFace(i);
+ if (!face) continue;
const LLTextureEntry* te = face->getTextureEntry();
const LLViewerTexture* img = face->getTexture();
@@ -3369,6 +3399,7 @@ F32 LLVOVolume::getBinRadius()
for (S32 i = 0; i < mDrawable->getNumFaces(); i++)
{
LLFace* face = mDrawable->getFace(i);
+ if (!face) continue;
if (face->getPoolType() == LLDrawPool::POOL_ALPHA &&
!face->canRenderAsMask())
{
@@ -3450,9 +3481,12 @@ LLVector3 LLVOVolume::agentPositionToVolume(const LLVector3& pos) const
{
LLVector3 ret = pos - getRenderPosition();
ret = ret * ~getRenderRotation();
- LLVector3 objScale = isVolumeGlobal() ? LLVector3(1,1,1) : getScale();
- LLVector3 invObjScale(1.f / objScale.mV[VX], 1.f / objScale.mV[VY], 1.f / objScale.mV[VZ]);
- ret.scaleVec(invObjScale);
+ if (!isVolumeGlobal())
+ {
+ LLVector3 objScale = getScale();
+ LLVector3 invObjScale(1.f / objScale.mV[VX], 1.f / objScale.mV[VY], 1.f / objScale.mV[VZ]);
+ ret.scaleVec(invObjScale);
+ }
return ret;
}
@@ -3470,8 +3504,12 @@ LLVector3 LLVOVolume::agentDirectionToVolume(const LLVector3& dir) const
LLVector3 LLVOVolume::volumePositionToAgent(const LLVector3& dir) const
{
LLVector3 ret = dir;
- LLVector3 objScale = isVolumeGlobal() ? LLVector3(1,1,1) : getScale();
- ret.scaleVec(objScale);
+ if (!isVolumeGlobal())
+ {
+ LLVector3 objScale = getScale();
+ ret.scaleVec(objScale);
+ }
+
ret = ret * getRenderRotation();
ret += getRenderPosition();
@@ -3592,7 +3630,8 @@ BOOL LLVOVolume::lineSegmentIntersect(const LLVector3& start, const LLVector3& e
{
LLFace* face = mDrawable->getFace(face_hit);
- if (pick_transparent || !face->getTexture() || !face->getTexture()->hasGLTexture() || face->getTexture()->getMask(face->surfaceToTexture(tc, p, n)))
+ if (face &&
+ (pick_transparent || !face->getTexture() || !face->getTexture()->hasGLTexture() || face->getTexture()->getMask(face->surfaceToTexture(tc, p, n))))
{
v_end = p;
if (face_hitp != NULL)
@@ -3768,82 +3807,85 @@ void LLRiggedVolume::update(const LLMeshSkinInfo* skin, LLVOAvatar* avatar, cons
LLVector4a* weight = vol_face.mWeights;
- LLMatrix4a bind_shape_matrix;
- bind_shape_matrix.loadu(skin->mBindShapeMatrix);
-
- LLVector4a* pos = dst_face.mPositions;
-
+ if ( weight )
{
- LLFastTimer t(FTM_SKIN_RIGGED);
+ LLMatrix4a bind_shape_matrix;
+ bind_shape_matrix.loadu(skin->mBindShapeMatrix);
+
+ LLVector4a* pos = dst_face.mPositions;
- for (U32 j = 0; j < dst_face.mNumVertices; ++j)
{
- LLMatrix4a final_mat;
- final_mat.clear();
+ LLFastTimer t(FTM_SKIN_RIGGED);
- S32 idx[4];
+ for (U32 j = 0; j < dst_face.mNumVertices; ++j)
+ {
+ LLMatrix4a final_mat;
+ final_mat.clear();
- LLVector4 wght;
+ S32 idx[4];
- F32 scale = 0.f;
- for (U32 k = 0; k < 4; k++)
- {
- F32 w = weight[j][k];
+ LLVector4 wght;
- idx[k] = (S32) floorf(w);
- wght[k] = w - floorf(w);
- scale += wght[k];
- }
+ F32 scale = 0.f;
+ for (U32 k = 0; k < 4; k++)
+ {
+ F32 w = weight[j][k];
- wght *= 1.f/scale;
+ idx[k] = (S32) floorf(w);
+ wght[k] = w - floorf(w);
+ scale += wght[k];
+ }
- for (U32 k = 0; k < 4; k++)
- {
- F32 w = wght[k];
+ wght *= 1.f/scale;
- LLMatrix4a src;
- src.setMul(mp[idx[k]], w);
+ for (U32 k = 0; k < 4; k++)
+ {
+ F32 w = wght[k];
- final_mat.add(src);
- }
+ 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;
- }
+ 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];
+ //update bounding box
+ LLVector4a& min = dst_face.mExtents[0];
+ LLVector4a& max = dst_face.mExtents[1];
- min = pos[0];
- max = pos[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]);
- }
+ 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);
+ 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;
+ {
+ 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);
+ LLVector4a size;
+ size.setSub(dst_face.mExtents[1], dst_face.mExtents[0]);
+ size.splat(size.getLength3().getF32()*0.5f);
- dst_face.createOctree(1.f);
+ dst_face.createOctree(1.f);
+ }
}
}
}
@@ -3902,8 +3944,11 @@ bool can_batch_texture(LLFace* facep)
return true;
}
+static LLFastTimer::DeclareTimer FTM_REGISTER_FACE("Register Face");
+
void LLVolumeGeometryManager::registerFace(LLSpatialGroup* group, LLFace* facep, U32 type)
{
+ LLFastTimer t(FTM_REGISTER_FACE);
LLMemType mt(LLMemType::MTYPE_SPACE_PARTITION);
if (facep->getViewerObject()->isSelected() && LLSelectMgr::getInstance()->mHideSelectedObjects)
@@ -3935,9 +3980,14 @@ void LLVolumeGeometryManager::registerFace(LLSpatialGroup* group, LLFace* facep,
const LLMatrix4* model_mat = NULL;
LLDrawable* drawable = facep->getDrawable();
- if (drawable->isActive())
+
+ if (drawable->isState(LLDrawable::ANIMATED_CHILD))
{
- model_mat = &(drawable->getRenderMatrix());
+ model_mat = &drawable->getWorldMatrix();
+ }
+ else if (drawable->isActive())
+ {
+ model_mat = &drawable->getRenderMatrix();
}
else
{
@@ -3948,6 +3998,8 @@ void LLVolumeGeometryManager::registerFace(LLSpatialGroup* group, LLFace* facep,
}
}
+ //drawable->getVObj()->setDebugText(llformat("%d", drawable->isState(LLDrawable::ANIMATED_CHILD)));
+
U8 bump = (type == LLRenderPass::PASS_BUMP || type == LLRenderPass::PASS_POST_BUMP) ? facep->getTextureEntry()->getBumpmap() : 0;
LLViewerTexture* tex = facep->getTexture();
@@ -4041,8 +4093,9 @@ void LLVolumeGeometryManager::getGeometry(LLSpatialGroup* group)
}
-static LLFastTimer::DeclareTimer FTM_REBUILD_VOLUME_VB("Volume");
-static LLFastTimer::DeclareTimer FTM_REBUILD_VBO("VBO Rebuilt");
+static LLFastTimer::DeclareTimer FTM_REBUILD_VOLUME_VB("Volume VB");
+static LLFastTimer::DeclareTimer FTM_REBUILD_VOLUME_FACE_LIST("Build Face List");
+static LLFastTimer::DeclareTimer FTM_REBUILD_VOLUME_GEN_DRAW_INFO("Gen Draw Info");
static LLDrawPoolAvatar* get_avatar_drawpool(LLViewerObject* vobj)
{
@@ -4073,6 +4126,8 @@ static LLDrawPoolAvatar* get_avatar_drawpool(LLViewerObject* vobj)
void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group)
{
+
+
if (group->changeLOD())
{
group->mLastUpdateDistance = group->mDistance;
@@ -4084,19 +4139,15 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group)
{
if (group->isState(LLSpatialGroup::MESH_DIRTY) && !LLPipeline::sDelayVBUpdate)
{
- LLFastTimer ftm(FTM_REBUILD_VBO);
- LLFastTimer ftm2(FTM_REBUILD_VOLUME_VB);
-
rebuildMesh(group);
}
return;
}
- group->mBuilt = 1.f;
- LLFastTimer ftm(FTM_REBUILD_VBO);
-
- LLFastTimer ftm2(FTM_REBUILD_VOLUME_VB);
+ LLFastTimer ftm(FTM_REBUILD_VOLUME_VB);
+ group->mBuilt = 1.f;
+
LLVOAvatar* pAvatarVO = NULL;
LLSpatialBridge* bridge = group->mSpatialPartition->asBridge();
@@ -4145,359 +4196,375 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group)
bool emissive = false;
- //get all the faces into a list
- for (LLSpatialGroup::element_iter drawable_iter = group->getData().begin(); drawable_iter != group->getData().end(); ++drawable_iter)
{
- LLDrawable* drawablep = *drawable_iter;
-
- if (drawablep->isDead() || drawablep->isState(LLDrawable::FORCE_INVISIBLE) )
+ LLFastTimer t(FTM_REBUILD_VOLUME_FACE_LIST);
+
+ //get all the faces into a list
+ for (LLSpatialGroup::element_iter drawable_iter = group->getDataBegin(); drawable_iter != group->getDataEnd(); ++drawable_iter)
{
- continue;
- }
+ LLDrawable* drawablep = *drawable_iter;
+
+ if (drawablep->isDead() || drawablep->isState(LLDrawable::FORCE_INVISIBLE) )
+ {
+ continue;
+ }
- if (drawablep->isAnimating())
- { //fall back to stream draw for animating verts
- useage = GL_STREAM_DRAW_ARB;
- }
+ if (drawablep->isAnimating())
+ { //fall back to stream draw for animating verts
+ useage = GL_STREAM_DRAW_ARB;
+ }
- LLVOVolume* vobj = drawablep->getVOVolume();
+ LLVOVolume* vobj = drawablep->getVOVolume();
- if (!vobj)
- {
- continue;
- }
+ if (!vobj)
+ {
+ continue;
+ }
- if (vobj->isMesh() &&
- (vobj->getVolume() && !vobj->getVolume()->isMeshAssetLoaded() || !gMeshRepo.meshRezEnabled()))
- {
- continue;
- }
+ if (vobj->isMesh() &&
+ (vobj->getVolume() && !vobj->getVolume()->isMeshAssetLoaded() || !gMeshRepo.meshRezEnabled()))
+ {
+ continue;
+ }
- LLVolume* volume = vobj->getVolume();
- if (volume)
- {
- const LLVector3& scale = vobj->getScale();
- group->mSurfaceArea += volume->getSurfaceArea() * llmax(llmax(scale.mV[0], scale.mV[1]), scale.mV[2]);
- }
+ LLVolume* volume = vobj->getVolume();
+ if (volume)
+ {
+ const LLVector3& scale = vobj->getScale();
+ group->mSurfaceArea += volume->getSurfaceArea() * llmax(llmax(scale.mV[0], scale.mV[1]), scale.mV[2]);
+ }
- llassert_always(vobj);
- vobj->updateTextureVirtualSize(true);
- vobj->preRebuild();
+ llassert_always(vobj);
+ vobj->updateTextureVirtualSize(true);
+ vobj->preRebuild();
- drawablep->clearState(LLDrawable::HAS_ALPHA);
+ drawablep->clearState(LLDrawable::HAS_ALPHA);
- bool rigged = vobj->isAttachment() &&
- vobj->isMesh() &&
- gMeshRepo.getSkinInfo(vobj->getVolume()->getParams().getSculptID(), vobj);
+ bool rigged = vobj->isAttachment() &&
+ vobj->isMesh() &&
+ gMeshRepo.getSkinInfo(vobj->getVolume()->getParams().getSculptID(), vobj);
- bool bake_sunlight = LLPipeline::sBakeSunlight && drawablep->isStatic();
+ bool bake_sunlight = LLPipeline::sBakeSunlight && drawablep->isStatic();
- bool is_rigged = false;
+ bool is_rigged = false;
- //for each face
- for (S32 i = 0; i < drawablep->getNumFaces(); i++)
- {
- LLFace* facep = drawablep->getFace(i);
+ //for each face
+ for (S32 i = 0; i < drawablep->getNumFaces(); i++)
+ {
+ LLFace* facep = drawablep->getFace(i);
+ if (!facep)
+ {
+ continue;
+ }
- //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);
+ //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);
+ //sum up face verts and indices
+ drawablep->updateFaceSize(i);
- if (rigged)
- {
- if (!facep->isState(LLFace::RIGGED))
- { //completely reset vertex buffer
- facep->clearVertexBuffer();
- }
+ if (rigged)
+ {
+ if (!facep->isState(LLFace::RIGGED))
+ { //completely reset vertex buffer
+ facep->clearVertexBuffer();
+ }
- facep->setState(LLFace::RIGGED);
- is_rigged = true;
+ facep->setState(LLFace::RIGGED);
+ is_rigged = true;
- //get drawpool of avatar with rigged face
- LLDrawPoolAvatar* pool = get_avatar_drawpool(vobj);
+ //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.
- bool pelvisGotSet = false;
+ //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.
+ bool pelvisGotSet = false;
- if ( pAvatarVO )
- {
- LLUUID currentId = vobj->getVolume()->getParams().getSculptID();
- const LLMeshSkinInfo* pSkinData = gMeshRepo.getSkinInfo( currentId, vobj );
-
- if ( pSkinData )
+ if ( pAvatarVO )
{
- 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 )
+ LLUUID currentId = vobj->getVolume()->getParams().getSculptID();
+ const LLMeshSkinInfo* pSkinData = gMeshRepo.getSkinInfo( currentId, vobj );
+
+ 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 )
{
- 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" )
- {
+ 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 ( !pAvatarVO->hasPelvisOffset() )
- {
- pAvatarVO->setPelvisOffset( true, jointPos, pelvisZOffset );
- //Trigger to rebuild viewer AV
- pelvisGotSet = true;
+ //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)
+ //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 )
{
- ((LLDrawPoolAvatar*) old_pool)->removeRiggedFace(facep);
+ pAvatarVO->postPelvisSetRecalc();
}
- //add face to new pool
- LLViewerTexture* tex = facep->getTexture();
- U32 type = gPipeline.getPoolTypeFromTE(te, tex);
-
- if (type == LLDrawPool::POOL_ALPHA)
+ if (pool)
{
- if (te->getColor().mV[3] > 0.f)
+ 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->getColor().mV[3] > 0.f)
+ {
+ 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_ALPHA);
+ pool->addRiggedFace(facep, LLDrawPoolAvatar::RIGGED_FULLBRIGHT_SHINY);
}
else
{
- pool->addRiggedFace(facep, LLDrawPoolAvatar::RIGGED_ALPHA);
+ if (LLPipeline::sRenderDeferred)
+ {
+ pool->addRiggedFace(facep, LLDrawPoolAvatar::RIGGED_SIMPLE);
+ }
+ else
+ {
+ pool->addRiggedFace(facep, LLDrawPoolAvatar::RIGGED_SHINY);
+ }
}
}
- }
- else if (te->getShiny())
- {
- if (te->getFullbright())
- {
- pool->addRiggedFace(facep, LLDrawPoolAvatar::RIGGED_FULLBRIGHT_SHINY);
- }
else
{
- if (LLPipeline::sRenderDeferred)
+ if (te->getFullbright())
{
- pool->addRiggedFace(facep, LLDrawPoolAvatar::RIGGED_SIMPLE);
+ pool->addRiggedFace(facep, LLDrawPoolAvatar::RIGGED_FULLBRIGHT);
}
else
{
- pool->addRiggedFace(facep, LLDrawPoolAvatar::RIGGED_SHINY);
+ pool->addRiggedFace(facep, LLDrawPoolAvatar::RIGGED_SIMPLE);
}
}
- }
- else
- {
- if (te->getFullbright())
- {
- pool->addRiggedFace(facep, LLDrawPoolAvatar::RIGGED_FULLBRIGHT);
- }
- else
+
+ if (te->getGlow())
{
- pool->addRiggedFace(facep, LLDrawPoolAvatar::RIGGED_SIMPLE);
+ pool->addRiggedFace(facep, LLDrawPoolAvatar::RIGGED_GLOW);
}
- }
-
- if (te->getGlow())
- {
- pool->addRiggedFace(facep, LLDrawPoolAvatar::RIGGED_GLOW);
- }
- if (LLPipeline::sRenderDeferred)
- {
- if (type != LLDrawPool::POOL_ALPHA && !te->getFullbright())
+ if (LLPipeline::sRenderDeferred)
{
- if (te->getBumpmap())
+ if (type != LLDrawPool::POOL_ALPHA && !te->getFullbright())
{
- pool->addRiggedFace(facep, LLDrawPoolAvatar::RIGGED_DEFERRED_BUMP);
- }
- else
- {
- pool->addRiggedFace(facep, LLDrawPoolAvatar::RIGGED_DEFERRED_SIMPLE);
+ 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);
+ 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);
}
- facep->clearState(LLFace::RIGGED);
}
- }
-
-
- if (cur_total > max_total || facep->getIndicesCount() <= 0 || facep->getGeomCount() <= 0)
- {
- facep->clearVertexBuffer();
- continue;
- }
- cur_total += facep->getGeomCount();
-
- if (facep->hasGeometry() && facep->getPixelArea() > FORCE_CULL_AREA)
- {
- const LLTextureEntry* te = facep->getTextureEntry();
- LLViewerTexture* tex = facep->getTexture();
- if (te->getGlow() >= 1.f/255.f)
+ if (cur_total > max_total || facep->getIndicesCount() <= 0 || facep->getGeomCount() <= 0)
{
- emissive = true;
+ facep->clearVertexBuffer();
+ continue;
}
- if (facep->isState(LLFace::TEXTURE_ANIM))
- {
- if (!vobj->mTexAnimMode)
- {
- facep->clearState(LLFace::TEXTURE_ANIM);
- }
- }
+ cur_total += facep->getGeomCount();
- BOOL force_simple = (facep->getPixelArea() < FORCE_SIMPLE_RENDER_AREA);
- U32 type = gPipeline.getPoolTypeFromTE(te, tex);
- if (type != LLDrawPool::POOL_ALPHA && force_simple)
+ if (facep->hasGeometry() && facep->getPixelArea() > FORCE_CULL_AREA)
{
- type = LLDrawPool::POOL_SIMPLE;
- }
- facep->setPoolType(type);
+ const LLTextureEntry* te = facep->getTextureEntry();
+ LLViewerTexture* tex = facep->getTexture();
- if (vobj->isHUDAttachment())
- {
- facep->setState(LLFace::FULLBRIGHT);
- }
+ if (te->getGlow() >= 1.f/255.f)
+ {
+ emissive = true;
+ }
- if (vobj->mTextureAnimp && vobj->mTexAnimMode)
- {
- if (vobj->mTextureAnimp->mFace <= -1)
+ if (facep->isState(LLFace::TEXTURE_ANIM))
{
- S32 face;
- for (face = 0; face < vobj->getNumTEs(); face++)
+ if (!vobj->mTexAnimMode)
{
- drawablep->getFace(face)->setState(LLFace::TEXTURE_ANIM);
+ facep->clearState(LLFace::TEXTURE_ANIM);
}
}
- else if (vobj->mTextureAnimp->mFace < vobj->getNumTEs())
+
+ BOOL force_simple = (facep->getPixelArea() < FORCE_SIMPLE_RENDER_AREA);
+ U32 type = gPipeline.getPoolTypeFromTE(te, tex);
+ if (type != LLDrawPool::POOL_ALPHA && force_simple)
{
- drawablep->getFace(vobj->mTextureAnimp->mFace)->setState(LLFace::TEXTURE_ANIM);
+ type = LLDrawPool::POOL_SIMPLE;
}
- }
+ facep->setPoolType(type);
- if (type == LLDrawPool::POOL_ALPHA)
- {
- if (facep->canRenderAsMask())
- { //can be treated as alpha mask
- simple_faces.push_back(facep);
- }
- else
+ if (vobj->isHUDAttachment())
{
- if (te->getColor().mV[3] > 0.f)
- { //only treat as alpha in the pipeline if < 100% transparent
- drawablep->setState(LLDrawable::HAS_ALPHA);
- }
- alpha_faces.push_back(facep);
+ facep->setState(LLFace::FULLBRIGHT);
}
- }
- else
- {
- if (drawablep->isState(LLDrawable::REBUILD_VOLUME))
+
+ if (vobj->mTextureAnimp && vobj->mTexAnimMode)
{
- facep->mLastUpdateTime = gFrameTimeSeconds;
+ if (vobj->mTextureAnimp->mFace <= -1)
+ {
+ S32 face;
+ for (face = 0; face < vobj->getNumTEs(); face++)
+ {
+ LLFace * facep = drawablep->getFace(face);
+ if (facep)
+ {
+ facep->setState(LLFace::TEXTURE_ANIM);
+ }
+ }
+ }
+ else if (vobj->mTextureAnimp->mFace < vobj->getNumTEs())
+ {
+ LLFace * facep = drawablep->getFace(vobj->mTextureAnimp->mFace);
+ if (facep)
+ {
+ facep->setState(LLFace::TEXTURE_ANIM);
+ }
+ }
}
- if (gPipeline.canUseWindLightShadersOnObjects()
- && LLPipeline::sRenderBump)
+ if (type == LLDrawPool::POOL_ALPHA)
{
- if (te->getBumpmap())
- { //needs normal + binormal
- bump_faces.push_back(facep);
- }
- else if (te->getShiny() || !te->getFullbright())
- { //needs normal
+ if (facep->canRenderAsMask())
+ { //can be treated as alpha mask
simple_faces.push_back(facep);
}
- else
- { //doesn't need normal
- facep->setState(LLFace::FULLBRIGHT);
- fullbright_faces.push_back(facep);
+ else
+ {
+ if (te->getColor().mV[3] > 0.f)
+ { //only treat as alpha in the pipeline if < 100% transparent
+ drawablep->setState(LLDrawable::HAS_ALPHA);
+ }
+ alpha_faces.push_back(facep);
}
}
else
{
- if (te->getBumpmap() && LLPipeline::sRenderBump)
- { //needs normal + binormal
- bump_faces.push_back(facep);
+ if (drawablep->isState(LLDrawable::REBUILD_VOLUME))
+ {
+ facep->mLastUpdateTime = gFrameTimeSeconds;
}
- else if ((te->getShiny() && LLPipeline::sRenderBump) ||
- !(te->getFullbright() || bake_sunlight))
- { //needs normal
- simple_faces.push_back(facep);
+
+ if (gPipeline.canUseWindLightShadersOnObjects()
+ && LLPipeline::sRenderBump)
+ {
+ if (te->getBumpmap())
+ { //needs normal + binormal
+ bump_faces.push_back(facep);
+ }
+ else if (te->getShiny() || !te->getFullbright())
+ { //needs normal
+ simple_faces.push_back(facep);
+ }
+ else
+ { //doesn't need normal
+ facep->setState(LLFace::FULLBRIGHT);
+ fullbright_faces.push_back(facep);
+ }
}
- else
- { //doesn't need normal
- facep->setState(LLFace::FULLBRIGHT);
- fullbright_faces.push_back(facep);
+ else
+ {
+ if (te->getBumpmap() && LLPipeline::sRenderBump)
+ { //needs normal + binormal
+ bump_faces.push_back(facep);
+ }
+ else if ((te->getShiny() && LLPipeline::sRenderBump) ||
+ !(te->getFullbright() || bake_sunlight))
+ { //needs normal
+ simple_faces.push_back(facep);
+ }
+ else
+ { //doesn't need normal
+ facep->setState(LLFace::FULLBRIGHT);
+ fullbright_faces.push_back(facep);
+ }
}
}
}
+ else
+ { //face has no renderable geometry
+ facep->clearVertexBuffer();
+ }
}
- else
- { //face has no renderable geometry
- facep->clearVertexBuffer();
- }
- }
- if (is_rigged)
- {
- drawablep->setState(LLDrawable::RIGGED);
- }
- else
- {
- drawablep->clearState(LLDrawable::RIGGED);
+ if (is_rigged)
+ {
+ drawablep->setState(LLDrawable::RIGGED);
+ }
+ else
+ {
+ drawablep->clearState(LLDrawable::RIGGED);
+ }
}
}
@@ -4539,7 +4606,7 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group)
if (!LLPipeline::sDelayVBUpdate)
{
//drawables have been rebuilt, clear rebuild status
- for (LLSpatialGroup::element_iter drawable_iter = group->getData().begin(); drawable_iter != group->getData().end(); ++drawable_iter)
+ for (LLSpatialGroup::element_iter drawable_iter = group->getDataBegin(); drawable_iter != group->getDataEnd(); ++drawable_iter)
{
LLDrawable* drawablep = *drawable_iter;
drawablep->clearState(LLDrawable::REBUILD_ALL);
@@ -4564,31 +4631,35 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group)
}
}
-static LLFastTimer::DeclareTimer FTM_VOLUME_GEOM("Volume Geometry");
-static LLFastTimer::DeclareTimer FTM_VOLUME_GEOM_PARTIAL("Terse Rebuild");
void LLVolumeGeometryManager::rebuildMesh(LLSpatialGroup* group)
{
llassert(group);
if (group && group->isState(LLSpatialGroup::MESH_DIRTY) && !group->isState(LLSpatialGroup::GEOM_DIRTY))
{
- LLFastTimer tm(FTM_VOLUME_GEOM);
+ LLFastTimer ftm(FTM_REBUILD_VOLUME_VB);
+ LLFastTimer t(FTM_REBUILD_VOLUME_GEN_DRAW_INFO); //make sure getgeometryvolume shows up in the right place in timers
+
S32 num_mapped_veretx_buffer = LLVertexBuffer::sMappedCount ;
group->mBuilt = 1.f;
std::set<LLVertexBuffer*> mapped_buffers;
- for (LLSpatialGroup::element_iter drawable_iter = group->getData().begin(); drawable_iter != group->getData().end(); ++drawable_iter)
+ for (LLSpatialGroup::element_iter drawable_iter = group->getDataBegin(); drawable_iter != group->getDataEnd(); ++drawable_iter)
{
- LLFastTimer t(FTM_VOLUME_GEOM_PARTIAL);
LLDrawable* drawablep = *drawable_iter;
- if (!drawablep->isDead() && drawablep->isState(LLDrawable::REBUILD_ALL) )
+ if (!drawablep->isDead() && drawablep->isState(LLDrawable::REBUILD_ALL) && !drawablep->isState(LLDrawable::RIGGED) )
{
LLVOVolume* vobj = drawablep->getVOVolume();
vobj->preRebuild();
+ if (drawablep->isState(LLDrawable::ANIMATED_CHILD))
+ {
+ vobj->updateRelativeXform(true);
+ }
+
LLVolume* volume = vobj->getVolume();
for (S32 i = 0; i < drawablep->getNumFaces(); ++i)
{
@@ -4598,8 +4669,15 @@ void LLVolumeGeometryManager::rebuildMesh(LLSpatialGroup* group)
LLVertexBuffer* buff = face->getVertexBuffer();
if (buff)
{
- face->getGeometryVolume(*volume, face->getTEOffset(),
- vobj->getRelativeXform(), vobj->getRelativeXformInvTrans(), face->getGeomIndex());
+ llassert(!face->isState(LLFace::RIGGED));
+
+ if (!face->getGeometryVolume(*volume, face->getTEOffset(),
+ vobj->getRelativeXform(), vobj->getRelativeXformInvTrans(), face->getGeomIndex()))
+ { //something's gone wrong with the vertex buffer accounting, rebuild this group
+ group->dirtyGeom();
+ gPipeline.markRebuild(group, TRUE);
+ }
+
if (buff->isLocked())
{
@@ -4608,6 +4686,12 @@ void LLVolumeGeometryManager::rebuildMesh(LLSpatialGroup* group)
}
}
}
+
+ if (drawablep->isState(LLDrawable::ANIMATED_CHILD))
+ {
+ vobj->updateRelativeXform();
+ }
+
drawablep->clearState(LLDrawable::REBUILD_ALL);
}
@@ -4630,16 +4714,19 @@ void LLVolumeGeometryManager::rebuildMesh(LLSpatialGroup* group)
if(num_mapped_veretx_buffer != LLVertexBuffer::sMappedCount)
{
llwarns << "Not all mapped vertex buffers are unmapped!" << llendl ;
- for (LLSpatialGroup::element_iter drawable_iter = group->getData().begin(); drawable_iter != group->getData().end(); ++drawable_iter)
+ for (LLSpatialGroup::element_iter drawable_iter = group->getDataBegin(); drawable_iter != group->getDataEnd(); ++drawable_iter)
{
LLDrawable* drawablep = *drawable_iter;
for (S32 i = 0; i < drawablep->getNumFaces(); ++i)
{
LLFace* face = drawablep->getFace(i);
- LLVertexBuffer* buff = face->getVertexBuffer();
- if (face && buff && buff->isLocked())
+ if (face)
{
- buff->flush();
+ LLVertexBuffer* buff = face->getVertexBuffer();
+ if (buff && buff->isLocked())
+ {
+ buff->flush();
+ }
}
}
}
@@ -4648,7 +4735,7 @@ void LLVolumeGeometryManager::rebuildMesh(LLSpatialGroup* group)
group->clearState(LLSpatialGroup::MESH_DIRTY | LLSpatialGroup::NEW_DRAWINFO);
}
- llassert(!group || !group->isState(LLSpatialGroup::NEW_DRAWINFO));
+// llassert(!group || !group->isState(LLSpatialGroup::NEW_DRAWINFO));
}
struct CompareBatchBreakerModified
@@ -4674,8 +4761,20 @@ struct CompareBatchBreakerModified
}
};
+static LLFastTimer::DeclareTimer FTM_GEN_DRAW_INFO_SORT("Draw Info Face Sort");
+static LLFastTimer::DeclareTimer FTM_GEN_DRAW_INFO_FACE_SIZE("Face Sizing");
+static LLFastTimer::DeclareTimer FTM_GEN_DRAW_INFO_ALLOCATE("Allocate VB");
+static LLFastTimer::DeclareTimer FTM_GEN_DRAW_INFO_FIND_VB("Find VB");
+static LLFastTimer::DeclareTimer FTM_GEN_DRAW_INFO_RESIZE_VB("Resize VB");
+
+
+
+
+
void LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, std::vector<LLFace*>& faces, BOOL distance_sort, BOOL batch_textures)
{
+ LLFastTimer t(FTM_REBUILD_VOLUME_GEN_DRAW_INFO);
+
U32 buffer_usage = group->mBufferUsage;
#if LL_DARWIN
@@ -4693,15 +4792,18 @@ void LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, std::
U32 max_vertices = (gSavedSettings.getS32("RenderMaxVBOSize")*1024)/LLVertexBuffer::calcVertexSize(group->mSpatialPartition->mVertexDataMask);
max_vertices = llmin(max_vertices, (U32) 65535);
- if (!distance_sort)
- {
- //sort faces by things that break batches
- std::sort(faces.begin(), faces.end(), CompareBatchBreakerModified());
- }
- else
{
- //sort faces by distance
- std::sort(faces.begin(), faces.end(), LLFace::CompareDistanceGreater());
+ LLFastTimer t(FTM_GEN_DRAW_INFO_SORT);
+ if (!distance_sort)
+ {
+ //sort faces by things that break batches
+ std::sort(faces.begin(), faces.end(), CompareBatchBreakerModified());
+ }
+ else
+ {
+ //sort faces by distance
+ std::sort(faces.begin(), faces.end(), LLFace::CompareDistanceGreater());
+ }
}
bool hud_group = group->isHUDGroup() ;
@@ -4766,57 +4868,86 @@ void LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, std::
std::vector<LLViewerTexture*> texture_list;
- if (batch_textures)
{
- U8 cur_tex = 0;
- facep->setTextureIndex(cur_tex);
- texture_list.push_back(tex);
-
- //if (can_batch_texture(facep))
+ LLFastTimer t(FTM_GEN_DRAW_INFO_FACE_SIZE);
+ if (batch_textures)
{
- while (i != faces.end())
+ U8 cur_tex = 0;
+ facep->setTextureIndex(cur_tex);
+ texture_list.push_back(tex);
+
+ //if (can_batch_texture(facep))
{
- facep = *i;
- if (facep->getTexture() != tex)
+ while (i != faces.end())
{
- if (distance_sort)
- { //textures might be out of order, see if texture exists in current batch
- bool found = false;
- for (U32 tex_idx = 0; tex_idx < texture_list.size(); ++tex_idx)
- {
- if (facep->getTexture() == texture_list[tex_idx])
+ facep = *i;
+ if (facep->getTexture() != tex)
+ {
+ if (distance_sort)
+ { //textures might be out of order, see if texture exists in current batch
+ bool found = false;
+ for (U32 tex_idx = 0; tex_idx < texture_list.size(); ++tex_idx)
{
- cur_tex = tex_idx;
- found = true;
- break;
+ if (facep->getTexture() == texture_list[tex_idx])
+ {
+ cur_tex = tex_idx;
+ found = true;
+ break;
+ }
}
- }
- if (!found)
+ if (!found)
+ {
+ cur_tex = texture_list.size();
+ }
+ }
+ else
{
- cur_tex = texture_list.size();
+ cur_tex++;
}
- }
- else
- {
- cur_tex++;
- }
- if (!can_batch_texture(facep))
- { //face is bump mapped or has an animated texture matrix -- can't
- //batch more than 1 texture at a time
- break;
+ if (!can_batch_texture(facep))
+ { //face is bump mapped or has an animated texture matrix -- can't
+ //batch more than 1 texture at a time
+ break;
+ }
+
+ if (cur_tex >= texture_index_channels)
+ { //cut batches when index channels are depleted
+ break;
+ }
+
+ tex = facep->getTexture();
+
+ texture_list.push_back(tex);
}
- if (cur_tex >= texture_index_channels)
- { //cut batches when index channels are depleted
+ if (geom_count + facep->getGeomCount() > max_vertices)
+ { //cut batches on geom count too big
break;
}
- tex = facep->getTexture();
+ ++i;
+ index_count += facep->getIndicesCount();
+ geom_count += facep->getGeomCount();
- texture_list.push_back(tex);
+ facep->setTextureIndex(cur_tex);
}
+ }
+
+ tex = texture_list[0];
+ }
+ else
+ {
+ while (i != faces.end() &&
+ (LLPipeline::sTextureBindTest || (distance_sort || (*i)->getTexture() == tex)))
+ {
+ facep = *i;
+
+
+ //face has no texture index
+ facep->mDrawInfo = NULL;
+ facep->setTextureIndex(255);
if (geom_count + facep->getGeomCount() > max_vertices)
{ //cut batches on geom count too big
@@ -4826,69 +4957,18 @@ void LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, std::
++i;
index_count += facep->getIndicesCount();
geom_count += facep->getGeomCount();
-
- facep->setTextureIndex(cur_tex);
}
}
-
- tex = texture_list[0];
}
- else
- {
- while (i != faces.end() &&
- (LLPipeline::sTextureBindTest || (distance_sort || (*i)->getTexture() == tex)))
- {
- facep = *i;
-
-
- //face has no texture index
- facep->mDrawInfo = NULL;
- facep->setTextureIndex(255);
-
- if (geom_count + facep->getGeomCount() > max_vertices)
- { //cut batches on geom count too big
- break;
- }
- ++i;
- index_count += facep->getIndicesCount();
- geom_count += facep->getGeomCount();
- }
- }
-
- //create/delete/resize vertex buffer if needed
+ //create vertex buffer
LLVertexBuffer* buffer = NULL;
- { //try to find a buffer to reuse
- LLSpatialGroup::buffer_texture_map_t::iterator found_iter = group->mBufferMap[mask].find(*face_iter);
-
- if (found_iter != group->mBufferMap[mask].end())
- {
- if ((U32) buffer_index < found_iter->second.size())
- {
- buffer = found_iter->second[buffer_index];
- }
- }
- }
-
- if (!buffer || !buffer->isWriteable())
- { //create new buffer if needed
+ {
+ LLFastTimer t(FTM_GEN_DRAW_INFO_ALLOCATE);
buffer = createVertexBuffer(mask, buffer_usage);
buffer->allocateBuffer(geom_count, index_count, TRUE);
}
- else
- { //resize pre-existing buffer
- if (LLVertexBuffer::sEnableVBOs && buffer->getUsage() != buffer_usage ||
- buffer->getTypeMask() != mask)
- {
- buffer = createVertexBuffer(mask, buffer_usage);
- buffer->allocateBuffer(geom_count, index_count, TRUE);
- }
- else
- {
- buffer->resizeBuffer(geom_count, index_count);
- }
- }
group->mGeometryBytes += buffer->getSize() + buffer->getIndicesSize();
@@ -4922,10 +5002,25 @@ void LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, std::
LLVOVolume* vobj = drawablep->getVOVolume();
LLVolume* volume = vobj->getVolume();
+ if (drawablep->isState(LLDrawable::ANIMATED_CHILD))
+ {
+ vobj->updateRelativeXform(true);
+ }
+
U32 te_idx = facep->getTEOffset();
- facep->getGeometryVolume(*volume, te_idx,
- vobj->getRelativeXform(), vobj->getRelativeXformInvTrans(), index_offset);
+ llassert(!facep->isState(LLFace::RIGGED));
+
+ if (!facep->getGeometryVolume(*volume, te_idx,
+ vobj->getRelativeXform(), vobj->getRelativeXformInvTrans(), index_offset,true))
+ {
+ llwarns << "Failed to get geometry for face!" << llendl;
+ }
+
+ if (drawablep->isState(LLDrawable::ANIMATED_CHILD))
+ {
+ vobj->updateRelativeXform(false);
+ }
}
}
@@ -5089,7 +5184,8 @@ void LLGeometryManager::addGeometryCount(LLSpatialGroup* group, U32 &vertex_coun
mFaceList.clear();
//for each drawable
- for (LLSpatialGroup::element_iter drawable_iter = group->getData().begin(); drawable_iter != group->getData().end(); ++drawable_iter)
+
+ for (LLSpatialGroup::element_iter drawable_iter = group->getDataBegin(); drawable_iter != group->getDataEnd(); ++drawable_iter)
{
LLDrawable* drawablep = *drawable_iter;
@@ -5109,17 +5205,21 @@ 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->getPixelArea() > FORCE_CULL_AREA)
+ if (facep)
{
- vertex_count += facep->getGeomCount();
- index_count += facep->getIndicesCount();
- llassert(facep->getIndicesCount() < 65536);
- //remember face (for sorting)
- mFaceList.push_back(facep);
- }
- else
- {
- facep->clearVertexBuffer();
+ if (facep->hasGeometry() && facep->getPixelArea() > FORCE_CULL_AREA &&
+ facep->getGeomCount() + vertex_count <= 65536)
+ {
+ vertex_count += facep->getGeomCount();
+ index_count += facep->getIndicesCount();
+
+ //remember face (for sorting)
+ mFaceList.push_back(facep);
+ }
+ else
+ {
+ facep->clearVertexBuffer();
+ }
}
}
}
diff --git a/indra/newview/llvovolume.h b/indra/newview/llvovolume.h
index 3cf434dc26..0082f2e991 100644
--- a/indra/newview/llvovolume.h
+++ b/indra/newview/llvovolume.h
@@ -68,7 +68,7 @@ class LLVolumeInterface
public:
virtual ~LLVolumeInterface() { }
virtual LLVolumeInterfaceType getInterfaceType() const = 0;
- virtual BOOL doIdleUpdate(LLAgent &agent, LLWorld &world, const F64 &time) = 0;
+ virtual void doIdleUpdate() = 0;
virtual BOOL doUpdateGeometry(LLDrawable *drawable) = 0;
virtual LLVector3 getPivotPosition() const = 0;
virtual void onSetVolume(const LLVolumeParams &volume_params, const S32 detail) = 0;
@@ -79,7 +79,7 @@ public:
virtual bool isVolumeGlobal() const = 0; // Are we in global space?
virtual bool isActive() const = 0; // Is this object currently active?
virtual const LLMatrix4& getWorldMatrix(LLXformMatrix* xform) const = 0;
- virtual void updateRelativeXform() = 0;
+ virtual void updateRelativeXform(bool force_identity = false) = 0;
virtual U32 getID() const = 0;
virtual void preRebuild() = 0;
};
@@ -114,8 +114,7 @@ public:
void deleteFaces();
void animateTextures();
- /*virtual*/ BOOL idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time);
-
+
BOOL isVisible() const ;
/*virtual*/ BOOL isActive() const;
/*virtual*/ BOOL isAttachment() const;
@@ -203,7 +202,7 @@ public:
LLAssetType::EType type,
void* user_data, S32 status, LLExtStat ext_status);
- void updateRelativeXform();
+ void updateRelativeXform(bool force_identity = false);
/*virtual*/ BOOL updateGeometry(LLDrawable *drawable);
/*virtual*/ void updateFaceSize(S32 idx);
/*virtual*/ BOOL updateLOD();
@@ -340,7 +339,8 @@ public:
U8 mTexAnimMode;
private:
friend class LLDrawable;
-
+ friend class LLFace;
+
BOOL mFaceMappingChanged;
LLFrameTimer mTextureUpdateTimer;
S32 mLOD;
diff --git a/indra/newview/llvowater.cpp b/indra/newview/llvowater.cpp
index cd78157944..e8a1c3d1d6 100644
--- a/indra/newview/llvowater.cpp
+++ b/indra/newview/llvowater.cpp
@@ -100,17 +100,8 @@ void LLVOWater::updateTextures()
}
// Never gets called
-BOOL LLVOWater::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time)
+void LLVOWater::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time)
{
- /*if (mDead || !(gPipeline.hasRenderType(LLPipeline::RENDER_TYPE_WATER)))
- {
- return TRUE;
- }
- if (mDrawable)
- {
- gPipeline.markRebuild(mDrawable, LLDrawable::REBUILD_VOLUME, TRUE);
- }*/
- return TRUE;
}
LLDrawable *LLVOWater::createDrawable(LLPipeline *pipeline)
@@ -146,6 +137,10 @@ BOOL LLVOWater::updateGeometry(LLDrawable *drawable)
drawable->addFace(poolp, NULL);
}
face = drawable->getFace(0);
+ if (!face)
+ {
+ return TRUE;
+ }
// LLVector2 uvs[4];
// LLVector3 vtx[4];
diff --git a/indra/newview/llvowater.h b/indra/newview/llvowater.h
index ed709dd840..cf9323ef2e 100644
--- a/indra/newview/llvowater.h
+++ b/indra/newview/llvowater.h
@@ -58,7 +58,7 @@ public:
static void initClass();
static void cleanupClass();
- /*virtual*/ BOOL idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time);
+ /*virtual*/ void idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time);
/*virtual*/ LLDrawable* createDrawable(LLPipeline *pipeline);
/*virtual*/ BOOL updateGeometry(LLDrawable *drawable);
/*virtual*/ void updateSpatialExtents(LLVector4a& newMin, LLVector4a& newMax);
diff --git a/indra/newview/llvowlsky.cpp b/indra/newview/llvowlsky.cpp
index afd902201b..a33f42cf84 100644
--- a/indra/newview/llvowlsky.cpp
+++ b/indra/newview/llvowlsky.cpp
@@ -92,9 +92,9 @@ void LLVOWLSky::initSunDirection(LLVector3 const & sun_direction,
{
}
-BOOL LLVOWLSky::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time)
+void LLVOWLSky::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time)
{
- return TRUE;
+
}
BOOL LLVOWLSky::isActive(void) const
diff --git a/indra/newview/llvowlsky.h b/indra/newview/llvowlsky.h
index 825e13a203..729dced15e 100644
--- a/indra/newview/llvowlsky.h
+++ b/indra/newview/llvowlsky.h
@@ -53,7 +53,7 @@ public:
void initSunDirection(LLVector3 const & sun_direction,
LLVector3 const & sun_angular_velocity);
- /*virtual*/ BOOL idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time);
+ /*virtual*/ void idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time);
/*virtual*/ BOOL isActive(void) const;
/*virtual*/ LLDrawable * createDrawable(LLPipeline *pipeline);
/*virtual*/ BOOL updateGeometry(LLDrawable *drawable);
diff --git a/indra/newview/llweb.cpp b/indra/newview/llweb.cpp
index d2d48dc68f..83337b386d 100644
--- a/indra/newview/llweb.cpp
+++ b/indra/newview/llweb.cpp
@@ -185,8 +185,8 @@ std::string LLWeb::expandURLSubstitutions(const std::string &url,
substitution["VERSION_PATCH"] = LLVersionInfo::getPatch();
substitution["VERSION_BUILD"] = LLVersionInfo::getBuild();
substitution["CHANNEL"] = LLVersionInfo::getChannel();
- substitution["GRID"] = LLGridManager::getInstance()->getGridLabel();
- substitution["GRID_LOWERCASE"] = utf8str_tolower(LLGridManager::getInstance()->getGridLabel());
+ substitution["GRID"] = LLGridManager::getInstance()->getGridId();
+ substitution["GRID_LOWERCASE"] = utf8str_tolower(LLGridManager::getInstance()->getGridId());
substitution["OS"] = LLAppViewer::instance()->getOSInfo().getOSStringSimple();
substitution["SESSION_ID"] = gAgent.getSessionID();
substitution["FIRST_LOGIN"] = gAgent.isFirstLogin();
diff --git a/indra/newview/llworld.cpp b/indra/newview/llworld.cpp
index b061c90d98..78ee3e4fd9 100644
--- a/indra/newview/llworld.cpp
+++ b/indra/newview/llworld.cpp
@@ -657,7 +657,10 @@ void LLWorld::updateRegions(F32 max_update_time)
if (did_one && max_time <= 0.f)
break;
max_time = llmin(max_time, max_update_time*.1f);
- did_one |= regionp->idleUpdate(max_update_time);
+ if (regionp->idleUpdate(max_update_time))
+ {
+ did_one = TRUE;
+ }
}
}
@@ -837,6 +840,9 @@ void LLWorld::updateWaterObjects()
}
mHoleWaterObjects.clear();
+ // Use the water height of the region we're on for areas where there is no region
+ F32 water_height = gAgent.getRegion()->getWaterHeight();
+
// Now, get a list of the holes
S32 x, y;
for (x = min_x; x <= max_x; x += rwidth)
@@ -845,12 +851,12 @@ void LLWorld::updateWaterObjects()
{
U64 region_handle = to_region_handle(x, y);
if (!getRegionFromHandle(region_handle))
- {
+ { // No region at that area, so make water
LLVOWater* waterp = (LLVOWater *)gObjectList.createObjectViewer(LLViewerObject::LL_VO_WATER, gAgent.getRegion());
waterp->setUseTexture(FALSE);
waterp->setPositionGlobal(LLVector3d(x + rwidth/2,
y + rwidth/2,
- 256.f+DEFAULT_WATER_HEIGHT));
+ 256.f + water_height));
waterp->setScale(LLVector3((F32)rwidth, (F32)rwidth, 512.f));
gPipeline.createObject(waterp);
mHoleWaterObjects.push_back(waterp);
@@ -907,7 +913,7 @@ void LLWorld::updateWaterObjects()
}
waterp->setRegion(gAgent.getRegion());
- LLVector3d water_pos(water_center_x, water_center_y, 256.f+DEFAULT_WATER_HEIGHT) ;
+ LLVector3d water_pos(water_center_x, water_center_y, 256.f + water_height) ;
LLVector3 water_scale((F32) dim[0], (F32) dim[1], 512.f);
//stretch out to horizon
diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp
index ed636a40b2..920bac93a2 100644
--- a/indra/newview/pipeline.cpp
+++ b/indra/newview/pipeline.cpp
@@ -51,6 +51,10 @@
// newview includes
#include "llagent.h"
#include "llagentcamera.h"
+#include "llappviewer.h"
+#include "lltexturecache.h"
+#include "lltexturefetch.h"
+#include "llimageworker.h"
#include "lldrawable.h"
#include "lldrawpoolalpha.h"
#include "lldrawpoolavatar.h"
@@ -104,7 +108,10 @@
#include "lltoolpie.h"
#include "llcurl.h"
#include "llnotifications.h"
-
+#include "llpathinglib.h"
+#include "llfloaterpathfindingconsole.h"
+#include "llfloaterpathfindingcharacters.h"
+#include "llpathfindingpathtool.h"
#ifdef _DEBUG
// Debug indices is disabled for now for debug performance - djs 4/24/02
@@ -113,6 +120,8 @@
//#define DEBUG_INDICES
#endif
+bool gShiftFrame = false;
+
//cached settings
BOOL LLPipeline::RenderAvatarVP;
BOOL LLPipeline::VertexShaderEnable;
@@ -210,7 +219,7 @@ BOOL gDebugPipeline = FALSE;
LLPipeline gPipeline;
const LLMatrix4* gGLLastMatrix = NULL;
-LLFastTimer::DeclareTimer FTM_RENDER_GEOMETRY("Geometry");
+LLFastTimer::DeclareTimer FTM_RENDER_GEOMETRY("Render Geometry");
LLFastTimer::DeclareTimer FTM_RENDER_GRASS("Grass");
LLFastTimer::DeclareTimer FTM_RENDER_INVISIBLE("Invisible");
LLFastTimer::DeclareTimer FTM_RENDER_OCCLUSION("Occlusion");
@@ -227,8 +236,13 @@ LLFastTimer::DeclareTimer FTM_RENDER_BUMP("Bump");
LLFastTimer::DeclareTimer FTM_RENDER_FULLBRIGHT("Fullbright");
LLFastTimer::DeclareTimer FTM_RENDER_GLOW("Glow");
LLFastTimer::DeclareTimer FTM_GEO_UPDATE("Geo Update");
+LLFastTimer::DeclareTimer FTM_PIPELINE_CREATE("Pipeline Create");
LLFastTimer::DeclareTimer FTM_POOLRENDER("RenderPool");
LLFastTimer::DeclareTimer FTM_POOLS("Pools");
+LLFastTimer::DeclareTimer FTM_DEFERRED_POOLRENDER("RenderPool (Deferred)");
+LLFastTimer::DeclareTimer FTM_DEFERRED_POOLS("Pools (Deferred)");
+LLFastTimer::DeclareTimer FTM_POST_DEFERRED_POOLRENDER("RenderPool (Post)");
+LLFastTimer::DeclareTimer FTM_POST_DEFERRED_POOLS("Pools (Post)");
LLFastTimer::DeclareTimer FTM_RENDER_BLOOM_FBO("First FBO");
LLFastTimer::DeclareTimer FTM_STATESORT("Sort Draw State");
LLFastTimer::DeclareTimer FTM_PIPELINE("Pipeline");
@@ -264,6 +278,7 @@ std::string gPoolNames[] =
void drawBox(const LLVector3& c, const LLVector3& r);
void drawBoxOutline(const LLVector3& pos, const LLVector3& size);
U32 nhpo2(U32 v);
+LLVertexBuffer* ll_create_cube_vb(U32 type_mask, U32 usage);
glh::matrix4f glh_copy_matrix(F32* src)
{
@@ -403,9 +418,11 @@ LLPipeline::LLPipeline() :
mInitialized(FALSE),
mVertexShadersEnabled(FALSE),
mVertexShadersLoaded(0),
+ mTransformFeedbackPrimitives(0),
mRenderDebugFeatureMask(0),
mRenderDebugMask(0),
mOldRenderDebugMask(0),
+ mMeshDirtyQueryObject(0),
mGroupQ1Locked(false),
mGroupQ2Locked(false),
mResetVertexBuffers(false),
@@ -432,6 +449,19 @@ LLPipeline::LLPipeline() :
mLightFunc = 0;
}
+void LLPipeline::connectRefreshCachedSettingsSafe(const std::string name)
+{
+ LLPointer<LLControlVariable> cntrl_ptr = gSavedSettings.getControl(name);
+ if ( cntrl_ptr.isNull() )
+ {
+ llwarns << "Global setting name not found:" << name << llendl;
+ }
+ else
+ {
+ cntrl_ptr->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
+ }
+}
+
void LLPipeline::init()
{
LLMemType mt(LLMemType::MTYPE_PIPELINE_INIT);
@@ -504,6 +534,11 @@ void LLPipeline::init()
mSpotLightFade[i] = 1.f;
}
+ if (mCubeVB.isNull())
+ {
+ mCubeVB = ll_create_cube_vb(LLVertexBuffer::MAP_VERTEX, GL_STATIC_DRAW_ARB);
+ }
+
mDeferredVB = new LLVertexBuffer(DEFERRED_VB_MASK, 0);
mDeferredVB->allocateBuffer(8, 0, true);
setLightingDetail(-1);
@@ -511,88 +546,86 @@ void LLPipeline::init()
//
// Update all settings to trigger a cached settings refresh
//
-
- gSavedSettings.getControl("RenderAutoMaskAlphaDeferred")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
- gSavedSettings.getControl("RenderAutoMaskAlphaNonDeferred")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
- gSavedSettings.getControl("RenderUseFarClip")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
- gSavedSettings.getControl("RenderAvatarMaxVisible")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
- gSavedSettings.getControl("RenderDelayVBUpdate")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
-
- gSavedSettings.getControl("UseOcclusion")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
-
- gSavedSettings.getControl("VertexShaderEnable")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
- gSavedSettings.getControl("RenderAvatarVP")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
- gSavedSettings.getControl("WindLightUseAtmosShaders")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
- gSavedSettings.getControl("RenderDeferred")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
- gSavedSettings.getControl("RenderDeferredSunWash")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
- gSavedSettings.getControl("RenderFSAASamples")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
- gSavedSettings.getControl("RenderResolutionDivisor")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
- gSavedSettings.getControl("RenderUIBuffer")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
- gSavedSettings.getControl("RenderShadowDetail")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
- gSavedSettings.getControl("RenderDeferredSSAO")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
- gSavedSettings.getControl("RenderShadowResolutionScale")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
- gSavedSettings.getControl("RenderLocalLights")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
- gSavedSettings.getControl("RenderDelayCreation")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
- gSavedSettings.getControl("RenderAnimateRes")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
- gSavedSettings.getControl("FreezeTime")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
- gSavedSettings.getControl("DebugBeaconLineWidth")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
- gSavedSettings.getControl("RenderHighlightBrightness")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
- gSavedSettings.getControl("RenderHighlightColor")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
- gSavedSettings.getControl("RenderHighlightThickness")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
- gSavedSettings.getControl("RenderSpotLightsInNondeferred")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
- gSavedSettings.getControl("PreviewAmbientColor")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
- gSavedSettings.getControl("PreviewDiffuse0")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
- gSavedSettings.getControl("PreviewSpecular0")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
- gSavedSettings.getControl("PreviewDiffuse1")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
- gSavedSettings.getControl("PreviewSpecular1")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
- gSavedSettings.getControl("PreviewDiffuse2")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
- gSavedSettings.getControl("PreviewSpecular2")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
- gSavedSettings.getControl("PreviewDirection0")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
- gSavedSettings.getControl("PreviewDirection1")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
- gSavedSettings.getControl("PreviewDirection2")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
- gSavedSettings.getControl("RenderGlowMinLuminance")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
- gSavedSettings.getControl("RenderGlowMaxExtractAlpha")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
- gSavedSettings.getControl("RenderGlowWarmthAmount")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
- gSavedSettings.getControl("RenderGlowLumWeights")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
- gSavedSettings.getControl("RenderGlowWarmthWeights")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
- gSavedSettings.getControl("RenderGlowResolutionPow")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
- gSavedSettings.getControl("RenderGlowIterations")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
- gSavedSettings.getControl("RenderGlowWidth")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
- gSavedSettings.getControl("RenderGlowStrength")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
- gSavedSettings.getControl("RenderDepthOfField")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
- gSavedSettings.getControl("CameraFocusTransitionTime")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
- gSavedSettings.getControl("CameraFNumber")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
- gSavedSettings.getControl("CameraFocalLength")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
- gSavedSettings.getControl("CameraFieldOfView")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
- gSavedSettings.getControl("RenderShadowNoise")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
- gSavedSettings.getControl("RenderShadowBlurSize")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
- gSavedSettings.getControl("RenderSSAOScale")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
- gSavedSettings.getControl("RenderSSAOMaxScale")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
- gSavedSettings.getControl("RenderSSAOFactor")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
- gSavedSettings.getControl("RenderSSAOEffect")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
- gSavedSettings.getControl("RenderShadowOffsetError")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
- gSavedSettings.getControl("RenderShadowBiasError")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
- gSavedSettings.getControl("RenderShadowOffset")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
- gSavedSettings.getControl("RenderShadowBias")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
- gSavedSettings.getControl("RenderSpotShadowOffset")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
- gSavedSettings.getControl("RenderSpotShadowBias")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
- gSavedSettings.getControl("RenderEdgeDepthCutoff")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
- gSavedSettings.getControl("RenderEdgeNormCutoff")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
- gSavedSettings.getControl("RenderShadowGaussian")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
- gSavedSettings.getControl("RenderShadowBlurDistFactor")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
- gSavedSettings.getControl("RenderDeferredAtmospheric")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
- gSavedSettings.getControl("RenderReflectionDetail")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
- gSavedSettings.getControl("RenderHighlightFadeTime")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
- gSavedSettings.getControl("RenderShadowClipPlanes")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
- gSavedSettings.getControl("RenderShadowOrthoClipPlanes")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
- gSavedSettings.getControl("RenderShadowNearDist")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
- gSavedSettings.getControl("RenderFarClip")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
- gSavedSettings.getControl("RenderShadowSplitExponent")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
- gSavedSettings.getControl("RenderShadowErrorCutoff")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
- gSavedSettings.getControl("RenderShadowFOVCutoff")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
- gSavedSettings.getControl("CameraOffset")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
- gSavedSettings.getControl("CameraMaxCoF")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
- gSavedSettings.getControl("CameraDoFResScale")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
+ connectRefreshCachedSettingsSafe("RenderAutoMaskAlphaDeferred");
+ connectRefreshCachedSettingsSafe("RenderAutoMaskAlphaNonDeferred");
+ connectRefreshCachedSettingsSafe("RenderUseFarClip");
+ connectRefreshCachedSettingsSafe("RenderAvatarMaxVisible");
+ connectRefreshCachedSettingsSafe("RenderDelayVBUpdate");
+ connectRefreshCachedSettingsSafe("UseOcclusion");
+ connectRefreshCachedSettingsSafe("VertexShaderEnable");
+ connectRefreshCachedSettingsSafe("RenderAvatarVP");
+ connectRefreshCachedSettingsSafe("WindLightUseAtmosShaders");
+ connectRefreshCachedSettingsSafe("RenderDeferred");
+ connectRefreshCachedSettingsSafe("RenderDeferredSunWash");
+ connectRefreshCachedSettingsSafe("RenderFSAASamples");
+ connectRefreshCachedSettingsSafe("RenderResolutionDivisor");
+ connectRefreshCachedSettingsSafe("RenderUIBuffer");
+ connectRefreshCachedSettingsSafe("RenderShadowDetail");
+ connectRefreshCachedSettingsSafe("RenderDeferredSSAO");
+ connectRefreshCachedSettingsSafe("RenderShadowResolutionScale");
+ connectRefreshCachedSettingsSafe("RenderLocalLights");
+ connectRefreshCachedSettingsSafe("RenderDelayCreation");
+ connectRefreshCachedSettingsSafe("RenderAnimateRes");
+ connectRefreshCachedSettingsSafe("FreezeTime");
+ connectRefreshCachedSettingsSafe("DebugBeaconLineWidth");
+ connectRefreshCachedSettingsSafe("RenderHighlightBrightness");
+ connectRefreshCachedSettingsSafe("RenderHighlightColor");
+ connectRefreshCachedSettingsSafe("RenderHighlightThickness");
+ connectRefreshCachedSettingsSafe("RenderSpotLightsInNondeferred");
+ connectRefreshCachedSettingsSafe("PreviewAmbientColor");
+ connectRefreshCachedSettingsSafe("PreviewDiffuse0");
+ connectRefreshCachedSettingsSafe("PreviewSpecular0");
+ connectRefreshCachedSettingsSafe("PreviewDiffuse1");
+ connectRefreshCachedSettingsSafe("PreviewSpecular1");
+ connectRefreshCachedSettingsSafe("PreviewDiffuse2");
+ connectRefreshCachedSettingsSafe("PreviewSpecular2");
+ connectRefreshCachedSettingsSafe("PreviewDirection0");
+ connectRefreshCachedSettingsSafe("PreviewDirection1");
+ connectRefreshCachedSettingsSafe("PreviewDirection2");
+ connectRefreshCachedSettingsSafe("RenderGlowMinLuminance");
+ connectRefreshCachedSettingsSafe("RenderGlowMaxExtractAlpha");
+ connectRefreshCachedSettingsSafe("RenderGlowWarmthAmount");
+ connectRefreshCachedSettingsSafe("RenderGlowLumWeights");
+ connectRefreshCachedSettingsSafe("RenderGlowWarmthWeights");
+ connectRefreshCachedSettingsSafe("RenderGlowResolutionPow");
+ connectRefreshCachedSettingsSafe("RenderGlowIterations");
+ connectRefreshCachedSettingsSafe("RenderGlowWidth");
+ connectRefreshCachedSettingsSafe("RenderGlowStrength");
+ connectRefreshCachedSettingsSafe("RenderDepthOfField");
+ connectRefreshCachedSettingsSafe("CameraFocusTransitionTime");
+ connectRefreshCachedSettingsSafe("CameraFNumber");
+ connectRefreshCachedSettingsSafe("CameraFocalLength");
+ connectRefreshCachedSettingsSafe("CameraFieldOfView");
+ connectRefreshCachedSettingsSafe("RenderShadowNoise");
+ connectRefreshCachedSettingsSafe("RenderShadowBlurSize");
+ connectRefreshCachedSettingsSafe("RenderSSAOScale");
+ connectRefreshCachedSettingsSafe("RenderSSAOMaxScale");
+ connectRefreshCachedSettingsSafe("RenderSSAOFactor");
+ connectRefreshCachedSettingsSafe("RenderSSAOEffect");
+ connectRefreshCachedSettingsSafe("RenderShadowOffsetError");
+ connectRefreshCachedSettingsSafe("RenderShadowBiasError");
+ connectRefreshCachedSettingsSafe("RenderShadowOffset");
+ connectRefreshCachedSettingsSafe("RenderShadowBias");
+ connectRefreshCachedSettingsSafe("RenderSpotShadowOffset");
+ connectRefreshCachedSettingsSafe("RenderSpotShadowBias");
+ connectRefreshCachedSettingsSafe("RenderEdgeDepthCutoff");
+ connectRefreshCachedSettingsSafe("RenderEdgeNormCutoff");
+ connectRefreshCachedSettingsSafe("RenderShadowGaussian");
+ connectRefreshCachedSettingsSafe("RenderShadowBlurDistFactor");
+ connectRefreshCachedSettingsSafe("RenderDeferredAtmospheric");
+ connectRefreshCachedSettingsSafe("RenderReflectionDetail");
+ connectRefreshCachedSettingsSafe("RenderHighlightFadeTime");
+ connectRefreshCachedSettingsSafe("RenderShadowClipPlanes");
+ connectRefreshCachedSettingsSafe("RenderShadowOrthoClipPlanes");
+ connectRefreshCachedSettingsSafe("RenderShadowNearDist");
+ connectRefreshCachedSettingsSafe("RenderFarClip");
+ connectRefreshCachedSettingsSafe("RenderShadowSplitExponent");
+ connectRefreshCachedSettingsSafe("RenderShadowErrorCutoff");
+ connectRefreshCachedSettingsSafe("RenderShadowFOVCutoff");
+ connectRefreshCachedSettingsSafe("CameraOffset");
+ connectRefreshCachedSettingsSafe("CameraMaxCoF");
+ connectRefreshCachedSettingsSafe("CameraDoFResScale");
+ connectRefreshCachedSettingsSafe("RenderAutoHideSurfaceAreaLimit");
gSavedSettings.getControl("RenderAutoHideSurfaceAreaLimit")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
}
@@ -693,6 +726,12 @@ void LLPipeline::destroyGL()
{
LLVertexBuffer::sEnableVBOs = FALSE;
}
+
+ if (mMeshDirtyQueryObject)
+ {
+ glDeleteQueriesARB(1, &mMeshDirtyQueryObject);
+ mMeshDirtyQueryObject = 0;
+ }
}
static LLFastTimer::DeclareTimer FTM_RESIZE_SCREEN_TEXTURE("Resize Screen Texture");
@@ -851,7 +890,7 @@ bool LLPipeline::allocateScreenBuffer(U32 resX, U32 resY, U32 samples)
U32 sun_shadow_map_width = ((U32(resX*scale)+1)&~1); // must be even to avoid a stripe in the horizontal shadow blur
for (U32 i = 0; i < 4; i++)
{
- if (!mShadow[i].allocate(sun_shadow_map_width,U32(resY*scale), 0, TRUE, FALSE, LLTexUnit::TT_RECT_TEXTURE)) return false;
+ if (!mShadow[i].allocate(sun_shadow_map_width,U32(resY*scale), 0, TRUE, FALSE, LLTexUnit::TT_TEXTURE)) return false;
}
}
else
@@ -942,6 +981,7 @@ void LLPipeline::refreshCachedSettings()
LLPipeline::sUseOcclusion =
(!gUseWireframe
+ && LLGLSLShader::sNoFixedFunction
&& LLFeatureManager::getInstance()->isFeatureAvailable("UseOcclusion")
&& gSavedSettings.getBOOL("UseOcclusion")
&& gGLManager.mHasOcclusionQuery) ? 2 : 0;
@@ -1030,13 +1070,13 @@ void LLPipeline::releaseGLBuffers()
if (mNoiseMap)
{
- LLImageGL::deleteTextures(1, &mNoiseMap);
+ LLImageGL::deleteTextures(LLTexUnit::TT_TEXTURE, GL_RGB16F_ARB, 0, 1, &mNoiseMap);
mNoiseMap = 0;
}
if (mTrueNoiseMap)
{
- LLImageGL::deleteTextures(1, &mTrueNoiseMap);
+ LLImageGL::deleteTextures(LLTexUnit::TT_TEXTURE, GL_RGB16F_ARB, 0, 1, &mTrueNoiseMap);
mTrueNoiseMap = 0;
}
@@ -1060,7 +1100,7 @@ void LLPipeline::releaseLUTBuffers()
{
if (mLightFunc)
{
- LLImageGL::deleteTextures(1, &mLightFunc);
+ LLImageGL::deleteTextures(LLTexUnit::TT_TEXTURE, GL_R8, 0, 1, &mLightFunc);
mLightFunc = 0;
}
}
@@ -1138,7 +1178,7 @@ void LLPipeline::createGLBuffers()
noise[i].mV[2] = ll_frand()*scaler+1.f-scaler/2.f;
}
- LLImageGL::generateTextures(1, &mNoiseMap);
+ LLImageGL::generateTextures(LLTexUnit::TT_TEXTURE, GL_RGB16F_ARB, 1, &mNoiseMap);
gGL.getTexUnit(0)->bindManual(LLTexUnit::TT_TEXTURE, mNoiseMap);
LLImageGL::setManualImage(LLTexUnit::getInternalType(LLTexUnit::TT_TEXTURE), 0, GL_RGB16F_ARB, noiseRes, noiseRes, GL_RGB, GL_FLOAT, noise, false);
@@ -1154,7 +1194,7 @@ void LLPipeline::createGLBuffers()
noise[i] = ll_frand()*2.0-1.0;
}
- LLImageGL::generateTextures(1, &mTrueNoiseMap);
+ LLImageGL::generateTextures(LLTexUnit::TT_TEXTURE, GL_RGB16F_ARB, 1, &mTrueNoiseMap);
gGL.getTexUnit(0)->bindManual(LLTexUnit::TT_TEXTURE, mTrueNoiseMap);
LLImageGL::setManualImage(LLTexUnit::getInternalType(LLTexUnit::TT_TEXTURE), 0, GL_RGB16F_ARB, noiseRes, noiseRes, GL_RGB,GL_FLOAT, noise, false);
gGL.getTexUnit(0)->setTextureFilteringOption(LLTexUnit::TFO_POINT);
@@ -1210,7 +1250,7 @@ void LLPipeline::createLUTBuffers()
}
}
- LLImageGL::generateTextures(1, &mLightFunc);
+ LLImageGL::generateTextures(LLTexUnit::TT_TEXTURE, GL_R8, 1, &mLightFunc);
gGL.getTexUnit(0)->bindManual(LLTexUnit::TT_TEXTURE, mLightFunc);
LLImageGL::setManualImage(LLTexUnit::getInternalType(LLTexUnit::TT_TEXTURE), 0, GL_R8, lightResX, lightResY, GL_RED, GL_UNSIGNED_BYTE, ls, false);
gGL.getTexUnit(0)->setTextureAddressMode(LLTexUnit::TAM_CLAMP);
@@ -1349,7 +1389,7 @@ public:
{
LLSpatialGroup* group = (LLSpatialGroup*) node->getListener(0);
- if (!group->isState(LLSpatialGroup::GEOM_DIRTY) && !group->getData().empty())
+ if (!group->isState(LLSpatialGroup::GEOM_DIRTY) && !group->isEmpty())
{
for (LLSpatialGroup::draw_map_t::iterator i = group->mDrawMap.begin(); i != group->mDrawMap.end(); ++i)
{
@@ -1640,6 +1680,21 @@ void LLPipeline::unlinkDrawable(LLDrawable *drawable)
}
+//static
+void LLPipeline::removeMutedAVsLights(LLVOAvatar* muted_avatar)
+{
+ LLFastTimer t(FTM_REMOVE_FROM_LIGHT_SET);
+ for (light_set_t::iterator iter = gPipeline.mNearbyLights.begin();
+ iter != gPipeline.mNearbyLights.end(); iter++)
+ {
+ if (iter->drawable->getVObj()->isAttachment() && iter->drawable->getVObj()->getAvatar() == muted_avatar)
+ {
+ gPipeline.mLights.erase(iter->drawable);
+ gPipeline.mNearbyLights.erase(iter);
+ }
+ }
+}
+
U32 LLPipeline::addObject(LLViewerObject *vobj)
{
LLMemType mt_ao(LLMemType::MTYPE_PIPELINE_ADD_OBJECT);
@@ -1658,7 +1713,7 @@ U32 LLPipeline::addObject(LLViewerObject *vobj)
void LLPipeline::createObjects(F32 max_dtime)
{
- LLFastTimer ftm(FTM_GEO_UPDATE);
+ LLFastTimer ftm(FTM_PIPELINE_CREATE);
LLMemType mt(LLMemType::MTYPE_PIPELINE_CREATE_OBJECTS);
LLTimer update_timer;
@@ -1819,7 +1874,21 @@ void LLPipeline::updateMovedList(LLDrawable::drawable_vector_t& moved_list)
drawablep->clearState(LLDrawable::EARLY_MOVE | LLDrawable::MOVE_UNDAMPED);
if (done)
{
+ if (drawablep->isRoot())
+ {
+ drawablep->makeStatic();
+ }
drawablep->clearState(LLDrawable::ON_MOVE_LIST);
+ if (drawablep->isState(LLDrawable::ANIMATED_CHILD))
+ { //will likely not receive any future world matrix updates
+ // -- this keeps attachments from getting stuck in space and falling off your avatar
+ drawablep->clearState(LLDrawable::ANIMATED_CHILD);
+ markRebuild(drawablep, LLDrawable::REBUILD_VOLUME, TRUE);
+ if (drawablep->getVObj())
+ {
+ drawablep->getVObj()->dirtySpatialGroup(TRUE);
+ }
+ }
iter = moved_list.erase(curiter);
}
}
@@ -1944,7 +2013,7 @@ void LLPipeline::clearReferences()
void check_references(LLSpatialGroup* group, LLDrawable* drawable)
{
- for (LLSpatialGroup::element_iter i = group->getData().begin(); i != group->getData().end(); ++i)
+ for (LLSpatialGroup::element_iter i = group->getDataBegin(); i != group->getDataEnd(); ++i)
{
if (drawable == *i)
{
@@ -1966,7 +2035,7 @@ void check_references(LLDrawable* drawable, LLFace* face)
void check_references(LLSpatialGroup* group, LLFace* face)
{
- for (LLSpatialGroup::element_iter i = group->getData().begin(); i != group->getData().end(); ++i)
+ for (LLSpatialGroup::element_iter i = group->getDataBegin(); i != group->getDataEnd(); ++i)
{
LLDrawable* drawable = *i;
check_references(drawable, face);
@@ -1978,25 +2047,25 @@ void LLPipeline::checkReferences(LLFace* face)
#if 0
if (sCull)
{
- for (LLCullResult::sg_list_t::iterator iter = sCull->beginVisibleGroups(); iter != sCull->endVisibleGroups(); ++iter)
+ for (LLCullResult::sg_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)
+ for (LLCullResult::sg_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)
+ for (LLCullResult::sg_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)
+ for (LLCullResult::drawable_iterator iter = sCull->beginVisibleList(); iter != sCull->endVisibleList(); ++iter)
{
LLDrawable* drawable = *iter;
check_references(drawable, face);
@@ -2010,25 +2079,25 @@ void LLPipeline::checkReferences(LLDrawable* drawable)
#if 0
if (sCull)
{
- for (LLCullResult::sg_list_t::iterator iter = sCull->beginVisibleGroups(); iter != sCull->endVisibleGroups(); ++iter)
+ for (LLCullResult::sg_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)
+ for (LLCullResult::sg_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)
+ for (LLCullResult::sg_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)
+ for (LLCullResult::drawable_iterator iter = sCull->beginVisibleList(); iter != sCull->endVisibleList(); ++iter)
{
if (drawable == *iter)
{
@@ -2061,19 +2130,19 @@ void LLPipeline::checkReferences(LLDrawInfo* draw_info)
#if 0
if (sCull)
{
- for (LLCullResult::sg_list_t::iterator iter = sCull->beginVisibleGroups(); iter != sCull->endVisibleGroups(); ++iter)
+ for (LLCullResult::sg_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)
+ for (LLCullResult::sg_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)
+ for (LLCullResult::sg_iterator iter = sCull->beginDrawableGroups(); iter != sCull->endDrawableGroups(); ++iter)
{
LLSpatialGroup* group = *iter;
check_references(group, draw_info);
@@ -2087,7 +2156,7 @@ void LLPipeline::checkReferences(LLSpatialGroup* group)
#if 0
if (sCull)
{
- for (LLCullResult::sg_list_t::iterator iter = sCull->beginVisibleGroups(); iter != sCull->endVisibleGroups(); ++iter)
+ for (LLCullResult::sg_iterator iter = sCull->beginVisibleGroups(); iter != sCull->endVisibleGroups(); ++iter)
{
if (group == *iter)
{
@@ -2095,7 +2164,7 @@ void LLPipeline::checkReferences(LLSpatialGroup* group)
}
}
- for (LLCullResult::sg_list_t::iterator iter = sCull->beginAlphaGroups(); iter != sCull->endAlphaGroups(); ++iter)
+ for (LLCullResult::sg_iterator iter = sCull->beginAlphaGroups(); iter != sCull->endAlphaGroups(); ++iter)
{
if (group == *iter)
{
@@ -2103,7 +2172,7 @@ void LLPipeline::checkReferences(LLSpatialGroup* group)
}
}
- for (LLCullResult::sg_list_t::iterator iter = sCull->beginDrawableGroups(); iter != sCull->endDrawableGroups(); ++iter)
+ for (LLCullResult::sg_iterator iter = sCull->beginDrawableGroups(); iter != sCull->endDrawableGroups(); ++iter)
{
if (group == *iter)
{
@@ -2214,8 +2283,6 @@ void LLPipeline::updateCull(LLCamera& camera, LLCullResult& result, S32 water_cl
gGLLastMatrix = NULL;
gGL.loadMatrix(gGLLastModelView);
-
- LLVertexBuffer::unbind();
LLGLDisable blend(GL_BLEND);
LLGLDisable test(GL_ALPHA_TEST);
gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
@@ -2259,7 +2326,16 @@ void LLPipeline::updateCull(LLCamera& camera, LLCullResult& result, S32 water_cl
{ //if no shader is currently bound, use the occlusion shader instead of fixed function if we can
// (shadow render uses a special shader that clamps to clip planes)
bound_shader = true;
- gOcclusionProgram.bind();
+ gOcclusionCubeProgram.bind();
+ }
+
+ if (sUseOcclusion > 1)
+ {
+ if (mCubeVB.isNull())
+ { //cube VB will be used for issuing occlusion queries
+ mCubeVB = ll_create_cube_vb(LLVertexBuffer::MAP_VERTEX, GL_STATIC_DRAW_ARB);
+ }
+ mCubeVB->setBuffer(LLVertexBuffer::MAP_VERTEX);
}
for (LLWorld::region_list_t::const_iterator iter = LLWorld::getInstance()->getRegionList().begin();
@@ -2291,7 +2367,7 @@ void LLPipeline::updateCull(LLCamera& camera, LLCullResult& result, S32 water_cl
if (bound_shader)
{
- gOcclusionProgram.unbind();
+ gOcclusionCubeProgram.unbind();
}
camera.disableUserClipPlane();
@@ -2335,7 +2411,7 @@ void LLPipeline::updateCull(LLCamera& camera, LLCullResult& result, S32 water_cl
void LLPipeline::markNotCulled(LLSpatialGroup* group, LLCamera& camera)
{
- if (group->getData().empty())
+ if (group->isEmpty())
{
return;
}
@@ -2424,15 +2500,21 @@ void LLPipeline::doOcclusion(LLCamera& camera)
{
if (LLPipeline::sShadowRender)
{
- gDeferredShadowProgram.bind();
+ gDeferredShadowCubeProgram.bind();
}
else
{
- gOcclusionProgram.bind();
+ gOcclusionCubeProgram.bind();
}
+ }
+
+ if (mCubeVB.isNull())
+ { //cube VB will be used for issuing occlusion queries
+ mCubeVB = ll_create_cube_vb(LLVertexBuffer::MAP_VERTEX, GL_STATIC_DRAW_ARB);
}
+ mCubeVB->setBuffer(LLVertexBuffer::MAP_VERTEX);
- for (LLCullResult::sg_list_t::iterator iter = sCull->beginOcclusionGroups(); iter != sCull->endOcclusionGroups(); ++iter)
+ for (LLCullResult::sg_iterator iter = sCull->beginOcclusionGroups(); iter != sCull->endOcclusionGroups(); ++iter)
{
LLSpatialGroup* group = *iter;
group->doOcclusion(&camera);
@@ -2443,11 +2525,11 @@ void LLPipeline::doOcclusion(LLCamera& camera)
{
if (LLPipeline::sShadowRender)
{
- gDeferredShadowProgram.unbind();
+ gDeferredShadowCubeProgram.unbind();
}
else
{
- gOcclusionProgram.unbind();
+ gOcclusionCubeProgram.unbind();
}
}
@@ -2466,22 +2548,66 @@ BOOL LLPipeline::updateDrawableGeom(LLDrawable* drawablep, BOOL priority)
return update_complete;
}
+static LLFastTimer::DeclareTimer FTM_SEED_VBO_POOLS("Seed VBO Pool");
+
+static LLFastTimer::DeclareTimer FTM_UPDATE_GL("Update GL");
+
void LLPipeline::updateGL()
{
- while (!LLGLUpdate::sGLQ.empty())
{
- LLGLUpdate* glu = LLGLUpdate::sGLQ.front();
- glu->updateGL();
- glu->mInQ = FALSE;
- LLGLUpdate::sGLQ.pop_front();
+ LLFastTimer t(FTM_UPDATE_GL);
+ while (!LLGLUpdate::sGLQ.empty())
+ {
+ LLGLUpdate* glu = LLGLUpdate::sGLQ.front();
+ glu->updateGL();
+ glu->mInQ = FALSE;
+ LLGLUpdate::sGLQ.pop_front();
+ }
+
+ { //seed VBO Pools
+ LLFastTimer t(FTM_SEED_VBO_POOLS);
+ LLVertexBuffer::seedPools();
+ }
+ }
+
+ { //seed VBO Pools
+ LLFastTimer t(FTM_SEED_VBO_POOLS);
+ LLVertexBuffer::seedPools();
}
}
+static LLFastTimer::DeclareTimer FTM_REBUILD_PRIORITY_GROUPS("Rebuild Priority Groups");
+
+void LLPipeline::clearRebuildGroups()
+{
+ mGroupQ1Locked = true;
+ // Iterate through all drawables on the priority build queue,
+ for (LLSpatialGroup::sg_vector_t::iterator iter = mGroupQ1.begin();
+ iter != mGroupQ1.end(); ++iter)
+ {
+ LLSpatialGroup* group = *iter;
+ group->clearState(LLSpatialGroup::IN_BUILD_Q1);
+ }
+ mGroupQ1.clear();
+ mGroupQ1Locked = false;
+
+ mGroupQ2Locked = true;
+ for (LLSpatialGroup::sg_vector_t::iterator iter = mGroupQ2.begin();
+ iter != mGroupQ2.end(); ++iter)
+ {
+ LLSpatialGroup* group = *iter;
+ group->clearState(LLSpatialGroup::IN_BUILD_Q2);
+ }
+
+ mGroupQ2.clear();
+ mGroupQ2Locked = false;
+}
+
void LLPipeline::rebuildPriorityGroups()
{
+ LLFastTimer t(FTM_REBUILD_PRIORITY_GROUPS);
LLTimer update_timer;
LLMemType mt(LLMemType::MTYPE_PIPELINE);
-
assertInitialized();
gMeshRepo.notifyLoadedMeshes();
@@ -2500,7 +2626,9 @@ void LLPipeline::rebuildPriorityGroups()
mGroupQ1Locked = false;
}
-
+
+static LLFastTimer::DeclareTimer FTM_REBUILD_GROUPS("Rebuild Groups");
+
void LLPipeline::rebuildGroups()
{
if (mGroupQ2.empty())
@@ -2508,6 +2636,7 @@ void LLPipeline::rebuildGroups()
return;
}
+ LLFastTimer t(FTM_REBUILD_GROUPS);
mGroupQ2Locked = true;
// Iterate through some drawables on the non-priority build queue
S32 size = (S32) mGroupQ2.size();
@@ -2651,6 +2780,7 @@ void LLPipeline::markVisible(LLDrawable *drawablep, LLCamera& camera)
{
const LLDrawable* root = ((LLSpatialBridge*) drawablep)->mDrawable;
llassert(root); // trying to catch a bad assumption
+
if (root && // // this test may not be needed, see above
root->getVObj()->isAttachment())
{
@@ -2673,6 +2803,7 @@ void LLPipeline::markVisible(LLDrawable *drawablep, LLCamera& camera)
}
else
{
+
sCull->pushDrawable(drawablep);
}
@@ -2749,6 +2880,10 @@ void LLPipeline::markShift(LLDrawable *drawablep)
}
}
+static LLFastTimer::DeclareTimer FTM_SHIFT_DRAWABLE("Shift Drawable");
+static LLFastTimer::DeclareTimer FTM_SHIFT_OCTREE("Shift Octree");
+static LLFastTimer::DeclareTimer FTM_SHIFT_HUD("Shift HUD");
+
void LLPipeline::shiftObjects(const LLVector3 &offset)
{
LLMemType mt(LLMemType::MTYPE_PIPELINE_SHIFT_OBJECTS);
@@ -2761,35 +2896,46 @@ void LLPipeline::shiftObjects(const LLVector3 &offset)
LLVector4a offseta;
offseta.load3(offset.mV);
- for (LLDrawable::drawable_vector_t::iterator iter = mShiftList.begin();
- iter != mShiftList.end(); iter++)
{
- LLDrawable *drawablep = *iter;
- if (drawablep->isDead())
+ LLFastTimer t(FTM_SHIFT_DRAWABLE);
+
+ for (LLDrawable::drawable_vector_t::iterator iter = mShiftList.begin();
+ iter != mShiftList.end(); iter++)
{
- continue;
- }
- drawablep->shiftPos(offseta);
- drawablep->clearState(LLDrawable::ON_SHIFT_LIST);
+ LLDrawable *drawablep = *iter;
+ if (drawablep->isDead())
+ {
+ continue;
+ }
+ drawablep->shiftPos(offseta);
+ drawablep->clearState(LLDrawable::ON_SHIFT_LIST);
+ }
+ mShiftList.resize(0);
}
- mShiftList.resize(0);
- 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++)
+ LLFastTimer t(FTM_SHIFT_OCTREE);
+ for (LLWorld::region_list_t::const_iterator iter = LLWorld::getInstance()->getRegionList().begin();
+ iter != LLWorld::getInstance()->getRegionList().end(); ++iter)
{
- LLSpatialPartition* part = region->getSpatialPartition(i);
- if (part)
+ LLViewerRegion* region = *iter;
+ for (U32 i = 0; i < LLViewerRegion::NUM_PARTITIONS; i++)
{
- part->shift(offseta);
+ LLSpatialPartition* part = region->getSpatialPartition(i);
+ if (part)
+ {
+ part->shift(offseta);
+ }
}
}
}
- LLHUDText::shiftAll(offset);
- LLHUDNameTag::shiftAll(offset);
+ {
+ LLFastTimer t(FTM_SHIFT_HUD);
+ LLHUDText::shiftAll(offset);
+ LLHUDNameTag::shiftAll(offset);
+ }
display_update_camera();
}
@@ -2822,8 +2968,10 @@ void LLPipeline::markPartitionMove(LLDrawable* drawable)
}
}
+static LLFastTimer::DeclareTimer FTM_PROCESS_PARTITIONQ("PartitionQ");
void LLPipeline::processPartitionQ()
{
+ LLFastTimer t(FTM_PROCESS_PARTITIONQ);
for (LLDrawable::drawable_list_t::iterator iter = mPartitionQ.begin(); iter != mPartitionQ.end(); ++iter)
{
LLDrawable* drawable = *iter;
@@ -2838,6 +2986,11 @@ void LLPipeline::processPartitionQ()
mPartitionQ.clear();
}
+void LLPipeline::markMeshDirty(LLSpatialGroup* group)
+{
+ mMeshDirtyGroup.push_back(group);
+}
+
void LLPipeline::markRebuild(LLSpatialGroup* group, BOOL priority)
{
LLMemType mt(LLMemType::MTYPE_PIPELINE);
@@ -2934,7 +3087,7 @@ void LLPipeline::stateSort(LLCamera& camera, LLCullResult &result)
//LLVertexBuffer::unbind();
grabReferences(result);
- for (LLCullResult::sg_list_t::iterator iter = sCull->beginDrawableGroups(); iter != sCull->endDrawableGroups(); ++iter)
+ for (LLCullResult::sg_iterator iter = sCull->beginDrawableGroups(); iter != sCull->endDrawableGroups(); ++iter)
{
LLSpatialGroup* group = *iter;
group->checkOcclusion();
@@ -2945,7 +3098,7 @@ void LLPipeline::stateSort(LLCamera& camera, LLCullResult &result)
else
{
group->setVisible();
- for (LLSpatialGroup::element_iter i = group->getData().begin(); i != group->getData().end(); ++i)
+ for (LLSpatialGroup::element_iter i = group->getDataBegin(); i != group->getDataEnd(); ++i)
{
markVisible(*i, camera);
}
@@ -2960,9 +3113,9 @@ 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)
+ for (LLCullResult::bridge_iterator i = sCull->beginVisibleBridge(); i != sCull->endVisibleBridge(); ++i)
{
- LLCullResult::bridge_list_t::iterator cur_iter = i;
+ LLCullResult::bridge_iterator cur_iter = i;
LLSpatialBridge* bridge = *cur_iter;
LLSpatialGroup* group = bridge->getSpatialGroup();
@@ -2992,7 +3145,7 @@ void LLPipeline::stateSort(LLCamera& camera, LLCullResult &result)
}
}
- for (LLCullResult::sg_list_t::iterator iter = sCull->beginVisibleGroups(); iter != sCull->endVisibleGroups(); ++iter)
+ for (LLCullResult::sg_iterator iter = sCull->beginVisibleGroups(); iter != sCull->endVisibleGroups(); ++iter)
{
LLSpatialGroup* group = *iter;
group->checkOcclusion();
@@ -3014,7 +3167,7 @@ void LLPipeline::stateSort(LLCamera& camera, LLCullResult &result)
{
LLFastTimer ftm(FTM_STATESORT_DRAWABLE);
- for (LLCullResult::drawable_list_t::iterator iter = sCull->beginVisibleList();
+ for (LLCullResult::drawable_iterator iter = sCull->beginVisibleList();
iter != sCull->endVisibleList(); ++iter)
{
LLDrawable *drawablep = *iter;
@@ -3033,7 +3186,7 @@ void LLPipeline::stateSort(LLSpatialGroup* group, LLCamera& camera)
LLMemType mt(LLMemType::MTYPE_PIPELINE_STATE_SORT);
if (group->changeLOD())
{
- for (LLSpatialGroup::element_iter i = group->getData().begin(); i != group->getData().end(); ++i)
+ for (LLSpatialGroup::element_iter i = group->getDataBegin(); i != group->getDataEnd(); ++i)
{
LLDrawable* drawablep = *i;
stateSort(drawablep, camera);
@@ -3150,13 +3303,13 @@ void LLPipeline::stateSort(LLDrawable* drawablep, LLCamera& camera)
}
-void forAllDrawables(LLCullResult::sg_list_t::iterator begin,
- LLCullResult::sg_list_t::iterator end,
+void forAllDrawables(LLCullResult::sg_iterator begin,
+ LLCullResult::sg_iterator end,
void (*func)(LLDrawable*))
{
- for (LLCullResult::sg_list_t::iterator i = begin; i != end; ++i)
+ for (LLCullResult::sg_iterator i = begin; i != end; ++i)
{
- for (LLSpatialGroup::element_iter j = (*i)->getData().begin(); j != (*i)->getData().end(); ++j)
+ for (LLSpatialGroup::element_iter j = (*i)->getDataBegin(); j != (*i)->getDataEnd(); ++j)
{
func(*j);
}
@@ -3189,7 +3342,11 @@ void renderScriptedBeacons(LLDrawable* drawablep)
S32 count = drawablep->getNumFaces();
for (face_id = 0; face_id < count; face_id++)
{
- gPipeline.mHighlightFaces.push_back(drawablep->getFace(face_id) );
+ LLFace * facep = drawablep->getFace(face_id);
+ if (facep)
+ {
+ gPipeline.mHighlightFaces.push_back(facep);
+ }
}
}
}
@@ -3215,7 +3372,11 @@ void renderScriptedTouchBeacons(LLDrawable* drawablep)
S32 count = drawablep->getNumFaces();
for (face_id = 0; face_id < count; face_id++)
{
- gPipeline.mHighlightFaces.push_back(drawablep->getFace(face_id) );
+ LLFace * facep = drawablep->getFace(face_id);
+ if (facep)
+ {
+ gPipeline.mHighlightFaces.push_back(facep);
+ }
}
}
}
@@ -3227,7 +3388,7 @@ void renderPhysicalBeacons(LLDrawable* drawablep)
if (vobj
&& !vobj->isAvatar()
//&& !vobj->getParent()
- && vobj->usePhysics())
+ && vobj->flagUsePhysics())
{
if (gPipeline.sRenderBeacons)
{
@@ -3240,7 +3401,11 @@ void renderPhysicalBeacons(LLDrawable* drawablep)
S32 count = drawablep->getNumFaces();
for (face_id = 0; face_id < count; face_id++)
{
- gPipeline.mHighlightFaces.push_back(drawablep->getFace(face_id) );
+ LLFace * facep = drawablep->getFace(face_id);
+ if (facep)
+ {
+ gPipeline.mHighlightFaces.push_back(facep);
+ }
}
}
}
@@ -3276,7 +3441,11 @@ void renderMOAPBeacons(LLDrawable* drawablep)
S32 count = drawablep->getNumFaces();
for (face_id = 0; face_id < count; face_id++)
{
- gPipeline.mHighlightFaces.push_back(drawablep->getFace(face_id) );
+ LLFace * facep = drawablep->getFace(face_id);
+ if (facep)
+ {
+ gPipeline.mHighlightFaces.push_back(facep);
+ }
}
}
}
@@ -3301,7 +3470,11 @@ void renderParticleBeacons(LLDrawable* drawablep)
S32 count = drawablep->getNumFaces();
for (face_id = 0; face_id < count; face_id++)
{
- gPipeline.mHighlightFaces.push_back(drawablep->getFace(face_id) );
+ LLFace * facep = drawablep->getFace(face_id);
+ if (facep)
+ {
+ gPipeline.mHighlightFaces.push_back(facep);
+ }
}
}
}
@@ -3319,7 +3492,11 @@ void renderSoundHighlights(LLDrawable* drawablep)
S32 count = drawablep->getNumFaces();
for (face_id = 0; face_id < count; face_id++)
{
- gPipeline.mHighlightFaces.push_back(drawablep->getFace(face_id) );
+ LLFace * facep = drawablep->getFace(face_id);
+ if (facep)
+ {
+ gPipeline.mHighlightFaces.push_back(facep);
+ }
}
}
}
@@ -3334,7 +3511,7 @@ void LLPipeline::postSort(LLCamera& camera)
llpushcallstacks ;
//rebuild drawable geometry
- for (LLCullResult::sg_list_t::iterator i = sCull->beginDrawableGroups(); i != sCull->endDrawableGroups(); ++i)
+ for (LLCullResult::sg_iterator i = sCull->beginDrawableGroups(); i != sCull->endDrawableGroups(); ++i)
{
LLSpatialGroup* group = *i;
if (!sUseOcclusion ||
@@ -3350,23 +3527,9 @@ void LLPipeline::postSort(LLCamera& camera)
rebuildPriorityGroups();
llpushcallstacks ;
- const S32 bin_count = 1024*8;
-
- static LLCullResult::drawinfo_list_t alpha_bins[bin_count];
- static U32 bin_size[bin_count];
-
- //clear one bin per frame to avoid memory bloat
- static S32 clear_idx = 0;
- clear_idx = (1+clear_idx)%bin_count;
- alpha_bins[clear_idx].clear();
-
- for (U32 j = 0; j < bin_count; j++)
- {
- bin_size[j] = 0;
- }
-
+
//build render map
- for (LLCullResult::sg_list_t::iterator i = sCull->beginVisibleGroups(); i != sCull->endVisibleGroups(); ++i)
+ for (LLCullResult::sg_iterator i = sCull->beginVisibleGroups(); i != sCull->endVisibleGroups(); ++i)
{
LLSpatialGroup* group = *i;
if (sUseOcclusion &&
@@ -3436,11 +3599,43 @@ void LLPipeline::postSort(LLCamera& camera)
}
}
}
+
+ //flush particle VB
+ LLVOPartGroup::sVB->flush();
+
+ /*bool use_transform_feedback = gTransformPositionProgram.mProgramObject && !mMeshDirtyGroup.empty();
+
+ if (use_transform_feedback)
+ { //place a query around potential transform feedback code for synchronization
+ mTransformFeedbackPrimitives = 0;
+
+ if (!mMeshDirtyQueryObject)
+ {
+ glGenQueriesARB(1, &mMeshDirtyQueryObject);
+ }
+
+ glBeginQueryARB(GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN, mMeshDirtyQueryObject);
+ }*/
+
+ //pack vertex buffers for groups that chose to delay their updates
+ for (LLSpatialGroup::sg_vector_t::iterator iter = mMeshDirtyGroup.begin(); iter != mMeshDirtyGroup.end(); ++iter)
+ {
+ (*iter)->rebuildMesh();
+ }
+
+ /*if (use_transform_feedback)
+ {
+ glEndQueryARB(GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN);
+ }*/
+
+ mMeshDirtyGroup.clear();
+
if (!sShadowRender)
{
std::sort(sCull->beginAlphaGroups(), sCull->endAlphaGroups(), LLSpatialGroup::CompareDepthGreater());
}
+
llpushcallstacks ;
// only render if the flag is set. The flag is only set if we are in edit mode or the toggle is set in the menus
if (LLFloaterReg::instanceVisible("beacons") && !sShadowRender)
@@ -3514,7 +3709,11 @@ void LLPipeline::postSort(LLCamera& camera)
{
if (object->mDrawable)
{
- gPipeline.mSelectedFaces.push_back(object->mDrawable->getFace(te));
+ LLFace * facep = object->mDrawable->getFace(te);
+ if (facep)
+ {
+ gPipeline.mSelectedFaces.push_back(facep);
+ }
}
return true;
}
@@ -3523,6 +3722,33 @@ void LLPipeline::postSort(LLCamera& camera)
}
}
+ /*static LLFastTimer::DeclareTimer FTM_TRANSFORM_WAIT("Transform Fence");
+ static LLFastTimer::DeclareTimer FTM_TRANSFORM_DO_WORK("Transform Work");
+ if (use_transform_feedback)
+ { //using transform feedback, wait for transform feedback to complete
+ LLFastTimer t(FTM_TRANSFORM_WAIT);
+
+ S32 done = 0;
+ //glGetQueryivARB(GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN, GL_CURRENT_QUERY, &count);
+
+ glGetQueryObjectivARB(mMeshDirtyQueryObject, GL_QUERY_RESULT_AVAILABLE, &done);
+
+ while (!done)
+ {
+ {
+ LLFastTimer t(FTM_TRANSFORM_DO_WORK);
+ F32 max_time = llmin(gFrameIntervalSeconds*10.f, 1.f);
+ //do some useful work while we wait
+ LLAppViewer::getTextureCache()->update(max_time); // unpauses the texture cache thread
+ LLAppViewer::getImageDecodeThread()->update(max_time); // unpauses the image thread
+ LLAppViewer::getTextureFetch()->update(max_time); // unpauses the texture fetch thread
+ }
+ glGetQueryObjectivARB(mMeshDirtyQueryObject, GL_QUERY_RESULT_AVAILABLE, &done);
+ }
+
+ mTransformFeedbackPrimitives = 0;
+ }*/
+
//LLSpatialGroup::sNoDelete = FALSE;
llpushcallstacks ;
}
@@ -3818,6 +4044,7 @@ void LLPipeline::renderGeom(LLCamera& camera, BOOL forceVBOUpdate)
gGL.getTexUnit(0)->bind(LLViewerFetchedTexture::sDefaultImagep);
LLViewerFetchedTexture::sDefaultImagep->setAddressMode(LLTexUnit::TAM_WRAP);
+
//////////////////////////////////////////////
//
// Actually render all of the geometry
@@ -3890,7 +4117,7 @@ void LLPipeline::renderGeom(LLCamera& camera, BOOL forceVBOUpdate)
break;
}
- p->render(i);
+ if ( !p->getSkipRenderFlag() ) { p->render(i); }
}
poolp->endRenderPass(i);
LLVertexBuffer::unbind();
@@ -4005,7 +4232,7 @@ void LLPipeline::renderGeomDeferred(LLCamera& camera)
LLMemType mt_rgd(LLMemType::MTYPE_PIPELINE_RENDER_GEOM_DEFFERRED);
LLFastTimer t(FTM_RENDER_GEOMETRY);
- LLFastTimer t2(FTM_POOLS);
+ LLFastTimer t2(FTM_DEFERRED_POOLS);
LLGLEnable cull(GL_CULL_FACE);
@@ -4047,7 +4274,7 @@ void LLPipeline::renderGeomDeferred(LLCamera& camera)
pool_set_t::iterator iter2 = iter1;
if (hasRenderType(poolp->getType()) && poolp->getNumDeferredPasses() > 0)
{
- LLFastTimer t(FTM_POOLRENDER);
+ LLFastTimer t(FTM_DEFERRED_POOLRENDER);
gGLLastMatrix = NULL;
gGL.loadMatrix(gGLModelView);
@@ -4064,7 +4291,7 @@ void LLPipeline::renderGeomDeferred(LLCamera& camera)
break;
}
- p->renderDeferred(i);
+ if ( !p->getSkipRenderFlag() ) { p->renderDeferred(i); }
}
poolp->endDeferredPass(i);
LLVertexBuffer::unbind();
@@ -4100,7 +4327,7 @@ void LLPipeline::renderGeomDeferred(LLCamera& camera)
void LLPipeline::renderGeomPostDeferred(LLCamera& camera)
{
LLMemType mt_rgpd(LLMemType::MTYPE_PIPELINE_RENDER_GEOM_POST_DEF);
- LLFastTimer t(FTM_POOLS);
+ LLFastTimer t(FTM_POST_DEFERRED_POOLS);
U32 cur_type = 0;
LLGLEnable cull(GL_CULL_FACE);
@@ -4134,7 +4361,7 @@ void LLPipeline::renderGeomPostDeferred(LLCamera& camera)
pool_set_t::iterator iter2 = iter1;
if (hasRenderType(poolp->getType()) && poolp->getNumPostDeferredPasses() > 0)
{
- LLFastTimer t(FTM_POOLRENDER);
+ LLFastTimer t(FTM_POST_DEFERRED_POOLRENDER);
gGLLastMatrix = NULL;
gGL.loadMatrix(gGLModelView);
@@ -4324,7 +4551,7 @@ void LLPipeline::renderPhysicsDisplay()
}
}
- for (LLCullResult::bridge_list_t::const_iterator i = sCull->beginVisibleBridge(); i != sCull->endVisibleBridge(); ++i)
+ for (LLCullResult::bridge_iterator i = sCull->beginVisibleBridge(); i != sCull->endVisibleBridge(); ++i)
{
LLSpatialBridge* bridge = *i;
if (!bridge->isDead() && hasRenderType(bridge->mDrawableType))
@@ -4353,14 +4580,341 @@ void LLPipeline::renderDebug()
assertInitialized();
+ bool hud_only = hasRenderType(LLPipeline::RENDER_TYPE_HUD);
+
+ if (!hud_only )
+ {
+ //Render any navmesh geometry
+ LLPathingLib *llPathingLibInstance = LLPathingLib::getInstance();
+ if ( llPathingLibInstance != NULL )
+ {
+ //character floater renderables
+
+ LLHandle<LLFloaterPathfindingCharacters> pathfindingCharacterHandle = LLFloaterPathfindingCharacters::getInstanceHandle();
+ if ( !pathfindingCharacterHandle.isDead() )
+ {
+ LLFloaterPathfindingCharacters *pathfindingCharacter = pathfindingCharacterHandle.get();
+
+ if ( pathfindingCharacter->getVisible() || gAgentCamera.cameraMouselook() )
+ {
+ if (LLGLSLShader::sNoFixedFunction)
+ {
+ gPathfindingProgram.bind();
+ gPathfindingProgram.uniform1f("tint", 1.f);
+ gPathfindingProgram.uniform1f("ambiance", 1.f);
+ gPathfindingProgram.uniform1f("alpha_scale", 1.f);
+ }
+
+ //Requried character physics capsule render parameters
+ LLUUID id;
+ LLVector3 pos;
+ LLQuaternion rot;
+
+ if ( pathfindingCharacter->isPhysicsCapsuleEnabled( id, pos, rot ) )
+ {
+ if (LLGLSLShader::sNoFixedFunction)
+ {
+ //remove blending artifacts
+ gGL.setColorMask(false, false);
+ llPathingLibInstance->renderSimpleShapeCapsuleID( gGL, id, pos, rot );
+ gGL.setColorMask(true, false);
+ LLGLEnable blend(GL_BLEND);
+ gPathfindingProgram.uniform1f("alpha_scale", 0.90f);
+ llPathingLibInstance->renderSimpleShapeCapsuleID( gGL, id, pos, rot );
+ gPathfindingProgram.bind();
+ }
+ else
+ {
+ llPathingLibInstance->renderSimpleShapeCapsuleID( gGL, id, pos, rot );
+ }
+ }
+ }
+ }
+
+
+ //pathing console renderables
+ LLHandle<LLFloaterPathfindingConsole> pathfindingConsoleHandle = LLFloaterPathfindingConsole::getInstanceHandle();
+ if (!pathfindingConsoleHandle.isDead())
+ {
+ LLFloaterPathfindingConsole *pathfindingConsole = pathfindingConsoleHandle.get();
+
+ if ( pathfindingConsole->getVisible() || gAgentCamera.cameraMouselook() )
+ {
+ F32 ambiance = gSavedSettings.getF32("PathfindingAmbiance");
+
+ if (LLGLSLShader::sNoFixedFunction)
+ {
+ gPathfindingProgram.bind();
+
+ gPathfindingProgram.uniform1f("tint", 1.f);
+ gPathfindingProgram.uniform1f("ambiance", ambiance);
+ gPathfindingProgram.uniform1f("alpha_scale", 1.f);
+ }
+
+ if ( !pathfindingConsole->isRenderWorld() )
+ {
+ const LLColor4 clearColor = gSavedSettings.getColor4("PathfindingNavMeshClear");
+ gGL.setColorMask(true, true);
+ glClearColor(clearColor.mV[0],clearColor.mV[1],clearColor.mV[2],0);
+ glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
+ gGL.setColorMask(true, false);
+ glPolygonMode( GL_FRONT_AND_BACK, GL_FILL );
+ }
+
+ //NavMesh
+ if ( pathfindingConsole->isRenderNavMesh() )
+ {
+ gGL.flush();
+ glLineWidth(2.0f);
+ LLGLEnable cull(GL_CULL_FACE);
+ LLGLDisable blend(GL_BLEND);
+
+ if ( pathfindingConsole->isRenderWorld() )
+ {
+ LLGLEnable blend(GL_BLEND);
+ gPathfindingProgram.uniform1f("alpha_scale", 0.66f);
+ llPathingLibInstance->renderNavMesh();
+ }
+ else
+ {
+ llPathingLibInstance->renderNavMesh();
+ }
+
+ //render edges
+ if (LLGLSLShader::sNoFixedFunction)
+ {
+ gPathfindingNoNormalsProgram.bind();
+ gPathfindingNoNormalsProgram.uniform1f("tint", 1.f);
+ gPathfindingNoNormalsProgram.uniform1f("alpha_scale", 1.f);
+ llPathingLibInstance->renderNavMeshEdges();
+ gPathfindingProgram.bind();
+ }
+ else
+ {
+ llPathingLibInstance->renderNavMeshEdges();
+ }
+
+ gGL.flush();
+ glPolygonMode( GL_FRONT_AND_BACK, GL_FILL );
+ glLineWidth(1.0f);
+ gGL.flush();
+ }
+ //User designated path
+ if ( LLPathfindingPathTool::getInstance()->isRenderPath() )
+ {
+ //The path
+ if (LLGLSLShader::sNoFixedFunction)
+ {
+ gUIProgram.bind();
+ gGL.getTexUnit(0)->bind(LLViewerFetchedTexture::sWhiteImagep);
+ llPathingLibInstance->renderPath();
+ gPathfindingProgram.bind();
+ }
+ else
+ {
+ llPathingLibInstance->renderPath();
+ }
+ //The bookends
+ if (LLGLSLShader::sNoFixedFunction)
+ {
+ //remove blending artifacts
+ gGL.setColorMask(false, false);
+ llPathingLibInstance->renderPathBookend( gGL, LLPathingLib::LLPL_START );
+ llPathingLibInstance->renderPathBookend( gGL, LLPathingLib::LLPL_END );
+
+ gGL.setColorMask(true, false);
+ //render the bookends
+ LLGLEnable blend(GL_BLEND);
+ gPathfindingProgram.uniform1f("alpha_scale", 0.90f);
+ llPathingLibInstance->renderPathBookend( gGL, LLPathingLib::LLPL_START );
+ llPathingLibInstance->renderPathBookend( gGL, LLPathingLib::LLPL_END );
+ gPathfindingProgram.bind();
+ }
+ else
+ {
+ llPathingLibInstance->renderPathBookend( gGL, LLPathingLib::LLPL_START );
+ llPathingLibInstance->renderPathBookend( gGL, LLPathingLib::LLPL_END );
+ }
+
+ }
+
+ if ( pathfindingConsole->isRenderWaterPlane() )
+ {
+ if (LLGLSLShader::sNoFixedFunction)
+ {
+ LLGLEnable blend(GL_BLEND);
+ gPathfindingProgram.uniform1f("alpha_scale", 0.90f);
+ llPathingLibInstance->renderSimpleShapes( gGL, gAgent.getRegion()->getWaterHeight() );
+ }
+ else
+ {
+ llPathingLibInstance->renderSimpleShapes( gGL, gAgent.getRegion()->getWaterHeight() );
+ }
+ }
+ //physics/exclusion shapes
+ if ( pathfindingConsole->isRenderAnyShapes() )
+ {
+ U32 render_order[] = {
+ 1 << LLPathingLib::LLST_ObstacleObjects,
+ 1 << LLPathingLib::LLST_WalkableObjects,
+ 1 << LLPathingLib::LLST_ExclusionPhantoms,
+ 1 << LLPathingLib::LLST_MaterialPhantoms,
+ };
+
+ U32 flags = pathfindingConsole->getRenderShapeFlags();
+
+ for (U32 i = 0; i < 4; i++)
+ {
+ if (!(flags & render_order[i]))
+ {
+ continue;
+ }
+
+ //turn off backface culling for volumes so they are visible when camera is inside volume
+ LLGLDisable cull(i >= 2 ? GL_CULL_FACE : 0);
+
+ gGL.flush();
+ glPolygonMode( GL_FRONT_AND_BACK, GL_FILL );
+
+ //get rid of some z-fighting
+ LLGLEnable polyOffset(GL_POLYGON_OFFSET_FILL);
+ glPolygonOffset(1.0f, 1.0f);
+
+ //render to depth first to avoid blending artifacts
+ gGL.setColorMask(false, false);
+ llPathingLibInstance->renderNavMeshShapesVBO( render_order[i] );
+ gGL.setColorMask(true, false);
+
+ //get rid of some z-fighting
+ glPolygonOffset(0.f, 0.f);
+
+ LLGLEnable blend(GL_BLEND);
+
+ {
+ gPathfindingProgram.uniform1f("ambiance", ambiance);
+
+ { //draw solid overlay
+ LLGLDepthTest depth(GL_TRUE, GL_FALSE, GL_LEQUAL);
+ llPathingLibInstance->renderNavMeshShapesVBO( render_order[i] );
+ gGL.flush();
+ }
+
+ LLGLEnable lineOffset(GL_POLYGON_OFFSET_LINE);
+ glPolygonMode( GL_FRONT_AND_BACK, GL_LINE );
+
+ F32 offset = gSavedSettings.getF32("PathfindingLineOffset");
+
+ if (pathfindingConsole->isRenderXRay())
+ {
+ gPathfindingProgram.uniform1f("tint", gSavedSettings.getF32("PathfindingXRayTint"));
+ gPathfindingProgram.uniform1f("alpha_scale", gSavedSettings.getF32("PathfindingXRayOpacity"));
+ LLGLEnable blend(GL_BLEND);
+ LLGLDepthTest depth(GL_TRUE, GL_FALSE, GL_GREATER);
+
+ glPolygonOffset(offset, -offset);
+
+ if (gSavedSettings.getBOOL("PathfindingXRayWireframe"))
+ { //draw hidden wireframe as darker and less opaque
+ gPathfindingProgram.uniform1f("ambiance", 1.f);
+ llPathingLibInstance->renderNavMeshShapesVBO( render_order[i] );
+ }
+ else
+ {
+ glPolygonMode( GL_FRONT_AND_BACK, GL_FILL );
+ gPathfindingProgram.uniform1f("ambiance", ambiance);
+ llPathingLibInstance->renderNavMeshShapesVBO( render_order[i] );
+ glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
+ }
+ }
+
+ { //draw visible wireframe as brighter, thicker and more opaque
+ glPolygonOffset(offset, offset);
+ gPathfindingProgram.uniform1f("ambiance", 1.f);
+ gPathfindingProgram.uniform1f("tint", 1.f);
+ gPathfindingProgram.uniform1f("alpha_scale", 1.f);
+
+ glLineWidth(gSavedSettings.getF32("PathfindingLineWidth"));
+ LLGLDisable blendOut(GL_BLEND);
+ llPathingLibInstance->renderNavMeshShapesVBO( render_order[i] );
+ gGL.flush();
+ glLineWidth(1.f);
+ }
+
+ glPolygonMode( GL_FRONT_AND_BACK, GL_FILL );
+ }
+ }
+ }
+
+ glPolygonOffset(0.f, 0.f);
+
+ if ( pathfindingConsole->isRenderNavMesh() && pathfindingConsole->isRenderXRay() )
+ { //render navmesh xray
+ F32 ambiance = gSavedSettings.getF32("PathfindingAmbiance");
+
+ LLGLEnable lineOffset(GL_POLYGON_OFFSET_LINE);
+ LLGLEnable polyOffset(GL_POLYGON_OFFSET_FILL);
+
+ F32 offset = gSavedSettings.getF32("PathfindingLineOffset");
+ glPolygonOffset(offset, -offset);
+
+ LLGLEnable blend(GL_BLEND);
+ LLGLDepthTest depth(GL_TRUE, GL_FALSE, GL_GREATER);
+ gGL.flush();
+ glLineWidth(2.0f);
+ LLGLEnable cull(GL_CULL_FACE);
+
+ gPathfindingProgram.uniform1f("tint", gSavedSettings.getF32("PathfindingXRayTint"));
+ gPathfindingProgram.uniform1f("alpha_scale", gSavedSettings.getF32("PathfindingXRayOpacity"));
+
+ if (gSavedSettings.getBOOL("PathfindingXRayWireframe"))
+ { //draw hidden wireframe as darker and less opaque
+ glPolygonMode( GL_FRONT_AND_BACK, GL_LINE );
+ gPathfindingProgram.uniform1f("ambiance", 1.f);
+ llPathingLibInstance->renderNavMesh();
+ glPolygonMode( GL_FRONT_AND_BACK, GL_FILL );
+ }
+ else
+ {
+ gPathfindingProgram.uniform1f("ambiance", ambiance);
+ llPathingLibInstance->renderNavMesh();
+ }
+
+ //render edges
+ if (LLGLSLShader::sNoFixedFunction)
+ {
+ gPathfindingNoNormalsProgram.bind();
+ gPathfindingNoNormalsProgram.uniform1f("tint", gSavedSettings.getF32("PathfindingXRayTint"));
+ gPathfindingNoNormalsProgram.uniform1f("alpha_scale", gSavedSettings.getF32("PathfindingXRayOpacity"));
+ llPathingLibInstance->renderNavMeshEdges();
+ gPathfindingProgram.bind();
+ }
+ else
+ {
+ llPathingLibInstance->renderNavMeshEdges();
+ }
+
+ gGL.flush();
+ glLineWidth(1.0f);
+ }
+
+ glPolygonOffset(0.f, 0.f);
+
+ gGL.flush();
+ if (LLGLSLShader::sNoFixedFunction)
+ {
+ gPathfindingProgram.unbind();
+ }
+ }
+ }
+ }
+ }
+
gGL.color4f(1,1,1,1);
gGLLastMatrix = NULL;
gGL.loadMatrix(gGLModelView);
gGL.setColorMask(true, false);
- bool hud_only = hasRenderType(LLPipeline::RENDER_TYPE_HUD);
-
if (!hud_only && !mDebugBlips.empty())
{ //render debug blips
@@ -4419,7 +4973,7 @@ void LLPipeline::renderDebug()
}
}
- for (LLCullResult::bridge_list_t::const_iterator i = sCull->beginVisibleBridge(); i != sCull->endVisibleBridge(); ++i)
+ for (LLCullResult::bridge_iterator i = sCull->beginVisibleBridge(); i != sCull->endVisibleBridge(); ++i)
{
LLSpatialBridge* bridge = *i;
if (!bridge->isDead() && hasRenderType(bridge->mDrawableType))
@@ -4671,8 +5225,11 @@ void LLPipeline::renderDebug()
}
}
+static LLFastTimer::DeclareTimer FTM_REBUILD_POOLS("Rebuild Pools");
+
void LLPipeline::rebuildPools()
{
+ LLFastTimer t(FTM_REBUILD_POOLS);
LLMemType mt(LLMemType::MTYPE_PIPELINE_REBUILD_POOLS);
assertInitialized();
@@ -6219,7 +6776,10 @@ void LLPipeline::resetVertexBuffers(LLDrawable* drawable)
for (S32 i = 0; i < drawable->getNumFaces(); i++)
{
LLFace* facep = drawable->getFace(i);
- facep->clearVertexBuffer();
+ if (facep)
+ {
+ facep->clearVertexBuffer();
+ }
}
}
@@ -6228,15 +6788,20 @@ void LLPipeline::resetVertexBuffers()
mResetVertexBuffers = true;
}
+static LLFastTimer::DeclareTimer FTM_RESET_VB("Reset VB");
+
void LLPipeline::doResetVertexBuffers()
{
if (!mResetVertexBuffers)
{
return;
}
-
+
+ LLFastTimer t(FTM_RESET_VB);
mResetVertexBuffers = false;
+ mCubeVB = NULL;
+
for (LLWorld::region_list_t::const_iterator iter = LLWorld::getInstance()->getRegionList().begin();
iter != LLWorld::getInstance()->getRegionList().end(); ++iter)
{
@@ -6255,11 +6820,21 @@ void LLPipeline::doResetVertexBuffers()
gSky.resetVertexBuffers();
+ LLVOPartGroup::destroyGL();
+
+ if ( LLPathingLib::getInstance() )
+ {
+ LLPathingLib::getInstance()->cleanupVBOManager();
+ }
+ LLVOPartGroup::destroyGL();
+
LLVertexBuffer::cleanupClass();
//delete all name pool caches
LLGLNamePool::cleanupPools();
+
+
if (LLVertexBuffer::sGLCount > 0)
{
llwarns << "VBO wipe failed -- " << LLVertexBuffer::sGLCount << " buffers remaining." << llendl;
@@ -6279,6 +6854,8 @@ void LLPipeline::doResetVertexBuffers()
LLPipeline::sTextureBindTest = gSavedSettings.getBOOL("RenderDebugTextureBind");
LLVertexBuffer::initClass(LLVertexBuffer::sEnableVBOs, LLVertexBuffer::sDisableVBOMapping);
+
+ LLVOPartGroup::restoreGL();
}
void LLPipeline::renderObjects(U32 type, U32 mask, BOOL texture, BOOL batch_texture)
@@ -6579,15 +7156,8 @@ void LLPipeline::renderBloom(BOOL for_snapshot, F32 zoom_factor, int subfield)
}
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();
- }
+ //focus on alt-zoom target
+ focus_point = LLVector3(gAgentCamera.getFocusGlobal()-gAgent.getRegion()->getOriginGlobal());
}
}
@@ -7088,7 +7658,7 @@ void LLPipeline::bindDeferredShader(LLGLSLShader& shader, U32 light_index, U32 n
for (U32 i = 0; i < 4; i++)
{
- channel = shader.enableTexture(LLShaderMgr::DEFERRED_SHADOW0+i, LLTexUnit::TT_RECT_TEXTURE);
+ channel = shader.enableTexture(LLShaderMgr::DEFERRED_SHADOW0+i, LLTexUnit::TT_TEXTURE);
stop_glerror();
if (channel > -1)
{
@@ -7098,8 +7668,8 @@ void LLPipeline::bindDeferredShader(LLGLSLShader& shader, U32 light_index, U32 n
gGL.getTexUnit(channel)->setTextureAddressMode(LLTexUnit::TAM_CLAMP);
stop_glerror();
- glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_COMPARE_MODE_ARB, GL_COMPARE_R_TO_TEXTURE_ARB);
- glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_COMPARE_FUNC_ARB, GL_LEQUAL);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE_ARB, GL_COMPARE_R_TO_TEXTURE_ARB);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_FUNC_ARB, GL_LEQUAL);
stop_glerror();
}
}
@@ -7179,13 +7749,13 @@ void LLPipeline::bindDeferredShader(LLGLSLShader& shader, U32 light_index, U32 n
matrix_nondiag, matrix_nondiag, matrix_diag};
shader.uniformMatrix3fv(LLShaderMgr::DEFERRED_SSAO_EFFECT_MAT, 1, GL_FALSE, ssao_effect_mat);
- F32 shadow_offset_error = 1.f + RenderShadowOffsetError * fabsf(LLViewerCamera::getInstance()->getOrigin().mV[2]);
- F32 shadow_bias_error = 1.f + RenderShadowBiasError * fabsf(LLViewerCamera::getInstance()->getOrigin().mV[2]);
+ //F32 shadow_offset_error = 1.f + RenderShadowOffsetError * fabsf(LLViewerCamera::getInstance()->getOrigin().mV[2]);
+ F32 shadow_bias_error = RenderShadowBiasError * fabsf(LLViewerCamera::getInstance()->getOrigin().mV[2])/3000.f;
shader.uniform2f(LLShaderMgr::DEFERRED_SCREEN_RES, mDeferredScreen.getWidth(), mDeferredScreen.getHeight());
shader.uniform1f(LLShaderMgr::DEFERRED_NEAR_CLIP, LLViewerCamera::getInstance()->getNear()*2.f);
- shader.uniform1f (LLShaderMgr::DEFERRED_SHADOW_OFFSET, RenderShadowOffset*shadow_offset_error);
- shader.uniform1f(LLShaderMgr::DEFERRED_SHADOW_BIAS, RenderShadowBias*shadow_bias_error);
+ shader.uniform1f (LLShaderMgr::DEFERRED_SHADOW_OFFSET, RenderShadowOffset); //*shadow_offset_error);
+ shader.uniform1f(LLShaderMgr::DEFERRED_SHADOW_BIAS, RenderShadowBias+shadow_bias_error);
shader.uniform1f(LLShaderMgr::DEFERRED_SPOT_SHADOW_OFFSET, RenderSpotShadowOffset);
shader.uniform1f(LLShaderMgr::DEFERRED_SPOT_SHADOW_BIAS, RenderSpotShadowBias);
@@ -7466,12 +8036,17 @@ void LLPipeline::renderDeferredLighting()
std::list<LLVector4> light_colors;
LLVertexBuffer::unbind();
- LLVector4a* v = (LLVector4a*) vert.get();
{
bindDeferredShader(gDeferredLightProgram);
- mDeferredVB->setBuffer(LLVertexBuffer::MAP_VERTEX);
+
+ if (mCubeVB.isNull())
+ {
+ mCubeVB = ll_create_cube_vb(LLVertexBuffer::MAP_VERTEX, GL_STATIC_DRAW_ARB);
+ }
+ mCubeVB->setBuffer(LLVertexBuffer::MAP_VERTEX);
+
LLGLDepthTest depth(GL_TRUE, GL_FALSE);
for (LLDrawable::drawable_set_t::iterator iter = mLights.begin(); iter != mLights.end(); ++iter)
{
@@ -7517,25 +8092,7 @@ void LLPipeline::renderDeferredLighting()
}
sVisibleLightCount++;
-
- glh::vec3f tc(c);
- mat.mult_matrix_vec(tc);
-
- //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
- mDeferredVB->getVertexStrider(vert);
- v[0].set(c[0]-s,c[1]-s,c[2]-s); // 0 - 0000
- v[1].set(c[0]-s,c[1]-s,c[2]+s); // 1 - 0001
- v[2].set(c[0]-s,c[1]+s,c[2]-s); // 2 - 0010
- v[3].set(c[0]-s,c[1]+s,c[2]+s); // 3 - 0011
-
- v[4].set(c[0]+s,c[1]-s,c[2]-s); // 4 - 0100
- v[5].set(c[0]+s,c[1]-s,c[2]+s); // 5 - 0101
- v[6].set(c[0]+s,c[1]+s,c[2]-s); // 6 - 0110
- v[7].set(c[0]+s,c[1]+s,c[2]+s); // 7 - 0111
-
+
if (camera->getOrigin().mV[0] > c[0] + s + 0.2f ||
camera->getOrigin().mV[0] < c[0] - s - 0.2f ||
camera->getOrigin().mV[1] > c[1] + s + 0.2f ||
@@ -7553,16 +8110,13 @@ void LLPipeline::renderDeferredLighting()
}
LLFastTimer ftm(FTM_LOCAL_LIGHTS);
- //glTexCoord4f(tc.v[0], tc.v[1], tc.v[2], s*s);
- gDeferredLightProgram.uniform3fv(LLShaderMgr::LIGHT_CENTER, 1, tc.v);
+ gDeferredLightProgram.uniform3fv(LLShaderMgr::LIGHT_CENTER, 1, c);
gDeferredLightProgram.uniform1f(LLShaderMgr::LIGHT_SIZE, s*s);
gDeferredLightProgram.uniform3fv(LLShaderMgr::DIFFUSE_COLOR, 1, col.mV);
gDeferredLightProgram.uniform1f(LLShaderMgr::LIGHT_FALLOFF, volume->getLightFalloff()*0.5f);
- //gGL.diffuseColor4f(col.mV[0], col.mV[1], col.mV[2], volume->getLightFalloff()*0.5f);
gGL.syncMatrices();
- mDeferredVB->setBuffer(LLVertexBuffer::MAP_VERTEX);
- glDrawRangeElements(GL_TRIANGLE_FAN, 0, 7, 8,
- GL_UNSIGNED_SHORT, get_box_fan_indices_ptr(camera, center));
+
+ mCubeVB->drawRange(LLRender::TRIANGLE_FAN, 0, 7, 8, get_box_fan_indices(camera, center));
stop_glerror();
}
}
@@ -7575,6 +8129,9 @@ void LLPipeline::renderDeferredLighting()
continue;
}
+ glh::vec3f tc(c);
+ mat.mult_matrix_vec(tc);
+
fullscreen_lights.push_back(LLVector4(tc.v[0], tc.v[1], tc.v[2], s*s));
light_colors.push_back(LLVector4(col.mV[0], col.mV[1], col.mV[2], volume->getLightFalloff()*0.5f));
}
@@ -7587,7 +8144,7 @@ void LLPipeline::renderDeferredLighting()
LLGLDepthTest depth(GL_TRUE, GL_FALSE);
bindDeferredShader(gDeferredSpotLightProgram);
- mDeferredVB->setBuffer(LLVertexBuffer::MAP_VERTEX);
+ mCubeVB->setBuffer(LLVertexBuffer::MAP_VERTEX);
gDeferredSpotLightProgram.enableTexture(LLShaderMgr::DEFERRED_PROJECTION);
@@ -7605,36 +8162,17 @@ void LLPipeline::renderDeferredLighting()
sVisibleLightCount++;
- glh::vec3f tc(c);
- mat.mult_matrix_vec(tc);
-
setupSpotLight(gDeferredSpotLightProgram, drawablep);
LLColor3 col = volume->getLightColor();
- //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
- mDeferredVB->getVertexStrider(vert);
- v[0].set(c[0]-s,c[1]-s,c[2]-s); // 0 - 0000
- v[1].set(c[0]-s,c[1]-s,c[2]+s); // 1 - 0001
- v[2].set(c[0]-s,c[1]+s,c[2]-s); // 2 - 0010
- v[3].set(c[0]-s,c[1]+s,c[2]+s); // 3 - 0011
-
- v[4].set(c[0]+s,c[1]-s,c[2]-s); // 4 - 0100
- v[5].set(c[0]+s,c[1]-s,c[2]+s); // 5 - 0101
- v[6].set(c[0]+s,c[1]+s,c[2]-s); // 6 - 0110
- v[7].set(c[0]+s,c[1]+s,c[2]+s); // 7 - 0111
-
- gDeferredSpotLightProgram.uniform3fv(LLShaderMgr::LIGHT_CENTER, 1, tc.v);
+ gDeferredSpotLightProgram.uniform3fv(LLShaderMgr::LIGHT_CENTER, 1, c);
gDeferredSpotLightProgram.uniform1f(LLShaderMgr::LIGHT_SIZE, s*s);
gDeferredSpotLightProgram.uniform3fv(LLShaderMgr::DIFFUSE_COLOR, 1, col.mV);
gDeferredSpotLightProgram.uniform1f(LLShaderMgr::LIGHT_FALLOFF, volume->getLightFalloff()*0.5f);
gGL.syncMatrices();
- mDeferredVB->setBuffer(LLVertexBuffer::MAP_VERTEX);
- glDrawRangeElements(GL_TRIANGLE_FAN, 0, 7, 8,
- GL_UNSIGNED_SHORT, get_box_fan_indices_ptr(camera, center));
+
+ mCubeVB->drawRange(LLRender::TRIANGLE_FAN, 0, 7, 8, get_box_fan_indices(camera, center));
}
gDeferredSpotLightProgram.disableTexture(LLShaderMgr::DEFERRED_PROJECTION);
unbindDeferredShader(gDeferredSpotLightProgram);
@@ -7666,8 +8204,6 @@ void LLPipeline::renderDeferredLighting()
LLVector4 light[max_count];
LLVector4 col[max_count];
-// glVertexPointer(2, GL_FLOAT, 0, vert);
-
F32 far_z = 0.f;
while (!fullscreen_lights.empty())
@@ -7943,9 +8479,9 @@ void LLPipeline::unbindDeferredShader(LLGLSLShader &shader)
for (U32 i = 0; i < 4; i++)
{
- if (shader.disableTexture(LLShaderMgr::DEFERRED_SHADOW0+i, LLTexUnit::TT_RECT_TEXTURE) > -1)
+ if (shader.disableTexture(LLShaderMgr::DEFERRED_SHADOW0+i) > -1)
{
- glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_COMPARE_MODE_ARB, GL_NONE);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE_ARB, GL_NONE);
}
}
@@ -8196,6 +8732,7 @@ void LLPipeline::generateWaterReflection(LLCamera& camera_in)
gGL.setColorMask(true, false);
renderGeom(camera);
+
}
LLPipeline::sUnderWaterRender = FALSE;
@@ -8324,7 +8861,7 @@ void LLPipeline::renderShadow(glh::matrix4f& view, glh::matrix4f& proj, LLCamera
if (use_shader)
{
- gDeferredShadowProgram.bind();
+ gDeferredShadowCubeProgram.bind();
}
updateCull(shadow_cam, result);
@@ -8341,17 +8878,10 @@ void LLPipeline::renderShadow(glh::matrix4f& view, glh::matrix4f& proj, LLCamera
stop_glerror();
gGLLastMatrix = NULL;
- {
- //LLGLDepthTest depth(GL_TRUE);
- //glClear(GL_DEPTH_BUFFER_BIT);
- }
-
gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
stop_glerror();
- //glCullFace(GL_FRONT);
-
LLVertexBuffer::unbind();
{
@@ -8359,11 +8889,16 @@ void LLPipeline::renderShadow(glh::matrix4f& view, glh::matrix4f& proj, LLCamera
{ //occlusion program is general purpose depth-only no-textures
gOcclusionProgram.bind();
}
+ else
+ {
+ gDeferredShadowProgram.bind();
+ }
gGL.diffuseColor4f(1,1,1,1);
gGL.setColorMask(false, false);
LLFastTimer ftm(FTM_SHADOW_SIMPLE);
+
gGL.getTexUnit(0)->disable();
for (U32 i = 0; i < sizeof(types)/sizeof(U32); ++i)
{
@@ -8408,7 +8943,7 @@ void LLPipeline::renderShadow(glh::matrix4f& view, glh::matrix4f& proj, LLCamera
//glCullFace(GL_BACK);
- gDeferredShadowProgram.bind();
+ gDeferredShadowCubeProgram.bind();
gGLLastMatrix = NULL;
gGL.loadMatrix(gGLModelView);
doOcclusion(shadow_cam);
@@ -8683,6 +9218,8 @@ void LLPipeline::generateHighlight(LLCamera& camera)
}
+static LLFastTimer::DeclareTimer FTM_GEN_SUN_SHADOW("Gen Sun Shadow");
+
void LLPipeline::generateSunShadow(LLCamera& camera)
{
if (!sRenderDeferred || RenderShadowDetail <= 0)
@@ -8690,6 +9227,8 @@ void LLPipeline::generateSunShadow(LLCamera& camera)
return;
}
+ LLFastTimer t(FTM_GEN_SUN_SHADOW);
+
BOOL skip_avatar_update = FALSE;
if (!isAgentAvatarValid() || gAgentCamera.getCameraAnimating() || gAgentCamera.getCameraMode() != CAMERA_MODE_MOUSELOOK || !LLVOAvatar::sVisibleInFirstPerson)
{
@@ -9439,7 +9978,7 @@ void LLPipeline::generateSunShadow(LLCamera& camera)
void LLPipeline::renderGroups(LLRenderPass* pass, U32 type, U32 mask, BOOL texture)
{
- for (LLCullResult::sg_list_t::iterator i = sCull->beginVisibleGroups(); i != sCull->endVisibleGroups(); ++i)
+ for (LLCullResult::sg_iterator i = sCull->beginVisibleGroups(); i != sCull->endVisibleGroups(); ++i)
{
LLSpatialGroup* group = *i;
if (!group->isDead() &&
@@ -9452,6 +9991,12 @@ void LLPipeline::renderGroups(LLRenderPass* pass, U32 type, U32 mask, BOOL textu
}
}
+static LLFastTimer::DeclareTimer FTM_IMPOSTOR_MARK_VISIBLE("Impostor Mark Visible");
+static LLFastTimer::DeclareTimer FTM_IMPOSTOR_SETUP("Impostor Setup");
+static LLFastTimer::DeclareTimer FTM_IMPOSTOR_BACKGROUND("Impostor Background");
+static LLFastTimer::DeclareTimer FTM_IMPOSTOR_ALLOCATE("Impostor Allocate");
+static LLFastTimer::DeclareTimer FTM_IMPOSTOR_RESIZE("Impostor Resize");
+
void LLPipeline::generateImpostor(LLVOAvatar* avatar)
{
LLMemType mt_gi(LLMemType::MTYPE_PIPELINE_GENERATE_IMPOSTOR);
@@ -9507,101 +10052,114 @@ void LLPipeline::generateImpostor(LLVOAvatar* avatar)
sImpostorRender = TRUE;
LLViewerCamera* viewer_camera = LLViewerCamera::getInstance();
- markVisible(avatar->mDrawable, *viewer_camera);
- LLVOAvatar::sUseImpostors = FALSE;
- LLVOAvatar::attachment_map_t::iterator iter;
- for (iter = avatar->mAttachmentPoints.begin();
- iter != avatar->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)
+ LLFastTimer t(FTM_IMPOSTOR_MARK_VISIBLE);
+ markVisible(avatar->mDrawable, *viewer_camera);
+ LLVOAvatar::sUseImpostors = FALSE;
+
+ LLVOAvatar::attachment_map_t::iterator iter;
+ for (iter = avatar->mAttachmentPoints.begin();
+ iter != avatar->mAttachmentPoints.end();
+ ++iter)
{
- if (LLViewerObject* attached_object = (*attachment_iter))
+ LLViewerJointAttachment *attachment = iter->second;
+ for (LLViewerJointAttachment::attachedobjs_vec_t::iterator attachment_iter = attachment->mAttachedObjects.begin();
+ attachment_iter != attachment->mAttachedObjects.end();
+ ++attachment_iter)
{
- markVisible(attached_object->mDrawable->getSpatialBridge(), *viewer_camera);
+ if (LLViewerObject* attached_object = (*attachment_iter))
+ {
+ markVisible(attached_object->mDrawable->getSpatialBridge(), *viewer_camera);
+ }
}
}
}
stateSort(*LLViewerCamera::getInstance(), result);
- const LLVector4a* ext = avatar->mDrawable->getSpatialExtents();
- LLVector3 pos(avatar->getRenderPosition()+avatar->getImpostorOffset());
-
LLCamera camera = *viewer_camera;
-
- camera.lookAt(viewer_camera->getOrigin(), pos, viewer_camera->getUpAxis());
-
LLVector2 tdim;
+ U32 resY = 0;
+ U32 resX = 0;
+ {
+ LLFastTimer t(FTM_IMPOSTOR_SETUP);
+ const LLVector4a* ext = avatar->mDrawable->getSpatialExtents();
+ LLVector3 pos(avatar->getRenderPosition()+avatar->getImpostorOffset());
- LLVector4a half_height;
- half_height.setSub(ext[1], ext[0]);
- half_height.mul(0.5f);
+ camera.lookAt(viewer_camera->getOrigin(), pos, viewer_camera->getUpAxis());
+
+ 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();
+ LLVector4a left;
+ left.load3(camera.getLeftAxis().mV);
+ left.mul(left);
+ left.normalize3fast();
- LLVector4a up;
- up.load3(camera.getUpAxis().mV);
- up.mul(up);
- up.normalize3fast();
+ LLVector4a up;
+ up.load3(camera.getUpAxis().mV);
+ up.mul(up);
+ up.normalize3fast();
- tdim.mV[0] = fabsf(half_height.dot3(left).getF32());
- tdim.mV[1] = fabsf(half_height.dot3(up).getF32());
+ tdim.mV[0] = fabsf(half_height.dot3(left).getF32());
+ tdim.mV[1] = fabsf(half_height.dot3(up).getF32());
- gGL.matrixMode(LLRender::MM_PROJECTION);
- gGL.pushMatrix();
+ gGL.matrixMode(LLRender::MM_PROJECTION);
+ gGL.pushMatrix();
- F32 distance = (pos-camera.getOrigin()).length();
- F32 fov = atanf(tdim.mV[1]/distance)*2.f*RAD_TO_DEG;
- F32 aspect = tdim.mV[0]/tdim.mV[1];
- glh::matrix4f persp = gl_perspective(fov, aspect, 1.f, 256.f);
- glh_set_current_projection(persp);
- gGL.loadMatrix(persp.m);
+ F32 distance = (pos-camera.getOrigin()).length();
+ F32 fov = atanf(tdim.mV[1]/distance)*2.f*RAD_TO_DEG;
+ F32 aspect = tdim.mV[0]/tdim.mV[1];
+ glh::matrix4f persp = gl_perspective(fov, aspect, 1.f, 256.f);
+ glh_set_current_projection(persp);
+ gGL.loadMatrix(persp.m);
- gGL.matrixMode(LLRender::MM_MODELVIEW);
- gGL.pushMatrix();
- glh::matrix4f mat;
- camera.getOpenGLTransform(mat.m);
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
+ gGL.pushMatrix();
+ glh::matrix4f mat;
+ camera.getOpenGLTransform(mat.m);
- mat = glh::matrix4f((GLfloat*) OGL_TO_CFR_ROTATION) * mat;
+ mat = glh::matrix4f((GLfloat*) OGL_TO_CFR_ROTATION) * mat;
- gGL.loadMatrix(mat.m);
- glh_set_current_modelview(mat);
+ gGL.loadMatrix(mat.m);
+ glh_set_current_modelview(mat);
- glClearColor(0.0f,0.0f,0.0f,0.0f);
- gGL.setColorMask(true, true);
+ glClearColor(0.0f,0.0f,0.0f,0.0f);
+ gGL.setColorMask(true, true);
- // get the number of pixels per angle
- F32 pa = gViewerWindow->getWindowHeightRaw() / (RAD_TO_DEG * viewer_camera->getView());
+ // get the number of pixels per angle
+ F32 pa = gViewerWindow->getWindowHeightRaw() / (RAD_TO_DEG * viewer_camera->getView());
- //get resolution based on angle width and height of impostor (double desired resolution to prevent aliasing)
- U32 resY = llmin(nhpo2((U32) (fov*pa)), (U32) 512);
- U32 resX = llmin(nhpo2((U32) (atanf(tdim.mV[0]/distance)*2.f*RAD_TO_DEG*pa)), (U32) 512);
+ //get resolution based on angle width and height of impostor (double desired resolution to prevent aliasing)
+ resY = llmin(nhpo2((U32) (fov*pa)), (U32) 512);
+ resX = llmin(nhpo2((U32) (atanf(tdim.mV[0]/distance)*2.f*RAD_TO_DEG*pa)), (U32) 512);
- if (!avatar->mImpostor.isComplete() || resX != avatar->mImpostor.getWidth() ||
- resY != avatar->mImpostor.getHeight())
- {
- avatar->mImpostor.allocate(resX,resY,GL_RGBA,TRUE,FALSE);
+ if (!avatar->mImpostor.isComplete())
+ {
+ LLFastTimer t(FTM_IMPOSTOR_ALLOCATE);
+ avatar->mImpostor.allocate(resX,resY,GL_RGBA,TRUE,FALSE);
+
+ if (LLPipeline::sRenderDeferred)
+ {
+ addDeferredAttachments(avatar->mImpostor);
+ }
- if (LLPipeline::sRenderDeferred)
+ gGL.getTexUnit(0)->bind(&avatar->mImpostor);
+ gGL.getTexUnit(0)->setTextureFilteringOption(LLTexUnit::TFO_POINT);
+ gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
+ }
+ else if(resX != avatar->mImpostor.getWidth() ||
+ resY != avatar->mImpostor.getHeight())
{
- addDeferredAttachments(avatar->mImpostor);
+ LLFastTimer t(FTM_IMPOSTOR_RESIZE);
+ avatar->mImpostor.resize(resX,resY,GL_RGBA);
}
-
- gGL.getTexUnit(0)->bind(&avatar->mImpostor);
- gGL.getTexUnit(0)->setTextureFilteringOption(LLTexUnit::TFO_POINT);
- gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
- }
- avatar->mImpostor.bindTarget();
+ avatar->mImpostor.bindTarget();
+ }
if (LLPipeline::sRenderDeferred)
{
@@ -9618,6 +10176,7 @@ void LLPipeline::generateImpostor(LLVOAvatar* avatar)
}
{ //create alpha mask based on depth buffer (grey out if muted)
+ LLFastTimer t(FTM_IMPOSTOR_BACKGROUND);
if (LLPipeline::sRenderDeferred)
{
GLuint buff = GL_COLOR_ATTACHMENT0;
@@ -9703,22 +10262,22 @@ BOOL LLPipeline::hasRenderBatches(const U32 type) const
return sCull->getRenderMapSize(type) > 0;
}
-LLCullResult::drawinfo_list_t::iterator LLPipeline::beginRenderMap(U32 type)
+LLCullResult::drawinfo_iterator LLPipeline::beginRenderMap(U32 type)
{
return sCull->beginRenderMap(type);
}
-LLCullResult::drawinfo_list_t::iterator LLPipeline::endRenderMap(U32 type)
+LLCullResult::drawinfo_iterator LLPipeline::endRenderMap(U32 type)
{
return sCull->endRenderMap(type);
}
-LLCullResult::sg_list_t::iterator LLPipeline::beginAlphaGroups()
+LLCullResult::sg_iterator LLPipeline::beginAlphaGroups()
{
return sCull->beginAlphaGroups();
}
-LLCullResult::sg_list_t::iterator LLPipeline::endAlphaGroups()
+LLCullResult::sg_iterator LLPipeline::endAlphaGroups()
{
return sCull->endAlphaGroups();
}
@@ -9849,3 +10408,143 @@ void LLPipeline::addDebugBlip(const LLVector3& position, const LLColor4& color)
mDebugBlips.push_back(blip);
}
+void LLPipeline::hidePermanentObjects( std::vector<U32>& restoreList )
+{
+ //This method is used to hide any vo's from the object list that may have
+ //the permanent flag set.
+
+ U32 objCnt = gObjectList.getNumObjects();
+ for (U32 i = 0; i < objCnt; ++i)
+ {
+ LLViewerObject* pObject = gObjectList.getObject(i);
+ if ( pObject && pObject->flagObjectPermanent() )
+ {
+ LLDrawable *pDrawable = pObject->mDrawable;
+
+ if ( pDrawable )
+ {
+ restoreList.push_back( i );
+ hideDrawable( pDrawable );
+ }
+ }
+ }
+
+ skipRenderingOfTerrain( true );
+}
+
+void LLPipeline::restorePermanentObjects( const std::vector<U32>& restoreList )
+{
+ //This method is used to restore(unhide) any vo's from the object list that may have
+ //been hidden because their permanency flag was set.
+
+ std::vector<U32>::const_iterator itCurrent = restoreList.begin();
+ std::vector<U32>::const_iterator itEnd = restoreList.end();
+
+ U32 objCnt = gObjectList.getNumObjects();
+
+ while ( itCurrent != itEnd )
+ {
+ U32 index = *itCurrent;
+ LLViewerObject* pObject = NULL;
+ if ( index < objCnt )
+ {
+ pObject = gObjectList.getObject( index );
+ }
+ if ( pObject )
+ {
+ LLDrawable *pDrawable = pObject->mDrawable;
+ if ( pDrawable )
+ {
+ pDrawable->clearState( LLDrawable::FORCE_INVISIBLE );
+ unhideDrawable( pDrawable );
+ }
+ }
+ ++itCurrent;
+ }
+
+ skipRenderingOfTerrain( false );
+}
+
+void LLPipeline::skipRenderingOfTerrain( BOOL flag )
+{
+ pool_set_t::iterator iter = mPools.begin();
+ while ( iter != mPools.end() )
+ {
+ LLDrawPool* pPool = *iter;
+ U32 poolType = pPool->getType();
+ if ( hasRenderType( pPool->getType() ) && poolType == LLDrawPool::POOL_TERRAIN )
+ {
+ pPool->setSkipRenderFlag( flag );
+ }
+ ++iter;
+ }
+}
+
+void LLPipeline::hideObject( const LLUUID& id )
+{
+ LLViewerObject *pVO = gObjectList.findObject( id );
+
+ if ( pVO )
+ {
+ LLDrawable *pDrawable = pVO->mDrawable;
+
+ if ( pDrawable )
+ {
+ hideDrawable( pDrawable );
+ }
+ }
+}
+
+void LLPipeline::hideDrawable( LLDrawable *pDrawable )
+{
+ pDrawable->setState( LLDrawable::FORCE_INVISIBLE );
+ markRebuild( pDrawable, LLDrawable::REBUILD_ALL, TRUE );
+ //hide the children
+ LLViewerObject::const_child_list_t& child_list = pDrawable->getVObj()->getChildren();
+ for ( LLViewerObject::child_list_t::const_iterator iter = child_list.begin();
+ iter != child_list.end(); iter++ )
+ {
+ LLViewerObject* child = *iter;
+ LLDrawable* drawable = child->mDrawable;
+ if ( drawable )
+ {
+ drawable->setState( LLDrawable::FORCE_INVISIBLE );
+ markRebuild( drawable, LLDrawable::REBUILD_ALL, TRUE );
+ }
+ }
+}
+void LLPipeline::unhideDrawable( LLDrawable *pDrawable )
+{
+ pDrawable->clearState( LLDrawable::FORCE_INVISIBLE );
+ markRebuild( pDrawable, LLDrawable::REBUILD_ALL, TRUE );
+ //restore children
+ LLViewerObject::const_child_list_t& child_list = pDrawable->getVObj()->getChildren();
+ for ( LLViewerObject::child_list_t::const_iterator iter = child_list.begin();
+ iter != child_list.end(); iter++)
+ {
+ LLViewerObject* child = *iter;
+ LLDrawable* drawable = child->mDrawable;
+ if ( drawable )
+ {
+ drawable->clearState( LLDrawable::FORCE_INVISIBLE );
+ markRebuild( drawable, LLDrawable::REBUILD_ALL, TRUE );
+ }
+ }
+}
+void LLPipeline::restoreHiddenObject( const LLUUID& id )
+{
+ LLViewerObject *pVO = gObjectList.findObject( id );
+
+ if ( pVO )
+ {
+ LLDrawable *pDrawable = pVO->mDrawable;
+ if ( pDrawable )
+ {
+ unhideDrawable( pDrawable );
+ }
+ }
+}
+
+
+
+
diff --git a/indra/newview/pipeline.h b/indra/newview/pipeline.h
index 5c623fc9f2..fd2a1e06cd 100644
--- a/indra/newview/pipeline.h
+++ b/indra/newview/pipeline.h
@@ -151,6 +151,8 @@ public:
void unlinkDrawable(LLDrawable*);
+ static void removeMutedAVsLights(LLVOAvatar*);
+
// Object related methods
void markVisible(LLDrawable *drawablep, LLCamera& camera);
void markOccluder(LLSpatialGroup* group);
@@ -163,6 +165,7 @@ public:
void markRebuild(LLSpatialGroup* group, BOOL priority = FALSE);
void markRebuild(LLDrawable *drawablep, LLDrawable::EDrawableFlags flag = LLDrawable::REBUILD_ALL, BOOL priority = FALSE);
void markPartitionMove(LLDrawable* drawablep);
+ void markMeshDirty(LLSpatialGroup* group);
//get the object between start and end that's closest to start.
LLViewerObject* lineSegmentIntersectInWorld(const LLVector3& start, const LLVector3& end,
@@ -222,6 +225,7 @@ public:
void updateGL();
void rebuildPriorityGroups();
void rebuildGroups();
+ void clearRebuildGroups();
//calculate pixel area of given box from vantage point of given camera
static F32 calcPixelArea(LLVector3 center, LLVector3 size, LLCamera& camera);
@@ -293,10 +297,10 @@ public:
void setLight(LLDrawable *drawablep, BOOL is_light);
BOOL hasRenderBatches(const U32 type) const;
- LLCullResult::drawinfo_list_t::iterator beginRenderMap(U32 type);
- LLCullResult::drawinfo_list_t::iterator endRenderMap(U32 type);
- LLCullResult::sg_list_t::iterator beginAlphaGroups();
- LLCullResult::sg_list_t::iterator endAlphaGroups();
+ LLCullResult::drawinfo_iterator beginRenderMap(U32 type);
+ LLCullResult::drawinfo_iterator endRenderMap(U32 type);
+ LLCullResult::sg_iterator beginAlphaGroups();
+ LLCullResult::sg_iterator endAlphaGroups();
void addTrianglesDrawn(S32 index_count, U32 render_type = LLRender::TRIANGLES);
@@ -368,6 +372,12 @@ public:
void addDebugBlip(const LLVector3& position, const LLColor4& color);
+ void hidePermanentObjects( std::vector<U32>& restoreList );
+ void restorePermanentObjects( const std::vector<U32>& restoreList );
+ void skipRenderingOfTerrain( BOOL flag );
+ void hideObject( const LLUUID& id );
+ void restoreHiddenObject( const LLUUID& id );
+
private:
void unloadShaders();
void addToQuickLookup( LLDrawPool* new_poolp );
@@ -375,7 +385,9 @@ private:
BOOL updateDrawableGeom(LLDrawable* drawable, BOOL priority);
void assertInitializedDoError();
bool assertInitialized() { const bool is_init = isInit(); if (!is_init) assertInitializedDoError(); return is_init; };
-
+ void connectRefreshCachedSettingsSafe(const std::string name);
+ void hideDrawable( LLDrawable *pDrawable );
+ void unhideDrawable( LLDrawable *pDrawable );
public:
enum {GPU_CLASS_MAX = 3 };
@@ -544,6 +556,9 @@ public:
//utility buffer for rendering post effects, gets abused by renderDeferredLighting
LLPointer<LLVertexBuffer> mDeferredVB;
+ //utility buffer for rendering cubes, 8 vertices are corners of a cube [-1, 1]
+ LLPointer<LLVertexBuffer> mCubeVB;
+
//sun shadow map
LLRenderTarget mShadow[6];
std::vector<LLVector3> mShadowFrustPoints[4];
@@ -595,6 +610,7 @@ public:
BOOL mVertexShadersEnabled;
S32 mVertexShadersLoaded; // 0 = no, 1 = yes, -1 = failed
+ U32 mTransformFeedbackPrimitives; //number of primitives expected to be generated by transform feedback
protected:
BOOL mRenderTypeEnabled[NUM_RENDER_TYPES];
std::stack<std::string> mRenderTypeEnableStack;
@@ -652,6 +668,9 @@ protected:
LLSpatialGroup::sg_vector_t mGroupQ1; //priority
LLSpatialGroup::sg_vector_t mGroupQ2; // non-priority
+ LLSpatialGroup::sg_vector_t mMeshDirtyGroup; //groups that need rebuildMesh called
+ U32 mMeshDirtyQueryObject;
+
LLDrawable::drawable_list_t mPartitionQ; //drawables that need to update their spatial partition radius
bool mGroupQ2Locked;
diff --git a/indra/newview/res/lltoolpathfinding.cur b/indra/newview/res/lltoolpathfinding.cur
new file mode 100644
index 0000000000..2aba2daa45
--- /dev/null
+++ b/indra/newview/res/lltoolpathfinding.cur
Binary files differ
diff --git a/indra/newview/res/lltoolpathfindingpathend.cur b/indra/newview/res/lltoolpathfindingpathend.cur
new file mode 100644
index 0000000000..e951a6956b
--- /dev/null
+++ b/indra/newview/res/lltoolpathfindingpathend.cur
Binary files differ
diff --git a/indra/newview/res/lltoolpathfindingpathendadd.cur b/indra/newview/res/lltoolpathfindingpathendadd.cur
new file mode 100644
index 0000000000..0bf3201b23
--- /dev/null
+++ b/indra/newview/res/lltoolpathfindingpathendadd.cur
Binary files differ
diff --git a/indra/newview/res/lltoolpathfindingpathstart.cur b/indra/newview/res/lltoolpathfindingpathstart.cur
new file mode 100644
index 0000000000..fecc716990
--- /dev/null
+++ b/indra/newview/res/lltoolpathfindingpathstart.cur
Binary files differ
diff --git a/indra/newview/res/lltoolpathfindingpathstartadd.cur b/indra/newview/res/lltoolpathfindingpathstartadd.cur
new file mode 100644
index 0000000000..45e23e5161
--- /dev/null
+++ b/indra/newview/res/lltoolpathfindingpathstartadd.cur
Binary files differ
diff --git a/indra/newview/res/viewerRes.rc b/indra/newview/res/viewerRes.rc
index a53dece422..df75f3f697 100644
--- a/indra/newview/res/viewerRes.rc
+++ b/indra/newview/res/viewerRes.rc
@@ -122,6 +122,12 @@ TOOLMEDIAOPEN CURSOR "toolmediaopen.cur"
TOOLBUY CURSOR "toolbuy.cur"
TOOLOPEN CURSOR "toolopen.cur"
TOOLSIT CURSOR "toolsit.cur"
+TOOLPATHFINDING CURSOR "lltoolpathfinding.cur"
+TOOLPATHFINDINGPATHSTART CURSOR "lltoolpathfindingpathstart.cur"
+TOOLPATHFINDINGPATHSTARTADD CURSOR "lltoolpathfindingpathstartadd.cur"
+TOOLPATHFINDINGPATHEND CURSOR "lltoolpathfindingpathend.cur"
+TOOLPATHFINDINGPATHENDADD CURSOR "lltoolpathfindingpathendadd.cur"
+TOOLNO CURSOR "llno.cur"
/////////////////////////////////////////////////////////////////////////////
//
diff --git a/indra/newview/skins/default/colors.xml b/indra/newview/skins/default/colors.xml
index b616e2327b..9bf2922033 100644
--- a/indra/newview/skins/default/colors.xml
+++ b/indra/newview/skins/default/colors.xml
@@ -1,825 +1,861 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<colors>
- <!-- Named Colors -->
- <color
- name="EmphasisColor"
- value="0.38 0.694 0.573 1" />
- <color
- name="EmphasisColor_13"
- value="0.38 0.694 0.573 0.13" />
- <color
- name="EmphasisColor_35"
- value="0.38 0.694 0.573 0.35" />
- <color
- name="White"
- value="1 1 1 1" />
- <color
- name="White_05"
- value="1 1 1 0.05" />
- <color
- name="White_10"
- value="1 1 1 0.1" />
- <color
- name="White_25"
- value="1 1 1 0.25" />
- <color
- name="White_50"
- value="1 1 1 0.5" />
- <color
- name="LtGray"
- value="0.75 0.75 0.75 1" />
- <color
- name="LtGray_35"
- value="0.75 0.75 0.75 0.35" />
- <color
- name="LtGray_50"
- value="0.75 0.75 0.75 0.50" />
- <color
- name="Gray"
- value="0.5 0.5 0.5 1" />
- <color
- name="DkGray"
- value="0.125 0.125 0.125 1" />
- <color
- name="DkGray_66"
- value="0.125 0.125 0.125 .66" />
- <color
- name="DkGray2"
- value="0.169 0.169 0.169 1" />
- <color
- name="MouseGray"
- value="0.191 0.191 0.191 1" />
- <color
- name="Black"
- value="0 0 0 1" />
- <colork
- name="Black_10"
- value="0 0 0 0.1" />
- <color
- name="Black_25"
- value="0 0 0 0.25" />
- <color
- name="Black_50"
- value="0 0 0 0.5" />
- <color
- name="FrogGreen"
- value="0.26 0.345 0.263 1" />
- <color
- name="Red"
- value="1 0 0 1" />
- <color
- name="Blue"
- value="0 0 1 1" />
- <color
- name="Yellow"
- value="1 1 0 1" />
- <color
- name="Green"
- value="0 1 0 1" />
- <color
- name="Transparent"
- value="0 0 0 0" />
- <color
- name="Purple"
- value="1 0 1 1" />
- <color
- name="Lime"
- value=".8 1 .73 1" />
- <color
- name="LtYellow"
- value="1 1 .79 1" />
- <color
- name="DrYellow"
- value="1 0.86 0 1" />
- <color
- name="LtOrange"
- value="1 .85 .73 1" />
- <color
- name="MdBlue"
- value=".07 .38 .51 1" />
+ <!-- Named Colors -->
+ <color
+ name="EmphasisColor"
+ value="0.38 0.694 0.573 1" />
+ <color
+ name="EmphasisColor_13"
+ value="0.38 0.694 0.573 0.13" />
+ <color
+ name="EmphasisColor_35"
+ value="0.38 0.694 0.573 0.35" />
+ <color
+ name="White"
+ value="1 1 1 1" />
+ <color
+ name="White_05"
+ value="1 1 1 0.05" />
+ <color
+ name="White_10"
+ value="1 1 1 0.1" />
+ <color
+ name="White_25"
+ value="1 1 1 0.25" />
+ <color
+ name="White_50"
+ value="1 1 1 0.5" />
+ <color
+ name="LtGray"
+ value="0.75 0.75 0.75 1" />
+ <color
+ name="LtGray_35"
+ value="0.75 0.75 0.75 0.35" />
+ <color
+ name="LtGray_50"
+ value="0.75 0.75 0.75 0.50" />
+ <color
+ name="Gray"
+ value="0.5 0.5 0.5 1" />
+ <color
+ name="DkGray"
+ value="0.125 0.125 0.125 1" />
+ <color
+ name="DkGray_66"
+ value="0.125 0.125 0.125 .66" />
+ <color
+ name="DkGray2"
+ value="0.169 0.169 0.169 1" />
+ <color
+ name="MouseGray"
+ value="0.191 0.191 0.191 1" />
+ <color
+ name="Black"
+ value="0 0 0 1" />
+ <colork
+ name="Black_10"
+ value="0 0 0 0.1" />
+ <color
+ name="Black_25"
+ value="0 0 0 0.25" />
+ <color
+ name="Black_50"
+ value="0 0 0 0.5" />
+ <color
+ name="FrogGreen"
+ value="0.26 0.345 0.263 1" />
+ <color
+ name="Red"
+ value="1 0 0 1" />
+ <color
+ name="Blue"
+ value="0 0 1 1" />
+ <color
+ name="Yellow"
+ value="1 1 0 1" />
+ <color
+ name="Green"
+ value="0 1 0 1" />
+ <color
+ name="Transparent"
+ value="0 0 0 0" />
+ <color
+ name="Purple"
+ value="1 0 1 1" />
+ <color
+ name="Lime"
+ value=".8 1 .73 1" />
+ <color
+ name="LtYellow"
+ value="1 1 .79 1" />
+ <color
+ name="DrYellow"
+ value="1 0.86 0 1" />
+ <color
+ name="LtOrange"
+ value="1 .85 .73 1" />
+ <color
+ name="MdBlue"
+ value=".07 .38 .51 1" />
+ <color
+ name="LtRed"
+ value="1 0.2 0.2 1" />
+ <color
+ name="LtGreen"
+ value="0.2 1 0.2 1" />
+ <color
+ name="Red_80"
+ value="1 0 0 0.8" />
+ <color
+ name="Green_80"
+ value="0 1 0 0.8" />
+ <color
+ name="Blue_80"
+ value="0 0 1 0.8" />
<!-- This color name makes potentially unused colors show up bright purple.
- Leave this here until all Unused? are removed below, otherwise
- the viewer generates many warnings on startup. -->
+ Leave this here until all Unused? are removed below, otherwise
+ the viewer generates many warnings on startup. -->
<color
- name="Unused?"
- value=".831 1 0 1" />
+ name="Unused?"
+ value=".831 1 0 1" />
<!-- UI Definitions -->
- <color
- name="AccordionHeaderTextColor"
- reference="LtGray" />
- <color
- name="AgentChatColor"
- reference="White" />
- <color
- name="AlertBoxColor"
- value="0.24 0.24 0.24 1" />
- <color
- name="AlertCautionBoxColor"
- value="1 0.82 0.46 1" />
- <color
- name="AlertCautionTextColor"
- reference="LtYellow" />
- <color
- name="AvatarListItemIconDefaultColor"
- reference="White" />
- <color
- name="AvatarListItemIconOnlineColor"
- reference="White" />
- <color
- name="AvatarListItemIconOfflineColor"
- value="0.5 0.5 0.5 0.5" />
- <color
- name="AvatarListItemIconVoiceInvitedColor"
- reference="AvatarListItemIconOfflineColor" />
- <color
- name="AvatarListItemIconVoiceJoinedColor"
- reference="AvatarListItemIconOnlineColor" />
- <color
- name="AvatarListItemIconVoiceLeftColor"
- reference="AvatarListItemIconOfflineColor" />
- <color
- name="BadgeImageColor"
- value="1.0 0.40 0.0 1.0" />
- <color
- name="BadgeBorderColor"
- value="0.9 0.9 0.9 1.0" />
- <color
- name="BadgeLabelColor"
- reference="White" />
- <color
- name="ButtonBorderColor"
- reference="Unused?" />
- <color
- name="ButtonCautionImageColor"
- reference="Unused?" />
- <color
- name="ButtonColor"
- reference="Unused?" />
- <color
- name="ButtonFlashBgColor"
- reference="Unused?" />
- <color
- name="ButtonImageColor"
- reference="White" />
- <color
- name="ButtonLabelColor"
- reference="LtGray" />
- <color
- name="ButtonLabelDisabledColor"
- reference="White_25" />
- <color
- name="ButtonLabelSelectedColor"
- reference="White" />
- <color
- name="ButtonLabelSelectedDisabledColor"
- reference="White_25" />
- <color
- name="ButtonSelectedBgColor"
- reference="Unused?" />
- <color
- name="ButtonSelectedColor"
- reference="Unused?" />
- <color
- name="ButtonUnselectedBgColor"
- reference="Unused?" />
- <color
- name="ButtonUnselectedFgColor"
- reference="Unused?" />
- <color
- name="ChatHistoryBgColor"
- reference="Transparent" />
- <color
- name="ChatHistoryTextColor"
- reference="LtGray" />
- <color
- name="ChicletFlashColor"
- value="0.114 0.65 0.1" />
- <color
- name="ColorDropShadow"
- reference="Black_50" />
- <color
- name="ColorPaletteEntry01"
- reference="Black" />
- <color
- name="ColorPaletteEntry02"
- reference="Gray" />
- <color
- name="ColorPaletteEntry03"
- value="0.5 0 0 1" />
- <color
- name="ColorPaletteEntry04"
- value="0.5 0.5 0 1" />
- <color
- name="ColorPaletteEntry05"
- value="0 0.5 0 1" />
- <color
- name="ColorPaletteEntry06"
- value="0 0.5 0.5 1" />
- <color
- name="ColorPaletteEntry07"
- value="0 0 0.5 1" />
- <color
- name="ColorPaletteEntry08"
- value="0.5 0 0.5 1" />
- <color
- name="ColorPaletteEntry09"
- value="0.5 0.5 0 1" />
- <color
- name="ColorPaletteEntry10"
- value="0 0.25 0.25 1" />
- <color
- name="ColorPaletteEntry11"
- value="0 0.5 1 1" />
- <color
- name="ColorPaletteEntry12"
- value="0 0.25 0.5 1" />
- <color
- name="ColorPaletteEntry13"
- value="0.5 0 1 1" />
- <color
- name="ColorPaletteEntry14"
- value="0.5 0.25 0 1" />
- <color
- name="ColorPaletteEntry15"
- reference="White" />
- <color
- name="ColorPaletteEntry16"
- reference="LtYellow" />
- <color
- name="ColorPaletteEntry17"
- reference="White" />
- <color
- name="ColorPaletteEntry18"
- reference="LtGray" />
- <color
- name="ColorPaletteEntry19"
- reference="Red" />
- <color
- name="ColorPaletteEntry20"
- reference="Yellow" />
- <color
- name="ColorPaletteEntry21"
- reference="Green" />
- <color
- name="ColorPaletteEntry22"
- value="0 1 1 1" />
- <color
- name="ColorPaletteEntry23"
- reference="Blue" />
- <color
- name="ColorPaletteEntry24"
- reference="Purple" />
- <color
- name="ColorPaletteEntry25"
- value="1 1 0.5 1" />
- <color
- name="ColorPaletteEntry26"
- value="0 1 0.5 1" />
- <color
- name="ColorPaletteEntry27"
- value="0.5 1 1 1" />
- <color
- name="ColorPaletteEntry28"
- value="0.5 0.5 1 1" />
- <color
- name="ColorPaletteEntry29"
- value="1 0 0.5 1" />
- <color
- name="ColorPaletteEntry30"
- value="1 0.5 0 1" />
- <color
- name="ColorPaletteEntry31"
- reference="White" />
- <color
- name="ColorPaletteEntry32"
- reference="White" />
- <color
- name="ComboListBgColor"
- reference="DkGray" />
- <color
- name="ConsoleBackground"
- reference="Black" />
- <color
- name="ContextSilhouetteColor"
- reference="EmphasisColor" />
- <color
- name="DefaultHighlightDark"
- reference="White_10" />
- <color
- name="DefaultHighlightLight"
- reference="White_25" />
- <color
- name="DefaultShadowDark"
- reference="Black_50" />
- <color
- name="DefaultShadowLight"
- reference="Black_50" />
- <color
- name="EffectColor"
- reference="White" />
- <color
- name="FilterBackgroundColor"
- reference="Black" />
- <color
- name="FilterTextColor"
- value="0.38 0.69 0.57 1" />
- <color
- name="FloaterButtonImageColor"
- reference="LtGray" />
- <color
- name="FloaterDefaultBackgroundColor"
- reference="DkGray_66" />
- <color
- name="FloaterFocusBackgroundColor"
- reference="DkGray2" />
- <color
- name="FloaterFocusBorderColor"
- reference="Black_50" />
- <color
- name="FloaterUnfocusBorderColor"
- reference="Black_50" />
- <color
- name="FocusColor"
- reference="EmphasisColor" />
- <color
- name="FolderViewLoadingMessageTextColor"
- value="0.3344 0.5456 0.5159 1" />
- <color
- name="GridFocusPointColor"
- reference="White_50" />
- <color
- name="GridlineBGColor"
- value="0.92 0.92 1 0.78" />
- <color
- name="GridlineColor"
- reference="White" />
- <color
- name="GridlineShadowColor"
- value="0 0 0 0.31" />
- <color
- name="GroupNotifyBoxColor"
- value="0.3344 0.5456 0.5159 1" />
- <color
- name="GroupNotifyTextColor"
- reference="White"/>
- <color
- name="GroupNotifyDimmedTextColor"
- reference="LtGray" />
- <color
- name="GroupOverTierColor"
- value="0.43 0.06 0.06 1" />
- <color
- name="HTMLLinkColor"
- reference="EmphasisColor" />
- <color
- name="HealthTextColor"
- reference="White" />
- <color
- name="HelpBgColor"
- reference="Unused?" />
- <color
- name="HelpFgColor"
- reference="Unused?" />
- <color
- name="HelpScrollHighlightColor"
- reference="Unused?" />
- <color
- name="HelpScrollShadowColor"
- reference="Unused?" />
- <color
- name="HelpScrollThumbColor"
- reference="Unused?" />
- <color
- name="HelpScrollTrackColor"
- reference="Unused?" />
- <color
- name="HighlightChildColor"
- reference="Yellow" />
- <color
- name="HighlightInspectColor"
- value="1 0 1 1" />
- <color
- name="HighlightParentColor"
- value="0.67 0.83 0.96 1" />
- <color
- name="IMHistoryBgColor"
- reference="Unused?" />
- <color
- name="IMHistoryTextColor"
- reference="Unused?" />
- <color
- name="IconDisabledColor"
- reference="White_25" />
- <color
- name="IconEnabledColor"
- reference="White" />
- <color
- name="InventoryBackgroundColor"
- reference="DkGray2" />
- <color
- name="InventoryFocusOutlineColor"
- reference="White_25" />
- <color
- name="InventoryItemSuffixColor"
- reference="White_25" />
- <color
- name="InventoryItemLibraryColor"
- reference="EmphasisColor" />
- <color
- name="InventoryItemLinkColor"
- reference="LtGray_50" />
- <color
- name="InventoryMouseOverColor"
- reference="LtGray_35" />
- <color
- name="InventorySearchStatusColor"
- reference="EmphasisColor" />
- <color
- name="LabelDisabledColor"
- reference="White_25" />
- <color
- name="LabelSelectedColor"
- reference="White" />
- <color
- name="LabelSelectedDisabledColor"
- reference="White_25" />
- <color
- name="LabelTextColor"
- reference="LtGray" />
- <color
- name="LoginProgressBarBgColor"
- reference="Unused?" />
- <color
- name="LoginProgressBarFgColor"
- reference="Unused?" />
- <color
- name="LoginProgressBoxBorderColor"
- value="0 0.12 0.24 0" />
- <color
- name="LoginProgressBoxCenterColor"
- value="0 0 0 0.78" />
- <color
- name="LoginProgressBoxShadowColor"
- value="0 0 0 0.78" />
- <color
- name="LoginProgressBoxTextColor"
- reference="White" />
- <color
- name="MapAvatarColor"
- reference="Green" />
- <color
- name="MapAvatarFriendColor"
- reference="Yellow" />
- <color
- name="MapAvatarSelfColor"
- value="0.53125 0 0.498047 1" />
- <color
- name="MapFrustumColor"
- reference="White_10" />
- <color
- name="MapFrustumRotatingColor"
- value="1 1 1 0.2" />
- <color
- name="MapTrackColor"
- reference="Red" />
- <color
- name="MapTrackDisabledColor"
- value="0.5 0 0 1" />
- <color
- name="MenuBarBgColor"
- reference="DkGray" />
- <color
- name="MenuBarGodBgColor"
- reference="FrogGreen" />
- <color
- name="MenuDefaultBgColor"
- reference="DkGray2" />
- <color
- name="MenuItemDisabledColor"
- reference="LtGray_50" />
- <color
- name="MenuItemEnabledColor"
- reference="LtGray" />
- <color
- name="MenuItemHighlightBgColor"
- reference="EmphasisColor_35" />
- <color
- name="MenuItemHighlightFgColor"
- reference="White" />
- <color
- name="MenuNonProductionBgColor"
- reference="Black" />
- <color
- name="MenuNonProductionGodBgColor"
- value="0.263 0.325 0.345 1" />
- <color
- name="MenuPopupBgColor"
- reference="DkGray2" />
- <color
- name="ModelUploaderLabels"
- value="1 0.6 0 1" />
- <color
- name="MultiSliderDisabledThumbColor"
- reference="Black" />
- <color
- name="MultiSliderThumbCenterColor"
- reference="White" />
- <color
- name="MultiSliderThumbCenterSelectedColor"
- reference="Green" />
- <color
- name="MultiSliderThumbOutlineColor"
- reference="Unused?" />
- <color
- name="MultiSliderTrackColor"
- reference="LtGray" />
- <color
- name="MultiSliderTriangleColor"
- reference="Yellow" />
+ <color
+ name="AccordionHeaderTextColor"
+ reference="LtGray" />
+ <color
+ name="AgentChatColor"
+ reference="White" />
+ <color
+ name="AlertBoxColor"
+ value="0.24 0.24 0.24 1" />
+ <color
+ name="AlertCautionBoxColor"
+ value="1 0.82 0.46 1" />
+ <color
+ name="AlertCautionTextColor"
+ reference="LtYellow" />
+ <color
+ name="AvatarListItemIconDefaultColor"
+ reference="White" />
+ <color
+ name="AvatarListItemIconOnlineColor"
+ reference="White" />
+ <color
+ name="AvatarListItemIconOfflineColor"
+ value="0.5 0.5 0.5 0.5" />
+ <color
+ name="AvatarListItemIconVoiceInvitedColor"
+ reference="AvatarListItemIconOfflineColor" />
+ <color
+ name="AvatarListItemIconVoiceJoinedColor"
+ reference="AvatarListItemIconOnlineColor" />
+ <color
+ name="AvatarListItemIconVoiceLeftColor"
+ reference="AvatarListItemIconOfflineColor" />
+ <color
+ name="BadgeImageColor"
+ value="1.0 0.40 0.0 1.0" />
+ <color
+ name="BadgeBorderColor"
+ value="0.9 0.9 0.9 1.0" />
+ <color
+ name="BadgeLabelColor"
+ reference="White" />
+ <color
+ name="ButtonBorderColor"
+ reference="Unused?" />
+ <color
+ name="ButtonCautionImageColor"
+ reference="Unused?" />
+ <color
+ name="ButtonColor"
+ reference="Unused?" />
+ <color
+ name="ButtonFlashBgColor"
+ reference="Unused?" />
+ <color
+ name="ButtonImageColor"
+ reference="White" />
+ <color
+ name="ButtonLabelColor"
+ reference="LtGray" />
+ <color
+ name="ButtonLabelDisabledColor"
+ reference="White_25" />
+ <color
+ name="ButtonLabelSelectedColor"
+ reference="White" />
+ <color
+ name="ButtonLabelSelectedDisabledColor"
+ reference="White_25" />
+ <color
+ name="ButtonSelectedBgColor"
+ reference="Unused?" />
+ <color
+ name="ButtonSelectedColor"
+ reference="Unused?" />
+ <color
+ name="ButtonUnselectedBgColor"
+ reference="Unused?" />
+ <color
+ name="ButtonUnselectedFgColor"
+ reference="Unused?" />
+ <color
+ name="ChatHistoryBgColor"
+ reference="Transparent" />
+ <color
+ name="ChatHistoryTextColor"
+ reference="LtGray" />
+ <color
+ name="ChicletFlashColor"
+ value="0.114 0.65 0.1" />
+ <color
+ name="ColorDropShadow"
+ reference="Black_50" />
+ <color
+ name="ColorPaletteEntry01"
+ reference="Black" />
+ <color
+ name="ColorPaletteEntry02"
+ reference="Gray" />
+ <color
+ name="ColorPaletteEntry03"
+ value="0.5 0 0 1" />
+ <color
+ name="ColorPaletteEntry04"
+ value="0.5 0.5 0 1" />
+ <color
+ name="ColorPaletteEntry05"
+ value="0 0.5 0 1" />
+ <color
+ name="ColorPaletteEntry06"
+ value="0 0.5 0.5 1" />
+ <color
+ name="ColorPaletteEntry07"
+ value="0 0 0.5 1" />
+ <color
+ name="ColorPaletteEntry08"
+ value="0.5 0 0.5 1" />
+ <color
+ name="ColorPaletteEntry09"
+ value="0.5 0.5 0 1" />
+ <color
+ name="ColorPaletteEntry10"
+ value="0 0.25 0.25 1" />
+ <color
+ name="ColorPaletteEntry11"
+ value="0 0.5 1 1" />
+ <color
+ name="ColorPaletteEntry12"
+ value="0 0.25 0.5 1" />
+ <color
+ name="ColorPaletteEntry13"
+ value="0.5 0 1 1" />
+ <color
+ name="ColorPaletteEntry14"
+ value="0.5 0.25 0 1" />
+ <color
+ name="ColorPaletteEntry15"
+ reference="White" />
+ <color
+ name="ColorPaletteEntry16"
+ reference="LtYellow" />
+ <color
+ name="ColorPaletteEntry17"
+ reference="White" />
+ <color
+ name="ColorPaletteEntry18"
+ reference="LtGray" />
+ <color
+ name="ColorPaletteEntry19"
+ reference="Red" />
+ <color
+ name="ColorPaletteEntry20"
+ reference="Yellow" />
+ <color
+ name="ColorPaletteEntry21"
+ reference="Green" />
+ <color
+ name="ColorPaletteEntry22"
+ value="0 1 1 1" />
+ <color
+ name="ColorPaletteEntry23"
+ reference="Blue" />
+ <color
+ name="ColorPaletteEntry24"
+ reference="Purple" />
+ <color
+ name="ColorPaletteEntry25"
+ value="1 1 0.5 1" />
+ <color
+ name="ColorPaletteEntry26"
+ value="0 1 0.5 1" />
+ <color
+ name="ColorPaletteEntry27"
+ value="0.5 1 1 1" />
+ <color
+ name="ColorPaletteEntry28"
+ value="0.5 0.5 1 1" />
+ <color
+ name="ColorPaletteEntry29"
+ value="1 0 0.5 1" />
+ <color
+ name="ColorPaletteEntry30"
+ value="1 0.5 0 1" />
+ <color
+ name="ColorPaletteEntry31"
+ reference="White" />
+ <color
+ name="ColorPaletteEntry32"
+ reference="White" />
+ <color
+ name="ComboListBgColor"
+ reference="DkGray" />
+ <color
+ name="ConsoleBackground"
+ reference="Black" />
+ <color
+ name="ContextSilhouetteColor"
+ reference="EmphasisColor" />
+ <color
+ name="DefaultHighlightDark"
+ reference="White_10" />
+ <color
+ name="DefaultHighlightLight"
+ reference="White_25" />
+ <color
+ name="DefaultShadowDark"
+ reference="Black_50" />
+ <color
+ name="DefaultShadowLight"
+ reference="Black_50" />
+ <color
+ name="EffectColor"
+ reference="White" />
+ <color
+ name="FilterBackgroundColor"
+ reference="Black" />
+ <color
+ name="FilterTextColor"
+ value="0.38 0.69 0.57 1" />
+ <color
+ name="FloaterButtonImageColor"
+ reference="LtGray" />
+ <color
+ name="FloaterDefaultBackgroundColor"
+ reference="DkGray_66" />
+ <color
+ name="FloaterFocusBackgroundColor"
+ reference="DkGray2" />
+ <color
+ name="FloaterFocusBorderColor"
+ reference="Black_50" />
+ <color
+ name="FloaterUnfocusBorderColor"
+ reference="Black_50" />
+ <color
+ name="FocusColor"
+ reference="EmphasisColor" />
+ <color
+ name="FolderViewLoadingMessageTextColor"
+ value="0.3344 0.5456 0.5159 1" />
+ <color
+ name="GridFocusPointColor"
+ reference="White_50" />
+ <color
+ name="GridlineBGColor"
+ value="0.92 0.92 1 0.78" />
+ <color
+ name="GridlineColor"
+ reference="White" />
+ <color
+ name="GridlineShadowColor"
+ value="0 0 0 0.31" />
+ <color
+ name="GroupNotifyBoxColor"
+ value="0.3344 0.5456 0.5159 1" />
+ <color
+ name="GroupNotifyTextColor"
+ reference="White"/>
+ <color
+ name="GroupNotifyDimmedTextColor"
+ reference="LtGray" />
+ <color
+ name="GroupOverTierColor"
+ value="0.43 0.06 0.06 1" />
+ <color
+ name="HTMLLinkColor"
+ reference="EmphasisColor" />
+ <color
+ name="HealthTextColor"
+ reference="White" />
+ <color
+ name="HelpBgColor"
+ reference="Unused?" />
+ <color
+ name="HelpFgColor"
+ reference="Unused?" />
+ <color
+ name="HelpScrollHighlightColor"
+ reference="Unused?" />
+ <color
+ name="HelpScrollShadowColor"
+ reference="Unused?" />
+ <color
+ name="HelpScrollThumbColor"
+ reference="Unused?" />
+ <color
+ name="HelpScrollTrackColor"
+ reference="Unused?" />
+ <color
+ name="HighlightChildColor"
+ reference="Yellow" />
+ <color
+ name="HighlightInspectColor"
+ value="1 0 1 1" />
+ <color
+ name="HighlightParentColor"
+ value="0.67 0.83 0.96 1" />
+ <color
+ name="IMHistoryBgColor"
+ reference="Unused?" />
+ <color
+ name="IMHistoryTextColor"
+ reference="Unused?" />
+ <color
+ name="IconDisabledColor"
+ reference="White_25" />
+ <color
+ name="IconEnabledColor"
+ reference="White" />
+ <color
+ name="InventoryBackgroundColor"
+ reference="DkGray2" />
+ <color
+ name="InventoryFocusOutlineColor"
+ reference="White_25" />
+ <color
+ name="InventoryItemSuffixColor"
+ reference="White_25" />
+ <color
+ name="InventoryItemLibraryColor"
+ reference="EmphasisColor" />
+ <color
+ name="InventoryItemLinkColor"
+ reference="LtGray_50" />
+ <color
+ name="InventoryMouseOverColor"
+ reference="LtGray_35" />
+ <color
+ name="InventorySearchStatusColor"
+ reference="EmphasisColor" />
+ <color
+ name="LabelDisabledColor"
+ reference="White_25" />
+ <color
+ name="LabelSelectedColor"
+ reference="White" />
+ <color
+ name="LabelSelectedDisabledColor"
+ reference="White_25" />
+ <color
+ name="LabelTextColor"
+ reference="LtGray" />
+ <color
+ name="LoginProgressBarBgColor"
+ reference="Unused?" />
+ <color
+ name="LoginProgressBarFgColor"
+ reference="Unused?" />
+ <color
+ name="LoginProgressBoxBorderColor"
+ value="0 0.12 0.24 0" />
+ <color
+ name="LoginProgressBoxCenterColor"
+ value="0 0 0 0.78" />
+ <color
+ name="LoginProgressBoxShadowColor"
+ value="0 0 0 0.78" />
+ <color
+ name="LoginProgressBoxTextColor"
+ reference="White" />
+ <color
+ name="MapAvatarColor"
+ reference="Green" />
+ <color
+ name="MapAvatarFriendColor"
+ reference="Yellow" />
+ <color
+ name="MapAvatarSelfColor"
+ value="0.53125 0 0.498047 1" />
+ <color
+ name="MapFrustumColor"
+ reference="White_10" />
+ <color
+ name="MapFrustumRotatingColor"
+ value="1 1 1 0.2" />
+ <color
+ name="MapTrackColor"
+ reference="Red" />
+ <color
+ name="MapTrackDisabledColor"
+ value="0.5 0 0 1" />
+ <color
+ name="MenuBarBgColor"
+ reference="DkGray" />
+ <color
+ name="MenuBarGodBgColor"
+ reference="FrogGreen" />
+ <color
+ name="MenuDefaultBgColor"
+ reference="DkGray2" />
+ <color
+ name="MenuItemDisabledColor"
+ reference="LtGray_50" />
+ <color
+ name="MenuItemEnabledColor"
+ reference="LtGray" />
+ <color
+ name="MenuItemHighlightBgColor"
+ reference="EmphasisColor_35" />
+ <color
+ name="MenuItemHighlightFgColor"
+ reference="White" />
+ <color
+ name="MenuNonProductionBgColor"
+ reference="Black" />
+ <color
+ name="MenuNonProductionGodBgColor"
+ value="0.263 0.325 0.345 1" />
+ <color
+ name="MenuPopupBgColor"
+ reference="DkGray2" />
+ <color
+ name="ModelUploaderLabels"
+ value="1 0.6 0 1" />
+ <color
+ name="MultiSliderDisabledThumbColor"
+ reference="Black" />
+ <color
+ name="MultiSliderThumbCenterColor"
+ reference="White" />
+ <color
+ name="MultiSliderThumbCenterSelectedColor"
+ reference="Green" />
+ <color
+ name="MultiSliderThumbOutlineColor"
+ reference="Unused?" />
+ <color
+ name="MultiSliderTrackColor"
+ reference="LtGray" />
+ <color
+ name="MultiSliderTriangleColor"
+ reference="Yellow" />
<!--
- <color
+ <color
name="NameTagBackground"
value="0.85 0.85 0.85 0.80" />
- -->
- <color
+ -->
+ <color
name="NameTagBackground"
value="0 0 0 1" />
- <color
- name="NameTagChat"
- reference="White" />
- <color
- name="NameTagFriend"
- value="0.447 0.784 0.663 1" />
- <color
- name="NameTagLegacy"
- reference="White" />
- <color
- name="NameTagMatch"
- reference="White" />
- <color
- name="NameTagMismatch"
- reference="White" />
- <color
- name="NetMapBackgroundColor"
- value="0 0 0 1" />
- <color
- name="NetMapGroupOwnAboveWater"
- reference="Purple" />
- <color
- name="NetMapGroupOwnBelowWater"
- value="0.78 0 0.78 1" />
- <color
- name="NetMapOtherOwnAboveWater"
- value="0.24 0.24 0.24 1" />
- <color
- name="NetMapOtherOwnBelowWater"
- value="0.12 0.12 0.12 1" />
- <color
- name="NetMapYouOwnAboveWater"
- value="0 1 1 1" />
- <color
- name="NetMapYouOwnBelowWater"
- value="0 0.78 0.78 1" />
- <color
- name="NotifyBoxColor"
- value="LtGray" />
- <color
- name="NotifyCautionBoxColor"
- value="1 0.82 0.46 1" />
- <color
- name="NotifyCautionWarnColor"
- reference="White" />
- <color
- name="NotifyTextColor"
- reference="White" />
- <color
- name="ObjectBubbleColor"
- reference="DkGray_66" />
- <color
- name="ObjectChatColor"
- reference="EmphasisColor" />
- <color
- name="OverdrivenColor"
- reference="Red" />
- <color
- name="PanelDefaultBackgroundColor"
- reference="DkGray" />
- <color
- name="PanelDefaultHighlightLight"
- reference="White_50" />
- <color
- name="PanelFocusBackgroundColor"
- reference="DkGray2" />
- <color
- name="PanelNotificationBackground"
- value="1 0.3 0.3 0" />
- <color
- name="ParcelHoverColor"
- reference="White" />
- <color
- name="PieMenuBgColor"
- value="0.24 0.24 0.24 0.59" />
- <color
- name="PieMenuLineColor"
- value="0 0 0 0.5" />
- <color
- name="PieMenuSelectedColor"
- value="0.72 0.72 0.74 0.3" />
- <color
- name="PropertyColorAuction"
- value="0.5 0 1 0.4" />
- <color
- name="PropertyColorAvail"
- reference="Transparent" />
- <color
- name="PropertyColorForSale"
- value="1 0.5 0 0.4" />
- <color
- name="PropertyColorGroup"
- value="0 0.72 0.72 0.4" />
- <color
- name="PropertyColorOther"
- value="1 0 0 0.4" />
- <color
- name="PropertyColorSelf"
- value="0 1 0 0.4" />
- <color
- name="ScriptBgReadOnlyColor"
- value="0.39 0.39 0.39 1" />
- <color
- name="ScriptErrorColor"
- reference="Red" />
- <color
- name="ScrollBGStripeColor"
- reference="Transparent" />
- <color
- name="ScrollBgReadOnlyColor"
+ <color
+ name="NameTagChat"
+ reference="White" />
+ <color
+ name="NameTagFriend"
+ value="0.447 0.784 0.663 1" />
+ <color
+ name="NameTagLegacy"
+ reference="White" />
+ <color
+ name="NameTagMatch"
+ reference="White" />
+ <color
+ name="NameTagMismatch"
+ reference="White" />
+ <color
+ name="NetMapBackgroundColor"
+ value="0 0 0 1" />
+ <color
+ name="NetMapGroupOwnAboveWater"
+ reference="Purple" />
+ <color
+ name="NetMapGroupOwnBelowWater"
+ value="0.78 0 0.78 1" />
+ <color
+ name="NetMapOtherOwnAboveWater"
+ value="0.24 0.24 0.24 1" />
+ <color
+ name="NetMapOtherOwnBelowWater"
+ value="0.12 0.12 0.12 1" />
+ <color
+ name="NetMapYouOwnAboveWater"
+ value="0 1 1 1" />
+ <color
+ name="NetMapYouOwnBelowWater"
+ value="0 0.78 0.78 1" />
+ <color
+ name="NotifyBoxColor"
+ value="LtGray" />
+ <color
+ name="NotifyCautionBoxColor"
+ value="1 0.82 0.46 1" />
+ <color
+ name="NotifyCautionWarnColor"
+ reference="White" />
+ <color
+ name="NotifyTextColor"
+ reference="White" />
+ <color
+ name="ObjectBubbleColor"
+ reference="DkGray_66" />
+ <color
+ name="ObjectChatColor"
+ reference="EmphasisColor" />
+ <color
+ name="OverdrivenColor"
+ reference="Red" />
+ <color
+ name="PanelDefaultBackgroundColor"
+ reference="DkGray" />
+ <color
+ name="PanelDefaultHighlightLight"
+ reference="White_50" />
+ <color
+ name="PanelFocusBackgroundColor"
+ reference="DkGray2" />
+ <color
+ name="PanelNotificationBackground"
+ value="1 0.3 0.3 0" />
+ <color
+ name="ParcelHoverColor"
+ reference="White" />
+ <color
+ name="PathfindingErrorColor"
+ reference="LtRed" />
+ <color
+ name="PathfindingWarningColor"
+ reference="DrYellow" />
+ <color
+ name="PathfindingGoodColor"
+ reference="LtGreen" />
+ <color
+ name="PathfindingDefaultBeaconColor"
+ reference="Red_80" />
+ <color
+ name="PathfindingDefaultBeaconTextColor"
+ reference="White" />
+ <color
+ name="PathfindingLinksetBeaconColor"
+ reference="Blue_80" />
+ <color
+ name="PathfindingCharacterBeaconColor"
+ reference="Red_80" />
+ <color
+ name="PieMenuBgColor"
+ value="0.24 0.24 0.24 0.59" />
+ <color
+ name="PieMenuLineColor"
+ value="0 0 0 0.5" />
+ <color
+ name="PieMenuSelectedColor"
+ value="0.72 0.72 0.74 0.3" />
+ <color
+ name="PropertyColorAuction"
+ value="0.5 0 1 0.4" />
+ <color
+ name="PropertyColorAvail"
reference="Transparent" />
- <color
- name="ScrollBgWriteableColor"
- reference="White_05" />
- <color
- name="ScrollDisabledColor"
- reference="White_25" />
- <color
- name="ScrollHighlightedColor"
- reference="Unused?" />
- <color
- name="ScrollHoveredColor"
- reference="EmphasisColor_13" />
- <color
- name="ScrollSelectedBGColor"
- reference="EmphasisColor_35" />
- <color
- name="ScrollSelectedFGColor"
- reference="White" />
- <color
- name="ScrollUnselectedColor"
- reference="LtGray" />
- <color
- name="ScrollbarThumbColor"
- reference="White" />
- <color
- name="ScrollbarTrackColor"
- reference="Black" />
- <color
- name="SelectedOutfitTextColor"
- reference="EmphasisColor" />
- <color
- name="SilhouetteChildColor"
- value="0.13 0.42 0.77 1" />
- <color
- name="SilhouetteParentColor"
- reference="Yellow" />
- <color
- name="SliderDisabledThumbColor"
- reference="White_25" />
- <color
- name="SliderThumbCenterColor"
- reference="White" />
- <color
- name="SliderThumbOutlineColor"
- reference="White" />
- <color
- name="SliderTrackColor"
- reference="Unused?" />
- <color
- name="SpeakingColor"
- reference="FrogGreen" />
- <color
- name="SystemChatColor"
- reference="LtGray" />
- <color
- name="TextBgFocusColor"
- reference="White" />
- <color
- name="TextBgReadOnlyColor"
- reference="White_05" />
- <color
- name="TextBgWriteableColor"
- reference="LtGray" />
- <color
- name="TextCursorColor"
- reference="Black" />
- <color
- name="TextDefaultColor"
- reference="Black" />
- <color
- name="TextEmbeddedItemColor"
- value="0 0 0.5 1" />
- <color
- name="TextEmbeddedItemReadOnlyColor"
- reference="Unused?" />
- <color
- name="TextFgColor"
- value="0.102 0.102 0.102 1" />
- <color
- name="TextFgReadOnlyColor"
- reference="LtGray" />
- <color
- name="TextFgTentativeColor"
- value="0.4 0.4 0.4 1" />
- <color
- name="TimeTextColor"
- reference="LtGray" />
- <color
- name="TitleBarFocusColor"
- reference="White_10" />
- <color
- name="ToastBackground"
- value="0.3 0.3 0.3 0" />
- <color
- name="ToolTipBgColor"
- value="0.937 0.89 0.655 1" />
- <color
- name="ToolTipBorderColor"
- value="0.812 0.753 0.451 1" />
- <color
- name="ToolTipTextColor"
- reference="DkGray2" />
- <color
- name="InspectorTipTextColor"
- reference="LtGray" />
- <color
- name="UserChatColor"
- reference="White" />
- <color
- name="llOwnerSayChatColor"
- reference="LtYellow" />
+ <color
+ name="PropertyColorForSale"
+ value="1 0.5 0 0.4" />
+ <color
+ name="PropertyColorGroup"
+ value="0 0.72 0.72 0.4" />
+ <color
+ name="PropertyColorOther"
+ value="1 0 0 0.4" />
+ <color
+ name="PropertyColorSelf"
+ value="0 1 0 0.4" />
+ <color
+ name="ScriptBgReadOnlyColor"
+ value="0.39 0.39 0.39 1" />
+ <color
+ name="ScriptErrorColor"
+ reference="Red" />
+ <color
+ name="ScrollBGStripeColor"
+ reference="Transparent" />
+ <color
+ name="ScrollBgReadOnlyColor"
+ reference="Transparent" />
+ <color
+ name="ScrollBgWriteableColor"
+ reference="White_05" />
+ <color
+ name="ScrollDisabledColor"
+ reference="White_25" />
+ <color
+ name="ScrollHighlightedColor"
+ reference="Unused?" />
+ <color
+ name="ScrollHoveredColor"
+ reference="EmphasisColor_13" />
+ <color
+ name="ScrollSelectedBGColor"
+ reference="EmphasisColor_35" />
+ <color
+ name="ScrollSelectedFGColor"
+ reference="White" />
+ <color
+ name="ScrollUnselectedColor"
+ reference="LtGray" />
+ <color
+ name="ScrollbarThumbColor"
+ reference="White" />
+ <color
+ name="ScrollbarTrackColor"
+ reference="Black" />
+ <color
+ name="SelectedOutfitTextColor"
+ reference="EmphasisColor" />
+ <color
+ name="SilhouetteChildColor"
+ value="0.13 0.42 0.77 1" />
+ <color
+ name="SilhouetteParentColor"
+ reference="Yellow" />
+ <color
+ name="SliderDisabledThumbColor"
+ reference="White_25" />
+ <color
+ name="SliderThumbCenterColor"
+ reference="White" />
+ <color
+ name="SliderThumbOutlineColor"
+ reference="White" />
+ <color
+ name="SliderTrackColor"
+ reference="Unused?" />
+ <color
+ name="SpeakingColor"
+ reference="FrogGreen" />
+ <color
+ name="SystemChatColor"
+ reference="LtGray" />
+ <color
+ name="TextBgFocusColor"
+ reference="White" />
+ <color
+ name="TextBgReadOnlyColor"
+ reference="White_05" />
+ <color
+ name="TextBgWriteableColor"
+ reference="LtGray" />
+ <color
+ name="TextCursorColor"
+ reference="Black" />
+ <color
+ name="TextDefaultColor"
+ reference="Black" />
+ <color
+ name="TextEmbeddedItemColor"
+ value="0 0 0.5 1" />
+ <color
+ name="TextEmbeddedItemReadOnlyColor"
+ reference="Unused?" />
+ <color
+ name="TextFgColor"
+ value="0.102 0.102 0.102 1" />
+ <color
+ name="TextFgReadOnlyColor"
+ reference="LtGray" />
+ <color
+ name="TextFgTentativeColor"
+ value="0.4 0.4 0.4 1" />
+ <color
+ name="TimeTextColor"
+ reference="LtGray" />
+ <color
+ name="TitleBarFocusColor"
+ reference="White_10" />
+ <color
+ name="ToastBackground"
+ value="0.3 0.3 0.3 0" />
+ <color
+ name="ToolTipBgColor"
+ value="0.937 0.89 0.655 1" />
+ <color
+ name="ToolTipBorderColor"
+ value="0.812 0.753 0.451 1" />
+ <color
+ name="ToolTipTextColor"
+ reference="DkGray2" />
+ <color
+ name="InspectorTipTextColor"
+ reference="LtGray" />
+ <color
+ name="UserChatColor"
+ reference="White" />
+ <color
+ name="llOwnerSayChatColor"
+ reference="LtYellow" />
- <!-- New Colors -->
- <color
- name="OutputMonitorMutedColor"
- reference="DkGray2" />
- <color
- name="SysWellItemUnselected"
- value="0 0 0 0" />
- <color
- name="SysWellItemSelected"
- value="0.3 0.3 0.3 1.0" />
- <color
- name="ColorSwatchBorderColor"
- value="0.45098 0.517647 0.607843 1"/>
- <color
- name="ChatTimestampColor"
- reference="White" />
- <color
- name="MenuBarProjectBgColor"
- reference="MdBlue" />
+ <!-- New Colors -->
+ <color
+ name="OutputMonitorMutedColor"
+ reference="DkGray2" />
+ <color
+ name="SysWellItemUnselected"
+ value="0 0 0 0" />
+ <color
+ name="SysWellItemSelected"
+ value="0.3 0.3 0.3 1.0" />
+ <color
+ name="ColorSwatchBorderColor"
+ value="0.45098 0.517647 0.607843 1"/>
+ <color
+ name="ChatTimestampColor"
+ reference="White" />
+ <color
+ name="MenuBarProjectBgColor"
+ reference="MdBlue" />
- <color
+ <color
name="MeshImportTableNormalColor"
value="1 1 1 1"/>
- <color
+ <color
name="MeshImportTableHighlightColor"
value="0.2 0.8 1 1"/>
- <color
- name="DirectChatColor"
- reference="LtOrange" />
+ <color
+ name="DirectChatColor"
+ reference="LtOrange" />
- <color
+ <color
name="ToolbarDropZoneColor"
value=".48 .69 1 .5" />
- <!-- Generic color names (legacy) -->
+ <!-- Generic color names (legacy) -->
<color
- name="white"
- value="1 1 1 1"/>
+ name="white"
+ value="1 1 1 1"/>
<color
- name="black"
- value="0 0 0 1"/>
+ name="black"
+ value="0 0 0 1"/>
<color
- name="red"
- value="1 0 0 1"/>
+ name="red"
+ value="1 0 0 1"/>
<color
- name="green"
- value="0 1 0 1"/>
+ name="green"
+ value="0 1 0 1"/>
<color
- name="blue"
- value="0 0 1 1"/>
+ name="blue"
+ value="0 0 1 1"/>
</colors>
diff --git a/indra/newview/skins/default/textures/icons/Pathfinding_Dirty.png b/indra/newview/skins/default/textures/icons/Pathfinding_Dirty.png
new file mode 100644
index 0000000000..cfa12cb7cc
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/Pathfinding_Dirty.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/Pathfinding_Disabled.png b/indra/newview/skins/default/textures/icons/Pathfinding_Disabled.png
new file mode 100644
index 0000000000..0622141848
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/Pathfinding_Disabled.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/textures.xml b/indra/newview/skins/default/textures/textures.xml
index eabcc68916..06f8f8c670 100644
--- a/indra/newview/skins/default/textures/textures.xml
+++ b/indra/newview/skins/default/textures/textures.xml
@@ -54,6 +54,8 @@ with the same filename but different name
<texture name="Arrow_Down" file_name="widgets/Arrow_Down.png" preload="true" />
<texture name="Arrow_Up" file_name="widgets/Arrow_Up.png" preload="true" />
+ <texture name="Arrow_Left" file_name="widgets/Arrow_Left.png" preload="true" />
+ <texture name="Arrow_Right" file_name="widgets/Arrow_Right.png" preload="true" />
<texture name="AudioMute_Off" file_name="icons/AudioMute_Off.png" preload="false" />
<texture name="AudioMute_Over" file_name="icons/AudioMute_Over.png" preload="false" />
@@ -429,6 +431,9 @@ with the same filename but different name
<texture name="Parcel_Voice_Light" file_name="icons/Parcel_Voice_Light.png" preload="false" />
<texture name="Parcel_VoiceNo_Light" file_name="icons/Parcel_VoiceNo_Light.png" preload="false" />
+ <texture name="Pathfinding_Dirty" file_name="icons/Pathfinding_Dirty.png" preload="false" />
+ <texture name="Pathfinding_Disabled" file_name="icons/Pathfinding_Disabled.png" preload="false" />
+
<texture name="Pause_Off" file_name="icons/Pause_Off.png" preload="false" />
<texture name="Pause_Over" file_name="icons/Pause_Over.png" preload="false" />
<texture name="Pause_Press" file_name="icons/Pause_Press.png" preload="false" />
diff --git a/indra/newview/skins/default/textures/widgets/Arrow_Left.png b/indra/newview/skins/default/textures/widgets/Arrow_Left.png
new file mode 100644
index 0000000000..a424282839
--- /dev/null
+++ b/indra/newview/skins/default/textures/widgets/Arrow_Left.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/Arrow_Right.png b/indra/newview/skins/default/textures/widgets/Arrow_Right.png
new file mode 100644
index 0000000000..e32bee8f34
--- /dev/null
+++ b/indra/newview/skins/default/textures/widgets/Arrow_Right.png
Binary files differ
diff --git a/indra/newview/skins/default/xui/da/floater_model_wizard.xml b/indra/newview/skins/default/xui/da/floater_model_wizard.xml
deleted file mode 100644
index 8ad443581a..0000000000
--- a/indra/newview/skins/default/xui/da/floater_model_wizard.xml
+++ /dev/null
@@ -1,241 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Model Wizard" title="UPLOAD MODEL WIZARD">
- <button label="5. Upload" name="upload_btn"/>
- <button label="4. Review" name="review_btn"/>
- <button label="3. Physics" name="physics2_btn"/>
- <button label="3. Physics" name="physics_btn"/>
- <button label="2. Optimize" name="optimize_btn"/>
- <button label="1. Choose File" name="choose_file_btn"/>
- <panel name="choose_file_panel">
- <panel name="header_panel">
- <text name="header_text">
- Upload Model
- </text>
- </panel>
- <text name="description">
- This wizard will help you import mesh models to Second Life. First specify a file containing the model you wish to import. Second Life supports COLLADA (.dae) files.
- </text>
- <panel name="content">
- <text name="Cache location">
- Filename:
- </text>
- <button label="Browse..." label_selected="Browse..." name="browse"/>
- <text name="dimensions">
- X: Y: Z:
- </text>
- <text name="dimension_dividers">
- | |
- </text>
- </panel>
- </panel>
- <panel name="optimize_panel">
- <panel name="header_panel">
- <text name="header_text">
- Optimize
- </text>
- </panel>
- <text name="description">
- This wizard has optimized your model to improve performance. You may adjust the results of the optimization process bellow or click Next to continue.
- </text>
- <panel name="content">
- <text name="high_detail_text">
- Generate Level of Detail: High
- </text>
- <text name="medium_detail_text">
- Generate Level of Detail: Medium
- </text>
- <text name="low_detail_text">
- Generate Level of Detail: Low
- </text>
- <text name="lowest_detail_text">
- Generate Level of Detail: Lowest
- </text>
- </panel>
- <panel name="content2">
- <text name="lod_label">
- Model Preview:
- </text>
- <combo_box name="preview_lod_combo2" tool_tip="LOD to view in preview render">
- <combo_item name="high">
- High
- </combo_item>
- <combo_item name="medium">
- Medium
- </combo_item>
- <combo_item name="low">
- Low
- </combo_item>
- <combo_item name="lowest">
- Lowest
- </combo_item>
- </combo_box>
- <text name="streaming cost">
- Resource Cost: [COST]
- </text>
- <text name="dimensions">
- X: Y: Z:
- </text>
- <text name="dimension_dividers">
- | |
- </text>
- </panel>
- </panel>
- <panel name="physics_panel">
- <panel name="header_panel">
- <text name="header_text">
- Physics
- </text>
- </panel>
- <text name="description">
- The wizard will create a physical shape, which determines how the object interacts with other objects and avatars. Set the slider to the detail level most appropriate for how your object will be used:
- </text>
- <panel name="content">
- <text name="streaming cost">
- Resource Cost: [COST]
- </text>
- </panel>
- </panel>
- <panel name="physics2_panel">
- <panel name="header_panel">
- <text name="header_text">
- Physics
- </text>
- </panel>
- <text name="description">
- Preview the physics shape below then click Next to continue. To modify the physics shape, click the Back button.
- </text>
- <panel name="content">
- <text name="lod_label">
- Model Preview:
- </text>
- <combo_box name="preview_lod_combo3" tool_tip="LOD to view in preview render">
- <combo_item name="high">
- High
- </combo_item>
- <combo_item name="medium">
- Medium
- </combo_item>
- <combo_item name="low">
- Low
- </combo_item>
- <combo_item name="lowest">
- Lowest
- </combo_item>
- </combo_box>
- <text name="dimensions">
- X: Y: Z:
- </text>
- <text name="dimension_dividers">
- | |
- </text>
- <text name="streaming cost">
- Resource Cost: [COST]
- </text>
- </panel>
- </panel>
- <panel name="review_panel">
- <panel name="header_panel">
- <text name="header_text">
- Review
- </text>
- </panel>
- <text name="description">
- Review the details below then click. Upload to upload your model. Your L$ balance will be charged when you click Upload.
- </text>
- <panel name="content">
- <text name="lod_label">
- Model Preview:
- </text>
- <combo_box name="preview_lod_combo" tool_tip="LOD to view in preview render">
- <combo_item name="high">
- High
- </combo_item>
- <combo_item name="medium">
- Medium
- </combo_item>
- <combo_item name="low">
- Low
- </combo_item>
- <combo_item name="lowest">
- Lowest
- </combo_item>
- </combo_box>
- <text name="dimensions">
- X: Y: Z:
- </text>
- <text name="dimension_dividers">
- | |
- </text>
- </panel>
- <text name="streaming cost">
- Resource Cost: [COST]
- </text>
- <text name="physics cost">
- Physics Cost: [COST]
- </text>
- </panel>
- <panel name="upload_panel">
- <panel name="header_panel">
- <text name="header_text">
- Upload Complete!
- </text>
- </panel>
- <text name="description">
- Congratulations! Your model has been sucessfully uploaded. You will find the model in the Objects folder in your inventory.
- </text>
- </panel>
- <button label="&lt;&lt; Back" name="back"/>
- <button label="Next &gt;&gt;" name="next"/>
- <button label="Upload" name="upload" tool_tip="Upload to simulator"/>
- <button label="Cancel" name="cancel"/>
- <button label="Close" name="close"/>
- <spinner name="import_scale" value="1.0"/>
- <string name="status_idle">
- Idle
- </string>
- <string name="status_reading_file">
- Loading...
- </string>
- <string name="status_generating_meshes">
- Generating Meshes...
- </string>
- <string name="status_vertex_number_overflow">
- Error: Vertex number is more than 65534, aborted!
- </string>
- <string name="high">
- High
- </string>
- <string name="medium">
- Medium
- </string>
- <string name="low">
- Low
- </string>
- <string name="lowest">
- Lowest
- </string>
- <string name="mesh_status_good">
- Ship it!
- </string>
- <string name="mesh_status_na">
- N/A
- </string>
- <string name="mesh_status_none">
- None
- </string>
- <string name="mesh_status_submesh_mismatch">
- Levels of detail have a different number of textureable faces.
- </string>
- <string name="mesh_status_mesh_mismatch">
- Levels of detail have a different number of mesh instances.
- </string>
- <string name="mesh_status_too_many_vertices">
- Level of detail has too many vertices.
- </string>
- <string name="mesh_status_missing_lod">
- Missing required level of detail.
- </string>
- <string name="layer_all">
- All
- </string>
-</floater>
diff --git a/indra/newview/skins/default/xui/da/notifications.xml b/indra/newview/skins/default/xui/da/notifications.xml
index cf6f1ccdd9..33b876bdb9 100644
--- a/indra/newview/skins/default/xui/da/notifications.xml
+++ b/indra/newview/skins/default/xui/da/notifications.xml
@@ -481,7 +481,6 @@ Du kan bruge [SECOND_LIFE] normalt og andre personer vil se dig korrekt.
[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].
diff --git a/indra/newview/skins/default/xui/da/panel_login.xml b/indra/newview/skins/default/xui/da/panel_login.xml
index 2e0f726e1a..b7cb76d4cb 100644
--- a/indra/newview/skins/default/xui/da/panel_login.xml
+++ b/indra/newview/skins/default/xui/da/panel_login.xml
@@ -1,13 +1,13 @@
<?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="log_in_text">
+ LOG PÃ…
+ </text>
<text name="username_text">
Brugernavn:
</text>
@@ -15,15 +15,8 @@
<text name="password_text">
Password:
</text>
- <check_box label="Husk password" name="remember_check"/>
- <button label="Log på" name="connect_btn"/>
- <text name="mode_selection_text">
- Tilstand:
- </text>
- <combo_box name="mode_combo" tool_tip="Vælg ønsket tilstand. Vælg basis for hurtig og nem udforskning og chat. Vælg avanceret for at få adgang til flere muligheder.">
- <combo_box.item label="Basis" name="Basic"/>
- <combo_box.item label="Avanceret" name="Advanced"/>
- </combo_box>
+ </layout_panel>
+ <layout_panel name="start_location_panel">
<text name="start_location_text">
Start ved:
</text>
@@ -33,16 +26,21 @@
<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
+ <layout_panel name="links_login_panel">
+ <text name="login_help">
+ Hjælp til login
</text>
<text name="forgot_password_text">
Har du glemt brugernavn eller password?
</text>
- <text name="login_help">
- Hjælp til login
+ <button label="Log på" name="connect_btn"/>
+ <check_box label="Husk password" name="remember_check"/>
+ </layout_panel>
+ <layout_panel name="links">
+ <text name="create_account_text">
+ CREATE YǾUR ACCǾUNT
</text>
+ <button name="create_new_account_btn" label="Opret bruger"/>
</layout_panel>
</layout_stack>
</panel>
diff --git a/indra/newview/skins/default/xui/de/floater_hardware_settings.xml b/indra/newview/skins/default/xui/de/floater_hardware_settings.xml
index ca081aafae..fd6c9a0875 100644
--- a/indra/newview/skins/default/xui/de/floater_hardware_settings.xml
+++ b/indra/newview/skins/default/xui/de/floater_hardware_settings.xml
@@ -25,6 +25,10 @@
VBO aktivieren:
</text>
<check_box initial_value="true" label="OpenGL Vertex-Buffer-Objekte aktivieren" name="vbo" tool_tip="Wenn Sie über moderne Grafikhardware verfügen, können Sie durch Aktivieren dieser Option die Geschwindigkeit verbessern. Bei alter Hardware sind die VBO oft schlecht implementiert, was zu Abstürzen führen kann, wenn diese Option aktiviert ist."/>
+ <text name="tc label">
+ S3TC aktivieren:
+ </text>
+ <check_box initial_value="true" label="Texturkomprimierung aktivieren (Neustart erforderlich)" name="texture compression" tool_tip="Komprimiert Texturen im Videospeicher, damit höher auflösende Texturen geladen werden können (leichte Beeinträchtigung der Farbqualität)."/>
<slider label="Texturen-Cache (MB):" name="GraphicsCardTextureMemory" tool_tip="Speicherplatz, der für Texturen zur Verfügung steht. In der Regel handelt es sich um Grafikkartenspeicher. Ein kleinerer Wert kann die Geschwindigkeit erhöhen, aber auch zu Texturunschärfen führen."/>
<spinner label="Nebeldistanzverhältnis:" name="fog"/>
<button label="OK" label_selected="OK" name="OK"/>
diff --git a/indra/newview/skins/default/xui/de/floater_model_wizard.xml b/indra/newview/skins/default/xui/de/floater_model_wizard.xml
deleted file mode 100644
index ee26d51d32..0000000000
--- a/indra/newview/skins/default/xui/de/floater_model_wizard.xml
+++ /dev/null
@@ -1,208 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Model Wizard" title="ASSISTENT ZUM HOCHLADEN VON MODELLEN">
- <button label="5. Hochladen" name="upload_btn"/>
- <button label="4. Überprüfen" name="review_btn"/>
- <button label="3. Physik" name="physics_btn"/>
- <button label="2. Optimieren" name="optimize_btn"/>
- <button label="1. Datei auswählen" name="choose_file_btn"/>
- <panel name="choose_file_panel">
- <panel name="choose_file_header_panel">
- <text name="choose_file_header_text">
- Modelldatei auswählen
- </text>
- </panel>
- <panel name="choose_file_content">
- <text name="advanced_users_text">
- Fortgeschrittene Benutzer: Wenn Sie bereits mit Tools zur Erstellung von 3D-Inhalten vertraut sind, können Sie den erweiterten Uploader verwenden.
- </text>
- <button label="Auf Erweitert wechseln" name="switch_to_advanced"/>
- <text name="Cache location">
- Hochzuladende Modelldatei auswählen
- </text>
- <button label="Durchsuchen..." label_selected="Durchsuchen..." name="browse"/>
- <text name="Model types">
- Second Life unterstützt COLLADA-Dateien (.dae).
- </text>
- <text name="dimensions">
- X Y Z
- </text>
- <text name="warning_label">
- ACHTUNG:
- </text>
- <text name="warning_text">
- Sie können den letzten Schritt nicht abschließen (Modell auf Second Life-Server hochladen). [secondlife:///app/floater/learn_more Weitere Infos], wie Sie Ihr Konto zum Hochladen von Netzmodellen einrichten.
- </text>
- </panel>
- </panel>
- <panel name="optimize_panel">
- <panel name="optimize_header_panel">
- <text name="optimize_header_text">
- Modell optimieren
- </text>
- </panel>
- <text name="optimize_description">
- Wir haben das Modell auf Leistung optimiert. Sie können es bei Bedarf weiter anpassen.
- </text>
- <panel name="optimize_content">
- <text name="high_detail_text">
- Detailstufe generieren: hoch
- </text>
- <text name="medium_detail_text">
- Detailstufe generieren: mittel
- </text>
- <text name="low_detail_text">
- Detailstufe generieren: niedrig
- </text>
- <text name="lowest_detail_text">
- Detailstufe generieren: niedrigste
- </text>
- </panel>
- <panel name="content2">
- <button label="Geometrie neu berechnen" name="recalculate_geometry_btn"/>
- <text name="lod_label">
- Geometrievorschau
- </text>
- <combo_box name="preview_lod_combo" tool_tip="Detailstufe zur Anzeige in Vorschaudarstellung">
- <combo_item name="high">
- Viel Details
- </combo_item>
- <combo_item name="medium">
- Mittlere Details
- </combo_item>
- <combo_item name="low">
- Wenig Details
- </combo_item>
- <combo_item name="lowest">
- Wenigste Details
- </combo_item>
- </combo_box>
- </panel>
- </panel>
- <panel name="physics_panel">
- <panel name="physics_header_panel">
- <text name="physics_header_text">
- Physik anpassen
- </text>
- </panel>
- <text name="physics_description">
- Wir erstellen eine Form für die Außenhülle des Modells. Passen Sie die Detailstufe der Form wie für den beabsichtigten Zweck erforderlich an.
- </text>
- <panel name="physics_content">
- <button label="Physik neu berechnen" name="recalculate_physics_btn"/>
- <button label="Neu berechnen..." name="recalculating_physics_btn"/>
- <text name="lod_label">
- Physikvorschau
- </text>
- <combo_box name="preview_lod_combo2" tool_tip="Detailstufe zur Anzeige in Vorschaudarstellung">
- <combo_item name="high">
- Viel Details
- </combo_item>
- <combo_item name="medium">
- Mittlere Details
- </combo_item>
- <combo_item name="low">
- Wenig Details
- </combo_item>
- <combo_item name="lowest">
- Wenigste Details
- </combo_item>
- </combo_box>
- </panel>
- </panel>
- <panel name="review_panel">
- <panel name="review_header_panel">
- <text name="review_header_text">
- Überprüfen
- </text>
- </panel>
- <panel name="review_content">
- <text name="review_prim_equiv">
- Auswirkung auf Parzelle/Region: Prim-Äquivalenzwert [EQUIV]
- </text>
- <text name="review_fee">
- Die für das Hochladen anfallende Gebühr in Höhe von L$ [FEE] wird von Ihrem Konto abgebucht.
- </text>
- <text name="review_confirmation">
- Durch Klicken auf „Hochladen“ bestätigen Sie, dass Sie die erforderlichen Rechte für das im Modell enthaltene Material besitzen.
- </text>
- </panel>
- </panel>
- <panel name="upload_panel">
- <panel name="upload_header_panel">
- <text name="upload_header_text">
- Upload abgeschlossen
- </text>
- </panel>
- <text name="model_uploaded_text">
- Ihr Modell wurde hochgeladen.
- </text>
- <text name="inventory_text">
- Sie finden das Modell im Objektordner Ihres Inventars.
- </text>
- <text name="charged_fee">
- Von Ihrem Konto wurden [FEE] L$ abgebucht.
- </text>
- </panel>
- <button label="&lt;&lt; Zurück" name="back"/>
- <button label="Weiter &gt;&gt;" name="next"/>
- <button label="Gewichte und Gebühr berechnen &gt;&gt;" name="calculate"/>
- <button label="Berechnen..." name="calculating"/>
- <button label="Hochladen" name="upload" tool_tip="An Simulator hochladen"/>
- <button label="Abbrechen" name="cancel"/>
- <button label="Schließen" name="close"/>
- <spinner name="import_scale" value="1,0"/>
- <string name="status_idle">
- Inaktiv
- </string>
- <string name="status_parse_error">
- DAE-Parsing-Fehler. Details siehe Protokoll.
- </string>
- <string name="status_reading_file">
- Laden...
- </string>
- <string name="status_generating_meshes">
- Netze werden generiert...
- </string>
- <string name="status_vertex_number_overflow">
- Fehler: Anzahl von Vertices überschreitet 65534. Operation abgebrochen.
- </string>
- <string name="bad_element">
- Fehler: ungültiges Element.
- </string>
- <string name="high">
- Hoch
- </string>
- <string name="medium">
- Mittel
- </string>
- <string name="low">
- Niedrig
- </string>
- <string name="lowest">
- Niedrigste
- </string>
- <string name="mesh_status_good">
- Ausliefern
- </string>
- <string name="mesh_status_na">
- --
- </string>
- <string name="mesh_status_none">
- Keine
- </string>
- <string name="mesh_status_submesh_mismatch">
- Detailstufen haben unterschiedliche Anzahl texturfähiger Flächen.
- </string>
- <string name="mesh_status_mesh_mismatch">
- Detailstufen haben unterschiedliche Anzahl von Netzinstanzen.
- </string>
- <string name="mesh_status_too_many_vertices">
- Detailstufe hat zu viele Vertices.
- </string>
- <string name="mesh_status_missing_lod">
- Erforderliche Detailstufe fehlt.
- </string>
- <string name="layer_all">
- Alle
- </string>
-</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_stats.xml b/indra/newview/skins/default/xui/de/floater_stats.xml
index f6dc9fe15d..92d057a4fe 100644
--- a/indra/newview/skins/default/xui/de/floater_stats.xml
+++ b/indra/newview/skins/default/xui/de/floater_stats.xml
@@ -14,8 +14,11 @@
<stat_bar label="Pro Sek. gezeichnete KTris" name="ktrissec"/>
<stat_bar label="Objektanzahl" name="objs"/>
<stat_bar label="Neue Objekte" name="newobjs"/>
+ <stat_bar label="Objektcache-Trefferrate" name="object_cache_hits"/>
</stat_view>
<stat_view label="Textur" name="texture">
+ <stat_bar label="Cache-Trefferrate" name="texture_cache_hits"/>
+ <stat_bar label="Cache-Leselatenz" name="texture_cache_read_latency"/>
<stat_bar label="Zählen" name="numimagesstat"/>
<stat_bar label="Rohanzahl" name="numrawimagesstat"/>
<stat_bar label="GL Sp" name="gltexmemstat"/>
diff --git a/indra/newview/skins/default/xui/de/floater_texture_ctrl.xml b/indra/newview/skins/default/xui/de/floater_texture_ctrl.xml
index 8944c79c7d..5bb96bebc4 100644
--- a/indra/newview/skins/default/xui/de/floater_texture_ctrl.xml
+++ b/indra/newview/skins/default/xui/de/floater_texture_ctrl.xml
@@ -1,24 +1,35 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="texture picker" title="TEXTUR AUSWÄHLEN">
- <string name="choose_picture">
+ <floater.string name="choose_picture">
Zum Auswählen eines Bildes hier klicken
- </string>
+ </floater.string>
+ <floater.string name="pick title">
+ Auswählen:
+ </floater.string>
<text name="Multiple">
Mehrere Texturen
</text>
+ <radio_group name="mode_selection">
+ <radio_item label="Inventar" name="inventory" value="0"/>
+ <radio_item label="Lokal" name="local" value="1"/>
+ </radio_group>
<text name="unknown">
Größe: [DIMENSIONS]
</text>
<button label="Standard" label_selected="Standard" name="Default"/>
- <button label="Keine" label_selected="Keine" name="None"/>
<button label="Leer" label_selected="Leer" name="Blank"/>
- <check_box label="Ordner anzeigen" name="show_folders_check"/>
- <search_editor label="Texturen filtern" name="inventory search editor"/>
- <check_box label="Jetzt übernehmen" name="apply_immediate_check"/>
+ <button label="Keine" label_selected="Keine" name="None"/>
<button label="" label_selected="" name="Pipette"/>
- <button label="Abbrechen" label_selected="Abbrechen" name="Cancel"/>
+ <filter_editor label="Texturen filtern" name="inventory search editor"/>
+ <check_box initial_value="false" label="Ordner anzeigen" name="show_folders_check"/>
+ <button label="Hinzufügen" label_selected="Hinzufügen" name="l_add_btn"/>
+ <button label="Entfernen" label_selected="Entfernen" name="l_rem_btn"/>
+ <button label="Hochladen" label_selected="Hochladen" name="l_upl_btn"/>
+ <scroll_list name="l_name_list">
+ <column label="Name" name="unit_name"/>
+ <column label="ID" name="unit_id_HIDDEN"/>
+ </scroll_list>
<button label="OK" label_selected="OK" name="Select"/>
- <text name="pick title">
- Auswählen:
- </text>
+ <button label="Abbrechen" label_selected="Abbrechen" name="Cancel"/>
+ <check_box initial_value="true" label="Jetzt übernehmen" name="apply_immediate_check"/>
</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_texture_fetch_debugger.xml b/indra/newview/skins/default/xui/de/floater_texture_fetch_debugger.xml
new file mode 100644
index 0000000000..0f407cb15c
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/floater_texture_fetch_debugger.xml
@@ -0,0 +1,62 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="TexFetchDebugger" title="Debugger für Texturabruffehler">
+ <text name="total_num_fetched_label">
+ 1, Gesamtzahl abgerufener Texturen: [NUM]
+ </text>
+ <text name="total_num_fetching_requests_label">
+ 2, Gesamtzahl von Abrufanforderungen: [NUM]
+ </text>
+ <text name="total_num_cache_hits_label">
+ 3, Gesamtzahl von Cachetreffern: [NUM]
+ </text>
+ <text name="total_num_visible_tex_label">
+ 4, Gesamtzahl sichtbarer Texturen: [NUM]
+ </text>
+ <text name="total_num_visible_tex_fetch_req_label">
+ 5, Gesamtzahl von Abrufanforderungen für sichtbare Texturen: [NUM]
+ </text>
+ <text name="total_fetched_data_label">
+ 6, Gesamtmenge abgerufener Daten: [SIZE1] KB, decodierte Daten: [SIZE2] KB, [PIXEL] MPixel
+ </text>
+ <text name="total_fetched_vis_data_label">
+ 7, Gesamtmenge sichtbarer Daten: [SIZE1] KB, decodierte Daten: [SIZE2] KB
+ </text>
+ <text name="total_fetched_rendered_data_label">
+ 8, Gesamtmenge dargestellter Daten: [SIZE1] KB, decodierte Daten: [SIZE2] KB, [PIXEL] MPixel
+ </text>
+ <text name="total_time_cache_read_label">
+ 9, Gesamtzeit Cache-Lesezugriffe: [TIME] s
+ </text>
+ <text name="total_time_cache_write_label">
+ 10, Gesamtzeit Cache-Schreibzugriffe: [TIME] s
+ </text>
+ <text name="total_time_decode_label">
+ 11, Gesamtzeit Decodierung: [TIME] s
+ </text>
+ <text name="total_time_gl_label">
+ 12, Gesamtzeit GL-Texturerstellung: [TIME] s
+ </text>
+ <text name="total_time_http_label">
+ 13, Gesamtzeit HTTP-Abrufe: [TIME] s
+ </text>
+ <text name="total_time_fetch_label">
+ 14, Gesamtzeit für alle Abrufe: [TIME] s
+ </text>
+ <text name="total_time_refetch_vis_cache_label">
+ 15, Neuabruf sichtbarer Texturen aus Cache, Zeit: [TIME] s, Abrufmenge: [SIZE2] KB, [PIXEL] MPixel
+ </text>
+ <text name="total_time_refetch_vis_http_label">
+ 16, Neuabruf sichtbarer Texturen von HTTP, Zeit: [TIME] s, Abrufmenge: [SIZE2] KB, [PIXEL] MPixel
+ </text>
+ <spinner label="17, Verhältnis Texel/Pixel:" name="texel_pixel_ratio"/>
+ <button label="Starten" name="start_btn"/>
+ <button label="Zurücksetzen" name="clear_btn"/>
+ <button label="Schließen" name="close_btn"/>
+ <button label="Cache-Lesezugriff" name="cacheread_btn"/>
+ <button label="Cache-Schreibzugriff" name="cachewrite_btn"/>
+ <button label="HTTP" name="http_btn"/>
+ <button label="Decodieren" name="decode_btn"/>
+ <button label="GL-Textur" name="gl_btn"/>
+ <button label="Neuabruf sichtbarer Texturen (Cache)" name="refetchviscache_btn"/>
+ <button label="Neuabruf sichtbarer Texturen (HTTP)" name="refetchvishttp_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_window_size.xml b/indra/newview/skins/default/xui/de/floater_window_size.xml
index a2a53e0567..6502f002a1 100644
--- a/indra/newview/skins/default/xui/de/floater_window_size.xml
+++ b/indra/newview/skins/default/xui/de/floater_window_size.xml
@@ -7,10 +7,17 @@
Fenstergröße einstellen:
</text>
<combo_box name="window_size_combo" tool_tip="Breite x Höhe">
- <combo_box.item label="1000 x 700 (Standard)" 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.item label="1000 x 700 (Standard)" name="item1"/>
+ <combo_box.item label="1024 x 768 (4:3 XGA)" name="item2"/>
+ <combo_box.item label="1280 x 720 (16:9 HDTV)" name="item3"/>
+ <combo_box.item label="1280 x 800 (5:8 WXGA)" name="item4"/>
+ <combo_box.item label="1280 x 1024 (5:4 SXGA)" name="item5"/>
+ <combo_box.item label="1440 x 900 (8:5 WSXGA)" name="item7"/>
+ <combo_box.item label="1600 x 900 (16:9 HD+)" name="item8"/>
+ <combo_box.item label="1600 x 1200 (4:3 UXGA)" name="item9"/>
+ <combo_box.item label="1680 x 1050 (8:5 WSXGA+)" name="item10"/>
+ <combo_box.item label="1920 x 1080 (16:9 HDTV)" name="item11"/>
+ <combo_box.item label="1920 x 1200 (8:5 WUXGA)" name="item12"/>
</combo_box>
<button label="Festlegen" name="set_btn"/>
<button label="Abbrechen" name="cancel_btn"/>
diff --git a/indra/newview/skins/default/xui/de/menu_viewer.xml b/indra/newview/skins/default/xui/de/menu_viewer.xml
index d011c7295c..c4c4defab9 100644
--- a/indra/newview/skins/default/xui/de/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/de/menu_viewer.xml
@@ -21,7 +21,6 @@
<menu_item_call label="Beschäftigt" name="Set Busy"/>
</menu>
<menu_item_call label="L$ kaufen..." name="Buy and Sell L$"/>
- <menu_item_call label="Händler-Outbox..." name="MerchantOutbox"/>
<menu_item_call label="Kontoübersicht..." name="Manage My Account">
<menu_item_call.on_click name="ManageMyAccount_url" parameter="WebLaunchJoinNow,http://secondlife.com/account/index.php?lang=de"/>
</menu_item_call>
@@ -227,11 +226,10 @@
<menu_item_check label="Textur" name="Texture Console"/>
<menu_item_check label="Fehler beseitigen" name="Debug Console"/>
<menu_item_call label="Meldungen" name="Notifications"/>
- <menu_item_check label="Texturgröße" name="Texture Size"/>
- <menu_item_check label="Texture-Kategorie" name="Texture Category"/>
<menu_item_check label="Schnelle Timer" name="Fast Timers"/>
<menu_item_check label="Speicher" name="Memory"/>
<menu_item_check label="Szenestatistiken" name="Scene Statistics"/>
+ <menu_item_call label="Debug-Konsole für Texturabruffehler" name="Texture Fetch Debug Console"/>
<menu_item_call label="Info zu Region in Fenster Fehler beseitigen" name="Region Info to Debug Console"/>
<menu_item_call label="Gruppeninfo in Fenster Fehler beseitigen" name="Group Info to Debug Console"/>
<menu_item_call label="Info zu Fähigkeiten in Fenster Fehler beseitigen" name="Capabilities Info to Debug Console"/>
@@ -289,6 +287,12 @@
<menu_item_check label="Komplexität beim Rendern" name="rendercomplexity"/>
<menu_item_check label="Byte in Anhängen" name="attachment bytes"/>
<menu_item_check label="Formen" name="Sculpt"/>
+ <menu label="Texturdichte" name="Texture Density">
+ <menu_item_check label="Keine" name="None"/>
+ <menu_item_check label="Aktuelle" name="Current"/>
+ <menu_item_check label="Gewünschte" name="Desired"/>
+ <menu_item_check label="Volle" name="Full"/>
+ </menu>
</menu>
<menu label="Rendering" name="Rendering">
<menu_item_check label="Achsen" name="Axes"/>
@@ -306,7 +310,6 @@
<menu_item_check label="Animationstexturen" name="Animation Textures"/>
<menu_item_check label="Texturen deaktivieren" name="Disable Textures"/>
<menu_item_check label="Voll-Res-Texturen" name="Rull Res Textures"/>
- <menu_item_check label="Texturen prüfen" name="Audit Textures"/>
<menu_item_check label="Textur-Atlas (experimentell)" name="Texture Atlas"/>
<menu_item_check label="Angehängte Lichter rendern" name="Render Attached Lights"/>
<menu_item_check label="Angehängte Partikel rendern" name="Render Attached Particles"/>
diff --git a/indra/newview/skins/default/xui/de/notifications.xml b/indra/newview/skins/default/xui/de/notifications.xml
index ac068fcd4e..a5923526e5 100644
--- a/indra/newview/skins/default/xui/de/notifications.xml
+++ b/indra/newview/skins/default/xui/de/notifications.xml
@@ -367,7 +367,7 @@ Sie müssen den Benutzernamen Ihres Avatars eingeben.
Sie benötigen ein Konto, um [SECOND_LIFE] betreten zu können. Möchten Sie jetzt ein Konto erstellen?
<url name="url">
- https://join.secondlife.com/index.php?lang=de-DE
+ [create_account_url]
</url>
<usetemplate name="okcancelbuttons" notext="Erneut versuchen" yestext="Neues Benutzerkonto anlegen"/>
</notification>
@@ -502,6 +502,15 @@ Weitere Informationen finden Sie auf [_URL].
</url>
<usetemplate ignoretext="Meine Hardware wird nicht unterstützt" name="okcancelignore" notext="Nein" yestext="Ja"/>
</notification>
+ <notification name="IntelOldDriver">
+ Wahrscheinlich gibt es einen neueren Treiber für Ihren Grafikchip. Durch Aktualisieren der Grafiktreiber lässt sich die Leistung u. U. beträchtlich verbessern.
+
+ Unter [_URL] nach aktualisierten Treibern suchen?
+ <url name="url">
+ http://www.intel.com/p/de_DE/support/detect/graphics
+ </url>
+ <usetemplate ignoretext="Mein Grafiktreiber ist veraltet" name="okcancelignore" notext="Nein" yestext="Ja"/>
+ </notification>
<notification name="UnknownGPU">
Ihr System verwendet eine Grafikkarte, die [APP_NAME] nicht erkennt.
Dies passiert dann, wenn die neue Hardware noch nicht mit [APP_NAME] getestet wurde. Wahrscheinlich wird das Programm richtig ausgeführt, aber Sie müssen eventuell ein paar Grafikeinstellungen vornehmen.
@@ -1181,7 +1190,6 @@ Sie können [SECOND_LIFE] normal verwenden. Andere Benutzer können Sie korrekt
Installation von [APP_NAME] vollständig abgeschlossen.
Falls Sie [SECOND_LIFE] zum ersten Mal verwenden, müssen Sie zuerst ein Konto erstellen, bevor Sie sich anmelden können.
-Zurück zu [http://join.secondlife.com secondlife.com], um ein neues Konto zu erstellen?
<usetemplate name="okcancelbuttons" notext="Weiter" yestext="Neues Konto..."/>
</notification>
<notification name="LoginPacketNeverReceived">
@@ -2628,16 +2636,12 @@ Ist das OK?
</form>
</notification>
<notification name="ScriptQuestionCaution">
- Das Objekt „&lt;nolink&gt;[OBJECTNAME]&lt;/nolink&gt;“, das „[NAME]“ gehört, stellt folgende Anfrage:
-
-[QUESTIONS]
-Wenn Sie diesem Objekt und seinem Ersteller nicht vertrauen, sollten Sie diese Anfrage ablehnen.
-
-Anfrage gestatten?
+ Achtung: Das Objekt „&lt;nolink&gt;[OBJECTNAME]&lt;/nolink&gt;“ fordert uneingeschränkten Zugriff auf Ihr Linden-Dollar-Konto an. Wenn Sie Zugriff gewähren, kann dieses Objekt jederzeit und ohne weitere Warnung Ihr Konto belasten bzw. ganz leeren.
+
+Eine solche Anforderung ist nur in seltenen Fällen legitim. Gewähren Sie dem Objekt nur dann Zugriff, wenn Sie genau verstehen, wieso ein solcher Zugriff auf Ihr Konto erforderlich ist.
<form name="form">
- <button name="Grant" text="Gewähren"/>
+ <button name="Grant" text="Uneingeschränkten Zugriff gewähren"/>
<button name="Deny" text="Verweigern"/>
- <button name="Details" text="Info..."/>
</form>
</notification>
<notification name="ScriptDialog">
@@ -3135,4 +3139,16 @@ Ansonsten können Sie auf der Karte nachsehen und dort Ort suchen, die als „In
<global name="You died and have been teleported to your home location">
Sie sind gestorben und wurden zu Ihrem Zuhause teleportiert.
</global>
+ <notification name="LocalBitmapsUpdateFileNotFound">
+ [FNAME] wurde nicht gefunden und konnte deshalb nicht aktualisiert werden.
+Zukünftige Aktualisierungen dieser Datei werden deaktiviert.
+ </notification>
+ <notification name="LocalBitmapsUpdateFailedFinal">
+ [FNAME] konnte auch nach [NRETRIES] Versuchen nicht geöffnet oder decodiert werden und gilt als beschädigt.
+Zukünftige Aktualisierungen dieser Datei werden deaktiviert.
+ </notification>
+ <notification name="LocalBitmapsVerifyFail">
+ Versuch, eine ungültige oder nicht lesbare Bilddatei ([FNAME]) hinzuzufügen, die nicht geöffnet oder decodiert werden konnte.
+Versuch abgebrochen.
+ </notification>
</notifications>
diff --git a/indra/newview/skins/default/xui/de/panel_login.xml b/indra/newview/skins/default/xui/de/panel_login.xml
index 553bd3e2ff..2203b6d310 100644
--- a/indra/newview/skins/default/xui/de/panel_login.xml
+++ b/indra/newview/skins/default/xui/de/panel_login.xml
@@ -1,13 +1,13 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="panel_login">
- <panel.string name="create_account_url">
- http://de.secondlife.com/registration/
- </panel.string>
<panel.string name="forgot_password_url">
http://secondlife.com/account/request.php?lang=de
</panel.string>
<layout_stack name="login_widgets">
<layout_panel name="login">
+ <text name="log_in_text">
+ ANMELDEN
+ </text>
<text name="username_text">
Benutzername:
</text>
@@ -15,15 +15,8 @@
<text name="password_text">
Kennwort:
</text>
- <check_box label="Kennwort merken" name="remember_check"/>
- <button label="Anmelden" name="connect_btn"/>
- <text name="mode_selection_text">
- Modus:
- </text>
- <combo_box name="mode_combo" tool_tip="Wählen Sie den gewünschten Modus aus. Basis: Second Life schnell und einfach erkunden und chatten. Erweitert: Zugriff auf zusätzliche Funktionen.">
- <combo_box.item label="Basis" name="Basic"/>
- <combo_box.item label="Erweitert" name="Advanced"/>
- </combo_box>
+ </layout_panel>
+ <layout_panel name="start_location_panel">
<text name="start_location_text">
Hier anfangen:
</text>
@@ -33,16 +26,21 @@
<combo_box.item label="&lt;Region eingeben&gt;" name="Typeregionname"/>
</combo_box>
</layout_panel>
- <layout_panel name="links">
- <text name="create_new_account_text">
- Registrieren
+ <layout_panel name="links_login_panel">
+ <text name="login_help">
+ Sie brauchen Hilfe?
</text>
<text name="forgot_password_text">
Benutzernamen oder Kennwort vergessen?
</text>
- <text name="login_help">
- Sie brauchen Hilfe?
+ <button label="Anmelden" name="connect_btn"/>
+ <check_box label="Kennwort merken" name="remember_check"/>
+ </layout_panel>
+ <layout_panel name="links">
+ <text name="create_account_text">
+ CREATE YǾUR ACCǾUNT
</text>
+ <button name="create_new_account_btn" label="Registrieren"/>
</layout_panel>
</layout_stack>
</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_script_question_toast.xml b/indra/newview/skins/default/xui/de/panel_script_question_toast.xml
new file mode 100644
index 0000000000..a2d0237da0
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/panel_script_question_toast.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<panel label="script_question_panel" name="panel_script_question_toast">
+ <panel label="buttons_panel" name="buttons_panel"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_volume_pulldown.xml b/indra/newview/skins/default/xui/de/panel_volume_pulldown.xml
new file mode 100644
index 0000000000..e6ab9165d7
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/panel_volume_pulldown.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<panel name="volumepulldown_floater" width="240">
+ <button left="217" name="prefs_btn"/>
+ <slider label="Master" name="System Volume" label_width="80" width="180"/>
+ <slider label="Schaltflächen" label_width="80" width="180" name="UI Volume"/>
+ <slider label="Umgebung" label_width="80" width="180" name="Wind Volume"/>
+ <slider label="Soundeffekte" label_width="80" width="180" name="SFX Volume"/>
+ <check_box name="gesture_audio_play_btn" tool_tip="Sounds von Gesten abspielen"/>
+ <slider label="Musikstream" label_width="80" width="180" name="Music Volume"/>
+ <check_box tool_tip="Musikstream aktivieren" name="enable_music"/>
+ <slider label="Medien" label_width="80" width="180" name="Media Volume"/>
+ <check_box tool_tip="Medienstream aktivieren" name="enable_media"/>
+ <slider label="Voice-Chat" label_width="80" width="180" name="Voice Volume"/>
+ <check_box tool_tip="Voice-Chat aktivieren" name="enable_voice_check"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/de/strings.xml b/indra/newview/skins/default/xui/de/strings.xml
index d917d33d12..668a7b35bf 100644
--- a/indra/newview/skins/default/xui/de/strings.xml
+++ b/indra/newview/skins/default/xui/de/strings.xml
@@ -886,6 +886,9 @@ Warten Sie kurz und versuchen Sie dann noch einmal, sich anzumelden.
<string name="ScriptQuestionCautionChatDenied">
Dem Objekt „[OBJECTNAME]“, ein Objekt von „[OWNERNAME]“, in [REGIONNAME] [REGIONPOS], wurde folgende Berechtigung verweigert: [PERMISSIONS].
</string>
+ <string name="AdditionalPermissionsRequestHeader">
+ Wenn Sie dem Objekt Zugriff auf Ihr Konto gewähren, kann dieses außerdem:
+ </string>
<string name="ScriptTakeMoney">
Linden-Dollar (L$) von Ihnen nehmen
</string>
@@ -919,6 +922,9 @@ Warten Sie kurz und versuchen Sie dann noch einmal, sich anzumelden.
<string name="ControlYourCamera">
Kamerasteuerung
</string>
+ <string name="TeleportYourAgent">
+ Sie teleportieren
+ </string>
<string name="NotConnected">
Nicht verbunden
</string>
diff --git a/indra/newview/skins/default/xui/en/floater_about.xml b/indra/newview/skins/default/xui/en/floater_about.xml
index 060d889003..63eb87f27a 100644
--- a/indra/newview/skins/default/xui/en/floater_about.xml
+++ b/indra/newview/skins/default/xui/en/floater_about.xml
@@ -196,27 +196,26 @@ Dummy Name replaced at run time
top="5"
width="435"
word_wrap="true">
- 3Dconnexion SDK Copyright (C) 1992-2007 3Dconnexion
- APR Copyright (C) 2000-2004 The Apache Software Foundation
- Collada DOM Copyright 2005 Sony Computer Entertainment Inc.
- cURL Copyright (C) 1996-2002, Daniel Stenberg, (daniel@haxx.se)
+ 3Dconnexion SDK Copyright (C) 1992-2009 3Dconnexion
+ APR Copyright (C) 2011 The Apache Software Foundation
+ Collada DOM Copyright 2006 Sony Computer Entertainment Inc.
+ cURL Copyright (C) 1996-2010, 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).
+ FreeType Copyright (C) 1996-2002, 2006 David Turner, Robert Wilhelm, and Werner Lemberg.
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
+ ogg/vorbis Copyright (C) 2002, Xiphophorus
+ OpenSSL Copyright (C) 1998-2008 The OpenSSL Project.
+ PCRE Copyright (c) 1997-2012 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.
+ zlib Copyright (C) 1995-2012 Jean-loup Gailly and Mark Adler.
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.
diff --git a/indra/newview/skins/default/xui/en/floater_about_land.xml b/indra/newview/skins/default/xui/en/floater_about_land.xml
index fb123ec4d1..793a6e6fa1 100644
--- a/indra/newview/skins/default/xui/en/floater_about_land.xml
+++ b/indra/newview/skins/default/xui/en/floater_about_land.xml
@@ -1354,79 +1354,13 @@ Only large parcels can be listed in search.
top="150"
width="430" />
<combo_box
- enabled="false"
- height="23"
- layout="topleft"
- left="20"
- top="194"
- name="land category with adult"
- visible="false"
- width="140">
- <combo_box.item
- label="Any Category"
- name="item0"
- value="any" />
- <combo_box.item
- label="Linden Location"
- name="item1"
- value="linden" />
- <combo_box.item
- label="Adult"
- name="item2"
- value="adult" />
- <combo_box.item
- label="Arts &amp; Culture"
- name="item3"
- value="arts" />
- <combo_box.item
- label="Business"
- name="item4"
- value="store" />
- <combo_box.item
- label="Educational"
- name="item5"
- value="educational" />
- <combo_box.item
- label="Gaming"
- name="item6"
- value="game" />
- <combo_box.item
- label="Hangout"
- name="item7"
- value="gather" />
- <combo_box.item
- label="Newcomer Friendly"
- name="item8"
- value="newcomer" />
- <combo_box.item
- label="Parks &amp; Nature"
- name="item9"
- value="park" />
- <combo_box.item
- label="Residential"
- name="item10"
- value="home" />
- <combo_box.item
- label="Shopping"
- name="item11"
- value="shopping" />
- <combo_box.item
- label="Rental"
- name="item13"
- value="rental" />
- <combo_box.item
- label="Other"
- name="item12"
- value="other" />
- </combo_box>
- <combo_box
- enabled="false"
+ enabled="true"
height="23"
layout="topleft"
left="20"
top="194"
name="land category"
- visible="false"
+ visible="true"
width="140">
<combo_box.item
label="Any Category"
@@ -1989,11 +1923,11 @@ Only large parcels can be listed in search.
<check_box
follows="top|left"
height="16"
- label="Have been age-verified [ESTATE_AGE_LIMIT]"
+ label="Are age 18 or older [ESTATE_AGE_LIMIT]"
layout="topleft"
left_delta="0"
name="limit_age_verified"
- tool_tip="Residents must be age verified to access this parcel. See the [SUPPORT_SITE] for more information."
+ tool_tip="Residents must be age 18 or older to access this parcel. See the [SUPPORT_SITE] for more information."
top_pad="4"
width="278" />
<check_box
diff --git a/indra/newview/skins/default/xui/en/floater_autoreplace.xml b/indra/newview/skins/default/xui/en/floater_autoreplace.xml
new file mode 100644
index 0000000000..0bfefc8abe
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/floater_autoreplace.xml
@@ -0,0 +1,289 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<floater
+ border="true"
+ can_close="true"
+ can_minimize="true"
+ can_resize="false"
+ help_topic="autoreplace_settings"
+ save_rect="true"
+ height="455"
+ width="490"
+ name="autoreplace_floater"
+ title="Auto-Replace Settings">
+ <check_box
+ bottom_delta="30"
+ left_delta="15"
+ height="16"
+ width="100"
+ follows="left|top"
+ label="Enable Auto-Replace"
+ name="autoreplace_enable"
+ tool_tip="As you enter chat text, replace any of the keywords entered with the corresponding replacement"/>
+ <view_border
+ top_pad="15"
+ left="2"
+ height="0"
+ width="491"
+ follows="left|top"
+ bevel_style="none"
+ border_thickness="1"
+ mouse_opaque="false"
+ name="divisor1"/>
+ <button
+ top_pad="10"
+ left="10"
+ height="22"
+ width="110"
+ enabled="true"
+ follows="left|top"
+ mouse_opaque="true"
+ halign="center"
+ scale_image="true"
+ name="autoreplace_import_list"
+ label="Import List..."
+ tool_tip="Load a previously exported list from a file."/>
+ <button
+ top_delta="0"
+ left_pad="10"
+ height="22"
+ width="110"
+ enabled="true"
+ follows="left|top"
+ mouse_opaque="true"
+ halign="center"
+ scale_image="true"
+ name="autoreplace_export_list"
+ label="Export List..."
+ tool_tip="Save the selected list to a file so you can share it."/>
+ <button
+ top_delta="0"
+ left_pad="10"
+ height="22"
+ width="110"
+ enabled="true"
+ follows="left|top"
+ mouse_opaque="true"
+ halign="center"
+ scale_image="true"
+ name="autoreplace_new_list"
+ label="New List..."
+ tool_tip="Create a new list."/>
+ <button
+ top_delta="0"
+ left_pad="10"
+ height="22"
+ width="110"
+ enabled="true"
+ follows="left|top"
+ mouse_opaque="true"
+ halign="center"
+ scale_image="true"
+ name="autoreplace_delete_list"
+ label="Delete List"
+ tool_tip="Delete the selected list."/>
+ <scroll_list
+ top_pad="10"
+ left="10"
+ height="100"
+ width="370"
+ follows="left|top"
+ column_padding="0"
+ draw_heading="false"
+ multi_select="false"
+ name="autoreplace_list_name"
+ search_column="0">
+ </scroll_list>
+ <button
+ top_delta="23"
+ left_pad="10"
+ height="22"
+ width="90"
+ enabled="true"
+ follows="left|top"
+ mouse_opaque="true"
+ halign="center"
+ scale_image="true"
+ name="autoreplace_list_up"
+ image_overlay="Arrow_Up"
+ tool_tip="Move this list up in priority."/>
+ <button
+ top_pad="10"
+ left_delta="0"
+ height="22"
+ width="90"
+ enabled="true"
+ follows="left|top"
+ mouse_opaque="true"
+ halign="center"
+ scale_image="true"
+ name="autoreplace_list_down"
+ image_overlay="Arrow_Down"
+ tool_tip="Move this list down in priority."/>
+ <view_border
+ top_pad="36"
+ left="2"
+ height="0"
+ width="491"
+ follows="left|top"
+ bevel_style="none"
+ border_thickness="1"
+ mouse_opaque="false"
+ name="divisor2"/>
+ <scroll_list
+ top_pad="10"
+ left="10"
+ height="120"
+ width="370"
+ follows="left|top"
+ column_padding="0"
+ draw_heading="true"
+ multi_select="true"
+ name="autoreplace_list_replacements"
+ search_column="0">
+ <scroll_list.columns
+ label="Keyword"
+ name="keyword"
+ relative_width="0.30" />
+ <scroll_list.columns
+ label="Replacement"
+ name="replacement"
+ relative_width="0.70" />
+ </scroll_list>
+ <button
+ top_delta="41"
+ left_pad="10"
+ height="22"
+ width="90"
+ enabled="true"
+ follows="left|top"
+ mouse_opaque="true"
+ halign="center"
+ scale_image="true"
+ name="autoreplace_add_entry"
+ label="Add..."/>
+ <button
+ top_pad="10"
+ left_delta="0"
+ height="22"
+ width="90"
+ enabled="true"
+ follows="left|top"
+ mouse_opaque="true"
+ halign="center"
+ scale_image="true"
+ name="autoreplace_delete_entry"
+ label="Remove"/>
+ <view_border
+ top_pad="38"
+ left="2"
+ height="0"
+ width="491"
+ follows="left|top"
+ bevel_style="none"
+ border_thickness="1"
+ mouse_opaque="false"
+ name="divisor3"/>
+ <text
+ type="string"
+ follows="left|top"
+ height="16"
+ layout="topleft"
+ left="10"
+ top_pad="13"
+ width="50">
+ Keyword:
+ </text>
+ <line_editor
+ name="autoreplace_keyword"
+ follows="left|top"
+ height="23"
+ layout="topleft"
+ left="100"
+ max_length_bytes="255"
+ top_delta="-5"
+ width="150"
+ />
+ <text
+ type="string"
+ follows="left|top"
+ height="16"
+ layout="topleft"
+ left="10"
+ right="90"
+ top_pad="10"
+ >
+ Replacement:
+ </text>
+ <line_editor
+ name="autoreplace_replacement"
+ follows="left|top"
+ height="23"
+ layout="topleft"
+ left="100"
+ max_length_bytes="255"
+ top_delta="-5"
+ width="280"
+ />
+ <button
+ top_delta="0"
+ right="-10"
+ height="22"
+ width="90"
+ enabled="false"
+ follows="left|top"
+ mouse_opaque="true"
+ halign="center"
+ scale_image="true"
+ name="autoreplace_save_entry"
+ label="Save Entry"
+ tool_tip="Save this entry."/>
+ <view_border
+ top_pad="10"
+ left="2"
+ height="0"
+ width="491"
+ follows="left|top"
+ bevel_style="none"
+ border_thickness="1"
+ mouse_opaque="false"
+ name="divisor4"/>
+ <button
+ top_pad="10"
+ right="380"
+ height="22"
+ width="90"
+ enabled="true"
+ follows="left|top"
+ mouse_opaque="true"
+ halign="center"
+ scale_image="true"
+ name="autoreplace_save_changes"
+ label="Save Changes"
+ tool_tip="Save all changes."/>
+ <button
+ top_delta="0"
+ right="480"
+ height="22"
+ width="90"
+ enabled="true"
+ follows="left|top"
+ mouse_opaque="true"
+ halign="center"
+ scale_image="true"
+ name="autoreplace_cancel"
+ label="Cancel"
+ tool_tip="Discard all changes."/>
+</floater>
+<!--
+ <text
+ top_pad="10"
+ left="10"
+ height="16"
+ width="260"
+ follows="left|top"
+ halign="center"
+ mouse_opaque="true"
+ name="autoreplace_text2">
+ Entries
+ </text>
+-->
diff --git a/indra/newview/skins/default/xui/en/floater_chat_bar.xml b/indra/newview/skins/default/xui/en/floater_chat_bar.xml
index 688a01ce7b..405557242f 100644
--- a/indra/newview/skins/default/xui/en/floater_chat_bar.xml
+++ b/indra/newview/skins/default/xui/en/floater_chat_bar.xml
@@ -46,6 +46,7 @@
left="0"
max_length_bytes="1023"
name="chat_box"
+ spellcheck="true"
text_pad_left="5"
text_pad_right="25"
tool_tip="Press Enter to say, Ctrl+Enter to shout"
diff --git a/indra/newview/skins/default/xui/en/floater_im_session.xml b/indra/newview/skins/default/xui/en/floater_im_session.xml
index ca73883e53..040b66623e 100644
--- a/indra/newview/skins/default/xui/en/floater_im_session.xml
+++ b/indra/newview/skins/default/xui/en/floater_im_session.xml
@@ -46,7 +46,7 @@
tab_group="2"
top="0"
height="200"
- width="254"
+ width="244"
user_resize="true">
<button
height="20"
@@ -73,18 +73,20 @@
parse_highlights="true"
parse_urls="true"
left="1"
- width="249">
+ width="238">
</chat_history>
<line_editor
bottom="0"
+ left="3"
follows="left|right|bottom"
font="SansSerifSmall"
height="20"
label="To"
layout="bottomleft"
name="chat_editor"
+ spellcheck="true"
tab_group="3"
- width="249">
+ width="236">
</line_editor>
</layout_panel>
</layout_stack>
diff --git a/indra/newview/skins/default/xui/en/floater_model_preview.xml b/indra/newview/skins/default/xui/en/floater_model_preview.xml
index 0e211551e6..5e92a12251 100644
--- a/indra/newview/skins/default/xui/en/floater_model_preview.xml
+++ b/indra/newview/skins/default/xui/en/floater_model_preview.xml
@@ -1,8 +1,16 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater can_close="true" can_drag_on_left="false" can_minimize="false"
- can_resize="false" height="480" min_height="480" min_width="940"
- name="Model Preview" title="UPLOAD MODEL" width="940"
- help_topic="upload_model" >
+<floater
+ can_close="true"
+ can_drag_on_left="false"
+ can_minimize="false"
+ can_resize="false"
+ height="480"
+ min_height="480"
+ width="980"
+ min_width="980"
+ name="Model Preview"
+ title="UPLOAD MODEL"
+ help_topic="upload_model" >
<string name="status_idle"></string>
<string name="status_parse_error">Error: Dae parsing issue - see log for details.</string>
@@ -98,7 +106,7 @@
top_pad="15"
left="0"
height="300"
- width="625"
+ width="635"
name="import_tab"
tab_position="top">
<!-- LOD PANEL -->
@@ -116,13 +124,13 @@
left="3"
name="lod_tab_border"
top_pad="0"
- width="619" />
+ width="629" />
<text
follows="left|top"
height="18"
initial_value="Source"
layout="topleft"
- left="75"
+ left="85"
name="source"
text_color="ModelUploaderLabels"
top="15"
@@ -165,7 +173,7 @@
top_pad="10"
valign="top"
value="High"
- width="65" />
+ width="75" />
<combo_box
follows="top|left"
height="20"
@@ -175,10 +183,10 @@
top_delta="-3"
width="135">
<item
- id="Load from file"
+ name="Load from file"
value="Load from file" />
<item
- id="Generate"
+ name="Generate"
value="Generate" />
</combo_box>
<line_editor
@@ -210,10 +218,10 @@
visible="false"
width="135">
<item
- id="Triangle Limit"
+ name="Triangle Limit"
value="Triangle Limit" />
<item
- id="Error Threshold"
+ name="Error Threshold"
value="Error Threshold" />
</combo_box>
<spinner
@@ -290,7 +298,7 @@
top_pad="15"
valign="top"
value="Medium"
- width="65" />
+ width="75" />
<combo_box
follows="top|left"
height="20"
@@ -300,13 +308,13 @@
top_delta="-3"
width="135">
<item
- id="Load from file"
+ name="Load from file"
value="Load from file" />
<item
- id="Generate"
+ name="Generate"
value="Generate" />
<item
- id="Use LoD above"
+ name="Use LoD above"
value="Use LoD above" />
</combo_box>
<line_editor
@@ -339,10 +347,10 @@
top_delta="0"
width="135">
<item
- id="Triangle Limit"
+ name="Triangle Limit"
value="Triangle Limit" />
<item
- id="Error Threshold"
+ name="Error Threshold"
value="Error Threshold" />
</combo_box>
<spinner
@@ -418,7 +426,7 @@
top_pad="15"
valign="top"
value="Low"
- width="65" />
+ width="75" />
<combo_box
follows="top|left"
height="20"
@@ -428,13 +436,13 @@
top_delta="-3"
width="135">
<item
- id="Load from file"
+ name="Load from file"
value="Load from file" />
<item
- id="Generate"
+ name="Generate"
value="Generate" />
<item
- id="Use LoD above"
+ name="Use LoD above"
value="Use LoD above" />
</combo_box>
<line_editor
@@ -467,10 +475,10 @@
top_delta="0"
width="135">
<item
- id="Triangle Limit"
+ name="Triangle Limit"
value="Triangle Limit" />
<item
- id="Error Threshold"
+ name="Error Threshold"
value="Error Threshold" />
</combo_box>
<spinner
@@ -546,7 +554,7 @@
top_pad="15"
valign="top"
value="Lowest"
- width="65" />
+ width="75" />
<combo_box
follows="top|left"
height="20"
@@ -556,13 +564,13 @@
top_delta="-3"
width="135">
<item
- id="Load from file"
+ name="Load from file"
value="Load from file" />
<item
- id="Generate"
+ name="Generate"
value="Generate" />
<item
- id="Use LoD above"
+ name="Use LoD above"
value="Use LoD above" />
</combo_box>
<line_editor
@@ -595,10 +603,10 @@
top_delta="0"
width="135">
<item
- id="Triangle Limit"
+ name="Triangle Limit"
value="Triangle Limit" />
<item
- id="Error Threshold"
+ name="Error Threshold"
value="Error Threshold" />
</combo_box>
<spinner
@@ -1201,7 +1209,7 @@
name="calculate_btn"
top="3"
height="20"
- width="150"
+ width="165"
tool_tip="Calculate weights &amp;fee"/>
<button
follows="top|left"
@@ -1234,7 +1242,7 @@
right="-2"
top="3"
height="20"
- width="155"/>
+ width="275"/>
<!-- ========== WEIGHTS ==========-->
<text
follows="top|left"
@@ -1343,7 +1351,7 @@
layout="topleft"
name="right_panel"
top_pad="5"
- width="290">
+ width="340">
<combo_box
top_pad="3"
follows="left|top"
diff --git a/indra/newview/skins/default/xui/en/floater_model_wizard.xml b/indra/newview/skins/default/xui/en/floater_model_wizard.xml
deleted file mode 100644
index 62b8c5f96e..0000000000
--- a/indra/newview/skins/default/xui/en/floater_model_wizard.xml
+++ /dev/null
@@ -1,841 +0,0 @@
-<?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="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="choose_file_header_panel"
- bg_opaque_color="DkGray2"
- background_visible="true"
- background_opaque="true"
- left="15">
- <text
- width="200"
- left="10"
- top="3"
- name="choose_file_header_text"
- text_color="White"
- height="10"
- font="SansSerifBig"
- layout="topleft">
- Choose model file
- </text>
- </panel>
- <panel
- top_pad="14"
- left="15"
- height="310"
- width="505"
- name="choose_file_content"
- bg_opaque_color="DkGray2"
- background_visible="true"
- background_opaque="true">
- <text
- height="32"
- left="10"
- name="advanced_users_text"
- text_color="White"
- top="15"
- width="320"
- word_wrap="true">
- Advanced users: If you are familiar with 3D content creation tools you may wish to use the Advanced Uploader.
- </text>
- <button
- follows="left|top"
- height="20"
- label="Switch to Advanced"
- layout="topleft"
- left_delta="0"
- name="switch_to_advanced"
- top_pad="5"
- width="130">
- </button>
- <text
- type="string"
- length="1"
- text_color="White"
- follows="left|top"
- top_pad="30"
- height="10"
- layout="topleft"
- left_delta="0"
- name="Cache location"
- width="320">
- Choose model file to upload
- </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="230" />
- <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
- type="string"
- length="1"
- text_color="White"
- follows="left|top"
- top_pad="5"
- height="10"
- layout="topleft"
- left="10"
- name="Model types"
- width="320">
- Second Life supports COLLADA (.dae) files
- </text>
- <!-- Placeholder panel for 3D preview render -->
- <panel
- top="30"
- right="-10"
- name="choose_file_preview_panel"
- bevel_style="none"
- highlight_light_color="0.09 0.09 0.09 1"
- border="true"
- border_style="line"
- height="150"
- follows="all"
- width="150">
- </panel>
- <text
- top_pad="10"
- width="130"
- height="14"
- left_delta="0"
- 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_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
- height="16"
- left="10"
- name="warning_label"
- text_color="Yellow"
- top="200"
- visible="false"
- width="320">
- WARNING:
- </text>
- <text
- height="50"
- left="10"
- name="warning_text"
- top_pad="0"
- visible="false"
- width="320"
- word_wrap="true">
- You will not be able to complete the final step of uploading this model to the Second Life servers. [secondlife:///app/floater/learn_more Find out how] to set up your account for mesh model uploads.
- </text>
- </panel>
- </panel>
-
-
- <panel
- height="388"
- top_delta="0"
- name="optimize_panel"
- visible="true"
- width="535"
- left="0">
- <panel
- height="22"
- top_pad="15"
- name="optimize_header_panel"
- width="505"
- bg_opaque_color="DkGray2"
- background_visible="true"
- background_opaque="true"
- left="15">
- <text
- width="200"
- left="10"
- name="optimize_header_text"
- top="3"
- text_color="White"
- height="10"
- font="SansSerifBig"
- layout="topleft">
- Optimize model
- </text>
- </panel>
- <text
- top_pad="14"
- width="460"
- height="20"
- font="SansSerifSmall"
- layout="topleft"
- name="optimize_description"
- word_wrap="true"
- left_delta="5">
- We have optimized the model for performance. Adjust it further if you wish.
- </text>
- <panel
- top_delta="40"
- visible="false"
- left="15"
- height="270"
- width="505"
- name="optimize_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="69" left="10" text_color="White" font="SansSerifSmallBold" width="120" height="16" wrap="true">Performance</text>
- <text top="85" left="10" width="120" word_wrap="true" font="SansSerifSmall" height="40">Faster rendering
-Less detail
-Lower prim weight</text>
- <text top="69" left="184" text_color="White" font="SansSerifSmallBold" width="120" height="16" wrap="true">Accuracy</text>
- <text top="85" left="184" width="120" word_wrap="true" font="SansSerifSmall" height="40">Slower rendering
-More detail
-Higher prim weight</text>
-
- <slider
- follows="left|top"
- height="20"
- increment="1"
- layout="topleft"
- left="10"
- max_val="2"
- initial_value="1"
- min_val="0"
- name="accuracy_slider"
- show_text="false"
- top="130"
- width="290" />
- <text
- font="SansSerifSmall"
- top_pad="0"
- width="5"
- left_delta="6"
- height="4">'
- </text>
- <text
- font="SansSerifSmall"
- top_delta="0"
- width="5"
- left_delta="137"
- height="4">'
- </text>
- <text
- font="SansSerifSmall"
- top_delta="0"
- width="5"
- left_delta="137"
- height="4">'
- </text>
- <button
- follows="left|top"
- height="20"
- label="Recalculate Geometry"
- layout="topleft"
- left="80"
- name="recalculate_geometry_btn"
- top_pad="15"
- width="150">
- </button>
- <text top="10" right="-10" width="185" text_color="White" follows="left|top" height="15" name="lod_label">
- Geometry preview
- </text>
- <panel
- right="-10"
- top="32"
- name="optimize_preview_panel"
- bevel_style="none"
- highlight_light_color="0.09 0.09 0.09 1"
- border_style="line"
- border="true"
- height="185"
- follows="all"
- width="185">
- </panel>
- <combo_box left_delta="75" top_pad="10" follows="left|top" list_position="below" height="22"
- name="preview_lod_combo" width="110" tool_tip="LOD to view in preview render">
- <combo_item name="high">
- High detail
- </combo_item>
- <combo_item name="medium">
- Medium detail
- </combo_item>
- <combo_item name="low">
- Low detail
- </combo_item>
- <combo_item name="lowest">
- Lowest detail
- </combo_item>
- </combo_box>
- </panel>
- </panel>
-
- <panel
- height="388"
- top_delta="0"
- name="physics_panel"
- visible="false"
- width="535"
- left="0">
- <panel
- height="22"
- top_pad="15"
- name="physics_header_panel"
- width="505"
- bg_opaque_color="DkGray2"
- background_visible="true"
- background_opaque="true"
- left="15">
- <text
- width="200"
- left="10"
- name="physics_header_text"
- top="3"
- height="10"
- font="SansSerifBig"
- text_color="White"
- layout="topleft">
- Adjust physics
- </text>
- </panel>
- <text
- top_pad="10"
- width="474"
- height="50"
- font="SansSerifSmall"
- layout="topleft"
- name="physics_description"
- word_wrap="true"
- left_delta="5">
- We will create a shape for the outer hull of the model. Adjust the shape's detail level as needed for the intended purpose of your model.
- </text>
- <panel
- top_delta="44"
- left="15"
- height="270"
- width="505"
- name="physics_content"
- bg_opaque_color="DkGray2"
- background_visible="true"
- background_opaque="true">
- <text top="10" left="10" text_color="White" font="SansSerifSmallBold" width="120" halign="right" height="16" wrap="true">Performance</text>
- <text top="26" left="10" width="120" word_wrap="true" font="SansSerifSmall" halign="right" height="40">Faster rendering
-Less detail
-Lower prim weight</text>
- <text top="174" left="10" text_color="White" font="SansSerifSmallBold" width="120" halign="right" height="16" wrap="true">Accuracy</text>
- <text top="190" left="10" width="120" word_wrap="true" font="SansSerifSmall" halign="right" height="40">Slower rendering
-More detail
-Higher prim weight</text>
-
- <slider
- follows="left|top"
- height="190"
- increment=".1"
- layout="topleft"
- left="140"
- max_val="1"
- initial_value="0.5"
- min_val="0"
- name="physics_slider"
- orientation="vertical"
- show_text="false"
- top="25"
- width="22" />
- <text top="10" width="120" word_wrap="true" left_pad="10" height="50">Examples:
-Moving objects
-Flying objects
-Vehicles</text>
- <text top="95" width="120" word_wrap="true" left_delta="0" height="50">Examples:
-Small static objects
-Less detailed objects
-Simple furniture</text>
- <text top="180" width="120" word_wrap="true" left_delta="0" height="50">Examples:
-Static objects
-Detailed objects
-Buildings</text>
- <button
- follows="left|top"
- height="20"
- label="Recalculate physics"
- layout="topleft"
- left="80"
- name="recalculate_physics_btn"
- top_pad="10"
- width="150">
- </button>
- <button
- enabled="false"
- follows="left|top"
- height="20"
- label="Recalculating..."
- layout="topleft"
- left_delta="0"
- name="recalculating_physics_btn"
- top_delta="0"
- visible="false"
- width="150">
- </button>
- <text top="10" right="-10" width="185" text_color="White" follows="left|top" height="15" name="lod_label">
- Physics preview
- </text>
- <panel
- right="-10"
- top="32"
- name="physics_preview_panel"
- bevel_style="none"
- highlight_light_color="0.09 0.09 0.09 1"
- border_style="line"
- border="true"
- height="185"
- follows="all"
- width="185">
- </panel>
- <combo_box left_delta="75" top_pad="10" follows="left|top" list_position="below" height="22"
- name="preview_lod_combo2" width="110" tool_tip="LOD to view in preview render">
- <combo_item name="high">
- High detail
- </combo_item>
- <combo_item name="medium">
- Medium detail
- </combo_item>
- <combo_item name="low">
- Low detail
- </combo_item>
- <combo_item name="lowest">
- Lowest detail
- </combo_item>
- </combo_box>
- </panel>
- </panel>
-
- <panel
- height="388"
- top_delta="0"
- name="review_panel"
- visible="false"
- width="535"
- left="0">
- <panel
- height="22"
- top_pad="15"
- name="review_header_panel"
- width="505"
- bg_opaque_color="DkGray2"
- background_visible="true"
- background_opaque="true"
- left="15">
- <text
- width="200"
- left="10"
- name="review_header_text"
- text_color="White"
- top="3"
- height="10"
- font="SansSerifBig"
- layout="topleft">
- Review
- </text>
- </panel>
- <panel
- top_pad="14"
- left="15"
- height="310"
- width="505"
- name="review_content"
- bg_opaque_color="DkGray2"
- background_visible="true"
- background_opaque="true">
- <text
- top="20"
- width="485"
- font="SansSerifMedium"
- text_color="White"
- left="10"
- name="review_prim_equiv"
- height="16">Impact to parcel/region: [EQUIV] prim equivalents
- </text>
- <text
- top_pad="20"
- width="485"
- font="SansSerifMedium"
- text_color="White"
- left="10"
- name="review_fee"
- height="16">Your account will be charged an upload fee of L$ [FEE].
- </text>
- <text
- top_pad="20"
- width="485"
- font="SansSerifMedium"
- text_color="White"
- left="10"
- name="review_confirmation"
- height="32"
- word_wrap="true">By clicking the upload button, you confirm that you have the appropriate rights to the material contained in the model.
- </text>
- </panel>
- </panel>
-
-
-
-
- <panel
- height="388"
- top_delta="0"
- name="upload_panel"
- visible="false"
- width="535"
- left="0">
- <panel
- height="22"
- top_pad="15"
- name="upload_header_panel"
- width="505"
- bg_opaque_color="DkGray2"
- background_visible="true"
- background_opaque="true"
- left="15">
- <text
- width="200"
- left="10"
- name="upload_header_text"
- top="3"
- text_color="White"
- height="10"
- font="SansSerifBig"
- layout="topleft">
- Upload complete
- </text>
- </panel>
- <text
- top_pad="14"
- width="495"
- height="16"
- font="SansSerifMedium"
- layout="topleft"
- name="model_uploaded_text"
- text_color="White"
- word_wrap="true"
- left="25">
- Your model has been uploaded.
- </text>
- <text
- top_pad="5"
- width="495"
- height="16"
- font="SansSerifMedium"
- layout="topleft"
- name="inventory_text"
- text_color="White"
- word_wrap="true"
- left="25">
- You will find it in the Objects folder in your inventory.
- </text>
- <text
- top_pad="20"
- width="495"
- font="SansSerifMedium"
- text_color="White"
- left="25"
- name="charged_fee"
- height="16">Your account has been charged L$ [FEE].
- </text>
- </panel>
-
-
-
- <button
- top="440"
- right="-285"
- width="90"
- height="22"
- name="back"
- label="&lt;&lt; Back" />
- <button
- top_delta="0"
- right="-190"
- width="90"
- height="22"
- name="next"
- label="Next &gt;&gt; " />
- <button
- top_delta="0"
- left_delta="0"
- width="160"
- height="22"
- name="calculate"
- label="Calculate weights &amp; fee &gt;&gt; " />
- <button
- enabled="false"
- visible="false"
- top_delta="0"
- left_delta="0"
- width="160"
- height="22"
- name="calculating"
- label="Calculating... " />
- <button
- enabled="false"
- top_delta="0"
- right="-150"
- width="90"
- height="22"
- 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_parse_error">Dae parsing issue - see log for details.</string>
- <string name="status_reading_file">Loading...</string>
- <string name="status_generating_meshes">Generating Meshes...</string>
- <string name="status_vertex_number_overflow">Error: Vertex number is more than 65534, aborted!</string>
- <string name="bad_element">Error: element is invalid</string>
- <string name="high">High</string>
- <string name="medium">Medium</string>
- <string name="low">Low</string>
- <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_my_inventory.xml b/indra/newview/skins/default/xui/en/floater_my_inventory.xml
index 184f296255..ea44fd493e 100644
--- a/indra/newview/skins/default/xui/en/floater_my_inventory.xml
+++ b/indra/newview/skins/default/xui/en/floater_my_inventory.xml
@@ -6,7 +6,7 @@
height="570"
help_topic="sidebar_inventory"
min_width="333"
- min_height="440"
+ min_height="560"
name="floater_my_inventory"
save_rect="true"
save_visibility="true"
diff --git a/indra/newview/skins/default/xui/en/floater_pathfinding_characters.xml b/indra/newview/skins/default/xui/en/floater_pathfinding_characters.xml
new file mode 100644
index 0000000000..46ee113b69
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/floater_pathfinding_characters.xml
@@ -0,0 +1,209 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<floater
+ positioning="cascading"
+ can_resize="true"
+ can_tear_off="false"
+ height="273"
+ width="635"
+ min_height="273"
+ min_width="635"
+ layout="topleft"
+ name="floater_pathfinding_characters"
+ help_topic="floater_pathfinding_characters"
+ reuse_instance="true"
+ save_rect="false"
+ single_instance="true"
+ title="Pathfinding characters">
+ <floater.string name="messaging_initial"></floater.string>
+ <floater.string name="messaging_get_inprogress">Querying for pathfinding characters ...</floater.string>
+ <floater.string name="messaging_get_error">Error detected while querying for pathfinding characters.</floater.string>
+ <floater.string name="messaging_set_inprogress"></floater.string>
+ <floater.string name="messaging_set_error"></floater.string>
+ <floater.string name="messaging_complete_none_found">No pathfinding characters.</floater.string>
+ <floater.string name="messaging_complete_available">[NUM_SELECTED] characters selected out of [NUM_TOTAL].</floater.string>
+ <floater.string name="messaging_not_enabled">This region is not enabled for pathfinding.</floater.string>
+ <floater.string name="character_cpu_time">[CPU_TIME] µs</floater.string>
+ <floater.string name="character_owner_loading">[Loading]</floater.string>
+ <floater.string name="character_owner_unknown">[Unknown]</floater.string>
+ <floater.string name="character_owner_group">[group]</floater.string>
+ <panel
+ border="false"
+ bevel_style="none"
+ follows="left|top|right|bottom"
+ layout="topleft"
+ height="191"
+ width="635">
+ <scroll_list
+ column_padding="0"
+ draw_heading="true"
+ follows="all"
+ height="135"
+ layout="topleft"
+ left="18"
+ top_pad="10"
+ tab_stop="false"
+ multi_select="true"
+ name="objects_scroll_list"
+ width="600">
+ <scroll_list.columns
+ label="Name"
+ name="name"
+ dynamic_width="true" />
+ <scroll_list.columns
+ label="Description"
+ name="description"
+ width="172" />
+ <scroll_list.columns
+ label="Owner"
+ name="owner"
+ width="141" />
+ <scroll_list.columns
+ label="CPU"
+ name="cpu_time"
+ width="60" />
+ <scroll_list.columns
+ label="Altitude"
+ name="altitude"
+ width="64" />
+ </scroll_list>
+ <text
+ height="26"
+ word_wrap="true"
+ use_ellipses="false"
+ type="string"
+ text_color="LabelTextColor"
+ length="1"
+ follows="left|bottom|right"
+ layout="topleft"
+ name="messaging_status"
+ top_pad="17"
+ width="238">
+ Characters:
+ </text>
+ <button
+ follows="right|bottom"
+ height="21"
+ label="Refresh list"
+ layout="topleft"
+ name="refresh_objects_list"
+ top_pad="-29"
+ left_pad="0"
+ width="115"/>
+ <button
+ follows="right|bottom"
+ height="21"
+ label="Select all"
+ layout="topleft"
+ name="select_all_objects"
+ top_pad="-21"
+ left_pad="8"
+ width="115"/>
+ <button
+ follows="right|bottom"
+ height="21"
+ label="Select none"
+ layout="topleft"
+ name="select_none_objects"
+ top_pad="-21"
+ left_pad="8"
+ width="115"/>
+ </panel>
+ <view_border
+ bevel_style="none"
+ follows="left|right|bottom"
+ height="0"
+ layout="topleft"
+ name="horiz_separator"
+ top_pad="0"
+ left="18"
+ width="600"/>
+ <panel
+ border="false"
+ bevel_style="none"
+ follows="left|right|bottom"
+ layout="topleft"
+ left="0"
+ height="67"
+ width="635">
+ <text
+ height="13"
+ word_wrap="false"
+ use_ellipses="false"
+ type="string"
+ text_color="LabelTextColor"
+ text_readonly_color="LabelDisabledColor"
+ length="1"
+ follows="left|bottom|right"
+ layout="topleft"
+ name="actions_label"
+ left="18"
+ top_pad="8"
+ width="242">
+ Actions on selected characters:
+ </text>
+ <check_box
+ height="19"
+ follows="left|bottom"
+ label="Show beacon"
+ layout="topleft"
+ name="show_beacon"
+ top_pad="-16"
+ left_pad="0"
+ width="150" />
+ <check_box
+ height="19"
+ follows="left|bottom"
+ label="Show physics capsule"
+ layout="topleft"
+ name="show_physics_capsule"
+ top_pad="-19"
+ left_pad="0"
+ width="150" />
+ <button
+ follows="left|bottom"
+ height="22"
+ label="Take"
+ layout="topleft"
+ name="take_objects"
+ top_pad="9"
+ left="18"
+ width="94"/>
+ <button
+ follows="left|bottom"
+ height="22"
+ label="Take copy"
+ layout="topleft"
+ name="take_copy_objects"
+ top_pad="-22"
+ left_pad="6"
+ width="94"/>
+ <button
+ follows="left|bottom"
+ height="22"
+ label="Teleport me to it"
+ layout="topleft"
+ name="teleport_me_to_object"
+ tool_tip="Enabled only when one character is selected."
+ top_pad="-22"
+ left_pad="26"
+ width="159"/>
+ <button
+ follows="right|bottom"
+ height="22"
+ label="Return"
+ layout="topleft"
+ name="return_objects"
+ top_pad="-22"
+ left_pad="26"
+ width="94"/>
+ <button
+ follows="right|bottom"
+ height="22"
+ label="Delete"
+ layout="topleft"
+ name="delete_objects"
+ top_pad="-22"
+ left_pad="6"
+ width="94"/>
+ </panel>
+</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_pathfinding_console.xml b/indra/newview/skins/default/xui/en/floater_pathfinding_console.xml
new file mode 100644
index 0000000000..2629313069
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/floater_pathfinding_console.xml
@@ -0,0 +1,419 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<floater
+ positioning="cascading"
+ can_tear_off="false"
+ height="498"
+ layout="topleft"
+ name="floater_pathfinding_console"
+ help_topic="floater_pathfinding_console"
+ reuse_instance="true"
+ save_rect="true"
+ single_instance="true"
+ title="Pathfinding view / test"
+ width="240">
+ <floater.string name="navmesh_viewer_status_unknown"></floater.string>
+ <floater.string name="navmesh_viewer_status_library_not_implemented">Cannot find pathing library implementation.</floater.string>
+ <floater.string name="navmesh_viewer_status_region_not_enabled">This region is not enabled for pathfinding.</floater.string>
+ <floater.string name="navmesh_viewer_status_region_loading">Waiting for the region to finish loading.</floater.string>
+ <floater.string name="navmesh_viewer_status_checking_version">Checking the status of the navmesh.</floater.string>
+ <floater.string name="navmesh_viewer_status_downloading">Downloading the navmesh.</floater.string>
+ <floater.string name="navmesh_viewer_status_updating">The navmesh has changed on the server. Downloading the latest navmesh.</floater.string>
+ <floater.string name="navmesh_viewer_status_has_navmesh">Latest navmesh has been downloaded.</floater.string>
+ <floater.string name="navmesh_viewer_status_error">Unable to download navmesh successfully.</floater.string>
+ <floater.string name="navmesh_simulator_status_unknown"></floater.string>
+ <floater.string name="navmesh_simulator_status_pending">Navmesh has pending changes.</floater.string>
+ <floater.string name="navmesh_simulator_status_building">Navmesh is building.</floater.string>
+ <floater.string name="navmesh_simulator_status_some_pending">Some navmesh regions have pending changes.</floater.string>
+ <floater.string name="navmesh_simulator_status_some_building">Some navmesh regions are building.</floater.string>
+ <floater.string name="navmesh_simulator_status_pending_and_building">Some navmesh regions have pending changes and others are building.</floater.string>
+ <floater.string name="navmesh_simulator_status_complete">Navmesh is up-to-date.</floater.string>
+ <floater.string name="pathing_unknown"></floater.string>
+ <floater.string name="pathing_library_not_implemented">Cannot find pathing library implementation.</floater.string>
+ <floater.string name="pathing_region_not_enabled">This region is not enabled for pathfinding.</floater.string>
+ <floater.string name="pathing_choose_start_and_end_points">Please choose start and end points.</floater.string>
+ <floater.string name="pathing_choose_start_point">Please choose start point.</floater.string>
+ <floater.string name="pathing_choose_end_point">Please choose end point.</floater.string>
+ <floater.string name="pathing_path_valid">Path is shown in orange.</floater.string>
+ <floater.string name="pathing_path_invalid">A path between the chosen points cannot be found.</floater.string>
+ <floater.string name="pathing_error">An error occurred during path generation.</floater.string>
+ <panel
+ border="false"
+ bevel_style="none"
+ follows="left|top"
+ layout="topleft"
+ left="12"
+ top_pad="10"
+ height="61"
+ width="214">
+ <text
+ height="13"
+ word_wrap="true"
+ use_ellipses="false"
+ type="string"
+ text_color="LabelTextColor"
+ length="1"
+ layout="topleft"
+ left="0"
+ top_pad="0"
+ width="214">
+ Viewer status
+ </text>
+ <text
+ height="40"
+ word_wrap="true"
+ use_ellipses="false"
+ type="string"
+ text_color="PathfindingGoodColor"
+ length="1"
+ follows="left|top"
+ layout="topleft"
+ left="0"
+ name="pathfinding_viewer_status"
+ top_pad="8"
+ width="214">
+ </text>
+ </panel>
+ <panel
+ border="false"
+ bevel_style="none"
+ follows="left|top"
+ layout="topleft"
+ left="12"
+ height="66"
+ width="214">
+ <text
+ height="13"
+ word_wrap="true"
+ use_ellipses="false"
+ type="string"
+ text_color="LabelTextColor"
+ length="1"
+ layout="topleft"
+ left="0"
+ top_pad="5"
+ width="214">
+ Simulator status
+ </text>
+ <text
+ height="40"
+ word_wrap="true"
+ use_ellipses="false"
+ type="string"
+ text_color="PathfindingGoodColor"
+ length="1"
+ follows="left|top"
+ layout="topleft"
+ left="0"
+ name="pathfinding_simulator_status"
+ top_pad="8"
+ width="214">
+ </text>
+ </panel>
+ <view_border
+ bevel_style="none"
+ follows="top|left"
+ layout="topleft"
+ left="12"
+ top="179"
+ height="305"
+ width="213"
+ visible="true" />
+ <tab_container
+ follows="left|top"
+ layout="topleft"
+ tab_position="top"
+ name="view_test_tab_container"
+ left="12"
+ top="157"
+ height="328"
+ width="214">
+ <panel
+ border="false"
+ bevel_style="none"
+ follows="left|top"
+ layout="topleft"
+ name="view_panel"
+ label="View">
+ <text
+ height="13"
+ word_wrap="true"
+ use_ellipses="false"
+ type="string"
+ text_color="LabelTextColor"
+ text_readonly_color="LabelDisabledColor"
+ name="show_label"
+ length="1"
+ follows="left|top"
+ layout="topleft"
+ top_pad="20"
+ left="12"
+ width="200">
+ Show:
+ </text>
+ <check_box
+ height="19"
+ label="World"
+ layout="topleft"
+ name="show_world"
+ top_pad="4"
+ width="90" />
+ <check_box
+ height="19"
+ label="Movables only"
+ layout="topleft"
+ left="32"
+ name="show_world_movables_only"
+ top_pad="4"
+ width="90" />
+ <check_box
+ height="19"
+ label="Navmesh"
+ left="12"
+ layout="topleft"
+ name="show_navmesh"
+ top_pad="7"
+ width="90" />
+ <text
+ height="13"
+ word_wrap="true"
+ use_ellipses="false"
+ type="string"
+ text_color="LabelTextColor"
+ text_readonly_color="LabelDisabledColor"
+ name="show_walkability_label"
+ length="1"
+ follows="left|top"
+ layout="topleft"
+ left="32"
+ width="180">
+ Show walkability map:
+ </text>
+ <combo_box
+ height="19"
+ layout="topleft"
+ left="32"
+ name="show_heatmap_mode"
+ top_pad="8"
+ width="156">
+ <combo_box.item
+ label="Do not show"
+ name="show_heatmap_mode_none"
+ value="0" />
+ <combo_box.item
+ label="Character type A"
+ name="show_heatmap_mode_a"
+ value="1" />
+ <combo_box.item
+ label="Character type B"
+ name="show_heatmap_mode_b"
+ value="2" />
+ <combo_box.item
+ label="Character type C"
+ name="show_heatmap_mode_c"
+ value="3" />
+ <combo_box.item
+ label="Character type D"
+ name="show_heatmap_mode_d"
+ value="4" />
+ </combo_box>
+ <check_box
+ height="19"
+ label="Walkables"
+ layout="topleft"
+ left="12"
+ name="show_walkables"
+ top_pad="10"
+ width="90" />
+ <check_box
+ height="19"
+ label="Material volumes"
+ layout="topleft"
+ name="show_material_volumes"
+ top_pad="4"
+ width="90" />
+ <check_box
+ height="19"
+ label="Static obstacles"
+ layout="topleft"
+ name="show_static_obstacles"
+ top_pad="4"
+ width="90" />
+ <check_box
+ height="19"
+ label="Exclusion volumes"
+ layout="topleft"
+ name="show_exclusion_volumes"
+ top_pad="4"
+ width="90" />
+ <check_box
+ height="19"
+ label="Water plane"
+ layout="topleft"
+ name="show_water_plane"
+ top_pad="4"
+ width="90" />
+ <check_box
+ height="19"
+ label="With X-ray vision"
+ layout="topleft"
+ name="show_xray"
+ top_pad="4"
+ width="90" />
+ </panel>
+ <panel
+ border="false"
+ bevel_style="none"
+ follows="left|top"
+ layout="topleft"
+ name="test_panel"
+ label="Test path">
+ <text
+ height="14"
+ word_wrap="true"
+ use_ellipses="false"
+ type="string"
+ text_color="LabelTextColor"
+ text_readonly_color="LabelDisabledColor"
+ name="ctrl_click_label"
+ length="1"
+ left="12"
+ follows="left|top"
+ layout="topleft"
+ top_pad="20"
+ width="202">
+ Ctrl-click to select start point.
+ </text>
+ <text
+ height="14"
+ word_wrap="true"
+ use_ellipses="false"
+ type="string"
+ text_color="LabelTextColor"
+ text_readonly_color="LabelDisabledColor"
+ name="shift_click_label"
+ length="1"
+ follows="left|top"
+ layout="topleft"
+ top_pad="5"
+ width="202">
+ Shift-click to select end point.
+ </text>
+ <view_border
+ bevel_style="none"
+ follows="top|left"
+ layout="topleft"
+ height="0"
+ width="185"
+ top_pad="13"
+ visible="true" />
+ <text
+ height="14"
+ word_wrap="true"
+ use_ellipses="false"
+ type="string"
+ text_color="LabelTextColor"
+ text_readonly_color="LabelDisabledColor"
+ name="character_width_label"
+ length="1"
+ follows="left|top"
+ layout="topleft"
+ top_pad="14"
+ width="202">
+ Character width
+ </text>
+ <slider
+ decimal_digits="1"
+ height="14"
+ increment="0.1"
+ layout="topleft"
+ follows="left|top"
+ max_val="2"
+ min_val="0.2"
+ name="character_width"
+ top_pad="5"
+ value="1"
+ width="145" />
+ <text
+ height="14"
+ word_wrap="false"
+ use_ellipses="false"
+ type="string"
+ text_color="LabelTextColor"
+ text_readonly_color="LabelDisabledColor"
+ name="character_width_unit_label"
+ length="1"
+ follows="left|top"
+ layout="topleft"
+ top_pad="-14"
+ left_pad="0"
+ width="20">
+ m
+ </text>
+ <text
+ height="14"
+ word_wrap="true"
+ use_ellipses="false"
+ type="string"
+ text_color="LabelTextColor"
+ text_readonly_color="LabelDisabledColor"
+ name="character_type_label"
+ length="1"
+ follows="left|top"
+ layout="topleft"
+ left_pad="-165"
+ top_pad="13"
+ width="202">
+ Character type
+ </text>
+ <combo_box
+ follows="top|left"
+ layout="topleft"
+ height="19"
+ width="156"
+ top_pad="5"
+ name="path_character_type">
+ <combo_box.item
+ label="None"
+ name="path_character_type_none"
+ value="0" />
+ <combo_box.item
+ label="A"
+ name="path_character_type_a"
+ value="1" />
+ <combo_box.item
+ label="B"
+ name="path_character_type_b"
+ value="2" />
+ <combo_box.item
+ label="C"
+ name="path_character_type_c"
+ value="3" />
+ <combo_box.item
+ label="D"
+ name="path_character_type_d"
+ value="4" />
+ </combo_box>
+ <text
+ height="14"
+ word_wrap="true"
+ use_ellipses="false"
+ type="string"
+ text_color="PathfindingGoodColor"
+ length="1"
+ follows="left|top"
+ layout="topleft"
+ name="path_test_status"
+ top_pad="11"
+ width="202">
+ </text>
+ <button
+ follows="left|top"
+ height="22"
+ label="Clear path"
+ layout="topleft"
+ name="clear_path"
+ top_pad="27"
+ width="96"/>
+ </panel>
+ </tab_container>
+</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_pathfinding_linksets.xml b/indra/newview/skins/default/xui/en/floater_pathfinding_linksets.xml
new file mode 100644
index 0000000000..eaed92ac55
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/floater_pathfinding_linksets.xml
@@ -0,0 +1,589 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<floater
+ positioning="cascading"
+ can_resize="true"
+ can_tear_off="false"
+ height="395"
+ width="1015"
+ min_height="395"
+ min_width="1015"
+ layout="topleft"
+ name="floater_pathfinding_linksets"
+ help_topic="floater_pathfinding_linksets"
+ reuse_instance="true"
+ save_rect="false"
+ single_instance="true"
+ title="Pathfinding linksets">
+ <floater.string name="messaging_initial"></floater.string>
+ <floater.string name="messaging_get_inprogress">Querying for pathfinding linksets ...</floater.string>
+ <floater.string name="messaging_get_error">Error detected while querying for pathfinding linksets.</floater.string>
+ <floater.string name="messaging_set_inprogress">Modifying selected pathfinding linksets ...</floater.string>
+ <floater.string name="messaging_set_error">Error detected while modifying selected pathfinding linksets.</floater.string>
+ <floater.string name="messaging_complete_none_found">No pathfinding linksets.</floater.string>
+ <floater.string name="messaging_complete_available">[NUM_SELECTED] linksets selected out of [NUM_TOTAL].</floater.string>
+ <floater.string name="messaging_not_enabled">This region is not enabled for pathfinding.</floater.string>
+ <floater.string name="linkset_terrain_name">[Terrain]</floater.string>
+ <floater.string name="linkset_terrain_description">--</floater.string>
+ <floater.string name="linkset_terrain_owner">--</floater.string>
+ <floater.string name="linkset_terrain_land_impact">--</floater.string>
+ <floater.string name="linkset_terrain_dist_from_you">--</floater.string>
+ <floater.string name="linkset_owner_loading">[Loading]</floater.string>
+ <floater.string name="linkset_owner_unknown">[Unknown]</floater.string>
+ <floater.string name="linkset_owner_group">[group]</floater.string>
+ <floater.string name="linkset_use_walkable">Walkable</floater.string>
+ <floater.string name="linkset_use_static_obstacle">Static obstacle</floater.string>
+ <floater.string name="linkset_use_dynamic_obstacle">Movable obstacle</floater.string>
+ <floater.string name="linkset_use_material_volume">Material volume</floater.string>
+ <floater.string name="linkset_use_exclusion_volume">Exclusion volume</floater.string>
+ <floater.string name="linkset_use_dynamic_phantom">Movable phantom</floater.string>
+ <floater.string name="linkset_is_terrain">[unmodifiable]</floater.string>
+ <floater.string name="linkset_is_restricted_state">[restricted]</floater.string>
+ <floater.string name="linkset_is_non_volume_state">[concave]</floater.string>
+ <floater.string name="linkset_is_restricted_non_volume_state">[restricted,concave]</floater.string>
+ <floater.string name="linkset_choose_use">Choose linkset use...</floater.string>
+ <panel
+ border="false"
+ bevel_style="none"
+ follows="left|top|right|bottom"
+ layout="topleft"
+ height="226"
+ width="999">
+ <text
+ height="13"
+ word_wrap="false"
+ use_ellipses="false"
+ type="string"
+ text_color="LabelTextColor"
+ length="1"
+ follows="left|top"
+ layout="topleft"
+ left="20"
+ top_pad="14"
+ width="67">
+ Filter by:
+ </text>
+ <text
+ height="13"
+ word_wrap="false"
+ use_ellipses="false"
+ type="string"
+ text_color="LabelTextColor"
+ length="1"
+ follows="left|top"
+ layout="topleft"
+ left_pad="0"
+ width="62">
+ Name
+ </text>
+ <line_editor
+ border_style="line"
+ border_thickness="1"
+ follows="left|top"
+ height="20"
+ layout="topleft"
+ left_pad="0"
+ top_pad="-18"
+ max_length_chars="255"
+ name="filter_by_name"
+ width="161" />
+ <text
+ height="13"
+ word_wrap="false"
+ use_ellipses="false"
+ type="string"
+ text_color="LabelTextColor"
+ length="1"
+ follows="left|top"
+ layout="topleft"
+ left_pad="22"
+ top_pad="-15"
+ width="88">
+ Description
+ </text>
+ <line_editor
+ border_style="line"
+ border_thickness="1"
+ follows="left|top"
+ height="20"
+ layout="topleft"
+ left_pad="0"
+ top_pad="-17"
+ max_length_chars="255"
+ name="filter_by_description"
+ width="162" />
+ <combo_box
+ height="20"
+ layout="topleft"
+ follows="left|top"
+ name="filter_by_linkset_use"
+ left_pad="32"
+ top_pad="-20"
+ width="199">
+ <combo_box.item
+ label="Filter by linkset use..."
+ name="filter_by_linkset_use_none"
+ value="0" />
+ <combo_box.item
+ label="Walkable"
+ name="filter_by_linkset_use_walkable"
+ value="1" />
+ <combo_box.item
+ label="Static obstacle"
+ name="filter_by_linkset_use_static_obstacle"
+ value="2" />
+ <combo_box.item
+ label="Movable obstacle"
+ name="filter_by_linkset_use_dynamic_obstacle"
+ value="3" />
+ <combo_box.item
+ label="Material volume"
+ name="filter_by_linkset_use_material_volume"
+ value="4" />
+ <combo_box.item
+ label="Exclusion volume"
+ name="filter_by_linkset_use_exclusion_volume"
+ value="5" />
+ <combo_box.item
+ label="Movable phantom"
+ name="filter_by_linkset_use_dynamic_phantom"
+ value="6" />
+ </combo_box>
+ <button
+ follows="right|top"
+ height="21"
+ label="Apply"
+ layout="topleft"
+ name="apply_filters"
+ top_pad="-21"
+ left_pad="31"
+ width="73"/>
+ <button
+ follows="right|top"
+ height="21"
+ label="Clear"
+ layout="topleft"
+ name="clear_filters"
+ top_pad="-21"
+ left_pad="8"
+ width="73"/>
+ <scroll_list
+ column_padding="0"
+ draw_heading="true"
+ follows="all"
+ height="135"
+ layout="topleft"
+ left="18"
+ top_pad="15"
+ tab_stop="false"
+ multi_select="true"
+ name="objects_scroll_list"
+ width="980">
+ <scroll_list.columns
+ label="Name (root prim)"
+ name="name"
+ dynamic_width="true" />
+ <scroll_list.columns
+ label="Description (root prim)"
+ name="description"
+ width="158" />
+ <scroll_list.columns
+ label="Owner"
+ name="owner"
+ width="141" />
+ <scroll_list.columns
+ label="Impact"
+ name="land_impact"
+ width="55" />
+ <scroll_list.columns
+ label="Distance"
+ name="dist_from_you"
+ width="65" />
+ <scroll_list.columns
+ label="Linkset use"
+ name="linkset_use"
+ width="236" />
+ <scroll_list.columns
+ label="A %"
+ name="a_percent"
+ width="41" />
+ <scroll_list.columns
+ label="B %"
+ name="b_percent"
+ width="41" />
+ <scroll_list.columns
+ label="C %"
+ name="c_percent"
+ width="41" />
+ <scroll_list.columns
+ label="D %"
+ name="d_percent"
+ width="41" />
+ </scroll_list>
+ <text
+ height="13"
+ word_wrap="false"
+ use_ellipses="false"
+ type="string"
+ text_color="LabelTextColor"
+ length="1"
+ follows="left|bottom|right"
+ layout="topleft"
+ name="messaging_status"
+ top_pad="17"
+ width="619">
+ Linksets:
+ </text>
+ <button
+ follows="right|bottom"
+ height="21"
+ label="Refresh list"
+ layout="topleft"
+ name="refresh_objects_list"
+ top_pad="-16"
+ left_pad="0"
+ width="115"/>
+ <button
+ follows="right|bottom"
+ height="21"
+ label="Select all"
+ layout="topleft"
+ name="select_all_objects"
+ top_pad="-21"
+ left_pad="8"
+ width="115"/>
+ <button
+ follows="right|bottom"
+ height="21"
+ label="Select none"
+ layout="topleft"
+ name="select_none_objects"
+ top_pad="-21"
+ left_pad="8"
+ width="115"/>
+ </panel>
+ <view_border
+ bevel_style="none"
+ follows="left|bottom|right"
+ height="0"
+ layout="topleft"
+ name="horiz_separator"
+ top_pad="0"
+ left="18"
+ width="979"/>
+ <panel
+ border="false"
+ bevel_style="none"
+ follows="left|right|bottom"
+ layout="topleft"
+ left="0"
+ height="67"
+ width="950">
+ <text
+ height="13"
+ word_wrap="false"
+ use_ellipses="false"
+ type="string"
+ text_color="LabelTextColor"
+ text_readonly_color="LabelDisabledColor"
+ length="1"
+ left="18"
+ follows="left|bottom|right"
+ layout="topleft"
+ top_pad="8"
+ width="580">
+ Actions on selected linksets (If a linkset is removed from the world, its attributes may be lost):
+ </text>
+ <check_box
+ height="19"
+ follows="left|bottom"
+ label="Show beacon"
+ layout="topleft"
+ name="show_beacon"
+ left_pad="0"
+ top_pad="-16"
+ width="90" />
+ <button
+ follows="left|bottom"
+ height="21"
+ label="Take"
+ layout="topleft"
+ name="take_objects"
+ top_pad="9"
+ left="18"
+ width="95"/>
+ <button
+ follows="left|bottom"
+ height="21"
+ label="Take copy"
+ layout="topleft"
+ name="take_copy_objects"
+ top_pad="-21"
+ left_pad="6"
+ width="95"/>
+ <button
+ follows="left|bottom"
+ height="21"
+ label="Teleport me to it"
+ layout="topleft"
+ name="teleport_me_to_object"
+ top_pad="-21"
+ left_pad="206"
+ width="160"/>
+ <button
+ follows="right|bottom"
+ height="21"
+ label="Return"
+ layout="topleft"
+ name="return_objects"
+ top_pad="-21"
+ left_pad="220"
+ width="95"/>
+ <button
+ follows="right|bottom"
+ height="21"
+ label="Delete"
+ layout="topleft"
+ name="delete_objects"
+ top_pad="-21"
+ left_pad="6"
+ width="95"/>
+ </panel>
+ <view_border
+ bevel_style="none"
+ follows="left|bottom|right"
+ height="0"
+ layout="topleft"
+ name="horiz_separator"
+ top_pad="0"
+ left="18"
+ width="979"/>
+ <panel
+ border="false"
+ bevel_style="none"
+ follows="left|right|bottom"
+ layout="topleft"
+ left="0"
+ height="75"
+ width="950">
+ <text
+ height="13"
+ word_wrap="false"
+ use_ellipses="false"
+ type="string"
+ text_color="LabelTextColor"
+ length="1"
+ follows="left|bottom"
+ layout="topleft"
+ left="18"
+ top_pad="8"
+ width="912">
+ Edit attributes of selected linksets and press the button to apply changes
+ </text>
+ <combo_box
+ height="20"
+ layout="topleft"
+ follows="left|top"
+ name="edit_linkset_use"
+ left="18"
+ top_pad="17"
+ width="199">
+ </combo_box>
+ <text
+ height="13"
+ word_wrap="false"
+ use_ellipses="false"
+ type="string"
+ text_color="LabelTextColor"
+ text_readonly_color="LabelDisabledColor"
+ name="walkability_coefficients_label"
+ length="1"
+ follows="left|bottom"
+ layout="topleft"
+ left_pad="36"
+ top_pad="-17"
+ width="110">
+ Walkability:
+ </text>
+ <text
+ height="13"
+ word_wrap="false"
+ use_ellipses="false"
+ type="string"
+ text_color="LabelTextColor"
+ text_readonly_color="LabelDisabledColor"
+ name="edit_a_label"
+ length="1"
+ follows="left|bottom"
+ layout="topleft"
+ left_pad="0"
+ width="18">
+ A
+ </text>
+ <line_editor
+ border_style="line"
+ border_thickness="1"
+ follows="left|bottom"
+ height="21"
+ layout="topleft"
+ left_pad="0"
+ top_pad="-19"
+ max_length_chars="3"
+ name="edit_a_value"
+ tool_tip="Walkability for characters of type A. Example character type is humanoid."
+ width="45" />
+ <text
+ height="13"
+ word_wrap="false"
+ use_ellipses="false"
+ type="string"
+ text_color="LabelTextColor"
+ text_readonly_color="LabelDisabledColor"
+ name="edit_b_label"
+ length="1"
+ follows="left|bottom"
+ layout="topleft"
+ left_pad="44"
+ top_pad="-15"
+ width="18">
+ B
+ </text>
+ <line_editor
+ border_style="line"
+ border_thickness="1"
+ follows="left|bottom"
+ height="21"
+ layout="topleft"
+ left_pad="0"
+ top_pad="-19"
+ max_length_chars="3"
+ name="edit_b_value"
+ tool_tip="Walkability for characters of type B. Example character type is creature."
+ width="45" />
+ <text
+ height="13"
+ word_wrap="false"
+ use_ellipses="false"
+ type="string"
+ text_color="LabelTextColor"
+ text_readonly_color="LabelDisabledColor"
+ name="edit_c_label"
+ length="1"
+ follows="left|bottom"
+ layout="topleft"
+ left_pad="44"
+ top_pad="-15"
+ width="18">
+ C
+ </text>
+ <line_editor
+ border_style="line"
+ border_thickness="1"
+ follows="left|bottom"
+ height="21"
+ layout="topleft"
+ left_pad="0"
+ top_pad="-19"
+ max_length_chars="3"
+ name="edit_c_value"
+ tool_tip="Walkability for characters of type C. Example character type is mechanical."
+ width="45" />
+ <text
+ height="13"
+ word_wrap="false"
+ use_ellipses="false"
+ type="string"
+ text_color="LabelTextColor"
+ text_readonly_color="LabelDisabledColor"
+ name="edit_d_label"
+ length="1"
+ follows="left|bottom"
+ layout="topleft"
+ left_pad="44"
+ top_pad="-15"
+ width="18">
+ D
+ </text>
+ <line_editor
+ border_style="line"
+ border_thickness="1"
+ follows="left|bottom"
+ height="21"
+ layout="topleft"
+ left_pad="0"
+ top_pad="-19"
+ max_length_chars="3"
+ name="edit_d_value"
+ tool_tip="Walkability for characters of type D. Example character type is other."
+ width="45" />
+ <button
+ follows="right|bottom"
+ height="21"
+ label="Apply changes"
+ layout="topleft"
+ name="apply_edit_values"
+ top_pad="-21"
+ left_pad="40"
+ width="140"/>
+ <text
+ height="13"
+ word_wrap="false"
+ use_ellipses="false"
+ type="string"
+ text_color="LabelTextColor"
+ text_readonly_color="LabelDisabledColor"
+ name="suggested_use_a_label"
+ length="1"
+ follows="left|bottom"
+ layout="topleft"
+ left="363"
+ top_pad="5"
+ width="107">
+ (Humanoid)
+ </text>
+ <text
+ height="13"
+ word_wrap="false"
+ use_ellipses="false"
+ type="string"
+ text_color="LabelTextColor"
+ text_readonly_color="LabelDisabledColor"
+ name="suggested_use_b_label"
+ length="1"
+ follows="left|bottom"
+ layout="topleft"
+ left_pad="0"
+ width="107">
+ (Creature)
+ </text>
+ <text
+ height="13"
+ word_wrap="false"
+ use_ellipses="false"
+ type="string"
+ text_color="LabelTextColor"
+ text_readonly_color="LabelDisabledColor"
+ name="suggested_use_c_label"
+ length="1"
+ follows="left|bottom"
+ layout="topleft"
+ left_pad="0"
+ width="107">
+ (Mechanical)
+ </text>
+ <text
+ height="13"
+ word_wrap="false"
+ use_ellipses="false"
+ type="string"
+ text_color="LabelTextColor"
+ text_readonly_color="LabelDisabledColor"
+ name="suggested_use_d_label"
+ length="1"
+ follows="left|bottom"
+ layout="topleft"
+ left_pad="0"
+ width="107">
+ (Other)
+ </text>
+ </panel>
+</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_preview_notecard.xml b/indra/newview/skins/default/xui/en/floater_preview_notecard.xml
index be3b2d179d..2e1c8ce670 100644
--- a/indra/newview/skins/default/xui/en/floater_preview_notecard.xml
+++ b/indra/newview/skins/default/xui/en/floater_preview_notecard.xml
@@ -70,6 +70,7 @@
max_length="65536"
name="Notecard Editor"
parse_urls="false"
+ spellcheck="true"
tab_group="1"
top="46"
width="392"
diff --git a/indra/newview/skins/default/xui/en/floater_spellcheck.xml b/indra/newview/skins/default/xui/en/floater_spellcheck.xml
new file mode 100644
index 0000000000..76a350dd29
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/floater_spellcheck.xml
@@ -0,0 +1,160 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<floater
+ border="true"
+ can_close="true"
+ can_minimize="true"
+ save_rect="true"
+ help_topic="spelling_settings"
+ can_resize="false"
+ height="315"
+ width="490"
+ name="spellcheck_floater"
+ title="Spell Checker Settings">
+ <check_box
+ bottom_delta="30"
+ control_name="SpellCheck"
+ left_delta="15"
+ height="16"
+ width="100"
+ follows="left|top"
+ label="Enable spell checker"
+ name="spellcheck_enable" />
+ <view_border
+ top_pad="10"
+ left="2"
+ height="0"
+ width="491"
+ follows="left|top"
+ bevel_style="none"
+ border_thickness="1"
+ mouse_opaque="false"
+ name="divisor1"/>
+ <text
+ enabled_control="SpellCheck"
+ follows="top|left"
+ height="10"
+ layout="topleft"
+ left="38"
+ mouse_opaque="false"
+ name="spellcheck_main"
+ top_pad="15"
+ type="string"
+ width="90"
+ >
+ Main dictionary :
+ </text>
+ <combo_box
+ enabled_control="SpellCheck"
+ follows="top|left"
+ height="23"
+ layout="topleft"
+ left_pad="10"
+ name="spellcheck_main_combo"
+ top_pad="-15"
+ width="175"
+ />
+ <text
+ enabled_control="SpellCheck"
+ follows="top|left"
+ height="10"
+ label="Logs:"
+ layout="topleft"
+ left="38"
+ mouse_opaque="false"
+ name="spellcheck_additional"
+ top_pad="15"
+ type="string"
+ width="190"
+ >
+ Additional dictionaries :
+ </text>
+ <text
+ follows="top|left"
+ height="12"
+ layout="topleft"
+ left="55"
+ length="1"
+ name="spellcheck_available"
+ top_pad="10"
+ type="string"
+ width="175">
+ Available
+ </text>
+ <text
+ follows="top|left"
+ height="12"
+ type="string"
+ left_pad="45"
+ length="1"
+ layout="topleft"
+ name="spellcheck_active"
+ width="175">
+ Active
+ </text>
+ <scroll_list
+ enabled_control="SpellCheck"
+ follows="top|left"
+ height="155"
+ layout="topleft"
+ left="55"
+ multi_select="true"
+ name="spellcheck_available_list"
+ sort_column="0"
+ sort_ascending="true"
+ width="175" />
+ <button
+ enabled_control="SpellCheck"
+ follows="top|left"
+ height="26"
+ image_overlay="Arrow_Right"
+ hover_glow_amount="0.15"
+ layout="topleft"
+ left_pad="10"
+ name="spellcheck_moveright_btn"
+ top_delta="50"
+ width="25">
+ </button>
+ <button
+ enabled_control="SpellCheck"
+ follows="top|left"
+ height="26"
+ image_overlay="Arrow_Left"
+ hover_glow_amount="0.15"
+ layout="topleft"
+ name="spellcheck_moveleft_btn"
+ top_delta="30"
+ width="25">
+ </button>
+ <scroll_list
+ enabled_control="SpellCheck"
+ follows="top|left"
+ height="155"
+ layout="topleft"
+ left_pad="10"
+ multi_select="true"
+ name="spellcheck_active_list"
+ sort_column="0"
+ sort_ascending="true"
+ top_pad="-105"
+ width="175"
+ />
+ <button
+ enabled="false"
+ follows="left|top"
+ height="23"
+ label="Remove"
+ layout="topleft"
+ left="55"
+ name="spellcheck_remove_btn"
+ top_pad="5"
+ width="80" />
+ <button
+ follows="left|top"
+ height="23"
+ label="Import..."
+ layout="topleft"
+ left_pad="15"
+ name="spellcheck_import_btn"
+ top_delta="0"
+ width="80" />
+</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_spellcheck_import.xml b/indra/newview/skins/default/xui/en/floater_spellcheck_import.xml
new file mode 100644
index 0000000000..b54090015d
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/floater_spellcheck_import.xml
@@ -0,0 +1,116 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<floater
+ border="true"
+ can_close="true"
+ can_minimize="true"
+ bottom="275"
+ left="300"
+ can_resize="false"
+ height="140"
+ width="400"
+ name="spellcheck_import"
+ title="Import Dictionary">
+ <text
+ follows="top|left"
+ height="16"
+ layout="topleft"
+ left="25"
+ top="15"
+ type="string"
+ width="65">
+ Dictionary:
+ </text>
+ <line_editor
+ enabled="false"
+ follows="left|top"
+ height="23"
+ layout="topleft"
+ left_pad="10"
+ max_length_bytes="255"
+ name="dictionary_path"
+ top_delta="-5"
+ width="200" />
+ <button
+ follows="left|top"
+ height="23"
+ label="Browse"
+ label_selected="Browse"
+ layout="topleft"
+ left_pad="5"
+ name="dictionary_path_browse"
+ top_delta="0"
+ width="75" />
+ <text
+ follows="top|left"
+ height="16"
+ layout="topleft"
+ left="25"
+ top_pad="8"
+ type="string"
+ width="65">
+ Name:
+ </text>
+ <line_editor
+ enabled="false"
+ follows="left|top"
+ height="23"
+ layout="topleft"
+ left_pad="10"
+ max_length_bytes="255"
+ name="dictionary_name"
+ top_delta="-5"
+ width="200" />
+ <text
+ follows="top|left"
+ height="16"
+ layout="topleft"
+ left="25"
+ top_pad="8"
+ type="string"
+ width="65">
+ Language:
+ </text>
+ <line_editor
+ follows="left|top"
+ height="23"
+ layout="topleft"
+ left_pad="10"
+ max_length_bytes="255"
+ name="dictionary_language"
+ top_delta="-5"
+ width="200" />
+ <view_border
+ top_pad="10"
+ left="2"
+ height="0"
+ width="396"
+ follows="left|top"
+ bevel_style="none"
+ border_thickness="1"
+ mouse_opaque="false"
+ name="divisor"/>
+ <button
+ top_pad="10"
+ right="280"
+ height="22"
+ width="90"
+ enabled="true"
+ follows="left|top"
+ mouse_opaque="true"
+ halign="center"
+ scale_image="true"
+ name="ok_btn"
+ label="Import" />
+ <button
+ top_delta="0"
+ right="380"
+ height="22"
+ width="90"
+ enabled="true"
+ follows="left|top"
+ mouse_opaque="true"
+ halign="center"
+ scale_image="true"
+ name="cancel_btn"
+ label="Cancel" />
+</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_stats.xml b/indra/newview/skins/default/xui/en/floater_stats.xml
index 9400f7b94f..f9eb16d224 100644
--- a/indra/newview/skins/default/xui/en/floater_stats.xml
+++ b/indra/newview/skins/default/xui/en/floater_stats.xml
@@ -168,7 +168,7 @@
name="texture"
label="Texture"
show_label="true">
- <stat_bar
+ <stat_bar
name="texture_cache_hits"
label="Cache Hit Rate"
stat="texture_cache_hits"
@@ -571,6 +571,20 @@
show_bar="false"
show_mean="false" >
</stat_bar>
+ <stat_bar
+ name="simpctscriptsrun"
+ label="Scripts Run"
+ unit_label=" %"
+ stat="simpctscriptsrun"
+ bar_min="0"
+ bar_max="100"
+ tick_spacing="10"
+ label_spacing="20"
+ precision="3"
+ show_per_sec="false"
+ show_bar="false"
+ show_mean="true">
+ </stat_bar>
<stat_bar
name="simscripteps"
@@ -587,6 +601,53 @@
show_mean="false" >
</stat_bar>
+ <stat_view
+ name="simpathfinding"
+ label="Pathfinding"
+ show_label="true">
+ <stat_bar
+ name="simsimaistepmsec"
+ label=" AI Step Time"
+ stat="simsimaistepmsec"
+ unit_label="ms"
+ precision="3"
+ bar_min="0.f"
+ bar_max="40.f"
+ tick_spacing="10.f"
+ label_spacing="20.f"
+ show_per_sec="false"
+ show_bar="false"
+ show_mean="false" >
+ </stat_bar>
+ <stat_bar
+ name="simsimskippedsilhouettesteps"
+ label=" Skipped Silhouette Steps"
+ stat="simsimskippedsilhouettesteps"
+ unit_label="/sec"
+ precision="0"
+ bar_min="0"
+ bar_max="45"
+ tick_spacing="4"
+ label_spacing="8"
+ show_per_sec="false"
+ show_bar="false">
+ </stat_bar>
+ <stat_bar
+ name="simsimpctsteppedcharacters"
+ label=" Characters Updated"
+ unit_label=" %"
+ stat="simsimpctsteppedcharacters"
+ bar_min="0"
+ bar_max="100"
+ tick_spacing="10"
+ label_spacing="20"
+ precision="1"
+ show_per_sec="false"
+ show_bar="false"
+ show_mean="true">
+ </stat_bar>
+ </stat_view>
+
<stat_bar
name="siminpps"
label="Packets In"
diff --git a/indra/newview/skins/default/xui/en/floater_texture_ctrl.xml b/indra/newview/skins/default/xui/en/floater_texture_ctrl.xml
index ffb8b842f0..2e29c61cb2 100644
--- a/indra/newview/skins/default/xui/en/floater_texture_ctrl.xml
+++ b/indra/newview/skins/default/xui/en/floater_texture_ctrl.xml
@@ -134,6 +134,26 @@
top_delta="-25"
name="Pipette"
width="28" />
+ <check_box
+ follows="left|bottom"
+ height="20"
+ initial_value="true"
+ label="Live Preview"
+ layout="topleft"
+ left="4"
+ name="apply_immediate_check"
+ top="262"
+ width="120" />
+ <text
+ follows="left|bottom"
+ height="20"
+ layout="topleft"
+ left="8"
+ name="preview_disabled"
+ top="266"
+ value="Preview Disabled"
+ visible="false"
+ width="120" />
<filter_editor
follows="left|top|right"
height="23"
diff --git a/indra/newview/skins/default/xui/en/floater_texture_fetch_debugger.xml b/indra/newview/skins/default/xui/en/floater_texture_fetch_debugger.xml
index 44b6a63bca..1ea256b8b3 100644
--- a/indra/newview/skins/default/xui/en/floater_texture_fetch_debugger.xml
+++ b/indra/newview/skins/default/xui/en/floater_texture_fetch_debugger.xml
@@ -1,341 +1,428 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater
- legacy_header_height="18"
- can_minimize="false"
- height="550"
- layout="topleft"
- name="TexFetchDebugger"
- help_topic="texfetchdebugger"
- title="Texture Fetching Debugger"
- width="540">
- <text
- type="string"
- length="1"
- follows="left|top"
- height="25"
- layout="topleft"
- left="10"
- name="total_num_fetched_label"
- top="30"
- width="400">
- 1, Total number of fetched textures: [NUM]
- </text>
- <text
- type="string"
- length="1"
- follows="left|top"
- height="25"
- layout="topleft"
- left_delta="0"
- name="total_num_fetching_requests_label"
- top_delta="25"
- width="400">
- 2, Total number of fetching requests: [NUM]
- </text>
- <text
- type="string"
- length="1"
- follows="left|top"
- height="25"
- layout="topleft"
- left_delta="0"
- name="total_num_cache_hits_label"
- top_delta="25"
- width="400">
- 3, Total number of cache hits: [NUM]
- </text>
- <text
- type="string"
- length="1"
- follows="left|top"
- height="25"
- layout="topleft"
- left_delta="0"
- name="total_num_visible_tex_label"
- top_delta="25"
- width="400">
- 4, Total number of visible textures: [NUM]
- </text>
- <text
- type="string"
- length="1"
- follows="left|top"
- height="25"
- layout="topleft"
- left_delta="0"
- name="total_num_visible_tex_fetch_req_label"
- top_delta="25"
- width="450">
- 5, Total number of visible texture fetching requests: [NUM]
- </text>
- <text
- type="string"
- length="1"
- follows="left|top"
- height="25"
- layout="topleft"
- left_delta="0"
- name="total_fetched_data_label"
- top_delta="25"
- width="530">
- 6, Total number of fetched data: [SIZE1]KB, Decoded Data: [SIZE2]KB, [PIXEL]MPixels
- </text>
- <text
- type="string"
- length="1"
- follows="left|top"
- height="25"
- layout="topleft"
- left_delta="0"
- name="total_fetched_vis_data_label"
- top_delta="25"
- width="480">
- 7, Total number of visible data: [SIZE1]KB, Decoded Data: [SIZE2]KB
- </text>
- <text
- type="string"
- length="1"
- follows="left|top"
- height="25"
- layout="topleft"
- left_delta="0"
- name="total_fetched_rendered_data_label"
- top_delta="25"
- width="530">
- 8, Total number of rendered data: [SIZE1]KB, Decoded Data: [SIZE2]KB, [PIXEL]MPixels
- </text>
- <text
- type="string"
- length="1"
- follows="left|top"
- height="25"
- layout="topleft"
- left_delta="0"
- name="total_time_cache_read_label"
- top_delta="25"
- width="400">
- 9, Total time on cache readings: [TIME] seconds
- </text>
- <text
- type="string"
- length="1"
- follows="left|top"
- height="25"
- layout="topleft"
- left_delta="0"
- name="total_time_cache_write_label"
- top_delta="25"
- width="400">
- 10, Total time on cache writings: [TIME] seconds
- </text>
- <text
- type="string"
- length="1"
- follows="left|top"
- height="25"
- layout="topleft"
- left_delta="0"
- name="total_time_decode_label"
- top_delta="25"
- width="400">
- 11, Total time on decodings: [TIME] seconds
- </text>
- <text
- type="string"
- length="1"
- follows="left|top"
- height="25"
- layout="topleft"
- left_delta="0"
- name="total_time_gl_label"
- top_delta="25"
- width="400">
- 12, Total time on gl texture creation: [TIME] seconds
- </text>
- <text
- type="string"
- length="1"
- follows="left|top"
- height="25"
- layout="topleft"
- left_delta="0"
- name="total_time_http_label"
- top_delta="25"
- width="400">
- 13, Total time on HTTP fetching: [TIME] seconds
- </text>
- <text
- type="string"
- length="1"
- follows="left|top"
- height="25"
- layout="topleft"
- left_delta="0"
- name="total_time_fetch_label"
- top_delta="25"
- width="400">
- 14, Total time on entire fetching: [TIME] seconds
- </text>
- <text
- type="string"
- length="1"
- follows="left|top"
- height="25"
- layout="topleft"
- left_delta="0"
- name="total_time_refetch_vis_cache_label"
- top_delta="25"
- width="540">
- 15, Refetching visibles from cache, Time: [TIME] seconds, Fetched: [SIZE]KB, [PIXEL]MPixels
- </text>
- <text
- type="string"
- length="1"
- follows="left|top"
- height="25"
- layout="topleft"
- left_delta="0"
- name="total_time_refetch_vis_http_label"
- top_delta="25"
- width="540">
- 16, Refetching visibles from HTTP, Time: [TIME] seconds, Fetched: [SIZE]KB, [PIXEL]MPixels
- </text>
- <spinner
- decimal_digits="2"
- follows="left|top"
- height="20"
- increment="0.01"
- initial_value="1.0"
- label="17, Ratio of Texel/Pixel:"
- label_width="130"
- layout="topleft"
- left_delta="0"
- max_val="10.0"
- min_val="0.01"
- name="texel_pixel_ratio"
- top_delta="30"
- width="200">
- <spinner.commit_callback
- function="TexFetchDebugger.ChangeTexelPixelRatio" />
- </spinner>
- <button
- follows="left|top"
- height="20"
- label="Start"
- layout="topleft"
- left_delta="0"
- name="start_btn"
- top_delta="30"
- width="70">
- <button.commit_callback
- function="TexFetchDebugger.Start" />
- </button>
- <button
- follows="left|top"
- height="20"
- label="Reset"
- layout="topleft"
- left_pad="7"
- name="clear_btn"
- top_delta="0"
- width="70">
- <button.commit_callback
- function="TexFetchDebugger.Clear" />
- </button>
- <button
- follows="left|top"
- height="20"
- label="Close"
- layout="topleft"
- left_pad="7"
- name="close_btn"
- top_delta="0"
- width="70">
- <button.commit_callback
- function="TexFetchDebugger.Close" />
- </button>
- <button
- follows="left|top"
- height="20"
- label="Cache Read"
- layout="topleft"
- left="10"
- name="cacheread_btn"
- top_delta="30"
- width="80">
- <button.commit_callback
- function="TexFetchDebugger.CacheRead" />
- </button>
- <button
- follows="left|top"
- height="20"
- label="Cache Write"
- layout="topleft"
- left_pad="7"
- name="cachewrite_btn"
- top_delta="0"
- width="80">
- <button.commit_callback
- function="TexFetchDebugger.CacheWrite" />
- </button>
- <button
- follows="left|top"
- height="20"
- label="HTTP"
- layout="topleft"
- left_pad="7"
- name="http_btn"
- top_delta="0"
- width="70">
- <button.commit_callback
- function="TexFetchDebugger.HTTPLoad" />
- </button>
- <button
- follows="left|top"
- height="20"
- label="Decode"
- layout="topleft"
- left_pad="7"
- name="decode_btn"
- top_delta="0"
- width="70">
- <button.commit_callback
- function="TexFetchDebugger.Decode" />
- </button>
- <button
- follows="left|top"
- height="20"
- label="GL Texture"
- layout="topleft"
- left_pad="7"
- name="gl_btn"
- top_delta="0"
- width="70">
- <button.commit_callback
- function="TexFetchDebugger.GLTexture" />
- </button>
- <button
- follows="left|top"
- height="20"
- label="Refetch Vis Cache"
- layout="topleft"
- left="10"
- name="refetchviscache_btn"
- top_delta="30"
- width="120">
- <button.commit_callback
- function="TexFetchDebugger.RefetchVisCache" />
- </button>
- <button
- follows="left|top"
- height="20"
- label="Refetch Vis HTTP"
- layout="topleft"
- left_pad="7"
- name="refetchvishttp_btn"
- top_delta="0"
- width="120">
- <button.commit_callback
- function="TexFetchDebugger.RefetchVisHTTP" />
- </button>
-</floater>
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<floater
+ legacy_header_height="18"
+ can_minimize="false"
+ height="600"
+ layout="topleft"
+ name="TexFetchDebugger"
+ help_topic="texfetchdebugger"
+ title="Texture Fetching Debugger"
+ width="540">
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="25"
+ layout="topleft"
+ left="10"
+ name="total_num_fetched_label"
+ top="30"
+ width="400">
+ 1, Total number of fetched textures: [NUM]
+ </text>
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="25"
+ layout="topleft"
+ left_delta="0"
+ name="total_num_fetching_requests_label"
+ top_delta="25"
+ width="400">
+ 2, Total number of fetching requests: [NUM]
+ </text>
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="25"
+ layout="topleft"
+ left_delta="0"
+ name="total_num_cache_hits_label"
+ top_delta="25"
+ width="400">
+ 3, Total number of cache hits: [NUM]
+ </text>
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="25"
+ layout="topleft"
+ left_delta="0"
+ name="total_num_visible_tex_label"
+ top_delta="25"
+ width="400">
+ 4, Total number of visible textures: [NUM]
+ </text>
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="25"
+ layout="topleft"
+ left_delta="0"
+ name="total_num_visible_tex_fetch_req_label"
+ top_delta="25"
+ width="450">
+ 5, Total number of visible texture fetching requests: [NUM]
+ </text>
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="25"
+ layout="topleft"
+ left_delta="0"
+ name="total_fetched_data_label"
+ top_delta="25"
+ width="530">
+ 6, Total number of fetched data: [SIZE1]KB, Decoded Data: [SIZE2]KB, [PIXEL]MPixels
+ </text>
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="25"
+ layout="topleft"
+ left_delta="0"
+ name="total_fetched_vis_data_label"
+ top_delta="25"
+ width="480">
+ 7, Total number of visible data: [SIZE1]KB, Decoded Data: [SIZE2]KB
+ </text>
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="25"
+ layout="topleft"
+ left_delta="0"
+ name="total_fetched_rendered_data_label"
+ top_delta="25"
+ width="530">
+ 8, Total number of rendered data: [SIZE1]KB, Decoded Data: [SIZE2]KB, [PIXEL]MPixels
+ </text>
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="25"
+ layout="topleft"
+ left_delta="0"
+ name="total_time_cache_read_label"
+ top_delta="25"
+ width="400">
+ 9, Total time on cache readings: [TIME] seconds
+ </text>
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="25"
+ layout="topleft"
+ left_delta="0"
+ name="total_time_cache_write_label"
+ top_delta="25"
+ width="400">
+ 10, Total time on cache writings: [TIME] seconds
+ </text>
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="25"
+ layout="topleft"
+ left_delta="0"
+ name="total_time_decode_label"
+ top_delta="25"
+ width="400">
+ 11, Total time on decodings: [TIME] seconds
+ </text>
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="25"
+ layout="topleft"
+ left_delta="0"
+ name="total_time_gl_label"
+ top_delta="25"
+ width="400">
+ 12, Total time on gl texture creation: [TIME] seconds
+ </text>
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="25"
+ layout="topleft"
+ left_delta="0"
+ name="total_time_http_label"
+ top_delta="25"
+ width="400">
+ 13, Total time on HTTP fetching: [TIME] seconds
+ </text>
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="25"
+ layout="topleft"
+ left_delta="0"
+ name="total_time_fetch_label"
+ top_delta="25"
+ width="400">
+ 14, Total time on entire fetching: [TIME] seconds
+ </text>
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="25"
+ layout="topleft"
+ left_delta="0"
+ name="total_time_refetch_vis_cache_label"
+ top_delta="25"
+ width="540">
+ 15, Refetching visibles from cache, Time: [TIME] seconds, Fetched: [SIZE]KB, [PIXEL]MPixels
+ </text>
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="25"
+ layout="topleft"
+ left_delta="0"
+ name="total_time_refetch_all_cache_label"
+ top_delta="25"
+ width="540">
+ 16, Refetching all textures from cache, Time: [TIME] seconds, Fetched: [SIZE]KB, [PIXEL]MPixels
+ </text>
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="25"
+ layout="topleft"
+ left_delta="0"
+ name="total_time_refetch_vis_http_label"
+ top_delta="25"
+ width="540">
+ 17, Refetching visibles from HTTP, Time: [TIME] seconds, Fetched: [SIZE]KB, [PIXEL]MPixels
+ </text>
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="25"
+ layout="topleft"
+ left_delta="0"
+ name="total_time_refetch_all_http_label"
+ top_delta="25"
+ width="540">
+ 18, Refetching all textures from HTTP, Time: [TIME] seconds, Fetched: [SIZE]KB, [PIXEL]MPixels
+ </text>
+ <spinner
+ decimal_digits="2"
+ follows="left|top"
+ height="20"
+ increment="0.01"
+ initial_value="1.0"
+ label="19, Ratio of Texel/Pixel:"
+ label_width="130"
+ layout="topleft"
+ left_delta="0"
+ max_val="10.0"
+ min_val="0.01"
+ name="texel_pixel_ratio"
+ top_delta="30"
+ width="200">
+ <spinner.commit_callback
+ function="TexFetchDebugger.ChangeTexelPixelRatio" />
+ </spinner>
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="25"
+ layout="topleft"
+ left_delta="0"
+ name="texture_source_label"
+ top_delta="30"
+ width="110">
+ 20, Texture Source:
+ </text>
+ <radio_group
+ control_name="TextureFetchSource"
+ follows="top|left"
+ draw_border="false"
+ height="25"
+ layout="topleft"
+ left_pad="0"
+ name="texture_source"
+ top_delta="0"
+ width="264">
+ <radio_item
+ height="16"
+ label="Cache + HTTP"
+ layout="topleft"
+ left="3"
+ name="0"
+ top="0"
+ width="100" />
+ <radio_item
+ height="16"
+ label="HTTP Only"
+ layout="topleft"
+ left_delta="100"
+ name="1"
+ top_delta="0"
+ width="200" />
+ </radio_group>
+ <button
+ follows="left|top"
+ height="20"
+ label="Start"
+ layout="topleft"
+ left="10"
+ name="start_btn"
+ top_delta="20"
+ width="70">
+ <button.commit_callback
+ function="TexFetchDebugger.Start" />
+ </button>
+ <button
+ follows="left|top"
+ height="20"
+ label="Reset"
+ layout="topleft"
+ left_pad="7"
+ name="clear_btn"
+ top_delta="0"
+ width="70">
+ <button.commit_callback
+ function="TexFetchDebugger.Clear" />
+ </button>
+ <button
+ follows="left|top"
+ height="20"
+ label="Close"
+ layout="topleft"
+ left_pad="7"
+ name="close_btn"
+ top_delta="0"
+ width="70">
+ <button.commit_callback
+ function="TexFetchDebugger.Close" />
+ </button>
+ <button
+ follows="left|top"
+ height="20"
+ label="Cache Read"
+ layout="topleft"
+ left="10"
+ name="cacheread_btn"
+ top_delta="20"
+ width="80">
+ <button.commit_callback
+ function="TexFetchDebugger.CacheRead" />
+ </button>
+ <button
+ follows="left|top"
+ height="20"
+ label="Cache Write"
+ layout="topleft"
+ left_pad="7"
+ name="cachewrite_btn"
+ top_delta="0"
+ width="80">
+ <button.commit_callback
+ function="TexFetchDebugger.CacheWrite" />
+ </button>
+ <button
+ follows="left|top"
+ height="20"
+ label="HTTP"
+ layout="topleft"
+ left_pad="7"
+ name="http_btn"
+ top_delta="0"
+ width="70">
+ <button.commit_callback
+ function="TexFetchDebugger.HTTPLoad" />
+ </button>
+ <button
+ follows="left|top"
+ height="20"
+ label="Decode"
+ layout="topleft"
+ left_pad="7"
+ name="decode_btn"
+ top_delta="0"
+ width="70">
+ <button.commit_callback
+ function="TexFetchDebugger.Decode" />
+ </button>
+ <button
+ follows="left|top"
+ height="20"
+ label="GL Texture"
+ layout="topleft"
+ left_pad="7"
+ name="gl_btn"
+ top_delta="0"
+ width="70">
+ <button.commit_callback
+ function="TexFetchDebugger.GLTexture" />
+ </button>
+ <button
+ follows="left|top"
+ height="20"
+ label="Refetch Vis Cache"
+ layout="topleft"
+ left="10"
+ name="refetchviscache_btn"
+ top_delta="20"
+ width="120">
+ <button.commit_callback
+ function="TexFetchDebugger.RefetchVisCache" />
+ </button>
+ <button
+ follows="left|top"
+ height="20"
+ label="Refetch All Cache"
+ layout="topleft"
+ left_pad="7"
+ name="refetchallcache_btn"
+ top_delta="0"
+ width="120">
+ <button.commit_callback
+ function="TexFetchDebugger.RefetchAllCache" />
+ </button>
+ <button
+ follows="left|top"
+ height="20"
+ label="Refetch Vis HTTP"
+ layout="topleft"
+ left_pad="7"
+ name="refetchvishttp_btn"
+ top_delta="0"
+ width="120">
+ <button.commit_callback
+ function="TexFetchDebugger.RefetchVisHTTP" />
+ </button>
+ <button
+ follows="left|top"
+ height="20"
+ label="Refetch All HTTP"
+ layout="topleft"
+ left_pad="7"
+ name="refetchallhttp_btn"
+ top_delta="0"
+ width="120">
+ <button.commit_callback
+ function="TexFetchDebugger.RefetchAllHTTP" />
+ </button>
+</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_tools.xml b/indra/newview/skins/default/xui/en/floater_tools.xml
index e37740d20c..5204efbf65 100644
--- a/indra/newview/skins/default/xui/en/floater_tools.xml
+++ b/indra/newview/skins/default/xui/en/floater_tools.xml
@@ -2,7 +2,7 @@
<floater
positioning="cascading"
legacy_header_height="18"
- height="580"
+ height="590"
layout="topleft"
bg_opaque_image="Window_NoTitle_Foreground"
bg_alpha_image="Window_NoTitle_Background"
@@ -877,6 +877,14 @@
You can't modify these objects
</panel.string>
<panel.string
+ name="text modify info 5">
+ You can't modify this object across a region boundary
+ </panel.string>
+ <panel.string
+ name="text modify info 6">
+ You can't modify these objects across a region boundary
+ </panel.string>
+ <panel.string
name="text modify warning">
You must select entire object to set permissions
</panel.string>
@@ -941,7 +949,7 @@
left="10"
length="1"
follows="left|top"
- height="19"
+ height="29"
layout="topleft"
name="Creator:"
top_pad="7"
@@ -954,7 +962,7 @@
length="1"
follows="left|top"
left_pad="0"
- height="20"
+ height="29"
layout="topleft"
name="Creator Name"
top_delta="0"
@@ -969,10 +977,10 @@
length="1"
left="10"
follows="left|top"
- height="19"
+ height="29"
layout="topleft"
name="Owner:"
- top_pad="13"
+ top_pad="3"
width="90">
Owner:
</text>
@@ -981,7 +989,7 @@
type="string"
length="1"
follows="left|top"
- height="20"
+ height="29"
layout="topleft"
name="Owner Name"
left_pad="0"
@@ -1000,7 +1008,7 @@
left="10"
height="18"
name="Group:"
- top_pad="17"
+ top_pad="3"
width="75">
Group:
</text>
@@ -1029,7 +1037,7 @@
layout="topleft"
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."
- top_pad="10"
+ top_pad="5"
left="100"
width="87" />
<button
@@ -1051,7 +1059,7 @@
top_pad="10"
left="10"
name="label click action"
- width="118">
+ width="82">
Click to:
</text>
<combo_box
@@ -1059,7 +1067,7 @@
height="23"
layout="topleft"
name="clickaction"
- width="148"
+ width="130"
left_pad="10">
<combo_box.item
label="Touch (default)"
@@ -1092,19 +1100,39 @@
layout="topleft"
name="checkbox for sale"
left="7"
- width="100" />
-<!-- NEW SALE TYPE COMBO BOX -->
+ width="97" />
+ <!-- NEW PRICE SPINNER
+Objects are allowed to be for sale for L$0 to invoke buy UI behavior
+even though the user gets a free copy.
+-->
+ <spinner
+ follows="left|top"
+ decimal_digits="0"
+ increment="1"
+ left_pad="0"
+ control_name="Edit Cost"
+ name="Edit Cost"
+ label="L$"
+ label_width="15"
+ label_text.valign="center"
+ valign="center"
+ width="85"
+ min_val="0"
+ height="20"
+ max_val="999999999" />
+ <!-- NEW SALE TYPE COMBO BOX -->
<combo_box
- left_pad="10"
+ left_pad="8"
layout="topleft"
follows="left|top"
allow_text_entry="false"
height="23"
+ top_pad="-23"
initial_value="2"
max_chars="20"
mouse_opaque="true"
name="sale type"
- width="168">
+ width="89">
<combo_box.item
name="Copy"
label="Copy"
@@ -1118,31 +1146,13 @@
label="Original"
value="1" />
</combo_box>
-<!-- NEW PRICE SPINNER
-Objects are allowed to be for sale for L$0 to invoke buy UI behavior
-even though the user gets a free copy.
--->
- <spinner
- follows="left|top"
- decimal_digits="0"
- increment="1"
- top_pad="8"
- left="118"
- control_name="Edit Cost"
- name="Edit Cost"
- label="Price: L$"
- label_width="65"
- width="165"
- min_val="0"
- height="20"
- max_val="999999999" />
<check_box
height="15"
width="110"
top_pad="5"
label="Show in search"
layout="topleft"
- left="100"
+ left="7"
name="search_check"
tool_tip="Let people see this object in search results" />
<panel
@@ -1155,15 +1165,16 @@ even though the user gets a free copy.
name="perms_build"
left="0"
top_pad="4"
- height="105"
+ height="121"
width="290">
<text
type="string"
length="1"
left="10"
+ word_wrap="true"
top_pad="9"
text_color="EmphasisColor"
- height="16"
+ height="32"
follows="left|top|right"
layout="topleft"
name="perm_modify"
@@ -1233,7 +1244,7 @@ even though the user gets a free copy.
type="string"
text_color="EmphasisColor"
length="1"
- top="9"
+ top="23"
follows="left|top"
layout="topleft"
left="230"
@@ -1308,7 +1319,36 @@ even though the user gets a free copy.
F:
</text>
</panel>
- </panel>
+ <panel
+ border="false"
+ follows="left|top"
+ layout="topleft"
+ mouse_opaque="false"
+ name="pathfinding_attrs_panel"
+ left="0"
+ top_pad="0"
+ height="25"
+ width="290">
+ <text
+ type="string"
+ follows="left|top"
+ name="pathfinding_attributes_label"
+ top_pad="4"
+ width="150"
+ left="10">
+ Pathfinding attributes:
+ </text>
+ <text
+ type="string"
+ follows="left|top"
+ text_color="EmphasisColor"
+ name="pathfinding_attributes_value"
+ width="130"
+ word_wrap="false"
+ left_pad="0">
+ </text>
+ </panel>
+ </panel>
<!-- Object tab -->
<panel
border="false"
@@ -1355,8 +1395,7 @@ even though the user gets a free copy.
tool_tip="Causes object to not collide with other objects or avatars"
top_pad="0"
width="123" />
-
- <text
+ <text
type="string"
length="1"
follows="left|top"
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 4dfdcd15c7..0b71177345 100644
--- a/indra/newview/skins/default/xui/en/floater_top_objects.xml
+++ b/indra/newview/skins/default/xui/en/floater_top_objects.xml
@@ -2,7 +2,7 @@
<floater
legacy_header_height="18"
can_resize="true"
- height="350"
+ height="372"
layout="topleft"
min_height="300"
min_width="450"
@@ -23,10 +23,6 @@
Time
</floater.string>
<floater.string
- name="scripts_mono_time_label">
- Mono Time
- </floater.string>
- <floater.string
name="top_colliders_title">
Top Colliders
</floater.string>
@@ -68,31 +64,35 @@
<scroll_list.columns
label="Score"
name="score"
- width="55" />
+ width="45" />
<scroll_list.columns
label="Name"
name="name"
- width="140" />
+ width="130" />
<scroll_list.columns
label="Owner"
name="owner"
- width="105" />
+ width="100" />
<scroll_list.columns
label="Location"
name="location"
- width="130" />
+ width="120" />
+ <scroll_list.columns
+ label="Parcel"
+ name="parcel"
+ width="120" />
<scroll_list.columns
label="Time"
name="time"
- width="150" />
- <scroll_list.columns
- label="Mono Time"
- name="mono_time"
- width="100" />
+ width="130" />
<scroll_list.columns
label="URLs"
name="URLs"
- width="100" />
+ width="40" />
+ <scroll_list.columns
+ label="Memory (KB)"
+ name="memory"
+ width="40" />
<scroll_list.commit_callback
function="TopObjects.CommitObjectsList" />
</scroll_list>
@@ -193,6 +193,38 @@
<button.commit_callback
function="TopObjects.GetByOwnerName" />
</button>
+ <text
+ type="string"
+ length="1"
+ follows="left|bottom"
+ height="20"
+ layout="topleft"
+ left="10"
+ top_pad="5"
+ name="parcel_name_text"
+ width="107">
+ Parcel:
+ </text>
+ <line_editor
+ follows="left|bottom|right"
+ height="20"
+ layout="topleft"
+ left_pad="3"
+ name="parcel_name_editor"
+ top_delta="-3"
+ width="568" />
+ <button
+ follows="bottom|right"
+ height="23"
+ label="Filter"
+ layout="topleft"
+ left_pad="5"
+ name="filter_parcel_btn"
+ top_delta="0"
+ width="100">
+ <button.commit_callback
+ function="TopObjects.GetByParcelName" />
+ </button>
<button
follows="bottom|right"
height="22"
diff --git a/indra/newview/skins/default/xui/en/menu_inventory.xml b/indra/newview/skins/default/xui/en/menu_inventory.xml
index b13bf5b508..13dc0b941a 100644
--- a/indra/newview/skins/default/xui/en/menu_inventory.xml
+++ b/indra/newview/skins/default/xui/en/menu_inventory.xml
@@ -537,6 +537,14 @@
layout="topleft"
name="Landmark Separator" />
<menu_item_call
+ label="Copy SLurl"
+ layout="topleft"
+ name="url_copy">
+ <menu_item_call.on_click
+ function="Inventory.DoToSelected"
+ parameter="copy_slurl" />
+ </menu_item_call>
+ <menu_item_call
label="About Landmark"
layout="topleft"
name="About Landmark">
diff --git a/indra/newview/skins/default/xui/en/menu_object.xml b/indra/newview/skins/default/xui/en/menu_object.xml
index 719509301b..52b9524b11 100644
--- a/indra/newview/skins/default/xui/en/menu_object.xml
+++ b/indra/newview/skins/default/xui/en/menu_object.xml
@@ -1,179 +1,199 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<context_menu
- layout="topleft"
- name="Object Pie">
- <menu_item_call
- enabled="false"
- label="Touch"
- name="Object Touch">
- <menu_item_call.on_click
- function="Object.Touch" />
- <menu_item_call.on_enable
- function="Object.EnableTouch"
- name="EnableTouch"
- parameter="Touch" />
- </menu_item_call>
- <menu_item_call
- label="Edit"
- name="Edit...">
- <menu_item_call.on_click
- function="Object.Edit" />
+ layout="topleft"
+ name="Object Pie">
+ <menu_item_call
+ enabled="false"
+ label="Touch"
+ name="Object Touch">
+ <menu_item_call.on_click
+ function="Object.Touch" />
<menu_item_call.on_enable
- function="EnableEdit"/>
- </menu_item_call>
- <menu_item_call
+ function="Object.EnableTouch"
+ name="EnableTouch"
+ parameter="Touch" />
+ </menu_item_call>
+ <menu_item_call
+ label="Edit"
+ name="Edit...">
+ <menu_item_call.on_click
+ function="Object.Edit" />
+ <menu_item_call.on_enable
+ function="EnableEdit"/>
+ </menu_item_call>
+ <menu_item_call
label="Build"
name="Build">
- <menu_item_call.on_click
+ <menu_item_call.on_click
function="Object.Build" />
- <menu_item_call.on_enable
- function="EnableEdit"/>
- </menu_item_call>
- <menu_item_call
- enabled="false"
- label="Open"
- name="Open">
- <menu_item_call.on_click
- function="Object.Open" />
- <menu_item_call.on_enable
- function="Object.EnableOpen" />
- </menu_item_call>
- <menu_item_call
- enabled="false"
- label="Sit Here"
- name="Object Sit">
- <menu_item_call.on_click
- function="Object.SitOrStand" />
- <menu_item_call.on_enable
- function="Object.EnableSit" />
- </menu_item_call>
- <menu_item_call
- enabled="false"
- label="Stand Up"
- name="Object Stand Up">
- <menu_item_call.on_click
- function="Object.SitOrStand" />
- <menu_item_call.on_enable
- function="Object.EnableStandUp" />
- </menu_item_call>
- <menu_item_call
- label="Object Profile"
- name="Object Inspect">
- <menu_item_call.on_click
- function="Object.Inspect" />
- <menu_item_call.on_enable
- function="Object.EnableInspect" />
- </menu_item_call>
+ <menu_item_call.on_enable
+ function="EnableEdit"/>
+ </menu_item_call>
<menu_item_call
- label="Zoom In"
- name="Zoom In">
+ label="Show in linksets"
+ name="show_in_linksets">
<menu_item_call.on_click
- function="Object.ZoomIn" />
+ function="Pathfinding.Linksets.Select" />
+ <menu_item_call.on_enable
+ function="EnableSelectInPathfindingLinksets"/>
+ <menu_item_call.on_visible
+ function="EnableSelectInPathfindingLinksets"/>
+ </menu_item_call>
+ <menu_item_call
+ label="Show in characters"
+ name="show_in_characters">
+ <menu_item_call.on_click
+ function="Pathfinding.Characters.Select" />
+ <menu_item_call.on_enable
+ function="EnableSelectInPathfindingCharacters"/>
+ <menu_item_call.on_visible
+ function="EnableSelectInPathfindingCharacters"/>
</menu_item_call>
-<menu_item_separator layout="topleft" />
- <context_menu
- label="Put On"
- name="Put On" >
- <menu_item_call
+ <menu_item_call
enabled="false"
- label="Wear"
- name="Wear">
- <menu_item_call.on_click
- function="Object.AttachToAvatar" />
- <menu_item_call.on_enable
- function="Object.EnableWear" />
- </menu_item_call>
- <menu_item_call
+ label="Open"
+ name="Open">
+ <menu_item_call.on_click
+ function="Object.Open" />
+ <menu_item_call.on_enable
+ function="Object.EnableOpen" />
+ </menu_item_call>
+ <menu_item_call
enabled="false"
- label="Add"
- name="Add">
- <menu_item_call.on_click
- function="Object.AttachAddToAvatar" />
- <menu_item_call.on_enable
- function="Object.EnableWear" />
- </menu_item_call>
- <context_menu
- label="Attach"
- name="Object Attach" />
- <context_menu
- label="Attach HUD"
- name="Object Attach HUD" />
- </context_menu>
- <context_menu
- label="Manage"
- name="Remove">
- <menu_item_call
- enabled="false"
- label="Report Abuse"
- name="Report Abuse...">
- <menu_item_call.on_click
- function="Object.ReportAbuse" />
- <menu_item_call.on_enable
- function="Object.EnableReportAbuse" />
- </menu_item_call>
- <menu_item_call
- enabled="false"
- label="Block"
- name="Object Mute">
- <menu_item_call.on_click
- function="Object.Mute" />
- <menu_item_call.on_enable
- function="Object.EnableMute" />
- </menu_item_call>
- <menu_item_call
+ label="Sit Here"
+ name="Object Sit">
+ <menu_item_call.on_click
+ function="Object.SitOrStand" />
+ <menu_item_call.on_enable
+ function="Object.EnableSit" />
+ </menu_item_call>
+ <menu_item_call
enabled="false"
- label="Return"
- name="Return...">
- <menu_item_call.on_click
- function="Object.Return" />
- <menu_item_call.on_enable
- function="Object.EnableReturn" />
- </menu_item_call>
- </context_menu>
- <menu_item_separator layout="topleft" />
- <menu_item_call
- label="Take"
- layout="topleft"
- name="Pie Object Take">
+ label="Stand Up"
+ name="Object Stand Up">
+ <menu_item_call.on_click
+ function="Object.SitOrStand" />
+ <menu_item_call.on_enable
+ function="Object.EnableStandUp" />
+ </menu_item_call>
+ <menu_item_call
+ label="Object Profile"
+ name="Object Inspect">
+ <menu_item_call.on_click
+ function="Object.Inspect" />
+ <menu_item_call.on_enable
+ function="Object.EnableInspect" />
+ </menu_item_call>
+ <menu_item_call
+ label="Zoom In"
+ name="Zoom In">
+ <menu_item_call.on_click
+ function="Object.ZoomIn" />
+ </menu_item_call>
+ <menu_item_separator layout="topleft" />
+ <context_menu
+ label="Put On"
+ name="Put On" >
+ <menu_item_call
+ enabled="false"
+ label="Wear"
+ name="Wear">
<menu_item_call.on_click
- function="Object.Take"/>
+ function="Object.AttachToAvatar" />
<menu_item_call.on_enable
- function="Object.VisibleTake"/>
- </menu_item_call>
- <menu_item_call
- enabled="false"
- label="Take Copy"
- name="Take Copy">
+ function="Object.EnableWear" />
+ </menu_item_call>
+ <menu_item_call
+ enabled="false"
+ label="Add"
+ name="Add">
<menu_item_call.on_click
- function="Tools.TakeCopy" />
+ function="Object.AttachAddToAvatar" />
<menu_item_call.on_enable
- function="Tools.EnableTakeCopy" />
- </menu_item_call>
- <menu_item_call
- enabled="false"
- label="Pay"
- name="Pay...">
- <menu_item_call.on_click
- function="PayObject" />
- <menu_item_call.on_enable
- function="EnablePayObject" />
-</menu_item_call>
- <menu_item_call
- enabled="false"
- label="Buy"
- name="Buy...">
+ function="Object.EnableWear" />
+ </menu_item_call>
+ <context_menu
+ label="Attach"
+ name="Object Attach" />
+ <context_menu
+ label="Attach HUD"
+ name="Object Attach HUD" />
+ </context_menu>
+ <context_menu
+ label="Manage"
+ name="Remove">
+ <menu_item_call
+ enabled="false"
+ label="Report Abuse"
+ name="Report Abuse...">
+ <menu_item_call.on_click
+ function="Object.ReportAbuse" />
+ <menu_item_call.on_enable
+ function="Object.EnableReportAbuse" />
+ </menu_item_call>
+ <menu_item_call
+ enabled="false"
+ label="Block"
+ name="Object Mute">
<menu_item_call.on_click
- function="Object.Buy" />
+ function="Object.Mute" />
<menu_item_call.on_enable
- function="Object.EnableBuy" />
- </menu_item_call>
- <menu_item_call
- enabled="false"
- label="Delete"
- name="Delete">
+ function="Object.EnableMute" />
+ </menu_item_call>
+ <menu_item_call
+ enabled="false"
+ label="Return"
+ name="Return...">
<menu_item_call.on_click
- function="Object.Delete" />
+ function="Object.Return" />
<menu_item_call.on_enable
- function="Object.EnableDelete" />
+ function="Object.EnableReturn" />
+ </menu_item_call>
+ </context_menu>
+ <menu_item_separator layout="topleft" />
+ <menu_item_call
+ label="Take"
+ layout="topleft"
+ name="Pie Object Take">
+ <menu_item_call.on_click
+ function="Object.Take"/>
+ <menu_item_call.on_enable
+ function="Object.VisibleTake"/>
+ </menu_item_call>
+ <menu_item_call
+ enabled="false"
+ label="Take Copy"
+ name="Take Copy">
+ <menu_item_call.on_click
+ function="Tools.TakeCopy" />
+ <menu_item_call.on_enable
+ function="Tools.EnableTakeCopy" />
+ </menu_item_call>
+ <menu_item_call
+ enabled="false"
+ label="Pay"
+ name="Pay...">
+ <menu_item_call.on_click
+ function="PayObject" />
+ <menu_item_call.on_enable
+ function="EnablePayObject" />
+ </menu_item_call>
+ <menu_item_call
+ enabled="false"
+ label="Buy"
+ name="Buy...">
+ <menu_item_call.on_click
+ function="Object.Buy" />
+ <menu_item_call.on_enable
+ function="Object.EnableBuy" />
+ </menu_item_call>
+ <menu_item_call
+ enabled="false"
+ label="Delete"
+ name="Delete">
+ <menu_item_call.on_click
+ function="Object.Delete" />
+ <menu_item_call.on_enable
+ function="Object.EnableDelete" />
</menu_item_call>
</context_menu>
diff --git a/indra/newview/skins/default/xui/en/menu_text_editor.xml b/indra/newview/skins/default/xui/en/menu_text_editor.xml
index fe8489166b..70b40dd89b 100644
--- a/indra/newview/skins/default/xui/en/menu_text_editor.xml
+++ b/indra/newview/skins/default/xui/en/menu_text_editor.xml
@@ -2,6 +2,85 @@
<context_menu
name="Text editor context menu">
<menu_item_call
+ label="(unknown)"
+ layout="topleft"
+ name="Suggestion 1">
+ <menu_item_call.on_click
+ function="SpellCheck.ReplaceWithSuggestion"
+ parameter="0" />
+ <menu_item_call.on_visible
+ function="SpellCheck.VisibleSuggestion"
+ parameter="0" />
+ </menu_item_call>
+ <menu_item_call
+ label="(unknown)"
+ layout="topleft"
+ name="Suggestion 2">
+ <menu_item_call.on_click
+ function="SpellCheck.ReplaceWithSuggestion"
+ parameter="1" />
+ <menu_item_call.on_visible
+ function="SpellCheck.VisibleSuggestion"
+ parameter="1" />
+ </menu_item_call>
+ <menu_item_call
+ label="(unknown)"
+ layout="topleft"
+ name="Suggestion 3">
+ <menu_item_call.on_click
+ function="SpellCheck.ReplaceWithSuggestion"
+ parameter="2" />
+ <menu_item_call.on_visible
+ function="SpellCheck.VisibleSuggestion"
+ parameter="2" />
+ </menu_item_call>
+ <menu_item_call
+ label="(unknown)"
+ layout="topleft"
+ name="Suggestion 4">
+ <menu_item_call.on_click
+ function="SpellCheck.ReplaceWithSuggestion"
+ parameter="3" />
+ <menu_item_call.on_visible
+ function="SpellCheck.VisibleSuggestion"
+ parameter="3" />
+ </menu_item_call>
+ <menu_item_call
+ label="(unknown)"
+ layout="topleft"
+ name="Suggestion 5">
+ <menu_item_call.on_click
+ function="SpellCheck.ReplaceWithSuggestion"
+ parameter="4" />
+ <menu_item_call.on_visible
+ function="SpellCheck.VisibleSuggestion"
+ parameter="4" />
+ </menu_item_call>
+ <menu_item_separator
+ layout="topleft"
+ name="Suggestion Separator" />
+ <menu_item_call
+ label="Add to Dictionary"
+ layout="topleft"
+ name="Add to Dictionary">
+ <menu_item_call.on_click
+ function="SpellCheck.AddToDictionary" />
+ <menu_item_call.on_enable
+ function="SpellCheck.EnableAddToDictionary" />
+ </menu_item_call>
+ <menu_item_call
+ label="Add to Ignore"
+ layout="topleft"
+ name="Add to Ignore">
+ <menu_item_call.on_click
+ function="SpellCheck.AddToIgnore" />
+ <menu_item_call.on_enable
+ function="SpellCheck.EnableAddToIgnore" />
+ </menu_item_call>
+ <menu_item_separator
+ layout="topleft"
+ name="Spellcheck Separator" />
+ <menu_item_call
label="Cut"
layout="topleft"
name="Cut">
diff --git a/indra/newview/skins/default/xui/en/menu_viewer.xml b/indra/newview/skins/default/xui/en/menu_viewer.xml
index a6898c554f..1aa55acf2d 100644
--- a/indra/newview/skins/default/xui/en/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/en/menu_viewer.xml
@@ -193,6 +193,15 @@
<menu_item_call.on_click
function="View.ToggleUI" />
</menu_item_call>
+ <menu_item_check
+ label="Show HUD Attachments"
+ name="Show HUD Attachments"
+ shortcut="alt|shift|H">
+ <menu_item_check.on_check
+ function="View.CheckHUDAttachments" />
+ <menu_item_check.on_click
+ function="View.ShowHUDAttachments" />
+ </menu_item_check>
<menu_item_separator/>
@@ -291,6 +300,12 @@
function="SideTray.PanelPeopleTab"
parameter="nearby_panel" />
</menu_item_call>
+ <menu_item_call
+ label="Block List"
+ name="Block List">
+ <menu_item_call.on_click
+ function="Communicate.BlockList" />
+ </menu_item_call>
</menu>
<menu
create_jump_keys="true"
@@ -937,7 +952,42 @@
</menu_item_call>
</menu>
- <menu_item_separator/>
+ <menu
+ create_jump_keys="true"
+ label="Pathfinding"
+ name="Pathfinding"
+ tear_off="false">
+ <menu_item_call
+ label="Linksets..."
+ name="pathfinding_linksets_menu_item">
+ <menu_item_call.on_click
+ function="Floater.ToggleOrBringToFront"
+ parameter="pathfinding_linksets" />
+ <menu_item_call.on_enable
+ function="Tools.EnablePathfinding" />
+ </menu_item_call>
+ <menu_item_call
+ label="Characters..."
+ name="pathfinding_characters_menu_item">
+ <menu_item_call.on_click
+ function="Floater.ToggleOrBringToFront"
+ parameter="pathfinding_characters" />
+ <menu_item_call.on_enable
+ function="Tools.EnablePathfinding" />
+ </menu_item_call>
+ <menu_item_call
+ label="View / test..."
+ name="pathfinding_console_menu_item">
+ <menu_item_call.on_click
+ function="Floater.ToggleOrBringToFront"
+ parameter="pathfinding_console" />
+ <menu_item_call.on_enable
+ function="Tools.EnablePathfindingView" />
+ </menu_item_call>
+ </menu>
+
+
+ <menu_item_separator/>
<menu
create_jump_keys="true"
@@ -1374,15 +1424,6 @@
function="View.HighlightTransparent" />
</menu_item_check>
<menu_item_check
- label="Show HUD Attachments"
- name="Show HUD Attachments"
- shortcut="alt|shift|H">
- <menu_item_check.on_check
- function="View.CheckHUDAttachments" />
- <menu_item_check.on_click
- function="View.ShowHUDAttachments" />
- </menu_item_check>
- <menu_item_check
label="Show Mouselook Crosshairs"
name="ShowCrosshairs">
<menu_item_check.on_check
@@ -3125,12 +3166,6 @@
<menu_item_call.on_click
function="Advanced.TestFemale" />
</menu_item_call>
- <menu_item_call
- label="Toggle PG"
- name="Toggle PG">
- <menu_item_call.on_click
- function="Advanced.TogglePG" />
- </menu_item_call>
<menu_item_check
label="Allow Select Avatar"
name="Allow Select Avatar">
diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml
index a26c5bb344..c0c04da2d0 100644
--- a/indra/newview/skins/default/xui/en/notifications.xml
+++ b/indra/newview/skins/default/xui/en/notifications.xml
@@ -77,6 +77,21 @@
</form>
</template>
+ <template name="okhelpignore">
+ <form>
+ <button
+ default="true"
+ index="0"
+ name="OK_okhelpignore"
+ text="$yestext"/>
+ <button
+ index="1"
+ name="Help_okhelpignore"
+ text="$helptext"/>
+ <ignore text="$ignoretext"/>
+ </form>
+ </template>
+
<template name="yesnocancelbuttons">
<form>
<button
@@ -881,8 +896,7 @@ You need an account to enter [SECOND_LIFE]. Would you like to create one now?
option="0"
name="url"
target = "_external">
-
- http://join.secondlife.com/
+ [create_account_url]
</url>
<usetemplate
name="okcancelbuttons"
@@ -898,7 +912,22 @@ You need an account to enter [SECOND_LIFE]. Would you like to create one now?
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
+ icon="alertmodal.tga"
+ name="InvalidGrid"
+ type="alertmodal">
+ <tag>fail</tag>
+'[GRID]' is not a valid grid identifier.
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="InvalidLocationSLURL"
+ type="alertmodal">
+ <tag>fail</tag>
+Your start location did not specify a valid grid.
+ </notification>
+
<notification
icon="alertmodal.tga"
name="DeleteClassified"
@@ -1190,7 +1219,7 @@ There was a problem saving a compiled script due to the following reason: [REASO
icon="alertmodal.tga"
name="StartRegionEmpty"
type="alertmodal">
-Oops, Your Start Region is not defined.
+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.
<tag>fail</tag>
<usetemplate
@@ -1501,6 +1530,14 @@ Please make sure none are locked, and that you own all of them.
<notification
icon="alertmodal.tga"
+ name="CannotLinkPermanent"
+ type="alertmodal">
+ Objects cannot be linked across region boundaries.
+ <tag>fail</tag>
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
name="CannotLinkDifferentOwners"
type="alertmodal">
Unable to link because not all of the objects have the same owner.
@@ -2359,6 +2396,93 @@ Would you be my friend?
</notification>
<notification
+ icon="alertmodal.tga"
+ label="Add Auto-Replace List"
+ name="AddAutoReplaceList"
+ type="alertmodal">
+ <tag>addlist</tag>
+ Name for the new list:
+ <tag>confirm</tag>
+ <form name="form">
+ <input name="listname" type="text"/>
+ <button
+ default="true"
+ index="0"
+ name="SetName"
+ text="OK"/>
+ </form>
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ label="Rename Auto-Replace List"
+ name="RenameAutoReplaceList"
+ type="alertmodal">
+ The name '[DUPNAME]' is in use
+ Enter a new unique name:
+ <tag>confirm</tag>
+ <form name="form">
+ <input name="listname" type="text"/>
+ <button
+ default="false"
+ index="0"
+ name="ReplaceList"
+ text="Replace Current List"/>
+ <button
+ default="true"
+ index="1"
+ name="SetName"
+ text="Use New Name"/>
+ </form>
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="InvalidAutoReplaceEntry"
+ type="alertmodal">
+ The keyword must be a single word, and the replacement may not be empty.
+ <tag>fail</tag>
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="InvalidAutoReplaceList"
+ type="alertmodal">
+ That replacement list is not valid.
+ <tag>fail</tag>
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="SpellingDictImportRequired"
+ type="alertmodal">
+ You must specify a file, a name, and a language.
+ <tag>fail</tag>
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="SpellingDictIsSecondary"
+ type="alertmodal">
+The dictionary [DIC_NAME] does not appear to have an "aff" file; this means that it is a "secondary" dictionary.
+It can be used as an additional dictionary, but not as your Main dictionary.
+
+See https://wiki.secondlife.com/wiki/Adding_Spelling_Dictionaries
+ <tag>confirm</tag>
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="SpellingDictImportFailed"
+ type="alertmodal">
+ Unable to copy
+ [FROM_NAME]
+ to
+ [TO_NAME]
+ <tag>fail</tag>
+ </notification>
+
+ <notification
icon="alertmodal.tga"
label="Save Outfit"
name="SaveOutfitAs"
@@ -2769,7 +2893,7 @@ You have been moved into a nearby region.
name="AvatarMovedLast"
type="alertmodal">
<tag>fail</tag>
-Your last location is not currently available.
+Your requested location is not currently available.
You have been moved into a nearby region.
</notification>
@@ -2804,12 +2928,11 @@ You can use [SECOND_LIFE] normally and other people will see you correctly.
[APP_NAME] installation is complete.
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?
<tag>confirm</tag>
<usetemplate
name="okcancelbuttons"
notext="Continue"
- yestext="New Account..."/>
+ yestext="Create Account..."/>
</notification>
<notification
@@ -4089,9 +4212,7 @@ Are you sure you want to change the Estate Covenant?
name="RegionEntryAccessBlocked"
type="alertmodal">
<tag>fail</tag>
-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.
+ The region you're trying to visit contains content exceeding your current preferences. You can change your preferences using Me &gt; Preferences &gt; General.
<usetemplate
name="okbutton"
yestext="OK"/>
@@ -4099,13 +4220,11 @@ Please verify you have the latest Viewer installed, and go to the Knowledge Base
<notification
icon="alertmodal.tga"
- name="RegionEntryAccessBlocked_KB"
+ name="RegionEntryAccessBlocked_AdultsOnlyContent"
type="alertmodal">
<tag>fail</tag>
<tag>confirm</tag>
-You are not allowed in that region due to your maturity Rating.
-
-Go to the Knowledge Base for more information about maturity Ratings?
+ The region you're trying to visit contains [REGIONMATURITY] content, which is accessible to adults only.
<url option="0" name="url">
http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview
</url>
@@ -4113,7 +4232,7 @@ Go to the Knowledge Base for more information about maturity Ratings?
name="okcancelignore"
yestext="Go to Knowledge Base"
notext="Close"
- ignoretext="I can&apos;t enter this Region, due to restrictions of the maturity Rating"/>
+ ignoretext="Region crossing: The region you&apos;re trying to visit contains content which is accessible to adults only."/>
</notification>
<notification
@@ -4121,47 +4240,156 @@ Go to the Knowledge Base for more information about maturity Ratings?
name="RegionEntryAccessBlocked_Notify"
type="notifytip">
<tag>fail</tag>
-You are not allowed in that region due to your maturity Rating.
+The region you're trying to visit contains [REGIONMATURITY] content, but your current preferences are set to exclude [REGIONMATURITY] content.
+ </notification>
+
+ <notification
+ icon="notifytip.tga"
+ name="RegionEntryAccessBlocked_NotifyAdultsOnly"
+ type="notifytip">
+ <tag>fail</tag>
+ The region you're trying to visit contains [REGIONMATURITY] content, which is accessible to adults only.
</notification>
<notification
icon="alertmodal.tga"
name="RegionEntryAccessBlocked_Change"
type="alertmodal">
- <tag>fail</tag>
+ <tag>fail</tag>
<tag>confirm</tag>
-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">
+The region you're trying to visit contains [REGIONMATURITY] content, but your current preferences are set to exclude [REGIONMATURITY] content. We can change your preferences, or you can cancel. After your preferences are changed, you may attempt to enter the region again.
+ <form name="form">
<button
index="0"
name="OK"
- text="Change Preference"/>
- <button
+ text="Change preferences"/>
+ <button
default="true"
index="1"
name="Cancel"
- text="Close"/>
- <ignore name="ignore" text="My chosen Rating preference prevents me from entering a Region"/>
+ text="Cancel"/>
+ <ignore name="ignore" text="Region crossing: The region you&apos;re trying to visit contains content excluded by your preferences."/>
</form>
</notification>
<notification
+ icon="alertmodal.tga"
+ name="RegionEntryAccessBlocked_PreferencesOutOfSync"
+ type="alertmodal">
+ <tag>fail</tag>
+ We are having technical difficulties with your teleport because your preferences are out of sync with the server.
+ <usetemplate
+ name="okbutton"
+ yestext="OK"/>
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="TeleportEntryAccessBlocked"
+ type="alertmodal">
+ <tag>fail</tag>
+ The region you're trying to visit contains content exceeding your current preferences. You can change your preferences using Me &gt; Preferences &gt; General.
+ <usetemplate
+ name="okbutton"
+ yestext="OK"/>
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="TeleportEntryAccessBlocked_AdultsOnlyContent"
+ type="alertmodal">
+ <unique>
+ <context>REGIONMATURITY</context>
+ </unique>
+ <tag>fail</tag>
+ <tag>confirm</tag>
+ The region you're trying to visit contains [REGIONMATURITY] content, which is accessible to adults only.
+ <url option="0" name="url">
+ http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview
+ </url>
+ <usetemplate
+ name="okcancelignore"
+ yestext="Go to Knowledge Base"
+ notext="Close"
+ ignoretext="Teleport: The region you&apos;re trying to visit contains content which is accessible to adults only."/>
+ </notification>
+
+ <notification
icon="notifytip.tga"
- name="PreferredMaturityChanged"
+ name="TeleportEntryAccessBlocked_Notify"
type="notifytip">
-Your maturity Rating preference is now [RATING].
+ <unique>
+ <context>REGIONMATURITY</context>
+ </unique>
+ <tag>fail</tag>
+ The region you're trying to visit contains [REGIONMATURITY] content, but your current preferences are set to exclude [REGIONMATURITY] content.
+ </notification>
+
+ <notification
+ icon="notifytip.tga"
+ name="TeleportEntryAccessBlocked_NotifyAdultsOnly"
+ type="notifytip">
+ <unique>
+ <context>REGIONMATURITY</context>
+ </unique>
+ <tag>fail</tag>
+ The region you're trying to visit contains [REGIONMATURITY] content, which is accessible to adults only.
</notification>
<notification
icon="alertmodal.tga"
- name="LandClaimAccessBlocked"
+ name="TeleportEntryAccessBlocked_ChangeAndReTeleport"
type="alertmodal">
-You cannot claim this land due to your maturity Rating. This may be a result of a lack of information validating your age.
+ <unique>
+ <context>REGIONMATURITY</context>
+ </unique>
+ <tag>fail</tag>
+ <tag>confirm</tag>
+ The region you're trying to visit contains [REGIONMATURITY] content, but your current preferences are set to exclude [REGIONMATURITY] content. We can change your preferences and continue with the teleport, or you can cancel this teleport.
+ <form name="form">
+ <button
+ index="0"
+ name="OK"
+ text="Change and continue"/>
+ <button
+ default="true"
+ index="1"
+ name="Cancel"
+ text="Cancel"/>
+ <ignore name="ignore" text="Teleport (restartable): The region you&apos;re trying to visit contains content excluded by your preferences."/>
+ </form>
+ </notification>
-Please verify you have the latest Viewer installed, and go to the Knowledge Base for details on accessing areas with this maturity rating.
- <tag>fail</tag>
+ <notification
+ icon="alertmodal.tga"
+ name="TeleportEntryAccessBlocked_Change"
+ type="alertmodal">
+ <unique>
+ <context>REGIONMATURITY</context>
+ </unique>
+ <tag>fail</tag>
+ <tag>confirm</tag>
+ The region you're trying to visit contains [REGIONMATURITY] content, but your current preferences are set to exclude [REGIONMATURITY] content. We can change your preferences, or you can cancel the teleport. After your preferences are changed, you will need to attempt the teleport again.
+ <form name="form">
+ <button
+ index="0"
+ name="OK"
+ text="Change preferences"/>
+ <button
+ default="true"
+ index="1"
+ name="Cancel"
+ text="Cancel"/>
+ <ignore name="ignore" text="Teleport (non-restartable): The region you&apos;re trying to visit contains content excluded by your preferences."/>
+ </form>
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="TeleportEntryAccessBlocked_PreferencesOutOfSync"
+ type="alertmodal">
+ <tag>fail</tag>
+ We are having technical difficulties with your teleport because your preferences are out of sync with the server.
<usetemplate
name="okbutton"
yestext="OK"/>
@@ -4169,12 +4397,43 @@ Please verify you have the latest Viewer installed, and go to the Knowledge Base
<notification
icon="alertmodal.tga"
- name="LandClaimAccessBlocked_KB"
+ name="PreferredMaturityChanged"
type="alertmodal">
-You cannot claim this land due to your maturity Rating.
+You won't receive any more notifications that you're about to visit a region with [RATING] content. You may change your content preferences in the future by using Me &gt; Preferences &gt; General from the menu bar.
+ <tag>confirm</tag>
+ <usetemplate
+ name="okbutton"
+ yestext="OK"/>
+ </notification>
-Go to the Knowledge Base for more information about maturity Ratings?
- <tag>fail</tag>
+ <notification
+ icon="alertmodal.tga"
+ name="MaturityChangeError"
+ type="alertmodal">
+ We were unable to change your preferences to view [PREFERRED_MATURITY] content at this time. Your preferences have been reset to view [ACTUAL_MATURITY] content. You may attempt to change your preferences again by using Me &gt; Preferences &gt; General from the menu bar.
+ <tag>confirm</tag>
+ <usetemplate
+ name="okbutton"
+ yestext="OK"/>
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="LandClaimAccessBlocked"
+ type="alertmodal">
+ The land you're trying to claim has a maturity rating exceeding your current preferences. You can change your preferences using Me &gt; Preferences &gt; General.
+ <tag>fail</tag>
+ <usetemplate
+ name="okbutton"
+ yestext="OK"/>
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="LandClaimAccessBlocked_AdultsOnlyContent"
+ type="alertmodal">
+ Only adults can claim this land.
+ <tag>fail</tag>
<tag>confirm</tag>
<url option="0" name="url">
http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview
@@ -4183,41 +4442,52 @@ Go to the Knowledge Base for more information about maturity Ratings?
name="okcancelignore"
yestext="Go to Knowledge Base"
notext="Close"
- ignoretext="I can&apos;t claim this Land, due to restrictions of the maturity Rating"/>
+ ignoretext="Only adults can claim this land."/>
</notification>
<notification
icon="notifytip.tga"
name="LandClaimAccessBlocked_Notify"
type="notifytip">
-You cannot claim this land due to your maturity Rating.
- <tag>fail</tag>
+ The land you're trying to claim contains [REGIONMATURITY] content, but your current preferences are set to exclude [REGIONMATURITY] content.
+ <tag>fail</tag>
+ </notification>
+
+ <notification
+ icon="notifytip.tga"
+ name="LandClaimAccessBlocked_NotifyAdultsOnly"
+ type="notifytip">
+ <tag>fail</tag>
+ The land you're trying to claim contains [REGIONMATURITY] content, which is accessible to adults only.
</notification>
<notification
icon="alertmodal.tga"
name="LandClaimAccessBlocked_Change"
type="alertmodal">
-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.
+ The land you're trying to claim contains [REGIONMATURITY] content, but your current preferences are set to exclude [REGIONMATURITY] content. We can change your preferences, then you can try claiming the land again.
<tag>fail</tag>
<tag>confirm</tag>
- <usetemplate
- name="okcancelignore"
- yestext="Change Preference"
- notext="Close"
- ignoretext="My chosen Rating preference prevents me from claiming Land"/>
+ <form name="form">
+ <button
+ index="0"
+ name="OK"
+ text="Change preferences"/>
+ <button
+ default="true"
+ index="1"
+ name="Cancel"
+ text="Cancel"/>
+ <ignore name="ignore" text="The land you&apos;re trying to claim contains content excluded by your preferences."/>
+ </form>
</notification>
<notification
icon="alertmodal.tga"
name="LandBuyAccessBlocked"
type="alertmodal">
-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.
- <tag>fail</tag>
+ The land you're trying to buy has a maturity rating exceeding your current preferences. You can change your preferences using Me &gt; Preferences &gt; General.
+ <tag>fail</tag>
<usetemplate
name="okbutton"
yestext="OK"/>
@@ -4225,11 +4495,9 @@ Please verify you have the latest Viewer installed, and go to the Knowledge Base
<notification
icon="alertmodal.tga"
- name="LandBuyAccessBlocked_KB"
+ name="LandBuyAccessBlocked_AdultsOnlyContent"
type="alertmodal">
-You cannot buy this land due to your maturity Rating.
-
-Go to the Knowledge Base for more information about maturity Ratings?
+ Only adults can buy this land.
<tag>confirm</tag>
<tag>fail</tag>
<url option="0" name="url">
@@ -4239,31 +4507,44 @@ Go to the Knowledge Base for more information about maturity Ratings?
name="okcancelignore"
yestext="Go to Knowledge Base"
notext="Close"
- ignoretext="I can&apos;t buy this Land, due to restrictions of the maturity Rating"/>
+ ignoretext="Only adults can buy this land."/>
</notification>
<notification
icon="notifytip.tga"
name="LandBuyAccessBlocked_Notify"
type="notifytip">
-You cannot buy this land due to your maturity Rating.
- <tag>fail</tag>
+ The land you're trying to buy contains [REGIONMATURITY] content, but your current preferences are set to exclude [REGIONMATURITY] content.
+ <tag>fail</tag>
+ </notification>
+
+ <notification
+ icon="notifytip.tga"
+ name="LandBuyAccessBlocked_NotifyAdultsOnly"
+ type="notifytip">
+ <tag>fail</tag>
+ The land you're trying to buy contains [REGIONMATURITY] content, which is accessible to adults only.
</notification>
<notification
icon="alertmodal.tga"
name="LandBuyAccessBlocked_Change"
type="alertmodal">
-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.
+ The land you're trying to buy contains [REGIONMATURITY] content, but your current preferences are set to exclude [REGIONMATURITY] content. We can change your preferences, then you can try buying the land again.
<tag>confirm</tag>
<tag>fail</tag>
- <usetemplate
- name="okcancelignore"
- yestext="Change Preference"
- notext="Close"
- ignoretext="My chosen Rating preference prevents me from buying Land"/>
+ <form name="form">
+ <button
+ index="0"
+ name="OK"
+ text="Change preferences"/>
+ <button
+ default="true"
+ index="1"
+ name="Cancel"
+ text="Cancel"/>
+ <ignore name="ignore" text="The land you&apos;re trying to buy contains content excluded by your preferences."/>
+ </form>
</notification>
<notification
@@ -4418,10 +4699,11 @@ Type a short announcement which will be sent to everyone in this region.
label="Changed Region Maturity"
name="RegionMaturityChange"
type="alertmodal">
-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.
+The maturity rating for this region has been changed.
+It may take some time for this change to be reflected on the map.
+ <usetemplate
+ name="okbutton"
+ yestext="OK"/>
</notification>
<notification
@@ -5127,20 +5409,20 @@ Would you like to automatically wear the clothing you are about to create?
icon="alertmodal.tga"
name="NotAgeVerified"
type="alertmodal">
- <tag>fail</tag>
-To access adult content and areas in Second Life you must be at least 18 years old. Please visit our age verification page to confirm you are over 18.
-Note this will launch your web browser.
-
-[_URL]
- <tag>confirm</tag>
- <url option="0" name="url">
- https://secondlife.com/my/account/verification.php
- </url>
+ The location you're trying to visit is restricted to residents age 18 and over.
+ <tag>fail</tag>
<usetemplate
- ignoretext="I have not verified my age"
- name="okcancelignore"
- notext="Cancel"
- yestext="Go to Age Verification"/>
+ ignoretext="I am not old enough to visit age restricted areas."
+ name="okignore"
+ yestext="OK"/>
+ </notification>
+
+ <notification
+ icon="notifytip.tga"
+ name="NotAgeVerified_Notify"
+ type="notifytip">
+ Location restricted to age 18 and over.
+ <tag>fail</tag>
</notification>
<notification
@@ -5287,7 +5569,7 @@ Terrain.raw downloaded
icon="notifytip.tga"
name="GestureMissing"
type="notifytip">
-Hmm. Gesture [NAME] is missing from the database.
+Gesture [NAME] is missing from the database.
<tag>fail</tag>
</notification>
@@ -5775,6 +6057,56 @@ This area has building disabled. You can&apos;t build or rez objects here.
</notification>
<notification
+ icon="notify.tga"
+ name="PathfindingDirty"
+ persist="true"
+ type="notify">
+ <unique/>
+ The region has pending pathfinding changes. If you have build rights, you may rebake the region by clicking on the “Rebake region†button.
+ </notification>
+
+ <notification
+ icon="notify.tga"
+ name="DynamicPathfindingDisabled"
+ persist="true"
+ type="notify">
+ <unique/>
+ Dynamic pathfinding is not enabled on this region. Scripted objects using pathfinding LSL calls may not operate as expected on this region.
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="PathfindingRebakeNavmesh"
+ type="alertmodal">
+ <unique/>
+ Changing certain objects in this region could cause other moving objects to behave incorrectly. To make moving objects behave correctly, click the “Rebake region†button. Choose “Help†for more information.
+ <url
+ option="1"
+ name="url"
+ target = "_external">
+ http://wiki.secondlife.com/wiki/Pathfinding_Tools_in_the_Second_Life_Viewer
+ </url>
+ <usetemplate
+ name="okhelpignore"
+ ignoretext="Changing certain objects in this region could cause other moving objects to behave incorrectly."
+ yestext="OK"
+ helptext="Help"
+ />
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="PathfindingCannotRebakeNavmesh"
+ type="alertmodal">
+ <unique/>
+ An error occurred. There may be a network or server problem, or you may not have build rights. Sometimes logging out and back in will solve this problem.
+ <usetemplate
+ name="okbutton"
+ yestext="OK"
+ />
+ </notification>
+
+ <notification
icon="notify.tga"
name="SeeAvatars"
persist="true"
@@ -5825,9 +6157,7 @@ You can only claim public land in the Region you&apos;re in.
persist="true"
type="notify">
<tag>fail</tag>
-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.
+ The region you're trying to visit contains content exceeding your current preferences. You can change your preferences using Me &gt; Preferences &gt; General.
</notification>
<notification
@@ -5859,11 +6189,11 @@ You do not have proper payment status to enter this region.
<notification
icon="notify.tga"
- name="MustGetAgeRgion"
+ name="MustGetAgeRegion"
persist="true"
type="notify">
<tag>fail</tag>
-You must be age-verified to enter this region.
+You must be age 18 or over to enter this region.
</notification>
<notification
@@ -5872,7 +6202,7 @@ You must be age-verified to enter this region.
persist="true"
type="notify">
<tag>fail</tag>
-You must be age-verified to enter this parcel.
+ You must be age 18 or over to enter this parcel.
</notification>
<notification
@@ -6147,7 +6477,8 @@ Your object named &lt;nolink&gt;[OBJECTFROMNAME]&lt;/nolink&gt; has given you th
type="offer">
[NAME_SLURL] has offered to teleport you to their location:
-[MESSAGE] - [MATURITY_STR] &lt;icon&gt;[MATURITY_ICON]&lt;/icon&gt;
+“[MESSAGE]â€
+&lt;icon&gt;[MATURITY_ICON]&lt;/icon&gt; - [MATURITY_STR]
<tag>confirm</tag>
<form name="form">
<button
@@ -6163,6 +6494,42 @@ Your object named &lt;nolink&gt;[OBJECTFROMNAME]&lt;/nolink&gt; has given you th
<notification
icon="notify.tga"
+ name="TeleportOffered_MaturityExceeded"
+ type="offer">
+[NAME_SLURL] has offered to teleport you to their location:
+
+“[MESSAGE]â€
+&lt;icon&gt;[MATURITY_ICON]&lt;/icon&gt; - [MATURITY_STR]
+
+This region contains [REGION_CONTENT_MATURITY] content, but your current preferences are set to exclude [REGION_CONTENT_MATURITY] content. We can change your preferences and continue with the teleport, or you can cancel this teleport.
+ <tag>confirm</tag>
+ <form name="form">
+ <button
+ index="0"
+ name="Teleport"
+ text="Change and Continue"/>
+ <button
+ index="1"
+ name="Cancel"
+ text="Cancel"/>
+ </form>
+ </notification>
+
+ <notification
+ icon="notify.tga"
+ name="TeleportOffered_MaturityBlocked"
+ type="notifytip">
+[NAME_SLURL] has offered to teleport you to their location:
+
+“[MESSAGE]â€
+&lt;icon&gt;[MATURITY_ICON]&lt;/icon&gt; - [MATURITY_STR]
+
+However, this region contains content accessible to adults only.
+ <tag>fail</tag>
+ </notification>
+
+ <notification
+ icon="notify.tga"
name="TeleportOfferSent"
type="offer">
Teleport offer sent to [TO_NAME]
@@ -7197,6 +7564,30 @@ You locally updated a [RESOLUTION] baked texture for '[BODYREGION]' after [TIME]
<notification
icon="alertmodal.tga"
+ name="LivePreviewUnavailable"
+ type="alert">
+
+We cannot display a preview of this texture because it is no-copy and/or no-transfer.
+ <usetemplate
+ ignoretext="Warn me that Live Preview mode is not available for no-copy and/or no-transfer textures"
+ name="okignore"
+ yestext="OK"/>
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="LivePreviewUnavailable"
+ type="alert">
+
+We cannot display a preview of this texture because it is no-copy and/or no-transfer.
+ <usetemplate
+ ignoretext="Warn me that Live Preview mode is not available for no-copy and/or no-transfer textures"
+ name="okignore"
+ yestext="OK"/>
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
name="ConfirmLeaveCall"
type="alert">
Are you sure you want to leave this call?
@@ -7679,7 +8070,60 @@ The site at &apos;&lt;nolink&gt;[HOST_NAME]&lt;/nolink&gt;&apos; in realm &apos;
notext="Cancel"
ignoretext="Confirm before hiding UI"/>
</notification>
-
+
+ <notification
+ icon="alertmodal.tga"
+ name="PathfindingLinksets_SetLinksetUseMismatchOnRestricted"
+ type="alertmodal">
+ Some selected linksets cannot be set to be '[REQUESTED_TYPE]' because of permission restrictions on the linkset. These linksets will be set to be '[RESTRICTED_TYPE]' instead.
+ <tag>confirm</tag>
+ <usetemplate
+ ignoretext="Some selected linksets cannot be set because of permission restrictions on the linkset."
+ name="okcancelignore"
+ notext="Cancel"
+ yestext="OK"/>
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="PathfindingLinksets_SetLinksetUseMismatchOnVolume"
+ type="alertmodal">
+ Some selected linksets cannot be set to be '[REQUESTED_TYPE]' because the shape is non-convex.
+ <tag>confirm</tag>
+ <usetemplate
+ ignoretext="Some selected linksets cannot be set because the shape is non-convex"
+ name="okcancelignore"
+ notext="Cancel"
+ yestext="OK"/>
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="PathfindingLinksets_SetLinksetUseMismatchOnRestrictedAndVolume"
+ type="alertmodal">
+ Some selected linksets cannot be set to be '[REQUESTED_TYPE]' because of permission restrictions on the linkset. These linksets will be set to be '[RESTRICTED_TYPE]' instead.
+ Some selected linksets cannot be set to be '[REQUESTED_TYPE]' because the shape is non-convex. These linksets&apos; use types will not change.
+ <tag>confirm</tag>
+ <usetemplate
+ ignoretext="Some selected linksets cannot be set because of permission restrictions on the linkset and because the shape is non-convex."
+ name="okcancelignore"
+ notext="Cancel"
+ yestext="OK"/>
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="PathfindingLinksets_ChangeToFlexiblePath"
+ type="alertmodal">
+ The selected object affects the navmesh. Changing it to a Flexible Path will remove it from the navmesh.
+ <tag>confirm</tag>
+ <usetemplate
+ ignoretext="The selected object affects the navmesh. Changing it to a Flexible Path will remove it from the navmesh."
+ name="okcancelignore"
+ notext="Cancel"
+ yestext="OK"/>
+ </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.
@@ -7738,5 +8182,31 @@ Disabling future updates for this file.
Attempted to add an invalid or unreadable image file [FNAME] which could not be opened or decoded.
Attempt cancelled.
</notification>
-
+
+ <notification
+ icon="alertmodal.tga"
+ name="PathfindingReturnMultipleItems"
+ type="alertmodal">
+ You are returning [NUM_ITEMS] items. Are you sure you want to continue?
+ <tag>confirm</tag>
+ <usetemplate
+ ignoretext="Are you sure you want to return multiple items?"
+ name="okcancelignore"
+ notext="No"
+ yestext="Yes"/>
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="PathfindingDeleteMultipleItems"
+ type="alertmodal">
+ You are deleting [NUM_ITEMS] items. Are you sure you want to continue?
+ <tag>confirm</tag>
+ <usetemplate
+ ignoretext="Are you sure you want to delete multiple items?"
+ name="okcancelignore"
+ notext="No"
+ yestext="Yes"/>
+ </notification>
+
</notifications>
diff --git a/indra/newview/skins/default/xui/en/panel_edit_pick.xml b/indra/newview/skins/default/xui/en/panel_edit_pick.xml
index 0faa1598b1..553c112e6f 100644
--- a/indra/newview/skins/default/xui/en/panel_edit_pick.xml
+++ b/indra/newview/skins/default/xui/en/panel_edit_pick.xml
@@ -134,6 +134,7 @@
top_pad="2"
max_length="1023"
name="pick_desc"
+ spellcheck="true"
text_color="black"
word_wrap="true" />
<text
diff --git a/indra/newview/skins/default/xui/en/panel_group_invite.xml b/indra/newview/skins/default/xui/en/panel_group_invite.xml
index cd834b61ce..124c0596c3 100644
--- a/indra/newview/skins/default/xui/en/panel_group_invite.xml
+++ b/indra/newview/skins/default/xui/en/panel_group_invite.xml
@@ -19,6 +19,10 @@
name="already_in_group">
Some Residents you chose are already in the group, and so were not sent an invitation.
</panel.string>
+ <panel.string
+ name="invite_selection_too_large">
+ Group Invitations not sent: too many Residents selected. Group Invitations are limited to 100 per request.
+ </panel.string>
<text
type="string"
length="1"
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 607e1bb213..6d5fb51e85 100644
--- a/indra/newview/skins/default/xui/en/panel_group_notices.xml
+++ b/indra/newview/skins/default/xui/en/panel_group_notices.xml
@@ -141,6 +141,7 @@ Maximum 200 per group daily
max_length_bytes="63"
name="create_subject"
prevalidate_callback="ascii"
+ spellcheck="true"
width="218" />
<text
follows="left|top"
@@ -161,6 +162,7 @@ Maximum 200 per group daily
left_pad="3"
max_length="511"
name="create_message"
+ spellcheck="true"
top_delta="0"
width="218"
word_wrap="true" />
@@ -309,6 +311,7 @@ Maximum 200 per group daily
left_pad="3"
max_length_bytes="63"
name="view_subject"
+ spellcheck="true"
top_delta="-1"
visible="false"
width="200" />
@@ -333,6 +336,7 @@ Maximum 200 per group daily
right="-1"
max_length="511"
name="view_message"
+ spellcheck="true"
top_delta="-40"
width="313"
word_wrap="true" />
diff --git a/indra/newview/skins/default/xui/en/panel_login.xml b/indra/newview/skins/default/xui/en/panel_login.xml
index 223326dd06..9c96143aa3 100644
--- a/indra/newview/skins/default/xui/en/panel_login.xml
+++ b/indra/newview/skins/default/xui/en/panel_login.xml
@@ -1,216 +1,256 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<panel
-follows="all"
-height="600"
-layout="topleft"
-left="0"
-name="panel_login"
-focus_root="true"
-top="600"
- width="996">
-<panel.string
- name="create_account_url">
- http://join.secondlife.com/
-</panel.string>
-<string name="reg_in_client_url" translate="false">
- http://secondlife.eniac15.lindenlab.com/reg-in-client/
-</string>
-<panel.string
- name="forgot_password_url">
- http://secondlife.com/account/request.php
-</panel.string>
-<!-- *NOTE: Custom resize logic for login_html in llpanellogin.cpp -->
-<web_browser
- tab_stop="false"
- trusted_content="true"
- bg_opaque_color="Black"
- border_visible="false"
- bottom="600"
- follows="all"
- left="0"
- name="login_html"
- start_url=""
- top="0"
- height="600"
- width="980"/>
-<layout_stack
-follows="left|bottom|right"
-name="login_widgets"
-layout="topleft"
-orientation="horizontal"
-top="519"
-width="996"
-height="80">
-<layout_panel
-auto_resize="false"
-follows="left|bottom"
-name="login"
-layout="topleft"
-width="705"
-min_width="705"
-height="80">
-<text
-follows="left|bottom"
-font="SansSerifSmall"
-height="16"
-name="username_text"
-top="20"
-left="20"
-width="150">
-Username:
-</text>
-<combo_box
-allow_text_entry="true"
-follows="left|bottom"
-height="22"
-left_delta="0"
-max_chars="128"
-combo_editor.prevalidate_callback="ascii"
-tool_tip="The username you chose when you registered, like bobsmith12 or Steller Sunshine"
-top_pad="0"
-name="username_combo"
-width="178">
- <combo_box.combo_button
- visible ="false"/>
- <combo_box.drop_down_button
- visible ="false"/>
-</combo_box>
-<text
-follows="left|bottom"
-font="SansSerifSmall"
-height="15"
-left_pad="-19"
-name="password_text"
-top="20"
- width="150">
- Password:
-</text>
-<line_editor
-follows="left|bottom"
- height="22"
- max_length_bytes="16"
-name="password_edit"
-is_password="true"
-select_on_focus="true"
- top_pad="0"
- width="135" />
- <check_box
-control_name="RememberPassword"
-follows="left|bottom"
-font="SansSerifSmall"
-height="16"
-label="Remember password"
- top_pad="3"
- name="remember_check"
- width="135" />
-<button
- follows="left|bottom"
- height="23"
- image_unselected="PushButton_On"
- image_selected="PushButton_On_Selected"
- label="Log In"
- label_color="White"
- layout="topleft"
- left_pad="10"
- name="connect_btn"
- top="35"
- width="90" />
- <text
- follows="left|bottom"
- font="SansSerifSmall"
- height="15"
- left_pad="8"
- name="start_location_text"
- top="20"
- width="130">
- Start at:
- </text>
-<combo_box
-allow_text_entry="true"
-control_name="NextLoginLocation"
- follows="left|bottom"
- height="23"
-max_chars="128"
-top_pad="0"
-name="start_location_combo"
- width="165">
-<combo_box.item
-label="My last location"
-name="MyLastLocation"
- value="last" />
-<combo_box.item
-label="My home"
-name="MyHome"
- value="home" />
-<combo_box.item
-label="&lt;Type region name&gt;"
-name="Typeregionname" value="" />
-</combo_box>
-<combo_box
-allow_text_entry="true"
-font="SansSerifSmall"
- follows="left|right|bottom"
- height="23"
- max_chars="256"
-layout="topleft"
-top_pad="2"
-name="server_combo"
-width="135"
- visible="false" />
-</layout_panel>
-<layout_panel
-tab_stop="false"
-follows="right|bottom"
-name="links"
-width="205"
-min_width="205"
-height="80">
- <text
-follows="right|bottom"
-font="SansSerifSmall"
-text_color="EmphasisColor"
-halign="right"
-height="16"
-top="12"
-right="-10"
-name="create_new_account_text"
- width="200">
- Sign up
- </text>
-<text
-follows="right|bottom"
-font="SansSerifSmall"
-text_color="EmphasisColor"
-halign="right"
-height="16"
-name="forgot_password_text"
-top_pad="12"
-right="-10"
- width="200">
- Forgot your username or password?
-</text>
-<text
-follows="right|bottom"
-font="SansSerifSmall"
-text_color="EmphasisColor"
-halign="right"
-height="16"
-name="login_help"
-top_pad="2"
-right="-10"
- width="200">
- Need help logging in? </text>
-<!-- <text
- follows="right|bottom"
- font="SansSerifSmall"
- halign="right"
- height="28"
- top_pad="2"
- name="channel_text"
- width="180"
- word_wrap="true">
- [VERSION]
- </text>-->
- </layout_panel>
-</layout_stack>
+ follows="all"
+ height="600"
+ layout="topleft"
+ left="0"
+ name="panel_login"
+ focus_root="true"
+ top="600"
+ width="1130">
+ <string name="reg_in_client_url" translate="false">
+ http://secondlife.eniac15.lindenlab.com/reg-in-client/
+ </string>
+ <panel.string
+ name="forgot_password_url">
+ http://secondlife.com/account/request.php
+ </panel.string>
+ <!-- *NOTE: Custom resize logic for login_html in llpanellogin.cpp -->
+ <web_browser
+ tab_stop="false"
+ trusted_content="true"
+ bg_opaque_color="Black"
+ border_visible="false"
+ bottom="600"
+ follows="all"
+ left="0"
+ name="login_html"
+ start_url=""
+ top="0"
+ height="600"
+ width="996"/>
+ <layout_stack
+ animate="false"
+ follows="left|bottom|right"
+ name="login_widgets"
+ layout="topleft"
+ orientation="horizontal"
+ top="519"
+ width="1130"
+ height="80">
+ <layout_panel
+ auto_resize="false"
+ follows="left|bottom"
+ name="login"
+ layout="topleft"
+ width="310"
+ min_width="310"
+ height="80">
+ <text
+ follows="left|bottom"
+ font="SansSerif"
+ font.style="BOLD"
+ font.size="Large"
+ height="16"
+ name="log_in_text"
+ top="8"
+ left="15"
+ width="150">
+ LOG IN
+ </text>
+ <text
+ follows="left|bottom"
+ font="SansSerifSmall"
+ height="16"
+ name="username_text"
+ top="35"
+ left="15"
+ width="150">
+ Username:
+ </text>
+ <combo_box
+ allow_text_entry="true"
+ follows="left|bottom"
+ height="22"
+ left_delta="0"
+ max_chars="128"
+ combo_editor.prevalidate_callback="ascii"
+ tool_tip="The username you chose when you registered, like bobsmith12 or Steller Sunshine"
+ top_pad="0"
+ name="username_combo"
+ width="178">
+<!-- empirically, displayed width is 150 anyway?!? -->
+ <combo_box.combo_button
+ visible ="false"/>
+ <combo_box.drop_down_button
+ visible ="false"/>
+ </combo_box>
+<!-- left="175" based on actual "username_combo" width of 150 vs. 178 -->
+ <text
+ follows="left|bottom"
+ font="SansSerifSmall"
+ height="16"
+ name="password_text"
+ top="35"
+ left="175"
+ width="150">
+ Password:
+ </text>
+ <line_editor
+ follows="left|bottom"
+ height="22"
+ max_length_bytes="16"
+ name="password_edit"
+ is_password="true"
+ select_on_focus="true"
+ top_pad="0"
+ width="135" />
+ </layout_panel>
+ <layout_panel
+ auto_resize="false"
+ follows="left|bottom"
+ name="start_location_panel"
+ layout="topleft"
+ width="175"
+ min_width="175"
+ height="80">
+ <text
+ follows="left|bottom"
+ font="SansSerifSmall"
+ height="16"
+ left="10"
+ name="start_location_text"
+ top="35"
+ width="130">
+ Start at:
+ </text>
+ <combo_box
+ allow_text_entry="true"
+ control_name="NextLoginLocation"
+ follows="left|bottom"
+ height="22"
+ max_chars="128"
+ top_pad="0"
+ name="start_location_combo"
+ width="165">
+ <combo_box.item
+ label="My last location"
+ name="MyLastLocation"
+ value="last" />
+ <combo_box.item
+ label="My home"
+ name="MyHome"
+ value="home" />
+ <combo_box.item
+ label="&lt;Type region name&gt;"
+ name="Typeregionname" value="" />
+ </combo_box>
+ </layout_panel>
+ <layout_panel
+ auto_resize="false"
+ follows="left|bottom"
+ name="grid_panel"
+ layout="topleft"
+ width="145"
+ height="80"
+ visible="false">
+ <combo_box
+ allow_text_entry="false"
+ font="SansSerifSmall"
+ follows="left|right|bottom"
+ height="23"
+ max_chars="256"
+ left="10"
+ top="51"
+ layout="topleft"
+ top_pad="2"
+ name="server_combo"
+ width="135" />
+ </layout_panel>
+ <layout_panel
+ auto_resize="false"
+ follows="left|bottom"
+ name="links_login_panel"
+ layout="topleft"
+ width="290"
+ height="80">
+ <text
+ follows="left|bottom"
+ font="SansSerifSmall"
+ text_color="EmphasisColor"
+ left="10"
+ height="16"
+ name="login_help"
+ top="19"
+ width="280">
+ Need help logging in?
+ </text>
+ <text
+ follows="left|bottom"
+ font="SansSerifSmall"
+ text_color="EmphasisColor"
+ height="16"
+ name="forgot_password_text"
+ top="35"
+ width="280">
+ Forgot your username or password?
+ </text>
+ <button
+ follows="left|bottom"
+ top_pad="0"
+ height="23"
+ image_unselected="PushButton_On"
+ image_selected="PushButton_On_Selected"
+ label="Log In"
+ label_color="White"
+ layout="topleft"
+ name="connect_btn"
+ width="90" />
+ <check_box
+ control_name="RememberPassword"
+ follows="left|bottom"
+ font="SansSerifSmall"
+ left="110"
+ top="56"
+ height="16"
+ label="Remember password"
+ top_pad="3"
+ name="remember_check"
+ width="145" />
+ </layout_panel>
+ <layout_panel
+ tab_stop="false"
+ follows="right|bottom"
+ name="links"
+ width="210"
+ min_width="210"
+ height="80">
+ <text
+ follows="right|bottom"
+ font="SansSerif"
+ font.style="BOLD"
+ font.size="Large"
+ halign="right"
+ height="16"
+ name="create_account_text"
+ top="8"
+ right="-15"
+ width="200">
+ CREATE YOUR ACCOUNT
+ </text>
+ <button
+ follows="right|bottom"
+ top="35"
+ right="-15"
+ height="23"
+ image_unselected="PushButton_On"
+ image_selected="PushButton_On_Selected"
+ label="Start now"
+ label_color="White"
+ layout="topleft"
+ left_pad="10"
+ name="create_new_account_btn"
+ width="90" />
+ </layout_panel>
+ </layout_stack>
</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_navmesh_rebake.xml b/indra/newview/skins/default/xui/en/panel_navmesh_rebake.xml
new file mode 100644
index 0000000000..90308a2ca9
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/panel_navmesh_rebake.xml
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<panel
+ height="25"
+ layout="topleft"
+ name="panel_navmesh_rebake"
+ mouse_opaque="false"
+ visible="true"
+ width="133">
+ <button
+ follows="left|bottom"
+ height="19"
+ label="Rebake region"
+ layout="topleft"
+ left="10"
+ name="navmesh_btn"
+ tool_tip="Click to rebake the region&apos;s navmesh."
+ top="2"
+ visible="false"
+ enabled="true"
+ width="120" />
+ <button
+ follows="left|bottom"
+ height="19"
+ label="Requesting rebake"
+ layout="topleft"
+ left="10"
+ name="navmesh_btn_sending"
+ tool_tip="Sending rebake request to the server."
+ top="2"
+ visible="false"
+ enabled="false"
+ width="120" />
+ <button
+ follows="left|bottom"
+ height="19"
+ label="Region is rebaking"
+ layout="topleft"
+ left="10"
+ name="navmesh_btn_baking"
+ tool_tip="Region is being rebaked. When completed, this button will disappear."
+ top="2"
+ visible="false"
+ enabled="false"
+ width="120" />
+</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_nearby_chat_bar.xml b/indra/newview/skins/default/xui/en/panel_nearby_chat_bar.xml
index 21c627cdfb..6bc9c48729 100644
--- a/indra/newview/skins/default/xui/en/panel_nearby_chat_bar.xml
+++ b/indra/newview/skins/default/xui/en/panel_nearby_chat_bar.xml
@@ -19,6 +19,7 @@
left="0"
max_length_bytes="1023"
name="chat_box"
+ spellcheck="true"
text_pad_left="5"
text_pad_right="25"
tool_tip="Press Enter to say, Ctrl+Enter to shout"
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 caf7fc85f5..27193a984f 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_chat.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_chat.xml
@@ -207,13 +207,36 @@
<button
follows="left|top"
height="23"
- label="Chat Translation Settings"
+ label="Translation..."
layout="topleft"
left="30"
name="ok_btn"
- top="-40"
+ top="-50"
width="170">
<button.commit_callback
function="Pref.TranslationSettings" />
</button>
-</panel> \ No newline at end of file
+ <button
+ follows="top|left"
+ height="23"
+ layout="topleft"
+ top_pad="-23"
+ left_pad="5"
+ name="autoreplace_showgui"
+ commit_callback.function="Pref.AutoReplace"
+ label="Auto-Replace..."
+ width="150">
+ </button>
+ <button
+ follows="top|left"
+ height="23"
+ layout="topleft"
+ top_pad="-23"
+ left_pad="5"
+ name="spellcheck_showgui"
+ commit_callback.function="Pref.SpellChecker"
+ label="Spell Checking..."
+ width="150">
+ </button>
+
+</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_region_estate.xml b/indra/newview/skins/default/xui/en/panel_region_estate.xml
index bfd796a62b..76a82212ae 100644
--- a/indra/newview/skins/default/xui/en/panel_region_estate.xml
+++ b/indra/newview/skins/default/xui/en/panel_region_estate.xml
@@ -149,11 +149,11 @@
<check_box
follows="top|left"
height="16"
- label="Have been age-verified"
+ label="Are age 18 or older"
layout="topleft"
left_delta="0"
name="limit_age_verified"
- tool_tip="Residents must be age verified to access this estate. See the [SUPPORT_SITE] for more information."
+ tool_tip="Residents must be age 18 or older to access this estate. See the [SUPPORT_SITE] for more information."
top_pad="2"
width="278" />
diff --git a/indra/newview/skins/default/xui/en/panel_status_bar.xml b/indra/newview/skins/default/xui/en/panel_status_bar.xml
index 3aa34439f1..dd2a0c6627 100644
--- a/indra/newview/skins/default/xui/en/panel_status_bar.xml
+++ b/indra/newview/skins/default/xui/en/panel_status_bar.xml
@@ -129,6 +129,5 @@
left_pad="5"
top="2"
name="volume_btn"
- tool_tip="Global Volume Control"
width="16" />
</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_toolbar_view.xml b/indra/newview/skins/default/xui/en/panel_toolbar_view.xml
index 58911bed56..f5c559fe1d 100644
--- a/indra/newview/skins/default/xui/en/panel_toolbar_view.xml
+++ b/indra/newview/skins/default/xui/en/panel_toolbar_view.xml
@@ -93,11 +93,11 @@
left="0"
mouse_opaque="false"
tab_stop="false"
- name="stand_stop_flying_container"
+ name="state_management_buttons_container"
visible="false"
width="200"/>
</layout_panel>
- <layout_panel name="right_toolbar_panel"
+ <layout_panel name="right_toolbar_panel"
auto_resize="false"
height="500"
width="30"
diff --git a/indra/newview/skins/default/xui/en/panel_volume_pulldown.xml b/indra/newview/skins/default/xui/en/panel_volume_pulldown.xml
index 7b22b2cce1..6adede0362 100644
--- a/indra/newview/skins/default/xui/en/panel_volume_pulldown.xml
+++ b/indra/newview/skins/default/xui/en/panel_volume_pulldown.xml
@@ -8,41 +8,289 @@
border="false"
chrome="true"
follows="bottom"
- height="150"
+ height="155"
layout="topleft"
name="volumepulldown_floater"
- width="32">
- <slider
- control_name="AudioLevelMaster"
- follows="left|top"
- left="0"
- top="1"
- orientation="vertical"
- height="120"
- increment="0.05"
- initial_value="0.5"
- layout="topleft"
- name="mastervolume"
- show_text="false"
- slider_label.halign="right"
- top_pad="2"
- volume="true">
- <slider.commit_callback
- function="Vol.setControlFalse"
- parameter="MuteAudio" />
- </slider>
- <button
- left="10"
- top_pad="9"
- width="12"
- height="12"
- follows="top|left"
- name="prefs_btn"
- image_unselected="Icon_Gear_Foreground"
- image_disabled="Icon_Gear_Background"
- image_pressed="Icon_Gear_Press"
- scale_image="false">
- <button.commit_callback
- function="Vol.GoAudioPrefs" />
- </button>
+ width="225">
+ <slider
+ control_name="AudioLevelMaster"
+ follows="top|left"
+ font.style="BOLD"
+ height="15"
+ increment="0.025"
+ initial_value="0.5"
+ label="Master"
+ label_width="60"
+ left="10"
+ width="160"
+ layout="topleft"
+ name="System Volume"
+ show_text="false"
+ top="10"
+ volume="true">
+ <slider.commit_callback
+ function="Pref.setControlFalse"
+ parameter="MuteAudio" />
+ </slider>
+ <button
+ control_name="MuteAudio"
+ follows="top|left"
+ height="16"
+ image_selected="AudioMute_Off"
+ image_unselected="Audio_Off"
+ is_toggle="true"
+ layout="topleft"
+ left_pad="5"
+ name="mute_audio"
+ tab_stop="false"
+ width="16" />
+ <slider
+ control_name="AudioLevelUI"
+ disabled_control="MuteAudio"
+ follows="left|top"
+ height="15"
+ increment="0.025"
+ initial_value="0.5"
+ label="Buttons"
+ label_width="60"
+ left="10"
+ width="160"
+ layout="topleft"
+ name="UI Volume"
+ show_text="false"
+ top_pad="4"
+ volume="true">
+ <slider.commit_callback
+ function="Pref.setControlFalse"
+ parameter="MuteUI" />
+ </slider>
+ <button
+ control_name="MuteUI"
+ disabled_control="MuteAudio"
+ follows="top|left"
+ height="16"
+ image_selected="AudioMute_Off"
+ image_unselected="Audio_Off"
+ is_toggle="true"
+ layout="topleft"
+ left_pad="5"
+ name="mute_audio"
+ tab_stop="false"
+ width="16" />
+ <slider
+ control_name="AudioLevelAmbient"
+ disabled_control="MuteAudio"
+ follows="left|top"
+ height="15"
+ increment="0.025"
+ initial_value="0.5"
+ label="Ambient"
+ label_width="60"
+ left="10"
+ width="160"
+ layout="topleft"
+ name="Wind Volume"
+ show_text="false"
+ top_pad="4"
+ volume="true">
+ <slider.commit_callback
+ function="Pref.setControlFalse"
+ parameter="MuteAmbient" />
+ </slider>
+ <button
+ control_name="MuteAmbient"
+ disabled_control="MuteAudio"
+ follows="top|left"
+ height="16"
+ image_selected="AudioMute_Off"
+ image_unselected="Audio_Off"
+ is_toggle="true"
+ layout="topleft"
+ left_pad="5"
+ name="mute_audio"
+ tab_stop="false"
+ width="16" />
+ <slider
+ control_name="AudioLevelSFX"
+ disabled_control="MuteAudio"
+ follows="left|top"
+ height="15"
+ increment="0.025"
+ initial_value="0.5"
+ label="Sounds"
+ label_width="60"
+ left="10"
+ width="160"
+ layout="topleft"
+ name="SFX Volume"
+ show_text="false"
+ top_pad="4"
+ volume="true">
+ <slider.commit_callback
+ function="Pref.setControlFalse"
+ parameter="MuteSounds" />
+ </slider>
+ <button
+ control_name="MuteSounds"
+ disabled_control="MuteAudio"
+ follows="top|left"
+ height="16"
+ image_selected="AudioMute_Off"
+ image_unselected="Audio_Off"
+ is_toggle="true"
+ layout="topleft"
+ left_pad="5"
+ name="mute_audio"
+ tab_stop="false"
+ width="16">
+ <button.commit_callback
+ function="Pref.SetSounds"/>
+ </button>
+ <check_box
+ name="gesture_audio_play_btn"
+ control_name="EnableGestureSounds"
+ disabled_control="MuteAudio"
+ height="16"
+ layout="topleft"
+ left_pad="5"
+ tool_tip="Enable sounds from gestures"
+ top_delta="2"
+ width="350"/>
+ <slider
+ control_name="AudioLevelMusic"
+ disabled_control="MuteAudio"
+ follows="left|top"
+ height="15"
+ increment="0.025"
+ initial_value="0.5"
+ label="Music"
+ label_width="60"
+ left="10"
+ width="160"
+ layout="topleft"
+ name="Music Volume"
+ show_text="false"
+ top_pad="4"
+ volume="true">
+ <slider.commit_callback
+ function="Pref.setControlFalse"
+ parameter="MuteMusic" />
+ </slider>
+ <button
+ control_name="MuteMusic"
+ disabled_control="MuteAudio"
+ follows="top|left"
+ height="16"
+ image_selected="AudioMute_Off"
+ image_unselected="Audio_Off"
+ is_toggle="true"
+ layout="topleft"
+ left_pad="5"
+ name="mute_audio"
+ tab_stop="false"
+ width="16" />
+ <check_box
+ control_name="AudioStreamingMusic"
+ height="16"
+ tool_tip="Enable Streaming Music"
+ layout="topleft"
+ left_pad="5"
+ name="enable_music"
+ top_delta="2"
+ width="350">
+ <check_box.commit_callback
+ function="Pref.updateMediaAutoPlayCheckbox"/>
+ </check_box>
+ <slider
+ control_name="AudioLevelMedia"
+ disabled_control="MuteAudio"
+ follows="left|top"
+ height="16"
+ increment="0.025"
+ initial_value="0.5"
+ label="Media"
+ label_width="60"
+ left="10"
+ width="160"
+ layout="topleft"
+ name="Media Volume"
+ show_text="false"
+ top_pad="4"
+ volume="true">
+ <slider.commit_callback
+ function="Pref.setControlFalse"
+ parameter="MuteMedia" />
+ </slider>
+ <button
+ control_name="MuteMedia"
+ disabled_control="MuteAudio"
+ follows="top|left"
+ height="16"
+ image_selected="AudioMute_Off"
+ image_unselected="Audio_Off"
+ is_toggle="true"
+ layout="topleft"
+ left_pad="5"
+ name="mute_audio"
+ tab_stop="false"
+ width="16" />
+ <check_box
+ label_text.halign="left"
+ follows="left|top"
+ height="16"
+ control_name ="AudioStreamingMedia"
+ tool_tip="Enable Streaming Media"
+ layout="topleft"
+ top_delta="2"
+ left_pad="5"
+ name="enable_media"
+ width="110">
+ <check_box.commit_callback
+ function="Pref.updateMediaAutoPlayCheckbox"/>
+ </check_box>
+ <slider
+ control_name="AudioLevelVoice"
+ disabled_control="MuteAudio"
+ follows="left|top"
+ height="16"
+ increment="0.025"
+ initial_value="0.5"
+ label="Voice"
+ label_width="60"
+ left="10"
+ width="160"
+ layout="topleft"
+ top_pad="4"
+ name="Voice Volume"
+ show_text="false"
+ volume="true">
+ <slider.commit_callback
+ function="Pref.setControlFalse"
+ parameter="MuteVoice" />
+ </slider>
+ <button
+ control_name="MuteVoice"
+ disabled_control="MuteAudio"
+ follows="top|left"
+ height="16"
+ image_selected="AudioMute_Off"
+ image_unselected="Audio_Off"
+ is_toggle="true"
+ layout="topleft"
+ left_pad="5"
+ name="mute_audio"
+ tab_stop="false"
+ width="16" />
+ <check_box
+ label_text.halign="left"
+ follows="left|top"
+ height="16"
+ control_name ="EnableVoiceChat"
+ disabled_control="CmdLineDisableVoice"
+ tool_tip="Enable Voice Chat"
+ layout="topleft"
+ top_delta="2"
+ left_pad="5"
+ name="enable_voice_check"
+ width="110"/>
</panel>
diff --git a/indra/newview/skins/default/xui/en/sidepanel_inventory.xml b/indra/newview/skins/default/xui/en/sidepanel_inventory.xml
index 6ecb57b41d..14bd349480 100644
--- a/indra/newview/skins/default/xui/en/sidepanel_inventory.xml
+++ b/indra/newview/skins/default/xui/en/sidepanel_inventory.xml
@@ -48,7 +48,7 @@
height="300"
width="330" />
</layout_panel>
- <layout_panel
+ <layout_panel
width="330"
layout="topleft"
auto_resize="false"
diff --git a/indra/newview/skins/default/xui/en/sidepanel_item_info.xml b/indra/newview/skins/default/xui/en/sidepanel_item_info.xml
index 54a312bd59..c5dfb703e5 100644
--- a/indra/newview/skins/default/xui/en/sidepanel_item_info.xml
+++ b/indra/newview/skins/default/xui/en/sidepanel_item_info.xml
@@ -11,6 +11,10 @@
name="unknown">
(unknown)
</panel.string>
+ <panel.string
+ name="unknown_multiple">
+ (unknown / multiple)
+ </panel.string>
<panel.string
name="public">
(public)
diff --git a/indra/newview/skins/default/xui/en/sidepanel_task_info.xml b/indra/newview/skins/default/xui/en/sidepanel_task_info.xml
index bf2e6bc2d9..e9a787cef0 100644
--- a/indra/newview/skins/default/xui/en/sidepanel_task_info.xml
+++ b/indra/newview/skins/default/xui/en/sidepanel_task_info.xml
@@ -1,429 +1,437 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<panel
- height="570"
- layout="topleft"
- name="object properties"
- help_topic="object_properties"
- title="Object Profile"
- width="333">
- <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't modify this object
- </panel.string>
- <panel.string
- name="text modify info 4">
- You can't modify these objects
- </panel.string>
- <panel.string
- name="text modify warning">
- This object has linked parts
- </panel.string>
- <panel.string
- name="Cost Default">
- Price: L$
- </panel.string>
- <panel.string
- name="Cost Total">
- Total Price: 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>
+ height="570"
+ layout="topleft"
+ name="object properties"
+ help_topic="object_properties"
+ title="Object Profile"
+ width="333">
+ <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't modify this object
+ </panel.string>
+ <panel.string
+ name="text modify info 4">
+ You can't modify these objects
+ </panel.string>
+ <panel.string
+ name="text modify info 5">
+ You can't modify this object across a region boundary
+ </panel.string>
+ <panel.string
+ name="text modify info 6">
+ You can't modify these objects across a region boundary
+ </panel.string>
+ <panel.string
+ name="text modify warning">
+ This object has linked parts
+ </panel.string>
+ <panel.string
+ name="Cost Default">
+ Price: L$
+ </panel.string>
+ <panel.string
+ name="Cost Total">
+ Total Price: 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>
+ <button
+ follows="top|left"
+ height="24"
+ image_hover_unselected="BackButton_Over"
+ image_pressed="BackButton_Press"
+ image_unselected="BackButton_Off"
+ layout="topleft"
+ left="8"
+ name="back_btn"
+ tab_stop="false"
+ top="0"
+ width="30"
+ use_draw_context_alpha="false" />
+ <text
+ follows="top|left|right"
+ font="SansSerifHuge"
+ height="26"
+ layout="topleft"
+ left_pad="10"
+ name="title"
+ text_color="LtGray"
+ top="0"
+ use_ellipses="true"
+ value="Object Profile"
+ width="290" />
+ <text
+ follows="top|left"
+ height="13"
+ layout="topleft"
+ left="45"
+ name="where"
+ text_color="LtGray_50"
+ value="(Inworld)"
+ width="150" />
+ <panel
+ follows="all"
+ height="490"
+ label=""
+ layout="topleft"
+ left="10"
+ help_topic=""
+ name="properties_panel"
+ top="45"
+ width="313"
+ background_visible="true"
+ bg_alpha_color="DkGray2">
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="10"
+ layout="topleft"
+ left="5"
+ name="Name:"
+ top="10"
+ width="78">
+ Name:
+ </text>
+ <line_editor
+ border_style="line"
+ border_thickness="1"
+ follows="left|top|right"
+ height="20"
+ layout="topleft"
+ left_delta="78"
+ max_length_bytes="63"
+ name="Object Name"
+ top_delta="0"
+ width="225" />
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="10"
+ layout="topleft"
+ left="5"
+ name="Description:"
+ top_pad="10"
+ width="78">
+ Description:
+ </text>
+ <line_editor
+ border_style="line"
+ border_thickness="1"
+ follows="left|top|right"
+ height="23"
+ layout="topleft"
+ name="Object Description"
+ select_on_focus="true"
+ left_delta="78"
+ max_length_bytes="127"
+ top_delta="-5"
+ width="225"/>
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="23"
+ layout="topleft"
+ left="5"
+ name="CreatorNameLabel"
+ top_pad="12"
+ width="78">
+ Creator:
+ </text>
+ <text
+ type="string"
+ follows="left|right|top"
+ font="SansSerifSmall"
+ height="15"
+ layout="topleft"
+ left_pad="0"
+ name="Creator Name"
+ top_delta="0"
+ translate="false"
+ use_ellipses="true"
+ width="225">
+ TestString PleaseIgnore
+ </text>
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="23"
+ layout="topleft"
+ left="5"
+ name="Owner:"
+ top_pad="15"
+ width="78">
+ Owner:
+ </text>
+ <text
+ type="string"
+ follows="left|right|top"
+ font="SansSerifSmall"
+ height="15"
+ layout="topleft"
+ left_pad="0"
+ name="Owner Name"
+ top_delta="0"
+ translate="false"
+ use_ellipses="true"
+ width="225">
+ TestString PleaseIgnore
+ </text>
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="23"
+ layout="topleft"
+ left="5"
+ name="Group_label"
+ top_pad="15"
+ width="78">
+ Group:
+ </text>
<button
- follows="top|left"
- height="24"
- image_hover_unselected="BackButton_Over"
- image_pressed="BackButton_Press"
- image_unselected="BackButton_Off"
- layout="topleft"
- left="8"
- name="back_btn"
- tab_stop="false"
- top="0"
- width="30"
- use_draw_context_alpha="false" />
- <text
- follows="top|left|right"
- font="SansSerifHuge"
- height="26"
- layout="topleft"
- left_pad="10"
- name="title"
- text_color="LtGray"
- top="0"
- use_ellipses="true"
- value="Object Profile"
- width="290" />
- <text
- follows="top|left"
- height="13"
- layout="topleft"
- left="45"
- name="where"
- text_color="LtGray_50"
- value="(Inworld)"
- width="150" />
- <panel
- follows="all"
- height="490"
- label=""
- layout="topleft"
- left="10"
- help_topic=""
- name="properties_panel"
- top="45"
- width="313"
- background_visible="true"
- bg_alpha_color="DkGray2">
- <text
- type="string"
- length="1"
- follows="left|top"
- height="10"
- layout="topleft"
- left="5"
- name="Name:"
- top="10"
- width="78">
- Name:
- </text>
- <line_editor
- border_style="line"
- border_thickness="1"
- follows="left|top|right"
- height="20"
- layout="topleft"
- left_delta="78"
- max_length_bytes="63"
- name="Object Name"
- top_delta="0"
- width="225" />
- <text
- type="string"
- length="1"
- follows="left|top"
- height="10"
- layout="topleft"
- left="5"
- name="Description:"
- top_pad="10"
- width="78">
- Description:
- </text>
- <line_editor
- border_style="line"
- border_thickness="1"
- follows="left|top|right"
- height="23"
- layout="topleft"
- name="Object Description"
- select_on_focus="true"
- left_delta="78"
- max_length_bytes="127"
- top_delta="-5"
- width="225"/>
- <text
- type="string"
- length="1"
- follows="left|top"
- height="23"
- layout="topleft"
- left="5"
- name="CreatorNameLabel"
- top_pad="12"
- width="78">
- Creator:
- </text>
- <text
- type="string"
- follows="left|right|top"
- font="SansSerifSmall"
- height="15"
- layout="topleft"
- left_pad="0"
- name="Creator Name"
- top_delta="0"
- translate="false"
- use_ellipses="true"
- width="225">
- TestString PleaseIgnore
- </text>
- <text
- type="string"
- length="1"
- follows="left|top"
- height="23"
- layout="topleft"
- left="5"
- name="Owner:"
- top_pad="15"
- width="78">
- Owner:
- </text>
- <text
- type="string"
- follows="left|right|top"
- font="SansSerifSmall"
- height="15"
- layout="topleft"
- left_pad="0"
- name="Owner Name"
- top_delta="0"
- translate="false"
- use_ellipses="true"
- width="225">
- TestString PleaseIgnore
- </text>
- <text
- type="string"
- length="1"
- follows="left|top"
- height="23"
- layout="topleft"
- left="5"
- name="Group_label"
- top_pad="15"
- width="78">
- Group:
- </text>
- <button
- follows="top|left"
- height="10"
- image_disabled="Activate_Checkmark"
- image_selected="Activate_Checkmark"
- image_unselected="Activate_Checkmark"
- image_color="White_50"
- layout="topleft"
- left_pad="0"
- top_delta="0"
- name="button set group"
- tab_stop="false"
- tool_tip="Choose a group to share this object's permissions"
- width="10" />
- <name_box
- follows="left|top"
- height="18"
- initial_value="Loading..."
- layout="topleft"
- left_pad="5"
- top_delta="-1"
- name="Group Name Proxy"
- width="150" />
- <button
- follows="top|left"
- height="23"
- label="Deed"
- label_selected="Deed"
- layout="topleft"
- name="button deed"
- top_pad="0"
- left="81"
- tool_tip="Deeding gives this item away with next owner permissions. Group shared objects can be deeded by a group officer."
- width="100" />
- <text
- type="string"
- length="1"
- follows="left|top"
- height="9"
- layout="topleft"
- top_pad="5"
- left="5"
- name="label click action"
- width="280">
- Click to:
- </text>
- <combo_box
- follows="left|top"
- height="23"
- layout="topleft"
- name="clickaction"
- width="168"
- left="81">
- <combo_box.item
- label="Touch (default)"
- name="Touch/grab(default)"
- value="Touch" />
- <combo_box.item
- label="Sit on object"
- name="Sitonobject"
- value="Sit" />
- <combo_box.item
- label="Buy object"
- name="Buyobject"
- value="Buy" />
- <combo_box.item
- label="Pay object"
- name="Payobject"
- value="Pay" />
- <combo_box.item
- label="Open"
- name="Open"
- value="Open" />
- </combo_box>
- <panel
- border="false"
- follows="left|top"
- layout="topleft"
- mouse_opaque="false"
- background_visible="true"
- bg_alpha_color="DkGray"
- name="perms_inv"
- left="0"
- top_pad="15"
- height="135"
- width="313">
- <text
- type="string"
- length="1"
- left="10"
- top_pad="15"
- text_color="EmphasisColor"
- height="15"
- follows="left|top|right"
- layout="topleft"
- name="perm_modify"
- width="310">
- You can modify this object
- </text>
- <text
- type="string"
- length="1"
- follows="left|top"
- height="16"
- layout="topleft"
- left="10"
- name="Anyone can:"
- top_pad="8"
- width="100">
- Anyone:
- </text>
- <check_box
- height="18"
- label="Copy"
- layout="topleft"
- left_pad="0"
- name="checkbox allow everyone copy"
- top_delta="-2"
- width="90" />
- <check_box
- height="18"
- label="Move"
- layout="topleft"
- name="checkbox allow everyone move"
- left_pad="0"
- width="150" />
- <text
- type="string"
- length="1"
- follows="left|top"
- height="16"
- layout="topleft"
- left="10"
- name="GroupLabel"
- top_pad="8"
- width="100">
- Group:
- </text>
- <check_box
- height="18"
- label="Share"
- layout="topleft"
- left_pad="90"
- top_delta="-2"
- 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."
- width="150" />
- <text
- type="string"
- length="1"
- follows="left|top"
- height="16"
- layout="topleft"
- left="10"
- name="NextOwnerLabel"
- top_pad="8"
- width="200"
- word_wrap="true">
- Next owner:
- </text>
- <check_box
- height="18"
- label="Modify"
- layout="topleft"
- left="20"
- top_pad="0"
- name="checkbox next owner can modify"
- width="90" />
- <check_box
- height="18"
- label="Copy"
- layout="topleft"
- left_pad="0"
- name="checkbox next owner can copy"
- width="90" />
- <check_box
- height="18"
- label="Transfer"
- layout="topleft"
- left_pad="0"
- name="checkbox next owner can transfer"
- tool_tip="Next owner can give away or resell this object"
- width="106" />
- </panel>
- <check_box
- height="23"
- label="For Sale"
- layout="topleft"
- left="20"
- name="checkbox for sale"
- top_pad="10"
- width="100" />
- <combo_box
- height="23"
- left_pad="0"
- layout="topleft"
- follows="left|top"
- name="sale type"
- width="170">
- <combo_box.item
- name="Copy"
- label="Copy"
- value="2" />
- <combo_box.item
- name="Contents"
- label="Contents"
- value="3" />
- <combo_box.item
- name="Original"
- label="Original"
- value="1" />
- </combo_box>
- <spinner
+ follows="top|left"
+ height="10"
+ image_disabled="Activate_Checkmark"
+ image_selected="Activate_Checkmark"
+ image_unselected="Activate_Checkmark"
+ image_color="White_50"
+ layout="topleft"
+ left_pad="0"
+ top_delta="0"
+ name="button set group"
+ tab_stop="false"
+ tool_tip="Choose a group to share this object's permissions"
+ width="10" />
+ <name_box
+ follows="left|top"
+ height="18"
+ initial_value="Loading..."
+ layout="topleft"
+ left_pad="5"
+ top_delta="-1"
+ name="Group Name Proxy"
+ width="150" />
+ <button
+ follows="top|left"
+ height="23"
+ label="Deed"
+ label_selected="Deed"
+ layout="topleft"
+ name="button deed"
+ top_pad="0"
+ left="81"
+ tool_tip="Deeding gives this item away with next owner permissions. Group shared objects can be deeded by a group officer."
+ width="100" />
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="9"
+ layout="topleft"
+ top_pad="5"
+ left="5"
+ name="label click action"
+ width="280">
+ Click to:
+ </text>
+ <combo_box
+ follows="left|top"
+ height="23"
+ layout="topleft"
+ name="clickaction"
+ width="168"
+ left="81">
+ <combo_box.item
+ label="Touch (default)"
+ name="Touch/grab(default)"
+ value="Touch" />
+ <combo_box.item
+ label="Sit on object"
+ name="Sitonobject"
+ value="Sit" />
+ <combo_box.item
+ label="Buy object"
+ name="Buyobject"
+ value="Buy" />
+ <combo_box.item
+ label="Pay object"
+ name="Payobject"
+ value="Pay" />
+ <combo_box.item
+ label="Open"
+ name="Open"
+ value="Open" />
+ </combo_box>
+ <panel
+ border="false"
+ follows="left|top"
+ layout="topleft"
+ mouse_opaque="false"
+ background_visible="true"
+ bg_alpha_color="DkGray"
+ name="perms_inv"
+ left="0"
+ top_pad="15"
+ height="135"
+ width="313">
+ <text
+ type="string"
+ length="1"
+ left="5"
+ top_pad="15"
+ text_color="EmphasisColor"
+ height="15"
+ follows="left|top|right"
+ layout="topleft"
+ name="perm_modify"
+ width="310">
+ You can modify this object
+ </text>
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="16"
+ layout="topleft"
+ left="10"
+ name="Anyone can:"
+ top_pad="8"
+ width="100">
+ Anyone:
+ </text>
+ <check_box
+ height="18"
+ label="Copy"
+ layout="topleft"
+ left_pad="0"
+ name="checkbox allow everyone copy"
+ top_delta="-2"
+ width="90" />
+ <check_box
+ height="18"
+ label="Move"
+ layout="topleft"
+ name="checkbox allow everyone move"
+ left_pad="0"
+ width="150" />
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="16"
+ layout="topleft"
+ left="10"
+ name="GroupLabel"
+ top_pad="8"
+ width="100">
+ Group:
+ </text>
+ <check_box
+ height="18"
+ label="Share"
+ layout="topleft"
+ left_pad="90"
+ top_delta="-2"
+ 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."
+ width="150" />
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="16"
+ layout="topleft"
+ left="10"
+ name="NextOwnerLabel"
+ top_pad="8"
+ width="200"
+ word_wrap="true">
+ Next owner:
+ </text>
+ <check_box
+ height="18"
+ label="Modify"
+ layout="topleft"
+ left="20"
+ top_pad="0"
+ name="checkbox next owner can modify"
+ width="90" />
+ <check_box
+ height="18"
+ label="Copy"
+ layout="topleft"
+ left_pad="0"
+ name="checkbox next owner can copy"
+ width="90" />
+ <check_box
+ height="18"
+ label="Transfer"
+ layout="topleft"
+ left_pad="0"
+ name="checkbox next owner can transfer"
+ tool_tip="Next owner can give away or resell this object"
+ width="106" />
+ </panel>
+ <check_box
+ height="23"
+ label="For Sale"
+ layout="topleft"
+ left="20"
+ name="checkbox for sale"
+ top_pad="10"
+ width="100" />
+ <combo_box
+ height="23"
+ left_pad="0"
+ layout="topleft"
+ follows="left|top"
+ name="sale type"
+ width="170">
+ <combo_box.item
+ name="Copy"
+ label="Copy"
+ value="2" />
+ <combo_box.item
+ name="Contents"
+ label="Contents"
+ value="3" />
+ <combo_box.item
+ name="Original"
+ label="Original"
+ value="1" />
+ </combo_box>
+ <spinner
follows="left|top"
decimal_digits="0"
increment="1"
@@ -437,132 +445,150 @@
min_val="1"
height="20"
max_val="999999999" />
- <check_box
- height="20"
- width="110"
- top_pad="6"
- label="Show in search"
- layout="topleft"
- left="120"
- name="search_check"
- tool_tip="Let people see this object in search results" />
- <text
- type="string"
- text_color="EmphasisColor"
- length="1"
- top_pad="15"
- follows="left|top"
- layout="topleft"
- left="10"
- name="B:"
- height="10"
- width="50">
- B:
- </text>
- <text
- type="string"
- text_color="White"
- length="1"
- follows="left|top"
- layout="topleft"
- left_pad="0"
- name="O:"
- height="10"
- width="50">
- O:
- </text>
- <text
- type="string"
- text_color="EmphasisColor"
- length="1"
- follows="left|top"
- layout="topleft"
- left_pad="0"
- name="G:"
- height="10"
- width="50">
- G:
- </text>
- <text
- type="string"
- text_color="White"
- length="1"
- follows="left|top"
- left_pad="0"
- layout="topleft"
- name="E:"
- height="10"
- width="50">
- E:
- </text>
- <text
- type="string"
- text_color="EmphasisColor"
- length="1"
- follows="left|top"
- layout="topleft"
- left_pad="0"
- name="N:"
- height="10"
- width="50">
- N:
- </text>
- <text
- type="string"
- text_color="White"
- length="1"
- follows="left|top"
- layout="topleft"
- left_pad="0"
- name="F:"
- height="10"
- width="50">
- F:
- </text>
- </panel>
- <panel
- height="25"
- layout="bottomright"
- name="button_panel"
- left="5"
- bottom="5"
- width="313">
- <button
- follows="bottom|left"
- height="23"
- label="Open"
- layout="topleft"
- left="5"
- name="open_btn"
- top="0"
- width="73" />
- <button
- follows="bottom|left"
- height="23"
- label="Pay"
- layout="topleft"
- left_pad="5"
- name="pay_btn"
- top="0"
- width="73" />
- <button
- follows="bottom|left"
- height="23"
- label="Buy"
- layout="topleft"
- left_pad="5"
- name="buy_btn"
- top="0"
- width="73" />
- <button
- follows="bottom|left"
- height="23"
- label="Details"
- layout="topleft"
- left_pad="5"
- name="details_btn"
- top="0"
- width="74" />
+ <check_box
+ height="20"
+ width="110"
+ top_pad="6"
+ label="Show in search"
+ layout="topleft"
+ left="120"
+ name="search_check"
+ tool_tip="Let people see this object in search results" />
+ <text
+ type="string"
+ follows="left|top"
+ name="pathfinding_attributes_label"
+ top_pad="6"
+ width="150"
+ left="5">
+ Pathfinding attributes:
+ </text>
+ <text
+ type="string"
+ follows="left|top"
+ text_color="EmphasisColor"
+ name="pathfinding_attributes_value"
+ width="130"
+ word_wrap="false"
+ left_pad="0">
+ </text>
+ <text
+ type="string"
+ text_color="EmphasisColor"
+ length="1"
+ top_pad="10"
+ follows="left|top"
+ layout="topleft"
+ left="10"
+ name="B:"
+ height="10"
+ width="50">
+ B:
+ </text>
+ <text
+ type="string"
+ text_color="White"
+ length="1"
+ follows="left|top"
+ layout="topleft"
+ left_pad="0"
+ name="O:"
+ height="10"
+ width="50">
+ O:
+ </text>
+ <text
+ type="string"
+ text_color="EmphasisColor"
+ length="1"
+ follows="left|top"
+ layout="topleft"
+ left_pad="0"
+ name="G:"
+ height="10"
+ width="50">
+ G:
+ </text>
+ <text
+ type="string"
+ text_color="White"
+ length="1"
+ follows="left|top"
+ left_pad="0"
+ layout="topleft"
+ name="E:"
+ height="10"
+ width="50">
+ E:
+ </text>
+ <text
+ type="string"
+ text_color="EmphasisColor"
+ length="1"
+ follows="left|top"
+ layout="topleft"
+ left_pad="0"
+ name="N:"
+ height="10"
+ width="50">
+ N:
+ </text>
+ <text
+ type="string"
+ text_color="White"
+ length="1"
+ follows="left|top"
+ layout="topleft"
+ left_pad="0"
+ name="F:"
+ height="10"
+ width="50">
+ F:
+ </text>
+ </panel>
+ <panel
+ height="25"
+ layout="bottomright"
+ name="button_panel"
+ left="5"
+ bottom="5"
+ width="313">
+ <button
+ follows="bottom|left"
+ height="23"
+ label="Open"
+ layout="topleft"
+ left="5"
+ name="open_btn"
+ top="0"
+ width="73" />
+ <button
+ follows="bottom|left"
+ height="23"
+ label="Pay"
+ layout="topleft"
+ left_pad="5"
+ name="pay_btn"
+ top="0"
+ width="73" />
+ <button
+ follows="bottom|left"
+ height="23"
+ label="Buy"
+ layout="topleft"
+ left_pad="5"
+ name="buy_btn"
+ top="0"
+ width="73" />
+ <button
+ follows="bottom|left"
+ height="23"
+ label="Details"
+ layout="topleft"
+ left_pad="5"
+ name="details_btn"
+ top="0"
+ width="74" />
- </panel>
+ </panel>
</panel>
diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml
index 866ea296c3..15eb46c348 100644
--- a/indra/newview/skins/default/xui/en/strings.xml
+++ b/indra/newview/skins/default/xui/en/strings.xml
@@ -441,6 +441,7 @@ Please try logging in again in a minute.</string>
<string name="load_files">Load Files</string>
<string name="choose_the_directory">Choose Directory</string>
<string name="script_files">Scripts</string>
+ <string name="dictionary_files">Dictionaries</string>
<!-- LSL Usage Hover Tips -->
<!-- NOTE: For now these are set as translate="false", until DEV-40761 is implemented (to internationalize the rest of tooltips in the same window).
@@ -671,7 +672,7 @@ Sets the texture u &amp; v scales for the chosen face or ALL_SIDES
</string>
<string name="LSLTipText_llOffsetTexture" translate="false">
llOffsetTexture(float u, float v, integer face)
-Sets the texture u &amp; v offsets for the chosen face or ALL_SIDES
+Sets the texture u &amp; v offsets for the chosen face or ALL_SIDES
</string>
<string name="LSLTipText_llRotateTexture" translate="false">
llRotateTexture(float rotation, integer face)
@@ -789,9 +790,9 @@ Sets the script timer to zero
float llGetAndResetTime()
Returns the script time in seconds and then resets the script timer to zero
</string>
- <string name="LSLTipText_llSoplayund" translate="false">
+ <string name="LSLTipText_llSound" translate="false">
llSound(string sound, float volume, integer queue, integer loop)
-Plays sound at volume and whether it should loop or not
+Plays sound at volume and whether it should loop or not.
</string>
<string name="LSLTipText_llPlaySound" translate="false">
llPlaySound(string sound, float volume)
@@ -1667,7 +1668,7 @@ Returns a list containing results of the sent query
</string>
<string name="LSLTipText_llModPow" translate="false">
integer llModPow(integer a, integer b, integer c)
-Returns a raised to the b power, mod c. ( (a**b)%c )
+Returns a raised to the b power, mod c. ( (a**b)%c )
b is capped at 0xFFFF (16 bits).
</string>
<string name="LSLTipText_llGetInventoryType" translate="false">
@@ -1780,10 +1781,10 @@ integer llGetParcelMaxPrims(vector pos, integer sim_wide)
Returns the maximum number of prims allowed on the parcel at pos
</string>
<string name="LSLTipText_llGetParcelDetails" translate="false">
- list llGetParcelDetails(vector pos, list params)
- Returns the parcel details specified in params for the parcel at pos.
- Params is one or more of: PARCEL_DETAILS_NAME, _DESC, _OWNER, _GROUP, _AREA, _ID, _SEE_AVATARS
- </string>
+list llGetParcelDetails(vector pos, list params)
+Returns the parcel details specified in params for the parcel at pos.
+Params is one or more of: PARCEL_DETAILS_NAME, _DESC, _OWNER, _GROUP, _AREA, _ID, _SEE_AVATARS
+ </string>
<string name="LSLTipText_llSetLinkPrimitiveParams" translate="false">
llSetLinkPrimitiveParams(integer linknumber, list rules)
Sets primitive parameters for linknumber based on rules
@@ -1872,71 +1873,202 @@ Releases the specified URL, it will no longer be usable
<string name="LSLTipText_llHTTPResponse" translate="false">
llHTTPResponse(key request_id, integer status, string body)
Responds to request_id with status and body
- </string>
+ </string>
<string name="LSLTipText_llGetHTTPHeader" translate="false">
string llGetHTTPHeader(key request_id, string header)
Returns the value for header for request_id
</string>
- <string name="LSLTipText_llSetPrimMediaParams" translate="false">
+ <string name="LSLTipText_llSetPrimMediaParams" translate="false">
llSetPrimMediaParams(integer face, list params)
Sets the media params for a particular face on an object. If media is not already on this object, add it.
List is a set of name/value pairs in no particular order. Params not specified are unchanged, or if new media is added then set to the default specified.
The possible names are below, along with the types of values and what they mean.
- </string>
- <string name="LSLTipText_llGetPrimMediaParams" translate="false">
+ </string>
+ <string name="LSLTipText_llGetPrimMediaParams" translate="false">
list llGetPrimMediaParams(integer face, list params)
Returns the media params for a particular face on an object, given the desired list of names, in the order requested.
(Returns an empty list if no media exists on the face.)
- </string>
- <string name="LSLTipText_llClearPrimMedia" translate="false">
+ </string>
+ <string name="LSLTipText_llClearPrimMedia" translate="false">
llClearPrimMedia(integer face)
Clears (deletes) the media and all params from the given face.
- </string>
-<string name="LSLTipText_llSetLinkPrimitiveParamsFast" translate="false">
+ </string>
+ <string name="LSLTipText_llSetLinkPrimitiveParamsFast" translate="false">
llSetLinkPrimitiveParamsFast(integer linknumber,list rules)
Set primitive parameters for linknumber based on rules.
-</string>
-<string name="LSLTipText_llGetLinkPrimitiveParams" translate="false">
+ </string>
+ <string name="LSLTipText_llGetLinkPrimitiveParams" translate="false">
llGetLinkPrimitiveParams(integer linknumber,list rules)
Get primitive parameters for linknumber based on rules.
-</string>
-<string name="LSLTipText_llLinkParticleSystem" translate="false">
+ </string>
+ <string name="LSLTipText_llLinkParticleSystem" translate="false">
llLinkParticleSystem(integer linknumber,list rules)
Creates a particle system based on rules. Empty list removes particle system from object.
List format is [ rule1, data1, rule2, data2 . . . rulen, datan ].
-</string>
-<string name="LSLTipText_llSetLinkTextureAnim" translate="false">
+ </string>
+ <string name="LSLTipText_llSetLinkTextureAnim" translate="false">
llSetLinkTextureAnim(integer link, integer mode, integer face, integer sizex, integer sizey, float start, float length, float rate)
-Animate the texture on the specified prim's face/faces.
-</string>
-<string name="LSLTipText_llGetLinkNumberOfSides" translate="false">
+Animate the texture on the specified prim&apos;s face/faces.
+ </string>
+ <string name="LSLTipText_llGetLinkNumberOfSides" translate="false">
integer llGetLinkNumberOfSides(integer link)
Returns the number of sides of the specified linked prim.
-</string>
-<string name="LSLTipText_llGetUsername" translate="false">
+ </string>
+ <string name="LSLTipText_llGetUsername" translate="false">
string llGetUsername(key id)
Returns the single-word username of an avatar, iff the avatar is in the current region, otherwise the empty string.
-</string>
-<string name="LSLTipText_llRequestUsername" translate="false">
+ </string>
+ <string name="LSLTipText_llRequestUsername" translate="false">
key llRequestUsername(key id)
Requests single-word username of an avatar. When data is available the dataserver event will be raised.
-</string>
-<string name="LSLTipText_llGetDisplayName" translate="false">
- string llGetDisplayName(key id)
- Returns the name of an avatar, iff the avatar is in the current simulator, and the name has been cached, otherwise the same as llGetUsername. Use llRequestDisplayName if you absolutely must have the display name.
-</string>
-<string name="LSLTipText_llRequestDisplayName" translate="false">
+ </string>
+ <string name="LSLTipText_llGetDisplayName" translate="false">
+string llGetDisplayName(key id)
+Returns the name of an avatar, iff the avatar is in the current simulator, and the name has been cached, otherwise the same as llGetUsername. Use llRequestDisplayName if you absolutely must have the display name.
+ </string>
+ <string name="LSLTipText_llRequestDisplayName" translate="false">
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">
+ </string>
+ <string name="LSLTipText_llGetEnv" translate="false">
llGetEnv(string name)
Returns a string with the requested data about the region
-</string>
+ </string>
+ <string name="LSLTipText_llCastRay" translate="false">
+llCastRay(vector start, vector end, list params)
+Casts a ray into the physics world from &apos;start&apos; to &apos;end&apos; and returns data according to details in params.
+ </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_llGetSPMaxMemory" translate="false">
+integer llGetSPMaxMemory()
+Returns the maximum used memory for the current script. Only valid after using PROFILE_SCRIPT_MEMORY. Non-mono scripts always use 16k.
+ </string>
+ <string name="LSLTipText_llGetUsedMemory" translate="false">
+integer llGetUsedMemory()
+Returns the current used memory for the current script. Non-mono scripts always use 16k.
+ </string>
+ <string name="LSLTipText_llScriptProfiler" translate="false">
+llScriptProfiler(integer flags)
+Enabled or disables script profiling options. Currently only supports PROFILE_SCRIPT_MEMORY (mono only) and PROFILE_NONE.
+MAY SIGNIFICANTLY REDUCE SCRIPT PERFORMANCE!
+ </string>
+ <string name="LSLTipText_llSetMemoryLimit" translate="false">
+integer llSetMemoryLimit(integer mem)
+ </string>
+ <string name="LSLTipText_llGetMemoryLimit" translate="false">
+integer llGetMemoryLimit()
+ </string>
+ <string name="LSLTipText_llSetLinkMedia" translate="false">
+llSetLinkMedia(integer link, integer face, list params)
+Set the media params for a particular face on linked prim. List is a set of name/value pairs (in no particular order). The possible names are below, along with the types of values and what they mean. If media is not already on this object, add it. Params not specified are unchanged, or if new media is added set to the default specified.
+ </string>
+ <string name="LSLTipText_llGetLinkMedia" translate="false">
+list llGetLinkMedia(integer link, integer face, list params)
+Get the media params for a particular face on linked prim, given the desired list of names. Returns a list of values in the order requested. Returns an empty list if no media exists on the face.
+ </string>
+ <string name="LSLTipText_llClearLinkMedia" translate="false">
+llClearLinkMedia(integer link, integer face)
+Clears (deletes) the media and all params from the given face on linked prim.
+ </string>
+ <string name="LSLTipText_llSetContentType" translate="false">
+llSetContentType(key id, integer content_type)
+ </string>
+ <string name="LSLTipText_llLinkSitTarget" translate="false">
+llLinkSitTarget(integer link, vector offset, rotation rot)
+Set the sit location for this object (if offset == &lt;0,0,0&gt; clear it)
+ </string>
+ <string name="LSLTipText_llAvatarOnLinkSitTarget" translate="false">
+key llAvatarOnLinkSitTarget(integer link)
+If an avatar is sitting on the sit target, return the avatar&apos;s key, NULL_KEY otherwise
+ </string>
+ <string name="LSLTipText_llSetLinkCamera" translate="false">
+llSetLinkCamera(integer link, vector eye, vector at)
+ </string>
+ <string name="LSLTipText_llSetVelocity" translate="false">
+llSetVelocity(vector velocity, integer local)
+Sets an objects velocity, in local coords if local == TRUE (if the script is physical)
+ </string>
+ <string name="LSLTipText_llSetAngularVelocity" translate="false">
+llSetAngularVelocity(vector angular_velocity, integer local)
+Sets an objects angular velocity, in local coords if local == TRUE (if the script is physical)
+ </string>
+ <string name="LSLTipText_llSetPhysicsMaterial" translate="false">
+llSetPhysicsMaterial(integer flags, float gravity_multiplier, float restitution, float friction, float density )
+Sets the requested attributes of the root object&apos;s physics material.
+ </string>
+ <string name="LSLTipText_llGetPhysicsMaterial" translate="false">
+llGetPhysicsMaterial() returns the gravity multiplier, restitution, friction, and density of the linkset as a list in that order.
+ </string>
+ <string name="LSLTipText_llGetMassMKS" translate="false">
+llGetMassMKS() returns the mass of the linkset in kilograms.
+ </string>
+ <string name="LSLTipText_llGenerateKey" translate="false">
+llGenerateKey()
+Retun a unique generated key
+ </string>
+ <string name="LSLTipText_llSetKeyframedMotion" translate="false">
+llSetKeyframedMotion(list keyframes, list options)
+Requests that a nonphysical object be keyframed according to keyframe list.
+ </string>
+ <string name="LSLTipText_llTransferLindenDollars" translate="false">
+key llTransferLindenDollars(key destination, integer amount)
+Transfer amount of linden dollars (L$) from script owner to destination. Returns a key to a corresponding transaction_result event for the success of the transfer.
+ </string>
+ <string name="LSLTipText_llGetParcelMusicURL" translate="false">
+string llGetParcelMusicURL()
+Gets the streaming audio URL for the parcel of land on which the object is located.
+ </string>
+ <string name="LSLTipText_llSetRegionPos" translate="false">
+integer llSetRegionPos(vector pos)
+Sets the position anywhere within the region (if the object isn&apos;t physical)
+ </string>
+ <string name="LSLTipText_llNavigateTo" translate="false">
+llNavigateTo(vector point, list options)
+For AI Character: Navigate to destination.
+ </string>
+ <string name="LSLTipText_llCreateCharacter" translate="false">
+llCreateCharacter(list options)
+Convert linkset to AI Character which can navigate the world.
+ </string>
+ <string name="LSLTipText_llPursue" translate="false">
+llPursue(key target, list options)
+For AI Character: Chase after a target.
+ </string>
+ <string name="LSLTipText_llWanderWithin" translate="false">
+llWanderWithin(vector center, float radius, list options)
+For AI Character: Wander within a specified volume.
+ </string>
+ <string name="LSLTipText_llFleeFrom" translate="false">
+llFleeFrom(vector source, float radius, list options)
+For AI Character: Flee from a point.
+ </string>
+ <string name="LSLTipText_llPatrolPoints" translate="false">
+llPatrolPoints(list points, list options)
+For AI Character: Patrol a list of points.
+ </string>
+ <string name="LSLTipText_llExecCharacterCmd" translate="false">
+llExecCharacterCmd(integer cmd, list options)
+For AI Character: Execute a character command.
+ </string>
+ <string name="LSLTipText_llDeleteCharacter" translate="false">
+llDeleteCharacter()
+Convert linkset from AI Character to Physics object.
+ </string>
+ <string name="LSLTipText_llUpdateCharacter" translate="false">
+llUpdateCharacter(list options)
+Change the AI Character&apos;s settings.
+ </string>
+ <string name="LSLTipText_llEvade" translate="false">
+llEvade(key target, list options)
+For AI Character: Evade a specified target.
+ </string>
+ <string name="LSLTipText_llGetClosestNavPoint" translate="false">
+list llGetClosestNavPoint(vector point, list options)
+For AI Character: Get the closest navigable point to the point provided.
+ </string>
<!-- Avatar busy/away mode -->
@@ -2140,11 +2272,15 @@ Drag folders to this area and click "Send to Marketplace" to list them for sale
<!-- historically default name of the Favorites folder can start from either "f" or "F" letter.
We should localize both of them with the same value -->
<string name="InvFolder favorite">My Favorites</string>
+ <string name="InvFolder Favorites">My Favorites</string>
+ <string name="InvFolder favorites">My Favorites</string>
<string name="InvFolder Current Outfit">Current Outfit</string>
<string name="InvFolder Initial Outfits">Initial Outfits</string>
<string name="InvFolder My Outfits">My Outfits</string>
<string name="InvFolder Accessories">Accessories</string>
<string name="InvFolder Meshes">Meshes</string>
+ <string name="InvFolder Received Items">Received Items</string>
+ <string name="InvFolder Merchant Outbox">Merchant Outbox</string>
<!-- are used for Friends and Friends/All folders in Inventory "Calling cards" folder. See EXT-694-->
<string name="InvFolder Friends">Friends</string>
@@ -3195,7 +3331,8 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
<string name="LocationCtrlModerateIconTooltip">Moderate Region</string>
<string name="LocationCtrlGeneralIconTooltip">General Region</string>
<string name="LocationCtrlSeeAVsTooltip">Avatars visible and chat allowed outside of this parcel</string>
-
+ <string name="LocationCtrlPathfindingDirtyTooltip">Objects that move may not behave correctly in this region until the region is rebaked.</string>
+ <string name="LocationCtrlPathfindingDisabledTooltip">Dynamic pathfinding is not enabled on this region.</string>
<!-- Strings used by the (currently Linux) auto-updater app -->
<string name="UpdaterWindowTitle">
[APP_NAME] Update
@@ -3751,6 +3888,13 @@ Try enclosing path to the editor with double quotes.
<string name="Preview">Preview</string>
<string name="Normal">Normal</string>
+ <!-- Pathfinding -->
+ <string name="Pathfinding_Wiki_URL">http://wiki.secondlife.com/wiki/Pathfinding_Tools_in_the_Second_Life_Viewer</string>
+ <string name="Pathfinding_Object_Attr_None">None</string>
+ <string name="Pathfinding_Object_Attr_Permanent">Affects navmesh</string>
+ <string name="Pathfinding_Object_Attr_Character">Character</string>
+ <string name="Pathfinding_Object_Attr_MultiSelect">(Multiple)</string>
+
<!-- Snapshot image quality levels -->
<string name="snapshot_quality_very_low">Very Low</string>
<string name="snapshot_quality_low">Low</string>
@@ -3758,4 +3902,9 @@ Try enclosing path to the editor with double quotes.
<string name="snapshot_quality_high">High</string>
<string name="snapshot_quality_very_high">Very High</string>
+ <string name="TeleportMaturityExceeded">The Resident cannot visit this region.</string>
+
+ <!-- Spell check settings floater -->
+ <string name="UserDictionary">[User]</string>
+
</strings>
diff --git a/indra/newview/skins/default/xui/en/teleport_strings.xml b/indra/newview/skins/default/xui/en/teleport_strings.xml
index dce6b8dd6d..fdf41991cd 100644
--- a/indra/newview/skins/default/xui/en/teleport_strings.xml
+++ b/indra/newview/skins/default/xui/en/teleport_strings.xml
@@ -45,6 +45,9 @@ Go to &apos;Welcome Island Public&apos; to repeat the tutorial.
<message name="no_inventory_host">
The inventory system is currently unavailable.
</message>
+ <message name="MustGetAgeRegion">
+ You must be age 18 or over to enter this region.
+ </message>
</message_set>
<message_set name="progress">
<message name="sending_dest">
@@ -80,5 +83,8 @@ Go to &apos;Welcome Island Public&apos; to repeat the tutorial.
<message name="requesting">
Requesting Teleport...
</message>
- </message_set>
+ <message name="pending">
+ Pending Teleport...
+ </message>
+ </message_set>
</teleport_messages>
diff --git a/indra/newview/skins/default/xui/en/widgets/location_input.xml b/indra/newview/skins/default/xui/en/widgets/location_input.xml
index 44436fb6f2..61ec046649 100644
--- a/indra/newview/skins/default/xui/en/widgets/location_input.xml
+++ b/indra/newview/skins/default/xui/en/widgets/location_input.xml
@@ -112,6 +112,22 @@
follows="right|top"
image_name="Parcel_Health_Dark"
/>
+ <pathfinding_dirty_icon
+ name="pathfinding_dirty_icon"
+ width="22"
+ height="18"
+ top="21"
+ follows="right|top"
+ image_name="Pathfinding_Dirty"
+ />
+ <pathfinding_disabled_icon
+ name="pathfinding_disabled_icon"
+ width="22"
+ height="18"
+ top="21"
+ follows="right|top"
+ image_name="Pathfinding_Disabled"
+ />
<!-- Default text color is invisible on top of nav bar background -->
<damage_text
name="damage_text"
diff --git a/indra/newview/skins/default/xui/es/floater_hardware_settings.xml b/indra/newview/skins/default/xui/es/floater_hardware_settings.xml
index b96076836b..c351db5eae 100644
--- a/indra/newview/skins/default/xui/es/floater_hardware_settings.xml
+++ b/indra/newview/skins/default/xui/es/floater_hardware_settings.xml
@@ -25,6 +25,10 @@
Activar VBO:
</text>
<check_box initial_value="true" label="Activar OpenGL Vertex Buffer Objects" name="vbo" tool_tip="En hardware moderno, habilitar esta opción mejora el rendimiento. Pero en hardware antiguo, el habilitarlo hace que, frecuentemente, se obtenga una implementación pobre de VBO, lo que puede provocarle caídas."/>
+ <text name="tc label">
+ Activar S3TC:
+ </text>
+ <check_box initial_value="verdadero" label="Activar la compresión de texturas (requiere reiniciar)" name="texture compression" tool_tip="Comprime las texturas de la memoria de vídeo, lo cual permite cargar texturas de una resolución más alta, pero con una cierta pérdida de calidad del color."/>
<slider label="Memoria para texturas (MB):" name="GraphicsCardTextureMemory" tool_tip="Cantidad de memoria asignada a las texturas. Por defecto es la memoria de la tarjeta de vídeo. Reducir esta cantidad puede mejorar el rendimiento, pero también hacer que las texturas se vean borrosas."/>
<spinner label="Intensidad de la niebla:" name="fog"/>
<button label="OK" label_selected="OK" name="OK"/>
diff --git a/indra/newview/skins/default/xui/es/floater_model_wizard.xml b/indra/newview/skins/default/xui/es/floater_model_wizard.xml
deleted file mode 100644
index 5bd6b5e0e5..0000000000
--- a/indra/newview/skins/default/xui/es/floater_model_wizard.xml
+++ /dev/null
@@ -1,208 +0,0 @@
-<?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="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="choose_file_header_panel">
- <text name="choose_file_header_text">
- Elige el archivo de modelo
- </text>
- </panel>
- <panel name="choose_file_content">
- <text name="advanced_users_text">
- Usuarios avanzados: si tienes experiencia con las herramientas de creación de contenidos 3D, quizá te interese utilizar la función de subida avanzada.
- </text>
- <button label="Cambiar al modo Avanzado" name="switch_to_advanced"/>
- <text name="Cache location">
- Elige el archivo de modelo que deseas subir
- </text>
- <button label="Examinar..." label_selected="Examinar..." name="browse"/>
- <text name="Model types">
- ‎Second Life admite los archivos COLLADA (.dae)
- </text>
- <text name="dimensions">
- X Y Z
- </text>
- <text name="warning_label">
- ATENCIÓN:
- </text>
- <text name="warning_text">
- No podrás completar el paso final de la subida de este modelo a los servidores de Second Life. [secondlife:///app/floater/learn_more Averigua cómo] configurar tu cuenta para subir modelos de malla.
- </text>
- </panel>
- </panel>
- <panel name="optimize_panel">
- <panel name="optimize_header_panel">
- <text name="optimize_header_text">
- Optimizar el modelo
- </text>
- </panel>
- <text name="optimize_description">
- Hemos optimizado el rendimiento del modelo, pero puedes ajustarlo más si lo deseas.
- </text>
- <panel name="optimize_content">
- <text name="high_detail_text">
- Generar el nivel de detalle: Alto
- </text>
- <text name="medium_detail_text">
- Generar el nivel de detalle: Medio
- </text>
- <text name="low_detail_text">
- Generar el nivel de detalle: Bajo
- </text>
- <text name="lowest_detail_text">
- Generar el nivel de detalle: Mínimo
- </text>
- </panel>
- <panel name="content2">
- <button label="Recalcular la geometría" name="recalculate_geometry_btn"/>
- <text name="lod_label">
- Vista previa de geometría
- </text>
- <combo_box name="preview_lod_combo" tool_tip="LOD para ver en renderizado de prueba">
- <combo_item name="high">
- Detalle alto
- </combo_item>
- <combo_item name="medium">
- Detalles medios
- </combo_item>
- <combo_item name="low">
- Detalle bajo
- </combo_item>
- <combo_item name="lowest">
- Detalles mínimos
- </combo_item>
- </combo_box>
- </panel>
- </panel>
- <panel name="physics_panel">
- <panel name="physics_header_panel">
- <text name="physics_header_text">
- Ajustar la física
- </text>
- </panel>
- <text name="physics_description">
- Crearemos una forma para la apariencia exterior del modelo. Ajusta el nivel de detalle de la forma según se necesite para el propósito proyectado del modelo.
- </text>
- <panel name="physics_content">
- <button label="Recalcular física" name="recalculate_physics_btn"/>
- <button label="Recalculando..." name="recalculating_physics_btn"/>
- <text name="lod_label">
- Prueba de física
- </text>
- <combo_box name="preview_lod_combo2" tool_tip="LOD para ver en renderizado de prueba">
- <combo_item name="high">
- Detalle alto
- </combo_item>
- <combo_item name="medium">
- Detalles medios
- </combo_item>
- <combo_item name="low">
- Detalle bajo
- </combo_item>
- <combo_item name="lowest">
- Detalles mínimos
- </combo_item>
- </combo_box>
- </panel>
- </panel>
- <panel name="review_panel">
- <panel name="review_header_panel">
- <text name="review_header_text">
- Revisar
- </text>
- </panel>
- <panel name="review_content">
- <text name="review_prim_equiv">
- Impacto en la parcela/región: [EQUIV] equivalentes en prim
- </text>
- <text name="review_fee">
- Cargaremos en tu cuenta el precio de subida de L$ [FEE].
- </text>
- <text name="review_confirmation">
- Al pulsar en el botón de subida, confirmas que posees los derechos necesarios sobre el material que contiene el modelo.
- </text>
- </panel>
- </panel>
- <panel name="upload_panel">
- <panel name="upload_header_panel">
- <text name="upload_header_text">
- Subida finalizada
- </text>
- </panel>
- <text name="model_uploaded_text">
- Se ha subido tu modelo.
- </text>
- <text name="inventory_text">
- Puedes buscar la carpeta Objetos en tu inventario.
- </text>
- <text name="charged_fee">
- Se han cargado [FEE] L$ en tu cuenta.
- </text>
- </panel>
- <button label="&lt;&lt; Atrás" name="back"/>
- <button label="Siguiente &gt;&gt;" name="next"/>
- <button label="Calcular pesos y precio &gt;&gt;" name="calculate"/>
- <button label="Calculando..." name="calculating"/>
- <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_parse_error">
- Problema de análisis de DAE - consulta los datos en el registro.
- </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="bad_element">
- Error: el elemento no es válido
- </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_stats.xml b/indra/newview/skins/default/xui/es/floater_stats.xml
index ba4af2e866..d53ae88126 100644
--- a/indra/newview/skins/default/xui/es/floater_stats.xml
+++ b/indra/newview/skins/default/xui/es/floater_stats.xml
@@ -14,8 +14,11 @@
<stat_bar label="KTris generados por segundo" name="ktrissec"/>
<stat_bar label="Objetos en total" name="objs"/>
<stat_bar label="Objetos nuevos" name="newobjs"/>
+ <stat_bar label="Ãndice de aciertos de caché de objetos" name="object_cache_hits"/>
</stat_view>
<stat_view label="Textura" name="texture">
+ <stat_bar label="Ãndice de aciertos de caché" name="texture_cache_hits"/>
+ <stat_bar label="Latencia de lectura de caché" name="texture_cache_read_latency"/>
<stat_bar label="Número" name="numimagesstat"/>
<stat_bar label="Raw: número" name="numrawimagesstat"/>
<stat_bar label="GL Mem" name="gltexmemstat"/>
diff --git a/indra/newview/skins/default/xui/es/floater_texture_ctrl.xml b/indra/newview/skins/default/xui/es/floater_texture_ctrl.xml
index ed2787ea60..1e566e3e31 100644
--- a/indra/newview/skins/default/xui/es/floater_texture_ctrl.xml
+++ b/indra/newview/skins/default/xui/es/floater_texture_ctrl.xml
@@ -1,24 +1,35 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="texture picker" title="DESTACADO: TEXTURA">
- <string name="choose_picture">
+ <floater.string name="choose_picture">
Pulse para elegir una imagen
- </string>
+ </floater.string>
+ <floater.string name="pick title">
+ Elegir:
+ </floater.string>
<text name="Multiple">
Texturas múltiples
</text>
+ <radio_group name="mode_selection">
+ <radio_item label="Inventario" name="inventory" value="0"/>
+ <radio_item label="Local" name="local" value="1"/>
+ </radio_group>
<text name="unknown">
Tamaño: [DIMENSIONS]
</text>
<button label="Por defecto" label_selected="Por defecto" name="Default" width="84"/>
- <button label="Ninguna" label_selected="Ninguna" left="90" name="None"/>
<button label="Blanca" label_selected="Blanca" name="Blank"/>
- <check_box label="Ver las carpetas" name="show_folders_check"/>
- <search_editor label="Filtrar las texturas" name="inventory search editor"/>
- <check_box label="Aplicarlo ahora" name="apply_immediate_check"/>
+ <button label="Ninguna" label_selected="Ninguna" left="90" name="None"/>
<button label="" label_selected="" name="Pipette"/>
- <button label="Cancelar" label_selected="Cancelar" name="Cancel"/>
+ <filter_editor label="Filtrar las texturas" name="inventory search editor"/>
+ <check_box initial_value="false" label="Ver las carpetas" name="show_folders_check"/>
+ <button label="Añadir" label_selected="Añadir" name="l_add_btn"/>
+ <button label="Eliminar" label_selected="Eliminar" name="l_rem_btn"/>
+ <button label="Subir" label_selected="Subir" name="l_upl_btn"/>
+ <scroll_list name="l_name_list">
+ <column label="Nombre" name="unit_name"/>
+ <column label="ID" name="unit_id_HIDDEN"/>
+ </scroll_list>
<button label="OK" label_selected="OK" name="Select"/>
- <string name="pick title">
- Elegir:
- </string>
+ <button label="Cancelar" label_selected="Cancelar" name="Cancel"/>
+ <check_box initial_value="true" label="Aplicarlo ahora" name="apply_immediate_check"/>
</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_texture_fetch_debugger.xml b/indra/newview/skins/default/xui/es/floater_texture_fetch_debugger.xml
new file mode 100644
index 0000000000..29fd2ab2a3
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/floater_texture_fetch_debugger.xml
@@ -0,0 +1,62 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="TexFetchDebugger" title="Depurador de obtención de texturas">
+ <text name="total_num_fetched_label">
+ 1, Número total de texturas obtenidas: [NUM]
+ </text>
+ <text name="total_num_fetching_requests_label">
+ 2, Número total de solicitudes de obtención: [NUM]
+ </text>
+ <text name="total_num_cache_hits_label">
+ 3, Número total de aciertos de caché: [NUM]
+ </text>
+ <text name="total_num_visible_tex_label">
+ 4, Número total de texturas visibles: [NUM]
+ </text>
+ <text name="total_num_visible_tex_fetch_req_label">
+ 5, Número total de solicitudes de obtención de texturas visibles: [NUM]
+ </text>
+ <text name="total_fetched_data_label">
+ 6, Número total de datos obtenidos: [SIZE1] KB, Datos descodificados: [SIZE2] KB, [PIXEL] MPíxeles
+ </text>
+ <text name="total_fetched_vis_data_label">
+ 7, Número total de datos visibles: [SIZE1] KB, Datos descodificados: [SIZE2] KB
+ </text>
+ <text name="total_fetched_rendered_data_label">
+ 8, Número total de datos representados: [SIZE1] KB, Datos descodificados: [SIZE2] KB, [PIXEL] MPíxeles
+ </text>
+ <text name="total_time_cache_read_label">
+ 9, Tiempo total en lecturas de caché: [TIME] segundos
+ </text>
+ <text name="total_time_cache_write_label">
+ 10, Tiempo total en escrituras de caché: [TIME] segundos
+ </text>
+ <text name="total_time_decode_label">
+ 11, Tiempo total en descodificaciones: [TIME] segundos
+ </text>
+ <text name="total_time_gl_label">
+ 12, Tiempo total en la creación de texturas gl: [TIME] segundos
+ </text>
+ <text name="total_time_http_label">
+ 13, Tiempo total en obtención de HTTP: [TIME] segundos
+ </text>
+ <text name="total_time_fetch_label">
+ 14, Tiempo total en obtención completa: [TIME] segundos
+ </text>
+ <text name="total_time_refetch_vis_cache_label">
+ 15, Volviendo a obtener visibles de la caché, Tiempo: [TIME] segundos, Obtenidos: [SIZE] KB, [PIXEL] MPíxeles
+ </text>
+ <text name="total_time_refetch_vis_http_label">
+ 16, Volviendo a obtener visibles de HTTP, Tiempo: [TIME] segundos, Obtenidos: [SIZE] KB, [PIXEL] MPíxeles
+ </text>
+ <spinner label="17, Proporción de texeles/píxeles:" name="texel_pixel_ratio"/>
+ <button label="Iniciar" name="start_btn"/>
+ <button label="Restablecer" name="clear_btn"/>
+ <button label="Cerrar" name="close_btn"/>
+ <button label="Lectura de caché" name="cacheread_btn"/>
+ <button label="Escritura de caché" name="cachewrite_btn"/>
+ <button label="HTTP" name="http_btn"/>
+ <button label="Descodificar" name="decode_btn"/>
+ <button label="Textura GL" name="gl_btn"/>
+ <button label="Volver a obtener caché de vis." name="refetchviscache_btn"/>
+ <button label="Volver a obtener HTTP de vis." name="refetchvishttp_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_window_size.xml b/indra/newview/skins/default/xui/es/floater_window_size.xml
index f57ce08eac..6c1ad02319 100644
--- a/indra/newview/skins/default/xui/es/floater_window_size.xml
+++ b/indra/newview/skins/default/xui/es/floater_window_size.xml
@@ -7,10 +7,17 @@
Definir el tamaño de la ventana:
</text>
<combo_box name="window_size_combo" tool_tip="ancho x alto">
- <combo_box.item label="1000 x 700 (por defecto)" name="item0"/>
- <combo_box.item label="1024 x 768" name="item1"/>
- <combo_box.item label="1280 x 720 (720 p)" name="item2"/>
- <combo_box.item label="1920 x 1080 (1080 p)" name="item3"/>
+ <combo_box.item label="1000 x 700 (por defecto)" name="item1"/>
+ <combo_box.item label="1024 x 768 (4:3 XGA)" name="item2"/>
+ <combo_box.item label="1280 x 720 (16:9 HDTV)" name="item3"/>
+ <combo_box.item label="1280 x 800 (5:8 WXGA)" name="item4"/>
+ <combo_box.item label="1280 x 1024 (5:4 SXGA)" name="item5"/>
+ <combo_box.item label="1440 x 900 (8:5 WSXGA)" name="item7"/>
+ <combo_box.item label="1600 x 900 (16:9 HD+)" name="item8"/>
+ <combo_box.item label="1600 x 1200 (4:3 UXGA)" name="item9"/>
+ <combo_box.item label="1680 x 1050 (8:5 WSXGA+)" name="item10"/>
+ <combo_box.item label="1920 x 1080 (16:9 HDTV)" name="item11"/>
+ <combo_box.item label="1920 x 1200 (8:5 WUXGA)" name="item12"/>
</combo_box>
<button label="Configurar" name="set_btn"/>
<button label="Cancelar" name="cancel_btn"/>
diff --git a/indra/newview/skins/default/xui/es/menu_viewer.xml b/indra/newview/skins/default/xui/es/menu_viewer.xml
index 9522d4eac6..740bd35cbb 100644
--- a/indra/newview/skins/default/xui/es/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/es/menu_viewer.xml
@@ -225,11 +225,10 @@
<menu_item_check label="Texture Console" name="Texture Console"/>
<menu_item_check label="Debug Console" name="Debug Console"/>
<menu_item_call label="Notifications Console" name="Notifications"/>
- <menu_item_check label="Texture Size Console" 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="Memory" name="Memory"/>
<menu_item_check label="Datos de la escena" name="Scene Statistics"/>
+ <menu_item_call label="Consola de depuración de obtención de texturas" name="Texture Fetch Debug Console"/>
<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"/>
@@ -270,6 +269,12 @@
<menu_item_check label="Complejidad del renderizado" name="rendercomplexity"/>
<menu_item_check label="Bytes de adjunto" name="attachment bytes"/>
<menu_item_check label="Esculpir" name="Sculpt"/>
+ <menu label="Densidad de textura" name="Texture Density">
+ <menu_item_check label="Ninguna" name="None"/>
+ <menu_item_check label="Actual" name="Current"/>
+ <menu_item_check label="Deseada" name="Desired"/>
+ <menu_item_check label="Completa" name="Full"/>
+ </menu>
</menu>
<menu label="Rendering" name="Rendering">
<menu_item_check label="Axes" name="Axes"/>
diff --git a/indra/newview/skins/default/xui/es/notifications.xml b/indra/newview/skins/default/xui/es/notifications.xml
index d47c3d7ad8..b298f6d050 100644
--- a/indra/newview/skins/default/xui/es/notifications.xml
+++ b/indra/newview/skins/default/xui/es/notifications.xml
@@ -357,7 +357,7 @@ Tienes que volver a introducir el nombre de usuario de tu avatar.
Necesitas una cuenta para acceder a [SECOND_LIFE]. ¿Te gustaría crear una ahora?
<url name="url">
- https://join.secondlife.com/index.php?lang=es-ES
+ [create_account_url]
</url>
<usetemplate name="okcancelbuttons" notext="Volver a intentarlo" yestext="Crear una cuenta nueva"/>
</notification>
@@ -490,6 +490,15 @@ El objeto debe de haber sido borrado o estar fuera de rango (&apos;out of range&
</url>
<usetemplate ignoretext="El hardware de mi ordenador no está admitido" name="okcancelignore" notext="No" yestext="Sí"/>
</notification>
+ <notification name="IntelOldDriver">
+ Probablemente ya existe un controlador más reciente para tu procesador de gráficos. La actualización del controlador de gráficos puede mejorar sustancialmente el rendimiento.
+
+ ¿Deseas visitar [_URL] para comprobar si hay controladores actualizados?
+ <url name="url">
+ http://www.intel.com/p/es_XL/support/detect/graphics
+ </url>
+ <usetemplate ignoretext="Mi controlador de gráficos no está actualizado" name="okcancelignore" notext="No" yestext="Sí"/>
+ </notification>
<notification name="UnknownGPU">
Tu sistema usa una tarjeta gráfica que [APP_NAME] no reconoce.
Suele suceder con hardware nuevo que todavía no ha sido probado con [APP_NAME]. Probablemente todo irá bien, pero deberás ajustar tus configuraciones gráficas.
@@ -1171,7 +1180,6 @@ Puedes usar [SECOND_LIFE] de forma normal; los demás residentes te verán corre
Se ha completado la instalación de [SECOND_LIFE].
Si es la primera vez que usas [SECOND_LIFE], debes crear una cuenta antes de poder iniciar una sesión.
-¿Volver a [http://join.secondlife.com secondlife.com] para crear una cuenta nueva?
<usetemplate name="okcancelbuttons" notext="Continuar" yestext="Cuenta nueva..."/>
</notification>
<notification name="LoginPacketNeverReceived">
@@ -2622,33 +2630,23 @@ Del objeto: &lt;nolink&gt;[OBJECTNAME]&lt;/nolink&gt;, propietario: [NAME]?
</form>
</notification>
<notification name="ScriptQuestionCaution">
- Un objeto de nombre &apos;&lt;nolink&gt;[OBJECTNAME]&lt;/nolink&gt;&apos;, propiedad de &apos;[NAME]&apos;, quiere:
-
-[QUESTIONS]
-Si no confias en este objeto y en su creador, deberías rehusar esta petición.
-
-¿Autorizar esta petición?
+ Atención: El objeto &apos;&lt;nolink&gt;[OBJECTNAME]&lt;/nolink&gt;&apos; solicita un acceso total a tu cuenta de dólares Linden. Si le autorizas el acceso, podrá retirar fondos de tu cuenta en cualquier momento o vaciarla por completo, de manera permanente y sin más advertencias.
+
+Estas solicitudes pocas veces son legítimas. No autorices el acceso si no conoces la razón exacta por la que desea el acceso a tu cuenta.
<form name="form">
- <button name="Grant" text="Autorizar"/>
+ <button name="Grant" text="Permitir acceso total"/>
<button name="Deny" text="Denegar"/>
- <button name="Details" text="Detalles..."/>
</form>
</notification>
<notification name="ScriptDialog">
&apos;&lt;nolink&gt;[TITLE]&lt;/nolink&gt;&apos; de [NAME]
[MESSAGE]
- <form name="form">
- <button name="Mute" text="Ignorar"/>
- <button name="Ignore" text="Ignorar"/>
- </form>
+ <form name="form"/>
</notification>
<notification name="ScriptDialogGroup">
&apos;&lt;nolink&gt;[TITLE]&lt;/nolink&gt;&apos; de [GROUPNAME]
[MESSAGE]
- <form name="form">
- <button name="Mute" text="Ignorar"/>
- <button name="Ignore" text="Ignorar"/>
- </form>
+ <form name="form"/>
</notification>
<notification name="BuyLindenDollarSuccess">
¡Gracias por tu pago!
@@ -3126,4 +3124,16 @@ También puedes buscar en el Mapa lugares marcados como &quot;Puntos de Informac
<global name="You died and have been teleported to your home location">
Has muerto y te has teleportado a tu Base.
</global>
+ <notification name="LocalBitmapsUpdateFileNotFound">
+ [FNAME] no se ha podido actualizar porque el archivo ya no se encuentra.
+Desactivando futuras actualizaciones de este archivo.
+ </notification>
+ <notification name="LocalBitmapsUpdateFailedFinal">
+ [FNAME] se ha intentado abrir o descodificar durante [NRETRIES] intentos sin éxito, y ahora se considera roto.
+Desactivando futuras actualizaciones de este archivo.
+ </notification>
+ <notification name="LocalBitmapsVerifyFail">
+ Se ha intentado añadir un archivo de imagen [FNAME] no válido o ilegible, que no se puede abrir ni descodificar.
+Intento cancelado.
+ </notification>
</notifications>
diff --git a/indra/newview/skins/default/xui/es/panel_login.xml b/indra/newview/skins/default/xui/es/panel_login.xml
index 0e94cbe70b..683e0a096a 100644
--- a/indra/newview/skins/default/xui/es/panel_login.xml
+++ b/indra/newview/skins/default/xui/es/panel_login.xml
@@ -1,13 +1,13 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="panel_login">
- <panel.string name="create_account_url">
- http://join.secondlife.com/index.php?lang=es-ES
- </panel.string>
<panel.string name="forgot_password_url">
http://secondlife.com/account/request.php?lang=es
</panel.string>
<layout_stack name="login_widgets">
<layout_panel name="login">
+ <text name="log_in_text">
+ INICIAR SESIÓN
+ </text>
<text name="username_text">
Nombre de usuario:
</text>
@@ -15,15 +15,8 @@
<text name="password_text">
Contraseña:
</text>
- <check_box label="Recordar la contraseña" name="remember_check"/>
- <button label="Iniciar sesión" name="connect_btn"/>
- <text name="mode_selection_text">
- Modo:
- </text>
- <combo_box name="mode_combo" tool_tip="Selecciona el modo. Elige Básico para una exploración rápida y fácil y para chatear. Elige Avanzado para tener acceso a más funciones.">
- <combo_box.item label="Básico" name="Basic"/>
- <combo_box.item label="Avanzado" name="Advanced"/>
- </combo_box>
+ </layout_panel>
+ <layout_panel name="start_location_panel">
<text name="start_location_text">
Empezar en:
</text>
@@ -33,16 +26,21 @@
<combo_box.item label="&lt;Escribe en qué región&gt;" name="Typeregionname"/>
</combo_box>
</layout_panel>
- <layout_panel name="links">
- <text name="create_new_account_text">
- Registrarme
+ <layout_panel name="links_login_panel">
+ <text name="login_help">
+ ¿Necesitas ayuda para conectarte?
</text>
<text name="forgot_password_text">
¿Olvidaste el nombre de usuario o la contraseña?
</text>
- <text name="login_help">
- ¿Necesitas ayuda para conectarte?
+ <button label="Iniciar sesión" name="connect_btn"/>
+ <check_box label="Recordar la contraseña" name="remember_check"/>
+ </layout_panel>
+ <layout_panel name="links">
+ <text name="create_account_text">
+ CREATE YǾUR ACCǾUNT
</text>
+ <button name="create_new_account_btn" label="Registrarme"/>
</layout_panel>
</layout_stack>
</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_script_question_toast.xml b/indra/newview/skins/default/xui/es/panel_script_question_toast.xml
new file mode 100644
index 0000000000..a2d0237da0
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/panel_script_question_toast.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<panel label="script_question_panel" name="panel_script_question_toast">
+ <panel label="buttons_panel" name="buttons_panel"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_volume_pulldown.xml b/indra/newview/skins/default/xui/es/panel_volume_pulldown.xml
new file mode 100644
index 0000000000..9193da6cde
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/panel_volume_pulldown.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<panel name="volumepulldown_floater" width="215">
+ <slider label="Maestro" name="System Volume" label_width="55" width="155"/>
+ <slider label="Botones" name="UI Volume" label_width="55" width="155"/>
+ <slider label="Ambiente" name="Wind Volume" label_width="55" width="155"/>
+ <slider label="Sonidos" name="SFX Volume" label_width="55" width="155"/>
+ <check_box name="gesture_audio_play_btn" tool_tip="Activa el sonido de los gestos"/>
+ <slider label="Música" name="Music Volume" label_width="55" width="155"/>
+ <check_box tool_tip="Activa el flujo de audio" name="enable_music"/>
+ <slider label="Medios" name="Media Volume" label_width="55" width="155"/>
+ <check_box tool_tip="Activa el flujo de medios" name="enable_media"/>
+ <slider label="Voz" name="Voice Volume" label_width="55" width="155"/>
+ <check_box tool_tip="Activar chat de voz" name="enable_voice_check"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/es/strings.xml b/indra/newview/skins/default/xui/es/strings.xml
index 67c65c6ce9..adc32ba168 100644
--- a/indra/newview/skins/default/xui/es/strings.xml
+++ b/indra/newview/skins/default/xui/es/strings.xml
@@ -871,6 +871,9 @@ Intenta iniciar sesión de nuevo en unos instantes.
<string name="ScriptQuestionCautionChatDenied">
A &apos;[OBJECTNAME]&apos;, un objeto propiedad de &apos;[OWNERNAME]&apos;, localizado en [REGIONNAME] con la posición [REGIONPOS], se le ha denegado el permiso para: [PERMISSIONS].
</string>
+ <string name="AdditionalPermissionsRequestHeader">
+ Si autorizas el acceso a tu cuenta, también permitirás al objeto:
+ </string>
<string name="ScriptTakeMoney">
Cogerle a usted dólares Linden (L$)
</string>
@@ -904,6 +907,9 @@ Intenta iniciar sesión de nuevo en unos instantes.
<string name="ControlYourCamera">
Controlar su cámara
</string>
+ <string name="TeleportYourAgent">
+ Teleportarte
+ </string>
<string name="SIM_ACCESS_PG">
General
</string>
diff --git a/indra/newview/skins/default/xui/fr/floater_about_land.xml b/indra/newview/skins/default/xui/fr/floater_about_land.xml
index 49af1a87e1..c86f31b429 100644
--- a/indra/newview/skins/default/xui/fr/floater_about_land.xml
+++ b/indra/newview/skins/default/xui/fr/floater_about_land.xml
@@ -134,7 +134,7 @@
<text name="DwellText">
Chargement...
</text>
- <button label="Acheter du terrain" label_selected="Acheter le terrain..." left_delta="60" name="Buy Land..." width="125"/>
+ <button label="Acheter le terrain" label_selected="Acheter le terrain..." left_delta="60" name="Buy Land..." width="125"/>
<button label="Vente Linden" label_selected="Vente Linden..." name="Linden Sale..." tool_tip="Le terrain doit être la propriété d&apos;un résident, avoir un contenu défini et ne pas être aux enchères."/>
<button label="Infos sur les scripts" name="Scripts..." width="110"/>
<button label="Acheter pour le groupe" label_selected="Acheter pour le groupe..." name="Buy For Group..."/>
@@ -377,7 +377,7 @@ Seules les parcelles de grande taille peuvent apparaître dans la recherche.
</text>
<texture_picker label="" name="snapshot_ctrl" tool_tip="Cliquez pour sélectionner une image"/>
<text name="allow_label5">
- Les avatars présents sur d&apos;autres parcelles peuvent voir et chatter avec les avatars présents sur cette parcelle.
+ Les avatars sur d&apos;autres parcelles peuvent voir et chatter avec les avatars sur cette parcelle.
</text>
<check_box label="Voir les avatars" name="SeeAvatarsCheck" tool_tip="Permettre aux avatars présents sur d&apos;autres parcelles de voir et chatter avec les avatars présents sur cette parcelle et à vous de les voir et de chatter avec eux."/>
<text name="landing_point">
diff --git a/indra/newview/skins/default/xui/fr/floater_camera.xml b/indra/newview/skins/default/xui/fr/floater_camera.xml
index f2b0ee8af3..893e389f69 100644
--- a/indra/newview/skins/default/xui/fr/floater_camera.xml
+++ b/indra/newview/skins/default/xui/fr/floater_camera.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="camera_floater" title="PARAMÈTRES DE LA CAMÉRA">
+<floater name="camera_floater" title="CONTRÔLE DE LA CAMÉRA">
<floater.string name="rotate_tooltip">
Faire tourner la caméra autour du point central
</floater.string>
diff --git a/indra/newview/skins/default/xui/fr/floater_edit_day_cycle.xml b/indra/newview/skins/default/xui/fr/floater_edit_day_cycle.xml
index 0100419bc5..de1ba220a0 100644
--- a/indra/newview/skins/default/xui/fr/floater_edit_day_cycle.xml
+++ b/indra/newview/skins/default/xui/fr/floater_edit_day_cycle.xml
@@ -22,13 +22,13 @@
Remarque : si vous changez votre préréglage de nom, un nouveau préréglage sera créé et celui existant restera tel quel.
</text>
<text name="hint_item1">
- - Cliquez sur un repère pour modifier le réglage du ciel et l&apos;heure associés.
+ - Modifier un réglage de ciel et d&apos;heure : clic sur le repère
</text>
<text name="hint_item2">
- - Cliquez sur les repères et faites-les glisser afin de définir les heures de transition.
+ - Définir les heures de transition : clic et glissement des repères
</text>
<text name="hint_item3">
- - Déplacez le marqueur en forme de triangle pour afficher un aperçu du cycle du jour.
+ - Afficher un aperçu du cycle du jour : déplacer le triangle
</text>
<panel name="day_cycle_slider_panel">
<multi_slider initial_value="0" name="WLTimeSlider"/>
@@ -91,11 +91,11 @@
</text>
</panel>
<text name="WLCurKeyPresetText">
- Réglage du ciel :
+ Régl. ciel :
</text>
<combo_box label="Préréglage" name="WLSkyPresets"/>
<text name="WLCurKeyTimeText">
- Heure :
+ H. :
</text>
<time name="time" value="6h"/>
<check_box label="Appliquer ce nouveau cycle du jour" name="make_default_cb"/>
diff --git a/indra/newview/skins/default/xui/fr/floater_environment_settings.xml b/indra/newview/skins/default/xui/fr/floater_environment_settings.xml
index 9ea47a3dd7..ea12749d27 100644
--- a/indra/newview/skins/default/xui/fr/floater_environment_settings.xml
+++ b/indra/newview/skins/default/xui/fr/floater_environment_settings.xml
@@ -18,7 +18,7 @@
<combo_box.item label="-Effectuer une sélection-" name="item0"/>
</combo_box>
<text name="sky_dayc_settings_title">
- Ciel / Cycle du jour
+ Ciel/Cycle du jour
</text>
<radio_group name="sky_dayc_settings_radio_group">
<radio_item label="Ciel fixe" name="my_sky_settings"/>
diff --git a/indra/newview/skins/default/xui/fr/floater_god_tools.xml b/indra/newview/skins/default/xui/fr/floater_god_tools.xml
index e4c53d866c..0d21a8af32 100644
--- a/indra/newview/skins/default/xui/fr/floater_god_tools.xml
+++ b/indra/newview/skins/default/xui/fr/floater_god_tools.xml
@@ -71,8 +71,8 @@
<button label="Supprimer tous les objets scriptés de la cible sur les terrains des autres" label_selected="Supprimer tous les objets scriptés de la cible sur les terrains des autres" name="Delete Target&apos;s Scripted Objects On Others Land" tool_tip="Supprimer tous les objets scriptés appartenant à la cible sur les terrains ne lui appartenant pas. Les objets non copiables seront renvoyés."/>
<button label="Supprimer les objets scriptés de la cible sur *tous* les terrains" label_selected="Supprimer les objets scriptés de la cible sur *tous* les terrains" name="Delete Target&apos;s Scripted Objects On *Any* Land" tool_tip="Supprimer les objets scriptés appartenant à la cible dans cette région. Les objets non copiables seront renvoyés."/>
<button label="Supprimer *tous* les objets de la cible" label_selected="Supprimer *tous* les objets de la cible" name="Delete *ALL* Of Target&apos;s Objects" tool_tip="Supprimer tous les objets appartenant à la cible dans cette région. Les objets non copiables seront renvoyés."/>
- <button label="Afficher les collisions les plus consommatrices" label_selected="Afficher les collisions les plus consommatrices" name="Get Top Colliders" tool_tip="Dresse une liste des objets avec les callbacks les plus fréquents. " width="300"/>
- <button label="Afficher les objets scriptés les plus consommateurs" label_selected="Afficher les objets scriptés les plus consommateurs" name="Get Top Scripts" tool_tip="Dresse une liste des objets qui passent le plus de temps à exécuter des scripts." width="300"/>
+ <button label="Collisions les plus consommatrices" label_selected="Collisions les plus consommatrices" name="Get Top Colliders" tool_tip="Liste des objets avec les callbacks les plus fréquents. " width="300"/>
+ <button label="Scripts les plus consommateurs" label_selected="Scripts les plus consommateurs" name="Get Top Scripts" tool_tip="Liste des objets passant le plus de temps à exécuter des scripts." width="300"/>
<button label="Résumé des scripts" label_selected="Résumé des scripts" name="Scripts digest" tool_tip="Dresse une liste des scripts et de leurs occurrences." width="300"/>
</panel>
<panel label="Requête" name="request">
diff --git a/indra/newview/skins/default/xui/fr/floater_hardware_settings.xml b/indra/newview/skins/default/xui/fr/floater_hardware_settings.xml
index 2bc76e0c63..098f8fc713 100644
--- a/indra/newview/skins/default/xui/fr/floater_hardware_settings.xml
+++ b/indra/newview/skins/default/xui/fr/floater_hardware_settings.xml
@@ -25,6 +25,10 @@
Activer le VBO :
</text>
<check_box initial_value="true" label="Activer OpenGL Vertex Buffer Objects" name="vbo" tool_tip="Sur un matériel moderne, cette option permet une meilleure performance. Par contre, sur un matériel plus ancien, les VBO sont souvent mal implémentés et peuvent causer des crashs lorsqu&apos;ils sont activés."/>
+ <text name="tc label">
+ Activer S3TC :
+ </text>
+ <check_box initial_value="vraie" label="Activer la compression des textures (redémarrage requis)" name="texture compression" tool_tip="Comprime les textures en mémoire vidéo afin de permettre de charger des textures de résolution plus élevée au prix d&apos;une certaine qualité de couleur."/>
<slider label="Mémoire textures (Mo) :" name="GraphicsCardTextureMemory" tool_tip="Quantité de mémoire à affecter aux textures. Utilise la mémoire de la carte vidéo par défaut. Si vous réduisez ce paramètre, cela peut améliorer les performances, mais les textures risquent d&apos;être floues."/>
<spinner label="Indice du brouillard :" name="fog"/>
<button label="OK" label_selected="OK" name="OK"/>
diff --git a/indra/newview/skins/default/xui/fr/floater_land_holdings.xml b/indra/newview/skins/default/xui/fr/floater_land_holdings.xml
index 10fe132623..ff728e3aaa 100644
--- a/indra/newview/skins/default/xui/fr/floater_land_holdings.xml
+++ b/indra/newview/skins/default/xui/fr/floater_land_holdings.xml
@@ -7,7 +7,7 @@
<column label="Surface" name="area"/>
<column label="" name="hidden"/>
</scroll_list>
- <button label="Téléporter" label_selected="Téléporter" name="Teleport" tool_tip="Téléportez-vous au milieu de ce terrain."/>
+ <button label="Téléportation" label_selected="Téléportation" name="Teleport" tool_tip="Téléportez-vous au milieu de ce terrain."/>
<button label="Carte" label_selected="Carte" name="Show on Map" tool_tip="Afficher ce terrain sur la carte du monde"/>
<text name="contrib_label">
Vos contributions :
diff --git a/indra/newview/skins/default/xui/fr/floater_model_preview.xml b/indra/newview/skins/default/xui/fr/floater_model_preview.xml
index a3b50351ae..0f272891c7 100644
--- a/indra/newview/skins/default/xui/fr/floater_model_preview.xml
+++ b/indra/newview/skins/default/xui/fr/floater_model_preview.xml
@@ -214,7 +214,7 @@
</panel>
</tab_container>
<panel name="weights_and_warning_panel">
- <button label="Calculer les poids et les frais." name="calculate_btn" tool_tip="Calculer les poids et les frais."/>
+ <button label="Calculer les poids et les frais" name="calculate_btn" tool_tip="Calculer les poids et les frais."/>
<button label="Annuler" name="cancel_btn"/>
<button label="Charger le modèle" name="ok_btn" tool_tip="Charger dans le simulateur"/>
<button label="Effacer les paramètres et réinitialiser le formulaire" name="reset_btn"/>
diff --git a/indra/newview/skins/default/xui/fr/floater_model_wizard.xml b/indra/newview/skins/default/xui/fr/floater_model_wizard.xml
deleted file mode 100644
index 128b9d6fa4..0000000000
--- a/indra/newview/skins/default/xui/fr/floater_model_wizard.xml
+++ /dev/null
@@ -1,208 +0,0 @@
-<?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="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="choose_file_header_panel">
- <text name="choose_file_header_text">
- Choisir un fichier de modèle
- </text>
- </panel>
- <panel name="choose_file_content">
- <text name="advanced_users_text">
- Utilisateurs expérimentés : si vous êtes habitué à utiliser des outils de création de contenu en 3D, l&apos;outil de chargement avancé est mis à votre disposition.
- </text>
- <button label="Passer à Avancé" name="switch_to_advanced"/>
- <text name="Cache location">
- Choisir un fichier de modèle à charger
- </text>
- <button label="Parcourir..." label_selected="Parcourir..." name="browse"/>
- <text name="Model types">
- Second Life prend en charge les fichiers COLLADA (.dae).
- </text>
- <text name="dimensions">
- X Y Z
- </text>
- <text name="warning_label">
- AVERTISSEMENT :
- </text>
- <text name="warning_text">
- Vous ne pourrez pas effectuer l&apos;étape de chargement finale du modèle sur les serveurs Second Life. [secondlife:///app/floater/learn_more Découvrez comment] configurer votre compte pour le chargement de modèles de maillage.
- </text>
- </panel>
- </panel>
- <panel name="optimize_panel">
- <panel name="optimize_header_panel">
- <text name="optimize_header_text">
- Optimiser le modèle
- </text>
- </panel>
- <text name="optimize_description">
- Le modèle a été optimisé en termes de performances. Vous pouvez l&apos;ajuster si vous le souhaitez.
- </text>
- <panel name="optimize_content">
- <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">
- <button label="Recalcul géométrique" name="recalculate_geometry_btn"/>
- <text name="lod_label">
- Aperçu de la géométrie
- </text>
- <combo_box name="preview_lod_combo" tool_tip="Niveau de détail à afficher en rendu d&apos;aperçu.">
- <combo_item name="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>
- </panel>
- <panel name="physics_panel">
- <panel name="physics_header_panel">
- <text name="physics_header_text">
- Ajuster les propriétés physiques
- </text>
- </panel>
- <text name="physics_description">
- Une forme va être créée pour l&apos;enveloppe externe du modèle. Ajustez le niveau de détail de la forme en fonction de l&apos;objectif souhaité pour votre modèle.
- </text>
- <panel name="physics_content">
- <button label="Recalcul physique" name="recalculate_physics_btn"/>
- <button label="Recalcul en cours..." name="recalculating_physics_btn"/>
- <text name="lod_label">
- Aperçu des propriétés physiques
- </text>
- <combo_box name="preview_lod_combo2" tool_tip="Niveau de détail à afficher en rendu d&apos;aperçu.">
- <combo_item name="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>
- </panel>
- <panel name="review_panel">
- <panel name="review_header_panel">
- <text name="review_header_text">
- Vérification
- </text>
- </panel>
- <panel name="review_content">
- <text name="review_prim_equiv">
- Impact sur la parcelle/région : équivalent à [EQUIV] prims
- </text>
- <text name="review_fee">
- Votre compte sera débité de [FEE] L$ de frais de chargement.
- </text>
- <text name="review_confirmation">
- En cliquant sur le bouton de chargement, vous confirmez que vous disposez des droits appropriés sur le contenu du modèle.
- </text>
- </panel>
- </panel>
- <panel name="upload_panel">
- <panel name="upload_header_panel">
- <text name="upload_header_text">
- Chargement terminé
- </text>
- </panel>
- <text name="model_uploaded_text">
- Votre modèle a été chargé.
- </text>
- <text name="inventory_text">
- Vous le trouverez dans le dossier Objets de votre inventaire.
- </text>
- <text name="charged_fee">
- Votre compte a été débité de [FEE] L$.
- </text>
- </panel>
- <button label="&lt;&lt; Préc." name="back"/>
- <button label="Suiv. &gt;&gt;" name="next"/>
- <button label="Calculer les poids et les frais &gt;&gt;" name="calculate"/>
- <button label="Calcul en cours..." name="calculating"/>
- <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_parse_error">
- Problème d&apos;analyse de fichier .dae ; reportez-vous au journal pour plus de détails.
- </string>
- <string name="status_reading_file">
- Chargement...
- </string>
- <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="bad_element">
- Erreur : élément non valide
- </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_preview_animation.xml b/indra/newview/skins/default/xui/fr/floater_preview_animation.xml
index f2cb1d5e70..6488089c06 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="Exécuter dans Second Life" label_selected="Arrêter" name="Inworld" tool_tip="Lire cette animation de façon à ce que les autres la voient."/>
+ <button label="Exécuter dans SL" label_selected="Arrêter" name="Inworld" tool_tip="Lire cette animation de façon à ce que les autres la voient dans Second Life."/>
<button label="Exécuter localement" label_selected="Arrêter" name="Locally" tool_tip="Lire cette animation de façon à ce que vous soyez la seule personne à la voir."/>
</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_stats.xml b/indra/newview/skins/default/xui/fr/floater_stats.xml
index 2ce2e6dcd5..56fa062d46 100644
--- a/indra/newview/skins/default/xui/fr/floater_stats.xml
+++ b/indra/newview/skins/default/xui/fr/floater_stats.xml
@@ -14,8 +14,11 @@
<stat_bar label="KTris par s" name="ktrissec"/>
<stat_bar label="Objets totaux" name="objs"/>
<stat_bar label="Nouveaux objets" name="newobjs"/>
+ <stat_bar label="Taux de réussite du cache des objets" name="object_cache_hits"/>
</stat_view>
<stat_view label="Texture" name="texture">
+ <stat_bar label="Taux de réussite du cache" name="texture_cache_hits"/>
+ <stat_bar label="Latence de lecture du cache" name="texture_cache_read_latency"/>
<stat_bar label="Nombre" name="numimagesstat"/>
<stat_bar label="Nombre brut" name="numrawimagesstat"/>
<stat_bar label="Mém GL" name="gltexmemstat"/>
@@ -57,7 +60,7 @@
<stat_bar label="Chargements en attente" name="simpendinguploads"/>
<stat_bar label="Total Unacked Bytes" name="simtotalunackedbytes"/>
<stat_view label="Temps (ms)" name="simperf">
- <stat_bar label="Durée totale de l'image" name="simframemsec"/>
+ <stat_bar label="Durée totale de l&apos;image" name="simframemsec"/>
<stat_bar label="Durée nette" name="simnetmsec"/>
<stat_bar label="Durée sim (physique)" name="simsimphysicsmsec"/>
<stat_bar label="Durée sim (autre)" name="simsimothermsec"/>
diff --git a/indra/newview/skins/default/xui/fr/floater_texture_ctrl.xml b/indra/newview/skins/default/xui/fr/floater_texture_ctrl.xml
index 381bcceb00..ca0fbd3589 100644
--- a/indra/newview/skins/default/xui/fr/floater_texture_ctrl.xml
+++ b/indra/newview/skins/default/xui/fr/floater_texture_ctrl.xml
@@ -1,24 +1,35 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="texture picker" title="CHOISIR : TEXTURE">
- <string name="choose_picture">
+ <floater.string name="choose_picture">
Cliquez pour sélectionner une image
- </string>
+ </floater.string>
+ <floater.string name="pick title">
+ Choisir :
+ </floater.string>
<text name="Multiple">
Textures multiples
</text>
+ <radio_group name="mode_selection">
+ <radio_item label="Inventaire" name="inventory" value="0"/>
+ <radio_item label="Local" name="local" value="1"/>
+ </radio_group>
<text name="unknown">
Taille : [DIMENSIONS]
</text>
<button label="Défaut" label_selected="Défaut" name="Default" width="60"/>
- <button label="Aucune" label_selected="Aucune" left="68" name="None" width="60"/>
<button label="Vierge" label_selected="Vierge" name="Blank" width="60"/>
- <check_box label="Afficher les dossiers" name="show_folders_check"/>
- <search_editor label="Filtrer les textures" name="inventory search editor"/>
- <check_box label="Appliquer maintenant" name="apply_immediate_check"/>
+ <button label="Aucune" label_selected="Aucune" left="68" name="None" width="60"/>
<button bottom="-240" label="" label_selected="" name="Pipette"/>
- <button label="Annuler" label_selected="Annuler" name="Cancel"/>
+ <filter_editor label="Filtrer les textures" name="inventory search editor"/>
+ <check_box initial_value="false" label="Afficher les dossiers" name="show_folders_check"/>
+ <button label="Ajouter" label_selected="Ajouter" name="l_add_btn"/>
+ <button label="Supprimer" label_selected="Supprimer" name="l_rem_btn"/>
+ <button label="Charger" label_selected="Charger" name="l_upl_btn"/>
+ <scroll_list name="l_name_list">
+ <column label="Nom" name="unit_name"/>
+ <column label="ID" name="unit_id_HIDDEN"/>
+ </scroll_list>
<button label="OK" label_selected="OK" name="Select"/>
- <string name="pick title">
- Choisir :
- </string>
+ <button label="Annuler" label_selected="Annuler" name="Cancel"/>
+ <check_box initial_value="true" label="Appliquer maintenant" name="apply_immediate_check"/>
</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_texture_fetch_debugger.xml b/indra/newview/skins/default/xui/fr/floater_texture_fetch_debugger.xml
new file mode 100644
index 0000000000..f0cc95319d
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/floater_texture_fetch_debugger.xml
@@ -0,0 +1,62 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="TexFetchDebugger" title="Outil de débogage de la récupération des textures">
+ <text name="total_num_fetched_label">
+ 1, nombre total de textures récupérées : [NUM]
+ </text>
+ <text name="total_num_fetching_requests_label">
+ 2, nombre total de demandes de récupération : [NUM]
+ </text>
+ <text name="total_num_cache_hits_label">
+ 3, nombre total de présences dans le cache : [NUM]
+ </text>
+ <text name="total_num_visible_tex_label">
+ 4, nombre total de textures visibles : [NUM]
+ </text>
+ <text name="total_num_visible_tex_fetch_req_label">
+ 5, nombre total de demandes de récupération de textures visibles : [NUM]
+ </text>
+ <text name="total_fetched_data_label">
+ 6, nombre total de données récupérées : [SIZE1] Ko, données décodées : [SIZE2] Ko, [PIXEL] Mpixels
+ </text>
+ <text name="total_fetched_vis_data_label">
+ 7, nombre total de données visibles : [SIZE1] Ko, données décodées : [SIZE2] Ko
+ </text>
+ <text name="total_fetched_rendered_data_label">
+ 8, nombre total de données rendues : [SIZE1] Ko, données décodées : [SIZE2] Ko, [PIXEL] Mpixels
+ </text>
+ <text name="total_time_cache_read_label">
+ 9, durée totale des lectures du cache : [TIME] secondes
+ </text>
+ <text name="total_time_cache_write_label">
+ 10, durée totale des écritures du cache : [TIME] secondes
+ </text>
+ <text name="total_time_decode_label">
+ 11, durée totale des décodages : [TIME] secondes
+ </text>
+ <text name="total_time_gl_label">
+ 12, durée totale de la création de textures GL : [TIME] secondes
+ </text>
+ <text name="total_time_http_label">
+ 13, durée totale de la récupération HTTP : [TIME] secondes
+ </text>
+ <text name="total_time_fetch_label">
+ 14, durée totale de la récupération intégrale : [TIME] secondes
+ </text>
+ <text name="total_time_refetch_vis_cache_label">
+ 15, nouvelle récupération des données visibles du cache, Durée : [TIME] secondes, Récupéré : [SIZE] Ko, [PIXEL] Mpixels
+ </text>
+ <text name="total_time_refetch_vis_http_label">
+ 16, nouvelle récupération des données visibles de la requête HTTP, Durée : [TIME] secondes, Récupéré : [SIZE] Ko, [PIXEL] Mpixels
+ </text>
+ <spinner label="17, taux de texels/pixels :" name="texel_pixel_ratio"/>
+ <button label="Démarrer" name="start_btn"/>
+ <button label="Réinitialiser" name="clear_btn"/>
+ <button label="Fermer" name="close_btn"/>
+ <button label="Lecture du cache" name="cacheread_btn"/>
+ <button label="Écriture du cache" name="cachewrite_btn"/>
+ <button label="HTTP" name="http_btn"/>
+ <button label="Décoder" name="decode_btn"/>
+ <button label="Texture GL" name="gl_btn"/>
+ <button label="Récupérer à nouveau les données visibles du cache" name="refetchviscache_btn"/>
+ <button label="Récupérer à nouveau les données visibles de la requête HTTP" name="refetchvishttp_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_tools.xml b/indra/newview/skins/default/xui/fr/floater_tools.xml
index e21c6f4c08..9643c51fb3 100644
--- a/indra/newview/skins/default/xui/fr/floater_tools.xml
+++ b/indra/newview/skins/default/xui/fr/floater_tools.xml
@@ -99,7 +99,7 @@
<button label="" label_selected="" name="ToolRing" tool_tip="Anneau"/>
<button label="" label_selected="" name="ToolTree" tool_tip="Arbre"/>
<button label="" label_selected="" name="ToolGrass" tool_tip="Herbe"/>
- <check_box label="Maintenir l&apos;outil sélectionné" name="checkbox sticky"/>
+ <check_box label="Maintenir l&apos;outil sélect." name="checkbox sticky"/>
<check_box label="Copier la sélection" name="checkbox copy selection"/>
<check_box initial_value="true" label="Centrer" name="checkbox copy centers"/>
<check_box label="Pivoter" name="checkbox copy rotates"/>
diff --git a/indra/newview/skins/default/xui/fr/floater_top_objects.xml b/indra/newview/skins/default/xui/fr/floater_top_objects.xml
index 42352e7c1e..b40d585310 100644
--- a/indra/newview/skins/default/xui/fr/floater_top_objects.xml
+++ b/indra/newview/skins/default/xui/fr/floater_top_objects.xml
@@ -1,16 +1,16 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="top_objects" title="Objets les plus utilisés">
<floater.string name="top_scripts_title">
- Scripts principaux
+ Scripts les plus consommateurs
</floater.string>
<floater.string name="top_scripts_text">
[COUNT] scripts prenant un total de [TIME] ms
</floater.string>
<floater.string name="scripts_score_label">
- Heure
+ Temps
</floater.string>
<floater.string name="scripts_mono_time_label">
- Heure Mono
+ Temps Mono
</floater.string>
<floater.string name="top_colliders_title">
Collisions les plus consommatrices
@@ -32,8 +32,8 @@
<scroll_list.columns label="Nom" name="name"/>
<scroll_list.columns label="Propriétaire" name="owner"/>
<scroll_list.columns label="Lieu" name="location"/>
- <scroll_list.columns label="Heure" name="time"/>
- <scroll_list.columns label="Heure Mono" name="mono_time"/>
+ <scroll_list.columns label="Temps" name="time"/>
+ <scroll_list.columns label="Temps Mono" name="mono_time"/>
<scroll_list.columns label="URL" name="URLs"/>
</scroll_list>
<text name="id_text">
@@ -43,7 +43,7 @@
<text name="obj_name_text">
Nom :
</text>
- <button label="Filtre" name="filter_object_btn"/>
+ <button label="Filtrer" name="filter_object_btn"/>
<text name="owner_name_text">
Propriétaire :
</text>
diff --git a/indra/newview/skins/default/xui/fr/floater_window_size.xml b/indra/newview/skins/default/xui/fr/floater_window_size.xml
index cbda4390d8..11c2e439bd 100644
--- a/indra/newview/skins/default/xui/fr/floater_window_size.xml
+++ b/indra/newview/skins/default/xui/fr/floater_window_size.xml
@@ -7,10 +7,17 @@
Définir la taille de la fenêtre :
</text>
<combo_box name="window_size_combo" tool_tip="largeur x hauteur">
- <combo_box.item label="1 000 x 700 (défaut)" name="item0"/>
- <combo_box.item label="1 024 x 768" name="item1"/>
- <combo_box.item label="1 280 x 720 (720 p)" name="item2"/>
- <combo_box.item label="1 920 x 1 080 (1 080p)" name="item3"/>
+ <combo_box.item label="1000 x 700 (par défaut)" name="item1"/>
+ <combo_box.item label="1024 x 768 (4:3 XGA)" name="item2"/>
+ <combo_box.item label="1280 x 720 (16:9 HDTV)" name="item3"/>
+ <combo_box.item label="1280 x 800 (5:8 WXGA)" name="item4"/>
+ <combo_box.item label="1280 x 1024 (5:4 SXGA)" name="item5"/>
+ <combo_box.item label="1440 x 900 (8:5 WSXGA)" name="item7"/>
+ <combo_box.item label="1600 x 900 (16:9 HD+)" name="item8"/>
+ <combo_box.item label="1600 x 1200 (4:3 UXGA)" name="item9"/>
+ <combo_box.item label="1680 x 1050 (8:5 WSXGA+)" name="item10"/>
+ <combo_box.item label="1920 x 1080 (16:9 HDTV)" name="item11"/>
+ <combo_box.item label="1920 x 1200 (8:5 WUXGA)" name="item12"/>
</combo_box>
<button label="Choisir" name="set_btn"/>
<button label="Annuler" name="cancel_btn"/>
diff --git a/indra/newview/skins/default/xui/fr/menu_viewer.xml b/indra/newview/skins/default/xui/fr/menu_viewer.xml
index 3c3d4f5f69..346b6ec2c7 100644
--- a/indra/newview/skins/default/xui/fr/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/fr/menu_viewer.xml
@@ -8,7 +8,7 @@
<menu_item_call label="Nouvelle fenêtre d&apos;inventaire" name="NewInventoryWindow"/>
<menu_item_call label="Endroits..." name="Places"/>
<menu_item_call label="Favoris..." name="Picks"/>
- <menu_item_call label="Paramètres de la caméra..." name="Camera Controls"/>
+ <menu_item_call label="Caméra..." name="Camera Controls"/>
<menu label="Déplacement" name="Movement">
<menu_item_call label="M&apos;asseoir" name="Sit Down Here"/>
<menu_item_check label="Voler" name="Fly"/>
@@ -171,7 +171,7 @@
</menu>
<menu label="Surbrillance et visibilité" name="Highlighting and Visibility">
<menu_item_check label="Balise animée" name="Cheesy Beacon"/>
- <menu_item_check label="Cacher les particules" name="Hide Particles"/>
+ <menu_item_check label="Masquer les particules" name="Hide Particles"/>
<menu_item_check label="Masquer la sélection" name="Hide Selected"/>
<menu_item_check label="Mettre la transparence en surbrillance" name="Highlight Transparent"/>
<menu_item_check label="Afficher les éléments HUD" name="Show HUD Attachments"/>
@@ -227,11 +227,10 @@
<menu_item_check label="Console de textures" name="Texture Console"/>
<menu_item_check label="Console de débogage" name="Debug Console"/>
<menu_item_call label="Console de notifications" name="Notifications"/>
- <menu_item_check label="Console de tailles de textures" name="Texture Size"/>
- <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="Console de débogage de la récupération des textures" name="Texture Fetch Debug Console"/>
<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"/>
@@ -289,6 +288,12 @@
<menu_item_check label="Complexité du rendu" name="rendercomplexity"/>
<menu_item_check label="Octets d&apos;éléments attachés" name="attachment bytes"/>
<menu_item_check label="Sculpture" name="Sculpt"/>
+ <menu label="Densité des textures" name="Texture Density">
+ <menu_item_check label="Aucune" name="None"/>
+ <menu_item_check label="Actuelle" name="Current"/>
+ <menu_item_check label="Souhaitée" name="Desired"/>
+ <menu_item_check label="Complète" name="Full"/>
+ </menu>
</menu>
<menu label="Rendu" name="Rendering">
<menu_item_check label="Axes" name="Axes"/>
@@ -306,7 +311,6 @@
<menu_item_check label="Textures d&apos;animation" name="Animation Textures"/>
<menu_item_check label="Désactiver les textures" name="Disable Textures"/>
<menu_item_check label="Textures pleine résolution" name="Rull Res Textures"/>
- <menu_item_check label="Audit Textures" name="Audit Textures"/>
<menu_item_check label="Atlas des textures (expérimental)" name="Texture Atlas"/>
<menu_item_check label="Rendu des lumières jointes" name="Render Attached Lights"/>
<menu_item_check label="Rendu des particules jointes" name="Render Attached Particles"/>
diff --git a/indra/newview/skins/default/xui/fr/notifications.xml b/indra/newview/skins/default/xui/fr/notifications.xml
index 746a4b1d55..abd22e4c7b 100644
--- a/indra/newview/skins/default/xui/fr/notifications.xml
+++ b/indra/newview/skins/default/xui/fr/notifications.xml
@@ -359,7 +359,7 @@ Vous devez saisir le nom d&apos;utilisateur de votre avatar.
Pour entrer dans [SECOND_LIFE], vous devez disposer d&apos;un compte. Voulez-vous en créer un maintenant ?
<url name="url">
- https://join.secondlife.com/index.php?lang=fr-FR
+ [create_account_url]
</url>
<usetemplate name="okcancelbuttons" notext="Réessayer" yestext="Créer un compte"/>
</notification>
@@ -494,6 +494,15 @@ Consulter [_URL] pour en savoir plus ?
</url>
<usetemplate ignoretext="Mon matériel n&apos;est pas pris en charge" name="okcancelignore" notext="Non" yestext="Oui"/>
</notification>
+ <notification name="IntelOldDriver">
+ Il existe probablement un pilote plus récent pour votre puce graphique. La mise à jour des pilotes graphiques est susceptible d&apos;améliorer considérablement les performances.
+
+ Visiter la page [_URL] pour rechercher d&apos;éventuelles mises à jour de pilotes ?
+ <url name="url">
+ http://www.intel.com/p/fr_FR/support/detect/graphics
+ </url>
+ <usetemplate ignoretext="Mon pilote graphique est obsolète." name="okcancelignore" notext="Non" yestext="Oui"/>
+ </notification>
<notification name="UnknownGPU">
Votre système contient une carte graphique que [APP_NAME] ne reconnaît pas.
Cela est souvent le cas avec le nouveau matériel qui n&apos;a pas encore été testé avec [APP_NAME]. Cela ne posera probablement pas de problème, mais vous devrez peut-être ajuster vos paramètres graphiques.
@@ -1162,7 +1171,6 @@ Vous pouvez utiliser [SECOND_LIFE] normalement, les autres résidents vous voien
L&apos;installation de [APP_NAME] est terminée.
Si vous utilisez [SECOND_LIFE] pour la première fois, vous devez ouvrir un compte avant de pouvoir vous connecter.
-Retourner sur [http://join.secondlife.com secondlife.com] pour ouvrir un nouveau compte ?
<usetemplate name="okcancelbuttons" notext="Continuer" yestext="Nouveau compte..."/>
</notification>
<notification name="LoginPacketNeverReceived">
@@ -1305,7 +1313,7 @@ Dépasse la limite fixée à [MAX_AGENTS] [LIST_TYPE] de [NUM_EXCESS].
Veuillez choisir un objet à vendre et réessayer.
</notification>
<notification name="FinishedRawDownload">
- Chargement du fichier de terrain raw effectué vers :
+ Téléchargement du fichier de terrain raw effectué vers :
[DOWNLOAD_PATH].
</notification>
<notification name="DownloadWindowsMandatory">
@@ -2614,16 +2622,12 @@ Acceptez-vous ?
</form>
</notification>
<notification name="ScriptQuestionCaution">
- Un objet nommé &lt;nolink&gt;[OBJECTNAME]&lt;/nolink&gt;, appartenant à [NAME], aimerait :
-
-[QUESTIONS]
-Si vous n&apos;avez pas confiance en cet objet ni en son créateur, refusez cette requête.
-
-Accepter cette requête ?
+ Avertissement : l&apos;objet &lt;nolink&gt;[OBJECTNAME]&lt;/nolink&gt; souhaite un accès total à votre compte en Linden dollars. Si vous autorisez cet accès, il pourra supprimer des fonds de votre compte à tout moment ou le vider entièrement de façon continue sans avis préalable.
+
+Il est rare qu&apos;une telle demande soit légitime. N&apos;autorisez pas cet accès si vous ne comprenez pas entièrement pourquoi l&apos;objet souhaite accéder à votre compte.
<form name="form">
- <button name="Grant" text="Accepter"/>
+ <button name="Grant" text="Permettre un accès total"/>
<button name="Deny" text="Refuser"/>
- <button name="Details" text="Détails..."/>
</form>
</notification>
<notification name="ScriptDialog">
@@ -3122,4 +3126,15 @@ Sinon, consultez la carte et trouvez les &quot; infohubs &quot;.
<global name="You died and have been teleported to your home location">
Vous êtes mort et avez été téléporté à votre domicile.
</global>
+ <notification name="LocalBitmapsUpdateFileNotFound">
+ Impossible de mettre à jour [FNAME] car le fichier est introuvable.
+Désactivation des mises à jour futures de ce fichier...
+ </notification>
+ <notification name="LocalBitmapsUpdateFailedFinal">
+ [NRETRIES] tentatives d&apos;ouverture ou de décodage de [FNAME] ont échoué. Le fichier est désormais considéré comme endommagé.
+Désactivation des mises à jour futures de ce fichier...
+ </notification>
+ <notification name="LocalBitmapsVerifyFail">
+ Tentative d&apos;ajout d&apos;un fichier image [FNAME] non valide ou illisible n&apos;ayant pas pu être ouvert ou décodé. Tentative annulée.
+ </notification>
</notifications>
diff --git a/indra/newview/skins/default/xui/fr/panel_login.xml b/indra/newview/skins/default/xui/fr/panel_login.xml
index e54b36644c..7843513e00 100644
--- a/indra/newview/skins/default/xui/fr/panel_login.xml
+++ b/indra/newview/skins/default/xui/fr/panel_login.xml
@@ -1,13 +1,13 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="panel_login">
- <panel.string name="create_account_url">
- http://fr.secondlife.com/registration/
- </panel.string>
<panel.string name="forgot_password_url">
http://secondlife.com/account/request.php?lang=fr
</panel.string>
<layout_stack name="login_widgets">
<layout_panel name="login">
+ <text name="log_in_text">
+ CONNEXION
+ </text>
<text name="username_text">
Nom d&apos;utilisateur :
</text>
@@ -15,15 +15,8 @@
<text name="password_text">
Mot de passe :
</text>
- <check_box label="Enregistrer" name="remember_check"/>
- <button label="Connexion" name="connect_btn"/>
- <text name="mode_selection_text">
- Mode :
- </text>
- <combo_box name="mode_combo" tool_tip="Sélectionnez un mode. Pour une exploration facile et rapide avec chat, choisissez Basique. Pour accéder à plus de fonctionnalités, choisissez Avancé.">
- <combo_box.item label="Basique" name="Basic"/>
- <combo_box.item label="Avancé" name="Advanced"/>
- </combo_box>
+ </layout_panel>
+ <layout_panel name="start_location_panel">
<text name="start_location_text">
Lieu de départ :
</text>
@@ -33,16 +26,21 @@
<combo_box.item label="&lt;Saisir le nom de la région&gt;" name="Typeregionname"/>
</combo_box>
</layout_panel>
- <layout_panel name="links">
- <text name="create_new_account_text">
- S&apos;inscrire
+ <layout_panel name="links_login_panel">
+ <text name="login_help">
+ Besoin d&apos;aide ?
</text>
<text name="forgot_password_text">
Nom d&apos;utilisateur ou mot de passe oublié ?
</text>
- <text name="login_help">
- Besoin d&apos;aide ?
+ <button label="Connexion" name="connect_btn"/>
+ <check_box label="Enregistrer" name="remember_check"/>
+ </layout_panel>
+ <layout_panel name="links">
+ <text name="create_account_text">
+ CREATE YǾUR ACCǾUNT
</text>
+ <button name="create_new_account_btn" label="S&apos;inscrire"/>
</layout_panel>
</layout_stack>
</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_preferences_move.xml b/indra/newview/skins/default/xui/fr/panel_preferences_move.xml
index 94d7322b22..80aed90a2d 100644
--- a/indra/newview/skins/default/xui/fr/panel_preferences_move.xml
+++ b/indra/newview/skins/default/xui/fr/panel_preferences_move.xml
@@ -28,7 +28,7 @@
<combo_box.item label="Déplacement vers le clic" name="1"/>
</combo_box>
<text name="double_click_action_lbl">
- Double-clic sur le terrain :
+ Double clic sur le terrain :
</text>
<combo_box name="double_click_action_combo">
<combo_box.item label="Aucune action" name="0"/>
diff --git a/indra/newview/skins/default/xui/fr/panel_region_debug.xml b/indra/newview/skins/default/xui/fr/panel_region_debug.xml
index 733c3f9a22..6ea4b60072 100644
--- a/indra/newview/skins/default/xui/fr/panel_region_debug.xml
+++ b/indra/newview/skins/default/xui/fr/panel_region_debug.xml
@@ -30,9 +30,9 @@
<check_box label="Sur le terrain d&apos;un autre résident" name="return_other_land" tool_tip="Ne renvoyer que les objets se trouvant sur le terrain de quelqu&apos;un d&apos;autre"/>
<check_box label="Dans toutes les régions de ce domaine" name="return_estate_wide" tool_tip="Renvoyer les objets dans toutes les régions qui constituent ce domaine"/>
<button label="Renvoyer" name="return_btn"/>
- <button label="Afficher les collisions les plus consommatrices..." name="top_colliders_btn" tool_tip="Liste des objets avec le plus de collisions potentielles" width="320"/>
+ <button label="Collisions les plus consommatrices" name="top_colliders_btn" tool_tip="Liste des objets avec le plus de collisions potentielles" width="320"/>
<button label="?" left="337" name="top_colliders_help"/>
- <button label="Afficher les objets scriptés les plus consommateurs..." name="top_scripts_btn" tool_tip="Liste des objets qui passent le plus de temps à exécuter des scripts" width="320"/>
+ <button label="Scripts les plus consommateurs" name="top_scripts_btn" tool_tip="Liste des objets passant le plus de temps à exécuter des scripts" width="320"/>
<button label="?" left="337" name="top_scripts_help"/>
<button label="Redémarrer la région" name="restart_btn" tool_tip="Redémarrer la région au bout de 2 minutes" width="160"/>
<button label="?" left="177" name="restart_help"/>
diff --git a/indra/newview/skins/default/xui/fr/panel_region_environment.xml b/indra/newview/skins/default/xui/fr/panel_region_environment.xml
index d18503db86..085a308786 100644
--- a/indra/newview/skins/default/xui/fr/panel_region_environment.xml
+++ b/indra/newview/skins/default/xui/fr/panel_region_environment.xml
@@ -15,7 +15,7 @@
<combo_box.item label="-Effectuer une sélection-" name="item0"/>
</combo_box>
<text name="sky_dayc_settings_title">
- Ciel / Cycle du jour
+ Ciel/Cycle du jour
</text>
<radio_group name="sky_dayc_settings_radio_group">
<radio_item label="Ciel fixe" name="my_sky_settings"/>
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 b5795bebe2..234d316069 100644
--- a/indra/newview/skins/default/xui/fr/panel_region_general.xml
+++ b/indra/newview/skins/default/xui/fr/panel_region_general.xml
@@ -22,7 +22,7 @@
<check_box label="Interdire le vol" name="block_fly_check"/>
<check_box label="Autoriser les dégâts" name="allow_damage_check"/>
<check_box label="Interdire les bousculades" name="restrict_pushobject"/>
- <check_box label="Autoriser la revente" name="allow_land_resell_check"/>
+ <check_box label="Autoriser la revente de terrain" 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."/>
diff --git a/indra/newview/skins/default/xui/fr/panel_region_terrain.xml b/indra/newview/skins/default/xui/fr/panel_region_terrain.xml
index d7e321d06d..97f486d3a3 100644
--- a/indra/newview/skins/default/xui/fr/panel_region_terrain.xml
+++ b/indra/newview/skins/default/xui/fr/panel_region_terrain.xml
@@ -55,8 +55,8 @@ du terrain" name="terrain_lower_spin"/>
<spinner label="Bas" name="height_start_spin_2"/>
<spinner label="Haut" name="height_range_spin_0"/>
<spinner label="Haut" name="height_range_spin_2"/>
- <button label="Télécharger le terrain au format RAW..." name="download_raw_btn" tool_tip="Réservé aux propriétaires de domaine, pas aux gérants" width="230"/>
- <button label="Charger le terrain au format RAW..." name="upload_raw_btn" tool_tip="Réservé aux propriétaires de domaine, pas aux gérants" width="230"/>
+ <button label="Télécharger le terrain en RAW..." name="download_raw_btn" tool_tip="Réservé aux propriétaires de domaine, pas aux gérants" width="230"/>
+ <button label="Charger un terrain en RAW..." name="upload_raw_btn" tool_tip="Réservé aux propriétaires de domaine, pas aux gérants" width="230"/>
<button label="Figer le terrain" name="bake_terrain_btn" tool_tip="Définir le terrain actuel comme point central pour les limites d&apos;élévation/abaissement"/>
<button label="Appliquer" name="apply_btn"/>
</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_script_question_toast.xml b/indra/newview/skins/default/xui/fr/panel_script_question_toast.xml
new file mode 100644
index 0000000000..a2d0237da0
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/panel_script_question_toast.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<panel label="script_question_panel" name="panel_script_question_toast">
+ <panel label="buttons_panel" name="buttons_panel"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_snapshot_inventory.xml b/indra/newview/skins/default/xui/fr/panel_snapshot_inventory.xml
index 4454d2475e..f40bcec908 100644
--- a/indra/newview/skins/default/xui/fr/panel_snapshot_inventory.xml
+++ b/indra/newview/skins/default/xui/fr/panel_snapshot_inventory.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="panel_snapshot_inventory">
<text name="title">
- Enregistrer dans mon inventaire
+ Enregistrer dans l&apos;inventaire
</text>
<text name="hint_lbl">
L&apos;enregistrement d&apos;une image dans votre inventaire coûte [UPLOAD_COST] L$. Pour enregistrer votre image sous forme de texture, sélectionnez l&apos;un des formats carrés.
diff --git a/indra/newview/skins/default/xui/fr/panel_snapshot_local.xml b/indra/newview/skins/default/xui/fr/panel_snapshot_local.xml
index 41264521fd..48ccacb374 100644
--- a/indra/newview/skins/default/xui/fr/panel_snapshot_local.xml
+++ b/indra/newview/skins/default/xui/fr/panel_snapshot_local.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="panel_snapshot_local">
<text name="title">
- Enregistrer sur mon ordinateur
+ Enregistrer sur l&apos;ordinateur
</text>
<combo_box label="Résolution" name="local_size_combo">
<combo_box.item label="Fenêtre actuelle" name="CurrentWindow"/>
@@ -25,7 +25,7 @@
<combo_box.item label="JPEG" name="JPEG"/>
<combo_box.item label="BMP (sans perte)" name="BMP"/>
</combo_box>
- <slider label="Qualité de l&apos;image" name="image_quality_slider"/>
+ <slider label="Qualité d&apos;image" name="image_quality_slider"/>
<text name="image_quality_level">
([QLVL])
</text>
diff --git a/indra/newview/skins/default/xui/fr/panel_snapshot_options.xml b/indra/newview/skins/default/xui/fr/panel_snapshot_options.xml
index db3fcbeac9..befe1b3bc6 100644
--- a/indra/newview/skins/default/xui/fr/panel_snapshot_options.xml
+++ b/indra/newview/skins/default/xui/fr/panel_snapshot_options.xml
@@ -2,6 +2,6 @@
<panel name="panel_snapshot_options">
<button label="Publier sur le flux de mon profil" name="save_to_profile_btn"/>
<button label="Envoyer par e-mail" name="save_to_email_btn"/>
- <button label="Enregistrer dans mon inventaire ([AMOUNT] L$)" name="save_to_inventory_btn"/>
- <button label="Enregistrer sur mon ordinateur" name="save_to_computer_btn"/>
+ <button label="Enreg. dans l&apos;inventaire ([AMOUNT] L$)" name="save_to_inventory_btn"/>
+ <button label="Enreg. sur l&apos;ordinateur" name="save_to_computer_btn"/>
</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_snapshot_postcard.xml b/indra/newview/skins/default/xui/fr/panel_snapshot_postcard.xml
index bb23b52850..82a4815144 100644
--- a/indra/newview/skins/default/xui/fr/panel_snapshot_postcard.xml
+++ b/indra/newview/skins/default/xui/fr/panel_snapshot_postcard.xml
@@ -10,7 +10,7 @@
Envoi en cours...
</string>
<text name="title">
- Envoyer par e-mail
+ E-mail
</text>
<button label="Message" name="message_btn"/>
<button label="Paramètres" name="settings_btn"/>
diff --git a/indra/newview/skins/default/xui/fr/strings.xml b/indra/newview/skins/default/xui/fr/strings.xml
index 8b410128da..0987952c28 100644
--- a/indra/newview/skins/default/xui/fr/strings.xml
+++ b/indra/newview/skins/default/xui/fr/strings.xml
@@ -886,6 +886,9 @@ Veuillez réessayer de vous connecter dans une minute.
<string name="ScriptQuestionCautionChatDenied">
&apos;[OBJECTNAME]&apos;, un objet appartenant à [OWNERNAME], situé dans [REGIONNAME] à [REGIONPOS], n&apos;a pas reçu le droit de : [PERMISSIONS].
</string>
+ <string name="AdditionalPermissionsRequestHeader">
+ Si vous autorisez un accès à votre compte, vous autorisez également l&apos;objet à :
+ </string>
<string name="ScriptTakeMoney">
Débiter vos Linden dollars (L$)
</string>
@@ -919,6 +922,9 @@ Veuillez réessayer de vous connecter dans une minute.
<string name="ControlYourCamera">
Contrôler votre caméra
</string>
+ <string name="TeleportYourAgent">
+ Vous téléporter
+ </string>
<string name="NotConnected">
Pas connecté(e)
</string>
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 5d3ae04a4d..edbbc354cf 100644
--- a/indra/newview/skins/default/xui/it/floater_hardware_settings.xml
+++ b/indra/newview/skins/default/xui/it/floater_hardware_settings.xml
@@ -25,6 +25,10 @@
Attiva VBO:
</text>
<check_box initial_value="true" label="Attiva oggetti OpenGL Vertex Buffer" name="vbo" tool_tip="Attivandolo su un hardware moderno aumenta la performance. Ma, su un vecchio hardware, spesso l&apos;implementazione dei VBO è scarsa e potresti avere dei crash quando è attivato."/>
+ <text name="tc label">
+ Attiva S3TC:
+ </text>
+ <check_box initial_value="true" label="Attiva compressione texture (richiede riavvio)" name="texture compression" tool_tip="Comprime le texture nella memoria video, consentendo il caricamento di texture a risoluzione maggiore al prezzo di ua perdita di qualit&apos; del colore."/>
<slider label="Memoria texture (MB):" name="GraphicsCardTextureMemory" tool_tip="Spazio di memoria da ssegnare alle textures. Utilizza la memoria della scheda video come impostazione predefinita. La riduzione di questa impostazione potrebbe migliorare il rendimento ma potrebbe anche rendere le texture poco definite."/>
<spinner label="Indice della distanza della nebbia:" name="fog"/>
<button label="OK" label_selected="OK" name="OK"/>
diff --git a/indra/newview/skins/default/xui/it/floater_model_wizard.xml b/indra/newview/skins/default/xui/it/floater_model_wizard.xml
deleted file mode 100644
index ab5fdb29e4..0000000000
--- a/indra/newview/skins/default/xui/it/floater_model_wizard.xml
+++ /dev/null
@@ -1,208 +0,0 @@
-<?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="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="choose_file_header_panel">
- <text name="choose_file_header_text">
- Seleziona file modello
- </text>
- </panel>
- <panel name="choose_file_content">
- <text name="advanced_users_text">
- Utenti avanzati: Gli utenti che hanno dimestichezza con gli strumenti di creazione 3D possono usare le opzioni di caricamento avanzate.
- </text>
- <button label="Passa a modalità avanzata" name="switch_to_advanced"/>
- <text name="Cache location">
- Scegli il file del modello da caricare
- </text>
- <button label="Sfoglia..." label_selected="Sfoglia..." name="browse"/>
- <text name="Model types">
- Second Life supporta file COLLADA (.dae)
- </text>
- <text name="dimensions">
- X Y Z
- </text>
- <text name="warning_label">
- ATTENZIONE:
- </text>
- <text name="warning_text">
- Non sarà possibile completare il passaggio finale per il caricamento finale di questo modello sui server di Second Life. [secondlife:///app/floater/learn_more Scopri come] impostare l&apos;account per il caricamento di modelli con reticolo.
- </text>
- </panel>
- </panel>
- <panel name="optimize_panel">
- <panel name="optimize_header_panel">
- <text name="optimize_header_text">
- Ottimizza modello
- </text>
- </panel>
- <text name="optimize_description">
- Abbiamo ottimizzato il modello per migliorare le prestazioni. Se necessario, può essere regolato ulteriormente.
- </text>
- <panel name="optimize_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">
- <button label="Ricalcola geometria" name="recalculate_geometry_btn"/>
- <text name="lod_label">
- Anteprima geometria
- </text>
- <combo_box name="preview_lod_combo" tool_tip="Livello di dettaglio per anteprima rendering">
- <combo_item name="high">
- Molti dettagli
- </combo_item>
- <combo_item name="medium">
- Dettagli medi
- </combo_item>
- <combo_item name="low">
- Meno dettagli
- </combo_item>
- <combo_item name="lowest">
- Dettaglio minimo
- </combo_item>
- </combo_box>
- </panel>
- </panel>
- <panel name="physics_panel">
- <panel name="physics_header_panel">
- <text name="physics_header_text">
- Modifica fisica
- </text>
- </panel>
- <text name="physics_description">
- Verrà creata una forma per lo scafo esterno del modello. Regola il livello di dettaglio della forma in base al fine desiderato del modello.
- </text>
- <panel name="physics_content">
- <button label="Ricalcola fisica" name="recalculate_physics_btn"/>
- <button label="Ricalcolo in corso..." name="recalculating_physics_btn"/>
- <text name="lod_label">
- Anteprima fisica
- </text>
- <combo_box name="preview_lod_combo2" tool_tip="Livello di dettaglio per anteprima rendering">
- <combo_item name="high">
- Molti dettagli
- </combo_item>
- <combo_item name="medium">
- Dettagli medi
- </combo_item>
- <combo_item name="low">
- Meno dettagli
- </combo_item>
- <combo_item name="lowest">
- Dettaglio minimo
- </combo_item>
- </combo_box>
- </panel>
- </panel>
- <panel name="review_panel">
- <panel name="review_header_panel">
- <text name="review_header_text">
- Rivedi
- </text>
- </panel>
- <panel name="review_content">
- <text name="review_prim_equiv">
- Impatto sul lotto o sulla regione: [EQUIV] prim equivalenti
- </text>
- <text name="review_fee">
- All&apos;account verrà accreditata una tariffa di caricamento pari a L$ [FEE].
- </text>
- <text name="review_confirmation">
- Facendo clic sul pulsante Carica, confermi di possedere i diritti relativi ai materiali contenuti nel modello.
- </text>
- </panel>
- </panel>
- <panel name="upload_panel">
- <panel name="upload_header_panel">
- <text name="upload_header_text">
- Caricamento completato
- </text>
- </panel>
- <text name="model_uploaded_text">
- Il modello è stato caricato.
- </text>
- <text name="inventory_text">
- Puoi trovarlo nella cartella Oggetti nel tuo inventario.
- </text>
- <text name="charged_fee">
- La somma di L$ [FEE] è stata addebitata sul tuo account.
- </text>
- </panel>
- <button label="&lt;&lt; Indietro" name="back"/>
- <button label="Avanti &gt;&gt;" name="next"/>
- <button label="Calcolare pesi e tariffa &gt;&gt;" name="calculate"/>
- <button label="Calcolo in corso..." name="calculating"/>
- <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_parse_error">
- Problema nell&apos;elaborazione DAE - vedi il registro per informazioni al riguardo.
- </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="bad_element">
- Errore: elemento non valido
- </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_stats.xml b/indra/newview/skins/default/xui/it/floater_stats.xml
index ad6ef6b54b..2241cad711 100644
--- a/indra/newview/skins/default/xui/it/floater_stats.xml
+++ b/indra/newview/skins/default/xui/it/floater_stats.xml
@@ -14,8 +14,11 @@
<stat_bar label="KTris disegnato per secondo" name="ktrissec"/>
<stat_bar label="Totale oggetti" name="objs"/>
<stat_bar label="Nuovi oggetti" name="newobjs"/>
+ <stat_bar label="Hit rate della cache per l&apos;oggetto" name="object_cache_hits"/>
</stat_view>
<stat_view label="Texture" name="texture">
+ <stat_bar label="Hit rate della cache" name="texture_cache_hits"/>
+ <stat_bar label="Latenza di lettura della cache" name="texture_cache_read_latency"/>
<stat_bar label="Conteggio" name="numimagesstat"/>
<stat_bar label="Conteggio grezzo" name="numrawimagesstat"/>
<stat_bar label="Memoria GL" name="gltexmemstat"/>
diff --git a/indra/newview/skins/default/xui/it/floater_texture_ctrl.xml b/indra/newview/skins/default/xui/it/floater_texture_ctrl.xml
index 7b77584ba0..e85030087c 100644
--- a/indra/newview/skins/default/xui/it/floater_texture_ctrl.xml
+++ b/indra/newview/skins/default/xui/it/floater_texture_ctrl.xml
@@ -1,23 +1,34 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="texture picker" title="PREFERITO: TEXTURE">
- <string name="choose_picture">
+ <floater.string name="choose_picture">
Clicca per scegliere l&apos;immagine
- </string>
+ </floater.string>
+ <floater.string name="pick title">
+ Scegli:
+ </floater.string>
<text name="Multiple">
Texture multiple
</text>
+ <radio_group name="mode_selection">
+ <radio_item label="Inventario" name="inventory" value="0"/>
+ <radio_item label="Locale" name="local" value="1"/>
+ </radio_group>
<text name="unknown">
Dimensioni: [DIMENSIONS]
</text>
<button label="Default" label_selected="Default" name="Default"/>
- <button label="Niente" label_selected="Niente" name="None"/>
<button label="Vuoto" label_selected="Vuoto" name="Blank"/>
- <check_box label="Mostra cartelle" name="show_folders_check"/>
- <search_editor label="Filtro texture" name="inventory search editor"/>
- <check_box label="Applica adesso" name="apply_immediate_check"/>
- <button label="Annulla" label_selected="Annulla" name="Cancel"/>
+ <button label="Niente" label_selected="Niente" name="None"/>
+ <filter_editor label="Filtro texture" name="inventory search editor"/>
+ <check_box initial_value="false" label="Mostra cartelle" name="show_folders_check"/>
+ <button label="Aggiungi" label_selected="Aggiungi" name="l_add_btn"/>
+ <button label="Rimuovi" label_selected="Rimuovi" name="l_rem_btn"/>
+ <button label="Carica" label_selected="Carica" name="l_upl_btn"/>
+ <scroll_list name="l_name_list">
+ <column label="Nome" name="unit_name"/>
+ <column label="ID" name="unit_id_HIDDEN"/>
+ </scroll_list>
<button label="OK" label_selected="OK" name="Select"/>
- <string name="pick title">
- Scegli:
- </string>
+ <button label="Annulla" label_selected="Annulla" name="Cancel"/>
+ <check_box initial_value="true" label="Applica adesso" name="apply_immediate_check"/>
</floater>
diff --git a/indra/newview/skins/default/xui/it/floater_texture_fetch_debugger.xml b/indra/newview/skins/default/xui/it/floater_texture_fetch_debugger.xml
new file mode 100644
index 0000000000..57e65c3456
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/floater_texture_fetch_debugger.xml
@@ -0,0 +1,62 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="TexFetchDebugger" title="Debugger recupero texture">
+ <text name="total_num_fetched_label">
+ 1, Numero totale di texture recuperate: [NUM]
+ </text>
+ <text name="total_num_fetching_requests_label">
+ 2, Numero totale di richieste di recupero: [NUM]
+ </text>
+ <text name="total_num_cache_hits_label">
+ 3, Numero totale di recuperi dalla cache: [NUM]
+ </text>
+ <text name="total_num_visible_tex_label">
+ 4, Numero totale di texture visibili: [NUM]
+ </text>
+ <text name="total_num_visible_tex_fetch_req_label">
+ 5, Numero totale di richieste di fetching texture visibili: [NUM]
+ </text>
+ <text name="total_fetched_data_label">
+ 6, Numero totale di fetching dati: [SIZE1] KB, Dati decodificati: [SIZE2] KB, [PIXEL] MPixel
+ </text>
+ <text name="total_fetched_vis_data_label">
+ 7, Numero totale di dati visibili: [SIZE1] KB, Dati decodificati: [SIZE2] KB
+ </text>
+ <text name="total_fetched_rendered_data_label">
+ 8, Numero totale di rendering dei dati: [SIZE1] KB, Dati decodificati: [SIZE2] KB, [PIXEL] MPixel
+ </text>
+ <text name="total_time_cache_read_label">
+ 9, Tempo totale letture cache: [TIME] secondi
+ </text>
+ <text name="total_time_cache_write_label">
+ 10, Tempo totale scrittura cache: [TIME] secondi
+ </text>
+ <text name="total_time_decode_label">
+ 11, Tempo totale decodifica: [TIME] secondi
+ </text>
+ <text name="total_time_gl_label">
+ 12, Tempo totale creazione texture gl: [TIME] secondi
+ </text>
+ <text name="total_time_http_label">
+ 13, Tempo totale fetching HTTP: [TIME] secondi
+ </text>
+ <text name="total_time_fetch_label">
+ 14, Tempo totale complessivo fetching: [TIME] secondi
+ </text>
+ <text name="total_time_refetch_vis_cache_label">
+ 15, Nuovo fetching elementi visibili dalla cache, Tempo: [TIME] secondi, fetching: [SIZE] KB, [PIXEL] MPixels
+ </text>
+ <text name="total_time_refetch_vis_http_label">
+ 16, Nuovo fetching elementi visibili da HTTP, Tempo: [TIME] secondi, fetching: [SIZE] KB, [PIXEL] MPixels
+ </text>
+ <spinner label="17, Rapporto Texel/Pixel:" name="texel_pixel_ratio"/>
+ <button label="Attiva" name="start_btn"/>
+ <button label="Reimposta" name="clear_btn"/>
+ <button label="Chiudi" name="close_btn"/>
+ <button label="Lettura cache" name="cacheread_btn"/>
+ <button label="Scrittura cache" name="cachewrite_btn"/>
+ <button label="HTTP" name="http_btn"/>
+ <button label="Decodifica" name="decode_btn"/>
+ <button label="Texture GL" name="gl_btn"/>
+ <button label="Nuovo fetch visibili cache" name="refetchviscache_btn"/>
+ <button label="Nuovo fetch visibili HTTP" name="refetchvishttp_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/it/floater_window_size.xml b/indra/newview/skins/default/xui/it/floater_window_size.xml
index 036b74b7d9..fef423aefe 100644
--- a/indra/newview/skins/default/xui/it/floater_window_size.xml
+++ b/indra/newview/skins/default/xui/it/floater_window_size.xml
@@ -7,10 +7,17 @@
Imposta dimensione finestra:
</text>
<combo_box name="window_size_combo" tool_tip="larghezza x altezza">
- <combo_box.item label="1000 x 700 (default)" 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.item label="1000 x 700 (predefinito)" name="item1"/>
+ <combo_box.item label="1024 x 768 (4:3 XGA)" name="item2"/>
+ <combo_box.item label="1280 x 720 (16:9 HDTV)" name="item3"/>
+ <combo_box.item label="1280 x 800 (5:8 WXGA)" name="item4"/>
+ <combo_box.item label="1280 x 1024 (5:4 SXGA)" name="item5"/>
+ <combo_box.item label="1440 x 900 (8:5 WSXGA)" name="item7"/>
+ <combo_box.item label="1600 x 900 (16:9 HD+)" name="item8"/>
+ <combo_box.item label="1600 x 1200 (4:3 UXGA)" name="item9"/>
+ <combo_box.item label="1680 x 1050 (8:5 WSXGA+)" name="item10"/>
+ <combo_box.item label="1920 x 1080 (16:9 HDTV)" name="item11"/>
+ <combo_box.item label="1920 x 1200 (8:5 WUXGA)" name="item12"/>
</combo_box>
<button label="Imposta" name="set_btn"/>
<button label="Annulla" name="cancel_btn"/>
diff --git a/indra/newview/skins/default/xui/it/menu_viewer.xml b/indra/newview/skins/default/xui/it/menu_viewer.xml
index 99b7e3c4e6..f94b2f9a9e 100644
--- a/indra/newview/skins/default/xui/it/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/it/menu_viewer.xml
@@ -226,11 +226,10 @@
<menu_item_check label="Console texture" name="Texture Console"/>
<menu_item_check label="Console di Debug" name="Debug Console"/>
<menu_item_call label="Console notifiche" name="Notifications"/>
- <menu_item_check label="Console dimensioni texture" name="Texture Size"/>
- <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="Console di debug recupero texture" name="Texture Fetch Debug Console"/>
<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"/>
@@ -271,6 +270,12 @@
<menu_item_check label="Complessità rendering" name="rendercomplexity"/>
<menu_item_check label="Byte collegamento" name="attachment bytes"/>
<menu_item_check label="Scolpisci" name="Sculpt"/>
+ <menu label="Densità texture" name="Texture Density">
+ <menu_item_check label="Nessuna" name="None"/>
+ <menu_item_check label="Attuale" name="Current"/>
+ <menu_item_check label="Desiderata" name="Desired"/>
+ <menu_item_check label="Completa" name="Full"/>
+ </menu>
</menu>
<menu label="Rendering" name="Rendering">
<menu_item_check label="Assi" name="Axes"/>
diff --git a/indra/newview/skins/default/xui/it/notifications.xml b/indra/newview/skins/default/xui/it/notifications.xml
index 0e6fee60d1..78034d736f 100644
--- a/indra/newview/skins/default/xui/it/notifications.xml
+++ b/indra/newview/skins/default/xui/it/notifications.xml
@@ -360,7 +360,7 @@ 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
+ [create_account_url]
</url>
<usetemplate name="okcancelbuttons" notext="Riprova" yestext="Crea un nuovo account"/>
</notification>
@@ -492,6 +492,15 @@ Visitare [_URL] per ulteriori informazioni?
</url>
<usetemplate ignoretext="L&apos;hardware di questo computer non è compatibile" name="okcancelignore" notext="No" yestext="Si"/>
</notification>
+ <notification name="IntelOldDriver">
+ È probabile che ci sia un driver aggiornato per il processore grafico. L&apos;aggiornamento dei driver della grafica può migliorare le prestazioni in maniera significativa.
+
+ Visitare [_URL] per cercare un aggiornamento del driver?
+ <url name="url">
+ http://www.intel.com/p/it_IT/support/detect/graphics
+ </url>
+ <usetemplate ignoretext="Driver grafica obsoleto" name="okcancelignore" notext="No" yestext="Sì"/>
+ </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.
@@ -1167,7 +1176,6 @@ Puoi comunque usare [SECOND_LIFE] normalmente e gli altri residenti ti vedranno
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">
@@ -2616,16 +2624,12 @@ OK?
</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?
+ Attenzione: L&apos;oggetto &apos;&lt;nolink&gt;[OBJECTNAME]&lt;/nolink&gt;&apos; ha richiesto accesso completo al tuo account in Dollari Linden. Se consenti l&apos;accesso, potrà rimuovere fondi dal tuo account in qalunque momento e anche svuotare completamente l&apos;account, per un periodo illimitato e senza ulteriori avvisi.
+
+Raramente questo tipo di richiesta è legittima. Non consentire l&apos;accesso se non comprendi perfettamente il motivo per cui desidera accedere al tuo account.
<form name="form">
- <button name="Grant" text="Accetta"/>
+ <button name="Grant" text="Consenti accesso totale"/>
<button name="Deny" text="Nega"/>
- <button name="Details" text="Dettagli..."/>
</form>
</notification>
<notification name="ScriptDialog">
@@ -3124,4 +3128,16 @@ In alternativa, puoi guardare sulla mappa e trovare luoghi segnalati come &quot;
<global name="You died and have been teleported to your home location">
Sei deceduto e sei stato teleportato a casa tua.
</global>
+ <notification name="LocalBitmapsUpdateFileNotFound">
+ [FNAME] non è stato aggiornato perché il file non è stato più trovato.
+Gli aggiornamenti futuri per questo file sono disattivati.
+ </notification>
+ <notification name="LocalBitmapsUpdateFailedFinal">
+ [FNAME] non è stato aperto o decodificato dopo [NRETRIES] tentativi, viene considerato danneggiato.
+Gli aggiornamenti futuri per questo file sono disattivati.
+ </notification>
+ <notification name="LocalBitmapsVerifyFail">
+ Tentativo di aggiungere un file immagine [FNAME] non valido o non leggibile che non è stato possibile aprire o decodificare.
+Tentativo annullato.
+ </notification>
</notifications>
diff --git a/indra/newview/skins/default/xui/it/panel_login.xml b/indra/newview/skins/default/xui/it/panel_login.xml
index f88230ed11..02a3f8271c 100644
--- a/indra/newview/skins/default/xui/it/panel_login.xml
+++ b/indra/newview/skins/default/xui/it/panel_login.xml
@@ -1,13 +1,13 @@
<?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="log_in_text">
+ ACCEDI
+ </text>
<text name="username_text">
Nome utente:
</text>
@@ -15,15 +15,8 @@
<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>
+ </layout_panel>
+ <layout_panel name="start_location_panel">
<text name="start_location_text">
Inizia da:
</text>
@@ -33,16 +26,21 @@
<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
+ <layout_panel name="links_login_panel">
+ <text name="login_help">
+ Ti serve aiuto con la fase di accesso?
</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?
+ <button label="Accedi" name="connect_btn"/>
+ <check_box label="Ricorda password" name="remember_check"/>
+ </layout_panel>
+ <layout_panel name="links">
+ <text name="create_account_text">
+ CREATE YǾUR ACCǾUNT
</text>
+ <button name="create_new_account_btn" label="Iscriviti"/>
</layout_panel>
</layout_stack>
</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_script_question_toast.xml b/indra/newview/skins/default/xui/it/panel_script_question_toast.xml
new file mode 100644
index 0000000000..a2d0237da0
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/panel_script_question_toast.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<panel label="script_question_panel" name="panel_script_question_toast">
+ <panel label="buttons_panel" name="buttons_panel"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_volume_pulldown.xml b/indra/newview/skins/default/xui/it/panel_volume_pulldown.xml
new file mode 100644
index 0000000000..1792b09413
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/panel_volume_pulldown.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<panel name="volumepulldown_floater" width="220">
+ <button left="197" name="prefs_btn"/>
+ <slider label="Generale" name="System Volume" label_width="60" width="160"/>
+ <slider label="Interfaccia" name="UI Volume" label_width="60" width="160"/>
+ <slider label="Ambiente" name="Wind Volume" label_width="60" width="160"/>
+ <slider label="Suoni" name="SFX Volume" label_width="60" width="160"/>
+ <check_box name="gesture_audio_play_btn" tool_tip="Attiva suoni Gesture"/>
+ <slider label="Musica" name="Music Volume" label_width="60" width="160"/>
+ <check_box tool_tip="Abilita musica in streaming" name="enable_music"/>
+ <slider label="Media" name="Media Volume" label_width="60" width="160"/>
+ <check_box tool_tip="Abilita riproduzione media" name="enable_media"/>
+ <slider label="Voice" name="Voice Volume" label_width="60" width="160"/>
+ <check_box tool_tip="Abilita il voice" name="enable_voice_check"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/it/strings.xml b/indra/newview/skins/default/xui/it/strings.xml
index 8529fadd7d..11accb5f08 100644
--- a/indra/newview/skins/default/xui/it/strings.xml
+++ b/indra/newview/skins/default/xui/it/strings.xml
@@ -880,6 +880,9 @@ Prova ad accedere nuovamente tra un minuto.
<string name="ScriptQuestionCautionChatDenied">
A &apos;[OBJECTNAME]&apos;, un oggetto di proprietà di &apos;[OWNERNAME]&apos;, situato in [REGIONNAME] [REGIONPOS], è stato negato il permesso di: [PERMISSIONS].
</string>
+ <string name="AdditionalPermissionsRequestHeader">
+ Se consenti l&apos;accesso al tuo account, consentirai anche all&apos;oggetto di:
+ </string>
<string name="ScriptTakeMoney">
Prendere dollari Linden (L$) da te
</string>
@@ -913,6 +916,9 @@ Prova ad accedere nuovamente tra un minuto.
<string name="ControlYourCamera">
Controllare la tua fotocamera
</string>
+ <string name="TeleportYourAgent">
+ Teleportarti
+ </string>
<string name="SIM_ACCESS_PG">
Generale
</string>
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 1b6558a9eb..c8b8e918e0 100644
--- a/indra/newview/skins/default/xui/ja/floater_hardware_settings.xml
+++ b/indra/newview/skins/default/xui/ja/floater_hardware_settings.xml
@@ -25,6 +25,10 @@
VBO を有効化:
</text>
<check_box initial_value="true" label="OpenGL Vertex Buffer Objectsを有効化" name="vbo" tool_tip="最新ã®ãƒãƒ¼ãƒ‰ã‚¦ã‚§ã‚¢ã§ã“ã®è¨­å®šã‚’有効ã«ã™ã‚‹ã¨ã€ãƒ‘フォーマンスãŒå‘上ã—ã¾ã™ã€‚ ã—ã‹ã—ã€æ—§åž‹ã®ãƒãƒ¼ãƒ‰ã‚¦ã‚§ã‚¢ã§ã¯ VBO ã®å®Ÿè£…ãŒè²§å¼±ãªå ´åˆãŒå¤šãã€ã“ã®è¨­å®šã‚’有効ã«ã™ã‚‹ã“ã¨ã§ã‚¯ãƒ©ãƒƒã‚·ãƒ¥ã«ã¤ãªãŒã‚‹ãŠãれãŒã‚りã¾ã™ã€‚"/>
+ <text name="tc label">
+ S3TC を有効ã«ã™ã‚‹ï¼š
+ </text>
+ <check_box initial_value="true" label="テクスãƒãƒ£åœ§ç¸®ã‚’有効ã«ã™ã‚‹ï¼ˆå†èµ·å‹•ãŒå¿…è¦ï¼‰" name="texture compression" tool_tip="ビデオメモリ内ã§ãƒ†ã‚¯ã‚¹ãƒãƒ£ã‚’圧縮ã™ã‚‹ã“ã¨ã«ã‚ˆã‚Šã€è‰²ã®è³ªã‚’多少犠牲ã«ã—ãªãŒã‚‰ã€ã‚ˆã‚Šé«˜è§£åƒåº¦ã®ãƒ†ã‚¯ã‚¹ãƒãƒ£ã‚’読ã¿è¾¼ã‚るよã†ã«ã—ã¾ã™ã€‚"/>
<slider label="テクスãƒãƒ£ãƒ¡ãƒ¢ãƒªï¼ˆMB):" name="GraphicsCardTextureMemory" tool_tip="テクスãƒãƒ£ã«å‰²ã‚Šå½“ã¦ã‚‰ã‚ŒãŸãƒ¡ãƒ¢ãƒªã®é‡ã€‚ ビデオカードã®ãƒ¡ãƒ¢ãƒªã«æ—¢å®šã€‚ 数値を下ã’ã‚‹ã¨ãƒ‘フォーマンスãŒå‘上ã—ã¾ã™ãŒã€ãƒ†ã‚¯ã‚¹ãƒãƒ£ã®ç²¾åº¦ãŒè½ã¡ã‚‹ã“ã¨ãŒã‚りã¾ã™ã€‚"/>
<spinner label="フォグã®è·é›¢æ¯”率:" name="fog"/>
<button label="OK" label_selected="OK" name="OK"/>
diff --git a/indra/newview/skins/default/xui/ja/floater_model_wizard.xml b/indra/newview/skins/default/xui/ja/floater_model_wizard.xml
deleted file mode 100644
index 746bd8553c..0000000000
--- a/indra/newview/skins/default/xui/ja/floater_model_wizard.xml
+++ /dev/null
@@ -1,208 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Model Wizard" title="モデルウィザードをアップロード">
- <button label="5. アップロード" name="upload_btn"/>
- <button label="4. 確èª" name="review_btn"/>
- <button label="3. 物ç†åŠ¹æžœ" name="physics_btn"/>
- <button label="2. 最é©åŒ–" name="optimize_btn"/>
- <button label="1. ãƒ•ã‚¡ã‚¤ãƒ«ã‚’é¸æŠž" name="choose_file_btn"/>
- <panel name="choose_file_panel">
- <panel name="choose_file_header_panel">
- <text name="choose_file_header_text">
- ãƒ¢ãƒ‡ãƒ«ãƒ•ã‚¡ã‚¤ãƒ«ã‚’é¸æŠž
- </text>
- </panel>
- <panel name="choose_file_content">
- <text name="advanced_users_text">
- 上級ユーザーã®å ´åˆï¼š3D コンテンツ制作ツールã®ä½¿ç”¨ã«æ…£ã‚Œã¦ã„ã‚‹æ–¹ã¯ã€é«˜åº¦ãªã‚¢ãƒƒãƒ—ローダーもãŠè©¦ã—ãã ã•ã„。
- </text>
- <button label="アドãƒãƒ³ã‚¹ãƒ¢ãƒ¼ãƒ‰ã«åˆ‡ã‚Šæ›¿ãˆã‚‹" name="switch_to_advanced"/>
- <text name="Cache location">
- アップロードã™ã‚‹ãƒ¢ãƒ‡ãƒ«ãƒ•ã‚¡ã‚¤ãƒ«ã‚’é¸æŠž
- </text>
- <button label="å‚ç…§..." label_selected="å‚ç…§..." name="browse"/>
- <text name="Model types">
- Second Life 㯠COLLADA (.dae) ファイルをサãƒãƒ¼ãƒˆã—ã¾ã™ã€‚
- </text>
- <text name="dimensions">
- X Y Z
- </text>
- <text name="warning_label">
- 警告:
- </text>
- <text name="warning_text">
- ã“ã®ãƒ¢ãƒ‡ãƒ«ã‚’ Second Life サーãƒãƒ¼ã«ã‚¢ãƒƒãƒ—ロードã™ã‚‹ãŸã‚ã®æœ€çµ‚手順を実行ã§ãã¾ã›ã‚“。[secondlife:///app/floater/learn_more ã“ã¡ã‚‰ã‚’å‚ç…§ã—ã¦]ã€ãƒ¡ãƒƒã‚·ãƒ¥ãƒ¢ãƒ‡ãƒ«ã‚’アップロードã§ãるよã†ã«ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã‚’設定ã—ã¦ãã ã•ã„。
- </text>
- </panel>
- </panel>
- <panel name="optimize_panel">
- <panel name="optimize_header_panel">
- <text name="optimize_header_text">
- モデルを最é©åŒ–
- </text>
- </panel>
- <text name="optimize_description">
- モデルã¯ãƒ‘フォーマンスをé‡è¦–ã—ã¦æœ€é©åŒ–ã•れã¦ã„ã¾ã™ã€‚å¿…è¦ã«å¿œã˜ã¦èª¿æ•´ã—ã¦ãã ã•ã„。
- </text>
- <panel name="optimize_content">
- <text name="high_detail_text">
- æ¬¡ã®æç”»è©³ç´°åº¦ã‚’ä½œæˆï¼šé«˜
- </text>
- <text name="medium_detail_text">
- æ¬¡ã®æç”»è©³ç´°åº¦ã‚’ä½œæˆï¼šä¸­
- </text>
- <text name="low_detail_text">
- æ¬¡ã®æç”»è©³ç´°åº¦ã‚’ä½œæˆï¼šä½Ž
- </text>
- <text name="lowest_detail_text">
- æ¬¡ã®æç”»è©³ç´°åº¦ã‚’ä½œæˆï¼šæœ€ä½Ž
- </text>
- </panel>
- <panel name="content2">
- <button label="ジオメトリをå†è¨ˆç®—" name="recalculate_geometry_btn"/>
- <text name="lod_label">
- ジオメトリã®ãƒ—レビュー
- </text>
- <combo_box name="preview_lod_combo" tool_tip="プレビュー表示㮠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>
- </panel>
- <panel name="physics_panel">
- <panel name="physics_header_panel">
- <text name="physics_header_text">
- 物ç†ä½œç”¨ã®èª¿æ•´
- </text>
- </panel>
- <text name="physics_description">
- モデルã®å¤–殻構造ã®ã‚·ã‚§ã‚¤ãƒ—ã¯å¼Šç¤¾ãŒä½œæˆã—ã¾ã™ã€‚モデルã®ç›®çš„ã«å¿œã˜ã¦ã‚·ã‚§ã‚¤ãƒ—ã®è©³ç´°åº¦ã‚’調整ã—ã¦ãã ã•ã„。
- </text>
- <panel name="physics_content">
- <button label="物ç†ä½œç”¨ã‚’å†è¨ˆç®—" name="recalculate_physics_btn"/>
- <button label="å†è¨ˆç®—中..." name="recalculating_physics_btn"/>
- <text name="lod_label">
- 物ç†ä½œç”¨ã®ãƒ—レビュー
- </text>
- <combo_box name="preview_lod_combo2" tool_tip="プレビュー表示㮠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>
- </panel>
- <panel name="review_panel">
- <panel name="review_header_panel">
- <text name="review_header_text">
- 確èª
- </text>
- </panel>
- <panel name="review_content">
- <text name="review_prim_equiv">
- 区画/リージョンã¸ã®è² è·ï¼š[EQUIV] プリムæ›ç®—値
- </text>
- <text name="review_fee">
- L$ [FEE] ã®ã‚¢ãƒƒãƒ—ロード料金ãŒã‚ãªãŸã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã«è«‹æ±‚ã•れã¾ã™ã€‚
- </text>
- <text name="review_confirmation">
- アップロードボタンをクリックã™ã‚‹ã“ã¨ã«ã‚ˆã‚Šã€ãƒ¢ãƒ‡ãƒ«ã«å«ã¾ã‚Œã‚‹ãƒžãƒ†ãƒªã‚¢ãƒ«ã®æ‰€æœ‰æ¨©ã‚„使用許å¯ã®æ‰€æŒã‚’èªã‚ãŸã“ã¨ã«ãªã‚Šã¾ã™ã€‚
- </text>
- </panel>
- </panel>
- <panel name="upload_panel">
- <panel name="upload_header_panel">
- <text name="upload_header_text">
- アップロード完了
- </text>
- </panel>
- <text name="model_uploaded_text">
- モデルãŒã‚¢ãƒƒãƒ—ロードã•れã¾ã—ãŸã€‚
- </text>
- <text name="inventory_text">
- ãれã¯ã‚¤ãƒ³ãƒ™ãƒ³ãƒˆãƒªã®ã€Œã‚ªãƒ–ジェクトã€ãƒ•ォルダã«ã‚りã¾ã™ã€‚
- </text>
- <text name="charged_fee">
- ã‚ãªãŸã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã« L$ [FEE] ãŒè«‹æ±‚ã•れã¾ã—ãŸã€‚
- </text>
- </panel>
- <button label="&lt;&lt; 戻る" name="back"/>
- <button label="次ã¸&gt;&gt;" name="next"/>
- <button label="ã‚¦ã‚§ã‚¤ãƒˆã¨æ–™é‡‘ã®è¨ˆç®— &gt;&gt;" name="calculate"/>
- <button label="計算中..." name="calculating"/>
- <button label="アップロード" name="upload" tool_tip="シミュレーターã«ã‚¢ãƒƒãƒ—ロード"/>
- <button label="å–り消ã—" name="cancel"/>
- <button label="é–‰ã˜ã‚‹" name="close"/>
- <spinner name="import_scale" value="1.0"/>
- <string name="status_idle">
- 待機状態
- </string>
- <string name="status_parse_error">
- Dae ã«å•題ãŒè¦‹ã¤ã‹ã‚Šã¾ã—㟠- 詳細ã«ã¤ã„ã¦ã¯ãƒ­ã‚°ã‚’ã”å‚ç…§ãã ã•ã„。
- </string>
- <string name="status_reading_file">
- ローディング...
- </string>
- <string name="status_generating_meshes">
- メッシュを作æˆä¸­
- </string>
- <string name="status_vertex_number_overflow">
- ã‚¨ãƒ©ãƒ¼ï¼šé ‚ç‚¹ã®æ•°ãŒ65534ã‚’è¶…éŽã—ãŸã®ã§ä¸­æ­¢ã•れã¾ã—ãŸã€‚
- </string>
- <string name="bad_element">
- エラー:è¦ç´ ãŒç„¡åйã§ã™
- </string>
- <string name="high">
- 高
- </string>
- <string name="medium">
- 中
- </string>
- <string name="low">
- 低
- </string>
- <string name="lowest">
- 最低
- </string>
- <string name="mesh_status_good">
- 発é€
- </string>
- <string name="mesh_status_na">
- 該当ãªã—
- </string>
- <string name="mesh_status_none">
- ãªã—
- </string>
- <string name="mesh_status_submesh_mismatch">
- テクスãƒãƒ£ç·¨é›†å¯èƒ½ãªé¢ã®æ•°ã¯æç”»è©³ç´°åº¦ã«å¿œã˜ã¦ç•°ãªã‚Šã¾ã™ã€‚
- </string>
- <string name="mesh_status_mesh_mismatch">
- ãƒ¡ãƒƒã‚·ãƒ¥ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹ã®æ•°ã¯æç”»è©³ç´°åº¦ã«å¿œã˜ã¦ç•°ãªã‚Šã¾ã™ã€‚
- </string>
- <string name="mesh_status_too_many_vertices">
- æç”»è©³ç´°åº¦ã«å¯¾ã—ã¦é ‚ç‚¹ã®æ•°ãŒå¤šã™ãŽã¾ã™ã€‚
- </string>
- <string name="mesh_status_missing_lod">
- å¿…è¦ãªæç”»è©³ç´°åº¦ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。
- </string>
- <string name="layer_all">
- å…¨ã¦
- </string>
-</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_stats.xml b/indra/newview/skins/default/xui/ja/floater_stats.xml
index 6a1f34cfd8..da5358f06a 100644
--- a/indra/newview/skins/default/xui/ja/floater_stats.xml
+++ b/indra/newview/skins/default/xui/ja/floater_stats.xml
@@ -14,8 +14,11 @@
<stat_bar label="ç§’ã”ã¨ã® KTris æç”»" name="ktrissec"/>
<stat_bar label="オブジェクトåˆè¨ˆ" name="objs"/>
<stat_bar label="æ–°è¦ã‚ªãƒ–ジェクト" name="newobjs"/>
+ <stat_bar label="オブジェクトキャッシュヒット率" name="object_cache_hits"/>
</stat_view>
<stat_view label="テクスãƒãƒ£" name="texture">
+ <stat_bar label="キャッシュヒット率" name="texture_cache_hits"/>
+ <stat_bar label="キャッシュ読ã¿å–りé…å»¶" name="texture_cache_read_latency"/>
<stat_bar label="カウント" name="numimagesstat"/>
<stat_bar label="Raw カウント" name="numrawimagesstat"/>
<stat_bar label="GL メモリ" name="gltexmemstat"/>
diff --git a/indra/newview/skins/default/xui/ja/floater_texture_ctrl.xml b/indra/newview/skins/default/xui/ja/floater_texture_ctrl.xml
index 399cffcce5..55fe840658 100644
--- a/indra/newview/skins/default/xui/ja/floater_texture_ctrl.xml
+++ b/indra/newview/skins/default/xui/ja/floater_texture_ctrl.xml
@@ -1,24 +1,35 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="texture picker" title="テクスãƒãƒ£ã®é¸æŠž">
- <string name="choose_picture">
+ <floater.string name="choose_picture">
クリックã—ã¦å†™çœŸã‚’é¸æŠž
- </string>
+ </floater.string>
+ <floater.string name="pick title">
+ ピック:
+ </floater.string>
<text name="Multiple">
複数ã®ãƒ†ã‚¯ã‚¹ãƒãƒ£
</text>
+ <radio_group name="mode_selection">
+ <radio_item label="インベントリ" name="inventory" value="0"/>
+ <radio_item label="ローカル" name="local" value="1"/>
+ </radio_group>
<text name="unknown">
サイズ: [DIMENSIONS]
</text>
<button label="デフォルト" label_selected="デフォルト" name="Default"/>
- <button label="ãªã—" label_selected="ãªã—" name="None"/>
<button label="ブランク" label_selected="ブランク" name="Blank"/>
- <check_box label="フォルダを表示" name="show_folders_check"/>
- <search_editor label="テクスãƒãƒ£ã‚’フィルター" name="inventory search editor"/>
- <check_box label="ã™ãé©ç”¨" name="apply_immediate_check"/>
+ <button label="ãªã—" label_selected="ãªã—" name="None"/>
<button label="" label_selected="" name="Pipette"/>
- <button label="å–り消ã—" label_selected="å–り消ã—" name="Cancel"/>
+ <filter_editor label="テクスãƒãƒ£ã‚’フィルター" name="inventory search editor"/>
+ <check_box initial_value="false" label="フォルダを表示" name="show_folders_check"/>
+ <button label="追加" label_selected="追加" name="l_add_btn"/>
+ <button label="削除" label_selected="削除" name="l_rem_btn"/>
+ <button label="アップロード" label_selected="アップロード" name="l_upl_btn"/>
+ <scroll_list name="l_name_list">
+ <column label="åå‰" name="unit_name"/>
+ <column label="ID" name="unit_id_HIDDEN"/>
+ </scroll_list>
<button label="OK" label_selected="OK" name="Select"/>
- <text name="pick title">
- ピック:
- </text>
+ <button label="å–り消ã—" label_selected="å–り消ã—" name="Cancel"/>
+ <check_box initial_value="true" label="ã™ãé©ç”¨" name="apply_immediate_check"/>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_texture_fetch_debugger.xml b/indra/newview/skins/default/xui/ja/floater_texture_fetch_debugger.xml
new file mode 100644
index 0000000000..4efdf7d40d
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/floater_texture_fetch_debugger.xml
@@ -0,0 +1,62 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="TexFetchDebugger" title="テクスãƒãƒ£å–得デãƒãƒƒã‚¬">
+ <text name="total_num_fetched_label">
+ 1, å–å¾—ã—ãŸãƒ†ã‚¯ã‚¹ãƒãƒ£ã®åˆè¨ˆæ•°ï¼š[NUM]
+ </text>
+ <text name="total_num_fetching_requests_label">
+ 2, å–得リクエストã®åˆè¨ˆæ•°ï¼š[NUM]
+ </text>
+ <text name="total_num_cache_hits_label">
+ 3, キャッシュヒットã®åˆè¨ˆæ•°ï¼š[NUM]
+ </text>
+ <text name="total_num_visible_tex_label">
+ 4, 表示テクスãƒãƒ£ã®åˆè¨ˆæ•°ï¼š[NUM]
+ </text>
+ <text name="total_num_visible_tex_fetch_req_label">
+ 5, 表示テクスãƒãƒ£å–得リクエストã®åˆè¨ˆæ•°ï¼š[NUM]
+ </text>
+ <text name="total_fetched_data_label">
+ 6, å–å¾—ã—ãŸãƒ‡ãƒ¼ã‚¿ã®åˆè¨ˆæ•°ï¼š[SIZE1]KBã€ãƒ‡ã‚³ãƒ¼ãƒ‰ã•れãŸãƒ‡ãƒ¼ã‚¿ï¼š[SIZE2]KBã€[PIXEL]メガピクセル
+ </text>
+ <text name="total_fetched_vis_data_label">
+ 7, 表示データã®åˆè¨ˆæ•°ï¼š[SIZE1]KBã€ãƒ‡ã‚³ãƒ¼ãƒ‰ã•れãŸãƒ‡ãƒ¼ã‚¿ï¼š[SIZE2]KB
+ </text>
+ <text name="total_fetched_rendered_data_label">
+ 8, レンダリングã•れãŸãƒ‡ãƒ¼ã‚¿ã®åˆè¨ˆæ•°ï¼š[SIZE1]KBã€ãƒ‡ã‚³ãƒ¼ãƒ‰ã•れãŸãƒ‡ãƒ¼ã‚¿ï¼š[SIZE2]KBã€[PIXEL]メガピクセル
+ </text>
+ <text name="total_time_cache_read_label">
+ 9, キャッシュ読ã¿å–りã®åˆè¨ˆæ™‚間:[TIME] ç§’
+ </text>
+ <text name="total_time_cache_write_label">
+ 10, キャッシュ書ãè¾¼ã¿ã®åˆè¨ˆæ™‚間:[TIME] ç§’
+ </text>
+ <text name="total_time_decode_label">
+ 11, デコードã®åˆè¨ˆæ™‚間:[TIME] ç§’
+ </text>
+ <text name="total_time_gl_label">
+ 12, glテクスãƒãƒ£ä½œæˆã®åˆè¨ˆæ™‚間:[TIME] ç§’
+ </text>
+ <text name="total_time_http_label">
+ 13, HTTP å–å¾—ã®åˆè¨ˆæ™‚間:[TIME] ç§’
+ </text>
+ <text name="total_time_fetch_label">
+ 14, å–得全体ã®åˆè¨ˆæ™‚間:[TIME] ç§’
+ </text>
+ <text name="total_time_refetch_vis_cache_label">
+ 15, キャッシュã‹ã‚‰è¡¨ç¤ºãƒ†ã‚¯ã‚¹ãƒãƒ£ã‚’å†å–å¾—ã€æ™‚間:[TIME] ç§’ã€å–得:[SIZE]KBã€[PIXEL]メガピクセル
+ </text>
+ <text name="total_time_refetch_vis_http_label">
+ 16, HTTP ã‹ã‚‰è¡¨ç¤ºãƒ†ã‚¯ã‚¹ãƒãƒ£ã‚’å†å–å¾—ã€æ™‚間:[TIME] ç§’ã€å–得:[SIZE]KBã€[PIXEL]メガピクセル
+ </text>
+ <spinner label="17, テクセルï¼ãƒ”ã‚¯ã‚»ãƒ«ã®æ¯”率:" name="texel_pixel_ratio"/>
+ <button label="é–‹å§‹" name="start_btn"/>
+ <button label="リセット" name="clear_btn"/>
+ <button label="é–‰ã˜ã‚‹" name="close_btn"/>
+ <button label="キャッシュ読ã¿å–り" name="cacheread_btn"/>
+ <button label="キャッシュ書ãè¾¼ã¿" name="cachewrite_btn"/>
+ <button label="HTTP" name="http_btn"/>
+ <button label="デコード" name="decode_btn"/>
+ <button label="GL テクスãƒãƒ£" name="gl_btn"/>
+ <button label="キャッシュ表示テクスãƒãƒ£å†å–å¾—" name="refetchviscache_btn"/>
+ <button label="HTTP表示テクスãƒãƒ£å†å–å¾—" name="refetchvishttp_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_window_size.xml b/indra/newview/skins/default/xui/ja/floater_window_size.xml
index 152a5f4806..416813d6cc 100644
--- a/indra/newview/skins/default/xui/ja/floater_window_size.xml
+++ b/indra/newview/skins/default/xui/ja/floater_window_size.xml
@@ -7,10 +7,17 @@
ウィンドウã®ã‚µã‚¤ã‚ºã‚’設定:
</text>
<combo_box name="window_size_combo" tool_tip="横幅 x 高ã•">
- <combo_box.item label="1000 x 700 (標準)" name="item0"/>
- <combo_box.item label="1024 x 768" name="item1"/>
- <combo_box.item label="1280 x 720 (720p)" name="item2"/>
- <combo_box.item label="1920 x 1080 (1080p)" name="item3"/>
+ <combo_box.item label="1000 x 700 (デフォルト)" name="item1"/>
+ <combo_box.item label="1024 x 768 (4:3 XGA)" name="item2"/>
+ <combo_box.item label="1280 x 720 (16:9 HDTV)" name="item3"/>
+ <combo_box.item label="1280 x 800 (5:8 WXGA)" name="item4"/>
+ <combo_box.item label="1280 x 1024 (5:4 SXGA)" name="item5"/>
+ <combo_box.item label="1440 x 900 (8:5 WSXGA)" name="item7"/>
+ <combo_box.item label="1600 x 900 (16:9 HD+)" name="item8"/>
+ <combo_box.item label="1600 x 1200 (4:3 UXGA)" name="item9"/>
+ <combo_box.item label="1680 x 1050 (8:5 WSXGA+)" name="item10"/>
+ <combo_box.item label="1920 x 1080 (16:9 HDTV)" name="item11"/>
+ <combo_box.item label="1920 x 1200 (8:5 WUXGA)" name="item12"/>
</combo_box>
<button label="設定" name="set_btn"/>
<button label="キャンセル" name="cancel_btn"/>
diff --git a/indra/newview/skins/default/xui/ja/menu_viewer.xml b/indra/newview/skins/default/xui/ja/menu_viewer.xml
index 8496dfb1db..3a398bd985 100644
--- a/indra/newview/skins/default/xui/ja/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/ja/menu_viewer.xml
@@ -227,11 +227,10 @@
<menu_item_check label="テクスãƒãƒ£ã®ã‚³ãƒ³ã‚½ãƒ¼ãƒ«" name="Texture Console"/>
<menu_item_check label="デãƒãƒƒã‚°ã‚³ãƒ³ã‚½ãƒ¼ãƒ«" name="Debug Console"/>
<menu_item_call label="通知コンソール" name="Notifications"/>
- <menu_item_check label="テクスãƒãƒ£ã‚µã‚¤ã‚ºã®ã‚³ãƒ³ã‚½ãƒ¼ãƒ«" name="Texture Size"/>
- <menu_item_check label="テクスãƒãƒ£ã‚«ãƒ†ã‚´ãƒªã®ã‚³ãƒ³ã‚½ãƒ¼ãƒ«" name="Texture Category"/>
<menu_item_check label="ファーストタイマー" name="Fast Timers"/>
<menu_item_check label="メモリ" name="Memory"/>
<menu_item_check label="風景ã®çµ±è¨ˆ" name="Scene Statistics"/>
+ <menu_item_call label="テクスãƒãƒ£å–得デãƒãƒƒã‚°ã‚³ãƒ³ã‚½ãƒ¼ãƒ«" name="Texture Fetch Debug Console"/>
<menu_item_call label="リージョン情報をデãƒãƒƒã‚°ã‚³ãƒ³ã‚½ãƒ¼ãƒ«ã¸" name="Region Info to Debug Console"/>
<menu_item_call label="グループ情報をデãƒãƒƒã‚°ã‚³ãƒ³ã‚½ãƒ¼ãƒ«ã¸" name="Group Info to Debug Console"/>
<menu_item_call label="性能情報をデãƒãƒƒã‚°ã‚³ãƒ³ã‚½ãƒ¼ãƒ«ã¸" name="Capabilities Info to Debug Console"/>
@@ -289,6 +288,12 @@
<menu_item_check label="æç”»ã®è©³ç´°åº¦" name="rendercomplexity"/>
<menu_item_check label="添付アイテムã®ãƒã‚¤ãƒˆæ•°" name="attachment bytes"/>
<menu_item_check label="スカルプト" name="Sculpt"/>
+ <menu label="テクスãƒãƒ£ã®å¯†åº¦" name="Texture Density">
+ <menu_item_check label="ãªã—" name="None"/>
+ <menu_item_check label="ç¾åœ¨" name="Current"/>
+ <menu_item_check label="望ã¾ã—ã„" name="Desired"/>
+ <menu_item_check label="フル" name="Full"/>
+ </menu>
</menu>
<menu label="レンダリング" name="Rendering">
<menu_item_check label="軸" name="Axes"/>
@@ -306,7 +311,6 @@
<menu_item_check label="アニメーションテクスãƒãƒ£" name="Animation Textures"/>
<menu_item_check label="テクスãƒãƒ£ã‚’無効ã«ã™ã‚‹" name="Disable Textures"/>
<menu_item_check label="フル解åƒåº¦ãƒ†ã‚¯ã‚¹ãƒãƒ£" name="Rull Res Textures"/>
- <menu_item_check label="テクスãƒãƒ£ã®æ¤œæŸ»" name="Audit Textures"/>
<menu_item_check label="テクスãƒãƒ£ã‚¢ãƒˆãƒ©ã‚¹ï¼ˆè©¦é¨“段階)" name="Texture Atlas"/>
<menu_item_check label="装ç€ã•れãŸå…‰æºã‚’æç”»ã™ã‚‹" name="Render Attached Lights"/>
<menu_item_check label="å–り付ã‘られãŸãƒ‘ーティクルをæç”»ã™ã‚‹" name="Render Attached Particles"/>
diff --git a/indra/newview/skins/default/xui/ja/notifications.xml b/indra/newview/skins/default/xui/ja/notifications.xml
index 7bf8a7b8be..6d13306ab2 100644
--- a/indra/newview/skins/default/xui/ja/notifications.xml
+++ b/indra/newview/skins/default/xui/ja/notifications.xml
@@ -382,7 +382,7 @@ L$ ãŒä¸è¶³ã—ã¦ã„ã‚‹ã®ã§ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«å‚加ã™ã‚‹ã“ã¨ãŒã§ãã
[SECOND_LIFE] ã«å…¥ã‚‹ã«ã¯ã‚¢ã‚«ã‚¦ãƒ³ãƒˆãŒå¿…è¦ã§ã™ã€‚今ã™ãアカウントを作æˆã—ã¾ã™ã‹ï¼Ÿ
<url name="url">
- https://join.secondlife.com/index.php?lang=ja-JP
+ [create_account_url]
</url>
<usetemplate name="okcancelbuttons" notext="ã‚‚ã†ä¸€åº¦è©¦ã™" yestext="æ–°ã—ã„アカウントを作æˆ"/>
</notification>
@@ -517,6 +517,15 @@ L$ ãŒä¸è¶³ã—ã¦ã„ã‚‹ã®ã§ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«å‚加ã™ã‚‹ã“ã¨ãŒã§ãã
</url>
<usetemplate ignoretext="使用中ã®ã‚³ãƒ³ãƒ”ューターã®ãƒãƒ¼ãƒ‰ã‚¦ã‚§ã‚¢ãŒã‚µãƒãƒ¼ãƒˆã•れã¦ã„ãªã„ã¨ã" name="okcancelignore" notext="ã„ã„ãˆ" yestext="ã¯ã„"/>
</notification>
+ <notification name="IntelOldDriver">
+ ãŠãらããŠä½¿ã„ã®ã‚°ãƒ©ãƒ•ィックãƒãƒƒãƒ—ç”¨ã®æ–°ã—ã„ドライãƒãŒå…¥æ‰‹å¯èƒ½ã§ã™ã€‚グラフィックドライãƒã‚’æ›´æ–°ã™ã‚‹ã“ã¨ã«ã‚ˆã‚Šã€ãƒ‘フォーマンスãŒå¤§å¹…ã«å‘上ã™ã‚‹å ´åˆãŒã‚りã¾ã™ã€‚
+
+[_URL] ã«ã‚¢ã‚¯ã‚»ã‚¹ã—ã¦æ›´æ–°ç‰ˆã®ãƒ‰ãƒ©ã‚¤ãƒãŒã‚ã‚‹ã‹ã©ã†ã‹ã‚’確èªã—ã¾ã™ã‹ï¼Ÿ
+ <url name="url">
+ http://www.intel.com/p/ja_JP/support/detect/graphics
+ </url>
+ <usetemplate ignoretext="使用ã—ã¦ã„るグラフィックドライãƒãŒå¤ã„å ´åˆ" name="okcancelignore" notext="ã„ã„ãˆ" yestext="ã¯ã„"/>
+ </notification>
<notification name="UnknownGPU">
ãŠä½¿ã„ã®ã‚·ã‚¹ãƒ†ãƒ ã«ã¯ã€[APP_NAME] ãŒèªè­˜ã§ããªã„ã‚°ãƒ©ãƒ•ã‚£ãƒƒã‚¯ã‚«ãƒ¼ãƒ‰ãŒæ­è¼‰ã•れã¦ã„ã¾ã™ã€‚
[APP_NAME] ã§ã¾ã ãƒ†ã‚¹ãƒˆã•れã¦ã„ãªã„最新ãƒãƒ¼ãƒ‰ã‚¦ã‚§ã‚¢ã®ãŸã‚ã ã¨è€ƒãˆã‚‰ã‚Œã¾ã™ã€‚ å•題ãªã„ã¨ã¯æ€ã„ã¾ã™ãŒã€ã‚°ãƒ©ãƒ•ィックã®è¨­å®šã‚’調整ã™ã‚‹å¿…è¦ãŒã‚ã‚‹ã‹ã‚‚ã—れã¾ã›ã‚“。
@@ -1201,7 +1210,6 @@ L$ ã¯è¿”金ã•れã¾ã›ã‚“。
[APP_NAME] ã®ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ãŒå®Œäº†ã—ã¾ã—ãŸã€‚
[SECOND_LIFE] を使ã£ãŸã“ã¨ãŒãªã„å ´åˆã¯ã€ãƒ­ã‚°ã‚¤ãƒ³ã™ã‚‹å‰ã«ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã®ä½œæˆã‚’行ã£ã¦ãã ã•ã„。
-[http://join.secondlife.com/?lang=ja-JP] ã§æ–°ã—ã„アカウントを作æˆã—ã¾ã™ã‹ï¼Ÿ
<usetemplate name="okcancelbuttons" notext="続行" yestext="æ–°è¦ã‚¢ã‚«ã‚¦ãƒ³ãƒˆ..."/>
</notification>
<notification name="LoginPacketNeverReceived">
@@ -2663,16 +2671,12 @@ Web ページã«ãƒªãƒ³ã‚¯ã™ã‚‹ã¨ã€ä»–人ãŒã“ã®å ´æ‰€ã«ç°¡å˜ã«ã‚¢ã‚¯ã‚»ã
</form>
</notification>
<notification name="ScriptQuestionCaution">
- [NAME] ãŒæ‰€æœ‰ã™ã‚‹ã€Œ&lt;nolink&gt;[OBJECTNAME]&lt;/nolink&gt;〠ã¨ã„ã†ã‚ªãƒ–ジェクトãŒã€æ¬¡ã®ã“ã¨ã‚’ã—よã†ã¨ã—ã¦ã„ã¾ã™ï¼š
-
-[QUESTIONS]
-ã“ã®ã‚ªãƒ–ジェクトや制作者を信用ã§ããªã„å ´åˆã¯ã€ã“ã®ãƒªã‚¯ã‚¨ã‚¹ãƒˆã‚’æ‹’å¦ã—ã¦ãã ã•ã„。
-
-リクエストをå—ã‘ã¾ã™ã‹ï¼Ÿ
+ 警告:オブジェクト &apos;&lt;nolink&gt;[OBJECTNAME]&lt;/nolink&gt;&apos; ã¯ã‚ãªãŸã®ãƒªãƒ³ãƒ‡ãƒ³ãƒ‰ãƒ«ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã¸ã®ãƒˆãƒ¼ã‚¿ãƒ«ã‚¢ã‚¯ã‚»ã‚¹ã‚’希望ã—ã¦ã„ã¾ã™ã€‚アクセスを許å¯ã™ã‚‹ã¨ã€ã“ã®ã‚ªãƒ–ジェクトã¯ã„ã¤ã§ã‚‚ã‚ãªãŸã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã‹ã‚‰è³‡é‡‘を削除ã—ãŸã‚Šã€ä»Šå¾Œè­¦å‘Šã‚’表示ã™ã‚‹ã“ã¨ãªã継続的ã«ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã‚’完全ã«ç©ºã«ã§ãるよã†ã«ãªã‚Šã¾ã™ã€‚
+
+ã“ã®ã‚ˆã†ãªãƒªã‚¯ã‚¨ã‚¹ãƒˆãŒæ­£å½“ã§ã‚ã‚‹ã“ã¨ã¯ç¨€ã§ã™ã€‚ã“ã®ã‚ªãƒ–ジェクトãŒã‚ãªãŸã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã«ã‚¢ã‚¯ã‚»ã‚¹ã—ãŸã„ç†ç”±ã‚’完全ã«ç†è§£ã—ã¦ã„ã‚‹å ´åˆã‚’除ãã€ã‚¢ã‚¯ã‚»ã‚¹ã®è¨±å¯ã¯é¿ã‘ã¦ãã ã•ã„。
<form name="form">
- <button name="Grant" text="許å¯"/>
+ <button name="Grant" text="トータルアクセスを許å¯"/>
<button name="Deny" text="æ‹’å¦"/>
- <button name="Details" text="詳細..."/>
</form>
</notification>
<notification name="ScriptDialog">
@@ -3180,4 +3184,16 @@ M キーを押ã—ã¦å¤‰æ›´ã—ã¾ã™ã€‚
<global name="You died and have been teleported to your home location">
死んã§ã—ã¾ã£ãŸã®ã§ã€ãƒ›ãƒ¼ãƒ ã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã•れã¾ã—ãŸã€‚
</global>
+ <notification name="LocalBitmapsUpdateFileNotFound">
+ [FNAME] ã¯ã€è¦‹ã¤ã‹ã‚‰ãªã‹ã£ãŸãŸã‚ã€æ›´æ–°ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚
+ã“ã®ãƒ•ァイルã«å¯¾ã™ã‚‹ä»Šå¾Œã®æ›´æ–°ã‚’無効ã«ã—ã¾ã™ã€‚
+ </notification>
+ <notification name="LocalBitmapsUpdateFailedFinal">
+ [FNAME] ã‚’é–‹ãã¾ãŸã¯ãƒ‡ã‚³ãƒ¼ãƒ‰ã™ã‚‹è©¦è¡Œã«å¤±æ•—ã—ã¾ã—ãŸï¼ˆè©¦è¡Œå›žæ•° [NRETRIES] 回)。ãã®ãŸã‚ã€ã“ã®ãƒ•ァイルã¯å£Šã‚Œã¦ã„ã‚‹ã‚‚ã®ã¨ã—ã¦å‡¦ç†ã•れã¾ã—ãŸã€‚
+ã“ã®ãƒ•ァイルã«å¯¾ã™ã‚‹ä»Šå¾Œã®æ›´æ–°ã‚’無効ã«ã—ã¾ã™ã€‚
+ </notification>
+ <notification name="LocalBitmapsVerifyFail">
+ é–‹ãã“ã¨ãŒã§ããªã„ã€ã¾ãŸã¯ãƒ‡ã‚³ãƒ¼ãƒ‰ã§ããªã„無効ã¾ãŸã¯èª­ã¿å–りä¸èƒ½ãªç”»åƒãƒ•ァイル [FNAME] を追加ã—よã†ã¨ã—ã¾ã—ãŸã€‚
+ã“ã®è©¦è¡Œã¯ã‚­ãƒ£ãƒ³ã‚»ãƒ«ã•れã¾ã—ãŸã€‚
+ </notification>
</notifications>
diff --git a/indra/newview/skins/default/xui/ja/panel_login.xml b/indra/newview/skins/default/xui/ja/panel_login.xml
index ac1fe455c7..780f7aa1ae 100644
--- a/indra/newview/skins/default/xui/ja/panel_login.xml
+++ b/indra/newview/skins/default/xui/ja/panel_login.xml
@@ -1,13 +1,13 @@
<?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="log_in_text">
+ ログイン
+ </text>
<text name="username_text">
ユーザーãƒãƒ¼ãƒ ï¼š
</text>
@@ -15,15 +15,8 @@
<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>
+ </layout_panel>
+ <layout_panel name="start_location_panel">
<text name="start_location_text">
開始地点:
</text>
@@ -33,16 +26,21 @@
<combo_box.item label="<地域åを入力>" name="Typeregionname"/>
</combo_box>
</layout_panel>
- <layout_panel name="links">
- <text name="create_new_account_text">
- ãŠç”³ã—è¾¼ã¿
+ <layout_panel name="links_login_panel">
+ <text name="login_help">
+ ãƒ­ã‚°ã‚¤ãƒ³ã®æ–¹æ³•
</text>
<text name="forgot_password_text">
ユーザーåã¾ãŸã¯ãƒ‘スワードをãŠå¿˜ã‚Œã§ã™ã‹ï¼Ÿ
</text>
- <text name="login_help">
- ãƒ­ã‚°ã‚¤ãƒ³ã®æ–¹æ³•
+ <button label="ログイン" left_pad="30" name="connect_btn" width="60"/>
+ <check_box label="パスワードを記憶" name="remember_check"/>
+ </layout_panel>
+ <layout_panel name="links">
+ <text name="create_account_text">
+ CREATE YǾUR ACCǾUNT
</text>
+ <button name="create_new_account_btn" label="ãŠç”³ã—è¾¼ã¿"/>
</layout_panel>
</layout_stack>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_script_question_toast.xml b/indra/newview/skins/default/xui/ja/panel_script_question_toast.xml
new file mode 100644
index 0000000000..a2d0237da0
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/panel_script_question_toast.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<panel label="script_question_panel" name="panel_script_question_toast">
+ <panel label="buttons_panel" name="buttons_panel"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/ja/strings.xml b/indra/newview/skins/default/xui/ja/strings.xml
index 680ef60890..f6b3edc57f 100644
--- a/indra/newview/skins/default/xui/ja/strings.xml
+++ b/indra/newview/skins/default/xui/ja/strings.xml
@@ -886,6 +886,9 @@ support@secondlife.com ã«ãŠå•ã„åˆã‚ã›ãã ã•ã„。
<string name="ScriptQuestionCautionChatDenied">
[REGIONNAME] ã® [REGIONPOS] ã¨ã„ã†å ´æ‰€ã«ã‚ã‚‹ã€ã€Œ [OWNERNAME] ã€ãŒæ‰€æœ‰ã™ã‚‹ã€Œ [OBJECTNAME] ã€ã¨ã„ã†ã‚ªãƒ–ジェクトã¯ã€æ¬¡ã®æ¨©é™ã‚’æ‹’å¦ã—ã¾ã—ãŸï¼š [PERMISSIONS]
</string>
+ <string name="AdditionalPermissionsRequestHeader">
+ ã‚ãªãŸã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ã‚’許å¯ã™ã‚‹ã¨ã€ã“ã®ã‚ªãƒ–ジェクトã«ã¯æ¬¡ã®æ“作も許å¯ã•れã¾ã™ï¼š
+ </string>
<string name="ScriptTakeMoney">
リンデンドル(L$)を支払ã†
</string>
@@ -919,6 +922,9 @@ support@secondlife.com ã«ãŠå•ã„åˆã‚ã›ãã ã•ã„。
<string name="ControlYourCamera">
カメラã®ã‚³ãƒ³ãƒˆãƒ­ãƒ¼ãƒ«
</string>
+ <string name="TeleportYourAgent">
+ ã‚ãªãŸã‚’テレãƒãƒ¼ãƒˆ
+ </string>
<string name="NotConnected">
接続ã•れã¦ã„ã¾ã›ã‚“
</string>
diff --git a/indra/newview/skins/default/xui/pl/notifications.xml b/indra/newview/skins/default/xui/pl/notifications.xml
index 0194293642..f255b1b8ea 100644
--- a/indra/newview/skins/default/xui/pl/notifications.xml
+++ b/indra/newview/skins/default/xui/pl/notifications.xml
@@ -1106,7 +1106,6 @@ Możesz normalnie używać [SECOND_LIFE], inni użytkownicy będą Cię widzieli
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">
diff --git a/indra/newview/skins/default/xui/pl/panel_login.xml b/indra/newview/skins/default/xui/pl/panel_login.xml
index dc8e7399af..c87a3d3bd4 100644
--- a/indra/newview/skins/default/xui/pl/panel_login.xml
+++ b/indra/newview/skins/default/xui/pl/panel_login.xml
@@ -5,6 +5,9 @@
</panel.string>
<layout_stack name="login_widgets">
<layout_panel name="login">
+ <text name="log_in_text">
+ POÅÄ„CZ
+ </text>
<text name="username_text">
Użytkownik:
</text>
@@ -12,15 +15,8 @@
<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>
+ </layout_panel>
+ <layout_panel name="start_location_panel">
<text name="start_location_text">
Rozpocznij w:
</text>
@@ -30,16 +26,23 @@
<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
+ <layout_panel name="links_login_panel">
+ <text name="login_help">
+ Potrzebujesz pomocy z logowaniem siÄ™?
</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Ä™?
+ <button label="Połącz" name="connect_btn"/>
+ <check_box label="Zapamiętaj hasło" name="remember_check"/>
+ </layout_panel>
+ <layout_panel name="links">
+ <text name="create_account_text">
+ CREATE YǾUR ACCǾUNT
</text>
+ <button name="create_new_account_btn"
+ label="Utwórz nowe konto"
+ width="120"/>
</layout_panel>
</layout_stack>
</panel>
diff --git a/indra/newview/skins/default/xui/pl/panel_volume_pulldown.xml b/indra/newview/skins/default/xui/pl/panel_volume_pulldown.xml
new file mode 100644
index 0000000000..1611900700
--- /dev/null
+++ b/indra/newview/skins/default/xui/pl/panel_volume_pulldown.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<panel name="volumepulldown_floater">
+ <slider label="Główny" name="System Volume"/>
+ <slider label="Przyciski" name="UI Volume"/>
+ <slider label="Okolica" name="Wind Volume"/>
+ <slider label="Efekty" name="SFX Volume"/>
+ <check_box name="gesture_audio_play_btn" tool_tip="Włącz dźwięki gestów"/>
+ <slider label="Muzyka" name="Music Volume"/>
+ <check_box tool_tip="Włącz muzykę strumieniową" name="enable_music"/>
+ <slider label="Media" name="Media Volume"/>
+ <check_box tool_tip="Włącz media strumieniowe" name="enable_media"/>
+ <slider label="Głos" name="Voice Volume"/>
+ <check_box tool_tip="Włącz rozmowy głosowe" name="enable_voice_check"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/pt/floater_hardware_settings.xml b/indra/newview/skins/default/xui/pt/floater_hardware_settings.xml
index 1bc2bce768..1204fb93e2 100644
--- a/indra/newview/skins/default/xui/pt/floater_hardware_settings.xml
+++ b/indra/newview/skins/default/xui/pt/floater_hardware_settings.xml
@@ -25,6 +25,10 @@
Habilitar VBO:
</text>
<check_box initial_value="true" label="Habilitar Objetos com Armazenamento de Vértices" name="vbo" tool_tip="Habilitando-o em máquinas novas, ele oferece um ganho de performance. Contudo, as máquinas antigas tem freqüentemente implementações pobres de VBOs e você pode ter travamentos quando esta opção é habilitada."/>
+ <text name="tc label">
+ Habilitar S3TC:
+ </text>
+ <check_box initial_value="true" label="Habilitar compressão de texturas (requer reinício)" name="texture compression" tool_tip="Comprime as texturas na memória de vídeo, permitindo o carregamento de texturas de maior resolução em detrimento da qualidade da cor."/>
<slider label="Memória de texturas (MB):" name="GraphicsCardTextureMemory" tool_tip="Quanto da memória deve ser alocado para texturas. O padrão é definido pela memória da placa de vídeo. Reduzir este valor pode melhorar o desempenho, mas as texturas podem fica fora de foco."/>
<spinner label="Relação de Distância de Nevoeiro:" name="fog"/>
<button label="OK" label_selected="OK" name="OK"/>
diff --git a/indra/newview/skins/default/xui/pt/floater_model_wizard.xml b/indra/newview/skins/default/xui/pt/floater_model_wizard.xml
deleted file mode 100644
index 0d07303c91..0000000000
--- a/indra/newview/skins/default/xui/pt/floater_model_wizard.xml
+++ /dev/null
@@ -1,208 +0,0 @@
-<?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="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="choose_file_header_panel">
- <text name="choose_file_header_text">
- Escolher arquivo de modelo
- </text>
- </panel>
- <panel name="choose_file_content">
- <text name="advanced_users_text">
- Usuários avançados: se você estiver familiarizado com ferramentas de criação de conteúdo 3D, use o Advanced Uploader.
- </text>
- <button label="Trocar para avançado" name="switch_to_advanced"/>
- <text name="Cache location">
- Escolha o arquivo de modelo para upload
- </text>
- <button label="Procurar..." label_selected="Procurar..." name="browse"/>
- <text name="Model types">
- O Second Life oferece suporte a arquivos COLLADA (.dae)
- </text>
- <text name="dimensions">
- X Y Z
- </text>
- <text name="warning_label">
- AVISO:
- </text>
- <text name="warning_text">
- Não será possível concluir a etapa final do upload desse modelo para os servidores do Second Life. [secondlife:///app/floater/learn_more Saiba como] configurar sua conta para uploads de modelos mesh.
- </text>
- </panel>
- </panel>
- <panel name="optimize_panel">
- <panel name="optimize_header_panel">
- <text name="optimize_header_text">
- Otimizar modelo
- </text>
- </panel>
- <text name="optimize_description">
- O modelo foi ajustado para desempenho. Faça novos ajustes, se desejar.
- </text>
- <panel name="optimize_content">
- <text name="high_detail_text">
- Gerar nível de detalhes: Alto
- </text>
- <text name="medium_detail_text">
- Gerar nível de detalhes: Médio
- </text>
- <text name="low_detail_text">
- Gerar nível de detalhes: Baixo
- </text>
- <text name="lowest_detail_text">
- Gerar nível de detalhes: Mais baixo
- </text>
- </panel>
- <panel name="content2">
- <button label="Recalcular geometria" name="recalculate_geometry_btn"/>
- <text name="lod_label">
- Visualização da geometria
- </text>
- <combo_box name="preview_lod_combo" tool_tip="LOD para exibir na renderização de visualização">
- <combo_item name="high">
- Máximo de detalhes
- </combo_item>
- <combo_item name="medium">
- Detalhes médios
- </combo_item>
- <combo_item name="low">
- Poucos detalhes
- </combo_item>
- <combo_item name="lowest">
- Mínimo de detalhes
- </combo_item>
- </combo_box>
- </panel>
- </panel>
- <panel name="physics_panel">
- <panel name="physics_header_panel">
- <text name="physics_header_text">
- Ajustar físico
- </text>
- </panel>
- <text name="physics_description">
- Criaremos uma forma para o corpo externo do modelo. Ajuste o nível de detalhes como necessário para a finalidade desejada de seu modelo.
- </text>
- <panel name="physics_content">
- <button label="Recalcular físico" name="recalculate_physics_btn"/>
- <button label="Recalculando..." name="recalculating_physics_btn"/>
- <text name="lod_label">
- Visualização do físico
- </text>
- <combo_box name="preview_lod_combo2" tool_tip="LOD para exibir na renderização de visualização">
- <combo_item name="high">
- Máximo de detalhes
- </combo_item>
- <combo_item name="medium">
- Detalhes médios
- </combo_item>
- <combo_item name="low">
- Poucos detalhes
- </combo_item>
- <combo_item name="lowest">
- Mínimo de detalhes
- </combo_item>
- </combo_box>
- </panel>
- </panel>
- <panel name="review_panel">
- <panel name="review_header_panel">
- <text name="review_header_text">
- Revisar
- </text>
- </panel>
- <panel name="review_content">
- <text name="review_prim_equiv">
- Impacto no lote/região: [EQUIV] equivalentes de prim
- </text>
- <text name="review_fee">
- Uma tarifa de upload de L$ [FEE] será debitada da sua conta.
- </text>
- <text name="review_confirmation">
- Ao clicar no botão de upload, você confirma que detém os direitos apropriados sobre o material contido no modelo.
- </text>
- </panel>
- </panel>
- <panel name="upload_panel">
- <panel name="upload_header_panel">
- <text name="upload_header_text">
- Upload concluído
- </text>
- </panel>
- <text name="model_uploaded_text">
- Seu modelo foi carregado.
- </text>
- <text name="inventory_text">
- Disponível na pasta Objetos do seu inventário.
- </text>
- <text name="charged_fee">
- L$ [FEE] foram debitados da sua conta.
- </text>
- </panel>
- <button label="&lt;&lt; Voltar" name="back"/>
- <button label="Próximo &gt;&gt;" name="next"/>
- <button label="Calcular pesos e tarifa &gt;&gt;" name="calculate"/>
- <button label="Calculando..." name="calculating"/>
- <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_parse_error">
- Dae parsing - erro, detalhes no log.
- </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="bad_element">
- Erro: elemento inválido
- </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_stats.xml b/indra/newview/skins/default/xui/pt/floater_stats.xml
index f0a053ebe3..e770c6ac38 100644
--- a/indra/newview/skins/default/xui/pt/floater_stats.xml
+++ b/indra/newview/skins/default/xui/pt/floater_stats.xml
@@ -14,8 +14,11 @@
<stat_bar label="KTris desenhados por segundo" name="ktrissec"/>
<stat_bar label="Total Objects" name="objs"/>
<stat_bar label="New Objects" name="newobjs"/>
+ <stat_bar label="Taxa de acertos do cache do objeto" name="object_cache_hits"/>
</stat_view>
<stat_view label="Texture" name="texture">
+ <stat_bar label="Taxa de acertos do cache" name="texture_cache_hits"/>
+ <stat_bar label="Latência de leitura do cache" name="texture_cache_read_latency"/>
<stat_bar label="Count" name="numimagesstat"/>
<stat_bar label="Raw Count" name="numrawimagesstat"/>
<stat_bar label="GL Mem" name="gltexmemstat"/>
diff --git a/indra/newview/skins/default/xui/pt/floater_texture_ctrl.xml b/indra/newview/skins/default/xui/pt/floater_texture_ctrl.xml
index 144bc0340e..57223beaeb 100644
--- a/indra/newview/skins/default/xui/pt/floater_texture_ctrl.xml
+++ b/indra/newview/skins/default/xui/pt/floater_texture_ctrl.xml
@@ -1,23 +1,34 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="texture picker" title="DESTAQUE: TEXTURA">
- <string name="choose_picture">
+ <floater.string name="choose_picture">
Clique para escolher uma imagem
- </string>
+ </floater.string>
+ <floater.string name="pick title">
+ Pegar:
+ </floater.string>
<text name="Multiple">
Multiplas texturas
</text>
+ <radio_group name="mode_selection">
+ <radio_item label="Inventário" name="inventory" value="0"/>
+ <radio_item label="Local" name="local" value="1"/>
+ </radio_group>
<text name="unknown">
Tamanho: [DIMENSÕES]
</text>
<button label="Padrão" label_selected="Padrão" name="Default"/>
- <button label="Nenhum" label_selected="Nenhum" name="None"/>
<button label="Branco" label_selected="Branco" name="Blank"/>
- <check_box label="Exibir pastas" name="show_folders_check"/>
- <search_editor label="Filtrar texturas" name="inventory search editor"/>
- <check_box label="Applicar agora" name="apply_immediate_check"/>
- <button label="Cancelar" label_selected="Cancelar" name="Cancel"/>
+ <button label="Nenhum" label_selected="Nenhum" name="None"/>
+ <filter_editor label="Filtrar texturas" name="inventory search editor"/>
+ <check_box initial_value="false" label="Exibir pastas" name="show_folders_check"/>
+ <button label="Adicionar" label_selected="Adicionar" name="l_add_btn"/>
+ <button label="Remover" label_selected="Remover" name="l_rem_btn"/>
+ <button label="Enviar" label_selected="Enviar" name="l_upl_btn"/>
+ <scroll_list name="l_name_list">
+ <column label="Nome" name="unit_name"/>
+ <column label="ID" name="unit_id_HIDDEN"/>
+ </scroll_list>
<button label="OK" label_selected="OK" name="Select"/>
- <string name="pick title">
- Pegar:
- </string>
+ <button label="Cancelar" label_selected="Cancelar" name="Cancel"/>
+ <check_box initial_value="true" label="Applicar agora" name="apply_immediate_check"/>
</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_texture_fetch_debugger.xml b/indra/newview/skins/default/xui/pt/floater_texture_fetch_debugger.xml
new file mode 100644
index 0000000000..f20d50362e
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/floater_texture_fetch_debugger.xml
@@ -0,0 +1,62 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="TexFetchDebugger" title="Depurador de obtenção de textura">
+ <text name="total_num_fetched_label">
+ 1, Número total de texturas obtidas: [NUM]
+ </text>
+ <text name="total_num_fetching_requests_label">
+ 2, Número total de solicitações de obtenção: [NUM]
+ </text>
+ <text name="total_num_cache_hits_label">
+ 3, Número total de acertos de cache: [NUM]
+ </text>
+ <text name="total_num_visible_tex_label">
+ 4, Número total de texturas visíveis: [NUM]
+ </text>
+ <text name="total_num_visible_tex_fetch_req_label">
+ 5, Número total de solicitações de obtenção de texturas visíveis: [NUM]
+ </text>
+ <text name="total_fetched_data_label">
+ 6, Número total de dados obtidos: [SIZE1]KB, Dados decodificados: [SIZE2]KB, [PIXEL]MPixels
+ </text>
+ <text name="total_fetched_vis_data_label">
+ 7, Número total de dados visíveis: [SIZE1]KB, Dados decodificados: [SIZE2]KB
+ </text>
+ <text name="total_fetched_rendered_data_label">
+ 8, Número total de dados renderizados: [SIZE1]KB, Dados decodificados: [SIZE2]KB, [PIXEL]MPixels
+ </text>
+ <text name="total_time_cache_read_label">
+ 9, Tempo total de leituras de cache: [TIME] segundos
+ </text>
+ <text name="total_time_cache_write_label">
+ 10, Tempo total de gravações em cache: [TIME] segundos
+ </text>
+ <text name="total_time_decode_label">
+ 11, Tempo total das decodificações: [TIME] segundos
+ </text>
+ <text name="total_time_gl_label">
+ 12, Tempo total de criação de texturas gl: [TIME] segundos
+ </text>
+ <text name="total_time_http_label">
+ 13, Tempo total de obtenção de HTTP: [TIME] segundos
+ </text>
+ <text name="total_time_fetch_label">
+ 14, Tempo total de obtenção completa: [TIME] segundos
+ </text>
+ <text name="total_time_refetch_vis_cache_label">
+ 15, Obtendo novamente visíveis do cache, Tempo: [TIME] segundos, Obtidos: [SIZE]KB, [PIXEL]MPixels
+ </text>
+ <text name="total_time_refetch_vis_http_label">
+ 16, Obtendo novamente visíveis do HTTP, Tempo: [TIME] segundos, Obtidos: [SIZE]KB, [PIXEL]MPixels
+ </text>
+ <spinner label="17, Proporção de texel/pixel:" name="texel_pixel_ratio"/>
+ <button label="Iniciar" name="start_btn"/>
+ <button label="Redefinir" name="clear_btn"/>
+ <button label="Fechar" name="close_btn"/>
+ <button label="Leitura do cache" name="cacheread_btn"/>
+ <button label="Gravação em cache" name="cachewrite_btn"/>
+ <button label="HTTP" name="http_btn"/>
+ <button label="Decodificar" name="decode_btn"/>
+ <button label="Textura GL" name="gl_btn"/>
+ <button label="Obter novamente cache visível" name="refetchviscache_btn"/>
+ <button label="Obter novamente HTTP visível" name="refetchvishttp_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_window_size.xml b/indra/newview/skins/default/xui/pt/floater_window_size.xml
index 6a8ccbd002..7deb799bd7 100644
--- a/indra/newview/skins/default/xui/pt/floater_window_size.xml
+++ b/indra/newview/skins/default/xui/pt/floater_window_size.xml
@@ -7,10 +7,17 @@
Definir tamanho da janela:
</text>
<combo_box name="window_size_combo" tool_tip="largura x altura">
- <combo_box.item label="1000 x 700 (padrão)" 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.item label="1000 x 700 (padrão)" name="item1"/>
+ <combo_box.item label="1024 x 768 (4:3 XGA)" name="item2"/>
+ <combo_box.item label="1280 x 720 (16:9 HDTV)" name="item3"/>
+ <combo_box.item label="1280 x 800 (5:8 WXGA)" name="item4"/>
+ <combo_box.item label="1280 x 1024 (5:4 SXGA)" name="item5"/>
+ <combo_box.item label="1440 x 900 (8:5 WSXGA)" name="item7"/>
+ <combo_box.item label="1600 x 900 (16:9 HD+)" name="item8"/>
+ <combo_box.item label="1600 x 1200 (4:3 UXGA)" name="item9"/>
+ <combo_box.item label="1680 x 1050 (8:5 WSXGA+)" name="item10"/>
+ <combo_box.item label="1920 x 1080 (16:9 HDTV)" name="item11"/>
+ <combo_box.item label="1920 x 1200 (8:5 WUXGA)" name="item12"/>
</combo_box>
<button label="Definir" name="set_btn"/>
<button label="Cancelar" name="cancel_btn"/>
diff --git a/indra/newview/skins/default/xui/pt/menu_viewer.xml b/indra/newview/skins/default/xui/pt/menu_viewer.xml
index fd973bf3c2..d93330e6df 100644
--- a/indra/newview/skins/default/xui/pt/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/pt/menu_viewer.xml
@@ -226,11 +226,10 @@
<menu_item_check label="Painel de textura" name="Texture Console"/>
<menu_item_check label="Console de depuração" name="Debug Console"/>
<menu_item_call label="Painel de avisos" name="Notifications"/>
- <menu_item_check label="Painel de tamanho de textura" name="Texture Size"/>
- <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="Painel de depuração de obtenção de textura" name="Texture Fetch Debug Console"/>
<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"/>
@@ -271,6 +270,12 @@
<menu_item_check label="Renderizar complexidade" name="rendercomplexity"/>
<menu_item_check label="Bytes do anexo" name="attachment bytes"/>
<menu_item_check label="Esculpir" name="Sculpt"/>
+ <menu label="Densidade da textura" name="Texture Density">
+ <menu_item_check label="Nenhuma" name="None"/>
+ <menu_item_check label="Atual" name="Current"/>
+ <menu_item_check label="Desejada" name="Desired"/>
+ <menu_item_check label="Completa" name="Full"/>
+ </menu>
</menu>
<menu label="Rendering" name="Rendering">
<menu_item_check label="Axes" name="Axes"/>
diff --git a/indra/newview/skins/default/xui/pt/notifications.xml b/indra/newview/skins/default/xui/pt/notifications.xml
index 3b39c0f92c..5484dd2007 100644
--- a/indra/newview/skins/default/xui/pt/notifications.xml
+++ b/indra/newview/skins/default/xui/pt/notifications.xml
@@ -357,7 +357,7 @@ Digite o nome de usuário de seu avatar.
É preciso ter uma conta para entrar no [SECOND_LIFE]. Deseja criar uma conta agora?
<url name="url">
- https://join.secondlife.com/index.php?lang=pt-BR
+ [create_account_url]
</url>
<usetemplate name="okcancelbuttons" notext="Tentar novamente" yestext="Abrir conta"/>
</notification>
@@ -489,6 +489,15 @@ Consultar [_URL] para mais informações?
</url>
<usetemplate ignoretext="O hardware do meu computador não é suportado" name="okcancelignore" notext="Não" yestext="Sim"/>
</notification>
+ <notification name="IntelOldDriver">
+ Provavelmente, há um driver mais recente para o seu chip gráfico. A atualização dos drivers gráficos pode melhorar significativamente o desempenho.
+
+ Visitar [_URL] para verificar se há atualizações do driver?
+ <url name="url">
+ http://www.intel.com/p/pt_BR/support/detect/graphics
+ </url>
+ <usetemplate ignoretext="Meu driver gráfico está desatualizado" name="okcancelignore" notext="Não" yestext="Sim"/>
+ </notification>
<notification name="UnknownGPU">
A placa de vídeo do seu sistema não é reconhecida pelo [APP_NAME].
Isto acontece quando novos hardwares que ainda não foram testados no [APP_NAME]. Talvez isso não cause problemas, mas pode ser preciso checar as configurações de vídeo.
@@ -1156,7 +1165,6 @@ Enquando isso, use o [SECOND_LIFE] normalmente. Seu visual será exibido correta
A instalação do [APP_NAME] está pronta.
Se você ainda não conhece o [SECOND_LIFE], basta criar uma conta para começar.
-Voltar para [http://join.secondlife.com secondlife.com] para criar sua conta?
<usetemplate name="okcancelbuttons" notext="Continuar" yestext="Nova conta.."/>
</notification>
<notification name="LoginPacketNeverReceived">
@@ -2596,16 +2604,12 @@ OK?
</form>
</notification>
<notification name="ScriptQuestionCaution">
- Um objeto chamado &apos;&lt;nolink&gt;[OBJECTNAME]&lt;/nolink&gt;&apos;&apos;, de &apos;[NAME]&apos;, gostaria de:
-
-[QUESTIONS]
-Se você não confia nos objetos deste autor, recuse-o.
-
-Deseja aceitar?
+ Aviso: O objeto &apos;&lt;nolink&gt;[OBJECTNAME]&lt;/nolink&gt;&apos; deseja obter acesso total à sua conta de dólares Linden. Se você conceder acesso, ele poderá remover fundos de sua conta a qualquer momento ou esvaziar sua conta completamente, continuamente e sem avisos adicionais.
+
+Esse tipo de pedido raramente é legítimo. Não conceda acesso se você não entender completamente por que ele deseja acessar sua conta.
<form name="form">
- <button name="Grant" text="Autorizar"/>
+ <button name="Grant" text="Permitir acesso total"/>
<button name="Deny" text="Negar"/>
- <button name="Details" text="Detalhes..."/>
</form>
</notification>
<notification name="ScriptDialog">
@@ -3096,4 +3100,16 @@ Outra opção é procurar por lugares com a tag &apos;Infohub&apos; no mapa.
<global name="You died and have been teleported to your home location">
Você morreu e foi reenviado ao seu início.
</global>
+ <notification name="LocalBitmapsUpdateFileNotFound">
+ Não foi possível atualizar [FNAME], pois o arquivo não pôde ser encontrado.
+Desabilitando atualizações futuras deste arquivo.
+ </notification>
+ <notification name="LocalBitmapsUpdateFailedFinal">
+ [FNAME] não pode ser aberto ou decodificado em [NRETRIES] tentativas, e agora é considerado corrompido.
+Desabilitando atualizações futuras deste arquivo.
+ </notification>
+ <notification name="LocalBitmapsVerifyFail">
+ Tentativa de adição de um formato de imagem inválido ou ilegível [FNAME] que não pode ser aberto ou decodificado.
+Tentativa cancelada.
+ </notification>
</notifications>
diff --git a/indra/newview/skins/default/xui/pt/panel_login.xml b/indra/newview/skins/default/xui/pt/panel_login.xml
index f4af6a7108..25a2c9fda0 100644
--- a/indra/newview/skins/default/xui/pt/panel_login.xml
+++ b/indra/newview/skins/default/xui/pt/panel_login.xml
@@ -1,13 +1,13 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="panel_login">
- <panel.string name="create_account_url">
- http://join.secondlife.com/
- </panel.string>
<panel.string name="forgot_password_url">
http://secondlife.com/account/request.php?lang=pt
</panel.string>
<layout_stack name="login_widgets">
<layout_panel name="login">
+ <text name="log_in_text">
+ CONECTAR
+ </text>
<text name="username_text">
Nome de usuário:
</text>
@@ -15,15 +15,8 @@
<text name="password_text">
Senha:
</text>
- <check_box label="Lembrar senha" name="remember_check"/>
- <button label="conectar" name="connect_btn"/>
- <text name="mode_selection_text">
- Modo:
- </text>
- <combo_box name="mode_combo" tool_tip="Selecione o modo. O modo Básico é mais rápido e ideal para explorar e conversar. Use o modo Avançado para acessar mais recursos.">
- <combo_box.item label="Básico" name="Basic"/>
- <combo_box.item label="Avançado" name="Advanced"/>
- </combo_box>
+ </layout_panel>
+ <layout_panel name="start_location_panel">
<text name="start_location_text">
Começar em:
</text>
@@ -32,16 +25,21 @@
<combo_box.item label="Meu início" name="MyHome"/>
</combo_box>
</layout_panel>
- <layout_panel name="links">
- <text name="create_new_account_text">
- Cadastre-se
+ <layout_panel name="links_login_panel">
+ <text name="login_help">
+ Precisa de ajuda ao conectar?
</text>
<text name="forgot_password_text">
Esqueceu seu nome ou senha?
</text>
- <text name="login_help">
- Precisa de ajuda ao conectar?
+ <button label="conectar" name="connect_btn"/>
+ <check_box label="Lembrar senha" name="remember_check"/>
+ </layout_panel>
+ <layout_panel name="links">
+ <text name="create_account_text">
+ CREATE YǾUR ACCǾUNT
</text>
+ <button name="create_new_account_btn" label="Cadastre-se"/>
</layout_panel>
</layout_stack>
</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_script_question_toast.xml b/indra/newview/skins/default/xui/pt/panel_script_question_toast.xml
new file mode 100644
index 0000000000..a2d0237da0
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/panel_script_question_toast.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<panel label="script_question_panel" name="panel_script_question_toast">
+ <panel label="buttons_panel" name="buttons_panel"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/pt/strings.xml b/indra/newview/skins/default/xui/pt/strings.xml
index 342a52356b..fd8f22f331 100644
--- a/indra/newview/skins/default/xui/pt/strings.xml
+++ b/indra/newview/skins/default/xui/pt/strings.xml
@@ -835,6 +835,9 @@ Pessoas com contas gratuitas não poderão acessar o Second Life no momento para
<string name="ScriptQuestionCautionChatDenied">
&apos;[OBJECTNAME]&apos;, um objeto de &apos;[OWNERNAME]&apos;, localizado em [REGIONNAME] a [REGIONPOS], teve permissão negada para: [PERMISSIONS].
</string>
+ <string name="AdditionalPermissionsRequestHeader">
+ Se você permitir acesso à sua conta, o objeto também poderá:
+ </string>
<string name="ScriptTakeMoney">
Tomar linden dólares (L$) de você
</string>
@@ -868,6 +871,9 @@ Pessoas com contas gratuitas não poderão acessar o Second Life no momento para
<string name="ControlYourCamera">
Controle sua camera
</string>
+ <string name="TeleportYourAgent">
+ Teletransportá-lo
+ </string>
<string name="SIM_ACCESS_PG">
Público geral
</string>
diff --git a/indra/newview/skins/default/xui/ru/floater_hardware_settings.xml b/indra/newview/skins/default/xui/ru/floater_hardware_settings.xml
index 7400f1df3b..43f8c36473 100644
--- a/indra/newview/skins/default/xui/ru/floater_hardware_settings.xml
+++ b/indra/newview/skins/default/xui/ru/floater_hardware_settings.xml
@@ -25,6 +25,10 @@
Включить VBO:
</text>
<check_box initial_value="иÑтина" label="Включить объекты вершинных буферов OpenGL" name="vbo" tool_tip="Включение Ñтого параметра на Ñовременном оборудовании даÑÑ‚ увеличение производительноÑти. Однако на Ñтаром оборудовании Ñто может привеÑти к Ñбою приложениÑ."/>
+ <text name="tc label">
+ Включить S3TC:
+ </text>
+ <check_box initial_value="true" label="Разрешить Ñжатие текÑтур (требует перезагрузки)" name="texture compression" tool_tip="Сжатие текÑтур в видеопамÑти, что позволÑет загружать текÑтуры большего размера за Ñчет некоторого Ð¿Ð°Ð´ÐµÐ½Ð¸Ñ ÐºÐ°Ñ‡ÐµÑтва цвета."/>
<slider label="ПамÑть Ð´Ð»Ñ Ñ‚ÐµÐºÑтур (Мб):" name="GraphicsCardTextureMemory" tool_tip="КоличеÑтво памÑти, отводимое Ð´Ð»Ñ Ñ‚ÐµÐºÑтур. По умолчанию равно памÑти видеокарты. Уменьшение поможет увеличить производительноÑть, но текÑтуры могут Ñтать размытыми."/>
<spinner label="ДиÑÑ‚Ð°Ð½Ñ†Ð¸Ñ Ñ‚ÑƒÐ¼Ð°Ð½Ð°:" name="fog"/>
<button label="OK" label_selected="OK" name="OK"/>
diff --git a/indra/newview/skins/default/xui/ru/floater_model_wizard.xml b/indra/newview/skins/default/xui/ru/floater_model_wizard.xml
deleted file mode 100644
index c1a63bf7da..0000000000
--- a/indra/newview/skins/default/xui/ru/floater_model_wizard.xml
+++ /dev/null
@@ -1,208 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Model Wizard" title="ПЕРЕДÐТЬ МÐСТЕР МОДЕЛИРОВÐÐИЯ">
- <button label="5. Передать" name="upload_btn"/>
- <button label="4. ПроÑмотр" name="review_btn"/>
- <button label="3. Физика" name="physics_btn"/>
- <button label="2. Оптимизировать" name="optimize_btn"/>
- <button label="1. Выбрать файл" name="choose_file_btn"/>
- <panel name="choose_file_panel">
- <panel name="choose_file_header_panel">
- <text name="choose_file_header_text">
- Выберите файл модели
- </text>
- </panel>
- <panel name="choose_file_content">
- <text name="advanced_users_text">
- ПользователÑм, работающим в раÑширенном режиме: еÑли вы умеете Ñоздавать трехмерные графичеÑкие объекты, то, возможно, захотите воÑпользоватьÑÑ ÑредÑтвом Advanced Uploader, которое предоÑтавлÑет раÑширенные возможноÑти передачи объектов.
- </text>
- <button label="Перейти в раÑширенный режим" name="switch_to_advanced"/>
- <text name="Cache location">
- Выберите файл модели Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ´Ð°Ñ‡Ð¸
- </text>
- <button label="Обзор..." label_selected="Обзор..." name="browse"/>
- <text name="Model types">
- Ð’ Second Life поддерживаютÑÑ Ñ„Ð°Ð¹Ð»Ñ‹ COLLADA (.dae)
- </text>
- <text name="dimensions">
- X Y Z
- </text>
- <text name="warning_label">
- Ð’ÐИМÐÐИЕ!
- </text>
- <text name="warning_text">
- Ð’Ñ‹ не Ñможете завершить передачу Ñтой модели на Ñерверы Second Life. [secondlife:///app/floater/learn_more Узнайте, как] наÑтроить в вашем аккаунте передачу Ñеточных моделей.
- </text>
- </panel>
- </panel>
- <panel name="optimize_panel">
- <panel name="optimize_header_panel">
- <text name="optimize_header_text">
- Оптимизировать модель
- </text>
- </panel>
- <text name="optimize_description">
- Мы оптимизировали модель Ð´Ð»Ñ Ð¿Ð¾Ð²Ñ‹ÑˆÐµÐ½Ð¸Ñ Ð±Ñ‹ÑтродейÑтвиÑ. По желанию можно выполнить дополнительную наÑтройку.
- </text>
- <panel name="optimize_content">
- <text name="high_detail_text">
- Создать уровень детализации: Ð’Ñ‹Ñокий
- </text>
- <text name="medium_detail_text">
- Создать уровень детализации: Средний
- </text>
- <text name="low_detail_text">
- Создать уровень детализации: Ðизкий
- </text>
- <text name="lowest_detail_text">
- Создать уровень детализации: Самый низкий
- </text>
- </panel>
- <panel name="content2">
- <button label="ПереÑчитать геометрию" name="recalculate_geometry_btn"/>
- <text name="lod_label">
- ПроÑмотр геометрии
- </text>
- <combo_box name="preview_lod_combo" tool_tip="Ð”ÐµÑ‚Ð°Ð»Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð¿Ñ€Ð¸ предварительном проÑмотре">
- <combo_item name="high">
- Детально
- </combo_item>
- <combo_item name="medium">
- СреднÑÑ Ð´ÐµÑ‚Ð°Ð»Ð¸Ð·Ð°Ñ†Ð¸Ñ
- </combo_item>
- <combo_item name="low">
- Мало деталей
- </combo_item>
- <combo_item name="lowest">
- Минимум деталей
- </combo_item>
- </combo_box>
- </panel>
- </panel>
- <panel name="physics_panel">
- <panel name="physics_header_panel">
- <text name="physics_header_text">
- ÐаÑтроить физичеÑкие параметры
- </text>
- </panel>
- <text name="physics_description">
- Мы Ñоздадим форму Ð´Ð»Ñ Ð²Ð½ÐµÑˆÐ½ÐµÐ³Ð¾ каркаÑа модели. ÐаÑтройте уровень детализации формы в ÑоответÑтвии Ñ Ñ†ÐµÐ»Ñми, Ð´Ð»Ñ ÐºÐ¾Ñ‚Ð¾Ñ€Ñ‹Ñ… предназначена модель.
- </text>
- <panel name="physics_content">
- <button label="ПереÑчитать физичеÑкие данные" name="recalculate_physics_btn"/>
- <button label="ПереÑчет..." name="recalculating_physics_btn"/>
- <text name="lod_label">
- ПроÑмотр физичеÑких данных
- </text>
- <combo_box name="preview_lod_combo2" tool_tip="Уровень детализации при предварительном проÑмотре">
- <combo_item name="high">
- Детально
- </combo_item>
- <combo_item name="medium">
- СреднÑÑ Ð´ÐµÑ‚Ð°Ð»Ð¸Ð·Ð°Ñ†Ð¸Ñ
- </combo_item>
- <combo_item name="low">
- Мало деталей
- </combo_item>
- <combo_item name="lowest">
- Минимум деталей
- </combo_item>
- </combo_box>
- </panel>
- </panel>
- <panel name="review_panel">
- <panel name="review_header_panel">
- <text name="review_header_text">
- ПроÑмотр
- </text>
- </panel>
- <panel name="review_content">
- <text name="review_prim_equiv">
- ВоздейÑтвие на учаÑток/регион: Ñквивалент в примитивах: [EQUIV]
- </text>
- <text name="review_fee">
- За передачу Ñ Ð²Ð°ÑˆÐµÐ³Ð¾ Ñчета будет ÑнÑта плата в размере L$[FEE].
- </text>
- <text name="review_confirmation">
- Ðажав кнопку «Передать», вы подтверждаете, что у Ð²Ð°Ñ ÐµÑть надлежащие права на вÑе ÑоÑтавлÑющие модели.
- </text>
- </panel>
- </panel>
- <panel name="upload_panel">
- <panel name="upload_header_panel">
- <text name="upload_header_text">
- Передача завершена
- </text>
- </panel>
- <text name="model_uploaded_text">
- Ваша модель передана.
- </text>
- <text name="inventory_text">
- ÐаходитÑÑ Ð² папке «Объекты» вашего инвентарÑ.
- </text>
- <text name="charged_fee">
- С вашего Ñчета ÑнÑто: L$[FEE].
- </text>
- </panel>
- <button label="&lt;&lt; Ðазад" name="back"/>
- <button label="Далее &gt;&gt;" name="next"/>
- <button label="РаÑÑчитать Ð²ÐµÑ Ð¸ плату &gt;&gt;" name="calculate"/>
- <button label="РаÑчет..." name="calculating"/>
- <button label="Передать" name="upload" tool_tip="Передать в ÑимулÑтор"/>
- <button label="Отмена" name="cancel"/>
- <button label="Закрыть" name="close"/>
- <spinner name="import_scale" value="1.0"/>
- <string name="status_idle">
- Ðеактивно
- </string>
- <string name="status_parse_error">
- Проблема при анализе файла DAE – Ñм. подробноÑти в журнале.
- </string>
- <string name="status_reading_file">
- Загрузка...
- </string>
- <string name="status_generating_meshes">
- СоздаютÑÑ Ð¼ÐµÑˆÐ¸...
- </string>
- <string name="status_vertex_number_overflow">
- Ошибка. ЧиÑло вершин превышает 65534. Прервано.
- </string>
- <string name="bad_element">
- Ошибка: недопуÑтимый Ñлемент
- </string>
- <string name="high">
- выÑокий
- </string>
- <string name="medium">
- Ñредний
- </string>
- <string name="low">
- низкий
- </string>
- <string name="lowest">
- Ñамый низкий
- </string>
- <string name="mesh_status_good">
- ДоÑтавлено!
- </string>
- <string name="mesh_status_na">
- Ð/Д
- </string>
- <string name="mesh_status_none">
- Ðет
- </string>
- <string name="mesh_status_submesh_mismatch">
- ОтличаетÑÑ Ñ‡Ð¸Ñло текÑтурируемых граней на уровнÑÑ… детализации.
- </string>
- <string name="mesh_status_mesh_mismatch">
- ОтличаетÑÑ Ñ‡Ð¸Ñло ÑкземплÑров меша на уровнÑÑ… детализации.
- </string>
- <string name="mesh_status_too_many_vertices">
- Слишком много вершин на уровне детализации.
- </string>
- <string name="mesh_status_missing_lod">
- ОтÑутÑтвует необходимый уровень детализации.
- </string>
- <string name="layer_all">
- Ð’Ñе
- </string>
-</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_stats.xml b/indra/newview/skins/default/xui/ru/floater_stats.xml
index b1f60c8029..2243c0f385 100644
--- a/indra/newview/skins/default/xui/ru/floater_stats.xml
+++ b/indra/newview/skins/default/xui/ru/floater_stats.xml
@@ -14,8 +14,11 @@
<stat_bar label="Треугольников в Ñекунду" name="ktrissec"/>
<stat_bar label="Ð’Ñего объектов" name="objs"/>
<stat_bar label="Ðовых объектов" name="newobjs"/>
+ <stat_bar label="ЧаÑтота попаданий в кÑш объектов" name="object_cache_hits"/>
</stat_view>
<stat_view label="ТекÑтура" name="texture">
+ <stat_bar label="ЧаÑтота попаданий в кÑш" name="texture_cache_hits"/>
+ <stat_bar label="Задержка Ñ‡Ñ‚ÐµÐ½Ð¸Ñ ÐºÑша" name="texture_cache_read_latency"/>
<stat_bar label="КоличеÑтво" name="numimagesstat"/>
<stat_bar label="Ðеобраб. изображений" name="numrawimagesstat"/>
<stat_bar label="ПамÑть GL" name="gltexmemstat"/>
diff --git a/indra/newview/skins/default/xui/ru/floater_texture_ctrl.xml b/indra/newview/skins/default/xui/ru/floater_texture_ctrl.xml
index d55daea836..f8693b8359 100644
--- a/indra/newview/skins/default/xui/ru/floater_texture_ctrl.xml
+++ b/indra/newview/skins/default/xui/ru/floater_texture_ctrl.xml
@@ -9,15 +9,26 @@
<text name="Multiple">
ÐеÑколько текÑтур
</text>
+ <radio_group name="mode_selection">
+ <radio_item label="Инвентарь" name="inventory" value="0"/>
+ <radio_item label="Локально" name="local" value="1"/>
+ </radio_group>
<text name="unknown">
Размер: [DIMENSIONS]
</text>
<button label="По умолчанию" label_selected="По умолчанию" name="Default"/>
- <button label="Ðет" label_selected="Ðет" name="None"/>
<button label="ОчиÑтить" label_selected="ОчиÑтить" name="Blank"/>
- <check_box initial_value="иÑтина" label="Применить ÑейчаÑ" name="apply_immediate_check"/>
+ <button label="Ðет" label_selected="Ðет" name="None"/>
<filter_editor label="Фильтровать текÑтуры" name="inventory search editor"/>
<check_box initial_value="ложь" label="Показывать папки" name="show_folders_check"/>
+ <button label="Добавить" label_selected="Добавить" name="l_add_btn"/>
+ <button label="Удалить" label_selected="Удалить" name="l_rem_btn"/>
+ <button label="Передать" label_selected="Передать" name="l_upl_btn"/>
+ <scroll_list name="l_name_list">
+ <column label="ИмÑ" name="unit_name"/>
+ <column label="ID" name="unit_id_HIDDEN"/>
+ </scroll_list>
<button label="ОК" label_selected="ОК" name="Select"/>
<button label="Отмена" label_selected="Отмена" name="Cancel"/>
+ <check_box initial_value="иÑтина" label="Применить ÑейчаÑ" name="apply_immediate_check"/>
</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_texture_fetch_debugger.xml b/indra/newview/skins/default/xui/ru/floater_texture_fetch_debugger.xml
new file mode 100644
index 0000000000..034106f24c
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_texture_fetch_debugger.xml
@@ -0,0 +1,62 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="TexFetchDebugger" title="Отладчик Ð¸Ð·Ð²Ð»ÐµÑ‡ÐµÐ½Ð¸Ñ Ñ‚ÐµÐºÑтур">
+ <text name="total_num_fetched_label">
+ 1, Общее количеÑтво извлеченных текÑтур: [NUM]
+ </text>
+ <text name="total_num_fetching_requests_label">
+ 2, Общее количеÑтво запроÑов на извлечение: [NUM]
+ </text>
+ <text name="total_num_cache_hits_label">
+ 3, Общее количеÑтво попаданий в кÑш: [NUM]
+ </text>
+ <text name="total_num_visible_tex_label">
+ 4, Общее количеÑтво видимых текÑтур: [NUM]
+ </text>
+ <text name="total_num_visible_tex_fetch_req_label">
+ 5, Общее количеÑтво запроÑов на извлечение видимых текÑтур: [NUM]
+ </text>
+ <text name="total_fetched_data_label">
+ 6, Общий объем извлеченных данных: [SIZE1] КБ, декодированные данные: [SIZE2] КБ, [PIXEL] МпикÑелов
+ </text>
+ <text name="total_fetched_vis_data_label">
+ 7, Общий объем видимых данных: [SIZE1] КБ, декодированные данные: [SIZE2] КБ
+ </text>
+ <text name="total_fetched_rendered_data_label">
+ 8, Общий объем визуализированных данных: [SIZE1] КБ, декодированные данные: [SIZE2] КБ, [PIXEL] МпикÑелов
+ </text>
+ <text name="total_time_cache_read_label">
+ 9, Общее Ð²Ñ€ÐµÐ¼Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ Ð¸Ð· кÑша: [TIME] Ñ
+ </text>
+ <text name="total_time_cache_write_label">
+ 10, Общее Ð²Ñ€ÐµÐ¼Ñ Ð·Ð°Ð¿Ð¸Ñи в кÑш: [TIME] Ñ
+ </text>
+ <text name="total_time_decode_label">
+ 11, Общее Ð²Ñ€ÐµÐ¼Ñ Ð´ÐµÐºÐ¾Ð´Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ: [TIME] Ñ
+ </text>
+ <text name="total_time_gl_label">
+ 12, Общее Ð²Ñ€ÐµÐ¼Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ñ‚ÐµÐºÑтур: [TIME] Ñ
+ </text>
+ <text name="total_time_http_label">
+ 13, Общее Ð²Ñ€ÐµÐ¼Ñ HTTP-извлечениÑ: [TIME] Ñ
+ </text>
+ <text name="total_time_fetch_label">
+ 14, Общее Ð²Ñ€ÐµÐ¼Ñ Ð¿Ð¾Ð»Ð½Ð¾Ð³Ð¾ извлечениÑ: [TIME] Ñ
+ </text>
+ <text name="total_time_refetch_vis_cache_label">
+ 15, Повторное извлечение из кÑша, времÑ: [TIME] Ñ, извлечено: [SIZE] КБ, [PIXEL] МпикÑелов
+ </text>
+ <text name="total_time_refetch_vis_http_label">
+ 16, Повторное извлечение из HTTP, времÑ: [TIME] Ñ, извлечено: [SIZE] КБ, [PIXEL] МпикÑелов
+ </text>
+ <spinner label="17, Отношение текÑелы/пикÑелы" name="texel_pixel_ratio"/>
+ <button label="ПуÑк" name="start_btn"/>
+ <button label="СброÑ" name="clear_btn"/>
+ <button label="Закрыть" name="close_btn"/>
+ <button label="Чтение кÑша" name="cacheread_btn"/>
+ <button label="ЗапиÑÑŒ в кÑш" name="cachewrite_btn"/>
+ <button label="HTTP" name="http_btn"/>
+ <button label="Декодировать" name="decode_btn"/>
+ <button label="ТекÑтура GL" name="gl_btn"/>
+ <button label="Повторно извлечь из кÑша" name="refetchviscache_btn"/>
+ <button label="Повторно извлечь из HTTP" name="refetchvishttp_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_window_size.xml b/indra/newview/skins/default/xui/ru/floater_window_size.xml
index 24865a6ba5..fbff6a72b2 100644
--- a/indra/newview/skins/default/xui/ru/floater_window_size.xml
+++ b/indra/newview/skins/default/xui/ru/floater_window_size.xml
@@ -7,10 +7,17 @@
Задать размер окна:
</text>
<combo_box name="window_size_combo" tool_tip="ширина x выÑота">
- <combo_box.item label="1000 x 700 (по умолчанию)" name="item0"/>
- <combo_box.item label="1024 x 768" name="item1"/>
- <combo_box.item label="1280 x 720 (720p)" name="item2"/>
- <combo_box.item label="1920 x 1080 (1080p)" name="item3"/>
+ <combo_box.item label="1000 x 700 (по умолчанию)" name="item1"/>
+ <combo_box.item label="1024 x 768 (4:3 XGA)" name="item2"/>
+ <combo_box.item label="1280 x 720 (16:9 HDTV)" name="item3"/>
+ <combo_box.item label="1280 x 800 (5:8 WXGA)" name="item4"/>
+ <combo_box.item label="1280 x 1024 (5:4 WXGA)" name="item5"/>
+ <combo_box.item label="1440 x 900 (8:5 WSXGA)" name="item7"/>
+ <combo_box.item label="1600 x 900 (16:9 HD+)" name="item8"/>
+ <combo_box.item label="1600 x 1200 (4:3 UXGA)" name="item9"/>
+ <combo_box.item label="1680 x 1050 (8:5 WSXGA)" name="item10"/>
+ <combo_box.item label="1920 x 1080 (16:9 HDTV)" name="item11"/>
+ <combo_box.item label="1920 x 1200 (8:5 UXGA)" name="item12"/>
</combo_box>
<button label="Задать" name="set_btn"/>
<button label="Отмена" name="cancel_btn"/>
diff --git a/indra/newview/skins/default/xui/ru/menu_viewer.xml b/indra/newview/skins/default/xui/ru/menu_viewer.xml
index 0699314d97..701f097ddb 100644
--- a/indra/newview/skins/default/xui/ru/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/ru/menu_viewer.xml
@@ -225,11 +225,10 @@
<menu_item_check label="КонÑоль текÑтур" name="Texture Console"/>
<menu_item_check label="КонÑоль отладки" name="Debug Console"/>
<menu_item_call label="КонÑоль уведомлений" name="Notifications"/>
- <menu_item_check label="КонÑоль размера текÑтуры" name="Texture Size"/>
- <menu_item_check label="КонÑоль категории текÑтуры" name="Texture Category"/>
<menu_item_check label="Оперативные таймеры" name="Fast Timers"/>
<menu_item_check label="ПамÑть" name="Memory"/>
<menu_item_check label="СтатиÑтика по Ñцене" name="Scene Statistics"/>
+ <menu_item_call label="КонÑоль отладки Ð¸Ð·Ð²Ð»ÐµÑ‡ÐµÐ½Ð¸Ñ Ñ‚ÐµÐºÑтур" name="Texture Fetch Debug Console"/>
<menu_item_call label="Данные о регионе на конÑоль отладки" name="Region Info to Debug Console"/>
<menu_item_call label="Данны о группе на конÑоль отладки" name="Group Info to Debug Console"/>
<menu_item_call label="Данные о ÑпоÑобноÑÑ‚ÑÑ… на конÑоль отладки" name="Capabilities Info to Debug Console"/>
@@ -287,6 +286,12 @@
<menu_item_check label="СложноÑть визуализации" name="rendercomplexity"/>
<menu_item_check label="Байты приÑоединениÑ" name="attachment bytes"/>
<menu_item_check label="Лепка" name="Sculpt"/>
+ <menu label="ПлотноÑть текÑтуры" name="Texture Density">
+ <menu_item_check label="Ðет" name="None"/>
+ <menu_item_check label="ТекущаÑ" name="Current"/>
+ <menu_item_check label="ЖелаемаÑ" name="Desired"/>
+ <menu_item_check label="ПолнаÑ" name="Full"/>
+ </menu>
</menu>
<menu label="ВизуализациÑ" name="Rendering">
<menu_item_check label="ОÑи" name="Axes"/>
@@ -304,7 +309,6 @@
<menu_item_check label="ТекÑтуры анимаций" name="Animation Textures"/>
<menu_item_check label="Отключить текÑтуры" name="Disable Textures"/>
<menu_item_check label="ТекÑтуры в полном разрешении" name="Rull Res Textures"/>
- <menu_item_check label="Проверить текÑтуры" name="Audit Textures"/>
<menu_item_check label="ÐÑ‚Ð»Ð°Ñ Ñ‚ÐµÐºÑтур (ÑкÑÐ¿ÐµÑ€Ð¸Ð¼ÐµÐ½Ñ‚Ð°Ð»ÑŒÐ½Ð°Ñ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ)" name="Texture Atlas"/>
<menu_item_check label="Ð’Ð¸Ð·ÑƒÐ°Ð»Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð¿Ñ€Ð¸Ñоединенных иÑточников Ñвета" name="Render Attached Lights"/>
<menu_item_check label="Ð’Ð¸Ð·ÑƒÐ°Ð»Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð¿Ñ€Ð¸Ñоединенных чаÑтиц" name="Render Attached Particles"/>
diff --git a/indra/newview/skins/default/xui/ru/notifications.xml b/indra/newview/skins/default/xui/ru/notifications.xml
index b4692385d1..d4b3c06719 100644
--- a/indra/newview/skins/default/xui/ru/notifications.xml
+++ b/indra/newview/skins/default/xui/ru/notifications.xml
@@ -360,7 +360,7 @@
Ð”Ð»Ñ Ð²Ñ…Ð¾Ð´Ð° в [SECOND_LIFE] нужен аккаунт. Создать его?
<url name="url">
- http://join.secondlife.com/
+ [create_account_url]
</url>
<usetemplate name="okcancelbuttons" notext="Повторить попытку" yestext="Создать новый аккаунт"/>
</notification>
@@ -495,6 +495,15 @@
</url>
<usetemplate ignoretext="Оборудование моего компьютера не поддерживаетÑÑ" name="okcancelignore" notext="Ðет" yestext="Да"/>
</notification>
+ <notification name="IntelOldDriver">
+ Возможно, Ð´Ð»Ñ Ð²Ð°ÑˆÐµÐ¹ видеокарты имеетÑÑ Ð±Ð¾Ð»ÐµÐµ новый драйвер. Обновление драйвера может ÑущеÑтвенно повыÑить быÑтродейÑтвие.
+
+ Проверить наличие Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ð´Ñ€Ð°Ð¹Ð²ÐµÑ€Ð° по адреÑу [_URL]?
+ <url name="url">
+ http://www.intel.com/p/ru_RU/support/detect/graphics
+ </url>
+ <usetemplate ignoretext="Мой графичеÑкий драйвер уÑтарел" name="okcancelignore" notext="Ðет" yestext="Да"/>
+ </notification>
<notification name="UnknownGPU">
Ð’ вашей ÑиÑтеме уÑтановлена графичеÑÐºÐ°Ñ ÐºÐ°Ñ€Ñ‚Ð°, которую [APP_NAME] не может раÑпознать.
Так чаÑто бывает, еÑли новое оборудование еще не было проверено на работу Ñ [APP_NAME]. Скорее вÑего, оно будет работать нормально, но, возможно, придетÑÑ Ð¾Ñ‚Ñ€ÐµÐ³ÑƒÐ»Ð¸Ñ€Ð¾Ð²Ð°Ñ‚ÑŒ параметры графики.
@@ -1167,7 +1176,6 @@
УÑтановка [APP_NAME] завершена.
ЕÑли вы иÑпользуете [SECOND_LIFE] впервые, Ð´Ð»Ñ Ð²Ñ…Ð¾Ð´Ð° в программу вам потребуетÑÑ Ñоздать аккаунт.
-ВернутьÑÑ Ð½Ð° [http://join.secondlife.com secondlife.com] Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð°ÐºÐºÐ°ÑƒÐ½Ñ‚Ð°?
<usetemplate name="okcancelbuttons" notext="Продолжить" yestext="Создать аккаунт..."/>
</notification>
<notification name="LoginPacketNeverReceived">
@@ -2614,16 +2622,12 @@ http://secondlife.com/download.
</form>
</notification>
<notification name="ScriptQuestionCaution">
- Объект «&lt;nolink&gt;[OBJECTNAME]&lt;/nolink&gt;», владелец которого – «[NAME]», желает:
-
-[QUESTIONS]
-ЕÑли вы не доверÑете Ñтому объекту или его Ñоздателю, отклоните запроÑ.
-
-ПринÑть Ñтот запроÑ?
+ Предупреждение. Объект «&lt;nolink&gt;[OBJECTNAME]&lt;/nolink&gt;» требует полного доÑтупа к вашему аккаунту Ð´Ð»Ñ Linden-долларов. ЕÑли разрешить такой доÑтуп, объект Ñможет в любое Ð²Ñ€ÐµÐ¼Ñ Ñнимать ÑредÑтва Ñ Ð²Ð°ÑˆÐµÐ³Ð¾ аккаунта или полноÑтью опуÑтошать его неоднократно и без предупреждениÑ.
+
+Такое требование чаще вÑего незаконно. Ðе разрешайте доÑтуп к Ñвоему аккаунту, еÑли только не полноÑтью оÑознаете, зачем он нужен Ñтому объекту.
<form name="form">
- <button name="Grant" text="ПринÑть"/>
+ <button name="Grant" text="Разрешить полный доÑтуп"/>
<button name="Deny" text="Отклонить"/>
- <button name="Details" text="ПодробноÑти..."/>
</form>
</notification>
<notification name="ScriptDialog">
@@ -3122,4 +3126,16 @@ http://secondlife.com/download.
<global name="You died and have been teleported to your home location">
Ð’Ñ‹ умерли и были телепортированы в ваше домашнее меÑтоположение.
</global>
+ <notification name="LocalBitmapsUpdateFileNotFound">
+ Ðе удалоÑÑŒ обновить [FNAME]: файл не найден.
+ПоÑледующее обновление Ñтого файла запрещаетÑÑ.
+ </notification>
+ <notification name="LocalBitmapsUpdateFailedFinal">
+ Ðе удалоÑÑŒ открыть или декодировать [FNAME] Ñ [NRETRIES] попыток. Этот файл ÑчитаетÑÑ Ð¿Ð¾Ð²Ñ€ÐµÐ¶Ð´ÐµÐ½Ð½Ñ‹Ð¼.
+ПоÑледующее обновление Ñтого файла запрещаетÑÑ.
+ </notification>
+ <notification name="LocalBitmapsVerifyFail">
+ Попытка добавить недопуÑтимый или нечитаемый файл Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ [FNAME], который не удалоÑÑŒ открыть или декодировать.
+Попытка отменена.
+ </notification>
</notifications>
diff --git a/indra/newview/skins/default/xui/ru/panel_login.xml b/indra/newview/skins/default/xui/ru/panel_login.xml
index 7928191fa6..7ead924c1f 100644
--- a/indra/newview/skins/default/xui/ru/panel_login.xml
+++ b/indra/newview/skins/default/xui/ru/panel_login.xml
@@ -1,13 +1,13 @@
<?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="log_in_text">
+ ВОЙТИ
+ </text>
<text name="username_text">
Ð˜Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ:
</text>
@@ -15,15 +15,8 @@
<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>
+ </layout_panel>
+ <layout_panel name="start_location_panel">
<text name="start_location_text">
МеÑто Ñтарта:
</text>
@@ -33,16 +26,21 @@
<combo_box.item label="&lt;Введите название региона&gt;" name="Typeregionname"/>
</combo_box>
</layout_panel>
- <layout_panel name="links">
- <text name="create_new_account_text">
- РегиÑтрациÑ
+ <layout_panel name="links_login_panel">
+ <text name="login_help">
+ Ðужна помощь при входе?
</text>
<text name="forgot_password_text">
Забыли Ð¸Ð¼Ñ Ð¸Ð»Ð¸ пароль?
</text>
- <text name="login_help">
- Ðужна помощь при входе?
+ <button label="Войти" name="connect_btn"/>
+ <check_box label="Запомнить пароль" name="remember_check"/>
+ </layout_panel>
+ <layout_panel name="links">
+ <text name="create_account_text">
+ CREATE YǾUR ACCǾUNT
</text>
+ <button name="create_new_account_btn" label="РегиÑтрациÑ"/>
</layout_panel>
</layout_stack>
</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_script_question_toast.xml b/indra/newview/skins/default/xui/ru/panel_script_question_toast.xml
new file mode 100644
index 0000000000..a2d0237da0
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_script_question_toast.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<panel label="script_question_panel" name="panel_script_question_toast">
+ <panel label="buttons_panel" name="buttons_panel"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/strings.xml b/indra/newview/skins/default/xui/ru/strings.xml
index 8dbc4f092d..78e4b134fb 100644
--- a/indra/newview/skins/default/xui/ru/strings.xml
+++ b/indra/newview/skins/default/xui/ru/strings.xml
@@ -137,7 +137,7 @@
Выйти
</string>
<string name="create_account_url">
- http://join.secondlife.com/
+ http://join.secondlife.com/index.php?lang=ru-RU
</string>
<string name="LoginFailedViewerNotPermitted">
У клиента, которым вы пользуетеÑÑŒ, больше нет доÑтупа к игре Second Life. Загрузить новую верÑию клиента можно по адреÑу
@@ -883,6 +883,9 @@ support@secondlife.com.
<string name="ScriptQuestionCautionChatDenied">
Объекту «[OBJECTNAME]», который принадлежит пользователю «[OWNERNAME]» и находитÑÑ Ð² [REGIONPOS] в регионе «[REGIONNAME]», отказано в разрешении: [PERMISSIONS].
</string>
+ <string name="AdditionalPermissionsRequestHeader">
+ Разрешив доÑтуп к Ñвоему аккаунту, вы также разрешите объекту:
+ </string>
<string name="ScriptTakeMoney">
У Ð²Ð°Ñ Ð±ÐµÑ€ÑƒÑ‚ Linden-деньги
</string>
@@ -916,6 +919,9 @@ support@secondlife.com.
<string name="ControlYourCamera">
УправлÑть камерой
</string>
+ <string name="TeleportYourAgent">
+ Телепортировать ваÑ
+ </string>
<string name="NotConnected">
Ðет подключениÑ
</string>
diff --git a/indra/newview/skins/default/xui/tr/floater_hardware_settings.xml b/indra/newview/skins/default/xui/tr/floater_hardware_settings.xml
index 8e056b9b0d..b204389083 100644
--- a/indra/newview/skins/default/xui/tr/floater_hardware_settings.xml
+++ b/indra/newview/skins/default/xui/tr/floater_hardware_settings.xml
@@ -25,6 +25,10 @@
VBO EtkinleÅŸtir:
</text>
<check_box initial_value="true" label="OpenGL Vertex Tampon Nesnelerini Etkinleştir" name="vbo" tool_tip="Modern donanımlarda bunun etkinleştirilmesi performans artışı sağlar. Ancak, eski donanımlardaki VBO uygulamaları yetersizdir ve etkinleştirildiğinde bilgisayarınız çökebilir."/>
+ <text name="tc label">
+ S3TC&apos;ü Etkinleştir:
+ </text>
+ <check_box initial_value="true" label="Doku Sıkıştırmasını Etkinleştir (yeniden başlatma gerektirir)" name="texture compression" tool_tip="Video bellekteki dokuları sıkıştırır, renk kalitesinde bazı kayıplar olmasına karşın daha yüksek çözünürlükte dokuların yüklenmesine imkan tanır."/>
<slider label="Doku Belleği (MB):" name="GraphicsCardTextureMemory" tool_tip="Dokular için tahsis edilecek bellek miktarı. Varsayılan değer video kartı belleğidir. Bu değerin küçültülmesi performansı artırabilir, ama ayrıca dokuları bulanıklaştırabilir."/>
<spinner label="Sis Mesafe Oranı:" name="fog"/>
<button label="Tamam" label_selected="Tamam" name="OK"/>
diff --git a/indra/newview/skins/default/xui/tr/floater_model_wizard.xml b/indra/newview/skins/default/xui/tr/floater_model_wizard.xml
deleted file mode 100644
index 9d8b982c24..0000000000
--- a/indra/newview/skins/default/xui/tr/floater_model_wizard.xml
+++ /dev/null
@@ -1,208 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Model Wizard" title="KARŞIYA MODEL YÜKLEME SİHİRBAZI">
- <button label="5. Karşıya Yükle" name="upload_btn"/>
- <button label="4. İncele" name="review_btn"/>
- <button label="3. Fizik" name="physics_btn"/>
- <button label="2. Optimize et" name="optimize_btn"/>
- <button label="1. Dosya Seç" name="choose_file_btn"/>
- <panel name="choose_file_panel">
- <panel name="choose_file_header_panel">
- <text name="choose_file_header_text">
- Model dosyasını seçin
- </text>
- </panel>
- <panel name="choose_file_content">
- <text name="advanced_users_text">
- Gelişmiş kullanıcılar: Eğer 3B içerik oluşturma araçlarını kullanmayı biliyorsanız, Gelişmiş Karşıya Yükleyiciyi kullanmak isteyebilirsiniz.
- </text>
- <button label="Gelişmişe geç" name="switch_to_advanced"/>
- <text name="Cache location">
- Karşıya yüklenecek model dosyasını seçin
- </text>
- <button label="Gözat..." label_selected="Gözat..." name="browse"/>
- <text name="Model types">
- Second Life, COLLADA (.dae) dosyalarını destekler
- </text>
- <text name="dimensions">
- X Y Z
- </text>
- <text name="warning_label">
- UYARI:
- </text>
- <text name="warning_text">
- Bu modelin Second Life sunucularına nihai karşıya yükleme adımını tamamlayamayacaksınız. Hesabınızı örgü modellerinin karşıya yüklenmesi için ayarlamanın [secondlife:///app/floater/learn_more nasıl yapılacağını öğrenin].
- </text>
- </panel>
- </panel>
- <panel name="optimize_panel">
- <panel name="optimize_header_panel">
- <text name="optimize_header_text">
- Modeli optimize et
- </text>
- </panel>
- <text name="optimize_description">
- Modeli performans için optimize ettik. İstiyorsanız daha da ayarlayabilirsiniz.
- </text>
- <panel name="optimize_content">
- <text name="high_detail_text">
- Ayrıntı Seviyesi Oluştur: Yüksek
- </text>
- <text name="medium_detail_text">
- Ayrıntı Seviyesi Oluştur: Orta
- </text>
- <text name="low_detail_text">
- Ayrıntı Seviyesi Oluştur: Düşük
- </text>
- <text name="lowest_detail_text">
- Ayrıntı Seviyesi Oluştur: En Düşük
- </text>
- </panel>
- <panel name="content2">
- <button label="Geometri hesaplarını tekrar yap" name="recalculate_geometry_btn"/>
- <text name="lod_label">
- Geometri önizleme
- </text>
- <combo_box name="preview_lod_combo" tool_tip="Önizleme işlemesinde görülecek ayrıntı seviyesi">
- <combo_item name="high">
- Çok ayrıntı
- </combo_item>
- <combo_item name="medium">
- Orta düzey ayrıntı
- </combo_item>
- <combo_item name="low">
- Az ayrıntı
- </combo_item>
- <combo_item name="lowest">
- En az ayrıntı
- </combo_item>
- </combo_box>
- </panel>
- </panel>
- <panel name="physics_panel">
- <panel name="physics_header_panel">
- <text name="physics_header_text">
- Fizik ayarlarını yap
- </text>
- </panel>
- <text name="physics_description">
- Modelin dış gövdesi için bir şekil oluşturacağız. Modelinizin amacına uygun olarak şeklin ayrıntı seviyesini belirleyin.
- </text>
- <panel name="physics_content">
- <button label="Fizik hesaplarını tekrar yap" name="recalculate_physics_btn"/>
- <button label="Tekrar hesaplanıyor..." name="recalculating_physics_btn"/>
- <text name="lod_label">
- Fizik önizleme
- </text>
- <combo_box name="preview_lod_combo2" tool_tip="Önizleme işlemesinde görülecek ayrıntı seviyesi">
- <combo_item name="high">
- Çok ayrıntı
- </combo_item>
- <combo_item name="medium">
- Orta düzey ayrıntı
- </combo_item>
- <combo_item name="low">
- Az ayrıntı
- </combo_item>
- <combo_item name="lowest">
- En az ayrıntı
- </combo_item>
- </combo_box>
- </panel>
- </panel>
- <panel name="review_panel">
- <panel name="review_header_panel">
- <text name="review_header_text">
- İncele
- </text>
- </panel>
- <panel name="review_content">
- <text name="review_prim_equiv">
- Parsele/bölgeye etkisi: [EQUIV] prim eşdeğerleri
- </text>
- <text name="review_fee">
- Hesabınızdan L$ [FEE] karşıya yükleme ücreti düşülecektir.
- </text>
- <text name="review_confirmation">
- Karşıya yükleme düğmesine tıkladığınızda, modelde yer alan malzeme için ilgili haklara sahip olduğunuzu teyid edersiniz.
- </text>
- </panel>
- </panel>
- <panel name="upload_panel">
- <panel name="upload_header_panel">
- <text name="upload_header_text">
- Karşıya yükleme bitti
- </text>
- </panel>
- <text name="model_uploaded_text">
- Modeliniz karşıya yüklendi.
- </text>
- <text name="inventory_text">
- Bunu, envanterinizdeki Nesneler klasöründe bulacaksınız.
- </text>
- <text name="charged_fee">
- Hesabınızdan L$ [FEE] düşüldü.
- </text>
- </panel>
- <button label="&lt;&lt; Geri" name="back"/>
- <button label="Sonraki &gt;&gt;" name="next"/>
- <button label="Ağırlıkları ve ücreti hesapla &gt;&gt;" name="calculate"/>
- <button label="Hesaplanıyor..." name="calculating"/>
- <button label="Karşıya Yükle" name="upload" tool_tip="Simülatöre karşıya yükle"/>
- <button label="İptal" name="cancel"/>
- <button label="Kapat" name="close"/>
- <spinner name="import_scale" value="1.0"/>
- <string name="status_idle">
- BoÅŸta
- </string>
- <string name="status_parse_error">
- Dae ayrıştırma sorunu - ayrıntılar için günlüğe bakın.
- </string>
- <string name="status_reading_file">
- Yükleniyor...
- </string>
- <string name="status_generating_meshes">
- Örgüler Oluşturuluyor...
- </string>
- <string name="status_vertex_number_overflow">
- Hata: Köşe numarası 65534&apos;ten fazla, işlem durduruldu!
- </string>
- <string name="bad_element">
- Hata: Öğe geçersiz
- </string>
- <string name="high">
- Yüksek
- </string>
- <string name="medium">
- Orta
- </string>
- <string name="low">
- Düşük
- </string>
- <string name="lowest">
- En Düşük
- </string>
- <string name="mesh_status_good">
- Uygula!
- </string>
- <string name="mesh_status_na">
- G/D
- </string>
- <string name="mesh_status_none">
- Hiçbiri
- </string>
- <string name="mesh_status_submesh_mismatch">
- Ayrıntı seviyelerinde farklı sayıda dokulanabilir yüz var.
- </string>
- <string name="mesh_status_mesh_mismatch">
- Ayrıntı seviyelerinde farklı sayıda örgü örneği var.
- </string>
- <string name="mesh_status_too_many_vertices">
- Ayrıntı seviyesinde fazla sayıda köşe var.
- </string>
- <string name="mesh_status_missing_lod">
- Gereken ayrıntı seviyesi eksik.
- </string>
- <string name="layer_all">
- Tümü
- </string>
-</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_stats.xml b/indra/newview/skins/default/xui/tr/floater_stats.xml
index 17f1166c46..e3f54fc338 100644
--- a/indra/newview/skins/default/xui/tr/floater_stats.xml
+++ b/indra/newview/skins/default/xui/tr/floater_stats.xml
@@ -14,8 +14,11 @@
<stat_bar label="Saniyede Bir Çizilen Üçgenler" name="ktrissec"/>
<stat_bar label="Toplam Nesne" name="objs"/>
<stat_bar label="Yeni Nesne" name="newobjs"/>
+ <stat_bar label="Nesne Önbellek İsabet Oranı" name="object_cache_hits"/>
</stat_view>
<stat_view label="Doku" name="texture">
+ <stat_bar label="Önbellek İsabet Oranı" name="texture_cache_hits"/>
+ <stat_bar label="Önbellek Okuma Gecikme Süresi" name="texture_cache_read_latency"/>
<stat_bar label="Sayım" name="numimagesstat"/>
<stat_bar label="Ham Sayım" name="numrawimagesstat"/>
<stat_bar label="GL BelleÄŸi" name="gltexmemstat"/>
diff --git a/indra/newview/skins/default/xui/tr/floater_texture_ctrl.xml b/indra/newview/skins/default/xui/tr/floater_texture_ctrl.xml
index 4ef789f585..67bf9071b3 100644
--- a/indra/newview/skins/default/xui/tr/floater_texture_ctrl.xml
+++ b/indra/newview/skins/default/xui/tr/floater_texture_ctrl.xml
@@ -9,15 +9,26 @@
<text name="Multiple">
Birden çok doku
</text>
+ <radio_group name="mode_selection">
+ <radio_item label="Envanter" name="inventory" value="0"/>
+ <radio_item label="Yerel" name="local" value="1"/>
+ </radio_group>
<text name="unknown">
Büyüklük: [DIMENSIONS]
</text>
<button label="Varsayılan" label_selected="Varsayılan" name="Default"/>
- <button label="Hiçbiri" label_selected="Hiçbiri" name="None"/>
<button label="BoÅŸ" label_selected="BoÅŸ" name="Blank"/>
- <check_box initial_value="true" label="Åžimdi uygula" name="apply_immediate_check"/>
+ <button label="Hiçbiri" label_selected="Hiçbiri" name="None"/>
<filter_editor label="Dokuları Filtrele" name="inventory search editor"/>
<check_box initial_value="false" label="Klasörleri göster" name="show_folders_check"/>
+ <button label="Ekle" label_selected="Ekle" name="l_add_btn"/>
+ <button label="Kaldır" label_selected="Kaldır" name="l_rem_btn"/>
+ <button label="Karşıya Yükle" label_selected="Karşıya Yükle" name="l_upl_btn"/>
+ <scroll_list name="l_name_list">
+ <column label="Ad" name="unit_name"/>
+ <column label="Kimlik" name="unit_id_HIDDEN"/>
+ </scroll_list>
<button label="Tamam" label_selected="Tamam" name="Select"/>
<button label="İptal" label_selected="İptal" name="Cancel"/>
+ <check_box initial_value="true" label="Åžimdi uygula" name="apply_immediate_check"/>
</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_texture_fetch_debugger.xml b/indra/newview/skins/default/xui/tr/floater_texture_fetch_debugger.xml
new file mode 100644
index 0000000000..a592479b6c
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_texture_fetch_debugger.xml
@@ -0,0 +1,62 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="TexFetchDebugger" title="Doku Alımı Hata Ayıklayıcı">
+ <text name="total_num_fetched_label">
+ 1, Alınan dokuların toplam sayısı: [NUM]
+ </text>
+ <text name="total_num_fetching_requests_label">
+ 2, Toplam alım talebi sayısı: [NUM]
+ </text>
+ <text name="total_num_cache_hits_label">
+ 3, Toplam önbellek isabet sayısı: [NUM]
+ </text>
+ <text name="total_num_visible_tex_label">
+ 4, Görünür dokuların toplam sayısı: [NUM]
+ </text>
+ <text name="total_num_visible_tex_fetch_req_label">
+ 5, Görünür dokuların alınması için toplam talep sayısı: [NUM]
+ </text>
+ <text name="total_fetched_data_label">
+ 6, Alınan verilerin toplam sayısı: [SIZE1]KB, Şifresi Çözülen Veri: [SIZE2]KB, [PIXEL]MPiksel
+ </text>
+ <text name="total_fetched_vis_data_label">
+ 7, Görünür verilerin toplam sayısı: [SIZE1]KB, Şifresi Çözülen Veri: [SIZE2]KB
+ </text>
+ <text name="total_fetched_rendered_data_label">
+ 8, İşlenen verilerin toplam sayısı: [SIZE1]KB, Şifresi Çözülen Veri: [SIZE2]KB, [PIXEL]MPiksel
+ </text>
+ <text name="total_time_cache_read_label">
+ 9, Önbellek okunması için toplam süre: [TIME] saniye
+ </text>
+ <text name="total_time_cache_write_label">
+ 10, Önbellek yazılması için toplam süre: [TIME] saniye
+ </text>
+ <text name="total_time_decode_label">
+ 11, Şifre çözülmesi için toplam süre: [TIME] saniye
+ </text>
+ <text name="total_time_gl_label">
+ 12, GL doku oluşturma için toplam süre: [TIME] saniye
+ </text>
+ <text name="total_time_http_label">
+ 13, HTTP alımı için toplam süre: [TIME] saniye
+ </text>
+ <text name="total_time_fetch_label">
+ 14, Tüm alımlar için toplam süre: [TIME] saniye
+ </text>
+ <text name="total_time_refetch_vis_cache_label">
+ 15, Görünür dokuların önbellekten tekrar alınması, Süre: [TIME] saniye, Alınan: [SIZE]KB, [PIXEL]MPiksel
+ </text>
+ <text name="total_time_refetch_vis_http_label">
+ 16, Görünür dokuların HTTP&apos;den tekrar alınması, Süre: [TIME] saniye, Alınan: [SIZE]KB, [PIXEL]MPiksel
+ </text>
+ <spinner label="17, Teksel/Piksel Oranı:" name="texel_pixel_ratio"/>
+ <button label="BaÅŸla" name="start_btn"/>
+ <button label="Sıfırla" name="clear_btn"/>
+ <button label="Kapat" name="close_btn"/>
+ <button label="Önbellek Okunması" name="cacheread_btn"/>
+ <button label="Önbellek Yazılması" name="cachewrite_btn"/>
+ <button label="HTTP" name="http_btn"/>
+ <button label="Şifre Çöz" name="decode_btn"/>
+ <button label="GL Dokusu" name="gl_btn"/>
+ <button label="Görünür Dokuları Önbellekten Tekrar Al" name="refetchviscache_btn"/>
+ <button label="Görünür Dokuları HTTP&apos;den Tekrar Al" name="refetchvishttp_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_window_size.xml b/indra/newview/skins/default/xui/tr/floater_window_size.xml
index acc2cc3376..aff20e7960 100644
--- a/indra/newview/skins/default/xui/tr/floater_window_size.xml
+++ b/indra/newview/skins/default/xui/tr/floater_window_size.xml
@@ -7,10 +7,17 @@
Pencere büyüklüğünü ayarla:
</text>
<combo_box name="window_size_combo" tool_tip="genişlik x yükseklik">
- <combo_box.item label="1000 x 700 (varsayılan)" name="item0"/>
- <combo_box.item label="1024 x 768" name="item1"/>
- <combo_box.item label="1280 x 720 (720p)" name="item2"/>
- <combo_box.item label="1920 x 1080 (1080p)" name="item3"/>
+ <combo_box.item label="1000 x 700 (varsayılan)" name="item1"/>
+ <combo_box.item label="1024 x 768 (4:3 XGA)" name="item2"/>
+ <combo_box.item label="1280 x 720 (16:9 HDTV)" name="item3"/>
+ <combo_box.item label="1280 x 800 (5:8 WXGA)" name="item4"/>
+ <combo_box.item label="1280 x 1024 (5:4 SXGA)" name="item5"/>
+ <combo_box.item label="1440 x 900 (8:5 WSXGA)" name="item7"/>
+ <combo_box.item label="1600 x 900 (16:9 HD+)" name="item8"/>
+ <combo_box.item label="1600 x 1200 (4:3 UXGA)" name="item9"/>
+ <combo_box.item label="1680 x 1050 (8:5 WSXGA+)" name="item10"/>
+ <combo_box.item label="1920 x 1080 (16:9 HDTV)" name="item11"/>
+ <combo_box.item label="1920 x 1200 (8:5 WUXGA)" name="item12"/>
</combo_box>
<button label="Ayarla" name="set_btn"/>
<button label="İptal" name="cancel_btn"/>
diff --git a/indra/newview/skins/default/xui/tr/menu_viewer.xml b/indra/newview/skins/default/xui/tr/menu_viewer.xml
index d7b20bac4b..ea84e7d24b 100644
--- a/indra/newview/skins/default/xui/tr/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/tr/menu_viewer.xml
@@ -225,11 +225,10 @@
<menu_item_check label="Doku Konsolu" name="Texture Console"/>
<menu_item_check label="Hata Ayıklama Konsolu" name="Debug Console"/>
<menu_item_call label="Bildirimler Konsolu" name="Notifications"/>
- <menu_item_check label="Doku Büyüklüğü Konsolu" name="Texture Size"/>
- <menu_item_check label="Doku Kategorisi Konsolu" name="Texture Category"/>
<menu_item_check label="Hızlı Zamanlayıcılar" name="Fast Timers"/>
<menu_item_check label="Bellek" name="Memory"/>
<menu_item_check label="Sahne İstatistikleri" name="Scene Statistics"/>
+ <menu_item_call label="Doku Alınması Hata Ayıklama Konsolu" name="Texture Fetch Debug Console"/>
<menu_item_call label="Hata Ayıklama Konsoluna giden Bölge Bilgisi" name="Region Info to Debug Console"/>
<menu_item_call label="Hata Ayıklama Konsoluna giden Grup Bilgisi" name="Group Info to Debug Console"/>
<menu_item_call label="Hata Ayıklama Konsoluna giden Özellikler Bilgisi" name="Capabilities Info to Debug Console"/>
@@ -287,6 +286,12 @@
<menu_item_check label="İşleme Karmaşıklığı" name="rendercomplexity"/>
<menu_item_check label="Aksesuar Bayt Büyüklüğü" name="attachment bytes"/>
<menu_item_check label="Åžekillendir" name="Sculpt"/>
+ <menu label="Doku YoÄŸunluÄŸu" name="Texture Density">
+ <menu_item_check label="Yok" name="None"/>
+ <menu_item_check label="Mevcut" name="Current"/>
+ <menu_item_check label="Arzulanan" name="Desired"/>
+ <menu_item_check label="Tam" name="Full"/>
+ </menu>
</menu>
<menu label="İşleme" name="Rendering">
<menu_item_check label="Eksenler" name="Axes"/>
@@ -304,7 +309,6 @@
<menu_item_check label="Animasyon Dokuları" name="Animation Textures"/>
<menu_item_check label="Dokuları Devre Dışı Bırak" name="Disable Textures"/>
<menu_item_check label="Tam Çöz. Dokular" name="Rull Res Textures"/>
- <menu_item_check label="Dokuları Denetle" name="Audit Textures"/>
<menu_item_check label="Doku Atlas (deneysel)" name="Texture Atlas"/>
<menu_item_check label="Eklenmiş Işıkları İşle" name="Render Attached Lights"/>
<menu_item_check label="Eklenmiş Parçacıkları İşle" name="Render Attached Particles"/>
diff --git a/indra/newview/skins/default/xui/tr/notifications.xml b/indra/newview/skins/default/xui/tr/notifications.xml
index 6681cdac7a..1d7334be49 100644
--- a/indra/newview/skins/default/xui/tr/notifications.xml
+++ b/indra/newview/skins/default/xui/tr/notifications.xml
@@ -360,7 +360,7 @@ Avatarınızın Kullanıcı adını girmeniz gerekmektedir.
[SECOND_LIFE]&apos;a giriş yapmak için bir hesabınız olması gerekir. Şimdi bir hesap oluşturmak ister misiniz?
<url name="url">
- http://join.secondlife.com/
+ [create_account_url]
</url>
<usetemplate name="okcancelbuttons" notext="Tekrar dene" yestext="Yeni bir hesap oluÅŸtur"/>
</notification>
@@ -495,6 +495,15 @@ Daha fazla bilgi için [_URL] adresini ziyaret etmek ister misiniz?
</url>
<usetemplate ignoretext="Bilgisayar donanımım desteklenmiyor" name="okcancelignore" notext="Hayır" yestext="Evet"/>
</notification>
+ <notification name="IntelOldDriver">
+ Grafik yonganız için muhtemelen daha yeni bir sürücü mevcut. Grafik sürücüleri güncellemek performansınızı kayda değer şekilde artırabilir.
+
+ Sürücü güncellemeleri için [_URL] adresini ziyaret etmek ister misiniz?
+ <url name="url">
+ http://www.intel.com/p/en_US/support/detect/graphics
+ </url>
+ <usetemplate ignoretext="Grafik sürücüm güncel değil" name="okcancelignore" notext="Hayır" yestext="Evet"/>
+ </notification>
<notification name="UnknownGPU">
Sisteminiz [APP_NAME] uygulamasının tanımadığı bir grafik kartı içeriyor.
Bu durum genellikle [APP_NAME] uygulaması ile henüz denenmemiş yeni donanımlar kullanıldığında ortaya çıkar. Büyük olasılıkla bir sorun çıkmayacaktır, fakat grafik ayarlarınızı değiştirmeniz gerekebilir.
@@ -1167,7 +1176,6 @@ Yeni bir ana konum ayarlamak isteyebilirsiniz.
[APP_NAME] kurulumu tamamlandı.
[SECOND_LIFE]&apos;ı ilk kez kullanıyorsanız, oturum açmadan önce bir hesap oluşturmalısınız.
-Yeni bir hesap oluşturmak için [http://join.secondlife.com secondlife.com] adresine dönülsün mü?
<usetemplate name="okcancelbuttons" notext="Devam" yestext="Yeni Hesap..."/>
</notification>
<notification name="LoginPacketNeverReceived">
@@ -2614,16 +2622,12 @@ Kabul ediyor musunuz?
</form>
</notification>
<notification name="ScriptQuestionCaution">
- &apos;[NAME]&apos; adlı kişiye ait &apos;&lt;nolink&gt;[OBJECTNAME]&lt;/nolink&gt;&apos; adındaki bir nesne şunu yapmak istiyor:
-
-[QUESTIONS]
-Bu nesneye ya da onu oluşturan kişiye güvenmiyorsanız, bu talebi reddetmelisiniz.
-
-Talep kabul edilsin mi?
+ Uyarı: &apos;&lt;nolink&gt;[OBJECTNAME]&lt;/nolink&gt;&apos; nesnesi, Linden Dolar hesabınıza tam erişim istiyor. Eğer erişime izin verirseniz, süregelen bir şekilde, ilave uyarı olmaksızın, hesabınızdan herhangi bir zamanda fon çekebilir veya hesabınızı tamamen boşaltabilir.
+
+Bu türden bir talebin yerinde olması nadir bir durumdur. Eğer hesabınıza neden erişmek istediğini tam olarak anlamıyorsanız, erişime izin vermeyin.
<form name="form">
- <button name="Grant" text="Kabul Et"/>
+ <button name="Grant" text="Tam eriÅŸime izin ver"/>
<button name="Deny" text="Reddet"/>
- <button name="Details" text="Ayrıntılar..."/>
</form>
</notification>
<notification name="ScriptDialog">
@@ -3122,4 +3126,16 @@ Bir araziye sahip değilseniz, Harita&apos;ya bakıp &quot;Bilgi İstasyonu&quot
<global name="You died and have been teleported to your home location">
Hayatınızı kaybettiniz ve ana konumunuza ışınlandınız.
</global>
+ <notification name="LocalBitmapsUpdateFileNotFound">
+ [FNAME] güncellenemedi çünkü bu dosya artık bulunamıyor.
+Bundan sonra bu dosya için güncellemeler devre dışı bırakılacak.
+ </notification>
+ <notification name="LocalBitmapsUpdateFailedFinal">
+ [NRETRIES] girişimde [FNAME] açılamadı veya şifresi çözülemedi, bu dosya artık bozuk olarak değerlendiriliyor.
+Bundan sonra bu dosya için güncellemeler devre dışı bırakılacak.
+ </notification>
+ <notification name="LocalBitmapsVerifyFail">
+ Geçersiz veya okunamayan bir görüntü dosyası [FNAME] eklenmeye kalkışıldı, ancak dosya açılamadı veya şifresi çözülemedi.
+GiriÅŸim iptal edildi.
+ </notification>
</notifications>
diff --git a/indra/newview/skins/default/xui/tr/panel_login.xml b/indra/newview/skins/default/xui/tr/panel_login.xml
index acd6aa1921..15684ba402 100644
--- a/indra/newview/skins/default/xui/tr/panel_login.xml
+++ b/indra/newview/skins/default/xui/tr/panel_login.xml
@@ -1,13 +1,13 @@
<?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="log_in_text">
+ OTURUM AÇ
+ </text>
<text name="username_text">
Kullanıcı Adı:
</text>
@@ -15,15 +15,8 @@
<text name="password_text">
Parola:
</text>
- <check_box label="Parolayı hatırla" name="remember_check"/>
- <button label="Oturum Aç" name="connect_btn"/>
- <text name="mode_selection_text">
- Mod:
- </text>
- <combo_box name="mode_combo" tool_tip="Modunuzu seçin. Hızlı, kolay keşif yapmak ve sohbet için Temel seçimini yapın. Daha fazla özelliğe erişmek için Gelişmiş seçimini yapın.">
- <combo_box.item label="Temel" name="Basic"/>
- <combo_box.item label="GeliÅŸmiÅŸ" name="Advanced"/>
- </combo_box>
+ </layout_panel>
+ <layout_panel name="start_location_panel">
<text name="start_location_text">
Buradan baÅŸla:
</text>
@@ -33,16 +26,21 @@
<combo_box.item label="&lt;Bölge adını girin&gt;" name="Typeregionname"/>
</combo_box>
</layout_panel>
- <layout_panel name="links">
- <text name="create_new_account_text">
- Kaydolun
+ <layout_panel name="links_login_panel">
+ <text name="login_help">
+ Oturum açarken yardım mı gerekiyor?
</text>
<text name="forgot_password_text">
Kullanıcı adınızı veya parolanızı mı unuttunuz?
</text>
- <text name="login_help">
- Oturum açarken yardım mı gerekiyor?
+ <button label="Oturum Aç" name="connect_btn"/>
+ <check_box label="Parolayı hatırla" name="remember_check"/>
+ </layout_panel>
+ <layout_panel name="links">
+ <text name="create_account_text">
+ CREATE YǾUR ACCǾUNT
</text>
+ <button name="create_new_account_btn" label="Kaydolun"/>
</layout_panel>
</layout_stack>
</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_script_question_toast.xml b/indra/newview/skins/default/xui/tr/panel_script_question_toast.xml
new file mode 100644
index 0000000000..a2d0237da0
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_script_question_toast.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<panel label="script_question_panel" name="panel_script_question_toast">
+ <panel label="buttons_panel" name="buttons_panel"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/strings.xml b/indra/newview/skins/default/xui/tr/strings.xml
index 2a4e2c20a7..1be0970e4e 100644
--- a/indra/newview/skins/default/xui/tr/strings.xml
+++ b/indra/newview/skins/default/xui/tr/strings.xml
@@ -137,7 +137,7 @@
Çık
</string>
<string name="create_account_url">
- http://join.secondlife.com/
+ http://join.secondlife.com/index.php?lang=tr-TR
</string>
<string name="LoginFailedViewerNotPermitted">
Kullandığınız görüntüleyici ile artık Second Life&apos;a erişemezsiniz. Yeni bir görüntüleyiciyi karşıdan yüklemek için lütfen şu sayfayı ziyaret edin:
@@ -883,6 +883,9 @@ Lütfen bir dakika içerisinde tekrar oturum açmayı deneyin.
<string name="ScriptQuestionCautionChatDenied">
&apos;[OWNERNAME]&apos; adlı kişiye ait, [REGIONPOS] üzerinde [REGIONNAME] içerisinde bulunan &apos;[OBJECTNAME]&apos; nesnesine şunu yapma izni verilmedi: [PERMISSIONS].
</string>
+ <string name="AdditionalPermissionsRequestHeader">
+ Eğer hesabınıza erişime izin verirseniz, bu nesneye aynı zamanda şunun için izin vermiş olacaksınız:
+ </string>
<string name="ScriptTakeMoney">
Sizden Linden dolar (L$) almak
</string>
@@ -916,6 +919,9 @@ Lütfen bir dakika içerisinde tekrar oturum açmayı deneyin.
<string name="ControlYourCamera">
Kameranızı kontrol etmek
</string>
+ <string name="TeleportYourAgent">
+ Sizi ışınlama
+ </string>
<string name="NotConnected">
Bağlı Değil
</string>
diff --git a/indra/newview/skins/default/xui/zh/notifications.xml b/indra/newview/skins/default/xui/zh/notifications.xml
index 3fa8ff3f78..ef59b15db1 100644
--- a/indra/newview/skins/default/xui/zh/notifications.xml
+++ b/indra/newview/skins/default/xui/zh/notifications.xml
@@ -326,7 +326,7 @@ 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/
+ [create_account_url]
</url>
<usetemplate name="okcancelbuttons" notext="å†è©¦ä¸€æ¬¡" yestext="創造新帳戶"/>
</notification>
@@ -1128,7 +1128,6 @@ You may want to set a new home location.
[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">
diff --git a/indra/newview/skins/default/xui/zh/panel_login.xml b/indra/newview/skins/default/xui/zh/panel_login.xml
index b227fbcfc8..efd8e22bf0 100644
--- a/indra/newview/skins/default/xui/zh/panel_login.xml
+++ b/indra/newview/skins/default/xui/zh/panel_login.xml
@@ -1,13 +1,13 @@
<?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="log_in_text">
+ 登入
+ </text>
<text name="username_text">
使用者å稱:
</text>
@@ -15,15 +15,8 @@
<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>
+ </layout_panel>
+ <layout_panel name="start_location_panel">
<text name="start_location_text">
開始地點:
</text>
@@ -33,16 +26,21 @@
<combo_box.item label="&lt; 請輸入地å€å稱 &gt;" name="Typeregionname"/>
</combo_box>
</layout_panel>
- <layout_panel name="links">
- <text name="create_new_account_text">
- 註冊
+ <layout_panel name="links_login_panel">
+ <text name="login_help">
+ 登入時需è¦å¹«åŠ©ï¼Ÿ
</text>
<text name="forgot_password_text">
忘記你的使用者å稱或密碼?
</text>
- <text name="login_help">
- 登入時需è¦å¹«åŠ©ï¼Ÿ
+ <button label="登入" name="connect_btn"/>
+ <check_box label="記ä½å¯†ç¢¼ï¼š" name="remember_check"/>
+ </layout_panel>
+ <layout_panel name="links">
+ <text name="create_account_text">
+ CREATE YǾUR ACCǾUNT
</text>
+ <button name="create_new_account_btn" label="註冊"/>
</layout_panel>
</layout_stack>
</panel>
diff --git a/indra/newview/skins/steam/xui/da/strings.xml b/indra/newview/skins/steam/xui/da/strings.xml
new file mode 100644
index 0000000000..11d100eeff
--- /dev/null
+++ b/indra/newview/skins/steam/xui/da/strings.xml
@@ -0,0 +1,4483 @@
+<?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="CAPITALIZED_APP_NAME">
+ SECOND LIFE
+ </string>
+ <string name="SUPPORT_SITE">
+ Second Life Support Portal
+ </string>
+ <string name="StartupDetectingHardware">
+ Detekterer hardware...
+ </string>
+ <string name="StartupLoading">
+ Henter [APP_NAME]...
+ </string>
+ <string name="StartupClearingCache">
+ Tømmer cache...
+ </string>
+ <string name="StartupInitializingTextureCache">
+ Initialiserer tekstur cache...
+ </string>
+ <string name="StartupInitializingVFS">
+ Initialiserer VFS...
+ </string>
+ <string name="ProgressRestoring">
+ Gendanner...
+ </string>
+ <string name="ProgressChangingResolution">
+ Ændrer opløsning...
+ </string>
+ <string name="LoginInProgress">
+ Logger p. [APP_NAME] kan virke laast. Vent venligst.
+ </string>
+ <string name="LoginInProgressNoFrozen">
+ Logger på...
+ </string>
+ <string name="LoginAuthenticating">
+ Validerer adgang
+ </string>
+ <string name="LoginMaintenance">
+ Udfører konto vedligeholdelse...
+ </string>
+ <string name="LoginAttempt">
+ Tidligere forsø på login fejlede. Logger på, forsøg [NUMBER]
+ </string>
+ <string name="LoginPrecaching">
+ verden...
+ </string>
+ <string name="LoginInitializingBrowser">
+ Klargør indbyggede web browser...
+ </string>
+ <string name="LoginInitializingMultimedia">
+ Klargør multimedia...
+ </string>
+ <string name="LoginInitializingFonts">
+ Indlæser skriftstyper...
+ </string>
+ <string name="LoginVerifyingCache">
+ Checker cache filer (kan tage 60-90 sekunder)...
+ </string>
+ <string name="LoginProcessingResponse">
+ Behandler svar ...
+ </string>
+ <string name="LoginInitializingWorld">
+ Initialiserer verden...
+ </string>
+ <string name="LoginDecodingImages">
+ Behandler billeder...
+ </string>
+ <string name="LoginInitializingQuicktime">
+ Initialiserer QuickTime...
+ </string>
+ <string name="LoginQuicktimeNotFound">
+ QuickTime ikke fundet- kunne derfor ikke initialisere.
+ </string>
+ <string name="LoginQuicktimeOK">
+ QuickTime initialiseret.
+ </string>
+ <string name="LoginWaitingForRegionHandshake">
+ Venter på svar fra region...
+ </string>
+ <string name="LoginConnectingToRegion">
+ Tilslutter til region...
+ </string>
+ <string name="LoginDownloadingClothing">
+ Henter tøj...
+ </string>
+ <string name="InvalidCertificate">
+ Serveren returnerede et ugyldigt eller ødelagt certifikat. Kontakt venligst administrator af dette net.
+ </string>
+ <string name="CertInvalidHostname">
+ Et ugyldig hostnavn blev brugt for at få adgang til serveren. Check venligst din SLURL eller navnet på hosten.
+ </string>
+ <string name="CertExpired">
+ Det certifikat der blev returneret ser ud til at være udløbet. Check venligst din systemtid på computeren.
+ </string>
+ <string name="CertKeyUsage">
+ Det certifikat der blev returneret af serveren kan ikke benyttes til SSL. Kontakt venligst administrator af dette net.
+ </string>
+ <string name="CertBasicConstraints">
+ For mange certifikater i serverens certifikat streng. Kontakt venligst administrator af dette net.
+ </string>
+ <string name="CertInvalidSignature">
+ Signaturen på certifkat der blev returneret af Second Life serveren kunne ikke bekræftes.
+ </string>
+ <string name="LoginFailedNoNetwork">
+ Netværksfejl: Kunne ikke etablere forbindelse, check venligst din netværksforbindelse.
+ </string>
+ <string name="LoginFailed">
+ Login fejlede.
+ </string>
+ <string name="Quit">
+ Afslut
+ </string>
+ <string name="LoginFailedViewerNotPermitted">
+ Den klient du benytter kan ikke længere få adgang til Second Life. Besøg venligst denne side for at hente en ny klient:
+http://secondlife.com/download
+
+For mere information, se denne FAQ:
+http://secondlife.com/viewer-access-faq
+ </string>
+ <string name="LoginIntermediateOptionalUpdateAvailable">
+ Valgfri klient opdatering tilgængelig: [VERSION]
+ </string>
+ <string name="LoginFailedRequiredUpdate">
+ Påkrævet opdatering a klient: [VERSION]
+ </string>
+ <string name="LoginFailedAlreadyLoggedIn">
+ Din avatar er allerede logget på.
+ </string>
+ <string name="LoginFailedAuthenticationFailed">
+ Beklager! vi kunne ikke logge dig på.
+Undersøg venligst at du har indtastet det rette
+Please check to make sure you entered the right
+ * Brugernavn (like bobsmith12 or steller.sunshine)
+ * Password
+Check også at Caps Lock ikke er aktiveret.
+ </string>
+ <string name="LoginFailedPasswordChanged">
+ Som en sikkerhedsforanstaltning er dit password blevet ændret.
+Går venligst til din konto-side på http://secondlife.com/password
+og besvar sikkerhedsspørgsmål for at nulstille dit password.
+Vi undskylder besværet.
+ </string>
+ <string name="LoginFailedPasswordReset">
+ vi har lavet nogle ændringer i vores system og det er nødvendigt at nulstille dit password.
+Går venligst til din konto-side på http://secondlife.com/password
+og besvar sikkerhedsspørgsmål for at nulstille dit password.
+Vi undskylder besværet.
+ </string>
+ <string name="LoginFailedEmployeesOnly">
+ Second Life er midlertidig lukket ned for vedligeholdelse.
+Kun medarbejdere kan logge på for øjeblikket.
+Check www.secondlife.com/status for opdateringer.
+ </string>
+ <string name="LoginFailedPremiumOnly">
+ Second Life har midlertidig begrænset muligheden for log-in for at sikre, at brugere på systemet ikke får dårlige svartider.
+
+ Brugere med gratis-konti vil ikke kunne logge på Second Life på dette tidspunkt.
+ </string>
+ <string name="LoginFailedComputerProhibited">
+ Second Life kan ikke tilgås fra dennecomputer.
+Hvis du mener dette er en fejl, kontakt venligst support@secondlife.com.
+ </string>
+ <string name="LoginFailedAcountSuspended">
+ Din konto vil ikke være tilgængelig før
+[TIME] Pacific Time.
+ </string>
+ <string name="LoginFailedAccountDisabled">
+ Vi kan desværre ikke behandle forespøgsel lige nu.
+Kontakt venligst Second Life supper for assitance via http://secondlife.com/support.
+Hvis du ikke kan ændre dit password ring venligst +1 (866) 476-9763.
+ </string>
+ <string name="LoginFailedTransformError">
+ Data inkonsistens registret ved login.
+Kontakt venligst support@secondlife.com.
+ </string>
+ <string name="LoginFailedAccountMaintenance">
+ Der foretages vedligehold på din konto lige nu.
+Din konto vil ikke være tilgængelig før
+[TIME] Pacific Time.
+Hvis du mener dette er en fejl, kontakt venligst support@secondlife.com.
+ </string>
+ <string name="LoginFailedPendingLogoutFault">
+ Forespøgsel på logout blev besvaret med en fejl fra simulatoren.
+ </string>
+ <string name="LoginFailedPendingLogout">
+ Systemet er i gang med at logge dig ud netop nu.
+Din konto vil ikke være tilgængelig før
+[TIME] Pacific Time.
+ </string>
+ <string name="LoginFailedUnableToCreateSession">
+ Ikke muligt at oprette gyldig session.
+ </string>
+ <string name="LoginFailedUnableToConnectToSimulator">
+ Ikke muligt at koble til en simulator.
+ </string>
+ <string name="LoginFailedRestrictedHours">
+ Din konto kan kun tilgå Second Life
+mellem [START] [END] Pacific Time.
+Kom venligst tilbage i dette tidsrum.
+
+Hvis du mener dette er en fejl, kontakt venligst support@secondlife.com.
+ </string>
+ <string name="LoginFailedIncorrectParameters">
+ Ugyldig parametre.
+Hvis du mener dette er en fejl, kontakt venligst support@secondlife.com.
+ </string>
+ <string name="LoginFailedFirstNameNotAlphanumeric">
+ Fornavn parameter skal være alfanumerisk
+Hvis du mener dette er en fejl, kontakt venligst support@secondlife.com.
+ </string>
+ <string name="LoginFailedLastNameNotAlphanumeric">
+ Efternavn parameter skal være alfanumerisk
+Hvis du mener dette er en fejl, kontakt venligst support@secondlife.com.
+ </string>
+ <string name="LogoutFailedRegionGoingOffline">
+ Regionen er lukket ned.
+Prøv at logge på om lidt igen.
+ </string>
+ <string name="LogoutFailedAgentNotInRegion">
+ Avatar ikke i en region.
+Prøv venligst om lidt igen.
+ </string>
+ <string name="LogoutFailedPendingLogin">
+ The region was logging in another session.
+Please try logging in again in a minute.
+ </string>
+ <string name="LogoutFailedLoggingOut">
+ Region har lukket sidste session ned.
+Prøv venligst om lidt igen.
+ </string>
+ <string name="LogoutFailedStillLoggingOut">
+ Regionen er stadig ved at lukke forrige session ud.
+Prøv venligst om lidt igen.
+ </string>
+ <string name="LogoutSucceeded">
+ Region har lukket sidste session ned.
+Prøv venligst om lidt igen.
+ </string>
+ <string name="LogoutFailedLogoutBegun">
+ Region er i gang med at logge ud.
+Prøv venligst om lidt igen.
+ </string>
+ <string name="LoginFailedLoggingOutSession">
+ Region er i gang med at lukket sidste session ned.
+Prøv venligst om lidt igen.
+ </string>
+ <string name="AgentLostConnection">
+ Denne region kan have problemer. Tjek venligst din forbindelse til internettet.
+ </string>
+ <string name="SavingSettings">
+ Gemmer indstillinger...
+ </string>
+ <string name="LoggingOut">
+ Logger ud...
+ </string>
+ <string name="ShuttingDown">
+ Lukker ned...
+ </string>
+ <string name="YouHaveBeenDisconnected">
+ Du er blevet frakoblet den region du var i.
+ </string>
+ <string name="SentToInvalidRegion">
+ Du blev sendt til en ugyldig region.
+ </string>
+ <string name="TestingDisconnect">
+ Tester frakobling af klient
+ </string>
+ <string name="TooltipPerson">
+ Person
+ </string>
+ <string name="TooltipNoName">
+ (intet navn)
+ </string>
+ <string name="TooltipOwner">
+ Ejer:
+ </string>
+ <string name="TooltipPublic">
+ Offentlig
+ </string>
+ <string name="TooltipIsGroup">
+ (Gruppe)
+ </string>
+ <string name="TooltipForSaleL$">
+ Til salg: L$[AMOUNT]
+ </string>
+ <string name="TooltipFlagGroupBuild">
+ Gruppe byg
+ </string>
+ <string name="TooltipFlagNoBuild">
+ MÃ¥ ikke bygge
+ </string>
+ <string name="TooltipFlagNoEdit">
+ Gruppe byg
+ </string>
+ <string name="TooltipFlagNotSafe">
+ Ikke sikker område
+ </string>
+ <string name="TooltipFlagNoFly">
+ Ingen flyvning
+ </string>
+ <string name="TooltipFlagGroupScripts">
+ Gruppe scripts
+ </string>
+ <string name="TooltipFlagNoScripts">
+ Ingen Scripts
+ </string>
+ <string name="TooltipLand">
+ Land:
+ </string>
+ <string name="TooltipMustSingleDrop">
+ Kun et enkelt element kan trækkes ind her
+ </string>
+ <string name="TooltipPrice" value="L$[BELØB]:"/>
+ <string name="TooltipHttpUrl">
+ Klik for at se denne hjemmeside
+ </string>
+ <string name="TooltipSLURL">
+ Klik for at se information om denne lokation
+ </string>
+ <string name="TooltipAgentUrl">
+ Klik for at se beboers profil
+ </string>
+ <string name="TooltipAgentInspect">
+ Lær mere om denne beboer
+ </string>
+ <string name="TooltipAgentMute">
+ Klik for at slukke for denne beboer
+ </string>
+ <string name="TooltipAgentUnmute">
+ Klik for at fjern slukning for denne beboer
+ </string>
+ <string name="TooltipAgentIM">
+ Klik for at sende IM til denne beboer
+ </string>
+ <string name="TooltipAgentPay">
+ Klik for at betale denne beboer
+ </string>
+ <string name="TooltipAgentOfferTeleport">
+ Klik for at tilbyde teleport til denne beboer
+ </string>
+ <string name="TooltipAgentRequestFriend">
+ Klik for at sende venneforespørgsel
+ </string>
+ <string name="TooltipGroupUrl">
+ Klik for at se denne gruppes beskrivelse
+ </string>
+ <string name="TooltipEventUrl">
+ Klik for at se beskrivelse af denne event
+ </string>
+ <string name="TooltipClassifiedUrl">
+ Klik for at se denne annonce
+ </string>
+ <string name="TooltipParcelUrl">
+ Klik for at se beskrivelse for denne parcel
+ </string>
+ <string name="TooltipTeleportUrl">
+ Klik for at teleportere til denne lokation
+ </string>
+ <string name="TooltipObjectIMUrl">
+ Klik for at se beskrivelse for dette objekt
+ </string>
+ <string name="TooltipMapUrl">
+ Klik for at se denne lokation på kortet
+ </string>
+ <string name="TooltipSLAPP">
+ Klik for at starte secondlife:// kommando
+ </string>
+ <string name="CurrentURL" value=" Nuværende URL: [CurrentURL]"/>
+ <string name="SLurlLabelTeleport">
+ Teleportér til
+ </string>
+ <string name="SLurlLabelShowOnMap">
+ Vis kort for
+ </string>
+ <string name="SLappAgentMute">
+ Sluk
+ </string>
+ <string name="SLappAgentUnmute">
+ Fjern sluk
+ </string>
+ <string name="SLappAgentIM">
+ IM
+ </string>
+ <string name="SLappAgentPay">
+ Betal
+ </string>
+ <string name="SLappAgentOfferTeleport">
+ Tilbyd teleport til
+ </string>
+ <string name="SLappAgentRequestFriend">
+ Venneforespørgsel
+ </string>
+ <string name="BUTTON_CLOSE_DARWIN">
+ Luk (⌘W)
+ </string>
+ <string name="BUTTON_CLOSE_WIN">
+ Luk (Ctrl+W)
+ </string>
+ <string name="BUTTON_CLOSE_CHROME">
+ Luk
+ </string>
+ <string name="BUTTON_RESTORE">
+ Gendan
+ </string>
+ <string name="BUTTON_MINIMIZE">
+ Minimér
+ </string>
+ <string name="BUTTON_TEAR_OFF">
+ Løsriv
+ </string>
+ <string name="BUTTON_DOCK">
+ Fastgør
+ </string>
+ <string name="BUTTON_HELP">
+ Vis hjælp
+ </string>
+ <string name="Searching">
+ Søger...
+ </string>
+ <string name="NoneFound">
+ Intet fundet.
+ </string>
+ <string name="RetrievingData">
+ Henter...
+ </string>
+ <string name="ReleaseNotes">
+ Noter om version
+ </string>
+ <string name="RELEASE_NOTES_BASE_URL">
+ http://wiki.secondlife.com/wiki/Release_Notes/
+ </string>
+ <string name="LoadingData">
+ Henter...
+ </string>
+ <string name="AvatarNameNobody">
+ (ingen)
+ </string>
+ <string name="AvatarNameWaiting">
+ (venter)
+ </string>
+ <string name="GroupNameNone">
+ (ingen)
+ </string>
+ <string name="AvalineCaller">
+ Avaline opkalder [ORDER]
+ </string>
+ <string name="AssetErrorNone">
+ Ingen fejl
+ </string>
+ <string name="AssetErrorRequestFailed">
+ Element forespørgsel: fejlede
+ </string>
+ <string name="AssetErrorNonexistentFile">
+ Element forespørgsel: fil findes ikke
+ </string>
+ <string name="AssetErrorNotInDatabase">
+ Element forespørgsel: element ikke fundet i database
+ </string>
+ <string name="AssetErrorEOF">
+ Slutning af fil
+ </string>
+ <string name="AssetErrorCannotOpenFile">
+ Kan ikke åbne fil
+ </string>
+ <string name="AssetErrorFileNotFound">
+ Fil ikke fundet
+ </string>
+ <string name="AssetErrorTCPTimeout">
+ Tidsgrænse overskredet ved filhentning
+ </string>
+ <string name="AssetErrorCircuitGone">
+ Forbindelsen mistet
+ </string>
+ <string name="AssetErrorPriceMismatch">
+ [APP_NAME] klient og server er uenige om prisen
+ </string>
+ <string name="AssetErrorUnknownStatus">
+ Ukendt status
+ </string>
+ <string name="texture">
+ tekstur
+ </string>
+ <string name="sound">
+ lyd
+ </string>
+ <string name="calling card">
+ visitkort
+ </string>
+ <string name="landmark">
+ landemærke
+ </string>
+ <string name="legacy script">
+ ældre script
+ </string>
+ <string name="clothing">
+ tøj
+ </string>
+ <string name="object">
+ objekt
+ </string>
+ <string name="note card">
+ note
+ </string>
+ <string name="folder">
+ mappe
+ </string>
+ <string name="root">
+ rod
+ </string>
+ <string name="lsl2 script">
+ LSL2 script
+ </string>
+ <string name="lsl bytecode">
+ LSL bytecode
+ </string>
+ <string name="tga texture">
+ tga texture
+ </string>
+ <string name="body part">
+ kropsdel
+ </string>
+ <string name="snapshot">
+ foto
+ </string>
+ <string name="lost and found">
+ Fundne genstande
+ </string>
+ <string name="targa image">
+ targa billede
+ </string>
+ <string name="trash">
+ Papirkurv
+ </string>
+ <string name="jpeg image">
+ jpeg billede
+ </string>
+ <string name="animation">
+ animation
+ </string>
+ <string name="gesture">
+ bevægelse
+ </string>
+ <string name="simstate">
+ simstate
+ </string>
+ <string name="favorite">
+ favorit
+ </string>
+ <string name="symbolic link">
+ link
+ </string>
+ <string name="symbolic folder link">
+ link til mappe
+ </string>
+ <string name="mesh">
+ mesh
+ </string>
+ <string name="AvatarEditingAppearance">
+ (Redigering Udseende)
+ </string>
+ <string name="AvatarAway">
+ Væk
+ </string>
+ <string name="AvatarBusy">
+ Optaget
+ </string>
+ <string name="AvatarMuted">
+ Blokeret
+ </string>
+ <string name="anim_express_afraid">
+ Bange
+ </string>
+ <string name="anim_express_anger">
+ Vred
+ </string>
+ <string name="anim_away">
+ Væk
+ </string>
+ <string name="anim_backflip">
+ Baglæns salto
+ </string>
+ <string name="anim_express_laugh">
+ Hjertelig latter
+ </string>
+ <string name="anim_express_toothsmile">
+ Stort smil
+ </string>
+ <string name="anim_blowkiss">
+ Sende kys
+ </string>
+ <string name="anim_express_bored">
+ Keder sig
+ </string>
+ <string name="anim_bow">
+ Buk
+ </string>
+ <string name="anim_clap">
+ Klap
+ </string>
+ <string name="anim_courtbow">
+ Højtideligt buk
+ </string>
+ <string name="anim_express_cry">
+ Græd
+ </string>
+ <string name="anim_dance1">
+ Dans 1
+ </string>
+ <string name="anim_dance2">
+ Dans 2
+ </string>
+ <string name="anim_dance3">
+ Dans 3
+ </string>
+ <string name="anim_dance4">
+ Dans 4
+ </string>
+ <string name="anim_dance5">
+ Dans 5
+ </string>
+ <string name="anim_dance6">
+ Dans 6
+ </string>
+ <string name="anim_dance7">
+ Dans 7
+ </string>
+ <string name="anim_dance8">
+ Dans 8
+ </string>
+ <string name="anim_express_disdain">
+ Foragt
+ </string>
+ <string name="anim_drink">
+ Drik
+ </string>
+ <string name="anim_express_embarrased">
+ Flov
+ </string>
+ <string name="anim_angry_fingerwag">
+ Løftet finger
+ </string>
+ <string name="anim_fist_pump">
+ Knytnæve
+ </string>
+ <string name="anim_yoga_float">
+ Svævende yoga
+ </string>
+ <string name="anim_express_frown">
+ Mistroisk
+ </string>
+ <string name="anim_impatient">
+ Utålmodig
+ </string>
+ <string name="anim_jumpforjoy">
+ Glædeshop
+ </string>
+ <string name="anim_kissmybutt">
+ Kys min r..
+ </string>
+ <string name="anim_express_kiss">
+ Kys
+ </string>
+ <string name="anim_laugh_short">
+ Grin
+ </string>
+ <string name="anim_musclebeach">
+ Bodybuilder
+ </string>
+ <string name="anim_no_unhappy">
+ Nej (sur)
+ </string>
+ <string name="anim_no_head">
+ Nej
+ </string>
+ <string name="anim_nyanya">
+ Æv-bæv
+ </string>
+ <string name="anim_punch_onetwo">
+ Et-to slag
+ </string>
+ <string name="anim_express_open_mouth">
+ Ã…ben mund
+ </string>
+ <string name="anim_peace">
+ Peace
+ </string>
+ <string name="anim_point_you">
+ Peg på andre
+ </string>
+ <string name="anim_point_me">
+ Peg på dig selv
+ </string>
+ <string name="anim_punch_l">
+ Slå venstre
+ </string>
+ <string name="anim_punch_r">
+ Slå højre
+ </string>
+ <string name="anim_rps_countdown">
+ SSP - Tæl
+ </string>
+ <string name="anim_rps_paper">
+ SSP - Papir
+ </string>
+ <string name="anim_rps_rock">
+ SSP - Sten
+ </string>
+ <string name="anim_rps_scissors">
+ SSP - Saks
+ </string>
+ <string name="anim_express_repulsed">
+ Misfornøjet
+ </string>
+ <string name="anim_kick_roundhouse_r">
+ Karatepark
+ </string>
+ <string name="anim_express_sad">
+ Ked af det
+ </string>
+ <string name="anim_salute">
+ Honnør
+ </string>
+ <string name="anim_shout">
+ RÃ¥b
+ </string>
+ <string name="anim_express_shrug">
+ Skuldertræk
+ </string>
+ <string name="anim_express_smile">
+ Smil
+ </string>
+ <string name="anim_smoke_idle">
+ Ryg
+ </string>
+ <string name="anim_smoke_inhale">
+ Indhalér
+ </string>
+ <string name="anim_smoke_throw_down">
+ Smid cigaret
+ </string>
+ <string name="anim_express_surprise">
+ Overrasket
+ </string>
+ <string name="anim_sword_strike_r">
+ Sværdslag
+ </string>
+ <string name="anim_angry_tantrum">
+ Ekstatisk
+ </string>
+ <string name="anim_express_tongue_out">
+ Tunge ud
+ </string>
+ <string name="anim_hello">
+ Vink
+ </string>
+ <string name="anim_whisper">
+ Knib øje i
+ </string>
+ <string name="anim_whistle">
+ Pift
+ </string>
+ <string name="anim_express_wink">
+ Blink
+ </string>
+ <string name="anim_wink_hollywood">
+ Blink (Hollywood)
+ </string>
+ <string name="anim_express_worry">
+ Bekymret
+ </string>
+ <string name="anim_yes_happy">
+ Ja (glad)
+ </string>
+ <string name="anim_yes_head">
+ Ja
+ </string>
+ <string name="texture_loading">
+ Indlæser...
+ </string>
+ <string name="worldmap_offline">
+ Offline
+ </string>
+ <string name="worldmap_item_tooltip_format">
+ [AREA] m² L$[PRICE]
+ </string>
+ <string name="worldmap_results_none_found">
+ Ingen fundet.
+ </string>
+ <string name="Ok">
+ OK
+ </string>
+ <string name="Premature end of file">
+ Fil slutter for tidligt
+ </string>
+ <string name="ST_NO_JOINT">
+ Kan ikke funde ROOT eller JOINT.
+ </string>
+ <string name="whisper">
+ hvisker:
+ </string>
+ <string name="shout">
+ råber:
+ </string>
+ <string name="ringing">
+ Forbinder til stemmechat...
+ </string>
+ <string name="connected">
+ Forbundet
+ </string>
+ <string name="unavailable">
+ Stemmechat er ikke tilladt hvor du befinder dig
+ </string>
+ <string name="hang_up">
+ Stemme chat er afbrudt
+ </string>
+ <string name="reconnect_nearby">
+ Du vil nu blive dirigeret til lokal stemme chat
+ </string>
+ <string name="ScriptQuestionCautionChatGranted">
+ &apos;[OBJECTNAME]&apos;, en genstand, ejet af &apos;[OWNERNAME]&apos;, lokaliseret i [REGIONNAME] på [REGIONPOS], har fået tilladelse til: [PERMISSIONS].
+ </string>
+ <string name="ScriptQuestionCautionChatDenied">
+ &apos;[OBJECTNAME]&apos;, en genstand, ejet af &apos;[OWNERNAME]&apos;, lokaliseret i [REGIONNAME] på [REGIONPOS], er afvist tilladelse til: [PERMISSIONS].
+ </string>
+ <string name="ScriptTakeMoney">
+ Tag Linden dollars (L$) fra dig
+ </string>
+ <string name="ActOnControlInputs">
+ Reagér på dine kontrol-taster
+ </string>
+ <string name="RemapControlInputs">
+ Ændre dine kontrol-taster
+ </string>
+ <string name="AnimateYourAvatar">
+ Animér din avatar
+ </string>
+ <string name="AttachToYourAvatar">
+ Sæt på din avatar
+ </string>
+ <string name="ReleaseOwnership">
+ Fjern ejerskabet og sæt til offentlig
+ </string>
+ <string name="LinkAndDelink">
+ Sammenkæd og adskil andre genstande
+ </string>
+ <string name="AddAndRemoveJoints">
+ Tilføj og fjern sammenkødninger med andre genstande
+ </string>
+ <string name="ChangePermissions">
+ Ændre dens tilladelser
+ </string>
+ <string name="TrackYourCamera">
+ Spor dit kamera
+ </string>
+ <string name="ControlYourCamera">
+ Kontrollér dit kamera
+ </string>
+ <string name="SIM_ACCESS_PG">
+ PG
+ </string>
+ <string name="SIM_ACCESS_MATURE">
+ Mature
+ </string>
+ <string name="SIM_ACCESS_ADULT">
+ Adult
+ </string>
+ <string name="SIM_ACCESS_DOWN">
+ logget af
+ </string>
+ <string name="SIM_ACCESS_MIN">
+ Ukendt
+ </string>
+ <string name="land_type_unknown">
+ (ukendt)
+ </string>
+ <string name="Estate / Full Region">
+ Estate / Hel region
+ </string>
+ <string name="Estate / Homestead">
+ Estate / Homestead
+ </string>
+ <string name="Mainland / Homestead">
+ Mainland / Homestead
+ </string>
+ <string name="Mainland / Full Region">
+ Mainland / Hel region
+ </string>
+ <string name="all_files">
+ Alle filer
+ </string>
+ <string name="sound_files">
+ Lyde
+ </string>
+ <string name="animation_files">
+ Animationer
+ </string>
+ <string name="image_files">
+ Billeder
+ </string>
+ <string name="save_file_verb">
+ Gem
+ </string>
+ <string name="load_file_verb">
+ Hent
+ </string>
+ <string name="targa_image_files">
+ Targa billeder
+ </string>
+ <string name="bitmap_image_files">
+ Bitmap billeder
+ </string>
+ <string name="avi_movie_file">
+ AVI film fil
+ </string>
+ <string name="xaf_animation_file">
+ XAF Anim Fil
+ </string>
+ <string name="xml_file">
+ XML Fil
+ </string>
+ <string name="raw_file">
+ RAW fil
+ </string>
+ <string name="compressed_image_files">
+ Komprimerede billeder
+ </string>
+ <string name="load_files">
+ Hent filer
+ </string>
+ <string name="choose_the_directory">
+ Vælg bibliotek
+ </string>
+ <string name="AvatarSetNotAway">
+ Sæt &quot;til stede&quot;
+ </string>
+ <string name="AvatarSetAway">
+ Sæt &quot;væk&quot;
+ </string>
+ <string name="AvatarSetNotBusy">
+ Sæt &quot;ledig&quot;
+ </string>
+ <string name="AvatarSetBusy">
+ Sæt &quot;optaget&quot;
+ </string>
+ <string name="shape">
+ Form
+ </string>
+ <string name="skin">
+ Hud
+ </string>
+ <string name="hair">
+ HÃ¥r
+ </string>
+ <string name="eyes">
+ Øjne
+ </string>
+ <string name="shirt">
+ Trøje
+ </string>
+ <string name="pants">
+ Bukser
+ </string>
+ <string name="shoes">
+ Sko
+ </string>
+ <string name="socks">
+ Strømper
+ </string>
+ <string name="jacket">
+ Jakke
+ </string>
+ <string name="gloves">
+ Handsker
+ </string>
+ <string name="undershirt">
+ Undertrøje
+ </string>
+ <string name="underpants">
+ Underbukser
+ </string>
+ <string name="skirt">
+ Nederdel
+ </string>
+ <string name="alpha">
+ Alpha
+ </string>
+ <string name="tattoo">
+ Tatovering
+ </string>
+ <string name="physics">
+ Fysik
+ </string>
+ <string name="invalid">
+ ugyldig
+ </string>
+ <string name="none">
+ ingen
+ </string>
+ <string name="shirt_not_worn">
+ Trøje - ikke på
+ </string>
+ <string name="pants_not_worn">
+ Bukser - ikke på
+ </string>
+ <string name="shoes_not_worn">
+ Sko - ikke på
+ </string>
+ <string name="socks_not_worn">
+ Strømper - ikke på
+ </string>
+ <string name="jacket_not_worn">
+ Jakke - ikke på
+ </string>
+ <string name="gloves_not_worn">
+ Handsker - ikke på
+ </string>
+ <string name="undershirt_not_worn">
+ Undertrøje - ikke på
+ </string>
+ <string name="underpants_not_worn">
+ Underbukser - ikke på
+ </string>
+ <string name="skirt_not_worn">
+ Nederdel - ikke på
+ </string>
+ <string name="alpha_not_worn">
+ Alpha ikke benyttet
+ </string>
+ <string name="tattoo_not_worn">
+ Tatovering ikke benyttet
+ </string>
+ <string name="physics_not_worn">
+ Ikke noget fysisk båret
+ </string>
+ <string name="invalid_not_worn">
+ ugyldig
+ </string>
+ <string name="create_new_shape">
+ Opret ny figur
+ </string>
+ <string name="create_new_skin">
+ Opret nyt hud
+ </string>
+ <string name="create_new_hair">
+ Opret nyt hår
+ </string>
+ <string name="create_new_eyes">
+ Opret nye øjne
+ </string>
+ <string name="create_new_shirt">
+ Opret ny trøje
+ </string>
+ <string name="create_new_pants">
+ Opret nye bukser
+ </string>
+ <string name="create_new_shoes">
+ Opret nye sko
+ </string>
+ <string name="create_new_socks">
+ Opret nye strømper
+ </string>
+ <string name="create_new_jacket">
+ Opret ny jakke
+ </string>
+ <string name="create_new_gloves">
+ Opret nye handsker
+ </string>
+ <string name="create_new_undershirt">
+ Opret ny undertrøje
+ </string>
+ <string name="create_new_underpants">
+ Opret nye underbukser
+ </string>
+ <string name="create_new_skirt">
+ Opret ny nederdel
+ </string>
+ <string name="create_new_alpha">
+ Opret ny alpha
+ </string>
+ <string name="create_new_tattoo">
+ Opret ny tatovering
+ </string>
+ <string name="create_new_physics">
+ Opret ny fysik
+ </string>
+ <string name="create_new_invalid">
+ ugyldig
+ </string>
+ <string name="NewWearable">
+ Ny [WEARABLE_ITEM]
+ </string>
+ <string name="next">
+ Næste
+ </string>
+ <string name="ok">
+ OK
+ </string>
+ <string name="GroupNotifyGroupNotice">
+ Gruppe besked
+ </string>
+ <string name="GroupNotifyGroupNotices">
+ Gruppe besked
+ </string>
+ <string name="GroupNotifySentBy">
+ Sendt af
+ </string>
+ <string name="GroupNotifyAttached">
+ Vedhæftet:
+ </string>
+ <string name="GroupNotifyViewPastNotices">
+ Se tidligere beskeder eller slå modtagelse af beskeder fra her.
+ </string>
+ <string name="GroupNotifyOpenAttachment">
+ Åben vedhæng
+ </string>
+ <string name="GroupNotifySaveAttachment">
+ Gem vedhæng
+ </string>
+ <string name="TeleportOffer">
+ Teleport tilbud
+ </string>
+ <string name="StartUpNotifications">
+ Nye beskeder modtaget mens du var væk......
+ </string>
+ <string name="OverflowInfoChannelString">
+ Du har %d mere besked(er)
+ </string>
+ <string name="BodyPartsRightArm">
+ Højre arm
+ </string>
+ <string name="BodyPartsHead">
+ Hoved
+ </string>
+ <string name="BodyPartsLeftArm">
+ Venstre arm
+ </string>
+ <string name="BodyPartsLeftLeg">
+ Venstre ben
+ </string>
+ <string name="BodyPartsTorso">
+ Overkrop
+ </string>
+ <string name="BodyPartsRightLeg">
+ Højre ben
+ </string>
+ <string name="GraphicsQualityLow">
+ Lav
+ </string>
+ <string name="GraphicsQualityMid">
+ Middel
+ </string>
+ <string name="GraphicsQualityHigh">
+ Høj
+ </string>
+ <string name="LeaveMouselook">
+ Tryk ESC for at skift til normalt udsyn
+ </string>
+ <string name="InventoryNoMatchingItems">
+ Fandt du ikke hvad du søgte? Prøv [secondlife:///app/search/all/[SEARCH_TERM] Search].
+ </string>
+ <string name="PlacesNoMatchingItems">
+ Fandt du ikke hvad du søgte? Prøv [secondlife:///app/search/places/[SEARCH_TERM] Search].
+ </string>
+ <string name="FavoritesNoMatchingItems">
+ Træk et landemærke hertil for at tilføje den som favorit.
+ </string>
+ <string name="InventoryNoTexture">
+ Du har ikke en kopi af denne tekstur i din beholdning
+ </string>
+ <string name="no_transfer" value=" (ikke overdragbar)"/>
+ <string name="no_modify" value=" (ikke redigere)"/>
+ <string name="no_copy" value=" (ikke kopiere)"/>
+ <string name="worn" value=" (båret)"/>
+ <string name="link" value=" (link)"/>
+ <string name="broken_link" value=" (brudt link)"/>
+ <string name="LoadingContents">
+ Henter indhold...
+ </string>
+ <string name="NoContents">
+ Intet indhold
+ </string>
+ <string name="WornOnAttachmentPoint" value=" (båret på [ATTACHMENT_POINT])"/>
+ <string name="ActiveGesture" value="[GESLABEL] (aktiv)"/>
+ <string name="Chat Message" value="Chat :"/>
+ <string name="Sound" value=" Lyd : "/>
+ <string name="Wait" value=" --- Vent : "/>
+ <string name="AnimFlagStop" value=" Stop Animation : "/>
+ <string name="AnimFlagStart" value=" Start Animation : "/>
+ <string name="Wave" value=" Vink "/>
+ <string name="GestureActionNone" value="Ingen"/>
+ <string name="HelloAvatar" value=" Hej, avatar! "/>
+ <string name="ViewAllGestures" value=" Se alle &gt;&gt;"/>
+ <string name="GetMoreGestures" value="FÃ¥ mere &gt;&gt;"/>
+ <string name="Animations" value=" Animationer,"/>
+ <string name="Calling Cards" value=" Visitkort,"/>
+ <string name="Clothing" value=" Tøj,"/>
+ <string name="Gestures" value=" Bevægelser,"/>
+ <string name="Landmarks" value=" Landemærker,"/>
+ <string name="Notecards" value=" Note,"/>
+ <string name="Objects" value=" Objekter,"/>
+ <string name="Scripts" value=" Scripts,"/>
+ <string name="Sounds" value=" Lyde,"/>
+ <string name="Textures" value=" Teksturer,"/>
+ <string name="Snapshots" value=" Fotos,"/>
+ <string name="No Filters" value="Nej "/>
+ <string name="Since Logoff" value=" - Siden log ud"/>
+ <string name="InvFolder My Inventory">
+ Min beholdning
+ </string>
+ <string name="InvFolder Library">
+ Bibliotek
+ </string>
+ <string name="InvFolder Textures">
+ Teksturer
+ </string>
+ <string name="InvFolder Sounds">
+ Lyde
+ </string>
+ <string name="InvFolder Calling Cards">
+ Visitkort
+ </string>
+ <string name="InvFolder Landmarks">
+ Landemærker
+ </string>
+ <string name="InvFolder Scripts">
+ Scripts
+ </string>
+ <string name="InvFolder Clothing">
+ Tøj
+ </string>
+ <string name="InvFolder Objects">
+ Objekter
+ </string>
+ <string name="InvFolder Notecards">
+ Noter
+ </string>
+ <string name="InvFolder New Folder">
+ Ny mappe
+ </string>
+ <string name="InvFolder Inventory">
+ Beholdning
+ </string>
+ <string name="InvFolder Uncompressed Images">
+ Ukomprimerede billeder
+ </string>
+ <string name="InvFolder Body Parts">
+ Kropsdele
+ </string>
+ <string name="InvFolder Trash">
+ Papirkurv
+ </string>
+ <string name="InvFolder Photo Album">
+ Fotoalbum
+ </string>
+ <string name="InvFolder Lost And Found">
+ Fundne genstande
+ </string>
+ <string name="InvFolder Uncompressed Sounds">
+ Ukomprimerede lyde
+ </string>
+ <string name="InvFolder Animations">
+ Animationer
+ </string>
+ <string name="InvFolder Gestures">
+ Bevægelser
+ </string>
+ <string name="InvFolder Favorite">
+ Mine favoritter
+ </string>
+ <string name="InvFolder favorite">
+ Mine favoritter
+ </string>
+ <string name="InvFolder Current Outfit">
+ Nuværende sæt
+ </string>
+ <string name="InvFolder Initial Outfits">
+ Start sæt
+ </string>
+ <string name="InvFolder My Outfits">
+ Mine sæt
+ </string>
+ <string name="InvFolder Accessories">
+ Tilbehør
+ </string>
+ <string name="InvFolder Meshes">
+ Meshes
+ </string>
+ <string name="InvFolder Friends">
+ Venner
+ </string>
+ <string name="InvFolder All">
+ Alle
+ </string>
+ <string name="Buy">
+ Køb
+ </string>
+ <string name="BuyforL$">
+ Køb for L$
+ </string>
+ <string name="Stone">
+ Sten
+ </string>
+ <string name="Metal">
+ Metal
+ </string>
+ <string name="Glass">
+ Glas
+ </string>
+ <string name="Wood">
+ Træ
+ </string>
+ <string name="Flesh">
+ Kød
+ </string>
+ <string name="Plastic">
+ Plastik
+ </string>
+ <string name="Rubber">
+ Gummi
+ </string>
+ <string name="Light">
+ Lys
+ </string>
+ <string name="KBShift">
+ Shift
+ </string>
+ <string name="KBCtrl">
+ Ctrl
+ </string>
+ <string name="Chest">
+ Bryst
+ </string>
+ <string name="Skull">
+ Hovedskal
+ </string>
+ <string name="Left Shoulder">
+ Venstre skulder
+ </string>
+ <string name="Right Shoulder">
+ Højre skulder
+ </string>
+ <string name="Left Hand">
+ Venstre hånd
+ </string>
+ <string name="Right Hand">
+ Højre hånd
+ </string>
+ <string name="Left Foot">
+ Venstre fod
+ </string>
+ <string name="Right Foot">
+ Højre fod
+ </string>
+ <string name="Spine">
+ Rygsøjle
+ </string>
+ <string name="Pelvis">
+ Bækken
+ </string>
+ <string name="Mouth">
+ Mund
+ </string>
+ <string name="Chin">
+ Hage
+ </string>
+ <string name="Left Ear">
+ Venstre øre
+ </string>
+ <string name="Right Ear">
+ Højre øre
+ </string>
+ <string name="Left Eyeball">
+ Venstre øje
+ </string>
+ <string name="Right Eyeball">
+ Højre øje
+ </string>
+ <string name="Nose">
+ Næse
+ </string>
+ <string name="R Upper Arm">
+ H overarm
+ </string>
+ <string name="R Forearm">
+ H underarm
+ </string>
+ <string name="L Upper Arm">
+ V overarm
+ </string>
+ <string name="L Forearm">
+ V underarm
+ </string>
+ <string name="Right Hip">
+ Højre hofte
+ </string>
+ <string name="R Upper Leg">
+ Højre lår
+ </string>
+ <string name="R Lower Leg">
+ H underben
+ </string>
+ <string name="Left Hip">
+ Venstre hofte
+ </string>
+ <string name="L Upper Leg">
+ Venstre lår
+ </string>
+ <string name="L Lower Leg">
+ V underben
+ </string>
+ <string name="Stomach">
+ Mave
+ </string>
+ <string name="Left Pec">
+ Venstre bryst
+ </string>
+ <string name="Right Pec">
+ Højre bryst
+ </string>
+ <string name="Invalid Attachment">
+ Ugyldig vedhæftningspunktt
+ </string>
+ <string name="YearsMonthsOld">
+ [AGEYEARS] [AGEMONTHS] gammel
+ </string>
+ <string name="YearsOld">
+ [AGEYEARS] gammel
+ </string>
+ <string name="MonthsOld">
+ [AGEMONTHS] gammel
+ </string>
+ <string name="WeeksOld">
+ [AGEWEEKS] gammel
+ </string>
+ <string name="DaysOld">
+ [AGEDAYS] gammel
+ </string>
+ <string name="TodayOld">
+ Med fra i dag
+ </string>
+ <string name="AgeYearsA">
+ [COUNT] år
+ </string>
+ <string name="AgeYearsB">
+ [COUNT] år
+ </string>
+ <string name="AgeYearsC">
+ [COUNT] år
+ </string>
+ <string name="AgeMonthsA">
+ [COUNT] måned
+ </string>
+ <string name="AgeMonthsB">
+ [COUNT] måneder
+ </string>
+ <string name="AgeMonthsC">
+ [COUNT] måneder
+ </string>
+ <string name="AgeWeeksA">
+ [COUNT] uge
+ </string>
+ <string name="AgeWeeksB">
+ [COUNT] uger
+ </string>
+ <string name="AgeWeeksC">
+ [COUNT] uger
+ </string>
+ <string name="AgeDaysA">
+ [COUNT] dag
+ </string>
+ <string name="AgeDaysB">
+ [COUNT] dage
+ </string>
+ <string name="AgeDaysC">
+ [COUNT] dage
+ </string>
+ <string name="GroupMembersA">
+ [COUNT] medlem
+ </string>
+ <string name="GroupMembersB">
+ [COUNT] medlemmer
+ </string>
+ <string name="GroupMembersC">
+ [COUNT] medlemmer
+ </string>
+ <string name="AcctTypeResident">
+ Beboer
+ </string>
+ <string name="AcctTypeTrial">
+ På prøve
+ </string>
+ <string name="AcctTypeCharterMember">
+ Æresmedlemmer
+ </string>
+ <string name="AcctTypeEmployee">
+ Linden Lab medarbejder
+ </string>
+ <string name="PaymentInfoUsed">
+ Betalende medlem
+ </string>
+ <string name="PaymentInfoOnFile">
+ Betalingsinfo registreret
+ </string>
+ <string name="NoPaymentInfoOnFile">
+ Ingen betalingsinfo
+ </string>
+ <string name="AgeVerified">
+ Alders-checket
+ </string>
+ <string name="NotAgeVerified">
+ Ikke alders-checket
+ </string>
+ <string name="Center 2">
+ Center 2
+ </string>
+ <string name="Top Right">
+ Øverst højre
+ </string>
+ <string name="Top">
+ Top
+ </string>
+ <string name="Top Left">
+ Øverst venstre
+ </string>
+ <string name="Center">
+ Centrum
+ </string>
+ <string name="Bottom Left">
+ Nederst venstre
+ </string>
+ <string name="Bottom">
+ Nederst midt
+ </string>
+ <string name="Bottom Right">
+ nederst højre
+ </string>
+ <string name="CompileQueueDownloadedCompiling">
+ Hentet, kompilerer nu
+ </string>
+ <string name="CompileQueueScriptNotFound">
+ Script ikke fundet på server.
+ </string>
+ <string name="CompileQueueProblemDownloading">
+ Problem ved download
+ </string>
+ <string name="CompileQueueInsufficientPermDownload">
+ Ikke rettigheder til at downloade script.
+ </string>
+ <string name="CompileQueueInsufficientPermFor">
+ Ikke nok rettigheder til at
+ </string>
+ <string name="CompileQueueUnknownFailure">
+ Ukendt fejl ved download
+ </string>
+ <string name="CompileQueueTitle">
+ Rekompilering fremskridt
+ </string>
+ <string name="CompileQueueStart">
+ Rekompilér
+ </string>
+ <string name="ResetQueueTitle">
+ Nulstil fremskridt
+ </string>
+ <string name="ResetQueueStart">
+ nulstil
+ </string>
+ <string name="RunQueueTitle">
+ Sæt &quot;running&quot; fremskridt
+ </string>
+ <string name="RunQueueStart">
+ sæt til &quot;running&quot;
+ </string>
+ <string name="NotRunQueueTitle">
+ Sæt &quot;Not Running&quot; fremskridt
+ </string>
+ <string name="NotRunQueueStart">
+ sæt til &quot;not running&quot;
+ </string>
+ <string name="CompileSuccessful">
+ Kompleret uden fejl!
+ </string>
+ <string name="CompileSuccessfulSaving">
+ Kompileret uden fejl, gemmer...
+ </string>
+ <string name="SaveComplete">
+ Gemt.
+ </string>
+ <string name="ObjectOutOfRange">
+ Script (&quot;object out of range&quot;)
+ </string>
+ <string name="GodToolsObjectOwnedBy">
+ Objekt [OBJECT] ejet af [OWNER]
+ </string>
+ <string name="GroupsNone">
+ ingen
+ </string>
+ <string name="Group" value=" (gruppe)"/>
+ <string name="Unknown">
+ (ukendt)
+ </string>
+ <string name="SummaryForTheWeek" value="Opsummering for denne uge, begyndende med "/>
+ <string name="NextStipendDay" value=". Næste stipendie dag er "/>
+ <string name="GroupIndividualShare" value=" Gruppe Individuel Delt"/>
+ <string name="GroupColumn" value="Gruppe"/>
+ <string name="Balance">
+ Balance
+ </string>
+ <string name="Credits">
+ Kredit
+ </string>
+ <string name="Debits">
+ Debet
+ </string>
+ <string name="Total">
+ Total
+ </string>
+ <string name="NoGroupDataFound">
+ Ingen gruppedata fundet for gruppe
+ </string>
+ <string name="IMParentEstate">
+ overordnet estate
+ </string>
+ <string name="IMMainland">
+ mainland
+ </string>
+ <string name="IMTeen">
+ teen
+ </string>
+ <string name="RegionInfoError">
+ fejl
+ </string>
+ <string name="RegionInfoAllEstatesOwnedBy">
+ alle estates ejet af [OWNER]
+ </string>
+ <string name="RegionInfoAllEstatesYouOwn">
+ alle estates du ejer
+ </string>
+ <string name="RegionInfoAllEstatesYouManage">
+ alle estates du administrerer for [OWNER]
+ </string>
+ <string name="RegionInfoAllowedResidents">
+ Godkendte beboere: ([ALLOWEDAGENTS], maks. [MAXACCESS])
+ </string>
+ <string name="RegionInfoAllowedGroups">
+ Godkendte grupper: ([ALLOWEDGROUPS], max. [MAXACCESS])
+ </string>
+ <string name="ScriptLimitsParcelScriptMemory">
+ Parcel script memory
+ </string>
+ <string name="ScriptLimitsParcelsOwned">
+ Parceller listet: [PARCELS]
+ </string>
+ <string name="ScriptLimitsMemoryUsed">
+ Memory brugt: [COUNT] kb ud af [MAX] kb; [AVAILABLE] kb tilgængeligt
+ </string>
+ <string name="ScriptLimitsMemoryUsedSimple">
+ Memory brugt: [COUNT] kb
+ </string>
+ <string name="ScriptLimitsParcelScriptURLs">
+ Parcel Script URL&apos;er
+ </string>
+ <string name="ScriptLimitsURLsUsed">
+ URL&apos;er brugt: [COUNT] ud af [MAX]; [AVAILABLE] tilgængelige
+ </string>
+ <string name="ScriptLimitsURLsUsedSimple">
+ URL&apos;er brugt: [COUNT]
+ </string>
+ <string name="ScriptLimitsRequestError">
+ Fejl ved anmodning om information
+ </string>
+ <string name="ScriptLimitsRequestNoParcelSelected">
+ Ingen parcel valgt
+ </string>
+ <string name="ScriptLimitsRequestWrongRegion">
+ Fejl: script information er kun tilgængelig i den nuværende region
+ </string>
+ <string name="ScriptLimitsRequestWaiting">
+ Henter information...
+ </string>
+ <string name="ScriptLimitsRequestDontOwnParcel">
+ Du har ikke rettigheder til at undersøge denne parcel
+ </string>
+ <string name="SITTING_ON">
+ Sidder på
+ </string>
+ <string name="ATTACH_CHEST">
+ Bryst
+ </string>
+ <string name="ATTACH_HEAD">
+ Hoved
+ </string>
+ <string name="ATTACH_LSHOULDER">
+ Venstre skulder
+ </string>
+ <string name="ATTACH_RSHOULDER">
+ Højre skulder
+ </string>
+ <string name="ATTACH_LHAND">
+ Venstre hånd
+ </string>
+ <string name="ATTACH_RHAND">
+ Højre hånd
+ </string>
+ <string name="ATTACH_LFOOT">
+ Venstre fod
+ </string>
+ <string name="ATTACH_RFOOT">
+ Højre fod
+ </string>
+ <string name="ATTACH_BACK">
+ Ryg
+ </string>
+ <string name="ATTACH_PELVIS">
+ Bækken
+ </string>
+ <string name="ATTACH_MOUTH">
+ Mund
+ </string>
+ <string name="ATTACH_CHIN">
+ Hage
+ </string>
+ <string name="ATTACH_LEAR">
+ Venstre øre
+ </string>
+ <string name="ATTACH_REAR">
+ Højre øre
+ </string>
+ <string name="ATTACH_LEYE">
+ Venstre øje
+ </string>
+ <string name="ATTACH_REYE">
+ Højre øje
+ </string>
+ <string name="ATTACH_NOSE">
+ Næse
+ </string>
+ <string name="ATTACH_RUARM">
+ Højre overarm
+ </string>
+ <string name="ATTACH_RLARM">
+ Højre underarm
+ </string>
+ <string name="ATTACH_LUARM">
+ Venstre overarm
+ </string>
+ <string name="ATTACH_LLARM">
+ Venstre underarm
+ </string>
+ <string name="ATTACH_RHIP">
+ Højre hofte
+ </string>
+ <string name="ATTACH_RULEG">
+ Højre lår
+ </string>
+ <string name="ATTACH_RLLEG">
+ Højre underben
+ </string>
+ <string name="ATTACH_LHIP">
+ Venstre hofte
+ </string>
+ <string name="ATTACH_LULEG">
+ Venste lår
+ </string>
+ <string name="ATTACH_LLLEG">
+ Venstre underben
+ </string>
+ <string name="ATTACH_BELLY">
+ Mave
+ </string>
+ <string name="ATTACH_RPEC">
+ Højre bryst
+ </string>
+ <string name="ATTACH_LPEC">
+ Venstre bryst
+ </string>
+ <string name="ATTACH_HUD_CENTER_2">
+ HUD Center 2
+ </string>
+ <string name="ATTACH_HUD_TOP_RIGHT">
+ HUD Øverst til højre
+ </string>
+ <string name="ATTACH_HUD_TOP_CENTER">
+ HUD Foroven midtpå
+ </string>
+ <string name="ATTACH_HUD_TOP_LEFT">
+ HUD Øverst til venstre
+ </string>
+ <string name="ATTACH_HUD_CENTER_1">
+ HUD Center 1
+ </string>
+ <string name="ATTACH_HUD_BOTTOM_LEFT">
+ HUD Nederst til venstre
+ </string>
+ <string name="ATTACH_HUD_BOTTOM">
+ HUD For neden
+ </string>
+ <string name="ATTACH_HUD_BOTTOM_RIGHT">
+ HUD Nederst til højre
+ </string>
+ <string name="CursorPos">
+ Linie [LINE], Kolonne [COLUMN]
+ </string>
+ <string name="PanelDirCountFound">
+ [COUNT] fundet
+ </string>
+ <string name="PanelContentsTooltip">
+ Indhold i objekt
+ </string>
+ <string name="PanelContentsNewScript">
+ Nyt script
+ </string>
+ <string name="BusyModeResponseDefault">
+ Beboeren du sendte en besked er &apos;optaget&apos;, hvilket betyder at han/hun ikke vil forstyrres. Din besked vil blive vis i hans/hendes IM panel til senere visning.
+ </string>
+ <string name="MuteByName">
+ (Efter navn)
+ </string>
+ <string name="MuteAgent">
+ (beboer)
+ </string>
+ <string name="MuteObject">
+ (Objekt)
+ </string>
+ <string name="MuteGroup">
+ (Gruppe)
+ </string>
+ <string name="MuteExternal">
+ (Ekstern)
+ </string>
+ <string name="RegionNoCovenant">
+ Der er ingen regler for dette estate.
+ </string>
+ <string name="RegionNoCovenantOtherOwner">
+ Der er ingen regler for dette estate. Land på dette estate sælges af estate ejeren, ikke af Linden Lab. Kontakt venligst estate ejeren for detaljer om salg.
+ </string>
+ <string name="covenant_last_modified" value="Sidst rettet: "/>
+ <string name="none_text" value=" (ingen) "/>
+ <string name="never_text" value=" (aldrig) "/>
+ <string name="GroupOwned">
+ Gruppe ejet
+ </string>
+ <string name="Public">
+ Offentlig
+ </string>
+ <string name="ClassifiedClicksTxt">
+ Klik: [TELEPORT] teleport, [MAP] kort, [PROFILE] profil
+ </string>
+ <string name="ClassifiedUpdateAfterPublish">
+ (vil blive opdateret efter offentliggørelse)
+ </string>
+ <string name="NoPicksClassifiedsText">
+ Du har ikke oprettet nogen favoritter eller annoncer. Klik på plus knappen nedenfor for at oprette en favorit eller en annonce.
+ </string>
+ <string name="NoAvatarPicksClassifiedsText">
+ Bruger har ingen favoritter eller annoncer
+ </string>
+ <string name="PicksClassifiedsLoadingText">
+ Henter...
+ </string>
+ <string name="MultiPreviewTitle">
+ Vis først
+ </string>
+ <string name="MultiPropertiesTitle">
+ Egenskaber
+ </string>
+ <string name="InvOfferAnObjectNamed">
+ Et objekt med navnet
+ </string>
+ <string name="InvOfferOwnedByGroup">
+ ejet af gruppen
+ </string>
+ <string name="InvOfferOwnedByUnknownGroup">
+ ejet af en ukendt gruppe
+ </string>
+ <string name="InvOfferOwnedBy">
+ ejet af
+ </string>
+ <string name="InvOfferOwnedByUnknownUser">
+ ejet af en ukendt bruger
+ </string>
+ <string name="InvOfferGaveYou">
+ gav dig
+ </string>
+ <string name="InvOfferDecline">
+ Du afslår [DESC] fra &lt;nolink&gt;[NAME]&lt;/nolink&gt;.
+ </string>
+ <string name="GroupMoneyTotal">
+ Total
+ </string>
+ <string name="GroupMoneyBought">
+ købt
+ </string>
+ <string name="GroupMoneyPaidYou">
+ betalte dig
+ </string>
+ <string name="GroupMoneyPaidInto">
+ betalt til
+ </string>
+ <string name="GroupMoneyBoughtPassTo">
+ købte adgang til
+ </string>
+ <string name="GroupMoneyPaidFeeForEvent">
+ betalte gebyr for event
+ </string>
+ <string name="GroupMoneyPaidPrizeForEvent">
+ betalte prisen for event
+ </string>
+ <string name="GroupMoneyBalance">
+ Balance
+ </string>
+ <string name="GroupMoneyCredits">
+ Kredit
+ </string>
+ <string name="GroupMoneyDebits">
+ Debet
+ </string>
+ <string name="ViewerObjectContents">
+ Indhold
+ </string>
+ <string name="AcquiredItems">
+ Anskaffede genstande
+ </string>
+ <string name="Cancel">
+ Annullér
+ </string>
+ <string name="UploadingCosts">
+ Uploader [NAME] pris L$ [AMOUNT]
+ </string>
+ <string name="BuyingCosts">
+ At købe dette koster L$ [AMOUNT]
+ </string>
+ <string name="UnknownFileExtension">
+ Ukendt fil efternavn [.%s]
+Forventet .wav, .tga, .bmp, .jpg, .jpeg, or .bvh
+ </string>
+ <string name="MuteObject2">
+ Blokér
+ </string>
+ <string name="AddLandmarkNavBarMenu">
+ Tilføj landemærke...
+ </string>
+ <string name="EditLandmarkNavBarMenu">
+ Redigér landemærke...
+ </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">
+ Fil gemt
+ </string>
+ <string name="Receiving">
+ Modtager
+ </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">
+ Fremad
+ </string>
+ <string name="Direction_Left">
+ Venstre
+ </string>
+ <string name="Direction_Right">
+ Højre
+ </string>
+ <string name="Direction_Back">
+ Bagud
+ </string>
+ <string name="Direction_North">
+ Nord
+ </string>
+ <string name="Direction_South">
+ Syd
+ </string>
+ <string name="Direction_West">
+ Vest
+ </string>
+ <string name="Direction_East">
+ Øst
+ </string>
+ <string name="Direction_Up">
+ Op
+ </string>
+ <string name="Direction_Down">
+ Ned
+ </string>
+ <string name="Any Category">
+ Enhver kategori
+ </string>
+ <string name="Shopping">
+ Shopping
+ </string>
+ <string name="Land Rental">
+ Land til leje
+ </string>
+ <string name="Property Rental">
+ Grunde til leje
+ </string>
+ <string name="Special Attraction">
+ Speciel attraktion
+ </string>
+ <string name="New Products">
+ Nye produkter
+ </string>
+ <string name="Employment">
+ Jobs
+ </string>
+ <string name="Wanted">
+ Søges
+ </string>
+ <string name="Service">
+ Service
+ </string>
+ <string name="Personal">
+ Personlig
+ </string>
+ <string name="None">
+ Ingen
+ </string>
+ <string name="Linden Location">
+ Linden sted
+ </string>
+ <string name="Adult">
+ Adult
+ </string>
+ <string name="Arts&amp;Culture">
+ Kunst &amp; kultur
+ </string>
+ <string name="Business">
+ Business
+ </string>
+ <string name="Educational">
+ Uddannelse
+ </string>
+ <string name="Gaming">
+ Spil
+ </string>
+ <string name="Hangout">
+ Afslapning
+ </string>
+ <string name="Newcomer Friendly">
+ Nybegynder venligt
+ </string>
+ <string name="Parks&amp;Nature">
+ Parker &amp; natur
+ </string>
+ <string name="Residential">
+ Beboelse
+ </string>
+ <string name="Stage">
+ Fase
+ </string>
+ <string name="Other">
+ Andet
+ </string>
+ <string name="Rental">
+ Leje
+ </string>
+ <string name="Any">
+ Enhver
+ </string>
+ <string name="You">
+ Du
+ </string>
+ <string name="Multiple Media">
+ Flere medietyper
+ </string>
+ <string name="Play Media">
+ Afspil/Pause medie
+ </string>
+ <string name="MBCmdLineError">
+ Der opstod en fejl ved afvikling af kommandolinie.
+Se venligst: http://wiki.secondlife.com/wiki/Client_parameters
+Fejl:
+ </string>
+ <string name="MBCmdLineUsg">
+ [APP_NAME] Kommando linie brug:
+ </string>
+ <string name="MBUnableToAccessFile">
+ [APP_NAME] kan ikke få adgang til fil den/det skal bruge.
+
+Dette kan skyldes at du har flere kopier kørende eller operativsystemet tror at filen allerede er åben.
+Hvis fejlen bliver ved, genstart computer og prøv igen.
+Hvis fejlen stadig bliver ved, kan det være nødvendigt at afinstallere [APP_NAME] og installere igen.
+ </string>
+ <string name="MBFatalError">
+ Fatal fejl
+ </string>
+ <string name="MBRequiresAltiVec">
+ [APP_NAME] kræver en processor med AltiVec (G4 eller nyere).
+ </string>
+ <string name="MBAlreadyRunning">
+ [APP_NAME] kører allerede.
+Undersøg din &quot;task bar&quot; for at se efter minimeret version af programmet.
+Hvis fejlen fortsætter, prøv at genstarte din computer.
+ </string>
+ <string name="MBFrozenCrashed">
+ [APP_NAME] ser ud til at være &quot;frosset&quot; eller gået ned tidligere.
+Ønsker du at sende en fejlrapport?
+ </string>
+ <string name="MBAlert">
+ Besked
+ </string>
+ <string name="MBNoDirectX">
+ [APP_NAME] kan ikke detektere DirectX 9.0b eller nyere.
+[APP_NAME] benytte DirectX til at detektere hardware og/eller forældede drivere der kan give problemer med stabilitet, dårlig hastighed eller nedbrud. Selvom du kan køre [APP_NAME] uden det, anbefaler vi meget at køre med DirectX 9.0b.
+
+Ønsker du at fortsætte?
+ </string>
+ <string name="MBWarning">
+ Advarsel
+ </string>
+ <string name="MBNoAutoUpdate">
+ Automatisk opdatering er endnu ikke implementeret på Linux.
+Hent venligst den nyeste version på www.secondlife.com.
+ </string>
+ <string name="MBRegClassFailed">
+ RegisterClass fejlede
+ </string>
+ <string name="MBError">
+ Fejl
+ </string>
+ <string name="MBFullScreenErr">
+ Ikke muligt at køre i fuldskærm med [WIDTH] x [HEIGHT].
+Afvikler i vindue.
+ </string>
+ <string name="MBDestroyWinFailed">
+ Nedlukningsfejl ved lukning af vindue (DestroyWindow() fejlede)
+ </string>
+ <string name="MBShutdownErr">
+ Fejl ved nedlukning
+ </string>
+ <string name="MBDevContextErr">
+ Kan ikke oprette &quot;GL device context&quot;
+ </string>
+ <string name="MBPixelFmtErr">
+ Kan ikke finde passende &quot;pixel format&quot;
+ </string>
+ <string name="MBPixelFmtDescErr">
+ Kan ikke finde &quot;pixel format&quot; beskrivelse
+ </string>
+ <string name="MBTrueColorWindow">
+ [APP_NAME] kræver &quot;True Color (32-bit)&quot; for at kunne køre.
+Gå venligst til din computers skærmopsætning og sæt &quot;color mode&quot; til 32-bit.
+ </string>
+ <string name="MBAlpha">
+ [APP_NAME] kan ikke køre, da den ikke kan finde en &quot;8 bit alpha channel&quot;. Normalt skyldes dette et problem med en video driver.
+Venligst undersøg om du har de nyeste drivere til dit videokort installeret.
+Din skærm skal også være sat op til at køre &quot;True Color (32-bit)&quot; i din displayopsætning.
+Hvis du bliver ved med at modtage denne besked, kontakt [SUPPORT_SITE].
+ </string>
+ <string name="MBPixelFmtSetErr">
+ Kan ikke sætte &quot;pixel format&quot;
+ </string>
+ <string name="MBGLContextErr">
+ Kan ikke oprette &quot;GL rendering context&quot;
+ </string>
+ <string name="MBGLContextActErr">
+ Kan ikke aktivere &quot;GL rendering context&quot;
+ </string>
+ <string name="MBVideoDrvErr">
+ [APP_NAME] kan ikke afvikles da driverne til dit videokort ikke blev installeret korrekt, er forældede, eller du benytter hardware der ikke er supporteret. Undersøg venligst om du har installeret de nyeste drivere til dit grafikkort, og selv om du har de nyeste, prøv at geninstallere dem.
+
+Hvis du bliver ved med at modtage denne besked, kontakt venligst [SUPPORT_SITE].
+ </string>
+ <string name="5 O&apos;Clock Shadow">
+ Skægstubbe
+ </string>
+ <string name="All White">
+ Helt hvidt
+ </string>
+ <string name="Anime Eyes">
+ Store øjne
+ </string>
+ <string name="Arced">
+ Spidst
+ </string>
+ <string name="Arm Length">
+ Armængde
+ </string>
+ <string name="Attached">
+ Vedhæftet
+ </string>
+ <string name="Attached Earlobes">
+ Vedhæftede øreflipper
+ </string>
+ <string name="Back Fringe">
+ Nakkehår
+ </string>
+ <string name="Baggy">
+ Posede
+ </string>
+ <string name="Bangs">
+ Pandehår
+ </string>
+ <string name="Beady Eyes">
+ Stikkende øjne
+ </string>
+ <string name="Belly Size">
+ Mave størrelse
+ </string>
+ <string name="Big">
+ Stor
+ </string>
+ <string name="Big Butt">
+ Stor bagdel
+ </string>
+ <string name="Big Hair Back">
+ Stort hår: Bag
+ </string>
+ <string name="Big Hair Front">
+ Stort hår: Foran
+ </string>
+ <string name="Big Hair Top">
+ Stort hår: Top
+ </string>
+ <string name="Big Head">
+ Stort hovede
+ </string>
+ <string name="Big Pectorals">
+ Store brystmuskler
+ </string>
+ <string name="Big Spikes">
+ Store spikes
+ </string>
+ <string name="Black">
+ Sort
+ </string>
+ <string name="Blonde">
+ Blond
+ </string>
+ <string name="Blonde Hair">
+ Blondt hår
+ </string>
+ <string name="Blush">
+ Rødmen
+ </string>
+ <string name="Blush Color">
+ Rødme farve
+ </string>
+ <string name="Blush Opacity">
+ Rødme gennemsigtighed
+ </string>
+ <string name="Body Definition">
+ Kropskontur
+ </string>
+ <string name="Body Fat">
+ Kropsfedt
+ </string>
+ <string name="Body Freckles">
+ Fregner på kroppen
+ </string>
+ <string name="Body Thick">
+ Tyk krop
+ </string>
+ <string name="Body Thickness">
+ Kropstykkelse
+ </string>
+ <string name="Body Thin">
+ Tynd krop
+ </string>
+ <string name="Bow Legged">
+ Hjulbenet
+ </string>
+ <string name="Breast Buoyancy">
+ Bryst tyngdepåvirkning
+ </string>
+ <string name="Breast Cleavage">
+ Kavalergang
+ </string>
+ <string name="Breast Size">
+ Bryststørrelse
+ </string>
+ <string name="Bridge Width">
+ Bredde næseryg
+ </string>
+ <string name="Broad">
+ Bred
+ </string>
+ <string name="Brow Size">
+ Størrelse øjenbryn
+ </string>
+ <string name="Bug Eyes">
+ Udstående øjne
+ </string>
+ <string name="Bugged Eyes">
+ Udstående øjne
+ </string>
+ <string name="Bulbous">
+ Kartoffelnæse
+ </string>
+ <string name="Bulbous Nose">
+ Kartoffelnæse
+ </string>
+ <string name="Breast Physics Mass">
+ Bryst fylde
+ </string>
+ <string name="Breast Physics Smoothing">
+ Brystudjævning
+ </string>
+ <string name="Breast Physics Gravity">
+ Bryst tyngde
+ </string>
+ <string name="Breast Physics Drag">
+ Bryst inerti
+ </string>
+ <string name="Breast Physics InOut Max Effect">
+ Maks. effekt
+ </string>
+ <string name="Breast Physics InOut Spring">
+ Fjeder
+ </string>
+ <string name="Breast Physics InOut Gain">
+ Øg
+ </string>
+ <string name="Breast Physics InOut Damping">
+ Dæmpning
+ </string>
+ <string name="Breast Physics UpDown Max Effect">
+ Maks. effekt
+ </string>
+ <string name="Breast Physics UpDown Spring">
+ Fjeder
+ </string>
+ <string name="Breast Physics UpDown Gain">
+ Øg
+ </string>
+ <string name="Breast Physics UpDown Damping">
+ Dæmpning
+ </string>
+ <string name="Breast Physics LeftRight Max Effect">
+ Maks. effekt
+ </string>
+ <string name="Breast Physics LeftRight Spring">
+ Fjeder
+ </string>
+ <string name="Breast Physics LeftRight Gain">
+ Øg
+ </string>
+ <string name="Breast Physics LeftRight Damping">
+ Dæmpning
+ </string>
+ <string name="Belly Physics Mass">
+ Mave omfang
+ </string>
+ <string name="Belly Physics Smoothing">
+ maveudjævning
+ </string>
+ <string name="Belly Physics Gravity">
+ Mave tyngde
+ </string>
+ <string name="Belly Physics Drag">
+ Mave inerti
+ </string>
+ <string name="Belly Physics UpDown Max Effect">
+ Maks. effekt
+ </string>
+ <string name="Belly Physics UpDown Spring">
+ Fjeder
+ </string>
+ <string name="Belly Physics UpDown Gain">
+ Øg
+ </string>
+ <string name="Belly Physics UpDown Damping">
+ Dæmpning
+ </string>
+ <string name="Butt Physics Mass">
+ Bagdel omfang
+ </string>
+ <string name="Butt Physics Smoothing">
+ Bagdelsudjævning
+ </string>
+ <string name="Butt Physics Gravity">
+ Bagdel tyngde
+ </string>
+ <string name="Butt Physics Drag">
+ Bagdel modstand
+ </string>
+ <string name="Butt Physics UpDown Max Effect">
+ Maks. effekt
+ </string>
+ <string name="Butt Physics UpDown Spring">
+ Fjeder
+ </string>
+ <string name="Butt Physics UpDown Gain">
+ Øg
+ </string>
+ <string name="Butt Physics UpDown Damping">
+ Dæmpning
+ </string>
+ <string name="Butt Physics LeftRight Max Effect">
+ Maks. effekt
+ </string>
+ <string name="Butt Physics LeftRight Spring">
+ Fjeder
+ </string>
+ <string name="Butt Physics LeftRight Gain">
+ Øg
+ </string>
+ <string name="Butt Physics LeftRight Damping">
+ Dæmpning
+ </string>
+ <string name="Bushy Eyebrows">
+ Buskede øjenbryn
+ </string>
+ <string name="Bushy Hair">
+ Busket hår
+ </string>
+ <string name="Butt Size">
+ Størrelse bagdel
+ </string>
+ <string name="Butt Gravity">
+ Bagdel tyngde
+ </string>
+ <string name="bustle skirt">
+ Tournure
+ </string>
+ <string name="no bustle">
+ Ingen tournure
+ </string>
+ <string name="more bustle">
+ Mere tournure
+ </string>
+ <string name="Chaplin">
+ Chaplin
+ </string>
+ <string name="Cheek Bones">
+ Kindben
+ </string>
+ <string name="Chest Size">
+ Bryst størrelse
+ </string>
+ <string name="Chin Angle">
+ Hage form
+ </string>
+ <string name="Chin Cleft">
+ Hagekløft
+ </string>
+ <string name="Chin Curtains">
+ Hageskæg
+ </string>
+ <string name="Chin Depth">
+ Hage dybde
+ </string>
+ <string name="Chin Heavy">
+ Stort forneden
+ </string>
+ <string name="Chin In">
+ Vigende hage
+ </string>
+ <string name="Chin Out">
+ Hage frem
+ </string>
+ <string name="Chin-Neck">
+ Hals under hage
+ </string>
+ <string name="Clear">
+ Slet
+ </string>
+ <string name="Cleft">
+ Kløft
+ </string>
+ <string name="Close Set Eyes">
+ Tætsiddende øjne
+ </string>
+ <string name="Closed">
+ Lukket
+ </string>
+ <string name="Closed Back">
+ Lukket bagtil
+ </string>
+ <string name="Closed Front">
+ Lukket foran
+ </string>
+ <string name="Closed Left">
+ Lukket til venstre
+ </string>
+ <string name="Closed Right">
+ Lukket til højre
+ </string>
+ <string name="Coin Purse">
+ Lille
+ </string>
+ <string name="Collar Back">
+ Krave bagtil
+ </string>
+ <string name="Collar Front">
+ Krave foran
+ </string>
+ <string name="Corner Down">
+ Nedadvendt
+ </string>
+ <string name="Corner Up">
+ Opadvendt
+ </string>
+ <string name="Creased">
+ Rynket
+ </string>
+ <string name="Crooked Nose">
+ Skæv næse
+ </string>
+ <string name="Cuff Flare">
+ Svaj
+ </string>
+ <string name="Dark">
+ Mørk
+ </string>
+ <string name="Dark Green">
+ Mørkegrøn
+ </string>
+ <string name="Darker">
+ Mørkere
+ </string>
+ <string name="Deep">
+ Dyb
+ </string>
+ <string name="Default Heels">
+ Standard hæle
+ </string>
+ <string name="Dense">
+ Tæt
+ </string>
+ <string name="Double Chin">
+ Dobbelthage
+ </string>
+ <string name="Downturned">
+ Peger nedad
+ </string>
+ <string name="Duffle Bag">
+ Stort
+ </string>
+ <string name="Ear Angle">
+ Øre vinkel
+ </string>
+ <string name="Ear Size">
+ Øre størrelse
+ </string>
+ <string name="Ear Tips">
+ Ørespidser
+ </string>
+ <string name="Egg Head">
+ Ovalt hovede
+ </string>
+ <string name="Eye Bags">
+ Poser under øjne
+ </string>
+ <string name="Eye Color">
+ Øjenfarve
+ </string>
+ <string name="Eye Depth">
+ Øjendybde
+ </string>
+ <string name="Eye Lightness">
+ Øjennuance
+ </string>
+ <string name="Eye Opening">
+ Øjenåbning
+ </string>
+ <string name="Eye Pop">
+ Øjensymmetri
+ </string>
+ <string name="Eye Size">
+ Øjenstørrelse
+ </string>
+ <string name="Eye Spacing">
+ Øjenafstand
+ </string>
+ <string name="Eyebrow Arc">
+ Bue på øjenbryn
+ </string>
+ <string name="Eyebrow Density">
+ Tæthed øjenbryn
+ </string>
+ <string name="Eyebrow Height">
+ Højde på øjenbryn
+ </string>
+ <string name="Eyebrow Points">
+ Løftede øjenbryn
+ </string>
+ <string name="Eyebrow Size">
+ Størrelse øjenbryn
+ </string>
+ <string name="Eyelash Length">
+ Længde øjenvipper
+ </string>
+ <string name="Eyeliner">
+ Eyeliner
+ </string>
+ <string name="Eyeliner Color">
+ Eyeliner farve
+ </string>
+ <string name="Eyes Bugged">
+ Udstående øjne
+ </string>
+ <string name="Face Shear">
+ Ansigts symmetri
+ </string>
+ <string name="Facial Definition">
+ Ansigtskonturer
+ </string>
+ <string name="Far Set Eyes">
+ Stor afstand mellem øjne
+ </string>
+ <string name="Fat Lips">
+ Tykke læber
+ </string>
+ <string name="Female">
+ Kvinde
+ </string>
+ <string name="Fingerless">
+ Fingerløse
+ </string>
+ <string name="Fingers">
+ Fingre
+ </string>
+ <string name="Flared Cuffs">
+ Stor vidde
+ </string>
+ <string name="Flat">
+ Flad
+ </string>
+ <string name="Flat Butt">
+ Flad bagdel
+ </string>
+ <string name="Flat Head">
+ Fladt hovede
+ </string>
+ <string name="Flat Toe">
+ Flad snude
+ </string>
+ <string name="Foot Size">
+ Størrelse fod
+ </string>
+ <string name="Forehead Angle">
+ Pande vinkel
+ </string>
+ <string name="Forehead Heavy">
+ Stort foroven
+ </string>
+ <string name="Freckles">
+ Fregner
+ </string>
+ <string name="Front Fringe">
+ Frynser foran
+ </string>
+ <string name="Full Back">
+ Langt ud bagtil
+ </string>
+ <string name="Full Eyeliner">
+ Meget eyeliner
+ </string>
+ <string name="Full Front">
+ Langt frem fortil
+ </string>
+ <string name="Full Hair Sides">
+ HÃ¥r i siderne
+ </string>
+ <string name="Full Sides">
+ Meget hår
+ </string>
+ <string name="Glossy">
+ Skinnende
+ </string>
+ <string name="Glove Fingers">
+ Fingre i handsker
+ </string>
+ <string name="Glove Length">
+ Handskelængde
+ </string>
+ <string name="Hair">
+ HÃ¥r
+ </string>
+ <string name="Hair Back">
+ HÃ¥r: Bagtil
+ </string>
+ <string name="Hair Front">
+ HÃ¥r: Foran
+ </string>
+ <string name="Hair Sides">
+ HÃ¥r: Siderne
+ </string>
+ <string name="Hair Sweep">
+ Strøget hår
+ </string>
+ <string name="Hair Thickess">
+ HÃ¥r tykkelse
+ </string>
+ <string name="Hair Thickness">
+ HÃ¥r tykkelse
+ </string>
+ <string name="Hair Tilt">
+ Hældning
+ </string>
+ <string name="Hair Tilted Left">
+ mest hår venstre
+ </string>
+ <string name="Hair Tilted Right">
+ Mest hår højre
+ </string>
+ <string name="Hair Volume">
+ HÃ¥r: Volumen
+ </string>
+ <string name="Hand Size">
+ Størrelse hånd
+ </string>
+ <string name="Handlebars">
+ Cykelstyr
+ </string>
+ <string name="Head Length">
+ Længde på hovede
+ </string>
+ <string name="Head Shape">
+ Hovedform
+ </string>
+ <string name="Head Size">
+ Hovedstørrelse
+ </string>
+ <string name="Head Stretch">
+ Hovedhøjde
+ </string>
+ <string name="Heel Height">
+ Hælhøjde
+ </string>
+ <string name="Heel Shape">
+ Hælform
+ </string>
+ <string name="Height">
+ Højde
+ </string>
+ <string name="High">
+ Høj
+ </string>
+ <string name="High Heels">
+ Hæje hæle
+ </string>
+ <string name="High Jaw">
+ Høj kæbe
+ </string>
+ <string name="High Platforms">
+ Høje såle
+ </string>
+ <string name="High and Tight">
+ Høj og tæt
+ </string>
+ <string name="Higher">
+ Højere
+ </string>
+ <string name="Hip Length">
+ Hoftelængde
+ </string>
+ <string name="Hip Width">
+ Hoftebredde
+ </string>
+ <string name="In">
+ Inde
+ </string>
+ <string name="In Shdw Color">
+ Indre skygge farve
+ </string>
+ <string name="In Shdw Opacity">
+ Indre skygge gennemsigtighed
+ </string>
+ <string name="Inner Eye Corner">
+ Inderste del af øje
+ </string>
+ <string name="Inner Eye Shadow">
+ Inderste øjenskygge
+ </string>
+ <string name="Inner Shadow">
+ Indre skygge
+ </string>
+ <string name="Jacket Length">
+ Jakkelængde
+ </string>
+ <string name="Jacket Wrinkles">
+ Jakkerynker
+ </string>
+ <string name="Jaw Angle">
+ Kæbevinkel
+ </string>
+ <string name="Jaw Jut">
+ Kæbefremspring
+ </string>
+ <string name="Jaw Shape">
+ Kæbeform
+ </string>
+ <string name="Join">
+ Saml
+ </string>
+ <string name="Jowls">
+ Kindehud
+ </string>
+ <string name="Knee Angle">
+ Knævinkel
+ </string>
+ <string name="Knock Kneed">
+ Kalveknæet
+ </string>
+ <string name="Large">
+ Stor
+ </string>
+ <string name="Large Hands">
+ Store hænder
+ </string>
+ <string name="Left Part">
+ Venstre side
+ </string>
+ <string name="Leg Length">
+ Benlængde
+ </string>
+ <string name="Leg Muscles">
+ Benmuskler
+ </string>
+ <string name="Less">
+ Mindre
+ </string>
+ <string name="Less Body Fat">
+ Mindre kropsfedt
+ </string>
+ <string name="Less Curtains">
+ Mindre
+ </string>
+ <string name="Less Freckles">
+ Færre fregner
+ </string>
+ <string name="Less Full">
+ Mindre
+ </string>
+ <string name="Less Gravity">
+ Mindre
+ </string>
+ <string name="Less Love">
+ Mindre bildæk
+ </string>
+ <string name="Less Muscles">
+ Færre muskler
+ </string>
+ <string name="Less Muscular">
+ Mindre muskuløs
+ </string>
+ <string name="Less Rosy">
+ Mindre rosa
+ </string>
+ <string name="Less Round">
+ Mindre rund
+ </string>
+ <string name="Less Saddle">
+ Mindre
+ </string>
+ <string name="Less Square">
+ Mindre
+ </string>
+ <string name="Less Volume">
+ Mindre
+ </string>
+ <string name="Less soul">
+ Mindre
+ </string>
+ <string name="Lighter">
+ Lettere
+ </string>
+ <string name="Lip Cleft">
+ Læbekløft
+ </string>
+ <string name="Lip Cleft Depth">
+ Dybde læbekløft
+ </string>
+ <string name="Lip Fullness">
+ Fyldige læber
+ </string>
+ <string name="Lip Pinkness">
+ Lyserøde læber
+ </string>
+ <string name="Lip Ratio">
+ Læbeproportioner
+ </string>
+ <string name="Lip Thickness">
+ Læbetykkelse
+ </string>
+ <string name="Lip Width">
+ Læbebredde
+ </string>
+ <string name="Lipgloss">
+ Lipgloss
+ </string>
+ <string name="Lipstick">
+ Læbestift
+ </string>
+ <string name="Lipstick Color">
+ Læbestift farve
+ </string>
+ <string name="Long">
+ Lang
+ </string>
+ <string name="Long Head">
+ Langt hovede
+ </string>
+ <string name="Long Hips">
+ Lange hofter
+ </string>
+ <string name="Long Legs">
+ Bange ben
+ </string>
+ <string name="Long Neck">
+ Lang hals
+ </string>
+ <string name="Long Pigtails">
+ Lange rottehaler
+ </string>
+ <string name="Long Ponytail">
+ Lang hestehale
+ </string>
+ <string name="Long Torso">
+ Lang overkrop
+ </string>
+ <string name="Long arms">
+ Lange arme
+ </string>
+ <string name="Loose Pants">
+ Løse bukser
+ </string>
+ <string name="Loose Shirt">
+ Løs trøje
+ </string>
+ <string name="Loose Sleeves">
+ Løse ærmer
+ </string>
+ <string name="Love Handles">
+ Bildæk
+ </string>
+ <string name="Low">
+ Lav
+ </string>
+ <string name="Low Heels">
+ Flade hæle
+ </string>
+ <string name="Low Jaw">
+ Lav kæbe
+ </string>
+ <string name="Low Platforms">
+ Flade såler
+ </string>
+ <string name="Low and Loose">
+ Lav og løs
+ </string>
+ <string name="Lower">
+ Nedre
+ </string>
+ <string name="Lower Bridge">
+ Nedre næseryg
+ </string>
+ <string name="Lower Cheeks">
+ Nedre kinder
+ </string>
+ <string name="Male">
+ Mand
+ </string>
+ <string name="Middle Part">
+ Midterste del
+ </string>
+ <string name="More">
+ Mere
+ </string>
+ <string name="More Blush">
+ Mere rødmen
+ </string>
+ <string name="More Body Fat">
+ Mere kropsfedt
+ </string>
+ <string name="More Curtains">
+ Mere
+ </string>
+ <string name="More Eyeshadow">
+ Mere øjenskygge
+ </string>
+ <string name="More Freckles">
+ Flere fregner
+ </string>
+ <string name="More Full">
+ Mere
+ </string>
+ <string name="More Gravity">
+ Mere
+ </string>
+ <string name="More Lipstick">
+ Mere læbestift
+ </string>
+ <string name="More Love">
+ Mere bildæk
+ </string>
+ <string name="More Lower Lip">
+ Mere underlæbe
+ </string>
+ <string name="More Muscles">
+ Flere muskler
+ </string>
+ <string name="More Muscular">
+ Mere muskuløs
+ </string>
+ <string name="More Rosy">
+ Mere rosa
+ </string>
+ <string name="More Round">
+ Mere rund
+ </string>
+ <string name="More Saddle">
+ Mere
+ </string>
+ <string name="More Sloped">
+ Mere skrå
+ </string>
+ <string name="More Square">
+ Mere firkantet
+ </string>
+ <string name="More Upper Lip">
+ Mere overlæbe
+ </string>
+ <string name="More Vertical">
+ Mere lodret
+ </string>
+ <string name="More Volume">
+ Mere
+ </string>
+ <string name="More soul">
+ Mere
+ </string>
+ <string name="Moustache">
+ Overskæg
+ </string>
+ <string name="Mouth Corner">
+ Mundvige
+ </string>
+ <string name="Mouth Position">
+ Position mund
+ </string>
+ <string name="Mowhawk">
+ Intet hår
+ </string>
+ <string name="Muscular">
+ Muskuløs
+ </string>
+ <string name="Mutton Chops">
+ Lange
+ </string>
+ <string name="Nail Polish">
+ Neglelak
+ </string>
+ <string name="Nail Polish Color">
+ Neglelak farve
+ </string>
+ <string name="Narrow">
+ Smal
+ </string>
+ <string name="Narrow Back">
+ Smal bagtil
+ </string>
+ <string name="Narrow Front">
+ Smal fortil
+ </string>
+ <string name="Narrow Lips">
+ Smalle læber
+ </string>
+ <string name="Natural">
+ Naturlig
+ </string>
+ <string name="Neck Length">
+ Halslængde
+ </string>
+ <string name="Neck Thickness">
+ Halstykkelse
+ </string>
+ <string name="No Blush">
+ Ingen rødmen
+ </string>
+ <string name="No Eyeliner">
+ Ingen eyeliner
+ </string>
+ <string name="No Eyeshadow">
+ Ingen øjenskygge
+ </string>
+ <string name="No Lipgloss">
+ Ingen lipgloss
+ </string>
+ <string name="No Lipstick">
+ Ingen læbestift
+ </string>
+ <string name="No Part">
+ Ingen dele
+ </string>
+ <string name="No Polish">
+ Ingen lak
+ </string>
+ <string name="No Red">
+ Ingen rød
+ </string>
+ <string name="No Spikes">
+ Ingen spikes
+ </string>
+ <string name="No White">
+ Ingen hvid
+ </string>
+ <string name="No Wrinkles">
+ Ingen rynker
+ </string>
+ <string name="Normal Lower">
+ Normal nedre
+ </string>
+ <string name="Normal Upper">
+ Normal øvre
+ </string>
+ <string name="Nose Left">
+ Højre
+ </string>
+ <string name="Nose Right">
+ Venstre
+ </string>
+ <string name="Nose Size">
+ Næse størrelse
+ </string>
+ <string name="Nose Thickness">
+ Næse tykkelse
+ </string>
+ <string name="Nose Tip Angle">
+ Næsetip vinkel
+ </string>
+ <string name="Nose Tip Shape">
+ Næsetip form
+ </string>
+ <string name="Nose Width">
+ Næse bredde
+ </string>
+ <string name="Nostril Division">
+ Næsebor adskillelse
+ </string>
+ <string name="Nostril Width">
+ Næsebor bredde
+ </string>
+ <string name="Opaque">
+ Uigennemsigtig
+ </string>
+ <string name="Open">
+ Ã…ben
+ </string>
+ <string name="Open Back">
+ Ã…ben bagtil
+ </string>
+ <string name="Open Front">
+ Ã…ben foran
+ </string>
+ <string name="Open Left">
+ Ã…ben til venstre
+ </string>
+ <string name="Open Right">
+ Åben til højre
+ </string>
+ <string name="Orange">
+ Orange
+ </string>
+ <string name="Out">
+ Ud
+ </string>
+ <string name="Out Shdw Color">
+ Ydre skygge farve
+ </string>
+ <string name="Out Shdw Opacity">
+ Ydre skygge uigennemsigtighed
+ </string>
+ <string name="Outer Eye Corner">
+ Yderste del af øje
+ </string>
+ <string name="Outer Eye Shadow">
+ Ydre øjenskygge
+ </string>
+ <string name="Outer Shadow">
+ Ydre skygge
+ </string>
+ <string name="Overbite">
+ Overbid
+ </string>
+ <string name="Package">
+ Skridt
+ </string>
+ <string name="Painted Nails">
+ Malede negle
+ </string>
+ <string name="Pale">
+ Bleg
+ </string>
+ <string name="Pants Crotch">
+ Bukser skridt
+ </string>
+ <string name="Pants Fit">
+ Pasform bukser
+ </string>
+ <string name="Pants Length">
+ Bukser - længde
+ </string>
+ <string name="Pants Waist">
+ Bukser - vidde
+ </string>
+ <string name="Pants Wrinkles">
+ Bukser - rynker
+ </string>
+ <string name="Part">
+ Skilning
+ </string>
+ <string name="Part Bangs">
+ Skilning
+ </string>
+ <string name="Pectorals">
+ Brystmuskler
+ </string>
+ <string name="Pigment">
+ Pigmentering
+ </string>
+ <string name="Pigtails">
+ Rottehaler
+ </string>
+ <string name="Pink">
+ Pink
+ </string>
+ <string name="Pinker">
+ Mere pink
+ </string>
+ <string name="Platform Height">
+ Højde sål
+ </string>
+ <string name="Platform Width">
+ Bredde sål
+ </string>
+ <string name="Pointy">
+ Spids
+ </string>
+ <string name="Pointy Heels">
+ Spidse hæle
+ </string>
+ <string name="Ponytail">
+ Hestehale
+ </string>
+ <string name="Poofy Skirt">
+ Strutskørt
+ </string>
+ <string name="Pop Left Eye">
+ Forstør venstre øje
+ </string>
+ <string name="Pop Right Eye">
+ Forstør højre øje
+ </string>
+ <string name="Puffy">
+ Posede
+ </string>
+ <string name="Puffy Eyelids">
+ Posede øjenlåg
+ </string>
+ <string name="Rainbow Color">
+ Regnbue farver
+ </string>
+ <string name="Red Hair">
+ Rødt hår
+ </string>
+ <string name="Regular">
+ Almindelig
+ </string>
+ <string name="Right Part">
+ Højre skildning
+ </string>
+ <string name="Rosy Complexion">
+ Rosa teint
+ </string>
+ <string name="Round">
+ Rund
+ </string>
+ <string name="Ruddiness">
+ Rødmossethed
+ </string>
+ <string name="Ruddy">
+ Rødmosset
+ </string>
+ <string name="Rumpled Hair">
+ Krøllet hår
+ </string>
+ <string name="Saddle Bags">
+ Ridebukselår
+ </string>
+ <string name="Scrawny Leg">
+ Magert ben
+ </string>
+ <string name="Separate">
+ Separat
+ </string>
+ <string name="Shallow">
+ Lille
+ </string>
+ <string name="Shear Back">
+ Afklippet bagi
+ </string>
+ <string name="Shear Face">
+ Skævt ansigt
+ </string>
+ <string name="Shear Front">
+ &quot;MÃ¥ne&quot;
+ </string>
+ <string name="Shear Left Up">
+ Venstre op
+ </string>
+ <string name="Shear Right Up">
+ Højre op
+ </string>
+ <string name="Sheared Back">
+ Afklippet bagtil
+ </string>
+ <string name="Sheared Front">
+ MÃ¥ne
+ </string>
+ <string name="Shift Left">
+ Mod venstre
+ </string>
+ <string name="Shift Mouth">
+ Flyt mund
+ </string>
+ <string name="Shift Right">
+ Mod højre
+ </string>
+ <string name="Shirt Bottom">
+ Trøje - bund
+ </string>
+ <string name="Shirt Fit">
+ Trøje - pasform
+ </string>
+ <string name="Shirt Wrinkles">
+ Trøje - rynker
+ </string>
+ <string name="Shoe Height">
+ Sko højde
+ </string>
+ <string name="Short">
+ Kort
+ </string>
+ <string name="Short Arms">
+ Korte arme
+ </string>
+ <string name="Short Legs">
+ Korte ben
+ </string>
+ <string name="Short Neck">
+ Kort hals
+ </string>
+ <string name="Short Pigtails">
+ Korte rottehaler
+ </string>
+ <string name="Short Ponytail">
+ Kort hestehale
+ </string>
+ <string name="Short Sideburns">
+ Korte
+ </string>
+ <string name="Short Torso">
+ Kort overkrop
+ </string>
+ <string name="Short hips">
+ Korte hofter
+ </string>
+ <string name="Shoulders">
+ Skuldre
+ </string>
+ <string name="Side Fringe">
+ Side frynser
+ </string>
+ <string name="Sideburns">
+ Bakkenbarter
+ </string>
+ <string name="Sides Hair">
+ Sidehår
+ </string>
+ <string name="Sides Hair Down">
+ Ned
+ </string>
+ <string name="Sides Hair Up">
+ Op
+ </string>
+ <string name="Skinny Neck">
+ Tynd hals
+ </string>
+ <string name="Skirt Fit">
+ Omfang
+ </string>
+ <string name="Skirt Length">
+ Længde nederdel
+ </string>
+ <string name="Slanted Forehead">
+ Skrånende pande
+ </string>
+ <string name="Sleeve Length">
+ Ærmelængde
+ </string>
+ <string name="Sleeve Looseness">
+ Ærmer - stramhed
+ </string>
+ <string name="Slit Back">
+ Slids: Bag
+ </string>
+ <string name="Slit Front">
+ Slids: Foran
+ </string>
+ <string name="Slit Left">
+ Slids: Venstre
+ </string>
+ <string name="Slit Right">
+ Slids: Højre
+ </string>
+ <string name="Small">
+ Lille
+ </string>
+ <string name="Small Hands">
+ Små hænder
+ </string>
+ <string name="Small Head">
+ Lille hovede
+ </string>
+ <string name="Smooth">
+ Glat
+ </string>
+ <string name="Smooth Hair">
+ Glat hår
+ </string>
+ <string name="Socks Length">
+ Strømper - længde
+ </string>
+ <string name="Soulpatch">
+ Soulpatch
+ </string>
+ <string name="Sparse">
+ Sparsomt
+ </string>
+ <string name="Spiked Hair">
+ HÃ¥r med &quot;spikes&quot;
+ </string>
+ <string name="Square">
+ Firkantet
+ </string>
+ <string name="Square Toe">
+ Firkantet snude
+ </string>
+ <string name="Squash Head">
+ Bredt hovede
+ </string>
+ <string name="Stretch Head">
+ Stræk hovede
+ </string>
+ <string name="Sunken">
+ Indsunket
+ </string>
+ <string name="Sunken Chest">
+ Indsunket bryst
+ </string>
+ <string name="Sunken Eyes">
+ Dybtliggende øjne
+ </string>
+ <string name="Sweep Back">
+ Stryge tilbage
+ </string>
+ <string name="Sweep Forward">
+ Stryge fremad
+ </string>
+ <string name="Tall">
+ Høj
+ </string>
+ <string name="Taper Back">
+ Indsnævring bag
+ </string>
+ <string name="Taper Front">
+ Indsnævring foran
+ </string>
+ <string name="Thick Heels">
+ Brede hæle
+ </string>
+ <string name="Thick Neck">
+ Bred nakke
+ </string>
+ <string name="Thick Toe">
+ Bred snude
+ </string>
+ <string name="Thin">
+ Tynd
+ </string>
+ <string name="Thin Eyebrows">
+ Tynde øjenbryn
+ </string>
+ <string name="Thin Lips">
+ Tynde læber
+ </string>
+ <string name="Thin Nose">
+ Tynd næse
+ </string>
+ <string name="Tight Chin">
+ Stram hage
+ </string>
+ <string name="Tight Cuffs">
+ Smalle bukseben
+ </string>
+ <string name="Tight Pants">
+ Stramme bukser
+ </string>
+ <string name="Tight Shirt">
+ Stram trøje
+ </string>
+ <string name="Tight Skirt">
+ Stram nederdel
+ </string>
+ <string name="Tight Sleeves">
+ Stramme ærmer
+ </string>
+ <string name="Toe Shape">
+ Sko form
+ </string>
+ <string name="Toe Thickness">
+ Tykkelse af snud
+ </string>
+ <string name="Torso Length">
+ Overkrop - længde
+ </string>
+ <string name="Torso Muscles">
+ Overkrop - muskler
+ </string>
+ <string name="Torso Scrawny">
+ Overkrop - mager
+ </string>
+ <string name="Unattached">
+ Ikke vedhæftet
+ </string>
+ <string name="Uncreased">
+ Glat
+ </string>
+ <string name="Underbite">
+ Underbid
+ </string>
+ <string name="Unnatural">
+ Unaturlig
+ </string>
+ <string name="Upper Bridge">
+ Øverste næseryg
+ </string>
+ <string name="Upper Cheeks">
+ Øvre kinder
+ </string>
+ <string name="Upper Chin Cleft">
+ Øvre hagekløft
+ </string>
+ <string name="Upper Eyelid Fold">
+ Øvre øjenlåg
+ </string>
+ <string name="Upturned">
+ Opadvendt
+ </string>
+ <string name="Very Red">
+ Meget rød
+ </string>
+ <string name="Waist Height">
+ Talje højde
+ </string>
+ <string name="Well-Fed">
+ Velnæret
+ </string>
+ <string name="White Hair">
+ Hvidt hår
+ </string>
+ <string name="Wide">
+ Bred
+ </string>
+ <string name="Wide Back">
+ Bredt
+ </string>
+ <string name="Wide Front">
+ Bredt
+ </string>
+ <string name="Wide Lips">
+ Brede læber
+ </string>
+ <string name="Wild">
+ Vildt
+ </string>
+ <string name="Wrinkles">
+ Rynker
+ </string>
+ <string name="LocationCtrlAddLandmarkTooltip">
+ Tilføj til mine landemærker
+ </string>
+ <string name="LocationCtrlEditLandmarkTooltip">
+ Rediger mit landemærke
+ </string>
+ <string name="LocationCtrlInfoBtnTooltip">
+ Se yderligere information om nuværende lokation
+ </string>
+ <string name="LocationCtrlComboBtnTooltip">
+ Min lokationshistorik
+ </string>
+ <string name="LocationCtrlAdultIconTooltip">
+ Adult region
+ </string>
+ <string name="LocationCtrlModerateIconTooltip">
+ Moderate region
+ </string>
+ <string name="LocationCtrlGeneralIconTooltip">
+ Generel region
+ </string>
+ <string name="UpdaterWindowTitle">
+ [APP_NAME] Opdatér
+ </string>
+ <string name="UpdaterNowUpdating">
+ Opdaterer nu [APP_NAME]...
+ </string>
+ <string name="UpdaterNowInstalling">
+ Installerer [APP_NAME]...
+ </string>
+ <string name="UpdaterUpdatingDescriptive">
+ Din [APP_NAME] klient bliver opdateret til nyeste version. Dette kan tage noget tid, så venligst vær tålmodig.
+ </string>
+ <string name="UpdaterProgressBarTextWithEllipses">
+ Download færdig...
+ </string>
+ <string name="UpdaterProgressBarText">
+ Downloader opdatering
+ </string>
+ <string name="UpdaterFailDownloadTitle">
+ Download af opdatering fejlede
+ </string>
+ <string name="UpdaterFailUpdateDescriptive">
+ Der opstod en fejl ved opdatering af [APP_NAME]. Hent venligst den nyeste version fra www.secondlife.com.
+ </string>
+ <string name="UpdaterFailInstallTitle">
+ Installation af opdatering fejlede
+ </string>
+ <string name="UpdaterFailStartTitle">
+ Opstart af klient fejlede
+ </string>
+ <string name="ItemsComingInTooFastFrom">
+ [APP_NAME]: Genstande modtages for hurtigt fra [FROM_NAME], automatisk visning er slået fra i [TIME] sekunder
+ </string>
+ <string name="ItemsComingInTooFast">
+ [APP_NAME]: Genstande modtages for hurtigt, automatisk visning er slået fra i [TIME] sekunder
+ </string>
+ <string name="IM_logging_string">
+ -- Logning af IM aktiveret --
+ </string>
+ <string name="IM_typing_start_string">
+ [NAME] skriver...
+ </string>
+ <string name="Unnamed">
+ (Uden navn)
+ </string>
+ <string name="IM_moderated_chat_label">
+ (Modereret: Stemmer deaktiveret)
+ </string>
+ <string name="IM_unavailable_text_label">
+ Tekst chat er ikke tilgængelig i denne samtale.
+ </string>
+ <string name="IM_muted_text_label">
+ Din tekst chat er blevet deaktiveret af en gruppe moderator.
+ </string>
+ <string name="IM_default_text_label">
+ Klik her for privat besked (IM).
+ </string>
+ <string name="IM_to_label">
+ Til
+ </string>
+ <string name="IM_moderator_label">
+ (Moderator)
+ </string>
+ <string name="Saved_message">
+ (Gemt [LONG_TIMESTAMP])
+ </string>
+ <string name="answered_call">
+ Dit opkald er blevet besvaret
+ </string>
+ <string name="you_started_call">
+ Du startede dette stemme kald
+ </string>
+ <string name="you_joined_call">
+ Du er nu med i stemme opkald
+ </string>
+ <string name="name_started_call">
+ [NAME] startede et stemmekald
+ </string>
+ <string name="ringing-im">
+ Tilslutter stemme opkald...
+ </string>
+ <string name="connected-im">
+ Forbundet, klik på Forlad for at lægge på
+ </string>
+ <string name="hang_up-im">
+ Forladt stemme opkald
+ </string>
+ <string name="conference-title-incoming">
+ Konference med [AGENT_NAME]
+ </string>
+ <string name="no_session_message">
+ (IM session eksisterer ikke)
+ </string>
+ <string name="only_user_message">
+ Du er den eneste deltager i denne samtale
+ </string>
+ <string name="offline_message">
+ [NAME] er logget af.
+ </string>
+ <string name="invite_message">
+ Tryk på [BUTTON NAME] knappen for at acceptére/tilslutte til denne stemme chat.
+ </string>
+ <string name="muted_message">
+ Du har blokeret denne beboer. Sendes en besked, vil beboeren fjernes fra blokeringslisten.
+ </string>
+ <string name="generic">
+ Fejl ved anmodning, prøv venligst igen senere
+ </string>
+ <string name="generic_request_error">
+ Kunne ikke etablere forbindelse, prøv igen senere
+ </string>
+ <string name="insufficient_perms_error">
+ Du har ikke de fornødne rettigheder.
+ </string>
+ <string name="session_does_not_exist_error">
+ Denne samtale er lukket ned
+ </string>
+ <string name="no_ability_error">
+ Du har ikke den mulighed.
+ </string>
+ <string name="no_ability">
+ Du har ikke den mulighed.
+ </string>
+ <string name="not_a_mod_error">
+ Du er ikke moderator for denne samtale.
+ </string>
+ <string name="muted">
+ En gruppe moderator har deaktiveret din tekst chat.
+ </string>
+ <string name="muted_error">
+ Du er blevet &quot;blokeret&quot;.
+ </string>
+ <string name="add_session_event">
+ Ikke muligt at tilføge brugere til samtale med [RECIPIENT].
+ </string>
+ <string name="message">
+ Kunne ikke sende din besked til session med [RECIPIENT].
+ </string>
+ <string name="message_session_event">
+ Ikke muligt at sende din besked til samtalen med [RECIPIENT].
+ </string>
+ <string name="mute">
+ Fejl under moderation.
+ </string>
+ <string name="removed">
+ Du er blevet fjernet fra denne gruppe.
+ </string>
+ <string name="removed_from_group">
+ Du er blevet fjernet fra gruppen.
+ </string>
+ <string name="close_on_no_ability">
+ Du har ikke længere mulighed for at deltage i samtalen
+ </string>
+ <string name="unread_chat_single">
+ [SOURCES] har sagt noget nyt
+ </string>
+ <string name="unread_chat_multiple">
+ [SOURCES] har sagt noget nyt
+ </string>
+ <string name="session_initialization_timed_out_error">
+ Initialisering af session er &quot;timed out&quot;
+ </string>
+ <string name="Home position set.">
+ Hjemmeposition sat.
+ </string>
+ <string name="voice_morphing_url">
+ http://secondlife.com/landing/voicemorphing
+ </string>
+ <string name="paid_you_ldollars">
+ [NAME] betalte dig L$[AMOUNT] [REASON].
+ </string>
+ <string name="paid_you_ldollars_no_reason">
+ [NAME] betalte dig L$[AMOUNT].
+ </string>
+ <string name="you_paid_ldollars">
+ Du betalte [NAME] L$[AMOUNT] [REASON].
+ </string>
+ <string name="you_paid_ldollars_no_info">
+ Du betalte L$[AMOUNT].
+ </string>
+ <string name="you_paid_ldollars_no_reason">
+ Du betalte [NAME] L$[AMOUNT].
+ </string>
+ <string name="you_paid_ldollars_no_name">
+ Du betalte L$[AMOUNT] [REASON].
+ </string>
+ <string name="for item">
+ til [ITEM]
+ </string>
+ <string name="for a parcel of land">
+ for en parcel land
+ </string>
+ <string name="for a land access pass">
+ for en billet til land
+ </string>
+ <string name="for deeding land">
+ for dedikering af land
+ </string>
+ <string name="to create a group">
+ for at oprette gruppe
+ </string>
+ <string name="to join a group">
+ for at blive medlem i gruppe
+ </string>
+ <string name="to upload">
+ for at uploade
+ </string>
+ <string name="to publish a classified ad">
+ til offentliggørelse af annonce
+ </string>
+ <string name="giving">
+ Giver L$ [AMOUNT]
+ </string>
+ <string name="uploading_costs">
+ Pris for upload er L$ [AMOUNT]
+ </string>
+ <string name="this_costs">
+ Prisen er L$ [AMOUNT]
+ </string>
+ <string name="buying_selected_land">
+ Køber valgte land L$ [AMOUNT]
+ </string>
+ <string name="this_object_costs">
+ Dette objekt koster L$ [AMOUNT]
+ </string>
+ <string name="group_role_everyone">
+ Enhver
+ </string>
+ <string name="group_role_officers">
+ Administratorer
+ </string>
+ <string name="group_role_owners">
+ Ejere
+ </string>
+ <string name="group_member_status_online">
+ Online
+ </string>
+ <string name="uploading_abuse_report">
+ Uploader...
+
+Krænkelsesanmeldelse
+ </string>
+ <string name="New Shape">
+ Ny kropsbygning
+ </string>
+ <string name="New Skin">
+ Ny hud
+ </string>
+ <string name="New Hair">
+ Nyt hår
+ </string>
+ <string name="New Eyes">
+ Nye øjne
+ </string>
+ <string name="New Shirt">
+ Ny trøje
+ </string>
+ <string name="New Pants">
+ Nye bukser
+ </string>
+ <string name="New Shoes">
+ Nye sko
+ </string>
+ <string name="New Socks">
+ Nye strømper
+ </string>
+ <string name="New Jacket">
+ Ny jakke
+ </string>
+ <string name="New Gloves">
+ Nye handsker
+ </string>
+ <string name="New Undershirt">
+ Ny undertrøje
+ </string>
+ <string name="New Underpants">
+ Nye underbukser
+ </string>
+ <string name="New Skirt">
+ Ny nederdel
+ </string>
+ <string name="New Alpha">
+ Ny alpha
+ </string>
+ <string name="New Tattoo">
+ Ny tatovering
+ </string>
+ <string name="New Physics">
+ Ny fysik
+ </string>
+ <string name="Invalid Wearable">
+ Kan ikke tages på
+ </string>
+ <string name="New Gesture">
+ Ny bevægelse
+ </string>
+ <string name="New Script">
+ Nyt script
+ </string>
+ <string name="New Note">
+ Ny note
+ </string>
+ <string name="New Folder">
+ Ny folder
+ </string>
+ <string name="Contents">
+ Indhold
+ </string>
+ <string name="Gesture">
+ Bevægelse
+ </string>
+ <string name="Male Gestures">
+ Mandlige bevægelser
+ </string>
+ <string name="Female Gestures">
+ Kvindelige bevægelser
+ </string>
+ <string name="Other Gestures">
+ Andre bevægelser
+ </string>
+ <string name="Speech Gestures">
+ Tale bevægelser
+ </string>
+ <string name="Common Gestures">
+ Almindelige bevægelser
+ </string>
+ <string name="Male - Excuse me">
+ Mand - Undskyld mig
+ </string>
+ <string name="Male - Get lost">
+ Mand - Skrid!
+ </string>
+ <string name="Male - Blow kiss">
+ Mand - Pust et kys
+ </string>
+ <string name="Male - Boo">
+ Mand - Boo
+ </string>
+ <string name="Male - Bored">
+ Mand - Keder sig
+ </string>
+ <string name="Male - Hey">
+ Mand - Hey
+ </string>
+ <string name="Male - Laugh">
+ Mand - Latter
+ </string>
+ <string name="Male - Repulsed">
+ Mand - Frastødt
+ </string>
+ <string name="Male - Shrug">
+ Mand - Skuldertræk
+ </string>
+ <string name="Male - Stick tougue out">
+ Mand - Stik tunge ud
+ </string>
+ <string name="Male - Wow">
+ Mand - Wow
+ </string>
+ <string name="Female - Chuckle">
+ Kvinde - Kluklatter
+ </string>
+ <string name="Female - Cry">
+ Kvinde - gråd
+ </string>
+ <string name="Female - Embarrassed">
+ Kvinde - Flov
+ </string>
+ <string name="Female - Excuse me">
+ Kvinde - Undskyld mig
+ </string>
+ <string name="Female - Get lost">
+ Kvinde - Skrid!
+ </string>
+ <string name="Female - Blow kiss">
+ Kvinde - Pust et kys
+ </string>
+ <string name="Female - Boo">
+ Kvinde - Boo
+ </string>
+ <string name="Female - Bored">
+ Kvinde - Keder sig
+ </string>
+ <string name="Female - Hey">
+ Kvinde - Hey
+ </string>
+ <string name="Female - Hey baby">
+ Kvinde - Hey baby
+ </string>
+ <string name="Female - Laugh">
+ Kvinde - Latter
+ </string>
+ <string name="Female - Looking good">
+ Kvinde - &quot;Ser godt ud&quot;
+ </string>
+ <string name="Female - Over here">
+ Kvinde - Herovre
+ </string>
+ <string name="Female - Please">
+ Kvinde - Be´ om
+ </string>
+ <string name="Female - Repulsed">
+ Kvinde - Frastødt
+ </string>
+ <string name="Female - Shrug">
+ Kvinde - Skuldertræk
+ </string>
+ <string name="Female - Stick tougue out">
+ Kvinde - Stik tungen ud
+ </string>
+ <string name="Female - Wow">
+ Kvinde - Wow
+ </string>
+ <string name="AvatarBirthDateFormat">
+ [mthnum,datetime,slt]/[day,datetime,slt]/[year,datetime,slt]
+ </string>
+ <string name="DefaultMimeType">
+ ingen/ingen
+ </string>
+ <string name="texture_load_dimensions_error">
+ Kan ikke hente billeder større end [WIDTH]*[HEIGHT]
+ </string>
+ <string name="words_separator" value=","/>
+ <string name="server_is_down">
+ Desværre er noget gået galt.
+
+ Check venligst status.secondlifegrid.net for at se om der skulle være driftsproblemer.
+ Hvis du bliver ved med at have problemer, check venligst din firewall- og netværksopsætning.
+ </string>
+ <string name="dateTimeWeekdaysNames">
+ Søndag:Mandag:Tirsdag:Onsdag:Torsdag:Fredag:Lørdag
+ </string>
+ <string name="dateTimeWeekdaysShortNames">
+ Søn:Man:Tir:Ons:Tor:Fre:Lør
+ </string>
+ <string name="dateTimeMonthNames">
+ Januar:Februar:Marts:April:Maj:Juni:Juli:August:September:Oktober:November:December
+ </string>
+ <string name="dateTimeMonthShortNames">
+ Jan:Feb:Mar:Apr:Maj:Jun:Jul:Aug:Sep:Okt: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">
+ Medlemsskab
+ </string>
+ <string name="Roles">
+ Roller
+ </string>
+ <string name="Group Identity">
+ Gruppe identitet
+ </string>
+ <string name="Parcel Management">
+ Parcel håndtering
+ </string>
+ <string name="Parcel Identity">
+ Parcel identitet
+ </string>
+ <string name="Parcel Settings">
+ Parcel opsætning
+ </string>
+ <string name="Parcel Powers">
+ Parcel beføjelser
+ </string>
+ <string name="Parcel Access">
+ Parcel adgang
+ </string>
+ <string name="Parcel Content">
+ Parcel indhold
+ </string>
+ <string name="Object Management">
+ Objekt håndtering
+ </string>
+ <string name="Accounting">
+ Regnskab
+ </string>
+ <string name="Notices">
+ Beskeder
+ </string>
+ <string name="Chat" value=" Chat : ">
+ Chat
+ </string>
+ <string name="DeleteItems">
+ Slet valgte genstande?
+ </string>
+ <string name="DeleteItem">
+ Slet valgte genstand?
+ </string>
+ <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/steam/xui/de/strings.xml b/indra/newview/skins/steam/xui/de/strings.xml
new file mode 100644
index 0000000000..b15cecb146
--- /dev/null
+++ b/indra/newview/skins/steam/xui/de/strings.xml
@@ -0,0 +1,5018 @@
+<?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">
+ Hardware wird erfasst...
+ </string>
+ <string name="StartupLoading">
+ [APP_NAME] wird geladen...
+ </string>
+ <string name="StartupClearingCache">
+ Cache wird gelöscht...
+ </string>
+ <string name="StartupInitializingTextureCache">
+ Textur-Cache wird initialisiert...
+ </string>
+ <string name="StartupInitializingVFS">
+ VFS wird initialisiert...
+ </string>
+ <string name="StartupRequireDriverUpdate">
+ Grafikinitialisierung fehlgeschlagen. Bitte aktualisieren Sie Ihren Grafiktreiber.
+ </string>
+ <string name="ProgressRestoring">
+ Wird wiederhergestellt...
+ </string>
+ <string name="ProgressChangingResolution">
+ Auflösung wird geändert...
+ </string>
+ <string name="Fullbright">
+ Fullbright (Legacy)
+ </string>
+ <string name="LoginInProgress">
+ Anmeldevorgang gestartet. [APP_NAME] reagiert möglicherweise nicht. Bitte warten.
+ </string>
+ <string name="LoginInProgressNoFrozen">
+ Anmeldung erfolgt...
+ </string>
+ <string name="LoginAuthenticating">
+ Authentifizierung
+ </string>
+ <string name="LoginMaintenance">
+ Account wird aktualisiert...
+ </string>
+ <string name="LoginAttempt">
+ Ein früherer Anmeldeversuch ist fehlgeschlagen. Anmeldung, Versuch [NUMBER]
+ </string>
+ <string name="LoginPrecaching">
+ Welt wird geladen...
+ </string>
+ <string name="LoginInitializingBrowser">
+ Integrierter Webbrowser wird initialisiert...
+ </string>
+ <string name="LoginInitializingMultimedia">
+ Multimedia wird initialisiert...
+ </string>
+ <string name="LoginInitializingFonts">
+ Schriftarten werden geladen...
+ </string>
+ <string name="LoginVerifyingCache">
+ Cache-Dateien werden überprüft (dauert 60-90 Sekunden)...
+ </string>
+ <string name="LoginProcessingResponse">
+ Antwort wird verarbeitet...
+ </string>
+ <string name="LoginInitializingWorld">
+ Welt wird initialisiert...
+ </string>
+ <string name="LoginDecodingImages">
+ Bilder werden entpackt...
+ </string>
+ <string name="LoginInitializingQuicktime">
+ QuickTime wird initialisiert...
+ </string>
+ <string name="LoginQuicktimeNotFound">
+ QuickTime nicht gefunden - Initialisierung nicht möglich.
+ </string>
+ <string name="LoginQuicktimeOK">
+ QuickTime wurde initialisiert.
+ </string>
+ <string name="LoginRequestSeedCapGrant">
+ Regionsfähigkeiten anfordern...
+ </string>
+ <string name="LoginRetrySeedCapGrant">
+ Regionsfähigkeiten anfordern. Versuch [NUMBER]...
+ </string>
+ <string name="LoginWaitingForRegionHandshake">
+ Region-Handshake...
+ </string>
+ <string name="LoginConnectingToRegion">
+ Region-Verbindung...
+ </string>
+ <string name="LoginDownloadingClothing">
+ Kleidung wird geladen...
+ </string>
+ <string name="InvalidCertificate">
+ Der Server hat ein ungültiges oder korruptes Zertifikate zurückgegeben. Bitte kontaktieren Sie den Grid-Administrator.
+ </string>
+ <string name="CertInvalidHostname">
+ Ein ungültiger Hostname wurde verwendet, um auf den Server zuzugreifen. Bitte überprüfen Sie Ihre SLURL oder den Grid-Hostnamen.
+ </string>
+ <string name="CertExpired">
+ Das vom Grid ausgegebene Zertifikate ist abgelaufen. Bitte überprüfen Sie Ihre Systemuhr oder kontaktieren Sie Ihren Grid-Administrator.
+ </string>
+ <string name="CertKeyUsage">
+ Das vom Server ausgegebene Zertifikat konnte nicht für SSL verwendet werden. Bitte kontaktieren Sie Ihren Grid-Administrator.
+ </string>
+ <string name="CertBasicConstraints">
+ In der Zertifikatskette des Servers befanden sich zu viele Zertifikate. Bitte kontaktieren Sie Ihren Grid-Administrator.
+ </string>
+ <string name="CertInvalidSignature">
+ Die Zertifikatsunterschrift des Gridservers konnte nicht bestätigt werden. Bitte kontaktieren Sie Ihren Grid-Administrator.
+ </string>
+ <string name="LoginFailedNoNetwork">
+ Netzwerkfehler: Verbindung konnte nicht hergestellt werden. Bitte überprüfen Sie Ihre Netzwerkverbindung.
+ </string>
+ <string name="LoginFailed">
+ Anmeldung fehlgeschlagen
+ </string>
+ <string name="Quit">
+ Beenden
+ </string>
+ <string name="create_account_url">
+ http://join.secondlife.com/index.php?sourceid=1206_steam&amp;lang=de-DE
+ </string>
+ <string name="LoginFailedViewerNotPermitted">
+ Mit dem von Ihnen verwendeten Viewer ist der Zugriff auf Second Life nicht mehr möglich. Laden Sie von den folgenden Seite einen neuen Viewer herunter:
+http://secondlife.com/download
+
+Weitere Informationen finden Sie auf der folgenden FAQ-Seite:
+http://secondlife.com/viewer-access-faq
+ </string>
+ <string name="LoginIntermediateOptionalUpdateAvailable">
+ Optionales Viewer-Update verfügbar: [VERSION]
+ </string>
+ <string name="LoginFailedRequiredUpdate">
+ Erforderliches Viewer-Update: [VERSION]
+ </string>
+ <string name="LoginFailedAlreadyLoggedIn">
+ Dieser Agent ist bereits angemeldet.
+ </string>
+ <string name="LoginFailedAuthenticationFailed">
+ Wir bitten um Entschuldigung! Wir konnten Sie nicht anmelden.
+Stellen Sie sicher, dass Sie die richtigen Informationen eingegeben haben:
+ * Benutzername (wie robertschmidt12 oder warme.sonne)
+ * Kennwort
+Stellen Sie außerdem sicher, dass die Umschaltsperre deaktiviert ist.
+ </string>
+ <string name="LoginFailedPasswordChanged">
+ Ihr Kennwort wurde aus Sicherheitsgründen geändert.
+Gehen Sie zur Seite „Mein Account“ unter http://secondlife.com/password
+und beantworten Sie die Sicherheitsfrage, um Ihr Kennwort zurückzusetzen.
+Wir entschuldigen uns für eventuell enstandene Unannehmlichkeiten.
+ </string>
+ <string name="LoginFailedPasswordReset">
+ Aufgrund von Systemänderungen müssen Sie Ihr Kennwort zurücksetzen.
+Gehen Sie zur Seite „Mein Account“ unter http://secondlife.com/password
+und beantworten Sie die Sicherheitsfrage, um Ihr Kennwort zurückzusetzen.
+Wir entschuldigen uns für eventuell enstandene Unannehmlichkeiten.
+ </string>
+ <string name="LoginFailedEmployeesOnly">
+ Second Life ist vorübergehend wegen Wartung geschlossen.
+Nur Mitarbeiter können sich anmelden.
+Aktuelle Informationen finden Sie unter www.secondlife.com/status.
+ </string>
+ <string name="LoginFailedPremiumOnly">
+ Die Anmeldung bei Second Life ist vorübergehend eingeschränkt, um sicherzustellen, dass Einwohner, die sich bereits inworld aufhalten, das bestmögliche Erlebnis haben.
+
+Benutzer mit kostenlosen Konten können sich während dieses Zeitraums nicht bei Second Life anmelden, damit die Kapazität Benutzern zur Verfügung steht, die ein gebührenpflichtiges Premium-Konto besitzen.
+ </string>
+ <string name="LoginFailedComputerProhibited">
+ Der Zugriff auf Second Life ist von diesem Computer aus nicht möglich.
+Wenn Sie der Ansicht sind, dass Sie diese Meldung fälschlicherweise erhalten haben, wenden Sie sich an
+support@secondlife.com.
+ </string>
+ <string name="LoginFailedAcountSuspended">
+ Ihr Konto ist erst ab
+[TIME] Pacific Time wieder verfügbar.
+ </string>
+ <string name="LoginFailedAccountDisabled">
+ Ihre Anfrage kann derzeit nicht bearbeitet werden.
+Wenden Sie sich unter http://secondlife.com/support an den Second Life-Support.
+Wenn Sie Ihr Kennwort nicht ändern können, rufen Sie die US-Nummer (866) 476-9763 an.
+ </string>
+ <string name="LoginFailedTransformError">
+ Nicht übereinstimmende Daten bei der Anmeldung festgestellt.
+Wenden Sie sich an support@secondlife.com.
+ </string>
+ <string name="LoginFailedAccountMaintenance">
+ An Ihrem Konto werden gerade kleinere Wartungsarbeiten durchgeführt.
+Ihr Konto ist erst ab
+[TIME] Pacific Time wieder verfügbar.
+Wenn Sie der Ansicht sind, dass Sie diese Meldung fälschlicherweise erhalten haben, wenden Sie sich an support@secondlife.com.
+ </string>
+ <string name="LoginFailedPendingLogoutFault">
+ Abmeldeanforderung führte zu einem Simulatorfehler.
+ </string>
+ <string name="LoginFailedPendingLogout">
+ Das System meldet Sie gerade ab.
+Ihr Konto ist erst ab
+[TIME] Pacific Time wieder verfügbar.
+ </string>
+ <string name="LoginFailedUnableToCreateSession">
+ Es kann keine gültige Sitzung erstellt werden.
+ </string>
+ <string name="LoginFailedUnableToConnectToSimulator">
+ Es kann keine Simulatorverbindung hergestellt werden.
+ </string>
+ <string name="LoginFailedRestrictedHours">
+ Mit Ihrem Konto ist der Zugriff auf Second Life
+nur zwischen [START] und [END] Pacific Time möglich.
+Schauen Sie während dieses Zeitraums vorbei.
+Wenn Sie der Ansicht sind, dass Sie diese Meldung fälschlicherweise erhalten haben, wenden Sie sich an support@secondlife.com.
+ </string>
+ <string name="LoginFailedIncorrectParameters">
+ Falsche Parameter.
+Wenn Sie der Ansicht sind, dass Sie diese Meldung fälschlicherweise erhalten haben, wenden Sie sich an support@secondlife.com.
+ </string>
+ <string name="LoginFailedFirstNameNotAlphanumeric">
+ Vorname muss alphanumerisch sein.
+Wenn Sie der Ansicht sind, dass Sie diese Meldung fälschlicherweise erhalten haben, wenden Sie sich an support@secondlife.com.
+ </string>
+ <string name="LoginFailedLastNameNotAlphanumeric">
+ Nachname muss alphanumerisch sein.
+Wenn Sie der Ansicht sind, dass Sie diese Meldung fälschlicherweise erhalten haben, wenden Sie sich an support@secondlife.com.
+ </string>
+ <string name="LogoutFailedRegionGoingOffline">
+ Die Region wird gerade offline geschaltet.
+Warten Sie kurz und versuchen Sie dann noch einmal, sich anzumelden.
+ </string>
+ <string name="LogoutFailedAgentNotInRegion">
+ Agent nicht in Region.
+Warten Sie kurz und versuchen Sie dann noch einmal, sich anzumelden.
+ </string>
+ <string name="LogoutFailedPendingLogin">
+ Die Region war gerade dabei, eine andere Sitzung anzumelden.
+Warten Sie kurz und versuchen Sie dann noch einmal, sich anzumelden.
+ </string>
+ <string name="LogoutFailedLoggingOut">
+ Die Region war gerade dabei, die vorherige Sitzung abzumelden.
+Warten Sie kurz und versuchen Sie dann noch einmal, sich anzumelden.
+ </string>
+ <string name="LogoutFailedStillLoggingOut">
+ Die Region ist noch immer dabei, die vorherige Sitzung abzumelden.
+Warten Sie kurz und versuchen Sie dann noch einmal, sich anzumelden.
+ </string>
+ <string name="LogoutSucceeded">
+ Die Region hat soeben die letzte Sitzung abgemeldet.
+Warten Sie kurz und versuchen Sie dann noch einmal, sich anzumelden.
+ </string>
+ <string name="LogoutFailedLogoutBegun">
+ Die Region hat den Abmeldevorgang gestartet.
+Warten Sie kurz und versuchen Sie dann noch einmal, sich anzumelden.
+ </string>
+ <string name="LoginFailedLoggingOutSession">
+ Das System hat begonnen, Ihre letzte Sitzung abzumelden.
+Warten Sie kurz und versuchen Sie dann noch einmal, sich anzumelden.
+ </string>
+ <string name="AgentLostConnection">
+ In dieser Region kann es zu Problemen kommen. Bitte überprüfen Sie Ihre Internetverbindung.
+ </string>
+ <string name="SavingSettings">
+ Ihr Einstellungen werden gespeichert...
+ </string>
+ <string name="LoggingOut">
+ Abmeldung erfolgt...
+ </string>
+ <string name="ShuttingDown">
+ Programm wird beendet...
+ </string>
+ <string name="YouHaveBeenDisconnected">
+ Die Verbindung zu der Region ist abgebrochen.
+ </string>
+ <string name="SentToInvalidRegion">
+ Sie wurden in eine ungültige Region geschickt.
+ </string>
+ <string name="TestingDisconnect">
+ Verbindungsabbruch wird getestet
+ </string>
+ <string name="TooltipPerson">
+ Person
+ </string>
+ <string name="TooltipNoName">
+ (namenlos)
+ </string>
+ <string name="TooltipOwner">
+ Eigentümer:
+ </string>
+ <string name="TooltipPublic">
+ Öffentlich
+ </string>
+ <string name="TooltipIsGroup">
+ (Gruppe)
+ </string>
+ <string name="TooltipForSaleL$">
+ Zum Verkauf: [AMOUNT] L$
+ </string>
+ <string name="TooltipFlagGroupBuild">
+ Gruppenbau
+ </string>
+ <string name="TooltipFlagNoBuild">
+ Bauen aus
+ </string>
+ <string name="TooltipFlagNoEdit">
+ Gruppenbau
+ </string>
+ <string name="TooltipFlagNotSafe">
+ Unsicher
+ </string>
+ <string name="TooltipFlagNoFly">
+ Fliegen aus
+ </string>
+ <string name="TooltipFlagGroupScripts">
+ Gruppenskripte
+ </string>
+ <string name="TooltipFlagNoScripts">
+ Skripte aus
+ </string>
+ <string name="TooltipLand">
+ Land:
+ </string>
+ <string name="TooltipMustSingleDrop">
+ Sie können nur ein einzelnes Objekt hierher ziehen
+ </string>
+ <string name="TooltipPrice" value="[AMOUNT] L$"/>
+ <string name="TooltipOutboxDragToWorld">
+ Sie können Artikel nicht in Ihrer Händler-Outbox rezzen
+ </string>
+ <string name="TooltipOutboxNoTransfer">
+ Einer oder mehrere dieser Artikel können nicht verkauft oder übertragen werden.
+ </string>
+ <string name="TooltipOutboxNotInInventory">
+ Nur Artikel direkt aus Ihrem Inventar können in Ihre Händler-Outbox gelegt werden
+ </string>
+ <string name="TooltipOutboxWorn">
+ Artikel, die Sie tragen, können nicht in Ihre Händler-Outbox gelegt werden.
+ </string>
+ <string name="TooltipOutboxCallingCard">
+ Sie können keine Visitenkarten in Ihre Händler-Outbox legen
+ </string>
+ <string name="TooltipOutboxFolderLevels">
+ Tiefe der verschachtelten Ordner überschreitet 3
+ </string>
+ <string name="TooltipOutboxTooManyFolders">
+ Anzahl von Unterordnern im obersten Ordner überschreitet 20
+ </string>
+ <string name="TooltipOutboxTooManyObjects">
+ Anzahl von Artikeln im obersten Ordner überschreitet 200
+ </string>
+ <string name="TooltipDragOntoOwnChild">
+ Sie können einen Ordner nicht in einen seiner untergeordneten Ordner verschieben
+ </string>
+ <string name="TooltipDragOntoSelf">
+ Sie können einen Ordner nicht in sich selbst verschieben
+ </string>
+ <string name="TooltipHttpUrl">
+ Anklicken, um Webseite anzuzeigen
+ </string>
+ <string name="TooltipSLURL">
+ Anklicken, um Informationen zu diesem Standort anzuzeigen
+ </string>
+ <string name="TooltipAgentUrl">
+ Anklicken, um das Profil dieses Einwohners anzuzeigen
+ </string>
+ <string name="TooltipAgentInspect">
+ Mehr über diesen Einwohner
+ </string>
+ <string name="TooltipAgentMute">
+ Klicken, um diesen Einwohner stummzuschalten
+ </string>
+ <string name="TooltipAgentUnmute">
+ Klicken, um diesen Einwohner freizuschalten
+ </string>
+ <string name="TooltipAgentIM">
+ Klicken, um diesem Einwohner eine IM zu schicken.
+ </string>
+ <string name="TooltipAgentPay">
+ Klicken, um diesen Einwohner zu bezahlen
+ </string>
+ <string name="TooltipAgentOfferTeleport">
+ Klicken, um diesem Einwohner einen Teleport anzubieten.
+ </string>
+ <string name="TooltipAgentRequestFriend">
+ Klicken, um diesem Einwohner ein Freundschaftsangebot zu schicken.
+ </string>
+ <string name="TooltipGroupUrl">
+ Anklicken, um Beschreibung der Gruppe anzuzeigen
+ </string>
+ <string name="TooltipEventUrl">
+ Anklicken, um Beschreibung der Veranstaltung anzuzeigen
+ </string>
+ <string name="TooltipClassifiedUrl">
+ Anklicken, um diese Anzeige anzuzeigen
+ </string>
+ <string name="TooltipParcelUrl">
+ Anklicken, um Beschreibung der Parzelle anzuzeigen
+ </string>
+ <string name="TooltipTeleportUrl">
+ Anklicken, um zu diesem Standort zu teleportieren
+ </string>
+ <string name="TooltipObjectIMUrl">
+ Anklicken, um Beschreibung des Objekts anzuzeigen
+ </string>
+ <string name="TooltipMapUrl">
+ Klicken, um diese Position auf der Karte anzuzeigen
+ </string>
+ <string name="TooltipSLAPP">
+ Anklicken, um Befehl secondlife:// auszuführen
+ </string>
+ <string name="CurrentURL" value=" CurrentURL: [CurrentURL]"/>
+ <string name="SLurlLabelTeleport">
+ Teleportieren nach
+ </string>
+ <string name="SLurlLabelShowOnMap">
+ Karte anzeigen für
+ </string>
+ <string name="SLappAgentMute">
+ Stummschalten
+ </string>
+ <string name="SLappAgentUnmute">
+ Stummschaltung aufheben
+ </string>
+ <string name="SLappAgentIM">
+ IM
+ </string>
+ <string name="SLappAgentPay">
+ Bezahlen
+ </string>
+ <string name="SLappAgentOfferTeleport">
+ Teleportangebot an
+ </string>
+ <string name="SLappAgentRequestFriend">
+ Freundschaftsangebot
+ </string>
+ <string name="BUTTON_CLOSE_DARWIN">
+ Schließen (⌘W)
+ </string>
+ <string name="BUTTON_CLOSE_WIN">
+ Schließen (Strg+W)
+ </string>
+ <string name="BUTTON_CLOSE_CHROME">
+ Schließen
+ </string>
+ <string name="BUTTON_RESTORE">
+ Wiederherstellen
+ </string>
+ <string name="BUTTON_MINIMIZE">
+ Minimieren
+ </string>
+ <string name="BUTTON_TEAR_OFF">
+ Abnehmen
+ </string>
+ <string name="BUTTON_DOCK">
+ Andocken
+ </string>
+ <string name="BUTTON_HELP">
+ Hilfe anzeigen
+ </string>
+ <string name="Searching">
+ Suchen...
+ </string>
+ <string name="NoneFound">
+ Nicht gefunden.
+ </string>
+ <string name="RetrievingData">
+ Laden...
+ </string>
+ <string name="ReleaseNotes">
+ Versionshinweise
+ </string>
+ <string name="RELEASE_NOTES_BASE_URL">
+ http://wiki.secondlife.com/wiki/Release_Notes/
+ </string>
+ <string name="LoadingData">
+ Wird geladen...
+ </string>
+ <string name="AvatarNameNobody">
+ (niemand)
+ </string>
+ <string name="AvatarNameWaiting">
+ (wartet)
+ </string>
+ <string name="AvatarNameMultiple">
+ (mehrere)
+ </string>
+ <string name="GroupNameNone">
+ (keiner)
+ </string>
+ <string name="AvalineCaller">
+ Avaline-Anfrufer [ORDER]
+ </string>
+ <string name="AssetErrorNone">
+ Kein Fehler
+ </string>
+ <string name="AssetErrorRequestFailed">
+ Asset-Anforderung: fehlgeschlagen
+ </string>
+ <string name="AssetErrorNonexistentFile">
+ Asset-Anforderung: Datei existiert nicht
+ </string>
+ <string name="AssetErrorNotInDatabase">
+ Asset-Anforderung: Asset in Datenbank nicht gefunden
+ </string>
+ <string name="AssetErrorEOF">
+ Ende der Datei
+ </string>
+ <string name="AssetErrorCannotOpenFile">
+ Datei kann nicht geöffnet werden
+ </string>
+ <string name="AssetErrorFileNotFound">
+ Datei nicht gefunden
+ </string>
+ <string name="AssetErrorTCPTimeout">
+ Zeitüberschreitung bei Dateiübertragung
+ </string>
+ <string name="AssetErrorCircuitGone">
+ Verbindung verloren
+ </string>
+ <string name="AssetErrorPriceMismatch">
+ Viewer und Server sind sich nicht über Preis einig
+ </string>
+ <string name="AssetErrorUnknownStatus">
+ Status unbekannt
+ </string>
+ <string name="texture">
+ Textur
+ </string>
+ <string name="sound">
+ Sound
+ </string>
+ <string name="calling card">
+ Visitenkarte
+ </string>
+ <string name="landmark">
+ Landmarke
+ </string>
+ <string name="legacy script">
+ Skript (veraltet)
+ </string>
+ <string name="clothing">
+ Kleidung
+ </string>
+ <string name="object">
+ Objekt
+ </string>
+ <string name="note card">
+ Notizkarte
+ </string>
+ <string name="folder">
+ Ordner
+ </string>
+ <string name="root">
+ Hauptverzeichnis
+ </string>
+ <string name="lsl2 script">
+ LSL2 Skript
+ </string>
+ <string name="lsl bytecode">
+ LSL Bytecode
+ </string>
+ <string name="tga texture">
+ tga-Textur
+ </string>
+ <string name="body part">
+ Körperteil
+ </string>
+ <string name="snapshot">
+ Foto
+ </string>
+ <string name="lost and found">
+ Fundbüro
+ </string>
+ <string name="targa image">
+ targa-Bild
+ </string>
+ <string name="trash">
+ Papierkorb
+ </string>
+ <string name="jpeg image">
+ jpeg-Bild
+ </string>
+ <string name="animation">
+ Animation
+ </string>
+ <string name="gesture">
+ Geste
+ </string>
+ <string name="simstate">
+ simstate
+ </string>
+ <string name="favorite">
+ Favoriten
+ </string>
+ <string name="symbolic link">
+ Link
+ </string>
+ <string name="symbolic folder link">
+ Link zu Ordner
+ </string>
+ <string name="mesh">
+ mesh
+ </string>
+ <string name="AvatarEditingAppearance">
+ (Aussehen wird bearbeitet)
+ </string>
+ <string name="AvatarAway">
+ Abwesend
+ </string>
+ <string name="AvatarBusy">
+ Beschäftigt
+ </string>
+ <string name="AvatarMuted">
+ Ignoriert
+ </string>
+ <string name="anim_express_afraid">
+ Ängstlich
+ </string>
+ <string name="anim_express_anger">
+ Verärgert
+ </string>
+ <string name="anim_away">
+ Abwesend
+ </string>
+ <string name="anim_backflip">
+ Rückwärtssalto
+ </string>
+ <string name="anim_express_laugh">
+ Lachkrampf
+ </string>
+ <string name="anim_express_toothsmile">
+ Grinsen
+ </string>
+ <string name="anim_blowkiss">
+ Kusshand
+ </string>
+ <string name="anim_express_bored">
+ Gelangweilt
+ </string>
+ <string name="anim_bow">
+ Verbeugen
+ </string>
+ <string name="anim_clap">
+ Klatschen
+ </string>
+ <string name="anim_courtbow">
+ Diener
+ </string>
+ <string name="anim_express_cry">
+ Weinen
+ </string>
+ <string name="anim_dance1">
+ Tanz 1
+ </string>
+ <string name="anim_dance2">
+ Tanz 2
+ </string>
+ <string name="anim_dance3">
+ Tanz 3
+ </string>
+ <string name="anim_dance4">
+ Tanz 4
+ </string>
+ <string name="anim_dance5">
+ Tanz 5
+ </string>
+ <string name="anim_dance6">
+ Tanz 6
+ </string>
+ <string name="anim_dance7">
+ Tanz 7
+ </string>
+ <string name="anim_dance8">
+ Tanz 8
+ </string>
+ <string name="anim_express_disdain">
+ Verachten
+ </string>
+ <string name="anim_drink">
+ Trinken
+ </string>
+ <string name="anim_express_embarrased">
+ Verlegen
+ </string>
+ <string name="anim_angry_fingerwag">
+ Drohen
+ </string>
+ <string name="anim_fist_pump">
+ Faust pumpen
+ </string>
+ <string name="anim_yoga_float">
+ Yogaflieger
+ </string>
+ <string name="anim_express_frown">
+ Stirnrunzeln
+ </string>
+ <string name="anim_impatient">
+ Ungeduldig
+ </string>
+ <string name="anim_jumpforjoy">
+ Freudensprung
+ </string>
+ <string name="anim_kissmybutt">
+ LMA
+ </string>
+ <string name="anim_express_kiss">
+ Küssen
+ </string>
+ <string name="anim_laugh_short">
+ Lachen
+ </string>
+ <string name="anim_musclebeach">
+ Posen
+ </string>
+ <string name="anim_no_unhappy">
+ Nein (Bedauernd)
+ </string>
+ <string name="anim_no_head">
+ Nein
+ </string>
+ <string name="anim_nyanya">
+ Ällabätsch
+ </string>
+ <string name="anim_punch_onetwo">
+ Eins-Zwei-Punch
+ </string>
+ <string name="anim_express_open_mouth">
+ Mund offen
+ </string>
+ <string name="anim_peace">
+ Friede
+ </string>
+ <string name="anim_point_you">
+ Auf anderen zeigen
+ </string>
+ <string name="anim_point_me">
+ Auf mich zeigen
+ </string>
+ <string name="anim_punch_l">
+ Linker Haken
+ </string>
+ <string name="anim_punch_r">
+ Rechter Haken
+ </string>
+ <string name="anim_rps_countdown">
+ SSP zählen
+ </string>
+ <string name="anim_rps_paper">
+ SSP Papier
+ </string>
+ <string name="anim_rps_rock">
+ SSP Stein
+ </string>
+ <string name="anim_rps_scissors">
+ SSP Schere
+ </string>
+ <string name="anim_express_repulsed">
+ Angewidert
+ </string>
+ <string name="anim_kick_roundhouse_r">
+ Rundkick
+ </string>
+ <string name="anim_express_sad">
+ Traurig
+ </string>
+ <string name="anim_salute">
+ Salutieren
+ </string>
+ <string name="anim_shout">
+ Rufen
+ </string>
+ <string name="anim_express_shrug">
+ Schulterzucken
+ </string>
+ <string name="anim_express_smile">
+ Lächeln
+ </string>
+ <string name="anim_smoke_idle">
+ Zigarette halten
+ </string>
+ <string name="anim_smoke_inhale">
+ Rauchen
+ </string>
+ <string name="anim_smoke_throw_down">
+ Zigarette wegwerfen
+ </string>
+ <string name="anim_express_surprise">
+ Überraschung
+ </string>
+ <string name="anim_sword_strike_r">
+ Schwerthieb
+ </string>
+ <string name="anim_angry_tantrum">
+ Wutanfall
+ </string>
+ <string name="anim_express_tongue_out">
+ Zunge rausstrecken
+ </string>
+ <string name="anim_hello">
+ Winken
+ </string>
+ <string name="anim_whisper">
+ Flüstern
+ </string>
+ <string name="anim_whistle">
+ Pfeifen
+ </string>
+ <string name="anim_express_wink">
+ Zwinkern
+ </string>
+ <string name="anim_wink_hollywood">
+ Zwinkern (Hollywood)
+ </string>
+ <string name="anim_express_worry">
+ Sorgenvoll
+ </string>
+ <string name="anim_yes_happy">
+ Ja (Erfreut)
+ </string>
+ <string name="anim_yes_head">
+ Ja
+ </string>
+ <string name="multiple_textures">
+ Mehrfach
+ </string>
+ <string name="texture_loading">
+ Wird geladen...
+ </string>
+ <string name="worldmap_offline">
+ Offline
+ </string>
+ <string name="worldmap_item_tooltip_format">
+ [PRICE] L$ für [AREA] m²
+ </string>
+ <string name="worldmap_results_none_found">
+ Nicht gefunden.
+ </string>
+ <string name="Ok">
+ OK
+ </string>
+ <string name="Premature end of file">
+ Unvollständige Datei
+ </string>
+ <string name="ST_NO_JOINT">
+ HAUPTVERZEICHNIS oder VERBINDUNG nicht gefunden.
+ </string>
+ <string name="whisper">
+ flüstert:
+ </string>
+ <string name="shout">
+ ruft:
+ </string>
+ <string name="ringing">
+ Verbindung mit In-Welt-Voice-Chat...
+ </string>
+ <string name="connected">
+ Verbunden
+ </string>
+ <string name="unavailable">
+ Der aktuelle Standort unterstützt keine Voice-Kommunikation
+ </string>
+ <string name="hang_up">
+ Verbindung mit In-Welt-Voice-Chat getrennt
+ </string>
+ <string name="reconnect_nearby">
+ Sie werden nun wieder mit dem Chat in Ihrer Nähe verbunden
+ </string>
+ <string name="ScriptQuestionCautionChatGranted">
+ Dem Objekt „[OBJECTNAME]“, ein Objekt von „[OWNERNAME]“, in [REGIONNAME] [REGIONPOS], wurde folgende Berechtigung erteilt: [PERMISSIONS].
+ </string>
+ <string name="ScriptQuestionCautionChatDenied">
+ Dem Objekt „[OBJECTNAME]“, ein Objekt von „[OWNERNAME]“, in [REGIONNAME] [REGIONPOS], wurde folgende Berechtigung verweigert: [PERMISSIONS].
+ </string>
+ <string name="ScriptTakeMoney">
+ Linden-Dollar (L$) von Ihnen nehmen
+ </string>
+ <string name="ActOnControlInputs">
+ Steuerung festlegen
+ </string>
+ <string name="RemapControlInputs">
+ Steuerung neu zuweisen
+ </string>
+ <string name="AnimateYourAvatar">
+ Avatar animieren
+ </string>
+ <string name="AttachToYourAvatar">
+ An Avatar anhängen
+ </string>
+ <string name="ReleaseOwnership">
+ Eigentum aufgeben und öffentlich machen
+ </string>
+ <string name="LinkAndDelink">
+ Mit Objekten verknüpfen und davon trennen
+ </string>
+ <string name="AddAndRemoveJoints">
+ Verbindungen zu anderen Objekten hinzufügen und entfernen
+ </string>
+ <string name="ChangePermissions">
+ Berechtigungen ändern
+ </string>
+ <string name="TrackYourCamera">
+ Kameraverfolgung
+ </string>
+ <string name="ControlYourCamera">
+ Kamerasteuerung
+ </string>
+ <string name="NotConnected">
+ Nicht verbunden
+ </string>
+ <string name="SIM_ACCESS_PG">
+ Generell
+ </string>
+ <string name="SIM_ACCESS_MATURE">
+ Moderat
+ </string>
+ <string name="SIM_ACCESS_ADULT">
+ Adult
+ </string>
+ <string name="SIM_ACCESS_DOWN">
+ Offline
+ </string>
+ <string name="SIM_ACCESS_MIN">
+ Unbekannt
+ </string>
+ <string name="land_type_unknown">
+ (unbekannt)
+ </string>
+ <string name="Estate / Full Region">
+ Grundstück / Vollständige Region
+ </string>
+ <string name="Estate / Homestead">
+ Grundbesitz/Homestead
+ </string>
+ <string name="Mainland / Homestead">
+ Mainland/Homestead
+ </string>
+ <string name="Mainland / Full Region">
+ Mainland / Vollständige Region
+ </string>
+ <string name="all_files">
+ Alle Dateien
+ </string>
+ <string name="sound_files">
+ Sounds
+ </string>
+ <string name="animation_files">
+ Animationen
+ </string>
+ <string name="image_files">
+ Bilder
+ </string>
+ <string name="save_file_verb">
+ Speichern
+ </string>
+ <string name="load_file_verb">
+ Laden
+ </string>
+ <string name="targa_image_files">
+ Targa-Bilder
+ </string>
+ <string name="bitmap_image_files">
+ Bitmap-Bilder
+ </string>
+ <string name="avi_movie_file">
+ AVI-Filmdatei
+ </string>
+ <string name="xaf_animation_file">
+ XAF Anim-Datei
+ </string>
+ <string name="xml_file">
+ XML-Datei
+ </string>
+ <string name="raw_file">
+ RAW-Datei
+ </string>
+ <string name="compressed_image_files">
+ Komprimierte Bilder
+ </string>
+ <string name="load_files">
+ Dateien laden
+ </string>
+ <string name="choose_the_directory">
+ Verzeichnis auswählen
+ </string>
+ <string name="script_files">
+ Skripts
+ </string>
+ <string name="AvatarSetNotAway">
+ Nicht abwesend
+ </string>
+ <string name="AvatarSetAway">
+ Abwesend
+ </string>
+ <string name="AvatarSetNotBusy">
+ Nicht beschäftigt
+ </string>
+ <string name="AvatarSetBusy">
+ Beschäftigt
+ </string>
+ <string name="shape">
+ Form
+ </string>
+ <string name="skin">
+ Haut
+ </string>
+ <string name="hair">
+ Haare
+ </string>
+ <string name="eyes">
+ Augen
+ </string>
+ <string name="shirt">
+ Hemd
+ </string>
+ <string name="pants">
+ Hose
+ </string>
+ <string name="shoes">
+ Schuhe
+ </string>
+ <string name="socks">
+ Socken
+ </string>
+ <string name="jacket">
+ Jacke
+ </string>
+ <string name="gloves">
+ Handschuhe
+ </string>
+ <string name="undershirt">
+ Unterhemd
+ </string>
+ <string name="underpants">
+ Unterhose
+ </string>
+ <string name="skirt">
+ Rock
+ </string>
+ <string name="alpha">
+ Alpha
+ </string>
+ <string name="tattoo">
+ Tätowierung
+ </string>
+ <string name="physics">
+ Physik
+ </string>
+ <string name="invalid">
+ ungültig
+ </string>
+ <string name="none">
+ keine
+ </string>
+ <string name="shirt_not_worn">
+ Hemd nicht getragen
+ </string>
+ <string name="pants_not_worn">
+ Hosen nicht getragen
+ </string>
+ <string name="shoes_not_worn">
+ Schuhe nicht getragen
+ </string>
+ <string name="socks_not_worn">
+ Socken nicht getragen
+ </string>
+ <string name="jacket_not_worn">
+ Jacke nicht getragen
+ </string>
+ <string name="gloves_not_worn">
+ Handschuhe nicht getragen
+ </string>
+ <string name="undershirt_not_worn">
+ Unterhemd nicht getragen
+ </string>
+ <string name="underpants_not_worn">
+ Unterhose nicht getragen
+ </string>
+ <string name="skirt_not_worn">
+ Rock nicht getragen
+ </string>
+ <string name="alpha_not_worn">
+ Alpha nicht getragen
+ </string>
+ <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>
+ <string name="create_new_shape">
+ Neue Form/Gestalt erstellen
+ </string>
+ <string name="create_new_skin">
+ Neue Haut erstellen
+ </string>
+ <string name="create_new_hair">
+ Neue Haare erstellen
+ </string>
+ <string name="create_new_eyes">
+ Neue Augen erstellen
+ </string>
+ <string name="create_new_shirt">
+ Neues Hemd erstellen
+ </string>
+ <string name="create_new_pants">
+ Neue Hose erstellen
+ </string>
+ <string name="create_new_shoes">
+ Neue Schuhe erstellen
+ </string>
+ <string name="create_new_socks">
+ Neue Socken erstellen
+ </string>
+ <string name="create_new_jacket">
+ Neue Jacke erstellen
+ </string>
+ <string name="create_new_gloves">
+ Neue Handschuhe erstellen
+ </string>
+ <string name="create_new_undershirt">
+ Neues Unterhemd erstellen
+ </string>
+ <string name="create_new_underpants">
+ Neue Unterhose erstellen
+ </string>
+ <string name="create_new_skirt">
+ Neuer Rock erstellen
+ </string>
+ <string name="create_new_alpha">
+ Neue Alpha erstellen
+ </string>
+ <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>
+ <string name="NewWearable">
+ Neue/r/s [WEARABLE_ITEM]
+ </string>
+ <string name="next">
+ Weiter
+ </string>
+ <string name="ok">
+ OK
+ </string>
+ <string name="GroupNotifyGroupNotice">
+ Gruppenmitteilung
+ </string>
+ <string name="GroupNotifyGroupNotices">
+ Gruppenmitteilungen
+ </string>
+ <string name="GroupNotifySentBy">
+ Gesendet von
+ </string>
+ <string name="GroupNotifyAttached">
+ Im Anhang:
+ </string>
+ <string name="GroupNotifyViewPastNotices">
+ Alte Mitteilungen anzeigen oder hier Auswahl treffen, um keine Mitteilungen mehr zu erhalten.
+ </string>
+ <string name="GroupNotifyOpenAttachment">
+ Anlage öffnen
+ </string>
+ <string name="GroupNotifySaveAttachment">
+ Siehe Anhang
+ </string>
+ <string name="TeleportOffer">
+ Teleport-Angebot
+ </string>
+ <string name="StartUpNotifications">
+ Sie haben neue Benachrichtigungen erhalten, während Sie abwesend waren.
+ </string>
+ <string name="OverflowInfoChannelString">
+ Sie haben noch %d weitere Benachrichtigungen
+ </string>
+ <string name="BodyPartsRightArm">
+ Rechter Arm
+ </string>
+ <string name="BodyPartsHead">
+ Kopf
+ </string>
+ <string name="BodyPartsLeftArm">
+ Linker Arm
+ </string>
+ <string name="BodyPartsLeftLeg">
+ Linkes Bein
+ </string>
+ <string name="BodyPartsTorso">
+ Oberkörper
+ </string>
+ <string name="BodyPartsRightLeg">
+ Rechtes Bein
+ </string>
+ <string name="GraphicsQualityLow">
+ Niedrig
+ </string>
+ <string name="GraphicsQualityMid">
+ Mittel
+ </string>
+ <string name="GraphicsQualityHigh">
+ Hoch
+ </string>
+ <string name="LeaveMouselook">
+ ESC drücken, um zur Normalansicht zurückzukehren
+ </string>
+ <string name="InventoryNoMatchingItems">
+ Sie haben nicht das Richtige gefunden? Versuchen Sie es mit der [secondlife:///app/search/all/[SEARCH_TERM] Suche].
+ </string>
+ <string name="PlacesNoMatchingItems">
+ Sie haben nicht das Richtige gefunden? Versuchen Sie es mit der [secondlife:///app/search/places/[SEARCH_TERM] Suche].
+ </string>
+ <string name="FavoritesNoMatchingItems">
+ Landmarke hier hin ziehen, um diese hinzuzufügen.
+ </string>
+ <string name="InventoryNoTexture">
+ Sie haben keine Kopie dieser Textur in Ihrem Inventar.
+ </string>
+ <string name="InventoryInboxNoItems">
+ Einkäufe aus dem Marktplatz erscheinen hier. Sie können diese dann zur Verwendung in Ihr Inventar ziehen.
+ </string>
+ <string name="MarketplaceURL">
+ https://marketplace.[MARKETPLACE_DOMAIN_NAME]/
+ </string>
+ <string name="MarketplaceURL_CreateStore">
+ http://community.secondlife.com/t5/English-Knowledge-Base/Selling-in-the-Marketplace/ta-p/700193#Section_.4
+ </string>
+ <string name="MarketplaceURL_Dashboard">
+ https://marketplace.[MARKETPLACE_DOMAIN_NAME]/merchants/store/dashboard
+ </string>
+ <string name="MarketplaceURL_Imports">
+ https://marketplace.[MARKETPLACE_DOMAIN_NAME]/merchants/store/imports
+ </string>
+ <string name="MarketplaceURL_LearnMore">
+ https://marketplace.[MARKETPLACE_DOMAIN_NAME]/learn_more
+ </string>
+ <string name="InventoryOutboxNotMerchantTitle">
+ Jeder kann Artikel im Marktplatz verkaufen.
+ </string>
+ <string name="InventoryOutboxNotMerchantTooltip"/>
+ <string name="InventoryOutboxNotMerchant">
+ Wenn Sie als Händler aktiv werden möchten, müssen Sie einen [[MARKETPLACE_CREATE_STORE_URL] Laden im Marktplatz erstellen].
+ </string>
+ <string name="InventoryOutboxNoItemsTitle">
+ Ihre Outbox ist leer.
+ </string>
+ <string name="InventoryOutboxNoItemsTooltip"/>
+ <string name="InventoryOutboxNoItems">
+ Ziehen Sie Ordner in dien Bereich und klicken Sie auf „In Marktplatz übertragen“, um sie im [[MARKETPLACE_DASHBOARD_URL] Marktplatz] zum Verkauf anzubieten.
+ </string>
+ <string name="Marketplace Error None">
+ Keine Fehler
+ </string>
+ <string name="Marketplace Error Not Merchant">
+ Fehler: Bevor Sie Artikel in den Marktplatz übertragen können, müssen Sie sich als Händler registrieren (kostenlos).
+ </string>
+ <string name="Marketplace Error Empty Folder">
+ Fehler: Dieser Ordner ist leer.
+ </string>
+ <string name="Marketplace Error Unassociated Products">
+ Fehler: Dieser Artikel konnte nicht hochgeladen werden, da in Ihrem Händlerkonto zu viele Artikel nicht mit Produkten verknüpft sind. Um diesen Fehler zu beheben, melden Sie sich auf der Marktplatz-Website an und reduzieren Sie die Anzahl von Artikeln, die nicht mit Produkten verknüpft sind.
+ </string>
+ <string name="Marketplace Error Object Limit">
+ Fehler: Dieser Artikel enthält zu viele Objekte. Beheben Sie diesen Fehler, indem Sie Objekte zusammen in Behältern verpacken, um die Objektanzahl auf unter 200 zu verringern.
+ </string>
+ <string name="Marketplace Error Folder Depth">
+ Fehler: Dieser Artikel enthält zu viele verschachtelte Ordnerebenen. Organisieren Sie ihn neu, sodass maximal drei verschachtelte Ordnerebenen vorhanden sind.
+ </string>
+ <string name="Marketplace Error Unsellable Item">
+ Fehler: Dieser Artikel kann nicht im Marktplatz verkauft werden.
+ </string>
+ <string name="Marketplace Error Internal Import">
+ Fehler: Bei diesem Artikel ist ein Problem aufgetreten. Versuchen Sie es später erneut.
+ </string>
+ <string name="Open landmarks">
+ Landmarken öffnen
+ </string>
+ <string name="no_transfer" value=" (kein Transferieren)"/>
+ <string name="no_modify" value=" (kein Bearbeiten)"/>
+ <string name="no_copy" value=" (kein Kopieren)"/>
+ <string name="worn" value=" (getragen)"/>
+ <string name="link" value=" (Link)"/>
+ <string name="broken_link" value=" (unvollständiger_Link)"/>
+ <string name="LoadingContents">
+ Inhalte werden geladen...
+ </string>
+ <string name="NoContents">
+ Keine Inhalte
+ </string>
+ <string name="WornOnAttachmentPoint" value=" (getragen am [ATTACHMENT_POINT])"/>
+ <string name="ActiveGesture" value="[GESLABEL] (aktiviert)"/>
+ <string name="PermYes">
+ Ja
+ </string>
+ <string name="PermNo">
+ Nein
+ </string>
+ <string name="Chat Message" value="Chat:"/>
+ <string name="Sound" value=" Sound:"/>
+ <string name="Wait" value=" --- Warten:"/>
+ <string name="AnimFlagStop" value=" Animation stoppen:"/>
+ <string name="AnimFlagStart" value=" Animation starten:"/>
+ <string name="Wave" value=" Winken"/>
+ <string name="GestureActionNone" value="Keine"/>
+ <string name="HelloAvatar" value=" Hallo Avatar!"/>
+ <string name="ViewAllGestures" value=" Alle anzeigen &gt;&gt;"/>
+ <string name="GetMoreGestures" value="Mehr &gt;&gt;"/>
+ <string name="Animations" value=" Animationen,"/>
+ <string name="Calling Cards" value=" Visitenkarten,"/>
+ <string name="Clothing" value=" Kleidung,"/>
+ <string name="Gestures" value=" Gesten,"/>
+ <string name="Landmarks" value=" Landmarken,"/>
+ <string name="Notecards" value=" Notizkarten,"/>
+ <string name="Objects" value=" Objekte,"/>
+ <string name="Scripts" value=" Skripts,"/>
+ <string name="Sounds" value=" Sounds,"/>
+ <string name="Textures" value=" Texturen,"/>
+ <string name="Snapshots" value=" Fotos,"/>
+ <string name="No Filters" value="Nein "/>
+ <string name="Since Logoff" value=" - Seit Abmeldung"/>
+ <string name="InvFolder My Inventory">
+ Mein Inventar
+ </string>
+ <string name="InvFolder Library">
+ Bibliothek
+ </string>
+ <string name="InvFolder Textures">
+ Texturen
+ </string>
+ <string name="InvFolder Sounds">
+ Sounds
+ </string>
+ <string name="InvFolder Calling Cards">
+ Visitenkarten
+ </string>
+ <string name="InvFolder Landmarks">
+ Landmarken
+ </string>
+ <string name="InvFolder Scripts">
+ Skripts
+ </string>
+ <string name="InvFolder Clothing">
+ Kleidung
+ </string>
+ <string name="InvFolder Objects">
+ Objekte
+ </string>
+ <string name="InvFolder Notecards">
+ Notizkarten
+ </string>
+ <string name="InvFolder New Folder">
+ Neuer Ordner
+ </string>
+ <string name="InvFolder Inventory">
+ Inventar
+ </string>
+ <string name="InvFolder Uncompressed Images">
+ Nicht-Komprimierte Bilder
+ </string>
+ <string name="InvFolder Body Parts">
+ Körperteile
+ </string>
+ <string name="InvFolder Trash">
+ Papierkorb
+ </string>
+ <string name="InvFolder Photo Album">
+ Fotoalbum
+ </string>
+ <string name="InvFolder Lost And Found">
+ Fundbüro
+ </string>
+ <string name="InvFolder Uncompressed Sounds">
+ Nicht-Komprimierte Sounds
+ </string>
+ <string name="InvFolder Animations">
+ Animationen
+ </string>
+ <string name="InvFolder Gestures">
+ Gesten
+ </string>
+ <string name="InvFolder Favorite">
+ Meine Favoriten
+ </string>
+ <string name="InvFolder favorite">
+ Meine Favoriten
+ </string>
+ <string name="InvFolder Current Outfit">
+ Aktuelles Outfit
+ </string>
+ <string name="InvFolder Initial Outfits">
+ Ursprüngliche Outfits
+ </string>
+ <string name="InvFolder My Outfits">
+ Meine Outfits
+ </string>
+ <string name="InvFolder Accessories">
+ Zubehör
+ </string>
+ <string name="InvFolder Meshes">
+ Netze
+ </string>
+ <string name="InvFolder Friends">
+ Freunde
+ </string>
+ <string name="InvFolder All">
+ Alle
+ </string>
+ <string name="no_attachments">
+ Keine Anhänge getragen
+ </string>
+ <string name="Attachments remain">
+ Anhänge (noch [COUNT] Positionen frei)
+ </string>
+ <string name="Buy">
+ Kaufen
+ </string>
+ <string name="BuyforL$">
+ Kaufen für L$
+ </string>
+ <string name="Stone">
+ Stein
+ </string>
+ <string name="Metal">
+ Metall
+ </string>
+ <string name="Glass">
+ Glas
+ </string>
+ <string name="Wood">
+ Holz
+ </string>
+ <string name="Flesh">
+ Fleisch
+ </string>
+ <string name="Plastic">
+ Plastik
+ </string>
+ <string name="Rubber">
+ Gummi
+ </string>
+ <string name="Light">
+ Hell
+ </string>
+ <string name="KBShift">
+ Umschalt-Taste
+ </string>
+ <string name="KBCtrl">
+ Strg
+ </string>
+ <string name="Chest">
+ Brust
+ </string>
+ <string name="Skull">
+ Schädel
+ </string>
+ <string name="Left Shoulder">
+ Linke Schulter
+ </string>
+ <string name="Right Shoulder">
+ Rechte Schulter
+ </string>
+ <string name="Left Hand">
+ Linke Hand
+ </string>
+ <string name="Right Hand">
+ Rechte Hand
+ </string>
+ <string name="Left Foot">
+ Linker Fuß
+ </string>
+ <string name="Right Foot">
+ Rechter Fuß
+ </string>
+ <string name="Spine">
+ Wirbelsäule
+ </string>
+ <string name="Pelvis">
+ Becken
+ </string>
+ <string name="Mouth">
+ Mund
+ </string>
+ <string name="Chin">
+ Kinn
+ </string>
+ <string name="Left Ear">
+ Linkes Ohr
+ </string>
+ <string name="Right Ear">
+ Rechtes Ohr
+ </string>
+ <string name="Left Eyeball">
+ Linker Augapfel
+ </string>
+ <string name="Right Eyeball">
+ Rechter Augapfel
+ </string>
+ <string name="Nose">
+ Nase
+ </string>
+ <string name="R Upper Arm">
+ R Oberarm
+ </string>
+ <string name="R Forearm">
+ R Unterarm
+ </string>
+ <string name="L Upper Arm">
+ L Oberarm
+ </string>
+ <string name="L Forearm">
+ L Unterarm
+ </string>
+ <string name="Right Hip">
+ Rechte Hüfte
+ </string>
+ <string name="R Upper Leg">
+ R Oberschenkel
+ </string>
+ <string name="R Lower Leg">
+ R Unterschenkel
+ </string>
+ <string name="Left Hip">
+ Linke Hüfte
+ </string>
+ <string name="L Upper Leg">
+ L Oberschenkel
+ </string>
+ <string name="L Lower Leg">
+ L Unterschenkel
+ </string>
+ <string name="Stomach">
+ Bauch
+ </string>
+ <string name="Left Pec">
+ Linke Brust
+ </string>
+ <string name="Right Pec">
+ Rechts
+ </string>
+ <string name="Neck">
+ Hals
+ </string>
+ <string name="Avatar Center">
+ Avatar-Mitte
+ </string>
+ <string name="Invalid Attachment">
+ Ungültige Stelle für Anhang
+ </string>
+ <string name="YearsMonthsOld">
+ [AGEYEARS] [AGEMONTHS] alt
+ </string>
+ <string name="YearsOld">
+ [AGEYEARS] alt
+ </string>
+ <string name="MonthsOld">
+ [AGEMONTHS] alt
+ </string>
+ <string name="WeeksOld">
+ [AGEWEEKS] alt
+ </string>
+ <string name="DaysOld">
+ [AGEDAYS] alt
+ </string>
+ <string name="TodayOld">
+ Seit heute Mitglied
+ </string>
+ <string name="AgeYearsA">
+ [COUNT] Jahr
+ </string>
+ <string name="AgeYearsB">
+ [COUNT] Jahre
+ </string>
+ <string name="AgeYearsC">
+ [COUNT] Jahre
+ </string>
+ <string name="AgeMonthsA">
+ [COUNT] Monat
+ </string>
+ <string name="AgeMonthsB">
+ [COUNT] Monate
+ </string>
+ <string name="AgeMonthsC">
+ [COUNT] Monate
+ </string>
+ <string name="AgeWeeksA">
+ [COUNT] Woche
+ </string>
+ <string name="AgeWeeksB">
+ [COUNT] Wochen
+ </string>
+ <string name="AgeWeeksC">
+ [COUNT] Wochen
+ </string>
+ <string name="AgeDaysA">
+ [COUNT] Tag
+ </string>
+ <string name="AgeDaysB">
+ [COUNT] Tage
+ </string>
+ <string name="AgeDaysC">
+ [COUNT] Tage
+ </string>
+ <string name="GroupMembersA">
+ [COUNT] Mitglied
+ </string>
+ <string name="GroupMembersB">
+ [COUNT] Mitglieder
+ </string>
+ <string name="GroupMembersC">
+ [COUNT] Mitglieder
+ </string>
+ <string name="AcctTypeResident">
+ Einwohner
+ </string>
+ <string name="AcctTypeTrial">
+ Test
+ </string>
+ <string name="AcctTypeCharterMember">
+ Charta-Mitglied
+ </string>
+ <string name="AcctTypeEmployee">
+ Linden Lab-Mitarbeiter
+ </string>
+ <string name="PaymentInfoUsed">
+ Zahlungsinfo verwendet
+ </string>
+ <string name="PaymentInfoOnFile">
+ Zahlungsinfo archiviert
+ </string>
+ <string name="NoPaymentInfoOnFile">
+ Keine Zahlungsinfo archiviert
+ </string>
+ <string name="AgeVerified">
+ Altersgeprüft
+ </string>
+ <string name="NotAgeVerified">
+ Nicht altersgeprüft
+ </string>
+ <string name="Center 2">
+ Mitte 2
+ </string>
+ <string name="Top Right">
+ Oben rechts
+ </string>
+ <string name="Top">
+ Oben
+ </string>
+ <string name="Top Left">
+ Oben links
+ </string>
+ <string name="Center">
+ Mitte
+ </string>
+ <string name="Bottom Left">
+ Unten links
+ </string>
+ <string name="Bottom">
+ Unten
+ </string>
+ <string name="Bottom Right">
+ Unten rechts
+ </string>
+ <string name="CompileQueueDownloadedCompiling">
+ Heruntergeladen, wird kompiliert
+ </string>
+ <string name="CompileQueueScriptNotFound">
+ Skript wurde auf Server nicht gefunden.
+ </string>
+ <string name="CompileQueueProblemDownloading">
+ Beim Herunterladen ist ein Problem aufgetreten
+ </string>
+ <string name="CompileQueueInsufficientPermDownload">
+ Unzureichende Rechte zum Herunterladen eines Skripts.
+ </string>
+ <string name="CompileQueueInsufficientPermFor">
+ Unzureichende Berechtigungen für
+ </string>
+ <string name="CompileQueueUnknownFailure">
+ Unbekannter Fehler beim Herunterladen
+ </string>
+ <string name="CompileQueueTitle">
+ Rekompilierung
+ </string>
+ <string name="CompileQueueStart">
+ rekompilieren
+ </string>
+ <string name="ResetQueueTitle">
+ Zurücksetzen
+ </string>
+ <string name="ResetQueueStart">
+ Zurücksetzen
+ </string>
+ <string name="RunQueueTitle">
+ Skript ausführen
+ </string>
+ <string name="RunQueueStart">
+ Skript ausführen
+ </string>
+ <string name="NotRunQueueTitle">
+ Skript anhalten
+ </string>
+ <string name="NotRunQueueStart">
+ Skript anhalten
+ </string>
+ <string name="CompileSuccessful">
+ Kompilieren erfolgreich abgeschlossen!
+ </string>
+ <string name="CompileSuccessfulSaving">
+ Kompilieren erfolgreich abgeschlossen, speichern...
+ </string>
+ <string name="SaveComplete">
+ Speichervorgang abgeschlossen.
+ </string>
+ <string name="ObjectOutOfRange">
+ Skript (Objekt außerhalb des Bereichs)
+ </string>
+ <string name="GodToolsObjectOwnedBy">
+ Objekt [OBJECT], Besitzer [OWNER]
+ </string>
+ <string name="GroupsNone">
+ keine
+ </string>
+ <string name="Group" value=" (Gruppe)"/>
+ <string name="Unknown">
+ (unbekannt)
+ </string>
+ <string name="SummaryForTheWeek" value="Zusammenfassung für diese Woche, beginnend am "/>
+ <string name="NextStipendDay" value=". Der nächste Stipendium-Tag ist "/>
+ <string name="GroupPlanningDate">
+ [mthnum,datetime,utc]/[day,datetime,utc]/[year,datetime,utc]
+ </string>
+ <string name="GroupIndividualShare" value=" Gruppenanteil Einzelanteil"/>
+ <string name="GroupColumn" value="Gruppe"/>
+ <string name="Balance">
+ Kontostand
+ </string>
+ <string name="Credits">
+ Danksagung
+ </string>
+ <string name="Debits">
+ Soll
+ </string>
+ <string name="Total">
+ Gesamtbetrag
+ </string>
+ <string name="NoGroupDataFound">
+ Für Gruppe wurden keine Gruppendaten gefunden
+ </string>
+ <string name="IMParentEstate">
+ parent estate
+ </string>
+ <string name="IMMainland">
+ Mainland
+ </string>
+ <string name="IMTeen">
+ Teen
+ </string>
+ <string name="Anyone">
+ jeder
+ </string>
+ <string name="RegionInfoError">
+ Fehler
+ </string>
+ <string name="RegionInfoAllEstatesOwnedBy">
+ alle Grundbesitze gehören [OWNER]
+ </string>
+ <string name="RegionInfoAllEstatesYouOwn">
+ alle Grundbesitze, die Sie besitzen
+ </string>
+ <string name="RegionInfoAllEstatesYouManage">
+ alle Grundbesitze, die Sie für [OWNER] verwalten
+ </string>
+ <string name="RegionInfoAllowedResidents">
+ Zulässige Einwohner: ([ALLOWEDAGENTS], max [MAXACCESS])
+ </string>
+ <string name="RegionInfoAllowedGroups">
+ Zulässige Gruppen: ([ALLOWEDGROUPS], max [MAXACCESS])
+ </string>
+ <string name="ScriptLimitsParcelScriptMemory">
+ Parzellenskript-Speicher
+ </string>
+ <string name="ScriptLimitsParcelsOwned">
+ Aufgeführte Parzellen: [PARCELS]
+ </string>
+ <string name="ScriptLimitsMemoryUsed">
+ Verwendeter Speicher: [COUNT] KB von [MAX] KB; [AVAILABLE] KB verfügbar
+ </string>
+ <string name="ScriptLimitsMemoryUsedSimple">
+ Verwendeter Speicher: [COUNT] KB
+ </string>
+ <string name="ScriptLimitsParcelScriptURLs">
+ Parzelleskript-URLs
+ </string>
+ <string name="ScriptLimitsURLsUsed">
+ Verwendete URLs: [COUNT] von [MAX]; [AVAILABLE] verfügbar
+ </string>
+ <string name="ScriptLimitsURLsUsedSimple">
+ Verwendete URLs: [COUNT]
+ </string>
+ <string name="ScriptLimitsRequestError">
+ Fehler bei Informationsabruf
+ </string>
+ <string name="ScriptLimitsRequestNoParcelSelected">
+ Keine Parzellen wurden ausgewählt
+ </string>
+ <string name="ScriptLimitsRequestWrongRegion">
+ Fehler: Skriptinformationen sind nur für Ihre aktuelle Region verfügbar
+ </string>
+ <string name="ScriptLimitsRequestWaiting">
+ Informationen werden abgerufen...
+ </string>
+ <string name="ScriptLimitsRequestDontOwnParcel">
+ Sie sind nicht berechtigt, diese Parzelle zu untersuchen.
+ </string>
+ <string name="SITTING_ON">
+ sitzt auf
+ </string>
+ <string name="ATTACH_CHEST">
+ Brust
+ </string>
+ <string name="ATTACH_HEAD">
+ Kopf
+ </string>
+ <string name="ATTACH_LSHOULDER">
+ Linke Schulter
+ </string>
+ <string name="ATTACH_RSHOULDER">
+ Rechte Schulter
+ </string>
+ <string name="ATTACH_LHAND">
+ Linke Hand
+ </string>
+ <string name="ATTACH_RHAND">
+ Rechte Hand
+ </string>
+ <string name="ATTACH_LFOOT">
+ Linker Fuß
+ </string>
+ <string name="ATTACH_RFOOT">
+ Rechter Fuß
+ </string>
+ <string name="ATTACH_BACK">
+ Hinten
+ </string>
+ <string name="ATTACH_PELVIS">
+ Becken
+ </string>
+ <string name="ATTACH_MOUTH">
+ Mund
+ </string>
+ <string name="ATTACH_CHIN">
+ Kinn
+ </string>
+ <string name="ATTACH_LEAR">
+ Linkes Ohr
+ </string>
+ <string name="ATTACH_REAR">
+ Rechtes Ohr
+ </string>
+ <string name="ATTACH_LEYE">
+ Linkes Auge
+ </string>
+ <string name="ATTACH_REYE">
+ Rechtes Auge
+ </string>
+ <string name="ATTACH_NOSE">
+ Nase
+ </string>
+ <string name="ATTACH_RUARM">
+ Rechter Oberarm
+ </string>
+ <string name="ATTACH_RLARM">
+ Rechter Unterarm
+ </string>
+ <string name="ATTACH_LUARM">
+ Linker Oberarm
+ </string>
+ <string name="ATTACH_LLARM">
+ Linker Unterarm
+ </string>
+ <string name="ATTACH_RHIP">
+ Rechte Hüfte
+ </string>
+ <string name="ATTACH_RULEG">
+ Rechter Oberschenkel
+ </string>
+ <string name="ATTACH_RLLEG">
+ Rechter Unterschenkel
+ </string>
+ <string name="ATTACH_LHIP">
+ Linke Hüfte
+ </string>
+ <string name="ATTACH_LULEG">
+ Linker Oberschenkel
+ </string>
+ <string name="ATTACH_LLLEG">
+ Linker Unterschenkel
+ </string>
+ <string name="ATTACH_BELLY">
+ Bauch
+ </string>
+ <string name="ATTACH_RPEC">
+ Rechts
+ </string>
+ <string name="ATTACH_LPEC">
+ Linke Brust
+ </string>
+ <string name="ATTACH_HUD_CENTER_2">
+ HUD Mitte 2
+ </string>
+ <string name="ATTACH_HUD_TOP_RIGHT">
+ HUD oben rechts
+ </string>
+ <string name="ATTACH_HUD_TOP_CENTER">
+ HUD oben Mitte
+ </string>
+ <string name="ATTACH_HUD_TOP_LEFT">
+ HUD oben links
+ </string>
+ <string name="ATTACH_HUD_CENTER_1">
+ HUD Mitte 1
+ </string>
+ <string name="ATTACH_HUD_BOTTOM_LEFT">
+ HUD unten links
+ </string>
+ <string name="ATTACH_HUD_BOTTOM">
+ HUD unten
+ </string>
+ <string name="ATTACH_HUD_BOTTOM_RIGHT">
+ HUD unten rechts
+ </string>
+ <string name="CursorPos">
+ Zeile [LINE], Spalte [COLUMN]
+ </string>
+ <string name="PanelDirCountFound">
+ [COUNT] gefunden
+ </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">
+ Objektinhalt
+ </string>
+ <string name="PanelContentsNewScript">
+ Neues Skript
+ </string>
+ <string name="BusyModeResponseDefault">
+ Der Einwohner/Die Einwohnerin ist „beschäftigtâ€, d.h. er/sie möchte im Moment nicht gestört werden. Ihre Nachricht wird dem Einwohner/der Einwohnerin als IM angezeigt, und kann später beantwortet werden.
+ </string>
+ <string name="MuteByName">
+ (Nach Namen)
+ </string>
+ <string name="MuteAgent">
+ (Einwohner)
+ </string>
+ <string name="MuteObject">
+ (Objekt)
+ </string>
+ <string name="MuteGroup">
+ (Gruppe)
+ </string>
+ <string name="MuteExternal">
+ (Extern)
+ </string>
+ <string name="RegionNoCovenant">
+ Für diesen Grundbesitz liegt kein Vertrag vor.
+ </string>
+ <string name="RegionNoCovenantOtherOwner">
+ Für diesen Grundbesitz liegt kein Vertrag vor. Das Land auf diesem Grundbesitz wird vom Grundbesitzer und nicht von Linden Lab verkauft. Für Informationen zum Verkauf setzen Sie sich bitte mit dem Grundbesitzer in Verbindung.
+ </string>
+ <string name="covenant_last_modified" value="Zuletzt geändert: "/>
+ <string name="none_text" value=" (keiner) "/>
+ <string name="never_text" value=" (nie) "/>
+ <string name="GroupOwned">
+ In Gruppenbesitz
+ </string>
+ <string name="Public">
+ Öffentlich
+ </string>
+ <string name="LocalSettings">
+ Lokale Einstellungen
+ </string>
+ <string name="RegionSettings">
+ Regionseinstellungen
+ </string>
+ <string name="ClassifiedClicksTxt">
+ Klicks: [TELEPORT] teleportieren, [MAP] Karte, [PROFILE] Profil
+ </string>
+ <string name="ClassifiedUpdateAfterPublish">
+ (wird nach Veröffentlichung aktualisiert)
+ </string>
+ <string name="NoPicksClassifiedsText">
+ Sie haben keine Auswahl oder Anzeigen erstelllt. Klicken Sie auf die „Plus&quot;-Schaltfläche, um eine Auswahl oder Anzeige zu erstellen.
+ </string>
+ <string name="NoAvatarPicksClassifiedsText">
+ Der Einwohner hat keine Auswahl oder Anzeigen
+ </string>
+ <string name="PicksClassifiedsLoadingText">
+ Wird geladen...
+ </string>
+ <string name="MultiPreviewTitle">
+ Vorschau
+ </string>
+ <string name="MultiPropertiesTitle">
+ Eigenschaften
+ </string>
+ <string name="InvOfferAnObjectNamed">
+ Ein Objekt namens
+ </string>
+ <string name="InvOfferOwnedByGroup">
+ im Besitz der Gruppe
+ </string>
+ <string name="InvOfferOwnedByUnknownGroup">
+ im Besitz einer unbekannten Gruppe
+ </string>
+ <string name="InvOfferOwnedBy">
+ im Besitz von
+ </string>
+ <string name="InvOfferOwnedByUnknownUser">
+ im Besitz eines unbekannten Einwohners
+ </string>
+ <string name="InvOfferGaveYou">
+ hat Ihnen folgendes übergeben
+ </string>
+ <string name="InvOfferDecline">
+ Sie lehnen [DESC] von &lt;nolink&gt;[NAME]&lt;/nolink&gt; ab.
+ </string>
+ <string name="GroupMoneyTotal">
+ Gesamtbetrag
+ </string>
+ <string name="GroupMoneyBought">
+ gekauft
+ </string>
+ <string name="GroupMoneyPaidYou">
+ bezahlte Ihnen
+ </string>
+ <string name="GroupMoneyPaidInto">
+ bezahlte an
+ </string>
+ <string name="GroupMoneyBoughtPassTo">
+ kaufte Pass für
+ </string>
+ <string name="GroupMoneyPaidFeeForEvent">
+ bezahlte Gebühr für Event
+ </string>
+ <string name="GroupMoneyPaidPrizeForEvent">
+ bezahlte Preis für Event
+ </string>
+ <string name="GroupMoneyBalance">
+ Kontostand
+ </string>
+ <string name="GroupMoneyCredits">
+ Danksagung
+ </string>
+ <string name="GroupMoneyDebits">
+ Soll
+ </string>
+ <string name="GroupMoneyDate">
+ [weekday,datetime,utc] [mth,datetime,utc] [day,datetime,utc], [year,datetime,utc]
+ </string>
+ <string name="ViewerObjectContents">
+ Inhalte
+ </string>
+ <string name="AcquiredItems">
+ Erworbene Artikel
+ </string>
+ <string name="Cancel">
+ Abbrechen
+ </string>
+ <string name="UploadingCosts">
+ Das Hochladen von [NAME] kostet [AMOUNT] L$
+ </string>
+ <string name="BuyingCosts">
+ Die Kosten betragen: [AMOUNT] L$
+ </string>
+ <string name="UnknownFileExtension">
+ Unbekanntes Dateiformat .%s
+Gültige Formate: .wav, .tga, .bmp, .jpg, .jpeg oder .bvh
+ </string>
+ <string name="MuteObject2">
+ Ignorieren
+ </string>
+ <string name="MuteAvatar">
+ Ignorieren
+ </string>
+ <string name="UnmuteObject">
+ Freischalten
+ </string>
+ <string name="UnmuteAvatar">
+ Freischalten
+ </string>
+ <string name="AddLandmarkNavBarMenu">
+ Zu meinen Landmarken hinzufügen...
+ </string>
+ <string name="EditLandmarkNavBarMenu">
+ Meine Landmarken bearbeiten...
+ </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">
+ Strg+
+ </string>
+ <string name="accel-win-alt">
+ Alt+
+ </string>
+ <string name="accel-win-shift">
+ Umschalt+
+ </string>
+ <string name="FileSaved">
+ Datei wurde gespeichert
+ </string>
+ <string name="Receiving">
+ Daten werden empfangen
+ </string>
+ <string name="AM">
+ Uhr
+ </string>
+ <string name="PM">
+ Uhr
+ </string>
+ <string name="PST">
+ PST
+ </string>
+ <string name="PDT">
+ PDT
+ </string>
+ <string name="Direction_Forward">
+ Vorwärts
+ </string>
+ <string name="Direction_Left">
+ Links
+ </string>
+ <string name="Direction_Right">
+ Rechts
+ </string>
+ <string name="Direction_Back">
+ Zurück
+ </string>
+ <string name="Direction_North">
+ Norden
+ </string>
+ <string name="Direction_South">
+ Süden
+ </string>
+ <string name="Direction_West">
+ Westen
+ </string>
+ <string name="Direction_East">
+ Osten
+ </string>
+ <string name="Direction_Up">
+ Nach oben
+ </string>
+ <string name="Direction_Down">
+ Nach unten
+ </string>
+ <string name="Any Category">
+ Alle Kategorien
+ </string>
+ <string name="Shopping">
+ Shopping
+ </string>
+ <string name="Land Rental">
+ Land mieten
+ </string>
+ <string name="Property Rental">
+ Immobilie mieten
+ </string>
+ <string name="Special Attraction">
+ Attraktionen
+ </string>
+ <string name="New Products">
+ Neue Produkte
+ </string>
+ <string name="Employment">
+ Stellenangebote
+ </string>
+ <string name="Wanted">
+ Gesucht
+ </string>
+ <string name="Service">
+ Dienstleistungen
+ </string>
+ <string name="Personal">
+ Sonstiges
+ </string>
+ <string name="None">
+ Keiner
+ </string>
+ <string name="Linden Location">
+ Lindenort
+ </string>
+ <string name="Adult">
+ Adult
+ </string>
+ <string name="Arts&amp;Culture">
+ Kunst &amp; Kultur
+ </string>
+ <string name="Business">
+ Firmen
+ </string>
+ <string name="Educational">
+ Bildung
+ </string>
+ <string name="Gaming">
+ Spielen
+ </string>
+ <string name="Hangout">
+ Treffpunkt
+ </string>
+ <string name="Newcomer Friendly">
+ Anfängergerecht
+ </string>
+ <string name="Parks&amp;Nature">
+ Parks und Natur
+ </string>
+ <string name="Residential">
+ Wohngebiet
+ </string>
+ <string name="Stage">
+ Phase
+ </string>
+ <string name="Other">
+ Sonstige
+ </string>
+ <string name="Rental">
+ Vermietung
+ </string>
+ <string name="Any">
+ Alle
+ </string>
+ <string name="You">
+ Sie
+ </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">
+ Mehrere Medien
+ </string>
+ <string name="Play Media">
+ Medien Abspielen/Pausieren
+ </string>
+ <string name="MBCmdLineError">
+ Beim Parsen der Befehlszeile wurde ein Fehler festgestellt.
+Weitere Informationen: http://wiki.secondlife.com/wiki/Client_parameters (EN)
+Fehler:
+ </string>
+ <string name="MBCmdLineUsg">
+ [APP_NAME] Verwendung in Befehlszeile:
+ </string>
+ <string name="MBUnableToAccessFile">
+ [APP_NAME] kann auf die erforderliche Datei nicht zugreifen.
+
+Grund hierfür ist, dass Sie entweder mehrere Instanzen gleichzeitig ausführen oder dass Ihr System denkt, eine Datei sei geöffnet.
+Falls diese Nachricht erneut angezeigt wird, starten Sie bitte Ihren Computer neu und probieren Sie es noch einmal.
+Falls der Fehler dann weiterhin auftritt, müssen Sie [APP_NAME] von Ihrem System de-installieren und erneut installieren.
+ </string>
+ <string name="MBFatalError">
+ Unbehebbarer Fehler
+ </string>
+ <string name="MBRequiresAltiVec">
+ [APP_NAME] erfordert einen Prozessor mit AltiVec (G4 oder später).
+ </string>
+ <string name="MBAlreadyRunning">
+ [APP_NAME] läuft bereits.
+Bitte sehen Sie in Ihrer Menüleiste nach, dort sollte ein Symbol für das Programm angezeigt werden.
+Falls diese Nachricht erneut angezeigt wird, starten Sie Ihren Computer bitte neu.
+ </string>
+ <string name="MBFrozenCrashed">
+ [APP_NAME] scheint eingefroren zu sein oder ist abgestürzt.
+Möchten Sie einen Absturz-Bericht einschicken?
+ </string>
+ <string name="MBAlert">
+ Benachrichtigung
+ </string>
+ <string name="MBNoDirectX">
+ [APP_NAME] kann DirectX 9.0b oder höher nicht feststellen.
+[APP_NAME] verwendet DirectX, um nach Hardware und/oder veralteten Treibern zu suchen, die zu Problemen mit der Stabilität, Leistung und Abstürzen führen können. Sie können [APP_NAME] auch so ausführen, wir empfehlen jedoch, dass DirectX 9.0b vorhanden ist und ausgeführt wird.
+
+Möchten Sie fortfahren?
+ </string>
+ <string name="MBWarning">
+ Hinweis
+ </string>
+ <string name="MBNoAutoUpdate">
+ Für Linux ist zur Zeit noch kein automatisches Aktualisieren möglich.
+Bitte laden Sie die aktuellste Version von www.secondlife.com herunter.
+ </string>
+ <string name="MBRegClassFailed">
+ RegisterClass fehlgeschlagen
+ </string>
+ <string name="MBError">
+ Fehler
+ </string>
+ <string name="MBFullScreenErr">
+ Vollbildschirm mit [WIDTH] x [HEIGHT] kann nicht ausgeführt werden.
+Ausführung erfolgt in Fenster.
+ </string>
+ <string name="MBDestroyWinFailed">
+ Fehler beim Herunterfahren während Fenster geschlossen wurde (DestroyWindow() fehlgeschlagen)
+ </string>
+ <string name="MBShutdownErr">
+ Fehler beim Herunterfahren
+ </string>
+ <string name="MBDevContextErr">
+ Kann keinen Kontext für GL-Gerät erstellen
+ </string>
+ <string name="MBPixelFmtErr">
+ Passendes Pixelformat wurde nicht gefunden
+ </string>
+ <string name="MBPixelFmtDescErr">
+ Beschreibung für Pixelformat nicht verfügbar
+ </string>
+ <string name="MBTrueColorWindow">
+ Um [APP_NAME] auszuführen, ist True Color (32-bit) erforderlich.
+Klicken Sie öffnen Sie auf Ihrem Computer die Einstellungen für die Anzeige und stellen Sie den Bildschirm auf 32-bit Farbe ein.
+ </string>
+ <string name="MBAlpha">
+ [APP_NAME] kann nicht ausgeführt werden, da kein 8-Bit-Alpha-Kanal verfügbar ist. Dies geschieht normalerweise bei Problemen mit dem Treiber der Video-Karte.
+Bitte vergewissern Sie sich, dass Sie die aktuellsten Treiber für Ihre Videokarte installiert haben.
+Vergewissern Sie sich außerdem, dass Ihr Bildschirm auf True Color (32-Bit) eingestellt ist (Systemsteuerung &gt; Anzeige &gt; Einstellungen).
+Falls diese Meldung weiterhin angezeigt wird, wenden Sie sich bitte an [SUPPORT_SITE].
+ </string>
+ <string name="MBPixelFmtSetErr">
+ Pixel-Format kann nicht eingestellt werden.
+ </string>
+ <string name="MBGLContextErr">
+ Kann keinen Kontext für GL-Gerät erstellen
+ </string>
+ <string name="MBGLContextActErr">
+ Kann keinen Kontext für GL-Gerät aktivieren
+ </string>
+ <string name="MBVideoDrvErr">
+ [APP_NAME] kann nicht ausgeführt werden, da die Treiber Ihrer Videokarte entweder nicht richtig installiert oder veraltet sind, oder die entsprechende Hardware nicht unterstützt wird. Bitte vergewissern Sie sich, dass Sie die aktuellsten Treiber für die Videokarte installiert haben. Falls Sie die aktuellsten Treiber bereits installiert haben, installieren Sie diese bitte erneut.
+
+Falls diese Meldung weiterhin angezeigt wird, wenden Sie sich bitte an [SUPPORT_SITE].
+ </string>
+ <string name="5 O&apos;Clock Shadow">
+ Bartschatten
+ </string>
+ <string name="All White">
+ Ganz weiß
+ </string>
+ <string name="Anime Eyes">
+ Anime-Augen
+ </string>
+ <string name="Arced">
+ Gewölbt
+ </string>
+ <string name="Arm Length">
+ Armlänge
+ </string>
+ <string name="Attached">
+ Angewachsen
+ </string>
+ <string name="Attached Earlobes">
+ Angewachsene Ohrläppchen
+ </string>
+ <string name="Back Fringe">
+ Nackenfransen
+ </string>
+ <string name="Baggy">
+ Tränensäcke
+ </string>
+ <string name="Bangs">
+ Pony
+ </string>
+ <string name="Beady Eyes">
+ Knopfaugen
+ </string>
+ <string name="Belly Size">
+ Bauchgröße
+ </string>
+ <string name="Big">
+ Groß
+ </string>
+ <string name="Big Butt">
+ Großer Hintern
+ </string>
+ <string name="Big Hair Back">
+ Volumen: Hinten
+ </string>
+ <string name="Big Hair Front">
+ Volumen: Vorne
+ </string>
+ <string name="Big Hair Top">
+ Volumen: Oben
+ </string>
+ <string name="Big Head">
+ Groß
+ </string>
+ <string name="Big Pectorals">
+ Große Brustmuskeln
+ </string>
+ <string name="Big Spikes">
+ Große Stacheln
+ </string>
+ <string name="Black">
+ Schwarz
+ </string>
+ <string name="Blonde">
+ Blond
+ </string>
+ <string name="Blonde Hair">
+ Blondes Haar
+ </string>
+ <string name="Blush">
+ Rouge
+ </string>
+ <string name="Blush Color">
+ Rougefarbe
+ </string>
+ <string name="Blush Opacity">
+ Rouge Deckkraft
+ </string>
+ <string name="Body Definition">
+ Körperkonturen
+ </string>
+ <string name="Body Fat">
+ Körperfett
+ </string>
+ <string name="Body Freckles">
+ Sommersprossen
+ </string>
+ <string name="Body Thick">
+ breit
+ </string>
+ <string name="Body Thickness">
+ Körperbreite
+ </string>
+ <string name="Body Thin">
+ schmal
+ </string>
+ <string name="Bow Legged">
+ o-beinig
+ </string>
+ <string name="Breast Buoyancy">
+ Brust, Straffheit
+ </string>
+ <string name="Breast Cleavage">
+ Dekolleté
+ </string>
+ <string name="Breast Size">
+ Brustgröße
+ </string>
+ <string name="Bridge Width">
+ Rückenbreite
+ </string>
+ <string name="Broad">
+ Breit
+ </string>
+ <string name="Brow Size">
+ Brauengröße
+ </string>
+ <string name="Bug Eyes">
+ Glubschaugen
+ </string>
+ <string name="Bugged Eyes">
+ Hervortretend
+ </string>
+ <string name="Bulbous">
+ Knollennase
+ </string>
+ <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>
+ <string name="Bushy Hair">
+ Buschiges Haar
+ </string>
+ <string name="Butt Size">
+ Hintern, Größe
+ </string>
+ <string name="Butt Gravity">
+ Po – Schwerkraft
+ </string>
+ <string name="bustle skirt">
+ Tournürenrock
+ </string>
+ <string name="no bustle">
+ Ohne
+ </string>
+ <string name="more bustle">
+ Mit
+ </string>
+ <string name="Chaplin">
+ Chaplin
+ </string>
+ <string name="Cheek Bones">
+ Wangenknochen
+ </string>
+ <string name="Chest Size">
+ Brustgröße
+ </string>
+ <string name="Chin Angle">
+ Kinnwinkel
+ </string>
+ <string name="Chin Cleft">
+ Kinnspalte
+ </string>
+ <string name="Chin Curtains">
+ Schifferfräse
+ </string>
+ <string name="Chin Depth">
+ Kinnlänge
+ </string>
+ <string name="Chin Heavy">
+ Kinn ausgeprägt
+ </string>
+ <string name="Chin In">
+ Kinn zurück
+ </string>
+ <string name="Chin Out">
+ Kinn nach vorne
+ </string>
+ <string name="Chin-Neck">
+ Kinn-Hals
+ </string>
+ <string name="Clear">
+ Transparent
+ </string>
+ <string name="Cleft">
+ Spalte
+ </string>
+ <string name="Close Set Eyes">
+ Eng stehende Augen
+ </string>
+ <string name="Closed">
+ Geschlossen
+ </string>
+ <string name="Closed Back">
+ Hinten geschlossen
+ </string>
+ <string name="Closed Front">
+ Vorne geschlossen
+ </string>
+ <string name="Closed Left">
+ Links geschlossen
+ </string>
+ <string name="Closed Right">
+ Rechts geschlossen
+ </string>
+ <string name="Coin Purse">
+ Klein
+ </string>
+ <string name="Collar Back">
+ Kragen hinten
+ </string>
+ <string name="Collar Front">
+ Kragen vorne
+ </string>
+ <string name="Corner Down">
+ Nach unten
+ </string>
+ <string name="Corner Up">
+ Nach oben
+ </string>
+ <string name="Creased">
+ Schlupflid
+ </string>
+ <string name="Crooked Nose">
+ Krumme Nase
+ </string>
+ <string name="Cuff Flare">
+ Hosenaufschlag
+ </string>
+ <string name="Dark">
+ Dunkel
+ </string>
+ <string name="Dark Green">
+ Dunkelgrün
+ </string>
+ <string name="Darker">
+ Dunkler
+ </string>
+ <string name="Deep">
+ Tief
+ </string>
+ <string name="Default Heels">
+ Standardabsätze
+ </string>
+ <string name="Dense">
+ Dicht
+ </string>
+ <string name="Double Chin">
+ Doppelkinn
+ </string>
+ <string name="Downturned">
+ Nach unten
+ </string>
+ <string name="Duffle Bag">
+ Groß
+ </string>
+ <string name="Ear Angle">
+ Ohrenwinkel
+ </string>
+ <string name="Ear Size">
+ Ohrengröße
+ </string>
+ <string name="Ear Tips">
+ Ohrenspitzen
+ </string>
+ <string name="Egg Head">
+ Eierkopf
+ </string>
+ <string name="Eye Bags">
+ Augenränder
+ </string>
+ <string name="Eye Color">
+ Augenfarbe
+ </string>
+ <string name="Eye Depth">
+ Augentiefe
+ </string>
+ <string name="Eye Lightness">
+ Helligkeit
+ </string>
+ <string name="Eye Opening">
+ Öffnung
+ </string>
+ <string name="Eye Pop">
+ Symmetrie
+ </string>
+ <string name="Eye Size">
+ Augengröße
+ </string>
+ <string name="Eye Spacing">
+ Augenstand
+ </string>
+ <string name="Eyebrow Arc">
+ Brauenbogen
+ </string>
+ <string name="Eyebrow Density">
+ Brauendichte
+ </string>
+ <string name="Eyebrow Height">
+ Brauenhöhe
+ </string>
+ <string name="Eyebrow Points">
+ Brauenenden
+ </string>
+ <string name="Eyebrow Size">
+ Brauengröße
+ </string>
+ <string name="Eyelash Length">
+ Wimpernlänge
+ </string>
+ <string name="Eyeliner">
+ Eyeliner
+ </string>
+ <string name="Eyeliner Color">
+ Farbe des Eyeliners
+ </string>
+ <string name="Eyes Bugged">
+ Glubschaugen
+ </string>
+ <string name="Face Shear">
+ Gesichtsverzerrung
+ </string>
+ <string name="Facial Definition">
+ Gesichtskonturen
+ </string>
+ <string name="Far Set Eyes">
+ Weit auseinander
+ </string>
+ <string name="Fat Lips">
+ Volle Lippen
+ </string>
+ <string name="Female">
+ weiblich
+ </string>
+ <string name="Fingerless">
+ Ohne Finger
+ </string>
+ <string name="Fingers">
+ Finger
+ </string>
+ <string name="Flared Cuffs">
+ Ausgestellt
+ </string>
+ <string name="Flat">
+ Flach
+ </string>
+ <string name="Flat Butt">
+ Flacher Hintern
+ </string>
+ <string name="Flat Head">
+ Flacher Kopf
+ </string>
+ <string name="Flat Toe">
+ Flache Spitze
+ </string>
+ <string name="Foot Size">
+ Fußgröße
+ </string>
+ <string name="Forehead Angle">
+ Stirnwinkel
+ </string>
+ <string name="Forehead Heavy">
+ Stirn ausgeprägt
+ </string>
+ <string name="Freckles">
+ Sommersprossen
+ </string>
+ <string name="Front Fringe">
+ Fransen, vorne
+ </string>
+ <string name="Full Back">
+ Hinten volles Haar
+ </string>
+ <string name="Full Eyeliner">
+ Starker Eyeliner
+ </string>
+ <string name="Full Front">
+ Vorne volles Haar
+ </string>
+ <string name="Full Hair Sides">
+ Seitlich volles Haar
+ </string>
+ <string name="Full Sides">
+ Volle Seiten
+ </string>
+ <string name="Glossy">
+ Glänzend
+ </string>
+ <string name="Glove Fingers">
+ Handschuhfinger
+ </string>
+ <string name="Glove Length">
+ Handschuhlänge
+ </string>
+ <string name="Hair">
+ Haare
+ </string>
+ <string name="Hair Back">
+ Haare: Hinten
+ </string>
+ <string name="Hair Front">
+ Haare: Vorne
+ </string>
+ <string name="Hair Sides">
+ Haare: Seiten
+ </string>
+ <string name="Hair Sweep">
+ Haartolle
+ </string>
+ <string name="Hair Thickess">
+ Haardicke
+ </string>
+ <string name="Hair Thickness">
+ Haardicke
+ </string>
+ <string name="Hair Tilt">
+ Haarneigung
+ </string>
+ <string name="Hair Tilted Left">
+ Nach links
+ </string>
+ <string name="Hair Tilted Right">
+ Nach rechts
+ </string>
+ <string name="Hair Volume">
+ Haare: Volumen
+ </string>
+ <string name="Hand Size">
+ Handgröße
+ </string>
+ <string name="Handlebars">
+ Zwirbelbart
+ </string>
+ <string name="Head Length">
+ Kopflänge
+ </string>
+ <string name="Head Shape">
+ Kopfform
+ </string>
+ <string name="Head Size">
+ Kopfgröße
+ </string>
+ <string name="Head Stretch">
+ Kopfstreckung
+ </string>
+ <string name="Heel Height">
+ Absatzhöhe
+ </string>
+ <string name="Heel Shape">
+ Absatzform
+ </string>
+ <string name="Height">
+ Größe
+ </string>
+ <string name="High">
+ Hoch
+ </string>
+ <string name="High Heels">
+ Hohe Absätze
+ </string>
+ <string name="High Jaw">
+ Hoch
+ </string>
+ <string name="High Platforms">
+ Hohe Plattformsohlen
+ </string>
+ <string name="High and Tight">
+ Hoch und eng
+ </string>
+ <string name="Higher">
+ Höhere
+ </string>
+ <string name="Hip Length">
+ Länge der Hüfte
+ </string>
+ <string name="Hip Width">
+ Breite der Hüfte
+ </string>
+ <string name="In">
+ In
+ </string>
+ <string name="In Shdw Color">
+ Farbe Innenseite
+ </string>
+ <string name="In Shdw Opacity">
+ Deckkraft: innen
+ </string>
+ <string name="Inner Eye Corner">
+ Ecke: Nasenseite
+ </string>
+ <string name="Inner Eye Shadow">
+ Innenlid
+ </string>
+ <string name="Inner Shadow">
+ Innenlid
+ </string>
+ <string name="Jacket Length">
+ Jackenlänge
+ </string>
+ <string name="Jacket Wrinkles">
+ Jackenfalten
+ </string>
+ <string name="Jaw Angle">
+ Kinnansatz
+ </string>
+ <string name="Jaw Jut">
+ Kinnposition
+ </string>
+ <string name="Jaw Shape">
+ Kinnform
+ </string>
+ <string name="Join">
+ Zusammen
+ </string>
+ <string name="Jowls">
+ Hängebacken
+ </string>
+ <string name="Knee Angle">
+ Kniewinkel
+ </string>
+ <string name="Knock Kneed">
+ X-beinig
+ </string>
+ <string name="Large">
+ Groß
+ </string>
+ <string name="Large Hands">
+ Große Hände
+ </string>
+ <string name="Left Part">
+ Linksscheitel
+ </string>
+ <string name="Leg Length">
+ Beinlänge
+ </string>
+ <string name="Leg Muscles">
+ Beinmuskeln
+ </string>
+ <string name="Less">
+ Weniger
+ </string>
+ <string name="Less Body Fat">
+ Weniger Speck
+ </string>
+ <string name="Less Curtains">
+ Weniger
+ </string>
+ <string name="Less Freckles">
+ Weniger
+ </string>
+ <string name="Less Full">
+ Weniger
+ </string>
+ <string name="Less Gravity">
+ Weniger
+ </string>
+ <string name="Less Love">
+ Weniger
+ </string>
+ <string name="Less Muscles">
+ Weniger
+ </string>
+ <string name="Less Muscular">
+ Weniger
+ </string>
+ <string name="Less Rosy">
+ Weniger
+ </string>
+ <string name="Less Round">
+ Weniger
+ </string>
+ <string name="Less Saddle">
+ Weniger
+ </string>
+ <string name="Less Square">
+ Weniger
+ </string>
+ <string name="Less Volume">
+ Weniger
+ </string>
+ <string name="Less soul">
+ Weniger
+ </string>
+ <string name="Lighter">
+ Heller
+ </string>
+ <string name="Lip Cleft">
+ Amorbogen
+ </string>
+ <string name="Lip Cleft Depth">
+ Tiefe: Amorbogen
+ </string>
+ <string name="Lip Fullness">
+ Fülle
+ </string>
+ <string name="Lip Pinkness">
+ Pinkton
+ </string>
+ <string name="Lip Ratio">
+ Lippenproportionen
+ </string>
+ <string name="Lip Thickness">
+ Lippendicke
+ </string>
+ <string name="Lip Width">
+ Mundbreite
+ </string>
+ <string name="Lipgloss">
+ Lipgloss
+ </string>
+ <string name="Lipstick">
+ Lippenstift
+ </string>
+ <string name="Lipstick Color">
+ Farbe
+ </string>
+ <string name="Long">
+ Lang
+ </string>
+ <string name="Long Head">
+ Langer Kopf
+ </string>
+ <string name="Long Hips">
+ Lange Hüften
+ </string>
+ <string name="Long Legs">
+ Lange Beine
+ </string>
+ <string name="Long Neck">
+ Langer Hals
+ </string>
+ <string name="Long Pigtails">
+ Lange Zöpfe
+ </string>
+ <string name="Long Ponytail">
+ Langer Pferdeschwanz
+ </string>
+ <string name="Long Torso">
+ Langer Oberkörper
+ </string>
+ <string name="Long arms">
+ Lange Arme
+ </string>
+ <string name="Loose Pants">
+ Weite Hosen
+ </string>
+ <string name="Loose Shirt">
+ Weites Hemd
+ </string>
+ <string name="Loose Sleeves">
+ Weite Ärmel
+ </string>
+ <string name="Love Handles">
+ Fettpölsterchen
+ </string>
+ <string name="Low">
+ Niedrig
+ </string>
+ <string name="Low Heels">
+ Niedrig
+ </string>
+ <string name="Low Jaw">
+ Niedrig
+ </string>
+ <string name="Low Platforms">
+ Niedrig
+ </string>
+ <string name="Low and Loose">
+ Weit
+ </string>
+ <string name="Lower">
+ Absenken
+ </string>
+ <string name="Lower Bridge">
+ Brücke, Unterer Teil
+ </string>
+ <string name="Lower Cheeks">
+ Wangen, unterer Bereich
+ </string>
+ <string name="Male">
+ Männlich
+ </string>
+ <string name="Middle Part">
+ Mittelscheitel
+ </string>
+ <string name="More">
+ Mehr
+ </string>
+ <string name="More Blush">
+ Mehr
+ </string>
+ <string name="More Body Fat">
+ Mehr Speck
+ </string>
+ <string name="More Curtains">
+ Mehr
+ </string>
+ <string name="More Eyeshadow">
+ Mehr
+ </string>
+ <string name="More Freckles">
+ Mehr
+ </string>
+ <string name="More Full">
+ Voller
+ </string>
+ <string name="More Gravity">
+ Mehr
+ </string>
+ <string name="More Lipstick">
+ Mehr
+ </string>
+ <string name="More Love">
+ Mehr
+ </string>
+ <string name="More Lower Lip">
+ Größer
+ </string>
+ <string name="More Muscles">
+ Mehr
+ </string>
+ <string name="More Muscular">
+ Mehr
+ </string>
+ <string name="More Rosy">
+ Mehr
+ </string>
+ <string name="More Round">
+ Runder
+ </string>
+ <string name="More Saddle">
+ Mehr
+ </string>
+ <string name="More Sloped">
+ Flach
+ </string>
+ <string name="More Square">
+ Eckiger
+ </string>
+ <string name="More Upper Lip">
+ Mehr
+ </string>
+ <string name="More Vertical">
+ Steil
+ </string>
+ <string name="More Volume">
+ Mehr
+ </string>
+ <string name="More soul">
+ Mehr
+ </string>
+ <string name="Moustache">
+ Schnauzer
+ </string>
+ <string name="Mouth Corner">
+ Mundwinkel
+ </string>
+ <string name="Mouth Position">
+ Mundposition
+ </string>
+ <string name="Mowhawk">
+ Irokese
+ </string>
+ <string name="Muscular">
+ Muskulös
+ </string>
+ <string name="Mutton Chops">
+ Koteletten
+ </string>
+ <string name="Nail Polish">
+ Nagellack
+ </string>
+ <string name="Nail Polish Color">
+ Farbe
+ </string>
+ <string name="Narrow">
+ Schmal
+ </string>
+ <string name="Narrow Back">
+ Wenig
+ </string>
+ <string name="Narrow Front">
+ Wenig
+ </string>
+ <string name="Narrow Lips">
+ Schmale Lippen
+ </string>
+ <string name="Natural">
+ Natürlich
+ </string>
+ <string name="Neck Length">
+ Halslänge
+ </string>
+ <string name="Neck Thickness">
+ Halsdicke
+ </string>
+ <string name="No Blush">
+ Kein Rouge
+ </string>
+ <string name="No Eyeliner">
+ Kein Eyeliner
+ </string>
+ <string name="No Eyeshadow">
+ Kein Lidschatten
+ </string>
+ <string name="No Lipgloss">
+ Kein Lipgloss
+ </string>
+ <string name="No Lipstick">
+ Kein Lippenstift
+ </string>
+ <string name="No Part">
+ Kein Scheitel
+ </string>
+ <string name="No Polish">
+ Kein Nagellack
+ </string>
+ <string name="No Red">
+ Nicht rot
+ </string>
+ <string name="No Spikes">
+ Keine Stachel
+ </string>
+ <string name="No White">
+ Kein Weiß
+ </string>
+ <string name="No Wrinkles">
+ Keine Falten
+ </string>
+ <string name="Normal Lower">
+ Normal unten
+ </string>
+ <string name="Normal Upper">
+ Normal oben
+ </string>
+ <string name="Nose Left">
+ Links
+ </string>
+ <string name="Nose Right">
+ Rechts
+ </string>
+ <string name="Nose Size">
+ Größe
+ </string>
+ <string name="Nose Thickness">
+ Dicke
+ </string>
+ <string name="Nose Tip Angle">
+ Nasenspitze
+ </string>
+ <string name="Nose Tip Shape">
+ Nasenspitze
+ </string>
+ <string name="Nose Width">
+ Nasenbreite
+ </string>
+ <string name="Nostril Division">
+ Teilung
+ </string>
+ <string name="Nostril Width">
+ Größe
+ </string>
+ <string name="Opaque">
+ Deckend
+ </string>
+ <string name="Open">
+ Öffnen
+ </string>
+ <string name="Open Back">
+ Hinten offen
+ </string>
+ <string name="Open Front">
+ Vorne offen
+ </string>
+ <string name="Open Left">
+ Links offen
+ </string>
+ <string name="Open Right">
+ Rechts offen
+ </string>
+ <string name="Orange">
+ Orange
+ </string>
+ <string name="Out">
+ Aus
+ </string>
+ <string name="Out Shdw Color">
+ Farbe: Oben
+ </string>
+ <string name="Out Shdw Opacity">
+ Deckkraft: Oben
+ </string>
+ <string name="Outer Eye Corner">
+ Äußerer Augenwinkel
+ </string>
+ <string name="Outer Eye Shadow">
+ Lidschatten: Oben
+ </string>
+ <string name="Outer Shadow">
+ Lidschatten: Oben
+ </string>
+ <string name="Overbite">
+ Überbiss
+ </string>
+ <string name="Package">
+ Ausbeulung
+ </string>
+ <string name="Painted Nails">
+ Lackierte Nägel
+ </string>
+ <string name="Pale">
+ Blass
+ </string>
+ <string name="Pants Crotch">
+ Schritt
+ </string>
+ <string name="Pants Fit">
+ Passform
+ </string>
+ <string name="Pants Length">
+ Hosenlänge
+ </string>
+ <string name="Pants Waist">
+ Hüfte
+ </string>
+ <string name="Pants Wrinkles">
+ Falten
+ </string>
+ <string name="Part">
+ Scheitel
+ </string>
+ <string name="Part Bangs">
+ Pony scheiteln
+ </string>
+ <string name="Pectorals">
+ Brustmuskel
+ </string>
+ <string name="Pigment">
+ Pigmentierung
+ </string>
+ <string name="Pigtails">
+ Zöpfe
+ </string>
+ <string name="Pink">
+ Pink
+ </string>
+ <string name="Pinker">
+ Mehr Pink
+ </string>
+ <string name="Platform Height">
+ Höhe
+ </string>
+ <string name="Platform Width">
+ Breite
+ </string>
+ <string name="Pointy">
+ Spitz
+ </string>
+ <string name="Pointy Heels">
+ Pfennigabsätze
+ </string>
+ <string name="Ponytail">
+ Pferdeschwanz
+ </string>
+ <string name="Poofy Skirt">
+ Weit ausgestellt
+ </string>
+ <string name="Pop Left Eye">
+ Linkes Auge größer
+ </string>
+ <string name="Pop Right Eye">
+ Rechtes Auge größer
+ </string>
+ <string name="Puffy">
+ Geschwollen
+ </string>
+ <string name="Puffy Eyelids">
+ Geschwollene Lider
+ </string>
+ <string name="Rainbow Color">
+ Regenbogenfarben
+ </string>
+ <string name="Red Hair">
+ Rote Haare
+ </string>
+ <string name="Regular">
+ Normal
+ </string>
+ <string name="Right Part">
+ Scheitel rechts
+ </string>
+ <string name="Rosy Complexion">
+ Rosiger Teint
+ </string>
+ <string name="Round">
+ Rund
+ </string>
+ <string name="Ruddiness">
+ Röte
+ </string>
+ <string name="Ruddy">
+ Rötlich
+ </string>
+ <string name="Rumpled Hair">
+ Zerzauste Haare
+ </string>
+ <string name="Saddle Bags">
+ Hüftspeck
+ </string>
+ <string name="Scrawny Leg">
+ Dürres Bein
+ </string>
+ <string name="Separate">
+ Auseinander
+ </string>
+ <string name="Shallow">
+ Flach
+ </string>
+ <string name="Shear Back">
+ Hinterkopf rasiert
+ </string>
+ <string name="Shear Face">
+ Gesicht verzerren
+ </string>
+ <string name="Shear Front">
+ Vorne rasiert
+ </string>
+ <string name="Shear Left Up">
+ Links
+ </string>
+ <string name="Shear Right Up">
+ Rechts
+ </string>
+ <string name="Sheared Back">
+ Hinterkopf rasiert
+ </string>
+ <string name="Sheared Front">
+ Vorne rasiert
+ </string>
+ <string name="Shift Left">
+ Nach links
+ </string>
+ <string name="Shift Mouth">
+ Mund verschieben
+ </string>
+ <string name="Shift Right">
+ Nach rechts
+ </string>
+ <string name="Shirt Bottom">
+ Hemdlänge
+ </string>
+ <string name="Shirt Fit">
+ Passform
+ </string>
+ <string name="Shirt Wrinkles">
+ Falten
+ </string>
+ <string name="Shoe Height">
+ Schuhart
+ </string>
+ <string name="Short">
+ Klein
+ </string>
+ <string name="Short Arms">
+ Kurze Arme
+ </string>
+ <string name="Short Legs">
+ Kurze Beine
+ </string>
+ <string name="Short Neck">
+ Kurzer Hals
+ </string>
+ <string name="Short Pigtails">
+ Kurze Zöpfe
+ </string>
+ <string name="Short Ponytail">
+ Kurzer Pferdeschwanz
+ </string>
+ <string name="Short Sideburns">
+ Kurze Koteletten
+ </string>
+ <string name="Short Torso">
+ Kurzer Oberkörper
+ </string>
+ <string name="Short hips">
+ Kurze Hüften
+ </string>
+ <string name="Shoulders">
+ Schultern
+ </string>
+ <string name="Side Fringe">
+ Seitliche Fransen
+ </string>
+ <string name="Sideburns">
+ Koteletten
+ </string>
+ <string name="Sides Hair">
+ Seitliches Haar
+ </string>
+ <string name="Sides Hair Down">
+ Lang
+ </string>
+ <string name="Sides Hair Up">
+ Kurz
+ </string>
+ <string name="Skinny Neck">
+ Dünner Hals
+ </string>
+ <string name="Skirt Fit">
+ Passform
+ </string>
+ <string name="Skirt Length">
+ Rocklänge
+ </string>
+ <string name="Slanted Forehead">
+ Fliehende Stirn
+ </string>
+ <string name="Sleeve Length">
+ Ärmellänge
+ </string>
+ <string name="Sleeve Looseness">
+ Passform Ärmel
+ </string>
+ <string name="Slit Back">
+ Schlitz: Hinten
+ </string>
+ <string name="Slit Front">
+ Schlitz: Vorne
+ </string>
+ <string name="Slit Left">
+ Schlitz: Links
+ </string>
+ <string name="Slit Right">
+ Schlitz: Rechts
+ </string>
+ <string name="Small">
+ Klein
+ </string>
+ <string name="Small Hands">
+ Kleine Hände
+ </string>
+ <string name="Small Head">
+ Klein
+ </string>
+ <string name="Smooth">
+ Glätten
+ </string>
+ <string name="Smooth Hair">
+ Glattes Haar
+ </string>
+ <string name="Socks Length">
+ Strumpflänge
+ </string>
+ <string name="Soulpatch">
+ Unterlippenbart
+ </string>
+ <string name="Sparse">
+ Wenig
+ </string>
+ <string name="Spiked Hair">
+ Stachelhaare
+ </string>
+ <string name="Square">
+ Rechteck
+ </string>
+ <string name="Square Toe">
+ Eckig
+ </string>
+ <string name="Squash Head">
+ Gestaucht
+ </string>
+ <string name="Stretch Head">
+ Gestreckt
+ </string>
+ <string name="Sunken">
+ Eingefallen
+ </string>
+ <string name="Sunken Chest">
+ Trichterbrust
+ </string>
+ <string name="Sunken Eyes">
+ Eingesunkene Augen
+ </string>
+ <string name="Sweep Back">
+ Nach hinten
+ </string>
+ <string name="Sweep Forward">
+ Nach vorne
+ </string>
+ <string name="Tall">
+ Groß
+ </string>
+ <string name="Taper Back">
+ Ansatzbreite hinten
+ </string>
+ <string name="Taper Front">
+ Ansatzbreite vorne
+ </string>
+ <string name="Thick Heels">
+ Dicke Absätze
+ </string>
+ <string name="Thick Neck">
+ Dicker Hals
+ </string>
+ <string name="Thick Toe">
+ Dick
+ </string>
+ <string name="Thin">
+ Dünn
+ </string>
+ <string name="Thin Eyebrows">
+ Dünne Augenbrauen
+ </string>
+ <string name="Thin Lips">
+ Dünne Lippen
+ </string>
+ <string name="Thin Nose">
+ Dünne Nase
+ </string>
+ <string name="Tight Chin">
+ Straffes Kinn
+ </string>
+ <string name="Tight Cuffs">
+ Eng
+ </string>
+ <string name="Tight Pants">
+ Enge Hosen
+ </string>
+ <string name="Tight Shirt">
+ Enges Hemd
+ </string>
+ <string name="Tight Skirt">
+ Enger Rock
+ </string>
+ <string name="Tight Sleeves">
+ Enge Ärmel
+ </string>
+ <string name="Toe Shape">
+ Spitze
+ </string>
+ <string name="Toe Thickness">
+ Dicke
+ </string>
+ <string name="Torso Length">
+ Länge des Oberkörpers
+ </string>
+ <string name="Torso Muscles">
+ Muskeln
+ </string>
+ <string name="Torso Scrawny">
+ Dürr
+ </string>
+ <string name="Unattached">
+ Frei
+ </string>
+ <string name="Uncreased">
+ Straffes Lid
+ </string>
+ <string name="Underbite">
+ Unterbiss
+ </string>
+ <string name="Unnatural">
+ Unnatürlich
+ </string>
+ <string name="Upper Bridge">
+ Brücke, oberer Teil
+ </string>
+ <string name="Upper Cheeks">
+ Obere Wangen
+ </string>
+ <string name="Upper Chin Cleft">
+ Obere Kinnspalte
+ </string>
+ <string name="Upper Eyelid Fold">
+ Obere Lidfalte
+ </string>
+ <string name="Upturned">
+ Stupsnase
+ </string>
+ <string name="Very Red">
+ Sehr rot
+ </string>
+ <string name="Waist Height">
+ Bund
+ </string>
+ <string name="Well-Fed">
+ Gut genährt
+ </string>
+ <string name="White Hair">
+ Weiße Haare
+ </string>
+ <string name="Wide">
+ Breit
+ </string>
+ <string name="Wide Back">
+ Breit
+ </string>
+ <string name="Wide Front">
+ Breit
+ </string>
+ <string name="Wide Lips">
+ Breit
+ </string>
+ <string name="Wild">
+ Wild
+ </string>
+ <string name="Wrinkles">
+ Falten
+ </string>
+ <string name="LocationCtrlAddLandmarkTooltip">
+ Zu meinen Landmarken hinzufügen
+ </string>
+ <string name="LocationCtrlEditLandmarkTooltip">
+ Meine Landmarken bearbeiten
+ </string>
+ <string name="LocationCtrlInfoBtnTooltip">
+ Weitere Informationen über die aktuelle Position
+ </string>
+ <string name="LocationCtrlComboBtnTooltip">
+ Mein Reiseverlauf
+ </string>
+ <string name="LocationCtrlForSaleTooltip">
+ Dieses Land kaufen
+ </string>
+ <string name="LocationCtrlVoiceTooltip">
+ Voice hier nicht möglich
+ </string>
+ <string name="LocationCtrlFlyTooltip">
+ Fliegen ist unzulässig
+ </string>
+ <string name="LocationCtrlPushTooltip">
+ Kein Stoßen
+ </string>
+ <string name="LocationCtrlBuildTooltip">
+ Bauen/Fallen lassen von Objekten ist verboten
+ </string>
+ <string name="LocationCtrlScriptsTooltip">
+ Skripte sind unzulässig
+ </string>
+ <string name="LocationCtrlDamageTooltip">
+ Gesundheit
+ </string>
+ <string name="LocationCtrlAdultIconTooltip">
+ Adult-Region
+ </string>
+ <string name="LocationCtrlModerateIconTooltip">
+ Moderate Region
+ </string>
+ <string name="LocationCtrlGeneralIconTooltip">
+ Generelle Region
+ </string>
+ <string name="LocationCtrlSeeAVsTooltip">
+ Avatare sichtbar; Chat außerhalb dieser Parzelle gestattet
+ </string>
+ <string name="UpdaterWindowTitle">
+ [APP_NAME] Aktualisierung
+ </string>
+ <string name="UpdaterNowUpdating">
+ [APP_NAME] wird aktualisiert...
+ </string>
+ <string name="UpdaterNowInstalling">
+ [APP_NAME] wird installiert...
+ </string>
+ <string name="UpdaterUpdatingDescriptive">
+ Ihr [APP_NAME]-Viewer wird aktualisiert. Dies kann einen Moment dauern. Wir bitten um Ihr Verständnis.
+ </string>
+ <string name="UpdaterProgressBarTextWithEllipses">
+ Aktualisierung wird heruntergeladen...
+ </string>
+ <string name="UpdaterProgressBarText">
+ Aktualisierung wird heruntergeladen
+ </string>
+ <string name="UpdaterFailDownloadTitle">
+ Herunterladen ist fehlgeschlagen
+ </string>
+ <string name="UpdaterFailUpdateDescriptive">
+ Beim Aktualisieren von [APP_NAME] ist ein Fehler aufgetreten. Bitte laden Sie die aktuellste Version von www.secondlife.com herunter.
+ </string>
+ <string name="UpdaterFailInstallTitle">
+ Aktualisierung konnte nicht installiert werden
+ </string>
+ <string name="UpdaterFailStartTitle">
+ Viewer konnte nicht gestartet werden
+ </string>
+ <string name="ItemsComingInTooFastFrom">
+ [APP_NAME]: Zuviele Objekte auf einmal von [FROM_NAME]. Automaitsche Vorschau ist für [TIME] Sekunden nicht verfügbar.
+ </string>
+ <string name="ItemsComingInTooFast">
+ [APP_NAME]: Zuviele Objekte auf einmal. Automaitsche Vorschau ist für [TIME] Sekunden nicht verfügbar.
+ </string>
+ <string name="IM_logging_string">
+ -- Instant-Message-Protokoll aktiviert --
+ </string>
+ <string name="IM_typing_start_string">
+ [NAME] tippt...
+ </string>
+ <string name="Unnamed">
+ (Nicht benannt)
+ </string>
+ <string name="IM_moderated_chat_label">
+ (Moderiert: Stimmen in der Standardeinstellung stummgeschaltet)
+ </string>
+ <string name="IM_unavailable_text_label">
+ Für diese Verbindung ist kein Text-Chat verfügbar.
+ </string>
+ <string name="IM_muted_text_label">
+ Ihr Text-Chat wurde von einem Gruppenmoderator deaktiviert.
+ </string>
+ <string name="IM_default_text_label">
+ Für Instant Message hier klicken.
+ </string>
+ <string name="IM_to_label">
+ An
+ </string>
+ <string name="IM_moderator_label">
+ (Moderator)
+ </string>
+ <string name="Saved_message">
+ (Gespeichert am [LONG_TIMESTAMP])
+ </string>
+ <string name="IM_unblock_only_groups_friends">
+ Wenn Sie diese Meldung sehen, müssen Sie unter „Einstellungen“ &gt; „Privatsphäre“ die Option „Nur IMs und Anrufe von Freunden oder Gruppen durchstellen“ deaktivieren.
+ </string>
+ <string name="answered_call">
+ Ihr Anruf wurde entgegengenommen
+ </string>
+ <string name="you_started_call">
+ Sie haben einen Voice-Anruf begonnen
+ </string>
+ <string name="you_joined_call">
+ Sie sind dem Gespräch beigetreten
+ </string>
+ <string name="name_started_call">
+ [NAME] hat einen Voice-Anruf begonnen
+ </string>
+ <string name="ringing-im">
+ Verbindung wird hergestellt...
+ </string>
+ <string name="connected-im">
+ Verbunden. Klicken Sie auf Anruf beenden, um die Verbindung zu trennen
+ </string>
+ <string name="hang_up-im">
+ Anruf wurde beendet
+ </string>
+ <string name="answering-im">
+ Wird verbunden...
+ </string>
+ <string name="conference-title">
+ Ad-hoc-Konferenz
+ </string>
+ <string name="conference-title-incoming">
+ Konferenz mit [AGENT_NAME]
+ </string>
+ <string name="inventory_item_offered-im">
+ Inventarobjekt angeboten
+ </string>
+ <string name="share_alert">
+ Objekte aus dem Inventar hier her ziehen
+ </string>
+ <string name="no_session_message">
+ (IM-Session nicht vorhanden)
+ </string>
+ <string name="only_user_message">
+ Sie sind der einzige Benutzer in dieser Sitzung.
+ </string>
+ <string name="offline_message">
+ [NAME] ist offline.
+ </string>
+ <string name="invite_message">
+ Klicken Sie auf [BUTTON NAME], um eine Verbindung zu diesem Voice-Chat herzustellen.
+ </string>
+ <string name="muted_message">
+ Sie haben diesen Einwohner ignoriert. Wenn Sie eine Nachricht senden, wird dieser freigeschaltet.
+ </string>
+ <string name="generic">
+ Fehler bei Anfrage, bitte versuchen Sie es später.
+ </string>
+ <string name="generic_request_error">
+ Fehler bei Anfrage, bitte versuchen Sie es später.
+ </string>
+ <string name="insufficient_perms_error">
+ Sie sind dazu nicht berechtigt.
+ </string>
+ <string name="session_does_not_exist_error">
+ Die Sitzung ist abgelaufen
+ </string>
+ <string name="no_ability_error">
+ Sie besitzen diese Fähigkeit nicht.
+ </string>
+ <string name="no_ability">
+ Sie besitzen diese Fähigkeit nicht.
+ </string>
+ <string name="not_a_mod_error">
+ Sie sind kein Sitzungsmoderator.
+ </string>
+ <string name="muted">
+ Ein Gruppenmoderator hat Ihren Text-Chat deaktiviert.
+ </string>
+ <string name="muted_error">
+ Ein Gruppenmoderator hat Ihren Text-Chat deaktiviert.
+ </string>
+ <string name="add_session_event">
+ Es konnten keine Benutzer zur Chat-Sitzung mit [RECIPIENT] hinzugefügt werden.
+ </string>
+ <string name="message">
+ Ihre Nachricht konnte nicht an die Chat-Sitzung mit [RECIPIENT] gesendet werden.
+ </string>
+ <string name="message_session_event">
+ Ihre Nachricht konnte nicht an die Chat-Sitzung mit [RECIPIENT] gesendet werden.
+ </string>
+ <string name="mute">
+ Fehler während Moderation.
+ </string>
+ <string name="removed">
+ Sie wurden von der Gruppe ausgeschlossen.
+ </string>
+ <string name="removed_from_group">
+ Sie wurden von der Gruppe ausgeschlossen.
+ </string>
+ <string name="close_on_no_ability">
+ Sie haben nicht mehr die Berechtigung an der Chat-Sitzung teilzunehmen.
+ </string>
+ <string name="unread_chat_single">
+ [SOURCES] hat etwas Neues gesagt
+ </string>
+ <string name="unread_chat_multiple">
+ [SOURCES] haben etwas Neues gesagt
+ </string>
+ <string name="session_initialization_timed_out_error">
+ Die Initialisierung der Sitzung ist fehlgeschlagen
+ </string>
+ <string name="Home position set.">
+ Position für Zuhause festgelegt.
+ </string>
+ <string name="voice_morphing_url">
+ http://secondlife.com/landing/voicemorphing
+ </string>
+ <string name="paid_you_ldollars">
+ [NAME] hat Ihnen [REASON] [AMOUNT] L$ bezahlt.
+ </string>
+ <string name="paid_you_ldollars_no_reason">
+ [NAME] hat Ihnen [AMOUNT] L$ bezahlt.
+ </string>
+ <string name="you_paid_ldollars">
+ Sie haben [REASON] [AMOUNT] L$ an [NAME] bezahlt.
+ </string>
+ <string name="you_paid_ldollars_no_info">
+ Sie haben [AMOUNT] L$ bezahlt.
+ </string>
+ <string name="you_paid_ldollars_no_reason">
+ Sie haben [AMOUNT] L$ an [NAME] bezahlt.
+ </string>
+ <string name="you_paid_ldollars_no_name">
+ Sie haben [REASON] [AMOUNT] L$ bezahlt.
+ </string>
+ <string name="you_paid_failure_ldollars">
+ Sie haben [NAME] [AMOUNT] L$ [REASON] nicht bezahlt.
+ </string>
+ <string name="you_paid_failure_ldollars_no_info">
+ Sie haben [AMOUNT] L$ nicht bezahlt.
+ </string>
+ <string name="you_paid_failure_ldollars_no_reason">
+ Sie haben [NAME] [AMOUNT] L$ nicht bezahlt.
+ </string>
+ <string name="you_paid_failure_ldollars_no_name">
+ Sie haben [AMOUNT] L$ [REASON] nicht bezahlt.
+ </string>
+ <string name="for item">
+ für [ITEM]
+ </string>
+ <string name="for a parcel of land">
+ für eine Landparzelle
+ </string>
+ <string name="for a land access pass">
+ für einen Pass
+ </string>
+ <string name="for deeding land">
+ für die Landübertragung
+ </string>
+ <string name="to create a group">
+ für die Gründung einer Gruppe
+ </string>
+ <string name="to join a group">
+ für den Beitritt zur Gruppe
+ </string>
+ <string name="to upload">
+ fürs Hochladen
+ </string>
+ <string name="to publish a classified ad">
+ um eine Anzeige aufzugeben
+ </string>
+ <string name="giving">
+ [AMOUNT] L$ werden bezahlt
+ </string>
+ <string name="uploading_costs">
+ Kosten für Hochladen [AMOUNT] L$
+ </string>
+ <string name="this_costs">
+ Kosten: [AMOUNT] L$
+ </string>
+ <string name="buying_selected_land">
+ Ausgewähltes Land wird für [AMOUNT] L$ gekauft.
+ </string>
+ <string name="this_object_costs">
+ Dieses Objekt kostet [AMOUNT] L$
+ </string>
+ <string name="group_role_everyone">
+ Jeder
+ </string>
+ <string name="group_role_officers">
+ Offiziere
+ </string>
+ <string name="group_role_owners">
+ Eigentümer
+ </string>
+ <string name="group_member_status_online">
+ Online
+ </string>
+ <string name="uploading_abuse_report">
+ Hochladen...
+
+Missbrauchsbericht
+ </string>
+ <string name="New Shape">
+ Neue Form/Gestalt
+ </string>
+ <string name="New Skin">
+ Neue Haut
+ </string>
+ <string name="New Hair">
+ Neues Haar
+ </string>
+ <string name="New Eyes">
+ Neue Augen
+ </string>
+ <string name="New Shirt">
+ Neues Hemd
+ </string>
+ <string name="New Pants">
+ Neue Hose
+ </string>
+ <string name="New Shoes">
+ Neue Schuhe
+ </string>
+ <string name="New Socks">
+ Neue Socken
+ </string>
+ <string name="New Jacket">
+ Neue Jacke
+ </string>
+ <string name="New Gloves">
+ Neue Handschuhe
+ </string>
+ <string name="New Undershirt">
+ Neues Unterhemd
+ </string>
+ <string name="New Underpants">
+ Neue Unterhose
+ </string>
+ <string name="New Skirt">
+ Neuer Rock
+ </string>
+ <string name="New Alpha">
+ Neues Alpha
+ </string>
+ <string name="New Tattoo">
+ Neue Tätowierung
+ </string>
+ <string name="New Physics">
+ Neue Physik
+ </string>
+ <string name="Invalid Wearable">
+ Ungültiges Objekt
+ </string>
+ <string name="New Gesture">
+ Neue Geste
+ </string>
+ <string name="New Script">
+ Neues Skript
+ </string>
+ <string name="New Note">
+ Neue Notiz
+ </string>
+ <string name="New Folder">
+ Neuer Ordner
+ </string>
+ <string name="Contents">
+ Inhalt
+ </string>
+ <string name="Gesture">
+ Gesten
+ </string>
+ <string name="Male Gestures">
+ Männliche Gesten
+ </string>
+ <string name="Female Gestures">
+ Weibliche Gesten
+ </string>
+ <string name="Other Gestures">
+ Andere Gesten
+ </string>
+ <string name="Speech Gestures">
+ Sprachgesten
+ </string>
+ <string name="Common Gestures">
+ Häufig verwendete Gesten
+ </string>
+ <string name="Male - Excuse me">
+ Männlich - Excuse me
+ </string>
+ <string name="Male - Get lost">
+ Männlich - Get lost
+ </string>
+ <string name="Male - Blow kiss">
+ Männlich - Kusshand
+ </string>
+ <string name="Male - Boo">
+ Männlich - Buh
+ </string>
+ <string name="Male - Bored">
+ Männlich - Gelangweilt
+ </string>
+ <string name="Male - Hey">
+ Männlich - Hey
+ </string>
+ <string name="Male - Laugh">
+ Männlich - Lachen
+ </string>
+ <string name="Male - Repulsed">
+ Männlich - Angewidert
+ </string>
+ <string name="Male - Shrug">
+ Männlich - Achselzucken
+ </string>
+ <string name="Male - Stick tougue out">
+ Männlich - Zunge herausstrecken
+ </string>
+ <string name="Male - Wow">
+ Männlich - Wow
+ </string>
+ <string name="Female - Chuckle">
+ Weiblich - Kichern
+ </string>
+ <string name="Female - Cry">
+ Weiblich - Weinen
+ </string>
+ <string name="Female - Embarrassed">
+ Weiblich - Verlegen
+ </string>
+ <string name="Female - Excuse me">
+ Weiblich - Räuspern
+ </string>
+ <string name="Female - Get lost">
+ Weiblich - Get lost
+ </string>
+ <string name="Female - Blow kiss">
+ Weiblich - Kusshand
+ </string>
+ <string name="Female - Boo">
+ Weiblich - Buh
+ </string>
+ <string name="Female - Bored">
+ Weiblich - Gelangweilt
+ </string>
+ <string name="Female - Hey">
+ Weiblich - Hey
+ </string>
+ <string name="Female - Hey baby">
+ Weiblich - Hey Süße(r)
+ </string>
+ <string name="Female - Laugh">
+ Weiblich - Lachen
+ </string>
+ <string name="Female - Looking good">
+ Weiblich - Looking good
+ </string>
+ <string name="Female - Over here">
+ Weiblich - Over here
+ </string>
+ <string name="Female - Please">
+ Weiblich - Please
+ </string>
+ <string name="Female - Repulsed">
+ Weiblich - Angewidert
+ </string>
+ <string name="Female - Shrug">
+ Weiblich - Achselzucken
+ </string>
+ <string name="Female - Stick tougue out">
+ Weiblich - Zunge herausstrecken
+ </string>
+ <string name="Female - Wow">
+ Weiblich - Wow
+ </string>
+ <string name="/bow">
+ /verbeugen
+ </string>
+ <string name="/clap">
+ /klatschen
+ </string>
+ <string name="/count">
+ /zählen
+ </string>
+ <string name="/extinguish">
+ /löschen
+ </string>
+ <string name="/kmb">
+ /lmaa
+ </string>
+ <string name="/muscle">
+ /Muskel
+ </string>
+ <string name="/no">
+ /nein
+ </string>
+ <string name="/no!">
+ /nein!
+ </string>
+ <string name="/paper">
+ /Papier
+ </string>
+ <string name="/pointme">
+ /auf mich zeigen
+ </string>
+ <string name="/pointyou">
+ /auf dich zeigen
+ </string>
+ <string name="/rock">
+ /Stein
+ </string>
+ <string name="/scissor">
+ /Schere
+ </string>
+ <string name="/smoke">
+ /rauchen
+ </string>
+ <string name="/stretch">
+ /dehnen
+ </string>
+ <string name="/whistle">
+ /pfeifen
+ </string>
+ <string name="/yes">
+ /ja
+ </string>
+ <string name="/yes!">
+ /ja!
+ </string>
+ <string name="afk">
+ afk
+ </string>
+ <string name="dance1">
+ Tanzen1
+ </string>
+ <string name="dance2">
+ Tanzen2
+ </string>
+ <string name="dance3">
+ Tanzen3
+ </string>
+ <string name="dance4">
+ Tanzen4
+ </string>
+ <string name="dance5">
+ Tanzen5
+ </string>
+ <string name="dance6">
+ Tanzen6
+ </string>
+ <string name="dance7">
+ Tanzen7
+ </string>
+ <string name="dance8">
+ Tanzen8
+ </string>
+ <string name="AvatarBirthDateFormat">
+ [mthnum,datetime,slt]/[day,datetime,slt]/[year,datetime,slt]
+ </string>
+ <string name="DefaultMimeType">
+ Keine/Keiner
+ </string>
+ <string name="texture_load_dimensions_error">
+ Bilder, die größer sind als [WIDTH]*[HEIGHT] können nicht geladen werden
+ </string>
+ <string name="words_separator" value=","/>
+ <string name="server_is_down">
+ Trotz all unserer Bemühungen ist ein unerwarteter Fehler aufgetreten.
+
+ Bitte überprüfen Sie status.secondlifegrid.net, um herauszufinden, ob ein Problem besteht.
+ Falls Sie weiterhin Problem haben, überprüfen Sie bitte Ihre Netzwerk- und Firewalleinstellungen.
+ </string>
+ <string name="dateTimeWeekdaysNames">
+ Sonntag:Montag:Dienstag:Mittwoch:Donnerstag:Freitag:Samstag
+ </string>
+ <string name="dateTimeWeekdaysShortNames">
+ So:Mo:Di:Mi:Do:Fr:Sa
+ </string>
+ <string name="dateTimeMonthNames">
+ Januar:Februar:März:April:Mai:Juni:Juli:August:September:Oktober:November:Dezember
+ </string>
+ <string name="dateTimeMonthShortNames">
+ Jan:Feb:Mär:Apr:Mai:Jun:Jul:Aug:Sep:Okt:Nov:Dez
+ </string>
+ <string name="dateTimeDayFormat">
+ [MDAY]
+ </string>
+ <string name="dateTimeAM">
+ Uhr
+ </string>
+ <string name="dateTimePM">
+ Uhr
+ </string>
+ <string name="LocalEstimateUSD">
+ [AMOUNT] US$
+ </string>
+ <string name="Membership">
+ Mitgliedschaft
+ </string>
+ <string name="Roles">
+ Rollen
+ </string>
+ <string name="Group Identity">
+ Gruppenidentität
+ </string>
+ <string name="Parcel Management">
+ Parzellenverwaltung
+ </string>
+ <string name="Parcel Identity">
+ Parzellenidentität
+ </string>
+ <string name="Parcel Settings">
+ Parzelleneinstellungen
+ </string>
+ <string name="Parcel Powers">
+ Parzellenfähigkeiten
+ </string>
+ <string name="Parcel Access">
+ Parzellenzugang
+ </string>
+ <string name="Parcel Content">
+ Parzelleninhalt
+ </string>
+ <string name="Object Management">
+ Objektmanagement
+ </string>
+ <string name="Accounting">
+ Kontoführung
+ </string>
+ <string name="Notices">
+ Mitteilungen
+ </string>
+ <string name="Chat" value=" Chat:">
+ Chat
+ </string>
+ <string name="DeleteItems">
+ Ausgewählte Objekte löschen?
+ </string>
+ <string name="DeleteItem">
+ Ausgewähltes Objekt löschen?
+ </string>
+ <string name="EmptyOutfitText">
+ Keine Objekte in diesem Outfit
+ </string>
+ <string name="ExternalEditorNotSet">
+ Wählen Sie über die Einstellung „ExternalEditor“ einen Editor aus
+ </string>
+ <string name="ExternalEditorNotFound">
+ Angegebener externer Editor nicht gefunden.
+Setzen Sie den Editorpfad in Anführungszeichen
+(z. B. &quot;/pfad/editor&quot; &quot;%s&quot;).
+ </string>
+ <string name="ExternalEditorCommandParseError">
+ Fehler beim Parsen des externen Editorbefehls.
+ </string>
+ <string name="ExternalEditorFailedToRun">
+ Externer Editor konnte nicht ausgeführt werden.
+ </string>
+ <string name="TranslationFailed">
+ Übersetzung fehlgeschlagen: [REASON]
+ </string>
+ <string name="TranslationResponseParseError">
+ Fehler beim Parsen der Übersetzungsantwort.
+ </string>
+ <string name="Esc">
+ Esc
+ </string>
+ <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">
+ Zuhause
+ </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">
+ Addieren
+ </string>
+ <string name="Subtract">
+ Subtrahieren
+ </string>
+ <string name="Multiply">
+ Multiplizieren
+ </string>
+ <string name="Divide">
+ Dividieren
+ </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">
+ Partikel-Beacons werden angezeigt (blau)
+ </string>
+ <string name="BeaconPhysical">
+ Beacons für physische Objekte werden angezeigt (grün)
+ </string>
+ <string name="BeaconScripted">
+ Beacons für Skriptobjekte werden angezeigt (rot)
+ </string>
+ <string name="BeaconScriptedTouch">
+ Beacons für Skriptobjekte mit Berührungsfunktion werden angezeigt (rot)
+ </string>
+ <string name="BeaconSound">
+ Sound-Beacons werden angezeigt (gelb)
+ </string>
+ <string name="BeaconMedia">
+ Medien-Beacons werden angezeigt (weiß)
+ </string>
+ <string name="ParticleHiding">
+ Partikel werden ausgeblendet
+ </string>
+ <string name="Command_AboutLand_Label">
+ Landinformationen
+ </string>
+ <string name="Command_Appearance_Label">
+ Aussehen
+ </string>
+ <string name="Command_Avatar_Label">
+ Avatar
+ </string>
+ <string name="Command_Build_Label">
+ Bauen
+ </string>
+ <string name="Command_Chat_Label">
+ Chat
+ </string>
+ <string name="Command_Compass_Label">
+ Kompass
+ </string>
+ <string name="Command_Destinations_Label">
+ Ziele
+ </string>
+ <string name="Command_Gestures_Label">
+ Gesten
+ </string>
+ <string name="Command_HowTo_Label">
+ Infos
+ </string>
+ <string name="Command_Inventory_Label">
+ Inventar
+ </string>
+ <string name="Command_Map_Label">
+ Karte
+ </string>
+ <string name="Command_Marketplace_Label">
+ Marktplatz
+ </string>
+ <string name="Command_MiniMap_Label">
+ Minikarte
+ </string>
+ <string name="Command_Move_Label">
+ Gehen / Rennen / Fliegen
+ </string>
+ <string name="Command_Outbox_Label">
+ Händler-Outbox
+ </string>
+ <string name="Command_People_Label">
+ Leute
+ </string>
+ <string name="Command_Picks_Label">
+ Auswahlen
+ </string>
+ <string name="Command_Places_Label">
+ Orte
+ </string>
+ <string name="Command_Preferences_Label">
+ Einstellungen
+ </string>
+ <string name="Command_Profile_Label">
+ Profil
+ </string>
+ <string name="Command_Search_Label">
+ Suchen
+ </string>
+ <string name="Command_Snapshot_Label">
+ Foto
+ </string>
+ <string name="Command_Speak_Label">
+ Sprechen
+ </string>
+ <string name="Command_View_Label">
+ Kamerasteuerungen
+ </string>
+ <string name="Command_Voice_Label">
+ Voice-Einstellungen
+ </string>
+ <string name="Command_AboutLand_Tooltip">
+ Informationen zu dem von Ihnen besuchten Land
+ </string>
+ <string name="Command_Appearance_Tooltip">
+ Avatar ändern
+ </string>
+ <string name="Command_Avatar_Tooltip">
+ Kompletten Avatar auswählen
+ </string>
+ <string name="Command_Build_Tooltip">
+ Objekte bauen und Terrain umformen
+ </string>
+ <string name="Command_Chat_Tooltip">
+ Mit Leuten in der Nähe chatten
+ </string>
+ <string name="Command_Compass_Tooltip">
+ Kompass
+ </string>
+ <string name="Command_Destinations_Tooltip">
+ Ziele von Interesse
+ </string>
+ <string name="Command_Gestures_Tooltip">
+ Gesten für Ihren Avatar
+ </string>
+ <string name="Command_HowTo_Tooltip">
+ Wie führe ich gängige Aufgaben aus?
+ </string>
+ <string name="Command_Inventory_Tooltip">
+ Ihr Eigentum anzeigen und benutzen
+ </string>
+ <string name="Command_Map_Tooltip">
+ Weltkarte
+ </string>
+ <string name="Command_Marketplace_Tooltip">
+ Einkaufen gehen
+ </string>
+ <string name="Command_MiniMap_Tooltip">
+ Leute in der Nähe anzeigen
+ </string>
+ <string name="Command_Move_Tooltip">
+ Ihren Avatar bewegen
+ </string>
+ <string name="Command_Outbox_Tooltip">
+ Artikel zum Verkauf in den Marktplatz übertragen
+ </string>
+ <string name="Command_People_Tooltip">
+ Freunde, Gruppen und Leute in der Nähe
+ </string>
+ <string name="Command_Picks_Tooltip">
+ Orte, die in Ihrem Profil als Favoriten angezeigt werden sollen
+ </string>
+ <string name="Command_Places_Tooltip">
+ Von Ihnen gespeicherte Orte
+ </string>
+ <string name="Command_Preferences_Tooltip">
+ Einstellungen
+ </string>
+ <string name="Command_Profile_Tooltip">
+ Ihr Profil bearbeiten oder anzeigen
+ </string>
+ <string name="Command_Search_Tooltip">
+ Orte, Veranstaltungen, Leute finden
+ </string>
+ <string name="Command_Snapshot_Tooltip">
+ Foto aufnehmen
+ </string>
+ <string name="Command_Speak_Tooltip">
+ Über Ihr Mikrofon mit Leuten in der Nähe sprechen
+ </string>
+ <string name="Command_View_Tooltip">
+ Kamerawinkel ändern
+ </string>
+ <string name="Command_Voice_Tooltip">
+ Lautstärkeregler für Anrufe und Leute in Ihrer Nähe in SL
+ </string>
+ <string name="Toolbar_Bottom_Tooltip">
+ gegenwärtig in der unteren Symbolleiste
+ </string>
+ <string name="Toolbar_Left_Tooltip">
+ gegenwärtig in der linken Symbolleiste
+ </string>
+ <string name="Toolbar_Right_Tooltip">
+ gegenwärtig in der rechten Symbolleiste
+ </string>
+ <string name="Retain%">
+ % zurückbehalten
+ </string>
+ <string name="Detail">
+ Details
+ </string>
+ <string name="Better Detail">
+ Bessere Details
+ </string>
+ <string name="Surface">
+ Oberfläche
+ </string>
+ <string name="Solid">
+ Fest
+ </string>
+ <string name="Wrap">
+ Wickeln
+ </string>
+ <string name="Preview">
+ Vorschau
+ </string>
+ <string name="Normal">
+ Normal
+ </string>
+ <string name="snapshot_quality_very_low">
+ Sehr niedrig
+ </string>
+ <string name="snapshot_quality_low">
+ Niedrig
+ </string>
+ <string name="snapshot_quality_medium">
+ Mittel
+ </string>
+ <string name="snapshot_quality_high">
+ Hoch
+ </string>
+ <string name="snapshot_quality_very_high">
+ Sehr hoch
+ </string>
+</strings>
diff --git a/indra/newview/skins/steam/xui/en/strings.xml b/indra/newview/skins/steam/xui/en/strings.xml
new file mode 100644
index 0000000000..c29b80e21c
--- /dev/null
+++ b/indra/newview/skins/steam/xui/en/strings.xml
@@ -0,0 +1,3761 @@
+<?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>
+
+ <!-- Default Args - these arguments will be replaced in all 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>
+
+ <!-- starting up -->
+ <string name="StartupDetectingHardware">Detecting hardware...</string>
+ <string name="StartupLoading">Loading [APP_NAME]...</string>
+ <string name="StartupClearingCache">Clearing cache...</string>
+ <string name="StartupInitializingTextureCache">Initializing texture cache...</string>
+ <string name="StartupInitializingVFS">Initializing VFS...</string>
+ <string name="StartupRequireDriverUpdate">Graphics initialization failed. Please update your graphics driver!</string>
+
+ <!-- progress -->
+ <string name="ProgressRestoring">Restoring...</string>
+ <string name="ProgressChangingResolution">Changing resolution...</string>
+
+ <!-- Legacy strings, almost never used -->
+ <string name="Fullbright">Fullbright (legacy)</string> <!-- used in the Build > materials dropdown-->
+
+ <!-- Login -->
+ <string name="LoginInProgress">Logging in. [APP_NAME] may appear frozen. Please wait.</string>
+ <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">Loading world...</string>
+ <string name="LoginInitializingBrowser">Initializing embedded web browser...</string>
+ <string name="LoginInitializingMultimedia">Initializing multimedia...</string>
+ <string name="LoginInitializingFonts">Loading fonts...</string>
+ <string name="LoginVerifyingCache">Verifying cache files (can take 60-90 seconds)...</string>
+ <string name="LoginProcessingResponse">Processing response...</string>
+ <string name="LoginInitializingWorld">Initializing world...</string>
+ <string name="LoginDecodingImages">Decoding images...</string>
+ <string name="LoginInitializingQuicktime">Initializing QuickTime...</string>
+ <string name="LoginQuicktimeNotFound">QuickTime not found - unable to initialize.</string>
+ <string name="LoginQuicktimeOK">QuickTime initialized successfully.</string>
+ <string name="LoginRequestSeedCapGrant">Requesting region capabilities...</string>
+ <string name="LoginRetrySeedCapGrant">Requesting region capabilities, attempt [NUMBER]...</string>
+ <string name="LoginWaitingForRegionHandshake">Waiting for region handshake...</string>
+ <string name="LoginConnectingToRegion">Connecting to region...</string>
+ <string name="LoginDownloadingClothing">Downloading clothing...</string>
+ <string name="InvalidCertificate">The server returned an invalid or corrupt certificate. Please contact the Grid administrator.</string>
+ <string name="CertInvalidHostname">An invalid hostname was used to access the server, please check your SLURL or Grid hostname.</string>
+ <string name="CertExpired">The certificate returned by the Grid appears to be expired. Please check your system clock, or contact your Grid administrator.</string>
+ <string name="CertKeyUsage">The certificate returned by the server could not be used for SSL. Please contact your Grid administrator.</string>
+ <string name="CertBasicConstraints">Too many certificates were in the servers Certificate chain. Please contact your Grid administrator.</string>
+ <string name="CertInvalidSignature">The certificate signature returned by the Grid server could not be verified. Please contact your Grid administrator.</string>
+
+ <string name="LoginFailedNoNetwork">Network error: Could not establish connection, please check your network connection.</string>
+ <string name="LoginFailed">Login failed.</string>
+ <string name="Quit">Quit</string>
+ <string name="create_account_url">http://join.secondlife.com/?sourceid=1206_steam</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>
+ <string name="LoggingOut">Logging out...</string>
+ <string name="ShuttingDown">Shutting down...</string>
+ <string name="YouHaveBeenDisconnected">You have been disconnected from the region you were in.</string>
+ <string name="SentToInvalidRegion">You were sent to an invalid region.</string>
+ <string name="TestingDisconnect">Testing viewer disconnect</string>
+
+ <!-- Tooltip -->
+ <string name="TooltipPerson">Person</string><!-- Object under mouse pointer is an avatar -->
+ <string name="TooltipNoName">(no name)</string> <!-- No name on an object -->
+ <string name="TooltipOwner">Owner:</string> <!-- Owner name follows -->
+ <string name="TooltipPublic">Public</string> <!-- Public permissions on an object -->
+ <string name="TooltipIsGroup">(Group)</string> <!-- The name before this text is that of a group -->
+ <string name="TooltipForSaleL$">For Sale: L$[AMOUNT]</string> <!-- L$ version -->
+ <string name="TooltipFlagGroupBuild">Group Build</string>
+ <string name="TooltipFlagNoBuild">No Build</string>
+ <string name="TooltipFlagNoEdit">Group Build</string>
+ <string name="TooltipFlagNotSafe">Not Safe</string><!-- damage area -->
+ <string name="TooltipFlagNoFly">No Fly</string>
+ <string name="TooltipFlagGroupScripts">Group Scripts</string>
+ <string name="TooltipFlagNoScripts">No Scripts</string>
+ <string name="TooltipLand">Land:</string>
+ <string name="TooltipMustSingleDrop">Only a single item can be dragged here</string>
+ <string name="TooltipPrice" value="L$[AMOUNT]: "/>
+
+ <string name="TooltipOutboxDragToWorld">You can not rez items in your merchant outbox</string>
+ <string name="TooltipOutboxNoTransfer">One or more of these objects cannot be sold or transferred.</string>
+ <string name="TooltipOutboxNotInInventory">Your merchant outbox can only accept items directly from your inventory</string>
+ <string name="TooltipOutboxWorn">You can not put items you are wearing into your merchant outbox</string>
+ <string name="TooltipOutboxCallingCard">You can not put calling cards into your merchant outbox</string>
+ <string name="TooltipOutboxFolderLevels">Depth of nested folders exceeds 3</string>
+ <string name="TooltipOutboxTooManyFolders">Subfolder count in top-level folder exceeds 20</string>
+ <string name="TooltipOutboxTooManyObjects">Item count in top-level folder exceeds 200</string>
+
+ <string name="TooltipDragOntoOwnChild">You can't move a folder into its child</string>
+ <string name="TooltipDragOntoSelf">You can't move a folder into itself</string>
+
+ <!-- tooltips for Urls -->
+ <string name="TooltipHttpUrl">Click to view this web page</string>
+ <string name="TooltipSLURL">Click to view this location's information</string>
+ <string name="TooltipAgentUrl">Click to view this Resident'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">Click to IM this Resident</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's description</string>
+ <string name="TooltipEventUrl">Click to view this event's description</string>
+ <string name="TooltipClassifiedUrl">Click to view this classified</string>
+ <string name="TooltipParcelUrl">Click to view this parcel's description</string>
+ <string name="TooltipTeleportUrl">Click to teleport to this location</string>
+ <string name="TooltipObjectIMUrl">Click to view this object's description</string>
+ <string name="TooltipMapUrl">Click to view this location on a map</string>
+ <string name="TooltipSLAPP">Click to run the secondlife:// command</string>
+ <string name="CurrentURL" value=" CurrentURL: [CurrentURL]" />
+
+ <!-- text for SLURL labels -->
+ <string name="SLurlLabelTeleport">Teleport to</string>
+ <string name="SLurlLabelShowOnMap">Show Map for</string>
+
+ <!-- label strings for secondlife:///app/agent SLapps -->
+ <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">Friend Request </string>
+
+ <!-- ButtonToolTips, llfloater.cpp -->
+ <string name="BUTTON_CLOSE_DARWIN">Close (&#8984;W)</string>
+ <string name="BUTTON_CLOSE_WIN">Close (Ctrl+W)</string>
+ <string name="BUTTON_CLOSE_CHROME">Close</string>
+ <string name="BUTTON_RESTORE">Restore</string>
+ <string name="BUTTON_MINIMIZE">Minimize</string>
+ <string name="BUTTON_TEAR_OFF">Tear Off</string>
+ <string name="BUTTON_DOCK">Dock</string>
+ <string name="BUTTON_HELP">Show Help</string>
+
+ <!-- searching - generic -->
+ <string name="Searching">Searching...</string>
+ <string name="NoneFound">None found.</string>
+
+ <!-- Indicates that an avatar name or other similar datum is being retrieved. General usage. -->
+ <string name="RetrievingData">Retrieving...</string>
+
+ <string name="ReleaseNotes">Release Notes</string>
+ <!-- Always mark translate="false" for strings that are nothing but URLs, as they don't need translation. -->
+ <string name="RELEASE_NOTES_BASE_URL" translate="false">http://wiki.secondlife.com/wiki/Release_Notes/</string>
+
+ <!-- Indicates something is being loaded. Maybe should be merged with RetrievingData -->
+ <string name="LoadingData">Loading...</string>
+
+
+ <!-- namecache -->
+ <!-- Avatar name: text shown for LLUUID::null -->
+ <string name="AvatarNameNobody">(nobody)</string>
+
+ <!-- Avatar name: text shown while fetching name -->
+ <string name="AvatarNameWaiting">(waiting)</string>
+
+ <!-- Avatar name: More than one avatar is selected/used here -->
+ <string name="AvatarNameMultiple">(multiple)</string>
+
+ <!-- Group name: text shown for LLUUID::null -->
+ <string name="GroupNameNone">(none)</string>
+
+ <string name="AvalineCaller">Avaline Caller [ORDER]</string>
+
+ <!-- Asset errors. Used in llassetstorage.cpp, translation from error code to error message. -->
+ <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>
+
+ <!-- Asset Type human readable names: these will replace variable [TYPE] in notification FailedToFindWearable* -->
+ <!-- Will also replace [OBJECTTYPE] in notifications: UserGiveItem, ObjectGiveItem -->
+ <string name="texture">texture</string>
+ <string name="sound">sound</string>
+ <string name="calling card">calling card</string>
+ <string name="landmark">landmark</string>
+ <string name="legacy script">legacy script</string>
+ <string name="clothing">clothing</string>
+ <string name="object">object</string>
+ <string name="note card">notecard</string>
+ <string name="folder">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 texture</string>
+ <string name="body part">body part</string>
+ <string name="snapshot">snapshot</string>
+ <string name="lost and found">Lost and Found</string>
+ <string name="targa image">targa image</string>
+ <string name="trash">Trash</string>
+ <string name="jpeg image">jpeg image</string>
+ <string name="animation">animation</string>
+ <string name="gesture">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="mesh">mesh</string>
+
+ <!-- llvoavatar. Displayed in the avatar chat bubble -->
+ <string name="AvatarEditingAppearance">(Editing Appearance)</string>
+ <string name="AvatarAway">Away</string>
+ <string name="AvatarBusy">Busy</string>
+ <string name="AvatarMuted">Blocked</string>
+
+ <!-- animations -->
+ <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">Yes</string>
+
+ <!-- build floater -->
+ <string name="multiple_textures">Multiple</string>
+
+ <!-- world map -->
+ <string name="texture_loading">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>
+
+ <!-- animations uploading status codes -->
+ <string name="Ok">OK</string>
+ <string name="Premature end of file">Premature end of file</string>
+ <string name="ST_NO_JOINT">Can't find ROOT or JOINT.</string>
+
+ <!-- Chat -->
+ <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">'[OBJECTNAME]', an object owned by '[OWNERNAME]', located in [REGIONNAME] at [REGIONPOS], has been granted permission to: [PERMISSIONS].</string>
+ <string name="ScriptQuestionCautionChatDenied">'[OBJECTNAME]', an object owned by '[OWNERNAME]', located in [REGIONNAME] at [REGIONPOS], has been denied permission to: [PERMISSIONS].</string>
+ <string name="AdditionalPermissionsRequestHeader">If you allow access to your account, you will also be allowing the object to:</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="TeleportYourAgent">Teleport you</string>
+ <string name="NotConnected">Not Connected</string>
+
+ <!-- Sim Access labels -->
+ <string name="SIM_ACCESS_PG">General</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">Unknown</string>
+
+ <!-- For use when we do not have land type back from the server -->
+ <string name="land_type_unknown">(unknown)</string>
+
+ <!-- For land type back from the simulator -->
+ <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>
+
+ <!-- File load/save dialogs -->
+ <string name="all_files">All Files</string>
+ <string name="sound_files">Sounds</string>
+ <string name="animation_files">Animations</string>
+ <string name="image_files">Images</string>
+ <string name="save_file_verb">Save</string>
+ <string name="load_file_verb">Load</string>
+ <string name="targa_image_files">Targa Images</string>
+ <string name="bitmap_image_files">Bitmap Images</string>
+ <string name="avi_movie_file">AVI Movie File</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="script_files">Scripts</string>
+
+ <!-- LSL Usage Hover Tips -->
+ <!-- NOTE: For now these are set as translate="false", until DEV-40761 is implemented (to internationalize the rest of tooltips in the same window).
+ This has no effect on viewer code, but prevents Linden Lab internal localization tool from scraping these strings. -->
+ <string name="LSLTipSleepTime" translate="false">
+Sleeps script for [SLEEP_TIME] seconds.
+ </string>
+
+ <string name="LSLTipText_llSin" translate="false">
+float llSin(float theta)
+Returns the sine of theta (theta in radians)
+ </string>
+ <string name="LSLTipText_llCos" translate="false">
+float llCos(float theta)
+Returns the cosine of theta (theta in radians)
+ </string>
+ <string name="LSLTipText_llTan" translate="false">
+float llTan(float theta)
+Returns the tangent of theta (theta in radians)
+ </string>
+ <string name="LSLTipText_llAtan2" translate="false">
+float llAtan2(float y, float x)
+Returns the arctangent2 of y, x
+ </string>
+ <string name="LSLTipText_llSqrt" translate="false">
+float llSqrt(float val)
+Returns the square root of val, or returns 0 and triggers a Math Error for imaginary results
+ </string>
+ <string name="LSLTipText_llPow" translate="false">
+float llPow(float base, float exponent)
+Returns the base raised to the power exponent, or returns 0 and triggers Math Error for imaginary results
+ </string>
+ <string name="LSLTipText_llAbs" translate="false">
+integer llAbs(integer val)
+Returns the positive version of val
+ </string>
+ <string name="LSLTipText_llFabs" translate="false">
+float llFabs(float val)
+Returns the positive version of val
+ </string>
+ <string name="LSLTipText_llFrand" translate="false">
+float llFrand(float mag)
+Returns a pseudo random number in the range [0,mag) or (mag,0]
+ </string>
+ <string name="LSLTipText_llFloor" translate="false">
+integer llFloor(float val)
+Returns largest integer value &lt;= val
+ </string>
+ <string name="LSLTipText_llCeil" translate="false">
+integer llCeil(float val)
+Returns smallest integer value &gt;= val
+ </string>
+ <string name="LSLTipText_llRound" translate="false">
+integer llRound(float val)
+Returns val rounded to the nearest integer
+ </string>
+ <string name="LSLTipText_llVecMag" translate="false">
+float llVecMag(vector v)
+Returns the magnitude of v
+ </string>
+ <string name="LSLTipText_llVecNorm" translate="false">
+vector llVecNorm(vector v)
+Returns the v normalized
+ </string>
+ <string name="LSLTipText_llVecDist" translate="false">
+float llVecDist(vector v1, vector v2)
+Returns the 3D distance between v1 and v2
+ </string>
+ <string name="LSLTipText_llRot2Euler" translate="false">
+vector llRot2Euler(rotation q)
+Returns the Euler representation (roll, pitch, yaw) of q
+ </string>
+ <string name="LSLTipText_llEuler2Rot" translate="false">
+rotation llEuler2Rot(vector v)
+Returns the rotation representation of Euler Angles v
+ </string>
+ <string name="LSLTipText_llAxes2Rot" translate="false">
+rotation llAxes2Rot(vector fwd, vector left, vector up)
+Returns the rotation defined by the coordinate axes
+ </string>
+ <string name="LSLTipText_llRot2Fwd" translate="false">
+vector llRot2Fwd(rotation q)
+Returns the forward vector defined by q
+ </string>
+ <string name="LSLTipText_llRot2Left" translate="false">
+vector llRot2Left(rotation q)
+Returns the left vector defined by q
+ </string>
+ <string name="LSLTipText_llRot2Up" translate="false">
+vector llRot2Up(rotation q)
+Returns the up vector defined by q
+ </string>
+ <string name="LSLTipText_llRotBetween" translate="false">
+rotation llRotBetween(vector v1, vector v2)
+Returns the rotation to rotate v1 to v2
+ </string>
+ <string name="LSLTipText_llWhisper" translate="false">
+llWhisper(integer channel, string msg)
+Whispers the text of msg on channel
+ </string>
+ <string name="LSLTipText_llSay" translate="false">
+llSay(integer channel, string msg)
+Says the text of msg on channel
+ </string>
+ <string name="LSLTipText_llShout" translate="false">
+llShout(integer channel, string msg)
+Shouts the text of msg on channel
+ </string>
+ <string name="LSLTipText_llListen" translate="false">
+integer llListen(integer channel, string name, key id, string msg)
+Sets a callback for msg on channel from name and id (name, id, and/or msg can be empty) and returns an identifier that can be used to deactivate or remove the listen
+ </string>
+ <string name="LSLTipText_llListenControl" translate="false">
+llListenControl(integer number, integer active)
+Makes a listen event callback active or inactive
+ </string>
+ <string name="LSLTipText_llListenRemove" translate="false">
+llListenRemove(integer number)
+Removes listen event callback number
+ </string>
+ <string name="LSLTipText_llSensor" translate="false">
+llSensor(string name, key id, integer type, float range, float arc)
+Performs a single scan for name and id with type (AGENT, ACTIVE, PASSIVE, and/or SCRIPTED) within range meters and arc radians of forward vector (name, id, and/or keytype can be empty or 0)
+ </string>
+ <string name="LSLTipText_llSensorRepeat" translate="false">
+llSensorRepeat(string name, key id, integer type, float range, float arc, float rate)
+Sets a callback for name and id with type (AGENT, ACTIVE, PASSIVE, and/or SCRIPTED) within range meters and arc radians of forward vector (name, id, and/or keytype can be empty or 0) and repeats every rate seconds
+ </string>
+ <string name="LSLTipText_llSensorRemove" translate="false">
+llSensorRemove()
+Removes the sensor setup by llSensorRepeat
+ </string>
+ <string name="LSLTipText_llDetectedName" translate="false">
+string llDetectedName(integer number)
+Returns the name of detected object number (returns empty string if number is not a valid sensed object)
+ </string>
+ <string name="LSLTipText_llDetectedKey" translate="false">
+key llDetectedKey(integer number)
+Returns the key of detected object number (returns empty key if number is not a valid sensed object)
+ </string>
+ <string name="LSLTipText_llDetectedOwner" translate="false">
+key llDetectedOwner(integer number)
+Returns the key of detected object&apos;s owner (returns empty key if number is not a valid sensed object)
+ </string>
+ <string name="LSLTipText_llDetectedType" translate="false">
+integer llDetectedType(integer number)
+Returns the type (AGENT, ACTIVE, PASSIVE, SCRIPTED) of detected object (returns 0 if number is not a valid sensed object)
+ </string>
+ <string name="LSLTipText_llDetectedPos" translate="false">
+vector llDetectedPos(integer number)
+Returns the position of detected object number (returns &lt;0,0,0&gt; if number is not a valid sensed object)
+ </string>
+ <string name="LSLTipText_llDetectedVel" translate="false">
+vector llDetectedVel(integer number)
+Returns the velocity of detected object number (returns &lt;0,0,0&gt; if number is not a valid sensed object)
+ </string>
+ <string name="LSLTipText_llDetectedGrab" translate="false">
+vector llDetectedGrab(integer number)
+Returns the grab offset of the user touching object (returns &lt;0,0,0&gt; if number is not a valid sensed object)
+ </string>
+ <string name="LSLTipText_llDetectedRot" translate="false">
+rotation llDetectedRot(integer number)
+Returns the rotation of detected object number (returns &lt;0,0,0,1&gt; if number is not a valid sensed object)
+ </string>
+ <string name="LSLTipText_llDetectedGroup" translate="false">
+integer llDetectedGroup(integer number)
+Returns TRUE if detected object is part of same group as owner
+ </string>
+ <string name="LSLTipText_llDetectedLinkNumber" translate="false">
+integer llDetectedLinkNumber(integer number)
+Returns the link position of the triggered event for touches and collisions only
+ </string>
+ <string name="LSLTipText_llDie" translate="false">
+llDie()
+Deletes the object
+ </string>
+ <string name="LSLTipText_llGround" translate="false">
+float llGround(vector offset)
+Returns the ground height below the object position + offset
+ </string>
+ <string name="LSLTipText_llCloud" translate="false">
+float llCloud(vector offset)
+Returns the cloud density at the object position + offset
+ </string>
+ <string name="LSLTipText_llWind" translate="false">
+vector llWind(vector offset)
+Returns the wind velocity at the object position + offset
+ </string>
+ <string name="LSLTipText_llSetStatus" translate="false">
+llSetStatus(integer status, integer value)
+Sets status (STATUS_PHYSICS, STATUS_PHANTOM, STATUS_BLOCK_GRAB, STATUS_ROTATE_X, STATUS_ROTATE_Y, and/or STATUS_ROTATE_Z) to value
+ </string>
+ <string name="LSLTipText_llGetStatus" translate="false">
+integer llGetStatus(integer status)
+Returns value of status (STATUS_PHYSICS, STATUS_PHANTOM, STATUS_BLOCK_GRAB, STATUS_ROTATE_X, STATUS_ROTATE_Y, and/or STATUS_ROTATE_Z)
+ </string>
+ <string name="LSLTipText_llSetScale" translate="false">
+llSetScale(vector scale)
+Sets the scale of the prim
+ </string>
+ <string name="LSLTipText_llGetScale" translate="false">
+vector llGetScale()
+Returns the scale of the prim
+ </string>
+ <string name="LSLTipText_llSetColor" translate="false">
+llSetColor(vector color, integer face)
+Sets the color on face of the prim
+ </string>
+ <string name="LSLTipText_llGetAlpha" translate="false">
+float llGetAlpha(integer face)
+Returns the alpha of face
+ </string>
+ <string name="LSLTipText_llSetAlpha" translate="false">
+llSetAlpha(float alpha, integer face)
+Sets the alpha on face
+ </string>
+ <string name="LSLTipText_llGetColor" translate="false">
+vector llGetColor(integer face)
+Returns the color on face
+ </string>
+ <string name="LSLTipText_llSetTexture" translate="false">
+llSetTexture(string texture, integer face)
+Sets the texture of face or ALL_SIDES
+ </string>
+ <string name="LSLTipText_llScaleTexture" translate="false">
+llScaleTexture(float u, float v, integer face)
+Sets the texture u &amp; v scales for the chosen face or ALL_SIDES
+ </string>
+ <string name="LSLTipText_llOffsetTexture" translate="false">
+llOffsetTexture(float u, float v, integer face)
+Sets the texture u &amp; v offsets for the chosen face or ALL_SIDES
+ </string>
+ <string name="LSLTipText_llRotateTexture" translate="false">
+llRotateTexture(float rotation, integer face)
+Sets the texture rotation for the chosen face
+ </string>
+ <string name="LSLTipText_llGetTexture" translate="false">
+string llGetTexture(integer face)
+Returns a string that is the texture on face (the inventory name if it is a texture in the prim&apos;s inventory, otherwise the key)
+ </string>
+ <string name="LSLTipText_llSetPos" translate="false">
+llSetPos(vector pos)
+Moves the object or prim towards pos without using physics (if the script isn&apos;t physical)
+ </string>
+ <string name="LSLTipText_llGetPos" translate="false">
+vector llGetPos()
+Returns the position of the task in region coordinates
+ </string>
+ <string name="LSLTipText_llGetLocalPos" translate="false">
+vector llGetLocalPos()
+Returns the position relative to the root
+ </string>
+ <string name="LSLTipText_llSetRot" translate="false">
+llSetRot(rotation rot)
+Sets the rotation
+ </string>
+ <string name="LSLTipText_llGetRot" translate="false">
+rotation llGetRot()
+Returns the rotation relative to the region&apos;s axes
+ </string>
+ <string name="LSLTipText_llGetLocalRot" translate="false">
+rotation llGetLocalRot()
+Returns the rotation local to the root
+ </string>
+ <string name="LSLTipText_llSetForce" translate="false">
+llSetForce(vector force, integer local)
+Applies force to the object (if the script is physical), in local coords if local == TRUE
+ </string>
+ <string name="LSLTipText_llGetForce" translate="false">
+vector llGetForce()
+Returns the force (if the script is physical)
+ </string>
+ <string name="LSLTipText_llTarget" translate="false">
+integer llTarget(vector position, float range)
+Sets positions within range of position as a target and return an ID for the target
+ </string>
+ <string name="LSLTipText_llTargetRemove" translate="false">
+llTargetRemove(integer number)
+Removes positional target number registered with llTarget
+ </string>
+ <string name="LSLTipText_llRotTarget" translate="false">
+integer llRotTarget(rotation rot, float error)
+Set rotations with error of rot as a rotational target and return an ID for the rotational target
+ </string>
+ <string name="LSLTipText_llRotTargetRemove" translate="false">
+llRotTargetRemove(integer number)
+Removes rotational target number registered with llRotTarget
+ </string>
+ <string name="LSLTipText_llMoveToTarget" translate="false">
+llMoveToTarget(vector target, float tau)
+Critically damps to target in tau seconds (if the script is physical)
+ </string>
+ <string name="LSLTipText_llStopMoveToTarget" translate="false">
+llStopMoveToTarget()
+Stops critically damped motion
+ </string>
+ <string name="LSLTipText_llApplyImpulse" translate="false">
+llApplyImpulse(vector force, integer local)
+Applies impulse to object (if the script is physical), in local coords if local == TRUE
+ </string>
+ <string name="LSLTipText_llApplyRotationalImpulse" translate="false">
+llApplyRotationalImpulse(vector force, integer local)
+Applies rotational impulse to object (if the script is physical), in local coords if local == TRUE
+ </string>
+ <string name="LSLTipText_llSetTorque" translate="false">
+llSetTorque(vector torque, integer local)
+Sets the torque of object (if the script is physical), in local coords if local == TRUE
+ </string>
+ <string name="LSLTipText_llGetTorque" translate="false">
+vector llGetTorque()
+Returns the torque (if the script is physical)
+ </string>
+ <string name="LSLTipText_llSetForceAndTorque" translate="false">
+llSetForceAndTorque(vector force, vector torque, integer local)
+Sets the force and torque of object (if the script is physical), in local coords if local == TRUE
+ </string>
+ <string name="LSLTipText_llGetVel" translate="false">
+vector llGetVel()
+Returns the velocity of the object
+ </string>
+ <string name="LSLTipText_llGetAccel" translate="false">
+vector llGetAccel()
+Returns the acceleration of the object relative to the region&apos;s axes
+ </string>
+ <string name="LSLTipText_llGetOmega" translate="false">
+vector llGetOmega()
+Returns the rotation velocity in radians per second
+ </string>
+ <string name="LSLTipText_llGetTimeOfDay" translate="false">
+float llGetTimeOfDay()
+Returns the time in seconds since [SECOND_LIFE] server midnight or since region up-time, whichever is smaller
+ </string>
+ <string name="LSLTipText_llGetWallclock" translate="false">
+float llGetWallclock()
+Returns the time in seconds since midnight California Pacific time (PST/PDT)
+ </string>
+ <string name="LSLTipText_llGetTime" translate="false">
+float llGetTime()
+Returns the time in seconds since the last region reset, script reset, or call to either llResetTime or llGetAndResetTime
+ </string>
+ <string name="LSLTipText_llResetTime" translate="false">
+llResetTime()
+Sets the script timer to zero
+ </string>
+ <string name="LSLTipText_llGetAndResetTime" translate="false">
+float llGetAndResetTime()
+Returns the script time in seconds and then resets the script timer to zero
+ </string>
+ <string name="LSLTipText_llSoplayund" translate="false">
+llSound(string sound, float volume, integer queue, integer loop)
+Plays sound at volume and whether it should loop or not
+ </string>
+ <string name="LSLTipText_llPlaySound" translate="false">
+llPlaySound(string sound, float volume)
+Plays attached sound once at volume (0.0 - 1.0)
+ </string>
+ <string name="LSLTipText_llLoopSound" translate="false">
+llLoopSound(string sound, float volume)
+Plays attached sound looping indefinitely at volume (0.0 - 1.0)
+ </string>
+ <string name="LSLTipText_llLoopSoundMaster" translate="false">
+llLoopSoundMaster(string sound, float volume)
+Plays attached sound looping at volume (0.0 - 1.0), declares it a sync master
+ </string>
+ <string name="LSLTipText_llLoopSoundSlave" translate="false">
+llLoopSoundSlave(string sound, float volume)
+Plays attached sound looping at volume (0.0 - 1.0), synced to most audible sync master
+ </string>
+ <string name="LSLTipText_llPlaySoundSlave" translate="false">
+llPlaySoundSlave(string sound, float volume)
+Plays attached sound once at volume (0.0 - 1.0), synced to next loop of most audible sync master
+ </string>
+ <string name="LSLTipText_llTriggerSound" translate="false">
+llTriggerSound(string sound, float volume)
+Plays sound at volume (0.0 - 1.0), centered at but not attached to object
+ </string>
+ <string name="LSLTipText_llStopSound" translate="false">
+llStopSound()
+Stops currently attached sound
+ </string>
+ <string name="LSLTipText_llPreloadSound" translate="false">
+llPreloadSound(string sound)
+Preloads a sound on viewers within range
+ </string>
+ <string name="LSLTipText_llGetSubString" translate="false">
+string llGetSubString(string src, integer start, integer end)
+Returns the indicated substring
+ </string>
+ <string name="LSLTipText_llDeleteSubString" translate="false">
+string llDeleteSubString(string src, integer start, integer end)
+Removes the indicated substring and returns the result
+ </string>
+ <string name="LSLTipText_llInsertString" translate="false">
+string llInsertString(string dst, integer position, string src)
+Returns a destination string dst with the string src inserted starting at position pos
+ </string>
+ <string name="LSLTipText_llToUpper" translate="false">
+string llToUpper(string src)
+Returns a string that is src with all upper-case characters
+ </string>
+ <string name="LSLTipText_llToLower" translate="false">
+string llToLower(string src)
+Returns a string that is src with all lower-case characters
+ </string>
+ <string name="LSLTipText_llGiveMoney" translate="false">
+llGiveMoney(key destination, integer amount)
+Transfers amount of L$ from script owner to destination
+ </string>
+ <string name="LSLTipText_llMakeExplosion" translate="false">
+llMakeExplosion(integer particles, float scale, float vel, float lifetime, float arc, string texture, vector offset)
+Makes a round explosion of particles
+ </string>
+ <string name="LSLTipText_llMakeFountain" translate="false">
+llMakeFountain(integer particles, float scale, float vel, float lifetime, float arc, integer bounce, string texture, vector offset, float bounce_offset)
+Makes a fountain of particles
+ </string>
+ <string name="LSLTipText_llMakeSmoke" translate="false">
+llMakeSmoke(integer particles, float scale, float vel, float lifetime, float arc, string texture, vector offset)
+Makes smoke like particles
+ </string>
+ <string name="LSLTipText_llMakeFire" translate="false">
+llMakeFire(integer particles, float scale, float vel, float lifetime, float arc, string texture, vector offset)
+Makes fire like particles
+ </string>
+ <string name="LSLTipText_llRezObject" translate="false">
+llRezObject(string inventory, vector pos, vector vel, rotation rot, integer param)
+Instantiates owner&apos;s inventory object at pos with velocity vel and rotation rot with start parameter param
+ </string>
+ <string name="LSLTipText_llLookAt" translate="false">
+llLookAt(vector target, float strength, float damping)
+Causes object to point its up axis (positive z) towards target, while keeping its forward axis (positive x) below the horizon
+ </string>
+ <string name="LSLTipText_llStopLookAt" translate="false">
+llStopLookAt()
+Stops causing object to point at a target
+ </string>
+ <string name="LSLTipText_llSetTimerEvent" translate="false">
+llSetTimerEvent(float sec)
+Causes the timer event to be triggered a maximum of once every sec seconds
+ </string>
+ <string name="LSLTipText_llSleep" translate="false">
+llSleep(float sec)
+Puts the script to sleep for sec seconds
+ </string>
+ <string name="LSLTipText_llGetMass" translate="false">
+float llGetMass()
+Returns the mass of object that the script is attached to
+ </string>
+ <string name="LSLTipText_llCollisionFilter" translate="false">
+llCollisionFilter(string name, key id, integer accept)
+Sets the collision filter, exclusively or inclusively. If accept == TRUE, only accept collisions with objects name and id (either is optional), otherwise with objects not name or id
+ </string>
+ <string name="LSLTipText_llTakeControls" translate="false">
+llTakeControls(integer controls, integer accept, integer pass_on)
+Allows for intercepting keyboard and mouse clicks from the agent the script has permissions for
+ </string>
+ <string name="LSLTipText_llReleaseControls" translate="false">
+llReleaseControls()
+Stops taking inputs that were taken with llTakeControls
+ </string>
+ <string name="LSLTipText_llAttachToAvatar" translate="false">
+llAttachToAvatar(integer attach_point)
+Attaches the object to the avatar who has granted permission to the script
+ </string>
+ <string name="LSLTipText_llDetachFromAvatar" translate="false">
+llDetachFromAvatar()
+Detaches object from avatar
+ </string>
+ <string name="LSLTipText_llTakeCamera" translate="false">
+llTakeCamera(key avatar)
+Moves avatar&apos;s viewpoint to task
+ </string>
+ <string name="LSLTipText_llReleaseCamera" translate="false">
+llReleaseCamera(key avatar)
+Returns camera to agent avatar
+ </string>
+ <string name="LSLTipText_llGetOwner" translate="false">
+key llGetOwner()
+Returns the object owner&apos;s UUID
+ </string>
+ <string name="LSLTipText_llInstantMessage" translate="false">
+llInstantMessage(key user, string message)
+Sends the specified string as an Instant Message to the user
+ </string>
+ <string name="LSLTipText_llEmail" translate="false">
+llEmail(string address, string subject, string message)
+Sends an email to address with the subject and message
+ </string>
+ <string name="LSLTipText_llGetNextEmail" translate="false">
+llGetNextEmail(string address, string subject)
+Gets the next waiting email that comes from address, with specified subject
+ </string>
+ <string name="LSLTipText_llGetKey" translate="false">
+key llGetKey()
+Returns the key of the prim the script is attached to
+ </string>
+ <string name="LSLTipText_llSetBuoyancy" translate="false">
+llSetBuoyancy(float buoyancy)
+Sets the buoyancy of the task or object (0 is disabled, &lt; 1.0 sinks, 1.0 floats, &gt; 1.0 rises)
+ </string>
+ <string name="LSLTipText_llSetHoverHeight" translate="false">
+llSetHoverHeight(float height, integer water, float tau)
+Critically damps to a height above the ground (or water) in tau seconds
+ </string>
+ <string name="LSLTipText_llStopHover" translate="false">
+llStopHover()
+Stops hovering to a height
+ </string>
+ <string name="LSLTipText_llMinEventDelay" translate="false">
+llMinEventDelay(float delay)
+Sets the minimum time between events being handled
+ </string>
+ <string name="LSLTipText_llSoundPreload" translate="false">
+llSoundPreload(string sound)
+Preloads a sound on viewers within range
+ </string>
+ <string name="LSLTipText_llRotLookAt" translate="false">
+llRotLookAt(rotation target, float strength, float damping)
+Causes object to point its forward axis towards target
+ </string>
+ <string name="LSLTipText_llStringLength" translate="false">
+integer llStringLength(string str)
+Returns the length of string
+ </string>
+ <string name="LSLTipText_llStartAnimation" translate="false">
+llStartAnimation(string anim)
+Starts animation anim for agent that granted PERMISSION_TRIGGER_ANIMATION if the permission has not been revoked
+ </string>
+ <string name="LSLTipText_llStopAnimation" translate="false">
+llStopAnimation(string anim)
+Stops animation anim for agent that granted permission
+ </string>
+ <string name="LSLTipText_llPointAt" translate="false">
+llPointAt(vector pos)
+Makes agent that owns object point at pos
+ </string>
+ <string name="LSLTipText_llStopPointAt" translate="false">
+llStopPointAt()
+Stops pointing agent that owns object
+ </string>
+ <string name="LSLTipText_llTargetOmega" translate="false">
+llTargetOmega(vector axis, float spinrate, float gain)
+Rotates the object around axis at spinrate with strength gain
+ </string>
+ <string name="LSLTipText_llGetStartParameter" translate="false">
+integer llGetStartParameter()
+Returns an integer that is the script start/rez parameter
+ </string>
+ <string name="LSLTipText_llGodLikeRezObject" translate="false">
+llGodLikeRezObject(key inventory, vector pos)
+Rezzes directly off of UUID if owner is in God Mode
+ </string>
+ <string name="LSLTipText_llRequestPermissions" translate="false">
+llRequestPermissions(key agent, integer perm)
+Asks the agent for permission to run certain classes of functions
+ </string>
+ <string name="LSLTipText_llGetPermissionsKey" translate="false">
+key llGetPermissionsKey()
+Returns the key of the avatar that last granted permissions to the script
+ </string>
+ <string name="LSLTipText_llGetPermissions" translate="false">
+integer llGetPermissions()
+Returns an integer bitfield with the permissions that have been granted
+ </string>
+ <string name="LSLTipText_llGetLinkNumber" translate="false">
+integer llGetLinkNumber()
+Returns the link number of the prim containing the script (0 means not linked, 1 the prim is the root, 2 the prim is the first child, etc)
+ </string>
+ <string name="LSLTipText_llSetLinkColor" translate="false">
+llSetLinkColor(integer linknumber, vector color, integer face)
+Sets face to color if a task exists in the link chain at linknumber
+ </string>
+ <string name="LSLTipText_llCreateLink" translate="false">
+llCreateLink(key target, integer parent)
+Attempts to link the script&apos;s object with the target (requires that PERMISSION_CHANGE_LINKS be granted). If parent == TRUE, then the script&apos;s object becomes the root
+ </string>
+ <string name="LSLTipText_llBreakLink" translate="false">
+llBreakLink(integer linknum)
+Delinks the prim with the given link number in a linked object set (requires that PERMISSION_CHANGE_LINKS be granted)
+ </string>
+ <string name="LSLTipText_llBreakAllLinks" translate="false">
+llBreakAllLinks()
+Delinks all prims in the link set (requires that PERMISSION_CHANGE_LINKS be granted)
+ </string>
+ <string name="LSLTipText_llGetLinkKey" translate="false">
+key llGetLinkKey(integer linknumber)
+Returns the key of the linked prim linknumber
+ </string>
+ <string name="LSLTipText_llGetLinkName" translate="false">
+string llGetLinkName(integer linknumber)
+Returns the name of linknumber in a link set
+ </string>
+ <string name="LSLTipText_llGetInventoryNumber" translate="false">
+integer llGetInventoryNumber(integer type)
+Returns the number of items of a given type (INVENTORY_* flag) in the prim&apos;s inventory
+ </string>
+ <string name="LSLTipText_llGetInventoryName" translate="false">
+string llGetInventoryName(integer type, integer number)
+Returns the name of the inventory item number of a given type
+ </string>
+ <string name="LSLTipText_llSetScriptState" translate="false">
+llSetScriptState(string name, integer run)
+Sets the running state of the specified script
+ </string>
+ <string name="LSLTipText_llGetEnergy" translate="false">
+float llGetEnergy()
+Returns how much energy is in the object as a percentage of maximum
+ </string>
+ <string name="LSLTipText_llGiveInventory" translate="false">
+llGiveInventory(key destination, string inventory)
+Gives inventory to destination
+ </string>
+ <string name="LSLTipText_llRemoveInventory" translate="false">
+llRemoveInventory(string item)
+Removes the named inventory item
+ </string>
+ <string name="LSLTipText_llSetText" translate="false">
+llSetText(string text, vector color, float alpha)
+Displays text that hovers over the prim with specific color and translucency specified with alpha
+ </string>
+ <string name="LSLTipText_llWater" translate="false">
+float llWater(vector offset)
+Returns the water height below the object position + offset
+ </string>
+ <string name="LSLTipText_llPassTouches" translate="false">
+llPassTouches(integer pass)
+If pass == TRUE, touches are passed from children on to parents
+ </string>
+ <string name="LSLTipText_llRequestAgentData" translate="false">
+key llRequestAgentData(key id, integer data)
+Requests data about agent id. When data is available the dataserver event will be raised.
+ </string>
+ <string name="LSLTipText_llRequestInventoryData" translate="false">
+key llRequestInventoryData(string name)
+Requests data from object&apos;s inventory object. When data is available the dataserver event will be raised.
+ </string>
+ <string name="LSLTipText_llSetDamage" translate="false">
+llSetDamage(float damage)
+Sets the amount of damage that will be done when this object hits an avatar.
+ </string>
+ <string name="LSLTipText_llTeleportAgentHome" translate="false">
+llTeleportAgentHome(key id)
+Teleports avatar on the owner&apos;s land to their home location without any warning
+ </string>
+ <string name="LSLTipText_llModifyLand" translate="false">
+llModifyLand(integer action, integer brush)
+Modifies land using the specified action on the specified brush size of land
+ </string>
+ <string name="LSLTipText_llCollisionSound" translate="false">
+llCollisionSound(string impact_sound, float impact_volume)
+Suppresses default collision sounds, replaces default impact sounds with impact_sound at the volume impact_volume
+ </string>
+ <string name="LSLTipText_llCollisionSprite" translate="false">
+llCollisionSprite(string impact_sprite)
+Suppresses default collision sprites, replaces default impact sprite with impact_sprite (use an empty string to just suppress)
+ </string>
+ <string name="LSLTipText_llGetAnimation" translate="false">
+string llGetAnimation(key id)
+Returns the name of the currently playing locomotion animation for avatar id
+ </string>
+ <string name="LSLTipText_llResetScript" translate="false">
+llResetScript()
+Resets the script
+ </string>
+ <string name="LSLTipText_llMessageLinked" translate="false">
+llMessageLinked(integer linknum, integer num, string str, key id)
+Allows scripts in the same object to communicate. Triggers a link_message event with the same parameters num, str, and id in all scripts in the prim(s) described by linknum.
+ </string>
+ <string name="LSLTipText_llPushObject" translate="false">
+llPushObject(key id, vector impulse, vector ang_impulse, integer local)
+Applies impulse and ang_impulse to object id
+ </string>
+ <string name="LSLTipText_llPassCollisions" translate="false">
+llPassCollisions(integer pass)
+If pass == TRUE, collisions are passed from children on to parents (default is FALSE)
+ </string>
+ <string name="LSLTipText_llGetScriptName" translate="false">
+string llGetScriptName()
+Returns the name of the script that this function is used in
+ </string>
+ <string name="LSLTipText_llGetNumberOfSides" translate="false">
+integer llGetNumberOfSides()
+Returns the number of faces (or sides) of the prim
+ </string>
+ <string name="LSLTipText_llAxisAngle2Rot" translate="false">
+rotation llAxisAngle2Rot(vector axis, float angle)
+Returns the rotation that is a generated angle about axis
+ </string>
+ <string name="LSLTipText_llRot2Axis" translate="false">
+vector llRot2Axis(rotation rot)
+Returns the rotation axis represented by rot
+ </string>
+ <string name="LSLTipText_llRot2Angle" translate="false">
+float llRot2Angle(rotation rot)
+Returns the rotation angle represented by rot
+ </string>
+ <string name="LSLTipText_llAcos" translate="false">
+float llAcos(float val)
+Returns the arccosine in radians of val
+ </string>
+ <string name="LSLTipText_llAsin" translate="false">
+float llAsin(float val)
+Returns the arcsine in radians of val
+ </string>
+ <string name="LSLTipText_llAngleBetween" translate="false">
+float llAngleBetween(rotation a, rotation b)
+Returns angle between rotation a and b
+ </string>
+ <string name="LSLTipText_llGetInventoryKey" translate="false">
+key llGetInventoryKey(string name)
+Returns the key that is the UUID of the inventory name
+ </string>
+ <string name="LSLTipText_llAllowInventoryDrop" translate="false">
+llAllowInventoryDrop(integer add)
+If add == TRUE, users without modify permissions can still drop inventory items onto a prim
+ </string>
+ <string name="LSLTipText_llGetSunDirection" translate="false">
+vector llGetSunDirection()
+Returns a normalized vector of the direction of the sun in the region
+ </string>
+ <string name="LSLTipText_llGetTextureOffset" translate="false">
+vector llGetTextureOffset(integer face)
+Returns the texture offset of face in the x and y components of a vector
+ </string>
+ <string name="LSLTipText_llGetTextureScale" translate="false">
+vector llGetTextureScale(integer side)
+Returns the texture scale of side in the x and y components of a vector
+ </string>
+ <string name="LSLTipText_llGetTextureRot" translate="false">
+float llGetTextureRot(integer side)
+Returns the texture rotation of side
+ </string>
+ <string name="LSLTipText_llSubStringIndex" translate="false">
+integer llSubStringIndex(string source, string pattern)
+Returns an integer that is the index in source where pattern first appears.
+(Returns -1 if not found)
+ </string>
+ <string name="LSLTipText_llGetOwnerKey" translate="false">
+key llGetOwnerKey(key id)
+Returns the owner of object id
+ </string>
+ <string name="LSLTipText_llGetCenterOfMass" translate="false">
+vector llGetCenterOfMass()
+Returns the prim&apos;s center of mass (unless called from the root prim, where it returns the object&apos;s center of mass)
+ </string>
+ <string name="LSLTipText_llListSort" translate="false">
+list llListSort(list src, integer stride, integer ascending)
+Sorts the list into blocks of stride, in ascending order if ascending == TRUE.
+The sort order is affected by type.
+ </string>
+ <string name="LSLTipText_llGetListLength" translate="false">
+integer llGetListLength(list src)
+Returns the number of elements in the list
+ </string>
+ <string name="LSLTipText_llList2Integer" translate="false">
+integer llList2Integer(list src, integer index)
+Copies the integer at index in the list
+ </string>
+ <string name="LSLTipText_llList2Float" translate="false">
+float llList2Float(list src, integer index)
+Copies the float at index in the list
+ </string>
+ <string name="LSLTipText_llList2String" translate="false">
+string llList2String(list src, integer index)
+Copies the string at index in the list
+ </string>
+ <string name="LSLTipText_llList2Key" translate="false">
+key llList2Key(list src, integer index)
+Copies the key at index in the list
+ </string>
+ <string name="LSLTipText_llList2Vector" translate="false">
+vector llList2Vector(list src, integer index)
+Copies the vector at index in the list
+ </string>
+ <string name="LSLTipText_llList2Rot" translate="false">
+rotation llList2Rot(list src, integer index)
+Copies the rotation at index in the list
+ </string>
+ <string name="LSLTipText_llList2List" translate="false">
+list llList2List(list src, integer start, integer end)
+Copies the slice of the list from start to end
+ </string>
+ <string name="LSLTipText_llDeleteSubList" translate="false">
+list llDeleteSubList(list src, integer start, integer end)
+Removes the slice from start to end and returns the remainder of the list
+ </string>
+ <string name="LSLTipText_llGetListEntryType" translate="false">
+integer llGetListEntryType(list src, integer index)
+Returns the type of the index entry in the list
+(TYPE_INTEGER, TYPE_FLOAT, TYPE_STRING, TYPE_KEY, TYPE_VECTOR, TYPE_ROTATION, or TYPE_INVALID if index is off list)
+ </string>
+ <string name="LSLTipText_llList2CSV" translate="false">
+string llList2CSV(list src)
+Creates a string of comma separated values from list
+ </string>
+ <string name="LSLTipText_llCSV2List" translate="false">
+list llCSV2List(string src)
+Creates a list from a string of comma separated values
+ </string>
+ <string name="LSLTipText_llListRandomize" translate="false">
+list llListRandomize(list src, integer stride)
+Returns a randomized list of blocks of size stride
+ </string>
+ <string name="LSLTipText_llList2ListStrided" translate="false">
+list llList2ListStrided(list src, integer start, integer end, integer stride)
+Copies the strided slice of the list from start to end
+ </string>
+ <string name="LSLTipText_llGetRegionCorner" translate="false">
+vector llGetRegionCorner()
+Returns a vector in meters that is the global location of the south-west corner of the region which the object is in
+ </string>
+ <string name="LSLTipText_llListInsertList" translate="false">
+list llListInsertList(list dest, list src, integer start)
+Returns a list that contains all the elements from dest but with the elements from src inserted at position start
+ </string>
+ <string name="LSLTipText_llListFindList" translate="false">
+integer llListFindList(list src, list test)
+Returns the index of the first instance of test in src.
+(Returns -1 if not found)
+ </string>
+ <string name="LSLTipText_llGetObjectName" translate="false">
+string llGetObjectName()
+Returns the name of the prim which the script is attached to
+ </string>
+ <string name="LSLTipText_llSetObjectName" translate="false">
+llSetObjectName(string name)
+Sets the prim&apos;s name to the name parameter
+ </string>
+ <string name="LSLTipText_llGetDate" translate="false">
+string llGetDate()
+Returns the current date in the UTC time zone in the format YYYY-MM-DD
+ </string>
+ <string name="LSLTipText_llEdgeOfWorld" translate="false">
+integer llEdgeOfWorld(vector pos, vector dir)
+Checks to see whether the border hit by dir from pos is the edge of the world (has no neighboring region)
+ </string>
+ <string name="LSLTipText_llGetAgentInfo" translate="false">
+integer llGetAgentInfo(key id)
+Returns an integer bitfield containing the agent information about id.
+Returns AGENT_FLYING, AGENT_ATTACHMENTS, AGENT_SCRIPTED, AGENT_SITTING, AGENT_ON_OBJECT, AGENT_MOUSELOOK, AGENT_AWAY, AGENT_BUSY, AGENT_TYPING, AGENT_CROUCHING, AGENT_ALWAYS_RUN, AGENT_WALKING and/or AGENT_IN_AIR.
+ </string>
+ <string name="LSLTipText_llAdjustSoundVolume" translate="false">
+llAdjustSoundVolume(float volume)
+Adjusts volume of attached sound (0.0 - 1.0)
+ </string>
+ <string name="LSLTipText_llSetSoundQueueing" translate="false">
+llSetSoundQueueing(integer queue)
+Sets whether attached sounds wait for the current sound to finish (If queue == TRUE then queuing is enabled, if FALSE queuing is disabled [default])
+ </string>
+ <string name="LSLTipText_llSetSoundRadius" translate="false">
+llSetSoundRadius(float radius)
+Establishes a hard cut-off radius for audibility of scripted sounds (both attached and triggered)
+ </string>
+ <string name="LSLTipText_llKey2Name" translate="false">
+string llKey2Name(key id)
+Returns the name of the prim or avatar specified by id.
+(The id must be a valid rezzed prim or avatar key in the current simulator, otherwise an empty string is returned.)
+ </string>
+ <string name="LSLTipText_llSetTextureAnim" translate="false">
+llSetTextureAnim(integer mode, integer face, integer sizex, integer sizey, float start, float length, float rate)
+Animates the texture on the specified face/faces
+ </string>
+ <string name="LSLTipText_llTriggerSoundLimited" translate="false">
+llTriggerSoundLimited(string sound, float volume, vector top_north_east, vector bottom_south_west)
+Plays sound at volume (0.0 - 1.0), centered at but not attached to object, limited to the box defined by vectors top_north_east and bottom_south_west
+ </string>
+ <string name="LSLTipText_llEjectFromLand" translate="false">
+llEjectFromLand(key avatar)
+Ejects avatar from the parcel
+ </string>
+ <string name="LSLTipText_llParseString2List" translate="false">
+list llParseString2List(string src, list separators, list spacers)
+Breaks src into a list, discarding separators, keeping spacers
+(separators and spacers must be lists of strings, maximum of 8 each)
+ </string>
+ <string name="LSLTipText_llOverMyLand" translate="false">
+integer llOverMyLand(key id)
+Returns TRUE if id is over land owned by the script owner, otherwise FALSE
+ </string>
+ <string name="LSLTipText_llGetLandOwnerAt" translate="false">
+key llGetLandOwnerAt(vector pos)
+Returns the key of the land owner, returns NULL_KEY if public
+ </string>
+ <string name="LSLTipText_llGetNotecardLine" translate="false">
+key llGetNotecardLine(string name, integer line)
+Returns line line of notecard name via the dataserver event
+ </string>
+ <string name="LSLTipText_llGetAgentSize" translate="false">
+vector llGetAgentSize(key id)
+If the avatar is in the same region, returns the size of the bounding box of the requested avatar by id, otherwise returns ZERO_VECTOR
+ </string>
+ <string name="LSLTipText_llSameGroup" translate="false">
+integer llSameGroup(key id)
+Returns TRUE if avatar id is in the same region and has the same active group, otherwise FALSE
+ </string>
+ <string name="LSLTipText_llUnSit" translate="false">
+key llUnSit(key id)
+If avatar identified by id is sitting on the object the script is attached to or is over land owned by the object&apos;s owner, the avatar is forced to stand up
+ </string>
+ <string name="LSLTipText_llGroundSlope" translate="false">
+vector llGroundSlope(vector offset)
+Returns the ground slope below the object position + offset
+ </string>
+ <string name="LSLTipText_llGroundNormal" translate="false">
+vector llGroundNormal(vector offset)
+Returns the ground normal below the object position + offset
+ </string>
+ <string name="LSLTipText_llGroundContour" translate="false">
+vector llGroundCountour(vector offset)
+Returns the ground contour direction below the object position + offset
+ </string>
+ <string name="LSLTipText_llGetAttached" translate="false">
+integer llGetAttached()
+Returns the object&apos;s attachment point, or 0 if not attached
+ </string>
+ <string name="LSLTipText_llGetFreeMemory" translate="false">
+integer llGetFreeMemory()
+Returns the number of free bytes of memory the script can use
+ </string>
+ <string name="LSLTipText_llGetRegionName" translate="false">
+string llGetRegionName()
+Returns the current region name
+ </string>
+ <string name="LSLTipText_llGetRegionTimeDilation" translate="false">
+float llGetRegionTimeDilation()
+Returns the current time dilation as a float between 0.0 (full dilation) and 1.0 (no dilation)
+ </string>
+ <string name="LSLTipText_llGetRegionFPS" translate="false">
+float llGetRegionFPS()
+Returns the mean region frames per second
+ </string>
+ <string name="LSLTipText_llParticleSystem" translate="false">
+llParticleSystem(list rules)
+Creates a particle system based on rules. An empty list removes the particle system.
+List format is [ rule1, data1, rule2, data2 . . . rulen, datan ]
+ </string>
+ <string name="LSLTipText_llGroundRepel" translate="false">
+llGroundRepel(float height, integer water, float tau)
+Critically damps to height if within height*0.5 of level (either above ground level, or above the higher of land and water if water == TRUE)
+ </string>
+ <string name="LSLTipText_llGiveInventoryList" translate="false">
+llGiveInventoryList(key target, string folder, list inventory)
+Gives inventory items to target, creating a new folder to put them in
+ </string>
+ <string name="LSLTipText_llSetVehicleType" translate="false">
+llSetVehicleType(integer type)
+Sets the vehicle to one of the default types
+ </string>
+ <string name="LSLTipText_llSetVehicleFloatParam" translate="false">
+llSetVehicleFloatParam(integer param, float value)
+Sets the specified vehicle float parameter
+ </string>
+ <string name="LSLTipText_llSetVehicleVectorParam" translate="false">
+llSetVehicleVectorParam(integer param, vector vec)
+Sets the specified vehicle vector parameter
+ </string>
+ <string name="LSLTipText_llSetVehicleRotationParam" translate="false">
+llSetVehicleVectorParam(integer param, rotation rot)
+Sets the specified vehicle rotation parameter
+ </string>
+ <string name="LSLTipText_llSetVehicleFlags" translate="false">
+llSetVehicleFlags(integer flags)
+Sets the enabled bits in &apos;flags&apos;
+ </string>
+ <string name="LSLTipText_llRemoveVehicleFlags" translate="false">
+llRemoveVehicleFlags(integer flags)
+Removes the enabled bits in &apos;flags&apos;
+ </string>
+ <string name="LSLTipText_llSitTarget" translate="false">
+llSitTarget(vector offset, rotation rot)
+Sets the sit location for the prim. If offset == &lt;0,0,0&gt; then the sit target is removed.
+ </string>
+ <string name="LSLTipText_llAvatarOnSitTarget" translate="false">
+key llAvatarOnSitTarget()
+If an avatar is seated on the sit target, returns the avatar&apos;s key, otherwise NULL_KEY
+ </string>
+ <string name="LSLTipText_llAddToLandPassList" translate="false">
+llAddToLandPassList(key avatar, float hours)
+Adds avatar to the land pass list for hours, or indefinitely if hours is 0
+ </string>
+ <string name="LSLTipText_llSetTouchText" translate="false">
+llSetTouchText(string text)
+Displays text rather than the default &apos;Touch&apos; in the pie menu
+ </string>
+ <string name="LSLTipText_llSetSitText" translate="false">
+llSetSitText(string text)
+Displays text rather than the default &apos;Sit Here&apos; in the pie menu
+ </string>
+ <string name="LSLTipText_llSetCameraEyeOffset" translate="false">
+llSetCameraEyeOffset(vector offset)
+Sets the camera eye offset for avatars that sit on the object
+ </string>
+ <string name="LSLTipText_llSetCameraAtOffset" translate="false">
+llSetCameraAtOffset(vector offset)
+Sets the point the camera is looking at to offset for avatars that sit on the object
+ </string>
+ <string name="LSLTipText_llDumpList2String" translate="false">
+string llDumpList2String(list src, string separator)
+Returns the list in a single string, using separator between the entries
+ </string>
+ <string name="LSLTipText_llScriptDanger" translate="false">
+integer llScriptDanger(vector pos)
+Returns TRUE if pos is over public land, sandbox land, land that doesn&apos;t allow everyone to edit and build, or land that doesn&apos;t allow outside scripts
+ </string>
+ <string name="LSLTipText_llDialog" translate="false">
+llDialog(key avatar, string message, list buttons, integer chat_channel
+Shows a dialog box on the avatar&apos;s screen with a message and up to 12 buttons.
+If a button is pressed, the avatar says the text of the button label on chat_channel.
+ </string>
+ <string name="LSLTipText_llVolumeDetect" translate="false">
+llVolumeDetect(integer detect)
+If detect = TRUE, object works much like Phantom, but triggers collision_start and collision_end events when other objects start and stop interpenetrating.
+Must be applied to the root prim.
+ </string>
+ <string name="LSLTipText_llResetOtherScript" translate="false">
+llResetOtherScript(string name)
+Resets script name
+ </string>
+ <string name="LSLTipText_llGetScriptState" translate="false">
+integer llGetScriptState(string name)
+Returns TRUE if the script name is running
+ </string>
+ <string name="LSLTipText_llRemoteLoadScript" translate="false">
+DEPRECATED! Please use llRemoteLoadScriptPin instead.
+ </string>
+ <string name="LSLTipText_llSetRemoteScriptAccessPin" translate="false">
+llSetRemoteScriptAccessPin(integer pin)
+If pin is set to a non-zero number, allows a prim to have scripts remotely loaded via llRemoteLoadScriptPin when it passes in the correct pin. Otherwise, llRemoteLoadScriptPin is ignored.
+ </string>
+ <string name="LSLTipText_llRemoteLoadScriptPin" translate="false">
+llRemoteLoadScriptPin(key target, string name, integer pin, integer running, integer start_param)
+Copies script name onto target, if the owner of this scripted object can modify target and is in the same region, and the matching pin is used.
+If running == TRUE, starts the script with start_param
+ </string>
+ <string name="LSLTipText_llOpenRemoteDataChannel" translate="false">
+llOpenRemoteDataChannel()
+Creates a channel to listen for XML-RPC calls, and will trigger a remote_data event with channel id once it is available
+ </string>
+ <string name="LSLTipText_llSendRemoteData" translate="false">
+key llSendRemoteData(key channel, string dest, integer idata, string sdata)
+Sends an XML-RPC request to dest through channel with payload of channel (in a string), integer idata and string sdata.
+Returns a key that is the message_id for the resulting remote_data events.
+ </string>
+ <string name="LSLTipText_llRemoteDataReply" translate="false">
+llRemoteDataReply(key channel, key message_id, string sdata, integer idata)
+Sends an XML-RPC reply to message_id on channel with payload of string sdata and integer idata
+ </string>
+ <string name="LSLTipText_llCloseRemoteDataChannel" translate="false">
+llCloseRemoteDataChannel(key channel)
+Closes XML-RPC channel
+ </string>
+ <string name="LSLTipText_llMD5String" translate="false">
+string llMD5String(string src, integer nonce)
+Returns a string of 32 hex characters that is a RSA Data Security, Inc. MD5 Message-Digest Algorithm of src with nonce
+ </string>
+ <string name="LSLTipText_llSetPrimitiveParams" translate="false">
+llSetPrimitiveParams(list rules)
+Sets the prim&apos;s parameters according to rules
+ </string>
+ <string name="LSLTipText_llStringToBase64" translate="false">
+string llStringToBase64(string str)
+Converts a string to the Base64 representation of the string
+ </string>
+ <string name="LSLTipText_llBase64ToString" translate="false">
+string llBase64ToString(string str)
+Converts a Base64 string to a conventional string.
+If the conversion creates any unprintable characters, they are converted to spaces.
+ </string>
+ <string name="LSLTipText_llXorBase64Strings" translate="false">
+string llXorBase64Strings(string s1, string s2)
+DEPRECATED! Please use llXorBase64StringsCorrect instead.
+Incorrectly performs an exclusive or on two Base64 strings and returns a Base64 string. s2 repeats if it is shorter than s1. Retained for backwards compatability.
+ </string>
+ <string name="LSLTipText_llRemoteDataSetRegion" translate="false">
+llRemoteDataSetRegion()
+DEPRECATED! Please use llOpenRemoteDataChannel instead.
+If an object using remote data channels changes regions, you must call this function to reregister the remote data channels. This call is not needed if the prim does not change regions.
+ </string>
+ <string name="LSLTipText_llLog10" translate="false">
+float llLog10(float val)
+Returns the base 10 logarithm of val. Returns zero if val &lt;= 0.
+ </string>
+ <string name="LSLTipText_llLog" translate="false">
+float llLog(float val)
+Returns the natural logarithm of val. Returns zero if val &lt;= 0.
+ </string>
+ <string name="LSLTipText_llGetAnimationList" translate="false">
+list llGetAnimationList(key id)
+Returns a list of keys of playing animations for avatar described by id
+ </string>
+ <string name="LSLTipText_llSetParcelMusicURL" translate="false">
+llSetParcelMusicURL(string url)
+Sets the streaming audio URL for the parcel which the object is on
+ </string>
+ <string name="LSLTipText_llGetRootPosition" translate="false">
+vector llGetRootPosition()
+Returns the position (in region coordinates) of the root prim of the object which the script is attached to
+ </string>
+ <string name="LSLTipText_llGetRootRotation" translate="false">
+rotation llGetRootRotation()
+Returns the rotation (relative to the region) of the root prim of the object which the script is attached to
+ </string>
+ <string name="LSLTipText_llGetObjectDesc" translate="false">
+string llGetObjectDesc()
+Returns the description of the prim the script is attached to
+ </string>
+ <string name="LSLTipText_llSetObjectDesc" translate="false">
+llSetObjectDesc(string name)
+Sets the prim&apos;s description
+ </string>
+ <string name="LSLTipText_llGetCreator" translate="false">
+key llGetCreator()
+Returns a key for the creator of the prim
+ </string>
+ <string name="LSLTipText_llGetTimestamp" translate="false">
+string llGetTimestamp()
+Returns the timestamp in the UTC time zone in the format: YYYY-MM-DDThh:mm:ss.ff..fZ
+ </string>
+ <string name="LSLTipText_llSetLinkAlpha" translate="false">
+llSetLinkAlpha(integer linknumber, float alpha, integer face)
+If a prim exists in the link chain at linknumber, sets face to alpha
+ </string>
+ <string name="LSLTipText_llGetNumberOfPrims" translate="false">
+integer llGetNumberOfPrims()
+Returns the number of prims in a link set the script is attached to
+ </string>
+ <string name="LSLTipText_llGetNumberOfNotecardLines" translate="false">
+key llGetNumberOfNotecardLines(string name)
+Returns number of lines in notecard name via the dataserver event (cast return value to integer)
+ </string>
+ <string name="LSLTipText_llGetBoundingBox" translate="false">
+list llGetBoundingBox(key object)
+Returns the bounding box around the object (including any linked prims) relative to its root prim, in a list in the format [ (vector) min_corner, (vector) max_corner ]
+ </string>
+ <string name="LSLTipText_llGetGeometricCenter" translate="false">
+vector llGetGeometricCenter()
+Returns the geometric center of the linked set the script is attached to.
+ </string>
+ <string name="LSLTipText_llGetPrimitiveParams" translate="false">
+list llGetPrimitiveParams(list params)
+Returns the primitive parameters specified in the params list.
+ </string>
+ <string name="LSLTipText_llIntegerToBase64" translate="false">
+string llIntegerToBase64(integer number)
+Returns a string that is a Base64 big endian encode of number
+ </string>
+ <string name="LSLTipText_llBase64ToInteger" translate="false">
+integer llBase64ToInteger(string str)
+Returns an integer that is the str Base64 decoded as a big endian integer
+ </string>
+ <string name="LSLTipText_llGetGMTclock" translate="false">
+float llGetGMTclock()
+Returns the time in seconds since midnight GMT
+ </string>
+ <string name="LSLTipText_llGetSimulatorHostname" translate="false">
+string llGetSimulatorHostname()
+Returns the hostname of the machine which the script is running on (same as string in viewer Help dialog)
+ </string>
+ <string name="LSLTipText_llSetLocalRot" translate="false">
+llSetLocalRot(rotation rot)
+Sets the rotation of a child prim relative to the root prim
+ </string>
+ <string name="LSLTipText_llParseStringKeepNulls" translate="false">
+list llParseStringKeepNulls(string src, list separators, list spacers)
+Breaks src into a list, discarding separators, keeping spacers, keeping any null values generated.
+(separators and spacers must be lists of strings, maximum of 8 each)
+ </string>
+ <string name="LSLTipText_llRezAtRoot" translate="false">
+llRezAtRoot(string inventory, vector pos, vector vel, rotation rot, integer param)
+Instantiates owner&apos;s inventory object rotated to rot with its root at pos, moving at vel, using param as the start parameter
+ </string>
+ <string name="LSLTipText_llGetObjectPermMask" translate="false">
+integer llGetObjectPermMask(integer mask)
+Returns the requested permission mask for the root object the task is attached to
+ </string>
+ <string name="LSLTipText_llSetObjectPermMask" translate="false">
+llSetObjectPermMask(integer mask, integer value)
+Sets the given permission mask to the new value on the root object the task is attached to (requires God Mode)
+ </string>
+ <string name="LSLTipText_llGetInventoryPermMask" translate="false">
+integer llGetInventoryPermMask(string item, integer mask)
+Returns the requested permission mask for the inventory item
+ </string>
+ <string name="LSLTipText_llSetInventoryPermMask" translate="false">
+llSetInventoryPermMask(string item, integer mask, integer value)
+Sets the given permission mask to the new value on the inventory item (requires God Mode)
+ </string>
+ <string name="LSLTipText_llGetInventoryCreator" translate="false">
+key llGetInventoryCreator(string item)
+Returns a key for the creator of the inventory item
+ </string>
+ <string name="LSLTipText_llOwnerSay" translate="false">
+llOwnerSay(string msg)
+Says msg to owner only. (Owner must be in the same region.)
+ </string>
+ <string name="LSLTipText_llRequestSimulatorData" translate="false">
+key llRequestSimulatorData(string simulator, integer data)
+Requests data about simulator. When data is available the dataserver event will be raised.
+ </string>
+ <string name="LSLTipText_llForceMouselook" translate="false">
+llForceMouselook(integer mouselook)
+If mouselook is TRUE, any avatar that sits upon the prim will be forced into mouselook mode
+ </string>
+ <string name="LSLTipText_llGetObjectMass" translate="false">
+float llGetObjectMass(key id)
+Returns the mass of the avatar or object in the region
+ </string>
+ <string name="LSLTipText_llListReplaceList" translate="false">
+list llListReplaceList(list dest, list src, integer start, integer end)
+Returns a list that is dest with start through end removed and src inserted at start
+ </string>
+ <string name="LSLTipText_llLoadURL" translate="false">
+llLoadURL(key avatar, string message, string url)
+Shows a dialog to avatar offering to load the web page at url with a message.
+If user clicks yes, launches the page in their web browser.
+ </string>
+ <string name="LSLTipText_llParcelMediaCommandList" translate="false">
+llParcelMediaCommandList(list command)
+Sends a list of commands, some with arguments, to a parcel to control the playback of movies and other media
+ </string>
+ <string name="LSLTipText_llParcelMediaQuery" translate="false">
+list llParcelMediaQuery(list query)
+Returns a list containing results of the sent query
+ </string>
+ <string name="LSLTipText_llModPow" translate="false">
+integer llModPow(integer a, integer b, integer c)
+Returns a raised to the b power, mod c. ( (a**b)%c )
+b is capped at 0xFFFF (16 bits).
+ </string>
+ <string name="LSLTipText_llGetInventoryType" translate="false">
+integer llGetInventoryType(string name)
+Returns the type of the inventory item name
+ </string>
+ <string name="LSLTipText_llSetPayPrice" translate="false">
+llSetPayPrice(integer price, list quick_pay_buttons)
+Sets the default amount on the dialog that appears when someone chooses to pay this prim
+ </string>
+ <string name="LSLTipText_llGetCameraPos" translate="false">
+vector llGetCameraPos()
+Returns the current camera position for the agent the task has permissions for
+ </string>
+ <string name="LSLTipText_llGetCameraRot" translate="false">
+rotation llGetCameraRot()
+Returns the current camera orientation for the agent the task has permissions for
+ </string>
+ <string name="LSLTipText_llSetPrimURL" translate="false">
+llSetPrimURL(string url)
+Updates the URL for the web page shown on the sides of the object
+ </string>
+ <string name="LSLTipText_llRefreshPrimURL" translate="false">
+llRefreshPrimURL()
+Reloads the web page shown on the sides of the object
+ </string>
+ <string name="LSLTipText_llEscapeURL" translate="false">
+string llEscapeURL(string url)
+Returns an escaped/encoded version of url, replacing spaces with %20 etc.
+ </string>
+ <string name="LSLTipText_llUnescapeURL" translate="false">
+string llUnescapeURL(string url)
+Returns an unescaped/ unencoded version of url, replacing %20 with spaces etc.
+ </string>
+ <string name="LSLTipText_llMapDestination" translate="false">
+llMapDestination(string simname, vector pos, vector look_at)
+Opens the World Map centered on the region simname with pos highlighted. (NOTE: look_at currently does nothing.)
+Only works for scripts attached to avatar, or during touch events.
+ </string>
+ <string name="LSLTipText_llAddToLandBanList" translate="false">
+llAddToLandBanList(key avatar, float hours)
+Adds avatar to the land ban list for hours, or indefinitely if hours is 0
+ </string>
+ <string name="LSLTipText_llRemoveFromLandPassList" translate="false">
+llRemoveFromLandPassList(key avatar)
+Removes avatar from the land pass list
+ </string>
+ <string name="LSLTipText_llRemoveFromLandBanList" translate="false">
+llRemoveFromLandBanList(key avatar)
+Removes avatar from the land ban list
+ </string>
+ <string name="LSLTipText_llSetCameraParams" translate="false">
+llSetCameraParams(list rules)
+Sets multiple camera parameters at once.
+List format is [ rule1, data1, rule2, data2 . . . rulen, datan ]
+ </string>
+ <string name="LSLTipText_llClearCameraParams" translate="false">
+llClearCameraParams()
+Resets all camera parameters to default values and turns off scripted camera control
+ </string>
+ <string name="LSLTipText_llListStatistics" translate="false">
+float llListStatistics(integer operation, list src)
+Performs statistical aggregate functions on list src using LIST_STAT_* operations
+ </string>
+ <string name="LSLTipText_llGetUnixTime" translate="false">
+integer llGetUnixTime()
+Returns the number of seconds elapsed since 00:00 hours, Jan 1, 1970 UTC from the system clock
+ </string>
+ <string name="LSLTipText_llGetParcelFlags" translate="false">
+integer llGetParcelFlags(vector pos)
+Returns a mask of the parcel flags (PARCEL_FLAG_*) for the parcel that includes the point pos
+ </string>
+ <string name="LSLTipText_llGetRegionFlags" translate="false">
+integer llGetRegionFlags()
+Returns the region flags (REGION_FLAG_*) for the region the object is in
+ </string>
+ <string name="LSLTipText_llXorBase64StringsCorrect" translate="false">
+string llXorBase64StringsCorrect(string s1, string s2)
+Correctly performs an exclusive or on two Base64 strings and returns a Base64 string.
+s2 repeats if it is shorter than s1.
+ </string>
+ <string name="LSLTipText_llHTTPRequest" translate="false">
+llHTTPRequest(string url, list parameters, string body)
+Sends an HTTP request to the specified url with the body of the request and parameters
+ </string>
+ <string name="LSLTipText_llResetLandBanList" translate="false">
+llResetLandBanList()
+Removes all Residents from the land ban list
+ </string>
+ <string name="LSLTipText_llResetLandPassList" translate="false">
+llResetLandPassList()
+Removes all Residents from the land access/pass list
+ </string>
+ <string name="LSLTipText_llGetObjectPrimCount" translate="false">
+integer llGetObjectPrimCount(key object_id)
+Returns the total number of prims for an object in the region
+ </string>
+ <string name="LSLTipText_llGetParcelPrimOwners" translate="false">
+list llGetParcelPrimOwners(vector pos)
+Returns a list of all Residents who own objects on the parcel at pos and with individual prim counts.
+Requires owner-like permissions for the parcel.
+ </string>
+ <string name="LSLTipText_llGetParcelPrimCount" translate="false">
+integer llGetParcelPrimCount(vector pos, integer category, integer sim_wide)
+Returns the number of prims on the parcel at pos of the given category.
+Categories: PARCEL_COUNT_TOTAL, _OWNER, _GROUP, _OTHER, _SELECTED, _TEMP
+ </string>
+ <string name="LSLTipText_llGetParcelMaxPrims" translate="false">
+integer llGetParcelMaxPrims(vector pos, integer sim_wide)
+Returns the maximum number of prims allowed on the parcel at pos
+ </string>
+ <string name="LSLTipText_llGetParcelDetails" translate="false">
+ list llGetParcelDetails(vector pos, list params)
+ Returns the parcel details specified in params for the parcel at pos.
+ Params is one or more of: PARCEL_DETAILS_NAME, _DESC, _OWNER, _GROUP, _AREA, _ID, _SEE_AVATARS
+ </string>
+ <string name="LSLTipText_llSetLinkPrimitiveParams" translate="false">
+llSetLinkPrimitiveParams(integer linknumber, list rules)
+Sets primitive parameters for linknumber based on rules
+ </string>
+ <string name="LSLTipText_llSetLinkTexture" translate="false">
+llSetLinkTexture(integer linknumber, string texture, integer face)
+Sets the texture of face for a task that exists in the link chain at linknumber
+ </string>
+ <string name="LSLTipText_llStringTrim" translate="false">
+string llStringTrim(string src, integer trim_type)
+Trims the leading and/or trailing white spaces from a string.
+trim_type can be STRING_TRIM, STRING_TRIM_HEAD or STRING_TRIM_TAIL.
+ </string>
+ <string name="LSLTipText_llRegionSay" translate="false">
+llRegionSay(integer channel, string msg)
+Broadcasts msg on channel (not 0) that can be heard anywhere in the region by a script listening on channel
+ </string>
+ <string name="LSLTipText_llGetObjectDetails" translate="false">
+list llGetObjectDetails(key id, list params)
+Returns the object details specified in params for the object with key id.
+Params are OBJECT_NAME, _DESC, _POS, _ROT, _VELOCITY, _OWNER, _GROUP, _CREATOR
+ </string>
+ <string name="LSLTipText_llSetClickAction" translate="false">
+llSetClickAction(integer action)
+Sets the action performed when a prim is clicked upon
+ </string>
+ <string name="LSLTipText_llGetRegionAgentCount" translate="false">
+integer llGetRegionAgentCount()
+Returns the number of avatars in the region
+ </string>
+ <string name="LSLTipText_llTextBox" translate="false">
+llTextBox(key avatar, string message, integer chat_channel)
+Shows a window on the avatar&apos;s screen with the message.
+It contains a text box for input, and if entered that text is chatted on chat_channel.
+ </string>
+ <string name="LSLTipText_llGetAgentLanguage" translate="false">
+string llGetAgentLanguage(key avatar)
+Returns the language code of the preferred interface language of the avatar
+ </string>
+ <string name="LSLTipText_llDetectedTouchUV" translate="false">
+vector llDetectedTouchUV(integer index)
+Returns the u and v coordinates in the first two components of a vector, for the texture coordinates where the prim was touched in a triggered touch event
+ </string>
+ <string name="LSLTipText_llDetectedTouchFace" translate="false">
+integer llDetectedTouchFace(integer index)
+Returns the index of the face where the avatar clicked in a triggered touch event
+ </string>
+ <string name="LSLTipText_llDetectedTouchPos" translate="false">
+vector llDetectedTouchPos(integer index)
+Returns the position where the object was touched in a triggered touch event
+ </string>
+ <string name="LSLTipText_llDetectedTouchNormal" translate="false">
+vector llDetectedTouchNormal(integer index)
+Returns the surface normal for a triggered touch event
+ </string>
+ <string name="LSLTipText_llDetectedTouchBinormal" translate="false">
+vector llDetectedTouchBinormal(integer index)
+Returns the surface binormal for a triggered touch event
+ </string>
+ <string name="LSLTipText_llDetectedTouchST" translate="false">
+vector llDetectedTouchST(integer index)
+Returns the s and t coordinates in the first two components of a vector, for the surface coordinates where the prim was touched in a triggered touch event
+ </string>
+ <string name="LSLTipText_llSHA1String" translate="false">
+string llSHA1String(string src)
+Returns a string of 40 hex characters that is the SHA1 security Hash of src
+ </string>
+ <string name="LSLTipText_llGetFreeURLs" translate="false">
+integer llGetFreeURLs()
+Returns the number of available URLs for the current script
+ </string>
+ <string name="LSLTipText_llRequestURL" translate="false">
+key llRequestURL()
+Requests one HTTP:// url for use by this object.
+An http_request event is triggered with the results.
+ </string>
+ <string name="LSLTipText_llRequestSecureURL" translate="false">
+key llRequestSecureURL()
+Requests one HTTPS:// (SSL) url for use by this object.
+An http_request event is triggered with the results.
+ </string>
+ <string name="LSLTipText_llReleaseURL" translate="false">
+llReleaseURL(string url)
+Releases the specified URL, it will no longer be usable
+ </string>
+ <string name="LSLTipText_llHTTPResponse" translate="false">
+llHTTPResponse(key request_id, integer status, string body)
+Responds to request_id with status and body
+ </string>
+ <string name="LSLTipText_llGetHTTPHeader" translate="false">
+string llGetHTTPHeader(key request_id, string header)
+Returns the value for header for request_id
+ </string>
+ <string name="LSLTipText_llSetPrimMediaParams" translate="false">
+llSetPrimMediaParams(integer face, list params)
+Sets the media params for a particular face on an object. If media is not already on this object, add it.
+List is a set of name/value pairs in no particular order. Params not specified are unchanged, or if new media is added then set to the default specified.
+The possible names are below, along with the types of values and what they mean.
+ </string>
+ <string name="LSLTipText_llGetPrimMediaParams" translate="false">
+list llGetPrimMediaParams(integer face, list params)
+Returns the media params for a particular face on an object, given the desired list of names, in the order requested.
+(Returns an empty list if no media exists on the face.)
+ </string>
+ <string name="LSLTipText_llClearPrimMedia" translate="false">
+llClearPrimMedia(integer face)
+Clears (deletes) the media and all params from the given face.
+ </string>
+<string name="LSLTipText_llSetLinkPrimitiveParamsFast" translate="false">
+llSetLinkPrimitiveParamsFast(integer linknumber,list rules)
+Set primitive parameters for linknumber based on rules.
+</string>
+<string name="LSLTipText_llGetLinkPrimitiveParams" translate="false">
+llGetLinkPrimitiveParams(integer linknumber,list rules)
+Get primitive parameters for linknumber based on rules.
+</string>
+<string name="LSLTipText_llLinkParticleSystem" translate="false">
+llLinkParticleSystem(integer linknumber,list rules)
+Creates a particle system based on rules. Empty list removes particle system from object.
+List format is [ rule1, data1, rule2, data2 . . . rulen, datan ].
+</string>
+<string name="LSLTipText_llSetLinkTextureAnim" translate="false">
+llSetLinkTextureAnim(integer link, integer mode, integer face, integer sizex, integer sizey, float start, float length, float rate)
+Animate the texture on the specified prim's face/faces.
+</string>
+<string name="LSLTipText_llGetLinkNumberOfSides" translate="false">
+integer llGetLinkNumberOfSides(integer link)
+Returns the number of sides of the specified linked prim.
+</string>
+<string name="LSLTipText_llGetUsername" translate="false">
+string llGetUsername(key id)
+Returns the single-word username of an avatar, iff the avatar is in the current region, otherwise the empty string.
+</string>
+<string name="LSLTipText_llRequestUsername" translate="false">
+key llRequestUsername(key id)
+Requests single-word username of an avatar. When data is available the dataserver event will be raised.
+</string>
+<string name="LSLTipText_llGetDisplayName" translate="false">
+ string llGetDisplayName(key id)
+ Returns the name of an avatar, iff the avatar is in the current simulator, and the name has been cached, otherwise the same as llGetUsername. Use llRequestDisplayName if you absolutely must have the display name.
+</string>
+<string name="LSLTipText_llRequestDisplayName" translate="false">
+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>
+ <string name="AvatarSetAway">Away</string>
+ <string name="AvatarSetNotBusy">Not Busy</string>
+ <string name="AvatarSetBusy">Busy</string>
+
+ <!-- Wearable Types -->
+ <string name="shape">Shape</string>
+ <string name="skin">Skin</string>
+ <string name="hair">Hair</string>
+ <string name="eyes">Eyes</string>
+ <string name="shirt">Shirt</string>
+ <string name="pants">Pants</string>
+ <string name="shoes">Shoes</string>
+ <string name="socks">Socks</string>
+ <string name="jacket">Jacket</string>
+ <string name="gloves">Gloves</string>
+ <string name="undershirt">Undershirt</string>
+ <string name="underpants">Underpants</string>
+ <string name="skirt">Skirt</string>
+ <string name="alpha">Alpha</string>
+ <string name="tattoo">Tattoo</string>
+ <string name="physics">Physics</string>
+ <string name="invalid">invalid</string>
+ <string name="none">none</string>
+
+ <!-- Not Worn Wearable Types -->
+ <string name="shirt_not_worn">Shirt not worn</string>
+ <string name="pants_not_worn">Pants not worn</string>
+ <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>
+
+ <!-- Create new wearable of the specified type -->
+ <string name="create_new_shape">Create new shape</string>
+ <string name="create_new_skin">Create new skin</string>
+ <string name="create_new_hair">Create new hair</string>
+ <string name="create_new_eyes">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">Create new tattoo</string>
+ <string name="create_new_physics">Create new physics</string>
+ <string name="create_new_invalid">invalid</string>
+
+ <!-- Wearable List-->
+ <string name="NewWearable">New [WEARABLE_ITEM]</string>
+
+ <!-- LLGroupNotify -->
+ <!-- used in the construction of a Group Notice blue dialog box, buttons, tooltip etc. Seems to be no longer utilized by code in Viewer 2.0 -->
+ <string name="next">Next</string>
+ <string name="ok">OK</string>
+ <string name="GroupNotifyGroupNotice">Group Notice</string>
+ <string name="GroupNotifyGroupNotices">Group Notices</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>
+ <!-- start-up toast's string-->
+ <string name="StartUpNotifications">New notifications arrived while you were away.</string>
+ <!-- overflow toast's string-->
+ <string name="OverflowInfoChannelString">You have %d more notification</string>
+
+
+ <!-- body parts -->
+ <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>
+
+ <!-- slider -->
+ <string name="GraphicsQualityLow">Low</string>
+ <string name="GraphicsQualityMid">Mid</string>
+ <string name="GraphicsQualityHigh">High</string>
+
+ <!-- mouselook -->
+ <string name="LeaveMouselook">Press ESC to return to World View</string>
+
+ <!-- inventory -->
+ <string name="InventoryNoMatchingItems">Didn't find what you're looking for? Try [secondlife:///app/search/all/[SEARCH_TERM] Search].</string>
+ <string name="PlacesNoMatchingItems">Didn't find what you're looking for? Try [secondlife:///app/search/places/[SEARCH_TERM] Search].</string>
+ <string name="FavoritesNoMatchingItems">Drag a landmark here to add it to your favorites.</string>
+ <string name="InventoryNoTexture">You do not have a copy of this texture in your inventory</string>
+ <string name="InventoryInboxNoItems">Your Marketplace purchases will appear here. You may then drag them into your inventory to use them.</string>
+ <string name="MarketplaceURL">https://marketplace.[MARKETPLACE_DOMAIN_NAME]/</string>
+ <string name="MarketplaceURL_CreateStore">http://community.secondlife.com/t5/English-Knowledge-Base/Selling-in-the-Marketplace/ta-p/700193#Section_.4</string>
+ <string name="MarketplaceURL_Dashboard">https://marketplace.[MARKETPLACE_DOMAIN_NAME]/merchants/store/dashboard</string>
+ <string name="MarketplaceURL_Imports">https://marketplace.[MARKETPLACE_DOMAIN_NAME]/merchants/store/imports</string>
+ <string name="MarketplaceURL_LearnMore">https://marketplace.[MARKETPLACE_DOMAIN_NAME]/learn_more</string>
+ <string name="InventoryOutboxNotMerchantTitle">Anyone can sell items on the Marketplace.</string>
+ <string name="InventoryOutboxNotMerchantTooltip"></string>
+ <string name="InventoryOutboxNotMerchant">
+If you'd like to become a merchant, you'll need to [[MARKETPLACE_CREATE_STORE_URL] create a Marketplace store].
+ </string>
+ <string name="InventoryOutboxNoItemsTitle">Your outbox is empty.</string>
+ <string name="InventoryOutboxNoItemsTooltip"></string>
+ <string name="InventoryOutboxNoItems">
+Drag folders to this area and click "Send to Marketplace" to list them for sale on the [[MARKETPLACE_DASHBOARD_URL] Marketplace].
+ </string>
+
+ <string name="Marketplace Error None">No errors</string>
+ <string name="Marketplace Error Not Merchant">Error: Before sending items to the Marketplace you will need to set yourself up as a merchant (free of charge).</string>
+ <string name="Marketplace Error Empty Folder">Error: This folder has no contents.</string>
+ <string name="Marketplace Error Unassociated Products">Error: This item failed to upload because your merchant account has too many items unassociated with products. To fix this error, log in to the marketplace website and reduce your unassociated item count.</string>
+
+ <string name="Marketplace Error Object Limit">Error: This item contains too many objects. Fix this error by placing objects together in boxes to reduce the total count to less than 200.</string>
+ <string name="Marketplace Error Folder Depth">Error: This item contains too many levels of nested folders. Reorganize it to a maximum of 3 levels of nested folders.</string>
+ <string name="Marketplace Error Unsellable Item">Error: This item can not be sold on the marketplace.</string>
+ <string name="Marketplace Error Internal Import">Error: There was a problem with this item. Try again later.</string>
+
+ <string name="Open landmarks">Open landmarks</string>
+
+ <!-- use value="" because they have preceding spaces -->
+ <string name="no_transfer" value=" (no transfer)" />
+ <string name="no_modify" value=" (no modify)" />
+ <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">Loading contents...</string>
+ <string name="NoContents">No contents</string>
+ <string name="WornOnAttachmentPoint" value=" (worn on [ATTACHMENT_POINT])" />
+ <string name="ActiveGesture" value="[GESLABEL] (active)"/>
+ <!-- Inventory permissions -->
+ <string name="PermYes">Yes</string>
+ <string name="PermNo">No</string>
+
+ <!-- Gestures labels -->
+ <!-- use value="" because they have preceding spaces -->
+ <string name="Chat Message" value=" Chat : " />
+ <string name="Sound" value=" Sound : " />
+ <string name="Wait" value=" --- Wait : " />
+ <string name="AnimFlagStop" value=" Stop Animation : " />
+ <string name="AnimFlagStart" value=" Start Animation : " />
+ <string name="Wave" value=" Wave " />
+ <string name="GestureActionNone" value="None" />
+ <string name="HelloAvatar" value=" Hello, avatar! " />
+ <string name="ViewAllGestures" value=" View All &gt;&gt;" />
+ <string name="GetMoreGestures" value=" Get More &gt;&gt;" />
+
+ <!-- inventory filter -->
+ <!-- use value="" because they have preceding spaces -->
+ <string name="Animations" value=" Animations," />
+ <string name="Calling Cards" value=" Calling Cards," />
+ <string name="Clothing" value=" Clothing," />
+ <string name="Gestures" value=" Gestures," />
+ <string name="Landmarks" value=" Landmarks," />
+ <string name="Notecards" value=" Notecards," />
+ <string name="Objects" value=" Objects," />
+ <string name="Scripts" value=" Scripts," />
+ <string name="Sounds" value=" Sounds," />
+ <string name="Textures" value=" Textures," />
+ <string name="Snapshots" value=" Snapshots," />
+ <string name="No Filters" value="No " />
+ <string name="Since Logoff" value=" - Since Logoff" />
+
+ <!-- inventory folder -->
+ <string name="InvFolder My Inventory">My Inventory</string>
+ <string name="InvFolder Library">Library</string>
+ <string name="InvFolder Textures">Textures</string>
+ <string name="InvFolder Sounds">Sounds</string>
+ <string name="InvFolder Calling Cards">Calling Cards</string>
+ <string name="InvFolder Landmarks">Landmarks</string>
+ <string name="InvFolder Scripts">Scripts</string>
+ <string name="InvFolder Clothing">Clothing</string>
+ <string name="InvFolder Objects">Objects</string>
+ <string name="InvFolder Notecards">Notecards</string>
+ <string name="InvFolder New Folder">New Folder</string>
+ <string name="InvFolder Inventory">Inventory</string>
+ <string name="InvFolder Uncompressed Images">Uncompressed Images</string>
+ <string name="InvFolder Body Parts">Body Parts</string>
+ <string name="InvFolder Trash">Trash</string>
+ <string name="InvFolder Photo Album">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">Animations</string>
+ <string name="InvFolder Gestures">Gestures</string>
+ <string name="InvFolder Favorite">My Favorites</string>
+ <!-- historically default name of the Favorites folder can start from either "f" or "F" letter.
+ We should localize both of them with the same value -->
+ <string name="InvFolder favorite">My Favorites</string>
+ <string name="InvFolder Current Outfit">Current Outfit</string>
+ <string name="InvFolder Initial Outfits">Initial Outfits</string>
+ <string name="InvFolder My Outfits">My Outfits</string>
+ <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>
+ <string name="Attachments remain">Attachments ([COUNT] slots remain)</string>
+
+ <!-- inventory FVBridge -->
+ <!-- This is used in llpanelinventory.cpp when constructing a context menu for an item for Sale -->
+ <string name="Buy">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>
+
+ <!-- keyboard -->
+ <string name="KBShift">Shift</string>
+ <string name="KBCtrl">Ctrl</string>
+
+ <!-- Avatar Skeleton -->
+ <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">Mouth</string>
+ <string name="Chin">Chin</string>
+ <string name="Left Ear">Left Ear</string>
+ <string name="Right Ear">Right Ear</string>
+ <string name="Left Eyeball">Left Eyeball</string>
+ <string name="Right Eyeball">Right Eyeball</string>
+ <string name="Nose">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="Neck">Neck</string>
+ <string name="Avatar Center">Avatar Center</string>
+ <string name="Invalid Attachment">Invalid Attachment Point</string>
+
+ <!-- Avatar age computation, see LLDateUtil::ageFromDate -->
+ <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">Joined today</string>
+
+ <!-- AgeYearsA = singular,
+ AgeYearsB = plural,
+ AgeYearsC = plural for non-English languages like Russian
+ For example, LLTrans::getCountString("AgeYears", 3) is plural form B
+ in English and form C in Russian -->
+ <string name="AgeYearsA">[COUNT] year</string>
+ <string name="AgeYearsB">[COUNT] years</string>
+ <string name="AgeYearsC">[COUNT] years</string>
+ <string name="AgeMonthsA">[COUNT] month</string>
+ <string name="AgeMonthsB">[COUNT] months</string>
+ <string name="AgeMonthsC">[COUNT] months</string>
+ <string name="AgeWeeksA">[COUNT] week</string>
+ <string name="AgeWeeksB">[COUNT] weeks</string>
+ <string name="AgeWeeksC">[COUNT] weeks</string>
+ <string name="AgeDaysA">[COUNT] day</string>
+ <string name="AgeDaysB">[COUNT] days</string>
+ <string name="AgeDaysC">[COUNT] days</string>
+ <!-- Group member counts -->
+ <string name="GroupMembersA">[COUNT] member</string>
+ <string name="GroupMembersB">[COUNT] members</string>
+ <string name="GroupMembersC">[COUNT] members</string>
+
+ <!-- Account types, see LLAvatarPropertiesProcessor -->
+ <string name="AcctTypeResident">Resident</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>
+
+ <!-- HUD Position -->
+ <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>
+
+ <!-- compile queue-->
+ <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">Set Running Progress</string>
+ <string name="RunQueueStart">set running</string>
+ <string name="NotRunQueueTitle">Set Not Running Progress</string>
+ <string name="NotRunQueueStart">set not running</string>
+
+ <!-- compile comment text-->
+ <string name="CompileSuccessful">Compile successful!</string>
+ <string name="CompileSuccessfulSaving">Compile successful, saving...</string>
+ <string name="SaveComplete">Save complete.</string>
+ <string name="ObjectOutOfRange">Script (object out of range)</string>
+
+ <!-- god tools -->
+ <string name="GodToolsObjectOwnedBy">Object [OBJECT] owned by [OWNER]</string>
+
+ <!-- groups -->
+ <string name="GroupsNone">none</string>
+ <string name="Group" value=" (group)" />
+ <string name="Unknown">(Unknown)</string>
+ <string name="SummaryForTheWeek" value="Summary for this week, beginning on " />
+ <string name="NextStipendDay" value="The next stipend day is " />
+ <string name="GroupPlanningDate">[mthnum,datetime,utc]/[day,datetime,utc]/[year,datetime,utc]</string>
+ <string name="GroupIndividualShare" value=" Group Individual Share" />
+ <string name="GroupColumn" value=" Group" />
+ <string name="Balance">Balance</string>
+ <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>
+
+ <!-- floater IM bonus_info: When a Linden with Admin/god status receives a new IM this displays the estate (Mainland vs. teen grid) of the source avatar.
+ This is to help Lindens when answering questions. -->
+ <string name="IMParentEstate">parent estate</string>
+ <string name="IMMainland">mainland</string>
+ <string name="IMTeen">teen</string>
+
+ <!-- floater about land -->
+ <string name="Anyone">anyone</string>
+
+ <!-- floater region info -->
+ <!-- The following will replace variable [ALL_ESTATES] in notifications EstateAllowed*, EstateBanned*, EstateManager* -->
+ <string name="RegionInfoError">error</string>
+ <string name="RegionInfoAllEstatesOwnedBy">
+ all estates owned by [OWNER]
+ </string>
+ <string name="RegionInfoAllEstatesYouOwn">all estates that you own</string>
+ <string name="RegionInfoAllEstatesYouManage">
+ all estates that you manage for [OWNER]
+ </string>
+ <string name="RegionInfoAllowedResidents">Allowed Residents: ([ALLOWEDAGENTS], max [MAXACCESS])</string>
+ <string name="RegionInfoAllowedGroups">Allowed groups: ([ALLOWEDGROUPS], max [MAXACCESS])</string>
+
+ <!-- script limits floater -->
+ <string name="ScriptLimitsParcelScriptMemory">Parcel Script Memory</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">Left Eye</string>
+ <string name="ATTACH_REYE">Right Eye</string>
+ <string name="ATTACH_NOSE">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>
+
+ <!-- script editor -->
+ <string name="CursorPos">Line [LINE], Column [COLUMN]</string>
+
+ <!-- panel dir browser -->
+ <string name="PanelDirCountFound">[COUNT] found</string>
+ <string name="PanelDirTimeStr">[hour12,datetime,slt]:[min,datetime,slt] [ampm,datetime,slt]</string>
+
+ <!-- panel dir events -->
+ <string name="PanelDirEventsDateText">[mthnum,datetime,slt]/[day,datetime,slt]</string>
+
+ <!-- panel contents -->
+ <string name="PanelContentsTooltip">Content of object</string>
+ <string name="PanelContentsNewScript">New Script</string>
+
+ <!-- panel preferences general -->
+ <string name="BusyModeResponseDefault">The Resident you messaged is in &apos;busy mode&apos; which means they have requested not to be disturbed. Your message will still be shown in their IM panel for later viewing.</string>
+
+ <!-- Mute -->
+ <string name="MuteByName">(By name)</string>
+ <string name="MuteAgent">(Resident)</string>
+ <string name="MuteObject">(Object)</string>
+ <string name="MuteGroup">(Group)</string>
+ <string name="MuteExternal">(External)</string>
+
+ <!-- Region/Estate Covenant -->
+ <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: " /> <!-- use value="" to keep the trailing space -->
+ <string name="none_text" value=" (none) " />
+ <string name="never_text" value=" (never) " />
+
+ <!--Region Details-->
+ <string name="GroupOwned">Group Owned</string>
+ <string name="Public">Public</string>
+
+ <!-- Environment settings -->
+ <string name="LocalSettings">Local Settings</string>
+ <string name="RegionSettings">Region Settings</string>
+
+ <!-- panel classified -->
+ <string name="ClassifiedClicksTxt">Clicks: [TELEPORT] teleport, [MAP] map, [PROFILE] profile</string>
+ <string name="ClassifiedUpdateAfterPublish">(will update after publish)</string>
+
+ <!-- panel picks -->
+ <string name="NoPicksClassifiedsText">You haven't created any Picks or Classifieds. Click the Plus button below to create a Pick or Classified.</string>
+ <string name="NoAvatarPicksClassifiedsText">User has no picks or classifieds</string>
+ <string name="PicksClassifiedsLoadingText">Loading...</string>
+
+ <!-- Multi Preview Floater -->
+ <string name="MultiPreviewTitle">Preview</string>
+ <string name="MultiPropertiesTitle">Properties</string>
+
+ <!-- inventory offer -->
+ <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>
+
+ <!-- group money -->
+ <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="GroupMoneyDate">[weekday,datetime,utc] [mth,datetime,utc] [day,datetime,utc], [year,datetime,utc]</string>
+
+ <!-- viewer object -->
+ <string name="ViewerObjectContents">Contents</string>
+
+ <!-- Viewer menu -->
+ <string name="AcquiredItems">Acquired Items</string>
+ <string name="Cancel">Cancel</string>
+ <string name="UploadingCosts">Uploading [NAME] costs L$ [AMOUNT]</string>
+ <string name="BuyingCosts">Buying this costs L$ [AMOUNT]</string>
+ <string name="UnknownFileExtension">
+ Unknown file extension .%s
+Expected .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">Add to My Landmarks...</string>
+ <string name="EditLandmarkNavBarMenu">Edit my Landmark...</string>
+
+ <!-- menu accelerators -->
+ <string name="accel-mac-control">&#8963;</string>
+ <string name="accel-mac-command">&#8984;</string>
+ <string name="accel-mac-option">&#8997;</string>
+ <string name="accel-mac-shift">&#8679;</string>
+ <string name="accel-win-control">Ctrl+</string>
+ <string name="accel-win-alt">Alt+</string>
+ <string name="accel-win-shift">Shift+</string>
+
+ <!-- Previews -->
+ <string name="FileSaved">File Saved</string>
+ <string name="Receiving">Receiving</string>
+
+ <!-- status bar , Time -->
+ <string name="AM">AM</string>
+ <string name="PM">PM</string>
+ <string name="PST">PST</string>
+ <string name="PDT">PDT</string>
+
+ <!-- Directions, HUD -->
+ <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>
+
+ <!-- Search Category Strings -->
+ <string name="Any Category">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>
+
+ <!-- PARCEL_CATEGORY_UI_STRING -->
+ <string name="None">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">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="Shopping">Shopping</string> -->
+ <string name="Stage">Stage</string>
+ <string name="Other">Other</string>
+ <string name="Rental">Rental</string>
+ <string name="Any">Any</string>
+ <string name="You">You</string>
+
+ <!-- punctuations -->
+ <string name=":">:</string>
+ <string name=",">,</string>
+ <string name="...">...</string>
+ <string name="***">***</string>
+ <string name="(">(</string>
+ <string name=")">)</string>
+ <string name=".">.</string>
+ <string name="'">'</string>
+ <string name="---">---</string>
+
+ <!-- media -->
+ <string name="Multiple Media">Multiple Media</string>
+ <string name="Play Media">Play/Pause Media</string>
+
+ <!-- OSMessageBox messages -->
+ <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't make GL device context</string>
+ <string name="MBPixelFmtErr">Can't find suitable pixel format</string>
+ <string name="MBPixelFmtDescErr">Can't get pixel format description</string>
+ <string name="MBTrueColorWindow">
+ [APP_NAME] requires True Color (32-bit) to run.
+Please go to your computer's display settings and set the color mode to 32-bit.
+ </string>
+ <string name="MBAlpha">
+ [APP_NAME] is unable to run because it can'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't set pixel format</string>
+ <string name="MBGLContextErr">Can't create GL rendering context</string>
+ <string name="MBGLContextActErr">Can'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>
+
+ <!-- Avatar Shape Information -->
+<string name="5 O'Clock Shadow">5 O'Clock Shadow</string>
+
+<string name="All White">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">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">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>
+
+ <!-- Navigation bar location input control.
+ Strings are here because widget xml is not localizable -->
+ <string name="LocationCtrlAddLandmarkTooltip">Add to My Landmarks</string>
+ <string name="LocationCtrlEditLandmarkTooltip">Edit my Landmark</string>
+ <string name="LocationCtrlInfoBtnTooltip">See more info about the current location</string>
+ <string name="LocationCtrlComboBtnTooltip">My location history</string>
+ <string name="LocationCtrlForSaleTooltip">Buy this land</string>
+ <string name="LocationCtrlVoiceTooltip">Voice not available here</string>
+ <string name="LocationCtrlFlyTooltip">Flying not allowed</string>
+ <string name="LocationCtrlPushTooltip">No pushing</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="LocationCtrlSeeAVsTooltip">Avatars visible and chat allowed outside of this parcel</string>
+
+ <!-- Strings used by the (currently Linux) auto-updater app -->
+ <string name="UpdaterWindowTitle">
+ [APP_NAME] Update
+ </string>
+ <string name="UpdaterNowUpdating">
+ Now updating [APP_NAME]...
+ </string>
+ <string name="UpdaterNowInstalling">
+ Installing [APP_NAME]...
+ </string>
+ <string name="UpdaterUpdatingDescriptive">
+ Your [APP_NAME] Viewer is being updated to the latest release. This may take some time, so please be patient.
+ </string>
+ <string name="UpdaterProgressBarTextWithEllipses">
+ Downloading update...
+ </string>
+ <string name="UpdaterProgressBarText">
+ Downloading update
+ </string>
+ <string name="UpdaterFailDownloadTitle">
+ Failed to download update
+ </string>
+ <string name="UpdaterFailUpdateDescriptive">
+ An error occurred while updating [APP_NAME]. Please download the latest version from www.secondlife.com.
+ </string>
+ <string name="UpdaterFailInstallTitle">
+ Failed to install update
+ </string>
+ <string name="UpdaterFailStartTitle">
+ Failed to start viewer
+ </string>
+
+ <!-- System Messages -->
+ <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>
+
+ <!-- IM system messages -->
+ <string name="IM_logging_string">-- Instant message logging enabled --</string>
+ <string name="IM_typing_start_string">[NAME] is typing...</string>
+ <string name="Unnamed">(Unnamed)</string>
+ <string name="IM_moderated_chat_label">(Moderated: Voices off by default)</string>
+ <string name="IM_unavailable_text_label">Text chat is not available for this call.</string>
+ <string name="IM_muted_text_label">Your text chat has been disabled by a Group Moderator.</string>
+ <string name="IM_default_text_label">Click here to instant message.</string>
+ <string name="IM_to_label">To</string>
+ <string name="IM_moderator_label">(Moderator)</string>
+ <string name="Saved_message">(Saved [LONG_TIMESTAMP])</string>
+ <string name="IM_unblock_only_groups_friends">To see this message, you must uncheck &apos;Only friends and groups can call or IM me&apos; in Preferences/Privacy.</string>
+
+ <!-- voice calls -->
+ <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">
+ Joining voice call...
+ </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 Session Doesn't Exist)
+ </string>
+ <string name="only_user_message">
+ You are the only user in this session.
+ </string>
+ <string name="offline_message">
+ [NAME] is offline.
+ </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>
+ <!--Some times string name is getting from the body of server response.
+ For ex.: from gIMMgr::showSessionStartError in the LLViewerChatterBoxSessionStartReply::post.
+ In case of the EXT-3115 issue 'generic' is passed into the gIMMgr::showSessionStartError as a string name.
+ Also there are some other places where "generic" is used.
+ So, let add string with name="generic" with the same value as "generic_request_error" -->
+ <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">
+ The session no longer exists
+ </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>
+ <!--Some times string name is getting from the body of server response.
+ For ex.: from gIMMgr::showSessionStartError in the LLViewerChatterBoxSessionStartReply::post.
+ In case of the EXT-3562 issue 'muted' is passed into the gIMMgr::showSessionStartError as a string name.
+ So, let add string with name="muted" with the same value as "muted_error" -->
+ <string name="muted">
+ 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>
+ <!--Some times string name is getting from the body of server response.
+ For ex.: from gIMMgr::showSessionStartError in the LLViewerChatterBoxSessionStartReply::post.
+ In case of the EXT-3562 issue 'message' is passed into the gIMMgr::showSessionStartError as a string name.
+ So, let add string with name="message" with the same value as "message_session_event" -->
+ <string name="message">
+ Unable to send your message to the chat session with [RECIPIENT].
+ </string>
+ <string name="message_session_event">
+ Unable to send your message to the chat session with [RECIPIENT].
+ </string>
+ <string name="mute">
+ Error while moderating.
+ </string>
+ <!--Some times string name is getting from the body of server response.
+ For ex.: from gIMMgr::showSessionStartError in the LLViewerChatterBoxSessionStartReply::post.
+ In case of the EXT-3459 issue 'removed' is passed into the gIMMgr::showSessionStartError as a string name.
+ So, let add string with name="removed" with the same value as "removed_from_group" -->
+ <string name="removed">
+ 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="Home position set.">Home position set.</string>
+
+ <string name="voice_morphing_url">http://secondlife.com/landing/voicemorphing</string>
+
+ <!-- Financial operations strings -->
+ <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="you_paid_failure_ldollars">You failed to pay [NAME] L$[AMOUNT] [REASON].</string>
+ <string name="you_paid_failure_ldollars_no_info">You failed to pay L$[AMOUNT].</string>
+ <string name="you_paid_failure_ldollars_no_reason">You failed to pay [NAME] L$[AMOUNT].</string>
+ <string name="you_paid_failure_ldollars_no_name">You failed to pay L$[AMOUNT] [REASON].</string>
+ <string name="for item">for [ITEM]</string>
+ <string name="for a parcel of land">for a parcel of land</string>
+ <string name="for a land access pass">for a land access pass</string>
+ <string name="for deeding land">for deeding land</string>
+ <string name="to create a group">to create a group</string>
+ <string name="to join a group">to join a group</string>
+ <string name="to upload">to upload</string>
+ <string name="to publish a classified ad">to publish a classified ad</string>
+
+ <string name="giving">Giving L$ [AMOUNT]</string>
+ <string name="uploading_costs">Uploading costs L$ [AMOUNT]</string>
+ <string name="this_costs">This costs L$ [AMOUNT]</string>
+ <string name="buying_selected_land">Buying selected land for L$ [AMOUNT]</string>
+ <string name="this_object_costs">This object costs L$ [AMOUNT]</string>
+
+ <string name="group_role_everyone">Everyone</string>
+ <string name="group_role_officers">Officers</string>
+ <string name="group_role_owners">Owners</string>
+ <string name="group_member_status_online">Online</string>
+
+ <string name="uploading_abuse_report">Uploading...
+
+Abuse Report</string>
+
+ <!-- names for new inventory items-->
+ <string name="New Shape">New Shape</string>
+ <string name="New Skin">New Skin</string>
+ <string name="New Hair">New Hair</string>
+ <string name="New Eyes">New Eyes</string>
+ <string name="New Shirt">New Shirt</string>
+ <string name="New Pants">New Pants</string>
+ <string name="New Shoes">New Shoes</string>
+ <string name="New Socks">New Socks</string>
+ <string name="New Jacket">New Jacket</string>
+ <string name="New Gloves">New Gloves</string>
+ <string name="New Undershirt">New Undershirt</string>
+ <string name="New Underpants">New Underpants</string>
+ <string name="New Skirt">New Skirt</string>
+ <string name="New Alpha">New Alpha</string>
+ <string name="New Tattoo">New Tattoo</string>
+ <string name="New Physics">New Physics</string>
+ <string name="Invalid Wearable">Invalid Wearable</string>
+ <string name="New Gesture">New Gesture</string>
+ <string name="New Script">New Script</string>
+ <string name="New Note">New Note</string>
+ <string name="New Folder">New Folder</string>
+ <string name="Contents">Contents</string>
+ <string name="Gesture">Gesture</string>
+ <string name="Male Gestures">Male Gestures</string>
+ <string name="Female Gestures">Female Gestures</string>
+ <string name="Other Gestures">Other Gestures</string>
+ <string name="Speech Gestures">Speech Gestures</string>
+ <string name="Common Gestures">Common Gestures</string>
+ <!-- gestures -->
+ <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="/bow">/bow</string>
+ <string name="/clap">/clap</string>
+ <string name="/count">/count</string>
+ <string name="/extinguish">/extinguish</string>
+ <string name="/kmb">/kmb</string>
+ <string name="/muscle">/muscle</string>
+ <string name="/no">/no</string>
+ <string name="/no!">/no!</string>
+ <string name="/paper">/paper</string>
+ <string name="/pointme">/pointme</string>
+ <string name="/pointyou">/pointyou</string>
+ <string name="/rock">/rock</string>
+ <string name="/scissor">/scissor</string>
+ <string name="/smoke">/smoke</string>
+ <string name="/stretch">/stretch</string>
+ <string name="/whistle">/whistle</string>
+ <string name="/yes">/yes</string>
+ <string name="/yes!">/yes!</string>
+ <string name="afk">afk</string>
+ <string name="dance1">dance1</string>
+ <string name="dance2">dance2</string>
+ <string name="dance3">dance3</string>
+ <string name="dance4">dance4</string>
+ <string name="dance5">dance5</string>
+ <string name="dance6">dance6</string>
+ <string name="dance7">dance7</string>
+ <string name="dance8">dance8</string>
+
+ <!-- birth date format shared by avatar inspector and profile panels -->
+ <string name="AvatarBirthDateFormat">[mthnum,datetime,slt]/[day,datetime,slt]/[year,datetime,slt]</string>
+
+ <string name="DefaultMimeType">none/none</string>
+ <string name="texture_load_dimensions_error">Can't load images larger than [WIDTH]*[HEIGHT]</string>
+
+ <!-- language specific white-space characters, delimiters, spacers, item separation symbols -->
+ <string name="sentences_separator" value=" "></string>
+ <string name="words_separator" value=", "/>
+
+ <string name="server_is_down">
+ Despite our best efforts, something unexpected has gone wrong.
+
+ Please check status.secondlifegrid.net to see if there is a known problem with the service.
+ If you continue to experience problems, please check your network and firewall setup.
+ </string>
+
+ <!-- overriding datetime formating.
+ didn't translate if this is not needed for current localization
+ -->
+ <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>
+
+ <!-- currency formatting -->
+ <string name="LocalEstimateUSD">US$ [AMOUNT]</string>
+
+ <!-- Group Profile roles and powers -->
+ <string name="Membership">Membership</string>
+ <string name="Roles">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">Notices</string>
+ <string name="Chat">Chat</string>
+
+ <!-- Question strings for delete items notifications -->
+ <string name="DeleteItems">Delete selected items?</string>
+ <string name="DeleteItem">Delete selected item?</string>
+
+ <string name="EmptyOutfitText">There are no items in this outfit</string>
+
+ <!-- External editor status codes -->
+ <string name="ExternalEditorNotSet">Select an editor using the ExternalEditor setting.</string>
+ <string name="ExternalEditorNotFound">Cannot find the external editor you specified.
+Try enclosing path to the editor with double quotes.
+(e.g. "/path to my/editor" "%s")</string>
+ <string name="ExternalEditorCommandParseError">Error parsing the external editor command.</string>
+ <string name="ExternalEditorFailedToRun">External editor failed to run.</string>
+
+ <!-- Machine translation of chat messahes -->
+ <string name="TranslationFailed">Translation failed: [REASON]</string>
+ <string name="TranslationResponseParseError">Error parsing translation response.</string>
+
+ <!-- Key names begin -->
+ <string name="Esc">Esc</string>
+ <string name="Space">Space</string>
+ <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>
+ <!-- Key names end -->
+
+ <!-- llviewerwindow -->
+ <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>
+
+ <!-- commands -->
+
+ <string name="Command_AboutLand_Label">About land</string>
+ <string name="Command_Appearance_Label">Appearance</string>
+ <string name="Command_Avatar_Label">Avatar</string>
+ <string name="Command_Build_Label">Build</string>
+ <string name="Command_Chat_Label">Chat</string>
+ <string name="Command_Compass_Label">Compass</string>
+ <string name="Command_Destinations_Label">Destinations</string>
+ <string name="Command_Gestures_Label">Gestures</string>
+ <string name="Command_HowTo_Label">How to</string>
+ <string name="Command_Inventory_Label">Inventory</string>
+ <string name="Command_Map_Label">Map</string>
+ <string name="Command_Marketplace_Label">Marketplace</string>
+ <string name="Command_MiniMap_Label">Mini-map</string>
+ <string name="Command_Move_Label">Walk / run / fly</string>
+ <string name="Command_Outbox_Label">Merchant outbox</string>
+ <string name="Command_People_Label">People</string>
+ <string name="Command_Picks_Label">Picks</string>
+ <string name="Command_Places_Label">Places</string>
+ <string name="Command_Preferences_Label">Preferences</string>
+ <string name="Command_Profile_Label">Profile</string>
+ <string name="Command_Search_Label">Search</string>
+ <string name="Command_Snapshot_Label">Snapshot</string>
+ <string name="Command_Speak_Label">Speak</string>
+ <string name="Command_View_Label">Camera controls</string>
+ <string name="Command_Voice_Label">Voice settings</string>
+
+ <string name="Command_AboutLand_Tooltip">Information about the land you're visiting</string>
+ <string name="Command_Appearance_Tooltip">Change your avatar</string>
+ <string name="Command_Avatar_Tooltip">Choose a complete avatar</string>
+ <string name="Command_Build_Tooltip">Building objects and reshaping terrain</string>
+ <string name="Command_Chat_Tooltip">Chat with people nearby using text</string>
+ <string name="Command_Compass_Tooltip">Compass</string>
+ <string name="Command_Destinations_Tooltip">Destinations of interest</string>
+ <string name="Command_Gestures_Tooltip">Gestures for your avatar</string>
+ <string name="Command_HowTo_Tooltip">How to do common tasks</string>
+ <string name="Command_Inventory_Tooltip">View and use your belongings</string>
+ <string name="Command_Map_Tooltip">Map of the world</string>
+ <string name="Command_Marketplace_Tooltip">Go shopping</string>
+ <string name="Command_MiniMap_Tooltip">Show nearby people</string>
+ <string name="Command_Move_Tooltip">Moving your avatar</string>
+ <string name="Command_Outbox_Tooltip">Transfer items to your marketplace for sale</string>
+ <string name="Command_People_Tooltip">Friends, groups, and nearby people</string>
+ <string name="Command_Picks_Tooltip">Places to show as favorites in your profile</string>
+ <string name="Command_Places_Tooltip">Places you've saved</string>
+ <string name="Command_Preferences_Tooltip">Preferences</string>
+ <string name="Command_Profile_Tooltip">Edit or view your profile</string>
+ <string name="Command_Search_Tooltip">Find places, events, people</string>
+ <string name="Command_Snapshot_Tooltip">Take a picture</string>
+ <string name="Command_Speak_Tooltip">Speak with people nearby using your microphone</string>
+ <string name="Command_View_Tooltip">Changing camera angle</string>
+ <string name="Command_Voice_Tooltip">Volume controls for calls and people near you in world</string>
+
+ <string name="Toolbar_Bottom_Tooltip">currently in your bottom toolbar</string>
+ <string name="Toolbar_Left_Tooltip" >currently in your left toolbar</string>
+ <string name="Toolbar_Right_Tooltip" >currently in your right toolbar</string>
+
+ <!-- Mesh UI terms -->
+ <string name="Retain%">Retain%</string>
+ <string name="Detail">Detail</string>
+ <string name="Better Detail">Better Detail</string>
+ <string name="Surface">Surface</string>
+ <string name="Solid">Solid</string>
+ <string name="Wrap">Wrap</string>
+ <string name="Preview">Preview</string>
+ <string name="Normal">Normal</string>
+
+ <!-- Snapshot image quality levels -->
+ <string name="snapshot_quality_very_low">Very Low</string>
+ <string name="snapshot_quality_low">Low</string>
+ <string name="snapshot_quality_medium">Medium</string>
+ <string name="snapshot_quality_high">High</string>
+ <string name="snapshot_quality_very_high">Very High</string>
+
+ </strings>
diff --git a/indra/newview/skins/steam/xui/es/strings.xml b/indra/newview/skins/steam/xui/es/strings.xml
new file mode 100644
index 0000000000..2b36c39e7e
--- /dev/null
+++ b/indra/newview/skins/steam/xui/es/strings.xml
@@ -0,0 +1,4925 @@
+<?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="CAPITALIZED_APP_NAME">
+ SECOND LIFE
+ </string>
+ <string name="SUPPORT_SITE">
+ Portal de Soporte de Second Life
+ </string>
+ <string name="StartupDetectingHardware">
+ Identificando el hardware...
+ </string>
+ <string name="StartupLoading">
+ Instalando [APP_NAME]...
+ </string>
+ <string name="StartupClearingCache">
+ Limpiando la caché...
+ </string>
+ <string name="StartupInitializingTextureCache">
+ Iniciando la caché de las texturas...
+ </string>
+ <string name="StartupInitializingVFS">
+ Iniciando VFS...
+ </string>
+ <string name="StartupRequireDriverUpdate">
+ Error de inicialización de gráficos. Actualiza tu controlador de gráficos.
+ </string>
+ <string name="ProgressRestoring">
+ Restaurando...
+ </string>
+ <string name="ProgressChangingResolution">
+ Cambiando la resolución...
+ </string>
+ <string name="Fullbright">
+ Brillo al máximo (antiguo)
+ </string>
+ <string name="LoginInProgress">
+ Iniciando la sesión. [APP_NAME] debe de aparecer congelado. Por favor, espere.
+ </string>
+ <string name="LoginInProgressNoFrozen">
+ Iniciando la sesión...
+ </string>
+ <string name="LoginAuthenticating">
+ Autenticando
+ </string>
+ <string name="LoginMaintenance">
+ Realizando el mantenimiento de la cuenta...
+ </string>
+ <string name="LoginAttempt">
+ Ha fallado el intento previo de iniciar sesión. Iniciando sesión, intento [NUMBER]
+ </string>
+ <string name="LoginPrecaching">
+ Cargando el mundo...
+ </string>
+ <string name="LoginInitializingBrowser">
+ Iniciando el navegador web incorporado...
+ </string>
+ <string name="LoginInitializingMultimedia">
+ Iniciando multimedia...
+ </string>
+ <string name="LoginInitializingFonts">
+ Cargando las fuentes...
+ </string>
+ <string name="LoginVerifyingCache">
+ Comprobando los archivos de la caché (puede tardar entre 60 y 90 segundos)...
+ </string>
+ <string name="LoginProcessingResponse">
+ Procesando la respuesta...
+ </string>
+ <string name="LoginInitializingWorld">
+ Iniciando el mundo...
+ </string>
+ <string name="LoginDecodingImages">
+ Decodificando las imágenes...
+ </string>
+ <string name="LoginInitializingQuicktime">
+ Iniciando QuickTime...
+ </string>
+ <string name="LoginQuicktimeNotFound">
+ No se ha encontrado QuickTime. Imposible iniciarlo.
+ </string>
+ <string name="LoginQuicktimeOK">
+ QuickTime se ha iniciado adecuadamente.
+ </string>
+ <string name="LoginRequestSeedCapGrant">
+ Solicitando capacidades de la región...
+ </string>
+ <string name="LoginRetrySeedCapGrant">
+ Solicitando capacidades de la región, intento [NUMBER]...
+ </string>
+ <string name="LoginWaitingForRegionHandshake">
+ Esperando la conexión con la región...
+ </string>
+ <string name="LoginConnectingToRegion">
+ Conectando con la región...
+ </string>
+ <string name="LoginDownloadingClothing">
+ Descargando la ropa...
+ </string>
+ <string name="InvalidCertificate">
+ El servidor devolvió un certificado no válido o dañado. Ponte en contacto con el administrador de la cuadrícula.
+ </string>
+ <string name="CertInvalidHostname">
+ El nombre de host utilizado para acceder al servidor no es válido. Comprueba tu SLURL o el nombre de host de la cuadrícula.
+ </string>
+ <string name="CertExpired">
+ Parece que el certificado que devolvió la cuadrícula está caducado. Comprueba el reloj del sistema o consulta al administrador de la cuadrícula.
+ </string>
+ <string name="CertKeyUsage">
+ El certificado que devolvió el servidor no puede utilizarse para SSL. Ponte en contacto con el administrador de la cuadrícula.
+ </string>
+ <string name="CertBasicConstraints">
+ La cadena de certificado del servidor contenía demasiados certificados. Ponte en contacto con el administrador de la cuadrícula.
+ </string>
+ <string name="CertInvalidSignature">
+ No se pudo verificar la firma del certificado devuelta por el servidor de la cuadrícula. Ponte en contacto con el administrador de la cuadrícula.
+ </string>
+ <string name="LoginFailedNoNetwork">
+ Error de red: no se ha podido conectar; por favor, revisa tu conexión a internet.
+ </string>
+ <string name="LoginFailed">
+ Error en el inicio de sesión.
+ </string>
+ <string name="Quit">
+ Salir
+ </string>
+ <string name="create_account_url">
+ http://join.secondlife.com/index.php?sourceid=1206_steam&amp;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">
+ Las conexiones a Second Life se han restringido provisionalmente para garantizar que los usuarios que ya están conectados tengan la mejor experiencia posible.
+
+Durante este tiempo, las personas con cuentas gratuitas no podrán acceder a Second Life, ya que tienen prioridad los usuarios con una cuenta de pago.
+ </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>
+ <string name="SavingSettings">
+ Guardando tus configuraciones...
+ </string>
+ <string name="LoggingOut">
+ Cerrando sesión...
+ </string>
+ <string name="ShuttingDown">
+ Cerrando...
+ </string>
+ <string name="YouHaveBeenDisconnected">
+ Has sido desconectado de la región en la que estabas.
+ </string>
+ <string name="SentToInvalidRegion">
+ Has sido enviado a una región no válida.
+ </string>
+ <string name="TestingDisconnect">
+ Probando la desconexión del visor
+ </string>
+ <string name="TooltipPerson">
+ Persona
+ </string>
+ <string name="TooltipNoName">
+ (sin nombre)
+ </string>
+ <string name="TooltipOwner">
+ Propietario:
+ </string>
+ <string name="TooltipPublic">
+ Público
+ </string>
+ <string name="TooltipIsGroup">
+ (Grupo)
+ </string>
+ <string name="TooltipForSaleL$">
+ En venta: [AMOUNT] L$
+ </string>
+ <string name="TooltipFlagGroupBuild">
+ Construir el grupo
+ </string>
+ <string name="TooltipFlagNoBuild">
+ No construir
+ </string>
+ <string name="TooltipFlagNoEdit">
+ Construir el grupo
+ </string>
+ <string name="TooltipFlagNotSafe">
+ No seguro
+ </string>
+ <string name="TooltipFlagNoFly">
+ No volar
+ </string>
+ <string name="TooltipFlagGroupScripts">
+ Scripts el grupo
+ </string>
+ <string name="TooltipFlagNoScripts">
+ No scripts
+ </string>
+ <string name="TooltipLand">
+ Terreno:
+ </string>
+ <string name="TooltipMustSingleDrop">
+ Aquí se puede arrastrar sólo un ítem
+ </string>
+ <string name="TooltipPrice" value="[AMOUNT] L$:"/>
+ <string name="TooltipOutboxDragToWorld">
+ No puedes colocar objetos en tu buzón de salida de comerciante
+ </string>
+ <string name="TooltipOutboxNoTransfer">
+ Uno o varios de estos objetos no se pueden vender o transferir.
+ </string>
+ <string name="TooltipOutboxNotInInventory">
+ Tu buzón de salida de comerciante sólo puede aceptar objetos procedentes directamente de tu inventario
+ </string>
+ <string name="TooltipOutboxWorn">
+ No puedes poner artículos que llevas puestos en el buzón de salida de comerciante
+ </string>
+ <string name="TooltipOutboxCallingCard">
+ No puedes poner tarjetas de visita en tu buzón de salida de comerciante
+ </string>
+ <string name="TooltipOutboxFolderLevels">
+ La profundidad de carpetas anidadas excede de 3
+ </string>
+ <string name="TooltipOutboxTooManyFolders">
+ El número de subcarpetas de la carpeta de nivel superior excede de 20
+ </string>
+ <string name="TooltipOutboxTooManyObjects">
+ El número de elementos de la carpeta de nivel superior excede de 200
+ </string>
+ <string name="TooltipDragOntoOwnChild">
+ No puedes mover una carpeta a su carpeta secundaria
+ </string>
+ <string name="TooltipDragOntoSelf">
+ No puedes mover una carpeta dentro de sí misma
+ </string>
+ <string name="TooltipHttpUrl">
+ Pulsa para ver esta página web
+ </string>
+ <string name="TooltipSLURL">
+ Pulsa para ver la información de este lugar
+ </string>
+ <string name="TooltipAgentUrl">
+ Pulsa para ver el perfil del Residente
+ </string>
+ <string name="TooltipAgentInspect">
+ Obtén más información acerca de este residente.
+ </string>
+ <string name="TooltipAgentMute">
+ Pulsa para silenciar a este Residente
+ </string>
+ <string name="TooltipAgentUnmute">
+ Pulsa para quitar el silencio a este Residente
+ </string>
+ <string name="TooltipAgentIM">
+ Pulsa para enviar un MI a este Residente
+ </string>
+ <string name="TooltipAgentPay">
+ Pulsa para pagar a este Residente
+ </string>
+ <string name="TooltipAgentOfferTeleport">
+ Pulsa para enviar una petición de teleporte a este Residente
+ </string>
+ <string name="TooltipAgentRequestFriend">
+ Pulsa para enviar una petición de amistad a este Residente
+ </string>
+ <string name="TooltipGroupUrl">
+ Pulsa para ver la descripción de este grupo
+ </string>
+ <string name="TooltipEventUrl">
+ Pulsa para ver la descripción de este evento
+ </string>
+ <string name="TooltipClassifiedUrl">
+ Pulsa para ver este clasificado
+ </string>
+ <string name="TooltipParcelUrl">
+ Pulsa para ver la descripción de esta parcela
+ </string>
+ <string name="TooltipTeleportUrl">
+ Pulsa para teleportarte a esta posición
+ </string>
+ <string name="TooltipObjectIMUrl">
+ Pulsa para ver la descripción de este objeto
+ </string>
+ <string name="TooltipMapUrl">
+ Pulsa para ver en el mapa esta localización
+ </string>
+ <string name="TooltipSLAPP">
+ Pulsa para ejecutar el comando secondlife://
+ </string>
+ <string name="CurrentURL" value="URL actual: [CurrentURL]"/>
+ <string name="SLurlLabelTeleport">
+ Teleportarse a
+ </string>
+ <string name="SLurlLabelShowOnMap">
+ Mostrarla en el mapa
+ </string>
+ <string name="SLappAgentMute">
+ Silenciar
+ </string>
+ <string name="SLappAgentUnmute">
+ Quitar el silencio
+ </string>
+ <string name="SLappAgentIM">
+ MI
+ </string>
+ <string name="SLappAgentPay">
+ Pagar
+ </string>
+ <string name="SLappAgentOfferTeleport">
+ Ofrecer teleporte a
+ </string>
+ <string name="SLappAgentRequestFriend">
+ Petición de amistad
+ </string>
+ <string name="BUTTON_CLOSE_DARWIN">
+ Cerrar (⌘W)
+ </string>
+ <string name="BUTTON_CLOSE_WIN">
+ Cerrar (Ctrl+W)
+ </string>
+ <string name="BUTTON_CLOSE_CHROME">
+ Cerrar
+ </string>
+ <string name="BUTTON_RESTORE">
+ Maximizar
+ </string>
+ <string name="BUTTON_MINIMIZE">
+ Minimizar
+ </string>
+ <string name="BUTTON_TEAR_OFF">
+ Separar la ventana
+ </string>
+ <string name="BUTTON_DOCK">
+ Fijar
+ </string>
+ <string name="BUTTON_HELP">
+ Ver la Ayuda
+ </string>
+ <string name="Searching">
+ Buscando...
+ </string>
+ <string name="NoneFound">
+ No se ha encontrado.
+ </string>
+ <string name="RetrievingData">
+ Reintentando...
+ </string>
+ <string name="ReleaseNotes">
+ Notas de la versión
+ </string>
+ <string name="RELEASE_NOTES_BASE_URL">
+ http://wiki.secondlife.com/wiki/Release_Notes/
+ </string>
+ <string name="LoadingData">
+ Cargando...
+ </string>
+ <string name="AvatarNameNobody">
+ (nadie)
+ </string>
+ <string name="AvatarNameWaiting">
+ (esperando)
+ </string>
+ <string name="GroupNameNone">
+ (ninguno)
+ </string>
+ <string name="AvalineCaller">
+ Avaline: [ORDER]
+ </string>
+ <string name="AssetErrorNone">
+ No hay ningún error
+ </string>
+ <string name="AssetErrorRequestFailed">
+ Petición de asset: fallida
+ </string>
+ <string name="AssetErrorNonexistentFile">
+ Petición de asset: el archivo no existe
+ </string>
+ <string name="AssetErrorNotInDatabase">
+ Petición de asset: no se encontró el asset en la base de datos
+ </string>
+ <string name="AssetErrorEOF">
+ Fin del archivo
+ </string>
+ <string name="AssetErrorCannotOpenFile">
+ No puede abrirse el archivo
+ </string>
+ <string name="AssetErrorFileNotFound">
+ No se ha encontrado el archivo
+ </string>
+ <string name="AssetErrorTCPTimeout">
+ Tiempo de transferencia del archivo
+ </string>
+ <string name="AssetErrorCircuitGone">
+ Circuito desconectado
+ </string>
+ <string name="AssetErrorPriceMismatch">
+ No concuerda el precio en el visor y en el servidor
+ </string>
+ <string name="AssetErrorUnknownStatus">
+ Estado desconocido
+ </string>
+ <string name="texture">
+ la textura
+ </string>
+ <string name="sound">
+ el sonido
+ </string>
+ <string name="calling card">
+ la tarjeta de visita
+ </string>
+ <string name="landmark">
+ el hito
+ </string>
+ <string name="legacy script">
+ el script antiguo
+ </string>
+ <string name="clothing">
+ esa ropa
+ </string>
+ <string name="object">
+ el objeto
+ </string>
+ <string name="note card">
+ la nota
+ </string>
+ <string name="folder">
+ la carpeta
+ </string>
+ <string name="root">
+ la ruta
+ </string>
+ <string name="lsl2 script">
+ ese script de LSL2
+ </string>
+ <string name="lsl bytecode">
+ el código intermedio de LSL
+ </string>
+ <string name="tga texture">
+ esa textura tga
+ </string>
+ <string name="body part">
+ esa parte del cuerpo
+ </string>
+ <string name="snapshot">
+ la foto
+ </string>
+ <string name="lost and found">
+ Objetos Perdidos
+ </string>
+ <string name="targa image">
+ esa imagen targa
+ </string>
+ <string name="trash">
+ la Papelera
+ </string>
+ <string name="jpeg image">
+ esa imagen jpeg
+ </string>
+ <string name="animation">
+ la animación
+ </string>
+ <string name="gesture">
+ el gesto
+ </string>
+ <string name="simstate">
+ simstate
+ </string>
+ <string name="favorite">
+ ese favorito
+ </string>
+ <string name="symbolic link">
+ el enlace
+ </string>
+ <string name="symbolic folder link">
+ enlace de la carpeta
+ </string>
+ <string name="mesh">
+ red
+ </string>
+ <string name="AvatarEditingAppearance">
+ (Edición de Apariencia)
+ </string>
+ <string name="AvatarAway">
+ Ausente
+ </string>
+ <string name="AvatarBusy">
+ Ocupado
+ </string>
+ <string name="AvatarMuted">
+ Ignorado
+ </string>
+ <string name="anim_express_afraid">
+ Susto
+ </string>
+ <string name="anim_express_anger">
+ Enfado
+ </string>
+ <string name="anim_away">
+ Ausente
+ </string>
+ <string name="anim_backflip">
+ Salto mortal atrás
+ </string>
+ <string name="anim_express_laugh">
+ Carcajada
+ </string>
+ <string name="anim_express_toothsmile">
+ Gran sonrisa
+ </string>
+ <string name="anim_blowkiss">
+ Mandar un beso
+ </string>
+ <string name="anim_express_bored">
+ Aburrimiento
+ </string>
+ <string name="anim_bow">
+ Reverencia
+ </string>
+ <string name="anim_clap">
+ Aplauso
+ </string>
+ <string name="anim_courtbow">
+ Reverencia floreada
+ </string>
+ <string name="anim_express_cry">
+ Llanto
+ </string>
+ <string name="anim_dance1">
+ Baile 1
+ </string>
+ <string name="anim_dance2">
+ Baile 2
+ </string>
+ <string name="anim_dance3">
+ Baile 3
+ </string>
+ <string name="anim_dance4">
+ Baile 4
+ </string>
+ <string name="anim_dance5">
+ Baile 5
+ </string>
+ <string name="anim_dance6">
+ Baile 6
+ </string>
+ <string name="anim_dance7">
+ Baile 7
+ </string>
+ <string name="anim_dance8">
+ Baile 8
+ </string>
+ <string name="anim_express_disdain">
+ Desdén
+ </string>
+ <string name="anim_drink">
+ Beber
+ </string>
+ <string name="anim_express_embarrased">
+ Azorarse
+ </string>
+ <string name="anim_angry_fingerwag">
+ Negar con el dedo
+ </string>
+ <string name="anim_fist_pump">
+ Éxito con el puño
+ </string>
+ <string name="anim_yoga_float">
+ Yoga flotando
+ </string>
+ <string name="anim_express_frown">
+ Fruncir el ceño
+ </string>
+ <string name="anim_impatient">
+ Impaciente
+ </string>
+ <string name="anim_jumpforjoy">
+ Salto de alegría
+ </string>
+ <string name="anim_kissmybutt">
+ Bésame el culo
+ </string>
+ <string name="anim_express_kiss">
+ Besar
+ </string>
+ <string name="anim_laugh_short">
+ Reír
+ </string>
+ <string name="anim_musclebeach">
+ Sacar músculo
+ </string>
+ <string name="anim_no_unhappy">
+ No (con enfado)
+ </string>
+ <string name="anim_no_head">
+ No
+ </string>
+ <string name="anim_nyanya">
+ Ña-Ña-Ña
+ </string>
+ <string name="anim_punch_onetwo">
+ Puñetazo uno-dos
+ </string>
+ <string name="anim_express_open_mouth">
+ Abrir la boca
+ </string>
+ <string name="anim_peace">
+ &apos;V&apos; con los dedos
+ </string>
+ <string name="anim_point_you">
+ Señalar a otro/a
+ </string>
+ <string name="anim_point_me">
+ Señalarse
+ </string>
+ <string name="anim_punch_l">
+ Puñetazo izquierdo
+ </string>
+ <string name="anim_punch_r">
+ Puñetazo derecho
+ </string>
+ <string name="anim_rps_countdown">
+ PPT cuenta
+ </string>
+ <string name="anim_rps_paper">
+ PPT papel
+ </string>
+ <string name="anim_rps_rock">
+ PPT piedra
+ </string>
+ <string name="anim_rps_scissors">
+ PPT tijera
+ </string>
+ <string name="anim_express_repulsed">
+ Repulsa
+ </string>
+ <string name="anim_kick_roundhouse_r">
+ Patada circular
+ </string>
+ <string name="anim_express_sad">
+ Triste
+ </string>
+ <string name="anim_salute">
+ Saludo militar
+ </string>
+ <string name="anim_shout">
+ Gritar
+ </string>
+ <string name="anim_express_shrug">
+ Encogerse de hombros
+ </string>
+ <string name="anim_express_smile">
+ Sonreír
+ </string>
+ <string name="anim_smoke_idle">
+ Fumar: en la mano
+ </string>
+ <string name="anim_smoke_inhale">
+ Fumar
+ </string>
+ <string name="anim_smoke_throw_down">
+ Fumar: tirar el cigarro
+ </string>
+ <string name="anim_express_surprise">
+ Sorpresa
+ </string>
+ <string name="anim_sword_strike_r">
+ Estocadas
+ </string>
+ <string name="anim_angry_tantrum">
+ Berrinche
+ </string>
+ <string name="anim_express_tongue_out">
+ Sacar la lengua
+ </string>
+ <string name="anim_hello">
+ Agitar la mano
+ </string>
+ <string name="anim_whisper">
+ Cuchichear
+ </string>
+ <string name="anim_whistle">
+ Pitar
+ </string>
+ <string name="anim_express_wink">
+ Guiño
+ </string>
+ <string name="anim_wink_hollywood">
+ Guiño (Hollywood)
+ </string>
+ <string name="anim_express_worry">
+ Preocuparse
+ </string>
+ <string name="anim_yes_happy">
+ Sí (contento)
+ </string>
+ <string name="anim_yes_head">
+ Sí
+ </string>
+ <string name="texture_loading">
+ Cargando...
+ </string>
+ <string name="worldmap_offline">
+ Sin conexión
+ </string>
+ <string name="worldmap_item_tooltip_format">
+ [PRICE] L$ por [AREA] m²
+ </string>
+ <string name="worldmap_results_none_found">
+ No se ha encontrado.
+ </string>
+ <string name="Ok">
+ OK
+ </string>
+ <string name="Premature end of file">
+ Fin prematuro del archivo
+ </string>
+ <string name="ST_NO_JOINT">
+ No se puede encontrar ROOT o JOINT.
+ </string>
+ <string name="whisper">
+ susurra:
+ </string>
+ <string name="shout">
+ grita:
+ </string>
+ <string name="ringing">
+ Conectando al chat de voz...
+ </string>
+ <string name="connected">
+ Conectado
+ </string>
+ <string name="unavailable">
+ La voz no está disponible en su localización actual
+ </string>
+ <string name="hang_up">
+ Desconectado del chat de voz
+ </string>
+ <string name="reconnect_nearby">
+ Vas a ser reconectado al chat de voz con los cercanos
+ </string>
+ <string name="ScriptQuestionCautionChatGranted">
+ &apos;[OBJECTNAME]&apos;, un objeto propiedad de &apos;[OWNERNAME]&apos;, localizado en [REGIONNAME] con la posición [REGIONPOS], ha recibido permiso para: [PERMISSIONS].
+ </string>
+ <string name="ScriptQuestionCautionChatDenied">
+ A &apos;[OBJECTNAME]&apos;, un objeto propiedad de &apos;[OWNERNAME]&apos;, localizado en [REGIONNAME] con la posición [REGIONPOS], se le ha denegado el permiso para: [PERMISSIONS].
+ </string>
+ <string name="ScriptTakeMoney">
+ Cogerle a usted dólares Linden (L$)
+ </string>
+ <string name="ActOnControlInputs">
+ Actuar en sus controles de entrada
+ </string>
+ <string name="RemapControlInputs">
+ Reconfigurar sus controles de entrada
+ </string>
+ <string name="AnimateYourAvatar">
+ Ejecutar animaciones en su avatar
+ </string>
+ <string name="AttachToYourAvatar">
+ Anexarse a su avatar
+ </string>
+ <string name="ReleaseOwnership">
+ Anular la propiedad y que pase a ser público
+ </string>
+ <string name="LinkAndDelink">
+ Enlazar y desenlazar de otros objetos
+ </string>
+ <string name="AddAndRemoveJoints">
+ Añadir y quitar uniones con otros objetos
+ </string>
+ <string name="ChangePermissions">
+ Cambiar sus permisos
+ </string>
+ <string name="TrackYourCamera">
+ Seguir su cámara
+ </string>
+ <string name="ControlYourCamera">
+ Controlar su cámara
+ </string>
+ <string name="SIM_ACCESS_PG">
+ General
+ </string>
+ <string name="SIM_ACCESS_MATURE">
+ Moderado
+ </string>
+ <string name="SIM_ACCESS_ADULT">
+ Adulto
+ </string>
+ <string name="SIM_ACCESS_DOWN">
+ Desconectado
+ </string>
+ <string name="SIM_ACCESS_MIN">
+ Desconocido
+ </string>
+ <string name="land_type_unknown">
+ (desconocido)
+ </string>
+ <string name="Estate / Full Region">
+ Estado /Región completa
+ </string>
+ <string name="Estate / Homestead">
+ Estado / Homestead
+ </string>
+ <string name="Mainland / Homestead">
+ Continente / Homestead
+ </string>
+ <string name="Mainland / Full Region">
+ Continente / Región completa
+ </string>
+ <string name="all_files">
+ Todos los archivos
+ </string>
+ <string name="sound_files">
+ Sonidos
+ </string>
+ <string name="animation_files">
+ Animaciones
+ </string>
+ <string name="image_files">
+ Imágenes
+ </string>
+ <string name="save_file_verb">
+ Guardar
+ </string>
+ <string name="load_file_verb">
+ Cargar
+ </string>
+ <string name="targa_image_files">
+ Imágenes Targa
+ </string>
+ <string name="bitmap_image_files">
+ Imágenes de mapa de bits
+ </string>
+ <string name="avi_movie_file">
+ Archivo de película AVI
+ </string>
+ <string name="xaf_animation_file">
+ Archivo de anim. XAF
+ </string>
+ <string name="xml_file">
+ Archivo XML
+ </string>
+ <string name="raw_file">
+ Archivo RAW
+ </string>
+ <string name="compressed_image_files">
+ Imágenes comprimidas
+ </string>
+ <string name="load_files">
+ Cargar archivos
+ </string>
+ <string name="choose_the_directory">
+ Elegir directorio
+ </string>
+ <string name="script_files">
+ Scripts
+ </string>
+ <string name="AvatarSetNotAway">
+ Salir del estado ausente
+ </string>
+ <string name="AvatarSetAway">
+ Pasar al estado ausente
+ </string>
+ <string name="AvatarSetNotBusy">
+ Salir del estado ocupado
+ </string>
+ <string name="AvatarSetBusy">
+ Pasar al estado ocupado
+ </string>
+ <string name="shape">
+ Forma
+ </string>
+ <string name="skin">
+ Piel
+ </string>
+ <string name="hair">
+ Pelo
+ </string>
+ <string name="eyes">
+ Ojos
+ </string>
+ <string name="shirt">
+ Camisa
+ </string>
+ <string name="pants">
+ Pantalón
+ </string>
+ <string name="shoes">
+ Zapatos
+ </string>
+ <string name="socks">
+ Calcetines
+ </string>
+ <string name="jacket">
+ Chaqueta
+ </string>
+ <string name="gloves">
+ Guantes
+ </string>
+ <string name="undershirt">
+ Camiseta
+ </string>
+ <string name="underpants">
+ Ropa interior
+ </string>
+ <string name="skirt">
+ Falda
+ </string>
+ <string name="alpha">
+ Alfa
+ </string>
+ <string name="tattoo">
+ Tatuaje
+ </string>
+ <string name="physics">
+ Física
+ </string>
+ <string name="invalid">
+ inválido/a
+ </string>
+ <string name="none">
+ ninguno
+ </string>
+ <string name="shirt_not_worn">
+ Camisa no puesta
+ </string>
+ <string name="pants_not_worn">
+ Pantalones no puestos
+ </string>
+ <string name="shoes_not_worn">
+ Zapatos no puestos
+ </string>
+ <string name="socks_not_worn">
+ Calcetines no puestos
+ </string>
+ <string name="jacket_not_worn">
+ Chaqueta no puesta
+ </string>
+ <string name="gloves_not_worn">
+ Guantes no puestos
+ </string>
+ <string name="undershirt_not_worn">
+ Camiseta no puesta
+ </string>
+ <string name="underpants_not_worn">
+ Ropa interior no puesta
+ </string>
+ <string name="skirt_not_worn">
+ Falda no puesta
+ </string>
+ <string name="alpha_not_worn">
+ Alfa no puesta
+ </string>
+ <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>
+ <string name="create_new_shape">
+ Crear una anatomía nueva
+ </string>
+ <string name="create_new_skin">
+ Crear una piel nueva
+ </string>
+ <string name="create_new_hair">
+ Crear pelo nuevo
+ </string>
+ <string name="create_new_eyes">
+ Crear ojos nuevos
+ </string>
+ <string name="create_new_shirt">
+ Crear una camisa nueva
+ </string>
+ <string name="create_new_pants">
+ Crear unos pantalones nuevos
+ </string>
+ <string name="create_new_shoes">
+ Crear unos zapatos nuevos
+ </string>
+ <string name="create_new_socks">
+ Crear unos calcetines nuevos
+ </string>
+ <string name="create_new_jacket">
+ Crear una chaqueta nueva
+ </string>
+ <string name="create_new_gloves">
+ Crear unos guantes nuevos
+ </string>
+ <string name="create_new_undershirt">
+ Crear una camiseta nueva
+ </string>
+ <string name="create_new_underpants">
+ Crear ropa interior nueva
+ </string>
+ <string name="create_new_skirt">
+ Crear una falda nueva
+ </string>
+ <string name="create_new_alpha">
+ Crear una capa alfa nueva
+ </string>
+ <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>
+ <string name="NewWearable">
+ Nuevo [WEARABLE_ITEM]
+ </string>
+ <string name="next">
+ Siguiente
+ </string>
+ <string name="ok">
+ OK
+ </string>
+ <string name="GroupNotifyGroupNotice">
+ Aviso de grupo
+ </string>
+ <string name="GroupNotifyGroupNotices">
+ Avisos del grupo
+ </string>
+ <string name="GroupNotifySentBy">
+ Enviado por
+ </string>
+ <string name="GroupNotifyAttached">
+ Adjunto:
+ </string>
+ <string name="GroupNotifyViewPastNotices">
+ Ver los avisos pasados u optar por dejar de recibir aquí estos mensajes.
+ </string>
+ <string name="GroupNotifyOpenAttachment">
+ Abrir el adjunto
+ </string>
+ <string name="GroupNotifySaveAttachment">
+ Guardar el adjunto
+ </string>
+ <string name="TeleportOffer">
+ Ofrecimiento de teleporte
+ </string>
+ <string name="StartUpNotifications">
+ Llegaron avisos nuevos mientras estabas ausente...
+ </string>
+ <string name="OverflowInfoChannelString">
+ Tienes [%d] aviso/s más
+ </string>
+ <string name="BodyPartsRightArm">
+ Brazo der.
+ </string>
+ <string name="BodyPartsHead">
+ Cabeza
+ </string>
+ <string name="BodyPartsLeftArm">
+ Brazo izq.
+ </string>
+ <string name="BodyPartsLeftLeg">
+ Pierna izq.
+ </string>
+ <string name="BodyPartsTorso">
+ Torso
+ </string>
+ <string name="BodyPartsRightLeg">
+ Pierna der.
+ </string>
+ <string name="GraphicsQualityLow">
+ Bajo
+ </string>
+ <string name="GraphicsQualityMid">
+ Medio
+ </string>
+ <string name="GraphicsQualityHigh">
+ Alto
+ </string>
+ <string name="LeaveMouselook">
+ Pulsa ESC para salir de la vista subjetiva
+ </string>
+ <string name="InventoryNoMatchingItems">
+ ¿No encuentras lo que buscas? Prueba con [secondlife:///app/search/all/[SEARCH_TERM] Buscar].
+ </string>
+ <string name="PlacesNoMatchingItems">
+ ¿No encuentras lo que buscas? Prueba con [secondlife:///app/search/places/[SEARCH_TERM] Buscar].
+ </string>
+ <string name="FavoritesNoMatchingItems">
+ Arrastra aquí un hito para tenerlo en tus favoritos.
+ </string>
+ <string name="InventoryNoTexture">
+ No tienes en tu inventario una copia de esta textura
+ </string>
+ <string name="InventoryInboxNoItems">
+ Aquí aparecerán algunos de los objetos que recibas, como los regalos Premium. Después puedes arrastrarlos a tu inventario.
+ </string>
+ <string name="MarketplaceURL">
+ https://marketplace.[MARKETPLACE_DOMAIN_NAME]/
+ </string>
+ <string name="MarketplaceURL_CreateStore">
+ http://community.secondlife.com/t5/English-Knowledge-Base/Selling-in-the-Marketplace/ta-p/700193#Section_.4
+ </string>
+ <string name="MarketplaceURL_Dashboard">
+ https://marketplace.[MARKETPLACE_DOMAIN_NAME]/merchants/store/dashboard
+ </string>
+ <string name="MarketplaceURL_Imports">
+ https://marketplace.[MARKETPLACE_DOMAIN_NAME]/merchants/store/imports
+ </string>
+ <string name="MarketplaceURL_LearnMore">
+ https://marketplace.[MARKETPLACE_DOMAIN_NAME]/learn_more
+ </string>
+ <string name="InventoryOutboxNotMerchantTitle">
+ Cualquier usuario puede vender objetos en el mercado.
+ </string>
+ <string name="InventoryOutboxNotMerchantTooltip"/>
+ <string name="InventoryOutboxNotMerchant">
+ Para hacerte comerciante debes [[MARKETPLACE_CREATE_STORE_URL] crear una tienda del Mercado].
+ </string>
+ <string name="InventoryOutboxNoItemsTitle">
+ El buzón de salida está vacío.
+ </string>
+ <string name="InventoryOutboxNoItemsTooltip"/>
+ <string name="InventoryOutboxNoItems">
+ Arrastra carpetas a esta sección y pulsa en &quot;Enviar al Mercado&quot; para incluirlas en la lista de venta del [[MARKETPLACE_DASHBOARD_URL] Mercado].
+ </string>
+ <string name="Marketplace Error None">
+ Sin errores
+ </string>
+ <string name="Marketplace Error Not Merchant">
+ Error: Para poder enviar objetos al mercado, debes registrarte como comerciante (es gratis).
+ </string>
+ <string name="Marketplace Error Empty Folder">
+ Error: Esta carpeta está vacía.
+ </string>
+ <string name="Marketplace Error Unassociated Products">
+ Error: Este objeto no se pudo subir porque tu cuenta de comerciante tiene demasiados objetos que no están asociados a productos. Para corregirlo, inicia sesión en la página web del mercado y asocia más objetos.
+ </string>
+ <string name="Marketplace Error Object Limit">
+ Error: Este elemento contiene demasiados objetos. Para corregir el error, guarda objetos en cajas de forma que el total de objetos sea menor que 200.
+ </string>
+ <string name="Marketplace Error Folder Depth">
+ Error: Este objeto contiene demasiados niveles de carpetas anidadas. Reorganízalo de forma que tenga como máximo 3 niveles de carpetas anidadas.
+ </string>
+ <string name="Marketplace Error Unsellable Item">
+ Error: Este objeto no se puede vender en el mercado.
+ </string>
+ <string name="Marketplace Error Internal Import">
+ Error: Este objeto tiene un problema. Vuelve a intentarlo más tarde.
+ </string>
+ <string name="Open landmarks">
+ Abrir hitos
+ </string>
+ <string name="no_transfer" value="(no transferible)"/>
+ <string name="no_modify" value="(no modificable)"/>
+ <string name="no_copy" value="(no copiable)"/>
+ <string name="worn" value="(puesto)"/>
+ <string name="link" value="(enlace)"/>
+ <string name="broken_link" value="(enlace roto)&quot;"/>
+ <string name="LoadingContents">
+ Cargando el contenido...
+ </string>
+ <string name="NoContents">
+ No hay contenido
+ </string>
+ <string name="WornOnAttachmentPoint" value="(lo llevas en: [ATTACHMENT_POINT])"/>
+ <string name="ActiveGesture" value="[GESLABEL] (activo)"/>
+ <string name="Chat Message" value="Chat:"/>
+ <string name="Sound" value="Sonido :"/>
+ <string name="Wait" value="--- Espera :"/>
+ <string name="AnimFlagStop" value="Parar la animación:"/>
+ <string name="AnimFlagStart" value="Empezar la animación:"/>
+ <string name="Wave" value="Onda"/>
+ <string name="GestureActionNone" value="Ninguno"/>
+ <string name="HelloAvatar" value="¡Hola, avatar!"/>
+ <string name="ViewAllGestures" value="Ver todos &gt;&gt;"/>
+ <string name="GetMoreGestures" value="Obtener más &gt;&gt;"/>
+ <string name="Animations" value="Animaciones,"/>
+ <string name="Calling Cards" value="Tarjetas de visita,"/>
+ <string name="Clothing" value="Ropa,"/>
+ <string name="Gestures" value="Gestos,"/>
+ <string name="Landmarks" value="Hitos,"/>
+ <string name="Notecards" value="Notas,"/>
+ <string name="Objects" value="Objetos,"/>
+ <string name="Scripts" value="Scripts,"/>
+ <string name="Sounds" value="Sonidos,"/>
+ <string name="Textures" value="Texturas,"/>
+ <string name="Snapshots" value="Fotos,"/>
+ <string name="No Filters" value="No"/>
+ <string name="Since Logoff" value="- Desde la desconexión"/>
+ <string name="InvFolder My Inventory">
+ Mi Inventario
+ </string>
+ <string name="InvFolder Library">
+ Biblioteca
+ </string>
+ <string name="InvFolder Textures">
+ Texturas
+ </string>
+ <string name="InvFolder Sounds">
+ Sonidos
+ </string>
+ <string name="InvFolder Calling Cards">
+ Tarjetas de visita
+ </string>
+ <string name="InvFolder Landmarks">
+ Hitos
+ </string>
+ <string name="InvFolder Scripts">
+ Scripts
+ </string>
+ <string name="InvFolder Clothing">
+ Ropa
+ </string>
+ <string name="InvFolder Objects">
+ Objetos
+ </string>
+ <string name="InvFolder Notecards">
+ Notas
+ </string>
+ <string name="InvFolder New Folder">
+ Carpeta nueva
+ </string>
+ <string name="InvFolder Inventory">
+ Inventario
+ </string>
+ <string name="InvFolder Uncompressed Images">
+ Imágenes sin comprimir
+ </string>
+ <string name="InvFolder Body Parts">
+ Partes del cuerpo
+ </string>
+ <string name="InvFolder Trash">
+ Papelera
+ </string>
+ <string name="InvFolder Photo Album">
+ Ãlbum de fotos
+ </string>
+ <string name="InvFolder Lost And Found">
+ Objetos Perdidos
+ </string>
+ <string name="InvFolder Uncompressed Sounds">
+ Sonidos sin comprimir
+ </string>
+ <string name="InvFolder Animations">
+ Animaciones
+ </string>
+ <string name="InvFolder Gestures">
+ Gestos
+ </string>
+ <string name="InvFolder Favorite">
+ Mis Favoritos
+ </string>
+ <string name="InvFolder favorite">
+ Mis Favoritos
+ </string>
+ <string name="InvFolder Current Outfit">
+ Vestuario actual
+ </string>
+ <string name="InvFolder Initial Outfits">
+ Vestuario inicial
+ </string>
+ <string name="InvFolder My Outfits">
+ Mis vestuarios
+ </string>
+ <string name="InvFolder Accessories">
+ Accesorios
+ </string>
+ <string name="InvFolder Meshes">
+ Redes
+ </string>
+ <string name="InvFolder Friends">
+ Amigos
+ </string>
+ <string name="InvFolder All">
+ Todas
+ </string>
+ <string name="no_attachments">
+ No tienes puestos anexos
+ </string>
+ <string name="Attachments remain">
+ Anexos (quedan [COUNT] ranuras)
+ </string>
+ <string name="Buy">
+ Comprar
+ </string>
+ <string name="BuyforL$">
+ Comprar por L$
+ </string>
+ <string name="Stone">
+ Piedra
+ </string>
+ <string name="Metal">
+ Metal
+ </string>
+ <string name="Glass">
+ Cristal
+ </string>
+ <string name="Wood">
+ Madera
+ </string>
+ <string name="Flesh">
+ Carne
+ </string>
+ <string name="Plastic">
+ Plástico
+ </string>
+ <string name="Rubber">
+ Goma
+ </string>
+ <string name="Light">
+ Claridad
+ </string>
+ <string name="KBShift">
+ Mayúsculas
+ </string>
+ <string name="KBCtrl">
+ Ctrl
+ </string>
+ <string name="Chest">
+ Tórax
+ </string>
+ <string name="Skull">
+ Cráneo
+ </string>
+ <string name="Left Shoulder">
+ Hombro izquierdo
+ </string>
+ <string name="Right Shoulder">
+ Hombro derecho
+ </string>
+ <string name="Left Hand">
+ Mano izq.
+ </string>
+ <string name="Right Hand">
+ Mano der.
+ </string>
+ <string name="Left Foot">
+ Pie izq.
+ </string>
+ <string name="Right Foot">
+ Pie der.
+ </string>
+ <string name="Spine">
+ Columna
+ </string>
+ <string name="Pelvis">
+ Pelvis
+ </string>
+ <string name="Mouth">
+ Boca
+ </string>
+ <string name="Chin">
+ Barbilla
+ </string>
+ <string name="Left Ear">
+ Oreja izq.
+ </string>
+ <string name="Right Ear">
+ Oreja der.
+ </string>
+ <string name="Left Eyeball">
+ Ojo izq.
+ </string>
+ <string name="Right Eyeball">
+ Ojo der.
+ </string>
+ <string name="Nose">
+ Nariz
+ </string>
+ <string name="R Upper Arm">
+ Brazo der.
+ </string>
+ <string name="R Forearm">
+ Antebrazo der.
+ </string>
+ <string name="L Upper Arm">
+ Brazo izq.
+ </string>
+ <string name="L Forearm">
+ Antebrazo izq.
+ </string>
+ <string name="Right Hip">
+ Cadera der.
+ </string>
+ <string name="R Upper Leg">
+ Muslo der.
+ </string>
+ <string name="R Lower Leg">
+ Pantorrilla der.
+ </string>
+ <string name="Left Hip">
+ Cadera izq.
+ </string>
+ <string name="L Upper Leg">
+ Muslo izq.
+ </string>
+ <string name="L Lower Leg">
+ Pantorrilla izq.
+ </string>
+ <string name="Stomach">
+ Abdomen
+ </string>
+ <string name="Left Pec">
+ Pecho izquierdo
+ </string>
+ <string name="Right Pec">
+ Pecho derecho
+ </string>
+ <string name="Neck">
+ Cuello
+ </string>
+ <string name="Avatar Center">
+ Centro del avatar
+ </string>
+ <string name="Invalid Attachment">
+ Punto de colocación no válido
+ </string>
+ <string name="YearsMonthsOld">
+ [AGEYEARS] [AGEMONTHS] de edad
+ </string>
+ <string name="YearsOld">
+ [AGEYEARS] de edad
+ </string>
+ <string name="MonthsOld">
+ [AGEMONTHS] de edad
+ </string>
+ <string name="WeeksOld">
+ [AGEWEEKS] de edad
+ </string>
+ <string name="DaysOld">
+ [AGEDAYS] de edad
+ </string>
+ <string name="TodayOld">
+ Registrado hoy
+ </string>
+ <string name="AgeYearsA">
+ [COUNT] año
+ </string>
+ <string name="AgeYearsB">
+ [COUNT] años
+ </string>
+ <string name="AgeYearsC">
+ [COUNT] años
+ </string>
+ <string name="AgeMonthsA">
+ [COUNT] mes
+ </string>
+ <string name="AgeMonthsB">
+ [COUNT] meses
+ </string>
+ <string name="AgeMonthsC">
+ [COUNT] meses
+ </string>
+ <string name="AgeWeeksA">
+ [COUNT] semana
+ </string>
+ <string name="AgeWeeksB">
+ [COUNT] semanas
+ </string>
+ <string name="AgeWeeksC">
+ [COUNT] semanas
+ </string>
+ <string name="AgeDaysA">
+ [COUNT] día
+ </string>
+ <string name="AgeDaysB">
+ [COUNT] días
+ </string>
+ <string name="AgeDaysC">
+ [COUNT] días
+ </string>
+ <string name="GroupMembersA">
+ [COUNT] miembro
+ </string>
+ <string name="GroupMembersB">
+ [COUNT] miembros
+ </string>
+ <string name="GroupMembersC">
+ [COUNT] miembros
+ </string>
+ <string name="AcctTypeResident">
+ Residente
+ </string>
+ <string name="AcctTypeTrial">
+ Prueba
+ </string>
+ <string name="AcctTypeCharterMember">
+ Miembro fundador
+ </string>
+ <string name="AcctTypeEmployee">
+ Empleado de Linden Lab
+ </string>
+ <string name="PaymentInfoUsed">
+ Ha usado información sobre la forma de pago
+ </string>
+ <string name="PaymentInfoOnFile">
+ Hay información archivada sobre la forma de pago
+ </string>
+ <string name="NoPaymentInfoOnFile">
+ No hay información archivada sobre la forma de pago
+ </string>
+ <string name="AgeVerified">
+ Edad verificada
+ </string>
+ <string name="NotAgeVerified">
+ Edad no verificada
+ </string>
+ <string name="Center 2">
+ Centro 2
+ </string>
+ <string name="Top Right">
+ Arriba der.
+ </string>
+ <string name="Top">
+ Arriba
+ </string>
+ <string name="Top Left">
+ Arriba izq.
+ </string>
+ <string name="Center">
+ Centro
+ </string>
+ <string name="Bottom Left">
+ Abajo izq.
+ </string>
+ <string name="Bottom">
+ Abajo
+ </string>
+ <string name="Bottom Right">
+ Abajo der.
+ </string>
+ <string name="CompileQueueDownloadedCompiling">
+ Descargado, compilándolo
+ </string>
+ <string name="CompileQueueScriptNotFound">
+ No se encuentra el script en el servidor.
+ </string>
+ <string name="CompileQueueProblemDownloading">
+ Problema al descargar
+ </string>
+ <string name="CompileQueueInsufficientPermDownload">
+ Permisos insuficientes para descargar un script.
+ </string>
+ <string name="CompileQueueInsufficientPermFor">
+ Permisos insuficientes para
+ </string>
+ <string name="CompileQueueUnknownFailure">
+ Fallo desconocido en la descarga
+ </string>
+ <string name="CompileQueueTitle">
+ Recompilando
+ </string>
+ <string name="CompileQueueStart">
+ recompilar
+ </string>
+ <string name="ResetQueueTitle">
+ Progreso del reinicio
+ </string>
+ <string name="ResetQueueStart">
+ restaurar
+ </string>
+ <string name="RunQueueTitle">
+ Configurar según se ejecuta
+ </string>
+ <string name="RunQueueStart">
+ Configurando según se ejecuta
+ </string>
+ <string name="NotRunQueueTitle">
+ Configurar sin ejecutar
+ </string>
+ <string name="NotRunQueueStart">
+ Configurando sin ejecutarlo
+ </string>
+ <string name="CompileSuccessful">
+ ¡Compilación correcta!
+ </string>
+ <string name="CompileSuccessfulSaving">
+ Compilación correcta, guardando...
+ </string>
+ <string name="SaveComplete">
+ Guardado.
+ </string>
+ <string name="ObjectOutOfRange">
+ Script (objeto fuera de rango)
+ </string>
+ <string name="GodToolsObjectOwnedBy">
+ El objeto [OBJECT] es propiedad de [OWNER]
+ </string>
+ <string name="GroupsNone">
+ ninguno
+ </string>
+ <string name="Group" value="(grupo)"/>
+ <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="GroupPlanningDate">
+ [mthnum,datetime,utc]/[day,datetime,utc]/[year,datetime,utc]
+ </string>
+ <string name="GroupIndividualShare" value="Grupo Aportaciones individuales"/>
+ <string name="GroupColumn" value="Grupo"/>
+ <string name="Balance">
+ Saldo
+ </string>
+ <string name="Credits">
+ Créditos
+ </string>
+ <string name="Debits">
+ Débitos
+ </string>
+ <string name="Total">
+ Total
+ </string>
+ <string name="NoGroupDataFound">
+ No se encontraron datos del grupo
+ </string>
+ <string name="IMParentEstate">
+ parent estate
+ </string>
+ <string name="IMMainland">
+ continente
+ </string>
+ <string name="IMTeen">
+ teen
+ </string>
+ <string name="Anyone">
+ cualquiera
+ </string>
+ <string name="RegionInfoError">
+ error
+ </string>
+ <string name="RegionInfoAllEstatesOwnedBy">
+ todos los estados propiedad de [OWNER]
+ </string>
+ <string name="RegionInfoAllEstatesYouOwn">
+ todos los estados que posees
+ </string>
+ <string name="RegionInfoAllEstatesYouManage">
+ todos los estados que administras para [OWNER]
+ </string>
+ <string name="RegionInfoAllowedResidents">
+ Resientes autorizados: ([ALLOWEDAGENTS], de un máx. de [MAXACCESS])
+ </string>
+ <string name="RegionInfoAllowedGroups">
+ Grupos autorizados: ([ALLOWEDGROUPS], de un máx. de [MAXACCESS])
+ </string>
+ <string name="ScriptLimitsParcelScriptMemory">
+ Memoria de los scripts de la parcela
+ </string>
+ <string name="ScriptLimitsParcelsOwned">
+ Parcelas listadas: [PARCELS]
+ </string>
+ <string name="ScriptLimitsMemoryUsed">
+ Memoria usada: [COUNT] kb de un máx de [MAX] kb; [AVAILABLE] kb disponibles
+ </string>
+ <string name="ScriptLimitsMemoryUsedSimple">
+ Memoria usada: [COUNT] kb
+ </string>
+ <string name="ScriptLimitsParcelScriptURLs">
+ URLs de los scripts de la parcela
+ </string>
+ <string name="ScriptLimitsURLsUsed">
+ URLs usadas: [COUNT] de un máx. de [MAX]; [AVAILABLE] disponibles
+ </string>
+ <string name="ScriptLimitsURLsUsedSimple">
+ URLs usadas: [COUNT]
+ </string>
+ <string name="ScriptLimitsRequestError">
+ Error al obtener la información
+ </string>
+ <string name="ScriptLimitsRequestNoParcelSelected">
+ No hay una parcela seleccionada
+ </string>
+ <string name="ScriptLimitsRequestWrongRegion">
+ Error: la información del script sólo está disponible en tu región actual
+ </string>
+ <string name="ScriptLimitsRequestWaiting">
+ Obteniendo la información...
+ </string>
+ <string name="ScriptLimitsRequestDontOwnParcel">
+ No tienes permiso para examinar esta parcela
+ </string>
+ <string name="SITTING_ON">
+ Sentado en
+ </string>
+ <string name="ATTACH_CHEST">
+ Tórax
+ </string>
+ <string name="ATTACH_HEAD">
+ Cabeza
+ </string>
+ <string name="ATTACH_LSHOULDER">
+ Hombro izquierdo
+ </string>
+ <string name="ATTACH_RSHOULDER">
+ Hombro derecho
+ </string>
+ <string name="ATTACH_LHAND">
+ Mano izq.
+ </string>
+ <string name="ATTACH_RHAND">
+ Mano der.
+ </string>
+ <string name="ATTACH_LFOOT">
+ Pie izq.
+ </string>
+ <string name="ATTACH_RFOOT">
+ Pie der.
+ </string>
+ <string name="ATTACH_BACK">
+ Anterior
+ </string>
+ <string name="ATTACH_PELVIS">
+ Pelvis
+ </string>
+ <string name="ATTACH_MOUTH">
+ Boca
+ </string>
+ <string name="ATTACH_CHIN">
+ Barbilla
+ </string>
+ <string name="ATTACH_LEAR">
+ Oreja izq.
+ </string>
+ <string name="ATTACH_REAR">
+ Oreja der.
+ </string>
+ <string name="ATTACH_LEYE">
+ Ojo izq.
+ </string>
+ <string name="ATTACH_REYE">
+ Ojo der.
+ </string>
+ <string name="ATTACH_NOSE">
+ Nariz
+ </string>
+ <string name="ATTACH_RUARM">
+ Brazo der.
+ </string>
+ <string name="ATTACH_RLARM">
+ Antebrazo der.
+ </string>
+ <string name="ATTACH_LUARM">
+ Brazo izq.
+ </string>
+ <string name="ATTACH_LLARM">
+ Antebrazo izq.
+ </string>
+ <string name="ATTACH_RHIP">
+ Cadera der.
+ </string>
+ <string name="ATTACH_RULEG">
+ Muslo der.
+ </string>
+ <string name="ATTACH_RLLEG">
+ Pantorrilla der.
+ </string>
+ <string name="ATTACH_LHIP">
+ Cadera izq.
+ </string>
+ <string name="ATTACH_LULEG">
+ Muslo izq.
+ </string>
+ <string name="ATTACH_LLLEG">
+ Pantorrilla izq.
+ </string>
+ <string name="ATTACH_BELLY">
+ Vientre
+ </string>
+ <string name="ATTACH_RPEC">
+ Pecho derecho
+ </string>
+ <string name="ATTACH_LPEC">
+ Pecho izquierdo
+ </string>
+ <string name="ATTACH_HUD_CENTER_2">
+ HUD: Centro 2
+ </string>
+ <string name="ATTACH_HUD_TOP_RIGHT">
+ HUD: arriba der.
+ </string>
+ <string name="ATTACH_HUD_TOP_CENTER">
+ HUD: arriba centro
+ </string>
+ <string name="ATTACH_HUD_TOP_LEFT">
+ HUD: arriba izq.
+ </string>
+ <string name="ATTACH_HUD_CENTER_1">
+ HUD: Centro 1
+ </string>
+ <string name="ATTACH_HUD_BOTTOM_LEFT">
+ HUD: abajo izq.
+ </string>
+ <string name="ATTACH_HUD_BOTTOM">
+ HUD: abajo
+ </string>
+ <string name="ATTACH_HUD_BOTTOM_RIGHT">
+ HUD: abajo der.
+ </string>
+ <string name="CursorPos">
+ Línea [LINE], Columna [COLUMN]
+ </string>
+ <string name="PanelDirCountFound">
+ [COUNT] resultados
+ </string>
+ <string name="PanelContentsTooltip">
+ Contenido del objeto
+ </string>
+ <string name="PanelContentsNewScript">
+ Script nuevo
+ </string>
+ <string name="BusyModeResponseDefault">
+ El Residente al que has enviado un mensaje ha solicitado que no se le moleste porque está en modo ocupado. Podrá ver tu mensaje más adelante, ya que éste aparecerá en su panel de MI.
+ </string>
+ <string name="MuteByName">
+ (Por el nombre)
+ </string>
+ <string name="MuteAgent">
+ (Residente)
+ </string>
+ <string name="MuteObject">
+ (Objeto)
+ </string>
+ <string name="MuteGroup">
+ (Grupo)
+ </string>
+ <string name="MuteExternal">
+ (Externo)
+ </string>
+ <string name="RegionNoCovenant">
+ No se ha aportado un contrato para este estado.
+ </string>
+ <string name="RegionNoCovenantOtherOwner">
+ No se ha aportado un contrato para este estado. El terreno de este estado lo vende el propietario del estado, no Linden Lab. Por favor, contacta con ese propietario para informarte sobre la venta.
+ </string>
+ <string name="covenant_last_modified" value="Última modificación: "/>
+ <string name="none_text" value="(no hay)"/>
+ <string name="never_text" value=" (nunca)"/>
+ <string name="GroupOwned">
+ Propiedad del grupo
+ </string>
+ <string name="Public">
+ Público
+ </string>
+ <string name="LocalSettings">
+ Configuración local
+ </string>
+ <string name="RegionSettings">
+ Configuración de la región
+ </string>
+ <string name="ClassifiedClicksTxt">
+ Clics: [TELEPORT] teleportes, [MAP] mapa, [PROFILE] perfil
+ </string>
+ <string name="ClassifiedUpdateAfterPublish">
+ (se actualizará tras la publicación)
+ </string>
+ <string name="NoPicksClassifiedsText">
+ No has creado destacados ni clasificados. Pulsa el botón Más para crear uno.
+ </string>
+ <string name="NoAvatarPicksClassifiedsText">
+ El usuario no tiene clasificados ni destacados
+ </string>
+ <string name="PicksClassifiedsLoadingText">
+ Cargando...
+ </string>
+ <string name="MultiPreviewTitle">
+ Vista previa
+ </string>
+ <string name="MultiPropertiesTitle">
+ Propiedades
+ </string>
+ <string name="InvOfferAnObjectNamed">
+ Un objeto de nombre
+ </string>
+ <string name="InvOfferOwnedByGroup">
+ propiedad del grupo
+ </string>
+ <string name="InvOfferOwnedByUnknownGroup">
+ propiedad de un grupo desconocido
+ </string>
+ <string name="InvOfferOwnedBy">
+ propiedad de
+ </string>
+ <string name="InvOfferOwnedByUnknownUser">
+ propiedad de un usuario desconocido
+ </string>
+ <string name="InvOfferGaveYou">
+ te ha dado
+ </string>
+ <string name="InvOfferDecline">
+ Rechazas [DESC] de &lt;nolink&gt;[NAME]&lt;/nolink&gt;.
+ </string>
+ <string name="GroupMoneyTotal">
+ Total
+ </string>
+ <string name="GroupMoneyBought">
+ comprado
+ </string>
+ <string name="GroupMoneyPaidYou">
+ pagado a ti
+ </string>
+ <string name="GroupMoneyPaidInto">
+ pagado en
+ </string>
+ <string name="GroupMoneyBoughtPassTo">
+ pase comprado a
+ </string>
+ <string name="GroupMoneyPaidFeeForEvent">
+ cuotas pagadas para el evento
+ </string>
+ <string name="GroupMoneyPaidPrizeForEvent">
+ precio pagado por el evento
+ </string>
+ <string name="GroupMoneyBalance">
+ Saldo
+ </string>
+ <string name="GroupMoneyCredits">
+ Créditos
+ </string>
+ <string name="GroupMoneyDebits">
+ Débitos
+ </string>
+ <string name="GroupMoneyDate">
+ [weekday,datetime,utc] [mth,datetime,utc] [day,datetime,utc], [year,datetime,utc]
+ </string>
+ <string name="ViewerObjectContents">
+ Contenidos
+ </string>
+ <string name="AcquiredItems">
+ Artículos adquiridos
+ </string>
+ <string name="Cancel">
+ Cancelar
+ </string>
+ <string name="UploadingCosts">
+ Subir [NAME] cuesta [AMOUNT] L$
+ </string>
+ <string name="BuyingCosts">
+ Comprar esto cuesta [AMOUNT] L$
+ </string>
+ <string name="UnknownFileExtension">
+ Extensión de archivo desconocida [.%s]
+Se esperaba .wav, .tga, .bmp, .jpg, .jpeg, o .bvh
+ </string>
+ <string name="MuteObject2">
+ Ignorar
+ </string>
+ <string name="AddLandmarkNavBarMenu">
+ Guardarme este hito...
+ </string>
+ <string name="EditLandmarkNavBarMenu">
+ Editar este hito...
+ </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">
+ Mayús+
+ </string>
+ <string name="FileSaved">
+ Archivo guardado
+ </string>
+ <string name="Receiving">
+ Recibiendo
+ </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">
+ Adelante
+ </string>
+ <string name="Direction_Left">
+ Izquierda
+ </string>
+ <string name="Direction_Right">
+ Derecha
+ </string>
+ <string name="Direction_Back">
+ Atrás
+ </string>
+ <string name="Direction_North">
+ Norte
+ </string>
+ <string name="Direction_South">
+ Sur
+ </string>
+ <string name="Direction_West">
+ Oeste
+ </string>
+ <string name="Direction_East">
+ Este
+ </string>
+ <string name="Direction_Up">
+ Arriba
+ </string>
+ <string name="Direction_Down">
+ Abajo
+ </string>
+ <string name="Any Category">
+ Cualquier categoría
+ </string>
+ <string name="Shopping">
+ Compras
+ </string>
+ <string name="Land Rental">
+ Terreno en alquiler
+ </string>
+ <string name="Property Rental">
+ Propiedad en alquiler
+ </string>
+ <string name="Special Attraction">
+ Atracción especial
+ </string>
+ <string name="New Products">
+ Nuevos productos
+ </string>
+ <string name="Employment">
+ Empleo
+ </string>
+ <string name="Wanted">
+ Se busca
+ </string>
+ <string name="Service">
+ Servicios
+ </string>
+ <string name="Personal">
+ Personal
+ </string>
+ <string name="None">
+ Ninguno
+ </string>
+ <string name="Linden Location">
+ Localización Linden
+ </string>
+ <string name="Adult">
+ Adulto
+ </string>
+ <string name="Arts&amp;Culture">
+ Arte y Cultura
+ </string>
+ <string name="Business">
+ Negocios
+ </string>
+ <string name="Educational">
+ Educativo
+ </string>
+ <string name="Gaming">
+ Juegos de azar
+ </string>
+ <string name="Hangout">
+ Entretenimiento
+ </string>
+ <string name="Newcomer Friendly">
+ Para recién llegados
+ </string>
+ <string name="Parks&amp;Nature">
+ Parques y Naturaleza
+ </string>
+ <string name="Residential">
+ Residencial
+ </string>
+ <string name="Stage">
+ Artes escénicas
+ </string>
+ <string name="Other">
+ Otra
+ </string>
+ <string name="Rental">
+ Terreno en alquiler
+ </string>
+ <string name="Any">
+ Cualquiera
+ </string>
+ <string name="You">
+ Tú
+ </string>
+ <string name="Multiple Media">
+ Múltiples medias
+ </string>
+ <string name="Play Media">
+ Play/Pausa los media
+ </string>
+ <string name="MBCmdLineError">
+ Ha habido un error analizando la línea de comando.
+Por favor, consulta: http://wiki.secondlife.com/wiki/Client_parameters
+Error:
+ </string>
+ <string name="MBCmdLineUsg">
+ [APP_NAME] Uso de línea de comando:
+ </string>
+ <string name="MBUnableToAccessFile">
+ [APP_NAME] no puede acceder a un archivo que necesita.
+
+Puede ser porque estés ejecutando varias copias, o porque tu sistema crea -equivocadamente- que el archivo está abierto.
+Si este mensaje persiste, reinicia tu ordenador y vuelve a intentarlo.
+Si aun así sigue apareciendo el mensaje, debes desinstalar completamente [APP_NAME] y reinstalarlo.
+ </string>
+ <string name="MBFatalError">
+ Error fatal
+ </string>
+ <string name="MBRequiresAltiVec">
+ [APP_NAME] requiere un procesador con AltiVec (G4 o posterior).
+ </string>
+ <string name="MBAlreadyRunning">
+ [APP_NAME] ya se está ejecutando.
+Revisa tu barra de tareas para encontrar una copia minimizada del programa.
+Si este mensaje persiste, reinicia tu ordenador.
+ </string>
+ <string name="MBFrozenCrashed">
+ En su anterior ejecución, [APP_NAME] se congeló o se cayó.
+¿Quieres enviar un informe de caída?
+ </string>
+ <string name="MBAlert">
+ Alerta
+ </string>
+ <string name="MBNoDirectX">
+ [APP_NAME] no encuentra DirectX 9.0b o superior.
+[APP_NAME] usa DirectX para detectar el hardware o los drivers no actualizados que pueden provocar problemas de estabilidad, ejecución pobre y caídas. Aunque puedes ejecutar [APP_NAME] sin él, recomendamos encarecidamente hacerlo con DirectX 9.0b.
+
+¿Quieres continuar?
+ </string>
+ <string name="MBWarning">
+ ¡Atención!
+ </string>
+ <string name="MBNoAutoUpdate">
+ Las actualizaciones automáticas no están todavía implementadas para Linux.
+Por favor, descarga la última versión desde www.secondlife.com.
+ </string>
+ <string name="MBRegClassFailed">
+ Fallo en RegisterClass
+ </string>
+ <string name="MBError">
+ Error
+ </string>
+ <string name="MBFullScreenErr">
+ No puede ejecutarse a pantalla completa de [WIDTH] x [HEIGHT].
+Ejecutándose en una ventana.
+ </string>
+ <string name="MBDestroyWinFailed">
+ Error Shutdown destruyendo la ventana (DestroyWindow() failed)
+ </string>
+ <string name="MBShutdownErr">
+ Error Shutdown
+ </string>
+ <string name="MBDevContextErr">
+ No se puede construir el &apos;GL device context&apos;
+ </string>
+ <string name="MBPixelFmtErr">
+ No se puede encontrar un formato adecuado de píxel
+ </string>
+ <string name="MBPixelFmtDescErr">
+ No se puede conseguir la descripción del formato de píxel
+ </string>
+ <string name="MBTrueColorWindow">
+ Para ejecutarse, [APP_NAME] necesita True Color (32-bit).
+Por favor, en las configuraciones de tu ordenador ajusta el modo de color a 32-bit.
+ </string>
+ <string name="MBAlpha">
+ [APP_NAME] no puede ejecutarse porque no puede obtener un canal alpha de 8 bit. Generalmente, se debe a alguna cuestión de los drivers de la tarjeta de vídeo.
+Por favor, comprueba que tienes instalados los últimos drivers para tu tarjeta de vídeo.
+Comprueba también que tu monitor esta configurado para True Color (32-bit) en Panel de Control &gt; Apariencia y temas &gt; Pantalla.
+Si sigues recibiendo este mensaje, contacta con [SUPPORT_SITE].
+ </string>
+ <string name="MBPixelFmtSetErr">
+ No se puede configurar el formato de píxel
+ </string>
+ <string name="MBGLContextErr">
+ No se puede crear el &apos;GL rendering context&apos;
+ </string>
+ <string name="MBGLContextActErr">
+ No se puede activar el &apos;GL rendering context&apos;
+ </string>
+ <string name="MBVideoDrvErr">
+ [APP_NAME] no puede ejecutarse porque los drivers de tu tarjeta de vídeo o no están bien instalados, o no están actualizados, o son para hardware no admitido. Por favor, comprueba que tienes los drivers más actuales para tu tarjeta de vídeo, y, aunque los tengas, intenta reinstalarlos.
+
+Si sigues recibiendo este mensaje, contacta con [SUPPORT_SITE].
+ </string>
+ <string name="5 O&apos;Clock Shadow">
+ Barba del día
+ </string>
+ <string name="All White">
+ Blanco del todo
+ </string>
+ <string name="Anime Eyes">
+ Ojos de cómic
+ </string>
+ <string name="Arced">
+ Arqueadas
+ </string>
+ <string name="Arm Length">
+ Brazos: longitud
+ </string>
+ <string name="Attached">
+ Cortos
+ </string>
+ <string name="Attached Earlobes">
+ Lóbulos
+ </string>
+ <string name="Back Fringe">
+ Nuca: largo
+ </string>
+ <string name="Baggy">
+ Marcadas
+ </string>
+ <string name="Bangs">
+ Bangs
+ </string>
+ <string name="Beady Eyes">
+ Ojos pequeños
+ </string>
+ <string name="Belly Size">
+ Barriga: tamaño
+ </string>
+ <string name="Big">
+ Grande
+ </string>
+ <string name="Big Butt">
+ Culo grande
+ </string>
+ <string name="Big Hair Back">
+ Pelo: moño
+ </string>
+ <string name="Big Hair Front">
+ Pelo: tupé
+ </string>
+ <string name="Big Hair Top">
+ Pelo: melena alta
+ </string>
+ <string name="Big Head">
+ Cabeza grande
+ </string>
+ <string name="Big Pectorals">
+ Grandes pectorales
+ </string>
+ <string name="Big Spikes">
+ Crestas grandes
+ </string>
+ <string name="Black">
+ Negro
+ </string>
+ <string name="Blonde">
+ Rubio
+ </string>
+ <string name="Blonde Hair">
+ Pelo rubio
+ </string>
+ <string name="Blush">
+ Colorete
+ </string>
+ <string name="Blush Color">
+ Color del colorete
+ </string>
+ <string name="Blush Opacity">
+ Opacidad del colorete
+ </string>
+ <string name="Body Definition">
+ Definición del cuerpo
+ </string>
+ <string name="Body Fat">
+ Cuerpo: gordura
+ </string>
+ <string name="Body Freckles">
+ Pecas del cuerpo
+ </string>
+ <string name="Body Thick">
+ Cuerpo grueso
+ </string>
+ <string name="Body Thickness">
+ Cuerpo: grosor
+ </string>
+ <string name="Body Thin">
+ Cuerpo delgado
+ </string>
+ <string name="Bow Legged">
+ Abiertas
+ </string>
+ <string name="Breast Buoyancy">
+ Busto: firmeza
+ </string>
+ <string name="Breast Cleavage">
+ Busto: canalillo
+ </string>
+ <string name="Breast Size">
+ Busto: tamaño
+ </string>
+ <string name="Bridge Width">
+ Puente: ancho
+ </string>
+ <string name="Broad">
+ Aumentar
+ </string>
+ <string name="Brow Size">
+ Arco ciliar
+ </string>
+ <string name="Bug Eyes">
+ Bug Eyes
+ </string>
+ <string name="Bugged Eyes">
+ Ojos saltones
+ </string>
+ <string name="Bulbous">
+ Bulbosa
+ </string>
+ <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>
+ <string name="Bushy Hair">
+ Pelo tupido
+ </string>
+ <string name="Butt Size">
+ Culo: tamaño
+ </string>
+ <string name="Butt Gravity">
+ Gravedad del culo
+ </string>
+ <string name="bustle skirt">
+ Polisón
+ </string>
+ <string name="no bustle">
+ Sin polisón
+ </string>
+ <string name="more bustle">
+ Con polisón
+ </string>
+ <string name="Chaplin">
+ Cortito
+ </string>
+ <string name="Cheek Bones">
+ Pómulos
+ </string>
+ <string name="Chest Size">
+ Tórax: tamaño
+ </string>
+ <string name="Chin Angle">
+ Barbilla: ángulo
+ </string>
+ <string name="Chin Cleft">
+ Barbilla: contorno
+ </string>
+ <string name="Chin Curtains">
+ Barba en collar
+ </string>
+ <string name="Chin Depth">
+ Barbilla: largo
+ </string>
+ <string name="Chin Heavy">
+ Hacia la barbilla
+ </string>
+ <string name="Chin In">
+ Barbilla retraída
+ </string>
+ <string name="Chin Out">
+ Barbilla prominente
+ </string>
+ <string name="Chin-Neck">
+ Papada
+ </string>
+ <string name="Clear">
+ Transparente
+ </string>
+ <string name="Cleft">
+ Remarcar
+ </string>
+ <string name="Close Set Eyes">
+ Ojos juntos
+ </string>
+ <string name="Closed">
+ Cerrar
+ </string>
+ <string name="Closed Back">
+ Trasera cerrada
+ </string>
+ <string name="Closed Front">
+ Frontal cerrado
+ </string>
+ <string name="Closed Left">
+ Cerrada
+ </string>
+ <string name="Closed Right">
+ Cerrada
+ </string>
+ <string name="Coin Purse">
+ Poco abultada
+ </string>
+ <string name="Collar Back">
+ Espalda
+ </string>
+ <string name="Collar Front">
+ Escote
+ </string>
+ <string name="Corner Down">
+ Hacia abajo
+ </string>
+ <string name="Corner Up">
+ Hacia arriba
+ </string>
+ <string name="Creased">
+ Caídos
+ </string>
+ <string name="Crooked Nose">
+ Nariz torcida
+ </string>
+ <string name="Cuff Flare">
+ Acampanado
+ </string>
+ <string name="Dark">
+ Oscuridad
+ </string>
+ <string name="Dark Green">
+ Verde oscuro
+ </string>
+ <string name="Darker">
+ Más oscuros
+ </string>
+ <string name="Deep">
+ Remarcar
+ </string>
+ <string name="Default Heels">
+ Tacones por defecto
+ </string>
+ <string name="Dense">
+ Densas
+ </string>
+ <string name="Double Chin">
+ Mucha papada
+ </string>
+ <string name="Downturned">
+ Poco
+ </string>
+ <string name="Duffle Bag">
+ Muy abultada
+ </string>
+ <string name="Ear Angle">
+ Orejas: ángulo
+ </string>
+ <string name="Ear Size">
+ Orejas: tamaño
+ </string>
+ <string name="Ear Tips">
+ Orejas: forma
+ </string>
+ <string name="Egg Head">
+ Cabeza: ahuevada
+ </string>
+ <string name="Eye Bags">
+ Ojos: bolsas
+ </string>
+ <string name="Eye Color">
+ Ojos: color
+ </string>
+ <string name="Eye Depth">
+ Ojos: profundidad
+ </string>
+ <string name="Eye Lightness">
+ Ojos: brillo
+ </string>
+ <string name="Eye Opening">
+ Ojos: apertura
+ </string>
+ <string name="Eye Pop">
+ Ojos: simetría
+ </string>
+ <string name="Eye Size">
+ Ojos: tamaño
+ </string>
+ <string name="Eye Spacing">
+ Ojos: separación
+ </string>
+ <string name="Eyebrow Arc">
+ Cejas: arco
+ </string>
+ <string name="Eyebrow Density">
+ Cejas: densidad
+ </string>
+ <string name="Eyebrow Height">
+ Cejas: altura
+ </string>
+ <string name="Eyebrow Points">
+ Cejas: en V
+ </string>
+ <string name="Eyebrow Size">
+ Cejas: tamaño
+ </string>
+ <string name="Eyelash Length">
+ Pestañas: longitud
+ </string>
+ <string name="Eyeliner">
+ Contorno de ojos
+ </string>
+ <string name="Eyeliner Color">
+ Contorno de ojos: color
+ </string>
+ <string name="Eyes Bugged">
+ Eyes Bugged
+ </string>
+ <string name="Face Shear">
+ Cara: simetría
+ </string>
+ <string name="Facial Definition">
+ Rasgos marcados
+ </string>
+ <string name="Far Set Eyes">
+ Ojos separados
+ </string>
+ <string name="Fat Lips">
+ Prominentes
+ </string>
+ <string name="Female">
+ Mujer
+ </string>
+ <string name="Fingerless">
+ Sin dedos
+ </string>
+ <string name="Fingers">
+ Con dedos
+ </string>
+ <string name="Flared Cuffs">
+ Campana
+ </string>
+ <string name="Flat">
+ Redondeadas
+ </string>
+ <string name="Flat Butt">
+ Culo plano
+ </string>
+ <string name="Flat Head">
+ Cabeza plana
+ </string>
+ <string name="Flat Toe">
+ Empeine bajo
+ </string>
+ <string name="Foot Size">
+ Pie: tamaño
+ </string>
+ <string name="Forehead Angle">
+ Frente: ángulo
+ </string>
+ <string name="Forehead Heavy">
+ Hacia la frente
+ </string>
+ <string name="Freckles">
+ Pecas
+ </string>
+ <string name="Front Fringe">
+ Flequillo
+ </string>
+ <string name="Full Back">
+ Sin cortar
+ </string>
+ <string name="Full Eyeliner">
+ Contorno completo
+ </string>
+ <string name="Full Front">
+ Sin cortar
+ </string>
+ <string name="Full Hair Sides">
+ Pelo: volumen a los lados
+ </string>
+ <string name="Full Sides">
+ Volumen total
+ </string>
+ <string name="Glossy">
+ Con brillo
+ </string>
+ <string name="Glove Fingers">
+ Guantes: dedos
+ </string>
+ <string name="Glove Length">
+ Guantes: largo
+ </string>
+ <string name="Hair">
+ Pelo
+ </string>
+ <string name="Hair Back">
+ Pelo: nuca
+ </string>
+ <string name="Hair Front">
+ Pelo: delante
+ </string>
+ <string name="Hair Sides">
+ Pelo: lados
+ </string>
+ <string name="Hair Sweep">
+ Peinado: dirección
+ </string>
+ <string name="Hair Thickess">
+ Pelo: espesor
+ </string>
+ <string name="Hair Thickness">
+ Pelo: espesor
+ </string>
+ <string name="Hair Tilt">
+ Pelo: inclinación
+ </string>
+ <string name="Hair Tilted Left">
+ A la izq.
+ </string>
+ <string name="Hair Tilted Right">
+ A la der.
+ </string>
+ <string name="Hair Volume">
+ Pelo: volumen
+ </string>
+ <string name="Hand Size">
+ Manos: tamaño
+ </string>
+ <string name="Handlebars">
+ Muy largo
+ </string>
+ <string name="Head Length">
+ Cabeza: longitud
+ </string>
+ <string name="Head Shape">
+ Cabeza: forma
+ </string>
+ <string name="Head Size">
+ Cabeza: tamaño
+ </string>
+ <string name="Head Stretch">
+ Cabeza: estiramiento
+ </string>
+ <string name="Heel Height">
+ Tacón: altura
+ </string>
+ <string name="Heel Shape">
+ Tacón: forma
+ </string>
+ <string name="Height">
+ Altura
+ </string>
+ <string name="High">
+ Subir
+ </string>
+ <string name="High Heels">
+ Tacones altos
+ </string>
+ <string name="High Jaw">
+ Mandíbula alta
+ </string>
+ <string name="High Platforms">
+ Suela gorda
+ </string>
+ <string name="High and Tight">
+ Pegada
+ </string>
+ <string name="Higher">
+ Arrriba
+ </string>
+ <string name="Hip Length">
+ Cadera: altura
+ </string>
+ <string name="Hip Width">
+ Cadera: ancho
+ </string>
+ <string name="In">
+ Pegadas
+ </string>
+ <string name="In Shdw Color">
+ Línea de ojos: color
+ </string>
+ <string name="In Shdw Opacity">
+ Línea de ojos: opacidad
+ </string>
+ <string name="Inner Eye Corner">
+ Ojos: lagrimal
+ </string>
+ <string name="Inner Eye Shadow">
+ Inner Eye Shadow
+ </string>
+ <string name="Inner Shadow">
+ Línea de ojos
+ </string>
+ <string name="Jacket Length">
+ Chaqueta: largo
+ </string>
+ <string name="Jacket Wrinkles">
+ Chaqueta: arrugas
+ </string>
+ <string name="Jaw Angle">
+ Mandíbula: ángulo
+ </string>
+ <string name="Jaw Jut">
+ Maxilar inferior
+ </string>
+ <string name="Jaw Shape">
+ Mandíbula: forma
+ </string>
+ <string name="Join">
+ Más junto
+ </string>
+ <string name="Jowls">
+ Mofletes
+ </string>
+ <string name="Knee Angle">
+ Rodillas: ángulo
+ </string>
+ <string name="Knock Kneed">
+ Zambas
+ </string>
+ <string name="Large">
+ Aumentar
+ </string>
+ <string name="Large Hands">
+ Manos grandes
+ </string>
+ <string name="Left Part">
+ Raya: izq.
+ </string>
+ <string name="Leg Length">
+ Piernas: longitud
+ </string>
+ <string name="Leg Muscles">
+ Piernas: musculatura
+ </string>
+ <string name="Less">
+ Menos
+ </string>
+ <string name="Less Body Fat">
+ Menos gordura
+ </string>
+ <string name="Less Curtains">
+ Menos tupida
+ </string>
+ <string name="Less Freckles">
+ Menos pecas
+ </string>
+ <string name="Less Full">
+ Menos grosor
+ </string>
+ <string name="Less Gravity">
+ Más levantado
+ </string>
+ <string name="Less Love">
+ Menos michelines
+ </string>
+ <string name="Less Muscles">
+ Pocos músculos
+ </string>
+ <string name="Less Muscular">
+ Poca musculatura
+ </string>
+ <string name="Less Rosy">
+ Menos sonrosada
+ </string>
+ <string name="Less Round">
+ Menos redondeada
+ </string>
+ <string name="Less Saddle">
+ Menos cartucheras
+ </string>
+ <string name="Less Square">
+ Menos cuadrada
+ </string>
+ <string name="Less Volume">
+ Menos volumen
+ </string>
+ <string name="Less soul">
+ Pequeña
+ </string>
+ <string name="Lighter">
+ Más luminosos
+ </string>
+ <string name="Lip Cleft">
+ Labio: hoyuelo
+ </string>
+ <string name="Lip Cleft Depth">
+ Hoyuelo marcado
+ </string>
+ <string name="Lip Fullness">
+ Labios: grosor
+ </string>
+ <string name="Lip Pinkness">
+ Labios sonrosados
+ </string>
+ <string name="Lip Ratio">
+ Labios: ratio
+ </string>
+ <string name="Lip Thickness">
+ Labios: prominencia
+ </string>
+ <string name="Lip Width">
+ Labios: ancho
+ </string>
+ <string name="Lipgloss">
+ Brillo de labios
+ </string>
+ <string name="Lipstick">
+ Barra de labios
+ </string>
+ <string name="Lipstick Color">
+ Barra de labios: color
+ </string>
+ <string name="Long">
+ Más
+ </string>
+ <string name="Long Head">
+ Cabeza alargada
+ </string>
+ <string name="Long Hips">
+ Cadera larga
+ </string>
+ <string name="Long Legs">
+ Piernas largas
+ </string>
+ <string name="Long Neck">
+ Cuello largo
+ </string>
+ <string name="Long Pigtails">
+ Coletas largas
+ </string>
+ <string name="Long Ponytail">
+ Cola de caballo larga
+ </string>
+ <string name="Long Torso">
+ Torso largo
+ </string>
+ <string name="Long arms">
+ Brazos largos
+ </string>
+ <string name="Loose Pants">
+ Pantalón suelto
+ </string>
+ <string name="Loose Shirt">
+ Camiseta suelta
+ </string>
+ <string name="Loose Sleeves">
+ Puños anchos
+ </string>
+ <string name="Love Handles">
+ Michelines
+ </string>
+ <string name="Low">
+ Bajar
+ </string>
+ <string name="Low Heels">
+ Tacones bajos
+ </string>
+ <string name="Low Jaw">
+ Mandíbula baja
+ </string>
+ <string name="Low Platforms">
+ Suela fina
+ </string>
+ <string name="Low and Loose">
+ Suelta
+ </string>
+ <string name="Lower">
+ Abajo
+ </string>
+ <string name="Lower Bridge">
+ Puente: abajo
+ </string>
+ <string name="Lower Cheeks">
+ Mejillas: abajo
+ </string>
+ <string name="Male">
+ Varón
+ </string>
+ <string name="Middle Part">
+ Raya: en medio
+ </string>
+ <string name="More">
+ Más
+ </string>
+ <string name="More Blush">
+ Más colorete
+ </string>
+ <string name="More Body Fat">
+ Más gordura
+ </string>
+ <string name="More Curtains">
+ Más tupida
+ </string>
+ <string name="More Eyeshadow">
+ Más
+ </string>
+ <string name="More Freckles">
+ Más pecas
+ </string>
+ <string name="More Full">
+ Más grosor
+ </string>
+ <string name="More Gravity">
+ Menos levantado
+ </string>
+ <string name="More Lipstick">
+ Más barra de labios
+ </string>
+ <string name="More Love">
+ Más michelines
+ </string>
+ <string name="More Lower Lip">
+ Más el inferior
+ </string>
+ <string name="More Muscles">
+ Más músculos
+ </string>
+ <string name="More Muscular">
+ Más musculatura
+ </string>
+ <string name="More Rosy">
+ Más sonrosada
+ </string>
+ <string name="More Round">
+ Más redondeada
+ </string>
+ <string name="More Saddle">
+ Más cartucheras
+ </string>
+ <string name="More Sloped">
+ Más inclinada
+ </string>
+ <string name="More Square">
+ Más cuadrada
+ </string>
+ <string name="More Upper Lip">
+ Más el superior
+ </string>
+ <string name="More Vertical">
+ Más recta
+ </string>
+ <string name="More Volume">
+ Más volumen
+ </string>
+ <string name="More soul">
+ Grande
+ </string>
+ <string name="Moustache">
+ Bigote
+ </string>
+ <string name="Mouth Corner">
+ Comisuras
+ </string>
+ <string name="Mouth Position">
+ Boca: posición
+ </string>
+ <string name="Mowhawk">
+ Rapado
+ </string>
+ <string name="Muscular">
+ Muscular
+ </string>
+ <string name="Mutton Chops">
+ Patillas largas
+ </string>
+ <string name="Nail Polish">
+ Uñas pintadas
+ </string>
+ <string name="Nail Polish Color">
+ Uñas pintadas: color
+ </string>
+ <string name="Narrow">
+ Disminuir
+ </string>
+ <string name="Narrow Back">
+ Rapada
+ </string>
+ <string name="Narrow Front">
+ Entradas
+ </string>
+ <string name="Narrow Lips">
+ Labios estrechos
+ </string>
+ <string name="Natural">
+ Natural
+ </string>
+ <string name="Neck Length">
+ Cuello: longitud
+ </string>
+ <string name="Neck Thickness">
+ Cuello: grosor
+ </string>
+ <string name="No Blush">
+ Sin colorete
+ </string>
+ <string name="No Eyeliner">
+ Sin contorno
+ </string>
+ <string name="No Eyeshadow">
+ Menos
+ </string>
+ <string name="No Lipgloss">
+ Sin brillo
+ </string>
+ <string name="No Lipstick">
+ Sin barra de labios
+ </string>
+ <string name="No Part">
+ Sin raya
+ </string>
+ <string name="No Polish">
+ Sin pintar
+ </string>
+ <string name="No Red">
+ Nada
+ </string>
+ <string name="No Spikes">
+ Sin crestas
+ </string>
+ <string name="No White">
+ Sin blanco
+ </string>
+ <string name="No Wrinkles">
+ Sin arrugas
+ </string>
+ <string name="Normal Lower">
+ Normal Lower
+ </string>
+ <string name="Normal Upper">
+ Normal Upper
+ </string>
+ <string name="Nose Left">
+ Nariz a la izq.
+ </string>
+ <string name="Nose Right">
+ Nariz a la der.
+ </string>
+ <string name="Nose Size">
+ Nariz: tamaño
+ </string>
+ <string name="Nose Thickness">
+ Nariz: grosor
+ </string>
+ <string name="Nose Tip Angle">
+ Nariz: respingona
+ </string>
+ <string name="Nose Tip Shape">
+ Nariz: punta
+ </string>
+ <string name="Nose Width">
+ Nariz: ancho
+ </string>
+ <string name="Nostril Division">
+ Ventana: altura
+ </string>
+ <string name="Nostril Width">
+ Ventana: ancho
+ </string>
+ <string name="Opaque">
+ Opaco
+ </string>
+ <string name="Open">
+ Abrir
+ </string>
+ <string name="Open Back">
+ Apertura trasera
+ </string>
+ <string name="Open Front">
+ Apertura frontal
+ </string>
+ <string name="Open Left">
+ Abierta
+ </string>
+ <string name="Open Right">
+ Abierta
+ </string>
+ <string name="Orange">
+ Anaranjado
+ </string>
+ <string name="Out">
+ De soplillo
+ </string>
+ <string name="Out Shdw Color">
+ Sombra de ojos: color
+ </string>
+ <string name="Out Shdw Opacity">
+ Sombra de ojos: opacidad
+ </string>
+ <string name="Outer Eye Corner">
+ Ojos: comisura
+ </string>
+ <string name="Outer Eye Shadow">
+ Outer Eye Shadow
+ </string>
+ <string name="Outer Shadow">
+ Sombra de ojos
+ </string>
+ <string name="Overbite">
+ Retraído
+ </string>
+ <string name="Package">
+ Pubis
+ </string>
+ <string name="Painted Nails">
+ Pintadas
+ </string>
+ <string name="Pale">
+ Pálida
+ </string>
+ <string name="Pants Crotch">
+ Pantalón: cruz
+ </string>
+ <string name="Pants Fit">
+ Ceñido
+ </string>
+ <string name="Pants Length">
+ Pernera: largo
+ </string>
+ <string name="Pants Waist">
+ Caja
+ </string>
+ <string name="Pants Wrinkles">
+ Pantalón: arrugas
+ </string>
+ <string name="Part">
+ Raya
+ </string>
+ <string name="Part Bangs">
+ Flequillo partido
+ </string>
+ <string name="Pectorals">
+ Pectorales
+ </string>
+ <string name="Pigment">
+ Tono
+ </string>
+ <string name="Pigtails">
+ Coletas
+ </string>
+ <string name="Pink">
+ Rosa
+ </string>
+ <string name="Pinker">
+ Más sonrosados
+ </string>
+ <string name="Platform Height">
+ Suela: altura
+ </string>
+ <string name="Platform Width">
+ Suela: ancho
+ </string>
+ <string name="Pointy">
+ En punta
+ </string>
+ <string name="Pointy Heels">
+ De aguja
+ </string>
+ <string name="Ponytail">
+ Cola de caballo
+ </string>
+ <string name="Poofy Skirt">
+ Con vuelo
+ </string>
+ <string name="Pop Left Eye">
+ Izquierdo más grande
+ </string>
+ <string name="Pop Right Eye">
+ Derecho más grande
+ </string>
+ <string name="Puffy">
+ Hinchadas
+ </string>
+ <string name="Puffy Eyelids">
+ Ojeras
+ </string>
+ <string name="Rainbow Color">
+ Irisación
+ </string>
+ <string name="Red Hair">
+ Pelirrojo
+ </string>
+ <string name="Regular">
+ Regular
+ </string>
+ <string name="Right Part">
+ Raya: der.
+ </string>
+ <string name="Rosy Complexion">
+ Tez sonrosada
+ </string>
+ <string name="Round">
+ Redondear
+ </string>
+ <string name="Ruddiness">
+ Rubicundez
+ </string>
+ <string name="Ruddy">
+ Rojiza
+ </string>
+ <string name="Rumpled Hair">
+ Pelo encrespado
+ </string>
+ <string name="Saddle Bags">
+ Cartucheras
+ </string>
+ <string name="Scrawny Leg">
+ Piernas flacas
+ </string>
+ <string name="Separate">
+ Más ancho
+ </string>
+ <string name="Shallow">
+ Sin marcar
+ </string>
+ <string name="Shear Back">
+ Nuca: corte
+ </string>
+ <string name="Shear Face">
+ Shear Face
+ </string>
+ <string name="Shear Front">
+ Shear Front
+ </string>
+ <string name="Shear Left Up">
+ Arriba - izq.
+ </string>
+ <string name="Shear Right Up">
+ Arriba - der.
+ </string>
+ <string name="Sheared Back">
+ Rapada
+ </string>
+ <string name="Sheared Front">
+ Rapada
+ </string>
+ <string name="Shift Left">
+ A la izq.
+ </string>
+ <string name="Shift Mouth">
+ Boca: ladeada
+ </string>
+ <string name="Shift Right">
+ A la der.
+ </string>
+ <string name="Shirt Bottom">
+ Alto de cintura
+ </string>
+ <string name="Shirt Fit">
+ Ceñido
+ </string>
+ <string name="Shirt Wrinkles">
+ Camisa: arrugas
+ </string>
+ <string name="Shoe Height">
+ Caña: altura
+ </string>
+ <string name="Short">
+ Menos
+ </string>
+ <string name="Short Arms">
+ Brazos cortos
+ </string>
+ <string name="Short Legs">
+ Piernas cortas
+ </string>
+ <string name="Short Neck">
+ Cuello corto
+ </string>
+ <string name="Short Pigtails">
+ Coletas cortas
+ </string>
+ <string name="Short Ponytail">
+ Cola de caballo corta
+ </string>
+ <string name="Short Sideburns">
+ Patillas cortas
+ </string>
+ <string name="Short Torso">
+ Torso corto
+ </string>
+ <string name="Short hips">
+ Cadera corta
+ </string>
+ <string name="Shoulders">
+ Hombros
+ </string>
+ <string name="Side Fringe">
+ Lados: franja
+ </string>
+ <string name="Sideburns">
+ Patillas
+ </string>
+ <string name="Sides Hair">
+ Pelo: lados
+ </string>
+ <string name="Sides Hair Down">
+ Bajar lados del pelo
+ </string>
+ <string name="Sides Hair Up">
+ Subir lados del pelo
+ </string>
+ <string name="Skinny Neck">
+ Cuello estrecho
+ </string>
+ <string name="Skirt Fit">
+ Falda: vuelo
+ </string>
+ <string name="Skirt Length">
+ Falda: largo
+ </string>
+ <string name="Slanted Forehead">
+ Slanted Forehead
+ </string>
+ <string name="Sleeve Length">
+ Largo de manga
+ </string>
+ <string name="Sleeve Looseness">
+ Ancho de puños
+ </string>
+ <string name="Slit Back">
+ Raja trasera
+ </string>
+ <string name="Slit Front">
+ Raja frontal
+ </string>
+ <string name="Slit Left">
+ Raja a la izq.
+ </string>
+ <string name="Slit Right">
+ Raja a la der.
+ </string>
+ <string name="Small">
+ Disminuir
+ </string>
+ <string name="Small Hands">
+ Manos pequeñas
+ </string>
+ <string name="Small Head">
+ Cabeza pequeña
+ </string>
+ <string name="Smooth">
+ Leves
+ </string>
+ <string name="Smooth Hair">
+ Pelo liso
+ </string>
+ <string name="Socks Length">
+ Calcetines: largo
+ </string>
+ <string name="Soulpatch">
+ Perilla
+ </string>
+ <string name="Sparse">
+ Depiladas
+ </string>
+ <string name="Spiked Hair">
+ Crestas
+ </string>
+ <string name="Square">
+ Cuadrada
+ </string>
+ <string name="Square Toe">
+ Punta cuadrada
+ </string>
+ <string name="Squash Head">
+ Cabeza aplastada
+ </string>
+ <string name="Stretch Head">
+ Cabeza estirada
+ </string>
+ <string name="Sunken">
+ Chupadas
+ </string>
+ <string name="Sunken Chest">
+ Estrecho de pecho
+ </string>
+ <string name="Sunken Eyes">
+ Ojos hundidos
+ </string>
+ <string name="Sweep Back">
+ Sweep Back
+ </string>
+ <string name="Sweep Forward">
+ Sweep Forward
+ </string>
+ <string name="Tall">
+ Más
+ </string>
+ <string name="Taper Back">
+ Cubierta trasera
+ </string>
+ <string name="Taper Front">
+ Cubierta frontal
+ </string>
+ <string name="Thick Heels">
+ Tacones grandes
+ </string>
+ <string name="Thick Neck">
+ Cuello ancho
+ </string>
+ <string name="Thick Toe">
+ Empeine alto
+ </string>
+ <string name="Thin">
+ Delgadas
+ </string>
+ <string name="Thin Eyebrows">
+ Cejas finas
+ </string>
+ <string name="Thin Lips">
+ Hacia dentro
+ </string>
+ <string name="Thin Nose">
+ Nariz fina
+ </string>
+ <string name="Tight Chin">
+ Poca papada
+ </string>
+ <string name="Tight Cuffs">
+ Sin campana
+ </string>
+ <string name="Tight Pants">
+ Pantalón ceñido
+ </string>
+ <string name="Tight Shirt">
+ Camisa ceñida
+ </string>
+ <string name="Tight Skirt">
+ Falda ceñida
+ </string>
+ <string name="Tight Sleeves">
+ Puños ceñidos
+ </string>
+ <string name="Toe Shape">
+ Punta: forma
+ </string>
+ <string name="Toe Thickness">
+ Empeine
+ </string>
+ <string name="Torso Length">
+ Torso: longitud
+ </string>
+ <string name="Torso Muscles">
+ Torso: musculatura
+ </string>
+ <string name="Torso Scrawny">
+ Torso flacucho
+ </string>
+ <string name="Unattached">
+ Largos
+ </string>
+ <string name="Uncreased">
+ Abiertos
+ </string>
+ <string name="Underbite">
+ Prognatismo
+ </string>
+ <string name="Unnatural">
+ No natural
+ </string>
+ <string name="Upper Bridge">
+ Puente: arriba
+ </string>
+ <string name="Upper Cheeks">
+ Mejillas: arriba
+ </string>
+ <string name="Upper Chin Cleft">
+ Barbilla: prominencia
+ </string>
+ <string name="Upper Eyelid Fold">
+ Párpados
+ </string>
+ <string name="Upturned">
+ Mucho
+ </string>
+ <string name="Very Red">
+ Del todo
+ </string>
+ <string name="Waist Height">
+ Cintura
+ </string>
+ <string name="Well-Fed">
+ Mofletes
+ </string>
+ <string name="White Hair">
+ Pelo blanco
+ </string>
+ <string name="Wide">
+ Aumentar
+ </string>
+ <string name="Wide Back">
+ Completa
+ </string>
+ <string name="Wide Front">
+ Completa
+ </string>
+ <string name="Wide Lips">
+ Labios anchos
+ </string>
+ <string name="Wild">
+ Total
+ </string>
+ <string name="Wrinkles">
+ Arrugas
+ </string>
+ <string name="LocationCtrlAddLandmarkTooltip">
+ Añadir a mis hitos
+ </string>
+ <string name="LocationCtrlEditLandmarkTooltip">
+ Editar mis hitos
+ </string>
+ <string name="LocationCtrlInfoBtnTooltip">
+ Ver más información de esta localización
+ </string>
+ <string name="LocationCtrlComboBtnTooltip">
+ Historial de mis localizaciones
+ </string>
+ <string name="LocationCtrlForSaleTooltip">
+ Comprar este terreno
+ </string>
+ <string name="LocationCtrlAdultIconTooltip">
+ Región Adulta
+ </string>
+ <string name="LocationCtrlModerateIconTooltip">
+ Región Moderada
+ </string>
+ <string name="LocationCtrlGeneralIconTooltip">
+ Región General
+ </string>
+ <string name="LocationCtrlSeeAVsTooltip">
+ Los avatares están visibles y está permitido el chat fuera de esta parcela
+ </string>
+ <string name="UpdaterWindowTitle">
+ Actualizar [APP_NAME]
+ </string>
+ <string name="UpdaterNowUpdating">
+ Actualizando [APP_NAME]...
+ </string>
+ <string name="UpdaterNowInstalling">
+ Instalando [APP_NAME]...
+ </string>
+ <string name="UpdaterUpdatingDescriptive">
+ Tu visor [APP_NAME] se está actualizando a la última versión. Llevará algún tiempo, paciencia.
+ </string>
+ <string name="UpdaterProgressBarTextWithEllipses">
+ Descargando la actualización...
+ </string>
+ <string name="UpdaterProgressBarText">
+ Descargando la actualización
+ </string>
+ <string name="UpdaterFailDownloadTitle">
+ Fallo en la descarga de la actualización
+ </string>
+ <string name="UpdaterFailUpdateDescriptive">
+ Ha habido un error actualizando [APP_NAME]. Por favor, descarga la última versión desde www.secondlife.com.
+ </string>
+ <string name="UpdaterFailInstallTitle">
+ Fallo al instalar la actualización
+ </string>
+ <string name="UpdaterFailStartTitle">
+ Fallo al iniciar el visor
+ </string>
+ <string name="ItemsComingInTooFastFrom">
+ [APP_NAME]: Los ítems se reciben muy rápido de [FROM_NAME]; desactivada la vista previa automática durante [TIME] sgs.
+ </string>
+ <string name="ItemsComingInTooFast">
+ [APP_NAME]: Los ítems se reciben muy rápido; desactivada la vista previa automática durante [TIME] sgs.
+ </string>
+ <string name="IM_logging_string">
+ -- Activado el registro de los mensajes instantáneos --
+ </string>
+ <string name="IM_typing_start_string">
+ [NAME] está escribiendo...
+ </string>
+ <string name="Unnamed">
+ (sin nombre)
+ </string>
+ <string name="IM_moderated_chat_label">
+ (Moderado: por defecto, desactivada la voz)
+ </string>
+ <string name="IM_unavailable_text_label">
+ Para esta llamada no está disponible el chat de texto.
+ </string>
+ <string name="IM_muted_text_label">
+ Un moderador del grupo ha desactivado tu chat de texto.
+ </string>
+ <string name="IM_default_text_label">
+ Pulsa aquí para enviar un mensaje instantáneo.
+ </string>
+ <string name="IM_to_label">
+ A
+ </string>
+ <string name="IM_moderator_label">
+ (Moderador)
+ </string>
+ <string name="Saved_message">
+ (Guardado [LONG_TIMESTAMP])
+ </string>
+ <string name="answered_call">
+ Han respondido a tu llamada
+ </string>
+ <string name="you_started_call">
+ Has iniciado una llamada de voz
+ </string>
+ <string name="you_joined_call">
+ Has entrado en la llamada de voz
+ </string>
+ <string name="name_started_call">
+ [NAME] inició una llamada de voz
+ </string>
+ <string name="ringing-im">
+ Haciendo la llamada de voz...
+ </string>
+ <string name="connected-im">
+ Conectado, pulsa Colgar para salir
+ </string>
+ <string name="hang_up-im">
+ Se colgó la llamada de voz
+ </string>
+ <string name="conference-title-incoming">
+ Conferencia con [AGENT_NAME]
+ </string>
+ <string name="inventory_item_offered-im">
+ Ofrecido el item del inventario
+ </string>
+ <string name="share_alert">
+ Arrastra los ítems desde el invenbtario hasta aquí
+ </string>
+ <string name="no_session_message">
+ (La sesión de MI no existe)
+ </string>
+ <string name="only_user_message">
+ Usted es el único usuario en esta sesión.
+ </string>
+ <string name="offline_message">
+ [NAME] está desconectado.
+ </string>
+ <string name="invite_message">
+ Pulse el botón [BUTTON NAME] para aceptar/conectar este chat de voz.
+ </string>
+ <string name="muted_message">
+ Has ignorado a este residente. Enviándole un mensaje, automáticamente dejarás de ignorarle.
+ </string>
+ <string name="generic">
+ Error en lo solicitado, por favor, inténtalo más tarde.
+ </string>
+ <string name="generic_request_error">
+ Error al hacer lo solicitado; por favor, inténtelo más tarde.
+ </string>
+ <string name="insufficient_perms_error">
+ Usted no tiene permisos suficientes.
+ </string>
+ <string name="session_does_not_exist_error">
+ La sesión ya acabó
+ </string>
+ <string name="no_ability_error">
+ Usted no tiene esa capacidad.
+ </string>
+ <string name="no_ability">
+ Usted no tiene esa capacidad.
+ </string>
+ <string name="not_a_mod_error">
+ Usted no es un moderador de la sesión.
+ </string>
+ <string name="muted">
+ Un moderador del grupo ha desactivado tu chat de texto.
+ </string>
+ <string name="muted_error">
+ Un moderador del grupo le ha desactivado el chat de texto.
+ </string>
+ <string name="add_session_event">
+ No se ha podido añadir usuarios a la sesión de chat con [RECIPIENT].
+ </string>
+ <string name="message">
+ No se ha podido enviar tu mensaje a la sesión de chat con [RECIPIENT].
+ </string>
+ <string name="message_session_event">
+ No se ha podido enviar su mensaje a la sesión de chat con [RECIPIENT].
+ </string>
+ <string name="mute">
+ Error moderando.
+ </string>
+ <string name="removed">
+ Se te ha sacado del grupo.
+ </string>
+ <string name="removed_from_group">
+ Ha sido eliminado del grupo.
+ </string>
+ <string name="close_on_no_ability">
+ Usted ya no tendrá más la capacidad de estar en la sesión de chat.
+ </string>
+ <string name="unread_chat_single">
+ [SOURCES] ha dicho algo nuevo
+ </string>
+ <string name="unread_chat_multiple">
+ [SOURCES] ha dicho algo nuevo
+ </string>
+ <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>
+ <string name="paid_you_ldollars">
+ [NAME] te ha pagado [AMOUNT] L$ [REASON].
+ </string>
+ <string name="paid_you_ldollars_no_reason">
+ [NAME] te ha pagado [AMOUNT] L$.
+ </string>
+ <string name="you_paid_ldollars">
+ Has pagado [AMOUNT] L$ a [NAME] por [REASON].
+ </string>
+ <string name="you_paid_ldollars_no_info">
+ Has pagado[AMOUNT] L$
+ </string>
+ <string name="you_paid_ldollars_no_reason">
+ Has pagado [AMOUNT] L$ a [NAME].
+ </string>
+ <string name="you_paid_ldollars_no_name">
+ Has pagado [AMOUNT] L$ por [REASON].
+ </string>
+ <string name="you_paid_failure_ldollars">
+ No has pagado a [NAME] [AMOUNT] L$ [REASON].
+ </string>
+ <string name="you_paid_failure_ldollars_no_info">
+ No has pagado [AMOUNT] L$.
+ </string>
+ <string name="you_paid_failure_ldollars_no_reason">
+ No has pagado a [NAME] [AMOUNT] L$.
+ </string>
+ <string name="you_paid_failure_ldollars_no_name">
+ No has pagado [AMOUNT] L$ [REASON].
+ </string>
+ <string name="for item">
+ para [ITEM]
+ </string>
+ <string name="for a parcel of land">
+ para una parcela de terreno
+ </string>
+ <string name="for a land access pass">
+ para un pase de acceso a terrenos
+ </string>
+ <string name="for deeding land">
+ for deeding land
+ </string>
+ <string name="to create a group">
+ para crear un grupo
+ </string>
+ <string name="to join a group">
+ para entrar a un grupo
+ </string>
+ <string name="to upload">
+ to upload
+ </string>
+ <string name="to publish a classified ad">
+ para publicar un anuncio clasificado
+ </string>
+ <string name="giving">
+ Dando [AMOUNT] L$
+ </string>
+ <string name="uploading_costs">
+ Subir esto cuesta [AMOUNT] L$
+ </string>
+ <string name="this_costs">
+ Esto cuesta [AMOUNT] L$
+ </string>
+ <string name="buying_selected_land">
+ Compra del terreno seleccionado por [AMOUNT] L$
+ </string>
+ <string name="this_object_costs">
+ Este objeto cuesta [AMOUNT] L$
+ </string>
+ <string name="group_role_everyone">
+ Todos
+ </string>
+ <string name="group_role_officers">
+ Oficiales
+ </string>
+ <string name="group_role_owners">
+ Propietarios
+ </string>
+ <string name="group_member_status_online">
+ Conectado/a
+ </string>
+ <string name="uploading_abuse_report">
+ Subiendo...
+
+Denuncia de infracción
+ </string>
+ <string name="New Shape">
+ Anatomía nueva
+ </string>
+ <string name="New Skin">
+ Piel nueva
+ </string>
+ <string name="New Hair">
+ Pelo nuevo
+ </string>
+ <string name="New Eyes">
+ Ojos nuevos
+ </string>
+ <string name="New Shirt">
+ Camisa nueva
+ </string>
+ <string name="New Pants">
+ Pantalón nuevo
+ </string>
+ <string name="New Shoes">
+ Zapatos nuevos
+ </string>
+ <string name="New Socks">
+ Calcetines nuevos
+ </string>
+ <string name="New Jacket">
+ Chaqueta nueva
+ </string>
+ <string name="New Gloves">
+ Guantes nuevos
+ </string>
+ <string name="New Undershirt">
+ Camiseta nueva
+ </string>
+ <string name="New Underpants">
+ Ropa interior nueva
+ </string>
+ <string name="New Skirt">
+ Falda nueva
+ </string>
+ <string name="New Alpha">
+ Nueva Alfa
+ </string>
+ <string name="New Tattoo">
+ Tatuaje nuevo
+ </string>
+ <string name="New Physics">
+ Nueva física
+ </string>
+ <string name="Invalid Wearable">
+ No se puede poner
+ </string>
+ <string name="New Gesture">
+ Gesto nuevo
+ </string>
+ <string name="New Script">
+ Script nuevo
+ </string>
+ <string name="New Note">
+ Nota nueva
+ </string>
+ <string name="New Folder">
+ Carpeta nueva
+ </string>
+ <string name="Contents">
+ Contenidos
+ </string>
+ <string name="Gesture">
+ Gestos
+ </string>
+ <string name="Male Gestures">
+ Gestos de hombre
+ </string>
+ <string name="Female Gestures">
+ Gestos de mujer
+ </string>
+ <string name="Other Gestures">
+ Otros gestos
+ </string>
+ <string name="Speech Gestures">
+ Gestos al hablar
+ </string>
+ <string name="Common Gestures">
+ Gestos corrientes
+ </string>
+ <string name="Male - Excuse me">
+ Varón - Disculpa
+ </string>
+ <string name="Male - Get lost">
+ Varón – Déjame en paz
+ </string>
+ <string name="Male - Blow kiss">
+ Varón - Lanzar un beso
+ </string>
+ <string name="Male - Boo">
+ Varón - Abucheo
+ </string>
+ <string name="Male - Bored">
+ Varón - Aburrido
+ </string>
+ <string name="Male - Hey">
+ Varón – ¡Eh!
+ </string>
+ <string name="Male - Laugh">
+ Varón - Risa
+ </string>
+ <string name="Male - Repulsed">
+ Varón - Rechazo
+ </string>
+ <string name="Male - Shrug">
+ Varón - Encogimiento de hombros
+ </string>
+ <string name="Male - Stick tougue out">
+ Varón - Sacando la lengua
+ </string>
+ <string name="Male - Wow">
+ Varón - Admiración
+ </string>
+ <string name="Female - Chuckle">
+ Mujer - Risa suave
+ </string>
+ <string name="Female - Cry">
+ Mujer - Llorar
+ </string>
+ <string name="Female - Embarrassed">
+ Mujer - Ruborizada
+ </string>
+ <string name="Female - Excuse me">
+ Mujer - Disculpa
+ </string>
+ <string name="Female - Get lost">
+ Mujer – Déjame en paz
+ </string>
+ <string name="Female - Blow kiss">
+ Mujer - Lanzar un beso
+ </string>
+ <string name="Female - Boo">
+ Mujer - Abucheo
+ </string>
+ <string name="Female - Bored">
+ Mujer - Aburrida
+ </string>
+ <string name="Female - Hey">
+ Mujer - ¡Eh!
+ </string>
+ <string name="Female - Hey baby">
+ Mujer - ¡Eh, encanto!
+ </string>
+ <string name="Female - Laugh">
+ Mujer - Risa
+ </string>
+ <string name="Female - Looking good">
+ Mujer - Buen aspecto
+ </string>
+ <string name="Female - Over here">
+ Mujer - Por aquí
+ </string>
+ <string name="Female - Please">
+ Mujer - Por favor
+ </string>
+ <string name="Female - Repulsed">
+ Mujer - Rechazo
+ </string>
+ <string name="Female - Shrug">
+ Mujer - Encogimiento de hombros
+ </string>
+ <string name="Female - Stick tougue out">
+ Mujer - Sacando la lengua
+ </string>
+ <string name="Female - Wow">
+ Mujer - Admiración
+ </string>
+ <string name="/bow">
+ /reverencia
+ </string>
+ <string name="/clap">
+ /aplaudir
+ </string>
+ <string name="/count">
+ /contar
+ </string>
+ <string name="/extinguish">
+ /apagar
+ </string>
+ <string name="/kmb">
+ /bmc
+ </string>
+ <string name="/muscle">
+ /músculo
+ </string>
+ <string name="/no">
+ /no
+ </string>
+ <string name="/no!">
+ /¡no!
+ </string>
+ <string name="/paper">
+ /papel
+ </string>
+ <string name="/pointme">
+ /señalarme
+ </string>
+ <string name="/pointyou">
+ /señalarte
+ </string>
+ <string name="/rock">
+ /piedra
+ </string>
+ <string name="/scissor">
+ /tijera
+ </string>
+ <string name="/smoke">
+ /fumar
+ </string>
+ <string name="/stretch">
+ /estirar
+ </string>
+ <string name="/whistle">
+ /silbar
+ </string>
+ <string name="/yes">
+ /sí
+ </string>
+ <string name="/yes!">
+ /¡sí!
+ </string>
+ <string name="afk">
+ ausente
+ </string>
+ <string name="dance1">
+ baile1
+ </string>
+ <string name="dance2">
+ baile2
+ </string>
+ <string name="dance3">
+ baile3
+ </string>
+ <string name="dance4">
+ baile4
+ </string>
+ <string name="dance5">
+ baile5
+ </string>
+ <string name="dance6">
+ baile6
+ </string>
+ <string name="dance7">
+ baile7
+ </string>
+ <string name="dance8">
+ baile8
+ </string>
+ <string name="AvatarBirthDateFormat">
+ [day,datetime,slt]/[mthnum,datetime,slt]/[year,datetime,slt]
+ </string>
+ <string name="DefaultMimeType">
+ ninguno/ninguno
+ </string>
+ <string name="texture_load_dimensions_error">
+ No se puede subir imágenes mayores de [WIDTH]*[HEIGHT]
+ </string>
+ <string name="words_separator" value=","/>
+ <string name="server_is_down">
+ Parece que hay algún problema que ha escapado a nuestros controles.
+
+ Visita status.secondlifegrid.net para ver si hay alguna incidencia conocida que esté afectando al servicio.
+ Si sigues teniendo problemas, comprueba la configuración de la red y del servidor de seguridad.
+ </string>
+ <string name="dateTimeWeekdaysNames">
+ Domingo:Lunes:Martes:Miércoles:Jueves:Viernes:Sábado
+ </string>
+ <string name="dateTimeWeekdaysShortNames">
+ Dom:Lun:Mar:Mié:Jue:Vie:Sáb
+ </string>
+ <string name="dateTimeMonthNames">
+ Enero:Febrero:Marzo:Abril:Mayo:Junio:Julio:Agosto:Septiembre:Octubre:Noviembre:Diciembre
+ </string>
+ <string name="dateTimeMonthShortNames">
+ Ene:Feb:Mar:Abr:May:Jun:Jul:Ago:Sep:Oct:Nov:Dic
+ </string>
+ <string name="dateTimeDayFormat">
+ [MDAY]
+ </string>
+ <string name="dateTimeAM">
+ AM
+ </string>
+ <string name="dateTimePM">
+ PM
+ </string>
+ <string name="LocalEstimateUSD">
+ [AMOUNT] US$
+ </string>
+ <string name="Membership">
+ Membresía
+ </string>
+ <string name="Roles">
+ Roles
+ </string>
+ <string name="Group Identity">
+ Indentidad de grupo
+ </string>
+ <string name="Parcel Management">
+ Gestión de la parcela
+ </string>
+ <string name="Parcel Identity">
+ Identidad de la parcela
+ </string>
+ <string name="Parcel Settings">
+ Configuración de la parcela
+ </string>
+ <string name="Parcel Powers">
+ Poder de la parcela
+ </string>
+ <string name="Parcel Access">
+ Acceso a la parcela
+ </string>
+ <string name="Parcel Content">
+ Contenido de la parcela
+ </string>
+ <string name="Object Management">
+ Manejo de objetos
+ </string>
+ <string name="Accounting">
+ Contabilidad
+ </string>
+ <string name="Notices">
+ Avisos
+ </string>
+ <string name="Chat" value="Chat :">
+ Chat
+ </string>
+ <string name="DeleteItems">
+ ¿Deseas eliminar los elementos seleccionados?
+ </string>
+ <string name="DeleteItem">
+ ¿Deseas eliminar el elemento seleccionado?
+ </string>
+ <string name="EmptyOutfitText">
+ No hay elementos en este vestuario
+ </string>
+ <string name="ExternalEditorNotSet">
+ Selecciona un editor mediante la configuración de ExternalEditor.
+ </string>
+ <string name="ExternalEditorNotFound">
+ No se encuentra el editor externo especificado.
+Inténtalo incluyendo la ruta de acceso al editor entre comillas
+(por ejemplo, &quot;/ruta a mi/editor&quot; &quot;%s&quot;).
+ </string>
+ <string name="ExternalEditorCommandParseError">
+ Error al analizar el comando de editor externo.
+ </string>
+ <string name="ExternalEditorFailedToRun">
+ Error al ejecutar el editor externo.
+ </string>
+ <string name="TranslationFailed">
+ Error al traducir: [REASON]
+ </string>
+ <string name="TranslationResponseParseError">
+ Error al analizar la respuesta de la traducción.
+ </string>
+ <string name="Esc">
+ Esc
+ </string>
+ <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">
+ Base
+ </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">
+ Añadir
+ </string>
+ <string name="Subtract">
+ Restar
+ </string>
+ <string name="Multiply">
+ Multiplicar
+ </string>
+ <string name="Divide">
+ Dividir
+ </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">
+ Viendo balizas de partículas (azules)
+ </string>
+ <string name="BeaconPhysical">
+ Viendo balizas de objetos materiales (verdes)
+ </string>
+ <string name="BeaconScripted">
+ Viendo balizas de objetos con script (rojas)
+ </string>
+ <string name="BeaconScriptedTouch">
+ Viendo el objeto con script con balizas de función táctil (rojas)
+ </string>
+ <string name="BeaconSound">
+ Viendo balizas de sonido (amarillas)
+ </string>
+ <string name="BeaconMedia">
+ Viendo balizas de medios (blancas)
+ </string>
+ <string name="ParticleHiding">
+ Ocultando las partículas
+ </string>
+ <string name="Command_AboutLand_Label">
+ Acerca del terreno
+ </string>
+ <string name="Command_Appearance_Label">
+ Apariencia
+ </string>
+ <string name="Command_Avatar_Label">
+ Avatar
+ </string>
+ <string name="Command_Build_Label">
+ Construir
+ </string>
+ <string name="Command_Chat_Label">
+ Chat
+ </string>
+ <string name="Command_Compass_Label">
+ Brújula
+ </string>
+ <string name="Command_Destinations_Label">
+ Destinos
+ </string>
+ <string name="Command_Gestures_Label">
+ Gestos
+ </string>
+ <string name="Command_HowTo_Label">
+ Cómo
+ </string>
+ <string name="Command_Inventory_Label">
+ Inventario
+ </string>
+ <string name="Command_Map_Label">
+ Mapa
+ </string>
+ <string name="Command_Marketplace_Label">
+ Mercado
+ </string>
+ <string name="Command_MiniMap_Label">
+ Minimapa
+ </string>
+ <string name="Command_Move_Label">
+ Caminar / Correr / Volar
+ </string>
+ <string name="Command_Outbox_Label">
+ Buzón de salida de comerciante
+ </string>
+ <string name="Command_People_Label">
+ Gente
+ </string>
+ <string name="Command_Picks_Label">
+ Destacados
+ </string>
+ <string name="Command_Places_Label">
+ Lugares
+ </string>
+ <string name="Command_Preferences_Label">
+ Preferencias
+ </string>
+ <string name="Command_Profile_Label">
+ Perfil
+ </string>
+ <string name="Command_Search_Label">
+ Buscar
+ </string>
+ <string name="Command_Snapshot_Label">
+ Foto
+ </string>
+ <string name="Command_Speak_Label">
+ Hablar
+ </string>
+ <string name="Command_View_Label">
+ Controles de la cámara
+ </string>
+ <string name="Command_Voice_Label">
+ Configuración de voz
+ </string>
+ <string name="Command_AboutLand_Tooltip">
+ Información sobre el terreno que vas a visitar
+ </string>
+ <string name="Command_Appearance_Tooltip">
+ Cambiar tu avatar
+ </string>
+ <string name="Command_Avatar_Tooltip">
+ Elegir un avatar completo
+ </string>
+ <string name="Command_Build_Tooltip">
+ Construir objetos y modificar la forma del terreno
+ </string>
+ <string name="Command_Chat_Tooltip">
+ Habla por chat de texto con las personas próximas
+ </string>
+ <string name="Command_Compass_Tooltip">
+ Brújula
+ </string>
+ <string name="Command_Destinations_Tooltip">
+ Destinos de interés
+ </string>
+ <string name="Command_Gestures_Tooltip">
+ Gestos para tu avatar
+ </string>
+ <string name="Command_HowTo_Tooltip">
+ Cómo hacer las tareas habituales
+ </string>
+ <string name="Command_Inventory_Tooltip">
+ Ver y usar tus pertenencias
+ </string>
+ <string name="Command_Map_Tooltip">
+ Mapa del mundo
+ </string>
+ <string name="Command_Marketplace_Tooltip">
+ Ir de compras
+ </string>
+ <string name="Command_MiniMap_Tooltip">
+ Mostrar la gente que está cerca
+ </string>
+ <string name="Command_Move_Tooltip">
+ Desplazando el avatar
+ </string>
+ <string name="Command_Outbox_Tooltip">
+ Transfiere objetos a tu mercado para venderlos
+ </string>
+ <string name="Command_People_Tooltip">
+ Amigos, grupos y personas próximas
+ </string>
+ <string name="Command_Picks_Tooltip">
+ Lugares que se mostrarán como favoritos en tu perfil
+ </string>
+ <string name="Command_Places_Tooltip">
+ Lugares que has guardado
+ </string>
+ <string name="Command_Preferences_Tooltip">
+ Preferencias
+ </string>
+ <string name="Command_Profile_Tooltip">
+ Consulta o edita tu perfil
+ </string>
+ <string name="Command_Search_Tooltip">
+ Buscar lugares, eventos y personas
+ </string>
+ <string name="Command_Snapshot_Tooltip">
+ Tomar una fotografía
+ </string>
+ <string name="Command_Speak_Tooltip">
+ Utiliza el micrófono para hablar con las personas próximas
+ </string>
+ <string name="Command_View_Tooltip">
+ Cambiando el ángulo de la cámara
+ </string>
+ <string name="Command_Voice_Tooltip">
+ Controles de volumen para las llamadas y la gente que se encuentre cerca de ti en el mundo virtual
+ </string>
+ <string name="Toolbar_Bottom_Tooltip">
+ actualmente en tu barra de herramientas inferior
+ </string>
+ <string name="Toolbar_Left_Tooltip">
+ actualmente en tu barra de herramientas izquierda
+ </string>
+ <string name="Toolbar_Right_Tooltip">
+ actualmente en tu barra de herramientas derecha
+ </string>
+ <string name="Retain%">
+ % retención
+ </string>
+ <string name="Detail">
+ Detalle
+ </string>
+ <string name="Better Detail">
+ Mejor detalle
+ </string>
+ <string name="Surface">
+ Superficie
+ </string>
+ <string name="Solid">
+ Sólido
+ </string>
+ <string name="Wrap">
+ Envoltura
+ </string>
+ <string name="Preview">
+ Vista previa
+ </string>
+ <string name="Normal">
+ Normal
+ </string>
+ <string name="snapshot_quality_very_low">
+ Muy bajo
+ </string>
+ <string name="snapshot_quality_low">
+ Bajo
+ </string>
+ <string name="snapshot_quality_medium">
+ Medio
+ </string>
+ <string name="snapshot_quality_high">
+ Alto
+ </string>
+ <string name="snapshot_quality_very_high">
+ Muy alto
+ </string>
+</strings>
diff --git a/indra/newview/skins/steam/xui/fr/strings.xml b/indra/newview/skins/steam/xui/fr/strings.xml
new file mode 100644
index 0000000000..ac34dd67c8
--- /dev/null
+++ b/indra/newview/skins/steam/xui/fr/strings.xml
@@ -0,0 +1,5018 @@
+<?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">
+ Grille de Second Life
+ </string>
+ <string name="SUPPORT_SITE">
+ Portail Assistance Second Life
+ </string>
+ <string name="StartupDetectingHardware">
+ Détection du matériel...
+ </string>
+ <string name="StartupLoading">
+ Chargement de [APP_NAME]...
+ </string>
+ <string name="StartupClearingCache">
+ Vidage du cache...
+ </string>
+ <string name="StartupInitializingTextureCache">
+ Initialisation du cache des textures...
+ </string>
+ <string name="StartupInitializingVFS">
+ Initialisation VFS...
+ </string>
+ <string name="StartupRequireDriverUpdate">
+ Échec d&apos;initialisation des graphiques. Veuillez mettre votre pilote graphique à jour.
+ </string>
+ <string name="ProgressRestoring">
+ Restauration...
+ </string>
+ <string name="ProgressChangingResolution">
+ Changement de la résolution...
+ </string>
+ <string name="Fullbright">
+ Fullbright (Legacy)
+ </string>
+ <string name="LoginInProgress">
+ La connexion à [APP_NAME] apparaît peut-être comme étant gelée. Veuillez patienter.
+ </string>
+ <string name="LoginInProgressNoFrozen">
+ Connexion...
+ </string>
+ <string name="LoginAuthenticating">
+ Authentification en cours
+ </string>
+ <string name="LoginMaintenance">
+ Maintenance du compte en cours…
+ </string>
+ <string name="LoginAttempt">
+ La tentative de connexion précédente a échoué. Connexion, esssai [NUMBER]
+ </string>
+ <string name="LoginPrecaching">
+ Monde en cours de chargement…
+ </string>
+ <string name="LoginInitializingBrowser">
+ Navigateur Web incorporé en cours d&apos;initialisation…
+ </string>
+ <string name="LoginInitializingMultimedia">
+ Multimédia en cours d&apos;initialisation…
+ </string>
+ <string name="LoginInitializingFonts">
+ Chargement des polices en cours...
+ </string>
+ <string name="LoginVerifyingCache">
+ Fichiers du cache en cours de vérification (peut prendre 60-90 s)...
+ </string>
+ <string name="LoginProcessingResponse">
+ Réponse en cours de traitement…
+ </string>
+ <string name="LoginInitializingWorld">
+ Monde en cours d&apos;initialisation…
+ </string>
+ <string name="LoginDecodingImages">
+ Décodage des images en cours...
+ </string>
+ <string name="LoginInitializingQuicktime">
+ Quicktime en cours d&apos;initialisation
+ </string>
+ <string name="LoginQuicktimeNotFound">
+ Quicktime introuvable, impossible de procéder à l&apos;initialisation.
+ </string>
+ <string name="LoginQuicktimeOK">
+ Initialisation de Quicktime réussie.
+ </string>
+ <string name="LoginRequestSeedCapGrant">
+ Capacités de la région demandées...
+ </string>
+ <string name="LoginRetrySeedCapGrant">
+ Capacités de la région demandées... Tentative n° [NUMBER].
+ </string>
+ <string name="LoginWaitingForRegionHandshake">
+ Liaison avec la région en cours de création...
+ </string>
+ <string name="LoginConnectingToRegion">
+ Connexion avec la région en cours...
+ </string>
+ <string name="LoginDownloadingClothing">
+ Habits en cours de téléchargement...
+ </string>
+ <string name="InvalidCertificate">
+ Certificat non valide ou corrompu renvoyé par le serveur. Contactez l&apos;administrateur de la grille.
+ </string>
+ <string name="CertInvalidHostname">
+ Nom d&apos;hôte non valide utilisé pour accéder au serveur. Vérifiez votre nom d&apos;hôte de grille ou SLURL.
+ </string>
+ <string name="CertExpired">
+ Il semble que le certificat renvoyé par la grille ait expiré. Vérifiez votre horloge système ou contactez l&apos;administrateur de la grille.
+ </string>
+ <string name="CertKeyUsage">
+ Impossible d&apos;utiliser le certificat renvoyé par le serveur pour SSL. Contactez l&apos;administrateur de la grille.
+ </string>
+ <string name="CertBasicConstraints">
+ Certificats trop nombreux dans la chaîne des certificats du serveur. Contactez l&apos;administrateur de la grille.
+ </string>
+ <string name="CertInvalidSignature">
+ Impossible de vérifier la signature de certificat renvoyée par le serveur de la grille. Contactez l&apos;administrateur de la grille.
+ </string>
+ <string name="LoginFailedNoNetwork">
+ Erreur réseau : impossible d&apos;établir la connexion. Veuillez vérifier votre connexion réseau.
+ </string>
+ <string name="LoginFailed">
+ Échec de la connexion.
+ </string>
+ <string name="Quit">
+ Quitter
+ </string>
+ <string name="create_account_url">
+ http://join.secondlife.com/index.php?sourceid=1206_steam&amp;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 de 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>
+ <string name="SavingSettings">
+ Enregistrement des paramètres...
+ </string>
+ <string name="LoggingOut">
+ Déconnexion...
+ </string>
+ <string name="ShuttingDown">
+ Arrêt en cours...
+ </string>
+ <string name="YouHaveBeenDisconnected">
+ Vous avez été déconnecté de la région où vous étiez.
+ </string>
+ <string name="SentToInvalidRegion">
+ Vous avez été transféré vers une région non valide.
+ </string>
+ <string name="TestingDisconnect">
+ Test de déconnexion du client
+ </string>
+ <string name="TooltipPerson">
+ Personne
+ </string>
+ <string name="TooltipNoName">
+ (pas de nom)
+ </string>
+ <string name="TooltipOwner">
+ Propriétaire :
+ </string>
+ <string name="TooltipPublic">
+ Public
+ </string>
+ <string name="TooltipIsGroup">
+ (Groupe)
+ </string>
+ <string name="TooltipForSaleL$">
+ À vendre : [AMOUNT] L$
+ </string>
+ <string name="TooltipFlagGroupBuild">
+ Contruction de groupe
+ </string>
+ <string name="TooltipFlagNoBuild">
+ Pas de construction
+ </string>
+ <string name="TooltipFlagNoEdit">
+ Contruction de groupe
+ </string>
+ <string name="TooltipFlagNotSafe">
+ Non sécurisé
+ </string>
+ <string name="TooltipFlagNoFly">
+ Interdiction de voler
+ </string>
+ <string name="TooltipFlagGroupScripts">
+ Scripts de groupe
+ </string>
+ <string name="TooltipFlagNoScripts">
+ Pas de scripts
+ </string>
+ <string name="TooltipLand">
+ Terrain :
+ </string>
+ <string name="TooltipMustSingleDrop">
+ Impossible de faire glisser plus d&apos;un objet ici
+ </string>
+ <string name="TooltipPrice" value="[AMOUNT] L$ :"/>
+ <string name="TooltipOutboxDragToWorld">
+ Impossible de rezzer des articles dans la boîte d&apos;envoi vendeur
+ </string>
+ <string name="TooltipOutboxNoTransfer">
+ Impossible de vendre ou de transférer un ou plusieurs de ces objets.
+ </string>
+ <string name="TooltipOutboxNotInInventory">
+ La boîte d&apos;envoi vendeur n&apos;accepte que les articles directement issus de votre inventaire.
+ </string>
+ <string name="TooltipOutboxWorn">
+ Impossible de placer des articles que vous portez dans votre boîte d&apos;envoi vendeur
+ </string>
+ <string name="TooltipOutboxCallingCard">
+ Impossible de placer des cartes de visite dans votre boîte d&apos;envoi vendeur
+ </string>
+ <string name="TooltipOutboxFolderLevels">
+ Il existe plus de 3 niveaux de dossiers imbriqués.
+ </string>
+ <string name="TooltipOutboxTooManyFolders">
+ Le dossier de niveau supérieur contient plus de 20 sous-dossiers.
+ </string>
+ <string name="TooltipOutboxTooManyObjects">
+ Le dossier de niveau supérieur contient plus de 200 articles.
+ </string>
+ <string name="TooltipDragOntoOwnChild">
+ Impossible de déplacer un dossier vers son enfant
+ </string>
+ <string name="TooltipDragOntoSelf">
+ Impossible de déplacer un dossier vers lui-même
+ </string>
+ <string name="TooltipHttpUrl">
+ Cliquez pour afficher cette page web
+ </string>
+ <string name="TooltipSLURL">
+ Cliquez pour en savoir plus sur cet endroit
+ </string>
+ <string name="TooltipAgentUrl">
+ Cliquez pour afficher le profil de ce résident
+ </string>
+ <string name="TooltipAgentInspect">
+ En savoir plus sur ce résident
+ </string>
+ <string name="TooltipAgentMute">
+ Cliquer pour ignorer ce résident
+ </string>
+ <string name="TooltipAgentUnmute">
+ Cliquer pour ne plus ignorer ce résident
+ </string>
+ <string name="TooltipAgentIM">
+ Cliquer pour envoyer un IM à ce résident
+ </string>
+ <string name="TooltipAgentPay">
+ Cliquer pour payer ce résident
+ </string>
+ <string name="TooltipAgentOfferTeleport">
+ Cliquer pour proposer une téléportation à ce résident
+ </string>
+ <string name="TooltipAgentRequestFriend">
+ Cliquer pour demander à ce résident d&apos;être votre ami
+ </string>
+ <string name="TooltipGroupUrl">
+ Cliquez pour afficher la description de ce groupe
+ </string>
+ <string name="TooltipEventUrl">
+ Cliquez pour afficher la description de cet événement
+ </string>
+ <string name="TooltipClassifiedUrl">
+ Cliquez pour afficher cette petite annonce
+ </string>
+ <string name="TooltipParcelUrl">
+ Cliquez pour afficher la description de cette parcelle
+ </string>
+ <string name="TooltipTeleportUrl">
+ Cliquez pour vous téléporter à cet endroit
+ </string>
+ <string name="TooltipObjectIMUrl">
+ Cliquez pour afficher la description de cet objet
+ </string>
+ <string name="TooltipMapUrl">
+ Cliquez pour voir cet emplacement sur la carte
+ </string>
+ <string name="TooltipSLAPP">
+ Cliquez pour exécuter la commande secondlife://
+ </string>
+ <string name="CurrentURL" value=" URL actuelle : [CurrentURL]"/>
+ <string name="SLurlLabelTeleport">
+ Me téléporter vers
+ </string>
+ <string name="SLurlLabelShowOnMap">
+ Afficher la carte pour
+ </string>
+ <string name="SLappAgentMute">
+ Ignorer
+ </string>
+ <string name="SLappAgentUnmute">
+ Ne plus ignorer
+ </string>
+ <string name="SLappAgentIM">
+ IM
+ </string>
+ <string name="SLappAgentPay">
+ Payer
+ </string>
+ <string name="SLappAgentOfferTeleport">
+ Proposer une téléportation à
+ </string>
+ <string name="SLappAgentRequestFriend">
+ Demande d&apos;amitié
+ </string>
+ <string name="BUTTON_CLOSE_DARWIN">
+ Fermer (⌘W)
+ </string>
+ <string name="BUTTON_CLOSE_WIN">
+ Fermer (Ctrl+W)
+ </string>
+ <string name="BUTTON_CLOSE_CHROME">
+ Fermer
+ </string>
+ <string name="BUTTON_RESTORE">
+ Restaurer
+ </string>
+ <string name="BUTTON_MINIMIZE">
+ Minimiser
+ </string>
+ <string name="BUTTON_TEAR_OFF">
+ Réduire
+ </string>
+ <string name="BUTTON_DOCK">
+ Attacher
+ </string>
+ <string name="BUTTON_HELP">
+ Afficher l&apos;aide
+ </string>
+ <string name="Searching">
+ Recherche...
+ </string>
+ <string name="NoneFound">
+ Aucun résultat.
+ </string>
+ <string name="RetrievingData">
+ En cours d&apos;extraction...
+ </string>
+ <string name="ReleaseNotes">
+ Notes de version
+ </string>
+ <string name="RELEASE_NOTES_BASE_URL">
+ http://wiki.secondlife.com/wiki/Release_Notes/
+ </string>
+ <string name="LoadingData">
+ Chargement...
+ </string>
+ <string name="AvatarNameNobody">
+ (personne)
+ </string>
+ <string name="AvatarNameWaiting">
+ (en attente)
+ </string>
+ <string name="AvatarNameMultiple">
+ (multiple)
+ </string>
+ <string name="GroupNameNone">
+ (aucun)
+ </string>
+ <string name="AvalineCaller">
+ Appelant Avaline [ORDER]
+ </string>
+ <string name="AssetErrorNone">
+ Aucune erreur
+ </string>
+ <string name="AssetErrorRequestFailed">
+ Requête de l&apos;actif : échec
+ </string>
+ <string name="AssetErrorNonexistentFile">
+ Requête de l&apos;actif : fichier inexistant
+ </string>
+ <string name="AssetErrorNotInDatabase">
+ Requête de l&apos;actif : actif introuvable dans la base de données
+ </string>
+ <string name="AssetErrorEOF">
+ Fin du ficher
+ </string>
+ <string name="AssetErrorCannotOpenFile">
+ Impossible d&apos;ouvrir le fichier
+ </string>
+ <string name="AssetErrorFileNotFound">
+ Fichier introuvable
+ </string>
+ <string name="AssetErrorTCPTimeout">
+ Délai d&apos;attente du transfert du fichier dépassé
+ </string>
+ <string name="AssetErrorCircuitGone">
+ Disparition du circuit
+ </string>
+ <string name="AssetErrorPriceMismatch">
+ Il y a une différence de prix entre le client et le serveur
+ </string>
+ <string name="AssetErrorUnknownStatus">
+ Statut inconnu
+ </string>
+ <string name="texture">
+ texture
+ </string>
+ <string name="sound">
+ son
+ </string>
+ <string name="calling card">
+ carte de visite
+ </string>
+ <string name="landmark">
+ repère
+ </string>
+ <string name="legacy script">
+ script (ancienne version)
+ </string>
+ <string name="clothing">
+ habits
+ </string>
+ <string name="object">
+ objet
+ </string>
+ <string name="note card">
+ note
+ </string>
+ <string name="folder">
+ dossier
+ </string>
+ <string name="root">
+ racine
+ </string>
+ <string name="lsl2 script">
+ script LSL2
+ </string>
+ <string name="lsl bytecode">
+ bytecode LSL
+ </string>
+ <string name="tga texture">
+ texture tga
+ </string>
+ <string name="body part">
+ partie du corps
+ </string>
+ <string name="snapshot">
+ photo
+ </string>
+ <string name="lost and found">
+ Objets trouvés
+ </string>
+ <string name="targa image">
+ image targa
+ </string>
+ <string name="trash">
+ Corbeille
+ </string>
+ <string name="jpeg image">
+ image jpeg
+ </string>
+ <string name="animation">
+ animation
+ </string>
+ <string name="gesture">
+ geste
+ </string>
+ <string name="simstate">
+ simstate
+ </string>
+ <string name="favorite">
+ favori
+ </string>
+ <string name="symbolic link">
+ lien
+ </string>
+ <string name="symbolic folder link">
+ lien du dossier
+ </string>
+ <string name="mesh">
+ maillage
+ </string>
+ <string name="AvatarEditingAppearance">
+ (Apparence en cours de modification)
+ </string>
+ <string name="AvatarAway">
+ Absent
+ </string>
+ <string name="AvatarBusy">
+ Occupé
+ </string>
+ <string name="AvatarMuted">
+ Bloqué(e)
+ </string>
+ <string name="anim_express_afraid">
+ Effrayé
+ </string>
+ <string name="anim_express_anger">
+ En colère
+ </string>
+ <string name="anim_away">
+ Absent
+ </string>
+ <string name="anim_backflip">
+ Salto arrière
+ </string>
+ <string name="anim_express_laugh">
+ Rire en se tenant le ventre
+ </string>
+ <string name="anim_express_toothsmile">
+ Grand sourire
+ </string>
+ <string name="anim_blowkiss">
+ Envoyer un baiser
+ </string>
+ <string name="anim_express_bored">
+ Bailler d&apos;ennui
+ </string>
+ <string name="anim_bow">
+ S&apos;incliner
+ </string>
+ <string name="anim_clap">
+ Applaudir
+ </string>
+ <string name="anim_courtbow">
+ Révérence de cour
+ </string>
+ <string name="anim_express_cry">
+ Pleurer
+ </string>
+ <string name="anim_dance1">
+ Danse 1
+ </string>
+ <string name="anim_dance2">
+ Danse 2
+ </string>
+ <string name="anim_dance3">
+ Danse 3
+ </string>
+ <string name="anim_dance4">
+ Danse 4
+ </string>
+ <string name="anim_dance5">
+ Danse 5
+ </string>
+ <string name="anim_dance6">
+ Danse 6
+ </string>
+ <string name="anim_dance7">
+ Danse 7
+ </string>
+ <string name="anim_dance8">
+ Danse 8
+ </string>
+ <string name="anim_express_disdain">
+ Mépris
+ </string>
+ <string name="anim_drink">
+ Boire
+ </string>
+ <string name="anim_express_embarrased">
+ Gêne
+ </string>
+ <string name="anim_angry_fingerwag">
+ Désapprobation
+ </string>
+ <string name="anim_fist_pump">
+ Victoire
+ </string>
+ <string name="anim_yoga_float">
+ Yoga
+ </string>
+ <string name="anim_express_frown">
+ Froncer les sourcils
+ </string>
+ <string name="anim_impatient">
+ Impatient
+ </string>
+ <string name="anim_jumpforjoy">
+ Sauter de joie
+ </string>
+ <string name="anim_kissmybutt">
+ Va te faire voir !
+ </string>
+ <string name="anim_express_kiss">
+ Envoyer un baiser
+ </string>
+ <string name="anim_laugh_short">
+ Rire
+ </string>
+ <string name="anim_musclebeach">
+ Montrer ses muscles
+ </string>
+ <string name="anim_no_unhappy">
+ Non (mécontent)
+ </string>
+ <string name="anim_no_head">
+ Non
+ </string>
+ <string name="anim_nyanya">
+ Na na na na nère
+ </string>
+ <string name="anim_punch_onetwo">
+ Gauche-droite
+ </string>
+ <string name="anim_express_open_mouth">
+ Bouche ouverte
+ </string>
+ <string name="anim_peace">
+ Paix
+ </string>
+ <string name="anim_point_you">
+ Montrer quelqu&apos;un du doigt
+ </string>
+ <string name="anim_point_me">
+ Se montrer du doigt
+ </string>
+ <string name="anim_punch_l">
+ Gauche
+ </string>
+ <string name="anim_punch_r">
+ Droite
+ </string>
+ <string name="anim_rps_countdown">
+ Compter (pierre-papier-ciseaux)
+ </string>
+ <string name="anim_rps_paper">
+ Papier (pierre-papier-ciseaux)
+ </string>
+ <string name="anim_rps_rock">
+ Pierre (pierre-papier-ciseaux)
+ </string>
+ <string name="anim_rps_scissors">
+ Ciseaux (pierre-papier-ciseaux)
+ </string>
+ <string name="anim_express_repulsed">
+ Dégoût
+ </string>
+ <string name="anim_kick_roundhouse_r">
+ Coup de pied circulaire
+ </string>
+ <string name="anim_express_sad">
+ Triste
+ </string>
+ <string name="anim_salute">
+ Salut
+ </string>
+ <string name="anim_shout">
+ Crier
+ </string>
+ <string name="anim_express_shrug">
+ Hausser les épaules
+ </string>
+ <string name="anim_express_smile">
+ Sourire
+ </string>
+ <string name="anim_smoke_idle">
+ Fumer, immobile
+ </string>
+ <string name="anim_smoke_inhale">
+ Fumer, prendre une bouffée
+ </string>
+ <string name="anim_smoke_throw_down">
+ Fumer, jeter son mégot
+ </string>
+ <string name="anim_express_surprise">
+ Surprise
+ </string>
+ <string name="anim_sword_strike_r">
+ Coup d&apos;épée
+ </string>
+ <string name="anim_angry_tantrum">
+ Caprice
+ </string>
+ <string name="anim_express_tongue_out">
+ Tirer la langue
+ </string>
+ <string name="anim_hello">
+ Faire signe
+ </string>
+ <string name="anim_whisper">
+ Chuchoter
+ </string>
+ <string name="anim_whistle">
+ Siffler
+ </string>
+ <string name="anim_express_wink">
+ Clin d&apos;œil
+ </string>
+ <string name="anim_wink_hollywood">
+ Clin d&apos;œil (Hollywood)
+ </string>
+ <string name="anim_express_worry">
+ Soucis
+ </string>
+ <string name="anim_yes_happy">
+ Oui (Joie)
+ </string>
+ <string name="anim_yes_head">
+ Oui
+ </string>
+ <string name="multiple_textures">
+ Multiples
+ </string>
+ <string name="texture_loading">
+ Chargement...
+ </string>
+ <string name="worldmap_offline">
+ Hors ligne
+ </string>
+ <string name="worldmap_item_tooltip_format">
+ [AREA] m² [PRICE] L$
+ </string>
+ <string name="worldmap_results_none_found">
+ Aucun résultat.
+ </string>
+ <string name="Ok">
+ OK
+ </string>
+ <string name="Premature end of file">
+ Fichier incomplet
+ </string>
+ <string name="ST_NO_JOINT">
+ Impossible de trouver ROOT ou JOINT.
+ </string>
+ <string name="whisper">
+ chuchote :
+ </string>
+ <string name="shout">
+ crie :
+ </string>
+ <string name="ringing">
+ Connexion au chat vocal du Monde en cours…
+ </string>
+ <string name="connected">
+ Connecté(e)
+ </string>
+ <string name="unavailable">
+ Voix non disponible à l&apos;endroit où vous êtes
+ </string>
+ <string name="hang_up">
+ Déconnecté du chat vocal
+ </string>
+ <string name="reconnect_nearby">
+ Vous allez maintenant être reconnecté(e) au chat vocal près de vous.
+ </string>
+ <string name="ScriptQuestionCautionChatGranted">
+ &apos;[OBJECTNAME]&apos;, un objet appartenant à [OWNERNAME], situé dans [REGIONNAME] à [REGIONPOS], a reçu le droit de : [PERMISSIONS].
+ </string>
+ <string name="ScriptQuestionCautionChatDenied">
+ &apos;[OBJECTNAME]&apos;, un objet appartenant à [OWNERNAME], situé dans [REGIONNAME] à [REGIONPOS], n&apos;a pas reçu le droit de : [PERMISSIONS].
+ </string>
+ <string name="ScriptTakeMoney">
+ Débiter vos Linden dollars (L$)
+ </string>
+ <string name="ActOnControlInputs">
+ Utiliser vos touches de commandes
+ </string>
+ <string name="RemapControlInputs">
+ Reconfigurer vos touches de commandes
+ </string>
+ <string name="AnimateYourAvatar">
+ Animer votre avatar
+ </string>
+ <string name="AttachToYourAvatar">
+ Attacher à votre avatar
+ </string>
+ <string name="ReleaseOwnership">
+ Passer l&apos;objet dans le domaine public (sans propriétaire)
+ </string>
+ <string name="LinkAndDelink">
+ Lier et délier d&apos;autres objets
+ </string>
+ <string name="AddAndRemoveJoints">
+ Créer et supprimer des liens avec d&apos;autres objets
+ </string>
+ <string name="ChangePermissions">
+ Modifier ses droits
+ </string>
+ <string name="TrackYourCamera">
+ Suivre votre caméra
+ </string>
+ <string name="ControlYourCamera">
+ Contrôler votre caméra
+ </string>
+ <string name="NotConnected">
+ Pas connecté(e)
+ </string>
+ <string name="SIM_ACCESS_PG">
+ Général
+ </string>
+ <string name="SIM_ACCESS_MATURE">
+ Modéré
+ </string>
+ <string name="SIM_ACCESS_ADULT">
+ Adulte
+ </string>
+ <string name="SIM_ACCESS_DOWN">
+ Hors ligne
+ </string>
+ <string name="SIM_ACCESS_MIN">
+ Inconnu
+ </string>
+ <string name="land_type_unknown">
+ (inconnu)
+ </string>
+ <string name="Estate / Full Region">
+ Domaine / Région entière
+ </string>
+ <string name="Estate / Homestead">
+ Domaine / Homestead
+ </string>
+ <string name="Mainland / Homestead">
+ Continent / Homestead
+ </string>
+ <string name="Mainland / Full Region">
+ Continent / Région entière
+ </string>
+ <string name="all_files">
+ Tous fichiers
+ </string>
+ <string name="sound_files">
+ Sons
+ </string>
+ <string name="animation_files">
+ Animations
+ </string>
+ <string name="image_files">
+ Images
+ </string>
+ <string name="save_file_verb">
+ Enregistrer
+ </string>
+ <string name="load_file_verb">
+ Charger
+ </string>
+ <string name="targa_image_files">
+ Images Targa
+ </string>
+ <string name="bitmap_image_files">
+ Images Bitmap
+ </string>
+ <string name="avi_movie_file">
+ Fichier de film AVI
+ </string>
+ <string name="xaf_animation_file">
+ Fichier d&apos;animation XAF
+ </string>
+ <string name="xml_file">
+ Fichier XML
+ </string>
+ <string name="raw_file">
+ Fichier RAW
+ </string>
+ <string name="compressed_image_files">
+ Images compressées
+ </string>
+ <string name="load_files">
+ Charger des fichiers
+ </string>
+ <string name="choose_the_directory">
+ Choisir le répertoire
+ </string>
+ <string name="script_files">
+ Scripts
+ </string>
+ <string name="AvatarSetNotAway">
+ Présent
+ </string>
+ <string name="AvatarSetAway">
+ Absent
+ </string>
+ <string name="AvatarSetNotBusy">
+ Pas occupé
+ </string>
+ <string name="AvatarSetBusy">
+ Occupé
+ </string>
+ <string name="shape">
+ Silhouette
+ </string>
+ <string name="skin">
+ Peau
+ </string>
+ <string name="hair">
+ Cheveux
+ </string>
+ <string name="eyes">
+ Yeux
+ </string>
+ <string name="shirt">
+ Chemise
+ </string>
+ <string name="pants">
+ Pantalon
+ </string>
+ <string name="shoes">
+ Chaussures
+ </string>
+ <string name="socks">
+ Chaussettes
+ </string>
+ <string name="jacket">
+ Veste
+ </string>
+ <string name="gloves">
+ Gants
+ </string>
+ <string name="undershirt">
+ Débardeur
+ </string>
+ <string name="underpants">
+ Caleçon
+ </string>
+ <string name="skirt">
+ Jupe
+ </string>
+ <string name="alpha">
+ Alpha
+ </string>
+ <string name="tattoo">
+ Tatouage
+ </string>
+ <string name="physics">
+ Propriétés physiques
+ </string>
+ <string name="invalid">
+ non valide
+ </string>
+ <string name="none">
+ aucun
+ </string>
+ <string name="shirt_not_worn">
+ Chemise non portée
+ </string>
+ <string name="pants_not_worn">
+ Pantalon non porté
+ </string>
+ <string name="shoes_not_worn">
+ Chaussures non portées
+ </string>
+ <string name="socks_not_worn">
+ Chaussettes non portées
+ </string>
+ <string name="jacket_not_worn">
+ Veste non portée
+ </string>
+ <string name="gloves_not_worn">
+ Gants non portés
+ </string>
+ <string name="undershirt_not_worn">
+ Débardeur non porté
+ </string>
+ <string name="underpants_not_worn">
+ Caleçon non porté
+ </string>
+ <string name="skirt_not_worn">
+ Jupe non portée
+ </string>
+ <string name="alpha_not_worn">
+ Alpha non porté
+ </string>
+ <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>
+ <string name="create_new_shape">
+ Créer une nouvelle silhouette
+ </string>
+ <string name="create_new_skin">
+ Créer une nouvelle peau
+ </string>
+ <string name="create_new_hair">
+ Créer de nouveaux cheveux
+ </string>
+ <string name="create_new_eyes">
+ Créer de nouveaux yeux
+ </string>
+ <string name="create_new_shirt">
+ Créer une nouvelle chemise
+ </string>
+ <string name="create_new_pants">
+ Créer un nouveau pantalon
+ </string>
+ <string name="create_new_shoes">
+ Créer de nouvelles chaussures
+ </string>
+ <string name="create_new_socks">
+ Créer de nouvelles chaussettes
+ </string>
+ <string name="create_new_jacket">
+ Créer une nouvelle veste
+ </string>
+ <string name="create_new_gloves">
+ Créer de nouveaux gants
+ </string>
+ <string name="create_new_undershirt">
+ Créer un nouveau débardeur
+ </string>
+ <string name="create_new_underpants">
+ Créer un nouveau caleçon
+ </string>
+ <string name="create_new_skirt">
+ Créer une nouvelle jupe
+ </string>
+ <string name="create_new_alpha">
+ Créer un nouvel alpha
+ </string>
+ <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>
+ <string name="NewWearable">
+ Nouv. [WEARABLE_ITEM]
+ </string>
+ <string name="next">
+ Suivant
+ </string>
+ <string name="ok">
+ OK
+ </string>
+ <string name="GroupNotifyGroupNotice">
+ Note au groupe
+ </string>
+ <string name="GroupNotifyGroupNotices">
+ Notices au groupe
+ </string>
+ <string name="GroupNotifySentBy">
+ Envoyée par
+ </string>
+ <string name="GroupNotifyAttached">
+ Pièce(s) jointe(s) :
+ </string>
+ <string name="GroupNotifyViewPastNotices">
+ Consultez les notices précédentes ou choisissez de ne plus recevoir ces messages ici.
+ </string>
+ <string name="GroupNotifyOpenAttachment">
+ Ouvrir pièce jointe
+ </string>
+ <string name="GroupNotifySaveAttachment">
+ Enregistrer la pièce jointe
+ </string>
+ <string name="TeleportOffer">
+ Offre de téléportation
+ </string>
+ <string name="StartUpNotifications">
+ De nouvelles notifications sont arrivées en votre absence.
+ </string>
+ <string name="OverflowInfoChannelString">
+ Vous avez %d notification(s) supplémentaire(s)
+ </string>
+ <string name="BodyPartsRightArm">
+ Bras droit
+ </string>
+ <string name="BodyPartsHead">
+ Tête
+ </string>
+ <string name="BodyPartsLeftArm">
+ Bras gauche
+ </string>
+ <string name="BodyPartsLeftLeg">
+ Jambe gauche
+ </string>
+ <string name="BodyPartsTorso">
+ Torse
+ </string>
+ <string name="BodyPartsRightLeg">
+ Jambe droite
+ </string>
+ <string name="GraphicsQualityLow">
+ Faible
+ </string>
+ <string name="GraphicsQualityMid">
+ Moyen
+ </string>
+ <string name="GraphicsQualityHigh">
+ Élevé
+ </string>
+ <string name="LeaveMouselook">
+ Appuyez sur ESC pour quitter la vue subjective
+ </string>
+ <string name="InventoryNoMatchingItems">
+ Vous n&apos;avez pas trouvé ce que vous cherchiez ? Essayez [secondlife:///app/search/all/[SEARCH_TERM] Rechercher].
+ </string>
+ <string name="PlacesNoMatchingItems">
+ Vous n&apos;avez pas trouvé ce que vous cherchiez ? Essayez [secondlife:///app/search/places/[SEARCH_TERM] Rechercher].
+ </string>
+ <string name="FavoritesNoMatchingItems">
+ Faites glisser un repère ici pour l&apos;ajouter à vos Favoris.
+ </string>
+ <string name="InventoryNoTexture">
+ Vous n&apos;avez pas de copie de cette texture dans votre inventaire
+ </string>
+ <string name="InventoryInboxNoItems">
+ Les achats que vous avez effectués sur la Place du marché s&apos;affichent ici. Vous pouvez alors les faire glisser vers votre inventaire afin de les utiliser.
+ </string>
+ <string name="MarketplaceURL">
+ https://marketplace.[MARKETPLACE_DOMAIN_NAME]/
+ </string>
+ <string name="MarketplaceURL_CreateStore">
+ http://community.secondlife.com/t5/English-Knowledge-Base/Selling-in-the-Marketplace/ta-p/700193#Section_.4
+ </string>
+ <string name="MarketplaceURL_Dashboard">
+ https://marketplace.[MARKETPLACE_DOMAIN_NAME]/merchants/store/dashboard
+ </string>
+ <string name="MarketplaceURL_Imports">
+ https://marketplace.[MARKETPLACE_DOMAIN_NAME]/merchants/store/imports
+ </string>
+ <string name="MarketplaceURL_LearnMore">
+ https://marketplace.[MARKETPLACE_DOMAIN_NAME]/learn_more
+ </string>
+ <string name="InventoryOutboxNotMerchantTitle">
+ Tout le monde peut vendre des articles sur la Place du marché.
+ </string>
+ <string name="InventoryOutboxNotMerchantTooltip"/>
+ <string name="InventoryOutboxNotMerchant">
+ Pour devenir vendeur, vous devez [[MARKETPLACE_CREATE_STORE_URL] créer une boutique sur la Place du marché].
+ </string>
+ <string name="InventoryOutboxNoItemsTitle">
+ Votre boîte d&apos;envoi est vide.
+ </string>
+ <string name="InventoryOutboxNoItemsTooltip"/>
+ <string name="InventoryOutboxNoItems">
+ Pour mettre des dossiers en vente sur la [[MARKETPLACE_DASHBOARD_URL] Place du marché], faites-les glisser vers cette zone et cliquez sur &quot;Envoyer vers la Place du marché&quot;.
+ </string>
+ <string name="Marketplace Error None">
+ Aucune erreur
+ </string>
+ <string name="Marketplace Error Not Merchant">
+ Erreur : avant d&apos;envoyer des articles vers la Place du marché, vous devez vous configurer comme vendeur (gratuit).
+ </string>
+ <string name="Marketplace Error Empty Folder">
+ Erreur : ce dossier est vide.
+ </string>
+ <string name="Marketplace Error Unassociated Products">
+ Erreur : le chargement de cet article a échoué en raison d&apos;un nombre trop important d&apos;articles non associés à des produits au niveau de votre compte de vendeur. Pour résoudre ce problème, connectez-vous au site Web de la Place du marché et réduisez le nombre d&apos;articles non associés.
+ </string>
+ <string name="Marketplace Error Object Limit">
+ Erreur : cet article contient trop d&apos;objets. Pour résoudre le problème, regroupez des objets dans des paquets afin de réduire le nombre total à moins de 200.
+ </string>
+ <string name="Marketplace Error Folder Depth">
+ Erreur : trop de niveaux de dossiers imbriqués concernant cet article. Réorganisez le tout afin qu&apos;un maximum de 3 niveaux soit utilisé.
+ </string>
+ <string name="Marketplace Error Unsellable Item">
+ Erreur : cet article ne peut pas être vendu sur la Place du marché.
+ </string>
+ <string name="Marketplace Error Internal Import">
+ Erreur : un problème est survenu concernant cet article. Veuillez réessayer ultérieurement.
+ </string>
+ <string name="Open landmarks">
+ Ouvrir les repères
+ </string>
+ <string name="no_transfer" value=" (pas de transfert)"/>
+ <string name="no_modify" value=" (pas de modification)"/>
+ <string name="no_copy" value=" (pas de copie)"/>
+ <string name="worn" value=" (porté)"/>
+ <string name="link" value=" (lien)"/>
+ <string name="broken_link" value=" (broken_link)"/>
+ <string name="LoadingContents">
+ chargement des contenus en cours...
+ </string>
+ <string name="NoContents">
+ Aucun contenu
+ </string>
+ <string name="WornOnAttachmentPoint" value=" (porté sur [ATTACHMENT_POINT])"/>
+ <string name="ActiveGesture" value="[GESLABEL] (actif)"/>
+ <string name="PermYes">
+ Oui
+ </string>
+ <string name="PermNo">
+ Non
+ </string>
+ <string name="Chat Message" value="Chat :"/>
+ <string name="Sound" value=" Son :"/>
+ <string name="Wait" value=" --- Attendre :"/>
+ <string name="AnimFlagStop" value=" Arrêter l&apos;animation :"/>
+ <string name="AnimFlagStart" value=" Lancer l&apos;animation :"/>
+ <string name="Wave" value=" Faire signe"/>
+ <string name="GestureActionNone" value="À choisir"/>
+ <string name="HelloAvatar" value=" Bonjour, avatar !"/>
+ <string name="ViewAllGestures" value=" Tout afficher &gt;&gt;"/>
+ <string name="GetMoreGestures" value="Plus &gt;&gt;"/>
+ <string name="Animations" value=" Animations,"/>
+ <string name="Calling Cards" value=" Cartes de visite,"/>
+ <string name="Clothing" value=" Habits,"/>
+ <string name="Gestures" value=" Gestes,"/>
+ <string name="Landmarks" value=" Repères,"/>
+ <string name="Notecards" value=" Notes,"/>
+ <string name="Objects" value=" Objets,"/>
+ <string name="Scripts" value=" Scripts,"/>
+ <string name="Sounds" value=" Sons,"/>
+ <string name="Textures" value=" Textures,"/>
+ <string name="Snapshots" value=" Photos,"/>
+ <string name="No Filters" value="Non "/>
+ <string name="Since Logoff" value="depuis la déconnexion"/>
+ <string name="InvFolder My Inventory">
+ Mon inventaire
+ </string>
+ <string name="InvFolder Library">
+ Bibliothèque
+ </string>
+ <string name="InvFolder Textures">
+ Textures
+ </string>
+ <string name="InvFolder Sounds">
+ Sons
+ </string>
+ <string name="InvFolder Calling Cards">
+ Cartes de visite
+ </string>
+ <string name="InvFolder Landmarks">
+ Repères
+ </string>
+ <string name="InvFolder Scripts">
+ Scripts
+ </string>
+ <string name="InvFolder Clothing">
+ Habits
+ </string>
+ <string name="InvFolder Objects">
+ Objets
+ </string>
+ <string name="InvFolder Notecards">
+ Notes
+ </string>
+ <string name="InvFolder New Folder">
+ Nouveau dossier
+ </string>
+ <string name="InvFolder Inventory">
+ Inventaire
+ </string>
+ <string name="InvFolder Uncompressed Images">
+ Images non compressées
+ </string>
+ <string name="InvFolder Body Parts">
+ Parties du corps
+ </string>
+ <string name="InvFolder Trash">
+ Corbeille
+ </string>
+ <string name="InvFolder Photo Album">
+ Albums photo
+ </string>
+ <string name="InvFolder Lost And Found">
+ Objets trouvés
+ </string>
+ <string name="InvFolder Uncompressed Sounds">
+ Sons non compressés
+ </string>
+ <string name="InvFolder Animations">
+ Animations
+ </string>
+ <string name="InvFolder Gestures">
+ Gestes
+ </string>
+ <string name="InvFolder Favorite">
+ Mes Favoris
+ </string>
+ <string name="InvFolder favorite">
+ Mes Favoris
+ </string>
+ <string name="InvFolder Current Outfit">
+ Tenue actuelle
+ </string>
+ <string name="InvFolder Initial Outfits">
+ Tenues initiales
+ </string>
+ <string name="InvFolder My Outfits">
+ Mes tenues
+ </string>
+ <string name="InvFolder Accessories">
+ Accessoires
+ </string>
+ <string name="InvFolder Meshes">
+ Maillages
+ </string>
+ <string name="InvFolder Friends">
+ Amis
+ </string>
+ <string name="InvFolder All">
+ Tout
+ </string>
+ <string name="no_attachments">
+ Aucun élément attaché porté
+ </string>
+ <string name="Attachments remain">
+ Éléments attachés ([COUNT] emplacements restants)
+ </string>
+ <string name="Buy">
+ Acheter
+ </string>
+ <string name="BuyforL$">
+ Acheter des L$
+ </string>
+ <string name="Stone">
+ Pierre
+ </string>
+ <string name="Metal">
+ Métal
+ </string>
+ <string name="Glass">
+ Verre
+ </string>
+ <string name="Wood">
+ Bois
+ </string>
+ <string name="Flesh">
+ Chair
+ </string>
+ <string name="Plastic">
+ Plastique
+ </string>
+ <string name="Rubber">
+ Caoutchouc
+ </string>
+ <string name="Light">
+ Léger
+ </string>
+ <string name="KBShift">
+ Maj-
+ </string>
+ <string name="KBCtrl">
+ Ctrl
+ </string>
+ <string name="Chest">
+ Poitrine
+ </string>
+ <string name="Skull">
+ Crâne
+ </string>
+ <string name="Left Shoulder">
+ Épaule gauche
+ </string>
+ <string name="Right Shoulder">
+ Épaule droite
+ </string>
+ <string name="Left Hand">
+ Main gauche
+ </string>
+ <string name="Right Hand">
+ Main droite
+ </string>
+ <string name="Left Foot">
+ Pied gauche
+ </string>
+ <string name="Right Foot">
+ Pied droit
+ </string>
+ <string name="Spine">
+ Colonne
+ </string>
+ <string name="Pelvis">
+ Bassin
+ </string>
+ <string name="Mouth">
+ Bouche
+ </string>
+ <string name="Chin">
+ Menton
+ </string>
+ <string name="Left Ear">
+ Oreille gauche
+ </string>
+ <string name="Right Ear">
+ Oreille droite
+ </string>
+ <string name="Left Eyeball">
+ Globe oculaire gauche
+ </string>
+ <string name="Right Eyeball">
+ Globe oculaire droit
+ </string>
+ <string name="Nose">
+ Nez
+ </string>
+ <string name="R Upper Arm">
+ Bras D
+ </string>
+ <string name="R Forearm">
+ Avant-bras D
+ </string>
+ <string name="L Upper Arm">
+ Bras G
+ </string>
+ <string name="L Forearm">
+ Avant-bras G
+ </string>
+ <string name="Right Hip">
+ Hanche droite
+ </string>
+ <string name="R Upper Leg">
+ Cuisse D
+ </string>
+ <string name="R Lower Leg">
+ Jambe D
+ </string>
+ <string name="Left Hip">
+ Hanche gauche
+ </string>
+ <string name="L Upper Leg">
+ Cuisse G
+ </string>
+ <string name="L Lower Leg">
+ Jambe G
+ </string>
+ <string name="Stomach">
+ Estomac
+ </string>
+ <string name="Left Pec">
+ Pectoral gauche
+ </string>
+ <string name="Right Pec">
+ Pectoral droit
+ </string>
+ <string name="Neck">
+ Cou
+ </string>
+ <string name="Avatar Center">
+ Centre de l&apos;avatar
+ </string>
+ <string name="Invalid Attachment">
+ Point d&apos;attache non valide
+ </string>
+ <string name="YearsMonthsOld">
+ [AGEYEARS] [AGEMONTHS]
+ </string>
+ <string name="YearsOld">
+ [AGEYEARS]
+ </string>
+ <string name="MonthsOld">
+ [AGEMONTHS]
+ </string>
+ <string name="WeeksOld">
+ [AGEWEEKS]
+ </string>
+ <string name="DaysOld">
+ [AGEDAYS]
+ </string>
+ <string name="TodayOld">
+ Inscrit aujourd&apos;hui
+ </string>
+ <string name="AgeYearsA">
+ [COUNT] an
+ </string>
+ <string name="AgeYearsB">
+ [COUNT] ans
+ </string>
+ <string name="AgeYearsC">
+ [COUNT] ans
+ </string>
+ <string name="AgeMonthsA">
+ [COUNT] mois
+ </string>
+ <string name="AgeMonthsB">
+ [COUNT] mois
+ </string>
+ <string name="AgeMonthsC">
+ [COUNT] mois
+ </string>
+ <string name="AgeWeeksA">
+ [COUNT] semaine
+ </string>
+ <string name="AgeWeeksB">
+ [COUNT] semaines
+ </string>
+ <string name="AgeWeeksC">
+ [COUNT] semaines
+ </string>
+ <string name="AgeDaysA">
+ [COUNT] jour
+ </string>
+ <string name="AgeDaysB">
+ [COUNT] jours
+ </string>
+ <string name="AgeDaysC">
+ [COUNT] jours
+ </string>
+ <string name="GroupMembersA">
+ [COUNT] membre
+ </string>
+ <string name="GroupMembersB">
+ [COUNT] membres
+ </string>
+ <string name="GroupMembersC">
+ [COUNT] membres
+ </string>
+ <string name="AcctTypeResident">
+ Résident
+ </string>
+ <string name="AcctTypeTrial">
+ Essai
+ </string>
+ <string name="AcctTypeCharterMember">
+ Membre originaire
+ </string>
+ <string name="AcctTypeEmployee">
+ Employé(e) de Linden Lab
+ </string>
+ <string name="PaymentInfoUsed">
+ Infos de paiement utilisées
+ </string>
+ <string name="PaymentInfoOnFile">
+ Infos de paiement enregistrées
+ </string>
+ <string name="NoPaymentInfoOnFile">
+ Aucune info de paiement enregistrée
+ </string>
+ <string name="AgeVerified">
+ Personne dont l&apos;âge a été vérifié
+ </string>
+ <string name="NotAgeVerified">
+ Personne dont l&apos;âge n&apos;a pas été vérifié
+ </string>
+ <string name="Center 2">
+ Centre 2
+ </string>
+ <string name="Top Right">
+ En haut à droite
+ </string>
+ <string name="Top">
+ En haut
+ </string>
+ <string name="Top Left">
+ En haut à gauche
+ </string>
+ <string name="Center">
+ Centre
+ </string>
+ <string name="Bottom Left">
+ En bas à gauche
+ </string>
+ <string name="Bottom">
+ Bas
+ </string>
+ <string name="Bottom Right">
+ En bas à droite
+ </string>
+ <string name="CompileQueueDownloadedCompiling">
+ Téléchargé, compilation en cours
+ </string>
+ <string name="CompileQueueScriptNotFound">
+ Script introuvable sur le serveur.
+ </string>
+ <string name="CompileQueueProblemDownloading">
+ Problème lors du téléchargement
+ </string>
+ <string name="CompileQueueInsufficientPermDownload">
+ Droits insuffisants pour télécharger un script.
+ </string>
+ <string name="CompileQueueInsufficientPermFor">
+ Droits insuffisants pour
+ </string>
+ <string name="CompileQueueUnknownFailure">
+ Échec du téléchargement, erreur inconnue
+ </string>
+ <string name="CompileQueueTitle">
+ Recompilation - progrès
+ </string>
+ <string name="CompileQueueStart">
+ recompiler
+ </string>
+ <string name="ResetQueueTitle">
+ Réinitialiser les progrès
+ </string>
+ <string name="ResetQueueStart">
+ réinitialiser
+ </string>
+ <string name="RunQueueTitle">
+ Lancer
+ </string>
+ <string name="RunQueueStart">
+ lancer
+ </string>
+ <string name="NotRunQueueTitle">
+ Arrêter
+ </string>
+ <string name="NotRunQueueStart">
+ arrêter
+ </string>
+ <string name="CompileSuccessful">
+ Compilation réussie !
+ </string>
+ <string name="CompileSuccessfulSaving">
+ Compilation réussie, enregistrement en cours...
+ </string>
+ <string name="SaveComplete">
+ Enregistrement terminé.
+ </string>
+ <string name="ObjectOutOfRange">
+ Script (objet hors de portée)
+ </string>
+ <string name="GodToolsObjectOwnedBy">
+ Objet [OBJECT] appartenant à [OWNER]
+ </string>
+ <string name="GroupsNone">
+ aucun
+ </string>
+ <string name="Group" value=" (groupe)"/>
+ <string name="Unknown">
+ (Inconnu)
+ </string>
+ <string name="SummaryForTheWeek" value="Récapitulatif de la semaine, début le "/>
+ <string name="NextStipendDay" value=". Prochaine prime le "/>
+ <string name="GroupPlanningDate">
+ [day,datetime,utc]/[mthnum,datetime,utc]/[year,datetime,utc]
+ </string>
+ <string name="GroupIndividualShare" value=" Groupe Part individuelle"/>
+ <string name="GroupColumn" value="Groupe"/>
+ <string name="Balance">
+ Solde
+ </string>
+ <string name="Credits">
+ Crédits
+ </string>
+ <string name="Debits">
+ Débits
+ </string>
+ <string name="Total">
+ Total
+ </string>
+ <string name="NoGroupDataFound">
+ Aucune donnée trouvée pour le groupe
+ </string>
+ <string name="IMParentEstate">
+ domaine parent
+ </string>
+ <string name="IMMainland">
+ continent
+ </string>
+ <string name="IMTeen">
+ teen
+ </string>
+ <string name="Anyone">
+ n&apos;importe qui
+ </string>
+ <string name="RegionInfoError">
+ erreur
+ </string>
+ <string name="RegionInfoAllEstatesOwnedBy">
+ tous les domaines appartenant à [OWNER]
+ </string>
+ <string name="RegionInfoAllEstatesYouOwn">
+ tous les domaines vous appartenant
+ </string>
+ <string name="RegionInfoAllEstatesYouManage">
+ tous les domaines que vous gérez pour [OWNER]
+ </string>
+ <string name="RegionInfoAllowedResidents">
+ Résidents autorisés : ([ALLOWEDAGENTS], max. [MAXACCESS])
+ </string>
+ <string name="RegionInfoAllowedGroups">
+ Groupes autorisés : ([ALLOWEDGROUPS], max. [MAXACCESS])
+ </string>
+ <string name="ScriptLimitsParcelScriptMemory">
+ Mémoire des scripts de parcelles
+ </string>
+ <string name="ScriptLimitsParcelsOwned">
+ Parcelles répertoriées : [PARCELS]
+ </string>
+ <string name="ScriptLimitsMemoryUsed">
+ Mémoire utilisée : [COUNT] Ko sur [MAX] ; [AVAILABLE] Ko disponibles
+ </string>
+ <string name="ScriptLimitsMemoryUsedSimple">
+ Mémoire utilisée : [COUNT] Ko
+ </string>
+ <string name="ScriptLimitsParcelScriptURLs">
+ URL des scripts de parcelles
+ </string>
+ <string name="ScriptLimitsURLsUsed">
+ URL utilisées : [COUNT] sur [MAX] ; [AVAILABLE] disponible(s)
+ </string>
+ <string name="ScriptLimitsURLsUsedSimple">
+ URL utilisées : [COUNT]
+ </string>
+ <string name="ScriptLimitsRequestError">
+ Une erreur est survenue pendant la requête d&apos;informations.
+ </string>
+ <string name="ScriptLimitsRequestNoParcelSelected">
+ Aucune parcelle sélectionnée
+ </string>
+ <string name="ScriptLimitsRequestWrongRegion">
+ Erreur : les informations de script ne sont disponibles que dans votre région actuelle.
+ </string>
+ <string name="ScriptLimitsRequestWaiting">
+ Extraction des informations en cours...
+ </string>
+ <string name="ScriptLimitsRequestDontOwnParcel">
+ Vous n&apos;avez pas le droit d&apos;examiner cette parcelle.
+ </string>
+ <string name="SITTING_ON">
+ Assis(e) dessus
+ </string>
+ <string name="ATTACH_CHEST">
+ Poitrine
+ </string>
+ <string name="ATTACH_HEAD">
+ Tête
+ </string>
+ <string name="ATTACH_LSHOULDER">
+ Épaule gauche
+ </string>
+ <string name="ATTACH_RSHOULDER">
+ Épaule droite
+ </string>
+ <string name="ATTACH_LHAND">
+ Main gauche
+ </string>
+ <string name="ATTACH_RHAND">
+ Main droite
+ </string>
+ <string name="ATTACH_LFOOT">
+ Pied gauche
+ </string>
+ <string name="ATTACH_RFOOT">
+ Pied droit
+ </string>
+ <string name="ATTACH_BACK">
+ Précédent
+ </string>
+ <string name="ATTACH_PELVIS">
+ Bassin
+ </string>
+ <string name="ATTACH_MOUTH">
+ Bouche
+ </string>
+ <string name="ATTACH_CHIN">
+ Menton
+ </string>
+ <string name="ATTACH_LEAR">
+ Oreille gauche
+ </string>
+ <string name="ATTACH_REAR">
+ Oreille droite
+ </string>
+ <string name="ATTACH_LEYE">
+ Å’il gauche
+ </string>
+ <string name="ATTACH_REYE">
+ Å’il droit
+ </string>
+ <string name="ATTACH_NOSE">
+ Nez
+ </string>
+ <string name="ATTACH_RUARM">
+ Bras droit
+ </string>
+ <string name="ATTACH_RLARM">
+ Avant-bras droit
+ </string>
+ <string name="ATTACH_LUARM">
+ Bras gauche
+ </string>
+ <string name="ATTACH_LLARM">
+ Avant-bras gauche
+ </string>
+ <string name="ATTACH_RHIP">
+ Hanche droite
+ </string>
+ <string name="ATTACH_RULEG">
+ Cuisse droite
+ </string>
+ <string name="ATTACH_RLLEG">
+ Jambe droite
+ </string>
+ <string name="ATTACH_LHIP">
+ Hanche gauche
+ </string>
+ <string name="ATTACH_LULEG">
+ Cuisse gauche
+ </string>
+ <string name="ATTACH_LLLEG">
+ Jambe gauche
+ </string>
+ <string name="ATTACH_BELLY">
+ Ventre
+ </string>
+ <string name="ATTACH_RPEC">
+ Pectoral droit
+ </string>
+ <string name="ATTACH_LPEC">
+ Pectoral gauche
+ </string>
+ <string name="ATTACH_HUD_CENTER_2">
+ HUD centre 2
+ </string>
+ <string name="ATTACH_HUD_TOP_RIGHT">
+ HUD en haut à droite
+ </string>
+ <string name="ATTACH_HUD_TOP_CENTER">
+ HUD en haut au centre
+ </string>
+ <string name="ATTACH_HUD_TOP_LEFT">
+ HUD en haut à gauche
+ </string>
+ <string name="ATTACH_HUD_CENTER_1">
+ HUD centre 1
+ </string>
+ <string name="ATTACH_HUD_BOTTOM_LEFT">
+ HUD en bas à gauche
+ </string>
+ <string name="ATTACH_HUD_BOTTOM">
+ HUD en bas
+ </string>
+ <string name="ATTACH_HUD_BOTTOM_RIGHT">
+ HUD en bas à droite
+ </string>
+ <string name="CursorPos">
+ Ligne [LINE], colonne [COLUMN]
+ </string>
+ <string name="PanelDirCountFound">
+ [COUNT] trouvé(s)
+ </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">
+ Contenu de l&apos;objet
+ </string>
+ <string name="PanelContentsNewScript">
+ Nouveau script
+ </string>
+ <string name="BusyModeResponseDefault">
+ Le résident auquel vous avez envoyé un message est en mode Occupé, ce qui signifie qu&apos;il a demandé à ne pas être dérangé. Votre message restera affiché dans son panneau IM afin qu&apos;il puisse le lire ultérieurement.
+ </string>
+ <string name="MuteByName">
+ (par nom)
+ </string>
+ <string name="MuteAgent">
+ (résident)
+ </string>
+ <string name="MuteObject">
+ (objet)
+ </string>
+ <string name="MuteGroup">
+ (groupe)
+ </string>
+ <string name="MuteExternal">
+ (externe)
+ </string>
+ <string name="RegionNoCovenant">
+ Il n&apos;y a aucun règlement pour ce domaine.
+ </string>
+ <string name="RegionNoCovenantOtherOwner">
+ Il n&apos;y a aucun règlement pour ce domaine. Le terrain sur ce domaine est vendu par le propriétaire, non par Linden Lab. Pour en savoir plus, veuillez contacter le propriétaire.
+ </string>
+ <string name="covenant_last_modified" value="Dernière modification :"/>
+ <string name="none_text" value=" (aucun)"/>
+ <string name="never_text" value=" (jamais)"/>
+ <string name="GroupOwned">
+ Propriété du groupe
+ </string>
+ <string name="Public">
+ Public
+ </string>
+ <string name="LocalSettings">
+ Réglages locaux
+ </string>
+ <string name="RegionSettings">
+ Réglages de la région
+ </string>
+ <string name="ClassifiedClicksTxt">
+ Clics : [TELEPORT] téléportation, [MAP] carte, [PROFILE] profil
+ </string>
+ <string name="ClassifiedUpdateAfterPublish">
+ (mise à jour après la publication)
+ </string>
+ <string name="NoPicksClassifiedsText">
+ Vous n&apos;avez pas créé de favoris ni de petites annonces Cliquez sur le bouton Plus pour créer un favori ou une petite annonce.
+ </string>
+ <string name="NoAvatarPicksClassifiedsText">
+ L&apos;utilisateur n&apos;a ni favoris ni petites annonces.
+ </string>
+ <string name="PicksClassifiedsLoadingText">
+ Chargement...
+ </string>
+ <string name="MultiPreviewTitle">
+ Prévisualiser
+ </string>
+ <string name="MultiPropertiesTitle">
+ Propriétés
+ </string>
+ <string name="InvOfferAnObjectNamed">
+ Un objet appelé
+ </string>
+ <string name="InvOfferOwnedByGroup">
+ possédé par le groupe
+ </string>
+ <string name="InvOfferOwnedByUnknownGroup">
+ possédé par un groupe inconnu
+ </string>
+ <string name="InvOfferOwnedBy">
+ possédé par
+ </string>
+ <string name="InvOfferOwnedByUnknownUser">
+ possédé par un résident inconnu
+ </string>
+ <string name="InvOfferGaveYou">
+ vous a donné
+ </string>
+ <string name="InvOfferDecline">
+ Vous refusez l&apos;offre [DESC] de &lt;nolink&gt;[NAME]&lt;/nolink&gt;.
+ </string>
+ <string name="GroupMoneyTotal">
+ Total
+ </string>
+ <string name="GroupMoneyBought">
+ acheté
+ </string>
+ <string name="GroupMoneyPaidYou">
+ vous a payé
+ </string>
+ <string name="GroupMoneyPaidInto">
+ payé
+ </string>
+ <string name="GroupMoneyBoughtPassTo">
+ a acheté un pass à
+ </string>
+ <string name="GroupMoneyPaidFeeForEvent">
+ a payé des frais pour un événement
+ </string>
+ <string name="GroupMoneyPaidPrizeForEvent">
+ a payé un prix pour un événement
+ </string>
+ <string name="GroupMoneyBalance">
+ Solde
+ </string>
+ <string name="GroupMoneyCredits">
+ Crédits
+ </string>
+ <string name="GroupMoneyDebits">
+ Débits
+ </string>
+ <string name="GroupMoneyDate">
+ [weekday,datetime,utc] [day,datetime,utc] [mth,datetime,utc] [year,datetime,utc]
+ </string>
+ <string name="ViewerObjectContents">
+ Contenus
+ </string>
+ <string name="AcquiredItems">
+ Objets acquis
+ </string>
+ <string name="Cancel">
+ Annuler
+ </string>
+ <string name="UploadingCosts">
+ Le chargement de [NAME] coûte [AMOUNT] L$
+ </string>
+ <string name="BuyingCosts">
+ Cet achat coûte [AMOUNT] L$
+ </string>
+ <string name="UnknownFileExtension">
+ Extension de fichier inconnue .%s
+.wav, .tga, .bmp, .jpg, .jpeg, ou .bvh acceptés
+ </string>
+ <string name="MuteObject2">
+ Ignorer
+ </string>
+ <string name="MuteAvatar">
+ Ignorer
+ </string>
+ <string name="UnmuteObject">
+ Ne plus ignorer
+ </string>
+ <string name="UnmuteAvatar">
+ Ne plus ignorer
+ </string>
+ <string name="AddLandmarkNavBarMenu">
+ Ajouter à mes repères...
+ </string>
+ <string name="EditLandmarkNavBarMenu">
+ Modifier mon repère...
+ </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">
+ Maj+
+ </string>
+ <string name="FileSaved">
+ Fichier enregistré
+ </string>
+ <string name="Receiving">
+ Réception
+ </string>
+ <string name="AM">
+ Matin
+ </string>
+ <string name="PM">
+ Après-midi
+ </string>
+ <string name="PST">
+ PST
+ </string>
+ <string name="PDT">
+ PDT
+ </string>
+ <string name="Direction_Forward">
+ Avant
+ </string>
+ <string name="Direction_Left">
+ Gauche
+ </string>
+ <string name="Direction_Right">
+ Droite
+ </string>
+ <string name="Direction_Back">
+ Arrière
+ </string>
+ <string name="Direction_North">
+ Nord
+ </string>
+ <string name="Direction_South">
+ Sud
+ </string>
+ <string name="Direction_West">
+ Ouest
+ </string>
+ <string name="Direction_East">
+ Est
+ </string>
+ <string name="Direction_Up">
+ Haut
+ </string>
+ <string name="Direction_Down">
+ Bas
+ </string>
+ <string name="Any Category">
+ Toutes catégories
+ </string>
+ <string name="Shopping">
+ Shopping
+ </string>
+ <string name="Land Rental">
+ Terrains à louer
+ </string>
+ <string name="Property Rental">
+ Propriétés à louer
+ </string>
+ <string name="Special Attraction">
+ Divertissements
+ </string>
+ <string name="New Products">
+ Nouveaux produits
+ </string>
+ <string name="Employment">
+ Emplois
+ </string>
+ <string name="Wanted">
+ Offres
+ </string>
+ <string name="Service">
+ Services
+ </string>
+ <string name="Personal">
+ Divers
+ </string>
+ <string name="None">
+ Aucun
+ </string>
+ <string name="Linden Location">
+ Appartenant aux Lindens
+ </string>
+ <string name="Adult">
+ Adulte
+ </string>
+ <string name="Arts&amp;Culture">
+ Arts et culture
+ </string>
+ <string name="Business">
+ Business
+ </string>
+ <string name="Educational">
+ Éducation
+ </string>
+ <string name="Gaming">
+ Jeux
+ </string>
+ <string name="Hangout">
+ Favoris
+ </string>
+ <string name="Newcomer Friendly">
+ Accueil pour les nouveaux
+ </string>
+ <string name="Parks&amp;Nature">
+ Parcs et nature
+ </string>
+ <string name="Residential">
+ Résidentiel
+ </string>
+ <string name="Stage">
+ Phase
+ </string>
+ <string name="Other">
+ Autre
+ </string>
+ <string name="Rental">
+ Location
+ </string>
+ <string name="Any">
+ Aucun
+ </string>
+ <string name="You">
+ Vous
+ </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">
+ Médias multiples
+ </string>
+ <string name="Play Media">
+ Lire/pauser le média
+ </string>
+ <string name="MBCmdLineError">
+ Une erreur est survenue lors de la lecture de la ligne de commande.
+Merci de consulter : http://wiki.secondlife.com/wiki/Client_parameters
+Erreur :
+ </string>
+ <string name="MBCmdLineUsg">
+ [APP_NAME] - Utilisation de la ligne de commande :
+ </string>
+ <string name="MBUnableToAccessFile">
+ [APP_NAME] ne peut accéder à un fichier requis.
+
+Cela vient du fait que quelqu&apos;un a ouvert plusieurs copies ou que votre système pense qu&apos;un fichier est ouvert.
+Si ce message persiste, veuillez redémarrer votre ordinateur.
+Si le problème persiste, vous devrez peut-être complètement désinstaller puis réinstaller [APP_NAME].
+ </string>
+ <string name="MBFatalError">
+ Erreur fatale
+ </string>
+ <string name="MBRequiresAltiVec">
+ [APP_NAME] nécessite un microprocesseur AltiVec (version G4 ou antérieure).
+ </string>
+ <string name="MBAlreadyRunning">
+ [APP_NAME] est déjà en cours d&apos;exécution.
+Vérifiez si une version minimisée du programme apparaît dans votre barre de tâches.
+Si ce message persiste, redémarrez votre ordinateur.
+ </string>
+ <string name="MBFrozenCrashed">
+ [APP_NAME] semble avoir crashé lors de l&apos;utilisation précédente.
+Voulez-vous envoyer un rapport de crash ?
+ </string>
+ <string name="MBAlert">
+ Notification
+ </string>
+ <string name="MBNoDirectX">
+ [APP_NAME] ne peut détecter DirectX 9.0b ou une version supérieure.
+[APP_NAME] utilise DirectX pour détecter les matériels et/ou les pilotes qui ne sont pas à jour et peuvent causer des problèmes de stabilité, de performance ou des plantages. Bien que vous puissiez utiliser [APP_NAME] sans DirectX, nous vous recommandons de l&apos;utiliser avec DirectX 9.0b.
+
+Voulez-vous continuer ?
+ </string>
+ <string name="MBWarning">
+ Avertissement
+ </string>
+ <string name="MBNoAutoUpdate">
+ Les mises à jour automatiques n&apos;existent pas encore pour Linux.
+Veuillez télécharger la dernière version sur www.secondlife.com.
+ </string>
+ <string name="MBRegClassFailed">
+ RegisterClass a échoué
+ </string>
+ <string name="MBError">
+ Erreur
+ </string>
+ <string name="MBFullScreenErr">
+ Impossible d&apos;ouvrir le mode plein écran à [WIDTH] x [HEIGHT].
+Utilisation du mode fenêtré.
+ </string>
+ <string name="MBDestroyWinFailed">
+ Erreur de fermeture lors de la destruction de la fenêtre (DestroyWindow() a échoué)
+ </string>
+ <string name="MBShutdownErr">
+ Erreur de fermeture
+ </string>
+ <string name="MBDevContextErr">
+ Impossible de créer le contexte GL
+ </string>
+ <string name="MBPixelFmtErr">
+ Impossible de trouver le format pixel approprié
+ </string>
+ <string name="MBPixelFmtDescErr">
+ Impossible de trouver la description du format pixel
+ </string>
+ <string name="MBTrueColorWindow">
+ [APP_NAME] nécessite True Color (32 bits) pour s&apos;exécuter.
+Accédez aux paramètres d&apos;affichage de votre ordinateur et réglez le mode couleur sur 32 bits.
+ </string>
+ <string name="MBAlpha">
+ [APP_NAME] ne peut pas s&apos;exécuter, car il n&apos;y pas de canal alpha 8 bits accessible. En général, ceci vient de problèmes avec le pilote de la carte vidéo.
+Assurez-vous d&apos;avoir installé le pilote de carte vidéo le plus récent possible.
+Assurez-vous aussi que votre écran est réglé sur True Color (32 bits) sous Panneau de configuration &gt; Affichage &gt; Paramètres.
+Si ce message persiste, veuillez aller sur la page [SUPPORT_SITE].
+ </string>
+ <string name="MBPixelFmtSetErr">
+ Impossible de trouver le format pixel approprié
+ </string>
+ <string name="MBGLContextErr">
+ Impossible de créer le contexte de rendu GL
+ </string>
+ <string name="MBGLContextActErr">
+ Impossible d&apos;activer le contexte de rendu GL
+ </string>
+ <string name="MBVideoDrvErr">
+ [APP_NAME] ne peut pas s&apos;exécuter car les pilotes de votre carte vidéo n&apos;ont pas été installés correctement, ne sont pas à jour, ou sont pour du matériel non pris en charge. Assurez-vous d&apos;avoir des pilotes de cartes vidéos récents, et même si vous avez les plus récents, réinstallez-les.
+
+Si ce message persiste, veuillez aller sur la page [SUPPORT_SITE].
+ </string>
+ <string name="5 O&apos;Clock Shadow">
+ Peu
+ </string>
+ <string name="All White">
+ Tout blancs
+ </string>
+ <string name="Anime Eyes">
+ Grand yeux
+ </string>
+ <string name="Arced">
+ Arqués
+ </string>
+ <string name="Arm Length">
+ Longueur des bras
+ </string>
+ <string name="Attached">
+ Attachés
+ </string>
+ <string name="Attached Earlobes">
+ Lobes
+ </string>
+ <string name="Back Fringe">
+ Mèches de derrière
+ </string>
+ <string name="Baggy">
+ Plus
+ </string>
+ <string name="Bangs">
+ Frange
+ </string>
+ <string name="Beady Eyes">
+ Yeux perçants
+ </string>
+ <string name="Belly Size">
+ Taille du ventre
+ </string>
+ <string name="Big">
+ Plus
+ </string>
+ <string name="Big Butt">
+ Grosses fesses
+ </string>
+ <string name="Big Hair Back">
+ Volume : Derrière
+ </string>
+ <string name="Big Hair Front">
+ Volume : Devant
+ </string>
+ <string name="Big Hair Top">
+ Volume : Haut
+ </string>
+ <string name="Big Head">
+ Plus
+ </string>
+ <string name="Big Pectorals">
+ Gros pectoraux
+ </string>
+ <string name="Big Spikes">
+ Spikes
+ </string>
+ <string name="Black">
+ Noir
+ </string>
+ <string name="Blonde">
+ Blond
+ </string>
+ <string name="Blonde Hair">
+ Cheveux blonds
+ </string>
+ <string name="Blush">
+ Blush
+ </string>
+ <string name="Blush Color">
+ Couleur du blush
+ </string>
+ <string name="Blush Opacity">
+ Opacité du blush
+ </string>
+ <string name="Body Definition">
+ Contour du corps
+ </string>
+ <string name="Body Fat">
+ Graisse
+ </string>
+ <string name="Body Freckles">
+ Grains de beauté
+ </string>
+ <string name="Body Thick">
+ Plus
+ </string>
+ <string name="Body Thickness">
+ Épaisseur du corps
+ </string>
+ <string name="Body Thin">
+ Moins
+ </string>
+ <string name="Bow Legged">
+ Jambes arquées
+ </string>
+ <string name="Breast Buoyancy">
+ Hauteur des seins
+ </string>
+ <string name="Breast Cleavage">
+ Clivage
+ </string>
+ <string name="Breast Size">
+ Taille des seins
+ </string>
+ <string name="Bridge Width">
+ Arête du nez
+ </string>
+ <string name="Broad">
+ Large
+ </string>
+ <string name="Brow Size">
+ Taille du front
+ </string>
+ <string name="Bug Eyes">
+ Yeux globuleux
+ </string>
+ <string name="Bugged Eyes">
+ Yeux globuleux
+ </string>
+ <string name="Bulbous">
+ En bulbe
+ </string>
+ <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">
+ Élasticité
+ </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">
+ Élasticité
+ </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">
+ Élasticité
+ </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">
+ Élasticité
+ </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">
+ Élasticité
+ </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">
+ Élasticité
+ </string>
+ <string name="Butt Physics LeftRight Gain">
+ Amplification
+ </string>
+ <string name="Butt Physics LeftRight Damping">
+ Amortissement
+ </string>
+ <string name="Bushy Eyebrows">
+ Sourcils touffus
+ </string>
+ <string name="Bushy Hair">
+ Beaucoup
+ </string>
+ <string name="Butt Size">
+ Taille des fesses
+ </string>
+ <string name="Butt Gravity">
+ Gravité des fesses
+ </string>
+ <string name="bustle skirt">
+ Jupe gonflante
+ </string>
+ <string name="no bustle">
+ Pas gonflante
+ </string>
+ <string name="more bustle">
+ Plus gonflante
+ </string>
+ <string name="Chaplin">
+ Moins
+ </string>
+ <string name="Cheek Bones">
+ Pommettes
+ </string>
+ <string name="Chest Size">
+ Taille de la poitrine
+ </string>
+ <string name="Chin Angle">
+ Angle du menton
+ </string>
+ <string name="Chin Cleft">
+ Fente du menton
+ </string>
+ <string name="Chin Curtains">
+ Favoris
+ </string>
+ <string name="Chin Depth">
+ Profondeur
+ </string>
+ <string name="Chin Heavy">
+ Menton lourd
+ </string>
+ <string name="Chin In">
+ Menton rentré
+ </string>
+ <string name="Chin Out">
+ Menton sorti
+ </string>
+ <string name="Chin-Neck">
+ Menton-cou
+ </string>
+ <string name="Clear">
+ Clair
+ </string>
+ <string name="Cleft">
+ Fendu
+ </string>
+ <string name="Close Set Eyes">
+ Yeux rapprochés
+ </string>
+ <string name="Closed">
+ Fermé(s)
+ </string>
+ <string name="Closed Back">
+ Fermé à l&apos;arrière
+ </string>
+ <string name="Closed Front">
+ Fermé devant
+ </string>
+ <string name="Closed Left">
+ Fermé à gauche
+ </string>
+ <string name="Closed Right">
+ Fermé à droite
+ </string>
+ <string name="Coin Purse">
+ Mini
+ </string>
+ <string name="Collar Back">
+ Col arrière
+ </string>
+ <string name="Collar Front">
+ Col devant
+ </string>
+ <string name="Corner Down">
+ Coin vers le bas
+ </string>
+ <string name="Corner Up">
+ Coin vers le haut
+ </string>
+ <string name="Creased">
+ Fripée
+ </string>
+ <string name="Crooked Nose">
+ Déviation du nez
+ </string>
+ <string name="Cuff Flare">
+ Jambes
+ </string>
+ <string name="Dark">
+ Sombre
+ </string>
+ <string name="Dark Green">
+ Vert foncé
+ </string>
+ <string name="Darker">
+ Plus foncé
+ </string>
+ <string name="Deep">
+ Profonde
+ </string>
+ <string name="Default Heels">
+ Talons par défaut
+ </string>
+ <string name="Dense">
+ Dense
+ </string>
+ <string name="Double Chin">
+ Double menton
+ </string>
+ <string name="Downturned">
+ Pointant vers le bas
+ </string>
+ <string name="Duffle Bag">
+ Maxi
+ </string>
+ <string name="Ear Angle">
+ Angle de l&apos;oreille
+ </string>
+ <string name="Ear Size">
+ Taille
+ </string>
+ <string name="Ear Tips">
+ Extrémités
+ </string>
+ <string name="Egg Head">
+ Proéminence
+ </string>
+ <string name="Eye Bags">
+ Cernes
+ </string>
+ <string name="Eye Color">
+ Couleur des yeux
+ </string>
+ <string name="Eye Depth">
+ Profondeur
+ </string>
+ <string name="Eye Lightness">
+ Clarté
+ </string>
+ <string name="Eye Opening">
+ Ouverture
+ </string>
+ <string name="Eye Pop">
+ Œil proéminent
+ </string>
+ <string name="Eye Size">
+ Taille de l&apos;œil
+ </string>
+ <string name="Eye Spacing">
+ Espacement
+ </string>
+ <string name="Eyebrow Arc">
+ Arc
+ </string>
+ <string name="Eyebrow Density">
+ Épaisseur sourcils
+ </string>
+ <string name="Eyebrow Height">
+ Hauteur
+ </string>
+ <string name="Eyebrow Points">
+ Direction
+ </string>
+ <string name="Eyebrow Size">
+ Taille
+ </string>
+ <string name="Eyelash Length">
+ Longueur des cils
+ </string>
+ <string name="Eyeliner">
+ Eyeliner
+ </string>
+ <string name="Eyeliner Color">
+ Couleur de l&apos;eyeliner
+ </string>
+ <string name="Eyes Bugged">
+ Yeux globuleux
+ </string>
+ <string name="Face Shear">
+ Visage
+ </string>
+ <string name="Facial Definition">
+ Définition
+ </string>
+ <string name="Far Set Eyes">
+ Yeux écartés
+ </string>
+ <string name="Fat Lips">
+ Lèvres épaisses
+ </string>
+ <string name="Female">
+ Femme
+ </string>
+ <string name="Fingerless">
+ Sans doigts
+ </string>
+ <string name="Fingers">
+ Doigts
+ </string>
+ <string name="Flared Cuffs">
+ Jambes larges
+ </string>
+ <string name="Flat">
+ Moins
+ </string>
+ <string name="Flat Butt">
+ Fesses plates
+ </string>
+ <string name="Flat Head">
+ Tête plate
+ </string>
+ <string name="Flat Toe">
+ Orteil plat
+ </string>
+ <string name="Foot Size">
+ Pointure
+ </string>
+ <string name="Forehead Angle">
+ Angle du front
+ </string>
+ <string name="Forehead Heavy">
+ Front lourd
+ </string>
+ <string name="Freckles">
+ Tâches de rousseur
+ </string>
+ <string name="Front Fringe">
+ Mèches de devant
+ </string>
+ <string name="Full Back">
+ Arrière touffu
+ </string>
+ <string name="Full Eyeliner">
+ Eyeliner marqué
+ </string>
+ <string name="Full Front">
+ Devant touffu
+ </string>
+ <string name="Full Hair Sides">
+ Côtés touffus
+ </string>
+ <string name="Full Sides">
+ Côtés touffus
+ </string>
+ <string name="Glossy">
+ Brillant
+ </string>
+ <string name="Glove Fingers">
+ Gants avec doigts
+ </string>
+ <string name="Glove Length">
+ Longueur
+ </string>
+ <string name="Hair">
+ Cheveux
+ </string>
+ <string name="Hair Back">
+ Cheveux : Derrière
+ </string>
+ <string name="Hair Front">
+ Cheveux : Devant
+ </string>
+ <string name="Hair Sides">
+ Cheveux : Côtés
+ </string>
+ <string name="Hair Sweep">
+ Sens de la coiffure
+ </string>
+ <string name="Hair Thickess">
+ Épaisseur cheveux
+ </string>
+ <string name="Hair Thickness">
+ Épaisseur cheveux
+ </string>
+ <string name="Hair Tilt">
+ Inclinaison
+ </string>
+ <string name="Hair Tilted Left">
+ Vers la gauche
+ </string>
+ <string name="Hair Tilted Right">
+ Vers la droite
+ </string>
+ <string name="Hair Volume">
+ Cheveux : Volume
+ </string>
+ <string name="Hand Size">
+ Taille de la main
+ </string>
+ <string name="Handlebars">
+ Plus
+ </string>
+ <string name="Head Length">
+ Longueur
+ </string>
+ <string name="Head Shape">
+ Forme
+ </string>
+ <string name="Head Size">
+ Taille
+ </string>
+ <string name="Head Stretch">
+ Allongement
+ </string>
+ <string name="Heel Height">
+ Talons
+ </string>
+ <string name="Heel Shape">
+ Forme des talons
+ </string>
+ <string name="Height">
+ Taille
+ </string>
+ <string name="High">
+ Haut
+ </string>
+ <string name="High Heels">
+ Talons hauts
+ </string>
+ <string name="High Jaw">
+ Haut
+ </string>
+ <string name="High Platforms">
+ Haute
+ </string>
+ <string name="High and Tight">
+ Haut et serré
+ </string>
+ <string name="Higher">
+ Plus élevé
+ </string>
+ <string name="Hip Length">
+ Longueur hanche
+ </string>
+ <string name="Hip Width">
+ Largeur hanche
+ </string>
+ <string name="In">
+ Rentré
+ </string>
+ <string name="In Shdw Color">
+ Couleur ombre interne
+ </string>
+ <string name="In Shdw Opacity">
+ Opacité ombre interne
+ </string>
+ <string name="Inner Eye Corner">
+ Coin interne
+ </string>
+ <string name="Inner Eye Shadow">
+ Ombre de l&apos;œil interne
+ </string>
+ <string name="Inner Shadow">
+ Ombre interne
+ </string>
+ <string name="Jacket Length">
+ Longueur de la veste
+ </string>
+ <string name="Jacket Wrinkles">
+ Plis de la veste
+ </string>
+ <string name="Jaw Angle">
+ Angle mâchoire
+ </string>
+ <string name="Jaw Jut">
+ Saillie mâchoire
+ </string>
+ <string name="Jaw Shape">
+ Mâchoire
+ </string>
+ <string name="Join">
+ Rapprochés
+ </string>
+ <string name="Jowls">
+ Bajoues
+ </string>
+ <string name="Knee Angle">
+ Angle du genou
+ </string>
+ <string name="Knock Kneed">
+ Genoux rapprochés
+ </string>
+ <string name="Large">
+ Plus
+ </string>
+ <string name="Large Hands">
+ Grandes mains
+ </string>
+ <string name="Left Part">
+ Raie à gauche
+ </string>
+ <string name="Leg Length">
+ Longueur
+ </string>
+ <string name="Leg Muscles">
+ Muscles
+ </string>
+ <string name="Less">
+ Moins
+ </string>
+ <string name="Less Body Fat">
+ Moins
+ </string>
+ <string name="Less Curtains">
+ Moins
+ </string>
+ <string name="Less Freckles">
+ Moins
+ </string>
+ <string name="Less Full">
+ Moins
+ </string>
+ <string name="Less Gravity">
+ Moins
+ </string>
+ <string name="Less Love">
+ Moins
+ </string>
+ <string name="Less Muscles">
+ Moins
+ </string>
+ <string name="Less Muscular">
+ Moins
+ </string>
+ <string name="Less Rosy">
+ Moins
+ </string>
+ <string name="Less Round">
+ Moins ronde
+ </string>
+ <string name="Less Saddle">
+ Moins
+ </string>
+ <string name="Less Square">
+ Moins carrée
+ </string>
+ <string name="Less Volume">
+ Moins
+ </string>
+ <string name="Less soul">
+ Moins
+ </string>
+ <string name="Lighter">
+ Plus léger
+ </string>
+ <string name="Lip Cleft">
+ Fente labiale
+ </string>
+ <string name="Lip Cleft Depth">
+ Prof. fente labiale
+ </string>
+ <string name="Lip Fullness">
+ Volume des lèvres
+ </string>
+ <string name="Lip Pinkness">
+ Rougeur des lèvres
+ </string>
+ <string name="Lip Ratio">
+ Proportion des lèvres
+ </string>
+ <string name="Lip Thickness">
+ Épaisseur
+ </string>
+ <string name="Lip Width">
+ Largeur
+ </string>
+ <string name="Lipgloss">
+ Brillant à lèvres
+ </string>
+ <string name="Lipstick">
+ Rouge à lèvres
+ </string>
+ <string name="Lipstick Color">
+ Couleur du rouge à lèvres
+ </string>
+ <string name="Long">
+ Plus
+ </string>
+ <string name="Long Head">
+ Tête longue
+ </string>
+ <string name="Long Hips">
+ Hanches longues
+ </string>
+ <string name="Long Legs">
+ Jambes longues
+ </string>
+ <string name="Long Neck">
+ Long cou
+ </string>
+ <string name="Long Pigtails">
+ Longues couettes
+ </string>
+ <string name="Long Ponytail">
+ Longue queue de cheval
+ </string>
+ <string name="Long Torso">
+ Torse long
+ </string>
+ <string name="Long arms">
+ Bras longs
+ </string>
+ <string name="Loose Pants">
+ Pantalons amples
+ </string>
+ <string name="Loose Shirt">
+ Chemise ample
+ </string>
+ <string name="Loose Sleeves">
+ Manches amples
+ </string>
+ <string name="Love Handles">
+ Poignées d&apos;amour
+ </string>
+ <string name="Low">
+ Bas
+ </string>
+ <string name="Low Heels">
+ Talons bas
+ </string>
+ <string name="Low Jaw">
+ Bas
+ </string>
+ <string name="Low Platforms">
+ Basse
+ </string>
+ <string name="Low and Loose">
+ Bas et ample
+ </string>
+ <string name="Lower">
+ Abaisser
+ </string>
+ <string name="Lower Bridge">
+ Arête inférieure
+ </string>
+ <string name="Lower Cheeks">
+ Joue inférieure
+ </string>
+ <string name="Male">
+ Homme
+ </string>
+ <string name="Middle Part">
+ Raie au milieu
+ </string>
+ <string name="More">
+ Plus
+ </string>
+ <string name="More Blush">
+ Plus
+ </string>
+ <string name="More Body Fat">
+ Plus
+ </string>
+ <string name="More Curtains">
+ Plus
+ </string>
+ <string name="More Eyeshadow">
+ Plus
+ </string>
+ <string name="More Freckles">
+ Plus
+ </string>
+ <string name="More Full">
+ Plus
+ </string>
+ <string name="More Gravity">
+ Plus
+ </string>
+ <string name="More Lipstick">
+ Plus
+ </string>
+ <string name="More Love">
+ Plus
+ </string>
+ <string name="More Lower Lip">
+ Inférieure plus grosse
+ </string>
+ <string name="More Muscles">
+ Plus
+ </string>
+ <string name="More Muscular">
+ Plus
+ </string>
+ <string name="More Rosy">
+ Plus
+ </string>
+ <string name="More Round">
+ Plus
+ </string>
+ <string name="More Saddle">
+ Plus
+ </string>
+ <string name="More Sloped">
+ Plus
+ </string>
+ <string name="More Square">
+ Plus
+ </string>
+ <string name="More Upper Lip">
+ Supérieure plus grosse
+ </string>
+ <string name="More Vertical">
+ Plus
+ </string>
+ <string name="More Volume">
+ Plus
+ </string>
+ <string name="More soul">
+ Plus
+ </string>
+ <string name="Moustache">
+ Moustache
+ </string>
+ <string name="Mouth Corner">
+ Coin de la bouche
+ </string>
+ <string name="Mouth Position">
+ Position
+ </string>
+ <string name="Mowhawk">
+ Mowhawk
+ </string>
+ <string name="Muscular">
+ Musclé
+ </string>
+ <string name="Mutton Chops">
+ Longs
+ </string>
+ <string name="Nail Polish">
+ Vernis à ongles
+ </string>
+ <string name="Nail Polish Color">
+ Couleur du vernis
+ </string>
+ <string name="Narrow">
+ Moins
+ </string>
+ <string name="Narrow Back">
+ Arrière étroit
+ </string>
+ <string name="Narrow Front">
+ Devant étroit
+ </string>
+ <string name="Narrow Lips">
+ Lèvres étroites
+ </string>
+ <string name="Natural">
+ Naturel
+ </string>
+ <string name="Neck Length">
+ Longueur du cou
+ </string>
+ <string name="Neck Thickness">
+ Épaisseur du cou
+ </string>
+ <string name="No Blush">
+ Pas de blush
+ </string>
+ <string name="No Eyeliner">
+ Pas d&apos;eyeliner
+ </string>
+ <string name="No Eyeshadow">
+ Pas d&apos;ombre à paupières
+ </string>
+ <string name="No Lipgloss">
+ Pas de brillant à lèvres
+ </string>
+ <string name="No Lipstick">
+ Pas de rouge à lèvres
+ </string>
+ <string name="No Part">
+ Pas de raie
+ </string>
+ <string name="No Polish">
+ Pas de vernis
+ </string>
+ <string name="No Red">
+ Pas de rouge
+ </string>
+ <string name="No Spikes">
+ Pas de spikes
+ </string>
+ <string name="No White">
+ Pas de blanc
+ </string>
+ <string name="No Wrinkles">
+ Pas de rides
+ </string>
+ <string name="Normal Lower">
+ Normal plus bas
+ </string>
+ <string name="Normal Upper">
+ Normal plus haut
+ </string>
+ <string name="Nose Left">
+ Nez à gauche
+ </string>
+ <string name="Nose Right">
+ Nez à droite
+ </string>
+ <string name="Nose Size">
+ Taille du nez
+ </string>
+ <string name="Nose Thickness">
+ Épaisseur du nez
+ </string>
+ <string name="Nose Tip Angle">
+ Angle bout du nez
+ </string>
+ <string name="Nose Tip Shape">
+ Forme bout du nez
+ </string>
+ <string name="Nose Width">
+ Largeur du nez
+ </string>
+ <string name="Nostril Division">
+ Division narines
+ </string>
+ <string name="Nostril Width">
+ Largeur narines
+ </string>
+ <string name="Opaque">
+ Opaque
+ </string>
+ <string name="Open">
+ Ouvert
+ </string>
+ <string name="Open Back">
+ Derrière ouvert
+ </string>
+ <string name="Open Front">
+ Devant ouvert
+ </string>
+ <string name="Open Left">
+ Ouvert à gauche
+ </string>
+ <string name="Open Right">
+ Ouvert à droite
+ </string>
+ <string name="Orange">
+ Orange
+ </string>
+ <string name="Out">
+ Sorti
+ </string>
+ <string name="Out Shdw Color">
+ Couleur de l&apos;ombre externe
+ </string>
+ <string name="Out Shdw Opacity">
+ Opacité de l&apos;ombre externe
+ </string>
+ <string name="Outer Eye Corner">
+ Coin externe
+ </string>
+ <string name="Outer Eye Shadow">
+ Ombre de l&apos;œil externe
+ </string>
+ <string name="Outer Shadow">
+ Ombre externe
+ </string>
+ <string name="Overbite">
+ Rentrée
+ </string>
+ <string name="Package">
+ Parties
+ </string>
+ <string name="Painted Nails">
+ Ongles vernis
+ </string>
+ <string name="Pale">
+ Pâle
+ </string>
+ <string name="Pants Crotch">
+ Entrejambe
+ </string>
+ <string name="Pants Fit">
+ Taille
+ </string>
+ <string name="Pants Length">
+ Longueur
+ </string>
+ <string name="Pants Waist">
+ Taille
+ </string>
+ <string name="Pants Wrinkles">
+ Plis
+ </string>
+ <string name="Part">
+ Raie
+ </string>
+ <string name="Part Bangs">
+ Séparation frange
+ </string>
+ <string name="Pectorals">
+ Pectoraux
+ </string>
+ <string name="Pigment">
+ Pigmentation
+ </string>
+ <string name="Pigtails">
+ Couettes
+ </string>
+ <string name="Pink">
+ Rose
+ </string>
+ <string name="Pinker">
+ Plus rose
+ </string>
+ <string name="Platform Height">
+ Platef. (hauteur)
+ </string>
+ <string name="Platform Width">
+ Platef. (largeur)
+ </string>
+ <string name="Pointy">
+ Pointue
+ </string>
+ <string name="Pointy Heels">
+ Talons pointus
+ </string>
+ <string name="Ponytail">
+ Queue de cheval
+ </string>
+ <string name="Poofy Skirt">
+ Jupe bouffante
+ </string>
+ <string name="Pop Left Eye">
+ Å’il gauche saillant
+ </string>
+ <string name="Pop Right Eye">
+ Å’il droit saillant
+ </string>
+ <string name="Puffy">
+ Plus
+ </string>
+ <string name="Puffy Eyelids">
+ Paup. gonflées
+ </string>
+ <string name="Rainbow Color">
+ Couleur arc en ciel
+ </string>
+ <string name="Red Hair">
+ Cheveux roux
+ </string>
+ <string name="Regular">
+ Standard
+ </string>
+ <string name="Right Part">
+ Raie à droite
+ </string>
+ <string name="Rosy Complexion">
+ Teint rosé
+ </string>
+ <string name="Round">
+ Rond
+ </string>
+ <string name="Ruddiness">
+ Rougeur
+ </string>
+ <string name="Ruddy">
+ Rouge
+ </string>
+ <string name="Rumpled Hair">
+ Texture
+ </string>
+ <string name="Saddle Bags">
+ Culotte de cheval
+ </string>
+ <string name="Scrawny Leg">
+ Jambes maigres
+ </string>
+ <string name="Separate">
+ Séparés
+ </string>
+ <string name="Shallow">
+ Creux
+ </string>
+ <string name="Shear Back">
+ Coupe derrière
+ </string>
+ <string name="Shear Face">
+ Visage
+ </string>
+ <string name="Shear Front">
+ Front
+ </string>
+ <string name="Shear Left Up">
+ Haut gauche décalé
+ </string>
+ <string name="Shear Right Up">
+ Haut droit décalé
+ </string>
+ <string name="Sheared Back">
+ Dégagé derrière
+ </string>
+ <string name="Sheared Front">
+ Dégagé devant
+ </string>
+ <string name="Shift Left">
+ Vers la gauche
+ </string>
+ <string name="Shift Mouth">
+ Déplacement
+ </string>
+ <string name="Shift Right">
+ Vers la droite
+ </string>
+ <string name="Shirt Bottom">
+ Chemise
+ </string>
+ <string name="Shirt Fit">
+ Taille
+ </string>
+ <string name="Shirt Wrinkles">
+ Plis
+ </string>
+ <string name="Shoe Height">
+ Hauteur
+ </string>
+ <string name="Short">
+ Moins
+ </string>
+ <string name="Short Arms">
+ Bras courts
+ </string>
+ <string name="Short Legs">
+ Jambes courtes
+ </string>
+ <string name="Short Neck">
+ Petit cou
+ </string>
+ <string name="Short Pigtails">
+ Couettes courtes
+ </string>
+ <string name="Short Ponytail">
+ Queue de cheval courte
+ </string>
+ <string name="Short Sideburns">
+ Court
+ </string>
+ <string name="Short Torso">
+ Torse court
+ </string>
+ <string name="Short hips">
+ Hanches courtes
+ </string>
+ <string name="Shoulders">
+ Épaules
+ </string>
+ <string name="Side Fringe">
+ Mèches sur le côté
+ </string>
+ <string name="Sideburns">
+ Favoris
+ </string>
+ <string name="Sides Hair">
+ Cheveux sur le côté
+ </string>
+ <string name="Sides Hair Down">
+ Cheveux sur le côté en bas
+ </string>
+ <string name="Sides Hair Up">
+ Cheveux sur le côté en haut
+ </string>
+ <string name="Skinny Neck">
+ Cou maigre
+ </string>
+ <string name="Skirt Fit">
+ Taille jupe
+ </string>
+ <string name="Skirt Length">
+ Longueur jupe
+ </string>
+ <string name="Slanted Forehead">
+ Front incliné
+ </string>
+ <string name="Sleeve Length">
+ Longueur manche
+ </string>
+ <string name="Sleeve Looseness">
+ Ampleur manche
+ </string>
+ <string name="Slit Back">
+ Fente : Derrière
+ </string>
+ <string name="Slit Front">
+ Fente : Devant
+ </string>
+ <string name="Slit Left">
+ Fente : Gauche
+ </string>
+ <string name="Slit Right">
+ Fente : Droite
+ </string>
+ <string name="Small">
+ Moins
+ </string>
+ <string name="Small Hands">
+ Petites mains
+ </string>
+ <string name="Small Head">
+ Moins
+ </string>
+ <string name="Smooth">
+ Moins
+ </string>
+ <string name="Smooth Hair">
+ Cheveux lisses
+ </string>
+ <string name="Socks Length">
+ Longueur
+ </string>
+ <string name="Soulpatch">
+ Barbichette
+ </string>
+ <string name="Sparse">
+ Rares
+ </string>
+ <string name="Spiked Hair">
+ Mèches en pointe
+ </string>
+ <string name="Square">
+ Carrée
+ </string>
+ <string name="Square Toe">
+ Orteil carré
+ </string>
+ <string name="Squash Head">
+ Écraser la tête
+ </string>
+ <string name="Stretch Head">
+ Allonger la tête
+ </string>
+ <string name="Sunken">
+ Saillante
+ </string>
+ <string name="Sunken Chest">
+ Poitrine enfoncée
+ </string>
+ <string name="Sunken Eyes">
+ Yeux enfoncés
+ </string>
+ <string name="Sweep Back">
+ En arrière
+ </string>
+ <string name="Sweep Forward">
+ Vers l&apos;avant
+ </string>
+ <string name="Tall">
+ Plus
+ </string>
+ <string name="Taper Back">
+ Arrière
+ </string>
+ <string name="Taper Front">
+ Avant
+ </string>
+ <string name="Thick Heels">
+ Talons épais
+ </string>
+ <string name="Thick Neck">
+ Cou épais
+ </string>
+ <string name="Thick Toe">
+ Orteil épais
+ </string>
+ <string name="Thin">
+ Mince
+ </string>
+ <string name="Thin Eyebrows">
+ Sourcils fins
+ </string>
+ <string name="Thin Lips">
+ Lèvres fines
+ </string>
+ <string name="Thin Nose">
+ Nez fin
+ </string>
+ <string name="Tight Chin">
+ Menton fin
+ </string>
+ <string name="Tight Cuffs">
+ Jambes serrées
+ </string>
+ <string name="Tight Pants">
+ Pantalons serrés
+ </string>
+ <string name="Tight Shirt">
+ Chemise serrée
+ </string>
+ <string name="Tight Skirt">
+ Jupe serrée
+ </string>
+ <string name="Tight Sleeves">
+ Manches serrées
+ </string>
+ <string name="Toe Shape">
+ Forme de l&apos;orteil
+ </string>
+ <string name="Toe Thickness">
+ Épaisseur orteil
+ </string>
+ <string name="Torso Length">
+ Longueur du torse
+ </string>
+ <string name="Torso Muscles">
+ Muscles du torse
+ </string>
+ <string name="Torso Scrawny">
+ Torse maigre
+ </string>
+ <string name="Unattached">
+ Séparés
+ </string>
+ <string name="Uncreased">
+ Lisse
+ </string>
+ <string name="Underbite">
+ Sortie
+ </string>
+ <string name="Unnatural">
+ Artificiel
+ </string>
+ <string name="Upper Bridge">
+ Arête supérieure
+ </string>
+ <string name="Upper Cheeks">
+ Joue supérieure
+ </string>
+ <string name="Upper Chin Cleft">
+ Menton supérieur
+ </string>
+ <string name="Upper Eyelid Fold">
+ Paupière sup.
+ </string>
+ <string name="Upturned">
+ En trompette
+ </string>
+ <string name="Very Red">
+ Très rouge
+ </string>
+ <string name="Waist Height">
+ Hauteur taille
+ </string>
+ <string name="Well-Fed">
+ Ronde
+ </string>
+ <string name="White Hair">
+ Cheveux blancs
+ </string>
+ <string name="Wide">
+ Plus
+ </string>
+ <string name="Wide Back">
+ Derrière large
+ </string>
+ <string name="Wide Front">
+ Devant large
+ </string>
+ <string name="Wide Lips">
+ Lèvres larges
+ </string>
+ <string name="Wild">
+ Artificiel
+ </string>
+ <string name="Wrinkles">
+ Rides
+ </string>
+ <string name="LocationCtrlAddLandmarkTooltip">
+ Ajouter à mes repères
+ </string>
+ <string name="LocationCtrlEditLandmarkTooltip">
+ Modifier mon repère
+ </string>
+ <string name="LocationCtrlInfoBtnTooltip">
+ En savoir plus sur l&apos;emplacement actuel
+ </string>
+ <string name="LocationCtrlComboBtnTooltip">
+ Historique de mes emplacements
+ </string>
+ <string name="LocationCtrlForSaleTooltip">
+ Acheter ce terrain
+ </string>
+ <string name="LocationCtrlVoiceTooltip">
+ Chat vocal indisponible ici
+ </string>
+ <string name="LocationCtrlFlyTooltip">
+ Vol interdit
+ </string>
+ <string name="LocationCtrlPushTooltip">
+ Pas de bousculades
+ </string>
+ <string name="LocationCtrlBuildTooltip">
+ Construction/placement d&apos;objets interdit
+ </string>
+ <string name="LocationCtrlScriptsTooltip">
+ Scripts interdits
+ </string>
+ <string name="LocationCtrlDamageTooltip">
+ Santé
+ </string>
+ <string name="LocationCtrlAdultIconTooltip">
+ Région de type Adulte
+ </string>
+ <string name="LocationCtrlModerateIconTooltip">
+ Région de type Modéré
+ </string>
+ <string name="LocationCtrlGeneralIconTooltip">
+ Région de type Général
+ </string>
+ <string name="LocationCtrlSeeAVsTooltip">
+ Avatars visibles et chat autorisé en dehors de cette parcelle
+ </string>
+ <string name="UpdaterWindowTitle">
+ [APP_NAME] - Mise à jour
+ </string>
+ <string name="UpdaterNowUpdating">
+ Mise à jour de [APP_NAME]...
+ </string>
+ <string name="UpdaterNowInstalling">
+ Installation de [APP_NAME]...
+ </string>
+ <string name="UpdaterUpdatingDescriptive">
+ Le client [APP_NAME] est en train d&apos;être mis à jour. Cela peut prendre un certain temps, merci de votre patience.
+ </string>
+ <string name="UpdaterProgressBarTextWithEllipses">
+ Mise à jour en cours...
+ </string>
+ <string name="UpdaterProgressBarText">
+ Mise à jour en cours
+ </string>
+ <string name="UpdaterFailDownloadTitle">
+ Le téléchargement de la mise à jour a échoué
+ </string>
+ <string name="UpdaterFailUpdateDescriptive">
+ Une erreur est survenue lors de la mise à jour de [APP_NAME]. Veuillez télécharger la dernière version sur www.secondlife.com.
+ </string>
+ <string name="UpdaterFailInstallTitle">
+ L&apos;installation de la mise à jour a échoué
+ </string>
+ <string name="UpdaterFailStartTitle">
+ Impossible de lancer le client
+ </string>
+ <string name="ItemsComingInTooFastFrom">
+ [APP_NAME] : transfert trop rapide des articles de [FROM_NAME] ; aperçu automatique désactivé pendant [TIME] secondes
+ </string>
+ <string name="ItemsComingInTooFast">
+ [APP_NAME] : transfert trop rapide des articles ; aperçu automatique désactivé pendant [TIME] secondes
+ </string>
+ <string name="IM_logging_string">
+ -- Archivage des IM activé --
+ </string>
+ <string name="IM_typing_start_string">
+ [NAME] est en train d&apos;écrire...
+ </string>
+ <string name="Unnamed">
+ (sans nom)
+ </string>
+ <string name="IM_moderated_chat_label">
+ (Modéré : Voix désactivées par défaut)
+ </string>
+ <string name="IM_unavailable_text_label">
+ Le chat écrit n&apos;est pas disponible pour cet appel.
+ </string>
+ <string name="IM_muted_text_label">
+ Votre chat écrit a été désactivé par un modérateur de groupe.
+ </string>
+ <string name="IM_default_text_label">
+ Cliquez ici pour envoyer un message instantané.
+ </string>
+ <string name="IM_to_label">
+ À
+ </string>
+ <string name="IM_moderator_label">
+ (Modérateur)
+ </string>
+ <string name="Saved_message">
+ (Enregistrement : [LONG_TIMESTAMP])
+ </string>
+ <string name="IM_unblock_only_groups_friends">
+ Pour afficher ce message, vous devez désactiver la case Seuls mes amis et groupes peuvent m&apos;appeler ou m&apos;envoyer un IM, sous Préférences/Confidentialité.
+ </string>
+ <string name="answered_call">
+ Votre appel a fait l&apos;objet d&apos;une réponse
+ </string>
+ <string name="you_started_call">
+ Vous appelez.
+ </string>
+ <string name="you_joined_call">
+ Vous avez rejoint l&apos;appel
+ </string>
+ <string name="name_started_call">
+ [NAME] appelle.
+ </string>
+ <string name="ringing-im">
+ En train de rejoindre l&apos;appel...
+ </string>
+ <string name="connected-im">
+ Connecté(e), cliquez sur Quitter l&apos;appel pour raccrocher
+ </string>
+ <string name="hang_up-im">
+ A quitté l&apos;appel
+ </string>
+ <string name="answering-im">
+ Connexion en cours...
+ </string>
+ <string name="conference-title">
+ Conférence ad-hoc
+ </string>
+ <string name="conference-title-incoming">
+ Conférence avec [AGENT_NAME]
+ </string>
+ <string name="inventory_item_offered-im">
+ Objet de l&apos;inventaire offert
+ </string>
+ <string name="share_alert">
+ Faire glisser les objets de l&apos;inventaire ici
+ </string>
+ <string name="no_session_message">
+ (Session IM inexistante)
+ </string>
+ <string name="only_user_message">
+ Vous êtes le seul participant à cette session.
+ </string>
+ <string name="offline_message">
+ [NAME] est hors ligne.
+ </string>
+ <string name="invite_message">
+ Pour accepter ce chat vocal/vous connecter, cliquez sur le bouton [BUTTON NAME].
+ </string>
+ <string name="muted_message">
+ Vous ignorez ce résident. Si vous lui envoyez un message, il ne sera plus ignoré.
+ </string>
+ <string name="generic">
+ Erreur lors de la requête, veuillez réessayer ultérieurement.
+ </string>
+ <string name="generic_request_error">
+ Erreur lors de la requête, veuillez réessayer ultérieurement.
+ </string>
+ <string name="insufficient_perms_error">
+ Vous n&apos;avez pas les droits requis.
+ </string>
+ <string name="session_does_not_exist_error">
+ La session a expiré
+ </string>
+ <string name="no_ability_error">
+ Vous n&apos;avez pas ce pouvoir.
+ </string>
+ <string name="no_ability">
+ Vous n&apos;avez pas ce pouvoir.
+ </string>
+ <string name="not_a_mod_error">
+ Vous n&apos;êtes pas modérateur de session.
+ </string>
+ <string name="muted">
+ Un modérateur de groupe a désactivé votre chat écrit.
+ </string>
+ <string name="muted_error">
+ Un modérateur de groupe a désactivé votre chat écrit.
+ </string>
+ <string name="add_session_event">
+ Impossible d&apos;ajouter des participants à la session de chat avec [RECIPIENT].
+ </string>
+ <string name="message">
+ Impossible d&apos;envoyer votre message à la session de chat avec [RECIPIENT].
+ </string>
+ <string name="message_session_event">
+ Impossible d&apos;envoyer votre message à la session de chat avec [RECIPIENT].
+ </string>
+ <string name="mute">
+ Erreur lors de la modération.
+ </string>
+ <string name="removed">
+ Vous avez été supprimé du groupe.
+ </string>
+ <string name="removed_from_group">
+ Vous avez été supprimé du groupe.
+ </string>
+ <string name="close_on_no_ability">
+ Vous ne pouvez plus participer à la session de chat.
+ </string>
+ <string name="unread_chat_single">
+ [SOURCES] a dit quelque chose de nouveau
+ </string>
+ <string name="unread_chat_multiple">
+ [SOURCES] ont dit quelque chose de nouveau
+ </string>
+ <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>
+ <string name="paid_you_ldollars">
+ [NAME] vous a payé [AMOUNT] L$ [REASON].
+ </string>
+ <string name="paid_you_ldollars_no_reason">
+ [NAME] vous a payé [AMOUNT] L$.
+ </string>
+ <string name="you_paid_ldollars">
+ Vous avez payé à [AMOUNT] L$ [REASON].
+ </string>
+ <string name="you_paid_ldollars_no_info">
+ Vous avez payé [AMOUNT] L$.
+ </string>
+ <string name="you_paid_ldollars_no_reason">
+ Vous avez payé à [NAME] [AMOUNT] L$.
+ </string>
+ <string name="you_paid_ldollars_no_name">
+ Vous avez payé à [AMOUNT] L$ [REASON].
+ </string>
+ <string name="you_paid_failure_ldollars">
+ Votre paiement de [AMOUNT] L$ à [NAME] [REASON] a échoué.
+ </string>
+ <string name="you_paid_failure_ldollars_no_info">
+ Votre paiement de [AMOUNT] L$ a échoué.
+ </string>
+ <string name="you_paid_failure_ldollars_no_reason">
+ Votre paiement de [AMOUNT] L$ à [NAME] a échoué.
+ </string>
+ <string name="you_paid_failure_ldollars_no_name">
+ Votre paiement de [AMOUNT] L$ [REASON] a échoué.
+ </string>
+ <string name="for item">
+ pour l&apos;article suivant : [ITEM]
+ </string>
+ <string name="for a parcel of land">
+ pour une parcelle de terrain
+ </string>
+ <string name="for a land access pass">
+ pour un pass d&apos;accès au terrain
+ </string>
+ <string name="for deeding land">
+ pour une cession de terrain
+ </string>
+ <string name="to create a group">
+ pour créer un groupe
+ </string>
+ <string name="to join a group">
+ pour rejoindre un groupe
+ </string>
+ <string name="to upload">
+ pour charger
+ </string>
+ <string name="to publish a classified ad">
+ pour publier une petite annonce
+ </string>
+ <string name="giving">
+ Donner [AMOUNT] L$
+ </string>
+ <string name="uploading_costs">
+ Le chargement coûte [AMOUNT] L$
+ </string>
+ <string name="this_costs">
+ Cela coûte [AMOUNT] L$
+ </string>
+ <string name="buying_selected_land">
+ Achat du terrain sélectionné pour [AMOUNT] L$
+ </string>
+ <string name="this_object_costs">
+ Cet objet coûte [AMOUNT] L$
+ </string>
+ <string name="group_role_everyone">
+ Tous
+ </string>
+ <string name="group_role_officers">
+ Officiers
+ </string>
+ <string name="group_role_owners">
+ Propriétaires
+ </string>
+ <string name="group_member_status_online">
+ En ligne
+ </string>
+ <string name="uploading_abuse_report">
+ Chargement...
+
+du rapport d&apos;infraction
+ </string>
+ <string name="New Shape">
+ Nouvelle silhouette
+ </string>
+ <string name="New Skin">
+ Nouvelle peau
+ </string>
+ <string name="New Hair">
+ Nouveaux cheveux
+ </string>
+ <string name="New Eyes">
+ Nouveaux yeux
+ </string>
+ <string name="New Shirt">
+ Nouvelle chemise
+ </string>
+ <string name="New Pants">
+ Nouveau pantalon
+ </string>
+ <string name="New Shoes">
+ Nouvelles chaussures
+ </string>
+ <string name="New Socks">
+ Nouvelles chaussettes
+ </string>
+ <string name="New Jacket">
+ Nouvelle veste
+ </string>
+ <string name="New Gloves">
+ Nouveaux gants
+ </string>
+ <string name="New Undershirt">
+ Nouveau débardeur
+ </string>
+ <string name="New Underpants">
+ Nouveau caleçon
+ </string>
+ <string name="New Skirt">
+ Nouvelle jupe
+ </string>
+ <string name="New Alpha">
+ Nouvel alpha
+ </string>
+ <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>
+ <string name="New Gesture">
+ Nouveau geste
+ </string>
+ <string name="New Script">
+ Nouveau script
+ </string>
+ <string name="New Note">
+ Nouvelle note
+ </string>
+ <string name="New Folder">
+ Nouveau dossier
+ </string>
+ <string name="Contents">
+ Contenus
+ </string>
+ <string name="Gesture">
+ Geste
+ </string>
+ <string name="Male Gestures">
+ Gestes masculins
+ </string>
+ <string name="Female Gestures">
+ Gestes féminins
+ </string>
+ <string name="Other Gestures">
+ Autres gestes
+ </string>
+ <string name="Speech Gestures">
+ Gestes liés à la parole
+ </string>
+ <string name="Common Gestures">
+ Gestes communs
+ </string>
+ <string name="Male - Excuse me">
+ Homme - Demander pardon
+ </string>
+ <string name="Male - Get lost">
+ Homme - Get lost
+ </string>
+ <string name="Male - Blow kiss">
+ Homme - Envoyer un baiser
+ </string>
+ <string name="Male - Boo">
+ Homme - Hou !
+ </string>
+ <string name="Male - Bored">
+ Homme - Ennui
+ </string>
+ <string name="Male - Hey">
+ Homme - Hé !
+ </string>
+ <string name="Male - Laugh">
+ Homme - Rire
+ </string>
+ <string name="Male - Repulsed">
+ Homme - Dégoût
+ </string>
+ <string name="Male - Shrug">
+ Homme - Hausser les épaules
+ </string>
+ <string name="Male - Stick tougue out">
+ Homme - Tirer la langue
+ </string>
+ <string name="Male - Wow">
+ Homme - Ouah !
+ </string>
+ <string name="Female - Chuckle">
+ Femme - Glousser
+ </string>
+ <string name="Female - Cry">
+ Femme - Pleurer
+ </string>
+ <string name="Female - Embarrassed">
+ Femme - Gêne
+ </string>
+ <string name="Female - Excuse me">
+ Femme - Demander pardon
+ </string>
+ <string name="Female - Get lost">
+ Femme - Get lost
+ </string>
+ <string name="Female - Blow kiss">
+ Femme - Envoyer un baiser
+ </string>
+ <string name="Female - Boo">
+ Femme - Hou !
+ </string>
+ <string name="Female - Bored">
+ Femme - Ennui
+ </string>
+ <string name="Female - Hey">
+ Femme - Hé !
+ </string>
+ <string name="Female - Hey baby">
+ Femme - Hey baby
+ </string>
+ <string name="Female - Laugh">
+ Femme - Rire
+ </string>
+ <string name="Female - Looking good">
+ Femme - Looking good
+ </string>
+ <string name="Female - Over here">
+ Femme - Over here
+ </string>
+ <string name="Female - Please">
+ Femme - Please
+ </string>
+ <string name="Female - Repulsed">
+ Femme - Dégoût
+ </string>
+ <string name="Female - Shrug">
+ Femme - Hausser les épaules
+ </string>
+ <string name="Female - Stick tougue out">
+ Femme - Tirer la langue
+ </string>
+ <string name="Female - Wow">
+ Femme - Ouah !
+ </string>
+ <string name="/bow">
+ /s&apos;incliner
+ </string>
+ <string name="/clap">
+ /applaudir
+ </string>
+ <string name="/count">
+ /compter
+ </string>
+ <string name="/extinguish">
+ /éteindre
+ </string>
+ <string name="/kmb">
+ /vatefairevoir
+ </string>
+ <string name="/muscle">
+ /montrersesmuscles
+ </string>
+ <string name="/no">
+ /non
+ </string>
+ <string name="/no!">
+ /non !
+ </string>
+ <string name="/paper">
+ /papier
+ </string>
+ <string name="/pointme">
+ /memontrerdudoigt
+ </string>
+ <string name="/pointyou">
+ /montrerl&apos;autredudoigt
+ </string>
+ <string name="/rock">
+ /pierre
+ </string>
+ <string name="/scissor">
+ /ciseaux
+ </string>
+ <string name="/smoke">
+ /fumer
+ </string>
+ <string name="/stretch">
+ /bailler
+ </string>
+ <string name="/whistle">
+ /siffler
+ </string>
+ <string name="/yes">
+ /oui
+ </string>
+ <string name="/yes!">
+ /oui !
+ </string>
+ <string name="afk">
+ absent
+ </string>
+ <string name="dance1">
+ danse1
+ </string>
+ <string name="dance2">
+ danse2
+ </string>
+ <string name="dance3">
+ danse3
+ </string>
+ <string name="dance4">
+ danse4
+ </string>
+ <string name="dance5">
+ danse5
+ </string>
+ <string name="dance6">
+ danse6
+ </string>
+ <string name="dance7">
+ danse7
+ </string>
+ <string name="dance8">
+ danse8
+ </string>
+ <string name="AvatarBirthDateFormat">
+ [day,datetime,slt]/[mthnum,datetime,slt]/[year,datetime,slt]
+ </string>
+ <string name="DefaultMimeType">
+ aucun/aucun
+ </string>
+ <string name="texture_load_dimensions_error">
+ Impossible de charger des images de taille supérieure à [WIDTH]*[HEIGHT]
+ </string>
+ <string name="words_separator" value=","/>
+ <string name="server_is_down">
+ Malgré nos efforts, une erreur inattendue s&apos;est produite.
+
+ Veuillez vous reporter à status.secondlifegrid.net afin de déterminer si un problème connu existe avec ce service.
+ Si le problème persiste, vérifiez la configuration de votre réseau et de votre pare-feu.
+ </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">
+ [AMOUNT] US$
+ </string>
+ <string name="Membership">
+ Inscription
+ </string>
+ <string name="Roles">
+ Rôles
+ </string>
+ <string name="Group Identity">
+ Identité du groupe
+ </string>
+ <string name="Parcel Management">
+ Gestion des parcelles
+ </string>
+ <string name="Parcel Identity">
+ Identité des parcelles
+ </string>
+ <string name="Parcel Settings">
+ Paramètres des parcelles
+ </string>
+ <string name="Parcel Powers">
+ Pouvoirs sur les parcelles
+ </string>
+ <string name="Parcel Access">
+ Accès aux parcelles
+ </string>
+ <string name="Parcel Content">
+ Contenu des parcelles
+ </string>
+ <string name="Object Management">
+ Gestion des objets
+ </string>
+ <string name="Accounting">
+ Comptabilité
+ </string>
+ <string name="Notices">
+ Notices
+ </string>
+ <string name="Chat" value=" Chat :">
+ Chat
+ </string>
+ <string name="DeleteItems">
+ Supprimer les articles sélectionnés ?
+ </string>
+ <string name="DeleteItem">
+ Supprimer l&apos;article sélectionné ?
+ </string>
+ <string name="EmptyOutfitText">
+ Cette tenue ne contient aucun article.
+ </string>
+ <string name="ExternalEditorNotSet">
+ Sélectionnez un éditeur à l&apos;aide du paramètre ExternalEditor.
+ </string>
+ <string name="ExternalEditorNotFound">
+ Éditeur externe spécifié introuvable.
+Essayez avec le chemin d&apos;accès à l&apos;éditeur entre guillemets doubles
+(par ex. : &quot;/chemin_accès/editor&quot; &quot;%s&quot;).
+ </string>
+ <string name="ExternalEditorCommandParseError">
+ Erreur lors de l&apos;analyse de la commande d&apos;éditeur externe.
+ </string>
+ <string name="ExternalEditorFailedToRun">
+ Échec d&apos;exécution de l&apos;éditeur externe.
+ </string>
+ <string name="TranslationFailed">
+ Échec de traduction : [REASON]
+ </string>
+ <string name="TranslationResponseParseError">
+ Erreur lors de l&apos;analyse de la réponse relative à la traduction.
+ </string>
+ <string name="Esc">
+ Échap
+ </string>
+ <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">
+ Maj
+ </string>
+ <string name="Ctrl">
+ Ctrl
+ </string>
+ <string name="Alt">
+ Alt
+ </string>
+ <string name="CapsLock">
+ CapsLock
+ </string>
+ <string name="Home">
+ Début
+ </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">
+ Ajouter
+ </string>
+ <string name="Subtract">
+ Soustraire
+ </string>
+ <string name="Multiply">
+ Multiplier
+ </string>
+ <string name="Divide">
+ Diviser
+ </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">
+ Affichage des balises de particule (bleu)
+ </string>
+ <string name="BeaconPhysical">
+ Affichage des balises d&apos;objet physique (vert)
+ </string>
+ <string name="BeaconScripted">
+ Affichage des balises d&apos;objet scripté (rouge)
+ </string>
+ <string name="BeaconScriptedTouch">
+ Affichage des balises d&apos;objet scripté avec fonction de toucher (rouge)
+ </string>
+ <string name="BeaconSound">
+ Affichage des balises de son (jaune)
+ </string>
+ <string name="BeaconMedia">
+ Affichage des balises de média (blanc)
+ </string>
+ <string name="ParticleHiding">
+ Masquage des particules
+ </string>
+ <string name="Command_AboutLand_Label">
+ À propos du terrain
+ </string>
+ <string name="Command_Appearance_Label">
+ Apparence
+ </string>
+ <string name="Command_Avatar_Label">
+ Avatar
+ </string>
+ <string name="Command_Build_Label">
+ Construire
+ </string>
+ <string name="Command_Chat_Label">
+ Chat
+ </string>
+ <string name="Command_Compass_Label">
+ Boussole
+ </string>
+ <string name="Command_Destinations_Label">
+ Destinations
+ </string>
+ <string name="Command_Gestures_Label">
+ Gestes
+ </string>
+ <string name="Command_HowTo_Label">
+ Aide rapide
+ </string>
+ <string name="Command_Inventory_Label">
+ Inventaire
+ </string>
+ <string name="Command_Map_Label">
+ Carte
+ </string>
+ <string name="Command_Marketplace_Label">
+ Place du marché
+ </string>
+ <string name="Command_MiniMap_Label">
+ Mini-carte
+ </string>
+ <string name="Command_Move_Label">
+ Marcher / Courir / Voler
+ </string>
+ <string name="Command_Outbox_Label">
+ Boîte d&apos;envoi vendeur
+ </string>
+ <string name="Command_People_Label">
+ Personnes
+ </string>
+ <string name="Command_Picks_Label">
+ Favoris
+ </string>
+ <string name="Command_Places_Label">
+ Lieux
+ </string>
+ <string name="Command_Preferences_Label">
+ Préférences
+ </string>
+ <string name="Command_Profile_Label">
+ Profil
+ </string>
+ <string name="Command_Search_Label">
+ Recherche
+ </string>
+ <string name="Command_Snapshot_Label">
+ Photo
+ </string>
+ <string name="Command_Speak_Label">
+ Parler
+ </string>
+ <string name="Command_View_Label">
+ Paramètres de la caméra
+ </string>
+ <string name="Command_Voice_Label">
+ Paramètres vocaux
+ </string>
+ <string name="Command_AboutLand_Tooltip">
+ Information sur le terrain que vous visitez
+ </string>
+ <string name="Command_Appearance_Tooltip">
+ Modifier votre avatar
+ </string>
+ <string name="Command_Avatar_Tooltip">
+ Choisir un avatar complet
+ </string>
+ <string name="Command_Build_Tooltip">
+ Construction d&apos;objets et remodelage du terrain
+ </string>
+ <string name="Command_Chat_Tooltip">
+ Parler aux personnes près de vous par chat écrit
+ </string>
+ <string name="Command_Compass_Tooltip">
+ Boussole
+ </string>
+ <string name="Command_Destinations_Tooltip">
+ Destinations intéressantes
+ </string>
+ <string name="Command_Gestures_Tooltip">
+ Gestes de votre avatar
+ </string>
+ <string name="Command_HowTo_Tooltip">
+ Comment effectuer les opérations courantes
+ </string>
+ <string name="Command_Inventory_Tooltip">
+ Afficher et utiliser vos possessions
+ </string>
+ <string name="Command_Map_Tooltip">
+ Carte du monde
+ </string>
+ <string name="Command_Marketplace_Tooltip">
+ Faire du shopping
+ </string>
+ <string name="Command_MiniMap_Tooltip">
+ Afficher les personnes près de vous
+ </string>
+ <string name="Command_Move_Tooltip">
+ Faire bouger votre avatar
+ </string>
+ <string name="Command_Outbox_Tooltip">
+ Transférer des articles vers votre place de marché afin de les vendre.
+ </string>
+ <string name="Command_People_Tooltip">
+ Amis, groupes et personnes près de vous
+ </string>
+ <string name="Command_Picks_Tooltip">
+ Lieux à afficher comme favoris dans votre profil
+ </string>
+ <string name="Command_Places_Tooltip">
+ Lieux enregistrés
+ </string>
+ <string name="Command_Preferences_Tooltip">
+ Préférences
+ </string>
+ <string name="Command_Profile_Tooltip">
+ Modifier ou afficher votre profil
+ </string>
+ <string name="Command_Search_Tooltip">
+ Trouver des lieux, personnes, événements
+ </string>
+ <string name="Command_Snapshot_Tooltip">
+ Prendre une photo
+ </string>
+ <string name="Command_Speak_Tooltip">
+ Parler aux personnes près de vous en utilisant votre micro
+ </string>
+ <string name="Command_View_Tooltip">
+ Changer l&apos;angle de la caméra
+ </string>
+ <string name="Command_Voice_Tooltip">
+ Commandes de réglage du volume des appels et des personnes près de vous dans Second Life.
+ </string>
+ <string name="Toolbar_Bottom_Tooltip">
+ actuellement dans la barre d&apos;outils du bas
+ </string>
+ <string name="Toolbar_Left_Tooltip">
+ actuellement dans la barre d&apos;outils de gauche
+ </string>
+ <string name="Toolbar_Right_Tooltip">
+ actuellement dans la barre d&apos;outils de droite
+ </string>
+ <string name="Retain%">
+ Garder%
+ </string>
+ <string name="Detail">
+ Détail
+ </string>
+ <string name="Better Detail">
+ Meilleur détail
+ </string>
+ <string name="Surface">
+ Surface
+ </string>
+ <string name="Solid">
+ Solide
+ </string>
+ <string name="Wrap">
+ Wrap
+ </string>
+ <string name="Preview">
+ Aperçu
+ </string>
+ <string name="Normal">
+ Normal
+ </string>
+ <string name="snapshot_quality_very_low">
+ Très faible
+ </string>
+ <string name="snapshot_quality_low">
+ Faible
+ </string>
+ <string name="snapshot_quality_medium">
+ Moyenne
+ </string>
+ <string name="snapshot_quality_high">
+ Élevée
+ </string>
+ <string name="snapshot_quality_very_high">
+ Très élevée
+ </string>
+</strings>
diff --git a/indra/newview/skins/steam/xui/it/strings.xml b/indra/newview/skins/steam/xui/it/strings.xml
new file mode 100644
index 0000000000..0fcc4e0820
--- /dev/null
+++ b/indra/newview/skins/steam/xui/it/strings.xml
@@ -0,0 +1,4928 @@
+<?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="SUPPORT_SITE">
+ Portale di supporto di Second Life
+ </string>
+ <string name="StartupDetectingHardware">
+ Ricerca hardware...
+ </string>
+ <string name="StartupLoading">
+ Caricamento di [APP_NAME]...
+ </string>
+ <string name="StartupClearingCache">
+ Pulizia della cache...
+ </string>
+ <string name="StartupInitializingTextureCache">
+ Inizializzazione della cache texture...
+ </string>
+ <string name="StartupInitializingVFS">
+ Inizializzazione VFS...
+ </string>
+ <string name="StartupRequireDriverUpdate">
+ Inizializzazione grafica non riuscita. Aggiorna il driver della scheda grafica!
+ </string>
+ <string name="ProgressRestoring">
+ Ripristino in corso...
+ </string>
+ <string name="ProgressChangingResolution">
+ Modifica della risoluzione...
+ </string>
+ <string name="Fullbright">
+ Luminosità massima (vers. precedente)
+ </string>
+ <string name="LoginInProgress">
+ In connessione. [APP_NAME] può sembrare rallentata. Attendi.
+ </string>
+ <string name="LoginInProgressNoFrozen">
+ Accesso in corso...
+ </string>
+ <string name="LoginAuthenticating">
+ In autenticazione
+ </string>
+ <string name="LoginMaintenance">
+ Aggiornamento account in corso...
+ </string>
+ <string name="LoginAttempt">
+ Un precedente tentativo di login è fallito. Tentativo di connessione [NUMBER]
+ </string>
+ <string name="LoginPrecaching">
+ Sto caricando [SECOND_LIFE]...
+ </string>
+ <string name="LoginInitializingBrowser">
+ Inizializzazione del browser web incorporato...
+ </string>
+ <string name="LoginInitializingMultimedia">
+ Inizializzazione dati multimediali...
+ </string>
+ <string name="LoginInitializingFonts">
+ Caricamento caratteri...
+ </string>
+ <string name="LoginVerifyingCache">
+ Verifica file della cache (tempo previsto 60-90 secondi)...
+ </string>
+ <string name="LoginProcessingResponse">
+ Elaborazione risposta...
+ </string>
+ <string name="LoginInitializingWorld">
+ Inizializzazione mondo...
+ </string>
+ <string name="LoginDecodingImages">
+ Decodifica immagini...
+ </string>
+ <string name="LoginInitializingQuicktime">
+ Inizializzazione QuickTime...
+ </string>
+ <string name="LoginQuicktimeNotFound">
+ QuickTime non trovato - impossibile inizializzare.
+ </string>
+ <string name="LoginQuicktimeOK">
+ QuickTime configurato con successo.
+ </string>
+ <string name="LoginRequestSeedCapGrant">
+ Richiesta capacità regione...
+ </string>
+ <string name="LoginRetrySeedCapGrant">
+ Richiesta capacità regione, tentativo [NUMBER]...
+ </string>
+ <string name="LoginWaitingForRegionHandshake">
+ In attesa della risposta della regione...
+ </string>
+ <string name="LoginConnectingToRegion">
+ Connessione alla regione...
+ </string>
+ <string name="LoginDownloadingClothing">
+ Sto caricando i vestiti...
+ </string>
+ <string name="InvalidCertificate">
+ Il server ha inviato un certificato non valido o errato. Rivolgiti all&apos;amministratore della griglia.
+ </string>
+ <string name="CertInvalidHostname">
+ Per accedere al server è stato utilizzato un nome host non valido; controlla lo SLURL o il nome host della griglia.
+ </string>
+ <string name="CertExpired">
+ Il certificato inviato dalla griglia sembra essere scaduto. Controlla l&apos;orologio del sistema o rivolgiti all&apos;amministratore della griglia.
+ </string>
+ <string name="CertKeyUsage">
+ Impossibile utilizzare per SSl il certificato inviato dal server. Rivolgiti all&apos;amministratore della griglia.
+ </string>
+ <string name="CertBasicConstraints">
+ Nella catena dei certificati del server erano presenti troppi certificati. Rivolgiti all&apos;amministratore della griglia.
+ </string>
+ <string name="CertInvalidSignature">
+ Impossibile verificare la firma del certificato inviato dal server della griglia. Rivolgiti all&apos;amministratore della griglia.
+ </string>
+ <string name="LoginFailedNoNetwork">
+ Errore di rete: Non è stato possibile stabilire un collegamento, controlla la tua connessione.
+ </string>
+ <string name="LoginFailed">
+ Accesso non riuscito.
+ </string>
+ <string name="Quit">
+ Esci
+ </string>
+ <string name="create_account_url">
+ http://join.secondlife.com/index.php?sourceid=1206_steam&amp;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 persone con account gratuiti non potranno 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>
+ <string name="SavingSettings">
+ Salvataggio delle impostazioni...
+ </string>
+ <string name="LoggingOut">
+ Uscita...
+ </string>
+ <string name="ShuttingDown">
+ Chiusura...
+ </string>
+ <string name="YouHaveBeenDisconnected">
+ Sei scollegato dalla regione in cui ti trovavi.
+ </string>
+ <string name="SentToInvalidRegion">
+ Sei stato indirizzato in una regione non valida.
+ </string>
+ <string name="TestingDisconnect">
+ Verifica scollegamento viewer
+ </string>
+ <string name="TooltipPerson">
+ Persona
+ </string>
+ <string name="TooltipNoName">
+ (nessun nome)
+ </string>
+ <string name="TooltipOwner">
+ Proprietario:
+ </string>
+ <string name="TooltipPublic">
+ Pubblico
+ </string>
+ <string name="TooltipIsGroup">
+ (Gruppo)
+ </string>
+ <string name="TooltipForSaleL$">
+ In Vendita: [AMOUNT]L$
+ </string>
+ <string name="TooltipFlagGroupBuild">
+ Costruzione solo con gruppo
+ </string>
+ <string name="TooltipFlagNoBuild">
+ Divieto di Costruire
+ </string>
+ <string name="TooltipFlagNoEdit">
+ Costruzione solo con gruppo
+ </string>
+ <string name="TooltipFlagNotSafe">
+ Non Sicuro
+ </string>
+ <string name="TooltipFlagNoFly">
+ Divieto di Volare
+ </string>
+ <string name="TooltipFlagGroupScripts">
+ Script solo con gruppo
+ </string>
+ <string name="TooltipFlagNoScripts">
+ Script vietati
+ </string>
+ <string name="TooltipLand">
+ Terreno:
+ </string>
+ <string name="TooltipMustSingleDrop">
+ Solo un singolo oggetto può essere creato qui
+ </string>
+ <string name="TooltipPrice" value="L$ [AMOUNT]:"/>
+ <string name="TooltipOutboxDragToWorld">
+ Non puoi rezzare elementi nella tua casella in uscita del rivenditore
+ </string>
+ <string name="TooltipOutboxNoTransfer">
+ Almeno uno di questi oggetti non può essere venduto o trasferito.
+ </string>
+ <string name="TooltipOutboxNotInInventory">
+ La tua casella in uscita del rivenditore può accettare solo elementi provenienti dal tuo inventario
+ </string>
+ <string name="TooltipOutboxWorn">
+ Non puoi mettere gli elementi che indossi nella casella in uscita del rivenditore
+ </string>
+ <string name="TooltipOutboxCallingCard">
+ Non puoi inserire il tuo biglietto da visita nella tua casella in uscita del rivenditore
+ </string>
+ <string name="TooltipOutboxFolderLevels">
+ La profondità delle caselle nidificate è maggiore di 3
+ </string>
+ <string name="TooltipOutboxTooManyFolders">
+ Il numero di sottocartelle nella cartella al livello più alto è maggiore di 20
+ </string>
+ <string name="TooltipOutboxTooManyObjects">
+ Il numero di elementi nella cartella al livello più alto è maggiore di 200
+ </string>
+ <string name="TooltipDragOntoOwnChild">
+ Non puoi spostare una cartella nella relativa cartella secondaria
+ </string>
+ <string name="TooltipDragOntoSelf">
+ Non puoi spostare una cartella in se stessa
+ </string>
+ <string name="TooltipHttpUrl">
+ Clicca per visitare questa pagina web
+ </string>
+ <string name="TooltipSLURL">
+ Clicca per avere maggiori informazioni sul luogo
+ </string>
+ <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>
+ <string name="TooltipAgentUnmute">
+ Clicca per attivare l&apos;audio del residente
+ </string>
+ <string name="TooltipAgentIM">
+ Clicca per inviare un IM a questo residente
+ </string>
+ <string name="TooltipAgentPay">
+ Clicca per pagare il residente
+ </string>
+ <string name="TooltipAgentOfferTeleport">
+ Fai clic per inviare un&apos;offerta di teleport al residente
+ </string>
+ <string name="TooltipAgentRequestFriend">
+ Fai clic per inviare una richiesta di amicizia al residente
+ </string>
+ <string name="TooltipGroupUrl">
+ Clicca per vedere la descrizione del gruppo
+ </string>
+ <string name="TooltipEventUrl">
+ Clicca per vedere la descrizione dell&apos;evento
+ </string>
+ <string name="TooltipClassifiedUrl">
+ Clicca per vedere questa inserzione
+ </string>
+ <string name="TooltipParcelUrl">
+ Clicca per vedere la descrizione del lotto
+ </string>
+ <string name="TooltipTeleportUrl">
+ Clicca per effettuare il teleport a questa destinazione
+ </string>
+ <string name="TooltipObjectIMUrl">
+ Clicca per vedere la descrizione dell&apos;oggetto
+ </string>
+ <string name="TooltipMapUrl">
+ Clicca per vedere questo posto sulla mappa
+ </string>
+ <string name="TooltipSLAPP">
+ Clicca per avviare il comando secondlife://
+ </string>
+ <string name="CurrentURL" value="URL attuale: [CurrentURL]"/>
+ <string name="SLurlLabelTeleport">
+ Teleportati a
+ </string>
+ <string name="SLurlLabelShowOnMap">
+ Mostra la mappa per
+ </string>
+ <string name="SLappAgentMute">
+ Disattiva audio
+ </string>
+ <string name="SLappAgentUnmute">
+ Riattiva audio
+ </string>
+ <string name="SLappAgentIM">
+ IM
+ </string>
+ <string name="SLappAgentPay">
+ Paga
+ </string>
+ <string name="SLappAgentOfferTeleport">
+ Offri teleport a
+ </string>
+ <string name="SLappAgentRequestFriend">
+ Richiesta di amicizia
+ </string>
+ <string name="BUTTON_CLOSE_DARWIN">
+ Chiudi (⌘W)
+ </string>
+ <string name="BUTTON_CLOSE_WIN">
+ Chiudi (Ctrl+W)
+ </string>
+ <string name="BUTTON_CLOSE_CHROME">
+ Chiudi
+ </string>
+ <string name="BUTTON_RESTORE">
+ Ripristina
+ </string>
+ <string name="BUTTON_MINIMIZE">
+ Minimizza
+ </string>
+ <string name="BUTTON_TEAR_OFF">
+ Distacca
+ </string>
+ <string name="BUTTON_DOCK">
+ Àncora
+ </string>
+ <string name="BUTTON_HELP">
+ Mostra Aiuto
+ </string>
+ <string name="Searching">
+ Ricerca in corso...
+ </string>
+ <string name="NoneFound">
+ Nessun risultato.
+ </string>
+ <string name="RetrievingData">
+ Recupero dati in corso...
+ </string>
+ <string name="ReleaseNotes">
+ Note sulla versione
+ </string>
+ <string name="RELEASE_NOTES_BASE_URL">
+ http://wiki.secondlife.com/wiki/Release_Notes/
+ </string>
+ <string name="LoadingData">
+ In caricamento...
+ </string>
+ <string name="AvatarNameNobody">
+ (nessuno)
+ </string>
+ <string name="AvatarNameWaiting">
+ (in attesa)
+ </string>
+ <string name="GroupNameNone">
+ (nessuno)
+ </string>
+ <string name="AvalineCaller">
+ Chiamante Avaline [ORDER]
+ </string>
+ <string name="AssetErrorNone">
+ Nessun errore
+ </string>
+ <string name="AssetErrorRequestFailed">
+ Richiesta risorsa: fallita
+ </string>
+ <string name="AssetErrorNonexistentFile">
+ Richiesta risorsa: file non esistente
+ </string>
+ <string name="AssetErrorNotInDatabase">
+ Richiesta risorsa: risorsa non trovata nel database
+ </string>
+ <string name="AssetErrorEOF">
+ Fine del file
+ </string>
+ <string name="AssetErrorCannotOpenFile">
+ Apertura del file non possibile
+ </string>
+ <string name="AssetErrorFileNotFound">
+ File non trovato
+ </string>
+ <string name="AssetErrorTCPTimeout">
+ Tempo esaurito per il trasferimento file
+ </string>
+ <string name="AssetErrorCircuitGone">
+ Circuito perso
+ </string>
+ <string name="AssetErrorPriceMismatch">
+ Il programma e il server non combaciano nel prezzo
+ </string>
+ <string name="AssetErrorUnknownStatus">
+ Stato sconosciuto
+ </string>
+ <string name="texture">
+ texture
+ </string>
+ <string name="sound">
+ suono
+ </string>
+ <string name="calling card">
+ biglietto da visita
+ </string>
+ <string name="landmark">
+ punto di riferimento
+ </string>
+ <string name="legacy script">
+ script (vecchia versione)
+ </string>
+ <string name="clothing">
+ vestiario
+ </string>
+ <string name="object">
+ oggetto
+ </string>
+ <string name="note card">
+ biglietto
+ </string>
+ <string name="folder">
+ cartella
+ </string>
+ <string name="root">
+ cartella principale
+ </string>
+ <string name="lsl2 script">
+ script LSL2
+ </string>
+ <string name="lsl bytecode">
+ bytecode LSL
+ </string>
+ <string name="tga texture">
+ tga texture
+ </string>
+ <string name="body part">
+ parte del corpo
+ </string>
+ <string name="snapshot">
+ fotografia
+ </string>
+ <string name="lost and found">
+ oggetti smarriti
+ </string>
+ <string name="targa image">
+ immagine targa
+ </string>
+ <string name="trash">
+ Cestino
+ </string>
+ <string name="jpeg image">
+ immagine jpeg
+ </string>
+ <string name="animation">
+ animazione
+ </string>
+ <string name="gesture">
+ gesture
+ </string>
+ <string name="simstate">
+ simstate
+ </string>
+ <string name="favorite">
+ preferiti
+ </string>
+ <string name="symbolic link">
+ link
+ </string>
+ <string name="symbolic folder link">
+ link alla cartella
+ </string>
+ <string name="mesh">
+ reticolo
+ </string>
+ <string name="AvatarEditingAppearance">
+ (Modifica Aspetto)
+ </string>
+ <string name="AvatarAway">
+ Assente
+ </string>
+ <string name="AvatarBusy">
+ Occupato
+ </string>
+ <string name="AvatarMuted">
+ Mutato
+ </string>
+ <string name="anim_express_afraid">
+ Dispiaciuto
+ </string>
+ <string name="anim_express_anger">
+ Arrabbiato
+ </string>
+ <string name="anim_away">
+ Assente
+ </string>
+ <string name="anim_backflip">
+ Salto all&apos;indietro
+ </string>
+ <string name="anim_express_laugh">
+ Ridere a crepapelle
+ </string>
+ <string name="anim_express_toothsmile">
+ Gran sorriso
+ </string>
+ <string name="anim_blowkiss">
+ Lancia un bacio
+ </string>
+ <string name="anim_express_bored">
+ Noia
+ </string>
+ <string name="anim_bow">
+ Inchino
+ </string>
+ <string name="anim_clap">
+ Applauso
+ </string>
+ <string name="anim_courtbow">
+ Inchino a corte
+ </string>
+ <string name="anim_express_cry">
+ Pianto
+ </string>
+ <string name="anim_dance1">
+ Ballo 1
+ </string>
+ <string name="anim_dance2">
+ Ballo 2
+ </string>
+ <string name="anim_dance3">
+ Ballo 3
+ </string>
+ <string name="anim_dance4">
+ Ballo 4
+ </string>
+ <string name="anim_dance5">
+ Ballo 5
+ </string>
+ <string name="anim_dance6">
+ Ballo 6
+ </string>
+ <string name="anim_dance7">
+ Ballo 7
+ </string>
+ <string name="anim_dance8">
+ Dance 8
+ </string>
+ <string name="anim_express_disdain">
+ Sdegno
+ </string>
+ <string name="anim_drink">
+ Bere
+ </string>
+ <string name="anim_express_embarrased">
+ Imbarazzo
+ </string>
+ <string name="anim_angry_fingerwag">
+ Negare col dito
+ </string>
+ <string name="anim_fist_pump">
+ Esultare con pugno
+ </string>
+ <string name="anim_yoga_float">
+ Yoga fluttuante
+ </string>
+ <string name="anim_express_frown">
+ Acciglio
+ </string>
+ <string name="anim_impatient">
+ Impazienza
+ </string>
+ <string name="anim_jumpforjoy">
+ Salto di gioia
+ </string>
+ <string name="anim_kissmybutt">
+ Baciami il sedere
+ </string>
+ <string name="anim_express_kiss">
+ Bacio
+ </string>
+ <string name="anim_laugh_short">
+ Risata
+ </string>
+ <string name="anim_musclebeach">
+ Muscoli da spiaggia
+ </string>
+ <string name="anim_no_unhappy">
+ No (Scontento)
+ </string>
+ <string name="anim_no_head">
+ No
+ </string>
+ <string name="anim_nyanya">
+ Na-na-na
+ </string>
+ <string name="anim_punch_onetwo">
+ Uno-due pugno
+ </string>
+ <string name="anim_express_open_mouth">
+ Bocca aperta
+ </string>
+ <string name="anim_peace">
+ Pace
+ </string>
+ <string name="anim_point_you">
+ Indicare altri
+ </string>
+ <string name="anim_point_me">
+ Indicare te stesso
+ </string>
+ <string name="anim_punch_l">
+ Pugno a sinistra
+ </string>
+ <string name="anim_punch_r">
+ Pugno a destra
+ </string>
+ <string name="anim_rps_countdown">
+ Contare nella morra cinese
+ </string>
+ <string name="anim_rps_paper">
+ Carta nella morra cinese
+ </string>
+ <string name="anim_rps_rock">
+ Sasso nella morra cinese
+ </string>
+ <string name="anim_rps_scissors">
+ Forbici nella morra cinese
+ </string>
+ <string name="anim_express_repulsed">
+ Repulsione
+ </string>
+ <string name="anim_kick_roundhouse_r">
+ Calcio con rotazione
+ </string>
+ <string name="anim_express_sad">
+ Triste
+ </string>
+ <string name="anim_salute">
+ Saluto
+ </string>
+ <string name="anim_shout">
+ Urlo
+ </string>
+ <string name="anim_express_shrug">
+ Spallucce
+ </string>
+ <string name="anim_express_smile">
+ Sorriso
+ </string>
+ <string name="anim_smoke_idle">
+ Fumare
+ </string>
+ <string name="anim_smoke_inhale">
+ Fumare inspirazione
+ </string>
+ <string name="anim_smoke_throw_down">
+ Fumare mandando giù
+ </string>
+ <string name="anim_express_surprise">
+ Sorpresa
+ </string>
+ <string name="anim_sword_strike_r">
+ Colpo di spada
+ </string>
+ <string name="anim_angry_tantrum">
+ Collera
+ </string>
+ <string name="anim_express_tongue_out">
+ Linguaccia
+ </string>
+ <string name="anim_hello">
+ Saluto con mano
+ </string>
+ <string name="anim_whisper">
+ Sussurro
+ </string>
+ <string name="anim_whistle">
+ Fischio
+ </string>
+ <string name="anim_express_wink">
+ Ammicca
+ </string>
+ <string name="anim_wink_hollywood">
+ Ammicca (Hollywood)
+ </string>
+ <string name="anim_express_worry">
+ Preoccupato
+ </string>
+ <string name="anim_yes_happy">
+ Si (Felice)
+ </string>
+ <string name="anim_yes_head">
+ Si
+ </string>
+ <string name="multiple_textures">
+ Multiple
+ </string>
+ <string name="texture_loading">
+ Caricamento in corso...
+ </string>
+ <string name="worldmap_offline">
+ Offline
+ </string>
+ <string name="worldmap_item_tooltip_format">
+ L$ [PRICE] - [AREA] m²
+ </string>
+ <string name="worldmap_results_none_found">
+ Nessun risultato.
+ </string>
+ <string name="Ok">
+ OK
+ </string>
+ <string name="Premature end of file">
+ Fine prematura del file
+ </string>
+ <string name="ST_NO_JOINT">
+ Impossibile trovare ROOT o JOINT.
+ </string>
+ <string name="whisper">
+ sussurra:
+ </string>
+ <string name="shout">
+ grida:
+ </string>
+ <string name="ringing">
+ In connessione alla Voice Chat in-world...
+ </string>
+ <string name="connected">
+ Connesso
+ </string>
+ <string name="unavailable">
+ Il voice non è disponibile nel posto dove ti trovi ora
+ </string>
+ <string name="hang_up">
+ Disconnesso dalla Voice Chat in-world
+ </string>
+ <string name="reconnect_nearby">
+ Sarai riconnesso alla chat vocale nei dintorni
+ </string>
+ <string name="ScriptQuestionCautionChatGranted">
+ A &apos;[OBJECTNAME]&apos;, un oggetto di proprietà di &apos;[OWNERNAME]&apos;, situato in [REGIONNAME] [REGIONPOS], è stato concesso il permesso di: [PERMISSIONS].
+ </string>
+ <string name="ScriptQuestionCautionChatDenied">
+ A &apos;[OBJECTNAME]&apos;, un oggetto di proprietà di &apos;[OWNERNAME]&apos;, situato in [REGIONNAME] [REGIONPOS], è stato negato il permesso di: [PERMISSIONS].
+ </string>
+ <string name="ScriptTakeMoney">
+ Prendere dollari Linden (L$) da te
+ </string>
+ <string name="ActOnControlInputs">
+ Agire sul tuo controllo degli input
+ </string>
+ <string name="RemapControlInputs">
+ Rimappare il tuo controllo degli input
+ </string>
+ <string name="AnimateYourAvatar">
+ Animare il tuo avatar
+ </string>
+ <string name="AttachToYourAvatar">
+ Far indossare al tuo avatar
+ </string>
+ <string name="ReleaseOwnership">
+ Rilasciare la propietà è far diventare pubblico.
+ </string>
+ <string name="LinkAndDelink">
+ Collegare e scollegare dagli altri oggetti
+ </string>
+ <string name="AddAndRemoveJoints">
+ Aggiungere e rimuovere le giunzioni insieme con gli altri oggetti
+ </string>
+ <string name="ChangePermissions">
+ Cambiare i permessi
+ </string>
+ <string name="TrackYourCamera">
+ Tracciare la fotocamera
+ </string>
+ <string name="ControlYourCamera">
+ Controllare la tua fotocamera
+ </string>
+ <string name="SIM_ACCESS_PG">
+ Generale
+ </string>
+ <string name="SIM_ACCESS_MATURE">
+ Moderato
+ </string>
+ <string name="SIM_ACCESS_ADULT">
+ Adulti
+ </string>
+ <string name="SIM_ACCESS_DOWN">
+ Offline
+ </string>
+ <string name="SIM_ACCESS_MIN">
+ Sconosciuto
+ </string>
+ <string name="land_type_unknown">
+ (sconosciuto)
+ </string>
+ <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>
+ <string name="all_files">
+ Tutti i file
+ </string>
+ <string name="sound_files">
+ Suoni
+ </string>
+ <string name="animation_files">
+ Animazioni
+ </string>
+ <string name="image_files">
+ Immagini
+ </string>
+ <string name="save_file_verb">
+ Salva
+ </string>
+ <string name="load_file_verb">
+ Carica
+ </string>
+ <string name="targa_image_files">
+ Immagini Targa
+ </string>
+ <string name="bitmap_image_files">
+ Immagini Bitmap
+ </string>
+ <string name="avi_movie_file">
+ File video AVI
+ </string>
+ <string name="xaf_animation_file">
+ File animazione XAF
+ </string>
+ <string name="xml_file">
+ File XML
+ </string>
+ <string name="raw_file">
+ File RAW
+ </string>
+ <string name="compressed_image_files">
+ Immagini compresse
+ </string>
+ <string name="load_files">
+ Carica i file
+ </string>
+ <string name="choose_the_directory">
+ Scegli la cartella
+ </string>
+ <string name="script_files">
+ Script
+ </string>
+ <string name="AvatarSetNotAway">
+ Imposta come non assente
+ </string>
+ <string name="AvatarSetAway">
+ Imposta come assente
+ </string>
+ <string name="AvatarSetNotBusy">
+ Imposta come non occupato
+ </string>
+ <string name="AvatarSetBusy">
+ Imposta come occupato
+ </string>
+ <string name="shape">
+ Figura corporea
+ </string>
+ <string name="skin">
+ Pelle
+ </string>
+ <string name="hair">
+ Capigliature
+ </string>
+ <string name="eyes">
+ Occhi
+ </string>
+ <string name="shirt">
+ Camicia
+ </string>
+ <string name="pants">
+ Pantaloni
+ </string>
+ <string name="shoes">
+ Scarpe
+ </string>
+ <string name="socks">
+ Calzini
+ </string>
+ <string name="jacket">
+ Giacca
+ </string>
+ <string name="gloves">
+ Guanti
+ </string>
+ <string name="undershirt">
+ Maglietta intima
+ </string>
+ <string name="underpants">
+ Slip
+ </string>
+ <string name="skirt">
+ Gonna
+ </string>
+ <string name="alpha">
+ Alfa (Trasparenza)
+ </string>
+ <string name="tattoo">
+ Tatuaggio
+ </string>
+ <string name="physics">
+ Fisica
+ </string>
+ <string name="invalid">
+ non valido
+ </string>
+ <string name="none">
+ nessuno
+ </string>
+ <string name="shirt_not_worn">
+ Camicia non indossata
+ </string>
+ <string name="pants_not_worn">
+ Pantaloni non indossati
+ </string>
+ <string name="shoes_not_worn">
+ Scarpe non indossate
+ </string>
+ <string name="socks_not_worn">
+ Calzini non indossati
+ </string>
+ <string name="jacket_not_worn">
+ Giacca non indossata
+ </string>
+ <string name="gloves_not_worn">
+ Guanti non indossati
+ </string>
+ <string name="undershirt_not_worn">
+ Maglietta intima non indossata
+ </string>
+ <string name="underpants_not_worn">
+ Slip non indossati
+ </string>
+ <string name="skirt_not_worn">
+ Gonna non indossata
+ </string>
+ <string name="alpha_not_worn">
+ Alpha non portato
+ </string>
+ <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>
+ <string name="create_new_shape">
+ Crea nuova figura corporea
+ </string>
+ <string name="create_new_skin">
+ Crea nuova pelle
+ </string>
+ <string name="create_new_hair">
+ Crea nuovi capelli
+ </string>
+ <string name="create_new_eyes">
+ Crea nuovi occhi
+ </string>
+ <string name="create_new_shirt">
+ Crea nuova camicia
+ </string>
+ <string name="create_new_pants">
+ Crea nuovi pantaloni
+ </string>
+ <string name="create_new_shoes">
+ Crea nuove scarpe
+ </string>
+ <string name="create_new_socks">
+ Crea nuove calze
+ </string>
+ <string name="create_new_jacket">
+ Crea nuova giacca
+ </string>
+ <string name="create_new_gloves">
+ Crea nuovi guanti
+ </string>
+ <string name="create_new_undershirt">
+ Crea nuova maglietta intima
+ </string>
+ <string name="create_new_underpants">
+ Crea nuovi slip
+ </string>
+ <string name="create_new_skirt">
+ Crea nuova gonna
+ </string>
+ <string name="create_new_alpha">
+ Crea nuovo Alpha
+ </string>
+ <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>
+ <string name="NewWearable">
+ Nuovo [WEARABLE_ITEM]
+ </string>
+ <string name="next">
+ Avanti
+ </string>
+ <string name="ok">
+ OK
+ </string>
+ <string name="GroupNotifyGroupNotice">
+ Avviso di gruppo
+ </string>
+ <string name="GroupNotifyGroupNotices">
+ Avvisi di gruppo
+ </string>
+ <string name="GroupNotifySentBy">
+ Inviato da
+ </string>
+ <string name="GroupNotifyAttached">
+ Allegato:
+ </string>
+ <string name="GroupNotifyViewPastNotices">
+ Visualizza gli avvisi precedenti o scegli qui di non riceverne.
+ </string>
+ <string name="GroupNotifyOpenAttachment">
+ Apri l&apos;allegato
+ </string>
+ <string name="GroupNotifySaveAttachment">
+ Salva l&apos;allegato
+ </string>
+ <string name="TeleportOffer">
+ Offerta di Teleport
+ </string>
+ <string name="StartUpNotifications">
+ Mentre eri assente sono arrivate nuove notifiche...
+ </string>
+ <string name="OverflowInfoChannelString">
+ Hai ancora [%d] notifiche
+ </string>
+ <string name="BodyPartsRightArm">
+ Braccio destro
+ </string>
+ <string name="BodyPartsHead">
+ Testa
+ </string>
+ <string name="BodyPartsLeftArm">
+ Braccio sinistro
+ </string>
+ <string name="BodyPartsLeftLeg">
+ Gamba sinistra
+ </string>
+ <string name="BodyPartsTorso">
+ Torace
+ </string>
+ <string name="BodyPartsRightLeg">
+ Gamba destra
+ </string>
+ <string name="GraphicsQualityLow">
+ Basso
+ </string>
+ <string name="GraphicsQualityMid">
+ Medio
+ </string>
+ <string name="GraphicsQualityHigh">
+ Alto
+ </string>
+ <string name="LeaveMouselook">
+ Premi ESC per tornare in visualizzazione normale
+ </string>
+ <string name="InventoryNoMatchingItems">
+ Non riesci a trovare quello che cerchi? Prova [secondlife:///app/search/all/[SEARCH_TERM] Cerca].
+ </string>
+ <string name="PlacesNoMatchingItems">
+ Non riesci a trovare quello che cerchi? Prova [secondlife:///app/search/places/[SEARCH_TERM] Cerca].
+ </string>
+ <string name="FavoritesNoMatchingItems">
+ Trascina qui un punto di riferimento per aggiungerlo ai Preferiti.
+ </string>
+ <string name="InventoryNoTexture">
+ Non hai una copia di questa texture nel tuo inventario
+ </string>
+ <string name="InventoryInboxNoItems">
+ Gli acquissti dal mercato verranno mostrati qui. Potrai quindi trascinarli nel tuo inventario per usarli.
+ </string>
+ <string name="MarketplaceURL">
+ https://marketplace.[MARKETPLACE_DOMAIN_NAME]/
+ </string>
+ <string name="MarketplaceURL_CreateStore">
+ http://community.secondlife.com/t5/English-Knowledge-Base/Selling-in-the-Marketplace/ta-p/700193#Section_.4
+ </string>
+ <string name="MarketplaceURL_Dashboard">
+ https://marketplace.[MARKETPLACE_DOMAIN_NAME]/merchants/store/dashboard
+ </string>
+ <string name="MarketplaceURL_Imports">
+ https://marketplace.[MARKETPLACE_DOMAIN_NAME]/merchants/store/imports
+ </string>
+ <string name="MarketplaceURL_LearnMore">
+ https://marketplace.[MARKETPLACE_DOMAIN_NAME]/learn_more
+ </string>
+ <string name="InventoryOutboxNotMerchantTitle">
+ Chiunque può vendere oggetti nel Marketplace.
+ </string>
+ <string name="InventoryOutboxNotMerchantTooltip"/>
+ <string name="InventoryOutboxNotMerchant">
+ Per diventare un venditore, devi [[MARKETPLACE_CREATE_STORE_URL] creare un negozio nel Marketplace].
+ </string>
+ <string name="InventoryOutboxNoItemsTitle">
+ La tua casella in uscita è vuota.
+ </string>
+ <string name="InventoryOutboxNoItemsTooltip"/>
+ <string name="InventoryOutboxNoItems">
+ Trascina le cartelle in questa area e clicca su &quot;Invia a Marketplace&quot; per metterle in vendita su [[MARKETPLACE_DASHBOARD_URL] Marketplace].
+ </string>
+ <string name="Marketplace Error None">
+ Nessun errore
+ </string>
+ <string name="Marketplace Error Not Merchant">
+ Errore: Prima di inviare elementi al Marketplace devi essere impostato come rivenditore (gratis).
+ </string>
+ <string name="Marketplace Error Empty Folder">
+ Errore: questa cartella non include alcun contenuto.
+ </string>
+ <string name="Marketplace Error Unassociated Products">
+ Errore: Oggetto non caricato perché il tuo account venditore ha troppi oggetti che non sono associati con dei prodotti. Per risolvere questo errore, esegui l&apos;accesso al sito di Marketplace e riduci il numero di oggetti non associati.
+ </string>
+ <string name="Marketplace Error Object Limit">
+ Errore: questo elemento contiene troppi oggetti. Per risolvere questo problema, inserisci più oggetti insieme in una scatola per ridurre a meno di 200 il numero totale di oggetti.
+ </string>
+ <string name="Marketplace Error Folder Depth">
+ Errore: questo elemento contiene troppi livelli di cartelle nidificate. Riorganizzalo per ottenere un massimo di 3 livelli di cartelle nidificate.
+ </string>
+ <string name="Marketplace Error Unsellable Item">
+ Errore: Questo elemento non può essere venduto nel Marketplace.
+ </string>
+ <string name="Marketplace Error Internal Import">
+ Errore: problema con questo elemento. Riprova più tardi.
+ </string>
+ <string name="Open landmarks">
+ Apri luoghi di riferimento
+ </string>
+ <string name="no_transfer" value="(nessun trasferimento)"/>
+ <string name="no_modify" value="(nessuna modifica)"/>
+ <string name="no_copy" value="(nessuna copia)"/>
+ <string name="worn" value="(indossato)"/>
+ <string name="link" value="(link)"/>
+ <string name="broken_link" value="(broken_link)&quot;"/>
+ <string name="LoadingContents">
+ Caricamento del contenuto...
+ </string>
+ <string name="NoContents">
+ Nessun contenuto
+ </string>
+ <string name="WornOnAttachmentPoint" value="(indossato su [ATTACHMENT_POINT])"/>
+ <string name="ActiveGesture" value="[GESLABEL] (attivo)"/>
+ <string name="Chat Message" value="Chat:"/>
+ <string name="Sound" value="Suono :"/>
+ <string name="Wait" value="--- Attendi :"/>
+ <string name="AnimFlagStop" value="Ferma l&apos;animazione :"/>
+ <string name="AnimFlagStart" value="Inizia l&apos;animazione :"/>
+ <string name="Wave" value="Saluta con la mano"/>
+ <string name="GestureActionNone" value="Nessuna"/>
+ <string name="HelloAvatar" value="Ciao, avatar!"/>
+ <string name="ViewAllGestures" value="Visualizza tutto &gt;&gt;"/>
+ <string name="GetMoreGestures" value="Altre &gt;&gt;"/>
+ <string name="Animations" value="Animazioni,"/>
+ <string name="Calling Cards" value="Biglietti da visita,"/>
+ <string name="Clothing" value="Vestiti,"/>
+ <string name="Gestures" value="Gesture,"/>
+ <string name="Landmarks" value="Punti di riferimento,"/>
+ <string name="Notecards" value="Biglietti,"/>
+ <string name="Objects" value="Oggetti,"/>
+ <string name="Scripts" value="Script,"/>
+ <string name="Sounds" value="Suoni,"/>
+ <string name="Textures" value="Texture,"/>
+ <string name="Snapshots" value="Fotografie,"/>
+ <string name="No Filters" value="No"/>
+ <string name="Since Logoff" value="- Dall&apos;uscita"/>
+ <string name="InvFolder My Inventory">
+ Il mio inventario
+ </string>
+ <string name="InvFolder Library">
+ Libreria
+ </string>
+ <string name="InvFolder Textures">
+ Texture
+ </string>
+ <string name="InvFolder Sounds">
+ Suoni
+ </string>
+ <string name="InvFolder Calling Cards">
+ Biglietti da visita
+ </string>
+ <string name="InvFolder Landmarks">
+ Punti di riferimento
+ </string>
+ <string name="InvFolder Scripts">
+ Script
+ </string>
+ <string name="InvFolder Clothing">
+ Vestiario
+ </string>
+ <string name="InvFolder Objects">
+ Oggetti
+ </string>
+ <string name="InvFolder Notecards">
+ Biglietti
+ </string>
+ <string name="InvFolder New Folder">
+ Nuova cartella
+ </string>
+ <string name="InvFolder Inventory">
+ Inventario
+ </string>
+ <string name="InvFolder Uncompressed Images">
+ Immagini non compresse
+ </string>
+ <string name="InvFolder Body Parts">
+ Parti del corpo
+ </string>
+ <string name="InvFolder Trash">
+ Cestino
+ </string>
+ <string name="InvFolder Photo Album">
+ Album fotografico
+ </string>
+ <string name="InvFolder Lost And Found">
+ Oggetti smarriti
+ </string>
+ <string name="InvFolder Uncompressed Sounds">
+ Suoni non compressi
+ </string>
+ <string name="InvFolder Animations">
+ Animazioni
+ </string>
+ <string name="InvFolder Gestures">
+ Gesture
+ </string>
+ <string name="InvFolder Favorite">
+ I miei preferiti
+ </string>
+ <string name="InvFolder favorite">
+ I miei preferiti
+ </string>
+ <string name="InvFolder Current Outfit">
+ Abbigliamento attuale
+ </string>
+ <string name="InvFolder Initial Outfits">
+ Vestiario iniziale
+ </string>
+ <string name="InvFolder My Outfits">
+ Il mio vestiario
+ </string>
+ <string name="InvFolder Accessories">
+ Accessori
+ </string>
+ <string name="InvFolder Meshes">
+ Reticoli
+ </string>
+ <string name="InvFolder Friends">
+ Amici
+ </string>
+ <string name="InvFolder All">
+ Tutto
+ </string>
+ <string name="no_attachments">
+ Nessun allegato indossato
+ </string>
+ <string name="Attachments remain">
+ Allegati ([COUNT] spazi restanti)
+ </string>
+ <string name="Buy">
+ Acquista
+ </string>
+ <string name="BuyforL$">
+ Acquista per L$
+ </string>
+ <string name="Stone">
+ Pietra
+ </string>
+ <string name="Metal">
+ Metallo
+ </string>
+ <string name="Glass">
+ Vetro
+ </string>
+ <string name="Wood">
+ Legno
+ </string>
+ <string name="Flesh">
+ Carne
+ </string>
+ <string name="Plastic">
+ Plastica
+ </string>
+ <string name="Rubber">
+ Gomma
+ </string>
+ <string name="Light">
+ Luce
+ </string>
+ <string name="KBShift">
+ Maiusc
+ </string>
+ <string name="KBCtrl">
+ Ctrl
+ </string>
+ <string name="Chest">
+ Petto
+ </string>
+ <string name="Skull">
+ Cranio
+ </string>
+ <string name="Left Shoulder">
+ Spalla sinistra
+ </string>
+ <string name="Right Shoulder">
+ Spalla destra
+ </string>
+ <string name="Left Hand">
+ Mano sinistra
+ </string>
+ <string name="Right Hand">
+ Mano destra
+ </string>
+ <string name="Left Foot">
+ Piede sinisto
+ </string>
+ <string name="Right Foot">
+ Piede destro
+ </string>
+ <string name="Spine">
+ Spina dorsale
+ </string>
+ <string name="Pelvis">
+ Pelvi
+ </string>
+ <string name="Mouth">
+ Bocca
+ </string>
+ <string name="Chin">
+ Mento
+ </string>
+ <string name="Left Ear">
+ Orecchio sinistro
+ </string>
+ <string name="Right Ear">
+ Orecchio destro
+ </string>
+ <string name="Left Eyeball">
+ Bulbo sinistro
+ </string>
+ <string name="Right Eyeball">
+ Bulbo destro
+ </string>
+ <string name="Nose">
+ Naso
+ </string>
+ <string name="R Upper Arm">
+ Avambraccio destro
+ </string>
+ <string name="R Forearm">
+ Braccio destro
+ </string>
+ <string name="L Upper Arm">
+ Avambraccio sinistro
+ </string>
+ <string name="L Forearm">
+ Braccio sinistro
+ </string>
+ <string name="Right Hip">
+ Anca destra
+ </string>
+ <string name="R Upper Leg">
+ Coscia destra
+ </string>
+ <string name="R Lower Leg">
+ Gamba destra
+ </string>
+ <string name="Left Hip">
+ Anca sinista
+ </string>
+ <string name="L Upper Leg">
+ Coscia sinistra
+ </string>
+ <string name="L Lower Leg">
+ Gamba sinistra
+ </string>
+ <string name="Stomach">
+ Stomaco
+ </string>
+ <string name="Left Pec">
+ Petto sinistro
+ </string>
+ <string name="Right Pec">
+ Petto destro
+ </string>
+ <string name="Neck">
+ Collo
+ </string>
+ <string name="Avatar Center">
+ Centro avatar
+ </string>
+ <string name="Invalid Attachment">
+ Punto di collegamento non valido
+ </string>
+ <string name="YearsMonthsOld">
+ Nato da [AGEYEARS] [AGEMONTHS]
+ </string>
+ <string name="YearsOld">
+ Nato da [AGEYEARS]
+ </string>
+ <string name="MonthsOld">
+ Nato da [AGEMONTHS]
+ </string>
+ <string name="WeeksOld">
+ Nato da [AGEWEEKS]
+ </string>
+ <string name="DaysOld">
+ Nato da [AGEDAYS]
+ </string>
+ <string name="TodayOld">
+ Iscritto oggi
+ </string>
+ <string name="AgeYearsA">
+ [COUNT] anno
+ </string>
+ <string name="AgeYearsB">
+ [COUNT] anni
+ </string>
+ <string name="AgeYearsC">
+ [COUNT] anni
+ </string>
+ <string name="AgeMonthsA">
+ [COUNT] mese
+ </string>
+ <string name="AgeMonthsB">
+ [COUNT] mesi
+ </string>
+ <string name="AgeMonthsC">
+ [COUNT] mesi
+ </string>
+ <string name="AgeWeeksA">
+ [COUNT] settimana
+ </string>
+ <string name="AgeWeeksB">
+ [COUNT] settimane
+ </string>
+ <string name="AgeWeeksC">
+ [COUNT] settimane
+ </string>
+ <string name="AgeDaysA">
+ [COUNT] giorno
+ </string>
+ <string name="AgeDaysB">
+ [COUNT] giorni
+ </string>
+ <string name="AgeDaysC">
+ [COUNT] giorni
+ </string>
+ <string name="GroupMembersA">
+ [COUNT] iscritto
+ </string>
+ <string name="GroupMembersB">
+ [COUNT] iscritti
+ </string>
+ <string name="GroupMembersC">
+ [COUNT] iscritti
+ </string>
+ <string name="AcctTypeResident">
+ Residente
+ </string>
+ <string name="AcctTypeTrial">
+ In prova
+ </string>
+ <string name="AcctTypeCharterMember">
+ Socio onorario
+ </string>
+ <string name="AcctTypeEmployee">
+ Dipendente Linden Lab
+ </string>
+ <string name="PaymentInfoUsed">
+ Informazioni di pagamento usate
+ </string>
+ <string name="PaymentInfoOnFile">
+ Informazioni di pagamento registrate
+ </string>
+ <string name="NoPaymentInfoOnFile">
+ Nessuna informazione di pagamento disponibile
+ </string>
+ <string name="AgeVerified">
+ Età verificata
+ </string>
+ <string name="NotAgeVerified">
+ Età non verificata
+ </string>
+ <string name="Center 2">
+ Centro 2
+ </string>
+ <string name="Top Right">
+ In alto a destra
+ </string>
+ <string name="Top">
+ in alto
+ </string>
+ <string name="Top Left">
+ In alto a sinistra
+ </string>
+ <string name="Center">
+ Al centro
+ </string>
+ <string name="Bottom Left">
+ In basso a sinistra
+ </string>
+ <string name="Bottom">
+ In basso
+ </string>
+ <string name="Bottom Right">
+ In basso a destra
+ </string>
+ <string name="CompileQueueDownloadedCompiling">
+ Scaricato, in compilazione
+ </string>
+ <string name="CompileQueueScriptNotFound">
+ Script non trovato sul server.
+ </string>
+ <string name="CompileQueueProblemDownloading">
+ Problema nel download
+ </string>
+ <string name="CompileQueueInsufficientPermDownload">
+ Permessi insufficenti per scaricare lo script.
+ </string>
+ <string name="CompileQueueInsufficientPermFor">
+ Permessi insufficenti per
+ </string>
+ <string name="CompileQueueUnknownFailure">
+ Errore di dowload sconosciuto
+ </string>
+ <string name="CompileQueueTitle">
+ Avanzamento ricompilazione
+ </string>
+ <string name="CompileQueueStart">
+ ricompila
+ </string>
+ <string name="ResetQueueTitle">
+ Azzera avanzamento
+ </string>
+ <string name="ResetQueueStart">
+ azzera
+ </string>
+ <string name="RunQueueTitle">
+ Attiva avanzamento
+ </string>
+ <string name="RunQueueStart">
+ attiva
+ </string>
+ <string name="NotRunQueueTitle">
+ Disattiva avanzamento
+ </string>
+ <string name="NotRunQueueStart">
+ disattiva
+ </string>
+ <string name="CompileSuccessful">
+ Compilazione riuscita!
+ </string>
+ <string name="CompileSuccessfulSaving">
+ Compilazione riuscita, in salvataggio...
+ </string>
+ <string name="SaveComplete">
+ Salvataggio completato.
+ </string>
+ <string name="ObjectOutOfRange">
+ Script (oggetto fuori portata)
+ </string>
+ <string name="GodToolsObjectOwnedBy">
+ Oggetto [OBJECT] di proprietà di [OWNER]
+ </string>
+ <string name="GroupsNone">
+ nessuno
+ </string>
+ <string name="Group" value="(gruppo)"/>
+ <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="GroupPlanningDate">
+ [mthnum,datetime,utc]/[day,datetime,utc]/[year,datetime,utc]
+ </string>
+ <string name="GroupIndividualShare" value="Gruppo Dividendi individuali"/>
+ <string name="GroupColumn" value="Gruppo"/>
+ <string name="Balance">
+ Saldo
+ </string>
+ <string name="Credits">
+ Ringraziamenti
+ </string>
+ <string name="Debits">
+ Debiti
+ </string>
+ <string name="Total">
+ Totale
+ </string>
+ <string name="NoGroupDataFound">
+ Nessun dato trovato per questo gruppo
+ </string>
+ <string name="IMParentEstate">
+ Proprietà principale
+ </string>
+ <string name="IMMainland">
+ continente
+ </string>
+ <string name="IMTeen">
+ teen
+ </string>
+ <string name="Anyone">
+ chiunque
+ </string>
+ <string name="RegionInfoError">
+ errore
+ </string>
+ <string name="RegionInfoAllEstatesOwnedBy">
+ tutte le proprietà immobiliari di [OWNER]
+ </string>
+ <string name="RegionInfoAllEstatesYouOwn">
+ tutte le tue proprietà immobiliari
+ </string>
+ <string name="RegionInfoAllEstatesYouManage">
+ tutte le proprietà immobiliari che gestisci per conto di [OWNER]
+ </string>
+ <string name="RegionInfoAllowedResidents">
+ Residenti consentiti: ([ALLOWEDAGENTS], massimo [MAXACCESS])
+ </string>
+ <string name="RegionInfoAllowedGroups">
+ Gruppi ammessi: ([ALLOWEDGROUPS], massimo [MAXACCESS])
+ </string>
+ <string name="ScriptLimitsParcelScriptMemory">
+ Memoria dello script del lotto
+ </string>
+ <string name="ScriptLimitsParcelsOwned">
+ Lotti in elenco: [PARCELS]
+ </string>
+ <string name="ScriptLimitsMemoryUsed">
+ Memoria utilizzata: [COUNT] kb di [MAX] kb; [AVAILABLE] kb disponibili
+ </string>
+ <string name="ScriptLimitsMemoryUsedSimple">
+ Memoria utilizzata: [COUNT] kb
+ </string>
+ <string name="ScriptLimitsParcelScriptURLs">
+ URL degli script lotti
+ </string>
+ <string name="ScriptLimitsURLsUsed">
+ URL utilizzati: [COUNT] di [MAX]; [AVAILABLE] disponibili
+ </string>
+ <string name="ScriptLimitsURLsUsedSimple">
+ URL utilizzati: [COUNT]
+ </string>
+ <string name="ScriptLimitsRequestError">
+ Errore nella richiesta di informazioni
+ </string>
+ <string name="ScriptLimitsRequestNoParcelSelected">
+ Nessun lotto selezionato
+ </string>
+ <string name="ScriptLimitsRequestWrongRegion">
+ Errore: le informazioni sullo script sono disponibili solo nella tua regione attuale
+ </string>
+ <string name="ScriptLimitsRequestWaiting">
+ Recupero informazioni in corso...
+ </string>
+ <string name="ScriptLimitsRequestDontOwnParcel">
+ Non hai il permesso di visionare questo lotto
+ </string>
+ <string name="SITTING_ON">
+ Seduto su
+ </string>
+ <string name="ATTACH_CHEST">
+ Petto
+ </string>
+ <string name="ATTACH_HEAD">
+ Testa
+ </string>
+ <string name="ATTACH_LSHOULDER">
+ Spalla sinistra
+ </string>
+ <string name="ATTACH_RSHOULDER">
+ Spalla destra
+ </string>
+ <string name="ATTACH_LHAND">
+ Mano sinistra
+ </string>
+ <string name="ATTACH_RHAND">
+ Mano destra
+ </string>
+ <string name="ATTACH_LFOOT">
+ Piede sinisto
+ </string>
+ <string name="ATTACH_RFOOT">
+ Piede destro
+ </string>
+ <string name="ATTACH_BACK">
+ Indietro
+ </string>
+ <string name="ATTACH_PELVIS">
+ Pelvi
+ </string>
+ <string name="ATTACH_MOUTH">
+ Bocca
+ </string>
+ <string name="ATTACH_CHIN">
+ Mento
+ </string>
+ <string name="ATTACH_LEAR">
+ Orecchio sinistro
+ </string>
+ <string name="ATTACH_REAR">
+ Orecchio destro
+ </string>
+ <string name="ATTACH_LEYE">
+ Occhio sinistro
+ </string>
+ <string name="ATTACH_REYE">
+ Occhio destro
+ </string>
+ <string name="ATTACH_NOSE">
+ Naso
+ </string>
+ <string name="ATTACH_RUARM">
+ Braccio destro
+ </string>
+ <string name="ATTACH_RLARM">
+ Avambraccio destro
+ </string>
+ <string name="ATTACH_LUARM">
+ Braccio sinistro
+ </string>
+ <string name="ATTACH_LLARM">
+ Avambraccio sinistro
+ </string>
+ <string name="ATTACH_RHIP">
+ Anca destra
+ </string>
+ <string name="ATTACH_RULEG">
+ Coscia destra
+ </string>
+ <string name="ATTACH_RLLEG">
+ Coscia destra
+ </string>
+ <string name="ATTACH_LHIP">
+ Anca sinista
+ </string>
+ <string name="ATTACH_LULEG">
+ Coscia sinistra
+ </string>
+ <string name="ATTACH_LLLEG">
+ Polpaccio sinistro
+ </string>
+ <string name="ATTACH_BELLY">
+ Addome
+ </string>
+ <string name="ATTACH_RPEC">
+ Petto destro
+ </string>
+ <string name="ATTACH_LPEC">
+ Petto sinistro
+ </string>
+ <string name="ATTACH_HUD_CENTER_2">
+ HUD in centro 2
+ </string>
+ <string name="ATTACH_HUD_TOP_RIGHT">
+ HUD alto a destra
+ </string>
+ <string name="ATTACH_HUD_TOP_CENTER">
+ HUD alto in centro
+ </string>
+ <string name="ATTACH_HUD_TOP_LEFT">
+ HUD alto a sinistra
+ </string>
+ <string name="ATTACH_HUD_CENTER_1">
+ HUD in centro 1
+ </string>
+ <string name="ATTACH_HUD_BOTTOM_LEFT">
+ HUD basso a sinistra
+ </string>
+ <string name="ATTACH_HUD_BOTTOM">
+ HUD basso
+ </string>
+ <string name="ATTACH_HUD_BOTTOM_RIGHT">
+ HUD basso a destra
+ </string>
+ <string name="CursorPos">
+ Riga [LINE], Colonna [COLUMN]
+ </string>
+ <string name="PanelDirCountFound">
+ [COUNT] trovato/i
+ </string>
+ <string name="PanelContentsTooltip">
+ Contenuto dell&apos;oggetto
+ </string>
+ <string name="PanelContentsNewScript">
+ Nuovo script
+ </string>
+ <string name="BusyModeResponseDefault">
+ Il residente al quale hai inviato un messaggio è in modalità &apos;occupato&apos;, ovvero ha chiesto di non essere disturbato. Il tuo messaggio comparirà nel suo pannello IM, dove potrà essere letto in un secondo momento.
+ </string>
+ <string name="MuteByName">
+ (In base al nome)
+ </string>
+ <string name="MuteAgent">
+ (Residente)
+ </string>
+ <string name="MuteObject">
+ (Oggetto)
+ </string>
+ <string name="MuteGroup">
+ (Gruppo)
+ </string>
+ <string name="MuteExternal">
+ (esterno)
+ </string>
+ <string name="RegionNoCovenant">
+ Non esiste alcun regolamento per questa proprietà.
+ </string>
+ <string name="RegionNoCovenantOtherOwner">
+ Non esiste alcun regolamento per questa proprietà. Il terreno di questa proprietà è messo in vendita dal proprietario, non dalla Linden Lab. Contatta il proprietario del terreno per i dettagli della vendita.
+ </string>
+ <string name="covenant_last_modified" value="Ultima modifica: "/>
+ <string name="none_text" value="(nessuno)"/>
+ <string name="never_text" value="(mai)"/>
+ <string name="GroupOwned">
+ Di proprietà di un gruppo
+ </string>
+ <string name="Public">
+ Pubblica
+ </string>
+ <string name="LocalSettings">
+ Impostazioni locali
+ </string>
+ <string name="RegionSettings">
+ Impostazioni regione
+ </string>
+ <string name="ClassifiedClicksTxt">
+ Clicca: [TELEPORT] teleport, [MAP] mappa, [PROFILE] profilo
+ </string>
+ <string name="ClassifiedUpdateAfterPublish">
+ (si aggiornerà dopo la pubblicazione)
+ </string>
+ <string name="NoPicksClassifiedsText">
+ Non hai creato luoghi preferiti né inserzioni. Clicca il pulsante + qui sotto per creare un luogo preferito o un&apos;inserzione.
+ </string>
+ <string name="NoAvatarPicksClassifiedsText">
+ L&apos;utente non ha luoghi preferiti né inserzioni
+ </string>
+ <string name="PicksClassifiedsLoadingText">
+ Caricamento in corso...
+ </string>
+ <string name="MultiPreviewTitle">
+ Anteprima
+ </string>
+ <string name="MultiPropertiesTitle">
+ Beni immobiliari
+ </string>
+ <string name="InvOfferAnObjectNamed">
+ Un oggetto denominato
+ </string>
+ <string name="InvOfferOwnedByGroup">
+ di proprietà del gruppo
+ </string>
+ <string name="InvOfferOwnedByUnknownGroup">
+ di proprietà di un gruppo sconosciuto
+ </string>
+ <string name="InvOfferOwnedBy">
+ di proprietà di
+ </string>
+ <string name="InvOfferOwnedByUnknownUser">
+ di proprietà di un utente sconosciuto
+ </string>
+ <string name="InvOfferGaveYou">
+ Ti ha offerto
+ </string>
+ <string name="InvOfferDecline">
+ Non hai accettato [DESC] da &lt;nolink&gt;[NAME]&lt;/nolink&gt;.
+ </string>
+ <string name="GroupMoneyTotal">
+ Totale
+ </string>
+ <string name="GroupMoneyBought">
+ comprato
+ </string>
+ <string name="GroupMoneyPaidYou">
+ ti ha pagato
+ </string>
+ <string name="GroupMoneyPaidInto">
+ ha pagato
+ </string>
+ <string name="GroupMoneyBoughtPassTo">
+ ha comprato il pass
+ </string>
+ <string name="GroupMoneyPaidFeeForEvent">
+ pagato la tassa per l&apos;evento
+ </string>
+ <string name="GroupMoneyPaidPrizeForEvent">
+ pagato il premio per l&apos;evento
+ </string>
+ <string name="GroupMoneyBalance">
+ Saldo
+ </string>
+ <string name="GroupMoneyCredits">
+ Ringraziamenti
+ </string>
+ <string name="GroupMoneyDebits">
+ Debiti
+ </string>
+ <string name="GroupMoneyDate">
+ [weekday,datetime,utc] [mth,datetime,utc] [day,datetime,utc], [year,datetime,utc]
+ </string>
+ <string name="ViewerObjectContents">
+ Contenuto
+ </string>
+ <string name="AcquiredItems">
+ Oggetti acquisiti
+ </string>
+ <string name="Cancel">
+ Annulla
+ </string>
+ <string name="UploadingCosts">
+ Il caricamento di [NAME] costa L$ [AMOUNT]
+ </string>
+ <string name="BuyingCosts">
+ L&apos;acquisto di [NAME] costa L$ [AMOUNT]
+ </string>
+ <string name="UnknownFileExtension">
+ Estensione del file sconosciuta [.%s]
+Tipi conosciuti .wav, .tga, .bmp, .jpg, .jpeg, or .bvh
+ </string>
+ <string name="MuteObject2">
+ Blocca
+ </string>
+ <string name="AddLandmarkNavBarMenu">
+ Aggiungi punto di riferimento...
+ </string>
+ <string name="EditLandmarkNavBarMenu">
+ Modifica punto di riferimento...
+ </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">
+ File salvato
+ </string>
+ <string name="Receiving">
+ In ricezione
+ </string>
+ <string name="AM">
+ antemeridiane
+ </string>
+ <string name="PM">
+ pomeridiane
+ </string>
+ <string name="PST">
+ Ora Pacifico
+ </string>
+ <string name="PDT">
+ Ora legale Pacifico
+ </string>
+ <string name="Direction_Forward">
+ Avanti
+ </string>
+ <string name="Direction_Left">
+ Sinistra
+ </string>
+ <string name="Direction_Right">
+ Destra
+ </string>
+ <string name="Direction_Back">
+ Indietro
+ </string>
+ <string name="Direction_North">
+ Nord
+ </string>
+ <string name="Direction_South">
+ Sud
+ </string>
+ <string name="Direction_West">
+ Ovest
+ </string>
+ <string name="Direction_East">
+ Est
+ </string>
+ <string name="Direction_Up">
+ Su
+ </string>
+ <string name="Direction_Down">
+ Giù
+ </string>
+ <string name="Any Category">
+ Qualsiasi categoria
+ </string>
+ <string name="Shopping">
+ Acquisti
+ </string>
+ <string name="Land Rental">
+ Affitto terreno
+ </string>
+ <string name="Property Rental">
+ Affitto proprietà
+ </string>
+ <string name="Special Attraction">
+ Attrazioni speciali
+ </string>
+ <string name="New Products">
+ Nuovi prodotti
+ </string>
+ <string name="Employment">
+ Lavoro
+ </string>
+ <string name="Wanted">
+ Cercasi
+ </string>
+ <string name="Service">
+ Servizio
+ </string>
+ <string name="Personal">
+ Personale
+ </string>
+ <string name="None">
+ Nessuno
+ </string>
+ <string name="Linden Location">
+ Luogo dei Linden
+ </string>
+ <string name="Adult">
+ Adult
+ </string>
+ <string name="Arts&amp;Culture">
+ Arte &amp; Cultura
+ </string>
+ <string name="Business">
+ Affari
+ </string>
+ <string name="Educational">
+ Educazione
+ </string>
+ <string name="Gaming">
+ Gioco
+ </string>
+ <string name="Hangout">
+ Divertimento
+ </string>
+ <string name="Newcomer Friendly">
+ Accoglienza nuovi residenti
+ </string>
+ <string name="Parks&amp;Nature">
+ Parchi &amp; Natura
+ </string>
+ <string name="Residential">
+ Residenziale
+ </string>
+ <string name="Stage">
+ Fase
+ </string>
+ <string name="Other">
+ Altro
+ </string>
+ <string name="Rental">
+ Affitto
+ </string>
+ <string name="Any">
+ Tutti
+ </string>
+ <string name="You">
+ Tu
+ </string>
+ <string name="Multiple Media">
+ Più supporti
+ </string>
+ <string name="Play Media">
+ Riproduci/Pausa supporto
+ </string>
+ <string name="MBCmdLineError">
+ Un errore è stato riscontrato analizzando la linea di comando.
+Per informazioni: http://wiki.secondlife.com/wiki/Client_parameters
+Errore:
+ </string>
+ <string name="MBCmdLineUsg">
+ Uso linea di comando del programma [APP_NAME] :
+ </string>
+ <string name="MBUnableToAccessFile">
+ Il programma [APP_NAME] non è in grado di accedere ad un file necessario.
+
+Potrebbe darsi che tu abbia copie multiple attivate o che il tuo sistema reputi erroneamente che il file sia già aperto.
+Se il problema persiste, riavvia il computer e riprova.
+Se il problema continua ancora, dovresti completamente disinstallare l&apos;applicazione [APP_NAME] e reinstallarla.
+ </string>
+ <string name="MBFatalError">
+ Errore critico
+ </string>
+ <string name="MBRequiresAltiVec">
+ Il programma [APP_NAME] richiede un processore con AltiVec (G4 o superiore).
+ </string>
+ <string name="MBAlreadyRunning">
+ Il programma [APP_NAME] è già attivo.
+Controlla che il programma non sia minimizzato nella tua barra degli strumenti.
+Se il messaggio persiste, riavvia il computer.
+ </string>
+ <string name="MBFrozenCrashed">
+ Sembra che [APP_NAME] si sia bloccata o interrotta nella sessione precedente.
+Vuoi mandare un crash report?
+ </string>
+ <string name="MBAlert">
+ Avviso
+ </string>
+ <string name="MBNoDirectX">
+ Il programmma [APP_NAME] non riesce a trovare una DirectX 9.0b o superiore.
+[APP_NAME] usa DirectX per rilevare hardware e/o i driver non aggiornati che possono causare problemi di stabilità, scarsa performance e interruzioni. Benché tu possa avviare il programma [APP_NAME] senza di esse, consigliamo caldamente l&apos;esecuzione con DirectX 9.0b.
+
+Vuoi continuare?
+ </string>
+ <string name="MBWarning">
+ Attenzione
+ </string>
+ <string name="MBNoAutoUpdate">
+ L&apos;aggiornamento automatico non è stato ancora realizzato per Linux.
+Consigliamo di scaricare l&apos;ultima versione direttamente da www.secondlife.com.
+ </string>
+ <string name="MBRegClassFailed">
+ RegisterClass non riuscito
+ </string>
+ <string name="MBError">
+ Errore
+ </string>
+ <string name="MBFullScreenErr">
+ Impossibile visualizzare a schermo intero con risoluzione [WIDTH] x [HEIGHT].
+Visualizzazione corrente in modalità finestra.
+ </string>
+ <string name="MBDestroyWinFailed">
+ Errore di arresto durante il tentativo di chiusura della finestra (DestroyWindow() non riuscito)
+ </string>
+ <string name="MBShutdownErr">
+ Errore di arresto
+ </string>
+ <string name="MBDevContextErr">
+ Impossibile caricare i driver GL
+ </string>
+ <string name="MBPixelFmtErr">
+ Impossibile trovare un formato pixel adatto
+ </string>
+ <string name="MBPixelFmtDescErr">
+ Impossibile ottenere una descrizione del formato pixel
+ </string>
+ <string name="MBTrueColorWindow">
+ [APP_NAME] richiede True Color (32 bit) per funzionare.
+Vai alle impostazioni dello schermo del tuo computer e imposta il colore in modalità 32 bit.
+ </string>
+ <string name="MBAlpha">
+ [APP_NAME] non funziona poichè è impossibile trovare un canale alpha a 8 bit. Questo problema normalmente deriva dai driver della scheda video.
+Assicurati di avere installato i driver della scheda video più recenti.
+Assicurati anche che il monitor sia impostato a True Color (32 bit) nel Pannello di controllo &gt; Schermo &gt; Impostazioni.
+Se il messaggio persiste, contatta [SUPPORT_SITE].
+ </string>
+ <string name="MBPixelFmtSetErr">
+ Impossibile impostare il formato pixel
+ </string>
+ <string name="MBGLContextErr">
+ Impossibile creare il GL rendering
+ </string>
+ <string name="MBGLContextActErr">
+ Impossibile attivare il GL rendering
+ </string>
+ <string name="MBVideoDrvErr">
+ [APP_NAME] Non riesce ad avviarsi perchè i driver della tua scheda video non sono stati installati correttamente, non sono aggiornati, o sono per un hardware non supportato. Assicurati di avere i driver della scheda video più recenti e anche se li hai installati, prova a installarli di nuovo.
+
+Se il messaggio persiste, contatta [SUPPORT_SITE].
+ </string>
+ <string name="5 O&apos;Clock Shadow">
+ Barba leggera
+ </string>
+ <string name="All White">
+ Tutti bianchi
+ </string>
+ <string name="Anime Eyes">
+ Occhi grandi
+ </string>
+ <string name="Arced">
+ Arcuato
+ </string>
+ <string name="Arm Length">
+ Lunghezza braccia
+ </string>
+ <string name="Attached">
+ Attaccato
+ </string>
+ <string name="Attached Earlobes">
+ Lobi attaccati
+ </string>
+ <string name="Back Fringe">
+ Frangetta all&apos;indietro
+ </string>
+ <string name="Baggy">
+ Larghi
+ </string>
+ <string name="Bangs">
+ Frange
+ </string>
+ <string name="Beady Eyes">
+ Occhi piccoli
+ </string>
+ <string name="Belly Size">
+ Punto vita
+ </string>
+ <string name="Big">
+ Grande
+ </string>
+ <string name="Big Butt">
+ Sedere grande
+ </string>
+ <string name="Big Hair Back">
+ Capigliatura grande: Indietro
+ </string>
+ <string name="Big Hair Front">
+ Capigliatura grande: anteriore
+ </string>
+ <string name="Big Hair Top">
+ Capigliatura grande: in alto
+ </string>
+ <string name="Big Head">
+ Grande testa
+ </string>
+ <string name="Big Pectorals">
+ Grandi pettorali
+ </string>
+ <string name="Big Spikes">
+ Capelli con punte
+ </string>
+ <string name="Black">
+ Nero
+ </string>
+ <string name="Blonde">
+ Biondo
+ </string>
+ <string name="Blonde Hair">
+ Capelli biondi
+ </string>
+ <string name="Blush">
+ Fard
+ </string>
+ <string name="Blush Color">
+ Colore fard
+ </string>
+ <string name="Blush Opacity">
+ Opacità fard
+ </string>
+ <string name="Body Definition">
+ Definizione muscolare
+ </string>
+ <string name="Body Fat">
+ Grasso corporeo
+ </string>
+ <string name="Body Freckles">
+ Lentiggini e nei
+ </string>
+ <string name="Body Thick">
+ Corpo più robusto
+ </string>
+ <string name="Body Thickness">
+ Robustezza del corpo
+ </string>
+ <string name="Body Thin">
+ Corpo più magro
+ </string>
+ <string name="Bow Legged">
+ Gambe arcuate
+ </string>
+ <string name="Breast Buoyancy">
+ Altezza del seno
+ </string>
+ <string name="Breast Cleavage">
+ Décolleté
+ </string>
+ <string name="Breast Size">
+ Grandezza del seno
+ </string>
+ <string name="Bridge Width">
+ Larghezza setto
+ </string>
+ <string name="Broad">
+ Largo
+ </string>
+ <string name="Brow Size">
+ Grandezza delle sopracciglia
+ </string>
+ <string name="Bug Eyes">
+ Occhi sporgenti
+ </string>
+ <string name="Bugged Eyes">
+ Occhi sporgenti
+ </string>
+ <string name="Bulbous">
+ Bulboso
+ </string>
+ <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>
+ <string name="Bushy Hair">
+ Capelli a cespuglio
+ </string>
+ <string name="Butt Size">
+ Grandezza del sedere
+ </string>
+ <string name="Butt Gravity">
+ Gravità natiche
+ </string>
+ <string name="bustle skirt">
+ Crinolina
+ </string>
+ <string name="no bustle">
+ Nessuna crinolina
+ </string>
+ <string name="more bustle">
+ Più crinolina
+ </string>
+ <string name="Chaplin">
+ Baffetti
+ </string>
+ <string name="Cheek Bones">
+ Zigomi
+ </string>
+ <string name="Chest Size">
+ Ampiezza del torace
+ </string>
+ <string name="Chin Angle">
+ Angolo del mento
+ </string>
+ <string name="Chin Cleft">
+ Fossetta sul mento
+ </string>
+ <string name="Chin Curtains">
+ Barba sottomento
+ </string>
+ <string name="Chin Depth">
+ Profondità mento
+ </string>
+ <string name="Chin Heavy">
+ Mento forte
+ </string>
+ <string name="Chin In">
+ Mento in dentro
+ </string>
+ <string name="Chin Out">
+ Mento sporgente
+ </string>
+ <string name="Chin-Neck">
+ Mento-collo
+ </string>
+ <string name="Clear">
+ Trasparente
+ </string>
+ <string name="Cleft">
+ Fossetta
+ </string>
+ <string name="Close Set Eyes">
+ Occhi ravvicinati
+ </string>
+ <string name="Closed">
+ Chiusa
+ </string>
+ <string name="Closed Back">
+ Chiuso dietro
+ </string>
+ <string name="Closed Front">
+ Chiuso davanti
+ </string>
+ <string name="Closed Left">
+ Chiuso sinistra
+ </string>
+ <string name="Closed Right">
+ Chiuso destra
+ </string>
+ <string name="Coin Purse">
+ Meno pronunciati
+ </string>
+ <string name="Collar Back">
+ Colletto posteriore
+ </string>
+ <string name="Collar Front">
+ Colletto anteriore
+ </string>
+ <string name="Corner Down">
+ Angolo all&apos;ingiù
+ </string>
+ <string name="Corner Up">
+ Angolo all&apos;insù
+ </string>
+ <string name="Creased">
+ Piega
+ </string>
+ <string name="Crooked Nose">
+ Naso storto
+ </string>
+ <string name="Cuff Flare">
+ Svasato con risvolto
+ </string>
+ <string name="Dark">
+ Scuro
+ </string>
+ <string name="Dark Green">
+ Verde scuro
+ </string>
+ <string name="Darker">
+ Più scuro
+ </string>
+ <string name="Deep">
+ Profondo
+ </string>
+ <string name="Default Heels">
+ Tacchi standard
+ </string>
+ <string name="Dense">
+ Folti
+ </string>
+ <string name="Double Chin">
+ Doppio mento
+ </string>
+ <string name="Downturned">
+ All&apos;ingiù
+ </string>
+ <string name="Duffle Bag">
+ Più pronunciati
+ </string>
+ <string name="Ear Angle">
+ Angolo orecchie
+ </string>
+ <string name="Ear Size">
+ Grandezza orecchie
+ </string>
+ <string name="Ear Tips">
+ Estremità orecchie
+ </string>
+ <string name="Egg Head">
+ Ovalizzazione testa
+ </string>
+ <string name="Eye Bags">
+ Occhiaie
+ </string>
+ <string name="Eye Color">
+ Colore degli occhi
+ </string>
+ <string name="Eye Depth">
+ Profondità degli occhi
+ </string>
+ <string name="Eye Lightness">
+ Luminosità degli occhi
+ </string>
+ <string name="Eye Opening">
+ Apertura degli occhi
+ </string>
+ <string name="Eye Pop">
+ Prominenza degli occhi
+ </string>
+ <string name="Eye Size">
+ Grandezza occhi
+ </string>
+ <string name="Eye Spacing">
+ Distanza occhi
+ </string>
+ <string name="Eyebrow Arc">
+ Arco delle sopracciglia
+ </string>
+ <string name="Eyebrow Density">
+ Densità delle sopracciglia
+ </string>
+ <string name="Eyebrow Height">
+ Altezza delle sopracciglia
+ </string>
+ <string name="Eyebrow Points">
+ Sopracciglia appuntite
+ </string>
+ <string name="Eyebrow Size">
+ Grandezza sopracciglia
+ </string>
+ <string name="Eyelash Length">
+ Lunghezza delle ciglia
+ </string>
+ <string name="Eyeliner">
+ Eyeliner
+ </string>
+ <string name="Eyeliner Color">
+ Colore dell&apos;eyeliner
+ </string>
+ <string name="Eyes Bugged">
+ Occhi sporgenti
+ </string>
+ <string name="Face Shear">
+ Taglio del viso
+ </string>
+ <string name="Facial Definition">
+ Definizione del viso
+ </string>
+ <string name="Far Set Eyes">
+ Occhi distanti
+ </string>
+ <string name="Fat Lips">
+ Labbra carnose
+ </string>
+ <string name="Female">
+ Femmina
+ </string>
+ <string name="Fingerless">
+ Senza dita
+ </string>
+ <string name="Fingers">
+ Dita
+ </string>
+ <string name="Flared Cuffs">
+ Risvolti svasati
+ </string>
+ <string name="Flat">
+ Piatto
+ </string>
+ <string name="Flat Butt">
+ Sedere piatto
+ </string>
+ <string name="Flat Head">
+ Testa piatta
+ </string>
+ <string name="Flat Toe">
+ Punta piatta
+ </string>
+ <string name="Foot Size">
+ Misura piede
+ </string>
+ <string name="Forehead Angle">
+ Angolo della fronte
+ </string>
+ <string name="Forehead Heavy">
+ Fronte sporgente
+ </string>
+ <string name="Freckles">
+ Lentiggini
+ </string>
+ <string name="Front Fringe">
+ Frangetta
+ </string>
+ <string name="Full Back">
+ Dietro gonfi
+ </string>
+ <string name="Full Eyeliner">
+ Eyeliner marcato
+ </string>
+ <string name="Full Front">
+ Anteriore gonfio
+ </string>
+ <string name="Full Hair Sides">
+ Lati capelli gonfi
+ </string>
+ <string name="Full Sides">
+ Lati gonfi
+ </string>
+ <string name="Glossy">
+ Lucido
+ </string>
+ <string name="Glove Fingers">
+ Dita con guanti
+ </string>
+ <string name="Glove Length">
+ Lunghezza guanti
+ </string>
+ <string name="Hair">
+ Capigliature
+ </string>
+ <string name="Hair Back">
+ Capelli: Indietro
+ </string>
+ <string name="Hair Front">
+ Capelli: anteriore
+ </string>
+ <string name="Hair Sides">
+ Capelli: lati
+ </string>
+ <string name="Hair Sweep">
+ Direzione capigliatura
+ </string>
+ <string name="Hair Thickess">
+ Foltezza
+ </string>
+ <string name="Hair Thickness">
+ Foltezza
+ </string>
+ <string name="Hair Tilt">
+ Inclinazione
+ </string>
+ <string name="Hair Tilted Left">
+ Verso sinistra
+ </string>
+ <string name="Hair Tilted Right">
+ Verso destra
+ </string>
+ <string name="Hair Volume">
+ Capelli: Volume
+ </string>
+ <string name="Hand Size">
+ Grandezza mani
+ </string>
+ <string name="Handlebars">
+ Baffi a manubrio
+ </string>
+ <string name="Head Length">
+ Lunghezza testa
+ </string>
+ <string name="Head Shape">
+ Forma della testa
+ </string>
+ <string name="Head Size">
+ Grandezza della testa
+ </string>
+ <string name="Head Stretch">
+ Allungamento testa
+ </string>
+ <string name="Heel Height">
+ Altezza tacchi
+ </string>
+ <string name="Heel Shape">
+ Forma tacchi
+ </string>
+ <string name="Height">
+ Altezza
+ </string>
+ <string name="High">
+ Alto
+ </string>
+ <string name="High Heels">
+ Tacchi alti
+ </string>
+ <string name="High Jaw">
+ Mandibola alta
+ </string>
+ <string name="High Platforms">
+ Alta
+ </string>
+ <string name="High and Tight">
+ Alto e stretto
+ </string>
+ <string name="Higher">
+ Più alto
+ </string>
+ <string name="Hip Length">
+ Altezza bacino
+ </string>
+ <string name="Hip Width">
+ Larghezza bacino
+ </string>
+ <string name="In">
+ Dentro
+ </string>
+ <string name="In Shdw Color">
+ Colore ombretto interno
+ </string>
+ <string name="In Shdw Opacity">
+ Opacità ombretto interno
+ </string>
+ <string name="Inner Eye Corner">
+ Angolo interno
+ </string>
+ <string name="Inner Eye Shadow">
+ Ombretto interno
+ </string>
+ <string name="Inner Shadow">
+ Ombretto interno
+ </string>
+ <string name="Jacket Length">
+ Lunghezza giacca
+ </string>
+ <string name="Jacket Wrinkles">
+ Grinze della giacca
+ </string>
+ <string name="Jaw Angle">
+ Angolo mandibola
+ </string>
+ <string name="Jaw Jut">
+ Prognatismo mento
+ </string>
+ <string name="Jaw Shape">
+ Forma del mento
+ </string>
+ <string name="Join">
+ Iscriviti
+ </string>
+ <string name="Jowls">
+ Guance
+ </string>
+ <string name="Knee Angle">
+ Angolo ginocchia
+ </string>
+ <string name="Knock Kneed">
+ Gambe ad X
+ </string>
+ <string name="Large">
+ Grande
+ </string>
+ <string name="Large Hands">
+ Mani grandi
+ </string>
+ <string name="Left Part">
+ Riga a sinistra
+ </string>
+ <string name="Leg Length">
+ Lunghezza gambe
+ </string>
+ <string name="Leg Muscles">
+ Muscoli gambe
+ </string>
+ <string name="Less">
+ Meno
+ </string>
+ <string name="Less Body Fat">
+ Meno grasso corporeo
+ </string>
+ <string name="Less Curtains">
+ Meno
+ </string>
+ <string name="Less Freckles">
+ Meno lentiggini
+ </string>
+ <string name="Less Full">
+ Meno piene
+ </string>
+ <string name="Less Gravity">
+ Più alto
+ </string>
+ <string name="Less Love">
+ Meno maniglie
+ </string>
+ <string name="Less Muscles">
+ Meno muscoli
+ </string>
+ <string name="Less Muscular">
+ Meno muscolari
+ </string>
+ <string name="Less Rosy">
+ Meno rosato
+ </string>
+ <string name="Less Round">
+ Meno rotondo
+ </string>
+ <string name="Less Saddle">
+ Meno a sella
+ </string>
+ <string name="Less Square">
+ Meno quadrato
+ </string>
+ <string name="Less Volume">
+ Meno volume
+ </string>
+ <string name="Less soul">
+ Meno
+ </string>
+ <string name="Lighter">
+ Più leggero
+ </string>
+ <string name="Lip Cleft">
+ Distanza fossetta labbro
+ </string>
+ <string name="Lip Cleft Depth">
+ Prof. fossetta labbro
+ </string>
+ <string name="Lip Fullness">
+ Volume labbra
+ </string>
+ <string name="Lip Pinkness">
+ Tonalità rosa labbra
+ </string>
+ <string name="Lip Ratio">
+ Proporzione labbra
+ </string>
+ <string name="Lip Thickness">
+ Carnosità labbra
+ </string>
+ <string name="Lip Width">
+ Larghezza labbra
+ </string>
+ <string name="Lipgloss">
+ Lipgloss
+ </string>
+ <string name="Lipstick">
+ Rossetto
+ </string>
+ <string name="Lipstick Color">
+ Colore rossetto
+ </string>
+ <string name="Long">
+ Lungo
+ </string>
+ <string name="Long Head">
+ Testa lunga
+ </string>
+ <string name="Long Hips">
+ Bacino alto
+ </string>
+ <string name="Long Legs">
+ Gambe lunghe
+ </string>
+ <string name="Long Neck">
+ Collo lungo
+ </string>
+ <string name="Long Pigtails">
+ Codini lunghi
+ </string>
+ <string name="Long Ponytail">
+ Codino lungo
+ </string>
+ <string name="Long Torso">
+ Torace lungo
+ </string>
+ <string name="Long arms">
+ Braccia lunghe
+ </string>
+ <string name="Loose Pants">
+ Pantaloni ampi
+ </string>
+ <string name="Loose Shirt">
+ Camicia ampia
+ </string>
+ <string name="Loose Sleeves">
+ Maniche non attillate
+ </string>
+ <string name="Love Handles">
+ Maniglie dell&apos;amore
+ </string>
+ <string name="Low">
+ Basso
+ </string>
+ <string name="Low Heels">
+ Tacchi bassi
+ </string>
+ <string name="Low Jaw">
+ Mandibola bassa
+ </string>
+ <string name="Low Platforms">
+ Bassa
+ </string>
+ <string name="Low and Loose">
+ Basso e ampio
+ </string>
+ <string name="Lower">
+ Più basso
+ </string>
+ <string name="Lower Bridge">
+ Parte bassa del setto
+ </string>
+ <string name="Lower Cheeks">
+ Guance inferiori
+ </string>
+ <string name="Male">
+ Maschio
+ </string>
+ <string name="Middle Part">
+ Riga nel mezzo
+ </string>
+ <string name="More">
+ Altro
+ </string>
+ <string name="More Blush">
+ Più fard
+ </string>
+ <string name="More Body Fat">
+ Più grasso corporeo
+ </string>
+ <string name="More Curtains">
+ Più
+ </string>
+ <string name="More Eyeshadow">
+ Più ombretto
+ </string>
+ <string name="More Freckles">
+ Più lentiggini
+ </string>
+ <string name="More Full">
+ Più piene
+ </string>
+ <string name="More Gravity">
+ Più calato
+ </string>
+ <string name="More Lipstick">
+ Più rossetto
+ </string>
+ <string name="More Love">
+ Più maniglie
+ </string>
+ <string name="More Lower Lip">
+ Labbro inf. pronunciato
+ </string>
+ <string name="More Muscles">
+ Più muscoli
+ </string>
+ <string name="More Muscular">
+ Più muscolatura
+ </string>
+ <string name="More Rosy">
+ Più rosato
+ </string>
+ <string name="More Round">
+ Più rotondo
+ </string>
+ <string name="More Saddle">
+ Più a sella
+ </string>
+ <string name="More Sloped">
+ Più orizzontale
+ </string>
+ <string name="More Square">
+ Più quadrato
+ </string>
+ <string name="More Upper Lip">
+ Labbro sup. pronunciato
+ </string>
+ <string name="More Vertical">
+ Più verticale
+ </string>
+ <string name="More Volume">
+ Più volume
+ </string>
+ <string name="More soul">
+ Più
+ </string>
+ <string name="Moustache">
+ Baffi
+ </string>
+ <string name="Mouth Corner">
+ Angolo della bocca
+ </string>
+ <string name="Mouth Position">
+ Posizione della bocca
+ </string>
+ <string name="Mowhawk">
+ Moicana
+ </string>
+ <string name="Muscular">
+ Muscolatura
+ </string>
+ <string name="Mutton Chops">
+ Basette lunghe
+ </string>
+ <string name="Nail Polish">
+ Smalto
+ </string>
+ <string name="Nail Polish Color">
+ Colore smalto
+ </string>
+ <string name="Narrow">
+ Socchiusi
+ </string>
+ <string name="Narrow Back">
+ Laterali post. vicini
+ </string>
+ <string name="Narrow Front">
+ Laterali ant. vicini
+ </string>
+ <string name="Narrow Lips">
+ Labbra strette
+ </string>
+ <string name="Natural">
+ Naturale
+ </string>
+ <string name="Neck Length">
+ Lunghezza del collo
+ </string>
+ <string name="Neck Thickness">
+ Grandezza del collo
+ </string>
+ <string name="No Blush">
+ Senza fard
+ </string>
+ <string name="No Eyeliner">
+ Senza eyeliner
+ </string>
+ <string name="No Eyeshadow">
+ Senza ombretto
+ </string>
+ <string name="No Lipgloss">
+ Senza lipgloss
+ </string>
+ <string name="No Lipstick">
+ Senza rossetto
+ </string>
+ <string name="No Part">
+ Senza riga
+ </string>
+ <string name="No Polish">
+ Senza smalto
+ </string>
+ <string name="No Red">
+ Senza rosso
+ </string>
+ <string name="No Spikes">
+ Senza punte
+ </string>
+ <string name="No White">
+ Senza bianco
+ </string>
+ <string name="No Wrinkles">
+ Senza pieghe
+ </string>
+ <string name="Normal Lower">
+ Inferiore normale
+ </string>
+ <string name="Normal Upper">
+ Superiore normale
+ </string>
+ <string name="Nose Left">
+ Naso a sinistra
+ </string>
+ <string name="Nose Right">
+ Naso a destra
+ </string>
+ <string name="Nose Size">
+ Grandezza naso
+ </string>
+ <string name="Nose Thickness">
+ Spessore naso
+ </string>
+ <string name="Nose Tip Angle">
+ Angolo punta naso
+ </string>
+ <string name="Nose Tip Shape">
+ Forma punta naso
+ </string>
+ <string name="Nose Width">
+ Larghezza naso
+ </string>
+ <string name="Nostril Division">
+ Divisione narici
+ </string>
+ <string name="Nostril Width">
+ Larghezza narici
+ </string>
+ <string name="Opaque">
+ Opaco
+ </string>
+ <string name="Open">
+ Apri
+ </string>
+ <string name="Open Back">
+ Retro aperto
+ </string>
+ <string name="Open Front">
+ Davanti aperto
+ </string>
+ <string name="Open Left">
+ Lato sin. aperto
+ </string>
+ <string name="Open Right">
+ Lato des. aperto
+ </string>
+ <string name="Orange">
+ Arancio
+ </string>
+ <string name="Out">
+ Fuori
+ </string>
+ <string name="Out Shdw Color">
+ Colore ombretto esterno
+ </string>
+ <string name="Out Shdw Opacity">
+ Opacità ombretto esterno
+ </string>
+ <string name="Outer Eye Corner">
+ Angolo esterno occhio
+ </string>
+ <string name="Outer Eye Shadow">
+ Ombretto esterno
+ </string>
+ <string name="Outer Shadow">
+ Ombreggiatura esterna
+ </string>
+ <string name="Overbite">
+ Denti sup. in fuori
+ </string>
+ <string name="Package">
+ Genitali
+ </string>
+ <string name="Painted Nails">
+ Unghie smaltate
+ </string>
+ <string name="Pale">
+ Pallido
+ </string>
+ <string name="Pants Crotch">
+ Cavallo
+ </string>
+ <string name="Pants Fit">
+ Vestibilità pantaloni
+ </string>
+ <string name="Pants Length">
+ Lunghezza pantaloni
+ </string>
+ <string name="Pants Waist">
+ Taglia pantalone
+ </string>
+ <string name="Pants Wrinkles">
+ Pantaloni con le grinze
+ </string>
+ <string name="Part">
+ Con riga
+ </string>
+ <string name="Part Bangs">
+ Frangetta divisa
+ </string>
+ <string name="Pectorals">
+ Pettorali
+ </string>
+ <string name="Pigment">
+ Pigmento
+ </string>
+ <string name="Pigtails">
+ Codini
+ </string>
+ <string name="Pink">
+ Rosa
+ </string>
+ <string name="Pinker">
+ Più rosato
+ </string>
+ <string name="Platform Height">
+ Altezza pianta
+ </string>
+ <string name="Platform Width">
+ Larghezza pianta
+ </string>
+ <string name="Pointy">
+ Appuntito
+ </string>
+ <string name="Pointy Heels">
+ Tacchi a spillo
+ </string>
+ <string name="Ponytail">
+ Codino
+ </string>
+ <string name="Poofy Skirt">
+ Gonna gonfia
+ </string>
+ <string name="Pop Left Eye">
+ Sinistro più aperto
+ </string>
+ <string name="Pop Right Eye">
+ Destro più aperto
+ </string>
+ <string name="Puffy">
+ Paffute
+ </string>
+ <string name="Puffy Eyelids">
+ Palpebre gonfie
+ </string>
+ <string name="Rainbow Color">
+ Tonalità
+ </string>
+ <string name="Red Hair">
+ Presenza di rosso nei capelli
+ </string>
+ <string name="Regular">
+ Normale
+ </string>
+ <string name="Right Part">
+ Riga a destra
+ </string>
+ <string name="Rosy Complexion">
+ Incarnato
+ </string>
+ <string name="Round">
+ Rotondo
+ </string>
+ <string name="Ruddiness">
+ Rossore
+ </string>
+ <string name="Ruddy">
+ Rosse
+ </string>
+ <string name="Rumpled Hair">
+ Capelli mossi
+ </string>
+ <string name="Saddle Bags">
+ Rotondità fianchi
+ </string>
+ <string name="Scrawny Leg">
+ Gambe magre
+ </string>
+ <string name="Separate">
+ Separati
+ </string>
+ <string name="Shallow">
+ Meno pronunciato
+ </string>
+ <string name="Shear Back">
+ Taglio posteriore
+ </string>
+ <string name="Shear Face">
+ Taglio del viso
+ </string>
+ <string name="Shear Front">
+ Taglio anteriore
+ </string>
+ <string name="Shear Left Up">
+ Distorto a sinistra
+ </string>
+ <string name="Shear Right Up">
+ Distorto a destra
+ </string>
+ <string name="Sheared Back">
+ Taglio verso dietro
+ </string>
+ <string name="Sheared Front">
+ Taglio verso davanti
+ </string>
+ <string name="Shift Left">
+ A sinistra
+ </string>
+ <string name="Shift Mouth">
+ Spostamento bocca
+ </string>
+ <string name="Shift Right">
+ A destra
+ </string>
+ <string name="Shirt Bottom">
+ Parte inferiore camicia
+ </string>
+ <string name="Shirt Fit">
+ Vestibilità camicia
+ </string>
+ <string name="Shirt Wrinkles">
+ Camicia con le grinze
+ </string>
+ <string name="Shoe Height">
+ Altezza scarpe
+ </string>
+ <string name="Short">
+ Basso
+ </string>
+ <string name="Short Arms">
+ Braccia corte
+ </string>
+ <string name="Short Legs">
+ Gambe corte
+ </string>
+ <string name="Short Neck">
+ Collo corto
+ </string>
+ <string name="Short Pigtails">
+ Codini corti
+ </string>
+ <string name="Short Ponytail">
+ Codino corto
+ </string>
+ <string name="Short Sideburns">
+ Basette corte
+ </string>
+ <string name="Short Torso">
+ Torace corto
+ </string>
+ <string name="Short hips">
+ Bacino corto
+ </string>
+ <string name="Shoulders">
+ Spalle
+ </string>
+ <string name="Side Fringe">
+ Ciuffi laterali
+ </string>
+ <string name="Sideburns">
+ Basette
+ </string>
+ <string name="Sides Hair">
+ Capigliatura di lato
+ </string>
+ <string name="Sides Hair Down">
+ Capigliatura di lato sciolta
+ </string>
+ <string name="Sides Hair Up">
+ Capigliatura di lato raccolta
+ </string>
+ <string name="Skinny Neck">
+ Collo fino
+ </string>
+ <string name="Skirt Fit">
+ Vestibilità gonna
+ </string>
+ <string name="Skirt Length">
+ Lunghezza gonna
+ </string>
+ <string name="Slanted Forehead">
+ Fronte inclinata
+ </string>
+ <string name="Sleeve Length">
+ Lunghezza maniche
+ </string>
+ <string name="Sleeve Looseness">
+ Morbidezza maniche
+ </string>
+ <string name="Slit Back">
+ Spacco: Indietro
+ </string>
+ <string name="Slit Front">
+ Spacco: anteriore
+ </string>
+ <string name="Slit Left">
+ Spacco: Sinistra
+ </string>
+ <string name="Slit Right">
+ Spacco: Destra
+ </string>
+ <string name="Small">
+ Piccola
+ </string>
+ <string name="Small Hands">
+ Mani piccole
+ </string>
+ <string name="Small Head">
+ Testa piccola
+ </string>
+ <string name="Smooth">
+ Liscio
+ </string>
+ <string name="Smooth Hair">
+ Capelli lisci
+ </string>
+ <string name="Socks Length">
+ Lunghezza calze
+ </string>
+ <string name="Soulpatch">
+ Pizzetto labbro inferiore
+ </string>
+ <string name="Sparse">
+ Piu rade
+ </string>
+ <string name="Spiked Hair">
+ Capelli a punta
+ </string>
+ <string name="Square">
+ Quadrato
+ </string>
+ <string name="Square Toe">
+ Punta quadrata
+ </string>
+ <string name="Squash Head">
+ Testa schiacciata
+ </string>
+ <string name="Stretch Head">
+ Testa allungata
+ </string>
+ <string name="Sunken">
+ Scarne
+ </string>
+ <string name="Sunken Chest">
+ Senza pettorali
+ </string>
+ <string name="Sunken Eyes">
+ Occhi infossati
+ </string>
+ <string name="Sweep Back">
+ Indietro
+ </string>
+ <string name="Sweep Forward">
+ Avanti
+ </string>
+ <string name="Tall">
+ Alto
+ </string>
+ <string name="Taper Back">
+ Ravv. lat. posteriore
+ </string>
+ <string name="Taper Front">
+ Ravv. lat. frontale
+ </string>
+ <string name="Thick Heels">
+ Tacchi spessi
+ </string>
+ <string name="Thick Neck">
+ Collo grosso
+ </string>
+ <string name="Thick Toe">
+ Punta spessa
+ </string>
+ <string name="Thin">
+ Sottili
+ </string>
+ <string name="Thin Eyebrows">
+ Sopracciglia sottili
+ </string>
+ <string name="Thin Lips">
+ Labbra sottili
+ </string>
+ <string name="Thin Nose">
+ Naso sottile
+ </string>
+ <string name="Tight Chin">
+ Mento stretto
+ </string>
+ <string name="Tight Cuffs">
+ Fondo stretto
+ </string>
+ <string name="Tight Pants">
+ Pantaloni attillati
+ </string>
+ <string name="Tight Shirt">
+ Camicia attillata
+ </string>
+ <string name="Tight Skirt">
+ Gonna attillata
+ </string>
+ <string name="Tight Sleeves">
+ Maniche strette
+ </string>
+ <string name="Toe Shape">
+ Forma della punta
+ </string>
+ <string name="Toe Thickness">
+ Spessore della punta
+ </string>
+ <string name="Torso Length">
+ Lunghezza del torace
+ </string>
+ <string name="Torso Muscles">
+ Muscoli del torace
+ </string>
+ <string name="Torso Scrawny">
+ Torso Scrawny
+ </string>
+ <string name="Unattached">
+ Distaccato
+ </string>
+ <string name="Uncreased">
+ Senza piega
+ </string>
+ <string name="Underbite">
+ Denti inf. in fuori
+ </string>
+ <string name="Unnatural">
+ Innaturale
+ </string>
+ <string name="Upper Bridge">
+ Parte alta del setto
+ </string>
+ <string name="Upper Cheeks">
+ Parte alta degli zigomi
+ </string>
+ <string name="Upper Chin Cleft">
+ Fossetta sup. del mento
+ </string>
+ <string name="Upper Eyelid Fold">
+ Piega palpebra sup.
+ </string>
+ <string name="Upturned">
+ All&apos;insù
+ </string>
+ <string name="Very Red">
+ Molto rossi
+ </string>
+ <string name="Waist Height">
+ Vita alta
+ </string>
+ <string name="Well-Fed">
+ Pienotte
+ </string>
+ <string name="White Hair">
+ Capelli bianchi
+ </string>
+ <string name="Wide">
+ Largo
+ </string>
+ <string name="Wide Back">
+ Dietro largo
+ </string>
+ <string name="Wide Front">
+ Davanti largo
+ </string>
+ <string name="Wide Lips">
+ Labbra larghe
+ </string>
+ <string name="Wild">
+ Colorati
+ </string>
+ <string name="Wrinkles">
+ Grinze
+ </string>
+ <string name="LocationCtrlAddLandmarkTooltip">
+ Aggiungi ai miei punti di riferimento
+ </string>
+ <string name="LocationCtrlEditLandmarkTooltip">
+ Modifica i miei punti di riferimento
+ </string>
+ <string name="LocationCtrlInfoBtnTooltip">
+ Maggiori informazioni sulla posizione attuale
+ </string>
+ <string name="LocationCtrlComboBtnTooltip">
+ La cronologia delle mie posizioni
+ </string>
+ <string name="LocationCtrlAdultIconTooltip">
+ Regione con categoria adulti
+ </string>
+ <string name="LocationCtrlModerateIconTooltip">
+ Regione con categoria moderata
+ </string>
+ <string name="LocationCtrlGeneralIconTooltip">
+ Regione generale
+ </string>
+ <string name="LocationCtrlSeeAVsTooltip">
+ Avatar visibili e chat consentita fuori di questo lotto
+ </string>
+ <string name="UpdaterWindowTitle">
+ Aggiornamento [APP_NAME]
+ </string>
+ <string name="UpdaterNowUpdating">
+ Aggiornamento di [APP_NAME]...
+ </string>
+ <string name="UpdaterNowInstalling">
+ Installazione di [APP_NAME]...
+ </string>
+ <string name="UpdaterUpdatingDescriptive">
+ Il Viewer del programma [APP_NAME] si sta aggiornando all&apos;ultima versione. Potrebbe volerci del tempo, attendi.
+ </string>
+ <string name="UpdaterProgressBarTextWithEllipses">
+ Download dell&apos;aggiornamento...
+ </string>
+ <string name="UpdaterProgressBarText">
+ Download dell&apos;aggiornamento
+ </string>
+ <string name="UpdaterFailDownloadTitle">
+ Download dell&apos;aggiornamento non riuscito
+ </string>
+ <string name="UpdaterFailUpdateDescriptive">
+ Il programma [APP_NAME] ha riscontrato un&apos;errore durante il tentativo di aggiornamento. Consigliamo di scaricare l&apos;ultima versione direttamente da www.secondlife.com.
+ </string>
+ <string name="UpdaterFailInstallTitle">
+ Installazione dell&apos;aggiornamento non riuscita
+ </string>
+ <string name="UpdaterFailStartTitle">
+ Errore nell&apos;avvio del viewer
+ </string>
+ <string name="ItemsComingInTooFastFrom">
+ [APP_NAME]: Oggetti in arrivo troppo velocemente da [FROM_NAME], anteprima automatica disattivata per [TIME] secondi
+ </string>
+ <string name="ItemsComingInTooFast">
+ [APP_NAME]: Oggetti in arrivo troppo velocemente, anteprima automatica disattivata per [TIME] secondi
+ </string>
+ <string name="IM_logging_string">
+ -- Registrazione messaggi instantanei abilitata --
+ </string>
+ <string name="IM_typing_start_string">
+ [NAME] sta scrivendo...
+ </string>
+ <string name="Unnamed">
+ (anonimo)
+ </string>
+ <string name="IM_moderated_chat_label">
+ (Moderato: Voci disattivate di default)
+ </string>
+ <string name="IM_unavailable_text_label">
+ La chat di testo non è disponibile per questa chiamata.
+ </string>
+ <string name="IM_muted_text_label">
+ La chat di testo è stata disabilitata da un moderatore di gruppo.
+ </string>
+ <string name="IM_default_text_label">
+ Clicca qui per inviare un messaggio instantaneo.
+ </string>
+ <string name="IM_to_label">
+ A
+ </string>
+ <string name="IM_moderator_label">
+ (Moderatore)
+ </string>
+ <string name="Saved_message">
+ (Salvato [LONG_TIMESTAMP])
+ </string>
+ <string name="IM_unblock_only_groups_friends">
+ Per vedere questo messaggio, devi deselezionare &apos;Solo amici e gruppi possono chiamarmi o mandarmi IM&apos; in Preferenze/Privacy.
+ </string>
+ <string name="answered_call">
+ Risposto alla chiamata
+ </string>
+ <string name="you_started_call">
+ Hai iniziato una chiamata vocale
+ </string>
+ <string name="you_joined_call">
+ Ti sei collegato alla chiamata in voce
+ </string>
+ <string name="name_started_call">
+ [NAME] ha iniziato una chiamata vocale
+ </string>
+ <string name="ringing-im">
+ Collegamento alla chiamata vocale...
+ </string>
+ <string name="connected-im">
+ Collegato, clicca Chiudi chiamata per agganciare
+ </string>
+ <string name="hang_up-im">
+ Chiusa la chiamata
+ </string>
+ <string name="conference-title-incoming">
+ Chiamata in conferenza con [AGENT_NAME]
+ </string>
+ <string name="no_session_message">
+ (La sessione IM non esiste)
+ </string>
+ <string name="only_user_message">
+ Sei l&apos;unico utente di questa sessione.
+ </string>
+ <string name="offline_message">
+ [NAME] è offline
+ </string>
+ <string name="invite_message">
+ Clicca il tasto [BUTTON NAME] per accettare/connetterti a questa voice chat.
+ </string>
+ <string name="muted_message">
+ Hai bloccato questo residente. Quando gli invii un messaggio, verrà automaticamente sbloccato.
+ </string>
+ <string name="generic">
+ Errore nella richiesta, riprova più tardi.
+ </string>
+ <string name="generic_request_error">
+ Errore durante la richiesta, riprova più tardi.
+ </string>
+ <string name="insufficient_perms_error">
+ Non hai sufficienti permessi.
+ </string>
+ <string name="session_does_not_exist_error">
+ Questa sessione non esiste più
+ </string>
+ <string name="no_ability_error">
+ Non hai questa abilitazione.
+ </string>
+ <string name="no_ability">
+ Non hai questa abilitazione.
+ </string>
+ <string name="not_a_mod_error">
+ Non sei un moderatore.
+ </string>
+ <string name="muted">
+ Il moderatore del gruppo ha disattivato la tua chat di testo.
+ </string>
+ <string name="muted_error">
+ Un moderatore di gruppo ti ha disabilitato dalla chat di testo.
+ </string>
+ <string name="add_session_event">
+ Impossibile aggiungere utenti alla chat con [RECIPIENT].
+ </string>
+ <string name="message">
+ Impossibile spedire il tuo messaggio nella sessione chat con [RECIPIENT].
+ </string>
+ <string name="message_session_event">
+ Impossibile inviare il messaggio nella chat con [RECIPIENT].
+ </string>
+ <string name="mute">
+ Errore durante la moderazione.
+ </string>
+ <string name="removed">
+ Sei stato rimosso dal gruppo.
+ </string>
+ <string name="removed_from_group">
+ Sei stato espulso dal gruppo.
+ </string>
+ <string name="close_on_no_ability">
+ Non hai più le abilitazioni per rimanere nella sessione chat.
+ </string>
+ <string name="unread_chat_single">
+ [SOURCES] ha detto qualcosa di nuovo
+ </string>
+ <string name="unread_chat_multiple">
+ [SOURCES] ha detto qualcosa di nuovo
+ </string>
+ <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">
+ Hai inviato un pagamento di L$[AMOUNT] a [NAME] [REASON].
+ </string>
+ <string name="you_paid_ldollars_no_info">
+ Hai pagato L$ [AMOUNT].
+ </string>
+ <string name="you_paid_ldollars_no_reason">
+ Hai inviato un pagamento di L$[AMOUNT] a [NAME].
+ </string>
+ <string name="you_paid_ldollars_no_name">
+ Hai pagato L$ [AMOUNT] [REASON].
+ </string>
+ <string name="you_paid_failure_ldollars">
+ Non hai pagato [NAME] L$[AMOUNT] [REASON].
+ </string>
+ <string name="you_paid_failure_ldollars_no_info">
+ Non hai pagato L$ [AMOUNT].
+ </string>
+ <string name="you_paid_failure_ldollars_no_reason">
+ Non hai pagato [NAME] L$[AMOUNT].
+ </string>
+ <string name="you_paid_failure_ldollars_no_name">
+ Non hai pagato L$ [AMOUNT] [REASON].
+ </string>
+ <string name="for item">
+ per [ITEM]
+ </string>
+ <string name="for a parcel of land">
+ per un lotto di terreno
+ </string>
+ <string name="for a land access pass">
+ per un permesso di accesso al terreno
+ </string>
+ <string name="for deeding land">
+ per la cessione di terreno
+ </string>
+ <string name="to create a group">
+ per creare un gruppo
+ </string>
+ <string name="to join a group">
+ per aderire a un gruppo
+ </string>
+ <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>
+ <string name="uploading_costs">
+ Il costo per il caricamento è di L$ [AMOUNT]
+ </string>
+ <string name="this_costs">
+ Il costo è L$ [AMOUNT]
+ </string>
+ <string name="buying_selected_land">
+ L&apos;acquisto del terreno prescelto costa L$ [AMOUNT]
+ </string>
+ <string name="this_object_costs">
+ Il costo dell&apos;oggetto è L$ [AMOUNT]
+ </string>
+ <string name="group_role_everyone">
+ Tutti
+ </string>
+ <string name="group_role_officers">
+ Funzionari
+ </string>
+ <string name="group_role_owners">
+ Proprietari
+ </string>
+ <string name="group_member_status_online">
+ Online
+ </string>
+ <string name="uploading_abuse_report">
+ Caricamento in corso...
+
+Segnala abuso
+ </string>
+ <string name="New Shape">
+ Nuova figura corporea
+ </string>
+ <string name="New Skin">
+ Nuova pelle
+ </string>
+ <string name="New Hair">
+ Nuovi capelli
+ </string>
+ <string name="New Eyes">
+ Nuovi occhi
+ </string>
+ <string name="New Shirt">
+ Nuova camicia
+ </string>
+ <string name="New Pants">
+ Nuovi pantaloni
+ </string>
+ <string name="New Shoes">
+ Nuove scarpe
+ </string>
+ <string name="New Socks">
+ Nuove calze
+ </string>
+ <string name="New Jacket">
+ Nuova giacca
+ </string>
+ <string name="New Gloves">
+ Nuovi guanti
+ </string>
+ <string name="New Undershirt">
+ Nuova maglietta intima
+ </string>
+ <string name="New Underpants">
+ Nuovi slip
+ </string>
+ <string name="New Skirt">
+ Nuova gonna
+ </string>
+ <string name="New Alpha">
+ Nuovo Alpha (trasparenza)
+ </string>
+ <string name="New Tattoo">
+ Nuovo tatuaggio
+ </string>
+ <string name="New Physics">
+ Nuova fisica
+ </string>
+ <string name="Invalid Wearable">
+ Capo da indossare non valido
+ </string>
+ <string name="New Gesture">
+ Nuova gesture
+ </string>
+ <string name="New Script">
+ Nuovo script
+ </string>
+ <string name="New Note">
+ Nuovo appunto
+ </string>
+ <string name="New Folder">
+ Nuova cartella
+ </string>
+ <string name="Contents">
+ Contenuto
+ </string>
+ <string name="Gesture">
+ Gesture
+ </string>
+ <string name="Male Gestures">
+ Gesture maschili
+ </string>
+ <string name="Female Gestures">
+ Gesture femminili
+ </string>
+ <string name="Other Gestures">
+ Altre gesture
+ </string>
+ <string name="Speech Gestures">
+ Gesture del parlato
+ </string>
+ <string name="Common Gestures">
+ Gesture comuni
+ </string>
+ <string name="Male - Excuse me">
+ Maschio - Chiedere scusa
+ </string>
+ <string name="Male - Get lost">
+ Maschio - Levati dai piedi!
+ </string>
+ <string name="Male - Blow kiss">
+ Maschio - Butta un bacio
+ </string>
+ <string name="Male - Boo">
+ Maschio - Bu
+ </string>
+ <string name="Male - Bored">
+ Maschio - Annoiato
+ </string>
+ <string name="Male - Hey">
+ Maschio - Ehi
+ </string>
+ <string name="Male - Laugh">
+ Maschio - Ridere
+ </string>
+ <string name="Male - Repulsed">
+ Maschio - Disgustato
+ </string>
+ <string name="Male - Shrug">
+ Maschio - Spallucce
+ </string>
+ <string name="Male - Stick tougue out">
+ Maschio - Tira fuori la lingua
+ </string>
+ <string name="Male - Wow">
+ Maschio - Accipicchia
+ </string>
+ <string name="Female - Chuckle">
+ Femmina - Risatina
+ </string>
+ <string name="Female - Cry">
+ Femmina - Pianto
+ </string>
+ <string name="Female - Embarrassed">
+ Femmina - Imbarazzata
+ </string>
+ <string name="Female - Excuse me">
+ Femmina - Chiedere scusa
+ </string>
+ <string name="Female - Get lost">
+ Femmina - Levati dai piedi!
+ </string>
+ <string name="Female - Blow kiss">
+ Femmina - Butta un bacio
+ </string>
+ <string name="Female - Boo">
+ Femmina - Bu
+ </string>
+ <string name="Female - Bored">
+ Femmina - Annoiata
+ </string>
+ <string name="Female - Hey">
+ Femmina - Ehi
+ </string>
+ <string name="Female - Hey baby">
+ Femmina - Ehi tu
+ </string>
+ <string name="Female - Laugh">
+ Femmina - Ridere
+ </string>
+ <string name="Female - Looking good">
+ Femmina - Sei in forma
+ </string>
+ <string name="Female - Over here">
+ Femmina - Per di qua
+ </string>
+ <string name="Female - Please">
+ Femmina - Per cortesia
+ </string>
+ <string name="Female - Repulsed">
+ Femmina - Disgustata
+ </string>
+ <string name="Female - Shrug">
+ Femmina - Spallucce
+ </string>
+ <string name="Female - Stick tougue out">
+ Femmina - Tira fuori la lingua
+ </string>
+ <string name="Female - Wow">
+ Femmina - Accipicchia
+ </string>
+ <string name="/bow">
+ /inchino
+ </string>
+ <string name="/clap">
+ /applausi
+ </string>
+ <string name="/count">
+ /numero
+ </string>
+ <string name="/extinguish">
+ /estingui
+ </string>
+ <string name="/kmb">
+ /chissene
+ </string>
+ <string name="/muscle">
+ /muscolo
+ </string>
+ <string name="/no">
+ /no
+ </string>
+ <string name="/no!">
+ /no!
+ </string>
+ <string name="/paper">
+ /carta
+ </string>
+ <string name="/pointme">
+ /indicome
+ </string>
+ <string name="/pointyou">
+ /indicotu
+ </string>
+ <string name="/rock">
+ /sasso
+ </string>
+ <string name="/scissor">
+ /forbici
+ </string>
+ <string name="/smoke">
+ /fumo
+ </string>
+ <string name="/stretch">
+ /stiracchiata
+ </string>
+ <string name="/whistle">
+ /fischietto
+ </string>
+ <string name="/yes">
+ /si
+ </string>
+ <string name="/yes!">
+ /si!
+ </string>
+ <string name="afk">
+ non alla tastiera
+ </string>
+ <string name="dance1">
+ danza1
+ </string>
+ <string name="dance2">
+ danza2
+ </string>
+ <string name="dance3">
+ danza3
+ </string>
+ <string name="dance4">
+ danza4
+ </string>
+ <string name="dance5">
+ danza5
+ </string>
+ <string name="dance6">
+ danza6
+ </string>
+ <string name="dance7">
+ danza7
+ </string>
+ <string name="dance8">
+ danza8
+ </string>
+ <string name="AvatarBirthDateFormat">
+ [day,datetime,slt]/[mthnum,datetime,slt]/[year,datetime,slt]
+ </string>
+ <string name="DefaultMimeType">
+ nessuna/nessuna
+ </string>
+ <string name="texture_load_dimensions_error">
+ Impossibile caricare immagini di dimensioni superiori a [WIDTH]*[HEIGHT]
+ </string>
+ <string name="words_separator" value=","/>
+ <string name="server_is_down">
+ Nonostante i nostri tentativi, si è verificato un errore imprevisto.
+
+ Consulta la pagina status.secondlifegrid.net per determinare se si sia verificato un problema noto con il servizio.
+ Se il problema continua, ti consigliamo di controllare le tue impostazioni di rete e della firewall.
+ </string>
+ <string name="dateTimeWeekdaysNames">
+ lunedì:martedì:mercoledì:giovedì:venerdì:sabato:domenica
+ </string>
+ <string name="dateTimeWeekdaysShortNames">
+ lun:mar:mer:gio:ven:sab:dom
+ </string>
+ <string name="dateTimeMonthNames">
+ gennaio:febbraio:marzo:aprile:maggio:giugno:luglio:agosto:settembre:ottobre:novembre:dicembre
+ </string>
+ <string name="dateTimeMonthShortNames">
+ gen:feb:mar:apr:mag:giu:lug:ago:sett:ott:nov:dic
+ </string>
+ <string name="dateTimeDayFormat">
+ [MDAY]
+ </string>
+ <string name="dateTimeAM">
+ antemeridiane
+ </string>
+ <string name="dateTimePM">
+ pomeridiane
+ </string>
+ <string name="LocalEstimateUSD">
+ US$ [AMOUNT]
+ </string>
+ <string name="Membership">
+ Abbonamento
+ </string>
+ <string name="Roles">
+ Ruoli
+ </string>
+ <string name="Group Identity">
+ Identità gruppo
+ </string>
+ <string name="Parcel Management">
+ Gestione lotto
+ </string>
+ <string name="Parcel Identity">
+ Identità lotto
+ </string>
+ <string name="Parcel Settings">
+ Impostazioni lotto
+ </string>
+ <string name="Parcel Powers">
+ Poteri lotto
+ </string>
+ <string name="Parcel Access">
+ Accesso al lotto
+ </string>
+ <string name="Parcel Content">
+ Contenuto lotto
+ </string>
+ <string name="Object Management">
+ Gestione oggetti
+ </string>
+ <string name="Accounting">
+ Contabilità
+ </string>
+ <string name="Notices">
+ Avvisi
+ </string>
+ <string name="Chat" value="Chat :">
+ Chat
+ </string>
+ <string name="DeleteItems">
+ Cancellare gli elementi selezionati?
+ </string>
+ <string name="DeleteItem">
+ Cancellare l’elemento selezionato?
+ </string>
+ <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="TranslationFailed">
+ Traduzione non riuscita: [REASON]
+ </string>
+ <string name="TranslationResponseParseError">
+ Errore di elaborazione della risposta della traduzione.
+ </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>
+ <string name="Command_AboutLand_Label">
+ Informazioni sul terreno
+ </string>
+ <string name="Command_Appearance_Label">
+ Aspetto fisico
+ </string>
+ <string name="Command_Avatar_Label">
+ Avatar
+ </string>
+ <string name="Command_Build_Label">
+ Costruisci
+ </string>
+ <string name="Command_Chat_Label">
+ Chat
+ </string>
+ <string name="Command_Compass_Label">
+ Bussola
+ </string>
+ <string name="Command_Destinations_Label">
+ Destinazioni
+ </string>
+ <string name="Command_Gestures_Label">
+ Gesture
+ </string>
+ <string name="Command_HowTo_Label">
+ Istruzioni
+ </string>
+ <string name="Command_Inventory_Label">
+ Inventario
+ </string>
+ <string name="Command_Map_Label">
+ Mappa
+ </string>
+ <string name="Command_Marketplace_Label">
+ Mercato
+ </string>
+ <string name="Command_MiniMap_Label">
+ Mini mappa
+ </string>
+ <string name="Command_Move_Label">
+ Cammina / corri / vola
+ </string>
+ <string name="Command_Outbox_Label">
+ Casella in uscita del rivenditore
+ </string>
+ <string name="Command_People_Label">
+ Persone
+ </string>
+ <string name="Command_Picks_Label">
+ Preferiti
+ </string>
+ <string name="Command_Places_Label">
+ Luoghi
+ </string>
+ <string name="Command_Preferences_Label">
+ Preferenze
+ </string>
+ <string name="Command_Profile_Label">
+ Profilo
+ </string>
+ <string name="Command_Search_Label">
+ Ricerca
+ </string>
+ <string name="Command_Snapshot_Label">
+ Istantanea
+ </string>
+ <string name="Command_Speak_Label">
+ Parla
+ </string>
+ <string name="Command_View_Label">
+ Controlli fotocamera
+ </string>
+ <string name="Command_Voice_Label">
+ Impostazioni voce
+ </string>
+ <string name="Command_AboutLand_Tooltip">
+ Informazioni sul terreno che visiti
+ </string>
+ <string name="Command_Appearance_Tooltip">
+ Cambia l&apos;avatar
+ </string>
+ <string name="Command_Avatar_Tooltip">
+ Seleziona un avatar completo
+ </string>
+ <string name="Command_Build_Tooltip">
+ Costruzione oggetti e modifica terreno
+ </string>
+ <string name="Command_Chat_Tooltip">
+ Chatta con persone vicine usando il testo
+ </string>
+ <string name="Command_Compass_Tooltip">
+ Bussola
+ </string>
+ <string name="Command_Destinations_Tooltip">
+ Destinazioni interessanti
+ </string>
+ <string name="Command_Gestures_Tooltip">
+ Gesti per il tuo avatar
+ </string>
+ <string name="Command_HowTo_Tooltip">
+ Come eseguire le attività più comuni
+ </string>
+ <string name="Command_Inventory_Tooltip">
+ Visualizza e usa le tue cose
+ </string>
+ <string name="Command_Map_Tooltip">
+ Mappa del mondo
+ </string>
+ <string name="Command_Marketplace_Tooltip">
+ Vai allo shopping
+ </string>
+ <string name="Command_MiniMap_Tooltip">
+ Mostra le persone vicine
+ </string>
+ <string name="Command_Move_Tooltip">
+ Movimento avatar
+ </string>
+ <string name="Command_Outbox_Tooltip">
+ Trasferisci elementi al tuo mercato per la vendita
+ </string>
+ <string name="Command_People_Tooltip">
+ Amici, gruppi e persone vicine
+ </string>
+ <string name="Command_Picks_Tooltip">
+ Luoghi da mostrare come preferiti nel profilo
+ </string>
+ <string name="Command_Places_Tooltip">
+ Luoghi salvati
+ </string>
+ <string name="Command_Preferences_Tooltip">
+ Preferenze
+ </string>
+ <string name="Command_Profile_Tooltip">
+ Modifica o visualizza il tuo profilo
+ </string>
+ <string name="Command_Search_Tooltip">
+ Trova luoghi, eventi, persone
+ </string>
+ <string name="Command_Snapshot_Tooltip">
+ Scatta una foto
+ </string>
+ <string name="Command_Speak_Tooltip">
+ Parla con persone vicine usando il microfono
+ </string>
+ <string name="Command_View_Tooltip">
+ Modifica angolo fotocamera
+ </string>
+ <string name="Command_Voice_Tooltip">
+ I controlli per il volume per le chiamate e per le persone nelle vicinanze nel mondo virtuale
+ </string>
+ <string name="Toolbar_Bottom_Tooltip">
+ attualmente nella barra degli strumenti in basso
+ </string>
+ <string name="Toolbar_Left_Tooltip">
+ attualmente nella barra degli strumenti a sinistra
+ </string>
+ <string name="Toolbar_Right_Tooltip">
+ attualmente nella barra degli strumenti a destra
+ </string>
+ <string name="Retain%">
+ Mantieni%
+ </string>
+ <string name="Detail">
+ Dettagli
+ </string>
+ <string name="Better Detail">
+ Migliori dettagli
+ </string>
+ <string name="Surface">
+ Superficie
+ </string>
+ <string name="Solid">
+ Solido
+ </string>
+ <string name="Wrap">
+ Involucro
+ </string>
+ <string name="Preview">
+ Anteprima
+ </string>
+ <string name="Normal">
+ Normale
+ </string>
+ <string name="snapshot_quality_very_low">
+ Molto basso
+ </string>
+ <string name="snapshot_quality_low">
+ Basso
+ </string>
+ <string name="snapshot_quality_medium">
+ Medio
+ </string>
+ <string name="snapshot_quality_high">
+ Alto
+ </string>
+ <string name="snapshot_quality_very_high">
+ Molto alto
+ </string>
+</strings>
diff --git a/indra/newview/skins/steam/xui/ja/strings.xml b/indra/newview/skins/steam/xui/ja/strings.xml
new file mode 100644
index 0000000000..29ef13109c
--- /dev/null
+++ b/indra/newview/skins/steam/xui/ja/strings.xml
@@ -0,0 +1,5018 @@
+<?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 サãƒãƒ¼ãƒˆãƒãƒ¼ã‚¿ãƒ«
+ </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="StartupRequireDriverUpdate">
+ ã‚°ãƒ©ãƒ•ã‚£ãƒƒã‚¯ã‚’åˆæœŸåŒ–ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚グラフィックドライãƒã‚’æ›´æ–°ã—ã¦ãã ã•ã„。
+ </string>
+ <string name="ProgressRestoring">
+ 復元中ã§ã™...
+ </string>
+ <string name="ProgressChangingResolution">
+ è§£åƒåº¦ã‚’変更中ã§ã™...
+ </string>
+ <string name="Fullbright">
+ 明るã•全開(レガシー)
+ </string>
+ <string name="LoginInProgress">
+ ログイン中ã§ã™ã€‚[APP_NAME]ã®è¡¨ç¤ºãŒãƒ•リーズã™ã‚‹å ´åˆãŒã‚りã¾ã™ã€‚ ã—ã°ã‚‰ããŠå¾…ã¡ãã ã•ã„。
+ </string>
+ <string name="LoginInProgressNoFrozen">
+ ログイン中ã§ã™...
+ </string>
+ <string name="LoginAuthenticating">
+ èªè¨¼ã—ã¦ã„ã¾ã™...
+ </string>
+ <string name="LoginMaintenance">
+ アカウントã®ãƒ¡ãƒ³ãƒ†ãƒŠãƒ³ã‚¹ã‚’実行ã—ã¦ã„ã¾ã™...
+ </string>
+ <string name="LoginAttempt">
+ å‰å›žã®ãƒ­ã‚°ã‚¤ãƒ³ã«å¤±æ•—ã—ã¾ã—ãŸã€‚ ログイン中ã§ã™ï¼ˆ[NUMBER] 回目)
+ </string>
+ <string name="LoginPrecaching">
+ ワールドを読ã¿è¾¼ã‚“ã§ã„ã¾ã™...
+ </string>
+ <string name="LoginInitializingBrowser">
+ 内蔵 Web ãƒ–ãƒ©ã‚¦ã‚¶ã‚’åˆæœŸåŒ–ã—ã¦ã„ã¾ã™...
+ </string>
+ <string name="LoginInitializingMultimedia">
+ マルãƒãƒ¡ãƒ‡ã‚£ã‚¢ã‚’åˆæœŸåŒ–ã—ã¦ã„ã¾ã™...
+ </string>
+ <string name="LoginInitializingFonts">
+ フォントをローディング中...
+ </string>
+ <string name="LoginVerifyingCache">
+ キャッシュファイルを検証ã—ã¦ã„ã¾ã™ï¼ˆæ‰€è¦æ™‚間㯠60 ~ 90 秒)...
+ </string>
+ <string name="LoginProcessingResponse">
+ 対応を処ç†ä¸­ã§ã™...
+ </string>
+ <string name="LoginInitializingWorld">
+ ãƒ¯ãƒ¼ãƒ«ãƒ‰ã‚’åˆæœŸåŒ–中ã§ã™...
+ </string>
+ <string name="LoginDecodingImages">
+ ç”»åƒã‚’デコードã—ã¦ã„ã¾ã™...
+ </string>
+ <string name="LoginInitializingQuicktime">
+ QuickTime ã‚’åˆæœŸåŒ–ã—ã¦ã„ã¾ã™...
+ </string>
+ <string name="LoginQuicktimeNotFound">
+ QuickTime ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã€‚åˆæœŸåŒ–ã«å¤±æ•—ã—ã¾ã—ãŸã€‚
+ </string>
+ <string name="LoginQuicktimeOK">
+ QuickTime ãŒæ­£å¸¸ã«åˆæœŸåŒ–ã•れã¾ã—ãŸã€‚
+ </string>
+ <string name="LoginRequestSeedCapGrant">
+ ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã®æ©Ÿèƒ½ã‚’リクエストã—ã¦ã„ã¾ã™...
+ </string>
+ <string name="LoginRetrySeedCapGrant">
+ ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã®æ©Ÿèƒ½ã‚’リクエストã€è©¦è¡Œ [NUMBER] 回....
+ </string>
+ <string name="LoginWaitingForRegionHandshake">
+ リージョンã®ãƒãƒ³ãƒ‰ã‚·ã‚§ã‚¤ã‚¯ã‚’å¾…ã£ã¦ã„ã¾ã™...
+ </string>
+ <string name="LoginConnectingToRegion">
+ ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã«æŽ¥ç¶šã—ã¦ã„ã¾ã™...
+ </string>
+ <string name="LoginDownloadingClothing">
+ 衣類をダウンロードã—ã¦ã„ã¾ã™...
+ </string>
+ <string name="InvalidCertificate">
+ 証明書ãŒç„¡åйã¾ãŸã¯å£Šã‚Œã¦ã„ã¾ã™ã€‚ グリッド管ç†è€…ã«ã”連絡ãã ã•ã„。
+ </string>
+ <string name="CertInvalidHostname">
+ 無効ãªãƒ›ã‚¹ãƒˆãƒãƒ¼ãƒ ãŒã‚µãƒ¼ãƒãƒ¼ã«ã‚¢ã‚¯ã‚»ã‚¹ã—ã¦ã„ã¾ã—ãŸã€‚SLURL ã‹ã‚°ãƒªãƒƒãƒ‰ã®ãƒ›ã‚¹ãƒˆãƒãƒ¼ãƒ ã‚’ã”確èªãã ã•ã„。
+ </string>
+ <string name="CertExpired">
+ グリッドãŒè¿”ã—ãŸè¨¼æ˜Žæ›¸ã¯æœ‰åŠ¹æœŸé™ãŒçµ‚了ã—ã¦ã„ã‚‹ã¨è€ƒãˆã‚‰ã‚Œã¾ã™ã€‚ãŠä½¿ã„ã®ã‚·ã‚¹ãƒ†ãƒ ã‚¯ãƒ­ãƒƒã‚¯ã‚’確èªã™ã‚‹ã‹ã€ã‚°ãƒªãƒƒãƒ‰ã®ç®¡ç†è€…ã«ãŠå•ã„åˆã‚ã›ãã ã•ã„。
+ </string>
+ <string name="CertKeyUsage">
+ SSL 証明書ã®ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚ グリッド管ç†è€…ã«ã”連絡ãã ã•ã„。
+ </string>
+ <string name="CertBasicConstraints">
+ サーãƒãƒ¼ã®è¨¼æ˜Žæ›¸ãƒã‚§ãƒ¼ãƒ³ã«è¨¼æ˜Žæ›¸ãŒå¤šã™ãŽã¾ã™ã€‚ グリッド管ç†è€…ã«ã”連絡ãã ã•ã„。
+ </string>
+ <string name="CertInvalidSignature">
+ グリッドサーãƒãƒ¼ãŒè¿”ã—ãŸè¨¼æ˜Žæ›¸ã®ç½²åã‚’èªè¨¼ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚グリッドã®ç®¡ç†è€…ã«ãŠå•ã„åˆã‚ã›ãã ã•ã„。
+ </string>
+ <string name="LoginFailedNoNetwork">
+ ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã‚¨ãƒ©ãƒ¼ï¼šæŽ¥ç¶šã‚’確立ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚ãŠä½¿ã„ã®ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯æŽ¥ç¶šã‚’ã”確èªãã ã•ã„。
+ </string>
+ <string name="LoginFailed">
+ ログインã«å¤±æ•—ã—ã¾ã—ãŸã€‚
+ </string>
+ <string name="Quit">
+ 終了
+ </string>
+ <string name="create_account_url">
+ http://join.secondlife.com/index.php?sourceid=1206_steam&amp;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>
+ <string name="SavingSettings">
+ 設定をä¿å­˜ä¸­ã§ã™...
+ </string>
+ <string name="LoggingOut">
+ ログアウト中ã§ã™...
+ </string>
+ <string name="ShuttingDown">
+ シャットダウン中ã§ã™...
+ </string>
+ <string name="YouHaveBeenDisconnected">
+ ã‚ãªãŸãŒã„ãŸãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã¸ã®æŽ¥ç¶šãŒåˆ‡ã‚Œã¾ã—ãŸã€‚
+ </string>
+ <string name="SentToInvalidRegion">
+ 無効ãªãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã•れã¾ã—ãŸã€‚
+ </string>
+ <string name="TestingDisconnect">
+ ãƒ“ãƒ¥ãƒ¼ãƒ¯ã®æŽ¥ç¶šã‚’åˆ‡ã‚‹ãƒ†ã‚¹ãƒˆä¸­
+ </string>
+ <string name="TooltipPerson">
+ 人
+ </string>
+ <string name="TooltipNoName">
+ (åå‰ãªã—)
+ </string>
+ <string name="TooltipOwner">
+ 所有者:
+ </string>
+ <string name="TooltipPublic">
+ 公共
+ </string>
+ <string name="TooltipIsGroup">
+ (グループ)
+ </string>
+ <string name="TooltipForSaleL$">
+ 売り出ã—中:L$ [AMOUNT]
+ </string>
+ <string name="TooltipFlagGroupBuild">
+ グループ作æˆ
+ </string>
+ <string name="TooltipFlagNoBuild">
+ 作æˆç¦æ­¢
+ </string>
+ <string name="TooltipFlagNoEdit">
+ グループ作æˆ
+ </string>
+ <string name="TooltipFlagNotSafe">
+ å±é™º
+ </string>
+ <string name="TooltipFlagNoFly">
+ é£›è¡Œç¦æ­¢
+ </string>
+ <string name="TooltipFlagGroupScripts">
+ グループスクリプト
+ </string>
+ <string name="TooltipFlagNoScripts">
+ スクリプトãªã—
+ </string>
+ <string name="TooltipLand">
+ 土地:
+ </string>
+ <string name="TooltipMustSingleDrop">
+ アイテム㯠1 ã¤ã ã‘ã“ã“ã«ãƒ‰ãƒ©ãƒƒã‚°ã§ãã¾ã™
+ </string>
+ <string name="TooltipPrice" value="L$[AMOUNT]:"/>
+ <string name="TooltipOutboxDragToWorld">
+ マーãƒãƒ£ãƒ³ãƒˆãƒœãƒƒã‚¯ã‚¹å†…ã®ã‚¢ã‚¤ãƒ†ãƒ ã‚’ Rez ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“
+ </string>
+ <string name="TooltipOutboxNoTransfer">
+ ã“れらオブジェクト㮠1 ã¤ã¾ãŸã¯è¤‡æ•°ã¯å£²ã‚Šæ¸¡ã—ãŸã‚Šè­²æ¸¡ã—ãŸã‚Šã§ããªã„ã‚‚ã®ã§ã™ã€‚
+ </string>
+ <string name="TooltipOutboxNotInInventory">
+ マーãƒãƒ£ãƒ³ãƒˆã‚¢ã‚¦ãƒˆãƒœãƒƒã‚¯ã‚¹ã§ã¯ã€ã”自分ã®ã‚¤ãƒ³ãƒ™ãƒ³ãƒˆãƒªã‹ã‚‰ã®ã‚¢ã‚¤ãƒ†ãƒ ã—ã‹å—ã‘入れるã“ã¨ãŒã§ãã¾ã›ã‚“
+ </string>
+ <string name="TooltipOutboxWorn">
+ ç€ç”¨ã—ã¦ã„るアイテムをマーãƒãƒ£ãƒ³ãƒˆã‚¢ã‚¦ãƒˆãƒœãƒƒã‚¯ã‚¹ã«å…¥ã‚Œã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“
+ </string>
+ <string name="TooltipOutboxCallingCard">
+ コーリングカードをマーãƒãƒ£ãƒ³ãƒˆã‚¢ã‚¦ãƒˆãƒœãƒƒã‚¯ã‚¹ã«å…¥ã‚Œã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“
+ </string>
+ <string name="TooltipOutboxFolderLevels">
+ ãƒã‚¹ãƒˆå…¥ã‚Šãƒ•ã‚©ãƒ«ãƒ€ã®æ·±ã•㌠3 ã‚’è¶…ãˆã¦ã„ã¾ã™
+ </string>
+ <string name="TooltipOutboxTooManyFolders">
+ 最上ä½ãƒ•ォルダ内ã®ã‚µãƒ–フォルダ数㌠20 ã‚’è¶…ãˆã¦ã„ã¾ã™
+ </string>
+ <string name="TooltipOutboxTooManyObjects">
+ 最上ä½ãƒ•ォルダ内ã®ã‚¢ã‚¤ãƒ†ãƒ æ•°ãŒ 200 ã‚’è¶…ãˆã¦ã„ã¾ã™
+ </string>
+ <string name="TooltipDragOntoOwnChild">
+ フォルダをãã®å­ãƒ•ォルダã«ç§»å‹•ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“
+ </string>
+ <string name="TooltipDragOntoSelf">
+ フォルダをãã®ãƒ•ォルダ自身ã«ç§»å‹•ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“
+ </string>
+ <string name="TooltipHttpUrl">
+ クリックã—ã¦ã“ã® Web ページを見ã¾ã™
+ </string>
+ <string name="TooltipSLURL">
+ クリックã—ã¦ã“ã®å ´æ‰€ã®æƒ…報を見ã¾ã™
+ </string>
+ <string name="TooltipAgentUrl">
+ クリックã—ã¦ã“ã®ä½äººã®ãƒ—ロフィールを見ã¾ã™
+ </string>
+ <string name="TooltipAgentInspect">
+ ã“ã®ä½äººã®è©³ç´°ã‚’å‚ç…§
+ </string>
+ <string name="TooltipAgentMute">
+ クリックã—ã¦ã“ã®ä½äººã«å¯¾ã—ã¦ç„¡è¦–設定をã—ã¾ã™
+ </string>
+ <string name="TooltipAgentUnmute">
+ クリックã—ã¦ã“ã®ä½äººã«å¯¾ã™ã‚‹ç„¡è¦–設定を解除ã—ã¾ã™
+ </string>
+ <string name="TooltipAgentIM">
+ クリックã—ã¦ã“ã®ä½äººã« IM ã‚’é€ã‚Šã¾ã™
+ </string>
+ <string name="TooltipAgentPay">
+ クリックã—ã¦ã“ã®ä½äººã«æ”¯æ‰•ã„ã¾ã™
+ </string>
+ <string name="TooltipAgentOfferTeleport">
+ クリックã—ã¦ã“ã®ä½äººã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã®ãƒªã‚¯ã‚¨ã‚¹ãƒˆã‚’é€ã‚Šã¾ã™
+ </string>
+ <string name="TooltipAgentRequestFriend">
+ クリックã—ã¦ã“ã®ä½äººã«ãƒ•レンド登録リクエストをé€ã‚Šã¾ã™
+ </string>
+ <string name="TooltipGroupUrl">
+ クリックã—ã¦ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã®èª¬æ˜Žæ–‡ã‚’見ã¾ã™
+ </string>
+ <string name="TooltipEventUrl">
+ クリックã—ã¦ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã®èª¬æ˜Žæ–‡ã‚’見ã¾ã™
+ </string>
+ <string name="TooltipClassifiedUrl">
+ クリックã—ã¦ã“ã®ã‚¯ãƒ©ã‚·ãƒ•ァイド広告を見ã¾ã™
+ </string>
+ <string name="TooltipParcelUrl">
+ クリックã—ã¦ã“ã®åŒºç”»ã®èª¬æ˜Žæ–‡ã‚’見ã¾ã™
+ </string>
+ <string name="TooltipTeleportUrl">
+ クリックã—ã¦ã“ã®å ´æ‰€ã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã—ã¾ã™
+ </string>
+ <string name="TooltipObjectIMUrl">
+ クリックã—ã¦ã“ã®ã‚ªãƒ–ジェクトã®èª¬æ˜Žæ–‡ã‚’見ã¾ã™
+ </string>
+ <string name="TooltipMapUrl">
+ クリックã—ã¦ã“ã®å ´æ‰€ã‚’地図ã«è¡¨ç¤ºã—ã¾ã™
+ </string>
+ <string name="TooltipSLAPP">
+ クリックã—㦠secondlife:// コマンドを出ã—ã¾ã™
+ </string>
+ <string name="CurrentURL" value=" ç¾åœ¨ã® URL: [CurrentURL]"/>
+ <string name="SLurlLabelTeleport">
+ テレãƒãƒ¼ãƒˆ
+ </string>
+ <string name="SLurlLabelShowOnMap">
+ 地図ã«è¡¨ç¤º
+ </string>
+ <string name="SLappAgentMute">
+ 無視
+ </string>
+ <string name="SLappAgentUnmute">
+ ミュート解除
+ </string>
+ <string name="SLappAgentIM">
+ IM
+ </string>
+ <string name="SLappAgentPay">
+ 支払ã†
+ </string>
+ <string name="SLappAgentOfferTeleport">
+ 次ã®å ´æ‰€ã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã‚’é€ã‚Šã¾ã™ï¼š
+ </string>
+ <string name="SLappAgentRequestFriend">
+ フレンド登録リクエスト
+ </string>
+ <string name="BUTTON_CLOSE_DARWIN">
+ é–‰ã˜ã‚‹ (⌘W)
+ </string>
+ <string name="BUTTON_CLOSE_WIN">
+ é–‰ã˜ã‚‹ (Ctrl+W)
+ </string>
+ <string name="BUTTON_CLOSE_CHROME">
+ é–‰ã˜ã‚‹
+ </string>
+ <string name="BUTTON_RESTORE">
+ 復元
+ </string>
+ <string name="BUTTON_MINIMIZE">
+ å…ƒã«æˆ»ã™ï¼ˆç¸®å°ï¼‰
+ </string>
+ <string name="BUTTON_TEAR_OFF">
+ 別ウィンドウã§é–‹ã
+ </string>
+ <string name="BUTTON_DOCK">
+ ドッキング
+ </string>
+ <string name="BUTTON_HELP">
+ ヘルプを表示
+ </string>
+ <string name="Searching">
+ 検索中...
+ </string>
+ <string name="NoneFound">
+ 見ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚
+ </string>
+ <string name="RetrievingData">
+ å–得中...
+ </string>
+ <string name="ReleaseNotes">
+ リリースノート
+ </string>
+ <string name="RELEASE_NOTES_BASE_URL">
+ http://wiki.secondlife.com/wiki/Release_Notes/
+ </string>
+ <string name="LoadingData">
+ ローディング...
+ </string>
+ <string name="AvatarNameNobody">
+ (ãªã—)
+ </string>
+ <string name="AvatarNameWaiting">
+ (待機中)
+ </string>
+ <string name="AvatarNameMultiple">
+ (複数)
+ </string>
+ <string name="GroupNameNone">
+ (ãªã—)
+ </string>
+ <string name="AvalineCaller">
+ Avaline コール [ORDER]
+ </string>
+ <string name="AssetErrorNone">
+ エラーãªã—
+ </string>
+ <string name="AssetErrorRequestFailed">
+ アセットリクエスト: 失敗
+ </string>
+ <string name="AssetErrorNonexistentFile">
+ アセットリクエスト: 存在ã—ãªã„ファイル
+ </string>
+ <string name="AssetErrorNotInDatabase">
+ アセットリクエスト: データベースã«è¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸ
+ </string>
+ <string name="AssetErrorEOF">
+ 終了
+ </string>
+ <string name="AssetErrorCannotOpenFile">
+ ファイルを開ã‘ã¾ã›ã‚“
+ </string>
+ <string name="AssetErrorFileNotFound">
+ ファイルãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“
+ </string>
+ <string name="AssetErrorTCPTimeout">
+ ファイルã®è»¢é€ã‚¿ã‚¤ãƒ ã‚¢ã‚¦ãƒˆ
+ </string>
+ <string name="AssetErrorCircuitGone">
+ サーキットエラー
+ </string>
+ <string name="AssetErrorPriceMismatch">
+ ビューワã¨ã‚µãƒ¼ãƒãƒ¼ã®ä¾¡æ ¼ãŒä¸€è‡´ã—ã¦ã„ã¾ã›ã‚“
+ </string>
+ <string name="AssetErrorUnknownStatus">
+ 䏿˜Žã®ã‚¹ãƒ†ãƒ¼ã‚¿ã‚¹
+ </string>
+ <string name="texture">
+ テクスãƒãƒ£
+ </string>
+ <string name="sound">
+ サウンド
+ </string>
+ <string name="calling card">
+ コーリングカード
+ </string>
+ <string name="landmark">
+ ランドマーク
+ </string>
+ <string name="legacy script">
+ レガシースクリプト
+ </string>
+ <string name="clothing">
+ 衣類
+ </string>
+ <string name="object">
+ オブジェクト
+ </string>
+ <string name="note card">
+ ノートカード
+ </string>
+ <string name="folder">
+ フォルダ
+ </string>
+ <string name="root">
+ ルート
+ </string>
+ <string name="lsl2 script">
+ LSL2 スクリプト
+ </string>
+ <string name="lsl bytecode">
+ LSL ãƒã‚¤ãƒˆã‚³ãƒ¼ãƒ‰
+ </string>
+ <string name="tga texture">
+ tga テクスãƒãƒ£
+ </string>
+ <string name="body part">
+ 身体部ä½
+ </string>
+ <string name="snapshot">
+ スナップショット
+ </string>
+ <string name="lost and found">
+ 紛失物
+ </string>
+ <string name="targa image">
+ targa ç”»åƒ
+ </string>
+ <string name="trash">
+ ã”ã¿ç®±
+ </string>
+ <string name="jpeg image">
+ jpeg ç”»åƒ
+ </string>
+ <string name="animation">
+ アニメーション
+ </string>
+ <string name="gesture">
+ ジェスãƒãƒ£ãƒ¼
+ </string>
+ <string name="simstate">
+ 統計
+ </string>
+ <string name="favorite">
+ ãŠæ°—ã«å…¥ã‚Š
+ </string>
+ <string name="symbolic link">
+ リンク
+ </string>
+ <string name="symbolic folder link">
+ フォルダã®ãƒªãƒ³ã‚¯
+ </string>
+ <string name="mesh">
+ メッシュ
+ </string>
+ <string name="AvatarEditingAppearance">
+ (容姿ã®ç·¨é›†ä¸­ï¼‰
+ </string>
+ <string name="AvatarAway">
+ 一時退席中
+ </string>
+ <string name="AvatarBusy">
+ å–り込ã¿ä¸­
+ </string>
+ <string name="AvatarMuted">
+ ブロック中
+ </string>
+ <string name="anim_express_afraid">
+ 怖れ
+ </string>
+ <string name="anim_express_anger">
+ 怒り
+ </string>
+ <string name="anim_away">
+ 退席中
+ </string>
+ <string name="anim_backflip">
+ 後ã‚宙返り
+ </string>
+ <string name="anim_express_laugh">
+ 大笑ã„
+ </string>
+ <string name="anim_express_toothsmile">
+ 満é¢ã®ç¬‘é¡”
+ </string>
+ <string name="anim_blowkiss">
+ 投ã’キッス
+ </string>
+ <string name="anim_express_bored">
+ 退屈
+ </string>
+ <string name="anim_bow">
+ ãŠã˜ãŽ
+ </string>
+ <string name="anim_clap">
+ æ‹æ‰‹
+ </string>
+ <string name="anim_courtbow">
+ æ·±ã„ãŠã˜ãŽ
+ </string>
+ <string name="anim_express_cry">
+ æ³£ã
+ </string>
+ <string name="anim_dance1">
+ ダンス 1
+ </string>
+ <string name="anim_dance2">
+ ダンス 2
+ </string>
+ <string name="anim_dance3">
+ ダンス 3
+ </string>
+ <string name="anim_dance4">
+ ダンス 4
+ </string>
+ <string name="anim_dance5">
+ ダンス 5
+ </string>
+ <string name="anim_dance6">
+ ダンス 6
+ </string>
+ <string name="anim_dance7">
+ ダンス 7
+ </string>
+ <string name="anim_dance8">
+ ダンス 8
+ </string>
+ <string name="anim_express_disdain">
+ 侮蔑
+ </string>
+ <string name="anim_drink">
+ é…”ã£ã±ã‚‰ã†
+ </string>
+ <string name="anim_express_embarrased">
+ 困惑
+ </string>
+ <string name="anim_angry_fingerwag">
+ 指を振る
+ </string>
+ <string name="anim_fist_pump">
+ ガッツãƒãƒ¼ã‚º
+ </string>
+ <string name="anim_yoga_float">
+ ヨガ浮éŠ
+ </string>
+ <string name="anim_express_frown">
+ ã—ã‹ã‚ã£é¢
+ </string>
+ <string name="anim_impatient">
+ ã„らã„らã™ã‚‹
+ </string>
+ <string name="anim_jumpforjoy">
+ 飛ã³ä¸ŠãŒã£ã¦å–œã¶
+ </string>
+ <string name="anim_kissmybutt">
+ 挑発ãƒãƒ¼ã‚º
+ </string>
+ <string name="anim_express_kiss">
+ キス
+ </string>
+ <string name="anim_laugh_short">
+ 笑ã†
+ </string>
+ <string name="anim_musclebeach">
+ 力ã“ã¶ã‚’見ã›ã‚‹
+ </string>
+ <string name="anim_no_unhappy">
+ 䏿º€ã’ã«å¦å®šã™ã‚‹
+ </string>
+ <string name="anim_no_head">
+ å¦å®šã™ã‚‹
+ </string>
+ <string name="anim_nyanya">
+ 冷やã‹ã™
+ </string>
+ <string name="anim_punch_onetwo">
+ ワンツー・パンãƒ
+ </string>
+ <string name="anim_express_open_mouth">
+ å£ã‚’é–‹ã‘ã¦é©šã
+ </string>
+ <string name="anim_peace">
+ ピース・サイン
+ </string>
+ <string name="anim_point_you">
+ 他人を指差ã™
+ </string>
+ <string name="anim_point_me">
+ 自分を指差ã™
+ </string>
+ <string name="anim_punch_l">
+ 左パンãƒ
+ </string>
+ <string name="anim_punch_r">
+ å³ãƒ‘ンãƒ
+ </string>
+ <string name="anim_rps_countdown">
+ ã˜ã‚ƒã‚“ã‘ã‚“ãƒãƒ¼ã‚º
+ </string>
+ <string name="anim_rps_paper">
+ パー
+ </string>
+ <string name="anim_rps_rock">
+ グー
+ </string>
+ <string name="anim_rps_scissors">
+ ãƒãƒ§ã‚­
+ </string>
+ <string name="anim_express_repulsed">
+ 嫌悪感
+ </string>
+ <string name="anim_kick_roundhouse_r">
+ ã¾ã‚ã—蹴り
+ </string>
+ <string name="anim_express_sad">
+ 悲ã—ã‚€
+ </string>
+ <string name="anim_salute">
+ 敬礼ã™ã‚‹
+ </string>
+ <string name="anim_shout">
+ å«ã¶
+ </string>
+ <string name="anim_express_shrug">
+ è‚©ã‚’ã™ãã‚ã‚‹
+ </string>
+ <string name="anim_express_smile">
+ 微笑む
+ </string>
+ <string name="anim_smoke_idle">
+ ãŸã°ã“ã‚’ãゆらã™
+ </string>
+ <string name="anim_smoke_inhale">
+ ãŸã°ã“ã‚’å¸ã†
+ </string>
+ <string name="anim_smoke_throw_down">
+ ãŸã°ã“ã‚’æ¨ã¦ã‚‹
+ </string>
+ <string name="anim_express_surprise">
+ 驚ã
+ </string>
+ <string name="anim_sword_strike_r">
+ å‰£ã§æ–¬ã‚Šã¤ã‘ã‚‹
+ </string>
+ <string name="anim_angry_tantrum">
+ ã˜ã ã‚“ã ã‚’è¸ã‚€
+ </string>
+ <string name="anim_express_tongue_out">
+ 舌を出ã™
+ </string>
+ <string name="anim_hello">
+ 手を振る
+ </string>
+ <string name="anim_whisper">
+ å°å£°ã§è©±ã™
+ </string>
+ <string name="anim_whistle">
+ å£ç¬›ã‚’å¹ã
+ </string>
+ <string name="anim_express_wink">
+ ウィンク
+ </string>
+ <string name="anim_wink_hollywood">
+ ウィンク(ãƒãƒªã‚¦ãƒƒãƒ‰)
+ </string>
+ <string name="anim_express_worry">
+ 心é…ã™ã‚‹
+ </string>
+ <string name="anim_yes_happy">
+ 笑顔ã§é ·ã
+ </string>
+ <string name="anim_yes_head">
+ é ·ã
+ </string>
+ <string name="multiple_textures">
+ 複数
+ </string>
+ <string name="texture_loading">
+ ローディング...
+ </string>
+ <string name="worldmap_offline">
+ オフライン
+ </string>
+ <string name="worldmap_item_tooltip_format">
+ [AREA] 平方メートル L$[PRICE]
+ </string>
+ <string name="worldmap_results_none_found">
+ 見ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚
+ </string>
+ <string name="Ok">
+ OK
+ </string>
+ <string name="Premature end of file">
+ ä¸å®Œå…¨ãªãƒ•ァイル
+ </string>
+ <string name="ST_NO_JOINT">
+ ROOT ã¾ãŸã¯ JOINT ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“
+ </string>
+ <string name="whisper">
+ ã®ã•ã•ã‚„ã:
+ </string>
+ <string name="shout">
+ ã®å«ã³:
+ </string>
+ <string name="ringing">
+ インワールドボイスãƒãƒ£ãƒƒãƒˆã«æŽ¥ç¶šä¸­...
+ </string>
+ <string name="connected">
+ 接続ã—ã¾ã—ãŸ
+ </string>
+ <string name="unavailable">
+ ç¾åœ¨åœ°ã§ã¯ã€ãƒœã‚¤ã‚¹ã‚’利用ã§ãã¾ã›ã‚“。
+ </string>
+ <string name="hang_up">
+ インワールドボイスãƒãƒ£ãƒƒãƒˆã®é€šè©±ãŒåˆ‡æ–­ã•れã¾ã—ãŸ
+ </string>
+ <string name="reconnect_nearby">
+ 「近ãã®ãƒœã‚¤ã‚¹ãƒãƒ£ãƒƒãƒˆã€ã«å†æŽ¥ç¶šã•れã¾ã™
+ </string>
+ <string name="ScriptQuestionCautionChatGranted">
+ [REGIONNAME] ã® [REGIONPOS] ã¨ã„ã†å ´æ‰€ã«ã‚ã‚‹ã€ã€Œ [OWNERNAME] ã€ãŒæ‰€æœ‰ã™ã‚‹ã€Œ [OBJECTNAME] ã€ã¨ã„ã†ã‚ªãƒ–ジェクトã¯ã€æ¬¡ã®æ¨©é™ã‚’許å¯ã—ã¾ã—ãŸï¼š [PERMISSIONS]
+ </string>
+ <string name="ScriptQuestionCautionChatDenied">
+ [REGIONNAME] ã® [REGIONPOS] ã¨ã„ã†å ´æ‰€ã«ã‚ã‚‹ã€ã€Œ [OWNERNAME] ã€ãŒæ‰€æœ‰ã™ã‚‹ã€Œ [OBJECTNAME] ã€ã¨ã„ã†ã‚ªãƒ–ジェクトã¯ã€æ¬¡ã®æ¨©é™ã‚’æ‹’å¦ã—ã¾ã—ãŸï¼š [PERMISSIONS]
+ </string>
+ <string name="ScriptTakeMoney">
+ リンデンドル(L$)を支払ã†
+ </string>
+ <string name="ActOnControlInputs">
+ 制御入力ã«åŸºã¥ã„ã¦è¡Œå‹•
+ </string>
+ <string name="RemapControlInputs">
+ 制御入力ã®ãƒªãƒžãƒƒãƒ—
+ </string>
+ <string name="AnimateYourAvatar">
+ ã‚¢ãƒã‚¿ãƒ¼ã¸ã®ã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³å‹•作
+ </string>
+ <string name="AttachToYourAvatar">
+ ã‚¢ãƒã‚¿ãƒ¼ã«è£…ç€
+ </string>
+ <string name="ReleaseOwnership">
+ 所有権を解放ã—å…¬ã®ã‚‚ã®ã¨ã™ã‚‹
+ </string>
+ <string name="LinkAndDelink">
+ ä»–ã®ã‚ªãƒ–ジェクトã®ãƒªãƒ³ã‚¯ã¨ãƒªãƒ³ã‚¯è§£é™¤
+ </string>
+ <string name="AddAndRemoveJoints">
+ ä»–ã®ã‚ªãƒ–ジェクトã¨ã®ã‚¸ãƒ§ã‚¤ãƒ³ãƒˆã®è¿½åŠ ã¨å‰Šé™¤
+ </string>
+ <string name="ChangePermissions">
+ 権é™ã®å¤‰æ›´
+ </string>
+ <string name="TrackYourCamera">
+ カメラ追従
+ </string>
+ <string name="ControlYourCamera">
+ カメラã®ã‚³ãƒ³ãƒˆãƒ­ãƒ¼ãƒ«
+ </string>
+ <string name="NotConnected">
+ 接続ã•れã¦ã„ã¾ã›ã‚“
+ </string>
+ <string name="SIM_ACCESS_PG">
+ General
+ </string>
+ <string name="SIM_ACCESS_MATURE">
+ Moderate
+ </string>
+ <string name="SIM_ACCESS_ADULT">
+ Adult
+ </string>
+ <string name="SIM_ACCESS_DOWN">
+ オフライン
+ </string>
+ <string name="SIM_ACCESS_MIN">
+ 䏿˜Ž
+ </string>
+ <string name="land_type_unknown">
+ ï¼ˆä¸æ˜Žï¼‰
+ </string>
+ <string name="Estate / Full Region">
+ ä¸å‹•産 / フルリージョン
+ </string>
+ <string name="Estate / Homestead">
+ エステート/ホームステッド
+ </string>
+ <string name="Mainland / Homestead">
+ メインランド/ホームステッド
+ </string>
+ <string name="Mainland / Full Region">
+ メインランド / フルリージョン
+ </string>
+ <string name="all_files">
+ å…¨ã¦ã®ãƒ•ァイル
+ </string>
+ <string name="sound_files">
+ サウンド
+ </string>
+ <string name="animation_files">
+ アニメーション
+ </string>
+ <string name="image_files">
+ ç”»åƒ
+ </string>
+ <string name="save_file_verb">
+ ä¿å­˜
+ </string>
+ <string name="load_file_verb">
+ ロード
+ </string>
+ <string name="targa_image_files">
+ Targa ç”»åƒ
+ </string>
+ <string name="bitmap_image_files">
+ ビットマップ画åƒ
+ </string>
+ <string name="avi_movie_file">
+ AVI ムービーファイル
+ </string>
+ <string name="xaf_animation_file">
+ XAF アニメーションファイル
+ </string>
+ <string name="xml_file">
+ XML ファイル
+ </string>
+ <string name="raw_file">
+ RAW ファイル
+ </string>
+ <string name="compressed_image_files">
+ 圧縮画åƒ
+ </string>
+ <string name="load_files">
+ ファイルã®ãƒ­ãƒ¼ãƒ‰
+ </string>
+ <string name="choose_the_directory">
+ å‚ç…§
+ </string>
+ <string name="script_files">
+ スクリプト
+ </string>
+ <string name="AvatarSetNotAway">
+ 一時退席中解除
+ </string>
+ <string name="AvatarSetAway">
+ 一時退席中
+ </string>
+ <string name="AvatarSetNotBusy">
+ å–り込ã¿ä¸­è§£é™¤
+ </string>
+ <string name="AvatarSetBusy">
+ å–り込ã¿ä¸­
+ </string>
+ <string name="shape">
+ シェイプ
+ </string>
+ <string name="skin">
+ スキン
+ </string>
+ <string name="hair">
+ 髪
+ </string>
+ <string name="eyes">
+ ç›®
+ </string>
+ <string name="shirt">
+ シャツ
+ </string>
+ <string name="pants">
+ パンツ
+ </string>
+ <string name="shoes">
+ é´
+ </string>
+ <string name="socks">
+ é´ä¸‹
+ </string>
+ <string name="jacket">
+ ジャケット
+ </string>
+ <string name="gloves">
+ 手袋
+ </string>
+ <string name="undershirt">
+ 下ç€ã‚·ãƒ£ãƒ„
+ </string>
+ <string name="underpants">
+ 下ç€ãƒ‘ンツ
+ </string>
+ <string name="skirt">
+ スカート
+ </string>
+ <string name="alpha">
+ アルファ
+ </string>
+ <string name="tattoo">
+ タトゥ
+ </string>
+ <string name="physics">
+ 物ç†ä½œç”¨
+ </string>
+ <string name="invalid">
+ 無効
+ </string>
+ <string name="none">
+ ãªã—
+ </string>
+ <string name="shirt_not_worn">
+ シャツ未ç€ç”¨
+ </string>
+ <string name="pants_not_worn">
+ パンツ未ç€ç”¨
+ </string>
+ <string name="shoes_not_worn">
+ é´æœªç€ç”¨
+ </string>
+ <string name="socks_not_worn">
+ é´ä¸‹æœªç€ç”¨
+ </string>
+ <string name="jacket_not_worn">
+ ジャケット未ç€ç”¨
+ </string>
+ <string name="gloves_not_worn">
+ 手袋未ç€ç”¨
+ </string>
+ <string name="undershirt_not_worn">
+ 下ç€ï¼ˆä¸Šï¼‰æœªç€ç”¨
+ </string>
+ <string name="underpants_not_worn">
+ 下ç€ï¼ˆä¸‹ï¼‰æœªç€ç”¨
+ </string>
+ <string name="skirt_not_worn">
+ スカート未ç€ç”¨
+ </string>
+ <string name="alpha_not_worn">
+ アルファ未ç€ç”¨
+ </string>
+ <string name="tattoo_not_worn">
+ タトゥー未ç€ç”¨
+ </string>
+ <string name="physics_not_worn">
+ 物ç†ä½œç”¨ãªã—
+ </string>
+ <string name="invalid_not_worn">
+ 無効
+ </string>
+ <string name="create_new_shape">
+ æ–°ã—ã„シェイプを作æˆ
+ </string>
+ <string name="create_new_skin">
+ æ–°ã—ã„スキンを作æˆ
+ </string>
+ <string name="create_new_hair">
+ æ–°ã—ã„髪を作æˆ
+ </string>
+ <string name="create_new_eyes">
+ æ–°ã—ã„目を作æˆ
+ </string>
+ <string name="create_new_shirt">
+ æ–°ã—ã„シャツを作æˆ
+ </string>
+ <string name="create_new_pants">
+ æ–°ã—ã„パンツを作æˆ
+ </string>
+ <string name="create_new_shoes">
+ æ–°ã—ã„é´ã‚’作æˆ
+ </string>
+ <string name="create_new_socks">
+ æ–°ã—ã„é´ä¸‹ã‚’作æˆ
+ </string>
+ <string name="create_new_jacket">
+ æ–°ã—ã„上ç€ã‚’作æˆ
+ </string>
+ <string name="create_new_gloves">
+ æ–°ã—ã„æ‰‹è¢‹ã‚’作æˆ
+ </string>
+ <string name="create_new_undershirt">
+ æ–°ã—ã„下ç€ã‚·ãƒ£ãƒ„を作æˆ
+ </string>
+ <string name="create_new_underpants">
+ æ–°ã—ã„下ç€ãƒ‘ンツを作æˆ
+ </string>
+ <string name="create_new_skirt">
+ æ–°ã—ã„スカートを作æˆ
+ </string>
+ <string name="create_new_alpha">
+ æ–°ã—ã„アルファを作æˆ
+ </string>
+ <string name="create_new_tattoo">
+ æ–°ã—ã„タトゥを作æˆ
+ </string>
+ <string name="create_new_physics">
+ æ–°ã—ã„物ç†ä½œç”¨ã‚’作æˆ
+ </string>
+ <string name="create_new_invalid">
+ 無効
+ </string>
+ <string name="NewWearable">
+ æ–°ã—ã„ [WEARABLE_ITEM]
+ </string>
+ <string name="next">
+ 次ã¸
+ </string>
+ <string name="ok">
+ OK
+ </string>
+ <string name="GroupNotifyGroupNotice">
+ グループ通知
+ </string>
+ <string name="GroupNotifyGroupNotices">
+ グループ通知
+ </string>
+ <string name="GroupNotifySentBy">
+ é€ä¿¡è€…
+ </string>
+ <string name="GroupNotifyAttached">
+ 添付:
+ </string>
+ <string name="GroupNotifyViewPastNotices">
+ ã“ã“ã§éŽåŽ»ã®é€šçŸ¥ã‚’表示ã™ã‚‹ã‹ã€ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’å—ã‘å–らãªã„設定をã—ã¾ã™ã€‚
+ </string>
+ <string name="GroupNotifyOpenAttachment">
+ 添付アイテムを開ã
+ </string>
+ <string name="GroupNotifySaveAttachment">
+ 添付アイテムをä¿å­˜
+ </string>
+ <string name="TeleportOffer">
+ テレãƒãƒ¼ãƒˆã‚’é€ã‚‹
+ </string>
+ <string name="StartUpNotifications">
+ ä¸åœ¨ä¸­ã«æ–°ã—ã„通知ãŒå±Šãã¾ã—ãŸã€‚
+ </string>
+ <string name="OverflowInfoChannelString">
+ ã‚ãªãŸã«ã¯ã•ら㫠%d 通ã®é€šçŸ¥ãŒã‚りã¾ã™
+ </string>
+ <string name="BodyPartsRightArm">
+ å³è…•
+ </string>
+ <string name="BodyPartsHead">
+ é ­
+ </string>
+ <string name="BodyPartsLeftArm">
+ 左腕
+ </string>
+ <string name="BodyPartsLeftLeg">
+ 左脚
+ </string>
+ <string name="BodyPartsTorso">
+ 上åŠèº«
+ </string>
+ <string name="BodyPartsRightLeg">
+ å³è„š
+ </string>
+ <string name="GraphicsQualityLow">
+ 低
+ </string>
+ <string name="GraphicsQualityMid">
+ 中
+ </string>
+ <string name="GraphicsQualityHigh">
+ 高
+ </string>
+ <string name="LeaveMouselook">
+ ESC キーを押ã—ã¦ãƒ¯ãƒ¼ãƒ«ãƒ‰ãƒ“ãƒ¥ãƒ¼ã«æˆ»ã‚Šã¾ã™
+ </string>
+ <string name="InventoryNoMatchingItems">
+ ãŠæŽ¢ã—ã®ã‚‚ã®ã¯è¦‹ã¤ã‹ã‚Šã¾ã—ãŸã‹ï¼Ÿ [secondlife:///app/search/all/[SEARCH_TERM] 検索] ã‚’ãŠè©¦ã—ãã ã•ã„。
+ </string>
+ <string name="PlacesNoMatchingItems">
+ ãŠæŽ¢ã—ã®ã‚‚ã®ã¯è¦‹ã¤ã‹ã‚Šã¾ã—ãŸã‹ï¼Ÿ [secondlife:///app/search/places/[SEARCH_TERM] 検索] ã‚’ãŠè©¦ã—ãã ã•ã„。
+ </string>
+ <string name="FavoritesNoMatchingItems">
+ ã“ã“ã«ãƒ©ãƒ³ãƒ‰ãƒžãƒ¼ã‚¯ã‚’ドラッグã—ã¦ãŠæ°—ã«å…¥ã‚Šã«è¿½åŠ ã—ã¾ã™ã€‚
+ </string>
+ <string name="InventoryNoTexture">
+ インベントリ内ã«ã“ã®ãƒ†ã‚¯ã‚¹ãƒãƒ£ã®ã‚³ãƒ”ーãŒã‚りã¾ã›ã‚“
+ </string>
+ <string name="InventoryInboxNoItems">
+ マーケットプレイスã§è³¼å…¥ã—ãŸå•†å“ã¯ã“ã“ã«è¡¨ç¤ºã•れã¾ã™ã€‚ãã®å¾Œã€ã‚¢ã‚¤ãƒ†ãƒ ã‚’インベントリã«ãƒ‰ãƒ©ãƒƒã‚°ã™ã‚Œã°ã€ãれらã®ã‚¢ã‚¤ãƒ†ãƒ ã‚’使用ã§ãã¾ã™ã€‚
+ </string>
+ <string name="MarketplaceURL">
+ https://marketplace.[MARKETPLACE_DOMAIN_NAME]/
+ </string>
+ <string name="MarketplaceURL_CreateStore">
+ http://community.secondlife.com/t5/English-Knowledge-Base/Selling-in-the-Marketplace/ta-p/700193#Section_.4
+ </string>
+ <string name="MarketplaceURL_Dashboard">
+ https://marketplace.[MARKETPLACE_DOMAIN_NAME]/merchants/store/dashboard
+ </string>
+ <string name="MarketplaceURL_Imports">
+ https://marketplace.[MARKETPLACE_DOMAIN_NAME]/merchants/store/imports
+ </string>
+ <string name="MarketplaceURL_LearnMore">
+ https://marketplace.[MARKETPLACE_DOMAIN_NAME]/learn_more
+ </string>
+ <string name="InventoryOutboxNotMerchantTitle">
+ マーケットプレイスã§ã¯èª°ã§ã‚‚アイテムを売るã“ã¨ãŒã§ãã¾ã™ã€‚
+ </string>
+ <string name="InventoryOutboxNotMerchantTooltip"/>
+ <string name="InventoryOutboxNotMerchant">
+ マーãƒãƒ£ãƒ³ãƒˆã«ãªã‚ŠãŸã„æ–¹ã¯ã€[[MARKETPLACE_CREATE_STORE_URL] マーケットプレイスストアを作æˆ]ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚
+ </string>
+ <string name="InventoryOutboxNoItemsTitle">
+ アウトボックスã¯ç©ºã§ã™ã€‚
+ </string>
+ <string name="InventoryOutboxNoItemsTooltip"/>
+ <string name="InventoryOutboxNoItems">
+ [[MARKETPLACE_DASHBOARD_URL] マーケットプレイス]ã«è²©å£²ã™ã‚‹ã‚¢ã‚¤ãƒ†ãƒ ã‚’一覧ã™ã‚‹ã«ã¯ã€ãƒ•ォルダをã“ã®ã‚¨ãƒªã‚¢ã«ãƒ‰ãƒ©ãƒƒã‚°ã—ã€ã€Œãƒžãƒ¼ã‚±ãƒƒãƒˆãƒ—レイスã«é€ä¿¡ã€ã‚’クリックã—ã¾ã™ã€‚
+ </string>
+ <string name="Marketplace Error None">
+ エラーãªã—
+ </string>
+ <string name="Marketplace Error Not Merchant">
+ エラー:マーケットプレイスã«ã‚¢ã‚¤ãƒ†ãƒ ã‚’é€ã‚‹å‰ã«ã€ã‚ãªãŸè‡ªèº«ã‚’マーãƒãƒ£ãƒ³ãƒˆç™»éŒ²ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ï¼ˆç™»éŒ²ã¯ç„¡æ–™ã§ã™ï¼‰ã€‚
+ </string>
+ <string name="Marketplace Error Empty Folder">
+ エラー:ã“ã®ãƒ•ォルダã¯ç©ºã§ã™ã€‚
+ </string>
+ <string name="Marketplace Error Unassociated Products">
+ エラー:ã‚ãªãŸã®ãƒžãƒ¼ãƒãƒ£ãƒ³ãƒˆã‚¢ã‚«ã‚¦ãƒ³ãƒˆã«ã¯ã€å•†å“ã«é–¢é€£ä»˜ã‘られã¦ã„ãªã„アイテムãŒå¤šã™ãŽã‚‹ãŸã‚ã€ã“ã®ã‚¢ã‚¤ãƒ†ãƒ ã‚’アップロードã§ãã¾ã›ã‚“ã§ã—ãŸã€‚ã“ã®ã‚¨ãƒ©ãƒ¼ã‚’解消ã™ã‚‹ã«ã¯ã€ãƒžãƒ¼ã‚±ãƒƒãƒˆãƒ—レイス㮠Web サイトã«ãƒ­ã‚°ã‚¤ãƒ³ã—ã€é–¢é€£ä»˜ã‘られã¦ã„ãªã„ã‚¢ã‚¤ãƒ†ãƒ ã®æ•°ã‚’減らã—ã¦ãã ã•ã„。
+ </string>
+ <string name="Marketplace Error Object Limit">
+ エラー:ã“ã®ã‚¢ã‚¤ãƒ†ãƒ ã«å«ã¾ã‚Œã‚‹ã‚ªãƒ–ジェクトãŒå¤šã™ãŽã¾ã™ã€‚オブジェクトをã„ãã¤ã‹ãƒœãƒƒã‚¯ã‚¹ã«ã¾ã¨ã‚ã€ã‚ªãƒ–ジェクト数を200ä»¥ä¸‹ã«æ¸›ã‚‰ã—ã¦ãã ã•ã„。
+ </string>
+ <string name="Marketplace Error Folder Depth">
+ エラー:ã“ã®ã‚¢ã‚¤ãƒ†ãƒ ã¯ãƒã‚¹ãƒˆå…¥ã‚Šãƒ•ォルダã®éšŽå±¤ãŒå¤šã™ãŽã¾ã™ã€‚ãƒã‚¹ãƒˆå…¥ã‚Šãƒ•ォルダを 3 階層以内ã«ã¾ã¨ã‚ç›´ã—ã¦ãã ã•ã„。
+ </string>
+ <string name="Marketplace Error Unsellable Item">
+ エラー:ã“ã®ã‚¢ã‚¤ãƒ†ãƒ ã‚’マーケットプレイスã§è²©å£²ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。
+ </string>
+ <string name="Marketplace Error Internal Import">
+ エラー:ã“ã®ã‚¢ã‚¤ãƒ†ãƒ ã«é–¢ã—ã¦å•題ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚ã—ã°ã‚‰ãã—ã¦ã‹ã‚‰ãŠè©¦ã—ãã ã•ã„。
+ </string>
+ <string name="Open landmarks">
+ ランドマークを開ã
+ </string>
+ <string name="no_transfer" value=" (å†è²©ãƒ»ãƒ—レゼントä¸å¯ï¼‰"/>
+ <string name="no_modify" value=" (編集ä¸å¯ï¼‰"/>
+ <string name="no_copy" value=" (コピーä¸å¯ï¼‰"/>
+ <string name="worn" value=" (ç€ç”¨ä¸­ï¼‰"/>
+ <string name="link" value=" (リンク)"/>
+ <string name="broken_link" value=" (壊れãŸãƒªãƒ³ã‚¯ï¼‰"/>
+ <string name="LoadingContents">
+ コンテンツをロード中ã§ã™...
+ </string>
+ <string name="NoContents">
+ コンテンツãªã—
+ </string>
+ <string name="WornOnAttachmentPoint" value=" ([ATTACHMENT_POINT] ã«è£…ç€ä¸­ï¼‰"/>
+ <string name="ActiveGesture" value="[GESLABEL] (アクティブ)"/>
+ <string name="PermYes">
+ ã¯ã„
+ </string>
+ <string name="PermNo">
+ ã„ã„ãˆ
+ </string>
+ <string name="Chat Message" value="ãƒãƒ£ãƒƒãƒˆï¼š"/>
+ <string name="Sound" value=" サウンド:"/>
+ <string name="Wait" value=" --- 待機::"/>
+ <string name="AnimFlagStop" value=" ã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³ã‚’åœæ­¢ï¼š"/>
+ <string name="AnimFlagStart" value=" アニメーションを開始:"/>
+ <string name="Wave" value=" 手を振る"/>
+ <string name="GestureActionNone" value="ãªã—"/>
+ <string name="HelloAvatar" value=" ã‚„ã‚ã€ã‚¢ãƒã‚¿ãƒ¼ï¼"/>
+ <string name="ViewAllGestures" value=" ã™ã¹ã¦è¡¨ç¤º &gt;&gt;"/>
+ <string name="GetMoreGestures" value="ショッピング &gt;&gt;"/>
+ <string name="Animations" value="アニメーションã€"/>
+ <string name="Calling Cards" value="コーリングカードã€"/>
+ <string name="Clothing" value="衣類ã€"/>
+ <string name="Gestures" value="ジェスãƒãƒ£ãƒ¼ã€"/>
+ <string name="Landmarks" value="ランドマークã€"/>
+ <string name="Notecards" value="ノートカードã€"/>
+ <string name="Objects" value="オブジェクトã€"/>
+ <string name="Scripts" value="スクリプトã€"/>
+ <string name="Sounds" value="サウンドã€"/>
+ <string name="Textures" value="テクスãƒãƒ£ã€"/>
+ <string name="Snapshots" value="スナップショットã€"/>
+ <string name="No Filters" value="ã„ã„㈠"/>
+ <string name="Since Logoff" value=" - ログオフ以æ¥"/>
+ <string name="InvFolder My Inventory">
+ インベントリ
+ </string>
+ <string name="InvFolder Library">
+ ライブラリ
+ </string>
+ <string name="InvFolder Textures">
+ テクスãƒãƒ£
+ </string>
+ <string name="InvFolder Sounds">
+ サウンド
+ </string>
+ <string name="InvFolder Calling Cards">
+ コーリングカード
+ </string>
+ <string name="InvFolder Landmarks">
+ ランドマーク
+ </string>
+ <string name="InvFolder Scripts">
+ スクリプト
+ </string>
+ <string name="InvFolder Clothing">
+ 衣類
+ </string>
+ <string name="InvFolder Objects">
+ オブジェクト
+ </string>
+ <string name="InvFolder Notecards">
+ ノートカード
+ </string>
+ <string name="InvFolder New Folder">
+ æ–°è¦ãƒ•ォルダ
+ </string>
+ <string name="InvFolder Inventory">
+ インベントリ
+ </string>
+ <string name="InvFolder Uncompressed Images">
+ 圧縮ã•れã¦ã„ãªã„ç”»åƒ
+ </string>
+ <string name="InvFolder Body Parts">
+ 身体部ä½
+ </string>
+ <string name="InvFolder Trash">
+ ã”ã¿ç®±
+ </string>
+ <string name="InvFolder Photo Album">
+ フォトアルãƒãƒ 
+ </string>
+ <string name="InvFolder Lost And Found">
+ 紛失物
+ </string>
+ <string name="InvFolder Uncompressed Sounds">
+ 圧縮ã•れã¦ã„ãªã„サウンド
+ </string>
+ <string name="InvFolder Animations">
+ アニメーション
+ </string>
+ <string name="InvFolder Gestures">
+ ジェスãƒãƒ£ãƒ¼
+ </string>
+ <string name="InvFolder Favorite">
+ ãŠæ°—ã«å…¥ã‚Š
+ </string>
+ <string name="InvFolder favorite">
+ ãŠæ°—ã«å…¥ã‚Š
+ </string>
+ <string name="InvFolder Current Outfit">
+ ç€ç”¨ä¸­ã®ã‚¢ã‚¦ãƒˆãƒ•ィット
+ </string>
+ <string name="InvFolder Initial Outfits">
+ 最åˆã®ã‚¢ã‚¦ãƒˆãƒ•ィット
+ </string>
+ <string name="InvFolder My Outfits">
+ マイ アウトフィット
+ </string>
+ <string name="InvFolder Accessories">
+ アクセサリ
+ </string>
+ <string name="InvFolder Meshes">
+ メッシュ
+ </string>
+ <string name="InvFolder Friends">
+ フレンド
+ </string>
+ <string name="InvFolder All">
+ 全員
+ </string>
+ <string name="no_attachments">
+ ç€ç”¨ã—ã¦ã„るアタッãƒãƒ¡ãƒ³ãƒˆã¯ã‚りã¾ã›ã‚“
+ </string>
+ <string name="Attachments remain">
+ アタッãƒãƒ¡ãƒ³ãƒˆï¼ˆæ®‹ã‚Šã®ã‚¹ãƒ­ãƒƒãƒˆæ•°ï¼š[COUNT])
+ </string>
+ <string name="Buy">
+ è²·ã†
+ </string>
+ <string name="BuyforL$">
+ L$ ã§è³¼å…¥
+ </string>
+ <string name="Stone">
+ 石
+ </string>
+ <string name="Metal">
+ 金属
+ </string>
+ <string name="Glass">
+ ガラス
+ </string>
+ <string name="Wood">
+ 木
+ </string>
+ <string name="Flesh">
+ 肌
+ </string>
+ <string name="Plastic">
+ プラスãƒãƒƒã‚¯
+ </string>
+ <string name="Rubber">
+ ゴム
+ </string>
+ <string name="Light">
+ ライト
+ </string>
+ <string name="KBShift">
+ Shift
+ </string>
+ <string name="KBCtrl">
+ Ctrl
+ </string>
+ <string name="Chest">
+ 胸部
+ </string>
+ <string name="Skull">
+ é ­è“‹
+ </string>
+ <string name="Left Shoulder">
+ 左肩
+ </string>
+ <string name="Right Shoulder">
+ å³è‚©
+ </string>
+ <string name="Left Hand">
+ 左手
+ </string>
+ <string name="Right Hand">
+ 峿‰‹
+ </string>
+ <string name="Left Foot">
+ 左足
+ </string>
+ <string name="Right Foot">
+ å³è¶³
+ </string>
+ <string name="Spine">
+ 背骨
+ </string>
+ <string name="Pelvis">
+ 骨盤
+ </string>
+ <string name="Mouth">
+ å£
+ </string>
+ <string name="Chin">
+ ã‚ã”
+ </string>
+ <string name="Left Ear">
+ 左耳
+ </string>
+ <string name="Right Ear">
+ å³è€³
+ </string>
+ <string name="Left Eyeball">
+ 左目眼çƒ
+ </string>
+ <string name="Right Eyeball">
+ å³ç›®çœ¼çƒ
+ </string>
+ <string name="Nose">
+ é¼»
+ </string>
+ <string name="R Upper Arm">
+ å³ä¸Šè…•
+ </string>
+ <string name="R Forearm">
+ å³å‰è…•
+ </string>
+ <string name="L Upper Arm">
+ 左上腕
+ </string>
+ <string name="L Forearm">
+ å·¦å‰è…•
+ </string>
+ <string name="Right Hip">
+ å³è…°
+ </string>
+ <string name="R Upper Leg">
+ å³ä¸Šè„š
+ </string>
+ <string name="R Lower Leg">
+ å³ä¸‹è„š
+ </string>
+ <string name="Left Hip">
+ 左腰
+ </string>
+ <string name="L Upper Leg">
+ 左上脚
+ </string>
+ <string name="L Lower Leg">
+ 左下脚
+ </string>
+ <string name="Stomach">
+ è…¹
+ </string>
+ <string name="Left Pec">
+ 左胸筋
+ </string>
+ <string name="Right Pec">
+ å³èƒ¸ç­‹
+ </string>
+ <string name="Neck">
+ 首
+ </string>
+ <string name="Avatar Center">
+ ã‚¢ãƒã‚¿ãƒ¼ã®ä¸­å¤®
+ </string>
+ <string name="Invalid Attachment">
+ 装ç€å…ˆãŒæ­£ã—ãã‚りã¾ã›ã‚“
+ </string>
+ <string name="YearsMonthsOld">
+ [AGEYEARS] [AGEMONTHS]
+ </string>
+ <string name="YearsOld">
+ [AGEYEARS]
+ </string>
+ <string name="MonthsOld">
+ [AGEMONTHS]
+ </string>
+ <string name="WeeksOld">
+ [AGEWEEKS]
+ </string>
+ <string name="DaysOld">
+ [AGEDAYS]
+ </string>
+ <string name="TodayOld">
+ 今日å‚加
+ </string>
+ <string name="AgeYearsA">
+ [COUNT] å¹´
+ </string>
+ <string name="AgeYearsB">
+ [COUNT] å¹´
+ </string>
+ <string name="AgeYearsC">
+ [COUNT] å¹´
+ </string>
+ <string name="AgeMonthsA">
+ [COUNT] ヶ月
+ </string>
+ <string name="AgeMonthsB">
+ [COUNT] ヶ月
+ </string>
+ <string name="AgeMonthsC">
+ [COUNT] ヶ月
+ </string>
+ <string name="AgeWeeksA">
+ [COUNT] 週間
+ </string>
+ <string name="AgeWeeksB">
+ [COUNT] 週間
+ </string>
+ <string name="AgeWeeksC">
+ [COUNT] 週間
+ </string>
+ <string name="AgeDaysA">
+ [COUNT] 日間
+ </string>
+ <string name="AgeDaysB">
+ [COUNT] 日間
+ </string>
+ <string name="AgeDaysC">
+ [COUNT] 日間
+ </string>
+ <string name="GroupMembersA">
+ [COUNT] 人
+ </string>
+ <string name="GroupMembersB">
+ [COUNT] 人
+ </string>
+ <string name="GroupMembersC">
+ [COUNT] 人
+ </string>
+ <string name="AcctTypeResident">
+ ä½äºº
+ </string>
+ <string name="AcctTypeTrial">
+ トライアル
+ </string>
+ <string name="AcctTypeCharterMember">
+ 創立メンãƒãƒ¼
+ </string>
+ <string name="AcctTypeEmployee">
+ Linden Lab 従業員
+ </string>
+ <string name="PaymentInfoUsed">
+ 支払情報使用履歴ã‚り
+ </string>
+ <string name="PaymentInfoOnFile">
+ 支払情報登録済
+ </string>
+ <string name="NoPaymentInfoOnFile">
+ 支払情報未登録
+ </string>
+ <string name="AgeVerified">
+ å¹´é½¢ç¢ºèªæ¸ˆ
+ </string>
+ <string name="NotAgeVerified">
+ 年齢未確èª
+ </string>
+ <string name="Center 2">
+ 中心 2
+ </string>
+ <string name="Top Right">
+ å³ä¸Š
+ </string>
+ <string name="Top">
+ 上部
+ </string>
+ <string name="Top Left">
+ 左上
+ </string>
+ <string name="Center">
+ 中心
+ </string>
+ <string name="Bottom Left">
+ 左下
+ </string>
+ <string name="Bottom">
+ 下部
+ </string>
+ <string name="Bottom Right">
+ å³ä¸‹
+ </string>
+ <string name="CompileQueueDownloadedCompiling">
+ ダウンロード完了ã€ã‚³ãƒ³ãƒ‘イル中
+ </string>
+ <string name="CompileQueueScriptNotFound">
+ サーãƒãƒ¼ä¸Šã«ã‚¹ã‚¯ãƒªãƒ—トãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。
+ </string>
+ <string name="CompileQueueProblemDownloading">
+ ダウンロードã«å•題ãŒã‚りã¾ã™
+ </string>
+ <string name="CompileQueueInsufficientPermDownload">
+ 権é™ä¸è¶³ã®ãŸã‚スクリプトをダウンロードã§ãã¾ã›ã‚“。
+ </string>
+ <string name="CompileQueueInsufficientPermFor">
+ 権é™ä¸è¶³ï¼š
+ </string>
+ <string name="CompileQueueUnknownFailure">
+ åŽŸå› ä¸æ˜Žã®å¤±æ•—ã«ã‚ˆã‚Šãƒ€ã‚¦ãƒ³ãƒ­ãƒ¼ãƒ‰ãŒã§ãã¾ã›ã‚“
+ </string>
+ <string name="CompileQueueTitle">
+ リコンパイル進行
+ </string>
+ <string name="CompileQueueStart">
+ リコンパイル
+ </string>
+ <string name="ResetQueueTitle">
+ 進行をリセット
+ </string>
+ <string name="ResetQueueStart">
+ リセット
+ </string>
+ <string name="RunQueueTitle">
+ 実行を続ã‘るよã†è¨­å®š
+ </string>
+ <string name="RunQueueStart">
+ 実行中ã«è¨­å®š
+ </string>
+ <string name="NotRunQueueTitle">
+ å®Ÿè¡Œã‚’åœæ­¢ã™ã‚‹ã‚ˆã†è¨­å®š
+ </string>
+ <string name="NotRunQueueStart">
+ å®Ÿè¡Œåœæ­¢ã«è¨­å®š
+ </string>
+ <string name="CompileSuccessful">
+ コンパイルãŒå®Œäº†ã—ã¾ã—ãŸï¼
+ </string>
+ <string name="CompileSuccessfulSaving">
+ コンパイル完了ã€ä¿å­˜ä¸­ã§ã™...
+ </string>
+ <string name="SaveComplete">
+ ä¿å­˜å®Œäº†ã€‚
+ </string>
+ <string name="ObjectOutOfRange">
+ スクリプト(オブジェクトãŒç¯„囲外ã«ã‚りã¾ã™ï¼‰
+ </string>
+ <string name="GodToolsObjectOwnedBy">
+ [OWNER] 所有ã®ã‚ªãƒ–ジェクト「[OBJECT]ã€
+ </string>
+ <string name="GroupsNone">
+ ãªã—
+ </string>
+ <string name="Group" value=" (グループ)"/>
+ <string name="Unknown">
+ ï¼ˆä¸æ˜Žï¼‰
+ </string>
+ <string name="SummaryForTheWeek" value="今週ã®ã¾ã¨ã‚。開始日ã¯"/>
+ <string name="NextStipendDay" value="ã§ã™ã€‚次回ã®ãŠå°é£ã„支給日:"/>
+ <string name="GroupPlanningDate">
+ [year,datetime,utc]/[mthnum,datetime,utc]/[day,datetime,utc]
+ </string>
+ <string name="GroupIndividualShare" value=" グループ 個人ã®å‰²ã‚Šå½“ã¦"/>
+ <string name="GroupColumn" value="グループã®è¨­å®š"/>
+ <string name="Balance">
+ 残高
+ </string>
+ <string name="Credits">
+ åŽå…¥
+ </string>
+ <string name="Debits">
+ 支出
+ </string>
+ <string name="Total">
+ åˆè¨ˆ
+ </string>
+ <string name="NoGroupDataFound">
+ グループã®ãƒ‡ãƒ¼ã‚¿ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸ
+ </string>
+ <string name="IMParentEstate">
+ parent estate
+ </string>
+ <string name="IMMainland">
+ メインランド
+ </string>
+ <string name="IMTeen">
+ ティーン
+ </string>
+ <string name="Anyone">
+ 全員
+ </string>
+ <string name="RegionInfoError">
+ エラー
+ </string>
+ <string name="RegionInfoAllEstatesOwnedBy">
+ [OWNER] ãŒæ‰€æœ‰ã™ã‚‹ã™ã¹ã¦ã®ä¸å‹•産
+ </string>
+ <string name="RegionInfoAllEstatesYouOwn">
+ ã‚ãªãŸãŒæ‰€æœ‰ã™ã‚‹ã™ã¹ã¦ã®ä¸å‹•産
+ </string>
+ <string name="RegionInfoAllEstatesYouManage">
+ ã‚ãªãŸãŒ [OWNER] ã®ãŸã‚ã«ç®¡ç†ã™ã‚‹ã™ã¹ã¦ã®ä¸å‹•産
+ </string>
+ <string name="RegionInfoAllowedResidents">
+ 許å¯ã•れãŸä½äººï¼š ([ALLOWEDAGENTS] äººã€æœ€å¤§ [MAXACCESS] 人)
+ </string>
+ <string name="RegionInfoAllowedGroups">
+ 許å¯ã•れãŸã‚°ãƒ«ãƒ¼ãƒ—: ([ALLOWEDGROUPS]ã€æœ€å¤§ [MAXACCESS] )
+ </string>
+ <string name="ScriptLimitsParcelScriptMemory">
+ 区画スクリプトメモリ
+ </string>
+ <string name="ScriptLimitsParcelsOwned">
+ 区画一覧: [PARCELS]
+ </string>
+ <string name="ScriptLimitsMemoryUsed">
+ 使用ã•れãŸãƒ¡ãƒ¢ãƒªï¼š [MAX] kb 中 [COUNT] kb:[AVAILABLE] kb 利用å¯
+ </string>
+ <string name="ScriptLimitsMemoryUsedSimple">
+ 使用ã•れãŸãƒ¡ãƒ¢ãƒªï¼š [COUNT] kb
+ </string>
+ <string name="ScriptLimitsParcelScriptURLs">
+ 区画ã®ã‚¹ã‚¯ãƒªãƒ—トURL
+ </string>
+ <string name="ScriptLimitsURLsUsed">
+ 使用ã•れ㟠URL: [MAX] 中 [COUNT] :[AVAILABLE] 利用å¯
+ </string>
+ <string name="ScriptLimitsURLsUsedSimple">
+ 使用ã•れ㟠URL: [COUNT]
+ </string>
+ <string name="ScriptLimitsRequestError">
+ 情報ã®ãƒªã‚¯ã‚¨ã‚¹ãƒˆä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸ
+ </string>
+ <string name="ScriptLimitsRequestNoParcelSelected">
+ 区画ãŒé¸æŠžã•れã¦ã„ã¾ã›ã‚“。
+ </string>
+ <string name="ScriptLimitsRequestWrongRegion">
+ エラー: スクリプト情報ã¯ç¾åœ¨åœ°ã®ã¿å–å¾—ã§ãã¾ã™
+ </string>
+ <string name="ScriptLimitsRequestWaiting">
+ 情報をå–得中...
+ </string>
+ <string name="ScriptLimitsRequestDontOwnParcel">
+ ã“ã®åŒºç”»ã‚’調査ã™ã‚‹æ¨©é™ãŒã‚りã¾ã›ã‚“。
+ </string>
+ <string name="SITTING_ON">
+ ç€å¸­ä¸­
+ </string>
+ <string name="ATTACH_CHEST">
+ 胸部
+ </string>
+ <string name="ATTACH_HEAD">
+ é ­
+ </string>
+ <string name="ATTACH_LSHOULDER">
+ 左肩
+ </string>
+ <string name="ATTACH_RSHOULDER">
+ å³è‚©
+ </string>
+ <string name="ATTACH_LHAND">
+ 左手
+ </string>
+ <string name="ATTACH_RHAND">
+ 峿‰‹
+ </string>
+ <string name="ATTACH_LFOOT">
+ 左足
+ </string>
+ <string name="ATTACH_RFOOT">
+ å³è¶³
+ </string>
+ <string name="ATTACH_BACK">
+ 背中
+ </string>
+ <string name="ATTACH_PELVIS">
+ 骨盤
+ </string>
+ <string name="ATTACH_MOUTH">
+ å£
+ </string>
+ <string name="ATTACH_CHIN">
+ ã‚ã”
+ </string>
+ <string name="ATTACH_LEAR">
+ 左耳
+ </string>
+ <string name="ATTACH_REAR">
+ å³è€³
+ </string>
+ <string name="ATTACH_LEYE">
+ 左目
+ </string>
+ <string name="ATTACH_REYE">
+ å³ç›®
+ </string>
+ <string name="ATTACH_NOSE">
+ é¼»
+ </string>
+ <string name="ATTACH_RUARM">
+ å³è…•(上)
+ </string>
+ <string name="ATTACH_RLARM">
+ å³è…•(下)
+ </string>
+ <string name="ATTACH_LUARM">
+ 左腕(上)
+ </string>
+ <string name="ATTACH_LLARM">
+ 左腕(下)
+ </string>
+ <string name="ATTACH_RHIP">
+ å³è…°
+ </string>
+ <string name="ATTACH_RULEG">
+ å³è„šï¼ˆä¸Šï¼‰
+ </string>
+ <string name="ATTACH_RLLEG">
+ å³è„šï¼ˆä¸‹ï¼‰
+ </string>
+ <string name="ATTACH_LHIP">
+ 左腰
+ </string>
+ <string name="ATTACH_LULEG">
+ 左脚(上)
+ </string>
+ <string name="ATTACH_LLLEG">
+ 左脚(下)
+ </string>
+ <string name="ATTACH_BELLY">
+ ãŠè…¹
+ </string>
+ <string name="ATTACH_RPEC">
+ å³èƒ¸ç­‹
+ </string>
+ <string name="ATTACH_LPEC">
+ 左胸筋
+ </string>
+ <string name="ATTACH_HUD_CENTER_2">
+ HUD(中央 2)
+ </string>
+ <string name="ATTACH_HUD_TOP_RIGHT">
+ HUD(å³ä¸Šï¼‰
+ </string>
+ <string name="ATTACH_HUD_TOP_CENTER">
+ HUD(上・中央)
+ </string>
+ <string name="ATTACH_HUD_TOP_LEFT">
+ HUD(左上)
+ </string>
+ <string name="ATTACH_HUD_CENTER_1">
+ HUD(中央 1)
+ </string>
+ <string name="ATTACH_HUD_BOTTOM_LEFT">
+ HUD(左下)
+ </string>
+ <string name="ATTACH_HUD_BOTTOM">
+ HUD(下)
+ </string>
+ <string name="ATTACH_HUD_BOTTOM_RIGHT">
+ HUD(å³ä¸‹ï¼‰
+ </string>
+ <string name="CursorPos">
+ [LINE] 行目ã€[COLUMN] 列目
+ </string>
+ <string name="PanelDirCountFound">
+ [COUNT] 件見ã¤ã‹ã‚Šã¾ã—ãŸ
+ </string>
+ <string name="PanelDirTimeStr">
+ [hour12,datetime,utc]:[min,datetime,utc] [ampm,datetime,utc]
+ </string>
+ <string name="PanelDirEventsDateText">
+ [mthnum,datetime,slt]/[day,datetime,slt]
+ </string>
+ <string name="PanelContentsTooltip">
+ オブジェクトã®ä¸­èº«
+ </string>
+ <string name="PanelContentsNewScript">
+ æ–°è¦ã‚¹ã‚¯ãƒªãƒ—ト
+ </string>
+ <string name="BusyModeResponseDefault">
+ メッセージをé€ã£ãŸä½äººã¯ã€èª°ã«ã‚‚邪魔をã•れãŸããªã„ãŸã‚ç¾åœ¨ã€Œå–り込ã¿ä¸­ã€ãƒ¢ãƒ¼ãƒ‰ã§ã™ã€‚ ã‚ãªãŸã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã¯ã€ã‚ã¨ã§ç¢ºèªã§ãるよã†ã« IM パãƒãƒ«ã«è¡¨ç¤ºã•れã¾ã™ã€‚
+ </string>
+ <string name="MuteByName">
+ (å称別)
+ </string>
+ <string name="MuteAgent">
+ (ä½äººï¼‰
+ </string>
+ <string name="MuteObject">
+ (オブジェクト)
+ </string>
+ <string name="MuteGroup">
+ (グループ)
+ </string>
+ <string name="MuteExternal">
+ (外部)
+ </string>
+ <string name="RegionNoCovenant">
+ ã“ã®ä¸å‹•産ã«ã¯ç´„款ãŒã‚りã¾ã›ã‚“。
+ </string>
+ <string name="RegionNoCovenantOtherOwner">
+ ã“ã®ä¸å‹•産ã«ã¯ç´„款ãŒã‚りã¾ã›ã‚“。 ã“ã®ä¸å‹•産上ã®åœŸåœ°ã¯ä¸å‹•産所有者ã«ã‚ˆã‚Šè²©å£²ã•れã€Linden Lab ã¯è²©å£²ã—ã¾ã›ã‚“。 販売ã«é–¢ã™ã‚‹ãŠå•ã„åˆã‚ã›ã¯ã€ä¸å‹•産所有者ã¾ã§ãŠé¡˜ã„致ã—ã¾ã™ã€‚
+ </string>
+ <string name="covenant_last_modified" value="最終修正日:"/>
+ <string name="none_text" value=" (ãªã—) "/>
+ <string name="never_text" value=" (無) "/>
+ <string name="GroupOwned">
+ グループ所有
+ </string>
+ <string name="Public">
+ パブリック
+ </string>
+ <string name="LocalSettings">
+ ローカル設定
+ </string>
+ <string name="RegionSettings">
+ リージョン(地域)ã®è¨­å®š
+ </string>
+ <string name="ClassifiedClicksTxt">
+ クリック数: [TELEPORT] テレãƒãƒ¼ãƒˆã€ [MAP] 地図〠[PROFILE] プロフィール
+ </string>
+ <string name="ClassifiedUpdateAfterPublish">
+ (掲載後更新)
+ </string>
+ <string name="NoPicksClassifiedsText">
+ ピックやクラシファイド広告を作æˆã—ã¦ã„ã¾ã›ã‚“。 作æˆã™ã‚‹ã«ã¯ã€ä¸‹ã«ã‚る「プラスã€ãƒœã‚¿ãƒ³ã‚’クリックã—ã¾ã™ã€‚
+ </string>
+ <string name="NoAvatarPicksClassifiedsText">
+ ピックã€ã¾ãŸã¯ã‚¯ãƒ©ã‚·ãƒ•ァイド広告ãŒã‚りã¾ã›ã‚“
+ </string>
+ <string name="PicksClassifiedsLoadingText">
+ ローディング...
+ </string>
+ <string name="MultiPreviewTitle">
+ プレビュー
+ </string>
+ <string name="MultiPropertiesTitle">
+ プロパティ
+ </string>
+ <string name="InvOfferAnObjectNamed">
+ オブジェクトå
+ </string>
+ <string name="InvOfferOwnedByGroup">
+ 所有グループ
+ </string>
+ <string name="InvOfferOwnedByUnknownGroup">
+ 䏿˜Žãªã‚°ãƒ«ãƒ¼ãƒ—所有
+ </string>
+ <string name="InvOfferOwnedBy">
+ 所有者
+ </string>
+ <string name="InvOfferOwnedByUnknownUser">
+ 䏿˜Žãªãƒ¦ãƒ¼ã‚¶ãƒ¼æ‰€æœ‰
+ </string>
+ <string name="InvOfferGaveYou">
+ ãŒæ¸¡ã—ã¾ã—ãŸ
+ </string>
+ <string name="InvOfferDecline">
+ &lt;nolink&gt;[NAME]&lt;/nolink&gt; ã‹ã‚‰ã® [DESC] ã‚’æ‹’å¦ã—ã¾ã—ãŸã€‚
+ </string>
+ <string name="GroupMoneyTotal">
+ åˆè¨ˆ
+ </string>
+ <string name="GroupMoneyBought">
+ 購入:
+ </string>
+ <string name="GroupMoneyPaidYou">
+ ã‚ãªãŸã«æ”¯æ‰•ã„:
+ </string>
+ <string name="GroupMoneyPaidInto">
+ paid into
+ </string>
+ <string name="GroupMoneyBoughtPassTo">
+ 入場許å¯ã‚’購入:
+ </string>
+ <string name="GroupMoneyPaidFeeForEvent">
+ ãŒã‚¤ãƒ™ãƒ³ãƒˆç”¨ã®è²»ç”¨ã‚’支払ã„ã¾ã—ãŸ
+ </string>
+ <string name="GroupMoneyPaidPrizeForEvent">
+ ãŒã‚¤ãƒ™ãƒ³ãƒˆç”¨ã®è³žé‡‘を支払ã„ã¾ã—ãŸ
+ </string>
+ <string name="GroupMoneyBalance">
+ 残高
+ </string>
+ <string name="GroupMoneyCredits">
+ åŽå…¥
+ </string>
+ <string name="GroupMoneyDebits">
+ 支出
+ </string>
+ <string name="GroupMoneyDate">
+ [year,datetime,utc]年[mth,datetime,utc]月[day,datetime,utc]日[weekday,datetime,utc]
+ </string>
+ <string name="ViewerObjectContents">
+ 内容
+ </string>
+ <string name="AcquiredItems">
+ å–得アイテム
+ </string>
+ <string name="Cancel">
+ キャンセル
+ </string>
+ <string name="UploadingCosts">
+ [NAME] ã®ã‚¢ãƒƒãƒ—ロード料金㯠L$[AMOUNT] ã§ã™
+ </string>
+ <string name="BuyingCosts">
+ ã“れを L$[AMOUNT] ã§è³¼å…¥ã—ã¾ã™
+ </string>
+ <string name="UnknownFileExtension">
+ 䏿˜Žã®æ‹¡å¼µå­ï¼š %s
+使用å¯èƒ½ãªæ‹¡å¼µå­ï¼š .wav, .tga, .bmp, .jpg, .jpeg, or .bvh
+ </string>
+ <string name="MuteObject2">
+ ブロック
+ </string>
+ <string name="MuteAvatar">
+ ブロック
+ </string>
+ <string name="UnmuteObject">
+ ブロック解除
+ </string>
+ <string name="UnmuteAvatar">
+ ブロック解除
+ </string>
+ <string name="AddLandmarkNavBarMenu">
+ マイ ランドマークã«è¿½åŠ ...
+ </string>
+ <string name="EditLandmarkNavBarMenu">
+ マイ ランドマークを編集...
+ </string>
+ <string name="accel-mac-control">
+ ⌃
+ </string>
+ <string name="accel-mac-command">
+ ⌘
+ </string>
+ <string name="accel-mac-option">
+ ⌥
+ </string>
+ <string name="accel-mac-shift">
+ ⇧
+ </string>
+ <string name="accel-win-control">
+ Ctrl+
+ </string>
+ <string name="accel-win-alt">
+ Alt+
+ </string>
+ <string name="accel-win-shift">
+ Shift+
+ </string>
+ <string name="FileSaved">
+ ファイルãŒä¿å­˜ã•れã¾ã—ãŸ
+ </string>
+ <string name="Receiving">
+ å–得中
+ </string>
+ <string name="AM">
+ AM
+ </string>
+ <string name="PM">
+ PM
+ </string>
+ <string name="PST">
+ 太平洋標準時
+ </string>
+ <string name="PDT">
+ å¤ªå¹³æ´‹å¤æ™‚é–“
+ </string>
+ <string name="Direction_Forward">
+ å‰
+ </string>
+ <string name="Direction_Left">
+ å·¦
+ </string>
+ <string name="Direction_Right">
+ å³
+ </string>
+ <string name="Direction_Back">
+ 戻る
+ </string>
+ <string name="Direction_North">
+ 北
+ </string>
+ <string name="Direction_South">
+ å—
+ </string>
+ <string name="Direction_West">
+ 西
+ </string>
+ <string name="Direction_East">
+ æ±
+ </string>
+ <string name="Direction_Up">
+ 上
+ </string>
+ <string name="Direction_Down">
+ 下
+ </string>
+ <string name="Any Category">
+ 全カテゴリ
+ </string>
+ <string name="Shopping">
+ ショッピング
+ </string>
+ <string name="Land Rental">
+ 土地ã®ãƒ¬ãƒ³ã‚¿ãƒ«
+ </string>
+ <string name="Property Rental">
+ プロパティã®ãƒ¬ãƒ³ã‚¿ãƒ«
+ </string>
+ <string name="Special Attraction">
+ 特別アトラクション
+ </string>
+ <string name="New Products">
+ 新製å“
+ </string>
+ <string name="Employment">
+ 雇用
+ </string>
+ <string name="Wanted">
+ 求む
+ </string>
+ <string name="Service">
+ サービス
+ </string>
+ <string name="Personal">
+ パーソナル
+ </string>
+ <string name="None">
+ ãªã—
+ </string>
+ <string name="Linden Location">
+ Linden 所在地
+ </string>
+ <string name="Adult">
+ Adult
+ </string>
+ <string name="Arts&amp;Culture">
+ アートã¨ã‚«ãƒ«ãƒãƒ£ãƒ¼
+ </string>
+ <string name="Business">
+ ビジãƒã‚¹
+ </string>
+ <string name="Educational">
+ 教育的
+ </string>
+ <string name="Gaming">
+ ゲーム
+ </string>
+ <string name="Hangout">
+ ãŸã¾ã‚Šå ´
+ </string>
+ <string name="Newcomer Friendly">
+ æ–°ä½äººã«å„ªã—ã„
+ </string>
+ <string name="Parks&amp;Nature">
+ 公園ã¨è‡ªç„¶
+ </string>
+ <string name="Residential">
+ ä½å®…用
+ </string>
+ <string name="Stage">
+ ステージ
+ </string>
+ <string name="Other">
+ ãã®ä»–
+ </string>
+ <string name="Rental">
+ レンタル
+ </string>
+ <string name="Any">
+ 全員
+ </string>
+ <string name="You">
+ ã‚ãªãŸ
+ </string>
+ <string name=":">
+ :
+ </string>
+ <string name=",">
+ ,
+ </string>
+ <string name="...">
+ ...
+ </string>
+ <string name="***">
+ ***
+ </string>
+ <string name="(">
+ (
+ </string>
+ <string name=")">
+ )
+ </string>
+ <string name=".">
+ .
+ </string>
+ <string name="&apos;">
+ &apos;
+ </string>
+ <string name="---">
+ ---
+ </string>
+ <string name="Multiple Media">
+ 複数ã®ãƒ¡ãƒ‡ã‚£ã‚¢
+ </string>
+ <string name="Play Media">
+ メディアをå†ç”Ÿ/ä¸€æ™‚åœæ­¢
+ </string>
+ <string name="MBCmdLineError">
+ コマンドラインã«ã‚¨ãƒ©ãƒ¼ãŒè¦‹ã¤ã‹ã‚Šã¾ã—ãŸã€‚
+リンク先をå‚ç…§ã—ã¦ãã ã•ã„: http://wiki.secondlife.com/wiki/Client_parameters
+エラー:
+ </string>
+ <string name="MBCmdLineUsg">
+ [APP_NAME] コマンドライン使用:
+ </string>
+ <string name="MBUnableToAccessFile">
+ [APP_NAME] ã¯å¿…è¦ãªãƒ•ァイルã«ã‚¢ã‚¯ã‚»ã‚¹ã§ãã¾ã›ã‚“。
+
+複数ã®ã‚³ãƒ”ーを実行中ã‹ã€ãƒ•ã‚¡ã‚¤ãƒ«ãŒæ—¢ã«é–‹ã„ã¦ã„ã‚‹ã¨ã‚ãªãŸã®ã‚·ã‚¹ãƒ†ãƒ ãŒèª¤èªè­˜ã—ã¦ã„ã‚‹å¯èƒ½æ€§ãŒã‚りã¾ã™ã€‚
+ã“ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒä½•度も出る場åˆã¯ã€ã‚³ãƒ³ãƒ”ューターをå†èµ·å‹•ã—ã¦ã‚‚ã†ä¸€åº¦ãŠè©¦ã—ãã ã•ã„。
+ãれã§ã‚‚å•題ãŒç¶šãå ´åˆã€[APP_NAME] を完全ã«ã‚¢ãƒ³ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã—ã¦ã€å†ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã‚’ã—ã¦ãã ã•ã„。
+ </string>
+ <string name="MBFatalError">
+ 致命的ãªã‚¨ãƒ©ãƒ¼
+ </string>
+ <string name="MBRequiresAltiVec">
+ [APP_NAME] ã¯ã€AltiVecæ­è¼‰ã®ãƒ—ロセッサãŒå¿…è¦ã§ã™ã€‚(G4 以é™ï¼‰
+ </string>
+ <string name="MBAlreadyRunning">
+ [APP_NAME] ã¯ã™ã§ã«å®Ÿè¡Œä¸­ã§ã™ã€‚
+最å°åŒ–ã•れãŸãƒ—ログラムã®ã‚³ãƒ”ーをタスクãƒãƒ¼ã§ç¢ºèªã—ã¦ãã ã•ã„。
+ã“ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒä½•度も出る場åˆã¯ã‚³ãƒ³ãƒ”ューターをå†èµ·å‹•ã—ã¦ãã ã•ã„。
+ </string>
+ <string name="MBFrozenCrashed">
+ [APP_NAME] ã¯å‰å›žã®å®Ÿè¡Œæ™‚ã«ãƒ•リーズã—ã¦ã„ã¾ã™ã€‚
+クラッシュ報告をé€ä¿¡ã—ã¾ã™ã‹ï¼Ÿ
+ </string>
+ <string name="MBAlert">
+ 通知
+ </string>
+ <string name="MBNoDirectX">
+ [APP_NAME] 㯠DirectX 9.0b åŠã³ãれ以é™ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’検出ã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“ã§ã—ãŸã€‚
+[APP_NAME] 㯠DirectX を使用ã—ã¦å®‰å®šæ€§ã®å•題ã€ä½Žãƒ‘フォーマンスã€ã‚¯ãƒ©ãƒƒã‚·ãƒ¥ç­‰æ‚ªå½±éŸ¿ã‚’与ãˆã‚‹ãƒãƒ¼ãƒ‰ã‚¦ã‚§ã‚¢ã‚„å¤ã„ドライãƒã‚’検出ã—ã¾ã™ã€‚ DirectX 9.0b ãŒãªãã¦ã‚‚ [APP_NAME] を実行ã§ãã¾ã™ãŒã€DirectX 9.0bã¨ã®ã”ä½¿ç”¨ã‚’å¼·ãæŽ¨å¥¨ã—ã¾ã™ã€‚
+
+ç¶šã‘ã¾ã™ã‹ï¼Ÿ
+ </string>
+ <string name="MBWarning">
+ 警告
+ </string>
+ <string name="MBNoAutoUpdate">
+ 自動更新ã¯ç¾åœ¨ Linux ã«ã¯å¯¾å¿œã—ã¦ã„ã¾ã›ã‚“。
+www.secondlife.com ã‹ã‚‰æœ€æ–°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’ダウンロードã—ã¦ãã ã•ã„。
+ </string>
+ <string name="MBRegClassFailed">
+ RegisterClass 失敗
+ </string>
+ <string name="MBError">
+ エラー
+ </string>
+ <string name="MBFullScreenErr">
+ [WIDTH] x [HEIGHT] ã§ã¯å…¨ç”»é¢ã§å®Ÿè¡Œã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。
+ウィンドウモードã§å®Ÿè¡Œä¸­ã§ã™ã€‚
+ </string>
+ <string name="MBDestroyWinFailed">
+ シャットダウンエラー(DestroyWindow() 失敗)
+ </string>
+ <string name="MBShutdownErr">
+ シャットダウンエラー
+ </string>
+ <string name="MBDevContextErr">
+ GL ディãƒã‚¤ã‚¹ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆãŒä½œã‚Œã¾ã›ã‚“
+ </string>
+ <string name="MBPixelFmtErr">
+ é©åˆ‡ãªãƒ”クセル形å¼ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“
+ </string>
+ <string name="MBPixelFmtDescErr">
+ ãƒ”ã‚¯ã‚»ãƒ«å½¢å¼æƒ…å ±ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“
+ </string>
+ <string name="MBTrueColorWindow">
+ [APP_NAME] を実行ã™ã‚‹ã«ã¯ã€True Color (32ビット)ãŒå¿…è¦ã§ã™ã€‚
+ãŠä½¿ã„ã®ã‚³ãƒ³ãƒ”ューターã®ã€Œã‚³ãƒ³ãƒˆãƒ­ãƒ¼ãƒ«ãƒ‘ãƒãƒ«ã€ï¼žã€Œç”»é¢ã€ï¼žã€Œè¨­å®šã€ã«è¡Œãã€ã€Œæœ€é«˜ (32 ビット)ã€ã«è¨­å®šã—ã¦ãã ã•ã„。
+ </string>
+ <string name="MBAlpha">
+ [APP_NAME] 㯠8 ビットã®ã‚¢ãƒ«ãƒ•ã‚¡ãƒãƒ£ãƒ³ãƒãƒ«ã‚’å–å¾—ã§ããªã„ãŸã‚実行ã§ãã¾ã›ã‚“。 通常ビデオカードã®ãƒ‰ãƒ©ã‚¤ãƒã®å•題ã§èµ·ã“りã¾ã™ã€‚
+ãŠä½¿ã„ã®ã‚³ãƒ³ãƒ”ãƒ¥ãƒ¼ã‚¿ãƒ¼ã«æœ€æ–°ã®ãƒ“デオカードドライãƒãŒã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã•れã¦ã„ã‚‹ã‹ã”確èªãã ã•ã„。
+ã¾ãŸã€ã€Œã‚³ãƒ³ãƒˆãƒ­ãƒ¼ãƒ«ãƒ‘ãƒãƒ«ã€ï¼žã€Œç”»é¢ã€ï¼žã€Œè¨­å®šã€å†…ã§ã€ãƒ¢ãƒ‹ã‚¿ãƒ¼ãŒã€Œæœ€é«˜ (32 ビット)ã€ã«è¨­å®šã•れã¦ã„ã‚‹ã“ã¨ã‚‚ã”確èªãã ã•ã„。
+ã“ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒä½•度も出る場åˆã¯ã€[SUPPORT_SITE] ã¸ã”連絡ãã ã•ã„。
+ </string>
+ <string name="MBPixelFmtSetErr">
+ ピクセル形å¼ãŒè¨­å®šã§ãã¾ã›ã‚“
+ </string>
+ <string name="MBGLContextErr">
+ GL レンダーコンテキストãŒä½œã‚Œã¾ã›ã‚“
+ </string>
+ <string name="MBGLContextActErr">
+ GL レンダーコンテキストをアクティベートã§ãã¾ã›ã‚“
+ </string>
+ <string name="MBVideoDrvErr">
+ ãŠä½¿ã„ã®ã‚³ãƒ³ãƒ”ューターã®ãƒ“デオカードドライãƒãŒæ­£å¸¸ã«ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã§ããªã‹ã£ãŸã€ã¾ãŸã¯å¤ã„ã‹ã‚µãƒãƒ¼ãƒˆå¯¾è±¡å¤–ã®ãŸã‚ã€[APP_NAME] ã¯å®Ÿè¡Œã§ãã¾ã›ã‚“。 最新ã®ãƒ“デオカードドライãƒãŒã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã•れã¦ã„ã‚‹ã®ã‚’確èªã—ã€ã•れã¦ã„ã‚‹å ´åˆã¯å†ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã‚’ãŠè©¦ã—ãã ã•ã„。
+
+ã“ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒä½•度も出る場åˆã¯ã€[SUPPORT_SITE] ã¸ã”連絡ãã ã•ã„。
+ </string>
+ <string name="5 O&apos;Clock Shadow">
+ ã†ã£ã™ã‚‰ã¨ã—ãŸãƒ’ゲ
+ </string>
+ <string name="All White">
+ 真ã£ç™½
+ </string>
+ <string name="Anime Eyes">
+ アニメ風ã®ç›®
+ </string>
+ <string name="Arced">
+ アーãƒ
+ </string>
+ <string name="Arm Length">
+ è…•ã®é•·ã•
+ </string>
+ <string name="Attached">
+ å°
+ </string>
+ <string name="Attached Earlobes">
+ 耳ãŸã¶
+ </string>
+ <string name="Back Fringe">
+ 後ã‚é«ªã®æ¯›å…ˆ
+ </string>
+ <string name="Baggy">
+ ãŸã‚‹ã‚“ã ä¸‹ã¾ã¶ãŸ
+ </string>
+ <string name="Bangs">
+ å‰é«ª
+ </string>
+ <string name="Beady Eyes">
+ ビーズã®ã‚ˆã†ãªç›®
+ </string>
+ <string name="Belly Size">
+ ãŠè…¹ã®å¤§ãã•
+ </string>
+ <string name="Big">
+ 大
+ </string>
+ <string name="Big Butt">
+ 大
+ </string>
+ <string name="Big Hair Back">
+ 髪ã®å¤§éƒ¨åˆ†ï¼š 後ã‚
+ </string>
+ <string name="Big Hair Front">
+ 髪ã®å¤§éƒ¨åˆ†ï¼š å‰
+ </string>
+ <string name="Big Hair Top">
+ 髪ã®å¤§éƒ¨åˆ†ï¼š 上部
+ </string>
+ <string name="Big Head">
+ 大
+ </string>
+ <string name="Big Pectorals">
+ 大
+ </string>
+ <string name="Big Spikes">
+ ã¨ã’ã‚り
+ </string>
+ <string name="Black">
+ é»’
+ </string>
+ <string name="Blonde">
+ ブロンド
+ </string>
+ <string name="Blonde Hair">
+ ブロンドã®é«ª
+ </string>
+ <string name="Blush">
+ ãƒãƒ¼ã‚¯
+ </string>
+ <string name="Blush Color">
+ ãƒãƒ¼ã‚¯ã‚«ãƒ©ãƒ¼
+ </string>
+ <string name="Blush Opacity">
+ ãƒãƒ¼ã‚¯ã®æ¿ƒã•
+ </string>
+ <string name="Body Definition">
+ 体ã®ç²¾ç´°åº¦
+ </string>
+ <string name="Body Fat">
+ 体脂肪
+ </string>
+ <string name="Body Freckles">
+ 体ã®ã—ã¿ãƒ»ãã°ã‹ã™
+ </string>
+ <string name="Body Thick">
+ 骨太
+ </string>
+ <string name="Body Thickness">
+ 体ã®åŽšã¿
+ </string>
+ <string name="Body Thin">
+ ç´°ã‚
+ </string>
+ <string name="Bow Legged">
+ 外股
+ </string>
+ <string name="Breast Buoyancy">
+ 胸ã®é‡åŠ›
+ </string>
+ <string name="Breast Cleavage">
+ 胸ã®è°·é–“
+ </string>
+ <string name="Breast Size">
+ 胸ã®å¤§ãã•
+ </string>
+ <string name="Bridge Width">
+ 両目ã®é–“ã®å¹…
+ </string>
+ <string name="Broad">
+ 広
+ </string>
+ <string name="Brow Size">
+ 眉毛上ã®éš†èµ·
+ </string>
+ <string name="Bug Eyes">
+ Bug Eyes
+ </string>
+ <string name="Bugged Eyes">
+ çªã出ãŸç›®
+ </string>
+ <string name="Bulbous">
+ ã ã‚“ã”
+ </string>
+ <string name="Bulbous Nose">
+ ã ã‚“ã”é¼»
+ </string>
+ <string name="Breast Physics Mass">
+ 胸ã®è±Šã‹ã•
+ </string>
+ <string name="Breast Physics Smoothing">
+ 胸ã®å¹³æ»‘化
+ </string>
+ <string name="Breast Physics Gravity">
+ 胸ã®åž‚れ具åˆ
+ </string>
+ <string name="Breast Physics Drag">
+ 胸ã®ç©ºæ°—抵抗
+ </string>
+ <string name="Breast Physics InOut Max Effect">
+ 最大エフェクト数
+ </string>
+ <string name="Breast Physics InOut Spring">
+ 振動速度
+ </string>
+ <string name="Breast Physics InOut Gain">
+ 増加率
+ </string>
+ <string name="Breast Physics InOut Damping">
+ 減衰
+ </string>
+ <string name="Breast Physics UpDown Max Effect">
+ 最大エフェクト数
+ </string>
+ <string name="Breast Physics UpDown Spring">
+ 振動速度
+ </string>
+ <string name="Breast Physics UpDown Gain">
+ 増加率
+ </string>
+ <string name="Breast Physics UpDown Damping">
+ 減衰
+ </string>
+ <string name="Breast Physics LeftRight Max Effect">
+ 最大エフェクト数
+ </string>
+ <string name="Breast Physics LeftRight Spring">
+ 振動速度
+ </string>
+ <string name="Breast Physics LeftRight Gain">
+ 増加率
+ </string>
+ <string name="Breast Physics LeftRight Damping">
+ 減衰
+ </string>
+ <string name="Belly Physics Mass">
+ ãŠè…¹ã®è±Šã‹ã•
+ </string>
+ <string name="Belly Physics Smoothing">
+ ãŠè…¹ã®å¹³æ»‘化
+ </string>
+ <string name="Belly Physics Gravity">
+ ãŠè…¹ã®åž‚れ具åˆ
+ </string>
+ <string name="Belly Physics Drag">
+ ãŠè…¹ã®ç©ºæ°—抵抗
+ </string>
+ <string name="Belly Physics UpDown Max Effect">
+ 最大エフェクト数
+ </string>
+ <string name="Belly Physics UpDown Spring">
+ 振動速度
+ </string>
+ <string name="Belly Physics UpDown Gain">
+ 増加率
+ </string>
+ <string name="Belly Physics UpDown Damping">
+ 減衰
+ </string>
+ <string name="Butt Physics Mass">
+ ãŠå°»ã®è±Šã‹ã•
+ </string>
+ <string name="Butt Physics Smoothing">
+ ãŠå°»ã®å¹³æ»‘化
+ </string>
+ <string name="Butt Physics Gravity">
+ ãŠå°»ã®åž‚れ具åˆ
+ </string>
+ <string name="Butt Physics Drag">
+ ãŠå°»ã®ç©ºæ°—抵抗
+ </string>
+ <string name="Butt Physics UpDown Max Effect">
+ 最大エフェクト数
+ </string>
+ <string name="Butt Physics UpDown Spring">
+ 振動速度
+ </string>
+ <string name="Butt Physics UpDown Gain">
+ 増加率
+ </string>
+ <string name="Butt Physics UpDown Damping">
+ 減衰
+ </string>
+ <string name="Butt Physics LeftRight Max Effect">
+ 最大エフェクト数
+ </string>
+ <string name="Butt Physics LeftRight Spring">
+ 振動速度
+ </string>
+ <string name="Butt Physics LeftRight Gain">
+ 増加率
+ </string>
+ <string name="Butt Physics LeftRight Damping">
+ 減衰
+ </string>
+ <string name="Bushy Eyebrows">
+ 太
+ </string>
+ <string name="Bushy Hair">
+ ã¼ã•ã¼ã•ヘア
+ </string>
+ <string name="Butt Size">
+ ãŠå°»ã®å¤§ãã•
+ </string>
+ <string name="Butt Gravity">
+ ãŠå°»ã®åž‚れ具åˆ
+ </string>
+ <string name="bustle skirt">
+ 後ã‚ã®è†¨ã‚‰ã¿
+ </string>
+ <string name="no bustle">
+ 膨らã¿ãªã—
+ </string>
+ <string name="more bustle">
+ 膨らã¿å¤§
+ </string>
+ <string name="Chaplin">
+ ãƒãƒ£ãƒƒãƒ—リン
+ </string>
+ <string name="Cheek Bones">
+ ã»ãŠéª¨
+ </string>
+ <string name="Chest Size">
+ 胸部ã®å¤§ãã•
+ </string>
+ <string name="Chin Angle">
+ ã‚ã”ã®è§’度
+ </string>
+ <string name="Chin Cleft">
+ ã‚ã”ã®å…ˆã®å‰²ã‚Œ
+ </string>
+ <string name="Chin Curtains">
+ ã‚ã”ã«æ²¿ã£ãŸã²ã’
+ </string>
+ <string name="Chin Depth">
+ ã‚ã”ã®é•·ã•
+ </string>
+ <string name="Chin Heavy">
+ ã‚ã”を強調
+ </string>
+ <string name="Chin In">
+ ã²ã„ãŸã‚ã”
+ </string>
+ <string name="Chin Out">
+ çªã出ãŸã‚ã”
+ </string>
+ <string name="Chin-Neck">
+ ã‚ã”ã¨é¦–
+ </string>
+ <string name="Clear">
+ クリア
+ </string>
+ <string name="Cleft">
+ 割れãŸ
+ </string>
+ <string name="Close Set Eyes">
+ é¡”ã®ä¸­å¿ƒå¯„りã®ç›®
+ </string>
+ <string name="Closed">
+ クローズ
+ </string>
+ <string name="Closed Back">
+ 後ã‚ã¨ã˜
+ </string>
+ <string name="Closed Front">
+ å‰ã¨ã˜
+ </string>
+ <string name="Closed Left">
+ å·¦ã¨ã˜
+ </string>
+ <string name="Closed Right">
+ å³ã¨ã˜
+ </string>
+ <string name="Coin Purse">
+ コイン入れ
+ </string>
+ <string name="Collar Back">
+ 後ã‚ãˆã‚Š
+ </string>
+ <string name="Collar Front">
+ å‰ãˆã‚Š
+ </string>
+ <string name="Corner Down">
+ ダウン
+ </string>
+ <string name="Corner Up">
+ アップ
+ </string>
+ <string name="Creased">
+ é‡ã„ã¾ã¶ãŸ
+ </string>
+ <string name="Crooked Nose">
+ 曲ãŒã£ãŸé¼»
+ </string>
+ <string name="Cuff Flare">
+ 袖å£ã®ãƒ•レア
+ </string>
+ <string name="Dark">
+ ダーク
+ </string>
+ <string name="Dark Green">
+ ダークグリーン
+ </string>
+ <string name="Darker">
+ ダーク
+ </string>
+ <string name="Deep">
+ å°–ã£ãŸ
+ </string>
+ <string name="Default Heels">
+ デフォルトã®ã‹ã‹ã¨
+ </string>
+ <string name="Dense">
+ 濃
+ </string>
+ <string name="Double Chin">
+ 二é‡ã‚ã”
+ </string>
+ <string name="Downturned">
+ 下å‘ã
+ </string>
+ <string name="Duffle Bag">
+ ダッフルãƒãƒƒã‚°
+ </string>
+ <string name="Ear Angle">
+ 耳ã®è§’度
+ </string>
+ <string name="Ear Size">
+ 耳ã®å¤§ãã•
+ </string>
+ <string name="Ear Tips">
+ 耳ã®å…ˆ
+ </string>
+ <string name="Egg Head">
+ ãŸã¾ã”é ­
+ </string>
+ <string name="Eye Bags">
+ 下ã¾ã¶ãŸ
+ </string>
+ <string name="Eye Color">
+ çž³ã®è‰²
+ </string>
+ <string name="Eye Depth">
+ ç›®ã®ãã¼ã¿
+ </string>
+ <string name="Eye Lightness">
+ çž³ã®æ˜Žã‚‹ã•
+ </string>
+ <string name="Eye Opening">
+ 見開ãå…·åˆ
+ </string>
+ <string name="Eye Pop">
+ 両目ã®å¤§ãã•ã®å¯¾ç§°
+ </string>
+ <string name="Eye Size">
+ ç›®ã®å¤§ãã•
+ </string>
+ <string name="Eye Spacing">
+ ç›®ã¨ç›®ã®ã‚ã„ã ã®å¹…
+ </string>
+ <string name="Eyebrow Arc">
+ 眉毛ã®ã‚¢ãƒ¼ãƒ
+ </string>
+ <string name="Eyebrow Density">
+ 眉毛ã®å¯†é›†åº¦
+ </string>
+ <string name="Eyebrow Height">
+ 眉毛ã®é«˜ã•
+ </string>
+ <string name="Eyebrow Points">
+ 眉毛ã®è§’
+ </string>
+ <string name="Eyebrow Size">
+ 眉毛ã®å¤§ãã•
+ </string>
+ <string name="Eyelash Length">
+ ã¾ã¤ã’ã®é•·ã•
+ </string>
+ <string name="Eyeliner">
+ アイライナー
+ </string>
+ <string name="Eyeliner Color">
+ アイライナーã®è‰²
+ </string>
+ <string name="Eyes Bugged">
+ 下ã¾ã¶ãŸãŒãŸã‚‹ã‚“ã ç›®
+ </string>
+ <string name="Face Shear">
+ é¡”ã®ã‚†ãŒã¿
+ </string>
+ <string name="Facial Definition">
+ é¡”ã®ç²¾ç´°åº¦
+ </string>
+ <string name="Far Set Eyes">
+ 離れãŸç›®
+ </string>
+ <string name="Fat Lips">
+ 大
+ </string>
+ <string name="Female">
+ 女性
+ </string>
+ <string name="Fingerless">
+ 指ãªã—
+ </string>
+ <string name="Fingers">
+ 指ã‚り
+ </string>
+ <string name="Flared Cuffs">
+ 広ãŒã£ãŸè¢–å£
+ </string>
+ <string name="Flat">
+ 平ら
+ </string>
+ <string name="Flat Butt">
+ å°
+ </string>
+ <string name="Flat Head">
+ çµ¶å£é ­
+ </string>
+ <string name="Flat Toe">
+ フラット
+ </string>
+ <string name="Foot Size">
+ è¶³ã®å¤§ãã•
+ </string>
+ <string name="Forehead Angle">
+ ã²ãŸã„ã®è§’度
+ </string>
+ <string name="Forehead Heavy">
+ ã²ãŸã„を強調
+ </string>
+ <string name="Freckles">
+ ã—ã¿ãƒ»ãã°ã‹ã™
+ </string>
+ <string name="Front Fringe">
+ å‰é«ªã®æ¯›å…ˆ
+ </string>
+ <string name="Full Back">
+ 刈られã¦ã„ãªã„髪
+ </string>
+ <string name="Full Eyeliner">
+ ã‚り
+ </string>
+ <string name="Full Front">
+ 刈られã¦ã„ãªã„髪
+ </string>
+ <string name="Full Hair Sides">
+ サイドã®é«ª
+ </string>
+ <string name="Full Sides">
+ ç”Ÿãˆæƒã£ãŸã‚µã‚¤ãƒ‰
+ </string>
+ <string name="Glossy">
+ ã‚り
+ </string>
+ <string name="Glove Fingers">
+ æ‰‹è¢‹ã®æŒ‡
+ </string>
+ <string name="Glove Length">
+ 手袋ã®é•·ã•
+ </string>
+ <string name="Hair">
+ 髪
+ </string>
+ <string name="Hair Back">
+ 髪: 後ã‚
+ </string>
+ <string name="Hair Front">
+ 髪: å‰
+ </string>
+ <string name="Hair Sides">
+ 髪: サイド
+ </string>
+ <string name="Hair Sweep">
+ æµã™
+ </string>
+ <string name="Hair Thickess">
+ 髪ã®é‡
+ </string>
+ <string name="Hair Thickness">
+ 髪ã®é‡
+ </string>
+ <string name="Hair Tilt">
+ 髪ã®å‘ã
+ </string>
+ <string name="Hair Tilted Left">
+ å·¦å‘ã
+ </string>
+ <string name="Hair Tilted Right">
+ å³å‘ã
+ </string>
+ <string name="Hair Volume">
+ 髪: ボリューム
+ </string>
+ <string name="Hand Size">
+ 手ã®å¤§ãã•
+ </string>
+ <string name="Handlebars">
+ ãƒãƒ³ãƒ‰ãƒ«ãƒãƒ¼
+ </string>
+ <string name="Head Length">
+ é ­ã®é•·ã•
+ </string>
+ <string name="Head Shape">
+ é ­ã®å½¢
+ </string>
+ <string name="Head Size">
+ é ­ã®å¤§ãã•
+ </string>
+ <string name="Head Stretch">
+ 縦横ã®é•·ã•
+ </string>
+ <string name="Heel Height">
+ ヒールã®é«˜ã•
+ </string>
+ <string name="Heel Shape">
+ ヒールã®å½¢
+ </string>
+ <string name="Height">
+ 身長
+ </string>
+ <string name="High">
+ 高
+ </string>
+ <string name="High Heels">
+ ãƒã‚¤ãƒ’ール
+ </string>
+ <string name="High Jaw">
+ 高
+ </string>
+ <string name="High Platforms">
+ 厚底
+ </string>
+ <string name="High and Tight">
+ 高ã‚ã§ã‚¿ã‚¤ãƒˆ
+ </string>
+ <string name="Higher">
+ 高
+ </string>
+ <string name="Hip Length">
+ è…°ã®é•·ã•
+ </string>
+ <string name="Hip Width">
+ è…°ã®å¹…
+ </string>
+ <string name="In">
+ 内å‘ã
+ </string>
+ <string name="In Shdw Color">
+ 内å´ã®ã‚·ãƒ£ãƒ‰ã‚¦ã‚«ãƒ©ãƒ¼
+ </string>
+ <string name="In Shdw Opacity">
+ 内å´ã®ã‚·ãƒ£ãƒ‰ã‚¦ã®æ¿ƒã•
+ </string>
+ <string name="Inner Eye Corner">
+ 目頭
+ </string>
+ <string name="Inner Eye Shadow">
+ 内å´ã®ã‚¢ã‚¤ã‚·ãƒ£ãƒ‰ã‚¦
+ </string>
+ <string name="Inner Shadow">
+ 内å´ã®ã‚·ãƒ£ãƒ‰ã‚¦
+ </string>
+ <string name="Jacket Length">
+ ジャケット丈
+ </string>
+ <string name="Jacket Wrinkles">
+ ジャケットã®ã—ã‚
+ </string>
+ <string name="Jaw Angle">
+ ã‚ã”ã®è§’度
+ </string>
+ <string name="Jaw Jut">
+ ã‚ã”ã®çªå‡º
+ </string>
+ <string name="Jaw Shape">
+ ã‚ã”ã®å½¢
+ </string>
+ <string name="Join">
+ 寄ã›ãŸèƒ¸
+ </string>
+ <string name="Jowls">
+ ãˆã‚‰
+ </string>
+ <string name="Knee Angle">
+ è†ã®è§’度
+ </string>
+ <string name="Knock Kneed">
+ 内股
+ </string>
+ <string name="Large">
+ 大
+ </string>
+ <string name="Large Hands">
+ 大
+ </string>
+ <string name="Left Part">
+ 左分ã‘
+ </string>
+ <string name="Leg Length">
+ 脚ã®é•·ã•
+ </string>
+ <string name="Leg Muscles">
+ 脚ã®ç­‹è‚‰
+ </string>
+ <string name="Less">
+ å°
+ </string>
+ <string name="Less Body Fat">
+ å°‘ãªã‚
+ </string>
+ <string name="Less Curtains">
+ å°‘ãªã‚
+ </string>
+ <string name="Less Freckles">
+ å°‘ãªã‚
+ </string>
+ <string name="Less Full">
+ è–„ã„
+ </string>
+ <string name="Less Gravity">
+ å°‘
+ </string>
+ <string name="Less Love">
+ å°‘
+ </string>
+ <string name="Less Muscles">
+ å°‘ãªã‚
+ </string>
+ <string name="Less Muscular">
+ å°‘ãªã‚
+ </string>
+ <string name="Less Rosy">
+ å°‘ãªç›®
+ </string>
+ <string name="Less Round">
+ 丸ã¿å°‘ãªç›®
+ </string>
+ <string name="Less Saddle">
+ å°
+ </string>
+ <string name="Less Square">
+ å°
+ </string>
+ <string name="Less Volume">
+ ボリューム少ãªç›®
+ </string>
+ <string name="Less soul">
+ å°
+ </string>
+ <string name="Lighter">
+ ライト
+ </string>
+ <string name="Lip Cleft">
+ 唇ã®å±±
+ </string>
+ <string name="Lip Cleft Depth">
+ 唇ã®å±±ã®é«˜ã•
+ </string>
+ <string name="Lip Fullness">
+ 唇ã®åŽšã¿
+ </string>
+ <string name="Lip Pinkness">
+ 唇ã®èµ¤ã¿
+ </string>
+ <string name="Lip Ratio">
+ 上下唇ã®å¤§ãã•
+ </string>
+ <string name="Lip Thickness">
+ 唇ã®å‰å¾Œå¹…
+ </string>
+ <string name="Lip Width">
+ å£ã®å¤§ãã•
+ </string>
+ <string name="Lipgloss">
+ リップグロス
+ </string>
+ <string name="Lipstick">
+ å£ç´…
+ </string>
+ <string name="Lipstick Color">
+ å£ç´…ã®è‰²
+ </string>
+ <string name="Long">
+ ロング
+ </string>
+ <string name="Long Head">
+ å‰å¾Œå¹…ãŒåºƒã„é ­
+ </string>
+ <string name="Long Hips">
+ é•·
+ </string>
+ <string name="Long Legs">
+ é•·
+ </string>
+ <string name="Long Neck">
+ é•·
+ </string>
+ <string name="Long Pigtails">
+ é•·
+ </string>
+ <string name="Long Ponytail">
+ é•·
+ </string>
+ <string name="Long Torso">
+ é•·
+ </string>
+ <string name="Long arms">
+ é•·
+ </string>
+ <string name="Loose Pants">
+ ゆã£ãŸã‚Š
+ </string>
+ <string name="Loose Shirt">
+ ゆるã‚
+ </string>
+ <string name="Loose Sleeves">
+ ゆるã‚
+ </string>
+ <string name="Love Handles">
+ ウエスト周り
+ </string>
+ <string name="Low">
+ 低
+ </string>
+ <string name="Low Heels">
+ ローヒール
+ </string>
+ <string name="Low Jaw">
+ 低
+ </string>
+ <string name="Low Platforms">
+ 低ã‚
+ </string>
+ <string name="Low and Loose">
+ 低ã‚ã§ã‚†ã£ãŸã‚Š
+ </string>
+ <string name="Lower">
+ 低
+ </string>
+ <string name="Lower Bridge">
+ 鼻筋
+ </string>
+ <string name="Lower Cheeks">
+ ã»ãŠã®ä¸‹éƒ¨
+ </string>
+ <string name="Male">
+ 男性
+ </string>
+ <string name="Middle Part">
+ 真ん中分ã‘
+ </string>
+ <string name="More">
+ 大
+ </string>
+ <string name="More Blush">
+ ãã¤ã‚
+ </string>
+ <string name="More Body Fat">
+ 多ã‚
+ </string>
+ <string name="More Curtains">
+ 多ã‚
+ </string>
+ <string name="More Eyeshadow">
+ ã‚り
+ </string>
+ <string name="More Freckles">
+ 多ã‚
+ </string>
+ <string name="More Full">
+ 厚ã„
+ </string>
+ <string name="More Gravity">
+ 大
+ </string>
+ <string name="More Lipstick">
+ ã‚り
+ </string>
+ <string name="More Love">
+ 大
+ </string>
+ <string name="More Lower Lip">
+ 大
+ </string>
+ <string name="More Muscles">
+ 多ã‚
+ </string>
+ <string name="More Muscular">
+ 筋骨隆々
+ </string>
+ <string name="More Rosy">
+ 多ã‚
+ </string>
+ <string name="More Round">
+ ã¾ã‚‹
+ </string>
+ <string name="More Saddle">
+ 大
+ </string>
+ <string name="More Sloped">
+ ãªã ã‚‰ã‹
+ </string>
+ <string name="More Square">
+ 四角
+ </string>
+ <string name="More Upper Lip">
+ 大
+ </string>
+ <string name="More Vertical">
+ 垂直
+ </string>
+ <string name="More Volume">
+ 大
+ </string>
+ <string name="More soul">
+ 大
+ </string>
+ <string name="Moustache">
+ å£ã²ã’
+ </string>
+ <string name="Mouth Corner">
+ å£è§’
+ </string>
+ <string name="Mouth Position">
+ å£ã®ä½ç½®
+ </string>
+ <string name="Mowhawk">
+ モヒカン
+ </string>
+ <string name="Muscular">
+ 筋骨ãŸãã¾ã—ã„
+ </string>
+ <string name="Mutton Chops">
+ マトンãƒãƒ§ãƒƒãƒ—ス
+ </string>
+ <string name="Nail Polish">
+ マニキュア
+ </string>
+ <string name="Nail Polish Color">
+ マニキュアã®è‰²
+ </string>
+ <string name="Narrow">
+ ç‹­
+ </string>
+ <string name="Narrow Back">
+ ç‹­
+ </string>
+ <string name="Narrow Front">
+ ç‹­
+ </string>
+ <string name="Narrow Lips">
+ ãŠã¡ã‚‡ã¼å£
+ </string>
+ <string name="Natural">
+ ナãƒãƒ¥ãƒ©ãƒ«
+ </string>
+ <string name="Neck Length">
+ 首ã®é•·ã•
+ </string>
+ <string name="Neck Thickness">
+ 首ã®å¤ªã•
+ </string>
+ <string name="No Blush">
+ ãªã—
+ </string>
+ <string name="No Eyeliner">
+ ãªã—
+ </string>
+ <string name="No Eyeshadow">
+ ãªã—
+ </string>
+ <string name="No Lipgloss">
+ ãªã—
+ </string>
+ <string name="No Lipstick">
+ ãªã—
+ </string>
+ <string name="No Part">
+ ãªã—
+ </string>
+ <string name="No Polish">
+ ãªã—
+ </string>
+ <string name="No Red">
+ ãªã—
+ </string>
+ <string name="No Spikes">
+ ãªã—
+ </string>
+ <string name="No White">
+ ãªã—
+ </string>
+ <string name="No Wrinkles">
+ ãªã—
+ </string>
+ <string name="Normal Lower">
+ 下
+ </string>
+ <string name="Normal Upper">
+ 上
+ </string>
+ <string name="Nose Left">
+ 左曲ãŒã‚Š
+ </string>
+ <string name="Nose Right">
+ 峿›²ãŒã‚Š
+ </string>
+ <string name="Nose Size">
+ é¼»ã®å¤§ãã•
+ </string>
+ <string name="Nose Thickness">
+ é¼»ã®åŽšã¿
+ </string>
+ <string name="Nose Tip Angle">
+ 鼻先ã®è§’度
+ </string>
+ <string name="Nose Tip Shape">
+ 鼻先ã®å½¢
+ </string>
+ <string name="Nose Width">
+ é¼»ã®å¹…
+ </string>
+ <string name="Nostril Division">
+ é¼»ã®ç©´ã®é«˜ã•
+ </string>
+ <string name="Nostril Width">
+ é¼»ã®ç©´ã®å¹…
+ </string>
+ <string name="Opaque">
+ 濃ã„ã‚
+ </string>
+ <string name="Open">
+ オープン
+ </string>
+ <string name="Open Back">
+ 後ã‚ã‚ã
+ </string>
+ <string name="Open Front">
+ å‰ã‚ã
+ </string>
+ <string name="Open Left">
+ å·¦ã‚ã
+ </string>
+ <string name="Open Right">
+ å³ã‚ã
+ </string>
+ <string name="Orange">
+ オレンジ
+ </string>
+ <string name="Out">
+ 外å‘ã
+ </string>
+ <string name="Out Shdw Color">
+ 外å´ã®ã‚·ãƒ£ãƒ‰ã‚¦ã‚«ãƒ©ãƒ¼
+ </string>
+ <string name="Out Shdw Opacity">
+ 外å´ã®ã‚·ãƒ£ãƒ‰ã‚¦ã®æ¿ƒã•
+ </string>
+ <string name="Outer Eye Corner">
+ 目尻
+ </string>
+ <string name="Outer Eye Shadow">
+ 外å´ã®ã‚¢ã‚¤ã‚·ãƒ£ãƒ‰ã‚¦
+ </string>
+ <string name="Outer Shadow">
+ 外å´ã®ã‚·ãƒ£ãƒ‰ã‚¦
+ </string>
+ <string name="Overbite">
+ å‡ºã£æ­¯
+ </string>
+ <string name="Package">
+ パッケージ
+ </string>
+ <string name="Painted Nails">
+ ã‚り
+ </string>
+ <string name="Pale">
+ 悪ã„
+ </string>
+ <string name="Pants Crotch">
+ パンツã®è‚¡
+ </string>
+ <string name="Pants Fit">
+ パンツã®ãƒ•ィット感
+ </string>
+ <string name="Pants Length">
+ パンツ丈
+ </string>
+ <string name="Pants Waist">
+ ウエスト
+ </string>
+ <string name="Pants Wrinkles">
+ パンツã®ã—ã‚
+ </string>
+ <string name="Part">
+ ã‚り
+ </string>
+ <string name="Part Bangs">
+ 分ã‘ãŸå‰é«ª
+ </string>
+ <string name="Pectorals">
+ 胸筋
+ </string>
+ <string name="Pigment">
+ 色素
+ </string>
+ <string name="Pigtails">
+ 下ã’髪
+ </string>
+ <string name="Pink">
+ ピンク
+ </string>
+ <string name="Pinker">
+ ピンク
+ </string>
+ <string name="Platform Height">
+ é´åº•ã®é«˜ã•
+ </string>
+ <string name="Platform Width">
+ é´åº•ã®å¹…
+ </string>
+ <string name="Pointy">
+ å°–ã£ãŸ
+ </string>
+ <string name="Pointy Heels">
+ å¹…ç‹­
+ </string>
+ <string name="Ponytail">
+ ãƒãƒ‹ãƒ¼ãƒ†ãƒ¼ãƒ«
+ </string>
+ <string name="Poofy Skirt">
+ ãµã‚“ã‚り
+ </string>
+ <string name="Pop Left Eye">
+ 左目を大ãã
+ </string>
+ <string name="Pop Right Eye">
+ å³ç›®ã‚’大ãã
+ </string>
+ <string name="Puffy">
+ ãµã£ãら
+ </string>
+ <string name="Puffy Eyelids">
+ ç›®ã®å‘¨ã‚Šã®è†¨ã‚‰ã¿
+ </string>
+ <string name="Rainbow Color">
+ 虹色
+ </string>
+ <string name="Red Hair">
+ 赤毛
+ </string>
+ <string name="Regular">
+ 凿•´ã®ã¨ã‚ŒãŸ
+ </string>
+ <string name="Right Part">
+ å³åˆ†ã‘
+ </string>
+ <string name="Rosy Complexion">
+ ã»ãŠã®èµ¤ã‚‰ã¿
+ </string>
+ <string name="Round">
+ ã¾ã‚‹ã£ã“ã„
+ </string>
+ <string name="Ruddiness">
+ 血色
+ </string>
+ <string name="Ruddy">
+ 良ã„
+ </string>
+ <string name="Rumpled Hair">
+ ãã—ゃãã—ゃヘア
+ </string>
+ <string name="Saddle Bags">
+ 腰回りã®è‚‰ä»˜ã
+ </string>
+ <string name="Scrawny Leg">
+ 骨張ã£ãŸè„š
+ </string>
+ <string name="Separate">
+ 離れãŸèƒ¸
+ </string>
+ <string name="Shallow">
+ ãªã ã‚‰ã‹
+ </string>
+ <string name="Shear Back">
+ 後方を刈る
+ </string>
+ <string name="Shear Face">
+ é¡”ã®ã‚†ãŒã¿
+ </string>
+ <string name="Shear Front">
+ 剿–¹ã‚’刈る
+ </string>
+ <string name="Shear Left Up">
+ å·¦åŠåˆ†ã‚’上ã«
+ </string>
+ <string name="Shear Right Up">
+ å³åŠåˆ†ã‚’上ã«
+ </string>
+ <string name="Sheared Back">
+ 後ã‚を刈られãŸé«ª
+ </string>
+ <string name="Sheared Front">
+ å‰ã‚’刈られãŸé«ª
+ </string>
+ <string name="Shift Left">
+ å·¦å‘ã
+ </string>
+ <string name="Shift Mouth">
+ å£ã®å‘ã
+ </string>
+ <string name="Shift Right">
+ å³å‘ã
+ </string>
+ <string name="Shirt Bottom">
+ シャツã®è£¾
+ </string>
+ <string name="Shirt Fit">
+ シャツã®ãƒ•ィット感
+ </string>
+ <string name="Shirt Wrinkles">
+ シャツã®ã—ã‚
+ </string>
+ <string name="Shoe Height">
+ é´ã®é•·ã•
+ </string>
+ <string name="Short">
+ ショート
+ </string>
+ <string name="Short Arms">
+ 短
+ </string>
+ <string name="Short Legs">
+ 短
+ </string>
+ <string name="Short Neck">
+ 短
+ </string>
+ <string name="Short Pigtails">
+ 短
+ </string>
+ <string name="Short Ponytail">
+ 短
+ </string>
+ <string name="Short Sideburns">
+ 短ã‚
+ </string>
+ <string name="Short Torso">
+ 短
+ </string>
+ <string name="Short hips">
+ 短
+ </string>
+ <string name="Shoulders">
+ è‚©
+ </string>
+ <string name="Side Fringe">
+ ã‚µã‚¤ãƒ‰ã®æ¯›å…ˆ
+ </string>
+ <string name="Sideburns">
+ ã‚‚ã¿ã‚ã’
+ </string>
+ <string name="Sides Hair">
+ サイドã®é«ª
+ </string>
+ <string name="Sides Hair Down">
+ ダウン
+ </string>
+ <string name="Sides Hair Up">
+ アップ
+ </string>
+ <string name="Skinny Neck">
+ ç´°
+ </string>
+ <string name="Skirt Fit">
+ スカートã®ãƒ•ィット感
+ </string>
+ <string name="Skirt Length">
+ スカート丈
+ </string>
+ <string name="Slanted Forehead">
+ 傾斜ã—ãŸé¡
+ </string>
+ <string name="Sleeve Length">
+ 袖丈
+ </string>
+ <string name="Sleeve Looseness">
+ 袖ã®ãƒ•ィット感
+ </string>
+ <string name="Slit Back">
+ スリット: 後ã‚
+ </string>
+ <string name="Slit Front">
+ スリット: å‰
+ </string>
+ <string name="Slit Left">
+ スリット: 左
+ </string>
+ <string name="Slit Right">
+ スリット: å³
+ </string>
+ <string name="Small">
+ å°
+ </string>
+ <string name="Small Hands">
+ å°
+ </string>
+ <string name="Small Head">
+ å°
+ </string>
+ <string name="Smooth">
+ 滑らã‹
+ </string>
+ <string name="Smooth Hair">
+ スムーズ
+ </string>
+ <string name="Socks Length">
+ é´ä¸‹ä¸ˆ
+ </string>
+ <string name="Soulpatch">
+ ソウルパッãƒ
+ </string>
+ <string name="Sparse">
+ è–„
+ </string>
+ <string name="Spiked Hair">
+ ã¨ã’ã¨ã’ヘア
+ </string>
+ <string name="Square">
+ è§’å¼µã£ãŸ
+ </string>
+ <string name="Square Toe">
+ スクエアトゥ
+ </string>
+ <string name="Squash Head">
+ カボãƒãƒ£åž‹
+ </string>
+ <string name="Stretch Head">
+ 縦長
+ </string>
+ <string name="Sunken">
+ ã“ã‘ãŸã»ãŠ
+ </string>
+ <string name="Sunken Chest">
+ å°
+ </string>
+ <string name="Sunken Eyes">
+ ãã¼ã‚“ã ç›®
+ </string>
+ <string name="Sweep Back">
+ 後ã‚ã¸
+ </string>
+ <string name="Sweep Forward">
+ å‰ã¸
+ </string>
+ <string name="Tall">
+ トール
+ </string>
+ <string name="Taper Back">
+ 後ã‚ã«å…ˆç´°
+ </string>
+ <string name="Taper Front">
+ å‰ã«å…ˆç´°
+ </string>
+ <string name="Thick Heels">
+ 幅広
+ </string>
+ <string name="Thick Neck">
+ 太
+ </string>
+ <string name="Thick Toe">
+ 厚ã‚
+ </string>
+ <string name="Thin">
+ è–„ã„
+ </string>
+ <string name="Thin Eyebrows">
+ ç´°
+ </string>
+ <string name="Thin Lips">
+ å°
+ </string>
+ <string name="Thin Nose">
+ ç´°ã„é¼»
+ </string>
+ <string name="Tight Chin">
+ ã²ãã—ã¾ã£ãŸã‚ã”
+ </string>
+ <string name="Tight Cuffs">
+ タイト
+ </string>
+ <string name="Tight Pants">
+ タイト
+ </string>
+ <string name="Tight Shirt">
+ タイト
+ </string>
+ <string name="Tight Skirt">
+ タイト
+ </string>
+ <string name="Tight Sleeves">
+ タイト
+ </string>
+ <string name="Toe Shape">
+ ã¤ã¾å…ˆã®å½¢
+ </string>
+ <string name="Toe Thickness">
+ ã¤ã¾å…ˆã®åŽšã¿
+ </string>
+ <string name="Torso Length">
+ 上åŠèº«ã®é•·ã•
+ </string>
+ <string name="Torso Muscles">
+ 上åŠèº«ã®ç­‹è‚‰
+ </string>
+ <string name="Torso Scrawny">
+ 上åŠèº«ã®éª¨å¼µã‚Š
+ </string>
+ <string name="Unattached">
+ 大
+ </string>
+ <string name="Uncreased">
+ 軽ã„ã¾ã¶ãŸ
+ </string>
+ <string name="Underbite">
+ å—ã‘å£
+ </string>
+ <string name="Unnatural">
+ ユニーク
+ </string>
+ <string name="Upper Bridge">
+ 両目ã®ã‚ã„ã 
+ </string>
+ <string name="Upper Cheeks">
+ ã»ãŠã®ä¸Šéƒ¨
+ </string>
+ <string name="Upper Chin Cleft">
+ ã‚ã”上部ã®å‰²ã‚Œ
+ </string>
+ <string name="Upper Eyelid Fold">
+ 二é‡ã®å¹…
+ </string>
+ <string name="Upturned">
+ 上å‘ã
+ </string>
+ <string name="Very Red">
+ 真ã£èµ¤
+ </string>
+ <string name="Waist Height">
+ ウエストã®é«˜ã•
+ </string>
+ <string name="Well-Fed">
+ ã¤ã¾ã£ãŸã»ãŠ
+ </string>
+ <string name="White Hair">
+ 白髪
+ </string>
+ <string name="Wide">
+ 広
+ </string>
+ <string name="Wide Back">
+ 広
+ </string>
+ <string name="Wide Front">
+ 広
+ </string>
+ <string name="Wide Lips">
+ 大ãã„å£
+ </string>
+ <string name="Wild">
+ ワイルド
+ </string>
+ <string name="Wrinkles">
+ ã—ã‚
+ </string>
+ <string name="LocationCtrlAddLandmarkTooltip">
+ マイ ランドマークã«è¿½åŠ 
+ </string>
+ <string name="LocationCtrlEditLandmarkTooltip">
+ マイ ランドマークを編集
+ </string>
+ <string name="LocationCtrlInfoBtnTooltip">
+ ç¾åœ¨åœ°ã®è©³ç´°ã‚’見る
+ </string>
+ <string name="LocationCtrlComboBtnTooltip">
+ マイ ロケーション履歴
+ </string>
+ <string name="LocationCtrlForSaleTooltip">
+ ã“ã®åœŸåœ°ã‚’購入
+ </string>
+ <string name="LocationCtrlVoiceTooltip">
+ ã“ã“ã§ã¯ãƒœã‚¤ã‚¹ã®åˆ©ç”¨ãŒã§ãã¾ã›ã‚“
+ </string>
+ <string name="LocationCtrlFlyTooltip">
+ 飛行ã¯ç¦æ­¢ã•れã¦ã„ã¾ã™
+ </string>
+ <string name="LocationCtrlPushTooltip">
+ ãƒ—ãƒƒã‚·ãƒ¥ç¦æ­¢
+ </string>
+ <string name="LocationCtrlBuildTooltip">
+ オブジェクトã®åˆ¶ä½œãƒ»ãƒ‰ãƒ­ãƒƒãƒ—ã¯ç¦æ­¢ã•れã¦ã„ã¾ã™
+ </string>
+ <string name="LocationCtrlScriptsTooltip">
+ スクリプトä¸å¯
+ </string>
+ <string name="LocationCtrlDamageTooltip">
+ 体力
+ </string>
+ <string name="LocationCtrlAdultIconTooltip">
+ Adult リージョン
+ </string>
+ <string name="LocationCtrlModerateIconTooltip">
+ Moderate リージョン
+ </string>
+ <string name="LocationCtrlGeneralIconTooltip">
+ General リージョン
+ </string>
+ <string name="LocationCtrlSeeAVsTooltip">
+ ã“ã®åŒºç”»å¤–ã«ã‚¢ãƒã‚¿ãƒ¼ã‚’見ãˆã‚‹ã‚ˆã†ã«ã—ã¦ã€ãƒãƒ£ãƒƒãƒˆã‚‚許å¯
+ </string>
+ <string name="UpdaterWindowTitle">
+ [APP_NAME] アップデート
+ </string>
+ <string name="UpdaterNowUpdating">
+ åªä»Š [APP_NAME] をアップデート中ã§ã™...
+ </string>
+ <string name="UpdaterNowInstalling">
+ [APP_NAME] をインストール中ã§ã™...
+ </string>
+ <string name="UpdaterUpdatingDescriptive">
+ ãŠä½¿ã„ã® [APP_NAME] ãƒ“ãƒ¥ãƒ¼ãƒ¯ãŒæœ€æ–°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã«ã‚¢ãƒƒãƒ—デートã•れã¦ã„ã¾ã™ã€‚ 数分ã‹ã‹ã‚‹ã“ã¨ãŒã‚りã¾ã™ã®ã§ã—ã°ã‚‰ããŠå¾…ã¡ãã ã•ã„。
+ </string>
+ <string name="UpdaterProgressBarTextWithEllipses">
+ アップデートをダウンロード中ã§ã™...
+ </string>
+ <string name="UpdaterProgressBarText">
+ アップデートをダウンロード中
+ </string>
+ <string name="UpdaterFailDownloadTitle">
+ アップデートã®ãƒ€ã‚¦ãƒ³ãƒ­ãƒ¼ãƒ‰ã«å¤±æ•—ã—ã¾ã—ãŸ
+ </string>
+ <string name="UpdaterFailUpdateDescriptive">
+ [APP_NAME] をアップデート中ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚ www.secondlife.com ã‹ã‚‰æœ€æ–°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’ダウンロードã—ã¦ãã ã•ã„。
+ </string>
+ <string name="UpdaterFailInstallTitle">
+ アップデートã®ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã«å¤±æ•—ã—ã¾ã—ãŸ
+ </string>
+ <string name="UpdaterFailStartTitle">
+ ビューワã®èµ·å‹•ã«å¤±æ•—ã—ã¾ã—ãŸ
+ </string>
+ <string name="ItemsComingInTooFastFrom">
+ [APP_NAME] : アイテム㌠[FROM_NAME] ã‹ã‚‰åŒæ™‚ã«ãŸãã•ん読ã¿è¾¼ã¾ã‚Œã¦ã„ã‚‹ãŸã‚ã€è‡ªå‹•プレビュー㌠[TIME] 秒間無効ã¨ãªã‚Šã¾ã™ã€‚
+ </string>
+ <string name="ItemsComingInTooFast">
+ [APP_NAME] : アイテムãŒåŒæ™‚ã«ãŸãã•ん読ã¿è¾¼ã¾ã‚Œã¦ã„ã‚‹ãŸã‚ã€è‡ªå‹•プレビュー㌠[TIME] 秒間無効ã¨ãªã‚Šã¾ã™ã€‚
+ </string>
+ <string name="IM_logging_string">
+ -- インスタントメッセージã®ä¿å­˜é–‹å§‹ --
+ </string>
+ <string name="IM_typing_start_string">
+ [NAME] ã¯å…¥åЛ䏭ã§ã™...
+ </string>
+ <string name="Unnamed">
+ (åå‰ãªã—)
+ </string>
+ <string name="IM_moderated_chat_label">
+ (モデレート: デフォルトã§ãƒœã‚¤ã‚¹ã¯ã‚ªãƒ•)
+ </string>
+ <string name="IM_unavailable_text_label">
+ ã“ã®ã‚³ãƒ¼ãƒ«ã§ã¯æ–‡å­—ãƒãƒ£ãƒƒãƒˆãŒåˆ©ç”¨ã§ãã¾ã›ã‚“。
+ </string>
+ <string name="IM_muted_text_label">
+ グループã®ãƒ¢ãƒ‡ãƒ¬ãƒ¼ã‚¿ãŒã€ã‚ãªãŸã®æ–‡å­—ãƒãƒ£ãƒƒãƒˆã‚’ä½¿ç”¨ç¦æ­¢ã«ã—ã¾ã—ãŸã€‚
+ </string>
+ <string name="IM_default_text_label">
+ ã“ã“をクリックã—ã¦ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ãƒˆãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’開始。
+ </string>
+ <string name="IM_to_label">
+ 宛先
+ </string>
+ <string name="IM_moderator_label">
+ (モデレータ)
+ </string>
+ <string name="Saved_message">
+ (ä¿å­˜æ—¥æ™‚:[LONG_TIMESTAMP])
+ </string>
+ <string name="IM_unblock_only_groups_friends">
+ ã“ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’表示ã™ã‚‹ã«ã¯ã€ã€Œç’°å¢ƒè¨­å®šã€ã®ã€Œãƒ—ライãƒã‚·ãƒ¼ã€ã§ã€Œãƒ•レンドã¨ã‚°ãƒ«ãƒ¼ãƒ—以外ã‹ã‚‰ã¯ã‚³ãƒ¼ãƒ«ã¨ IM ã‚’å—ä¿¡ã—ãªã„ã€ãƒã‚§ãƒƒã‚¯ãƒœãƒƒã‚¯ã‚¹ã‚’オフã«ã—ã¾ã™ã€‚
+ </string>
+ <string name="answered_call">
+ 相手ãŒã‚³ãƒ¼ãƒ«ã‚’å—ã‘ã¾ã—ãŸ
+ </string>
+ <string name="you_started_call">
+ ボイスコールを開始ã—ã¾ã™
+ </string>
+ <string name="you_joined_call">
+ ボイスコールã«å‚加ã—ã¾ã—ãŸ
+ </string>
+ <string name="name_started_call">
+ [NAME] ã¯ãƒœã‚¤ã‚¹ã‚³ãƒ¼ãƒ«ã‚’é–‹å§‹ã—ã¾ã™
+ </string>
+ <string name="ringing-im">
+ ボイスコールã«å‚加...
+ </string>
+ <string name="connected-im">
+ 接続ã—ã¾ã—ãŸã€‚コール終了をクリックã—ã¦åˆ‡ã‚Šã¾ã™
+ </string>
+ <string name="hang_up-im">
+ ボイスコールã‹ã‚‰é€€å¸­ã—ã¾ã—ãŸ
+ </string>
+ <string name="answering-im">
+ 接続中...
+ </string>
+ <string name="conference-title">
+ アドホックコンファレンス
+ </string>
+ <string name="conference-title-incoming">
+ [AGENT_NAME] ã¨ã‚³ãƒ³ãƒ•ァレンスã™ã‚‹
+ </string>
+ <string name="inventory_item_offered-im">
+ インベントリアイテムをé€ã‚Šã¾ã—ãŸ
+ </string>
+ <string name="share_alert">
+ インベントリã‹ã‚‰ã“ã“ã«ã‚¢ã‚¤ãƒ†ãƒ ã‚’ドラッグã—ã¾ã™
+ </string>
+ <string name="no_session_message">
+ (IM セッションãŒå­˜åœ¨ã—ã¾ã›ã‚“)
+ </string>
+ <string name="only_user_message">
+ ã“ã®ã‚»ãƒƒã‚·ãƒ§ãƒ³ã«ã„るユーザーã¯ã‚ãªãŸã ã‘ã§ã™ã€‚
+ </string>
+ <string name="offline_message">
+ [NAME] ã¯ã‚ªãƒ•ライン中ã§ã™ã€‚
+ </string>
+ <string name="invite_message">
+ ã“ã®ãƒœã‚¤ã‚¹ãƒãƒ£ãƒƒãƒˆã«å¿œç­”・接続ã™ã‚‹å ´åˆã¯ã€[BUTTON NAME] をクリックã—ã¦ãã ã•ã„。
+ </string>
+ <string name="muted_message">
+ ã“ã®ä½äººã‚’ブロックã—ã¦ã„ã¾ã™ã€‚ メッセージをé€ã‚‹ã¨ã€ãƒ–ロックãŒè‡ªå‹•çš„ã«è§£é™¤ã•れã¾ã™ã€‚
+ </string>
+ <string name="generic">
+ リクエスト中ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚ã‚ã¨ã§ã‚‚ã†ä¸€åº¦ãŠè©¦ã—ãã ã•ã„。
+ </string>
+ <string name="generic_request_error">
+ è¦æ±‚中ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚後ã§ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„。
+ </string>
+ <string name="insufficient_perms_error">
+ ã‚ãªãŸã«ã¯å……åˆ†ãªæ¨©é™ãŒã‚りã¾ã›ã‚“。
+ </string>
+ <string name="session_does_not_exist_error">
+ ã“ã®ã‚»ãƒƒã‚·ãƒ§ãƒ³ã¯æ—¢ã«åˆ‡æ–­ã•れã¦ã„ã¾ã™ã€‚
+ </string>
+ <string name="no_ability_error">
+ ã‚ãªãŸã«ã¯ãã®èƒ½åŠ›ãŒã‚りã¾ã›ã‚“。
+ </string>
+ <string name="no_ability">
+ ã‚ãªãŸã«ã¯ãã®èƒ½åŠ›ãŒã‚りã¾ã›ã‚“。
+ </string>
+ <string name="not_a_mod_error">
+ ã‚ãªãŸã¯ã‚»ãƒƒã‚·ãƒ§ãƒ³ãƒ¢ãƒ‡ãƒ¬ãƒ¼ã‚¿ã§ã¯ã‚りã¾ã›ã‚“。
+ </string>
+ <string name="muted">
+ グループã®ãƒ¢ãƒ‡ãƒ¬ãƒ¼ã‚¿ãƒ¼ãŒã€ã‚ãªãŸã®ãƒ†ã‚­ã‚¹ãƒˆãƒãƒ£ãƒƒãƒˆã‚’ç¦æ­¢ã—ã¾ã—ãŸã€‚
+ </string>
+ <string name="muted_error">
+ グループモデレータãŒã‚ãªãŸã®ãƒ†ã‚­ã‚¹ãƒˆãƒãƒ£ãƒƒãƒˆã‚’無効化ã—ã¾ã—ãŸ
+ </string>
+ <string name="add_session_event">
+ [RECIPIENT] ã¨ã®ãƒãƒ£ãƒƒãƒˆã‚»ãƒƒã‚·ãƒ§ãƒ³ã«ãƒ¦ãƒ¼ã‚¶ãƒ¼ã‚’追加ã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“
+ </string>
+ <string name="message">
+ [RECIPIENT] ã¨ã®ãƒãƒ£ãƒƒãƒˆã‚»ãƒƒã‚·ãƒ§ãƒ³ã«ã€ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’é€ä¿¡ã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。
+ </string>
+ <string name="message_session_event">
+ [RECIPIENT] ã¨ã®ãƒãƒ£ãƒƒãƒˆã‚»ãƒƒã‚·ãƒ§ãƒ³ã«ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’é€ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“
+ </string>
+ <string name="mute">
+ モデレート中ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚
+ </string>
+ <string name="removed">
+ グループã‹ã‚‰è„±é€€ã—ã¾ã—ãŸã€‚
+ </string>
+ <string name="removed_from_group">
+ ã‚ãªãŸã¯ã‚°ãƒ«ãƒ¼ãƒ—ã‹ã‚‰å‰Šé™¤ã•れã¾ã—ãŸã€‚
+ </string>
+ <string name="close_on_no_ability">
+ ã“ã®ãƒãƒ£ãƒƒãƒˆã‚»ãƒƒã‚·ãƒ§ãƒ³ã‚’継続ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“
+ </string>
+ <string name="unread_chat_single">
+ [SOURCES] ã¯ä½•ã‹æ–°ã—ã„ã“ã¨ã‚’言ã„ã¾ã—ãŸã€‚
+ </string>
+ <string name="unread_chat_multiple">
+ [SOURCES] ã¯ä½•ã‹æ–°ã—ã„ã“ã¨ã‚’言ã„ã¾ã—ãŸã€‚
+ </string>
+ <string name="session_initialization_timed_out_error">
+ セッションã®åˆæœŸåŒ–ãŒã‚¿ã‚¤ãƒ ã‚¢ã‚¦ãƒˆã—ã¾ã—ãŸ
+ </string>
+ <string name="Home position set.">
+ å®¶ã®é…ç½®ã®è¨­å®šã€‚
+ </string>
+ <string name="voice_morphing_url">
+ http://secondlife.com/landing/voicemorphing
+ </string>
+ <string name="paid_you_ldollars">
+ [NAME] 㯠[REASON] ã®ãŸã‚ã« L$[AMOUNT] を支払ã„ã¾ã—ãŸã€‚
+ </string>
+ <string name="paid_you_ldollars_no_reason">
+ [NAME] 㯠L$[AMOUNT] を支払ã„ã¾ã—ãŸã€‚
+ </string>
+ <string name="you_paid_ldollars">
+ [NAME] ã« L$ [AMOUNT] を支払ã„ã¾ã—ãŸï¼š[REASON]
+ </string>
+ <string name="you_paid_ldollars_no_info">
+ L$ [AMOUNT] を支払ã„ã¾ã—ãŸã€‚
+ </string>
+ <string name="you_paid_ldollars_no_reason">
+ [NAME] ã« L$ [AMOUNT] を支払ã„ã¾ã—ãŸã€‚
+ </string>
+ <string name="you_paid_ldollars_no_name">
+ L$ [AMOUNT] を支払ã„ã¾ã—ãŸï¼š[REASON]
+ </string>
+ <string name="you_paid_failure_ldollars">
+ [NAME] ã« [REASON] ã®ä»£é‡‘ L$ [AMOUNT] を支払ãˆã¾ã›ã‚“ã§ã—ãŸã€‚
+ </string>
+ <string name="you_paid_failure_ldollars_no_info">
+ L$ [AMOUNT] を支払ãˆã¾ã›ã‚“ã§ã—ãŸã€‚
+ </string>
+ <string name="you_paid_failure_ldollars_no_reason">
+ [NAME] ã« L$ [AMOUNT] を支払ãˆã¾ã›ã‚“ã§ã—ãŸã€‚
+ </string>
+ <string name="you_paid_failure_ldollars_no_name">
+ [REASON] 㮠代金 L$ [AMOUNT] を支払ãˆã¾ã›ã‚“ã§ã—ãŸã€‚
+ </string>
+ <string name="for item">
+ [ITEM] å‘ã‘
+ </string>
+ <string name="for a parcel of land">
+ 土地区画ã®ãŸã‚
+ </string>
+ <string name="for a land access pass">
+ 土地ã®å…¥å ´è¨±å¯ã‚’å¾—ã‚‹ãŸã‚
+ </string>
+ <string name="for deeding land">
+ 土地を譲渡ã™ã‚‹ãŸã‚
+ </string>
+ <string name="to create a group">
+ グループを作æˆã™ã‚‹ãŸã‚
+ </string>
+ <string name="to join a group">
+ グループã«å‚加ã™ã‚‹ãŸã‚
+ </string>
+ <string name="to upload">
+ アップロードã™ã‚‹ãŸã‚
+ </string>
+ <string name="to publish a classified ad">
+ クラシファイド広告を掲載ã™ã‚‹
+ </string>
+ <string name="giving">
+ L$[AMOUNT] を渡ã—ã¾ã™
+ </string>
+ <string name="uploading_costs">
+ アップロード料金㯠L$[AMOUNT] ã§ã™
+ </string>
+ <string name="this_costs">
+ 料金㯠L$[AMOUNT] ã§ã™
+ </string>
+ <string name="buying_selected_land">
+ é¸æŠžã—ãŸåœŸåœ°ã‚’ L$ [AMOUNT] ã§è³¼å…¥ã—ã¾ã™
+ </string>
+ <string name="this_object_costs">
+ ã“ã®ã‚ªãƒ–ジェクト㯠L$[AMOUNT] ã§ã™
+ </string>
+ <string name="group_role_everyone">
+ 全員
+ </string>
+ <string name="group_role_officers">
+ オフィサー
+ </string>
+ <string name="group_role_owners">
+ オーナー
+ </string>
+ <string name="group_member_status_online">
+ オンライン
+ </string>
+ <string name="uploading_abuse_report">
+ アップロード中...
+
+嫌ãŒã‚‰ã›ã®å ±å‘Š
+ </string>
+ <string name="New Shape">
+ æ–°ã—ã„シェイプ
+ </string>
+ <string name="New Skin">
+ æ–°ã—ã„スキン
+ </string>
+ <string name="New Hair">
+ æ–°ã—ã„髪
+ </string>
+ <string name="New Eyes">
+ æ–°ã—ã„ç›®
+ </string>
+ <string name="New Shirt">
+ æ–°ã—ã„シャツ
+ </string>
+ <string name="New Pants">
+ æ–°ã—ã„パンツ
+ </string>
+ <string name="New Shoes">
+ æ–°ã—ã„é´
+ </string>
+ <string name="New Socks">
+ æ–°ã—ã„é´ä¸‹
+ </string>
+ <string name="New Jacket">
+ æ–°ã—ã„ジャケット
+ </string>
+ <string name="New Gloves">
+ æ–°ã—ã„æ‰‹è¢‹
+ </string>
+ <string name="New Undershirt">
+ æ–°ã—ã„下ç€ï¼ˆä¸Šï¼‰
+ </string>
+ <string name="New Underpants">
+ æ–°ã—ã„下ç€ï¼ˆä¸‹ï¼‰
+ </string>
+ <string name="New Skirt">
+ æ–°ã—ã„スカート
+ </string>
+ <string name="New Alpha">
+ æ–°ã—ã„アルファ
+ </string>
+ <string name="New Tattoo">
+ æ–°ã—ã„タトゥ
+ </string>
+ <string name="New Physics">
+ æ–°è¦ã®ç‰©ç†ä½œç”¨
+ </string>
+ <string name="Invalid Wearable">
+ 無効ãªç€ç”¨ç‰©
+ </string>
+ <string name="New Gesture">
+ ジェスãƒãƒ£ãƒ¼
+ </string>
+ <string name="New Script">
+ æ–°è¦ã‚¹ã‚¯ãƒªãƒ—ト
+ </string>
+ <string name="New Note">
+ ノート
+ </string>
+ <string name="New Folder">
+ æ–°è¦ãƒ•ォルダ
+ </string>
+ <string name="Contents">
+ コンテンツ
+ </string>
+ <string name="Gesture">
+ ジェスãƒãƒ£ãƒ¼
+ </string>
+ <string name="Male Gestures">
+ 男性用ジェスãƒãƒ£ãƒ¼
+ </string>
+ <string name="Female Gestures">
+ 女性用ジェスãƒãƒ£ãƒ¼
+ </string>
+ <string name="Other Gestures">
+ ãã®ä»–ã®ã‚¸ã‚§ã‚¹ãƒãƒ£ãƒ¼
+ </string>
+ <string name="Speech Gestures">
+ 会話ジェスãƒãƒ£ãƒ¼
+ </string>
+ <string name="Common Gestures">
+ 一般的ジェスãƒãƒ£ãƒ¼
+ </string>
+ <string name="Male - Excuse me">
+ 男性 - ã™ã¿ã¾ã›ã‚“
+ </string>
+ <string name="Male - Get lost">
+ 男性 - Get lost
+ </string>
+ <string name="Male - Blow kiss">
+ 男性 - 投ã’キッス
+ </string>
+ <string name="Male - Boo">
+ 男性 - Boo
+ </string>
+ <string name="Male - Bored">
+ 男性 - 退屈
+ </string>
+ <string name="Male - Hey">
+ 男性 - Hey
+ </string>
+ <string name="Male - Laugh">
+ 男性 - 笑ã†
+ </string>
+ <string name="Male - Repulsed">
+ 男性 - 拒絶
+ </string>
+ <string name="Male - Shrug">
+ 男性 - è‚©ã‚’ã™ãã‚ã‚‹
+ </string>
+ <string name="Male - Stick tougue out">
+ 男性 - 舌を出ã™
+ </string>
+ <string name="Male - Wow">
+ 男性 - Wow
+ </string>
+ <string name="Female - Chuckle">
+ 女性 – クスクス
+ </string>
+ <string name="Female - Cry">
+ 女性 – æ³£ã
+ </string>
+ <string name="Female - Embarrassed">
+ 女性 – æ¥ãšã‹ã—ã„
+ </string>
+ <string name="Female - Excuse me">
+ 女性 – ã™ã¿ã¾ã›ã‚“
+ </string>
+ <string name="Female - Get lost">
+ 女性 – ã‚ã£ã¡è¡Œã£ã¦ã‚ˆ
+ </string>
+ <string name="Female - Blow kiss">
+ 女性 - 投ã’キッス
+ </string>
+ <string name="Female - Boo">
+ 女性 – ワッï¼
+ </string>
+ <string name="Female - Bored">
+ 女性 - 退屈
+ </string>
+ <string name="Female - Hey">
+ 女性 - Hey
+ </string>
+ <string name="Female - Hey baby">
+ 女性 – ヘイã€ãƒ™ã‚£ãƒ“ーï¼
+ </string>
+ <string name="Female - Laugh">
+ 女性 - 笑ã†
+ </string>
+ <string name="Female - Looking good">
+ 女性 – ã„ã„æ„Ÿã˜
+ </string>
+ <string name="Female - Over here">
+ 女性 – ã“ã£ã¡ã‚ˆ
+ </string>
+ <string name="Female - Please">
+ 女性 – プリーズ
+ </string>
+ <string name="Female - Repulsed">
+ 女性 - 拒絶
+ </string>
+ <string name="Female - Shrug">
+ 女性 - è‚©ã‚’ã™ãã‚ã‚‹
+ </string>
+ <string name="Female - Stick tougue out">
+ 女性 - 舌を出ã™
+ </string>
+ <string name="Female - Wow">
+ 女性 - Wow
+ </string>
+ <string name="/bow">
+ /ãŠã˜ãŽã™ã‚‹
+ </string>
+ <string name="/clap">
+ /æ‹æ‰‹
+ </string>
+ <string name="/count">
+ /æ•°ãˆã‚‹
+ </string>
+ <string name="/extinguish">
+ /消ã™
+ </string>
+ <string name="/kmb">
+ /ãããらãˆ
+ </string>
+ <string name="/muscle">
+ /筋肉もりもり
+ </string>
+ <string name="/no">
+ /ã„ã„ãˆ
+ </string>
+ <string name="/no!">
+ /ã ã‚ï¼
+ </string>
+ <string name="/paper">
+ /パー
+ </string>
+ <string name="/pointme">
+ /自分を指差ã™
+ </string>
+ <string name="/pointyou">
+ /相手を指差ã™
+ </string>
+ <string name="/rock">
+ /グー
+ </string>
+ <string name="/scissor">
+ /ãƒãƒ§ã‚­
+ </string>
+ <string name="/smoke">
+ /ã‚¿ãƒã‚³ã‚’å¸ã†
+ </string>
+ <string name="/stretch">
+ /伸ã³ã‚’ã™ã‚‹
+ </string>
+ <string name="/whistle">
+ /å£ç¬›ã‚’å¹ã
+ </string>
+ <string name="/yes">
+ /ã¯ã„
+ </string>
+ <string name="/yes!">
+ /イエスï¼
+ </string>
+ <string name="afk">
+ 一時退席中
+ </string>
+ <string name="dance1">
+ ダンス1
+ </string>
+ <string name="dance2">
+ ダンス2
+ </string>
+ <string name="dance3">
+ ダンス3
+ </string>
+ <string name="dance4">
+ ダンス4
+ </string>
+ <string name="dance5">
+ ダンス5
+ </string>
+ <string name="dance6">
+ ダンス6
+ </string>
+ <string name="dance7">
+ ダンス7
+ </string>
+ <string name="dance8">
+ ダンス8
+ </string>
+ <string name="AvatarBirthDateFormat">
+ [year,datetime,slt]/[mthnum,datetime,slt]/[day,datetime,slt]
+ </string>
+ <string name="DefaultMimeType">
+ ãªã—/ãªã—
+ </string>
+ <string name="texture_load_dimensions_error">
+ [WIDTH]*[HEIGHT] 以上ã®ç”»åƒã¯èª­ã¿è¾¼ã‚ã¾ã›ã‚“
+ </string>
+ <string name="words_separator" value=","/>
+ <string name="server_is_down">
+ 大変申ã—訳ã”ã–ã„ã¾ã›ã‚“ãŒã€äºˆæœŸã—ãªã„å•題ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚
+
+ サービスã«é–¢ã™ã‚‹æ—¢çŸ¥ã®å•題ã«ã¤ã„ã¦ã¯ã€status.secondlifegrid.net ã‚’ã”覧ãã ã•ã„。
+å•題ãŒå¼•ãç¶šã発生ã™ã‚‹å ´åˆã¯ã€ãŠä½¿ã„ã®ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã‚„ファイアウォールã®è¨­å®šã‚’調ã¹ã¦ãã ã•ã„。
+ </string>
+ <string name="dateTimeWeekdaysNames">
+ 日曜日:月曜日:ç«æ›œæ—¥:水曜日:木曜日:金曜日:土曜日
+ </string>
+ <string name="dateTimeWeekdaysShortNames">
+ æ—¥:月:ç«:æ°´:木:金:土
+ </string>
+ <string name="dateTimeMonthNames">
+ 1月:2月:3月:4月:5月:6月:7月:8月:9月:10月:11月:12月
+ </string>
+ <string name="dateTimeMonthShortNames">
+ 1月:2月:3月:4月:5月:6月:7月:8月:9月:10月:11月:12月
+ </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">
+ 会員
+ </string>
+ <string name="Roles">
+ 役割
+ </string>
+ <string name="Group Identity">
+ グループã®è­˜åˆ¥æƒ…å ±
+ </string>
+ <string name="Parcel Management">
+ 区画ã®ç®¡ç†
+ </string>
+ <string name="Parcel Identity">
+ 区画ã®è­˜åˆ¥æƒ…å ±
+ </string>
+ <string name="Parcel Settings">
+ 区画ã®è¨­å®š
+ </string>
+ <string name="Parcel Powers">
+ åŒºç”»ã®æ¨©é™
+ </string>
+ <string name="Parcel Access">
+ 区画ã¸ã®ã‚¢ã‚¯ã‚»ã‚¹
+ </string>
+ <string name="Parcel Content">
+ 区画ã®ã‚³ãƒ³ãƒ†ãƒ³ãƒ„
+ </string>
+ <string name="Object Management">
+ オブジェクトã®ç®¡ç†
+ </string>
+ <string name="Accounting">
+ 会計
+ </string>
+ <string name="Notices">
+ 通知
+ </string>
+ <string name="Chat" value=" ãƒãƒ£ãƒƒãƒˆï¼š">
+ ãƒãƒ£ãƒƒãƒˆ
+ </string>
+ <string name="DeleteItems">
+ é¸æŠžã—ãŸã‚¢ã‚¤ãƒ†ãƒ ã‚’削除ã—ã¾ã™ã‹
+ </string>
+ <string name="DeleteItem">
+ é¸æŠžã—ãŸã‚¢ã‚¤ãƒ†ãƒ ã‚’削除ã—ã¾ã™ã‹
+ </string>
+ <string name="EmptyOutfitText">
+ ã“ã®ã‚¢ã‚¦ãƒˆãƒ•ィットã«ã¯ã‚¢ã‚¤ãƒ†ãƒ ãŒã‚りã¾ã›ã‚“
+ </string>
+ <string name="ExternalEditorNotSet">
+ ExternalEditor 設定を使ã£ã¦ã‚¨ãƒ‡ã‚£ã‚¿ãƒ¼ã‚’é¸æŠžã—ã¾ã™ã€‚
+ </string>
+ <string name="ExternalEditorNotFound">
+ 指定ã•れãŸå¤–部エディターãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。
+エディターã¸ã®ãƒ‘スを二é‡å¼•用符ã§å›²ã‚“ã§ã¿ã¦ãã ã•ã„。
+(例:&quot;/path to my/editor&quot; &quot;%s&quot;)
+ </string>
+ <string name="ExternalEditorCommandParseError">
+ 外部エディターã®ã‚³ãƒžãƒ³ãƒ‰ã®è§£æžä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒè¦‹ã¤ã‹ã‚Šã¾ã—ãŸã€‚
+ </string>
+ <string name="ExternalEditorFailedToRun">
+ 外部エディターを実行ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚
+ </string>
+ <string name="TranslationFailed">
+ 翻訳ã§ãã¾ã›ã‚“ã§ã—ãŸï¼š[REASON]
+ </string>
+ <string name="TranslationResponseParseError">
+ 翻訳ã®å¿œç­”ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚
+ </string>
+ <string name="Esc">
+ Esc
+ </string>
+ <string name="Space">
+ 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>
+ <string name="Command_AboutLand_Label">
+ 土地情報
+ </string>
+ <string name="Command_Appearance_Label">
+ 容姿
+ </string>
+ <string name="Command_Avatar_Label">
+ ã‚¢ãƒã‚¿ãƒ¼
+ </string>
+ <string name="Command_Build_Label">
+ 制作
+ </string>
+ <string name="Command_Chat_Label">
+ ãƒãƒ£ãƒƒãƒˆ
+ </string>
+ <string name="Command_Compass_Label">
+ コンパス
+ </string>
+ <string name="Command_Destinations_Label">
+ 行ãå…ˆ
+ </string>
+ <string name="Command_Gestures_Label">
+ ジェスãƒãƒ£ãƒ¼
+ </string>
+ <string name="Command_HowTo_Label">
+ ãƒã‚¦ãƒ„ー
+ </string>
+ <string name="Command_Inventory_Label">
+ インベントリ
+ </string>
+ <string name="Command_Map_Label">
+ 地図
+ </string>
+ <string name="Command_Marketplace_Label">
+ マーケットプレイス
+ </string>
+ <string name="Command_MiniMap_Label">
+ ミニマップ
+ </string>
+ <string name="Command_Move_Label">
+ 歩行 / 走行 / 飛行
+ </string>
+ <string name="Command_Outbox_Label">
+ マーãƒãƒ£ãƒ³ãƒˆã‚¢ã‚¦ãƒˆãƒœãƒƒã‚¯ã‚¹
+ </string>
+ <string name="Command_People_Label">
+ 人
+ </string>
+ <string name="Command_Picks_Label">
+ ピック
+ </string>
+ <string name="Command_Places_Label">
+ 場所
+ </string>
+ <string name="Command_Preferences_Label">
+ 環境設定
+ </string>
+ <string name="Command_Profile_Label">
+ プロフィール
+ </string>
+ <string name="Command_Search_Label">
+ 検索
+ </string>
+ <string name="Command_Snapshot_Label">
+ スナップショット
+ </string>
+ <string name="Command_Speak_Label">
+ 話ã™
+ </string>
+ <string name="Command_View_Label">
+ カメラコントロール
+ </string>
+ <string name="Command_Voice_Label">
+ ボイス設定
+ </string>
+ <string name="Command_AboutLand_Tooltip">
+ 訪å•å…ˆã«é–¢ã™ã‚‹æƒ…å ±
+ </string>
+ <string name="Command_Appearance_Tooltip">
+ ã‚¢ãƒã‚¿ãƒ¼ã‚’変更
+ </string>
+ <string name="Command_Avatar_Tooltip">
+ ã‚¢ãƒã‚¿ãƒ¼ä¸€å¼ã‚’é¸æŠž
+ </string>
+ <string name="Command_Build_Tooltip">
+ オブジェクトã®åˆ¶ä½œã¨åœ°å½¢ã®å¤‰å½¢
+ </string>
+ <string name="Command_Chat_Tooltip">
+ è¿‘ãã®äººã¨æ–‡å­—ãƒãƒ£ãƒƒãƒˆã™ã‚‹
+ </string>
+ <string name="Command_Compass_Tooltip">
+ コンパス
+ </string>
+ <string name="Command_Destinations_Tooltip">
+ 行ã£ã¦ã¿ãŸã„場所
+ </string>
+ <string name="Command_Gestures_Tooltip">
+ ã‚¢ãƒã‚¿ãƒ¼ã®ã‚¸ã‚§ã‚¹ãƒãƒ£ãƒ¼
+ </string>
+ <string name="Command_HowTo_Tooltip">
+ 一般的タスクã®å®Ÿè¡Œæ–¹æ³•
+ </string>
+ <string name="Command_Inventory_Tooltip">
+ インベントリを表示・使用
+ </string>
+ <string name="Command_Map_Tooltip">
+ 世界地図
+ </string>
+ <string name="Command_Marketplace_Tooltip">
+ ショッピングã«å‡ºæŽ›ã‘ã‚‹
+ </string>
+ <string name="Command_MiniMap_Tooltip">
+ è¿‘ãã®äººã‚’表示ã™ã‚‹
+ </string>
+ <string name="Command_Move_Tooltip">
+ ã‚¢ãƒã‚¿ãƒ¼ã®ç§»å‹•
+ </string>
+ <string name="Command_Outbox_Tooltip">
+ 販売用ã«ã‚¢ã‚¤ãƒ†ãƒ ã‚’マーケットプレイスã«è»¢é€
+ </string>
+ <string name="Command_People_Tooltip">
+ フレンドã€ã‚°ãƒ«ãƒ¼ãƒ—ã€è¿‘ãã®äºº
+ </string>
+ <string name="Command_Picks_Tooltip">
+ プロフィールã§ç´¹ä»‹ã™ã‚‹ãŠæ°—ã«å…¥ã‚Šã®å ´æ‰€
+ </string>
+ <string name="Command_Places_Tooltip">
+ ä¿å­˜æ¸ˆã¿ã®å ´æ‰€
+ </string>
+ <string name="Command_Preferences_Tooltip">
+ 環境設定
+ </string>
+ <string name="Command_Profile_Tooltip">
+ プロフィールを編集・表示
+ </string>
+ <string name="Command_Search_Tooltip">
+ 場所ã€ã‚¤ãƒ™ãƒ³ãƒˆã€äººã‚’検索
+ </string>
+ <string name="Command_Snapshot_Tooltip">
+ ピクãƒãƒ£ã‚’撮る
+ </string>
+ <string name="Command_Speak_Tooltip">
+ マイクを使ã£ã¦è¿‘ãã®äººã¨è©±ã™
+ </string>
+ <string name="Command_View_Tooltip">
+ カメラã®è§’度を変更
+ </string>
+ <string name="Command_Voice_Tooltip">
+ インワールドã§ã®ã‚³ãƒ¼ãƒ«ã‚„è¿‘ãã«ã„る人ã®éŸ³é‡èª¿æ•´
+ </string>
+ <string name="Toolbar_Bottom_Tooltip">
+ ç¾åœ¨ã€ä¸‹ã®ãƒ„ールãƒãƒ¼ã«ã‚りã¾ã™
+ </string>
+ <string name="Toolbar_Left_Tooltip">
+ ç¾åœ¨ã€å·¦ã®ãƒ„ールãƒãƒ¼ã«ã‚りã¾ã™
+ </string>
+ <string name="Toolbar_Right_Tooltip">
+ ç¾åœ¨ã€å³ã®ãƒ„ールãƒãƒ¼ã«ã‚りã¾ã™
+ </string>
+ <string name="Retain%">
+ ç¶­æŒçއ
+ </string>
+ <string name="Detail">
+ 詳細
+ </string>
+ <string name="Better Detail">
+ ã‚‚ã£ã¨è©³ã—ã
+ </string>
+ <string name="Surface">
+ 表é¢
+ </string>
+ <string name="Solid">
+ ソリッド
+ </string>
+ <string name="Wrap">
+ ラップ
+ </string>
+ <string name="Preview">
+ プレビュー
+ </string>
+ <string name="Normal">
+ 普通
+ </string>
+ <string name="snapshot_quality_very_low">
+ éžå¸¸ã«ä½Žã„
+ </string>
+ <string name="snapshot_quality_low">
+ 低
+ </string>
+ <string name="snapshot_quality_medium">
+ 中
+ </string>
+ <string name="snapshot_quality_high">
+ 高
+ </string>
+ <string name="snapshot_quality_very_high">
+ éžå¸¸ã«é«˜ã„
+ </string>
+</strings>
diff --git a/indra/newview/skins/steam/xui/pl/strings.xml b/indra/newview/skins/steam/xui/pl/strings.xml
new file mode 100644
index 0000000000..f6dec8536b
--- /dev/null
+++ b/indra/newview/skins/steam/xui/pl/strings.xml
@@ -0,0 +1,4340 @@
+<?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="CAPITALIZED_APP_NAME">
+ SECOND LIFE
+ </string>
+ <string name="SUPPORT_SITE">
+ Portal Pomocy Second Life
+ </string>
+ <string name="StartupDetectingHardware">
+ Wykrywanie dysku twardego...
+ </string>
+ <string name="StartupLoading">
+ Åadowanie [APP_NAME]...
+ </string>
+ <string name="StartupClearingCache">
+ Czyszczenie bufora danych...
+ </string>
+ <string name="StartupInitializingTextureCache">
+ Inicjowanie bufora danych tekstur...
+ </string>
+ <string name="StartupInitializingVFS">
+ Inicjowanie VFS...
+ </string>
+ <string name="ProgressRestoring">
+ Przywracanie...
+ </string>
+ <string name="ProgressChangingResolution">
+ Zmiana rozdzielczości...
+ </string>
+ <string name="LoginInProgress">
+ Trwa logowanie. [APP_NAME] Proszę czekać.
+ </string>
+ <string name="LoginInProgressNoFrozen">
+ Logowanie...
+ </string>
+ <string name="LoginAuthenticating">
+ Autoryzacja
+ </string>
+ <string name="LoginMaintenance">
+ W trakcie obslugi konta...
+ </string>
+ <string name="LoginAttempt">
+ Poprzednie logowanie nie udalo się. Logowanie, próba numer [NUMBER]
+ </string>
+ <string name="LoginPrecaching">
+ Åadowanie Å›wiata...
+ </string>
+ <string name="LoginInitializingBrowser">
+ Inicjalizacja przeglÄ…darki internetowej...
+ </string>
+ <string name="LoginInitializingMultimedia">
+ Inicjalizacja multimediów...
+ </string>
+ <string name="LoginInitializingFonts">
+ Åadowanie czcionek...
+ </string>
+ <string name="LoginVerifyingCache">
+ Weryfikacja bufora danych na dysku (może trwać od 60 do 90 sekund)...
+ </string>
+ <string name="LoginProcessingResponse">
+ Przetwarzanie odpowiedzi...
+ </string>
+ <string name="LoginInitializingWorld">
+ Inicjacja świata...
+ </string>
+ <string name="LoginDecodingImages">
+ Przetwarzanie obrazów...
+ </string>
+ <string name="LoginInitializingQuicktime">
+ Inicjacja QuickTime...
+ </string>
+ <string name="LoginQuicktimeNotFound">
+ QuickTime nie został znaleziony - inicjacja przerwana.
+ </string>
+ <string name="LoginQuicktimeOK">
+ QuickTime zainicjowany.
+ </string>
+ <string name="LoginWaitingForRegionHandshake">
+ Oczekiwanie na połączenie z regionem...
+ </string>
+ <string name="LoginConnectingToRegion">
+ ÅÄ…czenie z regionem...
+ </string>
+ <string name="LoginDownloadingClothing">
+ Åadowanie ubrania...
+ </string>
+ <string name="InvalidCertificate">
+ Serwer zwrócił nieważny lub zniekształcony certyfikat. Proszę skontaktuj się z administratorem Grida.
+ </string>
+ <string name="CertInvalidHostname">
+ Nazwa hosta jest nieważna, proszę sprawdź SLURL lub nazwę hosta Grida.
+ </string>
+ <string name="CertExpired">
+ Termin ważności certyfikatu zwróconego przez Grid minął. Proszę sprawdzić swój zegar systemowy lub skontaktować się z administratorem Grida.
+ </string>
+ <string name="CertKeyUsage">
+ Certyfikat zwrócony przez serwer nie może być użyty dla SSL. Proszę skontaktuj się z administratorem Grida.
+ </string>
+ <string name="CertBasicConstraints">
+ Zbyt wiele certyfikatów w łańcuchu certyfikatów serwera. Proszę skontaktować się z administratorem Grida.
+ </string>
+ <string name="CertInvalidSignature">
+ Podpis certyfikatu zwrócony przez Grid nie mógł zostać zweryfikowany. Proszę skontaktować się z administratorem Grida.
+ </string>
+ <string name="LoginFailedNoNetwork">
+ Błąd sieci: Brak połączenia z siecią, sprawdź status swojego połączenia internetowego.
+ </string>
+ <string name="LoginFailed">
+ Logowanie nie powiodło się.
+ </string>
+ <string name="Quit">
+ Wyłącz program
+ </string>
+ <string name="AgentLostConnection">
+ Ten region może mieć problemy. Sprawdź podłączenie do Internetu.
+ </string>
+ <string name="SavingSettings">
+ Zachowanie ustawień...
+ </string>
+ <string name="LoggingOut">
+ Trwa wylogowanie...
+ </string>
+ <string name="ShuttingDown">
+ Zamykanie...
+ </string>
+ <string name="YouHaveBeenDisconnected">
+ Nastąpiło rozłączenie z regionem.
+ </string>
+ <string name="SentToInvalidRegion">
+ Region jest niedostępny.
+ </string>
+ <string name="TestingDisconnect">
+ Nastąpiło rozłączenie testowania klienta
+ </string>
+ <string name="TooltipPerson">
+ Osoba
+ </string>
+ <string name="TooltipNoName">
+ (brak nazwy)
+ </string>
+ <string name="TooltipOwner">
+ Właściciel:
+ </string>
+ <string name="TooltipPublic">
+ Publiczny
+ </string>
+ <string name="TooltipIsGroup">
+ (Grupa)
+ </string>
+ <string name="TooltipForSaleL$">
+ Na sprzedaż: L$[AMOUNT]
+ </string>
+ <string name="TooltipFlagGroupBuild">
+ Budowanie grupowe
+ </string>
+ <string name="TooltipFlagNoBuild">
+ Budowanie zabronione
+ </string>
+ <string name="TooltipFlagNoEdit">
+ Edycja zabroniona
+ </string>
+ <string name="TooltipFlagNotSafe">
+ Niebezpieczny obszar
+ </string>
+ <string name="TooltipFlagNoFly">
+ Latanie zabronione
+ </string>
+ <string name="TooltipFlagGroupScripts">
+ Skrypty grupowe
+ </string>
+ <string name="TooltipFlagNoScripts">
+ Skrypty zabronione
+ </string>
+ <string name="TooltipLand">
+ Posiadłość:
+ </string>
+ <string name="TooltipMustSingleDrop">
+ Tylko pojedynczy obiekt może być tutaj przeciągnięty
+ </string>
+ <string name="TooltipPrice" value="L$[AMOUNT]:"/>
+ <string name="TooltipHttpUrl">
+ Kliknij aby zobaczyć zawartość tej strony internetowej
+ </string>
+ <string name="TooltipSLURL">
+ Kliknij aby zobaczyć szczegóły tego miejsca
+ </string>
+ <string name="TooltipAgentUrl">
+ Kliknij aby zobaczyc profil Rezydenta
+ </string>
+ <string name="TooltipAgentInspect">
+ Dowiedz się więcej o tym Rezydencie
+ </string>
+ <string name="TooltipAgentMute">
+ Kliknij aby wyciszyc tego Rezydenta
+ </string>
+ <string name="TooltipAgentUnmute">
+ Kliknij aby cofnąć zablokowanie tego Rezydenta
+ </string>
+ <string name="TooltipAgentIM">
+ Kliknij aby wysłać wiadomość IM do tego Rezydenta
+ </string>
+ <string name="TooltipAgentPay">
+ Kliknij aby zapłacić temu Rezydentowi
+ </string>
+ <string name="TooltipAgentOfferTeleport">
+ Kliknij aby oferować teleport temu Rezydentowi
+ </string>
+ <string name="TooltipAgentRequestFriend">
+ Kliknij aby wysłać temu Rezydentowi zaproszenie do Znajomych
+ </string>
+ <string name="TooltipGroupUrl">
+ Kliknij aby zobaczyć opis tej grupy
+ </string>
+ <string name="TooltipEventUrl">
+ Klinij aby zobaczyć szczegóły tego wydarzenia
+ </string>
+ <string name="TooltipClassifiedUrl">
+ Kliknij aby zobaczyć tę reklamę
+ </string>
+ <string name="TooltipParcelUrl">
+ Kliknij aby zobaczyć opis tej posiadłości
+ </string>
+ <string name="TooltipTeleportUrl">
+ Kliknij aby teleportować się do tego miejsca
+ </string>
+ <string name="TooltipObjectIMUrl">
+ Kliknij aby zobaczyć opis tego obiektu
+ </string>
+ <string name="TooltipMapUrl">
+ Kliknij aby zobaczyć to miejsce na mapie
+ </string>
+ <string name="TooltipSLAPP">
+ Kliknij aby uruchomić secondlife:// command
+ </string>
+ <string name="CurrentURL" value=" Obecny Adres: [CurrentURL]"/>
+ <string name="SLurlLabelTeleport">
+ Teleportuj do
+ </string>
+ <string name="SLurlLabelShowOnMap">
+ Pokaż na mapie
+ </string>
+ <string name="SLappAgentMute">
+ Zablokuj
+ </string>
+ <string name="SLappAgentUnmute">
+ Cofnij zablokowanie
+ </string>
+ <string name="SLappAgentIM">
+ IM
+ </string>
+ <string name="SLappAgentPay">
+ Zapłać
+ </string>
+ <string name="SLappAgentOfferTeleport">
+ Teleportuj do
+ </string>
+ <string name="SLappAgentRequestFriend">
+ Oferta znajomości
+ </string>
+ <string name="BUTTON_CLOSE_DARWIN">
+ Zamknij (⌘W)
+ </string>
+ <string name="BUTTON_CLOSE_WIN">
+ Zamknij (Ctrl+W)
+ </string>
+ <string name="BUTTON_CLOSE_CHROME">
+ Zamknij
+ </string>
+ <string name="BUTTON_RESTORE">
+ Odzyskaj
+ </string>
+ <string name="BUTTON_MINIMIZE">
+ Minimalizuj
+ </string>
+ <string name="BUTTON_TEAR_OFF">
+ Oderwij
+ </string>
+ <string name="BUTTON_DOCK">
+ Przyłącz
+ </string>
+ <string name="BUTTON_HELP">
+ Pokaż Pomoc
+ </string>
+ <string name="Searching">
+ Wyszukiwanie...
+ </string>
+ <string name="NoneFound">
+ Nie odnaleziono.
+ </string>
+ <string name="RetrievingData">
+ Odzyskiwanie danych...
+ </string>
+ <string name="ReleaseNotes">
+ O tej wersji
+ </string>
+ <string name="RELEASE_NOTES_BASE_URL">
+ http://wiki.secondlife.com/wiki/Release_Notes/
+ </string>
+ <string name="LoadingData">
+ Åadowanie danych...
+ </string>
+ <string name="AvatarNameNobody">
+ (brak danych)
+ </string>
+ <string name="AvatarNameWaiting">
+ (ładowanie)
+ </string>
+ <string name="GroupNameNone">
+ (brak danych)
+ </string>
+ <string name="AvalineCaller">
+ Avaline [ORDER]
+ </string>
+ <string name="AssetErrorNone">
+ OK
+ </string>
+ <string name="AssetErrorRequestFailed">
+ Pobieranie danych: błąd
+ </string>
+ <string name="AssetErrorNonexistentFile">
+ Pobieranie danych: brak pliku
+ </string>
+ <string name="AssetErrorNotInDatabase">
+ Pobieranie danych: dane nie zostały znalezione w bazie danych
+ </string>
+ <string name="AssetErrorEOF">
+ Koniec pliku
+ </string>
+ <string name="AssetErrorCannotOpenFile">
+ Nie można otworzyć pliku
+ </string>
+ <string name="AssetErrorFileNotFound">
+ Brak pliku
+ </string>
+ <string name="AssetErrorTCPTimeout">
+ Transfer pliku - przekroczony limit czasu
+ </string>
+ <string name="AssetErrorCircuitGone">
+ Połączenie przerwane
+ </string>
+ <string name="AssetErrorPriceMismatch">
+ Brak zgodności pomiędzy serwerem i klientem na realizację podanej ceny.
+ </string>
+ <string name="AssetErrorUnknownStatus">
+ Status nieznany
+ </string>
+ <string name="texture">
+ tekstury
+ </string>
+ <string name="sound">
+ dźwięku
+ </string>
+ <string name="calling card">
+ wizytówki
+ </string>
+ <string name="landmark">
+ ulubionego miejsca
+ </string>
+ <string name="legacy script">
+ skryptu
+ </string>
+ <string name="clothing">
+ ubrania
+ </string>
+ <string name="object">
+ obiek
+ </string>
+ <string name="note card">
+ notatki
+ </string>
+ <string name="folder">
+ folder
+ </string>
+ <string name="root">
+ podstawy
+ </string>
+ <string name="lsl2 script">
+ skrypt LSL2
+ </string>
+ <string name="lsl bytecode">
+ kod LSL
+ </string>
+ <string name="tga texture">
+ tekstury typu tga
+ </string>
+ <string name="body part">
+ części ciała
+ </string>
+ <string name="snapshot">
+ zdjęcia
+ </string>
+ <string name="lost and found">
+ Zgubione i odnalezione
+ </string>
+ <string name="targa image">
+ obraz typu targa
+ </string>
+ <string name="trash">
+ Kosz
+ </string>
+ <string name="jpeg image">
+ obraz typu jpg
+ </string>
+ <string name="animation">
+ animacja
+ </string>
+ <string name="gesture">
+ gesturka
+ </string>
+ <string name="simstate">
+ simstate
+ </string>
+ <string name="favorite">
+ ulubione
+ </string>
+ <string name="symbolic link">
+ link
+ </string>
+ <string name="symbolic folder link">
+ link folderu
+ </string>
+ <string name="AvatarEditingAppearance">
+ (Edycja WyglÄ…d)
+ </string>
+ <string name="AvatarAway">
+ Åšpi
+ </string>
+ <string name="AvatarBusy">
+ Pracuje
+ </string>
+ <string name="AvatarMuted">
+ Wyciszony
+ </string>
+ <string name="anim_express_afraid">
+ Strach
+ </string>
+ <string name="anim_express_anger">
+ Złość
+ </string>
+ <string name="anim_away">
+ Sen
+ </string>
+ <string name="anim_backflip">
+ Salto
+ </string>
+ <string name="anim_express_laugh">
+ Åšmiech do rozpuku
+ </string>
+ <string name="anim_express_toothsmile">
+ Wielki uśmiech
+ </string>
+ <string name="anim_blowkiss">
+ Całusek
+ </string>
+ <string name="anim_express_bored">
+ Ale nudy!
+ </string>
+ <string name="anim_bow">
+ Ukłon
+ </string>
+ <string name="anim_clap">
+ Oklaski
+ </string>
+ <string name="anim_courtbow">
+ Dworski ukłon
+ </string>
+ <string name="anim_express_cry">
+ Płacz
+ </string>
+ <string name="anim_dance1">
+ Taniec 1
+ </string>
+ <string name="anim_dance2">
+ Taniec 2
+ </string>
+ <string name="anim_dance3">
+ Taniec 3
+ </string>
+ <string name="anim_dance4">
+ Taniec 4
+ </string>
+ <string name="anim_dance5">
+ Taniec 5
+ </string>
+ <string name="anim_dance6">
+ Taniec 6
+ </string>
+ <string name="anim_dance7">
+ Taniec 7
+ </string>
+ <string name="anim_dance8">
+ Taniec 8
+ </string>
+ <string name="anim_express_disdain">
+ Pogarda
+ </string>
+ <string name="anim_drink">
+ Picie
+ </string>
+ <string name="anim_express_embarrased">
+ Zakłopotanie
+ </string>
+ <string name="anim_angry_fingerwag">
+ Grożenie paluszkiem
+ </string>
+ <string name="anim_fist_pump">
+ Udało się!
+ </string>
+ <string name="anim_yoga_float">
+ Yoga
+ </string>
+ <string name="anim_express_frown">
+ Grymas
+ </string>
+ <string name="anim_impatient">
+ Niecierpliwość
+ </string>
+ <string name="anim_jumpforjoy">
+ Radocha
+ </string>
+ <string name="anim_kissmybutt">
+ Pocałuj mnie gdzieś
+ </string>
+ <string name="anim_express_kiss">
+ Pocałunek
+ </string>
+ <string name="anim_laugh_short">
+ Åšmiech
+ </string>
+ <string name="anim_musclebeach">
+ Szpan
+ </string>
+ <string name="anim_no_unhappy">
+ Nie (Smutno)
+ </string>
+ <string name="anim_no_head">
+ Nie
+ </string>
+ <string name="anim_nyanya">
+ Nie-nie-nie
+ </string>
+ <string name="anim_punch_onetwo">
+ Za ciosem cios
+ </string>
+ <string name="anim_express_open_mouth">
+ Szczęka opada
+ </string>
+ <string name="anim_peace">
+ Pokój
+ </string>
+ <string name="anim_point_you">
+ Wskazuj na innych
+ </string>
+ <string name="anim_point_me">
+ Wskazuj na siebie
+ </string>
+ <string name="anim_punch_l">
+ Uderz z lewej
+ </string>
+ <string name="anim_punch_r">
+ Uderz z prawej
+ </string>
+ <string name="anim_rps_countdown">
+ KPN licz
+ </string>
+ <string name="anim_rps_paper">
+ KPN papier
+ </string>
+ <string name="anim_rps_rock">
+ KPN kamień
+ </string>
+ <string name="anim_rps_scissors">
+ KPN nożyce
+ </string>
+ <string name="anim_express_repulsed">
+ Odrzuca mnie
+ </string>
+ <string name="anim_kick_roundhouse_r">
+ Kopniak
+ </string>
+ <string name="anim_express_sad">
+ Smutek
+ </string>
+ <string name="anim_salute">
+ Pozdrów
+ </string>
+ <string name="anim_shout">
+ Krzycz
+ </string>
+ <string name="anim_express_shrug">
+ Wzrusz ramionami
+ </string>
+ <string name="anim_express_smile">
+ Uśmiechaj się
+ </string>
+ <string name="anim_smoke_idle">
+ Pal
+ </string>
+ <string name="anim_smoke_inhale">
+ Pal i zaciÄ…gaj siÄ™
+ </string>
+ <string name="anim_smoke_throw_down">
+ Rzuć papierosa
+ </string>
+ <string name="anim_express_surprise">
+ Zaskoczenie
+ </string>
+ <string name="anim_sword_strike_r">
+ Uderz mieczem
+ </string>
+ <string name="anim_angry_tantrum">
+ Wściekłość
+ </string>
+ <string name="anim_express_tongue_out">
+ Pokaż język
+ </string>
+ <string name="anim_hello">
+ Pomachaj
+ </string>
+ <string name="anim_whisper">
+ Zaszeptaj
+ </string>
+ <string name="anim_whistle">
+ Zagwiżdż
+ </string>
+ <string name="anim_express_wink">
+ Puść oko
+ </string>
+ <string name="anim_wink_hollywood">
+ Puść oko (Hollywood)
+ </string>
+ <string name="anim_express_worry">
+ Zmartwienie
+ </string>
+ <string name="anim_yes_happy">
+ Tak (Szczęście)
+ </string>
+ <string name="anim_yes_head">
+ Tak
+ </string>
+ <string name="texture_loading">
+ Åadowanie...
+ </string>
+ <string name="worldmap_offline">
+ Mapa Świata jest niedostępna
+ </string>
+ <string name="worldmap_item_tooltip_format">
+ [AREA] m² L$[PRICE]
+ </string>
+ <string name="worldmap_results_none_found">
+ Miejsce nieodnalezione.
+ </string>
+ <string name="Ok">
+ OK
+ </string>
+ <string name="Premature end of file">
+ Przedwczesna końcówka pliku
+ </string>
+ <string name="ST_NO_JOINT">
+ PODSTAWA lub ÅÄ„CZNIK nieodnaleziona/y
+ </string>
+ <string name="whisper">
+ szepcze:
+ </string>
+ <string name="shout">
+ krzyczy:
+ </string>
+ <string name="ringing">
+ ÅÄ…czenie z rozmowami gÅ‚osem w Åšwiecie...
+ </string>
+ <string name="connected">
+ Połączenie uzyskane.
+ </string>
+ <string name="unavailable">
+ Niestety, rozmowy głosem są niedozwolone w tym miejscu.
+ </string>
+ <string name="hang_up">
+ Połączenie rozmowy utracone.
+ </string>
+ <string name="reconnect_nearby">
+ Przełączanie do pobliskich rozmów głosowych
+ </string>
+ <string name="ScriptQuestionCautionChatGranted">
+ &apos;[OBJECTNAME]&apos;, właściciel: &apos;[OWNERNAME]&apos;, położenie: [REGIONNAME] [REGIONPOS], pozwala Ci na: [PERMISSIONS].
+ </string>
+ <string name="ScriptQuestionCautionChatDenied">
+ &apos;[OBJECTNAME]&apos;, właściciel: &apos;[OWNERNAME]&apos;, położenie: [REGIONNAME] [REGIONPOS], nie pozwala Ci na: [PERMISSIONS].
+ </string>
+ <string name="ScriptTakeMoney">
+ Zabiera Lindeny (L$) od Ciebie
+ </string>
+ <string name="ActOnControlInputs">
+ Używaj klawiszy sterowania
+ </string>
+ <string name="RemapControlInputs">
+ Zmień klawisze sterowania
+ </string>
+ <string name="AnimateYourAvatar">
+ Animuj Awatara
+ </string>
+ <string name="AttachToYourAvatar">
+ Dołącz do Awatara
+ </string>
+ <string name="ReleaseOwnership">
+ Usuń prawo własności (zmień na publiczne)
+ </string>
+ <string name="LinkAndDelink">
+ ÅÄ…cz / rozłącz z innymi obiektami
+ </string>
+ <string name="AddAndRemoveJoints">
+ Dodaj / usuń połączenia z innymi obiektami
+ </string>
+ <string name="ChangePermissions">
+ Ustaw zezwolenia
+ </string>
+ <string name="TrackYourCamera">
+ Chodź za kamerą
+ </string>
+ <string name="ControlYourCamera">
+ Kontroluj kamerÄ™
+ </string>
+ <string name="SIM_ACCESS_PG">
+ &apos;General&apos;
+ </string>
+ <string name="SIM_ACCESS_MATURE">
+ &apos;Moderate&apos;
+ </string>
+ <string name="SIM_ACCESS_ADULT">
+ &apos;Adult&apos;
+ </string>
+ <string name="SIM_ACCESS_DOWN">
+ Niedostępny
+ </string>
+ <string name="SIM_ACCESS_MIN">
+ Nieznany
+ </string>
+ <string name="land_type_unknown">
+ (nieznane)
+ </string>
+ <string name="Estate / Full Region">
+ MajÄ…tek / Region
+ </string>
+ <string name="Estate / Homestead">
+ Estate / Homestead
+ </string>
+ <string name="Mainland / Homestead">
+ Mainland / Homestead
+ </string>
+ <string name="Mainland / Full Region">
+ Mainland / Region
+ </string>
+ <string name="all_files">
+ Wszystkie pliki
+ </string>
+ <string name="sound_files">
+ Dźwięki
+ </string>
+ <string name="animation_files">
+ Animacje
+ </string>
+ <string name="image_files">
+ Obrazy
+ </string>
+ <string name="save_file_verb">
+ Zapisz
+ </string>
+ <string name="load_file_verb">
+ Załaduj
+ </string>
+ <string name="targa_image_files">
+ Obrazy targa
+ </string>
+ <string name="bitmap_image_files">
+ Obrazy bitmap
+ </string>
+ <string name="avi_movie_file">
+ Pliki filmowe AVI
+ </string>
+ <string name="xaf_animation_file">
+ Plik animacji XAF
+ </string>
+ <string name="xml_file">
+ Plik XML
+ </string>
+ <string name="raw_file">
+ Plik RAW
+ </string>
+ <string name="compressed_image_files">
+ Obrazy skomprensowane
+ </string>
+ <string name="load_files">
+ Załaduj pliki
+ </string>
+ <string name="choose_the_directory">
+ Wybierz katalog
+ </string>
+ <string name="AvatarSetNotAway">
+ Ustaw Nie Åšpij
+ </string>
+ <string name="AvatarSetAway">
+ Åšpij
+ </string>
+ <string name="AvatarSetNotBusy">
+ Ustawiaj Nie Pracuj
+ </string>
+ <string name="AvatarSetBusy">
+ Pracuj
+ </string>
+ <string name="shape">
+ Kształt
+ </string>
+ <string name="skin">
+ Skórka
+ </string>
+ <string name="hair">
+ Włosy
+ </string>
+ <string name="eyes">
+ Oczy
+ </string>
+ <string name="shirt">
+ Koszulka
+ </string>
+ <string name="pants">
+ Spodnie
+ </string>
+ <string name="shoes">
+ Buty
+ </string>
+ <string name="socks">
+ Skarpetki
+ </string>
+ <string name="jacket">
+ Kurtka
+ </string>
+ <string name="gloves">
+ Rękawiczki
+ </string>
+ <string name="undershirt">
+ Podkoszulka
+ </string>
+ <string name="underpants">
+ Bielizna
+ </string>
+ <string name="skirt">
+ Spódnica
+ </string>
+ <string name="alpha">
+ Ubranie Alpha
+ </string>
+ <string name="tattoo">
+ Tatuaż
+ </string>
+ <string name="physics">
+ Fizyka
+ </string>
+ <string name="invalid">
+ niewłaściwa funkcja
+ </string>
+ <string name="none">
+ żadne
+ </string>
+ <string name="shirt_not_worn">
+ Koszula nie jest założona
+ </string>
+ <string name="pants_not_worn">
+ Spodnie nie są założone
+ </string>
+ <string name="shoes_not_worn">
+ Buty nie są założone
+ </string>
+ <string name="socks_not_worn">
+ Skarpetki nie są założone
+ </string>
+ <string name="jacket_not_worn">
+ Kurtka nie jest założona
+ </string>
+ <string name="gloves_not_worn">
+ Rękawiczki nie są założone
+ </string>
+ <string name="undershirt_not_worn">
+ Podkoszulek nie jest założony
+ </string>
+ <string name="underpants_not_worn">
+ Bielizna nie jest założona
+ </string>
+ <string name="skirt_not_worn">
+ Spódnica nie jest założona
+ </string>
+ <string name="alpha_not_worn">
+ Alpha nie jest założone
+ </string>
+ <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>
+ <string name="create_new_shape">
+ Nowy kształt
+ </string>
+ <string name="create_new_skin">
+ Nowa skórka
+ </string>
+ <string name="create_new_hair">
+ Nowe włosy
+ </string>
+ <string name="create_new_eyes">
+ Nowe oczy
+ </string>
+ <string name="create_new_shirt">
+ Nowa koszula
+ </string>
+ <string name="create_new_pants">
+ Nowe spodnie
+ </string>
+ <string name="create_new_shoes">
+ Nowe buty
+ </string>
+ <string name="create_new_socks">
+ Nowe skarpetki
+ </string>
+ <string name="create_new_jacket">
+ Nowa kurtka
+ </string>
+ <string name="create_new_gloves">
+ Nowe rękawiczki
+ </string>
+ <string name="create_new_undershirt">
+ Nowy podkoszulek
+ </string>
+ <string name="create_new_underpants">
+ Nowa bielizna
+ </string>
+ <string name="create_new_skirt">
+ Nowa spódnica
+ </string>
+ <string name="create_new_alpha">
+ Nowe alpha
+ </string>
+ <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>
+ <string name="NewWearable">
+ Nowa [WEARABLE_ITEM]
+ </string>
+ <string name="next">
+ Następne
+ </string>
+ <string name="ok">
+ OK
+ </string>
+ <string name="GroupNotifyGroupNotice">
+ Ogłoszenie grupowe
+ </string>
+ <string name="GroupNotifyGroupNotices">
+ Ogłoszenia grupowe
+ </string>
+ <string name="GroupNotifySentBy">
+ Wysłane przez
+ </string>
+ <string name="GroupNotifyAttached">
+ Załączone:
+ </string>
+ <string name="GroupNotifyViewPastNotices">
+ Zobacz poprzednie zawiadomienia lub otrzymane wiadomości tutaj.
+ </string>
+ <string name="GroupNotifyOpenAttachment">
+ Otwórz załącznik
+ </string>
+ <string name="GroupNotifySaveAttachment">
+ Zapisz załącznik
+ </string>
+ <string name="TeleportOffer">
+ Oferta teleportacji
+ </string>
+ <string name="StartUpNotifications">
+ Nowe zawiadomienia zostały wysłane kiedy byłeś/byłaś w trybie oddalenia...
+ </string>
+ <string name="OverflowInfoChannelString">
+ Masz jeszcze [%d] powiadomień
+ </string>
+ <string name="BodyPartsRightArm">
+ Prawe ramiÄ™
+ </string>
+ <string name="BodyPartsHead">
+ Głowa
+ </string>
+ <string name="BodyPartsLeftArm">
+ Lewe ramiÄ™
+ </string>
+ <string name="BodyPartsLeftLeg">
+ Lewa noga
+ </string>
+ <string name="BodyPartsTorso">
+ Tułów
+ </string>
+ <string name="BodyPartsRightLeg">
+ Prawa noga
+ </string>
+ <string name="GraphicsQualityLow">
+ Niska
+ </string>
+ <string name="GraphicsQualityMid">
+ Åšrednia
+ </string>
+ <string name="GraphicsQualityHigh">
+ Wysoka
+ </string>
+ <string name="LeaveMouselook">
+ Wybierz ESC aby powrócić do trybu widoku normalnego
+ </string>
+ <string name="InventoryNoMatchingItems">
+ Nie znaleziono tego czego szukasz? Spróbuj [secondlife:///app/search/all/[SEARCH_TERM] Szukaj].
+ </string>
+ <string name="PlacesNoMatchingItems">
+ Nie znaleziono tego czego szukasz? Spróbuj [secondlife:///app/search/places/[SEARCH_TERM] Szukaj].
+ </string>
+ <string name="FavoritesNoMatchingItems">
+ Przeciągnij landmark tutaj aby dodać go do swoich ulubionych.
+ </string>
+ <string name="InventoryNoTexture">
+ Nie posiadasz kopii tej tekstury w Twojej Szafie.
+ </string>
+ <string name="no_transfer" value=" (brak oddawania)"/>
+ <string name="no_modify" value=" (brak modyfikowania)"/>
+ <string name="no_copy" value=" (brak kopiowania)"/>
+ <string name="worn" value=" (załóż)"/>
+ <string name="link" value=" (link)"/>
+ <string name="broken_link" value=" (broken_link)"/>
+ <string name="LoadingContents">
+ Åadowanie zawartoÅ›ci...
+ </string>
+ <string name="NoContents">
+ Brak zawartości
+ </string>
+ <string name="WornOnAttachmentPoint" value=" (założony na [ATTACHMENT_POINT])"/>
+ <string name="ActiveGesture" value="[GESLABEL] (aktywne)"/>
+ <string name="Chat Message" value="Czat:"/>
+ <string name="Sound" value=" Dźwięk :"/>
+ <string name="Wait" value=" --- Zaczekaj :"/>
+ <string name="AnimFlagStop" value=" Zatrzymaj animacjÄ™ :"/>
+ <string name="AnimFlagStart" value=" Rozpocznij animacjÄ™ :"/>
+ <string name="Wave" value=" Wave"/>
+ <string name="GestureActionNone" value="Żadne"/>
+ <string name="HelloAvatar" value=" Witaj, Awatarze!"/>
+ <string name="ViewAllGestures" value=" Zobacz wszystkie &gt;&gt;"/>
+ <string name="GetMoreGestures" value="Więcej gesturek &gt;&gt;"/>
+ <string name="Animations" value=" Animacje,"/>
+ <string name="Calling Cards" value=" Wizytówki,"/>
+ <string name="Clothing" value=" Ubrania,"/>
+ <string name="Gestures" value=" Gesturki,"/>
+ <string name="Landmarks" value=" Ulubione miejsca,"/>
+ <string name="Notecards" value=" Notki,"/>
+ <string name="Objects" value=" Obiekty,"/>
+ <string name="Scripts" value=" Skrypty,"/>
+ <string name="Sounds" value=" Dźwięki,"/>
+ <string name="Textures" value=" Tekstury,"/>
+ <string name="Snapshots" value=" Zdjęcia,"/>
+ <string name="No Filters" value="Nie "/>
+ <string name="Since Logoff" value=" - od wylogowania siÄ™"/>
+ <string name="InvFolder My Inventory">
+ Moja Szafa
+ </string>
+ <string name="InvFolder Library">
+ Biblioteka
+ </string>
+ <string name="InvFolder Textures">
+ Tekstury
+ </string>
+ <string name="InvFolder Sounds">
+ Dźwięki
+ </string>
+ <string name="InvFolder Calling Cards">
+ Wizytówki
+ </string>
+ <string name="InvFolder Landmarks">
+ Landmarki
+ </string>
+ <string name="InvFolder Scripts">
+ Skrypty
+ </string>
+ <string name="InvFolder Clothing">
+ Ubrania
+ </string>
+ <string name="InvFolder Objects">
+ Obiekty
+ </string>
+ <string name="InvFolder Notecards">
+ Noty
+ </string>
+ <string name="InvFolder New Folder">
+ Nowy folder
+ </string>
+ <string name="InvFolder Inventory">
+ Szafa
+ </string>
+ <string name="InvFolder Uncompressed Images">
+ Nieskompresowane obrazy
+ </string>
+ <string name="InvFolder Body Parts">
+ Części ciała
+ </string>
+ <string name="InvFolder Trash">
+ Kosz
+ </string>
+ <string name="InvFolder Photo Album">
+ Album ze zdjęciami
+ </string>
+ <string name="InvFolder Lost And Found">
+ Zagubione i odnalezione
+ </string>
+ <string name="InvFolder Uncompressed Sounds">
+ Nieskompresowane dźwięki
+ </string>
+ <string name="InvFolder Animations">
+ Animacje
+ </string>
+ <string name="InvFolder Gestures">
+ Gesturki
+ </string>
+ <string name="InvFolder Favorite">
+ Moje ulubione
+ </string>
+ <string name="InvFolder favorite">
+ Moje ulubione
+ </string>
+ <string name="InvFolder Current Outfit">
+ Obecny strój
+ </string>
+ <string name="InvFolder Initial Outfits">
+ PoczÄ…tkowe stroje
+ </string>
+ <string name="InvFolder My Outfits">
+ Moje stroje
+ </string>
+ <string name="InvFolder Accessories">
+ Akcesoria
+ </string>
+ <string name="InvFolder Friends">
+ Znajomi
+ </string>
+ <string name="InvFolder All">
+ Wszystkie
+ </string>
+ <string name="Buy">
+ Kup
+ </string>
+ <string name="BuyforL$">
+ Kup za L$
+ </string>
+ <string name="Stone">
+ Kamień
+ </string>
+ <string name="Metal">
+ Metal
+ </string>
+ <string name="Glass">
+ Szkło
+ </string>
+ <string name="Wood">
+ Drewno
+ </string>
+ <string name="Flesh">
+ Tkanka
+ </string>
+ <string name="Plastic">
+ Plastik
+ </string>
+ <string name="Rubber">
+ Guma
+ </string>
+ <string name="Light">
+ Lekkie
+ </string>
+ <string name="KBShift">
+ Shift
+ </string>
+ <string name="KBCtrl">
+ Ctrl
+ </string>
+ <string name="Chest">
+ Klatka piersiowa
+ </string>
+ <string name="Skull">
+ Czaszka
+ </string>
+ <string name="Left Shoulder">
+ Lewe ramiÄ™
+ </string>
+ <string name="Right Shoulder">
+ Prawe ramiÄ™
+ </string>
+ <string name="Left Hand">
+ Lewa dłoń
+ </string>
+ <string name="Right Hand">
+ Prawa dłoń
+ </string>
+ <string name="Left Foot">
+ Lewa stopa
+ </string>
+ <string name="Right Foot">
+ Prawa stopa
+ </string>
+ <string name="Spine">
+ Kręgosłup
+ </string>
+ <string name="Pelvis">
+ Miednica
+ </string>
+ <string name="Mouth">
+ Usta
+ </string>
+ <string name="Chin">
+ Szczęka
+ </string>
+ <string name="Left Ear">
+ Lewe ucho
+ </string>
+ <string name="Right Ear">
+ Prawe ucho
+ </string>
+ <string name="Left Eyeball">
+ Lewe oko
+ </string>
+ <string name="Right Eyeball">
+ Prawe oko
+ </string>
+ <string name="Nose">
+ Nos
+ </string>
+ <string name="R Upper Arm">
+ P RamiÄ™
+ </string>
+ <string name="R Forearm">
+ P przedramiÄ™
+ </string>
+ <string name="L Upper Arm">
+ L ramiÄ™
+ </string>
+ <string name="L Forearm">
+ L przedramiÄ™
+ </string>
+ <string name="Right Hip">
+ Prawe biodro
+ </string>
+ <string name="R Upper Leg">
+ P udo
+ </string>
+ <string name="R Lower Leg">
+ P dolna noga
+ </string>
+ <string name="Left Hip">
+ Lewe biodro
+ </string>
+ <string name="L Upper Leg">
+ L udo
+ </string>
+ <string name="L Lower Leg">
+ L dolna noga
+ </string>
+ <string name="Stomach">
+ Brzuch
+ </string>
+ <string name="Left Pec">
+ Lewy Pec
+ </string>
+ <string name="Right Pec">
+ Prawy Pec
+ </string>
+ <string name="Invalid Attachment">
+ Nieważny punkt załącznika
+ </string>
+ <string name="YearsMonthsOld">
+ [AGEYEARS] [AGEMONTHS]
+ </string>
+ <string name="YearsOld">
+ [AGEYEARS]
+ </string>
+ <string name="MonthsOld">
+ [AGEMONTHS]
+ </string>
+ <string name="WeeksOld">
+ [AGEWEEKS]
+ </string>
+ <string name="DaysOld">
+ [AGEDAYS]
+ </string>
+ <string name="TodayOld">
+ Dołączył dzisiaj
+ </string>
+ <string name="AgeYearsA">
+ [COUNT] rok
+ </string>
+ <string name="AgeYearsB">
+ [COUNT] lat
+ </string>
+ <string name="AgeYearsC">
+ [COUNT] lat
+ </string>
+ <string name="AgeMonthsA">
+ [COUNT] miesiÄ…c
+ </string>
+ <string name="AgeMonthsB">
+ [COUNT] miesięcy
+ </string>
+ <string name="AgeMonthsC">
+ [COUNT] miesięcy
+ </string>
+ <string name="AgeWeeksA">
+ [COUNT] tydzień
+ </string>
+ <string name="AgeWeeksB">
+ [COUNT] tygodni
+ </string>
+ <string name="AgeWeeksC">
+ [COUNT] tygodni
+ </string>
+ <string name="AgeDaysA">
+ [COUNT] dzień
+ </string>
+ <string name="AgeDaysB">
+ [COUNT] dni
+ </string>
+ <string name="AgeDaysC">
+ [COUNT] dni
+ </string>
+ <string name="GroupMembersA">
+ [COUNT] członek
+ </string>
+ <string name="GroupMembersB">
+ [COUNT] członków
+ </string>
+ <string name="GroupMembersC">
+ [COUNT] członków
+ </string>
+ <string name="AcctTypeResident">
+ Rezydent
+ </string>
+ <string name="AcctTypeTrial">
+ Proces
+ </string>
+ <string name="AcctTypeCharterMember">
+ Wyróżniony członek
+ </string>
+ <string name="AcctTypeEmployee">
+ Pracownik Linden Lab
+ </string>
+ <string name="PaymentInfoUsed">
+ Dane konta używane
+ </string>
+ <string name="PaymentInfoOnFile">
+ Dane płatnicze na koncie
+ </string>
+ <string name="NoPaymentInfoOnFile">
+ Brak danych na koncie
+ </string>
+ <string name="AgeVerified">
+ Weryfikacja wieku przeprowadzona
+ </string>
+ <string name="NotAgeVerified">
+ Brak weryfikacji wieku
+ </string>
+ <string name="Center 2">
+ Åšrodek 2
+ </string>
+ <string name="Top Right">
+ Prawa góra
+ </string>
+ <string name="Top">
+ Góra
+ </string>
+ <string name="Top Left">
+ Lewa góra
+ </string>
+ <string name="Center">
+ Åšrodek
+ </string>
+ <string name="Bottom Left">
+ Lewy dół
+ </string>
+ <string name="Bottom">
+ Dół
+ </string>
+ <string name="Bottom Right">
+ Prawy dół
+ </string>
+ <string name="CompileQueueDownloadedCompiling">
+ Pobieranie zakończone, rozpoczęcie kompilacji
+ </string>
+ <string name="CompileQueueScriptNotFound">
+ Skrypt nie został odnaleziony na serwerze.
+ </string>
+ <string name="CompileQueueProblemDownloading">
+ Problem z pobieraniem
+ </string>
+ <string name="CompileQueueInsufficientPermDownload">
+ Brak odpowiedniej zgody do pobrania skryptu.
+ </string>
+ <string name="CompileQueueInsufficientPermFor">
+ Brak odpowiedniej zgody dla
+ </string>
+ <string name="CompileQueueUnknownFailure">
+ Nieznany błąd podczas próby pobierania
+ </string>
+ <string name="CompileQueueTitle">
+ Postęp rekompilacji
+ </string>
+ <string name="CompileQueueStart">
+ rekompiluj
+ </string>
+ <string name="ResetQueueTitle">
+ Zresetuj
+ </string>
+ <string name="ResetQueueStart">
+ zresetuj
+ </string>
+ <string name="RunQueueTitle">
+ Ustaw uruchomiaj progres
+ </string>
+ <string name="RunQueueStart">
+ ustaw uruchom
+ </string>
+ <string name="NotRunQueueTitle">
+ Ustaw nie uruchamiaj progres
+ </string>
+ <string name="NotRunQueueStart">
+ ustaw nie uruchamiaj
+ </string>
+ <string name="CompileSuccessful">
+ Kompliacja zakończona pomyślnie!
+ </string>
+ <string name="CompileSuccessfulSaving">
+ Komplilacja zakończona pomyślnie, zapisywanie...
+ </string>
+ <string name="SaveComplete">
+ Zapisywanie zakończone.
+ </string>
+ <string name="ObjectOutOfRange">
+ Skrypt (obiekt poza zasięgiem)
+ </string>
+ <string name="GodToolsObjectOwnedBy">
+ Obiekt [OBJECT] należący do [OWNER]
+ </string>
+ <string name="GroupsNone">
+ żadne
+ </string>
+ <string name="Group" value=" (groupa)"/>
+ <string name="Unknown">
+ (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="GroupIndividualShare" value=" Groupa Udziały Indywidualne"/>
+ <string name="GroupColumn" value="Grupa"/>
+ <string name="Balance">
+ Stan
+ </string>
+ <string name="Credits">
+ Kredyty
+ </string>
+ <string name="Debits">
+ Debet
+ </string>
+ <string name="Total">
+ Suma
+ </string>
+ <string name="NoGroupDataFound">
+ Brak informacji na temat podanej grupy
+ </string>
+ <string name="IMParentEstate">
+ parent estate
+ </string>
+ <string name="IMMainland">
+ główny
+ </string>
+ <string name="IMTeen">
+ dla niepełnoletnich
+ </string>
+ <string name="RegionInfoError">
+ błąd
+ </string>
+ <string name="RegionInfoAllEstatesOwnedBy">
+ wszystkie majątki, które są własnością [OWNER]
+ </string>
+ <string name="RegionInfoAllEstatesYouOwn">
+ wszystkie majątki, które posiadasz
+ </string>
+ <string name="RegionInfoAllEstatesYouManage">
+ wszystkie majątki, które nadzorujesz dla [OWNER]
+ </string>
+ <string name="RegionInfoAllowedResidents">
+ Dozwoleni Rezydenci: ([ALLOWEDAGENTS], maks. [MAXACCESS])
+ </string>
+ <string name="RegionInfoAllowedGroups">
+ Grupy mające dostęp: ([ALLOWEDGROUPS], max [MAXACCESS])
+ </string>
+ <string name="ScriptLimitsParcelScriptMemory">
+ Pamięć skryptów Posiadłości
+ </string>
+ <string name="ScriptLimitsParcelsOwned">
+ Posiadłości: [PARCELS]
+ </string>
+ <string name="ScriptLimitsMemoryUsed">
+ Pamięć wykorzystana: [COUNT] kb z [MAX] kb; [AVAILABLE] kb pozostało
+ </string>
+ <string name="ScriptLimitsMemoryUsedSimple">
+ Pamięć wykorzystana: [COUNT] kb
+ </string>
+ <string name="ScriptLimitsParcelScriptURLs">
+ Skrypty URL Posiadłości
+ </string>
+ <string name="ScriptLimitsURLsUsed">
+ URL: [COUNT] z [MAX]; [AVAILABLE] dostępne
+ </string>
+ <string name="ScriptLimitsURLsUsedSimple">
+ URL: [COUNT]
+ </string>
+ <string name="ScriptLimitsRequestError">
+ Błąd wyszukiwania informacji
+ </string>
+ <string name="ScriptLimitsRequestNoParcelSelected">
+ Posiadłość nie została wybrana
+ </string>
+ <string name="ScriptLimitsRequestWrongRegion">
+ Błąd: informacja o skrypcie jest dostępna tylko w obecnym regionie.
+ </string>
+ <string name="ScriptLimitsRequestWaiting">
+ Wyszukiwanie informacji...
+ </string>
+ <string name="ScriptLimitsRequestDontOwnParcel">
+ Nie masz pozwolenia na sprawdzenie pasiadłości.
+ </string>
+ <string name="SITTING_ON">
+ Usiądź na
+ </string>
+ <string name="ATTACH_CHEST">
+ Klatka piersiowa
+ </string>
+ <string name="ATTACH_HEAD">
+ Głowa
+ </string>
+ <string name="ATTACH_LSHOULDER">
+ Lewe ramiÄ™
+ </string>
+ <string name="ATTACH_RSHOULDER">
+ Prawe ramiÄ™
+ </string>
+ <string name="ATTACH_LHAND">
+ Lewa ręka
+ </string>
+ <string name="ATTACH_RHAND">
+ Prawa ręka
+ </string>
+ <string name="ATTACH_LFOOT">
+ Lewa stopa
+ </string>
+ <string name="ATTACH_RFOOT">
+ Prawa stopa
+ </string>
+ <string name="ATTACH_BACK">
+ Plecy
+ </string>
+ <string name="ATTACH_PELVIS">
+ Miednica
+ </string>
+ <string name="ATTACH_MOUTH">
+ Usta
+ </string>
+ <string name="ATTACH_CHIN">
+ Podbródek
+ </string>
+ <string name="ATTACH_LEAR">
+ Ucho lewe
+ </string>
+ <string name="ATTACH_REAR">
+ Prawe ucho
+ </string>
+ <string name="ATTACH_LEYE">
+ Lewe oko
+ </string>
+ <string name="ATTACH_REYE">
+ Prawe oko
+ </string>
+ <string name="ATTACH_NOSE">
+ Nos
+ </string>
+ <string name="ATTACH_RUARM">
+ Prawe górne ramię
+ </string>
+ <string name="ATTACH_RLARM">
+ Prawe dolne ramiÄ™
+ </string>
+ <string name="ATTACH_LUARM">
+ Ramię L Górne
+ </string>
+ <string name="ATTACH_LLARM">
+ Lewe dolne ramiÄ™
+ </string>
+ <string name="ATTACH_RHIP">
+ Biodro prawe
+ </string>
+ <string name="ATTACH_RULEG">
+ Prawa górna noga
+ </string>
+ <string name="ATTACH_RLLEG">
+ Prawa dolna noga
+ </string>
+ <string name="ATTACH_LHIP">
+ Biodro lewe
+ </string>
+ <string name="ATTACH_LULEG">
+ Lewa gorna noga
+ </string>
+ <string name="ATTACH_LLLEG">
+ Lewa dolna noga
+ </string>
+ <string name="ATTACH_BELLY">
+ Brzuch
+ </string>
+ <string name="ATTACH_RPEC">
+ Prawa klatka
+ </string>
+ <string name="ATTACH_LPEC">
+ Lewa klatka
+ </string>
+ <string name="ATTACH_HUD_CENTER_2">
+ HUD środek 2
+ </string>
+ <string name="ATTACH_HUD_TOP_RIGHT">
+ HUD prawy górny
+ </string>
+ <string name="ATTACH_HUD_TOP_CENTER">
+ HUD środek górny
+ </string>
+ <string name="ATTACH_HUD_TOP_LEFT">
+ HUD lewa gora
+ </string>
+ <string name="ATTACH_HUD_CENTER_1">
+ HUD środek 1
+ </string>
+ <string name="ATTACH_HUD_BOTTOM_LEFT">
+ HUD lewa dolna strona
+ </string>
+ <string name="ATTACH_HUD_BOTTOM">
+ HUD dolny
+ </string>
+ <string name="ATTACH_HUD_BOTTOM_RIGHT">
+ HUD prawa dolna strona
+ </string>
+ <string name="CursorPos">
+ Linia [LINE], Kolumna [COLUMN]
+ </string>
+ <string name="PanelDirCountFound">
+ [COUNT] odnalezionych
+ </string>
+ <string name="PanelContentsTooltip">
+ Zawartość obiektu
+ </string>
+ <string name="PanelContentsNewScript">
+ Nowy skrypt
+ </string>
+ <string name="BusyModeResponseDefault">
+ Rezydent, do którego wysłałeś wiadomość prywatną znajduje się w trybie pracy. Oznacza to, iż Twoja wiadomość zostanie zapisana do przejrzenia poźniej.
+ </string>
+ <string name="MuteByName">
+ (Nazwa)
+ </string>
+ <string name="MuteAgent">
+ (Rezydent)
+ </string>
+ <string name="MuteObject">
+ (Obiekt)
+ </string>
+ <string name="MuteGroup">
+ (GrupÄ™)
+ </string>
+ <string name="MuteExternal">
+ (Zewnętrzne)
+ </string>
+ <string name="RegionNoCovenant">
+ Brak umowy dla tego majÄ…tku.
+ </string>
+ <string name="RegionNoCovenantOtherOwner">
+ Brak umowy dla tego majątku. Każda posiadłość w tym majątku została sprzedana przez właściciela majątku nie Linden Lab. Skontaktuj się z właścicielem majątku w celu uzuskania szczegółów sprzedaży.
+ </string>
+ <string name="covenant_last_modified" value="Ostatnio modyfikowano: "/>
+ <string name="none_text" value=" (żadne) "/>
+ <string name="never_text" value=" (nigdy) "/>
+ <string name="GroupOwned">
+ Własność grupy
+ </string>
+ <string name="Public">
+ Publiczny
+ </string>
+ <string name="ClassifiedClicksTxt">
+ Kliknij: [TELEPORT] teleportuj, [MAP] mapa, [PROFILE] profil
+ </string>
+ <string name="ClassifiedUpdateAfterPublish">
+ (zostanie zaktualizowane po publikacji)
+ </string>
+ <string name="NoPicksClassifiedsText">
+ Nie dodałeś nic do Ulubionych i Reklam. Kliknij na poniższy przycisk Dodaj aby dodać miejsce do Ulubionych lub Reklamy.
+ </string>
+ <string name="NoAvatarPicksClassifiedsText">
+ Brak ulubionych miejsc/reklam
+ </string>
+ <string name="PicksClassifiedsLoadingText">
+ Åadowanie...
+ </string>
+ <string name="MultiPreviewTitle">
+ PodglÄ…d
+ </string>
+ <string name="MultiPropertiesTitle">
+ Właściwości
+ </string>
+ <string name="InvOfferAnObjectNamed">
+ Obiekt o nazwie
+ </string>
+ <string name="InvOfferOwnedByGroup">
+ należacy do grupy
+ </string>
+ <string name="InvOfferOwnedByUnknownGroup">
+ należący do nieznanej grupy
+ </string>
+ <string name="InvOfferOwnedBy">
+ należy do
+ </string>
+ <string name="InvOfferOwnedByUnknownUser">
+ należący do nieznanego właściciela
+ </string>
+ <string name="InvOfferGaveYou">
+ oddany Tobie
+ </string>
+ <string name="InvOfferDecline">
+ Odrzucono [DESC] od &lt;nolink&gt;[NAME]&lt;/nolink&gt;.
+ </string>
+ <string name="GroupMoneyTotal">
+ Suma
+ </string>
+ <string name="GroupMoneyBought">
+ zakupione
+ </string>
+ <string name="GroupMoneyPaidYou">
+ zapłać sobie
+ </string>
+ <string name="GroupMoneyPaidInto">
+ zapłać do
+ </string>
+ <string name="GroupMoneyBoughtPassTo">
+ kup dostęp do
+ </string>
+ <string name="GroupMoneyPaidFeeForEvent">
+ zapłać opłatę za wydarzenie
+ </string>
+ <string name="GroupMoneyPaidPrizeForEvent">
+ zapłać za wydarzenia
+ </string>
+ <string name="GroupMoneyBalance">
+ Stan
+ </string>
+ <string name="GroupMoneyCredits">
+ Kredyty
+ </string>
+ <string name="GroupMoneyDebits">
+ Debet
+ </string>
+ <string name="ViewerObjectContents">
+ Zawartość
+ </string>
+ <string name="AcquiredItems">
+ Zdobyte obiekty
+ </string>
+ <string name="Cancel">
+ Anuluj
+ </string>
+ <string name="UploadingCosts">
+ Załadowanie [NAME] kosztuje [AMOUNT]L$
+ </string>
+ <string name="BuyingCosts">
+ Cena zakupu tego wynosi L$ [AMOUNT]
+ </string>
+ <string name="UnknownFileExtension">
+ Nieznane rozszerzenie dla pliku [.%s]
+Expected .wav, .tga, .bmp, .jpg, .jpeg, or .bvh
+ </string>
+ <string name="MuteObject2">
+ Zablokuj
+ </string>
+ <string name="AddLandmarkNavBarMenu">
+ Dodaj Ulubione Miejsce...
+ </string>
+ <string name="EditLandmarkNavBarMenu">
+ Edytuj Ulubione Miejce...
+ </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">
+ Zapisane pliki
+ </string>
+ <string name="Receiving">
+ Otrzymane
+ </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">
+ Do przodu
+ </string>
+ <string name="Direction_Left">
+ Lewo
+ </string>
+ <string name="Direction_Right">
+ Prawo
+ </string>
+ <string name="Direction_Back">
+ Wstecz
+ </string>
+ <string name="Direction_North">
+ Północ
+ </string>
+ <string name="Direction_South">
+ Południe
+ </string>
+ <string name="Direction_West">
+ Zachód
+ </string>
+ <string name="Direction_East">
+ Wschód
+ </string>
+ <string name="Direction_Up">
+ W górę
+ </string>
+ <string name="Direction_Down">
+ W dół
+ </string>
+ <string name="Any Category">
+ Każda Kategoria
+ </string>
+ <string name="Shopping">
+ Zakupy
+ </string>
+ <string name="Land Rental">
+ Wynajem ziemi
+ </string>
+ <string name="Property Rental">
+ Wynajem Posiadłości
+ </string>
+ <string name="Special Attraction">
+ Specjalne Oferty
+ </string>
+ <string name="New Products">
+ Nowe produkty
+ </string>
+ <string name="Employment">
+ Praca
+ </string>
+ <string name="Wanted">
+ Poszukiwane
+ </string>
+ <string name="Service">
+ Serwis
+ </string>
+ <string name="Personal">
+ Personalne
+ </string>
+ <string name="None">
+ Żadne
+ </string>
+ <string name="Linden Location">
+ Linden Lokalizacja
+ </string>
+ <string name="Adult">
+ &apos;Adult&apos;
+ </string>
+ <string name="Arts&amp;Culture">
+ Sztuka i Kultura
+ </string>
+ <string name="Business">
+ Biznes
+ </string>
+ <string name="Educational">
+ Edukacyjna
+ </string>
+ <string name="Gaming">
+ Gra
+ </string>
+ <string name="Hangout">
+ Poznawanie ludzi
+ </string>
+ <string name="Newcomer Friendly">
+ Przyjazne dla nowych
+ </string>
+ <string name="Parks&amp;Nature">
+ Parki i Natura
+ </string>
+ <string name="Residential">
+ Mieszkalna
+ </string>
+ <string name="Stage">
+ Scena
+ </string>
+ <string name="Other">
+ Inna
+ </string>
+ <string name="Rental">
+ Wynajem
+ </string>
+ <string name="Any">
+ Jakiekolwiek
+ </string>
+ <string name="You">
+ Ty
+ </string>
+ <string name="Multiple Media">
+ Multimedia
+ </string>
+ <string name="Play Media">
+ Uruchom/Zatrzymaj media
+ </string>
+ <string name="MBCmdLineError">
+ Podczas realizacji podanej komendy, wystąpił błąd.
+Prosimy odwiedzić stronę internetową: http://wiki.secondlife.com/wiki/Client_parameters
+Błąd:
+ </string>
+ <string name="MBCmdLineUsg">
+ [APP_NAME] zastosowana komenda:
+ </string>
+ <string name="MBUnableToAccessFile">
+ Aplikacja [APP_NAME] nie odnalazła poszukiwanego pliku.
+
+Może być to spowodowane aktywnością kilku kopii oprogramowania w tej samej chwili lub Twój system błędnie odczytuje proces zakończenia dla uruchomionuch aplikacji.
+Jeżeli nadal otrzymujesz ten komunikat, uruchom swój komputer ponownie.
+Jeżeli problem nadal występuje, proponujemy całkowite odinstalowanie aplikacji [APP_NAME] oraz ponowną jej instalację.
+ </string>
+ <string name="MBFatalError">
+ Błąd krytyczny
+ </string>
+ <string name="MBRequiresAltiVec">
+ Aplikacja [APP_NAME] wymaga procesora z AltiVec (wersja G4 lub starsza).
+ </string>
+ <string name="MBAlreadyRunning">
+ Aplikacja [APP_NAME] została już uruchomiona.
+Sprawdź czy Twój pasek aplikacji nie ma zminimalizowanych okien programu.
+Jeżeli nadal otrzymujesz ten komunikat, uruchom swój komputer ponownie.
+ </string>
+ <string name="MBFrozenCrashed">
+ Aplikacja [APP_NAME] znajduje się w trybie zatrzymania lub zawieszenia po poprzedniej próbie uruchomienia.
+Czy chcesz wysłać raport na temat zawieszenia?
+ </string>
+ <string name="MBAlert">
+ Powiadomienie
+ </string>
+ <string name="MBNoDirectX">
+ Aplikacja [APP_NAME] nie wykryła oprogramowania DirectX 9.0b lub wersji nowszej.
+[APP_NAME] używa oprogramowaniau DirectX w celu wykrycia dysku twardego i/lub nieaktualizowanych dysków twardych, które mogą przyczynić się do obniżenia stabilności, wydajności systemowej oraz zawieszeń. Jeżeli chcesz uruchomić aplikację [APP_NAME] bez problemów, doradzamy korzystanie z uruchomionym oprogramowaniem min. DirectX 9.0b.
+
+Czy chcesz kontynuować?
+ </string>
+ <string name="MBWarning">
+ Ostrzeżenie
+ </string>
+ <string name="MBNoAutoUpdate">
+ Automatyczna aktualizacja nie została jeszcze zaimplementowana dla platformy Linux.
+Prosimy o pobranie najnowszej wersji ze strony internetowej: www.secondlife.com.
+ </string>
+ <string name="MBRegClassFailed">
+ błąd rejestru
+ </string>
+ <string name="MBError">
+ Błąd
+ </string>
+ <string name="MBFullScreenErr">
+ Nie można uruchomić trybu pełnoekranowego w proporcji [WIDTH] x [HEIGHT].
+Uruchomione w oknie.
+ </string>
+ <string name="MBDestroyWinFailed">
+ Błąd w próbie wyłączenia podczas zamykania okna (DestroyWindow() failed)
+ </string>
+ <string name="MBShutdownErr">
+ Błąd w próbie wyłączenia
+ </string>
+ <string name="MBDevContextErr">
+ Brak możliwości stworzenia zawartości GL dla sterownika
+ </string>
+ <string name="MBPixelFmtErr">
+ Brak odnalezienia właściwego formatu pikselowego
+ </string>
+ <string name="MBPixelFmtDescErr">
+ Brak otrzymania formatu pikselowego opisu
+ </string>
+ <string name="MBTrueColorWindow">
+ Aplikacja [APP_NAME] wymaga ustawienia koloru na (32-bit) do uruchomienia.
+Sprawdź swoje ustawienia dla wyświetlacza i ustaw tryb koloru na 32-bity.
+ </string>
+ <string name="MBAlpha">
+ Aplikacja [APP_NAME] nie może zostać uruchomiona, ponieważ nie jest możliwe dostanie się na kanał 8 bitowy alpha. Najcześciej jest to spowodowane błędami sterowników karty video.
+Upewnij się, że posiadasz najnowsze aktualizacje sterowników karty video.
+Dodatkowo, sprawdź czy Twój monitor posiada poprawną konfigurację koloru (32-bity) w Panelu Kontroli &gt; Display &gt; Ustawienia.
+Jeżeli nadal otrzymujesz ten komunikat, skontaktuj się z [SUPPORT_SITE].
+ </string>
+ <string name="MBPixelFmtSetErr">
+ Brak ustawienie formatu pikselowego
+ </string>
+ <string name="MBGLContextErr">
+ Brak możliwości stworzenia renderowania zawartości GL
+ </string>
+ <string name="MBGLContextActErr">
+ Brak aktywacji renderowania zawartości GL
+ </string>
+ <string name="MBVideoDrvErr">
+ Aplikacja [APP_NAME] nie może zostać uruchomiona, ponieważ Twoja karta video jest niepoprawnie zainstalowana, nieaktualizowana lub przeznaczona jest dla innego rodzaju dysków twardych. Upewnij się, że Twoja karta video została zaktualizowana poprawnie lub spróbuj zainstalować ponownie.
+
+Jeżeli nadal otrzymujesz ten komunikat, skontaktuj się z [SUPPORT_SITE].
+ </string>
+ <string name="5 O&apos;Clock Shadow">
+ Cień o godzinie 5
+ </string>
+ <string name="All White">
+ Wszystko białe
+ </string>
+ <string name="Anime Eyes">
+ Animuj oczy
+ </string>
+ <string name="Arced">
+ Obrócony
+ </string>
+ <string name="Arm Length">
+ Długość ramienia
+ </string>
+ <string name="Attached">
+ Dołączone
+ </string>
+ <string name="Attached Earlobes">
+ Płatki uszu dołączone
+ </string>
+ <string name="Back Fringe">
+ Tylnia grzywka
+ </string>
+ <string name="Baggy">
+ Wypchane
+ </string>
+ <string name="Bangs">
+ Pasemka
+ </string>
+ <string name="Beady Eyes">
+ Oczy załzawione
+ </string>
+ <string name="Belly Size">
+ Rozmiar brzucha
+ </string>
+ <string name="Big">
+ Duży
+ </string>
+ <string name="Big Butt">
+ Duży pośladek
+ </string>
+ <string name="Big Hair Back">
+ Duże włosy: z tyłu
+ </string>
+ <string name="Big Hair Front">
+ Duże włosy: z przodu
+ </string>
+ <string name="Big Hair Top">
+ Duże włosy: z góry
+ </string>
+ <string name="Big Head">
+ Duża głowa
+ </string>
+ <string name="Big Pectorals">
+ Duże mięśnie piersiowe
+ </string>
+ <string name="Big Spikes">
+ Duże kolce
+ </string>
+ <string name="Black">
+ Czarne
+ </string>
+ <string name="Blonde">
+ Blond
+ </string>
+ <string name="Blonde Hair">
+ Włosy blond
+ </string>
+ <string name="Blush">
+ Rumieniec
+ </string>
+ <string name="Blush Color">
+ Kolor rumieńca
+ </string>
+ <string name="Blush Opacity">
+ Intensywność rumieńca
+ </string>
+ <string name="Body Definition">
+ Detale ciała
+ </string>
+ <string name="Body Fat">
+ Zawartość tkanki tłuszczowej
+ </string>
+ <string name="Body Freckles">
+ Piegi
+ </string>
+ <string name="Body Thick">
+ Zagęszczenie ciała
+ </string>
+ <string name="Body Thickness">
+ Grubość ciała
+ </string>
+ <string name="Body Thin">
+ Szczupłość
+ </string>
+ <string name="Bow Legged">
+ Bow Legged
+ </string>
+ <string name="Breast Buoyancy">
+ Jędrność piersi
+ </string>
+ <string name="Breast Cleavage">
+ Odstęp między piersiami
+ </string>
+ <string name="Breast Size">
+ Rozmiar piersi
+ </string>
+ <string name="Bridge Width">
+ Szerokość
+ </string>
+ <string name="Broad">
+ Szerokie
+ </string>
+ <string name="Brow Size">
+ Rozmiar czoła
+ </string>
+ <string name="Bug Eyes">
+ Wytrzeszcz oczu
+ </string>
+ <string name="Bugged Eyes">
+ Wytrzeszczone oczy
+ </string>
+ <string name="Bulbous">
+ Bulwiasty
+ </string>
+ <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>
+ <string name="Bushy Hair">
+ Bujne włosy
+ </string>
+ <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>
+ <string name="no bustle">
+ No Bustle
+ </string>
+ <string name="more bustle">
+ More Bustle
+ </string>
+ <string name="Chaplin">
+ Chaplin
+ </string>
+ <string name="Cheek Bones">
+ Kości policzkowe
+ </string>
+ <string name="Chest Size">
+ Rozmiar klatki piersiowej
+ </string>
+ <string name="Chin Angle">
+ Kąt podbródka
+ </string>
+ <string name="Chin Cleft">
+ Dołek w podbródku
+ </string>
+ <string name="Chin Curtains">
+ Zasłonięcie podbródka
+ </string>
+ <string name="Chin Depth">
+ Długość podbródka
+ </string>
+ <string name="Chin Heavy">
+ Ciężar podbródka
+ </string>
+ <string name="Chin In">
+ Podbródek wewnątrz
+ </string>
+ <string name="Chin Out">
+ Podbródek zewnętrzny
+ </string>
+ <string name="Chin-Neck">
+ Podwójny podbródek
+ </string>
+ <string name="Clear">
+ Wyczyść
+ </string>
+ <string name="Cleft">
+ Rozszczepienie
+ </string>
+ <string name="Close Set Eyes">
+ Oczy blisko ustawione
+ </string>
+ <string name="Closed">
+ Zamknięte
+ </string>
+ <string name="Closed Back">
+ Zamknięte z tyłu
+ </string>
+ <string name="Closed Front">
+ Zamknięte z przodu
+ </string>
+ <string name="Closed Left">
+ Lewe oko zamknięte
+ </string>
+ <string name="Closed Right">
+ Prawe oko zamknięte
+ </string>
+ <string name="Coin Purse">
+ Coin Purse
+ </string>
+ <string name="Collar Back">
+ Kołnierz z tyłu
+ </string>
+ <string name="Collar Front">
+ Kołnierz z przodu
+ </string>
+ <string name="Corner Down">
+ Kącik w dół
+ </string>
+ <string name="Corner Up">
+ Kącik w górę
+ </string>
+ <string name="Creased">
+ Pognieciony
+ </string>
+ <string name="Crooked Nose">
+ Skrzywienie nosa
+ </string>
+ <string name="Cuff Flare">
+ Szeroki rękaw
+ </string>
+ <string name="Dark">
+ Ciemne
+ </string>
+ <string name="Dark Green">
+ Ciemne zielone
+ </string>
+ <string name="Darker">
+ Ciemniejsze
+ </string>
+ <string name="Deep">
+ Glębokie
+ </string>
+ <string name="Default Heels">
+ Domyślne buty na obcasie
+ </string>
+ <string name="Dense">
+ Gęstość
+ </string>
+ <string name="Double Chin">
+ Podwójny podbródek
+ </string>
+ <string name="Downturned">
+ Downturned
+ </string>
+ <string name="Duffle Bag">
+ Duffle Bag
+ </string>
+ <string name="Ear Angle">
+ Odstawanie uszu
+ </string>
+ <string name="Ear Size">
+ Rozmiar uszu
+ </string>
+ <string name="Ear Tips">
+ Wierzchołki uszu
+ </string>
+ <string name="Egg Head">
+ Jajowata głowa
+ </string>
+ <string name="Eye Bags">
+ Woreczek łzowy
+ </string>
+ <string name="Eye Color">
+ Kolor oczu
+ </string>
+ <string name="Eye Depth">
+ Głębokość osadzenia oczu
+ </string>
+ <string name="Eye Lightness">
+ Ustawienie jasności oczu
+ </string>
+ <string name="Eye Opening">
+ Oczy otwarte
+ </string>
+ <string name="Eye Pop">
+ Różnica w wielkości oczu
+ </string>
+ <string name="Eye Size">
+ Rozmiar oczu
+ </string>
+ <string name="Eye Spacing">
+ Rozstaw oczu
+ </string>
+ <string name="Eyebrow Arc">
+ Åuk brwiowy
+ </string>
+ <string name="Eyebrow Density">
+ Gęstość brwi
+ </string>
+ <string name="Eyebrow Height">
+ Wysokość brwi
+ </string>
+ <string name="Eyebrow Points">
+ Kształt brwi
+ </string>
+ <string name="Eyebrow Size">
+ Rozmiar brwi
+ </string>
+ <string name="Eyelash Length">
+ Długość rzęs
+ </string>
+ <string name="Eyeliner">
+ Kredka do oczu
+ </string>
+ <string name="Eyeliner Color">
+ Kolor kredki do oczu&apos;a
+ </string>
+ <string name="Eyes Bugged">
+ Wytrzeszczone oczy
+ </string>
+ <string name="Face Shear">
+ Usunięcie twarzy
+ </string>
+ <string name="Facial Definition">
+ Detale twarzy
+ </string>
+ <string name="Far Set Eyes">
+ Oczy szeroko rozstawione
+ </string>
+ <string name="Fat Lips">
+ Grube usta
+ </string>
+ <string name="Female">
+ Kobieta
+ </string>
+ <string name="Fingerless">
+ Bez palców
+ </string>
+ <string name="Fingers">
+ Palce
+ </string>
+ <string name="Flared Cuffs">
+ Rozszerzane rękawy
+ </string>
+ <string name="Flat">
+ Płaskość
+ </string>
+ <string name="Flat Butt">
+ Płaskie pośladki
+ </string>
+ <string name="Flat Head">
+ Płaska głowa
+ </string>
+ <string name="Flat Toe">
+ Płaski palec
+ </string>
+ <string name="Foot Size">
+ Rozmiar stopy
+ </string>
+ <string name="Forehead Angle">
+ Kształt czoła
+ </string>
+ <string name="Forehead Heavy">
+ Ciężar czoła
+ </string>
+ <string name="Freckles">
+ Piegi
+ </string>
+ <string name="Front Fringe">
+ Przednia grzywka
+ </string>
+ <string name="Full Back">
+ Gęstość włosów po bokach
+ </string>
+ <string name="Full Eyeliner">
+ Gęsta kredka do oczu
+ </string>
+ <string name="Full Front">
+ Gęsty przód
+ </string>
+ <string name="Full Hair Sides">
+ Gęste włosy po bokach
+ </string>
+ <string name="Full Sides">
+ Gęste boki
+ </string>
+ <string name="Glossy">
+ Błyszczące
+ </string>
+ <string name="Glove Fingers">
+ Rękawiczki
+ </string>
+ <string name="Glove Length">
+ Długość rękawiczek
+ </string>
+ <string name="Hair">
+ Włosy
+ </string>
+ <string name="Hair Back">
+ Włosy: z tyłu
+ </string>
+ <string name="Hair Front">
+ Włosy: z przodu
+ </string>
+ <string name="Hair Sides">
+ Włosy: boki
+ </string>
+ <string name="Hair Sweep">
+ Kierunek zaczesania
+ </string>
+ <string name="Hair Thickess">
+ Grubość włosów
+ </string>
+ <string name="Hair Thickness">
+ Grubość włosów
+ </string>
+ <string name="Hair Tilt">
+ Przes. fryzury
+ </string>
+ <string name="Hair Tilted Left">
+ Przes. fryzury L
+ </string>
+ <string name="Hair Tilted Right">
+ Przes. fryzury P
+ </string>
+ <string name="Hair Volume">
+ Włosy: objętość
+ </string>
+ <string name="Hand Size">
+ Rozmiar dłoni
+ </string>
+ <string name="Handlebars">
+ Handlebars
+ </string>
+ <string name="Head Length">
+ Długość głowy
+ </string>
+ <string name="Head Shape">
+ Kształt głowy
+ </string>
+ <string name="Head Size">
+ Rozmiar głowy
+ </string>
+ <string name="Head Stretch">
+ Rozciągnięcie głowy
+ </string>
+ <string name="Heel Height">
+ Wysokość obcasa
+ </string>
+ <string name="Heel Shape">
+ Ksztalt obcasa
+ </string>
+ <string name="Height">
+ Wysokość
+ </string>
+ <string name="High">
+ Wysoka
+ </string>
+ <string name="High Heels">
+ Wysokie obcasy
+ </string>
+ <string name="High Jaw">
+ Wysoka szczęka
+ </string>
+ <string name="High Platforms">
+ Wysokie obcasy
+ </string>
+ <string name="High and Tight">
+ Wysokie i wÄ…skie
+ </string>
+ <string name="Higher">
+ Wyżej
+ </string>
+ <string name="Hip Length">
+ Długość bioder
+ </string>
+ <string name="Hip Width">
+ Szerokość bioder
+ </string>
+ <string name="In">
+ W
+ </string>
+ <string name="In Shdw Color">
+ Wewnętrzny kolor cienia
+ </string>
+ <string name="In Shdw Opacity">
+ Wewnętrzna intensywność cienia
+ </string>
+ <string name="Inner Eye Corner">
+ Wewnętrzny bok oka
+ </string>
+ <string name="Inner Eye Shadow">
+ Wewnętrzny cień oka
+ </string>
+ <string name="Inner Shadow">
+ Wewnętrzny cień
+ </string>
+ <string name="Jacket Length">
+ Długość kurtki
+ </string>
+ <string name="Jacket Wrinkles">
+ Zmarszczki na kurtce
+ </string>
+ <string name="Jaw Angle">
+ Kąt szczęki
+ </string>
+ <string name="Jaw Jut">
+ Wystająca szczęka
+ </string>
+ <string name="Jaw Shape">
+ Kształt szczęki
+ </string>
+ <string name="Join">
+ Złącz
+ </string>
+ <string name="Jowls">
+ Dolna część policzka
+ </string>
+ <string name="Knee Angle">
+ KÄ…t kolana
+ </string>
+ <string name="Knock Kneed">
+ Iksowate nogi
+ </string>
+ <string name="Large">
+ Duże
+ </string>
+ <string name="Large Hands">
+ Duże dłonie
+ </string>
+ <string name="Left Part">
+ Lewa część
+ </string>
+ <string name="Leg Length">
+ Długość nogi
+ </string>
+ <string name="Leg Muscles">
+ Umięśnione nogi
+ </string>
+ <string name="Less">
+ Mniej
+ </string>
+ <string name="Less Body Fat">
+ Mniejsza zawartości tkanki tłuszczowej
+ </string>
+ <string name="Less Curtains">
+ Less Curtains
+ </string>
+ <string name="Less Freckles">
+ Mniej piegów
+ </string>
+ <string name="Less Full">
+ Mniej pełne
+ </string>
+ <string name="Less Gravity">
+ Mniej ciężaru
+ </string>
+ <string name="Less Love">
+ Less Love
+ </string>
+ <string name="Less Muscles">
+ Mniej mięśni
+ </string>
+ <string name="Less Muscular">
+ Mniej umięśnienia
+ </string>
+ <string name="Less Rosy">
+ Mniej zaróżowione
+ </string>
+ <string name="Less Round">
+ Mniej zaaokrÄ…glone
+ </string>
+ <string name="Less Saddle">
+ Less Saddle
+ </string>
+ <string name="Less Square">
+ Mniej kwadratowe
+ </string>
+ <string name="Less Volume">
+ Mniej objętości
+ </string>
+ <string name="Less soul">
+ Less soul
+ </string>
+ <string name="Lighter">
+ Lżejsze
+ </string>
+ <string name="Lip Cleft">
+ Szerokość rozszczepienia górnej wargi
+ </string>
+ <string name="Lip Cleft Depth">
+ Głębokość rozszczepienia górnej wargi
+ </string>
+ <string name="Lip Fullness">
+ Pełne usta
+ </string>
+ <string name="Lip Pinkness">
+ Róż ust
+ </string>
+ <string name="Lip Ratio">
+ Proporcje ust
+ </string>
+ <string name="Lip Thickness">
+ Grubość ust
+ </string>
+ <string name="Lip Width">
+ Szerokość ust
+ </string>
+ <string name="Lipgloss">
+ Połysk
+ </string>
+ <string name="Lipstick">
+ Szminka
+ </string>
+ <string name="Lipstick Color">
+ Kolor szminki
+ </string>
+ <string name="Long">
+ Dlugość
+ </string>
+ <string name="Long Head">
+ Długa głowa
+ </string>
+ <string name="Long Hips">
+ Długie biodra
+ </string>
+ <string name="Long Legs">
+ Długie nogi
+ </string>
+ <string name="Long Neck">
+ Długi kark
+ </string>
+ <string name="Long Pigtails">
+ Długi warkocz
+ </string>
+ <string name="Long Ponytail">
+ Długi kucyk
+ </string>
+ <string name="Long Torso">
+ Długi tułów
+ </string>
+ <string name="Long arms">
+ Dlugie ramiona
+ </string>
+ <string name="Loose Pants">
+ Luźne spodnie
+ </string>
+ <string name="Loose Shirt">
+ Luźna koszulka
+ </string>
+ <string name="Loose Sleeves">
+ Luźne rękawy
+ </string>
+ <string name="Love Handles">
+ Love Handles
+ </string>
+ <string name="Low">
+ Nisko
+ </string>
+ <string name="Low Heels">
+ Niskie obcasy
+ </string>
+ <string name="Low Jaw">
+ Niska szczęka
+ </string>
+ <string name="Low Platforms">
+ Niskie obcasy
+ </string>
+ <string name="Low and Loose">
+ Niskie i luźne
+ </string>
+ <string name="Lower">
+ Niżej
+ </string>
+ <string name="Lower Bridge">
+ Dolny mostek
+ </string>
+ <string name="Lower Cheeks">
+ Niższe policzki
+ </string>
+ <string name="Male">
+ Mężczyzna
+ </string>
+ <string name="Middle Part">
+ Część środkowa
+ </string>
+ <string name="More">
+ Więcej
+ </string>
+ <string name="More Blush">
+ Bardziej zarumienione
+ </string>
+ <string name="More Body Fat">
+ Więcej zawartości tkanki tłuszczowej
+ </string>
+ <string name="More Curtains">
+ More Curtains
+ </string>
+ <string name="More Eyeshadow">
+ Ciemniejszy cień oczu
+ </string>
+ <string name="More Freckles">
+ Więcej piegów
+ </string>
+ <string name="More Full">
+ Bardziej pełne
+ </string>
+ <string name="More Gravity">
+ Więcej ciężaru
+ </string>
+ <string name="More Lipstick">
+ Więcej szminki
+ </string>
+ <string name="More Love">
+ More Love
+ </string>
+ <string name="More Lower Lip">
+ Więcej dolnej wargi
+ </string>
+ <string name="More Muscles">
+ Więcej mięśni
+ </string>
+ <string name="More Muscular">
+ Więcej umięśnienia
+ </string>
+ <string name="More Rosy">
+ Bardziej zaróżowione
+ </string>
+ <string name="More Round">
+ Więcej zaokrąglenia
+ </string>
+ <string name="More Saddle">
+ More Saddle
+ </string>
+ <string name="More Sloped">
+ Bardziej spadziste
+ </string>
+ <string name="More Square">
+ Więcej kwadratowy
+ </string>
+ <string name="More Upper Lip">
+ Więcej górnej wargi
+ </string>
+ <string name="More Vertical">
+ Bardziej pionowe
+ </string>
+ <string name="More Volume">
+ Więcej objętości
+ </string>
+ <string name="More soul">
+ More soul
+ </string>
+ <string name="Moustache">
+ WÄ…sy
+ </string>
+ <string name="Mouth Corner">
+ KÄ…ciki ust
+ </string>
+ <string name="Mouth Position">
+ Pozycja ust
+ </string>
+ <string name="Mowhawk">
+ Mowhawk
+ </string>
+ <string name="Muscular">
+ Umięśnienie
+ </string>
+ <string name="Mutton Chops">
+ Mutton Chops
+ </string>
+ <string name="Nail Polish">
+ Lakier na paznokciach
+ </string>
+ <string name="Nail Polish Color">
+ Kolor lakieru na paznokciach
+ </string>
+ <string name="Narrow">
+ WÄ…skie
+ </string>
+ <string name="Narrow Back">
+ Wąski tył
+ </string>
+ <string name="Narrow Front">
+ Wąski przód
+ </string>
+ <string name="Narrow Lips">
+ WÄ…skie usta
+ </string>
+ <string name="Natural">
+ Naturalne
+ </string>
+ <string name="Neck Length">
+ Długość karku
+ </string>
+ <string name="Neck Thickness">
+ Grubość karku
+ </string>
+ <string name="No Blush">
+ Brak rumieńca
+ </string>
+ <string name="No Eyeliner">
+ Brak kredki do oczu&apos;s
+ </string>
+ <string name="No Eyeshadow">
+ Brak cienia pod powiekÄ…
+ </string>
+ <string name="No Lipgloss">
+ Brak połysku
+ </string>
+ <string name="No Lipstick">
+ Brak szminki
+ </string>
+ <string name="No Part">
+ No Part
+ </string>
+ <string name="No Polish">
+ Brak lakieru
+ </string>
+ <string name="No Red">
+ Brak czerwieni
+ </string>
+ <string name="No Spikes">
+ Brak szpiców
+ </string>
+ <string name="No White">
+ Brak białego
+ </string>
+ <string name="No Wrinkles">
+ Brak zmarszczek
+ </string>
+ <string name="Normal Lower">
+ Dół normalny
+ </string>
+ <string name="Normal Upper">
+ Góra normalna
+ </string>
+ <string name="Nose Left">
+ Nos w stronÄ™ lewÄ…
+ </string>
+ <string name="Nose Right">
+ Nos w stronÄ™ prawÄ…
+ </string>
+ <string name="Nose Size">
+ Rozmiar nosa
+ </string>
+ <string name="Nose Thickness">
+ Grubość nosa
+ </string>
+ <string name="Nose Tip Angle">
+ KÄ…t czubka nosa
+ </string>
+ <string name="Nose Tip Shape">
+ Kształt czubka nosa
+ </string>
+ <string name="Nose Width">
+ Szerokość nosa
+ </string>
+ <string name="Nostril Division">
+ Przegroda nosa
+ </string>
+ <string name="Nostril Width">
+ Wielkość dziurek w nosie
+ </string>
+ <string name="Opaque">
+ Intensywność
+ </string>
+ <string name="Open">
+ Otwarte
+ </string>
+ <string name="Open Back">
+ Otwarte z tyłu
+ </string>
+ <string name="Open Front">
+ Otwarte z przodu
+ </string>
+ <string name="Open Left">
+ Otwarte z lewej
+ </string>
+ <string name="Open Right">
+ Otwarte z prawej
+ </string>
+ <string name="Orange">
+ Pomarańczowe
+ </string>
+ <string name="Out">
+ Zewnętrznie
+ </string>
+ <string name="Out Shdw Color">
+ Zewnętrzny kolor cienia
+ </string>
+ <string name="Out Shdw Opacity">
+ Zewnętrzna grubość cienia
+ </string>
+ <string name="Outer Eye Corner">
+ Zewnętrzny bok oka
+ </string>
+ <string name="Outer Eye Shadow">
+ Zewnętrzny cień oka
+ </string>
+ <string name="Outer Shadow">
+ Zewnętrzny cień
+ </string>
+ <string name="Overbite">
+ Przodozgryz górny
+ </string>
+ <string name="Package">
+ Package
+ </string>
+ <string name="Painted Nails">
+ Pomalowane paznokcie
+ </string>
+ <string name="Pale">
+ Blady
+ </string>
+ <string name="Pants Crotch">
+ Krocze spodni
+ </string>
+ <string name="Pants Fit">
+ Dopasowanie spodni
+ </string>
+ <string name="Pants Length">
+ Długość spodni
+ </string>
+ <string name="Pants Waist">
+ Talia spodni
+ </string>
+ <string name="Pants Wrinkles">
+ Zmarszczki spodni
+ </string>
+ <string name="Part">
+ Część
+ </string>
+ <string name="Part Bangs">
+ Część grzywki
+ </string>
+ <string name="Pectorals">
+ Mięśnie klatki piersiowej
+ </string>
+ <string name="Pigment">
+ Pigment
+ </string>
+ <string name="Pigtails">
+ Warkocz
+ </string>
+ <string name="Pink">
+ Różowe
+ </string>
+ <string name="Pinker">
+ Róż
+ </string>
+ <string name="Platform Height">
+ Wysokie obcasy
+ </string>
+ <string name="Platform Width">
+ Szerokie obcasy
+ </string>
+ <string name="Pointy">
+ Pointy
+ </string>
+ <string name="Pointy Heels">
+ Obcasy pointy
+ </string>
+ <string name="Ponytail">
+ Kucyk
+ </string>
+ <string name="Poofy Skirt">
+ Poofy Skirt
+ </string>
+ <string name="Pop Left Eye">
+ Wybałuszone lewe oko
+ </string>
+ <string name="Pop Right Eye">
+ Wybałuszone prawe oko
+ </string>
+ <string name="Puffy">
+ Opuchnięty
+ </string>
+ <string name="Puffy Eyelids">
+ Spuchnięte powieki
+ </string>
+ <string name="Rainbow Color">
+ Kolor tęczy
+ </string>
+ <string name="Red Hair">
+ Czerwone włosy
+ </string>
+ <string name="Regular">
+ Regularne
+ </string>
+ <string name="Right Part">
+ Prawa część
+ </string>
+ <string name="Rosy Complexion">
+ Kompleksowość różu
+ </string>
+ <string name="Round">
+ ZaokrÄ…glenie
+ </string>
+ <string name="Ruddiness">
+ Rudowatość
+ </string>
+ <string name="Ruddy">
+ Rudy
+ </string>
+ <string name="Rumpled Hair">
+ Włosy w nieładzie
+ </string>
+ <string name="Saddle Bags">
+ Saddle Bags
+ </string>
+ <string name="Scrawny Leg">
+ Koścista noga
+ </string>
+ <string name="Separate">
+ Odzielne
+ </string>
+ <string name="Shallow">
+ Płytkie
+ </string>
+ <string name="Shear Back">
+ Tylne usunięcie włosów
+ </string>
+ <string name="Shear Face">
+ Usunięcie twarzy
+ </string>
+ <string name="Shear Front">
+ Przednie usunięcie włosów
+ </string>
+ <string name="Shear Left Up">
+ Usunięcie od lewej strony do góry
+ </string>
+ <string name="Shear Right Up">
+ Usunięcie od prawej strony do góry
+ </string>
+ <string name="Sheared Back">
+ Tylnie usunięcie włosów
+ </string>
+ <string name="Sheared Front">
+ Przednie usunięcie włosów
+ </string>
+ <string name="Shift Left">
+ Przesuń w lewo
+ </string>
+ <string name="Shift Mouth">
+ Przesuń usta
+ </string>
+ <string name="Shift Right">
+ Przesuń w prawo
+ </string>
+ <string name="Shirt Bottom">
+ Dolna część koszuli
+ </string>
+ <string name="Shirt Fit">
+ Dopasowanie koszuli
+ </string>
+ <string name="Shirt Wrinkles">
+ Zmarszczki na koszuli
+ </string>
+ <string name="Shoe Height">
+ Wysokość buta
+ </string>
+ <string name="Short">
+ Krótkie
+ </string>
+ <string name="Short Arms">
+ Krótkie ramiona
+ </string>
+ <string name="Short Legs">
+ Krótkie nogi
+ </string>
+ <string name="Short Neck">
+ Krótki kark
+ </string>
+ <string name="Short Pigtails">
+ Krótkie warkoczyki
+ </string>
+ <string name="Short Ponytail">
+ Krótki kucyk
+ </string>
+ <string name="Short Sideburns">
+ Krótkie baczki
+ </string>
+ <string name="Short Torso">
+ Krótki tułów
+ </string>
+ <string name="Short hips">
+ Krótkie biodra
+ </string>
+ <string name="Shoulders">
+ Ramiona
+ </string>
+ <string name="Side Fringe">
+ Boczna grzywka
+ </string>
+ <string name="Sideburns">
+ Baczki
+ </string>
+ <string name="Sides Hair">
+ Boczne włosy
+ </string>
+ <string name="Sides Hair Down">
+ Boczne włosy w dół
+ </string>
+ <string name="Sides Hair Up">
+ Boczne włosy do góry
+ </string>
+ <string name="Skinny Neck">
+ Smukły kark
+ </string>
+ <string name="Skirt Fit">
+ Dopasowanie spódnicy
+ </string>
+ <string name="Skirt Length">
+ Długość spódnicy
+ </string>
+ <string name="Slanted Forehead">
+ Ukośne czoło
+ </string>
+ <string name="Sleeve Length">
+ Długość rękawów
+ </string>
+ <string name="Sleeve Looseness">
+ Luźne rękawy
+ </string>
+ <string name="Slit Back">
+ Rozcięcie: tył
+ </string>
+ <string name="Slit Front">
+ Rozcięcie: przód
+ </string>
+ <string name="Slit Left">
+ Rozcięcie: po prawej
+ </string>
+ <string name="Slit Right">
+ Rozcięcie: po lewej
+ </string>
+ <string name="Small">
+ Małe
+ </string>
+ <string name="Small Hands">
+ Małe dłonie
+ </string>
+ <string name="Small Head">
+ Mała głowa
+ </string>
+ <string name="Smooth">
+ Gładkie
+ </string>
+ <string name="Smooth Hair">
+ Gładkie włosy
+ </string>
+ <string name="Socks Length">
+ Długość skarpetek
+ </string>
+ <string name="Soulpatch">
+ Zarost na dolnej wardze
+ </string>
+ <string name="Sparse">
+ Rzadki
+ </string>
+ <string name="Spiked Hair">
+ Kolczaste włosy
+ </string>
+ <string name="Square">
+ Kwadratowe
+ </string>
+ <string name="Square Toe">
+ Kwadratowy palec
+ </string>
+ <string name="Squash Head">
+ Ściśnięta głowa
+ </string>
+ <string name="Stretch Head">
+ Rozciągnięta głowa
+ </string>
+ <string name="Sunken">
+ Zapadnięte
+ </string>
+ <string name="Sunken Chest">
+ Zapadnięta klatka piersiowa
+ </string>
+ <string name="Sunken Eyes">
+ Zapadnięte oczy
+ </string>
+ <string name="Sweep Back">
+ Sweep Back
+ </string>
+ <string name="Sweep Forward">
+ Sweep Forward
+ </string>
+ <string name="Tall">
+ Wysokość
+ </string>
+ <string name="Taper Back">
+ Zwężenie do przodu
+ </string>
+ <string name="Taper Front">
+ Zwężenie do tyłu
+ </string>
+ <string name="Thick Heels">
+ Grube obcasy
+ </string>
+ <string name="Thick Neck">
+ Gruby kark
+ </string>
+ <string name="Thick Toe">
+ Gruby palec
+ </string>
+ <string name="Thin">
+ WÄ…ski
+ </string>
+ <string name="Thin Eyebrows">
+ WÄ…skie brwi
+ </string>
+ <string name="Thin Lips">
+ WÄ…skie usta
+ </string>
+ <string name="Thin Nose">
+ WÄ…ski nos
+ </string>
+ <string name="Tight Chin">
+ Obcisły podbródek
+ </string>
+ <string name="Tight Cuffs">
+ Obcisłe rękawy
+ </string>
+ <string name="Tight Pants">
+ Obciesłe spodnie
+ </string>
+ <string name="Tight Shirt">
+ Obcisły podkoszulek
+ </string>
+ <string name="Tight Skirt">
+ Wąska spódnica
+ </string>
+ <string name="Tight Sleeves">
+ Obcisłe rękawy
+ </string>
+ <string name="Toe Shape">
+ Kształt palca
+ </string>
+ <string name="Toe Thickness">
+ Grubość palca
+ </string>
+ <string name="Torso Length">
+ Długość tułowia
+ </string>
+ <string name="Torso Muscles">
+ Mięśnie tułowia
+ </string>
+ <string name="Torso Scrawny">
+ Wychudzony tułów
+ </string>
+ <string name="Unattached">
+ Nieprzyłączone
+ </string>
+ <string name="Uncreased">
+ Uncreased
+ </string>
+ <string name="Underbite">
+ Przodozgryz
+ </string>
+ <string name="Unnatural">
+ Nienaturalne
+ </string>
+ <string name="Upper Bridge">
+ Górny mostek
+ </string>
+ <string name="Upper Cheeks">
+ Górne policzki
+ </string>
+ <string name="Upper Chin Cleft">
+ Roszczepienie górnego podbródka
+ </string>
+ <string name="Upper Eyelid Fold">
+ Górna powieka
+ </string>
+ <string name="Upturned">
+ Zadarta
+ </string>
+ <string name="Very Red">
+ Bardzo czerwona
+ </string>
+ <string name="Waist Height">
+ Wysokość talii
+ </string>
+ <string name="Well-Fed">
+ Dobrze odżywiony
+ </string>
+ <string name="White Hair">
+ Białe włosy
+ </string>
+ <string name="Wide">
+ Szerokie
+ </string>
+ <string name="Wide Back">
+ Szeroki tył
+ </string>
+ <string name="Wide Front">
+ Szeroki przód
+ </string>
+ <string name="Wide Lips">
+ Szerokie usta
+ </string>
+ <string name="Wild">
+ Dzikość
+ </string>
+ <string name="Wrinkles">
+ Zmarszczki
+ </string>
+ <string name="LocationCtrlAddLandmarkTooltip">
+ Dodaj do landmarków
+ </string>
+ <string name="LocationCtrlEditLandmarkTooltip">
+ Edytuj Landmarki
+ </string>
+ <string name="LocationCtrlInfoBtnTooltip">
+ Zobacz więcej szczegółów na temat obecnej lokalizacji
+ </string>
+ <string name="LocationCtrlComboBtnTooltip">
+ Historia odwiedzonych miejsc
+ </string>
+ <string name="LocationCtrlAdultIconTooltip">
+ Region Adult
+ </string>
+ <string name="LocationCtrlModerateIconTooltip">
+ Region Moderate
+ </string>
+ <string name="LocationCtrlGeneralIconTooltip">
+ Region
+ </string>
+ <string name="UpdaterWindowTitle">
+ [APP_NAME] Aktualizacja
+ </string>
+ <string name="UpdaterNowUpdating">
+ Pobieranie [APP_NAME]...
+ </string>
+ <string name="UpdaterNowInstalling">
+ Instalizacja [APP_NAME]...
+ </string>
+ <string name="UpdaterUpdatingDescriptive">
+ Twoja [APP_NAME] wersja klienta jest aktualizowana do najnowszej wersji. Prosimy o cierpliwość.
+ </string>
+ <string name="UpdaterProgressBarTextWithEllipses">
+ Pobieranie aktualizacji...
+ </string>
+ <string name="UpdaterProgressBarText">
+ Pobieranie aktualizacji
+ </string>
+ <string name="UpdaterFailDownloadTitle">
+ Pobieranie aktualizacji nie powiodło się
+ </string>
+ <string name="UpdaterFailUpdateDescriptive">
+ Podczas aktualizacji [APP_NAME] wystąpił błąd. Prosimy o pobranie najnowszej wersji klienta ze strony internetowej: www.secondlife.com.
+ </string>
+ <string name="UpdaterFailInstallTitle">
+ Instalacja aktualizacji nie powiodła się
+ </string>
+ <string name="UpdaterFailStartTitle">
+ Uruchomienie klienta nie powiodło się
+ </string>
+ <string name="ItemsComingInTooFastFrom">
+ [APP_NAME]: Obiekty ładują się zbyt szybko od [FROM_NAME], automatyczny podgląd jest wyłączony na [TIME] sekund
+ </string>
+ <string name="ItemsComingInTooFast">
+ [APP_NAME]: Obiekty ładują się zbyt szybko, automatyczny podgląd jest wyłączony na [TIME] sekund
+ </string>
+ <string name="IM_logging_string">
+ -- Zapisywanie logów rozmowy aktywowane --
+ </string>
+ <string name="IM_typing_start_string">
+ [NAME] pisze...
+ </string>
+ <string name="Unnamed">
+ (Brak nazwy)
+ </string>
+ <string name="IM_moderated_chat_label">
+ (Moderacja: Komunikacja głosowa wyłączona domyślnie)
+ </string>
+ <string name="IM_unavailable_text_label">
+ Czat tekstowy jest nieaktywny dla tej rozmowy.
+ </string>
+ <string name="IM_muted_text_label">
+ Twój tekst w czacie grupowym został wyłączony przez Moderatora Grupy.
+ </string>
+ <string name="IM_default_text_label">
+ Klknij tutaj by wysłać wiadomość prywatną (IM).
+ </string>
+ <string name="IM_to_label">
+ Do
+ </string>
+ <string name="IM_moderator_label">
+ (Moderator)
+ </string>
+ <string name="Saved_message">
+ (Zapisano [LONG_TIMESTAMP])
+ </string>
+ <string name="answered_call">
+ Twoja rozmowa głosowa została odebrana
+ </string>
+ <string name="you_started_call">
+ Rozmowa głosowa została rozpoczęta
+ </string>
+ <string name="you_joined_call">
+ Dołączyłeś/Dołączyłaś do rozmowy głosowej
+ </string>
+ <string name="name_started_call">
+ [NAME] zaczyna rozmowę głosową
+ </string>
+ <string name="ringing-im">
+ Rozmowa głosowa...
+ </string>
+ <string name="connected-im">
+ Połączono, kliknij Zakończ rozmowę aby się rozłączyć
+ </string>
+ <string name="hang_up-im">
+ Rozmowa głosowa zakończona
+ </string>
+ <string name="conference-title-incoming">
+ Konferencja z [AGENT_NAME]
+ </string>
+ <string name="no_session_message">
+ (Sesja IM wygasła)
+ </string>
+ <string name="only_user_message">
+ JesteÅ› jedynÄ… osobÄ… w tej konferencji.
+ </string>
+ <string name="offline_message">
+ [NAME] opuszcza Second Life.
+ </string>
+ <string name="invite_message">
+ Kliknij na [BUTTON NAME] przycisk by zaakceptować/dołączyć do tej rozmowy.
+ </string>
+ <string name="muted_message">
+ Zablokowałeś tego Rezydenta. Wysłanie wiadomości automatycznie odblokuje go.
+ </string>
+ <string name="generic">
+ Błąd zapytania, proszę spróbować później
+ </string>
+ <string name="generic_request_error">
+ Błąd. Spróbuj ponownie za kilka minut.
+ </string>
+ <string name="insufficient_perms_error">
+ Nie posiadasz praw do kontynuacji.
+ </string>
+ <string name="session_does_not_exist_error">
+ Ta konferencja jest już zakończona.
+ </string>
+ <string name="no_ability_error">
+ Nie posiadesz tego przywileju.
+ </string>
+ <string name="no_ability">
+ Nie posiadesz tego przywileju.
+ </string>
+ <string name="not_a_mod_error">
+ Nie jesteÅ› moderatorem konferencji.
+ </string>
+ <string name="muted">
+ Moderator grupy wyłączył czat.
+ </string>
+ <string name="muted_error">
+ Moderator wyciszył Cię.
+ </string>
+ <string name="add_session_event">
+ Nie można dodać nikogo do czatu z [RECIPIENT].
+ </string>
+ <string name="message">
+ Nie można wysłać Twojej wiadomości do sesji czatu z [RECIPIENT].
+ </string>
+ <string name="message_session_event">
+ Nie można wysłać Twojej wiadomości do sesji czatu z [RECIPIENT].
+ </string>
+ <string name="mute">
+ Błąd poczas moderacji.
+ </string>
+ <string name="removed">
+ Zostałeś usunięty z grupy
+ </string>
+ <string name="removed_from_group">
+ Usunięto Cię z grupy.
+ </string>
+ <string name="close_on_no_ability">
+ Nie posiadasz praw by uczestniczyć w tej konferencji.
+ </string>
+ <string name="unread_chat_single">
+ [SOURCES] powiedział/a coś nowego
+ </string>
+ <string name="unread_chat_multiple">
+ [SOURCES] powiedział/a coś nowego
+ </string>
+ <string name="session_initialization_timed_out_error">
+ Inicjacja sesji wygasła
+ </string>
+ <string name="voice_morphing_url">
+ http://secondlife.com/landing/voicemorphing
+ </string>
+ <string name="paid_you_ldollars">
+ [NAME] zapłaciła/zapłacił Tobie [AMOUNT]L$ [REASON].
+ </string>
+ <string name="paid_you_ldollars_no_reason">
+ [NAME] zapłacił/zapłaciła Tobie L$[AMOUNT].
+ </string>
+ <string name="you_paid_ldollars">
+ Zapłacono [NAME] [AMOUNT]L$ [REASON].
+ </string>
+ <string name="you_paid_ldollars_no_info">
+ Zapłacono L$[AMOUNT].
+ </string>
+ <string name="you_paid_ldollars_no_reason">
+ Zapłacono [NAME] [AMOUNT]L$.
+ </string>
+ <string name="you_paid_ldollars_no_name">
+ Zapłacono [AMOUNT]L$ [REASON].
+ </string>
+ <string name="for item">
+ dla [ITEM]
+ </string>
+ <string name="for a parcel of land">
+ za Posiadłość
+ </string>
+ <string name="for a land access pass">
+ za przepustkę na Posiadłość
+ </string>
+ <string name="for deeding land">
+ dla przypisania Posiadłości
+ </string>
+ <string name="to create a group">
+ aby stworzyć grupę
+ </string>
+ <string name="to join a group">
+ aby dołączyć do grupy
+ </string>
+ <string name="to upload">
+ aby pobrać
+ </string>
+ <string name="to publish a classified ad">
+ publikacja reklamy
+ </string>
+ <string name="giving">
+ Dajesz L$ [AMOUNT]
+ </string>
+ <string name="uploading_costs">
+ Åadowanie kosztuje [AMOUNT]L$
+ </string>
+ <string name="this_costs">
+ To kosztuje [AMOUNT]L$
+ </string>
+ <string name="buying_selected_land">
+ Kupno wybranej Posiadłości [AMOUNT]L$
+ </string>
+ <string name="this_object_costs">
+ Ten obiekt kosztuje [AMOUNT]L$
+ </string>
+ <string name="group_role_everyone">
+ Każdy
+ </string>
+ <string name="group_role_officers">
+ Oficerowie
+ </string>
+ <string name="group_role_owners">
+ Właściciele
+ </string>
+ <string name="group_member_status_online">
+ Obecnie w SL
+ </string>
+ <string name="uploading_abuse_report">
+ Pobieranie...
+
+Raport o Nadużyciu
+ </string>
+ <string name="New Shape">
+ Nowy ksztalt
+ </string>
+ <string name="New Skin">
+ Nowa skórka
+ </string>
+ <string name="New Hair">
+ Nowe włosy
+ </string>
+ <string name="New Eyes">
+ Nowe oczy
+ </string>
+ <string name="New Shirt">
+ Nowa koszula
+ </string>
+ <string name="New Pants">
+ Nowe spodnie
+ </string>
+ <string name="New Shoes">
+ Nowe buty
+ </string>
+ <string name="New Socks">
+ Nowe skarpetki
+ </string>
+ <string name="New Jacket">
+ Nowa kurtka
+ </string>
+ <string name="New Gloves">
+ Nowe rękawiczki
+ </string>
+ <string name="New Undershirt">
+ Nowy podkoszulek
+ </string>
+ <string name="New Underpants">
+ Nowa bielizna
+ </string>
+ <string name="New Skirt">
+ Nowa spódnica
+ </string>
+ <string name="New Alpha">
+ Nowa alpha
+ </string>
+ <string name="New Tattoo">
+ Nowy tatuaż
+ </string>
+ <string name="New Physics">
+ Nowa fizyka
+ </string>
+ <string name="Invalid Wearable">
+ Nieaktualne ubranie/część ciała
+ </string>
+ <string name="New Gesture">
+ Nowa gesturka
+ </string>
+ <string name="New Script">
+ Nowy skrypt
+ </string>
+ <string name="New Note">
+ Stwórz nowe ogłoszenie
+ </string>
+ <string name="New Folder">
+ Nowy folder
+ </string>
+ <string name="Contents">
+ Zawartość
+ </string>
+ <string name="Gesture">
+ Gesturki
+ </string>
+ <string name="Male Gestures">
+ Gesturki dla mężczyzn
+ </string>
+ <string name="Female Gestures">
+ Gesturki dla kobiet
+ </string>
+ <string name="Other Gestures">
+ Inne gesturki
+ </string>
+ <string name="Speech Gestures">
+ Gesturki przemówienia
+ </string>
+ <string name="Common Gestures">
+ Gesturki
+ </string>
+ <string name="Male - Excuse me">
+ Mężczyzna - Excuse me
+ </string>
+ <string name="Male - Get lost">
+ Mężczyzna - Get lost
+ </string>
+ <string name="Male - Blow kiss">
+ Mężczyzna - Całusek
+ </string>
+ <string name="Male - Boo">
+ Mężczyzna - Boo
+ </string>
+ <string name="Male - Bored">
+ Mężczyzna - Znudzony
+ </string>
+ <string name="Male - Hey">
+ Mężczyzna - Hey
+ </string>
+ <string name="Male - Laugh">
+ Mężczyzna - Śmiech
+ </string>
+ <string name="Male - Repulsed">
+ Mężczyzna - Odrzucenie
+ </string>
+ <string name="Male - Shrug">
+ Mężczyzna - Wzruszenie ramionami
+ </string>
+ <string name="Male - Stick tougue out">
+ Mężczyzna - Pokaż język
+ </string>
+ <string name="Male - Wow">
+ Mężczyzna - Wow
+ </string>
+ <string name="Female - Chuckle">
+ Kobieta - Chichot
+ </string>
+ <string name="Female - Cry">
+ Kobieta - Płacze
+ </string>
+ <string name="Female - Embarrassed">
+ Kobieta - Zakłopotana
+ </string>
+ <string name="Female - Excuse me">
+ Kobieta - Excuse me
+ </string>
+ <string name="Female - Get lost">
+ Kobieta - Get lost
+ </string>
+ <string name="Female - Blow kiss">
+ Kobieta - Całusek
+ </string>
+ <string name="Female - Boo">
+ Kobieta - Boo
+ </string>
+ <string name="Female - Bored">
+ Kobieta - Znudzona
+ </string>
+ <string name="Female - Hey">
+ Kobieta - Hey
+ </string>
+ <string name="Female - Hey baby">
+ Kobieta - Hey baby
+ </string>
+ <string name="Female - Laugh">
+ Kobieta - Åšmiech
+ </string>
+ <string name="Female - Looking good">
+ Kobieta - Looking good
+ </string>
+ <string name="Female - Over here">
+ Kobieta - Over here
+ </string>
+ <string name="Female - Please">
+ Kobieta - Please
+ </string>
+ <string name="Female - Repulsed">
+ Kobieta - Odrzucenie
+ </string>
+ <string name="Female - Shrug">
+ Kobieta - Wzruszenie ramionami
+ </string>
+ <string name="Female - Stick tougue out">
+ Kobieta - Pokaż język
+ </string>
+ <string name="Female - Wow">
+ Kobieta - Wow
+ </string>
+ <string name="AvatarBirthDateFormat">
+ [mthnum,datetime,slt]/[day,datetime,slt]/[year,datetime,slt]
+ </string>
+ <string name="DefaultMimeType">
+ żadne/żadne
+ </string>
+ <string name="texture_load_dimensions_error">
+ Nie można załadować zdjęcia większego niż [WIDTH]*[HEIGHT]
+ </string>
+ <string name="words_separator" value=","/>
+ <string name="server_is_down">
+ Pomimo naszych najlepszych starań wystąpił niespodziewany problem.
+
+ Proszę sprawdzić czy na stronie status.secondlifegrid.net nie zostały umieszczone informacje o rozpoznanych problemach serwera.
+ Jeśli problemy będą występowały nadal, proszę sprawdź sieć i ustawienia firewall.
+ </string>
+ <string name="dateTimeWeekdaysNames">
+ Niedziela:Poniedziałek:Wtorek:Środa:Czwartek:Piątek:Sobota
+ </string>
+ <string name="dateTimeWeekdaysShortNames">
+ Niedz.:Pon.:Wt.:Åšr.:Czw.:Pt.:Sob.
+ </string>
+ <string name="dateTimeMonthNames">
+ Styczeń:Luty:Marzec:Kwiecień:Maj:Czerwiec:Lipiec:Sierpień:Wrzesień:Październik:Listopad:Grudzień
+ </string>
+ <string name="dateTimeMonthShortNames">
+ St.:Lt.:Mrz.:Kw.:Maj:Cz.:Lp.:Sie.:Wrz.:Li.:Paź.:Gru.
+ </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">
+ Członkostwo
+ </string>
+ <string name="Roles">
+ Funkcje
+ </string>
+ <string name="Group Identity">
+ Status grupy
+ </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">
+ Dostęp do posiadłości
+ </string>
+ <string name="Parcel Content">
+ Parcel Content
+ </string>
+ <string name="Object Management">
+ Object Management
+ </string>
+ <string name="Accounting">
+ Accounting
+ </string>
+ <string name="Notices">
+ Ogłoszenia
+ </string>
+ <string name="Chat" value=" Czat :">
+ Czat
+ </string>
+ <string name="DeleteItems">
+ Usuń wybrane obiekty?
+ </string>
+ <string name="DeleteItem">
+ Usuń wybrane obiekty?
+ </string>
+ <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/steam/xui/pt/strings.xml b/indra/newview/skins/steam/xui/pt/strings.xml
new file mode 100644
index 0000000000..07fd95c907
--- /dev/null
+++ b/indra/newview/skins/steam/xui/pt/strings.xml
@@ -0,0 +1,4885 @@
+<?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="CAPITALIZED_APP_NAME">
+ SECOND LIFE
+ </string>
+ <string name="SUPPORT_SITE">
+ Portal de Supporte Second Life
+ </string>
+ <string name="StartupDetectingHardware">
+ Detectando hardware...
+ </string>
+ <string name="StartupLoading">
+ Carregando [APP_NAME]...
+ </string>
+ <string name="StartupClearingCache">
+ Limpando o cache...
+ </string>
+ <string name="StartupInitializingTextureCache">
+ Iniciando cache de texturas...
+ </string>
+ <string name="StartupInitializingVFS">
+ Iniciando VFS...
+ </string>
+ <string name="StartupRequireDriverUpdate">
+ Falha na inicialização dos gráficos. Atualize seu driver gráfico!
+ </string>
+ <string name="ProgressRestoring">
+ Restaurando...
+ </string>
+ <string name="ProgressChangingResolution">
+ Alterando a resolução...
+ </string>
+ <string name="Fullbright">
+ Fullbright (antigo)
+ </string>
+ <string name="LoginInProgress">
+ Fazendo login. [APP_NAME] pode parecer congelado. Por favor, aguarde.
+ </string>
+ <string name="LoginInProgressNoFrozen">
+ Logando...
+ </string>
+ <string name="LoginAuthenticating">
+ Autenticando
+ </string>
+ <string name="LoginMaintenance">
+ Executando manutenção da conta...
+ </string>
+ <string name="LoginAttempt">
+ Falha na tentativa anterior de login. Login, tentativa [NUMBER]
+ </string>
+ <string name="LoginPrecaching">
+ Carregando mundo...
+ </string>
+ <string name="LoginInitializingBrowser">
+ Inicializando navegador embutido...
+ </string>
+ <string name="LoginInitializingMultimedia">
+ Inicializando multimídia...
+ </string>
+ <string name="LoginInitializingFonts">
+ Carregando fontes...
+ </string>
+ <string name="LoginVerifyingCache">
+ Verificando arquivos cache (pode levar de 60-90 segundos)...
+ </string>
+ <string name="LoginProcessingResponse">
+ Processando resposta...
+ </string>
+ <string name="LoginInitializingWorld">
+ Inicializando mundo...
+ </string>
+ <string name="LoginDecodingImages">
+ Decodificando imagens...
+ </string>
+ <string name="LoginInitializingQuicktime">
+ Inicializando o QuickTime...
+ </string>
+ <string name="LoginQuicktimeNotFound">
+ O QuickTime não foi encontrado - falha ao iniciar.
+ </string>
+ <string name="LoginQuicktimeOK">
+ O QuickTime foi inicializado com sucesso.
+ </string>
+ <string name="LoginRequestSeedCapGrant">
+ Solicitando recursos da região...
+ </string>
+ <string name="LoginRetrySeedCapGrant">
+ Solicitando recursos da região, tentativa [NUMBER]...
+ </string>
+ <string name="LoginWaitingForRegionHandshake">
+ Aguardando handshake com a região...
+ </string>
+ <string name="LoginConnectingToRegion">
+ Conectando à região...
+ </string>
+ <string name="LoginDownloadingClothing">
+ Baixando roupas...
+ </string>
+ <string name="InvalidCertificate">
+ O servidor respondeu com um certificado inválido ou corrompido. Por favor contate o administrador do Grid.
+ </string>
+ <string name="CertInvalidHostname">
+ Um hostname inválido foi usado para acessar o servidor. Verifique o SLURL ou hostname do Grid.
+ </string>
+ <string name="CertExpired">
+ O certificado dado pelo Grid parece estar vencido. Verifique o relógio do sistema ou contate o administrador do Grid.
+ </string>
+ <string name="CertKeyUsage">
+ O certificado dado pelo servidor não pôde ser usado para SSL. Por favor contate o administrador do Grid.
+ </string>
+ <string name="CertBasicConstraints">
+ A cadeia de certificados do servidor tinha certificados demais. Por favor contate o administrador do Grid.
+ </string>
+ <string name="CertInvalidSignature">
+ A assinatura do certificado dado pelo servidor do Grid não pôde ser verificada. Contate o administrador do seu Grid.
+ </string>
+ <string name="LoginFailedNoNetwork">
+ Erro de rede: Falha de conexão: verifique sua conexão à internet.
+ </string>
+ <string name="LoginFailed">
+ Falha do login.
+ </string>
+ <string name="Quit">
+ Sair
+ </string>
+ <string name="create_account_url">
+ http://join.secondlife.com/index.php?sourceid=1206_steam&amp;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">
+ Logons do Second Life estão temporariamente restritos para garantir a melhor experiência possível para os usuários no mundo virtual.
+
+Pessoas com contas gratuitas não poderão acessar o Second Life no momento para dar espaço para aquelas que pagaram pelo 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>
+ <string name="SavingSettings">
+ Salvando configurações...
+ </string>
+ <string name="LoggingOut">
+ Saindo...
+ </string>
+ <string name="ShuttingDown">
+ Fechando...
+ </string>
+ <string name="YouHaveBeenDisconnected">
+ Você foi desconectado da região onde estava.
+ </string>
+ <string name="SentToInvalidRegion">
+ Você foi enviado para uma região inválida.
+ </string>
+ <string name="TestingDisconnect">
+ Teste de desconexão
+ </string>
+ <string name="TooltipPerson">
+ Pessoa
+ </string>
+ <string name="TooltipNoName">
+ (sem nome)
+ </string>
+ <string name="TooltipOwner">
+ Proprietário:
+ </string>
+ <string name="TooltipPublic">
+ Público
+ </string>
+ <string name="TooltipIsGroup">
+ (Grupo)
+ </string>
+ <string name="TooltipForSaleL$">
+ À venda: L$[AMOUNT]
+ </string>
+ <string name="TooltipFlagGroupBuild">
+ Construído por Grupo
+ </string>
+ <string name="TooltipFlagNoBuild">
+ Não é permitido construir
+ </string>
+ <string name="TooltipFlagNoEdit">
+ Construído por Grupo
+ </string>
+ <string name="TooltipFlagNotSafe">
+ Não é seguro
+ </string>
+ <string name="TooltipFlagNoFly">
+ Não é permitido voar
+ </string>
+ <string name="TooltipFlagGroupScripts">
+ Scripts de Grupo
+ </string>
+ <string name="TooltipFlagNoScripts">
+ Não são permitidos scripts
+ </string>
+ <string name="TooltipLand">
+ Terreno:
+ </string>
+ <string name="TooltipMustSingleDrop">
+ Apenas um item único pode ser arrastado para este local
+ </string>
+ <string name="TooltipPrice" value="L$[AMOUNT]"/>
+ <string name="TooltipOutboxDragToWorld">
+ Não é possível fazer rez do itens em sua caixa de saída do lojista
+ </string>
+ <string name="TooltipOutboxNoTransfer">
+ Um ou mais destes objetos não podem ser vendidos ou transferidos.
+ </string>
+ <string name="TooltipOutboxNotInInventory">
+ Sua caixa de saída do lojista aceita apenas itens direto do seu inventário
+ </string>
+ <string name="TooltipOutboxWorn">
+ Você não pode colocar os itens que está vestindo na sua caixa de saída do lojista
+ </string>
+ <string name="TooltipOutboxCallingCard">
+ Não é possível colocar cartões de visita em sua caixa de saída do lojista
+ </string>
+ <string name="TooltipOutboxFolderLevels">
+ A profundidade das pastas aninhadas excede 3
+ </string>
+ <string name="TooltipOutboxTooManyFolders">
+ A contagem de subpastas na pasta de nível superior excede 20
+ </string>
+ <string name="TooltipOutboxTooManyObjects">
+ A contagem de itens na pasta de nível superior excede 200
+ </string>
+ <string name="TooltipDragOntoOwnChild">
+ Não é possível mover uma pasta para seu filho
+ </string>
+ <string name="TooltipDragOntoSelf">
+ Não é possível mover uma pasta para dentro dela mesma
+ </string>
+ <string name="TooltipHttpUrl">
+ Clique para ver a página web
+ </string>
+ <string name="TooltipSLURL">
+ Clique para ver os dados desta localização
+ </string>
+ <string name="TooltipAgentUrl">
+ Clique para ver o perfil deste residente
+ </string>
+ <string name="TooltipAgentInspect">
+ Saiba mais sobre este residente
+ </string>
+ <string name="TooltipAgentMute">
+ Clique para silenciar este residente
+ </string>
+ <string name="TooltipAgentUnmute">
+ Clique para desfazer silenciar neste residente
+ </string>
+ <string name="TooltipAgentIM">
+ Clique para enviar uma MI para este residente
+ </string>
+ <string name="TooltipAgentPay">
+ Clique para pagar este residente
+ </string>
+ <string name="TooltipAgentOfferTeleport">
+ Clique para enviar um pedido de amizade a este residente
+ </string>
+ <string name="TooltipAgentRequestFriend">
+ Clique para enviar um pedido de amizade a este residente
+ </string>
+ <string name="TooltipGroupUrl">
+ Clique para ver a descrição deste Grupo
+ </string>
+ <string name="TooltipEventUrl">
+ Clique para ver a descrição deste evento
+ </string>
+ <string name="TooltipClassifiedUrl">
+ Clique para ver este anúncio
+ </string>
+ <string name="TooltipParcelUrl">
+ Clique para ver a descrição desta parcela
+ </string>
+ <string name="TooltipTeleportUrl">
+ Clique para teletransportar para esta localização
+ </string>
+ <string name="TooltipObjectIMUrl">
+ Clique para ver a descrição deste objeto
+ </string>
+ <string name="TooltipMapUrl">
+ Clique para ver esta localização no mapa
+ </string>
+ <string name="TooltipSLAPP">
+ Clique para ativar no secondlife:// comando
+ </string>
+ <string name="CurrentURL" value="URL atual: [CurrentURL]"/>
+ <string name="SLurlLabelTeleport">
+ Teletransportar para
+ </string>
+ <string name="SLurlLabelShowOnMap">
+ Mostrar no mapa para
+ </string>
+ <string name="SLappAgentMute">
+ Silenciar
+ </string>
+ <string name="SLappAgentUnmute">
+ Desfazer silenciar
+ </string>
+ <string name="SLappAgentIM">
+ MI
+ </string>
+ <string name="SLappAgentPay">
+ Pagar
+ </string>
+ <string name="SLappAgentOfferTeleport">
+ Oferecer teletransporte para
+ </string>
+ <string name="SLappAgentRequestFriend">
+ Pedido de amizade
+ </string>
+ <string name="BUTTON_CLOSE_DARWIN">
+ Fechar (⌘W)
+ </string>
+ <string name="BUTTON_CLOSE_WIN">
+ Fechar (Ctrl+W)
+ </string>
+ <string name="BUTTON_CLOSE_CHROME">
+ Fechar
+ </string>
+ <string name="BUTTON_RESTORE">
+ Restaurar
+ </string>
+ <string name="BUTTON_MINIMIZE">
+ Minimizar
+ </string>
+ <string name="BUTTON_TEAR_OFF">
+ Separar-se da janela
+ </string>
+ <string name="BUTTON_DOCK">
+ conectar-se à barra
+ </string>
+ <string name="BUTTON_HELP">
+ Mostrar ajuda
+ </string>
+ <string name="Searching">
+ Buscando...
+ </string>
+ <string name="NoneFound">
+ Não encontrado.
+ </string>
+ <string name="RetrievingData">
+ Buscando...
+ </string>
+ <string name="ReleaseNotes">
+ Notas de versão
+ </string>
+ <string name="RELEASE_NOTES_BASE_URL">
+ http://wiki.secondlife.com/wiki/Release_Notes/
+ </string>
+ <string name="LoadingData">
+ Carregando...
+ </string>
+ <string name="AvatarNameNobody">
+ (ninguém)
+ </string>
+ <string name="AvatarNameWaiting">
+ (aguardando)
+ </string>
+ <string name="GroupNameNone">
+ (nenhum)
+ </string>
+ <string name="AvalineCaller">
+ Interlocutor Avaline [ORDER]
+ </string>
+ <string name="AssetErrorNone">
+ Nenhum erro
+ </string>
+ <string name="AssetErrorRequestFailed">
+ Item pedido falhou
+ </string>
+ <string name="AssetErrorNonexistentFile">
+ Item pedido: arquivo inexistente
+ </string>
+ <string name="AssetErrorNotInDatabase">
+ Item pedido: item não encontrado na base de dados.
+ </string>
+ <string name="AssetErrorEOF">
+ Fim do arquivo
+ </string>
+ <string name="AssetErrorCannotOpenFile">
+ Não é possível abrir arquivo
+ </string>
+ <string name="AssetErrorFileNotFound">
+ Arquivo não encontrado
+ </string>
+ <string name="AssetErrorTCPTimeout">
+ Tempo de transferência de arquivo expirado
+ </string>
+ <string name="AssetErrorCircuitGone">
+ Circuito caiu
+ </string>
+ <string name="AssetErrorPriceMismatch">
+ Visualizador e servidor não concordam no preço
+ </string>
+ <string name="AssetErrorUnknownStatus">
+ Status desconhecido
+ </string>
+ <string name="texture">
+ textura
+ </string>
+ <string name="sound">
+ som
+ </string>
+ <string name="calling card">
+ cartão de visitas
+ </string>
+ <string name="landmark">
+ landmark
+ </string>
+ <string name="legacy script">
+ script obsoleto
+ </string>
+ <string name="clothing">
+ roupas
+ </string>
+ <string name="object">
+ objeto
+ </string>
+ <string name="note card">
+ anotação
+ </string>
+ <string name="folder">
+ pasta
+ </string>
+ <string name="root">
+ raiz
+ </string>
+ <string name="lsl2 script">
+ script LSL2
+ </string>
+ <string name="lsl bytecode">
+ bytecode LSL
+ </string>
+ <string name="tga texture">
+ textura tga
+ </string>
+ <string name="body part">
+ parte do corpo
+ </string>
+ <string name="snapshot">
+ fotografia
+ </string>
+ <string name="lost and found">
+ Achados e Perdidos
+ </string>
+ <string name="targa image">
+ imagem targa
+ </string>
+ <string name="trash">
+ Lixo
+ </string>
+ <string name="jpeg image">
+ imagem jpeg
+ </string>
+ <string name="animation">
+ animação
+ </string>
+ <string name="gesture">
+ gesto
+ </string>
+ <string name="simstate">
+ simstate
+ </string>
+ <string name="favorite">
+ favorito
+ </string>
+ <string name="symbolic link">
+ link
+ </string>
+ <string name="symbolic folder link">
+ link da pasta
+ </string>
+ <string name="mesh">
+ mesh
+ </string>
+ <string name="AvatarEditingAppearance">
+ (Edição Aparência)
+ </string>
+ <string name="AvatarAway">
+ Distante
+ </string>
+ <string name="AvatarBusy">
+ Ocupado
+ </string>
+ <string name="AvatarMuted">
+ Mudo
+ </string>
+ <string name="anim_express_afraid">
+ Temeroso
+ </string>
+ <string name="anim_express_anger">
+ Bravo
+ </string>
+ <string name="anim_away">
+ Distante
+ </string>
+ <string name="anim_backflip">
+ Virar para trás
+ </string>
+ <string name="anim_express_laugh">
+ Rir segurando a barriga
+ </string>
+ <string name="anim_express_toothsmile">
+ Sorriso largo
+ </string>
+ <string name="anim_blowkiss">
+ Mandar beijo
+ </string>
+ <string name="anim_express_bored">
+ Entediado
+ </string>
+ <string name="anim_bow">
+ Reverência
+ </string>
+ <string name="anim_clap">
+ Aplaudir
+ </string>
+ <string name="anim_courtbow">
+ Saudação formal
+ </string>
+ <string name="anim_express_cry">
+ Chorar
+ </string>
+ <string name="anim_dance1">
+ Dança 1
+ </string>
+ <string name="anim_dance2">
+ Dança 2
+ </string>
+ <string name="anim_dance3">
+ Dança 3
+ </string>
+ <string name="anim_dance4">
+ Dança 4
+ </string>
+ <string name="anim_dance5">
+ Dança 5
+ </string>
+ <string name="anim_dance6">
+ Dança 6
+ </string>
+ <string name="anim_dance7">
+ Dança 7
+ </string>
+ <string name="anim_dance8">
+ Dança 8
+ </string>
+ <string name="anim_express_disdain">
+ Desdém
+ </string>
+ <string name="anim_drink">
+ Beber
+ </string>
+ <string name="anim_express_embarrased">
+ Envergonhado
+ </string>
+ <string name="anim_angry_fingerwag">
+ Negar com o dedo.
+ </string>
+ <string name="anim_fist_pump">
+ Vibrar provocando
+ </string>
+ <string name="anim_yoga_float">
+ Levitar Yoga
+ </string>
+ <string name="anim_express_frown">
+ Careta
+ </string>
+ <string name="anim_impatient">
+ Impaciente
+ </string>
+ <string name="anim_jumpforjoy">
+ Pular de alegria
+ </string>
+ <string name="anim_kissmybutt">
+ Beije meu bumbum
+ </string>
+ <string name="anim_express_kiss">
+ Beijar
+ </string>
+ <string name="anim_laugh_short">
+ Rir
+ </string>
+ <string name="anim_musclebeach">
+ Exibir músculos
+ </string>
+ <string name="anim_no_unhappy">
+ Não (descontente)
+ </string>
+ <string name="anim_no_head">
+ Não
+ </string>
+ <string name="anim_nyanya">
+ Nya-nya-nya
+ </string>
+ <string name="anim_punch_onetwo">
+ Soco um-dois
+ </string>
+ <string name="anim_express_open_mouth">
+ Abrir a boca
+ </string>
+ <string name="anim_peace">
+ Paz
+ </string>
+ <string name="anim_point_you">
+ Apontar para o outro
+ </string>
+ <string name="anim_point_me">
+ Apontar para si
+ </string>
+ <string name="anim_punch_l">
+ Soco esquerdo
+ </string>
+ <string name="anim_punch_r">
+ Soco direito
+ </string>
+ <string name="anim_rps_countdown">
+ RPS contar
+ </string>
+ <string name="anim_rps_paper">
+ RPS papel
+ </string>
+ <string name="anim_rps_rock">
+ RPS pedra
+ </string>
+ <string name="anim_rps_scissors">
+ RPS tesoura
+ </string>
+ <string name="anim_express_repulsed">
+ Repulsa
+ </string>
+ <string name="anim_kick_roundhouse_r">
+ Chute giratório
+ </string>
+ <string name="anim_express_sad">
+ Triste
+ </string>
+ <string name="anim_salute">
+ Saúde
+ </string>
+ <string name="anim_shout">
+ Gritar
+ </string>
+ <string name="anim_express_shrug">
+ Encolher ombros
+ </string>
+ <string name="anim_express_smile">
+ Sorrir
+ </string>
+ <string name="anim_smoke_idle">
+ Fumar à toa
+ </string>
+ <string name="anim_smoke_inhale">
+ Inalar fumaça
+ </string>
+ <string name="anim_smoke_throw_down">
+ Expelir fumaça
+ </string>
+ <string name="anim_express_surprise">
+ Surpresa
+ </string>
+ <string name="anim_sword_strike_r">
+ Golpe de espada
+ </string>
+ <string name="anim_angry_tantrum">
+ Enraivecer
+ </string>
+ <string name="anim_express_tongue_out">
+ Mostrar a língua
+ </string>
+ <string name="anim_hello">
+ Onda
+ </string>
+ <string name="anim_whisper">
+ Sussurrar
+ </string>
+ <string name="anim_whistle">
+ Assobiar
+ </string>
+ <string name="anim_express_wink">
+ Piscar
+ </string>
+ <string name="anim_wink_hollywood">
+ Piscar (Hollywood)
+ </string>
+ <string name="anim_express_worry">
+ Preocupar-se
+ </string>
+ <string name="anim_yes_happy">
+ Sim (Feliz)
+ </string>
+ <string name="anim_yes_head">
+ Sim
+ </string>
+ <string name="multiple_textures">
+ Múltiplo
+ </string>
+ <string name="texture_loading">
+ Carregando...
+ </string>
+ <string name="worldmap_offline">
+ Offline
+ </string>
+ <string name="worldmap_item_tooltip_format">
+ L$[PRICE] por [AREA] m²
+ </string>
+ <string name="worldmap_results_none_found">
+ Nenhum encontrado.
+ </string>
+ <string name="Ok">
+ OK
+ </string>
+ <string name="Premature end of file">
+ término prematuro do arquivo
+ </string>
+ <string name="ST_NO_JOINT">
+ Não é possível encontrar a raiz (ROOT) ou junção (JOINT).
+ </string>
+ <string name="whisper">
+ sussurra:
+ </string>
+ <string name="shout">
+ grita:
+ </string>
+ <string name="ringing">
+ Conectando à conversa de voz no mundo
+ </string>
+ <string name="connected">
+ Conectado
+ </string>
+ <string name="unavailable">
+ Voz não disponível na sua localização atual
+ </string>
+ <string name="hang_up">
+ Desconectado da conversa de Voz no mundo
+ </string>
+ <string name="reconnect_nearby">
+ Agora você será reconectado ao bate-papo local.
+ </string>
+ <string name="ScriptQuestionCautionChatGranted">
+ &apos;[OBJECTNAME]&apos;, um objeto de &apos;[OWNERNAME]&apos;, localizado em [REGIONNAME] a [REGIONPOS], obteve permissão para: [PERMISSIONS].
+ </string>
+ <string name="ScriptQuestionCautionChatDenied">
+ &apos;[OBJECTNAME]&apos;, um objeto de &apos;[OWNERNAME]&apos;, localizado em [REGIONNAME] a [REGIONPOS], teve permissão negada para: [PERMISSIONS].
+ </string>
+ <string name="ScriptTakeMoney">
+ Tomar linden dólares (L$) de você
+ </string>
+ <string name="ActOnControlInputs">
+ Atue nas suas entradas de controle
+ </string>
+ <string name="RemapControlInputs">
+ Remapeie suas entradas de controle
+ </string>
+ <string name="AnimateYourAvatar">
+ Faça uma animação para o seu avatar
+ </string>
+ <string name="AttachToYourAvatar">
+ Anexe ao seu avatar
+ </string>
+ <string name="ReleaseOwnership">
+ Libere a propriedade e torne-a pública
+ </string>
+ <string name="LinkAndDelink">
+ Una e desuna de outros objetos
+ </string>
+ <string name="AddAndRemoveJoints">
+ Adicione e remova junções com outros objetos
+ </string>
+ <string name="ChangePermissions">
+ Modifique as permissões
+ </string>
+ <string name="TrackYourCamera">
+ Acompanhe sua câmera
+ </string>
+ <string name="ControlYourCamera">
+ Controle sua camera
+ </string>
+ <string name="SIM_ACCESS_PG">
+ Público geral
+ </string>
+ <string name="SIM_ACCESS_MATURE">
+ Moderado
+ </string>
+ <string name="SIM_ACCESS_ADULT">
+ Adulto
+ </string>
+ <string name="SIM_ACCESS_DOWN">
+ Desconectado
+ </string>
+ <string name="SIM_ACCESS_MIN">
+ Desconhecido
+ </string>
+ <string name="land_type_unknown">
+ (desconhecido)
+ </string>
+ <string name="Estate / Full Region">
+ Propriedadade / Região inteira:
+ </string>
+ <string name="Estate / Homestead">
+ Imóvel / Homestead
+ </string>
+ <string name="Mainland / Homestead">
+ Continente / Homestead
+ </string>
+ <string name="Mainland / Full Region">
+ Continente / Região inteira:
+ </string>
+ <string name="all_files">
+ Todos os arquivos
+ </string>
+ <string name="sound_files">
+ Sons
+ </string>
+ <string name="animation_files">
+ Animações
+ </string>
+ <string name="image_files">
+ Imagens
+ </string>
+ <string name="save_file_verb">
+ Salvar
+ </string>
+ <string name="load_file_verb">
+ Carregar
+ </string>
+ <string name="targa_image_files">
+ Imagens Targa
+ </string>
+ <string name="bitmap_image_files">
+ Imagens Bitmap
+ </string>
+ <string name="avi_movie_file">
+ Arquivo de vídeo AVI
+ </string>
+ <string name="xaf_animation_file">
+ Arquivo de animação XAF
+ </string>
+ <string name="xml_file">
+ Arquivo XML
+ </string>
+ <string name="raw_file">
+ Arquivo RAW
+ </string>
+ <string name="compressed_image_files">
+ Imagens compactadas
+ </string>
+ <string name="load_files">
+ Carregar arquivos
+ </string>
+ <string name="choose_the_directory">
+ Selecionar pasta
+ </string>
+ <string name="script_files">
+ Scripts
+ </string>
+ <string name="AvatarSetNotAway">
+ deixar como ausente
+ </string>
+ <string name="AvatarSetAway">
+ deixar como ausente
+ </string>
+ <string name="AvatarSetNotBusy">
+ deixar como não ocupado
+ </string>
+ <string name="AvatarSetBusy">
+ Deixar como ocupado
+ </string>
+ <string name="shape">
+ Silhueta
+ </string>
+ <string name="skin">
+ Pele
+ </string>
+ <string name="hair">
+ Cabelo
+ </string>
+ <string name="eyes">
+ Olhos
+ </string>
+ <string name="shirt">
+ Camisa
+ </string>
+ <string name="pants">
+ Calças
+ </string>
+ <string name="shoes">
+ Sapatos
+ </string>
+ <string name="socks">
+ Meias
+ </string>
+ <string name="jacket">
+ Blusa
+ </string>
+ <string name="gloves">
+ Luvas
+ </string>
+ <string name="undershirt">
+ Camiseta
+ </string>
+ <string name="underpants">
+ Roupa de baixo
+ </string>
+ <string name="skirt">
+ Saia
+ </string>
+ <string name="alpha">
+ Alpha
+ </string>
+ <string name="tattoo">
+ Tatuagem
+ </string>
+ <string name="physics">
+ Físico
+ </string>
+ <string name="invalid">
+ Inválido
+ </string>
+ <string name="none">
+ nenhum
+ </string>
+ <string name="shirt_not_worn">
+ Camisa não vestida
+ </string>
+ <string name="pants_not_worn">
+ Calças não vestidas
+ </string>
+ <string name="shoes_not_worn">
+ Sapatos não calçados
+ </string>
+ <string name="socks_not_worn">
+ Meias não calçadas
+ </string>
+ <string name="jacket_not_worn">
+ Jaqueta não vestida
+ </string>
+ <string name="gloves_not_worn">
+ Luvas não calçadas
+ </string>
+ <string name="undershirt_not_worn">
+ Camiseta não vestida
+ </string>
+ <string name="underpants_not_worn">
+ Roupa de baixo não vestida
+ </string>
+ <string name="skirt_not_worn">
+ Saia não vestida
+ </string>
+ <string name="alpha_not_worn">
+ Alpha não vestido
+ </string>
+ <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>
+ <string name="create_new_shape">
+ Criar novo físico
+ </string>
+ <string name="create_new_skin">
+ Criar pele nova
+ </string>
+ <string name="create_new_hair">
+ Criar cabelo novo
+ </string>
+ <string name="create_new_eyes">
+ Criar olhos novos
+ </string>
+ <string name="create_new_shirt">
+ Criar camisa nova
+ </string>
+ <string name="create_new_pants">
+ Criar calças novas
+ </string>
+ <string name="create_new_shoes">
+ Criar sapatos novos
+ </string>
+ <string name="create_new_socks">
+ Criar meias novas
+ </string>
+ <string name="create_new_jacket">
+ Criar jaqueta nova
+ </string>
+ <string name="create_new_gloves">
+ Criar luvas novas
+ </string>
+ <string name="create_new_undershirt">
+ Criar camiseta nova
+ </string>
+ <string name="create_new_underpants">
+ Criar roupa de baixo nova
+ </string>
+ <string name="create_new_skirt">
+ Criar saia nova
+ </string>
+ <string name="create_new_alpha">
+ Criar Alpha novo
+ </string>
+ <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>
+ <string name="NewWearable">
+ Novo [WEARABLE_ITEM]
+ </string>
+ <string name="next">
+ Próximo
+ </string>
+ <string name="ok">
+ OK
+ </string>
+ <string name="GroupNotifyGroupNotice">
+ Anúncio de grupo
+ </string>
+ <string name="GroupNotifyGroupNotices">
+ Anúncios do grupo
+ </string>
+ <string name="GroupNotifySentBy">
+ Enviado por
+ </string>
+ <string name="GroupNotifyAttached">
+ Anexo:
+ </string>
+ <string name="GroupNotifyViewPastNotices">
+ Ver últimos anúncios ou optar por não receber essas mensagens aqui.
+ </string>
+ <string name="GroupNotifyOpenAttachment">
+ Abrir anexo
+ </string>
+ <string name="GroupNotifySaveAttachment">
+ Salvar anexo
+ </string>
+ <string name="TeleportOffer">
+ Oferta de teletransporte
+ </string>
+ <string name="StartUpNotifications">
+ Novas notificações chegaram enquanto você estava fora...
+ </string>
+ <string name="OverflowInfoChannelString">
+ Você tem mais [%d] notificações
+ </string>
+ <string name="BodyPartsRightArm">
+ Braço direito
+ </string>
+ <string name="BodyPartsHead">
+ Cabeça
+ </string>
+ <string name="BodyPartsLeftArm">
+ Braço esquerdo
+ </string>
+ <string name="BodyPartsLeftLeg">
+ Perna esquerda
+ </string>
+ <string name="BodyPartsTorso">
+ Tronco
+ </string>
+ <string name="BodyPartsRightLeg">
+ Perna direita
+ </string>
+ <string name="GraphicsQualityLow">
+ Baixo
+ </string>
+ <string name="GraphicsQualityMid">
+ Meio
+ </string>
+ <string name="GraphicsQualityHigh">
+ Alto
+ </string>
+ <string name="LeaveMouselook">
+ Pressione ESC para retornar para visão do mundo
+ </string>
+ <string name="InventoryNoMatchingItems">
+ Não encontrou o que procura? Tente buscar no [secondlife:///app/search/people/[SEARCH_TERM] Search].
+ </string>
+ <string name="PlacesNoMatchingItems">
+ Não encontrou o que procura? Tente buscar no [secondlife:///app/search/groups/[SEARCH_TERM] Search].
+ </string>
+ <string name="FavoritesNoMatchingItems">
+ Arraste um marco para adicioná-lo aos seus favoritos.
+ </string>
+ <string name="InventoryNoTexture">
+ Você não possui uma cópia desta textura no seu inventário
+ </string>
+ <string name="InventoryInboxNoItems">
+ Suas compras do Marketplace aparecerão aqui. Depois, você poderá arrastá-las para seu inventário para usá-las.
+ </string>
+ <string name="MarketplaceURL">
+ https://marketplace.[MARKETPLACE_DOMAIN_NAME]/
+ </string>
+ <string name="MarketplaceURL_CreateStore">
+ http://community.secondlife.com/t5/English-Knowledge-Base/Selling-in-the-Marketplace/ta-p/700193#Section_.4
+ </string>
+ <string name="MarketplaceURL_Dashboard">
+ https://marketplace.[MARKETPLACE_DOMAIN_NAME]/merchants/store/dashboard
+ </string>
+ <string name="MarketplaceURL_Imports">
+ https://marketplace.[MARKETPLACE_DOMAIN_NAME]/merchants/store/imports
+ </string>
+ <string name="MarketplaceURL_LearnMore">
+ https://marketplace.[MARKETPLACE_DOMAIN_NAME]/learn_more
+ </string>
+ <string name="InventoryOutboxNotMerchantTitle">
+ Qualquer um pode vender itens no Mercado.
+ </string>
+ <string name="InventoryOutboxNotMerchantTooltip"/>
+ <string name="InventoryOutboxNotMerchant">
+ Se você deseja se tornar um lojista, precisará [[MARKETPLACE_CREATE_STORE_URL] criar uma loja no Mercado].
+ </string>
+ <string name="InventoryOutboxNoItemsTitle">
+ Sua caixa de saída está vazia
+ </string>
+ <string name="InventoryOutboxNoItemsTooltip"/>
+ <string name="InventoryOutboxNoItems">
+ Arraste as pastas para estas áreas e então clique em &quot;Enviar para Mercado&quot; para listar os itens para venda no [[MARKETPLACE_DASHBOARD_URL] Mercado].
+ </string>
+ <string name="Marketplace Error None">
+ Sem erros
+ </string>
+ <string name="Marketplace Error Not Merchant">
+ Erro: antes de enviar os itens para o Mercado, é necessário que você se defina como um lojista (sem custos).
+ </string>
+ <string name="Marketplace Error Empty Folder">
+ Erro: esta pasta está vazia.
+ </string>
+ <string name="Marketplace Error Unassociated Products">
+ Erro: ocorreu uma falha ao enviar este item, pois sua conta de lojista tem muitos itens não associados a produtos. Para corrigir esse erro, faça o login no site do mercado e reduza a contagem de itens não associados.
+ </string>
+ <string name="Marketplace Error Object Limit">
+ Erro: este item contém muitos objetos. Corrija esse erro unindo os objetos em caixa para reduzir a contagem total a menos de 200.
+ </string>
+ <string name="Marketplace Error Folder Depth">
+ Erro: este item contém muitos níveis de pastas aninhadas. Reorganize-o em até 3 níveis de pastas aninhadas, no máximo.
+ </string>
+ <string name="Marketplace Error Unsellable Item">
+ Erro: este item não pode ser vendido no mercado.
+ </string>
+ <string name="Marketplace Error Internal Import">
+ Erro: ocorreu um problema com este item. Tente novamente mais tarde.
+ </string>
+ <string name="Open landmarks">
+ Marcos abertos
+ </string>
+ <string name="no_transfer" value="(não transferível)"/>
+ <string name="no_modify" value="(não modificável)"/>
+ <string name="no_copy" value="(não copiável)"/>
+ <string name="worn" value="(vestido)"/>
+ <string name="link" value="(link)"/>
+ <string name="broken_link" value="(link_quebrado)&quot;"/>
+ <string name="LoadingContents">
+ Carregando conteúdo...
+ </string>
+ <string name="NoContents">
+ Nenhum conteúdo
+ </string>
+ <string name="WornOnAttachmentPoint" value="(vestido em [ATTACHMENT_POINT])"/>
+ <string name="ActiveGesture" value="[GESLABEL] (ativado)"/>
+ <string name="Chat Message" value="Bate-papo:"/>
+ <string name="Sound" value="Som"/>
+ <string name="Wait" value="--- Aguarde"/>
+ <string name="AnimFlagStop" value="Parar animação"/>
+ <string name="AnimFlagStart" value="Iniciar animação"/>
+ <string name="Wave" value="Acenar"/>
+ <string name="GestureActionNone" value="Nenhum"/>
+ <string name="HelloAvatar" value="Olá, avatar!"/>
+ <string name="ViewAllGestures" value="Ver todos&gt;&gt;"/>
+ <string name="GetMoreGestures" value="Mais &gt;&gt;"/>
+ <string name="Animations" value="Animações,"/>
+ <string name="Calling Cards" value="Cartões de visitas,"/>
+ <string name="Clothing" value="Vestuário,"/>
+ <string name="Gestures" value="Gestos,"/>
+ <string name="Landmarks" value="Marcos"/>
+ <string name="Notecards" value="Anotações"/>
+ <string name="Objects" value="Objetos,"/>
+ <string name="Scripts" value="Scripts,"/>
+ <string name="Sounds" value="Sons"/>
+ <string name="Textures" value="Texturas"/>
+ <string name="Snapshots" value="Fotografias"/>
+ <string name="No Filters" value="Não"/>
+ <string name="Since Logoff" value="- Desde desligado"/>
+ <string name="InvFolder My Inventory">
+ Meu inventário
+ </string>
+ <string name="InvFolder Library">
+ Biblioteca
+ </string>
+ <string name="InvFolder Textures">
+ Texturas
+ </string>
+ <string name="InvFolder Sounds">
+ Sons
+ </string>
+ <string name="InvFolder Calling Cards">
+ Cartões de visitas
+ </string>
+ <string name="InvFolder Landmarks">
+ Marcos
+ </string>
+ <string name="InvFolder Scripts">
+ Scripts
+ </string>
+ <string name="InvFolder Clothing">
+ Vestuário
+ </string>
+ <string name="InvFolder Objects">
+ Objetos
+ </string>
+ <string name="InvFolder Notecards">
+ Anotações
+ </string>
+ <string name="InvFolder New Folder">
+ Nova pasta
+ </string>
+ <string name="InvFolder Inventory">
+ Inventário
+ </string>
+ <string name="InvFolder Uncompressed Images">
+ Imagens descompactadas
+ </string>
+ <string name="InvFolder Body Parts">
+ Corpo
+ </string>
+ <string name="InvFolder Trash">
+ Lixo
+ </string>
+ <string name="InvFolder Photo Album">
+ Ãlbum de fotografias
+ </string>
+ <string name="InvFolder Lost And Found">
+ Achados e Perdidos
+ </string>
+ <string name="InvFolder Uncompressed Sounds">
+ Sons descompactados
+ </string>
+ <string name="InvFolder Animations">
+ Animações
+ </string>
+ <string name="InvFolder Gestures">
+ Gestos
+ </string>
+ <string name="InvFolder Favorite">
+ Meus favoritos
+ </string>
+ <string name="InvFolder favorite">
+ Meus favoritos
+ </string>
+ <string name="InvFolder Current Outfit">
+ Look atual
+ </string>
+ <string name="InvFolder Initial Outfits">
+ Looks iniciais
+ </string>
+ <string name="InvFolder My Outfits">
+ Meus looks
+ </string>
+ <string name="InvFolder Accessories">
+ Acessórios
+ </string>
+ <string name="InvFolder Meshes">
+ Meshes:
+ </string>
+ <string name="InvFolder Friends">
+ Amigos
+ </string>
+ <string name="InvFolder All">
+ Tudo
+ </string>
+ <string name="no_attachments">
+ Nenhum anexo vestido
+ </string>
+ <string name="Attachments remain">
+ Anexos ([COUNT] slots permanecem)
+ </string>
+ <string name="Buy">
+ Comprar
+ </string>
+ <string name="BuyforL$">
+ Comprar por L$
+ </string>
+ <string name="Stone">
+ Pedra
+ </string>
+ <string name="Metal">
+ Metal
+ </string>
+ <string name="Glass">
+ Vidro
+ </string>
+ <string name="Wood">
+ Madeira
+ </string>
+ <string name="Flesh">
+ Carne
+ </string>
+ <string name="Plastic">
+ Plástico
+ </string>
+ <string name="Rubber">
+ Borrracha
+ </string>
+ <string name="Light">
+ Luz
+ </string>
+ <string name="KBShift">
+ Shift
+ </string>
+ <string name="KBCtrl">
+ Ctrl
+ </string>
+ <string name="Chest">
+ Peito
+ </string>
+ <string name="Skull">
+ Crânio
+ </string>
+ <string name="Left Shoulder">
+ Ombro esquerdo
+ </string>
+ <string name="Right Shoulder">
+ Ombro direito
+ </string>
+ <string name="Left Hand">
+ Mão esquerda
+ </string>
+ <string name="Right Hand">
+ Mão direita
+ </string>
+ <string name="Left Foot">
+ Pé esquerdo
+ </string>
+ <string name="Right Foot">
+ Pé direito
+ </string>
+ <string name="Spine">
+ Espinha
+ </string>
+ <string name="Pelvis">
+ Pélvis
+ </string>
+ <string name="Mouth">
+ Boca
+ </string>
+ <string name="Chin">
+ Queixo
+ </string>
+ <string name="Left Ear">
+ Orelha esquerda
+ </string>
+ <string name="Right Ear">
+ Orelha direita
+ </string>
+ <string name="Left Eyeball">
+ Globo ocular esquerdo
+ </string>
+ <string name="Right Eyeball">
+ Globo ocular direito
+ </string>
+ <string name="Nose">
+ Nariz
+ </string>
+ <string name="R Upper Arm">
+ Braço superior D
+ </string>
+ <string name="R Forearm">
+ Antebraço D
+ </string>
+ <string name="L Upper Arm">
+ Braço superior E
+ </string>
+ <string name="L Forearm">
+ Antebraço E
+ </string>
+ <string name="Right Hip">
+ Quadril direito
+ </string>
+ <string name="R Upper Leg">
+ Coxa D
+ </string>
+ <string name="R Lower Leg">
+ Perna inferior D
+ </string>
+ <string name="Left Hip">
+ Quadril esquerdo
+ </string>
+ <string name="L Upper Leg">
+ Coxa E
+ </string>
+ <string name="L Lower Leg">
+ Perna inferior E
+ </string>
+ <string name="Stomach">
+ Estômago
+ </string>
+ <string name="Left Pec">
+ Peitoral E
+ </string>
+ <string name="Right Pec">
+ Peitoral D
+ </string>
+ <string name="Neck">
+ Pescoço
+ </string>
+ <string name="Avatar Center">
+ Centro do avatar
+ </string>
+ <string name="Invalid Attachment">
+ Ponto de encaixe inválido
+ </string>
+ <string name="YearsMonthsOld">
+ [AGEYEARS] [AGEMONTHS] de idade
+ </string>
+ <string name="YearsOld">
+ [AGEYEARS] de idade
+ </string>
+ <string name="MonthsOld">
+ [AGEMONTHS] de idade
+ </string>
+ <string name="WeeksOld">
+ [AGEWEEKS] de idade
+ </string>
+ <string name="DaysOld">
+ [AGEDAYS] de idade
+ </string>
+ <string name="TodayOld">
+ Cadastrado hoje
+ </string>
+ <string name="AgeYearsA">
+ [COUNT] ano
+ </string>
+ <string name="AgeYearsB">
+ [COUNT] anos
+ </string>
+ <string name="AgeYearsC">
+ [COUNT] anos
+ </string>
+ <string name="AgeMonthsA">
+ [COUNT] mês
+ </string>
+ <string name="AgeMonthsB">
+ [COUNT] meses
+ </string>
+ <string name="AgeMonthsC">
+ [COUNT] meses
+ </string>
+ <string name="AgeWeeksA">
+ [COUNT] semana
+ </string>
+ <string name="AgeWeeksB">
+ [COUNT] semanas
+ </string>
+ <string name="AgeWeeksC">
+ [COUNT] semanas
+ </string>
+ <string name="AgeDaysA">
+ [COUNT] dia
+ </string>
+ <string name="AgeDaysB">
+ [COUNT] dias
+ </string>
+ <string name="AgeDaysC">
+ [COUNT] dias
+ </string>
+ <string name="GroupMembersA">
+ [COUNT] membro
+ </string>
+ <string name="GroupMembersB">
+ [COUNT] membros
+ </string>
+ <string name="GroupMembersC">
+ [COUNT] membros
+ </string>
+ <string name="AcctTypeResident">
+ Residente
+ </string>
+ <string name="AcctTypeTrial">
+ Prova
+ </string>
+ <string name="AcctTypeCharterMember">
+ Lista de membros
+ </string>
+ <string name="AcctTypeEmployee">
+ Empregado da Linden Lab
+ </string>
+ <string name="PaymentInfoUsed">
+ Dados de pagamento usados
+ </string>
+ <string name="PaymentInfoOnFile">
+ Dados de pagamento fornecidos
+ </string>
+ <string name="NoPaymentInfoOnFile">
+ Nenhum dado de pagamento
+ </string>
+ <string name="AgeVerified">
+ Idade comprovada
+ </string>
+ <string name="NotAgeVerified">
+ Idade não comprovada
+ </string>
+ <string name="Center 2">
+ Centro 2
+ </string>
+ <string name="Top Right">
+ Topo direita
+ </string>
+ <string name="Top">
+ Topo
+ </string>
+ <string name="Top Left">
+ Topo esquerda
+ </string>
+ <string name="Center">
+ Centro
+ </string>
+ <string name="Bottom Left">
+ Inferior esquerdo
+ </string>
+ <string name="Bottom">
+ Inferior
+ </string>
+ <string name="Bottom Right">
+ Inferior direito
+ </string>
+ <string name="CompileQueueDownloadedCompiling">
+ Baixado, agora compilando
+ </string>
+ <string name="CompileQueueScriptNotFound">
+ Script não encontrado no servidor.
+ </string>
+ <string name="CompileQueueProblemDownloading">
+ Problema no download
+ </string>
+ <string name="CompileQueueInsufficientPermDownload">
+ Permissões insuficientes para fazer o download do script.
+ </string>
+ <string name="CompileQueueInsufficientPermFor">
+ Permissões insuficientes para
+ </string>
+ <string name="CompileQueueUnknownFailure">
+ Falha desconhecida para download
+ </string>
+ <string name="CompileQueueTitle">
+ Progresso do recompilamento
+ </string>
+ <string name="CompileQueueStart">
+ recompilar
+ </string>
+ <string name="ResetQueueTitle">
+ Reset Progresso
+ </string>
+ <string name="ResetQueueStart">
+ Zerar
+ </string>
+ <string name="RunQueueTitle">
+ Definir funcionamento do progresso
+ </string>
+ <string name="RunQueueStart">
+ deixar funcionando
+ </string>
+ <string name="NotRunQueueTitle">
+ Definir progresso não funcionando
+ </string>
+ <string name="NotRunQueueStart">
+ não deixar funcionando
+ </string>
+ <string name="CompileSuccessful">
+ Compilação bem sucedida
+ </string>
+ <string name="CompileSuccessfulSaving">
+ Compilação bem sucedida, salvando...
+ </string>
+ <string name="SaveComplete">
+ Salvo.
+ </string>
+ <string name="ObjectOutOfRange">
+ Script (objeto fora de alcance)
+ </string>
+ <string name="GodToolsObjectOwnedBy">
+ Objeto [OBJECT] de propriedade de [OWNER]
+ </string>
+ <string name="GroupsNone">
+ nenhum
+ </string>
+ <string name="Group" value="(grupo)"/>
+ <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="GroupPlanningDate">
+ [mthnum,datetime,utc]/[day,datetime,utc]/[year,datetime,utc]
+ </string>
+ <string name="GroupIndividualShare" value="Grupo Divisão individualI"/>
+ <string name="GroupColumn" value="Grupo"/>
+ <string name="Balance">
+ Balanço
+ </string>
+ <string name="Credits">
+ Créditos
+ </string>
+ <string name="Debits">
+ Débitos
+ </string>
+ <string name="Total">
+ Total
+ </string>
+ <string name="NoGroupDataFound">
+ Não há dados de grupo
+ </string>
+ <string name="IMParentEstate">
+ Propriedade-pai
+ </string>
+ <string name="IMMainland">
+ continente
+ </string>
+ <string name="IMTeen">
+ adolescente
+ </string>
+ <string name="Anyone">
+ qualquer um
+ </string>
+ <string name="RegionInfoError">
+ erro
+ </string>
+ <string name="RegionInfoAllEstatesOwnedBy">
+ todas as propriedades pertencem a [OWNER]
+ </string>
+ <string name="RegionInfoAllEstatesYouOwn">
+ todas as propriedades que você possui
+ </string>
+ <string name="RegionInfoAllEstatesYouManage">
+ todas as propriedades que você gerencia para [OWNER]
+ </string>
+ <string name="RegionInfoAllowedResidents">
+ Residentes autorizados: ([ALLOWEDAGENTS], max [MAXACCESS])
+ </string>
+ <string name="RegionInfoAllowedGroups">
+ Grupos permitidos: ([ALLOWEDGROUPS], max [MAXACCESS])
+ </string>
+ <string name="ScriptLimitsParcelScriptMemory">
+ Memória de scripts no lote
+ </string>
+ <string name="ScriptLimitsParcelsOwned">
+ Lotes listados: [PARCELS]
+ </string>
+ <string name="ScriptLimitsMemoryUsed">
+ Memória usada: [COUNT] kb de [MAX] kb; [AVAILABLE] kb disponíveis
+ </string>
+ <string name="ScriptLimitsMemoryUsedSimple">
+ Memória usada: [COUNT] kb
+ </string>
+ <string name="ScriptLimitsParcelScriptURLs">
+ URL dos scripts do lote
+ </string>
+ <string name="ScriptLimitsURLsUsed">
+ URLs usados: [COUNT] de [MAX]; [AVAILABLE] disponíveis
+ </string>
+ <string name="ScriptLimitsURLsUsedSimple">
+ URLs usados: [COUNT]
+ </string>
+ <string name="ScriptLimitsRequestError">
+ Erro ao solicitar dados
+ </string>
+ <string name="ScriptLimitsRequestNoParcelSelected">
+ Nenhum lote foi selecionado
+ </string>
+ <string name="ScriptLimitsRequestWrongRegion">
+ Erro: dados de script só disponíveis na região da posição atual
+ </string>
+ <string name="ScriptLimitsRequestWaiting">
+ Obtendo dados...
+ </string>
+ <string name="ScriptLimitsRequestDontOwnParcel">
+ Você não está autorizado a examinar este lote.
+ </string>
+ <string name="SITTING_ON">
+ Sentado em
+ </string>
+ <string name="ATTACH_CHEST">
+ Peito
+ </string>
+ <string name="ATTACH_HEAD">
+ Cabeça
+ </string>
+ <string name="ATTACH_LSHOULDER">
+ Ombro esquerdo
+ </string>
+ <string name="ATTACH_RSHOULDER">
+ Ombro direito
+ </string>
+ <string name="ATTACH_LHAND">
+ Mão esquerda
+ </string>
+ <string name="ATTACH_RHAND">
+ Mão direita
+ </string>
+ <string name="ATTACH_LFOOT">
+ Pé esquerdo
+ </string>
+ <string name="ATTACH_RFOOT">
+ Pé direito
+ </string>
+ <string name="ATTACH_BACK">
+ Atrás
+ </string>
+ <string name="ATTACH_PELVIS">
+ Pélvis
+ </string>
+ <string name="ATTACH_MOUTH">
+ Boca
+ </string>
+ <string name="ATTACH_CHIN">
+ Queixo
+ </string>
+ <string name="ATTACH_LEAR">
+ Orelha esquerda
+ </string>
+ <string name="ATTACH_REAR">
+ Orelha direita
+ </string>
+ <string name="ATTACH_LEYE">
+ Olho esquerdo
+ </string>
+ <string name="ATTACH_REYE">
+ Olho direito
+ </string>
+ <string name="ATTACH_NOSE">
+ Nariz
+ </string>
+ <string name="ATTACH_RUARM">
+ Braço direito
+ </string>
+ <string name="ATTACH_RLARM">
+ Antebraço direito
+ </string>
+ <string name="ATTACH_LUARM">
+ Braço esquerdo
+ </string>
+ <string name="ATTACH_LLARM">
+ Antebraço esquerdo
+ </string>
+ <string name="ATTACH_RHIP">
+ Quadril direito
+ </string>
+ <string name="ATTACH_RULEG">
+ Coxa direita
+ </string>
+ <string name="ATTACH_RLLEG">
+ Perna direita
+ </string>
+ <string name="ATTACH_LHIP">
+ Quadril esquerdo
+ </string>
+ <string name="ATTACH_LULEG">
+ Coxa esquerda
+ </string>
+ <string name="ATTACH_LLLEG">
+ Perna esquerda
+ </string>
+ <string name="ATTACH_BELLY">
+ Barriga
+ </string>
+ <string name="ATTACH_RPEC">
+ Peitorais D
+ </string>
+ <string name="ATTACH_LPEC">
+ Peitorais E
+ </string>
+ <string name="ATTACH_HUD_CENTER_2">
+ HUD Central 2
+ </string>
+ <string name="ATTACH_HUD_TOP_RIGHT">
+ HUD superior direito
+ </string>
+ <string name="ATTACH_HUD_TOP_CENTER">
+ HUD centro superior
+ </string>
+ <string name="ATTACH_HUD_TOP_LEFT">
+ HUD superior esquerdo
+ </string>
+ <string name="ATTACH_HUD_CENTER_1">
+ HUD Central 1
+ </string>
+ <string name="ATTACH_HUD_BOTTOM_LEFT">
+ HUD esquerda inferior
+ </string>
+ <string name="ATTACH_HUD_BOTTOM">
+ HUD inferior
+ </string>
+ <string name="ATTACH_HUD_BOTTOM_RIGHT">
+ HUD direito inferior
+ </string>
+ <string name="CursorPos">
+ Linha [LINE], Coluna [COLUMN]
+ </string>
+ <string name="PanelDirCountFound">
+ [COUNT] encontrado
+ </string>
+ <string name="PanelContentsTooltip">
+ Conteúdo do objeto
+ </string>
+ <string name="PanelContentsNewScript">
+ Novo Script
+ </string>
+ <string name="BusyModeResponseDefault">
+ O residente para o qual escreveu está no modo &apos;ocupado&apos;, ou seja, ele prefere não receber nada no momento. Sua mensagem será exibida como uma MI mais tarde.
+ </string>
+ <string name="MuteByName">
+ (por nome)
+ </string>
+ <string name="MuteAgent">
+ (residente)
+ </string>
+ <string name="MuteObject">
+ (objeto)
+ </string>
+ <string name="MuteGroup">
+ (grupo)
+ </string>
+ <string name="MuteExternal">
+ (Externo)
+ </string>
+ <string name="RegionNoCovenant">
+ Não foi definido um contrato para essa região.
+ </string>
+ <string name="RegionNoCovenantOtherOwner">
+ Não foi definido um contrato para essa Região. O terreno nesta região está sendo vendido pelo Proprietário, não pela Linden Lab. Favor contatar o Proprietário da região para detalhes de venda.
+ </string>
+ <string name="covenant_last_modified" value="Última modificação: "/>
+ <string name="none_text" value="(nenhum)"/>
+ <string name="never_text" value="(nunca)"/>
+ <string name="GroupOwned">
+ Propriedade do Grupo
+ </string>
+ <string name="Public">
+ Público
+ </string>
+ <string name="LocalSettings">
+ Configurações locais
+ </string>
+ <string name="RegionSettings">
+ Configurações da região
+ </string>
+ <string name="ClassifiedClicksTxt">
+ Cliques: [TELEPORT] teletransporte, [MAP] mapa, [PROFILE] perfil
+ </string>
+ <string name="ClassifiedUpdateAfterPublish">
+ (vai atualizar depois de publicado)
+ </string>
+ <string name="NoPicksClassifiedsText">
+ Você não criou nenhum Destaque ou Anúncio. Clique no botão &quot;+&quot; para criar um Destaque ou Anúncio.
+ </string>
+ <string name="NoAvatarPicksClassifiedsText">
+ O usuário não tem nenhum destaque ou anúncio
+ </string>
+ <string name="PicksClassifiedsLoadingText">
+ Carregando...
+ </string>
+ <string name="MultiPreviewTitle">
+ Preview
+ </string>
+ <string name="MultiPropertiesTitle">
+ Propriedades
+ </string>
+ <string name="InvOfferAnObjectNamed">
+ um objeto chamado
+ </string>
+ <string name="InvOfferOwnedByGroup">
+ possuído pelo grupo
+ </string>
+ <string name="InvOfferOwnedByUnknownGroup">
+ de um grupo desconhecido
+ </string>
+ <string name="InvOfferOwnedBy">
+ de
+ </string>
+ <string name="InvOfferOwnedByUnknownUser">
+ de usuário desconhecido
+ </string>
+ <string name="InvOfferGaveYou">
+ deu a você
+ </string>
+ <string name="InvOfferDecline">
+ Você recusou um(a) [DESC] de &lt;nolink&gt;[NAME]&lt;/nolink&gt;.
+ </string>
+ <string name="GroupMoneyTotal">
+ Total
+ </string>
+ <string name="GroupMoneyBought">
+ comprou
+ </string>
+ <string name="GroupMoneyPaidYou">
+ pagou a você
+ </string>
+ <string name="GroupMoneyPaidInto">
+ depositado
+ </string>
+ <string name="GroupMoneyBoughtPassTo">
+ comprou passe para
+ </string>
+ <string name="GroupMoneyPaidFeeForEvent">
+ pagou taxa para o evento
+ </string>
+ <string name="GroupMoneyPaidPrizeForEvent">
+ pagou prêmio para o evento
+ </string>
+ <string name="GroupMoneyBalance">
+ Saldo
+ </string>
+ <string name="GroupMoneyCredits">
+ Créditos
+ </string>
+ <string name="GroupMoneyDebits">
+ Débitos
+ </string>
+ <string name="GroupMoneyDate">
+ [weekday,datetime,utc] [mth,datetime,utc] [day,datetime,utc], [year,datetime,utc]
+ </string>
+ <string name="ViewerObjectContents">
+ Conteúdo
+ </string>
+ <string name="AcquiredItems">
+ Itens adquiridos
+ </string>
+ <string name="Cancel">
+ Cancelar
+ </string>
+ <string name="UploadingCosts">
+ Carregar [NAME] custa L$ [AMOUNT]
+ </string>
+ <string name="BuyingCosts">
+ Isso custa L$ [AMOUNT]
+ </string>
+ <string name="UnknownFileExtension">
+ Extensão de arquivo desconhecida [.%s]
+Expected .wav, .tga, .bmp, .jpg, .jpeg, or .bvh
+ </string>
+ <string name="MuteObject2">
+ Bloquear
+ </string>
+ <string name="AddLandmarkNavBarMenu">
+ Adicionar marco...
+ </string>
+ <string name="EditLandmarkNavBarMenu">
+ Editar marco...
+ </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">
+ Arquivo salvo
+ </string>
+ <string name="Receiving">
+ Recebendo
+ </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">
+ Frente
+ </string>
+ <string name="Direction_Left">
+ Esquerda
+ </string>
+ <string name="Direction_Right">
+ Direita
+ </string>
+ <string name="Direction_Back">
+ Atrás
+ </string>
+ <string name="Direction_North">
+ Norte
+ </string>
+ <string name="Direction_South">
+ Sul
+ </string>
+ <string name="Direction_West">
+ Oeste
+ </string>
+ <string name="Direction_East">
+ Leste
+ </string>
+ <string name="Direction_Up">
+ P/ cima
+ </string>
+ <string name="Direction_Down">
+ P/ baixo
+ </string>
+ <string name="Any Category">
+ Qualquer categoria
+ </string>
+ <string name="Shopping">
+ Compras
+ </string>
+ <string name="Land Rental">
+ Aluguel de terrenos
+ </string>
+ <string name="Property Rental">
+ Aluguel de propriedade
+ </string>
+ <string name="Special Attraction">
+ Atração especial
+ </string>
+ <string name="New Products">
+ Novos Produtos
+ </string>
+ <string name="Employment">
+ Emprego
+ </string>
+ <string name="Wanted">
+ Desejado
+ </string>
+ <string name="Service">
+ Serviço
+ </string>
+ <string name="Personal">
+ Pessoal
+ </string>
+ <string name="None">
+ Nenhum
+ </string>
+ <string name="Linden Location">
+ Locação Linden
+ </string>
+ <string name="Adult">
+ Adulto
+ </string>
+ <string name="Arts&amp;Culture">
+ Artes e Cultura
+ </string>
+ <string name="Business">
+ Negócios
+ </string>
+ <string name="Educational">
+ Educacional
+ </string>
+ <string name="Gaming">
+ Games
+ </string>
+ <string name="Hangout">
+ Moradia
+ </string>
+ <string name="Newcomer Friendly">
+ Para recém-chegados
+ </string>
+ <string name="Parks&amp;Nature">
+ Parques &amp; Natureza
+ </string>
+ <string name="Residential">
+ Residencial
+ </string>
+ <string name="Stage">
+ Estágio
+ </string>
+ <string name="Other">
+ Outros
+ </string>
+ <string name="Rental">
+ Aluguel
+ </string>
+ <string name="Any">
+ Qualquer
+ </string>
+ <string name="You">
+ Você
+ </string>
+ <string name="Multiple Media">
+ Mídia múltipla
+ </string>
+ <string name="Play Media">
+ Tocar/Pausar mídia
+ </string>
+ <string name="MBCmdLineError">
+ Um erro foi encontrado analisando a linha de comando.
+Consulte: http://wiki.secondlife.com/wiki/Client_parameters
+Erro:
+ </string>
+ <string name="MBCmdLineUsg">
+ [APP_NAME] Uso de linha de comando:
+ </string>
+ <string name="MBUnableToAccessFile">
+ [APP_NAME] não é capaz de acessar um arquivo que ele precisa.
+
+Isto pode ocorrer porque você de alguma maneira tem várias cópias em execução, ou o seu sistema acredita de maneira incorreta que um arquivo está aberto.
+Se a mensagem persistir, reinicie o computador e tente novamente.
+Se o error persistir, pode ser necessário desinstalar completamente [APP_NAME] e reinstalá-lo.
+ </string>
+ <string name="MBFatalError">
+ Erro fatal
+ </string>
+ <string name="MBRequiresAltiVec">
+ [APP_NAME] exige processador com AltiVec (G4 ou superior).
+ </string>
+ <string name="MBAlreadyRunning">
+ [APP_NAME] já está em execução.
+Verifique a sua barra de tarefas para obter uma cópia do programa minimizado.
+Se a mensagem persistir, reinicie o computador.
+ </string>
+ <string name="MBFrozenCrashed">
+ [APP_NAME] parece ter congelado ou falhado na execução anterior. Enviar relatório de falha?
+ </string>
+ <string name="MBAlert">
+ Alerta
+ </string>
+ <string name="MBNoDirectX">
+ [APP_NAME] é incapaz de detectar o DirectX 9.0b ou superior.
+[APP_NAME] usa o DirectX para a detecção de hardware e / ou controladores desatualizados que podem causar problemas de estabilidade, desempenho ruim e falhas. Embora você possa executar [APP_NAME] sem ele, nós recomendamos fortemente que utilize o DirectX 9.0b.
+
+Deseja continuar?
+ </string>
+ <string name="MBWarning">
+ Aviso
+ </string>
+ <string name="MBNoAutoUpdate">
+ Atualização automática ainda não está implementada para o Linux.
+Faça o download da versão mais recente do www.secondlife.com.
+ </string>
+ <string name="MBRegClassFailed">
+ RegisterClass falhou
+ </string>
+ <string name="MBError">
+ Erro
+ </string>
+ <string name="MBFullScreenErr">
+ Incapaz de funcionar com tela cheia de [WIDTH] x [HEIGHT].
+Executando em janela.
+ </string>
+ <string name="MBDestroyWinFailed">
+ Erro de desligamento ao destruir janela (DestroyWindow() failed)
+ </string>
+ <string name="MBShutdownErr">
+ Erro de desligamento
+ </string>
+ <string name="MBDevContextErr">
+ Não é possível fazer contexto do dispositivo GL
+ </string>
+ <string name="MBPixelFmtErr">
+ Não é possível encontrar um formato de pixel adequado
+ </string>
+ <string name="MBPixelFmtDescErr">
+ Não é possível encontrar descrição de formato de pixel
+ </string>
+ <string name="MBTrueColorWindow">
+ [APP_NAME] requer True Color (32-bit) para ser executado.
+Por favor, vá para as configurações de vídeo do computador e defina o modo de cores para 32-bit.
+ </string>
+ <string name="MBAlpha">
+ [APP_NAME] é incapaz de executar porque ele não consegue obter um canal alpha de 8 bits. Geralmente isso ocorre devido a problemas de drivers da placa de vídeo.
+Por favor, certifique-se que os últimos drivers da placa de vídeo estão instalados.
+Também não se esqueça de definir seu monitor para True Color (32-bit), em painéis de controle Configurações&gt; Display&gt;.
+Se você continuar a receber esta mensagem, contate o [SUPPORT_SITE].
+ </string>
+ <string name="MBPixelFmtSetErr">
+ Não é possível definir o formato de pixel
+ </string>
+ <string name="MBGLContextErr">
+ Não é possível criar o contexto de renderização GL
+ </string>
+ <string name="MBGLContextActErr">
+ Não é possível ativar o contexto de renderização GL
+ </string>
+ <string name="MBVideoDrvErr">
+ [APP_NAME] é incapaz de funcionar por causa do seu driver de video não ter sido instalado corretamente, estão desatualizados, ou não são suportados pelo hardware. Por favor certifique-se que você possui os drivers de placa de vídeo mais recente e mesmo assim, tente reinstalá-los.
+
+If you continue to receive this message, contact the [SUPPORT_SITE].
+ </string>
+ <string name="5 O&apos;Clock Shadow">
+ Barba por fazer
+ </string>
+ <string name="All White">
+ Todo branco
+ </string>
+ <string name="Anime Eyes">
+ Olhos de Anime
+ </string>
+ <string name="Arced">
+ Arqueados
+ </string>
+ <string name="Arm Length">
+ Comprimento do braço
+ </string>
+ <string name="Attached">
+ Anexado
+ </string>
+ <string name="Attached Earlobes">
+ Lóbulos da orelha anexados
+ </string>
+ <string name="Back Fringe">
+ corte traseiro
+ </string>
+ <string name="Baggy">
+ folgado
+ </string>
+ <string name="Bangs">
+ Franja
+ </string>
+ <string name="Beady Eyes">
+ Olhos pequenos
+ </string>
+ <string name="Belly Size">
+ Tamanho da barriga
+ </string>
+ <string name="Big">
+ Grande
+ </string>
+ <string name="Big Butt">
+ Bunda grande
+ </string>
+ <string name="Big Hair Back">
+ Cabelo volumoso: Trás
+ </string>
+ <string name="Big Hair Front">
+ Cabelo volumoso: Frente
+ </string>
+ <string name="Big Hair Top">
+ Cabelo volumoso: Topo
+ </string>
+ <string name="Big Head">
+ cabeça grande
+ </string>
+ <string name="Big Pectorals">
+ Peitorais grandes
+ </string>
+ <string name="Big Spikes">
+ Pontas grandes
+ </string>
+ <string name="Black">
+ Negro
+ </string>
+ <string name="Blonde">
+ Loiro
+ </string>
+ <string name="Blonde Hair">
+ Cabelo loiro
+ </string>
+ <string name="Blush">
+ Blush
+ </string>
+ <string name="Blush Color">
+ Cor do blush
+ </string>
+ <string name="Blush Opacity">
+ Opacidade do blush
+ </string>
+ <string name="Body Definition">
+ Definição do corpo
+ </string>
+ <string name="Body Fat">
+ Gordura
+ </string>
+ <string name="Body Freckles">
+ Sardas
+ </string>
+ <string name="Body Thick">
+ Corpo cheio
+ </string>
+ <string name="Body Thickness">
+ Ossatura
+ </string>
+ <string name="Body Thin">
+ Corpo magro
+ </string>
+ <string name="Bow Legged">
+ Pernas arqueadas
+ </string>
+ <string name="Breast Buoyancy">
+ Caimento dos seios
+ </string>
+ <string name="Breast Cleavage">
+ Separação dos seios
+ </string>
+ <string name="Breast Size">
+ Tamanho dos seios
+ </string>
+ <string name="Bridge Width">
+ Largura do nariz
+ </string>
+ <string name="Broad">
+ Largo
+ </string>
+ <string name="Brow Size">
+ Tamanho da sobrancelha
+ </string>
+ <string name="Bug Eyes">
+ Olhos saltados
+ </string>
+ <string name="Bugged Eyes">
+ Olhos esbugalhados
+ </string>
+ <string name="Bulbous">
+ Bulbos
+ </string>
+ <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>
+ <string name="Bushy Hair">
+ Cabelo grosso
+ </string>
+ <string name="Butt Size">
+ Tamanho do traseiro
+ </string>
+ <string name="Butt Gravity">
+ Nádegas - gravidade
+ </string>
+ <string name="bustle skirt">
+ Saia armada
+ </string>
+ <string name="no bustle">
+ Saia reta
+ </string>
+ <string name="more bustle">
+ Mais
+ </string>
+ <string name="Chaplin">
+ Chaplin
+ </string>
+ <string name="Cheek Bones">
+ Maçãs do rosto
+ </string>
+ <string name="Chest Size">
+ Tamanho do peito
+ </string>
+ <string name="Chin Angle">
+ Ângulo do queixo
+ </string>
+ <string name="Chin Cleft">
+ Fissura do queixo
+ </string>
+ <string name="Chin Curtains">
+ Barba de contorno
+ </string>
+ <string name="Chin Depth">
+ Profundidade do queixo
+ </string>
+ <string name="Chin Heavy">
+ Queixo pronunciado
+ </string>
+ <string name="Chin In">
+ Queixo para dentro
+ </string>
+ <string name="Chin Out">
+ Queixo para fora
+ </string>
+ <string name="Chin-Neck">
+ Queixo-pescoço
+ </string>
+ <string name="Clear">
+ Limpar
+ </string>
+ <string name="Cleft">
+ Fenda
+ </string>
+ <string name="Close Set Eyes">
+ Fechar conjunto de olhos
+ </string>
+ <string name="Closed">
+ Fechado
+ </string>
+ <string name="Closed Back">
+ Trás fechada
+ </string>
+ <string name="Closed Front">
+ Frente fechada
+ </string>
+ <string name="Closed Left">
+ Esquerda fechada
+ </string>
+ <string name="Closed Right">
+ Direita fechada
+ </string>
+ <string name="Coin Purse">
+ Pouco volume
+ </string>
+ <string name="Collar Back">
+ Colarinho posterior
+ </string>
+ <string name="Collar Front">
+ Colarinho anterior
+ </string>
+ <string name="Corner Down">
+ Canto para baixo
+ </string>
+ <string name="Corner Up">
+ Canto para cima
+ </string>
+ <string name="Creased">
+ Vincado
+ </string>
+ <string name="Crooked Nose">
+ Nariz torto
+ </string>
+ <string name="Cuff Flare">
+ Bainha larga
+ </string>
+ <string name="Dark">
+ Escuro
+ </string>
+ <string name="Dark Green">
+ Verde escuro
+ </string>
+ <string name="Darker">
+ Mais escuro
+ </string>
+ <string name="Deep">
+ Profundidade
+ </string>
+ <string name="Default Heels">
+ Salto padrão
+ </string>
+ <string name="Dense">
+ Densidade
+ </string>
+ <string name="Double Chin">
+ Queixo duplo
+ </string>
+ <string name="Downturned">
+ Curvado para baixo
+ </string>
+ <string name="Duffle Bag">
+ Mais volume
+ </string>
+ <string name="Ear Angle">
+ Ângulo da orelha
+ </string>
+ <string name="Ear Size">
+ Tamanho da orelha
+ </string>
+ <string name="Ear Tips">
+ Pontas das orelhas
+ </string>
+ <string name="Egg Head">
+ Cabeça oval
+ </string>
+ <string name="Eye Bags">
+ Olheiras
+ </string>
+ <string name="Eye Color">
+ Cor dos olhos
+ </string>
+ <string name="Eye Depth">
+ Profundidade dos olhos
+ </string>
+ <string name="Eye Lightness">
+ Luminosidade dos olhos
+ </string>
+ <string name="Eye Opening">
+ Abertura dos olhos
+ </string>
+ <string name="Eye Pop">
+ Olho saltado
+ </string>
+ <string name="Eye Size">
+ Tamanho dos olhos
+ </string>
+ <string name="Eye Spacing">
+ Espaçamento dos olhos
+ </string>
+ <string name="Eyebrow Arc">
+ Arco da sobrancelha
+ </string>
+ <string name="Eyebrow Density">
+ Densidade da sobrancelha
+ </string>
+ <string name="Eyebrow Height">
+ Altura da sobrancelha
+ </string>
+ <string name="Eyebrow Points">
+ Pontas da sobrancelha
+ </string>
+ <string name="Eyebrow Size">
+ Tamanho da sobrancelha
+ </string>
+ <string name="Eyelash Length">
+ Comprimento das pestanas
+ </string>
+ <string name="Eyeliner">
+ Delineador
+ </string>
+ <string name="Eyeliner Color">
+ Cor do delineador
+ </string>
+ <string name="Eyes Bugged">
+ Olhos esbugalhados
+ </string>
+ <string name="Face Shear">
+ Face raspada
+ </string>
+ <string name="Facial Definition">
+ Definição facial
+ </string>
+ <string name="Far Set Eyes">
+ Distância entre os olhos
+ </string>
+ <string name="Fat Lips">
+ Lábios carnudos
+ </string>
+ <string name="Female">
+ Feminino
+ </string>
+ <string name="Fingerless">
+ Dedos
+ </string>
+ <string name="Fingers">
+ Dedos
+ </string>
+ <string name="Flared Cuffs">
+ Punhos largos
+ </string>
+ <string name="Flat">
+ Chato
+ </string>
+ <string name="Flat Butt">
+ Traseiro chato
+ </string>
+ <string name="Flat Head">
+ Cabeça chata
+ </string>
+ <string name="Flat Toe">
+ Dedos dos pés chatos
+ </string>
+ <string name="Foot Size">
+ Tamanho dos pés
+ </string>
+ <string name="Forehead Angle">
+ Ângulo da testa
+ </string>
+ <string name="Forehead Heavy">
+ Testa pronunciada
+ </string>
+ <string name="Freckles">
+ Sardas
+ </string>
+ <string name="Front Fringe">
+ Franja
+ </string>
+ <string name="Full Back">
+ Trás cheia
+ </string>
+ <string name="Full Eyeliner">
+ Delienador cheio
+ </string>
+ <string name="Full Front">
+ Frente cheia
+ </string>
+ <string name="Full Hair Sides">
+ Cabelos laterais cheios
+ </string>
+ <string name="Full Sides">
+ Lados cheios
+ </string>
+ <string name="Glossy">
+ Brilhante
+ </string>
+ <string name="Glove Fingers">
+ Dedos da luva
+ </string>
+ <string name="Glove Length">
+ Comprimento das luvas
+ </string>
+ <string name="Hair">
+ Cabelo
+ </string>
+ <string name="Hair Back">
+ Cabelo: Trás
+ </string>
+ <string name="Hair Front">
+ Cabelo: Frente
+ </string>
+ <string name="Hair Sides">
+ Cabelos: Lateral
+ </string>
+ <string name="Hair Sweep">
+ Cabelo penteado
+ </string>
+ <string name="Hair Thickess">
+ Espessura do cabelo
+ </string>
+ <string name="Hair Thickness">
+ Espessura do cabelo
+ </string>
+ <string name="Hair Tilt">
+ Divisão do cabelo
+ </string>
+ <string name="Hair Tilted Left">
+ Divistão do cabelo esquerda
+ </string>
+ <string name="Hair Tilted Right">
+ Divisão do cabelo direita
+ </string>
+ <string name="Hair Volume">
+ Cabelo: Volume
+ </string>
+ <string name="Hand Size">
+ Tamanho das mãos
+ </string>
+ <string name="Handlebars">
+ Bigode
+ </string>
+ <string name="Head Length">
+ Comprimento da cabeça
+ </string>
+ <string name="Head Shape">
+ Formato da cabeça
+ </string>
+ <string name="Head Size">
+ Tamanho da cabeça
+ </string>
+ <string name="Head Stretch">
+ Extensão da cabeça
+ </string>
+ <string name="Heel Height">
+ Altura do salto
+ </string>
+ <string name="Heel Shape">
+ Formato do salto
+ </string>
+ <string name="Height">
+ Altura
+ </string>
+ <string name="High">
+ Alto
+ </string>
+ <string name="High Heels">
+ Salto alto
+ </string>
+ <string name="High Jaw">
+ Maxilar alto
+ </string>
+ <string name="High Platforms">
+ Plataformas altas
+ </string>
+ <string name="High and Tight">
+ Alto e justo
+ </string>
+ <string name="Higher">
+ Mais alto
+ </string>
+ <string name="Hip Length">
+ Comprimento do quadril
+ </string>
+ <string name="Hip Width">
+ Largura do quadril
+ </string>
+ <string name="In">
+ Dentro
+ </string>
+ <string name="In Shdw Color">
+ Cor da sombra interna
+ </string>
+ <string name="In Shdw Opacity">
+ Opacidade da sombra interna
+ </string>
+ <string name="Inner Eye Corner">
+ Canto interno dos olhos
+ </string>
+ <string name="Inner Eye Shadow">
+ Sombra interna dos olhos
+ </string>
+ <string name="Inner Shadow">
+ Sombra interna
+ </string>
+ <string name="Jacket Length">
+ Comprimento da blusa
+ </string>
+ <string name="Jacket Wrinkles">
+ Dobras da jaqueta
+ </string>
+ <string name="Jaw Angle">
+ Ângulo da mandíbula
+ </string>
+ <string name="Jaw Jut">
+ Posição do maxilar
+ </string>
+ <string name="Jaw Shape">
+ Formato do maxilar
+ </string>
+ <string name="Join">
+ Juntar
+ </string>
+ <string name="Jowls">
+ Papo
+ </string>
+ <string name="Knee Angle">
+ Ângulo do joelho
+ </string>
+ <string name="Knock Kneed">
+ Joelhos para dentro
+ </string>
+ <string name="Large">
+ Grande
+ </string>
+ <string name="Large Hands">
+ Mãos grandes
+ </string>
+ <string name="Left Part">
+ Parte esquerda
+ </string>
+ <string name="Leg Length">
+ Comprimento da perna
+ </string>
+ <string name="Leg Muscles">
+ Musculatura da perna
+ </string>
+ <string name="Less">
+ Menos
+ </string>
+ <string name="Less Body Fat">
+ Menos gordura
+ </string>
+ <string name="Less Curtains">
+ Menos barba
+ </string>
+ <string name="Less Freckles">
+ Menos sardas
+ </string>
+ <string name="Less Full">
+ Menos
+ </string>
+ <string name="Less Gravity">
+ Menos gravidade
+ </string>
+ <string name="Less Love">
+ Menos excesso
+ </string>
+ <string name="Less Muscles">
+ Menos músculos
+ </string>
+ <string name="Less Muscular">
+ Menos musculoso
+ </string>
+ <string name="Less Rosy">
+ Menos rosado
+ </string>
+ <string name="Less Round">
+ Menos arredondado
+ </string>
+ <string name="Less Saddle">
+ Menos ancas
+ </string>
+ <string name="Less Square">
+ Menos quadrado
+ </string>
+ <string name="Less Volume">
+ Menos volume
+ </string>
+ <string name="Less soul">
+ Menos alma
+ </string>
+ <string name="Lighter">
+ Lighter
+ </string>
+ <string name="Lip Cleft">
+ Fenda dos lábios
+ </string>
+ <string name="Lip Cleft Depth">
+ Profundidade da fenda dos lábios
+ </string>
+ <string name="Lip Fullness">
+ Volume dos lábios
+ </string>
+ <string name="Lip Pinkness">
+ Rosado dos lábios
+ </string>
+ <string name="Lip Ratio">
+ Proporção dos lábios
+ </string>
+ <string name="Lip Thickness">
+ Espessura dos lábios
+ </string>
+ <string name="Lip Width">
+ Largura dos lábios
+ </string>
+ <string name="Lipgloss">
+ Brilho dos lábios
+ </string>
+ <string name="Lipstick">
+ Batom
+ </string>
+ <string name="Lipstick Color">
+ Cor do batom
+ </string>
+ <string name="Long">
+ Longo
+ </string>
+ <string name="Long Head">
+ Cabeça alongada
+ </string>
+ <string name="Long Hips">
+ Lábios longos
+ </string>
+ <string name="Long Legs">
+ Pernas longas
+ </string>
+ <string name="Long Neck">
+ Pescoço longo
+ </string>
+ <string name="Long Pigtails">
+ Chiquinhas longas
+ </string>
+ <string name="Long Ponytail">
+ Rabo de cavalo longo
+ </string>
+ <string name="Long Torso">
+ Torso longo
+ </string>
+ <string name="Long arms">
+ Braços longos
+ </string>
+ <string name="Loose Pants">
+ Pantalonas
+ </string>
+ <string name="Loose Shirt">
+ Camisa folgada
+ </string>
+ <string name="Loose Sleeves">
+ Mangas folgadas
+ </string>
+ <string name="Love Handles">
+ Pneu
+ </string>
+ <string name="Low">
+ Baixo
+ </string>
+ <string name="Low Heels">
+ Salto baixo
+ </string>
+ <string name="Low Jaw">
+ Maxilar baixo
+ </string>
+ <string name="Low Platforms">
+ Plataformas baixas
+ </string>
+ <string name="Low and Loose">
+ Baixo e solto
+ </string>
+ <string name="Lower">
+ Mais baixo
+ </string>
+ <string name="Lower Bridge">
+ Mais baixa
+ </string>
+ <string name="Lower Cheeks">
+ Bochechas abaixadas
+ </string>
+ <string name="Male">
+ Masculino
+ </string>
+ <string name="Middle Part">
+ Parte do meio
+ </string>
+ <string name="More">
+ Mais
+ </string>
+ <string name="More Blush">
+ Mais blush
+ </string>
+ <string name="More Body Fat">
+ Mais gordura
+ </string>
+ <string name="More Curtains">
+ Mais barba
+ </string>
+ <string name="More Eyeshadow">
+ Mais sombra dos olhos
+ </string>
+ <string name="More Freckles">
+ Mais sardas
+ </string>
+ <string name="More Full">
+ Mais volume
+ </string>
+ <string name="More Gravity">
+ Mais gravidade
+ </string>
+ <string name="More Lipstick">
+ Mais batom
+ </string>
+ <string name="More Love">
+ Mais cintura
+ </string>
+ <string name="More Lower Lip">
+ Mais lábio inferior
+ </string>
+ <string name="More Muscles">
+ Mais músculos
+ </string>
+ <string name="More Muscular">
+ Mais musculoso
+ </string>
+ <string name="More Rosy">
+ Mais rosado
+ </string>
+ <string name="More Round">
+ Mais arredondado
+ </string>
+ <string name="More Saddle">
+ Mais ancas
+ </string>
+ <string name="More Sloped">
+ Mais inclinado
+ </string>
+ <string name="More Square">
+ Mais quadrado
+ </string>
+ <string name="More Upper Lip">
+ Mais lábios superiores
+ </string>
+ <string name="More Vertical">
+ Mais vertical
+ </string>
+ <string name="More Volume">
+ Mais volume
+ </string>
+ <string name="More soul">
+ Mais alma
+ </string>
+ <string name="Moustache">
+ Bigode
+ </string>
+ <string name="Mouth Corner">
+ Canto da boca
+ </string>
+ <string name="Mouth Position">
+ Posição da boca
+ </string>
+ <string name="Mowhawk">
+ Moicano
+ </string>
+ <string name="Muscular">
+ Muscular
+ </string>
+ <string name="Mutton Chops">
+ Costeletas
+ </string>
+ <string name="Nail Polish">
+ Esmate das unhas
+ </string>
+ <string name="Nail Polish Color">
+ Cor do esmalte das unhas
+ </string>
+ <string name="Narrow">
+ Estreito
+ </string>
+ <string name="Narrow Back">
+ Costas estreitas
+ </string>
+ <string name="Narrow Front">
+ Frente estreita
+ </string>
+ <string name="Narrow Lips">
+ Lábios estreitos
+ </string>
+ <string name="Natural">
+ Natural
+ </string>
+ <string name="Neck Length">
+ Comprimento do pescoço
+ </string>
+ <string name="Neck Thickness">
+ Espessura do pescoço
+ </string>
+ <string name="No Blush">
+ Sem blush
+ </string>
+ <string name="No Eyeliner">
+ Sem delineador
+ </string>
+ <string name="No Eyeshadow">
+ Sem sombra
+ </string>
+ <string name="No Lipgloss">
+ Sem brilho
+ </string>
+ <string name="No Lipstick">
+ Sem batom
+ </string>
+ <string name="No Part">
+ Sem parte
+ </string>
+ <string name="No Polish">
+ Sem esmalte
+ </string>
+ <string name="No Red">
+ Sem vermelho
+ </string>
+ <string name="No Spikes">
+ Sem pontas
+ </string>
+ <string name="No White">
+ Sem branco
+ </string>
+ <string name="No Wrinkles">
+ Sem dobras
+ </string>
+ <string name="Normal Lower">
+ Normal inferior
+ </string>
+ <string name="Normal Upper">
+ Normal superior
+ </string>
+ <string name="Nose Left">
+ Nariz para esquerda
+ </string>
+ <string name="Nose Right">
+ Nariz para direita
+ </string>
+ <string name="Nose Size">
+ Tamanho do nariz
+ </string>
+ <string name="Nose Thickness">
+ Espessura do nariz
+ </string>
+ <string name="Nose Tip Angle">
+ Ângulo da ponta do nariz
+ </string>
+ <string name="Nose Tip Shape">
+ Formato da ponta do nariz
+ </string>
+ <string name="Nose Width">
+ Largura do nariz
+ </string>
+ <string name="Nostril Division">
+ Divisão das narinas
+ </string>
+ <string name="Nostril Width">
+ Largura das narinas
+ </string>
+ <string name="Opaque">
+ Opaco
+ </string>
+ <string name="Open">
+ Abrir
+ </string>
+ <string name="Open Back">
+ Aberto atrás
+ </string>
+ <string name="Open Front">
+ Aberto na frente
+ </string>
+ <string name="Open Left">
+ Aberto esquerdo
+ </string>
+ <string name="Open Right">
+ Aberto direito
+ </string>
+ <string name="Orange">
+ Laranja
+ </string>
+ <string name="Out">
+ Fora
+ </string>
+ <string name="Out Shdw Color">
+ Cor da sombra externa
+ </string>
+ <string name="Out Shdw Opacity">
+ Opacidade da sombra externa
+ </string>
+ <string name="Outer Eye Corner">
+ Canto externo do olho
+ </string>
+ <string name="Outer Eye Shadow">
+ Sombra externa do olho
+ </string>
+ <string name="Outer Shadow">
+ Sombra externa
+ </string>
+ <string name="Overbite">
+ Má oclusão
+ </string>
+ <string name="Package">
+ Púbis
+ </string>
+ <string name="Painted Nails">
+ Unhas pintadas
+ </string>
+ <string name="Pale">
+ Pálido
+ </string>
+ <string name="Pants Crotch">
+ Cavalo da calça
+ </string>
+ <string name="Pants Fit">
+ Caimento das calças
+ </string>
+ <string name="Pants Length">
+ Comprimento das calças
+ </string>
+ <string name="Pants Waist">
+ Cintura da calça
+ </string>
+ <string name="Pants Wrinkles">
+ Dobras das calças
+ </string>
+ <string name="Part">
+ Parte
+ </string>
+ <string name="Part Bangs">
+ Divisão da franja
+ </string>
+ <string name="Pectorals">
+ Peitorais
+ </string>
+ <string name="Pigment">
+ Pigmento
+ </string>
+ <string name="Pigtails">
+ Chiquinhas
+ </string>
+ <string name="Pink">
+ Rosa
+ </string>
+ <string name="Pinker">
+ Mais rosado
+ </string>
+ <string name="Platform Height">
+ Altura da plataforma
+ </string>
+ <string name="Platform Width">
+ Largura da plataforma
+ </string>
+ <string name="Pointy">
+ Pontudo
+ </string>
+ <string name="Pointy Heels">
+ Salto agulha
+ </string>
+ <string name="Ponytail">
+ Rabo de cavalo
+ </string>
+ <string name="Poofy Skirt">
+ Saia bufante
+ </string>
+ <string name="Pop Left Eye">
+ Olho saltado esquerdo
+ </string>
+ <string name="Pop Right Eye">
+ Olho saltado direito
+ </string>
+ <string name="Puffy">
+ Inchado
+ </string>
+ <string name="Puffy Eyelids">
+ Pálpebras inchadas
+ </string>
+ <string name="Rainbow Color">
+ Cor do arco íris
+ </string>
+ <string name="Red Hair">
+ Cabelo ruivo
+ </string>
+ <string name="Regular">
+ Normal
+ </string>
+ <string name="Right Part">
+ Parte direita
+ </string>
+ <string name="Rosy Complexion">
+ Rosado da face
+ </string>
+ <string name="Round">
+ Arredondado
+ </string>
+ <string name="Ruddiness">
+ Rubor
+ </string>
+ <string name="Ruddy">
+ Corado
+ </string>
+ <string name="Rumpled Hair">
+ Cabelo desalinhado
+ </string>
+ <string name="Saddle Bags">
+ Culote
+ </string>
+ <string name="Scrawny Leg">
+ Pernas magricelas
+ </string>
+ <string name="Separate">
+ Separar
+ </string>
+ <string name="Shallow">
+ Raso
+ </string>
+ <string name="Shear Back">
+ Trás rente
+ </string>
+ <string name="Shear Face">
+ Face raspada
+ </string>
+ <string name="Shear Front">
+ Frente rente
+ </string>
+ <string name="Shear Left Up">
+ Esquerda rente para cima
+ </string>
+ <string name="Shear Right Up">
+ Trás rente para cima
+ </string>
+ <string name="Sheared Back">
+ Rente atrás
+ </string>
+ <string name="Sheared Front">
+ Rente frente
+ </string>
+ <string name="Shift Left">
+ Deslocar p/ esquerda
+ </string>
+ <string name="Shift Mouth">
+ Deslocar boca
+ </string>
+ <string name="Shift Right">
+ Deslocar p/ direita
+ </string>
+ <string name="Shirt Bottom">
+ Barra da camisa
+ </string>
+ <string name="Shirt Fit">
+ Ajuste da camisa
+ </string>
+ <string name="Shirt Wrinkles">
+ +/- amassada
+ </string>
+ <string name="Shoe Height">
+ Altura do sapato
+ </string>
+ <string name="Short">
+ Curto
+ </string>
+ <string name="Short Arms">
+ Braços curtos
+ </string>
+ <string name="Short Legs">
+ Pernas curtas
+ </string>
+ <string name="Short Neck">
+ Pescoço curto
+ </string>
+ <string name="Short Pigtails">
+ Chiquinhas curtas
+ </string>
+ <string name="Short Ponytail">
+ Rabo de cavalo curto
+ </string>
+ <string name="Short Sideburns">
+ Costeletas curtas
+ </string>
+ <string name="Short Torso">
+ Tronco curto
+ </string>
+ <string name="Short hips">
+ Quadril curto
+ </string>
+ <string name="Shoulders">
+ Ombros
+ </string>
+ <string name="Side Fringe">
+ pontas laterais
+ </string>
+ <string name="Sideburns">
+ Costeletas
+ </string>
+ <string name="Sides Hair">
+ Cabelo lateral
+ </string>
+ <string name="Sides Hair Down">
+ Cabelo lateral long
+ </string>
+ <string name="Sides Hair Up">
+ Cabelo lateral superior
+ </string>
+ <string name="Skinny Neck">
+ Pescoço fino
+ </string>
+ <string name="Skirt Fit">
+ Ajuste de saia
+ </string>
+ <string name="Skirt Length">
+ Comprimento da saia
+ </string>
+ <string name="Slanted Forehead">
+ Testa inclinada
+ </string>
+ <string name="Sleeve Length">
+ Comprimento da manga
+ </string>
+ <string name="Sleeve Looseness">
+ Folga da manga
+ </string>
+ <string name="Slit Back">
+ Abertura : Atrás
+ </string>
+ <string name="Slit Front">
+ Abertura: Frente
+ </string>
+ <string name="Slit Left">
+ Abertura: Esquerda
+ </string>
+ <string name="Slit Right">
+ Abertura: Direita
+ </string>
+ <string name="Small">
+ Pequeno
+ </string>
+ <string name="Small Hands">
+ Mãos pequenas
+ </string>
+ <string name="Small Head">
+ Cabeça pequena
+ </string>
+ <string name="Smooth">
+ Suavizar
+ </string>
+ <string name="Smooth Hair">
+ Suavizar cabelo
+ </string>
+ <string name="Socks Length">
+ Comprimento das meias
+ </string>
+ <string name="Soulpatch">
+ Cavanhaque
+ </string>
+ <string name="Sparse">
+ Disperso
+ </string>
+ <string name="Spiked Hair">
+ Cabelo espetado
+ </string>
+ <string name="Square">
+ Quadrado
+ </string>
+ <string name="Square Toe">
+ Dedo quadrado
+ </string>
+ <string name="Squash Head">
+ Cabeça de Pera
+ </string>
+ <string name="Stretch Head">
+ Cabeça esticada
+ </string>
+ <string name="Sunken">
+ Afundar
+ </string>
+ <string name="Sunken Chest">
+ Peito afundado
+ </string>
+ <string name="Sunken Eyes">
+ Olhos afundados
+ </string>
+ <string name="Sweep Back">
+ Pentear para trás
+ </string>
+ <string name="Sweep Forward">
+ Pentear para frente
+ </string>
+ <string name="Tall">
+ Alto
+ </string>
+ <string name="Taper Back">
+ Afinar atrás
+ </string>
+ <string name="Taper Front">
+ Afinar a frente
+ </string>
+ <string name="Thick Heels">
+ Salto grosso
+ </string>
+ <string name="Thick Neck">
+ Pescoço grosso
+ </string>
+ <string name="Thick Toe">
+ Dedo grosso
+ </string>
+ <string name="Thin">
+ Fino
+ </string>
+ <string name="Thin Eyebrows">
+ Sobrancelhas finas
+ </string>
+ <string name="Thin Lips">
+ Lábios finos
+ </string>
+ <string name="Thin Nose">
+ Nariz fino
+ </string>
+ <string name="Tight Chin">
+ Queixo apertado
+ </string>
+ <string name="Tight Cuffs">
+ Punho justo
+ </string>
+ <string name="Tight Pants">
+ Calça justa
+ </string>
+ <string name="Tight Shirt">
+ Camisa justa
+ </string>
+ <string name="Tight Skirt">
+ Saia justa
+ </string>
+ <string name="Tight Sleeves">
+ Tight Sleeves
+ </string>
+ <string name="Toe Shape">
+ Formato dos dedos
+ </string>
+ <string name="Toe Thickness">
+ Espessura dos dos dedos
+ </string>
+ <string name="Torso Length">
+ Comprimento do tronco
+ </string>
+ <string name="Torso Muscles">
+ Músculos do tronco
+ </string>
+ <string name="Torso Scrawny">
+ Tronco magricela
+ </string>
+ <string name="Unattached">
+ Desanexado
+ </string>
+ <string name="Uncreased">
+ Uncreased
+ </string>
+ <string name="Underbite">
+ Underbite
+ </string>
+ <string name="Unnatural">
+ Não natural
+ </string>
+ <string name="Upper Bridge">
+ Parte alta do nariz
+ </string>
+ <string name="Upper Cheeks">
+ Bochechas altas
+ </string>
+ <string name="Upper Chin Cleft">
+ fenda do queixo alta
+ </string>
+ <string name="Upper Eyelid Fold">
+ Curvatura dos cílios supériores
+ </string>
+ <string name="Upturned">
+ Voltado para cima
+ </string>
+ <string name="Very Red">
+ Bem vermelho
+ </string>
+ <string name="Waist Height">
+ Altura da cintura
+ </string>
+ <string name="Well-Fed">
+ Corpulento
+ </string>
+ <string name="White Hair">
+ Grisalho
+ </string>
+ <string name="Wide">
+ Amplo
+ </string>
+ <string name="Wide Back">
+ Costas largas
+ </string>
+ <string name="Wide Front">
+ Testa larga
+ </string>
+ <string name="Wide Lips">
+ Lábios amplos
+ </string>
+ <string name="Wild">
+ Selvagem
+ </string>
+ <string name="Wrinkles">
+ Rugas
+ </string>
+ <string name="LocationCtrlAddLandmarkTooltip">
+ Adicionar às minhas Landmarks
+ </string>
+ <string name="LocationCtrlEditLandmarkTooltip">
+ Editar minhas Landmarks
+ </string>
+ <string name="LocationCtrlInfoBtnTooltip">
+ Ver mais informações sobre a localização atual
+ </string>
+ <string name="LocationCtrlComboBtnTooltip">
+ Histórico de localizações
+ </string>
+ <string name="LocationCtrlAdultIconTooltip">
+ Região Adulta
+ </string>
+ <string name="LocationCtrlModerateIconTooltip">
+ Região Moderada
+ </string>
+ <string name="LocationCtrlGeneralIconTooltip">
+ Região em geral
+ </string>
+ <string name="LocationCtrlSeeAVsTooltip">
+ Avatar visíveis e bate-papo permitido fora deste terreno
+ </string>
+ <string name="UpdaterWindowTitle">
+ [APP_NAME] Atualização
+ </string>
+ <string name="UpdaterNowUpdating">
+ Atualizando agora o [APP_NAME]...
+ </string>
+ <string name="UpdaterNowInstalling">
+ Instalando [APP_NAME]...
+ </string>
+ <string name="UpdaterUpdatingDescriptive">
+ Seu visualizador [APP_NAME] está sendo atualizado para a versão mais recente. Isso pode levar algum tempo, então por favor seja paciente.
+ </string>
+ <string name="UpdaterProgressBarTextWithEllipses">
+ Fazendo o download da atualização...
+ </string>
+ <string name="UpdaterProgressBarText">
+ Fazendo o download da atualização
+ </string>
+ <string name="UpdaterFailDownloadTitle">
+ Falha no download da atualização
+ </string>
+ <string name="UpdaterFailUpdateDescriptive">
+ Um erro ocorreu ao atualizar [APP_NAME]. Por favor, faça o download da versão mais recente em www.secondlife.com.
+ </string>
+ <string name="UpdaterFailInstallTitle">
+ Falha ao instalar a atualização
+ </string>
+ <string name="UpdaterFailStartTitle">
+ Falha ao iniciar o visualizador
+ </string>
+ <string name="ItemsComingInTooFastFrom">
+ [APP_NAME]: Entrada de itens rápida demais de [FROM_NAME], visualização automática suspensa por [TIME] segundos
+ </string>
+ <string name="ItemsComingInTooFast">
+ [APP_NAME]: Entrada de itens rápida demais, visualização automática suspensa por [TIME] segundos
+ </string>
+ <string name="IM_logging_string">
+ -- Log de mensagem instantânea habilitado --
+ </string>
+ <string name="IM_typing_start_string">
+ [NAME] está digitando...
+ </string>
+ <string name="Unnamed">
+ (Anônimo)
+ </string>
+ <string name="IM_moderated_chat_label">
+ (Moderado: Voz desativado por padrão)
+ </string>
+ <string name="IM_unavailable_text_label">
+ Bate-papo de texto não está disponível para esta chamada.
+ </string>
+ <string name="IM_muted_text_label">
+ Seu bate- papo de texto foi desabilitado por um Moderador do Grupo.
+ </string>
+ <string name="IM_default_text_label">
+ Clique aqui para menagem instantânea.
+ </string>
+ <string name="IM_to_label">
+ Para
+ </string>
+ <string name="IM_moderator_label">
+ (Moderador)
+ </string>
+ <string name="Saved_message">
+ (Salvo em [LONG_TIMESTAMP])
+ </string>
+ <string name="IM_unblock_only_groups_friends">
+ Para visualizar esta mensagem, você deve desmarcar &quot;Apenas amigos e grupos podem me ligar ou enviar MIs&quot; em Preferências/Privacidade.
+ </string>
+ <string name="answered_call">
+ Ligação atendida
+ </string>
+ <string name="you_started_call">
+ Você iniciou uma ligação de voz
+ </string>
+ <string name="you_joined_call">
+ Você entrou na ligação
+ </string>
+ <string name="name_started_call">
+ [NAME] iniciou uma ligação de voz
+ </string>
+ <string name="ringing-im">
+ Entrando em ligação de voz...
+ </string>
+ <string name="connected-im">
+ Conectado. Para sair, clique em Desligar
+ </string>
+ <string name="hang_up-im">
+ Saiu da ligação de voz
+ </string>
+ <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>
+ <string name="only_user_message">
+ Você é o único usuário desta sessão.
+ </string>
+ <string name="offline_message">
+ [NAME] está offline.
+ </string>
+ <string name="invite_message">
+ Clique no botão [BUTTON NAME] para aceitar/ conectar a este bate-papo em voz.
+ </string>
+ <string name="muted_message">
+ Você bloqueou este residente. Se quiser retirar o bloqueio, basta enviar uma mensagem.
+ </string>
+ <string name="generic">
+ Erro de solicitação, tente novamente mais tarde.
+ </string>
+ <string name="generic_request_error">
+ Erro na requisição, por favor, tente novamente.
+ </string>
+ <string name="insufficient_perms_error">
+ Você não tem permissões suficientes.
+ </string>
+ <string name="session_does_not_exist_error">
+ A sessão deixou de existir
+ </string>
+ <string name="no_ability_error">
+ Você não possui esta habilidade.
+ </string>
+ <string name="no_ability">
+ Você não possui esta habilidade.
+ </string>
+ <string name="not_a_mod_error">
+ Você não é um moderador de sessão.
+ </string>
+ <string name="muted">
+ Bate-papo de texto desativado por um moderador.
+ </string>
+ <string name="muted_error">
+ Um moderador do grupo desabilitou seu bate-papo em texto.
+ </string>
+ <string name="add_session_event">
+ Não foi possível adicionar usuários na sessão de bate-papo com [RECIPIENT].
+ </string>
+ <string name="message">
+ Não foi possível enviar sua mensagem para o bate-papo com [RECIPIENT].
+ </string>
+ <string name="message_session_event">
+ Não foi possível enviar sua mensagem na sessão de bate- papo com [RECIPIENT].
+ </string>
+ <string name="mute">
+ Erro durante a moderação.
+ </string>
+ <string name="removed">
+ Você foi tirado do grupo.
+ </string>
+ <string name="removed_from_group">
+ Você foi removido do grupo.
+ </string>
+ <string name="close_on_no_ability">
+ Você não possui mais a habilidade de estar na sessão de bate-papo.
+ </string>
+ <string name="unread_chat_single">
+ [SOURCES] disse alguma coisa
+ </string>
+ <string name="unread_chat_multiple">
+ [SOURCES] disseram alguma coisa
+ </string>
+ <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>
+ <string name="paid_you_ldollars">
+ [NAME] lhe pagou L$ [AMOUNT] [REASON].
+ </string>
+ <string name="paid_you_ldollars_no_reason">
+ [NAME] lhe pagou L$ [AMOUNT]
+ </string>
+ <string name="you_paid_ldollars">
+ Você pagou L$[AMOUNT] por [REASON] a [NAME].
+ </string>
+ <string name="you_paid_ldollars_no_info">
+ Você acaba de pagar L$[AMOUNT].
+ </string>
+ <string name="you_paid_ldollars_no_reason">
+ Você pagou L$[AMOUNT] a [NAME].
+ </string>
+ <string name="you_paid_ldollars_no_name">
+ Você pagou L$[AMOUNT] por [REASON].
+ </string>
+ <string name="you_paid_failure_ldollars">
+ Você não pagou L$[AMOUNT] a [NAME] referentes a [REASON].
+ </string>
+ <string name="you_paid_failure_ldollars_no_info">
+ Você não pagou L$[AMOUNT].
+ </string>
+ <string name="you_paid_failure_ldollars_no_reason">
+ Você não pagou L$[AMOUNT] a [NAME].
+ </string>
+ <string name="you_paid_failure_ldollars_no_name">
+ Você não pagou L$[AMOUNT] referentes a [REASON].
+ </string>
+ <string name="for item">
+ por [ITEM]
+ </string>
+ <string name="for a parcel of land">
+ por uma parcela
+ </string>
+ <string name="for a land access pass">
+ por um passe de acesso
+ </string>
+ <string name="for deeding land">
+ para doar um terreno
+ </string>
+ <string name="to create a group">
+ para criar um grupo
+ </string>
+ <string name="to join a group">
+ para entrar em um grupo
+ </string>
+ <string name="to upload">
+ para carregar
+ </string>
+ <string name="to publish a classified ad">
+ para publicar um anúncio
+ </string>
+ <string name="giving">
+ Dando L$ [AMOUNT]
+ </string>
+ <string name="uploading_costs">
+ O upload custa L$ [AMOUNT]
+ </string>
+ <string name="this_costs">
+ Isso custa L$ [AMOUNT]
+ </string>
+ <string name="buying_selected_land">
+ Comprando terreno selecionado L$ [AMOUNT]
+ </string>
+ <string name="this_object_costs">
+ Esse objeto custa L$ [AMOUNT]
+ </string>
+ <string name="group_role_everyone">
+ Todos
+ </string>
+ <string name="group_role_officers">
+ Oficiais
+ </string>
+ <string name="group_role_owners">
+ Proprietários
+ </string>
+ <string name="group_member_status_online">
+ Conectado
+ </string>
+ <string name="uploading_abuse_report">
+ Carregando...
+
+Denunciar abuso
+ </string>
+ <string name="New Shape">
+ Nova forma
+ </string>
+ <string name="New Skin">
+ Nova pele
+ </string>
+ <string name="New Hair">
+ Novo cabelo
+ </string>
+ <string name="New Eyes">
+ Novos olhos
+ </string>
+ <string name="New Shirt">
+ Nova camisa
+ </string>
+ <string name="New Pants">
+ Novas calças
+ </string>
+ <string name="New Shoes">
+ Novos sapatos
+ </string>
+ <string name="New Socks">
+ Novas meias
+ </string>
+ <string name="New Jacket">
+ Nova blusa
+ </string>
+ <string name="New Gloves">
+ Novas luvas
+ </string>
+ <string name="New Undershirt">
+ Nova camiseta
+ </string>
+ <string name="New Underpants">
+ Novas roupa de baixo
+ </string>
+ <string name="New Skirt">
+ Nova saia
+ </string>
+ <string name="New Alpha">
+ Novo alpha
+ </string>
+ <string name="New Tattoo">
+ Nova tatuagem
+ </string>
+ <string name="New Physics">
+ Novo físico
+ </string>
+ <string name="Invalid Wearable">
+ Item inválido
+ </string>
+ <string name="New Gesture">
+ Novo gesto
+ </string>
+ <string name="New Script">
+ Novo script
+ </string>
+ <string name="New Note">
+ Nova nota
+ </string>
+ <string name="New Folder">
+ Nova pasta
+ </string>
+ <string name="Contents">
+ Conteúdo
+ </string>
+ <string name="Gesture">
+ Gesto
+ </string>
+ <string name="Male Gestures">
+ Gestos masculinos
+ </string>
+ <string name="Female Gestures">
+ Gestos femininos
+ </string>
+ <string name="Other Gestures">
+ Outros gestos
+ </string>
+ <string name="Speech Gestures">
+ Gestos da fala
+ </string>
+ <string name="Common Gestures">
+ Gestos comuns
+ </string>
+ <string name="Male - Excuse me">
+ Perdão - masculino
+ </string>
+ <string name="Male - Get lost">
+ Deixe-me em paz - masculino
+ </string>
+ <string name="Male - Blow kiss">
+ Mandar beijo - masculino
+ </string>
+ <string name="Male - Boo">
+ Vaia - masculino
+ </string>
+ <string name="Male - Bored">
+ Maçante - masculino
+ </string>
+ <string name="Male - Hey">
+ Ôpa! - masculino
+ </string>
+ <string name="Male - Laugh">
+ Risada - masculino
+ </string>
+ <string name="Male - Repulsed">
+ Quero distância! - masculino
+ </string>
+ <string name="Male - Shrug">
+ Encolher de ombros - masculino
+ </string>
+ <string name="Male - Stick tougue out">
+ Mostrar a língua - masculino
+ </string>
+ <string name="Male - Wow">
+ Wow - masculino
+ </string>
+ <string name="Female - Chuckle">
+ Engraçado - Feminino
+ </string>
+ <string name="Female - Cry">
+ Chorar - Feminino
+ </string>
+ <string name="Female - Embarrassed">
+ Com vergonha - Feminino
+ </string>
+ <string name="Female - Excuse me">
+ Perdão - fem
+ </string>
+ <string name="Female - Get lost">
+ Deixe-me em paz - feminino
+ </string>
+ <string name="Female - Blow kiss">
+ Mandar beijo - fem
+ </string>
+ <string name="Female - Boo">
+ Vaia - fem
+ </string>
+ <string name="Female - Bored">
+ Maçante - feminino
+ </string>
+ <string name="Female - Hey">
+ Ôpa - feminino
+ </string>
+ <string name="Female - Hey baby">
+ E aí, beliza? - Feminino
+ </string>
+ <string name="Female - Laugh">
+ Risada - feminina
+ </string>
+ <string name="Female - Looking good">
+ Que chique - Feminino
+ </string>
+ <string name="Female - Over here">
+ Acenar - Feminino
+ </string>
+ <string name="Female - Please">
+ Por favor - Feminino
+ </string>
+ <string name="Female - Repulsed">
+ Quero distância! - feminino
+ </string>
+ <string name="Female - Shrug">
+ Encolher ombros - feminino
+ </string>
+ <string name="Female - Stick tougue out">
+ Mostrar a língua - feminino
+ </string>
+ <string name="Female - Wow">
+ Wow - feminino
+ </string>
+ <string name="/bow">
+ /reverência
+ </string>
+ <string name="/clap">
+ /palmas
+ </string>
+ <string name="/count">
+ /contar
+ </string>
+ <string name="/extinguish">
+ /apagar
+ </string>
+ <string name="/kmb">
+ /dane_se
+ </string>
+ <string name="/muscle">
+ /músculos
+ </string>
+ <string name="/no">
+ /não
+ </string>
+ <string name="/no!">
+ /não!
+ </string>
+ <string name="/paper">
+ /papel
+ </string>
+ <string name="/pointme">
+ /apontar_eu
+ </string>
+ <string name="/pointyou">
+ /apontar_você
+ </string>
+ <string name="/rock">
+ /pedra
+ </string>
+ <string name="/scissor">
+ /tesoura
+ </string>
+ <string name="/smoke">
+ /fumar
+ </string>
+ <string name="/stretch">
+ /alongar
+ </string>
+ <string name="/whistle">
+ /assobiar
+ </string>
+ <string name="/yes">
+ /sim
+ </string>
+ <string name="/yes!">
+ /sim!
+ </string>
+ <string name="afk">
+ ldt
+ </string>
+ <string name="dance1">
+ dança1
+ </string>
+ <string name="dance2">
+ dança2
+ </string>
+ <string name="dance3">
+ dança3
+ </string>
+ <string name="dance4">
+ dança4
+ </string>
+ <string name="dance5">
+ dança5
+ </string>
+ <string name="dance6">
+ dança6
+ </string>
+ <string name="dance7">
+ dança7
+ </string>
+ <string name="dance8">
+ dança8
+ </string>
+ <string name="AvatarBirthDateFormat">
+ [mthnum,datetime,slt]/[day,datetime,slt]/[year,datetime,slt]
+ </string>
+ <string name="DefaultMimeType">
+ nenhum/nehum
+ </string>
+ <string name="texture_load_dimensions_error">
+ A imagem excede o limite [WIDTH]*[HEIGHT]
+ </string>
+ <string name="words_separator" value=","/>
+ <string name="server_is_down">
+ Aconteceu algo inesperado, apesar de termos tentado impedir isso.
+
+ Cheque secondlifegrid.net para saber se foi detectado um problema com o serviço.
+ Se o problema persistir, cheque a configuração da sua rede e firewall.
+ </string>
+ <string name="dateTimeWeekdaysNames">
+ Domingo:Segunda:Terça:Quarta:Quinta:Sexta:Sábado
+ </string>
+ <string name="dateTimeWeekdaysShortNames">
+ Dom:Seg:Ter:Qua:Qui:Sex:Sab
+ </string>
+ <string name="dateTimeMonthNames">
+ Janeiro:Fevereiro:Março:Abril:Maio:Junho:Julho:Agosto:Setembro:Outubro:Novembro:Dezembro
+ </string>
+ <string name="dateTimeMonthShortNames">
+ Jan:Fev:Mar:Abr:Maio:Jun:Jul:Ago:Set:Out:Nov:Dez
+ </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">
+ Plano
+ </string>
+ <string name="Roles">
+ Cargos
+ </string>
+ <string name="Group Identity">
+ Identidade do lote
+ </string>
+ <string name="Parcel Management">
+ Gestão do lote
+ </string>
+ <string name="Parcel Identity">
+ ID do lote
+ </string>
+ <string name="Parcel Settings">
+ Configurações do lote
+ </string>
+ <string name="Parcel Powers">
+ Poderes do lote
+ </string>
+ <string name="Parcel Access">
+ Acesso ao lote
+ </string>
+ <string name="Parcel Content">
+ Conteúdo do lote
+ </string>
+ <string name="Object Management">
+ Gestão de objetos
+ </string>
+ <string name="Accounting">
+ Contabilidade
+ </string>
+ <string name="Notices">
+ Avisos
+ </string>
+ <string name="Chat" value="Bate papo">
+ Bate-papo
+ </string>
+ <string name="DeleteItems">
+ Excluir itens selecionados?
+ </string>
+ <string name="DeleteItem">
+ Excluir item selecionado?
+ </string>
+ <string name="EmptyOutfitText">
+ Este look não possui nenhuma peça
+ </string>
+ <string name="ExternalEditorNotSet">
+ Selecione um editor utilizando a configuração ExternalEditor.
+ </string>
+ <string name="ExternalEditorNotFound">
+ O editor externo especificado não foi localizado.
+Tente colocar o caminho do editor entre aspas.
+(ex. &quot;/caminho para/editor&quot; &quot;%s&quot;)
+ </string>
+ <string name="ExternalEditorCommandParseError">
+ Error ao analisar o comando do editor externo.
+ </string>
+ <string name="ExternalEditorFailedToRun">
+ Falha de execução do editor externo.
+ </string>
+ <string name="TranslationFailed">
+ Falha na tradução: [REASON]
+ </string>
+ <string name="TranslationResponseParseError">
+ Erro ao analisar resposta de tradução.
+ </string>
+ <string name="Esc">
+ Esc
+ </string>
+ <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">
+ Início
+ </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">
+ Adicionar
+ </string>
+ <string name="Subtract">
+ Subtrair
+ </string>
+ <string name="Multiply">
+ Multiplicar
+ </string>
+ <string name="Divide">
+ Dividir
+ </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">
+ Vendo balizas de partículas (azul)
+ </string>
+ <string name="BeaconPhysical">
+ Vendo balizas de objetos físicos (verde)
+ </string>
+ <string name="BeaconScripted">
+ Vendo balizas de objetos com script (vermelho)
+ </string>
+ <string name="BeaconScriptedTouch">
+ Vendo objeto com script com balizas com funcionalidade de toque (vermelho)
+ </string>
+ <string name="BeaconSound">
+ Vendo balizas de som (amarelo)
+ </string>
+ <string name="BeaconMedia">
+ Vendo balizas de mídia (branco)
+ </string>
+ <string name="ParticleHiding">
+ Ocultar partículas
+ </string>
+ <string name="Command_AboutLand_Label">
+ Sobre terrenos
+ </string>
+ <string name="Command_Appearance_Label">
+ Aparência
+ </string>
+ <string name="Command_Avatar_Label">
+ Avatar
+ </string>
+ <string name="Command_Build_Label">
+ Construir
+ </string>
+ <string name="Command_Chat_Label">
+ Bate-papo
+ </string>
+ <string name="Command_Compass_Label">
+ Bússola
+ </string>
+ <string name="Command_Destinations_Label">
+ Destinos
+ </string>
+ <string name="Command_Gestures_Label">
+ Gestos
+ </string>
+ <string name="Command_HowTo_Label">
+ Como
+ </string>
+ <string name="Command_Inventory_Label">
+ Inventário
+ </string>
+ <string name="Command_Map_Label">
+ Mapa
+ </string>
+ <string name="Command_Marketplace_Label">
+ Mercado
+ </string>
+ <string name="Command_MiniMap_Label">
+ Mini Mapa
+ </string>
+ <string name="Command_Move_Label">
+ Andar/correr/voar
+ </string>
+ <string name="Command_Outbox_Label">
+ Caixa de saída do lojista
+ </string>
+ <string name="Command_People_Label">
+ Pessoas
+ </string>
+ <string name="Command_Picks_Label">
+ Destaques
+ </string>
+ <string name="Command_Places_Label">
+ Lugares
+ </string>
+ <string name="Command_Preferences_Label">
+ Preferências
+ </string>
+ <string name="Command_Profile_Label">
+ Perfil
+ </string>
+ <string name="Command_Search_Label">
+ Buscar
+ </string>
+ <string name="Command_Snapshot_Label">
+ Foto
+ </string>
+ <string name="Command_Speak_Label">
+ Falar
+ </string>
+ <string name="Command_View_Label">
+ Controles da câmera
+ </string>
+ <string name="Command_Voice_Label">
+ Configurações de voz
+ </string>
+ <string name="Command_AboutLand_Tooltip">
+ Informações sobre o terreno que você está visitando
+ </string>
+ <string name="Command_Appearance_Tooltip">
+ Mudar seu avatar
+ </string>
+ <string name="Command_Avatar_Tooltip">
+ Escolha um avatar completo
+ </string>
+ <string name="Command_Build_Tooltip">
+ Construindo objetos e redimensionando terreno
+ </string>
+ <string name="Command_Chat_Tooltip">
+ Bater papo com pessoas próximas usando texto
+ </string>
+ <string name="Command_Compass_Tooltip">
+ Bússola
+ </string>
+ <string name="Command_Destinations_Tooltip">
+ Destinos de interesse
+ </string>
+ <string name="Command_Gestures_Tooltip">
+ Gestos para seu avatar
+ </string>
+ <string name="Command_HowTo_Tooltip">
+ Como executar tarefas comuns
+ </string>
+ <string name="Command_Inventory_Tooltip">
+ Exibir e usar seus pertences
+ </string>
+ <string name="Command_Map_Tooltip">
+ Mapa-múndi
+ </string>
+ <string name="Command_Marketplace_Tooltip">
+ Faça compras
+ </string>
+ <string name="Command_MiniMap_Tooltip">
+ Mostrar quem está aqui
+ </string>
+ <string name="Command_Move_Tooltip">
+ Movendo seu avatar
+ </string>
+ <string name="Command_Outbox_Tooltip">
+ Transferir itens para o seu mercado para venda
+ </string>
+ <string name="Command_People_Tooltip">
+ Amigos, grupos e pessoas próximas
+ </string>
+ <string name="Command_Picks_Tooltip">
+ Lugares mostrados como favoritos em seu perfil
+ </string>
+ <string name="Command_Places_Tooltip">
+ Lugares salvos
+ </string>
+ <string name="Command_Preferences_Tooltip">
+ Preferências
+ </string>
+ <string name="Command_Profile_Tooltip">
+ Edite ou visualize seu perfil
+ </string>
+ <string name="Command_Search_Tooltip">
+ Encontre lugares, eventos, pessoas
+ </string>
+ <string name="Command_Snapshot_Tooltip">
+ Tirar uma foto
+ </string>
+ <string name="Command_Speak_Tooltip">
+ Fale com pessoas próximas usando seu microfone
+ </string>
+ <string name="Command_View_Tooltip">
+ Alterar o ângulo da câmera
+ </string>
+ <string name="Command_Voice_Tooltip">
+ Controles de volume das chamadas e pessoas próximas a você no mundo virtual
+ </string>
+ <string name="Toolbar_Bottom_Tooltip">
+ atualmente na sua barra de ferramentas inferior
+ </string>
+ <string name="Toolbar_Left_Tooltip">
+ atualmente na sua barra de ferramentas esquerda
+ </string>
+ <string name="Toolbar_Right_Tooltip">
+ atualmente na sua barra de ferramentas direita
+ </string>
+ <string name="Retain%">
+ Reter%
+ </string>
+ <string name="Detail">
+ Detalhe
+ </string>
+ <string name="Better Detail">
+ Detalhamento maior
+ </string>
+ <string name="Surface">
+ Superfície
+ </string>
+ <string name="Solid">
+ Sólido
+ </string>
+ <string name="Wrap">
+ Conclusão
+ </string>
+ <string name="Preview">
+ Visualizar
+ </string>
+ <string name="Normal">
+ Normal
+ </string>
+ <string name="snapshot_quality_very_low">
+ Muito baixo
+ </string>
+ <string name="snapshot_quality_low">
+ Baixo
+ </string>
+ <string name="snapshot_quality_medium">
+ Médio
+ </string>
+ <string name="snapshot_quality_high">
+ Alto
+ </string>
+ <string name="snapshot_quality_very_high">
+ Muito alto
+ </string>
+</strings>
diff --git a/indra/newview/skins/steam/xui/ru/strings.xml b/indra/newview/skins/steam/xui/ru/strings.xml
new file mode 100644
index 0000000000..2b4c6e6f48
--- /dev/null
+++ b/indra/newview/skins/steam/xui/ru/strings.xml
@@ -0,0 +1,5024 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!-- This file contains strings that used to be hardcoded in the source.
+ It is only for those strings which do not belong in a floater.
+ For example, the strings used in avatar chat bubbles, and strings
+ that are returned from one component and may appear in many places-->
+<strings>
+ <string name="SECOND_LIFE">
+ Second Life
+ </string>
+ <string name="APP_NAME">
+ Second Life
+ </string>
+ <string name="CAPITALIZED_APP_NAME">
+ SECOND LIFE
+ </string>
+ <string name="SECOND_LIFE_GRID">
+ Сетка Second Life
+ </string>
+ <string name="SUPPORT_SITE">
+ Портал поддержки Second Life
+ </string>
+ <string name="StartupDetectingHardware">
+ Проверка оборудованиÑ...
+ </string>
+ <string name="StartupLoading">
+ ЗагружаетÑÑ [APP_NAME]...
+ </string>
+ <string name="StartupClearingCache">
+ ОчиÑтка кÑша...
+ </string>
+ <string name="StartupInitializingTextureCache">
+ Ð˜Ð½Ð¸Ñ†Ð¸Ð°Ð»Ð¸Ð·Ð°Ñ†Ð¸Ñ ÐºÑша текÑтур...
+ </string>
+ <string name="StartupInitializingVFS">
+ Ð˜Ð½Ð¸Ñ†Ð¸Ð°Ð»Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð²Ð¸Ñ€Ñ‚ÑƒÐ°Ð»ÑŒÐ½Ð¾Ð¹ файловой ÑиÑтемы...
+ </string>
+ <string name="StartupRequireDriverUpdate">
+ Ошибка инициализации графики. Обновите графичеÑкий драйвер!
+ </string>
+ <string name="ProgressRestoring">
+ ВоÑÑтановление...
+ </string>
+ <string name="ProgressChangingResolution">
+ Изменение разрешениÑ...
+ </string>
+ <string name="Fullbright">
+ СобÑÑ‚Ð²ÐµÐ½Ð½Ð°Ñ ÑркоÑть (уÑтаревший параметр)
+ </string>
+ <string name="LoginInProgress">
+ Вход... Может показатьÑÑ, что программа [APP_NAME] завиÑла. Ожидайте.
+ </string>
+ <string name="LoginInProgressNoFrozen">
+ Вход...
+ </string>
+ <string name="LoginAuthenticating">
+ ÐутентификациÑ
+ </string>
+ <string name="LoginMaintenance">
+ Идет обÑлуживание аккаунта...
+ </string>
+ <string name="LoginAttempt">
+ ÐŸÑ€ÐµÐ´Ñ‹Ð´ÑƒÑ‰Ð°Ñ Ð¿Ð¾Ð¿Ñ‹Ñ‚ÐºÐ° входа была неудачной. Вход: попытка â„– [NUMBER]
+ </string>
+ <string name="LoginPrecaching">
+ Загрузка мира...
+ </string>
+ <string name="LoginInitializingBrowser">
+ Ð˜Ð½Ð¸Ñ†Ð¸Ð°Ð»Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð²Ñтроенного веб-браузера...
+ </string>
+ <string name="LoginInitializingMultimedia">
+ Ð˜Ð½Ð¸Ñ†Ð¸Ð°Ð»Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð¼ÑƒÐ»ÑŒÑ‚Ð¸Ð¼ÐµÐ´Ð¸Ð°...
+ </string>
+ <string name="LoginInitializingFonts">
+ Загрузка шрифтов...
+ </string>
+ <string name="LoginVerifyingCache">
+ Проверка файлов кÑша (может занÑть 60-90 Ñ)...
+ </string>
+ <string name="LoginProcessingResponse">
+ Обработка ответа...
+ </string>
+ <string name="LoginInitializingWorld">
+ Ð˜Ð½Ð¸Ñ†Ð¸Ð°Ð»Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð¼Ð¸Ñ€Ð°...
+ </string>
+ <string name="LoginDecodingImages">
+ Декодирование изображений...
+ </string>
+ <string name="LoginInitializingQuicktime">
+ Ð˜Ð½Ð¸Ñ†Ð¸Ð°Ð»Ð¸Ð·Ð°Ñ†Ð¸Ñ QuickTime...
+ </string>
+ <string name="LoginQuicktimeNotFound">
+ QuickTime не найден – ошибка инициализации.
+ </string>
+ <string name="LoginQuicktimeOK">
+ УÑÐ¿ÐµÑˆÐ½Ð°Ñ Ð¸Ð½Ð¸Ñ†Ð¸Ð°Ð»Ð¸Ð·Ð°Ñ†Ð¸Ñ QuickTime.
+ </string>
+ <string name="LoginRequestSeedCapGrant">
+ Ð—Ð°Ð¿Ñ€Ð¾Ñ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾Ñтей региона...
+ </string>
+ <string name="LoginRetrySeedCapGrant">
+ Ð—Ð°Ð¿Ñ€Ð¾Ñ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾Ñтей региона, попытка [NUMBER]...
+ </string>
+ <string name="LoginWaitingForRegionHandshake">
+ УÑтанавливаетÑÑ ÑвÑзь Ñ Ñ€ÐµÐ³Ð¸Ð¾Ð½Ð¾Ð¼...
+ </string>
+ <string name="LoginConnectingToRegion">
+ Подключение к региону...
+ </string>
+ <string name="LoginDownloadingClothing">
+ Загрузка одежды...
+ </string>
+ <string name="InvalidCertificate">
+ Сервер возвратил недейÑтвительный или поврежденный Ñертификат. ОбратитеÑÑŒ к админиÑтратору Ñетки.
+ </string>
+ <string name="CertInvalidHostname">
+ Ð”Ð»Ñ Ð´Ð¾Ñтупа к Ñерверу иÑпользовалоÑÑŒ недейÑтвительное Ð¸Ð¼Ñ ÑƒÐ·Ð»Ð°. Проверьте URL-Ð°Ð´Ñ€ÐµÑ SL или Ð¸Ð¼Ñ ÑƒÐ·Ð»Ð° в Ñетке.
+ </string>
+ <string name="CertExpired">
+ Ð¡ÑƒÐ´Ñ Ð¿Ð¾ вÑему, иÑтек Ñрок дейÑÑ‚Ð²Ð¸Ñ Ñертификата, возвращенного Ñеткой. Проверьте времÑ, уÑтановленное в ÑиÑтеме, или обратитеÑÑŒ к админиÑтратору Ñетки.
+ </string>
+ <string name="CertKeyUsage">
+ Ðе удалоÑÑŒ иÑпользовать в протоколе SSL Ñертификат, возвращенный Ñервером. ОбратитеÑÑŒ к админиÑтратору Ñетки.
+ </string>
+ <string name="CertBasicConstraints">
+ Ð’ цепочке Ñертификатов Ñерверов Ñлишком много Ñертификатов. ОбратитеÑÑŒ к админиÑтратору Ñетки.
+ </string>
+ <string name="CertInvalidSignature">
+ Ðе удалоÑÑŒ проверить подпиÑÑŒ Ñертификата, возвращенного Ñервером Ñетки. ОбратитеÑÑŒ к админиÑтратору Ñетки.
+ </string>
+ <string name="LoginFailedNoNetwork">
+ Ошибка Ñети: не удалоÑÑŒ уÑтановить Ñоединение. Проверьте подключение к Ñети.
+ </string>
+ <string name="LoginFailed">
+ Ошибка входа.
+ </string>
+ <string name="Quit">
+ Выйти
+ </string>
+ <string name="create_account_url">
+ http://join.secondlife.com/index.php?sourceid=1206_steam&amp;lang=ru-RU
+ </string>
+ <string name="LoginFailedViewerNotPermitted">
+ У клиента, которым вы пользуетеÑÑŒ, больше нет доÑтупа к игре Second Life. Загрузить новую верÑию клиента можно по адреÑу
+http://secondlife.com/download
+
+Дополнительные ÑÐ²ÐµÐ´ÐµÐ½Ð¸Ñ Ñм. в разделе вопроÑов и ответов по адреÑу
+http://secondlife.com/viewer-access-faq
+ </string>
+ <string name="LoginIntermediateOptionalUpdateAvailable">
+ ДоÑтупно необÑзательное обновление клиента: [VERSION]
+ </string>
+ <string name="LoginFailedRequiredUpdate">
+ Ðеобходимо обновить клиент: [VERSION]
+ </string>
+ <string name="LoginFailedAlreadyLoggedIn">
+ С Ñтого клиента уже выполнен вход.
+ </string>
+ <string name="LoginFailedAuthenticationFailed">
+ Извините! Ðе удаетÑÑ Ð¾Ð±ÐµÑпечить ваш вход.
+УбедитеÑÑŒ, что вы правильно ввели:
+ * Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ (например, bobsmith12 или steller.sunshine)
+ * пароль
+Кроме того, убедитеÑÑŒ, что режим Caps Lock отключен.
+ </string>
+ <string name="LoginFailedPasswordChanged">
+ Ð’ качеÑтве меры предоÑторожноÑти ваш пароль изменен.
+Перейдите на Ñтраницу Ñвоего аккаунта по адреÑу http://secondlife.com/password
+и ответьте на контрольный вопроÑ, чтобы воÑÑтановить Ñвой пароль
+ПриноÑим Ð¸Ð·Ð²Ð¸Ð½ÐµÐ½Ð¸Ñ Ð·Ð° неудобÑтво.
+ </string>
+ <string name="LoginFailedPasswordReset">
+ Ð’ нашу ÑиÑтему внеÑены изменениÑ, поÑтому вам Ñледует воÑÑтановить Ñвой пароль.
+Перейдите на Ñтраницу Ñвоего аккаунта по адреÑу http://secondlife.com/password
+и ответьте на контрольный вопроÑ, чтобы воÑÑтановить Ñвой пароль
+ПриноÑим Ð¸Ð·Ð²Ð¸Ð½ÐµÐ½Ð¸Ñ Ð·Ð° неудобÑтво.
+ </string>
+ <string name="LoginFailedEmployeesOnly">
+ Сайт Second Life временно закрыт на техничеÑкое обÑлуживание.
+Ð’ данное Ð²Ñ€ÐµÐ¼Ñ Ð²Ñ…Ð¾Ð´Ð¸Ñ‚ÑŒ могут только Ñотрудники.
+Обновление ÑоÑтоÑÐ½Ð¸Ñ Ñм. на веб-Ñтранице www.secondlife.com/status.
+ </string>
+ <string name="LoginFailedPremiumOnly">
+ Вход в Second Life временно ограничен, чтобы Ñохранить наивыÑшее качеÑтво игрового мира Ð´Ð»Ñ Ñ‚ÐµÐºÑƒÑ‰Ð¸Ñ… пользователей.
+
+Ð’ Ñто Ð²Ñ€ÐµÐ¼Ñ Ñƒ пользователей Ñ Ð±ÐµÑплатными аккаунтами не будет доÑтупа к Second Life, чтобы у тех, кто заплатил, было больше меÑта.
+ </string>
+ <string name="LoginFailedComputerProhibited">
+ ÐÐµÐ»ÑŒÐ·Ñ Ð²Ñ…Ð¾Ð´Ð¸Ñ‚ÑŒ в игру Second Life на Ñтом компьютере.
+ЕÑли вы Ñчитаете, что Ñто ошибка, отправьте Ñообщение по адреÑу
+support@secondlife.com.
+ </string>
+ <string name="LoginFailedAcountSuspended">
+ Ваш аккаунт не будет доÑтупен до
+[TIME] по тихоокеанÑкому времени.
+ </string>
+ <string name="LoginFailedAccountDisabled">
+ Ð’ данное Ð²Ñ€ÐµÐ¼Ñ Ð½Ð°Ð¼ не удаетÑÑ Ð²Ñ‹Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÑŒ ваш запроÑ.
+ОбратитеÑÑŒ за помощью в Ñлужбу поддержки Second Life по адреÑу http://secondlife.com/support.
+ЕÑли вам не удаетÑÑ Ð¸Ð·Ð¼ÐµÐ½Ð¸Ñ‚ÑŒ Ñвой пароль, позвоните по телефону (866) 476-9763.
+ </string>
+ <string name="LoginFailedTransformError">
+ При входе обнаружена неÑоглаÑованноÑть данных.
+Ðапишите ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð¿Ð¾ адреÑу support@secondlife.com.
+ </string>
+ <string name="LoginFailedAccountMaintenance">
+ ВыполнÑетÑÑ Ð½ÐµÐ±Ð¾Ð»ÑŒÑˆÐ¾Ðµ обÑлуживание вашего аккаунта.
+Ваш аккаунт не будет доÑтупен до
+[TIME] по тихоокеанÑкому времени.
+ЕÑли вы Ñчитаете, что Ñто ошибка, отправьте Ñообщение по адреÑу support@secondlife.com.
+ </string>
+ <string name="LoginFailedPendingLogoutFault">
+ Ð’ ответ на Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð²Ñ‹Ñ…Ð¾Ð´Ð° ÑимулÑтор возвратил Ñообщение о Ñбое.
+ </string>
+ <string name="LoginFailedPendingLogout">
+ Ð’ ÑиÑтеме выполнÑетÑÑ Ð²Ñ‹Ñ…Ð¾Ð´ Ð´Ð»Ñ Ð²Ð°ÑˆÐµÐ³Ð¾ аккаунта.
+Она будет недоÑтупна до
+[TIME] по тихоокеанÑкому времени.
+ </string>
+ <string name="LoginFailedUnableToCreateSession">
+ Ðе удаетÑÑ Ñоздать допуÑтимый ÑеанÑ.
+ </string>
+ <string name="LoginFailedUnableToConnectToSimulator">
+ Ðе удаетÑÑ Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡Ð¸Ñ‚ÑŒÑÑ Ðº ÑимулÑтору.
+ </string>
+ <string name="LoginFailedRestrictedHours">
+ Вы можете входить в Second Life только
+от [START] до [END] по тихоокеанÑкому времени.
+Заходите в Ñто времÑ.
+ЕÑли вы Ñчитаете, что Ñто ошибка, отправьте Ñообщение по адреÑу support@secondlife.com.
+ </string>
+ <string name="LoginFailedIncorrectParameters">
+ Ðеправильные параметры.
+ЕÑли вы Ñчитаете, что Ñто ошибка, отправьте Ñообщение по адреÑу support@secondlife.com.
+ </string>
+ <string name="LoginFailedFirstNameNotAlphanumeric">
+ Ð˜Ð¼Ñ Ð´Ð¾Ð»Ð¶Ð½Ð¾ ÑоÑтоÑть только из букв и цифр.
+ЕÑли вы Ñчитаете, что Ñто ошибка, отправьте Ñообщение по адреÑу support@secondlife.com.
+ </string>
+ <string name="LoginFailedLastNameNotAlphanumeric">
+ Ð¤Ð°Ð¼Ð¸Ð»Ð¸Ñ Ð´Ð¾Ð»Ð¶Ð½Ð° ÑоÑтоÑть только из букв и цифр.
+ЕÑли вы Ñчитаете, что Ñто ошибка, отправьте Ñообщение по адреÑу support@secondlife.com.
+ </string>
+ <string name="LogoutFailedRegionGoingOffline">
+ Регион переходит в автономный режим.
+Попробуйте повторно войти через минуту.
+ </string>
+ <string name="LogoutFailedAgentNotInRegion">
+ Ðгент отÑутÑтвует в регионе.
+Попробуйте повторно войти через минуту.
+ </string>
+ <string name="LogoutFailedPendingLogin">
+ Вход в регион выполнен в другом ÑеанÑе.
+Попробуйте повторно войти через минуту.
+ </string>
+ <string name="LogoutFailedLoggingOut">
+ Ð”Ð»Ñ Ñ€ÐµÐ³Ð¸Ð¾Ð½Ð° выполнен выход в предыдущем ÑеанÑе.
+Попробуйте повторно войти через минуту.
+ </string>
+ <string name="LogoutFailedStillLoggingOut">
+ Ð”Ð»Ñ Ñ€ÐµÐ³Ð¸Ð¾Ð½Ð° вÑе еще выполнÑетÑÑ Ð²Ñ‹Ñ…Ð¾Ð´ в предыдущем ÑеанÑе.
+Попробуйте повторно войти через минуту.
+ </string>
+ <string name="LogoutSucceeded">
+ Ð’ поÑледнем ÑеанÑе Ð´Ð»Ñ Ñ€ÐµÐ³Ð¸Ð¾Ð½Ð° выполнен выход.
+Попробуйте повторно войти через минуту.
+ </string>
+ <string name="LogoutFailedLogoutBegun">
+ Ð”Ð»Ñ Ñ€ÐµÐ³Ð¸Ð¾Ð½Ð° начат процеÑÑ Ð²Ñ‹Ñ…Ð¾Ð´Ð°.
+Попробуйте повторно войти через минуту.
+ </string>
+ <string name="LoginFailedLoggingOutSession">
+ Во Ð²Ñ€ÐµÐ¼Ñ Ð²Ð°ÑˆÐµÐ³Ð¾ поÑледнего ÑеанÑа ÑиÑтема начала процедуру выхода.
+Попробуйте повторно войти через минуту.
+ </string>
+ <string name="AgentLostConnection">
+ Возможно, в Ñтом регионе возникли проблемы. Проверьте подключение к Интернету.
+ </string>
+ <string name="SavingSettings">
+ Сохранение наÑтроек...
+ </string>
+ <string name="LoggingOut">
+ ВыполнÑетÑÑ Ð²Ñ‹Ñ…Ð¾Ð´...
+ </string>
+ <string name="ShuttingDown">
+ Игра закрываетÑÑ...
+ </string>
+ <string name="YouHaveBeenDisconnected">
+ Произошло отключение от региона, в котором вы находилиÑÑŒ.
+ </string>
+ <string name="SentToInvalidRegion">
+ Ð’Ñ‹ отправлены в недейÑтвительный регион.
+ </string>
+ <string name="TestingDisconnect">
+ ТеÑтирование Ð¾Ñ‚ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ ÐºÐ»Ð¸ÐµÐ½Ñ‚Ð°
+ </string>
+ <string name="TooltipPerson">
+ Человек
+ </string>
+ <string name="TooltipNoName">
+ (нет имени)
+ </string>
+ <string name="TooltipOwner">
+ Владелец:
+ </string>
+ <string name="TooltipPublic">
+ ОбщедоÑтупно
+ </string>
+ <string name="TooltipIsGroup">
+ (группа)
+ </string>
+ <string name="TooltipForSaleL$">
+ ПродаетÑÑ: L$[AMOUNT]
+ </string>
+ <string name="TooltipFlagGroupBuild">
+ Стройка в ÑоÑтаве группы
+ </string>
+ <string name="TooltipFlagNoBuild">
+ Стройка запрещена
+ </string>
+ <string name="TooltipFlagNoEdit">
+ Стройка в ÑоÑтаве группы
+ </string>
+ <string name="TooltipFlagNotSafe">
+ ÐебезопаÑно
+ </string>
+ <string name="TooltipFlagNoFly">
+ Полеты запрещены
+ </string>
+ <string name="TooltipFlagGroupScripts">
+ Скрипты Ð´Ð»Ñ Ð³Ñ€ÑƒÐ¿Ð¿Ñ‹
+ </string>
+ <string name="TooltipFlagNoScripts">
+ Скрипты запрещены
+ </string>
+ <string name="TooltipLand">
+ ЗемлÑ:
+ </string>
+ <string name="TooltipMustSingleDrop">
+ Сюда можно перетащить только одну вещь
+ </string>
+ <string name="TooltipPrice" value="L$[AMOUNT]:"/>
+ <string name="TooltipOutboxDragToWorld">
+ ÐÐµÐ»ÑŒÐ·Ñ Ð²Ñ‹Ð»Ð¾Ð¶Ð¸Ñ‚ÑŒ предметы из папке «Торговые иÑходÑщие»
+ </string>
+ <string name="TooltipOutboxNoTransfer">
+ ЧаÑть Ñтих объектов Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿Ñ€Ð¾Ð´Ð°Ñ‚ÑŒ или передать.
+ </string>
+ <string name="TooltipOutboxNotInInventory">
+ Ваша папка «Торговые иÑходÑщие» может получать вещи только непоÑредÑтвенно из вашего инвентарÑ
+ </string>
+ <string name="TooltipOutboxWorn">
+ ÐоÑимые предметы Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿Ð¾Ð¼ÐµÑтить в папку «Торговые иÑходÑщие»
+ </string>
+ <string name="TooltipOutboxCallingCard">
+ Визитки Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿Ð¾Ð¼ÐµÑтить в папку «Торговые иÑходÑщие»
+ </string>
+ <string name="TooltipOutboxFolderLevels">
+ Глубина Ð²Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð¿Ð°Ð¿Ð¾Ðº превышает 3
+ </string>
+ <string name="TooltipOutboxTooManyFolders">
+ Ð’ папке верхнего ÑƒÑ€Ð¾Ð²Ð½Ñ Ð±Ð¾Ð»ÐµÐµ 20 подпапок
+ </string>
+ <string name="TooltipOutboxTooManyObjects">
+ Ð’ папке верхнего ÑƒÑ€Ð¾Ð²Ð½Ñ Ð±Ð¾Ð»ÐµÐµ 200 предметов
+ </string>
+ <string name="TooltipDragOntoOwnChild">
+ Папку Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿ÐµÑ€ÐµÐ¼ÐµÑтить в ее подпапку
+ </string>
+ <string name="TooltipDragOntoSelf">
+ Папку Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿ÐµÑ€ÐµÐ¼ÐµÑтить Ñаму в ÑебÑ
+ </string>
+ <string name="TooltipHttpUrl">
+ Щелкните, чтобы проÑмотреть Ñту веб-Ñтраницу
+ </string>
+ <string name="TooltipSLURL">
+ Щелкните, чтобы проÑмотреть информацию об Ñтом меÑте
+ </string>
+ <string name="TooltipAgentUrl">
+ Щелкните, чтобы проÑмотреть профиль Ñтого жителÑ
+ </string>
+ <string name="TooltipAgentInspect">
+ Узнать больше об Ñтом жителе
+ </string>
+ <string name="TooltipAgentMute">
+ Щелкните, чтобы не Ñлышать Ñтого жителÑ
+ </string>
+ <string name="TooltipAgentUnmute">
+ Щелкните, чтобы Ñлышать Ñтого жителÑ
+ </string>
+ <string name="TooltipAgentIM">
+ Щелкните, чтобы открыть личный чат Ñ Ñтим жителем
+ </string>
+ <string name="TooltipAgentPay">
+ Щелкните, чтобы заплатить жителю
+ </string>
+ <string name="TooltipAgentOfferTeleport">
+ Щелкните, чтобы предложить Ñтому жителю телепортацию
+ </string>
+ <string name="TooltipAgentRequestFriend">
+ Щелкните, чтобы предложить Ñтому жителю дружбу
+ </string>
+ <string name="TooltipGroupUrl">
+ Щелкните, чтобы проÑмотреть опиÑание группы
+ </string>
+ <string name="TooltipEventUrl">
+ Щелкните, чтобы проÑмотреть опиÑание ÑобытиÑ
+ </string>
+ <string name="TooltipClassifiedUrl">
+ Щелкните, чтобы проÑмотреть Ñту рекламу
+ </string>
+ <string name="TooltipParcelUrl">
+ Щелкните, чтобы поÑмотреть опиÑание учаÑтка
+ </string>
+ <string name="TooltipTeleportUrl">
+ Щелкните, чтобы телепортироватьÑÑ Ð² Ñто меÑто
+ </string>
+ <string name="TooltipObjectIMUrl">
+ Щелкните, открыть опиÑание Ñтого объекта
+ </string>
+ <string name="TooltipMapUrl">
+ Щелкните, чтобы поÑмотреть Ñто меÑто на карте
+ </string>
+ <string name="TooltipSLAPP">
+ Щелкните, чтобы выполнить команду secondlife://
+ </string>
+ <string name="CurrentURL" value="Текущий URL-адреÑ: [CurrentURL]"/>
+ <string name="SLurlLabelTeleport">
+ ТелепортироватьÑÑ Ð²
+ </string>
+ <string name="SLurlLabelShowOnMap">
+ Показать карту длÑ
+ </string>
+ <string name="SLappAgentMute">
+ Откл. звук
+ </string>
+ <string name="SLappAgentUnmute">
+ Вкл. звук
+ </string>
+ <string name="SLappAgentIM">
+ IM
+ </string>
+ <string name="SLappAgentPay">
+ Заплатить
+ </string>
+ <string name="SLappAgentOfferTeleport">
+ Предложить телепортацию в
+ </string>
+ <string name="SLappAgentRequestFriend">
+ Предложить дружбу
+ </string>
+ <string name="BUTTON_CLOSE_DARWIN">
+ Закрыть (⌘W)
+ </string>
+ <string name="BUTTON_CLOSE_WIN">
+ Закрыть (Ctrl+W)
+ </string>
+ <string name="BUTTON_CLOSE_CHROME">
+ Закрыть
+ </string>
+ <string name="BUTTON_RESTORE">
+ Развернуть
+ </string>
+ <string name="BUTTON_MINIMIZE">
+ Свернуть
+ </string>
+ <string name="BUTTON_TEAR_OFF">
+ Отделить
+ </string>
+ <string name="BUTTON_DOCK">
+ ПриÑоединить
+ </string>
+ <string name="BUTTON_HELP">
+ Показать Ñправку
+ </string>
+ <string name="Searching">
+ ПоиÑк...
+ </string>
+ <string name="NoneFound">
+ Ðичего не найдено.
+ </string>
+ <string name="RetrievingData">
+ Получение...
+ </string>
+ <string name="ReleaseNotes">
+ Заметки о выпуÑке
+ </string>
+ <string name="LoadingData">
+ Загрузка...
+ </string>
+ <string name="AvatarNameNobody">
+ (без имени)
+ </string>
+ <string name="AvatarNameWaiting">
+ (ожидание)
+ </string>
+ <string name="AvatarNameMultiple">
+ (неÑколько)
+ </string>
+ <string name="GroupNameNone">
+ (нет)
+ </string>
+ <string name="AvalineCaller">
+ [ORDER] абонента Avaline
+ </string>
+ <string name="AssetErrorNone">
+ Ошибок нет
+ </string>
+ <string name="AssetErrorRequestFailed">
+ Ð—Ð°Ð¿Ñ€Ð¾Ñ Ð°ÐºÑ‚Ð¸Ð²Ð°: Ñбой
+ </string>
+ <string name="AssetErrorNonexistentFile">
+ Ð—Ð°Ð¿Ñ€Ð¾Ñ Ð°ÐºÑ‚Ð¸Ð²Ð°: файл не ÑущеÑтвует
+ </string>
+ <string name="AssetErrorNotInDatabase">
+ Ð—Ð°Ð¿Ñ€Ð¾Ñ Ð°ÐºÑ‚Ð¸Ð²Ð°: актив не найден в базе данных
+ </string>
+ <string name="AssetErrorEOF">
+ Конец файла
+ </string>
+ <string name="AssetErrorCannotOpenFile">
+ Ðе удаетÑÑ Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚ÑŒ файл
+ </string>
+ <string name="AssetErrorFileNotFound">
+ Файл не найден
+ </string>
+ <string name="AssetErrorTCPTimeout">
+ Вышло Ð²Ñ€ÐµÐ¼Ñ Ð¿ÐµÑ€ÐµÐ´Ð°Ñ‡Ð¸ файла
+ </string>
+ <string name="AssetErrorCircuitGone">
+ Обрыв в канале
+ </string>
+ <string name="AssetErrorPriceMismatch">
+ Ðе доÑтигнута договоренноÑть по цене между клиентом и Ñервером
+ </string>
+ <string name="AssetErrorUnknownStatus">
+ ÐеизвеÑтный ÑтатуÑ
+ </string>
+ <string name="texture">
+ текÑтуру
+ </string>
+ <string name="sound">
+ звук
+ </string>
+ <string name="calling card">
+ визитку
+ </string>
+ <string name="landmark">
+ закладку
+ </string>
+ <string name="legacy script">
+ Ñтарый Ñкрипт
+ </string>
+ <string name="clothing">
+ одежду
+ </string>
+ <string name="object">
+ объект
+ </string>
+ <string name="note card">
+ заметку
+ </string>
+ <string name="folder">
+ папку
+ </string>
+ <string name="root">
+ корневой каталог
+ </string>
+ <string name="lsl2 script">
+ Ñкрипт LSL2
+ </string>
+ <string name="lsl bytecode">
+ байт-код LSL
+ </string>
+ <string name="tga texture">
+ текÑтуру TGA
+ </string>
+ <string name="body part">
+ чаÑть тела
+ </string>
+ <string name="snapshot">
+ Ñнимок
+ </string>
+ <string name="lost and found">
+ найденные вещи
+ </string>
+ <string name="targa image">
+ изображение TGA
+ </string>
+ <string name="trash">
+ Ñодержимое корзины
+ </string>
+ <string name="jpeg image">
+ изображение JPEG
+ </string>
+ <string name="animation">
+ анимацию
+ </string>
+ <string name="gesture">
+ жеÑÑ‚
+ </string>
+ <string name="simstate">
+ ÑоÑтоÑние ÑимулÑции
+ </string>
+ <string name="favorite">
+ избранное
+ </string>
+ <string name="symbolic link">
+ ÑÑылку
+ </string>
+ <string name="symbolic folder link">
+ ÑÑылку на папку
+ </string>
+ <string name="mesh">
+ Ñетка
+ </string>
+ <string name="AvatarEditingAppearance">
+ (внешний вид редактируетÑÑ)
+ </string>
+ <string name="AvatarAway">
+ Ðет на меÑте
+ </string>
+ <string name="AvatarBusy">
+ Ðе беÑпокоить
+ </string>
+ <string name="AvatarMuted">
+ Ð’ черном ÑпиÑке
+ </string>
+ <string name="anim_express_afraid">
+ Страх
+ </string>
+ <string name="anim_express_anger">
+ Гнев
+ </string>
+ <string name="anim_away">
+ Ðет на меÑте
+ </string>
+ <string name="anim_backflip">
+ Сальто назад
+ </string>
+ <string name="anim_express_laugh">
+ Хохот
+ </string>
+ <string name="anim_express_toothsmile">
+ Ð¨Ð¸Ñ€Ð¾ÐºÐ°Ñ ÑƒÐ»Ñ‹Ð±ÐºÐ°
+ </string>
+ <string name="anim_blowkiss">
+ Воздушный поцелуй
+ </string>
+ <string name="anim_express_bored">
+ Скука
+ </string>
+ <string name="anim_bow">
+ Поклон
+ </string>
+ <string name="anim_clap">
+ Хлопок
+ </string>
+ <string name="anim_courtbow">
+ Учтивый поклон
+ </string>
+ <string name="anim_express_cry">
+ Плач
+ </string>
+ <string name="anim_dance1">
+ Танец 1
+ </string>
+ <string name="anim_dance2">
+ Танец 2
+ </string>
+ <string name="anim_dance3">
+ Танец 3
+ </string>
+ <string name="anim_dance4">
+ Танец 4
+ </string>
+ <string name="anim_dance5">
+ Танец 5
+ </string>
+ <string name="anim_dance6">
+ Танец 6
+ </string>
+ <string name="anim_dance7">
+ Танец 7
+ </string>
+ <string name="anim_dance8">
+ Танец 8
+ </string>
+ <string name="anim_express_disdain">
+ Презрение
+ </string>
+ <string name="anim_drink">
+ Питьё
+ </string>
+ <string name="anim_express_embarrased">
+ Смущение
+ </string>
+ <string name="anim_angry_fingerwag">
+ Погрозить пальцем
+ </string>
+ <string name="anim_fist_pump">
+ Поднимание кулака
+ </string>
+ <string name="anim_yoga_float">
+ ПарÑщий Будда
+ </string>
+ <string name="anim_express_frown">
+ ХмуроÑть
+ </string>
+ <string name="anim_impatient">
+ Ðетерпение
+ </string>
+ <string name="anim_jumpforjoy">
+ Прыжок радоÑти
+ </string>
+ <string name="anim_kissmybutt">
+ Поцелуй в зад
+ </string>
+ <string name="anim_express_kiss">
+ Поцелуй
+ </string>
+ <string name="anim_laugh_short">
+ Смех
+ </string>
+ <string name="anim_musclebeach">
+ ДемонÑÑ‚Ñ€Ð°Ñ†Ð¸Ñ Ð¼ÑƒÑкулов
+ </string>
+ <string name="anim_no_unhappy">
+ ГруÑтный отказ
+ </string>
+ <string name="anim_no_head">
+ Отказ
+ </string>
+ <string name="anim_nyanya">
+ ÐÑ-нÑ-нÑ
+ </string>
+ <string name="anim_punch_onetwo">
+ Двойка руками
+ </string>
+ <string name="anim_express_open_mouth">
+ Открывание рта
+ </string>
+ <string name="anim_peace">
+ Дружелюбие
+ </string>
+ <string name="anim_point_you">
+ Указывание на кого-то
+ </string>
+ <string name="anim_point_me">
+ Указывание на ÑебÑ
+ </string>
+ <string name="anim_punch_l">
+ Удар левой рукой
+ </string>
+ <string name="anim_punch_r">
+ Удар правой рукой
+ </string>
+ <string name="anim_rps_countdown">
+ Счет в КÐБ
+ </string>
+ <string name="anim_rps_paper">
+ КÐБ – бумага
+ </string>
+ <string name="anim_rps_rock">
+ КÐБ – камень
+ </string>
+ <string name="anim_rps_scissors">
+ КÐБ – ножницы
+ </string>
+ <string name="anim_express_repulsed">
+ Отказ
+ </string>
+ <string name="anim_kick_roundhouse_r">
+ «Вертушка»
+ </string>
+ <string name="anim_express_sad">
+ ГруÑть
+ </string>
+ <string name="anim_salute">
+ ПриветÑтвие
+ </string>
+ <string name="anim_shout">
+ Крик
+ </string>
+ <string name="anim_express_shrug">
+ Пожимание плечами
+ </string>
+ <string name="anim_express_smile">
+ Улыбка
+ </string>
+ <string name="anim_smoke_idle">
+ Курение не в затÑжку
+ </string>
+ <string name="anim_smoke_inhale">
+ Курение в затÑжку
+ </string>
+ <string name="anim_smoke_throw_down">
+ БроÑить Ñигарету
+ </string>
+ <string name="anim_express_surprise">
+ Удивление
+ </string>
+ <string name="anim_sword_strike_r">
+ Удар мечом
+ </string>
+ <string name="anim_angry_tantrum">
+ Ð’Ñпышка гнева
+ </string>
+ <string name="anim_express_tongue_out">
+ Показ Ñзыка
+ </string>
+ <string name="anim_hello">
+ ПриветÑтвие рукой
+ </string>
+ <string name="anim_whisper">
+ Шепот
+ </string>
+ <string name="anim_whistle">
+ СвиÑÑ‚
+ </string>
+ <string name="anim_express_wink">
+ Подмигивание
+ </string>
+ <string name="anim_wink_hollywood">
+ Подмигивание по-голливудÑки
+ </string>
+ <string name="anim_express_worry">
+ БеÑпокойÑтво
+ </string>
+ <string name="anim_yes_happy">
+ РадоÑтное ÑоглаÑие
+ </string>
+ <string name="anim_yes_head">
+ СоглаÑие
+ </string>
+ <string name="multiple_textures">
+ ÐеÑколько
+ </string>
+ <string name="texture_loading">
+ Загрузка...
+ </string>
+ <string name="worldmap_offline">
+ Ðе в Ñети
+ </string>
+ <string name="worldmap_item_tooltip_format">
+ [AREA] м² L$[PRICE]
+ </string>
+ <string name="worldmap_results_none_found">
+ Ðичего не найдено.
+ </string>
+ <string name="Ok">
+ ОК
+ </string>
+ <string name="Premature end of file">
+ Преждевременный конец файла
+ </string>
+ <string name="ST_NO_JOINT">
+ Ðе удаетÑÑ Ð½Ð°Ð¹Ñ‚Ð¸ объект ROOT или JOINT.
+ </string>
+ <string name="whisper">
+ шепчет:
+ </string>
+ <string name="shout">
+ кричит:
+ </string>
+ <string name="ringing">
+ Подключение к голоÑовому чату...
+ </string>
+ <string name="connected">
+ Подключение уÑтановлено
+ </string>
+ <string name="unavailable">
+ Ð’ Ñтом меÑте голоÑÐ¾Ð²Ð°Ñ ÑвÑзь недоÑтупна
+ </string>
+ <string name="hang_up">
+ Отключение от общего голоÑового чата
+ </string>
+ <string name="reconnect_nearby">
+ Будет уÑтановлено подключение к локальному голоÑовому чату
+ </string>
+ <string name="ScriptQuestionCautionChatGranted">
+ Объекту «[OBJECTNAME]», который принадлежит пользователю «[OWNERNAME]» и находитÑÑ Ð² [REGIONPOS] в регионе «[REGIONNAME]», предоÑтавлено разрешение: [PERMISSIONS].
+ </string>
+ <string name="ScriptQuestionCautionChatDenied">
+ Объекту «[OBJECTNAME]», который принадлежит пользователю «[OWNERNAME]» и находитÑÑ Ð² [REGIONPOS] в регионе «[REGIONNAME]», отказано в разрешении: [PERMISSIONS].
+ </string>
+ <string name="ScriptTakeMoney">
+ У Ð²Ð°Ñ Ð±ÐµÑ€ÑƒÑ‚ Linden-деньги
+ </string>
+ <string name="ActOnControlInputs">
+ ДейÑÑ‚Ð²Ð¸Ñ Ð¿Ñ€Ð¸ активации Ñлементов управлениÑ
+ </string>
+ <string name="RemapControlInputs">
+ Ðовое ÑопоÑтавление Ñлементов управлениÑ
+ </string>
+ <string name="AnimateYourAvatar">
+ Ðнимировать ваш аватар
+ </string>
+ <string name="AttachToYourAvatar">
+ Прикрепить к аватару
+ </string>
+ <string name="ReleaseOwnership">
+ ОтказатьÑÑ Ð¾Ñ‚ владениÑ, Ñделать вÑеобщим
+ </string>
+ <string name="LinkAndDelink">
+ СвÑзать или отменить ÑвÑзь Ñ Ð´Ñ€ÑƒÐ³Ð¸Ð¼Ð¸ объектами
+ </string>
+ <string name="AddAndRemoveJoints">
+ Добавление и удаление ÑвÑзей Ñ Ð´Ñ€ÑƒÐ³Ð¸Ð¼Ð¸ объектами
+ </string>
+ <string name="ChangePermissions">
+ Изменить разрешениÑ
+ </string>
+ <string name="TrackYourCamera">
+ Следить за камерой
+ </string>
+ <string name="ControlYourCamera">
+ УправлÑть камерой
+ </string>
+ <string name="NotConnected">
+ Ðет подключениÑ
+ </string>
+ <string name="SIM_ACCESS_PG">
+ Общий
+ </string>
+ <string name="SIM_ACCESS_MATURE">
+ Умеренный
+ </string>
+ <string name="SIM_ACCESS_ADULT">
+ Ð”Ð»Ñ Ð²Ð·Ñ€Ð¾Ñлых
+ </string>
+ <string name="SIM_ACCESS_DOWN">
+ Ðе в Ñети
+ </string>
+ <string name="SIM_ACCESS_MIN">
+ ÐеизвеÑтно
+ </string>
+ <string name="land_type_unknown">
+ (неизвеÑтно)
+ </string>
+ <string name="Estate / Full Region">
+ Землевладение/веÑÑŒ регион
+ </string>
+ <string name="Estate / Homestead">
+ Землевладение/помеÑтье
+ </string>
+ <string name="Mainland / Homestead">
+ Материк/помеÑтье
+ </string>
+ <string name="Mainland / Full Region">
+ Материк/веÑÑŒ регион
+ </string>
+ <string name="all_files">
+ Ð’Ñе файлы
+ </string>
+ <string name="sound_files">
+ Звуки
+ </string>
+ <string name="animation_files">
+ ÐнимациÑ
+ </string>
+ <string name="image_files">
+ ИзображениÑ
+ </string>
+ <string name="save_file_verb">
+ Сохранить
+ </string>
+ <string name="load_file_verb">
+ Загрузить
+ </string>
+ <string name="targa_image_files">
+ Ð˜Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ TGA
+ </string>
+ <string name="bitmap_image_files">
+ Ð˜Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ BMP
+ </string>
+ <string name="avi_movie_file">
+ Видео AVI
+ </string>
+ <string name="xaf_animation_file">
+ ÐÐ½Ð¸Ð¼Ð°Ñ†Ð¸Ñ XAF
+ </string>
+ <string name="xml_file">
+ XML-файл
+ </string>
+ <string name="raw_file">
+ RAW-файл
+ </string>
+ <string name="compressed_image_files">
+ ÐеÑжатые изображениÑ
+ </string>
+ <string name="load_files">
+ Загрузить файлы
+ </string>
+ <string name="choose_the_directory">
+ Выбрать каталог
+ </string>
+ <string name="script_files">
+ Скрипты
+ </string>
+ <string name="AvatarSetNotAway">
+ Ðа меÑте
+ </string>
+ <string name="AvatarSetAway">
+ Ðет на меÑте
+ </string>
+ <string name="AvatarSetNotBusy">
+ Ðе занÑÑ‚(а)
+ </string>
+ <string name="AvatarSetBusy">
+ Ðе беÑпокоить
+ </string>
+ <string name="shape">
+ Фигура
+ </string>
+ <string name="skin">
+ Кожа
+ </string>
+ <string name="hair">
+ ВолоÑÑ‹
+ </string>
+ <string name="eyes">
+ Глаза
+ </string>
+ <string name="shirt">
+ Рубашка
+ </string>
+ <string name="pants">
+ Брюки
+ </string>
+ <string name="shoes">
+ Обувь
+ </string>
+ <string name="socks">
+ ÐоÑки
+ </string>
+ <string name="jacket">
+ Пиджак
+ </string>
+ <string name="gloves">
+ Перчатки
+ </string>
+ <string name="undershirt">
+ Майка
+ </string>
+ <string name="underpants">
+ ТруÑÑ‹
+ </string>
+ <string name="skirt">
+ Юбка
+ </string>
+ <string name="alpha">
+ Ðльфа-маÑка
+ </string>
+ <string name="tattoo">
+ Тату
+ </string>
+ <string name="physics">
+ ФизичеÑкие данные
+ </string>
+ <string name="invalid">
+ ошибка
+ </string>
+ <string name="none">
+ нет
+ </string>
+ <string name="shirt_not_worn">
+ Рубашка не надета
+ </string>
+ <string name="pants_not_worn">
+ Брюки не надеты
+ </string>
+ <string name="shoes_not_worn">
+ Обувь не надета
+ </string>
+ <string name="socks_not_worn">
+ ÐоÑки не надеты
+ </string>
+ <string name="jacket_not_worn">
+ Пиджак не надет
+ </string>
+ <string name="gloves_not_worn">
+ Перчатки не надеты
+ </string>
+ <string name="undershirt_not_worn">
+ Майка не надета
+ </string>
+ <string name="underpants_not_worn">
+ ТруÑÑ‹ не надеты
+ </string>
+ <string name="skirt_not_worn">
+ Юбка не надета
+ </string>
+ <string name="alpha_not_worn">
+ Ðльфа-маÑка не надета
+ </string>
+ <string name="tattoo_not_worn">
+ Тату не надето
+ </string>
+ <string name="physics_not_worn">
+ Физика не учитываетÑÑ
+ </string>
+ <string name="invalid_not_worn">
+ ошибка
+ </string>
+ <string name="create_new_shape">
+ Создать фигуру
+ </string>
+ <string name="create_new_skin">
+ Создать кожу
+ </string>
+ <string name="create_new_hair">
+ Создать волоÑÑ‹
+ </string>
+ <string name="create_new_eyes">
+ Создать глаза
+ </string>
+ <string name="create_new_shirt">
+ Создать рубашку
+ </string>
+ <string name="create_new_pants">
+ Создать брюки
+ </string>
+ <string name="create_new_shoes">
+ Создать обувь
+ </string>
+ <string name="create_new_socks">
+ Создать ноÑки
+ </string>
+ <string name="create_new_jacket">
+ Создать пиджак
+ </string>
+ <string name="create_new_gloves">
+ Создать перчатки
+ </string>
+ <string name="create_new_undershirt">
+ Создать майку
+ </string>
+ <string name="create_new_underpants">
+ Создать труÑÑ‹
+ </string>
+ <string name="create_new_skirt">
+ Создать юбку
+ </string>
+ <string name="create_new_alpha">
+ Создать альфа-маÑку
+ </string>
+ <string name="create_new_tattoo">
+ Создать тату
+ </string>
+ <string name="create_new_physics">
+ Создать физику
+ </string>
+ <string name="create_new_invalid">
+ ошибка
+ </string>
+ <string name="NewWearable">
+ Создать [WEARABLE_ITEM]
+ </string>
+ <string name="next">
+ Далее
+ </string>
+ <string name="ok">
+ ОК
+ </string>
+ <string name="GroupNotifyGroupNotice">
+ Групповое уведомление
+ </string>
+ <string name="GroupNotifyGroupNotices">
+ Групповые уведомлениÑ
+ </string>
+ <string name="GroupNotifySentBy">
+ Отправитель
+ </string>
+ <string name="GroupNotifyAttached">
+ Вложение:
+ </string>
+ <string name="GroupNotifyViewPastNotices">
+ ЗдеÑÑŒ можно проÑмотреть поÑледние ÑƒÐ²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ñ Ð¸Ð»Ð¸ отказатьÑÑ Ð¾Ñ‚ их получениÑ.
+ </string>
+ <string name="GroupNotifyOpenAttachment">
+ Открыть вложение
+ </string>
+ <string name="GroupNotifySaveAttachment">
+ Сохранить вложение
+ </string>
+ <string name="TeleportOffer">
+ Предложена телепортациÑ
+ </string>
+ <string name="StartUpNotifications">
+ Пока вы отÑутÑтвовали, пришли новые уведомлениÑ.
+ </string>
+ <string name="OverflowInfoChannelString">
+ Других уведомлений: %d
+ </string>
+ <string name="BodyPartsRightArm">
+ ÐŸÑ€Ð°Ð²Ð°Ñ Ñ€ÑƒÐºÐ°
+ </string>
+ <string name="BodyPartsHead">
+ Голова
+ </string>
+ <string name="BodyPartsLeftArm">
+ Ð›ÐµÐ²Ð°Ñ Ñ€ÑƒÐºÐ°
+ </string>
+ <string name="BodyPartsLeftLeg">
+ Ð›ÐµÐ²Ð°Ñ Ð½Ð¾Ð³Ð°
+ </string>
+ <string name="BodyPartsTorso">
+ ТорÑ
+ </string>
+ <string name="BodyPartsRightLeg">
+ ÐŸÑ€Ð°Ð²Ð°Ñ Ð½Ð¾Ð³Ð°
+ </string>
+ <string name="GraphicsQualityLow">
+ низкаÑ
+ </string>
+ <string name="GraphicsQualityMid">
+ ÑреднÑÑ
+ </string>
+ <string name="GraphicsQualityHigh">
+ выÑокаÑ
+ </string>
+ <string name="LeaveMouselook">
+ Ðажмите ESC, чтобы вернутьÑÑ Ðº обычному обзору
+ </string>
+ <string name="InventoryNoMatchingItems">
+ Ðе нашли того, что вам нужно? ВоÑпользуйтеÑÑŒ [secondlife:///app/search/all/[SEARCH_TERM] поиÑком].
+ </string>
+ <string name="PlacesNoMatchingItems">
+ Ðе нашли того, что вам нужно? ВоÑпользуйтеÑÑŒ [secondlife:///app/search/places/[SEARCH_TERM] поиÑком].
+ </string>
+ <string name="FavoritesNoMatchingItems">
+ Перетащите Ñюда закладку, чтобы добавить ее в ÑпиÑок избранного.
+ </string>
+ <string name="InventoryNoTexture">
+ Ð’ вашем инвентаре нет копии Ñтой текÑтуры
+ </string>
+ <string name="InventoryInboxNoItems">
+ ЗдеÑÑŒ будут показаны ваши покупки из торгового центра. Их можно будет перетащить в ваш инвентарь Ð´Ð»Ñ Ð¸ÑпользованиÑ.
+ </string>
+ <string name="MarketplaceURL">
+ https://marketplace.[MARKETPLACE_DOMAIN_NAME]/
+ </string>
+ <string name="MarketplaceURL_CreateStore">
+ http://community.secondlife.com/t5/English-Knowledge-Base/Selling-in-the-Marketplace/ta-p/700193#Section_.4
+ </string>
+ <string name="MarketplaceURL_Dashboard">
+ https://marketplace.[MARKETPLACE_DOMAIN_NAME]/merchants/store/dashboard
+ </string>
+ <string name="MarketplaceURL_Imports">
+ https://marketplace.[MARKETPLACE_DOMAIN_NAME]/merchants/store/imports
+ </string>
+ <string name="MarketplaceURL_LearnMore">
+ https://marketplace.[MARKETPLACE_DOMAIN_NAME]/learn_more
+ </string>
+ <string name="InventoryOutboxNotMerchantTitle">
+ Продавать вещи в торговом центре может кто угодно.
+ </string>
+ <string name="InventoryOutboxNotMerchantTooltip"/>
+ <string name="InventoryOutboxNotMerchant">
+ ЕÑли вы хотите Ñтать торговцем, [[MARKETPLACE_CREATE_STORE_URL] Ñоздайте магазин].
+ </string>
+ <string name="InventoryOutboxNoItemsTitle">
+ Ваша папка «ИÑходÑщие» пуÑта.
+ </string>
+ <string name="InventoryOutboxNoItemsTooltip"/>
+ <string name="InventoryOutboxNoItems">
+ Перетащите папки в Ñту облаÑть и щелкните «Отправить в торговый центр», чтобы выÑтавить их на продажу в [[MARKETPLACE_DASHBOARD_URL] Торговом центре].
+ </string>
+ <string name="Marketplace Error None">
+ Ошибок нет
+ </string>
+ <string name="Marketplace Error Not Merchant">
+ Ошибка. Прежде чем отправлÑть вещи в магазин, необходимо зарегиÑтрироватьÑÑ ÐºÐ°Ðº торговец (беÑплатно).
+ </string>
+ <string name="Marketplace Error Empty Folder">
+ Ошибка. Ð’ Ñтой папке нет контента.
+ </string>
+ <string name="Marketplace Error Unassociated Products">
+ Ошибка. Ðе удаетÑÑ Ð¿ÐµÑ€ÐµÐ´Ð°Ñ‚ÑŒ Ñту вещь, поÑкольку в вашем торговом аккаунте Ñлишком много вещей, не ÑвÑзанных Ñ Ð¿Ñ€Ð¾Ð´ÑƒÐºÑ‚Ð°Ð¼Ð¸. Чтобы иÑправить Ñту ошибку, войдите на веб-Ñайт торгового центра и уменьшите чиÑло Ñвоих вещей, которые ни Ñ Ñ‡ÐµÐ¼ не ÑвÑзаны.
+ </string>
+ <string name="Marketplace Error Object Limit">
+ Ошибка. Эта вещь Ñодержит Ñлишком много объектов. ИÑправьте Ñту ошибку, Ñложив объекты в коробки и уменьшив их общее чиÑло (должно быть меньше 200).
+ </string>
+ <string name="Marketplace Error Folder Depth">
+ Ошибка. Эта вещь Ñодержит Ñлишком много уровней вложенных папок. Измените Ñтруктуру так, чтобы уровней вложенных папок было не более 3.
+ </string>
+ <string name="Marketplace Error Unsellable Item">
+ Ошибка. Эту вещь Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿Ñ€Ð¾Ð´Ð°Ñ‚ÑŒ в магазине.
+ </string>
+ <string name="Marketplace Error Internal Import">
+ Ошибка. Эта вещь Ñоздает проблему. Повторите попытку позже.
+ </string>
+ <string name="Open landmarks">
+ Открыть закладки
+ </string>
+ <string name="no_transfer" value="(не передаетÑÑ)"/>
+ <string name="no_modify" value="(не изменÑетÑÑ)"/>
+ <string name="no_copy" value="(не копируетÑÑ)"/>
+ <string name="worn" value="(ноÑитÑÑ)"/>
+ <string name="link" value="(ÑÑылка)"/>
+ <string name="broken_link" value="(broken_link)"/>
+ <string name="LoadingContents">
+ Загрузка Ñодержимого...
+ </string>
+ <string name="NoContents">
+ Ðет контента
+ </string>
+ <string name="WornOnAttachmentPoint" value="(где ноÑитÑÑ: [ATTACHMENT_POINT])"/>
+ <string name="ActiveGesture" value="[GESLABEL] (активно)"/>
+ <string name="PermYes">
+ Да
+ </string>
+ <string name="PermNo">
+ Ðет
+ </string>
+ <string name="Chat Message" value="Чат:"/>
+ <string name="Sound" value="Звук:"/>
+ <string name="Wait" value="--- Ждите:"/>
+ <string name="AnimFlagStop" value="ОÑтановить анимацию:"/>
+ <string name="AnimFlagStart" value="Ðачать анимацию:"/>
+ <string name="Wave" value="ПриветÑтвие рукой"/>
+ <string name="GestureActionNone" value="Ðет"/>
+ <string name="HelloAvatar" value="Привет, аватар!"/>
+ <string name="ViewAllGestures" value="ПроÑмотреть вÑе &gt;&gt;"/>
+ <string name="GetMoreGestures" value="Дополнительно &gt;&gt;"/>
+ <string name="Animations" value="ÐнимациÑ,"/>
+ <string name="Calling Cards" value="Визитки,"/>
+ <string name="Clothing" value="Одежда,"/>
+ <string name="Gestures" value="ЖеÑты,"/>
+ <string name="Landmarks" value="Закладки,"/>
+ <string name="Notecards" value="Заметки,"/>
+ <string name="Objects" value="Объекты,"/>
+ <string name="Scripts" value="Скрипты,"/>
+ <string name="Sounds" value="Звуки,"/>
+ <string name="Textures" value="ТекÑтуры,"/>
+ <string name="Snapshots" value="Снимки,"/>
+ <string name="No Filters" value="Ðет"/>
+ <string name="Since Logoff" value="- С момента выхода"/>
+ <string name="InvFolder My Inventory">
+ Мой инвентарь
+ </string>
+ <string name="InvFolder Library">
+ Библиотека
+ </string>
+ <string name="InvFolder Textures">
+ ТекÑтуры
+ </string>
+ <string name="InvFolder Sounds">
+ Звуки
+ </string>
+ <string name="InvFolder Calling Cards">
+ Визитки
+ </string>
+ <string name="InvFolder Landmarks">
+ Закладки
+ </string>
+ <string name="InvFolder Scripts">
+ Скрипты
+ </string>
+ <string name="InvFolder Clothing">
+ Одежда
+ </string>
+ <string name="InvFolder Objects">
+ Объекты
+ </string>
+ <string name="InvFolder Notecards">
+ Заметки
+ </string>
+ <string name="InvFolder New Folder">
+ ÐÐ¾Ð²Ð°Ñ Ð¿Ð°Ð¿ÐºÐ°
+ </string>
+ <string name="InvFolder Inventory">
+ Инвентарь
+ </string>
+ <string name="InvFolder Uncompressed Images">
+ ÐеÑжатые изображениÑ
+ </string>
+ <string name="InvFolder Body Parts">
+ ЧаÑти тела
+ </string>
+ <string name="InvFolder Trash">
+ Корзина
+ </string>
+ <string name="InvFolder Photo Album">
+ Фотоальбом
+ </string>
+ <string name="InvFolder Lost And Found">
+ Бюро находок
+ </string>
+ <string name="InvFolder Uncompressed Sounds">
+ ÐеÑжатые звуки
+ </string>
+ <string name="InvFolder Animations">
+ ÐнимациÑ
+ </string>
+ <string name="InvFolder Gestures">
+ ЖеÑты
+ </string>
+ <string name="InvFolder Favorite">
+ Мое избранное
+ </string>
+ <string name="InvFolder favorite">
+ Мое избранное
+ </string>
+ <string name="InvFolder Current Outfit">
+ Текущий коÑтюм
+ </string>
+ <string name="InvFolder Initial Outfits">
+ Ðачальные коÑтюмы
+ </string>
+ <string name="InvFolder My Outfits">
+ Мои коÑтюмы
+ </string>
+ <string name="InvFolder Accessories">
+ ÐкÑеÑÑуары
+ </string>
+ <string name="InvFolder Meshes">
+ Меши
+ </string>
+ <string name="InvFolder Friends">
+ ДрузьÑ
+ </string>
+ <string name="InvFolder All">
+ Ð’Ñе
+ </string>
+ <string name="no_attachments">
+ Ðет прикрепленных объектов
+ </string>
+ <string name="Attachments remain">
+ ПриÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ (оÑталоÑÑŒ гнезд: [COUNT])
+ </string>
+ <string name="Buy">
+ Купить
+ </string>
+ <string name="BuyforL$">
+ Купить за L$
+ </string>
+ <string name="Stone">
+ Камень
+ </string>
+ <string name="Metal">
+ Металл
+ </string>
+ <string name="Glass">
+ Стекло
+ </string>
+ <string name="Wood">
+ Дерево
+ </string>
+ <string name="Flesh">
+ Плоть
+ </string>
+ <string name="Plastic">
+ ПлаÑтик
+ </string>
+ <string name="Rubber">
+ Резина
+ </string>
+ <string name="Light">
+ Светлый
+ </string>
+ <string name="KBShift">
+ SHIFT
+ </string>
+ <string name="KBCtrl">
+ CTRL
+ </string>
+ <string name="Chest">
+ Грудь
+ </string>
+ <string name="Skull">
+ Череп
+ </string>
+ <string name="Left Shoulder">
+ Левое плечо
+ </string>
+ <string name="Right Shoulder">
+ Правое плечо
+ </string>
+ <string name="Left Hand">
+ Ð›ÐµÐ²Ð°Ñ ÐºÐ¸Ñть
+ </string>
+ <string name="Right Hand">
+ ÐŸÑ€Ð°Ð²Ð°Ñ ÐºÐ¸Ñть
+ </string>
+ <string name="Left Foot">
+ Ð›ÐµÐ²Ð°Ñ ÑтупнÑ
+ </string>
+ <string name="Right Foot">
+ ÐŸÑ€Ð°Ð²Ð°Ñ ÑтупнÑ
+ </string>
+ <string name="Spine">
+ Позвоночник
+ </string>
+ <string name="Pelvis">
+ Таз
+ </string>
+ <string name="Mouth">
+ Рот
+ </string>
+ <string name="Chin">
+ Подбородок
+ </string>
+ <string name="Left Ear">
+ Левое ухо
+ </string>
+ <string name="Right Ear">
+ Правое ухо
+ </string>
+ <string name="Left Eyeball">
+ Левый глаз
+ </string>
+ <string name="Right Eyeball">
+ Правый глаз
+ </string>
+ <string name="Nose">
+ ÐоÑ
+ </string>
+ <string name="R Upper Arm">
+ Правое плечо
+ </string>
+ <string name="R Forearm">
+ Правое предплечье
+ </string>
+ <string name="L Upper Arm">
+ Левое плечо
+ </string>
+ <string name="L Forearm">
+ Левое предплечье
+ </string>
+ <string name="Right Hip">
+ Правое бедро
+ </string>
+ <string name="R Upper Leg">
+ Правое колено
+ </string>
+ <string name="R Lower Leg">
+ ÐŸÑ€Ð°Ð²Ð°Ñ Ð³Ð¾Ð»ÐµÐ½ÑŒ
+ </string>
+ <string name="Left Hip">
+ Левое бедро
+ </string>
+ <string name="L Upper Leg">
+ Левое колено
+ </string>
+ <string name="L Lower Leg">
+ Ð›ÐµÐ²Ð°Ñ Ð³Ð¾Ð»ÐµÐ½ÑŒ
+ </string>
+ <string name="Stomach">
+ Живот
+ </string>
+ <string name="Left Pec">
+ Ð›ÐµÐ²Ð°Ñ Ð³Ñ€ÑƒÐ´ÑŒ
+ </string>
+ <string name="Right Pec">
+ ÐŸÑ€Ð°Ð²Ð°Ñ Ð³Ñ€ÑƒÐ´ÑŒ
+ </string>
+ <string name="Neck">
+ ШеÑ
+ </string>
+ <string name="Avatar Center">
+ Центр аватара
+ </string>
+ <string name="Invalid Attachment">
+ ÐÐµÐ²ÐµÑ€Ð½Ð°Ñ Ñ‚Ð¾Ñ‡ÐºÐ° приÑоединениÑ
+ </string>
+ <string name="YearsMonthsOld">
+ [AGEYEARS] [AGEMONTHS]
+ </string>
+ <string name="YearsOld">
+ [AGEYEARS]
+ </string>
+ <string name="MonthsOld">
+ [AGEMONTHS]
+ </string>
+ <string name="WeeksOld">
+ [AGEWEEKS]
+ </string>
+ <string name="DaysOld">
+ [AGEDAYS]
+ </string>
+ <string name="TodayOld">
+ СегоднÑ
+ </string>
+ <string name="AgeYearsA">
+ [COUNT] год
+ </string>
+ <string name="AgeYearsB">
+ [COUNT] года
+ </string>
+ <string name="AgeYearsC">
+ [COUNT] лет
+ </string>
+ <string name="AgeMonthsA">
+ [COUNT] меÑÑц
+ </string>
+ <string name="AgeMonthsB">
+ [COUNT] меÑÑца
+ </string>
+ <string name="AgeMonthsC">
+ [COUNT] меÑÑцев
+ </string>
+ <string name="AgeWeeksA">
+ [COUNT] неделÑ
+ </string>
+ <string name="AgeWeeksB">
+ [COUNT] недели
+ </string>
+ <string name="AgeWeeksC">
+ [COUNT] недель
+ </string>
+ <string name="AgeDaysA">
+ [COUNT] день
+ </string>
+ <string name="AgeDaysB">
+ [COUNT] днÑ
+ </string>
+ <string name="AgeDaysC">
+ [COUNT] дней
+ </string>
+ <string name="GroupMembersA">
+ [COUNT] учаÑтник
+ </string>
+ <string name="GroupMembersB">
+ [COUNT] учаÑтника
+ </string>
+ <string name="GroupMembersC">
+ [COUNT] учаÑтников
+ </string>
+ <string name="AcctTypeResident">
+ Житель
+ </string>
+ <string name="AcctTypeTrial">
+ ГоÑть
+ </string>
+ <string name="AcctTypeCharterMember">
+ Учредитель
+ </string>
+ <string name="AcctTypeEmployee">
+ Сотрудник Linden Lab
+ </string>
+ <string name="PaymentInfoUsed">
+ ЕÑть Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾ платежах
+ </string>
+ <string name="PaymentInfoOnFile">
+ ЕÑть зарегиÑтрир. Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾ платежах
+ </string>
+ <string name="NoPaymentInfoOnFile">
+ Ðет информации о платежах
+ </string>
+ <string name="AgeVerified">
+ ВозраÑÑ‚ проверен
+ </string>
+ <string name="NotAgeVerified">
+ ВозраÑÑ‚ не проверен
+ </string>
+ <string name="Center 2">
+ В центре 2
+ </string>
+ <string name="Top Right">
+ Вверху Ñправа
+ </string>
+ <string name="Top">
+ Вверху
+ </string>
+ <string name="Top Left">
+ Вверху Ñлева
+ </string>
+ <string name="Center">
+ В центре
+ </string>
+ <string name="Bottom Left">
+ Внизу Ñлева
+ </string>
+ <string name="Bottom">
+ Внизу
+ </string>
+ <string name="Bottom Right">
+ Внизу Ñправа
+ </string>
+ <string name="CompileQueueDownloadedCompiling">
+ Загружено, компилируетÑÑ
+ </string>
+ <string name="CompileQueueScriptNotFound">
+ Скрипт не найден на Ñервере.
+ </string>
+ <string name="CompileQueueProblemDownloading">
+ Проблема при загрузке
+ </string>
+ <string name="CompileQueueInsufficientPermDownload">
+ ÐедоÑтаточно разрешений Ð´Ð»Ñ Ð·Ð°Ð³Ñ€ÑƒÐ·ÐºÐ¸ Ñкрипта.
+ </string>
+ <string name="CompileQueueInsufficientPermFor">
+ ÐедоÑтаточно разрешений длÑ
+ </string>
+ <string name="CompileQueueUnknownFailure">
+ ÐеизвеÑтный Ñбой загрузки
+ </string>
+ <string name="CompileQueueTitle">
+ Ход повторной компилÑции
+ </string>
+ <string name="CompileQueueStart">
+ Ñкомпилировать повторно
+ </string>
+ <string name="ResetQueueTitle">
+ Ход ÑброÑа
+ </string>
+ <string name="ResetQueueStart">
+ ÑброÑ
+ </string>
+ <string name="RunQueueTitle">
+ Ход запуÑка
+ </string>
+ <string name="RunQueueStart">
+ запуÑтить
+ </string>
+ <string name="NotRunQueueTitle">
+ Ход оÑтановки выполнениÑ
+ </string>
+ <string name="NotRunQueueStart">
+ прекратить выполнение
+ </string>
+ <string name="CompileSuccessful">
+ КомпилÑÑ†Ð¸Ñ ÑƒÑпешно выполнена!
+ </string>
+ <string name="CompileSuccessfulSaving">
+ КомпилÑÑ†Ð¸Ñ ÑƒÑпешно выполнена, ÑохранÑетÑÑ...
+ </string>
+ <string name="SaveComplete">
+ Сохранение завершено.
+ </string>
+ <string name="ObjectOutOfRange">
+ Скрипт (объект вне облаÑти)
+ </string>
+ <string name="GodToolsObjectOwnedBy">
+ Объект [OBJECT] Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ [OWNER]
+ </string>
+ <string name="GroupsNone">
+ нет
+ </string>
+ <string name="Group" value="(группа)"/>
+ <string name="Unknown">
+ (ÐеизвеÑтно)
+ </string>
+ <string name="SummaryForTheWeek" value="Сводка за неделю, Ð½Ð°Ñ‡Ð¸Ð½Ð°Ñ Ñ"/>
+ <string name="NextStipendDay" value="Дата очередного жалованиÑ:"/>
+ <string name="GroupPlanningDate">
+ [day,datetime,utc].[mthnum,datetime,utc].[year,datetime,utc]
+ </string>
+ <string name="GroupIndividualShare" value="Ð”Ð»Ñ Ð³Ñ€ÑƒÐ¿Ð¿Ñ‹ ПерÑонально СовмеÑтно"/>
+ <string name="GroupColumn" value="Группа"/>
+ <string name="Balance">
+ БаланÑ
+ </string>
+ <string name="Credits">
+ РаÑход
+ </string>
+ <string name="Debits">
+ Приход
+ </string>
+ <string name="Total">
+ Итого
+ </string>
+ <string name="NoGroupDataFound">
+ Ðе найдены данные Ð´Ð»Ñ Ð³Ñ€ÑƒÐ¿Ð¿Ñ‹
+ </string>
+ <string name="IMParentEstate">
+ родовое землевладение
+ </string>
+ <string name="IMMainland">
+ материк
+ </string>
+ <string name="IMTeen">
+ подроÑтковый
+ </string>
+ <string name="Anyone">
+ вÑе
+ </string>
+ <string name="RegionInfoError">
+ ошибка
+ </string>
+ <string name="RegionInfoAllEstatesOwnedBy">
+ вÑе Ð·ÐµÐ¼Ð»ÐµÐ²Ð»Ð°Ð´ÐµÐ½Ð¸Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ [OWNER]
+ </string>
+ <string name="RegionInfoAllEstatesYouOwn">
+ вÑе ваши землевладениÑ
+ </string>
+ <string name="RegionInfoAllEstatesYouManage">
+ вÑе Ð·ÐµÐ¼Ð»ÐµÐ²Ð»Ð°Ð´ÐµÐ½Ð¸Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ [OWNER], которыми вы управлÑете
+ </string>
+ <string name="RegionInfoAllowedResidents">
+ Допущенные жители: ([ALLOWEDAGENTS], не более [MAXACCESS])
+ </string>
+ <string name="RegionInfoAllowedGroups">
+ Допущенные группы: ([ALLOWEDGROUPS], не более [MAXACCESS])
+ </string>
+ <string name="ScriptLimitsParcelScriptMemory">
+ ПамÑть под Ñкрипты на учаÑтке
+ </string>
+ <string name="ScriptLimitsParcelsOwned">
+ УчаÑтков в ÑпиÑке: [PARCELS]
+ </string>
+ <string name="ScriptLimitsMemoryUsed">
+ ИÑпользуетÑÑ Ð¿Ð°Ð¼Ñти: [COUNT] КБ из [MAX] КБ; доÑтупно: [AVAILABLE] КБ
+ </string>
+ <string name="ScriptLimitsMemoryUsedSimple">
+ ИÑпользуетÑÑ Ð¿Ð°Ð¼Ñти: [COUNT] КБ
+ </string>
+ <string name="ScriptLimitsParcelScriptURLs">
+ URL-адреÑа Ñкрипта учаÑтков
+ </string>
+ <string name="ScriptLimitsURLsUsed">
+ ИÑпользуетÑÑ URL-адреÑов: [COUNT] из [MAX] (доÑтупно: [AVAILABLE])
+ </string>
+ <string name="ScriptLimitsURLsUsedSimple">
+ ИÑпользуетÑÑ URL-адреÑов: [COUNT]
+ </string>
+ <string name="ScriptLimitsRequestError">
+ Ошибка при запроÑе данных
+ </string>
+ <string name="ScriptLimitsRequestNoParcelSelected">
+ УчаÑток не выбран
+ </string>
+ <string name="ScriptLimitsRequestWrongRegion">
+ Ошибка. Ð¡Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ð¾ Ñкрипте доÑтупны только в текущем регионе
+ </string>
+ <string name="ScriptLimitsRequestWaiting">
+ Получение данных...
+ </string>
+ <string name="ScriptLimitsRequestDontOwnParcel">
+ У Ð²Ð°Ñ Ð½ÐµÑ‚ прав Ð´Ð»Ñ Ð¸ÑÑÐ»ÐµÐ´Ð¾Ð²Ð°Ð½Ð¸Ñ Ñтого учаÑтка
+ </string>
+ <string name="SITTING_ON">
+ Сидит на
+ </string>
+ <string name="ATTACH_CHEST">
+ Грудь
+ </string>
+ <string name="ATTACH_HEAD">
+ Голова
+ </string>
+ <string name="ATTACH_LSHOULDER">
+ Левое плечо
+ </string>
+ <string name="ATTACH_RSHOULDER">
+ Правое плечо
+ </string>
+ <string name="ATTACH_LHAND">
+ Ð›ÐµÐ²Ð°Ñ ÐºÐ¸Ñть
+ </string>
+ <string name="ATTACH_RHAND">
+ ÐŸÑ€Ð°Ð²Ð°Ñ ÐºÐ¸Ñть
+ </string>
+ <string name="ATTACH_LFOOT">
+ Ð›ÐµÐ²Ð°Ñ ÑтупнÑ
+ </string>
+ <string name="ATTACH_RFOOT">
+ ÐŸÑ€Ð°Ð²Ð°Ñ ÑтупнÑ
+ </string>
+ <string name="ATTACH_BACK">
+ Спина
+ </string>
+ <string name="ATTACH_PELVIS">
+ Таз
+ </string>
+ <string name="ATTACH_MOUTH">
+ Рот
+ </string>
+ <string name="ATTACH_CHIN">
+ Подбородок
+ </string>
+ <string name="ATTACH_LEAR">
+ Левое ухо
+ </string>
+ <string name="ATTACH_REAR">
+ Правое ухо
+ </string>
+ <string name="ATTACH_LEYE">
+ Левый глаз
+ </string>
+ <string name="ATTACH_REYE">
+ Правый глаз
+ </string>
+ <string name="ATTACH_NOSE">
+ ÐоÑ
+ </string>
+ <string name="ATTACH_RUARM">
+ Правое плечо
+ </string>
+ <string name="ATTACH_RLARM">
+ Правое предплечье
+ </string>
+ <string name="ATTACH_LUARM">
+ Левое плечо
+ </string>
+ <string name="ATTACH_LLARM">
+ Левое предплечье
+ </string>
+ <string name="ATTACH_RHIP">
+ Правое бедро
+ </string>
+ <string name="ATTACH_RULEG">
+ Правое колено
+ </string>
+ <string name="ATTACH_RLLEG">
+ ÐŸÑ€Ð°Ð²Ð°Ñ Ð³Ð¾Ð»ÐµÐ½ÑŒ
+ </string>
+ <string name="ATTACH_LHIP">
+ Левое бедро
+ </string>
+ <string name="ATTACH_LULEG">
+ Левое колено
+ </string>
+ <string name="ATTACH_LLLEG">
+ Ð›ÐµÐ²Ð°Ñ Ð³Ð¾Ð»ÐµÐ½ÑŒ
+ </string>
+ <string name="ATTACH_BELLY">
+ Живот
+ </string>
+ <string name="ATTACH_RPEC">
+ ÐŸÑ€Ð°Ð²Ð°Ñ Ð³Ñ€ÑƒÐ´ÑŒ
+ </string>
+ <string name="ATTACH_LPEC">
+ Ð›ÐµÐ²Ð°Ñ Ð³Ñ€ÑƒÐ´ÑŒ
+ </string>
+ <string name="ATTACH_HUD_CENTER_2">
+ Данные в игре в центре 2
+ </string>
+ <string name="ATTACH_HUD_TOP_RIGHT">
+ Данные в игре вверху Ñправа
+ </string>
+ <string name="ATTACH_HUD_TOP_CENTER">
+ Данные в игре вверху в центре
+ </string>
+ <string name="ATTACH_HUD_TOP_LEFT">
+ Данные в игре вверху Ñлева
+ </string>
+ <string name="ATTACH_HUD_CENTER_1">
+ Данные в игре в центре 1
+ </string>
+ <string name="ATTACH_HUD_BOTTOM_LEFT">
+ Данные в игре внизу Ñлева
+ </string>
+ <string name="ATTACH_HUD_BOTTOM">
+ Данные в игре внизу
+ </string>
+ <string name="ATTACH_HUD_BOTTOM_RIGHT">
+ Данные в игре внизу Ñправа
+ </string>
+ <string name="CursorPos">
+ Строка [LINE], Ñтолбец [COLUMN]
+ </string>
+ <string name="PanelDirCountFound">
+ Ðайдено: [COUNT]
+ </string>
+ <string name="PanelDirTimeStr">
+ [hour,datetime,slt]:[min,datetime,slt]
+ </string>
+ <string name="PanelDirEventsDateText">
+ [day,datetime,slt].[mthnum,datetime,slt]
+ </string>
+ <string name="PanelContentsTooltip">
+ Подключение к объекту
+ </string>
+ <string name="PanelContentsNewScript">
+ Ðовый Ñкрипт
+ </string>
+ <string name="BusyModeResponseDefault">
+ У адреÑата вашего ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð·Ð°Ð´Ð°Ð½ ÑÑ‚Ð°Ñ‚ÑƒÑ Â«Ðе беÑпокоить». Ваше Ñообщение вÑе равно будет отображено на панели IM Ð´Ð»Ñ Ð¿Ñ€Ð¾Ñмотра позже.
+ </string>
+ <string name="MuteByName">
+ (по имени)
+ </string>
+ <string name="MuteAgent">
+ (Ð´Ð»Ñ Ð¶Ð¸Ñ‚ÐµÐ»Ñ)
+ </string>
+ <string name="MuteObject">
+ (Ð´Ð»Ñ Ð¾Ð±ÑŠÐµÐºÑ‚Ð°)
+ </string>
+ <string name="MuteGroup">
+ (Ð´Ð»Ñ Ð³Ñ€ÑƒÐ¿Ð¿Ñ‹)
+ </string>
+ <string name="MuteExternal">
+ (внешний)
+ </string>
+ <string name="RegionNoCovenant">
+ Ðет ÑÐ¾Ð³Ð»Ð°ÑˆÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ñтого землевладениÑ.
+ </string>
+ <string name="RegionNoCovenantOtherOwner">
+ Ðет ÑÐ¾Ð³Ð»Ð°ÑˆÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ñтого землевладениÑ. Ð—ÐµÐ¼Ð»Ñ Ð² Ñтом землевладении продаетÑÑ ÐµÐ³Ð¾ владельцем, а не компанией Linden Lab. Чтобы узнать подробноÑти о продаже, обратитеÑÑŒ к землевладельцу.
+ </string>
+ <string name="covenant_last_modified" value="Дата поÑледнего изменениÑ:"/>
+ <string name="none_text" value="(нет)"/>
+ <string name="never_text" value="(никогда)"/>
+ <string name="GroupOwned">
+ СобÑтвенноÑть группы
+ </string>
+ <string name="Public">
+ ÐžÐ±Ñ‰Ð°Ñ ÑобÑтвенноÑть
+ </string>
+ <string name="LocalSettings">
+ Локальные наÑтройки
+ </string>
+ <string name="RegionSettings">
+ Региональные наÑтройки
+ </string>
+ <string name="ClassifiedClicksTxt">
+ Щелчки: телепорт [TELEPORT], карта [MAP], профиль [PROFILE]
+ </string>
+ <string name="ClassifiedUpdateAfterPublish">
+ (будет обновлено поÑле публикации)
+ </string>
+ <string name="NoPicksClassifiedsText">
+ Ð’Ñ‹ не Ñоздали подборки или рекламы. Ðажмите кнопку Ñо знаком «плюÑ» ниже, чтобы Ñоздать подборку или рекламу
+ </string>
+ <string name="NoAvatarPicksClassifiedsText">
+ У Ð¶Ð¸Ñ‚ÐµÐ»Ñ Ð½ÐµÑ‚ подборки или рекламы
+ </string>
+ <string name="PicksClassifiedsLoadingText">
+ Загрузка...
+ </string>
+ <string name="MultiPreviewTitle">
+ Предварительный проÑмотр
+ </string>
+ <string name="MultiPropertiesTitle">
+ СвойÑтва
+ </string>
+ <string name="InvOfferAnObjectNamed">
+ Объект Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼
+ </string>
+ <string name="InvOfferOwnedByGroup">
+ принадлежит группе
+ </string>
+ <string name="InvOfferOwnedByUnknownGroup">
+ принадлежит извеÑтной группе
+ </string>
+ <string name="InvOfferOwnedBy">
+ принадлежит
+ </string>
+ <string name="InvOfferOwnedByUnknownUser">
+ принадлежит неизвеÑтному пользователю
+ </string>
+ <string name="InvOfferGaveYou">
+ дал(а) вам
+ </string>
+ <string name="InvOfferDecline">
+ Ð’Ñ‹ не принÑли [DESC] от Ð¶Ð¸Ñ‚ÐµÐ»Ñ &lt;nolink&gt;[NAME]&lt;/nolink&gt;.
+ </string>
+ <string name="GroupMoneyTotal">
+ Итого
+ </string>
+ <string name="GroupMoneyBought">
+ куплено
+ </string>
+ <string name="GroupMoneyPaidYou">
+ уплачено вам
+ </string>
+ <string name="GroupMoneyPaidInto">
+ уплачено в
+ </string>
+ <string name="GroupMoneyBoughtPassTo">
+ куплен пропуÑк в
+ </string>
+ <string name="GroupMoneyPaidFeeForEvent">
+ уплачено за Ñобытие
+ </string>
+ <string name="GroupMoneyPaidPrizeForEvent">
+ выплачено призовых за Ñобытие
+ </string>
+ <string name="GroupMoneyBalance">
+ БаланÑ
+ </string>
+ <string name="GroupMoneyCredits">
+ РаÑход
+ </string>
+ <string name="GroupMoneyDebits">
+ Приход
+ </string>
+ <string name="GroupMoneyDate">
+ [weekday,datetime,utc], [day,datetime,utc] [mth,datetime,utc] [year,datetime,utc]
+ </string>
+ <string name="ViewerObjectContents">
+ Контент
+ </string>
+ <string name="AcquiredItems">
+ Купленные вещи
+ </string>
+ <string name="Cancel">
+ Отмена
+ </string>
+ <string name="UploadingCosts">
+ Передача [NAME] Ñтоит L$[AMOUNT]
+ </string>
+ <string name="BuyingCosts">
+ СтоимоÑть покупки: L$[AMOUNT]
+ </string>
+ <string name="UnknownFileExtension">
+ ÐеизвеÑтное раÑширение файла .%s
+ОжидаютÑÑ Ñ€Ð°ÑширениÑ: WAV, TGA, BMP, JPG, JPEG или BVH
+ </string>
+ <string name="MuteObject2">
+ Заблокировать
+ </string>
+ <string name="MuteAvatar">
+ Заблокировать
+ </string>
+ <string name="UnmuteObject">
+ Разблокировать
+ </string>
+ <string name="UnmuteAvatar">
+ Разблокировать
+ </string>
+ <string name="AddLandmarkNavBarMenu">
+ Добавить в мои закладки...
+ </string>
+ <string name="EditLandmarkNavBarMenu">
+ Изменить мою закладку...
+ </string>
+ <string name="accel-mac-control">
+ ⌃
+ </string>
+ <string name="accel-mac-command">
+ ⌘
+ </string>
+ <string name="accel-mac-option">
+ ⌥
+ </string>
+ <string name="accel-mac-shift">
+ ⇧
+ </string>
+ <string name="accel-win-control">
+ CTRL+
+ </string>
+ <string name="accel-win-alt">
+ ALT+
+ </string>
+ <string name="accel-win-shift">
+ SHIFT+
+ </string>
+ <string name="FileSaved">
+ Файл Ñохранен
+ </string>
+ <string name="Receiving">
+ Получение
+ </string>
+ <string name="AM">
+ до полуднÑ
+ </string>
+ <string name="PM">
+ поÑле полуднÑ
+ </string>
+ <string name="PST">
+ ТихоокеанÑкое времÑ
+ </string>
+ <string name="PDT">
+ Летнее тихоокеанÑкое времÑ
+ </string>
+ <string name="Direction_Forward">
+ Вперед
+ </string>
+ <string name="Direction_Left">
+ Влево
+ </string>
+ <string name="Direction_Right">
+ Вправо
+ </string>
+ <string name="Direction_Back">
+ Ðазад
+ </string>
+ <string name="Direction_North">
+ Север
+ </string>
+ <string name="Direction_South">
+ Юг
+ </string>
+ <string name="Direction_West">
+ Запад
+ </string>
+ <string name="Direction_East">
+ ВоÑток
+ </string>
+ <string name="Direction_Up">
+ Вверх
+ </string>
+ <string name="Direction_Down">
+ Вниз
+ </string>
+ <string name="Any Category">
+ Ð’Ñе категории
+ </string>
+ <string name="Shopping">
+ Покупки
+ </string>
+ <string name="Land Rental">
+ Ð—ÐµÐ¼ÐµÐ»ÑŒÐ½Ð°Ñ Ñ€ÐµÐ½Ñ‚Ð°
+ </string>
+ <string name="Property Rental">
+ Ðренда имущеÑтва
+ </string>
+ <string name="Special Attraction">
+ ОÑобое Ñобытие
+ </string>
+ <string name="New Products">
+ Ðовые продукты
+ </string>
+ <string name="Employment">
+ Род занÑтий
+ </string>
+ <string name="Wanted">
+ Хочу найти
+ </string>
+ <string name="Service">
+ УÑлуги
+ </string>
+ <string name="Personal">
+ Личное Ñообщение
+ </string>
+ <string name="None">
+ Ðет
+ </string>
+ <string name="Linden Location">
+ МеÑто Linden
+ </string>
+ <string name="Adult">
+ Ð”Ð»Ñ Ð²Ð·Ñ€Ð¾Ñлых
+ </string>
+ <string name="Arts&amp;Culture">
+ ИÑкуÑÑтво и культура
+ </string>
+ <string name="Business">
+ БизнеÑ
+ </string>
+ <string name="Educational">
+ Образование
+ </string>
+ <string name="Gaming">
+ Игры
+ </string>
+ <string name="Hangout">
+ МеÑта вÑтреч
+ </string>
+ <string name="Newcomer Friendly">
+ Ð”Ð»Ñ Ð½Ð¾Ð²Ð¸Ñ‡ÐºÐ¾Ð²
+ </string>
+ <string name="Parks&amp;Nature">
+ Парки и природа
+ </string>
+ <string name="Residential">
+ Проживание
+ </string>
+ <string name="Stage">
+ СтадиÑ
+ </string>
+ <string name="Other">
+ Другое
+ </string>
+ <string name="Rental">
+ Ðренда
+ </string>
+ <string name="Any">
+ Ð’Ñе
+ </string>
+ <string name="You">
+ Ð’Ñ‹
+ </string>
+ <string name=":">
+ :
+ </string>
+ <string name=",">
+ ,
+ </string>
+ <string name="...">
+ ...
+ </string>
+ <string name="***">
+ ***
+ </string>
+ <string name="(">
+ (
+ </string>
+ <string name=")">
+ )
+ </string>
+ <string name=".">
+ .
+ </string>
+ <string name="&apos;">
+ &apos;
+ </string>
+ <string name="---">
+ ---
+ </string>
+ <string name="Multiple Media">
+ ÐеÑколько иÑточников мультимедиа
+ </string>
+ <string name="Play Media">
+ Мультимедиа – воÑпроизведение/пауза
+ </string>
+ <string name="MBCmdLineError">
+ Ошибка при анализе командной Ñтроки.
+См.: http://wiki.secondlife.com/wiki/Client_parameters
+Ошибка:
+ </string>
+ <string name="MBCmdLineUsg">
+ ИÑпользование командной Ñтроки [APP_NAME]:
+ </string>
+ <string name="MBUnableToAccessFile">
+ Приложению [APP_NAME] не удаетÑÑ Ð¿Ð¾Ð»ÑƒÑ‡Ð¸Ñ‚ÑŒ доÑтуп к нужному файлу.
+Возможно, выполнÑетÑÑ Ð½ÐµÑколько копий или в ÑиÑтеме неправильно открыт файл.
+ЕÑли Ñто Ñообщение по-прежнему будет отображатьÑÑ, перезагрузите компьютер и повторите попытку.
+ЕÑли и Ñто не поможет, возможно, придетÑÑ Ð¿Ð¾Ð²Ñ‚Ð¾Ñ€Ð½Ð¾ уÑтановить приложение [APP_NAME].
+ </string>
+ <string name="MBFatalError">
+ ÐеуÑÑ‚Ñ€Ð°Ð½Ð¸Ð¼Ð°Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ°
+ </string>
+ <string name="MBRequiresAltiVec">
+ Ð”Ð»Ñ Ñ€Ð°Ð±Ð¾Ñ‚Ñ‹ [APP_NAME] необходим процеÑÑор Ñ Ð¿Ð¾Ð´Ð´ÐµÑ€Ð¶ÐºÐ¾Ð¹ AltiVec (верÑии G4 или более поздней).
+ </string>
+ <string name="MBAlreadyRunning">
+ [APP_NAME] уже выполнÑетÑÑ.
+Поищите значок программы на панели задач.
+ЕÑли Ñто Ñообщение по-прежнему будет отображатьÑÑ, перезагрузите компьютер.
+ </string>
+ <string name="MBFrozenCrashed">
+ По-видимому, при предыдущем запуÑке Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ [APP_NAME] оно завиÑло или в нем возник Ñбой.
+Отправить отчет о Ñбое?
+ </string>
+ <string name="MBAlert">
+ Уведомление
+ </string>
+ <string name="MBNoDirectX">
+ Приложению [APP_NAME] не удаетÑÑ Ð¾Ð±Ð½Ð°Ñ€ÑƒÐ¶Ð¸Ñ‚ÑŒ DirectX 9.0b или более поздних верÑий.
+Ð’ приложении [APP_NAME] иÑпользуетÑÑ DirectX Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð²ÐµÑ€ÐºÐ¸ Ð¾Ð±Ð¾Ñ€ÑƒÐ´Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¸ выÑÐ²Ð»ÐµÐ½Ð¸Ñ ÑƒÑтаревших драйверов, из-за которых может ÑнизитьÑÑ ÑтабильноÑть работы и быÑтродейÑтвие, а также возникнуть Ñбои. ÐаÑтоÑтельно рекомендуетÑÑ ÑƒÑтановить DirectX 9.0b, Ñ…Ð¾Ñ‚Ñ Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ðµ [APP_NAME] работает и без Ñтого компонента.
+Продолжить?
+ </string>
+ <string name="MBWarning">
+ Внимание!
+ </string>
+ <string name="MBNoAutoUpdate">
+ Ð’ ОС Linux автоматичеÑкое обновление еще не реализовано.
+Загрузите новую верÑию на Ñайте www.secondlife.com.
+ </string>
+ <string name="MBRegClassFailed">
+ Ошибка RegisterClass
+ </string>
+ <string name="MBError">
+ Ошибка
+ </string>
+ <string name="MBFullScreenErr">
+ Ðевозможна работа в полноÑкранном режиме на Ñкране [WIDTH] x [HEIGHT].
+Запущено в окне.
+ </string>
+ <string name="MBDestroyWinFailed">
+ Ошибка Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð¸Ñ Ñ€Ð°Ð±Ð¾Ñ‚Ñ‹ при удалении окна (Ñбой функции DestroyWindow())
+ </string>
+ <string name="MBShutdownErr">
+ Ошибка Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð¸Ñ Ñ€Ð°Ð±Ð¾Ñ‚Ñ‹
+ </string>
+ <string name="MBDevContextErr">
+ Ðе удаетÑÑ Ñоздать контекÑÑ‚ уÑтройÑтва GL
+ </string>
+ <string name="MBPixelFmtErr">
+ Ðе удаетÑÑ Ð½Ð°Ð¹Ñ‚Ð¸ подходÑщий формат пикÑелей
+ </string>
+ <string name="MBPixelFmtDescErr">
+ Ðе удаетÑÑ Ð¿Ð¾Ð»ÑƒÑ‡Ð¸Ñ‚ÑŒ опиÑание формата пикÑелей
+ </string>
+ <string name="MBTrueColorWindow">
+ Ð”Ð»Ñ Ñ€Ð°Ð±Ð¾Ñ‚Ñ‹ [APP_NAME] необходим режим True Color (32 бита).
+Задайте в наÑтройках диÑÐ¿Ð»ÐµÑ 32-битный режим цвета.
+ </string>
+ <string name="MBAlpha">
+ Ðе удаетÑÑ Ð·Ð°Ð¿ÑƒÑтить [APP_NAME] из-за отÑутÑÑ‚Ð²Ð¸Ñ Ð´Ð¾Ñтупа к 8-битному альфа-каналу. Обычно Ñта проблема возникает из-за неполадок Ñ Ð´Ñ€Ð°Ð¹Ð²ÐµÑ€Ð¾Ð¼ видеокарты.
+УÑтановите новые драйверы видеокарты.
+Также задайте Ð´Ð»Ñ Ð¼Ð¾Ð½Ð¸Ñ‚Ð¾Ñ€Ð° 32-битный режим True Color (Панель ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ &gt; Экран &gt; Параметры).
+ЕÑли Ñто Ñообщение продолжает отображатьÑÑ, обратитеÑÑŒ на Ñайт [SUPPORT_SITE].
+ </string>
+ <string name="MBPixelFmtSetErr">
+ Ðе удаетÑÑ Ð·Ð°Ð´Ð°Ñ‚ÑŒ формат пикÑелей
+ </string>
+ <string name="MBGLContextErr">
+ Ðе удаетÑÑ Ñоздать контекÑÑ‚ визуализации GL
+ </string>
+ <string name="MBGLContextActErr">
+ Ðе удаетÑÑ Ð°ÐºÑ‚Ð¸Ð²Ð¸Ñ€Ð¾Ð²Ð°Ñ‚ÑŒ контекÑÑ‚ визуализации GL
+ </string>
+ <string name="MBVideoDrvErr">
+ Ðе удаетÑÑ Ð·Ð°Ð¿ÑƒÑтить приложение [APP_NAME], поÑкольку драйверы видеокарты неправильно уÑтановлены, уÑтарели или предназначены Ð´Ð»Ñ Ð¾Ð±Ð¾Ñ€ÑƒÐ´Ð¾Ð²Ð°Ð½Ð¸Ñ, которое не поддерживаетÑÑ. УÑтановите или переуÑтановите поÑледние драйверы видеокарты.
+ЕÑли Ñто Ñообщение продолжает отображатьÑÑ, обратитеÑÑŒ на Ñайт [SUPPORT_SITE].
+ </string>
+ <string name="5 O&apos;Clock Shadow">
+ Жидкие
+ </string>
+ <string name="All White">
+ ПолноÑтью белые
+ </string>
+ <string name="Anime Eyes">
+ Глаза как в аниме
+ </string>
+ <string name="Arced">
+ Дугой
+ </string>
+ <string name="Arm Length">
+ Длина рук
+ </string>
+ <string name="Attached">
+ Прикреплено
+ </string>
+ <string name="Attached Earlobes">
+ ПрироÑшие мочки
+ </string>
+ <string name="Back Fringe">
+ Затылок
+ </string>
+ <string name="Baggy">
+ С мешками
+ </string>
+ <string name="Bangs">
+ Челки
+ </string>
+ <string name="Beady Eyes">
+ БуÑинки
+ </string>
+ <string name="Belly Size">
+ Размер живота
+ </string>
+ <string name="Big">
+ Большой
+ </string>
+ <string name="Big Butt">
+ Большой зад
+ </string>
+ <string name="Big Hair Back">
+ Пышные волоÑÑ‹: Ñзади
+ </string>
+ <string name="Big Hair Front">
+ Пышные волоÑÑ‹: Ñпереди
+ </string>
+ <string name="Big Hair Top">
+ Пышные волоÑÑ‹: Ñверху
+ </string>
+ <string name="Big Head">
+ Ð‘Ð¾Ð»ÑŒÑˆÐ°Ñ Ð³Ð¾Ð»Ð¾Ð²Ð°
+ </string>
+ <string name="Big Pectorals">
+ Ð’Ñ‹Ð¿ÑƒÐºÐ»Ð°Ñ Ð³Ñ€ÑƒÐ´ÑŒ
+ </string>
+ <string name="Big Spikes">
+ Большие «шипы»
+ </string>
+ <string name="Black">
+ Черный
+ </string>
+ <string name="Blonde">
+ Светлый
+ </string>
+ <string name="Blonde Hair">
+ Светлые волоÑÑ‹
+ </string>
+ <string name="Blush">
+ РумÑна
+ </string>
+ <string name="Blush Color">
+ Цвет румÑн
+ </string>
+ <string name="Blush Opacity">
+ ПрозрачноÑть румÑн
+ </string>
+ <string name="Body Definition">
+ Тип тела
+ </string>
+ <string name="Body Fat">
+ Ð–Ð¸Ñ€Ð¾Ð²Ð°Ñ Ð¿Ñ€Ð¾Ñлойка
+ </string>
+ <string name="Body Freckles">
+ ВеÑнушки
+ </string>
+ <string name="Body Thick">
+ Полное тело
+ </string>
+ <string name="Body Thickness">
+ Полнота
+ </string>
+ <string name="Body Thin">
+ Худое тело
+ </string>
+ <string name="Bow Legged">
+ Ðоги колеÑом
+ </string>
+ <string name="Breast Buoyancy">
+ Ð’Ñ‹Ñота груди
+ </string>
+ <string name="Breast Cleavage">
+ Ложбинка между грудей
+ </string>
+ <string name="Breast Size">
+ Размер груди
+ </string>
+ <string name="Bridge Width">
+ Ширина переноÑицы
+ </string>
+ <string name="Broad">
+ ШирокаÑ
+ </string>
+ <string name="Brow Size">
+ Размер надбровных дуг
+ </string>
+ <string name="Bug Eyes">
+ Выпученные глаза
+ </string>
+ <string name="Bugged Eyes">
+ Выпученные глаза
+ </string>
+ <string name="Bulbous">
+ Картошкой
+ </string>
+ <string name="Bulbous Nose">
+ ÐÐ¾Ñ ÐºÐ°Ñ€Ñ‚Ð¾ÑˆÐºÐ¾Ð¹
+ </string>
+ <string name="Breast Physics Mass">
+ МаÑÑа груди
+ </string>
+ <string name="Breast Physics Smoothing">
+ ГладкоÑть груди
+ </string>
+ <string name="Breast Physics Gravity">
+ ОбвиÑлоÑть груди
+ </string>
+ <string name="Breast Physics Drag">
+ ÐÑродинамика груди
+ </string>
+ <string name="Breast Physics InOut Max Effect">
+ ВерхнÑÑ Ð³Ñ€Ð°Ð½Ð¸Ñ†Ð°
+ </string>
+ <string name="Breast Physics InOut Spring">
+ УпругоÑть
+ </string>
+ <string name="Breast Physics InOut Gain">
+ Отклик
+ </string>
+ <string name="Breast Physics InOut Damping">
+ Затухание
+ </string>
+ <string name="Breast Physics UpDown Max Effect">
+ ВерхнÑÑ Ð³Ñ€Ð°Ð½Ð¸Ñ†Ð°
+ </string>
+ <string name="Breast Physics UpDown Spring">
+ УпругоÑть
+ </string>
+ <string name="Breast Physics UpDown Gain">
+ Отклик
+ </string>
+ <string name="Breast Physics UpDown Damping">
+ Затухание
+ </string>
+ <string name="Breast Physics LeftRight Max Effect">
+ ВерхнÑÑ Ð³Ñ€Ð°Ð½Ð¸Ñ†Ð°
+ </string>
+ <string name="Breast Physics LeftRight Spring">
+ УпругоÑть
+ </string>
+ <string name="Breast Physics LeftRight Gain">
+ Отклик
+ </string>
+ <string name="Breast Physics LeftRight Damping">
+ Затухание
+ </string>
+ <string name="Belly Physics Mass">
+ МаÑÑа живота
+ </string>
+ <string name="Belly Physics Smoothing">
+ ГладкоÑть живота
+ </string>
+ <string name="Belly Physics Gravity">
+ ОбвиÑлоÑть живота
+ </string>
+ <string name="Belly Physics Drag">
+ ИнертноÑть живота
+ </string>
+ <string name="Belly Physics UpDown Max Effect">
+ ВерхнÑÑ Ð³Ñ€Ð°Ð½Ð¸Ñ†Ð°
+ </string>
+ <string name="Belly Physics UpDown Spring">
+ УпругоÑть
+ </string>
+ <string name="Belly Physics UpDown Gain">
+ Отклик
+ </string>
+ <string name="Belly Physics UpDown Damping">
+ Затухание
+ </string>
+ <string name="Butt Physics Mass">
+ МаÑÑа зада
+ </string>
+ <string name="Butt Physics Smoothing">
+ ГладкоÑть зада
+ </string>
+ <string name="Butt Physics Gravity">
+ ОбвиÑлоÑть зада
+ </string>
+ <string name="Butt Physics Drag">
+ ИнертноÑть зада
+ </string>
+ <string name="Butt Physics UpDown Max Effect">
+ ВерхнÑÑ Ð³Ñ€Ð°Ð½Ð¸Ñ†Ð°
+ </string>
+ <string name="Butt Physics UpDown Spring">
+ УпругоÑть
+ </string>
+ <string name="Butt Physics UpDown Gain">
+ Отклик
+ </string>
+ <string name="Butt Physics UpDown Damping">
+ Затухание
+ </string>
+ <string name="Butt Physics LeftRight Max Effect">
+ ВерхнÑÑ Ð³Ñ€Ð°Ð½Ð¸Ñ†Ð°
+ </string>
+ <string name="Butt Physics LeftRight Spring">
+ УпругоÑть
+ </string>
+ <string name="Butt Physics LeftRight Gain">
+ Отклик
+ </string>
+ <string name="Butt Physics LeftRight Damping">
+ Затухание
+ </string>
+ <string name="Bushy Eyebrows">
+ КуÑтиÑтые брови
+ </string>
+ <string name="Bushy Hair">
+ Пышные
+ </string>
+ <string name="Butt Size">
+ Размер зада
+ </string>
+ <string name="Butt Gravity">
+ ОбвиÑлоÑть зада
+ </string>
+ <string name="bustle skirt">
+ Турнюр
+ </string>
+ <string name="no bustle">
+ Без турнюра
+ </string>
+ <string name="more bustle">
+ Большой турнюр
+ </string>
+ <string name="Chaplin">
+ «Чарли Чаплин»
+ </string>
+ <string name="Cheek Bones">
+ Скулы
+ </string>
+ <string name="Chest Size">
+ Размер грудной клетки
+ </string>
+ <string name="Chin Angle">
+ Угол подбородка
+ </string>
+ <string name="Chin Cleft">
+ Ямка на подбородке
+ </string>
+ <string name="Chin Curtains">
+ ШкиперÑÐºÐ°Ñ Ð±Ð¾Ñ€Ð¾Ð´ÐºÐ°
+ </string>
+ <string name="Chin Depth">
+ Толщина подбородка
+ </string>
+ <string name="Chin Heavy">
+ Мощный подбородок
+ </string>
+ <string name="Chin In">
+ Подбородок внутрь
+ </string>
+ <string name="Chin Out">
+ Подбородок наружу
+ </string>
+ <string name="Chin-Neck">
+ Переход от подбородка к шее
+ </string>
+ <string name="Clear">
+ ЧиÑтый
+ </string>
+ <string name="Cleft">
+ Ямка
+ </string>
+ <string name="Close Set Eyes">
+ Близко поÑаженные
+ </string>
+ <string name="Closed">
+ Закрыто
+ </string>
+ <string name="Closed Back">
+ Закрыто Ñзади
+ </string>
+ <string name="Closed Front">
+ Закрыто Ñпереди
+ </string>
+ <string name="Closed Left">
+ Закрыто Ñлева
+ </string>
+ <string name="Closed Right">
+ Закрыто Ñправа
+ </string>
+ <string name="Coin Purse">
+ Кошелек Ð´Ð»Ñ Ð¼ÐµÐ»Ð¾Ñ‡Ð¸
+ </string>
+ <string name="Collar Back">
+ Вырез Ñзади
+ </string>
+ <string name="Collar Front">
+ Вырез Ñпереди
+ </string>
+ <string name="Corner Down">
+ Уголки опущены
+ </string>
+ <string name="Corner Up">
+ Уголки поднÑты
+ </string>
+ <string name="Creased">
+ ИзмÑтый
+ </string>
+ <string name="Crooked Nose">
+ ИÑкривленный ноÑ
+ </string>
+ <string name="Cuff Flare">
+ Манжеты
+ </string>
+ <string name="Dark">
+ Темный
+ </string>
+ <string name="Dark Green">
+ Темно-зеленый
+ </string>
+ <string name="Darker">
+ Темнее
+ </string>
+ <string name="Deep">
+ Глубоко
+ </string>
+ <string name="Default Heels">
+ Стандартные каблуки
+ </string>
+ <string name="Dense">
+ ГуÑтые
+ </string>
+ <string name="Double Chin">
+ Двойной подбородок
+ </string>
+ <string name="Downturned">
+ Вниз
+ </string>
+ <string name="Duffle Bag">
+ Больше
+ </string>
+ <string name="Ear Angle">
+ ОттопыренноÑть ушей
+ </string>
+ <string name="Ear Size">
+ Размер ушей
+ </string>
+ <string name="Ear Tips">
+ Кончики ушей
+ </string>
+ <string name="Egg Head">
+ ЯйцеголовоÑть
+ </string>
+ <string name="Eye Bags">
+ Мешки под глазами
+ </string>
+ <string name="Eye Color">
+ Цвет глаз
+ </string>
+ <string name="Eye Depth">
+ Глубина глаз
+ </string>
+ <string name="Eye Lightness">
+ СветлоÑть глаз
+ </string>
+ <string name="Eye Opening">
+ ОткрытоÑть глаз
+ </string>
+ <string name="Eye Pop">
+ Вытаращить глаз
+ </string>
+ <string name="Eye Size">
+ Размер глаз
+ </string>
+ <string name="Eye Spacing">
+ РаÑÑтоÑние между глазами
+ </string>
+ <string name="Eyebrow Arc">
+ Ð›Ð¸Ð½Ð¸Ñ Ð±Ñ€Ð¾Ð²ÐµÐ¹
+ </string>
+ <string name="Eyebrow Density">
+ ГуÑтота бровей
+ </string>
+ <string name="Eyebrow Height">
+ Ð’Ñ‹Ñота бровей
+ </string>
+ <string name="Eyebrow Points">
+ Кончики бровей
+ </string>
+ <string name="Eyebrow Size">
+ Размер бровей
+ </string>
+ <string name="Eyelash Length">
+ Длина реÑниц
+ </string>
+ <string name="Eyeliner">
+ Подводка
+ </string>
+ <string name="Eyeliner Color">
+ Цвет подводки
+ </string>
+ <string name="Eyes Bugged">
+ Выпученные глаза
+ </string>
+ <string name="Face Shear">
+ ÐŸÐµÑ€ÐµÐºÐ¾Ñ Ð»Ð¸Ñ†Ð°
+ </string>
+ <string name="Facial Definition">
+ Черты лица
+ </string>
+ <string name="Far Set Eyes">
+ Широко раÑÑтавленные глаза
+ </string>
+ <string name="Fat Lips">
+ ТолÑтые губы
+ </string>
+ <string name="Female">
+ Женщина
+ </string>
+ <string name="Fingerless">
+ Без пальцев
+ </string>
+ <string name="Fingers">
+ С пальцами
+ </string>
+ <string name="Flared Cuffs">
+ С манжетами
+ </string>
+ <string name="Flat">
+ ПлоÑкие
+ </string>
+ <string name="Flat Butt">
+ ПлоÑкий зад
+ </string>
+ <string name="Flat Head">
+ ПлоÑÐºÐ°Ñ Ð³Ð¾Ð»Ð¾Ð²Ð°
+ </string>
+ <string name="Flat Toe">
+ ПлоÑкий ноÑок
+ </string>
+ <string name="Foot Size">
+ Размер Ñтупни
+ </string>
+ <string name="Forehead Angle">
+ Ðаклон лба
+ </string>
+ <string name="Forehead Heavy">
+ Мощный лоб
+ </string>
+ <string name="Freckles">
+ ВеÑнушки
+ </string>
+ <string name="Front Fringe">
+ Челка Ñпереди
+ </string>
+ <string name="Full Back">
+ ПолноÑтью назад
+ </string>
+ <string name="Full Eyeliner">
+ Подводка полноÑтью
+ </string>
+ <string name="Full Front">
+ ПолноÑтью наперед
+ </string>
+ <string name="Full Hair Sides">
+ ВолоÑÑ‹ по бокам
+ </string>
+ <string name="Full Sides">
+ По бокам
+ </string>
+ <string name="Glossy">
+ БлеÑÑ‚Ñщие
+ </string>
+ <string name="Glove Fingers">
+ Пальцы перчаток
+ </string>
+ <string name="Glove Length">
+ Длина перчаток
+ </string>
+ <string name="Hair">
+ ВолоÑÑ‹
+ </string>
+ <string name="Hair Back">
+ ВолоÑÑ‹: Ñзади
+ </string>
+ <string name="Hair Front">
+ ВолоÑÑ‹: Ñпереди
+ </string>
+ <string name="Hair Sides">
+ ВолоÑÑ‹: по бокам
+ </string>
+ <string name="Hair Sweep">
+ ВолоÑÑ‹ на глаза
+ </string>
+ <string name="Hair Thickess">
+ Толщина волоÑ
+ </string>
+ <string name="Hair Thickness">
+ Толщина волоÑ
+ </string>
+ <string name="Hair Tilt">
+ ЗачеÑ
+ </string>
+ <string name="Hair Tilted Left">
+ Ð—Ð°Ñ‡ÐµÑ Ð½Ð°Ð·Ð°Ð´
+ </string>
+ <string name="Hair Tilted Right">
+ Ð—Ð°Ñ‡ÐµÑ Ð²Ð¿Ñ€Ð°Ð²Ð¾
+ </string>
+ <string name="Hair Volume">
+ ВолоÑÑ‹: объем
+ </string>
+ <string name="Hand Size">
+ Размер киÑти
+ </string>
+ <string name="Handlebars">
+ Длинные уÑÑ‹
+ </string>
+ <string name="Head Length">
+ Длина головы
+ </string>
+ <string name="Head Shape">
+ Форма головы
+ </string>
+ <string name="Head Size">
+ Размер головы
+ </string>
+ <string name="Head Stretch">
+ ВытÑнутоÑть головы
+ </string>
+ <string name="Heel Height">
+ Ð’Ñ‹Ñота каблука
+ </string>
+ <string name="Heel Shape">
+ Форма каблука
+ </string>
+ <string name="Height">
+ РоÑÑ‚
+ </string>
+ <string name="High">
+ Ð’Ñ‹Ñокие
+ </string>
+ <string name="High Heels">
+ Ð’Ñ‹Ñокий каблук
+ </string>
+ <string name="High Jaw">
+ ЧелюÑть выÑоко
+ </string>
+ <string name="High Platforms">
+ Ð’Ñ‹ÑÐ¾ÐºÐ°Ñ Ð¿Ð»Ð°Ñ‚Ñ„Ð¾Ñ€Ð¼Ð°
+ </string>
+ <string name="High and Tight">
+ Ð’Ñ‹Ñокий и плотный
+ </string>
+ <string name="Higher">
+ Выше
+ </string>
+ <string name="Hip Length">
+ Длина бедер
+ </string>
+ <string name="Hip Width">
+ Ширина бедер
+ </string>
+ <string name="In">
+ Внутрь
+ </string>
+ <string name="In Shdw Color">
+ Цвет внутренних теней
+ </string>
+ <string name="In Shdw Opacity">
+ ПрозрачноÑть внутр. теней
+ </string>
+ <string name="Inner Eye Corner">
+ Внутренние уголки глаз
+ </string>
+ <string name="Inner Eye Shadow">
+ Тени на внутренних уголках
+ </string>
+ <string name="Inner Shadow">
+ Внутренние тени
+ </string>
+ <string name="Jacket Length">
+ Длина пиджака
+ </string>
+ <string name="Jacket Wrinkles">
+ СмÑтый пиджак
+ </string>
+ <string name="Jaw Angle">
+ Угол челюÑти
+ </string>
+ <string name="Jaw Jut">
+ Ð’Ñ‹Ñтупание челюÑти
+ </string>
+ <string name="Jaw Shape">
+ Форма челюÑти
+ </string>
+ <string name="Join">
+ Прикрепить
+ </string>
+ <string name="Jowls">
+ Щеки
+ </string>
+ <string name="Knee Angle">
+ Угол колен
+ </string>
+ <string name="Knock Kneed">
+ Колченогие
+ </string>
+ <string name="Large">
+ Больше
+ </string>
+ <string name="Large Hands">
+ Большие киÑти
+ </string>
+ <string name="Left Part">
+ Левый пробор
+ </string>
+ <string name="Leg Length">
+ Длина ног
+ </string>
+ <string name="Leg Muscles">
+ Мышцы на ногах
+ </string>
+ <string name="Less">
+ Меньше
+ </string>
+ <string name="Less Body Fat">
+ Меньше жира
+ </string>
+ <string name="Less Curtains">
+ Меньше борода
+ </string>
+ <string name="Less Freckles">
+ Меньше веÑнушек
+ </string>
+ <string name="Less Full">
+ Менее полное
+ </string>
+ <string name="Less Gravity">
+ Меньше притÑжениÑ
+ </string>
+ <string name="Less Love">
+ Меньше
+ </string>
+ <string name="Less Muscles">
+ Меньше мышц
+ </string>
+ <string name="Less Muscular">
+ Меньше мышц
+ </string>
+ <string name="Less Rosy">
+ Меньше румÑн
+ </string>
+ <string name="Less Round">
+ Меньше округлоÑти
+ </string>
+ <string name="Less Saddle">
+ Меньше
+ </string>
+ <string name="Less Square">
+ Меньше угловатоÑти
+ </string>
+ <string name="Less Volume">
+ Меньше объема
+ </string>
+ <string name="Less soul">
+ Меньше
+ </string>
+ <string name="Lighter">
+ Светлее
+ </string>
+ <string name="Lip Cleft">
+ Ямка между губ
+ </string>
+ <string name="Lip Cleft Depth">
+ Глубина Ñмки
+ </string>
+ <string name="Lip Fullness">
+ Полнота губ
+ </string>
+ <string name="Lip Pinkness">
+ РозоватоÑть губ
+ </string>
+ <string name="Lip Ratio">
+ ÐŸÑ€Ð¾Ð¿Ð¾Ñ€Ñ†Ð¸Ñ Ð³ÑƒÐ±
+ </string>
+ <string name="Lip Thickness">
+ Толщина губ
+ </string>
+ <string name="Lip Width">
+ Ширина губ
+ </string>
+ <string name="Lipgloss">
+ БлеÑк губ
+ </string>
+ <string name="Lipstick">
+ Ð“ÑƒÐ±Ð½Ð°Ñ Ð¿Ð¾Ð¼Ð°Ð´Ð°
+ </string>
+ <string name="Lipstick Color">
+ Цвет помады
+ </string>
+ <string name="Long">
+ Длиннее
+ </string>
+ <string name="Long Head">
+ Ð”Ð»Ð¸Ð½Ð½Ð°Ñ Ð³Ð¾Ð»Ð¾Ð²Ð°
+ </string>
+ <string name="Long Hips">
+ Длинные бедра
+ </string>
+ <string name="Long Legs">
+ Длинные ноги
+ </string>
+ <string name="Long Neck">
+ Ð”Ð»Ð¸Ð½Ð½Ð°Ñ ÑˆÐµÑ
+ </string>
+ <string name="Long Pigtails">
+ Длинные хвоÑты по бокам
+ </string>
+ <string name="Long Ponytail">
+ Длинный хвоÑÑ‚ Ñзади
+ </string>
+ <string name="Long Torso">
+ Длинный торÑ
+ </string>
+ <string name="Long arms">
+ Длинные руки
+ </string>
+ <string name="Loose Pants">
+ Свободные брюки
+ </string>
+ <string name="Loose Shirt">
+ Ð¡Ð²Ð¾Ð±Ð¾Ð´Ð½Ð°Ñ Ñ€ÑƒÐ±Ð°ÑˆÐºÐ°
+ </string>
+ <string name="Loose Sleeves">
+ Свободные рукава
+ </string>
+ <string name="Love Handles">
+ ÐžÑ‚Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð½Ð° талии
+ </string>
+ <string name="Low">
+ Ðизкие
+ </string>
+ <string name="Low Heels">
+ Ðизкий каблук
+ </string>
+ <string name="Low Jaw">
+ ЧелюÑть низко
+ </string>
+ <string name="Low Platforms">
+ ÐÐ¸Ð·ÐºÐ°Ñ Ð¿Ð»Ð°Ñ‚Ñ„Ð¾Ñ€Ð¼Ð°
+ </string>
+ <string name="Low and Loose">
+ Ðизкий и Ñвободный
+ </string>
+ <string name="Lower">
+ Ðиже
+ </string>
+ <string name="Lower Bridge">
+ Спинка ноÑа
+ </string>
+ <string name="Lower Cheeks">
+ Щеки ниже
+ </string>
+ <string name="Male">
+ Мужчина
+ </string>
+ <string name="Middle Part">
+ Пробор по центру
+ </string>
+ <string name="More">
+ Больше
+ </string>
+ <string name="More Blush">
+ Больше румÑн
+ </string>
+ <string name="More Body Fat">
+ Больше жира
+ </string>
+ <string name="More Curtains">
+ Больше борода
+ </string>
+ <string name="More Eyeshadow">
+ Больше теней
+ </string>
+ <string name="More Freckles">
+ Больше веÑнушек
+ </string>
+ <string name="More Full">
+ Более полное
+ </string>
+ <string name="More Gravity">
+ Большее притÑжение
+ </string>
+ <string name="More Lipstick">
+ Больше помады
+ </string>
+ <string name="More Love">
+ Больше
+ </string>
+ <string name="More Lower Lip">
+ Больше нижнÑÑ Ð³ÑƒÐ±Ð°
+ </string>
+ <string name="More Muscles">
+ Больше мышц
+ </string>
+ <string name="More Muscular">
+ Больше мышц
+ </string>
+ <string name="More Rosy">
+ Больше румÑнца
+ </string>
+ <string name="More Round">
+ Больше округлоÑти
+ </string>
+ <string name="More Saddle">
+ Больше
+ </string>
+ <string name="More Sloped">
+ Более наклонный
+ </string>
+ <string name="More Square">
+ Более квадратнаÑ
+ </string>
+ <string name="More Upper Lip">
+ Больше верхнÑÑ Ð³ÑƒÐ±Ð°
+ </string>
+ <string name="More Vertical">
+ Более вертикальный
+ </string>
+ <string name="More Volume">
+ Больше объема
+ </string>
+ <string name="More soul">
+ Больше
+ </string>
+ <string name="Moustache">
+ УÑÑ‹
+ </string>
+ <string name="Mouth Corner">
+ Угол рта
+ </string>
+ <string name="Mouth Position">
+ Положение рта
+ </string>
+ <string name="Mowhawk">
+ Ирокез
+ </string>
+ <string name="Muscular">
+ МуÑкулиÑтое
+ </string>
+ <string name="Mutton Chops">
+ Бакенбарды
+ </string>
+ <string name="Nail Polish">
+ Лак Ð´Ð»Ñ Ð½Ð¾Ð³Ñ‚ÐµÐ¹
+ </string>
+ <string name="Nail Polish Color">
+ Цвет лака
+ </string>
+ <string name="Narrow">
+ Узко
+ </string>
+ <string name="Narrow Back">
+ Узко Ñзади
+ </string>
+ <string name="Narrow Front">
+ Узкий перед
+ </string>
+ <string name="Narrow Lips">
+ Узкие губы
+ </string>
+ <string name="Natural">
+ ЕÑтеÑтвенный
+ </string>
+ <string name="Neck Length">
+ Длина шеи
+ </string>
+ <string name="Neck Thickness">
+ Толщина шеи
+ </string>
+ <string name="No Blush">
+ Без румÑн
+ </string>
+ <string name="No Eyeliner">
+ Без подводки
+ </string>
+ <string name="No Eyeshadow">
+ Без теней
+ </string>
+ <string name="No Lipgloss">
+ Без блеÑка
+ </string>
+ <string name="No Lipstick">
+ Без помады
+ </string>
+ <string name="No Part">
+ Без пробора
+ </string>
+ <string name="No Polish">
+ Без лака
+ </string>
+ <string name="No Red">
+ Ðе краÑные
+ </string>
+ <string name="No Spikes">
+ Без «шипов»
+ </string>
+ <string name="No White">
+ Ðет белого
+ </string>
+ <string name="No Wrinkles">
+ Без морщин
+ </string>
+ <string name="Normal Lower">
+ Ðиже обычного
+ </string>
+ <string name="Normal Upper">
+ Выше обычного
+ </string>
+ <string name="Nose Left">
+ ÐÐ¾Ñ Ð²Ð»ÐµÐ²Ð¾
+ </string>
+ <string name="Nose Right">
+ ÐÐ¾Ñ Ð²Ð¿Ñ€Ð°Ð²Ð¾
+ </string>
+ <string name="Nose Size">
+ Размер ноÑа
+ </string>
+ <string name="Nose Thickness">
+ Толщина ноÑа
+ </string>
+ <string name="Nose Tip Angle">
+ ЗагнутоÑть кончика ноÑа
+ </string>
+ <string name="Nose Tip Shape">
+ Форма кончика ноÑа
+ </string>
+ <string name="Nose Width">
+ Ширина ноÑа
+ </string>
+ <string name="Nostril Division">
+ Перегородка
+ </string>
+ <string name="Nostril Width">
+ Ширина ноздрей
+ </string>
+ <string name="Opaque">
+ Ðепрозрачный
+ </string>
+ <string name="Open">
+ Открыто
+ </string>
+ <string name="Open Back">
+ Открыто Ñзади
+ </string>
+ <string name="Open Front">
+ Открыто Ñпереди
+ </string>
+ <string name="Open Left">
+ Открыто Ñлева
+ </string>
+ <string name="Open Right">
+ Открыто Ñправа
+ </string>
+ <string name="Orange">
+ Оранжевый
+ </string>
+ <string name="Out">
+ Ðаружу
+ </string>
+ <string name="Out Shdw Color">
+ Цвет внешних теней
+ </string>
+ <string name="Out Shdw Opacity">
+ ПрозрачноÑть внеш. теней
+ </string>
+ <string name="Outer Eye Corner">
+ Внешние уголки глаз
+ </string>
+ <string name="Outer Eye Shadow">
+ Тени во внешних уголках
+ </string>
+ <string name="Outer Shadow">
+ Внешние тени
+ </string>
+ <string name="Overbite">
+ Глубокий прикуÑ
+ </string>
+ <string name="Package">
+ Гульфик
+ </string>
+ <string name="Painted Nails">
+ Покрашенные
+ </string>
+ <string name="Pale">
+ Бледный
+ </string>
+ <string name="Pants Crotch">
+ Шаг
+ </string>
+ <string name="Pants Fit">
+ Облегающие брюки
+ </string>
+ <string name="Pants Length">
+ Длина
+ </string>
+ <string name="Pants Waist">
+ Ð¢Ð°Ð»Ð¸Ñ Ð±Ñ€ÑŽÐº
+ </string>
+ <string name="Pants Wrinkles">
+ СмÑтоÑть брюк
+ </string>
+ <string name="Part">
+ Пробор
+ </string>
+ <string name="Part Bangs">
+ Челка Ñ Ð¿Ñ€Ð¾Ð±Ð¾Ñ€Ð¾Ð¼
+ </string>
+ <string name="Pectorals">
+ Грудные мышцы
+ </string>
+ <string name="Pigment">
+ ПигментациÑ
+ </string>
+ <string name="Pigtails">
+ ХвоÑты по бокам
+ </string>
+ <string name="Pink">
+ Розовый
+ </string>
+ <string name="Pinker">
+ Розовее
+ </string>
+ <string name="Platform Height">
+ Ð’Ñ‹Ñота платформы
+ </string>
+ <string name="Platform Width">
+ Ширина платформы
+ </string>
+ <string name="Pointy">
+ ОÑтрые
+ </string>
+ <string name="Pointy Heels">
+ ОÑтрый каблук
+ </string>
+ <string name="Ponytail">
+ ХвоÑÑ‚ Ñзади
+ </string>
+ <string name="Poofy Skirt">
+ ÐŸÑ‹ÑˆÐ½Ð°Ñ ÑŽÐ±ÐºÐ°
+ </string>
+ <string name="Pop Left Eye">
+ Левый глаз
+ </string>
+ <string name="Pop Right Eye">
+ Правый глаз
+ </string>
+ <string name="Puffy">
+ Пухлые
+ </string>
+ <string name="Puffy Eyelids">
+ ПрипухлоÑть век
+ </string>
+ <string name="Rainbow Color">
+ Цвета радуги
+ </string>
+ <string name="Red Hair">
+ Рыжие волоÑÑ‹
+ </string>
+ <string name="Regular">
+ Обычное
+ </string>
+ <string name="Right Part">
+ Правый пробор
+ </string>
+ <string name="Rosy Complexion">
+ Розовое лицо
+ </string>
+ <string name="Round">
+ Круглое
+ </string>
+ <string name="Ruddiness">
+ РумÑнец
+ </string>
+ <string name="Ruddy">
+ РумÑный
+ </string>
+ <string name="Rumpled Hair">
+ Взъерошенные
+ </string>
+ <string name="Saddle Bags">
+ Галифе
+ </string>
+ <string name="Scrawny Leg">
+ Ð¡ÑƒÑ…Ð¾Ð¿Ð°Ñ€Ð°Ñ Ð½Ð¾Ð³Ð°
+ </string>
+ <string name="Separate">
+ Разделить
+ </string>
+ <string name="Shallow">
+ Мелко
+ </string>
+ <string name="Shear Back">
+ Ð¡ÐºÐ¾Ñ Ñзади
+ </string>
+ <string name="Shear Face">
+ ÐŸÐµÑ€ÐµÐºÐ¾Ñ Ð»Ð¸Ñ†Ð°
+ </string>
+ <string name="Shear Front">
+ Ð¡ÐºÐ¾Ñ Ñпереди
+ </string>
+ <string name="Shear Left Up">
+ Ð¡ÐºÐ¾Ñ Ð²Ð»ÐµÐ²Ð¾ вверх
+ </string>
+ <string name="Shear Right Up">
+ Ð¡ÐºÐ¾Ñ Ð²Ð¿Ñ€Ð°Ð²Ð¾ вверх
+ </string>
+ <string name="Sheared Back">
+ Уменьшено Ñзади
+ </string>
+ <string name="Sheared Front">
+ Уменьшено Ñпереди
+ </string>
+ <string name="Shift Left">
+ Сдвинуть влево
+ </string>
+ <string name="Shift Mouth">
+ Сдвинуть рот
+ </string>
+ <string name="Shift Right">
+ Сдвинуть вправо
+ </string>
+ <string name="Shirt Bottom">
+ Ðиз рубашки
+ </string>
+ <string name="Shirt Fit">
+ Облегание рубашки
+ </string>
+ <string name="Shirt Wrinkles">
+ ПомÑтоÑть рубашки
+ </string>
+ <string name="Shoe Height">
+ Ð’Ñ‹Ñота обуви
+ </string>
+ <string name="Short">
+ Ðиже
+ </string>
+ <string name="Short Arms">
+ Короткие руки
+ </string>
+ <string name="Short Legs">
+ Короткие ноги
+ </string>
+ <string name="Short Neck">
+ ÐšÐ¾Ñ€Ð¾Ñ‚ÐºÐ°Ñ ÑˆÐµÑ
+ </string>
+ <string name="Short Pigtails">
+ Короткие хвоÑты по бокам
+ </string>
+ <string name="Short Ponytail">
+ Короткий хвоÑÑ‚ Ñзади
+ </string>
+ <string name="Short Sideburns">
+ Короткие баки
+ </string>
+ <string name="Short Torso">
+ Короткий торÑ
+ </string>
+ <string name="Short hips">
+ Короткие бедра
+ </string>
+ <string name="Shoulders">
+ Плечи
+ </string>
+ <string name="Side Fringe">
+ Челка набок
+ </string>
+ <string name="Sideburns">
+ Бакенбарды
+ </string>
+ <string name="Sides Hair">
+ ВолоÑÑ‹ по бокам
+ </string>
+ <string name="Sides Hair Down">
+ ВолоÑÑ‹ по бокам внизу
+ </string>
+ <string name="Sides Hair Up">
+ ВолоÑÑ‹ по бокам вверху
+ </string>
+ <string name="Skinny Neck">
+ Ð¥ÑƒÐ´Ð°Ñ ÑˆÐµÑ
+ </string>
+ <string name="Skirt Fit">
+ ÐžÐ±Ð»ÐµÐ³Ð°ÑŽÑ‰Ð°Ñ ÑŽÐ±ÐºÐ°
+ </string>
+ <string name="Skirt Length">
+ Длина юбки
+ </string>
+ <string name="Slanted Forehead">
+ Ðаклонный лоб
+ </string>
+ <string name="Sleeve Length">
+ Длина рукавов
+ </string>
+ <string name="Sleeve Looseness">
+ Ширина рукавов
+ </string>
+ <string name="Slit Back">
+ Разрез: Ñзади
+ </string>
+ <string name="Slit Front">
+ Разрез: Ñпереди
+ </string>
+ <string name="Slit Left">
+ Разрез: Ñлева
+ </string>
+ <string name="Slit Right">
+ Разрез: Ñправа
+ </string>
+ <string name="Small">
+ Меньше
+ </string>
+ <string name="Small Hands">
+ Маленькие киÑти
+ </string>
+ <string name="Small Head">
+ ÐœÐ°Ð»ÐµÐ½ÑŒÐºÐ°Ñ Ð³Ð¾Ð»Ð¾Ð²Ð°
+ </string>
+ <string name="Smooth">
+ Гладко
+ </string>
+ <string name="Smooth Hair">
+ Приглаженные
+ </string>
+ <string name="Socks Length">
+ Длина ноÑков
+ </string>
+ <string name="Soulpatch">
+ ЭÑпаньолка
+ </string>
+ <string name="Sparse">
+ Жидкие
+ </string>
+ <string name="Spiked Hair">
+ ПричеÑка «шипами»
+ </string>
+ <string name="Square">
+ Квадратный
+ </string>
+ <string name="Square Toe">
+ Квадратный ноÑок
+ </string>
+ <string name="Squash Head">
+ Голова-тыква
+ </string>
+ <string name="Stretch Head">
+ ВытÑнутоÑть головы
+ </string>
+ <string name="Sunken">
+ Впалые
+ </string>
+ <string name="Sunken Chest">
+ Ð’Ð¿Ð°Ð»Ð°Ñ Ð³Ñ€ÑƒÐ´ÑŒ
+ </string>
+ <string name="Sunken Eyes">
+ Впалые глаза
+ </string>
+ <string name="Sweep Back">
+ ЗачеÑанные назад
+ </string>
+ <string name="Sweep Forward">
+ ЗачеÑанные вперед
+ </string>
+ <string name="Tall">
+ Выше
+ </string>
+ <string name="Taper Back">
+ ÐšÐ¾Ð½ÑƒÑ Ñзади
+ </string>
+ <string name="Taper Front">
+ ÐšÐ¾Ð½ÑƒÑ Ñпереди
+ </string>
+ <string name="Thick Heels">
+ Широкий каблук
+ </string>
+ <string name="Thick Neck">
+ ТолÑÑ‚Ð°Ñ ÑˆÐµÑ
+ </string>
+ <string name="Thick Toe">
+ ТолÑтый ноÑок
+ </string>
+ <string name="Thin">
+ Тонкий
+ </string>
+ <string name="Thin Eyebrows">
+ Тонкие брови
+ </string>
+ <string name="Thin Lips">
+ Тонкие губы
+ </string>
+ <string name="Thin Nose">
+ Тонкий ноÑ
+ </string>
+ <string name="Tight Chin">
+ Тонкий подбородок
+ </string>
+ <string name="Tight Cuffs">
+ Манжеты на резинке
+ </string>
+ <string name="Tight Pants">
+ Облегающие брюки
+ </string>
+ <string name="Tight Shirt">
+ ÐžÐ±Ð»ÐµÐ³Ð°ÑŽÑ‰Ð°Ñ Ñ€ÑƒÐ±Ð°ÑˆÐºÐ°
+ </string>
+ <string name="Tight Skirt">
+ ÐžÐ±Ð»ÐµÐ³Ð°ÑŽÑ‰Ð°Ñ ÑŽÐ±ÐºÐ°
+ </string>
+ <string name="Tight Sleeves">
+ Облегающие рукава
+ </string>
+ <string name="Toe Shape">
+ Форма ноÑка
+ </string>
+ <string name="Toe Thickness">
+ Толщина ноÑка
+ </string>
+ <string name="Torso Length">
+ Длина торÑа
+ </string>
+ <string name="Torso Muscles">
+ МуÑкулиÑтоÑть торÑа
+ </string>
+ <string name="Torso Scrawny">
+ СухопароÑть торÑа
+ </string>
+ <string name="Unattached">
+ Ðе прикреплено
+ </string>
+ <string name="Uncreased">
+ Без Ñкладок
+ </string>
+ <string name="Underbite">
+ Мезиальный прикуÑ
+ </string>
+ <string name="Unnatural">
+ ÐееÑтеÑтвенный
+ </string>
+ <string name="Upper Bridge">
+ ПереноÑица
+ </string>
+ <string name="Upper Cheeks">
+ Щеки выше
+ </string>
+ <string name="Upper Chin Cleft">
+ Ямка на подбородке выше
+ </string>
+ <string name="Upper Eyelid Fold">
+ Складка верхнего века
+ </string>
+ <string name="Upturned">
+ Вверх
+ </string>
+ <string name="Very Red">
+ Очень краÑные
+ </string>
+ <string name="Waist Height">
+ Ð’Ñ‹Ñота талии
+ </string>
+ <string name="Well-Fed">
+ Упитанные
+ </string>
+ <string name="White Hair">
+ Белые волоÑÑ‹
+ </string>
+ <string name="Wide">
+ Широко
+ </string>
+ <string name="Wide Back">
+ Широко Ñзади
+ </string>
+ <string name="Wide Front">
+ Широкий перед
+ </string>
+ <string name="Wide Lips">
+ Широкие губы
+ </string>
+ <string name="Wild">
+ Безумный
+ </string>
+ <string name="Wrinkles">
+ Складки
+ </string>
+ <string name="LocationCtrlAddLandmarkTooltip">
+ Добавить в закладки
+ </string>
+ <string name="LocationCtrlEditLandmarkTooltip">
+ Изменить закладку
+ </string>
+ <string name="LocationCtrlInfoBtnTooltip">
+ ПоÑмотреть подробную информацию о текущем меÑте
+ </string>
+ <string name="LocationCtrlComboBtnTooltip">
+ ÐœÐ¾Ñ Ð¸ÑÑ‚Ð¾Ñ€Ð¸Ñ Ð¿Ð¾Ñещений
+ </string>
+ <string name="LocationCtrlForSaleTooltip">
+ Купить Ñту землю
+ </string>
+ <string name="LocationCtrlVoiceTooltip">
+ ГолоÑовое общение здеÑÑŒ недоÑтупно
+ </string>
+ <string name="LocationCtrlFlyTooltip">
+ Полеты запрещены
+ </string>
+ <string name="LocationCtrlPushTooltip">
+ ÐÐµÐ»ÑŒÐ·Ñ Ñ‚Ð¾Ð»ÐºÐ°Ñ‚ÑŒÑÑ
+ </string>
+ <string name="LocationCtrlBuildTooltip">
+ СтроительÑтво/выкладывание объектов не разрешено
+ </string>
+ <string name="LocationCtrlScriptsTooltip">
+ ЗапуÑкать Ñкрипты запрещено
+ </string>
+ <string name="LocationCtrlDamageTooltip">
+ Здоровье
+ </string>
+ <string name="LocationCtrlAdultIconTooltip">
+ ОблаÑть Ð´Ð»Ñ Ð²Ð·Ñ€Ð¾Ñлых
+ </string>
+ <string name="LocationCtrlModerateIconTooltip">
+ ОблаÑть умеренной дозволенноÑти
+ </string>
+ <string name="LocationCtrlGeneralIconTooltip">
+ ОблаÑть общей дозволенноÑти
+ </string>
+ <string name="LocationCtrlSeeAVsTooltip">
+ Ð’Ñе жители Ñ Ð´Ñ€ÑƒÐ³Ð¸Ñ… учаÑтков могут видеть аватары и общатьÑÑ Ð² чате
+ </string>
+ <string name="UpdaterWindowTitle">
+ Обновление [APP_NAME]
+ </string>
+ <string name="UpdaterNowUpdating">
+ ОбновлÑетÑÑ [APP_NAME]...
+ </string>
+ <string name="UpdaterNowInstalling">
+ УÑтанавливаетÑÑ [APP_NAME]...
+ </string>
+ <string name="UpdaterUpdatingDescriptive">
+ Клиент [APP_NAME] обновлÑетÑÑ Ð´Ð¾ поÑледнего выпуÑка. Это может занÑть какое-то времÑ. ПроÑвите терпение.
+ </string>
+ <string name="UpdaterProgressBarTextWithEllipses">
+ Загрузка обновлениÑ...
+ </string>
+ <string name="UpdaterProgressBarText">
+ ЗагружаетÑÑ Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ðµ
+ </string>
+ <string name="UpdaterFailDownloadTitle">
+ Ðе удалоÑÑŒ загрузить обновление
+ </string>
+ <string name="UpdaterFailUpdateDescriptive">
+ При обновлении Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ [APP_NAME] возникла ошибка. Загрузите новую верÑию на Ñайте www.secondlife.com.
+ </string>
+ <string name="UpdaterFailInstallTitle">
+ Ðе удалоÑÑŒ уÑтановить обновление
+ </string>
+ <string name="UpdaterFailStartTitle">
+ Ðе удалоÑÑŒ запуÑтить клиент
+ </string>
+ <string name="ItemsComingInTooFastFrom">
+ [APP_NAME]: Из-за Ñлишком быÑтрого поÑÑ‚ÑƒÐ¿Ð»ÐµÐ½Ð¸Ñ Ñлементов Ñ [FROM_NAME] автоматичеÑкий проÑмотр отключен на [TIME] Ñ
+ </string>
+ <string name="ItemsComingInTooFast">
+ [APP_NAME]: из-за Ñлишком быÑтрого поÑÑ‚ÑƒÐ¿Ð»ÐµÐ½Ð¸Ñ Ñлементов автоматичеÑкий проÑмотр отключен на [TIME] Ñ
+ </string>
+ <string name="IM_logging_string">
+ -- Включена региÑÑ‚Ñ€Ð°Ñ†Ð¸Ñ Ñообщений IM --
+ </string>
+ <string name="IM_typing_start_string">
+ [NAME] вводит текÑÑ‚...
+ </string>
+ <string name="Unnamed">
+ (Без имени)
+ </string>
+ <string name="IM_moderated_chat_label">
+ (МодерируетÑÑ: голоÑа по умолчанию отключены)
+ </string>
+ <string name="IM_unavailable_text_label">
+ Во Ð²Ñ€ÐµÐ¼Ñ Ñтого звонка текÑтовый чат недоÑтупен.
+ </string>
+ <string name="IM_muted_text_label">
+ Ваш текÑтовый чат отключен модератором группы.
+ </string>
+ <string name="IM_default_text_label">
+ Щелкните здеÑÑŒ, чтобы Ñоздать IM-Ñообщение.
+ </string>
+ <string name="IM_to_label">
+ Кому
+ </string>
+ <string name="IM_moderator_label">
+ (Модератор)
+ </string>
+ <string name="Saved_message">
+ (Сохранено [LONG_TIMESTAMP])
+ </string>
+ <string name="IM_unblock_only_groups_friends">
+ Ð”Ð»Ñ Ð¿Ñ€Ð¾Ñмотра Ñтого ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ñнимите флажок «Только Ð´Ñ€ÑƒÐ·ÑŒÑ Ð¸ группы могут звонить мне и отправлÑть IM» в окне «ÐаÑтройки/ПриватноÑть».
+ </string>
+ <string name="answered_call">
+ Ðа ваш звонок ответили
+ </string>
+ <string name="you_started_call">
+ Ð’Ñ‹ начали голоÑовую беÑеду
+ </string>
+ <string name="you_joined_call">
+ Ð’Ñ‹ приÑоединилиÑÑŒ к голоÑовой беÑеде
+ </string>
+ <string name="name_started_call">
+ Житель [NAME] начал голоÑовую беÑеду
+ </string>
+ <string name="ringing-im">
+ ПриÑоединение к голоÑовой беÑеде...
+ </string>
+ <string name="connected-im">
+ Соединение уÑтановлено. Выберите команду «Прервать звонок», чтобы повеÑить трубку
+ </string>
+ <string name="hang_up-im">
+ ГолоÑовой звонок прерван
+ </string>
+ <string name="answering-im">
+ СоединÑетÑÑ...
+ </string>
+ <string name="conference-title">
+ Ð¡Ð¿Ð¾Ð½Ñ‚Ð°Ð½Ð½Ð°Ñ ÐºÐ¾Ð½Ñ„ÐµÑ€ÐµÐ½Ñ†Ð¸Ñ
+ </string>
+ <string name="conference-title-incoming">
+ ÐšÐ¾Ð½Ñ„ÐµÑ€ÐµÐ½Ñ†Ð¸Ñ Ñ Ð¶Ð¸Ñ‚ÐµÐ»ÐµÐ¼ [AGENT_NAME]
+ </string>
+ <string name="inventory_item_offered-im">
+ Предложено пополнить инвентарь
+ </string>
+ <string name="share_alert">
+ ПеретаÑкивайте вещи из Ð¸Ð½Ð²ÐµÐ½Ñ‚Ð°Ñ€Ñ Ñюда
+ </string>
+ <string name="no_session_message">
+ (Ð¡ÐµÐ°Ð½Ñ IM не ÑущеÑтвует)
+ </string>
+ <string name="only_user_message">
+ Вы – единÑтвенный пользователь в Ñтом ÑеанÑе.
+ </string>
+ <string name="offline_message">
+ [NAME] не в Ñети.
+ </string>
+ <string name="invite_message">
+ Ðажмите кнопку [BUTTON NAME], чтобы учаÑтвовать в Ñтом голоÑовом чате.
+ </string>
+ <string name="muted_message">
+ Ð’Ñ‹ заблокировали Ñтого жителÑ. ЕÑли отправить ему Ñообщение, блок автоматичеÑки ÑниметÑÑ.
+ </string>
+ <string name="generic">
+ Ошибка при запроÑе. Повторите попытку.
+ </string>
+ <string name="generic_request_error">
+ Ошибка при запроÑе. Повторите попытку.
+ </string>
+ <string name="insufficient_perms_error">
+ У Ð²Ð°Ñ Ð½ÐµÐ´Ð¾Ñтаточно разрешений.
+ </string>
+ <string name="session_does_not_exist_error">
+ Ð¡ÐµÐ°Ð½Ñ Ð±Ð¾Ð»ÑŒÑˆÐµ не ÑущеÑтвует
+ </string>
+ <string name="no_ability_error">
+ У Ð²Ð°Ñ Ð½ÐµÑ‚ Ñтой ÑпоÑобноÑти.
+ </string>
+ <string name="no_ability">
+ У Ð²Ð°Ñ Ð½ÐµÑ‚ Ñтой ÑпоÑобноÑти.
+ </string>
+ <string name="not_a_mod_error">
+ Вы – не модератор ÑеанÑа.
+ </string>
+ <string name="muted">
+ Модератор группы отключил Ð´Ð»Ñ Ð²Ð°Ñ Ñ‚ÐµÐºÑтовый чат.
+ </string>
+ <string name="muted_error">
+ Модератор группы отключил Ð´Ð»Ñ Ð²Ð°Ñ Ñ‚ÐµÐºÑтовый чат.
+ </string>
+ <string name="add_session_event">
+ Ðе удаетÑÑ Ð´Ð¾Ð±Ð°Ð²Ð¸Ñ‚ÑŒ пользователей в ÑÐµÐ°Ð½Ñ Ñ‡Ð°Ñ‚Ð° Ñ Ð¶Ð¸Ñ‚ÐµÐ»ÐµÐ¼ [RECIPIENT].
+ </string>
+ <string name="message">
+ Ðе удаетÑÑ Ð¾Ñ‚Ð¿Ñ€Ð°Ð²Ð¸Ñ‚ÑŒ ваше Ñообщение в ÑÐµÐ°Ð½Ñ Ñ‡Ð°Ñ‚Ð° Ñ Ð¶Ð¸Ñ‚ÐµÐ»ÐµÐ¼ [RECIPIENT].
+ </string>
+ <string name="message_session_event">
+ Ðе удаетÑÑ Ð¾Ñ‚Ð¿Ñ€Ð°Ð²Ð¸Ñ‚ÑŒ ваше Ñообщение в ÑÐµÐ°Ð½Ñ Ñ‡Ð°Ñ‚Ð° Ñ Ð¶Ð¸Ñ‚ÐµÐ»ÐµÐ¼ [RECIPIENT].
+ </string>
+ <string name="mute">
+ Ошибка при модерировании.
+ </string>
+ <string name="removed">
+ Ð’Ñ‹ иÑключены из группы.
+ </string>
+ <string name="removed_from_group">
+ Ð’Ñ‹ иÑключены из группы.
+ </string>
+ <string name="close_on_no_ability">
+ У Ð²Ð°Ñ Ð±Ð¾Ð»ÑŒÑˆÐµ нет возможноÑти учаÑтвовать в ÑеанÑе чата.
+ </string>
+ <string name="unread_chat_single">
+ [SOURCES] Ñказал что-то новое
+ </string>
+ <string name="unread_chat_multiple">
+ [SOURCES] Ñказал что-то новое
+ </string>
+ <string name="session_initialization_timed_out_error">
+ ИÑтекло Ð²Ñ€ÐµÐ¼Ñ Ð¾Ð¶Ð¸Ð´Ð°Ð½Ð¸Ñ Ð¸Ð½Ð¸Ñ†Ð¸Ð°Ð»Ð¸Ð·Ð°Ñ†Ð¸Ð¸ ÑеанÑа
+ </string>
+ <string name="Home position set.">
+ Задано положение дома.
+ </string>
+ <string name="voice_morphing_url">
+ http://secondlife.com/landing/voicemorphing
+ </string>
+ <string name="paid_you_ldollars">
+ Житель [NAME] заплатил вам L$[AMOUNT] за [REASON].
+ </string>
+ <string name="paid_you_ldollars_no_reason">
+ Житель [NAME] заплатил вам L$[AMOUNT].
+ </string>
+ <string name="you_paid_ldollars">
+ Вы заплатили жителю [NAME] L$[AMOUNT] за [REASON].
+ </string>
+ <string name="you_paid_ldollars_no_info">
+ Вы заплатили L$[AMOUNT].
+ </string>
+ <string name="you_paid_ldollars_no_reason">
+ Вы заплатили жителю [NAME] L$[AMOUNT].
+ </string>
+ <string name="you_paid_ldollars_no_name">
+ Вы заплатили L$[AMOUNT] за [REASON].
+ </string>
+ <string name="you_paid_failure_ldollars">
+ Ð’Ñ‹ не Ñмогли заплатить пользователю [NAME] L$[AMOUNT]: [REASON].
+ </string>
+ <string name="you_paid_failure_ldollars_no_info">
+ Ð’Ñ‹ не Ñмогли заплатить L$[AMOUNT]
+ </string>
+ <string name="you_paid_failure_ldollars_no_reason">
+ Ð’Ñ‹ не Ñмогли заплатить пользователю [NAME] L$[AMOUNT]
+ </string>
+ <string name="you_paid_failure_ldollars_no_name">
+ Ð’Ñ‹ не Ñмогли заплатить L$[AMOUNT]: [REASON].
+ </string>
+ <string name="for item">
+ за [ITEM]
+ </string>
+ <string name="for a parcel of land">
+ за земельный учаÑток
+ </string>
+ <string name="for a land access pass">
+ за пропуÑк на землю
+ </string>
+ <string name="for deeding land">
+ за передачу земли
+ </string>
+ <string name="to create a group">
+ за Ñоздание группы
+ </string>
+ <string name="to join a group">
+ за вÑтупление в группу
+ </string>
+ <string name="to upload">
+ за передачу по Ñети
+ </string>
+ <string name="to publish a classified ad">
+ за публикацию рекламы
+ </string>
+ <string name="giving">
+ Уплата L$[AMOUNT]
+ </string>
+ <string name="uploading_costs">
+ Передача Ñтоит L$[AMOUNT]
+ </string>
+ <string name="this_costs">
+ Это Ñтоит L$[AMOUNT]
+ </string>
+ <string name="buying_selected_land">
+ Покупка выбранной земли за L$[AMOUNT]
+ </string>
+ <string name="this_object_costs">
+ Этот объект Ñтоит L$[AMOUNT]
+ </string>
+ <string name="group_role_everyone">
+ Ð’Ñе
+ </string>
+ <string name="group_role_officers">
+ ДолжноÑтные лица
+ </string>
+ <string name="group_role_owners">
+ Владельцы
+ </string>
+ <string name="group_member_status_online">
+ Ð’ Ñети
+ </string>
+ <string name="uploading_abuse_report">
+ ЗагружаетÑÑ...
+
+Жалоба
+ </string>
+ <string name="New Shape">
+ ÐÐ¾Ð²Ð°Ñ Ñ„Ð¸Ð³ÑƒÑ€Ð°
+ </string>
+ <string name="New Skin">
+ ÐÐ¾Ð²Ð°Ñ ÐºÐ¾Ð¶Ð°
+ </string>
+ <string name="New Hair">
+ Ðовые волоÑÑ‹
+ </string>
+ <string name="New Eyes">
+ Ðовые глаза
+ </string>
+ <string name="New Shirt">
+ ÐÐ¾Ð²Ð°Ñ Ñ€ÑƒÐ±Ð°ÑˆÐºÐ°
+ </string>
+ <string name="New Pants">
+ Ðовые брюки
+ </string>
+ <string name="New Shoes">
+ ÐÐ¾Ð²Ð°Ñ Ð¾Ð±ÑƒÐ²ÑŒ
+ </string>
+ <string name="New Socks">
+ Ðовые ноÑки
+ </string>
+ <string name="New Jacket">
+ Ðовый пиджак
+ </string>
+ <string name="New Gloves">
+ Ðовые перчатки
+ </string>
+ <string name="New Undershirt">
+ ÐÐ¾Ð²Ð°Ñ Ð¼Ð°Ð¹ÐºÐ°
+ </string>
+ <string name="New Underpants">
+ Ðовые труÑÑ‹
+ </string>
+ <string name="New Skirt">
+ ÐÐ¾Ð²Ð°Ñ ÑŽÐ±ÐºÐ°
+ </string>
+ <string name="New Alpha">
+ ÐÐ¾Ð²Ð°Ñ Ð°Ð»ÑŒÑ„Ð°-маÑка
+ </string>
+ <string name="New Tattoo">
+ Ðовое тату
+ </string>
+ <string name="New Physics">
+ ÐÐ¾Ð²Ð°Ñ Ñ„Ð¸Ð·Ð¸ÐºÐ°
+ </string>
+ <string name="Invalid Wearable">
+ ÐÐµÐ»ÑŒÐ·Ñ Ð½Ð¾Ñить
+ </string>
+ <string name="New Gesture">
+ Ðовый жеÑÑ‚
+ </string>
+ <string name="New Script">
+ Ðовый Ñкрипт
+ </string>
+ <string name="New Note">
+ ÐÐ¾Ð²Ð°Ñ Ð·Ð°Ð¼ÐµÑ‚ÐºÐ°
+ </string>
+ <string name="New Folder">
+ ÐÐ¾Ð²Ð°Ñ Ð¿Ð°Ð¿ÐºÐ°
+ </string>
+ <string name="Contents">
+ Контент
+ </string>
+ <string name="Gesture">
+ ЖеÑÑ‚
+ </string>
+ <string name="Male Gestures">
+ МужÑкие жеÑты
+ </string>
+ <string name="Female Gestures">
+ ЖенÑкие жеÑты
+ </string>
+ <string name="Other Gestures">
+ Прочие жеÑты
+ </string>
+ <string name="Speech Gestures">
+ ЖеÑты в разговорах
+ </string>
+ <string name="Common Gestures">
+ Стандартные жеÑты
+ </string>
+ <string name="Male - Excuse me">
+ Мужчина – извинение
+ </string>
+ <string name="Male - Get lost">
+ Мужчина – ÑкройтеÑÑŒ
+ </string>
+ <string name="Male - Blow kiss">
+ Мужчина – воздушный поцелуй
+ </string>
+ <string name="Male - Boo">
+ Мужчина – фу!
+ </string>
+ <string name="Male - Bored">
+ Мужчина – Ñкука
+ </string>
+ <string name="Male - Hey">
+ Мужчина – Ñй!
+ </string>
+ <string name="Male - Laugh">
+ Мужчина – Ñмех
+ </string>
+ <string name="Male - Repulsed">
+ Мужчина – неприÑтие
+ </string>
+ <string name="Male - Shrug">
+ Мужчина – пожимает плечами
+ </string>
+ <string name="Male - Stick tougue out">
+ Мужчина – показывает Ñзык
+ </string>
+ <string name="Male - Wow">
+ Мужчина – ух ты!
+ </string>
+ <string name="Female - Chuckle">
+ Женщина – Ñмешок
+ </string>
+ <string name="Female - Cry">
+ Женщина – плач
+ </string>
+ <string name="Female - Embarrassed">
+ Женщина – Ñмущение
+ </string>
+ <string name="Female - Excuse me">
+ Женщина – извинение
+ </string>
+ <string name="Female - Get lost">
+ Женщина – ÑкройтеÑÑŒ
+ </string>
+ <string name="Female - Blow kiss">
+ Женщина – воздушный поцелуй
+ </string>
+ <string name="Female - Boo">
+ Женщина – фу!
+ </string>
+ <string name="Female - Bored">
+ Женщина – Ñкука
+ </string>
+ <string name="Female - Hey">
+ Женщина – Ñй!
+ </string>
+ <string name="Female - Hey baby">
+ Женщина – Ñй, бейби!
+ </string>
+ <string name="Female - Laugh">
+ Женщина – Ñмех
+ </string>
+ <string name="Female - Looking good">
+ Женщина – хорошо выглÑдишь
+ </string>
+ <string name="Female - Over here">
+ Женщина – Ñюда!
+ </string>
+ <string name="Female - Please">
+ Женщина – проÑьба
+ </string>
+ <string name="Female - Repulsed">
+ Женщина – неприÑтие
+ </string>
+ <string name="Female - Shrug">
+ Женщина – пожимает плечами
+ </string>
+ <string name="Female - Stick tougue out">
+ Женщина – показывает Ñзык
+ </string>
+ <string name="Female - Wow">
+ Женщина – ух ты!
+ </string>
+ <string name="/bow">
+ /поклонитьÑÑ
+ </string>
+ <string name="/clap">
+ /хлопнуть
+ </string>
+ <string name="/count">
+ /Ñчет
+ </string>
+ <string name="/extinguish">
+ /затушить
+ </string>
+ <string name="/kmb">
+ /поцелуй Ð¼ÐµÐ½Ñ Ð² зад
+ </string>
+ <string name="/muscle">
+ /Ñилач
+ </string>
+ <string name="/no">
+ /нет
+ </string>
+ <string name="/no!">
+ /нет!
+ </string>
+ <string name="/paper">
+ /бумага
+ </string>
+ <string name="/pointme">
+ /показать на ÑебÑ
+ </string>
+ <string name="/pointyou">
+ /показать на другого
+ </string>
+ <string name="/rock">
+ /камень
+ </string>
+ <string name="/scissor">
+ /ножницы
+ </string>
+ <string name="/smoke">
+ /курить
+ </string>
+ <string name="/stretch">
+ /потÑнутьÑÑ
+ </string>
+ <string name="/whistle">
+ /ÑвиÑтнуть
+ </string>
+ <string name="/yes">
+ /да
+ </string>
+ <string name="/yes!">
+ /о да!
+ </string>
+ <string name="afk">
+ отошел
+ </string>
+ <string name="dance1">
+ танец1
+ </string>
+ <string name="dance2">
+ танец2
+ </string>
+ <string name="dance3">
+ танец3
+ </string>
+ <string name="dance4">
+ танец4
+ </string>
+ <string name="dance5">
+ танец5
+ </string>
+ <string name="dance6">
+ танец6
+ </string>
+ <string name="dance7">
+ танец7
+ </string>
+ <string name="dance8">
+ танец8
+ </string>
+ <string name="AvatarBirthDateFormat">
+ [day,datetime,slt].[mthnum,datetime,slt].[year,datetime,slt]
+ </string>
+ <string name="DefaultMimeType">
+ нет/нет
+ </string>
+ <string name="texture_load_dimensions_error">
+ ÐÐµÐ»ÑŒÐ·Ñ Ð·Ð°Ð³Ñ€ÑƒÐ¶Ð°Ñ‚ÑŒ изображениÑ, размер которых превышает [WIDTH]*[HEIGHT]
+ </string>
+ <string name="words_separator" value=","/>
+ <string name="server_is_down">
+ ÐеÑÐ¼Ð¾Ñ‚Ñ€Ñ Ð½Ð° наши уÑилиÑ, что-то неожиданно пошло не так.
+
+ ОзнакомьтеÑÑŒ Ñ Ð¾Ð¿Ð¸Ñанием извеÑтных проблем в работе Ñтой Ñлужбы на Ñайте status.secondlifegrid.net.
+ ЕÑли проблемы продолжаютÑÑ, то проверьте подключение к Ñети и наÑтройки брандмауÑра.
+ </string>
+ <string name="dateTimeWeekdaysNames">
+ ВоÑкреÑенье:Понедельник:Вторник:Среда:Четверг:ПÑтница:Суббота
+ </string>
+ <string name="dateTimeWeekdaysShortNames">
+ Ð’Ñ:Пн:Ð’Ñ‚:Ср:Чт:Пт:Сб
+ </string>
+ <string name="dateTimeMonthNames">
+ Январь:Февраль:Март:Ðпрель:Май:Июнь:Июль:ÐвгуÑÑ‚:СентÑбрь:ОктÑбрь:ÐоÑбрь:Декабрь
+ </string>
+ <string name="dateTimeMonthShortNames">
+ Янв:Фев:Мар:Ðпр:Май:Июн:Июл:Ðвг:Сен:Окт:ÐоÑ:Дек
+ </string>
+ <string name="dateTimeDayFormat">
+ [MDAY]
+ </string>
+ <string name="dateTimeAM">
+ до полуднÑ
+ </string>
+ <string name="dateTimePM">
+ поÑле полуднÑ
+ </string>
+ <string name="LocalEstimateUSD">
+ [AMOUNT] US$
+ </string>
+ <string name="Membership">
+ ЧленÑтво
+ </string>
+ <string name="Roles">
+ Роли
+ </string>
+ <string name="Group Identity">
+ УдоÑтоверение группы
+ </string>
+ <string name="Parcel Management">
+ Управление учаÑтком
+ </string>
+ <string name="Parcel Identity">
+ УдоÑтоверение учаÑтка
+ </string>
+ <string name="Parcel Settings">
+ Параметры учаÑтка
+ </string>
+ <string name="Parcel Powers">
+ СпоÑобноÑти Ð´Ð»Ñ ÑƒÑ‡Ð°Ñтка
+ </string>
+ <string name="Parcel Access">
+ ДоÑтуп к учаÑтку
+ </string>
+ <string name="Parcel Content">
+ Содержимое на учаÑтке
+ </string>
+ <string name="Object Management">
+ Управление объектами
+ </string>
+ <string name="Accounting">
+ БухгалтериÑ
+ </string>
+ <string name="Notices">
+ УведомлениÑ
+ </string>
+ <string name="Chat">
+ Чат
+ </string>
+ <string name="DeleteItems">
+ Удалить выбранные объекты?
+ </string>
+ <string name="DeleteItem">
+ Удалить выбранный объект?
+ </string>
+ <string name="EmptyOutfitText">
+ Ð”Ð»Ñ Ñтого коÑтюма нет вещей
+ </string>
+ <string name="ExternalEditorNotSet">
+ Выберите редактор, иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€ ExternalEditor.
+ </string>
+ <string name="ExternalEditorNotFound">
+ Ðе удаетÑÑ Ð½Ð°Ð¹Ñ‚Ð¸ указанный внешний редактор.
+Попробуйте взÑть путь к редактору в двойные кавычки
+(например &quot;/path to my/editor&quot; &quot;%s&quot;)
+ </string>
+ <string name="ExternalEditorCommandParseError">
+ Ошибка анализа командной Ñтроки Ð´Ð»Ñ Ð²Ð½ÐµÑˆÐ½ÐµÐ³Ð¾ редактора.
+ </string>
+ <string name="ExternalEditorFailedToRun">
+ Ðе удалоÑÑŒ запуÑтить внешний редактор.
+ </string>
+ <string name="TranslationFailed">
+ Ошибка телепортации: [REASON]
+ </string>
+ <string name="TranslationResponseParseError">
+ Ошибка при анализе ответа переводчика.
+ </string>
+ <string name="Esc">
+ ESC
+ </string>
+ <string name="Space">
+ ПРОБЕЛ
+ </string>
+ <string name="Enter">
+ ВВОД
+ </string>
+ <string name="Tab">
+ TAB
+ </string>
+ <string name="Ins">
+ INS
+ </string>
+ <string name="Del">
+ DEL
+ </string>
+ <string name="Backsp">
+ BACKSP
+ </string>
+ <string name="Shift">
+ SHIFT
+ </string>
+ <string name="Ctrl">
+ CTRL
+ </string>
+ <string name="Alt">
+ ALT
+ </string>
+ <string name="CapsLock">
+ CAPSLOCK
+ </string>
+ <string name="Left">
+ Стрелка влево
+ </string>
+ <string name="Right">
+ Стрелка вправо
+ </string>
+ <string name="Up">
+ Стрелка вверх
+ </string>
+ <string name="Down">
+ Стрелка вниз
+ </string>
+ <string name="Home">
+ HOME
+ </string>
+ <string name="End">
+ END
+ </string>
+ <string name="PgUp">
+ PgUp
+ </string>
+ <string name="PgDn">
+ PgDn
+ </string>
+ <string name="F1">
+ F1
+ </string>
+ <string name="F2">
+ F2
+ </string>
+ <string name="F3">
+ F3
+ </string>
+ <string name="F4">
+ F4
+ </string>
+ <string name="F5">
+ F5
+ </string>
+ <string name="F6">
+ F6
+ </string>
+ <string name="F7">
+ F7
+ </string>
+ <string name="F8">
+ F8
+ </string>
+ <string name="F9">
+ F9
+ </string>
+ <string name="F10">
+ F10
+ </string>
+ <string name="F11">
+ F11
+ </string>
+ <string name="F12">
+ F12
+ </string>
+ <string name="Add">
+ +
+ </string>
+ <string name="Subtract">
+ -
+ </string>
+ <string name="Multiply">
+ *
+ </string>
+ <string name="Divide">
+ /
+ </string>
+ <string name="PAD_DIVIDE">
+ PAD_DIVIDE
+ </string>
+ <string name="PAD_LEFT">
+ PAD_LEFT
+ </string>
+ <string name="PAD_RIGHT">
+ PAD_RIGHT
+ </string>
+ <string name="PAD_DOWN">
+ PAD_DOWN
+ </string>
+ <string name="PAD_UP">
+ PAD_UP
+ </string>
+ <string name="PAD_HOME">
+ PAD_HOME
+ </string>
+ <string name="PAD_END">
+ PAD_END
+ </string>
+ <string name="PAD_PGUP">
+ PAD_PGUP
+ </string>
+ <string name="PAD_PGDN">
+ PAD_PGDN
+ </string>
+ <string name="PAD_CENTER">
+ PAD_CENTER
+ </string>
+ <string name="PAD_INS">
+ PAD_INS
+ </string>
+ <string name="PAD_DEL">
+ PAD_DEL
+ </string>
+ <string name="PAD_Enter">
+ PAD_Enter
+ </string>
+ <string name="PAD_BUTTON0">
+ PAD_BUTTON0
+ </string>
+ <string name="PAD_BUTTON1">
+ PAD_BUTTON1
+ </string>
+ <string name="PAD_BUTTON2">
+ PAD_BUTTON2
+ </string>
+ <string name="PAD_BUTTON3">
+ PAD_BUTTON3
+ </string>
+ <string name="PAD_BUTTON4">
+ PAD_BUTTON4
+ </string>
+ <string name="PAD_BUTTON5">
+ PAD_BUTTON5
+ </string>
+ <string name="PAD_BUTTON6">
+ PAD_BUTTON6
+ </string>
+ <string name="PAD_BUTTON7">
+ PAD_BUTTON7
+ </string>
+ <string name="PAD_BUTTON8">
+ PAD_BUTTON8
+ </string>
+ <string name="PAD_BUTTON9">
+ PAD_BUTTON9
+ </string>
+ <string name="PAD_BUTTON10">
+ PAD_BUTTON10
+ </string>
+ <string name="PAD_BUTTON11">
+ PAD_BUTTON11
+ </string>
+ <string name="PAD_BUTTON12">
+ PAD_BUTTON12
+ </string>
+ <string name="PAD_BUTTON13">
+ PAD_BUTTON13
+ </string>
+ <string name="PAD_BUTTON14">
+ PAD_BUTTON14
+ </string>
+ <string name="PAD_BUTTON15">
+ PAD_BUTTON15
+ </string>
+ <string name="-">
+ -
+ </string>
+ <string name="=">
+ =
+ </string>
+ <string name="`">
+ `
+ </string>
+ <string name=";">
+ ;
+ </string>
+ <string name="[">
+ [
+ </string>
+ <string name="]">
+ ]
+ </string>
+ <string name="\">
+ \
+ </string>
+ <string name="0">
+ 0
+ </string>
+ <string name="1">
+ 1
+ </string>
+ <string name="2">
+ 2
+ </string>
+ <string name="3">
+ 3
+ </string>
+ <string name="4">
+ 4
+ </string>
+ <string name="5">
+ 5
+ </string>
+ <string name="6">
+ 6
+ </string>
+ <string name="7">
+ 7
+ </string>
+ <string name="8">
+ 8
+ </string>
+ <string name="9">
+ 9
+ </string>
+ <string name="A">
+ A
+ </string>
+ <string name="B">
+ B
+ </string>
+ <string name="C">
+ C
+ </string>
+ <string name="D">
+ D
+ </string>
+ <string name="E">
+ E
+ </string>
+ <string name="F">
+ F
+ </string>
+ <string name="G">
+ G
+ </string>
+ <string name="H">
+ H
+ </string>
+ <string name="I">
+ I
+ </string>
+ <string name="J">
+ J
+ </string>
+ <string name="K">
+ K
+ </string>
+ <string name="L">
+ L
+ </string>
+ <string name="M">
+ M
+ </string>
+ <string name="N">
+ N
+ </string>
+ <string name="O">
+ O
+ </string>
+ <string name="P">
+ P
+ </string>
+ <string name="Q">
+ Q
+ </string>
+ <string name="R">
+ R
+ </string>
+ <string name="S">
+ S
+ </string>
+ <string name="T">
+ T
+ </string>
+ <string name="U">
+ U
+ </string>
+ <string name="V">
+ V
+ </string>
+ <string name="W">
+ W
+ </string>
+ <string name="X">
+ X
+ </string>
+ <string name="Y">
+ Y
+ </string>
+ <string name="Z">
+ Z
+ </string>
+ <string name="BeaconParticle">
+ ПроÑмотр меток учаÑтков (Ñиние)
+ </string>
+ <string name="BeaconPhysical">
+ ПроÑмотр меток физичеÑких объектов (зеленые)
+ </string>
+ <string name="BeaconScripted">
+ ПроÑмотр меток объектов Ñо Ñкриптами (краÑные)
+ </string>
+ <string name="BeaconScriptedTouch">
+ ПроÑмотр меток объектов Ñо Ñкриптами и функцией каÑÐ°Ð½Ð¸Ñ (краÑные)
+ </string>
+ <string name="BeaconSound">
+ ПроÑмотр звуковых меток (желтые)
+ </string>
+ <string name="BeaconMedia">
+ ПроÑмотр медийных меток (белые)
+ </string>
+ <string name="ParticleHiding">
+ ЧаÑтицы Ñкрыты
+ </string>
+ <string name="Command_AboutLand_Label">
+ О земле
+ </string>
+ <string name="Command_Appearance_Label">
+ ВнешноÑть
+ </string>
+ <string name="Command_Avatar_Label">
+ Ðватар
+ </string>
+ <string name="Command_Build_Label">
+ СтроительÑтво
+ </string>
+ <string name="Command_Chat_Label">
+ Чат
+ </string>
+ <string name="Command_Compass_Label">
+ КомпаÑ
+ </string>
+ <string name="Command_Destinations_Label">
+ Пункты
+ </string>
+ <string name="Command_Gestures_Label">
+ ЖеÑты
+ </string>
+ <string name="Command_HowTo_Label">
+ ИнÑтрукции
+ </string>
+ <string name="Command_Inventory_Label">
+ Инвентарь
+ </string>
+ <string name="Command_Map_Label">
+ Карта
+ </string>
+ <string name="Command_Marketplace_Label">
+ Торговый центр
+ </string>
+ <string name="Command_MiniMap_Label">
+ Миникарта
+ </string>
+ <string name="Command_Move_Label">
+ Ходьба / бег / полет
+ </string>
+ <string name="Command_Outbox_Label">
+ Торговые иÑходÑщие
+ </string>
+ <string name="Command_People_Label">
+ Люди
+ </string>
+ <string name="Command_Picks_Label">
+ Подборка
+ </string>
+ <string name="Command_Places_Label">
+ МеÑта
+ </string>
+ <string name="Command_Preferences_Label">
+ ÐаÑтройки
+ </string>
+ <string name="Command_Profile_Label">
+ Профиль
+ </string>
+ <string name="Command_Search_Label">
+ ПоиÑк
+ </string>
+ <string name="Command_Snapshot_Label">
+ Снимок
+ </string>
+ <string name="Command_Speak_Label">
+ Говорить
+ </string>
+ <string name="Command_View_Label">
+ Управление камерой
+ </string>
+ <string name="Command_Voice_Label">
+ ÐаÑтройки голоÑа
+ </string>
+ <string name="Command_AboutLand_Tooltip">
+ Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾ поÑещаемой вами земле
+ </string>
+ <string name="Command_Appearance_Tooltip">
+ Изменить аватар
+ </string>
+ <string name="Command_Avatar_Tooltip">
+ Выбор аватара
+ </string>
+ <string name="Command_Build_Tooltip">
+ ПоÑтроение объектов и формирование ландшафта
+ </string>
+ <string name="Command_Chat_Tooltip">
+ ОбменивайтеÑÑŒ текÑтовыми репликами Ñ Ð»ÑŽÐ´ÑŒÐ¼Ð¸ вокруг ваÑ
+ </string>
+ <string name="Command_Compass_Tooltip">
+ КомпаÑ
+ </string>
+ <string name="Command_Destinations_Tooltip">
+ ИнтереÑные меÑта
+ </string>
+ <string name="Command_Gestures_Tooltip">
+ ЖеÑты Ð´Ð»Ñ Ð°Ð²Ð°Ñ‚Ð°Ñ€Ð°
+ </string>
+ <string name="Command_HowTo_Tooltip">
+ Выполнение типичных задач
+ </string>
+ <string name="Command_Inventory_Tooltip">
+ ПроÑмотр и иÑпользование вашего имущеÑтва
+ </string>
+ <string name="Command_Map_Tooltip">
+ Карта мира
+ </string>
+ <string name="Command_Marketplace_Tooltip">
+ Покупки
+ </string>
+ <string name="Command_MiniMap_Tooltip">
+ Показать людей поблизоÑти
+ </string>
+ <string name="Command_Move_Tooltip">
+ Перемещение аватара
+ </string>
+ <string name="Command_Outbox_Tooltip">
+ ПеренеÑти предметы в торговый центр Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð´Ð°Ð¶Ð¸
+ </string>
+ <string name="Command_People_Tooltip">
+ ДрузьÑ, группы и люди поблизоÑти
+ </string>
+ <string name="Command_Picks_Tooltip">
+ МеÑта, которые будут показаны в вашем профиле как избранное
+ </string>
+ <string name="Command_Places_Tooltip">
+ Сохраненные вами меÑта
+ </string>
+ <string name="Command_Preferences_Tooltip">
+ ÐаÑтройки
+ </string>
+ <string name="Command_Profile_Tooltip">
+ Редактирование или проÑмотр вашего профилÑ
+ </string>
+ <string name="Command_Search_Tooltip">
+ ПоиÑк меÑÑ‚, Ñобытий, людей
+ </string>
+ <string name="Command_Snapshot_Tooltip">
+ Сделать Ñнимок
+ </string>
+ <string name="Command_Speak_Tooltip">
+ Говорите Ñ Ð»ÑŽÐ´ÑŒÐ¼Ð¸ вокруг Ð²Ð°Ñ Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ микрофона
+ </string>
+ <string name="Command_View_Tooltip">
+ Изменение угла камеры
+ </string>
+ <string name="Command_Voice_Tooltip">
+ Регулировка громкоÑти вызовов и разговоров Ñ Ð»ÑŽÐ´ÑŒÐ¼Ð¸ около ваÑ
+ </string>
+ <string name="Toolbar_Bottom_Tooltip">
+ ÑÐµÐ¹Ñ‡Ð°Ñ Ð½Ð° нижней панели инÑтрументов
+ </string>
+ <string name="Toolbar_Left_Tooltip">
+ ÑÐµÐ¹Ñ‡Ð°Ñ Ð½Ð° левой панели инÑтрументов
+ </string>
+ <string name="Toolbar_Right_Tooltip">
+ ÑÐµÐ¹Ñ‡Ð°Ñ Ð½Ð° правой панели инÑтрументов
+ </string>
+ <string name="Retain%">
+ ОÑтаток%
+ </string>
+ <string name="Detail">
+ ДетализациÑ
+ </string>
+ <string name="Better Detail">
+ Более детально
+ </string>
+ <string name="Surface">
+ ПоверхноÑть
+ </string>
+ <string name="Solid">
+ Сплошной
+ </string>
+ <string name="Wrap">
+ Оболочка
+ </string>
+ <string name="Preview">
+ Предварительный проÑмотр
+ </string>
+ <string name="Normal">
+ Ðормальный
+ </string>
+ <string name="snapshot_quality_very_low">
+ Очень низкий
+ </string>
+ <string name="snapshot_quality_low">
+ Ðизкий
+ </string>
+ <string name="snapshot_quality_medium">
+ Средний
+ </string>
+ <string name="snapshot_quality_high">
+ Ð’Ñ‹Ñокий
+ </string>
+ <string name="snapshot_quality_very_high">
+ Очень выÑокий
+ </string>
+</strings>
diff --git a/indra/newview/skins/steam/xui/tr/strings.xml b/indra/newview/skins/steam/xui/tr/strings.xml
new file mode 100644
index 0000000000..74bb33a5c5
--- /dev/null
+++ b/indra/newview/skins/steam/xui/tr/strings.xml
@@ -0,0 +1,5025 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!-- This file contains strings that used to be hardcoded in the source.
+ It is only for those strings which do not belong in a floater.
+ For example, the strings used in avatar chat bubbles, and strings
+ that are returned from one component and may appear in many places-->
+<strings>
+ <string name="SECOND_LIFE">
+ Second Life
+ </string>
+ <string name="APP_NAME">
+ Second Life
+ </string>
+ <string name="CAPITALIZED_APP_NAME">
+ SECOND LIFE
+ </string>
+ <string name="SECOND_LIFE_GRID">
+ Second Life Ağı
+ </string>
+ <string name="SUPPORT_SITE">
+ Second Life Destek Portalı
+ </string>
+ <string name="StartupDetectingHardware">
+ Donanım saptanıyor...
+ </string>
+ <string name="StartupLoading">
+ [APP_NAME] yükleniyor...
+ </string>
+ <string name="StartupClearingCache">
+ Önbellek temizleniyor...
+ </string>
+ <string name="StartupInitializingTextureCache">
+ Doku önbelleği başlatılıyor...
+ </string>
+ <string name="StartupInitializingVFS">
+ VFS Başlatılıyor...
+ </string>
+ <string name="StartupRequireDriverUpdate">
+ Grafik başlatma başarılamadı. Lütfen grafik sürücünüzü güncelleştirin!
+ </string>
+ <string name="ProgressRestoring">
+ Geri yükleniyor...
+ </string>
+ <string name="ProgressChangingResolution">
+ Çözünürlük değiştiriliyor...
+ </string>
+ <string name="Fullbright">
+ Tam parlak (eski)
+ </string>
+ <string name="LoginInProgress">
+ Oturum açılıyor. [APP_NAME] kilitlenmiş görünebilir. Lütfen bekleyin.
+ </string>
+ <string name="LoginInProgressNoFrozen">
+ Oturum açılıyor...
+ </string>
+ <string name="LoginAuthenticating">
+ Kimlik doğrulaması yapılıyor
+ </string>
+ <string name="LoginMaintenance">
+ Hesap bakımı yapılıyor...
+ </string>
+ <string name="LoginAttempt">
+ Önceki oturum açma girişimi başarılamadı. Oturum açılıyor, [NUMBER]. girişim.
+ </string>
+ <string name="LoginPrecaching">
+ Dünya yükleniyor...
+ </string>
+ <string name="LoginInitializingBrowser">
+ Katıştırılmış web tarayıcısı başlatılıyor...
+ </string>
+ <string name="LoginInitializingMultimedia">
+ Multimedya başlatılıyor...
+ </string>
+ <string name="LoginInitializingFonts">
+ Fontlar yükleniyor...
+ </string>
+ <string name="LoginVerifyingCache">
+ Önbellek dosyaları doğrulanıyor (60-90 saniye zaman alabilir)...
+ </string>
+ <string name="LoginProcessingResponse">
+ Yanıt işleniyor...
+ </string>
+ <string name="LoginInitializingWorld">
+ Dünya başlatılıyor...
+ </string>
+ <string name="LoginDecodingImages">
+ Görüntülerin kodu çözülüyor...
+ </string>
+ <string name="LoginInitializingQuicktime">
+ QuickTime Başlatılıyor...
+ </string>
+ <string name="LoginQuicktimeNotFound">
+ QuickTime bulunamadı - başlatılamadı.
+ </string>
+ <string name="LoginQuicktimeOK">
+ QuickTime başarıyla başlatıldı.
+ </string>
+ <string name="LoginRequestSeedCapGrant">
+ Bölge özellikleri talep ediliyor...
+ </string>
+ <string name="LoginRetrySeedCapGrant">
+ Bölge özellikleri talep ediliyor: [NUMBER]. girişim...
+ </string>
+ <string name="LoginWaitingForRegionHandshake">
+ Bölge el sıkışması bekleniyor...
+ </string>
+ <string name="LoginConnectingToRegion">
+ Bölgeye bağlanılıyor...
+ </string>
+ <string name="LoginDownloadingClothing">
+ Giysiler karşıdan yükleniyor...
+ </string>
+ <string name="InvalidCertificate">
+ Sunucu geçersiz veya bozuk bir sertifika döndürdü. Lütfen Ağ yöneticisine başvurun.
+ </string>
+ <string name="CertInvalidHostname">
+ Sunucuya erişmek için geçersiz bir ana bilgisayar adı kullanıldı, lütfen SLURL veya Ağ ana bilgisayar adınızı kontrol edin.
+ </string>
+ <string name="CertExpired">
+ Ağ tarafından döndürülen sertifikanın süresi sona ermiş görünüyor. Lütfen sistem saatinizi kontrol edin veya Ağ yöneticinize başvurun.
+ </string>
+ <string name="CertKeyUsage">
+ Sunucu tarafından döndürülen sertifika SSL için kullanılamadı. Lütfen Ağ yöneticinize başvurun.
+ </string>
+ <string name="CertBasicConstraints">
+ Sunucunun Sertifika zincirinde çok fazla sertifika vardı. Lütfen Ağ yöneticinize başvurun.
+ </string>
+ <string name="CertInvalidSignature">
+ Ağ sunucusu tarafından döndürülen sertifika imzası doğrulanamadı. Lütfen Ağ yöneticinize başvurun.
+ </string>
+ <string name="LoginFailedNoNetwork">
+ Ağ hatası: Bağlantı kurulamadı, lütfen ağ bağlantınızı kontrol edin.
+ </string>
+ <string name="LoginFailed">
+ Oturum açılamadı.
+ </string>
+ <string name="Quit">
+ Çık
+ </string>
+ <string name="create_account_url">
+ http://join.secondlife.com/index.php?sourceid=1206_steam&amp;lang=tr-TR
+ </string>
+ <string name="LoginFailedViewerNotPermitted">
+ Kullandığınız görüntüleyici ile artık Second Life&apos;a erişemezsiniz. Yeni bir görüntüleyiciyi karşıdan yüklemek için lütfen şu sayfayı ziyaret edin:
+http://secondlife.com/download
+
+Daha fazla bilgi edinmek için asağıdaki SSS sayfamızı ziyaret edin:
+http://secondlife.com/viewer-access-faq
+ </string>
+ <string name="LoginIntermediateOptionalUpdateAvailable">
+ Opsiyonel görüntüleyici güncelleştirmesi mevcut: [VERSION]
+ </string>
+ <string name="LoginFailedRequiredUpdate">
+ Gerekli görüntüleyici güncelleştirmesi: [VERSION]
+ </string>
+ <string name="LoginFailedAlreadyLoggedIn">
+ Bu aracı zaten oturum açmış durumda.
+ </string>
+ <string name="LoginFailedAuthenticationFailed">
+ Üzgünüz! Oturumunuzu açamadık.
+Lütfen şunları doğru girdiğinizi kontrol edin:
+ * Kullanıcı adı (mustafayalcin12 veya faruk.gungoren gibi)
+ * Parola:
+Ayrıca lütfen Caps Lock tuşuna basmadığınıza emin olun.
+ </string>
+ <string name="LoginFailedPasswordChanged">
+ Güvenlik önlemi olarak parolanız değiştirildi.
+Lütfen hesap sayfanıza gidin: http://secondlife.com/password
+ve parolanızı sıfırlamak için güvenlik sorusunu yanıtlayın.
+Bu sorun için özür dileriz.
+ </string>
+ <string name="LoginFailedPasswordReset">
+ Sistemimizde bazı değişiklikler yaptık, parolanızı sıfırlamanız gerekecek.
+Lütfen hesap sayfanıza gidin: http://secondlife.com/password
+ve parolanızı sıfırlamak için güvenlik sorusunu yanıtlayın.
+Bu sorun için özür dileriz.
+ </string>
+ <string name="LoginFailedEmployeesOnly">
+ Second Life bakım amacıyla geçici olarak kapatıldı.
+Şu anda sadece çalışanlar oturum açabilir.
+Güncelleştirmeler için www.secondlife.com/status adresini kontrol edin.
+ </string>
+ <string name="LoginFailedPremiumOnly">
+ Second Life üzerindeki aktif kullanıcıların olası en iyi deneyimi yaşamasını sağlamak için, oturum açılması geçici olarak kısıtlanmıştır.
+
+Second Life için ödeme yapmış olan kişilere öncelik tanımak amacıyla, ücretsiz hesaplara sahip kişiler bu süre içerisinde Second Life&apos;a erişemeyecekler.
+ </string>
+ <string name="LoginFailedComputerProhibited">
+ Second Life&apos;a bu bilgisayardan eriÅŸemezsiniz.
+Bunun bir hata olduğunu düşünüyorsanız, lütfen şu adrese başvurun:
+support@secondlife.com.
+ </string>
+ <string name="LoginFailedAcountSuspended">
+ Hesabınıza şu zamana kadar erişemeyeceksiniz:
+Pasifik Saati ile [TIME].
+ </string>
+ <string name="LoginFailedAccountDisabled">
+ Talebinizi şu anda tamamlayamıyoruz.
+Lütfen yardım almak için Second Life destek bölümüne başvurun: http://secondlife.com/support
+Eğer parolanızı değiştiremiyorsanız, lütfen şu numarayı arayın: (866) 476-9763.
+ </string>
+ <string name="LoginFailedTransformError">
+ Oturum açılması sırasında veri tutarsızlığı saptandı.
+Lütfen şu adrese başvurun: support@secondlife.com
+ </string>
+ <string name="LoginFailedAccountMaintenance">
+ Hesabınızda küçük çaplı bir bakım işlemi sürüyor.
+Hesabınıza şu zamana kadar erişemeyeceksiniz:
+Pasifik Saati ile [TIME].
+Bunun bir hata olduğunu düşünüyorsanız, lütfen şu adrese başvurun: support@secondlife.com
+ </string>
+ <string name="LoginFailedPendingLogoutFault">
+ Oturum kapatma talebi simülatörden bir hata yanıtı gelmesine neden oldu.
+ </string>
+ <string name="LoginFailedPendingLogout">
+ Sistem şu anda oturumunuzu sonlandırıyor.
+Hesabınıza şu zamana kadar erişemeyeceksiniz:
+Pasifik Saati ile [TIME].
+ </string>
+ <string name="LoginFailedUnableToCreateSession">
+ Geçerli bir oturum oluşturulamadı.
+ </string>
+ <string name="LoginFailedUnableToConnectToSimulator">
+ Bir simülatöre bağlanılamadı.
+ </string>
+ <string name="LoginFailedRestrictedHours">
+ Hesabınız Second Life&apos;a sadece
+Pasifik Saati ile [START] ve [END] arasında erişebilir.
+Lütfen bu saatler arasında tekrar uğrayın.
+Bunun bir hata olduğunu düşünüyorsanız, lütfen şu adrese başvurun: support@secondlife.com
+ </string>
+ <string name="LoginFailedIncorrectParameters">
+ Yanlış parametreler.
+Bunun bir hata olduğunu düşünüyorsanız, lütfen şu adrese başvurun: support@secondlife.com
+ </string>
+ <string name="LoginFailedFirstNameNotAlphanumeric">
+ Ad parametresi alfasayısal olmalıdır.
+Bunun bir hata olduğunu düşünüyorsanız, lütfen şu adrese başvurun: support@secondlife.com
+ </string>
+ <string name="LoginFailedLastNameNotAlphanumeric">
+ Soyadı parametresi alfasayısal olmalıdır.
+Bunun bir hata olduğunu düşünüyorsanız, lütfen şu adrese başvurun: support@secondlife.com
+ </string>
+ <string name="LogoutFailedRegionGoingOffline">
+ Bölge şu anda çevrimdışı oluyor.
+Lütfen bir dakika içerisinde tekrar oturum açmayı deneyin.
+ </string>
+ <string name="LogoutFailedAgentNotInRegion">
+ Aracı bölgede değil.
+Lütfen bir dakika içerisinde tekrar oturum açmayı deneyin.
+ </string>
+ <string name="LogoutFailedPendingLogin">
+ Bu bölge başka bir oturum açmaktaydı.
+Lütfen bir dakika içerisinde tekrar oturum açmayı deneyin.
+ </string>
+ <string name="LogoutFailedLoggingOut">
+ Bu bölge önceki oturumu sonlandırmaktaydı.
+Lütfen bir dakika içerisinde tekrar oturum açmayı deneyin.
+ </string>
+ <string name="LogoutFailedStillLoggingOut">
+ Bu bölge hala bir önceki oturumu sonlandırma işlemini sürdürüyor.
+Lütfen bir dakika içerisinde tekrar oturum açmayı deneyin.
+ </string>
+ <string name="LogoutSucceeded">
+ Bu bölge son oturumu sonlandırdı.
+Lütfen bir dakika içerisinde tekrar oturum açmayı deneyin.
+ </string>
+ <string name="LogoutFailedLogoutBegun">
+ Bölge oturumu sonlandırma işlemini başlattı.
+Lütfen bir dakika içerisinde tekrar oturum açmayı deneyin.
+ </string>
+ <string name="LoginFailedLoggingOutSession">
+ Sistem son oturumunuzu sonlandırma işlemini başlattı.
+Lütfen bir dakika içerisinde tekrar oturum açmayı deneyin.
+ </string>
+ <string name="AgentLostConnection">
+ Bu bölgede sorun yaşanıyor olabilir. Lütfen İnternet bağlantınızı kontrol edin.
+ </string>
+ <string name="SavingSettings">
+ Ayarlarınız kaydediliyor...
+ </string>
+ <string name="LoggingOut">
+ Oturum kapatılıyor...
+ </string>
+ <string name="ShuttingDown">
+ Kapatılıyor...
+ </string>
+ <string name="YouHaveBeenDisconnected">
+ Bulunduğunuz bölgeyle bağlantınız kesildi.
+ </string>
+ <string name="SentToInvalidRegion">
+ Geçersiz bir bölgeye gönderildiniz.
+ </string>
+ <string name="TestingDisconnect">
+ Görüntüleyici bağlantısının kesilmesi test ediliyor
+ </string>
+ <string name="TooltipPerson">
+ KiÅŸi
+ </string>
+ <string name="TooltipNoName">
+ (adsız)
+ </string>
+ <string name="TooltipOwner">
+ Sahip:
+ </string>
+ <string name="TooltipPublic">
+ Kamuya Açık
+ </string>
+ <string name="TooltipIsGroup">
+ (Grup)
+ </string>
+ <string name="TooltipForSaleL$">
+ Satılık: L$[AMOUNT]
+ </string>
+ <string name="TooltipFlagGroupBuild">
+ Grup İnşası
+ </string>
+ <string name="TooltipFlagNoBuild">
+ İnşa Edilemez
+ </string>
+ <string name="TooltipFlagNoEdit">
+ Grup İnşası
+ </string>
+ <string name="TooltipFlagNotSafe">
+ Güvenli Değil
+ </string>
+ <string name="TooltipFlagNoFly">
+ Uçamaz
+ </string>
+ <string name="TooltipFlagGroupScripts">
+ Grup Komut Dosyaları
+ </string>
+ <string name="TooltipFlagNoScripts">
+ Komut Dosyası Yok
+ </string>
+ <string name="TooltipLand">
+ Arazi:
+ </string>
+ <string name="TooltipMustSingleDrop">
+ Buraya sadece bir öğe sürüklenebilir.
+ </string>
+ <string name="TooltipPrice" value="L$[AMOUNT]:"/>
+ <string name="TooltipOutboxDragToWorld">
+ Satıcı giden kutunuzda öğeler oluşturamazsınız
+ </string>
+ <string name="TooltipOutboxNoTransfer">
+ Bu nesnelerden bir veya daha fazlası satılamaz veya aktarılamaz.
+ </string>
+ <string name="TooltipOutboxNotInInventory">
+ Satıcı giden kutunuza sadece doğrudan kendi envanterinizden öğeler koyabilirsiniz
+ </string>
+ <string name="TooltipOutboxWorn">
+ Giymekte olduğunuz öğeleri Satıcı giden kutunuza koyamazsınız.
+ </string>
+ <string name="TooltipOutboxCallingCard">
+ Satıcı giden kutunuza arama kartları koyamazsınız
+ </string>
+ <string name="TooltipOutboxFolderLevels">
+ İç içe geçmiş klasörlerin derinliği üçü geçiyor
+ </string>
+ <string name="TooltipOutboxTooManyFolders">
+ Üst seviyedeki klasördeki alt klasör sayısı 20&apos;yi geçiyor
+ </string>
+ <string name="TooltipOutboxTooManyObjects">
+ Üst seviyedeki klasördeki öğe sayısı 200&apos;ü geçiyor
+ </string>
+ <string name="TooltipDragOntoOwnChild">
+ Bir klasörü alt klasörüne taşıyamazsınız
+ </string>
+ <string name="TooltipDragOntoSelf">
+ Bir klasörü kendi içine taşıyamazsınız
+ </string>
+ <string name="TooltipHttpUrl">
+ Bu web sayfasını görmek için tıklayın
+ </string>
+ <string name="TooltipSLURL">
+ Bu konumun bilgisini görmek için tıklayın
+ </string>
+ <string name="TooltipAgentUrl">
+ Bu Sakinin profilini görmek için tıklayın
+ </string>
+ <string name="TooltipAgentInspect">
+ Bu Sakin hakkında daha fazla bilgi öğrenin
+ </string>
+ <string name="TooltipAgentMute">
+ Bu Sakini engellemek için tıklayın
+ </string>
+ <string name="TooltipAgentUnmute">
+ Bu Sakinin engellemesini kaldırmak için tıklayın
+ </string>
+ <string name="TooltipAgentIM">
+ Bu Sakine Aİ göndermek için tıklayın
+ </string>
+ <string name="TooltipAgentPay">
+ Bu Sakine ödeme yapmak için tıklayın
+ </string>
+ <string name="TooltipAgentOfferTeleport">
+ Bu Sakine bir ışınlama talebi teklif etmek için tıklayın
+ </string>
+ <string name="TooltipAgentRequestFriend">
+ Bu Sakine bir arkadaşlık talebi teklif etmek için tıklayın
+ </string>
+ <string name="TooltipGroupUrl">
+ Bu grubun açıklamasını görmek için tıklayın
+ </string>
+ <string name="TooltipEventUrl">
+ Bu etkinliğin açıklamasını görmek için tıklayın
+ </string>
+ <string name="TooltipClassifiedUrl">
+ Bu ilanı görmek için tıklayın
+ </string>
+ <string name="TooltipParcelUrl">
+ Bu parselin açıklamasını görmek için tıklayın
+ </string>
+ <string name="TooltipTeleportUrl">
+ Bu konuma ışınlama yapmak için tıklayın
+ </string>
+ <string name="TooltipObjectIMUrl">
+ Bu nesnenin açıklamasını görmek için tıklayın
+ </string>
+ <string name="TooltipMapUrl">
+ Bu konumu bir haritada görmek için tıklayın
+ </string>
+ <string name="TooltipSLAPP">
+ secondlife:// komutunu çalıştırmak için tıklayın
+ </string>
+ <string name="CurrentURL" value="Geçerli URL: [CurrentURL]"/>
+ <string name="SLurlLabelTeleport">
+ Şuraya ışınla:
+ </string>
+ <string name="SLurlLabelShowOnMap">
+ Şunun için Harita göster:
+ </string>
+ <string name="SLappAgentMute">
+ Engelle
+ </string>
+ <string name="SLappAgentUnmute">
+ Engellemeyi kaldır
+ </string>
+ <string name="SLappAgentIM">
+ Aİ
+ </string>
+ <string name="SLappAgentPay">
+ Öde
+ </string>
+ <string name="SLappAgentOfferTeleport">
+ Şuraya Işınlama Teklif Et:
+ </string>
+ <string name="SLappAgentRequestFriend">
+ Arkadaşlık Talebi
+ </string>
+ <string name="BUTTON_CLOSE_DARWIN">
+ Kapat (⌘W)
+ </string>
+ <string name="BUTTON_CLOSE_WIN">
+ Kapat (Ctrl+W)
+ </string>
+ <string name="BUTTON_CLOSE_CHROME">
+ Kapat
+ </string>
+ <string name="BUTTON_RESTORE">
+ Geri Yükle
+ </string>
+ <string name="BUTTON_MINIMIZE">
+ Simge Durumuna Küçült
+ </string>
+ <string name="BUTTON_TEAR_OFF">
+ Böl
+ </string>
+ <string name="BUTTON_DOCK">
+ YerleÅŸtir
+ </string>
+ <string name="BUTTON_HELP">
+ Yardımı Göster
+ </string>
+ <string name="Searching">
+ Arıyor...
+ </string>
+ <string name="NoneFound">
+ Hiçbiri bulunamadı.
+ </string>
+ <string name="RetrievingData">
+ Alınıyor...
+ </string>
+ <string name="ReleaseNotes">
+ Sürüm Notları
+ </string>
+ <string name="LoadingData">
+ Yükleniyor...
+ </string>
+ <string name="AvatarNameNobody">
+ (hiçbiri)
+ </string>
+ <string name="AvatarNameWaiting">
+ (bekliyor)
+ </string>
+ <string name="AvatarNameMultiple">
+ (birden çok)
+ </string>
+ <string name="GroupNameNone">
+ (hiçbiri)
+ </string>
+ <string name="AvalineCaller">
+ Avaline Arayanı [ORDER]
+ </string>
+ <string name="AssetErrorNone">
+ Hata yok
+ </string>
+ <string name="AssetErrorRequestFailed">
+ Varlık talebi: başarısız oldu
+ </string>
+ <string name="AssetErrorNonexistentFile">
+ Varlık talebi: var olmayan dosya
+ </string>
+ <string name="AssetErrorNotInDatabase">
+ Varlık talebi: veri tabanında varlık bulunamadı
+ </string>
+ <string name="AssetErrorEOF">
+ Dosya sonu
+ </string>
+ <string name="AssetErrorCannotOpenFile">
+ Dosya açılamadı
+ </string>
+ <string name="AssetErrorFileNotFound">
+ Dosya bulunamadı
+ </string>
+ <string name="AssetErrorTCPTimeout">
+ Dosya aktarımı zaman aşımı
+ </string>
+ <string name="AssetErrorCircuitGone">
+ Devre yok
+ </string>
+ <string name="AssetErrorPriceMismatch">
+ Görüntüleyici ile sunucu fiyatta anlaşmadı
+ </string>
+ <string name="AssetErrorUnknownStatus">
+ Bilinmeyen durum
+ </string>
+ <string name="texture">
+ doku
+ </string>
+ <string name="sound">
+ ses
+ </string>
+ <string name="calling card">
+ arama kartı
+ </string>
+ <string name="landmark">
+ yer imi
+ </string>
+ <string name="legacy script">
+ eski komut dosyası
+ </string>
+ <string name="clothing">
+ giysi
+ </string>
+ <string name="object">
+ nesne
+ </string>
+ <string name="note card">
+ not kartı
+ </string>
+ <string name="folder">
+ klasör
+ </string>
+ <string name="root">
+ kök
+ </string>
+ <string name="lsl2 script">
+ LSL2 komut dosyası
+ </string>
+ <string name="lsl bytecode">
+ LSL bayt kodu
+ </string>
+ <string name="tga texture">
+ tga dokusu
+ </string>
+ <string name="body part">
+ vücut bölümü
+ </string>
+ <string name="snapshot">
+ anlık görüntü
+ </string>
+ <string name="lost and found">
+ Kaybedip Bulduklarım
+ </string>
+ <string name="targa image">
+ targa görüntüsü
+ </string>
+ <string name="trash">
+ Çöp
+ </string>
+ <string name="jpeg image">
+ jpeg görüntüsü
+ </string>
+ <string name="animation">
+ animasyon
+ </string>
+ <string name="gesture">
+ mimik
+ </string>
+ <string name="simstate">
+ sim durumu
+ </string>
+ <string name="favorite">
+ favori
+ </string>
+ <string name="symbolic link">
+ bağlantı
+ </string>
+ <string name="symbolic folder link">
+ klasör bağlantısı
+ </string>
+ <string name="mesh">
+ örgü
+ </string>
+ <string name="AvatarEditingAppearance">
+ (Görünümü Düzenliyor)
+ </string>
+ <string name="AvatarAway">
+ Uzakta
+ </string>
+ <string name="AvatarBusy">
+ MeÅŸgul
+ </string>
+ <string name="AvatarMuted">
+ EngellenmiÅŸ
+ </string>
+ <string name="anim_express_afraid">
+ KorkmuÅŸ
+ </string>
+ <string name="anim_express_anger">
+ Kızgın
+ </string>
+ <string name="anim_away">
+ Uzakta
+ </string>
+ <string name="anim_backflip">
+ Geriye salto
+ </string>
+ <string name="anim_express_laugh">
+ İçten Kahkaha
+ </string>
+ <string name="anim_express_toothsmile">
+ Büyük Gülümseme
+ </string>
+ <string name="anim_blowkiss">
+ Öpücük Atma
+ </string>
+ <string name="anim_express_bored">
+ Canı Sıkılmış
+ </string>
+ <string name="anim_bow">
+ Selamlama
+ </string>
+ <string name="anim_clap">
+ Alkış
+ </string>
+ <string name="anim_courtbow">
+ Reverans
+ </string>
+ <string name="anim_express_cry">
+ AÄŸlama
+ </string>
+ <string name="anim_dance1">
+ Dans 1
+ </string>
+ <string name="anim_dance2">
+ Dans 2
+ </string>
+ <string name="anim_dance3">
+ Dans 3
+ </string>
+ <string name="anim_dance4">
+ Dans 4
+ </string>
+ <string name="anim_dance5">
+ Dans 5
+ </string>
+ <string name="anim_dance6">
+ Dans 6
+ </string>
+ <string name="anim_dance7">
+ Dans 7
+ </string>
+ <string name="anim_dance8">
+ Dans 8
+ </string>
+ <string name="anim_express_disdain">
+ Dudak Bükme
+ </string>
+ <string name="anim_drink">
+ İçme
+ </string>
+ <string name="anim_express_embarrased">
+ Utanmış
+ </string>
+ <string name="anim_angry_fingerwag">
+ İşaret Etme
+ </string>
+ <string name="anim_fist_pump">
+ Yumruk Sallama
+ </string>
+ <string name="anim_yoga_float">
+ Uçan Yoga
+ </string>
+ <string name="anim_express_frown">
+ Kaş Çatma
+ </string>
+ <string name="anim_impatient">
+ Sabırsız
+ </string>
+ <string name="anim_jumpforjoy">
+ Sevinçten Zıplama
+ </string>
+ <string name="anim_kissmybutt">
+ Kıçımı Öp
+ </string>
+ <string name="anim_express_kiss">
+ Öpücük
+ </string>
+ <string name="anim_laugh_short">
+ Gülme
+ </string>
+ <string name="anim_musclebeach">
+ Muscle Beach
+ </string>
+ <string name="anim_no_unhappy">
+ Hayır (Mutsuz)
+ </string>
+ <string name="anim_no_head">
+ Hayır
+ </string>
+ <string name="anim_nyanya">
+ Ha-ha-ha
+ </string>
+ <string name="anim_punch_onetwo">
+ Peşpeşe İki Yumruk
+ </string>
+ <string name="anim_express_open_mouth">
+ Ağız Açık
+ </string>
+ <string name="anim_peace">
+ Barış
+ </string>
+ <string name="anim_point_you">
+ Diğerini Göster
+ </string>
+ <string name="anim_point_me">
+ Kendini Göster
+ </string>
+ <string name="anim_punch_l">
+ Sola Yumruk At
+ </string>
+ <string name="anim_punch_r">
+ SaÄŸa Yumruk At
+ </string>
+ <string name="anim_rps_countdown">
+ RPS sayımı
+ </string>
+ <string name="anim_rps_paper">
+ RPS kağıdı
+ </string>
+ <string name="anim_rps_rock">
+ RPS kayası
+ </string>
+ <string name="anim_rps_scissors">
+ RPS makası
+ </string>
+ <string name="anim_express_repulsed">
+ TiksinmiÅŸ
+ </string>
+ <string name="anim_kick_roundhouse_r">
+ Döner Tekme
+ </string>
+ <string name="anim_express_sad">
+ Üzgün
+ </string>
+ <string name="anim_salute">
+ Selam
+ </string>
+ <string name="anim_shout">
+ Bağırma
+ </string>
+ <string name="anim_express_shrug">
+ Omuz Silkme
+ </string>
+ <string name="anim_express_smile">
+ Gülümseme
+ </string>
+ <string name="anim_smoke_idle">
+ Duman Tüttürme
+ </string>
+ <string name="anim_smoke_inhale">
+ Duman Çekme
+ </string>
+ <string name="anim_smoke_throw_down">
+ Yere İzmarit Atma
+ </string>
+ <string name="anim_express_surprise">
+ Sürpriz
+ </string>
+ <string name="anim_sword_strike_r">
+ Kılıç Darbesi
+ </string>
+ <string name="anim_angry_tantrum">
+ Öfke Nöbeti
+ </string>
+ <string name="anim_express_tongue_out">
+ Dil Çıkarma
+ </string>
+ <string name="anim_hello">
+ El Sallama
+ </string>
+ <string name="anim_whisper">
+ Fısıldama
+ </string>
+ <string name="anim_whistle">
+ Islık Çalma
+ </string>
+ <string name="anim_express_wink">
+ Göz Kırpma
+ </string>
+ <string name="anim_wink_hollywood">
+ Göz Kırpma (Hollywood)
+ </string>
+ <string name="anim_express_worry">
+ EndiÅŸelenme
+ </string>
+ <string name="anim_yes_happy">
+ Evet (Mutlu)
+ </string>
+ <string name="anim_yes_head">
+ Evet
+ </string>
+ <string name="multiple_textures">
+ Birden Çok
+ </string>
+ <string name="texture_loading">
+ Yükleniyor...
+ </string>
+ <string name="worldmap_offline">
+ Çevrimdışı
+ </string>
+ <string name="worldmap_item_tooltip_format">
+ [AREA] m² L$[PRICE]
+ </string>
+ <string name="worldmap_results_none_found">
+ Hiçbiri bulunamadı.
+ </string>
+ <string name="Ok">
+ Tamam
+ </string>
+ <string name="Premature end of file">
+ Dosyanın zamanından önce sonu
+ </string>
+ <string name="ST_NO_JOINT">
+ KÖK veya EKLEM bulunamıyor.
+ </string>
+ <string name="whisper">
+ fısıldar:
+ </string>
+ <string name="shout">
+ bağırır:
+ </string>
+ <string name="ringing">
+ SL dünyası içindeki Sesli Sohbete bağlanılıyor...
+ </string>
+ <string name="connected">
+ Bağlı
+ </string>
+ <string name="unavailable">
+ Geçerli konumunuzda ses mevcut değil
+ </string>
+ <string name="hang_up">
+ SL dünyası içindeki Sesli Sohbet ile bağlantı kesildi
+ </string>
+ <string name="reconnect_nearby">
+ Şimdi Yakındaki bir Sesli Sohbete yeniden bağlanılacaksınız.
+ </string>
+ <string name="ScriptQuestionCautionChatGranted">
+ &apos;[OWNERNAME]&apos; adlı kişiye ait, [REGIONPOS] üzerinde [REGIONNAME] içerisinde bulunan &apos;[OBJECTNAME]&apos; nesnesine şunu yapma izni verildi: [PERMISSIONS].
+ </string>
+ <string name="ScriptQuestionCautionChatDenied">
+ &apos;[OWNERNAME]&apos; adlı kişiye ait, [REGIONPOS] üzerinde [REGIONNAME] içerisinde bulunan &apos;[OBJECTNAME]&apos; nesnesine şunu yapma izni verilmedi: [PERMISSIONS].
+ </string>
+ <string name="ScriptTakeMoney">
+ Sizden Linden dolar (L$) almak
+ </string>
+ <string name="ActOnControlInputs">
+ Denetim girişlerinizle ilgili eylem gerçekleştirmek
+ </string>
+ <string name="RemapControlInputs">
+ Denetim girişleriniz için yeniden eşleme yapmak
+ </string>
+ <string name="AnimateYourAvatar">
+ Avatarınızı canlandırmak
+ </string>
+ <string name="AttachToYourAvatar">
+ Avatarınıza eklemek
+ </string>
+ <string name="ReleaseOwnership">
+ Mülkiyeti bırakmak ve kamuya açık hale gelmek
+ </string>
+ <string name="LinkAndDelink">
+ Başka nesnelerle bağlantı kurmak veya koparmak
+ </string>
+ <string name="AddAndRemoveJoints">
+ Başka nesnelerle eklem eklemek ve kaldırmak
+ </string>
+ <string name="ChangePermissions">
+ İzinlerini değiştirmek
+ </string>
+ <string name="TrackYourCamera">
+ Kameranızı takip etmek
+ </string>
+ <string name="ControlYourCamera">
+ Kameranızı kontrol etmek
+ </string>
+ <string name="NotConnected">
+ Bağlı Değil
+ </string>
+ <string name="SIM_ACCESS_PG">
+ Genel
+ </string>
+ <string name="SIM_ACCESS_MATURE">
+ Orta
+ </string>
+ <string name="SIM_ACCESS_ADULT">
+ YetiÅŸkin
+ </string>
+ <string name="SIM_ACCESS_DOWN">
+ Çevrimdışı
+ </string>
+ <string name="SIM_ACCESS_MIN">
+ Bilinmiyor
+ </string>
+ <string name="land_type_unknown">
+ (bilinmiyor)
+ </string>
+ <string name="Estate / Full Region">
+ Gayrimenkul / Tam Bölge
+ </string>
+ <string name="Estate / Homestead">
+ Gayrimenkul / Banliyö
+ </string>
+ <string name="Mainland / Homestead">
+ Anakara / Banliyö
+ </string>
+ <string name="Mainland / Full Region">
+ Anakara / Tam Bölge
+ </string>
+ <string name="all_files">
+ Tüm Dosyalar
+ </string>
+ <string name="sound_files">
+ Sesler
+ </string>
+ <string name="animation_files">
+ Animasyonlar
+ </string>
+ <string name="image_files">
+ Görüntüler
+ </string>
+ <string name="save_file_verb">
+ Kaydet
+ </string>
+ <string name="load_file_verb">
+ Yükle
+ </string>
+ <string name="targa_image_files">
+ Targa Görüntüleri
+ </string>
+ <string name="bitmap_image_files">
+ Bitmap Görüntüler
+ </string>
+ <string name="avi_movie_file">
+ AVI Film Dosyası
+ </string>
+ <string name="xaf_animation_file">
+ XAF Animasyon Dosyası
+ </string>
+ <string name="xml_file">
+ XML Dosyası
+ </string>
+ <string name="raw_file">
+ Ham Dosya
+ </string>
+ <string name="compressed_image_files">
+ Sıkıştırılmış Görüntüler
+ </string>
+ <string name="load_files">
+ Dosyalar Yükle
+ </string>
+ <string name="choose_the_directory">
+ Dizin Seç
+ </string>
+ <string name="script_files">
+ Komut Dosyaları
+ </string>
+ <string name="AvatarSetNotAway">
+ Uzakta DeÄŸil
+ </string>
+ <string name="AvatarSetAway">
+ Uzakta
+ </string>
+ <string name="AvatarSetNotBusy">
+ MeÅŸgul DeÄŸil
+ </string>
+ <string name="AvatarSetBusy">
+ MeÅŸgul
+ </string>
+ <string name="shape">
+ Åžekil
+ </string>
+ <string name="skin">
+ Dış Katman
+ </string>
+ <string name="hair">
+ Saç
+ </string>
+ <string name="eyes">
+ Gözler
+ </string>
+ <string name="shirt">
+ Gömlek
+ </string>
+ <string name="pants">
+ Pantolon
+ </string>
+ <string name="shoes">
+ Ayakkabılar
+ </string>
+ <string name="socks">
+ Çoraplar
+ </string>
+ <string name="jacket">
+ Ceket
+ </string>
+ <string name="gloves">
+ Eldivenler
+ </string>
+ <string name="undershirt">
+ Fanila
+ </string>
+ <string name="underpants">
+ Külot
+ </string>
+ <string name="skirt">
+ Etek
+ </string>
+ <string name="alpha">
+ Alfa
+ </string>
+ <string name="tattoo">
+ Dövme
+ </string>
+ <string name="physics">
+ Fizik
+ </string>
+ <string name="invalid">
+ geçersiz
+ </string>
+ <string name="none">
+ hiçbiri
+ </string>
+ <string name="shirt_not_worn">
+ Giyilmemiş gömlek
+ </string>
+ <string name="pants_not_worn">
+ GiyilmemiÅŸ pantolon
+ </string>
+ <string name="shoes_not_worn">
+ Giyilmemiş ayakkabılar
+ </string>
+ <string name="socks_not_worn">
+ Giyilmemiş çoraplar
+ </string>
+ <string name="jacket_not_worn">
+ GiyilmemiÅŸ ceket
+ </string>
+ <string name="gloves_not_worn">
+ GiyilmemiÅŸ eldivenler
+ </string>
+ <string name="undershirt_not_worn">
+ GiyilmemiÅŸ fanila
+ </string>
+ <string name="underpants_not_worn">
+ Giyilmemiş külot
+ </string>
+ <string name="skirt_not_worn">
+ GiyilmemiÅŸ etek
+ </string>
+ <string name="alpha_not_worn">
+ GiyilmemiÅŸ alfa
+ </string>
+ <string name="tattoo_not_worn">
+ Giyilmemiş dövme
+ </string>
+ <string name="physics_not_worn">
+ GiyilmemiÅŸ fizik
+ </string>
+ <string name="invalid_not_worn">
+ geçersiz
+ </string>
+ <string name="create_new_shape">
+ Yeni ÅŸekil oluÅŸtur
+ </string>
+ <string name="create_new_skin">
+ Yeni dış katman oluştur
+ </string>
+ <string name="create_new_hair">
+ Yeni saç oluştur
+ </string>
+ <string name="create_new_eyes">
+ Yeni gözler oluştur
+ </string>
+ <string name="create_new_shirt">
+ Yeni gömlek oluştur
+ </string>
+ <string name="create_new_pants">
+ Yeni pantolon oluÅŸtur
+ </string>
+ <string name="create_new_shoes">
+ Yeni ayakkabılar oluştur
+ </string>
+ <string name="create_new_socks">
+ Yeni çoraplar oluştur
+ </string>
+ <string name="create_new_jacket">
+ Yeni ceket oluÅŸtur
+ </string>
+ <string name="create_new_gloves">
+ Yeni eldivenler oluÅŸtur
+ </string>
+ <string name="create_new_undershirt">
+ Yeni fanila oluÅŸtur
+ </string>
+ <string name="create_new_underpants">
+ Yeni külot oluştur
+ </string>
+ <string name="create_new_skirt">
+ Yeni etek oluÅŸtur
+ </string>
+ <string name="create_new_alpha">
+ Yeni alfa oluÅŸtur
+ </string>
+ <string name="create_new_tattoo">
+ Yeni dövme oluştur
+ </string>
+ <string name="create_new_physics">
+ Yeni fizik oluÅŸtur
+ </string>
+ <string name="create_new_invalid">
+ geçersiz
+ </string>
+ <string name="NewWearable">
+ Yeni [WEARABLE_ITEM]
+ </string>
+ <string name="next">
+ Sonraki
+ </string>
+ <string name="ok">
+ Tamam
+ </string>
+ <string name="GroupNotifyGroupNotice">
+ Grup Bildirimi
+ </string>
+ <string name="GroupNotifyGroupNotices">
+ Grup Bildirimleri
+ </string>
+ <string name="GroupNotifySentBy">
+ Gönderen:
+ </string>
+ <string name="GroupNotifyAttached">
+ EklenmiÅŸ:
+ </string>
+ <string name="GroupNotifyViewPastNotices">
+ Burada eski bildirimleri görüntüleyin veya bu iletilerin alınmasını iptal edin.
+ </string>
+ <string name="GroupNotifyOpenAttachment">
+ Aksesuarı Aç
+ </string>
+ <string name="GroupNotifySaveAttachment">
+ Aksesuarı Kaydet
+ </string>
+ <string name="TeleportOffer">
+ Işınlama teklifi
+ </string>
+ <string name="StartUpNotifications">
+ Siz yokken yeni bildirimler geldi.
+ </string>
+ <string name="OverflowInfoChannelString">
+ %d ilave bildiriminiz var
+ </string>
+ <string name="BodyPartsRightArm">
+ SaÄŸ Kol
+ </string>
+ <string name="BodyPartsHead">
+ BaÅŸ
+ </string>
+ <string name="BodyPartsLeftArm">
+ Sol Kol
+ </string>
+ <string name="BodyPartsLeftLeg">
+ Sol Bacak
+ </string>
+ <string name="BodyPartsTorso">
+ Gövde
+ </string>
+ <string name="BodyPartsRightLeg">
+ SaÄŸ Bacak
+ </string>
+ <string name="GraphicsQualityLow">
+ Düşük
+ </string>
+ <string name="GraphicsQualityMid">
+ Orta
+ </string>
+ <string name="GraphicsQualityHigh">
+ Yüksek
+ </string>
+ <string name="LeaveMouselook">
+ Dünya Görünümüne dönmek için ESC&apos;e basın
+ </string>
+ <string name="InventoryNoMatchingItems">
+ Aradığınızı bulamadınız mı? [secondlife:///app/search/all/[SEARCH_TERM] Arama] ile bulmayı deneyin.
+ </string>
+ <string name="PlacesNoMatchingItems">
+ Aradığınızı bulamadınız mı? [secondlife:///app/search/places/[SEARCH_TERM] Arama] ile bulmayı deneyin.
+ </string>
+ <string name="FavoritesNoMatchingItems">
+ Bir yer imini favorilerinize eklemek için buraya sürükleyin.
+ </string>
+ <string name="InventoryNoTexture">
+ Envanterinizde bu dokunun kopyası yok
+ </string>
+ <string name="InventoryInboxNoItems">
+ Pazaryerinda satın aldıklarınız burada görünecektir. Bunları kullanmak için envanterinize sürükleyebilirsiniz.
+ </string>
+ <string name="MarketplaceURL">
+ https://marketplace.[MARKETPLACE_DOMAIN_NAME]/
+ </string>
+ <string name="MarketplaceURL_CreateStore">
+ http://community.secondlife.com/t5/English-Knowledge-Base/Selling-in-the-Marketplace/ta-p/700193#Section_.4
+ </string>
+ <string name="MarketplaceURL_Dashboard">
+ https://marketplace.[MARKETPLACE_DOMAIN_NAME]/merchants/store/dashboard
+ </string>
+ <string name="MarketplaceURL_Imports">
+ https://marketplace.[MARKETPLACE_DOMAIN_NAME]/merchants/store/imports
+ </string>
+ <string name="MarketplaceURL_LearnMore">
+ https://marketplace.[MARKETPLACE_DOMAIN_NAME]/learn_more
+ </string>
+ <string name="InventoryOutboxNotMerchantTitle">
+ Pazaryerinde herkes öğe satabilir.
+ </string>
+ <string name="InventoryOutboxNotMerchantTooltip"/>
+ <string name="InventoryOutboxNotMerchant">
+ Eğer bir satıcı olmak istiyorsanız, [Pazaryerinde [MARKETPLACE_CREATE_STORE_URL] bir mağaza açmanız gerekir].
+ </string>
+ <string name="InventoryOutboxNoItemsTitle">
+ Giden kutunuz boÅŸ.
+ </string>
+ <string name="InventoryOutboxNoItemsTooltip"/>
+ <string name="InventoryOutboxNoItems">
+ Bu alana klasörleri sürükleyin ve bunları [[MARKETPLACE_DASHBOARD_URL] Pazaryerinde] satılık olarak duyurmak için &quot;Pazaryerine Gönder&quot; üzerine tıklayın.
+ </string>
+ <string name="Marketplace Error None">
+ Hata yok
+ </string>
+ <string name="Marketplace Error Not Merchant">
+ Hata: Öğeleri Pazaryerine göndermeden önce kendinizi bir satıcı olarak belirlemelisiniz (ücretsizdir).
+ </string>
+ <string name="Marketplace Error Empty Folder">
+ Hata: Bu klasörün içeriği boş.
+ </string>
+ <string name="Marketplace Error Unassociated Products">
+ Hata: Bu öğe karşıya yüklenemedi çünkü satıcı hesabınızda ürünlerle ilişkisiz çok fazla öğe mevcut. Bu hatayı düzeltmek için Pazaryeri web sitesine oturum açın ve ilişkisiz öğe sayınızı azaltın.
+ </string>
+ <string name="Marketplace Error Object Limit">
+ Hata: Bu öğe çok fazla nesne içeriyor. Bu hatayı düzeltmek için nesneleri birlikte kutulara yerleştirerek, toplam nesne sayısını 200&apos;ün altına düşürün.
+ </string>
+ <string name="Marketplace Error Folder Depth">
+ Hata: Bu öğede çok fazla iç içe geçmiş klasör seviyesi var. Bunu tekrar düzenleyerek maksimum 3 iç içe geçmiş klasör seviyesine indirin.
+ </string>
+ <string name="Marketplace Error Unsellable Item">
+ Hata: Bu öğe Pazaryerinde satılamaz.
+ </string>
+ <string name="Marketplace Error Internal Import">
+ Hata: Bu öğede bir sorun var. Daha sonra tekrar deneyin.
+ </string>
+ <string name="Open landmarks">
+ Açık yer imleri
+ </string>
+ <string name="no_transfer" value="(aktarım yok)"/>
+ <string name="no_modify" value="(deÄŸiÅŸtirme yok)"/>
+ <string name="no_copy" value="(kopya yok)"/>
+ <string name="worn" value="(giyilmiÅŸ)"/>
+ <string name="link" value="(bağlantı)"/>
+ <string name="broken_link" value="(broken_link)"/>
+ <string name="LoadingContents">
+ İçerik yükleniyor...
+ </string>
+ <string name="NoContents">
+ İçerik yok
+ </string>
+ <string name="WornOnAttachmentPoint" value="([ATTACHMENT_POINT] üzerinde giyilmiş)"/>
+ <string name="ActiveGesture" value="[GESLABEL] (etkin)"/>
+ <string name="PermYes">
+ Evet
+ </string>
+ <string name="PermNo">
+ Hayır
+ </string>
+ <string name="Chat Message" value="Sohbet:"/>
+ <string name="Sound" value="Ses:"/>
+ <string name="Wait" value="--- Bekleyin:"/>
+ <string name="AnimFlagStop" value="Animasyonu Durdur:"/>
+ <string name="AnimFlagStart" value="Animasyonu BaÅŸlat:"/>
+ <string name="Wave" value="El Sallama"/>
+ <string name="GestureActionNone" value="Hiçbiri"/>
+ <string name="HelloAvatar" value="Merhaba avatar!"/>
+ <string name="ViewAllGestures" value="Tümünü Göster &gt;&gt;"/>
+ <string name="GetMoreGestures" value="İlave Al &gt;&gt;"/>
+ <string name="Animations" value="Animasyonlar,"/>
+ <string name="Calling Cards" value="Arama Kartları,"/>
+ <string name="Clothing" value="Giysiler,"/>
+ <string name="Gestures" value="Mimikler,"/>
+ <string name="Landmarks" value="Yer İmleri,"/>
+ <string name="Notecards" value="Not Kartları,"/>
+ <string name="Objects" value="Nesneler,"/>
+ <string name="Scripts" value="Komut Dosyaları,"/>
+ <string name="Sounds" value="Sesler,"/>
+ <string name="Textures" value="Dokular,"/>
+ <string name="Snapshots" value="Anlık Görüntüler,"/>
+ <string name="No Filters" value="Hayır"/>
+ <string name="Since Logoff" value="- Oturum Kapandıktan Beri"/>
+ <string name="InvFolder My Inventory">
+ Envanterim
+ </string>
+ <string name="InvFolder Library">
+ Kütüphane
+ </string>
+ <string name="InvFolder Textures">
+ Dokular
+ </string>
+ <string name="InvFolder Sounds">
+ Sesler
+ </string>
+ <string name="InvFolder Calling Cards">
+ Arama Kartları
+ </string>
+ <string name="InvFolder Landmarks">
+ Yer İmleri
+ </string>
+ <string name="InvFolder Scripts">
+ Komut Dosyaları
+ </string>
+ <string name="InvFolder Clothing">
+ Giysiler
+ </string>
+ <string name="InvFolder Objects">
+ Nesneler
+ </string>
+ <string name="InvFolder Notecards">
+ Not Kartları
+ </string>
+ <string name="InvFolder New Folder">
+ Yeni Klasör
+ </string>
+ <string name="InvFolder Inventory">
+ Envanter
+ </string>
+ <string name="InvFolder Uncompressed Images">
+ Sıkıştırılmamış Görüntüler
+ </string>
+ <string name="InvFolder Body Parts">
+ Vücut Bölümleri
+ </string>
+ <string name="InvFolder Trash">
+ Çöp
+ </string>
+ <string name="InvFolder Photo Album">
+ Fotoğraf Albümü
+ </string>
+ <string name="InvFolder Lost And Found">
+ Kaybedip Bulduklarım
+ </string>
+ <string name="InvFolder Uncompressed Sounds">
+ Sıkıştırılmamış Sesler
+ </string>
+ <string name="InvFolder Animations">
+ Animasyonlar
+ </string>
+ <string name="InvFolder Gestures">
+ Mimikler
+ </string>
+ <string name="InvFolder Favorite">
+ Favorilerim
+ </string>
+ <string name="InvFolder favorite">
+ Favorilerim
+ </string>
+ <string name="InvFolder Current Outfit">
+ Mevcut Dış Görünüm
+ </string>
+ <string name="InvFolder Initial Outfits">
+ Başlangıçtakı Dış Görünümler
+ </string>
+ <string name="InvFolder My Outfits">
+ Benim Dış Görünümlerim
+ </string>
+ <string name="InvFolder Accessories">
+ Aksesuarlar
+ </string>
+ <string name="InvFolder Meshes">
+ Örgüler
+ </string>
+ <string name="InvFolder Friends">
+ ArkadaÅŸlar
+ </string>
+ <string name="InvFolder All">
+ Tümü
+ </string>
+ <string name="no_attachments">
+ Giyilen aksesuar yok
+ </string>
+ <string name="Attachments remain">
+ Aksesuarlar ([COUNT] yuva mevcut)
+ </string>
+ <string name="Buy">
+ Satın Al
+ </string>
+ <string name="BuyforL$">
+ L$&apos;a Satın Al
+ </string>
+ <string name="Stone">
+ TaÅŸ
+ </string>
+ <string name="Metal">
+ Metal
+ </string>
+ <string name="Glass">
+ Cam
+ </string>
+ <string name="Wood">
+ AhÅŸap
+ </string>
+ <string name="Flesh">
+ Et
+ </string>
+ <string name="Plastic">
+ Plastik
+ </string>
+ <string name="Rubber">
+ Lastik
+ </string>
+ <string name="Light">
+ Işık
+ </string>
+ <string name="KBShift">
+ Shift
+ </string>
+ <string name="KBCtrl">
+ Ctrl
+ </string>
+ <string name="Chest">
+ Göğüs
+ </string>
+ <string name="Skull">
+ Kafatası
+ </string>
+ <string name="Left Shoulder">
+ Sol Omuz
+ </string>
+ <string name="Right Shoulder">
+ SaÄŸ Omuz
+ </string>
+ <string name="Left Hand">
+ Sol El
+ </string>
+ <string name="Right Hand">
+ SaÄŸ El
+ </string>
+ <string name="Left Foot">
+ Sol Ayak
+ </string>
+ <string name="Right Foot">
+ SaÄŸ Ayak
+ </string>
+ <string name="Spine">
+ Omurga
+ </string>
+ <string name="Pelvis">
+ LeÄŸen KemiÄŸi
+ </string>
+ <string name="Mouth">
+ Ağız
+ </string>
+ <string name="Chin">
+ Çene
+ </string>
+ <string name="Left Ear">
+ Sol Kulak
+ </string>
+ <string name="Right Ear">
+ SaÄŸ Kulak
+ </string>
+ <string name="Left Eyeball">
+ Sol Göz Küresi
+ </string>
+ <string name="Right Eyeball">
+ Sağ Göz Küresi
+ </string>
+ <string name="Nose">
+ Burun
+ </string>
+ <string name="R Upper Arm">
+ Sağ Üst Kol
+ </string>
+ <string name="R Forearm">
+ Sağ Ön Kol
+ </string>
+ <string name="L Upper Arm">
+ Sol Üst Kol
+ </string>
+ <string name="L Forearm">
+ Sol Ön Kol
+ </string>
+ <string name="Right Hip">
+ Sağ Kalça
+ </string>
+ <string name="R Upper Leg">
+ Sağ Üst Bacak
+ </string>
+ <string name="R Lower Leg">
+ SaÄŸ Alt Bacak
+ </string>
+ <string name="Left Hip">
+ Sol Kalça
+ </string>
+ <string name="L Upper Leg">
+ Sol Üst Bacak
+ </string>
+ <string name="L Lower Leg">
+ Sol Alt Bacak
+ </string>
+ <string name="Stomach">
+ Karın
+ </string>
+ <string name="Left Pec">
+ Sol Göğüs
+ </string>
+ <string name="Right Pec">
+ Sağ Göğüs
+ </string>
+ <string name="Neck">
+ Boyun
+ </string>
+ <string name="Avatar Center">
+ Avatar Merkezi
+ </string>
+ <string name="Invalid Attachment">
+ Geçersiz Aksesuar Noktası
+ </string>
+ <string name="YearsMonthsOld">
+ [AGEYEARS] [AGEMONTHS]&apos;lık
+ </string>
+ <string name="YearsOld">
+ [AGEYEARS] yaşında
+ </string>
+ <string name="MonthsOld">
+ [AGEMONTHS]&apos;lık
+ </string>
+ <string name="WeeksOld">
+ [AGEWEEKS]&apos;lık
+ </string>
+ <string name="DaysOld">
+ [AGEDAYS]&apos;lük
+ </string>
+ <string name="TodayOld">
+ Bugün katıldı
+ </string>
+ <string name="AgeYearsA">
+ [COUNT] yıl
+ </string>
+ <string name="AgeYearsB">
+ [COUNT] yıl
+ </string>
+ <string name="AgeYearsC">
+ [COUNT] yıl
+ </string>
+ <string name="AgeMonthsA">
+ [COUNT] ay
+ </string>
+ <string name="AgeMonthsB">
+ [COUNT] ay
+ </string>
+ <string name="AgeMonthsC">
+ [COUNT] ay
+ </string>
+ <string name="AgeWeeksA">
+ [COUNT] hafta
+ </string>
+ <string name="AgeWeeksB">
+ [COUNT] hafta
+ </string>
+ <string name="AgeWeeksC">
+ [COUNT] hafta
+ </string>
+ <string name="AgeDaysA">
+ [COUNT] gün
+ </string>
+ <string name="AgeDaysB">
+ [COUNT] gün
+ </string>
+ <string name="AgeDaysC">
+ [COUNT] gün
+ </string>
+ <string name="GroupMembersA">
+ [COUNT] üye
+ </string>
+ <string name="GroupMembersB">
+ [COUNT] üye
+ </string>
+ <string name="GroupMembersC">
+ [COUNT] üye
+ </string>
+ <string name="AcctTypeResident">
+ Sakin
+ </string>
+ <string name="AcctTypeTrial">
+ Deneme
+ </string>
+ <string name="AcctTypeCharterMember">
+ Ayrıcalıklı Üye
+ </string>
+ <string name="AcctTypeEmployee">
+ Linden Lab Çalışanı
+ </string>
+ <string name="PaymentInfoUsed">
+ Kullanılan Ödeme Bilgisi
+ </string>
+ <string name="PaymentInfoOnFile">
+ Dosyadaki Ödeme Bilgisi
+ </string>
+ <string name="NoPaymentInfoOnFile">
+ Dosyada Ödeme Bilgisi Yok
+ </string>
+ <string name="AgeVerified">
+ Yaşı Doğrulanmış
+ </string>
+ <string name="NotAgeVerified">
+ Yaşı Doğrulanmamış
+ </string>
+ <string name="Center 2">
+ 2. Merkez
+ </string>
+ <string name="Top Right">
+ Sağ Üst
+ </string>
+ <string name="Top">
+ Üst
+ </string>
+ <string name="Top Left">
+ Sol Üst
+ </string>
+ <string name="Center">
+ Merkez
+ </string>
+ <string name="Bottom Left">
+ Sol Alt
+ </string>
+ <string name="Bottom">
+ Alt
+ </string>
+ <string name="Bottom Right">
+ SaÄŸ Alt
+ </string>
+ <string name="CompileQueueDownloadedCompiling">
+ Karşıdan yüklendi, şimdi derleniyor
+ </string>
+ <string name="CompileQueueScriptNotFound">
+ Komut dosyası sunucuda bulunamadı.
+ </string>
+ <string name="CompileQueueProblemDownloading">
+ Karşıdan yüklenirken sorun oluştu
+ </string>
+ <string name="CompileQueueInsufficientPermDownload">
+ Komut dosyasını karşıdan yüklemek için yeterli izin yok.
+ </string>
+ <string name="CompileQueueInsufficientPermFor">
+ Şunun için yeterli izin yok:
+ </string>
+ <string name="CompileQueueUnknownFailure">
+ Karşıdan yüklerken bilinmeyen hata
+ </string>
+ <string name="CompileQueueTitle">
+ Tekrar Derleme İlerlemesi
+ </string>
+ <string name="CompileQueueStart">
+ tekrar derle
+ </string>
+ <string name="ResetQueueTitle">
+ Sıfırlama İlerlemesi
+ </string>
+ <string name="ResetQueueStart">
+ sıfırla
+ </string>
+ <string name="RunQueueTitle">
+ Çalışan Süreçlerin İlerlemesini Ayarla
+ </string>
+ <string name="RunQueueStart">
+ çalıştırmayı ayarla
+ </string>
+ <string name="NotRunQueueTitle">
+ Çalışmayan Süreçlerin İlerlemesini Ayarla
+ </string>
+ <string name="NotRunQueueStart">
+ çalıştırmamayı ayarla
+ </string>
+ <string name="CompileSuccessful">
+ Derleme başarılı oldu!
+ </string>
+ <string name="CompileSuccessfulSaving">
+ Derleme başarılı, kaydediliyor...
+ </string>
+ <string name="SaveComplete">
+ Kaydetme tamamlandı.
+ </string>
+ <string name="ObjectOutOfRange">
+ Komut dosyası (nesne kapsam dışı)
+ </string>
+ <string name="GodToolsObjectOwnedBy">
+ [OWNER] mülkiyetindeki [OBJECT] nesnesi
+ </string>
+ <string name="GroupsNone">
+ hiçbiri
+ </string>
+ <string name="Group" value="(grup)"/>
+ <string name="Unknown">
+ (Bilinmiyor)
+ </string>
+ <string name="SummaryForTheWeek" value="Bu haftanın özeti, şu tarihten itibaren:"/>
+ <string name="NextStipendDay" value="Sonraki ödeme günü şudur:"/>
+ <string name="GroupPlanningDate">
+ [mthnum,datetime,utc]/[day,datetime,utc]/[year,datetime,utc]
+ </string>
+ <string name="GroupIndividualShare" value="Grup Bireysel Pay"/>
+ <string name="GroupColumn" value="Grup"/>
+ <string name="Balance">
+ Bakiye
+ </string>
+ <string name="Credits">
+ Katkıda Bulunanlar
+ </string>
+ <string name="Debits">
+ Borçlar
+ </string>
+ <string name="Total">
+ Toplam
+ </string>
+ <string name="NoGroupDataFound">
+ Bu grup için grup verisi bulunamadı
+ </string>
+ <string name="IMParentEstate">
+ ana gayrimenkul
+ </string>
+ <string name="IMMainland">
+ anakara
+ </string>
+ <string name="IMTeen">
+ on sekiz yaş altı
+ </string>
+ <string name="Anyone">
+ herkes
+ </string>
+ <string name="RegionInfoError">
+ hata
+ </string>
+ <string name="RegionInfoAllEstatesOwnedBy">
+ [OWNER] mülkiyetindeki tüm gayrimenkuller
+ </string>
+ <string name="RegionInfoAllEstatesYouOwn">
+ sahip olduğunuz tüm gayrimenkuller
+ </string>
+ <string name="RegionInfoAllEstatesYouManage">
+ [OWNER] adına yönettiğiniz tüm gayrimenkuller
+ </string>
+ <string name="RegionInfoAllowedResidents">
+ İzin verilen Sakinler: ([ALLOWEDAGENTS], maks [MAXACCESS])
+ </string>
+ <string name="RegionInfoAllowedGroups">
+ İzin verilen gruplar: ([ALLOWEDGROUPS], maks [MAXACCESS])
+ </string>
+ <string name="ScriptLimitsParcelScriptMemory">
+ Parsel Komut Dosyası Belleği
+ </string>
+ <string name="ScriptLimitsParcelsOwned">
+ Listelenen Parseller: [PARCELS]
+ </string>
+ <string name="ScriptLimitsMemoryUsed">
+ Kullanılan bellek: [COUNT] kb / [MAX] kb içerisinden; [AVAILABLE] kb serbest
+ </string>
+ <string name="ScriptLimitsMemoryUsedSimple">
+ Kullanılan bellek: [COUNT] kb
+ </string>
+ <string name="ScriptLimitsParcelScriptURLs">
+ Parsel Komut Dosyası URL&apos;leri
+ </string>
+ <string name="ScriptLimitsURLsUsed">
+ Kullanılan URL&apos;ler: [COUNT] / [MAX] içerisinden; [AVAILABLE] serbest
+ </string>
+ <string name="ScriptLimitsURLsUsedSimple">
+ Kullanılan URL&apos;ler: [COUNT]
+ </string>
+ <string name="ScriptLimitsRequestError">
+ Bilgi talep edilirken hata oluÅŸtu
+ </string>
+ <string name="ScriptLimitsRequestNoParcelSelected">
+ Seçili Parsel Yok
+ </string>
+ <string name="ScriptLimitsRequestWrongRegion">
+ Hata: Komut dosyası bilgisi sadece mevcut bölgenizde geçerli
+ </string>
+ <string name="ScriptLimitsRequestWaiting">
+ Bilgiler alınıyor...
+ </string>
+ <string name="ScriptLimitsRequestDontOwnParcel">
+ Bu parseli inceleme izniniz yok
+ </string>
+ <string name="SITTING_ON">
+ Üzerinde Oturuyor
+ </string>
+ <string name="ATTACH_CHEST">
+ Göğüs
+ </string>
+ <string name="ATTACH_HEAD">
+ BaÅŸ
+ </string>
+ <string name="ATTACH_LSHOULDER">
+ Sol Omuz
+ </string>
+ <string name="ATTACH_RSHOULDER">
+ SaÄŸ Omuz
+ </string>
+ <string name="ATTACH_LHAND">
+ Sol El
+ </string>
+ <string name="ATTACH_RHAND">
+ SaÄŸ El
+ </string>
+ <string name="ATTACH_LFOOT">
+ Sol Ayak
+ </string>
+ <string name="ATTACH_RFOOT">
+ SaÄŸ Ayak
+ </string>
+ <string name="ATTACH_BACK">
+ Geri
+ </string>
+ <string name="ATTACH_PELVIS">
+ LeÄŸen KemiÄŸi
+ </string>
+ <string name="ATTACH_MOUTH">
+ Ağız
+ </string>
+ <string name="ATTACH_CHIN">
+ Çene
+ </string>
+ <string name="ATTACH_LEAR">
+ Sol Kulak
+ </string>
+ <string name="ATTACH_REAR">
+ SaÄŸ Kulak
+ </string>
+ <string name="ATTACH_LEYE">
+ Sol Göz
+ </string>
+ <string name="ATTACH_REYE">
+ Sağ Göz
+ </string>
+ <string name="ATTACH_NOSE">
+ Burun
+ </string>
+ <string name="ATTACH_RUARM">
+ Sol Üst Kol
+ </string>
+ <string name="ATTACH_RLARM">
+ SaÄŸ Alt Kol
+ </string>
+ <string name="ATTACH_LUARM">
+ Sol Üst Kol
+ </string>
+ <string name="ATTACH_LLARM">
+ Sol Alt Kol
+ </string>
+ <string name="ATTACH_RHIP">
+ Sağ Kalça
+ </string>
+ <string name="ATTACH_RULEG">
+ Sağ Üst Bacak
+ </string>
+ <string name="ATTACH_RLLEG">
+ SaÄŸ Alt Bacak
+ </string>
+ <string name="ATTACH_LHIP">
+ Sol Kalça
+ </string>
+ <string name="ATTACH_LULEG">
+ Sol Üst Bacak
+ </string>
+ <string name="ATTACH_LLLEG">
+ Sol Alt Bacak
+ </string>
+ <string name="ATTACH_BELLY">
+ Göbek
+ </string>
+ <string name="ATTACH_RPEC">
+ Sağ Göğüs
+ </string>
+ <string name="ATTACH_LPEC">
+ Sol Göğüs
+ </string>
+ <string name="ATTACH_HUD_CENTER_2">
+ BÜG 2. Merkez
+ </string>
+ <string name="ATTACH_HUD_TOP_RIGHT">
+ BÜG Sağ Üst
+ </string>
+ <string name="ATTACH_HUD_TOP_CENTER">
+ BÜG Merkez Üst
+ </string>
+ <string name="ATTACH_HUD_TOP_LEFT">
+ BÜG Sol Üst
+ </string>
+ <string name="ATTACH_HUD_CENTER_1">
+ BÜG 1. Merkez
+ </string>
+ <string name="ATTACH_HUD_BOTTOM_LEFT">
+ BÜG Sol Alt
+ </string>
+ <string name="ATTACH_HUD_BOTTOM">
+ BÜG Alt
+ </string>
+ <string name="ATTACH_HUD_BOTTOM_RIGHT">
+ BÜG Sağ Alt
+ </string>
+ <string name="CursorPos">
+ Satır [LINE], Sütun [COLUMN]
+ </string>
+ <string name="PanelDirCountFound">
+ [COUNT] bulundu
+ </string>
+ <string name="PanelDirTimeStr">
+ [hour,datetime,slt]:[min,datetime,slt]
+ </string>
+ <string name="PanelDirEventsDateText">
+ [mthnum,datetime,slt]/[day,datetime,slt]
+ </string>
+ <string name="PanelContentsTooltip">
+ Nesnenin içeriği
+ </string>
+ <string name="PanelContentsNewScript">
+ Yeni Komut Dosyası
+ </string>
+ <string name="BusyModeResponseDefault">
+ İleti gönderdiğiniz Sakin &apos;meşgul modu&apos;nda, bu da rahatsız edilmek istemediği anlamına geliyor. İletiniz daha sonra incelenmesi için kendisine ait Aİ panelinde gösterilecektir.
+ </string>
+ <string name="MuteByName">
+ (Adına göre)
+ </string>
+ <string name="MuteAgent">
+ (Sakin)
+ </string>
+ <string name="MuteObject">
+ (Nesne)
+ </string>
+ <string name="MuteGroup">
+ (Grup)
+ </string>
+ <string name="MuteExternal">
+ (Harici)
+ </string>
+ <string name="RegionNoCovenant">
+ Bu Gayrimenkul için Sözleşmesi yok.
+ </string>
+ <string name="RegionNoCovenantOtherOwner">
+ Bu Gayrimenkul için Sözleşmesi yok. Bu gayrimenkul üzerindeki arazi Linden Lab. değil, Gayrimenkul sahibi tarafından satılmaktadır. Satış ayrıntılarını öğrenmek için lütfen Gayrimenkul Sahibiyle bağlantıya geçin.
+ </string>
+ <string name="covenant_last_modified" value="Son DeÄŸiÅŸtirildiÄŸi Tarih:"/>
+ <string name="none_text" value="(hiçbiri)"/>
+ <string name="never_text" value="(asla)"/>
+ <string name="GroupOwned">
+ Sahibi Olunan Grup
+ </string>
+ <string name="Public">
+ Kamuya Açık
+ </string>
+ <string name="LocalSettings">
+ Yerel Ayarlar
+ </string>
+ <string name="RegionSettings">
+ Bölge Ayarları
+ </string>
+ <string name="ClassifiedClicksTxt">
+ Tıklamalar: [TELEPORT] ışınlama, [MAP] harita, [PROFILE] profil
+ </string>
+ <string name="ClassifiedUpdateAfterPublish">
+ (yayınlandıktan sonra güncelleştirilir)
+ </string>
+ <string name="NoPicksClassifiedsText">
+ Herhangi bir Seçme veya İlan oluşturmadınız. Bir Seçme veya İlan oluşturmak için aşağıdaki Artı düğmesine tıklayın.
+ </string>
+ <string name="NoAvatarPicksClassifiedsText">
+ Kullanıcının herhangi bir seçmesi veya ilanı yok
+ </string>
+ <string name="PicksClassifiedsLoadingText">
+ Yükleniyor...
+ </string>
+ <string name="MultiPreviewTitle">
+ Önizleme
+ </string>
+ <string name="MultiPropertiesTitle">
+ Özellikler
+ </string>
+ <string name="InvOfferAnObjectNamed">
+ Åžu ada sahip bir nesne:
+ </string>
+ <string name="InvOfferOwnedByGroup">
+ grubun sahip olduÄŸu:
+ </string>
+ <string name="InvOfferOwnedByUnknownGroup">
+ bilinmeyen grubun sahip olduÄŸu:
+ </string>
+ <string name="InvOfferOwnedBy">
+ sahibi:
+ </string>
+ <string name="InvOfferOwnedByUnknownUser">
+ bilinmeyen bir kullanıcının sahip olduğu:
+ </string>
+ <string name="InvOfferGaveYou">
+ size verdi:
+ </string>
+ <string name="InvOfferDecline">
+ &lt;nolink&gt;[NAME]&lt;/nolink&gt; tarafından gönderilen [DESC]&apos;i reddettiniz.
+ </string>
+ <string name="GroupMoneyTotal">
+ Toplam
+ </string>
+ <string name="GroupMoneyBought">
+ alınan:
+ </string>
+ <string name="GroupMoneyPaidYou">
+ size ödenen:
+ </string>
+ <string name="GroupMoneyPaidInto">
+ şuraya ödenen:
+ </string>
+ <string name="GroupMoneyBoughtPassTo">
+ şuraya geçiş hakkı alınan:
+ </string>
+ <string name="GroupMoneyPaidFeeForEvent">
+ etkinlik için ödenen ücret:
+ </string>
+ <string name="GroupMoneyPaidPrizeForEvent">
+ etkinlik için verilen ödül:
+ </string>
+ <string name="GroupMoneyBalance">
+ Bakiye
+ </string>
+ <string name="GroupMoneyCredits">
+ Katkıda Bulunanlar
+ </string>
+ <string name="GroupMoneyDebits">
+ Borçlar
+ </string>
+ <string name="GroupMoneyDate">
+ [weekday,datetime,utc] [mth,datetime,utc] [day,datetime,utc], [year,datetime,utc]
+ </string>
+ <string name="ViewerObjectContents">
+ İçerik
+ </string>
+ <string name="AcquiredItems">
+ Alınan Öğeler
+ </string>
+ <string name="Cancel">
+ İptal
+ </string>
+ <string name="UploadingCosts">
+ [NAME] için karşıya yükleme maliyeti: L$ [AMOUNT]
+ </string>
+ <string name="BuyingCosts">
+ Bunu satın almanın maliyeti: L$ [AMOUNT]
+ </string>
+ <string name="UnknownFileExtension">
+ Bilinmeyen dosya uzantısı .%s
+.wav, .tga, .bmp, .jpg, .jpeg veya .bvh bekleniyordu
+ </string>
+ <string name="MuteObject2">
+ Engelle
+ </string>
+ <string name="MuteAvatar">
+ Engelle
+ </string>
+ <string name="UnmuteObject">
+ Engellemeyi Kaldır
+ </string>
+ <string name="UnmuteAvatar">
+ Engellemeyi Kaldır
+ </string>
+ <string name="AddLandmarkNavBarMenu">
+ Yer İmlerime Ekle...
+ </string>
+ <string name="EditLandmarkNavBarMenu">
+ Yer İmimi Düzenle...
+ </string>
+ <string name="accel-mac-control">
+ ⌃
+ </string>
+ <string name="accel-mac-command">
+ ⌘
+ </string>
+ <string name="accel-mac-option">
+ ⌥
+ </string>
+ <string name="accel-mac-shift">
+ ⇧
+ </string>
+ <string name="accel-win-control">
+ Ctrl+
+ </string>
+ <string name="accel-win-alt">
+ Alt+
+ </string>
+ <string name="accel-win-shift">
+ Shift+
+ </string>
+ <string name="FileSaved">
+ Dosya Kaydedildi
+ </string>
+ <string name="Receiving">
+ Alınıyor
+ </string>
+ <string name="AM">
+ ÖÖ
+ </string>
+ <string name="PM">
+ ÖS
+ </string>
+ <string name="PST">
+ PST
+ </string>
+ <string name="PDT">
+ PDT
+ </string>
+ <string name="Direction_Forward">
+ İleri
+ </string>
+ <string name="Direction_Left">
+ Sol
+ </string>
+ <string name="Direction_Right">
+ SaÄŸ
+ </string>
+ <string name="Direction_Back">
+ Geri
+ </string>
+ <string name="Direction_North">
+ Kuzey
+ </string>
+ <string name="Direction_South">
+ Güney
+ </string>
+ <string name="Direction_West">
+ Batı
+ </string>
+ <string name="Direction_East">
+ DoÄŸu
+ </string>
+ <string name="Direction_Up">
+ Yukarı
+ </string>
+ <string name="Direction_Down">
+ Aşağı
+ </string>
+ <string name="Any Category">
+ Herh. Bir Kategori
+ </string>
+ <string name="Shopping">
+ Alışveriş
+ </string>
+ <string name="Land Rental">
+ Arazi Kiralama
+ </string>
+ <string name="Property Rental">
+ Mülk Kiralama
+ </string>
+ <string name="Special Attraction">
+ Özel Atraksiyon
+ </string>
+ <string name="New Products">
+ Yeni Ürünler
+ </string>
+ <string name="Employment">
+ İstihdam
+ </string>
+ <string name="Wanted">
+ Arananlar
+ </string>
+ <string name="Service">
+ Hizmet
+ </string>
+ <string name="Personal">
+ KiÅŸisel
+ </string>
+ <string name="None">
+ Renksiz
+ </string>
+ <string name="Linden Location">
+ Linden Konumu
+ </string>
+ <string name="Adult">
+ YetiÅŸkin
+ </string>
+ <string name="Arts&amp;Culture">
+ Sanat ve Kültür
+ </string>
+ <string name="Business">
+ İş
+ </string>
+ <string name="Educational">
+ EÄŸitim
+ </string>
+ <string name="Gaming">
+ Oyun
+ </string>
+ <string name="Hangout">
+ UÄŸrak Mekan
+ </string>
+ <string name="Newcomer Friendly">
+ Yeni Gelenlere Yardım Sunan
+ </string>
+ <string name="Parks&amp;Nature">
+ Park ve DoÄŸa
+ </string>
+ <string name="Residential">
+ YerleÅŸim
+ </string>
+ <string name="Stage">
+ Sahne
+ </string>
+ <string name="Other">
+ DiÄŸer
+ </string>
+ <string name="Rental">
+ Kiralık
+ </string>
+ <string name="Any">
+ Herhangi
+ </string>
+ <string name="You">
+ Siz
+ </string>
+ <string name=":">
+ :
+ </string>
+ <string name=",">
+ ,
+ </string>
+ <string name="...">
+ ...
+ </string>
+ <string name="***">
+ ***
+ </string>
+ <string name="(">
+ (
+ </string>
+ <string name=")">
+ )
+ </string>
+ <string name=".">
+ .
+ </string>
+ <string name="&apos;">
+ &apos;
+ </string>
+ <string name="---">
+ ---
+ </string>
+ <string name="Multiple Media">
+ Birden Çok Ortam
+ </string>
+ <string name="Play Media">
+ Ortamı Oynat/Durdur
+ </string>
+ <string name="MBCmdLineError">
+ Komut satırı ayrıştırılırken bir hata oluştu.
+Lütfen bakınız: http://wiki.secondlife.com/wiki/Client_parameters
+Hata:
+ </string>
+ <string name="MBCmdLineUsg">
+ [APP_NAME] Komut satırı kullanımı:
+ </string>
+ <string name="MBUnableToAccessFile">
+ [APP_NAME] ihtiyaç duyduğu bir dosyaya erişemiyor.
+
+Bunun nedeni bir şekilde birden fazla kopyanın çalışıyor olması veya sisteminizin, bir dosyanın açık olduğunu sanması olabilir.
+Bu iletiyi görmeye devam ederseniz, bilgisayarınızı yeniden başlatın ve tekrar deneyin.
+Sorun devam ederse [APP_NAME] uygulamasını tümüyle kaldırmanız ve tekrar yüklemeniz gerekebilir.
+ </string>
+ <string name="MBFatalError">
+ Önemli Hata
+ </string>
+ <string name="MBRequiresAltiVec">
+ [APP_NAME], AltiVec (G4 veya üzeri) bir işlemciye ihtiyaç duyuyor.
+ </string>
+ <string name="MBAlreadyRunning">
+ [APP_NAME] zaten çalışıyor.
+Programın simge durumuna küçültülmüş bir kopyası için görev çubuğunuza bakın.
+Bu iletiyi görmeye devam ederseniz, bilgisayarınızı tekrar başlatın.
+ </string>
+ <string name="MBFrozenCrashed">
+ [APP_NAME] uygulaması bir önceki çalıştırmada kilitlenmiş görünüyor.
+Bir kilitlenme raporu göndermek ister misiniz?
+ </string>
+ <string name="MBAlert">
+ Bildirim
+ </string>
+ <string name="MBNoDirectX">
+ [APP_NAME], DirectX 9.0b veya üzerini saptayamıyor.
+[APP_NAME], kararlılık problemleri, kötü performans ve çökmelere neden olabilecek donanım ve/veya süresi geçmiş sürücüleri saptamak için DirectX kullanır. [APP_NAME] uygulamasını bu olmadan da çalıştırmanız mümkündür, ancak DirectX 9.0b ile çalıştırmanızı kuvvetle tavsiye ederiz.
+
+Devam etmek istiyor musunuz?
+ </string>
+ <string name="MBWarning">
+ Uyarı
+ </string>
+ <string name="MBNoAutoUpdate">
+ Linux için henüz otomatik güncelleştirme uygulanmamıştır.
+Lütfen www.secondlife.com adresinden son sürümü karşıdan yükleyin.
+ </string>
+ <string name="MBRegClassFailed">
+ RegisterClass başarısız oldu
+ </string>
+ <string name="MBError">
+ Hata
+ </string>
+ <string name="MBFullScreenErr">
+ [WIDTH] x [HEIGHT] çözünürlüğünde tam ekran çalıştırma yapılamıyor.
+Pencerede çalışıyor.
+ </string>
+ <string name="MBDestroyWinFailed">
+ Pencere yok edilirken Kapatma Hatası oluştu (DestroyWindow() başarısız oldu)
+ </string>
+ <string name="MBShutdownErr">
+ Kapatma Hatası
+ </string>
+ <string name="MBDevContextErr">
+ GL cihazı içeriği oluşturulamıyor
+ </string>
+ <string name="MBPixelFmtErr">
+ Uygun piksel formatı bulunamadı
+ </string>
+ <string name="MBPixelFmtDescErr">
+ Piksel formatı açıklaması alınamıyor
+ </string>
+ <string name="MBTrueColorWindow">
+ [APP_NAME] uygulamasının çalışması için Gerçek Renk (32 bit) gerekiyor.
+Lütfen bilgisayarınızın ekran ayarlarına gidin ve renk modunu 32 bit olarak ayarlayın.
+ </string>
+ <string name="MBAlpha">
+ [APP_NAME] çalışamıyor çünkü 8 bit bir alfa kanalı alamıyor. Bunun nedeni genellikle video kartı sürücü sorunlarıdır.
+Lütfen en yeni video sürücülerinin yüklü olduğuna emin olun.
+Ayrıca Denetim Masaları &gt; Ekran &gt; Ayarlar içerisinde ekranınız için Gerçek Renk (32 bit) ayarı yapıldığına emin olun.
+Bu iletiyi almaya devam ederseniz, lütfen [SUPPORT_SITE] bölümüne başvurun.
+ </string>
+ <string name="MBPixelFmtSetErr">
+ Piksel formatı ayarlanamıyor
+ </string>
+ <string name="MBGLContextErr">
+ GL işlemi bağlamı oluşturulamıyor
+ </string>
+ <string name="MBGLContextActErr">
+ GL işlemi bağlamı etkinleştirilemiyor
+ </string>
+ <string name="MBVideoDrvErr">
+ [APP_NAME] çalışamıyor çünkü video kartı sürücüleriniz düzgün yüklenemedi, süresi geçmiş durumda veya desteklenmeyen donanımlar için geliştirilmiş. Lütfen en yeni video kartı sürücülerine sahip olduğunuza emin olun; en yeni sürücüler mevcutsa da bunları tekrar yüklemeyi deneyin.
+
+Bu iletiyi almaya devam ederseniz, lütfen [SUPPORT_SITE] bölümüne başvurun.
+ </string>
+ <string name="5 O&apos;Clock Shadow">
+ Bir Günlük Sakal
+ </string>
+ <string name="All White">
+ Tümü Beyaz
+ </string>
+ <string name="Anime Eyes">
+ Anime Gözler
+ </string>
+ <string name="Arced">
+ Yay Åžeklinde
+ </string>
+ <string name="Arm Length">
+ Kol UzunluÄŸu
+ </string>
+ <string name="Attached">
+ BitiÅŸik
+ </string>
+ <string name="Attached Earlobes">
+ Kafaya BitiÅŸik Kulak Memeleri
+ </string>
+ <string name="Back Fringe">
+ Arka Perçem
+ </string>
+ <string name="Baggy">
+ Torbalı
+ </string>
+ <string name="Bangs">
+ Kahküller
+ </string>
+ <string name="Beady Eyes">
+ Boncuk Gözler
+ </string>
+ <string name="Belly Size">
+ Göbek Büyüklüğü
+ </string>
+ <string name="Big">
+ Büyük
+ </string>
+ <string name="Big Butt">
+ Büyük Kıç
+ </string>
+ <string name="Big Hair Back">
+ Kabarık Saç: Arkada
+ </string>
+ <string name="Big Hair Front">
+ Kabarık Saç: Önde
+ </string>
+ <string name="Big Hair Top">
+ Kabarık Saç: Tepede
+ </string>
+ <string name="Big Head">
+ Büyük Kafa
+ </string>
+ <string name="Big Pectorals">
+ Büyük Göğüs Kasları
+ </string>
+ <string name="Big Spikes">
+ Büyük Dik Kısımlar
+ </string>
+ <string name="Black">
+ Siyah
+ </string>
+ <string name="Blonde">
+ Sarışın
+ </string>
+ <string name="Blonde Hair">
+ Sarı Saç
+ </string>
+ <string name="Blush">
+ Allık
+ </string>
+ <string name="Blush Color">
+ Allık Rengi
+ </string>
+ <string name="Blush Opacity">
+ Allık Geçirgenliği
+ </string>
+ <string name="Body Definition">
+ Vücut Tanımı
+ </string>
+ <string name="Body Fat">
+ Vücut Yağı
+ </string>
+ <string name="Body Freckles">
+ Vücut Çilleri
+ </string>
+ <string name="Body Thick">
+ Kalın Vücut
+ </string>
+ <string name="Body Thickness">
+ Vücut Kalınlığı
+ </string>
+ <string name="Body Thin">
+ İnce Vücut
+ </string>
+ <string name="Bow Legged">
+ Çarpık Bacaklı
+ </string>
+ <string name="Breast Buoyancy">
+ Göğüs Kalkıklığı
+ </string>
+ <string name="Breast Cleavage">
+ Göğüs Çatalı
+ </string>
+ <string name="Breast Size">
+ Göğüs Büyüklüğü
+ </string>
+ <string name="Bridge Width">
+ Burun KemiÄŸi GeniÅŸliÄŸi
+ </string>
+ <string name="Broad">
+ GeniÅŸ
+ </string>
+ <string name="Brow Size">
+ Alın Genişliği
+ </string>
+ <string name="Bug Eyes">
+ Patlak Gözlü
+ </string>
+ <string name="Bugged Eyes">
+ Patlak Gözlü
+ </string>
+ <string name="Bulbous">
+ Patates Burunlu
+ </string>
+ <string name="Bulbous Nose">
+ Patates Burunlu
+ </string>
+ <string name="Breast Physics Mass">
+ Göğüs Kütlesi
+ </string>
+ <string name="Breast Physics Smoothing">
+ Göğüs Düzleştirme
+ </string>
+ <string name="Breast Physics Gravity">
+ Göğüs Yerçekimi
+ </string>
+ <string name="Breast Physics Drag">
+ Göğüs Direnci
+ </string>
+ <string name="Breast Physics InOut Max Effect">
+ Maks Etki
+ </string>
+ <string name="Breast Physics InOut Spring">
+ Yaylanma
+ </string>
+ <string name="Breast Physics InOut Gain">
+ Kazanç
+ </string>
+ <string name="Breast Physics InOut Damping">
+ Sönüm
+ </string>
+ <string name="Breast Physics UpDown Max Effect">
+ Maks Etki
+ </string>
+ <string name="Breast Physics UpDown Spring">
+ Yaylanma
+ </string>
+ <string name="Breast Physics UpDown Gain">
+ Kazanç
+ </string>
+ <string name="Breast Physics UpDown Damping">
+ Sönüm
+ </string>
+ <string name="Breast Physics LeftRight Max Effect">
+ Maks Etki
+ </string>
+ <string name="Breast Physics LeftRight Spring">
+ Yaylanma
+ </string>
+ <string name="Breast Physics LeftRight Gain">
+ Kazanç
+ </string>
+ <string name="Breast Physics LeftRight Damping">
+ Sönüm
+ </string>
+ <string name="Belly Physics Mass">
+ Göbek Kütlesi
+ </string>
+ <string name="Belly Physics Smoothing">
+ Göbek Düzleştirme
+ </string>
+ <string name="Belly Physics Gravity">
+ Göbek Yerçekimi
+ </string>
+ <string name="Belly Physics Drag">
+ Göbek Direnci
+ </string>
+ <string name="Belly Physics UpDown Max Effect">
+ Maks Etki
+ </string>
+ <string name="Belly Physics UpDown Spring">
+ Yaylanma
+ </string>
+ <string name="Belly Physics UpDown Gain">
+ Kazanç
+ </string>
+ <string name="Belly Physics UpDown Damping">
+ Sönüm
+ </string>
+ <string name="Butt Physics Mass">
+ Kıç Kütlesi
+ </string>
+ <string name="Butt Physics Smoothing">
+ Kıç Düzleştirme
+ </string>
+ <string name="Butt Physics Gravity">
+ Kıç Yerçekimi
+ </string>
+ <string name="Butt Physics Drag">
+ Kıç Direnci
+ </string>
+ <string name="Butt Physics UpDown Max Effect">
+ Maks Etki
+ </string>
+ <string name="Butt Physics UpDown Spring">
+ Yaylanma
+ </string>
+ <string name="Butt Physics UpDown Gain">
+ Kazanç
+ </string>
+ <string name="Butt Physics UpDown Damping">
+ Sönüm
+ </string>
+ <string name="Butt Physics LeftRight Max Effect">
+ Maks Etki
+ </string>
+ <string name="Butt Physics LeftRight Spring">
+ Yaylanma
+ </string>
+ <string name="Butt Physics LeftRight Gain">
+ Kazanç
+ </string>
+ <string name="Butt Physics LeftRight Damping">
+ Sönüm
+ </string>
+ <string name="Bushy Eyebrows">
+ Gür Kaşlar
+ </string>
+ <string name="Bushy Hair">
+ Gür Saç
+ </string>
+ <string name="Butt Size">
+ Kıç Büyüklüğü
+ </string>
+ <string name="Butt Gravity">
+ Kıç Yerçekimi
+ </string>
+ <string name="bustle skirt">
+ Tarlatanlı Etek
+ </string>
+ <string name="no bustle">
+ Tarlatansız
+ </string>
+ <string name="more bustle">
+ Çok Tarlatanlı
+ </string>
+ <string name="Chaplin">
+ Chaplin pantalon
+ </string>
+ <string name="Cheek Bones">
+ Elmacık Kemikleri
+ </string>
+ <string name="Chest Size">
+ Göğüs Büyüklüğü
+ </string>
+ <string name="Chin Angle">
+ Çene Açısı
+ </string>
+ <string name="Chin Cleft">
+ Çene Çukuru
+ </string>
+ <string name="Chin Curtains">
+ Lincoln Sakal
+ </string>
+ <string name="Chin Depth">
+ Çene Derinliği
+ </string>
+ <string name="Chin Heavy">
+ Geniş Çene
+ </string>
+ <string name="Chin In">
+ Çene İçeri
+ </string>
+ <string name="Chin Out">
+ Çene Dışarı
+ </string>
+ <string name="Chin-Neck">
+ Çene-Boyun
+ </string>
+ <string name="Clear">
+ Temizle
+ </string>
+ <string name="Cleft">
+ Çukur
+ </string>
+ <string name="Close Set Eyes">
+ Yakın Gözler
+ </string>
+ <string name="Closed">
+ Kapalı
+ </string>
+ <string name="Closed Back">
+ Arkası Kapalı
+ </string>
+ <string name="Closed Front">
+ Önü Kapalı
+ </string>
+ <string name="Closed Left">
+ Solu Kapalı
+ </string>
+ <string name="Closed Right">
+ Sağı Kapalı
+ </string>
+ <string name="Coin Purse">
+ Para Cüzdanı
+ </string>
+ <string name="Collar Back">
+ Yaka Arkası
+ </string>
+ <string name="Collar Front">
+ Yaka Önü
+ </string>
+ <string name="Corner Down">
+ Köşesi Aşağıda
+ </string>
+ <string name="Corner Up">
+ Köşesi Yukarıda
+ </string>
+ <string name="Creased">
+ Kırışık
+ </string>
+ <string name="Crooked Nose">
+ Yamuk Burun
+ </string>
+ <string name="Cuff Flare">
+ Geniş Paça
+ </string>
+ <string name="Dark">
+ Karanlık
+ </string>
+ <string name="Dark Green">
+ Koyu YeÅŸil
+ </string>
+ <string name="Darker">
+ Daha Koyu
+ </string>
+ <string name="Deep">
+ Derin
+ </string>
+ <string name="Default Heels">
+ Varsayılan Topuklar
+ </string>
+ <string name="Dense">
+ YoÄŸun
+ </string>
+ <string name="Double Chin">
+ Çift Çene
+ </string>
+ <string name="Downturned">
+ Aşağı Dönük
+ </string>
+ <string name="Duffle Bag">
+ Spor Çanta
+ </string>
+ <string name="Ear Angle">
+ Kulak Açısı
+ </string>
+ <string name="Ear Size">
+ Kulak Büyüklüğü
+ </string>
+ <string name="Ear Tips">
+ Kulak Uçları
+ </string>
+ <string name="Egg Head">
+ Yumurta Kafa
+ </string>
+ <string name="Eye Bags">
+ Göz Altı Torbaları
+ </string>
+ <string name="Eye Color">
+ Göz Rengi
+ </string>
+ <string name="Eye Depth">
+ Gözün İçeri Çöküklüğü
+ </string>
+ <string name="Eye Lightness">
+ Göz Parlaklığı
+ </string>
+ <string name="Eye Opening">
+ Göz Açıklığı
+ </string>
+ <string name="Eye Pop">
+ Gözlerin Dışarı Çıkıklığı
+ </string>
+ <string name="Eye Size">
+ Göz Büyüklüğü
+ </string>
+ <string name="Eye Spacing">
+ Gözlerin Aralığı
+ </string>
+ <string name="Eyebrow Arc">
+ KaÅŸ Kavisi
+ </string>
+ <string name="Eyebrow Density">
+ Kaş Kalınlığı
+ </string>
+ <string name="Eyebrow Height">
+ Kaş Yüksekliği
+ </string>
+ <string name="Eyebrow Points">
+ Kaş Yapısı
+ </string>
+ <string name="Eyebrow Size">
+ Kaş Büyüklüğü
+ </string>
+ <string name="Eyelash Length">
+ Kirpik UzunluÄŸu
+ </string>
+ <string name="Eyeliner">
+ Göz Kalemi
+ </string>
+ <string name="Eyeliner Color">
+ Göz Kalemi Rengi
+ </string>
+ <string name="Eyes Bugged">
+ Patlak Gözler
+ </string>
+ <string name="Face Shear">
+ Dikey Yüz Kaydırma
+ </string>
+ <string name="Facial Definition">
+ Yüz İfadesi
+ </string>
+ <string name="Far Set Eyes">
+ Ayrık Gözler
+ </string>
+ <string name="Fat Lips">
+ Kalın Dudaklar
+ </string>
+ <string name="Female">
+ Kadın
+ </string>
+ <string name="Fingerless">
+ Parmaksız
+ </string>
+ <string name="Fingers">
+ Parmaklar
+ </string>
+ <string name="Flared Cuffs">
+ Geniş Paçalar
+ </string>
+ <string name="Flat">
+ Düz
+ </string>
+ <string name="Flat Butt">
+ Düz Kıç
+ </string>
+ <string name="Flat Head">
+ Düz Kafa
+ </string>
+ <string name="Flat Toe">
+ Düz Ayak Ucu
+ </string>
+ <string name="Foot Size">
+ Ayak Büyüklüğü
+ </string>
+ <string name="Forehead Angle">
+ Alın Açısı
+ </string>
+ <string name="Forehead Heavy">
+ Belirgin Alın
+ </string>
+ <string name="Freckles">
+ Çiller
+ </string>
+ <string name="Front Fringe">
+ Ön Perçem
+ </string>
+ <string name="Full Back">
+ Arkası Düz
+ </string>
+ <string name="Full Eyeliner">
+ Çift Taraflı Göz Kalemi
+ </string>
+ <string name="Full Front">
+ Önü Düz
+ </string>
+ <string name="Full Hair Sides">
+ Saçlar Yanda
+ </string>
+ <string name="Full Sides">
+ Saçlar Yanda
+ </string>
+ <string name="Glossy">
+ Parlak
+ </string>
+ <string name="Glove Fingers">
+ Eldiven Parmakları
+ </string>
+ <string name="Glove Length">
+ Eldiven UzunluÄŸu
+ </string>
+ <string name="Hair">
+ Saç
+ </string>
+ <string name="Hair Back">
+ Saç: Arka
+ </string>
+ <string name="Hair Front">
+ Saç: Ön
+ </string>
+ <string name="Hair Sides">
+ Saç: Yanlar
+ </string>
+ <string name="Hair Sweep">
+ Saçı Yana Tarama
+ </string>
+ <string name="Hair Thickess">
+ Saç Kalınlığı
+ </string>
+ <string name="Hair Thickness">
+ Saç Kalınlığı
+ </string>
+ <string name="Hair Tilt">
+ Saç Eğimi
+ </string>
+ <string name="Hair Tilted Left">
+ Sola Eğimli Saç
+ </string>
+ <string name="Hair Tilted Right">
+ Sağa Eğimli Saç
+ </string>
+ <string name="Hair Volume">
+ Saç: Hacim
+ </string>
+ <string name="Hand Size">
+ El Büyüklüğü
+ </string>
+ <string name="Handlebars">
+ Gidon tipi
+ </string>
+ <string name="Head Length">
+ Kafa UzunluÄŸu
+ </string>
+ <string name="Head Shape">
+ Kafa Åžekli
+ </string>
+ <string name="Head Size">
+ Kafa Büyüklüğü
+ </string>
+ <string name="Head Stretch">
+ Kafayı Uzatma
+ </string>
+ <string name="Heel Height">
+ Topuk Yüksekliği
+ </string>
+ <string name="Heel Shape">
+ Topuk Åžekli
+ </string>
+ <string name="Height">
+ Yükseklik
+ </string>
+ <string name="High">
+ Yüksek
+ </string>
+ <string name="High Heels">
+ Yüksek Topuklar
+ </string>
+ <string name="High Jaw">
+ Ayrık
+ </string>
+ <string name="High Platforms">
+ Yüksek Topuklu
+ </string>
+ <string name="High and Tight">
+ Düşük
+ </string>
+ <string name="Higher">
+ Daha Yüksek
+ </string>
+ <string name="Hip Length">
+ Kalça Uzunluğu
+ </string>
+ <string name="Hip Width">
+ Kalça Genişliği
+ </string>
+ <string name="In">
+ İçeri
+ </string>
+ <string name="In Shdw Color">
+ İç Gölge Rengi
+ </string>
+ <string name="In Shdw Opacity">
+ İç Gölge Opaklığı
+ </string>
+ <string name="Inner Eye Corner">
+ Gözün İç Köşesi
+ </string>
+ <string name="Inner Eye Shadow">
+ İç Göz Gölgesi
+ </string>
+ <string name="Inner Shadow">
+ İç Gölge
+ </string>
+ <string name="Jacket Length">
+ Ceket UzunluÄŸu
+ </string>
+ <string name="Jacket Wrinkles">
+ Ceket Kırışıklıkları
+ </string>
+ <string name="Jaw Angle">
+ Çenenin Boyuna Uzaklığı
+ </string>
+ <string name="Jaw Jut">
+ Alt Çene Uzunluğu
+ </string>
+ <string name="Jaw Shape">
+ Çene Kemiği Genişliği
+ </string>
+ <string name="Join">
+ BirleÅŸik
+ </string>
+ <string name="Jowls">
+ Avurtlar
+ </string>
+ <string name="Knee Angle">
+ Diz Açısı
+ </string>
+ <string name="Knock Kneed">
+ Çarpık Bacaklı
+ </string>
+ <string name="Large">
+ Büyük
+ </string>
+ <string name="Large Hands">
+ Büyük Eller
+ </string>
+ <string name="Left Part">
+ Sola Ayırma
+ </string>
+ <string name="Leg Length">
+ Bacak UzunluÄŸu
+ </string>
+ <string name="Leg Muscles">
+ Bacak Kasları
+ </string>
+ <string name="Less">
+ Daha Az
+ </string>
+ <string name="Less Body Fat">
+ Daha Az Vücut Yağı
+ </string>
+ <string name="Less Curtains">
+ Daha Az Lincoln Sakal
+ </string>
+ <string name="Less Freckles">
+ Daha Az Çil
+ </string>
+ <string name="Less Full">
+ Daha Az Dolgun
+ </string>
+ <string name="Less Gravity">
+ Dik Göğüs
+ </string>
+ <string name="Less Love">
+ Daha İnce Bel
+ </string>
+ <string name="Less Muscles">
+ Daha Az Kas
+ </string>
+ <string name="Less Muscular">
+ Daha Az Kaslı
+ </string>
+ <string name="Less Rosy">
+ Daha Az Pembe
+ </string>
+ <string name="Less Round">
+ Daha Az Yuvarlak
+ </string>
+ <string name="Less Saddle">
+ Basensiz
+ </string>
+ <string name="Less Square">
+ Daha Az Küt
+ </string>
+ <string name="Less Volume">
+ Daha Az Hacim
+ </string>
+ <string name="Less soul">
+ Daha az ruh
+ </string>
+ <string name="Lighter">
+ Daha Hafif
+ </string>
+ <string name="Lip Cleft">
+ Dudak Çukuru
+ </string>
+ <string name="Lip Cleft Depth">
+ Dudak Çukuru Derinliği
+ </string>
+ <string name="Lip Fullness">
+ Dudak DolgunluÄŸu
+ </string>
+ <string name="Lip Pinkness">
+ Dudak PembeliÄŸi
+ </string>
+ <string name="Lip Ratio">
+ Dudak Oranı
+ </string>
+ <string name="Lip Thickness">
+ Dudak Kalınlığı
+ </string>
+ <string name="Lip Width">
+ Dudak GeniÅŸliÄŸi
+ </string>
+ <string name="Lipgloss">
+ Dudak Parlatıcısı
+ </string>
+ <string name="Lipstick">
+ Ruj
+ </string>
+ <string name="Lipstick Color">
+ Ruj Rengi
+ </string>
+ <string name="Long">
+ Uzun
+ </string>
+ <string name="Long Head">
+ Uzun Kafa
+ </string>
+ <string name="Long Hips">
+ Yüksek kalça
+ </string>
+ <string name="Long Legs">
+ Uzun Bacaklar
+ </string>
+ <string name="Long Neck">
+ Uzun Boyun
+ </string>
+ <string name="Long Pigtails">
+ Yandan Uzun Kuyruk
+ </string>
+ <string name="Long Ponytail">
+ Uzun AtkuyruÄŸu
+ </string>
+ <string name="Long Torso">
+ Uzun Gövde
+ </string>
+ <string name="Long arms">
+ Uzun kollar
+ </string>
+ <string name="Loose Pants">
+ Bol Pantolon
+ </string>
+ <string name="Loose Shirt">
+ Bol Gömlek
+ </string>
+ <string name="Loose Sleeves">
+ Bol Kollu
+ </string>
+ <string name="Love Handles">
+ Bel Kalınlığı
+ </string>
+ <string name="Low">
+ Düşük
+ </string>
+ <string name="Low Heels">
+ Alçak Topuklar
+ </string>
+ <string name="Low Jaw">
+ BitiÅŸik
+ </string>
+ <string name="Low Platforms">
+ Alçak Topuklu
+ </string>
+ <string name="Low and Loose">
+ Yüksek
+ </string>
+ <string name="Lower">
+ Daha Alçak
+ </string>
+ <string name="Lower Bridge">
+ Alt Burun KemiÄŸi
+ </string>
+ <string name="Lower Cheeks">
+ Daha Alçak Yanaklar
+ </string>
+ <string name="Male">
+ Erkek
+ </string>
+ <string name="Middle Part">
+ Ortadan Ayırma
+ </string>
+ <string name="More">
+ Daha Fazla
+ </string>
+ <string name="More Blush">
+ Daha Fazla Allık
+ </string>
+ <string name="More Body Fat">
+ Daha Fazla Vücut Yağı
+ </string>
+ <string name="More Curtains">
+ Daha Çok Lincoln Sakal
+ </string>
+ <string name="More Eyeshadow">
+ Daha Fazla Göz Farı
+ </string>
+ <string name="More Freckles">
+ Daha Çok Çil
+ </string>
+ <string name="More Full">
+ Daha Dolgun
+ </string>
+ <string name="More Gravity">
+ Sarkık Göğüs
+ </string>
+ <string name="More Lipstick">
+ Daha Çok Ruj
+ </string>
+ <string name="More Love">
+ Daha Kalın Bel
+ </string>
+ <string name="More Lower Lip">
+ Daha Dolgun Alt Dudak
+ </string>
+ <string name="More Muscles">
+ Daha Çok Kas
+ </string>
+ <string name="More Muscular">
+ Daha Kaslı
+ </string>
+ <string name="More Rosy">
+ Daha Pembe
+ </string>
+ <string name="More Round">
+ Daha Yuvarlak
+ </string>
+ <string name="More Saddle">
+ Basenli
+ </string>
+ <string name="More Sloped">
+ Daha EÄŸimli
+ </string>
+ <string name="More Square">
+ Daha Küt
+ </string>
+ <string name="More Upper Lip">
+ Daha Dolgun Üst Dudak
+ </string>
+ <string name="More Vertical">
+ Daha Dikey
+ </string>
+ <string name="More Volume">
+ Daha Hacimli
+ </string>
+ <string name="More soul">
+ Daha çok ruh
+ </string>
+ <string name="Moustache">
+ Bıyık
+ </string>
+ <string name="Mouth Corner">
+ Ağız Köşesi
+ </string>
+ <string name="Mouth Position">
+ Ağzın Konumu
+ </string>
+ <string name="Mowhawk">
+ Mowhawk Saçı
+ </string>
+ <string name="Muscular">
+ Kaslı
+ </string>
+ <string name="Mutton Chops">
+ GeniÅŸ Favori
+ </string>
+ <string name="Nail Polish">
+ Tırnak Cilası
+ </string>
+ <string name="Nail Polish Color">
+ Tırnak Cilası Rengi
+ </string>
+ <string name="Narrow">
+ Dar
+ </string>
+ <string name="Narrow Back">
+ Arkası Dar
+ </string>
+ <string name="Narrow Front">
+ Önü Dar
+ </string>
+ <string name="Narrow Lips">
+ Küçük Dudaklar
+ </string>
+ <string name="Natural">
+ DoÄŸal
+ </string>
+ <string name="Neck Length">
+ Boyun UzunluÄŸu
+ </string>
+ <string name="Neck Thickness">
+ Boyun Kalınlığı
+ </string>
+ <string name="No Blush">
+ Allık Yok
+ </string>
+ <string name="No Eyeliner">
+ Göz Kalemi Yok
+ </string>
+ <string name="No Eyeshadow">
+ Göz Farı Yok
+ </string>
+ <string name="No Lipgloss">
+ Dudak Parlatıcısı Yok
+ </string>
+ <string name="No Lipstick">
+ Ruj Yok
+ </string>
+ <string name="No Part">
+ Ayırma Yok
+ </string>
+ <string name="No Polish">
+ Cila Yok
+ </string>
+ <string name="No Red">
+ Kırmızı Yok
+ </string>
+ <string name="No Spikes">
+ DikleÅŸtirme Yok
+ </string>
+ <string name="No White">
+ Beyaz Yok
+ </string>
+ <string name="No Wrinkles">
+ Kırışıklık Yok
+ </string>
+ <string name="Normal Lower">
+ Normal Alt
+ </string>
+ <string name="Normal Upper">
+ Normal Üst
+ </string>
+ <string name="Nose Left">
+ Sola EÄŸimli Burun
+ </string>
+ <string name="Nose Right">
+ SaÄŸa EÄŸimli Burun
+ </string>
+ <string name="Nose Size">
+ Burun Büyüklüğü
+ </string>
+ <string name="Nose Thickness">
+ Burun Kalınlığı
+ </string>
+ <string name="Nose Tip Angle">
+ Burun Ucu Açısı
+ </string>
+ <string name="Nose Tip Shape">
+ Burun Ucu Åžekli
+ </string>
+ <string name="Nose Width">
+ Burun GeniÅŸliÄŸi
+ </string>
+ <string name="Nostril Division">
+ Burun Deliği Ayrımı
+ </string>
+ <string name="Nostril Width">
+ Burun DeliÄŸi GeniÅŸliÄŸi
+ </string>
+ <string name="Opaque">
+ Opak
+ </string>
+ <string name="Open">
+ Aç
+ </string>
+ <string name="Open Back">
+ Arkayı Aç
+ </string>
+ <string name="Open Front">
+ Önü Aç
+ </string>
+ <string name="Open Left">
+ Solu Aç
+ </string>
+ <string name="Open Right">
+ Sağı Aç
+ </string>
+ <string name="Orange">
+ Turuncu
+ </string>
+ <string name="Out">
+ Dışarı
+ </string>
+ <string name="Out Shdw Color">
+ Dış Gölge Rengi
+ </string>
+ <string name="Out Shdw Opacity">
+ Dış Gölge Opaklığı
+ </string>
+ <string name="Outer Eye Corner">
+ Gözün Dış Köşesi
+ </string>
+ <string name="Outer Eye Shadow">
+ Dış Göz Gölgesi
+ </string>
+ <string name="Outer Shadow">
+ Dış Gölge
+ </string>
+ <string name="Overbite">
+ Öne Doğru
+ </string>
+ <string name="Package">
+ Apış Arası Şişkinliği
+ </string>
+ <string name="Painted Nails">
+ Ojeli Tırnaklar
+ </string>
+ <string name="Pale">
+ Soluk
+ </string>
+ <string name="Pants Crotch">
+ Pantolon Ağı
+ </string>
+ <string name="Pants Fit">
+ Pantolon Oturması
+ </string>
+ <string name="Pants Length">
+ Pantolon UzunluÄŸu
+ </string>
+ <string name="Pants Waist">
+ Pantolon Bel Ölçüsü
+ </string>
+ <string name="Pants Wrinkles">
+ Pantolon Kırışıklıkları
+ </string>
+ <string name="Part">
+ Ayırma
+ </string>
+ <string name="Part Bangs">
+ Ayrılmış Kahküller
+ </string>
+ <string name="Pectorals">
+ Göğüs Kasları
+ </string>
+ <string name="Pigment">
+ Pigment
+ </string>
+ <string name="Pigtails">
+ Yan Kuyruklar
+ </string>
+ <string name="Pink">
+ Pembe
+ </string>
+ <string name="Pinker">
+ Daha Pembe
+ </string>
+ <string name="Platform Height">
+ Topuk Yüksekliği
+ </string>
+ <string name="Platform Width">
+ Topuk GeniÅŸliÄŸi
+ </string>
+ <string name="Pointy">
+ Dar
+ </string>
+ <string name="Pointy Heels">
+ Sivri Topuklar
+ </string>
+ <string name="Ponytail">
+ AtkuyruÄŸu
+ </string>
+ <string name="Poofy Skirt">
+ Kabarık Etek
+ </string>
+ <string name="Pop Left Eye">
+ Sol Gözü Dışarı Çıkar
+ </string>
+ <string name="Pop Right Eye">
+ Sağ Gözü Dışarı Çıkar
+ </string>
+ <string name="Puffy">
+ ÅžiÅŸkin
+ </string>
+ <string name="Puffy Eyelids">
+ Şişkin Göz Kapakları
+ </string>
+ <string name="Rainbow Color">
+ Gökkuşağı Rengi
+ </string>
+ <string name="Red Hair">
+ Kırmızı Saç
+ </string>
+ <string name="Regular">
+ Normal
+ </string>
+ <string name="Right Part">
+ Sağa Ayırma
+ </string>
+ <string name="Rosy Complexion">
+ Kırmızı Yanaklı
+ </string>
+ <string name="Round">
+ Yuvarlak
+ </string>
+ <string name="Ruddiness">
+ Kırmızılık
+ </string>
+ <string name="Ruddy">
+ Kırmızı
+ </string>
+ <string name="Rumpled Hair">
+ Dağınık Saç
+ </string>
+ <string name="Saddle Bags">
+ Basen GeniÅŸliÄŸi
+ </string>
+ <string name="Scrawny Leg">
+ Sıska Bacak
+ </string>
+ <string name="Separate">
+ Ayrık
+ </string>
+ <string name="Shallow">
+ Sığ
+ </string>
+ <string name="Shear Back">
+ Arka DolgunluÄŸu
+ </string>
+ <string name="Shear Face">
+ Yüzü Dikey Kaydır
+ </string>
+ <string name="Shear Front">
+ Ön Dolgunluğu
+ </string>
+ <string name="Shear Left Up">
+ Solu Yukarı Kaydır
+ </string>
+ <string name="Shear Right Up">
+ Sağı Yukarı Kaydır
+ </string>
+ <string name="Sheared Back">
+ Arkası Dolgun
+ </string>
+ <string name="Sheared Front">
+ Önü Dolgun
+ </string>
+ <string name="Shift Left">
+ Sola Kaydır
+ </string>
+ <string name="Shift Mouth">
+ Ağzı Kaydırma
+ </string>
+ <string name="Shift Right">
+ Sağa Kaydır
+ </string>
+ <string name="Shirt Bottom">
+ Gömlek Eteği
+ </string>
+ <string name="Shirt Fit">
+ Gömlek Boyu
+ </string>
+ <string name="Shirt Wrinkles">
+ Gömlek Kırışıklıkları
+ </string>
+ <string name="Shoe Height">
+ Ayakkabı Yüksekliği
+ </string>
+ <string name="Short">
+ Kısa
+ </string>
+ <string name="Short Arms">
+ Kısa Kollar
+ </string>
+ <string name="Short Legs">
+ Kısa Bacaklar
+ </string>
+ <string name="Short Neck">
+ Kısa Boyun
+ </string>
+ <string name="Short Pigtails">
+ Yandan Kısa Kuyruk
+ </string>
+ <string name="Short Ponytail">
+ Kısa Atkuyruğu
+ </string>
+ <string name="Short Sideburns">
+ Kısa Favoriler
+ </string>
+ <string name="Short Torso">
+ Kısa Gövde
+ </string>
+ <string name="Short hips">
+ Düşük kalça
+ </string>
+ <string name="Shoulders">
+ Omuzlar
+ </string>
+ <string name="Side Fringe">
+ Yan Perçem
+ </string>
+ <string name="Sideburns">
+ Favoriler
+ </string>
+ <string name="Sides Hair">
+ Yan Saçlar
+ </string>
+ <string name="Sides Hair Down">
+ Aşağı Doğru Yan Saç
+ </string>
+ <string name="Sides Hair Up">
+ Yukarı Doğru Yan Saç
+ </string>
+ <string name="Skinny Neck">
+ İnce Boyun
+ </string>
+ <string name="Skirt Fit">
+ Etek Boyu
+ </string>
+ <string name="Skirt Length">
+ Etek UzunluÄŸu
+ </string>
+ <string name="Slanted Forehead">
+ Eğimli Alın
+ </string>
+ <string name="Sleeve Length">
+ Kol UzunluÄŸu
+ </string>
+ <string name="Sleeve Looseness">
+ Kol BolluÄŸu
+ </string>
+ <string name="Slit Back">
+ Yırtmaç: Geri
+ </string>
+ <string name="Slit Front">
+ Yırtmaç: Ön
+ </string>
+ <string name="Slit Left">
+ Yırtmaç: Sol
+ </string>
+ <string name="Slit Right">
+ Yırtmaç: Sağ
+ </string>
+ <string name="Small">
+ Küçük
+ </string>
+ <string name="Small Hands">
+ Küçük Eller
+ </string>
+ <string name="Small Head">
+ Küçük Kafa
+ </string>
+ <string name="Smooth">
+ Düz
+ </string>
+ <string name="Smooth Hair">
+ Düz Saç
+ </string>
+ <string name="Socks Length">
+ Çorap Uzunluğu
+ </string>
+ <string name="Soulpatch">
+ Dudak Altı Sakal
+ </string>
+ <string name="Sparse">
+ Seyrek
+ </string>
+ <string name="Spiked Hair">
+ Dikleştirilmiş Saç
+ </string>
+ <string name="Square">
+ GeniÅŸ
+ </string>
+ <string name="Square Toe">
+ Küt Burunlu
+ </string>
+ <string name="Squash Head">
+ Kafayı Bastır
+ </string>
+ <string name="Stretch Head">
+ Kafayı Uzat
+ </string>
+ <string name="Sunken">
+ Çökük
+ </string>
+ <string name="Sunken Chest">
+ Çökük Göğüs
+ </string>
+ <string name="Sunken Eyes">
+ Çökük Gözler
+ </string>
+ <string name="Sweep Back">
+ Arkaya Tarama
+ </string>
+ <string name="Sweep Forward">
+ Öne Tarama
+ </string>
+ <string name="Tall">
+ Uzun
+ </string>
+ <string name="Taper Back">
+ Arkası Kısa
+ </string>
+ <string name="Taper Front">
+ Önü Kısa
+ </string>
+ <string name="Thick Heels">
+ Kalın Topuklar
+ </string>
+ <string name="Thick Neck">
+ Kalın Boyun
+ </string>
+ <string name="Thick Toe">
+ Kalın Ayak Ucu
+ </string>
+ <string name="Thin">
+ İnce
+ </string>
+ <string name="Thin Eyebrows">
+ İnce Kaşlar
+ </string>
+ <string name="Thin Lips">
+ İnce Dudaklar
+ </string>
+ <string name="Thin Nose">
+ İnce Burun
+ </string>
+ <string name="Tight Chin">
+ Çift Çene
+ </string>
+ <string name="Tight Cuffs">
+ Dar Paçalar
+ </string>
+ <string name="Tight Pants">
+ Dar Pantolon
+ </string>
+ <string name="Tight Shirt">
+ Dar Gömlek
+ </string>
+ <string name="Tight Skirt">
+ Dar Etek
+ </string>
+ <string name="Tight Sleeves">
+ Dar Kollu
+ </string>
+ <string name="Toe Shape">
+ Ayakkabu Burnu Åžekli
+ </string>
+ <string name="Toe Thickness">
+ Ayakkabu Burnu Kalınlığı
+ </string>
+ <string name="Torso Length">
+ Gövde Uzunluğu
+ </string>
+ <string name="Torso Muscles">
+ Gövde Kasları
+ </string>
+ <string name="Torso Scrawny">
+ Sıska Gövde
+ </string>
+ <string name="Unattached">
+ Ayrık
+ </string>
+ <string name="Uncreased">
+ BuruÅŸuk olmayan
+ </string>
+ <string name="Underbite">
+ Geriye DoÄŸru
+ </string>
+ <string name="Unnatural">
+ DoÄŸal Olmayan
+ </string>
+ <string name="Upper Bridge">
+ Üst Burun Kemiği
+ </string>
+ <string name="Upper Cheeks">
+ Üst Yanaklar
+ </string>
+ <string name="Upper Chin Cleft">
+ Üst Çene Çukuru
+ </string>
+ <string name="Upper Eyelid Fold">
+ Üst Göz Kapağı Kıvrımı
+ </string>
+ <string name="Upturned">
+ Yukarı dönük
+ </string>
+ <string name="Very Red">
+ Çok Kırmızı
+ </string>
+ <string name="Waist Height">
+ Bel Yüksekliği
+ </string>
+ <string name="Well-Fed">
+ Dolgun
+ </string>
+ <string name="White Hair">
+ Beyaz Saç
+ </string>
+ <string name="Wide">
+ GeniÅŸ
+ </string>
+ <string name="Wide Back">
+ GeniÅŸ Arka
+ </string>
+ <string name="Wide Front">
+ Geniş Ön
+ </string>
+ <string name="Wide Lips">
+ GeniÅŸ Dudaklar
+ </string>
+ <string name="Wild">
+ Çılgın
+ </string>
+ <string name="Wrinkles">
+ Kırışıklıklar
+ </string>
+ <string name="LocationCtrlAddLandmarkTooltip">
+ Yer İmlerime Ekle
+ </string>
+ <string name="LocationCtrlEditLandmarkTooltip">
+ Yer İmimi Düzenle
+ </string>
+ <string name="LocationCtrlInfoBtnTooltip">
+ Geçerli konum hakkında daha fazla bilgi gör
+ </string>
+ <string name="LocationCtrlComboBtnTooltip">
+ Konum geçmişim
+ </string>
+ <string name="LocationCtrlForSaleTooltip">
+ Bu araziyi satın al
+ </string>
+ <string name="LocationCtrlVoiceTooltip">
+ Ses burada kullanılamaz
+ </string>
+ <string name="LocationCtrlFlyTooltip">
+ Uçmaya izin verilmiyor
+ </string>
+ <string name="LocationCtrlPushTooltip">
+ İtme yok
+ </string>
+ <string name="LocationCtrlBuildTooltip">
+ Nesne inşa etmeye/düşürmeye izin verilmiyor
+ </string>
+ <string name="LocationCtrlScriptsTooltip">
+ Komut dosyalarına izin verilmiyor
+ </string>
+ <string name="LocationCtrlDamageTooltip">
+ Sağlık
+ </string>
+ <string name="LocationCtrlAdultIconTooltip">
+ Yetişkin Bölgesi
+ </string>
+ <string name="LocationCtrlModerateIconTooltip">
+ Orta Bölge
+ </string>
+ <string name="LocationCtrlGeneralIconTooltip">
+ Genel Bölge
+ </string>
+ <string name="LocationCtrlSeeAVsTooltip">
+ Bu parselin dışında avatarlar görünür durumda ve sohbete izin veriliyor
+ </string>
+ <string name="UpdaterWindowTitle">
+ [APP_NAME] Güncelleştirme
+ </string>
+ <string name="UpdaterNowUpdating">
+ [APP_NAME] güncelleştiriliyor...
+ </string>
+ <string name="UpdaterNowInstalling">
+ [APP_NAME] yükleniyor...
+ </string>
+ <string name="UpdaterUpdatingDescriptive">
+ [APP_NAME] Görüntüleyiciniz en son sürüme güncelleştiriliyor. Bu biraz zaman alabilir, bu nedenle sabırlı olun.
+ </string>
+ <string name="UpdaterProgressBarTextWithEllipses">
+ Güncelleştirme karşıdan yükleniyor...
+ </string>
+ <string name="UpdaterProgressBarText">
+ Güncelleştirme karşıdan yükleniyor
+ </string>
+ <string name="UpdaterFailDownloadTitle">
+ Güncelleştirmenin karşıdan yüklenmesi başarılamadı
+ </string>
+ <string name="UpdaterFailUpdateDescriptive">
+ [APP_NAME] güncellenirken bir hata oluştu. Lütfen www.secondlife.com adresinden son sürümü karşıdan yükleyin.
+ </string>
+ <string name="UpdaterFailInstallTitle">
+ Güncelleştirmenin yüklenmesi başarılamadı
+ </string>
+ <string name="UpdaterFailStartTitle">
+ Görüntüleyici başlatılamadı
+ </string>
+ <string name="ItemsComingInTooFastFrom">
+ [APP_NAME]: [FROM_NAME]&apos;den öğeler çok hızlı geliyor, [TIME] saniye boyunca otomatik ön izleme devre dışı bırakıldı
+ </string>
+ <string name="ItemsComingInTooFast">
+ [APP_NAME]: Öğeler çok hızlı geliyor, [TIME] saniye boyunca otomatik ön izleme devre dışı bırakıldı
+ </string>
+ <string name="IM_logging_string">
+ -- Anlık ileti günlük tutulması etkin --
+ </string>
+ <string name="IM_typing_start_string">
+ [NAME] yazıyor...
+ </string>
+ <string name="Unnamed">
+ (İsimsiz)
+ </string>
+ <string name="IM_moderated_chat_label">
+ (Yönetilen: Varsayılan durumda sesler kapalı)
+ </string>
+ <string name="IM_unavailable_text_label">
+ Bu aramada metin sohbeti kullanılamaz.
+ </string>
+ <string name="IM_muted_text_label">
+ Bir Grup Moderatörü tarafından metin sohbetiniz devre dışı bırakıldı.
+ </string>
+ <string name="IM_default_text_label">
+ Anlık ileti göndermek için buraya tıklayın.
+ </string>
+ <string name="IM_to_label">
+ Kime
+ </string>
+ <string name="IM_moderator_label">
+ (Moderatör)
+ </string>
+ <string name="Saved_message">
+ (Kaydedildi [LONG_TIMESTAMP])
+ </string>
+ <string name="IM_unblock_only_groups_friends">
+ Bu mesajı görmek için Tercihler/Gizlilik&apos;de &apos;Sadece arkadaşlar ve gruplar beni arasın veya Aİ göndersin&apos; seçeneğinin işaretini kaldırmalısınız.
+ </string>
+ <string name="answered_call">
+ Aramanız yanıtlandı
+ </string>
+ <string name="you_started_call">
+ Bir sesli arama başlattınız
+ </string>
+ <string name="you_joined_call">
+ Sesli aramaya katıldınız
+ </string>
+ <string name="name_started_call">
+ [NAME] bir sesli arama başlattı
+ </string>
+ <string name="ringing-im">
+ Sesli aramaya katılınılıyor...
+ </string>
+ <string name="connected-im">
+ Bağlandı, kapatmak için Aramadan Çık üzerine tıklayın
+ </string>
+ <string name="hang_up-im">
+ Sesli aramadan çıkıldı
+ </string>
+ <string name="answering-im">
+ Bağlanıyor...
+ </string>
+ <string name="conference-title">
+ Özel Konferans
+ </string>
+ <string name="conference-title-incoming">
+ [AGENT_NAME] ile konferans
+ </string>
+ <string name="inventory_item_offered-im">
+ Teklif edilen envanter öğesi:
+ </string>
+ <string name="share_alert">
+ Envanterinizden buraya öğeler sürükleyin
+ </string>
+ <string name="no_session_message">
+ (Aİ Oturumu Mevcut Değil)
+ </string>
+ <string name="only_user_message">
+ Bu oturumdaki tek kullanıcısınız.
+ </string>
+ <string name="offline_message">
+ [NAME] çevrim dışı.
+ </string>
+ <string name="invite_message">
+ Bu sesli sohbeti kabul etmek/bağlanmak için [BUTTON NAME] düğmesine tıklayın.
+ </string>
+ <string name="muted_message">
+ Bu Sakini engellediniz. Bir ileti gönderdiğinizde engelleme otomatik olarak kaldırılır.
+ </string>
+ <string name="generic">
+ Talep gönderilirken hata oluştu, lütfen daha sonra tekrar deneyin.
+ </string>
+ <string name="generic_request_error">
+ Talep gönderilirken hata oluştu, lütfen daha sonra tekrar deneyin.
+ </string>
+ <string name="insufficient_perms_error">
+ Yeterli izne sahip deÄŸilsiniz.
+ </string>
+ <string name="session_does_not_exist_error">
+ Bu oturum artık mevcut değil.
+ </string>
+ <string name="no_ability_error">
+ Bu yeteneÄŸe sahip deÄŸilsiniz.
+ </string>
+ <string name="no_ability">
+ Bu yeteneÄŸe sahip deÄŸilsiniz.
+ </string>
+ <string name="not_a_mod_error">
+ Bir oturum moderatörü değilsiniz.
+ </string>
+ <string name="muted">
+ Bir grup moderatörü metin sohbetinizi devre dışı bıraktı.
+ </string>
+ <string name="muted_error">
+ Bir grup moderatörü metin sohbetinizi devre dışı bıraktı.
+ </string>
+ <string name="add_session_event">
+ [RECIPIENT] ile sohbet oturumuna kullanıcı eklenemiyor.
+ </string>
+ <string name="message">
+ İletiniz [RECIPIENT] ile sohbet oturumuna gönderilemedi.
+ </string>
+ <string name="message_session_event">
+ İletiniz [RECIPIENT] ile sohbet oturumuna gönderilemedi.
+ </string>
+ <string name="mute">
+ Yönetme sırasında hata oluştu.
+ </string>
+ <string name="removed">
+ Gruptan çıkarıldınız.
+ </string>
+ <string name="removed_from_group">
+ Gruptan çıkarıldınız.
+ </string>
+ <string name="close_on_no_ability">
+ Sohbet oturumunda bulunma yeteneğine artık sahip değilsiniz.
+ </string>
+ <string name="unread_chat_single">
+ [SOURCES] yeni bir şey söyledi
+ </string>
+ <string name="unread_chat_multiple">
+ [SOURCES] yeni bir şey söyledi
+ </string>
+ <string name="session_initialization_timed_out_error">
+ Oturum başlatılması zaman aşımına uğradı.
+ </string>
+ <string name="Home position set.">
+ Ana konum ayarlandı.
+ </string>
+ <string name="voice_morphing_url">
+ http://secondlife.com/landing/voicemorphing
+ </string>
+ <string name="paid_you_ldollars">
+ [NAME] size [REASON] L$[AMOUNT] ödedi.
+ </string>
+ <string name="paid_you_ldollars_no_reason">
+ [NAME] size L$[AMOUNT] ödedi.
+ </string>
+ <string name="you_paid_ldollars">
+ [NAME]&apos;e [REASON] L$[AMOUNT] ödediniz.
+ </string>
+ <string name="you_paid_ldollars_no_info">
+ L$[AMOUNT] ödediniz.
+ </string>
+ <string name="you_paid_ldollars_no_reason">
+ [NAME]&apos;e L$[AMOUNT] ödediniz.
+ </string>
+ <string name="you_paid_ldollars_no_name">
+ [REASON] L$[AMOUNT] ödediniz.
+ </string>
+ <string name="you_paid_failure_ldollars">
+ [REASON] [NAME]&apos;e L$[AMOUNT] ödeyemediniz.
+ </string>
+ <string name="you_paid_failure_ldollars_no_info">
+ L$[AMOUNT] ödeyemediniz.
+ </string>
+ <string name="you_paid_failure_ldollars_no_reason">
+ [NAME]&apos;e L$[AMOUNT] ödeyemediniz.
+ </string>
+ <string name="you_paid_failure_ldollars_no_name">
+ [REASON] L$[AMOUNT] ödeyemediniz.
+ </string>
+ <string name="for item">
+ [ITEM] için.
+ </string>
+ <string name="for a parcel of land">
+ bir arazi parseli için.
+ </string>
+ <string name="for a land access pass">
+ bir arazi erişim hakkı için
+ </string>
+ <string name="for deeding land">
+ arazi devretmek için
+ </string>
+ <string name="to create a group">
+ bir grup oluşturmak için
+ </string>
+ <string name="to join a group">
+ bir grupa katılmak için
+ </string>
+ <string name="to upload">
+ karşıya yüklemek için
+ </string>
+ <string name="to publish a classified ad">
+ bir ilan yayınlamak için
+ </string>
+ <string name="giving">
+ L$ [AMOUNT] veriliyor
+ </string>
+ <string name="uploading_costs">
+ Karşıya yüklemenin maliyeti: L$ [AMOUNT]
+ </string>
+ <string name="this_costs">
+ Bunun maliyeti: L$ [AMOUNT]
+ </string>
+ <string name="buying_selected_land">
+ L$ [AMOUNT] karşılığında seçilen arazi satın alınıyor
+ </string>
+ <string name="this_object_costs">
+ Bu nesnenin maliyeti: L$ [AMOUNT]
+ </string>
+ <string name="group_role_everyone">
+ Herkes
+ </string>
+ <string name="group_role_officers">
+ Yetkililer
+ </string>
+ <string name="group_role_owners">
+ Sahipler
+ </string>
+ <string name="group_member_status_online">
+ Çevrimiçi
+ </string>
+ <string name="uploading_abuse_report">
+ Kötüye Kullanım Bildirimi Karşıya Yükleniyor...
+ </string>
+ <string name="New Shape">
+ Yeni Åžekil
+ </string>
+ <string name="New Skin">
+ Yeni Dış Katman
+ </string>
+ <string name="New Hair">
+ Yeni Saç
+ </string>
+ <string name="New Eyes">
+ Yeni Gözler
+ </string>
+ <string name="New Shirt">
+ Yeni Gömlek
+ </string>
+ <string name="New Pants">
+ Yeni Pantolon
+ </string>
+ <string name="New Shoes">
+ Yeni Ayakkabılar
+ </string>
+ <string name="New Socks">
+ Yeni Çoraplar
+ </string>
+ <string name="New Jacket">
+ Yeni Ceket
+ </string>
+ <string name="New Gloves">
+ Yeni Eldivenler
+ </string>
+ <string name="New Undershirt">
+ Yeni Fanila
+ </string>
+ <string name="New Underpants">
+ Yeni Külot
+ </string>
+ <string name="New Skirt">
+ Yeni Etek
+ </string>
+ <string name="New Alpha">
+ Yeni Alfa
+ </string>
+ <string name="New Tattoo">
+ Yeni Dövme
+ </string>
+ <string name="New Physics">
+ Yeni Fizik
+ </string>
+ <string name="Invalid Wearable">
+ Geçersiz Giyilebilir
+ </string>
+ <string name="New Gesture">
+ Yeni Mimik
+ </string>
+ <string name="New Script">
+ Yeni Komut Dosyası
+ </string>
+ <string name="New Note">
+ Yeni Not
+ </string>
+ <string name="New Folder">
+ Yeni Klasör
+ </string>
+ <string name="Contents">
+ İçerik
+ </string>
+ <string name="Gesture">
+ Mimik
+ </string>
+ <string name="Male Gestures">
+ Erkek Mimikleri
+ </string>
+ <string name="Female Gestures">
+ Kadın Mimikleri
+ </string>
+ <string name="Other Gestures">
+ DiÄŸer Mimikler
+ </string>
+ <string name="Speech Gestures">
+ KonuÅŸma Mimikleri
+ </string>
+ <string name="Common Gestures">
+ Favori Mimikler
+ </string>
+ <string name="Male - Excuse me">
+ Erkek - Afedersiniz
+ </string>
+ <string name="Male - Get lost">
+ Erkek - İşine bak
+ </string>
+ <string name="Male - Blow kiss">
+ Erkek - Öpücük gönderme
+ </string>
+ <string name="Male - Boo">
+ Erkek - Yuh çekme
+ </string>
+ <string name="Male - Bored">
+ Erkek - Canı sıkılmış
+ </string>
+ <string name="Male - Hey">
+ Erkek - Hey
+ </string>
+ <string name="Male - Laugh">
+ Erkek - Gülme
+ </string>
+ <string name="Male - Repulsed">
+ Erkek - TiksinmiÅŸ
+ </string>
+ <string name="Male - Shrug">
+ Erkek - Omuz Silkme
+ </string>
+ <string name="Male - Stick tougue out">
+ Erkek - Dil çıkarma
+ </string>
+ <string name="Male - Wow">
+ Erkek - Vay be
+ </string>
+ <string name="Female - Chuckle">
+ Kadın - Kıkırdama
+ </string>
+ <string name="Female - Cry">
+ Kadın - Ağlama
+ </string>
+ <string name="Female - Embarrassed">
+ Kadın - Utanmış
+ </string>
+ <string name="Female - Excuse me">
+ Kadın - Afedersiniz
+ </string>
+ <string name="Female - Get lost">
+ Kadın - İşine bak
+ </string>
+ <string name="Female - Blow kiss">
+ Kadın - Öpücük gönderme
+ </string>
+ <string name="Female - Boo">
+ Kadın - Yuh çekme
+ </string>
+ <string name="Female - Bored">
+ Kadın - Canı sıkılmış
+ </string>
+ <string name="Female - Hey">
+ Kadın - Hey
+ </string>
+ <string name="Female - Hey baby">
+ Kadın - Hey bebek
+ </string>
+ <string name="Female - Laugh">
+ Kadın - Gülme
+ </string>
+ <string name="Female - Looking good">
+ Kadın - Yakışıklı
+ </string>
+ <string name="Female - Over here">
+ Kadın - Buraya baksana
+ </string>
+ <string name="Female - Please">
+ Kadın - Lütfen
+ </string>
+ <string name="Female - Repulsed">
+ Kadın - Tiksinmiş
+ </string>
+ <string name="Female - Shrug">
+ Kadın - Omuz Silkme
+ </string>
+ <string name="Female - Stick tougue out">
+ Kadın - Dil çıkarma
+ </string>
+ <string name="Female - Wow">
+ Kadın - Vay be
+ </string>
+ <string name="/bow">
+ /selamlama
+ </string>
+ <string name="/clap">
+ /alkış
+ </string>
+ <string name="/count">
+ /sayım
+ </string>
+ <string name="/extinguish">
+ /söndürme
+ </string>
+ <string name="/kmb">
+ /hib
+ </string>
+ <string name="/muscle">
+ /kas
+ </string>
+ <string name="/no">
+ /hayır
+ </string>
+ <string name="/no!">
+ /hayır!
+ </string>
+ <string name="/paper">
+ /kağıt
+ </string>
+ <string name="/pointme">
+ /beni göster
+ </string>
+ <string name="/pointyou">
+ /seni göster
+ </string>
+ <string name="/rock">
+ /kaya
+ </string>
+ <string name="/scissor">
+ /makas
+ </string>
+ <string name="/smoke">
+ /duman
+ </string>
+ <string name="/stretch">
+ /uzatma
+ </string>
+ <string name="/whistle">
+ /ıslık
+ </string>
+ <string name="/yes">
+ /evet
+ </string>
+ <string name="/yes!">
+ /evet!
+ </string>
+ <string name="afk">
+ kbd
+ </string>
+ <string name="dance1">
+ dans1
+ </string>
+ <string name="dance2">
+ dans2
+ </string>
+ <string name="dance3">
+ dans3
+ </string>
+ <string name="dance4">
+ dans4
+ </string>
+ <string name="dance5">
+ dans5
+ </string>
+ <string name="dance6">
+ dans6
+ </string>
+ <string name="dance7">
+ dans7
+ </string>
+ <string name="dance8">
+ dans8
+ </string>
+ <string name="AvatarBirthDateFormat">
+ [mthnum,datetime,slt]/[day,datetime,slt]/[year,datetime,slt]
+ </string>
+ <string name="DefaultMimeType">
+ hiçbiri/hiçbiri
+ </string>
+ <string name="texture_load_dimensions_error">
+ [WIDTH]*[HEIGHT] çözünürlüğünden büyük görüntüler yüklenemez
+ </string>
+ <string name="words_separator" value=","/>
+ <string name="server_is_down">
+ Tüm çabalarımıza rağmen beklenmeyen bir hata meydana geldi.
+
+ Hizmetle ilişkili bilinen bir sorun olup olmadığını görmek için lütfen status.secondlifegrid.net adresine bakın.
+ Sorun yaşamaya devam ederseniz lütfen ağınızın ve güvenlik duvarınızın ayarlarına bakın.
+ </string>
+ <string name="dateTimeWeekdaysNames">
+ Pazar:Pazartesi:Salı:Çarşamba:Perşembe:Cuma:Cumartesi
+ </string>
+ <string name="dateTimeWeekdaysShortNames">
+ Paz:Pzt:Sal:Çar:Per:Cum:Cmt
+ </string>
+ <string name="dateTimeMonthNames">
+ Ocak:Şubat:Mart:Nisan:Mayıs:Haziran:Temmuz:Ağustos:Eylül:Ekim:Kasım:Aralık
+ </string>
+ <string name="dateTimeMonthShortNames">
+ Oca:Åžub:Mar:Nis:May:Haz:Tem:AÄŸu:Eyl:Eki:Kas:Ara
+ </string>
+ <string name="dateTimeDayFormat">
+ [MDAY]
+ </string>
+ <string name="dateTimeAM">
+ ÖÖ
+ </string>
+ <string name="dateTimePM">
+ ÖS
+ </string>
+ <string name="LocalEstimateUSD">
+ US$ [AMOUNT]
+ </string>
+ <string name="Membership">
+ Üyelik
+ </string>
+ <string name="Roles">
+ Roller
+ </string>
+ <string name="Group Identity">
+ Grup KimliÄŸi
+ </string>
+ <string name="Parcel Management">
+ Parsel Yönetimi
+ </string>
+ <string name="Parcel Identity">
+ Parsel KimliÄŸi
+ </string>
+ <string name="Parcel Settings">
+ Parsel Ayarları
+ </string>
+ <string name="Parcel Powers">
+ Parsel Güçleri
+ </string>
+ <string name="Parcel Access">
+ Parsel EriÅŸimi
+ </string>
+ <string name="Parcel Content">
+ Parsel İçeriği
+ </string>
+ <string name="Object Management">
+ Nesne Yönetimi
+ </string>
+ <string name="Accounting">
+ Muhasebe
+ </string>
+ <string name="Notices">
+ Bildirimler
+ </string>
+ <string name="Chat">
+ Sohbet
+ </string>
+ <string name="DeleteItems">
+ Seçili öğeler silinsin mi?
+ </string>
+ <string name="DeleteItem">
+ Seçili öğe silinsin mi?
+ </string>
+ <string name="EmptyOutfitText">
+ Bu dış görünümde herhangi bir öğe yok
+ </string>
+ <string name="ExternalEditorNotSet">
+ ExternalEditor ayarını kullanarak bir düzenleyici seçin.
+ </string>
+ <string name="ExternalEditorNotFound">
+ Belirttiğiniz harici düzenleyici bulunamadı.
+Düzenleyici yolunu çift tırnakla çevrelemeyi deneyin.
+(örn. &quot;/yolum/duzenleyici&quot; &quot;%s&quot;)
+ </string>
+ <string name="ExternalEditorCommandParseError">
+ Harici düzenleyici komutu ayrıştırılırken hata oluştu.
+ </string>
+ <string name="ExternalEditorFailedToRun">
+ Harici düzenleyici çalışmadı.
+ </string>
+ <string name="TranslationFailed">
+ Çeviri başarılamadı: [REASON]
+ </string>
+ <string name="TranslationResponseParseError">
+ Çeviri yanıtı ayrıştırılırken hata meydana geldi.
+ </string>
+ <string name="Esc">
+ Esc
+ </string>
+ <string name="Space">
+ BoÅŸluk
+ </string>
+ <string name="Enter">
+ Enter
+ </string>
+ <string name="Tab">
+ Sekme
+ </string>
+ <string name="Ins">
+ Ins
+ </string>
+ <string name="Del">
+ Del
+ </string>
+ <string name="Backsp">
+ Geri tuÅŸu
+ </string>
+ <string name="Shift">
+ Shift
+ </string>
+ <string name="Ctrl">
+ Ctrl
+ </string>
+ <string name="Alt">
+ Alt
+ </string>
+ <string name="CapsLock">
+ CapsLock
+ </string>
+ <string name="Left">
+ Sol
+ </string>
+ <string name="Right">
+ SaÄŸ
+ </string>
+ <string name="Up">
+ Yukarı
+ </string>
+ <string name="Down">
+ Aşağı
+ </string>
+ <string name="Home">
+ Home
+ </string>
+ <string name="End">
+ End
+ </string>
+ <string name="PgUp">
+ PgUp
+ </string>
+ <string name="PgDn">
+ PgDn
+ </string>
+ <string name="F1">
+ F1
+ </string>
+ <string name="F2">
+ F2
+ </string>
+ <string name="F3">
+ F3
+ </string>
+ <string name="F4">
+ F4
+ </string>
+ <string name="F5">
+ F5
+ </string>
+ <string name="F6">
+ F6
+ </string>
+ <string name="F7">
+ F7
+ </string>
+ <string name="F8">
+ F8
+ </string>
+ <string name="F9">
+ F9
+ </string>
+ <string name="F10">
+ F10
+ </string>
+ <string name="F11">
+ F11
+ </string>
+ <string name="F12">
+ F12
+ </string>
+ <string name="Add">
+ Ekle
+ </string>
+ <string name="Subtract">
+ Çıkar
+ </string>
+ <string name="Multiply">
+ Çarp
+ </string>
+ <string name="Divide">
+ Böl
+ </string>
+ <string name="PAD_DIVIDE">
+ PAD_DIVIDE
+ </string>
+ <string name="PAD_LEFT">
+ PAD_LEFT
+ </string>
+ <string name="PAD_RIGHT">
+ PAD_RIGHT
+ </string>
+ <string name="PAD_DOWN">
+ PAD_DOWN
+ </string>
+ <string name="PAD_UP">
+ PAD_UP
+ </string>
+ <string name="PAD_HOME">
+ PAD_HOME
+ </string>
+ <string name="PAD_END">
+ PAD_END
+ </string>
+ <string name="PAD_PGUP">
+ PAD_PGUP
+ </string>
+ <string name="PAD_PGDN">
+ PAD_PGDN
+ </string>
+ <string name="PAD_CENTER">
+ PAD_CENTER
+ </string>
+ <string name="PAD_INS">
+ PAD_INS
+ </string>
+ <string name="PAD_DEL">
+ PAD_DEL
+ </string>
+ <string name="PAD_Enter">
+ PAD_Enter
+ </string>
+ <string name="PAD_BUTTON0">
+ PAD_BUTTON0
+ </string>
+ <string name="PAD_BUTTON1">
+ PAD_BUTTON1
+ </string>
+ <string name="PAD_BUTTON2">
+ PAD_BUTTON2
+ </string>
+ <string name="PAD_BUTTON3">
+ PAD_BUTTON3
+ </string>
+ <string name="PAD_BUTTON4">
+ PAD_BUTTON4
+ </string>
+ <string name="PAD_BUTTON5">
+ PAD_BUTTON5
+ </string>
+ <string name="PAD_BUTTON6">
+ PAD_BUTTON6
+ </string>
+ <string name="PAD_BUTTON7">
+ PAD_BUTTON7
+ </string>
+ <string name="PAD_BUTTON8">
+ PAD_BUTTON8
+ </string>
+ <string name="PAD_BUTTON9">
+ PAD_BUTTON9
+ </string>
+ <string name="PAD_BUTTON10">
+ PAD_BUTTON10
+ </string>
+ <string name="PAD_BUTTON11">
+ PAD_BUTTON11
+ </string>
+ <string name="PAD_BUTTON12">
+ PAD_BUTTON12
+ </string>
+ <string name="PAD_BUTTON13">
+ PAD_BUTTON13
+ </string>
+ <string name="PAD_BUTTON14">
+ PAD_BUTTON14
+ </string>
+ <string name="PAD_BUTTON15">
+ PAD_BUTTON15
+ </string>
+ <string name="-">
+ -
+ </string>
+ <string name="=">
+ =
+ </string>
+ <string name="`">
+ `
+ </string>
+ <string name=";">
+ ;
+ </string>
+ <string name="[">
+ [
+ </string>
+ <string name="]">
+ ]
+ </string>
+ <string name="\">
+ \
+ </string>
+ <string name="0">
+ 0
+ </string>
+ <string name="1">
+ 1
+ </string>
+ <string name="2">
+ 2
+ </string>
+ <string name="3">
+ 3
+ </string>
+ <string name="4">
+ 4
+ </string>
+ <string name="5">
+ 5
+ </string>
+ <string name="6">
+ 6
+ </string>
+ <string name="7">
+ 7
+ </string>
+ <string name="8">
+ 8
+ </string>
+ <string name="9">
+ 9
+ </string>
+ <string name="A">
+ A
+ </string>
+ <string name="B">
+ B
+ </string>
+ <string name="C">
+ C
+ </string>
+ <string name="D">
+ D
+ </string>
+ <string name="E">
+ E
+ </string>
+ <string name="F">
+ F
+ </string>
+ <string name="G">
+ G
+ </string>
+ <string name="H">
+ H
+ </string>
+ <string name="I">
+ I
+ </string>
+ <string name="J">
+ J
+ </string>
+ <string name="K">
+ K
+ </string>
+ <string name="L">
+ L
+ </string>
+ <string name="M">
+ M
+ </string>
+ <string name="N">
+ N
+ </string>
+ <string name="O">
+ O
+ </string>
+ <string name="P">
+ P
+ </string>
+ <string name="Q">
+ Q
+ </string>
+ <string name="R">
+ R
+ </string>
+ <string name="S">
+ S
+ </string>
+ <string name="T">
+ T
+ </string>
+ <string name="U">
+ U
+ </string>
+ <string name="V">
+ V
+ </string>
+ <string name="W">
+ W
+ </string>
+ <string name="X">
+ X
+ </string>
+ <string name="Y">
+ Y
+ </string>
+ <string name="Z">
+ Z
+ </string>
+ <string name="BeaconParticle">
+ Parçacık işaretleri gösteriliyor (mavi)
+ </string>
+ <string name="BeaconPhysical">
+ Fiziksel nesne işaretleri gösteriliyor (yeşil)
+ </string>
+ <string name="BeaconScripted">
+ Komut dosyalı nesne işaretleri gösteriliyor (kırmızı)
+ </string>
+ <string name="BeaconScriptedTouch">
+ Dokunma işlevli komut dosyalı nesne işaretleri gösteriliyor (kırmızı)
+ </string>
+ <string name="BeaconSound">
+ Ses işaretleri gösteriliyor (sarı)
+ </string>
+ <string name="BeaconMedia">
+ Ortam işaretleri gösteriliyor (beyaz)
+ </string>
+ <string name="ParticleHiding">
+ Parçacıklar Gizleniyor
+ </string>
+ <string name="Command_AboutLand_Label">
+ Arazi hakkında
+ </string>
+ <string name="Command_Appearance_Label">
+ Görünüm
+ </string>
+ <string name="Command_Avatar_Label">
+ Avatar
+ </string>
+ <string name="Command_Build_Label">
+ İnşa Et
+ </string>
+ <string name="Command_Chat_Label">
+ Sohbet
+ </string>
+ <string name="Command_Compass_Label">
+ Pusula
+ </string>
+ <string name="Command_Destinations_Label">
+ Hedef Konum
+ </string>
+ <string name="Command_Gestures_Label">
+ Mimikler
+ </string>
+ <string name="Command_HowTo_Label">
+ Nasıl yapılır
+ </string>
+ <string name="Command_Inventory_Label">
+ Envanter
+ </string>
+ <string name="Command_Map_Label">
+ Harita
+ </string>
+ <string name="Command_Marketplace_Label">
+ Pazaryeri
+ </string>
+ <string name="Command_MiniMap_Label">
+ Mini-harita
+ </string>
+ <string name="Command_Move_Label">
+ Yürü / koş / uç
+ </string>
+ <string name="Command_Outbox_Label">
+ Satıcı giden kutusu
+ </string>
+ <string name="Command_People_Label">
+ KiÅŸiler
+ </string>
+ <string name="Command_Picks_Label">
+ Seçmeler
+ </string>
+ <string name="Command_Places_Label">
+ Yerler
+ </string>
+ <string name="Command_Preferences_Label">
+ Tercihler
+ </string>
+ <string name="Command_Profile_Label">
+ Profil
+ </string>
+ <string name="Command_Search_Label">
+ Ara
+ </string>
+ <string name="Command_Snapshot_Label">
+ Anlık görüntü
+ </string>
+ <string name="Command_Speak_Label">
+ KonuÅŸ
+ </string>
+ <string name="Command_View_Label">
+ Kamera denetimleri
+ </string>
+ <string name="Command_Voice_Label">
+ Ses ayarları
+ </string>
+ <string name="Command_AboutLand_Tooltip">
+ Ziyaret ettiÄŸiniz araziyle ilgili bilgi
+ </string>
+ <string name="Command_Appearance_Tooltip">
+ Avatarınızı değiştirin
+ </string>
+ <string name="Command_Avatar_Tooltip">
+ Eksiksiz bir avatar seçin
+ </string>
+ <string name="Command_Build_Tooltip">
+ Nesneler oluşturma ve yüzeyi şekillendirme
+ </string>
+ <string name="Command_Chat_Tooltip">
+ Metin kullanarak yakındaki kişilerle sohbet etmek
+ </string>
+ <string name="Command_Compass_Tooltip">
+ Pusula
+ </string>
+ <string name="Command_Destinations_Tooltip">
+ İlgilendiğiniz hedef konumlar
+ </string>
+ <string name="Command_Gestures_Tooltip">
+ Avatarınız için mimikler
+ </string>
+ <string name="Command_HowTo_Tooltip">
+ Genel görevleri nasıl yapacağınız
+ </string>
+ <string name="Command_Inventory_Tooltip">
+ Eşyalarınızı görüntüleyin ve kullanın
+ </string>
+ <string name="Command_Map_Tooltip">
+ Dünya haritası
+ </string>
+ <string name="Command_Marketplace_Tooltip">
+ Alışveriş yap
+ </string>
+ <string name="Command_MiniMap_Tooltip">
+ Yakındaki kişileri göster
+ </string>
+ <string name="Command_Move_Tooltip">
+ Avatarınızı hareket ettirmek
+ </string>
+ <string name="Command_Outbox_Tooltip">
+ Satmak amacıyla Pazaryerinize öğeler taşıyın
+ </string>
+ <string name="Command_People_Tooltip">
+ Arkadaşlar, gruplar ve yakındaki kişiler
+ </string>
+ <string name="Command_Picks_Tooltip">
+ Profilinizde favori olarak gösterilecek yerler
+ </string>
+ <string name="Command_Places_Tooltip">
+ KaydettiÄŸiniz yerler
+ </string>
+ <string name="Command_Preferences_Tooltip">
+ Tercihler
+ </string>
+ <string name="Command_Profile_Tooltip">
+ Profilinizi düzenleyin veya görüntüleyin
+ </string>
+ <string name="Command_Search_Tooltip">
+ Yerler, etkinlikler ve kiÅŸiler bulmak
+ </string>
+ <string name="Command_Snapshot_Tooltip">
+ Resim çekin
+ </string>
+ <string name="Command_Speak_Tooltip">
+ Mikrofonunuzu kullanarak yakındaki kişilerle konuşun
+ </string>
+ <string name="Command_View_Tooltip">
+ Kamera açısını değiştirmek
+ </string>
+ <string name="Command_Voice_Tooltip">
+ Aramalar ve SL dünyası içinde size yakın kişiler için ses denetimleri
+ </string>
+ <string name="Toolbar_Bottom_Tooltip">
+ şu anda alt araç çubuğunuzda
+ </string>
+ <string name="Toolbar_Left_Tooltip">
+ şu anda sol araç çubuğunuzda
+ </string>
+ <string name="Toolbar_Right_Tooltip">
+ şu anda sağ araç çubuğunuzda
+ </string>
+ <string name="Retain%">
+ Koru %
+ </string>
+ <string name="Detail">
+ Ayrıntı
+ </string>
+ <string name="Better Detail">
+ Daha İyi Ayrıntı
+ </string>
+ <string name="Surface">
+ Yüzey
+ </string>
+ <string name="Solid">
+ Katı
+ </string>
+ <string name="Wrap">
+ Sar
+ </string>
+ <string name="Preview">
+ Önizleme
+ </string>
+ <string name="Normal">
+ Normal
+ </string>
+ <string name="snapshot_quality_very_low">
+ Çok Düşük
+ </string>
+ <string name="snapshot_quality_low">
+ Düşük
+ </string>
+ <string name="snapshot_quality_medium">
+ Orta
+ </string>
+ <string name="snapshot_quality_high">
+ Yüksek
+ </string>
+ <string name="snapshot_quality_very_high">
+ Çok Yüksek
+ </string>
+</strings>
diff --git a/indra/newview/skins/steam/xui/zh/strings.xml b/indra/newview/skins/steam/xui/zh/strings.xml
new file mode 100644
index 0000000000..882b617289
--- /dev/null
+++ b/indra/newview/skins/steam/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">
+ 第二人生
+ </string>
+ <string name="APP_NAME">
+ 第二人生
+ </string>
+ <string name="CAPITALIZED_APP_NAME">
+ 第二人生
+ </string>
+ <string name="SECOND_LIFE_GRID">
+ 第二人生網格
+ </string>
+ <string name="SUPPORT_SITE">
+ 第二人生支æ´å…¥å£
+ </string>
+ <string name="StartupDetectingHardware">
+ ç¡¬é«”åµæ¸¬ä¸­...
+ </string>
+ <string name="StartupLoading">
+ [APP_NAME] 載入中...
+ </string>
+ <string name="StartupClearingCache">
+ å¿«å–æ¸…除中...
+ </string>
+ <string name="StartupInitializingTextureCache">
+ æè³ªå¿«å–åˆå§‹åŒ–中...
+ </string>
+ <string name="StartupInitializingVFS">
+ VFS åˆå§‹åŒ–中...
+ </string>
+ <string name="ProgressRestoring">
+ 回存中...
+ </string>
+ <string name="ProgressChangingResolution">
+ 變更解æžåº¦...
+ </string>
+ <string name="Fullbright">
+ 全亮(舊版)
+ </string>
+ <string name="LoginInProgress">
+ 登入中。[APP_NAME] å¯èƒ½å‡ºç¾å‡çµç‹€æ…‹ã€‚è«‹è€å¿ƒç¨ç­‰ã€‚
+ </string>
+ <string name="LoginInProgressNoFrozen">
+ 登入中...
+ </string>
+ <string name="LoginAuthenticating">
+ 身份驗證中
+ </string>
+ <string name="LoginMaintenance">
+ 進行帳戶維護...
+ </string>
+ <string name="LoginAttempt">
+ å…ˆå‰ä¼åœ–嘗試登入失敗。ç¾ç™»å…¥ä¸­ï¼Œå˜—試 [NUMBER]
+ </string>
+ <string name="LoginPrecaching">
+ 世界載入中...
+ </string>
+ <string name="LoginInitializingBrowser">
+ 內嵌å¼ç¶²é ç€è¦½å™¨åˆå§‹åŒ–中...
+ </string>
+ <string name="LoginInitializingMultimedia">
+ 多媒體åˆå§‹åŒ–中...
+ </string>
+ <string name="LoginInitializingFonts">
+ 字型載入中...
+ </string>
+ <string name="LoginVerifyingCache">
+ é©—è­‰å¿«å–æª”案(約需 60-90 ç§’å·¦å³ï¼‰...
+ </string>
+ <string name="LoginProcessingResponse">
+ 回應處ç†ä¸­...
+ </string>
+ <string name="LoginInitializingWorld">
+ 世界åˆå§‹åŒ–中...
+ </string>
+ <string name="LoginDecodingImages">
+ 圖åƒè§£ç¢¼ä¸­...
+ </string>
+ <string name="LoginInitializingQuicktime">
+ QuickTime åˆå§‹åŒ–中...
+ </string>
+ <string name="LoginQuicktimeNotFound">
+ QuickTime æœªç™¼ç¾ - 無法進行åˆå§‹åŒ–。
+ </string>
+ <string name="LoginQuicktimeOK">
+ QuickTime å·²æˆåŠŸåˆå§‹åŒ–。
+ </string>
+ <string name="LoginWaitingForRegionHandshake">
+ 地å€äº¤æ¡ç­‰å¾…中...
+ </string>
+ <string name="LoginConnectingToRegion">
+ 地å€è¯çµä¸­...
+ </string>
+ <string name="LoginDownloadingClothing">
+ æœè£ä¸‹è¼‰ä¸­...
+ </string>
+ <string name="InvalidCertificate">
+ 伺æœå™¨å›žå‚³ä¸€å€‹ç„¡æ•ˆæžœæå£žçš„æ†‘證。請連繫網格管ç†è€…。
+ </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/?sourceid=1206_steam
+ </string>
+ <string name="AgentLostConnection">
+ 這個地å€å¯èƒ½é­é‡å•題,請檢查你的網路連線。
+ </string>
+ <string name="SavingSettings">
+ 你的設定儲存中...
+ </string>
+ <string name="LoggingOut">
+ 登出中...
+ </string>
+ <string name="ShuttingDown">
+ 關閉中...
+ </string>
+ <string name="YouHaveBeenDisconnected">
+ 你已經被所在的地å€ä¸­æ–·è¯çµã€‚
+ </string>
+ <string name="SentToInvalidRegion">
+ 你被傳é€åˆ°ä¸€å€‹ç„¡æ•ˆçš„地å€ã€‚
+ </string>
+ <string name="TestingDisconnect">
+ 測試ç€è¦½å™¨æ–·ç·š
+ </string>
+ <string name="TooltipPerson">
+ 人
+ </string>
+ <string name="TooltipNoName">
+ (無å稱)
+ </string>
+ <string name="TooltipOwner">
+ æ“æœ‰è€…:
+ </string>
+ <string name="TooltipPublic">
+ 公開
+ </string>
+ <string name="TooltipIsGroup">
+ (群組)
+ </string>
+ <string name="TooltipForSaleL$">
+ 出售: L$[AMOUNT]
+ </string>
+ <string name="TooltipFlagGroupBuild">
+ 群組建造
+ </string>
+ <string name="TooltipFlagNoBuild">
+ ç¦æ­¢å»ºé€ 
+ </string>
+ <string name="TooltipFlagNoEdit">
+ 群組建造
+ </string>
+ <string name="TooltipFlagNotSafe">
+ éžå®‰å…¨
+ </string>
+ <string name="TooltipFlagNoFly">
+ ç¦æ­¢é£›è¡Œ
+ </string>
+ <string name="TooltipFlagGroupScripts">
+ 群組腳本
+ </string>
+ <string name="TooltipFlagNoScripts">
+ ç¦æ­¢è…³æœ¬
+ </string>
+ <string name="TooltipLand">
+ 土地:
+ </string>
+ <string name="TooltipMustSingleDrop">
+ åªæœ‰ä¸€å€‹ç‰©å“å¯ä»¥è¢«æ‹–曳到此處
+ </string>
+ <string name="TooltipPrice" value="L$[AMOUNT]:"/>
+ <string name="TooltipHttpUrl">
+ 點擊以察看這個網é 
+ </string>
+ <string name="TooltipSLURL">
+ 點擊以察看這個ä½ç½®è³‡è¨Š
+ </string>
+ <string name="TooltipAgentUrl">
+ 點擊以察看這個居民檔案
+ </string>
+ <string name="TooltipAgentInspect">
+ 瞭解更多有關這個居民
+ </string>
+ <string name="TooltipAgentMute">
+ 點擊以å°éޖ這ä½å±…æ°‘
+ </string>
+ <string name="TooltipAgentUnmute">
+ 點擊以解除å°éޖ這ä½å±…æ°‘
+ </string>
+ <string name="TooltipAgentIM">
+ 點擊開始 IM 這ä½å±…æ°‘
+ </string>
+ <string name="TooltipAgentPay">
+ 點擊以支付這ä½å±…æ°‘
+ </string>
+ <string name="TooltipAgentOfferTeleport">
+ 點擊以é€å‡ºçž¬é–“傳é€é‚€è«‹çµ¦é€™ä½å±…æ°‘
+ </string>
+ <string name="TooltipAgentRequestFriend">
+ 點擊以é€å‡ºäº¤å‹é‚€è«‹çµ¦é€™ä½å±…æ°‘
+ </string>
+ <string name="TooltipGroupUrl">
+ 點擊以察看這個群組的æè¿°
+ </string>
+ <string name="TooltipEventUrl">
+ 點擊以察看這個活動的æè¿°
+ </string>
+ <string name="TooltipClassifiedUrl">
+ Click to view this classified
+ </string>
+ <string name="TooltipParcelUrl">
+ 點擊以察看這個地段的æè¿°
+ </string>
+ <string name="TooltipTeleportUrl">
+ 點擊以傳é€åˆ°é€™å€‹ä½ç½®
+ </string>
+ <string name="TooltipObjectIMUrl">
+ 點擊以察看這個物件的æè¿°
+ </string>
+ <string name="TooltipMapUrl">
+ 點擊以察看此處在地圖上的ä½ç½®
+ </string>
+ <string name="TooltipSLAPP">
+ 點擊以執行 secondlife:// 指令
+ </string>
+ <string name="CurrentURL" value="ç›®å‰ç¶²å€ï¼š[CurrentURL]"/>
+ <string name="SLurlLabelTeleport">
+ 瞬間傳é€åˆ°
+ </string>
+ <string name="SLurlLabelShowOnMap">
+ 顯示地圖為了
+ </string>
+ <string name="SLappAgentMute">
+ å°éŽ–
+ </string>
+ <string name="SLappAgentUnmute">
+ 解除å°éŽ–
+ </string>
+ <string name="SLappAgentIM">
+ IM
+ </string>
+ <string name="SLappAgentPay">
+ 支付
+ </string>
+ <string name="SLappAgentOfferTeleport">
+ 發給瞬間傳é€è«‹æ±‚到
+ </string>
+ <string name="SLappAgentRequestFriend">
+ 交å‹è¦æ±‚
+ </string>
+ <string name="BUTTON_CLOSE_DARWIN">
+ 關閉(⌘W)
+ </string>
+ <string name="BUTTON_CLOSE_WIN">
+ 關閉(Ctrl+W)
+ </string>
+ <string name="BUTTON_CLOSE_CHROME">
+ 關閉
+ </string>
+ <string name="BUTTON_RESTORE">
+ 還原
+ </string>
+ <string name="BUTTON_MINIMIZE">
+ 最å°åŒ–
+ </string>
+ <string name="BUTTON_TEAR_OFF">
+ 脫下
+ </string>
+ <string name="BUTTON_DOCK">
+ åœæ³Šå›ºå®š
+ </string>
+ <string name="BUTTON_HELP">
+ 顯示幫助
+ </string>
+ <string name="Searching">
+ æœå°‹ä¸­...
+ </string>
+ <string name="NoneFound">
+ 未發ç¾ã€‚
+ </string>
+ <string name="RetrievingData">
+ 檢索...
+ </string>
+ <string name="ReleaseNotes">
+ 釋出版本說明
+ </string>
+ <string name="LoadingData">
+ 載入中...
+ </string>
+ <string name="AvatarNameNobody">
+ (沒有人)
+ </string>
+ <string name="AvatarNameWaiting">
+ (等待中)
+ </string>
+ <string name="AvatarNameMultiple">
+ (多個)
+ </string>
+ <string name="GroupNameNone">
+ (無)
+ </string>
+ <string name="AvalineCaller">
+ Avaline Caller [ORDER]
+ </string>
+ <string name="AssetErrorNone">
+ 無錯誤
+ </string>
+ <string name="AssetErrorRequestFailed">
+ 資產請求:失敗
+ </string>
+ <string name="AssetErrorNonexistentFile">
+ è³‡ç”¢è¦æ±‚:éžå·²å­˜åœ¨æª”案
+ </string>
+ <string name="AssetErrorNotInDatabase">
+ è³‡ç”¢è¦æ±‚ï¼šè³‡ç”¢ä¸¦æœªç™¼ç¾æ–¼è³‡æ–™åº«ä¸­
+ </string>
+ <string name="AssetErrorEOF">
+ 檔案çµå°¾
+ </string>
+ <string name="AssetErrorCannotOpenFile">
+ 無法開啟檔案
+ </string>
+ <string name="AssetErrorFileNotFound">
+ 檔案未發ç¾
+ </string>
+ <string name="AssetErrorTCPTimeout">
+ 檔案傳輸逾時
+ </string>
+ <string name="AssetErrorCircuitGone">
+ Circuit gone
+ </string>
+ <string name="AssetErrorPriceMismatch">
+ Viewer and server do not agree on price
+ </string>
+ <string name="AssetErrorUnknownStatus">
+ 未知狀態
+ </string>
+ <string name="texture">
+ æè³ª
+ </string>
+ <string name="sound">
+ è²éŸ³
+ </string>
+ <string name="calling card">
+ å片
+ </string>
+ <string name="landmark">
+ 地標
+ </string>
+ <string name="legacy script">
+ 舊版腳本
+ </string>
+ <string name="clothing">
+ æœè£
+ </string>
+ <string name="object">
+ 物件
+ </string>
+ <string name="note card">
+ 記事å¡
+ </string>
+ <string name="folder">
+ 資料夾
+ </string>
+ <string name="root">
+ 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">
+ 模擬器狀態
+ </string>
+ <string name="favorite">
+ 我的最愛
+ </string>
+ <string name="symbolic link">
+ è¯çµ
+ </string>
+ <string name="symbolic folder link">
+ 資料夾è¯çµ
+ </string>
+ <string name="AvatarEditingAppearance">
+ (外觀編輯中)
+ </string>
+ <string name="AvatarAway">
+ 離開
+ </string>
+ <string name="AvatarBusy">
+ 忙碌
+ </string>
+ <string name="AvatarMuted">
+ å°éŽ–çš„
+ </string>
+ <string name="anim_express_afraid">
+ 害怕
+ </string>
+ <string name="anim_express_anger">
+ 生氣
+ </string>
+ <string name="anim_away">
+ 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">
+ ç„¡èŠ
+ </string>
+ <string name="anim_bow">
+ Bow
+ </string>
+ <string name="anim_clap">
+ æ‹æ‰‹
+ </string>
+ <string name="anim_courtbow">
+ Court Bow
+ </string>
+ <string name="anim_express_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">
+ 親å»
+ </string>
+ <string name="anim_laugh_short">
+ 笑
+ </string>
+ <string name="anim_musclebeach">
+ Muscle Beach
+ </string>
+ <string name="anim_no_unhappy">
+ ä¸ï¼ˆä¸å¿«æ¨‚)
+ </string>
+ <string name="anim_no_head">
+ ä¸
+ </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">
+ 傷心
+ </string>
+ <string name="anim_salute">
+ 敬禮
+ </string>
+ <string name="anim_shout">
+ Shout
+ </string>
+ <string name="anim_express_shrug">
+ Shrug
+ </string>
+ <string name="anim_express_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">
+ 驚喜
+ </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">
+ 耳語
+ </string>
+ <string name="anim_whistle">
+ å¹å£å“¨
+ </string>
+ <string name="anim_express_wink">
+ 眨眼
+ </string>
+ <string name="anim_wink_hollywood">
+ 眨眼(好èŠå¡¢ï¼‰
+ </string>
+ <string name="anim_express_worry">
+ 擔心
+ </string>
+ <string name="anim_yes_happy">
+ 是(快樂)
+ </string>
+ <string name="anim_yes_head">
+ 是
+ </string>
+ <string name="texture_loading">
+ 載入中...
+ </string>
+ <string name="worldmap_offline">
+ 離線
+ </string>
+ <string name="worldmap_item_tooltip_format">
+ [AREA] m² L$[PRICE]
+ </string>
+ <string name="worldmap_results_none_found">
+ 沒有發ç¾ã€‚
+ </string>
+ <string name="Ok">
+ 確定
+ </string>
+ <string name="Premature end of file">
+ Premature end of file
+ </string>
+ <string name="ST_NO_JOINT">
+ Can&apos;t find ROOT or JOINT.
+ </string>
+ <string name="whisper">
+ 低語:
+ </string>
+ <string name="shout">
+ å¶å–Šï¼š
+ </string>
+ <string name="ringing">
+ è¯æŽ¥åˆ°è™›æ“¬ä¸–ç•Œçš„èªžéŸ³åŠŸèƒ½ä¸­...
+ </string>
+ <string name="connected">
+ å·²è¯æŽ¥
+ </string>
+ <string name="unavailable">
+ 語音èŠå¤©åŠŸèƒ½æ–¼ä½ ç›®å‰æ‰€åœ¨çš„ä½ç½®ç„¡æ³•使用
+ </string>
+ <string name="hang_up">
+ 虛擬世界中的語音èŠå¤©ä¸­æ–·
+ </string>
+ <string name="reconnect_nearby">
+ ç¾åœ¨ä½ å°‡é‡æ–°è¯æŽ¥åˆ°é™„近的語音èŠå¤©
+ </string>
+ <string name="ScriptQuestionCautionChatGranted">
+ &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">
+ 由你身上拿走林登幣(L$)
+ </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">
+ 變更它的權é™
+ </string>
+ <string name="TrackYourCamera">
+ 追蹤你的æ”影機
+ </string>
+ <string name="ControlYourCamera">
+ 控制你的æ”影機
+ </string>
+ <string name="NotConnected">
+ æœªè¯æŽ¥
+ </string>
+ <string name="SIM_ACCESS_PG">
+ 一般普級
+ </string>
+ <string name="SIM_ACCESS_MATURE">
+ é©åº¦æˆäºº
+ </string>
+ <string name="SIM_ACCESS_ADULT">
+ 完全æˆäºº
+ </string>
+ <string name="SIM_ACCESS_DOWN">
+ 離線
+ </string>
+ <string name="SIM_ACCESS_MIN">
+ 未知
+ </string>
+ <string name="land_type_unknown">
+ (未知)
+ </string>
+ <string name="Estate / Full Region">
+ 領地 / 完整地å€
+ </string>
+ <string name="Estate / Homestead">
+ 領地 / 家園
+ </string>
+ <string name="Mainland / Homestead">
+ 大陸 / 家園
+ </string>
+ <string name="Mainland / Full Region">
+ 大陸 / 完整地å€
+ </string>
+ <string name="all_files">
+ 全部檔案
+ </string>
+ <string name="sound_files">
+ è²éŸ³
+ </string>
+ <string name="animation_files">
+ 動作
+ </string>
+ <string name="image_files">
+ 圖åƒ
+ </string>
+ <string name="save_file_verb">
+ 儲存
+ </string>
+ <string name="load_file_verb">
+ 載入
+ </string>
+ <string name="targa_image_files">
+ 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 檔案
+ </string>
+ <string name="raw_file">
+ RAW 檔案
+ </string>
+ <string name="compressed_image_files">
+ 壓縮的圖åƒ
+ </string>
+ <string name="load_files">
+ 載入檔案
+ </string>
+ <string name="choose_the_directory">
+ 鏿“‡ç›®éŒ„
+ </string>
+ <string name="AvatarSetNotAway">
+ éžé›¢é–‹
+ </string>
+ <string name="AvatarSetAway">
+ 離開
+ </string>
+ <string name="AvatarSetNotBusy">
+ éžå¿™ç¢Œ
+ </string>
+ <string name="AvatarSetBusy">
+ 忙碌
+ </string>
+ <string name="shape">
+ 體形
+ </string>
+ <string name="skin">
+ 皮膚
+ </string>
+ <string name="hair">
+ é ­é«®
+ </string>
+ <string name="eyes">
+ 眼ç›
+ </string>
+ <string name="shirt">
+ 襯衫
+ </string>
+ <string name="pants">
+ 褲å­
+ </string>
+ <string name="shoes">
+ éž‹å­
+ </string>
+ <string name="socks">
+ 襪å­
+ </string>
+ <string name="jacket">
+ 夾克
+ </string>
+ <string name="gloves">
+ 手套
+ </string>
+ <string name="undershirt">
+ å…§è¡£
+ </string>
+ <string name="underpants">
+ 內褲
+ </string>
+ <string name="skirt">
+ 裙å­
+ </string>
+ <string name="alpha">
+ åŠé€æ˜Ž
+ </string>
+ <string name="tattoo">
+ 刺é’
+ </string>
+ <string name="physics">
+ 身體物ç†
+ </string>
+ <string name="invalid">
+ 無效
+ </string>
+ <string name="none">
+ ç„¡
+ </string>
+ <string name="shirt_not_worn">
+ 襯衫未穿
+ </string>
+ <string name="pants_not_worn">
+ è¤²å­æœªç©¿
+ </string>
+ <string name="shoes_not_worn">
+ éž‹å­æœªç©¿
+ </string>
+ <string name="socks_not_worn">
+ è¥ªå­æœªç©¿
+ </string>
+ <string name="jacket_not_worn">
+ 夾克未穿
+ </string>
+ <string name="gloves_not_worn">
+ 手套未穿
+ </string>
+ <string name="undershirt_not_worn">
+ 內衣未穿
+ </string>
+ <string name="underpants_not_worn">
+ 內褲未穿
+ </string>
+ <string name="skirt_not_worn">
+ è£™å­æœªç©¿
+ </string>
+ <string name="alpha_not_worn">
+ åŠé€æ˜Žæœªç©¿
+ </string>
+ <string name="tattoo_not_worn">
+ åˆºé’æœªç©¿
+ </string>
+ <string name="physics_not_worn">
+ èº«é«”ç‰©ç†æœªç©¿
+ </string>
+ <string name="invalid_not_worn">
+ 無效
+ </string>
+ <string name="create_new_shape">
+ 創造新體形
+ </string>
+ <string name="create_new_skin">
+ 創造新皮膚
+ </string>
+ <string name="create_new_hair">
+ 創造新頭髮
+ </string>
+ <string name="create_new_eyes">
+ 創造新眼ç›
+ </string>
+ <string name="create_new_shirt">
+ 創造新襯衫
+ </string>
+ <string name="create_new_pants">
+ 創造新褲å­
+ </string>
+ <string name="create_new_shoes">
+ 創造新鞋å­
+ </string>
+ <string name="create_new_socks">
+ 創造新襪å­
+ </string>
+ <string name="create_new_jacket">
+ 創造新夾克
+ </string>
+ <string name="create_new_gloves">
+ 創造新手套
+ </string>
+ <string name="create_new_undershirt">
+ 創造新內衣
+ </string>
+ <string name="create_new_underpants">
+ 創造新內褲
+ </string>
+ <string name="create_new_skirt">
+ 創造新裙å­
+ </string>
+ <string name="create_new_alpha">
+ 創造新åŠé€æ˜Ž
+ </string>
+ <string name="create_new_tattoo">
+ 創造新刺é’
+ </string>
+ <string name="create_new_physics">
+ 創造新身體物ç†
+ </string>
+ <string name="create_new_invalid">
+ 無效
+ </string>
+ <string name="NewWearable">
+ æ–° [WEARABLE_ITEM]
+ </string>
+ <string name="next">
+ 下一個
+ </string>
+ <string name="ok">
+ 確定
+ </string>
+ <string name="GroupNotifyGroupNotice">
+ 群組通知
+ </string>
+ <string name="GroupNotifyGroupNotices">
+ 群組通知
+ </string>
+ <string name="GroupNotifySentBy">
+ é€å‡ºç”±
+ </string>
+ <string name="GroupNotifyAttached">
+ Attached:
+ </string>
+ <string name="GroupNotifyViewPastNotices">
+ View past notices or opt-out of receiving these messages here.
+ </string>
+ <string name="GroupNotifyOpenAttachment">
+ Open Attachment
+ </string>
+ <string name="GroupNotifySaveAttachment">
+ Save Attachment
+ </string>
+ <string name="TeleportOffer">
+ Teleport offering
+ </string>
+ <string name="StartUpNotifications">
+ 當你離開時有新的通知é€é”。
+ </string>
+ <string name="OverflowInfoChannelString">
+ 你有約 %d 通知
+ </string>
+ <string name="BodyPartsRightArm">
+ å³è‡‚
+ </string>
+ <string name="BodyPartsHead">
+ 頭部
+ </string>
+ <string name="BodyPartsLeftArm">
+ 左臂
+ </string>
+ <string name="BodyPartsLeftLeg">
+ 左腿
+ </string>
+ <string name="BodyPartsTorso">
+ 軀幹
+ </string>
+ <string name="BodyPartsRightLeg">
+ å³è…¿
+ </string>
+ <string name="GraphicsQualityLow">
+ 低
+ </string>
+ <string name="GraphicsQualityMid">
+ 中
+ </string>
+ <string name="GraphicsQualityHigh">
+ 高
+ </string>
+ <string name="LeaveMouselook">
+ 按下 ESC éµå›žå¾©åˆ°ä¸–界的視角
+ </string>
+ <string name="InventoryNoMatchingItems">
+ 沒有發ç¾ä½ æƒ³è¦æ‰¾çš„嗎?試試 [secondlife:///app/search/all/[SEARCH_TERM] æœå°‹]。
+ </string>
+ <string name="PlacesNoMatchingItems">
+ 沒有發ç¾ä½ æƒ³è¦æ‰¾çš„嗎?試試 [secondlife:///app/search/places/[SEARCH_TERM] æœå°‹]。
+ </string>
+ <string name="FavoritesNoMatchingItems">
+ 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="ï¼ˆç¦æ­¢è½‰è®“)"/>
+ <string name="no_modify" value="ï¼ˆç¦æ­¢ä¿®æ”¹ï¼‰"/>
+ <string name="no_copy" value="ï¼ˆç¦æ­¢è¤‡è£½ï¼‰"/>
+ <string name="worn" value="(已穿)"/>
+ <string name="link" value="(è¯çµï¼‰"/>
+ <string name="broken_link" value="(æå£žçš„è¯çµï¼‰"/>
+ <string name="LoadingContents">
+ 內容載入中...
+ </string>
+ <string name="NoContents">
+ 無內容
+ </string>
+ <string name="WornOnAttachmentPoint" value="(已穿 [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="å片,"/>
+ <string name="Clothing" value="æœè£,"/>
+ <string name="Gestures" value="å§¿å‹¢,"/>
+ <string name="Landmarks" value="地標,"/>
+ <string name="Notecards" value="記事å¡,"/>
+ <string name="Objects" value="物件,"/>
+ <string name="Scripts" value="腳本,"/>
+ <string name="Sounds" value="è²éŸ³,"/>
+ <string name="Textures" value="æè³ª,"/>
+ <string name="Snapshots" value="å¿«ç…§,"/>
+ <string name="No Filters" value="No"/>
+ <string name="Since Logoff" value="- 自上次登出"/>
+ <string name="InvFolder My Inventory">
+ 我的收ç´å€
+ </string>
+ <string name="InvFolder My Favorites">
+ 我的最愛
+ </string>
+ <string name="InvFolder Library">
+ 資æºåº«
+ </string>
+ <string name="InvFolder Textures">
+ æè³ª
+ </string>
+ <string name="InvFolder Sounds">
+ è²éŸ³
+ </string>
+ <string name="InvFolder Calling Cards">
+ å片
+ </string>
+ <string name="InvFolder Landmarks">
+ 地標
+ </string>
+ <string name="InvFolder Scripts">
+ 腳本
+ </string>
+ <string name="InvFolder Clothing">
+ æœè£
+ </string>
+ <string name="InvFolder Objects">
+ 物件
+ </string>
+ <string name="InvFolder Notecards">
+ 記事å¡
+ </string>
+ <string name="InvFolder New Folder">
+ 新資料夾
+ </string>
+ <string name="InvFolder Inventory">
+ æ”¶ç´å€
+ </string>
+ <string name="InvFolder Uncompressed Images">
+ 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">
+ 無壓縮è²éŸ³
+ </string>
+ <string name="InvFolder Animations">
+ 動作
+ </string>
+ <string name="InvFolder Gestures">
+ å§¿å‹¢
+ </string>
+ <string name="InvFolder Favorite">
+ 我的最愛
+ </string>
+ <string name="InvFolder favorite">
+ 我的最愛
+ </string>
+ <string name="InvFolder Current Outfit">
+ ç›®å‰è£æ‰®
+ </string>
+ <string name="InvFolder Initial Outfits">
+ åˆå§‹è£æ‰®
+ </string>
+ <string name="InvFolder My Outfits">
+ æˆ‘çš„è£æ‰®
+ </string>
+ <string name="InvFolder Accessories">
+ é…ä»¶
+ </string>
+ <string name="InvFolder Friends">
+ 朋å‹
+ </string>
+ <string name="InvFolder All">
+ 全部
+ </string>
+ <string name="Buy">
+ 購買
+ </string>
+ <string name="BuyforL$">
+ Buy for L$
+ </string>
+ <string name="Stone">
+ 石頭
+ </string>
+ <string name="Metal">
+ 金屬
+ </string>
+ <string name="Glass">
+ 玻璃
+ </string>
+ <string name="Wood">
+ 木頭
+ </string>
+ <string name="Flesh">
+ 肌肉
+ </string>
+ <string name="Plastic">
+ 塑膠
+ </string>
+ <string name="Rubber">
+ 橡膠
+ </string>
+ <string name="Light">
+ Light
+ </string>
+ <string name="KBShift">
+ Shift
+ </string>
+ <string name="KBCtrl">
+ Ctrl
+ </string>
+ <string name="Chest">
+ 胸部
+ </string>
+ <string name="Skull">
+ 頭顱
+ </string>
+ <string name="Left Shoulder">
+ 左肩
+ </string>
+ <string name="Right Shoulder">
+ å³è‚©
+ </string>
+ <string name="Left Hand">
+ 左手
+ </string>
+ <string name="Right Hand">
+ 峿‰‹
+ </string>
+ <string name="Left Foot">
+ 左腳
+ </string>
+ <string name="Right Foot">
+ å³è…³
+ </string>
+ <string name="Spine">
+ 脊椎
+ </string>
+ <string name="Pelvis">
+ 骨盆
+ </string>
+ <string name="Mouth">
+ 嘴
+ </string>
+ <string name="Chin">
+ 下巴
+ </string>
+ <string name="Left Ear">
+ 左耳
+ </string>
+ <string name="Right Ear">
+ å³è€³
+ </string>
+ <string name="Left Eyeball">
+ 左眼çƒ
+ </string>
+ <string name="Right Eyeball">
+ å³çœ¼çƒ
+ </string>
+ <string name="Nose">
+ é¼»å­
+ </string>
+ <string name="R Upper Arm">
+ å³ä¸Šè‡‚
+ </string>
+ <string name="R Forearm">
+ å³å‰è‡‚
+ </string>
+ <string name="L Upper Arm">
+ 左上臂
+ </string>
+ <string name="L Forearm">
+ å·¦å‰è‡‚
+ </string>
+ <string name="Right Hip">
+ å³è‡€
+ </string>
+ <string name="R Upper Leg">
+ å³å¤§è…¿
+ </string>
+ <string name="R Lower Leg">
+ å³å°è…¿
+ </string>
+ <string name="Left Hip">
+ 左臀
+ </string>
+ <string name="L Upper Leg">
+ 左大腿
+ </string>
+ <string name="L Lower Leg">
+ å·¦å°è…¿
+ </string>
+ <string name="Stomach">
+ 腹肌
+ </string>
+ <string name="Left Pec">
+ 左胸肌
+ </string>
+ <string name="Right Pec">
+ å³èƒ¸è‚Œ
+ </string>
+ <string name="Invalid Attachment">
+ ç„¡æ•ˆçš„é™„ä»¶è¯æŽ¥é»ž
+ </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">
+ 林登實驗室員工
+ </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">
+ 已年齡驗證
+ </string>
+ <string name="NotAgeVerified">
+ 未年齡驗證
+ </string>
+ <string name="Center 2">
+ 中央 2
+ </string>
+ <string name="Top Right">
+ å³ä¸Š
+ </string>
+ <string name="Top">
+ 上方
+ </string>
+ <string name="Top Left">
+ 左上
+ </string>
+ <string name="Center">
+ 中央
+ </string>
+ <string name="Bottom Left">
+ 左下
+ </string>
+ <string name="Bottom">
+ 下方
+ </string>
+ <string name="Bottom Right">
+ å³ä¸‹
+ </string>
+ <string name="CompileQueueDownloadedCompiling">
+ 已下載,ç¾åœ¨é€²è¡Œç·¨è­¯ä¸­
+ </string>
+ <string name="CompileQueueScriptNotFound">
+ 伺æœå™¨ä¸Šæœªç™¼ç¾è…³æœ¬ã€‚
+ </string>
+ <string name="CompileQueueProblemDownloading">
+ å•題下載中
+ </string>
+ <string name="CompileQueueInsufficientPermDownload">
+ 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">
+ 釿–°ç·¨è­¯é€²åº¦
+ </string>
+ <string name="CompileQueueStart">
+ 釿–°ç·¨è­¯
+ </string>
+ <string name="ResetQueueTitle">
+ é‡è¨­é€²åº¦
+ </string>
+ <string name="ResetQueueStart">
+ é‡è¨­
+ </string>
+ <string name="RunQueueTitle">
+ 設定執行中程åº
+ </string>
+ <string name="RunQueueStart">
+ 設為執行中
+ </string>
+ <string name="NotRunQueueTitle">
+ 設定éžåŸ·è¡Œä¸­ç¨‹åº
+ </string>
+ <string name="NotRunQueueStart">
+ 設為éžåŸ·è¡Œä¸­
+ </string>
+ <string name="CompileSuccessful">
+ 編譯æˆåŠŸ!!
+ </string>
+ <string name="CompileSuccessfulSaving">
+ 編譯æˆåŠŸï¼Œå„²å­˜ä¸­...
+ </string>
+ <string name="SaveComplete">
+ 儲存完畢。
+ </string>
+ <string name="ObjectOutOfRange">
+ 腳本(物件超出範åœï¼‰
+ </string>
+ <string name="GodToolsObjectOwnedBy">
+ 物件 [OBJECT] 為 [OWNER] æ‰€æ“æœ‰
+ </string>
+ <string name="GroupsNone">
+ ç„¡
+ </string>
+ <string name="Group" value="(群組)"/>
+ <string name="Unknown">
+ (未知)
+ </string>
+ <string name="SummaryForTheWeek" value="Summary for this week, beginning on"/>
+ <string name="NextStipendDay" value="下一個發薪日為"/>
+ <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">
+ 無群組資料發ç¾
+ </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">
+ å…許的群群組:([ALLOWEDGROUPS],最大 [MAXACCESS])
+ </string>
+ <string name="ScriptLimitsParcelScriptMemory">
+ 地段腳本記憶體
+ </string>
+ <string name="ScriptLimitsParcelsOwned">
+ 地段清單:[PARCELS]
+ </string>
+ <string name="ScriptLimitsMemoryUsed">
+ 計憶體用é‡ï¼šä½¿ç”¨ [MAX] kb 中的 [COUNT] kb ;剩餘 [AVAILABLE] kb å¯ç”¨
+ </string>
+ <string name="ScriptLimitsMemoryUsedSimple">
+ 記憶體用é‡ï¼š[COUNT] kb
+ </string>
+ <string name="ScriptLimitsParcelScriptURLs">
+ 地段腳本 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">
+ ç„¡åœ°æ®µè¢«é¸æ“‡
+ </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">
+ å在
+ </string>
+ <string name="ATTACH_CHEST">
+ 胸部
+ </string>
+ <string name="ATTACH_HEAD">
+ 頭部
+ </string>
+ <string name="ATTACH_LSHOULDER">
+ 左肩
+ </string>
+ <string name="ATTACH_RSHOULDER">
+ å³è‚©
+ </string>
+ <string name="ATTACH_LHAND">
+ 左手
+ </string>
+ <string name="ATTACH_RHAND">
+ 峿‰‹
+ </string>
+ <string name="ATTACH_LFOOT">
+ 左腳
+ </string>
+ <string name="ATTACH_RFOOT">
+ å³è…³
+ </string>
+ <string name="ATTACH_BACK">
+ 背部
+ </string>
+ <string name="ATTACH_PELVIS">
+ 骨盆
+ </string>
+ <string name="ATTACH_MOUTH">
+ 嘴巴
+ </string>
+ <string name="ATTACH_CHIN">
+ 下巴
+ </string>
+ <string name="ATTACH_LEAR">
+ 左耳
+ </string>
+ <string name="ATTACH_REAR">
+ å³è€³
+ </string>
+ <string name="ATTACH_LEYE">
+ 左眼
+ </string>
+ <string name="ATTACH_REYE">
+ å³çœ¼
+ </string>
+ <string name="ATTACH_NOSE">
+ é¼»å­
+ </string>
+ <string name="ATTACH_RUARM">
+ å³ä¸Šè‡‚
+ </string>
+ <string name="ATTACH_RLARM">
+ å³å‰è‡‚
+ </string>
+ <string name="ATTACH_LUARM">
+ 左上臂
+ </string>
+ <string name="ATTACH_LLARM">
+ å·¦å‰è‡‚
+ </string>
+ <string name="ATTACH_RHIP">
+ å³è‡€
+ </string>
+ <string name="ATTACH_RULEG">
+ å³å¤§è…¿
+ </string>
+ <string name="ATTACH_RLLEG">
+ å³å°è…¿
+ </string>
+ <string name="ATTACH_LHIP">
+ 左臀
+ </string>
+ <string name="ATTACH_LULEG">
+ 左大腿
+ </string>
+ <string name="ATTACH_LLLEG">
+ å·¦å°è…¿
+ </string>
+ <string name="ATTACH_BELLY">
+ 腹部
+ </string>
+ <string name="ATTACH_RPEC">
+ å³èƒ¸è‚Œ
+ </string>
+ <string name="ATTACH_LPEC">
+ 左胸肌
+ </string>
+ <string name="ATTACH_HUD_CENTER_2">
+ 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">
+ 物件的內容
+ </string>
+ <string name="PanelContentsNewScript">
+ 新腳本
+ </string>
+ <string name="BusyModeResponseDefault">
+ 你傳é€è¨Šæ¯çš„å±…æ°‘ç›®å‰è™•於忙碌模å¼ä¸­ï¼Œé€™æ„å‘³è‘—ä»–è¦æ±‚ä¸è¢«æ‰“擾。你所傳的訊æ¯ä»å°‡æœƒç•™å­˜ä¸¦é¡¯ç¤ºæ–¼ IM 颿¿ä¸Šä¾›ä»–ç¨å¾Œæ™‚查閱。
+ </string>
+ <string name="MuteByName">
+ (由å稱)
+ </string>
+ <string name="MuteAgent">
+ (居民)
+ </string>
+ <string name="MuteObject">
+ (物件)
+ </string>
+ <string name="MuteGroup">
+ (群組)
+ </string>
+ <string name="MuteExternal">
+ (外部)
+ </string>
+ <string name="RegionNoCovenant">
+ 此領地未æä¾›ä»»ä½•å¥‘ç´„è¦æ±‚。
+ </string>
+ <string name="RegionNoCovenantOtherOwner">
+ 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="最後修改於:"/>
+ <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">
+ (將於發布後自動更新)
+ </string>
+ <string name="NoPicksClassifiedsText">
+ You haven&apos;t created any Picks or Classifieds. Click the Plus button below to create a Pick or Classified.
+ </string>
+ <string name="NoAvatarPicksClassifiedsText">
+ 使用者無精é¸åœ°é»žæˆ–個人廣告
+ </string>
+ <string name="PicksClassifiedsLoadingText">
+ 載入中...
+ </string>
+ <string name="MultiPreviewTitle">
+ é è¦½
+ </string>
+ <string name="MultiPropertiesTitle">
+ 屬性
+ </string>
+ <string name="InvOfferAnObjectNamed">
+ An object named
+ </string>
+ <string name="InvOfferOwnedByGroup">
+ ç¾¤çµ„æ‰€æ“æœ‰
+ </string>
+ <string name="InvOfferOwnedByUnknownGroup">
+ ç”±ä¸€å€‹æœªçŸ¥çš„ç¾¤çµ„æ‰€æ“æœ‰
+ </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">
+ å‘å‰
+ </string>
+ <string name="Direction_Left">
+ å‘å·¦
+ </string>
+ <string name="Direction_Right">
+ å‘å³
+ </string>
+ <string name="Direction_Back">
+ å‘後
+ </string>
+ <string name="Direction_North">
+ 北
+ </string>
+ <string name="Direction_South">
+ å—
+ </string>
+ <string name="Direction_West">
+ 西
+ </string>
+ <string name="Direction_East">
+ æ±
+ </string>
+ <string name="Direction_Up">
+ å‘上
+ </string>
+ <string name="Direction_Down">
+ å‘下
+ </string>
+ <string name="Any Category">
+ 任何類別
+ </string>
+ <string name="Shopping">
+ 採購
+ </string>
+ <string name="Land Rental">
+ Land Rental
+ </string>
+ <string name="Property Rental">
+ Property Rental
+ </string>
+ <string name="Special Attraction">
+ Special Attraction
+ </string>
+ <string name="New Products">
+ New Products
+ </string>
+ <string name="Employment">
+ Employment
+ </string>
+ <string name="Wanted">
+ Wanted
+ </string>
+ <string name="Service">
+ Service
+ </string>
+ <string name="Personal">
+ Personal
+ </string>
+ <string name="None">
+ ç„¡
+ </string>
+ <string name="Linden Location">
+ Linden Location
+ </string>
+ <string name="Adult">
+ 完全æˆäºº
+ </string>
+ <string name="Arts&amp;Culture">
+ è—術與文化
+ </string>
+ <string name="Business">
+ 商業
+ </string>
+ <string name="Educational">
+ 教育
+ </string>
+ <string name="Gaming">
+ éŠæˆ²
+ </string>
+ <string name="Hangout">
+ èšæœƒæ‰€
+ </string>
+ <string name="Newcomer Friendly">
+ 新手å‹å–„
+ </string>
+ <string name="Parks&amp;Nature">
+ 公園與自然
+ </string>
+ <string name="Residential">
+ ä½å®…
+ </string>
+ <string name="Stage">
+ 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">
+ 多媒體
+ </string>
+ <string name="Play Media">
+ æ’­æ”¾ï¼æš«åœ 媒體
+ </string>
+ <string name="MBCmdLineError">
+ è§£æžå‘½ä»¤åˆ—時發ç¾éŒ¯èª¤ã€‚
+è«‹åƒé–±ï¼š http://wiki.secondlife.com/wiki/Client_parameters
+錯誤:
+ </string>
+ <string name="MBCmdLineUsg">
+ [APP_NAME] 命令列用法:
+ </string>
+ <string name="MBUnableToAccessFile">
+ [APP_NAME] 無法存å–它所需è¦çš„æª”案。
+
+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">
+ 致命錯誤
+ </string>
+ <string name="MBRequiresAltiVec">
+ [APP_NAME] requires a processor with AltiVec (G4 or later).
+ </string>
+ <string name="MBAlreadyRunning">
+ [APP_NAME] 已經在執行中。
+è«‹æª¢æŸ¥ä½ çš„å·¥ä½œåˆ—è£¡æ˜¯å¦æœ‰å…¶ä»–最å°åŒ–的相åŒç¨‹å¼ã€‚
+å¦‚æžœé€™å€‹è¨Šæ¯æŒçºŒå‡ºç¾ï¼Œè«‹é‡æ–°å•Ÿå‹•你的電腦。
+ </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">
+ 通知
+ </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">
+ 警告
+ </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">
+ 錯誤
+ </string>
+ <string name="MBFullScreenErr">
+ 無法執行全螢幕於 [WIDTH] x [HEIGHT].
+執行於視窗中。
+ </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">
+ 無法設定åƒç´ æ ¼å¼
+ </string>
+ <string name="MBGLContextErr">
+ Can&apos;t create GL rendering context
+ </string>
+ <string name="MBGLContextActErr">
+ Can&apos;t activate GL rendering context
+ </string>
+ <string name="MBVideoDrvErr">
+ [APP_NAME] is unable to run because your video card drivers did not install properly, are out of date, or are for unsupported hardware. Please make sure you have the latest video card drivers and even if you do have the latest, try reinstalling them.
+
+If you continue to receive this message, contact the [SUPPORT_SITE].
+ </string>
+ <string name="5 O&apos;Clock Shadow">
+ 5 O&apos;Clock Shadow
+ </string>
+ <string name="All White">
+ 全白
+ </string>
+ <string name="Anime Eyes">
+ Anime Eyes
+ </string>
+ <string name="Arced">
+ Arced
+ </string>
+ <string name="Arm Length">
+ Arm Length
+ </string>
+ <string name="Attached">
+ Attached
+ </string>
+ <string name="Attached Earlobes">
+ Attached Earlobes
+ </string>
+ <string name="Back Fringe">
+ Back Fringe
+ </string>
+ <string name="Baggy">
+ Baggy
+ </string>
+ <string name="Bangs">
+ Bangs
+ </string>
+ <string name="Beady Eyes">
+ Beady Eyes
+ </string>
+ <string name="Belly Size">
+ Belly Size
+ </string>
+ <string name="Big">
+ Big
+ </string>
+ <string name="Big Butt">
+ Big Butt
+ </string>
+ <string name="Big Hair Back">
+ Big Hair: Back
+ </string>
+ <string name="Big Hair Front">
+ Big Hair: Front
+ </string>
+ <string name="Big Hair Top">
+ Big Hair: Top
+ </string>
+ <string name="Big Head">
+ Big Head
+ </string>
+ <string name="Big Pectorals">
+ Big Pectorals
+ </string>
+ <string name="Big Spikes">
+ Big Spikes
+ </string>
+ <string name="Black">
+ Black
+ </string>
+ <string name="Blonde">
+ Blonde
+ </string>
+ <string name="Blonde Hair">
+ Blonde Hair
+ </string>
+ <string name="Blush">
+ Blush
+ </string>
+ <string name="Blush Color">
+ Blush Color
+ </string>
+ <string name="Blush Opacity">
+ Blush Opacity
+ </string>
+ <string name="Body Definition">
+ Body Definition
+ </string>
+ <string name="Body Fat">
+ Body Fat
+ </string>
+ <string name="Body Freckles">
+ Body Freckles
+ </string>
+ <string name="Body Thick">
+ Body Thick
+ </string>
+ <string name="Body Thickness">
+ Body Thickness
+ </string>
+ <string name="Body Thin">
+ Body Thin
+ </string>
+ <string name="Bow Legged">
+ Bow Legged
+ </string>
+ <string name="Breast Buoyancy">
+ Breast Buoyancy
+ </string>
+ <string name="Breast Cleavage">
+ Breast Cleavage
+ </string>
+ <string name="Breast Size">
+ Breast Size
+ </string>
+ <string name="Bridge Width">
+ Bridge Width
+ </string>
+ <string name="Broad">
+ Broad
+ </string>
+ <string name="Brow Size">
+ Brow Size
+ </string>
+ <string name="Bug Eyes">
+ Bug Eyes
+ </string>
+ <string name="Bugged Eyes">
+ Bugged Eyes
+ </string>
+ <string name="Bulbous">
+ Bulbous
+ </string>
+ <string name="Bulbous Nose">
+ Bulbous Nose
+ </string>
+ <string name="Breast Physics Mass">
+ Breast Mass
+ </string>
+ <string name="Breast Physics Smoothing">
+ Breast Smoothing
+ </string>
+ <string name="Breast Physics Gravity">
+ Breast Gravity
+ </string>
+ <string name="Breast Physics Drag">
+ Breast Drag
+ </string>
+ <string name="Breast Physics InOut Max Effect">
+ Max Effect
+ </string>
+ <string name="Breast Physics InOut Spring">
+ Spring
+ </string>
+ <string name="Breast Physics InOut Gain">
+ Gain
+ </string>
+ <string name="Breast Physics InOut Damping">
+ Damping
+ </string>
+ <string name="Breast Physics UpDown Max Effect">
+ Max Effect
+ </string>
+ <string name="Breast Physics UpDown Spring">
+ Spring
+ </string>
+ <string name="Breast Physics UpDown Gain">
+ Gain
+ </string>
+ <string name="Breast Physics UpDown Damping">
+ Damping
+ </string>
+ <string name="Breast Physics LeftRight Max Effect">
+ Max Effect
+ </string>
+ <string name="Breast Physics LeftRight Spring">
+ Spring
+ </string>
+ <string name="Breast Physics LeftRight Gain">
+ Gain
+ </string>
+ <string name="Breast Physics LeftRight Damping">
+ Damping
+ </string>
+ <string name="Belly Physics Mass">
+ Belly Mass
+ </string>
+ <string name="Belly Physics Smoothing">
+ Belly Smoothing
+ </string>
+ <string name="Belly Physics Gravity">
+ Belly Gravity
+ </string>
+ <string name="Belly Physics Drag">
+ Belly Drag
+ </string>
+ <string name="Belly Physics UpDown Max Effect">
+ Max Effect
+ </string>
+ <string name="Belly Physics UpDown Spring">
+ Spring
+ </string>
+ <string name="Belly Physics UpDown Gain">
+ Gain
+ </string>
+ <string name="Belly Physics UpDown Damping">
+ Damping
+ </string>
+ <string name="Butt Physics Mass">
+ Butt Mass
+ </string>
+ <string name="Butt Physics Smoothing">
+ Butt Smoothing
+ </string>
+ <string name="Butt Physics Gravity">
+ Butt Gravity
+ </string>
+ <string name="Butt Physics Drag">
+ Butt Drag
+ </string>
+ <string name="Butt Physics UpDown Max Effect">
+ Max Effect
+ </string>
+ <string name="Butt Physics UpDown Spring">
+ Spring
+ </string>
+ <string name="Butt Physics UpDown Gain">
+ Gain
+ </string>
+ <string name="Butt Physics UpDown Damping">
+ Damping
+ </string>
+ <string name="Butt Physics LeftRight Max Effect">
+ Max Effect
+ </string>
+ <string name="Butt Physics LeftRight Spring">
+ Spring
+ </string>
+ <string name="Butt Physics LeftRight Gain">
+ Gain
+ </string>
+ <string name="Butt Physics LeftRight Damping">
+ Damping
+ </string>
+ <string name="Bushy Eyebrows">
+ Bushy Eyebrows
+ </string>
+ <string name="Bushy Hair">
+ Bushy Hair
+ </string>
+ <string name="Butt Size">
+ Butt Size
+ </string>
+ <string name="Butt Gravity">
+ Butt Gravity
+ </string>
+ <string name="bustle skirt">
+ Bustle Skirt
+ </string>
+ <string name="no bustle">
+ No Bustle
+ </string>
+ <string name="more bustle">
+ More Bustle
+ </string>
+ <string name="Chaplin">
+ Chaplin
+ </string>
+ <string name="Cheek Bones">
+ Cheek Bones
+ </string>
+ <string name="Chest Size">
+ Chest Size
+ </string>
+ <string name="Chin Angle">
+ 下巴角度
+ </string>
+ <string name="Chin Cleft">
+ Chin Cleft
+ </string>
+ <string name="Chin Curtains">
+ Chin Curtains
+ </string>
+ <string name="Chin Depth">
+ Chin Depth
+ </string>
+ <string name="Chin Heavy">
+ Chin Heavy
+ </string>
+ <string name="Chin In">
+ Chin In
+ </string>
+ <string name="Chin Out">
+ Chin Out
+ </string>
+ <string name="Chin-Neck">
+ Chin-Neck
+ </string>
+ <string name="Clear">
+ 清除
+ </string>
+ <string name="Cleft">
+ Cleft
+ </string>
+ <string name="Close Set Eyes">
+ Close Set Eyes
+ </string>
+ <string name="Closed">
+ Closed
+ </string>
+ <string name="Closed Back">
+ Closed Back
+ </string>
+ <string name="Closed Front">
+ Closed Front
+ </string>
+ <string name="Closed Left">
+ Closed Left
+ </string>
+ <string name="Closed Right">
+ Closed Right
+ </string>
+ <string name="Coin Purse">
+ Coin Purse
+ </string>
+ <string name="Collar Back">
+ Collar Back
+ </string>
+ <string name="Collar Front">
+ Collar Front
+ </string>
+ <string name="Corner Down">
+ Corner Down
+ </string>
+ <string name="Corner Up">
+ Corner Up
+ </string>
+ <string name="Creased">
+ Creased
+ </string>
+ <string name="Crooked Nose">
+ Crooked Nose
+ </string>
+ <string name="Cuff Flare">
+ Cuff Flare
+ </string>
+ <string name="Dark">
+ Dark
+ </string>
+ <string name="Dark Green">
+ Dark Green
+ </string>
+ <string name="Darker">
+ Darker
+ </string>
+ <string name="Deep">
+ Deep
+ </string>
+ <string name="Default Heels">
+ Default Heels
+ </string>
+ <string name="Dense">
+ Dense
+ </string>
+ <string name="Double Chin">
+ Double Chin
+ </string>
+ <string name="Downturned">
+ Downturned
+ </string>
+ <string name="Duffle Bag">
+ Duffle Bag
+ </string>
+ <string name="Ear Angle">
+ Ear Angle
+ </string>
+ <string name="Ear Size">
+ Ear Size
+ </string>
+ <string name="Ear Tips">
+ Ear Tips
+ </string>
+ <string name="Egg Head">
+ Egg Head
+ </string>
+ <string name="Eye Bags">
+ Eye Bags
+ </string>
+ <string name="Eye Color">
+ Eye Color
+ </string>
+ <string name="Eye Depth">
+ Eye Depth
+ </string>
+ <string name="Eye Lightness">
+ Eye Lightness
+ </string>
+ <string name="Eye Opening">
+ Eye Opening
+ </string>
+ <string name="Eye Pop">
+ Eye Pop
+ </string>
+ <string name="Eye Size">
+ Eye Size
+ </string>
+ <string name="Eye Spacing">
+ Eye Spacing
+ </string>
+ <string name="Eyebrow Arc">
+ Eyebrow Arc
+ </string>
+ <string name="Eyebrow Density">
+ Eyebrow Density
+ </string>
+ <string name="Eyebrow Height">
+ Eyebrow Height
+ </string>
+ <string name="Eyebrow Points">
+ Eyebrow Points
+ </string>
+ <string name="Eyebrow Size">
+ Eyebrow Size
+ </string>
+ <string name="Eyelash Length">
+ Eyelash Length
+ </string>
+ <string name="Eyeliner">
+ Eyeliner
+ </string>
+ <string name="Eyeliner Color">
+ Eyeliner Color
+ </string>
+ <string name="Eyes Bugged">
+ Eyes Bugged
+ </string>
+ <string name="Face Shear">
+ Face Shear
+ </string>
+ <string name="Facial Definition">
+ Facial Definition
+ </string>
+ <string name="Far Set Eyes">
+ Far Set Eyes
+ </string>
+ <string name="Fat Lips">
+ Fat Lips
+ </string>
+ <string name="Female">
+ Female
+ </string>
+ <string name="Fingerless">
+ Fingerless
+ </string>
+ <string name="Fingers">
+ Fingers
+ </string>
+ <string name="Flared Cuffs">
+ Flared Cuffs
+ </string>
+ <string name="Flat">
+ Flat
+ </string>
+ <string name="Flat Butt">
+ Flat Butt
+ </string>
+ <string name="Flat Head">
+ Flat Head
+ </string>
+ <string name="Flat Toe">
+ Flat Toe
+ </string>
+ <string name="Foot Size">
+ Foot Size
+ </string>
+ <string name="Forehead Angle">
+ Forehead Angle
+ </string>
+ <string name="Forehead Heavy">
+ Forehead Heavy
+ </string>
+ <string name="Freckles">
+ Freckles
+ </string>
+ <string name="Front Fringe">
+ Front Fringe
+ </string>
+ <string name="Full Back">
+ Full Back
+ </string>
+ <string name="Full Eyeliner">
+ Full Eyeliner
+ </string>
+ <string name="Full Front">
+ Full Front
+ </string>
+ <string name="Full Hair Sides">
+ Full Hair Sides
+ </string>
+ <string name="Full Sides">
+ Full Sides
+ </string>
+ <string name="Glossy">
+ Glossy
+ </string>
+ <string name="Glove Fingers">
+ Glove Fingers
+ </string>
+ <string name="Glove Length">
+ Glove Length
+ </string>
+ <string name="Hair">
+ é ­é«®
+ </string>
+ <string name="Hair Back">
+ Hair: Back
+ </string>
+ <string name="Hair Front">
+ Hair: Front
+ </string>
+ <string name="Hair Sides">
+ Hair: Sides
+ </string>
+ <string name="Hair Sweep">
+ Hair Sweep
+ </string>
+ <string name="Hair Thickess">
+ Hair Thickness
+ </string>
+ <string name="Hair Thickness">
+ Hair Thickness
+ </string>
+ <string name="Hair Tilt">
+ Hair Tilt
+ </string>
+ <string name="Hair Tilted Left">
+ Hair Tilted Left
+ </string>
+ <string name="Hair Tilted Right">
+ Hair Tilted Right
+ </string>
+ <string name="Hair Volume">
+ Hair: Volume
+ </string>
+ <string name="Hand Size">
+ Hand Size
+ </string>
+ <string name="Handlebars">
+ Handlebars
+ </string>
+ <string name="Head Length">
+ Head Length
+ </string>
+ <string name="Head Shape">
+ Head Shape
+ </string>
+ <string name="Head Size">
+ Head Size
+ </string>
+ <string name="Head Stretch">
+ Head Stretch
+ </string>
+ <string name="Heel Height">
+ Heel Height
+ </string>
+ <string name="Heel Shape">
+ Heel Shape
+ </string>
+ <string name="Height">
+ Height
+ </string>
+ <string name="High">
+ High
+ </string>
+ <string name="High Heels">
+ High Heels
+ </string>
+ <string name="High Jaw">
+ High Jaw
+ </string>
+ <string name="High Platforms">
+ High Platforms
+ </string>
+ <string name="High and Tight">
+ High and Tight
+ </string>
+ <string name="Higher">
+ Higher
+ </string>
+ <string name="Hip Length">
+ Hip Length
+ </string>
+ <string name="Hip Width">
+ Hip Width
+ </string>
+ <string name="In">
+ In
+ </string>
+ <string name="In Shdw Color">
+ Inner Shadow Color
+ </string>
+ <string name="In Shdw Opacity">
+ Inner Shadow Opacity
+ </string>
+ <string name="Inner Eye Corner">
+ Inner Eye Corner
+ </string>
+ <string name="Inner Eye Shadow">
+ Inner Eye Shadow
+ </string>
+ <string name="Inner Shadow">
+ Inner Shadow
+ </string>
+ <string name="Jacket Length">
+ Jacket Length
+ </string>
+ <string name="Jacket Wrinkles">
+ Jacket Wrinkles
+ </string>
+ <string name="Jaw Angle">
+ Jaw Angle
+ </string>
+ <string name="Jaw Jut">
+ Jaw Jut
+ </string>
+ <string name="Jaw Shape">
+ Jaw Shape
+ </string>
+ <string name="Join">
+ Join
+ </string>
+ <string name="Jowls">
+ Jowls
+ </string>
+ <string name="Knee Angle">
+ Knee Angle
+ </string>
+ <string name="Knock Kneed">
+ Knock Kneed
+ </string>
+ <string name="Large">
+ Large
+ </string>
+ <string name="Large Hands">
+ Large Hands
+ </string>
+ <string name="Left Part">
+ Left Part
+ </string>
+ <string name="Leg Length">
+ Leg Length
+ </string>
+ <string name="Leg Muscles">
+ Leg Muscles
+ </string>
+ <string name="Less">
+ Less
+ </string>
+ <string name="Less Body Fat">
+ Less Body Fat
+ </string>
+ <string name="Less Curtains">
+ Less Curtains
+ </string>
+ <string name="Less Freckles">
+ Less Freckles
+ </string>
+ <string name="Less Full">
+ Less Full
+ </string>
+ <string name="Less Gravity">
+ Less Gravity
+ </string>
+ <string name="Less Love">
+ Less Love
+ </string>
+ <string name="Less Muscles">
+ Less Muscles
+ </string>
+ <string name="Less Muscular">
+ Less Muscular
+ </string>
+ <string name="Less Rosy">
+ Less Rosy
+ </string>
+ <string name="Less Round">
+ Less Round
+ </string>
+ <string name="Less Saddle">
+ Less Saddle
+ </string>
+ <string name="Less Square">
+ Less Square
+ </string>
+ <string name="Less Volume">
+ Less Volume
+ </string>
+ <string name="Less soul">
+ Less soul
+ </string>
+ <string name="Lighter">
+ Lighter
+ </string>
+ <string name="Lip Cleft">
+ Lip Cleft
+ </string>
+ <string name="Lip Cleft Depth">
+ Lip Cleft Depth
+ </string>
+ <string name="Lip Fullness">
+ Lip Fullness
+ </string>
+ <string name="Lip Pinkness">
+ Lip Pinkness
+ </string>
+ <string name="Lip Ratio">
+ Lip Ratio
+ </string>
+ <string name="Lip Thickness">
+ Lip Thickness
+ </string>
+ <string name="Lip Width">
+ Lip Width
+ </string>
+ <string name="Lipgloss">
+ Lipgloss
+ </string>
+ <string name="Lipstick">
+ Lipstick
+ </string>
+ <string name="Lipstick Color">
+ Lipstick Color
+ </string>
+ <string name="Long">
+ Long
+ </string>
+ <string name="Long Head">
+ Long Head
+ </string>
+ <string name="Long Hips">
+ Long Hips
+ </string>
+ <string name="Long Legs">
+ Long Legs
+ </string>
+ <string name="Long Neck">
+ Long Neck
+ </string>
+ <string name="Long Pigtails">
+ Long Pigtails
+ </string>
+ <string name="Long Ponytail">
+ Long Ponytail
+ </string>
+ <string name="Long Torso">
+ Long Torso
+ </string>
+ <string name="Long arms">
+ Long arms
+ </string>
+ <string name="Loose Pants">
+ Loose Pants
+ </string>
+ <string name="Loose Shirt">
+ Loose Shirt
+ </string>
+ <string name="Loose Sleeves">
+ Loose Sleeves
+ </string>
+ <string name="Love Handles">
+ Love Handles
+ </string>
+ <string name="Low">
+ Low
+ </string>
+ <string name="Low Heels">
+ Low Heels
+ </string>
+ <string name="Low Jaw">
+ Low Jaw
+ </string>
+ <string name="Low Platforms">
+ Low Platforms
+ </string>
+ <string name="Low and Loose">
+ Low and Loose
+ </string>
+ <string name="Lower">
+ Lower
+ </string>
+ <string name="Lower Bridge">
+ Lower Bridge
+ </string>
+ <string name="Lower Cheeks">
+ Lower Cheeks
+ </string>
+ <string name="Male">
+ 男性
+ </string>
+ <string name="Middle Part">
+ Middle Part
+ </string>
+ <string name="More">
+ 更多
+ </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">
+ 此地並ä¸å…許語音
+ </string>
+ <string name="LocationCtrlFlyTooltip">
+ ä¸å…許飛行
+ </string>
+ <string name="LocationCtrlPushTooltip">
+ ç¦æ­¢æŽ¨æ’ž
+ </string>
+ <string name="LocationCtrlBuildTooltip">
+ 建造ï¼ä¸Ÿæ£„ 物件ä¸è¢«å…許
+ </string>
+ <string name="LocationCtrlScriptsTooltip">
+ 腳本ä¸è¢«å…許
+ </string>
+ <string name="LocationCtrlDamageTooltip">
+ å¥åº·
+ </string>
+ <string name="LocationCtrlAdultIconTooltip">
+ 完全æˆäººåœ°å€
+ </string>
+ <string name="LocationCtrlModerateIconTooltip">
+ é©åº¦æˆäººåœ°å€
+ </string>
+ <string name="LocationCtrlGeneralIconTooltip">
+ 一般普級地å€
+ </string>
+ <string name="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">
+ (未命å)
+ </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">
+ 點擊此處以傳é€å³æ™‚訊æ¯ã€‚
+ </string>
+ <string name="IM_to_label">
+ 至
+ </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">
+ 離開語音通話
+ </string>
+ <string name="answering-im">
+ è¯æŽ¥ä¸­...
+ </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">
+ 你並ä¸å…·æœ‰é€™å€‹èƒ½åŠ›ã€‚
+ </string>
+ <string name="no_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">
+ 你已經由群組中被移除。
+ </string>
+ <string name="removed_from_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">
+ æ“æœ‰è€…
+ </string>
+ <string name="group_member_status_online">
+ 上線
+ </string>
+ <string name="uploading_abuse_report">
+ 上傳中...
+
+舉報濫用
+ </string>
+ <string name="New Shape">
+ 新體形
+ </string>
+ <string name="New Skin">
+ 新皮膚
+ </string>
+ <string name="New Hair">
+ æ–°é ­é«®
+ </string>
+ <string name="New Eyes">
+ 新眼ç›
+ </string>
+ <string name="New Shirt">
+ 新襯衫
+ </string>
+ <string name="New Pants">
+ 新褲å­
+ </string>
+ <string name="New Shoes">
+ æ–°éž‹å­
+ </string>
+ <string name="New Socks">
+ 新襪å­
+ </string>
+ <string name="New Jacket">
+ 新夾克
+ </string>
+ <string name="New Gloves">
+ 新手套
+ </string>
+ <string name="New Undershirt">
+ æ–°å…§è¡£
+ </string>
+ <string name="New Underpants">
+ 新內褲
+ </string>
+ <string name="New Skirt">
+ 新裙å­
+ </string>
+ <string name="New Alpha">
+ æ–°åŠé€æ˜Ž
+ </string>
+ <string name="New Tattoo">
+ 新刺é’
+ </string>
+ <string name="New Physics">
+ 新身體物ç†
+ </string>
+ <string name="Invalid Wearable">
+ 無效的å¯ç©¿è£æ‰®
+ </string>
+ <string name="New Gesture">
+ æ–°å§¿å‹¢
+ </string>
+ <string name="New Script">
+ 新腳本
+ </string>
+ <string name="New Note">
+ 新記事å¡
+ </string>
+ <string name="New Folder">
+ 新資料夾
+ </string>
+ <string name="Contents">
+ 內容
+ </string>
+ <string name="Gesture">
+ å§¿å‹¢
+ </string>
+ <string name="Male Gestures">
+ 男性姿勢
+ </string>
+ <string name="Female Gestures">
+ 女性姿勢
+ </string>
+ <string name="Other Gestures">
+ å…¶ä»–å§¿å‹¢
+ </string>
+ <string name="Speech Gestures">
+ 演說姿勢
+ </string>
+ <string name="Common Gestures">
+ 一般姿勢
+ </string>
+ <string name="Male - Excuse me">
+ 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">
+ æˆå“¡è³‡æ ¼
+ </string>
+ <string name="Roles">
+ 角色
+ </string>
+ <string name="Group Identity">
+ Group Identity
+ </string>
+ <string name="Parcel Management">
+ 地段管ç†
+ </string>
+ <string name="Parcel Identity">
+ Parcel Identity
+ </string>
+ <string name="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">
+ 物件管ç†
+ </string>
+ <string name="Accounting">
+ 會計
+ </string>
+ <string name="Notices">
+ 通知
+ </string>
+ <string name="Chat">
+ èŠå¤©
+ </string>
+ <string name="DeleteItems">
+ 刪除所é¸å–的物å“?
+ </string>
+ <string name="DeleteItem">
+ 刪除所é¸å–的物å“?
+ </string>
+ <string name="EmptyOutfitText">
+ 沒有任何物å“åœ¨é€™å€‹è£æ‰®å…§
+ </string>
+ <string name="ExternalEditorNotSet">
+ 鏿“‡ä¸€å€‹ç·¨è¼¯å™¨ä½¿ç”¨ ExternalEditor 設定。
+ </string>
+ <string name="ExternalEditorNotFound">
+ 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">
+ 執行外部編輯器失敗。
+ </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/tests/llagentaccess_test.cpp b/indra/newview/tests/llagentaccess_test.cpp
index c970d79975..3ba25f3c10 100644
--- a/indra/newview/tests/llagentaccess_test.cpp
+++ b/indra/newview/tests/llagentaccess_test.cpp
@@ -84,19 +84,25 @@ namespace tut
LLAgentAccess aa(cgr);
cgr.setU32("PreferredMaturity", SIM_ACCESS_PG);
+#ifndef HACKED_GODLIKE_VIEWER
ensure("1 prefersPG", aa.prefersPG());
ensure("1 prefersMature", !aa.prefersMature());
ensure("1 prefersAdult", !aa.prefersAdult());
+#endif // HACKED_GODLIKE_VIEWER
cgr.setU32("PreferredMaturity", SIM_ACCESS_MATURE);
+#ifndef HACKED_GODLIKE_VIEWER
ensure("2 prefersPG", !aa.prefersPG());
ensure("2 prefersMature", aa.prefersMature());
ensure("2 prefersAdult", !aa.prefersAdult());
+#endif // HACKED_GODLIKE_VIEWER
cgr.setU32("PreferredMaturity", SIM_ACCESS_ADULT);
+#ifndef HACKED_GODLIKE_VIEWER
ensure("3 prefersPG", !aa.prefersPG());
ensure("3 prefersMature", aa.prefersMature());
ensure("3 prefersAdult", aa.prefersAdult());
+#endif // HACKED_GODLIKE_VIEWER
}
template<> template<>
@@ -107,45 +113,43 @@ namespace tut
LLAgentAccess aa(cgr);
// make sure default is PG
+#ifndef HACKED_GODLIKE_VIEWER
ensure("1 isTeen", aa.isTeen());
ensure("1 isMature", !aa.isMature());
ensure("1 isAdult", !aa.isAdult());
+#endif // HACKED_GODLIKE_VIEWER
- // this is kinda bad -- setting this forces maturity to MATURE but !teen != Mature anymore
- aa.setTeen(false);
- ensure("2 isTeen", !aa.isTeen());
- ensure("2 isMature", aa.isMature());
- ensure("2 isAdult", !aa.isAdult());
-
- // have to flip it back and make sure it still works
- aa.setTeen(true);
- ensure("3 isTeen", aa.isTeen());
- ensure("3 isMature", !aa.isMature());
- ensure("3 isAdult", !aa.isAdult());
-
// check the conversion routine
+#ifndef HACKED_GODLIKE_VIEWER
ensure_equals("1 conversion", SIM_ACCESS_PG, aa.convertTextToMaturity('P'));
ensure_equals("2 conversion", SIM_ACCESS_MATURE, aa.convertTextToMaturity('M'));
ensure_equals("3 conversion", SIM_ACCESS_ADULT, aa.convertTextToMaturity('A'));
ensure_equals("4 conversion", SIM_ACCESS_MIN, aa.convertTextToMaturity('Q'));
+#endif // HACKED_GODLIKE_VIEWER
// now try the other method of setting it - PG
aa.setMaturity('P');
- ensure("4 isTeen", aa.isTeen());
- ensure("4 isMature", !aa.isMature());
- ensure("4 isAdult", !aa.isAdult());
+ ensure("2 isTeen", aa.isTeen());
+#ifndef HACKED_GODLIKE_VIEWER
+ ensure("2 isMature", !aa.isMature());
+ ensure("2 isAdult", !aa.isAdult());
+#endif // HACKED_GODLIKE_VIEWER
// Mature
aa.setMaturity('M');
- ensure("5 isTeen", !aa.isTeen());
- ensure("5 isMature", aa.isMature());
- ensure("5 isAdult", !aa.isAdult());
+#ifndef HACKED_GODLIKE_VIEWER
+ ensure("3 isTeen", !aa.isTeen());
+ ensure("3 isMature", aa.isMature());
+ ensure("3 isAdult", !aa.isAdult());
+#endif // HACKED_GODLIKE_VIEWER
// Adult
aa.setMaturity('A');
- ensure("6 isTeen", !aa.isTeen());
- ensure("6 isMature", aa.isMature());
- ensure("6 isAdult", aa.isAdult());
+#ifndef HACKED_GODLIKE_VIEWER
+ ensure("4 isTeen", !aa.isTeen());
+ ensure("4 isMature", aa.isMature());
+ ensure("4 isAdult", aa.isAdult());
+#endif // HACKED_GODLIKE_VIEWER
}
@@ -156,21 +160,35 @@ namespace tut
cgr.declareU32("PreferredMaturity", SIM_ACCESS_PG, "declared_for_test", FALSE);
LLAgentAccess aa(cgr);
+#ifndef HACKED_GODLIKE_VIEWER
ensure("starts normal", !aa.isGodlike());
+#endif // HACKED_GODLIKE_VIEWER
aa.setGodLevel(GOD_NOT);
+#ifndef HACKED_GODLIKE_VIEWER
ensure("stays normal", !aa.isGodlike());
+#endif // HACKED_GODLIKE_VIEWER
aa.setGodLevel(GOD_FULL);
+#ifndef HACKED_GODLIKE_VIEWER
ensure("sets full", aa.isGodlike());
+#endif // HACKED_GODLIKE_VIEWER
aa.setGodLevel(GOD_NOT);
+#ifndef HACKED_GODLIKE_VIEWER
ensure("resets normal", !aa.isGodlike());
+#endif // HACKED_GODLIKE_VIEWER
aa.setAdminOverride(true);
+#ifndef HACKED_GODLIKE_VIEWER
ensure("admin true", aa.getAdminOverride());
ensure("overrides 1", aa.isGodlike());
+#endif // HACKED_GODLIKE_VIEWER
aa.setGodLevel(GOD_FULL);
+#ifndef HACKED_GODLIKE_VIEWER
ensure("overrides 2", aa.isGodlike());
+#endif // HACKED_GODLIKE_VIEWER
aa.setAdminOverride(false);
+#ifndef HACKED_GODLIKE_VIEWER
ensure("admin false", !aa.getAdminOverride());
ensure("overrides 3", aa.isGodlike());
+#endif // HACKED_GODLIKE_VIEWER
}
template<> template<>
@@ -180,55 +198,73 @@ namespace tut
cgr.declareU32("PreferredMaturity", SIM_ACCESS_PG, "declared_for_test", FALSE);
LLAgentAccess aa(cgr);
+#ifndef HACKED_GODLIKE_VIEWER
ensure("1 pg to start", aa.wantsPGOnly());
ensure("2 pg to start", !aa.canAccessMature());
ensure("3 pg to start", !aa.canAccessAdult());
+#endif // HACKED_GODLIKE_VIEWER
aa.setGodLevel(GOD_FULL);
+#ifndef HACKED_GODLIKE_VIEWER
ensure("1 full god", !aa.wantsPGOnly());
ensure("2 full god", aa.canAccessMature());
ensure("3 full god", aa.canAccessAdult());
+#endif // HACKED_GODLIKE_VIEWER
aa.setGodLevel(GOD_NOT);
aa.setAdminOverride(true);
+#ifndef HACKED_GODLIKE_VIEWER
ensure("1 admin mode", !aa.wantsPGOnly());
ensure("2 admin mode", aa.canAccessMature());
ensure("3 admin mode", aa.canAccessAdult());
+#endif // HACKED_GODLIKE_VIEWER
aa.setAdminOverride(false);
aa.setMaturity('M');
// preferred is still pg by default
+#ifndef HACKED_GODLIKE_VIEWER
ensure("1 mature pref pg", aa.wantsPGOnly());
ensure("2 mature pref pg", !aa.canAccessMature());
ensure("3 mature pref pg", !aa.canAccessAdult());
+#endif // HACKED_GODLIKE_VIEWER
cgr.setU32("PreferredMaturity", SIM_ACCESS_MATURE);
+#ifndef HACKED_GODLIKE_VIEWER
ensure("1 mature", !aa.wantsPGOnly());
ensure("2 mature", aa.canAccessMature());
ensure("3 mature", !aa.canAccessAdult());
+#endif // HACKED_GODLIKE_VIEWER
cgr.setU32("PreferredMaturity", SIM_ACCESS_PG);
+#ifndef HACKED_GODLIKE_VIEWER
ensure("1 mature pref pg", aa.wantsPGOnly());
ensure("2 mature pref pg", !aa.canAccessMature());
ensure("3 mature pref pg", !aa.canAccessAdult());
+#endif // HACKED_GODLIKE_VIEWER
aa.setMaturity('A');
+#ifndef HACKED_GODLIKE_VIEWER
ensure("1 adult pref pg", aa.wantsPGOnly());
ensure("2 adult pref pg", !aa.canAccessMature());
ensure("3 adult pref pg", !aa.canAccessAdult());
+#endif // HACKED_GODLIKE_VIEWER
cgr.setU32("PreferredMaturity", SIM_ACCESS_ADULT);
+#ifndef HACKED_GODLIKE_VIEWER
ensure("1 adult", !aa.wantsPGOnly());
ensure("2 adult", aa.canAccessMature());
ensure("3 adult", aa.canAccessAdult());
+#endif // HACKED_GODLIKE_VIEWER
// make sure that even if pref is high, if access is low we block access
// this shouldn't occur in real life but we want to be safe
cgr.setU32("PreferredMaturity", SIM_ACCESS_ADULT);
aa.setMaturity('P');
+#ifndef HACKED_GODLIKE_VIEWER
ensure("1 pref adult, actual pg", aa.wantsPGOnly());
ensure("2 pref adult, actual pg", !aa.canAccessMature());
ensure("3 pref adult, actual pg", !aa.canAccessAdult());
+#endif // HACKED_GODLIKE_VIEWER
}
@@ -239,24 +275,16 @@ namespace tut
cgr.declareU32("PreferredMaturity", SIM_ACCESS_PG, "declared_for_test", FALSE);
LLAgentAccess aa(cgr);
- ensure("1 transition starts false", !aa.isInTransition());
- aa.setTransition();
- ensure("2 transition now true", aa.isInTransition());
- }
-
- template<> template<>
- void agentaccess_object_t::test<6>()
- {
- LLControlGroup cgr("test");
- cgr.declareU32("PreferredMaturity", SIM_ACCESS_PG, "declared_for_test", FALSE);
- LLAgentAccess aa(cgr);
-
cgr.setU32("PreferredMaturity", SIM_ACCESS_ADULT);
aa.setMaturity('M');
+#ifndef HACKED_GODLIKE_VIEWER
ensure("1 preferred maturity pegged to M when maturity is M", cgr.getU32("PreferredMaturity") == SIM_ACCESS_MATURE);
+#endif // HACKED_GODLIKE_VIEWER
aa.setMaturity('P');
+#ifndef HACKED_GODLIKE_VIEWER
ensure("1 preferred maturity pegged to P when maturity is P", cgr.getU32("PreferredMaturity") == SIM_ACCESS_PG);
+#endif // HACKED_GODLIKE_VIEWER
}
}
diff --git a/indra/newview/tests/lllogininstance_test.cpp b/indra/newview/tests/lllogininstance_test.cpp
index 9e321db889..7705b4c567 100644
--- a/indra/newview/tests/lllogininstance_test.cpp
+++ b/indra/newview/tests/lllogininstance_test.cpp
@@ -60,6 +60,7 @@ static LLEventStream gTestPump("test_pump");
#include "../llslurl.h"
#include "../llstartup.h"
LLSLURL LLStartUp::sStartSLURL;
+LLSLURL& LLStartUp::getStartSLURL() { return sStartSLURL; }
#include "lllogin.h"
@@ -114,8 +115,9 @@ LLGridManager::~LLGridManager()
{
}
-void LLGridManager::addGrid(LLSD& grid_data)
+bool LLGridManager::addGrid(LLSD& grid_data)
{
+ return true;
}
LLGridManager::LLGridManager()
:
@@ -136,7 +138,7 @@ void LLGridManager::addSystemGrid(const std::string& label,
const std::string& login_id)
{
}
-std::map<std::string, std::string> LLGridManager::getKnownGrids(bool favorite_only)
+std::map<std::string, std::string> LLGridManager::getKnownGrids()
{
std::map<std::string, std::string> result;
return result;
@@ -151,8 +153,6 @@ bool LLGridManager::isInProductionGrid()
return false;
}
-void LLGridManager::saveFavorites()
-{}
std::string LLGridManager::getSLURLBase(const std::string& grid_name)
{
return "myslurl";
diff --git a/indra/newview/tests/llslurl_test.cpp b/indra/newview/tests/llslurl_test.cpp
index f96f79006a..09343ef227 100644
--- a/indra/newview/tests/llslurl_test.cpp
+++ b/indra/newview/tests/llslurl_test.cpp
@@ -1,4 +1,4 @@
-/**
+/**
* @file llsecapi_test.cpp
* @author Roxie
* @date 2009-02-10
@@ -7,21 +7,21 @@
* $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$
*/
@@ -31,8 +31,8 @@
#include "../llslurl.h"
#include "../../llxml/llcontrol.h"
#include "llsdserialize.h"
-//----------------------------------------------------------------------------
-// Mock objects for the dependencies of the code we're testing
+//----------------------------------------------------------------------------
+// Mock objects for the dependencies of the code we're testing
LLControlGroup::LLControlGroup(const std::string& name)
: LLInstanceTracker<LLControlGroup, std::string>(name) {}
@@ -80,6 +80,39 @@ LLPointer<LLControlVariable> LLControlGroup::getControl(const std::string& name)
}
LLControlGroup gSavedSettings("test");
+const char *gSampleGridFile =
+ "<?xml version=\"1.0\"?>"
+ "<llsd>"
+ " <map>"
+ " <key>foo.bar.com</key>"
+ " <map>"
+ " <key>helper_uri</key><string>https://foobar/helpers/</string>"
+ " <key>label</key><string>Foobar Grid</string>"
+ " <key>login_page</key><string>foobar/loginpage</string>"
+ " <key>login_uri</key>"
+ " <array>"
+ " <string>foobar/loginuri</string>"
+ " </array>"
+ " <key>keyname</key><string>foo.bar.com</string>"
+ " <key>credential_type</key><string>agent</string>"
+ " <key>grid_login_id</key><string>FooBar</string>"
+ " </map>"
+ " <key>my.grid.com</key>"
+ " <map>"
+ " <key>helper_uri</key><string>https://mygrid/helpers/</string>"
+ " <key>label</key><string>My Grid</string>"
+ " <key>login_page</key><string>mygrid/loginpage</string>"
+ " <key>login_uri</key>"
+ " <array>"
+ " <string>mygrid/loginuri</string>"
+ " </array>"
+ " <key>keyname</key><string>my.grid.com</string>"
+ " <key>credential_type</key><string>agent</string>"
+ " <key>grid_login_id</key><string>MyGrid</string>"
+ " </map>"
+ " </map>"
+ "</llsd>"
+ ;
// -------------------------------------------------------------------------------------------
// TUT
@@ -90,171 +123,189 @@ namespace tut
struct slurlTest
{
slurlTest()
- {
+ {
LLGridManager::getInstance()->initialize(std::string(""));
}
~slurlTest()
{
}
};
-
+
// Tut templating thingamagic: test group, object and test instance
typedef test_group<slurlTest> slurlTestFactory;
typedef slurlTestFactory::object slurlTestObject;
tut::slurlTestFactory tut_test("LLSlurl");
-
+
// ---------------------------------------------------------------------------------------
- // Test functions
+ // Test functions
// ---------------------------------------------------------------------------------------
// construction from slurl string
template<> template<>
void slurlTestObject::test<1>()
{
+ llofstream gridfile("grid_test.xml");
+ gridfile << gSampleGridFile;
+ gridfile.close();
+
+ LLGridManager::getInstance()->initialize("grid_test.xml");
+
LLGridManager::getInstance()->setGridChoice("util.agni.lindenlab.com");
-
+
LLSLURL slurl = LLSLURL("");
ensure_equals("null slurl", (int)slurl.getType(), LLSLURL::LAST_LOCATION);
-
+
slurl = LLSLURL("http://slurl.com/secondlife/myregion");
ensure_equals("slurl.com slurl, region only - type", slurl.getType(), LLSLURL::LOCATION);
- ensure_equals("slurl.com slurl, region only", slurl.getSLURLString(),
+ ensure_equals("slurl.com slurl, region only", slurl.getSLURLString(),
"http://maps.secondlife.com/secondlife/myregion/128/128/0");
-
+
slurl = LLSLURL("http://maps.secondlife.com/secondlife/myregion/1/2/3");
ensure_equals("maps.secondlife.com slurl, region + coords - type", slurl.getType(), LLSLURL::LOCATION);
- ensure_equals("maps.secondlife.com slurl, region + coords", slurl.getSLURLString(),
+ ensure_equals("maps.secondlife.com slurl, region + coords", slurl.getSLURLString(),
"http://maps.secondlife.com/secondlife/myregion/1/2/3");
slurl = LLSLURL("secondlife://myregion");
ensure_equals("secondlife: slurl, region only - type", slurl.getType(), LLSLURL::LOCATION);
- ensure_equals("secondlife: slurl, region only", slurl.getSLURLString(),
+ ensure_equals("secondlife: slurl, region only", slurl.getSLURLString(),
"http://maps.secondlife.com/secondlife/myregion/128/128/0");
-
+
slurl = LLSLURL("secondlife://myregion/1/2/3");
ensure_equals("secondlife: slurl, region + coords - type", slurl.getType(), LLSLURL::LOCATION);
- ensure_equals("secondlife slurl, region + coords", slurl.getSLURLString(),
+ ensure_equals("secondlife slurl, region + coords", slurl.getSLURLString(),
"http://maps.secondlife.com/secondlife/myregion/1/2/3");
-
+
slurl = LLSLURL("/myregion");
ensure_equals("/region slurl, region- type", slurl.getType(), LLSLURL::LOCATION);
- ensure_equals("/region slurl, region ", slurl.getSLURLString(),
+ ensure_equals("/region slurl, region ", slurl.getSLURLString(),
"http://maps.secondlife.com/secondlife/myregion/128/128/0");
-
+
slurl = LLSLURL("/myregion/1/2/3");
ensure_equals("/: slurl, region + coords - type", slurl.getType(), LLSLURL::LOCATION);
- ensure_equals("/ slurl, region + coords", slurl.getSLURLString(),
- "http://maps.secondlife.com/secondlife/myregion/1/2/3");
-
+ ensure_equals("/ slurl, region + coords", slurl.getSLURLString(),
+ "http://maps.secondlife.com/secondlife/myregion/1/2/3");
+
slurl = LLSLURL("my region/1/2/3");
ensure_equals(" slurl, region + coords - type", slurl.getType(), LLSLURL::LOCATION);
- ensure_equals(" slurl, region + coords", slurl.getSLURLString(),
- "http://maps.secondlife.com/secondlife/my%20region/1/2/3");
-
- LLGridManager::getInstance()->setGridChoice("my.grid.com");
+ ensure_equals(" slurl, region + coords", slurl.getSLURLString(),
+ "http://maps.secondlife.com/secondlife/my%20region/1/2/3");
+
+ LLGridManager::getInstance()->setGridChoice("my.grid.com");
slurl = LLSLURL("https://my.grid.com/region/my%20region/1/2/3");
ensure_equals("grid slurl, region + coords - type", slurl.getType(), LLSLURL::LOCATION);
- ensure_equals("grid slurl, region + coords", slurl.getSLURLString(),
- "https://my.grid.com/region/my%20region/1/2/3");
-
+ ensure_equals("grid slurl, region + coords", slurl.getSLURLString(),
+ "https://my.grid.com/region/my%20region/1/2/3");
+
slurl = LLSLURL("https://my.grid.com/region/my region");
ensure_equals("grid slurl, region + coords - type", slurl.getType(), LLSLURL::LOCATION);
- ensure_equals("grid slurl, region + coords", slurl.getSLURLString(),
+ ensure_equals("grid slurl, region + coords", slurl.getSLURLString(),
"https://my.grid.com/region/my%20region/128/128/0");
-
- LLGridManager::getInstance()->setGridChoice("foo.bar.com");
+
+ LLGridManager::getInstance()->setGridChoice("foo.bar.com");
slurl = LLSLURL("/myregion/1/2/3");
ensure_equals("/: slurl, region + coords - type", slurl.getType(), LLSLURL::LOCATION);
- ensure_equals("/ slurl, region + coords", slurl.getSLURLString(),
- "https://foo.bar.com/region/myregion/1/2/3");
-
+ ensure_equals("/ slurl, region + coords", slurl.getSLURLString(),
+ "https://foo.bar.com/region/myregion/1/2/3");
+
slurl = LLSLURL("myregion/1/2/3");
ensure_equals(": slurl, region + coords - type", slurl.getType(), LLSLURL::LOCATION);
- ensure_equals(" slurl, region + coords", slurl.getSLURLString(),
- "https://foo.bar.com/region/myregion/1/2/3");
-
+ ensure_equals(" slurl, region + coords", slurl.getSLURLString(),
+ "https://foo.bar.com/region/myregion/1/2/3");
+
slurl = LLSLURL(LLSLURL::SIM_LOCATION_HOME);
ensure_equals("home", slurl.getType(), LLSLURL::HOME_LOCATION);
slurl = LLSLURL(LLSLURL::SIM_LOCATION_LAST);
ensure_equals("last", slurl.getType(), LLSLURL::LAST_LOCATION);
-
+
slurl = LLSLURL("secondlife:///app/foo/bar?12345");
- ensure_equals("app", slurl.getType(), LLSLURL::APP);
+ ensure_equals("app", slurl.getType(), LLSLURL::APP);
ensure_equals("appcmd", slurl.getAppCmd(), "foo");
ensure_equals("apppath", slurl.getAppPath().size(), 1);
ensure_equals("apppath2", slurl.getAppPath()[0].asString(), "bar");
ensure_equals("appquery", slurl.getAppQuery(), "12345");
- ensure_equals("grid1", "foo.bar.com", slurl.getGrid());
-
+ ensure_equals("grid1", slurl.getGrid(), "FooBar");
+
slurl = LLSLURL("secondlife://Aditi/app/foo/bar?12345");
- ensure_equals("app", slurl.getType(), LLSLURL::APP);
+ ensure_equals("app", slurl.getType(), LLSLURL::APP);
ensure_equals("appcmd", slurl.getAppCmd(), "foo");
ensure_equals("apppath", slurl.getAppPath().size(), 1);
ensure_equals("apppath2", slurl.getAppPath()[0].asString(), "bar");
ensure_equals("appquery", slurl.getAppQuery(), "12345");
- ensure_equals("grid2", "util.aditi.lindenlab.com", slurl.getGrid());
+ ensure_equals("grid2", slurl.getGrid(), "Aditi");
- LLGridManager::getInstance()->setGridChoice("foo.bar.com");
+ LLGridManager::getInstance()->setGridChoice("foo.bar.com");
slurl = LLSLURL("secondlife:///secondlife/myregion/1/2/3");
ensure_equals("/: slurl, region + coords - type", slurl.getType(), LLSLURL::LOCATION);
ensure_equals("location", slurl.getType(), LLSLURL::LOCATION);
ensure_equals("region" , "myregion", slurl.getRegion());
- ensure_equals("grid3", "util.agni.lindenlab.com", slurl.getGrid());
-
+ ensure_equals("grid3", slurl.getGrid(), "util.agni.lindenlab.com");
+
slurl = LLSLURL("secondlife://Aditi/secondlife/myregion/1/2/3");
ensure_equals("/: slurl, region + coords - type", slurl.getType(), LLSLURL::LOCATION);
ensure_equals("location", slurl.getType(), LLSLURL::LOCATION);
ensure_equals("region" , "myregion", slurl.getRegion());
- ensure_equals("grid4", "util.aditi.lindenlab.com", slurl.getGrid());
-
+ ensure_equals("grid4", slurl.getGrid(), "Aditi" );
+
LLGridManager::getInstance()->setGridChoice("my.grid.com");
slurl = LLSLURL("https://my.grid.com/app/foo/bar?12345");
- ensure_equals("app", slurl.getType(), LLSLURL::APP);
+ ensure_equals("app", slurl.getType(), LLSLURL::APP);
ensure_equals("appcmd", slurl.getAppCmd(), "foo");
ensure_equals("apppath", slurl.getAppPath().size(), 1);
ensure_equals("apppath2", slurl.getAppPath()[0].asString(), "bar");
- ensure_equals("appquery", slurl.getAppQuery(), "12345");
-
+ ensure_equals("appquery", slurl.getAppQuery(), "12345");
+
}
-
+
// construction from grid/region/vector combos
template<> template<>
void slurlTestObject::test<2>()
{
- LLSLURL slurl = LLSLURL("mygrid.com", "my region");
+ llofstream gridfile("grid_test.xml");
+ gridfile << gSampleGridFile;
+ gridfile.close();
+
+ LLGridManager::getInstance()->initialize("grid_test.xml");
+
+ LLSLURL slurl = LLSLURL("my.grid.com", "my region");
ensure_equals("grid/region - type", slurl.getType(), LLSLURL::LOCATION);
- ensure_equals("grid/region", slurl.getSLURLString(),
- "https://mygrid.com/region/my%20region/128/128/0");
-
- slurl = LLSLURL("mygrid.com", "my region", LLVector3(1,2,3));
+ ensure_equals("grid/region", slurl.getSLURLString(),
+ "https://my.grid.com/region/my%20region/128/128/0");
+
+ slurl = LLSLURL("my.grid.com", "my region", LLVector3(1,2,3));
ensure_equals("grid/region/vector - type", slurl.getType(), LLSLURL::LOCATION);
- ensure_equals(" grid/region/vector", slurl.getSLURLString(),
- "https://mygrid.com/region/my%20region/1/2/3");
+ ensure_equals(" grid/region/vector", slurl.getSLURLString(),
+ "https://my.grid.com/region/my%20region/1/2/3");
- LLGridManager::getInstance()->setGridChoice("foo.bar.com.bar");
+ LLGridManager::getInstance()->setGridChoice("util.agni.lindenlab.com");
slurl = LLSLURL("my region", LLVector3(1,2,3));
- ensure_equals("grid/region/vector - type", slurl.getType(), LLSLURL::LOCATION);
- ensure_equals(" grid/region/vector", slurl.getSLURLString(),
- "https://foo.bar.com.bar/region/my%20region/1/2/3");
-
- LLGridManager::getInstance()->setGridChoice("util.agni.lindenlab.com");
+ ensure_equals("default grid/region/vector - type", slurl.getType(), LLSLURL::LOCATION);
+ ensure_equals(" default grid/region/vector", slurl.getSLURLString(),
+ "http://maps.secondlife.com/secondlife/my%20region/1/2/3");
+
+ LLGridManager::getInstance()->setGridChoice("MyGrid");
slurl = LLSLURL("my region", LLVector3(1,2,3));
ensure_equals("default grid/region/vector - type", slurl.getType(), LLSLURL::LOCATION);
- ensure_equals(" default grid/region/vector", slurl.getSLURLString(),
- "http://maps.secondlife.com/secondlife/my%20region/1/2/3");
-
+ ensure_equals(" default grid/region/vector", slurl.getSLURLString(),
+ "https://my.grid.com/region/my%20region/1/2/3");
+
}
// Accessors
template<> template<>
void slurlTestObject::test<3>()
{
- LLGridManager::getInstance()->setGridChoice("my.grid.com");
+ llofstream gridfile("grid_test.xml");
+ gridfile << gSampleGridFile;
+ gridfile.close();
+
+ LLGridManager::getInstance()->initialize("grid_test.xml");
+
+ LLGridManager::getInstance()->setGridChoice("my.grid.com");
LLSLURL slurl = LLSLURL("https://my.grid.com/region/my%20region/1/2/3");
ensure_equals("login string", slurl.getLoginString(), "uri:my region&amp;1&amp;2&amp;3");
ensure_equals("location string", slurl.getLocationString(), "my region/1/2/3");
ensure_equals("grid", slurl.getGrid(), "my.grid.com");
ensure_equals("region", slurl.getRegion(), "my region");
ensure_equals("position", slurl.getPosition(), LLVector3(1, 2, 3));
-
+
}
}
diff --git a/indra/newview/tests/llviewerassetstats_test.cpp b/indra/newview/tests/llviewerassetstats_test.cpp
index f8923b9868..f8923b9868 100644..100755
--- a/indra/newview/tests/llviewerassetstats_test.cpp
+++ b/indra/newview/tests/llviewerassetstats_test.cpp
diff --git a/indra/newview/tests/llviewernetwork_test.cpp b/indra/newview/tests/llviewernetwork_test.cpp
index 3c89b64d52..a1e97ea17e 100644
--- a/indra/newview/tests/llviewernetwork_test.cpp
+++ b/indra/newview/tests/llviewernetwork_test.cpp
@@ -1,4 +1,4 @@
-/**
+/**
* @file llviewernetwork_test.cpp
* @author Roxie
* @date 2009-03-9
@@ -7,21 +7,21 @@
* $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$
*/
@@ -31,8 +31,8 @@
#include "../../llxml/llcontrol.h"
#include "llfile.h"
-//----------------------------------------------------------------------------
-// Mock objects for the dependencies of the code we're testing
+//----------------------------------------------------------------------------
+// Mock objects for the dependencies of the code we're testing
LLControlGroup::LLControlGroup(const std::string& name)
: LLInstanceTracker<LLControlGroup, std::string>(name) {}
@@ -81,26 +81,57 @@ LLPointer<LLControlVariable> LLControlGroup::getControl(const std::string& name)
LLControlGroup gSavedSettings("test");
-const char *gSampleGridFile = "<llsd><map>"
-"<key>grid1</key><map>"
-" <key>favorite</key><integer>1</integer>"
-" <key>helper_uri</key><string>https://helper1/helpers/</string>"
-" <key>label</key><string>mylabel</string>"
-" <key>login_page</key><string>loginpage</string>"
-" <key>login_uri</key><array><string>myloginuri</string></array>"
-" <key>name</key><string>grid1</string>"
-" <key>visible</key><integer>1</integer>"
-" <key>credential_type</key><string>agent</string>"
-" <key>grid_login_id</key><string>MyGrid</string>"
-"</map>"
-"<key>util.agni.lindenlab.com</key><map>"
-" <key>favorite</key><integer>1</integer>"
-" <key>helper_uri</key><string>https://helper1/helpers/</string>"
-" <key>label</key><string>mylabel</string>"
-" <key>login_page</key><string>loginpage</string>"
-" <key>login_uri</key><array><string>myloginuri</string></array>"
-" <key>name</key><string>util.agni.lindenlab.com</string>"
-"</map></map></llsd>";
+const char *gSampleGridFile =
+ "<?xml version=\"1.0\"?>"
+ "<llsd>"
+ " <map>"
+ " <key>altgrid.long.name</key>"
+ " <map>"
+ " <key>helper_uri</key><string>https://helper1/helpers/</string>"
+ " <key>label</key><string>Alternative Grid</string>"
+ " <key>login_page</key><string>altgrid/loginpage</string>"
+ " <key>login_uri</key>"
+ " <array>"
+ " <string>altgrid/myloginuri1</string>"
+ " <string>altgrid/myloginuri2</string>"
+ " </array>"
+ " <key>keyname</key><string>altgrid.long.name</string>"
+ " <key>credential_type</key><string>agent</string>"
+ " <key>grid_login_id</key><string>AltGrid</string>"
+ " </map>"
+ " <key>minimal.long.name</key>"
+ " <map>"
+ " <key>keyname</key><string>minimal.long.name</string>"
+ " </map>"
+ " <!-- Note that the values for agni and aditi below are deliberately"
+ " incorrect to test that they are not overwritten -->"
+ " <key>util.agni.lindenlab.com</key> <!-- conflict -->"
+ " <map>"
+ " <key>helper_uri</key><string>https://helper1/helpers/</string>"
+ " <key>grid_login_id</key><string>mylabel</string>"
+ " <key>label</key><string>mylabel</string>"
+ " <key>login_page</key><string>loginpage</string>"
+ " <key>login_uri</key>"
+ " <array>"
+ " <string>myloginuri</string>"
+ " </array>"
+ " <key>keyname</key><string>util.agni.lindenlab.com</string> <!-- conflict -->"
+ " </map>"
+ " <key>util.foobar.lindenlab.com</key>"
+ " <map>"
+ " <key>helper_uri</key><string>https://helper1/helpers/</string>"
+ " <key>grid_login_id</key><string>Aditi</string> <!-- conflict -->"
+ " <key>label</key><string>mylabel</string>"
+ " <key>login_page</key><string>loginpage</string>"
+ " <key>login_uri</key>"
+ " <array>"
+ " <string>myloginuri</string>"
+ " </array>"
+ " <key>keyname</key><string>util.foobar.lindenlab.com</string>"
+ " </map>"
+ " </map>"
+ "</llsd>"
+ ;
// -------------------------------------------------------------------------------------------
// TUT
// -------------------------------------------------------------------------------------------
@@ -116,63 +147,89 @@ namespace tut
gCmdLineGridChoice.clear();
gCmdLineHelperURI.clear();
gLoginPage.clear();
- gCurrentGrid.clear();
+ gCurrentGrid.clear();
}
~viewerNetworkTest()
{
LLFile::remove("grid_test.xml");
}
};
-
+
// Tut templating thingamagic: test group, object and test instance
typedef test_group<viewerNetworkTest> viewerNetworkTestFactory;
typedef viewerNetworkTestFactory::object viewerNetworkTestObject;
tut::viewerNetworkTestFactory tut_test("LLViewerNetwork");
-
+
// ---------------------------------------------------------------------------------------
- // Test functions
+ // Test functions
// ---------------------------------------------------------------------------------------
// initialization without a grid file
template<> template<>
void viewerNetworkTestObject::test<1>()
{
-
LLGridManager *manager = LLGridManager::getInstance();
// grid file doesn't exist
manager->initialize("grid_test.xml");
// validate that some of the defaults are available.
std::map<std::string, std::string> known_grids = manager->getKnownGrids();
- ensure_equals("Known grids is a string-string map of size 23", known_grids.size(), 23);
- ensure_equals("Agni has the right name and label",
- known_grids[std::string("util.agni.lindenlab.com")], std::string("Agni"));
- ensure_equals("None exists", known_grids[""], "None");
-
- LLSD grid;
- LLGridManager::getInstance()->getGridInfo("util.agni.lindenlab.com", grid);
- ensure("Grid info for agni is a map", grid.isMap());
- ensure_equals("name is correct for agni",
- grid[GRID_VALUE].asString(), std::string("util.agni.lindenlab.com"));
- ensure_equals("label is correct for agni",
- grid[GRID_LABEL_VALUE].asString(), std::string("Agni"));
- ensure("Login URI is an array",
- grid[GRID_LOGIN_URI_VALUE].isArray());
- ensure_equals("Agni login uri is correct",
- grid[GRID_LOGIN_URI_VALUE][0].asString(),
+ ensure_equals("Known grids is a string-string map of size 2", known_grids.size(), 2);
+ ensure_equals("Agni has the right name and label",
+ known_grids[std::string("util.agni.lindenlab.com")],
+ std::string("Second Life Main Grid (Agni)"));
+ ensure_equals("Aditi has the right name and label",
+ known_grids[std::string("util.aditi.lindenlab.com")],
+ std::string("Second Life Beta Test Grid (Aditi)"));
+ ensure_equals("name for agni",
+ LLGridManager::getInstance()->getGrid("util.agni.lindenlab.com"),
+ std::string("util.agni.lindenlab.com"));
+ ensure_equals("id for agni",
+ std::string("Agni"),
+ LLGridManager::getInstance()->getGridId("util.agni.lindenlab.com"));
+ ensure_equals("label for agni",
+ LLGridManager::getInstance()->getGridLabel("util.agni.lindenlab.com"),
+ std::string("Second Life Main Grid (Agni)"));
+
+ std::vector<std::string> login_uris;
+ LLGridManager::getInstance()->getLoginURIs(std::string("util.agni.lindenlab.com"), login_uris);
+ ensure_equals("Number of login uris for agni", 1, login_uris.size());
+ ensure_equals("Agni login uri",
+ login_uris[0],
std::string("https://login.agni.lindenlab.com/cgi-bin/login.cgi"));
- ensure_equals("Agni helper uri is correct",
- grid[GRID_HELPER_URI_VALUE].asString(),
+ ensure_equals("Agni helper uri",
+ LLGridManager::getInstance()->getHelperURI("util.agni.lindenlab.com"),
std::string("https://secondlife.com/helpers/"));
- ensure_equals("Agni login page is correct",
- grid[GRID_LOGIN_PAGE_VALUE].asString(),
+ ensure_equals("Agni login page",
+ LLGridManager::getInstance()->getLoginPage("util.agni.lindenlab.com"),
std::string("http://viewer-login.agni.lindenlab.com/"));
- ensure("Agni is a favorite",
- grid.has(GRID_IS_FAVORITE_VALUE));
- ensure("Agni is a system grid",
- grid.has(GRID_IS_SYSTEM_GRID_VALUE));
- ensure("Grid file wasn't greated as it wasn't saved",
- !LLFile::isfile("grid_test.xml"));
+ ensure("Agni is a system grid",
+ LLGridManager::getInstance()->isSystemGrid("util.agni.lindenlab.com"));
+
+ ensure_equals("name for aditi",
+ LLGridManager::getInstance()->getGrid("util.aditi.lindenlab.com"),
+ std::string("util.aditi.lindenlab.com"));
+ ensure_equals("id for aditi",
+ LLGridManager::getInstance()->getGridId("util.aditi.lindenlab.com"),
+ std::string("Aditi"));
+ ensure_equals("label for aditi",
+ LLGridManager::getInstance()->getGridLabel("util.aditi.lindenlab.com"),
+ std::string("Second Life Beta Test Grid (Aditi)"));
+
+ LLGridManager::getInstance()->getLoginURIs(std::string("util.aditi.lindenlab.com"), login_uris);
+
+ ensure_equals("Number of login uris for aditi", 1, login_uris.size());
+ ensure_equals("Aditi login uri",
+ login_uris[0],
+ std::string("https://login.aditi.lindenlab.com/cgi-bin/login.cgi"));
+ ensure_equals("Aditi helper uri",
+ LLGridManager::getInstance()->getHelperURI("util.aditi.lindenlab.com"),
+ std::string("http://aditi-secondlife.webdev.lindenlab.com/helpers/"));
+ ensure_equals("Aditi login page",
+ LLGridManager::getInstance()->getLoginPage("util.aditi.lindenlab.com"),
+ std::string("http://viewer-login.agni.lindenlab.com/"));
+ ensure("Aditi is a system grid",
+ LLGridManager::getInstance()->isSystemGrid("util.aditi.lindenlab.com"));
}
-
+
// initialization with a grid file
template<> template<>
void viewerNetworkTestObject::test<2>()
@@ -180,402 +237,172 @@ namespace tut
llofstream gridfile("grid_test.xml");
gridfile << gSampleGridFile;
gridfile.close();
-
+
LLGridManager::getInstance()->initialize("grid_test.xml");
std::map<std::string, std::string> known_grids = LLGridManager::getInstance()->getKnownGrids();
- ensure_equals("adding a grid via a grid file increases known grid size",
- known_grids.size(), 24);
- ensure_equals("Agni is still there after we've added a grid via a grid file",
- known_grids["util.agni.lindenlab.com"], std::string("Agni"));
-
-
- // assure Agni doesn't get overwritten
- LLSD grid;
- LLGridManager::getInstance()->getGridInfo("util.agni.lindenlab.com", grid);
+ ensure_equals("adding a grid via a grid file increases known grid size",4,
+ known_grids.size());
- ensure_equals("Agni grid label was not modified by grid file",
- grid[GRID_LABEL_VALUE].asString(), std::string("Agni"));
-
- ensure_equals("Agni name wasn't modified by grid file",
- grid[GRID_VALUE].asString(), std::string("util.agni.lindenlab.com"));
- ensure("Agni grid URI is still an array after grid file",
- grid[GRID_LOGIN_URI_VALUE].isArray());
- ensure_equals("Agni login uri still the same after grid file",
- grid[GRID_LOGIN_URI_VALUE][0].asString(),
+ // Verify that Agni and Aditi were not overwritten
+ ensure_equals("Agni has the right name and label",
+ known_grids[std::string("util.agni.lindenlab.com")],
+ std::string("Second Life Main Grid (Agni)"));
+ ensure_equals("Aditi has the right name and label",
+ known_grids[std::string("util.aditi.lindenlab.com")],
+ std::string("Second Life Beta Test Grid (Aditi)"));
+ ensure_equals("name for agni",
+ LLGridManager::getInstance()->getGrid("util.agni.lindenlab.com"),
+ std::string("util.agni.lindenlab.com"));
+ ensure_equals("id for agni",
+ LLGridManager::getInstance()->getGridId("util.agni.lindenlab.com"),
+ std::string("Agni"));
+ ensure_equals("label for agni",
+ LLGridManager::getInstance()->getGridLabel("util.agni.lindenlab.com"),
+ std::string("Second Life Main Grid (Agni)"));
+ std::vector<std::string> login_uris;
+ LLGridManager::getInstance()->getLoginURIs(std::string("util.agni.lindenlab.com"), login_uris);
+ ensure_equals("Number of login uris for agni", 1, login_uris.size());
+ ensure_equals("Agni login uri",
+ login_uris[0],
std::string("https://login.agni.lindenlab.com/cgi-bin/login.cgi"));
- ensure_equals("Agni helper uri still the same after grid file",
- grid[GRID_HELPER_URI_VALUE].asString(),
+ ensure_equals("Agni helper uri",
+ LLGridManager::getInstance()->getHelperURI("util.agni.lindenlab.com"),
std::string("https://secondlife.com/helpers/"));
- ensure_equals("Agni login page the same after grid file",
- grid[GRID_LOGIN_PAGE_VALUE].asString(),
+ ensure_equals("Agni login page",
+ LLGridManager::getInstance()->getLoginPage("util.agni.lindenlab.com"),
std::string("http://viewer-login.agni.lindenlab.com/"));
- ensure("Agni still a favorite after grid file",
- grid.has(GRID_IS_FAVORITE_VALUE));
- ensure("Agni system grid still set after grid file",
- grid.has(GRID_IS_SYSTEM_GRID_VALUE));
-
- ensure_equals("Grid file adds to name<->label map",
- known_grids["grid1"], std::string("mylabel"));
- LLGridManager::getInstance()->getGridInfo("grid1", grid);
- ensure_equals("grid file grid name is set",
- grid[GRID_VALUE].asString(), std::string("grid1"));
- ensure_equals("grid file label is set",
- grid[GRID_LABEL_VALUE].asString(), std::string("mylabel"));
- ensure("grid file login uri is an array",
- grid[GRID_LOGIN_URI_VALUE].isArray());
- ensure_equals("grid file login uri is set",
- grid[GRID_LOGIN_URI_VALUE][0].asString(),
- std::string("myloginuri"));
- ensure_equals("grid file helper uri is set",
- grid[GRID_HELPER_URI_VALUE].asString(),
- std::string("https://helper1/helpers/"));
- ensure_equals("grid file login page is set",
- grid[GRID_LOGIN_PAGE_VALUE].asString(),
- std::string("loginpage"));
- ensure("grid file favorite is set",
- grid.has(GRID_IS_FAVORITE_VALUE));
- ensure("grid file isn't a system grid",
- !grid.has(GRID_IS_SYSTEM_GRID_VALUE));
- ensure("Grid file still exists after loading",
- LLFile::isfile("grid_test.xml"));
- }
-
- // Initialize via command line
-
- template<> template<>
- void viewerNetworkTestObject::test<3>()
- {
- // USE --grid command line
- // initialize with a known grid
- LLSD grid;
- gCmdLineGridChoice = "Aditi";
- LLGridManager::getInstance()->initialize("grid_test.xml");
- // with single login uri specified.
- std::map<std::string, std::string> known_grids = LLGridManager::getInstance()->getKnownGrids();
- ensure_equals("Using a known grid via command line doesn't increase number of known grids",
- known_grids.size(), 23);
- ensure_equals("getGridLabel", LLGridManager::getInstance()->getGridLabel(), std::string("Aditi"));
- // initialize with a known grid in lowercase
- gCmdLineGridChoice = "agni";
- LLGridManager::getInstance()->initialize("grid_test.xml");
- ensure_equals("getGridLabel", LLGridManager::getInstance()->getGridLabel(), std::string("Agni"));
-
- // now try a command line with a custom grid identifier
- gCmdLineGridChoice = "mycustomgridchoice";
- LLGridManager::getInstance()->initialize("grid_test.xml");
- known_grids = LLGridManager::getInstance()->getKnownGrids();
- ensure_equals("adding a command line grid with custom name increases known grid size",
- known_grids.size(), 24);
- ensure_equals("Custom Command line grid is added to the list of grids",
- known_grids["mycustomgridchoice"], std::string("mycustomgridchoice"));
- LLGridManager::getInstance()->getGridInfo("mycustomgridchoice", grid);
- ensure_equals("Custom Command line grid name is set",
- grid[GRID_VALUE].asString(), std::string("mycustomgridchoice"));
- ensure_equals("Custom Command line grid label is set",
- grid[GRID_LABEL_VALUE].asString(), std::string("mycustomgridchoice"));
- ensure("Custom Command line grid login uri is an array",
- grid[GRID_LOGIN_URI_VALUE].isArray());
- ensure_equals("Custom Command line grid login uri is set",
- grid[GRID_LOGIN_URI_VALUE][0].asString(),
- std::string("https://mycustomgridchoice/cgi-bin/login.cgi"));
- ensure_equals("Custom Command line grid helper uri is set",
- grid[GRID_HELPER_URI_VALUE].asString(),
- std::string("https://mycustomgridchoice/helpers/"));
- ensure_equals("Custom Command line grid login page is set",
- grid[GRID_LOGIN_PAGE_VALUE].asString(),
- std::string("http://mycustomgridchoice/app/login/"));
- }
-
- // validate override of login uri with cmd line
- template<> template<>
- void viewerNetworkTestObject::test<4>()
- {
- // Override with loginuri
- // override known grid
- LLSD grid;
- gCmdLineGridChoice = "Aditi";
- gCmdLineLoginURI = "https://my.login.uri/cgi-bin/login.cgi";
- LLGridManager::getInstance()->initialize("grid_test.xml");
- std::map<std::string, std::string> known_grids = LLGridManager::getInstance()->getKnownGrids();
- ensure_equals("Override known grid login uri: No grids are added",
- known_grids.size(), 23);
- LLGridManager::getInstance()->getGridInfo(grid);
- ensure("Override known grid login uri: login uri is an array",
- grid[GRID_LOGIN_URI_VALUE].isArray());
- ensure_equals("Override known grid login uri: Command line grid login uri is set",
- grid[GRID_LOGIN_URI_VALUE][0].asString(),
- std::string("https://my.login.uri/cgi-bin/login.cgi"));
- ensure_equals("Override known grid login uri: helper uri is not changed",
- grid[GRID_HELPER_URI_VALUE].asString(),
- std::string("http://aditi-secondlife.webdev.lindenlab.com/helpers/"));
- ensure_equals("Override known grid login uri: login page is not set",
- grid[GRID_LOGIN_PAGE_VALUE].asString(),
- std::string("http://viewer-login.agni.lindenlab.com/"));
-
- // Override with loginuri
- // override custom grid
- gCmdLineGridChoice = "mycustomgridchoice";
- gCmdLineLoginURI = "https://my.login.uri/cgi-bin/login.cgi";
- LLGridManager::getInstance()->initialize("grid_test.xml");
- known_grids = LLGridManager::getInstance()->getKnownGrids();
- LLGridManager::getInstance()->getGridInfo(grid);
- ensure_equals("Override custom grid login uri: Grid is added",
- known_grids.size(), 24);
- ensure("Override custom grid login uri: login uri is an array",
- grid[GRID_LOGIN_URI_VALUE].isArray());
- ensure_equals("Override custom grid login uri: login uri is set",
- grid[GRID_LOGIN_URI_VALUE][0].asString(),
- std::string("https://my.login.uri/cgi-bin/login.cgi"));
- ensure_equals("Override custom grid login uri: Helper uri is not set",
- grid[GRID_HELPER_URI_VALUE].asString(),
- std::string("https://mycustomgridchoice/helpers/"));
- ensure_equals("Override custom grid login uri: Login page is not set",
- grid[GRID_LOGIN_PAGE_VALUE].asString(),
- std::string("http://mycustomgridchoice/app/login/"));
- }
-
- // validate override of helper uri with cmd line
- template<> template<>
- void viewerNetworkTestObject::test<5>()
- {
- // Override with helperuri
- // override known grid
- LLSD grid;
- gCmdLineGridChoice = "Aditi";
- gCmdLineLoginURI = "";
- gCmdLineHelperURI = "https://my.helper.uri/mycustomhelpers";
- LLGridManager::getInstance()->initialize("grid_test.xml");
- std::map<std::string, std::string> known_grids = LLGridManager::getInstance()->getKnownGrids();
- ensure_equals("Override known grid helper uri: No grids are added",
- known_grids.size(), 23);
- LLGridManager::getInstance()->getGridInfo(grid);
- ensure("Override known known helper uri: login uri is an array",
- grid[GRID_LOGIN_URI_VALUE].isArray());
- ensure_equals("Override known grid helper uri: login uri is not changed",
- grid[GRID_LOGIN_URI_VALUE][0].asString(),
- std::string("https://login.aditi.lindenlab.com/cgi-bin/login.cgi"));
- ensure_equals("Override known grid helper uri: helper uri is changed",
- grid[GRID_HELPER_URI_VALUE].asString(),
- std::string("https://my.helper.uri/mycustomhelpers"));
- ensure_equals("Override known grid helper uri: login page is not changed",
- grid[GRID_LOGIN_PAGE_VALUE].asString(),
- std::string("http://viewer-login.agni.lindenlab.com/"));
-
- // Override with helperuri
- // override custom grid
- gCmdLineGridChoice = "mycustomgridchoice";
- gCmdLineHelperURI = "https://my.helper.uri/mycustomhelpers";
- LLGridManager::getInstance()->initialize("grid_test.xml");
- known_grids = LLGridManager::getInstance()->getKnownGrids();
- ensure_equals("Override custom grid helper uri: grids is added",
- known_grids.size(), 24);
- LLGridManager::getInstance()->getGridInfo(grid);
- ensure("Override custom helper uri: login uri is an array",
- grid[GRID_LOGIN_URI_VALUE].isArray());
- ensure_equals("Override custom grid helper uri: login uri is not changed",
- grid[GRID_LOGIN_URI_VALUE][0].asString(),
- std::string("https://mycustomgridchoice/cgi-bin/login.cgi"));
- ensure_equals("Override custom grid helper uri: helper uri is changed",
- grid[GRID_HELPER_URI_VALUE].asString(),
- std::string("https://my.helper.uri/mycustomhelpers"));
- ensure_equals("Override custom grid helper uri: login page is not changed",
- grid[GRID_LOGIN_PAGE_VALUE].asString(),
- std::string("http://mycustomgridchoice/app/login/"));
- }
-
- // validate overriding of login page via cmd line
- template<> template<>
- void viewerNetworkTestObject::test<6>()
- {
- // Override with login page
- // override known grid
- LLSD grid;
- gCmdLineGridChoice = "Aditi";
- gCmdLineHelperURI = "";
- gLoginPage = "myloginpage";
- LLGridManager::getInstance()->initialize("grid_test.xml");
- std::map<std::string, std::string> known_grids = LLGridManager::getInstance()->getKnownGrids();
- ensure_equals("Override known grid login page: No grids are added",
- known_grids.size(), 23);
- LLGridManager::getInstance()->getGridInfo(grid);
- ensure("Override known grid login page: Command line grid login uri is an array",
- grid[GRID_LOGIN_URI_VALUE].isArray());
- ensure_equals("Override known grid login page: login uri is not changed",
- grid[GRID_LOGIN_URI_VALUE][0].asString(),
+ ensure("Agni is a system grid",
+ LLGridManager::getInstance()->isSystemGrid("util.agni.lindenlab.com"));
+
+ ensure_equals("name for aditi",
+ LLGridManager::getInstance()->getGrid("util.aditi.lindenlab.com"),
+ std::string("util.aditi.lindenlab.com"));
+ ensure_equals("id for aditi",
+ LLGridManager::getInstance()->getGridId("util.aditi.lindenlab.com"),
+ std::string("Aditi"));
+ ensure_equals("label for aditi",
+ LLGridManager::getInstance()->getGridLabel("util.aditi.lindenlab.com"),
+ std::string("Second Life Beta Test Grid (Aditi)"));
+
+ LLGridManager::getInstance()->getLoginURIs(std::string("util.aditi.lindenlab.com"), login_uris);
+ ensure_equals("Number of login uris for aditi", 1, login_uris.size());
+ ensure_equals("Aditi login uri",
+ login_uris[0],
std::string("https://login.aditi.lindenlab.com/cgi-bin/login.cgi"));
- ensure_equals("Override known grid login page: helper uri is not changed",
- grid[GRID_HELPER_URI_VALUE].asString(),
+ ensure_equals("Aditi helper uri",
+ LLGridManager::getInstance()->getHelperURI("util.aditi.lindenlab.com"),
std::string("http://aditi-secondlife.webdev.lindenlab.com/helpers/"));
- ensure_equals("Override known grid login page: login page is changed",
- grid[GRID_LOGIN_PAGE_VALUE].asString(),
- std::string("myloginpage"));
-
- // Override with login page
- // override custom grid
- gCmdLineGridChoice = "mycustomgridchoice";
- gLoginPage = "myloginpage";
- LLGridManager::getInstance()->initialize("grid_test.xml");
- known_grids = LLGridManager::getInstance()->getKnownGrids();
- ensure_equals("Override custom grid login page: grids are added",
- known_grids.size(), 24);
- LLGridManager::getInstance()->getGridInfo(grid);
- ensure("Override custom grid login page: Command line grid login uri is an array",
- grid[GRID_LOGIN_URI_VALUE].isArray());
- ensure_equals("Override custom grid login page: login uri is not changed",
- grid[GRID_LOGIN_URI_VALUE][0].asString(),
- std::string("https://mycustomgridchoice/cgi-bin/login.cgi"));
- ensure_equals("Override custom grid login page: helper uri is not changed",
- grid[GRID_HELPER_URI_VALUE].asString(),
- std::string("https://mycustomgridchoice/helpers/"));
- ensure_equals("Override custom grid login page: login page is changed",
- grid[GRID_LOGIN_PAGE_VALUE].asString(),
- std::string("myloginpage"));
-
+ ensure_equals("Aditi login page",
+ LLGridManager::getInstance()->getLoginPage("util.aditi.lindenlab.com"),
+ std::string("http://viewer-login.agni.lindenlab.com/"));
+ ensure("Aditi is a system grid",
+ LLGridManager::getInstance()->isSystemGrid("util.aditi.lindenlab.com"));
+
+ // Check the additional grid from the file
+ ensure_equals("alternative grid is in name<->label map",
+ known_grids["altgrid.long.name"],
+ std::string("Alternative Grid"));
+ ensure_equals("alternative grid name is set",
+ LLGridManager::getInstance()->getGrid("altgrid.long.name"),
+ std::string("altgrid.long.name"));
+ ensure_equals("alternative grid id",
+ LLGridManager::getInstance()->getGridId("altgrid.long.name"),
+ std::string("AltGrid"));
+ ensure_equals("alternative grid label",
+ LLGridManager::getInstance()->getGridLabel("altgrid.long.name"),
+ std::string("Alternative Grid"));
+ std::vector<std::string> alt_login_uris;
+ LLGridManager::getInstance()->getLoginURIs(std::string("altgrid.long.name"), alt_login_uris);
+ ensure_equals("Number of login uris for altgrid", 2, alt_login_uris.size());
+ ensure_equals("alternative grid first login uri",
+ alt_login_uris[0],
+ std::string("altgrid/myloginuri1"));
+ ensure_equals("alternative grid second login uri",
+ alt_login_uris[1],
+ std::string("altgrid/myloginuri2"));
+ ensure_equals("alternative grid helper uri",
+ LLGridManager::getInstance()->getHelperURI("altgrid.long.name"),
+ std::string("https://helper1/helpers/"));
+ ensure_equals("alternative grid login page",
+ LLGridManager::getInstance()->getLoginPage("altgrid.long.name"),
+ std::string("altgrid/loginpage"));
+ ensure("alternative grid is NOT a system grid",
+ ! LLGridManager::getInstance()->isSystemGrid("altgrid.long.name"));
+
+ ensure_equals("minimal grid is in name<->label map",
+ known_grids["minimal.long.name"],
+ std::string("minimal.long.name"));
+ ensure_equals("minimal grid name is set",
+ LLGridManager::getInstance()->getGrid("minimal.long.name"),
+ std::string("minimal.long.name"));
+ ensure_equals("minimal grid id",
+ LLGridManager::getInstance()->getGridId("minimal.long.name"),
+ std::string("minimal.long.name"));
+ ensure_equals("minimal grid label",
+ LLGridManager::getInstance()->getGridLabel("minimal.long.name"),
+ std::string("minimal.long.name"));
+
+ LLGridManager::getInstance()->getLoginURIs(std::string("minimal.long.name"), alt_login_uris);
+ ensure_equals("Number of login uris for altgrid", 1, alt_login_uris.size());
+ ensure_equals("minimal grid login uri",
+ alt_login_uris[0],
+ std::string("https://minimal.long.name/cgi-bin/login.cgi"));
+ ensure_equals("minimal grid helper uri",
+ LLGridManager::getInstance()->getHelperURI("minimal.long.name"),
+ std::string("https://minimal.long.name/helpers/"));
+ ensure_equals("minimal grid login page",
+ LLGridManager::getInstance()->getLoginPage("minimal.long.name"),
+ std::string("http://minimal.long.name/app/login/"));
+
}
-
+
+
// validate grid selection
template<> template<>
void viewerNetworkTestObject::test<7>()
- {
- LLSD loginURI = LLSD::emptyArray();
- LLSD grid = LLSD::emptyMap();
+ {
// adding a grid with simply a name will populate the values.
- grid[GRID_VALUE] = "myaddedgrid";
+ llofstream gridfile("grid_test.xml");
+ gridfile << gSampleGridFile;
+ gridfile.close();
LLGridManager::getInstance()->initialize("grid_test.xml");
- LLGridManager::getInstance()->addGrid(grid);
- LLGridManager::getInstance()->setGridChoice("util.agni.lindenlab.com");
- ensure_equals("getGridLabel", LLGridManager::getInstance()->getGridLabel(), std::string("Agni"));
- ensure_equals("getGrid", LLGridManager::getInstance()->getGrid(),
+
+ LLGridManager::getInstance()->setGridChoice("util.agni.lindenlab.com");
+ ensure_equals("getGridLabel",
+ LLGridManager::getInstance()->getGridLabel(),
+ std::string("Second Life Main Grid (Agni)"));
+ ensure_equals("getGridId",
+ LLGridManager::getInstance()->getGridId(),
+ std::string("Agni"));
+ ensure_equals("getGrid",
+ LLGridManager::getInstance()->getGrid(),
std::string("util.agni.lindenlab.com"));
- ensure_equals("getHelperURI", LLGridManager::getInstance()->getHelperURI(),
+ ensure_equals("getHelperURI",
+ LLGridManager::getInstance()->getHelperURI(),
std::string("https://secondlife.com/helpers/"));
- ensure_equals("getLoginPage", LLGridManager::getInstance()->getLoginPage(),
+ ensure_equals("getLoginPage",
+ LLGridManager::getInstance()->getLoginPage(),
std::string("http://viewer-login.agni.lindenlab.com/"));
- ensure_equals("getLoginPage2", LLGridManager::getInstance()->getLoginPage("util.agni.lindenlab.com"),
- std::string("http://viewer-login.agni.lindenlab.com/"));
- ensure("Is Agni a production grid", LLGridManager::getInstance()->isInProductionGrid());
+ ensure("Is Agni a production grid", LLGridManager::getInstance()->isInProductionGrid());
std::vector<std::string> uris;
LLGridManager::getInstance()->getLoginURIs(uris);
- ensure_equals("getLoginURIs size", uris.size(), 1);
- ensure_equals("getLoginURIs", uris[0],
+ ensure_equals("getLoginURIs size", 1, uris.size());
+ ensure_equals("getLoginURIs",
+ uris[0],
std::string("https://login.agni.lindenlab.com/cgi-bin/login.cgi"));
- LLGridManager::getInstance()->setGridChoice("myaddedgrid");
- ensure_equals("getGridLabel", LLGridManager::getInstance()->getGridLabel(), std::string("myaddedgrid"));
- ensure("Is myaddedgrid a production grid", !LLGridManager::getInstance()->isInProductionGrid());
-
- LLGridManager::getInstance()->setFavorite();
- LLGridManager::getInstance()->getGridInfo("myaddedgrid", grid);
- ensure("setting favorite", grid.has(GRID_IS_FAVORITE_VALUE));
- }
-
- // name based grid population
- template<> template<>
- void viewerNetworkTestObject::test<8>()
- {
- LLGridManager::getInstance()->initialize("grid_test.xml");
- LLSD grid = LLSD::emptyMap();
- // adding a grid with simply a name will populate the values.
- grid[GRID_VALUE] = "myaddedgrid";
- LLGridManager::getInstance()->addGrid(grid);
- LLGridManager::getInstance()->getGridInfo("myaddedgrid", grid);
-
- ensure_equals("name based grid has name value",
- grid[GRID_VALUE].asString(),
- std::string("myaddedgrid"));
- ensure_equals("name based grid has label value",
- grid[GRID_LABEL_VALUE].asString(),
- std::string("myaddedgrid"));
- ensure_equals("name based grid has name value",
- grid[GRID_HELPER_URI_VALUE].asString(),
- std::string("https://myaddedgrid/helpers/"));
- ensure_equals("name based grid has name value",
- grid[GRID_LOGIN_PAGE_VALUE].asString(),
- std::string("http://myaddedgrid/app/login/"));
- ensure("name based grid has array loginuri",
- grid[GRID_LOGIN_URI_VALUE].isArray());
- ensure_equals("name based grid has single login uri value",
- grid[GRID_LOGIN_URI_VALUE].size(), 1);
- ensure_equals("Name based grid login uri is correct",
- grid[GRID_LOGIN_URI_VALUE][0].asString(),
- std::string("https://myaddedgrid/cgi-bin/login.cgi"));
- ensure("name based grid is not a favorite yet",
- !grid.has(GRID_IS_FAVORITE_VALUE));
- ensure("name based grid does not have system setting",
- !grid.has(GRID_IS_SYSTEM_GRID_VALUE));
-
- llofstream gridfile("grid_test.xml");
- gridfile << gSampleGridFile;
- gridfile.close();
- }
-
- // persistence of the grid list with an empty gridfile.
- template<> template<>
- void viewerNetworkTestObject::test<9>()
- {
- // try with initial grid list without a grid file,
- // without setting the grid to a saveable favorite.
- LLGridManager::getInstance()->initialize("grid_test.xml");
- LLSD grid = LLSD::emptyMap();
- grid[GRID_VALUE] = std::string("mynewgridname");
- LLGridManager::getInstance()->addGrid(grid);
- LLGridManager::getInstance()->saveFavorites();
- ensure("Grid file exists after saving",
- LLFile::isfile("grid_test.xml"));
- LLGridManager::getInstance()->initialize("grid_test.xml");
- // should not be there
- std::map<std::string, std::string> known_grids = LLGridManager::getInstance()->getKnownGrids();
- ensure("New grid wasn't added to persisted list without being marked a favorite",
- known_grids.find(std::string("mynewgridname")) == known_grids.end());
-
- // mark a grid a favorite to make sure it's persisted
- LLGridManager::getInstance()->addGrid(grid);
- LLGridManager::getInstance()->setGridChoice("mynewgridname");
- LLGridManager::getInstance()->setFavorite();
- LLGridManager::getInstance()->saveFavorites();
- ensure("Grid file exists after saving",
- LLFile::isfile("grid_test.xml"));
- LLGridManager::getInstance()->initialize("grid_test.xml");
- // should not be there
- known_grids = LLGridManager::getInstance()->getKnownGrids();
- ensure("New grid wasn't added to persisted list after being marked a favorite",
- known_grids.find(std::string("mynewgridname")) !=
- known_grids.end());
- }
-
- // persistence of the grid file with existing gridfile
- template<> template<>
- void viewerNetworkTestObject::test<10>()
- {
-
- llofstream gridfile("grid_test.xml");
- gridfile << gSampleGridFile;
- gridfile.close();
-
- LLGridManager::getInstance()->initialize("grid_test.xml");
- LLSD grid = LLSD::emptyMap();
- grid[GRID_VALUE] = std::string("mynewgridname");
- LLGridManager::getInstance()->addGrid(grid);
- LLGridManager::getInstance()->saveFavorites();
- // validate we didn't lose existing favorites
- LLGridManager::getInstance()->initialize("grid_test.xml");
- std::map<std::string, std::string> known_grids = LLGridManager::getInstance()->getKnownGrids();
- ensure("New grid wasn't added to persisted list after being marked a favorite",
- known_grids.find(std::string("grid1")) !=
- known_grids.end());
-
- // add a grid
- LLGridManager::getInstance()->addGrid(grid);
- LLGridManager::getInstance()->setGridChoice("mynewgridname");
- LLGridManager::getInstance()->setFavorite();
- LLGridManager::getInstance()->saveFavorites();
- known_grids = LLGridManager::getInstance()->getKnownGrids();
- ensure("New grid wasn't added to persisted list after being marked a favorite",
- known_grids.find(std::string("grid1")) !=
- known_grids.end());
- known_grids = LLGridManager::getInstance()->getKnownGrids();
- ensure("New grid wasn't added to persisted list after being marked a favorite",
- known_grids.find(std::string("mynewgridname")) !=
- known_grids.end());
+
+ LLGridManager::getInstance()->setGridChoice("altgrid.long.name");
+ ensure_equals("getGridLabel",
+ LLGridManager::getInstance()->getGridLabel(),
+ std::string("Alternative Grid"));
+ ensure_equals("getGridId",
+ LLGridManager::getInstance()->getGridId(),
+ std::string("AltGrid"));
+ ensure("alternative grid is not a system grid",
+ !LLGridManager::getInstance()->isSystemGrid());
+ ensure("alternative grid is not a production grid",
+ !LLGridManager::getInstance()->isInProductionGrid());
}
+
}
diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py
index 36267803e3..d1c952ac3b 100644
--- a/indra/newview/viewer_manifest.py
+++ b/indra/newview/viewer_manifest.py
@@ -91,6 +91,13 @@ class ViewerManifest(LLManifest):
# ... and the entire windlight directory
self.path("windlight")
+
+ # ... and the included spell checking dictionaries
+ pkgdir = os.path.join(self.args['build'], os.pardir, 'packages')
+ if self.prefix(src=pkgdir,dst=""):
+ self.path("dictionaries")
+ self.end_prefix(pkgdir)
+
self.end_prefix("app_settings")
if self.prefix(src="character"):
@@ -393,6 +400,9 @@ class WindowsManifest(ViewerManifest):
self.path("ssleay32.dll")
self.path("libeay32.dll")
+ # Hunspell
+ self.path("libhunspell.dll")
+
# For google-perftools tcmalloc allocator.
try:
if self.args['configuration'].lower() == 'debug':
@@ -659,6 +669,7 @@ class DarwinManifest(ViewerManifest):
# copy additional libs in <bundle>/Contents/MacOS/
self.path("../packages/lib/release/libndofdev.dylib", dst="Resources/libndofdev.dylib")
+ self.path("../packages/lib/release/libhunspell-1.3.0.dylib", dst="Resources/libhunspell-1.3.0.dylib")
self.path("../viewer_components/updater/scripts/darwin/update_install", "MacOS/update_install")
@@ -1043,10 +1054,15 @@ class Linux_i686Manifest(LinuxManifest):
self.path("libopenjpeg.so*")
self.path("libdirectfb-1.4.so.5")
self.path("libfusion-1.4.so.5")
+ self.path("libdirect-1.4.so.5.0.4")
self.path("libdirect-1.4.so.5")
+ self.path("libhunspell-1.3.so")
+ self.path("libhunspell-1.3.so.0")
+ self.path("libhunspell-1.3.so.0.0.0")
self.path("libalut.so")
self.path("libopenal.so", "libopenal.so.1")
self.path("libopenal.so", "libvivoxoal.so.1") # vivox's sdk expects this soname
+
# KLUDGE: As of 2012-04-11, the 'fontconfig' package installs
# libfontconfig.so.1.4.4, along with symlinks libfontconfig.so.1
# and libfontconfig.so. Before we added support for library-file
diff --git a/indra/test/test.cpp b/indra/test/test.cpp
index 9d24383bcc..dc8580fe69 100644
--- a/indra/test/test.cpp
+++ b/indra/test/test.cpp
@@ -181,13 +181,16 @@ public:
virtual void run_started()
{
//std::cout << "run_started" << std::endl;
+ LL_INFOS("TestRunner")<<"Test Started"<< LL_ENDL;
}
virtual void group_started(const std::string& name) {
+ LL_INFOS("TestRunner")<<"Unit test group_started name=" << name << LL_ENDL;
*mStream << "Unit test group_started name=" << name << std::endl;
}
virtual void group_completed(const std::string& name) {
+ LL_INFOS("TestRunner")<<"Unit test group_completed name=" << name << LL_ENDL;
*mStream << "Unit test group_completed name=" << name << std::endl;
}
@@ -245,9 +248,11 @@ public:
if(!tr.message.empty())
{
*mStream << ": '" << tr.message << "'";
+ LL_WARNS("TestRunner") << "not ok : "<<tr.message << LL_ENDL;
}
*mStream << std::endl;
}
+ LL_INFOS("TestRunner")<<out.str()<<LL_ENDL;
}
virtual int getFailedTests() const { return mFailedTests; }
@@ -451,6 +456,13 @@ void stream_usage(std::ostream& s, const char* app)
s << "\tList all available test groups." << std::endl;
s << " " << app << " --group=uuid" << std::endl;
s << "\tRun the test group 'uuid'." << std::endl;
+
+ s << "\n\n"
+ << "In any event, logs are recorded in the build directory by appending\n"
+ << "the suffix '.log' to the full path name of this application.\n"
+ << "If no level is specified as described above, these log files are at\n"
+ << "DEBUG level.\n"
+ ;
}
void stream_groups(std::ostream& s, const char* app)
@@ -477,17 +489,24 @@ int main(int argc, char **argv)
#ifndef LL_WINDOWS
::testing::InitGoogleMock(&argc, argv);
#endif
- LLError::initForApplication(".");
- LLError::setFatalFunction(wouldHaveCrashed);
- LLError::setDefaultLevel(LLError::LEVEL_ERROR);
- // ^ possibly overridden by --debug, LOGTEST or LOGFAIL
-
// LOGTEST overrides default, but can be overridden by --debug or LOGFAIL.
const char* LOGTEST = getenv("LOGTEST");
if (LOGTEST)
{
+ LLError::initForApplication(".", true /* log to stderr */);
LLError::setDefaultLevel(LLError::decodeLevel(LOGTEST));
}
+ else
+ {
+ LLError::initForApplication(".", false /* do not log to stderr */);
+ LLError::setDefaultLevel(LLError::LEVEL_DEBUG);
+ }
+ LLError::setFatalFunction(wouldHaveCrashed);
+ LLError::setPrintLocation(true);
+ std::string test_app_name(argv[0]);
+ std::string test_log = test_app_name + ".log";
+ LLFile::remove(test_log);
+ LLError::logToFile(test_log);
#ifdef CTYPE_WORKAROUND
ctype_workaround();