diff options
588 files changed, 21135 insertions, 5844 deletions
@@ -72,35 +72,35 @@ b53a0576eec80614d7767ed72b40ed67aeff27c9 DRTVWR-38_2.5.2-release 461c8c65b5c799ddfe365422f9be9c0095d91e7d 2.6.0-beta1-tip 9e4641f4a7870c0f565a25a2971368d5a29516a1 2.6.0-beta2 9e4641f4a7870c0f565a25a2971368d5a29516a1 DRTVWR-41_2.6.0-beta2 +42f32494bac475d0737799346f6831558ae8bf5d 2.6.0-release +42f32494bac475d0737799346f6831558ae8bf5d DRTVWR-39_2.6.0-release c5bdef3aaa2744626aef3c217ce29e1900d357b3 2.6.1-beta1 c5bdef3aaa2744626aef3c217ce29e1900d357b3 2.6.1-start c5bdef3aaa2744626aef3c217ce29e1900d357b3 DRTVWR-43_2.6.1-beta1 +c9182ed77d427c759cfacf49a7b71a2e20d522aa 2.6.1-release +c9182ed77d427c759cfacf49a7b71a2e20d522aa DRTVWR-42_2.6.1-release 56b2778c743c2a964d82e1caf11084d76a87de2c 2.6.2-start d1203046bb653b763f835b04d184646949d8dd5c 2.6.2-beta1 d1203046bb653b763f835b04d184646949d8dd5c DRTVWR-45_2.6.2-beta1 -42f32494bac475d0737799346f6831558ae8bf5d 2.6.0-release -42f32494bac475d0737799346f6831558ae8bf5d DRTVWR-39_2.6.0-release -c9182ed77d427c759cfacf49a7b71a2e20d522aa 2.6.1-release -c9182ed77d427c759cfacf49a7b71a2e20d522aa DRTVWR-42_2.6.1-release +214180ad5714ce8392b82bbebcc92f4babd98300 2.6.2-release +214180ad5714ce8392b82bbebcc92f4babd98300 DRTVWR-44_2.6.2-release 52b2263ab28f0976c689fd0b76c55a9eb027cdbf end-of-develop.py ec32f1045e7c2644015245df3a9933620aa194b8 2.6.3-start d7fcefabdf32bb61a9ea6d6037c1bb26190a85bc 2.6.3-beta1 d7fcefabdf32bb61a9ea6d6037c1bb26190a85bc DRTVWR-47_2.6.3-beta1 0630e977504af5ea320c58d33cae4e1ddee793e9 2.6.3-beta2 0630e977504af5ea320c58d33cae4e1ddee793e9 DRTVWR-48_2.6.3-beta2 +8f2da1701c81a62352df2b8d413d27fb2cade9a6 2.6.3-release +8f2da1701c81a62352df2b8d413d27fb2cade9a6 DRTVWR-46_2.6.3-release 3178e311da3a8739a85363665006ea3c4610cad4 dons-headless-hackathon-work -214180ad5714ce8392b82bbebcc92f4babd98300 2.6.2-release -214180ad5714ce8392b82bbebcc92f4babd98300 DRTVWR-44_2.6.2-release 7db558aaa7c176f2022b3e9cfe38ac72f6d1fccd 2.6.5-beta1 7db558aaa7c176f2022b3e9cfe38ac72f6d1fccd DRTVWR-50_2.6.5-beta1 -8f2da1701c81a62352df2b8d413d27fb2cade9a6 2.6.3-release -8f2da1701c81a62352df2b8d413d27fb2cade9a6 DRTVWR-46_2.6.3-release 800cefce8d364ffdd2f383cbecb91294da3ea424 2.6.6-start bb1075286b3b147b1dae2e3d6b2d56f04ff03f35 2.6.6-beta1 bb1075286b3b147b1dae2e3d6b2d56f04ff03f35 DRTVWR-52_2.6.6-beta1 -5e349dbe9cc84ea5795af8aeb6d473a0af9d4953 2.6.8-start dac76a711da5f1489a01c1fa62ec97d99c25736d 2.6.6-release dac76a711da5f1489a01c1fa62ec97d99c25736d DRTVWR-51_2.6.6-release +5e349dbe9cc84ea5795af8aeb6d473a0af9d4953 2.6.8-start beafa8a9bd1d1b670b7523d865204dc4a4b38eef 2.6.8-beta1 beafa8a9bd1d1b670b7523d865204dc4a4b38eef DRTVWR-55_2.6.8-beta1 be2000b946f8cb3de5f44b2d419287d4c48ec4eb 2.6.8-release @@ -119,50 +119,50 @@ e67da2c6e3125966dd49eef98b36317afac1fcfe 2.6.9-start 9f79a6ed8fdcd2f3dac33ea6b3236eeb278dccfe 2.7.2-start e0dc8b741eaa27dcdfbc9e956bb2579b954d15eb 2.7.2-beta1 e0dc8b741eaa27dcdfbc9e956bb2579b954d15eb DRTVWR-63_2.7.2-beta1 -6a3e7e403bd19e45fdfc2fcc716867af3ab80861 2.7.3-start fe3a8e7973072ea62043c08b19b66626c1a720eb 2.7.1-release fe3a8e7973072ea62043c08b19b66626c1a720eb 2.7.2-release fe3a8e7973072ea62043c08b19b66626c1a720eb DRTVWR-60_2.7.1-release fe3a8e7973072ea62043c08b19b66626c1a720eb DRTVWR-62_2.7.2-release +6a3e7e403bd19e45fdfc2fcc716867af3ab80861 2.7.3-start 6af10678de4736222b2c3f7e010e984fb5b327de 2.7.4-start be963a4eef635542f9617d7f5fd22ba48fb71958 2.7.4-beta1 be963a4eef635542f9617d7f5fd22ba48fb71958 DRTVWR-67_2.7.4-beta1 +057f319dd8eccdf63a54d99686c68cdcb31b6abc 2.7.4-release +057f319dd8eccdf63a54d99686c68cdcb31b6abc DRTVWR-66_2.7.4-release 19a498fa62570f352d7d246f17e3c81cc1d82d8b 2.7.5-start 09984bfa6cae17e0f72d02b75c1b7393c65eecfc 2.7.5-beta1 09984bfa6cae17e0f72d02b75c1b7393c65eecfc DRTVWR-69_2.7.5-beta1 +6866d9df6efbd441c66451debd376d21211de39c 2.7.5-release +6866d9df6efbd441c66451debd376d21211de39c DRTVWR-68_2.7.5-release e1ed60913230dd64269a7f7fc52cbc6004f6d52c 2.8.0-beta1 e1ed60913230dd64269a7f7fc52cbc6004f6d52c 2.8.0-start e1ed60913230dd64269a7f7fc52cbc6004f6d52c DRTVWR-71_2.8.0-beta1 -057f319dd8eccdf63a54d99686c68cdcb31b6abc 2.7.4-release -057f319dd8eccdf63a54d99686c68cdcb31b6abc DRTVWR-66_2.7.4-release -6866d9df6efbd441c66451debd376d21211de39c 2.7.5-release -6866d9df6efbd441c66451debd376d21211de39c DRTVWR-68_2.7.5-release +493d9127ee50e84ba08a736a65a23ca86f7a5b01 2.8.0-release +493d9127ee50e84ba08a736a65a23ca86f7a5b01 DRTVWR-70_2.8.0-release 502f6a5deca9365ddae57db4f1e30172668e171e 2.8.1-start 2c7e459e0c883f8e406b932e41e60097e9ee077e 2.8.1-beta1 2c7e459e0c883f8e406b932e41e60097e9ee077e DRTVWR-73_2.8.1-beta1 -493d9127ee50e84ba08a736a65a23ca86f7a5b01 2.8.0-release -493d9127ee50e84ba08a736a65a23ca86f7a5b01 DRTVWR-70_2.8.0-release -54bc7823ad4e3a436fef79710f685a7372bbf795 2.8.2-start -ac0f1a132d35c02a58861d37cca75b0429ac9137 2.8.3-start 29e93d7e19991011bd12b5748142b11a5dcb4370 2.8.1-release 29e93d7e19991011bd12b5748142b11a5dcb4370 DRTVWR-72_2.8.1-release 4780e3bd2b3042f91be3426151f28c30d199bb3b 2.8.1-hotfix 4780e3bd2b3042f91be3426151f28c30d199bb3b DRTVWR-76_2.8.1-hotfix +54bc7823ad4e3a436fef79710f685a7372bbf795 2.8.2-start +ac0f1a132d35c02a58861d37cca75b0429ac9137 2.8.3-start 599677276b227357140dda35bea4a2c18e2e67b5 2.8.3-beta1 599677276b227357140dda35bea4a2c18e2e67b5 DRTVWR-75_2.8.3-beta1 +fb85792b84bf28428889c4cc966469d92e5dac4c 2.8.3-release +fb85792b84bf28428889c4cc966469d92e5dac4c DRTVWR-74_2.8.3-release 6b678ea52f90d5c14181661dcd2546e25bde483e 3.0.0-start b0be6ce3adfef3a014a2389d360539f8a86c5439 3.0.0-beta1 b0be6ce3adfef3a014a2389d360539f8a86c5439 DRTVWR-78_3.0.0-beta1 -fb85792b84bf28428889c4cc966469d92e5dac4c 2.8.3-release -fb85792b84bf28428889c4cc966469d92e5dac4c DRTVWR-74_2.8.3-release +1778f26b6d0ae762dec3ca37140f66620f2485d9 3.0.0-release +1778f26b6d0ae762dec3ca37140f66620f2485d9 DRTVWR-77_3.0.0-release 82a2079ffcb57ecb1b3849cb41376b443e1eb912 3.0.1-start 364fd63517fbacbbcb9129d096187171ba8c9e48 3.0.1-beta1 364fd63517fbacbbcb9129d096187171ba8c9e48 DRTVWR-81_3.0.1-beta1 f2412ecd6740803ea9452f1d17fd872e263a0df7 3.0.2-start 42784bf50fa01974bada2a1af3892ee09c93fcda 3.0.2-beta1 42784bf50fa01974bada2a1af3892ee09c93fcda DRTVWR-83_3.0.2-beta1 -1778f26b6d0ae762dec3ca37140f66620f2485d9 3.0.0-release -1778f26b6d0ae762dec3ca37140f66620f2485d9 DRTVWR-77_3.0.0-release e5c9af2d7980a99a71650be3a0cf7b2b3c3b897e 3.0.2-beta2 e5c9af2d7980a99a71650be3a0cf7b2b3c3b897e DRTVWR-86_3.0.2-beta2 b95ddac176ac944efdc85cbee94ac2e1eab44c79 3.0.3-start @@ -170,9 +170,9 @@ b95ddac176ac944efdc85cbee94ac2e1eab44c79 3.0.3-start 6694f3f062aa45f64ab391d25a3eb3d5eb1b0871 DRTVWR-85_3.0.3-beta1 61aa7974df089e8621fe9a4c69bcdefdb3cc208a 3.0.3-beta2 61aa7974df089e8621fe9a4c69bcdefdb3cc208a DRTVWR-89_3.0.3-beta2 -586907287be581817b2422b5137971b22d54ea48 3.0.4-start 0496d2f74043cf4e6058e76ac3db03d44cff42ce 3.0.3-release 0496d2f74043cf4e6058e76ac3db03d44cff42ce DRTVWR-84_3.0.3-release +586907287be581817b2422b5137971b22d54ea48 3.0.4-start 92a3aa04775438226399b19deee12ac3b5a62838 3.0.5-start c7282e59f374ee904bd793c3c444455e3399b0c5 3.1.0-start 2657fa785bbfac115852c41bd0adaff74c2ad5da 3.1.0-beta1 @@ -193,11 +193,11 @@ e440cd1dfbd128d7d5467019e497f7f803640ad6 DRTVWR-95_3.2.0-beta1 c4911ec8cd81e676dfd2af438b3e065407a94a7a 3.2.1-start 9e390d76807fa70d356b8716fb83b8ce42a629ef 3.2.1-beta1 9e390d76807fa70d356b8716fb83b8ce42a629ef DRTVWR-100_3.2.1-beta1 +a8c7030d6845186fac7c188be4323a0e887b4184 3.2.1-release +a8c7030d6845186fac7c188be4323a0e887b4184 DRTVWR-99_3.2.1-release 40b46edba007d15d0059c80864b708b99c1da368 3.2.2-start 523df3e67378541498d516d52af4402176a26bac 3.2.2-beta1 523df3e67378541498d516d52af4402176a26bac DRTVWR-102_3.2.2-beta1 -a8c7030d6845186fac7c188be4323a0e887b4184 3.2.1-release -a8c7030d6845186fac7c188be4323a0e887b4184 DRTVWR-99_3.2.1-release 80f3e30d8aa4d8f674a48bd742aaa6d8e9eae0b5 3.2.3-start 3fe994349fae64fc40874bb59db387131eb35a41 3.2.4-beta1 3fe994349fae64fc40874bb59db387131eb35a41 3.2.4-start @@ -279,6 +279,10 @@ a8057e1b9a1246b434a27405be35e030f7d28b0c 3.3.4-beta3 9cd174d3a54d93d409a7c346a15b8bfb40fc58f4 DRTVWR-184 ab2ffc547c8a8950ff187c4f6c95e5334fab597b 3.3.4-beta5 28e100d0379a2b0710c57647a28fc5239d3d7b99 3.3.4-release +6dfb0fba782c9233dd95f24ec48146db0d3f210b DRTVWR-199 +7c9102fb998885621919f2474a002c35b583539b 3.3.4-release2 +8c9085066c78ed5f6c9379dc054c82a6fcdb1851 DRTVWR-207 +351eea5f9dc192fc5ddea3b02958de97677a0a12 3.3.4-release3 005dfe5c4c377207d065fb27858d2eb0b53b143a DRTVWR-167 888768f162d2c0a8de1dcc5fb9a08bd8bd120a6b DRTVWR-175 a8b3eca451a9eaab59987efb0ab1c4217e3f2dcc DRTVWR-182 @@ -294,13 +298,9 @@ ae5c83dd61d2d37c45f1d5b8bf2b036d87599f1b DRTVWR-198 b1dbb1a83f48f93f6f878cff9e52d2cb635e145c 3.4.0-beta2 37402e2b19af970d51b0a814d79892cc5647532b DRTVWR-200 182a9bf30e81070361bb020a78003b1cf398e79c 3.4.0-beta3 -6dfb0fba782c9233dd95f24ec48146db0d3f210b DRTVWR-199 -7c9102fb998885621919f2474a002c35b583539b 3.3.4-release2 7649a3dff5ec22d3727377e5f02efd0f421e4cb5 DRTVWR-201 84fb70dfe3444e75a44fb4bee43e2fc8221cebdd 3.4.0-beta4 573e863be2f26d3687161def4b9fea9b7038dda8 3.4.0-beta5 -8c9085066c78ed5f6c9379dc054c82a6fcdb1851 DRTVWR-207 -351eea5f9dc192fc5ddea3b02958de97677a0a12 3.3.4-release3 af7b28e75bd5a629cd9e0dc46fb3f1757626f493 DRTVWR-212 015012c2b740ccdec8a8c3d6e5f898449ecfe0b8 DRTVWR-213 62b07aa81b1957897c3846292bb9412977b0af6c 3.3.4-beta6 @@ -434,9 +434,7 @@ fd6b510e83f56830e45670c428653134899d3e25 DRTVWR-305 902caf2b9fdbdbc5c399c4d5ebcecaf9cb97bab8 DRTVWR-306 5c6098fd17d40ee3a38ca6b64f6be9db7f61f0a8 3.5.0-beta7 adc360e6bf21390d2665380951d85937cd29a604 3.5.0-release -0ca3910763cec967703e45bc6208a325dccb9f95 3.5.1-beta1 1ada73295ed0eaa4a772ef079c29f57069342c32 DRTVWR-310 -0ca3910763cec967703e45bc6208a325dccb9f95 3.5.1-beta1 20cdf370f5c8be6193bef6fb3a81cc3f81275191 3.5.1-beta1 2319904200de367646b9a9442239a38d52c1eeb5 DRTVWR-313 9d8726eca785acad694564516f16dd639faf45c0 3.5.1-beta2 diff --git a/BuildParams b/BuildParams index c929c2d90d..f51aff96ba 100644 --- a/BuildParams +++ b/BuildParams @@ -64,7 +64,6 @@ viewer-release.build_debug_release_separately = true viewer-release.build_viewer_update_version_manager = true viewer-release.codeticket_add_context = false - # ======================================== # mesh-development # ======================================== @@ -133,6 +132,15 @@ viewer-pathfinding.build_CYGWIN_Debug = false viewer-pathfinding.build_viewer_update_version_manager = false # ======================================== +# viewer-materials +# ======================================== + +viewer-materials.viewer_channel = "Second Life Project Materials" +viewer-materials.login_channel = "Second Life Project Materials" +viewer-materials.build_debug_release_separately = true +viewer-materials.build_CYGWIN_Debug = false +viewer-materials.build_viewer_update_version_manager = false + # viewer-chui # # ======================================== @@ -207,3 +215,5 @@ runway.build_viewer_update_version_manager = false # eof + + diff --git a/autobuild.xml b/autobuild.xml index 80a44ec75d..712094d607 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -483,14 +483,14 @@ </map> </map> </map> - <key>fmod</key> + <key>fmodex</key> <map> <key>license</key> - <string>fmod</string> + <string>fmodex</string> <key>license_file</key> - <string>LICENSES/fmod.txt</string> + <string>LICENSES/fmodex.txt</string> <key>name</key> - <string>fmod</string> + <string>fmodex</string> <key>platforms</key> <map> <key>darwin</key> @@ -498,9 +498,9 @@ <key>archive</key> <map> <key>hash</key> - <string>61ead113e6479452e6b690c84b4e9d30</string> + <string>10352aab979c333a52dbad21b6e6fba9</string> <key>url</key> - <string>http://s3-proxy.lindenlab.com/private-builds-secondlife-com/hg/repo/3p-fmod-private/rev/221852/arch/Darwin/installer/fmod-3.75-darwin-20110222.tar.bz2</string> + <string>http://s3-proxy.lindenlab.com/private-builds-secondlife-com/hg/repo/3p-fmodex-private/rev/274403/arch/Darwin/installer/fmodex-4.44-darwin-20130419.tar.bz2</string> </map> <key>name</key> <string>darwin</string> @@ -510,9 +510,9 @@ <key>archive</key> <map> <key>hash</key> - <string>0c61d643db54d2e5999be8254569d8b3</string> + <string>79e45527aa9fb90b813599dff5ce01a7</string> <key>url</key> - <string>http://s3-proxy.lindenlab.com/private-builds-secondlife-com/hg/repo/3p-fmod-private/rev/221852/arch/Linux/installer/fmod-3.75-linux-20110223.tar.bz2</string> + <string>http://s3-proxy.lindenlab.com/private-builds-secondlife-com/hg/repo/3p-fmodex-private/rev/274378/arch/Linux/installer/fmodex-4.44-linux-20130419.tar.bz2</string> </map> <key>name</key> <string>linux</string> @@ -522,9 +522,9 @@ <key>archive</key> <map> <key>hash</key> - <string>d9a9a6ad86895353bcd63374a4c1a91d</string> + <string>0980cdf98a322a780ba739e324d0b955</string> <key>url</key> - <string>http://s3-proxy.lindenlab.com/private-builds-secondlife-com/hg/repo/3p-fmod-private/rev/221852/arch/CYGWIN/installer/fmod-3.75-windows-20110222.tar.bz2</string> + <string>http://s3-proxy.lindenlab.com/private-builds-secondlife-com/hg/repo/3p-fmodex-private/rev/274401/arch/CYGWIN/installer/fmodex-4.44-windows-20130419.tar.bz2</string> </map> <key>name</key> <string>windows</string> @@ -606,9 +606,9 @@ <key>archive</key> <map> <key>hash</key> - <string>ca95bbdabd2bed612af79a3704fdbe79</string> + <string>bd6f84f9fb3c2e68850676d06935373f</string> <key>url</key> - <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-freetype/rev/265843/arch/Linux/installer/freetype-2.3.9-linux-20121013.tar.bz2</string> + <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-freetype/rev/271684/arch/Linux/installer/freetype-2.4.4-linux-20130312.tar.bz2</string> </map> <key>name</key> <string>linux</string> @@ -761,10 +761,10 @@ <map> <key>archive</key> <map> - <key>hash</key> - <string>21babc394dbf8572830f2e85adec7b9f</string> - <key>url</key> - <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/google_breakpad-0.0.0-rev599-darwin-20110202.tar.bz2</string> + <key>hash</key> + <string>aff5566e04003de0383941981198e04e</string> + <key>url</key> + <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-google-breakpad/rev/273073/arch/Darwin/installer/google_breakpad-0.0.0-rev1099-darwin-20130329.tar.bz2</string> </map> <key>name</key> <string>darwin</string> @@ -773,10 +773,10 @@ <map> <key>archive</key> <map> - <key>hash</key> - <string>204b02a9480c411232255798839431a2</string> - <key>url</key> - <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/google_breakpad-0.0.0-rev599-linux-20110311.tar.bz2</string> + <key>hash</key> + <string>52257e5eb166a0b69c9c0c38f6e1920e</string> + <key>url</key> + <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-google-breakpad/rev/273079/arch/Linux/installer/google_breakpad-0.0.0-rev1099-linux-20130329.tar.bz2</string> </map> <key>name</key> <string>linux</string> @@ -786,9 +786,9 @@ <key>archive</key> <map> <key>hash</key> - <string>627c51136e14e64c5d39933f3abd3bdf</string> + <string>d812a6dfcabe6528198a3191068dac09</string> <key>url</key> - <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/google_breakpad-0.0.0-rev599-windows-20110218.tar.bz2</string> + <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-google-breakpad/rev/273073/arch/CYGWIN/installer/google_breakpad-0.0.0-rev1099-windows-20130329.tar.bz2</string> </map> <key>name</key> <string>windows</string> @@ -834,9 +834,45 @@ <key>archive</key> <map> <key>hash</key> - <string>212701468920519f3989677cea9ca4f1</string> + <string>d2542614df9dd99cbb5ff67e76d4a6c1</string> <key>url</key> - <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/gmock-1.5.0-windows-20110224.tar.bz2</string> + <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-google-mock/rev/274899/arch/CYGWIN/installer/gmock-1.6.0-windows-20130426.tar.bz2</string> + </map> + <key>name</key> + <string>windows</string> + </map> + </map> + </map> + <key>gperftools</key> + <map> + <key>license</key> + <string>bsd</string> + <key>license_file</key> + <string>LICENSES/gperftools.txt</string> + <key>name</key> + <string>gperftools</string> + <key>platforms</key> + <map> + <key>linux</key> + <map> + <key>archive</key> + <map> + <key>hash</key> + <string>8aedfdcf670348c18a9991ae1b384a61</string> + <key>url</key> + <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-google-perftools/rev/262672/arch/Linux/installer/gperftools-2.0-linux-20120727.tar.bz2</string> + </map> + <key>name</key> + <string>linux</string> + </map> + <key>windows</key> + <map> + <key>archive</key> + <map> + <key>hash</key> + <string>f62841804acb91e1309603a84f3f0ce8</string> + <key>url</key> + <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-google-perftools/rev/262672/arch/CYGWIN/installer/gperftools-2.0-windows-20120727.tar.bz2</string> </map> <key>name</key> <string>windows</string> @@ -2531,8 +2567,7 @@ <string>"Visual Studio 10"</string> <string>-DUNATTENDED:BOOL=ON</string> <string>-DUSE_KDU=FALSE</string> - <string>-DFMOD=FALSE</string> - </array> + </array> </map> <key>name</key> <string>DebugOS</string> @@ -2620,8 +2655,7 @@ <string>-DUNATTENDED:BOOL=ON</string> <string>-DINSTALL_PROPRIETARY=FALSE</string> <string>-DUSE_KDU=FALSE</string> - <string>-DFMOD=FALSE</string> - </array> + </array> </map> <key>name</key> <string>RelWithDebInfoOS</string> @@ -2708,8 +2742,7 @@ <string>-DUNATTENDED:BOOL=ON</string> <string>-DINSTALL_PROPRIETARY=FALSE</string> <string>-DUSE_KDU=FALSE</string> - <string>-DFMOD=FALSE</string> - </array> + </array> </map> <key>name</key> <string>ReleaseOS</string> diff --git a/doc/contributions.txt b/doc/contributions.txt index d7f050a916..33cf0a422e 100644 --- a/doc/contributions.txt +++ b/doc/contributions.txt @@ -647,6 +647,7 @@ Jonathan Yap STORM-1872 STORM-1858 STORM-1862 + OPEN-161 Kadah Coba STORM-1060 STORM-1843 @@ -1168,6 +1169,7 @@ Techwolf Lupindo SNOW-746 VWR-12385 VWR-20893 + OPEN-161 Templar Merlin tenebrous pau VWR-247 diff --git a/indra/cmake/CMakeLists.txt b/indra/cmake/CMakeLists.txt index a21fa90950..111f5897dd 100644 --- a/indra/cmake/CMakeLists.txt +++ b/indra/cmake/CMakeLists.txt @@ -29,7 +29,7 @@ set(cmake_SOURCE_FILES FindAutobuild.cmake FindBerkeleyDB.cmake FindCARes.cmake - FindFMOD.cmake + FindFMODEX.cmake FindGLH.cmake FindGoogleBreakpad.cmake FindGooglePerfTools.cmake @@ -40,6 +40,7 @@ set(cmake_SOURCE_FILES FindSCP.cmake FindXmlRpcEpi.cmake FindZLIB.cmake + FMODEX.cmake FreeType.cmake GLEXT.cmake GLH.cmake diff --git a/indra/cmake/Copy3rdPartyLibs.cmake b/indra/cmake/Copy3rdPartyLibs.cmake index 338da4743e..a03c1a4281 100644 --- a/indra/cmake/Copy3rdPartyLibs.cmake +++ b/indra/cmake/Copy3rdPartyLibs.cmake @@ -62,10 +62,9 @@ if(WINDOWS) set(release_files ${release_files} libtcmalloc_minimal.dll) endif(USE_TCMALLOC) - if (FMOD) - set(debug_files ${debug_files} fmod.dll) - set(release_files ${release_files} fmod.dll) - endif (FMOD) + if (FMODEX) + set(release_files ${release_files} fmodex.dll) + endif (FMODEX) #******************************* # Copy MS C runtime dlls, required for packaging. @@ -260,7 +259,6 @@ elseif(LINUX) libboost_filesystem-mt.so.${BOOST_VERSION}.0 libboost_signals-mt.so.${BOOST_VERSION}.0 libboost_system-mt.so.${BOOST_VERSION}.0 - libbreakpad_client.so.0 libcollada14dom.so libcrypto.so.1.0.0 libdb-5.1.so @@ -288,9 +286,9 @@ elseif(LINUX) set(release_files ${release_files} "libtcmalloc_minimal.so") endif (USE_TCMALLOC) - if (FMOD) - set(release_files ${release_files} "libfmod-3.75.so") - endif (FMOD) + if (FMODEX) + set(release_file ${release_files} "libfmodex.so") + endif (FMODEX) else(WINDOWS) message(STATUS "WARNING: unrecognized platform for staging 3rd party libs, skipping...") @@ -305,8 +303,6 @@ else(WINDOWS) set(release_src_dir "${CMAKE_SOURCE_DIR}/../libraries/i686-linux/lib/release") set(release_files "") - set(fmod_files "") - set(debug_llkdu_src "") set(debug_llkdu_dst "") set(release_llkdu_src "") diff --git a/indra/cmake/FMODEX.cmake b/indra/cmake/FMODEX.cmake new file mode 100644 index 0000000000..65bc1cabeb --- /dev/null +++ b/indra/cmake/FMODEX.cmake @@ -0,0 +1,46 @@ +# -*- cmake -*- + +# FMOD can be set when launching the make using the argument -DFMOD:BOOL=ON +# When building using proprietary binaries though (i.e. having access to LL private servers), +# we always build with FMODEX. +# Open source devs should use the -DFMODEX:BOOL=ON then if they want to build with FMOD, whether +# they are using STANDALONE or not. +if (INSTALL_PROPRIETARY) + set(FMODEX ON CACHE BOOL "Using FMOD Ex sound library.") +endif (INSTALL_PROPRIETARY) + +if (FMODEX) + if (STANDALONE) + # In that case, we use the version of the library installed on the system + set(FMODEX_FIND_REQUIRED ON) + include(FindFMODEX) + else (STANDALONE) + if (FMODEX_LIBRARY AND FMODEX_INCLUDE_DIR) + # If the path have been specified in the arguments, use that + set(FMODEX_LIBRARIES ${FMODEX_LIBRARY}) + MESSAGE(STATUS "Using FMODEX path: ${FMODEX_LIBRARIES}, ${FMODEX_INCLUDE_DIR}") + else (FMODEX_LIBRARY AND FMODEX_INCLUDE_DIR) + # If not, we're going to try to get the package listed in autobuild.xml + # Note: if you're not using INSTALL_PROPRIETARY, the package URL should be local (file:/// URL) + # as accessing the private LL location will fail if you don't have the credential + include(Prebuilt) + use_prebuilt_binary(fmodex) + if (WINDOWS) + set(FMODEX_LIBRARY + debug fmodexL_vc + optimized fmodex_vc) + elseif (DARWIN) + set(FMODEX_LIBRARY + debug fmodexL + optimized fmodex) + elseif (LINUX) + set(FMODEX_LIBRARY + debug fmodexL + optimized fmodex) + endif (WINDOWS) + set(FMODEX_LIBRARIES ${FMODEX_LIBRARY}) + set(FMODEX_INCLUDE_DIR ${LIBS_PREBUILT_DIR}/include/fmodex) + endif (FMODEX_LIBRARY AND FMODEX_INCLUDE_DIR) + endif (STANDALONE) +endif (FMODEX) + diff --git a/indra/cmake/FindFMODEX.cmake b/indra/cmake/FindFMODEX.cmake new file mode 100644 index 0000000000..b621727c0e --- /dev/null +++ b/indra/cmake/FindFMODEX.cmake @@ -0,0 +1,65 @@ +# -*- cmake -*- + +# - Find FMODEX +# Find the FMODEX includes and library +# This module defines +# FMODEX_INCLUDE_DIR, where to find fmod.h and fmod_errors.h +# FMODEX_LIBRARIES, the libraries needed to use FMODEX. +# FMODEX, If false, do not try to use FMODEX. +# also defined, but not for general use are +# FMODEX_LIBRARY, where to find the FMODEX library. + +FIND_PATH(FMODEX_INCLUDE_DIR fmod.h PATH_SUFFIXES fmod) + +SET(FMODEX_NAMES ${FMODEX_NAMES} fmodex fmodvc fmodexL_vc) +FIND_LIBRARY(FMODEX_LIBRARY + NAMES ${FMODEX_NAMES} + PATH_SUFFIXES fmodex + ) + +IF (FMODEX_SDK_DIR OR WINDOWS) + if(WINDOWS) + set(FMODEX_SDK_DIR "$ENV{PROGRAMFILES}/FMOD SoundSystem/FMOD Programmers API Windows" CACHE PATH "Path to FMODEX") + STRING(REGEX REPLACE "\\\\" "/" FMODEX_SDK_DIR ${FMODEX_SDK_DIR}) + endif(WINDOWS) + find_library(FMODEX_LIBRARY + fmodex_vc fmodexL_vc + PATHS + ${FMODEX_SDK_DIR}/api/lib + ${FMODEX_SDK_DIR}/api + ${FMODEX_SDK_DIR} + ) + find_path(FMODEX_INCLUDE_DIR fmod.h + ${FMODEX_SDK_DIR}/api/inc + ${FMODEX_SDK_DIR}/api + ${FMODEX_SDK_DIR} + ) + find_path(FMODEX_INCLUDE_DIR fmod.h + ${FMODEX_SDK_DIR}/api/inc + ${FMODEX_SDK_DIR}/api + ${FMODEX_SDK_DIR} + ) + IF (FMODEX_LIBRARY AND FMODEX_INCLUDE_DIR) + SET(FMODEX_LIBRARIES ${FMODEX_LIBRARY}) + SET(FMODEX_FOUND "YES") + endif (FMODEX_LIBRARY AND FMODEX_INCLUDE_DIR) +ENDIF (FMODEX_SDK_DIR OR WINDOWS) + +IF (FMODEX_FOUND) + IF (NOT FMODEX_FIND_QUIETLY) + MESSAGE(STATUS "Found FMODEX: ${FMODEX_LIBRARIES}") + ENDIF (NOT FMODEX_FIND_QUIETLY) +ELSE (FMODEX_FOUND) + IF (FMODEX_FIND_REQUIRED) + MESSAGE(FATAL_ERROR "Could not find FMODEX library") + ENDIF (FMODEX_FIND_REQUIRED) +ENDIF (FMODEX_FOUND) + +# Deprecated declarations. +SET (NATIVE_FMODEX_INCLUDE_PATH ${FMODEX_INCLUDE_DIR} ) +GET_FILENAME_COMPONENT (NATIVE_FMODEX_LIB_PATH ${FMODEX_LIBRARY} PATH) + +MARK_AS_ADVANCED( + FMODEX_LIBRARY + FMODEX_INCLUDE_DIR + ) diff --git a/indra/cmake/FreeType.cmake b/indra/cmake/FreeType.cmake index 43a9d282d0..c9a90a9a8d 100644 --- a/indra/cmake/FreeType.cmake +++ b/indra/cmake/FreeType.cmake @@ -7,13 +7,7 @@ if (STANDALONE) pkg_check_modules(FREETYPE REQUIRED freetype2) else (STANDALONE) use_prebuilt_binary(freetype) - if (LINUX) - set(FREETYPE_INCLUDE_DIRS - ${LIBS_PREBUILT_DIR}/include) - else (LINUX) - set(FREETYPE_INCLUDE_DIRS ${LIBS_PREBUILT_DIR}/include) - endif (LINUX) - + set(FREETYPE_INCLUDE_DIRS ${LIBS_PREBUILT_DIR}/include) set(FREETYPE_LIBRARIES freetype) endif (STANDALONE) diff --git a/indra/cmake/GoogleBreakpad.cmake b/indra/cmake/GoogleBreakpad.cmake index 7498674042..96e22791ec 100644 --- a/indra/cmake/GoogleBreakpad.cmake +++ b/indra/cmake/GoogleBreakpad.cmake @@ -15,5 +15,8 @@ else (STANDALONE) if (WINDOWS) set(BREAKPAD_EXCEPTION_HANDLER_LIBRARIES exception_handler crash_generation_client common) endif (WINDOWS) + # yes, this does look dumb, no, it's not incorrect + # + set(BREAKPAD_INCLUDE_DIRECTORIES "${LIBS_PREBUILT_DIR}/include/google_breakpad" "${LIBS_PREBUILT_DIR}/include/google_breakpad/google_breakpad") endif (STANDALONE) diff --git a/indra/cmake/LLPrimitive.cmake b/indra/cmake/LLPrimitive.cmake index ab39cbb6be..0d87ff579a 100644 --- a/indra/cmake/LLPrimitive.cmake +++ b/indra/cmake/LLPrimitive.cmake @@ -2,6 +2,8 @@ # these should be moved to their own cmake file include(Prebuilt) +include(Boost) + use_prebuilt_binary(colladadom) use_prebuilt_binary(pcre) use_prebuilt_binary(libxml) @@ -15,10 +17,7 @@ if (WINDOWS) optimized llprimitive debug libcollada14dom22-d optimized libcollada14dom22 - debug libboost_filesystem-mt-gd - optimized libboost_filesystem-mt - debug libboost_system-mt-gd - optimized libboost_system-mt + ${BOOST_SYSTEM_LIBRARIES} ) else (WINDOWS) set(LLPRIMITIVE_LIBRARIES diff --git a/indra/linux_crash_logger/CMakeLists.txt b/indra/linux_crash_logger/CMakeLists.txt index e0d0c9fc69..c0fc1b2be0 100644 --- a/indra/linux_crash_logger/CMakeLists.txt +++ b/indra/linux_crash_logger/CMakeLists.txt @@ -12,6 +12,7 @@ include(LLVFS) include(LLXML) include(Linking) include(UI) +include(FreeType) include_directories( ${LLCOMMON_INCLUDE_DIRS} @@ -19,6 +20,11 @@ include_directories( ${LLMATH_INCLUDE_DIRS} ${LLVFS_INCLUDE_DIRS} ${LLXML_INCLUDE_DIRS} + ${FREETYPE_INCLUDE_DIRS} + ) +include_directories(SYSTEM + ${LLCOMMON_SYSTEM_INCLUDE_DIRS} + ${LLXML_SYSTEM_INCLUDE_DIRS} ) include_directories(SYSTEM ${LLCOMMON_SYSTEM_INCLUDE_DIRS} @@ -57,6 +63,7 @@ target_link_libraries(linux-crash-logger ${LLCOMMON_LIBRARIES} ${UI_LIBRARIES} ${DB_LIBRARIES} + ${FREETYPE_LIBRARIES} ) add_custom_target(linux-crash-logger-target ALL diff --git a/indra/llaudio/CMakeLists.txt b/indra/llaudio/CMakeLists.txt index 24d2531106..1b2bdb9888 100644 --- a/indra/llaudio/CMakeLists.txt +++ b/indra/llaudio/CMakeLists.txt @@ -5,7 +5,7 @@ project(llaudio) include(00-Common) include(Audio) include(LLAudio) -include(FMOD) +include(FMODEX) include(OPENAL) include(LLCommon) include(LLMath) @@ -24,7 +24,6 @@ include_directories( ${VORBIS_INCLUDE_DIRS} ${OPENAL_LIB_INCLUDE_DIRS} ${FREEAULT_LIB_INCLUDE_DIRS} - ${FMOD_INCLUDE_DIR} ) set(llaudio_SOURCE_FILES @@ -44,29 +43,22 @@ set(llaudio_HEADER_FILES llwindgen.h ) -if (FMOD) +if (FMODEX) include_directories( - ${FMOD_INCLUDE_DIR} + ${FMODEX_INCLUDE_DIR} ) - list(APPEND llaudio_SOURCE_FILES - llaudioengine_fmod.cpp - lllistener_fmod.cpp - llstreamingaudio_fmod.cpp + llaudioengine_fmodex.cpp + lllistener_fmodex.cpp + llstreamingaudio_fmodex.cpp ) list(APPEND llaudio_HEADER_FILES - llaudioengine_fmod.h - lllistener_fmod.h - llstreamingaudio_fmod.h + llaudioengine_fmodex.h + lllistener_fmodex.h + llstreamingaudio_fmodex.h ) - - if (LINUX OR DARWIN) - set_source_files_properties(llaudioengine_fmod.cpp - llstreamingaudio_fmod.cpp - COMPILE_FLAGS -Wno-write-strings) - endif (LINUX OR DARWIN) -endif (FMOD) +endif (FMODEX) if (OPENAL) list(APPEND llaudio_SOURCE_FILES diff --git a/indra/llaudio/llaudioengine.h b/indra/llaudio/llaudioengine.h index 99b96c3c38..da1629a1db 100644 --- a/indra/llaudio/llaudioengine.h +++ b/indra/llaudio/llaudioengine.h @@ -42,7 +42,6 @@ #include "lllistener.h" const F32 LL_WIND_UPDATE_INTERVAL = 0.1f; -const F32 LL_ROLLOFF_MULTIPLIER_UNDER_WATER = 5.f; // How much sounds are weaker under water const F32 LL_WIND_UNDERWATER_CENTER_FREQ = 20.f; const F32 ATTACHED_OBJECT_TIMEOUT = 5.0f; diff --git a/indra/llaudio/llaudioengine_fmod.cpp b/indra/llaudio/llaudioengine_fmod.cpp deleted file mode 100644 index a40de9fa68..0000000000 --- a/indra/llaudio/llaudioengine_fmod.cpp +++ /dev/null @@ -1,781 +0,0 @@ -/** - * @file audioengine_fmod.cpp - * @brief Implementation of LLAudioEngine class abstracting the audio support as a FMOD 3D implementation - * - * $LicenseInfo:firstyear=2002&license=viewerlgpl$ - * Second Life Viewer Source Code - * Copyright (C) 2010, Linden Research, Inc. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; - * version 2.1 of the License only. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - * - * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA - * $/LicenseInfo$ - */ - -#include "linden_common.h" - -#include "llstreamingaudio.h" -#include "llstreamingaudio_fmod.h" - -#include "llaudioengine_fmod.h" -#include "lllistener_fmod.h" - -#include "llerror.h" -#include "llmath.h" -#include "llrand.h" - -#include "fmod.h" -#include "fmod_errors.h" -#include "lldir.h" -#include "llapr.h" - -#include "sound_ids.h" - - -extern "C" { - void * F_CALLBACKAPI windCallback(void *originalbuffer, void *newbuffer, int length, void* userdata); -} - - -LLAudioEngine_FMOD::LLAudioEngine_FMOD() -{ - mInited = false; - mWindGen = NULL; - mWindDSP = NULL; -} - - -LLAudioEngine_FMOD::~LLAudioEngine_FMOD() -{ -} - - -bool LLAudioEngine_FMOD::init(const S32 num_channels, void* userdata) -{ - LLAudioEngine::init(num_channels, userdata); - - // Reserve one extra channel for the http stream. - if (!FSOUND_SetMinHardwareChannels(num_channels + 1)) - { - LL_WARNS("AppInit") << "FMOD::init[0](), error: " << FMOD_ErrorString(FSOUND_GetError()) << LL_ENDL; - } - - LL_DEBUGS("AppInit") << "LLAudioEngine_FMOD::init() initializing FMOD" << LL_ENDL; - - F32 version = FSOUND_GetVersion(); - if (version < FMOD_VERSION) - { - LL_WARNS("AppInit") << "Error : You are using the wrong FMOD version (" << version - << ")! You should be using FMOD " << FMOD_VERSION << LL_ENDL; - //return false; - } - - U32 fmod_flags = 0x0; - -#if LL_WINDOWS - // Windows needs to know which window is frontmost. - // This must be called before FSOUND_Init() per the FMOD docs. - // This could be used to let FMOD handle muting when we lose focus, - // but we don't actually want to do that because we want to distinguish - // between minimized and not-focused states. - if (!FSOUND_SetHWND(userdata)) - { - LL_WARNS("AppInit") << "Error setting FMOD window: " - << FMOD_ErrorString(FSOUND_GetError()) << LL_ENDL; - return false; - } - // Play audio when we don't have focus. - // (For example, IM client on top of us.) - // This means we also try to play audio when minimized, - // so we manually handle muting in that case. JC - fmod_flags |= FSOUND_INIT_GLOBALFOCUS; -#endif - -#if LL_LINUX - // initialize the FMOD engine - - // This is a hack to use only FMOD's basic FPU mixer - // when the LL_VALGRIND environmental variable is set, - // otherwise valgrind will fall over on FMOD's MMX detection - if (getenv("LL_VALGRIND")) /*Flawfinder: ignore*/ - { - LL_INFOS("AppInit") << "Pacifying valgrind in FMOD init." << LL_ENDL; - FSOUND_SetMixer(FSOUND_MIXER_QUALITY_FPU); - } - - // If we don't set an output method, Linux FMOD always - // decides on OSS and fails otherwise. So we'll manually - // try ESD, then OSS, then ALSA. - // Why this order? See SL-13250, but in short, OSS emulated - // on top of ALSA is ironically more reliable than raw ALSA. - // Ack, and ESD has more reliable failure modes - but has worse - // latency - than all of them, so wins for now. - bool audio_ok = false; - - if (!audio_ok) - { - if (NULL == getenv("LL_BAD_FMOD_ESD")) /*Flawfinder: ignore*/ - { - LL_DEBUGS("AppInit") << "Trying ESD audio output..." << LL_ENDL; - if(FSOUND_SetOutput(FSOUND_OUTPUT_ESD) && - FSOUND_Init(44100, num_channels, fmod_flags)) - { - LL_DEBUGS("AppInit") << "ESD audio output initialized OKAY" - << LL_ENDL; - audio_ok = true; - } else { - LL_WARNS("AppInit") << "ESD audio output FAILED to initialize: " - << FMOD_ErrorString(FSOUND_GetError()) << LL_ENDL; - } - } else { - LL_DEBUGS("AppInit") << "ESD audio output SKIPPED" << LL_ENDL; - } - } - if (!audio_ok) - { - if (NULL == getenv("LL_BAD_FMOD_OSS")) /*Flawfinder: ignore*/ - { - LL_DEBUGS("AppInit") << "Trying OSS audio output..." << LL_ENDL; - if(FSOUND_SetOutput(FSOUND_OUTPUT_OSS) && - FSOUND_Init(44100, num_channels, fmod_flags)) - { - LL_DEBUGS("AppInit") << "OSS audio output initialized OKAY" << LL_ENDL; - audio_ok = true; - } else { - LL_WARNS("AppInit") << "OSS audio output FAILED to initialize: " - << FMOD_ErrorString(FSOUND_GetError()) << LL_ENDL; - } - } else { - LL_DEBUGS("AppInit") << "OSS audio output SKIPPED" << LL_ENDL; - } - } - if (!audio_ok) - { - if (NULL == getenv("LL_BAD_FMOD_ALSA")) /*Flawfinder: ignore*/ - { - LL_DEBUGS("AppInit") << "Trying ALSA audio output..." << LL_ENDL; - if(FSOUND_SetOutput(FSOUND_OUTPUT_ALSA) && - FSOUND_Init(44100, num_channels, fmod_flags)) - { - LL_DEBUGS("AppInit") << "ALSA audio output initialized OKAY" << LL_ENDL; - audio_ok = true; - } else { - LL_WARNS("AppInit") << "ALSA audio output FAILED to initialize: " - << FMOD_ErrorString(FSOUND_GetError()) << LL_ENDL; - } - } else { - LL_DEBUGS("AppInit") << "OSS audio output SKIPPED" << LL_ENDL; - } - } - if (!audio_ok) - { - LL_WARNS("AppInit") << "Overall audio init failure." << LL_ENDL; - return false; - } - - // On Linux, FMOD causes a SIGPIPE for some netstream error - // conditions (an FMOD bug); ignore SIGPIPE so it doesn't crash us. - // NOW FIXED in FMOD 3.x since 2006-10-01. - //signal(SIGPIPE, SIG_IGN); - - // We're interested in logging which output method we - // ended up with, for QA purposes. - switch (FSOUND_GetOutput()) - { - case FSOUND_OUTPUT_NOSOUND: LL_DEBUGS("AppInit") << "Audio output: NoSound" << LL_ENDL; break; - case FSOUND_OUTPUT_OSS: LL_DEBUGS("AppInit") << "Audio output: OSS" << LL_ENDL; break; - case FSOUND_OUTPUT_ESD: LL_DEBUGS("AppInit") << "Audio output: ESD" << LL_ENDL; break; - case FSOUND_OUTPUT_ALSA: LL_DEBUGS("AppInit") << "Audio output: ALSA" << LL_ENDL; break; - default: LL_INFOS("AppInit") << "Audio output: Unknown!" << LL_ENDL; break; - }; - -#else // LL_LINUX - - // initialize the FMOD engine - if (!FSOUND_Init(44100, num_channels, fmod_flags)) - { - LL_WARNS("AppInit") << "Error initializing FMOD: " - << FMOD_ErrorString(FSOUND_GetError()) << LL_ENDL; - return false; - } - -#endif - - // set up our favourite FMOD-native streaming audio implementation if none has already been added - if (!getStreamingAudioImpl()) // no existing implementation added - setStreamingAudioImpl(new LLStreamingAudio_FMOD()); - - LL_DEBUGS("AppInit") << "LLAudioEngine_FMOD::init() FMOD initialized correctly" << LL_ENDL; - - mInited = true; - - return true; -} - - -std::string LLAudioEngine_FMOD::getDriverName(bool verbose) -{ - if (verbose) - { - F32 version = FSOUND_GetVersion(); - return llformat("FMOD version %f", version); - } - else - { - return "FMOD"; - } -} - - -void LLAudioEngine_FMOD::allocateListener(void) -{ - mListenerp = (LLListener *) new LLListener_FMOD(); - if (!mListenerp) - { - llwarns << "Listener creation failed" << llendl; - } -} - - -void LLAudioEngine_FMOD::shutdown() -{ - if (mWindDSP) - { - FSOUND_DSP_SetActive(mWindDSP,false); - FSOUND_DSP_Free(mWindDSP); - } - - stopInternetStream(); - - LLAudioEngine::shutdown(); - - llinfos << "LLAudioEngine_FMOD::shutdown() closing FMOD" << llendl; - FSOUND_Close(); - llinfos << "LLAudioEngine_FMOD::shutdown() done closing FMOD" << llendl; - - delete mListenerp; - mListenerp = NULL; -} - - -LLAudioBuffer * LLAudioEngine_FMOD::createBuffer() -{ - return new LLAudioBufferFMOD(); -} - - -LLAudioChannel * LLAudioEngine_FMOD::createChannel() -{ - return new LLAudioChannelFMOD(); -} - - -bool LLAudioEngine_FMOD::initWind() -{ - if (!mWindGen) - { - bool enable; - - switch (FSOUND_GetMixer()) - { - case FSOUND_MIXER_MMXP5: - case FSOUND_MIXER_MMXP6: - case FSOUND_MIXER_QUALITY_MMXP5: - case FSOUND_MIXER_QUALITY_MMXP6: - enable = (typeid(MIXBUFFERFORMAT) == typeid(S16)); - break; - case FSOUND_MIXER_BLENDMODE: - enable = (typeid(MIXBUFFERFORMAT) == typeid(S32)); - break; - case FSOUND_MIXER_QUALITY_FPU: - enable = (typeid(MIXBUFFERFORMAT) == typeid(F32)); - break; - default: - // FSOUND_GetMixer() does not return a valid mixer type on Darwin - LL_INFOS("AppInit") << "Unknown FMOD mixer type, assuming default" << LL_ENDL; - enable = true; - break; - } - - if (enable) - { - mWindGen = new LLWindGen<MIXBUFFERFORMAT>(FSOUND_GetOutputRate()); - } - else - { - LL_WARNS("AppInit") << "Incompatible FMOD mixer type, wind noise disabled" << LL_ENDL; - } - } - - mNextWindUpdate = 0.0; - - if (mWindGen && !mWindDSP) - { - mWindDSP = FSOUND_DSP_Create(&windCallback, FSOUND_DSP_DEFAULTPRIORITY_CLEARUNIT + 20, mWindGen); - } - if (mWindDSP) - { - FSOUND_DSP_SetActive(mWindDSP, true); - return true; - } - - return false; -} - - -void LLAudioEngine_FMOD::cleanupWind() -{ - if (mWindDSP) - { - FSOUND_DSP_SetActive(mWindDSP, false); - FSOUND_DSP_Free(mWindDSP); - mWindDSP = NULL; - } - - delete mWindGen; - mWindGen = NULL; -} - - -//----------------------------------------------------------------------- -void LLAudioEngine_FMOD::updateWind(LLVector3 wind_vec, F32 camera_height_above_water) -{ - LLVector3 wind_pos; - F64 pitch; - F64 center_freq; - - if (!mEnableWind) - { - return; - } - - if (mWindUpdateTimer.checkExpirationAndReset(LL_WIND_UPDATE_INTERVAL)) - { - - // wind comes in as Linden coordinate (+X = forward, +Y = left, +Z = up) - // need to convert this to the conventional orientation DS3D and OpenAL use - // where +X = right, +Y = up, +Z = backwards - - wind_vec.setVec(-wind_vec.mV[1], wind_vec.mV[2], -wind_vec.mV[0]); - - // cerr << "Wind update" << endl; - - pitch = 1.0 + mapWindVecToPitch(wind_vec); - center_freq = 80.0 * pow(pitch,2.5*(mapWindVecToGain(wind_vec)+1.0)); - - mWindGen->mTargetFreq = (F32)center_freq; - mWindGen->mTargetGain = (F32)mapWindVecToGain(wind_vec) * mMaxWindGain; - mWindGen->mTargetPanGainR = (F32)mapWindVecToPan(wind_vec); - } -} - -/* -//----------------------------------------------------------------------- -void LLAudioEngine_FMOD::setSourceMinDistance(U16 source_num, F64 distance) -{ - if (!mInited) - { - return; - } - if (mBuffer[source_num]) - { - mMinDistance[source_num] = (F32) distance; - if (!FSOUND_Sample_SetMinMaxDistance(mBuffer[source_num],mMinDistance[source_num], mMaxDistance[source_num])) - { - llwarns << "FMOD::setSourceMinDistance(" << source_num << "), error: " << FMOD_ErrorString(FSOUND_GetError()) << llendl; - } - } -} - -//----------------------------------------------------------------------- -void LLAudioEngine_FMOD::setSourceMaxDistance(U16 source_num, F64 distance) -{ - if (!mInited) - { - return; - } - if (mBuffer[source_num]) - { - mMaxDistance[source_num] = (F32) distance; - if (!FSOUND_Sample_SetMinMaxDistance(mBuffer[source_num],mMinDistance[source_num], mMaxDistance[source_num])) - { - llwarns << "FMOD::setSourceMaxDistance(" << source_num << "), error: " << FMOD_ErrorString(FSOUND_GetError()) << llendl; - } - } -} - -//----------------------------------------------------------------------- -void LLAudioEngine_FMOD::get3DParams(S32 source_num, S32 *volume, S32 *freq, S32 *inside, S32 *outside, LLVector3 *orient, S32 *out_volume, F32 *min_dist, F32 *max_dist) -{ - *volume = 0; - *freq = 0; - *inside = 0; - *outside = 0; - *orient = LLVector3::zero; - *out_volume = 0; - *min_dist = 0.f; - *max_dist = 0.f; -} - -*/ - - -//----------------------------------------------------------------------- -void LLAudioEngine_FMOD::setInternalGain(F32 gain) -{ - if (!mInited) - { - return; - } - - gain = llclamp( gain, 0.0f, 1.0f ); - FSOUND_SetSFXMasterVolume( llround( 255.0f * gain ) ); - - LLStreamingAudioInterface *saimpl = getStreamingAudioImpl(); - if ( saimpl ) - { - // fmod likes its streaming audio channel gain re-asserted after - // master volume change. - saimpl->setGain(saimpl->getGain()); - } -} - -// -// LLAudioChannelFMOD implementation -// - -LLAudioChannelFMOD::LLAudioChannelFMOD() : LLAudioChannel(), mChannelID(0), mLastSamplePos(0) -{ -} - - -LLAudioChannelFMOD::~LLAudioChannelFMOD() -{ - cleanup(); -} - - -bool LLAudioChannelFMOD::updateBuffer() -{ - if (LLAudioChannel::updateBuffer()) - { - // Base class update returned true, which means that we need to actually - // set up the channel for a different buffer. - - LLAudioBufferFMOD *bufferp = (LLAudioBufferFMOD *)mCurrentSourcep->getCurrentBuffer(); - - // Grab the FMOD sample associated with the buffer - FSOUND_SAMPLE *samplep = bufferp->getSample(); - if (!samplep) - { - // This is bad, there should ALWAYS be a sample associated with a legit - // buffer. - llerrs << "No FMOD sample!" << llendl; - return false; - } - - - // Actually play the sound. Start it off paused so we can do all the necessary - // setup. - mChannelID = FSOUND_PlaySoundEx(FSOUND_FREE, samplep, FSOUND_DSP_GetSFXUnit(), true); - - //llinfos << "Setting up channel " << std::hex << mChannelID << std::dec << llendl; - } - - // If we have a source for the channel, we need to update its gain. - if (mCurrentSourcep) - { - // SJB: warnings can spam and hurt framerate, disabling - if (!FSOUND_SetVolume(mChannelID, llround(getSecondaryGain() * mCurrentSourcep->getGain() * 255.0f))) - { -// llwarns << "LLAudioChannelFMOD::updateBuffer error: " << FMOD_ErrorString(FSOUND_GetError()) << llendl; - } - - if (!FSOUND_SetLoopMode(mChannelID, mCurrentSourcep->isLoop() ? FSOUND_LOOP_NORMAL : FSOUND_LOOP_OFF)) - { -// llwarns << "Channel " << mChannelID << "Source ID: " << mCurrentSourcep->getID() -// << " at " << mCurrentSourcep->getPositionGlobal() << llendl; -// llwarns << "LLAudioChannelFMOD::updateBuffer error: " << FMOD_ErrorString(FSOUND_GetError()) << llendl; - } - } - - return true; -} - - -void LLAudioChannelFMOD::update3DPosition() -{ - if (!mChannelID) - { - // We're not actually a live channel (i.e., we're not playing back anything) - return; - } - - LLAudioBufferFMOD *bufferp = (LLAudioBufferFMOD *)mCurrentBufferp; - if (!bufferp) - { - // We don't have a buffer associated with us (should really have been picked up - // by the above if. - return; - } - - if (mCurrentSourcep->isAmbient()) - { - // Ambient sound, don't need to do any positional updates. - bufferp->set3DMode(false); - } - else - { - // Localized sound. Update the position and velocity of the sound. - bufferp->set3DMode(true); - - LLVector3 float_pos; - float_pos.setVec(mCurrentSourcep->getPositionGlobal()); - if (!FSOUND_3D_SetAttributes(mChannelID, float_pos.mV, mCurrentSourcep->getVelocity().mV)) - { - LL_DEBUGS("FMOD") << "LLAudioChannelFMOD::update3DPosition error: " << FMOD_ErrorString(FSOUND_GetError()) << LL_ENDL; - } - } -} - - -void LLAudioChannelFMOD::updateLoop() -{ - if (!mChannelID) - { - // May want to clear up the loop/sample counters. - return; - } - - // - // Hack: We keep track of whether we looped or not by seeing when the - // sample position looks like it's going backwards. Not reliable; may - // yield false negatives. - // - U32 cur_pos = FSOUND_GetCurrentPosition(mChannelID); - if (cur_pos < (U32)mLastSamplePos) - { - mLoopedThisFrame = true; - } - mLastSamplePos = cur_pos; -} - - -void LLAudioChannelFMOD::cleanup() -{ - if (!mChannelID) - { - //llinfos << "Aborting cleanup with no channelID." << llendl; - return; - } - - //llinfos << "Cleaning up channel: " << mChannelID << llendl; - if (!FSOUND_StopSound(mChannelID)) - { - LL_DEBUGS("FMOD") << "LLAudioChannelFMOD::cleanup error: " << FMOD_ErrorString(FSOUND_GetError()) << llendl; - } - - mCurrentBufferp = NULL; - mChannelID = 0; -} - - -void LLAudioChannelFMOD::play() -{ - if (!mChannelID) - { - llwarns << "Playing without a channelID, aborting" << llendl; - return; - } - - if (!FSOUND_SetPaused(mChannelID, false)) - { - llwarns << "LLAudioChannelFMOD::play error: " << FMOD_ErrorString(FSOUND_GetError()) << llendl; - } - getSource()->setPlayedOnce(true); -} - - -void LLAudioChannelFMOD::playSynced(LLAudioChannel *channelp) -{ - LLAudioChannelFMOD *fmod_channelp = (LLAudioChannelFMOD*)channelp; - if (!(fmod_channelp->mChannelID && mChannelID)) - { - // Don't have channels allocated to both the master and the slave - return; - } - - U32 position = FSOUND_GetCurrentPosition(fmod_channelp->mChannelID) % mCurrentBufferp->getLength(); - // Try to match the position of our sync master - if (!FSOUND_SetCurrentPosition(mChannelID, position)) - { - llwarns << "LLAudioChannelFMOD::playSynced unable to set current position" << llendl; - } - - // Start us playing - play(); -} - - -bool LLAudioChannelFMOD::isPlaying() -{ - if (!mChannelID) - { - return false; - } - - return FSOUND_IsPlaying(mChannelID) && (!FSOUND_GetPaused(mChannelID)); -} - - - -// -// LLAudioBufferFMOD implementation -// - - -LLAudioBufferFMOD::LLAudioBufferFMOD() -{ - mSamplep = NULL; -} - - -LLAudioBufferFMOD::~LLAudioBufferFMOD() -{ - if (mSamplep) - { - // Clean up the associated FMOD sample if it exists. - FSOUND_Sample_Free(mSamplep); - mSamplep = NULL; - } -} - - -bool LLAudioBufferFMOD::loadWAV(const std::string& filename) -{ - // Try to open a wav file from disk. This will eventually go away, as we don't - // really want to block doing this. - if (filename.empty()) - { - // invalid filename, abort. - return false; - } - - if (!LLAPRFile::isExist(filename, NULL, LL_APR_RPB)) - { - // File not found, abort. - return false; - } - - if (mSamplep) - { - // If there's already something loaded in this buffer, clean it up. - FSOUND_Sample_Free(mSamplep); - mSamplep = NULL; - } - - // Load up the wav file into an fmod sample -#if LL_WINDOWS - // MikeS. - Loading the sound file manually and then handing it over to FMOD, - // since FMOD uses posix IO internally, - // which doesn't work with unicode file paths. - LLFILE* sound_file = LLFile::fopen(filename,"rb"); /* Flawfinder: ignore */ - if (sound_file) - { - fseek(sound_file,0,SEEK_END); - U32 file_length = ftell(sound_file); //Find the length of the file by seeking to the end and getting the offset - size_t read_count; - fseek(sound_file,0,SEEK_SET); //Seek back to the beginning - char* buffer = new char[file_length]; - llassert(buffer); - read_count = fread((void*)buffer,file_length,1,sound_file);//Load it.. - if(ferror(sound_file)==0 && (read_count == 1)){//No read error, and we got 1 chunk of our size... - unsigned int mode_flags = FSOUND_LOOP_NORMAL | FSOUND_LOADMEMORY; - //FSOUND_16BITS | FSOUND_MONO | FSOUND_LOADMEMORY | FSOUND_LOOP_NORMAL; - mSamplep = FSOUND_Sample_Load(FSOUND_UNMANAGED, buffer, mode_flags , 0, file_length); - } - delete[] buffer; - fclose(sound_file); - } -#else - mSamplep = FSOUND_Sample_Load(FSOUND_UNMANAGED, filename.c_str(), FSOUND_LOOP_NORMAL, 0, 0); -#endif - - if (!mSamplep) - { - // We failed to load the file for some reason. - llwarns << "Could not load data '" << filename << "': " - << FMOD_ErrorString(FSOUND_GetError()) << llendl; - - // - // If we EVER want to load wav files provided by end users, we need - // to rethink this! - // - // file is probably corrupt - remove it. - LLFile::remove(filename); - return false; - } - - // Everything went well, return true - return true; -} - - -U32 LLAudioBufferFMOD::getLength() -{ - if (!mSamplep) - { - return 0; - } - - return FSOUND_Sample_GetLength(mSamplep); -} - - -void LLAudioBufferFMOD::set3DMode(bool use3d) -{ - U16 current_mode = FSOUND_Sample_GetMode(mSamplep); - - if (use3d) - { - if (!FSOUND_Sample_SetMode(mSamplep, (current_mode & (~FSOUND_2D)))) - { - llwarns << "LLAudioBufferFMOD::set3DMode error: " << FMOD_ErrorString(FSOUND_GetError()) << llendl; - } - } - else - { - if (!FSOUND_Sample_SetMode(mSamplep, current_mode | FSOUND_2D)) - { - llwarns << "LLAudioBufferFMOD::set3DMode error: " << FMOD_ErrorString(FSOUND_GetError()) << llendl; - } - } -} - - -void * F_CALLBACKAPI windCallback(void *originalbuffer, void *newbuffer, int length, void* userdata) -{ - // originalbuffer = fmod's original mixbuffer. - // newbuffer = the buffer passed from the previous DSP unit. - // length = length in samples at this mix time. - // userdata = user parameter passed through in FSOUND_DSP_Create. - - LLWindGen<LLAudioEngine_FMOD::MIXBUFFERFORMAT> *windgen = - (LLWindGen<LLAudioEngine_FMOD::MIXBUFFERFORMAT> *)userdata; - - newbuffer = windgen->windGenerate((LLAudioEngine_FMOD::MIXBUFFERFORMAT *)newbuffer, length); - - return newbuffer; -} diff --git a/indra/llaudio/llaudioengine_fmodex.cpp b/indra/llaudio/llaudioengine_fmodex.cpp new file mode 100644 index 0000000000..5ec30c7d1d --- /dev/null +++ b/indra/llaudio/llaudioengine_fmodex.cpp @@ -0,0 +1,746 @@ +/** + * @file audioengine_fmodex.cpp + * @brief Implementation of LLAudioEngine class abstracting the audio + * support as a FMODEX implementation + * + * $LicenseInfo:firstyear=2002&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2010, Linden Research, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA + * $/LicenseInfo$ + */ + +#include "linden_common.h" + +#include "llstreamingaudio.h" +#include "llstreamingaudio_fmodex.h" + +#include "llaudioengine_fmodex.h" +#include "lllistener_fmodex.h" + +#include "llerror.h" +#include "llmath.h" +#include "llrand.h" + +#include "fmod.hpp" +#include "fmod_errors.h" +#include "lldir.h" +#include "llapr.h" + +#include "sound_ids.h" + +FMOD_RESULT F_CALLBACK windCallback(FMOD_DSP_STATE *dsp_state, float *inbuffer, float *outbuffer, unsigned int length, int inchannels, int outchannels); + +FMOD::ChannelGroup *LLAudioEngine_FMODEX::mChannelGroups[LLAudioEngine::AUDIO_TYPE_COUNT] = {0}; + +LLAudioEngine_FMODEX::LLAudioEngine_FMODEX(bool enable_profiler) +{ + mInited = false; + mWindGen = NULL; + mWindDSP = NULL; + mSystem = NULL; + mEnableProfiler = enable_profiler; +} + + +LLAudioEngine_FMODEX::~LLAudioEngine_FMODEX() +{ +} + + +inline bool Check_FMOD_Error(FMOD_RESULT result, const char *string) +{ + if(result == FMOD_OK) + return false; + llwarns << string << " Error: " << FMOD_ErrorString(result) << llendl; + return true; +} + +void* F_STDCALL decode_alloc(unsigned int size, FMOD_MEMORY_TYPE type, const char *sourcestr) +{ + if(type & FMOD_MEMORY_STREAM_DECODE) + { + llinfos << "Decode buffer size: " << size << llendl; + } + else if(type & FMOD_MEMORY_STREAM_FILE) + { + llinfos << "Strean buffer size: " << size << llendl; + } + return new char[size]; +} +void* F_STDCALL decode_realloc(void *ptr, unsigned int size, FMOD_MEMORY_TYPE type, const char *sourcestr) +{ + memset(ptr,0,size); + return ptr; +} +void F_STDCALL decode_dealloc(void *ptr, FMOD_MEMORY_TYPE type, const char *sourcestr) +{ + delete[] (char*)ptr; +} + +bool LLAudioEngine_FMODEX::init(const S32 num_channels, void* userdata) +{ + U32 version; + FMOD_RESULT result; + + LL_DEBUGS("AppInit") << "LLAudioEngine_FMODEX::init() initializing FMOD" << LL_ENDL; + + //result = FMOD::Memory_Initialize(NULL, 0, &decode_alloc, &decode_realloc, &decode_dealloc, FMOD_MEMORY_STREAM_DECODE | FMOD_MEMORY_STREAM_FILE); + //if(Check_FMOD_Error(result, "FMOD::Memory_Initialize")) + // return false; + + result = FMOD::System_Create(&mSystem); + if(Check_FMOD_Error(result, "FMOD::System_Create")) + return false; + + //will call LLAudioEngine_FMODEX::allocateListener, which needs a valid mSystem pointer. + LLAudioEngine::init(num_channels, userdata); + + result = mSystem->getVersion(&version); + Check_FMOD_Error(result, "FMOD::System::getVersion"); + + if (version < FMOD_VERSION) + { + LL_WARNS("AppInit") << "Error : You are using the wrong FMOD Ex version (" << version + << ")! You should be using FMOD Ex" << FMOD_VERSION << LL_ENDL; + } + + result = mSystem->setSoftwareFormat(44100, FMOD_SOUND_FORMAT_PCM16, 0, 0, FMOD_DSP_RESAMPLER_LINEAR); + Check_FMOD_Error(result,"FMOD::System::setSoftwareFormat"); + + // In this case, all sounds, PLUS wind and stream will be software. + result = mSystem->setSoftwareChannels(num_channels + 2); + Check_FMOD_Error(result,"FMOD::System::setSoftwareChannels"); + + U32 fmod_flags = FMOD_INIT_NORMAL; + if(mEnableProfiler) + { + fmod_flags |= FMOD_INIT_ENABLE_PROFILE; + mSystem->createChannelGroup("None", &mChannelGroups[AUDIO_TYPE_NONE]); + mSystem->createChannelGroup("SFX", &mChannelGroups[AUDIO_TYPE_SFX]); + mSystem->createChannelGroup("UI", &mChannelGroups[AUDIO_TYPE_UI]); + mSystem->createChannelGroup("Ambient", &mChannelGroups[AUDIO_TYPE_AMBIENT]); + } + +#if LL_LINUX + bool audio_ok = false; + + if (!audio_ok) + { + if (NULL == getenv("LL_BAD_FMOD_PULSEAUDIO")) /*Flawfinder: ignore*/ + { + LL_DEBUGS("AppInit") << "Trying PulseAudio audio output..." << LL_ENDL; + if(mSystem->setOutput(FMOD_OUTPUTTYPE_PULSEAUDIO) == FMOD_OK && + (result = mSystem->init(num_channels + 2, fmod_flags, 0)) == FMOD_OK) + { + LL_DEBUGS("AppInit") << "PulseAudio output initialized OKAY" << LL_ENDL; + audio_ok = true; + } + else + { + Check_FMOD_Error(result, "PulseAudio audio output FAILED to initialize"); + } + } + else + { + LL_DEBUGS("AppInit") << "PulseAudio audio output SKIPPED" << LL_ENDL; + } + } + if (!audio_ok) + { + if (NULL == getenv("LL_BAD_FMOD_ALSA")) /*Flawfinder: ignore*/ + { + LL_DEBUGS("AppInit") << "Trying ALSA audio output..." << LL_ENDL; + if(mSystem->setOutput(FMOD_OUTPUTTYPE_ALSA) == FMOD_OK && + (result = mSystem->init(num_channels + 2, fmod_flags, 0)) == FMOD_OK) + { + LL_DEBUGS("AppInit") << "ALSA audio output initialized OKAY" << LL_ENDL; + audio_ok = true; + } + else + { + Check_FMOD_Error(result, "ALSA audio output FAILED to initialize"); + } + } + else + { + LL_DEBUGS("AppInit") << "ALSA audio output SKIPPED" << LL_ENDL; + } + } + if (!audio_ok) + { + if (NULL == getenv("LL_BAD_FMOD_OSS")) /*Flawfinder: ignore*/ + { + LL_DEBUGS("AppInit") << "Trying OSS audio output..." << LL_ENDL; + if(mSystem->setOutput(FMOD_OUTPUTTYPE_OSS) == FMOD_OK && + (result = mSystem->init(num_channels + 2, fmod_flags, 0)) == FMOD_OK) + { + LL_DEBUGS("AppInit") << "OSS audio output initialized OKAY" << LL_ENDL; + audio_ok = true; + } + else + { + Check_FMOD_Error(result, "OSS audio output FAILED to initialize"); + } + } + else + { + LL_DEBUGS("AppInit") << "OSS audio output SKIPPED" << LL_ENDL; + } + } + if (!audio_ok) + { + LL_WARNS("AppInit") << "Overall audio init failure." << LL_ENDL; + return false; + } + + // We're interested in logging which output method we + // ended up with, for QA purposes. + FMOD_OUTPUTTYPE output_type; + mSystem->getOutput(&output_type); + switch (output_type) + { + case FMOD_OUTPUTTYPE_NOSOUND: + LL_INFOS("AppInit") << "Audio output: NoSound" << LL_ENDL; break; + case FMOD_OUTPUTTYPE_PULSEAUDIO: + LL_INFOS("AppInit") << "Audio output: PulseAudio" << LL_ENDL; break; + case FMOD_OUTPUTTYPE_ALSA: + LL_INFOS("AppInit") << "Audio output: ALSA" << LL_ENDL; break; + case FMOD_OUTPUTTYPE_OSS: + LL_INFOS("AppInit") << "Audio output: OSS" << LL_ENDL; break; + default: + LL_INFOS("AppInit") << "Audio output: Unknown!" << LL_ENDL; break; + }; +#else // LL_LINUX + + // initialize the FMOD engine + result = mSystem->init( num_channels + 2, fmod_flags, 0); + if (result == FMOD_ERR_OUTPUT_CREATEBUFFER) + { + /* + Ok, the speaker mode selected isn't supported by this soundcard. Switch it + back to stereo... + */ + result = mSystem->setSpeakerMode(FMOD_SPEAKERMODE_STEREO); + Check_FMOD_Error(result,"Error falling back to stereo mode"); + /* + ... and re-init. + */ + result = mSystem->init( num_channels + 2, fmod_flags, 0); + } + if(Check_FMOD_Error(result, "Error initializing FMOD Ex")) + return false; +#endif + + // set up our favourite FMOD-native streaming audio implementation if none has already been added + if (!getStreamingAudioImpl()) // no existing implementation added + setStreamingAudioImpl(new LLStreamingAudio_FMODEX(mSystem)); + + LL_INFOS("AppInit") << "LLAudioEngine_FMODEX::init() FMOD Ex initialized correctly" << LL_ENDL; + + int r_numbuffers, r_samplerate, r_channels, r_bits; + unsigned int r_bufferlength; + char r_name[256]; + mSystem->getDSPBufferSize(&r_bufferlength, &r_numbuffers); + mSystem->getSoftwareFormat(&r_samplerate, NULL, &r_channels, NULL, NULL, &r_bits); + mSystem->getDriverInfo(0, r_name, 255, 0); + r_name[255] = '\0'; + int latency = (int)(1000.0f * r_bufferlength * r_numbuffers / r_samplerate); + + LL_INFOS("AppInit") << "FMOD device: "<< r_name << "\n" + << "FMOD Ex parameters: " << r_samplerate << " Hz * " << r_channels << " * " <<r_bits <<" bit\n" + << "\tbuffer " << r_bufferlength << " * " << r_numbuffers << " (" << latency <<"ms)" << LL_ENDL; + + mInited = true; + + return true; +} + + +std::string LLAudioEngine_FMODEX::getDriverName(bool verbose) +{ + llassert_always(mSystem); + if (verbose) + { + U32 version; + if(!Check_FMOD_Error(mSystem->getVersion(&version), "FMOD::System::getVersion")) + { + return llformat("FMOD Ex %1x.%02x.%02x", version >> 16, version >> 8 & 0x000000FF, version & 0x000000FF); + } + } + return "FMODEx"; +} + + +void LLAudioEngine_FMODEX::allocateListener(void) +{ + mListenerp = (LLListener *) new LLListener_FMODEX(mSystem); + if (!mListenerp) + { + llwarns << "Listener creation failed" << llendl; + } +} + + +void LLAudioEngine_FMODEX::shutdown() +{ + stopInternetStream(); + + llinfos << "About to LLAudioEngine::shutdown()" << llendl; + LLAudioEngine::shutdown(); + + llinfos << "LLAudioEngine_FMODEX::shutdown() closing FMOD Ex" << llendl; + mSystem->close(); + mSystem->release(); + llinfos << "LLAudioEngine_FMODEX::shutdown() done closing FMOD Ex" << llendl; + + delete mListenerp; + mListenerp = NULL; +} + + +LLAudioBuffer * LLAudioEngine_FMODEX::createBuffer() +{ + return new LLAudioBufferFMODEX(mSystem); +} + + +LLAudioChannel * LLAudioEngine_FMODEX::createChannel() +{ + return new LLAudioChannelFMODEX(mSystem); +} + +bool LLAudioEngine_FMODEX::initWind() +{ + mNextWindUpdate = 0.0; + + if (!mWindDSP) + { + FMOD_DSP_DESCRIPTION dspdesc; + memset(&dspdesc, 0, sizeof(FMOD_DSP_DESCRIPTION)); //Set everything to zero + strncpy(dspdesc.name,"Wind Unit", sizeof(dspdesc.name)); //Set name to "Wind Unit" + dspdesc.channels=2; + dspdesc.read = &windCallback; //Assign callback. + if(Check_FMOD_Error(mSystem->createDSP(&dspdesc, &mWindDSP), "FMOD::createDSP")) + return false; + + if(mWindGen) + delete mWindGen; + + float frequency = 44100; + mWindDSP->getDefaults(&frequency,0,0,0); + mWindGen = new LLWindGen<MIXBUFFERFORMAT>((U32)frequency); + mWindDSP->setUserData((void*)mWindGen); + } + + if (mWindDSP) + { + mSystem->playDSP(FMOD_CHANNEL_FREE, mWindDSP, false, 0); + return true; + } + return false; +} + + +void LLAudioEngine_FMODEX::cleanupWind() +{ + if (mWindDSP) + { + mWindDSP->remove(); + mWindDSP->release(); + mWindDSP = NULL; + } + + delete mWindGen; + mWindGen = NULL; +} + + +//----------------------------------------------------------------------- +void LLAudioEngine_FMODEX::updateWind(LLVector3 wind_vec, F32 camera_height_above_water) +{ + LLVector3 wind_pos; + F64 pitch; + F64 center_freq; + + if (!mEnableWind) + { + return; + } + + if (mWindUpdateTimer.checkExpirationAndReset(LL_WIND_UPDATE_INTERVAL)) + { + + // wind comes in as Linden coordinate (+X = forward, +Y = left, +Z = up) + // need to convert this to the conventional orientation DS3D and OpenAL use + // where +X = right, +Y = up, +Z = backwards + + wind_vec.setVec(-wind_vec.mV[1], wind_vec.mV[2], -wind_vec.mV[0]); + + // cerr << "Wind update" << endl; + + pitch = 1.0 + mapWindVecToPitch(wind_vec); + center_freq = 80.0 * pow(pitch,2.5*(mapWindVecToGain(wind_vec)+1.0)); + + mWindGen->mTargetFreq = (F32)center_freq; + mWindGen->mTargetGain = (F32)mapWindVecToGain(wind_vec) * mMaxWindGain; + mWindGen->mTargetPanGainR = (F32)mapWindVecToPan(wind_vec); + } +} + +//----------------------------------------------------------------------- +void LLAudioEngine_FMODEX::setInternalGain(F32 gain) +{ + if (!mInited) + { + return; + } + + gain = llclamp( gain, 0.0f, 1.0f ); + + FMOD::ChannelGroup *master_group; + mSystem->getMasterChannelGroup(&master_group); + + master_group->setVolume(gain); + + LLStreamingAudioInterface *saimpl = getStreamingAudioImpl(); + if ( saimpl ) + { + // fmod likes its streaming audio channel gain re-asserted after + // master volume change. + saimpl->setGain(saimpl->getGain()); + } +} + +// +// LLAudioChannelFMODEX implementation +// + +LLAudioChannelFMODEX::LLAudioChannelFMODEX(FMOD::System *system) : LLAudioChannel(), mSystemp(system), mChannelp(NULL), mLastSamplePos(0) +{ +} + + +LLAudioChannelFMODEX::~LLAudioChannelFMODEX() +{ + cleanup(); +} + +bool LLAudioChannelFMODEX::updateBuffer() +{ + if (LLAudioChannel::updateBuffer()) + { + // Base class update returned true, which means that we need to actually + // set up the channel for a different buffer. + + LLAudioBufferFMODEX *bufferp = (LLAudioBufferFMODEX *)mCurrentSourcep->getCurrentBuffer(); + + // Grab the FMOD sample associated with the buffer + FMOD::Sound *soundp = bufferp->getSound(); + if (!soundp) + { + // This is bad, there should ALWAYS be a sound associated with a legit + // buffer. + llerrs << "No FMOD sound!" << llendl; + return false; + } + + + // Actually play the sound. Start it off paused so we can do all the necessary + // setup. + if(!mChannelp) + { + FMOD_RESULT result = getSystem()->playSound(FMOD_CHANNEL_FREE, soundp, true, &mChannelp); + Check_FMOD_Error(result, "FMOD::System::playSound"); + } + + //llinfos << "Setting up channel " << std::hex << mChannelID << std::dec << llendl; + } + + // If we have a source for the channel, we need to update its gain. + if (mCurrentSourcep) + { + // SJB: warnings can spam and hurt framerate, disabling + //FMOD_RESULT result; + + mChannelp->setVolume(getSecondaryGain() * mCurrentSourcep->getGain()); + //Check_FMOD_Error(result, "FMOD::Channel::setVolume"); + + mChannelp->setMode(mCurrentSourcep->isLoop() ? FMOD_LOOP_NORMAL : FMOD_LOOP_OFF); + /*if(Check_FMOD_Error(result, "FMOD::Channel::setMode")) + { + S32 index; + mChannelp->getIndex(&index); + llwarns << "Channel " << index << "Source ID: " << mCurrentSourcep->getID() + << " at " << mCurrentSourcep->getPositionGlobal() << llendl; + }*/ + } + + return true; +} + + +void LLAudioChannelFMODEX::update3DPosition() +{ + if (!mChannelp) + { + // We're not actually a live channel (i.e., we're not playing back anything) + return; + } + + LLAudioBufferFMODEX *bufferp = (LLAudioBufferFMODEX *)mCurrentBufferp; + if (!bufferp) + { + // We don't have a buffer associated with us (should really have been picked up + // by the above if. + return; + } + + if (mCurrentSourcep->isAmbient()) + { + // Ambient sound, don't need to do any positional updates. + set3DMode(false); + } + else + { + // Localized sound. Update the position and velocity of the sound. + set3DMode(true); + + LLVector3 float_pos; + float_pos.setVec(mCurrentSourcep->getPositionGlobal()); + FMOD_RESULT result = mChannelp->set3DAttributes((FMOD_VECTOR*)float_pos.mV, (FMOD_VECTOR*)mCurrentSourcep->getVelocity().mV); + Check_FMOD_Error(result, "FMOD::Channel::set3DAttributes"); + } +} + + +void LLAudioChannelFMODEX::updateLoop() +{ + if (!mChannelp) + { + // May want to clear up the loop/sample counters. + return; + } + + // + // Hack: We keep track of whether we looped or not by seeing when the + // sample position looks like it's going backwards. Not reliable; may + // yield false negatives. + // + U32 cur_pos; + mChannelp->getPosition(&cur_pos,FMOD_TIMEUNIT_PCMBYTES); + + if (cur_pos < (U32)mLastSamplePos) + { + mLoopedThisFrame = true; + } + mLastSamplePos = cur_pos; +} + + +void LLAudioChannelFMODEX::cleanup() +{ + if (!mChannelp) + { + //llinfos << "Aborting cleanup with no channel handle." << llendl; + return; + } + + //llinfos << "Cleaning up channel: " << mChannelID << llendl; + Check_FMOD_Error(mChannelp->stop(),"FMOD::Channel::stop"); + + mCurrentBufferp = NULL; + mChannelp = NULL; +} + + +void LLAudioChannelFMODEX::play() +{ + if (!mChannelp) + { + llwarns << "Playing without a channel handle, aborting" << llendl; + return; + } + + Check_FMOD_Error(mChannelp->setPaused(false), "FMOD::Channel::pause"); + + getSource()->setPlayedOnce(true); + + if(LLAudioEngine_FMODEX::mChannelGroups[getSource()->getType()]) + mChannelp->setChannelGroup(LLAudioEngine_FMODEX::mChannelGroups[getSource()->getType()]); +} + + +void LLAudioChannelFMODEX::playSynced(LLAudioChannel *channelp) +{ + LLAudioChannelFMODEX *fmod_channelp = (LLAudioChannelFMODEX*)channelp; + if (!(fmod_channelp->mChannelp && mChannelp)) + { + // Don't have channels allocated to both the master and the slave + return; + } + + U32 cur_pos; + if(Check_FMOD_Error(mChannelp->getPosition(&cur_pos,FMOD_TIMEUNIT_PCMBYTES), "Unable to retrieve current position")) + return; + + cur_pos %= mCurrentBufferp->getLength(); + + // Try to match the position of our sync master + Check_FMOD_Error(mChannelp->setPosition(cur_pos,FMOD_TIMEUNIT_PCMBYTES),"Unable to set current position"); + + // Start us playing + play(); +} + + +bool LLAudioChannelFMODEX::isPlaying() +{ + if (!mChannelp) + { + return false; + } + + bool paused, playing; + mChannelp->getPaused(&paused); + mChannelp->isPlaying(&playing); + return !paused && playing; +} + + +// +// LLAudioChannelFMODEX implementation +// + + +LLAudioBufferFMODEX::LLAudioBufferFMODEX(FMOD::System *system) : mSystemp(system), mSoundp(NULL) +{ +} + + +LLAudioBufferFMODEX::~LLAudioBufferFMODEX() +{ + if(mSoundp) + { + mSoundp->release(); + mSoundp = NULL; + } +} + + +bool LLAudioBufferFMODEX::loadWAV(const std::string& filename) +{ + // Try to open a wav file from disk. This will eventually go away, as we don't + // really want to block doing this. + if (filename.empty()) + { + // invalid filename, abort. + return false; + } + + if (!LLAPRFile::isExist(filename, NULL, LL_APR_RPB)) + { + // File not found, abort. + return false; + } + + if (mSoundp) + { + // If there's already something loaded in this buffer, clean it up. + mSoundp->release(); + mSoundp = NULL; + } + + FMOD_MODE base_mode = FMOD_LOOP_NORMAL | FMOD_SOFTWARE; + FMOD_CREATESOUNDEXINFO exinfo; + memset(&exinfo,0,sizeof(exinfo)); + exinfo.cbsize = sizeof(exinfo); + exinfo.suggestedsoundtype = FMOD_SOUND_TYPE_WAV; //Hint to speed up loading. + // Load up the wav file into an fmod sample +#if LL_WINDOWS + FMOD_RESULT result = getSystem()->createSound((const char*)utf8str_to_utf16str(filename).c_str(), base_mode | FMOD_UNICODE, &exinfo, &mSoundp); +#else + FMOD_RESULT result = getSystem()->createSound(filename.c_str(), base_mode, &exinfo, &mSoundp); +#endif + + if (result != FMOD_OK) + { + // We failed to load the file for some reason. + llwarns << "Could not load data '" << filename << "': " << FMOD_ErrorString(result) << llendl; + + // + // If we EVER want to load wav files provided by end users, we need + // to rethink this! + // + // file is probably corrupt - remove it. + LLFile::remove(filename); + return false; + } + + // Everything went well, return true + return true; +} + + +U32 LLAudioBufferFMODEX::getLength() +{ + if (!mSoundp) + { + return 0; + } + + U32 length; + mSoundp->getLength(&length, FMOD_TIMEUNIT_PCMBYTES); + return length; +} + + +void LLAudioChannelFMODEX::set3DMode(bool use3d) +{ + FMOD_MODE current_mode; + if(mChannelp->getMode(¤t_mode) != FMOD_OK) + return; + FMOD_MODE new_mode = current_mode; + new_mode &= ~(use3d ? FMOD_2D : FMOD_3D); + new_mode |= use3d ? FMOD_3D : FMOD_2D; + + if(current_mode != new_mode) + { + mChannelp->setMode(new_mode); + } +} + + +FMOD_RESULT F_CALLBACK windCallback(FMOD_DSP_STATE *dsp_state, float *originalbuffer, float *newbuffer, unsigned int length, int inchannels, int outchannels) +{ + // originalbuffer = fmod's original mixbuffer. + // newbuffer = the buffer passed from the previous DSP unit. + // length = length in samples at this mix time. + // userdata = user parameter passed through in FSOUND_DSP_Create. + + LLWindGen<LLAudioEngine_FMODEX::MIXBUFFERFORMAT> *windgen; + FMOD::DSP *thisdsp = (FMOD::DSP *)dsp_state->instance; + + thisdsp->getUserData((void **)&windgen); + S32 channels, configwidth, configheight; + thisdsp->getInfo(0, 0, &channels, &configwidth, &configheight); + + windgen->windGenerate((LLAudioEngine_FMODEX::MIXBUFFERFORMAT *)newbuffer, length); + + return FMOD_OK; +} diff --git a/indra/llaudio/llaudioengine_fmod.h b/indra/llaudio/llaudioengine_fmodex.h index 4582a5d57e..415a9ed0ef 100644 --- a/indra/llaudio/llaudioengine_fmod.h +++ b/indra/llaudio/llaudioengine_fmodex.h @@ -1,7 +1,7 @@ /** - * @file audioengine_fmod.h - * @brief Definition of LLAudioEngine class abstracting the audio - * support as a FMOD 3D implementation + * @file audioengine_fmodex.h + * @brief Definition of LLAudioEngine class abstracting the audio + * support as a FMODEX implementation * * $LicenseInfo:firstyear=2002&license=viewerlgpl$ * Second Life Viewer Source Code @@ -25,26 +25,33 @@ * $/LicenseInfo$ */ -#ifndef LL_AUDIOENGINE_FMOD_H -#define LL_AUDIOENGINE_FMOD_H +#ifndef LL_AUDIOENGINE_FMODEX_H +#define LL_AUDIOENGINE_FMODEX_H #include "llaudioengine.h" -#include "lllistener_fmod.h" #include "llwindgen.h" -#include "fmod.h" - -class LLAudioStreamManagerFMOD; - -class LLAudioEngine_FMOD : public LLAudioEngine +//Stubs +class LLAudioStreamManagerFMODEX; +namespace FMOD +{ + class System; + class Channel; + class ChannelGroup; + class Sound; + class DSP; +} + +//Interfaces +class LLAudioEngine_FMODEX : public LLAudioEngine { public: - LLAudioEngine_FMOD(); - virtual ~LLAudioEngine_FMOD(); + LLAudioEngine_FMODEX(bool enable_profiler); + virtual ~LLAudioEngine_FMODEX(); // initialization/startup/shutdown virtual bool init(const S32 num_channels, void *user_data); - virtual std::string getDriverName(bool verbose); + virtual std::string getDriverName(bool verbose); virtual void allocateListener(); virtual void shutdown(); @@ -54,38 +61,33 @@ public: /*virtual*/void updateWind(LLVector3 direction, F32 camera_height_above_water); -#if LL_DARWIN - typedef S32 MIXBUFFERFORMAT; -#else - typedef S16 MIXBUFFERFORMAT; -#endif + typedef F32 MIXBUFFERFORMAT; + FMOD::System *getSystem() const {return mSystem;} protected: /*virtual*/ LLAudioBuffer *createBuffer(); // Get a free buffer, or flush an existing one if you have to. /*virtual*/ LLAudioChannel *createChannel(); // Create a new audio channel. /*virtual*/ void setInternalGain(F32 gain); -protected: - static signed char F_CALLBACKAPI callbackMetaData(char* name, char* value, void* userdata); - - //F32 mMinDistance[MAX_BUFFERS]; - //F32 mMaxDistance[MAX_BUFFERS]; bool mInited; - // On Windows, userdata is the HWND of the application window. - void* mUserData; - LLWindGen<MIXBUFFERFORMAT> *mWindGen; - FSOUND_DSPUNIT *mWindDSP; + + FMOD::DSP *mWindDSP; + FMOD::System *mSystem; + bool mEnableProfiler; + +public: + static FMOD::ChannelGroup *mChannelGroups[LLAudioEngine::AUDIO_TYPE_COUNT]; }; -class LLAudioChannelFMOD : public LLAudioChannel +class LLAudioChannelFMODEX : public LLAudioChannel { public: - LLAudioChannelFMOD(); - virtual ~LLAudioChannelFMOD(); + LLAudioChannelFMODEX(FMOD::System *audioengine); + virtual ~LLAudioChannelFMODEX(); protected: /*virtual*/ void play(); @@ -97,28 +99,30 @@ protected: /*virtual*/ void update3DPosition(); /*virtual*/ void updateLoop(); + void set3DMode(bool use3d); protected: - int mChannelID; + FMOD::System *getSystem() const {return mSystemp;} + FMOD::System *mSystemp; + FMOD::Channel *mChannelp; S32 mLastSamplePos; }; -class LLAudioBufferFMOD : public LLAudioBuffer +class LLAudioBufferFMODEX : public LLAudioBuffer { public: - LLAudioBufferFMOD(); - virtual ~LLAudioBufferFMOD(); + LLAudioBufferFMODEX(FMOD::System *audioengine); + virtual ~LLAudioBufferFMODEX(); /*virtual*/ bool loadWAV(const std::string& filename); /*virtual*/ U32 getLength(); - friend class LLAudioChannelFMOD; - - void set3DMode(bool use3d); -protected: - FSOUND_SAMPLE *getSample() { return mSamplep; } + friend class LLAudioChannelFMODEX; protected: - FSOUND_SAMPLE *mSamplep; + FMOD::System *getSystem() const {return mSystemp;} + FMOD::System *mSystemp; + FMOD::Sound *getSound() const{ return mSoundp; } + FMOD::Sound *mSoundp; }; -#endif // LL_AUDIOENGINE_FMOD_H +#endif // LL_AUDIOENGINE_FMODEX_H diff --git a/indra/llaudio/lllistener_fmod.cpp b/indra/llaudio/lllistener_fmodex.cpp index 0138f4345e..2509a7aebc 100644 --- a/indra/llaudio/lllistener_fmod.cpp +++ b/indra/llaudio/lllistener_fmodex.cpp @@ -1,7 +1,7 @@ /** - * @file listener_fmod.cpp - * @brief implementation of LISTENER class abstracting the audio - * support as a FMOD 3D implementation (windows only) + * @file listener_fmodex.cpp + * @brief Implementation of LISTENER class abstracting the audio + * support as a FMODEX implementation * * $LicenseInfo:firstyear=2002&license=viewerlgpl$ * Second Life Viewer Source Code @@ -27,24 +27,25 @@ #include "linden_common.h" #include "llaudioengine.h" -#include "lllistener_fmod.h" -#include "fmod.h" +#include "lllistener_fmodex.h" +#include "fmod.hpp" //----------------------------------------------------------------------- // constructor //----------------------------------------------------------------------- -LLListener_FMOD::LLListener_FMOD() +LLListener_FMODEX::LLListener_FMODEX(FMOD::System *system) { + mSystem = system; init(); } //----------------------------------------------------------------------- -LLListener_FMOD::~LLListener_FMOD() +LLListener_FMODEX::~LLListener_FMODEX() { } //----------------------------------------------------------------------- -void LLListener_FMOD::init(void) +void LLListener_FMODEX::init(void) { // do inherited LLListener::init(); @@ -53,31 +54,31 @@ void LLListener_FMOD::init(void) } //----------------------------------------------------------------------- -void LLListener_FMOD::translate(LLVector3 offset) +void LLListener_FMODEX::translate(LLVector3 offset) { LLListener::translate(offset); - FSOUND_3D_Listener_SetAttributes(mPosition.mV, NULL, mListenAt.mV[0],mListenAt.mV[1],mListenAt.mV[2], mListenUp.mV[0],mListenUp.mV[1],mListenUp.mV[2]); + mSystem->set3DListenerAttributes(0, (FMOD_VECTOR*)mPosition.mV, NULL, (FMOD_VECTOR*)mListenAt.mV, (FMOD_VECTOR*)mListenUp.mV); } //----------------------------------------------------------------------- -void LLListener_FMOD::setPosition(LLVector3 pos) +void LLListener_FMODEX::setPosition(LLVector3 pos) { LLListener::setPosition(pos); - FSOUND_3D_Listener_SetAttributes(pos.mV, NULL, mListenAt.mV[0],mListenAt.mV[1],mListenAt.mV[2], mListenUp.mV[0],mListenUp.mV[1],mListenUp.mV[2]); + mSystem->set3DListenerAttributes(0, (FMOD_VECTOR*)mPosition.mV, NULL, (FMOD_VECTOR*)mListenAt.mV, (FMOD_VECTOR*)mListenUp.mV); } //----------------------------------------------------------------------- -void LLListener_FMOD::setVelocity(LLVector3 vel) +void LLListener_FMODEX::setVelocity(LLVector3 vel) { LLListener::setVelocity(vel); - FSOUND_3D_Listener_SetAttributes(NULL, vel.mV, mListenAt.mV[0],mListenAt.mV[1],mListenAt.mV[2], mListenUp.mV[0],mListenUp.mV[1],mListenUp.mV[2]); + mSystem->set3DListenerAttributes(0, NULL, (FMOD_VECTOR*)mVelocity.mV, (FMOD_VECTOR*)mListenAt.mV, (FMOD_VECTOR*)mListenUp.mV); } //----------------------------------------------------------------------- -void LLListener_FMOD::orient(LLVector3 up, LLVector3 at) +void LLListener_FMODEX::orient(LLVector3 up, LLVector3 at) { LLListener::orient(up, at); @@ -87,37 +88,46 @@ void LLListener_FMOD::orient(LLVector3 up, LLVector3 at) // since DX is left-handed and we (LL, OpenGL, OpenAL) are right-handed at = -at; - FSOUND_3D_Listener_SetAttributes(NULL, NULL, at.mV[0],at.mV[1],at.mV[2], up.mV[0],up.mV[1],up.mV[2]); + mSystem->set3DListenerAttributes(0, NULL, NULL, (FMOD_VECTOR*)at.mV, (FMOD_VECTOR*)up.mV); } //----------------------------------------------------------------------- -void LLListener_FMOD::commitDeferredChanges() +void LLListener_FMODEX::commitDeferredChanges() { - FSOUND_Update(); + mSystem->update(); } -void LLListener_FMOD::setRolloffFactor(F32 factor) +void LLListener_FMODEX::setRolloffFactor(F32 factor) { + //An internal FMODEx optimization skips 3D updates if there have not been changes to the 3D sound environment. + //Sadly, a change in rolloff is not accounted for, thus we must touch the listener properties as well. + //In short: Changing the position ticks a dirtyflag inside fmodex, which makes it not skip 3D processing next update call. + if(mRolloffFactor != factor) + { + LLVector3 pos = mVelocity - LLVector3(0.f,0.f,.1f); + mSystem->set3DListenerAttributes(0, (FMOD_VECTOR*)pos.mV, NULL, NULL, NULL); + mSystem->set3DListenerAttributes(0, (FMOD_VECTOR*)mVelocity.mV, NULL, NULL, NULL); + } mRolloffFactor = factor; - FSOUND_3D_SetRolloffFactor(factor); + mSystem->set3DSettings(mDopplerFactor, 1.f, mRolloffFactor); } -F32 LLListener_FMOD::getRolloffFactor() +F32 LLListener_FMODEX::getRolloffFactor() { return mRolloffFactor; } -void LLListener_FMOD::setDopplerFactor(F32 factor) +void LLListener_FMODEX::setDopplerFactor(F32 factor) { mDopplerFactor = factor; - FSOUND_3D_SetDopplerFactor(factor); + mSystem->set3DSettings(mDopplerFactor, 1.f, mRolloffFactor); } -F32 LLListener_FMOD::getDopplerFactor() +F32 LLListener_FMODEX::getDopplerFactor() { return mDopplerFactor; } diff --git a/indra/llaudio/lllistener_fmod.h b/indra/llaudio/lllistener_fmodex.h index 818da05d51..073b65d53a 100644 --- a/indra/llaudio/lllistener_fmod.h +++ b/indra/llaudio/lllistener_fmodex.h @@ -1,5 +1,5 @@ /** - * @file listener_fmod.h + * @file listener_fmodex.h * @brief Description of LISTENER class abstracting the audio support * as an FMOD 3D implementation (windows and Linux) * @@ -25,16 +25,23 @@ * $/LicenseInfo$ */ -#ifndef LL_LISTENER_FMOD_H -#define LL_LISTENER_FMOD_H +#ifndef LL_LISTENER_FMODEX_H +#define LL_LISTENER_FMODEX_H #include "lllistener.h" -class LLListener_FMOD : public LLListener +//Stubs +namespace FMOD +{ + class System; +} + +//Interfaces +class LLListener_FMODEX : public LLListener { public: - LLListener_FMOD(); - virtual ~LLListener_FMOD(); + LLListener_FMODEX(FMOD::System *system); + virtual ~LLListener_FMODEX(); virtual void init(); virtual void translate(LLVector3 offset); @@ -47,8 +54,8 @@ class LLListener_FMOD : public LLListener virtual F32 getDopplerFactor(); virtual void setRolloffFactor(F32 factor); virtual F32 getRolloffFactor(); - protected: + FMOD::System *mSystem; F32 mDopplerFactor; F32 mRolloffFactor; }; diff --git a/indra/llaudio/llstreamingaudio.h b/indra/llaudio/llstreamingaudio.h index 20104af744..93479f9d59 100644 --- a/indra/llaudio/llstreamingaudio.h +++ b/indra/llaudio/llstreamingaudio.h @@ -45,6 +45,8 @@ class LLStreamingAudioInterface virtual void setGain(F32 vol) = 0; virtual F32 getGain() = 0; virtual std::string getURL() = 0; + virtual bool supportsAdjustableBufferSizes(){return false;} + virtual void setBufferSizes(U32 streambuffertime, U32 decodebuffertime){}; }; #endif // LL_STREAMINGAUDIO_H diff --git a/indra/llaudio/llstreamingaudio_fmod.cpp b/indra/llaudio/llstreamingaudio_fmod.cpp deleted file mode 100644 index bcdea771a7..0000000000 --- a/indra/llaudio/llstreamingaudio_fmod.cpp +++ /dev/null @@ -1,356 +0,0 @@ -/** - * @file streamingaudio_fmod.cpp - * @brief LLStreamingAudio_FMOD implementation - * - * $LicenseInfo:firstyear=2009&license=viewerlgpl$ - * Second Life Viewer Source Code - * Copyright (C) 2010, Linden Research, Inc. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; - * version 2.1 of the License only. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - * - * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA - * $/LicenseInfo$ - */ - -#include "linden_common.h" - -#include "llmath.h" - -#include "fmod.h" -#include "fmod_errors.h" - -#include "llstreamingaudio_fmod.h" - - -class LLAudioStreamManagerFMOD -{ -public: - LLAudioStreamManagerFMOD(const std::string& url); - int startStream(); - bool stopStream(); // Returns true if the stream was successfully stopped. - bool ready(); - - const std::string& getURL() { return mInternetStreamURL; } - - int getOpenState(); -protected: - FSOUND_STREAM* mInternetStream; - bool mReady; - - std::string mInternetStreamURL; -}; - - - -//--------------------------------------------------------------------------- -// Internet Streaming -//--------------------------------------------------------------------------- -LLStreamingAudio_FMOD::LLStreamingAudio_FMOD() : - mCurrentInternetStreamp(NULL), - mFMODInternetStreamChannel(-1), - mGain(1.0f) -{ - // Number of milliseconds of audio to buffer for the audio card. - // Must be larger than the usual Second Life frame stutter time. - FSOUND_Stream_SetBufferSize(200); - - // Here's where we set the size of the network buffer and some buffering - // parameters. In this case we want a network buffer of 16k, we want it - // to prebuffer 40% of that when we first connect, and we want it - // to rebuffer 80% of that whenever we encounter a buffer underrun. - - // Leave the net buffer properties at the default. - //FSOUND_Stream_Net_SetBufferProperties(20000, 40, 80); -} - - -LLStreamingAudio_FMOD::~LLStreamingAudio_FMOD() -{ - // nothing interesting/safe to do. -} - - -void LLStreamingAudio_FMOD::start(const std::string& url) -{ - //if (!mInited) - //{ - // llwarns << "startInternetStream before audio initialized" << llendl; - // return; - //} - - // "stop" stream but don't clear url, etc. in case url == mInternetStreamURL - stop(); - - if (!url.empty()) - { - llinfos << "Starting internet stream: " << url << llendl; - mCurrentInternetStreamp = new LLAudioStreamManagerFMOD(url); - mURL = url; - } - else - { - llinfos << "Set internet stream to null" << llendl; - mURL.clear(); - } -} - - -void LLStreamingAudio_FMOD::update() -{ - // Kill dead internet streams, if possible - std::list<LLAudioStreamManagerFMOD *>::iterator iter; - for (iter = mDeadStreams.begin(); iter != mDeadStreams.end();) - { - LLAudioStreamManagerFMOD *streamp = *iter; - if (streamp->stopStream()) - { - llinfos << "Closed dead stream" << llendl; - delete streamp; - mDeadStreams.erase(iter++); - } - else - { - iter++; - } - } - - // Don't do anything if there are no streams playing - if (!mCurrentInternetStreamp) - { - return; - } - - int open_state = mCurrentInternetStreamp->getOpenState(); - - if (!open_state) - { - // Stream is live - - // start the stream if it's ready - if (mFMODInternetStreamChannel < 0) - { - mFMODInternetStreamChannel = mCurrentInternetStreamp->startStream(); - - if (mFMODInternetStreamChannel != -1) - { - // Reset volume to previously set volume - setGain(getGain()); - FSOUND_SetPaused(mFMODInternetStreamChannel, false); - } - } - } - - switch(open_state) - { - default: - case 0: - // success - break; - case -1: - // stream handle is invalid - llwarns << "InternetStream - invalid handle" << llendl; - stop(); - return; - case -2: - // opening - break; - case -3: - // failed to open, file not found, perhaps - llwarns << "InternetStream - failed to open" << llendl; - stop(); - return; - case -4: - // connecting - break; - case -5: - // buffering - break; - } - -} - -void LLStreamingAudio_FMOD::stop() -{ - if (mFMODInternetStreamChannel != -1) - { - FSOUND_SetPaused(mFMODInternetStreamChannel, true); - FSOUND_SetPriority(mFMODInternetStreamChannel, 0); - mFMODInternetStreamChannel = -1; - } - - if (mCurrentInternetStreamp) - { - llinfos << "Stopping internet stream: " << mCurrentInternetStreamp->getURL() << llendl; - if (mCurrentInternetStreamp->stopStream()) - { - delete mCurrentInternetStreamp; - } - else - { - llwarns << "Pushing stream to dead list: " << mCurrentInternetStreamp->getURL() << llendl; - mDeadStreams.push_back(mCurrentInternetStreamp); - } - mCurrentInternetStreamp = NULL; - //mURL.clear(); - } -} - -void LLStreamingAudio_FMOD::pause(int pauseopt) -{ - if (pauseopt < 0) - { - pauseopt = mCurrentInternetStreamp ? 1 : 0; - } - - if (pauseopt) - { - if (mCurrentInternetStreamp) - { - stop(); - } - } - else - { - start(getURL()); - } -} - - -// A stream is "playing" if it has been requested to start. That -// doesn't necessarily mean audio is coming out of the speakers. -int LLStreamingAudio_FMOD::isPlaying() -{ - if (mCurrentInternetStreamp) - { - return 1; // Active and playing - } - else if (!mURL.empty()) - { - return 2; // "Paused" - } - else - { - return 0; - } -} - - -F32 LLStreamingAudio_FMOD::getGain() -{ - return mGain; -} - - -std::string LLStreamingAudio_FMOD::getURL() -{ - return mURL; -} - - -void LLStreamingAudio_FMOD::setGain(F32 vol) -{ - mGain = vol; - - if (mFMODInternetStreamChannel != -1) - { - vol = llclamp(vol * vol, 0.f, 1.f); - int vol_int = llround(vol * 255.f); - FSOUND_SetVolumeAbsolute(mFMODInternetStreamChannel, vol_int); - } -} - - -/////////////////////////////////////////////////////// -// manager of possibly-multiple internet audio streams - -LLAudioStreamManagerFMOD::LLAudioStreamManagerFMOD(const std::string& url) : - mInternetStream(NULL), - mReady(false) -{ - mInternetStreamURL = url; - mInternetStream = FSOUND_Stream_Open(url.c_str(), FSOUND_NORMAL | FSOUND_NONBLOCKING, 0, 0); - if (!mInternetStream) - { - llwarns << "Couldn't open fmod stream, error " - << FMOD_ErrorString(FSOUND_GetError()) - << llendl; - mReady = false; - return; - } - - mReady = true; -} - -int LLAudioStreamManagerFMOD::startStream() -{ - // We need a live and opened stream before we try and play it. - if (!mInternetStream || getOpenState()) - { - llwarns << "No internet stream to start playing!" << llendl; - return -1; - } - - // Make sure the stream is set to 2D mode. - FSOUND_Stream_SetMode(mInternetStream, FSOUND_2D); - - return FSOUND_Stream_PlayEx(FSOUND_FREE, mInternetStream, NULL, true); -} - -bool LLAudioStreamManagerFMOD::stopStream() -{ - if (mInternetStream) - { - int read_percent = 0; - int status = 0; - int bitrate = 0; - unsigned int flags = 0x0; - FSOUND_Stream_Net_GetStatus(mInternetStream, &status, &read_percent, &bitrate, &flags); - - bool close = true; - switch (status) - { - case FSOUND_STREAM_NET_CONNECTING: - close = false; - break; - case FSOUND_STREAM_NET_NOTCONNECTED: - case FSOUND_STREAM_NET_BUFFERING: - case FSOUND_STREAM_NET_READY: - case FSOUND_STREAM_NET_ERROR: - default: - close = true; - } - - if (close) - { - FSOUND_Stream_Close(mInternetStream); - mInternetStream = NULL; - return true; - } - else - { - return false; - } - } - else - { - return true; - } -} - -int LLAudioStreamManagerFMOD::getOpenState() -{ - int open_state = FSOUND_Stream_GetOpenState(mInternetStream); - return open_state; -} diff --git a/indra/llaudio/llstreamingaudio_fmodex.cpp b/indra/llaudio/llstreamingaudio_fmodex.cpp new file mode 100644 index 0000000000..266fa2f57b --- /dev/null +++ b/indra/llaudio/llstreamingaudio_fmodex.cpp @@ -0,0 +1,392 @@ +/** + * @file streamingaudio_fmodex.cpp + * @brief LLStreamingAudio_FMODEX implementation + * + * $LicenseInfo:firstyear=2002&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2010, Linden Research, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA + * $/LicenseInfo$ + */ + +#include "linden_common.h" + +#include "llmath.h" + +#include "fmod.hpp" +#include "fmod_errors.h" + +#include "llstreamingaudio_fmodex.h" + + +class LLAudioStreamManagerFMODEX +{ +public: + LLAudioStreamManagerFMODEX(FMOD::System *system, const std::string& url); + FMOD::Channel* startStream(); + bool stopStream(); // Returns true if the stream was successfully stopped. + bool ready(); + + const std::string& getURL() { return mInternetStreamURL; } + + FMOD_OPENSTATE getOpenState(unsigned int* percentbuffered=NULL, bool* starving=NULL, bool* diskbusy=NULL); +protected: + FMOD::System* mSystem; + FMOD::Channel* mStreamChannel; + FMOD::Sound* mInternetStream; + bool mReady; + + std::string mInternetStreamURL; +}; + + + +//--------------------------------------------------------------------------- +// Internet Streaming +//--------------------------------------------------------------------------- +LLStreamingAudio_FMODEX::LLStreamingAudio_FMODEX(FMOD::System *system) : + mSystem(system), + mCurrentInternetStreamp(NULL), + mFMODInternetStreamChannelp(NULL), + mGain(1.0f) +{ + // Number of milliseconds of audio to buffer for the audio card. + // Must be larger than the usual Second Life frame stutter time. + const U32 buffer_seconds = 10; //sec + const U32 estimated_bitrate = 128; //kbit/sec + mSystem->setStreamBufferSize(estimated_bitrate * buffer_seconds * 128/*bytes/kbit*/, FMOD_TIMEUNIT_RAWBYTES); + + // Here's where we set the size of the network buffer and some buffering + // parameters. In this case we want a network buffer of 16k, we want it + // to prebuffer 40% of that when we first connect, and we want it + // to rebuffer 80% of that whenever we encounter a buffer underrun. + + // Leave the net buffer properties at the default. + //FSOUND_Stream_Net_SetBufferProperties(20000, 40, 80); +} + + +LLStreamingAudio_FMODEX::~LLStreamingAudio_FMODEX() +{ + // nothing interesting/safe to do. +} + + +void LLStreamingAudio_FMODEX::start(const std::string& url) +{ + //if (!mInited) + //{ + // llwarns << "startInternetStream before audio initialized" << llendl; + // return; + //} + + // "stop" stream but don't clear url, etc. in case url == mInternetStreamURL + stop(); + + if (!url.empty()) + { + llinfos << "Starting internet stream: " << url << llendl; + mCurrentInternetStreamp = new LLAudioStreamManagerFMODEX(mSystem,url); + mURL = url; + } + else + { + llinfos << "Set internet stream to null" << llendl; + mURL.clear(); + } +} + + +void LLStreamingAudio_FMODEX::update() +{ + // Kill dead internet streams, if possible + std::list<LLAudioStreamManagerFMODEX *>::iterator iter; + for (iter = mDeadStreams.begin(); iter != mDeadStreams.end();) + { + LLAudioStreamManagerFMODEX *streamp = *iter; + if (streamp->stopStream()) + { + llinfos << "Closed dead stream" << llendl; + delete streamp; + mDeadStreams.erase(iter++); + } + else + { + iter++; + } + } + + // Don't do anything if there are no streams playing + if (!mCurrentInternetStreamp) + { + return; + } + + unsigned int progress; + bool starving; + bool diskbusy; + FMOD_OPENSTATE open_state = mCurrentInternetStreamp->getOpenState(&progress, &starving, &diskbusy); + + if (open_state == FMOD_OPENSTATE_READY) + { + // Stream is live + + // start the stream if it's ready + if (!mFMODInternetStreamChannelp && + (mFMODInternetStreamChannelp = mCurrentInternetStreamp->startStream())) + { + // Reset volume to previously set volume + setGain(getGain()); + mFMODInternetStreamChannelp->setPaused(false); + } + } + else if(open_state == FMOD_OPENSTATE_ERROR) + { + stop(); + return; + } + + if(mFMODInternetStreamChannelp) + { + FMOD::Sound *sound = NULL; + + if(mFMODInternetStreamChannelp->getCurrentSound(&sound) == FMOD_OK && sound) + { + FMOD_TAG tag; + S32 tagcount, dirtytagcount; + + if(sound->getNumTags(&tagcount, &dirtytagcount) == FMOD_OK && dirtytagcount) + { + for(S32 i = 0; i < tagcount; ++i) + { + if(sound->getTag(NULL, i, &tag)!=FMOD_OK) + continue; + + if (tag.type == FMOD_TAGTYPE_FMOD) + { + if (!strcmp(tag.name, "Sample Rate Change")) + { + llinfos << "Stream forced changing sample rate to " << *((float *)tag.data) << llendl; + mFMODInternetStreamChannelp->setFrequency(*((float *)tag.data)); + } + continue; + } + } + } + + if(starving) + { + bool paused = false; + mFMODInternetStreamChannelp->getPaused(&paused); + if(!paused) + { + llinfos << "Stream starvation detected! Pausing stream until buffer nearly full." << llendl; + llinfos << " (diskbusy="<<diskbusy<<")" << llendl; + llinfos << " (progress="<<progress<<")" << llendl; + mFMODInternetStreamChannelp->setPaused(true); + } + } + else if(progress > 80) + { + mFMODInternetStreamChannelp->setPaused(false); + } + } + } +} + +void LLStreamingAudio_FMODEX::stop() +{ + if (mFMODInternetStreamChannelp) + { + mFMODInternetStreamChannelp->setPaused(true); + mFMODInternetStreamChannelp->setPriority(0); + mFMODInternetStreamChannelp = NULL; + } + + if (mCurrentInternetStreamp) + { + llinfos << "Stopping internet stream: " << mCurrentInternetStreamp->getURL() << llendl; + if (mCurrentInternetStreamp->stopStream()) + { + delete mCurrentInternetStreamp; + } + else + { + llwarns << "Pushing stream to dead list: " << mCurrentInternetStreamp->getURL() << llendl; + mDeadStreams.push_back(mCurrentInternetStreamp); + } + mCurrentInternetStreamp = NULL; + //mURL.clear(); + } +} + +void LLStreamingAudio_FMODEX::pause(int pauseopt) +{ + if (pauseopt < 0) + { + pauseopt = mCurrentInternetStreamp ? 1 : 0; + } + + if (pauseopt) + { + if (mCurrentInternetStreamp) + { + stop(); + } + } + else + { + start(getURL()); + } +} + + +// A stream is "playing" if it has been requested to start. That +// doesn't necessarily mean audio is coming out of the speakers. +int LLStreamingAudio_FMODEX::isPlaying() +{ + if (mCurrentInternetStreamp) + { + return 1; // Active and playing + } + else if (!mURL.empty()) + { + return 2; // "Paused" + } + else + { + return 0; + } +} + + +F32 LLStreamingAudio_FMODEX::getGain() +{ + return mGain; +} + + +std::string LLStreamingAudio_FMODEX::getURL() +{ + return mURL; +} + + +void LLStreamingAudio_FMODEX::setGain(F32 vol) +{ + mGain = vol; + + if (mFMODInternetStreamChannelp) + { + vol = llclamp(vol * vol, 0.f, 1.f); //should vol be squared here? + + mFMODInternetStreamChannelp->setVolume(vol); + } +} + +/////////////////////////////////////////////////////// +// manager of possibly-multiple internet audio streams + +LLAudioStreamManagerFMODEX::LLAudioStreamManagerFMODEX(FMOD::System *system, const std::string& url) : + mSystem(system), + mStreamChannel(NULL), + mInternetStream(NULL), + mReady(false) +{ + mInternetStreamURL = url; + + FMOD_RESULT result = mSystem->createStream(url.c_str(), FMOD_2D | FMOD_NONBLOCKING | FMOD_MPEGSEARCH | FMOD_IGNORETAGS, 0, &mInternetStream); + + if (result!= FMOD_OK) + { + llwarns << "Couldn't open fmod stream, error " + << FMOD_ErrorString(result) + << llendl; + mReady = false; + return; + } + + mReady = true; +} + +FMOD::Channel *LLAudioStreamManagerFMODEX::startStream() +{ + // We need a live and opened stream before we try and play it. + if (!mInternetStream || getOpenState() != FMOD_OPENSTATE_READY) + { + llwarns << "No internet stream to start playing!" << llendl; + return NULL; + } + + if(mStreamChannel) + return mStreamChannel; //Already have a channel for this stream. + + mSystem->playSound(FMOD_CHANNEL_FREE, mInternetStream, true, &mStreamChannel); + return mStreamChannel; +} + +bool LLAudioStreamManagerFMODEX::stopStream() +{ + if (mInternetStream) + { + + + bool close = true; + switch (getOpenState()) + { + case FMOD_OPENSTATE_CONNECTING: + close = false; + break; + default: + close = true; + } + + if (close) + { + mInternetStream->release(); + mStreamChannel = NULL; + mInternetStream = NULL; + return true; + } + else + { + return false; + } + } + else + { + return true; + } +} + +FMOD_OPENSTATE LLAudioStreamManagerFMODEX::getOpenState(unsigned int* percentbuffered, bool* starving, bool* diskbusy) +{ + FMOD_OPENSTATE state; + mInternetStream->getOpenState(&state, percentbuffered, starving, diskbusy); + return state; +} + +void LLStreamingAudio_FMODEX::setBufferSizes(U32 streambuffertime, U32 decodebuffertime) +{ + mSystem->setStreamBufferSize(streambuffertime/1000*128*128, FMOD_TIMEUNIT_RAWBYTES); + FMOD_ADVANCEDSETTINGS settings; + memset(&settings,0,sizeof(settings)); + settings.cbsize=sizeof(settings); + settings.defaultDecodeBufferSize = decodebuffertime;//ms + mSystem->setAdvancedSettings(&settings); +} diff --git a/indra/llaudio/llstreamingaudio_fmod.h b/indra/llaudio/llstreamingaudio_fmodex.h index 9970f0d03b..1dee18ae7d 100644 --- a/indra/llaudio/llstreamingaudio_fmod.h +++ b/indra/llaudio/llstreamingaudio_fmodex.h @@ -1,9 +1,8 @@ /** - * @file streamingaudio_fmod.h - * @author Tofu Linden - * @brief Definition of LLStreamingAudio_FMOD implementation + * @file streamingaudio_fmodex.h + * @brief Definition of LLStreamingAudio_FMODEX implementation * - * $LicenseInfo:firstyear=2009&license=viewerlgpl$ + * $LicenseInfo:firstyear=2002&license=viewerlgpl$ * Second Life Viewer Source Code * Copyright (C) 2010, Linden Research, Inc. * @@ -25,20 +24,28 @@ * $/LicenseInfo$ */ -#ifndef LL_STREAMINGAUDIO_FMOD_H -#define LL_STREAMINGAUDIO_FMOD_H +#ifndef LL_STREAMINGAUDIO_FMODEX_H +#define LL_STREAMINGAUDIO_FMODEX_H #include "stdtypes.h" // from llcommon #include "llstreamingaudio.h" +#include "lltimer.h" -class LLAudioStreamManagerFMOD; +//Stubs +class LLAudioStreamManagerFMODEX; +namespace FMOD +{ + class System; + class Channel; +} -class LLStreamingAudio_FMOD : public LLStreamingAudioInterface +//Interfaces +class LLStreamingAudio_FMODEX : public LLStreamingAudioInterface { public: - LLStreamingAudio_FMOD(); - /*virtual*/ ~LLStreamingAudio_FMOD(); + LLStreamingAudio_FMODEX(FMOD::System *system); + /*virtual*/ ~LLStreamingAudio_FMODEX(); /*virtual*/ void start(const std::string& url); /*virtual*/ void stop(); @@ -49,14 +56,18 @@ class LLStreamingAudio_FMOD : public LLStreamingAudioInterface /*virtual*/ F32 getGain(); /*virtual*/ std::string getURL(); + /*virtual*/ bool supportsAdjustableBufferSizes(){return true;} + /*virtual*/ void setBufferSizes(U32 streambuffertime, U32 decodebuffertime); private: - LLAudioStreamManagerFMOD *mCurrentInternetStreamp; - int mFMODInternetStreamChannel; - std::list<LLAudioStreamManagerFMOD *> mDeadStreams; + FMOD::System *mSystem; + + LLAudioStreamManagerFMODEX *mCurrentInternetStreamp; + FMOD::Channel *mFMODInternetStreamChannelp; + std::list<LLAudioStreamManagerFMODEX *> mDeadStreams; std::string mURL; F32 mGain; }; -#endif // LL_STREAMINGAUDIO_FMOD_H +#endif // LL_STREAMINGAUDIO_FMODEX_H diff --git a/indra/llaudio/llvorbisencode.cpp b/indra/llaudio/llvorbisencode.cpp index 0e0c80a456..dfd5da12b3 100644 --- a/indra/llaudio/llvorbisencode.cpp +++ b/indra/llaudio/llvorbisencode.cpp @@ -35,7 +35,7 @@ #include "llapr.h" //#if LL_DARWIN -// MBW -- XXX -- Getting rid of SecondLifeVorbis for now -- no fmod means no name collisions. +// MBW -- XXX -- Getting rid of SecondLifeVorbis for now #if 0 #include "VorbisFramework.h" diff --git a/indra/llaudio/llwindgen.h b/indra/llaudio/llwindgen.h index b9cecb60a1..ec58f76f5f 100644 --- a/indra/llaudio/llwindgen.h +++ b/indra/llaudio/llwindgen.h @@ -27,6 +27,7 @@ #define WINDGEN_H #include "llcommon.h" +#include "llrand.h" template <class MIXBUFFERFORMAT_T> class LLWindGen @@ -54,6 +55,8 @@ public: } const U32 getInputSamplingRate() { return mInputSamplingRate; } + const F32 getNextSample(); + const F32 getClampedSample(bool clamp, F32 sample); // newbuffer = the buffer passed from the previous DSP unit. // numsamples = length in samples-per-channel at this mix time. @@ -89,7 +92,7 @@ public: // Start with white noise // This expression is fragile, rearrange it and it will break! - next_sample = (F32)rand() * (1.0f / (F32)(RAND_MAX / (U16_MAX / 8))) + (F32)(S16_MIN / 8); + next_sample = getNextSample(); // Apply a pinking filter // Magic numbers taken from PKE method at http://www.firstpr.com.au/dsp/pink-noise/ @@ -126,25 +129,15 @@ public: for (U8 i=mSubSamples; i && numsamples; --i, --numsamples) { mLastSample = mLastSample + delta; - S32 sample_right = (S32)(mLastSample * mCurrentPanGainR); - S32 sample_left = (S32)mLastSample - sample_right; + MIXBUFFERFORMAT_T sample_right = (MIXBUFFERFORMAT_T)getClampedSample(clip, mLastSample * mCurrentPanGainR); + MIXBUFFERFORMAT_T sample_left = (MIXBUFFERFORMAT_T)getClampedSample(clip, mLastSample - (F32)sample_right); - if (!clip) - { - *cursamplep = (MIXBUFFERFORMAT_T)sample_left; + *cursamplep = sample_left; ++cursamplep; - *cursamplep = (MIXBUFFERFORMAT_T)sample_right; - ++cursamplep; - } - else - { - *cursamplep = (MIXBUFFERFORMAT_T)llclamp(sample_left, (S32)S16_MIN, (S32)S16_MAX); - ++cursamplep; - *cursamplep = (MIXBUFFERFORMAT_T)llclamp(sample_right, (S32)S16_MIN, (S32)S16_MAX); + *cursamplep = sample_right; ++cursamplep; } } - } return newbuffer; } @@ -173,4 +166,9 @@ private: F32 mLastSample; }; +template<class T> inline const F32 LLWindGen<T>::getNextSample() { return (F32)rand() * (1.0f / (F32)(RAND_MAX / (U16_MAX / 8))) + (F32)(S16_MIN / 8); } +template<> inline const F32 LLWindGen<F32>::getNextSample() { return ll_frand()-.5f; } +template<class T> inline const F32 LLWindGen<T>::getClampedSample(bool clamp, F32 sample) { return clamp ? (F32)llclamp((S32)sample,(S32)S16_MIN,(S32)S16_MAX) : sample; } +template<> inline const F32 LLWindGen<F32>::getClampedSample(bool clamp, F32 sample) { return sample; } + #endif diff --git a/indra/llcommon/CMakeLists.txt b/indra/llcommon/CMakeLists.txt index 5cce8ff2c4..3e57280067 100644 --- a/indra/llcommon/CMakeLists.txt +++ b/indra/llcommon/CMakeLists.txt @@ -17,6 +17,7 @@ include_directories( ${EXPAT_INCLUDE_DIRS} ${LLCOMMON_INCLUDE_DIRS} ${ZLIB_INCLUDE_DIRS} + ${BREAKPAD_INCLUDE_DIRECTORIES} ) # add_executable(lltreeiterators lltreeiterators.cpp) diff --git a/indra/llcommon/llapp.cpp b/indra/llcommon/llapp.cpp index ca258900c7..67e6705cbf 100644 --- a/indra/llcommon/llapp.cpp +++ b/indra/llcommon/llapp.cpp @@ -69,10 +69,16 @@ bool windows_post_minidump_callback(const wchar_t* dump_path, void setup_signals(); void default_unix_signal_handler(int signum, siginfo_t *info, void *); +#if LL_LINUX +#include "google_breakpad/minidump_descriptor.h" +bool unix_minidump_callback(const google_breakpad::MinidumpDescriptor& minidump_desc, void* context, bool succeeded); +#else // Called by breakpad exception handler after the minidump has been generated. bool unix_post_minidump_callback(const char *dump_dir, const char *minidump_id, void *context, bool succeeded); +#endif + # if LL_DARWIN /* OSX doesn't support SIGRT* */ S32 LL_SMACKDOWN_SIGNAL = SIGUSR1; @@ -313,7 +319,7 @@ void LLApp::setupErrorHandling() // Add google breakpad exception handler configured for Darwin/Linux. bool installHandler = true; -#ifdef LL_DARWIN +#if LL_DARWIN // For the special case of Darwin, we do not want to install the handler if // the process is being debugged as the app will exit with value ABRT (6) if // we do. Unfortunately, the code below which performs that test relies on @@ -322,7 +328,7 @@ void LLApp::setupErrorHandling() // future releases of Darwin. This test is really only needed for developers // starting the app from a debugger anyway. #ifndef LL_RELEASE_FOR_DOWNLOAD - int mib[4]; + int mib[4]; mib[0] = CTL_KERN; mib[1] = KERN_PROC; mib[2] = KERN_PROC_PID; @@ -346,14 +352,21 @@ void LLApp::setupErrorHandling() installHandler = true; } #endif -#endif + if(installHandler && (mExceptionHandler == 0)) { std::string dumpPath = "/tmp/"; - mExceptionHandler = new google_breakpad::ExceptionHandler(dumpPath, 0, &unix_post_minidump_callback, 0, true); + mExceptionHandler = new google_breakpad::ExceptionHandler(dumpPath, 0, &unix_post_minidump_callback, 0, true, 0); + } +#elif LL_LINUX + if(installHandler && (mExceptionHandler == 0)) + { + google_breakpad::MinidumpDescriptor desc("/tmp"); + new google_breakpad::ExceptionHandler(desc, 0, &unix_minidump_callback, 0, true, 0); } #endif +#endif startErrorThread(); } @@ -410,6 +423,9 @@ void LLApp::setMiniDumpDir(const std::string &path) wchar_t buffer[MAX_MINDUMP_PATH_LENGTH]; mbstowcs(buffer, path.c_str(), MAX_MINDUMP_PATH_LENGTH); mExceptionHandler->set_dump_path(std::wstring(buffer)); +#elif LL_LINUX + google_breakpad::MinidumpDescriptor desc(path); + mExceptionHandler->set_minidump_descriptor(desc); #else mExceptionHandler->set_dump_path(path); #endif @@ -857,6 +873,43 @@ void default_unix_signal_handler(int signum, siginfo_t *info, void *) } } +#if LL_LINUX +bool unix_minidump_callback(const google_breakpad::MinidumpDescriptor& minidump_desc, void* context, bool succeeded) +{ + // Copy minidump file path into fixed buffer in the app instance to avoid + // heap allocations in a crash handler. + + // path format: <dump_dir>/<minidump_id>.dmp + int dirPathLength = strlen(minidump_desc.path()); + + // The path must not be truncated. + llassert((dirPathLength + 5) <= LLApp::MAX_MINDUMP_PATH_LENGTH); + + char * path = LLApp::instance()->getMiniDumpFilename(); + S32 remaining = LLApp::MAX_MINDUMP_PATH_LENGTH; + strncpy(path, minidump_desc.path(), remaining); + remaining -= dirPathLength; + path += dirPathLength; + if (remaining > 0 && dirPathLength > 0 && path[-1] != '/') + { + *path++ = '/'; + --remaining; + } + + llinfos << "generated minidump: " << LLApp::instance()->getMiniDumpFilename() << llendl; + LLApp::runErrorHandler(); + +#ifndef LL_RELEASE_FOR_DOWNLOAD + clear_signals(); + return false; +#else + return true; +#endif + +} +#endif + + bool unix_post_minidump_callback(const char *dump_dir, const char *minidump_id, void *context, bool succeeded) diff --git a/indra/llcommon/llapp.h b/indra/llcommon/llapp.h index a536a06ea5..afa06df23e 100644 --- a/indra/llcommon/llapp.h +++ b/indra/llcommon/llapp.h @@ -38,7 +38,7 @@ typedef LLAtomic32<U32> LLAtomicU32; class LLErrorThread; class LLLiveFile; #if LL_LINUX -typedef struct siginfo siginfo_t; +#include <signal.h> #endif typedef void (*LLAppErrorHandler)(); diff --git a/indra/llcommon/llavatarname.h b/indra/llcommon/llavatarname.h index 7542a8dece..87e7d95f32 100644 --- a/indra/llcommon/llavatarname.h +++ b/indra/llcommon/llavatarname.h @@ -69,6 +69,11 @@ public: // *TODO: Eliminate this in favor of username only std::string getLegacyName() const; + // Returns "James Linden" or "bobsmith123 Resident" for backwards + // compatibility with systems like voice and muting + // *TODO: Eliminate this in favor of username only + std::string getLegacyName() const; + // "José Sanchez" or "James Linden", UTF-8 encoded Unicode // Takes the display name preference into account. This is truly the name that should // be used for all UI where an avatar name has to be used unless we truly want something else (rare) diff --git a/indra/llcommon/llfasttimer.cpp b/indra/llcommon/llfasttimer.cpp index 9b15804e97..ec94691cae 100644 --- a/indra/llcommon/llfasttimer.cpp +++ b/indra/llcommon/llfasttimer.cpp @@ -568,6 +568,12 @@ LLFastTimer::NamedTimer& LLFastTimer::NamedTimer::getRootNamedTimer() } //static +LLFastTimer::NamedTimer& LLFastTimer::NamedTimer::getRootNamedTimer() +{ + return *NamedTimerFactory::instance().getRootTimer(); +} + +//static void LLFastTimer::nextFrame() { countsPerSecond(); // good place to calculate clock frequency diff --git a/indra/llcommon/llversionviewer.h b/indra/llcommon/llversionviewer.h index ae5e3ecade..0ea130e86b 100644 --- a/indra/llcommon/llversionviewer.h +++ b/indra/llcommon/llversionviewer.h @@ -29,7 +29,7 @@ const S32 LL_VERSION_MAJOR = 3; const S32 LL_VERSION_MINOR = 5; -const S32 LL_VERSION_PATCH = 1; +const S32 LL_VERSION_PATCH = 2; const S32 LL_VERSION_BUILD = 264760; const char * const LL_CHANNEL = "Second Life Developer"; diff --git a/indra/llcommon/tests/llleap_test.cpp b/indra/llcommon/tests/llleap_test.cpp index 9b755e9ca5..29060d4ef5 100644 --- a/indra/llcommon/tests/llleap_test.cpp +++ b/indra/llcommon/tests/llleap_test.cpp @@ -122,13 +122,10 @@ namespace tut // finding indra/lib/python. Use our __FILE__, with // raw-string syntax to deal with Windows pathnames. "mydir = os.path.dirname(r'" << __FILE__ << "')\n" - "try:\n" - " from llbase import llsd\n" - "except ImportError:\n" // We expect mydir to be .../indra/llcommon/tests. - " sys.path.insert(0,\n" - " os.path.join(mydir, os.pardir, os.pardir, 'lib', 'python'))\n" - " from indra.base import llsd\n" + "sys.path.insert(0,\n" + " os.path.join(mydir, os.pardir, os.pardir, 'lib', 'python'))\n" + "from indra.base import llsd\n" "\n" "class ProtocolError(Exception):\n" " def __init__(self, msg, data):\n" diff --git a/indra/llcommon/tests/llprocess_test.cpp b/indra/llcommon/tests/llprocess_test.cpp index 99186ed434..f188865eb0 100644 --- a/indra/llcommon/tests/llprocess_test.cpp +++ b/indra/llcommon/tests/llprocess_test.cpp @@ -608,6 +608,9 @@ namespace tut void object::test<5>() { set_test_name("exit(2)"); +#if LL_WINDOWS + skip("MAINT-2302: This frequently (though not always) fails on Windows."); +#endif PythonProcessLauncher py(get_test_name(), "import sys\n" "sys.exit(2)\n"); @@ -620,6 +623,9 @@ namespace tut void object::test<6>() { set_test_name("syntax_error:"); +#if LL_WINDOWS + skip("MAINT-2302: This frequently (though not always) fails on Windows."); +#endif PythonProcessLauncher py(get_test_name(), "syntax_error:\n"); py.mParams.files.add(LLProcess::FileParam()); // inherit stdin @@ -641,6 +647,9 @@ namespace tut void object::test<7>() { set_test_name("explicit kill()"); +#if LL_WINDOWS + skip("MAINT-2302: This frequently (though not always) fails on Windows."); +#endif PythonProcessLauncher py(get_test_name(), "from __future__ import with_statement\n" "import sys, time\n" @@ -685,6 +694,9 @@ namespace tut void object::test<8>() { set_test_name("implicit kill()"); +#if LL_WINDOWS + skip("MAINT-2302: This frequently (though not always) fails on Windows."); +#endif NamedTempFile out("out", "not started"); LLProcess::handle phandle(0); { @@ -957,10 +969,7 @@ namespace tut childout.getline(), "ok"); // important to get the implicit flush from std::endl py.mPy->getWritePipe().get_ostream() << "go" << std::endl; - for (i = 0; i < timeout && py.mPy->isRunning() && ! childout.contains("\n"); ++i) - { - yield(); - } + waitfor(*py.mPy); ensure("script never replied", childout.contains("\n")); ensure_equals("child didn't ack", childout.getline(), "ack"); ensure_equals("bad child termination", py.mPy->getStatus().mState, LLProcess::EXITED); diff --git a/indra/llcommon/tests/llsdserialize_test.cpp b/indra/llcommon/tests/llsdserialize_test.cpp index e625545763..4d436e8897 100644 --- a/indra/llcommon/tests/llsdserialize_test.cpp +++ b/indra/llcommon/tests/llsdserialize_test.cpp @@ -1523,10 +1523,7 @@ namespace tut "sys.path.insert(0,\n" " os.path.join(os.path.dirname(r'" __FILE__ "'),\n" " os.pardir, os.pardir, 'lib', 'python'))\n" - "try:\n" - " from llbase import llsd\n" - "except ImportError:\n" - " from indra.base import llsd\n") + "from indra.base import llsd\n") {} ~TestPythonCompatible() {} diff --git a/indra/llcorehttp/tests/test_httpstatus.hpp b/indra/llcorehttp/tests/test_httpstatus.hpp index f7b542d3b5..887315befc 100644 --- a/indra/llcorehttp/tests/test_httpstatus.hpp +++ b/indra/llcorehttp/tests/test_httpstatus.hpp @@ -91,6 +91,9 @@ template <> template <> void HttpStatusTestObjectType::test<2>() { set_test_name("HttpStatus memory structure"); +#if LL_WINDOWS + skip("MAINT-2302: This frequently (though not always) fails on Windows."); +#endif // Require that an HttpStatus object can be trivially // returned as a function return value in registers. @@ -104,6 +107,9 @@ template <> template <> void HttpStatusTestObjectType::test<3>() { set_test_name("HttpStatus valid error string conversion"); +#if LL_WINDOWS + skip("MAINT-2302: This frequently (though not always) fails on Windows."); +#endif HttpStatus status; status.mType = HttpStatus::EXT_CURL_EASY; @@ -136,6 +142,9 @@ template <> template <> void HttpStatusTestObjectType::test<4>() { set_test_name("HttpStatus invalid error string conversion"); +#if LL_WINDOWS + skip("MAINT-2302: This frequently (though not always) fails on Windows."); +#endif HttpStatus status; status.mType = HttpStatus::EXT_CURL_EASY; @@ -161,6 +170,9 @@ template <> template <> void HttpStatusTestObjectType::test<5>() { set_test_name("HttpStatus equality/inequality testing"); +#if LL_WINDOWS + skip("MAINT-2302: This frequently (though not always) fails on Windows."); +#endif // Make certain equality/inequality tests do not pass // through the bool conversion. Distinct successful @@ -181,6 +193,9 @@ template <> template <> void HttpStatusTestObjectType::test<6>() { set_test_name("HttpStatus basic HTTP status encoding"); +#if LL_WINDOWS + skip("MAINT-2302: This frequently (though not always) fails on Windows."); +#endif HttpStatus status; status.mType = 200; @@ -228,6 +243,9 @@ template <> template <> void HttpStatusTestObjectType::test<7>() { set_test_name("HttpStatus HTTP error text strings"); +#if LL_WINDOWS + skip("MAINT-2302: This frequently (though not always) fails on Windows."); +#endif HttpStatus status(100, HE_REPLY_ERROR); std::string msg(status.toString()); diff --git a/indra/llprimitive/CMakeLists.txt b/indra/llprimitive/CMakeLists.txt index 1768a06a27..0dd13916bf 100644 --- a/indra/llprimitive/CMakeLists.txt +++ b/indra/llprimitive/CMakeLists.txt @@ -24,6 +24,8 @@ include_directories(SYSTEM ) set(llprimitive_SOURCE_FILES + llmaterialid.cpp + llmaterial.cpp llmaterialtable.cpp llmediaentry.cpp llmodel.cpp @@ -41,6 +43,8 @@ set(llprimitive_HEADER_FILES CMakeLists.txt legacy_object_types.h + llmaterial.h + llmaterialid.h llmaterialtable.h llmediaentry.h llmodel.h diff --git a/indra/llprimitive/llmaterial.cpp b/indra/llprimitive/llmaterial.cpp new file mode 100644 index 0000000000..ce443dea1d --- /dev/null +++ b/indra/llprimitive/llmaterial.cpp @@ -0,0 +1,227 @@ +/** + * @file llmaterial.cpp + * @brief Material definition + * + * $LicenseInfo:firstyear=2006&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2010, Linden Research, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA + * $/LicenseInfo$ + */ + +#include "linden_common.h" + +#include "llmaterial.h" + +/** + * Materials cap parameters + */ +#define MATERIALS_CAP_NORMAL_MAP_FIELD "NormMap" +#define MATERIALS_CAP_NORMAL_MAP_OFFSET_X_FIELD "NormOffsetX" +#define MATERIALS_CAP_NORMAL_MAP_OFFSET_Y_FIELD "NormOffsetY" +#define MATERIALS_CAP_NORMAL_MAP_REPEAT_X_FIELD "NormRepeatX" +#define MATERIALS_CAP_NORMAL_MAP_REPEAT_Y_FIELD "NormRepeatY" +#define MATERIALS_CAP_NORMAL_MAP_ROTATION_FIELD "NormRotation" + +#define MATERIALS_CAP_SPECULAR_MAP_FIELD "SpecMap" +#define MATERIALS_CAP_SPECULAR_MAP_OFFSET_X_FIELD "SpecOffsetX" +#define MATERIALS_CAP_SPECULAR_MAP_OFFSET_Y_FIELD "SpecOffsetY" +#define MATERIALS_CAP_SPECULAR_MAP_REPEAT_X_FIELD "SpecRepeatX" +#define MATERIALS_CAP_SPECULAR_MAP_REPEAT_Y_FIELD "SpecRepeatY" +#define MATERIALS_CAP_SPECULAR_MAP_ROTATION_FIELD "SpecRotation" + +#define MATERIALS_CAP_SPECULAR_COLOR_FIELD "SpecColor" +#define MATERIALS_CAP_SPECULAR_EXP_FIELD "SpecExp" +#define MATERIALS_CAP_ENV_INTENSITY_FIELD "EnvIntensity" +#define MATERIALS_CAP_ALPHA_MASK_CUTOFF_FIELD "AlphaMaskCutoff" +#define MATERIALS_CAP_DIFFUSE_ALPHA_MODE_FIELD "DiffuseAlphaMode" + +const LLColor4U LLMaterial::DEFAULT_SPECULAR_LIGHT_COLOR(255,255,255,255); + +/** + * Materials constants + */ + +const F32 MATERIALS_MULTIPLIER = 10000.f; + +/** + * Helper functions + */ + +template<typename T> T getMaterialField(const LLSD& data, const std::string& field, const LLSD::Type field_type) +{ + if ( (data.has(field)) && (field_type == data[field].type()) ) + { + return (T)data[field]; + } + llerrs << "Missing or mistyped field '" << field << "' in material definition" << llendl; + return (T)LLSD(); +} + +// GCC didn't like the generic form above for some reason +template<> LLUUID getMaterialField(const LLSD& data, const std::string& field, const LLSD::Type field_type) +{ + if ( (data.has(field)) && (field_type == data[field].type()) ) + { + return data[field].asUUID(); + } + llerrs << "Missing or mistyped field '" << field << "' in material definition" << llendl; + return LLUUID::null; +} + +/** + * LLMaterial class + */ + +const LLMaterial LLMaterial::null; + +LLMaterial::LLMaterial() + : mNormalOffsetX(.0f) + , mNormalOffsetY(.0f) + , mNormalRepeatX(.0f) + , mNormalRepeatY(.0f) + , mNormalRotation(.0f) + , mSpecularOffsetX(.0f) + , mSpecularOffsetY(.0f) + , mSpecularRepeatX(.0f) + , mSpecularRepeatY(.0f) + , mSpecularRotation(.0f) + , mSpecularLightColor(LLMaterial::DEFAULT_SPECULAR_LIGHT_COLOR) + , mSpecularLightExponent(LLMaterial::DEFAULT_SPECULAR_LIGHT_EXPONENT) + , mEnvironmentIntensity(LLMaterial::DEFAULT_ENV_INTENSITY) + , mDiffuseAlphaMode(LLMaterial::DIFFUSE_ALPHA_MODE_BLEND) + , mAlphaMaskCutoff(0) +{ +} + +LLMaterial::LLMaterial(const LLSD& material_data) +{ + fromLLSD(material_data); +} + +LLSD LLMaterial::asLLSD() const +{ + LLSD material_data; + + material_data[MATERIALS_CAP_NORMAL_MAP_FIELD] = mNormalID; + material_data[MATERIALS_CAP_NORMAL_MAP_OFFSET_X_FIELD] = llround(mNormalOffsetX * MATERIALS_MULTIPLIER); + material_data[MATERIALS_CAP_NORMAL_MAP_OFFSET_Y_FIELD] = llround(mNormalOffsetY * MATERIALS_MULTIPLIER); + material_data[MATERIALS_CAP_NORMAL_MAP_REPEAT_X_FIELD] = llround(mNormalRepeatX * MATERIALS_MULTIPLIER); + material_data[MATERIALS_CAP_NORMAL_MAP_REPEAT_Y_FIELD] = llround(mNormalRepeatY * MATERIALS_MULTIPLIER); + material_data[MATERIALS_CAP_NORMAL_MAP_ROTATION_FIELD] = llround(mNormalRotation * MATERIALS_MULTIPLIER); + + material_data[MATERIALS_CAP_SPECULAR_MAP_FIELD] = mSpecularID; + material_data[MATERIALS_CAP_SPECULAR_MAP_OFFSET_X_FIELD] = llround(mSpecularOffsetX * MATERIALS_MULTIPLIER); + material_data[MATERIALS_CAP_SPECULAR_MAP_OFFSET_Y_FIELD] = llround(mSpecularOffsetY * MATERIALS_MULTIPLIER); + material_data[MATERIALS_CAP_SPECULAR_MAP_REPEAT_X_FIELD] = llround(mSpecularRepeatX * MATERIALS_MULTIPLIER); + material_data[MATERIALS_CAP_SPECULAR_MAP_REPEAT_Y_FIELD] = llround(mSpecularRepeatY * MATERIALS_MULTIPLIER); + material_data[MATERIALS_CAP_SPECULAR_MAP_ROTATION_FIELD] = llround(mSpecularRotation * MATERIALS_MULTIPLIER); + + material_data[MATERIALS_CAP_SPECULAR_COLOR_FIELD] = mSpecularLightColor.getValue(); + material_data[MATERIALS_CAP_SPECULAR_EXP_FIELD] = mSpecularLightExponent; + material_data[MATERIALS_CAP_ENV_INTENSITY_FIELD] = mEnvironmentIntensity; + material_data[MATERIALS_CAP_DIFFUSE_ALPHA_MODE_FIELD] = mDiffuseAlphaMode; + material_data[MATERIALS_CAP_ALPHA_MASK_CUTOFF_FIELD] = mAlphaMaskCutoff; + + return material_data; +} + +void LLMaterial::fromLLSD(const LLSD& material_data) +{ + mNormalID = getMaterialField<LLSD::UUID>(material_data, MATERIALS_CAP_NORMAL_MAP_FIELD, LLSD::TypeUUID); + mNormalOffsetX = (F32)getMaterialField<LLSD::Integer>(material_data, MATERIALS_CAP_NORMAL_MAP_OFFSET_X_FIELD, LLSD::TypeInteger) / MATERIALS_MULTIPLIER; + mNormalOffsetY = (F32)getMaterialField<LLSD::Integer>(material_data, MATERIALS_CAP_NORMAL_MAP_OFFSET_Y_FIELD, LLSD::TypeInteger) / MATERIALS_MULTIPLIER; + mNormalRepeatX = (F32)getMaterialField<LLSD::Integer>(material_data, MATERIALS_CAP_NORMAL_MAP_REPEAT_X_FIELD, LLSD::TypeInteger) / MATERIALS_MULTIPLIER; + mNormalRepeatY = (F32)getMaterialField<LLSD::Integer>(material_data, MATERIALS_CAP_NORMAL_MAP_REPEAT_Y_FIELD, LLSD::TypeInteger) / MATERIALS_MULTIPLIER; + mNormalRotation = (F32)getMaterialField<LLSD::Integer>(material_data, MATERIALS_CAP_NORMAL_MAP_ROTATION_FIELD, LLSD::TypeInteger) / MATERIALS_MULTIPLIER; + + mSpecularID = getMaterialField<LLSD::UUID>(material_data, MATERIALS_CAP_SPECULAR_MAP_FIELD, LLSD::TypeUUID); + mSpecularOffsetX = (F32)getMaterialField<LLSD::Integer>(material_data, MATERIALS_CAP_SPECULAR_MAP_OFFSET_X_FIELD, LLSD::TypeInteger) / MATERIALS_MULTIPLIER; + mSpecularOffsetY = (F32)getMaterialField<LLSD::Integer>(material_data, MATERIALS_CAP_SPECULAR_MAP_OFFSET_Y_FIELD, LLSD::TypeInteger) / MATERIALS_MULTIPLIER; + mSpecularRepeatX = (F32)getMaterialField<LLSD::Integer>(material_data, MATERIALS_CAP_SPECULAR_MAP_REPEAT_X_FIELD, LLSD::TypeInteger) / MATERIALS_MULTIPLIER; + mSpecularRepeatY = (F32)getMaterialField<LLSD::Integer>(material_data, MATERIALS_CAP_SPECULAR_MAP_REPEAT_Y_FIELD, LLSD::TypeInteger) / MATERIALS_MULTIPLIER; + mSpecularRotation = (F32)getMaterialField<LLSD::Integer>(material_data, MATERIALS_CAP_SPECULAR_MAP_ROTATION_FIELD, LLSD::TypeInteger) / MATERIALS_MULTIPLIER; + + mSpecularLightColor.setValue(getMaterialField<LLSD>(material_data, MATERIALS_CAP_SPECULAR_COLOR_FIELD, LLSD::TypeArray)); + mSpecularLightExponent = (U8)getMaterialField<LLSD::Integer>(material_data, MATERIALS_CAP_SPECULAR_EXP_FIELD, LLSD::TypeInteger); + mEnvironmentIntensity = (U8)getMaterialField<LLSD::Integer>(material_data, MATERIALS_CAP_ENV_INTENSITY_FIELD, LLSD::TypeInteger); + mDiffuseAlphaMode = (U8)getMaterialField<LLSD::Integer>(material_data, MATERIALS_CAP_DIFFUSE_ALPHA_MODE_FIELD, LLSD::TypeInteger); + mAlphaMaskCutoff = (U8)getMaterialField<LLSD::Integer>(material_data, MATERIALS_CAP_ALPHA_MASK_CUTOFF_FIELD, LLSD::TypeInteger); +} + +bool LLMaterial::isNull() const +{ + return (*this == null); +} + +bool LLMaterial::operator == (const LLMaterial& rhs) const +{ + return + (mNormalID == rhs.mNormalID) && (mNormalOffsetX == rhs.mNormalOffsetX) && (mNormalOffsetY == rhs.mNormalOffsetY) && + (mNormalRepeatX == rhs.mNormalRepeatX) && (mNormalRepeatY == rhs.mNormalRepeatY) && (mNormalRotation == rhs.mNormalRotation) && + (mSpecularID == rhs.mSpecularID) && (mSpecularOffsetX == rhs.mSpecularOffsetX) && (mSpecularOffsetY == rhs.mSpecularOffsetY) && + (mSpecularRepeatX == rhs.mSpecularRepeatX) && (mSpecularRepeatY == rhs.mSpecularRepeatY) && (mSpecularRotation == rhs.mSpecularRotation) && + (mSpecularLightColor == rhs.mSpecularLightColor) && (mSpecularLightExponent == rhs.mSpecularLightExponent) && + (mEnvironmentIntensity == rhs.mEnvironmentIntensity) && (mDiffuseAlphaMode == rhs.mDiffuseAlphaMode) && (mAlphaMaskCutoff == rhs.mAlphaMaskCutoff); +} + +bool LLMaterial::operator != (const LLMaterial& rhs) const +{ + return !(*this == rhs); +} + + +U32 LLMaterial::getShaderMask(U32 alpha_mode) +{ //NEVER incorporate this value into the message system -- this function will vary depending on viewer implementation + U32 ret = 0; + + //two least significant bits are "diffuse alpha mode" + if (alpha_mode != DIFFUSE_ALPHA_MODE_DEFAULT) + { + ret = alpha_mode; + } + else + { + ret = getDiffuseAlphaMode(); + } + + llassert(ret < SHADER_COUNT); + + //next bit is whether or not specular map is present + const U32 SPEC_BIT = 0x4; + + if (getSpecularID().notNull()) + { + ret |= SPEC_BIT; + } + + llassert(ret < SHADER_COUNT); + + //next bit is whether or not normal map is present + const U32 NORM_BIT = 0x8; + if (getNormalID().notNull()) + { + ret |= NORM_BIT; + } + + llassert(ret < SHADER_COUNT); + + return ret; +} + + diff --git a/indra/llprimitive/llmaterial.h b/indra/llprimitive/llmaterial.h new file mode 100644 index 0000000000..b265732adc --- /dev/null +++ b/indra/llprimitive/llmaterial.h @@ -0,0 +1,131 @@ +/** + * @file llmaterial.h + * @brief Material definition + * + * $LicenseInfo:firstyear=2006&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2010, Linden Research, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA + * $/LicenseInfo$ + */ + +#ifndef LL_LLMATERIAL_H +#define LL_LLMATERIAL_H + +#include <boost/shared_ptr.hpp> + +#include "llmaterialid.h" +#include "llsd.h" +#include "v4coloru.h" +#include "llpointer.h" +#include "llrefcount.h" + +class LLMaterial : public LLRefCount +{ +public: + + typedef enum + { + DIFFUSE_ALPHA_MODE_NONE = 0, + DIFFUSE_ALPHA_MODE_BLEND = 1, + DIFFUSE_ALPHA_MODE_MASK = 2, + DIFFUSE_ALPHA_MODE_EMISSIVE = 3, + DIFFUSE_ALPHA_MODE_DEFAULT = 4, + } eDiffuseAlphaMode; + + typedef enum + { + SHADER_COUNT = 16, + ALPHA_SHADER_COUNT = 4 + } eShaderCount; + + + + static const U8 DEFAULT_SPECULAR_LIGHT_EXPONENT = ((U8)(0.2f * 255)); + static const LLColor4U DEFAULT_SPECULAR_LIGHT_COLOR; + static const U8 DEFAULT_ENV_INTENSITY = 0; + + LLMaterial(); + LLMaterial(const LLSD& material_data); + + LLSD asLLSD() const; + void fromLLSD(const LLSD& material_data); + + const LLUUID& getNormalID() const { return mNormalID; } + void setNormalID(const LLUUID& normal_id) { mNormalID = normal_id; } + void getNormalOffset(F32& offset_x, F32& offset_y) const { offset_x = mNormalOffsetX; offset_y = mNormalOffsetY; } + void setNormalOffset(F32 offset_x, F32 offset_y) { mNormalOffsetX = offset_x; mNormalOffsetY = offset_y; } + void getNormalRepeat(F32& repeat_x, F32& repeat_y) const { repeat_x = mNormalRepeatX; repeat_y = mNormalRepeatY; } + void setNormalRepeat(F32 repeat_x, F32 repeat_y) { mNormalRepeatX = repeat_x; mNormalRepeatY = repeat_y; } + F32 getNormalRotation() const { return mNormalRotation; } + void setNormalRotation(F32 rot) { mNormalRotation = rot; } + + const LLUUID& getSpecularID() const { return mSpecularID; } + void setSpecularID(const LLUUID& specular_id) { mSpecularID = specular_id; } + void getSpecularOffset(F32& offset_x, F32& offset_y) const { offset_x = mSpecularOffsetX; offset_y = mSpecularOffsetY; } + void setSpecularOffset(F32 offset_x, F32 offset_y) { mSpecularOffsetX = offset_x; mSpecularOffsetY = offset_y; } + void getSpecularRepeat(F32& repeat_x, F32& repeat_y) const { repeat_x = mSpecularRepeatX; repeat_y = mSpecularRepeatY; } + void setSpecularRepeat(F32 repeat_x, F32 repeat_y) { mSpecularRepeatX = repeat_x; mSpecularRepeatY = repeat_y; } + F32 getSpecularRotation() const { return mSpecularRotation; } + void setSpecularRotation(F32 rot) { mSpecularRotation = rot; } + + const LLColor4U getSpecularLightColor() const { return mSpecularLightColor; } + void setSpecularLightColor(const LLColor4U& color) { mSpecularLightColor = color; } + U8 getSpecularLightExponent() const { return mSpecularLightExponent; } + void setSpecularLightExponent(U8 exponent) { mSpecularLightExponent = exponent; } + U8 getEnvironmentIntensity() const { return mEnvironmentIntensity; } + void setEnvironmentIntensity(U8 intensity) { mEnvironmentIntensity = intensity; } + U8 getDiffuseAlphaMode() const { return mDiffuseAlphaMode; } + void setDiffuseAlphaMode(U8 alpha_mode) { mDiffuseAlphaMode = alpha_mode; } + U8 getAlphaMaskCutoff() const { return mAlphaMaskCutoff; } + void setAlphaMaskCutoff(U8 cutoff) { mAlphaMaskCutoff = cutoff; } + + bool isNull() const; + static const LLMaterial null; + + bool operator == (const LLMaterial& rhs) const; + bool operator != (const LLMaterial& rhs) const; + + U32 getShaderMask(U32 alpha_mode = DIFFUSE_ALPHA_MODE_DEFAULT); + +protected: + LLUUID mNormalID; + F32 mNormalOffsetX; + F32 mNormalOffsetY; + F32 mNormalRepeatX; + F32 mNormalRepeatY; + F32 mNormalRotation; + + LLUUID mSpecularID; + F32 mSpecularOffsetX; + F32 mSpecularOffsetY; + F32 mSpecularRepeatX; + F32 mSpecularRepeatY; + F32 mSpecularRotation; + + LLColor4U mSpecularLightColor; + U8 mSpecularLightExponent; + U8 mEnvironmentIntensity; + U8 mDiffuseAlphaMode; + U8 mAlphaMaskCutoff; +}; + +typedef LLPointer<LLMaterial> LLMaterialPtr; + +#endif // LL_LLMATERIAL_H + diff --git a/indra/llprimitive/llmaterialid.cpp b/indra/llprimitive/llmaterialid.cpp new file mode 100644 index 0000000000..820f62c43c --- /dev/null +++ b/indra/llprimitive/llmaterialid.cpp @@ -0,0 +1,183 @@ +/** +* @file llmaterialid.cpp +* @brief Implementation of llmaterialid +* @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 "linden_common.h" + +#include "llmaterialid.h" + +#include <string> + +#include "llformat.h" + +const LLMaterialID LLMaterialID::null; + +LLMaterialID::LLMaterialID() +{ + clear(); +} + +LLMaterialID::LLMaterialID(const LLSD& pMaterialID) +{ + llassert(pMaterialID.isBinary()); + parseFromBinary(pMaterialID.asBinary()); +} + +LLMaterialID::LLMaterialID(const LLSD::Binary& pMaterialID) +{ + parseFromBinary(pMaterialID); +} + +LLMaterialID::LLMaterialID(const void* pMemory) +{ + set(pMemory); +} + +LLMaterialID::LLMaterialID(const LLMaterialID& pOtherMaterialID) +{ + copyFromOtherMaterialID(pOtherMaterialID); +} + +LLMaterialID::~LLMaterialID() +{ +} + +bool LLMaterialID::operator == (const LLMaterialID& pOtherMaterialID) const +{ + return (compareToOtherMaterialID(pOtherMaterialID) == 0); +} + +bool LLMaterialID::operator != (const LLMaterialID& pOtherMaterialID) const +{ + return (compareToOtherMaterialID(pOtherMaterialID) != 0); +} + +bool LLMaterialID::operator < (const LLMaterialID& pOtherMaterialID) const +{ + return (compareToOtherMaterialID(pOtherMaterialID) < 0); +} + +bool LLMaterialID::operator <= (const LLMaterialID& pOtherMaterialID) const +{ + return (compareToOtherMaterialID(pOtherMaterialID) <= 0); +} + +bool LLMaterialID::operator > (const LLMaterialID& pOtherMaterialID) const +{ + return (compareToOtherMaterialID(pOtherMaterialID) > 0); +} + +bool LLMaterialID::operator >= (const LLMaterialID& pOtherMaterialID) const +{ + return (compareToOtherMaterialID(pOtherMaterialID) >= 0); +} + +LLMaterialID& LLMaterialID::operator = (const LLMaterialID& pOtherMaterialID) +{ + copyFromOtherMaterialID(pOtherMaterialID); + return (*this); +} + +bool LLMaterialID::isNull() const +{ + return (compareToOtherMaterialID(LLMaterialID::null) == 0); +} + +const U8* LLMaterialID::get() const +{ + return mID; +} + +void LLMaterialID::set(const void* pMemory) +{ + llassert(pMemory != NULL); + + // assumes that the required size of memory is available + memcpy(mID, pMemory, MATERIAL_ID_SIZE * sizeof(U8)); +} + +void LLMaterialID::clear() +{ + memset(mID, 0, MATERIAL_ID_SIZE * sizeof(U8)); +} + +LLSD LLMaterialID::asLLSD() const +{ + LLSD::Binary materialIDBinary; + + materialIDBinary.resize(MATERIAL_ID_SIZE * sizeof(U8)); + memcpy(materialIDBinary.data(), mID, MATERIAL_ID_SIZE * sizeof(U8)); + + LLSD materialID = materialIDBinary; + return materialID; +} + +std::string LLMaterialID::asString() const +{ + std::string materialIDString; + for (unsigned int i = 0U; i < static_cast<unsigned int>(MATERIAL_ID_SIZE / sizeof(U32)); ++i) + { + if (i != 0U) + { + materialIDString += "-"; + } + const U32 *value = reinterpret_cast<const U32*>(&get()[i * sizeof(U32)]); + materialIDString += llformat("%08x", *value); + } + return materialIDString; +} + +std::ostream& operator<<(std::ostream& s, const LLMaterialID &material_id) +{ + s << material_id.asString(); + return s; +} + + +void LLMaterialID::parseFromBinary (const LLSD::Binary& pMaterialID) +{ + llassert(pMaterialID.size() == (MATERIAL_ID_SIZE * sizeof(U8))); + memcpy(mID, &pMaterialID[0], MATERIAL_ID_SIZE * sizeof(U8)); +} + +void LLMaterialID::copyFromOtherMaterialID(const LLMaterialID& pOtherMaterialID) +{ + memcpy(mID, pOtherMaterialID.get(), MATERIAL_ID_SIZE * sizeof(U8)); +} + +int LLMaterialID::compareToOtherMaterialID(const LLMaterialID& pOtherMaterialID) const +{ + int retVal = 0; + + for (unsigned int i = 0U; (retVal == 0) && (i < static_cast<unsigned int>(MATERIAL_ID_SIZE / sizeof(U32))); ++i) + { + const U32 *thisValue = reinterpret_cast<const U32*>(&get()[i * sizeof(U32)]); + const U32 *otherValue = reinterpret_cast<const U32*>(&pOtherMaterialID.get()[i * sizeof(U32)]); + retVal = ((*thisValue < *otherValue) ? -1 : ((*thisValue > *otherValue) ? 1 : 0)); + } + + return retVal; +} diff --git a/indra/llprimitive/llmaterialid.h b/indra/llprimitive/llmaterialid.h new file mode 100644 index 0000000000..0a95204085 --- /dev/null +++ b/indra/llprimitive/llmaterialid.h @@ -0,0 +1,76 @@ +/** +* @file llmaterialid.h +* @brief Header file for llmaterialid +* @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_LLMATERIALID_H +#define LL_LLMATERIALID_H + +#define MATERIAL_ID_SIZE 16 + +#include <string> + +class LLMaterialID +{ +public: + LLMaterialID(); + LLMaterialID(const LLSD& pMaterialID); + LLMaterialID(const LLSD::Binary& pMaterialID); + LLMaterialID(const void* pMemory); + LLMaterialID(const LLMaterialID& pOtherMaterialID); + ~LLMaterialID(); + + bool operator == (const LLMaterialID& pOtherMaterialID) const; + bool operator != (const LLMaterialID& pOtherMaterialID) const; + + bool operator < (const LLMaterialID& pOtherMaterialID) const; + bool operator <= (const LLMaterialID& pOtherMaterialID) const; + bool operator > (const LLMaterialID& pOtherMaterialID) const; + bool operator >= (const LLMaterialID& pOtherMaterialID) const; + + LLMaterialID& operator = (const LLMaterialID& pOtherMaterialID); + + bool isNull() const; + + const U8* get() const; + void set(const void* pMemory); + void clear(); + + LLSD asLLSD() const; + std::string asString() const; + + friend std::ostream& operator<<(std::ostream& s, const LLMaterialID &material_id); + + static const LLMaterialID null; + +private: + void parseFromBinary(const LLSD::Binary& pMaterialID); + void copyFromOtherMaterialID(const LLMaterialID& pOtherMaterialID); + int compareToOtherMaterialID(const LLMaterialID& pOtherMaterialID) const; + + U8 mID[MATERIAL_ID_SIZE]; +} ; + +#endif // LL_LLMATERIALID_H + diff --git a/indra/llprimitive/llprimitive.cpp b/indra/llprimitive/llprimitive.cpp index c340fc2d35..d69a23c1d7 100644 --- a/indra/llprimitive/llprimitive.cpp +++ b/indra/llprimitive/llprimitive.cpp @@ -39,6 +39,7 @@ #include "llsdutil_math.h" #include "llprimtexturelist.h" #include "imageids.h" +#include "llmaterialid.h" /** * exported constants @@ -314,6 +315,15 @@ S32 LLPrimitive::setTERotation(const U8 index, const F32 r) return mTextureList.setRotation(index, r); } +S32 LLPrimitive::setTEMaterialID(const U8 index, const LLMaterialID& pMaterialID) +{ + return mTextureList.setMaterialID(index, pMaterialID); +} + +S32 LLPrimitive::setTEMaterialParams(const U8 index, const LLMaterialPtr pMaterialParams) +{ + return mTextureList.setMaterialParams(index, pMaterialParams); +} //=============================================================== S32 LLPrimitive::setTEBumpShinyFullbright(const U8 index, const U8 bump) @@ -364,7 +374,6 @@ S32 LLPrimitive::setTEGlow(const U8 index, const F32 glow) return mTextureList.setGlow(index, glow); } - LLPCode LLPrimitive::legacyToPCode(const U8 legacy) { // TODO: Should this default to something valid? @@ -1044,7 +1053,7 @@ S32 LLPrimitive::unpackTEField(U8 *cur_ptr, U8 *buffer_end, U8 *data_ptr, U8 dat while ((cur_ptr < buffer_end) && (*cur_ptr != 0)) { -// llinfos << "TE exception" << llendl; + LL_DEBUGS("TEFieldDecode") << "TE exception" << LL_ENDL; i = 0; while (*cur_ptr & 0x80) { @@ -1059,14 +1068,16 @@ S32 LLPrimitive::unpackTEField(U8 *cur_ptr, U8 *buffer_end, U8 *data_ptr, U8 dat if (i & 0x01) { htonmemcpy(data_ptr+(j*data_size),cur_ptr,type,data_size); -// char foo[64]; -// sprintf(foo,"%x %x",*(data_ptr+(j*data_size)), *(data_ptr+(j*data_size)+1)); -// llinfos << "Assigning " << foo << " to face " << j << llendl; + LL_DEBUGS("TEFieldDecode") << "Assigning " ; + char foo[64]; + sprintf(foo,"%x %x",*(data_ptr+(j*data_size)), *(data_ptr+(j*data_size)+1)); + LL_CONT << foo << " to face " << j << LL_ENDL; } i = i >> 1; } cur_ptr += data_size; } + llassert(cur_ptr <= buffer_end); // buffer underrun return (S32)(cur_ptr - start_loc); } @@ -1088,6 +1099,7 @@ BOOL LLPrimitive::packTEMessage(LLMessageSystem *mesgsys) const U8 bump[MAX_TES]; U8 media_flags[MAX_TES]; U8 glow[MAX_TES]; + U8 material_data[MAX_TES*16]; const U32 MAX_TE_BUFFER = 4096; U8 packed_buffer[MAX_TE_BUFFER]; @@ -1125,6 +1137,9 @@ BOOL LLPrimitive::packTEMessage(LLMessageSystem *mesgsys) const bump[face_index] = te->getBumpShinyFullbright(); media_flags[face_index] = te->getMediaTexGen(); glow[face_index] = (U8) llround((llclamp(te->getGlow(), 0.0f, 1.0f) * (F32)0xFF)); + + // Directly sending material_ids is not safe! + memcpy(&material_data[face_index*16],getTE(face_index)->getMaterialID().get(),16); /* Flawfinder: ignore */ } cur_ptr += packTEField(cur_ptr, (U8 *)image_ids, sizeof(LLUUID),last_face_index, MVT_LLUUID); @@ -1146,6 +1161,8 @@ BOOL LLPrimitive::packTEMessage(LLMessageSystem *mesgsys) const cur_ptr += packTEField(cur_ptr, (U8 *)media_flags, 1 ,last_face_index, MVT_U8); *cur_ptr++ = 0; cur_ptr += packTEField(cur_ptr, (U8 *)glow, 1 ,last_face_index, MVT_U8); + *cur_ptr++ = 0; + cur_ptr += packTEField(cur_ptr, (U8 *)material_data, 16, last_face_index, MVT_LLUUID); } mesgsys->addBinaryDataFast(_PREHASH_TextureEntry, packed_buffer, (S32)(cur_ptr - packed_buffer)); @@ -1167,6 +1184,7 @@ BOOL LLPrimitive::packTEMessage(LLDataPacker &dp) const U8 bump[MAX_TES]; U8 media_flags[MAX_TES]; U8 glow[MAX_TES]; + U8 material_data[MAX_TES*16]; const U32 MAX_TE_BUFFER = 4096; U8 packed_buffer[MAX_TE_BUFFER]; @@ -1204,6 +1222,9 @@ BOOL LLPrimitive::packTEMessage(LLDataPacker &dp) const bump[face_index] = te->getBumpShinyFullbright(); media_flags[face_index] = te->getMediaTexGen(); glow[face_index] = (U8) llround((llclamp(te->getGlow(), 0.0f, 1.0f) * (F32)0xFF)); + + // Directly sending material_ids is not safe! + memcpy(&material_data[face_index*16],getTE(face_index)->getMaterialID().get(),16); /* Flawfinder: ignore */ } cur_ptr += packTEField(cur_ptr, (U8 *)image_ids, sizeof(LLUUID),last_face_index, MVT_LLUUID); @@ -1225,6 +1246,8 @@ BOOL LLPrimitive::packTEMessage(LLDataPacker &dp) const cur_ptr += packTEField(cur_ptr, (U8 *)media_flags, 1 ,last_face_index, MVT_U8); *cur_ptr++ = 0; cur_ptr += packTEField(cur_ptr, (U8 *)glow, 1 ,last_face_index, MVT_U8); + *cur_ptr++ = 0; + cur_ptr += packTEField(cur_ptr, (U8 *)material_data, 16, last_face_index, MVT_LLUUID); } dp.packBinaryData(packed_buffer, (S32)(cur_ptr - packed_buffer), "TextureEntry"); @@ -1234,6 +1257,9 @@ BOOL LLPrimitive::packTEMessage(LLDataPacker &dp) const S32 LLPrimitive::parseTEMessage(LLMessageSystem* mesgsys, char const* block_name, const S32 block_num, LLTEContents& tec) { S32 retval = 0; + // temp buffer for material ID processing + // data will end up in tec.material_id[] + U8 material_data[LLTEContents::MAX_TES*16]; if (block_num < 0) { @@ -1282,6 +1308,21 @@ S32 LLPrimitive::parseTEMessage(LLMessageSystem* mesgsys, char const* block_name cur_ptr++; cur_ptr += unpackTEField(cur_ptr, tec.packed_buffer+tec.size, (U8 *)tec.glow, 1, tec.face_count, MVT_U8); + if (cur_ptr < tec.packed_buffer + tec.size) + { + cur_ptr++; + cur_ptr += unpackTEField(cur_ptr, tec.packed_buffer+tec.size, (U8 *)material_data, 16, tec.face_count, MVT_LLUUID); + } + else + { + memset(material_data, 0, sizeof(material_data)); + } + + for (U32 i = 0; i < tec.face_count; i++) + { + tec.material_ids[i].set(&material_data[i * 16]); + } + retval = 1; return retval; } @@ -1302,6 +1343,9 @@ S32 LLPrimitive::applyParsedTEMessage(LLTEContents& tec) retval |= setTEBumpShinyFullbright(i, tec.bump[i]); retval |= setTEMediaTexGen(i, tec.media_flags[i]); retval |= setTEGlow(i, (F32)tec.glow[i] / (F32)0xFF); + + retval |= setTEMaterialID(i, tec.material_ids[i]); + coloru = LLColor4U(tec.colors + 4*i); // Note: This is an optimization to send common colors (1.f, 1.f, 1.f, 1.f) @@ -1328,6 +1372,15 @@ S32 LLPrimitive::unpackTEMessage(LLMessageSystem* mesgsys, char const* block_nam return applyParsedTEMessage(tec); } +S32 LLPrimitive::unpackTEMessage(LLMessageSystem* mesgsys, char const* block_name, const S32 block_num) +{ + LLTEContents tec; + S32 retval = parseTEMessage(mesgsys, block_name, block_num, tec); + if (!retval) + return retval; + return applyParsedTEMessage(tec); +} + S32 LLPrimitive::unpackTEMessage(LLDataPacker &dp) { // use a negative block_num to indicate a single-block read (a non-variable block) @@ -1336,6 +1389,7 @@ S32 LLPrimitive::unpackTEMessage(LLDataPacker &dp) // Avoid construction of 32 UUIDs per call static LLUUID image_ids[MAX_TES]; + static LLMaterialID material_ids[MAX_TES]; U8 image_data[MAX_TES*16]; U8 colors[MAX_TES*4]; @@ -1347,6 +1401,7 @@ S32 LLPrimitive::unpackTEMessage(LLDataPacker &dp) U8 bump[MAX_TES]; U8 media_flags[MAX_TES]; U8 glow[MAX_TES]; + U8 material_data[MAX_TES*16]; const U32 MAX_TE_BUFFER = 4096; U8 packed_buffer[MAX_TE_BUFFER]; @@ -1389,10 +1444,20 @@ S32 LLPrimitive::unpackTEMessage(LLDataPacker &dp) cur_ptr += unpackTEField(cur_ptr, packed_buffer+size, (U8 *)media_flags, 1, face_count, MVT_U8); cur_ptr++; cur_ptr += unpackTEField(cur_ptr, packed_buffer+size, (U8 *)glow, 1, face_count, MVT_U8); + if (cur_ptr < packed_buffer + size) + { + cur_ptr++; + cur_ptr += unpackTEField(cur_ptr, packed_buffer+size, (U8 *)material_data, 16, face_count, MVT_LLUUID); + } + else + { + memset(material_data, 0, sizeof(material_data)); + } for (i = 0; i < face_count; i++) { memcpy(image_ids[i].mData,&image_data[i*16],16); /* Flawfinder: ignore */ + material_ids[i].set(&material_data[i * 16]); } LLColor4 color; @@ -1406,6 +1471,7 @@ S32 LLPrimitive::unpackTEMessage(LLDataPacker &dp) retval |= setTEBumpShinyFullbright(i, bump[i]); retval |= setTEMediaTexGen(i, media_flags[i]); retval |= setTEGlow(i, (F32)glow[i] / (F32)0xFF); + retval |= setTEMaterialID(i, material_ids[i]); coloru = LLColor4U(colors + 4*i); // Note: This is an optimization to send common colors (1.f, 1.f, 1.f, 1.f) diff --git a/indra/llprimitive/llprimitive.h b/indra/llprimitive/llprimitive.h index 6a8b59c81c..b1f8090416 100644 --- a/indra/llprimitive/llprimitive.h +++ b/indra/llprimitive/llprimitive.h @@ -42,6 +42,7 @@ class LLMessageSystem; class LLVolumeParams; class LLColor4; class LLColor3; +class LLMaterialID; class LLTextureEntry; class LLDataPacker; class LLVolumeMgr; @@ -309,7 +310,8 @@ struct LLTEContents U8 bump[MAX_TES]; U8 media_flags[MAX_TES]; U8 glow[MAX_TES]; - + LLMaterialID material_ids[MAX_TES]; + static const U32 MAX_TE_BUFFER = 4096; U8 packed_buffer[MAX_TE_BUFFER]; @@ -381,6 +383,8 @@ public: virtual S32 setTEFullbright(const U8 te, const U8 fullbright); virtual S32 setTEMediaFlags(const U8 te, const U8 flags); virtual S32 setTEGlow(const U8 te, const F32 glow); + virtual S32 setTEMaterialID(const U8 te, const LLMaterialID& pMaterialID); + virtual S32 setTEMaterialParams(const U8 index, const LLMaterialPtr pMaterialParams); virtual BOOL setMaterial(const U8 material); // returns TRUE if material changed void copyTEs(const LLPrimitive *primitive); diff --git a/indra/llprimitive/llprimtexturelist.cpp b/indra/llprimitive/llprimtexturelist.cpp index 7ef87ed382..537e7a6695 100644 --- a/indra/llprimitive/llprimtexturelist.cpp +++ b/indra/llprimitive/llprimtexturelist.cpp @@ -27,6 +27,7 @@ #include "linden_common.h" #include "llprimtexturelist.h" +#include "llmaterialid.h" #include "lltextureentry.h" // static @@ -358,6 +359,24 @@ S32 LLPrimTextureList::setGlow(const U8 index, const F32 glow) return TEM_CHANGE_NONE; } +S32 LLPrimTextureList::setMaterialID(const U8 index, const LLMaterialID& pMaterialID) +{ + if (index < mEntryList.size()) + { + return mEntryList[index]->setMaterialID(pMaterialID); + } + return TEM_CHANGE_NONE; +} + +S32 LLPrimTextureList::setMaterialParams(const U8 index, const LLMaterialPtr pMaterialParams) +{ + if (index < mEntryList.size()) + { + return mEntryList[index]->setMaterialParams(pMaterialParams); + } + return TEM_CHANGE_NONE; +} + S32 LLPrimTextureList::size() const { return mEntryList.size(); diff --git a/indra/llprimitive/llprimtexturelist.h b/indra/llprimitive/llprimtexturelist.h index 3cfa52f1d5..d7fabbbb79 100644 --- a/indra/llprimitive/llprimtexturelist.h +++ b/indra/llprimitive/llprimtexturelist.h @@ -31,9 +31,11 @@ #include "lluuid.h" #include "v3color.h" #include "v4color.h" +#include "llmaterial.h" class LLTextureEntry; +class LLMaterialID; // this is a list of LLTextureEntry*'s because in practice the list's elements // are of some derived class: LLFooTextureEntry @@ -102,6 +104,8 @@ public: S32 setFullbright(const U8 index, const U8 t); S32 setMediaFlags(const U8 index, const U8 media_flags); S32 setGlow(const U8 index, const F32 glow); + S32 setMaterialID(const U8 index, const LLMaterialID& pMaterialID); + S32 setMaterialParams(const U8 index, const LLMaterialPtr pMaterialParams); S32 size() const; diff --git a/indra/llprimitive/lltextureentry.cpp b/indra/llprimitive/lltextureentry.cpp index 34eff17519..691216e035 100644 --- a/indra/llprimitive/lltextureentry.cpp +++ b/indra/llprimitive/lltextureentry.cpp @@ -29,6 +29,7 @@ #include "lluuid.h" #include "llmediaentry.h" #include "lltextureentry.h" +#include "llmaterialid.h" #include "llsdutil_math.h" #include "v4color.h" @@ -83,6 +84,8 @@ LLTextureEntry::LLTextureEntry(const LLTextureEntry &rhs) mBump = rhs.mBump; mMediaFlags = rhs.mMediaFlags; mGlow = rhs.mGlow; + mMaterialID = rhs.mMaterialID; + if (rhs.mMediaEntry != NULL) { // Make a copy mMediaEntry = new LLMediaEntry(*rhs.mMediaEntry); @@ -103,6 +106,7 @@ LLTextureEntry &LLTextureEntry::operator=(const LLTextureEntry &rhs) mBump = rhs.mBump; mMediaFlags = rhs.mMediaFlags; mGlow = rhs.mGlow; + mMaterialID = rhs.mMaterialID; if (mMediaEntry != NULL) { delete mMediaEntry; } @@ -130,6 +134,7 @@ void LLTextureEntry::init(const LLUUID& tex_id, F32 scale_s, F32 scale_t, F32 of mBump = bump; mMediaFlags = 0x0; mGlow = 0; + mMaterialID.clear(); setColor(LLColor4(1.f, 1.f, 1.f, 1.f)); if (mMediaEntry != NULL) { @@ -159,6 +164,7 @@ bool LLTextureEntry::operator!=(const LLTextureEntry &rhs) const if (mBump != rhs.mBump) return (true); if (mMediaFlags != rhs.mMediaFlags) return (true); if (mGlow != rhs.mGlow) return (true); + if (mMaterialID != rhs.mMaterialID) return (true); return(false); } @@ -174,6 +180,7 @@ bool LLTextureEntry::operator==(const LLTextureEntry &rhs) const if (mBump != rhs.mBump) return (false); if (mMediaFlags != rhs.mMediaFlags) return false; if (mGlow != rhs.mGlow) return false; + if (mMaterialID != rhs.mMaterialID) return (false); return(true); } @@ -523,6 +530,30 @@ S32 LLTextureEntry::setGlow(F32 glow) return TEM_CHANGE_NONE; } +S32 LLTextureEntry::setMaterialID(const LLMaterialID& pMaterialID) +{ + if (mMaterialID != pMaterialID) + { + mMaterialID = pMaterialID; + if (mMaterialID.isNull()) + { + setMaterialParams(NULL); + } + return TEM_CHANGE_TEXTURE; + } + return TEM_CHANGE_NONE; +} + +S32 LLTextureEntry::setMaterialParams(const LLMaterialPtr pMaterialParams) +{ + if (mMaterial != pMaterialParams) + { + mMaterial = pMaterialParams; + return TEM_CHANGE_TEXTURE; + } + return TEM_CHANGE_NONE; +} + void LLTextureEntry::setMediaData(const LLMediaEntry &media_entry) { mMediaFlags |= MF_HAS_MEDIA; diff --git a/indra/llprimitive/lltextureentry.h b/indra/llprimitive/lltextureentry.h index 437b85e03f..c443ebcb30 100644 --- a/indra/llprimitive/lltextureentry.h +++ b/indra/llprimitive/lltextureentry.h @@ -30,6 +30,8 @@ #include "lluuid.h" #include "v4color.h" #include "llsd.h" +#include "llmaterialid.h" +#include "llmaterial.h" // These bits are used while unpacking TEM messages to tell which aspects of // the texture entry changed. @@ -121,6 +123,8 @@ public: S32 setTexGen(U8 texGen); S32 setMediaTexGen(U8 media); S32 setGlow(F32 glow); + S32 setMaterialID(const LLMaterialID& pMaterialID); + S32 setMaterialParams(const LLMaterialPtr pMaterialParams); virtual const LLUUID &getID() const { return mID; } const LLColor4 &getColor() const { return mColor; } @@ -139,6 +143,8 @@ public: U8 getTexGen() const { return mMediaFlags & TEM_TEX_GEN_MASK; } U8 getMediaTexGen() const { return mMediaFlags; } F32 getGlow() const { return mGlow; } + const LLMaterialID& getMaterialID() const { return mMaterialID; }; + const LLMaterialPtr getMaterialParams() const { return mMaterial; }; // *NOTE: it is possible for hasMedia() to return true, but getMediaData() to return NULL. // CONVERSELY, it is also possible for hasMedia() to return false, but getMediaData() @@ -193,6 +199,8 @@ protected: U8 mBump; // Bump map, shiny, and fullbright U8 mMediaFlags; // replace with web page, movie, etc. F32 mGlow; + LLMaterialID mMaterialID; + LLMaterialPtr mMaterial; // Note the media data is not sent via the same message structure as the rest of the TE LLMediaEntry* mMediaEntry; // The media data for the face diff --git a/indra/llrender/llgl.cpp b/indra/llrender/llgl.cpp index c8a8e9fcf7..088ba95b75 100644 --- a/indra/llrender/llgl.cpp +++ b/indra/llrender/llgl.cpp @@ -216,6 +216,11 @@ PFNGLGETQUERYIVARBPROC glGetQueryivARB = NULL; PFNGLGETQUERYOBJECTIVARBPROC glGetQueryObjectivARB = NULL; PFNGLGETQUERYOBJECTUIVARBPROC glGetQueryObjectuivARB = NULL; +// GL_ARB_timer_query +PFNGLQUERYCOUNTERPROC glQueryCounter = NULL; +PFNGLGETQUERYOBJECTI64VPROC glGetQueryObjecti64v = NULL; +PFNGLGETQUERYOBJECTUI64VPROC glGetQueryObjectui64v = NULL; + // GL_ARB_point_parameters PFNGLPOINTPARAMETERFARBPROC glPointParameterfARB = NULL; PFNGLPOINTPARAMETERFVARBPROC glPointParameterfvARB = NULL; @@ -421,6 +426,7 @@ LLGLManager::LLGLManager() : mHasFragmentShader(FALSE), mNumTextureImageUnits(0), mHasOcclusionQuery(FALSE), + mHasTimerQuery(FALSE), mHasOcclusionQuery2(FALSE), mHasPointParameters(FALSE), mHasDrawBuffers(FALSE), @@ -445,7 +451,9 @@ LLGLManager::LLGLManager() : mIsGFFX(FALSE), mATIOffsetVerticalLines(FALSE), mATIOldDriver(FALSE), - +#if LL_DARWIN + mIsMobileGF(FALSE), +#endif mHasRequirements(TRUE), mHasSeparateSpecularColor(FALSE), @@ -637,6 +645,13 @@ bool LLGLManager::initGL() { mIsGF3 = TRUE; } +#if LL_DARWIN + else if ((mGLRenderer.find("9400M") != std::string::npos) + || (mGLRenderer.find("9600M") != std::string::npos)) + { + mIsMobileGF = TRUE; + } +#endif } else if (mGLVendor.find("INTEL") != std::string::npos @@ -745,12 +760,13 @@ bool LLGLManager::initGL() { //using multisample textures on ATI results in black screen for some reason mHasTextureMultisample = FALSE; } -#endif + if (mIsIntel && mGLVersion <= 3.f) { //never try to use framebuffer objects on older intel drivers (crashy) mHasFramebufferObject = FALSE; } +#endif if (mHasFramebufferObject) { @@ -947,13 +963,15 @@ void LLGLManager::initExtensions() mHasARBEnvCombine = ExtensionExists("GL_ARB_texture_env_combine", gGLHExts.mSysExts); mHasCompressedTextures = glh_init_extensions("GL_ARB_texture_compression"); mHasOcclusionQuery = ExtensionExists("GL_ARB_occlusion_query", gGLHExts.mSysExts); + mHasTimerQuery = ExtensionExists("GL_ARB_timer_query", gGLHExts.mSysExts); mHasOcclusionQuery2 = ExtensionExists("GL_ARB_occlusion_query2", gGLHExts.mSysExts); mHasVertexBufferObject = ExtensionExists("GL_ARB_vertex_buffer_object", gGLHExts.mSysExts); mHasVertexArrayObject = ExtensionExists("GL_ARB_vertex_array_object", gGLHExts.mSysExts); mHasSync = ExtensionExists("GL_ARB_sync", gGLHExts.mSysExts); mHasMapBufferRange = ExtensionExists("GL_ARB_map_buffer_range", gGLHExts.mSysExts); mHasFlushBufferRange = ExtensionExists("GL_APPLE_flush_buffer_range", gGLHExts.mSysExts); - mHasDepthClamp = ExtensionExists("GL_ARB_depth_clamp", gGLHExts.mSysExts) || ExtensionExists("GL_NV_depth_clamp", gGLHExts.mSysExts); + //mHasDepthClamp = ExtensionExists("GL_ARB_depth_clamp", gGLHExts.mSysExts) || ExtensionExists("GL_NV_depth_clamp", gGLHExts.mSysExts); + mHasDepthClamp = FALSE; // mask out FBO support when packed_depth_stencil isn't there 'cause we need it for LLRenderTarget -Brad #ifdef GL_ARB_framebuffer_object mHasFramebufferObject = ExtensionExists("GL_ARB_framebuffer_object", gGLHExts.mSysExts); @@ -963,6 +981,15 @@ void LLGLManager::initExtensions() ExtensionExists("GL_EXT_framebuffer_multisample", gGLHExts.mSysExts) && ExtensionExists("GL_EXT_packed_depth_stencil", gGLHExts.mSysExts); #endif +#ifdef GL_EXT_texture_sRGB + mHassRGBTexture = ExtensionExists("GL_EXT_texture_sRGB", gGLHExts.mSysExts); +#endif + +#ifdef GL_ARB_framebuffer_sRGB + mHassRGBFramebuffer = ExtensionExists("GL_ARB_framebuffer_sRGB", gGLHExts.mSysExts); +#else + mHassRGBFramebuffer = ExtensionExists("GL_EXT_framebuffer_sRGB", gGLHExts.mSysExts); +#endif mHasMipMapGeneration = mHasFramebufferObject || mGLVersion >= 1.4f; @@ -1253,6 +1280,13 @@ void LLGLManager::initExtensions() glGetQueryObjectivARB = (PFNGLGETQUERYOBJECTIVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glGetQueryObjectivARB"); glGetQueryObjectuivARB = (PFNGLGETQUERYOBJECTUIVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glGetQueryObjectuivARB"); } + if (mHasTimerQuery) + { + llinfos << "initExtensions() TimerQuery-related procs..." << llendl; + glQueryCounter = (PFNGLQUERYCOUNTERPROC) GLH_EXT_GET_PROC_ADDRESS("glQueryCounter"); + glGetQueryObjecti64v = (PFNGLGETQUERYOBJECTI64VPROC) GLH_EXT_GET_PROC_ADDRESS("glGetQueryObjecti64v"); + glGetQueryObjectui64v = (PFNGLGETQUERYOBJECTUI64VPROC) GLH_EXT_GET_PROC_ADDRESS("glGetQueryObjectui64v"); + } if (mHasPointParameters) { llinfos << "initExtensions() PointParameters-related procs..." << llendl; diff --git a/indra/llrender/llgl.h b/indra/llrender/llgl.h index d70e764769..60597fd090 100644 --- a/indra/llrender/llgl.h +++ b/indra/llrender/llgl.h @@ -98,6 +98,7 @@ public: BOOL mHasFragmentShader; S32 mNumTextureImageUnits; BOOL mHasOcclusionQuery; + BOOL mHasTimerQuery; BOOL mHasOcclusionQuery2; BOOL mHasPointParameters; BOOL mHasDrawBuffers; @@ -115,6 +116,8 @@ public: BOOL mHasARBEnvCombine; BOOL mHasCubeMap; BOOL mHasDebugOutput; + BOOL mHassRGBTexture; + BOOL mHassRGBFramebuffer; // Vendor-specific extensions BOOL mIsATI; @@ -126,6 +129,11 @@ public: BOOL mATIOffsetVerticalLines; BOOL mATIOldDriver; +#if LL_DARWIN + // Needed to distinguish problem cards on older Macs that break with Materials + BOOL mIsMobileGF; +#endif + // Whether this version of GL is good enough for SL to use BOOL mHasRequirements; diff --git a/indra/llrender/llglheaders.h b/indra/llrender/llglheaders.h index 509de51f4d..dace572953 100644 --- a/indra/llrender/llglheaders.h +++ b/indra/llrender/llglheaders.h @@ -116,6 +116,11 @@ extern PFNGLGETQUERYIVARBPROC glGetQueryivARB; extern PFNGLGETQUERYOBJECTIVARBPROC glGetQueryObjectivARB; extern PFNGLGETQUERYOBJECTUIVARBPROC glGetQueryObjectuivARB; +// GL_ARB_timer_query +extern PFNGLQUERYCOUNTERPROC glQueryCounter; +extern PFNGLGETQUERYOBJECTI64VPROC glGetQueryObjecti64v; +extern PFNGLGETQUERYOBJECTUI64VPROC glGetQueryObjectui64v; + // GL_ARB_point_parameters extern PFNGLPOINTPARAMETERFARBPROC glPointParameterfARB; extern PFNGLPOINTPARAMETERFVARBPROC glPointParameterfvARB; @@ -378,6 +383,11 @@ extern PFNGLGETQUERYIVARBPROC glGetQueryivARB; extern PFNGLGETQUERYOBJECTIVARBPROC glGetQueryObjectivARB; extern PFNGLGETQUERYOBJECTUIVARBPROC glGetQueryObjectuivARB; +// GL_ARB_timer_query +extern PFNGLQUERYCOUNTERPROC glQueryCounter; +extern PFNGLGETQUERYOBJECTI64VPROC glGetQueryObjecti64v; +extern PFNGLGETQUERYOBJECTUI64VPROC glGetQueryObjectui64v; + // GL_ARB_point_parameters extern PFNGLPOINTPARAMETERFARBPROC glPointParameterfARB; extern PFNGLPOINTPARAMETERFVARBPROC glPointParameterfvARB; @@ -619,6 +629,12 @@ extern PFNGLGETQUERYIVARBPROC glGetQueryivARB; extern PFNGLGETQUERYOBJECTIVARBPROC glGetQueryObjectivARB; extern PFNGLGETQUERYOBJECTUIVARBPROC glGetQueryObjectuivARB; +// GL_ARB_timer_query +extern PFNGLQUERYCOUNTERPROC glQueryCounter; +extern PFNGLGETQUERYOBJECTI64VPROC glGetQueryObjecti64v; +extern PFNGLGETQUERYOBJECTUI64VPROC glGetQueryObjectui64v; + + // GL_ARB_point_parameters extern PFNGLPOINTPARAMETERFARBPROC glPointParameterfARB; extern PFNGLPOINTPARAMETERFVARBPROC glPointParameterfvARB; diff --git a/indra/llrender/llglslshader.cpp b/indra/llrender/llglslshader.cpp index 7cbf39096e..62191b4c1a 100644 --- a/indra/llrender/llglslshader.cpp +++ b/indra/llrender/llglslshader.cpp @@ -53,6 +53,12 @@ GLhandleARB LLGLSLShader::sCurBoundShader = 0; LLGLSLShader* LLGLSLShader::sCurBoundShaderPtr = NULL; S32 LLGLSLShader::sIndexedTextureChannels = 0; bool LLGLSLShader::sNoFixedFunction = false; +bool LLGLSLShader::sProfileEnabled = false; +std::set<LLGLSLShader*> LLGLSLShader::sInstances; +U64 LLGLSLShader::sTotalTimeElapsed = 0; +U32 LLGLSLShader::sTotalTrianglesDrawn = 0; +U64 LLGLSLShader::sTotalSamplesDrawn = 0; +U32 LLGLSLShader::sTotalDrawCalls = 0; //UI shader -- declared here so llui_libtest will link properly LLGLSLShader gUIProgram; @@ -87,19 +93,194 @@ LLShaderFeatures::LLShaderFeatures() //=============================== // LLGLSL Shader implementation //=============================== + +//static +void LLGLSLShader::initProfile() +{ + sProfileEnabled = true; + sTotalTimeElapsed = 0; + sTotalTrianglesDrawn = 0; + sTotalSamplesDrawn = 0; + sTotalDrawCalls = 0; + + for (std::set<LLGLSLShader*>::iterator iter = sInstances.begin(); iter != sInstances.end(); ++iter) + { + (*iter)->clearStats(); + } +} + + +struct LLGLSLShaderCompareTimeElapsed +{ + bool operator()(const LLGLSLShader* const& lhs, const LLGLSLShader* const& rhs) + { + return lhs->mTimeElapsed < rhs->mTimeElapsed; + } +}; + +//static +void LLGLSLShader::finishProfile() +{ + sProfileEnabled = false; + + std::vector<LLGLSLShader*> sorted; + + for (std::set<LLGLSLShader*>::iterator iter = sInstances.begin(); iter != sInstances.end(); ++iter) + { + sorted.push_back(*iter); + } + + std::sort(sorted.begin(), sorted.end(), LLGLSLShaderCompareTimeElapsed()); + + for (std::vector<LLGLSLShader*>::iterator iter = sorted.begin(); iter != sorted.end(); ++iter) + { + (*iter)->dumpStats(); + } + + llinfos << "-----------------------------------" << llendl; + llinfos << "Total rendering time: " << llformat("%.4f ms", sTotalTimeElapsed/1000000.f) << llendl; + llinfos << "Total samples drawn: " << llformat("%.4f million", sTotalSamplesDrawn/1000000.f) << llendl; + llinfos << "Total triangles drawn: " << llformat("%.3f million", sTotalTrianglesDrawn/1000000.f) << llendl; +} + +void LLGLSLShader::clearStats() +{ + mTrianglesDrawn = 0; + mTimeElapsed = 0; + mSamplesDrawn = 0; + mDrawCalls = 0; +} + +void LLGLSLShader::dumpStats() +{ + if (mDrawCalls > 0) + { + llinfos << "=============================================" << llendl; + llinfos << mName << llendl; + for (U32 i = 0; i < mShaderFiles.size(); ++i) + { + llinfos << mShaderFiles[i].first << llendl; + } + llinfos << "=============================================" << llendl; + + F32 ms = mTimeElapsed/1000000.f; + F32 seconds = ms/1000.f; + + F32 pct_tris = (F32) mTrianglesDrawn/(F32)sTotalTrianglesDrawn*100.f; + F32 tris_sec = (F32) (mTrianglesDrawn/1000000.0); + tris_sec /= seconds; + + F32 pct_samples = (F32) ((F64)mSamplesDrawn/(F64)sTotalSamplesDrawn)*100.f; + F32 samples_sec = (F32) mSamplesDrawn/1000000000.0; + samples_sec /= seconds; + + F32 pct_calls = (F32) mDrawCalls/(F32)sTotalDrawCalls*100.f; + U32 avg_batch = mTrianglesDrawn/mDrawCalls; + + llinfos << "Triangles Drawn: " << mTrianglesDrawn << " " << llformat("(%.2f pct of total, %.3f million/sec)", pct_tris, tris_sec ) << llendl; + llinfos << "Draw Calls: " << mDrawCalls << " " << llformat("(%.2f pct of total, avg %d tris/call)", pct_calls, avg_batch) << llendl; + llinfos << "SamplesDrawn: " << mSamplesDrawn << " " << llformat("(%.2f pct of total, %.3f billion/sec)", pct_samples, samples_sec) << llendl; + llinfos << "Time Elapsed: " << mTimeElapsed << " " << llformat("(%.2f pct of total, %.5f ms)\n", (F32) ((F64)mTimeElapsed/(F64)sTotalTimeElapsed)*100.f, ms) << llendl; + } +} + +//static +void LLGLSLShader::startProfile() +{ + if (sProfileEnabled && sCurBoundShaderPtr) + { + sCurBoundShaderPtr->placeProfileQuery(); + } + +} + +//static +void LLGLSLShader::stopProfile(U32 count, U32 mode) +{ + if (sProfileEnabled) + { + sCurBoundShaderPtr->readProfileQuery(count, mode); + } +} + +void LLGLSLShader::placeProfileQuery() +{ +#if !LL_DARWIN + if (mTimerQuery == 0) + { + glGenQueriesARB(1, &mTimerQuery); + } + + glBeginQueryARB(GL_SAMPLES_PASSED, 1); + glBeginQueryARB(GL_TIME_ELAPSED, mTimerQuery); +#endif +} + +void LLGLSLShader::readProfileQuery(U32 count, U32 mode) +{ +#if !LL_DARWIN + glEndQueryARB(GL_TIME_ELAPSED); + glEndQueryARB(GL_SAMPLES_PASSED); + + U64 time_elapsed = 0; + glGetQueryObjectui64v(mTimerQuery, GL_QUERY_RESULT, &time_elapsed); + + U64 samples_passed = 0; + glGetQueryObjectui64v(1, GL_QUERY_RESULT, &samples_passed); + + sTotalTimeElapsed += time_elapsed; + mTimeElapsed += time_elapsed; + + sTotalSamplesDrawn += samples_passed; + mSamplesDrawn += samples_passed; + + U32 tri_count = 0; + switch (mode) + { + case LLRender::TRIANGLES: tri_count = count/3; break; + case LLRender::TRIANGLE_FAN: tri_count = count-2; break; + case LLRender::TRIANGLE_STRIP: tri_count = count-2; break; + default: tri_count = count; break; //points lines etc just use primitive count + } + + mTrianglesDrawn += tri_count; + sTotalTrianglesDrawn += tri_count; + + sTotalDrawCalls++; + mDrawCalls++; +#endif +} + + + LLGLSLShader::LLGLSLShader() - : mProgramObject(0), mActiveTextureChannels(0), mShaderLevel(0), mShaderGroup(SG_DEFAULT), mUniformsDirty(FALSE) + : mProgramObject(0), + mAttributeMask(0), + mTotalUniformSize(0), + mActiveTextureChannels(0), + mShaderLevel(0), + mShaderGroup(SG_DEFAULT), + mUniformsDirty(FALSE), + mTimerQuery(0) { + +} +LLGLSLShader::~LLGLSLShader() +{ + } void LLGLSLShader::unload() { + sInstances.erase(this); + stop_glerror(); mAttribute.clear(); mTexture.clear(); mUniform.clear(); mShaderFiles.clear(); + mDefines.clear(); if (mProgramObject) { @@ -133,6 +314,8 @@ BOOL LLGLSLShader::createShader(vector<string> * attributes, U32 varying_count, const char** varyings) { + sInstances.insert(this); + //reloading, reset matrix hash values for (U32 i = 0; i < LLRender::NUM_MATRIX_MODES; ++i) { @@ -150,7 +333,7 @@ BOOL LLGLSLShader::createShader(vector<string> * attributes, vector< pair<string,GLenum> >::iterator fileIter = mShaderFiles.begin(); for ( ; fileIter != mShaderFiles.end(); fileIter++ ) { - GLhandleARB shaderhandle = LLShaderMgr::instance()->loadShaderFile((*fileIter).first, mShaderLevel, (*fileIter).second, mFeatures.mIndexedTextureChannels); + GLhandleARB shaderhandle = LLShaderMgr::instance()->loadShaderFile((*fileIter).first, mShaderLevel, (*fileIter).second, &mDefines, mFeatures.mIndexedTextureChannels); LL_DEBUGS("ShaderLoading") << "SHADER FILE: " << (*fileIter).first << " mShaderLevel=" << mShaderLevel << LL_ENDL; if (shaderhandle > 0) { @@ -285,6 +468,8 @@ BOOL LLGLSLShader::mapAttributes(const vector<string> * attributes) if (res) { //read back channel locations + mAttributeMask = 0; + //read back reserved channels first for (U32 i = 0; i < LLShaderMgr::instance()->mReservedAttribs.size(); i++) { @@ -293,6 +478,7 @@ BOOL LLGLSLShader::mapAttributes(const vector<string> * attributes) if (index != -1) { mAttribute[i] = index; + mAttributeMask |= 1 << i; LL_DEBUGS("ShaderLoading") << "Attribute " << name << " assigned to channel " << index << LL_ENDL; } } @@ -325,11 +511,56 @@ void LLGLSLShader::mapUniform(GLint index, const vector<string> * uniforms) GLenum type; GLsizei length; - GLint size; + GLint size = -1; char name[1024]; /* Flawfinder: ignore */ name[0] = 0; + glGetActiveUniformARB(mProgramObject, index, 1024, &length, &size, &type, (GLcharARB *)name); +#if !LL_DARWIN + if (size > 0) + { + switch(type) + { + case GL_FLOAT_VEC2: size *= 2; break; + case GL_FLOAT_VEC3: size *= 3; break; + case GL_FLOAT_VEC4: size *= 4; break; + case GL_DOUBLE: size *= 2; break; + case GL_DOUBLE_VEC2: size *= 2; break; + case GL_DOUBLE_VEC3: size *= 6; break; + case GL_DOUBLE_VEC4: size *= 8; break; + case GL_INT_VEC2: size *= 2; break; + case GL_INT_VEC3: size *= 3; break; + case GL_INT_VEC4: size *= 4; break; + case GL_UNSIGNED_INT_VEC2: size *= 2; break; + case GL_UNSIGNED_INT_VEC3: size *= 3; break; + case GL_UNSIGNED_INT_VEC4: size *= 4; break; + case GL_BOOL_VEC2: size *= 2; break; + case GL_BOOL_VEC3: size *= 3; break; + case GL_BOOL_VEC4: size *= 4; break; + case GL_FLOAT_MAT2: size *= 4; break; + case GL_FLOAT_MAT3: size *= 9; break; + case GL_FLOAT_MAT4: size *= 16; break; + case GL_FLOAT_MAT2x3: size *= 6; break; + case GL_FLOAT_MAT2x4: size *= 8; break; + case GL_FLOAT_MAT3x2: size *= 6; break; + case GL_FLOAT_MAT3x4: size *= 12; break; + case GL_FLOAT_MAT4x2: size *= 8; break; + case GL_FLOAT_MAT4x3: size *= 12; break; + case GL_DOUBLE_MAT2: size *= 8; break; + case GL_DOUBLE_MAT3: size *= 18; break; + case GL_DOUBLE_MAT4: size *= 32; break; + case GL_DOUBLE_MAT2x3: size *= 12; break; + case GL_DOUBLE_MAT2x4: size *= 16; break; + case GL_DOUBLE_MAT3x2: size *= 12; break; + case GL_DOUBLE_MAT3x4: size *= 24; break; + case GL_DOUBLE_MAT4x2: size *= 16; break; + case GL_DOUBLE_MAT4x3: size *= 24; break; + } + mTotalUniformSize += size; + } +#endif + S32 location = glGetUniformLocationARB(mProgramObject, name); if (location != -1) { @@ -372,11 +603,21 @@ void LLGLSLShader::mapUniform(GLint index, const vector<string> * uniforms) } } } - } +} + +void LLGLSLShader::addPermutation(std::string name, std::string value) +{ + mDefines[name] = value; +} + +void LLGLSLShader::removePermutation(std::string name) +{ + mDefines[name].erase(); +} GLint LLGLSLShader::mapUniformTextureChannel(GLint location, GLenum type) { - if (type >= GL_SAMPLER_1D_ARB && type <= GL_SAMPLER_2D_RECT_SHADOW_ARB || + if ((type >= GL_SAMPLER_1D_ARB && type <= GL_SAMPLER_2D_RECT_SHADOW_ARB) || type == GL_SAMPLER_2D_MULTISAMPLE) { //this here is a texture glUniform1iARB(location, mActiveTextureChannels); @@ -390,6 +631,7 @@ BOOL LLGLSLShader::mapUniforms(const vector<string> * uniforms) { BOOL res = TRUE; + mTotalUniformSize = 0; mActiveTextureChannels = 0; mUniform.clear(); mUniformMap.clear(); @@ -413,6 +655,7 @@ BOOL LLGLSLShader::mapUniforms(const vector<string> * uniforms) unbind(); + LL_DEBUGS("ShaderLoading") << "Total Uniform Size: " << mTotalUniformSize << llendl; return res; } @@ -471,6 +714,58 @@ void LLGLSLShader::bindNoShader(void) } } +S32 LLGLSLShader::bindTexture(const std::string &uniform, LLTexture *texture, LLTexUnit::eTextureType mode) +{ + S32 channel = 0; + channel = getUniformLocation(uniform); + + return bindTexture(channel, texture, mode); +} + +S32 LLGLSLShader::bindTexture(S32 uniform, LLTexture *texture, LLTexUnit::eTextureType mode) +{ + if (uniform < 0 || uniform >= (S32)mTexture.size()) + { + UNIFORM_ERRS << "Uniform out of range: " << uniform << LL_ENDL; + return -1; + } + + uniform = mTexture[uniform]; + + if (uniform > -1) + { + gGL.getTexUnit(uniform)->bind(texture, mode); + } + + return uniform; +} + +S32 LLGLSLShader::unbindTexture(const std::string &uniform, LLTexUnit::eTextureType mode) +{ + S32 channel = 0; + channel = getUniformLocation(uniform); + + return unbindTexture(channel); +} + +S32 LLGLSLShader::unbindTexture(S32 uniform, LLTexUnit::eTextureType mode) +{ + if (uniform < 0 || uniform >= (S32)mTexture.size()) + { + UNIFORM_ERRS << "Uniform out of range: " << uniform << LL_ENDL; + return -1; + } + + uniform = mTexture[uniform]; + + if (uniform > -1) + { + gGL.getTexUnit(uniform)->unbind(mode); + } + + return uniform; +} + S32 LLGLSLShader::enableTexture(S32 uniform, LLTexUnit::eTextureType mode) { if (uniform < 0 || uniform >= (S32)mTexture.size()) diff --git a/indra/llrender/llglslshader.h b/indra/llrender/llglslshader.h index cf21101e35..3c775cde27 100644 --- a/indra/llrender/llglslshader.h +++ b/indra/llrender/llglslshader.h @@ -67,14 +67,29 @@ public: SG_WATER }; + static std::set<LLGLSLShader*> sInstances; + static bool sProfileEnabled; + LLGLSLShader(); + ~LLGLSLShader(); static GLhandleARB sCurBoundShader; static LLGLSLShader* sCurBoundShaderPtr; static S32 sIndexedTextureChannels; static bool sNoFixedFunction; + static void initProfile(); + static void finishProfile(); + + static void startProfile(); + static void stopProfile(U32 count, U32 mode); + void unload(); + void clearStats(); + void dumpStats(); + void placeProfileQuery(); + void readProfileQuery(U32 count, U32 mode); + BOOL createShader(std::vector<std::string> * attributes, std::vector<std::string> * uniforms, U32 varying_count = 0, @@ -123,12 +138,22 @@ public: GLint getAttribLocation(U32 attrib); GLint mapUniformTextureChannel(GLint location, GLenum type); + void addPermutation(std::string name, std::string value); + void removePermutation(std::string name); + //enable/disable texture channel for specified uniform //if given texture uniform is active in the shader, //the corresponding channel will be active upon return //returns channel texture is enabled in from [0-MAX) S32 enableTexture(S32 uniform, LLTexUnit::eTextureType mode = LLTexUnit::TT_TEXTURE); - S32 disableTexture(S32 uniform, LLTexUnit::eTextureType mode = LLTexUnit::TT_TEXTURE); + S32 disableTexture(S32 uniform, LLTexUnit::eTextureType mode = LLTexUnit::TT_TEXTURE); + + // bindTexture returns the texture unit we've bound the texture to. + // You can reuse the return value to unbind a texture when required. + S32 bindTexture(const std::string& uniform, LLTexture *texture, LLTexUnit::eTextureType mode = LLTexUnit::TT_TEXTURE); + S32 bindTexture(S32 uniform, LLTexture *texture, LLTexUnit::eTextureType mode = LLTexUnit::TT_TEXTURE); + S32 unbindTexture(const std::string& uniform, LLTexUnit::eTextureType mode = LLTexUnit::TT_TEXTURE); + S32 unbindTexture(S32 uniform, LLTexUnit::eTextureType mode = LLTexUnit::TT_TEXTURE); BOOL link(BOOL suppress_errors = FALSE); void bind(); @@ -142,10 +167,12 @@ public: GLhandleARB mProgramObject; std::vector<GLint> mAttribute; //lookup table of attribute enum to attribute channel + U32 mAttributeMask; //mask of which reserved attributes are set (lines up with LLVertexBuffer::getTypeMask()) std::vector<GLint> mUniform; //lookup table of uniform enum to uniform location std::map<std::string, GLint> mUniformMap; //lookup map of uniform name to uniform location std::map<GLint, LLVector4> mValue; //lookup map of uniform location to last known value std::vector<GLint> mTexture; + S32 mTotalUniformSize; S32 mActiveTextureChannels; S32 mShaderLevel; S32 mShaderGroup; @@ -153,6 +180,18 @@ public: LLShaderFeatures mFeatures; std::vector< std::pair< std::string, GLenum > > mShaderFiles; std::string mName; + boost::unordered_map<std::string, std::string> mDefines; + + //statistcis for profiling shader performance + U32 mTimerQuery; + U64 mTimeElapsed; + static U64 sTotalTimeElapsed; + U32 mTrianglesDrawn; + static U32 sTotalTrianglesDrawn; + U64 mSamplesDrawn; + static U64 sTotalSamplesDrawn; + U32 mDrawCalls; + static U32 sTotalDrawCalls; }; //UI shader (declared here so llui_libtest will link properly) diff --git a/indra/llrender/llimagegl.cpp b/indra/llrender/llimagegl.cpp index 249b8da880..e0fe9e783d 100644 --- a/indra/llrender/llimagegl.cpp +++ b/indra/llrender/llimagegl.cpp @@ -732,6 +732,12 @@ void LLImageGL::setImage(const U8* data_in, BOOL data_hasmips) glPixelStorei(GL_UNPACK_SWAP_BYTES, 0); stop_glerror(); } + + if (LLRender::sGLCoreProfile) + { + glGenerateMipmap(mTarget); + } + stop_glerror(); } } else @@ -742,12 +748,16 @@ void LLImageGL::setImage(const U8* data_in, BOOL data_hasmips) S32 height = getHeight(mCurrentDiscardLevel); S32 nummips = mMaxDiscardLevel - mCurrentDiscardLevel + 1; S32 w = width, h = height; + + + const U8* new_data = 0; + (void)new_data; + const U8* prev_mip_data = 0; const U8* cur_mip_data = 0; #ifdef SHOW_ASSERT S32 cur_mip_size = 0; #endif - mMipLevels = nummips; for (int m=0; m<nummips; m++) @@ -763,18 +773,24 @@ void LLImageGL::setImage(const U8* data_in, BOOL data_hasmips) { S32 bytes = w * h * mComponents; #ifdef SHOW_ASSERT - llassert(prev_mip_data); - llassert(cur_mip_size == bytes*4); #endif U8* new_data = new U8[bytes]; + +#ifdef SHOW_ASSERT + llassert(prev_mip_data); + llassert(cur_mip_size == bytes*4); llassert_always(new_data); +#endif + LLImageBase::generateMip(prev_mip_data, new_data, w, h, mComponents); cur_mip_data = new_data; #ifdef SHOW_ASSERT cur_mip_size = bytes; #endif + } llassert(w > 0 && h > 0 && cur_mip_data); + (void)cur_mip_data; { // LLFastTimer t1(FTM_TEMP4); if(mFormatSwapBytes) @@ -1098,7 +1114,21 @@ void LLImageGL::deleteTextures(LLTexUnit::eTextureType type, U32 format, S32 mip { if (gGLManager.mInited) { - if (format == 0 || type == LLTexUnit::TT_CUBE_MAP || mip_levels == -1) + switch (format) + { + case 0: + + // We get ARB errors in debug when attempting to use glTexImage2D with these deprecated pix formats + // + case GL_LUMINANCE8: + case GL_INTENSITY8: + case GL_ALPHA8: + glDeleteTextures(numTextures, textures); + break; + + default: + { + if (type == LLTexUnit::TT_CUBE_MAP || mip_levels == -1) { //unknown internal format or unknown number of mip levels, not safe to reuse glDeleteTextures(numTextures, textures); } @@ -1106,11 +1136,13 @@ void LLImageGL::deleteTextures(LLTexUnit::eTextureType type, U32 format, S32 mip { 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); + U32 internal_type = LLTexUnit::getInternalType(type); + glTexImage2D(internal_type, j, format, 0, 0, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); + stop_glerror(); } llassert(std::find(sDeadTextureList[type][format].begin(), @@ -1121,6 +1153,9 @@ void LLImageGL::deleteTextures(LLTexUnit::eTextureType type, U32 format, S32 mip } } } + break; + } + } /*if (immediate) { diff --git a/indra/llrender/llrender.h b/indra/llrender/llrender.h index 78a310e525..98222939e7 100644 --- a/indra/llrender/llrender.h +++ b/indra/llrender/llrender.h @@ -262,6 +262,14 @@ class LLRender friend class LLTexUnit; public: + enum eTexIndex + { + DIFFUSE_MAP = 0, + NORMAL_MAP, + SPECULAR_MAP, + NUM_TEXTURE_CHANNELS, + }; + typedef enum { TRIANGLES = 0, TRIANGLE_STRIP, diff --git a/indra/llrender/llshadermgr.cpp b/indra/llrender/llshadermgr.cpp index b6a9a6b653..ef78d43665 100644 --- a/indra/llrender/llshadermgr.cpp +++ b/indra/llrender/llshadermgr.cpp @@ -521,7 +521,7 @@ void LLShaderMgr::dumpObjectLog(GLhandleARB ret, BOOL warns) } } -GLhandleARB LLShaderMgr::loadShaderFile(const std::string& filename, S32 & shader_level, GLenum type, S32 texture_index_channels) +GLhandleARB LLShaderMgr::loadShaderFile(const std::string& filename, S32 & shader_level, GLenum type, boost::unordered_map<std::string, std::string>* defines, S32 texture_index_channels) { GLenum error = GL_NO_ERROR; if (gDebugGL) @@ -650,13 +650,15 @@ GLhandleARB LLShaderMgr::loadShaderFile(const std::string& filename, S32 & shade text[count++] = strdup("#define shadow2DRect(a,b) vec2(texture(a,b))\n"); } } - - //copy preprocessor definitions into buffer - for (std::map<std::string,std::string>::iterator iter = mDefinitions.begin(); iter != mDefinitions.end(); ++iter) + + if (defines) + { + for (boost::unordered_map<std::string,std::string>::iterator iter = defines->begin(); iter != defines->end(); ++iter) { std::string define = "#define " + iter->first + " " + iter->second + "\n"; text[count++] = (GLcharARB *) strdup(define.c_str()); } + } if (texture_index_channels > 0 && type == GL_FRAGMENT_SHADER_ARB) { @@ -806,7 +808,6 @@ GLhandleARB LLShaderMgr::loadShaderFile(const std::string& filename, S32 & shade //an error occured, print log LL_WARNS("ShaderLoading") << "GLSL Compilation Error: (" << error << ") in " << filename << LL_ENDL; dumpObjectLog(ret); - #if LL_WINDOWS std::stringstream ostr; //dump shader source for debugging @@ -824,8 +825,20 @@ GLhandleARB LLShaderMgr::loadShaderFile(const std::string& filename, S32 & shade } LL_WARNS("ShaderLoading") << "\n" << ostr.str() << llendl; -#endif // LL_WINDOWS - +#else + std::string str; + + for (GLuint i = 0; i < count; i++) { + str.append(text[i]); + + if (i % 128 == 0) + { + LL_WARNS("ShaderLoading") << str << llendl; + str = ""; + } + } +#endif + ret = 0; } } @@ -854,7 +867,7 @@ GLhandleARB LLShaderMgr::loadShaderFile(const std::string& filename, S32 & shade if (shader_level > 1) { shader_level--; - return loadShaderFile(filename,shader_level,type,texture_index_channels); + return loadShaderFile(filename,shader_level,type, defines, texture_index_channels); } LL_WARNS("ShaderLoading") << "Failed to load " << filename << LL_ENDL; } @@ -1115,6 +1128,12 @@ void LLShaderMgr::initAttribsAndUniforms() mReservedUniforms.push_back("lightMap"); mReservedUniforms.push_back("bloomMap"); mReservedUniforms.push_back("projectionMap"); + + mReservedUniforms.push_back("global_gamma"); + mReservedUniforms.push_back("texture_gamma"); + + mReservedUniforms.push_back("specular_color"); + mReservedUniforms.push_back("env_intensity"); llassert(mReservedUniforms.size() == END_RESERVED_UNIFORMS); diff --git a/indra/llrender/llshadermgr.h b/indra/llrender/llshadermgr.h index 7a16b7c20f..a33eca4448 100644 --- a/indra/llrender/llshadermgr.h +++ b/indra/llrender/llshadermgr.h @@ -164,6 +164,13 @@ public: DEFERRED_LIGHT, DEFERRED_BLOOM, DEFERRED_PROJECTION, + + GLOBAL_GAMMA, + TEXTURE_GAMMA, + + SPECULAR_COLOR, + ENVIRONMENT_INTENSITY, + END_RESERVED_UNIFORMS } eGLSLReservedUniforms; @@ -176,7 +183,7 @@ public: void dumpObjectLog(GLhandleARB ret, BOOL warns = TRUE); BOOL linkProgramObject(GLhandleARB obj, BOOL suppress_errors = FALSE); BOOL validateProgramObject(GLhandleARB obj); - GLhandleARB loadShaderFile(const std::string& filename, S32 & shader_level, GLenum type, S32 texture_index_channels = -1); + GLhandleARB loadShaderFile(const std::string& filename, S32 & shader_level, GLenum type, boost::unordered_map<std::string, std::string>* defines = NULL, S32 texture_index_channels = -1); // Implemented in the application to actually point to the shader directory. virtual std::string getShaderDirPrefix(void) = 0; // Pure Virtual diff --git a/indra/llrender/llvertexbuffer.cpp b/indra/llrender/llvertexbuffer.cpp index 4909b43e8a..4423c5acb8 100644 --- a/indra/llrender/llvertexbuffer.cpp +++ b/indra/llrender/llvertexbuffer.cpp @@ -349,6 +349,25 @@ S32 LLVertexBuffer::sTypeSize[LLVertexBuffer::TYPE_MAX] = sizeof(LLVector4), // TYPE_TEXTURE_INDEX (actually exists as position.w), no extra data, but stride is 16 bytes }; +static std::string vb_type_name[] = +{ + "TYPE_VERTEX", + "TYPE_NORMAL", + "TYPE_TEXCOORD0", + "TYPE_TEXCOORD1", + "TYPE_TEXCOORD2", + "TYPE_TEXCOORD3", + "TYPE_COLOR", + "TYPE_EMISSIVE", + "TYPE_BINORMAL", + "TYPE_WEIGHT", + "TYPE_WEIGHT4", + "TYPE_CLOTHWEIGHT", + "TYPE_TEXTURE_INDEX", + "TYPE_MAX", + "TYPE_INDEX", +}; + U32 LLVertexBuffer::sGLMode[LLRender::NUM_MODES] = { GL_TRIANGLES, @@ -593,8 +612,9 @@ void LLVertexBuffer::drawArrays(U32 mode, const std::vector<LLVector3>& pos, con glVertexPointer(3, GL_FLOAT, 0, pos[0].mV); glNormalPointer(GL_FLOAT, 0, norm[0].mV); } - + LLGLSLShader::startProfile(); glDrawArrays(sGLMode[mode], 0, count); + LLGLSLShader::stopProfile(count, mode); } //static @@ -631,7 +651,9 @@ void LLVertexBuffer::drawElements(U32 mode, const LLVector4a* pos, const LLVecto glVertexPointer(3, GL_FLOAT, 16, pos); } + LLGLSLShader::startProfile(); glDrawElements(sGLMode[mode], num_indices, GL_UNSIGNED_SHORT, indicesp); + LLGLSLShader::stopProfile(num_indices, mode); } void LLVertexBuffer::validateRange(U32 start, U32 end, U32 count, U32 indices_offset) const @@ -731,9 +753,14 @@ void LLVertexBuffer::drawRange(U32 mode, U32 start, U32 end, U32 count, U32 indi U16* idx = ((U16*) getIndicesPointer())+indices_offset; stop_glerror(); + LLGLSLShader::startProfile(); glDrawRangeElements(sGLMode[mode], start, end, count, GL_UNSIGNED_SHORT, idx); + LLGLSLShader::stopProfile(count, mode); stop_glerror(); + + + placeFence(); } @@ -777,8 +804,10 @@ void LLVertexBuffer::draw(U32 mode, U32 count, U32 indices_offset) const } stop_glerror(); + LLGLSLShader::startProfile(); glDrawElements(sGLMode[mode], count, GL_UNSIGNED_SHORT, ((U16*) getIndicesPointer()) + indices_offset); + LLGLSLShader::stopProfile(count, mode); stop_glerror(); placeFence(); } @@ -821,8 +850,11 @@ void LLVertexBuffer::drawArrays(U32 mode, U32 first, U32 count) const { LLFastTimer t2(FTM_GL_DRAW_ARRAYS); stop_glerror(); + LLGLSLShader::startProfile(); glDrawArrays(sGLMode[mode], first, count); - } + LLGLSLShader::stopProfile(count, mode); + } + stop_glerror(); placeFence(); } @@ -2038,7 +2070,10 @@ bool LLVertexBuffer::getTexCoord1Strider(LLStrider<LLVector2>& strider, S32 inde { return VertexBufferStrider<LLVector2,TYPE_TEXCOORD1>::get(*this, strider, index, count, map_range); } - +bool LLVertexBuffer::getTexCoord2Strider(LLStrider<LLVector2>& strider, S32 index, S32 count, bool map_range) +{ + return VertexBufferStrider<LLVector2,TYPE_TEXCOORD2>::get(*this, strider, index, count, map_range); +} bool LLVertexBuffer::getNormalStrider(LLStrider<LLVector3>& strider, S32 index, S32 count, bool map_range) { return VertexBufferStrider<LLVector3,TYPE_NORMAL>::get(*this, strider, index, count, map_range); @@ -2200,7 +2235,7 @@ void LLVertexBuffer::setBuffer(U32 data_mask) if ((data_mask & required_mask) != required_mask) { - llerrs << "Shader consumption mismatches data provision." << llendl; + llwarns << "Shader consumption mismatches data provision." << llendl; } } } @@ -2318,6 +2353,14 @@ void LLVertexBuffer::setupVertexBuffer(U32 data_mask) if (gDebugGL && ((data_mask & mTypeMask) != data_mask)) { + for (U32 i = 0; i < LLVertexBuffer::TYPE_MAX; ++i) + { + U32 mask = 1 << i; + if (mask & data_mask && !(mask & mTypeMask)) + { //bit set in data_mask, but not set in mTypeMask + llwarns << "Missing required component " << vb_type_name[i] << llendl; + } + } llerrs << "LLVertexBuffer::setupVertexBuffer missing required components for supplied data mask." << llendl; } diff --git a/indra/llrender/llvertexbuffer.h b/indra/llrender/llvertexbuffer.h index 11fa4ab6a0..1be9b79e84 100644 --- a/indra/llrender/llvertexbuffer.h +++ b/indra/llrender/llvertexbuffer.h @@ -250,6 +250,7 @@ public: bool getIndexStrider(LLStrider<U16>& strider, S32 index=0, S32 count = -1, bool map_range = false); bool getTexCoord0Strider(LLStrider<LLVector2>& strider, S32 index=0, S32 count = -1, bool map_range = false); bool getTexCoord1Strider(LLStrider<LLVector2>& strider, S32 index=0, S32 count = -1, bool map_range = false); + bool getTexCoord2Strider(LLStrider<LLVector2>& strider, S32 index=0, S32 count = -1, bool map_range = false); bool getNormalStrider(LLStrider<LLVector3>& strider, S32 index=0, S32 count = -1, bool map_range = false); bool getBinormalStrider(LLStrider<LLVector3>& strider, S32 index=0, S32 count = -1, bool map_range = false); bool getColorStrider(LLStrider<LLColor4U>& strider, S32 index=0, S32 count = -1, bool map_range = false); diff --git a/indra/lscript/lscript_compile/indra.l b/indra/lscript/lscript_compile/indra.l index b2c49083cb..9132d5d528 100644 --- a/indra/lscript/lscript_compile/indra.l +++ b/indra/lscript/lscript_compile/indra.l @@ -79,11 +79,17 @@ void parse_string(); #define yyfree indra_free +#if LL_WINDOWS #if defined(__cplusplus) extern "C" { int yylex( void ); } extern "C" { int yyparse( void ); } extern "C" { int yyerror(const char *fmt, ...); } #endif +#else +int yylex( void ); +int yyparse( void ); +int yyerror(const char *fmt, ...); +#endif %} diff --git a/indra/lscript/lscript_compile/indra.y b/indra/lscript/lscript_compile/indra.y index e4b10ffdd9..9c2ed02f72 100644 --- a/indra/lscript/lscript_compile/indra.y +++ b/indra/lscript/lscript_compile/indra.y @@ -2,9 +2,11 @@ #include "linden_common.h" #include "lscript_tree.h" + #if LL_WINDOWS #ifdef __cplusplus extern "C" { #endif + #endif int yylex(void); int yyparse( void ); @@ -20,9 +22,12 @@ #pragma warning( disable : 4065 ) // warning: switch statement contains 'default' but no 'case' labels #endif + #if LL_WINDOWS #ifdef __cplusplus } #endif + #endif + %} %union diff --git a/indra/mac_crash_logger/CrashReporter.nib b/indra/mac_crash_logger/CrashReporter.nib Binary files differindex a30d8d205c..e9d9e05985 100644 --- a/indra/mac_crash_logger/CrashReporter.nib +++ b/indra/mac_crash_logger/CrashReporter.nib diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index 4f7ce88165..b8b52580ad 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -10,7 +10,7 @@ include(DirectX) include(OpenSSL) include(DragDrop) include(EXPAT) -include(FMOD) +include(FMODEX) include(OPENAL) include(OpenGL) include(Hunspell) @@ -53,6 +53,10 @@ if (NOT HAVOK_TPV) add_subdirectory(${LLPHYSICSEXTENSIONS_SRC_DIR} llphysicsextensions) endif (NOT HAVOK_TPV) +if(FMODEX) + include_directories(${FMODEX_INCLUDE_DIR}) +endif(FMODEX) + include_directories( ${DBUSGLIB_INCLUDE_DIRS} ${JSONCPP_INCLUDE_DIR} @@ -62,7 +66,6 @@ include_directories( ${LLCOMMON_INCLUDE_DIRS} ${LLCOREHTTP_INCLUDE_DIRS} ${LLPHYSICS_INCLUDE_DIRS} - ${FMOD_INCLUDE_DIR} ${LLIMAGE_INCLUDE_DIRS} ${LLKDU_INCLUDE_DIRS} ${LLINVENTORY_INCLUDE_DIRS} @@ -170,6 +173,7 @@ set(viewer_SOURCE_FILES lldrawpoolavatar.cpp lldrawpoolbump.cpp lldrawpoolground.cpp + lldrawpoolmaterials.cpp lldrawpoolsimple.cpp lldrawpoolsky.cpp lldrawpoolterrain.cpp @@ -353,6 +357,7 @@ set(viewer_SOURCE_FILES llmaniptranslate.cpp llmarketplacefunctions.cpp llmarketplacenotifications.cpp + llmaterialmgr.cpp llmediactrl.cpp llmediadataclient.cpp llmenuoptionpathfindingrebakenavmesh.cpp @@ -749,6 +754,7 @@ set(viewer_HEADER_FILES lldrawpoolalpha.h lldrawpoolavatar.h lldrawpoolbump.h + lldrawpoolmaterials.h lldrawpoolground.h lldrawpoolsimple.h lldrawpoolsky.h @@ -932,6 +938,7 @@ set(viewer_HEADER_FILES llmaniptranslate.h llmarketplacefunctions.h llmarketplacenotifications.h + llmaterialmgr.h llmediactrl.h llmediadataclient.h llmenuoptionpathfindingrebakenavmesh.h @@ -1535,27 +1542,10 @@ if (OPENAL) set(LLSTARTUP_COMPILE_FLAGS "${LLSTARTUP_COMPILE_FLAGS} -DLL_OPENAL") endif (OPENAL) -if (FMOD) - set(LLSTARTUP_COMPILE_FLAGS "${LLSTARTUP_COMPILE_FLAGS} -DLL_FMOD") - - if (DARWIN) - set(fmodwrapper_SOURCE_FILES fmodwrapper.cpp) - add_library(fmodwrapper SHARED ${fmodwrapper_SOURCE_FILES}) - set(fmodwrapper_needed_LIBRARIES ${FMOD_LIBRARY} ${CARBON_LIBRARY}) - set_target_properties( - fmodwrapper - PROPERTIES - BUILD_WITH_INSTALL_RPATH 1 - INSTALL_NAME_DIR "@executable_path/../Resources" - LINK_FLAGS "-unexported_symbols_list ${CMAKE_CURRENT_SOURCE_DIR}/fmod_hidden_symbols.exp" - ) - set(FMODWRAPPER_LIBRARY fmodwrapper) - target_link_libraries(fmodwrapper ${fmodwrapper_needed_LIBRARIES}) - else (DARWIN) - # fmodwrapper unnecessary on linux or windows - set(FMODWRAPPER_LIBRARY ${FMOD_LIBRARY}) - endif (DARWIN) -endif (FMOD) +if (FMODEX) + set(LLSTARTUP_COMPILE_FLAGS "${LLSTARTUP_COMPILE_FLAGS} -DLL_FMODEX") + set(FMODWRAPPER_LIBRARY ${FMODEX_LIBRARY}) +endif (FMODEX) set_source_files_properties(llstartup.cpp PROPERTIES COMPILE_FLAGS "${LLSTARTUP_COMPILE_FLAGS}") @@ -1636,9 +1626,6 @@ if (WINDOWS) ${SHARED_LIB_STAGING_DIR}/Release/openjpeg.dll ${SHARED_LIB_STAGING_DIR}/RelWithDebInfo/openjpeg.dll ${SHARED_LIB_STAGING_DIR}/Debug/openjpegd.dll - ${SHARED_LIB_STAGING_DIR}/Release/fmod.dll - ${SHARED_LIB_STAGING_DIR}/RelWithDebInfo/fmod.dll - ${SHARED_LIB_STAGING_DIR}/Debug/fmod.dll ${SHARED_LIB_STAGING_DIR}/Release/msvcr100.dll ${SHARED_LIB_STAGING_DIR}/Release/msvcp100.dll ${SHARED_LIB_STAGING_DIR}/RelWithDebInfo/msvcr100.dll @@ -1703,6 +1690,14 @@ if (WINDOWS) windows-updater ) + if (FMODEX) + list(APPEND COPY_INPUT_DEPENDENCIES + ${SHARED_LIB_STAGING_DIR}/Release/fmodex.dll + ${SHARED_LIB_STAGING_DIR}/RelWithDebInfo/fmodex.dll + ${SHARED_LIB_STAGING_DIR}/Debug/fmodexL.dll + ) + endif (FMODEX) + add_custom_command( OUTPUT ${CMAKE_CFG_INTDIR}/copy_touched.bat COMMAND ${PYTHON_EXECUTABLE} @@ -2098,6 +2093,40 @@ if (LL_TESTS) ) set_source_files_properties( + llviewerhelputil.cpp + PROPERTIES + LL_TEST_ADDITIONAL_LIBRARIES "${BOOST_SYSTEM_LIBRARY}" + ) + + set_source_files_properties( + llremoteparcelrequest.cpp + PROPERTIES + LL_TEST_ADDITIONAL_LIBRARIES "${BOOST_SYSTEM_LIBRARY}" + ) + + set_source_files_properties( + llworldmap.cpp + llworldmipmap.cpp + PROPERTIES + LL_TEST_ADDITIONAL_SOURCE_FILES + tests/llviewertexture_stub.cpp + #llviewertexturelist.cpp + LL_TEST_ADDITIONAL_LIBRARIES "${BOOST_SYSTEM_LIBRARY}" + ) + + set_source_files_properties( + llmediadataclient.cpp + PROPERTIES + LL_TEST_ADDITIONAL_LIBRARIES "${LLPRIMITIVE_LIBRARIES}" + ) + + set_source_files_properties( + llagentaccess.cpp + PROPERTIES + LL_TEST_ADDITIONAL_LIBRARIES "${BOOST_SYSTEM_LIBRARY}" + ) + + set_source_files_properties( lllogininstance.cpp PROPERTIES LL_TEST_ADDITIONAL_LIBRARIES "${BOOST_SYSTEM_LIBRARY}" diff --git a/indra/newview/English.lproj/InfoPlist.strings b/indra/newview/English.lproj/InfoPlist.strings index 1802e14703..774ade714b 100644 --- a/indra/newview/English.lproj/InfoPlist.strings +++ b/indra/newview/English.lproj/InfoPlist.strings @@ -2,6 +2,6 @@ CFBundleName = "Second Life"; -CFBundleShortVersionString = "Second Life version 3.4.1.264760"; -CFBundleGetInfoString = "Second Life version 3.4.1.264760, Copyright 2004-2009 Linden Research, Inc."; +CFBundleShortVersionString = "Second Life version 3.5.1.288888"; +CFBundleGetInfoString = "Second Life version 3.5.1.288888, Copyright 2004-2009 Linden Research, Inc."; diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index f66d8fca5b..5ab9cd4d96 100755 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -291,6 +291,17 @@ <key>Value</key> <real>1.0</real> </map> + <key>AudioLevelUnderwaterRolloff</key> + <map> + <key>Comment</key> + <string>Controls the distance-based dropoff of audio volume underwater(fraction or multiple of default audio rolloff)</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>F32</string> + <key>Value</key> + <real>5.0</real> + </map> <key>AudioLevelSFX</key> <map> <key>Comment</key> @@ -3325,17 +3336,6 @@ <key>Value</key> <integer>1</integer> </map> - <key>EnableTextureAtlas</key> - <map> - <key>Comment</key> - <string>Whether to use texture atlas or not</string> - <key>Persist</key> - <integer>1</integer> - <key>Type</key> - <string>Boolean</string> - <key>Value</key> - <integer>0</integer> - </map> <key>EnableUIHints</key> <map> <key>Comment</key> @@ -8418,7 +8418,7 @@ <key>RenderSpotLightsInNondeferred</key> <map> <key>Comment</key> - <string>Whether to support projectors as spotlights when Lighting and Shadows is disabled</string> + <string>Whether to support projectors as spotlights when Advanced Lighting Model is disabled</string> <key>Persist</key> <integer>1</integer> <key>Type</key> @@ -8559,7 +8559,7 @@ <key>Type</key> <string>U32</string> <key>Value</key> - <real>512</real> + <real>1024</real> </map> <key>RenderSpecularResY</key> @@ -8571,7 +8571,7 @@ <key>Type</key> <string>U32</string> <key>Value</key> - <real>128</real> + <real>256</real> </map> <key>RenderSpecularExponent</key> @@ -8589,7 +8589,7 @@ <key>RenderDeferred</key> <map> <key>Comment</key> - <string>Use deferred rendering pipeline.</string> + <string>Use deferred rendering pipeline (Advanced Lighting Model).</string> <key>Persist</key> <integer>1</integer> <key>Type</key> @@ -8777,7 +8777,7 @@ <key>RenderAutoMaskAlphaNonDeferred</key> <map> <key>Comment</key> - <string>Use alpha masks where appropriate, in the non-deferred (non-'Lighting and Shadows') graphics mode</string> + <string>Use alpha masks where appropriate when not using the Advanced Lighting Model</string> <key>Persist</key> <integer>1</integer> <key>Type</key> @@ -8788,7 +8788,7 @@ <key>RenderAutoMaskAlphaDeferred</key> <map> <key>Comment</key> - <string>Use alpha masks where appropriate, in the deferred ('Lighting and Shadows') graphics mode</string> + <string>Use alpha masks where appropriate in the Advanced Lighting Model</string> <key>Persist</key> <integer>1</integer> <key>Type</key> @@ -14446,7 +14446,50 @@ <key>Value</key> <integer>0</integer> </map> - + <key>DisablePrecacheDelayAfterTeleporting</key> + <map> + <key>Comment</key> + <string>Disables the artificial delay in the viewer that precaches some incoming assets</string> + <key>Persist</key> + <integer>0</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>0</integer> + </map> + <key>FMODExProfilerEnable</key> + <map> + <key>Comment</key> + <string>Enable profiler tool if using FMOD Ex</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>0</integer> + </map> + <key>FMODExDecodeBufferSize</key> + <map> + <key>Comment</key> + <string>Sets the streaming decode buffer size (in milliseconds)</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>U32</string> + <key>Value</key> + <integer>1000</integer> + </map> + <key>FMODExStreamBufferSize</key> + <map> + <key>Comment</key> + <string>Sets the streaming buffer size (in milliseconds)</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>U32</string> + <key>Value</key> + <integer>7000</integer> + </map> <key>DisablePrecacheDelayAfterTeleporting</key> <map> <key>Comment</key> diff --git a/indra/newview/app_settings/shaders/class1/avatar/objectSkinV.glsl b/indra/newview/app_settings/shaders/class1/avatar/objectSkinV.glsl index 43ed41a205..2745d5fd95 100644 --- a/indra/newview/app_settings/shaders/class1/avatar/objectSkinV.glsl +++ b/indra/newview/app_settings/shaders/class1/avatar/objectSkinV.glsl @@ -26,7 +26,7 @@ ATTRIBUTE vec4 weight4; -uniform mat4 matrixPalette[32]; +uniform mat4 matrixPalette[64]; mat4 getObjectSkinnedTransform() { diff --git a/indra/newview/app_settings/shaders/class1/deferred/alphaF.glsl b/indra/newview/app_settings/shaders/class1/deferred/alphaF.glsl index dd87ddb330..50b43f6a8d 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/alphaF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/alphaF.glsl @@ -25,17 +25,33 @@ #extension GL_ARB_texture_rectangle : enable +#define INDEXED 1 +#define NON_INDEXED 2 +#define NON_INDEXED_NO_COLOR 3 + #ifdef DEFINE_GL_FRAGCOLOR out vec4 frag_color; #else #define frag_color gl_FragColor #endif -uniform sampler2DRect depthMap; +#if HAS_SHADOW +uniform sampler2DShadow shadowMap0; +uniform sampler2DShadow shadowMap1; +uniform sampler2DShadow shadowMap2; +uniform sampler2DShadow shadowMap3; -vec4 diffuseLookup(vec2 texcoord); +uniform vec2 shadow_res; -uniform vec2 screen_res; +uniform mat4 shadow_matrix[6]; +uniform vec4 shadow_clip; +uniform float shadow_bias; + +#endif + +#ifdef USE_DIFFUSE_TEX +uniform sampler2D diffuseMap; +#endif vec3 atmosLighting(vec3 light); vec3 scaleSoftClip(vec3 light); @@ -45,11 +61,77 @@ VARYING vec3 vary_directional; VARYING vec3 vary_fragcoord; VARYING vec3 vary_position; VARYING vec3 vary_pointlight_col; +VARYING vec2 vary_texcoord0; +VARYING vec3 vary_norm; +#ifdef USE_VERTEX_COLOR VARYING vec4 vertex_color; -VARYING vec2 vary_texcoord0; +#endif + +uniform vec4 light_position[8]; +uniform vec3 light_direction[8]; +uniform vec3 light_attenuation[8]; +uniform vec3 light_diffuse[8]; + +uniform vec2 screen_res; + +vec3 calcDirectionalLight(vec3 n, vec3 l) +{ + float a = max(dot(n,l),0.0); + return vec3(a,a,a); +} + +vec3 calcPointLightOrSpotLight(vec3 v, vec3 n, vec4 lp, vec3 ln, float la, float fa, float is_pointlight) +{ + //get light vector + vec3 lv = lp.xyz-v; + + //get distance + float d = dot(lv,lv); + + float da = 0.0; + + if (d > 0.0 && la > 0.0 && fa > 0.0) + { + //normalize light vector + lv = normalize(lv); + + //distance attenuation + float dist2 = d/la; + da = clamp(1.0-(dist2-1.0*(1.0-fa))/fa, 0.0, 1.0); + da = pow(da, 2.2) * 2.2; + + // spotlight coefficient. + float spot = max(dot(-ln, lv), is_pointlight); + da *= spot*spot; // GL_SPOT_EXPONENT=2 + + //angular attenuation + da *= max(dot(n, lv), 0.0); + } + + return vec3(da,da,da); +} + +#if HAS_SHADOW +float pcfShadow(sampler2DShadow shadowMap, vec4 stc) +{ + stc.xyz /= stc.w; + stc.z += shadow_bias; + + 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 = shadow2D(shadowMap, stc.xyz).x; + float shadow = cs; + + 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; +} +#endif -uniform mat4 inv_proj; void main() { @@ -58,16 +140,117 @@ void main() vec4 pos = vec4(vary_position, 1.0); - vec4 diff= diffuseLookup(vary_texcoord0.xy); - vec4 col = vec4(vary_ambient + vary_directional.rgb, vertex_color.a); +#if HAS_SHADOW + float shadow = 0.0; + vec4 spos = pos; + + if (spos.z > -shadow_clip.w) + { + vec4 lpos; + + vec4 near_split = shadow_clip*-0.75; + vec4 far_split = shadow_clip*-1.25; + vec4 transition_domain = near_split-far_split; + float weight = 0.0; + + if (spos.z < near_split.z) + { + lpos = shadow_matrix[3]*spos; + + float w = 1.0; + w -= max(spos.z-far_split.z, 0.0)/transition_domain.z; + shadow += pcfShadow(shadowMap3, lpos)*w; + weight += w; + shadow += max((pos.z+shadow_clip.z)/(shadow_clip.z-shadow_clip.w)*2.0-1.0, 0.0); + } + + if (spos.z < near_split.y && spos.z > far_split.z) + { + lpos = shadow_matrix[2]*spos; + + 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; + shadow += pcfShadow(shadowMap2, lpos)*w; + weight += w; + } + + if (spos.z < near_split.x && spos.z > far_split.y) + { + lpos = shadow_matrix[1]*spos; + + 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; + shadow += pcfShadow(shadowMap1, lpos)*w; + weight += w; + } + + if (spos.z > far_split.x) + { + lpos = shadow_matrix[0]*spos; + + float w = 1.0; + w -= max(near_split.x-spos.z, 0.0)/transition_domain.x; + + shadow += pcfShadow(shadowMap0, lpos)*w; + weight += w; + } + + + shadow /= weight; + } + else + { + shadow = 1.0; + } +#endif + +#ifdef USE_INDEXED_TEX + vec4 diff = diffuseLookup(vary_texcoord0.xy); +#else + vec4 diff = texture2D(diffuseMap,vary_texcoord0.xy); +#endif + + diff.rgb = pow(diff.rgb, vec3(2.2f, 2.2f, 2.2f)); + +#ifdef USE_VERTEX_COLOR + float vertex_color_alpha = vertex_color.a; +#else + float vertex_color_alpha = 1.0; +#endif + + vec3 normal = vary_norm; + + vec3 l = light_position[0].xyz; + vec3 dlight = calcDirectionalLight(normal, l) * 2.6; + dlight = dlight * vary_directional.rgb * vary_pointlight_col; + +#if HAS_SHADOW + vec4 col = vec4(vary_ambient + dlight * shadow, vertex_color_alpha); +#else + vec4 col = vec4(vary_ambient + dlight, vertex_color_alpha); +#endif + vec4 color = diff * col; color.rgb = atmosLighting(color.rgb); color.rgb = scaleSoftClip(color.rgb); + col = vec4(0,0,0,0); + + #define LIGHT_LOOP(i) col.rgb += light_diffuse[i].rgb * calcPointLightOrSpotLight(pos.xyz, normal, light_position[i], light_direction[i].xyz, light_attenuation[i].x, light_attenuation[i].y, light_attenuation[i].z); + + LIGHT_LOOP(1) + LIGHT_LOOP(2) + LIGHT_LOOP(3) + LIGHT_LOOP(4) + LIGHT_LOOP(5) + LIGHT_LOOP(6) + LIGHT_LOOP(7) - color.rgb += diff.rgb * vary_pointlight_col.rgb; + color.rgb += diff.rgb * vary_pointlight_col * col.rgb; frag_color = color; } diff --git a/indra/newview/app_settings/shaders/class1/deferred/alphaNonIndexedF.glsl b/indra/newview/app_settings/shaders/class1/deferred/alphaNonIndexedF.glsl index beb3290187..cccc7275ab 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/alphaNonIndexedF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/alphaNonIndexedF.glsl @@ -47,9 +47,51 @@ VARYING vec3 vary_position; VARYING vec3 vary_pointlight_col; VARYING vec2 vary_texcoord0; VARYING vec4 vertex_color; +VARYING vec3 vary_norm; uniform mat4 inv_proj; +uniform vec4 light_position[8]; +uniform vec3 light_direction[8]; +uniform vec3 light_attenuation[8]; +uniform vec3 light_diffuse[8]; + +vec3 calcDirectionalLight(vec3 n, vec3 l) +{ + float a = pow(max(dot(n,l),0.0), 0.7); + return vec3(a,a,a); +} + +vec3 calcPointLightOrSpotLight(vec3 v, vec3 n, vec4 lp, vec3 ln, float la, float fa, float is_pointlight) +{ + //get light vector + vec3 lv = lp.xyz-v; + + //get distance + float d = dot(lv,lv); + + float da = 0.0; + + if (d > 0.0 && la > 0.0 && fa > 0.0) + { + //normalize light vector + lv = normalize(lv); + + //distance attenuation + float dist2 = d/la; + da = clamp(1.0-(dist2-1.0*(1.0-fa))/fa, 0.0, 1.0); + + // spotlight coefficient. + float spot = max(dot(-ln, lv), is_pointlight); + da *= spot*spot; // GL_SPOT_EXPONENT=2 + + //angular attenuation + da *= max(pow(dot(n, lv), 0.7), 0.0); + } + + return vec3(da,da,da); +} + vec4 getPosition(vec2 pos_screen) { float depth = texture2DRect(depthMap, pos_screen.xy).a; @@ -72,14 +114,31 @@ void main() vec4 diff= texture2D(diffuseMap,vary_texcoord0.xy); - vec4 col = vec4(vary_ambient + vary_directional.rgb, vertex_color.a); + vec3 n = vary_norm; + vec3 l = light_position[0].xyz; + vec3 dlight = calcDirectionalLight(n, l); + dlight = dlight * vary_directional.rgb * vary_pointlight_col; + + vec4 col = vec4(vary_ambient + dlight, vertex_color.a); vec4 color = diff * col; color.rgb = atmosLighting(color.rgb); color.rgb = scaleSoftClip(color.rgb); + vec3 light_col = vec3(0,0,0); + + #define LIGHT_LOOP(i) \ + light_col += light_diffuse[i].rgb * calcPointLightOrSpotLight(pos.xyz, vary_norm, light_position[i], light_direction[i], light_attenuation[i].x, light_attenuation[i].y, light_attenuation[i].z); + + LIGHT_LOOP(1) + LIGHT_LOOP(2) + LIGHT_LOOP(3) + LIGHT_LOOP(4) + LIGHT_LOOP(5) + LIGHT_LOOP(6) + LIGHT_LOOP(7) - color.rgb += diff.rgb * vary_pointlight_col.rgb; + color.rgb += diff.rgb * vary_pointlight_col * light_col; frag_color = color; //frag_color = vec4(1,0,1,1); diff --git a/indra/newview/app_settings/shaders/class1/deferred/alphaSkinnedV.glsl b/indra/newview/app_settings/shaders/class1/deferred/alphaSkinnedV.glsl index 5a0e8ff684..5f93986f1d 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/alphaSkinnedV.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/alphaSkinnedV.glsl @@ -46,6 +46,7 @@ VARYING vec3 vary_pointlight_col; VARYING vec4 vertex_color; VARYING vec2 vary_texcoord0; +VARYING vec3 vary_norm; uniform float near_clip; @@ -104,7 +105,7 @@ void main() norm = position.xyz + normal.xyz; norm = normalize(( trans*vec4(norm, 1.0) ).xyz-pos.xyz); - + vary_norm = norm; vec4 frag_pos = projection_matrix * pos; gl_Position = frag_pos; @@ -112,27 +113,18 @@ void main() calcAtmospherics(pos.xyz); + //vec4 color = calcLighting(pos.xyz, norm, diffuse_color, vec4(0.)); vec4 col = vec4(0.0, 0.0, 0.0, diffuse_color.a); - - // Collect normal lights - col.rgb += light_diffuse[2].rgb*calcPointLightOrSpotLight(pos.xyz, norm, light_position[2], light_direction[2], light_attenuation[2].x, light_attenuation[2].y, light_attenuation[2].z); - col.rgb += light_diffuse[3].rgb*calcPointLightOrSpotLight(pos.xyz, norm, light_position[3], light_direction[3], light_attenuation[3].x, light_attenuation[3].y, light_attenuation[3].z); - col.rgb += light_diffuse[4].rgb*calcPointLightOrSpotLight(pos.xyz, norm, light_position[4], light_direction[4], light_attenuation[4].x, light_attenuation[4].y, light_attenuation[4].z); - col.rgb += light_diffuse[5].rgb*calcPointLightOrSpotLight(pos.xyz, norm, light_position[5], light_direction[5], light_attenuation[5].x, light_attenuation[5].y, light_attenuation[5].z); - col.rgb += light_diffuse[6].rgb*calcPointLightOrSpotLight(pos.xyz, norm, light_position[6], light_direction[6], light_attenuation[6].x, light_attenuation[6].y, light_attenuation[6].z); - col.rgb += light_diffuse[7].rgb*calcPointLightOrSpotLight(pos.xyz, norm, light_position[7], light_direction[7], light_attenuation[7].x, light_attenuation[7].y, light_attenuation[7].z); - - vary_pointlight_col = col.rgb*diffuse_color.rgb; - + vary_pointlight_col = diffuse_color.rgb; col.rgb = vec3(0,0,0); // Add windlight lights col.rgb = atmosAmbient(vec3(0.)); vary_ambient = col.rgb*diffuse_color.rgb; - vary_directional = diffuse_color.rgb*atmosAffectDirectionalLight(max(calcDirectionalLight(norm, light_position[0].xyz), (1.0-diffuse_color.a)*(1.0-diffuse_color.a))); + vary_directional.rgb = atmosAffectDirectionalLight(1); - col.rgb = min(col.rgb*diffuse_color.rgb, 1.0); + col.rgb = col.rgb*diffuse_color.rgb; vertex_color = col; diff --git a/indra/newview/app_settings/shaders/class1/deferred/alphaV.glsl b/indra/newview/app_settings/shaders/class1/deferred/alphaV.glsl index cf38a2f4f7..77d02b36ff 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/alphaV.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/alphaV.glsl @@ -23,21 +23,42 @@ * $/LicenseInfo$ */ +#define INDEXED 1 +#define NON_INDEXED 2 +#define NON_INDEXED_NO_COLOR 3 + uniform mat3 normal_matrix; uniform mat4 texture_matrix0; +uniform mat4 projection_matrix; uniform mat4 modelview_matrix; uniform mat4 modelview_projection_matrix; ATTRIBUTE vec3 position; + +#ifdef USE_INDEXED_TEX void passTextureIndex(); +#endif + ATTRIBUTE vec3 normal; + +#ifdef USE_VERTEX_COLOR ATTRIBUTE vec4 diffuse_color; +#endif + ATTRIBUTE vec2 texcoord0; +#ifdef HAS_SKIN +mat4 getObjectSkinnedTransform(); +#else +#ifdef IS_AVATAR_SKIN +mat4 getSkinnedTransform(); +#endif +#endif + vec4 calcLighting(vec3 pos, vec3 norm, vec4 color, vec4 baseCol); void calcAtmospherics(vec3 inPositionEye); -float calcDirectionalLight(vec3 n, vec3 l); +vec3 calcDirectionalLight(vec3 n, vec3 l); vec3 atmosAmbient(vec3 light); vec3 atmosAffectDirectionalLight(float lightIntensity); @@ -50,26 +71,28 @@ VARYING vec3 vary_fragcoord; VARYING vec3 vary_position; VARYING vec3 vary_pointlight_col; +#ifdef USE_VERTEX_COLOR VARYING vec4 vertex_color; +#endif + VARYING vec2 vary_texcoord0; +VARYING vec3 vary_norm; uniform float near_clip; -uniform float shadow_offset; -uniform float shadow_bias; uniform vec4 light_position[8]; uniform vec3 light_direction[8]; uniform vec3 light_attenuation[8]; uniform vec3 light_diffuse[8]; -float calcDirectionalLight(vec3 n, vec3 l) +vec3 calcDirectionalLight(vec3 n, vec3 l) { float a = max(dot(n,l),0.0); - return a; + return vec3(a,a,a); } -float calcPointLightOrSpotLight(vec3 v, vec3 n, vec4 lp, vec3 ln, float la, float fa, float is_pointlight) +vec3 calcPointLightOrSpotLight(vec3 v, vec3 n, vec4 lp, vec3 ln, float la, float fa, float is_pointlight) { //get light vector vec3 lv = lp.xyz-v; @@ -96,53 +119,103 @@ float calcPointLightOrSpotLight(vec3 v, vec3 n, vec4 lp, vec3 ln, float la, floa da *= max(dot(n, lv), 0.0); } - return da; + return vec3(da,da,da); } void main() { + vec4 pos; + vec3 norm; + //transform vertex +#ifdef HAS_SKIN + mat4 trans = getObjectSkinnedTransform(); + trans = modelview_matrix * trans; + + pos = trans * vec4(position.xyz, 1.0); + + norm = position.xyz + normal.xyz; + norm = normalize((trans * vec4(norm, 1.0)).xyz - pos.xyz); + vec4 frag_pos = projection_matrix * pos; + gl_Position = frag_pos; +#else + +#ifdef IS_AVATAR_SKIN + mat4 trans = getSkinnedTransform(); + vec4 pos_in = vec4(position.xyz, 1.0); + pos.x = dot(trans[0], pos_in); + pos.y = dot(trans[1], pos_in); + pos.z = dot(trans[2], pos_in); + pos.w = 1.0; + + norm.x = dot(trans[0].xyz, normal); + norm.y = dot(trans[1].xyz, normal); + norm.z = dot(trans[2].xyz, normal); + norm = normalize(norm); + + vec4 frag_pos = projection_matrix * pos; + gl_Position = frag_pos; +#else + norm = normalize(normal_matrix * normal); vec4 vert = vec4(position.xyz, 1.0); - passTextureIndex(); - vec4 pos = (modelview_matrix * vert); + pos = (modelview_matrix * vert); gl_Position = modelview_projection_matrix*vec4(position.xyz, 1.0); +#endif +#endif + +#ifdef USE_INDEXED_TEX + passTextureIndex(); vary_texcoord0 = (texture_matrix0 * vec4(texcoord0,0,1)).xy; +#else + vary_texcoord0 = texcoord0; +#endif - vec3 norm = normalize(normal_matrix * normal); - - float dp_directional_light = max(0.0, dot(norm, light_position[0].xyz)); - vary_position = pos.xyz + light_position[0].xyz * (1.0-dp_directional_light)*shadow_offset; - + vary_norm = norm; + vary_position = pos.xyz; + calcAtmospherics(pos.xyz); +#ifndef USE_VERTEX_COLOR + vec4 diffuse_color = vec4(1,1,1,1); +#endif //vec4 color = calcLighting(pos.xyz, norm, diffuse_color, vec4(0.)); vec4 col = vec4(0.0, 0.0, 0.0, diffuse_color.a); + + vec3 diff = pow(diffuse_color.rgb, vec3(2.2)); + + + + vary_pointlight_col = diff; - // Collect normal lights - col.rgb += light_diffuse[2].rgb*calcPointLightOrSpotLight(pos.xyz, norm, light_position[2], light_direction[2], light_attenuation[2].x, light_attenuation[2].y, light_attenuation[2].z); - col.rgb += light_diffuse[3].rgb*calcPointLightOrSpotLight(pos.xyz, norm, light_position[3], light_direction[3], light_attenuation[3].x, light_attenuation[3].y, light_attenuation[3].z); - col.rgb += light_diffuse[4].rgb*calcPointLightOrSpotLight(pos.xyz, norm, light_position[4], light_direction[4], light_attenuation[4].x, light_attenuation[4].y, light_attenuation[4].z); - col.rgb += light_diffuse[5].rgb*calcPointLightOrSpotLight(pos.xyz, norm, light_position[5], light_direction[5], light_attenuation[5].x, light_attenuation[5].y, light_attenuation[5].z); - col.rgb += light_diffuse[6].rgb*calcPointLightOrSpotLight(pos.xyz, norm, light_position[6], light_direction[6], light_attenuation[6].x, light_attenuation[6].y, light_attenuation[6].z); - col.rgb += light_diffuse[7].rgb*calcPointLightOrSpotLight(pos.xyz, norm, light_position[7], light_direction[7], light_attenuation[7].x, light_attenuation[7].y, light_attenuation[7].z); - vary_pointlight_col = col.rgb*diffuse_color.rgb; col.rgb = vec3(0,0,0); // Add windlight lights - col.rgb = atmosAmbient(vec3(0.)); + col.rgb = atmosAmbient(col.rgb); - vary_ambient = col.rgb*diffuse_color.rgb; - vary_directional.rgb = diffuse_color.rgb*atmosAffectDirectionalLight(max(calcDirectionalLight(norm, light_position[0].xyz), (1.0-diffuse_color.a)*(1.0-diffuse_color.a))); + vary_ambient = col.rgb*diff.rgb; + + vary_directional.rgb = atmosAffectDirectionalLight(1.0f); - col.rgb = col.rgb*diffuse_color.rgb; + col.rgb = col.rgb*diff.rgb; +#ifdef USE_VERTEX_COLOR vertex_color = col; - - +#endif +#ifdef HAS_SKIN + vary_fragcoord.xyz = frag_pos.xyz + vec3(0,0,near_clip); +#else + +#ifdef IS_AVATAR_SKIN + vary_fragcoord.xyz = pos.xyz + vec3(0,0,near_clip); +#else pos = modelview_projection_matrix * vert; vary_fragcoord.xyz = pos.xyz + vec3(0,0,near_clip); +#endif +#endif + } + diff --git a/indra/newview/app_settings/shaders/class1/deferred/attachmentShadowV.glsl b/indra/newview/app_settings/shaders/class1/deferred/attachmentShadowV.glsl index 81961d7746..3f90600ace 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/attachmentShadowV.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/attachmentShadowV.glsl @@ -39,7 +39,12 @@ void main() mat = modelview_matrix * mat; vec3 pos = (mat*vec4(position.xyz, 1.0)).xyz; + vec4 p = projection_matrix * vec4(pos, 1.0); +#if !DEPTH_CLAMP p.z = max(p.z, -p.w+0.01); gl_Position = p; +#else + gl_Position = p; +#endif } diff --git a/indra/newview/app_settings/shaders/class1/deferred/avatarAlphaNoColorV.glsl b/indra/newview/app_settings/shaders/class1/deferred/avatarAlphaNoColorV.glsl index 5f395801e5..c8ddefac26 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/avatarAlphaNoColorV.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/avatarAlphaNoColorV.glsl @@ -47,6 +47,7 @@ VARYING vec3 vary_directional; VARYING vec3 vary_fragcoord; VARYING vec3 vary_pointlight_col; VARYING vec2 vary_texcoord0; +VARYING vec3 vary_norm; uniform float near_clip; @@ -112,6 +113,7 @@ void main() norm.y = dot(trans[1].xyz, normal); norm.z = dot(trans[2].xyz, normal); norm = normalize(norm); + vary_norm = norm; vec4 frag_pos = projection_matrix * pos; gl_Position = frag_pos; diff --git a/indra/newview/app_settings/shaders/class1/deferred/avatarF.glsl b/indra/newview/app_settings/shaders/class1/deferred/avatarF.glsl index bfd9b9b3eb..bcccbf77d2 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/avatarF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/avatarF.glsl @@ -34,6 +34,12 @@ uniform sampler2D diffuseMap; VARYING vec3 vary_normal; VARYING vec2 vary_texcoord0; +vec2 encode_normal(vec3 n) +{ + float f = sqrt(8 * n.z + 8); + return n.xy / f + 0.5; +} + void main() { vec4 diff = texture2D(diffuseMap, vary_texcoord0.xy); @@ -46,6 +52,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.xyz * 0.5 + 0.5, 0.0); + frag_data[2] = vec4(encode_normal(nvn.xyz), 0.0, 0.0); } diff --git a/indra/newview/app_settings/shaders/class1/deferred/avatarShadowF.glsl b/indra/newview/app_settings/shaders/class1/deferred/avatarShadowF.glsl index 3686f2f647..b809b73973 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/avatarShadowF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/avatarShadowF.glsl @@ -31,12 +31,16 @@ out vec4 frag_color; uniform sampler2D diffuseMap; +#if !DEPTH_CLAMP VARYING vec4 post_pos; +#endif void main() { frag_color = vec4(1,1,1,1); +#if !DEPTH_CLAMP gl_FragDepth = max(post_pos.z/post_pos.w*0.5+0.5, 0.0); +#endif } diff --git a/indra/newview/app_settings/shaders/class1/deferred/avatarShadowV.glsl b/indra/newview/app_settings/shaders/class1/deferred/avatarShadowV.glsl index 23feb09d72..bde1ad4e9f 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/avatarShadowV.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/avatarShadowV.glsl @@ -31,7 +31,9 @@ ATTRIBUTE vec3 position; ATTRIBUTE vec3 normal; ATTRIBUTE vec2 texcoord0; +#if !DEPTH_CLAMP VARYING vec4 post_pos; +#endif void main() { @@ -51,9 +53,13 @@ void main() norm = normalize(norm); pos = projection_matrix * pos; +#if !DEPTH_CLAMP post_pos = pos; gl_Position = vec4(pos.x, pos.y, pos.w*0.5, pos.w); +#else + gl_Position = pos; +#endif } diff --git a/indra/newview/app_settings/shaders/class1/deferred/blurLightF.glsl b/indra/newview/app_settings/shaders/class1/deferred/blurLightF.glsl index f400eb7a5b..c030c23515 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/blurLightF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/blurLightF.glsl @@ -64,11 +64,23 @@ vec4 getPosition(vec2 pos_screen) return pos; } +vec3 decode_normal (vec2 enc) +{ + vec2 fenc = enc*4-2; + float f = dot(fenc,fenc); + float g = sqrt(1-f/4); + vec3 n; + n.xy = fenc*g; + n.z = 1-f/2; + return n; +} + void main() { vec2 tc = vary_fragcoord.xy; vec3 norm = texture2DRect(normalMap, tc).xyz; - norm = vec3((norm.xy-0.5)*2.0,norm.z); // unpack norm + norm = decode_normal(norm.xy); // unpack norm + vec3 pos = getPosition(tc).xyz; vec4 ccol = texture2DRect(lightMap, tc).rgba; diff --git a/indra/newview/app_settings/shaders/class1/deferred/bumpF.glsl b/indra/newview/app_settings/shaders/class1/deferred/bumpF.glsl index 23c4ea2fff..595c11fae2 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/bumpF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/bumpF.glsl @@ -39,6 +39,12 @@ VARYING vec3 vary_mat2; VARYING vec4 vertex_color; VARYING vec2 vary_texcoord0; +vec2 encode_normal(vec3 n) +{ + float f = sqrt(8 * n.z + 8); + return n.xy / f + 0.5; +} + void main() { vec3 col = vertex_color.rgb * texture2D(diffuseMap, vary_texcoord0.xy).rgb; @@ -52,5 +58,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.xyz * 0.5 + 0.5, 0.0); + frag_data[2] = vec4(encode_normal(nvn.xyz), vertex_color.a, 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 c1fa9e4aac..7930b5d18b 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/diffuseAlphaMaskF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/diffuseAlphaMaskF.glsl @@ -37,6 +37,12 @@ VARYING vec3 vary_normal; VARYING vec4 vertex_color; VARYING vec2 vary_texcoord0; +vec2 encode_normal(vec3 n) +{ + float f = sqrt(8 * n.z + 8); + return n.xy / f + 0.5; +} + void main() { vec4 col = texture2D(diffuseMap, vary_texcoord0.xy) * vertex_color; @@ -49,6 +55,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.xyz * 0.5 + 0.5, 0.0); + frag_data[2] = vec4(encode_normal(nvn.xyz), 0.0, 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 4c68123fac..59d109b886 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/diffuseAlphaMaskIndexedF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/diffuseAlphaMaskIndexedF.glsl @@ -36,6 +36,12 @@ uniform float minimum_alpha; VARYING vec4 vertex_color; VARYING vec2 vary_texcoord0; +vec2 encode_normal(vec3 n) +{ + float f = sqrt(8 * n.z + 8); + return n.xy / f + 0.5; +} + void main() { vec4 col = diffuseLookup(vary_texcoord0.xy) * vertex_color; @@ -48,5 +54,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.xyz * 0.5 + 0.5, 0.0); + frag_data[2] = vec4(encode_normal(nvn.xyz), 0.0, 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 ad65c7d330..37d70a2412 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/diffuseAlphaMaskNoColorF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/diffuseAlphaMaskNoColorF.glsl @@ -37,6 +37,12 @@ uniform sampler2D diffuseMap; VARYING vec3 vary_normal; VARYING vec2 vary_texcoord0; +vec2 encode_normal(vec3 n) +{ + float f = sqrt(8 * n.z + 8); + return n.xy / f + 0.5; +} + void main() { vec4 col = texture2D(diffuseMap, vary_texcoord0.xy); @@ -49,6 +55,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.xyz * 0.5 + 0.5, 0.0); + frag_data[2] = vec4(encode_normal(nvn.xyz), 0.0, 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 86390bdd83..6befb1bd8b 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/diffuseF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/diffuseF.glsl @@ -35,6 +35,12 @@ VARYING vec3 vary_normal; VARYING vec4 vertex_color; VARYING vec2 vary_texcoord0; +vec2 encode_normal(vec3 n) +{ + float f = sqrt(8 * n.z + 8); + return n.xy / f + 0.5; +} + void main() { vec3 col = vertex_color.rgb * texture2D(diffuseMap, vary_texcoord0.xy).rgb; @@ -42,6 +48,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.xyz * 0.5 + 0.5, 0.0); + frag_data[2] = vec4(encode_normal(nvn.xyz), vertex_color.a, 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 788b966af8..a2c3ec3355 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/diffuseIndexedF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/diffuseIndexedF.glsl @@ -33,13 +33,20 @@ VARYING vec3 vary_normal; VARYING vec4 vertex_color; VARYING vec2 vary_texcoord0; +vec2 encode_normal(vec3 n) +{ + float f = sqrt(8 * n.z + 8); + return n.xy / f + 0.5; +} + + void main() { vec3 col = vertex_color.rgb * diffuseLookup(vary_texcoord0.xy).rgb; frag_data[0] = vec4(col, 0.0); 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 + 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.xyz * 0.5 + 0.5, 0.0); + frag_data[2] = vec4(encode_normal(nvn.xyz), vertex_color.a, 0.0); } diff --git a/indra/newview/app_settings/shaders/class1/deferred/diffuseV.glsl b/indra/newview/app_settings/shaders/class1/deferred/diffuseV.glsl index 76d29b1df7..3c026796c8 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/diffuseV.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/diffuseV.glsl @@ -47,6 +47,6 @@ void main() passTextureIndex(); vary_normal = normalize(normal_matrix * normal); - + vertex_color = diffuse_color; } diff --git a/indra/newview/app_settings/shaders/class1/deferred/emissiveF.glsl b/indra/newview/app_settings/shaders/class1/deferred/emissiveF.glsl index 6aa4d7b4ed..ed02c4a481 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/emissiveF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/emissiveF.glsl @@ -42,7 +42,7 @@ void main() float shadow = 1.0; vec4 color = diffuseLookup(vary_texcoord0.xy)*vertex_color; - + color.rgb = pow(color.rgb, vec3(2.2)); color.rgb = fullbrightAtmosTransport(color.rgb); color.rgb = fullbrightScaleSoftClip(color.rgb); diff --git a/indra/newview/app_settings/shaders/class1/deferred/fullbrightF.glsl b/indra/newview/app_settings/shaders/class1/deferred/fullbrightF.glsl index 36433a5827..b91aaf80fb 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/fullbrightF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/fullbrightF.glsl @@ -43,7 +43,7 @@ void main() float shadow = 1.0; vec4 color = diffuseLookup(vary_texcoord0.xy)*vertex_color; - + color.rgb = pow(color.rgb, vec3(2.2)); color.rgb = fullbrightAtmosTransport(color.rgb); color.rgb = fullbrightScaleSoftClip(color.rgb); diff --git a/indra/newview/app_settings/shaders/class1/deferred/materialF.glsl b/indra/newview/app_settings/shaders/class1/deferred/materialF.glsl new file mode 100644 index 0000000000..a4eaac8483 --- /dev/null +++ b/indra/newview/app_settings/shaders/class1/deferred/materialF.glsl @@ -0,0 +1,632 @@ +/** + * @file materialF.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$ + */ + +#define DIFFUSE_ALPHA_MODE_IGNORE 0 +#define DIFFUSE_ALPHA_MODE_BLEND 1 +#define DIFFUSE_ALPHA_MODE_MASK 2 +#define DIFFUSE_ALPHA_MODE_EMISSIVE 3 + + +#if (DIFFUSE_ALPHA_MODE == DIFFUSE_ALPHA_MODE_BLEND) + +#ifdef DEFINE_GL_FRAGCOLOR +out vec4 frag_color; +#else +#define frag_color gl_FragColor +#endif + + +#if HAS_SUN_SHADOW + +uniform sampler2DShadow shadowMap0; +uniform sampler2DShadow shadowMap1; +uniform sampler2DShadow shadowMap2; +uniform sampler2DShadow shadowMap3; + +uniform mat4 shadow_matrix[6]; +uniform vec4 shadow_clip; +uniform vec2 shadow_res; +uniform float shadow_bias; + +float pcfShadow(sampler2DShadow shadowMap, vec4 stc) +{ + stc.xyz /= stc.w; + stc.z += shadow_bias; + + 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 = shadow2D(shadowMap, stc.xyz).x; + float shadow = cs; + + 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; +} + +#endif + +uniform samplerCube environmentMap; +uniform sampler2D lightFunc; + +// Inputs +uniform vec4 morphFactor; +uniform vec3 camPosLocal; +//uniform vec4 camPosWorld; +uniform vec4 gamma; +uniform vec4 lightnorm; +uniform vec4 sunlight_color; +uniform vec4 ambient; +uniform vec4 blue_horizon; +uniform vec4 blue_density; +uniform float haze_horizon; +uniform float haze_density; +uniform float cloud_shadow; +uniform float density_multiplier; +uniform float distance_multiplier; +uniform float max_y; +uniform vec4 glow; +uniform float scene_light_strength; +uniform mat3 env_mat; +uniform mat3 ssao_effect_mat; + +uniform vec3 sun_dir; +VARYING vec2 vary_fragcoord; + +VARYING vec3 vary_position; + +vec3 vary_PositionEye; + +vec3 vary_SunlitColor; +vec3 vary_AmblitColor; +vec3 vary_AdditiveColor; +vec3 vary_AtmosAttenuation; + +uniform mat4 inv_proj; +uniform vec2 screen_res; + +uniform vec4 light_position[8]; +uniform vec3 light_direction[8]; +uniform vec3 light_attenuation[8]; +uniform vec3 light_diffuse[8]; + +vec3 calcDirectionalLight(vec3 n, vec3 l) +{ + float a = max(dot(n,l),0.0); + return vec3(a,a,a); +} + + +vec3 calcPointLightOrSpotLight(vec3 light_col, vec3 npos, vec3 diffuse, vec4 spec, vec3 v, vec3 n, vec4 lp, vec3 ln, float la, float fa, float is_pointlight) +{ + //get light vector + vec3 lv = lp.xyz-v; + + //get distance + float d = dot(lv,lv); + + float da = 1.0; + + vec3 col = vec3(0,0,0); + + if (d > 0.0 && la > 0.0 && fa > 0.0) + { + //normalize light vector + lv = normalize(lv); + + //distance attenuation + float dist2 = d/la; + float dist_atten = clamp(1.0-(dist2-1.0*(1.0-fa))/fa, 0.0, 1.0); + + // spotlight coefficient. + float spot = max(dot(-ln, lv), is_pointlight); + da *= spot*spot; // GL_SPOT_EXPONENT=2 + + //angular attenuation + da *= max(dot(n, lv), 0.0); + + float lit = max(da * dist_atten, 0.0); + + col = light_col*lit*diffuse; + + if (spec.a > 0.0) + { + //vec3 ref = dot(pos+lv, norm); + vec3 h = normalize(lv+npos); + float nh = dot(n, h); + float nv = dot(n, npos); + float vh = dot(npos, h); + float sa = nh; + float fres = pow(1 - dot(h, npos), 5)*0.4+0.5; + + float gtdenom = 2 * nh; + float gt = max(0, min(gtdenom * nv / vh, gtdenom * da / vh)); + + if (nh > 0.0) + { + float scol = fres*texture2D(lightFunc, vec2(nh, spec.a)).r*gt/(nh*da); + col += lit*scol*light_col.rgb*spec.rgb; + //col += spec.rgb; + } + } + } + + return max(col, vec3(0.0,0.0,0.0)); + +} + +vec3 decode_normal (vec2 enc) +{ + vec2 fenc = enc*4-2; + float f = dot(fenc,fenc); + float g = sqrt(1-f/4); + vec3 n; + n.xy = fenc*g; + n.z = 1-f/2; + return n; +} + +vec4 getPosition_d(vec2 pos_screen, float depth) +{ + vec2 sc = pos_screen.xy*2.0; + sc /= screen_res; + sc -= vec2(1.0,1.0); + vec4 ndc = vec4(sc.x, sc.y, 2.0*depth-1.0, 1.0); + vec4 pos = inv_proj * ndc; + pos /= pos.w; + pos.w = 1.0; + return pos; +} + +vec3 getPositionEye() +{ + return vary_PositionEye; +} +vec3 getSunlitColor() +{ + return vary_SunlitColor; +} +vec3 getAmblitColor() +{ + return vary_AmblitColor; +} +vec3 getAdditiveColor() +{ + return vary_AdditiveColor; +} +vec3 getAtmosAttenuation() +{ + return vary_AtmosAttenuation; +} + +void setPositionEye(vec3 v) +{ + vary_PositionEye = v; +} + +void setSunlitColor(vec3 v) +{ + vary_SunlitColor = v; +} + +void setAmblitColor(vec3 v) +{ + vary_AmblitColor = v; +} + +void setAdditiveColor(vec3 v) +{ + vary_AdditiveColor = v; +} + +void setAtmosAttenuation(vec3 v) +{ + vary_AtmosAttenuation = v; +} + +void calcAtmospherics(vec3 inPositionEye, float ambFactor) { + + vec3 P = inPositionEye; + setPositionEye(P); + + vec3 tmpLightnorm = lightnorm.xyz; + + vec3 Pn = normalize(P); + float Plen = length(P); + + vec4 temp1 = vec4(0); + vec3 temp2 = vec3(0); + vec4 blue_weight; + vec4 haze_weight; + vec4 sunlight = sunlight_color; + vec4 light_atten; + + //sunlight attenuation effect (hue and brightness) due to atmosphere + //this is used later for sunlight modulation at various altitudes + light_atten = (blue_density + vec4(haze_density * 0.25)) * (density_multiplier * max_y); + //I had thought blue_density and haze_density should have equal weighting, + //but attenuation due to haze_density tends to seem too strong + + temp1 = blue_density + vec4(haze_density); + blue_weight = blue_density / temp1; + haze_weight = vec4(haze_density) / temp1; + + //(TERRAIN) compute sunlight from lightnorm only (for short rays like terrain) + temp2.y = max(0.0, tmpLightnorm.y); + temp2.y = 1. / temp2.y; + sunlight *= exp( - light_atten * temp2.y); + + // main atmospheric scattering line integral + temp2.z = Plen * density_multiplier; + + // Transparency (-> temp1) + // ATI Bugfix -- can't store temp1*temp2.z*distance_multiplier in a variable because the ati + // compiler gets confused. + temp1 = exp(-temp1 * temp2.z * distance_multiplier); + + //final atmosphere attenuation factor + setAtmosAttenuation(temp1.rgb); + + //compute haze glow + //(can use temp2.x as temp because we haven't used it yet) + temp2.x = dot(Pn, tmpLightnorm.xyz); + temp2.x = 1. - temp2.x; + //temp2.x is 0 at the sun and increases away from sun + temp2.x = max(temp2.x, .03); //was glow.y + //set a minimum "angle" (smaller glow.y allows tighter, brighter hotspot) + temp2.x *= glow.x; + //higher glow.x gives dimmer glow (because next step is 1 / "angle") + temp2.x = pow(temp2.x, glow.z); + //glow.z should be negative, so we're doing a sort of (1 / "angle") function + + //add "minimum anti-solar illumination" + temp2.x += .25; + + //increase ambient when there are more clouds + vec4 tmpAmbient = ambient + (vec4(1.) - ambient) * cloud_shadow * 0.5; + + /* decrease value and saturation (that in HSV, not HSL) for occluded areas + * // for HSV color/geometry used here, see http://gimp-savvy.com/BOOK/index.html?node52.html + * // The following line of code performs the equivalent of: + * float ambAlpha = tmpAmbient.a; + * float ambValue = dot(vec3(tmpAmbient), vec3(0.577)); // projection onto <1/rt(3), 1/rt(3), 1/rt(3)>, the neutral white-black axis + * vec3 ambHueSat = vec3(tmpAmbient) - vec3(ambValue); + * tmpAmbient = vec4(RenderSSAOEffect.valueFactor * vec3(ambValue) + RenderSSAOEffect.saturationFactor *(1.0 - ambFactor) * ambHueSat, ambAlpha); + */ + tmpAmbient = vec4(mix(ssao_effect_mat * tmpAmbient.rgb, tmpAmbient.rgb, ambFactor), tmpAmbient.a); + + //haze color + setAdditiveColor( + vec3(blue_horizon * blue_weight * (sunlight*(1.-cloud_shadow) + tmpAmbient) + + (haze_horizon * haze_weight) * (sunlight*(1.-cloud_shadow) * temp2.x + + tmpAmbient))); + + //brightness of surface both sunlight and ambient + setSunlitColor(pow(vec3(sunlight * .5), vec3(2.2)) * 2.2); + setAmblitColor(pow(vec3(tmpAmbient * .25), vec3(2.2)) * 2.2); + setAdditiveColor(pow(getAdditiveColor() * vec3(1.0 - temp1), vec3(2.2)) * 2.2); +} + +vec3 atmosLighting(vec3 light) +{ + light *= getAtmosAttenuation().r; + light += getAdditiveColor(); + return (2.0 * light); +} + +vec3 atmosTransport(vec3 light) { + light *= getAtmosAttenuation().r; + light += getAdditiveColor() * 2.0; + return light; +} +vec3 atmosGetDiffuseSunlightColor() +{ + return getSunlitColor(); +} + +vec3 scaleDownLight(vec3 light) +{ + return (light / vec3(scene_light_strength, scene_light_strength, scene_light_strength)); +} + +vec3 scaleUpLight(vec3 light) +{ + return (light * vec3(scene_light_strength, scene_light_strength, scene_light_strength)); +} + +vec3 atmosAmbient(vec3 light) +{ + return getAmblitColor() + (light * vec3(0.5f, 0.5f, 0.5f)); +} + +vec3 atmosAffectDirectionalLight(float lightIntensity) +{ + return getSunlitColor() * vec3(lightIntensity, lightIntensity, lightIntensity); +} + +vec3 scaleSoftClip(vec3 light) +{ + //soft clip effect: + vec3 zeroes = vec3(0.0f, 0.0f, 0.0f); + vec3 ones = vec3(1.0f, 1.0f, 1.0f); + + light = ones - clamp(light, zeroes, ones); + light = ones - pow(light, gamma.xxx); + + return light; +} + +#else +#ifdef DEFINE_GL_FRAGCOLOR +out vec4 frag_data[3]; +#else +#define frag_data gl_FragData +#endif +#endif + +uniform sampler2D diffuseMap; + +#if HAS_NORMAL_MAP +uniform sampler2D bumpMap; +#endif + +#if HAS_SPECULAR_MAP +uniform sampler2D specularMap; + +VARYING vec2 vary_texcoord2; +#endif + +uniform float env_intensity; +uniform vec4 specular_color; + +#if (DIFFUSE_ALPHA_MODE == DIFFUSE_ALPHA_MODE_MASK) +uniform float minimum_alpha; +#endif + +#if HAS_NORMAL_MAP +VARYING vec3 vary_mat0; +VARYING vec3 vary_mat1; +VARYING vec3 vary_mat2; +VARYING vec2 vary_texcoord1; +#else +VARYING vec3 vary_normal; +#endif + +VARYING vec4 vertex_color; +VARYING vec2 vary_texcoord0; + +vec2 encode_normal(vec3 n) +{ + float f = sqrt(8 * n.z + 8); + return n.xy / f + 0.5; +} + +void main() +{ + vec4 diffcol = texture2D(diffuseMap, vary_texcoord0.xy); + diffcol.rgb *= vertex_color.rgb; + +#if (DIFFUSE_ALPHA_MODE == DIFFUSE_ALPHA_MODE_MASK) + if (diffcol.a < minimum_alpha) + { + discard; + } +#endif + +#if (DIFFUSE_ALPHA_MODE == DIFFUSE_ALPHA_MODE_BLEND) + diffcol.rgb = pow(diffcol.rgb, vec3(2.2)); +#endif + +#if HAS_SPECULAR_MAP + vec4 spec = texture2D(specularMap, vary_texcoord2.xy); +#else + vec4 spec = specular_color; +#endif + +#if HAS_NORMAL_MAP + vec4 norm = texture2D(bumpMap, vary_texcoord1.xy); + + norm.xyz = norm.xyz * 2 - 1; + + vec3 tnorm = vec3(dot(norm.xyz,vary_mat0), + dot(norm.xyz,vary_mat1), + dot(norm.xyz,vary_mat2)); +#else + vec4 norm = vec4(0,0,0,1.0); + vec3 tnorm = vary_normal; +#endif + + norm.xyz = tnorm; + norm.xyz = normalize(norm.xyz); + + vec4 final_color = diffcol; + +#if (DIFFUSE_ALPHA_MODE != DIFFUSE_ALPHA_MODE_EMISSIVE) + final_color.a = 0; +#endif + + vec4 final_specular = spec; +#if HAS_SPECULAR_MAP + //final_color.rgb *= 1 - spec.a * env_intensity; + final_specular.rgb *= specular_color.rgb; + + vec4 final_normal = vec4(encode_normal(normalize(tnorm)), spec.a * env_intensity, 0.0); + final_specular.a = specular_color.a * norm.a; +#else + vec4 final_normal = vec4(encode_normal(normalize(tnorm)), env_intensity, 0.0); + final_specular.a = specular_color.a; +#endif + + +#if (DIFFUSE_ALPHA_MODE == DIFFUSE_ALPHA_MODE_BLEND) + //forward rendering, output just lit RGBA + vec3 pos = vary_position; + +#if HAS_SUN_SHADOW + float shadow = 0.0; + + vec4 spos = vec4(pos,1.0); + + if (spos.z > -shadow_clip.w) + { + vec4 lpos; + + vec4 near_split = shadow_clip*-0.75; + vec4 far_split = shadow_clip*-1.25; + vec4 transition_domain = near_split-far_split; + float weight = 0.0; + + if (spos.z < near_split.z) + { + lpos = shadow_matrix[3]*spos; + + float w = 1.0; + w -= max(spos.z-far_split.z, 0.0)/transition_domain.z; + shadow += pcfShadow(shadowMap3, lpos)*w; + weight += w; + shadow += max((pos.z+shadow_clip.z)/(shadow_clip.z-shadow_clip.w)*2.0-1.0, 0.0); + } + + if (spos.z < near_split.y && spos.z > far_split.z) + { + lpos = shadow_matrix[2]*spos; + + 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; + shadow += pcfShadow(shadowMap2, lpos)*w; + weight += w; + } + + if (spos.z < near_split.x && spos.z > far_split.y) + { + lpos = shadow_matrix[1]*spos; + + 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; + shadow += pcfShadow(shadowMap1, lpos)*w; + weight += w; + } + + if (spos.z > far_split.x) + { + lpos = shadow_matrix[0]*spos; + + float w = 1.0; + w -= max(near_split.x-spos.z, 0.0)/transition_domain.x; + + shadow += pcfShadow(shadowMap0, lpos)*w; + weight += w; + } + + + shadow /= weight; + } + else + { + shadow = 1.0; + } +#else + float shadow = 1.0; +#endif + + spec = final_specular; + vec4 diffuse = final_color; + float envIntensity = final_normal.z; + + vec3 col = vec3(0.0f,0.0f,0.0f); + + float bloom = 0.0; + calcAtmospherics(pos.xyz, 1.0); + + vec3 refnormpersp = normalize(reflect(pos.xyz, norm.xyz)); + + float da =dot(norm.xyz, sun_dir.xyz); + float final_da = da; + final_da = min(final_da, shadow); + final_da = max(final_da, diffuse.a); + final_da = max(final_da, 0.0f); + + col.rgb = atmosAmbient(col); + col.rgb = col.rgb + atmosAffectDirectionalLight(final_da * 2.6); + col.rgb *= diffuse.rgb; + + + if (spec.a > 0.0) // specular reflection + { + // the old infinite-sky shiny reflection + // + + float sa = dot(refnormpersp, sun_dir.xyz); + vec3 dumbshiny = vary_SunlitColor*shadow*(texture2D(lightFunc, vec2(sa, spec.a)).r); + + // add the two types of shiny together + vec3 spec_contrib = dumbshiny * spec.rgb; + bloom = dot(spec_contrib, spec_contrib) / 6; + col += spec_contrib; + } + + if (envIntensity > 0.0) + { + //add environmentmap + vec3 env_vec = env_mat * refnormpersp; + col = mix(col.rgb, pow(textureCube(environmentMap, env_vec).rgb, vec3(2.2)) * 2.2, + max(envIntensity-diffuse.a*2.0, 0.0)); + } + + col = atmosLighting(col); + col = scaleSoftClip(col); + + vec3 npos = normalize(-pos.xyz); + + #define LIGHT_LOOP(i) col.rgb = col.rgb + calcPointLightOrSpotLight(light_diffuse[i].rgb, npos, diffuse.rgb, final_specular, pos.xyz, norm.xyz, light_position[i], light_direction[i].xyz, light_attenuation[i].x, light_attenuation[i].y, light_attenuation[i].z); + + LIGHT_LOOP(1) + LIGHT_LOOP(2) + LIGHT_LOOP(3) + LIGHT_LOOP(4) + LIGHT_LOOP(5) + LIGHT_LOOP(6) + LIGHT_LOOP(7) + + frag_color.rgb = col.rgb; + frag_color.a = diffcol.a*vertex_color.a; + +#else + frag_data[0] = final_color; + +#ifdef UGLY_MAC_HACK + // magic spec exp clamp fixes rendering artifacts on older mac GF drivers + // + final_specular = min(final_specular, vec4(1.0f, 1.0f, 1.0f, 0.125f)); +#endif + + frag_data[1] = final_specular; // XYZ = Specular color. W = Specular exponent. + frag_data[2] = final_normal; // XY = Normal. Z = Env. intensity. +#endif +} diff --git a/indra/newview/app_settings/shaders/class1/deferred/materialV.glsl b/indra/newview/app_settings/shaders/class1/deferred/materialV.glsl new file mode 100644 index 0000000000..0638dcfa55 --- /dev/null +++ b/indra/newview/app_settings/shaders/class1/deferred/materialV.glsl @@ -0,0 +1,143 @@ +/** + * @file bumpV.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$ + */ + +#define DIFFUSE_ALPHA_MODE_IGNORE 0 +#define DIFFUSE_ALPHA_MODE_BLEND 1 +#define DIFFUSE_ALPHA_MODE_MASK 2 +#define DIFFUSE_ALPHA_MODE_EMISSIVE 3 + +#if HAS_SKIN +uniform mat4 modelview_matrix; +uniform mat4 projection_matrix; +mat4 getObjectSkinnedTransform(); +#else +uniform mat3 normal_matrix; +uniform mat4 modelview_projection_matrix; +#endif + +#if (DIFFUSE_ALPHA_MODE == DIFFUSE_ALPHA_MODE_BLEND) + +#if !HAS_SKIN +uniform mat4 modelview_matrix; +#endif + +VARYING vec3 vary_position; + +#endif + +uniform mat4 texture_matrix0; + +ATTRIBUTE vec3 position; +ATTRIBUTE vec4 diffuse_color; +ATTRIBUTE vec3 normal; +ATTRIBUTE vec2 texcoord0; + + +#if HAS_NORMAL_MAP +ATTRIBUTE vec3 binormal; +ATTRIBUTE vec2 texcoord1; + +VARYING vec3 vary_mat0; +VARYING vec3 vary_mat1; +VARYING vec3 vary_mat2; + +VARYING vec2 vary_texcoord1; +#else +VARYING vec3 vary_normal; +#endif + +#if HAS_SPECULAR_MAP +ATTRIBUTE vec2 texcoord2; +VARYING vec2 vary_texcoord2; +#endif + +VARYING vec4 vertex_color; +VARYING vec2 vary_texcoord0; + +void main() +{ +#if HAS_SKIN + mat4 mat = getObjectSkinnedTransform(); + + mat = modelview_matrix * mat; + + vec3 pos = (mat*vec4(position.xyz,1.0)).xyz; + +#if (DIFFUSE_ALPHA_MODE == DIFFUSE_ALPHA_MODE_BLEND) + vary_position = pos; +#endif + + gl_Position = projection_matrix*vec4(pos,1.0); + +#else + //transform vertex + gl_Position = modelview_projection_matrix * vec4(position.xyz, 1.0); + +#endif + + vary_texcoord0 = (texture_matrix0 * vec4(texcoord0,0,1)).xy; + +#if HAS_NORMAL_MAP + vary_texcoord1 = (texture_matrix0 * vec4(texcoord1,0,1)).xy; +#endif + +#if HAS_SPECULAR_MAP + vary_texcoord2 = (texture_matrix0 * vec4(texcoord2,0,1)).xy; +#endif + +#if HAS_SKIN + vec3 n = normalize((mat*vec4(normal.xyz+position.xyz,1.0)).xyz-pos.xyz); +#if HAS_NORMAL_MAP + vec3 b = normalize((mat*vec4(binormal.xyz+position.xyz,1.0)).xyz-pos.xyz); + vec3 t = cross(b, n); + + vary_mat0 = vec3(t.x, b.x, n.x); + vary_mat1 = vec3(t.y, b.y, n.y); + vary_mat2 = vec3(t.z, b.z, n.z); +#else //HAS_NORMAL_MAP +vary_normal = n; +#endif //HAS_NORMAL_MAP +#else //HAS_SKIN + vec3 n = normalize(normal_matrix * normal); +#if HAS_NORMAL_MAP + vec3 b = normalize(normal_matrix * binormal); + vec3 t = cross(b, n); + + vary_mat0 = vec3(t.x, b.x, n.x); + vary_mat1 = vec3(t.y, b.y, n.y); + vary_mat2 = vec3(t.z, b.z, n.z); +#else //HAS_NORMAL_MAP + vary_normal = n; +#endif //HAS_NORMAL_MAP +#endif //HAS_SKIN + + vertex_color = diffuse_color; + +#if (DIFFUSE_ALPHA_MODE == DIFFUSE_ALPHA_MODE_BLEND) +#if !HAS_SKIN + vary_position = (modelview_matrix*vec4(position.xyz, 1.0)).xyz; +#endif +#endif +} diff --git a/indra/newview/app_settings/shaders/class1/deferred/multiPointLightF.glsl b/indra/newview/app_settings/shaders/class1/deferred/multiPointLightF.glsl index 7e79317543..338532e71d 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/multiPointLightF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/multiPointLightF.glsl @@ -56,6 +56,17 @@ uniform float far_z; uniform mat4 inv_proj; +vec3 decode_normal (vec2 enc) +{ + vec2 fenc = enc*4-2; + float f = dot(fenc,fenc); + float g = sqrt(1-f/4); + vec3 n; + n.xy = fenc*g; + n.z = 1-f/2; + return n; +} + vec4 getPosition(vec2 pos_screen) { float depth = texture2DRect(depthMap, pos_screen.xy).r; @@ -79,7 +90,7 @@ void main() } vec3 norm = texture2DRect(normalMap, frag.xy).xyz; - norm = (norm.xyz-0.5)*2.0; // unpack norm + norm = decode_normal(norm.xy); // unpack norm norm = normalize(norm); vec4 spec = texture2DRect(specularRect, frag.xy); vec3 diff = texture2DRect(diffuseRect, frag.xy).rgb; @@ -110,27 +121,39 @@ void main() { lv = normalize(lv); da = dot(norm, lv); - + float fa = light_col[i].a+1.0; float dist_atten = clamp(1.0-(dist2-1.0*(1.0-fa))/fa, 0.0, 1.0); + + dist_atten = pow(dist_atten, 2.2) * 2.2; + dist_atten *= noise; float lit = da * dist_atten; - + vec3 col = light_col[i].rgb*lit*diff; + //vec3 col = vec3(dist2, light_col[i].a, lit); if (spec.a > 0.0) { + lit = min(da*6.0, 1.0) * dist_atten; //vec3 ref = dot(pos+lv, norm); - - float sa = dot(normalize(lv+npos),norm); - - if (sa > 0.0) + vec3 h = normalize(lv+npos); + float nh = dot(norm, h); + float nv = dot(norm, npos); + float vh = dot(npos, h); + float sa = nh; + float fres = pow(1 - dot(h, npos), 5)*0.4+0.5; + + float gtdenom = 2 * nh; + float gt = max(0, min(gtdenom * nv / vh, gtdenom * da / vh)); + + if (nh > 0.0) { - sa = 6 * texture2D(lightFunc, vec2(sa, spec.a)).r * min(dist_atten*4.0, 1.0); - sa *= noise; - col += da*sa*light_col[i].rgb*spec.rgb; + float scol = fres*texture2D(lightFunc, vec2(nh, spec.a)).r*gt/(nh*da); + col += lit*scol*light_col[i].rgb*spec.rgb; + //col += spec.rgb; } } diff --git a/indra/newview/app_settings/shaders/class1/deferred/multiSpotLightF.glsl b/indra/newview/app_settings/shaders/class1/deferred/multiSpotLightF.glsl index bff87cb6aa..6675bfde69 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/multiSpotLightF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/multiSpotLightF.glsl @@ -40,6 +40,7 @@ uniform sampler2DRect normalMap; uniform samplerCube environmentMap; uniform sampler2D noiseMap; uniform sampler2D projectionMap; +uniform sampler2D lightFunc; uniform mat4 proj_mat; //screen space to light space uniform float proj_near; //near clip for projection @@ -66,9 +67,26 @@ uniform vec2 screen_res; uniform mat4 inv_proj; +vec3 decode_normal (vec2 enc) +{ + vec2 fenc = enc*4-2; + float f = dot(fenc,fenc); + float g = sqrt(1-f/4); + vec3 n; + n.xy = fenc*g; + n.z = 1-f/2; + return n; +} + +vec4 correctWithGamma(vec4 col) +{ + return vec4(pow(col.rgb, vec3(2.2)), col.a); +} + vec4 texture2DLodSpecular(sampler2D projectionMap, vec2 tc, float lod) { vec4 ret = texture2DLod(projectionMap, tc, lod); + ret = correctWithGamma(ret); vec2 dist = tc-vec2(0.5); @@ -84,7 +102,8 @@ vec4 texture2DLodSpecular(sampler2D projectionMap, vec2 tc, float lod) vec4 texture2DLodDiffuse(sampler2D projectionMap, vec2 tc, float lod) { vec4 ret = texture2DLod(projectionMap, tc, lod); - + ret = correctWithGamma(ret); + vec2 dist = vec2(0.5) - abs(tc-vec2(0.5)); float det = min(lod/(proj_lod*0.5), 1.0); @@ -101,7 +120,8 @@ vec4 texture2DLodDiffuse(sampler2D projectionMap, vec2 tc, float lod) vec4 texture2DLodAmbient(sampler2D projectionMap, vec2 tc, float lod) { vec4 ret = texture2DLod(projectionMap, tc, lod); - + ret = correctWithGamma(ret); + vec2 dist = tc-vec2(0.5); float d = dot(dist,dist); @@ -142,7 +162,9 @@ void main() } vec3 norm = texture2DRect(normalMap, frag.xy).xyz; - norm = vec3((norm.xy-0.5)*2.0, norm.z); + float envIntensity = norm.z; + + norm = decode_normal(norm.xy); norm = normalize(norm); float l_dist = -dot(lv, proj_n); @@ -157,6 +179,7 @@ void main() float fa = falloff+1.0; float dist_atten = min(1.0-(dist2-1.0*(1.0-fa))/fa, 1.0); + dist_atten = pow(dist_atten, 2.2) * 2.2; if (dist_atten <= 0.0) { discard; @@ -169,7 +192,8 @@ void main() vec3 col = vec3(0,0,0); vec3 diff_tex = texture2DRect(diffuseRect, frag.xy).rgb; - + vec3 dlit = vec3(0, 0, 0); + float noise = texture2D(noiseMap, frag.xy/128.0).b; if (proj_tc.z > 0.0 && proj_tc.x < 1.0 && @@ -187,14 +211,13 @@ void main() vec4 plcol = texture2DLodDiffuse(projectionMap, proj_tc.xy, lod); - vec3 lcol = color.rgb * plcol.rgb * plcol.a; + dlit = color.rgb * plcol.rgb * plcol.a; lit = da * dist_atten * noise; - col = lcol*lit*diff_tex; + col = dlit*lit*diff_tex; amb_da += (da*0.5)*proj_ambiance; } - //float diff = clamp((proj_range-proj_focus)/proj_range, 0.0, 1.0); vec4 amb_plcol = texture2DLodAmbient(projectionMap, proj_tc.xy, proj_lod); @@ -203,14 +226,39 @@ void main() 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; + col += amb_da*color.rgb*diff_tex*amb_plcol.rgb*amb_plcol.a; } vec4 spec = texture2DRect(specularRect, frag.xy); + if (spec.a > 0.0) { + dlit *= min(da*6.0, 1.0) * dist_atten; + + vec3 npos = -normalize(pos); + + //vec3 ref = dot(pos+lv, norm); + vec3 h = normalize(lv+npos); + float nh = dot(norm, h); + float nv = dot(norm, npos); + float vh = dot(npos, h); + float sa = nh; + float fres = pow(1 - dot(h, npos), 5)*0.4+0.5; + + float gtdenom = 2 * nh; + float gt = max(0, min(gtdenom * nv / vh, gtdenom * da / vh)); + + if (nh > 0.0) + { + float scol = fres*texture2D(lightFunc, vec2(nh, spec.a)).r*gt/(nh*da); + col += dlit*scol*spec.rgb; + //col += spec.rgb; + } + } + + if (envIntensity > 0.0) + { vec3 ref = reflect(normalize(pos), norm); //project from point pos in direction ref to plane proj_p, proj_n @@ -227,8 +275,9 @@ void main() { stc.xy /= stc.w; - float fatten = clamp(spec.a*spec.a+spec.a*0.5, 0.25, 1.0); + float fatten = clamp(envIntensity*envIntensity+envIntensity*0.5, 0.25, 1.0); + //stc.xy = (stc.xy - vec2(0.5)) * fatten + vec2(0.5); stc.xy = (stc.xy - vec2(0.5)) * fatten + vec2(0.5); if (stc.x < 1.0 && @@ -236,8 +285,7 @@ void main() stc.x > 0.0 && stc.y > 0.0) { - vec4 scol = texture2DLodSpecular(projectionMap, stc.xy, proj_lod-spec.a*proj_lod); - col += dist_atten*scol.rgb*color.rgb*scol.a*spec.rgb; + col += color.rgb*texture2DLodSpecular(projectionMap, stc.xy, proj_lod-envIntensity*proj_lod).rgb*spec.rgb; } } } diff --git a/indra/newview/app_settings/shaders/class1/deferred/pointLightF.glsl b/indra/newview/app_settings/shaders/class1/deferred/pointLightF.glsl index 75757b26c8..69cdb2ce71 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/pointLightF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/pointLightF.glsl @@ -54,6 +54,17 @@ uniform vec2 screen_res; uniform mat4 inv_proj; uniform vec4 viewport; +vec3 decode_normal (vec2 enc) +{ + vec2 fenc = enc*4-2; + float f = dot(fenc,fenc); + float g = sqrt(1-f/4); + vec3 n; + n.xy = fenc*g; + n.z = 1-f/2; + return n; +} + vec4 getPosition(vec2 pos_screen) { float depth = texture2DRect(depthMap, pos_screen.xy).r; @@ -84,7 +95,7 @@ void main() } vec3 norm = texture2DRect(normalMap, frag.xy).xyz; - norm = (norm.xyz-0.5)*2.0; // unpack norm + norm = decode_normal(norm.xy); // unpack norm float da = dot(norm, lv); if (da < 0.0) { @@ -100,19 +111,30 @@ void main() vec3 col = texture2DRect(diffuseRect, frag.xy).rgb; float fa = falloff+1.0; float dist_atten = clamp(1.0-(dist2-1.0*(1.0-fa))/fa, 0.0, 1.0); + dist_atten = pow(dist_atten, 2.2) * 2.2; float lit = da * dist_atten * noise; - + col = color.rgb*lit*col; vec4 spec = texture2DRect(specularRect, frag.xy); if (spec.a > 0.0) { - float sa = dot(normalize(lv-normalize(pos)),norm); - if (sa > 0.0) + lit = min(da*6.0, 1.0) * dist_atten; + + vec3 npos = -normalize(pos); + vec3 h = normalize(lv+npos); + float nh = dot(norm, h); + float nv = dot(norm, npos); + float vh = dot(npos, h); + float sa = nh; + float fres = pow(1 - dot(h, npos), 5) * 0.4+0.5; + float gtdenom = 2 * nh; + float gt = max(0,(min(gtdenom * nv / vh, gtdenom * da / vh))); + + if (nh > 0.0) { - sa = 6 * texture2D(lightFunc, vec2(sa, spec.a)).r * min(dist_atten*4.0, 1.0); - sa *= noise; - col += da*sa*color.rgb*spec.rgb; + float scol = fres*texture2D(lightFunc, vec2(nh, spec.a)).r*gt/(nh*da); + col += lit*scol*color.rgb*spec.rgb; } } diff --git a/indra/newview/fmodwrapper.cpp b/indra/newview/app_settings/shaders/class1/deferred/postDeferredGammaCorrect.glsl index 16f1d19a78..2d6bce02c9 100644 --- a/indra/newview/fmodwrapper.cpp +++ b/indra/newview/app_settings/shaders/class1/deferred/postDeferredGammaCorrect.glsl @@ -1,10 +1,9 @@ /** - * @file fmodwrapper.cpp - * @brief dummy source file for building a shared library to wrap libfmod.a + * @file postDeferredGammaCorrect.glsl * - * $LicenseInfo:firstyear=2005&license=viewerlgpl$ + * $LicenseInfo:firstyear=2007&license=viewerlgpl$ * Second Life Viewer Source Code - * Copyright (C) 2010, Linden Research, Inc. + * 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 @@ -23,15 +22,25 @@ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA * $/LicenseInfo$ */ + +#extension GL_ARB_texture_rectangle : enable -extern "C" -{ - void FSOUND_Init(void); -} +#ifdef DEFINE_GL_FRAGCOLOR +out vec4 frag_color; +#else +#define frag_color gl_FragColor +#endif + +uniform sampler2DRect diffuseRect; -void* fmodwrapper(void) +uniform vec2 screen_res; +VARYING vec2 vary_fragcoord; + +uniform float texture_gamma; + +void main() { - // When building the fmodwrapper library, the linker doesn't seem to want to bring in libfmod.a unless I explicitly - // reference at least one symbol in the library. This seemed like the simplest way. - return (void*)&FSOUND_Init; + vec4 diff = texture2DRect(diffuseRect, vary_fragcoord); + frag_color = pow(diff, vec4(texture_gamma, texture_gamma, texture_gamma, 1.0)); } + diff --git a/indra/newview/app_settings/shaders/class1/deferred/shadowAlphaMaskF.glsl b/indra/newview/app_settings/shaders/class1/deferred/shadowAlphaMaskF.glsl index bced4a5577..91a96977f0 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/shadowAlphaMaskF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/shadowAlphaMaskF.glsl @@ -31,8 +31,12 @@ out vec4 frag_color; uniform sampler2D diffuseMap; +#if !DEPTH_CLAMP VARYING float pos_zd2; +#endif + VARYING float pos_w; + VARYING float target_pos_x; VARYING vec4 vertex_color; VARYING vec2 vary_texcoord0; @@ -56,5 +60,7 @@ void main() frag_color = vec4(1,1,1,1); +#if !DEPTH_CLAMP gl_FragDepth = max(pos_zd2/pos_w+0.5, 0.0); +#endif } diff --git a/indra/newview/app_settings/shaders/class1/deferred/shadowAlphaMaskV.glsl b/indra/newview/app_settings/shaders/class1/deferred/shadowAlphaMaskV.glsl index c1f2d90712..11411a605c 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/shadowAlphaMaskV.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/shadowAlphaMaskV.glsl @@ -31,8 +31,12 @@ ATTRIBUTE vec3 position; ATTRIBUTE vec4 diffuse_color; ATTRIBUTE vec2 texcoord0; +#if !DEPTH_CLAMP VARYING float pos_zd2; +#endif + VARYING float pos_w; + VARYING float target_pos_x; VARYING vec4 vertex_color; VARYING vec2 vary_texcoord0; @@ -45,10 +49,16 @@ void main() vec4 pre_pos = vec4(position.xyz, 1.0); vec4 pos = modelview_projection_matrix * pre_pos; target_pos_x = 0.5 * (shadow_target_width - 1.0) * pos.x; + pos_w = pos.w; + +#if !DEPTH_CLAMP pos_zd2 = pos.z * 0.5; gl_Position = vec4(pos.x, pos.y, pos.w*0.5, pos.w); +#else + gl_Position = pos; +#endif passTextureIndex(); diff --git a/indra/newview/app_settings/shaders/class1/deferred/shadowCubeV.glsl b/indra/newview/app_settings/shaders/class1/deferred/shadowCubeV.glsl index 6195e2f1ec..ef153dfc5b 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/shadowCubeV.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/shadowCubeV.glsl @@ -27,7 +27,9 @@ uniform mat4 modelview_projection_matrix; ATTRIBUTE vec3 position; +#if !DEPTH_CLAMP VARYING vec4 post_pos; +#endif uniform vec3 box_center; uniform vec3 box_size; @@ -37,8 +39,12 @@ void main() //transform vertex vec3 p = position*box_size+box_center; vec4 pos = modelview_projection_matrix*vec4(p.xyz, 1.0); - + +#if !DEPTH_CLAMP post_pos = pos; - + gl_Position = vec4(pos.x, pos.y, pos.w*0.5, pos.w); +#else + gl_Position = pos; +#endif } diff --git a/indra/newview/app_settings/shaders/class1/deferred/shadowF.glsl b/indra/newview/app_settings/shaders/class1/deferred/shadowF.glsl index 7e55fdc12a..3d1b182875 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/shadowF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/shadowF.glsl @@ -29,11 +29,16 @@ out vec4 frag_color; #define frag_color gl_FragColor #endif +#if !DEPTH_CLAMP VARYING vec4 post_pos; +#endif void main() { frag_color = vec4(1,1,1,1); +#if !DEPTH_CLAMP gl_FragDepth = max(post_pos.z/post_pos.w*0.5+0.5, 0.0); +#endif + } diff --git a/indra/newview/app_settings/shaders/class1/deferred/shadowV.glsl b/indra/newview/app_settings/shaders/class1/deferred/shadowV.glsl index 8b46e81f90..cc77a4cea0 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/shadowV.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/shadowV.glsl @@ -27,14 +27,20 @@ uniform mat4 modelview_projection_matrix; ATTRIBUTE vec3 position; +#if !DEPTH_CLAMP VARYING vec4 post_pos; +#endif void main() { //transform vertex vec4 pos = modelview_projection_matrix*vec4(position.xyz, 1.0); +#if !DEPTH_CLAMP post_pos = pos; - + gl_Position = vec4(pos.x, pos.y, pos.w*0.5, pos.w); +#else + gl_Position = pos; +#endif } diff --git a/indra/newview/app_settings/shaders/class1/deferred/skyF.glsl b/indra/newview/app_settings/shaders/class1/deferred/skyF.glsl index faa54a316e..49ad064364 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/skyF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/skyF.glsl @@ -61,6 +61,6 @@ void main() /// Gamma correct for WL (soft clip effect). frag_data[0] = vec4(scaleSoftClip(color.rgb), 1.0); frag_data[1] = vec4(0.0,0.0,0.0,0.0); - frag_data[2] = vec4(0,0,1,0); + frag_data[2] = vec4(0.5,0.5,0.0,0); } diff --git a/indra/newview/app_settings/shaders/class1/deferred/softenLightF.glsl b/indra/newview/app_settings/shaders/class1/deferred/softenLightF.glsl index 89448e2167..a1dff9188f 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/softenLightF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/softenLightF.glsl @@ -60,6 +60,7 @@ uniform float density_multiplier; uniform float distance_multiplier; uniform float max_y; uniform vec4 glow; +uniform float global_gamma; uniform float scene_light_strength; uniform mat3 env_mat; uniform mat3 ssao_effect_mat; @@ -77,6 +78,17 @@ vec3 vary_AtmosAttenuation; uniform mat4 inv_proj; uniform vec2 screen_res; +vec3 decode_normal (vec2 enc) +{ + vec2 fenc = enc*4-2; + float f = dot(fenc,fenc); + float g = sqrt(1-f/4); + vec3 n; + n.xy = fenc*g; + n.z = 1-f/2; + return n; +} + vec4 getPosition_d(vec2 pos_screen, float depth) { vec2 sc = pos_screen.xy*2.0; @@ -116,7 +128,6 @@ vec3 getAtmosAttenuation() return vary_AtmosAttenuation; } - void setPositionEye(vec3 v) { vary_PositionEye = v; @@ -220,9 +231,9 @@ void calcAtmospherics(vec3 inPositionEye, float ambFactor) { + tmpAmbient))); //brightness of surface both sunlight and ambient - setSunlitColor(vec3(sunlight * .5)); - setAmblitColor(vec3(tmpAmbient * .25)); - setAdditiveColor(getAdditiveColor() * vec3(1.0 - temp1)); + setSunlitColor(pow(vec3(sunlight * .5), vec3(global_gamma)) * 2.2); + setAmblitColor(pow(vec3(tmpAmbient * .25), vec3(global_gamma)) * 2.2); + setAdditiveColor(pow(getAdditiveColor() * vec3(1.0 - temp1), vec3(global_gamma)) * 2.2); } vec3 atmosLighting(vec3 light) @@ -276,55 +287,55 @@ void main() vec2 tc = vary_fragcoord.xy; float depth = texture2DRect(depthMap, tc.xy).r; vec3 pos = getPosition_d(tc, depth).xyz; - vec3 norm = texture2DRect(normalMap, tc).xyz; - norm = (norm.xyz-0.5)*2.0; // unpack norm + vec4 norm = texture2DRect(normalMap, tc); + float envIntensity = norm.z; + norm.xyz = decode_normal(norm.xy); // unpack norm float da = max(dot(norm.xyz, sun_dir.xyz), 0.0); - + vec4 diffuse = texture2DRect(diffuseRect, tc); vec4 spec = texture2DRect(specularRect, vary_fragcoord.xy); - vec3 col; float bloom = 0.0; - if (diffuse.a < 0.9) { calcAtmospherics(pos.xyz, 1.0); col = atmosAmbient(vec3(0)); - col += atmosAffectDirectionalLight(max(min(da, 1.0), diffuse.a)); + col += atmosAffectDirectionalLight(max(min(da, 1.0) * 2.6, diffuse.a)); col *= diffuse.rgb; + vec3 refnormpersp = normalize(reflect(pos.xyz, norm.xyz)); + if (spec.a > 0.0) // specular reflection { // the old infinite-sky shiny reflection // - vec3 refnormpersp = normalize(reflect(pos.xyz, norm.xyz)); + float sa = dot(refnormpersp, sun_dir.xyz); - vec3 dumbshiny = vary_SunlitColor*(6 * texture2D(lightFunc, vec2(sa, spec.a)).r); + vec3 dumbshiny = vary_SunlitColor*(texture2D(lightFunc, vec2(sa, spec.a)).r); // add the two types of shiny together vec3 spec_contrib = dumbshiny * spec.rgb; - bloom = dot(spec_contrib, spec_contrib) / 4; + bloom = dot(spec_contrib, spec_contrib) / 6; col += spec_contrib; - - //add environmentmap - vec3 env_vec = env_mat * refnormpersp; - col = mix(col.rgb, textureCube(environmentMap, env_vec).rgb, - max(spec.a-diffuse.a*2.0, 0.0)); } + if (envIntensity > 0.0) + { //add environmentmap + vec3 env_vec = env_mat * refnormpersp; + col = mix(col.rgb, pow(textureCube(environmentMap, env_vec).rgb, vec3(2.2)) * 2.2, + envIntensity); + } + col = atmosLighting(col); col = scaleSoftClip(col); col = mix(col.rgb, diffuse.rgb, diffuse.a); } - else - { - col = diffuse.rgb; - } - + frag_color.rgb = col; - frag_color.a = bloom; + //frag_color.a = bloom; + frag_color.a = 0.0; } diff --git a/indra/newview/app_settings/shaders/class1/deferred/softenLightV.glsl b/indra/newview/app_settings/shaders/class1/deferred/softenLightV.glsl index c6031fc45a..b59fcbe017 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/softenLightV.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/softenLightV.glsl @@ -35,6 +35,6 @@ void main() //transform vertex vec4 pos = modelview_projection_matrix * vec4(position.xyz, 1.0); gl_Position = pos; - + vary_fragcoord = (pos.xy*0.5+0.5)*screen_res; } diff --git a/indra/newview/app_settings/shaders/class1/deferred/spotLightF.glsl b/indra/newview/app_settings/shaders/class1/deferred/spotLightF.glsl index cca63872de..c918a42c73 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/spotLightF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/spotLightF.glsl @@ -22,18 +22,15 @@ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA * $/LicenseInfo$ */ - +#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; @@ -41,6 +38,7 @@ uniform sampler2DRect normalMap; uniform samplerCube environmentMap; uniform sampler2D noiseMap; uniform sampler2D projectionMap; +uniform sampler2D lightFunc; uniform mat4 proj_mat; //screen space to light space uniform float proj_near; //near clip for projection @@ -57,20 +55,36 @@ uniform float far_clip; uniform vec3 proj_origin; //origin of projection to be used for angular attenuation uniform float sun_wash; +uniform float size; uniform vec3 color; uniform float falloff; -uniform float size; -VARYING vec4 vary_fragcoord; VARYING vec3 trans_center; - +VARYING vec4 vary_fragcoord; uniform vec2 screen_res; uniform mat4 inv_proj; +vec3 decode_normal (vec2 enc) +{ + vec2 fenc = enc*4-2; + float f = dot(fenc,fenc); + float g = sqrt(1-f/4); + vec3 n; + n.xy = fenc*g; + n.z = 1-f/2; + return n; +} + +vec4 correctWithGamma(vec4 col) +{ + return vec4(pow(col.rgb, vec3(2.2)), col.a); +} + vec4 texture2DLodSpecular(sampler2D projectionMap, vec2 tc, float lod) { vec4 ret = texture2DLod(projectionMap, tc, lod); + ret = correctWithGamma(ret); vec2 dist = tc-vec2(0.5); @@ -86,6 +100,7 @@ vec4 texture2DLodSpecular(sampler2D projectionMap, vec2 tc, float lod) vec4 texture2DLodDiffuse(sampler2D projectionMap, vec2 tc, float lod) { vec4 ret = texture2DLod(projectionMap, tc, lod); + ret = correctWithGamma(ret); vec2 dist = vec2(0.5) - abs(tc-vec2(0.5)); @@ -103,6 +118,7 @@ vec4 texture2DLodDiffuse(sampler2D projectionMap, vec2 tc, float lod) vec4 texture2DLodAmbient(sampler2D projectionMap, vec2 tc, float lod) { vec4 ret = texture2DLod(projectionMap, tc, lod); + ret = correctWithGamma(ret); vec2 dist = tc-vec2(0.5); @@ -142,9 +158,11 @@ void main() { discard; } + vec3 norm = texture2DRect(normalMap, frag.xy).xyz; - norm = vec3((norm.xy-0.5)*2.0, norm.z); + float envIntensity = norm.z; + norm = decode_normal(norm.xy); norm = normalize(norm); float l_dist = -dot(lv, proj_n); @@ -159,6 +177,7 @@ void main() float fa = falloff+1.0; float dist_atten = min(1.0-(dist2-1.0*(1.0-fa))/fa, 1.0); + dist_atten = pow(dist_atten, 2.2) * 2.2; if (dist_atten <= 0.0) { discard; @@ -172,31 +191,35 @@ void main() vec3 diff_tex = texture2DRect(diffuseRect, frag.xy).rgb; + vec4 spec = texture2DRect(specularRect, frag.xy); + + + float noise = texture2D(noiseMap, frag.xy/128.0).b; + vec3 dlit = vec3(0, 0, 0); + if (proj_tc.z > 0.0 && proj_tc.x < 1.0 && proj_tc.y < 1.0 && proj_tc.x > 0.0 && proj_tc.y > 0.0) { - float lit = 0.0; float amb_da = proj_ambiance; + float lit = 0.0; if (da > 0.0) { + lit = da * dist_atten * noise; + float diff = clamp((l_dist-proj_focus)/proj_range, 0.0, 1.0); float lod = diff * proj_lod; vec4 plcol = texture2DLodDiffuse(projectionMap, proj_tc.xy, lod); - - vec3 lcol = color.rgb * plcol.rgb * plcol.a; - - lit = da * dist_atten * noise; + dlit = color.rgb * plcol.rgb * plcol.a; - col = lcol*lit*diff_tex; - amb_da += (da*0.5)*proj_ambiance; + col = dlit*lit*diff_tex; + //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); @@ -205,14 +228,41 @@ void main() 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; + col += amb_da*color.rgb*diff_tex.rgb*amb_plcol.rgb*amb_plcol.a*diff_tex.rgb; } - - vec4 spec = texture2DRect(specularRect, frag.xy); + if (spec.a > 0.0) { + dlit *= min(da*6.0, 1.0) * dist_atten; + vec3 npos = -normalize(pos); + + //vec3 ref = dot(pos+lv, norm); + vec3 h = normalize(lv+npos); + float nh = dot(norm, h); + float nv = dot(norm, npos); + float vh = dot(npos, h); + float sa = nh; + float fres = pow(1 - dot(h, npos), 5)*0.4+0.5; + + float gtdenom = 2 * nh; + float gt = max(0, min(gtdenom * nv / vh, gtdenom * da / vh)); + + if (nh > 0.0) + { + + float scol = fres*texture2D(lightFunc, vec2(nh, spec.a)).r*gt/(nh*da); + col += dlit*scol*spec.rgb; + //col += spec.rgb; + } + } + + + + + + if (envIntensity > 0.0) + { vec3 ref = reflect(normalize(pos), norm); //project from point pos in direction ref to plane proj_p, proj_n @@ -229,8 +279,9 @@ void main() { stc.xy /= stc.w; - float fatten = clamp(spec.a*spec.a+spec.a*0.5, 0.25, 1.0); + float fatten = clamp(envIntensity*envIntensity+envIntensity*0.5, 0.25, 1.0); + //stc.xy = (stc.xy - vec2(0.5)) * fatten + vec2(0.5); stc.xy = (stc.xy - vec2(0.5)) * fatten + vec2(0.5); if (stc.x < 1.0 && @@ -238,8 +289,7 @@ void main() stc.x > 0.0 && stc.y > 0.0) { - vec4 scol = texture2DLodSpecular(projectionMap, stc.xy, proj_lod-spec.a*proj_lod); - col += dist_atten*scol.rgb*color.rgb*scol.a*spec.rgb; + col += color.rgb*texture2DLodSpecular(projectionMap, stc.xy, proj_lod-envIntensity*proj_lod).rgb*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 bac74cbbef..1470239a71 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/sunLightSSAOF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/sunLightSSAOF.glsl @@ -49,6 +49,17 @@ VARYING vec2 vary_fragcoord; uniform mat4 inv_proj; uniform vec2 screen_res; +vec3 decode_normal (vec2 enc) +{ + vec2 fenc = enc*4-2; + float f = dot(fenc,fenc); + float g = sqrt(1-f/4); + vec3 n; + n.xy = fenc*g; + n.z = 1-f/2; + return n; +} + vec4 getPosition(vec2 pos_screen) { float depth = texture2DRect(depthMap, pos_screen.xy).r; @@ -123,7 +134,7 @@ void main() vec4 pos = getPosition(pos_screen); vec3 norm = texture2DRect(normalMap, pos_screen).xyz; - norm = (norm.xyz-0.5)*2.0; // unpack norm + norm = decode_normal(norm.xy); 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 daf1cc7ea2..52a429465f 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/terrainF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/terrainF.glsl @@ -39,6 +39,12 @@ VARYING vec3 vary_normal; VARYING vec4 vary_texcoord0; VARYING vec4 vary_texcoord1; +vec2 encode_normal(vec3 n) +{ + float f = sqrt(8 * n.z + 8); + return n.xy / f + 0.5; +} + void main() { /// Note: This should duplicate the blending functionality currently used for the terrain rendering. @@ -56,6 +62,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.xyz * 0.5 + 0.5, 0.0); + frag_data[2] = vec4(encode_normal(nvn.xyz), 0.0, 0.0); } diff --git a/indra/newview/app_settings/shaders/class1/deferred/treeF.glsl b/indra/newview/app_settings/shaders/class1/deferred/treeF.glsl index da253846ef..808750496f 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/treeF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/treeF.glsl @@ -37,6 +37,12 @@ VARYING vec2 vary_texcoord0; uniform float minimum_alpha; +vec2 encode_normal(vec3 n) +{ + float f = sqrt(8 * n.z + 8); + return n.xy / f + 0.5; +} + void main() { vec4 col = texture2D(diffuseMap, vary_texcoord0.xy); @@ -48,5 +54,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.xyz * 0.5 + 0.5, 0.0); + frag_data[2] = vec4(encode_normal(nvn.xyz), 0.0, 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 3427d6db57..de858b34b5 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/waterF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/waterF.glsl @@ -67,6 +67,12 @@ VARYING vec4 littleWave; VARYING vec4 view; VARYING vec4 vary_position; +vec2 encode_normal(vec3 n) +{ + float f = sqrt(8 * n.z + 8); + return n.xy / f + 0.5; +} + void main() { vec4 color; @@ -161,5 +167,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.xyz*0.5+0.5, screenspacewavef.z*0.5); // normalxyz, displace + frag_data[2] = vec4(encode_normal(screenspacewavef), 0.0, 0.0); // normalxyz, displace } diff --git a/indra/newview/app_settings/shaders/class1/environment/waterV.glsl b/indra/newview/app_settings/shaders/class1/environment/waterV.glsl index f66ba1d2d9..a2a567eff1 100644 --- a/indra/newview/app_settings/shaders/class1/environment/waterV.glsl +++ b/indra/newview/app_settings/shaders/class1/environment/waterV.glsl @@ -28,6 +28,7 @@ uniform mat4 modelview_projection_matrix; ATTRIBUTE vec3 position; + void calcAtmospherics(vec3 inPositionEye); uniform vec2 d1; diff --git a/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightAlphaMaskF.glsl b/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightAlphaMaskF.glsl index 6c34643aab..e130ef5d91 100644 --- a/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightAlphaMaskF.glsl +++ b/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightAlphaMaskF.glsl @@ -30,6 +30,7 @@ out vec4 frag_color; #endif uniform float minimum_alpha; +uniform float texture_gamma; vec3 fullbrightAtmosTransport(vec3 light); vec3 fullbrightScaleSoftClip(vec3 light); @@ -45,7 +46,7 @@ void fullbright_lighting() { discard; } - + color.rgb = pow(color.rgb, vec3(texture_gamma)); color.rgb = fullbrightAtmosTransport(color.rgb); color.rgb = fullbrightScaleSoftClip(color.rgb); diff --git a/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightNonIndexedAlphaMaskF.glsl b/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightNonIndexedAlphaMaskF.glsl index f4477bd29a..56ad658696 100644 --- a/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightNonIndexedAlphaMaskF.glsl +++ b/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightNonIndexedAlphaMaskF.glsl @@ -30,6 +30,7 @@ out vec4 frag_color; #endif uniform float minimum_alpha; +uniform float texture_gamma; vec3 fullbrightAtmosTransport(vec3 light); vec3 fullbrightScaleSoftClip(vec3 light); @@ -47,7 +48,7 @@ void fullbright_lighting() { discard; } - + color.rgb = pow(color.rgb, vec3(texture_gamma)); color.rgb = fullbrightAtmosTransport(color.rgb); color.rgb = fullbrightScaleSoftClip(color.rgb); diff --git a/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightShinyF.glsl b/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightShinyF.glsl index 777c8b45bb..c8282e9a51 100644 --- a/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightShinyF.glsl +++ b/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightShinyF.glsl @@ -50,7 +50,7 @@ void fullbright_shiny_lighting() color.rgb = fullbrightScaleSoftClip(color.rgb); - color.a = max(color.a, vertex_color.a); + color.a = 1.0; frag_color = color; } diff --git a/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightShinyNonIndexedF.glsl b/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightShinyNonIndexedF.glsl index 4fa3b1d939..e7dbd4bbd2 100644 --- a/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightShinyNonIndexedF.glsl +++ b/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightShinyNonIndexedF.glsl @@ -51,7 +51,7 @@ void fullbright_shiny_lighting() color.rgb = fullbrightScaleSoftClip(color.rgb); - color.a = max(color.a, vertex_color.a); + color.a = 1.0; frag_color = color; } diff --git a/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightShinyWaterF.glsl b/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightShinyWaterF.glsl index 58984a4263..5886fc65be 100644 --- a/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightShinyWaterF.glsl +++ b/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightShinyWaterF.glsl @@ -48,7 +48,7 @@ void fullbright_shiny_lighting_water() color.rgb = fullbrightShinyAtmosTransport(color.rgb); color.rgb = fullbrightScaleSoftClip(color.rgb); - color.a = max(color.a, vertex_color.a); + color.a = 1.0; frag_color = applyWaterFog(color); } diff --git a/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightShinyWaterNonIndexedF.glsl b/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightShinyWaterNonIndexedF.glsl index a39b7205d7..cddc7d8df8 100644 --- a/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightShinyWaterNonIndexedF.glsl +++ b/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightShinyWaterNonIndexedF.glsl @@ -49,7 +49,7 @@ void fullbright_shiny_lighting_water() color.rgb = fullbrightShinyAtmosTransport(color.rgb); color.rgb = fullbrightScaleSoftClip(color.rgb); - color.a = max(color.a, vertex_color.a); + color.a = 1.0; frag_color = applyWaterFog(color); } diff --git a/indra/newview/app_settings/shaders/class1/lighting/lightShinyF.glsl b/indra/newview/app_settings/shaders/class1/lighting/lightShinyF.glsl index 52e3b2ad02..9208c148ef 100644 --- a/indra/newview/app_settings/shaders/class1/lighting/lightShinyF.glsl +++ b/indra/newview/app_settings/shaders/class1/lighting/lightShinyF.glsl @@ -50,7 +50,7 @@ void shiny_lighting() color.rgb = atmosLighting(color.rgb); color.rgb = scaleSoftClip(color.rgb); - color.a = max(color.a, vertex_color.a); + color.a = 1.0; frag_color = color; } diff --git a/indra/newview/app_settings/shaders/class1/lighting/lightShinyNonIndexedF.glsl b/indra/newview/app_settings/shaders/class1/lighting/lightShinyNonIndexedF.glsl index 474d5ea496..92628faa68 100644 --- a/indra/newview/app_settings/shaders/class1/lighting/lightShinyNonIndexedF.glsl +++ b/indra/newview/app_settings/shaders/class1/lighting/lightShinyNonIndexedF.glsl @@ -51,7 +51,7 @@ void shiny_lighting() color.rgb = atmosLighting(color.rgb); color.rgb = scaleSoftClip(color.rgb); - color.a = max(color.a, vertex_color.a); + color.a = 1.0; frag_color = color; } diff --git a/indra/newview/app_settings/shaders/class1/lighting/lightShinyWaterF.glsl b/indra/newview/app_settings/shaders/class1/lighting/lightShinyWaterF.glsl index d2a4c47aac..61841674e2 100644 --- a/indra/newview/app_settings/shaders/class1/lighting/lightShinyWaterF.glsl +++ b/indra/newview/app_settings/shaders/class1/lighting/lightShinyWaterF.glsl @@ -47,7 +47,7 @@ void shiny_lighting_water() color.rgb = mix(color.rgb, envColor.rgb, vertex_color.a); color.rgb = atmosLighting(color.rgb); - color.a = max(color.a, vertex_color.a); + color.a = 1.0; frag_color = applyWaterFog(color); } diff --git a/indra/newview/app_settings/shaders/class1/lighting/lightShinyWaterNonIndexedF.glsl b/indra/newview/app_settings/shaders/class1/lighting/lightShinyWaterNonIndexedF.glsl index f3bd662364..0b6e835fd0 100644 --- a/indra/newview/app_settings/shaders/class1/lighting/lightShinyWaterNonIndexedF.glsl +++ b/indra/newview/app_settings/shaders/class1/lighting/lightShinyWaterNonIndexedF.glsl @@ -48,7 +48,7 @@ void shiny_lighting_water() color.rgb = mix(color.rgb, envColor.rgb, vertex_color.a); color.rgb = atmosLighting(color.rgb); - color.a = max(color.a, vertex_color.a); + color.a = 1.0; frag_color = applyWaterFog(color); } diff --git a/indra/newview/app_settings/shaders/class1/objects/emissiveSkinnedV.glsl b/indra/newview/app_settings/shaders/class1/objects/emissiveSkinnedV.glsl index 8494ffba52..9064904191 100644 --- a/indra/newview/app_settings/shaders/class1/objects/emissiveSkinnedV.glsl +++ b/indra/newview/app_settings/shaders/class1/objects/emissiveSkinnedV.glsl @@ -48,11 +48,9 @@ void main() mat = modelview_matrix * mat; vec3 pos = (mat*vec4(position.xyz, 1.0)).xyz; + vertex_color = emissive; + calcAtmospherics(pos.xyz); - vertex_color = emissive; - gl_Position = projection_matrix*vec4(pos, 1.0); - - } diff --git a/indra/newview/app_settings/shaders/class2/deferred/alphaF.glsl b/indra/newview/app_settings/shaders/class2/deferred/alphaF.glsl deleted file mode 100644 index 12706f130b..0000000000 --- a/indra/newview/app_settings/shaders/class2/deferred/alphaF.glsl +++ /dev/null @@ -1,164 +0,0 @@ -/** - * @file alphaF.glsl - * - * $LicenseInfo:firstyear=2007&license=viewerlgpl$ - * Second Life Viewer Source Code - * Copyright (C) 2007, Linden Research, Inc. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; - * version 2.1 of the License only. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - * - * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA - * $/LicenseInfo$ - */ - -#extension GL_ARB_texture_rectangle : enable - -#ifdef DEFINE_GL_FRAGCOLOR -out vec4 frag_color; -#else -#define frag_color gl_FragColor -#endif - -VARYING vec4 vertex_color; -VARYING vec2 vary_texcoord0; - -uniform sampler2DShadow shadowMap0; -uniform sampler2DShadow shadowMap1; -uniform sampler2DShadow shadowMap2; -uniform sampler2DShadow shadowMap3; -uniform sampler2DRect depthMap; - -uniform mat4 shadow_matrix[6]; -uniform vec4 shadow_clip; -uniform vec2 screen_res; -uniform vec2 shadow_res; - -vec3 atmosLighting(vec3 light); -vec3 scaleSoftClip(vec3 light); - -VARYING vec3 vary_ambient; -VARYING vec3 vary_directional; -VARYING vec3 vary_fragcoord; -VARYING vec3 vary_position; -VARYING vec3 vary_pointlight_col; - -uniform float shadow_bias; - -uniform mat4 inv_proj; - -float pcfShadow(sampler2DShadow shadowMap, vec4 stc) -{ - stc.xyz /= stc.w; - stc.z += shadow_bias; - - 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 = shadow2D(shadowMap, stc.xyz).x; - float shadow = cs; - - 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; -} - - -void main() -{ - vec2 frag = vary_fragcoord.xy/vary_fragcoord.z*0.5+0.5; - frag *= screen_res; - - float shadow = 0.0; - vec4 pos = vec4(vary_position, 1.0); - - vec4 spos = pos; - - if (spos.z > -shadow_clip.w) - { - vec4 lpos; - - vec4 near_split = shadow_clip*-0.75; - vec4 far_split = shadow_clip*-1.25; - vec4 transition_domain = near_split-far_split; - float weight = 0.0; - - if (spos.z < near_split.z) - { - lpos = shadow_matrix[3]*spos; - - float w = 1.0; - w -= max(spos.z-far_split.z, 0.0)/transition_domain.z; - shadow += pcfShadow(shadowMap3, lpos)*w; - weight += w; - shadow += max((pos.z+shadow_clip.z)/(shadow_clip.z-shadow_clip.w)*2.0-1.0, 0.0); - } - - if (spos.z < near_split.y && spos.z > far_split.z) - { - lpos = shadow_matrix[2]*spos; - - 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; - shadow += pcfShadow(shadowMap2, lpos)*w; - weight += w; - } - - if (spos.z < near_split.x && spos.z > far_split.y) - { - lpos = shadow_matrix[1]*spos; - - 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; - shadow += pcfShadow(shadowMap1, lpos)*w; - weight += w; - } - - if (spos.z > far_split.x) - { - lpos = shadow_matrix[0]*spos; - - float w = 1.0; - w -= max(near_split.x-spos.z, 0.0)/transition_domain.x; - - shadow += pcfShadow(shadowMap0, lpos)*w; - weight += w; - } - - - shadow /= weight; - } - else - { - shadow = 1.0; - } - - vec4 diff = diffuseLookup(vary_texcoord0.xy); - - vec4 col = vec4(vary_ambient + vary_directional.rgb*shadow, vertex_color.a); - vec4 color = diff * col; - - color.rgb = atmosLighting(color.rgb); - - color.rgb = scaleSoftClip(color.rgb); - - color.rgb += diff.rgb * vary_pointlight_col.rgb; - - frag_color = color; -} - diff --git a/indra/newview/app_settings/shaders/class2/deferred/alphaNonIndexedF.glsl b/indra/newview/app_settings/shaders/class2/deferred/alphaNonIndexedF.glsl index 228dc104ac..9670d59399 100644 --- a/indra/newview/app_settings/shaders/class2/deferred/alphaNonIndexedF.glsl +++ b/indra/newview/app_settings/shaders/class2/deferred/alphaNonIndexedF.glsl @@ -52,12 +52,54 @@ VARYING vec3 vary_position; VARYING vec3 vary_pointlight_col; VARYING vec2 vary_texcoord0; VARYING vec4 vertex_color; +VARYING vec3 vary_norm; uniform vec2 shadow_res; uniform float shadow_bias; uniform mat4 inv_proj; +uniform vec4 light_position[8]; +uniform vec3 light_direction[8]; +uniform vec3 light_attenuation[8]; +uniform vec3 light_diffuse[8]; + +vec3 calcDirectionalLight(vec3 n, vec3 l) +{ + float a = pow(max(dot(n,l),0.0), 0.7); + return vec3(a,a,a); +} + +vec3 calcPointLightOrSpotLight(vec3 v, vec3 n, vec4 lp, vec3 ln, float la, float fa, float is_pointlight) +{ + //get light vector + vec3 lv = lp.xyz-v; + + //get distance + float d = dot(lv,lv); + + float da = 0.0; + + if (d > 0.0 && la > 0.0 && fa > 0.0) + { + //normalize light vector + lv = normalize(lv); + + //distance attenuation + float dist2 = d/la; + da = clamp(1.0-(dist2-1.0*(1.0-fa))/fa, 0.0, 1.0); + + // spotlight coefficient. + float spot = max(dot(-ln, lv), is_pointlight); + da *= spot*spot; // GL_SPOT_EXPONENT=2 + + //angular attenuation + da *= max(pow(dot(n, lv), 0.7), 0.0); + } + + return vec3(da,da,da); +} + vec4 getPosition(vec2 pos_screen) { float depth = texture2DRect(depthMap, pos_screen.xy).a; @@ -161,17 +203,32 @@ void main() { shadow = 1.0; } - + vec3 n = vary_norm; + vec3 l = light_position[0].xyz; + vec3 dlight = calcDirectionalLight(n, l); + dlight = dlight * vary_directional.rgb * vary_pointlight_col; vec4 diff = texture2D(diffuseMap,vary_texcoord0.xy); - vec4 col = vec4(vary_ambient + vary_directional.rgb*shadow, vertex_color.a); + vec4 col = vec4(vary_ambient + dlight*shadow, vertex_color.a); vec4 color = diff * col; color.rgb = atmosLighting(color.rgb); color.rgb = scaleSoftClip(color.rgb); + vec3 light_col = vec3(0,0,0); + + #define LIGHT_LOOP(i) \ + light_col += light_diffuse[i].rgb * calcPointLightOrSpotLight(pos.xyz, vary_norm, light_position[i], light_direction[i], light_attenuation[i].x, light_attenuation[i].y, light_attenuation[i].z); + + LIGHT_LOOP(1) + LIGHT_LOOP(2) + LIGHT_LOOP(3) + LIGHT_LOOP(4) + LIGHT_LOOP(5) + LIGHT_LOOP(6) + LIGHT_LOOP(7) - color.rgb += diff.rgb * vary_pointlight_col.rgb; + color.rgb += diff.rgb * vary_pointlight_col * light_col; frag_color = color; } diff --git a/indra/newview/app_settings/shaders/class2/deferred/alphaNonIndexedNoColorF.glsl b/indra/newview/app_settings/shaders/class2/deferred/alphaNonIndexedNoColorF.glsl index c3950a10e1..fae279fba0 100644 --- a/indra/newview/app_settings/shaders/class2/deferred/alphaNonIndexedNoColorF.glsl +++ b/indra/newview/app_settings/shaders/class2/deferred/alphaNonIndexedNoColorF.glsl @@ -53,6 +53,7 @@ VARYING vec3 vary_fragcoord; VARYING vec3 vary_position; VARYING vec3 vary_pointlight_col; VARYING vec2 vary_texcoord0; +VARYING vec3 vary_norm; uniform vec2 shadow_res; @@ -60,6 +61,47 @@ uniform float shadow_bias; uniform mat4 inv_proj; +uniform vec4 light_position[8]; +uniform vec3 light_direction[8]; +uniform vec3 light_attenuation[8]; +uniform vec3 light_diffuse[8]; + +vec3 calcDirectionalLight(vec3 n, vec3 l) +{ + float a = pow(max(dot(n,l),0.0), 0.7); + return vec3(a, a, a); +} + +vec3 calcPointLightOrSpotLight(vec3 v, vec3 n, vec4 lp, vec3 ln, float la, float fa, float is_pointlight) +{ + //get light vector + vec3 lv = lp.xyz-v; + + //get distance + float d = dot(lv,lv); + + float da = 0.0; + + if (d > 0.0 && la > 0.0 && fa > 0.0) + { + //normalize light vector + lv = normalize(lv); + + //distance attenuation + float dist2 = d/la; + da = clamp(1.0-(dist2-1.0*(1.0-fa))/fa, 0.0, 1.0); + + // spotlight coefficient. + float spot = max(dot(-ln, lv), is_pointlight); + da *= spot*spot; // GL_SPOT_EXPONENT=2 + + //angular attenuation + da *= max(pow(dot(n, lv), 0.7), 0.0); + } + + return vec3(da,da,da); +} + vec4 getPosition(vec2 pos_screen) { float depth = texture2DRect(depthMap, pos_screen.xy).a; @@ -169,15 +211,31 @@ void main() { shadow = 1.0; } + vec3 n = vary_norm; + vec3 l = light_position[0].xyz; + vec3 dlight = calcDirectionalLight(n, l); + dlight = dlight * vary_directional.rgb * vary_pointlight_col; - vec4 col = vec4(vary_ambient + vary_directional.rgb*shadow, 1.0); + vec4 col = vec4(vary_ambient + dlight*shadow, 1.0); vec4 color = diff * col; color.rgb = atmosLighting(color.rgb); color.rgb = scaleSoftClip(color.rgb); + vec3 light_col = vec3(0,0,0); + + #define LIGHT_LOOP(i) \ + light_col += light_diffuse[i].rgb * calcPointLightOrSpotLight(pos.xyz, vary_norm, light_position[i], light_direction[i], light_attenuation[i].x, light_attenuation[i].y, light_attenuation[i].z); + + LIGHT_LOOP(1) + LIGHT_LOOP(2) + LIGHT_LOOP(3) + LIGHT_LOOP(4) + LIGHT_LOOP(5) + LIGHT_LOOP(6) + LIGHT_LOOP(7) - color.rgb += diff.rgb * vary_pointlight_col.rgb; + color.rgb += diff.rgb * vary_pointlight_col * light_col; frag_color = color; } diff --git a/indra/newview/app_settings/shaders/class2/deferred/alphaSkinnedV.glsl b/indra/newview/app_settings/shaders/class2/deferred/alphaSkinnedV.glsl index 9629cfe824..7f4d82ecc6 100644 --- a/indra/newview/app_settings/shaders/class2/deferred/alphaSkinnedV.glsl +++ b/indra/newview/app_settings/shaders/class2/deferred/alphaSkinnedV.glsl @@ -50,7 +50,7 @@ VARYING vec3 vary_pointlight_col; VARYING vec4 vertex_color; VARYING vec2 vary_texcoord0; - +VARYING vec3 vary_norm; uniform float near_clip; uniform float shadow_offset; @@ -115,7 +115,8 @@ void main() n.xyz = normalize(n.xyz-pos.xyz); vec3 norm = n.xyz; - + vary_norm = norm; + float dp_directional_light = max(0.0, dot(norm, light_position[0].xyz)); vary_position = pos.xyz + light_position[0].xyz * (1.0-dp_directional_light)*shadow_offset; diff --git a/indra/newview/app_settings/shaders/class2/deferred/alphaV.glsl b/indra/newview/app_settings/shaders/class2/deferred/alphaV.glsl index 1586aab0f2..127c1709b8 100644 --- a/indra/newview/app_settings/shaders/class2/deferred/alphaV.glsl +++ b/indra/newview/app_settings/shaders/class2/deferred/alphaV.glsl @@ -25,19 +25,36 @@ uniform mat3 normal_matrix; uniform mat4 texture_matrix0; +uniform mat4 projection_matrix; uniform mat4 modelview_matrix; uniform mat4 modelview_projection_matrix; ATTRIBUTE vec3 position; + +#ifdef USE_INDEXED_TEX void passTextureIndex(); +#endif + ATTRIBUTE vec3 normal; + +#ifdef USE_VERTEX_COLOR ATTRIBUTE vec4 diffuse_color; +#endif + ATTRIBUTE vec2 texcoord0; +#ifdef HAS_SKIN +mat4 getObjectSkinnedTransform(); +#else +#ifdef IS_AVATAR_SKIN +mat4 getSkinnedTransform(); +#endif +#endif + vec4 calcLighting(vec3 pos, vec3 norm, vec4 color, vec4 baseCol); void calcAtmospherics(vec3 inPositionEye); -float calcDirectionalLight(vec3 n, vec3 l); +vec3 calcDirectionalLight(vec3 n, vec3 l); vec3 atmosAmbient(vec3 light); vec3 atmosAffectDirectionalLight(float lightIntensity); @@ -50,9 +67,12 @@ VARYING vec3 vary_fragcoord; VARYING vec3 vary_position; VARYING vec3 vary_pointlight_col; +#ifdef USE_VERTEX_COLOR VARYING vec4 vertex_color; -VARYING vec2 vary_texcoord0; +#endif +VARYING vec2 vary_texcoord0; +VARYING vec3 vary_norm; uniform float near_clip; uniform float shadow_offset; @@ -63,13 +83,13 @@ uniform vec3 light_direction[8]; uniform vec3 light_attenuation[8]; uniform vec3 light_diffuse[8]; -float calcDirectionalLight(vec3 n, vec3 l) +vec3 calcDirectionalLight(vec3 n, vec3 l) { float a = max(dot(n,l),0.0); - return a; + return vec3(a,a,a); } -float calcPointLightOrSpotLight(vec3 v, vec3 n, vec4 lp, vec3 ln, float la, float fa, float is_pointlight) +vec3 calcPointLightOrSpotLight(vec3 v, vec3 n, vec4 lp, vec3 ln, float la, float fa, float is_pointlight) { //get light vector vec3 lv = lp.xyz-v; @@ -96,55 +116,100 @@ float calcPointLightOrSpotLight(vec3 v, vec3 n, vec4 lp, vec3 ln, float la, floa da *= max(dot(n, lv), 0.0); } - return da; + return vec3(da,da,da); } void main() { + vec4 pos; + vec3 norm; + //transform vertex +#ifdef HAS_SKIN + mat4 trans = getObjectSkinnedTransform(); + trans = modelview_matrix * trans; + + pos = trans * vec4(position.xyz, 1.0); + + norm = position.xyz + normal.xyz; + norm = normalize((trans * vec4(norm, 1.0)).xyz - pos.xyz); + vec4 frag_pos = projection_matrix * pos; + gl_Position = frag_pos; +#else + +#ifdef IS_AVATAR_SKIN + mat4 trans = getSkinnedTransform(); + vec4 pos_in = vec4(position.xyz, 1.0); + pos.x = dot(trans[0], pos_in); + pos.y = dot(trans[1], pos_in); + pos.z = dot(trans[2], pos_in); + pos.w = 1.0; + + norm.x = dot(trans[0].xyz, normal); + norm.y = dot(trans[1].xyz, normal); + norm.z = dot(trans[2].xyz, normal); + norm = normalize(norm); + + vec4 frag_pos = projection_matrix * pos; + gl_Position = frag_pos; +#else + norm = normalize(normal_matrix * normal); vec4 vert = vec4(position.xyz, 1.0); - passTextureIndex(); - vec4 pos = (modelview_matrix * vert); + pos = (modelview_matrix * vert); gl_Position = modelview_projection_matrix*vec4(position.xyz, 1.0); +#endif +#endif + +#ifdef USE_INDEXED_TEX + passTextureIndex(); vary_texcoord0 = (texture_matrix0 * vec4(texcoord0,0,1)).xy; - - vec3 norm = normalize(normal_matrix * normal); +#else + vary_texcoord0 = texcoord0; +#endif + vary_norm = norm; float dp_directional_light = max(0.0, dot(norm, light_position[0].xyz)); vary_position = pos.xyz + light_position[0].xyz * (1.0-dp_directional_light)*shadow_offset; - + calcAtmospherics(pos.xyz); +#ifndef USE_VERTEX_COLOR + vec4 diffuse_color = vec4(1,1,1,1); +#endif + //vec4 color = calcLighting(pos.xyz, norm, diffuse_color, vec4(0.)); vec4 col = vec4(0.0, 0.0, 0.0, diffuse_color.a); - - // Collect normal lights - col.rgb += light_diffuse[2].rgb*calcPointLightOrSpotLight(pos.xyz, norm, light_position[2], light_direction[2], light_attenuation[2].x, light_attenuation[2].y, light_attenuation[2].z); - col.rgb += light_diffuse[3].rgb*calcPointLightOrSpotLight(pos.xyz, norm, light_position[3], light_direction[3], light_attenuation[3].x, light_attenuation[3].y, light_attenuation[3].z); - col.rgb += light_diffuse[4].rgb*calcPointLightOrSpotLight(pos.xyz, norm, light_position[4], light_direction[4], light_attenuation[4].x, light_attenuation[4].y, light_attenuation[4].z); - col.rgb += light_diffuse[5].rgb*calcPointLightOrSpotLight(pos.xyz, norm, light_position[5], light_direction[5], light_attenuation[5].x, light_attenuation[5].y, light_attenuation[5].z); - col.rgb += light_diffuse[6].rgb*calcPointLightOrSpotLight(pos.xyz, norm, light_position[6], light_direction[6], light_attenuation[6].x, light_attenuation[6].y, light_attenuation[6].z); - col.rgb += light_diffuse[7].rgb*calcPointLightOrSpotLight(pos.xyz, norm, light_position[7], light_direction[7], light_attenuation[7].x, light_attenuation[7].y, light_attenuation[7].z); + vec3 dff = pow(diffuse_color.rgb, vec3(2.2f,2.2f,2.2f)); - vary_pointlight_col = col.rgb*diffuse_color.rgb; + vary_pointlight_col = dff; col.rgb = vec3(0,0,0); // Add windlight lights - col.rgb = atmosAmbient(vec3(0.)); + col.rgb = atmosAmbient(col.rgb); - vary_ambient = col.rgb*diffuse_color.rgb; - vary_directional.rgb = diffuse_color.rgb*atmosAffectDirectionalLight(max(calcDirectionalLight(norm, light_position[0].xyz), (1.0-diffuse_color.a)*(1.0-diffuse_color.a))); + vary_directional.rgb = atmosAffectDirectionalLight(1.0f); + vary_ambient = col.rgb*dff; - col.rgb = col.rgb*diffuse_color.rgb; + col.rgb = col.rgb*dff; +#ifdef USE_VERTEX_COLOR vertex_color = col; - - +#endif +#ifdef HAS_SKIN + vary_fragcoord.xyz = frag_pos.xyz + vec3(0,0,near_clip); +#else + +#ifdef IS_AVATAR_SKIN + vary_fragcoord.xyz = pos.xyz + vec3(0,0,near_clip); +#else pos = modelview_projection_matrix * vert; vary_fragcoord.xyz = pos.xyz + vec3(0,0,near_clip); - +#endif + +#endif + } diff --git a/indra/newview/app_settings/shaders/class2/deferred/multiSpotLightF.glsl b/indra/newview/app_settings/shaders/class2/deferred/multiSpotLightF.glsl index 5621e47ab7..a6b0f7e7c1 100644 --- a/indra/newview/app_settings/shaders/class2/deferred/multiSpotLightF.glsl +++ b/indra/newview/app_settings/shaders/class2/deferred/multiSpotLightF.glsl @@ -39,6 +39,7 @@ uniform samplerCube environmentMap; uniform sampler2DRect lightMap; uniform sampler2D noiseMap; uniform sampler2D projectionMap; +uniform sampler2D lightFunc; uniform mat4 proj_mat; //screen space to light space uniform float proj_near; //near clip for projection @@ -67,10 +68,28 @@ uniform vec2 screen_res; uniform mat4 inv_proj; +vec3 decode_normal (vec2 enc) +{ + vec2 fenc = enc*4-2; + float f = dot(fenc,fenc); + float g = sqrt(1-f/4); + vec3 n; + n.xy = fenc*g; + n.z = 1-f/2; + return n; +} + +vec4 correctWithGamma(vec4 col) +{ + return vec4(pow(col.rgb, vec3(2.2)), col.a); +} + + vec4 texture2DLodSpecular(sampler2D projectionMap, vec2 tc, float lod) { vec4 ret = texture2DLod(projectionMap, tc, lod); - + ret = correctWithGamma(ret); + vec2 dist = tc-vec2(0.5); float det = max(1.0-lod/(proj_lod*0.5), 0.0); @@ -85,7 +104,8 @@ vec4 texture2DLodSpecular(sampler2D projectionMap, vec2 tc, float lod) vec4 texture2DLodDiffuse(sampler2D projectionMap, vec2 tc, float lod) { vec4 ret = texture2DLod(projectionMap, tc, lod); - + ret = correctWithGamma(ret); + vec2 dist = vec2(0.5) - abs(tc-vec2(0.5)); float det = min(lod/(proj_lod*0.5), 1.0); @@ -102,7 +122,8 @@ vec4 texture2DLodDiffuse(sampler2D projectionMap, vec2 tc, float lod) vec4 texture2DLodAmbient(sampler2D projectionMap, vec2 tc, float lod) { vec4 ret = texture2DLod(projectionMap, tc, lod); - + ret = correctWithGamma(ret); + vec2 dist = tc-vec2(0.5); float d = dot(dist,dist); @@ -154,7 +175,10 @@ void main() } vec3 norm = texture2DRect(normalMap, frag.xy).xyz; - norm = (norm.xyz-0.5)*2.0; // unpack norm + + float envIntensity = norm.z; + + norm = decode_normal(norm.xy); norm = normalize(norm); float l_dist = -dot(lv, proj_n); @@ -169,6 +193,7 @@ void main() float fa = falloff+1.0; float dist_atten = min(1.0-(dist2-1.0*(1.0-fa))/fa, 1.0); + dist_atten = pow(dist_atten, 2.2) * 2.2; if (dist_atten <= 0.0) { discard; @@ -177,11 +202,15 @@ void main() lv = proj_origin-pos.xyz; lv = normalize(lv); float da = dot(norm, lv); - + vec3 col = vec3(0,0,0); vec3 diff_tex = texture2DRect(diffuseRect, frag.xy).rgb; - + + vec4 spec = texture2DRect(specularRect, frag.xy); + + vec3 dlit = vec3(0, 0, 0); + float noise = texture2D(noiseMap, frag.xy/128.0).b; if (proj_tc.z > 0.0 && proj_tc.x < 1.0 && @@ -189,21 +218,21 @@ void main() proj_tc.x > 0.0 && proj_tc.y > 0.0) { - float lit = 0.0; float amb_da = proj_ambiance; - + float lit = 0.0; + if (da > 0.0) { + lit = da * dist_atten * noise; + float diff = clamp((l_dist-proj_focus)/proj_range, 0.0, 1.0); float lod = diff * proj_lod; vec4 plcol = texture2DLodDiffuse(projectionMap, proj_tc.xy, lod); - vec3 lcol = color.rgb * plcol.rgb * plcol.a; + dlit = color.rgb * plcol.rgb * plcol.a; - lit = da * dist_atten * noise; - - col = lcol*lit*diff_tex*shadow; + col = dlit*lit*diff_tex*shadow; amb_da += (da*0.5)*(1.0-shadow)*proj_ambiance; } @@ -219,10 +248,37 @@ void main() col += amb_da*color.rgb*diff_tex.rgb*amb_plcol.rgb*amb_plcol.a; } - - vec4 spec = texture2DRect(specularRect, frag.xy); + if (spec.a > 0.0) { + vec3 npos = -normalize(pos); + dlit *= min(da*6.0, 1.0) * dist_atten; + + //vec3 ref = dot(pos+lv, norm); + vec3 h = normalize(lv+npos); + float nh = dot(norm, h); + float nv = dot(norm, npos); + float vh = dot(npos, h); + float sa = nh; + float fres = pow(1 - dot(h, npos), 5)*0.4+0.5; + + float gtdenom = 2 * nh; + float gt = max(0, min(gtdenom * nv / vh, gtdenom * da / vh)); + + if (nh > 0.0) + { + float scol = fres*texture2D(lightFunc, vec2(nh, spec.a)).r*gt/(nh*da); + col += dlit*scol*spec.rgb*shadow; + //col += spec.rgb; + } + } + + + + + + if (envIntensity > 0.0) + { vec3 ref = reflect(normalize(pos), norm); //project from point pos in direction ref to plane proj_p, proj_n @@ -239,8 +295,9 @@ void main() { stc.xy /= stc.w; - float fatten = clamp(spec.a*spec.a+spec.a*0.5, 0.25, 1.0); + float fatten = clamp(envIntensity*envIntensity+envIntensity*0.5, 0.25, 1.0); + //stc.xy = (stc.xy - vec2(0.5)) * fatten + vec2(0.5); stc.xy = (stc.xy - vec2(0.5)) * fatten + vec2(0.5); if (stc.x < 1.0 && @@ -248,8 +305,7 @@ void main() stc.x > 0.0 && stc.y > 0.0) { - vec4 scol = texture2DLodSpecular(projectionMap, stc.xy, proj_lod-spec.a*proj_lod); - col += dist_atten*scol.rgb*color.rgb*scol.a*spec.rgb*shadow; + col += color.rgb*texture2DLodSpecular(projectionMap, stc.xy, proj_lod-envIntensity*proj_lod).rgb*shadow*spec.rgb; } } } diff --git a/indra/newview/app_settings/shaders/class2/deferred/softenLightF.glsl b/indra/newview/app_settings/shaders/class2/deferred/softenLightF.glsl index 9df9d75905..10a598a85c 100644 --- a/indra/newview/app_settings/shaders/class2/deferred/softenLightF.glsl +++ b/indra/newview/app_settings/shaders/class2/deferred/softenLightF.glsl @@ -60,6 +60,7 @@ uniform float density_multiplier; uniform float distance_multiplier; uniform float max_y; uniform vec4 glow; +uniform float global_gamma; uniform float scene_light_strength; uniform mat3 env_mat; uniform vec4 shadow_clip; @@ -79,6 +80,17 @@ vec3 vary_AmblitColor; vec3 vary_AdditiveColor; vec3 vary_AtmosAttenuation; +vec3 decode_normal (vec2 enc) +{ + vec2 fenc = enc*4-2; + float f = dot(fenc,fenc); + float g = sqrt(1-f/4); + vec3 n; + n.xy = fenc*g; + n.z = 1-f/2; + return n; +} + vec4 getPosition_d(vec2 pos_screen, float depth) { vec2 sc = pos_screen.xy*2.0; @@ -222,9 +234,9 @@ void calcAtmospherics(vec3 inPositionEye, float ambFactor) { + tmpAmbient))); //brightness of surface both sunlight and ambient - setSunlitColor(vec3(sunlight * .5)); - setAmblitColor(vec3(tmpAmbient * .25)); - setAdditiveColor(getAdditiveColor() * vec3(1.0 - temp1)); + setSunlitColor(pow(vec3(sunlight * .5), vec3(global_gamma)) * global_gamma); + setAmblitColor(pow(vec3(tmpAmbient * .25), vec3(global_gamma)) * global_gamma); + setAdditiveColor(pow(getAdditiveColor() * vec3(1.0 - temp1), vec3(global_gamma)) * global_gamma); } vec3 atmosLighting(vec3 light) @@ -278,17 +290,16 @@ void main() vec2 tc = vary_fragcoord.xy; float depth = texture2DRect(depthMap, tc.xy).r; vec3 pos = getPosition_d(tc, depth).xyz; - vec3 norm = texture2DRect(normalMap, tc).xyz; - norm = (norm.xyz-0.5)*2.0; // unpack norm - + vec4 norm = texture2DRect(normalMap, tc); + float envIntensity = norm.z; + norm.xyz = decode_normal(norm.xy); float da = max(dot(norm.xyz, sun_dir.xyz), 0.0); - + vec4 diffuse = texture2DRect(diffuseRect, tc); vec3 col; float bloom = 0.0; - if (diffuse.a < 0.9) { vec4 spec = texture2DRect(specularRect, vary_fragcoord.xy); @@ -299,38 +310,39 @@ void main() calcAtmospherics(pos.xyz, ambocc); col = atmosAmbient(vec3(0)); - col += atmosAffectDirectionalLight(max(min(da, scol), diffuse.a)); + col += atmosAffectDirectionalLight(max(min(da, scol) * 2.6, diffuse.a)); col *= diffuse.rgb; + vec3 refnormpersp = normalize(reflect(pos.xyz, norm.xyz)); + if (spec.a > 0.0) // specular reflection { // the old infinite-sky shiny reflection // - vec3 refnormpersp = normalize(reflect(pos.xyz, norm.xyz)); + float sa = dot(refnormpersp, sun_dir.xyz); - vec3 dumbshiny = vary_SunlitColor*scol_ambocc.r*(6 * texture2D(lightFunc, vec2(sa, spec.a)).r); + vec3 dumbshiny = vary_SunlitColor*scol_ambocc.r*(texture2D(lightFunc, vec2(sa, spec.a)).r); // add the two types of shiny together vec3 spec_contrib = dumbshiny * spec.rgb; - bloom = dot(spec_contrib, spec_contrib) / 4; + bloom = dot(spec_contrib, spec_contrib) / 6; col += spec_contrib; + } - //add environmentmap + if (envIntensity > 0.0) + { //add environmentmap vec3 env_vec = env_mat * refnormpersp; - col = mix(col.rgb, textureCube(environmentMap, env_vec).rgb, - max(spec.a-diffuse.a*2.0, 0.0)); + col = mix(col.rgb, pow(textureCube(environmentMap, env_vec).rgb, vec3(2.2)) * 2.2, + envIntensity); } col = atmosLighting(col); col = scaleSoftClip(col); - col = mix(col, diffuse.rgb, diffuse.a); - } - else - { - col = diffuse.rgb; + col = mix(col.rgb, diffuse.rgb, diffuse.a); } + frag_color.rgb = col; frag_color.a = bloom; diff --git a/indra/newview/app_settings/shaders/class2/deferred/spotLightF.glsl b/indra/newview/app_settings/shaders/class2/deferred/spotLightF.glsl index 6d6ad6d565..91ff1f1e76 100644 --- a/indra/newview/app_settings/shaders/class2/deferred/spotLightF.glsl +++ b/indra/newview/app_settings/shaders/class2/deferred/spotLightF.glsl @@ -39,6 +39,7 @@ uniform samplerCube environmentMap; uniform sampler2DRect lightMap; uniform sampler2D noiseMap; uniform sampler2D projectionMap; +uniform sampler2D lightFunc; uniform mat4 proj_mat; //screen space to light space uniform float proj_near; //near clip for projection @@ -67,9 +68,26 @@ uniform vec2 screen_res; uniform mat4 inv_proj; +vec3 decode_normal (vec2 enc) +{ + vec2 fenc = enc*4-2; + float f = dot(fenc,fenc); + float g = sqrt(1-f/4); + vec3 n; + n.xy = fenc*g; + n.z = 1-f/2; + return n; +} + +vec4 correctWithGamma(vec4 col) +{ + return vec4(pow(col.rgb, vec3(2.2)), col.a); +} + vec4 texture2DLodSpecular(sampler2D projectionMap, vec2 tc, float lod) { vec4 ret = texture2DLod(projectionMap, tc, lod); + ret = correctWithGamma(ret); vec2 dist = tc-vec2(0.5); @@ -85,6 +103,7 @@ vec4 texture2DLodSpecular(sampler2D projectionMap, vec2 tc, float lod) vec4 texture2DLodDiffuse(sampler2D projectionMap, vec2 tc, float lod) { vec4 ret = texture2DLod(projectionMap, tc, lod); + ret = correctWithGamma(ret); vec2 dist = vec2(0.5) - abs(tc-vec2(0.5)); @@ -102,6 +121,7 @@ vec4 texture2DLodDiffuse(sampler2D projectionMap, vec2 tc, float lod) vec4 texture2DLodAmbient(sampler2D projectionMap, vec2 tc, float lod) { vec4 ret = texture2DLod(projectionMap, tc, lod); + ret = correctWithGamma(ret); vec2 dist = tc-vec2(0.5); @@ -154,7 +174,8 @@ void main() } vec3 norm = texture2DRect(normalMap, frag.xy).xyz; - norm = (norm.xyz-0.5)*2.0; // unpack norm + float envIntensity = norm.z; + norm = decode_normal(norm.xy); norm = normalize(norm); float l_dist = -dot(lv, proj_n); @@ -169,6 +190,7 @@ void main() float fa = falloff+1.0; float dist_atten = min(1.0-(dist2-1.0*(1.0-fa))/fa, 1.0); + dist_atten = pow(dist_atten, 2.2) * 2.2; if (dist_atten <= 0.0) { discard; @@ -182,6 +204,10 @@ void main() vec3 diff_tex = texture2DRect(diffuseRect, frag.xy).rgb; + vec4 spec = texture2DRect(specularRect, frag.xy); + + vec3 dlit = vec3(0, 0, 0); + float noise = texture2D(noiseMap, frag.xy/128.0).b; if (proj_tc.z > 0.0 && proj_tc.x < 1.0 && @@ -189,21 +215,21 @@ void main() proj_tc.x > 0.0 && proj_tc.y > 0.0) { - float lit = 0.0; float amb_da = proj_ambiance; + float lit = 0.0; if (da > 0.0) { + lit = da * dist_atten * noise; + float diff = clamp((l_dist-proj_focus)/proj_range, 0.0, 1.0); float lod = diff * proj_lod; vec4 plcol = texture2DLodDiffuse(projectionMap, proj_tc.xy, lod); - vec3 lcol = color.rgb * plcol.rgb * plcol.a; - - lit = da * dist_atten * noise; + dlit = color.rgb * plcol.rgb * plcol.a; - col = lcol*lit*diff_tex*shadow; + col = dlit*lit*diff_tex*shadow; amb_da += (da*0.5)*(1.0-shadow)*proj_ambiance; } @@ -219,10 +245,37 @@ void main() col += amb_da*color.rgb*diff_tex.rgb*amb_plcol.rgb*amb_plcol.a; } - - vec4 spec = texture2DRect(specularRect, frag.xy); + if (spec.a > 0.0) { + dlit *= min(da*6.0, 1.0) * dist_atten; + vec3 npos = -normalize(pos); + + //vec3 ref = dot(pos+lv, norm); + vec3 h = normalize(lv+npos); + float nh = dot(norm, h); + float nv = dot(norm, npos); + float vh = dot(npos, h); + float sa = nh; + float fres = pow(1 - dot(h, npos), 5)*0.4+0.5; + + float gtdenom = 2 * nh; + float gt = max(0, min(gtdenom * nv / vh, gtdenom * da / vh)); + + if (nh > 0.0) + { + float scol = fres*texture2D(lightFunc, vec2(nh, spec.a)).r*gt/(nh*da); + col += dlit*scol*spec.rgb*shadow; + //col += spec.rgb; + } + } + + + + + + if (envIntensity > 0.0) + { vec3 ref = reflect(normalize(pos), norm); //project from point pos in direction ref to plane proj_p, proj_n @@ -239,8 +292,9 @@ void main() { stc.xy /= stc.w; - float fatten = clamp(spec.a*spec.a+spec.a*0.5, 0.25, 1.0); + float fatten = clamp(envIntensity*envIntensity+envIntensity*0.5, 0.25, 1.0); + //stc.xy = (stc.xy - vec2(0.5)) * fatten + vec2(0.5); stc.xy = (stc.xy - vec2(0.5)) * fatten + vec2(0.5); if (stc.x < 1.0 && @@ -248,8 +302,7 @@ void main() stc.x > 0.0 && stc.y > 0.0) { - vec4 scol = texture2DLodSpecular(projectionMap, stc.xy, proj_lod-spec.a*proj_lod); - col += dist_atten*scol.rgb*color.rgb*scol.a*spec.rgb*shadow; + col += color.rgb*texture2DLodSpecular(projectionMap, stc.xy, proj_lod-envIntensity*proj_lod).rgb*shadow*spec.rgb; } } } diff --git a/indra/newview/app_settings/shaders/class2/deferred/sunLightF.glsl b/indra/newview/app_settings/shaders/class2/deferred/sunLightF.glsl index 890486c4b1..fa2f415e15 100644 --- a/indra/newview/app_settings/shaders/class2/deferred/sunLightF.glsl +++ b/indra/newview/app_settings/shaders/class2/deferred/sunLightF.glsl @@ -65,6 +65,17 @@ uniform float shadow_offset; uniform float spot_shadow_bias; uniform float spot_shadow_offset; +vec3 decode_normal (vec2 enc) +{ + vec2 fenc = enc*4-2; + float f = dot(fenc,fenc); + float g = sqrt(1-f/4); + vec3 n; + n.xy = fenc*g; + n.z = 1-f/2; + return n; +} + vec4 getPosition(vec2 pos_screen) { float depth = texture2DRect(depthMap, pos_screen.xy).r; @@ -125,11 +136,9 @@ void main() vec4 pos = getPosition(pos_screen); - vec4 nmap4 = texture2DRect(normalMap, pos_screen); - nmap4 = vec4((nmap4.xyz-0.5)*2.0,nmap4.w); // unpack norm - float displace = nmap4.w; - vec3 norm = nmap4.xyz; - + vec3 norm = texture2DRect(normalMap, pos_screen).xyz; + norm = decode_normal(norm.xy); // unpack norm + /*if (pos.z == 0.0) // do nothing for sky *FIX: REMOVE THIS IF/WHEN THE POSITION MAP IS BEING USED AS A STENCIL { frag_color = vec4(0.0); // doesn't matter @@ -138,8 +147,8 @@ void main() float shadow = 0.0; float dp_directional_light = max(0.0, dot(norm, sun_dir.xyz)); - - vec3 shadow_pos = pos.xyz + displace*norm; + + vec3 shadow_pos = pos.xyz; vec3 offset = sun_dir.xyz * (1.0-dp_directional_light); vec4 spos = vec4(shadow_pos+offset*shadow_offset, 1.0); diff --git a/indra/newview/app_settings/shaders/class2/deferred/sunLightSSAOF.glsl b/indra/newview/app_settings/shaders/class2/deferred/sunLightSSAOF.glsl index 2dcd3d656f..847fea6c08 100644 --- a/indra/newview/app_settings/shaders/class2/deferred/sunLightSSAOF.glsl +++ b/indra/newview/app_settings/shaders/class2/deferred/sunLightSSAOF.glsl @@ -66,6 +66,17 @@ uniform float shadow_offset; uniform float spot_shadow_bias; uniform float spot_shadow_offset; +vec3 decode_normal (vec2 enc) +{ + vec2 fenc = enc*4-2; + float f = dot(fenc,fenc); + float g = sqrt(1-f/4); + vec3 n; + n.xy = fenc*g; + n.z = 1-f/2; + return n; +} + vec4 getPosition(vec2 pos_screen) { float depth = texture2DRect(depthMap, pos_screen.xy).r; @@ -186,11 +197,9 @@ void main() vec4 pos = getPosition(pos_screen); - vec4 nmap4 = texture2DRect(normalMap, pos_screen); - nmap4 = vec4((nmap4.xyz-0.5)*2.0,nmap4.w); // unpack norm - float displace = nmap4.w; - vec3 norm = nmap4.xyz; - + vec3 norm = texture2DRect(normalMap, pos_screen).xyz; + norm = decode_normal(norm.xy); // unpack norm + /*if (pos.z == 0.0) // do nothing for sky *FIX: REMOVE THIS IF/WHEN THE POSITION MAP IS BEING USED AS A STENCIL { frag_color = vec4(0.0); // doesn't matter @@ -199,8 +208,8 @@ void main() float shadow = 0.0; float dp_directional_light = max(0.0, dot(norm, sun_dir.xyz)); - - vec3 shadow_pos = pos.xyz + displace*norm; + + vec3 shadow_pos = pos.xyz; vec3 offset = sun_dir.xyz * (1.0-dp_directional_light); vec4 spos = vec4(shadow_pos+offset*shadow_offset, 1.0); diff --git a/indra/newview/app_settings/shaders/class2/windlight/atmosphericsV.glsl b/indra/newview/app_settings/shaders/class2/windlight/atmosphericsV.glsl index da3d922017..c1eff73bc8 100644 --- a/indra/newview/app_settings/shaders/class2/windlight/atmosphericsV.glsl +++ b/indra/newview/app_settings/shaders/class2/windlight/atmosphericsV.glsl @@ -54,6 +54,7 @@ uniform float density_multiplier; uniform float distance_multiplier; uniform float max_y; uniform vec4 glow; +uniform float global_gamma; void calcAtmospherics(vec3 inPositionEye) { @@ -131,9 +132,9 @@ void calcAtmospherics(vec3 inPositionEye) { + tmpAmbient))); //brightness of surface both sunlight and ambient - setSunlitColor(vec3(sunlight * .5)); - setAmblitColor(vec3(tmpAmbient * .25)); - setAdditiveColor(getAdditiveColor() * vec3(1.0 - temp1)); + setSunlitColor(pow(vec3(sunlight * .5), vec3(global_gamma)) * global_gamma); + setAmblitColor(pow(vec3(tmpAmbient * .25), vec3(global_gamma)) * global_gamma); + setAdditiveColor(pow(getAdditiveColor() * vec3(1.0 - temp1), vec3(global_gamma)) * global_gamma); // vary_SunlitColor = vec3(0); // vary_AmblitColor = vec3(0); diff --git a/indra/newview/fmod_hidden_symbols.exp b/indra/newview/fmod_hidden_symbols.exp deleted file mode 100644 index 1e790255bc..0000000000 --- a/indra/newview/fmod_hidden_symbols.exp +++ /dev/null @@ -1,240 +0,0 @@ -_CarbonSndPlayDoubleBuffer -_ConvertFromIeeeExtended -__book_maptype1_quantvals -__book_unquantize -__float32_pack -__float32_unpack -__ilog -__make_words -_lpc_clear -_lpc_init -__vorbis_block_alloc -__vorbis_block_ripcord -__vorbis_apply_window -__vorbis_window_get -_vorbis_analysis_blockout -_vorbis_analysis_buffer -_vorbis_analysis_wrote -_vorbis_block_clear -_vorbis_block_init -_vorbis_dsp_clear -_vorbis_synthesis_blockin -_vorbis_synthesis_init -_vorbis_synthesis_pcmout -_vorbis_synthesis_read -_vorbis_packet_blocksize -_vorbis_synthesis -_vorbis_book_clear -_vorbis_book_decode -_vorbis_book_decodev_add -_vorbis_book_decodev_set -_vorbis_book_decodevs_add -_vorbis_book_decodevv_add -_vorbis_book_init_decode -_vorbis_comment_add -_vorbis_comment_add_tag -_vorbis_comment_clear -_vorbis_comment_init -_vorbis_comment_query -_vorbis_comment_query_count -_vorbis_coslook -_vorbis_fromdBlook -_vorbis_info_blocksize -_vorbis_info_clear -_vorbis_info_init -_vorbis_invsq2explook -_vorbis_invsqlook -_vorbis_lpc_from_curve -_vorbis_lpc_from_data -_vorbis_lpc_predict -_vorbis_lsp_to_curve -_vorbis_staticbook_clear -_vorbis_staticbook_destroy -_vorbis_staticbook_unpack -_vorbis_synthesis_headerin -_vorbis_synthesis_lapout -_vorbis_synthesis_restart -_vorbis_synthesis_trackonly -_vorbis_window -_ogg_packet_clear -_ogg_page_bos -_ogg_page_checksum_set -_ogg_page_continued -_ogg_page_eos -_ogg_page_granulepos -_ogg_page_packets -_ogg_page_pageno -_ogg_page_serialno -_ogg_page_version -_ogg_stream_reset_serialno -_ogg_stream_clear -_ogg_stream_destroy -_ogg_stream_eos -_ogg_stream_flush -_ogg_stream_init -_ogg_stream_packetout -_ogg_stream_packetpeek -_ogg_stream_pagein -_ogg_stream_pageout -_ogg_stream_reset -_ogg_sync_buffer -_ogg_sync_clear -_ogg_sync_destroy -_ogg_sync_init -_ogg_sync_pageout -_ogg_sync_pageseek -_ogg_sync_reset -_ogg_sync_wrote -_ov_bitrate -_ov_bitrate_instant -_ov_clear -_ov_comment -_ov_info -_ov_open -_ov_open_callbacks -_ov_pcm_seek -_ov_pcm_seek_page -_ov_pcm_tell -_ov_pcm_total -_ov_raw_seek -_ov_raw_tell -_ov_raw_total -_ov_read -_ov_read_float -_ov_seekable -_ov_serialnumber -_ov_streams -_ov_test -_ov_test_callbacks -_ov_test_open -_ov_time_seek -_ov_time_seek_page -_ov_time_tell -_ov_time_total -_ogg_toupper -_oggpackB_adv -_oggpackB_adv1 -_oggpackB_bits -_oggpackB_bytes -_oggpackB_get_buffer -_oggpackB_look -_oggpackB_look1 -_oggpackB_read -_oggpackB_read1 -_oggpackB_readinit -_oggpackB_reset -_oggpack_adv -_oggpack_adv1 -_oggpack_bits -_oggpack_bytes -_oggpack_get_buffer -_oggpack_look -_oggpack_look1 -_oggpack_read -_oggpack_read1 -_oggpack_readinit -_oggpack_reset -_ov_crosslap -_ov_pcm_seek_lap -_ov_pcm_seek_page_lap -_ov_raw_seek_lap -_ov_time_seek_lap -_ov_time_seek_page_lap -_II_step_one -_II_step_two -_MyRecComp -_SampleRates -_Sinfo -_ValidStepIndex -__Z11fmodwrapperv -__Z11fmodwrapperv.eh -__floor_P -__mapping_P -__residue_P -__ve_envelope_clear -__ve_envelope_init -__ve_envelope_mark -__ve_envelope_search -__ve_envelope_shift -__vi_gpsy_free -__vi_psy_free -__vorbis_window_init -__vp_ampmax_decay -__vp_couple -__vp_global_free -__vp_global_look -__vp_noise_normalize -__vp_noise_normalize_sort -__vp_noisemask -__vp_offset_and_mix -__vp_psy_clear -__vp_psy_init -__vp_quantize_couple_memo -__vp_quantize_couple_sort -__vp_remove_floor -__vp_tonemask -_alloc_0 -_alloc_1 -_alloc_2 -_alloc_3 -_alloc_4 -_bandInfo -_cdcallback -_cdchannel -_cdmode -_cdnumtracks -_cdstream -_cdtrack -_drft_backward -_drft_clear -_drft_forward -_drft_init -_eatwhite -_floor0_exportbundle -_floor1_exportbundle -_gFreeList -_gNMRecBusy -_gNMRecPtr -_gSilenceOnes -_gSilenceTwos -_longLimit -_mapping0_exportbundle -_mdct_backward -_mdct_clear -_mdct_forward -_mdct_init -_muls -_mystrdup -_res0_free_info -_res0_free_look -_res0_inverse -_res0_look -_res0_unpack -_res1_class -_res1_inverse -_res2_inverse -_residue0_exportbundle -_residue1_exportbundle -_residue2_exportbundle -_scale -_shortLimit -_tabsel_123 -_F_Free -_F_Malloc -_F_ReAlloc -_F_memcmp -_F_memmove -_F_strcat -_F_strchr -_F_strcmp -_F_strcpy -_F_stricmp -_F_strlen -_F_strncat -_F_strncmp -_F_strncpy -_F_strnicmp -_F_strstr -_F_strupr -_F_tolower -_F_toupper diff --git a/indra/newview/gpu_table.txt b/indra/newview/gpu_table.txt index 4c39014c8b..c64e11929d 100644 --- a/indra/newview/gpu_table.txt +++ b/indra/newview/gpu_table.txt @@ -32,20 +32,20 @@ // 1 - We claim to support this card. // -3Dfx .*3Dfx.* 0 0 0 0 -3Dlabs .*3Dlabs.* 0 0 0 0 -ATI 3D-Analyze .*ATI.*3D-Analyze.* 0 0 0 0 -ATI All-in-Wonder 7500 .*ATI.*All-in-Wonder 75.* 0 1 0 0 -ATI All-in-Wonder 8500 .*ATI.*All-in-Wonder 85.* 0 1 0 0 -ATI All-in-Wonder 9200 .*ATI.*All-in-Wonder 92.* 0 1 0 0 +3Dfx .*3Dfx.* 0 0 0 0 +3Dlabs .*3Dlabs.* 0 0 0 0 +ATI 3D-Analyze .*ATI.*3D-Analyze.* 0 0 0 0 +ATI All-in-Wonder 7500 .*ATI.*All-in-Wonder 75.* 0 1 0 0 +ATI All-in-Wonder 8500 .*ATI.*All-in-Wonder 85.* 0 1 0 0 +ATI All-in-Wonder 9200 .*ATI.*All-in-Wonder 92.* 0 1 0 0 ATI All-in-Wonder 9xxx .*ATI.*All-in-Wonder 9.* 1 1 0 0 -ATI All-in-Wonder HD .*ATI.*All-in-Wonder HD.* 1 1 1 3.3 -ATI All-in-Wonder X600 .*ATI.*All-in-Wonder X6.* 1 1 0 0 -ATI All-in-Wonder X800 .*ATI.*All-in-Wonder X8.* 1 1 1 2.1 -ATI All-in-Wonder X1800 .*ATI.*All-in-Wonder X18.* 3 1 0 0 -ATI All-in-Wonder X1900 .*ATI.*All-in-Wonder X19.* 3 1 0 0 -ATI All-in-Wonder PCI-E .*ATI.*All-in-Wonder.*PCI-E.* 1 1 0 0 -ATI All-in-Wonder Radeon .*ATI.*All-in-Wonder Radeon.* 0 1 0 0 +ATI All-in-Wonder HD .*ATI.*All-in-Wonder HD.* 1 1 1 3.3 +ATI All-in-Wonder X600 .*ATI.*All-in-Wonder X6.* 1 1 0 0 +ATI All-in-Wonder X800 .*ATI.*All-in-Wonder X8.* 1 1 1 2.1 +ATI All-in-Wonder X1800 .*ATI.*All-in-Wonder X18.* 3 1 0 0 +ATI All-in-Wonder X1900 .*ATI.*All-in-Wonder X19.* 3 1 0 0 +ATI All-in-Wonder PCI-E .*ATI.*All-in-Wonder.*PCI-E.* 1 1 0 0 +ATI All-in-Wonder Radeon .*ATI.*All-in-Wonder Radeon.* 0 1 0 0 ATI ASUS ARES .*ATI.*ASUS.*ARES.* 3 1 0 0 ATI ASUS A9xxx .*ATI.*ASUS.*A9.* 1 1 0 0 ATI ASUS AH24xx .*ATI.*ASUS.*AH24.* 1 1 1 3.3 @@ -79,30 +79,30 @@ ATI ASUS Radeon X1xxx .*ATI.*ASUS.*X1.* 2 1 1 2.1 ATI Radeon X7xx .*ATI.*ASUS.*X7.* 1 1 0 0 ATI Radeon X19xx .*ATI.*(Radeon|Diamond) X19.* ?.* 2 1 1 2.1 ATI Radeon X18xx .*ATI.*(Radeon|Diamond) X18.* ?.* 3 1 1 2.1 -ATI Radeon X17xx .*ATI.*(Radeon|Diamond) X17.* ?.* 1 1 1 2.1 +ATI Radeon X17xx .*ATI.*(Radeon|Diamond) X17.* ?.* 1 1 1 2.1 ATI Radeon X16xx .*ATI.*(Radeon|Diamond) X16.* ?.* 1 1 1 2.1 ATI Radeon X15xx .*ATI.*(Radeon|Diamond) X15.* ?.* 1 1 1 2.1 ATI Radeon X13xx .*ATI.*(Radeon|Diamond) X13.* ?.* 1 1 1 2.1 ATI Radeon X1xxx .*ATI.*(Radeon|Diamond) X1.. ?.* 0 1 1 2.1 ATI Radeon X2xxx .*ATI.*(Radeon|Diamond) X2.. ?.* 1 1 1 2.1 -ATI Display Adapter .*ATI.*display adapter.* 1 1 1 4.1 -ATI FireGL 5200 .*ATI.*FireGL V52.* 1 1 1 2.1 -ATI FireGL 5xxx .*ATI.*FireGL V5.* 2 1 1 3.3 -ATI FireGL .*ATI.*Fire.*GL.* 4 1 1 4.2 +ATI Display Adapter .*ATI.*display adapter.* 1 1 1 4.1 +ATI FireGL 5200 .*ATI.*FireGL V52.* 1 1 1 2.1 +ATI FireGL 5xxx .*ATI.*FireGL V5.* 2 1 1 3.3 +ATI FireGL .*ATI.*Fire.*GL.* 4 1 1 4.2 ATI FirePro M3900 .*ATI.*FirePro.*M39.* 2 1 0 0 -ATI FirePro M5800 .*ATI.*FirePro.*M58.* 3 1 0 0 -ATI FirePro M7740 .*ATI.*FirePro.*M77.* 3 1 0 0 -ATI FirePro M7820 .*ATI.*FirePro.*M78.* 5 1 1 4.2 +ATI FirePro M5800 .*ATI.*FirePro.*M58.* 3 1 0 0 +ATI FirePro M7740 .*ATI.*FirePro.*M77.* 3 1 0 0 +ATI FirePro M7820 .*ATI.*FirePro.*M78.* 5 1 1 4.2 ATI FireMV .*ATI.*FireMV.* 0 1 1 1.3 -ATI Generic .*ATI.*Generic.* 0 0 0 0 -ATI Hercules 9800 .*ATI.*Hercules.*9800.* 1 1 0 0 +ATI Generic .*ATI.*Generic.* 0 0 0 0 +ATI Hercules 9800 .*ATI.*Hercules.* 9800.* 1 1 0 0 ATI IGP 340M .*ATI.*IGP.*340M.* 0 0 0 0 -ATI M52 .*ATI.*M52.* 1 1 0 0 -ATI M54 .*ATI.*M54.* 1 1 0 0 -ATI M56 .*ATI.*M56.* 1 1 0 0 -ATI M71 .*ATI.*M71.* 1 1 0 0 -ATI M72 .*ATI.*M72.* 1 1 0 0 -ATI M76 .*ATI.*M76.* 3 1 0 0 +ATI M52 .*ATI.*M52.* 1 1 0 0 +ATI M54 .*ATI.*M54.* 1 1 0 0 +ATI M56 .*ATI.*M56.* 1 1 0 0 +ATI M71 .*ATI.*M71.* 1 1 0 0 +ATI M72 .*ATI.*M72.* 1 1 0 0 +ATI M76 .*ATI.*M76.* 3 1 0 0 ATI Radeon HD 64xx .*ATI.*AMD Radeon.* HD [67]4..[MG] 2 1 1 4.2 ATI Radeon HD 65xx .*ATI.*AMD Radeon.* HD [67]5..[MG] 2 1 1 4.2 ATI Radeon HD 66xx .*ATI.*AMD Radeon.* HD [67]6..[MG] 3 1 1 4.2 @@ -124,12 +124,12 @@ ATI ASUS HD7600 .*ATI.*ASUS.* HD76.* 3 1 0 0 ATI ASUS HD7700 .*ATI.*ASUS.* HD77.* 4 1 1 4.2 ATI ASUS HD7800 .*ATI.*ASUS.* HD78.* 5 1 1 4.2 ATI ASUS HD7900 .*ATI.*ASUS.* HD79.* 5 1 1 4.2 -ATI Mobility Radeon 4100 .*ATI.*Mobility.*41.. 1 1 1 3.3 -ATI Mobility Radeon 7xxx .*ATI.*Mobility.*Radeon 7.* 0 1 1 1.3 -ATI Mobility Radeon 8xxx .*ATI.*Mobility.*Radeon 8.* 0 1 0 0 -ATI Mobility Radeon 9800 .*ATI.*Mobility.*98.* 1 1 0 0 -ATI Mobility Radeon 9700 .*ATI.*Mobility.*97.* 0 1 1 2.1 -ATI Mobility Radeon 9600 .*ATI.*Mobility.*96.* 1 1 1 2.1 +ATI Mobility Radeon 4100 .*ATI.*Mobility.* 41.. 1 1 1 3.3 +ATI Mobility Radeon 7xxx .*ATI.*Mobility.*Radeon 7.* 0 1 1 1.3 +ATI Mobility Radeon 8xxx .*ATI.*Mobility.*Radeon 8.* 0 1 0 0 +ATI Mobility Radeon 9800 .*ATI.*Mobility.* 98.* 1 1 0 0 +ATI Mobility Radeon 9700 .*ATI.*Mobility.* 97.* 0 1 1 2.1 +ATI Mobility Radeon 9600 .*ATI.*Mobility.* 96.* 1 1 1 2.1 ATI Mobility Radeon HD 530v .*ATI.*Mobility.*HD *530v.* 1 1 1 3.3 ATI Mobility Radeon HD 540v .*ATI.*Mobility.*HD *540v.* 1 1 1 3.3 ATI Mobility Radeon HD 545v .*ATI.*Mobility.*HD *545v.* 2 1 1 4 @@ -176,7 +176,7 @@ ATI Radeon HD 3400 .*ATI.*Radeon HD *34.. 1 1 1 4 ATI Radeon HD 3500 .*ATI.*Radeon HD *35.. 2 1 0 0 ATI Radeon HD 3600 .*ATI.*Radeon HD *36.. 3 1 1 3.3 ATI Radeon HD 3700 .*ATI.*Radeon HD *37.. 3 1 0 0 -ATI HD3700 .*ATI.* HD37.. 3 1 0 3.3 +ATI HD3700 .*ATI.* HD37.. 3 1 0 3.3 ATI Radeon HD 3800 .*ATI.*Radeon HD *38.. 3 1 1 4 ATI Radeon HD 4100 .*ATI.*Radeon HD *41.. 1 1 0 0 ATI Radeon HD 4200 .*ATI.*Radeon HD *42.. 1 1 1 4 @@ -202,128 +202,128 @@ ATI Radeon HD 6600 .*ATI.*Radeon HD *66.. 3 1 1 4.2 ATI Radeon HD 6700 .*ATI.*Radeon HD *67.. 3 1 1 4.2 ATI Radeon HD 6800 .*ATI.*Radeon HD *68.. 4 1 1 4.2 ATI Radeon HD 6900 .*ATI.*Radeon HD *69.. 5 1 1 4.2 -ATI Radeon OpenGL .*ATI.*Radeon OpenGL.* 0 0 0 0 -ATI Radeon 2100 .*ATI.*Radeon 21.. 0 1 1 2.1 -ATI Radeon 3000 .*ATI.*Radeon 30.. 1 1 1 4 -ATI Radeon 3100 .*ATI.*Radeon 31.. 0 1 1 3.3 -ATI Radeon 5xxx .*ATI.*Radeon 5... 3 1 0 0 -ATI Radeon 7xxx .*ATI.*Radeon 7... 0 1 1 2 -ATI Radeon 8xxx .*ATI.*Radeon 8... 0 1 0 0 -ATI Radeon 9000 .*ATI.*Radeon 90.. 0 1 1 1.3 -ATI Radeon 9100 .*ATI.*Radeon 91.. 0 1 0 0 -ATI Radeon 9200 .*ATI.*Radeon 92.. 0 1 1 1.3 -ATI Radeon 9500 .*ATI.*Radeon 95.. 0 1 1 2.1 -ATI Radeon 9600 .*ATI.*Radeon 96.. 0 1 1 2.1 -ATI Radeon 9700 .*ATI.*Radeon 97.. 1 1 0 0 -ATI Radeon 9800 .*ATI.*Radeon 98.. 1 1 1 2.1 -ATI Radeon RV250 .*ATI.*RV250.* 0 1 0 0 -ATI Radeon RV600 .*ATI.*RV6.* 1 1 0 0 -ATI Radeon RX700 .*ATI.*RX70.* 1 1 0 0 +ATI Radeon OpenGL .*ATI.*Radeon OpenGL.* 0 0 0 0 +ATI Radeon 2100 .*ATI.*Radeon 21.. 0 1 1 2.1 +ATI Radeon 3000 .*ATI.*Radeon 30.. 1 1 1 4 +ATI Radeon 3100 .*ATI.*Radeon 31.. 0 1 1 3.3 +ATI Radeon 5xxx .*ATI.*Radeon 5... 3 1 0 0 +ATI Radeon 7xxx .*ATI.*Radeon 7... 0 1 1 2 +ATI Radeon 8xxx .*ATI.*Radeon 8... 0 1 0 0 +ATI Radeon 9000 .*ATI.*Radeon 90.. 0 1 1 1.3 +ATI Radeon 9100 .*ATI.*Radeon 91.. 0 1 0 0 +ATI Radeon 9200 .*ATI.*Radeon 92.. 0 1 1 1.3 +ATI Radeon 9500 .*ATI.*Radeon 95.. 0 1 1 2.1 +ATI Radeon 9600 .*ATI.*Radeon 96.. 0 1 1 2.1 +ATI Radeon 9700 .*ATI.*Radeon 97.. 1 1 0 0 +ATI Radeon 9800 .*ATI.*Radeon 98.. 1 1 1 2.1 +ATI Radeon RV250 .*ATI.*RV250.* 0 1 0 0 +ATI Radeon RV600 .*ATI.*RV6.* 1 1 0 0 +ATI Radeon RX700 .*ATI.*RX70.* 1 1 0 0 ATI Radeon RX800 .*ATI.*Radeon *RX80.* 2 1 0 0 -ATI RS880M .*ATI.*RS880M 1 1 0 0 -ATI Radeon RX9550 .*ATI.*RX9550.* 1 1 0 0 -ATI Radeon VE .*ATI.*Radeon.*VE.* 0 0 0 0 +ATI RS880M .*ATI.*RS880M 1 1 0 0 +ATI Radeon RX9550 .*ATI.*RX9550.* 1 1 0 0 +ATI Radeon VE .*ATI.*Radeon.*VE.* 0 0 0 0 ATI Radeon X300 .*ATI.*Radeon *X3.* 1 1 1 2.1 -ATI Radeon X400 .*ATI.*Radeon ?X4.* 0 1 0 0 -ATI Radeon X500 .*ATI.*Radeon ?X5.* 1 1 1 2.1 +ATI Radeon X400 .*ATI.*Radeon ?X4.* 0 1 0 0 +ATI Radeon X500 .*ATI.*Radeon ?X5.* 1 1 1 2.1 ATI Radeon X600 .*ATI.*Radeon ?X6.* 1 1 1 2.1 -ATI Radeon X700 .*ATI.*Radeon ?X7.* 2 1 1 2.1 -ATI Radeon X800 .*ATI.*Radeon ?X8.* 1 1 1 2.1 -ATI Radeon X900 .*ATI.*Radeon ?X9.* 2 1 0 0 -ATI Radeon Xpress .*ATI.*Radeon Xpress.* 0 1 1 2.1 -ATI Rage 128 .*ATI.*Rage 128.* 0 1 0 0 -ATI R300 (9700) .*R300.* 0 1 1 2.1 -ATI R350 (9800) .*R350.* 1 1 0 0 -ATI R580 (X1900) .*R580.* 3 1 0 0 -ATI RC410 (Xpress 200) .*RC410.* 0 0 0 0 -ATI RS48x (Xpress 200x) .*RS48.* 0 0 0 0 -ATI RS600 (Xpress 3200) .*RS600.* 0 0 0 0 -ATI RV350 (9600) .*RV350.* 0 1 0 0 -ATI RV370 (X300) .*RV370.* 0 1 0 0 -ATI RV410 (X700) .*RV410.* 1 1 0 0 -ATI RV515 .*RV515.* 1 1 0 0 -ATI RV570 (X1900 GT/PRO) .*RV570.* 3 1 0 0 -ATI RV380 .*RV380.* 0 1 0 0 -ATI RV530 .*RV530.* 1 1 0 0 -ATI RX480 (Xpress 200P) .*RX480.* 0 1 0 0 -ATI RX700 .*RX700.* 1 1 0 0 -AMD ANTILLES (HD 6990) .*(AMD|ATI).*Antilles.* 3 1 0 0 -AMD BARTS (HD 6800) .*(AMD|ATI).*Barts.* 3 1 1 2.1 -AMD CAICOS (HD 6400) .*(AMD|ATI).*Caicos.* 3 1 0 0 -AMD CAYMAN (HD 6900) .*(AMD|ATI).*(Cayman|CAYMAM).* 3 1 0 0 +ATI Radeon X700 .*ATI.*Radeon ?X7.* 2 1 1 2.1 +ATI Radeon X800 .*ATI.*Radeon ?X8.* 1 1 1 2.1 +ATI Radeon X900 .*ATI.*Radeon ?X9.* 2 1 0 0 +ATI Radeon Xpress .*ATI.*Radeon Xpress.* 0 1 1 2.1 +ATI Rage 128 .*ATI.*Rage 128.* 0 1 0 0 +ATI R300 (9700) .*R300.* 0 1 1 2.1 +ATI R350 (9800) .*R350.* 1 1 0 0 +ATI R580 (X1900) .*R580.* 3 1 0 0 +ATI RC410 (Xpress 200) .*RC410.* 0 0 0 0 +ATI RS48x (Xpress 200x) .*RS48.* 0 0 0 0 +ATI RS600 (Xpress 3200) .*RS600.* 0 0 0 0 +ATI RV350 (9600) .*RV350.* 0 1 0 0 +ATI RV370 (X300) .*RV370.* 0 1 0 0 +ATI RV410 (X700) .*RV410.* 1 1 0 0 +ATI RV515 .*RV515.* 1 1 0 0 +ATI RV570 (X1900 GT/PRO) .*RV570.* 3 1 0 0 +ATI RV380 .*RV380.* 0 1 0 0 +ATI RV530 .*RV530.* 1 1 0 0 +ATI RX480 (Xpress 200P) .*RX480.* 0 1 0 0 +ATI RX700 .*RX700.* 1 1 0 0 +AMD ANTILLES (HD 6990) .*(AMD|ATI).*Antilles.* 3 1 0 0 +AMD BARTS (HD 6800) .*(AMD|ATI).*Barts.* 3 1 1 2.1 +AMD CAICOS (HD 6400) .*(AMD|ATI).*Caicos.* 3 1 0 0 +AMD CAYMAN (HD 6900) .*(AMD|ATI).*(Cayman|CAYMAM).* 3 1 0 0 AMD CEDAR (HD 5450) .*(AMD|ATI).*Cedar.* 2 1 0 0 -AMD CYPRESS (HD 5800) .*(AMD|ATI).*Cypress.* 3 1 0 0 -AMD HEMLOCK (HD 5970) .*(AMD|ATI).*Hemlock.* 3 1 0 0 -AMD JUNIPER (HD 5700) .*(AMD|ATI).*Juniper.* 3 1 0 0 -AMD PARK .*(AMD|ATI).*Park.* 3 1 0 0 +AMD CYPRESS (HD 5800) .*(AMD|ATI).*Cypress.* 3 1 0 0 +AMD HEMLOCK (HD 5970) .*(AMD|ATI).*Hemlock.* 3 1 0 0 +AMD JUNIPER (HD 5700) .*(AMD|ATI).*Juniper.* 3 1 0 0 +AMD PARK .*(AMD|ATI).*Park.* 3 1 0 0 AMD REDWOOD (HD 5500/5600) .*(AMD|ATI).*Redwood.* 3 1 0 0 AMD TURKS (HD 6500/6600) .*(AMD|ATI).*Turks.* 3 1 0 0 -AMD RS780 (HD 3200) .*RS780.* 0 1 1 2.1 -AMD RS880 (HD 4200) .*RS880.* 0 1 1 3.2 -AMD RV610 (HD 2400) .*RV610.* 1 1 0 0 -AMD RV620 (HD 3400) .*RV620.* 1 1 0 0 -AMD RV630 (HD 2600) .*RV630.* 2 1 0 0 +AMD RS780 (HD 3200) .*RS780.* 0 1 1 2.1 +AMD RS880 (HD 4200) .*RS880.* 0 1 1 3.2 +AMD RV610 (HD 2400) .*RV610.* 1 1 0 0 +AMD RV620 (HD 3400) .*RV620.* 1 1 0 0 +AMD RV630 (HD 2600) .*RV630.* 2 1 0 0 AMD RV635 (HD 3600) .*RV635.* 3 1 0 0 -AMD RV670 (HD 3800) .*RV670.* 3 1 0 0 -AMD R680 (HD 3870 X2) .*R680.* 3 1 0 0 -AMD R700 (HD 4800 X2) .*R700.* 3 1 0 0 -AMD RV710 (HD 4300) .*RV710.* 0 1 1 1.4 +AMD RV670 (HD 3800) .*RV670.* 3 1 0 0 +AMD R680 (HD 3870 X2) .*R680.* 3 1 0 0 +AMD R700 (HD 4800 X2) .*R700.* 3 1 0 0 +AMD RV710 (HD 4300) .*RV710.* 0 1 1 1.4 AMD RV730 (HD 4600) .*RV730.* 3 1 0 0 -AMD RV740 (HD 4700) .*RV740.* 3 1 0 0 -AMD RV770 (HD 4800) .*RV770.* 3 1 0 0 -AMD RV790 (HD 4800) .*RV790.* 3 1 0 0 -ATI 760G/Radeon 3000 .*ATI.*AMD 760G.* 1 1 1 3.3 -ATI 780L/Radeon 3000 .*ATI.*AMD 780L.* 1 1 0 0 -ATI Radeon DDR .*ATI.*Radeon ?DDR.* 0 1 0 0 +AMD RV740 (HD 4700) .*RV740.* 3 1 0 0 +AMD RV770 (HD 4800) .*RV770.* 3 1 0 0 +AMD RV790 (HD 4800) .*RV790.* 3 1 0 0 +ATI 760G/Radeon 3000 .*ATI.*AMD 760G.* 1 1 1 3.3 +ATI 780L/Radeon 3000 .*ATI.*AMD 780L.* 1 1 0 0 +ATI Radeon DDR .*ATI.*Radeon ?DDR.* 0 1 0 0 ATI FirePro 2000 .*ATI.*FirePro 2.* 2 1 1 4.1 -ATI FirePro 3000 .*ATI.*FirePro V3.* 2 1 0 0 +ATI FirePro 3000 .*ATI.*FirePro V3.* 2 1 0 0 ATI FirePro 4000 .*ATI.*FirePro V4.* 2 1 0 0 -ATI FirePro 5000 .*ATI.*FirePro V5.* 3 1 0 0 -ATI FirePro 7000 .*ATI.*FirePro V7.* 3 1 0 0 -ATI FirePro M .*ATI.*FirePro M.* 3 1 1 4.2 -ATI R300 (9700) .*R300.* 0 1 1 2.1 +ATI FirePro 5000 .*ATI.*FirePro V5.* 3 1 0 0 +ATI FirePro 7000 .*ATI.*FirePro V7.* 3 1 0 0 +ATI FirePro M .*ATI.*FirePro M.* 3 1 1 4.2 +ATI R300 (9700) .*R300.* 0 1 1 2.1 ATI Radeon .*ATI.*(Diamond|Radeon).* 0 1 0 4.2 -Intel X3100 .*Intel.*X3100.* 1 1 1 2.1 -Intel GMA 3600 .*Intel.* 3600.* 0 1 1 3 -Intel 830M .*Intel.*830M 0 0 0 0 -Intel 845G .*Intel.*845G 0 0 1 1.4 -Intel 855GM .*Intel.*855GM 0 0 1 1.4 -Intel 865G .*Intel.*865G 0 0 1 1.4 -Intel 900 .*Intel.*900.*900 0 0 0 0 -Intel 915GM .*Intel.*915GM 0 0 1 1.4 -Intel 915G .*Intel.*915G 0 0 1 1.4 -Intel 945GM .*Intel.*945GM.* 0 1 1 1.4 -Intel 945G .*Intel.*945G.* 0 1 1 1.4 -Intel 950 .*Intel.*950.* 0 1 1 1.4 -Intel 965 .*Intel.*965.* 0 1 1 2.1 -Intel G33 .*Intel.*G33.* 1 0 1 1.4 -Intel G41 .*Intel.*G41.* 1 1 1 2.1 -Intel G45 .*Intel.*G45.* 1 1 1 2.1 -Intel Bear Lake .*Intel.*Bear Lake.* 1 0 1 1.4 -Intel Broadwater .*Intel.*Broadwater.* 0 0 1 1.4 -Intel Brookdale .*Intel.*Brookdale.* 0 0 1 1.3 -Intel Cantiga .*Intel.*Cantiga.* 0 0 1 2 -Intel Eaglelake .*Intel.*Eaglelake.* 1 1 1 2 -Intel Graphics Media HD .*Intel.*Graphics Media.*HD.* 1 1 1 2.1 -Intel HD Graphics 2000 .*Intel.*HD Graphics 2.* 2 1 0 4 -Intel HD Graphics 3000 .*Intel.*HD Graphics 3.* 3 1 1 3.1 -Intel HD Graphics 4000 .*Intel.*HD Graphics 4.* 3 1 1 4 +Intel X3100 .*Intel.*X3100.* 1 1 1 2.1 +Intel GMA 3600 .*Intel.* 3600.* 0 1 1 3 +Intel 830M .*Intel.*830M 0 0 0 0 +Intel 845G .*Intel.*845G 0 0 1 1.4 +Intel 855GM .*Intel.*855GM 0 0 1 1.4 +Intel 865G .*Intel.*865G 0 0 1 1.4 +Intel 900 .*Intel.*900.*900 0 0 0 0 +Intel 915GM .*Intel.*915GM 0 0 1 1.4 +Intel 915G .*Intel.*915G 0 0 1 1.4 +Intel 945GM .*Intel.*945GM.* 0 1 1 1.4 +Intel 945G .*Intel.*945G.* 0 1 1 1.4 +Intel 950 .*Intel.*950.* 0 1 1 1.4 +Intel 965 .*Intel.*965.* 0 1 1 2.1 +Intel G33 .*Intel.*G33.* 1 0 1 1.4 +Intel G41 .*Intel.*G41.* 1 1 1 2.1 +Intel G45 .*Intel.*G45.* 1 1 1 2.1 +Intel Bear Lake .*Intel.*Bear Lake.* 1 0 1 1.4 +Intel Broadwater .*Intel.*Broadwater.* 0 0 1 1.4 +Intel Brookdale .*Intel.*Brookdale.* 0 0 1 1.3 +Intel Cantiga .*Intel.*Cantiga.* 0 0 1 2 +Intel Eaglelake .*Intel.*Eaglelake.* 1 1 1 2 +Intel Graphics Media HD .*Intel.*Graphics Media.*HD.* 1 1 1 2.1 +Intel HD Graphics 2000 .*Intel.*HD Graphics 2.* 2 1 0 4 +Intel HD Graphics 3000 .*Intel.*HD Graphics 3.* 3 1 1 3.1 +Intel HD Graphics 4000 .*Intel.*HD Graphics 4.* 3 1 1 4 Intel HD2000 .*Intel.*HD2000.* 2 1 0 0 Intel HD3000 .*Intel.*HD3000.* 3 1 0 0 -Intel HD Graphics .*Intel.*HD Graphics.* 2 1 1 4 -Intel Mobile 4 Series .*Intel.*Mobile.* 4 Series.* 0 1 1 2.1 -Intel 4 Series Internal .*Intel.* 4 Series Internal.* 1 1 1 2.1 -Intel Media Graphics HD .*Intel.*Media Graphics HD.* 0 1 0 0 -Intel Montara .*Intel.*Montara.* 0 0 1 1.3 -Intel Pineview .*Intel.*Pineview.* 0 1 1 1.4 -Intel Springdale .*Intel.*Springdale.* 0 0 1 1.3 -Intel Grantsdale .*Intel.*Grantsdale.* 1 1 0 0 -Intel Q45/Q43 .*Intel.*Q4.* 1 1 1 2.1 -Intel B45/B43 .*Intel.*B4.* 1 1 1 2.1 -Intel 3D-Analyze .*Intel.*3D-Analyze.* 2 1 0 0 -Matrox .*Matrox.* 0 0 0 0 +Intel HD Graphics .*Intel.*HD Graphics.* 2 1 1 4 +Intel Mobile 4 Series .*Intel.*Mobile.* 4 Series.* 0 1 1 2.1 +Intel 4 Series Internal .*Intel.* 4 Series Internal.* 1 1 1 2.1 +Intel Media Graphics HD .*Intel.*Media Graphics HD.* 0 1 0 0 +Intel Montara .*Intel.*Montara.* 0 0 1 1.3 +Intel Pineview .*Intel.*Pineview.* 0 1 1 1.4 +Intel Springdale .*Intel.*Springdale.* 0 0 1 1.3 +Intel Grantsdale .*Intel.*Grantsdale.* 1 1 0 0 +Intel Q45/Q43 .*Intel.*Q4.* 1 1 1 2.1 +Intel B45/B43 .*Intel.*B4.* 1 1 1 2.1 +Intel 3D-Analyze .*Intel.*3D-Analyze.* 2 1 0 0 +Matrox .*Matrox.* 0 0 0 0 Mesa .*Mesa.* 1 0 1 2.1 -Gallium .*Gallium.* 1 1 1 2.1 +Gallium .*Gallium.* 1 1 1 2.1 NVIDIA G100M .*NVIDIA .*100M.* 4 1 1 3.3 NVIDIA G102M .*NVIDIA .*102M.* 1 1 1 3.3 NVIDIA G103M .*NVIDIA .*103M.* 2 1 1 3.3 @@ -380,14 +380,14 @@ NVIDIA GTX 660M .*NVIDIA .*GTX *66*M.* 5 1 0 0 NVIDIA GTX 670M .*NVIDIA .*GTX *67*M.* 5 1 1 4.2 NVIDIA GTX 680M .*NVIDIA .*GTX *68*M.* 5 1 0 0 NVIDIA GTX 690M .*NVIDIA .*GTX *69*M.* 5 1 0 0 -NVIDIA G100 .*NVIDIA .*G10.* 3 1 1 4.2 +NVIDIA G100 .*NVIDIA .*G10.* 3 1 1 4.2 NVIDIA GT 120 .*NVIDIA .*GT *12.* 2 1 0 3 NVIDIA GT 130 .*NVIDIA .*GT *13.* 2 1 0 3.3 NVIDIA GTS 150 .*NVIDIA .*GTS *15.* 2 1 0 0 -NVIDIA 200 .*NVIDIA .*GeForce 20.* 2 1 1 3.3 -NVIDIA G200 .*NVIDIA .*GeForce G20.* 2 1 1 3.3 -NVIDIA G210 .*NVIDIA .*GeForce G210.* 3 1 1 3.3 -NVIDIA 210 .*NVIDIA .*GeForce 210.* 3 1 1 3.3 +NVIDIA 200 .*NVIDIA .*GeForce 20.* 2 1 1 3.3 +NVIDIA G200 .*NVIDIA .*GeForce G20.* 2 1 1 3.3 +NVIDIA G210 .*NVIDIA .*GeForce G210.* 3 1 1 3.3 +NVIDIA 210 .*NVIDIA .*GeForce 210.* 3 1 1 3.3 NVIDIA GT 220 .*NVIDIA .*GT *22.* 2 1 1 3.3 NVIDIA GT 230 .*NVIDIA .*GT *23.* 2 1 1 3.3 NVIDIA GT 240 .*NVIDIA .*GT *24.* 4 1 1 3.3 @@ -397,12 +397,12 @@ NVIDIA GTX 260 .*NVIDIA .*GTX *26.* 4 1 1 3.3 NVIDIA GTX 270 .*NVIDIA .*GTX *27.* 4 1 0 3.3 NVIDIA GTX 280 .*NVIDIA .*GTX *28.* 4 1 1 3.3 NVIDIA GTX 290 .*NVIDIA .*GTX *29.* 5 1 0 3.3 -NVIDIA 310 .*NVIDIA .*GeForce 310.* 3 1 1 3.3 -NVIDIA 315 .*NVIDIA .*GeForce 315.* 3 1 1 3.3 +NVIDIA 310 .*NVIDIA .*GeForce 310.* 3 1 1 3.3 +NVIDIA 315 .*NVIDIA .*GeForce 315.* 3 1 1 3.3 NVIDIA GT 320 .*NVIDIA .*GT *32.* 3 1 0 3.3 NVIDIA GT 330 .*NVIDIA .*GT *33.* 3 1 0 3.3 NVIDIA GT 340 .*NVIDIA .*GT *34.* 3 1 0 0 -NVIDIA 405 .*NVIDIA .* 405.* 3 1 0 3.3 +NVIDIA 405 .*NVIDIA .* 405.* 3 1 0 3.3 NVIDIA GT 420 .*NVIDIA .*GT *42.* 3 1 1 4.2 NVIDIA GT 430 .*NVIDIA .*GT *43.* 3 1 1 4.2 NVIDIA GT 440 .*NVIDIA .*GT *44.* 4 1 0 4.2 @@ -429,125 +429,125 @@ NVIDIA GTX 660 .*NVIDIA .*GTX *66.* 5 1 0 4.3 NVIDIA GTX 670 .*NVIDIA .*GTX *67.* 5 1 1 4.2 NVIDIA GTX 680 .*NVIDIA .*GTX *68.* 5 1 1 4.2 NVIDIA GTX 690 .*NVIDIA .*GTX *69.* 5 1 1 4.2 -NVIDIA C51 .*NVIDIA .*C51.* 0 1 1 2 -NVIDIA G72 .*NVIDIA .*G72.* 1 1 0 0 -NVIDIA G73 .*NVIDIA .*G73.* 1 1 0 0 -NVIDIA G84 .*NVIDIA .*G84.* 2 1 0 0 -NVIDIA G86 .*NVIDIA .*G86.* 3 1 0 0 -NVIDIA G92 .*NVIDIA .*G92.* 3 1 0 0 -NVIDIA GeForce .*GeForce 256.* 0 0 0 0 -NVIDIA GeForce 2 .*GeForce ?2 ?.* 0 1 1 1.5 +NVIDIA C51 .*NVIDIA .*C51.* 0 1 1 2 +NVIDIA G72 .*NVIDIA .*G72.* 1 1 0 0 +NVIDIA G73 .*NVIDIA .*G73.* 1 1 0 0 +NVIDIA G84 .*NVIDIA .*G84.* 2 1 0 0 +NVIDIA G86 .*NVIDIA .*G86.* 3 1 0 0 +NVIDIA G92 .*NVIDIA .*G92.* 3 1 0 0 +NVIDIA GeForce .*GeForce 256.* 0 0 0 0 +NVIDIA GeForce 2 .*GeForce ?2 ?.* 0 1 1 1.5 NVIDIA GeForce 3 .*GeForce ?3 ?.* 2 1 1 2.1 NVIDIA GeForce 3 Ti .*GeForce ?3 Ti.* 0 1 0 0 -NVIDIA GeForce 4 .*NVIDIA .*GeForce ?4.* 0 1 1 1.5 +NVIDIA GeForce 4 .*NVIDIA .*GeForce ?4.* 0 1 1 1.5 NVIDIA GeForce 4 Go .*NVIDIA .*GeForce ?4.*Go.* 0 1 0 0 NVIDIA GeForce 4 MX .*NVIDIA .*GeForce ?4 MX.* 0 1 0 0 NVIDIA GeForce 4 PCX .*NVIDIA .*GeForce ?4 PCX.* 0 1 0 0 NVIDIA GeForce 4 Ti .*NVIDIA .*GeForce ?4 Ti.* 0 1 0 0 -NVIDIA GeForce 6100 .*NVIDIA .*GeForce 61.* 3 1 1 4.2 -NVIDIA GeForce 6200 .*NVIDIA .*GeForce 62.* 0 1 1 2.1 -NVIDIA GeForce 6500 .*NVIDIA .*GeForce 65.* 1 1 1 2.1 -NVIDIA GeForce 6600 .*NVIDIA .*GeForce 66.* 2 1 1 2.1 -NVIDIA GeForce 6700 .*NVIDIA .*GeForce 67.* 2 1 1 2.1 -NVIDIA GeForce 6800 .*NVIDIA .*GeForce 68.* 1 1 1 2.1 -NVIDIA GeForce 7000 .*NVIDIA .*GeForce 70.* 1 1 1 2.1 -NVIDIA GeForce 7100 .*NVIDIA .*GeForce 71.* 1 1 1 2.1 -NVIDIA GeForce 7200 .*NVIDIA .*GeForce 72.* 1 1 0 0 -NVIDIA GeForce 7300 .*NVIDIA .*GeForce 73.* 1 1 1 2.1 -NVIDIA GeForce 7500 .*NVIDIA .*GeForce 75.* 2 1 1 2.1 -NVIDIA GeForce 7600 .*NVIDIA .*GeForce 76.* 2 1 1 2.1 -NVIDIA GeForce 7800 .*NVIDIA .*GeForce 78.* 2 1 1 2.1 -NVIDIA GeForce 7900 .*NVIDIA .*GeForce 79.* 3 1 1 2.1 +NVIDIA GeForce 6100 .*NVIDIA .*GeForce 61.* 3 1 1 4.2 +NVIDIA GeForce 6200 .*NVIDIA .*GeForce 62.* 0 1 1 2.1 +NVIDIA GeForce 6500 .*NVIDIA .*GeForce 65.* 1 1 1 2.1 +NVIDIA GeForce 6600 .*NVIDIA .*GeForce 66.* 2 1 1 2.1 +NVIDIA GeForce 6700 .*NVIDIA .*GeForce 67.* 2 1 1 2.1 +NVIDIA GeForce 6800 .*NVIDIA .*GeForce 68.* 1 1 1 2.1 +NVIDIA GeForce 7000 .*NVIDIA .*GeForce 70.* 1 1 1 2.1 +NVIDIA GeForce 7100 .*NVIDIA .*GeForce 71.* 1 1 1 2.1 +NVIDIA GeForce 7200 .*NVIDIA .*GeForce 72.* 1 1 0 0 +NVIDIA GeForce 7300 .*NVIDIA .*GeForce 73.* 1 1 1 2.1 +NVIDIA GeForce 7500 .*NVIDIA .*GeForce 75.* 2 1 1 2.1 +NVIDIA GeForce 7600 .*NVIDIA .*GeForce 76.* 2 1 1 2.1 +NVIDIA GeForce 7800 .*NVIDIA .*GeForce 78.* 2 1 1 2.1 +NVIDIA GeForce 7900 .*NVIDIA .*GeForce 79.* 3 1 1 2.1 NVIDIA GeForce 8100 .*NVIDIA .*GeForce 81.* 1 1 0 0 NVIDIA GeForce 8200M .*NVIDIA .*GeForce 8200M.* 1 1 0 3.3 NVIDIA GeForce 8200 .*NVIDIA .*GeForce 82.* 1 1 0 2.1 -NVIDIA GeForce 8300 .*NVIDIA .*GeForce 83.* 3 1 1 3.3 +NVIDIA GeForce 8300 .*NVIDIA .*GeForce 83.* 3 1 1 3.3 NVIDIA GeForce 8400M .*NVIDIA .*GeForce 8400M.* 1 1 1 3.3 -NVIDIA GeForce 8400 .*NVIDIA .*GeForce 84.* 2 1 1 3.3 -NVIDIA GeForce 8500 .*NVIDIA .*GeForce 85.* 2 1 1 3.3 +NVIDIA GeForce 8400 .*NVIDIA .*GeForce 84.* 2 1 1 3.3 +NVIDIA GeForce 8500 .*NVIDIA .*GeForce 85.* 2 1 1 3.3 NVIDIA GeForce 8600M .*NVIDIA .*GeForce 8600M.* 2 1 1 3.3 -NVIDIA GeForce 8600 .*NVIDIA .*GeForce 86.* 3 1 1 3.3 +NVIDIA GeForce 8600 .*NVIDIA .*GeForce 86.* 3 1 1 3.3 NVIDIA GeForce 8700M .*NVIDIA .*GeForce 8700M.* 2 1 1 3.3 -NVIDIA GeForce 8700 .*NVIDIA .*GeForce 87.* 3 1 0 0 +NVIDIA GeForce 8700 .*NVIDIA .*GeForce 87.* 3 1 0 0 NVIDIA GeForce 8800M .*NVIDIA .*GeForce 8800M.* 2 1 1 3.3 -NVIDIA GeForce 8800 .*NVIDIA .*GeForce 88.* 3 1 1 3.3 +NVIDIA GeForce 8800 .*NVIDIA .*GeForce 88.* 3 1 1 3.3 NVIDIA GeForce 9100M .*NVIDIA .*GeForce 9100M.* 0 1 0 0 -NVIDIA GeForce 9100 .*NVIDIA .*GeForce 91.* 0 1 0 3.3 +NVIDIA GeForce 9100 .*NVIDIA .*GeForce 91.* 0 1 0 3.3 NVIDIA GeForce 9200M .*NVIDIA .*GeForce 9200M.* 1 1 0 3.1 -NVIDIA GeForce 9200 .*NVIDIA .*GeForce 92.* 1 1 0 3.3 +NVIDIA GeForce 9200 .*NVIDIA .*GeForce 92.* 1 1 0 3.3 NVIDIA GeForce 9300M .*NVIDIA .*GeForce 9300M.* 1 1 1 3.3 -NVIDIA GeForce 9300 .*NVIDIA .*GeForce 93.* 1 1 1 3.3 +NVIDIA GeForce 9300 .*NVIDIA .*GeForce 93.* 1 1 1 3.3 NVIDIA GeForce 9400M .*NVIDIA .*GeForce 9400M.* 2 1 1 3.3 -NVIDIA GeForce 9400 .*NVIDIA .*GeForce 94.* 3 1 1 3.3 +NVIDIA GeForce 9400 .*NVIDIA .*GeForce 94.* 3 1 1 3.3 NVIDIA GeForce 9500M .*NVIDIA .*GeForce 9500M.* 1 1 1 3.3 -NVIDIA GeForce 9500 .*NVIDIA .*GeForce 95.* 3 1 1 3.3 +NVIDIA GeForce 9500 .*NVIDIA .*GeForce 95.* 3 1 1 3.3 NVIDIA GeForce 9600M .*NVIDIA .*GeForce 9600M.* 2 1 1 3.3 -NVIDIA GeForce 9600 .*NVIDIA .*GeForce 96.* 3 1 1 3.3 +NVIDIA GeForce 9600 .*NVIDIA .*GeForce 96.* 3 1 1 3.3 NVIDIA GeForce 9700M .*NVIDIA .*GeForce 9700M.* 0 1 1 3.3 NVIDIA GeForce 9800M .*NVIDIA .*GeForce 9800M.* 2 1 1 3.3 -NVIDIA GeForce 9800 .*NVIDIA .*GeForce 98.* 3 1 1 3.3 -NVIDIA GeForce FX 5100 .*NVIDIA .*GeForce FX 51.* 0 1 0 0 -NVIDIA GeForce FX 5200 .*NVIDIA .*GeForce FX 52.* 0 1 0 2.1 -NVIDIA GeForce FX 5300 .*NVIDIA .*GeForce FX 53.* 0 1 0 0 -NVIDIA GeForce FX 5500 .*NVIDIA .*GeForce FX 55.* 0 1 1 2.1 -NVIDIA GeForce FX 5600 .*NVIDIA .*GeForce FX 56.* 1 1 1 2.1 -NVIDIA GeForce FX 5700 .*NVIDIA .*GeForce FX 57.* 0 1 1 2.1 -NVIDIA GeForce FX 5800 .*NVIDIA .*GeForce FX 58.* 1 1 0 0 -NVIDIA GeForce FX 5900 .*NVIDIA .*GeForce FX 59.* 1 1 1 2.1 -NVIDIA GeForce FX Go5100 .*NVIDIA .*GeForce FX Go51.* 0 1 0 0 +NVIDIA GeForce 9800 .*NVIDIA .*GeForce 98.* 3 1 1 3.3 +NVIDIA GeForce FX 5100 .*NVIDIA .*GeForce FX 51.* 0 1 0 0 +NVIDIA GeForce FX 5200 .*NVIDIA .*GeForce FX 52.* 0 1 0 2.1 +NVIDIA GeForce FX 5300 .*NVIDIA .*GeForce FX 53.* 0 1 0 0 +NVIDIA GeForce FX 5500 .*NVIDIA .*GeForce FX 55.* 0 1 1 2.1 +NVIDIA GeForce FX 5600 .*NVIDIA .*GeForce FX 56.* 1 1 1 2.1 +NVIDIA GeForce FX 5700 .*NVIDIA .*GeForce FX 57.* 0 1 1 2.1 +NVIDIA GeForce FX 5800 .*NVIDIA .*GeForce FX 58.* 1 1 0 0 +NVIDIA GeForce FX 5900 .*NVIDIA .*GeForce FX 59.* 1 1 1 2.1 +NVIDIA GeForce FX Go5100 .*NVIDIA .*GeForce FX Go51.* 0 1 0 0 NVIDIA GeForce FX Go5200 .*NVIDIA .*GeForce FX Go52.* 0 1 0 0 -NVIDIA GeForce FX Go5300 .*NVIDIA .*GeForce FX Go53.* 0 1 0 0 -NVIDIA GeForce FX Go5500 .*NVIDIA .*GeForce FX Go55.* 0 1 0 0 -NVIDIA GeForce FX Go5600 .*NVIDIA .*GeForce FX Go56.* 0 1 1 2.1 -NVIDIA GeForce FX Go5700 .*NVIDIA .*GeForce FX Go57.* 1 1 1 1.5 -NVIDIA GeForce FX Go5800 .*NVIDIA .*GeForce FX Go58.* 1 1 0 0 -NVIDIA GeForce FX Go5900 .*NVIDIA .*GeForce FX Go59.* 1 1 0 0 -NVIDIA GeForce FX Go5xxx .*NVIDIA .*GeForce FX Go.* 0 1 0 0 -NVIDIA GeForce Go 6100 .*NVIDIA .*GeForce Go 61.* 0 1 1 2.1 +NVIDIA GeForce FX Go5300 .*NVIDIA .*GeForce FX Go53.* 0 1 0 0 +NVIDIA GeForce FX Go5500 .*NVIDIA .*GeForce FX Go55.* 0 1 0 0 +NVIDIA GeForce FX Go5600 .*NVIDIA .*GeForce FX Go56.* 0 1 1 2.1 +NVIDIA GeForce FX Go5700 .*NVIDIA .*GeForce FX Go57.* 1 1 1 1.5 +NVIDIA GeForce FX Go5800 .*NVIDIA .*GeForce FX Go58.* 1 1 0 0 +NVIDIA GeForce FX Go5900 .*NVIDIA .*GeForce FX Go59.* 1 1 0 0 +NVIDIA GeForce FX Go5xxx .*NVIDIA .*GeForce FX Go.* 0 1 0 0 +NVIDIA GeForce Go 6100 .*NVIDIA .*GeForce Go 61.* 0 1 1 2.1 NVIDIA GeForce Go 6200 .*NVIDIA .*GeForce Go 62.* 0 1 0 0 NVIDIA GeForce Go 6400 .*NVIDIA .*GeForce Go 64.* 1 1 1 2 -NVIDIA GeForce Go 6500 .*NVIDIA .*GeForce Go 65.* 1 1 0 0 -NVIDIA GeForce Go 6600 .*NVIDIA .*GeForce Go 66.* 0 1 1 2.1 -NVIDIA GeForce Go 6700 .*NVIDIA .*GeForce Go 67.* 1 1 0 0 -NVIDIA GeForce Go 6800 .*NVIDIA .*GeForce Go 68.* 0 1 1 2.1 +NVIDIA GeForce Go 6500 .*NVIDIA .*GeForce Go 65.* 1 1 0 0 +NVIDIA GeForce Go 6600 .*NVIDIA .*GeForce Go 66.* 0 1 1 2.1 +NVIDIA GeForce Go 6700 .*NVIDIA .*GeForce Go 67.* 1 1 0 0 +NVIDIA GeForce Go 6800 .*NVIDIA .*GeForce Go 68.* 0 1 1 2.1 NVIDIA GeForce Go 7200 .*NVIDIA .*GeForce Go 72.* 1 1 0 0 -NVIDIA GeForce Go 7300 LE .*NVIDIA .*GeForce Go 73.*LE.* 1 1 0 0 -NVIDIA GeForce Go 7300 .*NVIDIA .*GeForce Go 73.* 1 1 1 2.1 -NVIDIA GeForce Go 7400 .*NVIDIA .*GeForce Go 74.* 1 1 1 2.1 -NVIDIA GeForce Go 7600 .*NVIDIA .*GeForce Go 76.* 1 1 1 2.1 -NVIDIA GeForce Go 7700 .*NVIDIA .*GeForce Go 77.* 0 1 1 2.1 -NVIDIA GeForce Go 7800 .*NVIDIA .*GeForce Go 78.* 2 1 0 0 -NVIDIA GeForce Go 7900 .*NVIDIA .*GeForce Go 79.* 1 1 1 2.1 -NVIDIA D9M .*NVIDIA .*D9M.* 1 1 0 0 -NVIDIA G94 .*NVIDIA .*G94.* 3 1 0 0 -NVIDIA GeForce Go 6 .*GeForce Go 6.* 1 1 0 0 -NVIDIA ION 2 .*NVIDIA .*ION 2.* 2 1 0 0 -NVIDIA ION .*NVIDIA Corporation.*ION.* 2 1 1 3.3 -NVIDIA NB8M .*NVIDIA .*NB8M.* 1 1 0 0 -NVIDIA NB8P .*NVIDIA .*NB8P.* 2 1 0 0 -NVIDIA NB9E .*NVIDIA .*NB9E.* 3 1 0 0 -NVIDIA NB9M .*NVIDIA .*NB9M.* 1 1 0 0 -NVIDIA NB9P .*NVIDIA .*NB9P.* 2 1 0 0 +NVIDIA GeForce Go 7300 LE .*NVIDIA .*GeForce Go 73.*LE.* 1 1 0 0 +NVIDIA GeForce Go 7300 .*NVIDIA .*GeForce Go 73.* 1 1 1 2.1 +NVIDIA GeForce Go 7400 .*NVIDIA .*GeForce Go 74.* 1 1 1 2.1 +NVIDIA GeForce Go 7600 .*NVIDIA .*GeForce Go 76.* 1 1 1 2.1 +NVIDIA GeForce Go 7700 .*NVIDIA .*GeForce Go 77.* 0 1 1 2.1 +NVIDIA GeForce Go 7800 .*NVIDIA .*GeForce Go 78.* 2 1 0 0 +NVIDIA GeForce Go 7900 .*NVIDIA .*GeForce Go 79.* 1 1 1 2.1 +NVIDIA D9M .*NVIDIA .*D9M.* 1 1 0 0 +NVIDIA G94 .*NVIDIA .*G94.* 3 1 0 0 +NVIDIA GeForce Go 6 .*GeForce Go 6.* 1 1 0 0 +NVIDIA ION 2 .*NVIDIA .*ION 2.* 2 1 0 0 +NVIDIA ION .*NVIDIA Corporation.*ION.* 2 1 1 3.3 +NVIDIA NB8M .*NVIDIA .*NB8M.* 1 1 0 0 +NVIDIA NB8P .*NVIDIA .*NB8P.* 2 1 0 0 +NVIDIA NB9E .*NVIDIA .*NB9E.* 3 1 0 0 +NVIDIA NB9M .*NVIDIA .*NB9M.* 1 1 0 0 +NVIDIA NB9P .*NVIDIA .*NB9P.* 2 1 0 0 NVIDIA N10 .*NVIDIA .*N10.* 1 1 0 0 NVIDIA GeForce PCX .*GeForce PCX.* 0 1 0 0 NVIDIA Generic .*NVIDIA .*Unknown.* 0 0 0 3 -NVIDIA NV17 .*NVIDIA .*NV17.* 0 1 0 0 -NVIDIA NV34 .*NVIDIA .*NV34.* 0 1 0 0 -NVIDIA NV35 .*NVIDIA .*NV35.* 0 1 0 0 -NVIDIA NV36 .*NVIDIA .*NV36.* 1 1 0 0 -NVIDIA NV41 .*NVIDIA .*NV41.* 1 1 0 0 -NVIDIA NV43 .*NVIDIA .*NV43.* 1 1 0 0 -NVIDIA NV44 .*NVIDIA .*NV44.* 1 1 0 0 -NVIDIA nForce .*NVIDIA .*nForce.* 0 0 0 3.3 -NVIDIA MCP51 .*NVIDIA .*MCP51.* 1 1 0 0 +NVIDIA NV17 .*NVIDIA .*NV17.* 0 1 0 0 +NVIDIA NV34 .*NVIDIA .*NV34.* 0 1 0 0 +NVIDIA NV35 .*NVIDIA .*NV35.* 0 1 0 0 +NVIDIA NV36 .*NVIDIA .*NV36.* 1 1 0 0 +NVIDIA NV41 .*NVIDIA .*NV41.* 1 1 0 0 +NVIDIA NV43 .*NVIDIA .*NV43.* 1 1 0 0 +NVIDIA NV44 .*NVIDIA .*NV44.* 1 1 0 0 +NVIDIA nForce .*NVIDIA .*nForce.* 0 0 0 3.3 +NVIDIA MCP51 .*NVIDIA .*MCP51.* 1 1 0 0 NVIDIA MCP61 .*NVIDIA .*MCP61.* 1 1 0 0 -NVIDIA MCP67 .*NVIDIA .*MCP67.* 1 1 0 0 -NVIDIA MCP68 .*NVIDIA .*MCP68.* 1 1 0 0 -NVIDIA MCP73 .*NVIDIA .*MCP73.* 1 1 0 0 -NVIDIA MCP77 .*NVIDIA .*MCP77.* 1 1 0 0 -NVIDIA MCP78 .*NVIDIA .*MCP78.* 1 1 0 0 -NVIDIA MCP79 .*NVIDIA .*MCP79.* 1 1 0 0 -NVIDIA MCP7A .*NVIDIA .*MCP7A.* 1 1 0 0 +NVIDIA MCP67 .*NVIDIA .*MCP67.* 1 1 0 0 +NVIDIA MCP68 .*NVIDIA .*MCP68.* 1 1 0 0 +NVIDIA MCP73 .*NVIDIA .*MCP73.* 1 1 0 0 +NVIDIA MCP77 .*NVIDIA .*MCP77.* 1 1 0 0 +NVIDIA MCP78 .*NVIDIA .*MCP78.* 1 1 0 0 +NVIDIA MCP79 .*NVIDIA .*MCP79.* 1 1 0 0 +NVIDIA MCP7A .*NVIDIA .*MCP7A.* 1 1 0 0 NVIDIA Quadro2 .*Quadro2.* 0 1 0 0 NVIDIA Quadro 1000M .*Quadro.*1000M.* 2 1 0 4.2 NVIDIA Quadro 2000 M/D .*Quadro.*2000.* 3 1 0 4.2 @@ -555,12 +555,12 @@ NVIDIA Quadro 3000M .*Quadro.*3000M.* 3 1 0 0 NVIDIA Quadro 4000M .*Quadro.*4000M.* 3 1 0 0 NVIDIA Quadro 4000 .*Quadro *4000.* 3 1 0 4.2 NVIDIA Quadro 50x0 M .*Quadro.*50.0.* 3 1 0 0 -NVIDIA Quadro 6000 .*Quadro.*6000.* 3 1 0 0 -NVIDIA Quadro 400 .*Quadro.*400.* 2 1 0 3.3 +NVIDIA Quadro 6000 .*Quadro.* 6000.* 3 1 0 0 +NVIDIA Quadro 400 .*Quadro.* 400.* 2 1 0 3.3 NVIDIA Quadro 600 .*Quadro.*600.* 2 1 0 3.3 NVIDIA Quadro4 .*Quadro4.* 0 1 0 0 -NVIDIA Quadro DCC .*Quadro DCC.* 0 1 0 0 -NVIDIA Quadro CX .*Quadro.*CX.* 3 1 0 0 +NVIDIA Quadro DCC .*Quadro DCC.* 0 1 0 0 +NVIDIA Quadro CX .*Quadro.*CX.* 3 1 0 0 NVIDIA Quadro FX 770M .*Quadro.*FX *770M.* 2 1 0 0 NVIDIA Quadro FX 1500M .*Quadro.*FX *1500M.* 1 1 0 2.1 NVIDIA Quadro FX 1600M .*Quadro.*FX *1600M.* 2 1 0 0 @@ -574,7 +574,7 @@ NVIDIA Quadro FX 3800 .*Quadro.*FX *3800.* 3 1 0 3.2 NVIDIA Quadro FX 4500 .*Quadro.*FX *45.* 3 1 0 0 NVIDIA Quadro FX 880M .*Quadro.*FX *880M.* 3 1 0 3.3 NVIDIA Quadro FX 4800 .*NVIDIA .*Quadro *FX *4800.* 3 1 0 0 -NVIDIA Quadro FX .*Quadro FX.* 1 1 0 3.3 +NVIDIA Quadro FX .*Quadro FX.* 1 1 0 3.3 NVIDIA Quadro NVS 1xxM .*Quadro NVS *1.[05]M.* 0 1 1 3.3 NVIDIA Quadro NVS 300M .*NVIDIA .*NVS *300M.* 2 1 0 0 NVIDIA Quadro NVS 320M .*NVIDIA .*NVS *320M.* 2 1 0 0 @@ -583,16 +583,16 @@ NVIDIA Quadro NVS 3100M .*NVIDIA .*NVS *3100M.* 2 1 0 0 NVIDIA Quadro NVS 4200M .*NVIDIA .*NVS *4200M.* 2 1 0 4.1 NVIDIA Quadro NVS 5100M .*NVIDIA .*NVS *5100M.* 2 1 0 0 NVIDIA Quadro NVS .*NVIDIA .*NVS 0 1 0 3.2 -NVIDIA Corporation N12P .*NVIDIA .*N12P.* 1 1 1 4.1 +NVIDIA Corporation N12P .*NVIDIA .*N12P.* 1 1 1 4.1 NVIDIA Corporation N11M .*NVIDIA .*N11M.* 2 1 0 0 NVIDIA RIVA TNT .*RIVA TNT.* 0 0 0 0 -S3 .*S3 Graphics.* 0 0 1 1.4 -SiS SiS.* 0 0 1 1.5 -Trident Trident.* 0 0 0 0 -Tungsten Graphics Tungsten.* 0 0 0 0 -XGI XGI.* 0 0 0 0 -VIA VIA.* 0 0 0 0 -Apple Generic Apple.*Generic.* 0 0 0 0 -Apple Software Renderer Apple.*Software Renderer.* 0 0 0 0 -Humper Humper.* 0 1 1 2.1 -PowerVR SGX545 .*PowerVR SGX.* 1 1 1 3 +S3 .*S3 Graphics.* 0 0 1 1.4 +SiS SiS.* 0 0 1 1.5 +Trident Trident.* 0 0 0 0 +Tungsten Graphics Tungsten.* 0 0 0 0 +XGI XGI.* 0 0 0 0 +VIA VIA.* 0 0 0 0 +Apple Generic Apple.*Generic.* 0 0 0 0 +Apple Software Renderer Apple.*Software Renderer.* 0 0 0 0 +Humper Humper.* 0 1 1 2.1 +PowerVR SGX545 .*PowerVR SGX.* 1 1 1 3 diff --git a/indra/newview/linux_tools/wrapper.sh b/indra/newview/linux_tools/wrapper.sh index 1381e49c62..48b883e999 100755 --- a/indra/newview/linux_tools/wrapper.sh +++ b/indra/newview/linux_tools/wrapper.sh @@ -4,17 +4,17 @@ ## These options are for self-assisted troubleshooting during this beta ## testing phase; you should not usually need to touch them. +## - Avoids using any FMOD Ex audio driver. +#export LL_BAD_FMODEX_DRIVER=x ## - Avoids using any OpenAL audio driver. #export LL_BAD_OPENAL_DRIVER=x -## - Avoids using any FMOD audio driver. -#export LL_BAD_FMOD_DRIVER=x -## - Avoids using the FMOD ESD audio driver. -#export LL_BAD_FMOD_ESD=x -## - Avoids using the FMOD OSS audio driver. -#export LL_BAD_FMOD_OSS=x -## - Avoids using the FMOD ALSA audio driver. +## - Avoids using the FMOD Ex PulseAudio audio driver. +#export LL_BAD_FMOD_PULSEAUDIO=x +## - Avoids using the FMOD or FMOD Ex ALSA audio driver. #export LL_BAD_FMOD_ALSA=x +## - Avoids using the FMOD or FMOD Ex OSS audio driver. +#export LL_BAD_FMOD_OSS=x ## - Avoids the optional OpenGL extensions which have proven most problematic ## on some hardware. Disabling this option may cause BETTER PERFORMANCE but diff --git a/indra/newview/llagentwearables.cpp b/indra/newview/llagentwearables.cpp index c88694ef76..c88694ef76 100755..100644 --- a/indra/newview/llagentwearables.cpp +++ b/indra/newview/llagentwearables.cpp diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index 3adf956ae3..e0a4daf504 100644 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -1707,19 +1707,7 @@ bool LLAppViewer::cleanup() gAudiop->setStreamingAudioImpl(NULL); // shut down the audio subsystem - - bool want_longname = false; - if (gAudiop->getDriverName(want_longname) == "FMOD") - { - // This hack exists because fmod likes to occasionally - // crash or hang forever when shutting down, for no - // apparent reason. - llwarns << "Hack, skipping FMOD audio engine cleanup" << llendflush; - } - else - { gAudiop->shutdown(); - } delete gAudiop; gAudiop = NULL; @@ -1795,6 +1783,8 @@ bool LLAppViewer::cleanup() LLAvatarAppearance::cleanupClass(); + LLAvatarAppearance::cleanupClass(); + LLPostProcess::cleanupClass(); LLTracker::cleanupInstance(); @@ -3601,6 +3591,12 @@ void LLAppViewer::requestQuit() gAgentAvatarp->updateAvatarRezMetrics(true); // force a last packet to be sent. } + // Try to send last batch of avatar rez metrics. + if (!gDisconnected && isAgentAvatarValid()) + { + gAgentAvatarp->updateAvatarRezMetrics(true); // force a last packet to be sent. + } + LLHUDEffectSpiral *effectp = (LLHUDEffectSpiral*)LLHUDManager::getInstance()->createViewerEffect(LLHUDObject::LL_HUD_EFFECT_POINT, TRUE); effectp->setPositionGlobal(gAgent.getPositionGlobal()); effectp->setColor(LLColor4U(gAgent.getEffectColor())); diff --git a/indra/newview/lldrawable.cpp b/indra/newview/lldrawable.cpp index bb1d263670..8c9fd4152a 100644 --- a/indra/newview/lldrawable.cpp +++ b/indra/newview/lldrawable.cpp @@ -308,6 +308,49 @@ LLFace* LLDrawable::addFace(const LLTextureEntry *te, LLViewerTexture *texturep) } +LLFace* LLDrawable::addFace(const LLTextureEntry *te, LLViewerTexture *texturep, LLViewerTexture *normalp) +{ + LLFace *face; + face = new LLFace(this, mVObjp); + + face->setTEOffset(mFaces.size()); + face->setTexture(texturep); + face->setNormalMap(normalp); + face->setPoolType(gPipeline.getPoolTypeFromTE(te, texturep)); + + mFaces.push_back(face); + + if (isState(UNLIT)) + { + face->setState(LLFace::FULLBRIGHT); + } + + return face; + +} + +LLFace* LLDrawable::addFace(const LLTextureEntry *te, LLViewerTexture *texturep, LLViewerTexture *normalp, LLViewerTexture *specularp) +{ + LLFace *face; + face = new LLFace(this, mVObjp); + + face->setTEOffset(mFaces.size()); + face->setTexture(texturep); + face->setNormalMap(normalp); + face->setSpecularMap(specularp); + face->setPoolType(gPipeline.getPoolTypeFromTE(te, texturep)); + + mFaces.push_back(face); + + if (isState(UNLIT)) + { + face->setState(LLFace::FULLBRIGHT); + } + + return face; + +} + void LLDrawable::setNumFaces(const S32 newFaces, LLFacePool *poolp, LLViewerTexture *texturep) { if (newFaces == (S32)mFaces.size()) @@ -441,7 +484,7 @@ void LLDrawable::makeActive() } llassert(isAvatar() || isRoot() || mParent->isActive()); - } +} void LLDrawable::makeStatic(BOOL warning_enabled) diff --git a/indra/newview/lldrawable.h b/indra/newview/lldrawable.h index 4608d16fec..289abd3335 100644 --- a/indra/newview/lldrawable.h +++ b/indra/newview/lldrawable.h @@ -145,6 +145,8 @@ public: //void removeFace(const S32 i); // SJB: Avoid using this, it's slow LLFace* addFace(LLFacePool *poolp, LLViewerTexture *texturep); LLFace* addFace(const LLTextureEntry *te, LLViewerTexture *texturep); + LLFace* addFace(const LLTextureEntry *te, LLViewerTexture *texturep, LLViewerTexture *normalp); + LLFace* addFace(const LLTextureEntry *te, LLViewerTexture *texturep, LLViewerTexture *normalp, LLViewerTexture *specularp); void deleteFaces(S32 offset, S32 count); void setNumFaces(const S32 numFaces, LLFacePool *poolp, LLViewerTexture *texturep); void setNumFacesFast(const S32 numFaces, LLFacePool *poolp, LLViewerTexture *texturep); diff --git a/indra/newview/lldrawpool.cpp b/indra/newview/lldrawpool.cpp index 94dd927d26..fc5571aa58 100644 --- a/indra/newview/lldrawpool.cpp +++ b/indra/newview/lldrawpool.cpp @@ -35,6 +35,7 @@ #include "lldrawpoolalpha.h" #include "lldrawpoolavatar.h" #include "lldrawpoolbump.h" +#include "lldrawpoolmaterials.h" #include "lldrawpoolground.h" #include "lldrawpoolsimple.h" #include "lldrawpoolsky.h" @@ -98,6 +99,9 @@ LLDrawPool *LLDrawPool::createPool(const U32 type, LLViewerTexture *tex0) case POOL_BUMP: poolp = new LLDrawPoolBump(); break; + case POOL_MATERIALS: + poolp = new LLDrawPoolMaterials(); + break; case POOL_WL_SKY: poolp = new LLDrawPoolWLSky(); break; diff --git a/indra/newview/lldrawpool.h b/indra/newview/lldrawpool.h index ab9bb9e611..93656c34e4 100644 --- a/indra/newview/lldrawpool.h +++ b/indra/newview/lldrawpool.h @@ -50,6 +50,7 @@ public: POOL_GROUND, POOL_FULLBRIGHT, POOL_BUMP, + POOL_MATERIALS, POOL_TERRAIN, POOL_SKY, POOL_WL_SKY, @@ -133,6 +134,22 @@ public: PASS_SHINY, PASS_BUMP, PASS_POST_BUMP, + PASS_MATERIAL, + PASS_MATERIAL_ALPHA, + PASS_MATERIAL_ALPHA_MASK, + PASS_MATERIAL_ALPHA_EMISSIVE, + PASS_SPECMAP, + PASS_SPECMAP_BLEND, + PASS_SPECMAP_MASK, + PASS_SPECMAP_EMISSIVE, + PASS_NORMMAP, + PASS_NORMMAP_BLEND, + PASS_NORMMAP_MASK, + PASS_NORMMAP_EMISSIVE, + PASS_NORMSPEC, + PASS_NORMSPEC_BLEND, + PASS_NORMSPEC_MASK, + PASS_NORMSPEC_EMISSIVE, PASS_GLOW, PASS_ALPHA, PASS_ALPHA_MASK, diff --git a/indra/newview/lldrawpoolalpha.cpp b/indra/newview/lldrawpoolalpha.cpp index 313b310e1e..d5de5d30b0 100644 --- a/indra/newview/lldrawpoolalpha.cpp +++ b/indra/newview/lldrawpoolalpha.cpp @@ -91,12 +91,31 @@ void LLDrawPoolAlpha::renderDeferred(S32 pass) LLFastTimer t(FTM_RENDER_GRASS); gDeferredDiffuseAlphaMaskProgram.bind(); gDeferredDiffuseAlphaMaskProgram.setMinimumAlpha(0.33f); - - //render alpha masked objects - LLRenderPass::pushBatches(LLRenderPass::PASS_ALPHA_MASK, getVertexDataMask() | LLVertexBuffer::MAP_TEXTURE_INDEX, TRUE, TRUE); + pushMaskBatches(LLRenderPass::PASS_ALPHA_MASK, getVertexDataMask() | LLVertexBuffer::MAP_TEXTURE_INDEX, TRUE, TRUE); gDeferredDiffuseAlphaMaskProgram.unbind(); } +void LLDrawPoolAlpha::pushMaskBatches(U32 type, U32 mask, BOOL texture, BOOL batch_textures) +{ + for (LLCullResult::drawinfo_iterator i = gPipeline.beginRenderMap(type); i != gPipeline.endRenderMap(type); ++i) + { + LLDrawInfo* pparams = *i; + if (pparams) + { + if (LLGLSLShader::sCurBoundShaderPtr) + { + LLGLSLShader::sCurBoundShaderPtr->setMinimumAlpha(pparams->mAlphaMaskCutoff); + } + else + { + gGL.setAlphaRejectSettings(LLRender::CF_GREATER, pparams->mAlphaMaskCutoff); + } + + pushBatch(*pparams, mask, texture, batch_textures); + } + } +} + S32 LLDrawPoolAlpha::getNumPostDeferredPasses() { @@ -133,8 +152,7 @@ void LLDrawPoolAlpha::beginPostDeferredPass(S32 pass) gPipeline.mDeferredDepth.copyContents(gPipeline.mDeferredScreen, 0, 0, gPipeline.mDeferredScreen.getWidth(), gPipeline.mDeferredScreen.getHeight(), 0, 0, gPipeline.mDeferredDepth.getWidth(), gPipeline.mDeferredDepth.getHeight(), GL_DEPTH_BUFFER_BIT, GL_NEAREST); gPipeline.mDeferredDepth.bindTarget(); - simple_shader = NULL; - fullbright_shader = NULL; + simple_shader = fullbright_shader = &gObjectFullbrightAlphaMaskProgram; gObjectFullbrightAlphaMaskProgram.bind(); gObjectFullbrightAlphaMaskProgram.setMinimumAlpha(0.33f); } @@ -150,7 +168,6 @@ void LLDrawPoolAlpha::beginPostDeferredPass(S32 pass) void LLDrawPoolAlpha::endPostDeferredPass(S32 pass) { - if (pass == 1) { gPipeline.mDeferredDepth.flush(); @@ -234,23 +251,33 @@ void LLDrawPoolAlpha::render(S32 pass) simple_shader->bind(); simple_shader->setMinimumAlpha(0.33f); - pushBatches(LLRenderPass::PASS_ALPHA_MASK, getVertexDataMask() | LLVertexBuffer::MAP_TEXTURE_INDEX, TRUE, TRUE); + pushMaskBatches(LLRenderPass::PASS_ALPHA_MASK, getVertexDataMask() | LLVertexBuffer::MAP_TEXTURE_INDEX, TRUE, TRUE); + pushMaskBatches(LLRenderPass::PASS_MATERIAL_ALPHA_MASK, getVertexDataMask() | LLVertexBuffer::MAP_TEXTURE_INDEX, TRUE, TRUE); + pushMaskBatches(LLRenderPass::PASS_SPECMAP_MASK, getVertexDataMask() | LLVertexBuffer::MAP_TEXTURE_INDEX, TRUE, TRUE); + pushMaskBatches(LLRenderPass::PASS_NORMMAP_MASK, getVertexDataMask() | LLVertexBuffer::MAP_TEXTURE_INDEX, TRUE, TRUE); + pushMaskBatches(LLRenderPass::PASS_NORMSPEC_MASK, getVertexDataMask() | LLVertexBuffer::MAP_TEXTURE_INDEX, TRUE, TRUE); } if (fullbright_shader) { fullbright_shader->bind(); fullbright_shader->setMinimumAlpha(0.33f); + if (LLPipeline::sRenderingHUDs || !LLPipeline::sRenderDeferred) + { + fullbright_shader->uniform1f(LLShaderMgr::TEXTURE_GAMMA, 1.0f); + } else { + fullbright_shader->uniform1f(LLShaderMgr::TEXTURE_GAMMA, 2.2f); + } } - pushBatches(LLRenderPass::PASS_FULLBRIGHT_ALPHA_MASK, getVertexDataMask() | LLVertexBuffer::MAP_TEXTURE_INDEX, TRUE, TRUE); + pushMaskBatches(LLRenderPass::PASS_FULLBRIGHT_ALPHA_MASK, getVertexDataMask() | LLVertexBuffer::MAP_TEXTURE_INDEX, TRUE, TRUE); //LLGLSLShader::bindNoShader(); } else { gGL.setAlphaRejectSettings(LLRender::CF_GREATER, 0.33f); //OK gPipeline.enableLightsFullbright(LLColor4(1,1,1,1)); - pushBatches(LLRenderPass::PASS_FULLBRIGHT_ALPHA_MASK, getVertexDataMask()); + pushMaskBatches(LLRenderPass::PASS_FULLBRIGHT_ALPHA_MASK, getVertexDataMask(), TRUE, FALSE); gPipeline.enableLightsDynamic(); - pushBatches(LLRenderPass::PASS_ALPHA_MASK, getVertexDataMask()); + pushMaskBatches(LLRenderPass::PASS_ALPHA_MASK, getVertexDataMask(), TRUE, FALSE); gGL.setAlphaRejectSettings(LLRender::CF_DEFAULT); //OK } } @@ -302,7 +329,7 @@ void LLDrawPoolAlpha::render(S32 pass) if (mVertexShaderLevel > 0) { - renderAlpha(getVertexDataMask() | LLVertexBuffer::MAP_TEXTURE_INDEX); + renderAlpha(getVertexDataMask() | LLVertexBuffer::MAP_TEXTURE_INDEX | LLVertexBuffer::MAP_BINORMAL | LLVertexBuffer::MAP_TEXCOORD1 | LLVertexBuffer::MAP_TEXCOORD2); } else { @@ -412,8 +439,14 @@ void LLDrawPoolAlpha::renderAlpha(U32 mask) } LLRenderPass::applyModelMatrix(params); - + LLMaterial* mat = NULL; + + if (deferred_render && !LLPipeline::sUnderWaterRender) + { + mat = params.mMaterial; + } + if (params.mFullbright) { // Turn off lighting if it hasn't already been so. @@ -446,11 +479,30 @@ void LLDrawPoolAlpha::renderAlpha(U32 mask) light_enabled = TRUE; } - // If we need shaders, and we're not ALREADY using the proper shader, then bind it - // (this way we won't rebind shaders unnecessarily). - if(use_shaders && (current_shader != target_shader)) + if (!params.mFullbright && deferred_render && mat) + { + U32 mask = params.mShaderMask; + + llassert(mask < LLMaterial::SHADER_COUNT); + target_shader = &(gDeferredMaterialProgram[mask]); + + if (current_shader != target_shader) + { + gPipeline.bindDeferredShader(*target_shader); + } + } + else if (!params.mFullbright) { - llassert(target_shader != NULL); + target_shader = simple_shader; + } + else + { + target_shader = fullbright_shader; + } + + if(use_shaders && (current_shader != target_shader)) + {// If we need shaders, and we're not ALREADY using the proper shader, then bind it + // (this way we won't rebind shaders unnecessarily). current_shader = target_shader; current_shader->bind(); } @@ -459,6 +511,44 @@ void LLDrawPoolAlpha::renderAlpha(U32 mask) LLGLSLShader::bindNoShader(); current_shader = NULL; } + + if (use_shaders && mat && !params.mFullbright) + { + // I apologize in advance for not giving this its own shader. + // We have a material. Supply the appropriate data here. + if (LLPipeline::sRenderDeferred) + { + current_shader->uniform4f(LLShaderMgr::SPECULAR_COLOR, params.mSpecColor.mV[0], params.mSpecColor.mV[1], params.mSpecColor.mV[2], params.mSpecColor.mV[3]); + current_shader->uniform1f(LLShaderMgr::ENVIRONMENT_INTENSITY, params.mEnvIntensity); + + if (params.mNormalMap) + { + params.mNormalMap->addTextureStats(params.mVSize); + current_shader->bindTexture(LLShaderMgr::BUMP_MAP, params.mNormalMap); + } else { + LLViewerFetchedTexture::sFlatNormalImagep->addTextureStats(params.mVSize); + current_shader->bindTexture(LLShaderMgr::BUMP_MAP, LLViewerFetchedTexture::sFlatNormalImagep); + } + + if (params.mSpecularMap) + { + params.mSpecularMap->addTextureStats(params.mVSize); + current_shader->bindTexture(LLShaderMgr::SPECULAR_MAP, params.mSpecularMap); + } else { + LLViewerFetchedTexture::sWhiteImagep->addTextureStats(params.mVSize); + current_shader->bindTexture(LLShaderMgr::SPECULAR_MAP, LLViewerFetchedTexture::sWhiteImagep); + } + } + + } else if (LLPipeline::sRenderDeferred && current_shader && (current_shader == simple_shader)) + { + current_shader->uniform4f(LLShaderMgr::SPECULAR_COLOR, 1.0f, 1.0f, 1.0f, 1.0f); + current_shader->uniform1f(LLShaderMgr::ENVIRONMENT_INTENSITY, 0.0f); + LLViewerFetchedTexture::sFlatNormalImagep->addTextureStats(params.mVSize); + current_shader->bindTexture(LLShaderMgr::BUMP_MAP, LLViewerFetchedTexture::sFlatNormalImagep); + LLViewerFetchedTexture::sWhiteImagep->addTextureStats(params.mVSize); + current_shader->bindTexture(LLShaderMgr::SPECULAR_MAP, LLViewerFetchedTexture::sWhiteImagep); + } if (params.mGroup) { @@ -477,12 +567,20 @@ void LLDrawPoolAlpha::renderAlpha(U32 mask) } } } - else + else { //not batching textures or batch has only 1 texture -- might need a texture matrix if (params.mTexture.notNull()) { params.mTexture->addTextureStats(params.mVSize); - gGL.getTexUnit(0)->bind(params.mTexture, TRUE) ; + if (use_shaders && mat) + { + current_shader->bindTexture(LLShaderMgr::DIFFUSE_MAP, params.mTexture); + } + else + { + gGL.getTexUnit(0)->bind(params.mTexture, TRUE); + } + if (params.mTextureMatrix) { tex_setup = true; diff --git a/indra/newview/lldrawpoolalpha.h b/indra/newview/lldrawpoolalpha.h index a4245e561d..46c17f3b99 100644 --- a/indra/newview/lldrawpoolalpha.h +++ b/indra/newview/lldrawpoolalpha.h @@ -70,6 +70,8 @@ public: void renderGroupAlpha(LLSpatialGroup* group, U32 type, U32 mask, BOOL texture = TRUE); void renderAlpha(U32 mask); void renderAlphaHighlight(U32 mask); + void pushMaskBatches(U32 type, U32 mask, BOOL texture, BOOL batch_textures); + static BOOL sShowDebugAlpha; diff --git a/indra/newview/lldrawpoolavatar.cpp b/indra/newview/lldrawpoolavatar.cpp index 294cecc703..69f10cd4df 100644 --- a/indra/newview/lldrawpoolavatar.cpp +++ b/indra/newview/lldrawpoolavatar.cpp @@ -183,6 +183,9 @@ void LLDrawPoolAvatar::beginDeferredPass(S32 pass) case 4: beginDeferredRiggedBump(); break; + default: + beginDeferredRiggedMaterial(pass-5); + break; } } @@ -215,6 +218,9 @@ void LLDrawPoolAvatar::endDeferredPass(S32 pass) case 4: endDeferredRiggedBump(); break; + default: + endDeferredRiggedMaterial(pass-5); + break; } } @@ -225,7 +231,7 @@ void LLDrawPoolAvatar::renderDeferred(S32 pass) S32 LLDrawPoolAvatar::getNumPostDeferredPasses() { - return 6; + return 10; } void LLDrawPoolAvatar::beginPostDeferredPass(S32 pass) @@ -247,9 +253,12 @@ void LLDrawPoolAvatar::beginPostDeferredPass(S32 pass) case 4: beginRiggedFullbrightAlpha(); break; - case 5: + case 9: beginRiggedGlow(); break; + default: + beginDeferredRiggedMaterialAlpha(pass-5); + break; } } @@ -275,11 +284,34 @@ void LLDrawPoolAvatar::beginDeferredRiggedAlpha() gPipeline.enableLightsDynamic(); } +void LLDrawPoolAvatar::beginDeferredRiggedMaterialAlpha(S32 pass) +{ + switch (pass) + { + case 0: pass = 1; break; + case 1: pass = 5; break; + case 2: pass = 9; break; + default: pass = 13; break; + } + + pass += LLMaterial::SHADER_COUNT; + + sVertexProgram = &gDeferredMaterialProgram[pass]; + + gPipeline.bindDeferredShader(*sVertexProgram); + sDiffuseChannel = sVertexProgram->enableTexture(LLViewerShaderMgr::DIFFUSE_MAP); + normal_channel = sVertexProgram->enableTexture(LLViewerShaderMgr::BUMP_MAP); + specular_channel = sVertexProgram->enableTexture(LLViewerShaderMgr::SPECULAR_MAP); + gPipeline.enableLightsDynamic(); +} + void LLDrawPoolAvatar::endDeferredRiggedAlpha() { LLVertexBuffer::unbind(); gPipeline.unbindDeferredShader(*sVertexProgram); sDiffuseChannel = 0; + normal_channel = -1; + specular_channel = -1; sVertexProgram = NULL; } @@ -305,6 +337,9 @@ void LLDrawPoolAvatar::endPostDeferredPass(S32 pass) case 5: endRiggedGlow(); break; + default: + endDeferredRiggedAlpha(); + break; } } @@ -328,17 +363,21 @@ void LLDrawPoolAvatar::renderPostDeferred(S32 pass) 6, //rigged fullbright shiny 7, //rigged alpha 8, //rigged fullbright alpha - 9, //rigged glow + 9, //rigged material alpha 1 + 10,//rigged material alpha 2 + 11,//rigged material alpha 3 + 12,//rigged material alpha 4 + 13, //rigged glow }; - pass = actual_pass[pass]; + S32 p = actual_pass[pass]; if (LLPipeline::sImpostorRender) { //HACK for impostors so actual pass ends up being proper pass - pass -= 2; + p -= 2; } - render(pass); + render(p); } @@ -425,12 +464,10 @@ void LLDrawPoolAvatar::renderShadow(S32 pass) } else { - renderRigged(avatarp, RIGGED_SIMPLE); - renderRigged(avatarp, RIGGED_ALPHA); - renderRigged(avatarp, RIGGED_FULLBRIGHT); - renderRigged(avatarp, RIGGED_FULLBRIGHT_SHINY); - renderRigged(avatarp, RIGGED_SHINY); - renderRigged(avatarp, RIGGED_FULLBRIGHT_ALPHA); + for (U32 i = 0; i < NUM_RIGGED_PASSES; ++i) + { + renderRigged(avatarp, i); + } } } @@ -455,7 +492,7 @@ S32 LLDrawPoolAvatar::getNumDeferredPasses() } else { - return 5; + return 21; } } @@ -1010,6 +1047,42 @@ void LLDrawPoolAvatar::endDeferredRiggedBump() sVertexProgram = NULL; } +void LLDrawPoolAvatar::beginDeferredRiggedMaterial(S32 pass) +{ + if (pass == 1 || + pass == 5 || + pass == 9 || + pass == 13) + { //skip alpha passes + return; + } + sVertexProgram = &gDeferredMaterialProgram[pass+LLMaterial::SHADER_COUNT]; + sVertexProgram->bind(); + normal_channel = sVertexProgram->enableTexture(LLViewerShaderMgr::BUMP_MAP); + specular_channel = sVertexProgram->enableTexture(LLViewerShaderMgr::SPECULAR_MAP); + sDiffuseChannel = sVertexProgram->enableTexture(LLViewerShaderMgr::DIFFUSE_MAP); +} + +void LLDrawPoolAvatar::endDeferredRiggedMaterial(S32 pass) +{ + if (pass == 1 || + pass == 5 || + pass == 9 || + pass == 13) + { + return; + } + + LLVertexBuffer::unbind(); + sVertexProgram->disableTexture(LLViewerShaderMgr::BUMP_MAP); + sVertexProgram->disableTexture(LLViewerShaderMgr::SPECULAR_MAP); + sVertexProgram->disableTexture(LLViewerShaderMgr::DIFFUSE_MAP); + sVertexProgram->unbind(); + normal_channel = -1; + sDiffuseChannel = 0; + sVertexProgram = NULL; +} + void LLDrawPoolAvatar::beginDeferredSkinned() { sShaderLevel = mVertexShaderLevel; @@ -1185,6 +1258,23 @@ void LLDrawPoolAvatar::renderAvatars(LLVOAvatar* single_avatar, S32 pass) return; } + if (is_deferred_render && pass >= 5 && pass <= 21) + { + S32 p = pass-5; + + if (p != 1 && + p != 5 && + p != 9 && + p != 13) + { + renderDeferredRiggedMaterial(avatarp, p); + } + return; + } + + + + if (pass == 5) { renderRiggedShinySimple(avatarp); @@ -1197,7 +1287,7 @@ void LLDrawPoolAvatar::renderAvatars(LLVOAvatar* single_avatar, S32 pass) return; } - if (pass >= 7 && pass < 9) + if (pass >= 7 && pass < 13) { if (pass == 7) { @@ -1210,9 +1300,32 @@ void LLDrawPoolAvatar::renderAvatars(LLVOAvatar* single_avatar, S32 pass) renderRiggedFullbrightAlpha(avatarp); return; } + + if (LLPipeline::sRenderDeferred) + { + S32 p = 0; + switch (pass) + { + case 9: p = 1; break; + case 10: p = 5; break; + case 11: p = 9; break; + case 12: p = 13; break; + } + + { + LLGLEnable blend(GL_BLEND); + renderDeferredRiggedMaterial(avatarp, p); + } + return; + } + else if (pass == 9) + { + renderRiggedGlow(avatarp); + return; + } } - if (pass == 9) + if (pass == 13) { renderRiggedGlow(avatarp); @@ -1510,10 +1623,41 @@ void LLDrawPoolAvatar::renderRigged(LLVOAvatar* avatar, U32 type, bool glow) gGL.diffuseColor4f(0,0,0,face->getTextureEntry()->getGlow()); }*/ - gGL.getTexUnit(sDiffuseChannel)->bind(face->getTexture()); - if (normal_channel > -1) + LLMaterial* mat = face->getTextureEntry()->getMaterialParams().get(); + + if (mat) + { + gGL.getTexUnit(sDiffuseChannel)->bind(face->getTexture(LLRender::DIFFUSE_MAP)); + gGL.getTexUnit(normal_channel)->bind(face->getTexture(LLRender::NORMAL_MAP)); + gGL.getTexUnit(specular_channel)->bind(face->getTexture(LLRender::SPECULAR_MAP)); + + LLColor4U col = mat->getSpecularLightColor(); + U8 spec = mat->getSpecularLightExponent(); + + U8 env = mat->getEnvironmentIntensity(); + + sVertexProgram->uniform4f(LLShaderMgr::SPECULAR_COLOR, col.mV[0]/255.f, col.mV[1]/255.f, col.mV[2]/255.f, spec/255.f); + + sVertexProgram->uniform1f(LLShaderMgr::ENVIRONMENT_INTENSITY, env/255.f); + + sVertexProgram->setMinimumAlpha(mat->getAlphaMaskCutoff()/255.f); + + for (U32 i = 0; i < LLRender::NUM_TEXTURE_CHANNELS; ++i) + { + LLViewerTexture* tex = face->getTexture(i); + if (tex) + { + tex->addTextureStats(avatar->getPixelArea()); + } + } + } + else { - LLDrawPoolBump::bindBumpMap(face, normal_channel); + gGL.getTexUnit(sDiffuseChannel)->bind(face->getTexture()); + if (normal_channel > -1) + { + LLDrawPoolBump::bindBumpMap(face, normal_channel); + } } if (face->mTextureMatrix) @@ -1545,6 +1689,11 @@ void LLDrawPoolAvatar::renderDeferredRiggedBump(LLVOAvatar* avatar) renderRigged(avatar, RIGGED_DEFERRED_BUMP); } +void LLDrawPoolAvatar::renderDeferredRiggedMaterial(LLVOAvatar* avatar, S32 pass) +{ + renderRigged(avatar, pass); +} + static LLFastTimer::DeclareTimer FTM_RIGGED_VBO("Rigged VBO"); void LLDrawPoolAvatar::updateRiggedVertexBuffers(LLVOAvatar* avatar) diff --git a/indra/newview/lldrawpoolavatar.h b/indra/newview/lldrawpoolavatar.h index 69e3068858..bb9126c162 100644 --- a/indra/newview/lldrawpoolavatar.h +++ b/indra/newview/lldrawpoolavatar.h @@ -75,7 +75,7 @@ public: /*virtual*/ void beginDeferredPass(S32 pass); /*virtual*/ void endDeferredPass(S32 pass); /*virtual*/ void renderDeferred(S32 pass); - + /*virtual*/ S32 getNumPostDeferredPasses(); /*virtual*/ void beginPostDeferredPass(S32 pass); /*virtual*/ void endPostDeferredPass(S32 pass); @@ -113,6 +113,8 @@ public: void beginRiggedFullbrightAlpha(); void beginRiggedGlow(); void beginDeferredRiggedAlpha(); + void beginDeferredRiggedMaterial(S32 pass); + void beginDeferredRiggedMaterialAlpha(S32 pass); void endRiggedSimple(); void endRiggedFullbright(); @@ -122,6 +124,8 @@ public: void endRiggedFullbrightAlpha(); void endRiggedGlow(); void endDeferredRiggedAlpha(); + void endDeferredRiggedMaterial(S32 pass); + void endDeferredRiggedMaterialAlpha(S32 pass); void beginDeferredRiggedSimple(); void beginDeferredRiggedBump(); @@ -146,10 +150,27 @@ public: void renderRiggedGlow(LLVOAvatar* avatar); void renderDeferredRiggedSimple(LLVOAvatar* avatar); void renderDeferredRiggedBump(LLVOAvatar* avatar); - + void renderDeferredRiggedMaterial(LLVOAvatar* avatar, S32 pass); + typedef enum { - RIGGED_SIMPLE = 0, + RIGGED_MATERIAL=0, + RIGGED_MATERIAL_ALPHA, + RIGGED_MATERIAL_ALPHA_MASK, + RIGGED_MATERIAL_ALPHA_EMISSIVE, + RIGGED_SPECMAP, + RIGGED_SPECMAP_BLEND, + RIGGED_SPECMAP_MASK, + RIGGED_SPECMAP_EMISSIVE, + RIGGED_NORMMAP, + RIGGED_NORMMAP_BLEND, + RIGGED_NORMMAP_MASK, + RIGGED_NORMMAP_EMISSIVE, + RIGGED_NORMSPEC, + RIGGED_NORMSPEC_BLEND, + RIGGED_NORMSPEC_MASK, + RIGGED_NORMSPEC_EMISSIVE, + RIGGED_SIMPLE, RIGGED_FULLBRIGHT, RIGGED_SHINY, RIGGED_FULLBRIGHT_SHINY, @@ -164,6 +185,48 @@ public: typedef enum { + RIGGED_MATERIAL_MASK = + LLVertexBuffer::MAP_VERTEX | + LLVertexBuffer::MAP_NORMAL | + LLVertexBuffer::MAP_TEXCOORD0 | + LLVertexBuffer::MAP_COLOR | + LLVertexBuffer::MAP_WEIGHT4, + RIGGED_MATERIAL_ALPHA_VMASK = RIGGED_MATERIAL_MASK, + RIGGED_MATERIAL_ALPHA_MASK_MASK = RIGGED_MATERIAL_MASK, + RIGGED_MATERIAL_ALPHA_EMISSIVE_MASK = RIGGED_MATERIAL_MASK, + RIGGED_SPECMAP_VMASK = + LLVertexBuffer::MAP_VERTEX | + LLVertexBuffer::MAP_NORMAL | + LLVertexBuffer::MAP_TEXCOORD0 | + LLVertexBuffer::MAP_TEXCOORD2 | + LLVertexBuffer::MAP_COLOR | + LLVertexBuffer::MAP_WEIGHT4, + RIGGED_SPECMAP_BLEND_MASK = RIGGED_SPECMAP_VMASK, + RIGGED_SPECMAP_MASK_MASK = RIGGED_SPECMAP_VMASK, + RIGGED_SPECMAP_EMISSIVE_MASK = RIGGED_SPECMAP_VMASK, + RIGGED_NORMMAP_VMASK = + LLVertexBuffer::MAP_VERTEX | + LLVertexBuffer::MAP_NORMAL | + LLVertexBuffer::MAP_BINORMAL | + LLVertexBuffer::MAP_TEXCOORD0 | + LLVertexBuffer::MAP_TEXCOORD1 | + LLVertexBuffer::MAP_COLOR | + LLVertexBuffer::MAP_WEIGHT4, + RIGGED_NORMMAP_BLEND_MASK = RIGGED_NORMMAP_VMASK, + RIGGED_NORMMAP_MASK_MASK = RIGGED_NORMMAP_VMASK, + RIGGED_NORMMAP_EMISSIVE_MASK = RIGGED_NORMMAP_VMASK, + RIGGED_NORMSPEC_VMASK = + LLVertexBuffer::MAP_VERTEX | + LLVertexBuffer::MAP_NORMAL | + LLVertexBuffer::MAP_BINORMAL | + LLVertexBuffer::MAP_TEXCOORD0 | + LLVertexBuffer::MAP_TEXCOORD1 | + LLVertexBuffer::MAP_TEXCOORD2 | + LLVertexBuffer::MAP_COLOR | + LLVertexBuffer::MAP_WEIGHT4, + RIGGED_NORMSPEC_BLEND_MASK = RIGGED_NORMSPEC_VMASK, + RIGGED_NORMSPEC_MASK_MASK = RIGGED_NORMSPEC_VMASK, + RIGGED_NORMSPEC_EMISSIVE_MASK = RIGGED_NORMSPEC_VMASK, RIGGED_SIMPLE_MASK = LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_NORMAL | LLVertexBuffer::MAP_TEXCOORD0 | diff --git a/indra/newview/lldrawpoolbump.cpp b/indra/newview/lldrawpoolbump.cpp index e8d43c8631..cb40cf2039 100644 --- a/indra/newview/lldrawpoolbump.cpp +++ b/indra/newview/lldrawpoolbump.cpp @@ -449,9 +449,6 @@ void LLDrawPoolBump::unbindCubeMap(LLGLSLShader* shader, S32 shader_level, S32& LLCubeMap* cube_map = gSky.mVOSkyp ? gSky.mVOSkyp->getCubeMap() : NULL; if( cube_map ) { - cube_map->disable(); - cube_map->restoreMatrix(); - if (!invisible && shader_level > 1) { shader->disableTexture(LLViewerShaderMgr::ENVIRONMENT_MAP, LLTexUnit::TT_CUBE_MAP); @@ -464,6 +461,8 @@ void LLDrawPoolBump::unbindCubeMap(LLGLSLShader* shader, S32 shader_level, S32& } } } + cube_map->disable(); + cube_map->restoreMatrix(); } if (!LLGLSLShader::sNoFixedFunction) diff --git a/indra/newview/lldrawpoolmaterials.cpp b/indra/newview/lldrawpoolmaterials.cpp new file mode 100644 index 0000000000..3e0f9c9d4d --- /dev/null +++ b/indra/newview/lldrawpoolmaterials.cpp @@ -0,0 +1,216 @@ +/** + * @file lldrawpool.cpp + * @brief LLDrawPoolMaterials class implementation + * @author Jonathan "Geenz" Goodman + * + * $LicenseInfo:firstyear=2002&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2013, Linden Research, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * 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 "lldrawpoolmaterials.h" +#include "llviewershadermgr.h" +#include "pipeline.h" + +S32 diffuse_channel = -1; + +LLDrawPoolMaterials::LLDrawPoolMaterials() +: LLRenderPass(LLDrawPool::POOL_MATERIALS) +{ + +} + +void LLDrawPoolMaterials::prerender() +{ + mVertexShaderLevel = LLViewerShaderMgr::instance()->getVertexShaderLevel(LLViewerShaderMgr::SHADER_OBJECT); +} + +S32 LLDrawPoolMaterials::getNumDeferredPasses() +{ + return 12; +} + +void LLDrawPoolMaterials::beginDeferredPass(S32 pass) +{ + U32 shader_idx[] = + { + 0, //LLRenderPass::PASS_MATERIAL, + //1, //LLRenderPass::PASS_MATERIAL_ALPHA, + 2, //LLRenderPass::PASS_MATERIAL_ALPHA_MASK, + 3, //LLRenderPass::PASS_MATERIAL_ALPHA_GLOW, + 4, //LLRenderPass::PASS_SPECMAP, + //5, //LLRenderPass::PASS_SPECMAP_BLEND, + 6, //LLRenderPass::PASS_SPECMAP_MASK, + 7, //LLRenderPass::PASS_SPECMAP_GLOW, + 8, //LLRenderPass::PASS_NORMMAP, + //9, //LLRenderPass::PASS_NORMMAP_BLEND, + 10, //LLRenderPass::PASS_NORMMAP_MASK, + 11, //LLRenderPass::PASS_NORMMAP_GLOW, + 12, //LLRenderPass::PASS_NORMSPEC, + //13, //LLRenderPass::PASS_NORMSPEC_BLEND, + 14, //LLRenderPass::PASS_NORMSPEC_MASK, + 15, //LLRenderPass::PASS_NORMSPEC_GLOW, + }; + + mShader = &(gDeferredMaterialProgram[shader_idx[pass]]); + mShader->bind(); + + diffuse_channel = mShader->enableTexture(LLShaderMgr::DIFFUSE_MAP); + + LLFastTimer t(FTM_RENDER_MATERIALS); +} + +void LLDrawPoolMaterials::endDeferredPass(S32 pass) +{ + LLFastTimer t(FTM_RENDER_MATERIALS); + + mShader->unbind(); + + LLRenderPass::endRenderPass(pass); +} + +void LLDrawPoolMaterials::renderDeferred(S32 pass) +{ + U32 type_list[] = + { + LLRenderPass::PASS_MATERIAL, + //LLRenderPass::PASS_MATERIAL_ALPHA, + LLRenderPass::PASS_MATERIAL_ALPHA_MASK, + LLRenderPass::PASS_MATERIAL_ALPHA_EMISSIVE, + LLRenderPass::PASS_SPECMAP, + //LLRenderPass::PASS_SPECMAP_BLEND, + LLRenderPass::PASS_SPECMAP_MASK, + LLRenderPass::PASS_SPECMAP_EMISSIVE, + LLRenderPass::PASS_NORMMAP, + //LLRenderPass::PASS_NORMMAP_BLEND, + LLRenderPass::PASS_NORMMAP_MASK, + LLRenderPass::PASS_NORMMAP_EMISSIVE, + LLRenderPass::PASS_NORMSPEC, + //LLRenderPass::PASS_NORMSPEC_BLEND, + LLRenderPass::PASS_NORMSPEC_MASK, + LLRenderPass::PASS_NORMSPEC_EMISSIVE, + }; + + llassert(pass < sizeof(type_list)/sizeof(U32)); + + U32 type = type_list[pass]; + + U32 mask = mShader->mAttributeMask; + + LLCullResult::drawinfo_iterator begin = gPipeline.beginRenderMap(type); + LLCullResult::drawinfo_iterator end = gPipeline.endRenderMap(type); + + for (LLCullResult::drawinfo_iterator i = begin; i != end; ++i) + { + LLDrawInfo& params = **i; + + mShader->uniform4f(LLShaderMgr::SPECULAR_COLOR, params.mSpecColor.mV[0], params.mSpecColor.mV[1], params.mSpecColor.mV[2], params.mSpecColor.mV[3]); + mShader->uniform1f(LLShaderMgr::ENVIRONMENT_INTENSITY, params.mEnvIntensity); + + if (params.mNormalMap) + { + params.mNormalMap->addTextureStats(params.mVSize); + bindNormalMap(params.mNormalMap); + } + + if (params.mSpecularMap) + { + params.mSpecularMap->addTextureStats(params.mVSize); + bindSpecularMap(params.mSpecularMap); + } + + mShader->setMinimumAlpha(params.mAlphaMaskCutoff); + + pushBatch(params, mask, TRUE); + } +} + +void LLDrawPoolMaterials::bindSpecularMap(LLViewerTexture* tex) +{ + mShader->bindTexture(LLShaderMgr::SPECULAR_MAP, tex); +} + +void LLDrawPoolMaterials::bindNormalMap(LLViewerTexture* tex) +{ + mShader->bindTexture(LLShaderMgr::BUMP_MAP, tex); +} + +void LLDrawPoolMaterials::pushBatch(LLDrawInfo& params, U32 mask, BOOL texture, BOOL batch_textures) +{ + applyModelMatrix(params); + + bool tex_setup = false; + + if (batch_textures && params.mTextureList.size() > 1) + { + for (U32 i = 0; i < params.mTextureList.size(); ++i) + { + if (params.mTextureList[i].notNull()) + { + gGL.getTexUnit(i)->bind(params.mTextureList[i], TRUE); + } + } + } + else + { //not batching textures or batch has only 1 texture -- might need a texture matrix + if (params.mTextureMatrix) + { + //if (mShiny) + { + gGL.getTexUnit(0)->activate(); + gGL.matrixMode(LLRender::MM_TEXTURE); + } + + gGL.loadMatrix((GLfloat*) params.mTextureMatrix->mMatrix); + gPipeline.mTextureMatrixOps++; + + tex_setup = true; + } + + if (mVertexShaderLevel > 1 && texture) + { + if (params.mTexture.notNull()) + { + gGL.getTexUnit(diffuse_channel)->bind(params.mTexture); + params.mTexture->addTextureStats(params.mVSize); + } + else + { + gGL.getTexUnit(diffuse_channel)->unbind(LLTexUnit::TT_TEXTURE); + } + } + } + + if (params.mGroup) + { + params.mGroup->rebuildMesh(); + } + params.mVertexBuffer->setBuffer(mask); + params.mVertexBuffer->drawRange(params.mDrawMode, params.mStart, params.mEnd, params.mCount, params.mOffset); + gPipeline.addTrianglesDrawn(params.mCount, params.mDrawMode); + if (tex_setup) + { + gGL.getTexUnit(0)->activate(); + gGL.loadIdentity(); + gGL.matrixMode(LLRender::MM_MODELVIEW); + } +} diff --git a/indra/newview/lldrawpoolmaterials.h b/indra/newview/lldrawpoolmaterials.h new file mode 100644 index 0000000000..cfbd13f335 --- /dev/null +++ b/indra/newview/lldrawpoolmaterials.h @@ -0,0 +1,75 @@ +/** + * @file lldrawpoolmaterials.h + * @brief LLDrawPoolMaterials class definition + * @author Jonathan "Geenz" Goodman + * + * $LicenseInfo:firstyear=2002&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2013, Linden Research, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * 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_LLDRAWPOOLMATERIALS_H +#define LL_LLDRAWPOOLMATERIALS_H + +#include "v4coloru.h" +#include "v2math.h" +#include "v3math.h" +#include "llvertexbuffer.h" +#include "lldrawpool.h" + +class LLViewerTexture; +class LLDrawInfo; +class LLGLSLShader; + +class LLDrawPoolMaterials : public LLRenderPass +{ + LLGLSLShader *mShader; +public: + LLDrawPoolMaterials(); + + enum + { + VERTEX_DATA_MASK = LLVertexBuffer::MAP_VERTEX | + LLVertexBuffer::MAP_NORMAL | + LLVertexBuffer::MAP_TEXCOORD0 | + LLVertexBuffer::MAP_TEXCOORD1 | + LLVertexBuffer::MAP_TEXCOORD2 | + LLVertexBuffer::MAP_COLOR | + LLVertexBuffer::MAP_BINORMAL + }; + + /*virtual*/ U32 getVertexDataMask() { return VERTEX_DATA_MASK; } + + /*virtual*/ void render(S32 pass = 0) { } + /*virtual*/ S32 getNumPasses() {return 0;} + /*virtual*/ void prerender(); + + /*virtual*/ S32 getNumDeferredPasses(); + /*virtual*/ void beginDeferredPass(S32 pass); + /*virtual*/ void endDeferredPass(S32 pass); + /*virtual*/ void renderDeferred(S32 pass); + + void bindSpecularMap(LLViewerTexture* tex); + void bindNormalMap(LLViewerTexture* tex); + + /*virtual*/ void pushBatch(LLDrawInfo& params, U32 mask, BOOL texture, BOOL batch_textures = FALSE); +}; + +#endif //LL_LLDRAWPOOLMATERIALS_H diff --git a/indra/newview/lldrawpoolsimple.cpp b/indra/newview/lldrawpoolsimple.cpp index 6e0ea78af2..1a6293c010 100644 --- a/indra/newview/lldrawpoolsimple.cpp +++ b/indra/newview/lldrawpoolsimple.cpp @@ -198,7 +198,11 @@ void LLDrawPoolSimple::render(S32 pass) if (LLPipeline::sRenderDeferred) { //if deferred rendering is enabled, bump faces aren't registered as simple //render bump faces here as simple so bump faces will appear under water - pushBatches(LLRenderPass::PASS_BUMP, mask, TRUE, TRUE); + pushBatches(LLRenderPass::PASS_BUMP, mask, TRUE, TRUE); + pushBatches(LLRenderPass::PASS_MATERIAL, mask, TRUE, TRUE); + pushBatches(LLRenderPass::PASS_SPECMAP, mask, TRUE, TRUE); + pushBatches(LLRenderPass::PASS_NORMMAP, mask, TRUE, TRUE); + pushBatches(LLRenderPass::PASS_NORMSPEC, mask, TRUE, TRUE); } } else @@ -405,12 +409,20 @@ void LLDrawPoolFullbright::render(S32 pass) fullbright_shader->uniform1f(LLViewerShaderMgr::FULLBRIGHT, 1.f); U32 fullbright_mask = LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_TEXCOORD0 | LLVertexBuffer::MAP_COLOR | LLVertexBuffer::MAP_TEXTURE_INDEX; pushBatches(LLRenderPass::PASS_FULLBRIGHT, fullbright_mask, TRUE, TRUE); + pushBatches(LLRenderPass::PASS_MATERIAL_ALPHA_EMISSIVE, fullbright_mask, TRUE, TRUE); + pushBatches(LLRenderPass::PASS_SPECMAP_EMISSIVE, fullbright_mask, TRUE, TRUE); + pushBatches(LLRenderPass::PASS_NORMMAP_EMISSIVE, fullbright_mask, TRUE, TRUE); + pushBatches(LLRenderPass::PASS_NORMSPEC_EMISSIVE, fullbright_mask, TRUE, TRUE); } else { gPipeline.enableLightsFullbright(LLColor4(1,1,1,1)); U32 fullbright_mask = LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_TEXCOORD0 | LLVertexBuffer::MAP_COLOR; renderTexture(LLRenderPass::PASS_FULLBRIGHT, fullbright_mask); + pushBatches(LLRenderPass::PASS_MATERIAL_ALPHA_EMISSIVE, fullbright_mask); + pushBatches(LLRenderPass::PASS_SPECMAP_EMISSIVE, fullbright_mask); + pushBatches(LLRenderPass::PASS_NORMMAP_EMISSIVE, fullbright_mask); + pushBatches(LLRenderPass::PASS_NORMSPEC_EMISSIVE, fullbright_mask); } stop_glerror(); diff --git a/indra/newview/llface.cpp b/indra/newview/llface.cpp index 281f852b0a..ef8c4ff543 100644 --- a/indra/newview/llface.cpp +++ b/indra/newview/llface.cpp @@ -51,7 +51,7 @@ #include "llviewerregion.h" #include "llviewerwindow.h" #include "llviewershadermgr.h" - +#include "llviewertexture.h" #define LL_MAX_INDICES_COUNT 1000000 @@ -167,8 +167,12 @@ void LLFace::init(LLDrawable* drawablep, LLViewerObject* objp) //special value to indicate uninitialized position mIndicesIndex = 0xFFFFFFFF; - mIndexInTex = 0; - mTexture = NULL; + for (U32 i = 0; i < LLRender::NUM_TEXTURE_CHANNELS; ++i) + { + mIndexInTex[i] = 0; + mTexture[i] = NULL; + } + mTEOffset = -1; mTextureIndex = 255; @@ -185,8 +189,6 @@ void LLFace::init(LLDrawable* drawablep, LLViewerObject* objp) mImportanceToCamera = 0.f ; mBoundingSphereRadius = 0.0f ; - mAtlasInfop = NULL ; - mUsingAtlas = FALSE ; mHasMedia = FALSE ; } @@ -197,9 +199,12 @@ void LLFace::destroy() gPipeline.checkReferences(this); } - if(mTexture.notNull()) + for (U32 i = 0; i < LLRender::NUM_TEXTURE_CHANNELS; ++i) { - mTexture->removeFace(this) ; + if(mTexture[i].notNull()) + { + mTexture[i]->removeFace(i, this) ; + } } if (isState(LLFace::PARTICLE)) @@ -239,8 +244,7 @@ void LLFace::destroy() } setDrawInfo(NULL); - removeAtlas(); - + mDrawablep = NULL; mVObjp = NULL; } @@ -293,48 +297,76 @@ void LLFace::setPool(LLFacePool* new_pool, LLViewerTexture *texturep) setTexture(texturep) ; } -void LLFace::setTexture(LLViewerTexture* tex) +void LLFace::setTexture(U32 ch, LLViewerTexture* tex) { - if(mTexture == tex) + llassert(ch < LLRender::NUM_TEXTURE_CHANNELS); + + if(mTexture[ch] == tex) { return ; } - if(mTexture.notNull()) + if(mTexture[ch].notNull()) { - mTexture->removeFace(this) ; - removeAtlas() ; + mTexture[ch]->removeFace(ch, this) ; } if(tex) { - tex->addFace(this) ; + tex->addFace(ch, this) ; } - mTexture = tex ; + mTexture[ch] = tex ; +} + +void LLFace::setTexture(LLViewerTexture* tex) +{ + setDiffuseMap(tex); +} + +void LLFace::setDiffuseMap(LLViewerTexture* tex) +{ + setTexture(LLRender::DIFFUSE_MAP, tex); +} + +void LLFace::setNormalMap(LLViewerTexture* tex) +{ + setTexture(LLRender::NORMAL_MAP, tex); +} + +void LLFace::setSpecularMap(LLViewerTexture* tex) +{ + setTexture(LLRender::SPECULAR_MAP, tex); } void LLFace::dirtyTexture() { 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) + if (mVObjp.notNull() && mVObjp->getVolume()) + { + for (U32 ch = 0; ch < LLRender::NUM_TEXTURE_CHANNELS; ++ch) { - vobj->mLODChanged = TRUE; + if (mTexture[ch].notNull() && mTexture[ch]->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.markRebuild(drawablep, LLDrawable::REBUILD_VOLUME, FALSE); - } + } gPipeline.markTextured(drawablep); } -void LLFace::switchTexture(LLViewerTexture* new_texture) +void LLFace::switchTexture(U32 ch, LLViewerTexture* new_texture) { - if(mTexture == new_texture) + llassert(ch < LLRender::NUM_TEXTURE_CHANNELS); + + if(mTexture[ch] == new_texture) { return ; } @@ -344,10 +376,17 @@ void LLFace::switchTexture(LLViewerTexture* new_texture) llerrs << "Can not switch to a null texture." << llendl; return; } - new_texture->addTextureStats(mTexture->getMaxVirtualSize()) ; - getViewerObject()->changeTEImage(mTEOffset, new_texture) ; - setTexture(new_texture) ; + llassert(mTexture[ch].notNull()); + + new_texture->addTextureStats(mTexture[ch]->getMaxVirtualSize()) ; + + if (ch == LLRender::DIFFUSE_MAP) + { + getViewerObject()->changeTEImage(mTEOffset, new_texture) ; + } + + setTexture(ch, new_texture) ; dirtyTexture(); } @@ -1058,6 +1097,12 @@ bool LLFace::canRenderAsMask() { return false; } + + LLMaterial* mat = te->getMaterialParams(); + if (mat && mat->getDiffuseAlphaMode() == LLMaterial::DIFFUSE_ALPHA_MODE_BLEND) + { + return false; + } if ((te->getColor().mV[3] == 1.0f) && // can't treat as mask if we have face alpha (te->getGlow() == 0.f) && // glowing masks are hard to implement - don't mask @@ -1219,7 +1264,8 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume, } LLStrider<LLVector3> vert; - LLStrider<LLVector2> tex_coords; + LLStrider<LLVector2> tex_coords0; + LLStrider<LLVector2> tex_coords1; LLStrider<LLVector2> tex_coords2; LLStrider<LLVector3> norm; LLStrider<LLColor4U> colors; @@ -1251,27 +1297,6 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume, const LLTextureEntry *tep = mVObjp->getTE(f); const U8 bump_code = tep ? tep->getBumpmap() : 0; - F32 tcoord_xoffset = 0.f ; - F32 tcoord_yoffset = 0.f ; - F32 tcoord_xscale = 1.f ; - F32 tcoord_yscale = 1.f ; - BOOL in_atlas = FALSE ; - - if (rebuild_tcoord) - { - in_atlas = isAtlasInUse() ; - if(in_atlas) - { - const LLVector2* tmp = getTexCoordOffset() ; - tcoord_xoffset = tmp->mV[0] ; - tcoord_yoffset = tmp->mV[1] ; - - tmp = getTexCoordScale() ; - tcoord_xscale = tmp->mV[0] ; - tcoord_yscale = tmp->mV[1] ; - } - } - BOOL is_static = mDrawablep->isStatic(); BOOL is_global = is_static; @@ -1292,6 +1317,8 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume, { if (tep) { + LLMaterial* mat = tep->getMaterialParams().get(); + GLfloat alpha[4] = { 0.00f, @@ -1300,11 +1327,15 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume, 0.75f }; - if (getPoolType() != LLDrawPool::POOL_ALPHA && (LLPipeline::sRenderDeferred || (LLPipeline::sRenderBump && tep->getShiny()))) + if ((!LLPipeline::sRenderDeferred || !mat || mat->getSpecularID().isNull()) && + getPoolType() != LLDrawPool::POOL_ALPHA && + (LLPipeline::sRenderDeferred || (LLPipeline::sRenderBump && tep->getShiny()))) { + llassert(tep->getShiny() <= 3); color.mV[3] = U8 (alpha[tep->getShiny()] * 255); } } + } // INDICES @@ -1556,11 +1587,11 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume, break; case BE_BRIGHTNESS: case BE_DARKNESS: - if( mTexture.notNull() && mTexture->hasGLTexture()) + if( mTexture[LLRender::DIFFUSE_MAP].notNull() && mTexture[LLRender::DIFFUSE_MAP]->hasGLTexture()) { // Offset by approximately one texel - S32 cur_discard = mTexture->getDiscardLevel(); - S32 max_size = llmax( mTexture->getWidth(), mTexture->getHeight() ); + S32 cur_discard = mTexture[LLRender::DIFFUSE_MAP]->getDiscardLevel(); + S32 max_size = llmax( mTexture[LLRender::DIFFUSE_MAP]->getWidth(), mTexture[LLRender::DIFFUSE_MAP]->getHeight() ); max_size <<= cur_discard; const F32 ARTIFICIAL_OFFSET = 2.f; offset_multiple = ARTIFICIAL_OFFSET / (F32)max_size; @@ -1601,11 +1632,18 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume, U8 tex_mode = 0; + bool tex_anim = false; + + LLVOVolume* vobj = (LLVOVolume*) (LLViewerObject*) mVObjp; + tex_mode = vobj->mTexAnimMode; + + if (vobj->mTextureAnimp) + { //texture animation is in play, override specular and normal map tex coords with diffuse texcoords + tex_anim = true; + } + if (isState(TEXTURE_ANIM)) { - LLVOVolume* vobj = (LLVOVolume*) (LLViewerObject*) mVObjp; - tex_mode = vobj->mTexAnimMode; - if (!tex_mode) { clearState(TEXTURE_ANIM); @@ -1620,7 +1658,7 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume, do_xform = false; } - + if (getVirtualSize() >= MIN_TEX_ANIM_SIZE) { //don't override texture transform during tc bake tex_mode = 0; @@ -1630,12 +1668,21 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume, LLVector4a scalea; scalea.load3(scale.mV); + LLMaterial* mat = tep->getMaterialParams().get(); + 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 (mat && !do_bump) + { + do_bump = mVertexBuffer->hasDataType(LLVertexBuffer::TYPE_TEXCOORD1) || + mVertexBuffer->hasDataType(LLVertexBuffer::TYPE_TEXCOORD2); + } + + bool do_tex_mat = tex_mode && mTextureMatrix; + + if (!do_bump) + { //not bump mapped, might be able to do a cheap update + mVertexBuffer->getTexCoord0Strider(tex_coords0, mGeomIndex, mGeomCount); if (texgen != LLTextureEntry::TEX_GEN_PLANAR) { @@ -1646,12 +1693,12 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume, { 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); + LLVector4a::memcpyNonAliased16((F32*) tex_coords0.get(), (F32*) vf.mTexCoords, tc_size); } else { LLFastTimer t(FTM_FACE_TEX_QUICK_XFORM); - F32* dst = (F32*) tex_coords.get(); + F32* dst = (F32*) tex_coords0.get(); LLVector4a* src = (LLVector4a*) vf.mTexCoords; LLVector4a trans; @@ -1686,7 +1733,7 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume, } } else - { //do tex mat, no texgen, no atlas, no bump + { //do tex mat, no texgen, no bump for (S32 i = 0; i < num_vertices; i++) { LLVector2 tc(vf.mTexCoords[i]); @@ -1697,12 +1744,12 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume, tmp = tmp * *mTextureMatrix; tc.mV[0] = tmp.mV[0]; tc.mV[1] = tmp.mV[1]; - *tex_coords++ = tc; + *tex_coords0++ = tc; } } } else - { //no bump, no atlas, tex gen planar + { //no bump, tex gen planar LLFastTimer t(FTM_FACE_TEX_QUICK_PLANAR); if (do_tex_mat) { @@ -1720,7 +1767,7 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume, tc.mV[0] = tmp.mV[0]; tc.mV[1] = tmp.mV[1]; - *tex_coords++ = tc; + *tex_coords0++ = tc; } } else @@ -1736,7 +1783,7 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume, xform(tc, cos_ang, sin_ang, os, ot, ms, mt); - *tex_coords++ = tc; + *tex_coords0++ = tc; } } } @@ -1747,145 +1794,114 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume, } } else - { //either bump mapped or in atlas, just do the whole expensive loop + { //bump mapped or has material, 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; - - for (S32 i = 0; i < num_vertices; i++) - { - LLVector2 tc(vf.mTexCoords[i]); - - LLVector4a& norm = vf.mNormals[i]; - LLVector4a& center = *(vf.mCenter); - - if (texgen != LLTextureEntry::TEX_GEN_DEFAULT) - { - LLVector4a vec = vf.mPositions[i]; - - vec.mul(scalea); + std::vector<LLVector2> bump_tc; - 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; - } - } + if (mat) + { //writing out normal and specular texture coordinates, not bump offsets + do_bump = false; + } - 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]; - } - else - { - xform(tc, cos_ang, sin_ang, os, ot, ms, mt); - } + LLStrider<LLVector2> dst; - if(in_atlas) + for (U32 ch = 0; ch < 3; ++ch) + { + switch (ch) { - // - //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; - } + case 0: + mVertexBuffer->getTexCoord0Strider(dst, mGeomIndex, mGeomCount, map_range); 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 + case 1: + if (mVertexBuffer->hasDataType(LLVertexBuffer::TYPE_TEXCOORD1)) { - tc.mV[0] = int_part + 1 - tc.mV[0] ; - } - else //even number - { - tc.mV[0] -= int_part ; - } + mVertexBuffer->getTexCoord1Strider(dst, mGeomIndex, mGeomCount, map_range); + if (mat && !tex_anim) + { + r = mat->getNormalRotation(); + mat->getNormalOffset(os, ot); + mat->getNormalRepeat(ms, mt); - 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] ; + cos_ang = cos(r); + sin_ang = sin(r); + + } } - else //even number + else { - tc.mV[1] -= int_part ; + continue; } 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) + case 2: + if (mVertexBuffer->hasDataType(LLVertexBuffer::TYPE_TEXCOORD2)) { - tc.mV[0] = 1.0f + tc.mV[0] ; + mVertexBuffer->getTexCoord2Strider(dst, mGeomIndex, mGeomCount, map_range); + if (mat && !tex_anim) + { + r = mat->getSpecularRotation(); + mat->getSpecularOffset(os, ot); + mat->getSpecularRepeat(ms, mt); + + cos_ang = cos(r); + sin_ang = sin(r); + } } - if(tc.mV[1] < 0.f) + else { - tc.mV[1] = 1.0f + tc.mV[1] ; + continue; } break; - default: - break; - } - - tc.mV[0] = tcoord_xoffset + tcoord_xscale * tc.mV[0] ; - tc.mV[1] = tcoord_yoffset + tcoord_yscale * tc.mV[1] ; } + + + for (S32 i = 0; i < num_vertices; i++) + { + LLVector2 tc(vf.mTexCoords[i]); + + LLVector4a& norm = vf.mNormals[i]; + + LLVector4a& center = *(vf.mCenter); + + if (texgen != LLTextureEntry::TEX_GEN_DEFAULT) + { + LLVector4a vec = vf.mPositions[i]; + vec.mul(scalea); - *tex_coords++ = tc; - if (do_bump) - { - bump_tc.push_back(tc); + 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; + } + } + + 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]; + } + else + { + xform(tc, cos_ang, sin_ang, os, ot, ms, mt); + } + + *dst++ = tc; + if (do_bump) + { + bump_tc.push_back(tc); + } } } @@ -1894,9 +1910,9 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume, mVertexBuffer->flush(); } - if (do_bump) + if (!mat && do_bump) { - mVertexBuffer->getTexCoord1Strider(tex_coords2, mGeomIndex, mGeomCount, map_range); + mVertexBuffer->getTexCoord1Strider(tex_coords1, mGeomIndex, mGeomCount, map_range); for (S32 i = 0; i < num_vertices; i++) { @@ -1923,7 +1939,7 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume, 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; + *tex_coords1++ = tc; } if (map_range) @@ -2027,9 +2043,11 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume, LLFastTimer t(FTM_FACE_GEOM_BINORMAL); mVertexBuffer->getBinormalStrider(binorm, mGeomIndex, mGeomCount, map_range); F32* binormals = (F32*) binorm.get(); - + + mVObjp->getVolume()->genBinormals(f); + for (S32 i = 0; i < num_vertices; i++) - { + { LLVector4a binormal; mat_normal.rotate(vf.mBinormals[i], binormal); binormal.normalize3fast(); @@ -2153,9 +2171,9 @@ BOOL LLFace::hasMedia() const { return TRUE ; } - if(mTexture.notNull()) + if(mTexture[LLRender::DIFFUSE_MAP].notNull()) { - return mTexture->hasParcelMedia() ; //if has a parcel media + return mTexture[LLRender::DIFFUSE_MAP]->hasParcelMedia() ; //if has a parcel media } return FALSE ; //no media. @@ -2207,7 +2225,7 @@ F32 LLFace::getTextureVirtualSize() face_area = LLFace::adjustPixelArea(mImportanceToCamera, face_area) ; if(face_area > LLViewerTexture::sMinLargeImageSize) //if is large image, shrink face_area by considering the partial overlapping. { - if(mImportanceToCamera > LEAST_IMPORTANCE_FOR_LARGE_IMAGE && mTexture.notNull() && mTexture->isLargeImage()) + if(mImportanceToCamera > LEAST_IMPORTANCE_FOR_LARGE_IMAGE && mTexture[LLRender::DIFFUSE_MAP].notNull() && mTexture[LLRender::DIFFUSE_MAP]->isLargeImage()) { face_area *= adjustPartialOverlapPixelArea(cos_angle_to_view_dir, radius ); } @@ -2574,159 +2592,13 @@ LLVector3 LLFace::getPositionAgent() const } } -// -//atlas -// -void LLFace::removeAtlas() -{ - setAtlasInUse(FALSE) ; - mAtlasInfop = NULL ; -} - -const LLTextureAtlas* LLFace::getAtlas()const -{ - if(mAtlasInfop) - { - return mAtlasInfop->getAtlas() ; - } - return NULL ; -} - -const LLVector2* LLFace::getTexCoordOffset()const -{ - if(isAtlasInUse()) - { - return mAtlasInfop->getTexCoordOffset() ; - } - return NULL ; -} -const LLVector2* LLFace::getTexCoordScale() const -{ - if(isAtlasInUse()) - { - return mAtlasInfop->getTexCoordScale() ; - } - return NULL ; -} - -BOOL LLFace::isAtlasInUse()const -{ - return mUsingAtlas ; -} - -BOOL LLFace::canUseAtlas()const -{ - //no drawable or no spatial group, do not use atlas - if(!mDrawablep || !mDrawablep->getSpatialGroup()) - { - return FALSE ; - } - - //if bump face, do not use atlas - if(getTextureEntry() && getTextureEntry()->getBumpmap()) - { - return FALSE ; - } - - //if animated texture, do not use atlas - if(isState(TEXTURE_ANIM)) - { - return FALSE ; - } - - return TRUE ; -} - -void LLFace::setAtlasInUse(BOOL flag) +LLViewerTexture* LLFace::getTexture(U32 ch) const { - //no valid atlas to use. - if(flag && (!mAtlasInfop || !mAtlasInfop->isValid())) - { - flag = FALSE ; - } + llassert(ch < LLRender::NUM_TEXTURE_CHANNELS); - if(!flag && !mUsingAtlas) - { - return ; - } - - // - //at this stage (flag || mUsingAtlas) is always true. - // - - //rebuild the tex coords - if(mDrawablep) - { - gPipeline.markRebuild(mDrawablep, LLDrawable::REBUILD_TCOORD); - mUsingAtlas = flag ; - } - else - { - mUsingAtlas = FALSE ; - } + return mTexture[ch] ; } -LLTextureAtlasSlot* LLFace::getAtlasInfo() -{ - return mAtlasInfop ; -} - -void LLFace::setAtlasInfo(LLTextureAtlasSlot* atlasp) -{ - if(mAtlasInfop != atlasp) - { - if(mAtlasInfop) - { - //llerrs << "Atlas slot changed!" << llendl ; - } - mAtlasInfop = atlasp ; - } -} - -LLViewerTexture* LLFace::getTexture() const -{ - if(isAtlasInUse()) - { - return (LLViewerTexture*)mAtlasInfop->getAtlas() ; - } - - return mTexture ; -} - -//switch to atlas or switch back to gl texture -//return TRUE if using atlas. -BOOL LLFace::switchTexture() -{ - //no valid atlas or texture - if(!mAtlasInfop || !mAtlasInfop->isValid() || !mTexture) - { - return FALSE ; - } - - if(mTexture->getTexelsInAtlas() >= (U32)mVSize || - mTexture->getTexelsInAtlas() >= mTexture->getTexelsInGLTexture()) - { - //switch to use atlas - //atlas resolution is qualified, use it. - if(!mUsingAtlas) - { - setAtlasInUse(TRUE) ; - } - } - else //if atlas not qualified. - { - //switch back to GL texture - if(mUsingAtlas && mTexture->isGLTextureCreated() && - mTexture->getDiscardLevel() < mTexture->getDiscardLevelInAtlas()) - { - setAtlasInUse(FALSE) ; - } - } - - return mUsingAtlas ; -} - - void LLFace::setVertexBuffer(LLVertexBuffer* buffer) { mVertexBuffer = buffer; @@ -2742,6 +2614,22 @@ void LLFace::clearVertexBuffer() U32 LLFace::getRiggedDataMask(U32 type) { static const U32 rigged_data_mask[] = { + LLDrawPoolAvatar::RIGGED_MATERIAL_MASK, + LLDrawPoolAvatar::RIGGED_MATERIAL_ALPHA_VMASK, + LLDrawPoolAvatar::RIGGED_MATERIAL_ALPHA_MASK_MASK, + LLDrawPoolAvatar::RIGGED_MATERIAL_ALPHA_EMISSIVE_MASK, + LLDrawPoolAvatar::RIGGED_SPECMAP_VMASK, + LLDrawPoolAvatar::RIGGED_SPECMAP_BLEND_MASK, + LLDrawPoolAvatar::RIGGED_SPECMAP_MASK_MASK, + LLDrawPoolAvatar::RIGGED_SPECMAP_EMISSIVE_MASK, + LLDrawPoolAvatar::RIGGED_NORMMAP_VMASK, + LLDrawPoolAvatar::RIGGED_NORMMAP_BLEND_MASK, + LLDrawPoolAvatar::RIGGED_NORMMAP_MASK_MASK, + LLDrawPoolAvatar::RIGGED_NORMMAP_EMISSIVE_MASK, + LLDrawPoolAvatar::RIGGED_NORMSPEC_VMASK, + LLDrawPoolAvatar::RIGGED_NORMSPEC_BLEND_MASK, + LLDrawPoolAvatar::RIGGED_NORMSPEC_MASK_MASK, + LLDrawPoolAvatar::RIGGED_NORMSPEC_EMISSIVE_MASK, LLDrawPoolAvatar::RIGGED_SIMPLE_MASK, LLDrawPoolAvatar::RIGGED_FULLBRIGHT_MASK, LLDrawPoolAvatar::RIGGED_SHINY_MASK, diff --git a/indra/newview/llface.h b/indra/newview/llface.h index de4d03351c..453d2c23d4 100644 --- a/indra/newview/llface.h +++ b/indra/newview/llface.h @@ -41,7 +41,6 @@ #include "llvertexbuffer.h" #include "llviewertexture.h" #include "lldrawable.h" -#include "lltextureatlasmanager.h" class LLFacePool; class LLVolume; @@ -50,7 +49,6 @@ class LLTextureEntry; class LLVertexProgram; class LLViewerTexture; class LLGeometryManager; -class LLTextureAtlasSlot; const F32 MIN_ALPHA_SIZE = 1024.f; const F32 MIN_TEX_ANIM_SIZE = 512.f; @@ -110,8 +108,12 @@ public: U16 getGeomStart() const { return mGeomIndex; } // index into draw pool void setTextureIndex(U8 index); U8 getTextureIndex() const { return mTextureIndex; } + void setTexture(U32 ch, LLViewerTexture* tex); void setTexture(LLViewerTexture* tex) ; - void switchTexture(LLViewerTexture* new_texture); + void setDiffuseMap(LLViewerTexture* tex); + void setNormalMap(LLViewerTexture* tex); + void setSpecularMap(LLViewerTexture* tex); + void switchTexture(U32 ch, LLViewerTexture* new_texture); void dirtyTexture(); LLXformMatrix* getXform() const { return mXform; } BOOL hasGeometry() const { return mGeomCount > 0; } @@ -130,8 +132,8 @@ public: F32 getVirtualSize() const { return mVSize; } F32 getPixelArea() const { return mPixelArea; } - S32 getIndexInTex() const {return mIndexInTex ;} - void setIndexInTex(S32 index) { mIndexInTex = index ;} + S32 getIndexInTex(U32 ch) const {llassert(ch < LLRender::NUM_TEXTURE_CHANNELS); return mIndexInTex[ch];} + void setIndexInTex(U32 ch, S32 index) { llassert(ch < LLRender::NUM_TEXTURE_CHANNELS); mIndexInTex[ch] = index ;} void renderSetColor() const; S32 renderElements(const U16 *index_array) const; @@ -149,7 +151,7 @@ public: S32 getLOD() const { return mVObjp.notNull() ? mVObjp->getLOD() : 0; } void setPoolType(U32 type) { mPoolType = type; } S32 getTEOffset() { return mTEOffset; } - LLViewerTexture* getTexture() const; + LLViewerTexture* getTexture(U32 ch = LLRender::DIFFUSE_MAP) const; void setViewerObject(LLViewerObject* object); void setPool(LLFacePool *pool, LLViewerTexture *texturep); @@ -223,16 +225,6 @@ public: void setHasMedia(bool has_media) { mHasMedia = has_media ;} BOOL hasMedia() const ; - //for atlas - LLTextureAtlasSlot* getAtlasInfo() ; - void setAtlasInUse(BOOL flag); - void setAtlasInfo(LLTextureAtlasSlot* atlasp); - BOOL isAtlasInUse()const; - BOOL canUseAtlas() const; - const LLVector2* getTexCoordScale() const ; - const LLVector2* getTexCoordOffset()const; - const LLTextureAtlas* getAtlas()const ; - void removeAtlas() ; BOOL switchTexture() ; //vertex buffer tracking @@ -266,6 +258,8 @@ public: F32 mLastSkinTime; F32 mLastMoveTime; LLMatrix4* mTextureMatrix; + LLMatrix4* mSpecMapMatrix; + LLMatrix4* mNormalMapMatrix; LLDrawInfo* mDrawInfo; private: @@ -281,10 +275,12 @@ private: U8 mTextureIndex; // index of texture channel to use for pseudo-atlasing U32 mIndicesCount; U32 mIndicesIndex; // index into draw pool for indices (yeah, I know!) - S32 mIndexInTex ; + S32 mIndexInTex[LLRender::NUM_TEXTURE_CHANNELS]; LLXformMatrix* mXform; - LLPointer<LLViewerTexture> mTexture; + + LLPointer<LLViewerTexture> mTexture[LLRender::NUM_TEXTURE_CHANNELS]; + LLPointer<LLDrawable> mDrawablep; LLPointer<LLViewerObject> mVObjp; S32 mTEOffset; @@ -302,9 +298,6 @@ private: F32 mBoundingSphereRadius ; bool mHasMedia ; - //atlas - LLPointer<LLTextureAtlasSlot> mAtlasInfop ; - BOOL mUsingAtlas ; protected: static BOOL sSafeRenderSelect; diff --git a/indra/newview/llfeaturemanager.cpp b/indra/newview/llfeaturemanager.cpp index a4cadcd5dc..ddb9d3bc43 100644 --- a/indra/newview/llfeaturemanager.cpp +++ b/indra/newview/llfeaturemanager.cpp @@ -705,6 +705,20 @@ void LLFeatureManager::setGraphicsLevel(S32 level, bool skipFeatures) switch (level) { case 0: +#if LL_DARWIN + // This Mac-specific change is to insure that we force 'Basic Shaders' for all Mac + // systems which support them instead of falling back to fixed-function unnecessarily + // MAINT-2157 + // + if (gGLManager.mGLVersion < 2.1f) + { + maskFeatures("LowFixedFunction"); + } + else + { //same as low, but with "Basic Shaders" enabled + maskFeatures("Low"); + } +#else if (gGLManager.mGLVersion < 3.f || gGLManager.mIsIntel) { //only use fixed function by default if GL version < 3.0 or this is an intel graphics chip maskFeatures("LowFixedFunction"); @@ -713,6 +727,7 @@ void LLFeatureManager::setGraphicsLevel(S32 level, bool skipFeatures) { //same as low, but with "Basic Shaders" enabled maskFeatures("Low"); } +#endif break; case 1: maskFeatures("LowMid"); diff --git a/indra/newview/llfloaterpreference.cpp b/indra/newview/llfloaterpreference.cpp index bbf88060c1..b45c944a5f 100755 --- a/indra/newview/llfloaterpreference.cpp +++ b/indra/newview/llfloaterpreference.cpp @@ -1089,8 +1089,9 @@ void LLFloaterPreference::refreshEnabledState() ctrl_reflections->setEnabled(reflections); // Bump & Shiny + LLCheckBoxCtrl* bumpshiny_ctrl = getChild<LLCheckBoxCtrl>("BumpShiny"); bool bumpshiny = gGLManager.mHasCubeMap && LLCubeMap::sUseCubeMaps && LLFeatureManager::getInstance()->isFeatureAvailable("RenderObjectBump"); - getChild<LLCheckBoxCtrl>("BumpShiny")->setEnabled(bumpshiny ? TRUE : FALSE); + bumpshiny_ctrl->setEnabled(bumpshiny ? TRUE : FALSE); radio_reflection_detail->setEnabled(reflections); @@ -1149,6 +1150,7 @@ void LLFloaterPreference::refreshEnabledState() LLCheckBoxCtrl* ctrl_deferred = getChild<LLCheckBoxCtrl>("UseLightShaders"); BOOL enabled = LLFeatureManager::getInstance()->isFeatureAvailable("RenderDeferred") && + ((bumpshiny_ctrl && bumpshiny_ctrl->get()) ? TRUE : FALSE) && shaders && gGLManager.mHasFramebufferObject && gSavedSettings.getBOOL("RenderAvatarVP") && @@ -2319,3 +2321,4 @@ void LLFloaterPreferenceProxy::onChangeSocksSettings() } } + diff --git a/indra/newview/lllocalbitmaps.cpp b/indra/newview/lllocalbitmaps.cpp index 25df4889b0..1f2b9904eb 100644 --- a/indra/newview/lllocalbitmaps.cpp +++ b/indra/newview/lllocalbitmaps.cpp @@ -372,10 +372,12 @@ std::vector<LLViewerObject*> LLLocalBitmap::prepUpdateObjects(LLUUID old_id) std::vector<LLViewerObject*> obj_list; LLViewerFetchedTexture* old_texture = gTextureList.findImage(old_id); - for(U32 face_iterator = 0; face_iterator < old_texture->getNumFaces(); face_iterator++) + U32 ch = LLRender::DIFFUSE_MAP; + + for(U32 face_iterator = 0; face_iterator < old_texture->getNumFaces(ch); face_iterator++) { // getting an object from a face - LLFace* face_to_object = (*old_texture->getFaceList())[face_iterator]; + LLFace* face_to_object = (*old_texture->getFaceList(ch))[face_iterator]; if(face_to_object) { diff --git a/indra/newview/llmaterialmgr.cpp b/indra/newview/llmaterialmgr.cpp new file mode 100644 index 0000000000..fb8cffa4ef --- /dev/null +++ b/indra/newview/llmaterialmgr.cpp @@ -0,0 +1,719 @@ +/** + * @file llmaterialmgr.cpp + * @brief Material manager + * + * $LicenseInfo:firstyear=2013&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2013, Linden Research, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * 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 "llsdserialize.h" +#include "llsdutil.h" + +#include "llagent.h" +#include "llcallbacklist.h" +#include "llmaterialmgr.h" +#include "llviewerobject.h" +#include "llviewerobjectlist.h" +#include "llviewerregion.h" +#include "llworld.h" + +/** + * Materials cap parameters + */ + +#define MATERIALS_CAPABILITY_NAME "RenderMaterials" + +#define MATERIALS_CAP_ZIP_FIELD "Zipped" + +#define MATERIALS_CAP_FULL_PER_FACE_FIELD "FullMaterialsPerFace" +#define MATERIALS_CAP_FACE_FIELD "Face" +#define MATERIALS_CAP_MATERIAL_FIELD "Material" +#define MATERIALS_CAP_OBJECT_ID_FIELD "ID" +#define MATERIALS_CAP_MATERIAL_ID_FIELD "MaterialID" + +#define MATERIALS_GET_MAX_ENTRIES 50 +#define MATERIALS_GET_TIMEOUT (60.f * 20) +#define MATERIALS_POST_MAX_ENTRIES 50 +#define MATERIALS_POST_TIMEOUT (60.f * 5) +#define MATERIALS_PUT_THROTTLE_SECS 1.f +#define MATERIALS_PUT_MAX_ENTRIES 50 + +/** + * LLMaterialsResponder helper class + */ + +class LLMaterialsResponder : public LLHTTPClient::Responder +{ +public: + typedef boost::function<void (bool, const LLSD&)> CallbackFunction; + + LLMaterialsResponder(const std::string& pMethod, const std::string& pCapabilityURL, CallbackFunction pCallback); + virtual ~LLMaterialsResponder(); + + virtual void result(const LLSD& pContent); + virtual void error(U32 pStatus, const std::string& pReason); + +private: + std::string mMethod; + std::string mCapabilityURL; + CallbackFunction mCallback; +}; + +LLMaterialsResponder::LLMaterialsResponder(const std::string& pMethod, const std::string& pCapabilityURL, CallbackFunction pCallback) + : LLHTTPClient::Responder() + , mMethod(pMethod) + , mCapabilityURL(pCapabilityURL) + , mCallback(pCallback) +{ +} + +LLMaterialsResponder::~LLMaterialsResponder() +{ +} + +void LLMaterialsResponder::result(const LLSD& pContent) +{ + LL_DEBUGS("Materials") << LL_ENDL; + mCallback(true, pContent); +} + +void LLMaterialsResponder::error(U32 pStatus, const std::string& pReason) +{ + LL_WARNS("Materials") + << "\n--------------------------------------------------------------------------\n" + << mMethod << " Error[" << pStatus << "] cannot access cap '" << MATERIALS_CAPABILITY_NAME + << "'\n with url '" << mCapabilityURL << "' because " << pReason + << "\n--------------------------------------------------------------------------" + << LL_ENDL; + + LLSD emptyResult; + mCallback(false, emptyResult); +} + +/** + * LLMaterialMgr class + */ + +LLMaterialMgr::LLMaterialMgr() +{ + gIdleCallbacks.addFunction(&LLMaterialMgr::onIdle, NULL); + LLWorld::instance().setRegionRemovedCallback(boost::bind(&LLMaterialMgr::onRegionRemoved, this, _1)); +} + +LLMaterialMgr::~LLMaterialMgr() +{ + gIdleCallbacks.deleteFunction(&LLMaterialMgr::onIdle, NULL); +} + +bool LLMaterialMgr::isGetPending(const LLUUID& region_id, const LLMaterialID& material_id) const +{ + get_pending_map_t::const_iterator itPending = mGetPending.find(pending_material_t(region_id, material_id)); + return (mGetPending.end() != itPending) && (LLFrameTimer::getTotalSeconds() < itPending->second + MATERIALS_POST_TIMEOUT); +} + +void LLMaterialMgr::markGetPending(const LLUUID& region_id, const LLMaterialID& material_id) +{ + get_pending_map_t::iterator itPending = mGetPending.find(pending_material_t(region_id, material_id)); + if (mGetPending.end() == itPending) + { + mGetPending.insert(std::pair<pending_material_t, F64>(pending_material_t(region_id, material_id), LLFrameTimer::getTotalSeconds())); + } + else + { + itPending->second = LLFrameTimer::getTotalSeconds(); + } +} + +const LLMaterialPtr LLMaterialMgr::get(const LLUUID& region_id, const LLMaterialID& material_id) +{ + LL_DEBUGS("Materials") << "region " << region_id << " material id " << material_id << LL_ENDL; + LLMaterialPtr material; + material_map_t::const_iterator itMaterial = mMaterials.find(material_id); + if (mMaterials.end() != itMaterial) + { + material = itMaterial->second; + LL_DEBUGS("Materials") << " found material " << LL_ENDL; + } + else + { + if (!isGetPending(region_id, material_id)) + { + LL_DEBUGS("Materials") << " material pending " << material_id << LL_ENDL; + get_queue_t::iterator itQueue = mGetQueue.find(region_id); + if (mGetQueue.end() == itQueue) + { + LL_DEBUGS("Materials") << "mGetQueue add region " << region_id << " pending " << material_id << LL_ENDL; + std::pair<get_queue_t::iterator, bool> ret = mGetQueue.insert(std::pair<LLUUID, material_queue_t>(region_id, material_queue_t())); + itQueue = ret.first; + } + itQueue->second.insert(material_id); + markGetPending(region_id, material_id); + } + LL_DEBUGS("Materials") << " returning empty material " << LL_ENDL; + material = LLMaterialPtr(); + } + return material; +} + +boost::signals2::connection LLMaterialMgr::get(const LLUUID& region_id, const LLMaterialID& material_id, LLMaterialMgr::get_callback_t::slot_type cb) +{ + boost::signals2::connection connection; + + material_map_t::const_iterator itMaterial = mMaterials.find(material_id); + if (itMaterial != mMaterials.end()) + { + LL_DEBUGS("Materials") << "region " << region_id << " found materialid " << material_id << LL_ENDL; + get_callback_t signal; + signal.connect(cb); + signal(material_id, itMaterial->second); + connection = boost::signals2::connection(); + } + else + { + if (!isGetPending(region_id, material_id)) + { + get_queue_t::iterator itQueue = mGetQueue.find(region_id); + if (mGetQueue.end() == itQueue) + { + LL_DEBUGS("Materials") << "mGetQueue inserting region "<<region_id << LL_ENDL; + std::pair<get_queue_t::iterator, bool> ret = mGetQueue.insert(std::pair<LLUUID, material_queue_t>(region_id, material_queue_t())); + itQueue = ret.first; + } + LL_DEBUGS("Materials") << "adding material id " << material_id << LL_ENDL; + itQueue->second.insert(material_id); + markGetPending(region_id, material_id); + } + + get_callback_map_t::iterator itCallback = mGetCallbacks.find(material_id); + if (itCallback == mGetCallbacks.end()) + { + std::pair<get_callback_map_t::iterator, bool> ret = mGetCallbacks.insert(std::pair<LLMaterialID, get_callback_t*>(material_id, new get_callback_t())); + itCallback = ret.first; + } + connection = itCallback->second->connect(cb);; + } + + return connection; +} + +bool LLMaterialMgr::isGetAllPending(const LLUUID& region_id) const +{ + getall_pending_map_t::const_iterator itPending = mGetAllPending.find(region_id); + return (mGetAllPending.end() != itPending) && (LLFrameTimer::getTotalSeconds() < itPending->second + MATERIALS_GET_TIMEOUT); +} + +void LLMaterialMgr::getAll(const LLUUID& region_id) +{ + if (!isGetAllPending(region_id)) + { + LL_DEBUGS("Materials") << "queuing for region " << region_id << LL_ENDL; + mGetAllQueue.insert(region_id); + } + else + { + LL_DEBUGS("Materials") << "already pending for region " << region_id << LL_ENDL; + } +} + +boost::signals2::connection LLMaterialMgr::getAll(const LLUUID& region_id, LLMaterialMgr::getall_callback_t::slot_type cb) +{ + if (!isGetAllPending(region_id)) + { + mGetAllQueue.insert(region_id); + } + + getall_callback_map_t::iterator itCallback = mGetAllCallbacks.find(region_id); + if (mGetAllCallbacks.end() == itCallback) + { + std::pair<getall_callback_map_t::iterator, bool> ret = mGetAllCallbacks.insert(std::pair<LLUUID, getall_callback_t*>(region_id, new getall_callback_t())); + itCallback = ret.first; + } + return itCallback->second->connect(cb);; +} + +void LLMaterialMgr::put(const LLUUID& object_id, const U8 te, const LLMaterial& material) +{ + put_queue_t::iterator itQueue = mPutQueue.find(object_id); + if (mPutQueue.end() == itQueue) + { + LL_DEBUGS("Materials") << "mPutQueue insert object " << object_id << LL_ENDL; + mPutQueue.insert(std::pair<LLUUID, facematerial_map_t>(object_id, facematerial_map_t())); + itQueue = mPutQueue.find(object_id); + } + + facematerial_map_t::iterator itFace = itQueue->second.find(te); + if (itQueue->second.end() == itFace) + { + itQueue->second.insert(std::pair<U8, LLMaterial>(te, material)); + } + else + { + itFace->second = material; + } +} + +void LLMaterialMgr::remove(const LLUUID& object_id, const U8 te) +{ + put(object_id, te, LLMaterial::null); +} + +const LLMaterialPtr LLMaterialMgr::setMaterial(const LLUUID& region_id, const LLMaterialID& material_id, const LLSD& material_data) +{ + LL_DEBUGS("Materials") << "region " << region_id << " material id " << material_id << LL_ENDL; + material_map_t::const_iterator itMaterial = mMaterials.find(material_id); + if (mMaterials.end() == itMaterial) + { + LL_DEBUGS("Materials") << "new material" << LL_ENDL; + LLMaterialPtr newMaterial(new LLMaterial(material_data)); + std::pair<material_map_t::const_iterator, bool> ret = mMaterials.insert(std::pair<LLMaterialID, LLMaterialPtr>(material_id, newMaterial)); + itMaterial = ret.first; + } + + mGetPending.erase(pending_material_t(region_id, material_id)); + + get_callback_map_t::iterator itCallback = mGetCallbacks.find(material_id); + if (itCallback != mGetCallbacks.end()) + { + (*itCallback->second)(material_id, itMaterial->second); + + delete itCallback->second; + mGetCallbacks.erase(itCallback); + } + + return itMaterial->second; +} + +void LLMaterialMgr::onGetResponse(bool success, const LLSD& content, const LLUUID& region_id) +{ + if (!success) + { + // *TODO: is there any kind of error handling we can do here? + LL_WARNS("Materials")<< "failed"<<LL_ENDL; + return; + } + + llassert(content.isMap()); + llassert(content.has(MATERIALS_CAP_ZIP_FIELD)); + llassert(content[MATERIALS_CAP_ZIP_FIELD].isBinary()); + + LLSD::Binary content_binary = content[MATERIALS_CAP_ZIP_FIELD].asBinary(); + std::string content_string(reinterpret_cast<const char*>(content_binary.data()), content_binary.size()); + std::istringstream content_stream(content_string); + + LLSD response_data; + if (!unzip_llsd(response_data, content_stream, content_binary.size())) + { + LL_WARNS("Materials") << "Cannot unzip LLSD binary content" << LL_ENDL; + return; + } + + llassert(response_data.isArray()); + LL_DEBUGS("Materials") << "response has "<< response_data.size() << " materials" << LL_ENDL; + for (LLSD::array_const_iterator itMaterial = response_data.beginArray(); itMaterial != response_data.endArray(); ++itMaterial) + { + const LLSD& material_data = *itMaterial; + llassert(material_data.isMap()); + + llassert(material_data.has(MATERIALS_CAP_OBJECT_ID_FIELD)); + llassert(material_data[MATERIALS_CAP_OBJECT_ID_FIELD].isBinary()); + LLMaterialID material_id(material_data[MATERIALS_CAP_OBJECT_ID_FIELD].asBinary()); + + llassert(material_data.has(MATERIALS_CAP_MATERIAL_FIELD)); + llassert(material_data[MATERIALS_CAP_MATERIAL_FIELD].isMap()); + + setMaterial(region_id, material_id, material_data[MATERIALS_CAP_MATERIAL_FIELD]); + } +} + +void LLMaterialMgr::onGetAllResponse(bool success, const LLSD& content, const LLUUID& region_id) +{ + if (!success) + { + // *TODO: is there any kind of error handling we can do here? + LL_WARNS("Materials")<< "failed"<<LL_ENDL; + return; + } + + llassert(content.isMap()); + llassert(content.has(MATERIALS_CAP_ZIP_FIELD)); + llassert(content[MATERIALS_CAP_ZIP_FIELD].isBinary()); + + LLSD::Binary content_binary = content[MATERIALS_CAP_ZIP_FIELD].asBinary(); + std::string content_string(reinterpret_cast<const char*>(content_binary.data()), content_binary.size()); + std::istringstream content_stream(content_string); + + LLSD response_data; + if (!unzip_llsd(response_data, content_stream, content_binary.size())) + { + LL_WARNS("Materials") << "Cannot unzip LLSD binary content" << LL_ENDL; + return; + } + + get_queue_t::iterator itQueue = mGetQueue.find(region_id); + material_map_t materials; + + llassert(response_data.isArray()); + LL_DEBUGS("Materials") << "response has "<< response_data.size() << " materials" << LL_ENDL; + for (LLSD::array_const_iterator itMaterial = response_data.beginArray(); itMaterial != response_data.endArray(); ++itMaterial) + { + const LLSD& material_data = *itMaterial; + llassert(material_data.isMap()); + + llassert(material_data.has(MATERIALS_CAP_OBJECT_ID_FIELD)); + llassert(material_data[MATERIALS_CAP_OBJECT_ID_FIELD].isBinary()); + LLMaterialID material_id(material_data[MATERIALS_CAP_OBJECT_ID_FIELD].asBinary()); + if (mGetQueue.end() != itQueue) + { + itQueue->second.erase(material_id); + } + + llassert(material_data.has(MATERIALS_CAP_MATERIAL_FIELD)); + llassert(material_data[MATERIALS_CAP_MATERIAL_FIELD].isMap()); + LLMaterialPtr material = setMaterial(region_id, material_id, material_data[MATERIALS_CAP_MATERIAL_FIELD]); + + materials[material_id] = material; + } + + getall_callback_map_t::iterator itCallback = mGetAllCallbacks.find(region_id); + if (itCallback != mGetAllCallbacks.end()) + { + (*itCallback->second)(region_id, materials); + + delete itCallback->second; + mGetAllCallbacks.erase(itCallback); + } + + if ( (mGetQueue.end() != itQueue) && (itQueue->second.empty()) ) + { + mGetQueue.erase(itQueue); + } + + LL_DEBUGS("Materials")<< "recording that getAll has been done for region id " << region_id << LL_ENDL; + mGetAllRequested.insert(region_id); // prevents subsequent getAll requests for this region + mGetAllPending.erase(region_id); // Invalidates region_id +} + +void LLMaterialMgr::onPutResponse(bool success, const LLSD& content) +{ + if (!success) + { + // *TODO: is there any kind of error handling we can do here? + LL_WARNS("Materials")<< "failed"<<LL_ENDL; + return; + } + + llassert(content.isMap()); + llassert(content.has(MATERIALS_CAP_ZIP_FIELD)); + llassert(content[MATERIALS_CAP_ZIP_FIELD].isBinary()); + + LLSD::Binary content_binary = content[MATERIALS_CAP_ZIP_FIELD].asBinary(); + std::string content_string(reinterpret_cast<const char*>(content_binary.data()), content_binary.size()); + std::istringstream content_stream(content_string); + + LLSD response_data; + if (!unzip_llsd(response_data, content_stream, content_binary.size())) + { + LL_WARNS("Materials") << "Cannot unzip LLSD binary content" << LL_ENDL; + return; + } + else + { + llassert(response_data.isArray()); + LL_DEBUGS("Materials") << "response has "<< response_data.size() << " materials" << LL_ENDL; + for (LLSD::array_const_iterator faceIter = response_data.beginArray(); faceIter != response_data.endArray(); ++faceIter) + { +# ifndef LL_RELEASE_FOR_DOWNLOAD + const LLSD& face_data = *faceIter; // conditional to avoid unused variable warning +# endif + llassert(face_data.isMap()); + + llassert(face_data.has(MATERIALS_CAP_OBJECT_ID_FIELD)); + llassert(face_data[MATERIALS_CAP_OBJECT_ID_FIELD].isInteger()); + // U32 local_id = face_data[MATERIALS_CAP_OBJECT_ID_FIELD].asInteger(); + + llassert(face_data.has(MATERIALS_CAP_FACE_FIELD)); + llassert(face_data[MATERIALS_CAP_FACE_FIELD].isInteger()); + // S32 te = face_data[MATERIALS_CAP_FACE_FIELD].asInteger(); + + llassert(face_data.has(MATERIALS_CAP_MATERIAL_ID_FIELD)); + llassert(face_data[MATERIALS_CAP_MATERIAL_ID_FIELD].isBinary()); + // LLMaterialID material_id(face_data[MATERIALS_CAP_MATERIAL_ID_FIELD].asBinary()); + + // *TODO: do we really still need to process this? + } + } +} + +static LLFastTimer::DeclareTimer FTM_MATERIALS_IDLE("Materials"); + +void LLMaterialMgr::onIdle(void*) +{ + LLFastTimer t(FTM_MATERIALS_IDLE); + + LLMaterialMgr* instancep = LLMaterialMgr::getInstance(); + + if (!instancep->mGetQueue.empty()) + { + instancep->processGetQueue(); + } + + if (!instancep->mGetAllQueue.empty()) + { + instancep->processGetAllQueue(); + } + + static LLFrameTimer mPutTimer; + if ( (!instancep->mPutQueue.empty()) && (mPutTimer.hasExpired()) ) + { + instancep->processPutQueue(); + mPutTimer.resetWithExpiry(MATERIALS_PUT_THROTTLE_SECS); + } +} + +void LLMaterialMgr::processGetQueue() +{ + get_queue_t::iterator loopRegionQueue = mGetQueue.begin(); + while (mGetQueue.end() != loopRegionQueue) + { + get_queue_t::iterator itRegionQueue = loopRegionQueue++; + + const LLUUID& region_id = itRegionQueue->first; + if (isGetAllPending(region_id)) + { + continue; + } + + const LLViewerRegion* regionp = LLWorld::instance().getRegionFromID(region_id); + if (!regionp) + { + LL_WARNS("Materials") << "Unknown region with id " << region_id.asString() << LL_ENDL; + mGetQueue.erase(itRegionQueue); + continue; + } + else if (!regionp->capabilitiesReceived()) + { + continue; + } + else if (mGetAllRequested.end() == mGetAllRequested.find(region_id)) + { + LL_DEBUGS("Materials") << "calling getAll for " << regionp->getName() << LL_ENDL; + getAll(region_id); + continue; + } + + const std::string capURL = regionp->getCapability(MATERIALS_CAPABILITY_NAME); + if (capURL.empty()) + { + LL_WARNS("Materials") << "Capability '" << MATERIALS_CAPABILITY_NAME + << "' is not defined on region '" << regionp->getName() << "'" << LL_ENDL; + mGetQueue.erase(itRegionQueue); + continue; + } + + LLSD materialsData = LLSD::emptyArray(); + + material_queue_t& materials = itRegionQueue->second; + material_queue_t::iterator loopMaterial = materials.begin(); + while ( (materials.end() != loopMaterial) && (materialsData.size() <= MATERIALS_GET_MAX_ENTRIES) ) + { + material_queue_t::iterator itMaterial = loopMaterial++; + materialsData.append((*itMaterial).asLLSD()); + materials.erase(itMaterial); + markGetPending(region_id, *itMaterial); + } + if (materials.empty()) + { + mGetQueue.erase(itRegionQueue); + } + + std::string materialString = zip_llsd(materialsData); + + S32 materialSize = materialString.size(); + if (materialSize <= 0) + { + LL_ERRS("Materials") << "cannot zip LLSD binary content" << LL_ENDL; + return; + } + + LLSD::Binary materialBinary; + materialBinary.resize(materialSize); + memcpy(materialBinary.data(), materialString.data(), materialSize); + + LLSD postData = LLSD::emptyMap(); + postData[MATERIALS_CAP_ZIP_FIELD] = materialBinary; + + LLHTTPClient::ResponderPtr materialsResponder = new LLMaterialsResponder("POST", capURL, boost::bind(&LLMaterialMgr::onGetResponse, this, _1, _2, region_id)); + LL_DEBUGS("Materials") << "POSTing to region '" << regionp->getName() << "' at '"<< capURL << " for " << materialsData.size() << " materials." + << "\ndata: " << ll_pretty_print_sd(materialsData) << LL_ENDL; + LLHTTPClient::post(capURL, postData, materialsResponder); + } +} + +void LLMaterialMgr::processGetAllQueue() +{ + getall_queue_t::iterator loopRegion = mGetAllQueue.begin(); + while (mGetAllQueue.end() != loopRegion) + { + getall_queue_t::iterator itRegion = loopRegion++; + + const LLUUID& region_id = *itRegion; + LLViewerRegion* regionp = LLWorld::instance().getRegionFromID(region_id); + if (regionp == NULL) + { + LL_WARNS("Materials") << "Unknown region with id " << region_id.asString() << LL_ENDL; + clearGetQueues(region_id); // Invalidates region_id + continue; + } + else if (!regionp->capabilitiesReceived()) + { + continue; + } + + std::string capURL = regionp->getCapability(MATERIALS_CAPABILITY_NAME); + if (capURL.empty()) + { + LL_WARNS("Materials") << "Capability '" << MATERIALS_CAPABILITY_NAME + << "' is not defined on the current region '" << regionp->getName() << "'" << LL_ENDL; + clearGetQueues(region_id); // Invalidates region_id + continue; + } + + LL_DEBUGS("Materials") << "GET all for region " << region_id << "url " << capURL << LL_ENDL; + LLHTTPClient::ResponderPtr materialsResponder = new LLMaterialsResponder("GET", capURL, boost::bind(&LLMaterialMgr::onGetAllResponse, this, _1, _2, *itRegion)); + LLHTTPClient::get(capURL, materialsResponder); + mGetAllPending.insert(std::pair<LLUUID, F64>(region_id, LLFrameTimer::getTotalSeconds())); + mGetAllQueue.erase(itRegion); // Invalidates region_id + } +} + +void LLMaterialMgr::processPutQueue() +{ + typedef std::map<const LLViewerRegion*, LLSD> regionput_request_map; + regionput_request_map requests; + + put_queue_t::iterator loopQueue = mPutQueue.begin(); + while (mPutQueue.end() != loopQueue) + { + put_queue_t::iterator itQueue = loopQueue++; + + const LLUUID& object_id = itQueue->first; + const LLViewerObject* objectp = gObjectList.findObject(object_id); + if ( (!objectp) || (!objectp->getRegion()) ) + { + LL_WARNS("Materials") << "Object or object region is NULL" << LL_ENDL; + + mPutQueue.erase(itQueue); + continue; + } + + const LLViewerRegion* regionp = objectp->getRegion(); + if (!regionp->capabilitiesReceived()) + { + continue; + } + + LLSD& facesData = requests[regionp]; + + facematerial_map_t& face_map = itQueue->second; + facematerial_map_t::iterator itFace = face_map.begin(); + while ( (face_map.end() != itFace) && (facesData.size() < MATERIALS_GET_MAX_ENTRIES) ) + { + LLSD faceData = LLSD::emptyMap(); + faceData[MATERIALS_CAP_FACE_FIELD] = static_cast<LLSD::Integer>(itFace->first); + faceData[MATERIALS_CAP_OBJECT_ID_FIELD] = static_cast<LLSD::Integer>(objectp->getLocalID()); + if (!itFace->second.isNull()) + { + faceData[MATERIALS_CAP_MATERIAL_FIELD] = itFace->second.asLLSD(); + } + facesData.append(faceData); + face_map.erase(itFace++); + } + if (face_map.empty()) + { + mPutQueue.erase(itQueue); + } + } + + for (regionput_request_map::const_iterator itRequest = requests.begin(); itRequest != requests.end(); ++itRequest) + { + std::string capURL = itRequest->first->getCapability(MATERIALS_CAPABILITY_NAME); + if (capURL.empty()) + { + LL_WARNS("Materials") << "Capability '" << MATERIALS_CAPABILITY_NAME + << "' is not defined on region '" << itRequest->first->getName() << "'" << LL_ENDL; + continue; + } + + LLSD materialsData = LLSD::emptyMap(); + materialsData[MATERIALS_CAP_FULL_PER_FACE_FIELD] = itRequest->second; + + std::string materialString = zip_llsd(materialsData); + + S32 materialSize = materialString.size(); + + if (materialSize > 0) + { + LLSD::Binary materialBinary; + materialBinary.resize(materialSize); + memcpy(materialBinary.data(), materialString.data(), materialSize); + + LLSD putData = LLSD::emptyMap(); + putData[MATERIALS_CAP_ZIP_FIELD] = materialBinary; + + LL_DEBUGS("Materials") << "put for " << itRequest->second.size() << " faces to region " << itRequest->first->getName() << LL_ENDL; + LLHTTPClient::ResponderPtr materialsResponder = new LLMaterialsResponder("PUT", capURL, boost::bind(&LLMaterialMgr::onPutResponse, this, _1, _2)); + LLHTTPClient::put(capURL, putData, materialsResponder); + } + else + { + LL_ERRS("debugMaterials") << "cannot zip LLSD binary content" << LL_ENDL; + } + } +} + +void LLMaterialMgr::clearGetQueues(const LLUUID& region_id) +{ + mGetQueue.erase(region_id); + for (get_pending_map_t::iterator itPending = mGetPending.begin(); itPending != mGetPending.end();) + { + if (region_id == itPending->first.first) + { + mGetPending.erase(itPending++); + } + else + { + ++itPending; + } + } + + mGetAllQueue.erase(region_id); + mGetAllRequested.erase(region_id); + mGetAllPending.erase(region_id); + mGetAllCallbacks.erase(region_id); +} + +void LLMaterialMgr::onRegionRemoved(LLViewerRegion* regionp) +{ + clearGetQueues(regionp->getRegionID()); + // Put doesn't need clearing: objects that can't be found will clean up in processPutQueue() +} diff --git a/indra/newview/llmaterialmgr.h b/indra/newview/llmaterialmgr.h new file mode 100644 index 0000000000..39be5cab29 --- /dev/null +++ b/indra/newview/llmaterialmgr.h @@ -0,0 +1,96 @@ +/** + * @file llmaterialmgr.h + * @brief Material manager + * + * $LicenseInfo:firstyear=2006&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2010, Linden Research, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA + * $/LicenseInfo$ + */ + +#ifndef LL_LLMATERIALMGR_H +#define LL_LLMATERIALMGR_H + +#include "llmaterial.h" +#include "llmaterialid.h" +#include "llsingleton.h" + +class LLViewerRegion; + +class LLMaterialMgr : public LLSingleton<LLMaterialMgr> +{ + friend class LLSingleton<LLMaterialMgr>; +protected: + LLMaterialMgr(); + virtual ~LLMaterialMgr(); + +public: + typedef std::map<LLMaterialID, LLMaterialPtr> material_map_t; + + typedef boost::signals2::signal<void (const LLMaterialID&, const LLMaterialPtr)> get_callback_t; + const LLMaterialPtr get(const LLUUID& region_id, const LLMaterialID& material_id); + boost::signals2::connection get(const LLUUID& region_id, const LLMaterialID& material_id, get_callback_t::slot_type cb); + typedef boost::signals2::signal<void (const LLUUID&, const material_map_t&)> getall_callback_t; + void getAll(const LLUUID& region_id); + boost::signals2::connection getAll(const LLUUID& region_id, getall_callback_t::slot_type cb); + void put(const LLUUID& object_id, const U8 te, const LLMaterial& material); + void remove(const LLUUID& object_id, const U8 te); + +protected: + void clearGetQueues(const LLUUID& region_id); + bool isGetPending(const LLUUID& region_id, const LLMaterialID& material_id) const; + bool isGetAllPending(const LLUUID& region_id) const; + void markGetPending(const LLUUID& region_id, const LLMaterialID& material_id); + const LLMaterialPtr setMaterial(const LLUUID& region_id, const LLMaterialID& material_id, const LLSD& material_data); + + static void onIdle(void*); + void processGetQueue(); + void onGetResponse(bool success, const LLSD& content, const LLUUID& region_id); + void processGetAllQueue(); + void onGetAllResponse(bool success, const LLSD& content, const LLUUID& region_id); + void processPutQueue(); + void onPutResponse(bool success, const LLSD& content); + void onRegionRemoved(LLViewerRegion* regionp); + +protected: + typedef std::set<LLMaterialID> material_queue_t; + typedef std::map<LLUUID, material_queue_t> get_queue_t; + get_queue_t mGetQueue; + typedef std::pair<const LLUUID, LLMaterialID> pending_material_t; + typedef std::map<const pending_material_t, F64> get_pending_map_t; + get_pending_map_t mGetPending; + typedef std::map<LLMaterialID, get_callback_t*> get_callback_map_t; + get_callback_map_t mGetCallbacks; + + typedef std::set<LLUUID> getall_queue_t; + getall_queue_t mGetAllQueue; + getall_queue_t mGetAllRequested; + typedef std::map<LLUUID, F64> getall_pending_map_t; + getall_pending_map_t mGetAllPending; + typedef std::map<LLUUID, getall_callback_t*> getall_callback_map_t; + getall_callback_map_t mGetAllCallbacks; + + typedef std::map<U8, LLMaterial> facematerial_map_t; + typedef std::map<LLUUID, facematerial_map_t> put_queue_t; + put_queue_t mPutQueue; + + material_map_t mMaterials; +}; + +#endif // LL_LLMATERIALMGR_H diff --git a/indra/newview/llpanelface.cpp b/indra/newview/llpanelface.cpp index 445c0d811f..f55d53fa29 100644 --- a/indra/newview/llpanelface.cpp +++ b/indra/newview/llpanelface.cpp @@ -46,6 +46,7 @@ #include "lldrawpoolbump.h" #include "llface.h" #include "lllineeditor.h" +#include "llmaterialmgr.h" #include "llmediaentry.h" #include "llnotificationsutil.h" #include "llresmgr.h" @@ -55,10 +56,12 @@ #include "lltexturectrl.h" #include "lltextureentry.h" #include "lltooldraganddrop.h" +#include "lltrans.h" #include "llui.h" #include "llviewercontrol.h" #include "llviewermedia.h" #include "llviewerobject.h" +#include "llviewerregion.h" #include "llviewerstats.h" #include "llvovolume.h" #include "lluictrlfactory.h" @@ -66,6 +69,27 @@ #include "llviewertexturelist.h" // +// Constant definitions for comboboxes +// Must match the commbobox definitions in panel_tools_texture.xml +// +const S32 MATMEDIA_MATERIAL = 0; // Material +const S32 MATMEDIA_MEDIA = 1; // Media +const S32 MATTYPE_DIFFUSE = 0; // Diffuse material texture +const S32 MATTYPE_NORMAL = 1; // Normal map +const S32 MATTYPE_SPECULAR = 2; // Specular map +const S32 ALPHAMODE_NONE = 0; // No alpha mask applied +const S32 ALPHAMODE_BLEND = 1; // Alpha blending mode +const S32 ALPHAMODE_MASK = 2; // Alpha masking mode +const S32 BUMPY_TEXTURE = 18; // use supplied normal map +const S32 SHINY_TEXTURE = 4; // use supplied specular map + +// +// "Use texture" label for normal/specular type comboboxes +// Filled in at initialization from translated strings +// +std::string USE_TEXTURE; + +// // Methods // @@ -73,21 +97,38 @@ BOOL LLPanelFace::postBuild() { childSetCommitCallback("combobox shininess",&LLPanelFace::onCommitShiny,this); childSetCommitCallback("combobox bumpiness",&LLPanelFace::onCommitBump,this); + childSetCommitCallback("combobox alphamode",&LLPanelFace::onCommitAlphaMode,this); childSetCommitCallback("TexScaleU",&LLPanelFace::onCommitTextureInfo, this); - childSetCommitCallback("checkbox flip s",&LLPanelFace::onCommitTextureInfo, this); childSetCommitCallback("TexScaleV",&LLPanelFace::onCommitTextureInfo, this); - childSetCommitCallback("checkbox flip t",&LLPanelFace::onCommitTextureInfo, this); childSetCommitCallback("TexRot",&LLPanelFace::onCommitTextureInfo, this); - childSetAction("button apply",&LLPanelFace::onClickApply,this); + childSetCommitCallback("rptctrl",&LLPanelFace::onCommitRepeatsPerMeter, this); childSetCommitCallback("checkbox planar align",&LLPanelFace::onCommitPlanarAlign, this); childSetCommitCallback("TexOffsetU",LLPanelFace::onCommitTextureInfo, this); childSetCommitCallback("TexOffsetV",LLPanelFace::onCommitTextureInfo, this); + childSetCommitCallback("bumpyScaleU",&LLPanelFace::onCommitMaterial, this); + childSetCommitCallback("bumpyScaleV",&LLPanelFace::onCommitMaterial, this); + childSetCommitCallback("bumpyRot",&LLPanelFace::onCommitMaterial, this); + childSetCommitCallback("bumpyOffsetU",&LLPanelFace::onCommitMaterial, this); + childSetCommitCallback("bumpyOffsetV",&LLPanelFace::onCommitMaterial, this); + childSetCommitCallback("shinyScaleU",&LLPanelFace::onCommitMaterial, this); + childSetCommitCallback("shinyScaleV",&LLPanelFace::onCommitMaterial, this); + childSetCommitCallback("shinyRot",&LLPanelFace::onCommitMaterial, this); + childSetCommitCallback("shinyOffsetU",&LLPanelFace::onCommitMaterial, this); + childSetCommitCallback("shinyOffsetV",&LLPanelFace::onCommitMaterial, this); + childSetCommitCallback("glossiness",&LLPanelFace::onCommitMaterial, this); + childSetCommitCallback("environment",&LLPanelFace::onCommitMaterial, this); + childSetCommitCallback("maskcutoff",&LLPanelFace::onCommitMaterial, this); childSetAction("button align",&LLPanelFace::onClickAutoFix,this); LLTextureCtrl* mTextureCtrl; + LLTextureCtrl* mShinyTextureCtrl; + LLTextureCtrl* mBumpyTextureCtrl; LLColorSwatchCtrl* mColorSwatch; + LLColorSwatchCtrl* mShinyColorSwatch; LLComboBox* mComboTexGen; + LLComboBox* mComboMatMedia; + LLComboBox* mComboMatType; LLCheckBoxCtrl *mCheckFullbright; @@ -97,6 +138,7 @@ BOOL LLPanelFace::postBuild() LLSpinCtrl* mCtrlGlow; setMouseOpaque(FALSE); + mTextureCtrl = getChild<LLTextureCtrl>("texture control"); if(mTextureCtrl) { @@ -112,6 +154,36 @@ BOOL LLPanelFace::postBuild() mTextureCtrl->setDnDFilterPermMask(PERM_COPY | PERM_TRANSFER); } + mShinyTextureCtrl = getChild<LLTextureCtrl>("shinytexture control"); + if(mShinyTextureCtrl) + { + mShinyTextureCtrl->setDefaultImageAssetID(LLUUID( gSavedSettings.getString( "DefaultObjectTexture" ))); + mShinyTextureCtrl->setCommitCallback( boost::bind(&LLPanelFace::onCommitMaterialTexture, this, _2) ); + mShinyTextureCtrl->setOnCancelCallback( boost::bind(&LLPanelFace::onCancelMaterialTexture, this, _2) ); + mShinyTextureCtrl->setOnSelectCallback( boost::bind(&LLPanelFace::onSelectMaterialTexture, this, _2) ); + mShinyTextureCtrl->setDragCallback(boost::bind(&LLPanelFace::onDragTexture, this, _2)); + mShinyTextureCtrl->setOnTextureSelectedCallback(boost::bind(&LLPanelFace::onTextureSelectionChanged, this, _1)); + mShinyTextureCtrl->setFollowsTop(); + mShinyTextureCtrl->setFollowsLeft(); + mShinyTextureCtrl->setImmediateFilterPermMask(PERM_NONE); + mShinyTextureCtrl->setDnDFilterPermMask(PERM_COPY | PERM_TRANSFER); + } + + mBumpyTextureCtrl = getChild<LLTextureCtrl>("bumpytexture control"); + if(mBumpyTextureCtrl) + { + mBumpyTextureCtrl->setDefaultImageAssetID(LLUUID( gSavedSettings.getString( "DefaultObjectTexture" ))); + mBumpyTextureCtrl->setCommitCallback( boost::bind(&LLPanelFace::onCommitMaterialTexture, this, _2) ); + mBumpyTextureCtrl->setOnCancelCallback( boost::bind(&LLPanelFace::onCancelMaterialTexture, this, _2) ); + mBumpyTextureCtrl->setOnSelectCallback( boost::bind(&LLPanelFace::onSelectMaterialTexture, this, _2) ); + mBumpyTextureCtrl->setDragCallback(boost::bind(&LLPanelFace::onDragTexture, this, _2)); + mBumpyTextureCtrl->setOnTextureSelectedCallback(boost::bind(&LLPanelFace::onTextureSelectionChanged, this, _1)); + mBumpyTextureCtrl->setFollowsTop(); + mBumpyTextureCtrl->setFollowsLeft(); + mBumpyTextureCtrl->setImmediateFilterPermMask(PERM_NONE); + mBumpyTextureCtrl->setDnDFilterPermMask(PERM_COPY | PERM_TRANSFER); + } + mColorSwatch = getChild<LLColorSwatchCtrl>("colorswatch"); if(mColorSwatch) { @@ -123,6 +195,15 @@ BOOL LLPanelFace::postBuild() mColorSwatch->setCanApplyImmediately(TRUE); } + mShinyColorSwatch = getChild<LLColorSwatchCtrl>("shinycolorswatch"); + if(mShinyColorSwatch) + { + mShinyColorSwatch->setCommitCallback(boost::bind(&LLPanelFace::onCommitShinyColor, this, _2)); + mShinyColorSwatch->setFollowsTop(); + mShinyColorSwatch->setFollowsLeft(); + mShinyColorSwatch->setCanApplyImmediately(TRUE); + } + mLabelColorTransp = getChild<LLTextBox>("color trans"); if(mLabelColorTransp) { @@ -152,6 +233,20 @@ BOOL LLPanelFace::postBuild() mComboTexGen->setFollows(FOLLOWS_LEFT | FOLLOWS_TOP); } + mComboMatMedia = getChild<LLComboBox>("combobox matmedia"); + if(mComboMatMedia) + { + mComboMatMedia->setCommitCallback(LLPanelFace::onCommitMaterialsMedia,this); + mComboMatMedia->selectNthItem(MATMEDIA_MATERIAL); + } + + mComboMatType = getChild<LLComboBox>("combobox mattype"); + if(mComboMatType) + { + mComboMatType->setCommitCallback(LLPanelFace::onCommitMaterialType, this); + mComboMatType->selectNthItem(MATTYPE_DIFFUSE); + } + mCtrlGlow = getChild<LLSpinCtrl>("glow"); if(mCtrlGlow) { @@ -165,8 +260,12 @@ BOOL LLPanelFace::postBuild() } LLPanelFace::LLPanelFace() -: LLPanel() +: LLPanel(), + mMaterialID(LLMaterialID::null), + mMaterial(LLMaterialPtr()), + mIsAlpha(false) { + USE_TEXTURE = LLTrans::getString("use_texture"); } @@ -197,8 +296,21 @@ void LLPanelFace::sendBump() { LLComboBox* mComboBumpiness = getChild<LLComboBox>("combobox bumpiness"); if(!mComboBumpiness)return; - U8 bump = (U8) mComboBumpiness->getCurrentIndex() & TEM_BUMP_MASK; + U32 bumpiness = mComboBumpiness->getCurrentIndex(); + if (bumpiness < BUMPY_TEXTURE) + { + LL_DEBUGS("Materials") << "clearing bumptexture control" << LL_ENDL; + LLTextureCtrl* bumpytexture_ctrl = getChild<LLTextureCtrl>("bumpytexture control"); + bumpytexture_ctrl->clear(); + LLSD dummy_data; + onSelectMaterialTexture(dummy_data); + } + U8 bump = (U8) bumpiness & TEM_BUMP_MASK; LLSelectMgr::getInstance()->selectionSetBumpmap( bump ); + + //refresh material state (in case this change impacts material params) + LLSD dummy_data; + onCommitMaterialTexture(dummy_data); } void LLPanelFace::sendTexGen() @@ -213,7 +325,13 @@ void LLPanelFace::sendShiny() { LLComboBox* mComboShininess = getChild<LLComboBox>("combobox shininess"); if(!mComboShininess)return; - U8 shiny = (U8) mComboShininess->getCurrentIndex() & TEM_SHINY_MASK; + U32 shininess = mComboShininess->getCurrentIndex(); + if (shininess < SHINY_TEXTURE) + { + LLTextureCtrl* texture_ctrl = getChild<LLTextureCtrl>("shinytexture control"); + texture_ctrl->setImageAssetID(LLUUID()); + } + U8 shiny = (U8) shininess & TEM_SHINY_MASK; LLSelectMgr::getInstance()->selectionSetShiny( shiny ); } @@ -268,22 +386,16 @@ struct LLPanelFaceSetTEFunctor : public LLSelectedTEFunctor LLSpinCtrl* ctrlTexOffsetS = mPanel->getChild<LLSpinCtrl>("TexOffsetU"); LLSpinCtrl* ctrlTexOffsetT = mPanel->getChild<LLSpinCtrl>("TexOffsetV"); LLSpinCtrl* ctrlTexRotation = mPanel->getChild<LLSpinCtrl>("TexRot"); - LLCheckBoxCtrl* checkFlipScaleS = mPanel->getChild<LLCheckBoxCtrl>("checkbox flip s"); - LLCheckBoxCtrl* checkFlipScaleT = mPanel->getChild<LLCheckBoxCtrl>("checkbox flip t"); LLComboBox* comboTexGen = mPanel->getChild<LLComboBox>("combobox texgen"); llassert(comboTexGen); llassert(object); if (ctrlTexScaleS) { - valid = !ctrlTexScaleS->getTentative() || !checkFlipScaleS->getTentative(); + valid = !ctrlTexScaleS->getTentative(); // || !checkFlipScaleS->getTentative(); if (valid) { value = ctrlTexScaleS->get(); - if( checkFlipScaleS->get() ) - { - value = -value; - } if (comboTexGen && comboTexGen->getCurrentIndex() == 1) { @@ -295,14 +407,14 @@ struct LLPanelFaceSetTEFunctor : public LLSelectedTEFunctor if (ctrlTexScaleT) { - valid = !ctrlTexScaleT->getTentative() || !checkFlipScaleT->getTentative(); + valid = !ctrlTexScaleT->getTentative(); // || !checkFlipScaleT->getTentative(); if (valid) { value = ctrlTexScaleT->get(); - if( checkFlipScaleT->get() ) - { - value = -value; - } + //if( checkFlipScaleT->get() ) + //{ + // value = -value; + //} if (comboTexGen && comboTexGen->getCurrentIndex() == 1) { @@ -482,7 +594,7 @@ void LLPanelFace::sendTextureInfo() } void LLPanelFace::getState() -{ +{ //set state of UI to match state of texture entry(ies) (calls setEnabled, setValue, etc, but NOT setVisible) LLViewerObject* objectp = LLSelectMgr::getInstance()->getSelection()->getFirstObject(); if( objectp @@ -492,25 +604,53 @@ void LLPanelFace::getState() 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); getChildView("button align")->setEnabled(editable); - - //if ( LLMediaEngine::getInstance()->getMediaRenderer () ) - // if ( LLMediaEngine::getInstance()->getMediaRenderer ()->isLoaded () ) - // { - // - // //mLabelTexAutoFix->setEnabled ( editable ); - // - // //mBtnAutoFix->setEnabled ( editable ); - // } - getChildView("button apply")->setEnabled(editable); + + LLComboBox* combobox_matmedia = getChild<LLComboBox>("combobox matmedia"); + if (combobox_matmedia) + { + if (combobox_matmedia->getCurrentIndex() < MATMEDIA_MATERIAL) + { + combobox_matmedia->selectNthItem(MATMEDIA_MATERIAL); + } + } + else + { + llwarns << "failed getChild for 'combobox matmedia'" << llendl; + } + getChildView("combobox matmedia")->setEnabled(editable); + + LLComboBox* combobox_mattype = getChild<LLComboBox>("combobox mattype"); + if (combobox_mattype) + { + if (combobox_mattype->getCurrentIndex() < MATTYPE_DIFFUSE) + { + combobox_mattype->selectNthItem(MATTYPE_DIFFUSE); + } + } + else + { + LL_WARNS("Materials") << "failed getChild for 'combobox mattype'" << LL_ENDL; + } + getChildView("combobox mattype")->setEnabled(editable); + + onCommitMaterialsMedia(NULL, this); bool identical; + bool identical_diffuse; + bool identical_norm; + bool identical_spec; + LLTextureCtrl* texture_ctrl = getChild<LLTextureCtrl>("texture control"); + LLTextureCtrl* shinytexture_ctrl = getChild<LLTextureCtrl>("shinytexture control"); + LLTextureCtrl* bumpytexture_ctrl = getChild<LLTextureCtrl>("bumpytexture control"); + LLUUID id; + LLUUID normmap_id; + LLUUID specmap_id; + // Texture { - LLUUID id; struct f1 : public LLSelectedTEGetFunctor<LLUUID> { LLUUID get(LLViewerObject* object, S32 te_index) @@ -539,46 +679,206 @@ void LLPanelFace::getState() return id; } } func; - identical = LLSelectMgr::getInstance()->getSelection()->getSelectedTEValue( &func, id ); + identical_diffuse = LLSelectMgr::getInstance()->getSelection()->getSelectedTEValue( &func, id ); + + // Normal map + struct norm_get : public LLSelectedTEGetFunctor<LLUUID> + { + LLUUID get(LLViewerObject* object, S32 te_index) + { + LLUUID id; + + LLMaterial* mat = object->getTE(te_index)->getMaterialParams().get(); + + if (mat) + { + id = mat->getNormalID(); + } + + return id; + } + } norm_get_func; + identical_norm = LLSelectMgr::getInstance()->getSelection()->getSelectedTEValue( &norm_get_func, normmap_id ); + + // Specular map + struct spec_get : public LLSelectedTEGetFunctor<LLUUID> + { + LLUUID get(LLViewerObject* object, S32 te_index) + { + LLUUID id; + + LLMaterial* mat = object->getTE(te_index)->getMaterialParams().get(); + + if (mat) + { + id = mat->getSpecularID(); + } + + return id; + } + } spec_get_func; + identical_spec = LLSelectMgr::getInstance()->getSelection()->getSelectedTEValue( &spec_get_func, specmap_id ); + + mIsAlpha = FALSE; + LLGLenum image_format; + struct f2 : public LLSelectedTEGetFunctor<LLGLenum> + { + LLGLenum get(LLViewerObject* object, S32 te_index) + { + LLGLenum image_format = GL_RGB; + + LLViewerTexture* image = object->getTEImage(te_index); + if (image) image_format = image->getPrimaryFormat(); + return image_format; + } + } func2; + LLSelectMgr::getInstance()->getSelection()->getSelectedTEValue( &func2, image_format ); + + mIsAlpha = FALSE; + switch (image_format) + { + case GL_RGBA: + case GL_ALPHA: + { + mIsAlpha = TRUE; + } + break; + + case GL_RGB: break; + default: + { + llwarns << "Unexpected tex format in LLPanelFace...resorting to no alpha" << llendl; + } + break; + } if(LLViewerMedia::textureHasMedia(id)) { - getChildView("textbox autofix")->setEnabled(editable); getChildView("button align")->setEnabled(editable); } - if (identical) + // Specular map + struct alpha_get : public LLSelectedTEGetFunctor<U8> { - // All selected have the same texture - if(texture_ctrl) + U8 get(LLViewerObject* object, S32 te_index) + { + U8 ret = 1; + + LLMaterial* mat = object->getTE(te_index)->getMaterialParams().get(); + + if (mat) { - texture_ctrl->setTentative( FALSE ); - texture_ctrl->setEnabled( editable ); - texture_ctrl->setImageAssetID( id ); + ret = mat->getDiffuseAlphaMode(); } - } - else + + return ret; + } + } alpha_get_func; + + U8 alpha_mode = 1; + LLSelectMgr::getInstance()->getSelection()->getSelectedTEValue( &alpha_get_func, alpha_mode); + { - if(texture_ctrl) + LLCtrlSelectionInterface* combobox_alphamode = + childGetSelectionInterface("combobox alphamode"); + + if (combobox_alphamode) { - if( id.isNull() ) - { - // None selected - texture_ctrl->setTentative( FALSE ); - texture_ctrl->setEnabled( FALSE ); - texture_ctrl->setImageAssetID( LLUUID::null ); - } - else + if (!mIsAlpha) { - // Tentative: multiple selected with different textures - texture_ctrl->setTentative( TRUE ); - texture_ctrl->setEnabled( editable ); - texture_ctrl->setImageAssetID( id ); + alpha_mode = LLMaterial::DIFFUSE_ALPHA_MODE_NONE; } + + combobox_alphamode->selectNthItem(alpha_mode); + } + else + { + llwarns << "failed childGetSelectionInterface for 'combobox alphamode'" << llendl; + } + + updateAlphaControls(getChild<LLComboBox>("combobox alphamode"),this); + } + + if(texture_ctrl && !texture_ctrl->isPickerShown()) + { + if (identical_diffuse) + { + texture_ctrl->setTentative( FALSE ); + texture_ctrl->setEnabled( editable ); + texture_ctrl->setImageAssetID( id ); + getChildView("combobox alphamode")->setEnabled(editable && mIsAlpha); + getChildView("label alphamode")->setEnabled(editable && mIsAlpha); + getChildView("maskcutoff")->setEnabled(editable && mIsAlpha); + getChildView("label maskcutoff")->setEnabled(editable && mIsAlpha); + } + else if (id.isNull()) + { + // None selected + texture_ctrl->setTentative( FALSE ); + texture_ctrl->setEnabled( FALSE ); + texture_ctrl->setImageAssetID( LLUUID::null ); + getChildView("combobox alphamode")->setEnabled( FALSE ); + getChildView("label alphamode")->setEnabled( FALSE ); + getChildView("maskcutoff")->setEnabled( FALSE); + getChildView("label maskcutoff")->setEnabled( FALSE ); + } + else + { + // Tentative: multiple selected with different textures + texture_ctrl->setTentative( TRUE ); + texture_ctrl->setEnabled( editable ); + texture_ctrl->setImageAssetID( id ); + getChildView("combobox alphamode")->setEnabled(editable && mIsAlpha); + getChildView("label alphamode")->setEnabled(editable && mIsAlpha); + getChildView("maskcutoff")->setEnabled(editable && mIsAlpha); + getChildView("label maskcutoff")->setEnabled(editable && mIsAlpha); + } + } + + if (shinytexture_ctrl && !shinytexture_ctrl->isPickerShown()) + { + if (identical_spec) + { + shinytexture_ctrl->setTentative( FALSE ); + shinytexture_ctrl->setEnabled( editable ); + shinytexture_ctrl->setImageAssetID( specmap_id ); + } + else if (specmap_id.isNull()) + { + shinytexture_ctrl->setTentative( FALSE ); + shinytexture_ctrl->setEnabled( FALSE ); + shinytexture_ctrl->setImageAssetID( LLUUID::null ); + } + else + { + shinytexture_ctrl->setTentative( TRUE ); + shinytexture_ctrl->setEnabled( editable ); + shinytexture_ctrl->setImageAssetID( specmap_id ); + } + } + + if (bumpytexture_ctrl && !bumpytexture_ctrl->isPickerShown()) + { + if (identical_norm) + { + bumpytexture_ctrl->setTentative( FALSE ); + bumpytexture_ctrl->setEnabled( editable ); + bumpytexture_ctrl->setImageAssetID( normmap_id ); + } + else if (normmap_id.isNull()) + { + bumpytexture_ctrl->setTentative( FALSE ); + bumpytexture_ctrl->setEnabled( FALSE ); + bumpytexture_ctrl->setImageAssetID( LLUUID::null ); + } + else + { + bumpytexture_ctrl->setTentative( TRUE ); + bumpytexture_ctrl->setEnabled( editable ); + bumpytexture_ctrl->setImageAssetID( normmap_id ); } } } - // planar align bool align_planar = false; @@ -617,6 +917,26 @@ void LLPanelFace::getState() } } + // Needs to be public and before tex scale settings below to properly reflect + // behavior when in planar vs default texgen modes in the + // NORSPEC-84 et al + // + LLTextureEntry::e_texgen selected_texgen = LLTextureEntry::TEX_GEN_DEFAULT; + bool identical_texgen = true; + bool identical_planar_texgen = false; + + { + struct f11 : public LLSelectedTEGetFunctor<LLTextureEntry::e_texgen> + { + LLTextureEntry::e_texgen get(LLViewerObject* object, S32 face) + { + return (LLTextureEntry::e_texgen)(object->getTE(face)->getTexGen()); + } + } func; + identical_texgen = LLSelectMgr::getInstance()->getSelection()->getSelectedTEValue( &func, selected_texgen ); + identical_planar_texgen = (identical_texgen && (selected_texgen == LLTextureEntry::TEX_GEN_PLANAR)); + } + // Texture scale { F32 scale_s = 1.f; @@ -627,14 +947,68 @@ void LLPanelFace::getState() return object->getTE(face)->mScaleS; } } func; + identical = LLSelectMgr::getInstance()->getSelection()->getSelectedTEValue( &func, scale_s ); identical = align_planar ? identical_planar_aligned : identical; - getChild<LLUICtrl>("TexScaleU")->setValue(editable ? llabs(scale_s) : 0); + + F32 scale_u = editable ? scale_s : 0; + scale_u *= identical_planar_texgen ? 2.0f : 1.0f; + + getChild<LLUICtrl>("TexScaleU")->setValue(scale_u); getChild<LLUICtrl>("TexScaleU")->setTentative(LLSD((BOOL)(!identical))); getChildView("TexScaleU")->setEnabled(editable); - getChild<LLUICtrl>("checkbox flip s")->setValue(LLSD((BOOL)(scale_s < 0 ? TRUE : FALSE ))); - getChild<LLUICtrl>("checkbox flip s")->setTentative(LLSD((BOOL)((!identical) ? TRUE : FALSE ))); - getChildView("checkbox flip s")->setEnabled(editable); + + scale_s = 1.f; + struct f3 : public LLSelectedTEGetFunctor<F32> + { + F32 get(LLViewerObject* object, S32 face) + { + F32 s = 1.f, t = 1.f; + + LLMaterial* mat = object->getTE(face)->getMaterialParams().get(); + if (mat) + { + mat->getSpecularRepeat(s, t); + } + return s; + } + } shiny_func; + + identical = LLSelectMgr::getInstance()->getSelection()->getSelectedTEValue( &shiny_func, scale_s ); + identical = align_planar ? identical_planar_aligned : identical; + + F32 scale_s_value = editable ? scale_s : 0; + scale_s_value *= identical_planar_texgen ? 2.0f : 1.0f; + + getChild<LLUICtrl>("shinyScaleU")->setValue(scale_s_value); + getChild<LLUICtrl>("shinyScaleU")->setTentative(LLSD((BOOL)(!identical))); + getChildView("shinyScaleU")->setEnabled(editable && specmap_id.notNull()); + + scale_s = 1.f; + struct f4 : public LLSelectedTEGetFunctor<F32> + { + F32 get(LLViewerObject* object, S32 face) + { + F32 s = 1.f, t = 1.f; + + LLMaterial* mat = object->getTE(face)->getMaterialParams().get(); + if (mat) + { + mat->getNormalRepeat(s, t); + } + return s; + } + } bump_func; + + identical = LLSelectMgr::getInstance()->getSelection()->getSelectedTEValue( &bump_func, scale_s ); + identical = align_planar ? identical_planar_aligned : identical; + + scale_s_value = editable ? scale_s : 0; + scale_s_value *= identical_planar_texgen ? 2.0f : 1.0f; + + getChild<LLUICtrl>("bumpyScaleU")->setValue(scale_s_value); + getChild<LLUICtrl>("bumpyScaleU")->setTentative(LLSD((BOOL)(!identical))); + getChildView("bumpyScaleU")->setEnabled(editable && normmap_id.notNull()); } { @@ -649,12 +1023,65 @@ void LLPanelFace::getState() identical = LLSelectMgr::getInstance()->getSelection()->getSelectedTEValue( &func, scale_t ); identical = align_planar ? identical_planar_aligned : identical; - getChild<LLUICtrl>("TexScaleV")->setValue(llabs(editable ? llabs(scale_t) : 0)); + F32 scale_t_value = editable ? scale_t : 0; + scale_t_value *= identical_planar_texgen ? 2.0f : 1.0f; + + getChild<LLUICtrl>("TexScaleV")->setValue(scale_t_value); getChild<LLUICtrl>("TexScaleV")->setTentative(LLSD((BOOL)(!identical))); getChildView("TexScaleV")->setEnabled(editable); - getChild<LLUICtrl>("checkbox flip t")->setValue(LLSD((BOOL)(scale_t< 0 ? TRUE : FALSE ))); - getChild<LLUICtrl>("checkbox flip t")->setTentative(LLSD((BOOL)((!identical) ? TRUE : FALSE ))); - getChildView("checkbox flip t")->setEnabled(editable); + + scale_t = 1.f; + struct f4 : public LLSelectedTEGetFunctor<F32> + { + F32 get(LLViewerObject* object, S32 face) + { + F32 s = 1.f, t = 1.f; + + LLMaterial* mat = object->getTE(face)->getMaterialParams().get(); + if (mat) + { + mat->getSpecularRepeat(s, t); + } + return t; + } + } shiny_func; + + identical = LLSelectMgr::getInstance()->getSelection()->getSelectedTEValue( &shiny_func, scale_t ); + identical = align_planar ? identical_planar_aligned : identical; + + scale_t_value = editable ? scale_t : 0; + scale_t_value *= identical_planar_texgen ? 2.0f : 1.0f; + + getChild<LLUICtrl>("shinyScaleV")->setValue(scale_t_value); + getChild<LLUICtrl>("shinyScaleV")->setTentative(LLSD((BOOL)(!identical))); + getChildView("shinyScaleV")->setEnabled(editable && specmap_id.notNull()); + + scale_t = 1.f; + struct f5 : public LLSelectedTEGetFunctor<F32> + { + F32 get(LLViewerObject* object, S32 face) + { + F32 s = 1.f, t = 1.f; + + LLMaterial* mat = object->getTE(face)->getMaterialParams().get(); + if (mat) + { + mat->getNormalRepeat(s, t); + } + return t; + } + } bump_func; + + identical = LLSelectMgr::getInstance()->getSelection()->getSelectedTEValue( &bump_func, scale_t ); + identical = align_planar ? identical_planar_aligned : identical; + + scale_t_value = editable ? scale_t : 0.0f; + scale_t_value *= identical_planar_texgen ? 2.0f : 1.0f; + + getChild<LLUICtrl>("bumpyScaleV")->setValue(scale_t_value); + getChild<LLUICtrl>("bumpyScaleV")->setTentative(LLSD((BOOL)(!identical))); + getChildView("bumpyScaleV")->setEnabled(editable && normmap_id.notNull()); + } // Texture offset @@ -673,6 +1100,51 @@ void LLPanelFace::getState() getChild<LLUICtrl>("TexOffsetU")->setValue(editable ? offset_s : 0); getChild<LLUICtrl>("TexOffsetU")->setTentative(!identical); getChildView("TexOffsetU")->setEnabled(editable); + + offset_s = 1.f; + struct f3 : public LLSelectedTEGetFunctor<F32> + { + F32 get(LLViewerObject* object, S32 face) + { + F32 s = 0.f, t = 0.f; + + LLMaterial* mat = object->getTE(face)->getMaterialParams().get(); + if (mat) + { + mat->getSpecularOffset(s, t); + } + return s; + } + } shiny_func; + + identical = LLSelectMgr::getInstance()->getSelection()->getSelectedTEValue( &shiny_func, offset_s ); + identical = align_planar ? identical_planar_aligned : identical; + getChild<LLUICtrl>("shinyOffsetU")->setValue(editable ? offset_s : 0); + getChild<LLUICtrl>("shinyOffsetU")->setTentative(LLSD((BOOL)(!identical))); + getChildView("shinyOffsetU")->setEnabled(editable && specmap_id.notNull()); + + offset_s = 1.f; + struct f5 : public LLSelectedTEGetFunctor<F32> + { + F32 get(LLViewerObject* object, S32 face) + { + F32 s = 0.f, t = 0.f; + + LLMaterial* mat = object->getTE(face)->getMaterialParams().get(); + if (mat) + { + mat->getNormalOffset(s, t); + } + return s; + } + } bump_func; + + identical = LLSelectMgr::getInstance()->getSelection()->getSelectedTEValue( &bump_func, offset_s ); + identical = align_planar ? identical_planar_aligned : identical; + + getChild<LLUICtrl>("bumpyOffsetU")->setValue(editable ? offset_s : 0); + getChild<LLUICtrl>("bumpyOffsetU")->setTentative(LLSD((BOOL)(!identical))); + getChildView("bumpyOffsetU")->setEnabled(editable && normmap_id.notNull()); } { @@ -689,6 +1161,52 @@ void LLPanelFace::getState() getChild<LLUICtrl>("TexOffsetV")->setValue(editable ? offset_t : 0); getChild<LLUICtrl>("TexOffsetV")->setTentative(!identical); getChildView("TexOffsetV")->setEnabled(editable); + + + offset_t = 1.f; + struct f3 : public LLSelectedTEGetFunctor<F32> + { + F32 get(LLViewerObject* object, S32 face) + { + F32 s = 1.f, t = 1.f; + + LLMaterial* mat = object->getTE(face)->getMaterialParams().get(); + if (mat) + { + mat->getSpecularOffset(s, t); + } + return t; + } + } shiny_func; + + identical = LLSelectMgr::getInstance()->getSelection()->getSelectedTEValue( &shiny_func, offset_t ); + identical = align_planar ? identical_planar_aligned : identical; + getChild<LLUICtrl>("shinyOffsetV")->setValue(editable ? offset_t : 0); + getChild<LLUICtrl>("shinyOffsetV")->setTentative(LLSD((BOOL)(!identical))); + getChildView("shinyOffsetV")->setEnabled(editable && specmap_id.notNull()); + + offset_t = 1.f; + struct f4 : public LLSelectedTEGetFunctor<F32> + { + F32 get(LLViewerObject* object, S32 face) + { + F32 s = 1.f, t = 1.f; + + LLMaterial* mat = object->getTE(face)->getMaterialParams().get(); + if (mat) + { + mat->getNormalOffset(s, t); + } + return t; + } + } bump_func; + + identical = LLSelectMgr::getInstance()->getSelection()->getSelectedTEValue( &bump_func, offset_t ); + identical = align_planar ? identical_planar_aligned : identical; + + getChild<LLUICtrl>("bumpyOffsetV")->setValue(editable ? offset_t : 0); + getChild<LLUICtrl>("bumpyOffsetV")->setTentative(LLSD((BOOL)(!identical))); + getChildView("bumpyOffsetV")->setEnabled(editable && normmap_id.notNull()); } // Texture rotation @@ -706,9 +1224,59 @@ void LLPanelFace::getState() getChild<LLUICtrl>("TexRot")->setValue(editable ? rotation * RAD_TO_DEG : 0); getChild<LLUICtrl>("TexRot")->setTentative(!identical); getChildView("TexRot")->setEnabled(editable); + + + + rotation = 1.f; + struct f3 : public LLSelectedTEGetFunctor<F32> + { + F32 get(LLViewerObject* object, S32 face) + { + F32 ret = 0.f; + + LLMaterial* mat = object->getTE(face)->getMaterialParams().get(); + if (mat) + { + ret = mat->getSpecularRotation(); + } + return ret; + } + } shiny_func; + + identical = LLSelectMgr::getInstance()->getSelection()->getSelectedTEValue( &shiny_func, rotation ); + identical = align_planar ? identical_planar_aligned : identical; + getChild<LLUICtrl>("shinyRot")->setValue(editable ? rotation * RAD_TO_DEG : 0); + getChild<LLUICtrl>("shinyRot")->setTentative(LLSD((BOOL)(!identical))); + getChildView("shinyRot")->setEnabled(editable && specmap_id.notNull()); + + rotation = 1.f; + struct f4 : public LLSelectedTEGetFunctor<F32> + { + F32 get(LLViewerObject* object, S32 face) + { + F32 ret = 0.f; + + LLMaterial* mat = object->getTE(face)->getMaterialParams().get(); + if (mat) + { + ret = mat->getNormalRotation(); + } + return ret; + } + } bump_func; + + identical = LLSelectMgr::getInstance()->getSelection()->getSelectedTEValue( &bump_func, rotation ); + identical = align_planar ? identical_planar_aligned : identical; + + getChild<LLUICtrl>("bumpyRot")->setValue(editable ? rotation * RAD_TO_DEG : 0); + getChild<LLUICtrl>("bumpyRot")->setTentative(LLSD((BOOL)(!identical))); + getChildView("bumpyRot")->setEnabled(editable && normmap_id.notNull()); } // Color swatch + { + getChildView("color label")->setEnabled(editable); + } LLColorSwatchCtrl* mColorSwatch = getChild<LLColorSwatchCtrl>("colorswatch"); LLColor4 color = LLColor4::white; if(mColorSwatch) @@ -729,6 +1297,7 @@ void LLPanelFace::getState() mColorSwatch->setEnabled( editable ); mColorSwatch->setCanApplyImmediately( editable ); } + // Color transparency { getChildView("color trans")->setEnabled(editable); @@ -758,22 +1327,26 @@ void LLPanelFace::getState() } - // Bump - { - F32 shinyf = 0.f; - struct f9 : public LLSelectedTEGetFunctor<F32> + U8 shiny = 0; + + // Shiny + { + struct f9 : public LLSelectedTEGetFunctor<U8> { - F32 get(LLViewerObject* object, S32 face) + U8 get(LLViewerObject* object, S32 face) { - return (F32)(object->getTE(face)->getShiny()); + return (U8)(object->getTE(face)->getShiny()); } } func; - identical = LLSelectMgr::getInstance()->getSelection()->getSelectedTEValue( &func, shinyf ); + identical = LLSelectMgr::getInstance()->getSelection()->getSelectedTEValue( &func, shiny ); + + LLUUID spec_map_id = getChild<LLTextureCtrl>("shinytexture control")->getImageAssetID(); + LLCtrlSelectionInterface* combobox_shininess = childGetSelectionInterface("combobox shininess"); if (combobox_shininess) { - combobox_shininess->selectNthItem((S32)shinyf); + combobox_shininess->selectNthItem(spec_map_id.isNull() ? (S32)shiny : SHINY_TEXTURE); } else { @@ -782,23 +1355,45 @@ void LLPanelFace::getState() getChildView("combobox shininess")->setEnabled(editable); getChild<LLUICtrl>("combobox shininess")->setTentative(!identical); getChildView("label shininess")->setEnabled(editable); + getChildView("glossiness")->setEnabled(editable); + getChild<LLUICtrl>("glossiness")->setTentative(!identical); + getChildView("label glossiness")->setEnabled(editable); + getChildView("environment")->setEnabled(editable); + getChild<LLUICtrl>("environment")->setTentative(!identical); + getChildView("label environment")->setEnabled(editable); + getChild<LLUICtrl>("shinycolorswatch")->setTentative(!identical); + getChildView("label shinycolor")->setEnabled(editable); } + LLColorSwatchCtrl* mShinyColorSwatch = getChild<LLColorSwatchCtrl>("shinycolorswatch"); + if(mShinyColorSwatch) { - F32 bumpf = 0.f; - struct f10 : public LLSelectedTEGetFunctor<F32> + mShinyColorSwatch->setValid(editable); + mShinyColorSwatch->setEnabled( editable ); + mShinyColorSwatch->setCanApplyImmediately( editable ); + } + + U8 bumpy = 0; + + // Bumpy + { + struct f10 : public LLSelectedTEGetFunctor<U8> { - F32 get(LLViewerObject* object, S32 face) + U8 get(LLViewerObject* object, S32 face) { - return (F32)(object->getTE(face)->getBumpmap()); + return object->getTE(face)->getBumpmap(); } } func; - identical = LLSelectMgr::getInstance()->getSelection()->getSelectedTEValue( &func, bumpf ); - LLCtrlSelectionInterface* combobox_bumpiness = - childGetSelectionInterface("combobox bumpiness"); + identical = LLSelectMgr::getInstance()->getSelection()->getSelectedTEValue( &func, bumpy ); + + LLUUID norm_map_id = getChild<LLTextureCtrl>("bumpytexture control")->getImageAssetID(); + + bumpy = norm_map_id.isNull() ? (S32)bumpy : BUMPY_TEXTURE; + + LLCtrlSelectionInterface* combobox_bumpiness = childGetSelectionInterface("combobox bumpiness"); if (combobox_bumpiness) - { - combobox_bumpiness->selectNthItem((S32)bumpf); + { + combobox_bumpiness->selectNthItem(bumpy); } else { @@ -809,22 +1404,12 @@ void LLPanelFace::getState() getChildView("label bumpiness")->setEnabled(editable); } - { - F32 genf = 0.f; - struct f11 : public LLSelectedTEGetFunctor<F32> - { - F32 get(LLViewerObject* object, S32 face) - { - return (F32)(object->getTE(face)->getTexGen()); - } - } func; - identical = LLSelectMgr::getInstance()->getSelection()->getSelectedTEValue( &func, genf ); - S32 selected_texgen = ((S32) genf) >> TEM_TEX_GEN_SHIFT; + { LLCtrlSelectionInterface* combobox_texgen = childGetSelectionInterface("combobox texgen"); if (combobox_texgen) { - combobox_texgen->selectNthItem(selected_texgen); + combobox_texgen->selectNthItem(((S32)selected_texgen) >> 1); // Maps from enum to combobox entry index } else { @@ -834,45 +1419,40 @@ void LLPanelFace::getState() getChild<LLUICtrl>("combobox texgen")->setTentative(!identical); getChildView("tex gen")->setEnabled(editable); - if (selected_texgen == 1) + if (selected_texgen == LLTextureEntry::TEX_GEN_PLANAR) { - getChild<LLUICtrl>("TexScaleU")->setValue(2.0f * getChild<LLUICtrl>("TexScaleU")->getValue().asReal() ); - getChild<LLUICtrl>("TexScaleV")->setValue(2.0f * getChild<LLUICtrl>("TexScaleV")->getValue().asReal() ); - // EXP-1507 (change label based on the mapping mode) getChild<LLUICtrl>("rpt")->setValue(getString("string repeats per meter")); } else - if (selected_texgen == 0) // FIXME: should not be magic numbers + if (selected_texgen == LLTextureEntry::TEX_GEN_DEFAULT) { getChild<LLUICtrl>("rpt")->setValue(getString("string repeats per face")); } } { - F32 fullbrightf = 0.f; - struct f12 : public LLSelectedTEGetFunctor<F32> + U8 fullbright_flag = 0; + struct f12 : public LLSelectedTEGetFunctor<U8> { - F32 get(LLViewerObject* object, S32 face) + U8 get(LLViewerObject* object, S32 face) { - return (F32)(object->getTE(face)->getFullbright()); + return object->getTE(face)->getFullbright(); } } func; - identical = LLSelectMgr::getInstance()->getSelection()->getSelectedTEValue( &func, fullbrightf ); + identical = LLSelectMgr::getInstance()->getSelection()->getSelectedTEValue( &func, fullbright_flag ); - getChild<LLUICtrl>("checkbox fullbright")->setValue((S32)fullbrightf); + getChild<LLUICtrl>("checkbox fullbright")->setValue((S32)(fullbright_flag != 0)); getChildView("checkbox fullbright")->setEnabled(editable); getChild<LLUICtrl>("checkbox fullbright")->setTentative(!identical); } - // Repeats per meter label - { - getChildView("rpt")->setEnabled(editable); - } - // Repeats per meter { - F32 repeats = 1.f; + F32 repeats_diff = 1.f; + F32 repeats_norm = 1.f; + F32 repeats_spec = 1.f; + struct f13 : public LLSelectedTEGetFunctor<F32> { F32 get(LLViewerObject* object, S32 face) @@ -882,22 +1462,136 @@ void LLPanelFace::getState() // BUG: Only repeats along S axis // BUG: Only works for boxes. LLPrimitive::getTESTAxes(face, &s_axis, &t_axis); - return object->getTE(face)->mScaleS / object->getScale().mV[s_axis]; + F32 repeats_s = object->getTE(face)->mScaleS / object->getScale().mV[s_axis]; + F32 repeats_t = object->getTE(face)->mScaleT / object->getScale().mV[t_axis]; + return llmax(repeats_s, repeats_t); } - } func; - identical = LLSelectMgr::getInstance()->getSelection()->getSelectedTEValue( &func, repeats ); + + } func_diff; + bool identical_diff_repeats = LLSelectMgr::getInstance()->getSelection()->getSelectedTEValue( &func_diff, repeats_diff ); + + struct f14 : public LLSelectedTEGetFunctor<F32> + { + F32 get(LLViewerObject* object, S32 face) + { + LLMaterial* mat = object->getTE(face)->getMaterialParams().get(); + U32 s_axis = VX; + U32 t_axis = VY; + F32 repeats_s = 1.0f; + F32 repeats_t = 1.0f; + if (mat) + { + mat->getNormalRepeat(repeats_s, repeats_t); + repeats_s /= object->getScale().mV[s_axis]; + repeats_t /= object->getScale().mV[t_axis]; + } + return llmax(repeats_s, repeats_t); + } + + } func_norm; + BOOL identical_norm_repeats = LLSelectMgr::getInstance()->getSelection()->getSelectedTEValue( &func_norm, repeats_norm ); + + struct f15 : public LLSelectedTEGetFunctor<F32> + { + F32 get(LLViewerObject* object, S32 face) + { + LLMaterial* mat = object->getTE(face)->getMaterialParams().get(); + U32 s_axis = VX; + U32 t_axis = VY; + F32 repeats_s = 1.0f; + F32 repeats_t = 1.0f; + if (mat) + { + mat->getSpecularRepeat(repeats_s, repeats_t); + repeats_s /= object->getScale().mV[s_axis]; + repeats_t /= object->getScale().mV[t_axis]; + } + return llmax(repeats_s, repeats_t); + } + + } func_spec; + BOOL identical_spec_repeats = LLSelectMgr::getInstance()->getSelection()->getSelectedTEValue( &func_spec, repeats_spec ); - getChild<LLUICtrl>("rptctrl")->setValue(editable ? repeats : 0); - getChild<LLUICtrl>("rptctrl")->setTentative(!identical); + LLComboBox* mComboTexGen = getChild<LLComboBox>("combobox texgen"); if (mComboTexGen) { - BOOL enabled = editable && (!mComboTexGen || mComboTexGen->getCurrentIndex() != 1); + S32 index = mComboTexGen ? mComboTexGen->getCurrentIndex() : 0; + BOOL enabled = editable && (index != 1); + BOOL identical = true; + F32 repeats = 1.0f; + + U32 material_type = combobox_mattype->getCurrentIndex(); + switch (material_type) + { + default: + case MATTYPE_DIFFUSE: + { + enabled = editable && !id.isNull(); + identical = identical_diff_repeats; + repeats = repeats_diff; + } + break; + + case MATTYPE_SPECULAR: + { + enabled = (editable && ((shiny == SHINY_TEXTURE) && !specmap_id.isNull())); + identical = identical_spec_repeats; + repeats = repeats_spec * (identical_planar_texgen ? 2.0f : 1.0f); + } + break; + + case MATTYPE_NORMAL: + { + enabled = (editable && ((bumpy == BUMPY_TEXTURE) && !normmap_id.isNull())); + identical = identical_norm_repeats; + repeats = repeats_norm * (identical_planar_texgen ? 2.0f : 1.0f); + } + break; + } + getChildView("rptctrl")->setEnabled(enabled); - getChildView("button apply")->setEnabled(enabled); + getChild<LLUICtrl>("rptctrl")->setValue(editable ? repeats : 1.0f); + getChild<LLUICtrl>("rptctrl")->setTentative(!identical); } } + // Materials + { + mMaterialID = LLMaterialID::null; + mMaterial = NULL; + + struct f1 : public LLSelectedTEGetFunctor<LLMaterialID> + { + LLMaterialID get(LLViewerObject* object, S32 te_index) + { + LLMaterialID material_id; + + return object->getTE(te_index)->getMaterialID(); + } + } func; + + LLObjectSelectionHandle sel = LLSelectMgr::getInstance()->getSelection(); + LLSelectNode* node = sel->getFirstNode(); + if (node) + { + int selected_te = node->getLastSelectedTE(); + if (selected_te >= 0) + { + mMaterialID = node->getObject()->getTE(selected_te)->getMaterialID(); + } + } + + llinfos << "Material ID returned: '" << mMaterialID.asString() << "', isNull? " << (mMaterialID.isNull()?"TRUE":"FALSE") << llendl; + + if (!mMaterialID.isNull() && editable) + { + llinfos << "Requesting material ID " << mMaterialID.asString() << llendl; + LLMaterialMgr::getInstance()->get(objectp->getRegion()->getRegionID(),mMaterialID,boost::bind(&LLPanelFace::onMaterialLoaded, this, _1, _2)); + } + + } + // Set variable values for numeric expressions LLCalc* calcp = LLCalc::getInstance(); calcp->setVar(LLCalc::TEX_U_SCALE, childGetValue("TexScaleU").asReal()); @@ -935,13 +1629,11 @@ void LLPanelFace::getState() getChildView("label shininess")->setEnabled(FALSE); getChildView("label bumpiness")->setEnabled(FALSE); - getChildView("textbox autofix")->setEnabled(FALSE); - getChildView("button align")->setEnabled(FALSE); - getChildView("button apply")->setEnabled(FALSE); //getChildView("has media")->setEnabled(FALSE); //getChildView("media info set")->setEnabled(FALSE); - + + onCommitMaterialsMedia(NULL,this); // Set variable values for numeric expressions LLCalc* calcp = LLCalc::getInstance(); @@ -958,9 +1650,277 @@ void LLPanelFace::getState() void LLPanelFace::refresh() { + LL_DEBUGS("Materials") << LL_ENDL; getState(); } +void LLPanelFace::onMaterialLoaded(const LLMaterialID& material_id, const LLMaterialPtr material) +{ //laying out UI based on material parameters (calls setVisible on various components) + LL_DEBUGS("Materials") << "material id " << material_id.asString() << " data " << material->asLLSD() << LL_ENDL; + + //make a local copy of the material for editing + // (prevents local edits from overwriting client state on shared materials) + mMaterial = new LLMaterial(*material); + mMaterialID = material_id; + + // Alpha + LLCtrlSelectionInterface* combobox_alphamode = + childGetSelectionInterface("combobox alphamode"); + if (combobox_alphamode) + { + combobox_alphamode->selectNthItem(material->getDiffuseAlphaMode()); + } + else + { + llwarns << "failed childGetSelectionInterface for 'combobox alphamode'" << llendl; + } + getChild<LLUICtrl>("maskcutoff")->setValue(material->getAlphaMaskCutoff()); + updateAlphaControls(getChild<LLComboBox>("combobox alphamode"),this); + + LLTextureEntry::e_texgen selected_texgen = LLTextureEntry::TEX_GEN_DEFAULT; + bool identical_texgen = true; + bool identical_planar_texgen = false; + + struct f44 : public LLSelectedTEGetFunctor<LLTextureEntry::e_texgen> + { + LLTextureEntry::e_texgen get(LLViewerObject* object, S32 face) + { + return (LLTextureEntry::e_texgen)(object->getTE(face)->getTexGen()); + } + } func; + identical_texgen = LLSelectMgr::getInstance()->getSelection()->getSelectedTEValue( &func, selected_texgen ); + identical_planar_texgen = (identical_texgen && (selected_texgen == LLTextureEntry::TEX_GEN_PLANAR)); + + // Shiny (specular) + F32 offset_x, offset_y, repeat_x, repeat_y, rot; + LLTextureCtrl* texture_ctrl = getChild<LLTextureCtrl>("shinytexture control"); + texture_ctrl->setImageAssetID(material->getSpecularID()); + LLComboBox* combobox_shininess = getChild<LLComboBox>("combobox shininess"); + if (!material->getSpecularID().isNull()) + { + material->getSpecularOffset(offset_x,offset_y); + material->getSpecularRepeat(repeat_x,repeat_y); + + if (identical_planar_texgen) + { + repeat_x *= 2.0f; + repeat_y *= 2.0f; + } + + rot = material->getSpecularRotation(); + getChild<LLUICtrl>("shinyScaleU")->setValue(repeat_x); + getChild<LLUICtrl>("shinyScaleV")->setValue(repeat_y); + getChild<LLUICtrl>("shinyRot")->setValue(rot*RAD_TO_DEG); + getChild<LLUICtrl>("shinyOffsetU")->setValue(offset_x); + getChild<LLUICtrl>("shinyOffsetV")->setValue(offset_y); + getChild<LLUICtrl>("glossiness")->setValue(material->getSpecularLightExponent()); + getChild<LLUICtrl>("environment")->setValue(material->getEnvironmentIntensity()); + } + updateShinyControls(combobox_shininess,this, true); + + // Assert desired colorswatch color to match material AFTER updateShinyControls + // to avoid getting overwritten with the default on some UI state changes. + // + if (!material->getSpecularID().isNull()) + { + getChild<LLColorSwatchCtrl>("shinycolorswatch")->setOriginal(material->getSpecularLightColor()); + getChild<LLColorSwatchCtrl>("shinycolorswatch")->set(material->getSpecularLightColor(),TRUE); + } + + // Bumpy (normal) + texture_ctrl = getChild<LLTextureCtrl>("bumpytexture control"); + texture_ctrl->setImageAssetID(material->getNormalID()); + LLComboBox* combobox_bumpiness = getChild<LLComboBox>("combobox bumpiness"); + if (!material->getNormalID().isNull()) + { + material->getNormalOffset(offset_x,offset_y); + material->getNormalRepeat(repeat_x,repeat_y); + + if (identical_planar_texgen) + { + repeat_x *= 2.0f; + repeat_y *= 2.0f; + } + + rot = material->getNormalRotation(); + getChild<LLUICtrl>("bumpyScaleU")->setValue(repeat_x); + getChild<LLUICtrl>("bumpyScaleV")->setValue(repeat_y); + getChild<LLUICtrl>("bumpyRot")->setValue(rot*RAD_TO_DEG); + getChild<LLUICtrl>("bumpyOffsetU")->setValue(offset_x); + getChild<LLUICtrl>("bumpyOffsetV")->setValue(offset_y); + } + updateBumpyControls(combobox_bumpiness,this, true); +} + +void LLPanelFace::updateMaterial() +{ // assign current state of UI to material definition for submit to sim + LL_DEBUGS("Materials") << "Entered." << LL_ENDL; + LLComboBox* comboAlphaMode = getChild<LLComboBox>("combobox alphamode"); + LLComboBox* comboBumpiness = getChild<LLComboBox>("combobox bumpiness"); + LLComboBox* comboShininess = getChild<LLComboBox>("combobox shininess"); + if (!comboAlphaMode || !comboBumpiness || !comboShininess) + { + return; + } + U32 alpha_mode = comboAlphaMode->getCurrentIndex(); + U32 bumpiness = comboBumpiness->getCurrentIndex(); + U32 shininess = comboShininess->getCurrentIndex(); + + LLTextureEntry::e_texgen selected_texgen = LLTextureEntry::TEX_GEN_DEFAULT; + struct f45 : public LLSelectedTEGetFunctor<LLTextureEntry::e_texgen> + { + LLTextureEntry::e_texgen get(LLViewerObject* object, S32 face) + { + return (LLTextureEntry::e_texgen)(object->getTE(face)->getTexGen()); + } + } func; + bool identical_texgen = LLSelectMgr::getInstance()->getSelection()->getSelectedTEValue( &func, selected_texgen ); + bool identical_planar_texgen = (identical_texgen && (selected_texgen == LLTextureEntry::TEX_GEN_PLANAR)); + + if ((mIsAlpha && (alpha_mode != LLMaterial::DIFFUSE_ALPHA_MODE_BLEND)) + || (bumpiness == BUMPY_TEXTURE) + || (shininess == SHINY_TEXTURE)) + { + // The user's specified something that needs a material. + bool new_material = false; + if (!mMaterial) + { + new_material = true; + mMaterial = LLMaterialPtr(new LLMaterial()); + } + + LLMaterialPtr material_to_set = mMaterial; + + bool subselection = false; + + // If we're editing a single face and not the entire material for an object, + // we need to clone the material so that our changes to the material's settings + // don't automatically propagate to the non-selected faces + // NORSPEC-92 + // + LLObjectSelectionHandle sel = LLSelectMgr::getInstance()->getSelection(); + LLSelectNode* node = sel->getFirstNode(); + if (node) + { + if (node->getTESelectMask() != TE_SELECT_MASK_ALL) + { + llinfos << "Cloning material to apply to subselection." << llendl; + material_to_set = new LLMaterial(mMaterial->asLLSD()); + subselection = true; + } + else + { + llinfos << "Apply material change to whole selection." << llendl; + } + } + + llassert(!material_to_set.isNull()); + + material_to_set->setDiffuseAlphaMode(getChild<LLComboBox>("combobox alphamode")->getCurrentIndex()); + material_to_set->setAlphaMaskCutoff((U8)(getChild<LLUICtrl>("maskcutoff")->getValue().asInteger())); + + LLUUID norm_map_id = getChild<LLTextureCtrl>("bumpytexture control")->getImageAssetID(); + if (!norm_map_id.isNull()) + { + LL_DEBUGS("Materials") << "Setting bumpy texture, bumpiness = " << bumpiness << LL_ENDL; + material_to_set->setNormalID(norm_map_id); + + F32 bumpy_scale_u = getChild<LLUICtrl>("bumpyScaleU")->getValue().asReal(); + F32 bumpy_scale_v = getChild<LLUICtrl>("bumpyScaleV")->getValue().asReal(); + + if (identical_planar_texgen) + { + bumpy_scale_u *= 0.5f; + bumpy_scale_v *= 0.5f; + } + + material_to_set->setNormalOffset(getChild<LLUICtrl>("bumpyOffsetU")->getValue().asReal(), + getChild<LLUICtrl>("bumpyOffsetV")->getValue().asReal()); + material_to_set->setNormalRepeat(bumpy_scale_u, bumpy_scale_v); + material_to_set->setNormalRotation(getChild<LLUICtrl>("bumpyRot")->getValue().asReal()*DEG_TO_RAD); + } + else + { + LL_DEBUGS("Materials") << "Removing bumpy texture, bumpiness = " << bumpiness << LL_ENDL; + material_to_set->setNormalID(LLUUID()); + material_to_set->setNormalOffset(0.0f,0.0f); + material_to_set->setNormalRepeat(1.0f,1.0f); + material_to_set->setNormalRotation(0.0f); + } + + LLUUID spec_map_id = getChild<LLTextureCtrl>("shinytexture control")->getImageAssetID(); + + if (!spec_map_id.isNull()) + { + LL_DEBUGS("Materials") << "Setting shiny texture, shininess = " << shininess << LL_ENDL; + material_to_set->setSpecularID(spec_map_id); + material_to_set->setSpecularOffset(getChild<LLUICtrl>("shinyOffsetU")->getValue().asReal(), + getChild<LLUICtrl>("shinyOffsetV")->getValue().asReal()); + + F32 shiny_scale_u = getChild<LLUICtrl>("shinyScaleU")->getValue().asReal(); + F32 shiny_scale_v = getChild<LLUICtrl>("shinyScaleV")->getValue().asReal(); + + if (identical_planar_texgen) + { + shiny_scale_u *= 0.5f; + shiny_scale_v *= 0.5f; + } + + material_to_set->setSpecularRepeat(shiny_scale_u, shiny_scale_v); + material_to_set->setSpecularRotation(getChild<LLUICtrl>("shinyRot")->getValue().asReal()*DEG_TO_RAD); + + //override shininess to 0.2f if this is a new material + if (!new_material) + { + material_to_set->setSpecularLightColor(getChild<LLColorSwatchCtrl>("shinycolorswatch")->get()); + material_to_set->setSpecularLightExponent(getChild<LLUICtrl>("glossiness")->getValue().asInteger()); + material_to_set->setEnvironmentIntensity(getChild<LLUICtrl>("environment")->getValue().asInteger()); + } + } + else + { + LL_DEBUGS("Materials") << "Removing shiny texture, shininess = " << shininess << LL_ENDL; + material_to_set->setSpecularID(LLUUID()); + material_to_set->setSpecularOffset(0.0f,0.0f); + material_to_set->setSpecularRepeat(1.0f,1.0f); + material_to_set->setSpecularRotation(0.0f); + material_to_set->setSpecularLightColor(LLMaterial::DEFAULT_SPECULAR_LIGHT_COLOR); + material_to_set->setSpecularLightExponent(LLMaterial::DEFAULT_SPECULAR_LIGHT_EXPONENT); + material_to_set->setEnvironmentIntensity(0); + } + + LL_DEBUGS("Materials") << "Updating material: " << material_to_set->asLLSD() << LL_ENDL; + + + if (node && node->getObject() && node->getObject()->permModify() && subselection) + { + int selected_te = node->getLastSelectedTE(); + if (selected_te >= 0) + { + LLMaterialMgr::getInstance()->put(node->getObject()->getID(),selected_te,*material_to_set); + node->getObject()->getTE(selected_te)->setMaterialParams(material_to_set); + node->getObject()->sendTEUpdate(); + } + } + else + { + LLSelectMgr::getInstance()->selectionSetMaterial( material_to_set ); + } + } + else + { + // The user has specified settings that don't need a material. + if (mMaterial || !mMaterialID.isNull()) + { + LL_DEBUGS("Materials") << "Resetting material entry" << LL_ENDL; + mMaterial = NULL; + mMaterialID = LLMaterialID::null; + // Delete existing material entry... + LLSelectMgr::getInstance()->selectionRemoveMaterial(); + } + } +} + // // Static functions // @@ -977,6 +1937,11 @@ void LLPanelFace::onCommitColor(const LLSD& data) sendColor(); } +void LLPanelFace::onCommitShinyColor(const LLSD& data) +{ + updateMaterial(); +} + void LLPanelFace::onCommitAlpha(const LLSD& data) { sendAlpha(); @@ -994,10 +1959,136 @@ void LLPanelFace::onSelectColor(const LLSD& data) } // static +void LLPanelFace::onCommitMaterialsMedia(LLUICtrl* ctrl, void* userdata) +{ + LLPanelFace* self = (LLPanelFace*) userdata; + LLComboBox* combo_matmedia = self->getChild<LLComboBox>("combobox matmedia"); + LLComboBox* combo_mattype = self->getChild<LLComboBox>("combobox mattype"); + LLComboBox* combo_shininess = self->getChild<LLComboBox>("combobox shininess"); + LLComboBox* combo_bumpiness = self->getChild<LLComboBox>("combobox bumpiness"); + if (!combo_mattype || !combo_matmedia || !combo_shininess || !combo_bumpiness) + { + LL_WARNS("Materials") << "Combo box not found...exiting." << LL_ENDL; + return; + } + U32 materials_media = combo_matmedia->getCurrentIndex(); + U32 material_type = combo_mattype->getCurrentIndex(); + bool show_media = (materials_media == MATMEDIA_MEDIA) && combo_matmedia->getEnabled(); + bool show_texture = (show_media || ((material_type == MATTYPE_DIFFUSE) && combo_matmedia->getEnabled())); + bool show_bumpiness = (!show_media) && (material_type == MATTYPE_NORMAL) && combo_matmedia->getEnabled(); + bool show_shininess = (!show_media) && (material_type == MATTYPE_SPECULAR) && combo_matmedia->getEnabled(); + self->getChildView("combobox mattype")->setVisible(!show_media); + self->getChildView("rptctrl")->setVisible(show_texture); + + // Media controls + self->getChildView("media_info")->setVisible(show_media); + self->getChildView("add_media")->setVisible(show_media); + self->getChildView("delete_media")->setVisible(show_media); + self->getChildView("button align")->setVisible(show_media); + + // Diffuse texture controls + self->getChildView("texture control")->setVisible(show_texture && !show_media); + self->getChildView("label alphamode")->setVisible(show_texture && !show_media); + self->getChildView("combobox alphamode")->setVisible(show_texture && !show_media); + self->getChildView("label maskcutoff")->setVisible(false); + self->getChildView("maskcutoff")->setVisible(false); + if (show_texture && !show_media) + { + updateAlphaControls(ctrl, userdata); + } + self->getChildView("TexScaleU")->setVisible(show_texture); + self->getChildView("TexScaleV")->setVisible(show_texture); + self->getChildView("TexRot")->setVisible(show_texture); + self->getChildView("TexOffsetU")->setVisible(show_texture); + self->getChildView("TexOffsetV")->setVisible(show_texture); + + // Specular map controls + self->getChildView("shinytexture control")->setVisible(show_shininess); + self->getChildView("combobox shininess")->setVisible(show_shininess); + self->getChildView("label shininess")->setVisible(show_shininess); + self->getChildView("label glossiness")->setVisible(false); + self->getChildView("glossiness")->setVisible(false); + self->getChildView("label environment")->setVisible(false); + self->getChildView("environment")->setVisible(false); + self->getChildView("label shinycolor")->setVisible(false); + self->getChildView("shinycolorswatch")->setVisible(false); + if (show_shininess) + { + updateShinyControls(ctrl, userdata); + } + self->getChildView("shinyScaleU")->setVisible(show_shininess); + self->getChildView("shinyScaleV")->setVisible(show_shininess); + self->getChildView("shinyRot")->setVisible(show_shininess); + self->getChildView("shinyOffsetU")->setVisible(show_shininess); + self->getChildView("shinyOffsetV")->setVisible(show_shininess); + + // Normal map controls + if (show_bumpiness) + { + updateBumpyControls(ctrl, userdata); + } + self->getChildView("bumpytexture control")->setVisible(show_bumpiness); + self->getChildView("combobox bumpiness")->setVisible(show_bumpiness); + self->getChildView("label bumpiness")->setVisible(show_bumpiness); + self->getChildView("bumpyScaleU")->setVisible(show_bumpiness); + self->getChildView("bumpyScaleV")->setVisible(show_bumpiness); + self->getChildView("bumpyRot")->setVisible(show_bumpiness); + self->getChildView("bumpyOffsetU")->setVisible(show_bumpiness); + self->getChildView("bumpyOffsetV")->setVisible(show_bumpiness); + + // Enable texture scale/rotation/offset parameters if there's one + // present to set for + bool texParmsEnable = show_texture || + (show_shininess && (combo_shininess->getCurrentIndex() == SHINY_TEXTURE)) || + (show_bumpiness && (combo_bumpiness->getCurrentIndex() == BUMPY_TEXTURE)); + self->getChildView("tex gen")->setEnabled(texParmsEnable); + self->getChildView("combobox texgen")->setEnabled(texParmsEnable); + self->getChildView("rptctrl")->setEnabled(texParmsEnable); + self->getChildView("TexScaleU")->setEnabled(texParmsEnable); + self->getChildView("TexScaleV")->setEnabled(texParmsEnable); + self->getChildView("TexRot")->setEnabled(texParmsEnable); + self->getChildView("TexOffsetU")->setEnabled(texParmsEnable); + self->getChildView("TexOffsetV")->setEnabled(texParmsEnable); + self->getChildView("shinyScaleU")->setEnabled(texParmsEnable); + self->getChildView("shinyScaleV")->setEnabled(texParmsEnable); + self->getChildView("shinyRot")->setEnabled(texParmsEnable); + self->getChildView("shinyOffsetU")->setEnabled(texParmsEnable); + self->getChildView("shinyOffsetV")->setEnabled(texParmsEnable); + self->getChildView("bumpyScaleU")->setEnabled(texParmsEnable); + self->getChildView("bumpyScaleV")->setEnabled(texParmsEnable); + self->getChildView("bumpyRot")->setEnabled(texParmsEnable); + self->getChildView("bumpyOffsetU")->setEnabled(texParmsEnable); + self->getChildView("bumpyOffsetV")->setEnabled(texParmsEnable); + self->getChildView("checkbox planar align")->setEnabled(texParmsEnable); + + // Needed to handle transitions to/from media mode + // NORSPEC-84 + updateAlphaControls(ctrl,userdata); +} + +// static +void LLPanelFace::onCommitMaterialType(LLUICtrl* ctrl, void* userdata) +{ + LLPanelFace* self = (LLPanelFace*) userdata; + // This is here to insure that we properly update shared UI elements + // like the texture ctrls for diffuse/norm/spec so that they are correct + // when switching modes + // + self->getState(); +} + +// static void LLPanelFace::onCommitBump(LLUICtrl* ctrl, void* userdata) { LLPanelFace* self = (LLPanelFace*) userdata; self->sendBump(); + + LLComboBox* combo_bumpy = self->getChild<LLComboBox>("combobox bumpiness"); + // Need 'true' here to insure that the 'Use Texture' choice is removed + // when we select something other than a normmap texture + // + updateBumpyControls(combo_bumpy,self, true); + self->updateMaterial(); } // static @@ -1008,10 +2099,154 @@ void LLPanelFace::onCommitTexGen(LLUICtrl* ctrl, void* userdata) } // static +void LLPanelFace::updateShinyControls(LLUICtrl* ctrl, void* userdata, bool mess_with_shiny_combobox) +{ + LLPanelFace* self = (LLPanelFace*) userdata; + LLTextureCtrl* texture_ctrl = self->getChild<LLTextureCtrl>("shinytexture control"); + LLUUID shiny_texture_ID = texture_ctrl->getImageAssetID(); + LL_DEBUGS("Materials") << "Shiny texture selected: " << shiny_texture_ID << LL_ENDL; + LLComboBox* comboShiny = self->getChild<LLComboBox>("combobox shininess"); + + if(mess_with_shiny_combobox) + { + if (!comboShiny) + { + return; + } + if (!shiny_texture_ID.isNull()) + { + if (!comboShiny->itemExists(USE_TEXTURE)) + { + comboShiny->add(USE_TEXTURE); + + // NORSPEC-94: Set default specular color to white + // + LLColorSwatchCtrl* mShinyColorSwatch = self->getChild<LLColorSwatchCtrl>("shinycolorswatch"); + if(mShinyColorSwatch) + { + // Doing sets in a getState func causes the 'blinking updates' of swatch colors....DON'T. + // + LL_DEBUGS("Materials") << "Resetting specular color to default of white" << LL_ENDL; + mShinyColorSwatch->setOriginal(LLColor4::white); + mShinyColorSwatch->set(LLColor4::white, TRUE); + } + } + comboShiny->setSimple(USE_TEXTURE); + } + else + { + if (comboShiny->itemExists(USE_TEXTURE)) + { + // HACK: This depends on adding the "Use texture" + // item at the end of a list of known length. + comboShiny->remove(SHINY_TEXTURE); + } + } + } + + LLComboBox* combo_matmedia = self->getChild<LLComboBox>("combobox matmedia"); + LLComboBox* combo_mattype = self->getChild<LLComboBox>("combobox mattype"); + U32 materials_media = combo_matmedia->getCurrentIndex(); + U32 material_type = combo_mattype->getCurrentIndex(); + bool show_media = (materials_media == MATMEDIA_MEDIA) && combo_matmedia->getEnabled(); + bool show_shininess = (!show_media) && (material_type == MATTYPE_SPECULAR) && combo_matmedia->getEnabled(); + U32 shiny_value = comboShiny->getCurrentIndex(); + bool show_shinyctrls = (shiny_value == SHINY_TEXTURE) && show_shininess; // Use texture + self->getChildView("label glossiness")->setVisible(show_shinyctrls); + self->getChildView("glossiness")->setVisible(show_shinyctrls); + self->getChildView("label environment")->setVisible(show_shinyctrls); + self->getChildView("environment")->setVisible(show_shinyctrls); + self->getChildView("label shinycolor")->setVisible(show_shinyctrls); + self->getChildView("shinycolorswatch")->setVisible(show_shinyctrls); +} + +// static +void LLPanelFace::updateBumpyControls(LLUICtrl* ctrl, void* userdata, bool mess_with_combobox) +{ + LLPanelFace* self = (LLPanelFace*) userdata; + LLTextureCtrl* texture_ctrl = self->getChild<LLTextureCtrl>("bumpytexture control"); + LLUUID bumpy_texture_ID = texture_ctrl->getImageAssetID(); + LL_DEBUGS("Materials") << "texture: " << bumpy_texture_ID << (mess_with_combobox ? "" : " do not") << " update combobox" << LL_ENDL; + LLComboBox* comboBumpy = self->getChild<LLComboBox>("combobox bumpiness"); + if (!comboBumpy) + { + return; + } + + if (mess_with_combobox) + { + if (!bumpy_texture_ID.isNull()) + { + if (!comboBumpy->itemExists(USE_TEXTURE)) + { + comboBumpy->add(USE_TEXTURE); + } + comboBumpy->setSimple(USE_TEXTURE); + } + else + { + if (comboBumpy->itemExists(USE_TEXTURE)) + { + // HACK: This depends on adding the "Use texture" + // item at the end of a list of known length. + comboBumpy->remove(BUMPY_TEXTURE); + } + } + } +} + +// static void LLPanelFace::onCommitShiny(LLUICtrl* ctrl, void* userdata) { LLPanelFace* self = (LLPanelFace*) userdata; - self->sendShiny(); + self->sendShiny(); + LLComboBox* combo_shiny = self->getChild<LLComboBox>("combobox shininess"); + // Need 'true' here to insure that the 'Use Texture' choice is removed + // when we select something other than a spec texture + // + updateShinyControls(combo_shiny,self, true); + self->updateMaterial(); +} + +// static +void LLPanelFace::updateAlphaControls(LLUICtrl* ctrl, void* userdata) +{ + LLPanelFace* self = (LLPanelFace*) userdata; + LLComboBox* comboAlphaMode = self->getChild<LLComboBox>("combobox alphamode"); + if (!comboAlphaMode) + { + return; + } + U32 alpha_value = comboAlphaMode->getCurrentIndex(); + bool show_alphactrls = (alpha_value == ALPHAMODE_MASK); // Alpha masking + + LLComboBox* combobox_matmedia = self->getChild<LLComboBox>("combobox matmedia"); + U32 mat_media = MATMEDIA_MATERIAL; + if (combobox_matmedia) + { + mat_media = combobox_matmedia->getCurrentIndex(); + } + + LLComboBox* combobox_mattype = self->getChild<LLComboBox>("combobox mattype"); + U32 mat_type = MATTYPE_DIFFUSE; + if (combobox_mattype) + { + mat_type = combobox_mattype->getCurrentIndex(); + } + + show_alphactrls = show_alphactrls && (mat_media == MATMEDIA_MATERIAL); + show_alphactrls = show_alphactrls && (mat_type == MATTYPE_DIFFUSE); + + self->getChildView("label maskcutoff")->setVisible(show_alphactrls); + self->getChildView("maskcutoff")->setVisible(show_alphactrls); +} + +// static +void LLPanelFace::onCommitAlphaMode(LLUICtrl* ctrl, void* userdata) +{ + LLPanelFace* self = (LLPanelFace*) userdata; + updateAlphaControls(ctrl,userdata); + self->updateMaterial(); } // static @@ -1063,6 +2298,42 @@ void LLPanelFace::onSelectTexture(const LLSD& data) sendTexture(); } +void LLPanelFace::onCommitMaterialTexture( const LLSD& data ) +{ + LL_DEBUGS("Materials") << data << LL_ENDL; + updateMaterial(); + LLComboBox* combo_shiny = getChild<LLComboBox>("combobox shininess"); + updateShinyControls(combo_shiny,this, true); + LLComboBox* combo_bumpy = getChild<LLComboBox>("combobox bumpiness"); + updateBumpyControls(combo_bumpy,this, true); +} + +void LLPanelFace::onCancelMaterialTexture(const LLSD& data) +{ + // not sure what to do here other than + updateMaterial(); + LLComboBox* combo_shiny = getChild<LLComboBox>("combobox shininess"); + updateShinyControls(combo_shiny,this, true); + LLComboBox* combo_bumpy = getChild<LLComboBox>("combobox bumpiness"); + updateBumpyControls(combo_bumpy,this, true); +} + +void LLPanelFace::onSelectMaterialTexture(const LLSD& data) +{ + LL_DEBUGS("Materials") << data << LL_ENDL; + updateMaterial(); + LLComboBox* combo_shiny = getChild<LLComboBox>("combobox shininess"); + updateShinyControls(combo_shiny,this, true); + LLComboBox* combo_bumpy = getChild<LLComboBox>("combobox bumpiness"); + updateBumpyControls(combo_bumpy,this, true); +} + +//static +void LLPanelFace::onCommitMaterial(LLUICtrl* ctrl, void* userdata) +{ + LLPanelFace* self = (LLPanelFace*) userdata; + self->updateMaterial(); +} // static void LLPanelFace::onCommitTextureInfo( LLUICtrl* ctrl, void* userdata ) @@ -1073,7 +2344,7 @@ void LLPanelFace::onCommitTextureInfo( LLUICtrl* ctrl, void* userdata ) // Commit the number of repeats per meter // static -void LLPanelFace::onClickApply(void* userdata) +void LLPanelFace::onCommitRepeatsPerMeter(LLUICtrl* ctrl, void* userdata) { LLPanelFace* self = (LLPanelFace*) userdata; @@ -1081,7 +2352,73 @@ void LLPanelFace::onClickApply(void* userdata) //F32 repeats_per_meter = self->mCtrlRepeatsPerMeter->get(); F32 repeats_per_meter = (F32)self->getChild<LLUICtrl>("rptctrl")->getValue().asReal();//self->mCtrlRepeatsPerMeter->get(); - LLSelectMgr::getInstance()->selectionTexScaleAutofit( repeats_per_meter ); + + LLComboBox* combo_mattype = self->getChild<LLComboBox>("combobox mattype"); + + F32 obj_scale_s = 1.0f; + F32 obj_scale_t = 1.0f; + + U32 material_type = combo_mattype->getCurrentIndex(); + + struct f_objscale_s : public LLSelectedTEGetFunctor<F32> + { + F32 get(LLViewerObject* object, S32 face) + { + U32 s_axis = VX; + U32 t_axis = VY; + LLPrimitive::getTESTAxes(face, &s_axis, &t_axis); + return object->getScale().mV[s_axis]; + } + + } scale_s_func; + + struct f_objscale_t : public LLSelectedTEGetFunctor<F32> + { + F32 get(LLViewerObject* object, S32 face) + { + U32 s_axis = VX; + U32 t_axis = VY; + LLPrimitive::getTESTAxes(face, &s_axis, &t_axis); + return object->getScale().mV[t_axis]; + } + + } scale_t_func; + + LLSelectMgr::getInstance()->getSelection()->getSelectedTEValue( &scale_s_func, obj_scale_s ); + LLSelectMgr::getInstance()->getSelection()->getSelectedTEValue( &scale_t_func, obj_scale_t ); + + switch (material_type) + { + case MATTYPE_DIFFUSE: + { + LLSelectMgr::getInstance()->selectionTexScaleAutofit( repeats_per_meter ); + } + break; + + case MATTYPE_NORMAL: + { + LLUICtrl* bumpy_scale_u = self->getChild<LLUICtrl>("bumpyScaleU"); + LLUICtrl* bumpy_scale_v = self->getChild<LLUICtrl>("bumpyScaleV"); + bumpy_scale_u->setValue(obj_scale_s * repeats_per_meter); + bumpy_scale_v->setValue(obj_scale_t * repeats_per_meter); + self->updateMaterial(); + } + break; + + case MATTYPE_SPECULAR: + { + LLUICtrl* shiny_scale_u = self->getChild<LLUICtrl>("shinyScaleU"); + LLUICtrl* shiny_scale_v = self->getChild<LLUICtrl>("shinyScaleV"); + shiny_scale_u->setValue(obj_scale_s * repeats_per_meter); + shiny_scale_v->setValue(obj_scale_t * repeats_per_meter); + self->updateMaterial(); + } + break; + + default: + llassert(false); + break; + } } struct LLPanelFaceSetMediaFunctor : public LLSelectedTEFunctor @@ -1155,7 +2492,26 @@ void LLPanelFace::onCommitPlanarAlign(LLUICtrl* ctrl, void* userdata) void LLPanelFace::onTextureSelectionChanged(LLInventoryItem* itemp) { - LLTextureCtrl* texture_ctrl = getChild<LLTextureCtrl>("texture control"); + LL_DEBUGS("Materials") << "item asset " << itemp->getAssetUUID() << LL_ENDL; + LLComboBox* combo_mattype = getChild<LLComboBox>("combobox mattype"); + if (!combo_mattype) + { + return; + } + U32 mattype = combo_mattype->getCurrentIndex(); + std::string which_control="texture control"; + switch (mattype) + { + case MATTYPE_SPECULAR: + which_control = "shinytexture control"; + break; + case MATTYPE_NORMAL: + which_control = "bumpytexture control"; + break; + // no default needed + } + LL_DEBUGS("Materials") << "control " << which_control << LL_ENDL; + LLTextureCtrl* texture_ctrl = getChild<LLTextureCtrl>(which_control); if (texture_ctrl) { LLUUID obj_owner_id; @@ -1185,3 +2541,4 @@ void LLPanelFace::onTextureSelectionChanged(LLInventoryItem* itemp) } } } + diff --git a/indra/newview/llpanelface.h b/indra/newview/llpanelface.h index 3b5a9b1398..2138319365 100644 --- a/indra/newview/llpanelface.h +++ b/indra/newview/llpanelface.h @@ -29,6 +29,7 @@ #include "v4color.h" #include "llpanel.h" +#include "llmaterial.h" class LLButton; class LLCheckBoxCtrl; @@ -42,6 +43,7 @@ class LLTextureCtrl; class LLUICtrl; class LLViewerObject; class LLFloater; +class LLMaterialID; class LLPanelFace : public LLPanel { @@ -74,20 +76,33 @@ protected: void onCommitTexture(const LLSD& data); void onCancelTexture(const LLSD& data); void onSelectTexture(const LLSD& data); + void onCommitMaterialTexture(const LLSD& data); + void onCancelMaterialTexture(const LLSD& data); + void onSelectMaterialTexture(const LLSD& data); void onCommitColor(const LLSD& data); + void onCommitShinyColor(const LLSD& data); void onCommitAlpha(const LLSD& data); void onCancelColor(const LLSD& data); void onSelectColor(const LLSD& data); + void onMaterialLoaded(const LLMaterialID& material_id, const LLMaterialPtr material); + void updateMaterial(); static void onCommitTextureInfo( LLUICtrl* ctrl, void* userdata); + static void onCommitMaterial( LLUICtrl* ctrl, void* userdata); + static void onCommitMaterialsMedia( LLUICtrl* ctrl, void* userdata); + static void onCommitMaterialType( LLUICtrl* ctrl, void* userdata); static void onCommitBump( LLUICtrl* ctrl, void* userdata); static void onCommitTexGen( LLUICtrl* ctrl, void* userdata); + static void updateShinyControls( LLUICtrl* ctrl, void* userdata, bool mess_with_combobox = false); + static void updateBumpyControls( LLUICtrl* ctrl, void* userdata, bool mess_with_combobox = false); static void onCommitShiny( LLUICtrl* ctrl, void* userdata); + static void updateAlphaControls( LLUICtrl* ctrl, void* userdata); + static void onCommitAlphaMode( LLUICtrl* ctrl, void* userdata); static void onCommitFullbright( LLUICtrl* ctrl, void* userdata); static void onCommitGlow( LLUICtrl* ctrl, void *userdata); static void onCommitPlanarAlign( LLUICtrl* ctrl, void* userdata); - static void onClickApply(void*); + static void onCommitRepeatsPerMeter( LLUICtrl* ctrl, void* userinfo); static void onClickAutoFix(void*); static F32 valueGlow(LLViewerObject* object, S32 face); @@ -100,6 +115,23 @@ private: */ void onTextureSelectionChanged(LLInventoryItem* itemp); + LLMaterialID mMaterialID; + LLMaterialPtr mMaterial; + bool mIsAlpha; + + /* These variables interlock processing of materials updates sent to + * the sim. mUpdateInFlight is set to flag that an update has been + * sent to the sim and not acknowledged yet, and cleared when an + * update is received from the sim. mUpdatePending is set when + * there's an update in flight and another UI change has been made + * that needs to be sent as a materials update, and cleared when the + * update is sent. This prevents the sim from getting spammed with + * update messages when, for example, the user holds down the + * up-arrow on a spinner, and avoids running afoul of its throttle. + */ + bool mUpdateInFlight; + bool mUpdatePending; }; #endif + diff --git a/indra/newview/llselectmgr.cpp b/indra/newview/llselectmgr.cpp index 4681efd3e5..5a65623b91 100644 --- a/indra/newview/llselectmgr.cpp +++ b/indra/newview/llselectmgr.cpp @@ -29,6 +29,7 @@ // file include #define LLSELECTMGR_CPP #include "llselectmgr.h" +#include "llmaterialmgr.h" // library includes #include "llcachename.h" @@ -103,7 +104,6 @@ const F32 SILHOUETTE_UPDATE_THRESHOLD_SQUARED = 0.02f; const S32 MAX_ACTION_QUEUE_SIZE = 20; const S32 MAX_SILS_PER_FRAME = 50; const S32 MAX_OBJECTS_PER_PACKET = 254; -const S32 TE_SELECT_MASK_ALL = 0xFFFFFFFF; // // Globals @@ -2004,6 +2004,70 @@ void LLSelectMgr::selectionSetGlow(F32 glow) mSelectedObjects->applyToObjects( &func2 ); } +void LLSelectMgr::selectionSetMaterial(LLMaterialPtr material) +{ + struct f1 : public LLSelectedTEFunctor + { + LLMaterialPtr mMaterial; + f1(LLMaterialPtr material) : mMaterial(material) {}; + bool apply(LLViewerObject* object, S32 face) + { + if (object->permModify()) + { + LL_DEBUGS("Materials") << "Putting material on object " << object->getID() << " face " << face << ", material: " << mMaterial->asLLSD() << LL_ENDL; + LLMaterialMgr::getInstance()->put(object->getID(),face,*mMaterial); + object->setTEMaterialParams(face,mMaterial); + } + return true; + } + } func1(material); + mSelectedObjects->applyToTEs( &func1 ); + + struct f2 : public LLSelectedObjectFunctor + { + virtual bool apply(LLViewerObject* object) + { + if (object->permModify()) + { + object->sendTEUpdate(); + } + return true; + } + } func2; + mSelectedObjects->applyToObjects( &func2 ); +} + +void LLSelectMgr::selectionRemoveMaterial() +{ + struct f1 : public LLSelectedTEFunctor + { + bool apply(LLViewerObject* object, S32 face) + { + if (object->permModify()) + { + LL_DEBUGS("Materials") << "Removing material from object " << object->getID() << " face " << face << LL_ENDL; + LLMaterialMgr::getInstance()->remove(object->getID(),face); + object->setTEMaterialID(face,LLMaterialID::null); + } + return true; + } + } func1; + mSelectedObjects->applyToTEs( &func1 ); + + struct f2 : public LLSelectedObjectFunctor + { + virtual bool apply(LLViewerObject* object) + { + if (object->permModify()) + { + object->sendTEUpdate(); + } + return true; + } + } func2; + mSelectedObjects->applyToObjects( &func2 ); +} + //----------------------------------------------------------------------------- // findObjectPermissions() diff --git a/indra/newview/llselectmgr.h b/indra/newview/llselectmgr.h index cc78e35869..1991b5581b 100644 --- a/indra/newview/llselectmgr.h +++ b/indra/newview/llselectmgr.h @@ -43,10 +43,12 @@ #include "llpermissions.h" #include "llcontrol.h" #include "llviewerobject.h" // LLObjectSelection::getSelectedTEValue template +#include "llmaterial.h" #include <deque> #include <boost/iterator/filter_iterator.hpp> #include <boost/signals2.hpp> +#include <boost/make_shared.hpp> // boost::make_shared class LLMessageSystem; class LLViewerTexture; @@ -121,6 +123,8 @@ typedef enum e_selection_type SELECT_TYPE_HUD }ESelectType; +const S32 TE_SELECT_MASK_ALL = 0xFFFFFFFF; + // Contains information about a selected object, particularly which TEs are selected. class LLSelectNode { @@ -540,6 +544,8 @@ public: void selectionSetClickAction(U8 action); void selectionSetIncludeInSearch(bool include_in_search); void selectionSetGlow(const F32 glow); + void selectionSetMaterial(LLMaterialPtr material); + void selectionRemoveMaterial(); void selectionSetObjectPermissions(U8 perm_field, BOOL set, U32 perm_mask, BOOL override = FALSE); void selectionSetObjectName(const std::string& name); diff --git a/indra/newview/llspatialpartition.cpp b/indra/newview/llspatialpartition.cpp index f85e855fd3..252f129133 100644 --- a/indra/newview/llspatialpartition.cpp +++ b/indra/newview/llspatialpartition.cpp @@ -4632,7 +4632,13 @@ LLDrawInfo::LLDrawInfo(U16 start, U16 end, U32 count, U32 offset, mGroup(NULL), mFace(NULL), mDistance(0.f), - mDrawMode(LLRender::TRIANGLES) + mDrawMode(LLRender::TRIANGLES), + mMaterial(NULL), + mShaderMask(0), + mSpecColor(1.0f, 1.0f, 1.0f, 0.5f), + mEnvIntensity(0.0f), + mAlphaMaskCutoff(0.5f), + mDiffuseAlphaMode(0) { mVertexBuffer->validateRange(mStart, mEnd, mCount, mOffset); diff --git a/indra/newview/llspatialpartition.h b/indra/newview/llspatialpartition.h index b1706d9d35..bf32440848 100644 --- a/indra/newview/llspatialpartition.h +++ b/indra/newview/llspatialpartition.h @@ -119,6 +119,17 @@ public: LL_ALIGN_16(LLFace* mFace); //associated face F32 mDistance; U32 mDrawMode; + LLMaterialPtr mMaterial; // If this is null, the following parameters are unused. + U32 mShaderMask; + LLPointer<LLViewerTexture> mSpecularMap; + const LLMatrix4* mSpecularMapMatrix; + LLPointer<LLViewerTexture> mNormalMap; + const LLMatrix4* mNormalMapMatrix; + LLVector4 mSpecColor; // XYZ = Specular RGB, W = Specular Exponent + F32 mEnvIntensity; + F32 mAlphaMaskCutoff; + U8 mDiffuseAlphaMode; + struct CompareTexture { @@ -169,7 +180,7 @@ public: } }; - + struct CompareBump { bool operator()(const LLPointer<LLDrawInfo>& lhs, const LLPointer<LLDrawInfo>& rhs) @@ -739,7 +750,7 @@ class LLVolumeGeometryManager: public LLGeometryManager virtual void rebuildGeom(LLSpatialGroup* group); virtual void rebuildMesh(LLSpatialGroup* group); virtual void getGeometry(LLSpatialGroup* group); - void genDrawInfo(LLSpatialGroup* group, U32 mask, std::vector<LLFace*>& faces, BOOL distance_sort = FALSE, BOOL batch_textures = FALSE); + void genDrawInfo(LLSpatialGroup* group, U32 mask, std::vector<LLFace*>& faces, BOOL distance_sort = FALSE, BOOL batch_textures = FALSE, BOOL no_materials = FALSE); void registerFace(LLSpatialGroup* group, LLFace* facep, U32 type); }; diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp index 8b71f1067f..f6da44d8a7 100644 --- a/indra/newview/llstartup.cpp +++ b/indra/newview/llstartup.cpp @@ -37,8 +37,8 @@ #include "llviewermedia_streamingaudio.h" #include "llaudioengine.h" -#ifdef LL_FMOD -# include "llaudioengine_fmod.h" +#ifdef LL_FMODEX +# include "llaudioengine_fmodex.h" #endif #ifdef LL_OPENAL @@ -623,32 +623,32 @@ bool idle_startup() { gAudiop = NULL; -#ifdef LL_OPENAL +#ifdef LL_FMODEX if (!gAudiop #if !LL_WINDOWS - && NULL == getenv("LL_BAD_OPENAL_DRIVER") + && NULL == getenv("LL_BAD_FMODEX_DRIVER") #endif // !LL_WINDOWS ) { - gAudiop = (LLAudioEngine *) new LLAudioEngine_OpenAL(); + gAudiop = (LLAudioEngine *) new LLAudioEngine_FMODEX(gSavedSettings.getBOOL("FMODExProfilerEnable")); } #endif -#ifdef LL_FMOD +#ifdef LL_OPENAL if (!gAudiop #if !LL_WINDOWS - && NULL == getenv("LL_BAD_FMOD_DRIVER") + && NULL == getenv("LL_BAD_OPENAL_DRIVER") #endif // !LL_WINDOWS ) { - gAudiop = (LLAudioEngine *) new LLAudioEngine_FMOD(); + gAudiop = (LLAudioEngine *) new LLAudioEngine_OpenAL(); } #endif if (gAudiop) { #if LL_WINDOWS - // FMOD on Windows needs the window handle to stop playing audio + // FMOD Ex on Windows needs the window handle to stop playing audio // when window is minimized. JC void* window_handle = (HWND)gViewerWindow->getPlatformWindow(); #else diff --git a/indra/newview/lltextureatlas.cpp b/indra/newview/lltextureatlas.cpp index f8c1bca8ae..dbbe331954 100644 --- a/indra/newview/lltextureatlas.cpp +++ b/indra/newview/lltextureatlas.cpp @@ -71,7 +71,7 @@ LLTextureAtlas::~LLTextureAtlas() //virtual S8 LLTextureAtlas::getType() const { - return LLViewerTexture::ATLAS_TEXTURE ; + return 0; //LLViewerTexture::ATLAS_TEXTURE ; } void LLTextureAtlas::getTexCoordOffset(S16 col, S16 row, F32& xoffset, F32& yoffset) diff --git a/indra/newview/lltexturecache.h b/indra/newview/lltexturecache.h index e3fc957fd2..deaacc4975 100644 --- a/indra/newview/lltexturecache.h +++ b/indra/newview/lltexturecache.h @@ -24,7 +24,7 @@ * $/LicenseInfo$ */ -#ifndef LL_LLTEXTURECACHE_ +#ifndef LL_LLTEXTURECACHE_H #define LL_LLTEXTURECACHE_H #include "lldir.h" diff --git a/indra/newview/lltexturectrl.h b/indra/newview/lltexturectrl.h index 599d9c70c5..3fd024082e 100644 --- a/indra/newview/lltexturectrl.h +++ b/indra/newview/lltexturectrl.h @@ -126,6 +126,7 @@ public: // LLTextureCtrl interface void showPicker(BOOL take_focus); + bool isPickerShown() { return !mFloaterHandle.isDead(); } void setLabel(const std::string& label); void setLabelWidth(S32 label_width) {mLabelWidth =label_width;} const std::string& getLabel() const { return mLabel; } diff --git a/indra/newview/llviewerassetstats.cpp b/indra/newview/llviewerassetstats.cpp index aaa81c57d4..aaa81c57d4 100755..100644 --- a/indra/newview/llviewerassetstats.cpp +++ b/indra/newview/llviewerassetstats.cpp diff --git a/indra/newview/llviewerassetstats.h b/indra/newview/llviewerassetstats.h index e4581d2120..e4581d2120 100755..100644 --- a/indra/newview/llviewerassetstats.h +++ b/indra/newview/llviewerassetstats.h diff --git a/indra/newview/llvieweraudio.cpp b/indra/newview/llvieweraudio.cpp index 564bf7997a..3da934b148 100644 --- a/indra/newview/llvieweraudio.cpp +++ b/indra/newview/llvieweraudio.cpp @@ -44,6 +44,8 @@ #include "llparcel.h" #include "llviewermessage.h" +#include "llstreamingaudio.h" + ///////////////////////////////////////////////////////// LLViewerAudio::LLViewerAudio() : @@ -102,6 +104,11 @@ void LLViewerAudio::startInternetStreamWithAutoFade(std::string streamURI) else { mFadeState = FADE_IN; + + LLStreamingAudioInterface *stream = gAudiop->getStreamingAudioImpl(); + if(stream && stream->supportsAdjustableBufferSizes()) + stream->setBufferSizes(gSavedSettings.getU32("FMODExStreamBufferSize"),gSavedSettings.getU32("FMODExDecodeBufferSize")); + gAudiop->startInternetStream(mNextStreamURI); startFading(); registerIdleListener(); @@ -157,6 +164,11 @@ bool LLViewerAudio::onIdleUpdate() if (!mNextStreamURI.empty()) { mFadeState = FADE_IN; + + LLStreamingAudioInterface *stream = gAudiop->getStreamingAudioImpl(); + if(stream && stream->supportsAdjustableBufferSizes()) + stream->setBufferSizes(gSavedSettings.getU32("FMODExStreamBufferSize"),gSavedSettings.getU32("FMODExDecodeBufferSize")); + gAudiop->startInternetStream(mNextStreamURI); startFading(); } @@ -386,7 +398,12 @@ void audio_update_volume(bool force_update) gAudiop->setMasterGain ( master_volume ); gAudiop->setDopplerFactor(gSavedSettings.getF32("AudioLevelDoppler")); + + if(!LLViewerCamera::getInstance()->cameraUnderWater()) gAudiop->setRolloffFactor(gSavedSettings.getF32("AudioLevelRolloff")); + else + gAudiop->setRolloffFactor(gSavedSettings.getF32("AudioLevelUnderwaterRolloff")); + gAudiop->setMuted(mute_audio || progress_view_visible); //Play any deferred sounds when unmuted @@ -473,32 +490,10 @@ void audio_update_listener() void audio_update_wind(bool force_update) { #ifdef kAUDIO_ENABLE_WIND - // - // Extract height above water to modulate filter by whether above/below water - // + LLViewerRegion* region = gAgent.getRegion(); if (region) { - static F32 last_camera_water_height = -1000.f; - LLVector3 camera_pos = gAgentCamera.getCameraPositionAgent(); - F32 camera_water_height = camera_pos.mV[VZ] - region->getWaterHeight(); - - // - // Don't update rolloff factor unless water surface has been crossed - // - if (force_update || (last_camera_water_height * camera_water_height) < 0.f) - { - static LLUICachedControl<F32> rolloff("AudioLevelRolloff", 1.0f); - if (camera_water_height < 0.f) - { - gAudiop->setRolloffFactor(rolloff * LL_ROLLOFF_MULTIPLIER_UNDER_WATER); - } - else - { - gAudiop->setRolloffFactor(rolloff); - } - } - // Scale down the contribution of weather-simulation wind to the // ambient wind noise. Wind velocity averages 3.5 m/s, with gusts to 7 m/s // whereas steady-state avatar walk velocity is only 3.2 m/s. @@ -543,8 +538,7 @@ void audio_update_wind(bool force_update) gAudiop->mMaxWindGain = llmax(gAudiop->mMaxWindGain - volume_delta, 0.f); } - last_camera_water_height = camera_water_height; - gAudiop->updateWind(gRelativeWindVec, camera_water_height); + gAudiop->updateWind(gRelativeWindVec, gAgentCamera.getCameraPositionAgent()[VZ] - gAgent.getRegion()->getWaterHeight()); } #endif } diff --git a/indra/newview/llviewercontrol.cpp b/indra/newview/llviewercontrol.cpp index 051f5f4485..a62f73deef 100644 --- a/indra/newview/llviewercontrol.cpp +++ b/indra/newview/llviewercontrol.cpp @@ -655,6 +655,7 @@ void settings_setup_listeners() gSavedSettings.getControl("AudioLevelVoice")->getSignal()->connect(boost::bind(&handleAudioVolumeChanged, _2)); gSavedSettings.getControl("AudioLevelDoppler")->getSignal()->connect(boost::bind(&handleAudioVolumeChanged, _2)); gSavedSettings.getControl("AudioLevelRolloff")->getSignal()->connect(boost::bind(&handleAudioVolumeChanged, _2)); + gSavedSettings.getControl("AudioLevelUnderwaterRolloff")->getSignal()->connect(boost::bind(&handleAudioVolumeChanged, _2)); gSavedSettings.getControl("MuteAudio")->getSignal()->connect(boost::bind(&handleAudioVolumeChanged, _2)); gSavedSettings.getControl("MuteMusic")->getSignal()->connect(boost::bind(&handleAudioVolumeChanged, _2)); gSavedSettings.getControl("MuteMedia")->getSignal()->connect(boost::bind(&handleAudioVolumeChanged, _2)); diff --git a/indra/newview/llviewerdisplay.cpp b/indra/newview/llviewerdisplay.cpp index cf59e67955..37c579bdf5 100644 --- a/indra/newview/llviewerdisplay.cpp +++ b/indra/newview/llviewerdisplay.cpp @@ -98,6 +98,7 @@ BOOL gDepthDirty = FALSE; BOOL gResizeScreenTexture = FALSE; BOOL gWindowResized = FALSE; BOOL gSnapshot = FALSE; +BOOL gShaderProfileFrame = FALSE; U32 gRecentFrameCount = 0; // number of 'recent' frames LLFrameTimer gRecentFPSTime; @@ -340,6 +341,12 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot) return; } + + if (gShaderProfileFrame) + { + LLGLSLShader::initProfile(); + } + //LLGLState::verify(FALSE); ///////////////////////////////////////////////// @@ -1018,6 +1025,12 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot) LLAppViewer::instance()->pingMainloopTimeout("Display:Done"); gShiftFrame = false; + + if (gShaderProfileFrame) + { + gShaderProfileFrame = FALSE; + LLGLSLShader::finishProfile(); + } } void render_hud_attachments() @@ -1037,6 +1050,7 @@ void render_hud_attachments() if (LLPipeline::sShowHUDAttachments && !gDisconnected && setup_hud_matrices()) { + LLPipeline::sRenderingHUDs = TRUE; LLCamera hud_cam = *LLViewerCamera::getInstance(); hud_cam.setOrigin(-1.f,0,0); hud_cam.setAxes(LLVector3(1,0,0), LLVector3(0,1,0), LLVector3(0,0,1)); @@ -1085,6 +1099,7 @@ void render_hud_attachments() gPipeline.toggleRenderType(LLPipeline::RENDER_TYPE_PASS_ALPHA); gPipeline.toggleRenderType(LLPipeline::RENDER_TYPE_PASS_ALPHA_MASK); gPipeline.toggleRenderType(LLPipeline::RENDER_TYPE_PASS_BUMP); + gPipeline.toggleRenderType(LLPipeline::RENDER_TYPE_PASS_MATERIAL); gPipeline.toggleRenderType(LLPipeline::RENDER_TYPE_PASS_FULLBRIGHT); gPipeline.toggleRenderType(LLPipeline::RENDER_TYPE_PASS_FULLBRIGHT_ALPHA_MASK); gPipeline.toggleRenderType(LLPipeline::RENDER_TYPE_PASS_FULLBRIGHT_SHINY); @@ -1109,6 +1124,7 @@ void render_hud_attachments() gPipeline.toggleRenderDebugFeature((void*) LLPipeline::RENDER_DEBUG_FEATURE_UI); } LLPipeline::sUseOcclusion = use_occlusion; + LLPipeline::sRenderingHUDs = FALSE; } gGL.matrixMode(LLRender::MM_PROJECTION); gGL.popMatrix(); diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp index beca08203f..5a27bdca90 100644 --- a/indra/newview/llviewermenu.cpp +++ b/indra/newview/llviewermenu.cpp @@ -147,6 +147,8 @@ void handle_test_load_url(void*); //extern BOOL gDebugAvatarRotation; extern BOOL gDebugClicks; extern BOOL gDebugWindowProc; +extern BOOL gShaderProfileFrame; + //extern BOOL gDebugTextEditorTips; //extern BOOL gDebugSelectMgr; @@ -291,6 +293,7 @@ void request_friendship(const LLUUID& agent_id); // Tools menu void handle_selected_texture_info(void*); +void handle_selected_material_info(); void handle_dump_followcam(void*); void handle_viewer_enable_message_log(void*); @@ -1189,28 +1192,6 @@ class LLAdvancedCheckWireframe : public view_listener_t } }; -////////////////////// -// TEXTURE ATLAS // -////////////////////// - -class LLAdvancedToggleTextureAtlas : public view_listener_t -{ - bool handleEvent(const LLSD& userdata) - { - LLViewerTexture::sUseTextureAtlas = !LLViewerTexture::sUseTextureAtlas; - gSavedSettings.setBOOL("EnableTextureAtlas", LLViewerTexture::sUseTextureAtlas) ; - return true; - } -}; - -class LLAdvancedCheckTextureAtlas : public view_listener_t -{ - bool handleEvent(const LLSD& userdata) - { - bool new_value = LLViewerTexture::sUseTextureAtlas; // <-- make this using LLCacheControl - return new_value; - } -}; ////////////////////////// // DUMP SCRIPTED CAMERA // @@ -6920,6 +6901,47 @@ void handle_selected_texture_info(void*) } } +void handle_selected_material_info() +{ + for (LLObjectSelection::valid_iterator iter = LLSelectMgr::getInstance()->getSelection()->valid_begin(); + iter != LLSelectMgr::getInstance()->getSelection()->valid_end(); iter++) + { + LLSelectNode* node = *iter; + + std::string msg; + msg.assign("Material info for: \n"); + msg.append(node->mName); + + U8 te_count = node->getObject()->getNumTEs(); + // map from material ID to list of faces using it + typedef std::map<LLMaterialID, std::vector<U8> > map_t; + map_t faces_per_material; + for (U8 i = 0; i < te_count; i++) + { + if (!node->isTESelected(i)) continue; + + const LLMaterialID& material_id = node->getObject()->getTE(i)->getMaterialID(); + faces_per_material[material_id].push_back(i); + } + // Per-material, dump which faces are using it. + map_t::iterator it; + for (it = faces_per_material.begin(); it != faces_per_material.end(); ++it) + { + const LLMaterialID& material_id = it->first; + msg += llformat("%s on face ", material_id.asString().c_str()); + for (U8 i = 0; i < it->second.size(); ++i) + { + msg.append( llformat("%d ", (S32)(it->second[i]))); + } + msg.append("\n"); + } + + LLSD args; + args["MESSAGE"] = msg; + LLNotificationsUtil::add("SystemMessage", args); + } +} + void handle_test_male(void*) { LLAppearanceMgr::instance().wearOutfitByName("Male Shape & Outfit"); @@ -7022,6 +7044,15 @@ class LLAdvancedClickRenderShadowOption: public view_listener_t } }; +class LLAdvancedClickRenderProfile: public view_listener_t +{ + bool handleEvent(const LLSD& userdata) + { + gShaderProfileFrame = TRUE; + return true; + } +}; + void menu_toggle_attached_lights(void* user_data) { LLPipeline::sRenderAttachedLights = gSavedSettings.getBOOL("RenderAttachedLights"); @@ -8442,11 +8473,10 @@ void initialize_menus() view_listener_t::addMenu(new LLAdvancedToggleInfoDisplay(), "Advanced.ToggleInfoDisplay"); view_listener_t::addMenu(new LLAdvancedCheckInfoDisplay(), "Advanced.CheckInfoDisplay"); view_listener_t::addMenu(new LLAdvancedSelectedTextureInfo(), "Advanced.SelectedTextureInfo"); + commit.add("Advanced.SelectedMaterialInfo", boost::bind(&handle_selected_material_info)); view_listener_t::addMenu(new LLAdvancedToggleWireframe(), "Advanced.ToggleWireframe"); view_listener_t::addMenu(new LLAdvancedCheckWireframe(), "Advanced.CheckWireframe"); // Develop > Render - view_listener_t::addMenu(new LLAdvancedToggleTextureAtlas(), "Advanced.ToggleTextureAtlas"); - view_listener_t::addMenu(new LLAdvancedCheckTextureAtlas(), "Advanced.CheckTextureAtlas"); view_listener_t::addMenu(new LLAdvancedEnableObjectObjectOcclusion(), "Advanced.EnableObjectObjectOcclusion"); view_listener_t::addMenu(new LLAdvancedEnableRenderFBO(), "Advanced.EnableRenderFBO"); view_listener_t::addMenu(new LLAdvancedEnableRenderDeferred(), "Advanced.EnableRenderDeferred"); @@ -8460,7 +8490,7 @@ void initialize_menus() view_listener_t::addMenu(new LLAdvancedHandleAttachedLightParticles(), "Advanced.HandleAttachedLightParticles"); view_listener_t::addMenu(new LLAdvancedCheckRenderShadowOption(), "Advanced.CheckRenderShadowOption"); view_listener_t::addMenu(new LLAdvancedClickRenderShadowOption(), "Advanced.ClickRenderShadowOption"); - + view_listener_t::addMenu(new LLAdvancedClickRenderProfile(), "Advanced.ClickRenderProfile"); #ifdef TOGGLE_HACKED_GODLIKE_VIEWER view_listener_t::addMenu(new LLAdvancedHandleToggleHackedGodmode(), "Advanced.HandleToggleHackedGodmode"); diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp index 670272e7be..96e701a6cb 100644 --- a/indra/newview/llviewerobject.cpp +++ b/indra/newview/llviewerobject.cpp @@ -3927,25 +3927,39 @@ void LLViewerObject::setNumTEs(const U8 num_tes) { LLPointer<LLViewerTexture> *new_images; new_images = new LLPointer<LLViewerTexture>[num_tes]; + + LLPointer<LLViewerTexture> *new_normmaps; + new_normmaps = new LLPointer<LLViewerTexture>[num_tes]; + + LLPointer<LLViewerTexture> *new_specmaps; + new_specmaps = new LLPointer<LLViewerTexture>[num_tes]; for (i = 0; i < num_tes; i++) { if (i < getNumTEs()) { new_images[i] = mTEImages[i]; + new_normmaps[i] = mTENormalMaps[i]; + new_specmaps[i] = mTESpecularMaps[i]; } else if (getNumTEs()) { new_images[i] = mTEImages[getNumTEs()-1]; + new_normmaps[i] = mTENormalMaps[getNumTEs()-1]; + new_specmaps[i] = mTESpecularMaps[getNumTEs()-1]; } else { new_images[i] = NULL; + new_normmaps[i] = NULL; + new_specmaps[i] = NULL; } } deleteTEImages(); mTEImages = new_images; + mTENormalMaps = new_normmaps; + mTESpecularMaps = new_specmaps; } else { @@ -4024,12 +4038,18 @@ void LLViewerObject::sendTEUpdate() const void LLViewerObject::setTE(const U8 te, const LLTextureEntry &texture_entry) { LLPrimitive::setTE(te, texture_entry); -// This doesn't work, don't get any textures. -// if (mDrawable.notNull() && mDrawable->isVisible()) -// { - const LLUUID& image_id = getTE(te)->getID(); + + const LLUUID& image_id = getTE(te)->getID(); mTEImages[te] = LLViewerTextureManager::getFetchedTexture(image_id, FTT_DEFAULT, TRUE, LLGLTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE); -// } + + if (getTE(te)->getMaterialParams().notNull()) + { + const LLUUID& norm_id = getTE(te)->getMaterialParams()->getNormalID(); + mTENormalMaps[te] = LLViewerTextureManager::getFetchedTexture(norm_id, FTT_DEFAULT, TRUE, LLGLTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE); + + const LLUUID& spec_id = getTE(te)->getMaterialParams()->getSpecularID(); + mTESpecularMaps[te] = LLViewerTextureManager::getFetchedTexture(spec_id, FTT_DEFAULT, TRUE, LLGLTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE); + } } void LLViewerObject::setTEImage(const U8 te, LLViewerTexture *imagep) @@ -4064,6 +4084,63 @@ S32 LLViewerObject::setTETextureCore(const U8 te, LLViewerTexture *image) return retval; } +S32 LLViewerObject::setTENormalMapCore(const U8 te, LLViewerTexture *image) +{ + S32 retval = TEM_CHANGE_TEXTURE; + const LLUUID& uuid = image ? image->getID() : LLUUID::null; + if (uuid != getTE(te)->getID() || + uuid == LLUUID::null) + { + LLTextureEntry* tep = getTE(te); + LLMaterial* mat = NULL; + if (tep) + { + mat = tep->getMaterialParams(); + } + + if (mat) + { + mat->setNormalID(uuid); + } + + setChanged(TEXTURE); + if (mDrawable.notNull()) + { + gPipeline.markTextured(mDrawable); + } + } + mTENormalMaps[te] = image; + return retval; +} + +S32 LLViewerObject::setTESpecularMapCore(const U8 te, LLViewerTexture *image) +{ + S32 retval = TEM_CHANGE_TEXTURE; + const LLUUID& uuid = image ? image->getID() : LLUUID::null; + if (uuid != getTE(te)->getID() || + uuid == LLUUID::null) + { + LLTextureEntry* tep = getTE(te); + LLMaterial* mat = NULL; + if (tep) + { + mat = tep->getMaterialParams(); + } + + if (mat) + { + mat->setSpecularID(uuid); + } + setChanged(TEXTURE); + if (mDrawable.notNull()) + { + gPipeline.markTextured(mDrawable); + } + } + mTESpecularMaps[te] = image; + return retval; +} + //virtual void LLViewerObject::changeTEImage(S32 index, LLViewerTexture* new_image) { @@ -4074,6 +4151,24 @@ void LLViewerObject::changeTEImage(S32 index, LLViewerTexture* new_image) mTEImages[index] = new_image ; } +void LLViewerObject::changeTENormalMap(S32 index, LLViewerTexture* new_image) +{ + if(index < 0 || index >= getNumTEs()) + { + return ; + } + mTENormalMaps[index] = new_image ; +} + +void LLViewerObject::changeTESpecularMap(S32 index, LLViewerTexture* new_image) +{ + if(index < 0 || index >= getNumTEs()) + { + return ; + } + mTESpecularMaps[index] = new_image ; +} + S32 LLViewerObject::setTETexture(const U8 te, const LLUUID& uuid) { // Invalid host == get from the agent's sim @@ -4082,6 +4177,19 @@ S32 LLViewerObject::setTETexture(const U8 te, const LLUUID& uuid) return setTETextureCore(te,image); } +S32 LLViewerObject::setTENormalMap(const U8 te, const LLUUID& uuid) +{ + LLViewerFetchedTexture *image = (uuid == LLUUID::null) ? NULL : LLViewerTextureManager::getFetchedTexture( + uuid, FTT_DEFAULT, TRUE, LLGLTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE, 0, 0, LLHost::invalid); + return setTENormalMapCore(te, image); +} + +S32 LLViewerObject::setTESpecularMap(const U8 te, const LLUUID& uuid) +{ + LLViewerFetchedTexture *image = (uuid == LLUUID::null) ? NULL : LLViewerTextureManager::getFetchedTexture( + uuid, FTT_DEFAULT, TRUE, LLGLTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE, 0, 0, LLHost::invalid); + return setTESpecularMapCore(te, image); +} S32 LLViewerObject::setTEColor(const U8 te, const LLColor3& color) { @@ -4242,6 +4350,59 @@ S32 LLViewerObject::setTEGlow(const U8 te, const F32 glow) return retval; } +S32 LLViewerObject::setTEMaterialID(const U8 te, const LLMaterialID& pMaterialID) +{ + S32 retval = 0; + const LLTextureEntry *tep = getTE(te); + if (!tep) + { + LL_WARNS("Material") << "No texture entry for te " << (S32)te + << ", object " << mID + << ", material " << pMaterialID + << LL_ENDL; + } + else if (pMaterialID != tep->getMaterialID()) + { + LL_DEBUGS("Material") << "Changing texture entry for te " << (S32)te + << ", object " << mID + << ", material " << pMaterialID + << LL_ENDL; + retval = LLPrimitive::setTEMaterialID(te, pMaterialID); + setChanged(TEXTURE); + if (mDrawable.notNull() && retval) + { + gPipeline.markTextured(mDrawable); + } + } + return retval; +} + +S32 LLViewerObject::setTEMaterialParams(const U8 te, const LLMaterialPtr pMaterialParams) +{ + S32 retval = 0; + const LLTextureEntry *tep = getTE(te); + if (!tep) + { + llwarns << "No texture entry for te " << (S32)te << ", object " << mID << llendl; + } + else if (pMaterialParams != tep->getMaterialParams()) + { + retval = LLPrimitive::setTEMaterialParams(te, pMaterialParams); + LL_DEBUGS("Material") << "Changing material params for te " << (S32)te + << ", object " << mID + << " (" << retval << ")" + << LL_ENDL; + setTENormalMap(te, tep->getMaterialParams()->getNormalID()); + setTESpecularMap(te, tep->getMaterialParams()->getSpecularID()); + setChanged(TEXTURE); + if (mDrawable.notNull() && retval) + { + gPipeline.markTextured(mDrawable); + } + } + return retval; +} + S32 LLViewerObject::setTEScale(const U8 te, const F32 s, const F32 t) { @@ -4343,6 +4504,50 @@ LLViewerTexture *LLViewerObject::getTEImage(const U8 face) const } +LLViewerTexture *LLViewerObject::getTENormalMap(const U8 face) const +{ + // llassert(mTEImages); + + if (face < getNumTEs()) + { + LLViewerTexture* image = mTENormalMaps[face]; + if (image) + { + return image; + } + else + { + return (LLViewerTexture*)(LLViewerFetchedTexture::sDefaultImagep); + } + } + + llerrs << llformat("Requested Image from invalid face: %d/%d",face,getNumTEs()) << llendl; + + return NULL; +} + +LLViewerTexture *LLViewerObject::getTESpecularMap(const U8 face) const +{ + // llassert(mTEImages); + + if (face < getNumTEs()) + { + LLViewerTexture* image = mTESpecularMaps[face]; + if (image) + { + return image; + } + else + { + return (LLViewerTexture*)(LLViewerFetchedTexture::sDefaultImagep); + } + } + + llerrs << llformat("Requested Image from invalid face: %d/%d",face,getNumTEs()) << llendl; + + return NULL; +} + void LLViewerObject::fitFaceTexture(const U8 face) { llinfos << "fitFaceTexture not implemented" << llendl; diff --git a/indra/newview/llviewerobject.h b/indra/newview/llviewerobject.h index 316dbce7d0..ba23ad97b0 100644 --- a/indra/newview/llviewerobject.h +++ b/indra/newview/llviewerobject.h @@ -301,7 +301,11 @@ public: /*virtual*/ void setNumTEs(const U8 num_tes); /*virtual*/ void setTE(const U8 te, const LLTextureEntry &texture_entry); /*virtual*/ S32 setTETexture(const U8 te, const LLUUID &uuid); - S32 setTETextureCore(const U8 te, LLViewerTexture *image); + /*virtual*/ S32 setTENormalMap(const U8 te, const LLUUID &uuid); + /*virtual*/ S32 setTESpecularMap(const U8 te, const LLUUID &uuid); + S32 setTETextureCore(const U8 te, LLViewerTexture *image); + S32 setTENormalMapCore(const U8 te, LLViewerTexture *image); + S32 setTESpecularMapCore(const U8 te, LLViewerTexture *image); /*virtual*/ S32 setTEColor(const U8 te, const LLColor3 &color); /*virtual*/ S32 setTEColor(const U8 te, const LLColor4 &color); /*virtual*/ S32 setTEScale(const U8 te, const F32 s, const F32 t); @@ -318,10 +322,16 @@ public: /*virtual*/ S32 setTEFullbright(const U8 te, const U8 fullbright ); /*virtual*/ S32 setTEMediaFlags(const U8 te, const U8 media_flags ); /*virtual*/ S32 setTEGlow(const U8 te, const F32 glow); + /*virtual*/ S32 setTEMaterialID(const U8 te, const LLMaterialID& pMaterialID); + /*virtual*/ S32 setTEMaterialParams(const U8 te, const LLMaterialPtr pMaterialParams); /*virtual*/ BOOL setMaterial(const U8 material); virtual void setTEImage(const U8 te, LLViewerTexture *imagep); // Not derived from LLPrimitive virtual void changeTEImage(S32 index, LLViewerTexture* new_image) ; + virtual void changeTENormalMap(S32 index, LLViewerTexture* new_image) ; + virtual void changeTESpecularMap(S32 index, LLViewerTexture* new_image) ; LLViewerTexture *getTEImage(const U8 te) const; + LLViewerTexture *getTENormalMap(const U8 te) const; + LLViewerTexture *getTESpecularMap(const U8 te) const; void fitFaceTexture(const U8 face); void sendTEUpdate() const; // Sends packed representation of all texture entry information @@ -596,6 +606,8 @@ public: S32 mListIndex; LLPointer<LLViewerTexture> *mTEImages; + LLPointer<LLViewerTexture> *mTENormalMaps; + LLPointer<LLViewerTexture> *mTESpecularMaps; // Selection, picking and rendering variables U32 mGLName; // GL "name" used by selection code diff --git a/indra/newview/llviewerregion.cpp b/indra/newview/llviewerregion.cpp index b8b53aa6e4..755462b0c2 100644 --- a/indra/newview/llviewerregion.cpp +++ b/indra/newview/llviewerregion.cpp @@ -1617,6 +1617,7 @@ void LLViewerRegionImpl::buildCapabilityNames(LLSD& capabilityNames) capabilityNames.append("ProductInfoRequest"); capabilityNames.append("ProvisionVoiceAccountRequest"); capabilityNames.append("RemoteParcelRequest"); + capabilityNames.append("RenderMaterials"); capabilityNames.append("RequestTextureDownload"); capabilityNames.append("ResourceCostSelected"); capabilityNames.append("RetrieveNavMeshSrc"); diff --git a/indra/newview/llviewershadermgr.cpp b/indra/newview/llviewershadermgr.cpp index ba9818946c..fce06b9e13 100644 --- a/indra/newview/llviewershadermgr.cpp +++ b/indra/newview/llviewershadermgr.cpp @@ -200,6 +200,7 @@ LLGLSLShader gDeferredEmissiveProgram; LLGLSLShader gDeferredPostProgram; LLGLSLShader gDeferredCoFProgram; LLGLSLShader gDeferredDoFCombineProgram; +LLGLSLShader gDeferredPostGammaCorrectProgram; LLGLSLShader gFXAAProgram; LLGLSLShader gDeferredPostNoDoFProgram; LLGLSLShader gDeferredWLSkyProgram; @@ -207,6 +208,9 @@ LLGLSLShader gDeferredWLCloudProgram; LLGLSLShader gDeferredStarProgram; LLGLSLShader gNormalMapGenProgram; +// Deferred materials shaders +LLGLSLShader gDeferredMaterialProgram[LLMaterial::SHADER_COUNT*2]; + LLViewerShaderMgr::LLViewerShaderMgr() : mVertexShaderLevel(SHADER_COUNT, 0), mMaxAvatarShaderLevel(0) @@ -271,6 +275,14 @@ LLViewerShaderMgr::LLViewerShaderMgr() : mShaderList.push_back(&gUnderWaterProgram); mShaderList.push_back(&gDeferredSunProgram); mShaderList.push_back(&gDeferredSoftenProgram); + mShaderList.push_back(&gDeferredMaterialProgram[1]); + mShaderList.push_back(&gDeferredMaterialProgram[5]); + mShaderList.push_back(&gDeferredMaterialProgram[9]); + mShaderList.push_back(&gDeferredMaterialProgram[13]); + mShaderList.push_back(&gDeferredMaterialProgram[1+LLMaterial::SHADER_COUNT]); + mShaderList.push_back(&gDeferredMaterialProgram[5+LLMaterial::SHADER_COUNT]); + mShaderList.push_back(&gDeferredMaterialProgram[9+LLMaterial::SHADER_COUNT]); + mShaderList.push_back(&gDeferredMaterialProgram[13+LLMaterial::SHADER_COUNT]); mShaderList.push_back(&gDeferredAlphaProgram); mShaderList.push_back(&gDeferredSkinnedAlphaProgram); mShaderList.push_back(&gDeferredFullbrightProgram); @@ -780,9 +792,6 @@ BOOL LLViewerShaderMgr::loadBasicShaders() // Load basic dependency shaders first // All of these have to load for any shaders to function -#if LL_DARWIN // Mac can't currently handle all 8 lights, - S32 sum_lights_class = 2; -#else S32 sum_lights_class = 3; // class one cards will get the lower sum lights @@ -793,7 +802,6 @@ BOOL LLViewerShaderMgr::loadBasicShaders() { sum_lights_class = 2; } -#endif // If we have sun and moon only checked, then only sum those lights. if (gPipeline.getLightingDetail() == 0) @@ -801,6 +809,14 @@ BOOL LLViewerShaderMgr::loadBasicShaders() sum_lights_class = 1; } +#if LL_DARWIN + // Work around driver crashes on older Macs when using deferred rendering + // NORSPEC-59 + // + if (gGLManager.mIsMobileGF) + sum_lights_class = 3; +#endif + // Use the feature table to mask out the max light level to use. Also make sure it's at least 1. S32 max_light_class = gSavedSettings.getS32("RenderShaderLightingMaxLevel"); sum_lights_class = llclamp(sum_lights_class, 1, max_light_class); @@ -826,12 +842,14 @@ BOOL LLViewerShaderMgr::loadBasicShaders() shaders.push_back( make_pair( "objects/indexedTextureV.glsl", 1 ) ); } shaders.push_back( make_pair( "objects/nonindexedTextureV.glsl", 1 ) ); - + + boost::unordered_map<std::string, std::string> attribs; + // We no longer have to bind the shaders to global glhandles, they are automatically added to a map now. for (U32 i = 0; i < shaders.size(); i++) { // Note usage of GL_VERTEX_SHADER_ARB - if (loadShaderFile(shaders[i].first, shaders[i].second, GL_VERTEX_SHADER_ARB) == 0) + if (loadShaderFile(shaders[i].first, shaders[i].second, GL_VERTEX_SHADER_ARB, &attribs) == 0) { return FALSE; } @@ -879,11 +897,11 @@ BOOL LLViewerShaderMgr::loadBasicShaders() index_channels.push_back(ch); shaders.push_back( make_pair( "lighting/lightFullbrightShinyF.glsl", mVertexShaderLevel[SHADER_LIGHTING] ) ); index_channels.push_back(ch); shaders.push_back( make_pair( "lighting/lightShinyWaterF.glsl", mVertexShaderLevel[SHADER_LIGHTING] ) ); index_channels.push_back(ch); shaders.push_back( make_pair( "lighting/lightFullbrightShinyWaterF.glsl", mVertexShaderLevel[SHADER_LIGHTING] ) ); - + for (U32 i = 0; i < shaders.size(); i++) { // Note usage of GL_FRAGMENT_SHADER_ARB - if (loadShaderFile(shaders[i].first, shaders[i].second, GL_FRAGMENT_SHADER_ARB, index_channels[i]) == 0) + if (loadShaderFile(shaders[i].first, shaders[i].second, GL_FRAGMENT_SHADER_ARB, &attribs, index_channels[i]) == 0) { return FALSE; } @@ -1097,12 +1115,17 @@ BOOL LLViewerShaderMgr::loadShadersDeferred() gDeferredPostProgram.unload(); gDeferredCoFProgram.unload(); gDeferredDoFCombineProgram.unload(); + gDeferredPostGammaCorrectProgram.unload(); gFXAAProgram.unload(); gDeferredWaterProgram.unload(); gDeferredWLSkyProgram.unload(); gDeferredWLCloudProgram.unload(); gDeferredStarProgram.unload(); gNormalMapGenProgram.unload(); + for (U32 i = 0; i < LLMaterial::SHADER_COUNT*2; ++i) + { + gDeferredMaterialProgram[i].unload(); + } return TRUE; } @@ -1196,10 +1219,13 @@ BOOL LLViewerShaderMgr::loadShadersDeferred() gDeferredSkinnedAlphaProgram.mFeatures.isAlphaLighting = true; gDeferredSkinnedAlphaProgram.mFeatures.disableTextureIndex = true; gDeferredSkinnedAlphaProgram.mShaderFiles.clear(); - gDeferredSkinnedAlphaProgram.mShaderFiles.push_back(make_pair("deferred/alphaSkinnedV.glsl", GL_VERTEX_SHADER_ARB)); - gDeferredSkinnedAlphaProgram.mShaderFiles.push_back(make_pair("deferred/alphaNonIndexedF.glsl", GL_FRAGMENT_SHADER_ARB)); + gDeferredSkinnedAlphaProgram.mShaderFiles.push_back(make_pair("deferred/alphaV.glsl", GL_VERTEX_SHADER_ARB)); + gDeferredSkinnedAlphaProgram.mShaderFiles.push_back(make_pair("deferred/alphaF.glsl", GL_FRAGMENT_SHADER_ARB)); gDeferredSkinnedAlphaProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED]; - + gDeferredSkinnedAlphaProgram.addPermutation("USE_DIFFUSE_TEX", "1"); + gDeferredSkinnedAlphaProgram.addPermutation("USE_VERTEX_COLOR", "1"); + gDeferredSkinnedAlphaProgram.addPermutation("HAS_SKIN", "1"); + gDeferredSkinnedAlphaProgram.addPermutation("HAS_SHADOW", mVertexShaderLevel[SHADER_DEFERRED] > 1 ? "1" : "0"); success = gDeferredSkinnedAlphaProgram.createShader(NULL, NULL); // Hack to include uniforms for lighting without linking in lighting file @@ -1216,7 +1242,64 @@ BOOL LLViewerShaderMgr::loadShadersDeferred() gDeferredBumpProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED]; success = gDeferredBumpProgram.createShader(NULL, NULL); } + + gDeferredMaterialProgram[1].mFeatures.hasLighting = false; + gDeferredMaterialProgram[5].mFeatures.hasLighting = false; + gDeferredMaterialProgram[9].mFeatures.hasLighting = false; + gDeferredMaterialProgram[13].mFeatures.hasLighting = false; + gDeferredMaterialProgram[1+LLMaterial::SHADER_COUNT].mFeatures.hasLighting = false; + gDeferredMaterialProgram[5+LLMaterial::SHADER_COUNT].mFeatures.hasLighting = false; + gDeferredMaterialProgram[9+LLMaterial::SHADER_COUNT].mFeatures.hasLighting = false; + gDeferredMaterialProgram[13+LLMaterial::SHADER_COUNT].mFeatures.hasLighting = false; + for (U32 i = 0; i < LLMaterial::SHADER_COUNT*2; ++i) + { + if (success) + { + gDeferredMaterialProgram[i].mName = llformat("Deferred Material Shader %d", i); + + U32 alpha_mode = i & 0x3; + + gDeferredMaterialProgram[i].mShaderFiles.clear(); + gDeferredMaterialProgram[i].mShaderFiles.push_back(make_pair("deferred/materialV.glsl", GL_VERTEX_SHADER_ARB)); + gDeferredMaterialProgram[i].mShaderFiles.push_back(make_pair("deferred/materialF.glsl", GL_FRAGMENT_SHADER_ARB)); + gDeferredMaterialProgram[i].mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED]; + gDeferredMaterialProgram[i].addPermutation("HAS_NORMAL_MAP", i & 0x8? "1" : "0"); + gDeferredMaterialProgram[i].addPermutation("HAS_SPECULAR_MAP", i & 0x4 ? "1" : "0"); + gDeferredMaterialProgram[i].addPermutation("DIFFUSE_ALPHA_MODE", llformat("%d", alpha_mode)); + gDeferredMaterialProgram[i].addPermutation("HAS_SUN_SHADOW", mVertexShaderLevel[SHADER_DEFERRED] > 1 ? "1" : "0"); + bool has_skin = i & 0x10; + gDeferredMaterialProgram[i].addPermutation("HAS_SKIN",has_skin ? "1" : "0"); + + #if LL_DARWIN + // include spec exp clamp to fix older mac rendering artifacts + // + if (gGLManager.mIsMobileGF) + { + gDeferredMaterialProgram[i].addPermutation("UGLY_MAC_HACK","1"); + } + #endif + + if (has_skin) + { + gDeferredMaterialProgram[i].mFeatures.hasObjectSkinning = true; + } + + success = gDeferredMaterialProgram[i].createShader(NULL, NULL); + } + } + + gDeferredMaterialProgram[1].mFeatures.hasLighting = true; + gDeferredMaterialProgram[5].mFeatures.hasLighting = true; + gDeferredMaterialProgram[9].mFeatures.hasLighting = true; + gDeferredMaterialProgram[13].mFeatures.hasLighting = true; + gDeferredMaterialProgram[1+LLMaterial::SHADER_COUNT].mFeatures.hasLighting = true; + gDeferredMaterialProgram[5+LLMaterial::SHADER_COUNT].mFeatures.hasLighting = true; + gDeferredMaterialProgram[9+LLMaterial::SHADER_COUNT].mFeatures.hasLighting = true; + gDeferredMaterialProgram[13+LLMaterial::SHADER_COUNT].mFeatures.hasLighting = true; + + + if (success) { gDeferredTreeProgram.mName = "Deferred Tree Shader"; @@ -1346,8 +1429,10 @@ BOOL LLViewerShaderMgr::loadShadersDeferred() gDeferredAlphaProgram.mShaderFiles.clear(); gDeferredAlphaProgram.mShaderFiles.push_back(make_pair("deferred/alphaV.glsl", GL_VERTEX_SHADER_ARB)); gDeferredAlphaProgram.mShaderFiles.push_back(make_pair("deferred/alphaF.glsl", GL_FRAGMENT_SHADER_ARB)); + gDeferredAlphaProgram.addPermutation("USE_INDEXED_TEX", "1"); + gDeferredAlphaProgram.addPermutation("USE_VERTEX_COLOR", "1"); + gDeferredAlphaProgram.addPermutation("HAS_SHADOW", mVertexShaderLevel[SHADER_DEFERRED] > 1 ? "1" : "0"); gDeferredAlphaProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED]; - success = gDeferredAlphaProgram.createShader(NULL, NULL); // Hack @@ -1435,6 +1520,7 @@ BOOL LLViewerShaderMgr::loadShadersDeferred() gDeferredShadowProgram.mShaderFiles.push_back(make_pair("deferred/shadowV.glsl", GL_VERTEX_SHADER_ARB)); gDeferredShadowProgram.mShaderFiles.push_back(make_pair("deferred/shadowF.glsl", GL_FRAGMENT_SHADER_ARB)); gDeferredShadowProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED]; + gDeferredShadowProgram.addPermutation("DEPTH_CLAMP", gGLManager.mHasDepthClamp ? "1" : "0"); success = gDeferredShadowProgram.createShader(NULL, NULL); } @@ -1444,6 +1530,7 @@ BOOL LLViewerShaderMgr::loadShadersDeferred() 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.addPermutation("DEPTH_CLAMP", gGLManager.mHasDepthClamp ? "1" : "0"); gDeferredShadowCubeProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED]; success = gDeferredShadowCubeProgram.createShader(NULL, NULL); } @@ -1455,6 +1542,7 @@ BOOL LLViewerShaderMgr::loadShadersDeferred() gDeferredShadowAlphaMaskProgram.mShaderFiles.clear(); gDeferredShadowAlphaMaskProgram.mShaderFiles.push_back(make_pair("deferred/shadowAlphaMaskV.glsl", GL_VERTEX_SHADER_ARB)); gDeferredShadowAlphaMaskProgram.mShaderFiles.push_back(make_pair("deferred/shadowAlphaMaskF.glsl", GL_FRAGMENT_SHADER_ARB)); + gDeferredShadowAlphaMaskProgram.addPermutation("DEPTH_CLAMP", gGLManager.mHasDepthClamp ? "1" : "0"); gDeferredShadowAlphaMaskProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED]; success = gDeferredShadowAlphaMaskProgram.createShader(NULL, NULL); } @@ -1466,6 +1554,7 @@ BOOL LLViewerShaderMgr::loadShadersDeferred() gDeferredAvatarShadowProgram.mShaderFiles.clear(); gDeferredAvatarShadowProgram.mShaderFiles.push_back(make_pair("deferred/avatarShadowV.glsl", GL_VERTEX_SHADER_ARB)); gDeferredAvatarShadowProgram.mShaderFiles.push_back(make_pair("deferred/avatarShadowF.glsl", GL_FRAGMENT_SHADER_ARB)); + gDeferredAvatarShadowProgram.addPermutation("DEPTH_CLAMP", gGLManager.mHasDepthClamp ? "1" : "0"); gDeferredAvatarShadowProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED]; success = gDeferredAvatarShadowProgram.createShader(NULL, &mAvatarUniforms); } @@ -1477,6 +1566,7 @@ BOOL LLViewerShaderMgr::loadShadersDeferred() gDeferredAttachmentShadowProgram.mShaderFiles.clear(); gDeferredAttachmentShadowProgram.mShaderFiles.push_back(make_pair("deferred/attachmentShadowV.glsl", GL_VERTEX_SHADER_ARB)); gDeferredAttachmentShadowProgram.mShaderFiles.push_back(make_pair("deferred/attachmentShadowF.glsl", GL_FRAGMENT_SHADER_ARB)); + gDeferredAttachmentShadowProgram.addPermutation("DEPTH_CLAMP", gGLManager.mHasDepthClamp ? "1" : "0"); gDeferredAttachmentShadowProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED]; success = gDeferredAttachmentShadowProgram.createShader(NULL, NULL); } @@ -1515,8 +1605,11 @@ BOOL LLViewerShaderMgr::loadShadersDeferred() gDeferredAvatarAlphaProgram.mFeatures.isAlphaLighting = true; gDeferredAvatarAlphaProgram.mFeatures.disableTextureIndex = true; gDeferredAvatarAlphaProgram.mShaderFiles.clear(); - gDeferredAvatarAlphaProgram.mShaderFiles.push_back(make_pair("deferred/avatarAlphaNoColorV.glsl", GL_VERTEX_SHADER_ARB)); - gDeferredAvatarAlphaProgram.mShaderFiles.push_back(make_pair("deferred/alphaNonIndexedNoColorF.glsl", GL_FRAGMENT_SHADER_ARB)); + gDeferredAvatarAlphaProgram.mShaderFiles.push_back(make_pair("deferred/alphaV.glsl", GL_VERTEX_SHADER_ARB)); + gDeferredAvatarAlphaProgram.mShaderFiles.push_back(make_pair("deferred/alphaF.glsl", GL_FRAGMENT_SHADER_ARB)); + gDeferredAvatarAlphaProgram.addPermutation("USE_DIFFUSE_TEX", "1"); + gDeferredAvatarAlphaProgram.addPermutation("IS_AVATAR_SKIN", "1"); + gDeferredAvatarAlphaProgram.addPermutation("HAS_SHADOW", mVertexShaderLevel[SHADER_DEFERRED] > 1 ? "1" : "0"); gDeferredAvatarAlphaProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED]; success = gDeferredAvatarAlphaProgram.createShader(NULL, &mAvatarUniforms); @@ -1524,6 +1617,16 @@ BOOL LLViewerShaderMgr::loadShadersDeferred() gDeferredAvatarAlphaProgram.mFeatures.calculatesLighting = true; gDeferredAvatarAlphaProgram.mFeatures.hasLighting = true; } + + if (success) + { + gDeferredPostGammaCorrectProgram.mName = "Deferred Gamma Correction Post Process"; + gDeferredPostGammaCorrectProgram.mShaderFiles.clear(); + gDeferredPostGammaCorrectProgram.mShaderFiles.push_back(make_pair("deferred/postDeferredNoTCV.glsl", GL_VERTEX_SHADER_ARB)); + gDeferredPostGammaCorrectProgram.mShaderFiles.push_back(make_pair("deferred/postDeferredGammaCorrect.glsl", GL_FRAGMENT_SHADER_ARB)); + gDeferredPostGammaCorrectProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED]; + success = gDeferredPostGammaCorrectProgram.createShader(NULL, NULL); + } if (success) { diff --git a/indra/newview/llviewershadermgr.h b/indra/newview/llviewershadermgr.h index e3d28f2f5c..5ef5d2234c 100644 --- a/indra/newview/llviewershadermgr.h +++ b/indra/newview/llviewershadermgr.h @@ -28,6 +28,7 @@ #define LL_VIEWER_SHADER_MGR_H #include "llshadermgr.h" +#include "llmaterial.h" class LLViewerShaderMgr: public LLShaderMgr { @@ -349,6 +350,7 @@ extern LLGLSLShader gDeferredCoFProgram; extern LLGLSLShader gDeferredDoFCombineProgram; extern LLGLSLShader gFXAAProgram; extern LLGLSLShader gDeferredPostNoDoFProgram; +extern LLGLSLShader gDeferredPostGammaCorrectProgram; extern LLGLSLShader gDeferredAvatarShadowProgram; extern LLGLSLShader gDeferredAttachmentShadowProgram; extern LLGLSLShader gDeferredAlphaProgram; @@ -361,4 +363,7 @@ extern LLGLSLShader gDeferredWLCloudProgram; extern LLGLSLShader gDeferredStarProgram; extern LLGLSLShader gNormalMapGenProgram; +// Deferred materials shaders +extern LLGLSLShader gDeferredMaterialProgram[LLMaterial::SHADER_COUNT*2]; + #endif diff --git a/indra/newview/llviewerstatsrecorder.cpp b/indra/newview/llviewerstatsrecorder.cpp index 91e485d01b..3ff2dfa4fe 100644 --- a/indra/newview/llviewerstatsrecorder.cpp +++ b/indra/newview/llviewerstatsrecorder.cpp @@ -216,7 +216,11 @@ void LLViewerStatsRecorder::writeToLog( F32 interval ) << "Texture Fetch bps\t" << "\n"; - fwrite(data_msg.str().c_str(), 1, data_msg.str().size(), mObjectCacheFile ); + size_t data_size = data_msg.str().size(); + if ( data_size != fwrite(data_msg.str().c_str(), 1, data_size, mObjectCacheFile )) + { + llwarns << "Unable to write complete column headings to " << STATS_FILE_NAME << llendl; + } } else { @@ -249,7 +253,11 @@ void LLViewerStatsRecorder::writeToLog( F32 interval ) << "\t" << (mTextureFetchSize * 8 / delta_time) << "\n"; - fwrite(data_msg.str().c_str(), 1, data_msg.str().size(), mObjectCacheFile ); + size_t data_size = data_msg.str().size(); + if ( data_size != fwrite(data_msg.str().c_str(), 1, data_size, mObjectCacheFile )) + { + llwarns << "Unable to write complete column data to " << STATS_FILE_NAME << llendl; + } clearStats(); } diff --git a/indra/newview/llviewertexlayer.cpp b/indra/newview/llviewertexlayer.cpp index 777e1f9c76..777e1f9c76 100755..100644 --- a/indra/newview/llviewertexlayer.cpp +++ b/indra/newview/llviewertexlayer.cpp diff --git a/indra/newview/llviewertexture.cpp b/indra/newview/llviewertexture.cpp index eb6c453e76..8c1c203bd1 100644 --- a/indra/newview/llviewertexture.cpp +++ b/indra/newview/llviewertexture.cpp @@ -55,8 +55,6 @@ #include "llappviewer.h" #include "llface.h" #include "llviewercamera.h" -#include "lltextureatlas.h" -#include "lltextureatlasmanager.h" #include "lltextureentry.h" #include "lltexturemanagerbridge.h" #include "llmediaentry.h" @@ -73,6 +71,7 @@ LLPointer<LLViewerFetchedTexture> LLViewerFetchedTexture::sMissingAssetImagep = LLPointer<LLViewerFetchedTexture> LLViewerFetchedTexture::sWhiteImagep = NULL; LLPointer<LLViewerFetchedTexture> LLViewerFetchedTexture::sDefaultImagep = NULL; LLPointer<LLViewerFetchedTexture> LLViewerFetchedTexture::sSmokeImagep = NULL; +LLPointer<LLViewerFetchedTexture> LLViewerFetchedTexture::sFlatNormalImagep = NULL; LLViewerMediaTexture::media_map_t LLViewerMediaTexture::sMediaMap ; LLTexturePipelineTester* LLViewerTextureManager::sTesterp = NULL ; const std::string sTesterName("TextureTester"); @@ -98,7 +97,6 @@ S32 LLViewerTexture::sMinLargeImageSize = 65536 ; //256 * 256. S32 LLViewerTexture::sMaxSmallImageSize = MAX_CACHED_RAW_IMAGE_AREA ; BOOL LLViewerTexture::sFreezeImageScalingDown = FALSE ; F32 LLViewerTexture::sCurrentTime = 0.0f ; -BOOL LLViewerTexture::sUseTextureAtlas = FALSE ; F32 LLViewerTexture::sTexelPixelRatio = 1.0f; LLViewerTexture::EDebugTexels LLViewerTexture::sDebugTexelsMode = LLViewerTexture::DEBUG_TEXELS_OFF; @@ -425,6 +423,7 @@ void LLViewerTextureManager::cleanup() LLViewerFetchedTexture::sSmokeImagep = NULL; LLViewerFetchedTexture::sMissingAssetImagep = NULL; LLViewerFetchedTexture::sWhiteImagep = NULL; + LLViewerFetchedTexture::sFlatNormalImagep = NULL; LLViewerMediaTexture::cleanUpClass() ; } @@ -565,8 +564,7 @@ void LLViewerTexture::updateClass(const F32 velocity, const F32 angular_velocity } } sDesiredDiscardBias = llclamp(sDesiredDiscardBias, desired_discard_bias_min, desired_discard_bias_max); - LLViewerTexture::sUseTextureAtlas = gSavedSettings.getBOOL("EnableTextureAtlas") ; - + F32 camera_moving_speed = LLViewerCamera::getInstance()->getAverageSpeed() ; F32 camera_angular_speed = LLViewerCamera::getInstance()->getAverageAngularSpeed(); sCameraMovingBias = llmax(0.2f * camera_moving_speed, 2.0f * camera_angular_speed - 1); @@ -632,9 +630,14 @@ void LLViewerTexture::init(bool firstinit) mMaxVirtualSizeResetCounter = mMaxVirtualSizeResetInterval ; mAdditionalDecodePriority = 0.f ; mParcelMedia = NULL ; - mNumFaces = 0 ; + mNumVolumes = 0; - mFaceList.clear() ; + mFaceList[LLRender::DIFFUSE_MAP].clear() ; + mFaceList[LLRender::NORMAL_MAP].clear() ; + mFaceList[LLRender::SPECULAR_MAP].clear() ; + mNumFaces[LLRender::DIFFUSE_MAP] = + mNumFaces[LLRender::NORMAL_MAP] = + mNumFaces[LLRender::SPECULAR_MAP] = 0 ; mVolumeList.clear(); } @@ -646,7 +649,9 @@ S8 LLViewerTexture::getType() const void LLViewerTexture::cleanup() { - mFaceList.clear() ; + mFaceList[LLRender::DIFFUSE_MAP].clear() ; + mFaceList[LLRender::NORMAL_MAP].clear() ; + mFaceList[LLRender::SPECULAR_MAP].clear() ; mVolumeList.clear(); } @@ -762,38 +767,57 @@ void LLViewerTexture::setKnownDrawSize(S32 width, S32 height) } //virtual -void LLViewerTexture::addFace(LLFace* facep) +void LLViewerTexture::addFace(U32 ch, LLFace* facep) { - if(mNumFaces >= mFaceList.size()) + llassert(ch < LLRender::NUM_TEXTURE_CHANNELS); + + if(mNumFaces[ch] >= mFaceList[ch].size()) { - mFaceList.resize(2 * mNumFaces + 1) ; + mFaceList[ch].resize(2 * mNumFaces[ch] + 1) ; } - mFaceList[mNumFaces] = facep ; - facep->setIndexInTex(mNumFaces) ; - mNumFaces++ ; + mFaceList[ch][mNumFaces[ch]] = facep ; + facep->setIndexInTex(ch, mNumFaces[ch]) ; + mNumFaces[ch]++ ; mLastFaceListUpdateTimer.reset() ; } //virtual -void LLViewerTexture::removeFace(LLFace* facep) +void LLViewerTexture::removeFace(U32 ch, LLFace* facep) { - if(mNumFaces > 1) + llassert(ch < LLRender::NUM_TEXTURE_CHANNELS); + + if(mNumFaces[ch] > 1) { - S32 index = facep->getIndexInTex() ; - mFaceList[index] = mFaceList[--mNumFaces] ; - mFaceList[index]->setIndexInTex(index) ; + S32 index = facep->getIndexInTex(ch) ; + llassert(index < mFaceList[ch].size()); + llassert(index < mNumFaces[ch]); + mFaceList[ch][index] = mFaceList[ch][--mNumFaces[ch]] ; + mFaceList[ch][index]->setIndexInTex(ch, index) ; } else { - mFaceList.clear() ; - mNumFaces = 0 ; + mFaceList[ch].clear() ; + mNumFaces[ch] = 0 ; } mLastFaceListUpdateTimer.reset() ; } -S32 LLViewerTexture::getNumFaces() const +S32 LLViewerTexture::getTotalNumFaces() const +{ + S32 ret = 0; + + for (U32 i = 0; i < LLRender::NUM_TEXTURE_CHANNELS; ++i) + { + ret += mNumFaces[i]; + } + + return ret; +} + +S32 LLViewerTexture::getNumFaces(U32 ch) const { - return mNumFaces ; + llassert(ch < LLRender::NUM_TEXTURE_CHANNELS); + return mNumFaces[ch]; } @@ -816,6 +840,8 @@ void LLViewerTexture::removeVolume(LLVOVolume* volumep) if(mNumVolumes > 1) { S32 index = volumep->getIndexInTex() ; + llassert(index < mVolumeList.size()); + llassert(index < mNumVolumes); mVolumeList[index] = mVolumeList[--mNumVolumes] ; mVolumeList[index]->setIndexInTex(index) ; } @@ -837,18 +863,22 @@ void LLViewerTexture::reorganizeFaceList() static const F32 MAX_WAIT_TIME = 20.f; // seconds static const U32 MAX_EXTRA_BUFFER_SIZE = 4 ; - if(mNumFaces + MAX_EXTRA_BUFFER_SIZE > mFaceList.size()) + if(mLastFaceListUpdateTimer.getElapsedTimeF32() < MAX_WAIT_TIME) { - return ; + return; } - if(mLastFaceListUpdateTimer.getElapsedTimeF32() < MAX_WAIT_TIME) + for (U32 i = 0; i < LLRender::NUM_TEXTURE_CHANNELS; ++i) { - return ; + if(mNumFaces[i] + MAX_EXTRA_BUFFER_SIZE > mFaceList[i].size()) + { + return ; + } + + mFaceList[i].erase(mFaceList[i].begin() + mNumFaces[i], mFaceList[i].end()); } - + mLastFaceListUpdateTimer.reset() ; - mFaceList.erase(mFaceList.begin() + mNumFaces, mFaceList.end()); } void LLViewerTexture::reorganizeVolumeList() @@ -1194,9 +1224,14 @@ void LLViewerFetchedTexture::addToCreateTexture() mGLTexturep->setComponents(mComponents) ; force_update = true ; - for(U32 i = 0 ; i < mNumFaces ; i++) + for (U32 j = 0; j < LLRender::NUM_TEXTURE_CHANNELS; ++j) { - mFaceList[i]->dirtyTexture() ; + llassert(mNumFaces[j] <= mFaceList[j].size()); + + for(U32 i = 0 ; i < mNumFaces[j]; i++) + { + mFaceList[j][i]->dirtyTexture() ; + } } //discard the cached raw image and the saved raw image @@ -1340,11 +1375,8 @@ BOOL LLViewerFetchedTexture::createTexture(S32 usename/*= 0*/) return FALSE; } - if(!(res = insertToAtlas())) - { - res = mGLTexturep->createGLTexture(mRawDiscardLevel, mRawImage, usename, TRUE, mBoostLevel); - resetFaceAtlas() ; - } + res = mGLTexturep->createGLTexture(mRawDiscardLevel, mRawImage, usename, TRUE, mBoostLevel); + setActive() ; if (!needsToSaveRawImage()) @@ -1633,28 +1665,32 @@ void LLViewerFetchedTexture::updateVirtualSize() addTextureStats(0.f, FALSE) ;//reset } - for(U32 i = 0 ; i < mNumFaces ; i++) - { - LLFace* facep = mFaceList[i] ; - if( facep ) - { - LLDrawable* drawable = facep->getDrawable(); - if (drawable) + for (U32 ch = 0; ch < LLRender::NUM_TEXTURE_CHANNELS; ++ch) + { + llassert(mNumFaces[ch] <= mFaceList[ch].size()); + + for(U32 i = 0 ; i < mNumFaces[ch]; i++) + { + LLFace* facep = mFaceList[ch][i] ; + if( facep ) { - if(drawable->isRecentlyVisible()) + LLDrawable* drawable = facep->getDrawable(); + if (drawable) { - if (getBoostLevel() == LLViewerTexture::BOOST_NONE && - drawable->getVObj() && drawable->getVObj()->isSelected()) + if(drawable->isRecentlyVisible()) { - setBoostLevel(LLViewerTexture::BOOST_SELECTED); + if (getBoostLevel() == LLViewerTexture::BOOST_NONE && + drawable->getVObj() && drawable->getVObj()->isSelected()) + { + setBoostLevel(LLViewerTexture::BOOST_SELECTED); + } + addTextureStats(facep->getVirtualSize()) ; + setAdditionalDecodePriority(facep->getImportanceToCamera()) ; } - addTextureStats(facep->getVirtualSize()) ; - setAdditionalDecodePriority(facep->getImportanceToCamera()) ; } } } } - //reset whether or not a face was selected after 10 seconds const F32 SELECTION_RESET_TIME = 10.f; @@ -2739,190 +2775,6 @@ F32 LLViewerFetchedTexture::getElapsedLastReferencedSavedRawImageTime() const { return sCurrentTime - mLastReferencedSavedRawImageTime ; } -//---------------------------------------------------------------------------------------------- -//atlasing -//---------------------------------------------------------------------------------------------- -void LLViewerFetchedTexture::resetFaceAtlas() -{ - //Nothing should be done here. -} - -//invalidate all atlas slots for this image. -void LLViewerFetchedTexture::invalidateAtlas(BOOL rebuild_geom) -{ - for(U32 i = 0 ; i < mNumFaces ; i++) - { - LLFace* facep = mFaceList[i] ; - facep->removeAtlas() ; - if(rebuild_geom && facep->getDrawable() && facep->getDrawable()->getSpatialGroup()) - { - facep->getDrawable()->getSpatialGroup()->setState(LLSpatialGroup::GEOM_DIRTY); - } - } -} - -BOOL LLViewerFetchedTexture::insertToAtlas() -{ - if(!LLViewerTexture::sUseTextureAtlas) - { - return FALSE ; - } - if(getNumFaces() < 1) - { - return FALSE ; - } - if(mGLTexturep->getDiscardLevelInAtlas() > 0 && mRawDiscardLevel >= mGLTexturep->getDiscardLevelInAtlas()) - { - return FALSE ; - } - if(!LLTextureAtlasManager::getInstance()->canAddToAtlas(mRawImage->getWidth(), mRawImage->getHeight(), mRawImage->getComponents(), mGLTexturep->getTexTarget())) - { - return FALSE ; - } - - BOOL ret = TRUE ;//if ret is set to false, will generate a gl texture for this image. - S32 raw_w = mRawImage->getWidth() ; - S32 raw_h = mRawImage->getHeight() ; - F32 xscale = 1.0f, yscale = 1.0f ; - LLPointer<LLTextureAtlasSlot> slot_infop; - LLTextureAtlasSlot* cur_slotp ;//no need to be smart pointer. - LLSpatialGroup* groupp ; - LLFace* facep; - - //if the atlas slot pointers for some faces are null, process them later. - ll_face_list_t waiting_list ; - for(U32 i = 0 ; i < mNumFaces ; i++) - { - { - facep = mFaceList[i] ; - - //face can not use atlas. - if(!facep->canUseAtlas()) - { - if(facep->getAtlasInfo()) - { - facep->removeAtlas() ; - } - ret = FALSE ; - continue ; - } - - //the atlas slot is updated - slot_infop = facep->getAtlasInfo() ; - groupp = facep->getDrawable()->getSpatialGroup() ; - - if(slot_infop) - { - if(slot_infop->getSpatialGroup() != groupp) - { - if((cur_slotp = groupp->getCurUpdatingSlot(this))) //switch slot - { - facep->setAtlasInfo(cur_slotp) ; - facep->setAtlasInUse(TRUE) ; - continue ; - } - else //do not forget to update slot_infop->getSpatialGroup(). - { - LLSpatialGroup* gp = slot_infop->getSpatialGroup() ; - gp->setCurUpdatingTime(gFrameCount) ; - gp->setCurUpdatingTexture(this) ; - gp->setCurUpdatingSlot(slot_infop) ; - } - } - else //same group - { - if(gFrameCount && slot_infop->getUpdatedTime() == gFrameCount)//slot is just updated - { - facep->setAtlasInUse(TRUE) ; - continue ; - } - } - } - else - { - //if the slot is null, wait to process them later. - waiting_list.push_back(facep) ; - continue ; - } - - //---------- - //insert to atlas - if(!slot_infop->getAtlas()->insertSubTexture(mGLTexturep, mRawDiscardLevel, mRawImage, slot_infop->getSlotCol(), slot_infop->getSlotRow())) - { - - //the texture does not qualify to add to atlas, do not bother to try for other faces. - //invalidateAtlas(); - return FALSE ; - } - - //update texture scale - slot_infop->getAtlas()->getTexCoordScale(raw_w, raw_h, xscale, yscale) ; - slot_infop->setTexCoordScale(xscale, yscale) ; - slot_infop->setValid() ; - slot_infop->setUpdatedTime(gFrameCount) ; - - //update spatial group atlas info - groupp->setCurUpdatingTime(gFrameCount) ; - groupp->setCurUpdatingTexture(this) ; - groupp->setCurUpdatingSlot(slot_infop) ; - - //make the face to switch to the atlas. - facep->setAtlasInUse(TRUE) ; - } - } - - //process the waiting_list - for(std::vector<LLFace*>::iterator iter = waiting_list.begin(); iter != waiting_list.end(); ++iter) - { - facep = (LLFace*)*iter ; - groupp = facep->getDrawable()->getSpatialGroup() ; - - //check if this texture already inserted to atlas for this group - if((cur_slotp = groupp->getCurUpdatingSlot(this))) - { - facep->setAtlasInfo(cur_slotp) ; - facep->setAtlasInUse(TRUE) ; - continue ; - } - - //need to reserve a slot from atlas - slot_infop = LLTextureAtlasManager::getInstance()->reserveAtlasSlot(llmax(mFullWidth, mFullHeight), getComponents(), groupp, this) ; - - facep->setAtlasInfo(slot_infop) ; - - groupp->setCurUpdatingTime(gFrameCount) ; - groupp->setCurUpdatingTexture(this) ; - groupp->setCurUpdatingSlot(slot_infop) ; - - //slot allocation failed. - if(!slot_infop || !slot_infop->getAtlas()) - { - ret = FALSE ; - facep->setAtlasInUse(FALSE) ; - continue ; - } - - //insert to atlas - if(!slot_infop->getAtlas()->insertSubTexture(mGLTexturep, mRawDiscardLevel, mRawImage, slot_infop->getSlotCol(), slot_infop->getSlotRow())) - { - //the texture does not qualify to add to atlas, do not bother to try for other faces. - ret = FALSE ; - //invalidateAtlas(); - break ; - } - - //update texture scale - slot_infop->getAtlas()->getTexCoordScale(raw_w, raw_h, xscale, yscale) ; - slot_infop->setTexCoordScale(xscale, yscale) ; - slot_infop->setValid() ; - slot_infop->setUpdatedTime(gFrameCount) ; - - //make the face to switch to the atlas. - facep->setAtlasInUse(TRUE) ; - } - - return ret ; -} //---------------------------------------------------------------------------------------------- //end of LLViewerFetchedTexture @@ -3269,11 +3121,14 @@ BOOL LLViewerMediaTexture::findFaces() LLViewerTexture* tex = gTextureList.findImage(mID) ; if(tex) //this media is a parcel media for tex. { - const ll_face_list_t* face_list = tex->getFaceList() ; - U32 end = tex->getNumFaces() ; - for(U32 i = 0 ; i < end ; i++) + for (U32 ch = 0; ch < LLRender::NUM_TEXTURE_CHANNELS; ++ch) { - mMediaFaceList.push_back((*face_list)[i]) ; + const ll_face_list_t* face_list = tex->getFaceList(ch) ; + U32 end = tex->getNumFaces(ch) ; + for(U32 i = 0 ; i < end ; i++) + { + mMediaFaceList.push_back((*face_list)[i]) ; + } } } @@ -3338,7 +3193,7 @@ void LLViewerMediaTexture::addMediaToFace(LLFace* facep) return ; //no need to add the face because the media is not in playing. } - switchTexture(facep) ; + switchTexture(LLRender::DIFFUSE_MAP, facep) ; } void LLViewerMediaTexture::removeMediaFromFace(LLFace* facep) @@ -3355,19 +3210,19 @@ void LLViewerMediaTexture::removeMediaFromFace(LLFace* facep) } mIsPlaying = FALSE ; //set to remove the media from the face. - switchTexture(facep) ; + switchTexture(LLRender::DIFFUSE_MAP, facep) ; mIsPlaying = TRUE ; //set the flag back. - if(getNumFaces() < 1) //no face referencing to this media + if(getTotalNumFaces() < 1) //no face referencing to this media { stopPlaying() ; } } //virtual -void LLViewerMediaTexture::addFace(LLFace* facep) +void LLViewerMediaTexture::addFace(U32 ch, LLFace* facep) { - LLViewerTexture::addFace(facep) ; + LLViewerTexture::addFace(ch, facep) ; const LLTextureEntry* te = facep->getTextureEntry() ; if(te && te->getID().notNull()) @@ -3394,9 +3249,9 @@ void LLViewerMediaTexture::addFace(LLFace* facep) } //virtual -void LLViewerMediaTexture::removeFace(LLFace* facep) +void LLViewerMediaTexture::removeFace(U32 ch, LLFace* facep) { - LLViewerTexture::removeFace(facep) ; + LLViewerTexture::removeFace(ch, facep) ; const LLTextureEntry* te = facep->getTextureEntry() ; if(te && te->getID().notNull()) @@ -3414,24 +3269,35 @@ void LLViewerMediaTexture::removeFace(LLFace* facep) } } - // - //we have some trouble here: the texture of the face is changed. - //we need to find the former texture, and remove it from the list to avoid memory leaking. - if(!mNumFaces) + std::vector<const LLTextureEntry*> te_list; + + for (U32 ch = 0; ch < 3; ++ch) { - mTextureList.clear() ; - return ; + // + //we have some trouble here: the texture of the face is changed. + //we need to find the former texture, and remove it from the list to avoid memory leaking. + + llassert(mNumFaces[ch] <= mFaceList[ch].size()); + + for(U32 j = 0 ; j < mNumFaces[ch] ; j++) + { + te_list.push_back(mFaceList[ch][j]->getTextureEntry());//all textures are in use. + } } - S32 end = getNumFaces() ; - std::vector<const LLTextureEntry*> te_list(end) ; - S32 i = 0 ; - for(U32 j = 0 ; j < mNumFaces ; j++) + + if (te_list.empty()) { - te_list[i++] = mFaceList[j]->getTextureEntry() ;//all textures are in use. + mTextureList.clear() ; + return ; } + + S32 end = te_list.size(); + for(std::list< LLPointer<LLViewerTexture> >::iterator iter = mTextureList.begin(); iter != mTextureList.end(); ++iter) { + S32 i = 0; + for(i = 0 ; i < end ; i++) { if(te_list[i] && te_list[i]->getID() == (*iter)->getID())//the texture is in use. @@ -3476,7 +3342,7 @@ void LLViewerMediaTexture::stopPlaying() mIsPlaying = FALSE ; } -void LLViewerMediaTexture::switchTexture(LLFace* facep) +void LLViewerMediaTexture::switchTexture(U32 ch, LLFace* facep) { if(facep) { @@ -3492,7 +3358,7 @@ void LLViewerMediaTexture::switchTexture(LLFace* facep) if(mIsPlaying) //old textures switch to the media texture { - facep->switchTexture(this) ; + facep->switchTexture(ch, this) ; } else //switch to old textures. { @@ -3508,7 +3374,7 @@ void LLViewerMediaTexture::switchTexture(LLFace* facep) { tex = LLViewerFetchedTexture::sDefaultImagep ; } - facep->switchTexture(tex) ; + facep->switchTexture(ch, tex) ; } } } @@ -3547,14 +3413,17 @@ void LLViewerMediaTexture::setPlaying(BOOL playing) for(std::list< LLFace* >::iterator iter = mMediaFaceList.begin(); iter!= mMediaFaceList.end(); ++iter) { - switchTexture(*iter) ; + switchTexture(LLRender::DIFFUSE_MAP, *iter) ; } } else //stop playing this media { - for(U32 i = mNumFaces ; i ; i--) + U32 ch = LLRender::DIFFUSE_MAP; + + llassert(mNumFaces[ch] <= mFaceList[ch].size()); + for(U32 i = mNumFaces[ch] ; i ; i--) { - switchTexture(mFaceList[i - 1]) ; //current face could be removed in this function. + switchTexture(ch, mFaceList[ch][i - 1]) ; //current face could be removed in this function. } } return ; @@ -3576,14 +3445,18 @@ F32 LLViewerMediaTexture::getMaxVirtualSize() if(mIsPlaying) //media is playing { - for(U32 i = 0 ; i < mNumFaces ; i++) + for (U32 ch = 0; ch < LLRender::NUM_TEXTURE_CHANNELS; ++ch) { - LLFace* facep = mFaceList[i] ; - if(facep->getDrawable()->isRecentlyVisible()) + llassert(mNumFaces[ch] <= mFaceList[ch].size()); + for(U32 i = 0 ; i < mNumFaces[ch] ; i++) { - addTextureStats(facep->getVirtualSize()) ; - } - } + LLFace* facep = mFaceList[ch][i] ; + if(facep->getDrawable()->isRecentlyVisible()) + { + addTextureStats(facep->getVirtualSize()) ; + } + } + } } else //media is not in playing { diff --git a/indra/newview/llviewertexture.h b/indra/newview/llviewertexture.h index f2e1a90713..d6805a7240 100644 --- a/indra/newview/llviewertexture.h +++ b/indra/newview/llviewertexture.h @@ -34,6 +34,7 @@ #include "llgltypes.h" #include "llrender.h" #include "llmetricperformancetester.h" +#include "llface.h" #include <map> #include <list> @@ -41,7 +42,6 @@ #define MIN_VIDEO_RAM_IN_MEGA_BYTES 32 #define MAX_VIDEO_RAM_IN_MEGA_BYTES 512 // 512MB max for performance reasons. -class LLFace; class LLImageGL ; class LLImageRaw; class LLViewerObject; @@ -98,7 +98,6 @@ public: DYNAMIC_TEXTURE, FETCHED_TEXTURE, LOD_TEXTURE, - ATLAS_TEXTURE, INVALID_TEXTURE_TYPE }; @@ -142,10 +141,11 @@ public: /*virtual*/ void setKnownDrawSize(S32 width, S32 height); - virtual void addFace(LLFace* facep) ; - virtual void removeFace(LLFace* facep) ; - S32 getNumFaces() const; - const ll_face_list_t* getFaceList() const {return &mFaceList;} + virtual void addFace(U32 channel, LLFace* facep) ; + virtual void removeFace(U32 channel, LLFace* facep) ; + S32 getTotalNumFaces() const; + S32 getNumFaces(U32 ch) const; + const ll_face_list_t* getFaceList(U32 channel) const {llassert(channel < LLRender::NUM_TEXTURE_CHANNELS); return &mFaceList[channel];} virtual void addVolume(LLVOVolume* volumep); virtual void removeVolume(LLVOVolume* volumep); @@ -182,8 +182,8 @@ protected: mutable F32 mAdditionalDecodePriority; // priority add to mDecodePriority. LLFrameTimer mLastReferencedTimer; - ll_face_list_t mFaceList ; //reverse pointer pointing to the faces using this image as texture - U32 mNumFaces ; + ll_face_list_t mFaceList[LLRender::NUM_TEXTURE_CHANNELS]; //reverse pointer pointing to the faces using this image as texture + U32 mNumFaces[LLRender::NUM_TEXTURE_CHANNELS]; LLFrameTimer mLastFaceListUpdateTimer ; ll_volume_list_t mVolumeList; @@ -214,8 +214,7 @@ public: static S32 sMaxSmallImageSize ; static BOOL sFreezeImageScalingDown ;//do not scale down image res if set. static F32 sCurrentTime ; - static BOOL sUseTextureAtlas ; - + enum EDebugTexels { DEBUG_TEXELS_OFF, @@ -406,11 +405,6 @@ private: void saveRawImage() ; void setCachedRawImage() ; - //for atlas - void resetFaceAtlas() ; - void invalidateAtlas(BOOL rebuild_geom) ; - BOOL insertToAtlas() ; - private: BOOL mFullyLoaded; BOOL mInDebug; @@ -496,6 +490,7 @@ public: static LLPointer<LLViewerFetchedTexture> sWhiteImagep; // Texture to show NOTHING (whiteness) static LLPointer<LLViewerFetchedTexture> sDefaultImagep; // "Default" texture for error cases, the only case of fetched texture which is generated in local. static LLPointer<LLViewerFetchedTexture> sSmokeImagep; // Old "Default" translucent texture + static LLPointer<LLViewerFetchedTexture> sFlatNormalImagep; // Flat normal map denoting no bumpiness on a surface }; // @@ -553,12 +548,12 @@ public: void addMediaToFace(LLFace* facep) ; void removeMediaFromFace(LLFace* facep) ; - /*virtual*/ void addFace(LLFace* facep) ; - /*virtual*/ void removeFace(LLFace* facep) ; + /*virtual*/ void addFace(U32 ch, LLFace* facep) ; + /*virtual*/ void removeFace(U32 ch, LLFace* facep) ; /*virtual*/ F32 getMaxVirtualSize() ; private: - void switchTexture(LLFace* facep) ; + void switchTexture(U32 ch, LLFace* facep) ; BOOL findFaces() ; void stopPlaying() ; diff --git a/indra/newview/llviewertexturelist.cpp b/indra/newview/llviewertexturelist.cpp index d2af48f528..48134869c9 100644 --- a/indra/newview/llviewertexturelist.cpp +++ b/indra/newview/llviewertexturelist.cpp @@ -119,6 +119,9 @@ void LLViewerTextureList::doPreloadImages() LLTexUnit::sWhiteTexture = LLViewerFetchedTexture::sWhiteImagep->getTexName(); LLUIImageList* image_list = LLUIImageList::getInstance(); + // Set the default flat normal map + LLViewerFetchedTexture::sFlatNormalImagep = LLViewerTextureManager::getFetchedTextureFromFile("flatnormal.tga", FTT_LOCAL_FILE, MIPMAP_NO, LLViewerFetchedTexture::BOOST_BUMP); + image_list->initFromFile(); // turn off clamping and bilinear filtering for uv picking images diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp index 06fb23b84b..cf97f20ecf 100755 --- a/indra/newview/llvoavatar.cpp +++ b/indra/newview/llvoavatar.cpp @@ -1908,6 +1908,8 @@ S32 LLVOAvatar::setTETexture(const U8 te, const LLUUID& uuid) LLViewerFetchedTexture *image = getBakedTextureImage(te,uuid); llassert(image); return setTETextureCore(te, image); + llassert(image); + return setTETextureCore(te, image); } static LLFastTimer::DeclareTimer FTM_AVATAR_UPDATE("Avatar Update"); @@ -3989,7 +3991,7 @@ U32 LLVOAvatar::renderTransparent(BOOL first_pass) gGL.setAlphaRejectSettings(LLRender::CF_DEFAULT); } } - + return num_indices; } @@ -5837,12 +5839,16 @@ BOOL LLVOAvatar::isWearingWearableType(LLWearableType::EType type) const } return FALSE; } + } + return FALSE; } return FALSE; } + + // virtual void LLVOAvatar::invalidateComposite( LLTexLayerSet* layerset, BOOL upload_result ) { @@ -6472,10 +6478,12 @@ void LLVOAvatar::applyMorphMask(U8* tex_data, S32 width, S32 height, S32 num_com { morph_target->applyMask(tex_data, width, height, num_components, maskedMorph->mInvert); } - } +} +} } + // returns TRUE if morph masks are present and not valid for a given baked texture, FALSE otherwise BOOL LLVOAvatar::morphMaskNeedsUpdate(LLAvatarAppearanceDefines::EBakedTextureIndex index) { @@ -7383,6 +7391,10 @@ void LLVOAvatar::dumpArchetypeXML(const std::string& prefix, bool group_by_weara } if (outprefix.empty()) { + outprefix = getFullname() + (isSelf()?"_s":"_o"); + } + if (outprefix.empty()) + { outprefix = std::string("new_archetype"); } std::string outfilename = get_sequential_numbered_file_name(outprefix,".xml"); @@ -7427,6 +7439,30 @@ void LLVOAvatar::dumpArchetypeXML(const std::string& prefix, bool group_by_weara { // MULTIPLE_WEARABLES: extend to multiple wearables? LLViewerTexture* te_image = getImage((ETextureIndex)te, 0); + if( te_image ) + { + std::string uuid_str; + te_image->getID().toString( uuid_str ); + apr_file_printf( file, "\t\t<texture te=\"%i\" uuid=\"%s\"/>\n", te, uuid_str.c_str()); + } + } + } + } + } + else + { + // Just dump all params sequentially. + for (LLVisualParam* param = getFirstVisualParam(); param; param = getNextVisualParam()) + { + LLViewerVisualParam* viewer_param = (LLViewerVisualParam*)param; + dump_visual_param(file, viewer_param, viewer_param->getWeight()); + } + + for (U8 te = 0; te < TEX_NUM_INDICES; te++) + { + { + // MULTIPLE_WEARABLES: extend to multiple wearables? + LLViewerTexture* te_image = getImage((ETextureIndex)te, 0); if( te_image ) { std::string uuid_str; @@ -7435,6 +7471,7 @@ void LLVOAvatar::dumpArchetypeXML(const std::string& prefix, bool group_by_weara } } } + } } else diff --git a/indra/newview/llvopartgroup.cpp b/indra/newview/llvopartgroup.cpp index 0b34bbb90f..65711d2339 100644 --- a/indra/newview/llvopartgroup.cpp +++ b/indra/newview/llvopartgroup.cpp @@ -65,7 +65,9 @@ void LLVOPartGroup::initClass() //static void LLVOPartGroup::restoreGL() { - sVB = new LLVertexBuffer(VERTEX_DATA_MASK, GL_STREAM_DRAW_ARB); + + //TODO: optimize out binormal mask here. Specular and normal coords as well. + sVB = new LLVertexBuffer(VERTEX_DATA_MASK | LLVertexBuffer::MAP_BINORMAL | LLVertexBuffer::MAP_TEXCOORD1 | LLVertexBuffer::MAP_TEXCOORD2, GL_STREAM_DRAW_ARB); U32 count = LL_MAX_PARTICLE_COUNT; sVB->allocateBuffer(count*4, count*6, true); diff --git a/indra/newview/llvotree.cpp b/indra/newview/llvotree.cpp index 145a0380d6..a1b36e3c8d 100644 --- a/indra/newview/llvotree.cpp +++ b/indra/newview/llvotree.cpp @@ -1085,132 +1085,6 @@ void LLVOTree::calcNumVerts(U32& vert_count, U32& index_count, S32 trunk_LOD, S3 } } -U32 LLVOTree::drawBranchPipeline(LLMatrix4& matrix, U16* indicesp, S32 trunk_LOD, S32 stop_level, U16 depth, U16 trunk_depth, F32 scale, F32 twist, F32 droop, F32 branches, F32 alpha) -{ - U32 ret = 0; - // - // Draws a tree by recursing, drawing branches and then a 'leaf' texture. - // If stop_level = -1, simply draws the whole tree as a billboarded texture - // - - static F32 constant_twist; - static F32 width = 0; - - //F32 length = ((scale == 1.f)? mTrunkLength:mBranchLength); - //F32 aspect = ((scale == 1.f)? mTrunkAspect:mBranchAspect); - F32 length = ((trunk_depth || (scale == 1.f))? mTrunkLength:mBranchLength); - F32 aspect = ((trunk_depth || (scale == 1.f))? mTrunkAspect:mBranchAspect); - - constant_twist = 360.f/branches; - - if (!LLPipeline::sReflectionRender && stop_level >= 0) - { - // - // Draw the tree using recursion - // - if (depth > stop_level) - { - { - llassert(sLODIndexCount[trunk_LOD] > 0); - width = scale * length * aspect; - LLMatrix4 scale_mat; - scale_mat.mMatrix[0][0] = width; - scale_mat.mMatrix[1][1] = width; - scale_mat.mMatrix[2][2] = scale*length; - scale_mat *= matrix; - - gGL.loadMatrix((F32*) scale_mat.mMatrix); - gGL.syncMatrices(); - glDrawElements(GL_TRIANGLES, sLODIndexCount[trunk_LOD], GL_UNSIGNED_SHORT, indicesp + sLODIndexOffset[trunk_LOD]); - gPipeline.addTrianglesDrawn(LEAF_INDICES); - stop_glerror(); - ret += sLODIndexCount[trunk_LOD]; - } - - // Recurse to create more branches - for (S32 i=0; i < (S32)branches; i++) - { - LLMatrix4 trans_mat; - trans_mat.setTranslation(0,0,scale*length); - trans_mat *= matrix; - - LLQuaternion rot = - LLQuaternion(20.f*DEG_TO_RAD, LLVector4(0.f, 0.f, 1.f)) * - LLQuaternion(droop*DEG_TO_RAD, LLVector4(0.f, 1.f, 0.f)) * - LLQuaternion(((constant_twist + ((i%2==0)?twist:-twist))*i)*DEG_TO_RAD, LLVector4(0.f, 0.f, 1.f)); - - LLMatrix4 rot_mat(rot); - rot_mat *= trans_mat; - - ret += drawBranchPipeline(rot_mat, indicesp, trunk_LOD, stop_level, depth - 1, 0, scale*mScaleStep, twist, droop, branches, alpha); - } - // Recurse to continue trunk - if (trunk_depth) - { - LLMatrix4 trans_mat; - trans_mat.setTranslation(0,0,scale*length); - trans_mat *= matrix; - - LLMatrix4 rot_mat(70.5f*DEG_TO_RAD, LLVector4(0,0,1)); - rot_mat *= trans_mat; // rotate a bit around Z when ascending - ret += drawBranchPipeline(rot_mat, indicesp, trunk_LOD, stop_level, depth, trunk_depth-1, scale*mScaleStep, twist, droop, branches, alpha); - } - } - else - { - // - // Draw leaves as two 90 deg crossed quads with leaf textures - // - { - LLMatrix4 scale_mat; - scale_mat.mMatrix[0][0] = - scale_mat.mMatrix[1][1] = - scale_mat.mMatrix[2][2] = scale*mLeafScale; - - scale_mat *= matrix; - - - gGL.loadMatrix((F32*) scale_mat.mMatrix); - gGL.syncMatrices(); - glDrawElements(GL_TRIANGLES, LEAF_INDICES, GL_UNSIGNED_SHORT, indicesp); - gPipeline.addTrianglesDrawn(LEAF_INDICES); - stop_glerror(); - ret += LEAF_INDICES; - } - } - } - else - { - // - // Draw the tree as a single billboard texture - // - - LLMatrix4 scale_mat; - scale_mat.mMatrix[0][0] = - scale_mat.mMatrix[1][1] = - scale_mat.mMatrix[2][2] = mBillboardScale*mBillboardRatio; - - scale_mat *= matrix; - - gGL.matrixMode(LLRender::MM_TEXTURE); - gGL.translatef(0.0, -0.5, 0.0); - gGL.matrixMode(LLRender::MM_MODELVIEW); - - gGL.loadMatrix((F32*) scale_mat.mMatrix); - gGL.syncMatrices(); - glDrawElements(GL_TRIANGLES, LEAF_INDICES, GL_UNSIGNED_SHORT, indicesp); - gPipeline.addTrianglesDrawn(LEAF_INDICES); - stop_glerror(); - ret += LEAF_INDICES; - - gGL.matrixMode(LLRender::MM_TEXTURE); - gGL.loadIdentity(); - gGL.matrixMode(LLRender::MM_MODELVIEW); - } - - return ret; -} - void LLVOTree::updateRadius() { if (mDrawable.isNull()) diff --git a/indra/newview/llvotree.h b/indra/newview/llvotree.h index 52debc85ab..2a7eb21238 100644 --- a/indra/newview/llvotree.h +++ b/indra/newview/llvotree.h @@ -104,10 +104,7 @@ public: F32 twist, F32 droop, F32 branches, - F32 alpha); - - U32 drawBranchPipeline(LLMatrix4& matrix, U16* indicesp, S32 trunk_LOD, S32 stop_level, U16 depth, U16 trunk_depth, F32 scale, F32 twist, F32 droop, F32 branches, F32 alpha); - + F32 alpha); /*virtual*/ BOOL lineSegmentIntersect(const LLVector3& start, const LLVector3& end, S32 face = -1, // which face to check, -1 = ALL_SIDES diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp index 8730ef66bb..941892a597 100644 --- a/indra/newview/llvovolume.cpp +++ b/indra/newview/llvovolume.cpp @@ -36,6 +36,7 @@ #include "lldir.h" #include "llflexibleobject.h" #include "llfloatertools.h" +#include "llmaterialid.h" #include "llmaterialtable.h" #include "llprimitive.h" #include "llvolume.h" @@ -76,6 +77,7 @@ #include "llviewershadermgr.h" #include "llvoavatar.h" #include "llvocache.h" +#include "llmaterialmgr.h" const S32 MIN_QUIET_FRAMES_COALESCE = 30; const F32 FORCE_SIMPLE_RENDER_AREA = 512.f; @@ -554,37 +556,9 @@ void LLVOVolume::animateTextures() 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] ; - - 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)); - } - + 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); @@ -918,6 +892,12 @@ LLFace* LLVOVolume::addFace(S32 f) { const LLTextureEntry* te = getTE(f); LLViewerTexture* imagep = getTEImage(f); + if (te->getMaterialParams().notNull()) + { + LLViewerTexture* normalp = getTENormalMap(f); + LLViewerTexture* specularp = getTESpecularMap(f); + return mDrawable->addFace(te, imagep, normalp, specularp); + } return mDrawable->addFace(te, imagep); } @@ -1415,6 +1395,11 @@ void LLVOVolume::regenFaces() facep->setTEOffset(i); facep->setTexture(getTEImage(i)); + if (facep->getTextureEntry()->getMaterialParams().notNull()) + { + facep->setNormalMap(getTENormalMap(i)); + facep->setSpecularMap(getTESpecularMap(i)); + } facep->setViewerObject(this); // If the face had media on it, this will have broken the link between the LLViewerMediaTexture and the face. @@ -1876,7 +1861,7 @@ S32 LLVOVolume::setTEColor(const U8 te, const LLColor4& color) const LLTextureEntry *tep = getTE(te); if (!tep) { - llwarns << "No texture entry for te " << (S32)te << ", object " << mID << llendl; + LL_WARNS("MaterialTEs") << "No texture entry for te " << (S32)te << ", object " << mID << LL_ENDL; } else if (color != tep->getColor()) { @@ -1988,6 +1973,49 @@ S32 LLVOVolume::setTEGlow(const U8 te, const F32 glow) return res; } +void LLVOVolume::setTEMaterialParamsCallback(const LLMaterialID &pMaterialID, const LLMaterialPtr pMaterialParams) +{ + LL_DEBUGS("MaterialTEs") << "materialid " << pMaterialID.asString() << LL_ENDL; + for (U8 i = 0; i < getNumTEs(); i++) + { + if (getTE(i) && (getTE(i)->getMaterialID().isNull() || (getTE(i)->getMaterialID() == pMaterialID))) + { + setTEMaterialParams(i, pMaterialParams); + } + } +} + +S32 LLVOVolume::setTEMaterialID(const U8 te, const LLMaterialID& pMaterialID) +{ + S32 res = LLViewerObject::setTEMaterialID(te, pMaterialID); + LL_DEBUGS("MaterialTEs") << "te "<< (S32)te << " materialid " << pMaterialID.asString() << " res " << res + << ( LLSelectMgr::getInstance()->getSelection()->contains(const_cast<LLVOVolume*>(this), te) ? " selected" : " not selected" ) + << LL_ENDL; + if (res) + { + LL_DEBUGS("MaterialTEs") << " " << pMaterialID.asString() << LL_ENDL; + LLMaterialMgr::instance().get(getRegion()->getRegionID(), pMaterialID, boost::bind(&LLVOVolume::setTEMaterialParamsCallback, this, _1, _2)); + gPipeline.markTextured(mDrawable); + mFaceMappingChanged = TRUE; + } + return res; + } + +S32 LLVOVolume::setTEMaterialParams(const U8 te, const LLMaterialPtr pMaterialParams) +{ + S32 res = LLViewerObject::setTEMaterialParams(te, pMaterialParams); + LL_DEBUGS("MaterialTEs") << "te " << (S32)te << " material " << pMaterialParams->asLLSD() << " res " << res + << ( LLSelectMgr::getInstance()->getSelection()->contains(const_cast<LLVOVolume*>(this), te) ? " selected" : " not selected" ) + << LL_ENDL; + if (res) + { + gPipeline.markTextured(mDrawable); + mFaceMappingChanged = TRUE; + } + + return res; +} + S32 LLVOVolume::setTEScale(const U8 te, const F32 s, const F32 t) { S32 res = LLViewerObject::setTEScale(te, s, t); @@ -3976,6 +4004,11 @@ bool can_batch_texture(LLFace* facep) return false; } + if (facep->getTextureEntry()->getMaterialParams().notNull()) + { //materials don't work with texture batching yet + return false; + } + if (facep->getTexture() && facep->getTexture()->getPrimaryFormat() == GL_ALPHA) { //can't batch invisiprims return false; @@ -3994,7 +4027,11 @@ static LLFastTimer::DeclareTimer FTM_REGISTER_FACE("Register Face"); void LLVolumeGeometryManager::registerFace(LLSpatialGroup* group, LLFace* facep, U32 type) { LLFastTimer t(FTM_REGISTER_FACE); - + if (type == LLRenderPass::PASS_ALPHA && facep->getTextureEntry()->getMaterialParams().notNull() && !facep->getVertexBuffer()->hasDataType(LLVertexBuffer::TYPE_BINORMAL)) + { + LL_WARNS("RenderMaterials") << "Oh no! No binormals for this alpha blended face!" << LL_ENDL; + } + if (facep->getViewerObject()->isSelected() && LLSelectMgr::getInstance()->mHideSelectedObjects) { return; @@ -4007,6 +4044,7 @@ void LLVolumeGeometryManager::registerFace(LLSpatialGroup* group, LLFace* facep, BOOL fullbright = (type == LLRenderPass::PASS_FULLBRIGHT) || (type == LLRenderPass::PASS_INVISIBLE) || + (type == LLRenderPass::PASS_FULLBRIGHT_ALPHA_MASK) || (type == LLRenderPass::PASS_ALPHA && facep->isState(LLFace::FULLBRIGHT)); if (!fullbright && type != LLRenderPass::PASS_GLOW && !facep->getVertexBuffer()->hasDataType(LLVertexBuffer::TYPE_NORMAL)) @@ -4045,12 +4083,33 @@ void LLVolumeGeometryManager::registerFace(LLSpatialGroup* group, LLFace* facep, LLViewerTexture* tex = facep->getTexture(); U8 index = facep->getTextureIndex(); + + LLMaterial* mat = facep->getTextureEntry()->getMaterialParams().get(); bool batchable = false; + U32 shader_mask = 0xFFFFFFFF; //no shader + + if (mat) + { + if (type == LLRenderPass::PASS_ALPHA) + { + shader_mask = mat->getShaderMask(LLMaterial::DIFFUSE_ALPHA_MODE_BLEND); + } + else + { + shader_mask = mat->getShaderMask(); + } + } + + if (index < 255 && idx >= 0) { - if (index < draw_vec[idx]->mTextureList.size()) + if (mat || draw_vec[idx]->mMaterial) + { //can't batch textures when materials are present (yet) + batchable = false; + } + else if (index < draw_vec[idx]->mTextureList.size()) { if (draw_vec[idx]->mTextureList[index].isNull()) { @@ -4079,13 +4138,15 @@ void LLVolumeGeometryManager::registerFace(LLSpatialGroup* group, LLFace* facep, draw_vec[idx]->mFullbright == fullbright && draw_vec[idx]->mBump == bump && draw_vec[idx]->mTextureMatrix == tex_mat && - draw_vec[idx]->mModelMatrix == model_mat) + draw_vec[idx]->mModelMatrix == model_mat && + draw_vec[idx]->mMaterial == mat && + draw_vec[idx]->mShaderMask == shader_mask) { draw_vec[idx]->mCount += facep->getIndicesCount(); draw_vec[idx]->mEnd += facep->getGeomCount(); draw_vec[idx]->mVSize = llmax(draw_vec[idx]->mVSize, facep->getVirtualSize()); - if (index >= draw_vec[idx]->mTextureList.size()) + if (index < 255 && index >= draw_vec[idx]->mTextureList.size()) { draw_vec[idx]->mTextureList.resize(index+1); draw_vec[idx]->mTextureList[index] = tex; @@ -4101,12 +4162,62 @@ void LLVolumeGeometryManager::registerFace(LLSpatialGroup* group, LLFace* facep, U32 offset = facep->getIndicesStart(); U32 count = facep->getIndicesCount(); LLPointer<LLDrawInfo> draw_info = new LLDrawInfo(start,end,count,offset, tex, - facep->getVertexBuffer(), fullbright, bump); + facep->getVertexBuffer(), fullbright, bump); draw_info->mGroup = group; draw_info->mVSize = facep->getVirtualSize(); draw_vec.push_back(draw_info); draw_info->mTextureMatrix = tex_mat; draw_info->mModelMatrix = model_mat; + + U8 shiny = facep->getTextureEntry()->getShiny(); + float alpha[4] = + { + 0.00f, + 0.25f, + 0.5f, + 0.75f + }; + float spec = alpha[shiny & TEM_SHINY_MASK]; + LLVector4 specColor(spec, spec, spec, spec); + draw_info->mSpecColor = specColor; + draw_info->mEnvIntensity = spec; + draw_info->mSpecularMap = NULL; + + if (mat) + { + // We have a material. Update our draw info accordingly. + draw_info->mMaterial = mat; + draw_info->mShaderMask = shader_mask; + + if (!mat->getSpecularID().isNull()) + { + LLVector4 specColor; + specColor.mV[0] = mat->getSpecularLightColor().mV[0] * (1.f / 255.f); + specColor.mV[1] = mat->getSpecularLightColor().mV[1] * (1.f / 255.f); + specColor.mV[2] = mat->getSpecularLightColor().mV[2] * (1.f / 255.f); + specColor.mV[3] = mat->getSpecularLightExponent() * (1.f / 255.f); + draw_info->mSpecColor = specColor; + draw_info->mEnvIntensity = mat->getEnvironmentIntensity() * (1.f / 255.f); + draw_info->mSpecularMap = facep->getViewerObject()->getTESpecularMap(facep->getTEOffset()); + } + + draw_info->mAlphaMaskCutoff = mat->getAlphaMaskCutoff() * (1.f / 255.f); + draw_info->mDiffuseAlphaMode = mat->getDiffuseAlphaMode(); + draw_info->mNormalMap = facep->getViewerObject()->getTENormalMap(facep->getTEOffset()); + + } + else + { + if (type == LLRenderPass::PASS_GRASS) + { + draw_info->mAlphaMaskCutoff = 0.5f; + } + else + { + draw_info->mAlphaMaskCutoff = 0.33f; + } + } + if (type == LLRenderPass::PASS_ALPHA) { //for alpha sorting facep->setDrawInfo(draw_info); @@ -4223,6 +4334,9 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group) std::vector<LLFace*> fullbright_faces; std::vector<LLFace*> bump_faces; + std::vector<LLFace*> norm_faces; + std::vector<LLFace*> spec_faces; + std::vector<LLFace*> normspec_faces; std::vector<LLFace*> simple_faces; std::vector<LLFace*> alpha_faces; @@ -4262,7 +4376,7 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group) } if (vobj->isMesh() && - (vobj->getVolume() && !vobj->getVolume()->isMeshAssetLoaded() || !gMeshRepo.meshRezEnabled())) + ((vobj->getVolume() && !vobj->getVolume()->isMeshAssetLoaded()) || !gMeshRepo.meshRezEnabled())) { continue; } @@ -4389,66 +4503,96 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group) LLViewerTexture* tex = facep->getTexture(); U32 type = gPipeline.getPoolTypeFromTE(te, tex); - if (type == LLDrawPool::POOL_ALPHA) + + if (te->getGlow()) { - if (te->getColor().mV[3] > 0.f) + pool->addRiggedFace(facep, LLDrawPoolAvatar::RIGGED_GLOW); + } + + LLMaterial* mat = LLPipeline::sRenderDeferred ? te->getMaterialParams().get() : NULL; + + if (mat) + { + if (te->getFullbright()) { - if (te->getFullbright()) + if (mat->getDiffuseAlphaMode() == LLMaterial::DIFFUSE_ALPHA_MODE_MASK) { pool->addRiggedFace(facep, LLDrawPoolAvatar::RIGGED_FULLBRIGHT_ALPHA); } - else + else if (type == LLDrawPool::POOL_ALPHA) { pool->addRiggedFace(facep, LLDrawPoolAvatar::RIGGED_ALPHA); } + else + { + pool->addRiggedFace(facep, LLDrawPoolAvatar::RIGGED_FULLBRIGHT); + } + } + else + { + U32 mask = mat->getShaderMask(); + pool->addRiggedFace(facep, mask); } } - else if (te->getShiny()) + else { - if (te->getFullbright()) + if (type == LLDrawPool::POOL_ALPHA) { - pool->addRiggedFace(facep, LLDrawPoolAvatar::RIGGED_FULLBRIGHT_SHINY); + 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 + else if (te->getShiny()) { - if (LLPipeline::sRenderDeferred) + if (te->getFullbright()) { - pool->addRiggedFace(facep, LLDrawPoolAvatar::RIGGED_SIMPLE); + pool->addRiggedFace(facep, LLDrawPoolAvatar::RIGGED_FULLBRIGHT_SHINY); } else { - pool->addRiggedFace(facep, LLDrawPoolAvatar::RIGGED_SHINY); + if (LLPipeline::sRenderDeferred) + { + pool->addRiggedFace(facep, LLDrawPoolAvatar::RIGGED_SIMPLE); + } + else + { + pool->addRiggedFace(facep, LLDrawPoolAvatar::RIGGED_SHINY); + } } } - } - else - { - if (te->getFullbright()) - { - pool->addRiggedFace(facep, LLDrawPoolAvatar::RIGGED_FULLBRIGHT); - } else { - pool->addRiggedFace(facep, LLDrawPoolAvatar::RIGGED_SIMPLE); - } - } - - if (te->getGlow()) - { - pool->addRiggedFace(facep, LLDrawPoolAvatar::RIGGED_GLOW); - } - - if (LLPipeline::sRenderDeferred) - { - if (type != LLDrawPool::POOL_ALPHA && !te->getFullbright()) - { - if (te->getBumpmap()) + if (te->getFullbright()) { - pool->addRiggedFace(facep, LLDrawPoolAvatar::RIGGED_DEFERRED_BUMP); + pool->addRiggedFace(facep, LLDrawPoolAvatar::RIGGED_FULLBRIGHT); } else { - pool->addRiggedFace(facep, LLDrawPoolAvatar::RIGGED_DEFERRED_SIMPLE); + pool->addRiggedFace(facep, LLDrawPoolAvatar::RIGGED_SIMPLE); + } + } + + + if (LLPipeline::sRenderDeferred) + { + if (type != LLDrawPool::POOL_ALPHA && !te->getFullbright()) + { + if (te->getBumpmap()) + { + pool->addRiggedFace(facep, LLDrawPoolAvatar::RIGGED_DEFERRED_BUMP); + } + else + { + pool->addRiggedFace(facep, LLDrawPoolAvatar::RIGGED_DEFERRED_SIMPLE); + } } } } @@ -4558,7 +4702,30 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group) if (gPipeline.canUseWindLightShadersOnObjects() && LLPipeline::sRenderBump) { - if (te->getBumpmap()) + if (LLPipeline::sRenderDeferred && te->getMaterialParams().notNull()) + { + LLMaterial* mat = te->getMaterialParams().get(); + if (mat->getNormalID().notNull()) + { + if (mat->getSpecularID().notNull()) + { //has normal and specular maps (needs texcoord1, texcoord2, and binormal) + normspec_faces.push_back(facep); + } + else + { //has normal map (needs texcoord1 and binormal) + norm_faces.push_back(facep); + } + } + else if (mat->getSpecularID().notNull()) + { //has specular map but no normal map, needs texcoord2 + spec_faces.push_back(facep); + } + else + { //has neither specular map nor normal map, only needs texcoord0 + simple_faces.push_back(facep); + } + } + else if (te->getBumpmap()) { //needs normal + binormal bump_faces.push_back(facep); } @@ -4616,32 +4783,38 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group) U32 bump_mask = LLVertexBuffer::MAP_TEXCOORD0 | LLVertexBuffer::MAP_TEXCOORD1 | LLVertexBuffer::MAP_NORMAL | LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_COLOR; U32 fullbright_mask = LLVertexBuffer::MAP_TEXCOORD0 | LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_COLOR; + U32 norm_mask = simple_mask | LLVertexBuffer::MAP_TEXCOORD1 | LLVertexBuffer::MAP_BINORMAL; + U32 normspec_mask = norm_mask | LLVertexBuffer::MAP_TEXCOORD2; + U32 spec_mask = simple_mask | LLVertexBuffer::MAP_TEXCOORD2; + if (emissive) { //emissive faces are present, include emissive byte to preserve batching simple_mask = simple_mask | LLVertexBuffer::MAP_EMISSIVE; alpha_mask = alpha_mask | LLVertexBuffer::MAP_EMISSIVE; bump_mask = bump_mask | LLVertexBuffer::MAP_EMISSIVE; fullbright_mask = fullbright_mask | LLVertexBuffer::MAP_EMISSIVE; + norm_mask = norm_mask | LLVertexBuffer::MAP_EMISSIVE; + normspec_mask = normspec_mask | LLVertexBuffer::MAP_EMISSIVE; + spec_mask = spec_mask | LLVertexBuffer::MAP_EMISSIVE; } - bool batch_textures = LLViewerShaderMgr::instance()->getVertexShaderLevel(LLViewerShaderMgr::SHADER_OBJECT) > 1; + BOOL batch_textures = LLViewerShaderMgr::instance()->getVertexShaderLevel(LLViewerShaderMgr::SHADER_OBJECT) > 1; if (batch_textures) { - bump_mask |= LLVertexBuffer::MAP_BINORMAL; - genDrawInfo(group, simple_mask | LLVertexBuffer::MAP_TEXTURE_INDEX, simple_faces, FALSE, TRUE); - genDrawInfo(group, fullbright_mask | LLVertexBuffer::MAP_TEXTURE_INDEX, fullbright_faces, FALSE, TRUE); - genDrawInfo(group, bump_mask | LLVertexBuffer::MAP_TEXTURE_INDEX, bump_faces, FALSE, TRUE); - genDrawInfo(group, alpha_mask | LLVertexBuffer::MAP_TEXTURE_INDEX, alpha_faces, TRUE, TRUE); - } - else - { - genDrawInfo(group, simple_mask, simple_faces); - genDrawInfo(group, fullbright_mask, fullbright_faces); - genDrawInfo(group, bump_mask, bump_faces, FALSE, TRUE); - genDrawInfo(group, alpha_mask, alpha_faces, TRUE); + bump_mask = bump_mask | LLVertexBuffer::MAP_BINORMAL; + simple_mask = simple_mask | LLVertexBuffer::MAP_TEXTURE_INDEX; + alpha_mask = alpha_mask | LLVertexBuffer::MAP_TEXTURE_INDEX | LLVertexBuffer::MAP_BINORMAL | LLVertexBuffer::MAP_TEXCOORD1 | LLVertexBuffer::MAP_TEXCOORD2; + fullbright_mask = fullbright_mask | LLVertexBuffer::MAP_TEXTURE_INDEX; } - + + genDrawInfo(group, simple_mask | LLVertexBuffer::MAP_TEXTURE_INDEX, simple_faces, FALSE, batch_textures, FALSE); + genDrawInfo(group, fullbright_mask | LLVertexBuffer::MAP_TEXTURE_INDEX, fullbright_faces, FALSE, batch_textures); + genDrawInfo(group, alpha_mask | LLVertexBuffer::MAP_TEXTURE_INDEX, alpha_faces, TRUE, batch_textures); + genDrawInfo(group, bump_mask | LLVertexBuffer::MAP_TEXTURE_INDEX, bump_faces, FALSE, FALSE); + genDrawInfo(group, norm_mask | LLVertexBuffer::MAP_TEXTURE_INDEX, norm_faces, FALSE, FALSE); + genDrawInfo(group, spec_mask | LLVertexBuffer::MAP_TEXTURE_INDEX, spec_faces, FALSE, FALSE); + genDrawInfo(group, normspec_mask | LLVertexBuffer::MAP_TEXTURE_INDEX, normspec_faces, FALSE, FALSE); if (!LLPipeline::sDelayVBUpdate) { @@ -4793,11 +4966,14 @@ struct CompareBatchBreakerModified { return lte->getFullbright() < rte->getFullbright(); } + else if (LLPipeline::sRenderDeferred && lte->getMaterialParams() != rte->getMaterialParams()) + { + return lte->getMaterialParams() < rte->getMaterialParams(); + } else { return lhs->getTexture() < rhs->getTexture(); } - } }; @@ -4811,7 +4987,7 @@ 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) +void LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, std::vector<LLFace*>& faces, BOOL distance_sort, BOOL batch_textures, BOOL no_materials) { LLFastTimer t(FTM_REBUILD_VOLUME_GEN_DRAW_INFO); @@ -4881,6 +5057,7 @@ void LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, std:: //pull off next face LLFace* facep = *face_iter; LLViewerTexture* tex = facep->getTexture(); + LLMaterialPtr mat = facep->getTextureEntry()->getMaterialParams(); if (distance_sort) { @@ -4926,6 +5103,7 @@ void LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, std:: 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 + facep->setTextureIndex(0); break; } @@ -4976,13 +5154,20 @@ void LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, std:: facep->setTextureIndex(cur_tex); } } + else + { + facep->setTextureIndex(0); + } tex = texture_list[0]; } else { while (i != faces.end() && - (LLPipeline::sTextureBindTest || (distance_sort || (*i)->getTexture() == tex))) + (LLPipeline::sTextureBindTest || + (distance_sort || + ((*i)->getTexture() == tex && + ((*i)->getTextureEntry()->getMaterialParams() == mat))))) { facep = *i; @@ -5068,8 +5253,7 @@ void LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, std:: index_offset += facep->getGeomCount(); indices_index += facep->getIndicesCount(); - - + //append face to appropriate render batch BOOL force_simple = facep->getPixelArea() < FORCE_SIMPLE_RENDER_AREA; @@ -5089,7 +5273,73 @@ void LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, std:: BOOL is_alpha = (facep->getPoolType() == LLDrawPool::POOL_ALPHA) ? TRUE : FALSE; - if (is_alpha) + LLMaterial* mat = te->getMaterialParams().get(); + + bool can_be_shiny = true; + if (mat) + { + U8 mode = mat->getDiffuseAlphaMode(); + can_be_shiny = mode == LLMaterial::DIFFUSE_ALPHA_MODE_NONE || + mode == LLMaterial::DIFFUSE_ALPHA_MODE_EMISSIVE; + } + + if (mat && LLPipeline::sRenderDeferred && !hud_group) + { + if (fullbright) + { + if (mat->getDiffuseAlphaMode() == LLMaterial::DIFFUSE_ALPHA_MODE_MASK) + { + registerFace(group, facep, LLRenderPass::PASS_FULLBRIGHT_ALPHA_MASK); + } + else if (is_alpha) + { + registerFace(group, facep, LLRenderPass::PASS_ALPHA); + } + else + { + registerFace(group, facep, LLRenderPass::PASS_FULLBRIGHT); + } + } + else if (no_materials) + { + registerFace(group, facep, LLRenderPass::PASS_SIMPLE); + } + else if (te->getColor().mV[3] < 0.999f) + { + registerFace(group, facep, LLRenderPass::PASS_ALPHA); + } + else + { + U32 pass[] = + { + LLRenderPass::PASS_MATERIAL, + LLRenderPass::PASS_ALPHA, //LLRenderPass::PASS_MATERIAL_ALPHA, + LLRenderPass::PASS_MATERIAL_ALPHA_MASK, + LLRenderPass::PASS_MATERIAL_ALPHA_EMISSIVE, + LLRenderPass::PASS_SPECMAP, + LLRenderPass::PASS_ALPHA, //LLRenderPass::PASS_SPECMAP_BLEND, + LLRenderPass::PASS_SPECMAP_MASK, + LLRenderPass::PASS_SPECMAP_EMISSIVE, + LLRenderPass::PASS_NORMMAP, + LLRenderPass::PASS_ALPHA, //LLRenderPass::PASS_NORMMAP_BLEND, + LLRenderPass::PASS_NORMMAP_MASK, + LLRenderPass::PASS_NORMMAP_EMISSIVE, + LLRenderPass::PASS_NORMSPEC, + LLRenderPass::PASS_ALPHA, //LLRenderPass::PASS_NORMSPEC_BLEND, + LLRenderPass::PASS_NORMSPEC_MASK, + LLRenderPass::PASS_NORMSPEC_EMISSIVE, + }; + + U32 mask = mat->getShaderMask(); + + llassert(mask < sizeof(pass)/sizeof(U32)); + + mask = llmin(mask, (U32)(sizeof(pass)/sizeof(U32)-1)); + + registerFace(group, facep, pass[mask]); + } + } + else if (is_alpha) { // can we safely treat this as an alpha mask? if (facep->getFaceColor().mV[3] <= 0.f) @@ -5114,7 +5364,8 @@ void LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, std:: } else if (gPipeline.canUseVertexShaders() && LLPipeline::sRenderBump - && te->getShiny()) + && te->getShiny() + && can_be_shiny) { //shiny if (tex->getPrimaryFormat() == GL_ALPHA) { //invisiprim+shiny @@ -5131,7 +5382,7 @@ void LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, std:: registerFace(group, facep, LLRenderPass::PASS_POST_BUMP); } } - else if (te->getBumpmap()) + else if (te->getBumpmap() && !te->getMaterialParams()) { //register in deferred bump pass registerFace(group, facep, LLRenderPass::PASS_BUMP); } @@ -5158,7 +5409,14 @@ void LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, std:: } else if (fullbright || bake_sunlight) { //fullbright - registerFace(group, facep, LLRenderPass::PASS_FULLBRIGHT); + if (mat && mat->getDiffuseAlphaMode() == LLMaterial::DIFFUSE_ALPHA_MODE_MASK) + { + registerFace(group, facep, LLRenderPass::PASS_FULLBRIGHT_ALPHA_MASK); + } + else + { + registerFace(group, facep, LLRenderPass::PASS_FULLBRIGHT); + } if (LLPipeline::sRenderDeferred && !hud_group && LLPipeline::sRenderBump && te->getBumpmap()) { //if this is the deferred render and a bump map is present, register in post deferred bump registerFace(group, facep, LLRenderPass::PASS_POST_BUMP); @@ -5166,14 +5424,21 @@ void LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, std:: } else { - if (LLPipeline::sRenderDeferred && LLPipeline::sRenderBump && te->getBumpmap()) + if (LLPipeline::sRenderDeferred && LLPipeline::sRenderBump && (te->getBumpmap() && !te->getMaterialParams())) { //non-shiny or fullbright deferred bump registerFace(group, facep, LLRenderPass::PASS_BUMP); } else { //all around simple llassert(mask & LLVertexBuffer::MAP_NORMAL); - registerFace(group, facep, LLRenderPass::PASS_SIMPLE); + if (mat && mat->getDiffuseAlphaMode() == LLMaterial::DIFFUSE_ALPHA_MODE_MASK) + { //material alpha mask can be respected in non-deferred + registerFace(group, facep, LLRenderPass::PASS_ALPHA_MASK); + } + else + { + registerFace(group, facep, LLRenderPass::PASS_SIMPLE); + } } } diff --git a/indra/newview/llvovolume.h b/indra/newview/llvovolume.h index 5482c80f2b..d1bfefdc70 100644 --- a/indra/newview/llvovolume.h +++ b/indra/newview/llvovolume.h @@ -37,6 +37,7 @@ class LLViewerTextureAnim; class LLDrawPool; +class LLMaterialID; class LLSelectNode; class LLObjectMediaDataClient; class LLObjectMediaNavigateClient; @@ -185,6 +186,9 @@ public: /*virtual*/ S32 setTEBumpShinyFullbright(const U8 te, const U8 bump); /*virtual*/ S32 setTEMediaFlags(const U8 te, const U8 media_flags); /*virtual*/ S32 setTEGlow(const U8 te, const F32 glow); + /*virtual*/ S32 setTEMaterialID(const U8 te, const LLMaterialID& pMaterialID); + void setTEMaterialParamsCallback(const LLMaterialID& pMaterialID, const LLMaterialPtr pMaterialParams); + /*virtual*/ S32 setTEMaterialParams(const U8 te, const LLMaterialPtr pMaterialParams); /*virtual*/ S32 setTEScale(const U8 te, const F32 s, const F32 t); /*virtual*/ S32 setTEScaleS(const U8 te, const F32 s); /*virtual*/ S32 setTEScaleT(const U8 te, const F32 t); diff --git a/indra/newview/llwlparamset.cpp b/indra/newview/llwlparamset.cpp index b04d30db55..0b5e0235ee 100644 --- a/indra/newview/llwlparamset.cpp +++ b/indra/newview/llwlparamset.cpp @@ -33,6 +33,7 @@ #include "llglslshader.h" #include "lluictrlfactory.h" #include "llsliderctrl.h" +#include "pipeline.h" #include <llgl.h> @@ -127,6 +128,13 @@ void LLWLParamSet::update(LLGLSLShader * shader) const } } } + + if (LLPipeline::sRenderDeferred && !LLPipeline::sReflectionRender) + { + shader->uniform1f(LLShaderMgr::GLOBAL_GAMMA, 2.2); + } else { + shader->uniform1f(LLShaderMgr::GLOBAL_GAMMA, 1.0); + } } void LLWLParamSet::set(const std::string& paramName, float x) diff --git a/indra/newview/llworld.cpp b/indra/newview/llworld.cpp index 793becf0c8..7996f8a640 100644 --- a/indra/newview/llworld.cpp +++ b/indra/newview/llworld.cpp @@ -274,7 +274,9 @@ void LLWorld::removeRegion(const LLHost &host) mActiveRegionList.remove(regionp); mCulledRegionList.remove(regionp); mVisibleRegionList.remove(regionp); - + + mRegionRemovedSignal(regionp); + delete regionp; updateWaterObjects(); @@ -402,6 +404,19 @@ LLViewerRegion* LLWorld::getRegionFromHandle(const U64 &handle) return NULL; } +LLViewerRegion* LLWorld::getRegionFromID(const LLUUID& region_id) +{ + for (region_list_t::iterator iter = mRegionList.begin(); + iter != mRegionList.end(); ++iter) + { + LLViewerRegion* regionp = *iter; + if (regionp->getRegionID() == region_id) + { + return regionp; + } + } + return NULL; +} void LLWorld::updateAgentOffset(const LLVector3d &offset_global) { @@ -1244,6 +1259,11 @@ bool LLWorld::isRegionListed(const LLViewerRegion* region) const return it != mRegionList.end(); } +boost::signals2::connection LLWorld::setRegionRemovedCallback(const region_remove_signal_t::slot_type& cb) +{ + return mRegionRemovedSignal.connect(cb); +} + LLHTTPRegistration<LLEstablishAgentCommunication> gHTTPRegistrationEstablishAgentCommunication( "/message/EstablishAgentCommunication"); diff --git a/indra/newview/llworld.h b/indra/newview/llworld.h index f350009d10..d0b001ba44 100644 --- a/indra/newview/llworld.h +++ b/indra/newview/llworld.h @@ -76,6 +76,7 @@ public: LLViewerRegion* getRegionFromPosGlobal(const LLVector3d &pos); LLViewerRegion* getRegionFromPosAgent(const LLVector3 &pos); LLViewerRegion* getRegionFromHandle(const U64 &handle); + LLViewerRegion* getRegionFromID(const LLUUID& region_id); BOOL positionRegionValidGlobal(const LLVector3d& pos); // true if position is in valid region LLVector3d clipToVisibleRegions(const LLVector3d &start_pos, const LLVector3d &end_pos); @@ -149,6 +150,9 @@ public: typedef std::list<LLViewerRegion*> region_list_t; const region_list_t& getRegionList() const { return mActiveRegionList; } + typedef boost::signals2::signal<void(LLViewerRegion*)> region_remove_signal_t; + boost::signals2::connection setRegionRemovedCallback(const region_remove_signal_t::slot_type& cb); + // Returns lists of avatar IDs and their world-space positions within a given distance of a point. // All arguments are optional. Given containers will be emptied and then filled. // Not supplying origin or radius input returns data on all avatars in the known regions. @@ -168,6 +172,8 @@ private: region_list_t mVisibleRegionList; region_list_t mCulledRegionList; + region_remove_signal_t mRegionRemovedSignal; + // Number of points on edge static const U32 mWidth; diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp index f320f34f6e..49ea4830d3 100644 --- a/indra/newview/pipeline.cpp +++ b/indra/newview/pipeline.cpp @@ -233,6 +233,7 @@ LLFastTimer::DeclareTimer FTM_RENDER_WL_SKY("Windlight Sky"); LLFastTimer::DeclareTimer FTM_RENDER_ALPHA("Alpha Objects"); LLFastTimer::DeclareTimer FTM_RENDER_CHARACTERS("Avatars"); LLFastTimer::DeclareTimer FTM_RENDER_BUMP("Bump"); +LLFastTimer::DeclareTimer FTM_RENDER_MATERIALS("Materials"); LLFastTimer::DeclareTimer FTM_RENDER_FULLBRIGHT("Fullbright"); LLFastTimer::DeclareTimer FTM_RENDER_GLOW("Glow"); LLFastTimer::DeclareTimer FTM_GEO_UPDATE("Geo Update"); @@ -262,6 +263,7 @@ std::string gPoolNames[] = "POOL_GROUND", "POOL_FULLBRIGHT", "POOL_BUMP", + "POOL_MATERIALS", "POOL_TERRAIN," "POOL_SKY", "POOL_WL_SKY", @@ -377,6 +379,7 @@ BOOL LLPipeline::sRenderDeferred = FALSE; BOOL LLPipeline::sMemAllocationThrottled = FALSE; S32 LLPipeline::sVisibleLightCount = 0; F32 LLPipeline::sMinRenderSize = 0.f; +BOOL LLPipeline::sRenderingHUDs; // EventHost API LLPipeline listener. static LLPipelineListener sPipelineListener; @@ -398,8 +401,8 @@ void validate_framebuffer_object(); bool addDeferredAttachments(LLRenderTarget& target) { - return target.addColorAttachment(GL_RGBA) && //specular - target.addColorAttachment(GL_RGBA); //normal+z + return target.addColorAttachment(GL_SRGB8_ALPHA8) && //specular + target.addColorAttachment(GL_RGB10_A2); //normal+z } LLPipeline::LLPipeline() : @@ -489,6 +492,7 @@ void LLPipeline::init() getPool(LLDrawPool::POOL_FULLBRIGHT); getPool(LLDrawPool::POOL_INVISIBLE); getPool(LLDrawPool::POOL_BUMP); + getPool(LLDrawPool::POOL_MATERIALS); getPool(LLDrawPool::POOL_GLOW); LLViewerStats::getInstance()->mTrianglesDrawnStat.reset(); @@ -917,11 +921,22 @@ bool LLPipeline::allocateScreenBuffer(U32 resX, U32 resY, U32 samples) BOOL ssao = RenderDeferredSSAO; //allocate deferred rendering color buffers - if (!mDeferredScreen.allocate(resX, resY, GL_RGBA, TRUE, TRUE, LLTexUnit::TT_RECT_TEXTURE, FALSE, samples)) return false; + if (!mDeferredScreen.allocate(resX, resY, GL_SRGB8_ALPHA8, TRUE, TRUE, LLTexUnit::TT_RECT_TEXTURE, FALSE, samples)) return false; if (!mDeferredDepth.allocate(resX, resY, 0, TRUE, FALSE, LLTexUnit::TT_RECT_TEXTURE, FALSE, samples)) return false; if (!addDeferredAttachments(mDeferredScreen)) return false; - - if (!mScreen.allocate(resX, resY, GL_RGBA, FALSE, FALSE, LLTexUnit::TT_RECT_TEXTURE, FALSE, samples)) return false; + + GLuint screenFormat = GL_RGBA16; + if (gGLManager.mIsATI) + { + screenFormat = GL_RGBA12; + } + + if (gGLManager.mGLVersion < 4.f && gGLManager.mIsNVIDIA) + { + screenFormat = GL_RGBA16F_ARB; + } + + if (!mScreen.allocate(resX, resY, screenFormat, FALSE, FALSE, LLTexUnit::TT_RECT_TEXTURE, FALSE, samples)) return false; if (samples > 0) { if (!mFXAABuffer.allocate(resX, resY, GL_RGBA, FALSE, FALSE, LLTexUnit::TT_TEXTURE, FALSE, samples)) return false; @@ -1016,7 +1031,8 @@ void LLPipeline::updateRenderDeferred() { BOOL deferred = ((RenderDeferred && LLRenderTarget::sUseFBO && - LLFeatureManager::getInstance()->isFeatureAvailable("RenderDeferred") && + LLFeatureManager::getInstance()->isFeatureAvailable("RenderDeferred") && + LLFeatureManager::getInstance()->isFeatureAvailable("RenderObjectBump") && VertexShaderEnable && RenderAvatarVP && WindLightUseAtmosShaders) ? TRUE : FALSE) && @@ -1213,7 +1229,7 @@ void LLPipeline::createGLBuffers() for (U32 i = 0; i < 3; i++) { - mGlow[i].allocate(512,glow_res,GL_RGBA,FALSE,FALSE); + mGlow[i].allocate(512,glow_res, GL_RGBA,FALSE,FALSE); } allocateScreenBuffer(resX,resY); @@ -1264,13 +1280,18 @@ void LLPipeline::createGLBuffers() gBumpImageList.restoreGL(); } +F32 lerpf(F32 a, F32 b, F32 w) +{ + return a + w * (b - a); +} + void LLPipeline::createLUTBuffers() { if (sRenderDeferred) { if (!mLightFunc) { - U32 lightResX = gSavedSettings.getU32("RenderSpecularResX"); + /*U32 lightResX = gSavedSettings.getU32("RenderSpecularResX"); U32 lightResY = gSavedSettings.getU32("RenderSpecularResY"); U8* ls = new U8[lightResX*lightResY]; F32 specExp = gSavedSettings.getF32("RenderSpecularExponent"); @@ -1306,11 +1327,58 @@ void LLPipeline::createLUTBuffers() // Combined with a bit of noise and trilinear filtering, the banding is hardly noticable. ls[y*lightResX+x] = (U8)(llclamp(spec * (1.f / 6), 0.f, 1.f) * 255); } + }*/ + + + U32 lightResX = gSavedSettings.getU32("RenderSpecularResX"); + U32 lightResY = gSavedSettings.getU32("RenderSpecularResY"); + F32* ls = new F32[lightResX*lightResY]; + //F32 specExp = gSavedSettings.getF32("RenderSpecularExponent"); // Note: only use this when creating new specular lighting functions. + // Calculate the (normalized) blinn-phong specular lookup texture. (with a few tweaks) + for (U32 y = 0; y < lightResY; ++y) + { + for (U32 x = 0; x < lightResX; ++x) + { + ls[y*lightResX+x] = 0; + F32 sa = (F32) x/(lightResX-1); + F32 spec = (F32) y/(lightResY-1); + F32 n = spec * spec * 368; + + // Nothing special here. Just your typical blinn-phong term. + spec = powf(sa, n); + + // Apply our normalization function. + // Note: This is the full equation that applies the full normalization curve, not an approximation. + // This is fine, given we only need to create our LUT once per buffer initialization. + spec *= (((n + 2) * (n + 4)) / (8 * F_PI * (powf(2, -n/2) + n))); + + // Since we use R16F, we no longer have a dynamic range issue we need to work around here. + // Though some older drivers may not like this, newer drivers shouldn't have this problem. + ls[y*lightResX+x] = spec; + + + //beckmann distribution + /*F32 alpha = acosf((F32) x/(lightResX-1)); + F32 m = 1.f - (F32) y/(lightResY-1); + + F32 cos4_alpha = cosf(alpha); + cos4_alpha *= cos4_alpha; + cos4_alpha *= cos4_alpha; + + F32 tan_alpha = tanf(alpha); + F32 tan2_alpha = tan_alpha*tan_alpha; + + F32 k = expf(-(tan2_alpha)/(m*m)) / + (3.14159f*m*m*cos4_alpha); + + ls[y*lightResX+x] = k;*/ + } } - LLImageGL::generateTextures(LLTexUnit::TT_TEXTURE, GL_R8, 1, &mLightFunc); + LLImageGL::generateTextures(LLTexUnit::TT_TEXTURE, GL_R16F, 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); + LLImageGL::setManualImage(LLTexUnit::getInternalType(LLTexUnit::TT_TEXTURE), 0, GL_R16F, lightResX, lightResY, GL_RED, GL_FLOAT, ls, false); + //LLImageGL::setManualImage(LLTexUnit::getInternalType(LLTexUnit::TT_TEXTURE), 0, GL_UNSIGNED_BYTE, lightResX, lightResY, GL_RED, GL_UNSIGNED_BYTE, ls, false); gGL.getTexUnit(0)->setTextureAddressMode(LLTexUnit::TAM_CLAMP); gGL.getTexUnit(0)->setTextureFilteringOption(LLTexUnit::TFO_TRILINEAR); @@ -1539,7 +1607,9 @@ LLDrawPool *LLPipeline::findPool(const U32 type, LLViewerTexture *tex0) case LLDrawPool::POOL_BUMP: poolp = mBumpPool; break; - + case LLDrawPool::POOL_MATERIALS: + poolp = mMaterialsPool; + break; case LLDrawPool::POOL_ALPHA: poolp = mAlphaPool; break; @@ -1603,19 +1673,40 @@ U32 LLPipeline::getPoolTypeFromTE(const LLTextureEntry* te, LLViewerTexture* ima return 0; } - bool alpha = te->getColor().mV[3] < 0.999f; + bool color_alpha = te->getColor().mV[3] < 0.999f; + bool alpha = color_alpha; if (imagep) { alpha = alpha || (imagep->getComponents() == 4 && imagep->getType() != LLViewerTexture::MEDIA_TEXTURE) || (imagep->getComponents() == 2); } - + + if (alpha && te->getMaterialParams()) + { + switch (te->getMaterialParams()->getDiffuseAlphaMode()) + { + case 1: + alpha = true; // Material's alpha mode is set to blend. Toss it into the alpha draw pool. + break; + case 0: //alpha mode set to none, never go to alpha pool + case 3: //alpha mode set to emissive, never go to alpha pool + alpha = color_alpha; + break; + default: //alpha mode set to "mask", go to alpha pool if fullbright + alpha = color_alpha; // Material's alpha mode is set to none, mask, or emissive. Toss it into the opaque material draw pool. + break; + } + } + if (alpha) { return LLDrawPool::POOL_ALPHA; } - else if ((te->getBumpmap() || te->getShiny())) + else if ((te->getBumpmap() || te->getShiny()) && te->getMaterialID().isNull()) { return LLDrawPool::POOL_BUMP; + } else if (!te->getMaterialID().isNull() && !alpha) + { + return LLDrawPool::POOL_MATERIALS; } else { @@ -3584,8 +3675,8 @@ void LLPipeline::postSort(LLCamera& camera) for (LLCullResult::sg_iterator i = sCull->beginVisibleGroups(); i != sCull->endVisibleGroups(); ++i) { LLSpatialGroup* group = *i; - if (sUseOcclusion && - group->isOcclusionState(LLSpatialGroup::OCCLUDED) || + if ((sUseOcclusion && + group->isOcclusionState(LLSpatialGroup::OCCLUDED)) || (RenderAutoHideSurfaceAreaLimit > 0.f && group->mSurfaceArea > RenderAutoHideSurfaceAreaLimit*llmax(group->mObjectBoxSize, 10.f))) { @@ -5007,8 +5098,8 @@ void LLPipeline::renderDebug() LLSpatialPartition* part = region->getSpatialPartition(i); if (part) { - if ( hud_only && (part->mDrawableType == RENDER_TYPE_HUD || part->mDrawableType == RENDER_TYPE_HUD_PARTICLES) || - !hud_only && hasRenderType(part->mDrawableType) ) + if ( (hud_only && (part->mDrawableType == RENDER_TYPE_HUD || part->mDrawableType == RENDER_TYPE_HUD_PARTICLES)) || + (!hud_only && hasRenderType(part->mDrawableType)) ) { part->renderDebug(); } @@ -5390,7 +5481,17 @@ void LLPipeline::addToQuickLookup( LLDrawPool* new_poolp ) mBumpPool = new_poolp; } break; - + case LLDrawPool::POOL_MATERIALS: + if (mMaterialsPool) + { + llassert(0); + llwarns << "Ignorning duplicate materials pool." << llendl; + } + else + { + mMaterialsPool = new_poolp; + } + break; case LLDrawPool::POOL_ALPHA: if( mAlphaPool ) { @@ -5399,7 +5500,7 @@ void LLPipeline::addToQuickLookup( LLDrawPool* new_poolp ) } else { - mAlphaPool = new_poolp; + mAlphaPool = (LLDrawPoolAlpha*) new_poolp; } break; @@ -5530,7 +5631,12 @@ void LLPipeline::removeFromQuickLookup( LLDrawPool* poolp ) llassert( poolp == mBumpPool ); mBumpPool = NULL; break; - + + case LLDrawPool::POOL_MATERIALS: + llassert(poolp == mMaterialsPool); + mMaterialsPool = NULL; + break; + case LLDrawPool::POOL_ALPHA: llassert( poolp == mAlphaPool ); mAlphaPool = NULL; @@ -6917,6 +7023,17 @@ void LLPipeline::renderObjects(U32 type, U32 mask, BOOL texture, BOOL batch_text gGLLastMatrix = NULL; } +void LLPipeline::renderMaskedObjects(U32 type, U32 mask, BOOL texture, BOOL batch_texture) +{ + assertInitialized(); + gGL.loadMatrix(gGLModelView); + gGLLastMatrix = NULL; + mAlphaPool->pushMaskBatches(type, mask, texture, batch_texture); + gGL.loadMatrix(gGLModelView); + gGLLastMatrix = NULL; +} + + void apply_cube_face_rotation(U32 face) { switch (face) @@ -7018,10 +7135,51 @@ void LLPipeline::renderBloom(BOOL for_snapshot, F32 zoom_factor, int subfield) gGL.loadIdentity(); LLGLDisable test(GL_ALPHA_TEST); - + gGL.setColorMask(true, true); glClearColor(0,0,0,0); + + if (sRenderDeferred) + { + mScreen.bindTarget(); + // Apply gamma correction to the frame here. + gDeferredPostGammaCorrectProgram.bind(); + //mDeferredVB->setBuffer(LLVertexBuffer::MAP_VERTEX); + S32 channel = 0; + channel = gDeferredPostGammaCorrectProgram.enableTexture(LLShaderMgr::DEFERRED_DIFFUSE, mScreen.getUsage()); + if (channel > -1) + { + mScreen.bindTexture(0,channel); + gGL.getTexUnit(channel)->setTextureFilteringOption(LLTexUnit::TFO_POINT); + } + + gDeferredPostGammaCorrectProgram.uniform2f(LLShaderMgr::DEFERRED_SCREEN_RES, mScreen.getWidth(), mScreen.getHeight()); + + F32 gamma = 1.0; + if (!LLViewerCamera::getInstance()->cameraUnderWater()) + { + gamma = 1.0/2.2; + } + + gDeferredPostGammaCorrectProgram.uniform1f(LLShaderMgr::TEXTURE_GAMMA, gamma); + gGL.begin(LLRender::TRIANGLE_STRIP); + gGL.texCoord2f(tc1.mV[0], tc1.mV[1]); + gGL.vertex2f(-1,-1); + + gGL.texCoord2f(tc1.mV[0], tc2.mV[1]); + gGL.vertex2f(-1,3); + + gGL.texCoord2f(tc2.mV[0], tc1.mV[1]); + gGL.vertex2f(3,-1); + + gGL.end(); + + gGL.getTexUnit(channel)->unbind(mScreen.getUsage()); + gDeferredPostGammaCorrectProgram.unbind(); + mScreen.flush(); + } + { { LLFastTimer ftm(FTM_RENDER_BLOOM_FBO); @@ -7359,6 +7517,13 @@ void LLPipeline::renderBloom(BOOL for_snapshot, F32 zoom_factor, int subfield) mScreen.bindTexture(0, channel); gGL.getTexUnit(channel)->setTextureFilteringOption(LLTexUnit::TFO_BILINEAR); } + + if (!LLViewerCamera::getInstance()->cameraUnderWater()) + { + shader->uniform1f(LLShaderMgr::GLOBAL_GAMMA, 2.2); + } else { + shader->uniform1f(LLShaderMgr::GLOBAL_GAMMA, 1.0); + } shader->uniform1f(LLShaderMgr::DOF_MAX_COF, CameraMaxCoF); shader->uniform1f(LLShaderMgr::DOF_RES_SCALE, CameraDoFResScale); @@ -7400,6 +7565,13 @@ void LLPipeline::renderBloom(BOOL for_snapshot, F32 zoom_factor, int subfield) { mScreen.bindTexture(0, channel); } + + if (!LLViewerCamera::getInstance()->cameraUnderWater()) + { + shader->uniform1f(LLShaderMgr::GLOBAL_GAMMA, 2.2); + } else { + shader->uniform1f(LLShaderMgr::GLOBAL_GAMMA, 1.0); + } gGL.begin(LLRender::TRIANGLE_STRIP); gGL.texCoord2f(tc1.mV[0], tc1.mV[1]); @@ -7820,6 +7992,22 @@ void LLPipeline::bindDeferredShader(LLGLSLShader& shader, U32 light_index, U32 n } } +LLColor3 pow3f(LLColor3 v, F32 f) +{ + v.mV[0] = powf(v.mV[0], f); + v.mV[1] = powf(v.mV[1], f); + v.mV[2] = powf(v.mV[2], f); + return v; +} + +LLVector4 pow4fsrgb(LLVector4 v, F32 f) +{ + v.mV[0] = powf(v.mV[0], f); + v.mV[1] = powf(v.mV[1], f); + v.mV[2] = powf(v.mV[2], f); + return v; +} + static LLFastTimer::DeclareTimer FTM_GI_TRACE("Trace"); static LLFastTimer::DeclareTimer FTM_GI_GATHER("Gather"); static LLFastTimer::DeclareTimer FTM_SUN_SHADOW("Shadow Map"); @@ -8152,6 +8340,10 @@ void LLPipeline::renderDeferredLighting() continue; } + col.mV[0] = powf(col.mV[0], 2.2f); + col.mV[1] = powf(col.mV[1], 2.2f); + col.mV[2] = powf(col.mV[2], 2.2f); + LLFastTimer ftm(FTM_LOCAL_LIGHTS); gDeferredLightProgram.uniform3fv(LLShaderMgr::LIGHT_CENTER, 1, c); gDeferredLightProgram.uniform1f(LLShaderMgr::LIGHT_SIZE, s*s); @@ -8208,6 +8400,9 @@ void LLPipeline::renderDeferredLighting() setupSpotLight(gDeferredSpotLightProgram, drawablep); LLColor3 col = volume->getLightColor(); + col.mV[0] = powf(col.mV[0], 2.2f); + col.mV[1] = powf(col.mV[1], 2.2f); + col.mV[2] = powf(col.mV[2], 2.2f); gDeferredSpotLightProgram.uniform3fv(LLShaderMgr::LIGHT_CENTER, 1, c); gDeferredSpotLightProgram.uniform1f(LLShaderMgr::LIGHT_SIZE, s*s); @@ -8256,9 +8451,13 @@ void LLPipeline::renderDeferredLighting() fullscreen_lights.pop_front(); col[count] = light_colors.front(); light_colors.pop_front(); - + + col[count].mV[0] = powf(col[count].mV[0], 2.2f); + col[count].mV[1] = powf(col[count].mV[1], 2.2f); + col[count].mV[2] = powf(col[count].mV[2], 2.2f); + far_z = llmin(light[count].mV[2]-sqrtf(light[count].mV[3]), far_z); - + //col[count] = pow4fsrgb(col[count], 2.2f); count++; if (count == max_count || fullscreen_lights.empty()) { @@ -8300,6 +8499,10 @@ void LLPipeline::renderDeferredLighting() LLColor3 col = volume->getLightColor(); + col.mV[0] = powf(col.mV[0], 2.2f); + col.mV[1] = powf(col.mV[1], 2.2f); + col.mV[2] = powf(col.mV[2], 2.2f); + gDeferredMultiSpotLightProgram.uniform3fv(LLShaderMgr::LIGHT_CENTER, 1, tc.v); gDeferredMultiSpotLightProgram.uniform1f(LLShaderMgr::LIGHT_SIZE, s*s); gDeferredMultiSpotLightProgram.uniform3fv(LLShaderMgr::DIFFUSE_COLOR, 1, col.mV); @@ -8895,11 +9098,22 @@ void LLPipeline::renderShadow(glh::matrix4f& view, glh::matrix4f& proj, LLCamera LLRenderPass::PASS_FULLBRIGHT, LLRenderPass::PASS_SHINY, LLRenderPass::PASS_BUMP, - LLRenderPass::PASS_FULLBRIGHT_SHINY + LLRenderPass::PASS_FULLBRIGHT_SHINY , + LLRenderPass::PASS_MATERIAL, + LLRenderPass::PASS_MATERIAL_ALPHA_EMISSIVE, + LLRenderPass::PASS_SPECMAP, + LLRenderPass::PASS_SPECMAP_EMISSIVE, + LLRenderPass::PASS_NORMMAP, + LLRenderPass::PASS_NORMMAP_EMISSIVE, + LLRenderPass::PASS_NORMSPEC, + LLRenderPass::PASS_NORMSPEC_EMISSIVE, }; LLGLEnable cull(GL_CULL_FACE); + //enable depth clamping if available + LLGLEnable depth_clamp(gGLManager.mHasDepthClamp ? GL_DEPTH_CLAMP : 0); + if (use_shader) { gDeferredShadowCubeProgram.bind(); @@ -8966,7 +9180,6 @@ void LLPipeline::renderShadow(glh::matrix4f& view, glh::matrix4f& proj, LLCamera { LLFastTimer ftm(FTM_SHADOW_ALPHA); gDeferredShadowAlphaMaskProgram.bind(); - gDeferredShadowAlphaMaskProgram.setMinimumAlpha(0.598f); gDeferredShadowAlphaMaskProgram.uniform1f(LLShaderMgr::DEFERRED_SHADOW_TARGET_WIDTH, (float)target_width); U32 mask = LLVertexBuffer::MAP_VERTEX | @@ -8974,10 +9187,19 @@ void LLPipeline::renderShadow(glh::matrix4f& view, glh::matrix4f& proj, LLCamera LLVertexBuffer::MAP_COLOR | LLVertexBuffer::MAP_TEXTURE_INDEX; - renderObjects(LLRenderPass::PASS_ALPHA_MASK, mask, TRUE, TRUE); - renderObjects(LLRenderPass::PASS_FULLBRIGHT_ALPHA_MASK, mask, TRUE, TRUE); + renderMaskedObjects(LLRenderPass::PASS_ALPHA_MASK, mask, TRUE, TRUE); + renderMaskedObjects(LLRenderPass::PASS_FULLBRIGHT_ALPHA_MASK, mask, TRUE, TRUE); + gDeferredShadowAlphaMaskProgram.setMinimumAlpha(0.598f); renderObjects(LLRenderPass::PASS_ALPHA, mask, TRUE, TRUE); + + mask = mask & ~LLVertexBuffer::MAP_TEXTURE_INDEX; + gDeferredTreeShadowProgram.bind(); + renderMaskedObjects(LLRenderPass::PASS_NORMSPEC_MASK, mask); + renderMaskedObjects(LLRenderPass::PASS_MATERIAL_ALPHA_MASK, mask); + renderMaskedObjects(LLRenderPass::PASS_SPECMAP_MASK, mask); + renderMaskedObjects(LLRenderPass::PASS_NORMMAP_MASK, mask); + gDeferredTreeShadowProgram.setMinimumAlpha(0.598f); renderObjects(LLRenderPass::PASS_GRASS, LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_TEXCOORD0, TRUE); } @@ -9308,6 +9530,22 @@ void LLPipeline::generateSunShadow(LLCamera& camera) LLPipeline::RENDER_TYPE_PASS_FULLBRIGHT, LLPipeline::RENDER_TYPE_PASS_SHINY, LLPipeline::RENDER_TYPE_PASS_FULLBRIGHT_SHINY, + LLPipeline::RENDER_TYPE_PASS_MATERIAL, + LLPipeline::RENDER_TYPE_PASS_MATERIAL_ALPHA, + LLPipeline::RENDER_TYPE_PASS_MATERIAL_ALPHA_MASK, + LLPipeline::RENDER_TYPE_PASS_MATERIAL_ALPHA_EMISSIVE, + LLPipeline::RENDER_TYPE_PASS_SPECMAP, + LLPipeline::RENDER_TYPE_PASS_SPECMAP_BLEND, + LLPipeline::RENDER_TYPE_PASS_SPECMAP_MASK, + LLPipeline::RENDER_TYPE_PASS_SPECMAP_EMISSIVE, + LLPipeline::RENDER_TYPE_PASS_NORMMAP, + LLPipeline::RENDER_TYPE_PASS_NORMMAP_BLEND, + LLPipeline::RENDER_TYPE_PASS_NORMMAP_MASK, + LLPipeline::RENDER_TYPE_PASS_NORMMAP_EMISSIVE, + LLPipeline::RENDER_TYPE_PASS_NORMSPEC, + LLPipeline::RENDER_TYPE_PASS_NORMSPEC_BLEND, + LLPipeline::RENDER_TYPE_PASS_NORMSPEC_MASK, + LLPipeline::RENDER_TYPE_PASS_NORMSPEC_EMISSIVE, END_RENDER_TYPES); gGL.setColorMask(false, false); @@ -9827,7 +10065,6 @@ void LLPipeline::generateSunShadow(LLCamera& camera) { static LLCullResult result[4]; - //LLGLEnable enable(GL_DEPTH_CLAMP_NV); renderShadow(view[j], proj[j], shadow_cam, result[j], TRUE, TRUE, target_width); } diff --git a/indra/newview/pipeline.h b/indra/newview/pipeline.h index a8db93585e..fbfb2d012f 100644 --- a/indra/newview/pipeline.h +++ b/indra/newview/pipeline.h @@ -35,7 +35,8 @@ #include "llspatialpartition.h" #include "m4math.h" #include "llpointer.h" -#include "lldrawpool.h" +#include "lldrawpoolalpha.h" +#include "lldrawpoolmaterials.h" #include "llgl.h" #include "lldrawable.h" #include "llrendertarget.h" @@ -59,6 +60,7 @@ class LLCullResult; class LLVOAvatar; class LLGLSLShader; class LLCurlRequest; +class LLDrawPoolAlpha; class LLMeshResponder; @@ -95,6 +97,7 @@ extern LLFastTimer::DeclareTimer FTM_RENDER_WL_SKY; extern LLFastTimer::DeclareTimer FTM_RENDER_ALPHA; extern LLFastTimer::DeclareTimer FTM_RENDER_CHARACTERS; extern LLFastTimer::DeclareTimer FTM_RENDER_BUMP; +extern LLFastTimer::DeclareTimer FTM_RENDER_MATERIALS; extern LLFastTimer::DeclareTimer FTM_RENDER_FULLBRIGHT; extern LLFastTimer::DeclareTimer FTM_RENDER_GLOW; extern LLFastTimer::DeclareTimer FTM_STATESORT; @@ -256,6 +259,8 @@ public: void forAllVisibleDrawables(void (*func)(LLDrawable*)); void renderObjects(U32 type, U32 mask, BOOL texture = TRUE, BOOL batch_texture = FALSE); + void renderMaskedObjects(U32 type, U32 mask, BOOL texture = TRUE, BOOL batch_texture = FALSE); + void renderGroups(LLRenderPass* pass, U32 type, U32 mask, BOOL texture); void grabReferences(LLCullResult& result); @@ -427,6 +432,7 @@ public: RENDER_TYPE_GRASS = LLDrawPool::POOL_GRASS, RENDER_TYPE_FULLBRIGHT = LLDrawPool::POOL_FULLBRIGHT, RENDER_TYPE_BUMP = LLDrawPool::POOL_BUMP, + RENDER_TYPE_MATERIALS = LLDrawPool::POOL_MATERIALS, RENDER_TYPE_AVATAR = LLDrawPool::POOL_AVATAR, RENDER_TYPE_TREE = LLDrawPool::POOL_TREE, RENDER_TYPE_INVISIBLE = LLDrawPool::POOL_INVISIBLE, @@ -447,6 +453,22 @@ public: RENDER_TYPE_PASS_ALPHA = LLRenderPass::PASS_ALPHA, RENDER_TYPE_PASS_ALPHA_MASK = LLRenderPass::PASS_ALPHA_MASK, RENDER_TYPE_PASS_FULLBRIGHT_ALPHA_MASK = LLRenderPass::PASS_FULLBRIGHT_ALPHA_MASK, + RENDER_TYPE_PASS_MATERIAL = LLRenderPass::PASS_MATERIAL, + RENDER_TYPE_PASS_MATERIAL_ALPHA = LLRenderPass::PASS_MATERIAL_ALPHA, + RENDER_TYPE_PASS_MATERIAL_ALPHA_MASK = LLRenderPass::PASS_MATERIAL_ALPHA_MASK, + RENDER_TYPE_PASS_MATERIAL_ALPHA_EMISSIVE= LLRenderPass::PASS_MATERIAL_ALPHA_EMISSIVE, + RENDER_TYPE_PASS_SPECMAP = LLRenderPass::PASS_SPECMAP, + RENDER_TYPE_PASS_SPECMAP_BLEND = LLRenderPass::PASS_SPECMAP_BLEND, + RENDER_TYPE_PASS_SPECMAP_MASK = LLRenderPass::PASS_SPECMAP_MASK, + RENDER_TYPE_PASS_SPECMAP_EMISSIVE = LLRenderPass::PASS_SPECMAP_EMISSIVE, + RENDER_TYPE_PASS_NORMMAP = LLRenderPass::PASS_NORMMAP, + RENDER_TYPE_PASS_NORMMAP_BLEND = LLRenderPass::PASS_NORMMAP_BLEND, + RENDER_TYPE_PASS_NORMMAP_MASK = LLRenderPass::PASS_NORMMAP_MASK, + RENDER_TYPE_PASS_NORMMAP_EMISSIVE = LLRenderPass::PASS_NORMMAP_EMISSIVE, + RENDER_TYPE_PASS_NORMSPEC = LLRenderPass::PASS_NORMSPEC, + RENDER_TYPE_PASS_NORMSPEC_BLEND = LLRenderPass::PASS_NORMSPEC_BLEND, + RENDER_TYPE_PASS_NORMSPEC_MASK = LLRenderPass::PASS_NORMSPEC_MASK, + RENDER_TYPE_PASS_NORMSPEC_EMISSIVE = LLRenderPass::PASS_NORMSPEC_EMISSIVE, // Following are object types (only used in drawable mRenderType) RENDER_TYPE_HUD = LLRenderPass::NUM_RENDER_TYPES, RENDER_TYPE_VOLUME, @@ -562,7 +584,8 @@ public: static BOOL sRenderDeferred; static BOOL sMemAllocationThrottled; static S32 sVisibleLightCount; - static F32 sMinRenderSize; + static F32 sMinRenderSize; + static BOOL sRenderingHUDs; //screen texture U32 mScreenWidth; @@ -773,7 +796,7 @@ protected: // For quick-lookups into mPools (mapped by texture pointer) std::map<uintptr_t, LLDrawPool*> mTerrainPools; std::map<uintptr_t, LLDrawPool*> mTreePools; - LLDrawPool* mAlphaPool; + LLDrawPoolAlpha* mAlphaPool; LLDrawPool* mSkyPool; LLDrawPool* mTerrainPool; LLDrawPool* mWaterPool; @@ -784,6 +807,7 @@ protected: LLDrawPool* mInvisiblePool; LLDrawPool* mGlowPool; LLDrawPool* mBumpPool; + LLDrawPool* mMaterialsPool; LLDrawPool* mWLSkyPool; // Note: no need to keep an quick-lookup to avatar pools, since there's only one per avatar diff --git a/indra/newview/skins/default/colors.xml b/indra/newview/skins/default/colors.xml index 0de217fc0d..af435685d4 100644 --- a/indra/newview/skins/default/colors.xml +++ b/indra/newview/skins/default/colors.xml @@ -651,6 +651,15 @@ name="PathfindingGoodColor" reference="LtGreen" /> <color + name="MaterialErrorColor" + reference="LtRed" /> + <color + name="MaterialWarningColor" + reference="DrYellow" /> + <color + name="MaterialGoodColor" + reference="LtGreen" /> + <color name="PathfindingDefaultBeaconColor" reference="Red_80" /> <color diff --git a/indra/newview/skins/default/textures/flatnormal.tga b/indra/newview/skins/default/textures/flatnormal.tga Binary files differnew file mode 100644 index 0000000000..6d5abd1782 --- /dev/null +++ b/indra/newview/skins/default/textures/flatnormal.tga diff --git a/indra/newview/skins/default/textures/materials_ui_x_24.png b/indra/newview/skins/default/textures/materials_ui_x_24.png Binary files differnew file mode 100644 index 0000000000..6d88554914 --- /dev/null +++ b/indra/newview/skins/default/textures/materials_ui_x_24.png diff --git a/indra/newview/skins/default/textures/textures.xml b/indra/newview/skins/default/textures/textures.xml index fcab966dee..b0e4b71d21 100644 --- a/indra/newview/skins/default/textures/textures.xml +++ b/indra/newview/skins/default/textures/textures.xml @@ -743,6 +743,7 @@ with the same filename but different name <texture name="default_land_picture.j2c" /> <texture name="default_profile_picture.j2c" /> <texture name="locked_image.j2c" /> + <texture name="materials_ui_x_24.png" /> <texture name="Progress_1" file_name="icons/Progress_1.png" preload="true" /> <texture name="Progress_2" file_name="icons/Progress_2.png" preload="true" /> diff --git a/indra/newview/skins/default/xui/da/menu_viewer.xml b/indra/newview/skins/default/xui/da/menu_viewer.xml index d695cd1f89..f2ed7c2e64 100644 --- a/indra/newview/skins/default/xui/da/menu_viewer.xml +++ b/indra/newview/skins/default/xui/da/menu_viewer.xml @@ -245,7 +245,7 @@ <menu label="Gengivelse" name="Rendering"> <menu_item_check label="Akser" name="Axes"/> <menu_item_check label="Wireframe" name="Wireframe"/> - <menu_item_check label="Lys og skygger" name="Lighting and Shadows"/> + <menu_item_check label="Lys og skygger" name="Advanced Lighting Model"/> <menu_item_check label="Skygger fra sol/mÃ¥ne/andre lyskilder" name="Shadows from Sun/Moon/Projectors"/> <menu_item_check label="SSAO og skygge udjævning" name="SSAO and Shadow Smoothing"/> <menu_item_check label="Globalt lys (eksperimentiel)" name="Global Illumination"/> diff --git a/indra/newview/skins/default/xui/de/floater_conversation_log.xml b/indra/newview/skins/default/xui/de/floater_conversation_log.xml new file mode 100644 index 0000000000..19620a0fc9 --- /dev/null +++ b/indra/newview/skins/default/xui/de/floater_conversation_log.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="floater_conversation_log" title="UNTERHALTUNGSPROTOKOLL"> + <panel name="buttons_panel"> + <filter_editor label="Nach Personen filtern" name="people_filter_input"/> + <menu_button name="conversation_view_btn" tool_tip="Anzeige-/Sortieroptionen"/> + <menu_button name="conversations_gear_btn" tool_tip="Aktionen für ausgewählte Person/Gruppe"/> + </panel> +</floater> diff --git a/indra/newview/skins/default/xui/de/floater_conversation_preview.xml b/indra/newview/skins/default/xui/de/floater_conversation_preview.xml new file mode 100644 index 0000000000..010ad19076 --- /dev/null +++ b/indra/newview/skins/default/xui/de/floater_conversation_preview.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="preview_conversation" title="UNTERHALTUNG:"> + <floater.string name="Title"> + UNTERHALTUNG: [NAME] + </floater.string> + <text name="page_label" value="Seite"/> +</floater> diff --git a/indra/newview/skins/default/xui/de/floater_im_container.xml b/indra/newview/skins/default/xui/de/floater_im_container.xml index 95eda97938..5bf916c8e9 100644 --- a/indra/newview/skins/default/xui/de/floater_im_container.xml +++ b/indra/newview/skins/default/xui/de/floater_im_container.xml @@ -1,2 +1,29 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<multi_floater name="floater_im_box" title="GESPRÄCHE"/> +<multi_floater name="floater_im_box" title="GESPRÄCHE"> + <string name="collapse_icon" value="Conv_toolbar_collapse"/> + <string name="expand_icon" value="Conv_toolbar_expand"/> + <layout_stack name="conversations_stack"> + <layout_panel name="conversations_layout_panel"> + <layout_stack name="conversations_pane_buttons_stack"> + <layout_panel name="conversations_pane_buttons_expanded"> + <menu_button name="sort_btn" tool_tip="Anzeige-/Sortieroptionen"/> + <button name="add_btn" tool_tip="Neue Unterhaltung starten"/> + <button name="speak_btn" tool_tip="Ãœber Ihr Mikrofon mit anderen sprechen"/> + </layout_panel> + <layout_panel name="conversations_pane_buttons_collapsed"> + <button name="expand_collapse_btn" tool_tip="Diese Liste schließen/erweitern"/> + </layout_panel> + </layout_stack> + </layout_panel> + <layout_panel name="messages_layout_panel"> + <panel_container name="im_box_tab_container"> + <panel name="stub_panel"> + <button name="stub_collapse_btn" tool_tip="Dieses Fenster schließen"/> + <text name="stub_textbox"> + Diese Unterhaltung erscheint in einem separaten Fenster. [secondlife:/// Zurückholen.] + </text> + </panel> + </panel_container> + </layout_panel> + </layout_stack> +</multi_floater> diff --git a/indra/newview/skins/default/xui/de/floater_im_session.xml b/indra/newview/skins/default/xui/de/floater_im_session.xml index abaf275651..f96eb72cb1 100644 --- a/indra/newview/skins/default/xui/de/floater_im_session.xml +++ b/indra/newview/skins/default/xui/de/floater_im_session.xml @@ -1,8 +1,59 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="panel_im"> - <layout_stack name="im_panels"> - <layout_panel> - <line_editor label="An" name="chat_editor"/> - </layout_panel> - </layout_stack> + <floater.string name="call_btn_start"> + Conv_toolbar_open_call + </floater.string> + <floater.string name="call_btn_stop"> + Conv_toolbar_hang_up + </floater.string> + <floater.string name="collapseline_icon" value="Conv_collapse_to_one_line"/> + <floater.string name="expandline_icon" value="Conv_expand_one_line"/> + <floater.string name="collapse_icon" value="Conv_toolbar_collapse"/> + <floater.string name="expand_icon" value="Conv_toolbar_expand"/> + <floater.string name="tear_off_icon" value="Conv_toolbar_arrow_ne"/> + <floater.string name="return_icon" value="Conv_toolbar_arrow_sw"/> + <floater.string name="participant_added" value="[NAME] wurde zur Unterhaltung eingeladen."/> + <floater.string name="multiple_participants_added" value="[NAME] wurden zur Unterhaltung eingeladen."/> + <floater.string name="tooltip_to_separate_window" value="Diese Unterhaltung in separates Fenster verschieben"/> + <floater.string name="tooltip_to_main_window" value="Diese Unterhaltung zurück ins Hauptfenster verschieben"/> + <floater.string name="start_call_button_tooltip" value="Voice-Verbindung öffnen"/> + <floater.string name="end_call_button_tooltip" value="Voice-Verbindung schließen"/> + <floater.string name="expcol_button_not_tearoff_tooltip" value="Dieses Fenster schließen"/> + <floater.string name="expcol_button_tearoff_and_expanded_tooltip" value="Teilnehmerliste schließen"/> + <floater.string name="expcol_button_tearoff_and_collapsed_tooltip" value="Teilnehmerliste erweitern"/> + <view name="contents_view"> + <layout_stack name="main_stack"> + <layout_panel name="toolbar_panel"> + <menu_button name="view_options_btn" tool_tip="Anzeige-/Sortieroptionen"/> + <menu_button name="gear_btn" tool_tip="Aktionen für ausgewählte Person"/> + <button name="add_btn" tool_tip="Jemanden zu dieser Unterhaltung hinzufügen"/> + <button name="voice_call_btn" tool_tip="Voice-Verbindung öffnen"/> + <button name="close_btn" tool_tip="Diese Unterhaltung beenden"/> + <button name="expand_collapse_btn" tool_tip="Dieses Fenster schließen/erweitern"/> + </layout_panel> + <layout_panel name="body_panel"> + <layout_stack name="im_panels"> + <layout_panel name="right_part_holder"> + <panel name="trnsAndChat_panel"> + <layout_stack name="translate_and_chat_stack"> + <layout_panel name="translate_chat_checkbox_lp"> + <check_box label="Chat übersetzen" name="translate_chat_checkbox"/> + </layout_panel> + </layout_stack> + </panel> + </layout_panel> + </layout_stack> + </layout_panel> + <layout_panel name="chat_layout_panel"> + <layout_stack name="input_panels"> + <layout_panel name="input_editor_layout_panel"> + <chat_editor label="An" name="chat_editor"/> + </layout_panel> + <layout_panel name="input_button_layout_panel"> + <button name="minz_btn" tool_tip="Nachrichtenfenster anzeigen/ausblenden"/> + </layout_panel> + </layout_stack> + </layout_panel> + </layout_stack> + </view> </floater> diff --git a/indra/newview/skins/default/xui/de/floater_incoming_call.xml b/indra/newview/skins/default/xui/de/floater_incoming_call.xml index 213d9f54f5..f13842f479 100644 --- a/indra/newview/skins/default/xui/de/floater_incoming_call.xml +++ b/indra/newview/skins/default/xui/de/floater_incoming_call.xml @@ -10,7 +10,7 @@ Anonym </floater.string> <floater.string name="VoiceInviteP2P"> - ruft an. + ruft Sie an. </floater.string> <floater.string name="VoiceInviteAdHoc"> ist einem Voice-Konferenz-Chat beigetreten. @@ -25,9 +25,9 @@ Möchten Sie [CURRENT_CHAT] verlassen und diesem Voice-Chat beitreten? </floater.string> <text name="question"> - Möchten Sie [CURRENT_CHAT] verlassen und diesem Voice-Chat beitreten? + Wenn Sie antworten, wird Ihre aktuelle Voice-Unterhaltung beendet. </text> - <button label="Akzeptieren" label_selected="Akzeptieren" name="Accept"/> - <button label="Ablehnen" label_selected="Ablehnen" name="Reject"/> - <button label="IM starten" name="Start IM"/> + <button label="Annehmen" label_selected="Annehmen" name="Accept"/> + <button label="Ignorieren" label_selected="Ignorieren" name="Reject"/> + <button label="Stattdessen IM öffnen" name="Start IM"/> </floater> diff --git a/indra/newview/skins/default/xui/de/floater_pathfinding_console.xml b/indra/newview/skins/default/xui/de/floater_pathfinding_console.xml index ebf8f01632..88e9f53a4c 100644 --- a/indra/newview/skins/default/xui/de/floater_pathfinding_console.xml +++ b/indra/newview/skins/default/xui/de/floater_pathfinding_console.xml @@ -71,7 +71,7 @@ <text name="show_label"> Anzeigen: </text> - <check_box label="Welt" name="show_world"/> + <check_box label="Test" name="show_world"/> <check_box label="Nur bewegliche Objekte" name="show_world_movables_only"/> <check_box label="Navmesh" name="show_navmesh"/> <text name="show_walkability_label"> 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 9585622516..b794d879f0 100644 --- a/indra/newview/skins/default/xui/de/floater_texture_ctrl.xml +++ b/indra/newview/skins/default/xui/de/floater_texture_ctrl.xml @@ -20,7 +20,7 @@ <button label="Leer" label_selected="Leer" name="Blank"/> <button label="Keine" label_selected="Keine" name="None"/> <button label="" label_selected="" name="Pipette"/> - <check_box initial_value="true" label="Live-Vorschau" name="apply_immediate_check"/> + <check_box initial_value="true" label="Jetzt übernehmen" name="apply_immediate_check"/> <text name="preview_disabled" value="Vorschau deaktiviert"/> <filter_editor label="Texturen filtern" name="inventory search editor"/> <check_box initial_value="false" label="Ordner anzeigen" name="show_folders_check"/> diff --git a/indra/newview/skins/default/xui/de/floater_voice_chat_volume.xml b/indra/newview/skins/default/xui/de/floater_voice_chat_volume.xml new file mode 100644 index 0000000000..15259639e8 --- /dev/null +++ b/indra/newview/skins/default/xui/de/floater_voice_chat_volume.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="floater_voice_volume" title="VOICE-CHAT-LAUTSTÄRKE"> + <slider label="Voice-Chat" name="chat_voice_volume"/> +</floater> diff --git a/indra/newview/skins/default/xui/de/floater_voice_effect.xml b/indra/newview/skins/default/xui/de/floater_voice_effect.xml index 413a46525c..8d37950480 100644 --- a/indra/newview/skins/default/xui/de/floater_voice_effect.xml +++ b/indra/newview/skins/default/xui/de/floater_voice_effect.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater label="Orte" name="voice_effects" title="VOICE MORPHING"> +<floater label="Orte" name="voice_effects" title="VOICE-MORPHING-VORSCHAU"> <string name="no_voice_effect"> (Kein Voice-Morphing) </string> diff --git a/indra/newview/skins/default/xui/de/floater_voice_volume.xml b/indra/newview/skins/default/xui/de/floater_voice_volume.xml new file mode 100644 index 0000000000..258627c94f --- /dev/null +++ b/indra/newview/skins/default/xui/de/floater_voice_volume.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<!-- + Not can_close / no title to avoid window chrome + Single instance - only have one at a time, recycle it each spawn +--> +<floater name="floater_voice_volume" title="LAUTSTÄRKE"> + <slider name="volume_slider" tool_tip="Lautstärke" value="0.5"/> +</floater> diff --git a/indra/newview/skins/default/xui/de/menu_cof_gear.xml b/indra/newview/skins/default/xui/de/menu_cof_gear.xml index 54b218d22f..2dd871b2ea 100644 --- a/indra/newview/skins/default/xui/de/menu_cof_gear.xml +++ b/indra/newview/skins/default/xui/de/menu_cof_gear.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<menu name="Gear COF"> +<toggleable_menu name="Gear COF"> <menu label="Neue Kleider" name="COF.Gear.New_Clothes"/> - <menu label="Neue Körperteile" name="COF.Geear.New_Body_Parts"/> -</menu> + <menu label="Neue Körperteile" name="COF.Gear.New_Body_Parts"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/de/menu_conversation.xml b/indra/newview/skins/default/xui/de/menu_conversation.xml new file mode 100644 index 0000000000..30d3ab79e1 --- /dev/null +++ b/indra/newview/skins/default/xui/de/menu_conversation.xml @@ -0,0 +1,31 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_conversation_participant"> + <menu_item_call label="Unterhaltung schließen" name="close_conversation"/> + <menu_item_call label="Unterhaltung öffnen" name="open_voice_conversation"/> + <menu_item_call label="Voice-Verbindung trennen" name="disconnect_from_voice"/> + <menu_item_call label="Profil anzeigen" name="view_profile"/> + <menu_item_call label="IM" name="im"/> + <menu_item_call label="Teleport anbieten" name="offer_teleport"/> + <menu_item_call label="Voice-Anruf" name="voice_call"/> + <menu_item_call label="Chatverlauf..." name="chat_history"/> + <menu_item_call label="Freund hinzufügen" name="add_friend"/> + <menu_item_call label="Freund entfernen" name="remove_friend"/> + <menu_item_call label="Freunde entfernen" name="remove_friends"/> + <menu_item_call label="In Gruppe einladen..." name="invite_to_group"/> + <menu_item_call label="Hineinzoomen" name="zoom_in"/> + <menu_item_call label="Karte" name="map"/> + <menu_item_call label="Freigeben" name="share"/> + <menu_item_call label="Bezahlen" name="pay"/> + <menu_item_check label="Voice ignorieren" name="block_unblock"/> + <menu_item_check label="Text ignorieren" name="MuteText"/> + <menu_item_call label="Gruppenprofil" name="group_profile"/> + <menu_item_call label="Gruppe aktivieren" name="activate_group"/> + <menu_item_call label="Gruppe verlassen" name="leave_group"/> + <context_menu label="Moderatoroptionen" name="Moderator Options"> + <menu_item_check label="Text-Chat zulassen" name="AllowTextChat"/> + <menu_item_call label="Diesen Teilnehmer stummschalten" name="ModerateVoiceMuteSelected"/> + <menu_item_call label="Stummschaltung für diesen Teilnehmer aufheben" name="ModerateVoiceUnMuteSelected"/> + <menu_item_call label="Alle stummschalten" name="ModerateVoiceMute"/> + <menu_item_call label="Stummschaltung für alle aufheben" name="ModerateVoiceUnmute"/> + </context_menu> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/de/menu_conversation_log_gear.xml b/indra/newview/skins/default/xui/de/menu_conversation_log_gear.xml new file mode 100644 index 0000000000..2ef8762128 --- /dev/null +++ b/indra/newview/skins/default/xui/de/menu_conversation_log_gear.xml @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="Conversation Context Menu"> + <menu_item_call label="IM..." name="IM"/> + <menu_item_call label="Voice-Anruf..." name="Call"/> + <menu_item_call label="Chatverlauf öffnen..." name="Chat history"/> + <menu_item_call label="Profil anzeigen" name="View Profile"/> + <menu_item_call label="Teleport anbieten" name="teleport"/> + <menu_item_call label="Freund hinzufügen" name="add_friend"/> + <menu_item_call label="Freund entfernen" name="remove_friend"/> + <menu_item_call label="In Gruppe einladen..." name="Invite"/> + <menu_item_call label="Karte" name="Map"/> + <menu_item_call label="Freigeben" name="Share"/> + <menu_item_call label="Bezahlen" name="Pay"/> + <menu_item_check label="Ignorieren/Nicht mehr ignorieren" name="Block/Unblock"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/de/menu_conversation_log_view.xml b/indra/newview/skins/default/xui/de/menu_conversation_log_view.xml new file mode 100644 index 0000000000..ae3cc5bc97 --- /dev/null +++ b/indra/newview/skins/default/xui/de/menu_conversation_log_view.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_conversation_view"> + <menu_item_check label="Nach Namen sortieren" name="sort_by_name"/> + <menu_item_check label="Nach Datum sortieren" name="sort_by_date"/> + <menu_item_check label="Freunde oben anzeigen" name="sort_by_friends"/> + <menu_item_call label="Verlaufsliste für „Chat in der Nähe“ anzeigen..." name="view_nearby_chat_history"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/de/menu_im_conversation.xml b/indra/newview/skins/default/xui/de/menu_im_conversation.xml new file mode 100644 index 0000000000..875524b19d --- /dev/null +++ b/indra/newview/skins/default/xui/de/menu_im_conversation.xml @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="Conversation Gear Menu"> + <menu_item_call label="Profil anzeigen" name="View Profile"/> + <menu_item_call label="Freund hinzufügen" name="Add Friend"/> + <menu_item_call label="Freund entfernen" name="remove_friend"/> + <menu_item_call label="Teleport anbieten" name="offer_teleport"/> + <menu_item_call label="In Gruppe einladen..." name="invite_to_group"/> + <menu_item_call label="Chatverlauf..." name="chat_history"/> + <menu_item_call label="Hineinzoomen" name="zoom_in"/> + <menu_item_call label="Karte" name="map"/> + <menu_item_call label="Freigeben" name="Share"/> + <menu_item_call label="Bezahlen" name="Pay"/> + <menu_item_check label="Voice ignorieren" name="Block/Unblock"/> + <menu_item_check label="Text ignorieren" name="MuteText"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/de/menu_im_session_showmodes.xml b/indra/newview/skins/default/xui/de/menu_im_session_showmodes.xml new file mode 100644 index 0000000000..48f62d29a1 --- /dev/null +++ b/indra/newview/skins/default/xui/de/menu_im_session_showmodes.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_modes"> + <menu_item_check label="Kompaktansicht" name="compact_view"/> + <menu_item_check label="Erweiterte Ansicht" name="expanded_view"/> + <menu_item_check label="Zeit anzeigen" name="IMShowTime"/> + <menu_item_check label="Namen in privaten Unterhaltungen anzeigen" name="IMShowNamesForP2PConv"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/de/menu_object_icon.xml b/indra/newview/skins/default/xui/de/menu_object_icon.xml index 8b6c558416..f92fa0f82b 100644 --- a/indra/newview/skins/default/xui/de/menu_object_icon.xml +++ b/indra/newview/skins/default/xui/de/menu_object_icon.xml @@ -2,4 +2,6 @@ <menu name="Object Icon Menu"> <menu_item_call label="Objektprofil..." name="Object Profile"/> <menu_item_call label="Ignorieren..." name="Block"/> + <menu_item_call label="Auf Karte anzeigen" name="show_on_map"/> + <menu_item_call label="Zu Objektposition teleportieren" name="teleport_to_object"/> </menu> diff --git a/indra/newview/skins/default/xui/de/menu_outfit_gear.xml b/indra/newview/skins/default/xui/de/menu_outfit_gear.xml index d56c93533c..0cf3c09882 100644 --- a/indra/newview/skins/default/xui/de/menu_outfit_gear.xml +++ b/indra/newview/skins/default/xui/de/menu_outfit_gear.xml @@ -23,6 +23,8 @@ <menu_item_call label="Neues Haar" name="New Hair"/> <menu_item_call label="Neue Augen" name="New Eyes"/> </menu> + <menu_item_call label="Alle Ordner erweitern" name="expand"/> + <menu_item_call label="Alle Ordner schließen" name="collapse"/> <menu_item_call label="Outfit neu benennen" name="rename"/> <menu_item_call label="Outfit löschen" name="delete_outfit"/> </toggleable_menu> diff --git a/indra/newview/skins/default/xui/de/menu_participant_view.xml b/indra/newview/skins/default/xui/de/menu_participant_view.xml new file mode 100644 index 0000000000..6ceb9ac4c5 --- /dev/null +++ b/indra/newview/skins/default/xui/de/menu_participant_view.xml @@ -0,0 +1,13 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="participant_manu_view"> + <menu_item_check label="Unterhaltungen nach Typ sortieren" name="sort_sessions_by_type"/> + <menu_item_check label="Unterhaltungen nach Namen sortieren" name="sort_sessions_by_name"/> + <menu_item_check label="Unterhaltungen nach jüngster Aktivität sortieren" name="sort_sessions_by_recent"/> + <menu_item_check label="Teilnehmer nach Namen sortieren" name="sort_participants_by_name"/> + <menu_item_check label="Teilnehmer nach jüngster Aktivität sortieren" name="sort_participants_by_recent"/> + <menu_item_call label="Chat-Einstellungen..." name="chat_preferences"/> + <menu_item_call label="Privatsphäre-Einstellungen..." name="privacy_preferences"/> + <menu_item_check label="Unterhaltungsprotokoll..." name="Conversation"/> + <menu_item_check label="Chat in der Nähe übersetzen" name="Translate_chat"/> + <menu_item_check label="Ãœbersetzungseinstellungen..." name="Translation_settings"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/de/menu_people_blocked_gear.xml b/indra/newview/skins/default/xui/de/menu_people_blocked_gear.xml new file mode 100644 index 0000000000..f69a453e58 --- /dev/null +++ b/indra/newview/skins/default/xui/de/menu_people_blocked_gear.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_blocked_gear"> + <menu_item_call label="Nicht mehr ignorieren" name="unblock"/> + <menu_item_call label="Profil..." name="profile"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/de/menu_people_blocked_plus.xml b/indra/newview/skins/default/xui/de/menu_people_blocked_plus.xml new file mode 100644 index 0000000000..041fde139d --- /dev/null +++ b/indra/newview/skins/default/xui/de/menu_people_blocked_plus.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_blocked_plus"> + <menu_item_call label="Einwohner nach Namen ignorieren..." name="block_resident_by_name"/> + <menu_item_call label="Objekt nach Namen ignorieren" name="block_object_by_name"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/de/menu_people_blocked_view.xml b/indra/newview/skins/default/xui/de/menu_people_blocked_view.xml new file mode 100644 index 0000000000..1dae593ebe --- /dev/null +++ b/indra/newview/skins/default/xui/de/menu_people_blocked_view.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_blocked_view"> + <menu_item_check label="Nach Namen sortieren" name="sort_by_name"/> + <menu_item_check label="Nach Typ sortieren" name="sort_by_type"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/de/menu_people_friends_view.xml b/indra/newview/skins/default/xui/de/menu_people_friends_view.xml new file mode 100644 index 0000000000..da4890fe96 --- /dev/null +++ b/indra/newview/skins/default/xui/de/menu_people_friends_view.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_group_plus"> + <menu_item_check label="Nach Namen sortieren" name="sort_name"/> + <menu_item_check label="Nach Status sortieren" name="sort_status"/> + <menu_item_check label="Symbole für Personen anzeigen" name="view_icons"/> + <menu_item_check label="Erteilte Genehmigungen anzeigen" name="view_permissions"/> + <menu_item_check label="Unterhaltungsprotokoll anzeigen..." name="view_conversation"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/de/menu_people_groups.xml b/indra/newview/skins/default/xui/de/menu_people_groups.xml index 76225ba241..a69c82d3d8 100644 --- a/indra/newview/skins/default/xui/de/menu_people_groups.xml +++ b/indra/newview/skins/default/xui/de/menu_people_groups.xml @@ -2,7 +2,7 @@ <menu name="menu_group_plus"> <menu_item_call label="Info anzeigen" name="View Info"/> <menu_item_call label="Chat" name="Chat"/> - <menu_item_call label="Anrufen" name="Call"/> + <menu_item_call label="Voice-Anruf" name="Call"/> <menu_item_call label="Aktivieren" name="Activate"/> <menu_item_call label="Verlassen" name="Leave"/> </menu> diff --git a/indra/newview/skins/default/xui/de/menu_people_groups_view.xml b/indra/newview/skins/default/xui/de/menu_people_groups_view.xml new file mode 100644 index 0000000000..20386bba56 --- /dev/null +++ b/indra/newview/skins/default/xui/de/menu_people_groups_view.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_group_plus"> + <menu_item_check label="Gruppensymbole anzeigen" name="Display Group Icons"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/de/menu_people_nearby.xml b/indra/newview/skins/default/xui/de/menu_people_nearby.xml index 1db964357f..cdbb3ae917 100644 --- a/indra/newview/skins/default/xui/de/menu_people_nearby.xml +++ b/indra/newview/skins/default/xui/de/menu_people_nearby.xml @@ -1,13 +1,16 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <context_menu name="Avatar Context Menu"> - <menu_item_call label="Profil anzeigen" name="View Profile"/> - <menu_item_call label="Freund hinzufügen" name="Add Friend"/> - <menu_item_call label="Freund entfernen" name="Remove Friend"/> - <menu_item_call label="IM" name="IM"/> - <menu_item_call label="Anrufen" name="Call"/> - <menu_item_call label="Karte" name="Map"/> - <menu_item_call label="Teilen" name="Share"/> - <menu_item_call label="Bezahlen" name="Pay"/> - <menu_item_check label="Ignorieren/Freischalten" name="Block/Unblock"/> - <menu_item_call label="Teleport anbieten" name="teleport"/> + <menu_item_call label="Profil anzeigen" name="view_profile"/> + <menu_item_call label="IM" name="im"/> + <menu_item_call label="Teleport anbieten" name="offer_teleport"/> + <menu_item_call label="Voice-Anruf" name="voice_call"/> + <menu_item_call label="Chatverlauf anzeigen..." name="chat_history"/> + <menu_item_call label="Freund hinzufügen" name="add_friend"/> + <menu_item_call label="Freund entfernen" name="remove_friend"/> + <menu_item_call label="In Gruppe einladen..." name="invite_to_group"/> + <menu_item_call label="Hineinzoomen" name="zoom_in"/> + <menu_item_call label="Karte" name="map"/> + <menu_item_call label="Freigeben" name="share"/> + <menu_item_call label="Bezahlen" name="pay"/> + <menu_item_check label="Ignorieren/Nicht mehr ignorieren" name="block_unblock"/> </context_menu> diff --git a/indra/newview/skins/default/xui/de/menu_people_nearby_multiselect.xml b/indra/newview/skins/default/xui/de/menu_people_nearby_multiselect.xml index b6e99edfe1..ba6578e2d1 100644 --- a/indra/newview/skins/default/xui/de/menu_people_nearby_multiselect.xml +++ b/indra/newview/skins/default/xui/de/menu_people_nearby_multiselect.xml @@ -1,10 +1,10 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <context_menu name="Multi-Selected People Context Menu"> - <menu_item_call label="Freunde hinzufügen" name="Add Friends"/> - <menu_item_call label="Freunde entfernen" name="Remove Friend"/> - <menu_item_call label="IM" name="IM"/> - <menu_item_call label="Anrufen" name="Call"/> - <menu_item_call label="Teilen" name="Share"/> - <menu_item_call label="Bezahlen" name="Pay"/> - <menu_item_call label="Teleport anbieten" name="teleport"/> + <menu_item_call label="Freunde hinzufügen" name="add_friends"/> + <menu_item_call label="Freunde entfernen" name="remove_friends"/> + <menu_item_call label="IM" name="im"/> + <menu_item_call label="Anrufen" name="call"/> + <menu_item_call label="Freigeben" name="share"/> + <menu_item_call label="Bezahlen" name="pay"/> + <menu_item_call label="Teleport anbieten" name="offer_teleport"/> </context_menu> diff --git a/indra/newview/skins/default/xui/de/menu_people_nearby_view.xml b/indra/newview/skins/default/xui/de/menu_people_nearby_view.xml new file mode 100644 index 0000000000..d38ec65037 --- /dev/null +++ b/indra/newview/skins/default/xui/de/menu_people_nearby_view.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_group_plus"> + <menu_item_check label="Nach letzten Sprechern sortieren" name="sort_by_recent_speakers"/> + <menu_item_check label="Nach Namen sortieren" name="sort_name"/> + <menu_item_check label="Nach Nähe sortieren" name="sort_distance"/> + <menu_item_check label="Symbole für Personen anzeigen" name="view_icons"/> + <menu_item_check label="Karte anzeigen" name="view_map"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/de/menu_people_recent_view.xml b/indra/newview/skins/default/xui/de/menu_people_recent_view.xml new file mode 100644 index 0000000000..a116ad0bc1 --- /dev/null +++ b/indra/newview/skins/default/xui/de/menu_people_recent_view.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_group_plus"> + <menu_item_check label="Nach jüngsten sortieren" name="sort_most"/> + <menu_item_check label="Nach Namen sortieren" name="sort_name"/> + <menu_item_check label="Symbole für Personen anzeigen" name="view_icons"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/de/menu_url_agent.xml b/indra/newview/skins/default/xui/de/menu_url_agent.xml index 9a808088fb..c61ebb0eae 100644 --- a/indra/newview/skins/default/xui/de/menu_url_agent.xml +++ b/indra/newview/skins/default/xui/de/menu_url_agent.xml @@ -1,6 +1,8 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <context_menu name="Url Popup"> - <menu_item_call label="Einwohnerprofil anzeigen" name="show_agent"/> + <menu_item_call label="Profil anzeigen" name="show_agent"/> + <menu_item_call label="IM senden..." name="send_im"/> + <menu_item_call label="Freund hinzufügen..." name="add_friend"/> <menu_item_call label="Name in Zwischenablage kopieren" name="url_copy_label"/> <menu_item_call label="SLurl in die Zwischenablage kopieren" name="url_copy"/> </context_menu> diff --git a/indra/newview/skins/default/xui/de/menu_url_objectim.xml b/indra/newview/skins/default/xui/de/menu_url_objectim.xml index 90d3763d9c..77b7004e44 100644 --- a/indra/newview/skins/default/xui/de/menu_url_objectim.xml +++ b/indra/newview/skins/default/xui/de/menu_url_objectim.xml @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <context_menu name="Url Popup"> - <menu_item_call label="Objektinformationen anzeigen" name="show_object"/> + <menu_item_call label="Objektprofil..." name="show_object"/> <menu_item_call label="Auf Karte zeigen" name="show_on_map"/> <menu_item_call label="Zu Objekt-Position teleportieren" name="teleport_to_object"/> <menu_item_call label="Objektname in Zwischenablage kopieren" name="url_copy_label"/> diff --git a/indra/newview/skins/default/xui/de/menu_viewer.xml b/indra/newview/skins/default/xui/de/menu_viewer.xml index 845df1f050..211933a186 100644 --- a/indra/newview/skins/default/xui/de/menu_viewer.xml +++ b/indra/newview/skins/default/xui/de/menu_viewer.xml @@ -16,10 +16,7 @@ <menu_item_call label="Animation meines Avatars stoppen" name="Stop Animating My Avatar"/> <menu_item_call label="Gehen/Rennen/Fliegen..." name="Walk / run / fly"/> </menu> - <menu label="Status" name="Status"> - <menu_item_call label="Abwesend" name="Set Away"/> - <menu_item_call label="Beschäftigt" name="Set Busy"/> - </menu> + <menu label="Status" name="Status"/> <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"> @@ -32,14 +29,18 @@ <menu_item_call label="[APP_NAME] schließen" name="Quit"/> </menu> <menu label="Unterhalten" name="Communicate"> - <menu_item_check label="Chat..." name="Nearby Chat"/> + <menu_item_check label="Unterhaltungen..." name="Conversations"/> + <menu_item_check label="Chat in der Nähe..." name="Nearby Chat"/> <menu_item_check label="Sprechen" name="Speak"/> - <menu_item_check label="Voice-Einstellungen..." name="Nearby Voice"/> - <menu_item_check label="Voice-Morphing..." name="ShowVoice"/> + <menu label="Voice-Morphing" name="VoiceMorphing"> + <menu_item_check label="Kein Voice-Morphing" name="NoVoiceMorphing"/> + <menu_item_check label="Vorschau..." name="Preview"/> + <menu_item_call label="Abonnieren..." name="Subscribe"/> + </menu> <menu_item_check label="Gesten..." name="Gestures"/> - <menu_item_call label="Freunde" name="My Friends"/> - <menu_item_call label="Gruppen" name="My Groups"/> - <menu_item_call label="Leute in der Nähe" name="Active Speakers"/> + <menu_item_check label="Freunde" name="My Friends"/> + <menu_item_check label="Gruppen" name="My Groups"/> + <menu_item_check label="Leute in der Nähe" name="Active Speakers"/> <menu_item_call label="Blockierliste" name="Block List"/> </menu> <menu label="Welt" name="World"> @@ -130,6 +131,7 @@ <menu_item_call label="Linksets..." name="pathfinding_linksets_menu_item"/> <menu_item_call label="Figuren..." name="pathfinding_characters_menu_item"/> <menu_item_call label="Anzeigen/Testen..." name="pathfinding_console_menu_item"/> + <menu_item_call label="Region neu formen" name="pathfinding_rebake_navmesh_item"/> </menu> <menu label="Optionen" name="Options"> <menu_item_check label="Erweiterte Berechtigungen anzeigen" name="DebugPermissions"/> @@ -159,6 +161,13 @@ <menu label="Hilfe" name="Help"> <menu_item_call label="Anweisungen..." name="How To"/> <menu_item_call label="[SECOND_LIFE]-Hilfe" name="Second Life Help"/> + <menu_item_call label="Benutzerhandbuch" name="User’s guide"/> + <menu_item_call label="Knowledge Base" name="Knowledge Base"/> + <menu_item_call label="Wiki" name="Wiki"/> + <menu_item_call label="Community-Foren" name="Community Forums"/> + <menu_item_call label="Support-Portal" name="Support portal"/> + <menu_item_call label="[SECOND_LIFE]-Neuigkeiten" name="Second Life News"/> + <menu_item_call label="[SECOND_LIFE]-Blogs" name="Second Life Blogs"/> <menu_item_call label="Missbrauch melden" name="Report Abuse"/> <menu_item_call label="Fehler melden" name="Report Bug"/> <menu_item_call label="INFO ÃœBER [APP_NAME]" name="About Second Life"/> @@ -307,7 +316,7 @@ <menu_item_call label="Texturinfo für ausgewähltes Objekt" name="Selected Texture Info Basis"/> <menu_item_check label="Wireframe" name="Wireframe"/> <menu_item_check label="Objekt-Objekt Okklusion" name="Object-Object Occlusion"/> - <menu_item_check label="Licht und Schatten" name="Lighting and Shadows"/> + <menu_item_check label="Uber Licht Modell" name="Advanced Lighting Model"/> <menu_item_check label="Schatten von Sonne-/Mond-Projektoren" name="Shadows from Sun/Moon/Projectors"/> <menu_item_check label="SSAO und Schattenglättung" name="SSAO and Shadow Smoothing"/> <menu_item_check label="Fehler in GL beseitigen" name="Debug GL"/> diff --git a/indra/newview/skins/default/xui/de/notifications.xml b/indra/newview/skins/default/xui/de/notifications.xml index 4b7a60b4eb..dc0d7dc6b4 100644 --- a/indra/newview/skins/default/xui/de/notifications.xml +++ b/indra/newview/skins/default/xui/de/notifications.xml @@ -523,6 +523,24 @@ Weitere Informationen finden Sie auf [_URL]. </url> <usetemplate ignoretext="Mein Grafiktreiber ist veraltet" name="okcancelignore" notext="Nein" yestext="Ja"/> </notification> + <notification name="AMDOldDriver"> + 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://support.amd.com/de/Pages/AMDSupportHub.aspx + </url> + <usetemplate ignoretext="Mein Grafiktreiber ist veraltet" name="okcancelignore" notext="Nein" yestext="Ja"/> + </notification> + <notification name="NVIDIAOldDriver"> + 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.nvidia.com/Download/index.aspx?lang=de-de + </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. @@ -1558,10 +1576,13 @@ Diese Gruppe verlassen? Sie können gerade keine Freundschaft anbieten. Warten Sie kurz und versuchen Sie es dann noch einmal. <usetemplate name="okbutton" yestext="OK"/> </notification> - <notification name="BusyModeSet"> - Beschäftigt-Modus ist aktiviert. -Chat und Instant Messages werden ausgeblendet. Instant Messages (Sofortnachrichten) erhalten Ihre Beschäftigt-Antwort. Alle Teleport-Angebote werden abgelehnt. Alle Inventar-Angebote werden in Ihren Papierkorb geschoben. - <usetemplate ignoretext="Ich ändere meinen Status zu Beschäftigt" name="okignore" yestext="OK"/> + <notification name="DoNotDisturbModeSet"> + Nicht-stören-Modus ist aktiviert: Sie erhalten keine Benachrichtigung über eingehende Kommunikation. + +- Andere Einwohner erhalten Ihre Nicht-stören-Antwort (festgelegt in Einstellungen > Allgemein). +- Teleport-Angebote werden abgelehnt. +- Voice-Anrufe werden abgelehnt. + <usetemplate ignoretext="Ich ändere meinen Status zu „Nicht stören“" name="okignore" yestext="OK"/> </notification> <notification name="JoinedTooManyGroupsMember"> Sie haben die maximale Anzahl an Gruppen erreicht. Bitte verlassen Sie eine andere Gruppe, um dieser beitreten zu können oder lehnen Sie das Angebot ab. @@ -2049,6 +2070,10 @@ Inventarobjekt(e) verschieben? Möchten Sie Ihre [http://secondlife.com/account/ Startseite] aufrufen, um Ihre Konto-Statistik anzuzeigen? <usetemplate ignoretext="Meinen Browser starten, um meine Konto-Statistik anzuzeigen" name="okcancelignore" notext="Abbrechen" yestext="Gehe zu Seite"/> </notification> + <notification name="ConfirmAddingChatParticipants"> + Wenn Sie eine Person zu einer vorhandenen Unterhaltung hinzufügen, wird eine neue Unterhaltung erstellt. Alle Teilnehmer erhalten neue Unterhaltungsbenachrichtigungen. + <usetemplate ignoretext="Hinzufügen von Chat-Teilnehmern bestätigen" name="okcancelignore" notext="Abbrechen" yestext="OK"/> + </notification> <notification name="ConfirmQuit"> Wirklich beenden? <usetemplate ignoretext="Bestätigen, bevor Sitzung beendet wird" name="okcancelignore" notext="Nicht beenden" yestext="Beenden"/> @@ -2122,14 +2147,14 @@ Möchten Sie es mit dem ausgewählten Objekt ersetzen? <button ignore="Nie ersetzen" name="No" text="Abbrechen"/> </form> </notification> - <notification label="Beschäftigt-Modus-Warnung" name="BusyModePay"> - Sie sind im Beschäftigt-Modus, sodass Sie im Austausch für diese Zahlung keine Objekte erhalten können. + <notification label="Warnung für Nicht-stören-Modus" name="DoNotDisturbModePay"> + Sie haben den Nicht-stören-Modus aktiviert. Sie erhalten keine Artikel, die im Gegenzug für diese Zahlung angeboten werden. -Möchten Sie den Bechäftigt-Modus verlassen, bevor Sie diese Transaktion abschließen? +Möchten Sie den Nicht-stören-Modus deaktivieren, bevor Sie diese Transaktion abschließen? <form name="form"> - <ignore name="ignore" save_option="true" text="Ich bin im Begriff eine Person oder ein Objekt zu bezahlen, während ich im Modus Beschäftigt bin."/> - <button ignore="Beschäftigt-Modus immer deaktivieren" name="Yes" text="OK"/> - <button ignore="Beschäftigt-Modus aktiviert lassen" name="No" text="Abbrechen"/> + <ignore name="ignore" text="Ich bin im Begriff eine Person oder ein Objekt zu bezahlen, während ich im Nicht-stören-Modus bin."/> + <button ignore="„Nicht stören“-Modus immer verlassen" name="Yes" text="OK"/> + <button ignore="„Nicht stören“-Modus nie verlassen" name="No" text="Abbrechen"/> </form> </notification> <notification name="ConfirmDeleteProtectedCategory"> @@ -2264,11 +2289,8 @@ Von einer Webseite zu diesem Formular linken, um anderen leichten Zugang zu dies <notification name="GroupNotice"> Betreff: [SUBJECT], Nachricht: [MESSAGE] </notification> - <notification name="FriendOnline"> - <nolink>[NAME]</nolink> ist online - </notification> - <notification name="FriendOffline"> - <nolink>[NAME]</nolink> ist offline + <notification name="FriendOnlineOffline"> + <nolink>[NAME]</nolink> ist [STATUS] </notification> <notification name="AddSelfFriend"> Obwohl Sie ein sehr netter Mensch sind, können Sie sich nicht selbst als Freund hinzufügen. @@ -2496,13 +2518,6 @@ Fliegen ist hier nicht möglich. <notification name="DynamicPathfindingDisabled"> Dynamisches Pathfinding ist in dieser Region nicht aktiviert. Geskriptete Objekte, die Pathfinding-LSL-Aufrufe verwenden, funktionieren in dieser Region u. U. nicht wie erwartet. </notification> - <notification name="PathfindingRebakeNavmesh"> - Wenn Sie bestimmte Objekte in dieser Region ändern, verhalten sich andere bewegliche Objekte u. U. inkorrekt. Um dieses Problem zu beheben, klicken Sie auf die Schaltfläche „Region neu formen“. Um weitere Informationen zu erhalten, klicken Sie auf „Hilfe“. - <url name="url"> - http://wiki.secondlife.com/wiki/Pathfinding_Tools_in_the_Second_Life_Viewer - </url> - <usetemplate helptext="Hilfe" ignoretext="Wenn Sie bestimmte Objekte in dieser Region ändern, verhalten sich andere bewegliche Objekte u. U. inkorrekt." name="okhelpignore" yestext="OK"/> - </notification> <notification name="PathfindingCannotRebakeNavmesh"> Fehler aufgetreten. Möglicherweise ist ein Netzwerk- oder Serverproblem aufgetreten oder Sie haben nicht die erforderlichen Baurechte. Dieses Problem lässt sich manchmal durch Ab- und Anmelden lösen. <usetemplate name="okbutton" yestext="OK"/> @@ -2765,7 +2780,7 @@ Ist das OK? <notification name="ScriptQuestionCaution"> Achtung: Das Objekt „<nolink>[OBJECTNAME]</nolink>“ 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. +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="Uneingeschränkten Zugriff gewähren"/> <button name="Deny" text="Verweigern"/> @@ -3346,4 +3361,633 @@ Versuch abgebrochen. Sie sind dabei, [NUM_ITEMS] Objekte zu löschen. Möchten Sie diesen Vorgang wirklich fortsetzen? <usetemplate ignoretext="Möchten Sie wirklich mehrere Objekte löschen?" name="okcancelignore" notext="Nein" yestext="Ja"/> </notification> + <notification name="AvatarFrozen"> + [AV_FREEZER] hat Sie eingefroren. Sie können sich nicht bewegen oder mit der Welt interagieren. + </notification> + <notification name="AvatarFrozenDuration"> + [AV_FREEZER] hat Sie [AV_FREEZE_TIME] Sekunden lang eingefroren. Sie können sich nicht bewegen oder mit der Welt interagieren. + </notification> + <notification name="YouFrozeAvatar"> + Avatar eingefroren. + </notification> + <notification name="AvatarHasUnFrozenYou"> + [AV_FREEZER] hat Sie aufgetaut. + </notification> + <notification name="AvatarUnFrozen"> + Avatar aufgetaut. + </notification> + <notification name="AvatarFreezeFailure"> + Einfrieren fehlgeschlagen, da Sie keine Berechtigung für diese Parzelle haben. + </notification> + <notification name="AvatarFreezeThaw"> + Sie sind nicht mehr eingefroren und können sich frei bewegen. + </notification> + <notification name="AvatarCantFreeze"> + Dieser Benutzer kann nicht eingefroren werden. + </notification> + <notification name="NowOwnObject"> + Sie sind jetzt Eigentümer des Objekts [OBJECT_NAME] + </notification> + <notification name="CantRezOnLand"> + Objekt kann nicht an [OBJECT_POS] gerezzt werden, da der Landeigentümer dies nicht zulässt. Machen Sie den Landeigentümer mit dem Landwerkzeug ausfindig. + </notification> + <notification name="RezFailTooManyRequests"> + Objekt kann nicht gerezzt werden, da zu viele Anforderungen vorliegen. + </notification> + <notification name="SitFailCantMove"> + Sie können sich nicht hinsetzen, da Sie zur Zeit unbeweglich sind. + </notification> + <notification name="SitFailNotAllowedOnLand"> + Sie können sich nicht hinsetzen, da Sie auf diesem Land keine Berechtigung dazu haben. + </notification> + <notification name="SitFailNotSameRegion"> + Kommen Sie näher heran. Sitzen auf Objekt nicht möglich, da +es sich nicht in der gleichen Region befindet wie Sie. + </notification> + <notification name="NoNewObjectRegionFull"> + Neues Objekt kann nicht erstellt werden. Die Region ist voll. + </notification> + <notification name="FailedToPlaceObject"> + Objekt konnte nicht an festgelegtem Ort platziert werden. Versuchen Sie es erneut. + </notification> + <notification name="NoOwnNoGardening"> + Auf Land, das Sie nicht besitzen, können Sie keine Bäume und Gräser erstellen. + </notification> + <notification name="NoCopyPermsNoObject"> + Kopieren fehlgeschlagen, da Sie keine Berechtigung zum Kopieren des Objekts „OBJ_NAME]“ besitzen. + </notification> + <notification name="NoTransPermsNoObject"> + Kopieren fehlgeschlagen, weil Objekt „[OBJ_NAME]“ nicht an Sie übertragen werden kann. + </notification> + <notification name="AddToNavMeshNoCopy"> + Kopieren fehlgeschlagen, weil Objekt „[OBJ_NAME]“ zum Navmesh beiträgt. + </notification> + <notification name="DupeWithNoRootsSelected"> + Ohne ausgewählte Hauptobjekte duplizieren. + </notification> + <notification name="CantDupeCuzRegionIsFull"> + Objekte können nicht dupliziert werden, da die Region voll ist. + </notification> + <notification name="CantDupeCuzParcelNotFound"> + Objekte können nicht dupliziert werden, da die Parzelle, in der sie sich befinden, nicht auffindbar ist. + </notification> + <notification name="CantCreateCuzParcelFull"> + Objekt kann nicht erstellt werden, da +die Parzelle voll ist. + </notification> + <notification name="RezAttemptFailed"> + Versuch zum Rezzen eines Objekts fehlgeschlagen. + </notification> + <notification name="ToxicInvRezAttemptFailed"> + Objekt, das in dieser Region zu Problemen geführt hat, kann nicht erstellt werden. + </notification> + <notification name="InvItemIsBlacklisted"> + Dieses Inventarobjekt ist auf der schwarzen Liste. + </notification> + <notification name="NoCanRezObjects"> + Sie können gegenwärtig keine Objekte erstellen. + </notification> + <notification name="LandSearchBlocked"> + Landsuche blockiert. +Sie haben zu viele Landsuchen in zu kurzer Zeit durchgeführt. +Warten Sie kurz und versuchen Sie es noch einmal. + </notification> + <notification name="NotEnoughResourcesToAttach"> + Nicht genügend Skriptressourcen verfügbar, um Objekt anzuhängen. + </notification> + <notification name="YouDiedAndGotTPHome"> + Sie sind gestorben und wurden nach Hause teleportiert + </notification> + <notification name="EjectComingSoon"> + Sie nicht hier nicht mehr zugelassen und haben [EJECT_TIME] Sekunden Zeit, um zu gehen. + </notification> + <notification name="NoEnterServerFull"> + Sie können diese Region nicht betreten, da +der Server voll ist. + </notification> + <notification name="SaveBackToInvDisabled"> + Erneutes Speichern im Inventar ist deaktiviert. + </notification> + <notification name="NoExistNoSaveToContents"> + „[OBJ_NAME]“ kann nicht im Objektinhalt gespeichert werden, da das Objekt, aus dem es gerezzt wurde, nicht mehr existiert. + </notification> + <notification name="NoModNoSaveToContents"> + „[OBJ_NAME]“ kann nicht in Objektinhalt gespeichert werden, da Sie nicht die Berechtigung zum Modifizieren des Objekts „[DEST_NAME]“ besitzen. + </notification> + <notification name="NoSaveBackToInvDisabled"> + „[OBJ_NAME]“ kann nicht erneut im Inventar gespeichert werden – dieser Vorgang wurde deaktiviert. + </notification> + <notification name="NoCopyNoSelCopy"> + Sie können Ihre Auswahl nicht kopieren, da Sie nicht die Berechtigung zum Kopieren des Objekts „[OBJ_NAME]“ haben. + </notification> + <notification name="NoTransNoSelCopy"> + Sie können Ihre Auswahl nicht kopieren, da das Objekt „[OBJ_NAME]“ nicht übertragbar ist. + </notification> + <notification name="NoTransNoCopy"> + Sie können Ihre Auswahl nicht kopieren, da das Objekt „[OBJ_NAME]“ nicht übertragbar ist. + </notification> + <notification name="NoPermsNoRemoval"> + Entfernen des Objekts „[OBJ_NAME]“ aus dem Simulator wird vom Berechtigungssystem nicht gestattet. + </notification> + <notification name="NoModNoSaveSelection"> + Sie können Ihre Auswahl nicht speichern, da Sie keine Berechtigung zum Modifizieren des Objekts „[OBJ_NAME]“ besitzen. + </notification> + <notification name="NoCopyNoSaveSelection"> + Ihre Auswahl kann nicht gespeichert werden, da das Objekt „[OBJ_NAME]“ nicht kopiert werden kann. + </notification> + <notification name="NoModNoTaking"> + Sie können Ihre Auswahl nicht in Empfang nehmen, da Sie nicht die Berechtigung zum Modifizieren des Objekts „[OBJ_NAME]“ haben. + </notification> + <notification name="RezDestInternalError"> + Interner Fehler: Unbekannter Zielttyp. + </notification> + <notification name="DeleteFailObjNotFound"> + Löschen fehlgeschlagen, da Objekt nicht gefunden wurde + </notification> + <notification name="SorryCantEjectUser"> + Dieser Benutzer kann nicht hinausgeworfen werden. + </notification> + <notification name="RegionSezNotAHome"> + Diese Region gestattet nicht, dass Sie hier Ihr Zuhause festlegen. + </notification> + <notification name="HomeLocationLimits"> + Ihr Zuhause kann sich nur auf Ihrem eigenen Land oder in einem Infohub auf dem Mainland befinden. + </notification> + <notification name="HomePositionSet"> + Position für Zuhause festgelegt. + </notification> + <notification name="AvatarEjected"> + Avatar hinausgeworfen. + </notification> + <notification name="AvatarEjectFailed"> + Hinauswerfen fehlgeschlagen, da Sie keine Admin-Berechtigung für diese Parzelle haben. + </notification> + <notification name="CantMoveObjectParcelFull"> + Objekt „[OBJECT_NAME]“ kann nicht nach +[OBJ_POSITION] in Region [REGION_NAME] verschoben werden, da die Parzelle voll ist. + </notification> + <notification name="CantMoveObjectParcelPerms"> + Objekt „[OBJECT_NAME]“ kann nicht nach +[OBJ_POSITION] in Region [REGION_NAME] verschoben werden, da Ihre Objekte auf dieser Parzelle nicht gestattet sind. + </notification> + <notification name="CantMoveObjectParcelResources"> + Objekt „[OBJECT_NAME]“ kann nicht nach +[OBJ_POSITION] in Region [REGION_NAME] verschoben werden, da nicht genügend Ressourcen für dieses Objekt auf dieser Parzelle vorhanden sind. + </notification> + <notification name="CantMoveObjectRegionVersion"> + Objekt „[OBJECT_NAME]“ kann nicht nach +[OBJ_POSITION] in Region [REGION_NAME] verschoben werden, da die andere Region eine ältere Version verwendet, die das Empfangen dieses Objekts per Regionswechsel nicht unterstützt. + </notification> + <notification name="CantMoveObjectNavMesh"> + Objekt „[OBJECT_NAME]“ kann nicht nach +[OBJ_POSITION] in Region [REGION_NAME] verschoben werden, da Sie das Navmesh nicht regionsübergreifend modifizieren können. + </notification> + <notification name="CantMoveObjectWTF"> + Objekt „[OBJECT_NAME]“ kann nicht nach +[OBJ_POSITION] in Region [REGION_NAME] verschoben werden, da ein unbekannter Fehler vorliegt. ([FAILURE_TYPE]) + </notification> + <notification name="NoPermModifyObject"> + Ihnen fehlt die Berechtigung zum Modifizieren dieses Objekts. + </notification> + <notification name="CantEnablePhysObjContributesToNav"> + Physik kann nicht für ein Objekt aktiviert werden, das zum Navmesh beiträgt. + </notification> + <notification name="CantEnablePhysKeyframedObj"> + Physik für Keyframe-Objekte kann nicht aktiviert werden. + </notification> + <notification name="CantEnablePhysNotEnoughLandResources"> + Physik für Objekte kann nicht aktiviert werden – nicht genügend Landressourcen. + </notification> + <notification name="CantEnablePhysCostTooGreat"> + Physik für Objekt mit Physikressourcenkosten höher als [MAX_OBJECTS] kann nicht aktiviert werden. + </notification> + <notification name="PhantomWithConcavePiece"> + Dieses Objekt kann kein konkaves Teil enthalten, da es ein Phantom ist und zum Navmesh beiträgt. + </notification> + <notification name="UnableAddItem"> + Objekt konnte nicht hinzugefügt werden. + </notification> + <notification name="UnableEditItem"> + Kein Bearbeiten möglich. + </notification> + <notification name="NoPermToEdit"> + Bearbeiten nicht gestattet. + </notification> + <notification name="NoPermToCopyInventory"> + Kopieren dieses Inventars nicht gestattet. + </notification> + <notification name="CantSaveItemDoesntExist"> + Kein Speichern in Objektinhalt möglich: Objekt nicht mehr vorhanden. + </notification> + <notification name="CantSaveItemAlreadyExists"> + Kein Speichern in Objektinhalt möglich: Artikel mit diesem Namen ist bereits im Inventar vorhanden. + </notification> + <notification name="CantSaveModifyAttachment"> + Kein Speichern in Objektinhalt möglich: Dadurch würden die Anhängeberechtigungen geändert. + </notification> + <notification name="TooManyScripts"> + Zu viele Skripts. + </notification> + <notification name="UnableAddScript"> + Skript konnte nicht hinzugefügt werden. + </notification> + <notification name="AssetServerTimeoutObjReturn"> + Asset-Server hat nicht rechtzeitig reagiert. Objekt wurde zum Sim zurückübertragen. + </notification> + <notification name="RegionDisablePhysicsShapes"> + In dieser Region sind keine Physikformen aktiviert. + </notification> + <notification name="NoModNavmeshAcrossRegions"> + Sie können das Navmesh nicht regionsübergreifend modifizieren. + </notification> + <notification name="NoSetPhysicsPropertiesOnObjectType"> + Für diesen Objekttyp können keine Physikeigenschaften gesetzt werden. + </notification> + <notification name="NoSetRootPrimWithNoShape"> + Hauptprim kann nicht auf formlos eingestellt werden. + </notification> + <notification name="NoRegionSupportPhysMats"> + In dieser Region sind keine Physikmaterialien aktiviert. + </notification> + <notification name="OnlyRootPrimPhysMats"> + Nur bei Hauptprims können die Physikmaterialien angepasst werden. + </notification> + <notification name="NoSupportCharacterPhysMats"> + Die Anwendung von Physikmaterialien auf Personen wird noch nicht unterstützt. + </notification> + <notification name="InvalidPhysMatProperty"> + Eine oder mehrere der angegebenen Eigenschaften für Physikmaterialien waren ungültig. + </notification> + <notification name="NoPermsAlterStitchingMeshObj"> + Sie können den Nahttyp eines Mesh-Objekts nicht ändern. + </notification> + <notification name="NoPermsAlterShapeMeshObj"> + Sie können die Form eines Mesh-Objekts nicht ändern. + </notification> + <notification name="FullRegionCantEnter"> + Sie können diese Region nicht betreten, \nda die Region voll ist. + </notification> + <notification name="LinkFailedOwnersDiffer"> + Verknüpfungsfehler – Eigentümer sind unterschiedlich + </notification> + <notification name="LinkFailedNoModNavmeshAcrossRegions"> + Verknüpfungsfehler – Navmesh kann nicht regionsübergreifend modifiziert werden. + </notification> + <notification name="LinkFailedNoPermToEdit"> + Verknüpfungsfehler, da Sie keine Berechtigung zum Bearbeiten haben. + </notification> + <notification name="LinkFailedTooManyPrims"> + Verknüpfungsfehler – zu viele Primitive + </notification> + <notification name="LinkFailedCantLinkNoCopyNoTrans"> + Verknüpfungsfehler – nichtkopierfähige Objekte können nicht mit nichtübertragungsfähigen Objekten verknüpft werden + </notification> + <notification name="LinkFailedNothingLinkable"> + Verknüpfungsfehler – nichts zum Verknüpfen vorhanden. + </notification> + <notification name="LinkFailedTooManyPathfindingChars"> + Verknüpfungsfehler – zu viele Pathfinding-Figuren + </notification> + <notification name="LinkFailedInsufficientLand"> + Verknüpfungsfehler – nicht genügend Landressourcen + </notification> + <notification name="LinkFailedTooMuchPhysics"> + Objekt verwendet zu viele Physikressourcen – seine Dynamik wurde deaktiviert. + </notification> + <notification name="TeleportedHomeByObjectOnParcel"> + Sie wurden vom Objekt „[OBJECT_NAME]“ auf der Parzelle „[PARCEL_NAME]“ nach Hause teleportiert + </notification> + <notification name="TeleportedHomeByObject"> + Sie wurden von Objekt „[OBJECT_NAME]“ nach Hause teleportiert. + </notification> + <notification name="TeleportedByAttachment"> + Sie wurden von einem Anhang an [ITEM_ID] teleportiert + </notification> + <notification name="TeleportedByObjectOnParcel"> + Sie wurden von Objekt „[OBJECT_NAME]“ auf der Parzelle „[PARCEL_NAME]“ teleportiert + </notification> + <notification name="TeleportedByObjectOwnedBy"> + Sie wurden von Objekt „[OBJECT_NAME]“, das [OWNER_ID] gehört, teleportiert + </notification> + <notification name="TeleportedByObjectUnknownUser"> + Sie wurden von Objekt „[OBJECT_NAME]“, das einem unbekannten Benutzer gehört, teleportiert. + </notification> + <notification name="CantCreateObjectRegionFull"> + Angefordertes Objekt kann nicht erstellt werden. Die Region ist voll. + </notification> + <notification name="CantAttackMultipleObjOneSpot"> + Sie können nicht mehrere Objekte an ein und derselben Stelle anhängen. + </notification> + <notification name="CantCreateMultipleObjAtLoc"> + Sie können hier nicht mehrere Objekte erstellen. + </notification> + <notification name="UnableToCreateObjTimeOut"> + Angefordertes Objekt kann nicht erstellt werden. Objekt fehlt in Datenbank. + </notification> + <notification name="UnableToCreateObjUnknown"> + Angefordertes Objekt kann nicht erstellt werden. Zeitüberschreitung bei Anforderung. Versuchen Sie es erneut. + </notification> + <notification name="UnableToCreateObjMissingFromDB"> + Angefordertes Objekt kann nicht erstellt werden. Versuchen Sie es erneut. + </notification> + <notification name="RezFailureTookTooLong"> + Fehler beim Rezzen; Laden des angeforderten Objekts hat zu lang gedauert. + </notification> + <notification name="FailedToPlaceObjAtLoc"> + Objekt konnte nicht an angegebenem Ort platziert werden. Versuchen Sie es erneut. + </notification> + <notification name="CantCreatePlantsOnLand"> + Auf diesem Land können keine Pflanzen erstellt werden. + </notification> + <notification name="CantRestoreObjectNoWorldPos"> + Objekt kann nicht wiederhergestellt werden. Keine Weltposition gefunden. + </notification> + <notification name="CantRezObjectInvalidMeshData"> + Objekt kann nicht gerezzt werden, da seine Meshdaten ungültig sind. + </notification> + <notification name="CantRezObjectTooManyScripts"> + Objekt kann nicht gerezzt werden, da die Region bereits zu viele Skripts aufweist. + </notification> + <notification name="CantCreateObjectNoAccess"> + Ihr Zugangsberechtigungen gestatten nicht das Erstellen von Objekten an dieser Stelle. + </notification> + <notification name="CantCreateObject"> + Sie können gegenwärtig keine Objekte erstellen. + </notification> + <notification name="InvalidObjectParams"> + Ungültige Objektparameter + </notification> + <notification name="CantDuplicateObjectNoAcess"> + Ihre Zugangsberechtigungen gestatten nicht das Duplizieren von Objekten an dieser Stelle. + </notification> + <notification name="CantChangeShape"> + Sie können diese Form nicht ändern. + </notification> + <notification name="NoAccessToClaimObjects"> + Ihr Zugangsberechtigungen gestatten nicht das Beanspruchen von Objekten an dieser Stelle. + </notification> + <notification name="DeedFailedNoPermToDeedForGroup"> + Ãœbertragung fehlgeschlagen, da Sie keine Berechtigung zum Ãœbertragen von Objekten für Ihre Gruppe haben. + </notification> + <notification name="NoPrivsToBuyObject"> + Ihr Zugangsberechtigungen gestatten nicht das Kaufen von Objekten an dieser Stelle. + </notification> + <notification name="CantAttachObjectAvatarSittingOnIt"> + Objekt kann nicht angehängt werden, da ein Avatar darauf sitzt. + </notification> + <notification name="WhyAreYouTryingToWearShrubbery"> + Bäume und Gräser können nicht als Anhänge getragen werden. + </notification> + <notification name="CantAttachGroupOwnedObjs"> + Objekte im Gruppenbesitz können nicht angehängt werden. + </notification> + <notification name="CantAttachObjectsNotOwned"> + Objekte, die Ihnen nicht gehören, können nicht angehängt werden. + </notification> + <notification name="CantAttachNavmeshObjects"> + Objekte, die zum Navmesh beitragen, können nicht angehängt werden. + </notification> + <notification name="CantAttachObjectNoMovePermissions"> + Objekt kann nicht angehängt werden, weil Sie es nicht verschieben dürfen. + </notification> + <notification name="CantAttachNotEnoughScriptResources"> + Nicht genügend Skriptressourcen verfügbar, um Objekt anzuhängen. + </notification> + <notification name="CantDropItemTrialUser"> + Ablegen von Objekten hier nicht möglich; versuchen Sie es mit dem kostenlosen Testbereich. + </notification> + <notification name="CantDropMeshAttachment"> + Sie können keine Mesh-Anhänge ablegen. In Inventar zurückführen und inworld rezzen. + </notification> + <notification name="CantDropAttachmentNoPermission"> + Anhang konnte nicht abgelegt werden: Ihnen fehlt die Berechtigung zum Ablegen an dieser Stelle. + </notification> + <notification name="CantDropAttachmentInsufficientLandResources"> + Anhang konnte nicht abgelegt werden: nicht genügend Landressourcen verfügbar. + </notification> + <notification name="CantDropAttachmentInsufficientResources"> + Anhänge konnten nicht abgelegt werden: nicht genügend Ressourcen. + </notification> + <notification name="CantDropObjectFullParcel"> + Objekt kann nicht hier abgelegt werden. Die Parzelle ist voll. + </notification> + <notification name="CantTouchObjectBannedFromParcel"> + Dieses Objekt kann nicht berührt/angefasst werden, da Sie von der Landparzelle verbannt sind. + </notification> + <notification name="PlzNarrowDeleteParams"> + Grenzen Sie Ihre Löschparameter ein. + </notification> + <notification name="UnableToUploadAsset"> + Asset kann nicht hochgeladen werden. + </notification> + <notification name="CantTeleportCouldNotFindUser"> + Keinen Benutzer zum Teleportieren nach Hause gefunden + </notification> + <notification name="GodlikeRequestFailed"> + Anforderdung nach übernatürlichen Kräften fehlgeschlagen + </notification> + <notification name="GenericRequestFailed"> + generische Anforderdung fehlgeschlagen + </notification> + <notification name="CantUploadPostcard"> + Postkarte kann nicht hochgeladen werden. Versuchen Sie es später erneut. + </notification> + <notification name="CantFetchInventoryForGroupNotice"> + Inventardetails für Gruppenmitteilung kann nicht abgerufen werden. + </notification> + <notification name="CantSendGroupNoticeNotPermitted"> + Gruppenmitteilung kann nicht gesendet werden – Vorgang nicht gestattet. + </notification> + <notification name="CantSendGroupNoticeCantConstructInventory"> + Gruppenmitteilung kann nicht gesendet werden – Bauen von Inventar nicht möglich. + </notification> + <notification name="CantParceInventoryInNotice"> + Inventar in Mitteilung kann nicht geparst werden. + </notification> + <notification name="TerrainUploadFailed"> + Fehler beim Hochladen von Terrain. + </notification> + <notification name="TerrainFileWritten"> + Terraindatei geschrieben. + </notification> + <notification name="TerrainFileWrittenStartingDownload"> + Terraindatei geschrieben, Download beginnt... + </notification> + <notification name="TerrainBaked"> + Terrain geformt. + </notification> + <notification name="TenObjectsDisabledPlzRefresh"> + Nur die ersten 10 ausgewählten Objekte wurden deaktiviert. Aktualisieren Sie die Anzeige und wählen Sie ggf. weitere Objekte aus. + </notification> + <notification name="UpdateViewerBuyParcel"> + Um diese Parzelle zu kaufen, müssen Sie Ihren Viewer aktualisieren. + </notification> + <notification name="CantBuyParcelNotForSale"> + Kein Kauf möglich; die ausgewählte Parzelle steht nicht zum Verkauf. + </notification> + <notification name="CantBuySalePriceOrLandAreaChanged"> + Kein Kauf möglich, da sich der Verkaufspreis oder die Fläche geändert haben. + </notification> + <notification name="CantBuyParcelNotAuthorized"> + Sie sind nicht der autorisierte Käufer dieser Parzelle. + </notification> + <notification name="CantBuyParcelAwaitingPurchaseAuth"> + Sie können diese Parzelle nicht kaufen, da sie bereits auf Kaufauthorisierung wartet. + </notification> + <notification name="CantBuildOverflowParcel"> + Sie können hier keine Objekte bauen, denn dies würde den Rahmen der Parzelle sprengen. + </notification> + <notification name="SelectedMultipleOwnedLand"> + Sie haben Land mit unterschiedlichen Besitzern ausgewählt. Wählen Sie ein kleineres Gebiet aus und versuchen Sie es erneut. + </notification> + <notification name="CantJoinTooFewLeasedParcels"> + Auswahl enthält nicht genügend gemietete Parzellen zum Zusammenlegen. + </notification> + <notification name="CantDivideLandMultipleParcelsSelected"> + Land kann nicht geteilt werden.\nMehr als eine Parzelle ist ausgewählt.\nWählen Sie ein kleineres Stück Land aus. + </notification> + <notification name="CantDivideLandCantFindParcel"> + Land kann nicht geteilt werden.\nParzelle nicht auffindbar.\nMelden Sie das Problem über „Hilfe“ -> „Fehler melden“... + </notification> + <notification name="CantDivideLandWholeParcelSelected"> + Land kann nicht geteilt werden. Die gesamte Parzelle ist ausgewählt.\nWählen Sie ein kleineres Stück Land aus. + </notification> + <notification name="LandHasBeenDivided"> + Land wurde geteilt. + </notification> + <notification name="PassPurchased"> + Sie haben einen Pass gekauft. + </notification> + <notification name="RegionDisallowsClassifieds"> + Region lässt keine Werbung zu. + </notification> + <notification name="LandPassExpireSoon"> + Ihr Pass für dieses Land läuft demnächst ab. + </notification> + <notification name="CantSitNoSuitableSurface"> + Keine geeignete Oberfläche zum Sitzen; probieren Sie es an einer anderen Stelle. + </notification> + <notification name="CantSitNoRoom"> + Kein Platz zum Hinsetzen; probieren Sie es an einer anderen Stelle. + </notification> + <notification name="ClaimObjectFailedNoPermission"> + Objektbeanspruchung fehlgeschlagen, da Sie keine Berechtigung haben. + </notification> + <notification name="ClaimObjectFailedNoMoney"> + Objektbeanspruchung fehlgeschlagen, da Sie nicht genügend L$ haben. + </notification> + <notification name="CantDeedGroupLand"> + Land in Gruppenbesitz kann nicht übertragen werden. + </notification> + <notification name="BuyObjectFailedNoMoney"> + Objektkauf fehlgeschlagen, da Sie nicht genügend L$ haben. + </notification> + <notification name="BuyInventoryFailedNoMoney"> + Inventarkauf fehlgeschlagen, da Sie nicht genügend L$ haben. + </notification> + <notification name="BuyPassFailedNoMoney"> + Sie haben nicht genügend L$, um einen Pass für dieses Land zu kaufen. + </notification> + <notification name="CantBuyPassTryAgain"> + Passkauf momentan nicht möglich. Versuchen Sie es später erneut. + </notification> + <notification name="CantCreateObjectParcelFull"> + Objekt kann nicht erstellt werden, \nda die Parzelle voll ist. + </notification> + <notification name="FailedPlacingObject"> + Objekt konnte nicht an festgelegtem Ort platziert werden. Versuchen Sie es erneut. + </notification> + <notification name="CantCreateLandmarkForEvent"> + Landmarke für dieses Ereignis kann nicht erstellt werden. + </notification> + <notification name="GodBeatsFreeze"> + Ihre übernatürlichen Kräfte heben das Einfrieren auf! + </notification> + <notification name="SpecialPowersRequestFailedLogged"> + Anforderung nach Superpower fehlgeschlagen. Diese Anforderung wurde protokolliert. + </notification> + <notification name="ExpireExplanation"> + Das System kann Ihre Anfrage momentan nicht verarbeiten. Zeitüberschreitung bei Anforderung. + </notification> + <notification name="DieExplanation"> + Das System kann Ihre Anfrage nicht verarbeiten. + </notification> + <notification name="AddPrimitiveFailure"> + Sie haben nicht genügend Geld, um Primitive zu erstellen. + </notification> + <notification name="RezObjectFailure"> + Sie haben nicht genügend Geld, um Objekt zu erstellen. + </notification> + <notification name="ResetHomePositionNotLegal"> + Zuhause-Position neu festlegen, da Zuhause nicht zulässig war. + </notification> + <notification name="CantInviteRegionFull"> + Sie können gegenwärtig niemanden an Ihren Standort einladen, da die Region voll ist. Versuchen Sie es später erneut. + </notification> + <notification name="CantSetHomeAtRegion"> + Diese Region gestattet nicht, dass Sie hier Ihr Zuhause festlegen. + </notification> + <notification name="ListValidHomeLocations"> + Ihr Zuhause kann sich nur auf Ihrem eigenen Land oder in einem Infohub auf dem Mainland befinden. + </notification> + <notification name="SetHomePosition"> + Position für Zuhause festgelegt. + </notification> + <notification name="CantDerezInventoryError"> + Aufgrund eines Inventarfehlers kann das Rezzen dieses Objekts nicht aufgehoben werden. + </notification> + <notification name="CantCreateRequestedInv"> + Angefordertes Inventar kann nicht erstellt werden. + </notification> + <notification name="CantCreateRequestedInvFolder"> + Angeforderter Inventarordner kann nicht erstellt werden. + </notification> + <notification name="CantCreateInventory"> + Dieses Inventar kann nicht erstellt werden. + </notification> + <notification name="CantCreateLandmark"> + Landmarke kann nicht erstellt werden. + </notification> + <notification name="CantCreateOutfit"> + Im Moment kann kein Outfit erstellt werden. Versuchen Sie es gleich noch einmal. + </notification> + <notification name="InventoryNotForSale"> + Inventar steht nicht zum Verkauf. + </notification> + <notification name="CantFindInvItem"> + Inventarobjekt kann nicht gefunden werden. + </notification> + <notification name="CantFindObject"> + Objekt kann nicht gefunden werden. + </notification> + <notification name="CantTransfterMoneyRegionDisabled"> + Geldüberweisungen an Objekte sind in dieser Region gegenwärtig deaktiviert. + </notification> + <notification name="CantPayNoAgent"> + Nicht ersichtlich, wer bezahlt werden muss. + </notification> + <notification name="CantDonateToPublicObjects"> + Sie können öffentlichen Objekten keine L$ geben. + </notification> + <notification name="InventoryCreationInWorldObjectFailed"> + Inventarerstellung für Inworld-Objekt fehlgeschlagen. + </notification> + <notification name="UserBalanceOrLandUsageError"> + Aufgrund eines internen Fehlers konnte Ihr Viewer nicht ordnungsgemäß aktualisiert werden. Der in Ihrem Viewer angezeigte L$-Kontostand oder Parzellenbesitz stimmt möglicherweise nicht mit dem aktuellen Stand auf den Servern überein. + </notification> + <notification name="LargePrimAgentIntersect"> + Große Prims, die sich mit anderen Spielern überschneiden, können nicht erstellt werden. Bitte erneut versuchen, wenn sich die anderen Spieler bewegt haben. + </notification> + <notification name="PreferenceChatClearLog"> + Dadurch werden die Protokolle vorheriger Unterhaltungen und alle Backups dieser Datei gelöscht. + <usetemplate ignoretext="Löschen des Protokolls vorheriger Unterhaltungen bestätigen." name="okcancelignore" notext="Abbrechen" yestext="OK"/> + </notification> + <notification name="PreferenceChatDeleteTranscripts"> + Dadurch werden die Transkripte aller vorherigen Unterhaltungen gelöscht. Die Liste vergangener Unterhaltungen ist davon nicht betroffen. Alle Dateien mit den Suffixen .txt und txt.backup im Order [FOLDER] werden gelöscht. + <usetemplate ignoretext="Um Bestätigung bitten, bevor ich Transkripte lösche." name="okcancelignore" notext="Abbrechen" yestext="OK"/> + </notification> + <notification name="PreferenceChatPathChanged"> + Dateien können nicht verschoben werden. Vorheriger Pfad wurde wiederhergestellt. + <usetemplate ignoretext="Dateien können nicht verschoben werden. Vorheriger Pfad wurde wiederhergestellt." name="okignore" yestext="OK"/> + </notification> </notifications> diff --git a/indra/newview/skins/default/xui/de/panel_avatar_list_item.xml b/indra/newview/skins/default/xui/de/panel_avatar_list_item.xml index dcfcffa6e2..79a2ebe9df 100644 --- a/indra/newview/skins/default/xui/de/panel_avatar_list_item.xml +++ b/indra/newview/skins/default/xui/de/panel_avatar_list_item.xml @@ -27,5 +27,6 @@ <icon name="permission_edit_mine_icon" tool_tip="Dieser Freund kann Ihre Objekte bearbeiten, löschen und an sich nehmen"/> <icon name="permission_map_icon" tool_tip="Dieser Freund kann Sie auf der Karte finden"/> <icon name="permission_online_icon" tool_tip="Dieser Freund kann sehen, wenn Sie online sind"/> + <button name="info_btn" tool_tip="Mehr Infos"/> <button name="profile_btn" tool_tip="Profil anzeigen"/> </panel> diff --git a/indra/newview/skins/default/xui/de/panel_block_list_sidetray.xml b/indra/newview/skins/default/xui/de/panel_block_list_sidetray.xml index 2d140515d4..c105a5b8a3 100644 --- a/indra/newview/skins/default/xui/de/panel_block_list_sidetray.xml +++ b/indra/newview/skins/default/xui/de/panel_block_list_sidetray.xml @@ -1,10 +1,11 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="block_list_panel" width="300"> - <text left_pad="5" name="title_text" width="260"> - Liste der ignorierten Einwohner - </text> - <scroll_list name="blocked" tool_tip="Liste der zur Zeit ignorierten Einwohner" width="290"/> - <button label="Einwohner ignorieren" label_selected="Einwohner ignorieren..." name="Block resident..." tool_tip="Wählen Sie einen Einwohner, um ihn zu ignorieren"/> - <button label="Objekt nach Name ignorieren" label_selected="Objekt nach Name ignorieren..." name="Block object by name..." tool_tip="Ein Objekt auswählen, um nach Namen zu ignorieren."/> - <button label="Freischalten" label_selected="Freischalten" name="Unblock" tool_tip="Einwohner oder Objekt von der Liste der ignorierten Einwohner oder Objekte entfernen"/> + <panel label="bottom_panel" name="blocked_buttons_panel"> + <filter_editor label="Filtern" name="blocked_filter_input"/> + <menu_button name="blocked_gear_btn" tool_tip="Aktionen für ausgewählte(s) Person/Objekt"/> + <menu_button name="view_btn" tool_tip="Sortieroptionen"/> + <menu_button name="plus_btn" tool_tip="Einwohner oder Objekt zum ignorieren auswählen"/> + <button name="unblock_btn" tool_tip="Einwohner oder Objekt aus der Liste der ignorierten Einwohner oder Objekte entfernen"/> + </panel> + <block_list name="blocked" tool_tip="Liste der zur Zeit ignorierten Einwohner" width="290"/> </panel> diff --git a/indra/newview/skins/default/xui/de/panel_conversation_list_item.xml b/indra/newview/skins/default/xui/de/panel_conversation_list_item.xml new file mode 100644 index 0000000000..a9bfe4754e --- /dev/null +++ b/indra/newview/skins/default/xui/de/panel_conversation_list_item.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="conversation_list_item"> + <layout_stack name="conversation_item_stack"> + <layout_panel name="conversation_title_panel"> + <text name="conversation_title" value="(laden)"/> + </layout_panel> + </layout_stack> +</panel> diff --git a/indra/newview/skins/default/xui/de/panel_conversation_log_list_item.xml b/indra/newview/skins/default/xui/de/panel_conversation_log_list_item.xml new file mode 100644 index 0000000000..afeaa14e81 --- /dev/null +++ b/indra/newview/skins/default/xui/de/panel_conversation_log_list_item.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="conversation_log_list_item"> + <icon name="voice_session_icon" tool_tip="Enthielt eine Voice-Unterhaltung"/> + <icon name="unread_ims_icon" tool_tip="Nachrichten trafen ein, während Sie abgemeldet waren"/> + <button name="delete_btn" tool_tip="Diesen Eintrag entfernen"/> +</panel> diff --git a/indra/newview/skins/default/xui/de/panel_group_list_item.xml b/indra/newview/skins/default/xui/de/panel_group_list_item.xml index d097a2b18c..fc911a64df 100644 --- a/indra/newview/skins/default/xui/de/panel_group_list_item.xml +++ b/indra/newview/skins/default/xui/de/panel_group_list_item.xml @@ -1,5 +1,6 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="group_list_item"> <text name="group_name" value="Unbekannt"/> + <button name="info_btn" tool_tip="Mehr Infos"/> <button name="profile_btn" tool_tip="Profil anzeigen"/> </panel> diff --git a/indra/newview/skins/default/xui/de/panel_people.xml b/indra/newview/skins/default/xui/de/panel_people.xml index 4e76147746..8c05ca2c24 100644 --- a/indra/newview/skins/default/xui/de/panel_people.xml +++ b/indra/newview/skins/default/xui/de/panel_people.xml @@ -14,81 +14,53 @@ Sie suchen nach Leuten? Verwenden Sie die [secondlife:///app/worldmap Karte]. <string name="no_filtered_friends_msg"> Sie haben nicht das Richtige gefunden? Versuchen Sie es mit der [secondlife:///app/search/people/[SEARCH_TERM] Suche]. </string> - <string name="people_filter_label" value="Nach Leuten filtern"/> - <string name="groups_filter_label" value="Nach Gruppen filtern"/> <string name="no_filtered_groups_msg" value="Sie haben nicht das Richtige gefunden? Versuchen Sie es mit der [secondlife:///app/search/groups/[SEARCH_TERM] Suche]."/> <string name="no_groups_msg" value="Suchen Sie nach Gruppen? Versuchen Sie es mit der [secondlife:///app/search/groups Suche]."/> <string name="MiniMapToolTipMsg" value="[REGION](Doppelklicken, um Karte zu öffnen; Umschalttaste gedrückt halten und ziehen, um zu schwenken)"/> <string name="AltMiniMapToolTipMsg" value="[REGION](Doppelklicken, um zu teleportieren; Umschalttaste gedrückt halten und ziehen, um zu schwenken)"/> - <filter_editor label="Filter" name="filter_input"/> <tab_container name="tabs"> <panel label="IN DER NÄHE" name="nearby_panel"> - <panel label="bottom_panel" name="bottom_panel"> - <menu_button name="nearby_view_sort_btn" tool_tip="Optionen"/> - <button name="add_friend_btn" tool_tip="Ausgewählten Einwohner zur Freundeliste hinzufügen"/> + <panel label="bottom_panel" name="nearby_buttons_panel"> + <filter_editor label="Nach Personen filtern" name="nearby_filter_input"/> + <button name="gear_btn" tool_tip="Aktionen für ausgewählte Person"/> + <menu_button name="nearby_view_btn" tool_tip="Anzeige-/Sortieroptionen"/> + <button name="add_friend_btn" tool_tip="Einem Einwohner die Freundschaft anbieten"/> + <dnd_button name="nearby_del_btn" tool_tip="Ausgewählte Person als Freund entfernen"/> </panel> </panel> - <panel label="MEINE FREUNDE" name="friends_panel"> + <panel label="FREUNDE" name="friends_panel"> + <panel label="bottom_panel" name="friends_buttons_panel"> + <filter_editor label="Nach Personen filtern" name="friends_filter_input"/> + <button name="gear_btn" tool_tip="Aktionen für ausgewählte Person"/> + <menu_button name="friends_view_btn" tool_tip="Anzeige-/Sortieroptionen"/> + <button name="friends_add_btn" tool_tip="Einem Einwohner die Freundschaft anbieten"/> + <dnd_button name="friends_del_btn" tool_tip="Ausgewählte Person als Freund entfernen"/> + </panel> <accordion name="friends_accordion"> <accordion_tab name="tab_online" title="Online"/> <accordion_tab name="tab_all" title="Alle"/> </accordion> - <panel label="bottom_panel" name="bottom_panel"> - <layout_stack name="bottom_panel"> - <layout_panel name="options_gear_btn_panel"> - <menu_button name="friends_viewsort_btn" tool_tip="Zusätzliche Optionen anzeigen"/> - </layout_panel> - <layout_panel name="add_btn_panel"> - <button name="add_btn" tool_tip="Bieten Sie einem Einwohner die Freundschaft an"/> - </layout_panel> - <layout_panel name="trash_btn_panel"> - <dnd_button name="del_btn" tool_tip="Ausgewählte Person aus Ihrer Freundesliste entfernen"/> - </layout_panel> - </layout_stack> - </panel> </panel> - <panel label="MEINE GRUPPEN" name="groups_panel"> - <panel label="bottom_panel" name="bottom_panel"> - <menu_button name="groups_viewsort_btn" tool_tip="Optionen"/> - <button name="plus_btn" tool_tip="Gruppe beitreten/Neue Gruppe erstellen"/> - <button name="activate_btn" tool_tip="Ausgewählte Gruppe aktivieren"/> + <panel label="GRUPPEN" name="groups_panel"> + <panel label="bottom_panel" name="groups_buttons_panel"> + <filter_editor label="Nach Gruppen filtern" name="groups_filter_input"/> + <menu_button name="groups_gear_btn" tool_tip="Aktionen für ausgewählte Gruppe"/> + <menu_button name="groups_view_btn" tool_tip="Anzeige-/Sortieroptionen"/> + <menu_button name="plus_btn" tool_tip="Gruppe beitreten/Neue Gruppe erstellen"/> + <dnd_button name="minus_btn" tool_tip="Ausgewählte Gruppe verlassen"/> </panel> </panel> <panel label="AKTUELL" name="recent_panel"> - <panel label="bottom_panel" name="bottom_panel"> - <menu_button name="recent_viewsort_btn" tool_tip="Optionen"/> - <button name="add_friend_btn" tool_tip="Ausgewählten Einwohner zur Freundeliste hinzufügen"/> + <panel label="bottom_panel" name="recent_buttons_panel"> + <filter_editor label="Nach Personen filtern" name="recent_filter_input"/> + <button name="gear_btn" tool_tip="Aktionen für ausgewählte Person"/> + <menu_button name="recent_view_btn" tool_tip="Anzeige-/Sortieroptionen"/> + <button name="add_friend_btn" tool_tip="Einem Einwohner die Freundschaft anbieten"/> + <dnd_button name="recent_del_btn" tool_tip="Ausgewählte Person als Freund entfernen"/> </panel> </panel> + <panel label="IGNORIERT" name="blocked_panel"> + <panel label="Ignorierte Einwohner und Objekte" name="panel_block_list_sidetray"/> + </panel> </tab_container> - <panel name="button_bar"> - <layout_stack name="bottom_bar_ls"> - <layout_panel name="view_profile_btn_lp"> - <button label="Profil" name="view_profile_btn" tool_tip="Bilder, Gruppen und andere Einwohner-Informationen anzeigen"/> - </layout_panel> - <layout_panel name="im_btn_lp"> - <button label="IM" name="im_btn" tool_tip="IM-Sitzung öffnen"/> - </layout_panel> - <layout_panel name="call_btn_lp"> - <button label="Anrufen" name="call_btn" tool_tip="Diesen Einwohner anrufen"/> - </layout_panel> - <layout_panel name="share_btn_lp"> - <button label="Freigeben" name="share_btn" tool_tip="Inventarobjekt freigeben"/> - </layout_panel> - <layout_panel name="teleport_btn_lp"> - <button label="Teleportieren" name="teleport_btn" tool_tip="Teleport anbieten"/> - </layout_panel> - </layout_stack> - <layout_stack name="bottom_bar_ls1"> - <layout_panel name="group_info_btn_lp"> - <button label="Gruppenprofil" name="group_info_btn" tool_tip="Gruppeninformationen anzeigen"/> - </layout_panel> - <layout_panel name="chat_btn_lp"> - <button label="Gruppen-Chat" name="chat_btn" tool_tip="Chat öffnen"/> - </layout_panel> - <layout_panel name="group_call_btn_lp"> - <button label="Gruppe anrufen" name="group_call_btn" tool_tip="Diese Gruppe anrufen"/> - </layout_panel> - </layout_stack> - </panel> </panel> diff --git a/indra/newview/skins/default/xui/de/panel_preferences_chat.xml b/indra/newview/skins/default/xui/de/panel_preferences_chat.xml index c9ae350147..8193fd42c1 100644 --- a/indra/newview/skins/default/xui/de/panel_preferences_chat.xml +++ b/indra/newview/skins/default/xui/de/panel_preferences_chat.xml @@ -1,34 +1,86 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel label="Text-Chat" name="chat"> - <text name="font_size"> - Schriftgröße: - </text> - <radio_group name="chat_font_size"> - <radio_item label="Klein" name="radio" value="0"/> - <radio_item label="Mittel" name="radio2" value="1"/> - <radio_item label="Groß" name="radio3" value="2"/> - </radio_group> - <check_box initial_value="true" label="Beim Chatten Tippanimation abspielen" name="play_typing_animation"/> - <check_box label="IMs per Email zuschicken, wenn ich offline bin" name="send_im_to_email"/> - <check_box label="Kompakten IM- und Text-Chatverlauf aktivieren" name="plain_text_chat_history"/> - <check_box label="Blasen-Chat" name="bubble_text_chat"/> - <text name="show_ims_in_label"> - IMs anzeigen in: - </text> - <text name="requires_restart_label"> - (Neustart erforderlich) - </text> - <radio_group name="chat_window" tool_tip="Zeigen Sie Ihre Sofortnachrichten (Instant Messages) in einem anderen Fenster oder in einem einzigen Fenster mit vielen Registerkarten an (Neustart erforderlich)."> - <radio_item label="Getrennte Fenster" name="radio" value="0"/> - <radio_item label="Registerkarten" name="radio2" value="1"/> - </radio_group> - <text name="disable_toast_label"> - Popups für eingehende Chats aktivieren: - </text> - <check_box label="Gruppen-Chats" name="EnableGroupChatPopups" tool_tip="Markieren, um Popups zu sehen, wenn Gruppen-Chat-Message eintrifft"/> - <check_box label="IM-Chats" name="EnableIMChatPopups" tool_tip="Markieren, um Popups zu sehen, wenn Instant Message eintrifft"/> - <spinner label="Lebenszeit von Toasts für Chat in der Nähe:" name="nearby_toasts_lifetime"/> - <spinner label="Ein-/Ausblenddauer von Toasts für Chat in der Nähe:" name="nearby_toasts_fadingtime"/> + <panel> + <check_box initial_value="true" label="Beim Chatten Tippanimation abspielen" name="play_typing_animation"/> + <check_box label="IMs per Email zuschicken, wenn ich offline bin" name="send_im_to_email"/> + <check_box label="Nur IMs und Anrufe von Freunden oder Gruppen durchstellen" name="voice_call_friends_only_check"/> + <text name="font_size"> + Schriftgröße: + </text> + <combo_box name="chat_font_size"> + <item label="Klein" name="Small" value="0"/> + <item label="Mittel" name="Medium" value="1"/> + <item label="Groß" name="Large" value="2"/> + </combo_box> + <check_box label="Blasen-Chat" name="bubble_text_chat"/> + </panel> + <panel> + <text name="notifications"> + Benachrichtigungen + </text> + <text name="friend_ims"> + IMs von Freunden: + </text> + <combo_box name="FriendIMOptions"> + <item label="Unterhaltungsfenster öffnen" name="OpenConversationsWindow" value="openconversations"/> + <item label="Nachricht in Popup anzeigen" name="PopUpMessage" value="toast"/> + <item label="Flash-Symbolleistenschaltfläche" name="FlashToolbarButton" value="flash"/> + <item label="None" name="None" value="none"/> + </combo_box> + <text name="non_friend_ims"> + IMs von anderen: + </text> + <combo_box name="NonFriendIMOptions"> + <item label="Unterhaltungsfenster öffnen" name="OpenConversationsWindow" value="openconversations"/> + <item label="Nachricht in Popup anzeigen" name="PopUpMessage" value="toast"/> + <item label="Flash-Symbolleistenschaltfläche" name="FlashToolbarButton" value="flash"/> + <item label="None" name="None" value="none"/> + </combo_box> + <text name="conference_ims"> + Konferenz-IMs: + </text> + <combo_box name="ConferenceIMOptions"> + <item label="Unterhaltungsfenster öffnen" name="OpenConversationsWindow" value="openconversations"/> + <item label="Nachricht in Popup anzeigen" name="PopUpMessage" value="toast"/> + <item label="Flash-Symbolleistenschaltfläche" name="FlashToolbarButton" value="flash"/> + <item label="None" name="None" value="none"/> + </combo_box> + <text name="group_chat"> + Gruppen-Chat: + </text> + <combo_box name="GroupChatOptions"> + <item label="Unterhaltungsfenster öffnen" name="OpenConversationsWindow" value="openconversations"/> + <item label="Nachricht in Popup anzeigen" name="PopUpMessage" value="toast"/> + <item label="Flash-Symbolleistenschaltfläche" name="FlashToolbarButton" value="flash"/> + <item label="None" name="None" value="none"/> + </combo_box> + <text name="nearby_chat"> + Chat in der Nähe: + </text> + <combo_box name="NearbyChatOptions"> + <item label="Unterhaltungsfenster öffnen" name="OpenConversationsWindow" value="openconversations"/> + <item label="Nachricht in Popup anzeigen" name="PopUpMessage" value="toast"/> + <item label="Flash-Symbolleistenschaltfläche" name="FlashToolBarButton" value="flash"/> + <item label="None" name="None" value="none"/> + </combo_box> + <text name="notifications_alert"> + Um vorübergehend alle Benachrichtigungen zu stoppen, wählen Sie „Unterhalten“ > „Nicht stören“. + </text> + </panel> + <panel> + <text name="play_sound"> + Sound abspielen: + </text> + <check_box label="Neue Unterhaltung" name="new_conversation"/> + <check_box label="Eingehender Anruf..." name="incoming_voice_call"/> + <check_box label="Teleport-Angebot" name="teleport_offer"/> + <check_box label="Inventarangebot" name="inventory_offer"/> + </panel> + <panel> + <button label="Protokoll löschen..." name="clear_log"/> + <button label="Protokolle löschen..." name="delete_transcripts"/> + <button label="Durchsuchen..." label_selected="Durchsuchen" name="log_path_button"/> + </panel> <button label="Ãœbersetzen..." name="ok_btn"/> <button label="Automatisch ersetzen..." name="autoreplace_showgui"/> <button label="Rechtschreibprüfung..." name="spellcheck_showgui"/> diff --git a/indra/newview/skins/default/xui/de/panel_preferences_general.xml b/indra/newview/skins/default/xui/de/panel_preferences_general.xml index 979ccba48d..4e453b6969 100644 --- a/indra/newview/skins/default/xui/de/panel_preferences_general.xml +++ b/indra/newview/skins/default/xui/de/panel_preferences_general.xml @@ -69,9 +69,9 @@ <combo_box.item label="nie" name="item4"/> </combo_box> <text name="text_box3"> - Antwort, wenn im „Beschäftigt“-Modus: + Nicht-stören-Antwort: </text> - <text_editor name="busy_response"> + <text_editor name="do_not_disturb_response"> log_in_to_change </text_editor> </panel> diff --git a/indra/newview/skins/default/xui/de/sidepanel_task_info.xml b/indra/newview/skins/default/xui/de/sidepanel_task_info.xml index 4c8d77d336..29239033fe 100644 --- a/indra/newview/skins/default/xui/de/sidepanel_task_info.xml +++ b/indra/newview/skins/default/xui/de/sidepanel_task_info.xml @@ -72,6 +72,7 @@ <combo_box.item label="Objekt kaufen" name="Buyobject"/> <combo_box.item label="Objekt bezahlen" name="Payobject"/> <combo_box.item label="Öffnen" name="Open"/> + <combo_box.item label="Zoomen" name="Zoom"/> </combo_box> <panel name="perms_inv"> <text name="perm_modify"> diff --git a/indra/newview/skins/default/xui/de/strings.xml b/indra/newview/skins/default/xui/de/strings.xml index 79cb73ecf9..e142cb8029 100644 --- a/indra/newview/skins/default/xui/de/strings.xml +++ b/indra/newview/skins/default/xui/de/strings.xml @@ -137,7 +137,7 @@ Beenden </string> <string name="create_account_url"> - http://join.secondlife.com/index.php?lang=de-DE&sourceid=[sourceid] + http://join.secondlife.com/?sourceid=[sourceid] </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: @@ -622,8 +622,8 @@ Warten Sie kurz und versuchen Sie dann noch einmal, sich anzumelden. <string name="AvatarAway"> Abwesend </string> - <string name="AvatarBusy"> - Beschäftigt + <string name="AvatarDoNotDisturb"> + Nicht stören </string> <string name="AvatarMuted"> Ignoriert @@ -859,6 +859,12 @@ Warten Sie kurz und versuchen Sie dann noch einmal, sich anzumelden. <string name="ST_NO_JOINT"> HAUPTVERZEICHNIS oder VERBINDUNG nicht gefunden. </string> + <string name="NearbyChatTitle"> + Chat in der Nähe + </string> + <string name="NearbyChatLabel"> + (Chat in der Nähe) + </string> <string name="whisper"> flüstert: </string> @@ -922,12 +928,15 @@ 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> + <string name="AgentNameSubst"> + (Sie) + </string> + <string name="TeleportYourAgent"> + Sie teleportieren + </string> <string name="SIM_ACCESS_PG"> Generell </string> @@ -1009,18 +1018,6 @@ Warten Sie kurz und versuchen Sie dann noch einmal, sich anzumelden. <string name="dictionary_files"> Wörterbücher </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> @@ -1989,8 +1986,8 @@ Warten Sie kurz und versuchen Sie dann noch einmal, sich anzumelden. <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 name="DoNotDisturbModeResponseDefault"> + Dieser Einwohner hat den Nicht-stören-Modus aktiviert und wird Ihre Nachricht später sehen. </string> <string name="MuteByName"> (Nach Namen) @@ -2103,9 +2100,6 @@ Warten Sie kurz und versuchen Sie dann noch einmal, sich anzumelden. <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> @@ -3877,7 +3871,7 @@ Falls diese Meldung weiterhin angezeigt wird, wenden Sie sich bitte an [SUPPORT_ Generelle Region </string> <string name="LocationCtrlSeeAVsTooltip"> - Avatare sichtbar; Chat außerhalb dieser Parzelle gestattet + Avatare in dieser Parzelle können von Avataren außerhalb dieser Parzelle weder gesehen noch gehört werden </string> <string name="LocationCtrlPathfindingDirtyTooltip"> Bewegliche Objekte verhalten sich in dieser Region u. U. erst dann korrekt, wenn die Region neu geformt wird. @@ -3954,6 +3948,12 @@ Falls diese Meldung weiterhin angezeigt wird, wenden Sie sich bitte an [SUPPORT_ <string name="IM_unblock_only_groups_friends"> Wenn Sie diese Meldung sehen, müssen Sie unter „Einstellungen“ > „Privatsphäre“ die Option „Nur IMs und Anrufe von Freunden oder Gruppen durchstellen“ deaktivieren. </string> + <string name="OnlineStatus"> + Online + </string> + <string name="OfflineStatus"> + Offline + </string> <string name="answered_call"> Ihr Anruf wurde entgegengenommen </string> @@ -3963,6 +3963,9 @@ Falls diese Meldung weiterhin angezeigt wird, wenden Sie sich bitte an [SUPPORT_ <string name="you_joined_call"> Sie sind dem Gespräch beigetreten </string> + <string name="you_auto_rejected_call-im"> + Sie haben den Voice-Anruf automatisch abgelehnt, während der Nicht-stören-Modus aktiviert war. + </string> <string name="name_started_call"> [NAME] hat einen Voice-Anruf begonnen </string> @@ -3979,7 +3982,7 @@ Falls diese Meldung weiterhin angezeigt wird, wenden Sie sich bitte an [SUPPORT_ Wird verbunden... </string> <string name="conference-title"> - Ad-hoc-Konferenz + Chat mit mehreren Personen </string> <string name="conference-title-incoming"> Konferenz mit [AGENT_NAME] @@ -4859,6 +4862,9 @@ Setzen Sie den Editorpfad in Anführungszeichen <string name="Command_Chat_Label"> Chat </string> + <string name="Command_Conversations_Label"> + Unterhaltungen + </string> <string name="Command_Compass_Label"> Kompass </string> @@ -4934,6 +4940,9 @@ Setzen Sie den Editorpfad in Anführungszeichen <string name="Command_Chat_Tooltip"> Mit Leuten in der Nähe chatten </string> + <string name="Command_Conversations_Tooltip"> + Mit allen unterhalten + </string> <string name="Command_Compass_Tooltip"> Kompass </string> @@ -5063,4 +5072,13 @@ Setzen Sie den Editorpfad in Anführungszeichen <string name="UserDictionary"> [Benutzer] </string> + <string name="logging_calls_disabled_log_empty"> + Unterhaltungen werden nicht protokolliert. Um ein Protokoll zu starten, wählen Sie „Speichern: nur Protokoll“ oder „Speichern: Protokoll und Transkripte“ unter „Einstellungen“ > „Chat“. + </string> + <string name="logging_calls_disabled_log_not_empty"> + Es werden keine Unterhaltungen mehr protokolliert. Um weiterhin ein Protokoll zu führen, wählen Sie „Speichern: nur Protokoll“ oder „Speichern: Protokoll und Transkripte“ unter „Einstellungen“ > „Chat“. + </string> + <string name="logging_calls_enabled_log_empty"> + Keine protokollierten Unterhaltungen verfügbar. Hier erscheint ein Protokolleintrag, wenn Sie eine Person kontaktieren oder von einer Person kontaktiert werden. + </string> </strings> diff --git a/indra/newview/skins/default/xui/en/floater_tools.xml b/indra/newview/skins/default/xui/en/floater_tools.xml index 436e9f8fed..8b9733df17 100644 --- a/indra/newview/skins/default/xui/en/floater_tools.xml +++ b/indra/newview/skins/default/xui/en/floater_tools.xml @@ -2491,534 +2491,10 @@ even though the user gets a free copy. width="132" /> </panel> <panel - border="false" - follows="all" - height="367" label="Texture" - layout="topleft" - left_delta="0" - mouse_opaque="false" help_topic="toolbox_texture_tab" name="Texture" - top_delta="0" - width="295"> - <panel.string - name="string repeats per meter"> - Repeats Per Meter - </panel.string> - <panel.string - name="string repeats per face"> - Repeats Per Face - </panel.string> - <texture_picker - can_apply_immediately="true" - default_image_name="Default" - fallback_image="locked_image.j2c" - follows="left|top" - height="80" - label="Texture" - layout="topleft" - left="10" - name="texture control" - tool_tip="Click to choose a picture" - top="8" - width="64" /> - <color_swatch - can_apply_immediately="true" - follows="left|top" - height="80" - label="Color" - layout="topleft" - left_pad="15" - name="colorswatch" - tool_tip="Click to open color picker" - top_delta="0" - width="64" /> - <text - type="string" - length="1" - follows="left|top" - height="10" - layout="topleft" - left_pad="15" - name="color trans" - text_readonly_color="LabelDisabledColor" - top="6" - width="110"> - Transparency % - </text> - <spinner - decimal_digits="0" - follows="left|top" - height="19" - increment="2" - initial_value="0" - layout="topleft" - left_delta="0" - max_val="100" - name="ColorTrans" - top_pad="4" - width="80" /> - <text - type="string" - length="1" - follows="left|top" - height="10" - layout="topleft" - left_delta="0" - name="glow label" - text_readonly_color="LabelDisabledColor" - top_pad="8" - width="80"> - Glow - </text> - <spinner - decimal_digits="2" - follows="left|top" - height="19" - initial_value="0" - layout="topleft" - left_delta="0" - name="glow" - top_pad="4" - width="80" /> - <check_box - height="19" - label="Full Bright" - layout="topleft" - left_delta="-5" - name="checkbox fullbright" - top_pad="4" - width="81" /> - <text - type="string" - length="1" - follows="left|top" - height="10" - layout="topleft" - left="10" - name="tex gen" - text_readonly_color="LabelDisabledColor" - top_pad="5" - width="90"> - Mapping - </text> - <combo_box - height="23" - layout="topleft" - left_delta="0" - name="combobox texgen" - top_pad="4" - width="90"> - <combo_box.item - label="Default" - name="Default" - value="Default" /> - <combo_box.item - label="Planar" - name="Planar" - value="Planar" /> - </combo_box> - <text - type="string" - length="1" - follows="left|top" - height="10" - layout="topleft" - name="label shininess" - left_pad="4" - text_readonly_color="LabelDisabledColor" - top_pad="-37" - width="90"> - Shininess - </text> - <combo_box - height="23" - layout="topleft" - left_delta="0" - name="combobox shininess" - top_pad="4" - width="90"> - <combo_box.item - label="None" - name="None" - value="None" /> - <combo_box.item - label="Low" - name="Low" - value="Low" /> - <combo_box.item - label="Medium" - name="Medium" - value="Medium" /> - <combo_box.item - label="High" - name="High" - value="High" /> - </combo_box> - <text - type="string" - length="1" - follows="left|top" - height="10" - layout="topleft" - left_pad="4" - name="label bumpiness" - text_readonly_color="LabelDisabledColor" - top_pad="-37" - width="90"> - Bumpiness - </text> - <combo_box - height="23" - layout="topleft" - left_delta="0" - name="combobox bumpiness" - top_pad="4" - width="90"> - <combo_box.item - label="None" - name="None" - value="None" /> - <combo_box.item - label="Brightness" - name="Brightness" - value="Brightness" /> - <combo_box.item - label="Darkness" - name="Darkness" - value="Darkness" /> - <combo_box.item - label="woodgrain" - name="woodgrain" - value="woodgrain" /> - <combo_box.item - label="bark" - name="bark" - value="bark" /> - <combo_box.item - label="bricks" - name="bricks" - value="bricks" /> - <combo_box.item - label="checker" - name="checker" - value="checker" /> - <combo_box.item - label="concrete" - name="concrete" - value="concrete" /> - <combo_box.item - label="crustytile" - name="crustytile" - value="crustytile" /> - <combo_box.item - label="cutstone" - name="cutstone" - value="cutstone" /> - <combo_box.item - label="discs" - name="discs" - value="discs" /> - <combo_box.item - label="gravel" - name="gravel" - value="gravel" /> - <combo_box.item - label="petridish" - name="petridish" - value="petridish" /> - <combo_box.item - label="siding" - name="siding" - value="siding" /> - <combo_box.item - label="stonetile" - name="stonetile" - value="stonetile" /> - <combo_box.item - label="stucco" - name="stucco" - value="stucco" /> - <combo_box.item - label="suction" - name="suction" - value="suction" /> - <combo_box.item - label="weave" - name="weave" - value="weave" /> - </combo_box> - <!-- - <line_editor - bevel_style="in" - border_style="line" - border_thickness="1" - follows="left|top" - height="16" - layout="topleft" - left="10" - max_length_bytes="63" - name="Home Url" - select_on_focus="true" - top="134" - width="250" /> - <check_box - height="16" - label="Media Face" - layout="topleft" - left_delta="0" - name="has media" - top_pad="6" - width="70" /> - <button - follows="left|top" - font="SansSerifSmall" - height="20" - label="Set Media Info" - label_selected="Set Media Info" - layout="topleft" - left_pad="60" - name="media info set" - top_delta="-4" - width="120" /> ---> - <check_box - follows="top|left" - height="16" - initial_value="false" - label="Align planar faces" - layout="topleft" - left="17" - name="checkbox planar align" - tool_tip="Align textures on all selected faces with the last selected face. Requires Planar texture mapping." - top_delta="26" - width="140" /> - <text - type="string" - length="1" - follows="left|top" - height="10" - layout="topleft" - left="10" - name="rpt" - text_readonly_color="LabelDisabledColor" - top_pad="2" - width="140"> - Repeats / Face - </text> - <spinner - follows="left|top" - height="19" - initial_value="0" - label="Horizontal (U)" - label_width="125" - layout="topleft" - left="20" - max_val="100" - name="TexScaleU" - top_pad="5" - width="185" /> - <check_box - height="19" - label="Flip" - layout="topleft" - left_pad="5" - name="checkbox flip s" - top_delta="0" - width="70" /> - <spinner - follows="left|top" - height="19" - initial_value="0" - label="Vertical (V)" - label_width="125" - layout="topleft" - left="20" - max_val="100" - name="TexScaleV" - width="185" /> - <check_box - height="19" - label="Flip" - layout="topleft" - left_pad="5" - name="checkbox flip t" - top_delta="0" - width="70" /> - <spinner - decimal_digits="2" - follows="left|top" - height="19" - increment="1" - initial_value="0" - label="RotationËš" - layout="topleft" - label_width="135" - left="10" - max_val="9999" - min_val="-9999" - name="TexRot" - width="195" /> - - <spinner - decimal_digits="1" - follows="left|top" - height="23" - initial_value="1" - label="Repeats / Meter" - layout="topleft" - label_width="135" - left="10" - max_val="10" - min_val="0.1" - name="rptctrl" - width="195" /> - <button - follows="left|top" - height="23" - label="Apply" - label_selected="Apply" - layout="topleft" - left_pad="5" - name="button apply" - width="75" /> - <text - type="string" - length="1" - follows="left|top" - height="10" - layout="topleft" - left="10" - name="tex offset" - text_readonly_color="LabelDisabledColor" - width="200"> - Texture Offset - </text> - <spinner - follows="left|top" - height="19" - initial_value="0" - label="Horizontal (U)" - label_width="125" - layout="topleft" - left="20" - min_val="-1" - name="TexOffsetU" - width="185" /> - <spinner - follows="left|top" - height="19" - initial_value="0" - label="Vertical (V)" - label_width="125" - layout="topleft" - left_delta="0" - min_val="-1" - name="TexOffsetV" - top_pad="1" - width="185" /> - <panel - border="false" - follows="left|top" - layout="topleft" - mouse_opaque="false" - background_visible="true" - bg_alpha_color="DkGray" - name="Add_Media" - left="0" - height="47" - width="290"> - <text - type="string" - length="1" - follows="left|top" - height="18" - layout="topleft" - left="10" - top_pad="3" - name="media_tex" - width="190"> - Media - </text> - <button - follows="top|left" - height="18" - image_selected="AddItem_Press" - image_unselected="AddItem_Off" - image_disabled="AddItem_Disabled" - layout="topleft" - left_pad="0" - name="add_media" - tab_stop="false" - top_delta="0" - tool_tip="Add Media" - width="18"> - <button.commit_callback - function="BuildTool.AddMedia"/> - </button> - <button - follows="top|left" - height="18" - image_selected="TrashItem_Press" - image_unselected="TrashItem_Off" - layout="topleft" - left_pad="5" - name="delete_media" - tool_tip="Delete this media texture" - top_delta="0" - width="18"> - <button.commit_callback - function="BuildTool.DeleteMedia"/> - </button> - <button - follows="top|left" - tool_tip="Edit this Media" - height="12" - image_disabled="Icon_Gear_Background" - image_selected="Icon_Gear_Press" - image_unselected="Icon_Gear_Foreground" - layout="topleft" - left_pad="10" - name="edit_media" - top_delta="3" - width="12"> - <button.commit_callback - function="BuildTool.EditMedia"/> - </button> - <text - follows="left|top|right" - height="9" - layout="topleft" - left="10" - use_ellipses="true" - read_only="true" - name="media_info" - width="180" /> - <web_browser - visible="false" - enabled="false" - border_visible="true" - bottom_delta="0" - follows="top|left" - left="0" - name="title_media" - width="4" - height="4" - start_url="about:blank" - decouple_texture_size="true" /> - <button - follows="right|top" - height="22" - label="Align" - label_selected="Align Media" - layout="topleft" - right="-16" - name="button align" - top_delta="-4" - tool_tip="Align media texture (must load first)" - width="80" /> - </panel> + filename="panel_tools_texture.xml"> </panel> <panel border="false" diff --git a/indra/newview/skins/default/xui/en/menu_viewer.xml b/indra/newview/skins/default/xui/en/menu_viewer.xml index a11cd13fdb..500c11da74 100644 --- a/indra/newview/skins/default/xui/en/menu_viewer.xml +++ b/indra/newview/skins/default/xui/en/menu_viewer.xml @@ -2363,6 +2363,12 @@ <menu_item_check.on_click function="Advanced.ToggleFrameTest" /> </menu_item_check> + <menu_item_call + label="Frame Profile" + name="Frame Profile"> + <menu_item_call.on_click + function="Advanced.ClickRenderProfile" /> + </menu_item_call> </menu> <menu create_jump_keys="true" @@ -2658,6 +2664,12 @@ <menu_item_call.on_click function="Advanced.SelectedTextureInfo" /> </menu_item_call> + <menu_item_call + label="Selected Material Info" + name="Selected Material Info"> + <menu_item_call.on_click + function="Advanced.SelectedMaterialInfo" /> + </menu_item_call> <menu_item_check label="Wireframe" name="Wireframe" @@ -2684,8 +2696,8 @@ <menu_item_separator /> <menu_item_check - label="Lighting and Shadows" - name="Lighting and Shadows"> + label="Advanced Lighting Model" + name="Advanced Lighting Model"> <menu_item_check.on_check function="CheckControl" parameter="RenderDeferred" /> @@ -2792,16 +2804,6 @@ parameter="TextureLoadFullRes" /> </menu_item_check> <menu_item_check - label="Texture Atlas (experimental)" - name="Texture Atlas"> - <menu_item_check.on_check - function="CheckControl" - parameter="EnableTextureAtlas" /> - <menu_item_check.on_click - function="ToggleControl" - parameter="EnableTextureAtlas" /> - </menu_item_check> - <menu_item_check label="Render Attached Lights" name="Render Attached Lights"> <menu_item_check.on_check diff --git a/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml b/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml index cd243d40a4..d7db7caf66 100644 --- a/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml @@ -211,16 +211,19 @@ name="TransparentWater" top_pad="7" width="256" /> - <check_box - control_name="RenderObjectBump" - height="16" - initial_value="true" - label="Bump mapping and shiny" - layout="topleft" - left_delta="0" - name="BumpShiny" - top_pad="1" - width="256" /> + <check_box + control_name="RenderObjectBump" + height="16" + initial_value="true" + label="Bump mapping and shiny" + layout="topleft" + left_delta="0" + name="BumpShiny" + top_pad="1" + width="256"> + <check_box.commit_callback + function="Pref.VertexShaderEnable" /> + </check_box> <check_box control_name="RenderLocalLights" height="16" @@ -262,7 +265,7 @@ control_name="RenderDeferred" height="16" initial_value="true" - label="Lighting and Shadows" + label="Advanced Lighting Model" layout="topleft" left_delta="0" name="UseLightShaders" diff --git a/indra/newview/skins/default/xui/en/panel_tools_texture.xml b/indra/newview/skins/default/xui/en/panel_tools_texture.xml new file mode 100644 index 0000000000..a5425062ec --- /dev/null +++ b/indra/newview/skins/default/xui/en/panel_tools_texture.xml @@ -0,0 +1,760 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<panel + border="false" + follows="all" + height="420" + label="Texture" + layout="topleft" + left="0" + mouse_opaque="false" + help_topic="toolbox_texture_tab" + name="Texture" + top="0" + width="295"> + <panel.string + name="string repeats per meter"> + Repeats Per Meter + </panel.string> + <panel.string + name="string repeats per face"> + Repeats Per Face + </panel.string> + <text + type="string" + length="1" + follows="left|top" + height="10" + layout="topleft" + left="10" + name="color label" + text_readonly_color="LabelDisabledColor" + top="6" + width="64"> + Color + </text> + <!-- label is blank because control places it below the box --> + <color_swatch + can_apply_immediately="true" + follows="left|top" + height="45" + label="" + layout="topleft" + left="10" + name="colorswatch" + tool_tip="Click to open color picker" + top="20" + width="64" /> + <text + type="string" + length="1" + follows="left|top" + height="10" + layout="topleft" + left_pad="15" + name="color trans" + text_readonly_color="LabelDisabledColor" + top="6" + width="110"> + Transparency % + </text> + <spinner + decimal_digits="0" + follows="left|top" + height="19" + increment="2" + initial_value="0" + layout="topleft" + left_delta="0" + max_val="100" + name="ColorTrans" + top_pad="4" + width="80" /> + <text + type="string" + length="1" + follows="left|top" + height="10" + layout="topleft" + left_pad="15" + name="glow label" + text_readonly_color="LabelDisabledColor" + top="6" + width="80"> + Glow + </text> + <spinner + decimal_digits="2" + follows="left|top" + height="19" + initial_value="0" + layout="topleft" + left_delta="0" + name="glow" + top_pad="4" + width="80" /> + <check_box + height="19" + label="Full Bright" + layout="topleft" + left="7" + name="checkbox fullbright" + top_pad="4" + width="81" /> + <combo_box + height="23" + layout="topleft" + left="10" + name="combobox matmedia" + top_pad="5" + width="100"> + <combo_box.item + label="Materials" + name="Materials" + value="Materials" /> + <combo_box.item + label="Media" + name="Media" + value="Media" /> + </combo_box> + <combo_box + height="23" + layout="topleft" + left_pad="10" + name="combobox mattype" + top_delta="0" + width="155"> + <combo_box.item + label="Texture (diffuse)" + name="Texture (diffuse)" + value="Texture (diffuse)" /> + <combo_box.item + label="Bumpiness (normal)" + name="Bumpiness (normal)" + value="Bumpiness (normal)" /> + <combo_box.item + label="Shininess (specular)" + name="Shininess (specular)" + value="Shininess (specular)" /> + </combo_box> + <texture_picker + can_apply_immediately="true" + default_image_name="Default" + fallback_image="materials_ui_x_24.png" + follows="left|top" + height="80" + label="Texture " + layout="topleft" + left="10" + name="texture control" + tool_tip="Click to choose a picture" + top_pad="8" + width="64" /> + <text + type="string" + length="1" + follows="left|top" + height="10" + layout="topleft" + left_pad="10" + name="label alphamode" + text_readonly_color="LabelDisabledColor" + top_delta="0" + width="90"> + Alpha mode + </text> + <combo_box + height="23" + layout="topleft" + left_delta="0" + name="combobox alphamode" + top_pad="4" + width="120"> + <combo_box.item + label="None" + name="None" + value="None" /> + <combo_box.item + label="Alpha blending" + name="Alpha blending" + value="Alpha blending" /> + <combo_box.item + label="Alpha masking" + name="Alpha masking" + value="Alpha masking" /> + <combo_box.item + label="Emissive mask" + name="Emissive mask" + value="Emissive mask" /> + </combo_box> + <text + type="string" + length="1" + follows="left|top" + height="10" + layout="topleft" + left_delta="0" + name="label maskcutoff" + text_readonly_color="LabelDisabledColor" + top_pad="4" + width="90"> + Mask cutoff + </text> + <spinner + decimal_digits="0" + min_val="0" + max_val="255" + follows="left|top" + height="19" + initial_value="55" + layout="topleft" + top_pad="4" + left_delta="0" + increment="1" + name="maskcutoff" + width="80" /> + <texture_picker + allow_no_texture="true" + can_apply_immediately="true" + default_image_name="Default" + fallback_image="materials_ui_x_24.png" + follows="left|top" + height="80" + label="Texture " + layout="topleft" + left="10" + name="bumpytexture control" + tool_tip="Click to choose a picture" + top_delta="-55" + width="64" /> + <text + type="string" + length="1" + follows="left|top" + height="10" + layout="topleft" + left_pad="10" + name="label bumpiness" + text_readonly_color="LabelDisabledColor" + top_delta="0" + width="90"> + Bumpiness + </text> + <combo_box + height="23" + layout="topleft" + left_delta="0" + name="combobox bumpiness" + top_pad="4" + width="90"> + <combo_box.item + label="None" + name="None" + value="None" /> + <combo_box.item + label="Brightness" + name="Brightness" + value="Brightness" /> + <combo_box.item + label="Darkness" + name="Darkness" + value="Darkness" /> + <combo_box.item + label="woodgrain" + name="woodgrain" + value="woodgrain" /> + <combo_box.item + label="bark" + name="bark" + value="bark" /> + <combo_box.item + label="bricks" + name="bricks" + value="bricks" /> + <combo_box.item + label="checker" + name="checker" + value="checker" /> + <combo_box.item + label="concrete" + name="concrete" + value="concrete" /> + <combo_box.item + label="crustytile" + name="crustytile" + value="crustytile" /> + <combo_box.item + label="cutstone" + name="cutstone" + value="cutstone" /> + <combo_box.item + label="discs" + name="discs" + value="discs" /> + <combo_box.item + label="gravel" + name="gravel" + value="gravel" /> + <combo_box.item + label="petridish" + name="petridish" + value="petridish" /> + <combo_box.item + label="siding" + name="siding" + value="siding" /> + <combo_box.item + label="stonetile" + name="stonetile" + value="stonetile" /> + <combo_box.item + label="stucco" + name="stucco" + value="stucco" /> + <combo_box.item + label="suction" + name="suction" + value="suction" /> + <combo_box.item + label="weave" + name="weave" + value="weave" /> + <combo_box.item + label="Use texture" + name="Use texture" + value="Use texture" /> + </combo_box> + <texture_picker + allow_no_texture="true" + can_apply_immediately="true" + default_image_name="Default" + fallback_image="materials_ui_x_24.png" + follows="left|top" + height="80" + label="Texture " + layout="topleft" + left="10" + name="shinytexture control" + tool_tip="Click to choose a picture" + top_delta="-14" + width="64" /> + <text + type="string" + length="1" + follows="left|top" + height="10" + layout="topleft" + name="label shininess" + left_pad="10" + text_readonly_color="LabelDisabledColor" + top_delta="6" + width="90"> + Shininess + </text> + <combo_box + height="23" + layout="topleft" + left_pad="10" + name="combobox shininess" + top_delta="-6" + width="90"> + <combo_box.item + label="None" + name="None" + value="None" /> + <combo_box.item + label="Low" + name="Low" + value="Low" /> + <combo_box.item + label="Medium" + name="Medium" + value="Medium" /> + <combo_box.item + label="High" + name="High" + value="High" /> + <combo_box.item + label="Use texture" + name="Use texture" + value="Use texture" /> + </combo_box> + <text + type="string" + length="1" + follows="left|top" + height="10" + layout="topleft" + left_delta="-100" + name="label glossiness" + text_readonly_color="LabelDisabledColor" + top_pad="8" + width="116"> + Glossiness + </text> + <spinner + decimal_digits="0" + min_val="0" + max_val="255" + follows="left|top" + height="19" + initial_value="51" + increment="1" + layout="topleft" + top_delta="-4" + left_pad="10" + name="glossiness" + width="64" /> + <text + type="string" + length="1" + follows="left|top" + height="10" + layout="topleft" + left_delta="-126" + name="label environment" + text_readonly_color="LabelDisabledColor" + top_pad="8" + width="116"> + Environment + </text> + <spinner + decimal_digits="0" + min_val="0" + max_val="255" + increment="1" + follows="left|top" + height="19" + initial_value="0" + layout="topleft" + top_delta="-4" + left_pad="10" + name="environment" + width="64" /> + <text + type="string" + length="1" + follows="left|top" + height="10" + layout="topleft" + left_delta="-126" + name="label shinycolor" + text_readonly_color="LabelDisabledColor" + top_pad="8" + width="116"> + Color + </text> + <!-- label is blank because control places it below the box --> + <color_swatch + can_apply_immediately="true" + follows="left|top" + height="45" + label="" + layout="topleft" + left_pad="10" + name="shinycolorswatch" + tool_tip="Click to open color picker" + top_delta="-4" + width="64" /> + <text + follows="left|top|right" + height="9" + layout="topleft" + left="10" + top_delta="-50" + use_ellipses="true" + read_only="true" + name="media_info" + width="280"> + URL of chosen media, if any, goes here + </text> + <button + follows="top|left" + height="18" + layout="topleft" + left="10" + name="add_media" + top_pad="4" + tool_tip="Add Media" + label="Choose..." + width="85"> + <button.commit_callback + function="BuildTool.AddMedia"/> + </button> + <button + follows="top|left" + height="18" + layout="topleft" + left_pad="5" + name="delete_media" + tool_tip="Delete this media texture" + top_delta="0" + label="Remove" + width="85"> + <button.commit_callback + function="BuildTool.DeleteMedia"/> + </button> + <button + follows="left|top" + height="18" + label="Align" + label_selected="Align Media" + layout="topleft" + left_pad="5" + name="button align" + top_delta="0" + tool_tip="Align media texture (must load first)" + width="85" /> + <text + type="string" + length="1" + follows="left|top" + height="10" + layout="topleft" + left="10" + name="tex gen" + text_readonly_color="LabelDisabledColor" + top_pad="60" + width="140"> + Mapping + </text> + <combo_box + height="23" + layout="topleft" + left_pad="0" + name="combobox texgen" + top_pad="-13" + width="125"> + <combo_box.item + label="Default" + name="Default" + value="Default" /> + <combo_box.item + label="Planar" + name="Planar" + value="Planar" /> + </combo_box> + <spinner + follows="left|top" + height="19" + initial_value="0" + label="Horizontal scale" + label_width="205" + layout="topleft" + left="10" + min_val="-100" + max_val="100" + name="TexScaleU" + top_pad="5" + width="265" /> + <spinner + follows="left|top" + height="19" + initial_value="0" + label="Vertical scale" + label_width="205" + layout="topleft" + left="10" + min_val="-100" + max_val="100" + name="TexScaleV" + width="265" /> + <spinner + decimal_digits="1" + follows="left|top" + height="19" + initial_value="" + label="Repeats per meter" + layout="topleft" + label_width="205" + left="10" + max_val="10" + min_val="0.1" + name="rptctrl" + width="265" /> + <spinner + decimal_digits="2" + follows="left|top" + height="19" + increment="1" + initial_value="0" + label="Rotation degrees" + layout="topleft" + label_width="205" + left="10" + max_val="9999" + min_val="-9999" + name="TexRot" + width="265" /> + + <spinner + follows="left|top" + height="19" + initial_value="0" + label="Horizontal offset" + label_width="205" + layout="topleft" + left="10" + min_val="-1" + name="TexOffsetU" + width="265" /> + <spinner + follows="left|top" + height="19" + initial_value="0" + label="Vertical offset" + label_width="205" + layout="topleft" + left="10" + min_val="-1" + name="TexOffsetV" + width="265" /> + <spinner + follows="left|top" + height="19" + initial_value="0" + label="Horizontal scale" + label_width="205" + layout="topleft" + left="10" + min_val="-100" + max_val="100" + name="bumpyScaleU" + top_delta="-115" + width="265" /> + <spinner + follows="left|top" + height="19" + initial_value="0" + label="Vertical scale" + label_width="205" + layout="topleft" + left="10" + min_val="-100" + max_val="100" + name="bumpyScaleV" + width="265" /> + <spinner + decimal_digits="2" + follows="left|top" + height="19" + top_pad="27" + increment="1" + initial_value="0" + label="Rotation degrees" + layout="topleft" + label_width="205" + left="10" + max_val="180" + min_val="-180" + name="bumpyRot" + width="265" /> + + <spinner + follows="left|top" + height="19" + initial_value="0" + label="Horizontal offset" + label_width="205" + layout="topleft" + left="10" + min_val="-1" + name="bumpyOffsetU" + width="265" /> + <spinner + follows="left|top" + height="19" + initial_value="0" + label="Vertical offset" + label_width="205" + layout="topleft" + left="10" + min_val="-1" + name="bumpyOffsetV" + width="265" /> + <spinner + follows="left|top" + height="19" + initial_value="0" + label="Horizontal scale" + label_width="205" + layout="topleft" + left="10" + min_val="-100" + max_val="100" + name="shinyScaleU" + top_delta="-115" + width="265" /> + <spinner + follows="left|top" + height="19" + initial_value="0" + label="Vertical scale" + label_width="205" + layout="topleft" + left="10" + min_val="-100" + max_val="100" + name="shinyScaleV" + width="265" /> + <spinner + decimal_digits="2" + follows="left|top" + height="19" + top_pad="27" + increment="1" + initial_value="0" + label="Rotation degrees" + layout="topleft" + label_width="205" + left="10" + max_val="180" + min_val="-180" + name="shinyRot" + width="265" /> + + <spinner + follows="left|top" + height="19" + initial_value="0" + label="Horizontal offset" + label_width="205" + layout="topleft" + left="10" + min_val="-1" + name="shinyOffsetU" + width="265" /> + <spinner + follows="left|top" + height="19" + initial_value="0" + label="Vertical offset" + label_width="205" + layout="topleft" + left="10" + min_val="-1" + name="shinyOffsetV" + width="265" /> + <check_box + follows="top|left" + height="16" + initial_value="false" + label="Align planar faces" + layout="topleft" + left="7" + name="checkbox planar align" + tool_tip="Align textures on all selected faces with the last selected face. Requires Planar texture mapping." + top_delta="16" + width="260" /> + <web_browser + visible="false" + enabled="false" + border_visible="true" + bottom_delta="0" + follows="top|left" + left="0" + name="title_media" + width="4" + height="4" + start_url="about:blank" + decouple_texture_size="true" /> + </panel> diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml index 7c08aef65e..b6fd14e033 100644 --- a/indra/newview/skins/default/xui/en/strings.xml +++ b/indra/newview/skins/default/xui/en/strings.xml @@ -372,6 +372,8 @@ Please try logging in again in a minute.</string> <!-- build floater --> <string name="multiple_textures">Multiple</string> +<string name="use_texture">Use texture</string> + <!-- world map --> <string name="texture_loading">Loading...</string> <string name="worldmap_offline">Offline</string> diff --git a/indra/newview/skins/default/xui/es/floater_conversation_log.xml b/indra/newview/skins/default/xui/es/floater_conversation_log.xml new file mode 100644 index 0000000000..9202fab92d --- /dev/null +++ b/indra/newview/skins/default/xui/es/floater_conversation_log.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="floater_conversation_log" title="REGISTRO DE CONVERSACIONES"> + <panel name="buttons_panel"> + <filter_editor label="Filtrar la gente" name="people_filter_input"/> + <menu_button name="conversation_view_btn" tool_tip="Opciones de vista/orden"/> + <menu_button name="conversations_gear_btn" tool_tip="Acciones en la persona o el grupo seleccionado"/> + </panel> +</floater> diff --git a/indra/newview/skins/default/xui/es/floater_conversation_preview.xml b/indra/newview/skins/default/xui/es/floater_conversation_preview.xml new file mode 100644 index 0000000000..f579e720fb --- /dev/null +++ b/indra/newview/skins/default/xui/es/floater_conversation_preview.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="preview_conversation" title="CONVERSACIÓN:"> + <floater.string name="Title"> + CONVERSACIÓN: [NAME] + </floater.string> + <text name="page_label" value="Página"/> +</floater> diff --git a/indra/newview/skins/default/xui/es/floater_im_container.xml b/indra/newview/skins/default/xui/es/floater_im_container.xml index 1cd752e6ec..f772441141 100644 --- a/indra/newview/skins/default/xui/es/floater_im_container.xml +++ b/indra/newview/skins/default/xui/es/floater_im_container.xml @@ -1,2 +1,29 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<multi_floater name="floater_im_box" title="CONVERSACIONES"/> +<multi_floater name="floater_im_box" title="CONVERSACIONES"> + <string name="collapse_icon" value="Conv_toolbar_collapse"/> + <string name="expand_icon" value="Conv_toolbar_expand"/> + <layout_stack name="conversations_stack"> + <layout_panel name="conversations_layout_panel"> + <layout_stack name="conversations_pane_buttons_stack"> + <layout_panel name="conversations_pane_buttons_expanded"> + <menu_button name="sort_btn" tool_tip="Opciones de vista/orden"/> + <button name="add_btn" tool_tip="Iniciar una conversación nueva"/> + <button name="speak_btn" tool_tip="Utiliza el micrófono para hablar con las personas"/> + </layout_panel> + <layout_panel name="conversations_pane_buttons_collapsed"> + <button name="expand_collapse_btn" tool_tip="Cerrar/expandir esta lista"/> + </layout_panel> + </layout_stack> + </layout_panel> + <layout_panel name="messages_layout_panel"> + <panel_container name="im_box_tab_container"> + <panel name="stub_panel"> + <button name="stub_collapse_btn" tool_tip="Cerrar este panel"/> + <text name="stub_textbox"> + Esta conversación está en una ventana aparte. [secondlife:/// Traerla de vuelta.] + </text> + </panel> + </panel_container> + </layout_panel> + </layout_stack> +</multi_floater> diff --git a/indra/newview/skins/default/xui/es/floater_im_session.xml b/indra/newview/skins/default/xui/es/floater_im_session.xml index 3d9d17fc81..5f38fbd615 100644 --- a/indra/newview/skins/default/xui/es/floater_im_session.xml +++ b/indra/newview/skins/default/xui/es/floater_im_session.xml @@ -1,8 +1,59 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="panel_im"> - <layout_stack name="im_panels"> - <layout_panel> - <line_editor label="A" name="chat_editor"/> - </layout_panel> - </layout_stack> + <floater.string name="call_btn_start"> + Conv_toolbar_open_call + </floater.string> + <floater.string name="call_btn_stop"> + Conv_toolbar_hang_up + </floater.string> + <floater.string name="collapseline_icon" value="Conv_collapse_to_one_line"/> + <floater.string name="expandline_icon" value="Conv_expand_one_line"/> + <floater.string name="collapse_icon" value="Conv_toolbar_collapse"/> + <floater.string name="expand_icon" value="Conv_toolbar_expand"/> + <floater.string name="tear_off_icon" value="Conv_toolbar_arrow_ne"/> + <floater.string name="return_icon" value="Conv_toolbar_arrow_sw"/> + <floater.string name="participant_added" value="[NAME] ha sido invitado a la conversación."/> + <floater.string name="multiple_participants_added" value="[NAME] han sido invitados a la conversación."/> + <floater.string name="tooltip_to_separate_window" value="Mover esta conversación a otra ventana"/> + <floater.string name="tooltip_to_main_window" value="Volver a poner esta conversación en la ventana principal"/> + <floater.string name="start_call_button_tooltip" value="Abrir conexión de voz"/> + <floater.string name="end_call_button_tooltip" value="Cerrar la conexión de voz"/> + <floater.string name="expcol_button_not_tearoff_tooltip" value="Cerrar este panel"/> + <floater.string name="expcol_button_tearoff_and_expanded_tooltip" value="Cerrar la lista de participantes"/> + <floater.string name="expcol_button_tearoff_and_collapsed_tooltip" value="Expandir la lista de participantes"/> + <view name="contents_view"> + <layout_stack name="main_stack"> + <layout_panel name="toolbar_panel"> + <menu_button name="view_options_btn" tool_tip="Opciones de vista/orden"/> + <menu_button name="gear_btn" tool_tip="Acciones en la persona seleccionada"/> + <button name="add_btn" tool_tip="Añadir alguien a esta conversación"/> + <button name="voice_call_btn" tool_tip="Abrir conexión de voz"/> + <button name="close_btn" tool_tip="Finalizar esta conversación"/> + <button name="expand_collapse_btn" tool_tip="Cerrar/expandir este panel"/> + </layout_panel> + <layout_panel name="body_panel"> + <layout_stack name="im_panels"> + <layout_panel name="right_part_holder"> + <panel name="trnsAndChat_panel"> + <layout_stack name="translate_and_chat_stack"> + <layout_panel name="translate_chat_checkbox_lp"> + <check_box label="Traducir el chat" name="translate_chat_checkbox"/> + </layout_panel> + </layout_stack> + </panel> + </layout_panel> + </layout_stack> + </layout_panel> + <layout_panel name="chat_layout_panel"> + <layout_stack name="input_panels"> + <layout_panel name="input_editor_layout_panel"> + <chat_editor label="A" name="chat_editor"/> + </layout_panel> + <layout_panel name="input_button_layout_panel"> + <button name="minz_btn" tool_tip="Muestra/oculta el panel de mensajes"/> + </layout_panel> + </layout_stack> + </layout_panel> + </layout_stack> + </view> </floater> diff --git a/indra/newview/skins/default/xui/es/floater_incoming_call.xml b/indra/newview/skins/default/xui/es/floater_incoming_call.xml index b5b756abb6..acbb25b713 100644 --- a/indra/newview/skins/default/xui/es/floater_incoming_call.xml +++ b/indra/newview/skins/default/xui/es/floater_incoming_call.xml @@ -10,7 +10,7 @@ anónimo </floater.string> <floater.string name="VoiceInviteP2P"> - está llamando. + te está llamando. </floater.string> <floater.string name="VoiceInviteAdHoc"> ha entrado en un chat de voz en multiconferencia. @@ -25,9 +25,9 @@ ¿Quieres dejar [CURRENT_CHAT] y entrar en este chat de voz? </floater.string> <text name="question"> - ¿Quieres dejar [CURRENT_CHAT] y entrar a este chat de voz? + Si respondes, te desconectarás de la conversación de voz actual. </text> - <button label="Aceptar" label_selected="Aceptar" name="Accept"/> - <button label="Rechazar" label_selected="Rechazar" name="Reject"/> - <button label="Comenzar un MI" name="Start IM"/> + <button label="Responder" label_selected="Responder" name="Accept"/> + <button label="Ignorar" label_selected="Ignorar" name="Reject"/> + <button label="Abrir MI en su lugar" name="Start IM"/> </floater> diff --git a/indra/newview/skins/default/xui/es/floater_pathfinding_console.xml b/indra/newview/skins/default/xui/es/floater_pathfinding_console.xml index e93ecc9e10..3602270e5a 100644 --- a/indra/newview/skins/default/xui/es/floater_pathfinding_console.xml +++ b/indra/newview/skins/default/xui/es/floater_pathfinding_console.xml @@ -71,7 +71,7 @@ <text name="show_label"> Mostrar: </text> - <check_box label="Mundo virtual" name="show_world"/> + <check_box label="Prueba" name="show_world"/> <check_box label="Solamente los objetos movibles" name="show_world_movables_only"/> <check_box label="Navmesh" name="show_navmesh"/> <text name="show_walkability_label"> 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 93bc9f293c..01b024bc3e 100644 --- a/indra/newview/skins/default/xui/es/floater_texture_ctrl.xml +++ b/indra/newview/skins/default/xui/es/floater_texture_ctrl.xml @@ -20,7 +20,7 @@ <button label="Blanca" label_selected="Blanca" name="Blank"/> <button label="Ninguna" label_selected="Ninguna" left="90" name="None"/> <button label="" label_selected="" name="Pipette"/> - <check_box initial_value="true" label="Vista previa inmediata" name="apply_immediate_check"/> + <check_box initial_value="true" label="Aplicarlo ahora" name="apply_immediate_check"/> <text name="preview_disabled" value="Vista previa inhabilitada"/> <filter_editor label="Filtrar las texturas" name="inventory search editor"/> <check_box initial_value="false" label="Ver las carpetas" name="show_folders_check"/> diff --git a/indra/newview/skins/default/xui/es/floater_voice_chat_volume.xml b/indra/newview/skins/default/xui/es/floater_voice_chat_volume.xml new file mode 100644 index 0000000000..1115d67239 --- /dev/null +++ b/indra/newview/skins/default/xui/es/floater_voice_chat_volume.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="floater_voice_volume" title="VOLUMEN DE CHAT DE VOZ"> + <slider label="Chat de voz" name="chat_voice_volume"/> +</floater> diff --git a/indra/newview/skins/default/xui/es/floater_voice_effect.xml b/indra/newview/skins/default/xui/es/floater_voice_effect.xml index 1a265845af..02ebe80ff7 100644 --- a/indra/newview/skins/default/xui/es/floater_voice_effect.xml +++ b/indra/newview/skins/default/xui/es/floater_voice_effect.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater label="Lugares" name="voice_effects" title="TRANSFORMACIÓN DE VOZ"> +<floater label="Lugares" name="voice_effects" title="PROBAR TRANSFORMACIÓN DE VOZ"> <string name="no_voice_effect"> (Sin transformación de voz) </string> diff --git a/indra/newview/skins/default/xui/es/floater_voice_volume.xml b/indra/newview/skins/default/xui/es/floater_voice_volume.xml new file mode 100644 index 0000000000..0ebc511887 --- /dev/null +++ b/indra/newview/skins/default/xui/es/floater_voice_volume.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<!-- + Not can_close / no title to avoid window chrome + Single instance - only have one at a time, recycle it each spawn +--> +<floater name="floater_voice_volume" title="VOLUMEN DE VOZ"> + <slider name="volume_slider" tool_tip="Volumen de la voz" value="0.5"/> +</floater> diff --git a/indra/newview/skins/default/xui/es/menu_cof_gear.xml b/indra/newview/skins/default/xui/es/menu_cof_gear.xml index ff8ad0977a..a889992b8a 100644 --- a/indra/newview/skins/default/xui/es/menu_cof_gear.xml +++ b/indra/newview/skins/default/xui/es/menu_cof_gear.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<menu name="Gear COF"> +<toggleable_menu name="Gear COF"> <menu label="Ropas nuevas" name="COF.Gear.New_Clothes"/> - <menu label="Nuevas partes del cuerpo" name="COF.Geear.New_Body_Parts"/> -</menu> + <menu label="Nuevas partes del cuerpo" name="COF.Gear.New_Body_Parts"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/es/menu_conversation.xml b/indra/newview/skins/default/xui/es/menu_conversation.xml new file mode 100644 index 0000000000..e4e9a0bf63 --- /dev/null +++ b/indra/newview/skins/default/xui/es/menu_conversation.xml @@ -0,0 +1,31 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_conversation_participant"> + <menu_item_call label="Cerrar conversación" name="close_conversation"/> + <menu_item_call label="Abrir conversación de voz" name="open_voice_conversation"/> + <menu_item_call label="Desconectar de voz" name="disconnect_from_voice"/> + <menu_item_call label="Ver el perfil" name="view_profile"/> + <menu_item_call label="MI" name="im"/> + <menu_item_call label="Ofrecer teleporte" name="offer_teleport"/> + <menu_item_call label="Llamada de voz" name="voice_call"/> + <menu_item_call label="Historial del chat..." name="chat_history"/> + <menu_item_call label="Añadir como amigo" name="add_friend"/> + <menu_item_call label="Quitarle como amigo" name="remove_friend"/> + <menu_item_call label="Quitar amigos" name="remove_friends"/> + <menu_item_call label="Invitar al grupo..." name="invite_to_group"/> + <menu_item_call label="Acercar el zoom" name="zoom_in"/> + <menu_item_call label="Mapa" name="map"/> + <menu_item_call label="Compartir" name="share"/> + <menu_item_call label="Pagar" name="pay"/> + <menu_item_check label="Ignorar la voz" name="block_unblock"/> + <menu_item_check label="Ignorar el texto" name="MuteText"/> + <menu_item_call label="Perfil del grupo" name="group_profile"/> + <menu_item_call label="Activar el grupo" name="activate_group"/> + <menu_item_call label="Abandonar el grupo" name="leave_group"/> + <context_menu label="Opciones del moderador" name="Moderator Options"> + <menu_item_check label="Permitir el chat de texto" name="AllowTextChat"/> + <menu_item_call label="Ignorar a este participante" name="ModerateVoiceMuteSelected"/> + <menu_item_call label="Quitar el silencio a este participante" name="ModerateVoiceUnMuteSelected"/> + <menu_item_call label="Silenciar a todos" name="ModerateVoiceMute"/> + <menu_item_call label="Quitar el silencio a todos" name="ModerateVoiceUnmute"/> + </context_menu> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/es/menu_conversation_log_gear.xml b/indra/newview/skins/default/xui/es/menu_conversation_log_gear.xml new file mode 100644 index 0000000000..090e6fb0bf --- /dev/null +++ b/indra/newview/skins/default/xui/es/menu_conversation_log_gear.xml @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="Conversation Context Menu"> + <menu_item_call label="MI..." name="IM"/> + <menu_item_call label="Llamada de voz..." name="Call"/> + <menu_item_call label="Abrir el historial de chat..." name="Chat history"/> + <menu_item_call label="Ver el perfil" name="View Profile"/> + <menu_item_call label="Ofrecer teleporte" name="teleport"/> + <menu_item_call label="Añadir como amigo" name="add_friend"/> + <menu_item_call label="Quitarle como amigo" name="remove_friend"/> + <menu_item_call label="Invitar al grupo..." name="Invite"/> + <menu_item_call label="Mapa" name="Map"/> + <menu_item_call label="Compartir" name="Share"/> + <menu_item_call label="Pagar" name="Pay"/> + <menu_item_check label="Ignorar / No ignorar" name="Block/Unblock"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/es/menu_conversation_log_view.xml b/indra/newview/skins/default/xui/es/menu_conversation_log_view.xml new file mode 100644 index 0000000000..b8b4616b2d --- /dev/null +++ b/indra/newview/skins/default/xui/es/menu_conversation_log_view.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_conversation_view"> + <menu_item_check label="Ordenar alfabéticamente" name="sort_by_name"/> + <menu_item_check label="Ordenar por fecha" name="sort_by_date"/> + <menu_item_check label="Ordenar con los amigos al principio" name="sort_by_friends"/> + <menu_item_call label="Ver el historial de chat..." name="view_nearby_chat_history"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/es/menu_im_conversation.xml b/indra/newview/skins/default/xui/es/menu_im_conversation.xml new file mode 100644 index 0000000000..5ba0fb898e --- /dev/null +++ b/indra/newview/skins/default/xui/es/menu_im_conversation.xml @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="Conversation Gear Menu"> + <menu_item_call label="Ver el perfil" name="View Profile"/> + <menu_item_call label="Añadir como amigo" name="Add Friend"/> + <menu_item_call label="Quitarle como amigo" name="remove_friend"/> + <menu_item_call label="Ofrecer teleporte" name="offer_teleport"/> + <menu_item_call label="Invitar al grupo..." name="invite_to_group"/> + <menu_item_call label="Historial del chat..." name="chat_history"/> + <menu_item_call label="Acercar el zoom" name="zoom_in"/> + <menu_item_call label="Mapa" name="map"/> + <menu_item_call label="Compartir" name="Share"/> + <menu_item_call label="Pagar" name="Pay"/> + <menu_item_check label="Ignorar la voz" name="Block/Unblock"/> + <menu_item_check label="Ignorar el texto" name="MuteText"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/es/menu_im_session_showmodes.xml b/indra/newview/skins/default/xui/es/menu_im_session_showmodes.xml new file mode 100644 index 0000000000..6ea970b826 --- /dev/null +++ b/indra/newview/skins/default/xui/es/menu_im_session_showmodes.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_modes"> + <menu_item_check label="Vista compacta" name="compact_view"/> + <menu_item_check label="Vista ampliada" name="expanded_view"/> + <menu_item_check label="Mostrar tiempo" name="IMShowTime"/> + <menu_item_check label="Mostrar los nombres en las conversaciones individuales" name="IMShowNamesForP2PConv"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/es/menu_object_icon.xml b/indra/newview/skins/default/xui/es/menu_object_icon.xml index 7e4578b950..a99c889bb0 100644 --- a/indra/newview/skins/default/xui/es/menu_object_icon.xml +++ b/indra/newview/skins/default/xui/es/menu_object_icon.xml @@ -2,4 +2,6 @@ <menu name="Object Icon Menu"> <menu_item_call label="Perfil del objeto..." name="Object Profile"/> <menu_item_call label="Ignorar..." name="Block"/> + <menu_item_call label="Mostrar en el mapa" name="show_on_map"/> + <menu_item_call label="Teleportarse a la posición del objeto" name="teleport_to_object"/> </menu> diff --git a/indra/newview/skins/default/xui/es/menu_outfit_gear.xml b/indra/newview/skins/default/xui/es/menu_outfit_gear.xml index 558ff6afd3..56e64c729f 100644 --- a/indra/newview/skins/default/xui/es/menu_outfit_gear.xml +++ b/indra/newview/skins/default/xui/es/menu_outfit_gear.xml @@ -23,6 +23,8 @@ <menu_item_call label="Pelo nuevo" name="New Hair"/> <menu_item_call label="Ojos nuevos" name="New Eyes"/> </menu> + <menu_item_call label="Abrir todas las carpetas" name="expand"/> + <menu_item_call label="Cerrar todas las carpetas" name="collapse"/> <menu_item_call label="Renombrar el vestuario" name="rename"/> <menu_item_call label="Borrar el vestuario" name="delete_outfit"/> </toggleable_menu> diff --git a/indra/newview/skins/default/xui/es/menu_participant_view.xml b/indra/newview/skins/default/xui/es/menu_participant_view.xml new file mode 100644 index 0000000000..fcfeeb922b --- /dev/null +++ b/indra/newview/skins/default/xui/es/menu_participant_view.xml @@ -0,0 +1,13 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="participant_manu_view"> + <menu_item_check label="Ordenar las conversaciones por tipo" name="sort_sessions_by_type"/> + <menu_item_check label="Ordenar las conversaciones por nombre" name="sort_sessions_by_name"/> + <menu_item_check label="Ordenar las conversaciones por actividad reciente" name="sort_sessions_by_recent"/> + <menu_item_check label="Ordenar los participantes por nombre" name="sort_participants_by_name"/> + <menu_item_check label="Ordenar los participantes por actividad reciente" name="sort_participants_by_recent"/> + <menu_item_call label="Preferencias de chat..." name="chat_preferences"/> + <menu_item_call label="Preferencias de privacidad..." name="privacy_preferences"/> + <menu_item_check label="Registro de conversaciones..." name="Conversation"/> + <menu_item_check label="Traducir el chat" name="Translate_chat"/> + <menu_item_check label="Configuración de traducción..." name="Translation_settings"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/es/menu_people_blocked_gear.xml b/indra/newview/skins/default/xui/es/menu_people_blocked_gear.xml new file mode 100644 index 0000000000..986389a4fe --- /dev/null +++ b/indra/newview/skins/default/xui/es/menu_people_blocked_gear.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_blocked_gear"> + <menu_item_call label="No ignorar" name="unblock"/> + <menu_item_call label="Perfil..." name="profile"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/es/menu_people_blocked_plus.xml b/indra/newview/skins/default/xui/es/menu_people_blocked_plus.xml new file mode 100644 index 0000000000..10f6a3fc14 --- /dev/null +++ b/indra/newview/skins/default/xui/es/menu_people_blocked_plus.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_blocked_plus"> + <menu_item_call label="Ignorar residentes según el nombre..." name="block_resident_by_name"/> + <menu_item_call label="Ignorar objetos según el nombre" name="block_object_by_name"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/es/menu_people_blocked_view.xml b/indra/newview/skins/default/xui/es/menu_people_blocked_view.xml new file mode 100644 index 0000000000..bc557c7ec1 --- /dev/null +++ b/indra/newview/skins/default/xui/es/menu_people_blocked_view.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_blocked_view"> + <menu_item_check label="Ordenar alfabéticamente" name="sort_by_name"/> + <menu_item_check label="Ordenar por tipo" name="sort_by_type"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/es/menu_people_friends_view.xml b/indra/newview/skins/default/xui/es/menu_people_friends_view.xml new file mode 100644 index 0000000000..ad896c1b74 --- /dev/null +++ b/indra/newview/skins/default/xui/es/menu_people_friends_view.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_group_plus"> + <menu_item_check label="Ordenar alfabéticamente" name="sort_name"/> + <menu_item_check label="Ordenar por estatus" name="sort_status"/> + <menu_item_check label="Ver los iconos de la gente" name="view_icons"/> + <menu_item_check label="Ver permisos concedidos" name="view_permissions"/> + <menu_item_check label="Ver el registro de conversaciones..." name="view_conversation"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/es/menu_people_groups.xml b/indra/newview/skins/default/xui/es/menu_people_groups.xml index 51bd2c7208..125e25cd1a 100644 --- a/indra/newview/skins/default/xui/es/menu_people_groups.xml +++ b/indra/newview/skins/default/xui/es/menu_people_groups.xml @@ -2,7 +2,7 @@ <menu name="menu_group_plus"> <menu_item_call label="Ver la información" name="View Info"/> <menu_item_call label="Chat" name="Chat"/> - <menu_item_call label="Llamar" name="Call"/> + <menu_item_call label="Llamada de voz" name="Call"/> <menu_item_call label="Activar" name="Activate"/> <menu_item_call label="Dejar" name="Leave"/> </menu> diff --git a/indra/newview/skins/default/xui/es/menu_people_groups_view.xml b/indra/newview/skins/default/xui/es/menu_people_groups_view.xml new file mode 100644 index 0000000000..c3973625b0 --- /dev/null +++ b/indra/newview/skins/default/xui/es/menu_people_groups_view.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_group_plus"> + <menu_item_check label="Mostrar los iconos de grupo" name="Display Group Icons"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/es/menu_people_nearby.xml b/indra/newview/skins/default/xui/es/menu_people_nearby.xml index dc1486d879..09bb119d5a 100644 --- a/indra/newview/skins/default/xui/es/menu_people_nearby.xml +++ b/indra/newview/skins/default/xui/es/menu_people_nearby.xml @@ -1,13 +1,16 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <context_menu name="Avatar Context Menu"> - <menu_item_call label="Ver el perfil" name="View Profile"/> - <menu_item_call label="Añadir como amigo" name="Add Friend"/> - <menu_item_call label="Quitarle como amigo" name="Remove Friend"/> - <menu_item_call label="MI" name="IM"/> - <menu_item_call label="Llamar" name="Call"/> - <menu_item_call label="Mapa" name="Map"/> - <menu_item_call label="Compartir" name="Share"/> - <menu_item_call label="Pagar" name="Pay"/> - <menu_item_check label="Ignorar / No ignorar" name="Block/Unblock"/> - <menu_item_call label="Ofrecer teleporte" name="teleport"/> + <menu_item_call label="Ver el perfil" name="view_profile"/> + <menu_item_call label="MI" name="im"/> + <menu_item_call label="Ofrecer teleporte" name="offer_teleport"/> + <menu_item_call label="Llamada de voz" name="voice_call"/> + <menu_item_call label="Ver el historial de chat..." name="chat_history"/> + <menu_item_call label="Añadir como amigo" name="add_friend"/> + <menu_item_call label="Quitarle como amigo" name="remove_friend"/> + <menu_item_call label="Invitar al grupo..." name="invite_to_group"/> + <menu_item_call label="Acercar el zoom" name="zoom_in"/> + <menu_item_call label="Mapa" name="map"/> + <menu_item_call label="Compartir" name="share"/> + <menu_item_call label="Pagar" name="pay"/> + <menu_item_check label="Ignorar / No ignorar" name="block_unblock"/> </context_menu> diff --git a/indra/newview/skins/default/xui/es/menu_people_nearby_multiselect.xml b/indra/newview/skins/default/xui/es/menu_people_nearby_multiselect.xml index 227c5ebe58..9df160f5ad 100644 --- a/indra/newview/skins/default/xui/es/menu_people_nearby_multiselect.xml +++ b/indra/newview/skins/default/xui/es/menu_people_nearby_multiselect.xml @@ -1,10 +1,10 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <context_menu name="Multi-Selected People Context Menu"> - <menu_item_call label="Añadir como amigos" name="Add Friends"/> - <menu_item_call label="Quitar amigos" name="Remove Friend"/> - <menu_item_call label="MI" name="IM"/> - <menu_item_call label="Llamar" name="Call"/> - <menu_item_call label="Compartir" name="Share"/> - <menu_item_call label="Pagar" name="Pay"/> - <menu_item_call label="Ofrecer teleporte" name="teleport"/> + <menu_item_call label="Añadir como amigos" name="add_friends"/> + <menu_item_call label="Quitar amigos" name="remove_friends"/> + <menu_item_call label="MI" name="im"/> + <menu_item_call label="Visita" name="call"/> + <menu_item_call label="Compartir" name="share"/> + <menu_item_call label="Pagar" name="pay"/> + <menu_item_call label="Ofrecer teleporte" name="offer_teleport"/> </context_menu> diff --git a/indra/newview/skins/default/xui/es/menu_people_nearby_view.xml b/indra/newview/skins/default/xui/es/menu_people_nearby_view.xml new file mode 100644 index 0000000000..c2fb360dd1 --- /dev/null +++ b/indra/newview/skins/default/xui/es/menu_people_nearby_view.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_group_plus"> + <menu_item_check label="Ordenar según las intervenciones recientes" name="sort_by_recent_speakers"/> + <menu_item_check label="Ordenar alfabéticamente" name="sort_name"/> + <menu_item_check label="Ordenar según distancia" name="sort_distance"/> + <menu_item_check label="Ver los iconos de la gente" name="view_icons"/> + <menu_item_check label="Ver mapa" name="view_map"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/es/menu_people_recent_view.xml b/indra/newview/skins/default/xui/es/menu_people_recent_view.xml new file mode 100644 index 0000000000..f0ffd14024 --- /dev/null +++ b/indra/newview/skins/default/xui/es/menu_people_recent_view.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_group_plus"> + <menu_item_check label="Ordenar por más reciente" name="sort_most"/> + <menu_item_check label="Ordenar alfabéticamente" name="sort_name"/> + <menu_item_check label="Ver los iconos de la gente" name="view_icons"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/es/menu_url_agent.xml b/indra/newview/skins/default/xui/es/menu_url_agent.xml index a089c8f68e..69a03671ab 100644 --- a/indra/newview/skins/default/xui/es/menu_url_agent.xml +++ b/indra/newview/skins/default/xui/es/menu_url_agent.xml @@ -1,6 +1,8 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <context_menu name="Url Popup"> - <menu_item_call label="Mostrar el perfil del Residente" name="show_agent"/> + <menu_item_call label="Ver el perfil" name="show_agent"/> + <menu_item_call label="Enviar un MI..." name="send_im"/> + <menu_item_call label="Añadir como amigo..." name="add_friend"/> <menu_item_call label="Copiar el nombre al portapapeles" name="url_copy_label"/> <menu_item_call label="Copiar la SLurl al portapapeles" name="url_copy"/> </context_menu> diff --git a/indra/newview/skins/default/xui/es/menu_url_objectim.xml b/indra/newview/skins/default/xui/es/menu_url_objectim.xml index 8791a290af..e78fdec558 100644 --- a/indra/newview/skins/default/xui/es/menu_url_objectim.xml +++ b/indra/newview/skins/default/xui/es/menu_url_objectim.xml @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <context_menu name="Url Popup"> - <menu_item_call label="Mostrar la información del objeto" name="show_object"/> + <menu_item_call label="Perfil del objeto..." name="show_object"/> <menu_item_call label="Mostrar en el mapa" name="show_on_map"/> <menu_item_call label="Teleportarse a la posición del objeto" name="teleport_to_object"/> <menu_item_call label="Copiar el nombre del objeto al portapapeles" name="url_copy_label"/> diff --git a/indra/newview/skins/default/xui/es/menu_viewer.xml b/indra/newview/skins/default/xui/es/menu_viewer.xml index d80150ef6d..de42b17074 100644 --- a/indra/newview/skins/default/xui/es/menu_viewer.xml +++ b/indra/newview/skins/default/xui/es/menu_viewer.xml @@ -16,10 +16,7 @@ <menu_item_call label="Parar mis animaciones" name="Stop Animating My Avatar"/> <menu_item_call label="Caminar / Correr / Volar..." name="Walk / run / fly"/> </menu> - <menu label="Estado" name="Status"> - <menu_item_call label="Ausente" name="Set Away"/> - <menu_item_call label="Ocupado" name="Set Busy"/> - </menu> + <menu label="Estado" name="Status"/> <menu_item_call label="Comprar L$..." name="Buy and Sell L$"/> <menu_item_call label="Panel de control de la cuenta..." name="Manage My Account"> <menu_item_call.on_click name="ManageMyAccount_url" parameter="WebLaunchJoinNow,http://secondlife.com/account/index.php?lang=es"/> @@ -31,14 +28,18 @@ <menu_item_call label="Salir de [APP_NAME]" name="Quit"/> </menu> <menu label="Comunicarme" name="Communicate"> + <menu_item_check label="Conversaciones..." name="Conversations"/> <menu_item_check label="Chat..." name="Nearby Chat"/> <menu_item_check label="Hablar" name="Speak"/> - <menu_item_check label="Configuración de voz..." name="Nearby Voice"/> - <menu_item_check label="Transformación de voz..." name="ShowVoice"/> + <menu label="Transformación de voz" name="VoiceMorphing"> + <menu_item_check label="Sin transformación de voz" name="NoVoiceMorphing"/> + <menu_item_check label="Probar..." name="Preview"/> + <menu_item_call label="Suscribir..." name="Subscribe"/> + </menu> <menu_item_check label="Gestos..." name="Gestures"/> - <menu_item_call label="Amigos" name="My Friends"/> - <menu_item_call label="Grupos" name="My Groups"/> - <menu_item_call label="Gente cerca" name="Active Speakers"/> + <menu_item_check label="Amigos" name="My Friends"/> + <menu_item_check label="Grupos" name="My Groups"/> + <menu_item_check label="Gente cerca" name="Active Speakers"/> <menu_item_call label="Lista de ignorados" name="Block List"/> </menu> <menu label="Mundo" name="World"> @@ -285,7 +286,7 @@ <menu label="Rendering" name="Rendering"> <menu_item_check label="Axes" name="Axes"/> <menu_item_check label="Wireframe" name="Wireframe"/> - <menu_item_check label="Luces y sombras" name="Lighting and Shadows"/> + <menu_item_check label="Luces y sombras" name="Advanced Lighting Model"/> <menu_item_check label="Sombras del sol/la luna/proyectores" name="Shadows from Sun/Moon/Projectors"/> <menu_item_check label="SSAO y sombras suavizadas" name="SSAO and Shadow Smoothing"/> <menu_item_check label="Capas alfa automáticas (deferidas)" name="Automatic Alpha Masks (deferred)"/> diff --git a/indra/newview/skins/default/xui/es/notifications.xml b/indra/newview/skins/default/xui/es/notifications.xml index 7dfb27717d..05455f54c3 100644 --- a/indra/newview/skins/default/xui/es/notifications.xml +++ b/indra/newview/skins/default/xui/es/notifications.xml @@ -511,6 +511,24 @@ El objeto debe de haber sido borrado o estar fuera de rango ('out of range& </url> <usetemplate ignoretext="Mi controlador de gráficos no está actualizado" name="okcancelignore" notext="No" yestext="SÃ"/> </notification> + <notification name="AMDOldDriver"> + 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://support.amd.com/us/Pages/AMDSupportHub.aspx + </url> + <usetemplate ignoretext="Mi controlador de gráficos no está actualizado" name="okcancelignore" notext="No" yestext="SÃ"/> + </notification> + <notification name="NVIDIAOldDriver"> + 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.nvidia.com/Download/index.aspx?lang=es + </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. @@ -1553,10 +1571,13 @@ Debemos reiniciar [APP_NAME] para instalar la actualización. En este momento, no se puede ofrecer el ser amigo. Por favor, vuelve a intentarlo en un momento. <usetemplate name="okbutton" yestext="OK"/> </notification> - <notification name="BusyModeSet"> - Pasar al modo ocupado. -Se ocultará el chat y los mensajes instantáneos (éstos recibirán tu Respuesta en el modo ocupado). Se rehusarán todos los ofrecimientos de teleporte. Todas las ofertas de inventario irán a tu Papelera. - <usetemplate ignoretext="Cambio mi estado al modo ocupado" name="okignore" yestext="OK"/> + <notification name="DoNotDisturbModeSet"> + Está activado No molestar. No obtendrás un aviso cuando recibas comunicaciones. + +- Los otros residentes recibirán tu respuesta de No molestar (se configura en Preferencias > General). +- Se rehusarán los ofrecimientos de teleporte. +- Se rechazarán las llamadas de voz. + <usetemplate ignoretext="Cambio mi estado al modo No molestar" name="okignore" yestext="OK"/> </notification> <notification name="JoinedTooManyGroupsMember"> Has superado tu número máximo de grupos. Por favor, sal de al menos uno antes de entrar en éste, o rehúsa la oferta. @@ -2043,6 +2064,10 @@ Dado que estos objetos tienen scripts, moverlos a tu inventario puede provocar u ¿Ir a tu [http://secondlife.com/account/ Panel de Control] para ver el historial de tu cuenta? <usetemplate ignoretext="Abrir mi navegador para ver el historial de mi cuenta" name="okcancelignore" notext="Cancelar" yestext="Ir a la página"/> </notification> + <notification name="ConfirmAddingChatParticipants"> + Si agregas una persona a una conversación en curso, se creará una conversación nueva. Todos los participantes recibirán notificaciones de la nueva conversación. + <usetemplate ignoretext="Confirmar agregar participantes al chat" name="okcancelignore" notext="Cancelar" yestext="Aceptar"/> + </notification> <notification name="ConfirmQuit"> ¿Estás seguro de que quieres salir? <usetemplate ignoretext="Confirmar antes de salir" name="okcancelignore" notext="No salir" yestext="Salir"/> @@ -2116,14 +2141,14 @@ Linden Lab <button ignore="Nunca reemplazar" name="No" text="Cancelar"/> </form> </notification> - <notification label="¡Aviso! Modo Ocupado" name="BusyModePay"> - Estás en el modo Ocupado. Por tanto, no recibirás ningún Ãtem a cambio de este pago. + <notification label="Advertencia del modo No molestar" name="DoNotDisturbModePay"> + Tienes activado No molestar. No podrás recibir ningún objeto ofrecido a cambio de este pago. -¿Quieres salir del modo Ocupado antes de completar esta transacción? +¿Deseas desactivar No molestar antes de finalizar esta transacción? <form name="form"> - <ignore name="ignore" save_option="true" text="Voy a pagar a una persona u objeto mientras estoy en el modo ocupado"/> - <button ignore="Siempre salir del modo Ocupado" name="Yes" text="OK"/> - <button ignore="Nunca salir del modo Ocupado" name="No" text="Cancelar"/> + <ignore name="ignore" text="Voy a pagar a una persona u objeto mientras estoy en el modo No molestar"/> + <button ignore="Salir siempre del modo No molestar" name="Yes" text="OK"/> + <button ignore="No salir nunca del modo No molestar" name="No" text="Cancelar"/> </form> </notification> <notification name="ConfirmDeleteProtectedCategory"> @@ -2258,11 +2283,8 @@ PublÃcala en una página web para que otros puedan acceder fácilmente a esta p <notification name="GroupNotice"> Asunto: [SUBJECT], Mensaje: [MESSAGE] </notification> - <notification name="FriendOnline"> - <nolink>[NAME]</nolink> está conectado - </notification> - <notification name="FriendOffline"> - <nolink>[NAME]</nolink> está desconectado + <notification name="FriendOnlineOffline"> + <nolink>[NAME]</nolink> está [STATUS] </notification> <notification name="AddSelfFriend"> Aunque eres muy agradable, no puedes añadirte como amigo a ti mismo. @@ -2490,13 +2512,6 @@ Aquà no puedes volar. <notification name="DynamicPathfindingDisabled"> Esta región no tiene activado el pathfinding dinámico. Los objetos programados que utilicen llamadas LSL de pathfinding pueden tener un comportamiento inesperado en ella. </notification> - <notification name="PathfindingRebakeNavmesh"> - Si cambias ciertos objetos en esta región, otros objetos móviles podrÃan tener un comportamiento incorrecto. Para que los objetos móviles se comporten correctamente, pulsa el botón “Recargar la regiónâ€. Si quieres más información, elige “Ayudaâ€. - <url name="url"> - http://wiki.secondlife.com/wiki/Pathfinding_Tools_in_the_Second_Life_Viewer - </url> - <usetemplate helptext="Ayuda" ignoretext="Si cambias ciertos objetos en esta región, otros objetos móviles podrÃan tener un comportamiento incorrecto." name="okhelpignore" yestext="OK"/> - </notification> <notification name="PathfindingCannotRebakeNavmesh"> Se ha producido un error. Puede haber ocurrido un problema en la red o el servidor, o quizás no tengas derechos de construcción. Este problema podrÃa resolverse cerrando la sesión e iniciando una sesión nueva. <usetemplate name="okbutton" yestext="OK"/> @@ -2757,9 +2772,9 @@ Del objeto: <nolink>[OBJECTNAME]</nolink>, propietario: [NAME]? </form> </notification> <notification name="ScriptQuestionCaution"> - Atención: El objeto '<nolink>[OBJECTNAME]</nolink>' 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. + Atención: El objeto '<nolink>[OBJECTNAME]</nolink>' solicita un acceso pleno 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, cuando lo desee 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. +No autorices el acceso a tu cuenta si no conoces cuál es la razón exacta. <form name="form"> <button name="Grant" text="Permitir acceso total"/> <button name="Deny" text="Denegar"/> @@ -3331,4 +3346,633 @@ Intento cancelado. Vas a eliminar [NUM_ITEMS] objetos. ¿Estás seguro de que deseas continuar? <usetemplate ignoretext="¿Estás seguro de que quieres eliminar varios elementos?" name="okcancelignore" notext="No" yestext="SÃ"/> </notification> + <notification name="AvatarFrozen"> + [AV_FREEZER] te ha congelado. No puedes moverte ni interactuar con el mundo. + </notification> + <notification name="AvatarFrozenDuration"> + [AV_FREEZER] te ha congelado durante [AV_FREEZE_TIME] segundos. No puedes moverte ni interactuar con el mundo. + </notification> + <notification name="YouFrozeAvatar"> + Avatar congelado. + </notification> + <notification name="AvatarHasUnFrozenYou"> + [AV_FREEZER] te ha descongelado. + </notification> + <notification name="AvatarUnFrozen"> + Avatar descongelado. + </notification> + <notification name="AvatarFreezeFailure"> + Error al congelar: no tienes permisos de administrador en esa parcela. + </notification> + <notification name="AvatarFreezeThaw"> + La congelación ha terminado, puedes seguir con tus asuntos. + </notification> + <notification name="AvatarCantFreeze"> + Lo sentimos, ese usuario no se puede congelar. + </notification> + <notification name="NowOwnObject"> + Ahora eres el propietario del objeto [OBJECT_NAME] + </notification> + <notification name="CantRezOnLand"> + No se puede colocar el objeto en [OBJECT_POS] porque el propietario de ese terreno no lo permite. Usa la herramienta de terreno para ver quién es el propietario. + </notification> + <notification name="RezFailTooManyRequests"> + El objeto no se puede colocar porque hay demasiadas solicitudes. + </notification> + <notification name="SitFailCantMove"> + No te puedes sentar porque en este momento no puedes desplazarte. + </notification> + <notification name="SitFailNotAllowedOnLand"> + No te puedes sentar porque no tienes permiso para estar en ese terreno. + </notification> + <notification name="SitFailNotSameRegion"> + Acércate. No te puedes sentar en el objeto porque +no está en la misma región que tú. + </notification> + <notification name="NoNewObjectRegionFull"> + No se puede crear el nuevo objeto. La región está llena. + </notification> + <notification name="FailedToPlaceObject"> + Error al colocar el objeto en el lugar especificado. Vuelve a intentarlo. + </notification> + <notification name="NoOwnNoGardening"> + No puedes crear árboles y hierba en un terreno que no es tuyo. + </notification> + <notification name="NoCopyPermsNoObject"> + Error al copiar: careces de permiso para copiar el objeto '[OBJ_NAME]'. + </notification> + <notification name="NoTransPermsNoObject"> + Error al copiar: no se te puede transferir el objeto '[OBJ_NAME]'. + </notification> + <notification name="AddToNavMeshNoCopy"> + Error al copiar porque el objeto '[OBJ_NAME]' contribuye al navmesh. + </notification> + <notification name="DupeWithNoRootsSelected"> + Duplicación sin objetos raÃz seleccionados. + </notification> + <notification name="CantDupeCuzRegionIsFull"> + No se pueden duplicar objetos porque la región está llena. + </notification> + <notification name="CantDupeCuzParcelNotFound"> + No se pueden duplicar los objetos: no se encuentra la parcela en la que se hallan. + </notification> + <notification name="CantCreateCuzParcelFull"> + No se puede crear el objeto porque +la parcela está llena. + </notification> + <notification name="RezAttemptFailed"> + Error al intentar colocar un objeto. + </notification> + <notification name="ToxicInvRezAttemptFailed"> + No se puede crear un objeto que ha causado problemas en esta región. + </notification> + <notification name="InvItemIsBlacklisted"> + Ese objeto de inventario está en la lista negra. + </notification> + <notification name="NoCanRezObjects"> + Actualmente no tienes autorización para crear objetos. + </notification> + <notification name="LandSearchBlocked"> + Búsqueda de terrenos bloqueada. +Has realizado demasiadas búsquedas de terreno con excesiva rapidez. +Prueba otra vez dentro de un minuto. + </notification> + <notification name="NotEnoughResourcesToAttach"> + No hay suficientes recursos de script disponibles para anexar el objeto + </notification> + <notification name="YouDiedAndGotTPHome"> + Has muerto y te has teleportado a tu lugar de origen + </notification> + <notification name="EjectComingSoon"> + Te han expulsado de aquà y tienes [EJECT_TIME] segundos para salir. + </notification> + <notification name="NoEnterServerFull"> + No puedes entrar en esta región porque +el servidor está lleno. + </notification> + <notification name="SaveBackToInvDisabled"> + Se ha deshabilitado Devolver el objeto a mi inventario. + </notification> + <notification name="NoExistNoSaveToContents"> + No se puede guardar '[OBJ_NAME]' en el contenido del objeto porque el objeto desde el cual ha sido colocado ya no existe. + </notification> + <notification name="NoModNoSaveToContents"> + No se puede guardar '[OBJ_NAME]' en el contenido del objeto porque no tienes permiso para modificar el objeto '[DEST_NAME]'. + </notification> + <notification name="NoSaveBackToInvDisabled"> + No se puede guardar '[OBJ_NAME]' de nuevo en el inventario; esta operación está desactivada. + </notification> + <notification name="NoCopyNoSelCopy"> + No se puede copiar tu selección porque no tienes permiso para copiar el objeto '[OBJ_NAME]'. + </notification> + <notification name="NoTransNoSelCopy"> + No se puede copiar tu selección porque el objeto '[OBJ_NAME]' es intransferible. + </notification> + <notification name="NoTransNoCopy"> + No se puede copiar tu selección porque el objeto '[OBJ_NAME]' es intransferible. + </notification> + <notification name="NoPermsNoRemoval"> + El sistema de permisos no admite la eliminación del objeto '[OBJ_NAME]' del simulador. + </notification> + <notification name="NoModNoSaveSelection"> + No se puede guardar tu selección porque no tienes permiso para modificar el objeto '[OBJ_NAME]'. + </notification> + <notification name="NoCopyNoSaveSelection"> + No se puede guardar tu selección porque el objeto '[OBJ_NAME]' no se puede copiar. + </notification> + <notification name="NoModNoTaking"> + No se puede aceptar tu selección porque no tienes permiso para modificar el objeto '[OBJ_NAME]'. + </notification> + <notification name="RezDestInternalError"> + Error interno: tipo de destino desconocido. + </notification> + <notification name="DeleteFailObjNotFound"> + Error al borrar: el objeto no se encuentra + </notification> + <notification name="SorryCantEjectUser"> + Lo sentimos, ese usuario no se puede expulsar. + </notification> + <notification name="RegionSezNotAHome"> + Esta región no te permite configurar aquà tu lugar de origen. + </notification> + <notification name="HomeLocationLimits"> + Tu 'Lugar de origen' solo se puede configurar en tu terreno o en un punto de información del continente. + </notification> + <notification name="HomePositionSet"> + Posición de origen ajustada. + </notification> + <notification name="AvatarEjected"> + Avatar expulsado. + </notification> + <notification name="AvatarEjectFailed"> + Error al expulsar: no tienes permiso de administrador en esa parcela. + </notification> + <notification name="CantMoveObjectParcelFull"> + No se puede mover el objeto '[OBJECT_NAME]' a +[OBJ_POSITION] en la región [REGION_NAME] porque la parcela está llena. + </notification> + <notification name="CantMoveObjectParcelPerms"> + No se puede mover el objeto '[OBJECT_NAME]' a +[OBJ_POSITION] de la región [REGION_NAME] porque tus objetos no están permitidos en esta parcela. + </notification> + <notification name="CantMoveObjectParcelResources"> + No se puede mover el objeto '[OBJECT_NAME]' a +[OBJ_POSITION] de la región [REGION_NAME] porque no hay suficientes recursos para este objeto en esta parcela. + </notification> + <notification name="CantMoveObjectRegionVersion"> + No se puede mover el objeto '[OBJECT_NAME]' a +[OBJ_POSITION] de la región [REGION_NAME] porque la otra región ejecuta una versión más antigua que no admite la recepción de este objeto atravesando regiones. + </notification> + <notification name="CantMoveObjectNavMesh"> + No se puede mover el objeto '[OBJECT_NAME]' a +[OBJ_POSITION] en la región [REGION_NAME] porque no puedes modificar el navmesh a través de lÃmites de región. + </notification> + <notification name="CantMoveObjectWTF"> + No se puede mover el objeto '[OBJECT_NAME]' a +[OBJ_POSITION] en la región [REGION_NAME] por un motivo desconocido. ([FAILURE_TYPE]) + </notification> + <notification name="NoPermModifyObject"> + No tienes permiso para modificar ese objeto + </notification> + <notification name="CantEnablePhysObjContributesToNav"> + No se puede habilitar la fÃsica para un objeto que contribuye al navmesh. + </notification> + <notification name="CantEnablePhysKeyframedObj"> + No se puede activar la fÃsica para los objetos con fotogramas clave. + </notification> + <notification name="CantEnablePhysNotEnoughLandResources"> + No se puede habilitar la fÃsica para el objeto: recursos de terreno insuficientes. + </notification> + <notification name="CantEnablePhysCostTooGreat"> + No se puede activar la fÃsica para un objeto con un coste de recursos de fÃsica mayor que [MAX_OBJECTS] + </notification> + <notification name="PhantomWithConcavePiece"> + Este objeto no puede tener una pieza cóncava porque es inmaterial y contribuye al navmesh. + </notification> + <notification name="UnableAddItem"> + ¡No se puede añadir un objeto! + </notification> + <notification name="UnableEditItem"> + ¡No se puede editar esto! + </notification> + <notification name="NoPermToEdit"> + No puedes editar esto. + </notification> + <notification name="NoPermToCopyInventory"> + No está permitido copiar ese inventario. + </notification> + <notification name="CantSaveItemDoesntExist"> + No se puede guardar en el contenido del objeto: el objeto ya no existe. + </notification> + <notification name="CantSaveItemAlreadyExists"> + No se puede guardar en el contenido del objeto: el inventario ya contiene un objeto con ese nombre + </notification> + <notification name="CantSaveModifyAttachment"> + No se puede guardar en el contenido del objeto: se modificarÃan los permisos de anexo. + </notification> + <notification name="TooManyScripts"> + Demasiados scripts. + </notification> + <notification name="UnableAddScript"> + ¡No se puede añadir un script! + </notification> + <notification name="AssetServerTimeoutObjReturn"> + El servidor de objetos no respondió puntualmente. El objeto se ha devuelto al sim. + </notification> + <notification name="RegionDisablePhysicsShapes"> + Esta región no tiene habilitadas las formas de fÃsica. + </notification> + <notification name="NoModNavmeshAcrossRegions"> + No se puede modificar el navmesh a través de lÃmites de región. + </notification> + <notification name="NoSetPhysicsPropertiesOnObjectType"> + No se pueden establecer propiedades de fÃsica en ese tipo de objeto. + </notification> + <notification name="NoSetRootPrimWithNoShape"> + No se puede establecer que un prim raÃz no tenga forma. + </notification> + <notification name="NoRegionSupportPhysMats"> + Esta región no tiene habilitados los materiales de fÃsica. + </notification> + <notification name="OnlyRootPrimPhysMats"> + Solo se pueden ajustar los materiales de fÃsica de las prims raÃces. + </notification> + <notification name="NoSupportCharacterPhysMats"> + Aun no es posible configurar materiales de fÃsica para los personajes. + </notification> + <notification name="InvalidPhysMatProperty"> + Una o varias de las propiedades de los materiales de fÃsica especificados no son válidas. + </notification> + <notification name="NoPermsAlterStitchingMeshObj"> + No se puede cambiar el tipo de unión de un objeto de la malla. + </notification> + <notification name="NoPermsAlterShapeMeshObj"> + No se puede cambiar la forma de un objeto de la malla + </notification> + <notification name="FullRegionCantEnter"> + No puedes entrar en esta región porque \nla región está llena. + </notification> + <notification name="LinkFailedOwnersDiffer"> + Error de vÃnculo: los propietarios son diferentes + </notification> + <notification name="LinkFailedNoModNavmeshAcrossRegions"> + Error de vÃnculo: no se puede modificar el navmesh a través de lÃmites de región. + </notification> + <notification name="LinkFailedNoPermToEdit"> + Error de vÃnculo: no tienes permiso de edición. + </notification> + <notification name="LinkFailedTooManyPrims"> + Error de vÃnculo: demasiadas primitivas + </notification> + <notification name="LinkFailedCantLinkNoCopyNoTrans"> + Error de vÃnculo: no se pueden vincular 'no copiable' y 'no transferible' + </notification> + <notification name="LinkFailedNothingLinkable"> + Error de vÃnculo: no hay objetos que se puedan vincular. + </notification> + <notification name="LinkFailedTooManyPathfindingChars"> + Error de vÃnculo: demasiados personajes de pathfinding + </notification> + <notification name="LinkFailedInsufficientLand"> + Error de vÃnculo: recursos de terreno insuficientes + </notification> + <notification name="LinkFailedTooMuchPhysics"> + El objeto utiliza una cantidad excesiva de recursos de fÃsica; se ha desactivado su dinámica. + </notification> + <notification name="TeleportedHomeByObjectOnParcel"> + Has sido teleportado al origen por el objeto '[OBJECT_NAME]' de la parcela '[PARCEL_NAME]' + </notification> + <notification name="TeleportedHomeByObject"> + Has sido teleportado a tu origen por el objeto '[OBJECT_NAME]' + </notification> + <notification name="TeleportedByAttachment"> + Has sido teleportado por un anexo de [ITEM_ID] + </notification> + <notification name="TeleportedByObjectOnParcel"> + Has sido teleportado por el objeto '[OBJECT_NAME]' de la parcela '[PARCEL_NAME]' + </notification> + <notification name="TeleportedByObjectOwnedBy"> + Has sido teleportado por el objeto '[OBJECT_NAME]' que es propiedad de [OWNER_ID] + </notification> + <notification name="TeleportedByObjectUnknownUser"> + Has sido teleportado por el objeto '[OBJECT_NAME]' cuyo propietario es un usuario desconocido. + </notification> + <notification name="CantCreateObjectRegionFull"> + No se puede crear el objeto solicitado. La región está llena. + </notification> + <notification name="CantAttackMultipleObjOneSpot"> + No puedes anexar varios objetos a un solo lugar. + </notification> + <notification name="CantCreateMultipleObjAtLoc"> + Aquà no se pueden crear varios objetos. + </notification> + <notification name="UnableToCreateObjTimeOut"> + No se puede crear el objeto solicitado. El objeto no se encuentra en la base de datos. + </notification> + <notification name="UnableToCreateObjUnknown"> + No se puede crear el objeto solicitado. Ha expirado el tiempo de la solicitud. Vuelve a intentarlo. + </notification> + <notification name="UnableToCreateObjMissingFromDB"> + No se puede crear el objeto solicitado. Vuelve a intentarlo. + </notification> + <notification name="RezFailureTookTooLong"> + Error al colocar: la carga del objeto solicitado ha tardado demasiado. + </notification> + <notification name="FailedToPlaceObjAtLoc"> + Error al colocar el objeto en el lugar especificado. Vuelve a intentarlo. + </notification> + <notification name="CantCreatePlantsOnLand"> + No se pueden crear plantas en este terreno. + </notification> + <notification name="CantRestoreObjectNoWorldPos"> + No se puede restaurar el objeto. No se ha encontrado una posición del mundo. + </notification> + <notification name="CantRezObjectInvalidMeshData"> + No se puede colocar el objeto porque sus datos de malla no son válidos. + </notification> + <notification name="CantRezObjectTooManyScripts"> + No se puede colocar el objeto porque la región ya contiene demasiados scripts. + </notification> + <notification name="CantCreateObjectNoAccess"> + Tus privilegios de acceso no te permiten crear objetos allÃ. + </notification> + <notification name="CantCreateObject"> + Actualmente no tienes autorización para crear objetos. + </notification> + <notification name="InvalidObjectParams"> + Los parámetros de objeto no son válidos + </notification> + <notification name="CantDuplicateObjectNoAcess"> + Tus privilegios de acceso no te permiten duplicar objetos aquÃ. + </notification> + <notification name="CantChangeShape"> + No tienes permiso para cambiar esta forma. + </notification> + <notification name="NoAccessToClaimObjects"> + Tus privilegios de acceso no te permiten reclamar objetos aquÃ. + </notification> + <notification name="DeedFailedNoPermToDeedForGroup"> + Error de transferencia: no tienes permiso para transferir objetos para tu grupo. + </notification> + <notification name="NoPrivsToBuyObject"> + Tus privilegios de acceso no te autorizan a comprar objetos aquÃ. + </notification> + <notification name="CantAttachObjectAvatarSittingOnIt"> + No se puede anexar el objeto porque un avatar está sentado en él. + </notification> + <notification name="WhyAreYouTryingToWearShrubbery"> + No te puedes poner árboles y hierba como anexos. + </notification> + <notification name="CantAttachGroupOwnedObjs"> + No se pueden anexar objetos que son propiedad de grupos. + </notification> + <notification name="CantAttachObjectsNotOwned"> + No puedes anexar objetos de los que no eres propietario. + </notification> + <notification name="CantAttachNavmeshObjects"> + No se pueden anexar objetos que contribuyen al navmesh. + </notification> + <notification name="CantAttachObjectNoMovePermissions"> + No se puede anexar el objeto porque no tienes permiso para moverlo. + </notification> + <notification name="CantAttachNotEnoughScriptResources"> + No hay suficientes recursos de script disponibles para anexar el objeto + </notification> + <notification name="CantDropItemTrialUser"> + No se pueden soltar objetos aquÃ; inténtalo en la zona de prueba gratuita. + </notification> + <notification name="CantDropMeshAttachment"> + No se pueden soltar anexos de la malla. QuÃtalos en el inventario y después colócalos en el mundo. + </notification> + <notification name="CantDropAttachmentNoPermission"> + Error al soltar el anexo: no tienes permiso para soltarlo allÃ. + </notification> + <notification name="CantDropAttachmentInsufficientLandResources"> + Error al soltar el anexo: recurso de terreno disponible insuficiente. + </notification> + <notification name="CantDropAttachmentInsufficientResources"> + Error al soltar los anexos: los recursos disponibles son insuficientes. + </notification> + <notification name="CantDropObjectFullParcel"> + No se puede soltar el objeto aquÃ. La parcela está llena. + </notification> + <notification name="CantTouchObjectBannedFromParcel"> + No puedes tocar/agarrar este objeto porque tienes prohibida la entrada en la parcela de terreno. + </notification> + <notification name="PlzNarrowDeleteParams"> + Acota los parámetros de eliminación. + </notification> + <notification name="UnableToUploadAsset"> + No se puede subir el activo. + </notification> + <notification name="CantTeleportCouldNotFindUser"> + No se ha podido encontrar el usuario para teleportarlo al origen + </notification> + <notification name="GodlikeRequestFailed"> + error en la solicitud de superpoderes + </notification> + <notification name="GenericRequestFailed"> + error de solicitud genérico + </notification> + <notification name="CantUploadPostcard"> + No se puede subir la postal. Vuelve a intentarlo más tarde. + </notification> + <notification name="CantFetchInventoryForGroupNotice"> + No se pueden obtener los datos de inventario del aviso de grupo. + </notification> + <notification name="CantSendGroupNoticeNotPermitted"> + No se puede enviar el aviso de grupo: no está permitido. + </notification> + <notification name="CantSendGroupNoticeCantConstructInventory"> + No se puede enviar el aviso del grupo: el inventario no se puede construir. + </notification> + <notification name="CantParceInventoryInNotice"> + No se puede analizar el inventario del aviso. + </notification> + <notification name="TerrainUploadFailed"> + Error al subir terreno. + </notification> + <notification name="TerrainFileWritten"> + Se ha registrado el archivo de terreno. + </notification> + <notification name="TerrainFileWrittenStartingDownload"> + Archivo de terreno registrado, iniciando la descarga... + </notification> + <notification name="TerrainBaked"> + Terreno predeterminado. + </notification> + <notification name="TenObjectsDisabledPlzRefresh"> + Solamente se han desactivado los 10 primeros objetos seleccionados. Si es preciso, actualiza y selecciona otros objetos. + </notification> + <notification name="UpdateViewerBuyParcel"> + Para comprar esta parcela debes actualizar el visor. + </notification> + <notification name="CantBuyParcelNotForSale"> + Error al comprar: esta parcela no está en venta. + </notification> + <notification name="CantBuySalePriceOrLandAreaChanged"> + No se puede comprar: el precio de venta o la superficie del terreno han cambiado. + </notification> + <notification name="CantBuyParcelNotAuthorized"> + No eres el comprador autorizado de esta parcela. + </notification> + <notification name="CantBuyParcelAwaitingPurchaseAuth"> + No puedes comprar esta parcela porque ya está en espera de una autorización de compra + </notification> + <notification name="CantBuildOverflowParcel"> + No se pueden construir objetos aquà porque se desbordarÃa la parcela. + </notification> + <notification name="SelectedMultipleOwnedLand"> + Has seleccionado un terreno con propietarios diferentes. Selecciona un área más pequeña y repite la operación. + </notification> + <notification name="CantJoinTooFewLeasedParcels"> + La selección no contiene suficientes parcelas alquiladas para unirlas. + </notification> + <notification name="CantDivideLandMultipleParcelsSelected"> + No se puede dividir el terreno.\nHay varias parcelas seleccionadas.\nPrueba a seleccionar un terreno más pequeño. + </notification> + <notification name="CantDivideLandCantFindParcel"> + No se puede dividir el terreno.\nNo se encuentra la parcela.\nAvÃsanos con Ayuda -> Notificar fallo... + </notification> + <notification name="CantDivideLandWholeParcelSelected"> + No se puede dividir el terreno. Está seleccionada la parcela completa.\nPrueba a seleccionar un terreno más pequeño. + </notification> + <notification name="LandHasBeenDivided"> + El terreno se ha dividido. + </notification> + <notification name="PassPurchased"> + Has comprado un pase. + </notification> + <notification name="RegionDisallowsClassifieds"> + La región no permite anuncios. + </notification> + <notification name="LandPassExpireSoon"> + Tu pase para este terreno está a punto de caducar. + </notification> + <notification name="CantSitNoSuitableSurface"> + Esta superficie no es adecuada para sentarse, prueba en otro sitio. + </notification> + <notification name="CantSitNoRoom"> + No hay sitio para sentarse aquÃ, prueba en otro lugar. + </notification> + <notification name="ClaimObjectFailedNoPermission"> + Error al reclamar el objeto: no tienes permiso + </notification> + <notification name="ClaimObjectFailedNoMoney"> + Error al reclamar el objeto: no tienes suficientes L$. + </notification> + <notification name="CantDeedGroupLand"> + No se puede transferir un terreno propiedad de un grupo. + </notification> + <notification name="BuyObjectFailedNoMoney"> + Error al comprar el objeto, no tienes suficientes L$. + </notification> + <notification name="BuyInventoryFailedNoMoney"> + Error al comprar el inventario: no tienes suficientes L$. + </notification> + <notification name="BuyPassFailedNoMoney"> + No tienes suficientes L$ para comprar un pase a este terreno. + </notification> + <notification name="CantBuyPassTryAgain"> + No se puede comprar el pase ahora mismo. Vuelve a intentarlo más tarde. + </notification> + <notification name="CantCreateObjectParcelFull"> + No se puede crear el objeto porque \nla parcela está llena. + </notification> + <notification name="FailedPlacingObject"> + Error al colocar el objeto en el lugar especificado. Vuelve a intentarlo. + </notification> + <notification name="CantCreateLandmarkForEvent"> + No se puede crear un hito para el evento. + </notification> + <notification name="GodBeatsFreeze"> + ¡Tus superpoderes anulan la congelación! + </notification> + <notification name="SpecialPowersRequestFailedLogged"> + Error en la solicitud de poderes especiales. Esta solicitud se ha registrado. + </notification> + <notification name="ExpireExplanation"> + El sistema actualmente no puede procesar tu solicitud. Ha expirado el tiempo de la solicitud. + </notification> + <notification name="DieExplanation"> + El sistema no puede procesar tu solicitud. + </notification> + <notification name="AddPrimitiveFailure"> + Dinero insuficiente para crear la primitiva. + </notification> + <notification name="RezObjectFailure"> + Dinero insuficiente para crear el objeto. + </notification> + <notification name="ResetHomePositionNotLegal"> + Se ha restaurado la posición de origen, puesto que dicha posición no era válida. + </notification> + <notification name="CantInviteRegionFull"> + Actualmente no puedes invitar a nadie a tu ubicación, puesto que la región está llena. Vuelve a intentarlo más tarde. + </notification> + <notification name="CantSetHomeAtRegion"> + Esta región no te permite configurar aquà tu lugar de origen. + </notification> + <notification name="ListValidHomeLocations"> + Tu 'Lugar de origen' solo se puede configurar en tu terreno o en un punto de información del continente. + </notification> + <notification name="SetHomePosition"> + Posición de origen ajustada. + </notification> + <notification name="CantDerezInventoryError"> + No se puede quitar el objeto por un error del inventario. + </notification> + <notification name="CantCreateRequestedInv"> + No se puede crear el inventario solicitado. + </notification> + <notification name="CantCreateRequestedInvFolder"> + No se puede crear la carpeta de inventario solicitada. + </notification> + <notification name="CantCreateInventory"> + No se puede crear el inventario. + </notification> + <notification name="CantCreateLandmark"> + No se puede crear un hito. + </notification> + <notification name="CantCreateOutfit"> + No se puede crear el vestuario en este momento. Prueba otra vez dentro de un minuto. + </notification> + <notification name="InventoryNotForSale"> + El inventario no está en venta. + </notification> + <notification name="CantFindInvItem"> + No se encuentra el objeto del inventario. + </notification> + <notification name="CantFindObject"> + No se puede encontrar el objeto. + </notification> + <notification name="CantTransfterMoneyRegionDisabled"> + En esta región actualmente no están activadas las transferencias de dinero a los objetos. + </notification> + <notification name="CantPayNoAgent"> + No se ha averiguado a quién se debe pagar. + </notification> + <notification name="CantDonateToPublicObjects"> + No se pueden dar L$ a los objetos públicos. + </notification> + <notification name="InventoryCreationInWorldObjectFailed"> + Error al crear un inventario de objeto del mundo virtual. + </notification> + <notification name="UserBalanceOrLandUsageError"> + Un error interno nos ha impedido actualizar tu visor correctamente. El saldo en L$ o las parcelas en propiedad presentadas en el visor podrÃan no coincidir con tu saldo real en los servidores. + </notification> + <notification name="LargePrimAgentIntersect"> + No se pueden crear prims grandes que intersectan a otros jugadores. Reinténtalo cuando se hayan movido otros jugadores. + </notification> + <notification name="PreferenceChatClearLog"> + Esto eliminará los registros de conversaciones anteriores y las copias de seguridad de ese archivo. + <usetemplate ignoretext="Confirmar antes de eliminar el registro de conversaciones anteriores." name="okcancelignore" notext="Cancelar" yestext="OK"/> + </notification> + <notification name="PreferenceChatDeleteTranscripts"> + Esta acción eliminará las transcripciones de todas las conversaciones anteriores. La lista de conversaciones pasadas no resultará afectada. Se eliminarán de la carpeta [FOLDER] todos los archivos que tengan el sufijo .txt y txt.backup. + <usetemplate ignoretext="Confirmar antes de eliminar transcripciones." name="okcancelignore" notext="Cancelar" yestext="OK"/> + </notification> + <notification name="PreferenceChatPathChanged"> + No se pueden mover los archivos. Ruta anterior restaurada. + <usetemplate ignoretext="No se pueden mover los archivos. Ruta anterior restaurada." name="okignore" yestext="OK"/> + </notification> </notifications> diff --git a/indra/newview/skins/default/xui/es/panel_avatar_list_item.xml b/indra/newview/skins/default/xui/es/panel_avatar_list_item.xml index 5220df5d21..c73e34b299 100644 --- a/indra/newview/skins/default/xui/es/panel_avatar_list_item.xml +++ b/indra/newview/skins/default/xui/es/panel_avatar_list_item.xml @@ -26,5 +26,6 @@ <icon name="permission_edit_mine_icon" tool_tip="Este amigo puede editar, eliminar o manipular tus objetos"/> <icon name="permission_map_icon" tool_tip="Este amigo puede encontrarte en el mapa"/> <icon name="permission_online_icon" tool_tip="Este amigo puede ver cuándo estás conectado"/> + <button name="info_btn" tool_tip="Más información"/> <button name="profile_btn" tool_tip="Ver el perfil"/> </panel> diff --git a/indra/newview/skins/default/xui/es/panel_block_list_sidetray.xml b/indra/newview/skins/default/xui/es/panel_block_list_sidetray.xml index cddbad1195..a3de14ae67 100644 --- a/indra/newview/skins/default/xui/es/panel_block_list_sidetray.xml +++ b/indra/newview/skins/default/xui/es/panel_block_list_sidetray.xml @@ -1,10 +1,11 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="block_list_panel"> - <text name="title_text"> - Lista de ignorados - </text> - <scroll_list name="blocked" tool_tip="Lista de los residentes ignorados actualmente"/> - <button label="Ignorar al residente..." label_selected="Ignorar al residente..." name="Block resident..." tool_tip="Elige a un Residente para ignorarle"/> - <button label="Ignorar objetos según el nombre..." label_selected="Ignorar objetos según el nombre..." name="Block object by name..."/> - <button label="No ignorar" label_selected="No ignorar" name="Unblock" tool_tip="Quita al Residente o al objeto de la lista de ignorados"/> + <panel label="bottom_panel" name="blocked_buttons_panel"> + <filter_editor label="Filtro" name="blocked_filter_input"/> + <menu_button name="blocked_gear_btn" tool_tip="Acciones en la persona o el objeto seleccionado"/> + <menu_button name="view_btn" tool_tip="Opciones de clasificación"/> + <menu_button name="plus_btn" tool_tip="Elige un residente o un objeto para ignorarlo"/> + <button name="unblock_btn" tool_tip="Quita al Residente o al objeto de la lista de ignorados"/> + </panel> + <block_list name="blocked" tool_tip="Lista de los residentes ignorados actualmente"/> </panel> diff --git a/indra/newview/skins/default/xui/es/panel_conversation_list_item.xml b/indra/newview/skins/default/xui/es/panel_conversation_list_item.xml new file mode 100644 index 0000000000..cc4a7e951d --- /dev/null +++ b/indra/newview/skins/default/xui/es/panel_conversation_list_item.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="conversation_list_item"> + <layout_stack name="conversation_item_stack"> + <layout_panel name="conversation_title_panel"> + <text name="conversation_title" value="(cargando)"/> + </layout_panel> + </layout_stack> +</panel> diff --git a/indra/newview/skins/default/xui/es/panel_conversation_log_list_item.xml b/indra/newview/skins/default/xui/es/panel_conversation_log_list_item.xml new file mode 100644 index 0000000000..2fc8cd3aff --- /dev/null +++ b/indra/newview/skins/default/xui/es/panel_conversation_log_list_item.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="conversation_log_list_item"> + <icon name="voice_session_icon" tool_tip="La conversación incluÃa voz"/> + <icon name="unread_ims_icon" tool_tip="Han llegado mensajes mientras no tenÃas conexión"/> + <button name="delete_btn" tool_tip="Quitar esta entrada"/> +</panel> diff --git a/indra/newview/skins/default/xui/es/panel_group_list_item.xml b/indra/newview/skins/default/xui/es/panel_group_list_item.xml index 5c9f1c3688..4d682068d7 100644 --- a/indra/newview/skins/default/xui/es/panel_group_list_item.xml +++ b/indra/newview/skins/default/xui/es/panel_group_list_item.xml @@ -1,5 +1,6 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="group_list_item"> <text name="group_name" value="Desconocido"/> + <button name="info_btn" tool_tip="Más información"/> <button name="profile_btn" tool_tip="Ver el perfil"/> </panel> diff --git a/indra/newview/skins/default/xui/es/panel_people.xml b/indra/newview/skins/default/xui/es/panel_people.xml index a9d38dca25..7a7dfca0b8 100644 --- a/indra/newview/skins/default/xui/es/panel_people.xml +++ b/indra/newview/skins/default/xui/es/panel_people.xml @@ -14,81 +14,53 @@ <string name="no_filtered_friends_msg"> ¿No encuentras lo que buscas? Prueba con [secondlife:///app/search/people/[SEARCH_TERM] Buscar]. </string> - <string name="people_filter_label" value="Filtrar a la gente"/> - <string name="groups_filter_label" value="Filtrar a los grupos"/> <string name="no_filtered_groups_msg" value="¿No encuentras lo que buscas? Prueba con [secondlife:///app/search/groups/[SEARCH_TERM] Buscar]."/> <string name="no_groups_msg" value="¿Buscas grupos en que participar? Prueba la [secondlife:///app/search/groups Búsqueda]."/> <string name="MiniMapToolTipMsg" value="[REGION](Pulsa dos veces para abrir el mapa, pulsa mayús y arrastra para obtener una panorámica)"/> <string name="AltMiniMapToolTipMsg" value="[REGION](Pulsa dos veces para teleportarte, pulsa mayús y arrastra para obtener una panorámica)"/> - <filter_editor label="Filtrar" name="filter_input"/> <tab_container name="tabs"> <panel label="CERCANA" name="nearby_panel"> - <panel label="bottom_panel" name="bottom_panel"> - <menu_button name="nearby_view_sort_btn" tool_tip="Opciones"/> - <button name="add_friend_btn" tool_tip="Añadir al Residente seleccionado a la lista de tus amigos"/> + <panel label="bottom_panel" name="nearby_buttons_panel"> + <filter_editor label="Filtrar la gente" name="nearby_filter_input"/> + <button name="gear_btn" tool_tip="Acciones en la persona seleccionada"/> + <menu_button name="nearby_view_btn" tool_tip="Opciones de vista/orden"/> + <button name="add_friend_btn" tool_tip="Ofrecer amistad a un residente"/> + <dnd_button name="nearby_del_btn" tool_tip="Quitar la persona seleccionada de la lista de amigos"/> </panel> </panel> - <panel label="MIS AMIGOS" name="friends_panel"> + <panel label="AMIGOS" name="friends_panel"> + <panel label="bottom_panel" name="friends_buttons_panel"> + <filter_editor label="Filtrar la gente" name="friends_filter_input"/> + <button name="gear_btn" tool_tip="Acciones en la persona seleccionada"/> + <menu_button name="friends_view_btn" tool_tip="Opciones de vista/orden"/> + <button name="friends_add_btn" tool_tip="Ofrecer amistad a un residente"/> + <dnd_button name="friends_del_btn" tool_tip="Quitar la persona seleccionada de la lista de amigos"/> + </panel> <accordion name="friends_accordion"> <accordion_tab name="tab_online" title="Conectado"/> <accordion_tab name="tab_all" title="Todos"/> </accordion> - <panel label="bottom_panel" name="bottom_panel"> - <layout_stack name="bottom_panel"> - <layout_panel name="options_gear_btn_panel"> - <menu_button name="friends_viewsort_btn" tool_tip="Ver más opciones"/> - </layout_panel> - <layout_panel name="add_btn_panel"> - <button name="add_btn" tool_tip="Ofrecer amistad a un Residente"/> - </layout_panel> - <layout_panel name="trash_btn_panel"> - <dnd_button name="del_btn" tool_tip="Quitar a la persona seleccionada de tu lista de amigos"/> - </layout_panel> - </layout_stack> - </panel> </panel> - <panel label="MIS GRUPOS" name="groups_panel"> - <panel label="bottom_panel" name="bottom_panel"> - <menu_button name="groups_viewsort_btn" tool_tip="Opciones"/> - <button name="plus_btn" tool_tip="Entrar en un grupo o crear uno"/> - <button name="activate_btn" tool_tip="Activar el grupo seleccionado"/> + <panel label="GRUPOS" name="groups_panel"> + <panel label="bottom_panel" name="groups_buttons_panel"> + <filter_editor label="Filtrar los grupos" name="groups_filter_input"/> + <menu_button name="groups_gear_btn" tool_tip="Acciones en el grupo seleccionado"/> + <menu_button name="groups_view_btn" tool_tip="Opciones de vista/orden"/> + <menu_button name="plus_btn" tool_tip="Entrar en un grupo o crear uno"/> + <dnd_button name="minus_btn" tool_tip="Dejar el grupo seleccionado"/> </panel> </panel> <panel label="RECIENTE" name="recent_panel"> - <panel label="bottom_panel" name="bottom_panel"> - <menu_button name="recent_viewsort_btn" tool_tip="Opciones"/> - <button name="add_friend_btn" tool_tip="Añadir al Residente seleccionado a la lista de tus amigos"/> + <panel label="bottom_panel" name="recent_buttons_panel"> + <filter_editor label="Filtrar la gente" name="recent_filter_input"/> + <button name="gear_btn" tool_tip="Acciones en la persona seleccionada"/> + <menu_button name="recent_view_btn" tool_tip="Opciones de vista/orden"/> + <button name="add_friend_btn" tool_tip="Ofrecer amistad a un residente"/> + <dnd_button name="recent_del_btn" tool_tip="Quitar la persona seleccionada de la lista de amigos"/> </panel> </panel> + <panel label="BLOQUEADO" name="blocked_panel"> + <panel label="Residentes y objetos ignorados" name="panel_block_list_sidetray"/> + </panel> </tab_container> - <panel name="button_bar"> - <layout_stack name="bottom_bar_ls"> - <layout_panel name="view_profile_btn_lp"> - <button label="Perfil" name="view_profile_btn" tool_tip="Mostrar imágenes, grupos y otra información del Residente"/> - </layout_panel> - <layout_panel name="im_btn_lp"> - <button label="MI" name="im_btn" tool_tip="Abrir una sesión de mensajes instantáneos"/> - </layout_panel> - <layout_panel name="call_btn_lp"> - <button label="Llamar" name="call_btn" tool_tip="Llamar a este Residente"/> - </layout_panel> - <layout_panel name="share_btn_lp"> - <button label="Compartir" name="share_btn" tool_tip="Compartir un objeto del inventario"/> - </layout_panel> - <layout_panel name="teleport_btn_lp"> - <button label="Teleporte" name="teleport_btn" tool_tip="Ofrecer teleporte"/> - </layout_panel> - </layout_stack> - <layout_stack name="bottom_bar_ls1"> - <layout_panel name="group_info_btn_lp"> - <button label="Perfil del grupo" name="group_info_btn" tool_tip="Ver la información del grupo"/> - </layout_panel> - <layout_panel name="chat_btn_lp"> - <button label="Chat de grupo" name="chat_btn" tool_tip="Abrir el chat"/> - </layout_panel> - <layout_panel name="group_call_btn_lp"> - <button label="Llamar al grupo" name="group_call_btn" tool_tip="Llama a este grupo"/> - </layout_panel> - </layout_stack> - </panel> </panel> diff --git a/indra/newview/skins/default/xui/es/panel_preferences_chat.xml b/indra/newview/skins/default/xui/es/panel_preferences_chat.xml index b0b6114e88..28bc98f988 100644 --- a/indra/newview/skins/default/xui/es/panel_preferences_chat.xml +++ b/indra/newview/skins/default/xui/es/panel_preferences_chat.xml @@ -1,34 +1,86 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel label="Chat de texto" name="chat"> - <text name="font_size"> - Tamaño de la fuente: - </text> - <radio_group name="chat_font_size"> - <radio_item label="Disminuir" name="radio" value="0"/> - <radio_item label="Medio" name="radio2" value="1"/> - <radio_item label="Aumentar" name="radio3" value="2"/> - </radio_group> - <check_box initial_value="true" label="Ejecutar la animación de escribir al hacerlo en el chat" name="play_typing_animation"/> - <check_box label="Cuando estoy desconectado, enviarme los MI al correo-e" name="send_im_to_email"/> - <check_box label="Permitir el historial de MI y chat en texto sin formato" name="plain_text_chat_history"/> - <check_box label="Bocadillos del chat" name="bubble_text_chat"/> - <text name="show_ims_in_label"> - Mostrar los MI en: - </text> - <text name="requires_restart_label"> - (requiere reiniciar) - </text> - <radio_group name="chat_window" tool_tip="Muestra tus mensajes instantáneos en varias ventanas flotantes o en una sola con varias pestañas (requiere que reinicies)"> - <radio_item label="Ventanas distintas" name="radio" value="0"/> - <radio_item label="Pestañas" name="radio2" value="1"/> - </radio_group> - <text name="disable_toast_label"> - Permitir ventanas de chat emergentes: - </text> - <check_box label="Chats de grupo" name="EnableGroupChatPopups" tool_tip="Activa esta casilla para ver una ventana emergente cada vez que recibas un mensaje de un grupo de chat"/> - <check_box label="Chats de MI" name="EnableIMChatPopups" tool_tip="Activa esta casilla para ver una ventana emergente cada vez que recibas un mensaje instantáneo"/> - <spinner label="Duración de los interlocutores favoritos:" name="nearby_toasts_lifetime"/> - <spinner label="Tiempo de los otros interlocutores:" name="nearby_toasts_fadingtime"/> + <panel> + <check_box initial_value="true" label="Ejecutar la animación de escribir al hacerlo en el chat" name="play_typing_animation"/> + <check_box label="Cuando estoy desconectado, enviarme los MI al correo-e" name="send_im_to_email"/> + <check_box label="Sólo pueden llamarme o mandarme un MI mis amigos y grupos" name="voice_call_friends_only_check"/> + <text name="font_size"> + Tamaño de la fuente: + </text> + <combo_box name="chat_font_size"> + <item label="Pequeña" name="Small" value="0"/> + <item label="Mediana" name="Medium" value="1"/> + <item label="Grande" name="Large" value="2"/> + </combo_box> + <check_box label="Bocadillos del chat" name="bubble_text_chat"/> + </panel> + <panel> + <text name="notifications"> + Notificaciones + </text> + <text name="friend_ims"> + MI de amigos: + </text> + <combo_box name="FriendIMOptions"> + <item label="Ventana Conversaciones abiertas" name="OpenConversationsWindow" value="openconversations"/> + <item label="Mensaje en ventana emergente" name="PopUpMessage" value="toast"/> + <item label="Botón de la barra de herramientas de Flash" name="FlashToolbarButton" value="flash"/> + <item label="Ninguno" name="None" value="ninguno"/> + </combo_box> + <text name="non_friend_ims"> + MI de no amigos: + </text> + <combo_box name="NonFriendIMOptions"> + <item label="Ventana Conversaciones abiertas" name="OpenConversationsWindow" value="openconversations"/> + <item label="Mensaje en ventana emergente" name="PopUpMessage" value="toast"/> + <item label="Botón de la barra de herramientas de Flash" name="FlashToolbarButton" value="flash"/> + <item label="Ninguno" name="None" value="ninguno"/> + </combo_box> + <text name="conference_ims"> + MI de conferencia: + </text> + <combo_box name="ConferenceIMOptions"> + <item label="Ventana Conversaciones abiertas" name="OpenConversationsWindow" value="openconversations"/> + <item label="Mensaje en ventana emergente" name="PopUpMessage" value="toast"/> + <item label="Botón de la barra de herramientas de Flash" name="FlashToolbarButton" value="flash"/> + <item label="Ninguno" name="None" value="ninguno"/> + </combo_box> + <text name="group_chat"> + Chat de grupo: + </text> + <combo_box name="GroupChatOptions"> + <item label="Ventana Conversaciones abiertas" name="OpenConversationsWindow" value="openconversations"/> + <item label="Mensaje en ventana emergente" name="PopUpMessage" value="toast"/> + <item label="Botón de la barra de herramientas de Flash" name="FlashToolbarButton" value="flash"/> + <item label="Ninguno" name="None" value="ninguno"/> + </combo_box> + <text name="nearby_chat"> + Chat: + </text> + <combo_box name="NearbyChatOptions"> + <item label="Ventana Conversaciones abiertas" name="OpenConversationsWindow" value="openconversations"/> + <item label="Mensaje en ventana emergente" name="PopUpMessage" value="toast"/> + <item label="Botón de la barra de herramientas de Flash" name="FlashToolBarButton" value="flash"/> + <item label="Ninguno" name="None" value="ninguno"/> + </combo_box> + <text name="notifications_alert"> + Para suspender provisionalmente todas las notificaciones, usa Comunicarme > No molestar. + </text> + </panel> + <panel> + <text name="play_sound"> + Reproducir sonido: + </text> + <check_box label="Nueva conversación" name="new_conversation"/> + <check_box label="Llamada de voz entrante" name="incoming_voice_call"/> + <check_box label="Oferta de teleporte" name="teleport_offer"/> + <check_box label="Oferta de inventario" name="inventory_offer"/> + </panel> + <panel> + <button label="Limpiar el registro..." name="clear_log"/> + <button label="Eliminar transcripciones..." name="delete_transcripts"/> + <button label="Examinar..." label_selected="Examinar" name="log_path_button"/> + </panel> <button label="Traducción…" name="ok_btn"/> <button label="Reemplazo automático..." name="autoreplace_showgui"/> <button label="Revisión ortográfica..." name="spellcheck_showgui"/> diff --git a/indra/newview/skins/default/xui/es/panel_preferences_general.xml b/indra/newview/skins/default/xui/es/panel_preferences_general.xml index 4fc163f5b6..98b0081da9 100644 --- a/indra/newview/skins/default/xui/es/panel_preferences_general.xml +++ b/indra/newview/skins/default/xui/es/panel_preferences_general.xml @@ -69,6 +69,9 @@ <combo_box.item label="nunca" name="item4"/> </combo_box> <text name="text_box3"> - Respuesta cuando estoy en modo ocupado: + Respuesta de No molestar: </text> + <text_editor name="do_not_disturb_response"> + log_in_to_change + </text_editor> </panel> diff --git a/indra/newview/skins/default/xui/es/sidepanel_task_info.xml b/indra/newview/skins/default/xui/es/sidepanel_task_info.xml index 9da2958953..cb061796e7 100644 --- a/indra/newview/skins/default/xui/es/sidepanel_task_info.xml +++ b/indra/newview/skins/default/xui/es/sidepanel_task_info.xml @@ -72,6 +72,7 @@ <combo_box.item label="Comprar el objeto" name="Buyobject"/> <combo_box.item label="Pagar el objeto" name="Payobject"/> <combo_box.item label="Abrir" name="Open"/> + <combo_box.item label="Zoom" name="Zoom"/> </combo_box> <panel name="perms_inv"> <text name="perm_modify"> diff --git a/indra/newview/skins/default/xui/es/strings.xml b/indra/newview/skins/default/xui/es/strings.xml index 52bcab54e5..937433e210 100644 --- a/indra/newview/skins/default/xui/es/strings.xml +++ b/indra/newview/skins/default/xui/es/strings.xml @@ -128,7 +128,7 @@ Salir </string> <string name="create_account_url"> - http://join.secondlife.com/index.php?lang=es-ES&sourceid=[sourceid] + http://join.secondlife.com/?sourceid=[sourceid] </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: @@ -610,8 +610,8 @@ Intenta iniciar sesión de nuevo en unos instantes. <string name="AvatarAway"> Ausente </string> - <string name="AvatarBusy"> - Ocupado + <string name="AvatarDoNotDisturb"> + No molestar </string> <string name="AvatarMuted"> Ignorado @@ -844,6 +844,12 @@ Intenta iniciar sesión de nuevo en unos instantes. <string name="ST_NO_JOINT"> No se puede encontrar ROOT o JOINT. </string> + <string name="NearbyChatTitle"> + Chat + </string> + <string name="NearbyChatLabel"> + (Chat) + </string> <string name="whisper"> susurra: </string> @@ -907,6 +913,9 @@ Intenta iniciar sesión de nuevo en unos instantes. <string name="ControlYourCamera"> Controlar su cámara </string> + <string name="AgentNameSubst"> + (Tú) + </string> <string name="TeleportYourAgent"> Teleportarte </string> @@ -991,18 +1000,6 @@ Intenta iniciar sesión de nuevo en unos instantes. <string name="dictionary_files"> Diccionarios </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> @@ -1959,8 +1956,8 @@ Intenta iniciar sesión de nuevo en unos instantes. <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 name="DoNotDisturbModeResponseDefault"> + Este residente tiene activado 'No molestar' y verá tu mensaje más tarde. </string> <string name="MuteByName"> (Por el nombre) @@ -2073,9 +2070,6 @@ Intenta iniciar sesión de nuevo en unos instantes. <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> @@ -3793,7 +3787,7 @@ Si sigues recibiendo este mensaje, contacta con [SUPPORT_SITE]. Región General </string> <string name="LocationCtrlSeeAVsTooltip"> - Los avatares están visibles y está permitido el chat fuera de esta parcela + Los avatares que están en esta parcela no pueden ser vistos ni escuchados por los que están fuera de ella </string> <string name="LocationCtrlPathfindingDirtyTooltip"> Los objetos que se mueven pueden presentar un comportamiento incorrecto en la región hasta que ésta se recargue. @@ -3867,6 +3861,12 @@ Si sigues recibiendo este mensaje, contacta con [SUPPORT_SITE]. <string name="Saved_message"> (Guardado [LONG_TIMESTAMP]) </string> + <string name="OnlineStatus"> + Conectado/a + </string> + <string name="OfflineStatus"> + Desconectado/a + </string> <string name="answered_call"> Han respondido a tu llamada </string> @@ -3876,6 +3876,9 @@ Si sigues recibiendo este mensaje, contacta con [SUPPORT_SITE]. <string name="you_joined_call"> Has entrado en la llamada de voz </string> + <string name="you_auto_rejected_call-im"> + Rechazaste la llamada de voz automáticamente porque estaba activado 'No molestar'. + </string> <string name="name_started_call"> [NAME] inició una llamada de voz </string> @@ -3888,6 +3891,9 @@ Si sigues recibiendo este mensaje, contacta con [SUPPORT_SITE]. <string name="hang_up-im"> Se colgó la llamada de voz </string> + <string name="conference-title"> + Chat multi-persona + </string> <string name="conference-title-incoming"> Conferencia con [AGENT_NAME] </string> @@ -4766,6 +4772,9 @@ Inténtalo incluyendo la ruta de acceso al editor entre comillas <string name="Command_Chat_Label"> Chat </string> + <string name="Command_Conversations_Label"> + Conversaciones + </string> <string name="Command_Compass_Label"> Brújula </string> @@ -4841,6 +4850,9 @@ Inténtalo incluyendo la ruta de acceso al editor entre comillas <string name="Command_Chat_Tooltip"> Habla por chat de texto con las personas próximas </string> + <string name="Command_Conversations_Tooltip"> + Conversar con todos + </string> <string name="Command_Compass_Tooltip"> Brújula </string> @@ -4970,4 +4982,13 @@ Inténtalo incluyendo la ruta de acceso al editor entre comillas <string name="UserDictionary"> [Usuario] </string> + <string name="logging_calls_disabled_log_empty"> + No se están registrando las conversaciones. Para empezar a grabar un registro, elige "Guardar: Solo registro" o "Guardar: Registro y transcripciones" en Preferencias > Chat. + </string> + <string name="logging_calls_disabled_log_not_empty"> + No se registrarán más conversaciones. Para reanudar la grabación de un registro, elige "Guardar: Solo registro" o "Guardar: Registro y transcripciones" en Preferencias > Chat. + </string> + <string name="logging_calls_enabled_log_empty"> + No hay conversaciones grabadas. Después de contactar con una persona, o de que alguien contacte contigo, aquà se mostrará una entrada de registro. + </string> </strings> diff --git a/indra/newview/skins/default/xui/fr/floater_conversation_log.xml b/indra/newview/skins/default/xui/fr/floater_conversation_log.xml new file mode 100644 index 0000000000..e9017c79b1 --- /dev/null +++ b/indra/newview/skins/default/xui/fr/floater_conversation_log.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="floater_conversation_log" title="JOURNAL DES CONVERSATIONS"> + <panel name="buttons_panel"> + <filter_editor label="Filtrer les personnes" name="people_filter_input"/> + <menu_button name="conversation_view_btn" tool_tip="Options d'affichage/de tri"/> + <menu_button name="conversations_gear_btn" tool_tip="Actions sur la personne ou le groupe sélectionné"/> + </panel> +</floater> diff --git a/indra/newview/skins/default/xui/fr/floater_conversation_preview.xml b/indra/newview/skins/default/xui/fr/floater_conversation_preview.xml new file mode 100644 index 0000000000..9a486a84c6 --- /dev/null +++ b/indra/newview/skins/default/xui/fr/floater_conversation_preview.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="preview_conversation" title="CONVERSATION:"> + <floater.string name="Title"> + CONVERSATION: [NAME] + </floater.string> + <text name="page_label" value="Page"/> +</floater> diff --git a/indra/newview/skins/default/xui/fr/floater_im_container.xml b/indra/newview/skins/default/xui/fr/floater_im_container.xml index 5ea073365e..f0b17e8437 100644 --- a/indra/newview/skins/default/xui/fr/floater_im_container.xml +++ b/indra/newview/skins/default/xui/fr/floater_im_container.xml @@ -1,2 +1,29 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<multi_floater name="floater_im_box" title="CONVERSATIONS"/> +<multi_floater name="floater_im_box" title="CONVERSATIONS"> + <string name="collapse_icon" value="Conv_toolbar_collapse"/> + <string name="expand_icon" value="Conv_toolbar_expand"/> + <layout_stack name="conversations_stack"> + <layout_panel name="conversations_layout_panel"> + <layout_stack name="conversations_pane_buttons_stack"> + <layout_panel name="conversations_pane_buttons_expanded"> + <menu_button name="sort_btn" tool_tip="Options d'affichage/de tri"/> + <button name="add_btn" tool_tip="Commencer une nouvelle conversation"/> + <button name="speak_btn" tool_tip="Parler aux personnes en utilisant votre micro"/> + </layout_panel> + <layout_panel name="conversations_pane_buttons_collapsed"> + <button name="expand_collapse_btn" tool_tip="Réduire/Développer cette liste"/> + </layout_panel> + </layout_stack> + </layout_panel> + <layout_panel name="messages_layout_panel"> + <panel_container name="im_box_tab_container"> + <panel name="stub_panel"> + <button name="stub_collapse_btn" tool_tip="Réduire ce panneau"/> + <text name="stub_textbox"> + Cette conversation s'affiche dans une fenêtre distincte. [secondlife:/// la rattacher.] + </text> + </panel> + </panel_container> + </layout_panel> + </layout_stack> +</multi_floater> diff --git a/indra/newview/skins/default/xui/fr/floater_im_session.xml b/indra/newview/skins/default/xui/fr/floater_im_session.xml index 516eb41362..8ab98b8e4e 100644 --- a/indra/newview/skins/default/xui/fr/floater_im_session.xml +++ b/indra/newview/skins/default/xui/fr/floater_im_session.xml @@ -1,8 +1,59 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="panel_im"> - <layout_stack name="im_panels"> - <layout_panel> - <line_editor label="À" name="chat_editor"/> - </layout_panel> - </layout_stack> + <floater.string name="call_btn_start"> + Conv_toolbar_open_call + </floater.string> + <floater.string name="call_btn_stop"> + Conv_toolbar_hang_up + </floater.string> + <floater.string name="collapseline_icon" value="Conv_collapse_to_one_line"/> + <floater.string name="expandline_icon" value="Conv_expand_one_line"/> + <floater.string name="collapse_icon" value="Conv_toolbar_collapse"/> + <floater.string name="expand_icon" value="Conv_toolbar_expand"/> + <floater.string name="tear_off_icon" value="Conv_toolbar_arrow_ne"/> + <floater.string name="return_icon" value="Conv_toolbar_arrow_sw"/> + <floater.string name="participant_added" value="[NAME] a été invité à la conversation."/> + <floater.string name="multiple_participants_added" value="[NAME] ont été invités à la conversation."/> + <floater.string name="tooltip_to_separate_window" value="Déplacer cette conversation dans une fenêtre distincte"/> + <floater.string name="tooltip_to_main_window" value="Replacer cette conversation dans la fenêtre principale"/> + <floater.string name="start_call_button_tooltip" value="Ouvrir une connexion vocale"/> + <floater.string name="end_call_button_tooltip" value="Fermer la connexion vocale"/> + <floater.string name="expcol_button_not_tearoff_tooltip" value="Réduire ce panneau"/> + <floater.string name="expcol_button_tearoff_and_expanded_tooltip" value="Réduire la liste des participants"/> + <floater.string name="expcol_button_tearoff_and_collapsed_tooltip" value="Développer la liste des participants"/> + <view name="contents_view"> + <layout_stack name="main_stack"> + <layout_panel name="toolbar_panel"> + <menu_button name="view_options_btn" tool_tip="Options d'affichage/de tri"/> + <menu_button name="gear_btn" tool_tip="Actions sur la personne sélectionnée"/> + <button name="add_btn" tool_tip="Ajouter un participant à cette conversation"/> + <button name="voice_call_btn" tool_tip="Ouvrir une connexion vocale"/> + <button name="close_btn" tool_tip="Mettre fin à cette conversation"/> + <button name="expand_collapse_btn" tool_tip="Réduire/Développer ce panneau"/> + </layout_panel> + <layout_panel name="body_panel"> + <layout_stack name="im_panels"> + <layout_panel name="right_part_holder"> + <panel name="trnsAndChat_panel"> + <layout_stack name="translate_and_chat_stack"> + <layout_panel name="translate_chat_checkbox_lp"> + <check_box label="Traduire le chat" name="translate_chat_checkbox"/> + </layout_panel> + </layout_stack> + </panel> + </layout_panel> + </layout_stack> + </layout_panel> + <layout_panel name="chat_layout_panel"> + <layout_stack name="input_panels"> + <layout_panel name="input_editor_layout_panel"> + <chat_editor label="À" name="chat_editor"/> + </layout_panel> + <layout_panel name="input_button_layout_panel"> + <button name="minz_btn" tool_tip="Affiche/Masque le panneau des messages"/> + </layout_panel> + </layout_stack> + </layout_panel> + </layout_stack> + </view> </floater> diff --git a/indra/newview/skins/default/xui/fr/floater_incoming_call.xml b/indra/newview/skins/default/xui/fr/floater_incoming_call.xml index 7594eec5f2..9e6946ba9e 100644 --- a/indra/newview/skins/default/xui/fr/floater_incoming_call.xml +++ b/indra/newview/skins/default/xui/fr/floater_incoming_call.xml @@ -10,7 +10,7 @@ anonyme </floater.string> <floater.string name="VoiceInviteP2P"> - appelle. + vous appelle. </floater.string> <floater.string name="VoiceInviteAdHoc"> a rejoint un chat vocal avec conférence. @@ -25,9 +25,9 @@ Voulez-vous quitter [CURRENT_CHAT] et rejoindre ce chat vocal ? </floater.string> <text name="question"> - Voulez-vous quitter [CURRENT_CHAT] et rejoindre ce chat vocal ? + Si vous répondez, vous serez déconnecté de votre conversation vocale actuelle. </text> - <button label="Accepter" label_selected="Accepter" name="Accept"/> - <button label="Refuser" label_selected="Refuser" name="Reject"/> - <button label="Lancer IM" name="Start IM"/> + <button label="Répondre" label_selected="Répondre" name="Accept"/> + <button label="Ignorer" label_selected="Ignorer" name="Reject"/> + <button label="Ouvrir IM à la place" name="Start IM"/> </floater> diff --git a/indra/newview/skins/default/xui/fr/floater_pathfinding_console.xml b/indra/newview/skins/default/xui/fr/floater_pathfinding_console.xml index 02d969dc08..0bcf55aba5 100644 --- a/indra/newview/skins/default/xui/fr/floater_pathfinding_console.xml +++ b/indra/newview/skins/default/xui/fr/floater_pathfinding_console.xml @@ -71,7 +71,7 @@ <text name="show_label"> Afficher : </text> - <check_box label="Monde" name="show_world"/> + <check_box label="Test" name="show_world"/> <check_box label="Mobiles uniquement" name="show_world_movables_only"/> <check_box label="Maillage de navigation" name="show_navmesh"/> <text name="show_walkability_label"> 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 f86c1a4217..eace67026c 100644 --- a/indra/newview/skins/default/xui/fr/floater_texture_ctrl.xml +++ b/indra/newview/skins/default/xui/fr/floater_texture_ctrl.xml @@ -20,7 +20,7 @@ <button label="Vierge" label_selected="Vierge" name="Blank" width="60"/> <button label="Aucune" label_selected="Aucune" left="68" name="None" width="60"/> <button bottom="-240" label="" label_selected="" name="Pipette"/> - <check_box initial_value="true" label="Aperçu direct" name="apply_immediate_check"/> + <check_box initial_value="true" label="Appliquer maintenant" name="apply_immediate_check"/> <text name="preview_disabled" value="Aperçu désactivé"/> <filter_editor label="Filtrer les textures" name="inventory search editor"/> <check_box initial_value="false" label="Afficher les dossiers" name="show_folders_check"/> diff --git a/indra/newview/skins/default/xui/fr/floater_voice_chat_volume.xml b/indra/newview/skins/default/xui/fr/floater_voice_chat_volume.xml new file mode 100644 index 0000000000..f4f452eea7 --- /dev/null +++ b/indra/newview/skins/default/xui/fr/floater_voice_chat_volume.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="floater_voice_volume" title="VOLUME DU CHAT VOCAL"> + <slider label="Chat vocal" name="chat_voice_volume"/> +</floater> diff --git a/indra/newview/skins/default/xui/fr/floater_voice_effect.xml b/indra/newview/skins/default/xui/fr/floater_voice_effect.xml index 671fb5c14d..f9a76d127e 100644 --- a/indra/newview/skins/default/xui/fr/floater_voice_effect.xml +++ b/indra/newview/skins/default/xui/fr/floater_voice_effect.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater label="Endroits" name="voice_effects" title="EFFET DE VOIX"> +<floater label="Endroits" name="voice_effects" title="APERÇU DES EFFETS DE VOIX"> <string name="no_voice_effect"> (Aucun effet de voix) </string> diff --git a/indra/newview/skins/default/xui/fr/floater_voice_volume.xml b/indra/newview/skins/default/xui/fr/floater_voice_volume.xml new file mode 100644 index 0000000000..bf91a5bb79 --- /dev/null +++ b/indra/newview/skins/default/xui/fr/floater_voice_volume.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<!-- + Not can_close / no title to avoid window chrome + Single instance - only have one at a time, recycle it each spawn +--> +<floater name="floater_voice_volume" title="VOLUME DE LA VOIX"> + <slider name="volume_slider" tool_tip="Volume de la voix" value="0.5"/> +</floater> diff --git a/indra/newview/skins/default/xui/fr/menu_cof_gear.xml b/indra/newview/skins/default/xui/fr/menu_cof_gear.xml index 8276d57025..fea0486d8a 100644 --- a/indra/newview/skins/default/xui/fr/menu_cof_gear.xml +++ b/indra/newview/skins/default/xui/fr/menu_cof_gear.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<menu name="Gear COF"> +<toggleable_menu name="Gear COF"> <menu label="Nouveaux habits" name="COF.Gear.New_Clothes"/> - <menu label="Nouvelles parties du corps" name="COF.Geear.New_Body_Parts"/> -</menu> + <menu label="Nouvelles parties du corps" name="COF.Gear.New_Body_Parts"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/fr/menu_conversation.xml b/indra/newview/skins/default/xui/fr/menu_conversation.xml new file mode 100644 index 0000000000..857ead603b --- /dev/null +++ b/indra/newview/skins/default/xui/fr/menu_conversation.xml @@ -0,0 +1,31 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_conversation_participant"> + <menu_item_call label="Fermer la conversation" name="close_conversation"/> + <menu_item_call label="Ouvrir une conversation vocale" name="open_voice_conversation"/> + <menu_item_call label="Se déconnecter de la conversation et du canal vocal" name="disconnect_from_voice"/> + <menu_item_call label="Voir le profil" name="view_profile"/> + <menu_item_call label="IM" name="im"/> + <menu_item_call label="Proposer une téléportation." name="offer_teleport"/> + <menu_item_call label="Appel" name="voice_call"/> + <menu_item_call label="Historique du chat..." name="chat_history"/> + <menu_item_call label="Devenir amis" name="add_friend"/> + <menu_item_call label="Supprimer cet ami" name="remove_friend"/> + <menu_item_call label="Supprimer ces amis" name="remove_friends"/> + <menu_item_call label="Inviter dans le groupe..." name="invite_to_group"/> + <menu_item_call label="Zoomer en avant" name="zoom_in"/> + <menu_item_call label="Carte" name="map"/> + <menu_item_call label="Partager" name="share"/> + <menu_item_call label="Payer" name="pay"/> + <menu_item_check label="Bloquer le chat vocal" name="block_unblock"/> + <menu_item_check label="Ignorer le texte" name="MuteText"/> + <menu_item_call label="Profil du groupe" name="group_profile"/> + <menu_item_call label="Activer le groupe" name="activate_group"/> + <menu_item_call label="Quitter le groupe" name="leave_group"/> + <context_menu label="Options du modérateur" name="Moderator Options"> + <menu_item_check label="Autoriser les chats écrits" name="AllowTextChat"/> + <menu_item_call label="Ignorer ce participant" name="ModerateVoiceMuteSelected"/> + <menu_item_call label="Ne plus ignorer ce participant" name="ModerateVoiceUnMuteSelected"/> + <menu_item_call label="Ignorer les autres" name="ModerateVoiceMute"/> + <menu_item_call label="Ne plus ignorer les autres" name="ModerateVoiceUnmute"/> + </context_menu> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/fr/menu_conversation_log_gear.xml b/indra/newview/skins/default/xui/fr/menu_conversation_log_gear.xml new file mode 100644 index 0000000000..4e7e84199d --- /dev/null +++ b/indra/newview/skins/default/xui/fr/menu_conversation_log_gear.xml @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="Conversation Context Menu"> + <menu_item_call label="IM..." name="IM"/> + <menu_item_call label="Appel..." name="Call"/> + <menu_item_call label="Ouvrir l'historique du chat..." name="Chat history"/> + <menu_item_call label="Voir le profil" name="View Profile"/> + <menu_item_call label="Téléporter" name="teleport"/> + <menu_item_call label="Devenir amis" name="add_friend"/> + <menu_item_call label="Supprimer cet ami" name="remove_friend"/> + <menu_item_call label="Inviter dans le groupe..." name="Invite"/> + <menu_item_call label="Carte" name="Map"/> + <menu_item_call label="Partager" name="Share"/> + <menu_item_call label="Payer" name="Pay"/> + <menu_item_check label="Ignorer/Ne plus ignorer" name="Block/Unblock"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/fr/menu_conversation_log_view.xml b/indra/newview/skins/default/xui/fr/menu_conversation_log_view.xml new file mode 100644 index 0000000000..c515a8e8e5 --- /dev/null +++ b/indra/newview/skins/default/xui/fr/menu_conversation_log_view.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_conversation_view"> + <menu_item_check label="Trier par nom" name="sort_by_name"/> + <menu_item_check label="Trier par date" name="sort_by_date"/> + <menu_item_check label="Trier avec les amis en haut" name="sort_by_friends"/> + <menu_item_call label="Afficher l'historique du Chat près de moi" name="view_nearby_chat_history"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/fr/menu_im_conversation.xml b/indra/newview/skins/default/xui/fr/menu_im_conversation.xml new file mode 100644 index 0000000000..1ec5910c8f --- /dev/null +++ b/indra/newview/skins/default/xui/fr/menu_im_conversation.xml @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="Conversation Gear Menu"> + <menu_item_call label="Voir le profil" name="View Profile"/> + <menu_item_call label="Devenir amis" name="Add Friend"/> + <menu_item_call label="Supprimer cet ami" name="remove_friend"/> + <menu_item_call label="Proposer une téléportation." name="offer_teleport"/> + <menu_item_call label="Inviter dans le groupe..." name="invite_to_group"/> + <menu_item_call label="Historique du chat..." name="chat_history"/> + <menu_item_call label="Zoomer en avant" name="zoom_in"/> + <menu_item_call label="Carte" name="map"/> + <menu_item_call label="Partager" name="Share"/> + <menu_item_call label="Payer" name="Pay"/> + <menu_item_check label="Bloquer le chat vocal" name="Block/Unblock"/> + <menu_item_check label="Ignorer le texte" name="MuteText"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/fr/menu_im_session_showmodes.xml b/indra/newview/skins/default/xui/fr/menu_im_session_showmodes.xml new file mode 100644 index 0000000000..03a091d1cc --- /dev/null +++ b/indra/newview/skins/default/xui/fr/menu_im_session_showmodes.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_modes"> + <menu_item_check label="Vue compacte" name="compact_view"/> + <menu_item_check label="Vue développée" name="expanded_view"/> + <menu_item_check label="Afficher l’heure" name="IMShowTime"/> + <menu_item_check label="Afficher les noms dans les conversations privées" name="IMShowNamesForP2PConv"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/fr/menu_object_icon.xml b/indra/newview/skins/default/xui/fr/menu_object_icon.xml index 69f8e88a0d..7c94930160 100644 --- a/indra/newview/skins/default/xui/fr/menu_object_icon.xml +++ b/indra/newview/skins/default/xui/fr/menu_object_icon.xml @@ -2,4 +2,6 @@ <menu name="Object Icon Menu"> <menu_item_call label="Profil de l'objet..." name="Object Profile"/> <menu_item_call label="Ignorer..." name="Block"/> + <menu_item_call label="Voir sur la carte" name="show_on_map"/> + <menu_item_call label="Me téléporter à l’emplacement de l'objet" name="teleport_to_object"/> </menu> diff --git a/indra/newview/skins/default/xui/fr/menu_outfit_gear.xml b/indra/newview/skins/default/xui/fr/menu_outfit_gear.xml index b5181f4f82..21b19eded6 100644 --- a/indra/newview/skins/default/xui/fr/menu_outfit_gear.xml +++ b/indra/newview/skins/default/xui/fr/menu_outfit_gear.xml @@ -23,6 +23,8 @@ <menu_item_call label="Nouveaux cheveux" name="New Hair"/> <menu_item_call label="Nouveaux yeux" name="New Eyes"/> </menu> + <menu_item_call label="Développer tous les dossiers" name="expand"/> + <menu_item_call label="Réduire tous les dossiers" name="collapse"/> <menu_item_call label="Renommer la tenue" name="rename"/> <menu_item_call label="Supprimer la tenue" name="delete_outfit"/> </toggleable_menu> diff --git a/indra/newview/skins/default/xui/fr/menu_participant_view.xml b/indra/newview/skins/default/xui/fr/menu_participant_view.xml new file mode 100644 index 0000000000..1811082c84 --- /dev/null +++ b/indra/newview/skins/default/xui/fr/menu_participant_view.xml @@ -0,0 +1,13 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="participant_manu_view"> + <menu_item_check label="Trier les conversations par type" name="sort_sessions_by_type"/> + <menu_item_check label="Trier les conversations par nom" name="sort_sessions_by_name"/> + <menu_item_check label="Trier les conversations par activité récente" name="sort_sessions_by_recent"/> + <menu_item_check label="Trier les participants par nom" name="sort_participants_by_name"/> + <menu_item_check label="Trier les participants par activité récente" name="sort_participants_by_recent"/> + <menu_item_call label="Préférences pour le chat..." name="chat_preferences"/> + <menu_item_call label="Préférences pour la confidentialité" name="privacy_preferences"/> + <menu_item_check label="Journal des conversations..." name="Conversation"/> + <menu_item_check label="Traduire le Chat près de moi" name="Translate_chat"/> + <menu_item_check label="Paramètres de traduction" name="Translation_settings"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/fr/menu_people_blocked_gear.xml b/indra/newview/skins/default/xui/fr/menu_people_blocked_gear.xml new file mode 100644 index 0000000000..47589572c2 --- /dev/null +++ b/indra/newview/skins/default/xui/fr/menu_people_blocked_gear.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_blocked_gear"> + <menu_item_call label="Ne plus ignorer" name="unblock"/> + <menu_item_call label="Profil..." name="profile"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/fr/menu_people_blocked_plus.xml b/indra/newview/skins/default/xui/fr/menu_people_blocked_plus.xml new file mode 100644 index 0000000000..79880dd16d --- /dev/null +++ b/indra/newview/skins/default/xui/fr/menu_people_blocked_plus.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_blocked_plus"> + <menu_item_call label="Ignorer un résident par son nom…" name="block_resident_by_name"/> + <menu_item_call label="Ignorer un objet par son nom" name="block_object_by_name"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/fr/menu_people_blocked_view.xml b/indra/newview/skins/default/xui/fr/menu_people_blocked_view.xml new file mode 100644 index 0000000000..13f1575090 --- /dev/null +++ b/indra/newview/skins/default/xui/fr/menu_people_blocked_view.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_blocked_view"> + <menu_item_check label="Trier par nom" name="sort_by_name"/> + <menu_item_check label="Trier par type" name="sort_by_type"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/fr/menu_people_friends_view.xml b/indra/newview/skins/default/xui/fr/menu_people_friends_view.xml new file mode 100644 index 0000000000..cc81172462 --- /dev/null +++ b/indra/newview/skins/default/xui/fr/menu_people_friends_view.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_group_plus"> + <menu_item_check label="Trier par nom" name="sort_name"/> + <menu_item_check label="Trier par statut" name="sort_status"/> + <menu_item_check label="Afficher les icônes des résidents" name="view_icons"/> + <menu_item_check label="Afficher les droits octroyés" name="view_permissions"/> + <menu_item_check label="Afficher le journal des conversations..." name="view_conversation"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/fr/menu_people_groups.xml b/indra/newview/skins/default/xui/fr/menu_people_groups.xml index eb51b4cf7e..8e32f065fa 100644 --- a/indra/newview/skins/default/xui/fr/menu_people_groups.xml +++ b/indra/newview/skins/default/xui/fr/menu_people_groups.xml @@ -2,7 +2,7 @@ <menu name="menu_group_plus"> <menu_item_call label="Afficher les infos" name="View Info"/> <menu_item_call label="Chat" name="Chat"/> - <menu_item_call label="Appeler" name="Call"/> + <menu_item_call label="Appel" name="Call"/> <menu_item_call label="Activer" name="Activate"/> <menu_item_call label="Quitter" name="Leave"/> </menu> diff --git a/indra/newview/skins/default/xui/fr/menu_people_groups_view.xml b/indra/newview/skins/default/xui/fr/menu_people_groups_view.xml new file mode 100644 index 0000000000..79ede5e22d --- /dev/null +++ b/indra/newview/skins/default/xui/fr/menu_people_groups_view.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_group_plus"> + <menu_item_check label="Afficher les icônes des groupes" name="Display Group Icons"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/fr/menu_people_nearby.xml b/indra/newview/skins/default/xui/fr/menu_people_nearby.xml index 26bd3978a9..6f7d02ef74 100644 --- a/indra/newview/skins/default/xui/fr/menu_people_nearby.xml +++ b/indra/newview/skins/default/xui/fr/menu_people_nearby.xml @@ -1,13 +1,16 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <context_menu name="Avatar Context Menu"> - <menu_item_call label="Voir le profil" name="View Profile"/> - <menu_item_call label="Devenir amis" name="Add Friend"/> - <menu_item_call label="Supprimer cet ami" name="Remove Friend"/> - <menu_item_call label="IM" name="IM"/> - <menu_item_call label="Appeler" name="Call"/> - <menu_item_call label="Carte" name="Map"/> - <menu_item_call label="Partager" name="Share"/> - <menu_item_call label="Payer" name="Pay"/> - <menu_item_check label="Ignorer/Ne plus ignorer" name="Block/Unblock"/> - <menu_item_call label="Proposer une téléportation" name="teleport"/> + <menu_item_call label="Voir le profil" name="view_profile"/> + <menu_item_call label="IM" name="im"/> + <menu_item_call label="Téléporter" name="offer_teleport"/> + <menu_item_call label="Appel" name="voice_call"/> + <menu_item_call label="Afficher l'historique du chat..." name="chat_history"/> + <menu_item_call label="Devenir amis" name="add_friend"/> + <menu_item_call label="Supprimer cet ami" name="remove_friend"/> + <menu_item_call label="Inviter dans le groupe..." name="invite_to_group"/> + <menu_item_call label="Zoomer en avant" name="zoom_in"/> + <menu_item_call label="Carte" name="map"/> + <menu_item_call label="Partager" name="share"/> + <menu_item_call label="Payer" name="pay"/> + <menu_item_check label="Ignorer/Ne plus ignorer" name="block_unblock"/> </context_menu> diff --git a/indra/newview/skins/default/xui/fr/menu_people_nearby_multiselect.xml b/indra/newview/skins/default/xui/fr/menu_people_nearby_multiselect.xml index 8400ec0a14..37abf831c2 100644 --- a/indra/newview/skins/default/xui/fr/menu_people_nearby_multiselect.xml +++ b/indra/newview/skins/default/xui/fr/menu_people_nearby_multiselect.xml @@ -1,10 +1,10 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <context_menu name="Multi-Selected People Context Menu"> - <menu_item_call label="Devenir amis" name="Add Friends"/> - <menu_item_call label="Supprimer des amis" name="Remove Friend"/> - <menu_item_call label="IM" name="IM"/> - <menu_item_call label="Appeler" name="Call"/> - <menu_item_call label="Partager" name="Share"/> - <menu_item_call label="Payer" name="Pay"/> - <menu_item_call label="Proposer une téléportation" name="teleport"/> + <menu_item_call label="Devenir amis" name="add_friends"/> + <menu_item_call label="Supprimer des amis" name="remove_friends"/> + <menu_item_call label="IM" name="im"/> + <menu_item_call label="Appeler" name="call"/> + <menu_item_call label="Partager" name="share"/> + <menu_item_call label="Payer" name="pay"/> + <menu_item_call label="Téléporter" name="offer_teleport"/> </context_menu> diff --git a/indra/newview/skins/default/xui/fr/menu_people_nearby_view.xml b/indra/newview/skins/default/xui/fr/menu_people_nearby_view.xml new file mode 100644 index 0000000000..086002dce5 --- /dev/null +++ b/indra/newview/skins/default/xui/fr/menu_people_nearby_view.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_group_plus"> + <menu_item_check label="Trier par intervenants récents" name="sort_by_recent_speakers"/> + <menu_item_check label="Trier par nom" name="sort_name"/> + <menu_item_check label="Trier par distance" name="sort_distance"/> + <menu_item_check label="Afficher les icônes des résidents" name="view_icons"/> + <menu_item_check label="Afficher la carte" name="view_map"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/fr/menu_people_recent_view.xml b/indra/newview/skins/default/xui/fr/menu_people_recent_view.xml new file mode 100644 index 0000000000..a7d698ab7c --- /dev/null +++ b/indra/newview/skins/default/xui/fr/menu_people_recent_view.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_group_plus"> + <menu_item_check label="Trier en commençant par le plus récent" name="sort_most"/> + <menu_item_check label="Trier par nom" name="sort_name"/> + <menu_item_check label="Afficher les icônes des résidents" name="view_icons"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/fr/menu_url_agent.xml b/indra/newview/skins/default/xui/fr/menu_url_agent.xml index 5ed627fbc3..d701b3a414 100644 --- a/indra/newview/skins/default/xui/fr/menu_url_agent.xml +++ b/indra/newview/skins/default/xui/fr/menu_url_agent.xml @@ -1,6 +1,8 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <context_menu name="Url Popup"> - <menu_item_call label="Voir le profil du résident" name="show_agent"/> + <menu_item_call label="Voir le profil" name="show_agent"/> + <menu_item_call label="Envoyer IM..." name="send_im"/> + <menu_item_call label="Devenir amis..." name="add_friend"/> <menu_item_call label="Copier le nom dans le presse-papiers" name="url_copy_label"/> <menu_item_call label="Copier la SLurl dans le presse-papiers" name="url_copy"/> </context_menu> diff --git a/indra/newview/skins/default/xui/fr/menu_url_objectim.xml b/indra/newview/skins/default/xui/fr/menu_url_objectim.xml index f581c3ef9d..0a934d3e69 100644 --- a/indra/newview/skins/default/xui/fr/menu_url_objectim.xml +++ b/indra/newview/skins/default/xui/fr/menu_url_objectim.xml @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <context_menu name="Url Popup"> - <menu_item_call label="Afficher les informations sur l'objet" name="show_object"/> + <menu_item_call label="Profil de l'objet…" name="show_object"/> <menu_item_call label="Voir sur la carte" name="show_on_map"/> <menu_item_call label="Me téléporter à l'emplacement de l'objet" name="teleport_to_object"/> <menu_item_call label="Copier le nom de l'objet dans le presse-papiers" name="url_copy_label"/> diff --git a/indra/newview/skins/default/xui/fr/menu_viewer.xml b/indra/newview/skins/default/xui/fr/menu_viewer.xml index 85020afe25..49122a0f6d 100644 --- a/indra/newview/skins/default/xui/fr/menu_viewer.xml +++ b/indra/newview/skins/default/xui/fr/menu_viewer.xml @@ -16,10 +16,7 @@ <menu_item_call label="Arrêter mon animation" name="Stop Animating My Avatar"/> <menu_item_call label="Marcher / Courir / Voler..." name="Walk / run / fly"/> </menu> - <menu label="Statut" name="Status"> - <menu_item_call label="Absent" name="Set Away"/> - <menu_item_call label="Occupé" name="Set Busy"/> - </menu> + <menu label="Statut" name="Status"/> <menu_item_call label="Acheter des L$..." name="Buy and Sell L$"/> <menu_item_call label="Boîte d'envoi vendeur..." name="MerchantOutbox"/> <menu_item_call label="Page d'accueil du compte..." name="Manage My Account"> @@ -32,14 +29,18 @@ <menu_item_call label="Quitter [APP_NAME]" name="Quit"/> </menu> <menu label="Communiquer" name="Communicate"> - <menu_item_check label="Chat..." name="Nearby Chat"/> + <menu_item_check label="Conversations..." name="Conversations"/> + <menu_item_check label="Chat près de moi..." name="Nearby Chat"/> <menu_item_check label="Parler" name="Speak"/> - <menu_item_check label="Paramètres vocaux..." name="Nearby Voice"/> - <menu_item_check label="Effet de voix..." name="ShowVoice"/> + <menu label="Effet de voix" name="VoiceMorphing"> + <menu_item_check label="Aucun effet de voix" name="NoVoiceMorphing"/> + <menu_item_check label="Aperçu..." name="Preview"/> + <menu_item_call label="S'abonner..." name="Subscribe"/> + </menu> <menu_item_check label="Gestes..." name="Gestures"/> - <menu_item_call label="Amis" name="My Friends"/> - <menu_item_call label="Groupes" name="My Groups"/> - <menu_item_call label="Personnes près de vous" name="Active Speakers"/> + <menu_item_check label="Amis" name="My Friends"/> + <menu_item_check label="Groupes" name="My Groups"/> + <menu_item_check label="Personnes près de vous" name="Active Speakers"/> <menu_item_call label="Liste des ignorés" name="Block List"/> </menu> <menu label="Monde" name="World"> @@ -307,7 +308,7 @@ <menu_item_call label="Base des infos de la texture sélectionnée" name="Selected Texture Info Basis"/> <menu_item_check label="Filaire" name="Wireframe"/> <menu_item_check label="Occlusion objet-objet" name="Object-Object Occlusion"/> - <menu_item_check label="Éclairage et ombres" name="Lighting and Shadows"/> + <menu_item_check label="Éclairage et ombres" name="Advanced Lighting Model"/> <menu_item_check label="Ombres du soleil/de la lune/des projecteurs" name="Shadows from Sun/Moon/Projectors"/> <menu_item_check label="SSAO et lissage des ombres" name="SSAO and Shadow Smoothing"/> <menu_item_check label="Débogage GL" name="Debug GL"/> diff --git a/indra/newview/skins/default/xui/fr/notifications.xml b/indra/newview/skins/default/xui/fr/notifications.xml index 30154d1873..e73cc6e6e0 100644 --- a/indra/newview/skins/default/xui/fr/notifications.xml +++ b/indra/newview/skins/default/xui/fr/notifications.xml @@ -515,6 +515,24 @@ Consulter [_URL] pour en savoir plus ? </url> <usetemplate ignoretext="Mon pilote graphique est obsolète." name="okcancelignore" notext="Non" yestext="Oui"/> </notification> + <notification name="AMDOldDriver"> + Il existe probablement un pilote plus récent pour votre puce graphique. La mise à jour des pilotes graphiques est susceptible d'améliorer considérablement les performances. + + Visiter la page [_URL] pour rechercher d'éventuelles mises à jour de pilotes ? + <url name="url"> + http://support.amd.com/us/Pages/AMDSupportHub.aspx + </url> + <usetemplate ignoretext="Mon pilote graphique est obsolète." name="okcancelignore" notext="Non" yestext="Oui"/> + </notification> + <notification name="NVIDIAOldDriver"> + Il existe probablement un pilote plus récent pour votre puce graphique. La mise à jour des pilotes graphiques est susceptible d'améliorer considérablement les performances. + + Visiter la page [_URL] pour rechercher d'éventuelles mises à jour de pilotes ? + <url name="url"> + http://www.nvidia.com/Download/index.aspx?lang=fr + </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'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. @@ -1543,10 +1561,13 @@ Quitter le groupe ? Impossible de proposer votre amitié actuellement. Veuillez réessayer dans un moment. <usetemplate name="okbutton" yestext="OK"/> </notification> - <notification name="BusyModeSet"> - Le mode Occupé est sélectionné. -Les chats et les messages instantanés ne s'afficheront pas. Les messages instantanés génèreront la réponse en mode occupé que vous avez créée. Toutes les offres de téléportation seront refusées. Toutes les offres d'inventaire iront dans la corbeille. - <usetemplate ignoretext="Je change mon statut en mode Occupé" name="okignore" yestext="OK"/> + <notification name="DoNotDisturbModeSet"> + Ne pas déranger est activé. Vous ne recevrez pas les notifications de communications entrantes. + +- Les autres résidents recevront votre réponse Ne pas déranger (définie dans Préférences > Général). +- Toutes les offres de téléportation seront refusées. +- Les appels vocaux seront refusés. + <usetemplate ignoretext="J'ai changé mon statut et suis désormais en mode Ne pas déranger." name="okignore" yestext="OK"/> </notification> <notification name="JoinedTooManyGroupsMember"> Vous avez atteint le nombre de groupes maximum. Avant de pouvoir rejoindre ce groupe, vous devez en quitter un ou refuser cette offre. @@ -2033,6 +2054,10 @@ Déplacer les objets de l'inventaire ? Accéder à votre [http://secondlife.com/account/ Page d'accueil] pour consulter l'historique de votre compte ? <usetemplate ignoretext="Lancer mon navigateur pour consulter l'historique de mon compte" name="okcancelignore" notext="Annuler" yestext="Aller sur cette page"/> </notification> + <notification name="ConfirmAddingChatParticipants"> + Quand vous ajoutez une personne à une conversation existante, une nouvelle conversation est créée. Tous les participants recevront les notifications de nouvelle conversation. + <usetemplate ignoretext="Confirmer l'ajout de participants au chat" name="okcancelignore" notext="Annuler" yestext="OK"/> + </notification> <notification name="ConfirmQuit"> Êtes-vous certain de vouloir quitter ? <usetemplate ignoretext="Confirmer avant de quitter" name="okcancelignore" notext="Ne pas quitter" yestext="Quitter"/> @@ -2107,14 +2132,14 @@ Voulez-vous le remplacer par l'objet sélectionné ? <button ignore="Ne jamais remplacer" name="No" text="Annuler"/> </form> </notification> - <notification label="Réponse si occupé(e)" name="BusyModePay"> - Vous êtes en mode occupé et vous ne recevrez donc aucun objet en échange de ce paiement. + <notification label="Avertissement de mode Ne pas déranger" name="DoNotDisturbModePay"> + Vous avez activé Ne pas déranger. Vous ne recevrez aucun article proposé en échange de ce paiement. -Souhaitez-vous quitter le mode occupé avant de terminer cette transaction ? +Voulez-vous désactiver Ne pas déranger avant de terminer cette transaction ? <form name="form"> - <ignore name="ignore" save_option="true" text="Je suis sur le point de payer une personne ou un objet mais suis en mode Occupé"/> - <button ignore="Toujours quitter le mode occupé" name="Yes" text="OK"/> - <button ignore="Ne jamais quitter le mode occupé" name="No" text="Annuler"/> + <ignore name="ignore" text="Je suis sur le point de payer une personne ou un objet mais suis en mode Ne pas déranger"/> + <button ignore="Toujours quitter le mode Ne pas déranger" name="Yes" text="OK"/> + <button ignore="Ne jamais quitter le mode Ne pas déranger" name="No" text="Annuler"/> </form> </notification> <notification name="ConfirmDeleteProtectedCategory"> @@ -2249,11 +2274,8 @@ Liez-la à partir d'une page web pour permettre aux autres résidents d&apo <notification name="GroupNotice"> Sujet : [SUBJECT], Message : [MESSAGE] </notification> - <notification name="FriendOnline"> - <nolink>[NAME]</nolink> est en ligne - </notification> - <notification name="FriendOffline"> - <nolink>[NAME]</nolink> est hors ligne + <notification name="FriendOnlineOffline"> + <nolink>[NAME]</nolink> est [STATUS] </notification> <notification name="AddSelfFriend"> Même si vous êtes extrêmement sympathique, vous ne pouvez pas devenir ami avec vous-même. @@ -2482,13 +2504,6 @@ Vous ne pouvez pas voler ici. <notification name="DynamicPathfindingDisabled"> La recherche de chemin dynamique n'est pas activée dans cette région. Il se peut que les objets scriptés utilisant des appels LSL de recherche de chemin ne fonctionnent pas comme prévu pour cette région. </notification> - <notification name="PathfindingRebakeNavmesh"> - La modification de certains objets de cette région risque d'entraîner un comportement incorrect des autres objets mobiles. Pour que les objets mobiles se comportent correctement, cliquez sur Refiger la région. Pour plus d'informations, choisissez Aide. - <url name="url"> - http://wiki.secondlife.com/wiki/Pathfinding_Tools_in_the_Second_Life_Viewer - </url> - <usetemplate helptext="Aide" ignoretext="La modification de certains objets de cette région risque d'entraîner un comportement incorrect des autres objets mobiles." name="okhelpignore" yestext="OK"/> - </notification> <notification name="PathfindingCannotRebakeNavmesh"> Une erreur est survenue. Un problème réseau ou serveur s'est peut-être produit ou vous ne disposez pas de droits de construction. Se déconnecter puis se reconnecter permet parfois de résoudre le problème. <usetemplate name="okbutton" yestext="OK"/> @@ -2751,7 +2766,7 @@ Acceptez-vous ? <notification name="ScriptQuestionCaution"> Avertissement : l'objet <nolink>[OBJECTNAME]</nolink> 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'une telle demande soit légitime. N'autorisez pas cet accès si vous ne comprenez pas entièrement pourquoi l'objet souhaite accéder à votre compte. +N'autorisez pas cet accès si vous ne comprenez pas entièrement pourquoi l'objet souhaite accéder à votre compte. <form name="form"> <button name="Grant" text="Permettre un accès total"/> <button name="Deny" text="Refuser"/> @@ -3332,4 +3347,633 @@ Désactivation des mises à jour futures de ce fichier... Vous allez supprimer [NUM_ITEMS] articles. Voulez-vous vraiment continuer ? <usetemplate ignoretext="Voulez-vous vraiment supprimer plusieurs articles ?" name="okcancelignore" notext="Non" yestext="Oui"/> </notification> + <notification name="AvatarFrozen"> + [AV_FREEZER] vous a figé. Vous ne pouvez pas bouger ni interagir avec le monde. + </notification> + <notification name="AvatarFrozenDuration"> + [AV_FREEZER] vous a figé pour une durée de [AV_FREEZE_TIME] secondes. Vous ne pouvez pas bouger ni interagir avec le monde. + </notification> + <notification name="YouFrozeAvatar"> + Avatar figé. + </notification> + <notification name="AvatarHasUnFrozenYou"> + [AV_FREEZER] vous a libéré. + </notification> + <notification name="AvatarUnFrozen"> + Avatar libéré. + </notification> + <notification name="AvatarFreezeFailure"> + Vous n'avez pas pu figer ce que vous vouliez car vous ne disposez pas des droits d'admin pour cette parcelle. + </notification> + <notification name="AvatarFreezeThaw"> + Vous n'êtes plus figé, vous pouvez reprendre votre vie. + </notification> + <notification name="AvatarCantFreeze"> + Impossible de figer cet utilisateur. + </notification> + <notification name="NowOwnObject"> + Vous êtes désormais le propriétaire de l'objet [OBJECT_NAME]. + </notification> + <notification name="CantRezOnLand"> + Impossible de rezzer l'objet à [OBJECT_POS] car le propriétaire de ce terrain de l'autorise pas. Utilisez l'outil Terrain pour voir à qui appartiennent les terrains. + </notification> + <notification name="RezFailTooManyRequests"> + Impossible de rezzer l'objet car il y a trop de demandes. + </notification> + <notification name="SitFailCantMove"> + Vous ne pouvez pas vous asseoir car vous ne pouvez actuellement pas bouger. + </notification> + <notification name="SitFailNotAllowedOnLand"> + Vous ne pouvez pas vous asseoir car votre présence sur ce terrain n'est pas autorisée. + </notification> + <notification name="SitFailNotSameRegion"> + Essayez de vous rapprocher. Impossible de vous asseoir sur l'objet car +il ne se trouve pas dans la même région que vous. + </notification> + <notification name="NoNewObjectRegionFull"> + Création d'un nouvel objet impossible. La région est pleine. + </notification> + <notification name="FailedToPlaceObject"> + Échec du placement de l'objet à l'emplacement spécifié. Veuillez réessayer. + </notification> + <notification name="NoOwnNoGardening"> + Vous ne pouvez pas créer d'arbres ni d'herbe sur un terrain qui ne vous appartient pas. + </notification> + <notification name="NoCopyPermsNoObject"> + Échec de la copie car vous ne disposez pas des droits requis pour copier l'objet [OBJ_NAME]. + </notification> + <notification name="NoTransPermsNoObject"> + Échec de la copie car l'objet [OBJ_NAME] ne peut pas vous être transféré. + </notification> + <notification name="AddToNavMeshNoCopy"> + Échec de la copie car l'objet [OBJ_NAME] contribue au maillage de navigation. + </notification> + <notification name="DupeWithNoRootsSelected"> + Dupliquer sans objet racine sélectionné + </notification> + <notification name="CantDupeCuzRegionIsFull"> + Impossible de dupliquer les objets car la région est pleine. + </notification> + <notification name="CantDupeCuzParcelNotFound"> + Impossible de dupliquer les objets - la parcelle sur laquelle ils sont est introuvable. + </notification> + <notification name="CantCreateCuzParcelFull"> + Création de l'objet impossible car +la parcelle est pleine. + </notification> + <notification name="RezAttemptFailed"> + Échec d'une tentative pour rezzer un objet. + </notification> + <notification name="ToxicInvRezAttemptFailed"> + Impossible de créer l'article qui a provoqué des problèmes pour cette région. + </notification> + <notification name="InvItemIsBlacklisted"> + Cet article d'inventaire a été placé sur liste noire. + </notification> + <notification name="NoCanRezObjects"> + Vous n'êtes actuellement pas autorisé à créer des objets. + </notification> + <notification name="LandSearchBlocked"> + Recherche de terrain bloquée. +Vous avez effectué trop de recherches de terrain trop rapidement. +Veuillez réessayer dans une minute. + </notification> + <notification name="NotEnoughResourcesToAttach"> + Ressources de script insuffisantes pour attacher cet objet. + </notification> + <notification name="YouDiedAndGotTPHome"> + Vous êtes mort et avez été téléporté à votre domicile. + </notification> + <notification name="EjectComingSoon"> + Votre présence ici n'est plus autorisée et vous disposez de [EJECT_TIME] secondes pour partir. + </notification> + <notification name="NoEnterServerFull"> + Vous ne pouvez pas pénétrer dans cette région car +le serveur est plein. + </notification> + <notification name="SaveBackToInvDisabled"> + Le réenregistrement dans l'inventaire a été désactivé. + </notification> + <notification name="NoExistNoSaveToContents"> + Impossible d'enregistrer [OBJ_NAME] dans le contenu des objets car l'objet à partir duquel il a été rezzé n'existe plus. + </notification> + <notification name="NoModNoSaveToContents"> + Impossible d'enregistrer [OBJ_NAME] dans le contenu des objets car vous ne disposez pas des droits requis pour modifier l'objet [DEST_NAME]. + </notification> + <notification name="NoSaveBackToInvDisabled"> + Impossible de réenregistrer [OBJ_NAME] dans l'inventaire -- cette opération a été désactivée. + </notification> + <notification name="NoCopyNoSelCopy"> + Vous ne pouvez pas copier votre sélection car vous n'avez pas le droit de copier l'objet [OBJ_NAME]. + </notification> + <notification name="NoTransNoSelCopy"> + Vous ne pouvez pas copier votre sélection car l'objet [OBJ_NAME] n'est pas transférable. + </notification> + <notification name="NoTransNoCopy"> + Vous ne pouvez pas copier votre sélection car l'objet [OBJ_NAME] n'est pas transférable. + </notification> + <notification name="NoPermsNoRemoval"> + La suppression de l'objet [OBJ_NAME] du simulateur n'est pas autorisée par le système de droits. + </notification> + <notification name="NoModNoSaveSelection"> + Vous ne pouvez pas enregistrer votre sélection car vous n'avez pas le droit de modifier l'objet [OBJ_NAME]. + </notification> + <notification name="NoCopyNoSaveSelection"> + Vous ne pouvez pas enregistrer votre sélection car l'objet [OBJ_NAME] ne peut pas être copié. + </notification> + <notification name="NoModNoTaking"> + Vous ne pouvez pas prendre votre sélection car vous n'avez pas le droit de modifier l'objet [OBJ_NAME]. + </notification> + <notification name="RezDestInternalError"> + Erreur interne : type de destination inconnue. + </notification> + <notification name="DeleteFailObjNotFound"> + Échec de la suppression car l'objet est introuvable + </notification> + <notification name="SorryCantEjectUser"> + Exclusion de cet utilisateur impossible. + </notification> + <notification name="RegionSezNotAHome"> + Cette région ne vous permet pas d'y définir votre domicile. + </notification> + <notification name="HomeLocationLimits"> + Vous ne pouvez définir votre domicile que sur votre terrain ou un infohub du continent. + </notification> + <notification name="HomePositionSet"> + Emplacement du domicile défini. + </notification> + <notification name="AvatarEjected"> + Avatar expulsé. + </notification> + <notification name="AvatarEjectFailed"> + Vous n'avez pas pu réaliser l'exclusion car vous ne disposez pas des droits d'admin pour cette parcelle. + </notification> + <notification name="CantMoveObjectParcelFull"> + Impossible de déplacer [OBJECT_NAME] jusqu'à +[OBJ_POSITION] dans la région [REGION_NAME] car la parcelle est pleine. + </notification> + <notification name="CantMoveObjectParcelPerms"> + Impossible de déplacer [OBJECT_NAME] jusqu'à +[OBJ_POSITION] dans la région [REGION_NAME] car vos objets ne sont pas autorisés sur cette parcelle. + </notification> + <notification name="CantMoveObjectParcelResources"> + Impossible de déplacer [OBJECT_NAME] jusqu'à +[OBJ_POSITION] dans la région [REGION_NAME] car il n'y a pas suffisamment de ressources pour cet objet sur cette parcelle. + </notification> + <notification name="CantMoveObjectRegionVersion"> + Impossible de déplacer [OBJECT_NAME] jusqu'à +[OBJ_POSITION] dans la région [REGION_NAME] car l'autre région exécute une version plus ancienne qui ne prend pas en charge la réception de cet objet via le passage à une autre région. + </notification> + <notification name="CantMoveObjectNavMesh"> + Impossible de déplacer [OBJECT_NAME] jusqu'à +[OBJ_POSITION] dans la région [REGION_NAME] car vous ne pouvez pas modifier le maillage de navigation d'une région à une autre. + </notification> + <notification name="CantMoveObjectWTF"> + Impossible de déplacer [OBJECT_NAME] jusqu'à +[OBJ_POSITION] dans la région [REGION_NAME] pour une raison inconnue. ([FAILURE_TYPE]) + </notification> + <notification name="NoPermModifyObject"> + Vous n'êtes pas autorisé à modifier cet objet. + </notification> + <notification name="CantEnablePhysObjContributesToNav"> + Impossible d'activer les propriétés physiques pour un objet qui contribue au maillage de navigation. + </notification> + <notification name="CantEnablePhysKeyframedObj"> + Impossible d'activer les propriétés physiques pour les objets avec images-clés. + </notification> + <notification name="CantEnablePhysNotEnoughLandResources"> + Impossible d'activer les propriétés physiques pour l'objet -- ressources de terrain insuffisantes. + </notification> + <notification name="CantEnablePhysCostTooGreat"> + Impossible d'activer les propriétés physiques pour les objets avec un coût de ressources physiques supérieur à [MAX_OBJECTS] + </notification> + <notification name="PhantomWithConcavePiece"> + Cet objet ne peut pas contenir de morceau concave car c'est un fantôme qui contribue au maillage de navigation. + </notification> + <notification name="UnableAddItem"> + Ajout de l'article impossible. + </notification> + <notification name="UnableEditItem"> + Modification impossible + </notification> + <notification name="NoPermToEdit"> + Modification interdite. + </notification> + <notification name="NoPermToCopyInventory"> + Pas autorisé à copier cet inventaire. + </notification> + <notification name="CantSaveItemDoesntExist"> + Impossible d'enregistrer dans le contenu des objets : L'article n'existe plus. + </notification> + <notification name="CantSaveItemAlreadyExists"> + Impossible d'enregistrer dans le contenu des objets : Un article avec ce nom existe déjà dans l'inventaire. + </notification> + <notification name="CantSaveModifyAttachment"> + Impossible d'enregistrer dans le contenu des objets : cela modifierait les droits d'attache. + </notification> + <notification name="TooManyScripts"> + Trop de scripts. + </notification> + <notification name="UnableAddScript"> + Ajout du script impossible. + </notification> + <notification name="AssetServerTimeoutObjReturn"> + Le serveur d'actifs n'a pas répondu assez vite. Objet renvoyé dans le sim. + </notification> + <notification name="RegionDisablePhysicsShapes"> + Les formes physiques ne sont pas activées pour cette région. + </notification> + <notification name="NoModNavmeshAcrossRegions"> + Vous ne pouvez pas modifier le maillage de navigation d'une région à une autre. + </notification> + <notification name="NoSetPhysicsPropertiesOnObjectType"> + Impossible de définir les propriétés physiques pour ce type d'objet. + </notification> + <notification name="NoSetRootPrimWithNoShape"> + Vous devenez définir une forme pour la prim racine. + </notification> + <notification name="NoRegionSupportPhysMats"> + Les matériaux physiques ne sont pas activés pour cette région. + </notification> + <notification name="OnlyRootPrimPhysMats"> + Les matériaux physiques ne peuvent être ajustés que pour les prims racines. + </notification> + <notification name="NoSupportCharacterPhysMats"> + La configuration de matériaux physiques sur les personnages n'est pas prise en charge actuellement. + </notification> + <notification name="InvalidPhysMatProperty"> + Une ou plusieurs propriétés des ressources physiques spécifiées n'étaient pas valides. + </notification> + <notification name="NoPermsAlterStitchingMeshObj"> + Vous ne pouvez pas changer le type de raccord d'un objet avec maillage. + </notification> + <notification name="NoPermsAlterShapeMeshObj"> + Vous ne pouvez pas changer la forme d'un objet avec maillage. + </notification> + <notification name="FullRegionCantEnter"> + Vous ne pouvez pas pénétrer dans cette région car \ncar la région est pleine. + </notification> + <notification name="LinkFailedOwnersDiffer"> + Échec du lien -- les propriétaires sont différents + </notification> + <notification name="LinkFailedNoModNavmeshAcrossRegions"> + Échec du lien -- vous ne pouvez pas modifier le maillage de navigation d'une région à une autre. + </notification> + <notification name="LinkFailedNoPermToEdit"> + Échec du lien car vous ne disposez pas des droits de modification. + </notification> + <notification name="LinkFailedTooManyPrims"> + Échec du lien -- trop de primitives + </notification> + <notification name="LinkFailedCantLinkNoCopyNoTrans"> + Échec du lien -- impossible de lier pas de copie et pas de transfert + </notification> + <notification name="LinkFailedNothingLinkable"> + Échec du lien - il n'y a rien qui puisse être lié. + </notification> + <notification name="LinkFailedTooManyPathfindingChars"> + Échec du lien -- trop de personnages de recherche de chemin + </notification> + <notification name="LinkFailedInsufficientLand"> + Échec du lien -- ressources de terrain insuffisantes + </notification> + <notification name="LinkFailedTooMuchPhysics"> + Cet objet utilise trop de ressources physiques - sa dynamique a été désactivée. + </notification> + <notification name="TeleportedHomeByObjectOnParcel"> + Vous avez été téléporté chez vous par l'objet [OBJECT_NAME] sur la parcelle [PARCEL_NAME]. + </notification> + <notification name="TeleportedHomeByObject"> + Vous avez été téléporté chez vous par l'objet [OBJECT_NAME]. + </notification> + <notification name="TeleportedByAttachment"> + Vous avez été téléporté par un élément sur [ITEM_ID] + </notification> + <notification name="TeleportedByObjectOnParcel"> + Vous avez été téléporté par l'objet [OBJECT_NAME] sur la parcelle [PARCEL_NAME]. + </notification> + <notification name="TeleportedByObjectOwnedBy"> + Vous avez été téléporté par l'objet [OBJECT_NAME] appartenant à [OWNER_ID]. + </notification> + <notification name="TeleportedByObjectUnknownUser"> + Vous avez été téléporté par l'objet [OBJECT_NAME] appartenant à un utilisateur inconnu. + </notification> + <notification name="CantCreateObjectRegionFull"> + Création de l'objet demandé impossible. La région est pleine. + </notification> + <notification name="CantAttackMultipleObjOneSpot"> + Vous ne pouvez pas attacher plusieurs objets au même endroit. + </notification> + <notification name="CantCreateMultipleObjAtLoc"> + Vous ne pouvez pas créer plusieurs objets ici. + </notification> + <notification name="UnableToCreateObjTimeOut"> + Création de l'objet demandé impossible. Objet absent de la base de données. + </notification> + <notification name="UnableToCreateObjUnknown"> + Création de l'objet demandé impossible. Délai d'attente dépassé. Veuillez réessayer. + </notification> + <notification name="UnableToCreateObjMissingFromDB"> + Création de l'objet demandé impossible. Veuillez réessayer. + </notification> + <notification name="RezFailureTookTooLong"> + Échec de l'action « rezzer », le chargement de l'objet demandé a pris trop longtemps. + </notification> + <notification name="FailedToPlaceObjAtLoc"> + Échec du placement de l'objet à l'emplacement spécifié. Veuillez réessayer. + </notification> + <notification name="CantCreatePlantsOnLand"> + Vous ne pouvez pas créer de plantes sur ce terrain. + </notification> + <notification name="CantRestoreObjectNoWorldPos"> + Impossible de restaurer l'objet. Position dans le monde introuvable. + </notification> + <notification name="CantRezObjectInvalidMeshData"> + Impossible de rezzer l'objet car ses données de maillage ne sont pas valides. + </notification> + <notification name="CantRezObjectTooManyScripts"> + Impossible de rezzer l'objet car il y a déjà trop de scripts dans cette région. + </notification> + <notification name="CantCreateObjectNoAccess"> + Vos privilèges d'accès ne vous autorisent pas à créer des objets à cet endroit. + </notification> + <notification name="CantCreateObject"> + Vous n'êtes actuellement pas autorisé à créer des objets. + </notification> + <notification name="InvalidObjectParams"> + Paramètres d'objet non valides + </notification> + <notification name="CantDuplicateObjectNoAcess"> + Vos privilèges d'accès ne vous autorisent pas à dupliquer des objets ici. + </notification> + <notification name="CantChangeShape"> + Vous n’êtes pas autorisé à modifier cette forme. + </notification> + <notification name="NoAccessToClaimObjects"> + Vos privilèges d'accès ne vous autorisent pas à revendiquer des objets ici. + </notification> + <notification name="DeedFailedNoPermToDeedForGroup"> + Échec de la cession car vous de disposez pas des droits de cession des objets pour votre groupe. + </notification> + <notification name="NoPrivsToBuyObject"> + Vos privilèges d'accès ne vous autorisent pas à acheter des objets ici. + </notification> + <notification name="CantAttachObjectAvatarSittingOnIt"> + Impossible d'attacher l'objet car un avatar est assis dessus. + </notification> + <notification name="WhyAreYouTryingToWearShrubbery"> + Les arbres et les plantes ne peuvent pas être portés sous forme d'éléments attachés. + </notification> + <notification name="CantAttachGroupOwnedObjs"> + Impossible d'attacher les objets appartenant au groupe. + </notification> + <notification name="CantAttachObjectsNotOwned"> + Vous ne pouvez pas attacher des objets qui ne vous appartiennent pas. + </notification> + <notification name="CantAttachNavmeshObjects"> + Impossible d'attacher les objets contribuant au maillage de navigation. + </notification> + <notification name="CantAttachObjectNoMovePermissions"> + Impossible d'attacher l'objet car vous n'avez pas le droit de le déplacer. + </notification> + <notification name="CantAttachNotEnoughScriptResources"> + Ressources de script insuffisantes pour attacher cet objet. + </notification> + <notification name="CantDropItemTrialUser"> + Vous ne pouvez pas déposer d'objets ici. Essayez la zone de période d'essai gratuite. + </notification> + <notification name="CantDropMeshAttachment"> + Vous ne pouvez pas déposer les éléments attachés avec maillage. Détachez-les dans l'inventaire puis rezzez-les dans le monde. + </notification> + <notification name="CantDropAttachmentNoPermission"> + L'élément n'a pas pu être déposé : vous n'avez pas le droit de déposer des éléments à cet endroit. + </notification> + <notification name="CantDropAttachmentInsufficientLandResources"> + L'élément n'a pas pu être déposé : ressources de terrain disponibles insuffisantes. + </notification> + <notification name="CantDropAttachmentInsufficientResources"> + Les éléments n'ont pas pu être déposés : ressources disponibles insuffisantes. + </notification> + <notification name="CantDropObjectFullParcel"> + Impossible de déposer l'objet ici. La parcelle est pleine. + </notification> + <notification name="CantTouchObjectBannedFromParcel"> + Vous ne pouvez pas toucher/attraper cet objet car vous êtes banni de cette parcelle de terrain. + </notification> + <notification name="PlzNarrowDeleteParams"> + Veuillez affiner vos paramètres de suppression. + </notification> + <notification name="UnableToUploadAsset"> + Chargement de l'actif impossible. + </notification> + <notification name="CantTeleportCouldNotFindUser"> + Impossible de trouver l'utilisateur à téléporter chez lui + </notification> + <notification name="GodlikeRequestFailed"> + échec de la demande de type divine + </notification> + <notification name="GenericRequestFailed"> + échec de la demande générique + </notification> + <notification name="CantUploadPostcard"> + Chargement de la carte postale impossible. Réessayez ultérieurement. + </notification> + <notification name="CantFetchInventoryForGroupNotice"> + Impossible récupérer les détails de l'inventaire pour la notice au groupe. + </notification> + <notification name="CantSendGroupNoticeNotPermitted"> + Impossible d'envoyer une notice au groupe -- ce n'est pas autorisé. + </notification> + <notification name="CantSendGroupNoticeCantConstructInventory"> + Impossible d'envoyer une notice au groupe - échec de la construction de l'inventaire. + </notification> + <notification name="CantParceInventoryInNotice"> + Impossible d'analyser l'inventaire dans la notice. + </notification> + <notification name="TerrainUploadFailed"> + Échec du chargement du terrain. + </notification> + <notification name="TerrainFileWritten"> + Fichier de terrain écrit + </notification> + <notification name="TerrainFileWrittenStartingDownload"> + Fichier de terrain écrit, lancement du téléchargement... + </notification> + <notification name="TerrainBaked"> + Terrain figé. + </notification> + <notification name="TenObjectsDisabledPlzRefresh"> + Seuls les 10 premiers objets sélectionnés ont été désactivés. Actualisez et effectuez des sélections supplémentaires si nécessaire. + </notification> + <notification name="UpdateViewerBuyParcel"> + Vous devez mettre votre client à jour pour acheter cette parcelle. + </notification> + <notification name="CantBuyParcelNotForSale"> + Achat impossible, cette parcelle n'est pas à vendre. + </notification> + <notification name="CantBuySalePriceOrLandAreaChanged"> + Achat impossible, le prix de vente ou la zone de terrain a changé. + </notification> + <notification name="CantBuyParcelNotAuthorized"> + Vous n'êtes pas un acheteur autorisé pour cette parcelle. + </notification> + <notification name="CantBuyParcelAwaitingPurchaseAuth"> + Vous ne pouvez pas acheter cette parcelle car elle est déjà en attente d'une autorisation d'achat. + </notification> + <notification name="CantBuildOverflowParcel"> + Vous ne pouvez pas construire d'objets ici car cela saturerait la parcelle. + </notification> + <notification name="SelectedMultipleOwnedLand"> + Vous avez sélectionné des terrains avec des propriétaires différents. Sélectionnez une zone plus petite et réessayez. + </notification> + <notification name="CantJoinTooFewLeasedParcels"> + Pas suffisamment de parcelles louées dans la sélection pour effectuer la fusion. + </notification> + <notification name="CantDivideLandMultipleParcelsSelected"> + Division du terrain impossible.\nPlusieurs parcelles sont sélectionnées.\nVeuillez sélectionner un terrain plus petit. + </notification> + <notification name="CantDivideLandCantFindParcel"> + Division du terrain impossible.\nParcelle introuvable.\nSignalez-le en allant à Aide -> Signaler un bug... + </notification> + <notification name="CantDivideLandWholeParcelSelected"> + Division du terrain impossible. Toute la parcelle est sélectionnée.\nVeuillez sélectionner un terrain plus petit. + </notification> + <notification name="LandHasBeenDivided"> + Le terrain a été divisé. + </notification> + <notification name="PassPurchased"> + Vous avez acheté un pass. + </notification> + <notification name="RegionDisallowsClassifieds"> + Cette région n'autorise pas les petites annonces. + </notification> + <notification name="LandPassExpireSoon"> + Votre pass pour ce terrain arrive à expiration. + </notification> + <notification name="CantSitNoSuitableSurface"> + Il n'y a pas de surface appropriée sur laquelle s'asseoir, essayez un autre endroit. + </notification> + <notification name="CantSitNoRoom"> + Pas de place pour s'asseoir ici, essayez un autre endroit. + </notification> + <notification name="ClaimObjectFailedNoPermission"> + Échec de la revendication de l'objet car vous ne disposez pas des droits requis. + </notification> + <notification name="ClaimObjectFailedNoMoney"> + Échec de la revendication de l'objet car vous ne disposez pas de suffisamment de L$. + </notification> + <notification name="CantDeedGroupLand"> + Impossible de céder un terrain appartenant au groupe. + </notification> + <notification name="BuyObjectFailedNoMoney"> + Échec de l'achat de l'objet car vous ne disposez pas de suffisamment de L$. + </notification> + <notification name="BuyInventoryFailedNoMoney"> + Échec de l'achat d'inventaire car vous ne disposez pas de suffisamment de L$. + </notification> + <notification name="BuyPassFailedNoMoney"> + Vous ne disposez pas de suffisamment de L$ pour acheter un pass pour ce terrain. + </notification> + <notification name="CantBuyPassTryAgain"> + Impossible d'acheter le pass actuellement. Réessayez ultérieurement. + </notification> + <notification name="CantCreateObjectParcelFull"> + Création de l'objet impossible car \nla parcelle est pleine. + </notification> + <notification name="FailedPlacingObject"> + Échec du placement de l'objet à l'emplacement spécifié. Veuillez réessayer. + </notification> + <notification name="CantCreateLandmarkForEvent"> + Impossible de créer le repère pour l'événement. + </notification> + <notification name="GodBeatsFreeze"> + Grâce à vos pouvoirs de type divin, vous n'êtes plus figé. + </notification> + <notification name="SpecialPowersRequestFailedLogged"> + Échec de la demande de pouvoirs spéciaux. Cette demande a été archivée. + </notification> + <notification name="ExpireExplanation"> + Le système ne peut pas traiter votre demande actuellement. Délai d'attente dépassé. + </notification> + <notification name="DieExplanation"> + Le système ne peut pas traiter votre demande. + </notification> + <notification name="AddPrimitiveFailure"> + Fonds insuffisants pour créer la primitive. + </notification> + <notification name="RezObjectFailure"> + Fonds insuffisants pour créer l'objet. + </notification> + <notification name="ResetHomePositionNotLegal"> + Réinitialiser l'emplacement du domicile car il n'était pas légal. + </notification> + <notification name="CantInviteRegionFull"> + Vous ne pouvez pas inviter quiconque là où vous vous trouvez actuellement car la région est pleine. Réessayez ultérieurement. + </notification> + <notification name="CantSetHomeAtRegion"> + Cette région ne vous permet pas d'y définir votre domicile. + </notification> + <notification name="ListValidHomeLocations"> + Vous ne pouvez définir votre domicile que sur votre terrain ou un infohub du continent. + </notification> + <notification name="SetHomePosition"> + Emplacement du domicile défini. + </notification> + <notification name="CantDerezInventoryError"> + Impossible de dérezzer l'objet à cause d'un défaut d'inventaire. + </notification> + <notification name="CantCreateRequestedInv"> + Création de l'inventaire demandé impossible. + </notification> + <notification name="CantCreateRequestedInvFolder"> + Création du dossier d'inventaire demandé impossible. + </notification> + <notification name="CantCreateInventory"> + Création de cet inventaire impossible. + </notification> + <notification name="CantCreateLandmark"> + Création du repère impossible. + </notification> + <notification name="CantCreateOutfit"> + Création de la tenue impossible. Veuillez réessayer dans une minute. + </notification> + <notification name="InventoryNotForSale"> + L'inventaire n'est pas à vendre. + </notification> + <notification name="CantFindInvItem"> + Objet de l'inventaire introuvable. + </notification> + <notification name="CantFindObject"> + Objet introuvable. + </notification> + <notification name="CantTransfterMoneyRegionDisabled"> + Les transferts d'argent aux objets sont actuellement désactivés dans cette région. + </notification> + <notification name="CantPayNoAgent"> + Impossible de savoir qui payer. + </notification> + <notification name="CantDonateToPublicObjects"> + Vous ne pouvez pas donner de L$ à des objets publics. + </notification> + <notification name="InventoryCreationInWorldObjectFailed"> + Échec de la création d'inventaire sur l'objet Second Life. + </notification> + <notification name="UserBalanceOrLandUsageError"> + Une erreur interne nous a empêchés de mettre votre client à jour correctement. Le solde de L$ et le patrimoine affichés dans votre client peuvent ne pas correspondre à votre solde réel sur les serveurs. + </notification> + <notification name="LargePrimAgentIntersect"> + Impossible de créer de grandes prims qui coupent d'autres joueurs. Réessayez une fois que les autres joueurs se seront déplacés. + </notification> + <notification name="PreferenceChatClearLog"> + Cela supprimera les journaux des conversations précédentes, ainsi que toute copie de sauvegarde de ce fichier. + <usetemplate ignoretext="Confirmer avant de supprimer le journal des conversations précédentes" name="okcancelignore" notext="Annuler" yestext="OK"/> + </notification> + <notification name="PreferenceChatDeleteTranscripts"> + Cela supprimera les transcriptions de toutes les conversations précédentes. La liste des conversations passées ne sera pas affectée. Tous les fichiers avec les suffixes .txt et txt.backup dans le dossier [FOLDER] seront supprimés. + <usetemplate ignoretext="Confirmer avant la suppression des transcriptions" name="okcancelignore" notext="Annuler" yestext="OK"/> + </notification> + <notification name="PreferenceChatPathChanged"> + Impossible de déplacer les fichiers. Chemin précédent rétabli. + <usetemplate ignoretext="Impossible de déplacer les fichiers. Chemin précédent rétabli." name="okignore" yestext="OK"/> + </notification> </notifications> diff --git a/indra/newview/skins/default/xui/fr/panel_avatar_list_item.xml b/indra/newview/skins/default/xui/fr/panel_avatar_list_item.xml index 54b8f53e59..c8fa9f340f 100644 --- a/indra/newview/skins/default/xui/fr/panel_avatar_list_item.xml +++ b/indra/newview/skins/default/xui/fr/panel_avatar_list_item.xml @@ -27,5 +27,6 @@ <icon name="permission_edit_mine_icon" tool_tip="Cet(te) ami(e) peut modifier, supprimer ou prendre vos objets."/> <icon name="permission_map_icon" tool_tip="Cet(te) ami(e) peut vous localiser sur la carte."/> <icon name="permission_online_icon" tool_tip="Cet(te) ami(e) peut voir lorsque vous êtes en ligne."/> + <button name="info_btn" tool_tip="En savoir plus"/> <button name="profile_btn" tool_tip="Voir le profil"/> </panel> diff --git a/indra/newview/skins/default/xui/fr/panel_block_list_sidetray.xml b/indra/newview/skins/default/xui/fr/panel_block_list_sidetray.xml index 96add2a74b..0e2b5a9c93 100644 --- a/indra/newview/skins/default/xui/fr/panel_block_list_sidetray.xml +++ b/indra/newview/skins/default/xui/fr/panel_block_list_sidetray.xml @@ -1,10 +1,11 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="block_list_panel"> - <text name="title_text"> - Liste des ignorés - </text> - <scroll_list name="blocked" tool_tip="Liste des résidents actuellement ignorés"/> - <button label="Ignorer une personne" label_selected="Ignorer le résident..." name="Block resident..." tool_tip="Choisir un résident à ignorer"/> - <button label="Ignorer un objet par son nom" label_selected="Ignorer un objet par son nom..." name="Block object by name..." tool_tip="Choisir un objet à ignorer par nom"/> - <button label="Ne plus ignorer" label_selected="Ne plus ignorer" name="Unblock" tool_tip="Enlever le résident ou l'objet de la liste des ignorés"/> + <panel label="bottom_panel" name="blocked_buttons_panel"> + <filter_editor label="Filtrer" name="blocked_filter_input"/> + <menu_button name="blocked_gear_btn" tool_tip="Actions sur la personne ou l'objet sélectionné"/> + <menu_button name="view_btn" tool_tip="Options de tri"/> + <menu_button name="plus_btn" tool_tip="Choisir un résident ou un objet à ignorer"/> + <button name="unblock_btn" tool_tip="Enlever le résident ou l’objet de la liste des ignorés"/> + </panel> + <block_list name="blocked" tool_tip="Liste des résidents actuellement ignorés"/> </panel> diff --git a/indra/newview/skins/default/xui/fr/panel_conversation_list_item.xml b/indra/newview/skins/default/xui/fr/panel_conversation_list_item.xml new file mode 100644 index 0000000000..ebf18f6483 --- /dev/null +++ b/indra/newview/skins/default/xui/fr/panel_conversation_list_item.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="conversation_list_item"> + <layout_stack name="conversation_item_stack"> + <layout_panel name="conversation_title_panel"> + <text name="conversation_title" value="(chargement)"/> + </layout_panel> + </layout_stack> +</panel> diff --git a/indra/newview/skins/default/xui/fr/panel_conversation_log_list_item.xml b/indra/newview/skins/default/xui/fr/panel_conversation_log_list_item.xml new file mode 100644 index 0000000000..9c277842b5 --- /dev/null +++ b/indra/newview/skins/default/xui/fr/panel_conversation_log_list_item.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="conversation_log_list_item"> + <icon name="voice_session_icon" tool_tip="Incluait une conversation vocale"/> + <icon name="unread_ims_icon" tool_tip="Des messages sont arrivés pendant que vous étiez déconnecté."/> + <button name="delete_btn" tool_tip="Supprimer cette entrée"/> +</panel> diff --git a/indra/newview/skins/default/xui/fr/panel_group_list_item.xml b/indra/newview/skins/default/xui/fr/panel_group_list_item.xml index 5fb69d1989..b1b32af7c6 100644 --- a/indra/newview/skins/default/xui/fr/panel_group_list_item.xml +++ b/indra/newview/skins/default/xui/fr/panel_group_list_item.xml @@ -1,5 +1,6 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="group_list_item"> <text name="group_name" value="Inconnu"/> + <button name="info_btn" tool_tip="En savoir plus"/> <button name="profile_btn" tool_tip="Voir le profil"/> </panel> diff --git a/indra/newview/skins/default/xui/fr/panel_people.xml b/indra/newview/skins/default/xui/fr/panel_people.xml index f035853efc..227ce26df7 100644 --- a/indra/newview/skins/default/xui/fr/panel_people.xml +++ b/indra/newview/skins/default/xui/fr/panel_people.xml @@ -14,81 +14,53 @@ Pour rechercher des résidents avec qui passer du temps, utilisez [secondlife:// <string name="no_filtered_friends_msg"> Vous n'avez pas trouvé ce que vous cherchiez ? Essayez [secondlife:///app/search/people/[SEARCH_TERM] Rechercher]. </string> - <string name="people_filter_label" value="Filtrer les personnes"/> - <string name="groups_filter_label" value="Filtrer les groupes"/> <string name="no_filtered_groups_msg" value="Vous n'avez pas trouvé ce que vous cherchiez ? Essayez [secondlife:///app/search/groups/[SEARCH_TERM] Rechercher]."/> <string name="no_groups_msg" value="Vous souhaitez trouver des groupes à rejoindre ? Utilisez [secondlife:///app/search/groups Rechercher]."/> <string name="MiniMapToolTipMsg" value="[REGION](Carte : double-clic ; Panoramique : Maj + faire glisser)"/> <string name="AltMiniMapToolTipMsg" value="[REGION](Téléportation : double-clic ; Panoramique : Maj + faire glisser)"/> - <filter_editor label="Filtre" name="filter_input"/> <tab_container name="tabs"> <panel label="PRÈS DE VOUS" name="nearby_panel"> - <panel label="bottom_panel" name="bottom_panel"> - <menu_button name="nearby_view_sort_btn" tool_tip="Options"/> - <button name="add_friend_btn" tool_tip="Ajouter le résident sélectionné à votre liste d'amis"/> + <panel label="bottom_panel" name="nearby_buttons_panel"> + <filter_editor label="Filtrer les personnes" name="nearby_filter_input"/> + <button name="gear_btn" tool_tip="Actions sur la personne sélectionnée"/> + <menu_button name="nearby_view_btn" tool_tip="Options d'affichage/de tri"/> + <button name="add_friend_btn" tool_tip="Proposer à ce résident de devenir votre ami"/> + <dnd_button name="nearby_del_btn" tool_tip="Supprimer la personne sélectionnée des amis"/> </panel> </panel> - <panel label="MES AMIS" name="friends_panel"> + <panel label="AMIS" name="friends_panel"> + <panel label="bottom_panel" name="friends_buttons_panel"> + <filter_editor label="Filtrer les personnes" name="friends_filter_input"/> + <button name="gear_btn" tool_tip="Actions sur la personne sélectionnée"/> + <menu_button name="friends_view_btn" tool_tip="Options d'affichage/de tri"/> + <button name="friends_add_btn" tool_tip="Proposer à ce résident de devenir votre ami"/> + <dnd_button name="friends_del_btn" tool_tip="Supprimer la personne sélectionnée des amis"/> + </panel> <accordion name="friends_accordion"> <accordion_tab name="tab_online" title="En ligne"/> <accordion_tab name="tab_all" title="Tout"/> </accordion> - <panel label="bottom_panel" name="bottom_panel"> - <layout_stack name="bottom_panel"> - <layout_panel name="options_gear_btn_panel"> - <menu_button name="friends_viewsort_btn" tool_tip="Afficher d'autres options"/> - </layout_panel> - <layout_panel name="add_btn_panel"> - <button name="add_btn" tool_tip="Proposer à un résident de devenir votre ami"/> - </layout_panel> - <layout_panel name="trash_btn_panel"> - <dnd_button name="del_btn" tool_tip="Supprimer le résident sélectionné de votre liste d'amis."/> - </layout_panel> - </layout_stack> - </panel> </panel> - <panel label="MES GROUPES" name="groups_panel"> - <panel label="bottom_panel" name="bottom_panel"> - <menu_button name="groups_viewsort_btn" tool_tip="Options"/> - <button name="plus_btn" tool_tip="Rejoindre/créer un nouveau groupe"/> - <button name="activate_btn" tool_tip="Activer le groupe sélectionné"/> + <panel label="GROUPES" name="groups_panel"> + <panel label="bottom_panel" name="groups_buttons_panel"> + <filter_editor label="Filtrer les groupes" name="groups_filter_input"/> + <menu_button name="groups_gear_btn" tool_tip="Actions sur le groupe sélectionné"/> + <menu_button name="groups_view_btn" tool_tip="Options d'affichage/de tri"/> + <menu_button name="plus_btn" tool_tip="Rejoindre/créer un nouveau groupe"/> + <dnd_button name="minus_btn" tool_tip="Quitter le groupe sélectionné"/> </panel> </panel> <panel label="RÉCENT" name="recent_panel"> - <panel label="bottom_panel" name="bottom_panel"> - <menu_button name="recent_viewsort_btn" tool_tip="Options"/> - <button name="add_friend_btn" tool_tip="Ajouter le résident sélectionné à votre liste d'amis"/> + <panel label="bottom_panel" name="recent_buttons_panel"> + <filter_editor label="Filtrer les personnes" name="recent_filter_input"/> + <button name="gear_btn" tool_tip="Actions sur la personne sélectionnée"/> + <menu_button name="recent_view_btn" tool_tip="Options d'affichage/de tri"/> + <button name="add_friend_btn" tool_tip="Proposer à ce résident de devenir votre ami"/> + <dnd_button name="recent_del_btn" tool_tip="Supprimer la personne sélectionnée des amis"/> </panel> </panel> + <panel label="BLOQUÉ" name="blocked_panel"> + <panel label="Résidents et objets ignorés" name="panel_block_list_sidetray"/> + </panel> </tab_container> - <panel name="button_bar"> - <layout_stack name="bottom_bar_ls"> - <layout_panel name="view_profile_btn_lp"> - <button label="Profil" name="view_profile_btn" tool_tip="Afficher la photo, les groupes et autres infos des résidents"/> - </layout_panel> - <layout_panel name="im_btn_lp"> - <button label="IM" name="im_btn" tool_tip="Ouvrir une session IM."/> - </layout_panel> - <layout_panel name="call_btn_lp"> - <button label="Appel" name="call_btn" tool_tip="Appeler ce résident."/> - </layout_panel> - <layout_panel name="share_btn_lp"> - <button label="Partager" name="share_btn" tool_tip="Partager un article de l'inventaire."/> - </layout_panel> - <layout_panel name="teleport_btn_lp"> - <button label="Téléporter" name="teleport_btn" tool_tip="Proposer une téléportation."/> - </layout_panel> - </layout_stack> - <layout_stack name="bottom_bar_ls1"> - <layout_panel name="group_info_btn_lp"> - <button label="Profil du groupe" name="group_info_btn" tool_tip="Afficher les informations sur le groupe"/> - </layout_panel> - <layout_panel name="chat_btn_lp"> - <button label="Chat de groupe" name="chat_btn" tool_tip="Ouvrir une session de chat"/> - </layout_panel> - <layout_panel name="group_call_btn_lp"> - <button label="Appel de groupe" name="group_call_btn" tool_tip="Appeler ce groupe"/> - </layout_panel> - </layout_stack> - </panel> </panel> diff --git a/indra/newview/skins/default/xui/fr/panel_preferences_chat.xml b/indra/newview/skins/default/xui/fr/panel_preferences_chat.xml index 550beb653e..972190dc15 100644 --- a/indra/newview/skins/default/xui/fr/panel_preferences_chat.xml +++ b/indra/newview/skins/default/xui/fr/panel_preferences_chat.xml @@ -1,34 +1,86 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel label="Chat écrit" name="chat"> - <text name="font_size"> - Taille de la police : - </text> - <radio_group name="chat_font_size"> - <radio_item label="Petite" name="radio" value="0"/> - <radio_item label="Moyenne" name="radio2" value="1"/> - <radio_item label="Grande" name="radio3" value="2"/> - </radio_group> - <check_box initial_value="true" label="Exécuter l'animation clavier quand vous écrivez" name="play_typing_animation"/> - <check_box label="M'envoyer les IM par e-mail une fois déconnecté" name="send_im_to_email"/> - <check_box label="Activer l'historique des chats et des IM en texte brut" name="plain_text_chat_history"/> - <check_box label="Bulles de chat" name="bubble_text_chat"/> - <text name="show_ims_in_label"> - Afficher les IM dans : - </text> - <text name="requires_restart_label"> - (redémarrage requis) - </text> - <radio_group name="chat_window" tool_tip="Afficher vos messages instantanés dans plusieurs fenêtres ou dans une seule fenêtre avec plusieurs onglets (redémarrage requis)"> - <radio_item label="Plusieurs fenêtres" name="radio" value="0"/> - <radio_item label="Onglets" name="radio2" value="1"/> - </radio_group> - <text name="disable_toast_label"> - Activer les popups de chat entrant : - </text> - <check_box label="Chats de groupe" name="EnableGroupChatPopups" tool_tip="Cocher cette case pour qu'un popup s'affiche à réception d'un message de chat de groupe."/> - <check_box label="Chats IM" name="EnableIMChatPopups" tool_tip="Cocher cette case pour qu'un popup s'affiche à réception d'un message instantané."/> - <spinner label="Durée de vie du popup Chat près de moi :" name="nearby_toasts_lifetime"/> - <spinner label="Disparition progressive du popup Chat près de moi :" name="nearby_toasts_fadingtime"/> + <panel> + <check_box initial_value="true" label="Exécuter l'animation clavier quand vous écrivez" name="play_typing_animation"/> + <check_box label="M'envoyer les IM par e-mail une fois déconnecté" name="send_im_to_email"/> + <check_box label="Seuls mes amis et groupes peuvent m'appeler ou m'envoyer un IM" name="voice_call_friends_only_check"/> + <text name="font_size"> + Taille de la police : + </text> + <combo_box name="chat_font_size"> + <item label="Petite" name="Small" value="0"/> + <item label="Moyenne" name="Medium" value="1"/> + <item label="Grande" name="Large" value="2"/> + </combo_box> + <check_box label="Bulles de chat" name="bubble_text_chat"/> + </panel> + <panel> + <text name="notifications"> + Notifications + </text> + <text name="friend_ims"> + IM amis : + </text> + <combo_box name="FriendIMOptions"> + <item label="Ouvrir la fenêtre Conversation" name="OpenConversationsWindow" value="openconversations"/> + <item label="Afficher le message dans une fenêtre popup" name="PopUpMessage" value="toast"/> + <item label="Bouton de la barre d'outils Flash" name="FlashToolbarButton" value="clignote"/> + <item label="Aucun(e)" name="None" value="aucun(e)"/> + </combo_box> + <text name="non_friend_ims"> + IM non amis : + </text> + <combo_box name="NonFriendIMOptions"> + <item label="Ouvrir la fenêtre Conversation" name="OpenConversationsWindow" value="openconversations"/> + <item label="Afficher le message dans une fenêtre popup" name="PopUpMessage" value="toast"/> + <item label="Bouton de la barre d'outils Flash" name="FlashToolbarButton" value="clignote"/> + <item label="Aucun(e)" name="None" value="aucun(e)"/> + </combo_box> + <text name="conference_ims"> + IM conférence : + </text> + <combo_box name="ConferenceIMOptions"> + <item label="Ouvrir la fenêtre Conversation" name="OpenConversationsWindow" value="openconversations"/> + <item label="Afficher le message dans une fenêtre popup" name="PopUpMessage" value="toast"/> + <item label="Bouton de la barre d'outils Flash" name="FlashToolbarButton" value="clignote"/> + <item label="Aucun(e)" name="None" value="aucun(e)"/> + </combo_box> + <text name="group_chat"> + Chat de groupe : + </text> + <combo_box name="GroupChatOptions"> + <item label="Ouvrir la fenêtre Conversation" name="OpenConversationsWindow" value="openconversations"/> + <item label="Afficher le message dans une fenêtre popup" name="PopUpMessage" value="toast"/> + <item label="Bouton de la barre d'outils Flash" name="FlashToolbarButton" value="clignote"/> + <item label="Aucun(e)" name="None" value="aucun(e)"/> + </combo_box> + <text name="nearby_chat"> + Chat près de moi : + </text> + <combo_box name="NearbyChatOptions"> + <item label="Ouvrir la fenêtre Conversation" name="OpenConversationsWindow" value="openconversations"/> + <item label="Afficher le message dans une fenêtre popup" name="PopUpMessage" value="toast"/> + <item label="Bouton de la barre d'outils Flash" name="FlashToolBarButton" value="clignote"/> + <item label="Aucun(e)" name="None" value="aucun(e)"/> + </combo_box> + <text name="notifications_alert"> + Pour suspendre temporairement toutes les notifications, utilisez Communication > Ne pas déranger. + </text> + </panel> + <panel> + <text name="play_sound"> + Écouter le son : + </text> + <check_box label="Nouvelle conversation" name="new_conversation"/> + <check_box label="Appel entrant" name="incoming_voice_call"/> + <check_box label="Offre de téléportation" name="teleport_offer"/> + <check_box label="Offre d'inventaire" name="inventory_offer"/> + </panel> + <panel> + <button label="Effacer le journal..." name="clear_log"/> + <button label="Supprimer les transcriptions..." name="delete_transcripts"/> + <button label="Parcourir..." label_selected="Parcourir" name="log_path_button"/> + </panel> <button label="Traduction..." name="ok_btn"/> <button label="Rechercher/Remplacer..." name="autoreplace_showgui"/> <button label="Orthographe..." name="spellcheck_showgui"/> diff --git a/indra/newview/skins/default/xui/fr/panel_preferences_general.xml b/indra/newview/skins/default/xui/fr/panel_preferences_general.xml index 66b84af3aa..533c392d6b 100644 --- a/indra/newview/skins/default/xui/fr/panel_preferences_general.xml +++ b/indra/newview/skins/default/xui/fr/panel_preferences_general.xml @@ -69,9 +69,9 @@ <combo_box.item label="Jamais" name="item4"/> </combo_box> <text name="text_box3"> - Réponse si occupé(e) : + Réponse Ne pas déranger </text> - <text_editor name="busy_response"> + <text_editor name="do_not_disturb_response"> log_in_to_change </text_editor> </panel> diff --git a/indra/newview/skins/default/xui/fr/sidepanel_task_info.xml b/indra/newview/skins/default/xui/fr/sidepanel_task_info.xml index 60027d41cb..896dd932e3 100644 --- a/indra/newview/skins/default/xui/fr/sidepanel_task_info.xml +++ b/indra/newview/skins/default/xui/fr/sidepanel_task_info.xml @@ -72,6 +72,7 @@ <combo_box.item label="Acheter l'objet" name="Buyobject"/> <combo_box.item label="Payer l'objet" name="Payobject"/> <combo_box.item label="Ouvrir" name="Open"/> + <combo_box.item label="Zoom" name="Zoom"/> </combo_box> <panel name="perms_inv"> <text name="perm_modify"> diff --git a/indra/newview/skins/default/xui/fr/strings.xml b/indra/newview/skins/default/xui/fr/strings.xml index 6a2a3f559a..69ed20f376 100644 --- a/indra/newview/skins/default/xui/fr/strings.xml +++ b/indra/newview/skins/default/xui/fr/strings.xml @@ -137,7 +137,7 @@ Quitter </string> <string name="create_account_url"> - http://join.secondlife.com/index.php?lang=fr-FR&sourceid=[sourceid] + http://join.secondlife.com/?sourceid=[sourceid] </string> <string name="LoginFailedViewerNotPermitted"> Le client que vous utilisez ne permet plus d'accéder à Second Life. Téléchargez un nouveau client à la page suivante : @@ -622,8 +622,8 @@ Veuillez réessayer de vous connecter dans une minute. <string name="AvatarAway"> Absent </string> - <string name="AvatarBusy"> - Occupé + <string name="AvatarDoNotDisturb"> + Ne pas déranger </string> <string name="AvatarMuted"> Bloqué(e) @@ -859,6 +859,12 @@ Veuillez réessayer de vous connecter dans une minute. <string name="ST_NO_JOINT"> Impossible de trouver ROOT ou JOINT. </string> + <string name="NearbyChatTitle"> + Chat près de moi + </string> + <string name="NearbyChatLabel"> + (Chat près de moi) + </string> <string name="whisper"> chuchote : </string> @@ -922,12 +928,15 @@ 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> + <string name="AgentNameSubst"> + (Vous) + </string> + <string name="TeleportYourAgent"> + Vous téléporter + </string> <string name="SIM_ACCESS_PG"> Général </string> @@ -1009,18 +1018,6 @@ Veuillez réessayer de vous connecter dans une minute. <string name="dictionary_files"> Dictionnaires </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> @@ -1989,8 +1986,8 @@ Veuillez réessayer de vous connecter dans une minute. <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'il a demandé à ne pas être dérangé. Votre message restera affiché dans son panneau IM afin qu'il puisse le lire ultérieurement. + <string name="DoNotDisturbModeResponseDefault"> + Ce résident a activé Ne pas déranger et verra votre message plus tard. </string> <string name="MuteByName"> (par nom) @@ -2103,9 +2100,6 @@ Veuillez réessayer de vous connecter dans une minute. <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> @@ -3877,7 +3871,7 @@ Si ce message persiste, veuillez aller sur la page [SUPPORT_SITE]. Région de type Général </string> <string name="LocationCtrlSeeAVsTooltip"> - Avatars visibles et chat autorisé en dehors de cette parcelle + Les avatars à l'extérieur de cette parcelle ne peuvent pas voir ni entendre les avatars qui se trouvent à l'intérieur. </string> <string name="LocationCtrlPathfindingDirtyTooltip"> Les objets mobiles risquent de ne pas se comporter correctement dans cette région tant qu'elle n'est pas refigée. @@ -3954,6 +3948,12 @@ Si ce message persiste, veuillez aller sur la page [SUPPORT_SITE]. <string name="IM_unblock_only_groups_friends"> Pour afficher ce message, vous devez désactiver la case Seuls mes amis et groupes peuvent m'appeler ou m'envoyer un IM, sous Préférences/Confidentialité. </string> + <string name="OnlineStatus"> + En ligne + </string> + <string name="OfflineStatus"> + Hors ligne + </string> <string name="answered_call"> Votre appel a fait l'objet d'une réponse </string> @@ -3963,6 +3963,9 @@ Si ce message persiste, veuillez aller sur la page [SUPPORT_SITE]. <string name="you_joined_call"> Vous avez rejoint l'appel </string> + <string name="you_auto_rejected_call-im"> + Vous avez automatiquement refusé l'appel vocal quand le mode Ne pas déranger était activé. + </string> <string name="name_started_call"> [NAME] appelle. </string> @@ -3979,7 +3982,7 @@ Si ce message persiste, veuillez aller sur la page [SUPPORT_SITE]. Connexion en cours... </string> <string name="conference-title"> - Conférence ad-hoc + Chat à plusieurs </string> <string name="conference-title-incoming"> Conférence avec [AGENT_NAME] @@ -4859,6 +4862,9 @@ Essayez avec le chemin d'accès à l'éditeur entre guillemets doubles <string name="Command_Chat_Label"> Chat </string> + <string name="Command_Conversations_Label"> + Conversations + </string> <string name="Command_Compass_Label"> Boussole </string> @@ -4934,6 +4940,9 @@ Essayez avec le chemin d'accès à l'éditeur entre guillemets doubles <string name="Command_Chat_Tooltip"> Parler aux personnes près de vous par chat écrit </string> + <string name="Command_Conversations_Tooltip"> + Parler à quelqu'un + </string> <string name="Command_Compass_Tooltip"> Boussole </string> @@ -5063,4 +5072,13 @@ Essayez avec le chemin d'accès à l'éditeur entre guillemets doubles <string name="UserDictionary"> [User] </string> + <string name="logging_calls_disabled_log_empty"> + Les conversations ne sont pas archivées. Pour commencer à tenir un journal, choisissez Enregistrer : Journal seul ou Enregistrer : Journal et transcriptions sous Préférences > Chat. + </string> + <string name="logging_calls_disabled_log_not_empty"> + Aucune conversation ne sera plus enregistrée. Pour recommencer à tenir un journal, choisissez Enregistrer : Journal seul ou Enregistrer : Journal et transcriptions sous Préférences > Chat. + </string> + <string name="logging_calls_enabled_log_empty"> + Il n'y a aucune conversation enregistrée. Quand quelqu'un vous contacte ou quand vous contactez quelqu'un, une entrée de journal s'affiche ici. + </string> </strings> diff --git a/indra/newview/skins/default/xui/it/floater_conversation_log.xml b/indra/newview/skins/default/xui/it/floater_conversation_log.xml new file mode 100644 index 0000000000..8354824ed1 --- /dev/null +++ b/indra/newview/skins/default/xui/it/floater_conversation_log.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="floater_conversation_log" title="REGISTRO CONVERSAZIONI"> + <panel name="buttons_panel"> + <filter_editor label="Filtro persone" name="people_filter_input"/> + <menu_button name="conversation_view_btn" tool_tip="Opzioni Mostra/Ordina"/> + <menu_button name="conversations_gear_btn" tool_tip="Azioni sulla persona o gruppo selezionato"/> + </panel> +</floater> diff --git a/indra/newview/skins/default/xui/it/floater_conversation_preview.xml b/indra/newview/skins/default/xui/it/floater_conversation_preview.xml new file mode 100644 index 0000000000..d0e9c8ee0e --- /dev/null +++ b/indra/newview/skins/default/xui/it/floater_conversation_preview.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="preview_conversation" title="CONVERSAZIONE:"> + <floater.string name="Title"> + CONVERSAZIONE: [NAME] + </floater.string> + <text name="page_label" value="Pagina"/> +</floater> diff --git a/indra/newview/skins/default/xui/it/floater_im_container.xml b/indra/newview/skins/default/xui/it/floater_im_container.xml index fb8e77b32f..10cf1b7f7e 100644 --- a/indra/newview/skins/default/xui/it/floater_im_container.xml +++ b/indra/newview/skins/default/xui/it/floater_im_container.xml @@ -1,2 +1,29 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<multi_floater name="floater_im_box" title="CONVERSAZIONI"/> +<multi_floater name="floater_im_box" title="CONVERSAZIONI"> + <string name="collapse_icon" value="Conv_toolbar_collapse"/> + <string name="expand_icon" value="Conv_toolbar_expand"/> + <layout_stack name="conversations_stack"> + <layout_panel name="conversations_layout_panel"> + <layout_stack name="conversations_pane_buttons_stack"> + <layout_panel name="conversations_pane_buttons_expanded"> + <menu_button name="sort_btn" tool_tip="Opzioni Mostra/Ordina"/> + <button name="add_btn" tool_tip="Avvia una nuova conversazione"/> + <button name="speak_btn" tool_tip="Parla con le persone usando il microfono"/> + </layout_panel> + <layout_panel name="conversations_pane_buttons_collapsed"> + <button name="expand_collapse_btn" tool_tip="Minimizza/espandi questo elenco"/> + </layout_panel> + </layout_stack> + </layout_panel> + <layout_panel name="messages_layout_panel"> + <panel_container name="im_box_tab_container"> + <panel name="stub_panel"> + <button name="stub_collapse_btn" tool_tip="Minimizza questo pannello"/> + <text name="stub_textbox"> + Questa conversazione in una finestra separata. [secondlife:/// Ripristina conversazione.] + </text> + </panel> + </panel_container> + </layout_panel> + </layout_stack> +</multi_floater> diff --git a/indra/newview/skins/default/xui/it/floater_im_session.xml b/indra/newview/skins/default/xui/it/floater_im_session.xml index 3d9d17fc81..d38ec7a5fe 100644 --- a/indra/newview/skins/default/xui/it/floater_im_session.xml +++ b/indra/newview/skins/default/xui/it/floater_im_session.xml @@ -1,8 +1,59 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="panel_im"> - <layout_stack name="im_panels"> - <layout_panel> - <line_editor label="A" name="chat_editor"/> - </layout_panel> - </layout_stack> + <floater.string name="call_btn_start"> + Conv_toolbar_open_call + </floater.string> + <floater.string name="call_btn_stop"> + Conv_toolbar_hang_up + </floater.string> + <floater.string name="collapseline_icon" value="Conv_collapse_to_one_line"/> + <floater.string name="expandline_icon" value="Conv_expand_one_line"/> + <floater.string name="collapse_icon" value="Conv_toolbar_collapse"/> + <floater.string name="expand_icon" value="Conv_toolbar_expand"/> + <floater.string name="tear_off_icon" value="Conv_toolbar_arrow_ne"/> + <floater.string name="return_icon" value="Conv_toolbar_arrow_sw"/> + <floater.string name="participant_added" value="[NAME] è stato invitato alla conversazione."/> + <floater.string name="multiple_participants_added" value="[NAME] sono stati invitati alla conversazione."/> + <floater.string name="tooltip_to_separate_window" value="Sposta questa conversazione in una finestra separata."/> + <floater.string name="tooltip_to_main_window" value="Sposta questa conversazione di nuovo nella finestra principale"/> + <floater.string name="start_call_button_tooltip" value="Apri collegamento voce"/> + <floater.string name="end_call_button_tooltip" value="Chiudi collegamento voce"/> + <floater.string name="expcol_button_not_tearoff_tooltip" value="Minimizza questo pannello"/> + <floater.string name="expcol_button_tearoff_and_expanded_tooltip" value="Minimizza elenco partecipanti"/> + <floater.string name="expcol_button_tearoff_and_collapsed_tooltip" value="Espandi l'elenco dei partecipanti"/> + <view name="contents_view"> + <layout_stack name="main_stack"> + <layout_panel name="toolbar_panel"> + <menu_button name="view_options_btn" tool_tip="Opzioni Mostra/Ordina"/> + <menu_button name="gear_btn" tool_tip="Azioni per la persona selezionata:"/> + <button name="add_btn" tool_tip="Aggiungi qualcuno a questa conversazione"/> + <button name="voice_call_btn" tool_tip="Apri collegamento voce"/> + <button name="close_btn" tool_tip="Termina questa conversazione"/> + <button name="expand_collapse_btn" tool_tip="Minimizza/espandi questo pannello"/> + </layout_panel> + <layout_panel name="body_panel"> + <layout_stack name="im_panels"> + <layout_panel name="right_part_holder"> + <panel name="trnsAndChat_panel"> + <layout_stack name="translate_and_chat_stack"> + <layout_panel name="translate_chat_checkbox_lp"> + <check_box label="Traduci chat" name="translate_chat_checkbox"/> + </layout_panel> + </layout_stack> + </panel> + </layout_panel> + </layout_stack> + </layout_panel> + <layout_panel name="chat_layout_panel"> + <layout_stack name="input_panels"> + <layout_panel name="input_editor_layout_panel"> + <chat_editor label="A" name="chat_editor"/> + </layout_panel> + <layout_panel name="input_button_layout_panel"> + <button name="minz_btn" tool_tip="Mostra/nascondi pannello messaggi"/> + </layout_panel> + </layout_stack> + </layout_panel> + </layout_stack> + </view> </floater> diff --git a/indra/newview/skins/default/xui/it/floater_incoming_call.xml b/indra/newview/skins/default/xui/it/floater_incoming_call.xml index a95ed44662..566920209d 100644 --- a/indra/newview/skins/default/xui/it/floater_incoming_call.xml +++ b/indra/newview/skins/default/xui/it/floater_incoming_call.xml @@ -10,7 +10,7 @@ anonimo </floater.string> <floater.string name="VoiceInviteP2P"> - sta chiamando. + ti sta chiamando. </floater.string> <floater.string name="VoiceInviteAdHoc"> ha aderito ad una chiamata in chat vocale in conferenza. @@ -25,9 +25,9 @@ Vuoi abbandonare [CURRENT_CHAT] e aderire a questa voice chat? </floater.string> <text name="question"> - Vuoi abbandonare [CURRENT_CHAT] e aderire a questa voice chat? + Se rispondi, verrà interrotto il collegamento dalla conversazione a voce corrente. </text> - <button label="Accetta" label_selected="Accetta" name="Accept"/> - <button label="Rifiuta" label_selected="Rifiuta" name="Reject"/> - <button label="Inizia IM" name="Start IM"/> + <button label="Risposta" label_selected="Risposta" name="Accept"/> + <button label="Ignora" label_selected="Ignora" name="Reject"/> + <button label="Apri invece IM" name="Start IM"/> </floater> diff --git a/indra/newview/skins/default/xui/it/floater_pathfinding_console.xml b/indra/newview/skins/default/xui/it/floater_pathfinding_console.xml index 77be220a2a..7777444161 100644 --- a/indra/newview/skins/default/xui/it/floater_pathfinding_console.xml +++ b/indra/newview/skins/default/xui/it/floater_pathfinding_console.xml @@ -71,7 +71,7 @@ <text name="show_label"> Mostra: </text> - <check_box label="Mondo" name="show_world"/> + <check_box label="Test" name="show_world"/> <check_box label="Solo elementi spostabili" name="show_world_movables_only"/> <check_box label="Navmesh" name="show_navmesh"/> <text name="show_walkability_label"> 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 c97a91bb3f..27a17868a7 100644 --- a/indra/newview/skins/default/xui/it/floater_texture_ctrl.xml +++ b/indra/newview/skins/default/xui/it/floater_texture_ctrl.xml @@ -19,7 +19,7 @@ <button label="Default" label_selected="Default" name="Default"/> <button label="Vuoto" label_selected="Vuoto" name="Blank"/> <button label="Niente" label_selected="Niente" name="None"/> - <check_box initial_value="true" label="Anteprima dal vivo" name="apply_immediate_check"/> + <check_box initial_value="true" label="Applica adesso" name="apply_immediate_check"/> <text name="preview_disabled" value="Anteprima disattivata"/> <filter_editor label="Filtro texture" name="inventory search editor"/> <check_box initial_value="false" label="Mostra cartelle" name="show_folders_check"/> diff --git a/indra/newview/skins/default/xui/it/floater_voice_chat_volume.xml b/indra/newview/skins/default/xui/it/floater_voice_chat_volume.xml new file mode 100644 index 0000000000..b168d067c2 --- /dev/null +++ b/indra/newview/skins/default/xui/it/floater_voice_chat_volume.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="floater_voice_volume" title="VOLUME CHAT VOCALE"> + <slider label="Chat vocale" name="chat_voice_volume"/> +</floater> diff --git a/indra/newview/skins/default/xui/it/floater_voice_effect.xml b/indra/newview/skins/default/xui/it/floater_voice_effect.xml index c83b11f698..f102622f5d 100644 --- a/indra/newview/skins/default/xui/it/floater_voice_effect.xml +++ b/indra/newview/skins/default/xui/it/floater_voice_effect.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater label="Luoghi" name="voice_effects" title="MANIPOLAZIONE VOCE"> +<floater label="Luoghi" name="voice_effects" title="ANTEPRIMA MANIPOLAZIONE VOCE"> <string name="no_voice_effect"> (Nessuna manipolazione voce) </string> diff --git a/indra/newview/skins/default/xui/it/floater_voice_volume.xml b/indra/newview/skins/default/xui/it/floater_voice_volume.xml new file mode 100644 index 0000000000..eaeda7597f --- /dev/null +++ b/indra/newview/skins/default/xui/it/floater_voice_volume.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<!-- + Not can_close / no title to avoid window chrome + Single instance - only have one at a time, recycle it each spawn +--> +<floater name="floater_voice_volume" title="VOLUME VOCE"> + <slider name="volume_slider" tool_tip="Volume voce" value="0.5"/> +</floater> diff --git a/indra/newview/skins/default/xui/it/menu_cof_gear.xml b/indra/newview/skins/default/xui/it/menu_cof_gear.xml index 10524ba92d..984e4a1611 100644 --- a/indra/newview/skins/default/xui/it/menu_cof_gear.xml +++ b/indra/newview/skins/default/xui/it/menu_cof_gear.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<menu name="Gear COF"> +<toggleable_menu name="Gear COF"> <menu label="Nuovi abiti" name="COF.Gear.New_Clothes"/> - <menu label="Nuove parti del corpo" name="COF.Geear.New_Body_Parts"/> -</menu> + <menu label="Nuove parti del corpo" name="COF.Gear.New_Body_Parts"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/it/menu_conversation.xml b/indra/newview/skins/default/xui/it/menu_conversation.xml new file mode 100644 index 0000000000..46ced93f1d --- /dev/null +++ b/indra/newview/skins/default/xui/it/menu_conversation.xml @@ -0,0 +1,31 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_conversation_participant"> + <menu_item_call label="Chiudi la conversazione" name="close_conversation"/> + <menu_item_call label="Apri conversazione a voce" name="open_voice_conversation"/> + <menu_item_call label="Interrompi collegamento a voce" name="disconnect_from_voice"/> + <menu_item_call label="Vedi profilo" name="view_profile"/> + <menu_item_call label="IM" name="im"/> + <menu_item_call label="Offri teleport" name="offer_teleport"/> + <menu_item_call label="Chiamata a voce" name="voice_call"/> + <menu_item_call label="Cronologia chat..." name="chat_history"/> + <menu_item_call label="Aggiungi amico" name="add_friend"/> + <menu_item_call label="Rimuovi amico" name="remove_friend"/> + <menu_item_call label="Rimuovi amici" name="remove_friends"/> + <menu_item_call label="Invita al gruppo..." name="invite_to_group"/> + <menu_item_call label="Zoom avanti" name="zoom_in"/> + <menu_item_call label="Mappa" name="map"/> + <menu_item_call label="Condividi" name="share"/> + <menu_item_call label="Paga" name="pay"/> + <menu_item_check label="Blocca voce" name="block_unblock"/> + <menu_item_check label="Blocca testo" name="MuteText"/> + <menu_item_call label="Profilo del gruppo" name="group_profile"/> + <menu_item_call label="Attiva gruppo" name="activate_group"/> + <menu_item_call label="Lascia il gruppo" name="leave_group"/> + <context_menu label="Opzioni moderatore" name="Moderator Options"> + <menu_item_check label="Consenti chat di testo" name="AllowTextChat"/> + <menu_item_call label="Disattiva audio di questo partecipante" name="ModerateVoiceMuteSelected"/> + <menu_item_call label="Riattiva audio di questo partecipante" name="ModerateVoiceUnMuteSelected"/> + <menu_item_call label="Disattiva audio di tutti" name="ModerateVoiceMute"/> + <menu_item_call label="Riattiva audio di tutti" name="ModerateVoiceUnmute"/> + </context_menu> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/it/menu_conversation_log_gear.xml b/indra/newview/skins/default/xui/it/menu_conversation_log_gear.xml new file mode 100644 index 0000000000..5686a902eb --- /dev/null +++ b/indra/newview/skins/default/xui/it/menu_conversation_log_gear.xml @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="Conversation Context Menu"> + <menu_item_call label="IM..." name="IM"/> + <menu_item_call label="Chiamata a voce..." name="Call"/> + <menu_item_call label="Apro la cronologia delle chat..." name="Chat history"/> + <menu_item_call label="Vedi profilo" name="View Profile"/> + <menu_item_call label="Offri Teleport" name="teleport"/> + <menu_item_call label="Aggiungi come amico" name="add_friend"/> + <menu_item_call label="Rimuovi amico" name="remove_friend"/> + <menu_item_call label="Invita al gruppo..." name="Invite"/> + <menu_item_call label="Mappa" name="Map"/> + <menu_item_call label="Condividi" name="Share"/> + <menu_item_call label="Paga" name="Pay"/> + <menu_item_check label="Blocca/Sblocca" name="Block/Unblock"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/it/menu_conversation_log_view.xml b/indra/newview/skins/default/xui/it/menu_conversation_log_view.xml new file mode 100644 index 0000000000..73b05831ef --- /dev/null +++ b/indra/newview/skins/default/xui/it/menu_conversation_log_view.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_conversation_view"> + <menu_item_check label="Ordina in base al nome" name="sort_by_name"/> + <menu_item_check label="Ordina in base alla data" name="sort_by_date"/> + <menu_item_check label="Ordina con gli amici in alto" name="sort_by_friends"/> + <menu_item_call label="Mostra la cronologia delle chat vicine..." name="view_nearby_chat_history"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/it/menu_im_conversation.xml b/indra/newview/skins/default/xui/it/menu_im_conversation.xml new file mode 100644 index 0000000000..1621d57e12 --- /dev/null +++ b/indra/newview/skins/default/xui/it/menu_im_conversation.xml @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="Conversation Gear Menu"> + <menu_item_call label="Vedi profilo" name="View Profile"/> + <menu_item_call label="Aggiungi come amico" name="Add Friend"/> + <menu_item_call label="Rimuovi amico" name="remove_friend"/> + <menu_item_call label="Offri teleport" name="offer_teleport"/> + <menu_item_call label="Invita al gruppo..." name="invite_to_group"/> + <menu_item_call label="Cronologia chat..." name="chat_history"/> + <menu_item_call label="Zoom avanti" name="zoom_in"/> + <menu_item_call label="Mappa" name="map"/> + <menu_item_call label="Condividi" name="Share"/> + <menu_item_call label="Paga" name="Pay"/> + <menu_item_check label="Blocca voce" name="Block/Unblock"/> + <menu_item_check label="Blocca testo" name="MuteText"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/it/menu_im_session_showmodes.xml b/indra/newview/skins/default/xui/it/menu_im_session_showmodes.xml new file mode 100644 index 0000000000..350fbc5c6f --- /dev/null +++ b/indra/newview/skins/default/xui/it/menu_im_session_showmodes.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_modes"> + <menu_item_check label="Vista compatta" name="compact_view"/> + <menu_item_check label="Vista espansa" name="expanded_view"/> + <menu_item_check label="Mostra orario" name="IMShowTime"/> + <menu_item_check label="Mostra i nomi nelle conversazioni individuali" name="IMShowNamesForP2PConv"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/it/menu_object_icon.xml b/indra/newview/skins/default/xui/it/menu_object_icon.xml index 0f347b1a90..9623775af4 100644 --- a/indra/newview/skins/default/xui/it/menu_object_icon.xml +++ b/indra/newview/skins/default/xui/it/menu_object_icon.xml @@ -2,4 +2,6 @@ <menu name="Object Icon Menu"> <menu_item_call label="Profilo oggetto..." name="Object Profile"/> <menu_item_call label="Blocca..." name="Block"/> + <menu_item_call label="Mostra sulla mappa" name="show_on_map"/> + <menu_item_call label="Teleport sul luogo dell'oggetto" name="teleport_to_object"/> </menu> diff --git a/indra/newview/skins/default/xui/it/menu_outfit_gear.xml b/indra/newview/skins/default/xui/it/menu_outfit_gear.xml index 09fc867d7c..3ac0c5ce69 100644 --- a/indra/newview/skins/default/xui/it/menu_outfit_gear.xml +++ b/indra/newview/skins/default/xui/it/menu_outfit_gear.xml @@ -23,6 +23,8 @@ <menu_item_call label="Nuovi capelli" name="New Hair"/> <menu_item_call label="Nuovi occhi" name="New Eyes"/> </menu> + <menu_item_call label="Apri tutte le cartelle" name="expand"/> + <menu_item_call label="Chiudi tutte le cartelle" name="collapse"/> <menu_item_call label="Cambia nome del vestiario" name="rename"/> <menu_item_call label="Elimina vestito" name="delete_outfit"/> </toggleable_menu> diff --git a/indra/newview/skins/default/xui/it/menu_participant_view.xml b/indra/newview/skins/default/xui/it/menu_participant_view.xml new file mode 100644 index 0000000000..c87cda57bf --- /dev/null +++ b/indra/newview/skins/default/xui/it/menu_participant_view.xml @@ -0,0 +1,13 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="participant_manu_view"> + <menu_item_check label="Ordina le conversazioni in base al tipo" name="sort_sessions_by_type"/> + <menu_item_check label="Ordina le conversazioni in base al nome" name="sort_sessions_by_name"/> + <menu_item_check label="Ordina le conversazioni in base alle attività più recenti" name="sort_sessions_by_recent"/> + <menu_item_check label="Ordina i partecipanti in base al nome" name="sort_participants_by_name"/> + <menu_item_check label="Ordina i partecipanti in base alle attività più recenti" name="sort_participants_by_recent"/> + <menu_item_call label="Preferenze chat..." name="chat_preferences"/> + <menu_item_call label="Preferenze privacy..." name="privacy_preferences"/> + <menu_item_check label="Registro conversazioni..." name="Conversation"/> + <menu_item_check label="Traduci chat vicina" name="Translate_chat"/> + <menu_item_check label="Impostazioni traduzione..." name="Translation_settings"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/it/menu_people_blocked_gear.xml b/indra/newview/skins/default/xui/it/menu_people_blocked_gear.xml new file mode 100644 index 0000000000..e9955923b2 --- /dev/null +++ b/indra/newview/skins/default/xui/it/menu_people_blocked_gear.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_blocked_gear"> + <menu_item_call label="Sblocca" name="unblock"/> + <menu_item_call label="Profilo..." name="profile"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/it/menu_people_blocked_plus.xml b/indra/newview/skins/default/xui/it/menu_people_blocked_plus.xml new file mode 100644 index 0000000000..cbcf084b86 --- /dev/null +++ b/indra/newview/skins/default/xui/it/menu_people_blocked_plus.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_blocked_plus"> + <menu_item_call label="Blocca residente per nome..." name="block_resident_by_name"/> + <menu_item_call label="Blocca oggetto per nome" name="block_object_by_name"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/it/menu_people_blocked_view.xml b/indra/newview/skins/default/xui/it/menu_people_blocked_view.xml new file mode 100644 index 0000000000..fc80c73ae3 --- /dev/null +++ b/indra/newview/skins/default/xui/it/menu_people_blocked_view.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_blocked_view"> + <menu_item_check label="Ordina in base al nome" name="sort_by_name"/> + <menu_item_check label="Ordina in base al tipo" name="sort_by_type"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/it/menu_people_friends_view.xml b/indra/newview/skins/default/xui/it/menu_people_friends_view.xml new file mode 100644 index 0000000000..972e359cfe --- /dev/null +++ b/indra/newview/skins/default/xui/it/menu_people_friends_view.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_group_plus"> + <menu_item_check label="Ordina in base al nome" name="sort_name"/> + <menu_item_check label="Ordina in base allo stato" name="sort_status"/> + <menu_item_check label="Mostra le icone delle persone" name="view_icons"/> + <menu_item_check label="Mostra le autorizzazioni concesse" name="view_permissions"/> + <menu_item_check label="Mostra il registro conversazioni..." name="view_conversation"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/it/menu_people_groups.xml b/indra/newview/skins/default/xui/it/menu_people_groups.xml index 30a97a1c72..8ca7537ee0 100644 --- a/indra/newview/skins/default/xui/it/menu_people_groups.xml +++ b/indra/newview/skins/default/xui/it/menu_people_groups.xml @@ -2,7 +2,7 @@ <menu name="menu_group_plus"> <menu_item_call label="Mostra informazioni" name="View Info"/> <menu_item_call label="Chat" name="Chat"/> - <menu_item_call label="Chiama" name="Call"/> + <menu_item_call label="Chiamata a voce" name="Call"/> <menu_item_call label="Attiva" name="Activate"/> <menu_item_call label="Chiudi" name="Leave"/> </menu> diff --git a/indra/newview/skins/default/xui/it/menu_people_groups_view.xml b/indra/newview/skins/default/xui/it/menu_people_groups_view.xml new file mode 100644 index 0000000000..56b9abbd3a --- /dev/null +++ b/indra/newview/skins/default/xui/it/menu_people_groups_view.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_group_plus"> + <menu_item_check label="Mostra le icone di gruppo" name="Display Group Icons"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/it/menu_people_nearby.xml b/indra/newview/skins/default/xui/it/menu_people_nearby.xml index a974bd181d..1c09b1cfe2 100644 --- a/indra/newview/skins/default/xui/it/menu_people_nearby.xml +++ b/indra/newview/skins/default/xui/it/menu_people_nearby.xml @@ -1,13 +1,16 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <context_menu name="Avatar Context Menu"> - <menu_item_call label="Vedi profilo" name="View Profile"/> - <menu_item_call label="Aggiungi amico" name="Add Friend"/> - <menu_item_call label="Rimuovi amico" name="Remove Friend"/> - <menu_item_call label="IM" name="IM"/> - <menu_item_call label="Chiama" name="Call"/> - <menu_item_call label="Mappa" name="Map"/> - <menu_item_call label="Condividi" name="Share"/> - <menu_item_call label="Paga" name="Pay"/> - <menu_item_check label="Blocca/Sblocca" name="Block/Unblock"/> - <menu_item_call label="Offri Teleport" name="teleport"/> + <menu_item_call label="Vedi profilo" name="view_profile"/> + <menu_item_call label="IM" name="im"/> + <menu_item_call label="Offri Teleport" name="offer_teleport"/> + <menu_item_call label="Chiamata a voce" name="voice_call"/> + <menu_item_call label="Mostra la cronologia delle chat..." name="chat_history"/> + <menu_item_call label="Aggiungi come amico" name="add_friend"/> + <menu_item_call label="Rimuovi amico" name="remove_friend"/> + <menu_item_call label="Invita al gruppo..." name="invite_to_group"/> + <menu_item_call label="Zoom avanti" name="zoom_in"/> + <menu_item_call label="Mappa" name="map"/> + <menu_item_call label="Condividi" name="share"/> + <menu_item_call label="Paga" name="pay"/> + <menu_item_check label="Blocca/Sblocca" name="block_unblock"/> </context_menu> diff --git a/indra/newview/skins/default/xui/it/menu_people_nearby_multiselect.xml b/indra/newview/skins/default/xui/it/menu_people_nearby_multiselect.xml index e0b9ceb63d..b9ce70167f 100644 --- a/indra/newview/skins/default/xui/it/menu_people_nearby_multiselect.xml +++ b/indra/newview/skins/default/xui/it/menu_people_nearby_multiselect.xml @@ -1,10 +1,10 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <context_menu name="Multi-Selected People Context Menu"> - <menu_item_call label="Aggiungi amici" name="Add Friends"/> - <menu_item_call label="Rimuovi amici" name="Remove Friend"/> - <menu_item_call label="IM" name="IM"/> - <menu_item_call label="Chiama" name="Call"/> - <menu_item_call label="Condividi" name="Share"/> - <menu_item_call label="Paga" name="Pay"/> - <menu_item_call label="Offri Teleport" name="teleport"/> + <menu_item_call label="Aggiungi amici" name="add_friends"/> + <menu_item_call label="Rimuovi amici" name="remove_friends"/> + <menu_item_call label="IM" name="im"/> + <menu_item_call label="Chiama" name="call"/> + <menu_item_call label="Condividi" name="share"/> + <menu_item_call label="Paga" name="pay"/> + <menu_item_call label="Offri Teleport" name="offer_teleport"/> </context_menu> diff --git a/indra/newview/skins/default/xui/it/menu_people_nearby_view.xml b/indra/newview/skins/default/xui/it/menu_people_nearby_view.xml new file mode 100644 index 0000000000..223d88fee1 --- /dev/null +++ b/indra/newview/skins/default/xui/it/menu_people_nearby_view.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_group_plus"> + <menu_item_check label="Ordina in base a intervenuti recenti" name="sort_by_recent_speakers"/> + <menu_item_check label="Ordina in base al nome" name="sort_name"/> + <menu_item_check label="Ordina in base alla distanza" name="sort_distance"/> + <menu_item_check label="Mostra le icone delle persone" name="view_icons"/> + <menu_item_check label="Mostra mappa" name="view_map"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/it/menu_people_recent_view.xml b/indra/newview/skins/default/xui/it/menu_people_recent_view.xml new file mode 100644 index 0000000000..fc6213bd08 --- /dev/null +++ b/indra/newview/skins/default/xui/it/menu_people_recent_view.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_group_plus"> + <menu_item_check label="Mostra prima i più recenti" name="sort_most"/> + <menu_item_check label="Ordina in base al nome" name="sort_name"/> + <menu_item_check label="Mostra le icone delle persone" name="view_icons"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/it/menu_url_agent.xml b/indra/newview/skins/default/xui/it/menu_url_agent.xml index 37755d5749..abfbab35a3 100644 --- a/indra/newview/skins/default/xui/it/menu_url_agent.xml +++ b/indra/newview/skins/default/xui/it/menu_url_agent.xml @@ -1,6 +1,8 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <context_menu name="Url Popup"> - <menu_item_call label="Mostra profilo residente" name="show_agent"/> + <menu_item_call label="Vedi profilo" name="show_agent"/> + <menu_item_call label="Manda IM..." name="send_im"/> + <menu_item_call label="Aggiungi come amico..." name="add_friend"/> <menu_item_call label="Copia nome negli Appunti" name="url_copy_label"/> <menu_item_call label="Copia SLurl negli Appunti" name="url_copy"/> </context_menu> diff --git a/indra/newview/skins/default/xui/it/menu_url_objectim.xml b/indra/newview/skins/default/xui/it/menu_url_objectim.xml index 763e65f17c..8456d14b63 100644 --- a/indra/newview/skins/default/xui/it/menu_url_objectim.xml +++ b/indra/newview/skins/default/xui/it/menu_url_objectim.xml @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <context_menu name="Url Popup"> - <menu_item_call label="Mostra informazioni oggetto" name="show_object"/> + <menu_item_call label="Profilo oggetto..." name="show_object"/> <menu_item_call label="Mostra sulla mappa" name="show_on_map"/> <menu_item_call label="Teleport sul luogo dell'oggetto" name="teleport_to_object"/> <menu_item_call label="Copia nome oggetto negli Appunti" name="url_copy_label"/> diff --git a/indra/newview/skins/default/xui/it/menu_viewer.xml b/indra/newview/skins/default/xui/it/menu_viewer.xml index 547c5a9b73..16f5a7a89b 100644 --- a/indra/newview/skins/default/xui/it/menu_viewer.xml +++ b/indra/newview/skins/default/xui/it/menu_viewer.xml @@ -16,10 +16,7 @@ <menu_item_call label="Ferma animazione" name="Stop Animating My Avatar"/> <menu_item_call label="Cammina / corri / vola..." name="Walk / run / fly"/> </menu> - <menu label="Stato" name="Status"> - <menu_item_call label="Assente" name="Set Away"/> - <menu_item_call label="Non disponibile" name="Set Busy"/> - </menu> + <menu label="Stato" name="Status"/> <menu_item_call label="Acquista L$..." name="Buy and Sell L$"/> <menu_item_call label="Casella venditore in uscita..." name="MerchantOutbox"/> <menu_item_call label="Dashboard dell'account..." name="Manage My Account"> @@ -32,14 +29,18 @@ <menu_item_call label="Esci da [APP_NAME]" name="Quit"/> </menu> <menu label="Comunica" name="Communicate"> - <menu_item_check label="Chat..." name="Nearby Chat"/> + <menu_item_check label="Conversazioni..." name="Conversations"/> + <menu_item_check label="Chat nei dintorni..." name="Nearby Chat"/> <menu_item_check label="Parla" name="Speak"/> - <menu_item_check label="Impostazioni voce..." name="Nearby Voice"/> - <menu_item_check label="Manipolazione voce..." name="ShowVoice"/> + <menu label="Manipolazione voce" name="VoiceMorphing"> + <menu_item_check label="Nessuna manipolazione voce" name="NoVoiceMorphing"/> + <menu_item_check label="Anteprima..." name="Preview"/> + <menu_item_call label="Abbonati..." name="Subscribe"/> + </menu> <menu_item_check label="Gesture..." name="Gestures"/> - <menu_item_call label="Amici" name="My Friends"/> - <menu_item_call label="Gruppi" name="My Groups"/> - <menu_item_call label="Persone vicine" name="Active Speakers"/> + <menu_item_check label="Amici" name="My Friends"/> + <menu_item_check label="Gruppi" name="My Groups"/> + <menu_item_check label="Persone vicine" name="Active Speakers"/> <menu_item_call label="Blocca lista" name="Block List"/> </menu> <menu label="Mondo" name="World"> @@ -286,7 +287,7 @@ <menu label="Rendering" name="Rendering"> <menu_item_check label="Assi" name="Axes"/> <menu_item_check label="Wireframe" name="Wireframe"/> - <menu_item_check label="Luci e ombre" name="Lighting and Shadows"/> + <menu_item_check label="Luci e ombre" name="Advanced Lighting Model"/> <menu_item_check label="Ombra dal sole, dalla luna e dai proiettori" name="Shadows from Sun/Moon/Projectors"/> <menu_item_check label="SSAO e ombre fluide" name="SSAO and Shadow Smoothing"/> <menu_item_check label="Maschera alfa automatica (differita)" name="Automatic Alpha Masks (deferred)"/> diff --git a/indra/newview/skins/default/xui/it/notifications.xml b/indra/newview/skins/default/xui/it/notifications.xml index d5fdde4e7d..8adbebb62a 100644 --- a/indra/newview/skins/default/xui/it/notifications.xml +++ b/indra/newview/skins/default/xui/it/notifications.xml @@ -513,6 +513,24 @@ Visitare [_URL] per ulteriori informazioni? </url> <usetemplate ignoretext="Driver grafica obsoleto" name="okcancelignore" notext="No" yestext="Sì"/> </notification> + <notification name="AMDOldDriver"> + È probabile che ci sia un driver aggiornato per il processore grafico. L'aggiornamento dei driver della grafica può migliorare le prestazioni in maniera significativa. + + Visitare [_URL] per cercare un aggiornamento del driver? + <url name="url"> + http://support.amd.com/it/Pages/AMDSupportHub.aspx + </url> + <usetemplate ignoretext="Driver grafica obsoleto" name="okcancelignore" notext="No" yestext="Sì"/> + </notification> + <notification name="NVIDIAOldDriver"> + È probabile che ci sia un driver aggiornato per il processore grafico. L'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.nvidia.it/Download/index.aspx?lang=it + </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. @@ -1548,10 +1566,13 @@ Vuoi cancellare quell'elemento? Impossibile offrire l'amicizia in questo momento. Riprova fra poco. <usetemplate name="okbutton" yestext="OK"/> </notification> - <notification name="BusyModeSet"> - È stata impostata la modalità Non disponibile. -La chat e gli IM verranno nascosti. Gli IM riceveranno la tua risposta di Non disponibile. Tutte le offerte di teleport verranno rifiutate. Tutte le offerte di Inventario andranno nel Cestino. - <usetemplate ignoretext="Cambio il mio stato sulla modalità Non disponibile" name="okignore" yestext="OK"/> + <notification name="DoNotDisturbModeSet"> + Non disturbare è attivo. Non riceverai la notifica delle comunicazioni in arrivo. + +- Gli altri residenti riceveranno la tua risposta Non disturbare (impostata in Preferenze > Generali). +- Le offerte di teleport verranno rifiutate. +- Le chiamate voce verranno rifiutate. + <usetemplate ignoretext="Io cambio il mio stato alla modalità Non disturbare." name="okignore" yestext="OK"/> </notification> <notification name="JoinedTooManyGroupsMember"> Hai raggiunto il numero massimo di gruppi. Per favore abbandona almeno un gruppo prima di aderire a questo, oppure declina l'offerta. @@ -2039,6 +2060,10 @@ Trasferisci gli elementi nell'inventario? Vai al [http://secondlife.com/account/ Dashboard] per vedere la cronologia del tuo account? <usetemplate ignoretext="Lancia il browser per vedere la cronologia del mio account" name="okcancelignore" notext="Annulla" yestext="Vai alla pagina"/> </notification> + <notification name="ConfirmAddingChatParticipants"> + Quando aggiungi una persona a una conversazione esistente, viene creata una nuova conversazione. Tutti i partecipanti riceveranno notifiche per la nuova conversazione. + <usetemplate ignoretext="Conferma l'aggiunta dei partecipanti alla chat" name="okcancelignore" notext="Annulla" yestext="Ok"/> + </notification> <notification name="ConfirmQuit"> Confermi di voler uscire? <usetemplate ignoretext="Conferma prima di uscire" name="okcancelignore" notext="Non uscire" yestext="Esci"/> @@ -2113,14 +2138,14 @@ Vuoi sostituirlo con l'oggetto selezionato? <button ignore="Never Replace" name="No" text="Annulla"/> </form> </notification> - <notification label="Avviso di 'Occupato'" name="BusyModePay"> - Sei in modalità 'Occupato', ciò significa che non riceverai ciò che attendi per questo pagamento. + <notification label="Avviso modalità Non disturbare" name="DoNotDisturbModePay"> + Hai attivato la modalità Non disturbare. Non riceverai alcun oggetto offerto in cambio di questo pagamento. -Desideri abbandonare la modalità 'Occupato' prima di completare questa transazione? +Vuoi disattivare la modalità Non disturbare prima di completare questa transazione? <form name="form"> - <ignore name="ignore" save_option="true" text="Sto per pagare una persona o un oggetto mentro sono in modalià Non disponibile"/> - <button ignore="Always leave Busy Mode" name="Yes" text="OK"/> - <button ignore="Never leave Busy Mode" name="No" text="Abbandona"/> + <ignore name="ignore" text="Sto per pagare una persona o un oggetto mentre sono in modalità Non disturbare"/> + <button ignore="Lascia sempre la modalità Non disturbare" name="Yes" text="OK"/> + <button ignore="Non lasciare mai la modalità Non disturbare" name="No" text="Annulla"/> </form> </notification> <notification name="ConfirmDeleteProtectedCategory"> @@ -2255,11 +2280,8 @@ Inseriscilo in una pagina web per dare ad altri un accesso facile a questa ubica <notification name="GroupNotice"> Oggetto: [SUBJECT], Messaggio: [MESSAGE] </notification> - <notification name="FriendOnline"> - <nolink>[NAME]</nolink> è online - </notification> - <notification name="FriendOffline"> - <nolink>[NAME]</nolink> è offline + <notification name="FriendOnlineOffline"> + <nolink>[NAME]</nolink> è [STATUS] </notification> <notification name="AddSelfFriend"> Anche se sei molto simpatico, non puoi aggiungere te stesso all'elenco degli amici. @@ -2487,13 +2509,6 @@ Qui non puoi volare. <notification name="DynamicPathfindingDisabled"> Il pathfinding dinamico non è attivato in questa regione. Gli oggetti scriptati che usano chiamate LSL di pathfinding potrebbero non funzionare come previsto in questa regione. </notification> - <notification name="PathfindingRebakeNavmesh"> - Se modifichi alcuni oggetti in questa regione, ciò potrebbe causare il comportamento errato di altri oggetti in movimento. Per fare in modo che gli oggetti in movimento si comportino correttamente, fai clic sul pulsante "Rebake regione". Per maggiori informazioni, seleziona la guida - <url name="url"> - http://wiki.secondlife.com/wiki/Pathfinding_Tools_in_the_Second_Life_Viewer - </url> - <usetemplate helptext="Guida" ignoretext="Se modifichi alcuni oggetti in questa regione, ciò potrebbe causare il comportamento errato di altri oggetti in movimento." name="okhelpignore" yestext="OK"/> - </notification> <notification name="PathfindingCannotRebakeNavmesh"> Si è verificato un errore. Potrebbe trattarsi di un problema di rete o del server, oppure potresti non avere le autorizzazioni necessarie per la costruzione. A volte il problema viene risolto uscendo ed eseguendo nuovamente l'accesso. <usetemplate name="okbutton" yestext="OK"/> @@ -2754,9 +2769,9 @@ OK? </form> </notification> <notification name="ScriptQuestionCaution"> - Attenzione: L'oggetto '<nolink>[OBJECTNAME]</nolink>' ha richiesto accesso completo al tuo account in Dollari Linden. Se consenti l'accesso, potrà rimuovere fondi dal tuo account in qalunque momento e anche svuotare completamente l'account, per un periodo illimitato e senza ulteriori avvisi. + Avviso: L'oggetto '<nolink>[OBJECTNAME]</nolink>' ha richiesto accesso completo al tuo account in Dollari Linden. Se consenti l'accesso, potrà rimuovere fondi dal tuo account in qualunque momento e anche svuotare completamente l'account, per un periodo illimitato e senza ulteriori avvisi. -Raramente questo tipo di richiesta è legittima. Non consentire l'accesso se non comprendi perfettamente il motivo per cui desidera accedere al tuo account. +Non consentire l'accesso se non comprendi perfettamente il motivo per cui desidera accedere al tuo account. <form name="form"> <button name="Grant" text="Consenti accesso totale"/> <button name="Deny" text="Nega"/> @@ -3338,4 +3353,633 @@ Tentativo annullato. Stai per cancellare [NUM_ITEMS] elementi. Vuoi continuare? <usetemplate ignoretext="Sei sicuro di volere eliminare più oggetti?" name="okcancelignore" notext="No" yestext="Sì"/> </notification> + <notification name="AvatarFrozen"> + [AV_FREEZER] ti ha congelato. Non ti puoi muovere o interagire con il mondo. + </notification> + <notification name="AvatarFrozenDuration"> + [AV_FREEZER] ti ha congelato per [AV_FREEZE_TIME] secondi. Non ti puoi muovere o interagire con il mondo. + </notification> + <notification name="YouFrozeAvatar"> + Avatar congelato. + </notification> + <notification name="AvatarHasUnFrozenYou"> + [AV_FREEZER] ti ha scongelato. + </notification> + <notification name="AvatarUnFrozen"> + Avatar scongelato. + </notification> + <notification name="AvatarFreezeFailure"> + La congelazione non ha avuto successo perché non hai le autorizzazioni dell'amministratore per quel lotto. + </notification> + <notification name="AvatarFreezeThaw"> + Non sei più congelato, puoi continuare. + </notification> + <notification name="AvatarCantFreeze"> + Non puoi congelare quell'utente. + </notification> + <notification name="NowOwnObject"> + Sei ora il proprietario dell'oggetto [OBJECT_NAME] + </notification> + <notification name="CantRezOnLand"> + Non puoi rezzare l'oggetto a [OBJECT_POS] perché non è consentito dal proprietario del terreno. Usa lo strumento terreno per visualizzare a chi appartiene il terreno. + </notification> + <notification name="RezFailTooManyRequests"> + Oggetto non razzato perché ci sono troppe richieste. + </notification> + <notification name="SitFailCantMove"> + Non puoi sederti perché al momento non puoi muoverti. + </notification> + <notification name="SitFailNotAllowedOnLand"> + Non puoi sederti perché non ti è consentito entrare in quel terreno. + </notification> + <notification name="SitFailNotSameRegion"> + Proba ad avvicinarti. Non puoi sederti su un oggetto perché +non è nella stessa regione in cui ti trovi. + </notification> + <notification name="NoNewObjectRegionFull"> + Impossibile creare il nuovo oggetto. La regione è piena. + </notification> + <notification name="FailedToPlaceObject"> + Il posizionamento dell'oggetto nella posizione specificata non è riuscito. Riprova. + </notification> + <notification name="NoOwnNoGardening"> + Non puoi creare alberi ed erba su terreni che non sono di tua proprietà . + </notification> + <notification name="NoCopyPermsNoObject"> + Copia non riuscita perché non hai l'autorizzazione necessaria per copiare l'oggetto '[OBJ_NAME]'. + </notification> + <notification name="NoTransPermsNoObject"> + La copia non è riuscita perché '[OBJ_NAME]' non può essere trasferito a te. + </notification> + <notification name="AddToNavMeshNoCopy"> + La copia non è riuscita perché '[OBJ_NAME]' contribuisce al navmesh. + </notification> + <notification name="DupeWithNoRootsSelected"> + Duplicato senza oggetto principale selezionato. + </notification> + <notification name="CantDupeCuzRegionIsFull"> + Impossibile duplicare gli oggetti perché la regione è piena. + </notification> + <notification name="CantDupeCuzParcelNotFound"> + Impossibile duplicare gli oggetti - Impossibile trovare i lotti in cui si trovano. + </notification> + <notification name="CantCreateCuzParcelFull"> + Impossibile creare l'oggetto perché +il lotto è pieno. + </notification> + <notification name="RezAttemptFailed"> + Tentativo di rezzare un oggetto non riuscito. + </notification> + <notification name="ToxicInvRezAttemptFailed"> + Impossibile creare un oggetto che ha causato problemi in questa regione. + </notification> + <notification name="InvItemIsBlacklisted"> + L'oggetto dell'inventario è stato aggiunto alla blacklist. + </notification> + <notification name="NoCanRezObjects"> + Al momento non ti è consentito creare oggetti. + </notification> + <notification name="LandSearchBlocked"> + Ricerca terreno bloccata. +Hai eseguito troppe ricerche terreno in un breve tempo. +Riprova tra un minuto. + </notification> + <notification name="NotEnoughResourcesToAttach"> + Risorse di script non sufficienti per collegare l'oggetto. + </notification> + <notification name="YouDiedAndGotTPHome"> + Sei deceduto e sei stato teleportato alla tua posizione iniziale + </notification> + <notification name="EjectComingSoon"> + Non sei più benvenuto qui e hai [EJECT_TIME] secondi per andartene. + </notification> + <notification name="NoEnterServerFull"> + Non puoi entrare in questa regione perché +il server è pieno. + </notification> + <notification name="SaveBackToInvDisabled"> + Opzione Salva nell'inventario disattivata + </notification> + <notification name="NoExistNoSaveToContents"> + Impossibile salvare '[OBJ_NAME]' nei contenuti dell'oggetto perché l'oggetto da cui è stato razzato non esiste più. + </notification> + <notification name="NoModNoSaveToContents"> + Impossibile salvare '[OBJ_NAME]' nei contenuti dell'oggetto perché non hai l'autorizzazione necessaria per modificare l'oggetto '[DEST_NAME]'. + </notification> + <notification name="NoSaveBackToInvDisabled"> + Impossibile riportare '[OBJ_NAME]' nell'inventario -- questa operazione è stata disattivata. + </notification> + <notification name="NoCopyNoSelCopy"> + Non puoi copiare l'elemento selezionato perché non hai l'autorizzazione necessaria per copiare l'oggetto '[OBJ_NAME]'. + </notification> + <notification name="NoTransNoSelCopy"> + Non puoi copiare la selezione perché l'oggetto '[OBJ_NAME]' non può essere trasferito. + </notification> + <notification name="NoTransNoCopy"> + Non puoi copiare la selezione perché l'oggetto '[OBJ_NAME]' non può essere trasferito. + </notification> + <notification name="NoPermsNoRemoval"> + La rimozione dell'oggetto '[OBJ_NAME]' dal simulatore non è consentita dal sistema delle autorizzazioni. + </notification> + <notification name="NoModNoSaveSelection"> + Non puoi salvare l'elemento selezionato perché non hai l'autorizzazione necessaria per modificare l'oggetto '[OBJ_NAME]'. + </notification> + <notification name="NoCopyNoSaveSelection"> + Non puoi salvare la selezione perché l'oggetto '[OBJ_NAME]' non può essere copiato. + </notification> + <notification name="NoModNoTaking"> + Non puoi prendere l'elemento selezionato perché non hai l'autorizzazione necessaria per modificare l'oggetto '[OBJ_NAME]'. + </notification> + <notification name="RezDestInternalError"> + Errore interno: Tipo di destinazione sconosciuto. + </notification> + <notification name="DeleteFailObjNotFound"> + Cancellazione non riuscita perché l'oggetto non è stato trovato. + </notification> + <notification name="SorryCantEjectUser"> + Non puoi espellere quell'utente. + </notification> + <notification name="RegionSezNotAHome"> + Questa regione non ti consente di impostare qui la tua posizione iniziale. + </notification> + <notification name="HomeLocationLimits"> + Puoi impostare la tua posizione iniziale nel tuo terreno o in un Infohub sulla terraferma. + </notification> + <notification name="HomePositionSet"> + Posizione di base impostata. + </notification> + <notification name="AvatarEjected"> + Avatar espulso. + </notification> + <notification name="AvatarEjectFailed"> + L'espulsione non ha avuto successo perché non hai l'autorizzazione dell'amministratore del lotto. + </notification> + <notification name="CantMoveObjectParcelFull"> + Impossibile muovere l'oggetto '[OBJECT_NAME]' a +[OBJ_POSITION] nella regione [REGION_NAME] perché il lotto è pieno. + </notification> + <notification name="CantMoveObjectParcelPerms"> + Impossibile muovere l'oggetto '[OBJECT_NAME]' a +[OBJ_POSITION] nella regione [REGION_NAME] perché i tuoi oggetti non sono ammessi su questo lotto. + </notification> + <notification name="CantMoveObjectParcelResources"> + Impossibile muovere l'oggetto '[OBJECT_NAME]' a +[OBJ_POSITION] nella regione [REGION_NAME] perché non ci sono risorse sufficienti per l'oggetto su questo lotto. + </notification> + <notification name="CantMoveObjectRegionVersion"> + Impossibile muovere l'oggetto '[OBJECT_NAME]' a +[OBJ_POSITION] nella regione [REGION_NAME] perché nell'altra regione è in esecuzione una versione precedente che non consente la ricezione di questo oggetto attraverso i confini tra regioni. + </notification> + <notification name="CantMoveObjectNavMesh"> + Impossibile muovere l'oggetto '[OBJECT_NAME]' a +[OBJ_POSITION] nella regione [REGION_NAME] perché non puoi modificare il navmesh attraverso il confine tra regioni. + </notification> + <notification name="CantMoveObjectWTF"> + Impossibile muovere l'oggetto '[OBJECT_NAME]' a +[OBJ_POSITION] nella regione [REGION_NAME] per un motivo sconosciuto. ([FAILURE_TYPE]) + </notification> + <notification name="NoPermModifyObject"> + Non hai l'autorizzazione necessaria per modificare questa immagine + </notification> + <notification name="CantEnablePhysObjContributesToNav"> + Non è possibile attivare la fisica per un oggetto che contribuisce al navmesh. + </notification> + <notification name="CantEnablePhysKeyframedObj"> + Impossibile attivare la fisica per oggetti keyframe. + </notification> + <notification name="CantEnablePhysNotEnoughLandResources"> + Impossibile attivare la fisica per l'oggetto -- risorse di terreno insufficienti. + </notification> + <notification name="CantEnablePhysCostTooGreat"> + Impossibile attivare la fisica per un oggetto con un costo delle risorse della fisica maggiore di [MAX_OBJECTS] + </notification> + <notification name="PhantomWithConcavePiece"> + Questo oggetto non può avere un pezzo concavo perché è un oggetto fantasma e contribuisce al navmesh. + </notification> + <notification name="UnableAddItem"> + Aggiunta elemento non riuscita + </notification> + <notification name="UnableEditItem"> + Impossibile modificare questo elemento. + </notification> + <notification name="NoPermToEdit"> + Non sei autorizzato a modificare questo elemento. + </notification> + <notification name="NoPermToCopyInventory"> + Non ti è permesso copiare quell'inventario. + </notification> + <notification name="CantSaveItemDoesntExist"> + Impossibile salvare i contenuti dell'oggetto: L'elemento non esiste più. + </notification> + <notification name="CantSaveItemAlreadyExists"> + Impossibile salvare i contenuti dell'oggetto: Nell'inventario esiste già un elemento con quel nome. + </notification> + <notification name="CantSaveModifyAttachment"> + Impossibile salvare i contenuti dell'oggetto: Verrebbero modificate le autorizzazioni per il collegamento. + </notification> + <notification name="TooManyScripts"> + Troppi script. + </notification> + <notification name="UnableAddScript"> + Aggiunta script non riuscita. + </notification> + <notification name="AssetServerTimeoutObjReturn"> + Il server degli asset non ha inviato una risposta entro il tempo massimo. Oggetto restituito al sim. + </notification> + <notification name="RegionDisablePhysicsShapes"> + In questa regione non sono attivate le forme per la fisica. + </notification> + <notification name="NoModNavmeshAcrossRegions"> + Non puoi modificare il navmesh attraverso il confine tra le regioni. + </notification> + <notification name="NoSetPhysicsPropertiesOnObjectType"> + Impossibile impostare le proprietà della fisica per quel tipo di oggetto. + </notification> + <notification name="NoSetRootPrimWithNoShape"> + impossibile impostare un prim principale senza forma. + </notification> + <notification name="NoRegionSupportPhysMats"> + In questa regione non sono attivati i materiali per la fisica. + </notification> + <notification name="OnlyRootPrimPhysMats"> + I materiali per la fisica possono essere modificati solo i prim principali. + </notification> + <notification name="NoSupportCharacterPhysMats"> + L'impostazione dei materiali per la fisica nei caratteri non è ancora supportata. + </notification> + <notification name="InvalidPhysMatProperty"> + Almeno una delle proprietà dei materiali per la fisica non è valida. + </notification> + <notification name="NoPermsAlterStitchingMeshObj"> + Non puoi alterare il tipo di punto di un oggetto con reticolo + </notification> + <notification name="NoPermsAlterShapeMeshObj"> + Non puoi alterare la forma di un oggetto con reticolo + </notification> + <notification name="FullRegionCantEnter"> + Non puoi entrare in questa regione perché è piena. + </notification> + <notification name="LinkFailedOwnersDiffer"> + Collegamento non riuscito -- i proprietari non corrispondono + </notification> + <notification name="LinkFailedNoModNavmeshAcrossRegions"> + Collegamento non riuscito -- non puoi modificare il navmesh attraverso il confine tra le regioni. + </notification> + <notification name="LinkFailedNoPermToEdit"> + Collegamento non riuscito perché non hai le autorizzazioni necessarie per la modifica. + </notification> + <notification name="LinkFailedTooManyPrims"> + Collegamento non riuscito -- troppe primitive. + </notification> + <notification name="LinkFailedCantLinkNoCopyNoTrans"> + Collegamento non riuscito -- impossibile collegare elementi senza copia ed elementi senza trasferimento + </notification> + <notification name="LinkFailedNothingLinkable"> + Collegamento non riuscito -- niente di collegabile. + </notification> + <notification name="LinkFailedTooManyPathfindingChars"> + Collegamento non riuscito -- troppi personaggi con pathfinding + </notification> + <notification name="LinkFailedInsufficientLand"> + Collegamento non riuscito -- risorse terreno non sufficienti + </notification> + <notification name="LinkFailedTooMuchPhysics"> + L'oggetto usa troppe risorse per la fisica -- le sue dinamiche sono state disattivate. + </notification> + <notification name="TeleportedHomeByObjectOnParcel"> + Sei stato teleportato nella posizione iniziale dall'oggetto '[OBJECT_NAME]' del lotto '[PARCEL_NAME]' + </notification> + <notification name="TeleportedHomeByObject"> + Sei stato teleportato nella tua posizione iniziale dall'oggetto '[OBJECT_NAME]' + </notification> + <notification name="TeleportedByAttachment"> + Sei stato teletrasportato da un elemento collegato a [ITEM_ID] + </notification> + <notification name="TeleportedByObjectOnParcel"> + Sei stato teleportato dall'oggetto '[OBJECT_NAME]' sul lotto '[PARCEL_NAME]' + </notification> + <notification name="TeleportedByObjectOwnedBy"> + Sei stato teleportato dall'oggetto '[OBJECT_NAME]' di proprietà di [OWNER_ID] + </notification> + <notification name="TeleportedByObjectUnknownUser"> + Sei stato teleportato dall'oggetto '[OBJECT_NAME]' di proprietà di un utente sconosciuto. + </notification> + <notification name="CantCreateObjectRegionFull"> + Impossibile creare l'oggetto richiesto. La regione è piena. + </notification> + <notification name="CantAttackMultipleObjOneSpot"> + Non puoi collegare più oggetti a un singolo luogo. + </notification> + <notification name="CantCreateMultipleObjAtLoc"> + Non puoi creare oggetti multipli in questa posizione. + </notification> + <notification name="UnableToCreateObjTimeOut"> + Impossibile creare l'oggetto richiesto. L'oggetto non è presente nel database. + </notification> + <notification name="UnableToCreateObjUnknown"> + Impossibile creare l'oggetto richiesto. Tempo scaduto per la richiesta. Riprova. + </notification> + <notification name="UnableToCreateObjMissingFromDB"> + Impossibile creare l'oggetto richiesto. Riprova. + </notification> + <notification name="RezFailureTookTooLong"> + Rezzing non riuscito. Il caricamento dell'oggetto richiesto è durato troppo a lungo. + </notification> + <notification name="FailedToPlaceObjAtLoc"> + Il posizionamento dell'oggetto nella posizione specificata non è riuscito. Riprova. + </notification> + <notification name="CantCreatePlantsOnLand"> + Non puoi creare piante su questo terreno. + </notification> + <notification name="CantRestoreObjectNoWorldPos"> + Impossibile ripristinare l'oggetto. Nessuna posizione trovata nel mondo virtuale. + </notification> + <notification name="CantRezObjectInvalidMeshData"> + Impossibile rezzare l'oggetto perché i dati del reticolo non sono validi. + </notification> + <notification name="CantRezObjectTooManyScripts"> + Impossibile rezzare l'oggetto perché ci sono già troppi script in questa regione. + </notification> + <notification name="CantCreateObjectNoAccess"> + Le tue autorizzazioni di accesso non ti permettono di creare oggetti in quella posizione. + </notification> + <notification name="CantCreateObject"> + Al momento non ti è consentito creare oggetti. + </notification> + <notification name="InvalidObjectParams"> + Parametri oggetto non validi + </notification> + <notification name="CantDuplicateObjectNoAcess"> + Le tue autorizzazioni di accesso non ti permettono di duplicare oggetti in questa posizione. + </notification> + <notification name="CantChangeShape"> + Non ti è consentito modificare questa forma. + </notification> + <notification name="NoAccessToClaimObjects"> + Le tue autorizzazioni di accesso non ti permettono di richiedere oggetti in questa posizione. + </notification> + <notification name="DeedFailedNoPermToDeedForGroup"> + Assegnazione non riuscita perché non hai l'autorizzazione necessaria per assegnare oggetti per il tuo gruppo. + </notification> + <notification name="NoPrivsToBuyObject"> + Le tue autorizzazioni di accesso non ti permettono di acquistare oggetti in questa posizione. + </notification> + <notification name="CantAttachObjectAvatarSittingOnIt"> + Impossibile collegare l'oggetto perché un avatar è seduto sopra. + </notification> + <notification name="WhyAreYouTryingToWearShrubbery"> + Alberi ed erba non possono essere indossati come collegati. + </notification> + <notification name="CantAttachGroupOwnedObjs"> + Impossibile collegare oggetti di proprietà di un gruppo. + </notification> + <notification name="CantAttachObjectsNotOwned"> + Non puoi collegare oggetti che non sono di tua proprietà . + </notification> + <notification name="CantAttachNavmeshObjects"> + Impossibile collegare oggetti che contribuiscono a navmesh. + </notification> + <notification name="CantAttachObjectNoMovePermissions"> + L'oggetto non può essere collegato perché non sei autorizzato a muoverlo. + </notification> + <notification name="CantAttachNotEnoughScriptResources"> + Risorse di script non sufficienti per collegare l'oggetto. + </notification> + <notification name="CantDropItemTrialUser"> + Non puoi lasciare oggetti qui, prova la zona Prova gratuita. + </notification> + <notification name="CantDropMeshAttachment"> + Non puoi lasciare elementi collegati con reticolo. Separa nell'inventario e quindi rezza nel mondo virtuale. + </notification> + <notification name="CantDropAttachmentNoPermission"> + Impossibile rimuovere l'elemento collegato: non hai l'autorizzazione necessaria per rimuoverlo qui. + </notification> + <notification name="CantDropAttachmentInsufficientLandResources"> + Impossibile rimuovere l'elemento collegato: risorse terreno disponibili non sufficienti. + </notification> + <notification name="CantDropAttachmentInsufficientResources"> + Impossibile rimuovere gli elementi collegati: risorse disponibili non sufficienti. + </notification> + <notification name="CantDropObjectFullParcel"> + Non puoi lasciare l'oggetto qui. Il lotto è pieno. + </notification> + <notification name="CantTouchObjectBannedFromParcel"> + Non puoi toccare/afferrare questo oggetto perché sei stato bandito dal lotto di terreno. + </notification> + <notification name="PlzNarrowDeleteParams"> + Limita i parametri per la cancellazione. + </notification> + <notification name="UnableToUploadAsset"> + Impossibile caricare l'asset. + </notification> + <notification name="CantTeleportCouldNotFindUser"> + Utente da teleportare alla posizione iniziale non trovato + </notification> + <notification name="GodlikeRequestFailed"> + richiesta superpoteri non riuscita + </notification> + <notification name="GenericRequestFailed"> + richiesta generica non riuscita + </notification> + <notification name="CantUploadPostcard"> + Impossibile caricare la cartolina. Riprova più tardi. + </notification> + <notification name="CantFetchInventoryForGroupNotice"> + I dettagli dell'inventario per la notifica di gruppo non sono stati trovati. + </notification> + <notification name="CantSendGroupNoticeNotPermitted"> + Impossibile inviare la notifica di gruppo -- non consentita. + </notification> + <notification name="CantSendGroupNoticeCantConstructInventory"> + Impossibile inviare la notifica di gruppo -- impossibile costruire l'inventario. + </notification> + <notification name="CantParceInventoryInNotice"> + Impossibile analizzare l'inventario nella notifica. + </notification> + <notification name="TerrainUploadFailed"> + Caricamento terreno non riuscito. + </notification> + <notification name="TerrainFileWritten"> + File terreno scritto. + </notification> + <notification name="TerrainFileWrittenStartingDownload"> + File terreno generato, avvio del download... + </notification> + <notification name="TerrainBaked"> + Baking terreno completata. + </notification> + <notification name="TenObjectsDisabledPlzRefresh"> + Sono stati disattivati solo i primi 10 oggetti. Se necessario, aggiorna e seleziona nuovamente. + </notification> + <notification name="UpdateViewerBuyParcel"> + Devi aggiornare il Viewer per poter acquistare questo lotto. + </notification> + <notification name="CantBuyParcelNotForSale"> + Impossibile acquistare, questo lotto non è in vendita. + </notification> + <notification name="CantBuySalePriceOrLandAreaChanged"> + Impossibile acquistare. Il prezzo o l'area del terreno sono stati cambiati. + </notification> + <notification name="CantBuyParcelNotAuthorized"> + Non sei l'acquirente autorizzato di questo lotto. + </notification> + <notification name="CantBuyParcelAwaitingPurchaseAuth"> + Non puoi acquistare questo lotto perché è in attesa di autorizzazione all'acquisto + </notification> + <notification name="CantBuildOverflowParcel"> + Non puoi costruire oggetti qui perché si supererebbe il limite per il lotto. + </notification> + <notification name="SelectedMultipleOwnedLand"> + hai selezionato terreni con proprietari diversi. Seleziona un'area più piccola e riprova. + </notification> + <notification name="CantJoinTooFewLeasedParcels"> + Non sono stati selezionati abbastanza lotti affittati da collegare. + </notification> + <notification name="CantDivideLandMultipleParcelsSelected"> + Terreno non divisibile.\nHai selezionato più di un lotto.\nProva a selezionare una quantità di terreno più piccola. + </notification> + <notification name="CantDivideLandCantFindParcel"> + impossibile suddividere il terreno.\nimpossibile trovare il lotto.\nInvia una segnalazione con Aiuto -> Segnala bug... + </notification> + <notification name="CantDivideLandWholeParcelSelected"> + Impossibile suddividere il terreno. È stato selezionato l'intero lotto.\nProva a selezionare un pezzo di terreno più piccolo. + </notification> + <notification name="LandHasBeenDivided"> + Il terreno è stato diviso. + </notification> + <notification name="PassPurchased"> + Hai acquistato un pass. + </notification> + <notification name="RegionDisallowsClassifieds"> + Nella regione non sono permessi gli annunci pubblicitari. + </notification> + <notification name="LandPassExpireSoon"> + Il tuo pass per questo terreno è quasi scaduto. + </notification> + <notification name="CantSitNoSuitableSurface"> + Nessuna superficie adatta a sedersi, prova un altro luogo. + </notification> + <notification name="CantSitNoRoom"> + Non c'è posto per sedersi, prova un altro luogo. + </notification> + <notification name="ClaimObjectFailedNoPermission"> + La richiesta dell'oggetto non ha avuto successo perché non hai l'autorizzazione necessaria. + </notification> + <notification name="ClaimObjectFailedNoMoney"> + La richiesta dell'oggetto non ha avuto successo perché non hai L$ sufficienti. + </notification> + <notification name="CantDeedGroupLand"> + Non puoi assegnare terreno di proprietà di un gruppo. + </notification> + <notification name="BuyObjectFailedNoMoney"> + L'acquisto dell'oggetto non ha avuto successo perché non hai L$ sufficienti. + </notification> + <notification name="BuyInventoryFailedNoMoney"> + L'acquisto dell'inventario non ha avuto successo perché non hai L$ sufficienti. + </notification> + <notification name="BuyPassFailedNoMoney"> + Non hai abbastanza L$ per acquistare un pass per questo terreno. + </notification> + <notification name="CantBuyPassTryAgain"> + Al momento non puoi acquistare un pass. Riprova più tardi. + </notification> + <notification name="CantCreateObjectParcelFull"> + Impossibile creare l'oggetto perché il lotto è pieno. + </notification> + <notification name="FailedPlacingObject"> + Il posizionamento dell'oggetto nella posizione specificata non è riuscito. Riprova. + </notification> + <notification name="CantCreateLandmarkForEvent"> + Impossibile creare il punto di riferimento per l'evento. + </notification> + <notification name="GodBeatsFreeze"> + I tuoi superpoteri hanno interrotto la congelazione. + </notification> + <notification name="SpecialPowersRequestFailedLogged"> + Richiesta di poteri speciali non riuscita. La richiesta è stata registrata. + </notification> + <notification name="ExpireExplanation"> + Al momento il sistema non è in grado di elaborare la tua richiesta. Tempo scaduto per la richiesta. + </notification> + <notification name="DieExplanation"> + Il sistema non è in grado di elaborare la tua richiesta. + </notification> + <notification name="AddPrimitiveFailure"> + Denaro insufficiente per creare una primitiva. + </notification> + <notification name="RezObjectFailure"> + Denaro insufficiente per creare un oggetto. + </notification> + <notification name="ResetHomePositionNotLegal"> + Posizione iniziale ripristinata perché non era valida. + </notification> + <notification name="CantInviteRegionFull"> + Al momento non puoi invitare nessuno alla tua posizione perché la regione è piena. Riprova più tardi. + </notification> + <notification name="CantSetHomeAtRegion"> + Questa regione non ti consente di impostare qui la tua posizione iniziale. + </notification> + <notification name="ListValidHomeLocations"> + Puoi impostare la tua posizione iniziale nel tuo terreno o in un Infohub sulla terraferma. + </notification> + <notification name="SetHomePosition"> + Posizione di base impostata. + </notification> + <notification name="CantDerezInventoryError"> + Impossibile derazzare l'oggetto a causa di un errore nell'inventario. + </notification> + <notification name="CantCreateRequestedInv"> + Impossibile creare l'inventario richiesto. + </notification> + <notification name="CantCreateRequestedInvFolder"> + Impossibile creare la cartella dell'inventario richiesta. + </notification> + <notification name="CantCreateInventory"> + Impossibile creare quell'inventario. + </notification> + <notification name="CantCreateLandmark"> + Impossibile creare il punto di riferimento. + </notification> + <notification name="CantCreateOutfit"> + Il vestiario non può essere creato in questo momento. Riprova tra un minuto. + </notification> + <notification name="InventoryNotForSale"> + L'inventario non è in vendita. + </notification> + <notification name="CantFindInvItem"> + Impossibile trovare l'elemento nell'inventario. + </notification> + <notification name="CantFindObject"> + Impossibile trovare l'oggetto. + </notification> + <notification name="CantTransfterMoneyRegionDisabled"> + Il trasferimento di denaro agli oggetti è attualmente disattivato in questa regione. + </notification> + <notification name="CantPayNoAgent"> + Non si capisce chi deve essere pagato. + </notification> + <notification name="CantDonateToPublicObjects"> + Non puoi dare L$ a oggetti pubblici. + </notification> + <notification name="InventoryCreationInWorldObjectFailed"> + Creazione inventario non riuscito per un oggetto nel mondo virtuale. + </notification> + <notification name="UserBalanceOrLandUsageError"> + Un errore interno ha impedito l'aggiornamento del Viewer. Il saldo in L$ o i lotti posseduti mostrati nel Viewer potrebbero non corrispondere ai valori correnti sui server. + </notification> + <notification name="LargePrimAgentIntersect"> + Non puoi creare prim grandi che intersecano altri giocatori. Riprova quando gli altri giocatori si sono spostati. + </notification> + <notification name="PreferenceChatClearLog"> + Verranno cancellati i registri delle conversazioni precedenti e tutti gli eventuali backup di quel file. + <usetemplate ignoretext="Conferma prima di cancellare il registro delle conversazioni precedenti." name="okcancelignore" notext="Annulla" yestext="OK"/> + </notification> + <notification name="PreferenceChatDeleteTranscripts"> + Verranno cancellate le trascrizioni di tutte le conversazioni precedenti. L'elenco delle conversazioni passate non cambierà . Tutti i file con i suffissi .txt e txt.backup nella cartella [FOLDER] verranno cancellati. + <usetemplate ignoretext="Conferma prima di cancellare le trascrizioni." name="okcancelignore" notext="Annulla" yestext="OK"/> + </notification> + <notification name="PreferenceChatPathChanged"> + Impossibile spostare i file. Il percorso precedente è stato ripristinato. + <usetemplate ignoretext="Impossibile spostare i file. Il percorso precedente è stato ripristinato." name="okignore" yestext="OK"/> + </notification> </notifications> diff --git a/indra/newview/skins/default/xui/it/panel_avatar_list_item.xml b/indra/newview/skins/default/xui/it/panel_avatar_list_item.xml index ede19b9e5a..cfceb5b982 100644 --- a/indra/newview/skins/default/xui/it/panel_avatar_list_item.xml +++ b/indra/newview/skins/default/xui/it/panel_avatar_list_item.xml @@ -26,5 +26,6 @@ <icon name="permission_edit_mine_icon" tool_tip="Questo amico può modificare, cancellare o prendere i tuoi oggetti"/> <icon name="permission_map_icon" tool_tip="Questo amico può identificarti sulla mappa"/> <icon name="permission_online_icon" tool_tip="Questo amico può vedere se sei online"/> + <button name="info_btn" tool_tip="Maggiori informazioni"/> <button name="profile_btn" tool_tip="Vedi profilo"/> </panel> diff --git a/indra/newview/skins/default/xui/it/panel_block_list_sidetray.xml b/indra/newview/skins/default/xui/it/panel_block_list_sidetray.xml index 610f561a65..7ca2d3b57b 100644 --- a/indra/newview/skins/default/xui/it/panel_block_list_sidetray.xml +++ b/indra/newview/skins/default/xui/it/panel_block_list_sidetray.xml @@ -1,10 +1,11 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="block_list_panel"> - <text name="title_text"> - Blocca lista - </text> - <scroll_list name="blocked" tool_tip="Lista degli attuali residenti bloccati"/> - <button label="Blocca il residente..." label_selected="Blocca il residente..." name="Block resident..." tool_tip="Scegli un residente da bloccare"/> - <button label="Blocca l'oggetto per nome..." label_selected="Blocca l'oggetto per nome..." name="Block object by name..."/> - <button label="Sblocca" label_selected="Sblocca" name="Unblock" tool_tip="Rimuovi un residente o un oggetto dalla lista bloccati"/> + <panel label="bottom_panel" name="blocked_buttons_panel"> + <filter_editor label="Filtro" name="blocked_filter_input"/> + <menu_button name="blocked_gear_btn" tool_tip="Azioni sulla persona o oggetto selezionato"/> + <menu_button name="view_btn" tool_tip="Opzioni Ordina"/> + <menu_button name="plus_btn" tool_tip="Seleziona un residente o un oggetto da bloccare"/> + <button name="unblock_btn" tool_tip="Rimuovi un residente o un oggetto dalla lista bloccati"/> + </panel> + <block_list name="blocked" tool_tip="Lista degli attuali residenti bloccati"/> </panel> diff --git a/indra/newview/skins/default/xui/it/panel_conversation_list_item.xml b/indra/newview/skins/default/xui/it/panel_conversation_list_item.xml new file mode 100644 index 0000000000..ca6b65300a --- /dev/null +++ b/indra/newview/skins/default/xui/it/panel_conversation_list_item.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="conversation_list_item"> + <layout_stack name="conversation_item_stack"> + <layout_panel name="conversation_title_panel"> + <text name="conversation_title" value="(caricamento in corso)"/> + </layout_panel> + </layout_stack> +</panel> diff --git a/indra/newview/skins/default/xui/it/panel_conversation_log_list_item.xml b/indra/newview/skins/default/xui/it/panel_conversation_log_list_item.xml new file mode 100644 index 0000000000..624eaa639c --- /dev/null +++ b/indra/newview/skins/default/xui/it/panel_conversation_log_list_item.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="conversation_log_list_item"> + <icon name="voice_session_icon" tool_tip="La conversazione includeva la voce"/> + <icon name="unread_ims_icon" tool_tip="Sono arrivati dei messaggi mentre eri via"/> + <button name="delete_btn" tool_tip="Elimina questo elemento"/> +</panel> diff --git a/indra/newview/skins/default/xui/it/panel_group_list_item.xml b/indra/newview/skins/default/xui/it/panel_group_list_item.xml index 7cdc4c7ff6..72e644008c 100644 --- a/indra/newview/skins/default/xui/it/panel_group_list_item.xml +++ b/indra/newview/skins/default/xui/it/panel_group_list_item.xml @@ -1,5 +1,6 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="group_list_item"> <text name="group_name" value="Sconosciuto"/> + <button name="info_btn" tool_tip="Maggiori informazioni"/> <button name="profile_btn" tool_tip="Vedi profilo"/> </panel> diff --git a/indra/newview/skins/default/xui/it/panel_people.xml b/indra/newview/skins/default/xui/it/panel_people.xml index f903ae6e2c..e1468db76e 100644 --- a/indra/newview/skins/default/xui/it/panel_people.xml +++ b/indra/newview/skins/default/xui/it/panel_people.xml @@ -14,81 +14,53 @@ Stai cercando persone da frequentare? Prova la [secondlife:///app/worldmap Mappa <string name="no_filtered_friends_msg"> Non riesci a trovare quello che cerchi? Prova [secondlife:///app/search/people/[SEARCH_TERM] Cerca]. </string> - <string name="people_filter_label" value="Filtro persone"/> - <string name="groups_filter_label" value="Filtro gruppi"/> <string name="no_filtered_groups_msg" value="Non riesci a trovare quello che cerchi? Prova [secondlife:///app/search/groups/[SEARCH_TERM] Cerca]."/> <string name="no_groups_msg" value="Stai cercando gruppi di cui far parte? Prova [secondlife:///app/search/groups Cerca]."/> <string name="MiniMapToolTipMsg" value="[REGION](Fai doppio clic per aprire la Mappa, premi il tasto Maiusc e trascina per la panoramica)"/> <string name="AltMiniMapToolTipMsg" value="[REGION](Fai doppio clic per teleportarti, premi il tasto Maiusc e trascina per la panoramica)"/> - <filter_editor label="Filtro" name="filter_input"/> <tab_container name="tabs"> <panel label="NELLE VICINANZE" name="nearby_panel"> - <panel label="bottom_panel" name="bottom_panel"> - <menu_button name="nearby_view_sort_btn" tool_tip="Opzioni"/> - <button name="add_friend_btn" tool_tip="Aggiungi il residente selezionato alla tua lista degli amici"/> + <panel label="bottom_panel" name="nearby_buttons_panel"> + <filter_editor label="Filtro persone" name="nearby_filter_input"/> + <button name="gear_btn" tool_tip="Azioni per la persona selezionata:"/> + <menu_button name="nearby_view_btn" tool_tip="Opzioni Mostra/Ordina"/> + <button name="add_friend_btn" tool_tip="Offri amicizia a un residente"/> + <dnd_button name="nearby_del_btn" tool_tip="Rimuovi la persona selezionata dagli amici"/> </panel> </panel> - <panel label="I MIEI AMICI" name="friends_panel"> + <panel label="AMICI" name="friends_panel"> + <panel label="bottom_panel" name="friends_buttons_panel"> + <filter_editor label="Filtro persone" name="friends_filter_input"/> + <button name="gear_btn" tool_tip="Azioni per la persona selezionata:"/> + <menu_button name="friends_view_btn" tool_tip="Opzioni Mostra/Ordina"/> + <button name="friends_add_btn" tool_tip="Offri amicizia a un residente"/> + <dnd_button name="friends_del_btn" tool_tip="Rimuovi la persona selezionata dagli amici"/> + </panel> <accordion name="friends_accordion"> <accordion_tab name="tab_online" title="Online"/> <accordion_tab name="tab_all" title="Tutto"/> </accordion> - <panel label="bottom_panel" name="bottom_panel"> - <layout_stack name="bottom_panel"> - <layout_panel name="options_gear_btn_panel"> - <menu_button name="friends_viewsort_btn" tool_tip="Mostra ulteriori opzioni"/> - </layout_panel> - <layout_panel name="add_btn_panel"> - <button name="add_btn" tool_tip="Offri amicizia a un residente"/> - </layout_panel> - <layout_panel name="trash_btn_panel"> - <dnd_button name="del_btn" tool_tip="Rimuovi la persona selezionata dalla lista degli amici"/> - </layout_panel> - </layout_stack> - </panel> </panel> - <panel label="I MIEI GRUPPI" name="groups_panel"> - <panel label="bottom_panel" name="bottom_panel"> - <menu_button name="groups_viewsort_btn" tool_tip="Opzioni"/> - <button name="plus_btn" tool_tip="Aderisci al gruppo/Crea nuovo gruppo"/> - <button name="activate_btn" tool_tip="Attiva il gruppo selezionato"/> + <panel label="GRUPPI" name="groups_panel"> + <panel label="bottom_panel" name="groups_buttons_panel"> + <filter_editor label="Filtro gruppi" name="groups_filter_input"/> + <menu_button name="groups_gear_btn" tool_tip="Azioni per il gruppo selezionato:"/> + <menu_button name="groups_view_btn" tool_tip="Opzioni Mostra/Ordina"/> + <menu_button name="plus_btn" tool_tip="Aderisci al gruppo/Crea nuovo gruppo"/> + <dnd_button name="minus_btn" tool_tip="Lascia il gruppo selezionato"/> </panel> </panel> <panel label="RECENTE" name="recent_panel"> - <panel label="bottom_panel" name="bottom_panel"> - <menu_button name="recent_viewsort_btn" tool_tip="Opzioni"/> - <button name="add_friend_btn" tool_tip="Aggiungi il residente selezionato alla tua lista degli amici"/> + <panel label="bottom_panel" name="recent_buttons_panel"> + <filter_editor label="Filtro persone" name="recent_filter_input"/> + <button name="gear_btn" tool_tip="Azioni per la persona selezionata:"/> + <menu_button name="recent_view_btn" tool_tip="Opzioni Mostra/Ordina"/> + <button name="add_friend_btn" tool_tip="Offri amicizia a un residente"/> + <dnd_button name="recent_del_btn" tool_tip="Rimuovi la persona selezionata dagli amici"/> </panel> </panel> + <panel label="BLOCCATO" name="blocked_panel"> + <panel label="Residenti e oggetti bloccati" name="panel_block_list_sidetray"/> + </panel> </tab_container> - <panel name="button_bar"> - <layout_stack name="bottom_bar_ls"> - <layout_panel name="view_profile_btn_lp"> - <button label="Profilo" name="view_profile_btn" tool_tip="Mostra immagine, gruppi e altre informazioni del residente"/> - </layout_panel> - <layout_panel name="im_btn_lp"> - <button label="IM" name="im_btn" tool_tip="Apri una sessione messaggio istantaneo"/> - </layout_panel> - <layout_panel name="call_btn_lp"> - <button label="Chiama" name="call_btn" tool_tip="Chiama questo residente"/> - </layout_panel> - <layout_panel name="share_btn_lp"> - <button label="Condividi" name="share_btn" tool_tip="Condividi un oggetto dell'inventario"/> - </layout_panel> - <layout_panel name="teleport_btn_lp"> - <button label="Teleport" name="teleport_btn" tool_tip="Offri teleport"/> - </layout_panel> - </layout_stack> - <layout_stack name="bottom_bar_ls1"> - <layout_panel name="group_info_btn_lp"> - <button label="Profilo del gruppo" name="group_info_btn" tool_tip="Mostra informazioni gruppo"/> - </layout_panel> - <layout_panel name="chat_btn_lp"> - <button label="Chat di gruppo" name="chat_btn" tool_tip="Apri sessione chat"/> - </layout_panel> - <layout_panel name="group_call_btn_lp"> - <button label="Chiamata al gruppo" name="group_call_btn" tool_tip="Chiama questo gruppo"/> - </layout_panel> - </layout_stack> - </panel> </panel> diff --git a/indra/newview/skins/default/xui/it/panel_preferences_chat.xml b/indra/newview/skins/default/xui/it/panel_preferences_chat.xml index 0c9c4027e5..c2ac6e97a9 100644 --- a/indra/newview/skins/default/xui/it/panel_preferences_chat.xml +++ b/indra/newview/skins/default/xui/it/panel_preferences_chat.xml @@ -1,34 +1,86 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel label="Text Chat" name="chat"> - <text name="font_size"> - Dimensioni caratteri: - </text> - <radio_group name="chat_font_size"> - <radio_item label="Piccola" name="radio" value="0"/> - <radio_item label="Media" name="radio2" value="1"/> - <radio_item label="Grande" name="radio3" value="2"/> - </radio_group> - <check_box initial_value="true" label="Simula la battitura tasti quando scrivi" name="play_typing_animation"/> - <check_box label="Quando sono OFF-LINE, spediscimi gli IM in una e-mail" name="send_im_to_email"/> - <check_box label="Attiva IM in testo semplice e cronologia chat" name="plain_text_chat_history"/> - <check_box label="Chat a vignetta" name="bubble_text_chat"/> - <text name="show_ims_in_label"> - Mostra gli IM in: - </text> - <text name="requires_restart_label"> - (richiede il riavvio) - </text> - <radio_group name="chat_window" tool_tip="Mostra i tuoi messaggi istantanei in diverse finestre, o in una finestra con più schede (richiede il riavvio)"> - <radio_item label="Finestre separate" name="radio" value="0"/> - <radio_item label="Schede" name="radio2" value="1"/> - </radio_group> - <text name="disable_toast_label"> - Attiva popup per chat in arrivo: - </text> - <check_box label="Chat di gruppo" name="EnableGroupChatPopups" tool_tip="Seleziona per vedere una finestra popup quando arriva una chat di gruppo"/> - <check_box label="Chat IM" name="EnableIMChatPopups" tool_tip="Seleziona per vedere una finestra popup quando arriva un messaggio IM"/> - <spinner label="Durata chat vicine:" name="nearby_toasts_lifetime"/> - <spinner label="Durata dissolvenza chat vicine:" name="nearby_toasts_fadingtime"/> + <panel> + <check_box initial_value="true" label="Simula la battitura tasti quando scrivi" name="play_typing_animation"/> + <check_box label="Quando sono OFF-LINE, spediscimi gli IM in una e-mail" name="send_im_to_email"/> + <check_box label="Solo amici e gruppi possono chiamarmi o mandarmi IM" name="voice_call_friends_only_check"/> + <text name="font_size"> + Dimensioni caratteri: + </text> + <combo_box name="chat_font_size"> + <item label="Piccolo" name="Small" value="0"/> + <item label="Medio" name="Medium" value="1"/> + <item label="Grande" name="Large" value="2"/> + </combo_box> + <check_box label="Chat a vignetta" name="bubble_text_chat"/> + </panel> + <panel> + <text name="notifications"> + Notifiche + </text> + <text name="friend_ims"> + IM degli amici: + </text> + <combo_box name="FriendIMOptions"> + <item label="Apri finestra Conversazioni" name="OpenConversationsWindow" value="openconversations"/> + <item label="Mostra il messaggio in una finestra pop-up" name="PopUpMessage" value="toast"/> + <item label="Pulsante barra strumenti Flash" name="FlashToolbarButton" value="flash"/> + <item label="Nessuno" name="None" value="none"/> + </combo_box> + <text name="non_friend_ims"> + IM non di amici: + </text> + <combo_box name="NonFriendIMOptions"> + <item label="Apri finestra Conversazioni" name="OpenConversationsWindow" value="openconversations"/> + <item label="Mostra il messaggio in una finestra pop-up" name="PopUpMessage" value="toast"/> + <item label="Pulsante barra strumenti Flash" name="FlashToolbarButton" value="flash"/> + <item label="Nessuno" name="None" value="none"/> + </combo_box> + <text name="conference_ims"> + IM conferenza: + </text> + <combo_box name="ConferenceIMOptions"> + <item label="Apri finestra Conversazioni" name="OpenConversationsWindow" value="openconversations"/> + <item label="Mostra il messaggio in una finestra pop-up" name="PopUpMessage" value="toast"/> + <item label="Pulsante barra strumenti Flash" name="FlashToolbarButton" value="flash"/> + <item label="Nessuno" name="None" value="none"/> + </combo_box> + <text name="group_chat"> + Chat di gruppo: + </text> + <combo_box name="GroupChatOptions"> + <item label="Apri finestra Conversazioni" name="OpenConversationsWindow" value="openconversations"/> + <item label="Mostra il messaggio in una finestra pop-up" name="PopUpMessage" value="toast"/> + <item label="Pulsante barra strumenti Flash" name="FlashToolbarButton" value="flash"/> + <item label="Nessuno" name="None" value="none"/> + </combo_box> + <text name="nearby_chat"> + Chat nei dintorni: + </text> + <combo_box name="NearbyChatOptions"> + <item label="Apri finestra Conversazioni" name="OpenConversationsWindow" value="openconversations"/> + <item label="Mostra il messaggio in una finestra pop-up" name="PopUpMessage" value="toast"/> + <item label="Pulsante barra strumenti Flash" name="FlashToolBarButton" value="flash"/> + <item label="Nessuno" name="None" value="none"/> + </combo_box> + <text name="notifications_alert"> + Per interrompere temporaneamente le notifiche, usa Comunica > Non disturbare. + </text> + </panel> + <panel> + <text name="play_sound"> + Riproduci suono: + </text> + <check_box label="Nuova conversazione" name="new_conversation"/> + <check_box label="Chiamata voce in arrivo" name="incoming_voice_call"/> + <check_box label="Offerta di Teleport" name="teleport_offer"/> + <check_box label="Offerta inventario" name="inventory_offer"/> + </panel> + <panel> + <button label="Cancella registro..." name="clear_log"/> + <button label="Cancella trascrizioni..." name="delete_transcripts"/> + <button label="Sfoglia..." label_selected="Sfoglia" name="log_path_button"/> + </panel> <button label="Traduzione..." name="ok_btn"/> <button label="Sostituzione automatica..." name="autoreplace_showgui"/> <button label="Correzione ortografica..." name="spellcheck_showgui"/> diff --git a/indra/newview/skins/default/xui/it/panel_preferences_general.xml b/indra/newview/skins/default/xui/it/panel_preferences_general.xml index 90a833471c..45cc06c2ea 100644 --- a/indra/newview/skins/default/xui/it/panel_preferences_general.xml +++ b/indra/newview/skins/default/xui/it/panel_preferences_general.xml @@ -69,6 +69,9 @@ <combo_box.item label="mai" name="item4"/> </combo_box> <text name="text_box3"> - Risposta in modalità occupato: + Risposta Non disturbare: </text> + <text_editor name="do_not_disturb_response"> + log_in_to_change + </text_editor> </panel> diff --git a/indra/newview/skins/default/xui/it/sidepanel_task_info.xml b/indra/newview/skins/default/xui/it/sidepanel_task_info.xml index 8a0f93e650..5f912dd126 100644 --- a/indra/newview/skins/default/xui/it/sidepanel_task_info.xml +++ b/indra/newview/skins/default/xui/it/sidepanel_task_info.xml @@ -72,6 +72,7 @@ <combo_box.item label="Acquista oggetto" name="Buyobject"/> <combo_box.item label="Paga oggetto" name="Payobject"/> <combo_box.item label="Apri" name="Open"/> + <combo_box.item label="Ingrandisci" name="Zoom"/> </combo_box> <panel name="perms_inv"> <text name="perm_modify"> diff --git a/indra/newview/skins/default/xui/it/strings.xml b/indra/newview/skins/default/xui/it/strings.xml index fb1e387468..f95318542b 100644 --- a/indra/newview/skins/default/xui/it/strings.xml +++ b/indra/newview/skins/default/xui/it/strings.xml @@ -134,7 +134,7 @@ Esci </string> <string name="create_account_url"> - http://join.secondlife.com/index.php?lang=it-IT&sourceid=[sourceid] + http://join.secondlife.com/?sourceid=[sourceid] </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: @@ -616,8 +616,8 @@ Prova ad accedere nuovamente tra un minuto. <string name="AvatarAway"> Assente </string> - <string name="AvatarBusy"> - Occupato + <string name="AvatarDoNotDisturb"> + Non disturbare </string> <string name="AvatarMuted"> Mutato @@ -853,6 +853,12 @@ Prova ad accedere nuovamente tra un minuto. <string name="ST_NO_JOINT"> Impossibile trovare ROOT o JOINT. </string> + <string name="NearbyChatTitle"> + Chat nei dintorni + </string> + <string name="NearbyChatLabel"> + (Chat nei dintorni) + </string> <string name="whisper"> sussurra: </string> @@ -916,6 +922,9 @@ Prova ad accedere nuovamente tra un minuto. <string name="ControlYourCamera"> Controllare la tua fotocamera </string> + <string name="AgentNameSubst"> + (Tu) + </string> <string name="TeleportYourAgent"> Teleportarti </string> @@ -1000,18 +1009,6 @@ Prova ad accedere nuovamente tra un minuto. <string name="dictionary_files"> Dizionari </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> @@ -1968,8 +1965,8 @@ Prova ad accedere nuovamente tra un minuto. <string name="PanelContentsNewScript"> Nuovo script </string> - <string name="BusyModeResponseDefault"> - Il residente al quale hai inviato un messaggio è in modalità 'occupato', ovvero ha chiesto di non essere disturbato. Il tuo messaggio comparirà nel suo pannello IM, dove potrà essere letto in un secondo momento. + <string name="DoNotDisturbModeResponseDefault"> + Questo residente ha attivato la modalità 'Non disturbare' e vedrà il tuo messaggio più tardi. </string> <string name="MuteByName"> (In base al nome) @@ -2082,9 +2079,6 @@ Prova ad accedere nuovamente tra un minuto. <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> @@ -3799,7 +3793,7 @@ Se il messaggio persiste, contatta [SUPPORT_SITE]. Regione generale </string> <string name="LocationCtrlSeeAVsTooltip"> - Avatar visibili e chat consentita fuori di questo lotto + Gli avatar in questo lotto non possono essere visti o sentiti da avatar all'esterno del lotto </string> <string name="LocationCtrlPathfindingDirtyTooltip"> Gli oggetti che si muovono potrebbero non comportarsi correttamente in questa regione fino a quando non viene eseguito il rebake della regione. @@ -3876,6 +3870,12 @@ Se il messaggio persiste, contatta [SUPPORT_SITE]. <string name="IM_unblock_only_groups_friends"> Per vedere questo messaggio, devi deselezionare 'Solo amici e gruppi possono chiamarmi o mandarmi IM' in Preferenze/Privacy. </string> + <string name="OnlineStatus"> + Online + </string> + <string name="OfflineStatus"> + Offline + </string> <string name="answered_call"> Risposto alla chiamata </string> @@ -3885,6 +3885,9 @@ Se il messaggio persiste, contatta [SUPPORT_SITE]. <string name="you_joined_call"> Ti sei collegato alla chiamata in voce </string> + <string name="you_auto_rejected_call-im"> + Hai rifiutato automaticamente la chiamata voce mentre era attivata la modalità 'Non disturbare'. + </string> <string name="name_started_call"> [NAME] ha iniziato una chiamata vocale </string> @@ -3897,6 +3900,9 @@ Se il messaggio persiste, contatta [SUPPORT_SITE]. <string name="hang_up-im"> Chiusa la chiamata </string> + <string name="conference-title"> + Chat con più persone + </string> <string name="conference-title-incoming"> Chiamata in conferenza con [AGENT_NAME] </string> @@ -4769,6 +4775,9 @@ Prova a racchiudere il percorso dell'editor in doppie virgolette. <string name="Command_Chat_Label"> Chat </string> + <string name="Command_Conversations_Label"> + Conversazioni + </string> <string name="Command_Compass_Label"> Bussola </string> @@ -4844,6 +4853,9 @@ Prova a racchiudere il percorso dell'editor in doppie virgolette. <string name="Command_Chat_Tooltip"> Chatta con persone vicine usando il testo </string> + <string name="Command_Conversations_Tooltip"> + Conversa con chiunque + </string> <string name="Command_Compass_Tooltip"> Bussola </string> @@ -4973,4 +4985,13 @@ Prova a racchiudere il percorso dell'editor in doppie virgolette. <string name="UserDictionary"> [User] </string> + <string name="logging_calls_disabled_log_empty"> + Le conversazioni non vengono registrate. Per iniziare a registrare, seleziona "Salva: Solo registro" oppure "Salva: Registri e trascrizioni" in Preferenze > Chat. + </string> + <string name="logging_calls_disabled_log_not_empty"> + Non verranno registrate più le conversazioni. Per riprendere a registrare, seleziona "Salva: Solo registro" oppure "Salva: Registri e trascrizioni" in Preferenze > Chat. + </string> + <string name="logging_calls_enabled_log_empty"> + Nessuna conversazione in registro. Dopo che hai contattato qualcuno o se qualcuno ti contatta, una voce del registro verrà mostrata qui. + </string> </strings> diff --git a/indra/newview/skins/default/xui/ja/floater_conversation_log.xml b/indra/newview/skins/default/xui/ja/floater_conversation_log.xml new file mode 100644 index 0000000000..98b1a59a0d --- /dev/null +++ b/indra/newview/skins/default/xui/ja/floater_conversation_log.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="floater_conversation_log" title="会話ãƒã‚°"> + <panel name="buttons_panel"> + <filter_editor label="人をフィルター" name="people_filter_input"/> + <menu_button name="conversation_view_btn" tool_tip="表示 / 並ã¹æ›¿ãˆã®ã‚ªãƒ—ション"/> + <menu_button name="conversations_gear_btn" tool_tip="é¸æŠžã—ãŸä½äººãƒ»ã‚°ãƒ«ãƒ¼ãƒ—ã«å¯¾ã™ã‚‹ã‚¢ã‚¯ã‚·ãƒ§ãƒ³"/> + </panel> +</floater> diff --git a/indra/newview/skins/default/xui/ja/floater_conversation_preview.xml b/indra/newview/skins/default/xui/ja/floater_conversation_preview.xml new file mode 100644 index 0000000000..ea0b23de48 --- /dev/null +++ b/indra/newview/skins/default/xui/ja/floater_conversation_preview.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="preview_conversation" title="会話:"> + <floater.string name="Title"> + 会話:[NAME] + </floater.string> + <text name="page_label" value="ページ"/> +</floater> diff --git a/indra/newview/skins/default/xui/ja/floater_im_container.xml b/indra/newview/skins/default/xui/ja/floater_im_container.xml index 06b65e27f0..a155efdc1e 100644 --- a/indra/newview/skins/default/xui/ja/floater_im_container.xml +++ b/indra/newview/skins/default/xui/ja/floater_im_container.xml @@ -1,2 +1,29 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<multi_floater name="floater_im_box" title="会話"/> +<multi_floater name="floater_im_box" title="会話"> + <string name="collapse_icon" value="Conv_toolbar_collapse"/> + <string name="expand_icon" value="Conv_toolbar_expand"/> + <layout_stack name="conversations_stack"> + <layout_panel name="conversations_layout_panel"> + <layout_stack name="conversations_pane_buttons_stack"> + <layout_panel name="conversations_pane_buttons_expanded"> + <menu_button name="sort_btn" tool_tip="オプションã®è¡¨ç¤º / 並ã¹æ›¿ãˆ"/> + <button name="add_btn" tool_tip="æ–°ã—ã„会話を開始"/> + <button name="speak_btn" tool_tip="マイクを使ã£ã¦äººã¨è©±ã™"/> + </layout_panel> + <layout_panel name="conversations_pane_buttons_collapsed"> + <button name="expand_collapse_btn" tool_tip="ã“ã®ãƒªã‚¹ãƒˆã‚’é–‰ã˜ã‚‹ / é–‹ã"/> + </layout_panel> + </layout_stack> + </layout_panel> + <layout_panel name="messages_layout_panel"> + <panel_container name="im_box_tab_container"> + <panel name="stub_panel"> + <button name="stub_collapse_btn" tool_tip="ã“ã®ãƒšã‚¤ãƒ³ã‚’é–‰ã˜ã‚‹"/> + <text name="stub_textbox"> + ã“ã®ä¼šè©±ã¯ã€åˆ¥ã®ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã«è¡¨ç¤ºã•ã‚Œã¾ã™ã€‚[secondlife:/// 戻る.] + </text> + </panel> + </panel_container> + </layout_panel> + </layout_stack> +</multi_floater> diff --git a/indra/newview/skins/default/xui/ja/floater_im_session.xml b/indra/newview/skins/default/xui/ja/floater_im_session.xml index dfa1c85ca2..a44c843df7 100644 --- a/indra/newview/skins/default/xui/ja/floater_im_session.xml +++ b/indra/newview/skins/default/xui/ja/floater_im_session.xml @@ -1,8 +1,59 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="panel_im"> - <layout_stack name="im_panels"> - <layout_panel> - <line_editor label="宛先" name="chat_editor"/> - </layout_panel> - </layout_stack> + <floater.string name="call_btn_start"> + Conv_toolbar_open_call + </floater.string> + <floater.string name="call_btn_stop"> + Conv_toolbar_hang_up + </floater.string> + <floater.string name="collapseline_icon" value="Conv_collapse_to_one_line"/> + <floater.string name="expandline_icon" value="Conv_expand_one_line"/> + <floater.string name="collapse_icon" value="Conv_toolbar_collapse"/> + <floater.string name="expand_icon" value="Conv_toolbar_expand"/> + <floater.string name="tear_off_icon" value="Conv_toolbar_arrow_ne"/> + <floater.string name="return_icon" value="Conv_toolbar_arrow_sw"/> + <floater.string name="participant_added" value="[NAME] ã¯ä¼šè©±ã«æ‹›å¾…ã•ã‚Œã¾ã—ãŸã€‚"/> + <floater.string name="multiple_participants_added" value="[NAME] ã¯ä¼šè©±ã«æ‹›å¾…ã•ã‚Œã¾ã—ãŸã€‚"/> + <floater.string name="tooltip_to_separate_window" value="ã“ã®ä¼šè©±ã‚’別ã®ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã¸ç§»å‹•ã™ã‚‹"/> + <floater.string name="tooltip_to_main_window" value="ã“ã®ä¼šè©±ã‚’メインウィンドウã¸æˆ»ã™"/> + <floater.string name="start_call_button_tooltip" value="会話ã®æŽ¥ç¶šã‚’é–‹ã"/> + <floater.string name="end_call_button_tooltip" value="会話ã®æŽ¥ç¶šã‚’é–‰ã˜ã‚‹"/> + <floater.string name="expcol_button_not_tearoff_tooltip" value="ã“ã®ãƒšã‚¤ãƒ³ã‚’é–‰ã˜ã‚‹"/> + <floater.string name="expcol_button_tearoff_and_expanded_tooltip" value="å‚åŠ è€…ãƒªã‚¹ãƒˆã‚’é–‰ã˜ã‚‹"/> + <floater.string name="expcol_button_tearoff_and_collapsed_tooltip" value="å‚åŠ è€…ãƒªã‚¹ãƒˆã‚’é–‹ã"/> + <view name="contents_view"> + <layout_stack name="main_stack"> + <layout_panel name="toolbar_panel"> + <menu_button name="view_options_btn" tool_tip="表示 / 並ã¹æ›¿ãˆã®ã‚ªãƒ—ション"/> + <menu_button name="gear_btn" tool_tip="é¸æŠžã—ãŸäººã«å¯¾ã™ã‚‹ã‚¢ã‚¯ã‚·ãƒ§ãƒ³"/> + <button name="add_btn" tool_tip="ã“ã®ä¼šè©±ã«ä»–ã®äººã‚’è¿½åŠ ã™ã‚‹"/> + <button name="voice_call_btn" tool_tip="会話ã®æŽ¥ç¶šã‚’é–‹ã"/> + <button name="close_btn" tool_tip="ã“ã®ä¼šè©±ã‚’終了ã™ã‚‹"/> + <button name="expand_collapse_btn" tool_tip="ã“ã®ãƒšã‚¤ãƒ³ã‚’é–‰ã˜ã‚‹ / é–‹ã"/> + </layout_panel> + <layout_panel name="body_panel"> + <layout_stack name="im_panels"> + <layout_panel name="right_part_holder"> + <panel name="trnsAndChat_panel"> + <layout_stack name="translate_and_chat_stack"> + <layout_panel name="translate_chat_checkbox_lp"> + <check_box label="ãƒãƒ£ãƒƒãƒˆã‚’翻訳" name="translate_chat_checkbox"/> + </layout_panel> + </layout_stack> + </panel> + </layout_panel> + </layout_stack> + </layout_panel> + <layout_panel name="chat_layout_panel"> + <layout_stack name="input_panels"> + <layout_panel name="input_editor_layout_panel"> + <chat_editor label="宛先" name="chat_editor"/> + </layout_panel> + <layout_panel name="input_button_layout_panel"> + <button name="minz_btn" tool_tip="メッセージパãƒãƒ«ã®è¡¨ç¤º / éžè¡¨ç¤º"/> + </layout_panel> + </layout_stack> + </layout_panel> + </layout_stack> + </view> </floater> diff --git a/indra/newview/skins/default/xui/ja/floater_incoming_call.xml b/indra/newview/skins/default/xui/ja/floater_incoming_call.xml index f152fcd738..308f6f9a3d 100644 --- a/indra/newview/skins/default/xui/ja/floater_incoming_call.xml +++ b/indra/newview/skins/default/xui/ja/floater_incoming_call.xml @@ -10,7 +10,7 @@ 匿åユーザー </floater.string> <floater.string name="VoiceInviteP2P"> - ãŒã‚³ãƒ¼ãƒ«ã—ã¦ã„ã¾ã™ã€‚ + ã‹ã‚‰ã‚³ãƒ¼ãƒ«ã‚’å—ã‘ã¦ã„ã¾ã™ã€‚ </floater.string> <floater.string name="VoiceInviteAdHoc"> ãŒã‚³ãƒ³ãƒ•ã‚¡ãƒ¬ãƒ³ã‚¹ãƒãƒ£ãƒƒãƒˆã§ã€ãƒœã‚¤ã‚¹ãƒãƒ£ãƒƒãƒˆã«å‚åŠ ã—ã¾ã—ãŸã€‚ @@ -25,9 +25,9 @@ [CURRENT_CHAT]を退å¸ã—ã¦ã€ã“ã®ãƒœã‚¤ã‚¹ãƒãƒ£ãƒƒãƒˆã«å‚åŠ ã—ã¾ã™ã‹ï¼Ÿ </floater.string> <text name="question"> - [CURRENT_CHAT] を退å¸ã—ã¦ã€ã“ã®ãƒœã‚¤ã‚¹ãƒãƒ£ãƒƒãƒˆã«å‚åŠ ã—ã¾ã™ã‹ï¼Ÿ + コールã«å¿œç”ã™ã‚‹ã¨ã€ç¾åœ¨ã®ãƒœã‚¤ã‚¹ãƒãƒ£ãƒƒãƒˆã‹ã‚‰åˆ‡æ–ã•ã‚Œã¾ã™ã€‚ </text> - <button label="ã¯ã„" label_selected="ã¯ã„" name="Accept"/> - <button label="ã„ã„ãˆ" label_selected="ã„ã„ãˆ" name="Reject"/> - <button label="IM" name="Start IM"/> + <button label="å–ã‚‹" label_selected="å–ã‚‹" name="Accept"/> + <button label="無視" label_selected="無視" name="Reject"/> + <button label="代ã‚ã‚Šã« IM ã‚’é–‹ã" name="Start IM"/> </floater> diff --git a/indra/newview/skins/default/xui/ja/floater_pathfinding_console.xml b/indra/newview/skins/default/xui/ja/floater_pathfinding_console.xml index ec107f3e6b..9733c61918 100644 --- a/indra/newview/skins/default/xui/ja/floater_pathfinding_console.xml +++ b/indra/newview/skins/default/xui/ja/floater_pathfinding_console.xml @@ -71,7 +71,7 @@ <text name="show_label"> 表示: </text> - <check_box label="世界" name="show_world"/> + <check_box label="テスト" name="show_world"/> <check_box label="å¯å‹•ç‰©ã®ã¿" name="show_world_movables_only"/> <check_box label="ナビメッシュ" name="show_navmesh"/> <text name="show_walkability_label"> 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 3773812bb6..37233d3e68 100644 --- a/indra/newview/skins/default/xui/ja/floater_texture_ctrl.xml +++ b/indra/newview/skins/default/xui/ja/floater_texture_ctrl.xml @@ -20,7 +20,7 @@ <button label="ブランク" label_selected="ブランク" name="Blank"/> <button label="ãªã—" label_selected="ãªã—" name="None"/> <button label="" label_selected="" name="Pipette"/> - <check_box initial_value="true" label="ライブプレビュー" name="apply_immediate_check"/> + <check_box initial_value="true" label="今ã™ãé©ç”¨" name="apply_immediate_check"/> <text name="preview_disabled" value="プレビュー無効"/> <filter_editor label="テクスãƒãƒ£ã‚’フィルター" name="inventory search editor"/> <check_box initial_value="false" label="フォルダを表示" name="show_folders_check"/> diff --git a/indra/newview/skins/default/xui/ja/floater_voice_chat_volume.xml b/indra/newview/skins/default/xui/ja/floater_voice_chat_volume.xml new file mode 100644 index 0000000000..44e96c35ad --- /dev/null +++ b/indra/newview/skins/default/xui/ja/floater_voice_chat_volume.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="floater_voice_volume" title="ボイスãƒãƒ£ãƒƒãƒˆã®éŸ³é‡"> + <slider label="ボイスãƒãƒ£ãƒƒãƒˆ" name="chat_voice_volume"/> +</floater> diff --git a/indra/newview/skins/default/xui/ja/floater_voice_effect.xml b/indra/newview/skins/default/xui/ja/floater_voice_effect.xml index ee675e143b..b38ea9331a 100644 --- a/indra/newview/skins/default/xui/ja/floater_voice_effect.xml +++ b/indra/newview/skins/default/xui/ja/floater_voice_effect.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater label="å ´æ‰€" name="voice_effects" title="ボイスモーフィング"> +<floater label="å ´æ‰€" name="voice_effects" title="ボイスモーフィングã®ãƒ—レビュー"> <string name="no_voice_effect"> (ボイスモーフィングãªã—) </string> diff --git a/indra/newview/skins/default/xui/ja/floater_voice_volume.xml b/indra/newview/skins/default/xui/ja/floater_voice_volume.xml new file mode 100644 index 0000000000..a380615d5a --- /dev/null +++ b/indra/newview/skins/default/xui/ja/floater_voice_volume.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<!-- + Not can_close / no title to avoid window chrome + Single instance - only have one at a time, recycle it each spawn +--> +<floater name="floater_voice_volume" title="ボイス音é‡"> + <slider name="volume_slider" tool_tip="ボイス音é‡" value="0.5"/> +</floater> diff --git a/indra/newview/skins/default/xui/ja/menu_cof_gear.xml b/indra/newview/skins/default/xui/ja/menu_cof_gear.xml index a071abbd2e..07bcefd9b3 100644 --- a/indra/newview/skins/default/xui/ja/menu_cof_gear.xml +++ b/indra/newview/skins/default/xui/ja/menu_cof_gear.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<menu name="Gear COF"> +<toggleable_menu name="Gear COF"> <menu label="衣類" name="COF.Gear.New_Clothes"/> - <menu label="æ–°ã—ã„身体部ä½" name="COF.Geear.New_Body_Parts"/> -</menu> + <menu label="æ–°ã—ã„身体部ä½" name="COF.Gear.New_Body_Parts"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/ja/menu_conversation.xml b/indra/newview/skins/default/xui/ja/menu_conversation.xml new file mode 100644 index 0000000000..c7df20d252 --- /dev/null +++ b/indra/newview/skins/default/xui/ja/menu_conversation.xml @@ -0,0 +1,31 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_conversation_participant"> + <menu_item_call label="会話を終ãˆã‚‹" name="close_conversation"/> + <menu_item_call label="ボイスãƒãƒ£ãƒƒãƒˆã‚’始ã‚ã‚‹" name="open_voice_conversation"/> + <menu_item_call label="ボイスãƒãƒ£ãƒƒãƒˆã‚’切æ–ã™ã‚‹" name="disconnect_from_voice"/> + <menu_item_call label="プãƒãƒ•ã‚£ãƒ¼ãƒ«ã‚’表示" name="view_profile"/> + <menu_item_call label="IM" name="im"/> + <menu_item_call label="テレãƒãƒ¼ãƒˆã‚’é€ã‚‹" name="offer_teleport"/> + <menu_item_call label="ボイスコール" name="voice_call"/> + <menu_item_call label="ãƒãƒ£ãƒƒãƒˆã®å±¥æ´..." name="chat_history"/> + <menu_item_call label="ãƒ•ãƒ¬ãƒ³ãƒ‰ã‚’è¿½åŠ " name="add_friend"/> + <menu_item_call label="フレンドを削除" name="remove_friend"/> + <menu_item_call label="フレンドを削除" name="remove_friends"/> + <menu_item_call label="グループã«æ‹›å¾…..." name="invite_to_group"/> + <menu_item_call label="ズームイン" name="zoom_in"/> + <menu_item_call label="地図" name="map"/> + <menu_item_call label="共有" name="share"/> + <menu_item_call label="支払ã„" name="pay"/> + <menu_item_check label="ボイスをブãƒãƒƒã‚¯" name="block_unblock"/> + <menu_item_check label="æ–‡å—をブãƒãƒƒã‚¯ã™ã‚‹" name="MuteText"/> + <menu_item_call label="ã‚°ãƒ«ãƒ¼ãƒ—æƒ…å ±" name="group_profile"/> + <menu_item_call label="グループをアクティブã«ã™ã‚‹" name="activate_group"/> + <menu_item_call label="グループã‹ã‚‰è„±é€€ã™ã‚‹" name="leave_group"/> + <context_menu label="モデレーターã®ã‚ªãƒ—ション" name="Moderator Options"> + <menu_item_check label="æ–‡å—ãƒãƒ£ãƒƒãƒˆã‚’許å¯" name="AllowTextChat"/> + <menu_item_call label="ã“ã®å‚åŠ è€…ã‚’ãƒŸãƒ¥ãƒ¼ãƒˆã™ã‚‹" name="ModerateVoiceMuteSelected"/> + <menu_item_call label="ã“ã®å‚åŠ è€…ã®ãƒŸãƒ¥ãƒ¼ãƒˆã‚’解除ã™ã‚‹" name="ModerateVoiceUnMuteSelected"/> + <menu_item_call label="全員ã®éŸ³å£°ã‚’ミュートã™ã‚‹" name="ModerateVoiceMute"/> + <menu_item_call label="全員ã®ãƒŸãƒ¥ãƒ¼ãƒˆã‚’解除ã™ã‚‹" name="ModerateVoiceUnmute"/> + </context_menu> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/ja/menu_conversation_log_gear.xml b/indra/newview/skins/default/xui/ja/menu_conversation_log_gear.xml new file mode 100644 index 0000000000..c9d4f947a4 --- /dev/null +++ b/indra/newview/skins/default/xui/ja/menu_conversation_log_gear.xml @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="Conversation Context Menu"> + <menu_item_call label="IM..." name="IM"/> + <menu_item_call label="ボイスコール..." name="Call"/> + <menu_item_call label="ãƒãƒ£ãƒƒãƒˆã®å±¥æ´ã‚’é–‹ã..." name="Chat history"/> + <menu_item_call label="プãƒãƒ•ã‚£ãƒ¼ãƒ«ã‚’表示" name="View Profile"/> + <menu_item_call label="テレãƒãƒ¼ãƒˆã‚’é€ã‚‹" name="teleport"/> + <menu_item_call label="フレンド登録" name="add_friend"/> + <menu_item_call label="フレンドを削除" name="remove_friend"/> + <menu_item_call label="グループã«æ‹›å¾…..." name="Invite"/> + <menu_item_call label="地図" name="Map"/> + <menu_item_call label="共有" name="Share"/> + <menu_item_call label="支払ã„" name="Pay"/> + <menu_item_check label="ブãƒãƒƒã‚¯ãƒ»ãƒ–ãƒãƒƒã‚¯è§£é™¤" name="Block/Unblock"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/ja/menu_conversation_log_view.xml b/indra/newview/skins/default/xui/ja/menu_conversation_log_view.xml new file mode 100644 index 0000000000..bd4812603f --- /dev/null +++ b/indra/newview/skins/default/xui/ja/menu_conversation_log_view.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_conversation_view"> + <menu_item_check label="åå‰ã§ä¸¦ã¹æ›¿ãˆ" name="sort_by_name"/> + <menu_item_check label="日付ã§ä¸¦ã¹æ›¿ãˆ" name="sort_by_date"/> + <menu_item_check label="上ä½ã®ãƒ•ãƒ¬ãƒ³ãƒ‰ã‚’並ã¹æ›¿ãˆ" name="sort_by_friends"/> + <menu_item_call label="è¿‘ãã®ãƒãƒ£ãƒƒãƒˆã®å±¥æ´ã‚’表示..." name="view_nearby_chat_history"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/ja/menu_im_conversation.xml b/indra/newview/skins/default/xui/ja/menu_im_conversation.xml new file mode 100644 index 0000000000..55cd6610f7 --- /dev/null +++ b/indra/newview/skins/default/xui/ja/menu_im_conversation.xml @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="Conversation Gear Menu"> + <menu_item_call label="プãƒãƒ•ã‚£ãƒ¼ãƒ«ã‚’表示" name="View Profile"/> + <menu_item_call label="フレンド登録" name="Add Friend"/> + <menu_item_call label="フレンドを削除" name="remove_friend"/> + <menu_item_call label="テレãƒãƒ¼ãƒˆã‚’é€ã‚‹" name="offer_teleport"/> + <menu_item_call label="グループã«æ‹›å¾…..." name="invite_to_group"/> + <menu_item_call label="ãƒãƒ£ãƒƒãƒˆã®å±¥æ´..." name="chat_history"/> + <menu_item_call label="ズームイン" name="zoom_in"/> + <menu_item_call label="地図" name="map"/> + <menu_item_call label="共有" name="Share"/> + <menu_item_call label="支払ã„" name="Pay"/> + <menu_item_check label="ボイスをブãƒãƒƒã‚¯" name="Block/Unblock"/> + <menu_item_check label="æ–‡å—をブãƒãƒƒã‚¯ã™ã‚‹" name="MuteText"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/ja/menu_im_session_showmodes.xml b/indra/newview/skins/default/xui/ja/menu_im_session_showmodes.xml new file mode 100644 index 0000000000..222a741718 --- /dev/null +++ b/indra/newview/skins/default/xui/ja/menu_im_session_showmodes.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_modes"> + <menu_item_check label="簡略表示" name="compact_view"/> + <menu_item_check label="詳細表示" name="expanded_view"/> + <menu_item_check label="時間を表示" name="IMShowTime"/> + <menu_item_check label="1対1ã®ä¼šè©±ã§åå‰ã‚’表示" name="IMShowNamesForP2PConv"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/ja/menu_object_icon.xml b/indra/newview/skins/default/xui/ja/menu_object_icon.xml index 8c4f328661..6448e9244e 100644 --- a/indra/newview/skins/default/xui/ja/menu_object_icon.xml +++ b/indra/newview/skins/default/xui/ja/menu_object_icon.xml @@ -2,4 +2,6 @@ <menu name="Object Icon Menu"> <menu_item_call label="オブジェクトã®ãƒ—ãƒãƒ•ã‚£ãƒ¼ãƒ«..." name="Object Profile"/> <menu_item_call label="ブãƒãƒƒã‚¯..." name="Block"/> + <menu_item_call label="地図ã«è¡¨ç¤º" name="show_on_map"/> + <menu_item_call label="オブジェクトã®å ´æ‰€ã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆ" name="teleport_to_object"/> </menu> diff --git a/indra/newview/skins/default/xui/ja/menu_outfit_gear.xml b/indra/newview/skins/default/xui/ja/menu_outfit_gear.xml index 2bcbe1915b..1969ae2a10 100644 --- a/indra/newview/skins/default/xui/ja/menu_outfit_gear.xml +++ b/indra/newview/skins/default/xui/ja/menu_outfit_gear.xml @@ -23,6 +23,8 @@ <menu_item_call label="髪" name="New Hair"/> <menu_item_call label="ç›®" name="New Eyes"/> </menu> + <menu_item_call label="フォルダをã™ã¹ã¦é–‹ã" name="expand"/> + <menu_item_call label="フォルダをã™ã¹ã¦é–‰ã˜ã‚‹" name="collapse"/> <menu_item_call label="アウトフィットã®åå‰ã‚’変更ã™ã‚‹" name="rename"/> <menu_item_call label="アウトフィットを削除ã™ã‚‹" name="delete_outfit"/> </toggleable_menu> diff --git a/indra/newview/skins/default/xui/ja/menu_participant_view.xml b/indra/newview/skins/default/xui/ja/menu_participant_view.xml new file mode 100644 index 0000000000..5816351d9d --- /dev/null +++ b/indra/newview/skins/default/xui/ja/menu_participant_view.xml @@ -0,0 +1,13 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="participant_manu_view"> + <menu_item_check label="会話をタイプã§ä¸¦ã¹æ›¿ãˆ" name="sort_sessions_by_type"/> + <menu_item_check label="会話をåå‰ã§ä¸¦ã¹æ›¿ãˆ" name="sort_sessions_by_name"/> + <menu_item_check label="会話を最新アクティビティã§ä¸¦ã¹æ›¿ãˆ" name="sort_sessions_by_recent"/> + <menu_item_check label="å‚åŠ è€…ã‚’åå‰ã§ä¸¦ã¹æ›¿ãˆ" name="sort_participants_by_name"/> + <menu_item_check label="å‚åŠ è€…ã‚’æœ€æ–°ã‚¢ã‚¯ãƒ†ã‚£ãƒ“ãƒ†ã‚£ã§ä¸¦ã¹æ›¿ãˆ" name="sort_participants_by_recent"/> + <menu_item_call label="ãƒãƒ£ãƒƒãƒˆã®ç’°å¢ƒè¨å®š..." name="chat_preferences"/> + <menu_item_call label="プライãƒã‚·ãƒ¼ã®ç’°å¢ƒè¨å®š..." name="privacy_preferences"/> + <menu_item_check label="会話ãƒã‚°..." name="Conversation"/> + <menu_item_check label="è¿‘ãã®ãƒãƒ£ãƒƒãƒˆã‚’翻訳" name="Translate_chat"/> + <menu_item_check label="翻訳ã®è¨å®š..." name="Translation_settings"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/ja/menu_people_blocked_gear.xml b/indra/newview/skins/default/xui/ja/menu_people_blocked_gear.xml new file mode 100644 index 0000000000..b5c9d11e02 --- /dev/null +++ b/indra/newview/skins/default/xui/ja/menu_people_blocked_gear.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_blocked_gear"> + <menu_item_call label="ブãƒãƒƒã‚¯è§£é™¤" name="unblock"/> + <menu_item_call label="プãƒãƒ•ã‚£ãƒ¼ãƒ«..." name="profile"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/ja/menu_people_blocked_plus.xml b/indra/newview/skins/default/xui/ja/menu_people_blocked_plus.xml new file mode 100644 index 0000000000..3e74b2ddff --- /dev/null +++ b/indra/newview/skins/default/xui/ja/menu_people_blocked_plus.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_blocked_plus"> + <menu_item_call label="åå‰ã§ä½äººã‚’ブãƒãƒƒã‚¯..." name="block_resident_by_name"/> + <menu_item_call label="åå‰ã§ã‚ªãƒ–ジェクトをブãƒãƒƒã‚¯..." name="block_object_by_name"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/ja/menu_people_blocked_view.xml b/indra/newview/skins/default/xui/ja/menu_people_blocked_view.xml new file mode 100644 index 0000000000..4b86a353f4 --- /dev/null +++ b/indra/newview/skins/default/xui/ja/menu_people_blocked_view.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_blocked_view"> + <menu_item_check label="åå‰ã§ä¸¦ã¹æ›¿ãˆ" name="sort_by_name"/> + <menu_item_check label="タイプã«ã‚ˆã‚‹ä¸¦ã¹æ›¿ãˆ" name="sort_by_type"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/ja/menu_people_friends_view.xml b/indra/newview/skins/default/xui/ja/menu_people_friends_view.xml new file mode 100644 index 0000000000..b95d11fdbd --- /dev/null +++ b/indra/newview/skins/default/xui/ja/menu_people_friends_view.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_group_plus"> + <menu_item_check label="åå‰ã§ä¸¦ã¹æ›¿ãˆ" name="sort_name"/> + <menu_item_check label="オンライン状æ³ã§ä¸¦ã¹æ›¿ãˆ" name="sort_status"/> + <menu_item_check label="人ã®ã‚¢ã‚¤ã‚³ãƒ³è¡¨ç¤º" name="view_icons"/> + <menu_item_check label="与ãˆã‚‰ã‚ŒãŸæ¨©é™ã‚’表示" name="view_permissions"/> + <menu_item_check label="会話ãƒã‚°ã‚’表示..." name="view_conversation"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/ja/menu_people_groups.xml b/indra/newview/skins/default/xui/ja/menu_people_groups.xml index 842d79dc4b..2c0c85ba28 100644 --- a/indra/newview/skins/default/xui/ja/menu_people_groups.xml +++ b/indra/newview/skins/default/xui/ja/menu_people_groups.xml @@ -2,7 +2,7 @@ <menu name="menu_group_plus"> <menu_item_call label="æƒ…å ±ã‚’è¡¨ç¤º" name="View Info"/> <menu_item_call label="ãƒãƒ£ãƒƒãƒˆ" name="Chat"/> - <menu_item_call label="コール" name="Call"/> + <menu_item_call label="ボイスコール" name="Call"/> <menu_item_call label="アクティブ" name="Activate"/> <menu_item_call label="脱退" name="Leave"/> </menu> diff --git a/indra/newview/skins/default/xui/ja/menu_people_groups_view.xml b/indra/newview/skins/default/xui/ja/menu_people_groups_view.xml new file mode 100644 index 0000000000..4a9e402fa4 --- /dev/null +++ b/indra/newview/skins/default/xui/ja/menu_people_groups_view.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_group_plus"> + <menu_item_check label="グループアイコンを表示" name="Display Group Icons"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/ja/menu_people_nearby.xml b/indra/newview/skins/default/xui/ja/menu_people_nearby.xml index 8d84b0e521..972ab767bf 100644 --- a/indra/newview/skins/default/xui/ja/menu_people_nearby.xml +++ b/indra/newview/skins/default/xui/ja/menu_people_nearby.xml @@ -1,13 +1,16 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <context_menu name="Avatar Context Menu"> - <menu_item_call label="プãƒãƒ•ã‚£ãƒ¼ãƒ«ã®è¡¨ç¤º" name="View Profile"/> - <menu_item_call label="フレンド登録" name="Add Friend"/> - <menu_item_call label="フレンドを削除" name="Remove Friend"/> - <menu_item_call label="IM" name="IM"/> - <menu_item_call label="コール" name="Call"/> - <menu_item_call label="地図" name="Map"/> - <menu_item_call label="共有" name="Share"/> - <menu_item_call label="支払ã†" name="Pay"/> - <menu_item_check label="ブãƒãƒƒã‚¯ãƒ»ãƒ–ãƒãƒƒã‚¯è§£é™¤" name="Block/Unblock"/> - <menu_item_call label="テレãƒãƒ¼ãƒˆã‚’é€ã‚‹" name="teleport"/> + <menu_item_call label="プãƒãƒ•ã‚£ãƒ¼ãƒ«ã‚’表示" name="view_profile"/> + <menu_item_call label="IM" name="im"/> + <menu_item_call label="テレãƒãƒ¼ãƒˆã‚’é€ã‚‹" name="offer_teleport"/> + <menu_item_call label="ボイスコール" name="voice_call"/> + <menu_item_call label="ãƒãƒ£ãƒƒãƒˆã®å±¥æ´ã‚’表示..." name="chat_history"/> + <menu_item_call label="フレンド登録" name="add_friend"/> + <menu_item_call label="フレンドを削除" name="remove_friend"/> + <menu_item_call label="グループã«æ‹›å¾…..." name="invite_to_group"/> + <menu_item_call label="ズームイン" name="zoom_in"/> + <menu_item_call label="地図" name="map"/> + <menu_item_call label="共有" name="share"/> + <menu_item_call label="支払ã„" name="pay"/> + <menu_item_check label="ブãƒãƒƒã‚¯ãƒ»ãƒ–ãƒãƒƒã‚¯è§£é™¤" name="block_unblock"/> </context_menu> diff --git a/indra/newview/skins/default/xui/ja/menu_people_nearby_multiselect.xml b/indra/newview/skins/default/xui/ja/menu_people_nearby_multiselect.xml index 3f20e5d3ab..fe85e278cf 100644 --- a/indra/newview/skins/default/xui/ja/menu_people_nearby_multiselect.xml +++ b/indra/newview/skins/default/xui/ja/menu_people_nearby_multiselect.xml @@ -1,10 +1,10 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <context_menu name="Multi-Selected People Context Menu"> - <menu_item_call label="フレンド登録" name="Add Friends"/> - <menu_item_call label="フレンドを削除" name="Remove Friend"/> - <menu_item_call label="IM" name="IM"/> - <menu_item_call label="コール" name="Call"/> - <menu_item_call label="共有" name="Share"/> - <menu_item_call label="支払ã†" name="Pay"/> - <menu_item_call label="テレãƒãƒ¼ãƒˆã‚’é€ã‚‹" name="teleport"/> + <menu_item_call label="フレンド登録" name="add_friends"/> + <menu_item_call label="フレンドを削除" name="remove_friends"/> + <menu_item_call label="IM" name="im"/> + <menu_item_call label="コール" name="call"/> + <menu_item_call label="共有" name="share"/> + <menu_item_call label="支払ã„" name="pay"/> + <menu_item_call label="テレãƒãƒ¼ãƒˆã‚’é€ã‚‹" name="offer_teleport"/> </context_menu> diff --git a/indra/newview/skins/default/xui/ja/menu_people_nearby_view.xml b/indra/newview/skins/default/xui/ja/menu_people_nearby_view.xml new file mode 100644 index 0000000000..b7cccc4396 --- /dev/null +++ b/indra/newview/skins/default/xui/ja/menu_people_nearby_view.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_group_plus"> + <menu_item_check label="最近ã®ç™ºè¨€è€…ã§ä¸¦ã¹æ›¿ãˆ" name="sort_by_recent_speakers"/> + <menu_item_check label="åå‰ã§ä¸¦ã¹æ›¿ãˆ" name="sort_name"/> + <menu_item_check label="è·é›¢ã§ä¸¦ã¹æ›¿ãˆ" name="sort_distance"/> + <menu_item_check label="人ã®ã‚¢ã‚¤ã‚³ãƒ³è¡¨ç¤º" name="view_icons"/> + <menu_item_check label="地図を表示" name="view_map"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/ja/menu_people_recent_view.xml b/indra/newview/skins/default/xui/ja/menu_people_recent_view.xml new file mode 100644 index 0000000000..feaeba4398 --- /dev/null +++ b/indra/newview/skins/default/xui/ja/menu_people_recent_view.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_group_plus"> + <menu_item_check label="æ–°ã—ã„é †ã«ä¸¦ã¹æ›¿ãˆ" name="sort_most"/> + <menu_item_check label="åå‰ã§ä¸¦ã¹æ›¿ãˆ" name="sort_name"/> + <menu_item_check label="人ã®ã‚¢ã‚¤ã‚³ãƒ³è¡¨ç¤º" name="view_icons"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/ja/menu_url_agent.xml b/indra/newview/skins/default/xui/ja/menu_url_agent.xml index 92d118a5ae..72722db7cc 100644 --- a/indra/newview/skins/default/xui/ja/menu_url_agent.xml +++ b/indra/newview/skins/default/xui/ja/menu_url_agent.xml @@ -1,6 +1,8 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <context_menu name="Url Popup"> - <menu_item_call label="ä½äººã®ãƒ—ãƒãƒ•ã‚£ãƒ¼ãƒ«ã‚’表示" name="show_agent"/> + <menu_item_call label="プãƒãƒ•ã‚£ãƒ¼ãƒ«ã‚’表示" name="show_agent"/> + <menu_item_call label="IM ã‚’é€ä¿¡..." name="send_im"/> + <menu_item_call label="ãƒ•ãƒ¬ãƒ³ãƒ‰ã‚’è¿½åŠ ..." name="add_friend"/> <menu_item_call label="åå‰ã‚’クリップボードã«ã‚³ãƒ”ー" name="url_copy_label"/> <menu_item_call label="SLurl をクリップボードã«ã‚³ãƒ”ー" name="url_copy"/> </context_menu> diff --git a/indra/newview/skins/default/xui/ja/menu_url_objectim.xml b/indra/newview/skins/default/xui/ja/menu_url_objectim.xml index d6a048dcfc..9e340e3239 100644 --- a/indra/newview/skins/default/xui/ja/menu_url_objectim.xml +++ b/indra/newview/skins/default/xui/ja/menu_url_objectim.xml @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <context_menu name="Url Popup"> - <menu_item_call label="オブジェクトã®æƒ…å ±ã‚’è¡¨ç¤º" name="show_object"/> + <menu_item_call label="オブジェクトã®ãƒ—ãƒãƒ•ã‚£ãƒ¼ãƒ«..." name="show_object"/> <menu_item_call label="地図ã«è¡¨ç¤º" name="show_on_map"/> <menu_item_call label="オブジェクトã®å ´æ‰€ã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆ" name="teleport_to_object"/> <menu_item_call label="オブジェクトåをクリップボードã«ã‚³ãƒ”ー" name="url_copy_label"/> diff --git a/indra/newview/skins/default/xui/ja/menu_viewer.xml b/indra/newview/skins/default/xui/ja/menu_viewer.xml index e60e6781c6..725ceff208 100644 --- a/indra/newview/skins/default/xui/ja/menu_viewer.xml +++ b/indra/newview/skins/default/xui/ja/menu_viewer.xml @@ -16,10 +16,7 @@ <menu_item_call label="ç§ã®ã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³ã‚’åœæ¢ã™ã‚‹" name="Stop Animating My Avatar"/> <menu_item_call label="æ©è¡Œï¼èµ°è¡Œï¼é£›è¡Œ..." name="Walk / run / fly"/> </menu> - <menu label="ãƒã‚°ã‚¤ãƒ³" name="Status"> - <menu_item_call label="一時退å¸ä¸" name="Set Away"/> - <menu_item_call label="å–ã‚Šè¾¼ã¿ä¸" name="Set Busy"/> - </menu> + <menu label="ãƒã‚°ã‚¤ãƒ³" name="Status"/> <menu_item_call label="L$ ã®è³¼å…¥..." name="Buy and Sell L$"/> <menu_item_call label="マーãƒãƒ£ãƒ³ãƒˆã‚¢ã‚¦ãƒˆãƒœãƒƒã‚¯ã‚¹..." name="MerchantOutbox"/> <menu_item_call label="マイアカウント..." name="Manage My Account"> @@ -32,14 +29,18 @@ <menu_item_call label="[APP_NAME] を終了" name="Quit"/> </menu> <menu label="コミュニケーション" name="Communicate"> - <menu_item_check label="ãƒãƒ£ãƒƒãƒˆ..." name="Nearby Chat"/> + <menu_item_check label="会話..." name="Conversations"/> + <menu_item_check label="è¿‘ãã®ãƒãƒ£ãƒƒãƒˆ..." name="Nearby Chat"/> <menu_item_check label="話ã™" name="Speak"/> - <menu_item_check label="ボイスè¨å®š..." name="Nearby Voice"/> - <menu_item_check label="ボイスモーフィング..." name="ShowVoice"/> + <menu label="ボイスモーフィング" name="VoiceMorphing"> + <menu_item_check label="ボイスモーフィングãªã—" name="NoVoiceMorphing"/> + <menu_item_check label="プレビュー..." name="Preview"/> + <menu_item_call label="申ã—込む..." name="Subscribe"/> + </menu> <menu_item_check label="ジェスãƒãƒ£ãƒ¼..." name="Gestures"/> - <menu_item_call label="フレンド" name="My Friends"/> - <menu_item_call label="グループ" name="My Groups"/> - <menu_item_call label="è¿‘ãã«ã„る人" name="Active Speakers"/> + <menu_item_check label="フレンド" name="My Friends"/> + <menu_item_check label="グループ" name="My Groups"/> + <menu_item_check label="è¿‘ãã«ã„る人" name="Active Speakers"/> <menu_item_call label="リストをブãƒãƒƒã‚¯" name="Block List"/> </menu> <menu label="世界" name="World"> @@ -307,7 +308,7 @@ <menu_item_call label="é¸æŠžã—ãŸãƒ†ã‚¯ã‚¹ãƒãƒ£æƒ…å ±åŸºåº•" name="Selected Texture Info Basis"/> <menu_item_check label="ワイヤーフレーム" name="Wireframe"/> <menu_item_check label="オブジェクト間オクルージョン" name="Object-Object Occlusion"/> - <menu_item_check label="å…‰ã¨å½±" name="Lighting and Shadows"/> + <menu_item_check label="å…‰ã¨å½±" name="Advanced Lighting Model"/> <menu_item_check label="太陽・月・プãƒã‚¸ã‚§ã‚¯ã‚¿ã‹ã‚‰ã®å½±" name="Shadows from Sun/Moon/Projectors"/> <menu_item_check label="SSAO ã¨å½±ã®å¹³æ»‘化" name="SSAO and Shadow Smoothing"/> <menu_item_check label="GL デãƒãƒƒã‚°" name="Debug GL"/> diff --git a/indra/newview/skins/default/xui/ja/notifications.xml b/indra/newview/skins/default/xui/ja/notifications.xml index d5cff18a24..356506f191 100644 --- a/indra/newview/skins/default/xui/ja/notifications.xml +++ b/indra/newview/skins/default/xui/ja/notifications.xml @@ -538,6 +538,24 @@ L$ ãŒä¸è¶³ã—ã¦ã„ã‚‹ã®ã§ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«å‚åŠ ã™ã‚‹ã“ã¨ãŒã§ãã </url> <usetemplate ignoretext="使用ã—ã¦ã„るグラフィックドライãƒãŒå¤ã„å ´åˆ" name="okcancelignore" notext="ã„ã„ãˆ" yestext="ã¯ã„"/> </notification> + <notification name="AMDOldDriver"> + ãŠä½¿ã„ã®ã‚°ãƒ©ãƒ•ã‚£ãƒƒã‚¯ãƒãƒƒãƒ—ã«ã¯æœ€æ–°ã®ãƒ‰ãƒ©ã‚¤ãƒãŒå˜åœ¨ã™ã‚‹ã‚ˆã†ã§ã™ã€‚グラフィックドライãƒã‚’æ›´æ–°ã™ã‚‹ã¨ã€ãƒ‘フォーマンスãŒå¤§å¹…ã«æ”¹å–„ã•ã‚Œã¾ã™ã€‚ + +[_URL] ã¸ã‚¢ã‚¯ã‚»ã‚¹ã—ã¦ã€ãƒ‰ãƒ©ã‚¤ãƒãƒ¼ã‚’æ›´æ–°ã—ã¾ã™ã‹ã€‚ + <url name="url"> + http://support.amd.com/us/Pages/AMDSupportHub.aspx + </url> + <usetemplate ignoretext="自分ã®ã‚°ãƒ©ãƒ•ã‚£ãƒƒã‚¯ãƒ‰ãƒ©ã‚¤ãƒãŒæ—§ããªã‚Šã¾ã—ãŸã€‚" name="okcancelignore" notext="ã„ã„ãˆ" yestext="ã¯ã„"/> + </notification> + <notification name="NVIDIAOldDriver"> + ãŠä½¿ã„ã®ã‚°ãƒ©ãƒ•ã‚£ãƒƒã‚¯ãƒãƒƒãƒ—ã«ã¯æœ€æ–°ã®ãƒ‰ãƒ©ã‚¤ãƒãŒå˜åœ¨ã™ã‚‹ã‚ˆã†ã§ã™ã€‚グラフィックドライãƒã‚’æ›´æ–°ã™ã‚‹ã¨ã€ãƒ‘フォーマンスãŒå¤§å¹…ã«æ”¹å–„ã•ã‚Œã¾ã™ã€‚ + +[_URL] ã¸ã‚¢ã‚¯ã‚»ã‚¹ã—ã¦ã€ãƒ‰ãƒ©ã‚¤ãƒãƒ¼ã‚’æ›´æ–°ã—ã¾ã™ã‹ã€‚ + <url name="url"> + http://www.nvidia.com/Download/index.aspx?lang=en-us + </url> + <usetemplate ignoretext="自分ã®ã‚°ãƒ©ãƒ•ã‚£ãƒƒã‚¯ãƒ‰ãƒ©ã‚¤ãƒãŒæ—§ããªã‚Šã¾ã—ãŸã€‚" name="okcancelignore" notext="ã„ã„ãˆ" yestext="ã¯ã„"/> + </notification> <notification name="UnknownGPU"> ãŠä½¿ã„ã®ã‚·ã‚¹ãƒ†ãƒ ã«ã¯ã€[APP_NAME] ãŒèªè˜ã§ããªã„グラフィックカードãŒæ載ã•ã‚Œã¦ã„ã¾ã™ã€‚ [APP_NAME] ã§ã¾ã テストã•ã‚Œã¦ã„ãªã„最新ãƒãƒ¼ãƒ‰ã‚¦ã‚§ã‚¢ã®ãŸã‚ã ã¨è€ƒãˆã‚‰ã‚Œã¾ã™ã€‚ å•é¡Œãªã„ã¨ã¯æ€ã„ã¾ã™ãŒã€ã‚°ãƒ©ãƒ•ã‚£ãƒƒã‚¯ã®è¨å®šã‚’調整ã™ã‚‹å¿…è¦ãŒã‚ã‚‹ã‹ã‚‚ã—ã‚Œã¾ã›ã‚“。 @@ -1582,10 +1600,13 @@ http://secondlife.com/download ã‹ã‚‰æœ€æ–°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’ダウンãƒãƒ¼ãƒ‰ã ç¾åœ¨ãƒ•ãƒ¬ãƒ³ãƒ‰ã‚·ãƒƒãƒ—ã‚’é€ã‚Œã¾ã›ã‚“。数分後ã«ã‚‚ã†ä¸€åº¦ãŠè©¦ã—ãã ã•ã„。 <usetemplate name="okbutton" yestext="OK"/> </notification> - <notification name="BusyModeSet"> - å–ã‚Šè¾¼ã¿ä¸ãƒ¢ãƒ¼ãƒ‰ã«ãªã‚Šã¾ã—ãŸã€‚ -ãƒãƒ£ãƒƒãƒˆã¨ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ãƒˆãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã¯è¡¨ç¤ºã•ã‚Œã¾ã›ã‚“。 å—ä¿¡ã™ã‚‹ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ãƒˆãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã«ã¯å–ã‚Šè¾¼ã¿ä¸è¿”ç”メッセージãŒè¡¨ç¤ºã•ã‚Œã¾ã™ã€‚ テレãƒãƒ¼ãƒˆã®ã‚ªãƒ•ã‚¡ãƒ¼ã¯å—ã‘å–ã‚Šæ‹’å¦ã¨ãªã‚Šã¾ã™ã€‚ アイテムã®ã‚ªãƒ•ã‚¡ãƒ¼ã¯ã™ã¹ã¦ã”ã¿ç®±ã«å…¥ã‚Šã¾ã™ã€‚ - <usetemplate ignoretext="ãƒã‚°ã‚¤ãƒ³çŠ¶æ…‹ã‚’å–ã‚Šè¾¼ã¿ä¸ãƒ¢ãƒ¼ãƒ‰ã«å¤‰æ›´ã™ã‚‹ã¨ã" name="okignore" yestext="OK"/> + <notification name="DoNotDisturbModeSet"> + 「通知をå—ã‘ãªã„ã€ãŒã‚ªãƒ³ã«ãªã‚Šã¾ã™ã€‚ç€ä¿¡é€šä¿¡ã¯ã‚ãªãŸã«ã¯é€šçŸ¥ã•ã‚Œã¾ã›ã‚“。 + +- ä»–ã®ä½æ°‘ã¯ã€Œé€šçŸ¥ã‚’å—ã‘ãªã„ã€ã®å¿œç”(「è¨å®šã€>「一般ã€ã§è¨å®šï¼‰ã‚’å—ã‘å–ã‚‹ã“ã¨ã«ãªã‚Šã¾ã™ã€‚ +- テレãƒãƒ¼ãƒˆã®ã‚ªãƒ•ã‚¡ãƒ¼ã¯ã™ã¹ã¦å—ã‘å–ã‚Šæ‹’å¦ã¨ãªã‚Šã¾ã™ã€‚ +- ボイスコールã¯æ‹’å¦ã•ã‚Œã¾ã™ã€‚ + <usetemplate ignoretext="マイ ãƒã‚°ã‚¤ãƒ³çŠ¶æ…‹ã‚’「通知をå—ã‘ãªã„ã€ãƒ¢ãƒ¼ãƒ‰ã«å¤‰æ›´ã—ã¾ã—ãŸã€‚" name="okignore" yestext="OK"/> </notification> <notification name="JoinedTooManyGroupsMember"> åŠ å…¥ã§ãるグループã®æœ€å¤§é™ã«é”ã—ã¾ã—ãŸã€‚ ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«åŠ å…¥ã™ã‚‹ãŸã‚ã«ä»–ã®ã‚°ãƒ«ãƒ¼ãƒ—を脱退ã™ã‚‹ã‹ã€ã“ã®ç”³ã—入れをæ–ã£ã¦ãã ã•ã„。 @@ -2076,6 +2097,10 @@ L$ [AMOUNT] ã§ã€ã“ã®ã‚¯ãƒ©ã‚·ãƒ•ã‚¡ã‚¤ãƒ‰åºƒå‘Šã‚’今ã™ã公開ã—ã¾ã™ã [http://jp.secondlife.com/account/ マイアカウント] ページã«ç§»å‹•ã—ã¦ã‚¢ã‚«ã‚¦ãƒ³ãƒˆå±¥æ´ã‚’確èªã—ã¾ã™ã‹ï¼Ÿ <usetemplate ignoretext="ブラウザを起動ã—ã¦ã‚¢ã‚«ã‚¦ãƒ³ãƒˆå±¥æ´ã‚’見るã¨ã" name="okcancelignore" notext="å–り消ã—" yestext="ページã«ç§»å‹•"/> </notification> + <notification name="ConfirmAddingChatParticipants"> + æ—¢å˜ã®ä¼šè©±ã«äººã‚’åŠ ãˆã‚‹ã¨ã€æ–°ã—ã„会話ãŒä½œæˆã•ã‚Œã¾ã™ã€‚å‚åŠ è€…å…¨å“¡ã«æ–°ã—ã„会話ã«ã¤ã„ã¦ã®é€šçŸ¥ãŒé…ä¿¡ã•ã‚Œã¾ã™ã€‚ + <usetemplate ignoretext="ãƒãƒ£ãƒƒãƒˆã®å‚åŠ è€…ã®è¿½åŠ を確èªã—ã¦ãã ã•ã„" name="okcancelignore" notext="å–り消ã—" yestext="OK"/> + </notification> <notification name="ConfirmQuit"> 終了ã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚続ã‘ã¾ã™ã‹ï¼Ÿ <usetemplate ignoretext="終了時ã®ç¢ºèª" name="okcancelignore" notext="終了ã—ãªã„" yestext="終了"/> @@ -2153,14 +2178,14 @@ Linden Lab <button ignore="交æ›ã—ãªã„" name="No" text="ã‚ャンセル"/> </form> </notification> - <notification label="å–ã‚Šè¾¼ã¿ä¸ã®è¦å‘Š" name="BusyModePay"> - ç¾åœ¨ã€ã€Œå–ã‚Šè¾¼ã¿ä¸ã€ãƒ¢ãƒ¼ãƒ‰ã®ãŸã‚ã€æ”¯æ‰•ã„ã¨å¼•ãæ›ãˆã«ã‚¢ã‚¤ãƒ†ãƒ ã‚’å—ã‘å–ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。 + <notification label="「通知をå—ã‘ãªã„ã€ãƒ¢ãƒ¼ãƒ‰ã®è¦å‘Š" name="DoNotDisturbModePay"> + 「通知をå—ã‘ãªã„ã€ã‚’オンã«ã—ã¾ã™ã€‚ã“ã®æ”¯æ‰•ã¨ã®äº¤æ›ã§æä¾›ã•ã‚Œã‚‹ã‚¢ã‚¤ãƒ†ãƒ ãŒå—ä¿¡ã•ã‚Œãªããªã‚Šã¾ã™ã€‚ -ã“ã®å–引を行ã†ãŸã‚ã«ã€Œå–ã‚Šè¾¼ã¿ä¸ã€ã®è¨å®šã‚’解除ã—ã¾ã™ã‹ï¼Ÿ +ã“ã®ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³ã‚’完了ã™ã‚‹ãŸã‚ã«ã€ã€Œé€šçŸ¥ã‚’å—ã‘ãªã„ã€ã‚’オフã«ã—ã¦ã‚‚よã‚ã—ã„ã§ã™ã‹ã€‚ <form name="form"> - <ignore name="ignore" save_option="true" text="å–ã‚Šè¾¼ã¿ä¸ãƒ¢ãƒ¼ãƒ‰æ™‚ã«æ”¯æ‰•ã‚’ã™ã‚‹ã¨ã"/> - <button ignore="常ã«ã€Œå–ã‚Šè¾¼ã¿ä¸ã€ã®è¨å®šã‚’解除" name="Yes" text="OK"/> - <button ignore="常ã«ã€Œå–ã‚Šè¾¼ã¿ä¸ã€ã®è¨å®šã‚’継続" name="No" text="ã‚ャンセル"/> + <ignore name="ignore" text="「通知をå—ã‘ãªã„ã€ãƒ¢ãƒ¼ãƒ‰æ™‚ã«ã€äººã‚„物を支払ã†äºˆå®šã§ã™ã€‚"/> + <button ignore="「通知をå—ã‘ãªã„ã€ãƒ¢ãƒ¼ãƒ‰ã‚’ç¶æŒã—ãªã„" name="Yes" text="OK"/> + <button ignore="「通知をå—ã‘ãªã„ã€ãƒ¢ãƒ¼ãƒ‰ã‚’ç¶æŒã™ã‚‹" name="No" text="å–り消ã—"/> </form> </notification> <notification name="ConfirmDeleteProtectedCategory"> @@ -2296,11 +2321,8 @@ Web ページã«ãƒªãƒ³ã‚¯ã™ã‚‹ã¨ã€ä»–人ãŒã“ã®å ´æ‰€ã«ç°¡å˜ã«ã‚¢ã‚¯ã‚»ã <notification name="GroupNotice"> 件å: [SUBJECT]ã€ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ï¼š [MESSAGE] </notification> - <notification name="FriendOnline"> - <nolink>[NAME]</nolink> ã¯ã‚ªãƒ³ãƒ©ã‚¤ãƒ³ã§ã™ - </notification> - <notification name="FriendOffline"> - <nolink>[NAME]</nolink> ã¯ã‚ªãƒ•ãƒ©ã‚¤ãƒ³ã§ã™ + <notification name="FriendOnlineOffline"> + <nolink>[NAME]</nolink> 㯠[STATUS] ã§ã™ </notification> <notification name="AddSelfFriend"> 残念ãªãŒã‚‰è‡ªåˆ†è‡ªèº«ã‚’フレンド登録ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。 @@ -2530,13 +2552,6 @@ Web ページã«ãƒªãƒ³ã‚¯ã™ã‚‹ã¨ã€ä»–人ãŒã“ã®å ´æ‰€ã«ç°¡å˜ã«ã‚¢ã‚¯ã‚»ã <notification name="DynamicPathfindingDisabled"> ã“ã®åœ°åŸŸï¼ˆãƒªãƒ¼ã‚¸ãƒ§ãƒ³ï¼‰ã§ãƒ€ã‚¤ãƒŠãƒŸãƒƒã‚¯ãƒ‘スファインディングãŒæœ‰åŠ¹ã«ãªã£ã¦ã„ã¾ã›ã‚“。パスファインディング LSL 呼ã³å‡ºã—を使用ã™ã‚‹ã‚¹ã‚¯ãƒªãƒ—ト化ã•ã‚ŒãŸã‚ªãƒ–ジェクトãŒã“ã®åœ°åŸŸï¼ˆãƒªãƒ¼ã‚¸ãƒ§ãƒ³ï¼‰ã§ã¯å‹•ä½œã§ãã¾ã›ã‚“。 </notification> - <notification name="PathfindingRebakeNavmesh"> - ã“ã®åœ°åŸŸï¼ˆãƒªãƒ¼ã‚¸ãƒ§ãƒ³ï¼‰ã®ã‚ªãƒ–ジェクトを変更ã™ã‚‹ã¨ã€ä»–ã®ç§»å‹•ã‚ªãƒ–ジェクトãŒæ£ã—ã動作ã—ãªããªã‚‹æã‚ŒãŒã‚ã‚Šã¾ã™ã€‚移動オブジェクトをæ£ã—ã動作ã•ã›ã‚‹ã«ã¯ã€ã€Œåœ°åŸŸã®å†æ§‹ç¯‰ã€ãƒœã‚¿ãƒ³ã‚’クリックã—ã¾ã™ã€‚詳ã—ã„æƒ…å ±ã¯è¦‹ã‚‹ã«ã¯ã€Œãƒ˜ãƒ«ãƒ—ã€ã‚’é¸æŠžã—ã¦ãã ã•ã„。 - <url name="url"> - http://wiki.secondlife.com/wiki/Pathfinding_Tools_in_the_Second_Life_Viewer - </url> - <usetemplate helptext="ヘルプ" ignoretext="ã“ã®åœ°åŸŸï¼ˆãƒªãƒ¼ã‚¸ãƒ§ãƒ³ï¼‰ã®ã‚ªãƒ–ジェクトを変更ã™ã‚‹ã¨ã€ä»–ã®ç§»å‹•ã‚ªãƒ–ジェクトãŒæ£ã—ã動作ã—ãªããªã‚‹æã‚ŒãŒã‚ã‚Šã¾ã™ã€‚" name="okhelpignore" yestext="OK"/> - </notification> <notification name="PathfindingCannotRebakeNavmesh"> エラーãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã¾ãŸã¯ã‚µãƒ¼ãƒãƒ¼ã«å•é¡ŒãŒã‚ã‚‹ã‹ã€åˆ¶ä½œæ¨©ãŒãªã„å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚ã“ã®å•é¡Œã¯ã€ä¸€åº¦ãƒã‚°ã‚¢ã‚¦ãƒˆã—ã¦ã‹ã‚‰ã€ãƒã‚°ã‚¤ãƒ³ã—ç›´ã™ã¨è§£æ±ºã•ã‚Œã‚‹å ´åˆãŒã‚ã‚Šã¾ã™ã€‚ <usetemplate name="okbutton" yestext="OK"/> @@ -2797,9 +2812,9 @@ Web ページã«ãƒªãƒ³ã‚¯ã™ã‚‹ã¨ã€ä»–人ãŒã“ã®å ´æ‰€ã«ç°¡å˜ã«ã‚¢ã‚¯ã‚»ã </form> </notification> <notification name="ScriptQuestionCaution"> - è¦å‘Šï¼šã‚ªãƒ–ジェクト '<nolink>[OBJECTNAME]</nolink>' ã¯ã‚ãªãŸã®ãƒªãƒ³ãƒ‡ãƒ³ãƒ‰ãƒ«ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã¸ã®ãƒˆãƒ¼ã‚¿ãƒ«ã‚¢ã‚¯ã‚»ã‚¹ã‚’希望ã—ã¦ã„ã¾ã™ã€‚アクセスを許å¯ã™ã‚‹ã¨ã€ã“ã®ã‚ªãƒ–ジェクトã¯ã„ã¤ã§ã‚‚ã‚ãªãŸã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã‹ã‚‰è³‡é‡‘を削除ã—ãŸã‚Šã€ä»Šå¾Œè¦å‘Šã‚’表示ã™ã‚‹ã“ã¨ãªã継続的ã«ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã‚’完全ã«ç©ºã«ã§ãるよã†ã«ãªã‚Šã¾ã™ã€‚ + è¦å‘Š:オブジェクト '<nolink>[OBJECTNAME]</nolink>' ã¯ã€ã‚ãªãŸã®ãƒªãƒ³ãƒ‡ãƒ³ãƒ‰ãƒ«ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã¸ã®ãƒ•ãƒ«ã‚¢ã‚¯ã‚»ã‚¹ã‚’è¦æ±‚ã—ã¦ã„ã¾ã™ã€‚アクセスを許å¯ã™ã‚‹ã¨ã€ã“ã®ã‚ªãƒ–ジェクトã¯ã€ç‰¹ã«è¦å‘Šã‚’発ã›ãšã«å˜ç™ºã§ã€éšæ™‚アカウントã‹ã‚‰è³‡é‡‘を削除ã™ã‚‹ã‹ã€ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã‚’完全ã«ç©ºã«ã—ã¾ã™ã€‚ -ã“ã®ã‚ˆã†ãªãƒªã‚¯ã‚¨ã‚¹ãƒˆãŒæ£å½“ã§ã‚ã‚‹ã“ã¨ã¯ç¨€ã§ã™ã€‚ã“ã®ã‚ªãƒ–ジェクトãŒã‚ãªãŸã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã«ã‚¢ã‚¯ã‚»ã‚¹ã—ãŸã„ç†ç”±ã‚’完全ã«ç†è§£ã—ã¦ã„ã‚‹å ´åˆã‚’除ãã€ã‚¢ã‚¯ã‚»ã‚¹ã®è¨±å¯ã¯é¿ã‘ã¦ãã ã•ã„。 +ãã®ã‚ªãƒ–ジェクトãŒã‚¢ã‚«ã‚¦ãƒ³ãƒˆã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ã‚’è¦æ±‚ã™ã‚‹ç†ç”±ãŒã‚ˆãã‚ã‹ã‚‰ãªã„å ´åˆã¯ã€ã‚¢ã‚¯ã‚»ã‚¹ã‚’許å¯ã—ãªã„ã§ãã ã•ã„。 <form name="form"> <button name="Grant" text="トータルアクセスを許å¯"/> <button name="Deny" text="æ‹’å¦"/> @@ -3378,4 +3393,627 @@ M ã‚ーを押ã—ã¦å¤‰æ›´ã—ã¾ã™ã€‚ [NUM_ITEMS] 個ã®ã‚¢ã‚¤ãƒ†ãƒ を削除ä¸ã§ã™ã€‚続ã‘ã¾ã™ã‹ï¼Ÿ <usetemplate ignoretext="複数ã®ã‚¢ã‚¤ãƒ†ãƒ を削除ã—ã¾ã™ã‹ï¼Ÿ" name="okcancelignore" notext="ã„ã„ãˆ" yestext="ã¯ã„"/> </notification> + <notification name="AvatarFrozen"> + [AV_FREEZER] ã«ã‚ˆã£ã¦ã‚ãªãŸã¯ãƒ•ãƒªãƒ¼ã‚ºã•ã‚Œã¦ã„ã¾ã™ã€‚世界を動ã‹ã™ã“ã¨ã‚‚ã€ä¸–ç•Œã¨ã‚¤ãƒ³ã‚¿ãƒ©ã‚¯ã‚·ãƒ§ãƒ³ã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã›ã‚“。 + </notification> + <notification name="AvatarFrozenDuration"> + [AV_FREEZER] ã«ã‚ˆã£ã¦ã€ã‚ãªãŸã¯ [AV_FREEZE_TIME] 秒間フリーズã•ã‚Œã¾ã—ãŸã€‚世界を動ã‹ã™ã“ã¨ã‚‚ã€ä¸–ç•Œã¨ã‚¤ãƒ³ã‚¿ãƒ©ã‚¯ã‚·ãƒ§ãƒ³ã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã›ã‚“。 + </notification> + <notification name="YouFrozeAvatar"> + ã‚¢ãƒã‚¿ãƒ¼ãŒãƒ•ãƒªãƒ¼ã‚ºã•ã‚Œã¦ã„ã¾ã™ã€‚ + </notification> + <notification name="AvatarHasUnFrozenYou"> + [AV_FREEZER] ã«ã‚ˆã£ã¦ãƒ•ãƒªãƒ¼ã‚ºãŒè§£é™¤ã•ã‚Œã¦ã„ã¾ã™ã€‚ + </notification> + <notification name="AvatarUnFrozen"> + ã‚¢ãƒã‚¿ãƒ¼ã®ãƒ•ãƒªãƒ¼ã‚ºãŒè§£é™¤ã•ã‚Œã¾ã—ãŸã€‚ + </notification> + <notification name="AvatarFreezeFailure"> + ãã®åŒºç”»ã®ç®¡ç†æ¨©é™ã‚’æŒã£ã¦ã„ãªã„ãŸã‚ã€ãƒ•ãƒªãƒ¼ã‚ºã«å¤±æ•—ã—ã¾ã—ãŸã€‚ + </notification> + <notification name="AvatarFreezeThaw"> + フリーズ期間ãŒåˆ‡ã‚Œã¾ã—ãŸã€‚仕事ã«æˆ»ã£ã¦ãã ã•ã„。 + </notification> + <notification name="AvatarCantFreeze"> + 残念ãªãŒã‚‰ã€ãã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã‚’フリーズã§ãã¾ã›ã‚“。 + </notification> + <notification name="NowOwnObject"> + ã“ã‚Œã§ã€ã‚ªãƒ–ジェクト [OBJECT_NAME] ã®æ‰€æœ‰è€…ã«ãªã‚Šã¾ã—㟠+ </notification> + <notification name="CantRezOnLand"> + ã“ã®åœŸåœ°ã®æ‰€æœ‰è€…ãŒè¨±å¯ã—ã¦ã„ãªã„ãŸã‚ã€[OBJECT_POS] ã§ã‚ªãƒ–ジェクトを Rez ã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。土地ツールを使用ã—ã¦ã€åœŸåœ°ã®æ‰€æœ‰ã‚’確èªã—ã¦ãã ã•ã„。 + </notification> + <notification name="RezFailTooManyRequests"> + リクエストãŒå¤šã™ãŽã¦ã€ã‚ªãƒ–ジェクトを Rez ã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。 + </notification> + <notification name="SitFailCantMove"> + 今回移動ã§ããªã‹ã£ãŸãŸã‚ã€åº§ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。 + </notification> + <notification name="SitFailNotAllowedOnLand"> + ãã®åœŸåœ°ã«å¯¾ã—ã¦è¨±å¯ã‚’å—ã‘ã¦ã„ãªã„ãŸã‚ã€åº§ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。 + </notification> + <notification name="SitFailNotSameRegion"> + 移動ã—ã¦è¿‘ã¥ã‘ã¦ã¿ã¦ãã ã•ã„。オブジェクトãŒåŒã˜ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã«ãªã„ãŸã‚ã€ã‚ªãƒ–ジェクトをé…ç½®ã§ãã¾ã›ã‚“。 + </notification> + <notification name="NoNewObjectRegionFull"> + æ–°ã—ã„オブジェクトを作æˆã§ãã¾ã›ã‚“。リージョンãŒåŸ‹ã¾ã£ã¦ã„ã¾ã™ã€‚ + </notification> + <notification name="FailedToPlaceObject"> + 指定ã—ãŸå ´æ‰€ã«ã‚ªãƒ–ジェクトをé…ç½®ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚ã‚‚ã†ä¸€åº¦ãŠè©¦ã—ãã ã•ã„。 + </notification> + <notification name="NoOwnNoGardening"> + 所有ã—ã¦ã„ãªã„土地ã«æœ¨ã‚„è‰ã‚’æ¤ãˆã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。 + </notification> + <notification name="NoCopyPermsNoObject"> + オブジェクト '[OBJ_NAME]' をコピーã™ã‚‹æ¨©é™ãŒãªã„ãŸã‚ã€ã‚³ãƒ”ーã«å¤±æ•—ã—ã¾ã—ãŸã€‚ + </notification> + <notification name="NoTransPermsNoObject"> + オブジェクト '[OBJ_NAME]' ã‚’ã‚ãªãŸã«è»¢é€ã§ããªã„ãŸã‚ã€ã‚³ãƒ”ーã«å¤±æ•—ã—ã¾ã—ãŸã€‚ + </notification> + <notification name="AddToNavMeshNoCopy"> + オブジェクト '[OBJ_NAME]' ãŒãƒŠãƒ“メッシュã«è²¢çŒ®ã—ã¦ã„ã‚‹ãŸã‚ã€ã‚³ãƒ”ーã«å¤±æ•—ã—ã¾ã—ãŸã€‚ + </notification> + <notification name="DupeWithNoRootsSelected"> + ルートオブジェクトをé¸æŠžã›ãšã«è¤‡è£½ã—ã¾ã™ã€‚ + </notification> + <notification name="CantDupeCuzRegionIsFull"> + リージョンãŒåŸ‹ã¾ã£ã¦ã„ã‚‹ãŸã‚ã€ã‚ªãƒ–ジェクトã®ã‚³ãƒ”ーを作æˆã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。 + </notification> + <notification name="CantDupeCuzParcelNotFound"> + オブジェクトã®ã‚³ãƒ”ーを作æˆã§ãã¾ã›ã‚“。オブジェクトã®ã‚る区画ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。 + </notification> + <notification name="CantCreateCuzParcelFull"> + 区画ãŒã„ã£ã±ã„ã®ãŸã‚〠+オブジェクトを作æˆã§ãã¾ã›ã‚“。 + </notification> + <notification name="RezAttemptFailed"> + オブジェクトã¸ã® Rez ã®è©¦ã¿ã«å¤±æ•—ã—ã¾ã—ãŸã€‚ + </notification> + <notification name="ToxicInvRezAttemptFailed"> + ã“ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã§å•é¡Œã‚’引ãèµ·ã“ã™ã‚¢ã‚¤ãƒ†ãƒ ã¯ä½œæˆã§ãã¾ã›ã‚“。 + </notification> + <notification name="InvItemIsBlacklisted"> + ãã®æŒã¡ç‰©ã‚¢ã‚¤ãƒ†ãƒ ã¯ãƒ–ラックリストã«ç™»éŒ²ã•ã‚Œã¦ã„ã¾ã™ã€‚ + </notification> + <notification name="NoCanRezObjects"> + ç¾åœ¨ã‚ãªãŸã«ã¯ã‚ªãƒ–ジェクトを作æˆã™ã‚‹ãŸã‚ã®è¨±å¯ãŒã‚ã‚Šã¾ã›ã‚“。 + </notification> + <notification name="LandSearchBlocked"> + 土地ã®æ¤œç´¢ãŒãƒ–ãƒãƒƒã‚¯ã•ã‚Œã¾ã—ãŸã€‚ +çŸæœŸé–“ã«å¤šãã®åœŸåœ°ã‚’検索ã—ãŸãŸã‚ã§ã™ã€‚ +ã—ã°ã‚‰ãã—ã¦ã‹ã‚‰å†åº¦ãŠè©¦ã—ãã ã•ã„。 + </notification> + <notification name="NotEnoughResourcesToAttach"> + オブジェクトã®ç€ç”¨ã«ä½¿ç”¨ã§ãるスクリプトリソースãŒè¶³ã‚Šã¾ã›ã‚“。 + </notification> + <notification name="YouDiedAndGotTPHome"> + æ»ã‚“ã§ã—ã¾ã£ãŸã®ã§ã€ãƒ›ãƒ¼ãƒ ã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã•ã‚Œã¾ã—ãŸã€‚ + </notification> + <notification name="EjectComingSoon"> + ã“ã“ã¸ã®å…¥å ´ãŒè¨±å¯ã•ã‚Œã¦ã„ãªã„ãŸã‚ã€[EJECT_TIME] 秒後ã«è¿½æ”¾ã•ã‚Œã¾ã™ã€‚ + </notification> + <notification name="NoEnterServerFull"> + サーãƒãƒ¼ãŒåŸ‹ã¾ã£ã¦ã„ã‚‹ãŸã‚〠+ã“ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã«å…¥å ´ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。 + </notification> + <notification name="SaveBackToInvDisabled"> + 「「æŒã¡ç‰©ã€ã«ä¿å˜ã€ãŒç„¡åŠ¹ã«ãªã£ã¦ã„ã¾ã™ã€‚ + </notification> + <notification name="NoExistNoSaveToContents"> + '[OBJ_NAME]' ã® Rez å…ƒã§ã‚るオブジェクトãŒå˜åœ¨ã—ãªã„ãŸã‚ã€ã“ã®ã‚ªãƒ–ジェクトをオブジェクトコンテンツã«ä¿å˜ã§ãã¾ã›ã‚“。 + </notification> + <notification name="NoModNoSaveToContents"> + オブジェクト '[DEST_NAME]' ã‚’ä¿®æ£ã™ã‚‹æ¨©é™ãŒãªã„ãŸã‚ã€ã‚ªãƒ–ジェクトã®ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã« '[OBJ_NAME]' ã‚’ä¿å˜ã§ãã¾ã›ã‚“。 + </notification> + <notification name="NoSaveBackToInvDisabled"> + インベントリ㫠'[OBJ_NAME]' ã‚’ä¿å˜ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“ - ã“ã®æ“作ãŒç„¡åŠ¹ã«ãªã£ã¦ã„ã¾ã™ã€‚ + </notification> + <notification name="NoCopyNoSelCopy"> + オブジェクト '[OBJ_NAME]' を変更ã™ã‚‹æ¨©é™ã‚’æŒã£ã¦ã„ãªã„ãŸã‚ã€é¸æŠžã—ãŸã‚‚ã®ã‚’コピーã§ãã¾ã›ã‚“。 + </notification> + <notification name="NoTransNoSelCopy"> + オブジェクト '[OBJ_NAME]' を転é€ã§ããªã„ãŸã‚ã€é¸æŠžã—ãŸã‚‚ã®ã‚’コピーã§ãã¾ã›ã‚“。 + </notification> + <notification name="NoTransNoCopy"> + オブジェクト '[OBJ_NAME]' を転é€ã§ããªã„ãŸã‚ã€é¸æŠžã—ãŸã‚‚ã®ã‚’コピーã§ãã¾ã›ã‚“。 + </notification> + <notification name="NoPermsNoRemoval"> + シミュレータã‹ã‚‰ã®ã‚ªãƒ–ジェクト '[OBJ_NAME]' ã®å‰Šé™¤ã¯ã€æ¨©é™ã‚·ã‚¹ãƒ†ãƒ ã«ã‚ˆã£ã¦ç„¡åŠ¹ã«ã•ã‚Œã¦ã„ã¾ã™ã€‚ + </notification> + <notification name="NoModNoSaveSelection"> + オブジェクト '[OBJ_NAME]' を変更ã™ã‚‹æ¨©é™ã‚’æŒã£ã¦ã„ãªã„ãŸã‚ã€é¸æŠžã—ãŸã‚‚ã®ã‚’ä¿å˜ã§ãã¾ã›ã‚“。 + </notification> + <notification name="NoCopyNoSaveSelection"> + オブジェクト '[OBJ_NAME]' をコピーã§ããªã„ãŸã‚ã€é¸æŠžã—ãŸã‚‚ã®ã‚’ä¿å˜ã§ãã¾ã›ã‚“。 + </notification> + <notification name="NoModNoTaking"> + オブジェクト '[OBJ_NAME]' を変更ã™ã‚‹æ¨©é™ã‚’æŒã£ã¦ã„ãªã„ãŸã‚ã€é¸æŠžã—ãŸã‚‚ã®ã‚’å–å¾—ã§ãã¾ã›ã‚“。 + </notification> + <notification name="RezDestInternalError"> + 内部エラー: ä¸æ˜Žãªå®›å…ˆã‚¿ã‚¤ãƒ—。 + </notification> + <notification name="DeleteFailObjNotFound"> + オブジェクトãŒè¦‹ã¤ã‹ã‚‰ãªã„ãŸã‚削除ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚ + </notification> + <notification name="SorryCantEjectUser"> + 残念ãªãŒã‚‰ã€ãã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã‚’追放ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。 + </notification> + <notification name="RegionSezNotAHome"> + ã“ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã§ã¯ã€ã“ã“ã«ãƒ›ãƒ¼ãƒ ã®ä½ç½®ã‚’è¨å®šã§ãã¾ã›ã‚“。 + </notification> + <notification name="HomeLocationLimits"> + ホームã®å ´æ‰€ã‚’è¨å®šã§ãã‚‹ã®ã¯ã€è‡ªåˆ†ã®åœŸåœ°ã‹ã€ã¾ãŸã¯ãƒ¡ã‚¤ãƒ³ãƒ©ãƒ³ãƒ‰ã®ã‚¤ãƒ³ãƒ•ã‚©ãƒãƒ–ã§ã®ã¿ã§ã™ã€‚ + </notification> + <notification name="HomePositionSet"> + 家ã®é…ç½®ã®è¨å®šã€‚ + </notification> + <notification name="AvatarEjected"> + ã‚¢ãƒã‚¿ãƒ¼ãŒè¿½æ”¾ã•ã‚Œã¾ã—ãŸã€‚ + </notification> + <notification name="AvatarEjectFailed"> + ãã®åŒºç”»ã®ç®¡ç†æ¨©é™ãŒãªã„ãŸã‚ã€è¿½æ”¾ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚ + </notification> + <notification name="CantMoveObjectParcelFull"> + 区画ãŒåŸ‹ã¾ã£ã¦ã„ã‚‹ãŸã‚ã€ã‚ªãƒ–ジェクト '[OBJECT_NAME]' ã‚’ã€ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ [REGION_NAME] 内㮠[OBJ_POSITION] ã«ç§»å‹•ã§ãã¾ã›ã‚“。 + </notification> + <notification name="CantMoveObjectParcelPerms"> + オブジェクト '[OBJECT_NAME]' ã¯ã€ã“ã®åŒºç”»ã§è¨±å¯ã•ã‚Œã¦ã„ãªã„ãŸã‚ã€ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ [REGION_NAME] 内㮠[OBJ_POSITION] ã«ç§»å‹•ã§ãã¾ã›ã‚“。 + </notification> + <notification name="CantMoveObjectParcelResources"> + ã“ã®åŒºç”»ã§ã“ã®ã‚ªãƒ–ジェクトã®ãƒªã‚½ãƒ¼ã‚¹ãŒä¸è¶³ã—ã¦ã„ã‚‹ãŸã‚ã€ã‚ªãƒ–ジェクト '[OBJECT_NAME]' をリージョン [REGION_NAME] 内㮠[OBJ_POSITION] ã«ç§»å‹•ã§ãã¾ã›ã‚“。 + </notification> + <notification name="CantMoveObjectRegionVersion"> + オブジェクト '[OBJECT_NAME]' をリージョン [REGION_NAME] 内㮠[OBJ_POSITION] ã«ç§»å‹•ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。他ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã§ã¯ã€ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã®å¢ƒç•Œã‚’ã¾ãŸã„ã ã“ã®ã‚ªãƒ–ジェクトをå—ä¿¡ã™ã‚‹ã“ã¨ãŒã§ããªã„å¤ã„ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’実行ã—ã¦ã„ã‚‹ãŸã‚ã§ã™ã€‚ + </notification> + <notification name="CantMoveObjectNavMesh"> + リージョン境界をã¾ãŸãナビメッシュを変更ã§ããªã„ãŸã‚ã€ã‚ªãƒ–ジェクト '[OBJECT_NAME]' をリージョン [REGION_NAME] 内㮠[OBJ_POSITION] ã«ç§»å‹•ã§ãã¾ã›ã‚“。 + </notification> + <notification name="CantMoveObjectWTF"> + ä¸æ˜Žãªç†ç”±ã«ã‚ˆã‚Šã€ã‚ªãƒ–ジェクト '[OBJECT_NAME]' ã‚’ã€ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ [REGION_NAME] 内㮠[OBJ_POSITION] ã«ç§»å‹•ã§ãã¾ã›ã‚“。 +([FAILURE_TYPE]) + </notification> + <notification name="NoPermModifyObject"> + ãã®ã‚ªãƒ–ジェクトを変更ã™ã‚‹æ¨©é™ãŒã‚ã‚Šã¾ã›ã‚“ + </notification> + <notification name="CantEnablePhysObjContributesToNav"> + ナビメッシュã«è²¢çŒ®ã™ã‚‹ã‚ªãƒ–ジェクトã«å¯¾ã—ã¦ç‰©ç†ã‚’有効ã«ã§ãã¾ã›ã‚“。 + </notification> + <notification name="CantEnablePhysKeyframedObj"> + ã‚ーフレームオブジェクトã®ãŸã‚ã«ç‰©ç†ã‚’有効ã«ã§ãã¾ã›ã‚“。 + </notification> + <notification name="CantEnablePhysNotEnoughLandResources"> + 土地ã®ãƒªã‚½ãƒ¼ã‚¹ãŒè¶³ã‚Šãªã„ãŸã‚ã€ã‚ªãƒ–ジェクトã®ç‰©ç†ã‚’有効ã«ã§ãã¾ã›ã‚“。 + </notification> + <notification name="CantEnablePhysCostTooGreat"> + [MAX_OBJECTS] より大ãã„物ç†ãƒªã‚½ãƒ¼ã‚¹ã‚³ã‚¹ãƒˆã‚’æŒã¤ã‚ªãƒ–ジェクトã§ã¯ã€ç‰©ç†ã‚’有効ã«ã§ãã¾ã›ã‚“。 + </notification> + <notification name="PhantomWithConcavePiece"> + ã“ã®ã‚ªãƒ–ジェクトã¯ãƒ•ã‚¡ãƒ³ãƒˆãƒ ã§ã€ãƒŠãƒ“メッシュã«è²¢çŒ®ã—ã¦ã„ã‚‹ãŸã‚ã€ãã¼ã¿ã‚’æŒãŸã›ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。 + </notification> + <notification name="UnableAddItem"> + ã‚¢ã‚¤ãƒ†ãƒ ã‚’è¿½åŠ ã§ãã¾ã›ã‚“! + </notification> + <notification name="UnableEditItem"> + ã“ã‚Œã¯ç·¨é›†ã§ãã¾ã›ã‚“! + </notification> + <notification name="NoPermToEdit"> + ã“れを編集ã™ã‚‹è¨±å¯ãŒã‚ã‚Šã¾ã›ã‚“。 + </notification> + <notification name="NoPermToCopyInventory"> + ãã®ã‚¤ãƒ³ãƒ™ãƒ³ãƒˆãƒªã‚’コピーã™ã‚‹ã“ã¨ã¯è¨±å¯ã•ã‚Œã¾ã›ã‚“。 + </notification> + <notification name="CantSaveItemDoesntExist"> + オブジェクトã®ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã«ä¿å˜ã§ãã¾ã›ã‚“。アイテムãŒå˜åœ¨ã—ã¦ã„ã¾ã›ã‚“。 + </notification> + <notification name="CantSaveItemAlreadyExists"> + オブジェクトã®ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã«ä¿å˜ã§ãã¾ã›ã‚“。åŒã˜åå‰ã‚’æŒã¤ã‚¢ã‚¤ãƒ†ãƒ ãŒã™ã§ã«ã‚¤ãƒ³ãƒ™ãƒ³ãƒˆãƒªã«å˜åœ¨ã—ã¾ã™ã€‚ + </notification> + <notification name="CantSaveModifyAttachment"> + オブジェクトã®ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã«ä¿å˜ã§ãã¾ã›ã‚“。ã“ã®ãŸã‚ã€ã‚¢ã‚¿ãƒƒãƒãƒ¡ãƒ³ãƒˆã®æ¨©é™ãŒå¤‰æ›´ã•ã‚Œã¾ã™ã€‚ + </notification> + <notification name="TooManyScripts"> + スクリプトãŒå¤šã™ãŽã¾ã™ã€‚ + </notification> + <notification name="UnableAddScript"> + テã‚ã‚¹ãƒˆã‚’è¿½åŠ ã§ãã¾ã›ã‚“! + </notification> + <notification name="AssetServerTimeoutObjReturn"> + 資産サーãƒãƒ¼ãŒã‚¿ã‚¤ãƒ リーã«å¿œç”ã—ã¾ã›ã‚“ã§ã—ãŸã€‚オブジェクト㌠sim ã«è¿”ã•ã‚Œã¾ã—ãŸã€‚ + </notification> + <notification name="RegionDisablePhysicsShapes"> + ã“ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã§ã¯ã€ç‰©ç†çš„シェイプãŒæœ‰åŠ¹ã«ã•ã‚Œã¦ã„ã¾ã›ã‚“。 + </notification> + <notification name="NoModNavmeshAcrossRegions"> + リージョンã®å¢ƒç•Œã‚’ã¾ãŸãナビメッシュã¯å¤‰æ›´ã§ãã¾ã›ã‚“。 + </notification> + <notification name="NoSetPhysicsPropertiesOnObjectType"> + ãã®ã‚ªãƒ–ジェクトタイプã®ç‰©ç†çš„プãƒãƒ‘ティをè¨å®šã§ãã¾ã›ã‚“。 + </notification> + <notification name="NoSetRootPrimWithNoShape"> + ルートプリムをè¨å®šã§ããªã„ãŸã‚ã€ã‚·ã‚§ã‚¤ãƒ—ãŒã‚ã‚Šã¾ã›ã‚“。 + </notification> + <notification name="NoRegionSupportPhysMats"> + ã“ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã§ã¯ã€ç‰©ç†çš„ç´ æãŒæœ‰åŠ¹ã«ã•ã‚Œã¦ã„ã¾ã›ã‚“。 + </notification> + <notification name="OnlyRootPrimPhysMats"> + 物ç†çš„ç´ æを調整ã§ãã‚‹ã®ã¯ã€ãƒ«ãƒ¼ãƒˆãƒ—リムã ã‘ã§ã™ã€‚ + </notification> + <notification name="NoSupportCharacterPhysMats"> + ã‚ャラクターã¸ã®ç‰©ç†çš„ç´ æã®è¨å®šã¯ã¾ã サãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ã¾ã›ã‚“。 + </notification> + <notification name="InvalidPhysMatProperty"> + 指定ã—ãŸç‰©ç†çš„ç´ æã®ãƒ—ãƒãƒ‘ティ㌠1 ã¤ä»¥ä¸Šç„¡åŠ¹ã§ã™ã€‚ + </notification> + <notification name="NoPermsAlterStitchingMeshObj"> + メッシュオブジェクトã®ç¸«ã„ç›®ã®ã‚¿ã‚¤ãƒ—を変更ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。 + </notification> + <notification name="NoPermsAlterShapeMeshObj"> + メッシュオブジェクトã®å½¢çŠ¶ã‚’変更ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“ + </notification> + <notification name="FullRegionCantEnter"> + リージョンãŒåŸ‹ã¾ã£ã¦ã„ã‚‹ãŸã‚ã€\nã“ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã«å…¥å ´ã§ãã¾ã›ã‚“。 + </notification> + <notification name="LinkFailedOwnersDiffer"> + リンクエラー -- 所有者ãŒé•ã„ã¾ã™ + </notification> + <notification name="LinkFailedNoModNavmeshAcrossRegions"> + リンクエラー -- リージョンã®å¢ƒç•Œã‚’ã¾ãŸãナビメッシュã¯å¤‰æ›´ã§ãã¾ã›ã‚“。 + </notification> + <notification name="LinkFailedNoPermToEdit"> + リンクエラー -- 編集権é™ãŒã‚ã‚Šã¾ã›ã‚“。 + </notification> + <notification name="LinkFailedTooManyPrims"> + リンクエラー -- プリミティブãŒå¤šã™ãŽã¾ã™ã€‚ + </notification> + <notification name="LinkFailedCantLinkNoCopyNoTrans"> + リンクエラー -- コピーãªã—ã¨è»¢é€ãªã—をリンクã§ãã¾ã›ã‚“。 + </notification> + <notification name="LinkFailedNothingLinkable"> + リンクエラー -- リンクã§ãã‚‹ã‚‚ã®ãŒã‚ã‚Šã¾ã›ã‚“。 + </notification> + <notification name="LinkFailedTooManyPathfindingChars"> + リンクエラー -- パスファインディングã®æ–‡å—æ•°ãŒå¤šã™ãŽã¾ã™ + </notification> + <notification name="LinkFailedInsufficientLand"> + リンクエラー -- 土地ã®ãƒªã‚½ãƒ¼ã‚¹ãŒè¶³ã‚Šã¾ã›ã‚“ + </notification> + <notification name="LinkFailedTooMuchPhysics"> + オブジェクトãŒä½¿ç”¨ã—ã¦ã„る物ç†ãƒªã‚½ãƒ¼ã‚¹ãŒå¤šã™ãŽãŸãŸã‚ã€ãƒ€ã‚¤ãƒŠãƒŸãƒƒã‚¯ã‚¹ãŒç„¡åŠ¹ã«ã•ã‚Œã¾ã—ãŸã€‚ + </notification> + <notification name="TeleportedHomeByObjectOnParcel"> + 区画 '[PARCEL_NAME]' ã®ã‚ªãƒ–ジェクト '[OBJECT_NAME]' ã«ã‚ˆã£ã¦ã€ã‚ãªãŸã¯ãƒ›ãƒ¼ãƒ ã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã•ã‚Œã¾ã—ãŸã€‚ + </notification> + <notification name="TeleportedHomeByObject"> + ​オブジェクト ​'[OBJECT_NAME]' ã«ã‚ˆã£ã¦ã€ã‚ãªãŸã¯ãƒ›ãƒ¼ãƒ ã¸ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ã¾ã™ã€‚ + </notification> + <notification name="TeleportedByAttachment"> + [ITEM_ID] ã¸ã®ã‚¢ã‚¿ãƒƒãƒãƒ¡ãƒ³ãƒˆã«ã‚ˆã£ã¦ã€ã‚ãªãŸã¯ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ã¾ã™ã€‚ + </notification> + <notification name="TeleportedByObjectOnParcel"> + 区画 '[PARCEL_NAME]' ã®ã‚ªãƒ–ジェクト '[OBJECT_NAME]' ã«ã‚ˆã£ã¦ã€ã‚ãªãŸã¯ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ã¾ã™ã€‚ + </notification> + <notification name="TeleportedByObjectOwnedBy"> + [OWNER_ID] ãŒæ‰€æœ‰ã—ã¦ã„るオブジェクト '[OBJECT_NAME]' ã«ã‚ˆã£ã¦ã€ã‚ãªãŸã¯ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ã¾ã™ã€‚ + </notification> + <notification name="TeleportedByObjectUnknownUser"> + ä¸æ˜Žãªãƒ¦ãƒ¼ã‚¶ãƒ¼ãŒæ‰€æœ‰ã—ã¦ã„るオブジェクト '[OBJECT_NAME]' ã«ã‚ˆã£ã¦ã€ã‚ãªãŸã¯ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ã¾ã™ã€‚ + </notification> + <notification name="CantCreateObjectRegionFull"> + リクエストã•ã‚ŒãŸã‚ªãƒ–ジェクトを作æˆã§ãã¾ã›ã‚“。リージョンãŒåŸ‹ã¾ã£ã¦ã„ã¾ã™ã€‚ + </notification> + <notification name="CantAttackMultipleObjOneSpot"> + 1 ã¤ã®å ´æ‰€ã«è¤‡æ•°ã®ã‚ªãƒ–ジェクトをç€ç”¨ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。 + </notification> + <notification name="CantCreateMultipleObjAtLoc"> + ã“ã“ã§ã¯ã€è¤‡æ•°ã®ã‚ªãƒ–ジェクトを作æˆã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。 + </notification> + <notification name="UnableToCreateObjTimeOut"> + リクエストã•ã‚ŒãŸã‚ªãƒ–ジェクトを作æˆã§ãã¾ã›ã‚“。オブジェクトãŒãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã«è¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。 + </notification> + <notification name="UnableToCreateObjUnknown"> + リクエストã•ã‚ŒãŸã‚ªãƒ–ジェクトを作æˆã§ãã¾ã›ã‚“。リクエストãŒã‚¿ã‚¤ãƒ アウトã«ãªã‚Šã¾ã—ãŸã€‚ã‚‚ã†ä¸€åº¦ãŠè©¦ã—ãã ã•ã„。 + </notification> + <notification name="UnableToCreateObjMissingFromDB"> + è¦æ±‚ã•ã‚ŒãŸã‚ªãƒ–ジェクトを作æˆã§ãã¾ã›ã‚“。もã†ä¸€åº¦ãŠè©¦ã—ãã ã•ã„。 + </notification> + <notification name="RezFailureTookTooLong"> + リクエストã•ã‚ŒãŸã‚ªãƒ–ジェクトã®ãƒãƒ¼ãƒ‰ã«æ™‚é–“ãŒã‹ã‹ã‚Šã™ãŽãŸãŸã‚ã€Rez ã«å¤±æ•—ã—ã¾ã—ãŸã€‚ + </notification> + <notification name="FailedToPlaceObjAtLoc"> + 指定ã—ãŸå ´æ‰€ã«ã‚ªãƒ–ジェクトをé…ç½®ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚ã‚‚ã†ä¸€åº¦ãŠè©¦ã—ãã ã•ã„。 + </notification> + <notification name="CantCreatePlantsOnLand"> + ã“ã®åœŸåœ°ã«æœ¨ã‚’æ¤ãˆã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。 + </notification> + <notification name="CantRestoreObjectNoWorldPos"> + オブジェクトをリストアã§ãã¾ã›ã‚“。ワールドã®ä½ç½®ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。 + </notification> + <notification name="CantRezObjectInvalidMeshData"> + メッシュデータãŒç„¡åŠ¹ãªãŸã‚ã€ã‚ªãƒ–ジェクトを Rez ã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。 + </notification> + <notification name="CantRezObjectTooManyScripts"> + ã“ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã«æ—¢ã«å¤šãã®ã‚¹ã‚¯ãƒªãƒ—トãŒå˜åœ¨ã™ã‚‹ãŸã‚ã€ã‚ªãƒ–ジェクトを Rez ã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。 + </notification> + <notification name="CantCreateObjectNoAccess"> + ç¾åœ¨ã®ã‚¢ã‚¯ã‚»ã‚¹æ¨©é™ã§ã¯ã€ãã“ã«ã‚ªãƒ–ジェクトを作æˆã§ãã¾ã›ã‚“。 + </notification> + <notification name="CantCreateObject"> + ç¾åœ¨ã‚ãªãŸã«ã¯ã‚ªãƒ–ジェクト作æˆã™ã‚‹è¨±å¯ãŒã‚ã‚Šã¾ã›ã‚“。 + </notification> + <notification name="InvalidObjectParams"> + 無効ãªã‚ªãƒ–ジェクトパラメーター + </notification> + <notification name="CantDuplicateObjectNoAcess"> + ç¾åœ¨ã®ã‚¢ã‚¯ã‚»ã‚¹æ¨©é™ã§ã¯ã€ã“ã“ã«ã‚ªãƒ–ジェクトã®ã‚³ãƒ”ーを作æˆã§ãã¾ã›ã‚“。 + </notification> + <notification name="CantChangeShape"> + ã‚ãªãŸã«ã¯ã“ã®ã‚·ã‚§ã‚¤ãƒ—を変更ã™ã‚‹è¨±å¯ãŒã‚ã‚Šã¾ã›ã‚“。 + </notification> + <notification name="NoAccessToClaimObjects"> + ç¾åœ¨ã®ã‚¢ã‚¯ã‚»ã‚¹æ¨©é™ã§ã¯ã€ã“ã“ã«ã‚ªãƒ–ジェクトをå–å¾—ã§ãã¾ã›ã‚“。 + </notification> + <notification name="DeedFailedNoPermToDeedForGroup"> + ã‚ãªãŸã®ã‚°ãƒ«ãƒ¼ãƒ—ã«ã‚ªãƒ–ジェクトをè²æ¸¡ã™ã‚‹æ¨©é™ãŒãªã„ãŸã‚ã€è²æ¸¡ã«å¤±æ•—ã—ã¾ã—ãŸã€‚ + </notification> + <notification name="NoPrivsToBuyObject"> + ç¾åœ¨ã®ã‚¢ã‚¯ã‚»ã‚¹æ¨©é™ã§ã¯ã€ã“ã“ã§ã‚ªãƒ–ジェクトを購入ã§ãã¾ã›ã‚“。 + </notification> + <notification name="CantAttachObjectAvatarSittingOnIt"> + ã‚¢ãƒã‚¿ãƒ¼ãŒã‚ªãƒ–ジェクトã«å˜åœ¨ã™ã‚‹ãŸã‚ã€ã‚ªãƒ–ジェクトをç€ç”¨ã§ãã¾ã›ã‚“。 + </notification> + <notification name="WhyAreYouTryingToWearShrubbery"> + 木やè‰ã‚’アタッãƒãƒ¡ãƒ³ãƒˆã¨ã—ã¦ç€ç”¨ã§ãã¾ã›ã‚“。 + </notification> + <notification name="CantAttachGroupOwnedObjs"> + グループãŒæ‰€æœ‰ã—ã¦ã„るオブジェクトã¯ç€ç”¨ã§ãã¾ã›ã‚“。 + </notification> + <notification name="CantAttachObjectsNotOwned"> + 所有ã—ã¦ã„ãªã„オブジェクトã¯ç€ç”¨ã§ãã¾ã›ã‚“。 + </notification> + <notification name="CantAttachNavmeshObjects"> + ナビメッシュã«è²¢çŒ®ã—ã¦ã„るオブジェクトã¯ç€ç”¨ã§ãã¾ã›ã‚“。 + </notification> + <notification name="CantAttachObjectNoMovePermissions"> + ã‚ãªãŸã«ã¯ã‚ªãƒ–ジェクトを移動ã™ã‚‹æ¨©é™ãŒãªã„ãŸã‚ã€ãã®ã‚ªãƒ–ジェクト添付ã§ãã¾ã›ã‚“。 + </notification> + <notification name="CantAttachNotEnoughScriptResources"> + オブジェクトã®ç€ç”¨ã«ä½¿ç”¨ã§ãるスクリプトリソースãŒè¶³ã‚Šã¾ã›ã‚“。 + </notification> + <notification name="CantDropItemTrialUser"> + オブジェクトをã“ã“ã«ãƒ‰ãƒãƒƒãƒ—ã§ãã¾ã›ã‚“ã€‚ãƒ•ãƒªãƒ¼ãƒˆãƒ©ã‚¤ã‚¢ãƒ«é ˜åŸŸã‚’ãŠè©¦ã—ãã ã•ã„。 + </notification> + <notification name="CantDropMeshAttachment"> + メッシュアタッãƒãƒ¡ãƒ³ãƒˆã‚’ドãƒãƒƒãƒ—ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。インベントリã‹ã‚‰åˆ‡ã‚Šé›¢ã—ã¦ã€ãƒ¯ãƒ¼ãƒ«ãƒ‰ã§ Rez ã—ã¦ãã ã•ã„。 + </notification> + <notification name="CantDropAttachmentNoPermission"> + アタッãƒãƒ¡ãƒ³ãƒˆã®ãƒ‰ãƒãƒƒãƒ—ã«å¤±æ•—ã—ã¾ã—ãŸã€‚ãã“ã¸ãƒ‰ãƒãƒƒãƒ—ã™ã‚‹æ¨©é™ãŒã‚ã‚Šã¾ã›ã‚“。 + </notification> + <notification name="CantDropAttachmentInsufficientLandResources"> + アタッãƒãƒ¡ãƒ³ãƒˆã®ãƒ‰ãƒãƒƒãƒ—ã«å¤±æ•—ã—ã¾ã—ãŸã€‚利用ã§ãる土地リソースã®æ•°ãŒè¶³ã‚Šã¾ã›ã‚“。 + </notification> + <notification name="CantDropAttachmentInsufficientResources"> + 利用ã§ãるリソースãŒè¶³ã‚Šãªã„ãŸã‚ã€ã‚¢ã‚¿ãƒƒãƒãƒ¡ãƒ³ãƒˆã®ãƒ‰ãƒãƒƒãƒ—ã«å¤±æ•—ã—ã¾ã—ãŸã€‚ + </notification> + <notification name="CantDropObjectFullParcel"> + ã“ã“ã«ã‚ªãƒ–ジェクトをドãƒãƒƒãƒ—ã§ãã¾ã›ã‚“。区画ãŒåŸ‹ã¾ã£ã¦ã„ã¾ã™ã€‚ + </notification> + <notification name="CantTouchObjectBannedFromParcel"> + 土地区画ã«å…¥å ´ã™ã‚‹ã“ã¨ã‚’ç¦æ¢ã•ã‚Œã¦ã„ã‚‹ãŸã‚ã€ã“ã®ã‚ªãƒ–ジェクトを触ã£ãŸã‚Šã€ã¤ã‹ã‚€ã“ã¨ãŒã§ãã¾ã›ã‚“。 + </notification> + <notification name="PlzNarrowDeleteParams"> + 削除パラメーターを絞ã£ã¦ãã ã•ã„。 + </notification> + <notification name="UnableToUploadAsset"> + 資産をアップãƒãƒ¼ãƒ‰ã§ãã¾ã›ã‚“。 + </notification> + <notification name="CantTeleportCouldNotFindUser"> + ホームをテレãƒãƒ¼ãƒˆã™ã‚‹ãƒ¦ãƒ¼ã‚¶ãƒ¼ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚ + </notification> + <notification name="GodlikeRequestFailed"> + éŽå‰°ãªãƒªã‚¯ã‚¨ã‚¹ãƒˆãŒå¤±æ•—ã—ã¾ã—㟠+ </notification> + <notification name="GenericRequestFailed"> + 一般的ãªãƒªã‚¯ã‚¨ã‚¹ãƒˆã«å¤±æ•—ã—ã¾ã—㟠+ </notification> + <notification name="CantUploadPostcard"> + ãƒã‚¹ãƒˆã‚«ãƒ¼ãƒ‰ã‚’アップãƒãƒ¼ãƒ‰ã§ãã¾ã›ã‚“。後ã§ã‚‚ã†ä¸€åº¦ãŠè©¦ã—ãã ã•ã„。 + </notification> + <notification name="CantFetchInventoryForGroupNotice"> + グループ通知ã®ã‚¤ãƒ³ãƒ™ãƒ³ãƒˆãƒªã®è©³ç´°ã‚’å–å¾—ã§ãã¾ã›ã‚“。 + </notification> + <notification name="CantSendGroupNoticeNotPermitted"> + グループ通知ã®é€ä¿¡ãŒè¨±å¯ã•ã‚Œãªã„ãŸã‚ã€é€ä¿¡ã§ãã¾ã›ã‚“。 + </notification> + <notification name="CantSendGroupNoticeCantConstructInventory"> + グループ通知をé€ä¿¡ã§ãã¾ã›ã‚“。æŒã¡ç‰©ã‚’作æˆã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã›ã‚“。 + </notification> + <notification name="CantParceInventoryInNotice"> + 通知内ã®æŒã¡ç‰©ã‚’検出ã§ãã¾ã›ã‚“。 + </notification> + <notification name="TerrainUploadFailed"> + 地形ã®ã‚¢ãƒƒãƒ—ãƒãƒ¼ãƒ‰ã«å¤±æ•—ã—ã¾ã—ãŸã€‚ + </notification> + <notification name="TerrainFileWritten"> + 地形ファイルãŒæ›¸ãè¾¼ã¾ã‚Œã¾ã—ãŸã€‚ + </notification> + <notification name="TerrainFileWrittenStartingDownload"> + 地形ファイルを書ã出ã—ã€ãƒ€ã‚¦ãƒ³ãƒãƒ¼ãƒ‰ã‚’開始ã—ã¦ã„ã¾ã™... + </notification> + <notification name="TerrainBaked"> + 地形ãŒãƒ™ãƒ¼ã‚¯ã•ã‚Œã¾ã—ãŸã€‚ + </notification> + <notification name="TenObjectsDisabledPlzRefresh"> + é¸æŠžã•ã‚ŒãŸæœ€åˆã® 10 個ã®ã‚ªãƒ–ジェクトã®ã¿ãŒç„¡åŠ¹ã«ã•ã‚Œã¾ã—ãŸã€‚å¿…è¦ã«å¿œã˜ã¦ã€ãƒªãƒ•ãƒ¬ãƒƒã‚·ãƒ¥ã—ã¦é¸æŠžå†…å®¹ã‚’è¿½åŠ ã—ã¦ãã ã•ã„。 + </notification> + <notification name="UpdateViewerBuyParcel"> + ã“ã®åŒºç”»ã‚’購入ã™ã‚‹ã«ã¯ã€ãƒ“ューワをアップデートã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ + </notification> + <notification name="CantBuyParcelNotForSale"> + 購入ã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。ã“ã®åŒºç”»ã¯è²©å£²å¯¾è±¡ã§ã¯ã‚ã‚Šã¾ã›ã‚“。 + </notification> + <notification name="CantBuySalePriceOrLandAreaChanged"> + è²©å£²ä¾¡æ ¼ã¾ãŸã¯åœŸåœ°ã®é¢ç©ãŒå¤‰ã‚ã£ãŸãŸã‚ã€è³¼å…¥ã§ãã¾ã›ã‚“。 + </notification> + <notification name="CantBuyParcelNotAuthorized"> + ã‚ãªãŸã¯ã“ã®åŒºç”»ã®å§”ä»»ã•ã‚ŒãŸè²·ã„手ã§ã¯ã‚ã‚Šã¾ã›ã‚“。 + </notification> + <notification name="CantBuyParcelAwaitingPurchaseAuth"> + ã™ã§ã«è³¼å…¥ã®èªè¨¼ã‚’å¾…æ©Ÿã—ã¦ã„ã‚‹ãŸã‚ã€ã“ã®åŒºç”»ã‚’購入ã§ãã¾ã›ã‚“。 + </notification> + <notification name="CantBuildOverflowParcel"> + 区画をオーãƒãƒ¼ãƒ•ãƒãƒ¼ã™ã‚‹ãŸã‚ã€ã“ã“ã§ã‚ªãƒ–ジェクトを構築ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。 + </notification> + <notification name="SelectedMultipleOwnedLand"> + 所有者ã®é•ã†åœŸåœ°ã‚’é¸ã³ã¾ã—ãŸã€‚é¸æŠžã™ã‚‹é¢ç©ã‚’å°ã•ãã—ã¦ã€ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„。 + </notification> + <notification name="CantJoinTooFewLeasedParcels"> + é¸æŠžç¯„囲ã®ãƒªãƒ¼ã‚¹åŒºç”»ã®æ•°ãŒå°‘ãªã„ãŸã‚ã€å‚åŠ ã§ãã¾ã›ã‚“。 + </notification> + <notification name="CantDivideLandMultipleParcelsSelected"> + 土地を分割ã§ãã¾ã›ã‚“。\n区画ãŒè¤‡æ•°é¸æŠžã•ã‚Œã¦ã„ã¾ã™ã€‚\nã‚‚ã£ã¨å°ã•ã„土地をé¸æŠžã—ã¦ã¿ã¦ãã ã•ã„。 + </notification> + <notification name="CantDivideLandCantFindParcel"> + 土地を分解ã§ãã¾ã›ã‚“。\n区画ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。\n「Helpã€>「Reprt Bug...ã€ã§ãƒ¬ãƒãƒ¼ãƒˆã‚’è¡Œã£ã¦ãã ã•ã„。 + </notification> + <notification name="CantDivideLandWholeParcelSelected"> + 土地を分割ã§ãã¾ã›ã‚“。区画全体をé¸æŠžã—ã¾ã™ã€‚\nå°ã•ã„土地をé¸æŠžã—ã¦ã¿ã¦ãã ã•ã„。 + </notification> + <notification name="LandHasBeenDivided"> + 土地ãŒåˆ†å‰²ã•ã‚Œã¦ã„ã¾ã™ã€‚ + </notification> + <notification name="PassPurchased"> + å…¥å ´è¨±å¯ã‚’購入ã—ã¾ã—ãŸã€‚ + </notification> + <notification name="RegionDisallowsClassifieds"> + リージョンã§ã¯ã€ã‚¯ãƒ©ã‚·ãƒ•ã‚¡ã‚¤ãƒ‰åºƒå‘Šã‚’許å¯ã—ã¾ã›ã‚“。 + </notification> + <notification name="LandPassExpireSoon"> + ã“ã®åœŸåœ°ã¸ã®å…¥å ´è¨±å¯ã¯ã¾ã‚‚ãªã期é™ãŒåˆ‡ã‚Œã¾ã™ã€‚ + </notification> + <notification name="CantSitNoSuitableSurface"> + é…ç½®ã«é©ã—ãŸè¡¨é¢ãŒã‚ã‚Šã¾ã›ã‚“。別ã®å ´æ‰€ã‚’試ã—ã¦ã¿ãŸãã ã•ã„。 + </notification> + <notification name="CantSitNoRoom"> + ã“ã“ã«ã¯åº§ã‚‹ä½™åœ°ãŒã‚ã‚Šã¾ã›ã‚“。他ã®å ´æ‰€ã‚’試ã—ã¦ãã ã•ã„。 + </notification> + <notification name="ClaimObjectFailedNoPermission"> + 権é™ãŒãªã„ãŸã‚ã€ã‚ªãƒ–ジェクトをå–å¾—ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚ + </notification> + <notification name="ClaimObjectFailedNoMoney"> + リンデンドルãŒè¶³ã‚Šãªã„ãŸã‚ã€ã‚ªãƒ–ジェクトã®å–å¾—ã«å¤±æ•—ã—ã¾ã—ãŸã€‚ + </notification> + <notification name="CantDeedGroupLand"> + グループ所有ã®åœŸåœ°ã¯ã€è²æ¸¡ã§ãã¾ã›ã‚“。 + </notification> + <notification name="BuyObjectFailedNoMoney"> + リンデンドルãŒè¶³ã‚Šãªã„ãŸã‚ã€ã‚ªãƒ–ジェクトã®è³¼å…¥ã«å¤±æ•—ã—ã¾ã—ãŸã€‚ + </notification> + <notification name="BuyInventoryFailedNoMoney"> + リンデンドルãŒä¸è¶³ã—ã¦ã„ã‚‹ãŸã‚ã€ã‚¤ãƒ³ãƒ™ãƒ³ãƒˆãƒªã‚’購入ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚ + </notification> + <notification name="BuyPassFailedNoMoney"> + リンデンドルãŒè¶³ã‚Šãªã„ãŸã‚ã€ã“ã®åœŸåœ°ã¸ã®å…¥å ´è¨±å¯ã‚’購入ã§ãã¾ã›ã‚“。 + </notification> + <notification name="CantBuyPassTryAgain"> + 今ã™ãã«ã¯å…¥å ´è¨±å¯ã‚’購入ã§ãã¾ã›ã‚“。後ã§ã‚‚ã†ä¸€åº¦ãŠè©¦ã—ãã ã•ã„。 + </notification> + <notification name="CantCreateObjectParcelFull"> + 区画ãŒåŸ‹ã¾ã£ã¦ã„ã‚‹ãŸã‚ã€ã‚ªãƒ–ジェクトを\n作æˆã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。 + </notification> + <notification name="FailedPlacingObject"> + 指定ã—ãŸå ´æ‰€ã«ã‚ªãƒ–ジェクトをé…ç½®ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚ã‚‚ã†ä¸€åº¦ãŠè©¦ã—ãã ã•ã„。 + </notification> + <notification name="CantCreateLandmarkForEvent"> + イベントã®ãŸã‚ã®ãƒ©ãƒ³ãƒ‰ãƒžãƒ¼ã‚¯ã‚’作æˆã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。 + </notification> + <notification name="GodBeatsFreeze"> + 強力ãªåŠ›ã§ãƒ•ãƒªãƒ¼ã‚ºã‚’解除ã—ã¾ã™ã€‚ + </notification> + <notification name="SpecialPowersRequestFailedLogged"> + 特殊ãªæ¨©é™ã®ãƒªã‚¯ã‚¨ã‚¹ãƒˆã«å¤±æ•—ã—ã¾ã—ãŸã€‚ã“ã®ãƒªã‚¯ã‚¨ã‚¹ãƒˆã¯ãƒã‚°ã«è¨˜éŒ²ã•ã‚Œã¦ã„ã¾ã™ã€‚ + </notification> + <notification name="ExpireExplanation"> + システムã¯ã€ç¾åœ¨ã‚ãªãŸã®ãƒªã‚¯ã‚¨ã‚¹ãƒˆã‚’処ç†ã§ãã¾ã›ã‚“。リクエストãŒã‚¿ã‚¤ãƒ アウトã«ãªã‚Šã¾ã—ãŸã€‚ + </notification> + <notification name="DieExplanation"> + システムã¯ã€ã‚ãªãŸã®ãƒªã‚¯ã‚¨ã‚¹ãƒˆã‚’処ç†ã§ãã¾ã›ã‚“。 + </notification> + <notification name="AddPrimitiveFailure"> + プリミティブ広告を出ã™ã«ã¯ã€è³‡é‡‘ãŒè¶³ã‚Šã¾ã›ã‚“。 + </notification> + <notification name="RezObjectFailure"> + 資金ãŒè¶³ã‚Šãªã„ãŸã‚ã€ã‚ªãƒ–ジェクトを作æˆã§ãã¾ã›ã‚“。 + </notification> + <notification name="ResetHomePositionNotLegal"> + ホームãŒä¸æ£ãªãŸã‚ã€ãƒ›ãƒ¼ãƒ ã®ä½ç½®ã‚’リセットã—ã¾ã™ã€‚ + </notification> + <notification name="CantInviteRegionFull"> + リージョンãŒåŸ‹ã¾ã£ã¦ã„ã‚‹ãŸã‚ã€ç¾åœ¨ã®å ´æ‰€ã«èª°ã‹ã‚’招待ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。後ã§ã‚‚ã†ä¸€åº¦ãŠè©¦ã—ãã ã•ã„。 + </notification> + <notification name="CantSetHomeAtRegion"> + ã“ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã§ã¯ã€ã“ã“ã«ãƒ›ãƒ¼ãƒ ã®ä½ç½®ã‚’è¨å®šã§ãã¾ã›ã‚“。 + </notification> + <notification name="ListValidHomeLocations"> + ホームã®å ´æ‰€ã‚’è¨å®šã§ãã‚‹ã®ã¯ã€è‡ªåˆ†ã®åœŸåœ°ã‹ã€ã¾ãŸã¯ãƒ¡ã‚¤ãƒ³ãƒ©ãƒ³ãƒ‰ã®ã‚¤ãƒ³ãƒ•ã‚©ãƒãƒ–ã§ã®ã¿ã§ã™ã€‚ + </notification> + <notification name="SetHomePosition"> + 家ã®é…ç½®ã®è¨å®šã€‚ + </notification> + <notification name="CantDerezInventoryError"> + インベントリエラーã®ãŸã‚ã€ã‚ªãƒ–ジェクト㮠Rez 解除ãŒã§ãã¾ã›ã‚“。 + </notification> + <notification name="CantCreateRequestedInv"> + リクエストã•ã‚ŒãŸã‚¤ãƒ³ãƒ™ãƒ³ãƒˆãƒªã‚’作æˆã§ãã¾ã›ã‚“。 + </notification> + <notification name="CantCreateRequestedInvFolder"> + リクエストã•ã‚ŒãŸæŒã¡ç‰©ãƒ•ã‚©ãƒ«ãƒ€ãƒ¼ã‚’作æˆã§ãã¾ã›ã‚“。 + </notification> + <notification name="CantCreateInventory"> + ãã®ã‚¤ãƒ³ãƒ™ãƒ³ãƒˆãƒªã‚’作æˆã§ãã¾ã›ã‚“。 + </notification> + <notification name="CantCreateLandmark"> + ランドマークを作æˆã§ãã¾ã›ã‚“。 + </notification> + <notification name="CantCreateOutfit"> + アウトフィットをã™ãã«ã¯ä½œæˆã§ãã¾ã›ã‚“。ã—ã°ã‚‰ãã—ã¦ã‹ã‚‰å†åº¦ãŠè©¦ã—ãã ã•ã„。 + </notification> + <notification name="InventoryNotForSale"> + インベントリã¯è²©å£²å¯¾è±¡ã§ã¯ã‚ã‚Šã¾ã›ã‚“。 + </notification> + <notification name="CantFindInvItem"> + æŒã¡ç‰©ã‚¢ã‚¤ãƒ†ãƒ を見ã¤ã‘ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。 + </notification> + <notification name="CantFindObject"> + オブジェクトãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。 + </notification> + <notification name="CantTransfterMoneyRegionDisabled"> + オブジェクトã¸ã®é€é‡‘ã¯ã€ã“ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã§ã¯ç¾åœ¨ç„¡åŠ¹ã«ã•ã‚Œã¦ã„ã¾ã™ã€‚ + </notification> + <notification name="CantPayNoAgent"> + 支払ã„ã®ç›¸æ‰‹ã‚’把æ¡ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚ + </notification> + <notification name="CantDonateToPublicObjects"> + パブリックオブジェクトã«ãƒªãƒ³ãƒ‡ãƒ³ãƒ‰ãƒ«ã‚’与ãˆã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。 + </notification> + <notification name="InventoryCreationInWorldObjectFailed"> + インワールドオブジェクトã§ã®ã‚¤ãƒ³ãƒ™ãƒ³ãƒˆãƒªä½œæˆã«å¤±æ•—ã—ã¾ã—ãŸã€‚ + </notification> + <notification name="UserBalanceOrLandUsageError"> + 内部エラーãŒç™ºç”Ÿã—ãŸãŸã‚ã€ãƒ“ューワをæ£ã—ãæ›´æ–°ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚ビューワã«è¡¨ç¤ºã•ã‚Œã‚‹ãƒªãƒ³ãƒ‡ãƒ³ãƒ‰ãƒ«ã®æ®‹é«˜ã¾ãŸã¯åŒºç”»ã®æ‰€æœ‰ã¯ã€ã‚µãƒ¼ãƒãƒ¼ä¸Šã®å®Ÿéš›ã®æ®‹é«˜ã‚’åæ˜ ã—ã¦ã„ãªã„å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚ + </notification> + <notification name="LargePrimAgentIntersect"> + ä»–ã®ãƒ—レイヤーã®é–¢å¿ƒã‚’引ã大ããªãƒ—リムを作æˆã§ãã¾ã›ã‚“。他ã®ãƒ—レイヤーãŒç§»å‹•ã—ãŸã¨ãã«å†è©¦è¡Œã—ã¦ãã ã•ã„。 + </notification> + <notification name="PreferenceChatClearLog"> + ã“ã‚Œã«ã‚ˆã‚Šã€éŽåŽ»ã®ä¼šè©±ã®ãƒã‚°ã€ãŠã‚ˆã³ãã®ãƒ•ã‚¡ã‚¤ãƒ«ã®ã™ã¹ã¦ã®ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ãŒå‰Šé™¤ã•ã‚Œã¾ã™ã€‚ + <usetemplate ignoretext="以å‰ã®ä¼šè©±ã®ãƒã‚°ã‚’削除ã™ã‚‹å‰ã«ç¢ºèªã—ã¦ãã ã•ã„。" name="okcancelignore" notext="å–り消ã—" yestext="OK"/> + </notification> + <notification name="PreferenceChatDeleteTranscripts"> + ã“ã‚Œã«ã‚ˆã‚Šã€ä»¥å‰ã®ã™ã¹ã¦ã®ä¼šè©±ã®ãƒ†ã‚ストãŒå‰Šé™¤ã•ã‚Œã¾ã™ã€‚éŽåŽ»ã®ä¼šè©±ã®ãƒªã‚¹ãƒˆã«ã¯å½±éŸ¿ã—ã¾ã›ã‚“。.txt ãŠã‚ˆã³ txt.backup ã®æ‹¡å¼µåãŒä»˜ã„ãŸã™ã¹ã¦ã®ãƒ•ã‚¡ã‚¤ãƒ«ãŒ [FOLDER] フォルダーã‹ã‚‰å‰Šé™¤ã•ã‚Œã¾ã™ã€‚ + <usetemplate ignoretext="テã‚ストを削除ã™ã‚‹ã¾ãˆã«ç¢ºèªã—ã¦ãã ã•ã„。" name="okcancelignore" notext="å–り消ã—" yestext="OK"/> + </notification> + <notification name="PreferenceChatPathChanged"> + ファイルを移動ã§ãã¾ã›ã‚“。以å‰ã®ãƒ‘スãŒãƒªã‚¹ãƒˆã‚¢ã•ã‚Œã¾ã—ãŸã€‚ + <usetemplate ignoretext="ファイルを移動ã§ãã¾ã›ã‚“。以å‰ã®ãƒ‘スãŒãƒªã‚¹ãƒˆã‚¢ã•ã‚Œã¾ã—ãŸã€‚" name="okignore" yestext="OK"/> + </notification> </notifications> diff --git a/indra/newview/skins/default/xui/ja/panel_avatar_list_item.xml b/indra/newview/skins/default/xui/ja/panel_avatar_list_item.xml index 70d37c3bad..3ef8eba19f 100644 --- a/indra/newview/skins/default/xui/ja/panel_avatar_list_item.xml +++ b/indra/newview/skins/default/xui/ja/panel_avatar_list_item.xml @@ -27,5 +27,6 @@ <icon name="permission_edit_mine_icon" tool_tip="ã“ã®ãƒ•ãƒ¬ãƒ³ãƒ‰ã¯ã€ã‚ãªãŸã®ã‚ªãƒ–ジェクトを編集・削除・å–å¾—ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™"/> <icon name="permission_map_icon" tool_tip="ã“ã®ãƒ•ãƒ¬ãƒ³ãƒ‰ã¯åœ°å›³ä¸Šã§ã‚ãªãŸã®ä½ç½®ã‚’表示ã§ãã¾ã™"/> <icon name="permission_online_icon" tool_tip="ã“ã®ãƒ•ãƒ¬ãƒ³ãƒ‰ã¯ã‚ãªãŸãŒã‚ªãƒ³ãƒ©ã‚¤ãƒ³ã«ã„ã‚‹ã“ã¨ã‚’確èªã§ãã¾ã™"/> + <button name="info_btn" tool_tip="詳細"/> <button name="profile_btn" tool_tip="プãƒãƒ•ã‚£ãƒ¼ãƒ«ã®è¡¨ç¤º"/> </panel> diff --git a/indra/newview/skins/default/xui/ja/panel_block_list_sidetray.xml b/indra/newview/skins/default/xui/ja/panel_block_list_sidetray.xml index 5d6a6065ae..9263e5f347 100644 --- a/indra/newview/skins/default/xui/ja/panel_block_list_sidetray.xml +++ b/indra/newview/skins/default/xui/ja/panel_block_list_sidetray.xml @@ -1,10 +1,11 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="block_list_panel"> - <text name="title_text"> - ブãƒãƒƒã‚¯ãƒªã‚¹ãƒˆ - </text> - <scroll_list name="blocked" tool_tip="ç¾åœ¨ãƒ–ãƒãƒƒã‚¯ã•ã‚Œã¦ã„ã‚‹ä½äººä¸€è¦§"/> - <button label="ã‚¢ãƒã‚¿ãƒ¼ã‚’ブãƒãƒƒã‚¯" label_selected="ä½äººã‚’ブãƒãƒƒã‚¯..." name="Block resident..." tool_tip="ブãƒãƒƒã‚¯ã—ãŸã„ä½äººã‚’é¸ã‚“ã§ãã ã•ã„"/> - <button label="åå‰ã§ã‚ªãƒ–ジェクトをブãƒãƒƒã‚¯..." label_selected="åå‰ã§ã‚ªãƒ–ジェクトをブãƒãƒƒã‚¯..." name="Block object by name..." tool_tip="åå‰ã§ãƒ–ãƒãƒƒã‚¯ã—ãŸã„オブジェクトをé¸ã‚“ã§ãã ã•ã„"/> - <button label="ブãƒãƒƒã‚¯è§£é™¤" label_selected="ブãƒãƒƒã‚¯è§£é™¤" name="Unblock" tool_tip="ブãƒãƒƒã‚¯ãƒªã‚¹ãƒˆã‹ã‚‰ä½äººãƒ»ã‚ªãƒ–ジェクトを削除"/> + <panel label="bottom_panel" name="blocked_buttons_panel"> + <filter_editor label="フィルター" name="blocked_filter_input"/> + <menu_button name="blocked_gear_btn" tool_tip="é¸æŠžã—ãŸä½äººãƒ»ã‚ªãƒ–ジェクトã«å¯¾ã™ã‚‹ã‚¢ã‚¯ã‚·ãƒ§ãƒ³"/> + <menu_button name="view_btn" tool_tip="オプションを並ã¹æ›¿ãˆã‚‹"/> + <menu_button name="plus_btn" tool_tip="ブãƒãƒƒã‚¯ã™ã‚‹ä½äººãƒ»ã‚ªãƒ–ジェクトをé¸æŠž"/> + <button name="unblock_btn" tool_tip="ブãƒãƒƒã‚¯ãƒªã‚¹ãƒˆã‹ã‚‰ä½äººãƒ»ã‚ªãƒ–ジェクトを削除"/> + </panel> + <block_list name="blocked" tool_tip="ç¾åœ¨ãƒ–ãƒãƒƒã‚¯ã•ã‚Œã¦ã„ã‚‹ä½äººä¸€è¦§"/> </panel> diff --git a/indra/newview/skins/default/xui/ja/panel_conversation_list_item.xml b/indra/newview/skins/default/xui/ja/panel_conversation_list_item.xml new file mode 100644 index 0000000000..09ffb92d36 --- /dev/null +++ b/indra/newview/skins/default/xui/ja/panel_conversation_list_item.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="conversation_list_item"> + <layout_stack name="conversation_item_stack"> + <layout_panel name="conversation_title_panel"> + <text name="conversation_title" value="(ãƒãƒ¼ãƒ‡ã‚£ãƒ³ã‚°ï¼‰"/> + </layout_panel> + </layout_stack> +</panel> diff --git a/indra/newview/skins/default/xui/ja/panel_conversation_log_list_item.xml b/indra/newview/skins/default/xui/ja/panel_conversation_log_list_item.xml new file mode 100644 index 0000000000..e05a67e31d --- /dev/null +++ b/indra/newview/skins/default/xui/ja/panel_conversation_log_list_item.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="conversation_log_list_item"> + <icon name="voice_session_icon" tool_tip="ボイスãƒãƒ£ãƒƒãƒˆ"/> + <icon name="unread_ims_icon" tool_tip="ãƒã‚°ã‚¢ã‚¦ãƒˆæ™‚ã«è¡¨ç¤ºã•ã‚Œã‚‹ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸"/> + <button name="delete_btn" tool_tip="ã“ã®ã‚¨ãƒ³ãƒˆãƒªãƒ¼ã‚’削除"/> +</panel> diff --git a/indra/newview/skins/default/xui/ja/panel_group_list_item.xml b/indra/newview/skins/default/xui/ja/panel_group_list_item.xml index 4b548049c8..77d3d8f391 100644 --- a/indra/newview/skins/default/xui/ja/panel_group_list_item.xml +++ b/indra/newview/skins/default/xui/ja/panel_group_list_item.xml @@ -1,5 +1,6 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="group_list_item"> <text name="group_name" value="ä¸æ˜Ž"/> + <button name="info_btn" tool_tip="詳細"/> <button name="profile_btn" tool_tip="プãƒãƒ•ã‚£ãƒ¼ãƒ«ã®è¡¨ç¤º"/> </panel> diff --git a/indra/newview/skins/default/xui/ja/panel_people.xml b/indra/newview/skins/default/xui/ja/panel_people.xml index 88c31451b5..03ce87537a 100644 --- a/indra/newview/skins/default/xui/ja/panel_people.xml +++ b/indra/newview/skins/default/xui/ja/panel_people.xml @@ -1,4 +1,4 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> <!-- Side tray panel --> <panel label="人" name="people_panel"> <string name="no_recent_people" value="最近交æµã—ãŸäººã¯ã„ã¾ã›ã‚“。 一緒ã«ä½•ã‹ã™ã‚‹ä»²é–“ã‚’ãŠæŽ¢ã—ã§ã™ã‹ï¼Ÿ [secondlife:///app/search/people 検索] ã‹ [secondlife:///app/worldmap 世界地図] ã‚’ãŠè©¦ã—ãã ã•ã„。"/> @@ -14,81 +14,53 @@ <string name="no_filtered_friends_msg"> ãŠæŽ¢ã—ã®ã‚‚ã®ã¯è¦‹ã¤ã‹ã‚Šã¾ã—ãŸã‹ï¼Ÿ [secondlife:///app/search/people/[SEARCH_TERM] 検索] ã‚’ãŠè©¦ã—ãã ã•ã„。 </string> - <string name="people_filter_label" value="人をフィルター"/> - <string name="groups_filter_label" value="グループをフィルター"/> <string name="no_filtered_groups_msg" value="ãŠæŽ¢ã—ã®ã‚‚ã®ã¯è¦‹ã¤ã‹ã‚Šã¾ã—ãŸã‹ï¼Ÿ [secondlife:///app/search/groups/[SEARCH_TERM] 検索] ã‚’ãŠè©¦ã—ãã ã•ã„。"/> <string name="no_groups_msg" value="グループをãŠæŽ¢ã—ã§ã™ã‹ï¼Ÿ [secondlife:///app/search/groups 検索] ã‚’ãŠè©¦ã—ãã ã•ã„。"/> <string name="MiniMapToolTipMsg" value="[地域](ダブルクリックã§åœ°å›³ã‚’é–‹ã。Shiftâ€ãƒ‰ãƒ©ãƒƒã‚°ã§æ°´å¹³ãƒ»åž‚直移動)"/> <string name="AltMiniMapToolTipMsg" value="[地域](ダブルクリックã§ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã€‚Shiftâ€ãƒ‰ãƒ©ãƒƒã‚°ã§æ°´å¹³ãƒ»åž‚直移動)"/> - <filter_editor label="フィルター" name="filter_input"/> <tab_container name="tabs"> <panel label="è¿‘ã" name="nearby_panel"> - <panel label="bottom_panel" name="bottom_panel"> - <menu_button name="nearby_view_sort_btn" tool_tip="オプション"/> - <button name="add_friend_btn" tool_tip="é¸æŠžã—ãŸä½äººã‚’フレンドリストã«ç™»éŒ²"/> + <panel label="bottom_panel" name="nearby_buttons_panel"> + <filter_editor label="人をフィルター" name="nearby_filter_input"/> + <button name="gear_btn" tool_tip="é¸æŠžã—ãŸäººã«å¯¾ã™ã‚‹ã‚¢ã‚¯ã‚·ãƒ§ãƒ³"/> + <menu_button name="nearby_view_btn" tool_tip="表示 / 並ã¹æ›¿ãˆã®ã‚ªãƒ—ション"/> + <button name="add_friend_btn" tool_tip="フレンド登録を申ã—出ã¾ã™"/> + <dnd_button name="nearby_del_btn" tool_tip="フレンドã¨ã—ã¦é¸æŠžã•ã‚Œã¦ã„る人を削除"/> </panel> </panel> - <panel label="マイ フレンド" name="friends_panel"> + <panel label="フレンド" name="friends_panel"> + <panel label="bottom_panel" name="friends_buttons_panel"> + <filter_editor label="人をフィルター" name="friends_filter_input"/> + <button name="gear_btn" tool_tip="é¸æŠžã—ãŸäººã«å¯¾ã™ã‚‹ã‚¢ã‚¯ã‚·ãƒ§ãƒ³"/> + <menu_button name="friends_view_btn" tool_tip="表示 / 並ã¹æ›¿ãˆã®ã‚ªãƒ—ション"/> + <button name="friends_add_btn" tool_tip="フレンド登録を申ã—出ã¾ã™"/> + <dnd_button name="friends_del_btn" tool_tip="フレンドã¨ã—ã¦é¸æŠžã•ã‚Œã¦ã„る人を削除"/> + </panel> <accordion name="friends_accordion"> <accordion_tab name="tab_online" title="オンライン"/> <accordion_tab name="tab_all" title="全員"/> </accordion> - <panel label="bottom_panel" name="bottom_panel"> - <layout_stack name="bottom_panel"> - <layout_panel name="options_gear_btn_panel"> - <menu_button name="friends_viewsort_btn" tool_tip="オプションを表示ã—ã¾ã™"/> - </layout_panel> - <layout_panel name="add_btn_panel"> - <button name="add_btn" tool_tip="フレンド登録を申ã—出る"/> - </layout_panel> - <layout_panel name="trash_btn_panel"> - <dnd_button name="del_btn" tool_tip="é¸æŠžã—ãŸäººã‚’フレンドリストã‹ã‚‰å‰Šé™¤"/> - </layout_panel> - </layout_stack> - </panel> </panel> - <panel label="マイ グループ" name="groups_panel"> - <panel label="bottom_panel" name="bottom_panel"> - <menu_button name="groups_viewsort_btn" tool_tip="オプション"/> - <button name="plus_btn" tool_tip="グループã«å‚åŠ / æ–°è¦ã‚°ãƒ«ãƒ¼ãƒ—を作æˆã—ã¾ã™"/> - <button name="activate_btn" tool_tip="é¸æŠžã—ãŸã‚°ãƒ«ãƒ¼ãƒ—をアクティブã«ã—ã¾ã™"/> + <panel label="グループ" name="groups_panel"> + <panel label="bottom_panel" name="groups_buttons_panel"> + <filter_editor label="フィルターグループ" name="groups_filter_input"/> + <menu_button name="groups_gear_btn" tool_tip="é¸æŠžã—ãŸã‚°ãƒ«ãƒ¼ãƒ—ã«å¯¾ã™ã‚‹ã‚¢ã‚¯ã‚·ãƒ§ãƒ³"/> + <menu_button name="groups_view_btn" tool_tip="表示 / 並ã¹æ›¿ãˆã®ã‚ªãƒ—ション"/> + <menu_button name="plus_btn" tool_tip="グループã«å‚åŠ / æ–°è¦ã‚°ãƒ«ãƒ¼ãƒ—を作æˆã—ã¾ã™"/> + <dnd_button name="minus_btn" tool_tip="é¸æŠžã—ãŸã‚°ãƒ«ãƒ¼ãƒ—ã‹ã‚‰è„±é€€"/> </panel> </panel> <panel label="最新" name="recent_panel"> - <panel label="bottom_panel" name="bottom_panel"> - <menu_button name="recent_viewsort_btn" tool_tip="オプション"/> - <button name="add_friend_btn" tool_tip="é¸æŠžã—ãŸä½äººã‚’フレンドリストã«ç™»éŒ²"/> + <panel label="bottom_panel" name="recent_buttons_panel"> + <filter_editor label="人をフィルター" name="recent_filter_input"/> + <button name="gear_btn" tool_tip="é¸æŠžã—ãŸäººã«å¯¾ã™ã‚‹ã‚¢ã‚¯ã‚·ãƒ§ãƒ³"/> + <menu_button name="recent_view_btn" tool_tip="表示 / 並ã¹æ›¿ãˆã®ã‚ªãƒ—ション"/> + <button name="add_friend_btn" tool_tip="フレンド登録を申ã—出ã¾ã™"/> + <dnd_button name="recent_del_btn" tool_tip="フレンドã¨ã—ã¦é¸æŠžã•ã‚Œã¦ã„る人を削除"/> </panel> </panel> + <panel label="åœæ¢" name="blocked_panel"> + <panel label="ブãƒãƒƒã‚¯ã•ã‚ŒãŸä½äººã¨ã‚ªãƒ–ジェクト" name="panel_block_list_sidetray"/> + </panel> </tab_container> - <panel name="button_bar"> - <layout_stack name="bottom_bar_ls"> - <layout_panel name="view_profile_btn_lp"> - <button label="プãƒãƒ•ã‚£ãƒ¼ãƒ«" name="view_profile_btn" tool_tip="写真ã€ã‚°ãƒ«ãƒ¼ãƒ—ã€ãã®ä»–ä½äººæƒ…å ±ã‚’è¡¨ç¤º"/> - </layout_panel> - <layout_panel name="im_btn_lp"> - <button label="IM" name="im_btn" tool_tip="インスタントメッセージを開ãã¾ã™"/> - </layout_panel> - <layout_panel name="call_btn_lp"> - <button label="コール" name="call_btn" tool_tip="ã“ã®ä½äººã«ã‚³ãƒ¼ãƒ«ã™ã‚‹"/> - </layout_panel> - <layout_panel name="share_btn_lp"> - <button label="共有" name="share_btn" tool_tip="インベントリã®ã‚¢ã‚¤ãƒ†ãƒ を共有ã™ã‚‹"/> - </layout_panel> - <layout_panel name="teleport_btn_lp"> - <button label="テレãƒãƒ¼ãƒˆ" name="teleport_btn" tool_tip="テレãƒãƒ¼ãƒˆã‚’é€ã‚Šã¾ã™"/> - </layout_panel> - </layout_stack> - <layout_stack name="bottom_bar_ls1"> - <layout_panel name="group_info_btn_lp"> - <button label="グループプãƒãƒ•ã‚£ãƒ¼ãƒ«" name="group_info_btn" tool_tip="グループプãƒãƒ•ã‚£ãƒ¼ãƒ«ã‚’表示ã—ã¾ã™"/> - </layout_panel> - <layout_panel name="chat_btn_lp"> - <button label="グループãƒãƒ£ãƒƒãƒˆ" name="chat_btn" tool_tip="ãƒãƒ£ãƒƒãƒˆã‚’開始ã—ã¾ã™"/> - </layout_panel> - <layout_panel name="group_call_btn_lp"> - <button label="グループコール" name="group_call_btn" tool_tip="ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«ã‚³ãƒ¼ãƒ«ã™ã‚‹"/> - </layout_panel> - </layout_stack> - </panel> </panel> diff --git a/indra/newview/skins/default/xui/ja/panel_preferences_chat.xml b/indra/newview/skins/default/xui/ja/panel_preferences_chat.xml index b6e344ca48..ae5391c7bd 100644 --- a/indra/newview/skins/default/xui/ja/panel_preferences_chat.xml +++ b/indra/newview/skins/default/xui/ja/panel_preferences_chat.xml @@ -1,34 +1,86 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel label="ãƒãƒ£ãƒƒãƒˆ" name="chat"> - <text name="font_size"> - æ–‡å—ã®å¤§ãã•ï¼š - </text> - <radio_group name="chat_font_size"> - <radio_item label="å°" name="radio" value="0"/> - <radio_item label="ä¸" name="radio2" value="1"/> - <radio_item label="大" name="radio3" value="2"/> - </radio_group> - <check_box initial_value="true" label="ãƒãƒ£ãƒƒãƒˆä¸ã«ã‚¿ã‚¤ãƒ”ング動作ã®ã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³ã‚’å†ç”Ÿ" name="play_typing_animation"/> - <check_box label="オフライン時ã«å—ã‘å–ã£ãŸ IM をメールã§å—ä¿¡" name="send_im_to_email"/> - <check_box label="IM ã¨ãƒãƒ£ãƒƒãƒˆå±¥æ´ã«æ–‡å—ã ã‘表示ã™ã‚‹" name="plain_text_chat_history"/> - <check_box label="å¹ã出ã—ãƒãƒ£ãƒƒãƒˆ" name="bubble_text_chat"/> - <text name="show_ims_in_label"> - IM ã®è¡¨ç¤ºæ–¹æ³•ï¼š - </text> - <text name="requires_restart_label"> - (å†èµ·å‹•å¾Œã«åæ˜ ï¼‰ - </text> - <radio_group name="chat_window" tool_tip="インスタントメッセージを別フãƒãƒ¼ã‚¿ãƒ¼ã€ã¾ãŸã¯1ã¤ã®ãƒ•ãƒãƒ¼ã‚¿ãƒ¼ã«è¤‡æ•°ã‚¿ãƒ–ã§è¡¨ç¤ºã—ã¾ã™ï¼ˆè¦å†èµ·å‹•ï¼‰"> - <radio_item label="別々ã®ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦" name="radio" value="0"/> - <radio_item label="タブ" name="radio2" value="1"/> - </radio_group> - <text name="disable_toast_label"> - å—ä¿¡ãƒãƒ£ãƒƒãƒˆã®ãƒãƒƒãƒ—アップを有効ã«ã™ã‚‹ - </text> - <check_box label="グループãƒãƒ£ãƒƒãƒˆ" name="EnableGroupChatPopups" tool_tip="ã“れをé¸æŠžã™ã‚‹ã¨ã€ã‚°ãƒ«ãƒ¼ãƒ—ãƒãƒ£ãƒƒãƒˆãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’å—ä¿¡ã—ãŸéš›ã«ãƒãƒƒãƒ—アップãŒè¡¨ç¤ºã•ã‚Œã¾ã™"/> - <check_box label="IM ãƒãƒ£ãƒƒãƒˆ" name="EnableIMChatPopups" tool_tip="ã“れをé¸æŠžã™ã‚‹ã¨ã€ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ãƒˆãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’å—ä¿¡ã—ãŸéš›ã«ãƒãƒƒãƒ—アップãŒè¡¨ç¤ºã•ã‚Œã¾ã™"/> - <spinner label="è¿‘ãã®ãƒãƒ£ãƒƒãƒˆãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒè¡¨ç¤ºã•ã‚Œã‚‹é•·ã•ï¼š" name="nearby_toasts_lifetime"/> - <spinner label="è¿‘ãã®ãƒãƒ£ãƒƒãƒˆãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒæ¶ˆãˆã‚‹ã¾ã§ã®é•·ã•ï¼š" name="nearby_toasts_fadingtime"/> + <panel> + <check_box initial_value="true" label="ãƒãƒ£ãƒƒãƒˆä¸ã«ã‚¿ã‚¤ãƒ”ング動作ã®ã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³ã‚’å†ç”Ÿ" name="play_typing_animation"/> + <check_box label="オフライン時ã«å—ã‘å–ã£ãŸ IM をメールã§å—ä¿¡" name="send_im_to_email"/> + <check_box label="フレンドã¨ã‚°ãƒ«ãƒ¼ãƒ—以外ã‹ã‚‰ã¯ã‚³ãƒ¼ãƒ«ã¨ IM ã‚’å—ä¿¡ã—ãªã„" name="voice_call_friends_only_check"/> + <text name="font_size"> + æ–‡å—ã®å¤§ãã•ï¼š + </text> + <combo_box name="chat_font_size"> + <item label="å°è¦æ¨¡" name="Small" value="0"/> + <item label="ä¸" name="Medium" value="1"/> + <item label="大è¦æ¨¡" name="Large" value="2"/> + </combo_box> + <check_box label="å¹ã出ã—ãƒãƒ£ãƒƒãƒˆ" name="bubble_text_chat"/> + </panel> + <panel> + <text name="notifications"> + 通知 + </text> + <text name="friend_ims"> + フレンド IM: + </text> + <combo_box name="FriendIMOptions"> + <item label="会話ウィンドウを開ã" name="OpenConversationsWindow" value="openconversations"/> + <item label="メッセージã®ãƒãƒƒãƒ—アップ" name="PopUpMessage" value="toast"/> + <item label="Flash ツールãƒãƒ¼ãƒœã‚¿ãƒ³" name="FlashToolbarButton" value="flash"/> + <item label="フィルターãªã—" name="None" value="none"/> + </combo_box> + <text name="non_friend_ims"> + éžãƒ•ãƒ¬ãƒ³ãƒ‰ IM: + </text> + <combo_box name="NonFriendIMOptions"> + <item label="会話ウィンドウを開ã" name="OpenConversationsWindow" value="openconversations"/> + <item label="メッセージã®ãƒãƒƒãƒ—アップ" name="PopUpMessage" value="toast"/> + <item label="Flash ツールãƒãƒ¼ãƒœã‚¿ãƒ³" name="FlashToolbarButton" value="flash"/> + <item label="フィルターãªã—" name="None" value="none"/> + </combo_box> + <text name="conference_ims"> + コンファレンス IM: + </text> + <combo_box name="ConferenceIMOptions"> + <item label="会話ウィンドウを開ã" name="OpenConversationsWindow" value="openconversations"/> + <item label="メッセージã®ãƒãƒƒãƒ—アップ" name="PopUpMessage" value="toast"/> + <item label="Flashツールãƒãƒ¼ãƒœã‚¿ãƒ³" name="FlashToolbarButton" value="flash"/> + <item label="フィルターãªã—" name="None" value="none"/> + </combo_box> + <text name="group_chat"> + グループãƒãƒ£ãƒƒãƒˆ: + </text> + <combo_box name="GroupChatOptions"> + <item label="会話ウィンドウを開ã" name="OpenConversationsWindow" value="openconversations"/> + <item label="メッセージã®ãƒãƒƒãƒ—アップ" name="PopUpMessage" value="toast"/> + <item label="Flash ツールãƒãƒ¼ãƒœã‚¿ãƒ³" name="FlashToolbarButton" value="flash"/> + <item label="ãªã—" name="None" value="none"/> + </combo_box> + <text name="nearby_chat"> + è¿‘ãã®ãƒãƒ£ãƒƒãƒˆ: + </text> + <combo_box name="NearbyChatOptions"> + <item label="会話ウィンドウを開ã" name="OpenConversationsWindow" value="openconversations"/> + <item label="メッセージã®ãƒãƒƒãƒ—アップ" name="PopUpMessage" value="toast"/> + <item label="Flash ツールãƒãƒ¼ãƒœã‚¿ãƒ³" name="FlashToolBarButton" value="flash"/> + <item label="フィルターãªã—" name="None" value="none"/> + </combo_box> + <text name="notifications_alert"> + ã™ã¹ã¦ã®é€šçŸ¥ã‚’一時的ã«å—ã‘付ã‘ãªã„よã†ã«ã™ã‚‹ã«ã¯ã€ã€Œã‚³ãƒŸãƒ¥ãƒ‹ã‚±ãƒ¼ãƒˆã€>「通知をå—ã‘ãªã„ã€ã‚’使用ã—ã¾ã™ã€‚ + </text> + </panel> + <panel> + <text name="play_sound"> + 音ã®å†ç”Ÿ: + </text> + <check_box label="æ–°ã—ã„会話" name="new_conversation"/> + <check_box label="ボイスコールã®ç€ä¿¡" name="incoming_voice_call"/> + <check_box label="テレãƒãƒ¼ãƒˆã‚’渡ã™" name="teleport_offer"/> + <check_box label="アイテムã®ã‚ªãƒ•ã‚¡ãƒ¼" name="inventory_offer"/> + </panel> + <panel> + <button label="ãƒã‚°ã®ã‚¯ãƒªã‚¢..." name="clear_log"/> + <button label="テã‚ストã®å‰Šé™¤..." name="delete_transcripts"/> + <button label="å‚ç…§..." label_selected="å‚ç…§" name="log_path_button"/> + </panel> <button label="ä»–ã®è¨€èªž..." name="ok_btn"/> <button label="自動置æ›..." name="autoreplace_showgui"/> <button label="スペルãƒã‚§ãƒƒã‚¯ä¸..." name="spellcheck_showgui"/> diff --git a/indra/newview/skins/default/xui/ja/panel_preferences_general.xml b/indra/newview/skins/default/xui/ja/panel_preferences_general.xml index 91e1514e49..d70af7e099 100644 --- a/indra/newview/skins/default/xui/ja/panel_preferences_general.xml +++ b/indra/newview/skins/default/xui/ja/panel_preferences_general.xml @@ -69,9 +69,9 @@ <combo_box.item label="一時退å¸è¨å®šãªã—" name="item4"/> </combo_box> <text name="text_box3"> - å–ã‚Šè¾¼ã¿ä¸ãƒ¢ãƒ¼ãƒ‰æ™‚ã®è¿”事: + 「通知をå—ã‘ãªã„ã€å¿œç”: </text> - <text_editor name="busy_response"> + <text_editor name="do_not_disturb_response"> log_in_to_change </text_editor> </panel> diff --git a/indra/newview/skins/default/xui/ja/sidepanel_task_info.xml b/indra/newview/skins/default/xui/ja/sidepanel_task_info.xml index c61c73657f..4f65c8477b 100644 --- a/indra/newview/skins/default/xui/ja/sidepanel_task_info.xml +++ b/indra/newview/skins/default/xui/ja/sidepanel_task_info.xml @@ -72,6 +72,7 @@ <combo_box.item label="オブジェクトを買ã†" name="Buyobject"/> <combo_box.item label="オブジェクトã«æ”¯æ‰•ã†" name="Payobject"/> <combo_box.item label="é–‹ã" name="Open"/> + <combo_box.item label="ズーム" name="Zoom"/> </combo_box> <panel name="perms_inv"> <text name="perm_modify"> diff --git a/indra/newview/skins/default/xui/ja/strings.xml b/indra/newview/skins/default/xui/ja/strings.xml index 50697e5500..b27904c4d7 100644 --- a/indra/newview/skins/default/xui/ja/strings.xml +++ b/indra/newview/skins/default/xui/ja/strings.xml @@ -137,7 +137,7 @@ 終了 </string> <string name="create_account_url"> - http://join.secondlife.com/index.php?lang=ja-JP&sourceid=[sourceid] + http://join.secondlife.com/?sourceid=[sourceid] </string> <string name="LoginFailedViewerNotPermitted"> ãŠä½¿ã„ã®å¤ã„ビューワã§ã¯ Second Life ã«ã‚¢ã‚¯ã‚»ã‚¹ã§ãã¾ã›ã‚“。以下ã®ãƒšãƒ¼ã‚¸ã‹ã‚‰æ–°ã—ã„ビューワをダウンãƒãƒ¼ãƒ‰ã—ã¦ãã ã•ã„: @@ -622,8 +622,8 @@ support@secondlife.com ã«ãŠå•ã„åˆã‚ã›ãã ã•ã„。 <string name="AvatarAway"> 一時退å¸ä¸ </string> - <string name="AvatarBusy"> - å–ã‚Šè¾¼ã¿ä¸ + <string name="AvatarDoNotDisturb"> + 通知をå—ã‘ãªã„ </string> <string name="AvatarMuted"> ブãƒãƒƒã‚¯ä¸ @@ -859,6 +859,12 @@ support@secondlife.com ã«ãŠå•ã„åˆã‚ã›ãã ã•ã„。 <string name="ST_NO_JOINT"> ROOT ã¾ãŸã¯ JOINT ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ </string> + <string name="NearbyChatTitle"> + è¿‘ãã®ãƒãƒ£ãƒƒãƒˆ + </string> + <string name="NearbyChatLabel"> + (è¿‘ãã®ãƒãƒ£ãƒƒãƒˆ) + </string> <string name="whisper"> ã®ã•ã•ã‚„ã: </string> @@ -922,12 +928,15 @@ support@secondlife.com ã«ãŠå•ã„åˆã‚ã›ãã ã•ã„。 <string name="ControlYourCamera"> カメラã®ã‚³ãƒ³ãƒˆãƒãƒ¼ãƒ« </string> - <string name="TeleportYourAgent"> - ã‚ãªãŸã‚’テレãƒãƒ¼ãƒˆ - </string> <string name="NotConnected"> 接続ã•ã‚Œã¦ã„ã¾ã›ã‚“ </string> + <string name="AgentNameSubst"> + (ã‚ãªãŸ) + </string> + <string name="TeleportYourAgent"> + ã‚ãªãŸã‚’テレãƒãƒ¼ãƒˆ + </string> <string name="SIM_ACCESS_PG"> General </string> @@ -1009,18 +1018,6 @@ support@secondlife.com ã«ãŠå•ã„åˆã‚ã›ãã ã•ã„。 <string name="dictionary_files"> 辞書 </string> - <string name="AvatarSetNotAway"> - 一時退å¸ä¸è§£é™¤ - </string> - <string name="AvatarSetAway"> - 一時退å¸ä¸ - </string> - <string name="AvatarSetNotBusy"> - å–ã‚Šè¾¼ã¿ä¸è§£é™¤ - </string> - <string name="AvatarSetBusy"> - å–ã‚Šè¾¼ã¿ä¸ - </string> <string name="shape"> シェイプ </string> @@ -1989,8 +1986,8 @@ support@secondlife.com ã«ãŠå•ã„åˆã‚ã›ãã ã•ã„。 <string name="PanelContentsNewScript"> æ–°è¦ã‚¹ã‚¯ãƒªãƒ—ト </string> - <string name="BusyModeResponseDefault"> - メッセージをé€ã£ãŸä½äººã¯ã€èª°ã«ã‚‚邪é”ã‚’ã•ã‚ŒãŸããªã„ãŸã‚ç¾åœ¨ã€Œå–ã‚Šè¾¼ã¿ä¸ã€ãƒ¢ãƒ¼ãƒ‰ã§ã™ã€‚ ã‚ãªãŸã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã¯ã€ã‚ã¨ã§ç¢ºèªã§ãるよã†ã« IM パãƒãƒ«ã«è¡¨ç¤ºã•ã‚Œã¾ã™ã€‚ + <string name="DoNotDisturbModeResponseDefault"> + ã“ã®ä½æ°‘ãŒã€Œé€šçŸ¥ã‚’å—ã‘ãªã„ã€ã‚’オンã«ã™ã‚‹ã¨ã€ã‚ãªãŸã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒå¾Œã§è¡¨ç¤ºã•ã‚Œã‚‹ã‚ˆã†ã«ãªã‚Šã¾ã™ã€‚ </string> <string name="MuteByName"> (å称別) @@ -2103,9 +2100,6 @@ support@secondlife.com ã«ãŠå•ã„åˆã‚ã›ãã ã•ã„。 <string name="GroupMoneyDate"> [year,datetime,utc]å¹´[mth,datetime,utc]月[day,datetime,utc]æ—¥[weekday,datetime,utc] </string> - <string name="ViewerObjectContents"> - 内容 - </string> <string name="AcquiredItems"> å–得アイテム</string> @@ -3877,7 +3871,7 @@ www.secondlife.com ã‹ã‚‰æœ€æ–°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’ダウンãƒãƒ¼ãƒ‰ã—ã¦ãã ã General リージョン </string> <string name="LocationCtrlSeeAVsTooltip"> - ã“ã®åŒºç”»å¤–ã«ã‚¢ãƒã‚¿ãƒ¼ã‚’見ãˆã‚‹ã‚ˆã†ã«ã—ã¦ã€ãƒãƒ£ãƒƒãƒˆã‚‚è¨±å¯ + ã“ã®åŒºç”»å†…ã®ã‚¢ãƒã‚¿ãƒ¼ã¯ã€ã“ã®åŒºç”»ã®å¤–ã«ã„ã‚‹ã‚¢ãƒã‚¿ãƒ¼ã‹ã‚‰ã¯è¦‹ã‚‹ã“ã¨ã‚‚èžãã“ã¨ã‚‚ã§ãã¾ã›ã‚“。 </string> <string name="LocationCtrlPathfindingDirtyTooltip"> 地域(リージョン)ãŒå†æ§‹ç¯‰ã•ã‚Œã‚‹ã¾ã§ã€ç§»å‹•ã™ã‚‹ã‚ªãƒ–ジェクトã¯æ£ã—ã動作ã—ãªã„å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚ @@ -3954,6 +3948,12 @@ www.secondlife.com ã‹ã‚‰æœ€æ–°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’ダウンãƒãƒ¼ãƒ‰ã—ã¦ãã ã <string name="IM_unblock_only_groups_friends"> ã“ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’表示ã™ã‚‹ã«ã¯ã€ã€Œç’°å¢ƒè¨å®šã€ã®ã€Œãƒ—ライãƒã‚·ãƒ¼ã€ã§ã€Œãƒ•ãƒ¬ãƒ³ãƒ‰ã¨ã‚°ãƒ«ãƒ¼ãƒ—以外ã‹ã‚‰ã¯ã‚³ãƒ¼ãƒ«ã¨ IM ã‚’å—ä¿¡ã—ãªã„ã€ãƒã‚§ãƒƒã‚¯ãƒœãƒƒã‚¯ã‚¹ã‚’オフã«ã—ã¾ã™ã€‚ </string> + <string name="OnlineStatus"> + オンライン + </string> + <string name="OfflineStatus"> + オフライン + </string> <string name="answered_call"> 相手ãŒã‚³ãƒ¼ãƒ«ã‚’å—ã‘ã¾ã—㟠</string> @@ -3963,6 +3963,9 @@ www.secondlife.com ã‹ã‚‰æœ€æ–°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’ダウンãƒãƒ¼ãƒ‰ã—ã¦ãã ã <string name="you_joined_call"> ボイスコールã«å‚åŠ ã—ã¾ã—㟠</string> + <string name="you_auto_rejected_call-im"> + 「通知をå—ã‘ãªã„ã€ãŒã‚ªãƒ³ã®ã¨ãã«ã€è‡ªå‹•çš„ã«ãƒœã‚¤ã‚¹ã‚³ãƒ¼ãƒ«ã‚’æ‹’å¦ã—ã¾ã—ãŸã€‚ + </string> <string name="name_started_call"> [NAME] ã¯ãƒœã‚¤ã‚¹ã‚³ãƒ¼ãƒ«ã‚’開始ã—ã¾ã™ </string> @@ -3979,7 +3982,7 @@ www.secondlife.com ã‹ã‚‰æœ€æ–°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’ダウンãƒãƒ¼ãƒ‰ã—ã¦ãã ã 接続ä¸... </string> <string name="conference-title"> - アドホックコンファレンス + 複数人ãƒãƒ£ãƒƒãƒˆ </string> <string name="conference-title-incoming"> [AGENT_NAME] ã¨ã‚³ãƒ³ãƒ•ã‚¡ãƒ¬ãƒ³ã‚¹ã™ã‚‹ @@ -4859,6 +4862,9 @@ www.secondlife.com ã‹ã‚‰æœ€æ–°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’ダウンãƒãƒ¼ãƒ‰ã—ã¦ãã ã <string name="Command_Chat_Label"> ãƒãƒ£ãƒƒãƒˆ </string> + <string name="Command_Conversations_Label"> + 会話 + </string> <string name="Command_Compass_Label"> コンパス </string> @@ -4934,6 +4940,9 @@ www.secondlife.com ã‹ã‚‰æœ€æ–°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’ダウンãƒãƒ¼ãƒ‰ã—ã¦ãã ã <string name="Command_Chat_Tooltip"> è¿‘ãã®äººã¨æ–‡å—ãƒãƒ£ãƒƒãƒˆã™ã‚‹ </string> + <string name="Command_Conversations_Tooltip"> + 全員ã¨ã®ä¼šè©± + </string> <string name="Command_Compass_Tooltip"> コンパス </string> @@ -5063,4 +5072,13 @@ www.secondlife.com ã‹ã‚‰æœ€æ–°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’ダウンãƒãƒ¼ãƒ‰ã—ã¦ãã ã <string name="UserDictionary"> [User] </string> + <string name="logging_calls_disabled_log_empty"> + 会話ã¯ãƒã‚°ã«è¨˜éŒ²ã•ã‚Œã¦ã„ã¾ã›ã‚“。ãƒã‚°ã®è¨˜éŒ²ã‚’開始ã™ã‚‹ã«ã¯ã€ã€Œç’°å¢ƒè¨å®šã€>「ãƒãƒ£ãƒƒãƒˆã€ã§ã€Œä¿å˜: ãƒã‚°ã®ã¿ã€ã¾ãŸã¯ã€Œä¿å˜: ãƒã‚°ã¨ä¼šè©±ã®ãƒ†ã‚ストã€ã‚’é¸æŠžã—ã¾ã™ã€‚ + </string> + <string name="logging_calls_disabled_log_not_empty"> + ã“れ以上ã®ä¼šè©±ã¯è¨˜éŒ²ã•ã‚Œã¾ã›ã‚“。ãƒã‚°ã®è¨˜éŒ²ã‚’å†é–‹ã™ã‚‹ã«ã¯ã€ã€Œç’°å¢ƒè¨å®šã€>「ãƒãƒ£ãƒƒãƒˆã€ã§ã€Œä¿å˜: ãƒã‚°ã®ã¿ã€ã¾ãŸã¯ã€Œä¿å˜: ãƒã‚°ã¨ä¼šè©±ã®ãƒ†ã‚ストã€ã‚’é¸æŠžã—ã¾ã™ã€‚ + </string> + <string name="logging_calls_enabled_log_empty"> + ãƒã‚°ã‚¤ãƒ³æ™‚ã®ä¼šè©±ã¯ã‚ã‚Šã¾ã›ã‚“。誰ã‹ã«ã”連絡ã—ãŸå¾Œã€ã¾ãŸã¯èª°ã‹ãŒã‚ãªãŸã«é€£çµ¡ã—ãŸå¾Œã€ãƒã‚°ã‚¨ãƒ³ãƒˆãƒªãŒã“ã“ã«è¡¨ç¤ºã•ã‚Œã¾ã™ã€‚ + </string> </strings> diff --git a/indra/newview/skins/default/xui/pl/menu_viewer.xml b/indra/newview/skins/default/xui/pl/menu_viewer.xml index 24c961fa26..e1725fc308 100644 --- a/indra/newview/skins/default/xui/pl/menu_viewer.xml +++ b/indra/newview/skins/default/xui/pl/menu_viewer.xml @@ -236,7 +236,7 @@ <menu label="Renderowanie" name="Rendering"> <menu_item_check label="Osie" name="Axes"/> <menu_item_check label="Tryb obrazu szkieletowego" name="Wireframe"/> - <menu_item_check label="OÅ›wietlenie i cienie" name="Lighting and Shadows"/> + <menu_item_check label="OÅ›wietlenie i cienie" name="Advanced Lighting Model"/> <menu_item_check label="Cienie SÅ‚oÅ„ca/Księżyca/Projektory" name="Shadows from Sun/Moon/Projectors"/> <menu_item_check label="SSAO and wygÅ‚adzanie cienia" name="SSAO and Shadow Smoothing"/> <menu_item_check label="Globalne oÅ›wietlenie (eksperymentalne)" name="Global Illumination"/> diff --git a/indra/newview/skins/default/xui/pt/floater_conversation_log.xml b/indra/newview/skins/default/xui/pt/floater_conversation_log.xml new file mode 100644 index 0000000000..ae7dd3c441 --- /dev/null +++ b/indra/newview/skins/default/xui/pt/floater_conversation_log.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="floater_conversation_log" title="REGISTRO DE CONVERSA"> + <panel name="buttons_panel"> + <filter_editor label="Filtrar pessoas" name="people_filter_input"/> + <menu_button name="conversation_view_btn" tool_tip="Opções de exibição/ordenação"/> + <menu_button name="conversations_gear_btn" tool_tip="Ações em uma pessoa ou um grupo selecionado"/> + </panel> +</floater> diff --git a/indra/newview/skins/default/xui/pt/floater_conversation_preview.xml b/indra/newview/skins/default/xui/pt/floater_conversation_preview.xml new file mode 100644 index 0000000000..97a2e8327c --- /dev/null +++ b/indra/newview/skins/default/xui/pt/floater_conversation_preview.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="preview_conversation" title="CONVERSA:"> + <floater.string name="Title"> + CONVERSA: [NAME] + </floater.string> + <text name="page_label" value="Página"/> +</floater> diff --git a/indra/newview/skins/default/xui/pt/floater_im_container.xml b/indra/newview/skins/default/xui/pt/floater_im_container.xml index 0fbb826a96..a1cea72b1e 100644 --- a/indra/newview/skins/default/xui/pt/floater_im_container.xml +++ b/indra/newview/skins/default/xui/pt/floater_im_container.xml @@ -1,2 +1,29 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<multi_floater name="floater_im_box" title="CONVERSAS"/> +<multi_floater name="floater_im_box" title="CONVERSAS"> + <string name="collapse_icon" value="Conv_toolbar_collapse"/> + <string name="expand_icon" value="Conv_toolbar_expand"/> + <layout_stack name="conversations_stack"> + <layout_panel name="conversations_layout_panel"> + <layout_stack name="conversations_pane_buttons_stack"> + <layout_panel name="conversations_pane_buttons_expanded"> + <menu_button name="sort_btn" tool_tip="Opções de exibição/ordenação"/> + <button name="add_btn" tool_tip="Iniciar uma nova conversa"/> + <button name="speak_btn" tool_tip="Fale com pessoas usando seu microfone"/> + </layout_panel> + <layout_panel name="conversations_pane_buttons_collapsed"> + <button name="expand_collapse_btn" tool_tip="Recolher/expandir esta lista"/> + </layout_panel> + </layout_stack> + </layout_panel> + <layout_panel name="messages_layout_panel"> + <panel_container name="im_box_tab_container"> + <panel name="stub_panel"> + <button name="stub_collapse_btn" tool_tip="Recolher este painel"/> + <text name="stub_textbox"> + Esta conversa está em uma janela separada. [secondlife:/// Trazer de volta.] + </text> + </panel> + </panel_container> + </layout_panel> + </layout_stack> +</multi_floater> diff --git a/indra/newview/skins/default/xui/pt/floater_im_session.xml b/indra/newview/skins/default/xui/pt/floater_im_session.xml index 5543ffa41d..9f6a7a06ad 100644 --- a/indra/newview/skins/default/xui/pt/floater_im_session.xml +++ b/indra/newview/skins/default/xui/pt/floater_im_session.xml @@ -1,8 +1,59 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="panel_im"> - <layout_stack name="im_panels"> - <layout_panel> - <line_editor label="Para" name="chat_editor"/> - </layout_panel> - </layout_stack> + <floater.string name="call_btn_start"> + Conv_toolbar_open_call + </floater.string> + <floater.string name="call_btn_stop"> + Conv_toolbar_hang_up + </floater.string> + <floater.string name="collapseline_icon" value="Conv_collapse_to_one_line"/> + <floater.string name="expandline_icon" value="Conv_expand_one_line"/> + <floater.string name="collapse_icon" value="Conv_toolbar_collapse"/> + <floater.string name="expand_icon" value="Conv_toolbar_expand"/> + <floater.string name="tear_off_icon" value="Conv_toolbar_arrow_ne"/> + <floater.string name="return_icon" value="Conv_toolbar_arrow_sw"/> + <floater.string name="participant_added" value="[NAME] foi convidado para a conversa."/> + <floater.string name="multiple_participants_added" value="[NAME] foram convidados para a conversa."/> + <floater.string name="tooltip_to_separate_window" value="Mover esta conversa para uma janela separada"/> + <floater.string name="tooltip_to_main_window" value="Mover esta conversa para a janela principal"/> + <floater.string name="start_call_button_tooltip" value="Abrir conexão por voz"/> + <floater.string name="end_call_button_tooltip" value="Encerrar conexão por voz"/> + <floater.string name="expcol_button_not_tearoff_tooltip" value="Recolher este painel"/> + <floater.string name="expcol_button_tearoff_and_expanded_tooltip" value="Recolher lista de participantes"/> + <floater.string name="expcol_button_tearoff_and_collapsed_tooltip" value="Expandir a lista de participantes"/> + <view name="contents_view"> + <layout_stack name="main_stack"> + <layout_panel name="toolbar_panel"> + <menu_button name="view_options_btn" tool_tip="Opções de exibição/ordenação"/> + <menu_button name="gear_btn" tool_tip="Ações nas pessoas selecionadas"/> + <button name="add_btn" tool_tip="Adicionar alguém a esta conversa"/> + <button name="voice_call_btn" tool_tip="Abrir conexão por voz"/> + <button name="close_btn" tool_tip="Encerrar esta conversa"/> + <button name="expand_collapse_btn" tool_tip="Recolher/expandir este painel"/> + </layout_panel> + <layout_panel name="body_panel"> + <layout_stack name="im_panels"> + <layout_panel name="right_part_holder"> + <panel name="trnsAndChat_panel"> + <layout_stack name="translate_and_chat_stack"> + <layout_panel name="translate_chat_checkbox_lp"> + <check_box label="Traduzir bate-papo" name="translate_chat_checkbox"/> + </layout_panel> + </layout_stack> + </panel> + </layout_panel> + </layout_stack> + </layout_panel> + <layout_panel name="chat_layout_panel"> + <layout_stack name="input_panels"> + <layout_panel name="input_editor_layout_panel"> + <chat_editor label="Para" name="chat_editor"/> + </layout_panel> + <layout_panel name="input_button_layout_panel"> + <button name="minz_btn" tool_tip="Mostrar/ocultar painel de mensagens"/> + </layout_panel> + </layout_stack> + </layout_panel> + </layout_stack> + </view> </floater> diff --git a/indra/newview/skins/default/xui/pt/floater_incoming_call.xml b/indra/newview/skins/default/xui/pt/floater_incoming_call.xml index 6344258fa0..1e86f847ad 100644 --- a/indra/newview/skins/default/xui/pt/floater_incoming_call.xml +++ b/indra/newview/skins/default/xui/pt/floater_incoming_call.xml @@ -25,9 +25,9 @@ Sair do [CURRENT_CHAT] e entrar neste bate-papo de voz? </floater.string> <text name="question"> - Sair do [CURRENT_CHAT] e entrar neste bate-papo? + Se você atender, será desconectado de suas conversas de voz atuais. </text> - <button label="Aceitar" label_selected="Aceitar" name="Accept"/> - <button label="Rejeitar" label_selected="Rejeitar" name="Reject"/> - <button label="Enviar MI" name="Start IM"/> + <button label="Atender" label_selected="Atender" name="Accept"/> + <button label="Ignorar" label_selected="Ignorar" name="Reject"/> + <button label="Iniciar MI em vez disso" name="Start IM"/> </floater> diff --git a/indra/newview/skins/default/xui/pt/floater_pathfinding_console.xml b/indra/newview/skins/default/xui/pt/floater_pathfinding_console.xml index 182f2513e0..d04cf2a173 100644 --- a/indra/newview/skins/default/xui/pt/floater_pathfinding_console.xml +++ b/indra/newview/skins/default/xui/pt/floater_pathfinding_console.xml @@ -71,7 +71,7 @@ <text name="show_label"> Exibir: </text> - <check_box label="Mundo" name="show_world"/> + <check_box label="Testar" name="show_world"/> <check_box label="Apenas móveis" name="show_world_movables_only"/> <check_box label="Navmesh" name="show_navmesh"/> <text name="show_walkability_label"> 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 a75cf34a94..ba4ef0afde 100644 --- a/indra/newview/skins/default/xui/pt/floater_texture_ctrl.xml +++ b/indra/newview/skins/default/xui/pt/floater_texture_ctrl.xml @@ -19,7 +19,7 @@ <button label="Padrão" label_selected="Padrão" name="Default"/> <button label="Branco" label_selected="Branco" name="Blank"/> <button label="Nenhum" label_selected="Nenhum" name="None"/> - <check_box initial_value="true" label="Visualização em tempo real" name="apply_immediate_check"/> + <check_box initial_value="true" label="Inscrever-se agora" name="apply_immediate_check"/> <text name="preview_disabled" value="Visualização desativada"/> <filter_editor label="Filtrar texturas" name="inventory search editor"/> <check_box initial_value="false" label="Exibir pastas" name="show_folders_check"/> diff --git a/indra/newview/skins/default/xui/pt/floater_voice_chat_volume.xml b/indra/newview/skins/default/xui/pt/floater_voice_chat_volume.xml new file mode 100644 index 0000000000..de7aa2df12 --- /dev/null +++ b/indra/newview/skins/default/xui/pt/floater_voice_chat_volume.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="floater_voice_volume" title="VOLUME DO BATE-PAPO DE VOZ"> + <slider label="Bate-papo de voz" name="chat_voice_volume"/> +</floater> diff --git a/indra/newview/skins/default/xui/pt/floater_voice_effect.xml b/indra/newview/skins/default/xui/pt/floater_voice_effect.xml index b29ca3d699..71d3c33ae5 100644 --- a/indra/newview/skins/default/xui/pt/floater_voice_effect.xml +++ b/indra/newview/skins/default/xui/pt/floater_voice_effect.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater label="Lugares" name="voice_effects" title="EFEITOS DE VOZ"> +<floater label="Lugares" name="voice_effects" title="AMOSTRA DE DISTORÇÃO DE VOZ"> <string name="no_voice_effect"> (Não distorcer voz) </string> diff --git a/indra/newview/skins/default/xui/pt/floater_voice_volume.xml b/indra/newview/skins/default/xui/pt/floater_voice_volume.xml new file mode 100644 index 0000000000..dae47a99ae --- /dev/null +++ b/indra/newview/skins/default/xui/pt/floater_voice_volume.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<!-- + Not can_close / no title to avoid window chrome + Single instance - only have one at a time, recycle it each spawn +--> +<floater name="floater_voice_volume" title="VOLUME DE VOZ"> + <slider name="volume_slider" tool_tip="Volume de voz" value="0.5"/> +</floater> diff --git a/indra/newview/skins/default/xui/pt/menu_cof_gear.xml b/indra/newview/skins/default/xui/pt/menu_cof_gear.xml index 8716992a5e..b59895573e 100644 --- a/indra/newview/skins/default/xui/pt/menu_cof_gear.xml +++ b/indra/newview/skins/default/xui/pt/menu_cof_gear.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<menu name="Gear COF"> +<toggleable_menu name="Gear COF"> <menu label="Roupas novas" name="COF.Gear.New_Clothes"/> - <menu label="Nova parte do corpo" name="COF.Geear.New_Body_Parts"/> -</menu> + <menu label="Novas partes do corpo" name="COF.Gear.New_Body_Parts"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/pt/menu_conversation.xml b/indra/newview/skins/default/xui/pt/menu_conversation.xml new file mode 100644 index 0000000000..01316b887d --- /dev/null +++ b/indra/newview/skins/default/xui/pt/menu_conversation.xml @@ -0,0 +1,31 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_conversation_participant"> + <menu_item_call label="Encerrar conversa" name="close_conversation"/> + <menu_item_call label="Abrir conversa de voz" name="open_voice_conversation"/> + <menu_item_call label="Desconectar de voz" name="disconnect_from_voice"/> + <menu_item_call label="Exibir perfil" name="view_profile"/> + <menu_item_call label="MI" name="im"/> + <menu_item_call label="Oferecer teletransporte" name="offer_teleport"/> + <menu_item_call label="Chamada de voz" name="voice_call"/> + <menu_item_call label="Histórico de bate-papo..." name="chat_history"/> + <menu_item_call label="Adicionar amigo" name="add_friend"/> + <menu_item_call label="Remover amigo" name="remove_friend"/> + <menu_item_call label="Remover amigos" name="remove_friends"/> + <menu_item_call label="Convidar para entrar no grupo..." name="invite_to_group"/> + <menu_item_call label="Mais zoom" name="zoom_in"/> + <menu_item_call label="Mapa" name="map"/> + <menu_item_call label="Compartilhar" name="share"/> + <menu_item_call label="Pagar" name="pay"/> + <menu_item_check label="Bloquear voz" name="block_unblock"/> + <menu_item_check label="Bloquear texto" name="MuteText"/> + <menu_item_call label="Perfil do grupo" name="group_profile"/> + <menu_item_call label="Ativar grupo" name="activate_group"/> + <menu_item_call label="Sair do grupo" name="leave_group"/> + <context_menu label="Opções do moderador >" name="Moderator Options"> + <menu_item_check label="Pode bater papo por escrito" name="AllowTextChat"/> + <menu_item_call label="Silenciar este participante" name="ModerateVoiceMuteSelected"/> + <menu_item_call label="Desfazer silenciar deste participante" name="ModerateVoiceUnMuteSelected"/> + <menu_item_call label="Silenciar todos" name="ModerateVoiceMute"/> + <menu_item_call label="Desfazer silenciar para todos" name="ModerateVoiceUnmute"/> + </context_menu> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/pt/menu_conversation_log_gear.xml b/indra/newview/skins/default/xui/pt/menu_conversation_log_gear.xml new file mode 100644 index 0000000000..616e6db46e --- /dev/null +++ b/indra/newview/skins/default/xui/pt/menu_conversation_log_gear.xml @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="Conversation Context Menu"> + <menu_item_call label="MI..." name="IM"/> + <menu_item_call label="Chamada de voz..." name="Call"/> + <menu_item_call label="Abrir histórico de bate-papo..." name="Chat history"/> + <menu_item_call label="Exibir perfil" name="View Profile"/> + <menu_item_call label="Oferecer teletransporte" name="teleport"/> + <menu_item_call label="Adicionar amigo" name="add_friend"/> + <menu_item_call label="Remover amigo" name="remove_friend"/> + <menu_item_call label="Convidar para entrar no grupo..." name="Invite"/> + <menu_item_call label="Mapa" name="Map"/> + <menu_item_call label="Compartilhar" name="Share"/> + <menu_item_call label="Pagar" name="Pay"/> + <menu_item_check label="Bloquear/desbloquear" name="Block/Unblock"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/pt/menu_conversation_log_view.xml b/indra/newview/skins/default/xui/pt/menu_conversation_log_view.xml new file mode 100644 index 0000000000..cab81175a0 --- /dev/null +++ b/indra/newview/skins/default/xui/pt/menu_conversation_log_view.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_conversation_view"> + <menu_item_check label="Ordenar por nome" name="sort_by_name"/> + <menu_item_check label="Ordenar por data" name="sort_by_date"/> + <menu_item_check label="Ordenar com amigos acima" name="sort_by_friends"/> + <menu_item_call label="Exibir histórico de Bate-papo local..." name="view_nearby_chat_history"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/pt/menu_im_conversation.xml b/indra/newview/skins/default/xui/pt/menu_im_conversation.xml new file mode 100644 index 0000000000..a8434dc336 --- /dev/null +++ b/indra/newview/skins/default/xui/pt/menu_im_conversation.xml @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="Conversation Gear Menu"> + <menu_item_call label="Exibir perfil" name="View Profile"/> + <menu_item_call label="Adicionar amigo" name="Add Friend"/> + <menu_item_call label="Remover amigo" name="remove_friend"/> + <menu_item_call label="Oferecer teletransporte" name="offer_teleport"/> + <menu_item_call label="Convidar para entrar no grupo..." name="invite_to_group"/> + <menu_item_call label="Histórico de bate-papo..." name="chat_history"/> + <menu_item_call label="Mais zoom" name="zoom_in"/> + <menu_item_call label="Mapa" name="map"/> + <menu_item_call label="Compartilhar" name="Share"/> + <menu_item_call label="Pagar" name="Pay"/> + <menu_item_check label="Bloquear voz" name="Block/Unblock"/> + <menu_item_check label="Bloquear texto" name="MuteText"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/pt/menu_im_session_showmodes.xml b/indra/newview/skins/default/xui/pt/menu_im_session_showmodes.xml new file mode 100644 index 0000000000..398b890f66 --- /dev/null +++ b/indra/newview/skins/default/xui/pt/menu_im_session_showmodes.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_modes"> + <menu_item_check label="Exibição compacta" name="compact_view"/> + <menu_item_check label="Exibição expandida" name="expanded_view"/> + <menu_item_check label="Mostrar hora" name="IMShowTime"/> + <menu_item_check label="Mostrar nomes em conversas individuais" name="IMShowNamesForP2PConv"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/pt/menu_object_icon.xml b/indra/newview/skins/default/xui/pt/menu_object_icon.xml index 7af760a6ee..df224a88fa 100644 --- a/indra/newview/skins/default/xui/pt/menu_object_icon.xml +++ b/indra/newview/skins/default/xui/pt/menu_object_icon.xml @@ -2,4 +2,6 @@ <menu name="Object Icon Menu"> <menu_item_call label="Perfil do objeto..." name="Object Profile"/> <menu_item_call label="Bloquear..." name="Block"/> + <menu_item_call label="Mostrar no mapa" name="show_on_map"/> + <menu_item_call label="Teletransportar para lugar do objeto" name="teleport_to_object"/> </menu> diff --git a/indra/newview/skins/default/xui/pt/menu_outfit_gear.xml b/indra/newview/skins/default/xui/pt/menu_outfit_gear.xml index 894f1d741c..3602bdaac4 100644 --- a/indra/newview/skins/default/xui/pt/menu_outfit_gear.xml +++ b/indra/newview/skins/default/xui/pt/menu_outfit_gear.xml @@ -23,6 +23,8 @@ <menu_item_call label="Novo cabelo" name="New Hair"/> <menu_item_call label="Novos olhos" name="New Eyes"/> </menu> + <menu_item_call label="Expandir todas as pastas" name="expand"/> + <menu_item_call label="Recolher todas as pastas" name="collapse"/> <menu_item_call label="Renomear look" name="rename"/> <menu_item_call label="Excluir visual" name="delete_outfit"/> </toggleable_menu> diff --git a/indra/newview/skins/default/xui/pt/menu_participant_view.xml b/indra/newview/skins/default/xui/pt/menu_participant_view.xml new file mode 100644 index 0000000000..b61108cf54 --- /dev/null +++ b/indra/newview/skins/default/xui/pt/menu_participant_view.xml @@ -0,0 +1,13 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="participant_manu_view"> + <menu_item_check label="Ordenar conversas por tipo" name="sort_sessions_by_type"/> + <menu_item_check label="Ordenar conversas por nome" name="sort_sessions_by_name"/> + <menu_item_check label="Ordenar conversas por atividade recente" name="sort_sessions_by_recent"/> + <menu_item_check label="Ordenar participantes por nome" name="sort_participants_by_name"/> + <menu_item_check label="Ordenar participantes por atividade recente" name="sort_participants_by_recent"/> + <menu_item_call label="Preferências de bate-papo..." name="chat_preferences"/> + <menu_item_call label="Preferências de privacidade..." name="privacy_preferences"/> + <menu_item_check label="Registro de conversas..." name="Conversation"/> + <menu_item_check label="Traduzir Bate-papo local" name="Translate_chat"/> + <menu_item_check label="Configurações de tradução..." name="Translation_settings"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/pt/menu_people_blocked_gear.xml b/indra/newview/skins/default/xui/pt/menu_people_blocked_gear.xml new file mode 100644 index 0000000000..8bbde9b38c --- /dev/null +++ b/indra/newview/skins/default/xui/pt/menu_people_blocked_gear.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_blocked_gear"> + <menu_item_call label="Desbloquear" name="unblock"/> + <menu_item_call label="Perfil..." name="profile"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/pt/menu_people_blocked_plus.xml b/indra/newview/skins/default/xui/pt/menu_people_blocked_plus.xml new file mode 100644 index 0000000000..e69935995c --- /dev/null +++ b/indra/newview/skins/default/xui/pt/menu_people_blocked_plus.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_blocked_plus"> + <menu_item_call label="Bloquear residente por nome..." name="block_resident_by_name"/> + <menu_item_call label="Bloquear objeto por nome" name="block_object_by_name"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/pt/menu_people_blocked_view.xml b/indra/newview/skins/default/xui/pt/menu_people_blocked_view.xml new file mode 100644 index 0000000000..b80d683c7b --- /dev/null +++ b/indra/newview/skins/default/xui/pt/menu_people_blocked_view.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_blocked_view"> + <menu_item_check label="Ordenar por nome" name="sort_by_name"/> + <menu_item_check label="Ordenar por tipo" name="sort_by_type"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/pt/menu_people_friends_view.xml b/indra/newview/skins/default/xui/pt/menu_people_friends_view.xml new file mode 100644 index 0000000000..46caeae310 --- /dev/null +++ b/indra/newview/skins/default/xui/pt/menu_people_friends_view.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_group_plus"> + <menu_item_check label="Ordenar por nome" name="sort_name"/> + <menu_item_check label="Ordenar por status" name="sort_status"/> + <menu_item_check label="Exibir Ãcones de pessoas" name="view_icons"/> + <menu_item_check label="Exibir permissões concedidas" name="view_permissions"/> + <menu_item_check label="Exibir registro de conversas..." name="view_conversation"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/pt/menu_people_groups.xml b/indra/newview/skins/default/xui/pt/menu_people_groups.xml index 9a924ad7b9..2ba7af17cd 100644 --- a/indra/newview/skins/default/xui/pt/menu_people_groups.xml +++ b/indra/newview/skins/default/xui/pt/menu_people_groups.xml @@ -2,7 +2,7 @@ <menu name="menu_group_plus"> <menu_item_call label="Ver dados" name="View Info"/> <menu_item_call label="Bate-papo" name="Chat"/> - <menu_item_call label="Ligar" name="Call"/> + <menu_item_call label="Chamada de voz" name="Call"/> <menu_item_call label="Ativar" name="Activate"/> <menu_item_call label="Sair" name="Leave"/> </menu> diff --git a/indra/newview/skins/default/xui/pt/menu_people_groups_view.xml b/indra/newview/skins/default/xui/pt/menu_people_groups_view.xml new file mode 100644 index 0000000000..637e591ae1 --- /dev/null +++ b/indra/newview/skins/default/xui/pt/menu_people_groups_view.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_group_plus"> + <menu_item_check label="Mostrar Ãcones de grupos" name="Display Group Icons"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/pt/menu_people_nearby.xml b/indra/newview/skins/default/xui/pt/menu_people_nearby.xml index 7c720f262b..51464fed68 100644 --- a/indra/newview/skins/default/xui/pt/menu_people_nearby.xml +++ b/indra/newview/skins/default/xui/pt/menu_people_nearby.xml @@ -1,13 +1,16 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <context_menu name="Avatar Context Menu"> - <menu_item_call label="Ver perfil" name="View Profile"/> - <menu_item_call label="Adicionar amigo..." name="Add Friend"/> - <menu_item_call label="Remover amigo..." name="Remove Friend"/> - <menu_item_call label="MI" name="IM"/> - <menu_item_call label="Ligar" name="Call"/> - <menu_item_call label="Mapa" name="Map"/> - <menu_item_call label="Compartilhar" name="Share"/> - <menu_item_call label="Pagar" name="Pay"/> - <menu_item_check label="Bloquear/desbloquear" name="Block/Unblock"/> - <menu_item_call label="Teletransportar?" name="teleport"/> + <menu_item_call label="Exibir perfil" name="view_profile"/> + <menu_item_call label="MI" name="im"/> + <menu_item_call label="Oferecer teletransporte" name="offer_teleport"/> + <menu_item_call label="Chamada de voz" name="voice_call"/> + <menu_item_call label="Exibir histórico de bate-papo..." name="chat_history"/> + <menu_item_call label="Adicionar amigo" name="add_friend"/> + <menu_item_call label="Remover amigo" name="remove_friend"/> + <menu_item_call label="Convidar para entrar no grupo..." name="invite_to_group"/> + <menu_item_call label="Mais zoom" name="zoom_in"/> + <menu_item_call label="Mapa" name="map"/> + <menu_item_call label="Compartilhar" name="share"/> + <menu_item_call label="Pagar" name="pay"/> + <menu_item_check label="Bloquear/desbloquear" name="block_unblock"/> </context_menu> diff --git a/indra/newview/skins/default/xui/pt/menu_people_nearby_multiselect.xml b/indra/newview/skins/default/xui/pt/menu_people_nearby_multiselect.xml index 79edb96b1c..7f3c6ace27 100644 --- a/indra/newview/skins/default/xui/pt/menu_people_nearby_multiselect.xml +++ b/indra/newview/skins/default/xui/pt/menu_people_nearby_multiselect.xml @@ -1,10 +1,10 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <context_menu name="Multi-Selected People Context Menu"> - <menu_item_call label="Adicionar amigo..." name="Add Friends"/> - <menu_item_call label="Remover amigo..." name="Remove Friend"/> - <menu_item_call label="MI" name="IM"/> - <menu_item_call label="Ligar" name="Call"/> - <menu_item_call label="Compartilhar" name="Share"/> - <menu_item_call label="Pagar" name="Pay"/> - <menu_item_call label="Teletransportar?" name="teleport"/> + <menu_item_call label="Adicionar amigo..." name="add_friends"/> + <menu_item_call label="Remover amigo..." name="remove_friends"/> + <menu_item_call label="MI" name="im"/> + <menu_item_call label="Ligar" name="call"/> + <menu_item_call label="Compartilhar" name="share"/> + <menu_item_call label="Pagar" name="pay"/> + <menu_item_call label="Oferecer teletransporte" name="offer_teleport"/> </context_menu> diff --git a/indra/newview/skins/default/xui/pt/menu_people_nearby_view.xml b/indra/newview/skins/default/xui/pt/menu_people_nearby_view.xml new file mode 100644 index 0000000000..bce015e732 --- /dev/null +++ b/indra/newview/skins/default/xui/pt/menu_people_nearby_view.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_group_plus"> + <menu_item_check label="Ordenar por conversas mais recentes" name="sort_by_recent_speakers"/> + <menu_item_check label="Ordenar por nome" name="sort_name"/> + <menu_item_check label="Ordenar por distância" name="sort_distance"/> + <menu_item_check label="Exibir Ãcones de pessoas" name="view_icons"/> + <menu_item_check label="Exibir mapa" name="view_map"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/pt/menu_people_recent_view.xml b/indra/newview/skins/default/xui/pt/menu_people_recent_view.xml new file mode 100644 index 0000000000..e4b368fe14 --- /dev/null +++ b/indra/newview/skins/default/xui/pt/menu_people_recent_view.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_group_plus"> + <menu_item_check label="Ordenar por mais recente" name="sort_most"/> + <menu_item_check label="Ordenar por nome" name="sort_name"/> + <menu_item_check label="Exibir Ãcones de pessoas" name="view_icons"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/pt/menu_url_agent.xml b/indra/newview/skins/default/xui/pt/menu_url_agent.xml index ba5e055124..aa0a426405 100644 --- a/indra/newview/skins/default/xui/pt/menu_url_agent.xml +++ b/indra/newview/skins/default/xui/pt/menu_url_agent.xml @@ -1,6 +1,8 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <context_menu name="Url Popup"> - <menu_item_call label="Mostrar perfil de residente" name="show_agent"/> + <menu_item_call label="Exibir perfil" name="show_agent"/> + <menu_item_call label="Enviar MI..." name="send_im"/> + <menu_item_call label="Adicionar amigo..." name="add_friend"/> <menu_item_call label="Copiar nome para área de transferência" name="url_copy_label"/> <menu_item_call label="Copiar SLurl para área de transferência" name="url_copy"/> </context_menu> diff --git a/indra/newview/skins/default/xui/pt/menu_url_objectim.xml b/indra/newview/skins/default/xui/pt/menu_url_objectim.xml index c197444181..247a92567a 100644 --- a/indra/newview/skins/default/xui/pt/menu_url_objectim.xml +++ b/indra/newview/skins/default/xui/pt/menu_url_objectim.xml @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <context_menu name="Url Popup"> - <menu_item_call label="Mostrar informações sobre o objeto" name="show_object"/> + <menu_item_call label="Perfil do objeto..." name="show_object"/> <menu_item_call label="Mostrar no mapa" name="show_on_map"/> <menu_item_call label="Teletransportar para lugar do objeto" name="teleport_to_object"/> <menu_item_call label="Copiar nome do objeto para área de transferência" name="url_copy_label"/> diff --git a/indra/newview/skins/default/xui/pt/menu_viewer.xml b/indra/newview/skins/default/xui/pt/menu_viewer.xml index ca378c1b58..e54d49fc45 100644 --- a/indra/newview/skins/default/xui/pt/menu_viewer.xml +++ b/indra/newview/skins/default/xui/pt/menu_viewer.xml @@ -16,10 +16,7 @@ <menu_item_call label="Parar minha animação" name="Stop Animating My Avatar"/> <menu_item_call label="Andar/correr/voar..." name="Walk / run / fly"/> </menu> - <menu label="Status" name="Status"> - <menu_item_call label="Ausente" name="Set Away"/> - <menu_item_call label="Ocupado" name="Set Busy"/> - </menu> + <menu label="Status" name="Status"/> <menu_item_call label="Comprar L$..." name="Buy and Sell L$"/> <menu_item_call label="Caixa de saÃda do lojista..." name="MerchantOutbox"/> <menu_item_call label="Painel da conta..." name="Manage My Account"> @@ -32,14 +29,18 @@ <menu_item_call label="Sair do [APP_NAME]" name="Quit"/> </menu> <menu label="Comunicar" name="Communicate"> - <menu_item_check label="Bate-papo..." name="Nearby Chat"/> + <menu_item_check label="Conversas..." name="Conversations"/> + <menu_item_check label="Bate-papo local..." name="Nearby Chat"/> <menu_item_check label="Falar" name="Speak"/> - <menu_item_check label="Configurações de voz..." name="Nearby Voice"/> - <menu_item_check label="Distorção de voz..." name="ShowVoice"/> + <menu label="Distorção de voz" name="VoiceMorphing"> + <menu_item_check label="Não distorcer voz" name="NoVoiceMorphing"/> + <menu_item_check label="Visualizar..." name="Preview"/> + <menu_item_call label="Assinar..." name="Subscribe"/> + </menu> <menu_item_check label="Gestos..." name="Gestures"/> - <menu_item_call label="Amigos" name="My Friends"/> - <menu_item_call label="Grupos" name="My Groups"/> - <menu_item_call label="Pessoas próximas" name="Active Speakers"/> + <menu_item_check label="Amigos" name="My Friends"/> + <menu_item_check label="Grupos" name="My Groups"/> + <menu_item_check label="Pessoas próximas" name="Active Speakers"/> <menu_item_call label="Lista de bloqueados" name="Block List"/> </menu> <menu label="Mundo" name="World"> @@ -286,7 +287,7 @@ <menu label="Rendering" name="Rendering"> <menu_item_check label="Axes" name="Axes"/> <menu_item_check label="Wireframe" name="Wireframe"/> - <menu_item_check label="Iluminação e sombras" name="Lighting and Shadows"/> + <menu_item_check label="Iluminação e sombras" name="Advanced Lighting Model"/> <menu_item_check label="Sombras da projeção do sol/lua" name="Shadows from Sun/Moon/Projectors"/> <menu_item_check label="SSAO e sombra suave" name="SSAO and Shadow Smoothing"/> <menu_item_check label="Máscaras alpha automáticas (adiadas)" name="Automatic Alpha Masks (deferred)"/> diff --git a/indra/newview/skins/default/xui/pt/notifications.xml b/indra/newview/skins/default/xui/pt/notifications.xml index ff7382bf80..d9f5e48745 100644 --- a/indra/newview/skins/default/xui/pt/notifications.xml +++ b/indra/newview/skins/default/xui/pt/notifications.xml @@ -510,6 +510,24 @@ Consultar [_URL] para mais informações? </url> <usetemplate ignoretext="Meu driver gráfico está desatualizado" name="okcancelignore" notext="Não" yestext="Sim"/> </notification> + <notification name="AMDOldDriver"> + 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://support.amd.com/us/Pages/AMDSupportHub.aspx + </url> + <usetemplate ignoretext="Meu driver gráfico está desatualizado" name="okcancelignore" notext="Não" yestext="Sim"/> + </notification> + <notification name="NVIDIAOldDriver"> + 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.nvidia.com.br/Download/index.aspx?lang=br + </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. @@ -1533,10 +1551,13 @@ Para instalar a atualização, será preciso reiniciar o [APP_NAME]. Não é possÃvel oferecer amizade neste momento. Por favor, tente novamente em breve. <usetemplate name="okbutton" yestext="OK"/> </notification> - <notification name="BusyModeSet"> - Modo ocupado ativado. -O bate-papo e MIs não serão exibidos. MIs enviadas para você receberão sua resposta de modo ocupado. Todas as ofertas de teletransporte serão recusadas. Todas as ofertas de inventário serão colocadas na Lixeira. - <usetemplate ignoretext="Passar meu status para o modo ocupado" name="okignore" yestext="OK"/> + <notification name="DoNotDisturbModeSet"> + Não perturbe está ativado. Você não será notificado de comunicações recebidas. + +- Outros residentes receberão a sua resposta de Não perturbe (definida em Preferências > Geral). +- As ofertas de teletransporte serão recusadas. +- Chamadas de voz serão recusadas. + <usetemplate ignoretext="Altero meu status para o modo Não perturbe" name="okignore" yestext="OK"/> </notification> <notification name="JoinedTooManyGroupsMember"> Você atingiu o limite máximo de grupos. Saia de outro grupo para poder entrar nesse ou recuse o convite. @@ -2022,6 +2043,10 @@ Mover para o inventário o(s) item(s)? Deseja abrir o [http://secondlife.com/account/ Painel] para ver o histórico da sua conta? <usetemplate ignoretext="Abrir o navegador para acessar minha conta" name="okcancelignore" notext="Cancelar" yestext="Ir para a página"/> </notification> + <notification name="ConfirmAddingChatParticipants"> + Quando você adiciona uma pessoa a uma conversa existente, uma nova conversa é criada. Todos os participantes recebem notificações sobre a nova conversa. + <usetemplate ignoretext="Confirme a inclusão de participantes no bate-papo" name="okcancelignore" notext="Cancelar" yestext="Ok"/> + </notification> <notification name="ConfirmQuit"> Tem certeza que deseja sair? <usetemplate ignoretext="Confirmar antes de sair" name="okcancelignore" notext="Não sair" yestext="Sair"/> @@ -2096,14 +2121,14 @@ Você deseja substituÃ-lo pelo objeto selecionado? <button ignore="Never Replace" name="No" text="Não"/> </form> </notification> - <notification label="Aviso de Modo Ocupado" name="BusyModePay"> - Você está no modo Ocupado, o que significa que você não receberá quaisquer itens oferecidos em troca deste pagamento. + <notification label="Aviso de modo Não perturbe" name="DoNotDisturbModePay"> + Você ativou o Não perturbe. Você não receberá qualquer item oferecido em troca deste pagamento. -Você gostaria de deixar o modo Ocupado antes de completar esta transação? +Deseja desativar o Não perturbe antes de concluir esta transação? <form name="form"> - <ignore name="ignore" save_option="true" text="Estou prestes a pagar alguém ou um objeto no modo ocupado"/> - <button ignore="Always leave Busy Mode" name="Yes" text="Sim"/> - <button ignore="Never leave Busy Mode" name="No" text="Não"/> + <ignore name="ignore" text="Estou prestes a pagar alguém ou um objeto no modo Não perturbe"/> + <button ignore="Sempre manter no modo Não perturbe" name="Yes" text="OK"/> + <button ignore="Nunca sair do modo Não perturbe" name="No" text="Cancelar"/> </form> </notification> <notification name="ConfirmDeleteProtectedCategory"> @@ -2238,11 +2263,8 @@ Inclua um link para facilitar o acesso para visitantes. Teste o link na barra de <notification name="GroupNotice"> Assunto: [SUBJECT], Mensagem: [MESSAGE] </notification> - <notification name="FriendOnline"> - <nolink>[NAME]</nolink> está online - </notification> - <notification name="FriendOffline"> - <nolink>[NAME]</nolink> está offline + <notification name="FriendOnlineOffline"> + <nolink>[NAME]</nolink> está [STATUS] </notification> <notification name="AddSelfFriend"> Você é o máximo! Mesmo assim, não dá para adicionar a si mesmo(a) como amigo(a). @@ -2467,13 +2489,6 @@ Logo, não é possÃvel voar aqui. <notification name="DynamicPathfindingDisabled"> O pathfinding dinâmico não está habilitado nesta região. Os objetos com script usando chamadas LSL de pathfinding podem não operar como o esperado na região. </notification> - <notification name="PathfindingRebakeNavmesh"> - A alteração de determinados objetos nesta região pode resultar no comportamento incorreto de outros objeto em movimento. Para fazer com que os objetos em movimento se comportem corretamente, clique no botão “Recarregar regiãoâ€. Escolha “Ajuda†para obter mais informações. - <url name="url"> - http://wiki.secondlife.com/wiki/Pathfinding_Tools_in_the_Second_Life_Viewer - </url> - <usetemplate helptext="Ajuda" ignoretext="A alteração de determinados objetos nesta região pode resultar no comportamento incorreto de outros objeto em movimento." name="okhelpignore" yestext="OK"/> - </notification> <notification name="PathfindingCannotRebakeNavmesh"> Erro. Pode haver um erro de rede ou do servidor, ou você pode não ter direitos de construção. Às vezes, fazer login e logout novamente resolve este problema. <usetemplate name="okbutton" yestext="OK"/> @@ -2736,7 +2751,7 @@ OK? <notification name="ScriptQuestionCaution"> Aviso: O objeto '<nolink>[OBJECTNAME]</nolink>' 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. +Não conceda acesso se você não entender completamente por que ele deseja acessar sua conta. <form name="form"> <button name="Grant" text="Permitir acesso total"/> <button name="Deny" text="Negar"/> @@ -3310,4 +3325,633 @@ Tentativa cancelada. Você está excluindo [NUM_ITEMS] itens. Tem certeza de que deseja continuar? <usetemplate ignoretext="Tem certeza de que deseja excluir múltiplos itens?" name="okcancelignore" notext="Não" yestext="Sim"/> </notification> + <notification name="AvatarFrozen"> + [AV_FREEZER] congelou você. Você não pode se mover ou interagir com o mundo. + </notification> + <notification name="AvatarFrozenDuration"> + [AV_FREEZER] congelou você por [AV_FREEZE_TIME] segundos. Você não pode se mover ou interagir com o mundo. + </notification> + <notification name="YouFrozeAvatar"> + Avatar congelado. + </notification> + <notification name="AvatarHasUnFrozenYou"> + [AV_FREEZER] descongelou você. + </notification> + <notification name="AvatarUnFrozen"> + Avatar descongelado. + </notification> + <notification name="AvatarFreezeFailure"> + O congelamento falhou porque você não tem permissão de administrador para esse lote. + </notification> + <notification name="AvatarFreezeThaw"> + Seu congelamento expirou, vá cuidar da sua vida. + </notification> + <notification name="AvatarCantFreeze"> + Não é possÃvel congelar esse usuário. + </notification> + <notification name="NowOwnObject"> + Agora você é o proprietário do objeto [OBJECT_NAME] + </notification> + <notification name="CantRezOnLand"> + Não é possÃvel renderizar objeto em [OBJECT_POS] porque o proprietário do terreno não permite. Use a ferramenta de terrenos para ver a propriedade do terreno. + </notification> + <notification name="RezFailTooManyRequests"> + O objeto não pode ser renderizado porque há muitas solicitações. + </notification> + <notification name="SitFailCantMove"> + Você não pode sentar porque não pode se mover no momento. + </notification> + <notification name="SitFailNotAllowedOnLand"> + Você não pode sentar porque não está autorizado a sentar nesse terreno. + </notification> + <notification name="SitFailNotSameRegion"> + Tente chegar mais perto. Não é possÃvel sentar no objeto porque +ele não está na mesma região que você. + </notification> + <notification name="NoNewObjectRegionFull"> + Não foi possÃvel criar um novo objeto. A região está cheia. + </notification> + <notification name="FailedToPlaceObject"> + Falha ao posicionar objeto em local especÃfico. Tente novamente. + </notification> + <notification name="NoOwnNoGardening"> + Você não pode criar árvores e grama em terrenos que não são sua propriedade. + </notification> + <notification name="NoCopyPermsNoObject"> + A cópia falhou porque você não está autorizado a copiar o objeto '[OBJ_NAME]'. + </notification> + <notification name="NoTransPermsNoObject"> + A cópia falhou porque o objeto '[OBJ_NAME]' não pode ser transferido para você. + </notification> + <notification name="AddToNavMeshNoCopy"> + A cópia falhou porque o objeto '[OBJ_NAME]' contribui para o navmesh. + </notification> + <notification name="DupeWithNoRootsSelected"> + Duplicar sem objetos raiz selecionados. + </notification> + <notification name="CantDupeCuzRegionIsFull"> + Não é possÃvel duplicar objetos porque a região está cheia. + </notification> + <notification name="CantDupeCuzParcelNotFound"> + Não é possÃvel duplicar os objetos - não é possÃvel encontrar o lote em que eles estão. + </notification> + <notification name="CantCreateCuzParcelFull"> + Não é possÃvel criar objeto porque +o lote está cheio. + </notification> + <notification name="RezAttemptFailed"> + Falha na tentativa de renderizar um objeto. + </notification> + <notification name="ToxicInvRezAttemptFailed"> + Não é possÃvel criar um item que causou problemas a essa região. + </notification> + <notification name="InvItemIsBlacklisted"> + Esse item do inventário foi incluÃdo na lista. + </notification> + <notification name="NoCanRezObjects"> + No momento, você não está autorizado a criar objetos. + </notification> + <notification name="LandSearchBlocked"> + Pesquisa de terreno bloqueada. +Você realizou muitas pesquisas de terreno muito rápido. +Tente novamente em instantes. + </notification> + <notification name="NotEnoughResourcesToAttach"> + Não há recursos de script disponÃveis suficientes para anexar objeto! + </notification> + <notification name="YouDiedAndGotTPHome"> + Você morreu e foi teletransportado para seu inÃcio + </notification> + <notification name="EjectComingSoon"> + Você não tem mais permissão para ficar aqui e tem [EJECT_TIME] segundos para sair. + </notification> + <notification name="NoEnterServerFull"> + Você não pode entrar nesta região porque +o servidor está cheio. + </notification> + <notification name="SaveBackToInvDisabled"> + Salvar no inventário foi desativado. + </notification> + <notification name="NoExistNoSaveToContents"> + Não é possÃvel salvar '[OBJ_NAME]' no conteúdo do objeto porque o objeto do qual ele foi renderizado não existe mais. + </notification> + <notification name="NoModNoSaveToContents"> + Não é possÃvel salvar '[OBJ_NAME]' no conteúdo do objeto porque você não tem permissão para modificar o objeto '[DEST_NAME]'. + </notification> + <notification name="NoSaveBackToInvDisabled"> + Não é possÃvel salvar '[OBJ_NAME]' no inventário -- essa operação foi desativada. + </notification> + <notification name="NoCopyNoSelCopy"> + Você não pode copiar sua seleção porque não está autorizado a copiar o objeto '[OBJ_NAME]'. + </notification> + <notification name="NoTransNoSelCopy"> + Você não pode copiar a seleção porque o objeto '[OBJ_NAME]' não é transferÃvel. + </notification> + <notification name="NoTransNoCopy"> + Você não pode copiar a seleção porque o objeto '[OBJ_NAME]' não é transferÃvel. + </notification> + <notification name="NoPermsNoRemoval"> + A remoção do objeto '[OBJ_NAME]' do simulador é proibida pelo sistema de permissões. + </notification> + <notification name="NoModNoSaveSelection"> + Você não pode salvar sua seleção porque não está autorizado a modificar o objeto '[OBJ_NAME]'. + </notification> + <notification name="NoCopyNoSaveSelection"> + Não é possÃvel salvar sua seleção porque o objeto '[OBJ_NAME]' não é copiável. + </notification> + <notification name="NoModNoTaking"> + Você não pode levar sua seleção porque não está autorizado a modificar o objeto '[OBJ_NAME]'. + </notification> + <notification name="RezDestInternalError"> + Erro interno: tipo de destino desconhecido. + </notification> + <notification name="DeleteFailObjNotFound"> + A exclusão falhou porque o objeto não foi encontrado + </notification> + <notification name="SorryCantEjectUser"> + Não é possÃvel expulsar esse usuário. + </notification> + <notification name="RegionSezNotAHome"> + Esta região não permite que você a defina como seu inÃcio. + </notification> + <notification name="HomeLocationLimits"> + Você só pode definir seu "InÃcio" em seu terreno ou em um Infohub do continente. + </notification> + <notification name="HomePositionSet"> + Posição de inÃcio definida. + </notification> + <notification name="AvatarEjected"> + Avatar expulso. + </notification> + <notification name="AvatarEjectFailed"> + A expulsão falhou porque você não tem permissão de administrador para esse lote. + </notification> + <notification name="CantMoveObjectParcelFull"> + Não é possÃvel mover '[OBJECT_NAME]' para +[OBJ_POSITION] na região [REGION_NAME] porque o lote está cheio. + </notification> + <notification name="CantMoveObjectParcelPerms"> + Não é possÃvel mover '[OBJECT_NAME]' para +[OBJ_POSITION] na região [REGION_NAME] porque seus objetos não são permitidos neste lote. + </notification> + <notification name="CantMoveObjectParcelResources"> + Não é possÃvel mover '[OBJECT_NAME]' para +[OBJ_POSITION] na região [REGION_NAME] porque não há recursos suficientes para este objeto neste lote. + </notification> + <notification name="CantMoveObjectRegionVersion"> + Não é possÃvel mover '[OBJECT_NAME]' para +[OBJ_POSITION] na região [REGION_NAME] porque outra região está executando uma versão mais antiga, que não dá suporte o recebimento deste objeto por meio de passagem de regiões. + </notification> + <notification name="CantMoveObjectNavMesh"> + Não é possÃvel mover '[OBJECT_NAME]' para +[OBJ_POSITION] na região [REGION_NAME] porque você não está autorizado a modificar o navmesh além dos limites da região. + </notification> + <notification name="CantMoveObjectWTF"> + Não é possÃvel mover '[OBJECT_NAME]' para +[OBJ_POSITION] na região [REGION_NAME] por uma razão desconhecida. ([FAILURE_TYPE]) + </notification> + <notification name="NoPermModifyObject"> + Você não está autorizado a modificar este objeto + </notification> + <notification name="CantEnablePhysObjContributesToNav"> + Não é possÃvel ativar propriedades fÃsicas para um objeto que contribui para o navmesh. + </notification> + <notification name="CantEnablePhysKeyframedObj"> + Não é possÃvel ativar propriedades fÃsicas para objetos keyframe. + </notification> + <notification name="CantEnablePhysNotEnoughLandResources"> + Não é possÃvel ativar propriedades fÃsicas para o objeto -- recursos de terreno insuficientes. + </notification> + <notification name="CantEnablePhysCostTooGreat"> + Não é possÃvel ativar propriedades fÃsicas para objeto com custo de recursos fÃsicos acima de [MAX_OBJECTS] + </notification> + <notification name="PhantomWithConcavePiece"> + Este objeto não pode ter uma peça côncava porque é phantom e contribui para o navmesh. + </notification> + <notification name="UnableAddItem"> + Não é possÃvel adicionar item! + </notification> + <notification name="UnableEditItem"> + Não é possÃvel editar isso! + </notification> + <notification name="NoPermToEdit"> + Não é permitido editar isso. + </notification> + <notification name="NoPermToCopyInventory"> + Não é permitido copiar esse inventário. + </notification> + <notification name="CantSaveItemDoesntExist"> + Não é possÃvel salvar no conteúdo do objeto: O item não existe mais. + </notification> + <notification name="CantSaveItemAlreadyExists"> + Não é possÃvel salvar no conteúdo do objeto: já existe um item com esse nome no inventário + </notification> + <notification name="CantSaveModifyAttachment"> + Não é possÃvel salvar no conteúdo do objeto: isso modificaria as permissões de anexo. + </notification> + <notification name="TooManyScripts"> + Muitos scripts. + </notification> + <notification name="UnableAddScript"> + Não é possÃvel adicionar script! + </notification> + <notification name="AssetServerTimeoutObjReturn"> + Servidor de objetos não respondeu a tempo. Objeto retornado a sim. + </notification> + <notification name="RegionDisablePhysicsShapes"> + Esta região não tem formas fÃsicas ativadas. + </notification> + <notification name="NoModNavmeshAcrossRegions"> + Você não pode modificar o navmesh além dos limites da região. + </notification> + <notification name="NoSetPhysicsPropertiesOnObjectType"> + Não é possÃvel definir as propriedades fÃsicas neste tipo de objeto. + </notification> + <notification name="NoSetRootPrimWithNoShape"> + Não é possÃvel definir que um prim raiz não tenha forma. + </notification> + <notification name="NoRegionSupportPhysMats"> + Esta região não tem materiais fÃsicos ativados. + </notification> + <notification name="OnlyRootPrimPhysMats"> + Apenas prims raiz podem ter seus materiais fÃsicos ajustados. + </notification> + <notification name="NoSupportCharacterPhysMats"> + Ainda não há suporte para a configuração dos materiais fÃsicos em personagens. + </notification> + <notification name="InvalidPhysMatProperty"> + Uma ou mais das propriedades do material fÃsico são inválidas. + </notification> + <notification name="NoPermsAlterStitchingMeshObj"> + Você não pode alterar o tipo de acabamento de um objeto mesh. + </notification> + <notification name="NoPermsAlterShapeMeshObj"> + Você não pode alterar a forma de um objeto mesh + </notification> + <notification name="FullRegionCantEnter"> + Você não pode entrar nesta região porque \nela está cheia. + </notification> + <notification name="LinkFailedOwnersDiffer"> + Falha na vinculação -- proprietários diferentes + </notification> + <notification name="LinkFailedNoModNavmeshAcrossRegions"> + Falha na vinculação -- não é possÃvel modificar o navmesh além dos limites da região. + </notification> + <notification name="LinkFailedNoPermToEdit"> + Ocorreu uma falha na vinculação porque você não tem permissão de edição. + </notification> + <notification name="LinkFailedTooManyPrims"> + Falha na vinculação -- muitos prims + </notification> + <notification name="LinkFailedCantLinkNoCopyNoTrans"> + Falha na vinculação -- não é possÃvel vincular itens com cópia proibida a itens com transferência proibida + </notification> + <notification name="LinkFailedNothingLinkable"> + Falha na vinculação -- nada é vinculável. + </notification> + <notification name="LinkFailedTooManyPathfindingChars"> + Falha na vinculação -- muitos personagens com pathfinding + </notification> + <notification name="LinkFailedInsufficientLand"> + Falha na vinculação -- recursos de terreno insuficientes + </notification> + <notification name="LinkFailedTooMuchPhysics"> + O objeto usa muitos recursos fÃsicos – sua dinâmica foi desativada. + </notification> + <notification name="TeleportedHomeByObjectOnParcel"> + Você foi teletransportado para seu inÃcio pelo objeto '[OBJECT_NAME]' no lote '[PARCEL_NAME]' + </notification> + <notification name="TeleportedHomeByObject"> + Você foi teletransportado para seu inÃcio pelo objeto '[OBJECT_NAME]' + </notification> + <notification name="TeleportedByAttachment"> + Você foi teletransportado por um anexo em [ITEM_ID] + </notification> + <notification name="TeleportedByObjectOnParcel"> + Você foi teletransportado pelo objeto '[OBJECT_NAME]' no lote '[PARCEL_NAME]' + </notification> + <notification name="TeleportedByObjectOwnedBy"> + Você foi teletransportado pelo objeto '[OBJECT_NAME]' de propriedade de [OWNER_ID] + </notification> + <notification name="TeleportedByObjectUnknownUser"> + Você foi teletransportado pelo objeto '[OBJECT_NAME]' de propriedade de um usuário desconhecido. + </notification> + <notification name="CantCreateObjectRegionFull"> + Não foi possÃvel criar o objeto solicitado. A região está cheia. + </notification> + <notification name="CantAttackMultipleObjOneSpot"> + Não é possÃvel anexar vários objetos a um local. + </notification> + <notification name="CantCreateMultipleObjAtLoc"> + Você não pode criar vários objetos aqui. + </notification> + <notification name="UnableToCreateObjTimeOut"> + Não foi possÃvel criar o objeto solicitado. Objeto ausente do banco de dados. + </notification> + <notification name="UnableToCreateObjUnknown"> + Não foi possÃvel criar o objeto solicitado. A solicitação expirou. Tente novamente. + </notification> + <notification name="UnableToCreateObjMissingFromDB"> + Não foi possÃvel criar o objeto solicitado. Tente novamente. + </notification> + <notification name="RezFailureTookTooLong"> + Falha na renderização, objeto solicitado demorou muito a carregar. + </notification> + <notification name="FailedToPlaceObjAtLoc"> + Falha ao posicionar objeto em local especÃfico. Tente novamente. + </notification> + <notification name="CantCreatePlantsOnLand"> + Você não pode criar plantas neste terreno. + </notification> + <notification name="CantRestoreObjectNoWorldPos"> + Não é possÃvel restaurar o objeto. Nenhuma posição encontrada no mundo. + </notification> + <notification name="CantRezObjectInvalidMeshData"> + Não é possÃvel renderizar o objeto porque os dados de mesh são inválidos. + </notification> + <notification name="CantRezObjectTooManyScripts"> + Não foi possÃvel renderizar objeto porque já há muitos scripts nesta região. + </notification> + <notification name="CantCreateObjectNoAccess"> + Seus privilégios de acesso não permitem que você crie objetos aqui. + </notification> + <notification name="CantCreateObject"> + No momento, você não está autorizado a criar objetos. + </notification> + <notification name="InvalidObjectParams"> + Parâmetros de objeto inválidos + </notification> + <notification name="CantDuplicateObjectNoAcess"> + Seus privilégios de acesso não permitem que você duplique objetos aqui. + </notification> + <notification name="CantChangeShape"> + Você não está autorizado a alterar essa forma. + </notification> + <notification name="NoAccessToClaimObjects"> + Seus privilégios de acesso não permitem que você reivindique objetos aqui. + </notification> + <notification name="DeedFailedNoPermToDeedForGroup"> + A doação falhou porque você não está autorizado a doar objetos ao seu grupo. + </notification> + <notification name="NoPrivsToBuyObject"> + Seus privilégios de acesso não permitem que você compre objetos aqui. + </notification> + <notification name="CantAttachObjectAvatarSittingOnIt"> + Não é possÃvel anexar objeto porque um avatar está sentado nele. + </notification> + <notification name="WhyAreYouTryingToWearShrubbery"> + Ãrvores e grama não podem ser usadas como anexos. + </notification> + <notification name="CantAttachGroupOwnedObjs"> + Não é possÃvel anexar objetos de propriedade de um grupo. + </notification> + <notification name="CantAttachObjectsNotOwned"> + Não é possÃvel anexar objetos que não sua propriedade. + </notification> + <notification name="CantAttachNavmeshObjects"> + Não é possÃvel anexar objetos que contribuem com o navmesh. + </notification> + <notification name="CantAttachObjectNoMovePermissions"> + Não é possÃvel vincular objeto porque você não tem permissão para movê-lo. + </notification> + <notification name="CantAttachNotEnoughScriptResources"> + Não há recursos de script disponÃveis suficientes para anexar objeto! + </notification> + <notification name="CantDropItemTrialUser"> + Não é possÃvel largar objetos aqui. Tente a área de Avaliação grátis. + </notification> + <notification name="CantDropMeshAttachment"> + Você não pode largar anexos mesh. Separe para o inventário e depois renderize no mundo. + </notification> + <notification name="CantDropAttachmentNoPermission"> + Falha ao largar anexo: você não está autorizado a largá-lo aqui. + </notification> + <notification name="CantDropAttachmentInsufficientLandResources"> + Falha ao largar anexo: recursos de terreno disponÃveis insuficientes. + </notification> + <notification name="CantDropAttachmentInsufficientResources"> + Falha ao largar anexos: recursos disponÃveis insuficientes. + </notification> + <notification name="CantDropObjectFullParcel"> + Não é possÃvel largar objeto aqui. O lote está cheio. + </notification> + <notification name="CantTouchObjectBannedFromParcel"> + Não é possÃvel tocar/pegar este objeto porque você foi banido do lote de terreno. + </notification> + <notification name="PlzNarrowDeleteParams"> + Detalhe seus parâmetros de exclusão. + </notification> + <notification name="UnableToUploadAsset"> + Não é possÃvel carregar objeto. + </notification> + <notification name="CantTeleportCouldNotFindUser"> + Não foi possÃvel encontrar usuário para teletransportar para inÃcio + </notification> + <notification name="GodlikeRequestFailed"> + solicitação de poderes de deus falhou + </notification> + <notification name="GenericRequestFailed"> + falha em solicitação genérica + </notification> + <notification name="CantUploadPostcard"> + Não foi possÃvel carregar cartão postal. Tente novamente mais tarde. + </notification> + <notification name="CantFetchInventoryForGroupNotice"> + Não foi possÃvel obter detalhes de inventário para o anúncio de grupo. + </notification> + <notification name="CantSendGroupNoticeNotPermitted"> + Não é possÃvel enviar anúncio de grupo -- não permitido. + </notification> + <notification name="CantSendGroupNoticeCantConstructInventory"> + Não é possÃvel enviar anúncio de grupo -- não foi possÃvel construir inventário. + </notification> + <notification name="CantParceInventoryInNotice"> + Não é possÃvel processar o inventário do anúncio. + </notification> + <notification name="TerrainUploadFailed"> + Falha no envio de terreno. + </notification> + <notification name="TerrainFileWritten"> + Arquivo de terreno gravado. + </notification> + <notification name="TerrainFileWrittenStartingDownload"> + Arquivo de terreno criado, iniciando o download... + </notification> + <notification name="TerrainBaked"> + Terreno confeccionado. + </notification> + <notification name="TenObjectsDisabledPlzRefresh"> + Apenas os 10 primeiros objetos selecionados foram desativados. Atualize e faça novas seleções, se necessário. + </notification> + <notification name="UpdateViewerBuyParcel"> + Você precisa atualizar seu visualizador para comprar este lote. + </notification> + <notification name="CantBuyParcelNotForSale"> + Não é possÃvel comprar, este lote não está à venda. + </notification> + <notification name="CantBuySalePriceOrLandAreaChanged"> + Não é possÃvel comprar, o preço de venda ou a área do terreno foram alterados. + </notification> + <notification name="CantBuyParcelNotAuthorized"> + Você não é o comprador autorizado deste lote. + </notification> + <notification name="CantBuyParcelAwaitingPurchaseAuth"> + Você não pode comprar este lote porque já está aguardando aut. de compra + </notification> + <notification name="CantBuildOverflowParcel"> + Não é possÃvel criar objeto aqui porque isso sobrecarregaria o lote. + </notification> + <notification name="SelectedMultipleOwnedLand"> + Você selecionou terreno com proprietários diferentes. Selecione uma área menor e tente novamente. + </notification> + <notification name="CantJoinTooFewLeasedParcels"> + Não há lotes alugados suficientes na seleção para reunir. + </notification> + <notification name="CantDivideLandMultipleParcelsSelected"> + Não é possÃvel dividir o terreno.\nHá mais de um lote selecionado.\nTente selecionar um pedaço menor de terreno. + </notification> + <notification name="CantDivideLandCantFindParcel"> + Não é possÃvel dividir o terreno.\nNão é possÃvel encontrar o lote.\nComunique isso em Ajuda -> Relatar bug... + </notification> + <notification name="CantDivideLandWholeParcelSelected"> + Não é possÃvel dividir o terreno. O lote inteiro está selecionado.\nTente selecionar um pedaço menor do terreno. + </notification> + <notification name="LandHasBeenDivided"> + O terreno foi dividido. + </notification> + <notification name="PassPurchased"> + Você comprou um passe. + </notification> + <notification name="RegionDisallowsClassifieds"> + A região não permite classificados. + </notification> + <notification name="LandPassExpireSoon"> + Seu passe para este terreno está prestes a expirar. + </notification> + <notification name="CantSitNoSuitableSurface"> + Não há uma superfÃcie adequada para sentar, tente outro local. + </notification> + <notification name="CantSitNoRoom"> + Não há espaço para sentar aqui, tente outro local. + </notification> + <notification name="ClaimObjectFailedNoPermission"> + A reivindicação do objeto falhou porque você não tem permissão + </notification> + <notification name="ClaimObjectFailedNoMoney"> + A reivindicação do objeto falhou porque você não tem L$ suficiente. + </notification> + <notification name="CantDeedGroupLand"> + Não é possÃvel doar terrenos de propriedade de um grupo. + </notification> + <notification name="BuyObjectFailedNoMoney"> + A compra do objeto falhou porque você não tem L$ suficientes. + </notification> + <notification name="BuyInventoryFailedNoMoney"> + A compra do inventário falhou porque você não tem L$ suficiente + </notification> + <notification name="BuyPassFailedNoMoney"> + Você não tem L $ suficientes para comprar um passe para este terreno. + </notification> + <notification name="CantBuyPassTryAgain"> + Não é possÃvel comprar passe no momento. Tente novamente mais tarde. + </notification> + <notification name="CantCreateObjectParcelFull"> + Não é possÃvel criar objeto porque \no lote está cheio. + </notification> + <notification name="FailedPlacingObject"> + Falha ao posicionar objeto em local especÃfico. Tente novamente. + </notification> + <notification name="CantCreateLandmarkForEvent"> + Não é possÃvel criar marco para o evento. + </notification> + <notification name="GodBeatsFreeze"> + Seus poderes de deus rompem o congelamento! + </notification> + <notification name="SpecialPowersRequestFailedLogged"> + Falha na solicitação de poderes especiais. Essa solicitação foi registrada. + </notification> + <notification name="ExpireExplanation"> + O sistema não pode processar sua solicitação no momento. A solicitação expirou. + </notification> + <notification name="DieExplanation"> + O sistema não pode processar sua solicitação. + </notification> + <notification name="AddPrimitiveFailure"> + Fundos insuficientes para criar prim. + </notification> + <notification name="RezObjectFailure"> + Fundos insuficientes para criar objeto. + </notification> + <notification name="ResetHomePositionNotLegal"> + Redefinir InÃcio pois o InÃcio não era legal. + </notification> + <notification name="CantInviteRegionFull"> + No momento, você não pode convidar ninguém para seu local pois a região está cheia. Tente novamente mais tarde. + </notification> + <notification name="CantSetHomeAtRegion"> + Esta região não permite que você a defina como seu inÃcio. + </notification> + <notification name="ListValidHomeLocations"> + Você só pode definir seu "InÃcio" em seu terreno ou em um Infohub do continente. + </notification> + <notification name="SetHomePosition"> + Posição de inÃcio definida. + </notification> + <notification name="CantDerezInventoryError"> + Não é possÃvel desrenderizar objeto devido a uma falha de inventário. + </notification> + <notification name="CantCreateRequestedInv"> + Não é possÃvel criar o inventário solicitado. + </notification> + <notification name="CantCreateRequestedInvFolder"> + Não é possÃvel criar a pasta de inventário solicitada. + </notification> + <notification name="CantCreateInventory"> + Não é possÃvel criar esse inventário. + </notification> + <notification name="CantCreateLandmark"> + Não é possÃvel criar marco. + </notification> + <notification name="CantCreateOutfit"> + Não é possÃvel criar roupa agora. Tente novamente em instantes. + </notification> + <notification name="InventoryNotForSale"> + O inventário não está à venda. + </notification> + <notification name="CantFindInvItem"> + Não é possÃvel encontrar item do inventário. + </notification> + <notification name="CantFindObject"> + Não foi possÃvel encontrar objeto. + </notification> + <notification name="CantTransfterMoneyRegionDisabled"> + Transferências de dinheiro para objetos estão desativadas para esta região no momento. + </notification> + <notification name="CantPayNoAgent"> + Não foi possÃvel descobrir a quem pagar. + </notification> + <notification name="CantDonateToPublicObjects"> + Não é possÃvel dar L$ a objetos públicos. + </notification> + <notification name="InventoryCreationInWorldObjectFailed"> + Falha na criação de inventário de objetos do mundo virtual. + </notification> + <notification name="UserBalanceOrLandUsageError"> + Um erro interno impediu que seu visualizador fosse atualizado corretamente. O saldo em L$ ou a propriedade de lotes exibidos em seu visualizador pode não refletir o saldo real nos servidores. + </notification> + <notification name="LargePrimAgentIntersect"> + Não é possÃvel criar grandes prims que interceptam outros jogadores. Tente novamente quando os outros jogadores tiverem se movido. + </notification> + <notification name="PreferenceChatClearLog"> + Isso excluirá os registros das conversas anteriores e qualquer backup desse arquivo. + <usetemplate ignoretext="Confirmar antes de excluir o registro com conversas anteriores." name="okcancelignore" notext="Cancelar" yestext="OK"/> + </notification> + <notification name="PreferenceChatDeleteTranscripts"> + Isso excluirá todas as transcrições de todas as conversas anteriores. A lista de conversas antigas não será afetada. Todos os arquivos com as extensões .txt e txt.backup na pasta [FOLDER] serão excluÃdos. + <usetemplate ignoretext="Confirmar antes de excluir transcrições." name="okcancelignore" notext="Cancelar" yestext="OK"/> + </notification> + <notification name="PreferenceChatPathChanged"> + Não foi possÃvel mover arquivos. Caminho anterior restaurado. + <usetemplate ignoretext="Não foi possÃvel mover arquivos. Caminho anterior restaurado." name="okignore" yestext="OK"/> + </notification> </notifications> diff --git a/indra/newview/skins/default/xui/pt/panel_avatar_list_item.xml b/indra/newview/skins/default/xui/pt/panel_avatar_list_item.xml index b444593af8..22eb23ebc5 100644 --- a/indra/newview/skins/default/xui/pt/panel_avatar_list_item.xml +++ b/indra/newview/skins/default/xui/pt/panel_avatar_list_item.xml @@ -26,5 +26,6 @@ <icon name="permission_edit_mine_icon" tool_tip="Este amigo pode editar, excluir ou pegar seus pertences"/> <icon name="permission_map_icon" tool_tip="Este amigo pode localizar você no mapa"/> <icon name="permission_online_icon" tool_tip="Este amigo pode saber quando você estiver online"/> + <button name="info_btn" tool_tip="Mais informações"/> <button name="profile_btn" tool_tip="Ver perfil"/> </panel> diff --git a/indra/newview/skins/default/xui/pt/panel_block_list_sidetray.xml b/indra/newview/skins/default/xui/pt/panel_block_list_sidetray.xml index c5f93d719a..2fcf6b9932 100644 --- a/indra/newview/skins/default/xui/pt/panel_block_list_sidetray.xml +++ b/indra/newview/skins/default/xui/pt/panel_block_list_sidetray.xml @@ -1,10 +1,11 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="block_list_panel"> - <text name="title_text"> - Lista de bloqueados - </text> - <scroll_list name="blocked" tool_tip="Lista atual dos residentes bloqueados"/> - <button label="Bloquear residente..." label_selected="Bloquear residente..." name="Block resident..." tool_tip="Selecione o residente a bloquear"/> - <button label="Bloquear objeto por nome..." label_selected="Bloquear objeto por nome..." name="Block object by name..."/> - <button label="Desbloquear" label_selected="Desbloquear" name="Unblock" tool_tip="Remover residente ou objeto da lista dos bloqueados"/> + <panel label="bottom_panel" name="blocked_buttons_panel"> + <filter_editor label="Filtrar" name="blocked_filter_input"/> + <menu_button name="blocked_gear_btn" tool_tip="Ações em uma pessoa ou um objeto selecionado"/> + <menu_button name="view_btn" tool_tip="Opções de ordenação"/> + <menu_button name="plus_btn" tool_tip="Escolher um residente ou um objeto a ser bloqueado"/> + <button name="unblock_btn" tool_tip="Remover residente ou objeto da lista dos bloqueados"/> + </panel> + <block_list name="blocked" tool_tip="Lista atual dos residentes bloqueados"/> </panel> diff --git a/indra/newview/skins/default/xui/pt/panel_conversation_list_item.xml b/indra/newview/skins/default/xui/pt/panel_conversation_list_item.xml new file mode 100644 index 0000000000..f56168c962 --- /dev/null +++ b/indra/newview/skins/default/xui/pt/panel_conversation_list_item.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="conversation_list_item"> + <layout_stack name="conversation_item_stack"> + <layout_panel name="conversation_title_panel"> + <text name="conversation_title" value="(carregando)"/> + </layout_panel> + </layout_stack> +</panel> diff --git a/indra/newview/skins/default/xui/pt/panel_conversation_log_list_item.xml b/indra/newview/skins/default/xui/pt/panel_conversation_log_list_item.xml new file mode 100644 index 0000000000..74daded58f --- /dev/null +++ b/indra/newview/skins/default/xui/pt/panel_conversation_log_list_item.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="conversation_log_list_item"> + <icon name="voice_session_icon" tool_tip="Uma conversa de voz foi incluÃda"/> + <icon name="unread_ims_icon" tool_tip="Chegaram mensagens enquanto você estava desconectado"/> + <button name="delete_btn" tool_tip="Remover esta entrada"/> +</panel> diff --git a/indra/newview/skins/default/xui/pt/panel_group_list_item.xml b/indra/newview/skins/default/xui/pt/panel_group_list_item.xml index 19c34d2f10..0490878507 100644 --- a/indra/newview/skins/default/xui/pt/panel_group_list_item.xml +++ b/indra/newview/skins/default/xui/pt/panel_group_list_item.xml @@ -1,5 +1,6 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="group_list_item"> <text name="group_name" value="Desconhecido"/> + <button name="info_btn" tool_tip="Mais informações"/> <button name="profile_btn" tool_tip="Ver perfil"/> </panel> diff --git a/indra/newview/skins/default/xui/pt/panel_people.xml b/indra/newview/skins/default/xui/pt/panel_people.xml index f3af15b991..babb48c208 100644 --- a/indra/newview/skins/default/xui/pt/panel_people.xml +++ b/indra/newview/skins/default/xui/pt/panel_people.xml @@ -14,81 +14,53 @@ Em busca de alguém para conversar? Procure no [secondlife:///app/worldmap Mapa- <string name="no_filtered_friends_msg"> Não encontrou o que procura? Tente buscar no [secondlife:///app/search/people/[SEARCH_TERM] Search]. </string> - <string name="people_filter_label" value="Filtro de pessoas"/> - <string name="groups_filter_label" value="Filtro de grupos"/> <string name="no_filtered_groups_msg" value="Não encontrou o que procura? Tente buscar no [secondlife:///app/search/groups/[SEARCH_TERM] Search]."/> <string name="no_groups_msg" value="À procura de grupos interessantes? Tente fazer uma [secondlife:///app/search/groups Busca]."/> <string name="MiniMapToolTipMsg" value="[REGION](Clique duas vezes para abrir o mapa, shift+arraste para a visão pan)"/> <string name="AltMiniMapToolTipMsg" value="[REGION](Clique duas vezes para teletransportar, shift+arraste para a visão pan)"/> - <filter_editor label="Filtro" name="filter_input"/> <tab_container name="tabs"> <panel label="PROXIMIDADE" name="nearby_panel"> - <panel label="bottom_panel" name="bottom_panel"> - <menu_button name="nearby_view_sort_btn" tool_tip="Opções"/> - <button name="add_friend_btn" tool_tip="Adicionar o residente selecionado para sua lista de amigos"/> + <panel label="bottom_panel" name="nearby_buttons_panel"> + <filter_editor label="Filtrar pessoas" name="nearby_filter_input"/> + <button name="gear_btn" tool_tip="Ações nas pessoas selecionadas"/> + <menu_button name="nearby_view_btn" tool_tip="Opções de exibição/ordenação"/> + <button name="add_friend_btn" tool_tip="Oferecer amizade ao residente"/> + <dnd_button name="nearby_del_btn" tool_tip="Remover a pessoa selecionada dos amigos"/> </panel> </panel> - <panel label="MEUS AMIGOS" name="friends_panel"> + <panel label="AMIGOS" name="friends_panel"> + <panel label="bottom_panel" name="friends_buttons_panel"> + <filter_editor label="Filtrar pessoas" name="friends_filter_input"/> + <button name="gear_btn" tool_tip="Ações nas pessoas selecionadas"/> + <menu_button name="friends_view_btn" tool_tip="Opções de exibição/ordenação"/> + <button name="friends_add_btn" tool_tip="Oferecer amizade ao residente"/> + <dnd_button name="friends_del_btn" tool_tip="Remover a pessoa selecionada dos amigos"/> + </panel> <accordion name="friends_accordion"> <accordion_tab name="tab_online" title="Online"/> <accordion_tab name="tab_all" title="Todos"/> </accordion> - <panel label="bottom_panel" name="bottom_panel"> - <layout_stack name="bottom_panel"> - <layout_panel name="options_gear_btn_panel"> - <menu_button name="friends_viewsort_btn" tool_tip="Mostrar opções adicionais"/> - </layout_panel> - <layout_panel name="add_btn_panel"> - <button name="add_btn" tool_tip="Oferecer amizade para um residente"/> - </layout_panel> - <layout_panel name="trash_btn_panel"> - <dnd_button name="del_btn" tool_tip="Remover a pessoa selecionada da sua lista de amigos"/> - </layout_panel> - </layout_stack> - </panel> </panel> - <panel label="MEUS GRUPOS" name="groups_panel"> - <panel label="bottom_panel" name="bottom_panel"> - <menu_button name="groups_viewsort_btn" tool_tip="Opções"/> - <button name="plus_btn" tool_tip="Ingressar em um grupo/Criar novo grupo"/> - <button name="activate_btn" tool_tip="Ativar o grupo selecionado"/> + <panel label="GRUPOS" name="groups_panel"> + <panel label="bottom_panel" name="groups_buttons_panel"> + <filter_editor label="Filtrar grupos" name="groups_filter_input"/> + <menu_button name="groups_gear_btn" tool_tip="Ações no grupo selecionado"/> + <menu_button name="groups_view_btn" tool_tip="Opções de exibição/ordenação"/> + <menu_button name="plus_btn" tool_tip="Entrar em um grupo/Criar novo grupo"/> + <dnd_button name="minus_btn" tool_tip="Sair do grupo selecionado"/> </panel> </panel> <panel label="RECENTE" name="recent_panel"> - <panel label="bottom_panel" name="bottom_panel"> - <menu_button name="recent_viewsort_btn" tool_tip="Opções"/> - <button name="add_friend_btn" tool_tip="Adicionar o residente selecionado para sua lista de amigos"/> + <panel label="bottom_panel" name="recent_buttons_panel"> + <filter_editor label="Filtrar pessoas" name="recent_filter_input"/> + <button name="gear_btn" tool_tip="Ações nas pessoas selecionadas"/> + <menu_button name="recent_view_btn" tool_tip="Opções de exibição/ordenação"/> + <button name="add_friend_btn" tool_tip="Oferecer amizade ao residente"/> + <dnd_button name="recent_del_btn" tool_tip="Remover a pessoa selecionada dos amigos"/> </panel> </panel> + <panel label="BLOQUEADA" name="blocked_panel"> + <panel label="Residentes e objetos bloqueados" name="panel_block_list_sidetray"/> + </panel> </tab_container> - <panel name="button_bar"> - <layout_stack name="bottom_bar_ls"> - <layout_panel name="view_profile_btn_lp"> - <button label="Perfil" name="view_profile_btn" tool_tip="Exibir fotografia, grupos e outras informações dos residentes"/> - </layout_panel> - <layout_panel name="im_btn_lp"> - <button label="MI" name="im_btn" tool_tip="Abrir sessão de mensagem instantânea"/> - </layout_panel> - <layout_panel name="call_btn_lp"> - <button label="Ligar" name="call_btn" tool_tip="Ligar para este residente"/> - </layout_panel> - <layout_panel name="share_btn_lp"> - <button label="Compartilhar" name="share_btn" tool_tip="Compartilhar item de inventário"/> - </layout_panel> - <layout_panel name="teleport_btn_lp"> - <button label="Teletransportar" name="teleport_btn" tool_tip="Oferecer teletransporte"/> - </layout_panel> - </layout_stack> - <layout_stack name="bottom_bar_ls1"> - <layout_panel name="group_info_btn_lp"> - <button label="Perfil do grupo" name="group_info_btn" tool_tip="Exibir dados do grupo"/> - </layout_panel> - <layout_panel name="chat_btn_lp"> - <button label="Bate-papo de grupo" name="chat_btn" tool_tip="Nova sessão de bate-papo"/> - </layout_panel> - <layout_panel name="group_call_btn_lp"> - <button label="Ligar para o grupo" name="group_call_btn" tool_tip="Ligar para este grupo"/> - </layout_panel> - </layout_stack> - </panel> </panel> diff --git a/indra/newview/skins/default/xui/pt/panel_preferences_chat.xml b/indra/newview/skins/default/xui/pt/panel_preferences_chat.xml index 350d53b81c..baf14c2c23 100644 --- a/indra/newview/skins/default/xui/pt/panel_preferences_chat.xml +++ b/indra/newview/skins/default/xui/pt/panel_preferences_chat.xml @@ -1,34 +1,86 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel label="Chat" name="chat"> - <text name="font_size"> - Tamanho da fonte: - </text> - <radio_group name="chat_font_size"> - <radio_item label="Pequeno" name="radio" value="0"/> - <radio_item label="Médio" name="radio2" value="1"/> - <radio_item label="Grande" name="radio3" value="2"/> - </radio_group> - <check_box initial_value="true" label="Executar animação digitada quando estiver conversando" name="play_typing_animation"/> - <check_box label="Enviar MIs por email se estiver desconectado" name="send_im_to_email"/> - <check_box label="Ativar MIs e bate-papos de texto simples" name="plain_text_chat_history"/> - <check_box label="Balão de bate-papo" name="bubble_text_chat"/> - <text name="show_ims_in_label"> - Mostrar MIs em: - </text> - <text name="requires_restart_label"> - (Reinicie para ativar) - </text> - <radio_group name="chat_window" tool_tip="Exibir cada bate-papo em uma janela separada ou exibir todos em uma única janela com uma aba para cada pessoa (requer reinÃcio)"> - <radio_item label="Janelas separadas" name="radio" value="0"/> - <radio_item label="Guias" name="radio2" value="1"/> - </radio_group> - <text name="disable_toast_label"> - Ativar pop-ups de novos bate-papos: - </text> - <check_box label="Bate-papo de grupo" name="EnableGroupChatPopups" tool_tip="Exibir pop-up de bate-papos novos de grupos"/> - <check_box label="Bate-papos de MI" name="EnableIMChatPopups" tool_tip="Exibir pop-up de mensagens instantâneas novas"/> - <spinner label="Transição de avisos de bate-papos por perto:" name="nearby_toasts_lifetime"/> - <spinner label="Transição de avisos de bate-papos por perto:" name="nearby_toasts_fadingtime"/> + <panel> + <check_box initial_value="true" label="Executar animação digitada quando estiver conversando" name="play_typing_animation"/> + <check_box label="Enviar MIs por email se estiver desconectado" name="send_im_to_email"/> + <check_box label="Apenas amigos e grupos podem me ligar ou enviar MIs" name="voice_call_friends_only_check"/> + <text name="font_size"> + Tamanho da fonte: + </text> + <combo_box name="chat_font_size"> + <item label="Pequeno" name="Small" value="0"/> + <item label="Médio" name="Medium" value="1"/> + <item label="Grande" name="Large" value="2"/> + </combo_box> + <check_box label="Balão de bate-papo" name="bubble_text_chat"/> + </panel> + <panel> + <text name="notifications"> + Notificações + </text> + <text name="friend_ims"> + MIs de amigos: + </text> + <combo_box name="FriendIMOptions"> + <item label="Abrir janela Conversas" name="OpenConversationsWindow" value="openconversations"/> + <item label="Abrir pop up com mensagem" name="PopUpMessage" value="toast"/> + <item label="Piscar botão da barra de ferramentas" name="FlashToolbarButton" value="flash"/> + <item label="Nenhum" name="None" value="none"/> + </combo_box> + <text name="non_friend_ims"> + MIs de não amigos: + </text> + <combo_box name="NonFriendIMOptions"> + <item label="Abrir janela Conversas" name="OpenConversationsWindow" value="openconversations"/> + <item label="Abrir pop up com mensagem" name="PopUpMessage" value="toast"/> + <item label="Piscar botão da barra de ferramentas" name="FlashToolbarButton" value="flash"/> + <item label="Nenhum" name="None" value="none"/> + </combo_box> + <text name="conference_ims"> + MIs de conferências: + </text> + <combo_box name="ConferenceIMOptions"> + <item label="Abrir janela Conversas" name="OpenConversationsWindow" value="openconversations"/> + <item label="Abrir pop up com mensagem" name="PopUpMessage" value="toast"/> + <item label="Piscar botão da barra de ferramentas" name="FlashToolbarButton" value="flash"/> + <item label="Nenhum" name="None" value="none"/> + </combo_box> + <text name="group_chat"> + Bate-papo de grupo: + </text> + <combo_box name="GroupChatOptions"> + <item label="Abrir janela Conversas" name="OpenConversationsWindow" value="openconversations"/> + <item label="Abrir pop up com mensagem" name="PopUpMessage" value="toast"/> + <item label="Piscar botão da barra de ferramentas" name="FlashToolbarButton" value="flash"/> + <item label="Nenhum" name="None" value="none"/> + </combo_box> + <text name="nearby_chat"> + Bate-papo local: + </text> + <combo_box name="NearbyChatOptions"> + <item label="Abrir janela Conversas" name="OpenConversationsWindow" value="openconversations"/> + <item label="Abrir pop up com mensagem" name="PopUpMessage" value="toast"/> + <item label="Piscar botão da barra de ferramentas" name="FlashToolBarButton" value="flash"/> + <item label="Nenhum" name="None" value="none"/> + </combo_box> + <text name="notifications_alert"> + Para interromper temporariamente todas as notificações, use Comunicar > Não perturbe. + </text> + </panel> + <panel> + <text name="play_sound"> + Executar som: + </text> + <check_box label="Nova conversa" name="new_conversation"/> + <check_box label="Chamada de voz recebida" name="incoming_voice_call"/> + <check_box label="Oferta de teletransporte" name="teleport_offer"/> + <check_box label="Oferta de inventário" name="inventory_offer"/> + </panel> + <panel> + <button label="Limpar registro..." name="clear_log"/> + <button label="Excluir transcrições..." name="delete_transcripts"/> + <button label="Procurar..." label_selected="Procurar" name="log_path_button"/> + </panel> <button label="Tradução..." name="ok_btn"/> <button label="Substituição automática..." name="autoreplace_showgui"/> <button label="Verificando a ortografia..." name="spellcheck_showgui"/> diff --git a/indra/newview/skins/default/xui/pt/panel_preferences_general.xml b/indra/newview/skins/default/xui/pt/panel_preferences_general.xml index c53aa7d5f7..8a0495f9bb 100644 --- a/indra/newview/skins/default/xui/pt/panel_preferences_general.xml +++ b/indra/newview/skins/default/xui/pt/panel_preferences_general.xml @@ -69,6 +69,9 @@ <combo_box.item label="(nunca)" name="item4"/> </combo_box> <text name="text_box3"> - Mensagem do modo ocupado: + Resposta de Não perturbe: </text> + <text_editor name="do_not_disturb_response"> + log_in_to_change + </text_editor> </panel> diff --git a/indra/newview/skins/default/xui/pt/sidepanel_task_info.xml b/indra/newview/skins/default/xui/pt/sidepanel_task_info.xml index 3cfe0fe4f4..f0fd438cef 100644 --- a/indra/newview/skins/default/xui/pt/sidepanel_task_info.xml +++ b/indra/newview/skins/default/xui/pt/sidepanel_task_info.xml @@ -72,6 +72,7 @@ <combo_box.item label="Comprar objeto" name="Buyobject"/> <combo_box.item label="Pagar por objeto" name="Payobject"/> <combo_box.item label="Abrir" name="Open"/> + <combo_box.item label="Zoom" name="Zoom"/> </combo_box> <panel name="perms_inv"> <text name="perm_modify"> diff --git a/indra/newview/skins/default/xui/pt/strings.xml b/indra/newview/skins/default/xui/pt/strings.xml index bc72b86020..4bf18aab70 100644 --- a/indra/newview/skins/default/xui/pt/strings.xml +++ b/indra/newview/skins/default/xui/pt/strings.xml @@ -128,7 +128,7 @@ Sair </string> <string name="create_account_url"> - http://join.secondlife.com/index.php?lang=pt-BR&sourceid=[sourceid] + http://join.secondlife.com/?sourceid=[sourceid] </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 @@ -571,8 +571,8 @@ Pessoas com contas gratuitas não poderão acessar o Second Life no momento para <string name="AvatarAway"> Distante </string> - <string name="AvatarBusy"> - Ocupado + <string name="AvatarDoNotDisturb"> + Não perturbe </string> <string name="AvatarMuted"> Mudo @@ -808,6 +808,12 @@ Pessoas com contas gratuitas não poderão acessar o Second Life no momento para <string name="ST_NO_JOINT"> Não é possÃvel encontrar a raiz (ROOT) ou junção (JOINT). </string> + <string name="NearbyChatTitle"> + Bate-papo local + </string> + <string name="NearbyChatLabel"> + (Bate-papo local) + </string> <string name="whisper"> sussurra: </string> @@ -871,6 +877,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="AgentNameSubst"> + (Você) + </string> <string name="TeleportYourAgent"> Teletransportá-lo </string> @@ -955,18 +964,6 @@ Pessoas com contas gratuitas não poderão acessar o Second Life no momento para <string name="dictionary_files"> Dicionários </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> @@ -1923,8 +1920,8 @@ Pessoas com contas gratuitas não poderão acessar o Second Life no momento para <string name="PanelContentsNewScript"> Novo Script </string> - <string name="BusyModeResponseDefault"> - O residente para o qual escreveu está no modo 'ocupado', ou seja, ele prefere não receber nada no momento. Sua mensagem será exibida como uma MI mais tarde. + <string name="DoNotDisturbModeResponseDefault"> + Este residente ativou o "Não perturbe" e verá sua mensagem mais tarde. </string> <string name="MuteByName"> (por nome) @@ -2037,9 +2034,6 @@ Pessoas com contas gratuitas não poderão acessar o Second Life no momento para <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> @@ -3753,7 +3747,7 @@ If you continue to receive this message, contact the [SUPPORT_SITE]. Região em geral </string> <string name="LocationCtrlSeeAVsTooltip"> - Avatar visÃveis e bate-papo permitido fora deste terreno + Os avatares neste lote não podem ser vistos ou ouvidos por avatares fora dele </string> <string name="LocationCtrlPathfindingDirtyTooltip"> Os objetos que se movem podem não se comportar corretamente nesta região até que ela seja recarregada. @@ -3830,6 +3824,12 @@ If you continue to receive this message, contact the [SUPPORT_SITE]. <string name="IM_unblock_only_groups_friends"> Para visualizar esta mensagem, você deve desmarcar "Apenas amigos e grupos podem me ligar ou enviar MIs" em Preferências/Privacidade. </string> + <string name="OnlineStatus"> + Conectado + </string> + <string name="OfflineStatus"> + Desconectado + </string> <string name="answered_call"> Ligação atendida </string> @@ -3839,6 +3839,9 @@ If you continue to receive this message, contact the [SUPPORT_SITE]. <string name="you_joined_call"> Você entrou na ligação </string> + <string name="you_auto_rejected_call-im"> + Você recusou automaticamente a chamada de voz enquanto "Não perturbe" estava ativado. + </string> <string name="name_started_call"> [NAME] iniciou uma ligação de voz </string> @@ -3851,6 +3854,9 @@ If you continue to receive this message, contact the [SUPPORT_SITE]. <string name="hang_up-im"> Saiu da ligação de voz </string> + <string name="conference-title"> + Bate-papo com várias pessoas + </string> <string name="conference-title-incoming"> Conversa com [AGENT_NAME] </string> @@ -4726,6 +4732,9 @@ Tente colocar o caminho do editor entre aspas. <string name="Command_Chat_Label"> Bate-papo </string> + <string name="Command_Conversations_Label"> + Conversas + </string> <string name="Command_Compass_Label"> Bússola </string> @@ -4801,6 +4810,9 @@ Tente colocar o caminho do editor entre aspas. <string name="Command_Chat_Tooltip"> Bater papo com pessoas próximas usando texto </string> + <string name="Command_Conversations_Tooltip"> + Conversar com todos + </string> <string name="Command_Compass_Tooltip"> Bússola </string> @@ -4930,4 +4942,13 @@ Tente colocar o caminho do editor entre aspas. <string name="UserDictionary"> [Usuário] </string> + <string name="logging_calls_disabled_log_empty"> + As conversas não estão sendo registradas. Para começar a manter um registro, selecione "Salvar: apenas registro" ou "Salvar: registro e transcrições" em Preferências> Bate-papo. + </string> + <string name="logging_calls_disabled_log_not_empty"> + Nenhuma conversa será registrada. Para recomeçar a gravação de registros, selecione "Salvar: apenas registro" ou "Salvar: registro e transcrições" em Preferências> Bate-papo. + </string> + <string name="logging_calls_enabled_log_empty"> + Não há conversas registradas. Depois que você entrar em contato com alguém, ou alguém entrar em contato com você, um registro será exibido aqui. + </string> </strings> diff --git a/indra/newview/skins/default/xui/ru/floater_conversation_log.xml b/indra/newview/skins/default/xui/ru/floater_conversation_log.xml new file mode 100644 index 0000000000..090ac7193a --- /dev/null +++ b/indra/newview/skins/default/xui/ru/floater_conversation_log.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="floater_conversation_log" title="ЖУРÐÐЛ Ð ÐЗГОВОРÐ"> + <panel name="buttons_panel"> + <filter_editor label="Фильтр Ð´Ð»Ñ Ð»ÑŽÐ´ÐµÐ¹" name="people_filter_input"/> + <menu_button name="conversation_view_btn" tool_tip="Параметры проÑмотра/Ñортировки"/> + <menu_button name="conversations_gear_btn" tool_tip="ДейÑÑ‚Ð²Ð¸Ñ Ñ Ð²Ñ‹Ð±Ñ€Ð°Ð½Ð½Ñ‹Ð¼ жителем или группой"/> + </panel> +</floater> diff --git a/indra/newview/skins/default/xui/ru/floater_conversation_preview.xml b/indra/newview/skins/default/xui/ru/floater_conversation_preview.xml new file mode 100644 index 0000000000..23225fcf56 --- /dev/null +++ b/indra/newview/skins/default/xui/ru/floater_conversation_preview.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="preview_conversation" title="Ð ÐЗГОВОР:"> + <floater.string name="Title"> + Ð ÐЗГОВОР: [NAME] + </floater.string> + <text name="page_label" value="Страница"/> +</floater> diff --git a/indra/newview/skins/default/xui/ru/floater_im_container.xml b/indra/newview/skins/default/xui/ru/floater_im_container.xml index b147cfa2b3..eba7a19cd4 100644 --- a/indra/newview/skins/default/xui/ru/floater_im_container.xml +++ b/indra/newview/skins/default/xui/ru/floater_im_container.xml @@ -1,2 +1,29 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<multi_floater name="floater_im_box" title="ОБЩЕÐИЕ"/> +<multi_floater name="floater_im_box" title="ОБЩЕÐИЕ"> + <string name="collapse_icon" value="Conv_toolbar_collapse"/> + <string name="expand_icon" value="Conv_toolbar_expand"/> + <layout_stack name="conversations_stack"> + <layout_panel name="conversations_layout_panel"> + <layout_stack name="conversations_pane_buttons_stack"> + <layout_panel name="conversations_pane_buttons_expanded"> + <menu_button name="sort_btn" tool_tip="Параметры проÑмотра/Ñортировки"/> + <button name="add_btn" tool_tip="Ðачать разговор"/> + <button name="speak_btn" tool_tip="Разговаривать через микрофон"/> + </layout_panel> + <layout_panel name="conversations_pane_buttons_collapsed"> + <button name="expand_collapse_btn" tool_tip="Свернуть/развернуть Ñтот ÑпиÑок"/> + </layout_panel> + </layout_stack> + </layout_panel> + <layout_panel name="messages_layout_panel"> + <panel_container name="im_box_tab_container"> + <panel name="stub_panel"> + <button name="stub_collapse_btn" tool_tip="Свернуть Ñту панель"/> + <text name="stub_textbox"> + Разговор отображаетÑÑ Ð² отдельном окне. [secondlife:/// Вернуть.] + </text> + </panel> + </panel_container> + </layout_panel> + </layout_stack> +</multi_floater> diff --git a/indra/newview/skins/default/xui/ru/floater_im_session.xml b/indra/newview/skins/default/xui/ru/floater_im_session.xml index 604d9dc6d3..ea110ffb44 100644 --- a/indra/newview/skins/default/xui/ru/floater_im_session.xml +++ b/indra/newview/skins/default/xui/ru/floater_im_session.xml @@ -1,8 +1,59 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="panel_im"> - <layout_stack name="im_panels"> - <layout_panel> - <line_editor label="Кому" name="chat_editor"/> - </layout_panel> - </layout_stack> + <floater.string name="call_btn_start"> + Conv_toolbar_open_call + </floater.string> + <floater.string name="call_btn_stop"> + Conv_toolbar_hang_up + </floater.string> + <floater.string name="collapseline_icon" value="Conv_collapse_to_one_line"/> + <floater.string name="expandline_icon" value="Conv_expand_one_line"/> + <floater.string name="collapse_icon" value="Conv_toolbar_collapse"/> + <floater.string name="expand_icon" value="Conv_toolbar_expand"/> + <floater.string name="tear_off_icon" value="Conv_toolbar_arrow_ne"/> + <floater.string name="return_icon" value="Conv_toolbar_arrow_sw"/> + <floater.string name="participant_added" value="[NAME] приглашен(а) на разговор."/> + <floater.string name="multiple_participants_added" value="[NAME] приглашены на разговор."/> + <floater.string name="tooltip_to_separate_window" value="ПеренеÑти Ñтот разговор в отдельное окно"/> + <floater.string name="tooltip_to_main_window" value="Вернуть Ñтот разговор в главное окно"/> + <floater.string name="start_call_button_tooltip" value="Открыть голоÑовое подключение"/> + <floater.string name="end_call_button_tooltip" value="Закрыть голоÑовое подключение"/> + <floater.string name="expcol_button_not_tearoff_tooltip" value="Свернуть Ñту панель"/> + <floater.string name="expcol_button_tearoff_and_expanded_tooltip" value="Свернуть ÑпиÑок учаÑтников"/> + <floater.string name="expcol_button_tearoff_and_collapsed_tooltip" value="Развернуть ÑпиÑок учаÑтников"/> + <view name="contents_view"> + <layout_stack name="main_stack"> + <layout_panel name="toolbar_panel"> + <menu_button name="view_options_btn" tool_tip="Параметры проÑмотра/Ñортировки"/> + <menu_button name="gear_btn" tool_tip="ДейÑÑ‚Ð²Ð¸Ñ Ñ Ð²Ñ‹Ð±Ñ€Ð°Ð½Ð½Ñ‹Ð¼ жителем"/> + <button name="add_btn" tool_tip="Добавить учаÑтника в Ñтот разговор"/> + <button name="voice_call_btn" tool_tip="Открыть голоÑовое подключение"/> + <button name="close_btn" tool_tip="Завершить Ñтот разговор"/> + <button name="expand_collapse_btn" tool_tip="Развернуть/Ñвернуть Ñту панель"/> + </layout_panel> + <layout_panel name="body_panel"> + <layout_stack name="im_panels"> + <layout_panel name="right_part_holder"> + <panel name="trnsAndChat_panel"> + <layout_stack name="translate_and_chat_stack"> + <layout_panel name="translate_chat_checkbox_lp"> + <check_box label="Переводить чат" name="translate_chat_checkbox"/> + </layout_panel> + </layout_stack> + </panel> + </layout_panel> + </layout_stack> + </layout_panel> + <layout_panel name="chat_layout_panel"> + <layout_stack name="input_panels"> + <layout_panel name="input_editor_layout_panel"> + <chat_editor label="Кому" name="chat_editor"/> + </layout_panel> + <layout_panel name="input_button_layout_panel"> + <button name="minz_btn" tool_tip="Показать/Ñкрыть панель Ñообщений"/> + </layout_panel> + </layout_stack> + </layout_panel> + </layout_stack> + </view> </floater> diff --git a/indra/newview/skins/default/xui/ru/floater_incoming_call.xml b/indra/newview/skins/default/xui/ru/floater_incoming_call.xml index 072c20147d..3f61421d0c 100644 --- a/indra/newview/skins/default/xui/ru/floater_incoming_call.xml +++ b/indra/newview/skins/default/xui/ru/floater_incoming_call.xml @@ -10,7 +10,7 @@ анонимно </floater.string> <floater.string name="VoiceInviteP2P"> - вызывает. + вызывает ваÑ. </floater.string> <floater.string name="VoiceInviteAdHoc"> теперь учаÑтвует в групповом голоÑовом чате. @@ -25,9 +25,9 @@ Хотите выйти из чата «[CURRENT_CHAT]» и приÑоединитьÑÑ Ðº Ñтому голоÑовому чату? </floater.string> <text name="question"> - Хотите выйти из чата «[CURRENT_CHAT]» и приÑоединитьÑÑ Ðº Ñтому голоÑовому чату? + ЕÑли вы ответите, вы покинете текущий голоÑовой чат. </text> - <button label="ПринÑÑ‚ÑŒ" label_selected="ПринÑÑ‚ÑŒ" name="Accept"/> - <button label="Отклонить" label_selected="Отклонить" name="Reject"/> - <button label="Ðачать IM" name="Start IM"/> + <button label="Ответить" label_selected="Ответить" name="Accept"/> + <button label="Игнорировать" label_selected="Игнорировать" name="Reject"/> + <button label="Открыть IM" name="Start IM"/> </floater> diff --git a/indra/newview/skins/default/xui/ru/floater_pathfinding_console.xml b/indra/newview/skins/default/xui/ru/floater_pathfinding_console.xml index fa72df04fd..8faddb1805 100644 --- a/indra/newview/skins/default/xui/ru/floater_pathfinding_console.xml +++ b/indra/newview/skins/default/xui/ru/floater_pathfinding_console.xml @@ -71,7 +71,7 @@ <text name="show_label"> Показать: </text> - <check_box label="Мир" name="show_world"/> + <check_box label="ТеÑÑ‚" name="show_world"/> <check_box label="Только перемещаемые предметы" name="show_world_movables_only"/> <check_box label="ÐÐ°Ð²Ð¸Ð³Ð°Ñ†Ð¸Ð¾Ð½Ð½Ð°Ñ Ñетка" name="show_navmesh"/> <text name="show_walkability_label"> 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 db37089aeb..a9a21e7d4a 100644 --- a/indra/newview/skins/default/xui/ru/floater_texture_ctrl.xml +++ b/indra/newview/skins/default/xui/ru/floater_texture_ctrl.xml @@ -19,7 +19,7 @@ <button label="По умолчанию" label_selected="По умолчанию" name="Default"/> <button label="ОчиÑтить" label_selected="ОчиÑтить" name="Blank"/> <button label="Ðет" label_selected="Ðет" name="None"/> - <check_box initial_value="иÑтина" label="ПроÑмотр вживую" name="apply_immediate_check"/> + <check_box initial_value="иÑтина" label="Применить ÑейчаÑ" name="apply_immediate_check"/> <text name="preview_disabled" value="ПроÑмотр отключен"/> <filter_editor label="Фильтровать текÑтуры" name="inventory search editor"/> <check_box initial_value="ложь" label="Показывать папки" name="show_folders_check"/> diff --git a/indra/newview/skins/default/xui/ru/floater_voice_chat_volume.xml b/indra/newview/skins/default/xui/ru/floater_voice_chat_volume.xml new file mode 100644 index 0000000000..5a7e7a7061 --- /dev/null +++ b/indra/newview/skins/default/xui/ru/floater_voice_chat_volume.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="floater_voice_volume" title="ГРОМКОСТЬ ГОЛОСОВОГО ЧÐТÐ"> + <slider label="ГолоÑовой чат" name="chat_voice_volume"/> +</floater> diff --git a/indra/newview/skins/default/xui/ru/floater_voice_effect.xml b/indra/newview/skins/default/xui/ru/floater_voice_effect.xml index 1eb8a94d7a..d3cef042a3 100644 --- a/indra/newview/skins/default/xui/ru/floater_voice_effect.xml +++ b/indra/newview/skins/default/xui/ru/floater_voice_effect.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater label="МеÑта" name="voice_effects" title="ИЗМЕÐЕÐИЕ ГОЛОСÐ"> +<floater label="МеÑта" name="voice_effects" title="ПРОСМОТРИЗМЕÐЕÐИЯ ГОЛОСÐ"> <string name="no_voice_effect"> (Ðет Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð³Ð¾Ð»Ð¾Ñа) </string> diff --git a/indra/newview/skins/default/xui/ru/floater_voice_volume.xml b/indra/newview/skins/default/xui/ru/floater_voice_volume.xml new file mode 100644 index 0000000000..aca6bd518a --- /dev/null +++ b/indra/newview/skins/default/xui/ru/floater_voice_volume.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<!-- + Not can_close / no title to avoid window chrome + Single instance - only have one at a time, recycle it each spawn +--> +<floater name="floater_voice_volume" title="ГРОМКОСТЬ ГОЛОСÐ"> + <slider name="volume_slider" tool_tip="ГромкоÑÑ‚ÑŒ голоÑа" value="0.5"/> +</floater> diff --git a/indra/newview/skins/default/xui/ru/menu_cof_gear.xml b/indra/newview/skins/default/xui/ru/menu_cof_gear.xml index 0332c03a04..b7a32dfd75 100644 --- a/indra/newview/skins/default/xui/ru/menu_cof_gear.xml +++ b/indra/newview/skins/default/xui/ru/menu_cof_gear.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <toggleable_menu name="Gear COF"> <menu label="ÐÐ¾Ð²Ð°Ñ Ð¾Ð´ÐµÐ¶Ð´Ð°" name="COF.Gear.New_Clothes"/> - <menu label="Ðовые чаÑти тела" name="COF.Geear.New_Body_Parts"/> + <menu label="Ðовые чаÑти тела" name="COF.Gear.New_Body_Parts"/> </toggleable_menu> diff --git a/indra/newview/skins/default/xui/ru/menu_conversation.xml b/indra/newview/skins/default/xui/ru/menu_conversation.xml new file mode 100644 index 0000000000..530b1ea704 --- /dev/null +++ b/indra/newview/skins/default/xui/ru/menu_conversation.xml @@ -0,0 +1,31 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_conversation_participant"> + <menu_item_call label="Закрыть разговор" name="close_conversation"/> + <menu_item_call label="Открыть голоÑовой чат" name="open_voice_conversation"/> + <menu_item_call label="Прекратить голоÑовой чат" name="disconnect_from_voice"/> + <menu_item_call label="Смотреть профиль" name="view_profile"/> + <menu_item_call label="IM" name="im"/> + <menu_item_call label="Предложить телепортацию" name="offer_teleport"/> + <menu_item_call label="ГолоÑовой вызов" name="voice_call"/> + <menu_item_call label="Журнал чата..." name="chat_history"/> + <menu_item_call label="Добавить друга" name="add_friend"/> + <menu_item_call label="Удалить друга" name="remove_friend"/> + <menu_item_call label="Удалить друзей" name="remove_friends"/> + <menu_item_call label="ПриглаÑить в группу..." name="invite_to_group"/> + <menu_item_call label="Приблизить" name="zoom_in"/> + <menu_item_call label="Карта" name="map"/> + <menu_item_call label="ПоделитьÑÑ" name="share"/> + <menu_item_call label="Заплатить" name="pay"/> + <menu_item_check label="Блокировать голоÑ" name="block_unblock"/> + <menu_item_check label="Блокировать текÑÑ‚" name="MuteText"/> + <menu_item_call label="Профиль группы" name="group_profile"/> + <menu_item_call label="Ðктивировать группу" name="activate_group"/> + <menu_item_call label="Покинуть группу" name="leave_group"/> + <context_menu label="Параметры модератора" name="Moderator Options"> + <menu_item_check label="Разрешить текÑтовый чат" name="AllowTextChat"/> + <menu_item_call label="Заглушить Ñтого учаÑтника" name="ModerateVoiceMuteSelected"/> + <menu_item_call label="Позволить говорить Ñтому учаÑтнику" name="ModerateVoiceUnMuteSelected"/> + <menu_item_call label="Заглушить вÑех" name="ModerateVoiceMute"/> + <menu_item_call label="Позволить говорить вÑем" name="ModerateVoiceUnmute"/> + </context_menu> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/ru/menu_conversation_log_gear.xml b/indra/newview/skins/default/xui/ru/menu_conversation_log_gear.xml new file mode 100644 index 0000000000..3fbffbe038 --- /dev/null +++ b/indra/newview/skins/default/xui/ru/menu_conversation_log_gear.xml @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="Conversation Context Menu"> + <menu_item_call label="IM..." name="IM"/> + <menu_item_call label="ГолоÑовой вызов..." name="Call"/> + <menu_item_call label="Открыть журнал чата..." name="Chat history"/> + <menu_item_call label="Смотреть профиль" name="View Profile"/> + <menu_item_call label="Предложить телепорт" name="teleport"/> + <menu_item_call label="Добавить друга" name="add_friend"/> + <menu_item_call label="Удалить из друзей" name="remove_friend"/> + <menu_item_call label="ПриглаÑить в группу..." name="Invite"/> + <menu_item_call label="Карта" name="Map"/> + <menu_item_call label="ПоделитьÑÑ" name="Share"/> + <menu_item_call label="Заплатить" name="Pay"/> + <menu_item_check label="Черный ÑпиÑок" name="Block/Unblock"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/ru/menu_conversation_log_view.xml b/indra/newview/skins/default/xui/ru/menu_conversation_log_view.xml new file mode 100644 index 0000000000..928146e273 --- /dev/null +++ b/indra/newview/skins/default/xui/ru/menu_conversation_log_view.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_conversation_view"> + <menu_item_check label="Сортировать по имени" name="sort_by_name"/> + <menu_item_check label="Сортировать по дате" name="sort_by_date"/> + <menu_item_check label="Сначала друзьÑ" name="sort_by_friends"/> + <menu_item_call label="ПоÑмотреть журнал локального чата..." name="view_nearby_chat_history"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/ru/menu_im_conversation.xml b/indra/newview/skins/default/xui/ru/menu_im_conversation.xml new file mode 100644 index 0000000000..1db0b8bae3 --- /dev/null +++ b/indra/newview/skins/default/xui/ru/menu_im_conversation.xml @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="Conversation Gear Menu"> + <menu_item_call label="Смотреть профиль" name="View Profile"/> + <menu_item_call label="Добавить друга" name="Add Friend"/> + <menu_item_call label="Удалить друга" name="remove_friend"/> + <menu_item_call label="Предложить телепортацию" name="offer_teleport"/> + <menu_item_call label="ПриглаÑить в группу..." name="invite_to_group"/> + <menu_item_call label="Журнал чата..." name="chat_history"/> + <menu_item_call label="Приблизить" name="zoom_in"/> + <menu_item_call label="Карта" name="map"/> + <menu_item_call label="ПоделитьÑÑ" name="Share"/> + <menu_item_call label="Заплатить" name="Pay"/> + <menu_item_check label="Блокировать голоÑ" name="Block/Unblock"/> + <menu_item_check label="Блокировать текÑÑ‚" name="MuteText"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/ru/menu_im_session_showmodes.xml b/indra/newview/skins/default/xui/ru/menu_im_session_showmodes.xml new file mode 100644 index 0000000000..35cff8e4bf --- /dev/null +++ b/indra/newview/skins/default/xui/ru/menu_im_session_showmodes.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_modes"> + <menu_item_check label="Компактный вид" name="compact_view"/> + <menu_item_check label="Развернутый вид" name="expanded_view"/> + <menu_item_check label="Показать времÑ" name="IMShowTime"/> + <menu_item_check label="Показывать имена при разговорах" name="IMShowNamesForP2PConv"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/ru/menu_object_icon.xml b/indra/newview/skins/default/xui/ru/menu_object_icon.xml index 6229b2e72f..0c50abcfbd 100644 --- a/indra/newview/skins/default/xui/ru/menu_object_icon.xml +++ b/indra/newview/skins/default/xui/ru/menu_object_icon.xml @@ -2,4 +2,6 @@ <menu name="Object Icon Menu"> <menu_item_call label="Профиль объекта..." name="Object Profile"/> <menu_item_call label="Блокировать..." name="Block"/> + <menu_item_call label="Показать на карте" name="show_on_map"/> + <menu_item_call label="Телепорт в меÑтоположение объекта" name="teleport_to_object"/> </menu> diff --git a/indra/newview/skins/default/xui/ru/menu_outfit_gear.xml b/indra/newview/skins/default/xui/ru/menu_outfit_gear.xml index 93dbd7d6a7..d379a17216 100644 --- a/indra/newview/skins/default/xui/ru/menu_outfit_gear.xml +++ b/indra/newview/skins/default/xui/ru/menu_outfit_gear.xml @@ -23,6 +23,8 @@ <menu_item_call label="Ðовые волоÑÑ‹" name="New Hair"/> <menu_item_call label="Ðовые глаза" name="New Eyes"/> </menu> + <menu_item_call label="Открыть вÑе папки" name="expand"/> + <menu_item_call label="Закрыть вÑе папки" name="collapse"/> <menu_item_call label="Переименовать коÑтюм" name="rename"/> <menu_item_call label="Удалить коÑтюм" name="delete_outfit"/> </toggleable_menu> diff --git a/indra/newview/skins/default/xui/ru/menu_participant_view.xml b/indra/newview/skins/default/xui/ru/menu_participant_view.xml new file mode 100644 index 0000000000..851a42d428 --- /dev/null +++ b/indra/newview/skins/default/xui/ru/menu_participant_view.xml @@ -0,0 +1,13 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="participant_manu_view"> + <menu_item_check label="Сортировать разговоры по типу" name="sort_sessions_by_type"/> + <menu_item_check label="Сортировать разговоры по имени" name="sort_sessions_by_name"/> + <menu_item_check label="Сортировать разговоры по поÑледнему дейÑтвию" name="sort_sessions_by_recent"/> + <menu_item_check label="Сортировать учаÑтников по имени" name="sort_participants_by_name"/> + <menu_item_check label="Сортировать учаÑтников по поÑледнему дейÑтвию" name="sort_participants_by_recent"/> + <menu_item_call label="Изменить наÑтройки..." name="chat_preferences"/> + <menu_item_call label="ÐаÑтройки приватноÑти..." name="privacy_preferences"/> + <menu_item_check label="Журнал разговора..." name="Conversation"/> + <menu_item_check label="ПеревеÑти локальный чат" name="Translate_chat"/> + <menu_item_check label="ÐаÑтройки перевода..." name="Translation_settings"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/ru/menu_people_blocked_gear.xml b/indra/newview/skins/default/xui/ru/menu_people_blocked_gear.xml new file mode 100644 index 0000000000..157f2ad5e2 --- /dev/null +++ b/indra/newview/skins/default/xui/ru/menu_people_blocked_gear.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_blocked_gear"> + <menu_item_call label="Разблокировать" name="unblock"/> + <menu_item_call label="Профиль…" name="profile"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/ru/menu_people_blocked_plus.xml b/indra/newview/skins/default/xui/ru/menu_people_blocked_plus.xml new file mode 100644 index 0000000000..f42e8f8609 --- /dev/null +++ b/indra/newview/skins/default/xui/ru/menu_people_blocked_plus.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_blocked_plus"> + <menu_item_call label="Блокировать Ð¶Ð¸Ñ‚ÐµÐ»Ñ Ð¿Ð¾ имени..." name="block_resident_by_name"/> + <menu_item_call label="Блокировать объект по имени" name="block_object_by_name"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/ru/menu_people_blocked_view.xml b/indra/newview/skins/default/xui/ru/menu_people_blocked_view.xml new file mode 100644 index 0000000000..8c0150e8ae --- /dev/null +++ b/indra/newview/skins/default/xui/ru/menu_people_blocked_view.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_blocked_view"> + <menu_item_check label="Сортировать по имени" name="sort_by_name"/> + <menu_item_check label="Сортировать по типу" name="sort_by_type"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/ru/menu_people_friends_view.xml b/indra/newview/skins/default/xui/ru/menu_people_friends_view.xml new file mode 100644 index 0000000000..7b2dba0539 --- /dev/null +++ b/indra/newview/skins/default/xui/ru/menu_people_friends_view.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_group_plus"> + <menu_item_check label="Сортировать по имени" name="sort_name"/> + <menu_item_check label="Сортировать по ÑтатуÑу" name="sort_status"/> + <menu_item_check label="Показывать значки людей" name="view_icons"/> + <menu_item_check label="Показывать разрешенные дейÑтвиÑ" name="view_permissions"/> + <menu_item_check label="ПоÑмотреть журнал разговора..." name="view_conversation"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/ru/menu_people_groups.xml b/indra/newview/skins/default/xui/ru/menu_people_groups.xml index e734a83ef0..78d73c9d1e 100644 --- a/indra/newview/skins/default/xui/ru/menu_people_groups.xml +++ b/indra/newview/skins/default/xui/ru/menu_people_groups.xml @@ -2,7 +2,7 @@ <menu name="menu_group_plus"> <menu_item_call label="ИнформациÑ" name="View Info"/> <menu_item_call label="Чат" name="Chat"/> - <menu_item_call label="Звонок" name="Call"/> + <menu_item_call label="ГолоÑовой вызов" name="Call"/> <menu_item_call label="ÐктивациÑ" name="Activate"/> <menu_item_call label="Покинуть" name="Leave"/> </menu> diff --git a/indra/newview/skins/default/xui/ru/menu_people_groups_view.xml b/indra/newview/skins/default/xui/ru/menu_people_groups_view.xml new file mode 100644 index 0000000000..cbf1c64774 --- /dev/null +++ b/indra/newview/skins/default/xui/ru/menu_people_groups_view.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_group_plus"> + <menu_item_check label="Показывать значки группы" name="Display Group Icons"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/ru/menu_people_nearby.xml b/indra/newview/skins/default/xui/ru/menu_people_nearby.xml index ebce959044..d05b7e7d01 100644 --- a/indra/newview/skins/default/xui/ru/menu_people_nearby.xml +++ b/indra/newview/skins/default/xui/ru/menu_people_nearby.xml @@ -1,13 +1,16 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <context_menu name="Avatar Context Menu"> - <menu_item_call label="Смотреть профиль" name="View Profile"/> - <menu_item_call label="Ð’ друзьÑ" name="Add Friend"/> - <menu_item_call label="Удалить из друзей" name="Remove Friend"/> - <menu_item_call label="IM" name="IM"/> - <menu_item_call label="Звонок" name="Call"/> - <menu_item_call label="Карта" name="Map"/> - <menu_item_call label="ПоделитьÑÑ" name="Share"/> - <menu_item_call label="Заплатить" name="Pay"/> - <menu_item_check label="Черный ÑпиÑок" name="Block/Unblock"/> - <menu_item_call label="Предложить телепорт" name="teleport"/> + <menu_item_call label="Смотреть профиль" name="view_profile"/> + <menu_item_call label="IM" name="im"/> + <menu_item_call label="Предложить телепорт" name="offer_teleport"/> + <menu_item_call label="ГолоÑовой вызов" name="voice_call"/> + <menu_item_call label="ПоÑмотреть журнал чата..." name="chat_history"/> + <menu_item_call label="Добавить друга" name="add_friend"/> + <menu_item_call label="Удалить из друзей" name="remove_friend"/> + <menu_item_call label="ПриглаÑить в группу..." name="invite_to_group"/> + <menu_item_call label="Приблизить" name="zoom_in"/> + <menu_item_call label="Карта" name="map"/> + <menu_item_call label="ПоделитьÑÑ" name="share"/> + <menu_item_call label="Заплатить" name="pay"/> + <menu_item_check label="Черный ÑпиÑок" name="block_unblock"/> </context_menu> diff --git a/indra/newview/skins/default/xui/ru/menu_people_nearby_multiselect.xml b/indra/newview/skins/default/xui/ru/menu_people_nearby_multiselect.xml index 0e8e0d4053..88eb56c9f5 100644 --- a/indra/newview/skins/default/xui/ru/menu_people_nearby_multiselect.xml +++ b/indra/newview/skins/default/xui/ru/menu_people_nearby_multiselect.xml @@ -1,10 +1,10 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <context_menu name="Multi-Selected People Context Menu"> - <menu_item_call label="Добавить в друзьÑ" name="Add Friends"/> - <menu_item_call label="Удалить из друзей" name="Remove Friend"/> - <menu_item_call label="IM" name="IM"/> - <menu_item_call label="Звонок" name="Call"/> - <menu_item_call label="ПоделитьÑÑ" name="Share"/> - <menu_item_call label="Заплатить" name="Pay"/> - <menu_item_call label="Предложить телепорт" name="teleport"/> + <menu_item_call label="Добавить в друзьÑ" name="add_friends"/> + <menu_item_call label="Удалить из друзей" name="remove_friends"/> + <menu_item_call label="IM" name="im"/> + <menu_item_call label="Звонок" name="call"/> + <menu_item_call label="ПоделитьÑÑ" name="share"/> + <menu_item_call label="Заплатить" name="pay"/> + <menu_item_call label="Предложить телепорт" name="offer_teleport"/> </context_menu> diff --git a/indra/newview/skins/default/xui/ru/menu_people_nearby_view.xml b/indra/newview/skins/default/xui/ru/menu_people_nearby_view.xml new file mode 100644 index 0000000000..2bc353ad58 --- /dev/null +++ b/indra/newview/skins/default/xui/ru/menu_people_nearby_view.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_group_plus"> + <menu_item_check label="Сортировать по недавно говорившим" name="sort_by_recent_speakers"/> + <menu_item_check label="Сортировать по имени" name="sort_name"/> + <menu_item_check label="Сортировать по раÑÑтоÑнию" name="sort_distance"/> + <menu_item_check label="Показывать значки людей" name="view_icons"/> + <menu_item_check label="Смотреть карту" name="view_map"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/ru/menu_people_recent_view.xml b/indra/newview/skins/default/xui/ru/menu_people_recent_view.xml new file mode 100644 index 0000000000..a009cf081f --- /dev/null +++ b/indra/newview/skins/default/xui/ru/menu_people_recent_view.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_group_plus"> + <menu_item_check label="Сортировать по времени" name="sort_most"/> + <menu_item_check label="Сортировать по имени" name="sort_name"/> + <menu_item_check label="Показывать значки людей" name="view_icons"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/ru/menu_url_agent.xml b/indra/newview/skins/default/xui/ru/menu_url_agent.xml index 0ba3ee152a..230d049fad 100644 --- a/indra/newview/skins/default/xui/ru/menu_url_agent.xml +++ b/indra/newview/skins/default/xui/ru/menu_url_agent.xml @@ -1,6 +1,8 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <context_menu name="Url Popup"> - <menu_item_call label="Показать профиль жителÑ" name="show_agent"/> + <menu_item_call label="Смотреть профиль" name="show_agent"/> + <menu_item_call label="Отправить Ñообщение..." name="send_im"/> + <menu_item_call label="Добавить в друзьÑ..." name="add_friend"/> <menu_item_call label="Копировать название в буфер обмена" name="url_copy_label"/> <menu_item_call label="Копировать URL-Ð°Ð´Ñ€ÐµÑ SL в буфер обмена" name="url_copy"/> </context_menu> diff --git a/indra/newview/skins/default/xui/ru/menu_url_objectim.xml b/indra/newview/skins/default/xui/ru/menu_url_objectim.xml index 6e7800d3f5..1326db708e 100644 --- a/indra/newview/skins/default/xui/ru/menu_url_objectim.xml +++ b/indra/newview/skins/default/xui/ru/menu_url_objectim.xml @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <context_menu name="Url Popup"> - <menu_item_call label="Показать информацию об объекте" name="show_object"/> + <menu_item_call label="Профиль объекта..." name="show_object"/> <menu_item_call label="Показать на карте" name="show_on_map"/> <menu_item_call label="Телепорт в меÑтоположение объекта" name="teleport_to_object"/> <menu_item_call label="Копировать название объекта в буфер обмена" name="url_copy_label"/> diff --git a/indra/newview/skins/default/xui/ru/menu_viewer.xml b/indra/newview/skins/default/xui/ru/menu_viewer.xml index d9425937c3..92a9943b93 100644 --- a/indra/newview/skins/default/xui/ru/menu_viewer.xml +++ b/indra/newview/skins/default/xui/ru/menu_viewer.xml @@ -16,10 +16,7 @@ <menu_item_call label="ОÑтановить анимацию" name="Stop Animating My Avatar"/> <menu_item_call label="Ходьба / бег / полет..." name="Walk / run / fly"/> </menu> - <menu label="СтатуÑ" name="Status"> - <menu_item_call label="Ðет на меÑте" name="Set Away"/> - <menu_item_call label="Ðе беÑпокоить" name="Set Busy"/> - </menu> + <menu label="СтатуÑ" name="Status"/> <menu_item_call label="Купить L$..." name="Buy and Sell L$"/> <menu_item_call label="Торговые иÑходÑщие..." name="MerchantOutbox"/> <menu_item_call label="Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ð¾Ð½Ð½Ð°Ñ Ð¿Ð°Ð½ÐµÐ»ÑŒ аккаунта..." name="Manage My Account"/> @@ -30,14 +27,18 @@ <menu_item_call label="Выход из [APP_NAME]" name="Quit"/> </menu> <menu label="Общение" name="Communicate"> - <menu_item_check label="Чат..." name="Nearby Chat"/> + <menu_item_check label="Разговоры..." name="Conversations"/> + <menu_item_check label="Локальный чат..." name="Nearby Chat"/> <menu_item_check label="Говорить" name="Speak"/> - <menu_item_check label="ÐаÑтройки голоÑа..." name="Nearby Voice"/> - <menu_item_check label="Изменение голоÑа..." name="ShowVoice"/> + <menu label="Изменение голоÑа" name="VoiceMorphing"> + <menu_item_check label="Без Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð³Ð¾Ð»Ð¾Ñа" name="NoVoiceMorphing"/> + <menu_item_check label="ПроÑмотр..." name="Preview"/> + <menu_item_call label="ПодпиÑатьÑÑ..." name="Subscribe"/> + </menu> <menu_item_check label="ЖеÑÑ‚Ñ‹..." name="Gestures"/> - <menu_item_call label="ДрузьÑ" name="My Friends"/> - <menu_item_call label="Группы" name="My Groups"/> - <menu_item_call label="Люди неподалеку" name="Active Speakers"/> + <menu_item_check label="ДрузьÑ" name="My Friends"/> + <menu_item_check label="Группы" name="My Groups"/> + <menu_item_check label="Люди неподалеку" name="Active Speakers"/> <menu_item_call label="Черный ÑпиÑок" name="Block List"/> </menu> <menu label="Мир" name="World"> @@ -305,7 +306,7 @@ <menu_item_call label="Ð’Ñ‹Ð±Ñ€Ð°Ð½Ð½Ð°Ñ Ñ‚ÐµÐºÑтура в оÑнове" name="Selected Texture Info Basis"/> <menu_item_check label="КаркаÑ" name="Wireframe"/> <menu_item_check label="Смыкание объектов" name="Object-Object Occlusion"/> - <menu_item_check label="ОÑвещение и тени" name="Lighting and Shadows"/> + <menu_item_check label="ОÑвещение и тени" name="Advanced Lighting Model"/> <menu_item_check label="Тени от Ñолнца, луны и прожекторов" name="Shadows from Sun/Moon/Projectors"/> <menu_item_check label="SSAO и Ñглаживание теней" name="SSAO and Shadow Smoothing"/> <menu_item_check label="Отладка GL" name="Debug GL"/> diff --git a/indra/newview/skins/default/xui/ru/notifications.xml b/indra/newview/skins/default/xui/ru/notifications.xml index 85b7074253..00ab0b5763 100644 --- a/indra/newview/skins/default/xui/ru/notifications.xml +++ b/indra/newview/skins/default/xui/ru/notifications.xml @@ -516,6 +516,24 @@ </url> <usetemplate ignoretext="Мой графичеÑкий драйвер уÑтарел" name="okcancelignore" notext="Ðет" yestext="Да"/> </notification> + <notification name="AMDOldDriver"> + Возможно, Ð´Ð»Ñ Ð²Ð°ÑˆÐµÐ¹ видеокарты имеетÑÑ Ð±Ð¾Ð»ÐµÐµ новый драйвер. Обновление драйвера может ÑущеÑтвенно повыÑить быÑтродейÑтвие. + + Проверить наличие Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ð´Ñ€Ð°Ð¹Ð²ÐµÑ€Ð° по адреÑу [_URL]? + <url name="url"> + http://support.amd.com/us/Pages/AMDSupportHub.aspx + </url> + <usetemplate ignoretext="Мой графичеÑкий драйвер уÑтарел" name="okcancelignore" notext="Ðет" yestext="Да"/> + </notification> + <notification name="NVIDIAOldDriver"> + Возможно, Ð´Ð»Ñ Ð²Ð°ÑˆÐµÐ¹ видеокарты имеетÑÑ Ð±Ð¾Ð»ÐµÐµ новый драйвер. Обновление драйвера может ÑущеÑтвенно повыÑить быÑтродейÑтвие. + + Проверить наличие Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ð´Ñ€Ð°Ð¹Ð²ÐµÑ€Ð° по адреÑу [_URL]? + <url name="url"> + http://www.nvidia.com/Download/index.aspx?lang=ru-ru + </url> + <usetemplate ignoretext="Мой графичеÑкий драйвер уÑтарел" name="okcancelignore" notext="Ðет" yestext="Да"/> + </notification> <notification name="UnknownGPU"> Ð’ вашей ÑиÑтеме уÑтановлена графичеÑÐºÐ°Ñ ÐºÐ°Ñ€Ñ‚Ð°, которую [APP_NAME] не может раÑпознать. Так чаÑто бывает, еÑли новое оборудование еще не было проверено на работу Ñ [APP_NAME]. Скорее вÑего, оно будет работать нормально, но, возможно, придетÑÑ Ð¾Ñ‚Ñ€ÐµÐ³ÑƒÐ»Ð¸Ñ€Ð¾Ð²Ð°Ñ‚ÑŒ параметры графики. @@ -1546,10 +1564,13 @@ http://secondlife.com/download. Ð¡ÐµÐ¹Ñ‡Ð°Ñ Ð½ÐµÐ²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ предложить дружбу. Повторите попытку через минуту. <usetemplate name="okbutton" yestext="OK"/> </notification> - <notification name="BusyModeSet"> - УÑтановлен режим «ЗанÑт». -Ð¡Ð¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ñ‡Ð°Ñ‚Ð° и IM будут Ñкрыты. Ðа IM-ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð±ÑƒÐ´ÐµÑ‚ возвращатьÑÑ Ð·Ð°Ð´Ð°Ð½Ð½Ñ‹Ð¹ ответ в режиме «ЗанÑт». Ð’Ñе Ð¿Ñ€ÐµÐ´Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ñ‚ÐµÐ»ÐµÐ¿Ð¾Ñ€Ñ‚Ð°Ñ†Ð¸Ð¸ будут отклонÑÑ‚ÑŒÑÑ. Ð’Ñе Ð¿Ñ€ÐµÐ´Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð¸Ð½Ð²ÐµÐ½Ñ‚Ð°Ñ€Ñ Ð±ÑƒÐ´ÑƒÑ‚ направлены в корзину. - <usetemplate ignoretext="Смена моего ÑтатуÑа на режим «ЗанÑт»" name="okignore" yestext="OK"/> + <notification name="DoNotDisturbModeSet"> + Режим «Ðе беÑпокоить» включен. Ð’Ñ‹ не будете получать уведомлений о входÑщих вызовах. + +- Другие жители будут получать ваш ответ, уÑтановленный Ð´Ð»Ñ Ñ€ÐµÐ¶Ð¸Ð¼Ð° «Ðе беÑпокоить» (ÐаÑтройки > Общие). +- ÐŸÑ€ÐµÐ´Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ñ‚ÐµÐ»ÐµÐ¿Ð¾Ñ€Ñ‚Ð°Ñ†Ð¸Ð¸ будут отклонÑÑ‚ÑŒÑÑ. +- ГолоÑовые вызовы будут отклонÑÑ‚ÑŒÑÑ. + <usetemplate ignoretext="Смена моего ÑтатуÑа на режим «Ðе беÑпокоить»" name="okignore" yestext="OK"/> </notification> <notification name="JoinedTooManyGroupsMember"> ДоÑтигнуто макÑимальное количеÑтво групп. Выйдите из другой группы, прежде чем вÑтупать в Ñту, или отклоните предложение. @@ -2033,6 +2054,10 @@ http://secondlife.com/download. Перейти на [http://secondlife.com/account/ информационную панель], чтобы увидеть иÑторию аккаунта? <usetemplate ignoretext="ЗапуÑтить браузер Ð´Ð»Ñ Ð¿Ñ€Ð¾Ñмотра иÑтории аккаунта" name="okcancelignore" notext="Отмена" yestext="Перейти на Ñтраницу"/> </notification> + <notification name="ConfirmAddingChatParticipants"> + При добавлении учаÑтника в ÑущеÑтвующий разговор будет Ñоздан новый разговор. Ð’Ñе учаÑтники получат ÑƒÐ²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ñ Ð¾ новом разговоре. + <usetemplate ignoretext="Подтвердите добавление учаÑтников чата" name="okcancelignore" notext="Отмена" yestext="ОК"/> + </notification> <notification name="ConfirmQuit"> Выйти из программы? <usetemplate ignoretext="Подтверждать перед выходом" name="okcancelignore" notext="Ðе выходить" yestext="Выйти"/> @@ -2107,14 +2132,14 @@ http://secondlife.com/download. <button ignore="Ðе заменÑÑ‚ÑŒ" name="No" text="Отмена"/> </form> </notification> - <notification label="Предупреждение о режиме «ЗанÑт»" name="BusyModePay"> - У Ð²Ð°Ñ Ð²ÐºÐ»ÑŽÑ‡ÐµÐ½ режим «ЗанÑт», поÑтому вы не получите никаких предметов, предлагаемых в обмен на Ñтот платеж. + <notification label="Предупреждение режима «Ðе беÑпокоить»" name="DoNotDisturbModePay"> + Включен режим «Ðе беÑпокоить». Ð’Ñ‹ не будете получать никаких предметов, предлагаемых в обмен за Ñтот платеж. -Хотите отключить режим «ЗанÑт» до Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð¸Ñ Ñтой транзакции? +Отключить режим «Ðе беÑпокоить» перед завершением Ñтой операции? <form name="form"> - <ignore name="ignore" text="Я ÑобираюÑÑŒ заплатить за Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð¸Ð»Ð¸ объект, когда включен режим «ЗанÑт»"/> - <button ignore="Ð’Ñегда отключать режим «ЗанÑт»" name="Yes" text="OK"/> - <button ignore="Ðе отключать режим «ЗанÑт»" name="No" text="Отмена"/> + <ignore name="ignore" text="Я ÑобираюÑÑŒ заплатить за Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð¸Ð»Ð¸ объект, когда включен режим «Ðе беÑпокоить»"/> + <button ignore="Ð’Ñегда выходить из режима «Ðе беÑпокоить»" name="Yes" text="OK"/> + <button ignore="Ðе выходить из режима «Ðе беÑпокоить»" name="No" text="Отмена"/> </form> </notification> <notification name="ConfirmDeleteProtectedCategory"> @@ -2249,11 +2274,8 @@ http://secondlife.com/download. <notification name="GroupNotice"> Раздел: [SUBJECT], Ñообщение: [MESSAGE] </notification> - <notification name="FriendOnline"> - <nolink>[NAME]</nolink> в Ñети - </notification> - <notification name="FriendOffline"> - <nolink>[NAME]</nolink> не в Ñети + <notification name="FriendOnlineOffline"> + <nolink>[NAME]</nolink> [STATUS] </notification> <notification name="AddSelfFriend"> Ð’Ñ‹ лучше вÑех, но Ð½ÐµÐ»ÑŒÐ·Ñ Ð´Ð¾Ð±Ð°Ð²Ð¸Ñ‚ÑŒ в Ð´Ñ€ÑƒÐ·ÑŒÑ ÑÐµÐ±Ñ Ñамого. @@ -2482,13 +2504,6 @@ http://secondlife.com/download. <notification name="DynamicPathfindingDisabled"> Ð’ Ñтом регионе не разрешен динамичеÑкий поиÑк пути. Возможны Ð½Ð°Ñ€ÑƒÑˆÐµÐ½Ð¸Ñ Ñ€Ð°Ð±Ð¾Ñ‚Ñ‹ Ñкриптовых объектов Ñ Ð¸Ñпользованием вызовов LSL поиÑка пути. </notification> - <notification name="PathfindingRebakeNavmesh"> - Изменение некоторых объектов в регионе может привеÑти к неправильному поведению других подвижных объектов. Чтобы иÑправить их поведение, нажмите кнопку «ВоÑÑтановить регион». Более Ð¿Ð¾Ð´Ñ€Ð¾Ð±Ð½Ð°Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ â€“ по ÑÑылке «Справка». - <url name="url"> - http://wiki.secondlife.com/wiki/Pathfinding_Tools_in_the_Second_Life_Viewer - </url> - <usetemplate helptext="Справка" ignoretext="Изменение некоторых объектов в регионе может привеÑти к неправильному поведению других подвижных объектов." name="okhelpignore" yestext="OK"/> - </notification> <notification name="PathfindingCannotRebakeNavmesh"> Произошла ошибка. Возможно, неполадка в Ñети или на Ñервере, или у Ð²Ð°Ñ Ð½ÐµÑ‚ прав на ÑтроительÑтво. Иногда Ð´Ð»Ñ ÑƒÑÑ‚Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ñтой проблемы доÑтаточно выйти и Ñнова войти. <usetemplate name="okbutton" yestext="OK"/> @@ -2751,7 +2766,7 @@ http://secondlife.com/download. <notification name="ScriptQuestionCaution"> Предупреждение. Объект «<nolink>[OBJECTNAME]</nolink>» требует полного доÑтупа к вашему аккаунту Ð´Ð»Ñ Linden-долларов. ЕÑли разрешить такой доÑтуп, объект Ñможет в любое Ð²Ñ€ÐµÐ¼Ñ Ñнимать ÑредÑтва Ñ Ð²Ð°ÑˆÐµÐ³Ð¾ аккаунта или полноÑтью опуÑтошать его неоднократно и без предупреждениÑ. -Такое требование чаще вÑего незаконно. Ðе разрешайте доÑтуп к Ñвоему аккаунту, еÑли только не полноÑтью оÑознаете, зачем он нужен Ñтому объекту. +Ðе разрешайте доÑтуп к Ñвоему аккаунту, еÑли только не полноÑтью оÑознаете, зачем он нужен Ñтому объекту. <form name="form"> <button name="Grant" text="Разрешить полный доÑтуп"/> <button name="Deny" text="Отклонить"/> @@ -3333,4 +3348,632 @@ http://secondlife.com/download. Ð’Ñ‹ удалÑете неÑколько предметов ([NUM_ITEMS]). Продолжить? <usetemplate ignoretext="Удалить неÑколько предметов?" name="okcancelignore" notext="Ðет" yestext="Да"/> </notification> + <notification name="AvatarFrozen"> + [AV_FREEZER] заморозил ваÑ. Ð’ Ñто Ð²Ñ€ÐµÐ¼Ñ Ð²Ñ‹ не можете перемещатьÑÑ Ð¸ выполнÑÑ‚ÑŒ другие дейÑÑ‚Ð²Ð¸Ñ Ñ Ð¼Ð¸Ñ€Ð¾Ð¼. + </notification> + <notification name="AvatarFrozenDuration"> + [AV_FREEZER] заморозил Ð²Ð°Ñ Ð½Ð° [AV_FREEZE_TIME] Ñек. Ð’ Ñто Ð²Ñ€ÐµÐ¼Ñ Ð²Ñ‹ не можете перемещатьÑÑ Ð¸ выполнÑÑ‚ÑŒ другие дейÑÑ‚Ð²Ð¸Ñ Ñ Ð¼Ð¸Ñ€Ð¾Ð¼. + </notification> + <notification name="YouFrozeAvatar"> + Ðватар заморожен. + </notification> + <notification name="AvatarHasUnFrozenYou"> + [AV_FREEZER] разморозил ваÑ. + </notification> + <notification name="AvatarUnFrozen"> + Ðватар разморожен. + </notification> + <notification name="AvatarFreezeFailure"> + Ðе удалоÑÑŒ заморозить: у Ð²Ð°Ñ Ð½ÐµÑ‚ прав админиÑтратора на Ñтом учаÑтке. + </notification> + <notification name="AvatarFreezeThaw"> + Заморозка кончилаÑÑŒ, занимайтеÑÑŒ Ñвоим делом. + </notification> + <notification name="AvatarCantFreeze"> + Ðевозможно заморозить Ñтого пользователÑ. + </notification> + <notification name="NowOwnObject"> + Ð’Ñ‹ Ñтали владельцем объекта [OBJECT_NAME] + </notification> + <notification name="CantRezOnLand"> + ÐÐµÐ»ÑŒÐ·Ñ Ð²Ñ‹Ð»Ð¾Ð¶Ð¸Ñ‚ÑŒ объект на [OBJECT_POS]: Ñто не разрешено владельцем земли. Узнать, кто владелец, можно Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ инÑтрумента «ЗемлÑ». + </notification> + <notification name="RezFailTooManyRequests"> + Ðевозможно выложить объект: Ñлишком много запроÑов. + </notification> + <notification name="SitFailCantMove"> + ÐÐµÐ»ÑŒÐ·Ñ ÑеÑÑ‚ÑŒ: ÑÐµÐ¹Ñ‡Ð°Ñ Ð²Ñ‹ не можете двигатьÑÑ. + </notification> + <notification name="SitFailNotAllowedOnLand"> + Вам не разрешено ÑадитьÑÑ Ð½Ð° Ñтой земле. + </notification> + <notification name="SitFailNotSameRegion"> + Попробуйте перемеÑтитьÑÑ Ð±Ð»Ð¸Ð¶Ðµ. ÐÐµÐ»ÑŒÐ·Ñ ÑеÑÑ‚ÑŒ на объект: +он находитÑÑ Ð² другом регионе. + </notification> + <notification name="NoNewObjectRegionFull"> + Ðевозможно Ñоздать новый объект. Регион уже заполнен. + </notification> + <notification name="FailedToPlaceObject"> + Ðе удалоÑÑŒ помеÑтить объект в указанное меÑто. Повторите попытку. + </notification> + <notification name="NoOwnNoGardening"> + Ð’Ñ‹ не можете Ñоздавать Ð´ÐµÑ€ÐµÐ²ÑŒÑ Ð¸ траву на чужой земле. + </notification> + <notification name="NoCopyPermsNoObject"> + Ðе удалоÑÑŒ Ñкопировать: вам не разрешено копировать объект «[OBJ_NAME]». + </notification> + <notification name="NoTransPermsNoObject"> + Ðе удалоÑÑŒ Ñкопировать: объект «[OBJ_NAME]» Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿ÐµÑ€ÐµÐ½ÐµÑти к вам. + </notification> + <notification name="AddToNavMeshNoCopy"> + Ðе удалоÑÑŒ Ñкопировать: объект «[OBJ_NAME]» отноÑитÑÑ Ðº навигационной Ñетке. + </notification> + <notification name="DupeWithNoRootsSelected"> + Выбран дубликат без корневых объектов. + </notification> + <notification name="CantDupeCuzRegionIsFull"> + Ðевозможно дублировать объекты: регион заполнен. + </notification> + <notification name="CantDupeCuzParcelNotFound"> + Ðевозможно дублировать объекты: не удалоÑÑŒ найти их учаÑток. + </notification> + <notification name="CantCreateCuzParcelFull"> + ÐÐµÐ»ÑŒÐ·Ñ Ñоздать объект: +учаÑток уже заполнен. + </notification> + <notification name="RezAttemptFailed"> + Ðе удалоÑÑŒ выложить объект. + </notification> + <notification name="ToxicInvRezAttemptFailed"> + Ðевозможно Ñоздать Ñлемент, который вызвал проблемы в Ñтом регионе. + </notification> + <notification name="InvItemIsBlacklisted"> + Ðтот предмет Ð¸Ð½Ð²ÐµÐ½Ñ‚Ð°Ñ€Ñ Ð½Ð°Ñ…Ð¾Ð´Ð¸Ñ‚ÑÑ Ð² черном ÑпиÑке. + </notification> + <notification name="NoCanRezObjects"> + Ð¡ÐµÐ¹Ñ‡Ð°Ñ Ð²Ð°Ð¼ не разрешено Ñоздавать объекты. + </notification> + <notification name="LandSearchBlocked"> + ПоиÑк по земле заблокирован. +Ð’Ñ‹ провели Ñлишком много операций поиÑка за короткое времÑ. +Повторите попытку через минуту. + </notification> + <notification name="NotEnoughResourcesToAttach"> + ÐедоÑтаточно Ñвободных реÑурÑов Ñкриптинга Ð´Ð»Ñ Ð¿Ñ€Ð¸ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ð¾Ð±ÑŠÐµÐºÑ‚Ð°! + </notification> + <notification name="YouDiedAndGotTPHome"> + Ð’Ñ‹ умерли и были телепортированы в ваше домашнее меÑтоположение + </notification> + <notification name="EjectComingSoon"> + Вам запрещено здеÑÑŒ приÑутÑтвовать; у Ð²Ð°Ñ ÐµÑÑ‚ÑŒ [EJECT_TIME] Ñек, чтобы покинуть Ñто меÑто. + </notification> + <notification name="NoEnterServerFull"> + Вам нет доÑтупа в Ñтот регион: +Ñерпер переполнен. + </notification> + <notification name="SaveBackToInvDisabled"> + Сохранение в инвентаре отключено. + </notification> + <notification name="NoExistNoSaveToContents"> + ÐÐµÐ»ÑŒÐ·Ñ Ñохранить «[OBJ_NAME]» в Ñодержимом объекта: объект, из которого оно было выложено, уже не ÑущеÑтвует. + </notification> + <notification name="NoModNoSaveToContents"> + ÐÐµÐ»ÑŒÐ·Ñ Ñохранить «[OBJ_NAME]» в Ñодержимом объекта: вам не разрешено изменÑÑ‚ÑŒ объект «[DEST_NAME]». + </notification> + <notification name="NoSaveBackToInvDisabled"> + Ðевозможно Ñохранить «[OBJ_NAME]» в инвентаре: Ñта Ð¾Ð¿ÐµÑ€Ð°Ñ†Ð¸Ñ Ð·Ð°Ð¿Ñ€ÐµÑ‰ÐµÐ½Ð°. + </notification> + <notification name="NoCopyNoSelCopy"> + ÐÐµÐ»ÑŒÐ·Ñ Ñкопировать выбранное: вам не разрешено копировать объект «[OBJ_NAME]». + </notification> + <notification name="NoTransNoSelCopy"> + Ðевозможно Ñкопировать выбранный предмет: объект «[OBJ_NAME]» не переноÑитÑÑ. + </notification> + <notification name="NoTransNoCopy"> + Ðевозможно Ñкопировать выбранный предмет: объект «[OBJ_NAME]» не переноÑитÑÑ. + </notification> + <notification name="NoPermsNoRemoval"> + Удаление объекта «[OBJ_NAME]» из ÑимулÑтора запрещено ÑиÑтемой разрешений. + </notification> + <notification name="NoModNoSaveSelection"> + ÐÐµÐ»ÑŒÐ·Ñ Ñохранить выбранное: вам не разрешено изменÑÑ‚ÑŒ объект «[OBJ_NAME]». + </notification> + <notification name="NoCopyNoSaveSelection"> + Ðевозможно Ñохранить выбранный предмет: объект «[OBJ_NAME]» не копируетÑÑ. + </notification> + <notification name="NoModNoTaking"> + ÐÐµÐ»ÑŒÐ·Ñ Ð·Ð°Ð±Ñ€Ð°Ñ‚ÑŒ выбранное: вам не разрешено изменÑÑ‚ÑŒ объект «[OBJ_NAME]». + </notification> + <notification name="RezDestInternalError"> + ВнутреннÑÑ Ð¾ÑˆÐ¸Ð±ÐºÐ°: неизвеÑтный тип меÑта назначениÑ. + </notification> + <notification name="DeleteFailObjNotFound"> + Ðевозможно удалить: объект не найден + </notification> + <notification name="SorryCantEjectUser"> + Ðевозможно выброÑить Ñтого пользователÑ. + </notification> + <notification name="RegionSezNotAHome"> + Вам не разрешено уÑтанавливать Ñвое домашнее меÑтоположение в Ñтом регионе. + </notification> + <notification name="HomeLocationLimits"> + Задать домашнее меÑтоположение можно только на вашей земле или в Инфохабе материка. + </notification> + <notification name="HomePositionSet"> + Задано положение дома. + </notification> + <notification name="AvatarEjected"> + Ðватар выброшен. + </notification> + <notification name="AvatarEjectFailed"> + Ðе удалоÑÑŒ выброÑить: у Ð²Ð°Ñ Ð½ÐµÑ‚ прав админиÑтратора на Ñтом учаÑтке. + </notification> + <notification name="CantMoveObjectParcelFull"> + ÐÐµÐ»ÑŒÐ·Ñ Ð¿ÐµÑ€ÐµÐ¼ÐµÑтить объект «[OBJECT_NAME]» в позицию «[OBJ_POSITION]» региона [REGION_NAME]: учаÑток уже заполнен. + </notification> + <notification name="CantMoveObjectParcelPerms"> + ÐÐµÐ»ÑŒÐ·Ñ Ð¿ÐµÑ€ÐµÐ¼ÐµÑтить объект «[OBJECT_NAME]» в позицию +«[OBJ_POSITION]» региона [REGION_NAME]: вашим объектам не разрешено приÑутÑтвовать на Ñтом учаÑтке. + </notification> + <notification name="CantMoveObjectParcelResources"> + ÐÐµÐ»ÑŒÐ·Ñ Ð¿ÐµÑ€ÐµÐ¼ÐµÑтить объект «[OBJECT_NAME]» в позицию +«[OBJ_POSITION]» региона [REGION_NAME]: на Ñтом учаÑтке недоÑтаточно реÑурÑов Ð´Ð»Ñ Ð´Ð°Ð½Ð½Ð¾Ð³Ð¾ объекта. + </notification> + <notification name="CantMoveObjectRegionVersion"> + ÐÐµÐ»ÑŒÐ·Ñ Ð¿ÐµÑ€ÐµÐ¼ÐµÑтить объект «[OBJECT_NAME]» в позицию +[OBJ_POSITION] региона [REGION_NAME]: в другом регионе работает ÑÑ‚Ð°Ñ€Ð°Ñ Ð²ÐµÑ€ÑÐ¸Ñ ÑимулÑтора, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð½Ðµ поддерживает прием Ñтого объекта через границу регионов. + </notification> + <notification name="CantMoveObjectNavMesh"> + ÐÐµÐ»ÑŒÐ·Ñ Ð¿ÐµÑ€ÐµÐ¼ÐµÑтить объект «[OBJECT_NAME]» в позицию +«[OBJ_POSITION]» региона [REGION_NAME]: вам не разрешено изменÑÑ‚ÑŒ навигационную Ñетку за пределами региона. + </notification> + <notification name="CantMoveObjectWTF"> + ÐÐµÐ»ÑŒÐ·Ñ Ð¿ÐµÑ€ÐµÐ¼ÐµÑтить объект «[OBJECT_NAME]» в позицию +[OBJ_POSITION] региона [REGION_NAME] по неизвеÑтной причине. ([FAILURE_TYPE]) + </notification> + <notification name="NoPermModifyObject"> + У Ð²Ð°Ñ Ð½ÐµÑ‚ прав на изменение Ñтого объекта + </notification> + <notification name="CantEnablePhysObjContributesToNav"> + ÐÐµÐ»ÑŒÐ·Ñ Ð²ÐºÐ»ÑŽÑ‡Ð¸Ñ‚ÑŒ физику Ð´Ð»Ñ Ð¾Ð±ÑŠÐµÐºÑ‚Ð°, который отноÑитÑÑ Ðº навигационной Ñетке. + </notification> + <notification name="CantEnablePhysKeyframedObj"> + ÐÐµÐ»ÑŒÐ·Ñ Ð²ÐºÐ»ÑŽÑ‡Ð¸Ñ‚ÑŒ физику Ð´Ð»Ñ Ð¾Ð±ÑŠÐµÐºÑ‚Ð¾Ð² Ñ ÐºÐ»ÑŽÑ‡ÐµÐ²Ñ‹Ð¼Ð¸ кадрами. + </notification> + <notification name="CantEnablePhysNotEnoughLandResources"> + ÐÐµÐ»ÑŒÐ·Ñ Ð²ÐºÐ»ÑŽÑ‡Ð¸Ñ‚ÑŒ физику Ð´Ð»Ñ Ð¾Ð±ÑŠÐµÐºÑ‚Ð° -- недоÑтаточно земельных реÑурÑов. + </notification> + <notification name="CantEnablePhysCostTooGreat"> + ÐÐµÐ»ÑŒÐ·Ñ Ð²ÐºÐ»ÑŽÑ‡Ð¸Ñ‚ÑŒ физику Ð´Ð»Ñ Ð¾Ð±ÑŠÐµÐºÑ‚Ð° Ñ Ñ€Ð°Ñходом реÑурÑов физики больше [MAX_OBJECTS] + </notification> + <notification name="PhantomWithConcavePiece"> + Ðтот объект не может Ñодержать вогнутых Ñлементов: Ñто фантом, который отноÑитÑÑ Ðº навигационной Ñетке. + </notification> + <notification name="UnableAddItem"> + Ðевозможно добавить предмет! + </notification> + <notification name="UnableEditItem"> + Редактирование невозможно! + </notification> + <notification name="NoPermToEdit"> + Редактирование не разрешено. + </notification> + <notification name="NoPermToCopyInventory"> + Ðе разрешено копировать Ñтот инвентарь. + </notification> + <notification name="CantSaveItemDoesntExist"> + ÐÐµÐ»ÑŒÐ·Ñ Ñохранить в Ñодержимом объекта: предмет уже не ÑущеÑтвует. + </notification> + <notification name="CantSaveItemAlreadyExists"> + ÐÐµÐ»ÑŒÐ·Ñ Ñохранить в Ñодержимом объекта: предмет Ñ Ñ‚Ð°ÐºÐ¸Ð¼ названием уже еÑÑ‚ÑŒ в инвентаре + </notification> + <notification name="CantSaveModifyAttachment"> + ÐÐµÐ»ÑŒÐ·Ñ Ñохранить в Ñодержимом объекта: Ñто приведет к изменению разрешений прикрепленного объекта. + </notification> + <notification name="TooManyScripts"> + Слишком много Ñкриптов. + </notification> + <notification name="UnableAddScript"> + Ðевозможно добавить Ñкрипт! + </notification> + <notification name="AssetServerTimeoutObjReturn"> + Сервер активов не ответил в заданное времÑ. Объект возвращен в ÑимулÑтор. + </notification> + <notification name="RegionDisablePhysicsShapes"> + Ð’ Ñтом регионе не разрешены фигуры Ñ Ñ„Ð¸Ð·Ð¸Ñ‡ÐµÑкими данными. + </notification> + <notification name="NoModNavmeshAcrossRegions"> + ÐÐµÐ»ÑŒÐ·Ñ Ð¸Ð·Ð¼ÐµÐ½ÑÑ‚ÑŒ навигационную Ñетку за пределами региона. + </notification> + <notification name="NoSetPhysicsPropertiesOnObjectType"> + ÐÐµÐ»ÑŒÐ·Ñ Ð·Ð°Ð´Ð°Ñ‚ÑŒ ÑвойÑтва физики Ð´Ð»Ñ Ð¾Ð±ÑŠÐµÐºÑ‚Ð° Ñтого типа. + </notification> + <notification name="NoSetRootPrimWithNoShape"> + ÐÐµÐ»ÑŒÐ·Ñ Ð·Ð°Ð´Ð°Ñ‚ÑŒ корневой примитив без фигуры. + </notification> + <notification name="NoRegionSupportPhysMats"> + Ð’ Ñтом регионе не разрешены материалы Ñ Ñ„Ð¸Ð·Ð¸Ñ‡ÐµÑкими данными. + </notification> + <notification name="OnlyRootPrimPhysMats"> + ÐаÑтройка материалов Ñ Ñ„Ð¸Ð·Ð¸Ñ‡ÐµÑкими данными разрешена только Ð´Ð»Ñ ÐºÐ¾Ñ€Ð½ÐµÐ²Ñ‹Ñ… примитивов. + </notification> + <notification name="NoSupportCharacterPhysMats"> + ПриÑвоение перÑонажам материалов Ñ Ñ„Ð¸Ð·Ð¸Ñ‡ÐµÑкими данными еще не поддерживаетÑÑ. + </notification> + <notification name="InvalidPhysMatProperty"> + Одно или неÑколько ÑвойÑтв указанного материала Ñ Ñ„Ð¸Ð·Ð¸Ñ‡ÐµÑкими данными недопуÑтимы. + </notification> + <notification name="NoPermsAlterStitchingMeshObj"> + Ðе разрешаетÑÑ Ð¸Ð·Ð¼ÐµÐ½ÑÑ‚ÑŒ тип Ñтыковки меш-объекта. + </notification> + <notification name="NoPermsAlterShapeMeshObj"> + Ðе разрешаетÑÑ Ð¸Ð·Ð¼ÐµÐ½ÑÑ‚ÑŒ форму меш-объекта + </notification> + <notification name="FullRegionCantEnter"> + Вам нет доÑтупа в Ñтот регион: \nрегион заполнен. + </notification> + <notification name="LinkFailedOwnersDiffer"> + СвÑзь невозможна -- разные владельцы + </notification> + <notification name="LinkFailedNoModNavmeshAcrossRegions"> + СвÑзь невозможна – Ð½ÐµÐ»ÑŒÐ·Ñ Ð¸Ð·Ð¼ÐµÐ½ÑÑ‚ÑŒ навигационную Ñетку за пределами региона. + </notification> + <notification name="LinkFailedNoPermToEdit"> + СвÑзь невозможна: у Ð²Ð°Ñ Ð½ÐµÑ‚ Ñ€Ð°Ð·Ñ€ÐµÑˆÐµÐ½Ð¸Ñ Ð½Ð° редактирование. + </notification> + <notification name="LinkFailedTooManyPrims"> + СвÑзь невозможна -- Ñлишком много примитивов + </notification> + <notification name="LinkFailedCantLinkNoCopyNoTrans"> + СвÑзь невозможна -- Ð½ÐµÐ»ÑŒÐ·Ñ ÑвÑзать некопируемый и непереноÑимый объекты + </notification> + <notification name="LinkFailedNothingLinkable"> + СвÑзь невозможна -- нет ÑвÑзываемых объектов. + </notification> + <notification name="LinkFailedTooManyPathfindingChars"> + СвÑзь невозможна -- Ñлишком много перÑонажей Ñ Ð¿Ð¾Ð¸Ñком пути + </notification> + <notification name="LinkFailedInsufficientLand"> + СвÑзь невозможна -- недоÑтаточно земельных реÑурÑов + </notification> + <notification name="LinkFailedTooMuchPhysics"> + Объект иÑпользует Ñлишком много реÑурÑов физики -- динамичеÑкое поведение отключено. + </notification> + <notification name="TeleportedHomeByObjectOnParcel"> + Ð’Ñ‹ были телепортированы домой объектом «[OBJECT_NAME]» на учаÑтке «[PARCEL_NAME]» + </notification> + <notification name="TeleportedHomeByObject"> + Ð’Ñ‹ были телепортированы домой объектом «[OBJECT_NAME]» + </notification> + <notification name="TeleportedByAttachment"> + Ð’Ñ‹ были телепортированы прикрепленным объектом [ITEM_ID] + </notification> + <notification name="TeleportedByObjectOnParcel"> + Ð’Ñ‹ были телепортированы объектом «[OBJECT_NAME]» на учаÑтке «[PARCEL_NAME]» + </notification> + <notification name="TeleportedByObjectOwnedBy"> + Ð’Ñ‹ были телепортированы объектом «[OBJECT_NAME]», владелец – [OWNER_ID] + </notification> + <notification name="TeleportedByObjectUnknownUser"> + Ð’Ñ‹ были телепортированы объектом «[OBJECT_NAME]», владелец неизвеÑтен. + </notification> + <notification name="CantCreateObjectRegionFull"> + Ðевозможно Ñоздать запрошенный объект. Регион уже заполнен. + </notification> + <notification name="CantAttackMultipleObjOneSpot"> + ÐÐµÐ»ÑŒÐ·Ñ Ð¿Ñ€Ð¸Ñоединить неÑколько объектов к одной точке. + </notification> + <notification name="CantCreateMultipleObjAtLoc"> + ЗдеÑÑŒ Ð½ÐµÐ»ÑŒÐ·Ñ Ñоздать неÑколько объектов. + </notification> + <notification name="UnableToCreateObjTimeOut"> + Ðевозможно Ñоздать запрошенный объект. Объекта нет в базе данных. + </notification> + <notification name="UnableToCreateObjUnknown"> + Ðевозможно Ñоздать запрошенный объект. ИÑтекло Ð²Ñ€ÐµÐ¼Ñ Ð·Ð°Ð¿Ñ€Ð¾Ñа. Повторите попытку. + </notification> + <notification name="UnableToCreateObjMissingFromDB"> + Ðевозможно Ñоздать запрошенный объект. Повторите попытку. + </notification> + <notification name="RezFailureTookTooLong"> + Ðе удалоÑÑŒ выложить, загрузка нужного объекта длитÑÑ Ñлишком долго. + </notification> + <notification name="FailedToPlaceObjAtLoc"> + Ðе удалоÑÑŒ помеÑтить объект в указанное меÑто. Повторите попытку. + </notification> + <notification name="CantCreatePlantsOnLand"> + Вам Ð½ÐµÐ»ÑŒÐ·Ñ Ñоздавать раÑÑ‚ÐµÐ½Ð¸Ñ Ð½Ð° Ñтой земле. + </notification> + <notification name="CantRestoreObjectNoWorldPos"> + Ðевозможно воÑÑтановить объект. Ðе найдена Ð¿Ð¾Ð·Ð¸Ñ†Ð¸Ñ Ð² игровом мире. + </notification> + <notification name="CantRezObjectInvalidMeshData"> + Ðевозможно выложить объект: его данные Ñетки неверны. + </notification> + <notification name="CantRezObjectTooManyScripts"> + Ðевозможно выложить объект: в Ñтом регионе уже Ñликом много Ñкриптов. + </notification> + <notification name="CantCreateObjectNoAccess"> + Ваши привилегии доÑтупа не разрешают Ñоздание объектов на Ñтом меÑте. + </notification> + <notification name="CantCreateObject"> + Ð¡ÐµÐ¹Ñ‡Ð°Ñ Ð²Ð°Ð¼ не разрешено Ñоздавать объекты. + </notification> + <notification name="InvalidObjectParams"> + Ðеверные параметры объекта + </notification> + <notification name="CantDuplicateObjectNoAcess"> + Ваши привилегии доÑтупа не разрешают дублирование объектов на Ñтом меÑте. + </notification> + <notification name="CantChangeShape"> + Вам не разрешено изменÑÑ‚ÑŒ Ñту фигуру. + </notification> + <notification name="NoAccessToClaimObjects"> + Ваши привилегии доÑтупа не разрешают претендовать на объекты на Ñтом меÑте. + </notification> + <notification name="DeedFailedNoPermToDeedForGroup"> + Ðе удалоÑÑŒ передать: вам не разрешено передавать объекты Ð´Ð»Ñ Ñтой группы. + </notification> + <notification name="NoPrivsToBuyObject"> + Ваши привилегии доÑтупа не разрешают покупать объекты на Ñтом меÑте. + </notification> + <notification name="CantAttachObjectAvatarSittingOnIt"> + Ðевозможно приÑоединить объект: на нем Ñидит аватар. + </notification> + <notification name="WhyAreYouTryingToWearShrubbery"> + Ð”ÐµÑ€ÐµÐ²ÑŒÑ Ð¸ траву Ð½ÐµÐ»ÑŒÐ·Ñ Ð½Ð¾Ñить как прикрепленные объекты. + </notification> + <notification name="CantAttachGroupOwnedObjs"> + ÐÐµÐ»ÑŒÐ·Ñ Ð¿Ñ€Ð¸ÑоединÑÑ‚ÑŒ объекты, принадлежащие группе. + </notification> + <notification name="CantAttachObjectsNotOwned"> + ÐÐµÐ»ÑŒÐ·Ñ Ð¿Ñ€Ð¸ÐºÑ€ÐµÐ¿Ð»ÑÑ‚ÑŒ объекты, которыми вы не владеете. + </notification> + <notification name="CantAttachNavmeshObjects"> + Ðевозможно приÑоединить объекты, которые отноÑÑÑ‚ÑÑ Ðº навигационной Ñетке. + </notification> + <notification name="CantAttachObjectNoMovePermissions"> + ÐÐµÐ»ÑŒÐ·Ñ Ð¿Ñ€Ð¸Ñоединить объект: вам не разрешено его перемещать. + </notification> + <notification name="CantAttachNotEnoughScriptResources"> + ÐедоÑтаточно Ñвободных реÑурÑов Ñкриптинга Ð´Ð»Ñ Ð¿Ñ€Ð¸ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ð¾Ð±ÑŠÐµÐºÑ‚Ð°! + </notification> + <notification name="CantDropItemTrialUser"> + ЗдеÑÑŒ Ð½ÐµÐ»ÑŒÐ·Ñ ÑбраÑывать объекты; перейдите в беÑплатную облаÑÑ‚ÑŒ Ð´Ð»Ñ Ð³Ð¾Ñтей. + </notification> + <notification name="CantDropMeshAttachment"> + ÐÐµÐ»ÑŒÐ·Ñ ÑбраÑывать прикрепленные меш-объекты. ОтÑоедините их в инвентарь, а затем выложите в игровой мир. + </notification> + <notification name="CantDropAttachmentNoPermission"> + Ðе удалоÑÑŒ ÑброÑить прикрепленный объект: вам не разрешено оÑтавлÑÑ‚ÑŒ его здеÑÑŒ. + </notification> + <notification name="CantDropAttachmentInsufficientLandResources"> + Ðе удалоÑÑŒ ÑброÑить прикрепленный объект: не хватает Ñвободных земельных реÑурÑов. + </notification> + <notification name="CantDropAttachmentInsufficientResources"> + Ðе удалоÑÑŒ ÑброÑить прикрепленные объекты: не хватает Ñвободных реÑурÑов. + </notification> + <notification name="CantDropObjectFullParcel"> + ÐÐµÐ»ÑŒÐ·Ñ ÑброÑить объект здеÑÑŒ. УчаÑток уже заполнен. + </notification> + <notification name="CantTouchObjectBannedFromParcel"> + ÐÐµÐ»ÑŒÐ·Ñ ÐºÐ¾ÑнутьÑÑ/взÑÑ‚ÑŒ Ñтот объект: вы забанены на Ñтом учаÑтке. + </notification> + <notification name="PlzNarrowDeleteParams"> + Уточните параметры удалениÑ. + </notification> + <notification name="UnableToUploadAsset"> + Ðевозможно отправить актив. + </notification> + <notification name="CantTeleportCouldNotFindUser"> + Ðе удалоÑÑŒ найти Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð´Ð»Ñ Ñ‚ÐµÐ»ÐµÐ¿Ð¾Ñ€Ñ‚Ð°Ñ†Ð¸Ð¸ домой + </notification> + <notification name="GodlikeRequestFailed"> + режим творца недоÑтупен + </notification> + <notification name="GenericRequestFailed"> + не удалоÑÑŒ выполнить общий Ð·Ð°Ð¿Ñ€Ð¾Ñ + </notification> + <notification name="CantUploadPostcard"> + Ðевозможно отправить открытку. Повторите попытку позже. + </notification> + <notification name="CantFetchInventoryForGroupNotice"> + Ðевозможно получить данные Ð¸Ð½Ð²ÐµÐ½Ñ‚Ð°Ñ€Ñ Ð´Ð»Ñ Ð³Ñ€ÑƒÐ¿Ð¿Ð¾Ð²Ð¾Ð³Ð¾ уведомлениÑ. + </notification> + <notification name="CantSendGroupNoticeNotPermitted"> + Ðевозможно отправить групповое уведомление -- не разрешено. + </notification> + <notification name="CantSendGroupNoticeCantConstructInventory"> + Ðевозможно отправить групповое уведомление -- не удалоÑÑŒ Ñобрать инвентарь. + </notification> + <notification name="CantParceInventoryInNotice"> + Ðевозможно проанализировать инвентарь, указанный в уведомлении. + </notification> + <notification name="TerrainUploadFailed"> + Ðе удалоÑÑŒ загрузить ландшафт. + </notification> + <notification name="TerrainFileWritten"> + Файл ландшафта запиÑан. + </notification> + <notification name="TerrainFileWrittenStartingDownload"> + Файл ландшафта запиÑан, начинаетÑÑ Ð·Ð°Ð³Ñ€ÑƒÐ·ÐºÐ°... + </notification> + <notification name="TerrainBaked"> + Ландшафт готов. + </notification> + <notification name="TenObjectsDisabledPlzRefresh"> + Отключены только первые 10 выбранных объектов. Обновите Ñкран и выберите объекты Ñнова, еÑли требуетÑÑ. + </notification> + <notification name="UpdateViewerBuyParcel"> + Ð”Ð»Ñ Ð¿Ð¾ÐºÑƒÐ¿ÐºÐ¸ Ñтого учаÑтка необходимо обновить клиент. + </notification> + <notification name="CantBuyParcelNotForSale"> + Ðевозможно купить, Ñтот учаÑток не предназначен Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð´Ð°Ð¶Ð¸. + </notification> + <notification name="CantBuySalePriceOrLandAreaChanged"> + Ðевозможно купить: цена или площадь земли изменилиÑÑŒ. + </notification> + <notification name="CantBuyParcelNotAuthorized"> + Вам не разрешено покупать Ñтот учаÑток. + </notification> + <notification name="CantBuyParcelAwaitingPurchaseAuth"> + Ð’Ñ‹ не можете приобреÑти Ñтот учаÑток: он уже ожидает Ð¿Ð¾Ð´Ñ‚Ð²ÐµÑ€Ð¶Ð´ÐµÐ½Ð¸Ñ Ð¿Ð¾ÐºÑƒÐ¿ÐºÐ¸ + </notification> + <notification name="CantBuildOverflowParcel"> + ЗдеÑÑŒ Ð½ÐµÐ»ÑŒÐ·Ñ Ñоздавать объекты – учаÑток будет переполнен. + </notification> + <notification name="SelectedMultipleOwnedLand"> + Ð’Ñ‹ выбрали землю Ñ Ñ€Ð°Ð·Ð½Ñ‹Ð¼Ð¸ владельцами. Выберите меньшую облаÑÑ‚ÑŒ и повторите попытку. + </notification> + <notification name="CantJoinTooFewLeasedParcels"> + Выбрано недоÑтаточно арендуемых учаÑтков Ð´Ð»Ñ Ð²ÑтуплениÑ. + </notification> + <notification name="CantDivideLandMultipleParcelsSelected"> + ÐÐµÐ»ÑŒÐ·Ñ Ñ€Ð°Ð·Ð´ÐµÐ»Ð¸Ñ‚ÑŒ землю.\nВыбрано больше одного учаÑтка.\nВыберите меньшую территорию. + </notification> + <notification name="CantDivideLandCantFindParcel"> + ÐÐµÐ»ÑŒÐ·Ñ Ñ€Ð°Ð·Ð´ÐµÐ»Ð¸Ñ‚ÑŒ землю.\nÐе удалоÑÑŒ найти учаÑток.\nСообщите об Ñтой неполадке: Справка -> Сообщить об ошибке... + </notification> + <notification name="CantDivideLandWholeParcelSelected"> + Ðевозможно разделить землю. Выбран веÑÑŒ учаÑток.\nПопробуйте выбрать территорию поменьше. + </notification> + <notification name="LandHasBeenDivided"> + Ð—ÐµÐ¼Ð»Ñ Ñ€Ð°Ð·Ð´ÐµÐ»ÐµÐ½Ð°. + </notification> + <notification name="PassPurchased"> + Ð’Ñ‹ приобрели пропуÑк. + </notification> + <notification name="RegionDisallowsClassifieds"> + Ð’ регионе не разрешены рекламные объÑвлениÑ. + </notification> + <notification name="LandPassExpireSoon"> + Ваш пропуÑк на Ñту землю Ñкоро закончитÑÑ. + </notification> + <notification name="CantSitNoSuitableSurface"> + Ðет подходÑщей поверхноÑти, чтобы ÑеÑÑ‚ÑŒ. Попробуйте в другом меÑте. + </notification> + <notification name="CantSitNoRoom"> + ЗдеÑÑŒ нет меÑта, чтобы ÑеÑÑ‚ÑŒ. Попробуйте в другом меÑте. + </notification> + <notification name="ClaimObjectFailedNoPermission"> + Ðевозможно претендовать на объект: у Ð²Ð°Ñ Ð½ÐµÑ‚ Ñ€Ð°Ð·Ñ€ÐµÑˆÐµÐ½Ð¸Ñ + </notification> + <notification name="ClaimObjectFailedNoMoney"> + Ðевозможно претендовать на объект: у Ð²Ð°Ñ Ð½Ðµ хватает L$. + </notification> + <notification name="CantDeedGroupLand"> + ÐÐµÐ»ÑŒÐ·Ñ Ð¿ÐµÑ€ÐµÐ´Ð°Ñ‚ÑŒ землю, принадлежащую группе. + </notification> + <notification name="BuyObjectFailedNoMoney"> + Ðе удалоÑÑŒ купить объект: у Ð²Ð°Ñ Ð½Ðµ хватает L$. + </notification> + <notification name="BuyInventoryFailedNoMoney"> + Ðе удалоÑÑŒ купить инвентарь: у Ð²Ð°Ñ Ð½Ðµ хватает L$. + </notification> + <notification name="BuyPassFailedNoMoney"> + У Ð²Ð°Ñ Ð½ÐµÐ´Ð¾Ñтаточно L$, чтобы заплатить за проход на Ñту землю. + </notification> + <notification name="CantBuyPassTryAgain"> + Ð¡ÐµÐ¹Ñ‡Ð°Ñ Ð½ÐµÐ»ÑŒÐ·Ñ ÐºÑƒÐ¿Ð¸Ñ‚ÑŒ пропуÑк. Повторите попытку позже. + </notification> + <notification name="CantCreateObjectParcelFull"> + Ðевозможно Ñоздать объект:\nучаÑток заполнен. + </notification> + <notification name="FailedPlacingObject"> + Ðе удалоÑÑŒ помеÑтить объект в указанное меÑто. Повторите попытку. + </notification> + <notification name="CantCreateLandmarkForEvent"> + Ðевозможно Ñоздать закладку Ð´Ð»Ñ ÑобытиÑ. + </notification> + <notification name="GodBeatsFreeze"> + Сила творца одолевает заморозку! + </notification> + <notification name="SpecialPowersRequestFailedLogged"> + Ðе удалоÑÑŒ выполнить Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð½Ð° оÑобые ÑпоÑобноÑти. Ð—Ð°Ð¿Ñ€Ð¾Ñ Ð·Ð°Ñ€ÐµÐ³Ð¸Ñтрирован. + </notification> + <notification name="ExpireExplanation"> + СиÑтема ÑÐµÐ¹Ñ‡Ð°Ñ Ð½Ðµ может обработать ваш запроÑ. ИÑтекло Ð²Ñ€ÐµÐ¼Ñ Ð·Ð°Ð¿Ñ€Ð¾Ñа. + </notification> + <notification name="DieExplanation"> + СиÑтема не может обработать ваш запроÑ. + </notification> + <notification name="AddPrimitiveFailure"> + ÐедоÑтаточно денег Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð¿Ñ€Ð¸Ð¼Ð¸Ñ‚Ð¸Ð²Ð°. + </notification> + <notification name="RezObjectFailure"> + ÐедоÑтаточно денег Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð¾Ð±ÑŠÐµÐºÑ‚Ð°. + </notification> + <notification name="ResetHomePositionNotLegal"> + ÐедопуÑтимое домашнее меÑтоположение; воÑÑтановлено Ñтандартное меÑтоположение. + </notification> + <notification name="CantInviteRegionFull"> + Ð¡ÐµÐ¹Ñ‡Ð°Ñ Ð²Ñ‹ не можете никого приглаÑить к Ñебе: регион уже заполнен. Повторите попытку позже. + </notification> + <notification name="CantSetHomeAtRegion"> + Вам не разрешено уÑтанавливать Ñвое домашнее меÑтоположение в Ñтом регионе. + </notification> + <notification name="ListValidHomeLocations"> + Задать домашнее меÑтоположение можно только на вашей земле или в Инфохабе материка. + </notification> + <notification name="SetHomePosition"> + Домашнее меÑтоположение задано. + </notification> + <notification name="CantDerezInventoryError"> + Ðевозможно забрать объект: Ñбой инвентарÑ. + </notification> + <notification name="CantCreateRequestedInv"> + Ðевозможно Ñоздать требуемый инвентарь. + </notification> + <notification name="CantCreateRequestedInvFolder"> + Ðевозможно Ñоздать требуемую папку инвентарÑ. + </notification> + <notification name="CantCreateInventory"> + Ðевозможно Ñоздать Ñтот инвентарь. + </notification> + <notification name="CantCreateLandmark"> + Ðевозможно Ñоздать закладку. + </notification> + <notification name="CantCreateOutfit"> + Ð¡ÐµÐ¹Ñ‡Ð°Ñ Ð½ÐµÐ»ÑŒÐ·Ñ Ñоздать коÑтюм. Попробуйте через минуту. + </notification> + <notification name="InventoryNotForSale"> + Инвентарь не Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð´Ð°Ð¶Ð¸. + </notification> + <notification name="CantFindInvItem"> + Ðе удалоÑÑŒ найти предмет из инвентарÑ. + </notification> + <notification name="CantFindObject"> + Ðе удалоÑÑŒ найти объект. + </notification> + <notification name="CantTransfterMoneyRegionDisabled"> + Ð¡ÐµÐ¹Ñ‡Ð°Ñ Ð² Ñтом регионе запрещен перевод денег на объекты. + </notification> + <notification name="CantPayNoAgent"> + ÐепонÑтно, кому платить. + </notification> + <notification name="CantDonateToPublicObjects"> + ÐÐµÐ»ÑŒÐ·Ñ Ð¾Ñ‚Ð´Ð°Ð²Ð°Ñ‚ÑŒ L$ за общедоÑтупные объекты. + </notification> + <notification name="InventoryCreationInWorldObjectFailed"> + Ðе удалоÑÑŒ Ñоздать инвентарь в объекте игрового мира. + </notification> + <notification name="UserBalanceOrLandUsageError"> + Ðе удалоÑÑŒ обновить клиент из-за внутренней ошибки. Отображаемый в клиенте Ð±Ð°Ð»Ð°Ð½Ñ L$ или владение учаÑтками могут не ÑоответÑтвовать дейÑтвительному баланÑу на Ñерверах. + </notification> + <notification name="LargePrimAgentIntersect"> + ÐÐµÐ»ÑŒÐ·Ñ Ñоздавать большие примитивы, которые переÑекаютÑÑ Ñ Ð´Ñ€ÑƒÐ³Ð¸Ð¼Ð¸ игроками. Повторите попытку, когда другие игроки уйдут. + </notification> + <notification name="PreferenceChatClearLog"> + Будут удалены журналы предыдущих разговоров и вÑе резервные копии Ñтих файлов. + <usetemplate ignoretext="Подтверждать удаление журнала предыдущих разговоров." name="okcancelignore" notext="Отмена" yestext="OK"/> + </notification> + <notification name="PreferenceChatDeleteTranscripts"> + Будут удалены запиÑи вÑех предыдущих разговоров. СпиÑок прошедших разговоров не изменитÑÑ. Ð’Ñе файлы Ñ Ñ€Ð°ÑширениÑми .txt и txt.backup в папке [FOLDER] будут удалены. + <usetemplate ignoretext="Подтверждать удаление запиÑей." name="okcancelignore" notext="Отмена" yestext="OK"/> + </notification> + <notification name="PreferenceChatPathChanged"> + Ðевозможно перемеÑтить файлы. ВоÑÑтановлен прежний путь. + <usetemplate ignoretext="Ðевозможно перемеÑтить файлы. ВоÑÑтановлен прежний путь." name="okignore" yestext="OK"/> + </notification> </notifications> diff --git a/indra/newview/skins/default/xui/ru/panel_avatar_list_item.xml b/indra/newview/skins/default/xui/ru/panel_avatar_list_item.xml index 75e396222f..4866bb7ed6 100644 --- a/indra/newview/skins/default/xui/ru/panel_avatar_list_item.xml +++ b/indra/newview/skins/default/xui/ru/panel_avatar_list_item.xml @@ -27,5 +27,6 @@ <icon name="permission_edit_mine_icon" tool_tip="Ðтот друг может изменÑÑ‚ÑŒ, удалÑÑ‚ÑŒ или брать ваши объекты"/> <icon name="permission_map_icon" tool_tip="Ðтот друг может видеть Ð²Ð°Ñ Ð½Ð° карте"/> <icon name="permission_online_icon" tool_tip="Ðтот друг может видеть ваш ÑÑ‚Ð°Ñ‚ÑƒÑ Ð² Ñети"/> + <button name="info_btn" tool_tip="Дополнительно"/> <button name="profile_btn" tool_tip="Смотреть профиль"/> </panel> diff --git a/indra/newview/skins/default/xui/ru/panel_block_list_sidetray.xml b/indra/newview/skins/default/xui/ru/panel_block_list_sidetray.xml index 214ca8bf3a..70a1b25996 100644 --- a/indra/newview/skins/default/xui/ru/panel_block_list_sidetray.xml +++ b/indra/newview/skins/default/xui/ru/panel_block_list_sidetray.xml @@ -1,10 +1,11 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="block_list_panel"> - <text name="title_text"> - Черный ÑпиÑок - </text> - <scroll_list name="blocked" tool_tip="СпиÑок заблокированных жителей"/> - <button label="Заблокировать жителÑ" name="Block resident..." tool_tip="Выберите Ð¶Ð¸Ñ‚ÐµÐ»Ñ Ð´Ð»Ñ Ð±Ð»Ð¾ÐºÐ¸Ñ€Ð¾Ð²ÐºÐ¸"/> - <button label="Блокировать объект по имени" name="Block object by name..." tool_tip="Выберите объект Ð´Ð»Ñ Ð±Ð»Ð¾ÐºÐ¸Ñ€Ð¾Ð²ÐºÐ¸ по имени"/> - <button label="Разблокировать" name="Unblock" tool_tip="Удалить объект или Ð¶Ð¸Ñ‚ÐµÐ»Ñ Ð¸Ð· ÑпиÑка заблокированных"/> + <panel label="bottom_panel" name="blocked_buttons_panel"> + <filter_editor label="Фильтр" name="blocked_filter_input"/> + <menu_button name="blocked_gear_btn" tool_tip="ДейÑÑ‚Ð²Ð¸Ñ Ñ Ð²Ñ‹Ð±Ñ€Ð°Ð½Ð½Ñ‹Ð¼ жителем или объектом"/> + <menu_button name="view_btn" tool_tip="Параметры Ñортировки"/> + <menu_button name="plus_btn" tool_tip="Выберите Ð¶Ð¸Ñ‚ÐµÐ»Ñ Ð¸Ð»Ð¸ объект Ð´Ð»Ñ Ð±Ð»Ð¾ÐºÐ¸Ñ€Ð¾Ð²ÐºÐ¸"/> + <button name="unblock_btn" tool_tip="Удалить объект или Ð¶Ð¸Ñ‚ÐµÐ»Ñ Ð¸Ð· ÑпиÑка заблокированных"/> + </panel> + <block_list name="blocked" tool_tip="СпиÑок заблокированных жителей"/> </panel> diff --git a/indra/newview/skins/default/xui/ru/panel_conversation_list_item.xml b/indra/newview/skins/default/xui/ru/panel_conversation_list_item.xml new file mode 100644 index 0000000000..4fdb4f9122 --- /dev/null +++ b/indra/newview/skins/default/xui/ru/panel_conversation_list_item.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="conversation_list_item"> + <layout_stack name="conversation_item_stack"> + <layout_panel name="conversation_title_panel"> + <text name="conversation_title" value="(загрузка)"/> + </layout_panel> + </layout_stack> +</panel> diff --git a/indra/newview/skins/default/xui/ru/panel_conversation_log_list_item.xml b/indra/newview/skins/default/xui/ru/panel_conversation_log_list_item.xml new file mode 100644 index 0000000000..98fe7b99be --- /dev/null +++ b/indra/newview/skins/default/xui/ru/panel_conversation_log_list_item.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="conversation_log_list_item"> + <icon name="voice_session_icon" tool_tip="Ð’ÐºÐ»ÑŽÑ‡Ð°Ñ Ð³Ð¾Ð»Ð¾Ñовой чат"/> + <icon name="unread_ims_icon" tool_tip="За Ð²Ñ€ÐµÐ¼Ñ Ð²Ð°ÑˆÐµÐ³Ð¾ отÑутÑÑ‚Ð²Ð¸Ñ Ð¿Ñ€Ð¸ÑˆÐ»Ð¸ ÑообщениÑ"/> + <button name="delete_btn" tool_tip="Удалить Ñту запиÑÑŒ"/> +</panel> diff --git a/indra/newview/skins/default/xui/ru/panel_group_list_item.xml b/indra/newview/skins/default/xui/ru/panel_group_list_item.xml index 7f000fb5a0..b043ffbbe2 100644 --- a/indra/newview/skins/default/xui/ru/panel_group_list_item.xml +++ b/indra/newview/skins/default/xui/ru/panel_group_list_item.xml @@ -1,5 +1,6 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="group_list_item"> <text name="group_name" value="ÐеизвеÑтно"/> + <button name="info_btn" tool_tip="Дополнительно"/> <button name="profile_btn" tool_tip="Смотреть профиль"/> </panel> diff --git a/indra/newview/skins/default/xui/ru/panel_people.xml b/indra/newview/skins/default/xui/ru/panel_people.xml index 607921f2d6..7da7fb3191 100644 --- a/indra/newview/skins/default/xui/ru/panel_people.xml +++ b/indra/newview/skins/default/xui/ru/panel_people.xml @@ -14,81 +14,53 @@ <string name="no_filtered_friends_msg"> Ðе нашли того, что вам нужно? ВоÑпользуйтеÑÑŒ [secondlife:///app/search/people/[SEARCH_TERM] поиÑком]. </string> - <string name="people_filter_label" value="Фильтр Ð´Ð»Ñ Ð»ÑŽÐ´ÐµÐ¹"/> - <string name="groups_filter_label" value="Фильтр Ð´Ð»Ñ Ð³Ñ€ÑƒÐ¿Ð¿"/> <string name="no_filtered_groups_msg" value="Ðе нашли того, что вам нужно? ВоÑпользуйтеÑÑŒ [secondlife:///app/search/groups/[SEARCH_TERM] поиÑком]."/> <string name="no_groups_msg" value="Ищете группу, чтобы приÑоединитьÑÑ Ðº ней? ВоÑпользуйтеÑÑŒ [secondlife:///app/search/groups поиÑком]."/> <string name="MiniMapToolTipMsg" value="[REGION](Двойной щелчок открывает карту, shift+перетÑгивание – обзор)"/> <string name="AltMiniMapToolTipMsg" value="[REGION](Двойной щелчок – телепортациÑ, shift+перетÑгивание – обзор)"/> - <filter_editor label="Фильтр" name="filter_input"/> <tab_container name="tabs"> <panel label="РЯДОМ" name="nearby_panel"> - <panel label="bottom_panel" name="bottom_panel"> - <menu_button name="nearby_view_sort_btn" tool_tip="Опции"/> - <button name="add_friend_btn" tool_tip="Добавить выбранного Ð¶Ð¸Ñ‚ÐµÐ»Ñ Ð² ÑпиÑок друзей"/> + <panel label="bottom_panel" name="nearby_buttons_panel"> + <filter_editor label="Фильтр Ð´Ð»Ñ Ð»ÑŽÐ´ÐµÐ¹" name="nearby_filter_input"/> + <button name="gear_btn" tool_tip="ДейÑÑ‚Ð²Ð¸Ñ Ñ Ð²Ñ‹Ð±Ñ€Ð°Ð½Ð½Ñ‹Ð¼ жителем"/> + <menu_button name="nearby_view_btn" tool_tip="Параметры проÑмотра/Ñортировки"/> + <button name="add_friend_btn" tool_tip="Предложить жителю дружбу"/> + <dnd_button name="nearby_del_btn" tool_tip="Удалить выбранного Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð¸Ð· друзей"/> </panel> </panel> - <panel label="МОИ ДРУЗЬЯ" name="friends_panel"> + <panel label="ДРУЗЬЯ" name="friends_panel"> + <panel label="bottom_panel" name="friends_buttons_panel"> + <filter_editor label="Фильтр Ð´Ð»Ñ Ð»ÑŽÐ´ÐµÐ¹" name="friends_filter_input"/> + <button name="gear_btn" tool_tip="ДейÑÑ‚Ð²Ð¸Ñ Ñ Ð²Ñ‹Ð±Ñ€Ð°Ð½Ð½Ñ‹Ð¼ жителем"/> + <menu_button name="friends_view_btn" tool_tip="Параметры проÑмотра/Ñортировки"/> + <button name="friends_add_btn" tool_tip="Предложить жителю дружбу"/> + <dnd_button name="friends_del_btn" tool_tip="Удалить выбранного Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð¸Ð· друзей"/> + </panel> <accordion name="friends_accordion"> <accordion_tab name="tab_online" title="Онлайн"/> <accordion_tab name="tab_all" title="Ð’Ñе"/> </accordion> - <panel label="bottom_panel" name="bottom_panel"> - <layout_stack name="bottom_panel"> - <layout_panel name="options_gear_btn_panel"> - <menu_button name="friends_viewsort_btn" tool_tip="Показать дополнительные параметры"/> - </layout_panel> - <layout_panel name="add_btn_panel"> - <button name="add_btn" tool_tip="Предложить жителю дружбу"/> - </layout_panel> - <layout_panel name="trash_btn_panel"> - <dnd_button name="del_btn" tool_tip="Удалить выбранного Ð¶Ð¸Ñ‚ÐµÐ»Ñ Ð¸Ð· ÑпиÑка друзей"/> - </layout_panel> - </layout_stack> - </panel> </panel> - <panel label="МОИ ГРУППЫ" name="groups_panel"> - <panel label="bottom_panel" name="bottom_panel"> - <menu_button name="groups_viewsort_btn" tool_tip="Опции"/> - <button name="plus_btn" tool_tip="ПриÑоединитьÑÑ Ðº группе/Ñоздать новую группу"/> - <button name="activate_btn" tool_tip="Ðктивировать выбранную группу"/> + <panel label="ГРУППЫ" name="groups_panel"> + <panel label="bottom_panel" name="groups_buttons_panel"> + <filter_editor label="Фильтр Ð´Ð»Ñ Ð³Ñ€ÑƒÐ¿Ð¿" name="groups_filter_input"/> + <menu_button name="groups_gear_btn" tool_tip="ДейÑÑ‚Ð²Ð¸Ñ Ñ Ð²Ñ‹Ð±Ñ€Ð°Ð½Ð½Ð¾Ð¹ группой"/> + <menu_button name="groups_view_btn" tool_tip="Параметры проÑмотра/Ñортировки"/> + <menu_button name="plus_btn" tool_tip="ПриÑоединитьÑÑ Ðº группе/Ñоздать новую группу"/> + <dnd_button name="minus_btn" tool_tip="Покинуть выбранную группу"/> </panel> </panel> <panel label="ÐЕДÐÐ’ÐИЕ" name="recent_panel"> - <panel label="bottom_panel" name="bottom_panel"> - <menu_button name="recent_viewsort_btn" tool_tip="Опции"/> - <button name="add_friend_btn" tool_tip="Добавить выбранного Ð¶Ð¸Ñ‚ÐµÐ»Ñ Ð² ÑпиÑок друзей"/> + <panel label="bottom_panel" name="recent_buttons_panel"> + <filter_editor label="Фильтр Ð´Ð»Ñ Ð»ÑŽÐ´ÐµÐ¹" name="recent_filter_input"/> + <button name="gear_btn" tool_tip="ДейÑÑ‚Ð²Ð¸Ñ Ñ Ð²Ñ‹Ð±Ñ€Ð°Ð½Ð½Ñ‹Ð¼ жителем"/> + <menu_button name="recent_view_btn" tool_tip="Параметры проÑмотра/Ñортировки"/> + <button name="add_friend_btn" tool_tip="Предложить жителю дружбу"/> + <dnd_button name="recent_del_btn" tool_tip="Удалить выбранного Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð¸Ð· друзей"/> </panel> </panel> + <panel label="БЛОКИРОВÐÐ" name="blocked_panel"> + <panel label="Черный ÑпиÑок жителей и объектов" name="panel_block_list_sidetray"/> + </panel> </tab_container> - <panel name="button_bar"> - <layout_stack name="bottom_bar_ls"> - <layout_panel name="view_profile_btn_lp"> - <button label="Профиль" name="view_profile_btn" tool_tip="Показать изображение, группы и прочую информацию о жителе"/> - </layout_panel> - <layout_panel name="im_btn_lp"> - <button label="IM" name="im_btn" tool_tip="Ðачать ÑÐµÐ°Ð½Ñ IM"/> - </layout_panel> - <layout_panel name="call_btn_lp"> - <button label="Звонок" name="call_btn" tool_tip="Позвонить Ñтому жителю"/> - </layout_panel> - <layout_panel name="share_btn_lp"> - <button label="ПоделитьÑÑ" name="share_btn" tool_tip="ПоделитьÑÑ Ð¾Ð±ÑŠÐµÐºÑ‚Ð¾Ð¼ из инвентарÑ"/> - </layout_panel> - <layout_panel name="teleport_btn_lp"> - <button label="ТелепортациÑ" name="teleport_btn" tool_tip="Предложить телепортацию"/> - </layout_panel> - </layout_stack> - <layout_stack name="bottom_bar_ls1"> - <layout_panel name="group_info_btn_lp"> - <button label="Профиль группы" name="group_info_btn" tool_tip="Показать информацию о группе"/> - </layout_panel> - <layout_panel name="chat_btn_lp"> - <button label="Групповой чат" name="chat_btn" tool_tip="Открыть ÑÐµÐ°Ð½Ñ Ñ‡Ð°Ñ‚Ð°"/> - </layout_panel> - <layout_panel name="group_call_btn_lp"> - <button label="Звонок группе" name="group_call_btn" tool_tip="Позвонить Ñтой группе"/> - </layout_panel> - </layout_stack> - </panel> </panel> diff --git a/indra/newview/skins/default/xui/ru/panel_preferences_chat.xml b/indra/newview/skins/default/xui/ru/panel_preferences_chat.xml index 9283fc9e6e..6383fc8c2c 100644 --- a/indra/newview/skins/default/xui/ru/panel_preferences_chat.xml +++ b/indra/newview/skins/default/xui/ru/panel_preferences_chat.xml @@ -1,34 +1,86 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel label="ТекÑтовый чат" name="chat"> - <text name="font_size"> - Размер шрифта: - </text> - <radio_group name="chat_font_size"> - <radio_item label="Мелкий" name="radio" value="0"/> - <radio_item label="Средний" name="radio2" value="1"/> - <radio_item label="Крупный" name="radio3" value="2"/> - </radio_group> - <check_box initial_value="иÑтина" label="ВоÑпроизводить анимацию ввода текÑта при общении" name="play_typing_animation"/> - <check_box label="ОтправлÑÑ‚ÑŒ мне ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð¿Ð¾ почте, когда Ð¼ÐµÐ½Ñ Ð½ÐµÑ‚ в Ñети" name="send_im_to_email"/> - <check_box label="ВеÑти журнал текÑтового IM и чата" name="plain_text_chat_history"/> - <check_box label="Чат в пузырьках" name="bubble_text_chat"/> - <text name="show_ims_in_label"> - Показывать ÑообщениÑ: - </text> - <text name="requires_restart_label"> - (требуетÑÑ Ð¿ÐµÑ€ÐµÐ·Ð°Ð¿ÑƒÑк) - </text> - <radio_group name="chat_window" tool_tip="Показывать IM-ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð² отдельных окнах или же в одном окне Ñ Ð½ÐµÑколькими вкладками (требуетÑÑ Ð¿ÐµÑ€ÐµÐ·Ð°Ð¿ÑƒÑк)"> - <radio_item label="Ð’ отдельных окнах" name="radio" value="0"/> - <radio_item label="Ðа вкладках" name="radio2" value="1"/> - </radio_group> - <text name="disable_toast_label"> - Включить вÑплывающие ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ñ Ð½Ð¾Ð²Ñ‹Ð¼Ð¸ репликами в чате: - </text> - <check_box label="Групповой чат" name="EnableGroupChatPopups" tool_tip="Отображать вÑплывающие ÑƒÐ²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¸ поÑвлении Ñообщений в групповом чате"/> - <check_box label="ТекÑтовые чаты" name="EnableIMChatPopups" tool_tip="Отображать вÑплывающие ÑƒÐ²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¸ получении IM-Ñообщений"/> - <spinner label="Ð’Ñ€ÐµÐ¼Ñ Ð¾Ñ‚Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð²Ñплывающих реплик:" name="nearby_toasts_lifetime"/> - <spinner label="Ð’Ñ€ÐµÐ¼Ñ Ð·Ð°Ñ‚ÑƒÑ…Ð°Ð½Ð¸Ñ Ð²Ñплывающих реплик:" name="nearby_toasts_fadingtime"/> + <panel> + <check_box initial_value="иÑтина" label="ВоÑпроизводить анимацию ввода текÑта при общении" name="play_typing_animation"/> + <check_box label="ОтправлÑÑ‚ÑŒ мне ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð¿Ð¾ почте, когда Ð¼ÐµÐ½Ñ Ð½ÐµÑ‚ в Ñети" name="send_im_to_email"/> + <check_box label="Только Ð´Ñ€ÑƒÐ·ÑŒÑ Ð¸ группы могут звонить мне и отправлÑÑ‚ÑŒ IM" name="voice_call_friends_only_check"/> + <text name="font_size"> + Размер шрифта: + </text> + <combo_box name="chat_font_size"> + <item label="Мелкий" name="Small" value="0"/> + <item label="Средний" name="Medium" value="1"/> + <item label="Крупный" name="Large" value="2"/> + </combo_box> + <check_box label="Чат в пузырьках" name="bubble_text_chat"/> + </panel> + <panel> + <text name="notifications"> + Ð£Ð²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ñ + </text> + <text name="friend_ims"> + IM друзей: + </text> + <combo_box name="FriendIMOptions"> + <item label="Открыть окно разговоров" name="OpenConversationsWindow" value="openconversations"/> + <item label="Сообщение во вÑплывающем окне" name="PopUpMessage" value="вÑплывание"/> + <item label="Мигание кнопки на панели инÑтрументов" name="FlashToolbarButton" value="мигание"/> + <item label="Ðет" name="None" value="нет"/> + </combo_box> + <text name="non_friend_ims"> + IM чужих: + </text> + <combo_box name="NonFriendIMOptions"> + <item label="Открыть окно разговоров" name="OpenConversationsWindow" value="openconversations"/> + <item label="Сообщение во вÑплывающем окне" name="PopUpMessage" value="вÑплывание"/> + <item label="Мигание кнопки на панели инÑтрументов" name="FlashToolbarButton" value="мигание"/> + <item label="Ðет" name="None" value="нет"/> + </combo_box> + <text name="conference_ims"> + IM конференции: + </text> + <combo_box name="ConferenceIMOptions"> + <item label="Открыть окно разговоров" name="OpenConversationsWindow" value="openconversations"/> + <item label="Сообщение во вÑплывающем окне" name="PopUpMessage" value="вÑплывание"/> + <item label="Мигание кнопки на панели инÑтрументов" name="FlashToolbarButton" value="мигание"/> + <item label="Ðет" name="None" value="нет"/> + </combo_box> + <text name="group_chat"> + Групповой чат: + </text> + <combo_box name="GroupChatOptions"> + <item label="Открыть окно разговоров" name="OpenConversationsWindow" value="openconversations"/> + <item label="Сообщение во вÑплывающем окне" name="PopUpMessage" value="вÑплывание"/> + <item label="Мигание кнопки на панели инÑтрументов" name="FlashToolbarButton" value="мигание"/> + <item label="Ðет" name="None" value="нет"/> + </combo_box> + <text name="nearby_chat"> + Локальный чат: + </text> + <combo_box name="NearbyChatOptions"> + <item label="Открыть окно разговоров" name="OpenConversationsWindow" value="openconversations"/> + <item label="Сообщение во вÑплывающем окне" name="PopUpMessage" value="вÑплывание"/> + <item label="Мигание кнопки на панели инÑтрументов" name="FlashToolBarButton" value="мигание"/> + <item label="Ðет" name="None" value="нет"/> + </combo_box> + <text name="notifications_alert"> + Ð”Ð»Ñ Ð²Ñ€ÐµÐ¼ÐµÐ½Ð½Ð¾Ð³Ð¾ Ð¾Ñ‚ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ð²Ñех уведомлений вызовите меню «Общение > Ðе беÑпокоить». + </text> + </panel> + <panel> + <text name="play_sound"> + Звук: + </text> + <check_box label="Ðовый разговор" name="new_conversation"/> + <check_box label="ВходÑщий голоÑовой вызов" name="incoming_voice_call"/> + <check_box label="Предложение телепортации" name="teleport_offer"/> + <check_box label="Предложение инвентарÑ" name="inventory_offer"/> + </panel> + <panel> + <button label="ОчиÑтить журнал..." name="clear_log"/> + <button label="Удалить запиÑи..." name="delete_transcripts"/> + <button label="Обзор..." label_selected="Обзор" name="log_path_button"/> + </panel> <button label="Перевод..." name="ok_btn"/> <button label="Ðвтозамена..." name="autoreplace_showgui"/> <button label="Проверка правопиÑаниÑ..." name="spellcheck_showgui"/> diff --git a/indra/newview/skins/default/xui/ru/panel_preferences_general.xml b/indra/newview/skins/default/xui/ru/panel_preferences_general.xml index d1bfedf2d8..c7a850f78a 100644 --- a/indra/newview/skins/default/xui/ru/panel_preferences_general.xml +++ b/indra/newview/skins/default/xui/ru/panel_preferences_general.xml @@ -68,9 +68,9 @@ <combo_box.item label="никогда" name="item4"/> </combo_box> <text name="text_box3"> - Ответ в режиме «ЗанÑт»: + Ответ в режиме «Ðе беÑпокоить»: </text> - <text_editor name="busy_response"> + <text_editor name="do_not_disturb_response"> log_in_to_change </text_editor> </panel> diff --git a/indra/newview/skins/default/xui/ru/sidepanel_task_info.xml b/indra/newview/skins/default/xui/ru/sidepanel_task_info.xml index e9dd3760b5..5502530ca4 100644 --- a/indra/newview/skins/default/xui/ru/sidepanel_task_info.xml +++ b/indra/newview/skins/default/xui/ru/sidepanel_task_info.xml @@ -72,6 +72,7 @@ <combo_box.item label="Купить объект" name="Buyobject"/> <combo_box.item label="Заплатить за объект" name="Payobject"/> <combo_box.item label="Открыть" name="Open"/> + <combo_box.item label="Приблизить" name="Zoom"/> </combo_box> <panel name="perms_inv"> <text name="perm_modify"> diff --git a/indra/newview/skins/default/xui/ru/strings.xml b/indra/newview/skins/default/xui/ru/strings.xml index f9ded799bf..d7d4df4a37 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/index.php?lang=ru-RU&sourceid=[sourceid] + http://join.secondlife.com/?sourceid=[sourceid] </string> <string name="LoginFailedViewerNotPermitted"> У клиента, которым вы пользуетеÑÑŒ, больше нет доÑтупа к игре Second Life. Загрузить новую верÑию клиента можно по адреÑу @@ -619,7 +619,7 @@ support@secondlife.com. <string name="AvatarAway"> Ðет на меÑте </string> - <string name="AvatarBusy"> + <string name="AvatarDoNotDisturb"> Ðе беÑпокоить </string> <string name="AvatarMuted"> @@ -856,6 +856,12 @@ support@secondlife.com. <string name="ST_NO_JOINT"> Ðе удаетÑÑ Ð½Ð°Ð¹Ñ‚Ð¸ объект ROOT или JOINT. </string> + <string name="NearbyChatTitle"> + Локальный чат + </string> + <string name="NearbyChatLabel"> + (Локальный чат) + </string> <string name="whisper"> шепчет: </string> @@ -919,12 +925,15 @@ support@secondlife.com. <string name="ControlYourCamera"> УправлÑÑ‚ÑŒ камерой </string> - <string name="TeleportYourAgent"> - Телепортировать Ð²Ð°Ñ - </string> <string name="NotConnected"> Ðет Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ </string> + <string name="AgentNameSubst"> + (Ð’Ñ‹) + </string> + <string name="TeleportYourAgent"> + Телепортировать Ð²Ð°Ñ + </string> <string name="SIM_ACCESS_PG"> Общий </string> @@ -1006,18 +1015,6 @@ support@secondlife.com. <string name="dictionary_files"> Словари </string> - <string name="AvatarSetNotAway"> - Ðа меÑте - </string> - <string name="AvatarSetAway"> - Ðет на меÑте - </string> - <string name="AvatarSetNotBusy"> - Ðе занÑÑ‚(а) - </string> - <string name="AvatarSetBusy"> - Ðе беÑпокоить - </string> <string name="shape"> Фигура </string> @@ -1986,8 +1983,8 @@ support@secondlife.com. <string name="PanelContentsNewScript"> Ðовый Ñкрипт </string> - <string name="BusyModeResponseDefault"> - У адреÑата вашего ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð·Ð°Ð´Ð°Ð½ ÑÑ‚Ð°Ñ‚ÑƒÑ Â«Ðе беÑпокоить». Ваше Ñообщение вÑе равно будет отображено на панели IM Ð´Ð»Ñ Ð¿Ñ€Ð¾Ñмотра позже. + <string name="DoNotDisturbModeResponseDefault"> + Ðтот житель включил режим «Ðе беÑпокоить» и увидит ваше Ñообщение позже. </string> <string name="MuteByName"> (по имени) @@ -2100,9 +2097,6 @@ support@secondlife.com. <string name="GroupMoneyDate"> [weekday,datetime,utc], [day,datetime,utc] [mth,datetime,utc] [year,datetime,utc] </string> - <string name="ViewerObjectContents"> - Контент - </string> <string name="AcquiredItems"> Купленные вещи </string> @@ -3871,7 +3865,7 @@ support@secondlife.com. ОблаÑÑ‚ÑŒ общей дозволенноÑти </string> <string name="LocationCtrlSeeAVsTooltip"> - Ð’Ñе жители Ñ Ð´Ñ€ÑƒÐ³Ð¸Ñ… учаÑтков могут видеть аватары и общатьÑÑ Ð² чате + Ðватары на Ñтом учаÑтке невидимы и неÑлышимы Ð´Ð»Ñ Ð°Ð²Ð°Ñ‚Ð°Ñ€Ð¾Ð² Ñ Ð´Ñ€ÑƒÐ³Ð¸Ñ… учаÑтков </string> <string name="LocationCtrlPathfindingDirtyTooltip"> Возможны неполадки подвижных объектов в Ñтом регионе, пока регион не будет воÑÑтановлен. @@ -3948,6 +3942,12 @@ support@secondlife.com. <string name="IM_unblock_only_groups_friends"> Ð”Ð»Ñ Ð¿Ñ€Ð¾Ñмотра Ñтого ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ñнимите флажок «Только Ð´Ñ€ÑƒÐ·ÑŒÑ Ð¸ группы могут звонить мне и отправлÑÑ‚ÑŒ IM» в окне «ÐаÑтройки/ПриватноÑть». </string> + <string name="OnlineStatus"> + Онлайн + </string> + <string name="OfflineStatus"> + Оффлайн + </string> <string name="answered_call"> Ðа ваш звонок ответили </string> @@ -3957,6 +3957,9 @@ support@secondlife.com. <string name="you_joined_call"> Ð’Ñ‹ приÑоединилиÑÑŒ к голоÑовой беÑеде </string> + <string name="you_auto_rejected_call-im"> + ГолоÑовой вызов автоматичеÑки отклонен, так как включен режим «Ðе беÑпокоить». + </string> <string name="name_started_call"> Житель [NAME] начал голоÑовую беÑеду </string> @@ -3973,7 +3976,7 @@ support@secondlife.com. СоединÑетÑÑ... </string> <string name="conference-title"> - Ð¡Ð¿Ð¾Ð½Ñ‚Ð°Ð½Ð½Ð°Ñ ÐºÐ¾Ð½Ñ„ÐµÑ€ÐµÐ½Ñ†Ð¸Ñ + Чат Ñ Ð½ÐµÑколькими учаÑтниками </string> <string name="conference-title-incoming"> ÐšÐ¾Ð½Ñ„ÐµÑ€ÐµÐ½Ñ†Ð¸Ñ Ñ Ð¶Ð¸Ñ‚ÐµÐ»ÐµÐ¼ [AGENT_NAME] @@ -4865,6 +4868,9 @@ support@secondlife.com. <string name="Command_Chat_Label"> Чат </string> + <string name="Command_Conversations_Label"> + Разговоры + </string> <string name="Command_Compass_Label"> ÐšÐ¾Ð¼Ð¿Ð°Ñ </string> @@ -4940,6 +4946,9 @@ support@secondlife.com. <string name="Command_Chat_Tooltip"> ОбменивайтеÑÑŒ текÑтовыми репликами Ñ Ð»ÑŽÐ´ÑŒÐ¼Ð¸ вокруг Ð²Ð°Ñ </string> + <string name="Command_Conversations_Tooltip"> + Поговорить Ñо вÑеми + </string> <string name="Command_Compass_Tooltip"> ÐšÐ¾Ð¼Ð¿Ð°Ñ </string> @@ -5069,4 +5078,13 @@ support@secondlife.com. <string name="UserDictionary"> [Пользователь] </string> + <string name="logging_calls_disabled_log_empty"> + Разговоры не запиÑываютÑÑ. Чтобы начать запиÑÑŒ разговора, в меню «ÐаÑтройки > Чат» выберите «СохранÑÑ‚ÑŒ: только журнал» или «СохранÑÑ‚ÑŒ: журнал и запиÑи». + </string> + <string name="logging_calls_disabled_log_not_empty"> + Разговоры больше не будут запиÑыватьÑÑ. Чтобы воÑÑтановить запиÑÑŒ разговора, в меню «ÐаÑтройки > Чат» выберите «СохранÑÑ‚ÑŒ: только журнал» или «СохранÑÑ‚ÑŒ: журнал и запиÑи». + </string> + <string name="logging_calls_enabled_log_empty"> + Ðет зарегиÑтрированных разговоров. ЕÑли вы обратитеÑÑŒ к кому-то или наоборот, в журнале поÑвитÑÑ Ð½Ð¾Ð²Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ. + </string> </strings> diff --git a/indra/newview/skins/default/xui/tr/floater_conversation_log.xml b/indra/newview/skins/default/xui/tr/floater_conversation_log.xml new file mode 100644 index 0000000000..5f8dac506f --- /dev/null +++ b/indra/newview/skins/default/xui/tr/floater_conversation_log.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="floater_conversation_log" title="SOHBET GÃœNLÜĞÜ"> + <panel name="buttons_panel"> + <filter_editor label="KiÅŸileri Filtrele" name="people_filter_input"/> + <menu_button name="conversation_view_btn" tool_tip="Gösterme/sıralama seçenekleri"/> + <menu_button name="conversations_gear_btn" tool_tip="Seçilen kiÅŸi veya grup üzerindeki eylemler"/> + </panel> +</floater> diff --git a/indra/newview/skins/default/xui/tr/floater_conversation_preview.xml b/indra/newview/skins/default/xui/tr/floater_conversation_preview.xml new file mode 100644 index 0000000000..84403dfd68 --- /dev/null +++ b/indra/newview/skins/default/xui/tr/floater_conversation_preview.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="preview_conversation" title="KONUÅžMA:"> + <floater.string name="Title"> + KONUÅžMA: [NAME] + </floater.string> + <text name="page_label" value="Sayfa"/> +</floater> diff --git a/indra/newview/skins/default/xui/tr/floater_im_container.xml b/indra/newview/skins/default/xui/tr/floater_im_container.xml index 4451d1d309..6504430b3c 100644 --- a/indra/newview/skins/default/xui/tr/floater_im_container.xml +++ b/indra/newview/skins/default/xui/tr/floater_im_container.xml @@ -1,2 +1,29 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<multi_floater name="floater_im_box" title="SOHBETLER"/> +<multi_floater name="floater_im_box" title="SOHBETLER"> + <string name="collapse_icon" value="Conv_toolbar_collapse"/> + <string name="expand_icon" value="Conv_toolbar_expand"/> + <layout_stack name="conversations_stack"> + <layout_panel name="conversations_layout_panel"> + <layout_stack name="conversations_pane_buttons_stack"> + <layout_panel name="conversations_pane_buttons_expanded"> + <menu_button name="sort_btn" tool_tip="Gösterme/sıralama seçenekleri"/> + <button name="add_btn" tool_tip="Yeni bir sohbet baÅŸlat"/> + <button name="speak_btn" tool_tip="Mikrofonunuzu kullanarak kiÅŸilerle konuÅŸun"/> + </layout_panel> + <layout_panel name="conversations_pane_buttons_collapsed"> + <button name="expand_collapse_btn" tool_tip="Bu listeyi Daralt/GeniÅŸlet"/> + </layout_panel> + </layout_stack> + </layout_panel> + <layout_panel name="messages_layout_panel"> + <panel_container name="im_box_tab_container"> + <panel name="stub_panel"> + <button name="stub_collapse_btn" tool_tip="Bu panoyu daralt"/> + <text name="stub_textbox"> + Sohbet ayrı bir pencerede. [secondlife:/// Bunu geri getir.] + </text> + </panel> + </panel_container> + </layout_panel> + </layout_stack> +</multi_floater> diff --git a/indra/newview/skins/default/xui/tr/floater_im_session.xml b/indra/newview/skins/default/xui/tr/floater_im_session.xml index bed08b36c6..8ce8f0fe13 100644 --- a/indra/newview/skins/default/xui/tr/floater_im_session.xml +++ b/indra/newview/skins/default/xui/tr/floater_im_session.xml @@ -1,8 +1,59 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="panel_im"> - <layout_stack name="im_panels"> - <layout_panel> - <line_editor label="Kime" name="chat_editor"/> - </layout_panel> - </layout_stack> + <floater.string name="call_btn_start"> + Conv_toolbar_open_call + </floater.string> + <floater.string name="call_btn_stop"> + Conv_toolbar_hang_up + </floater.string> + <floater.string name="collapseline_icon" value="Conv_collapse_to_one_line"/> + <floater.string name="expandline_icon" value="Conv_expand_one_line"/> + <floater.string name="collapse_icon" value="Conv_toolbar_collapse"/> + <floater.string name="expand_icon" value="Conv_toolbar_expand"/> + <floater.string name="tear_off_icon" value="Conv_toolbar_arrow_ne"/> + <floater.string name="return_icon" value="Conv_toolbar_arrow_sw"/> + <floater.string name="participant_added" value="[NAME] sohbete davet edildi."/> + <floater.string name="multiple_participants_added" value="[NAME] sohbete davet edildi."/> + <floater.string name="tooltip_to_separate_window" value="Bu sohbeti ayrı bir pencereye taşı"/> + <floater.string name="tooltip_to_main_window" value="Bu sohbeti ana pencereye geri taşı"/> + <floater.string name="start_call_button_tooltip" value="Ses baÄŸlantısını aç"/> + <floater.string name="end_call_button_tooltip" value="Ses baÄŸlantısını kapat"/> + <floater.string name="expcol_button_not_tearoff_tooltip" value="Bu panoyu daralt"/> + <floater.string name="expcol_button_tearoff_and_expanded_tooltip" value="Katılımcı listesini daralt"/> + <floater.string name="expcol_button_tearoff_and_collapsed_tooltip" value="Katılımcı listesini geniÅŸlet"/> + <view name="contents_view"> + <layout_stack name="main_stack"> + <layout_panel name="toolbar_panel"> + <menu_button name="view_options_btn" tool_tip="Gösterme/sıralama seçenekleri"/> + <menu_button name="gear_btn" tool_tip="Seçilen kiÅŸi üzerindeki eylemler"/> + <button name="add_btn" tool_tip="Bu sohbete birini ekle"/> + <button name="voice_call_btn" tool_tip="Ses baÄŸlantısını aç"/> + <button name="close_btn" tool_tip="Bu sohbeti bitir"/> + <button name="expand_collapse_btn" tool_tip="Bu panoyu Daralt/GeniÅŸlet"/> + </layout_panel> + <layout_panel name="body_panel"> + <layout_stack name="im_panels"> + <layout_panel name="right_part_holder"> + <panel name="trnsAndChat_panel"> + <layout_stack name="translate_and_chat_stack"> + <layout_panel name="translate_chat_checkbox_lp"> + <check_box label="Sohbeti çevir" name="translate_chat_checkbox"/> + </layout_panel> + </layout_stack> + </panel> + </layout_panel> + </layout_stack> + </layout_panel> + <layout_panel name="chat_layout_panel"> + <layout_stack name="input_panels"> + <layout_panel name="input_editor_layout_panel"> + <chat_editor label="Kime" name="chat_editor"/> + </layout_panel> + <layout_panel name="input_button_layout_panel"> + <button name="minz_btn" tool_tip="Mesaj panelini gösterir/gizler"/> + </layout_panel> + </layout_stack> + </layout_panel> + </layout_stack> + </view> </floater> diff --git a/indra/newview/skins/default/xui/tr/floater_incoming_call.xml b/indra/newview/skins/default/xui/tr/floater_incoming_call.xml index adb03c2dff..0f2b27241e 100644 --- a/indra/newview/skins/default/xui/tr/floater_incoming_call.xml +++ b/indra/newview/skins/default/xui/tr/floater_incoming_call.xml @@ -10,7 +10,7 @@ anonim </floater.string> <floater.string name="VoiceInviteP2P"> - arıyor. + sizi arıyor. </floater.string> <floater.string name="VoiceInviteAdHoc"> bir Sesli Sohbet aramasına bir konferans araması ile katıldı. @@ -25,9 +25,9 @@ [CURRENT_CHAT] sohbetinden ayrılıp, bu sesli sohbete katılmak istiyor musunuz? </floater.string> <text name="question"> - [CURRENT_CHAT] sohbetinden ayrılıp, bu sesli sohbete katılmak istiyor musunuz? + Yanıtlarsanız, mevcut sesli sohbetinizle baÄŸlantınız kesilecek. </text> - <button label="Kabul Et" label_selected="Kabul Et" name="Accept"/> - <button label="Reddet" label_selected="Reddet" name="Reject"/> - <button label="AÄ° BaÅŸlat" name="Start IM"/> + <button label="Yanıtla" label_selected="Yanıtla" name="Accept"/> + <button label="Yok say" label_selected="Yok say" name="Reject"/> + <button label="Bunun yerine AÄ° aç" name="Start IM"/> </floater> diff --git a/indra/newview/skins/default/xui/tr/floater_pathfinding_console.xml b/indra/newview/skins/default/xui/tr/floater_pathfinding_console.xml index 6eecc7fb77..35f47e6dfa 100644 --- a/indra/newview/skins/default/xui/tr/floater_pathfinding_console.xml +++ b/indra/newview/skins/default/xui/tr/floater_pathfinding_console.xml @@ -71,7 +71,7 @@ <text name="show_label"> Göster: </text> - <check_box label="Dünya" name="show_world"/> + <check_box label="Test" name="show_world"/> <check_box label="Sadece hareket ettirilebilir nesneler" name="show_world_movables_only"/> <check_box label="Navigasyon örgüsü" name="show_navmesh"/> <text name="show_walkability_label"> 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 889425f23a..42483c09e1 100644 --- a/indra/newview/skins/default/xui/tr/floater_texture_ctrl.xml +++ b/indra/newview/skins/default/xui/tr/floater_texture_ctrl.xml @@ -19,7 +19,7 @@ <button label="Varsayılan" label_selected="Varsayılan" name="Default"/> <button label="BoÅŸ" label_selected="BoÅŸ" name="Blank"/> <button label="Hiçbiri" label_selected="Hiçbiri" name="None"/> - <check_box initial_value="true" label="Canlı Önizleme" name="apply_immediate_check"/> + <check_box initial_value="true" label="Åžimdi uygula" name="apply_immediate_check"/> <text name="preview_disabled" value="Önizleme Devre Dışı"/> <filter_editor label="Dokuları Filtrele" name="inventory search editor"/> <check_box initial_value="false" label="Klasörleri göster" name="show_folders_check"/> diff --git a/indra/newview/skins/default/xui/tr/floater_voice_chat_volume.xml b/indra/newview/skins/default/xui/tr/floater_voice_chat_volume.xml new file mode 100644 index 0000000000..ec350bee60 --- /dev/null +++ b/indra/newview/skins/default/xui/tr/floater_voice_chat_volume.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="floater_voice_volume" title="SOHBET SES DÃœZEYÄ°"> + <slider label="Sesli Sohbet" name="chat_voice_volume"/> +</floater> diff --git a/indra/newview/skins/default/xui/tr/floater_voice_effect.xml b/indra/newview/skins/default/xui/tr/floater_voice_effect.xml index 3534a3fe90..7a157244cd 100644 --- a/indra/newview/skins/default/xui/tr/floater_voice_effect.xml +++ b/indra/newview/skins/default/xui/tr/floater_voice_effect.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater label="Yerler" name="voice_effects" title="SES ÅžEKÄ°LLENDÄ°RME"> +<floater label="Yerler" name="voice_effects" title="SES ÅžEKÄ°LLENDÄ°RME ÖNÄ°ZLEMESÄ°"> <string name="no_voice_effect"> (Ses Åžekillendirme Yok) </string> diff --git a/indra/newview/skins/default/xui/tr/floater_voice_volume.xml b/indra/newview/skins/default/xui/tr/floater_voice_volume.xml new file mode 100644 index 0000000000..acf99d6199 --- /dev/null +++ b/indra/newview/skins/default/xui/tr/floater_voice_volume.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<!-- + Not can_close / no title to avoid window chrome + Single instance - only have one at a time, recycle it each spawn +--> +<floater name="floater_voice_volume" title="SES DÃœZEYÄ°"> + <slider name="volume_slider" tool_tip="Ses düzeyi" value="0.5"/> +</floater> diff --git a/indra/newview/skins/default/xui/tr/menu_cof_gear.xml b/indra/newview/skins/default/xui/tr/menu_cof_gear.xml index f910e1fe91..9480d30029 100644 --- a/indra/newview/skins/default/xui/tr/menu_cof_gear.xml +++ b/indra/newview/skins/default/xui/tr/menu_cof_gear.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <toggleable_menu name="Gear COF"> <menu label="Yeni Giysiler" name="COF.Gear.New_Clothes"/> - <menu label="Yeni Vücut Bölümleri" name="COF.Geear.New_Body_Parts"/> + <menu label="Yeni Vücut Bölümleri" name="COF.Gear.New_Body_Parts"/> </toggleable_menu> diff --git a/indra/newview/skins/default/xui/tr/menu_conversation.xml b/indra/newview/skins/default/xui/tr/menu_conversation.xml new file mode 100644 index 0000000000..31404f2501 --- /dev/null +++ b/indra/newview/skins/default/xui/tr/menu_conversation.xml @@ -0,0 +1,31 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_conversation_participant"> + <menu_item_call label="Sohbeti kapat" name="close_conversation"/> + <menu_item_call label="Ses sohbetini aç" name="open_voice_conversation"/> + <menu_item_call label="Ses baÄŸlantısını kes" name="disconnect_from_voice"/> + <menu_item_call label="Profili Göster" name="view_profile"/> + <menu_item_call label="AÄ°" name="im"/> + <menu_item_call label="Işınlama teklif et" name="offer_teleport"/> + <menu_item_call label="Sesli arama" name="voice_call"/> + <menu_item_call label="Sohbet geçmiÅŸi..." name="chat_history"/> + <menu_item_call label="ArkadaÅŸ ekle" name="add_friend"/> + <menu_item_call label="Arkadaşı çıkar" name="remove_friend"/> + <menu_item_call label="ArkadaÅŸları çıkar" name="remove_friends"/> + <menu_item_call label="Gruba davet et..." name="invite_to_group"/> + <menu_item_call label="YakınlaÅŸtır" name="zoom_in"/> + <menu_item_call label="Harita" name="map"/> + <menu_item_call label="PaylaÅŸ" name="share"/> + <menu_item_call label="Öde" name="pay"/> + <menu_item_check label="Sesi Engelle" name="block_unblock"/> + <menu_item_check label="Metni Engelle" name="MuteText"/> + <menu_item_call label="Grup Profili" name="group_profile"/> + <menu_item_call label="Grubu EtkinleÅŸtir" name="activate_group"/> + <menu_item_call label="Gruptan Ayrıl" name="leave_group"/> + <context_menu label="Moderatör Seçenekleri" name="Moderator Options"> + <menu_item_check label="Metin sohbetine izin ver" name="AllowTextChat"/> + <menu_item_call label="Bu katılımcıyı engelle" name="ModerateVoiceMuteSelected"/> + <menu_item_call label="Bu katılımcının engellemesini kaldır" name="ModerateVoiceUnMuteSelected"/> + <menu_item_call label="Herkesi engelle" name="ModerateVoiceMute"/> + <menu_item_call label="Herkesin engellemesini kaldır" name="ModerateVoiceUnmute"/> + </context_menu> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/tr/menu_conversation_log_gear.xml b/indra/newview/skins/default/xui/tr/menu_conversation_log_gear.xml new file mode 100644 index 0000000000..9e91780eb8 --- /dev/null +++ b/indra/newview/skins/default/xui/tr/menu_conversation_log_gear.xml @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="Conversation Context Menu"> + <menu_item_call label="AÄ°..." name="IM"/> + <menu_item_call label="Sesli arama..." name="Call"/> + <menu_item_call label="Sohbet geçmiÅŸini aç..." name="Chat history"/> + <menu_item_call label="Profili Göster" name="View Profile"/> + <menu_item_call label="Işınlama Teklif Et" name="teleport"/> + <menu_item_call label="ArkadaÅŸ Ekle" name="add_friend"/> + <menu_item_call label="Arkadaşı Çıkar" name="remove_friend"/> + <menu_item_call label="Gruba davet et..." name="Invite"/> + <menu_item_call label="Harita" name="Map"/> + <menu_item_call label="PaylaÅŸ" name="Share"/> + <menu_item_call label="Öde" name="Pay"/> + <menu_item_check label="Engelle/Engeli Kaldır" name="Block/Unblock"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/tr/menu_conversation_log_view.xml b/indra/newview/skins/default/xui/tr/menu_conversation_log_view.xml new file mode 100644 index 0000000000..9a77eaadd9 --- /dev/null +++ b/indra/newview/skins/default/xui/tr/menu_conversation_log_view.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_conversation_view"> + <menu_item_check label="Ada göre sırala" name="sort_by_name"/> + <menu_item_check label="Tarihe göre sırala" name="sort_by_date"/> + <menu_item_check label="ArkadaÅŸlar üstte olacak ÅŸekilde sırala" name="sort_by_friends"/> + <menu_item_call label="Yakındaki sohbet geçmiÅŸini göster..." name="view_nearby_chat_history"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/tr/menu_im_conversation.xml b/indra/newview/skins/default/xui/tr/menu_im_conversation.xml new file mode 100644 index 0000000000..3b9738edce --- /dev/null +++ b/indra/newview/skins/default/xui/tr/menu_im_conversation.xml @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="Conversation Gear Menu"> + <menu_item_call label="Profili Göster" name="View Profile"/> + <menu_item_call label="ArkadaÅŸ Ekle" name="Add Friend"/> + <menu_item_call label="Arkadaşı çıkar" name="remove_friend"/> + <menu_item_call label="Işınlama teklif et" name="offer_teleport"/> + <menu_item_call label="Gruba davet et..." name="invite_to_group"/> + <menu_item_call label="Sohbet geçmiÅŸi..." name="chat_history"/> + <menu_item_call label="YakınlaÅŸtır" name="zoom_in"/> + <menu_item_call label="Harita" name="map"/> + <menu_item_call label="PaylaÅŸ" name="Share"/> + <menu_item_call label="Öde" name="Pay"/> + <menu_item_check label="Sesi Engelle" name="Block/Unblock"/> + <menu_item_check label="Metni Engelle" name="MuteText"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/tr/menu_im_session_showmodes.xml b/indra/newview/skins/default/xui/tr/menu_im_session_showmodes.xml new file mode 100644 index 0000000000..c4d4357ac9 --- /dev/null +++ b/indra/newview/skins/default/xui/tr/menu_im_session_showmodes.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_modes"> + <menu_item_check label="Daraltılmış görünüm" name="compact_view"/> + <menu_item_check label="GeniÅŸletilmiÅŸ görünüm" name="expanded_view"/> + <menu_item_check label="Zamanı göster" name="IMShowTime"/> + <menu_item_check label="Bire bir sohbetlerde adları göster" name="IMShowNamesForP2PConv"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/tr/menu_object_icon.xml b/indra/newview/skins/default/xui/tr/menu_object_icon.xml index 34a2661d8a..3d5c68d9d3 100644 --- a/indra/newview/skins/default/xui/tr/menu_object_icon.xml +++ b/indra/newview/skins/default/xui/tr/menu_object_icon.xml @@ -2,4 +2,6 @@ <menu name="Object Icon Menu"> <menu_item_call label="Nesne Profili..." name="Object Profile"/> <menu_item_call label="Engelle..." name="Block"/> + <menu_item_call label="Haritada Göster" name="show_on_map"/> + <menu_item_call label="Nesne Konumuna Işınla" name="teleport_to_object"/> </menu> diff --git a/indra/newview/skins/default/xui/tr/menu_outfit_gear.xml b/indra/newview/skins/default/xui/tr/menu_outfit_gear.xml index d2e7e7107a..674041e9c9 100644 --- a/indra/newview/skins/default/xui/tr/menu_outfit_gear.xml +++ b/indra/newview/skins/default/xui/tr/menu_outfit_gear.xml @@ -23,6 +23,8 @@ <menu_item_call label="Yeni Saç" name="New Hair"/> <menu_item_call label="Yeni Gözler" name="New Eyes"/> </menu> + <menu_item_call label="Tüm klasörleri geniÅŸlet" name="expand"/> + <menu_item_call label="Tüm klasörleri daralt" name="collapse"/> <menu_item_call label="Dış Görünümü Yeniden Adlandır" name="rename"/> <menu_item_call label="Dış Görünümü Sil" name="delete_outfit"/> </toggleable_menu> diff --git a/indra/newview/skins/default/xui/tr/menu_participant_view.xml b/indra/newview/skins/default/xui/tr/menu_participant_view.xml new file mode 100644 index 0000000000..e9411ff350 --- /dev/null +++ b/indra/newview/skins/default/xui/tr/menu_participant_view.xml @@ -0,0 +1,13 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="participant_manu_view"> + <menu_item_check label="Sohbetleri türe göre sırala" name="sort_sessions_by_type"/> + <menu_item_check label="Sohbetleri ada göre sırala" name="sort_sessions_by_name"/> + <menu_item_check label="Sohbetleri son faaliyetlere göre sırala" name="sort_sessions_by_recent"/> + <menu_item_check label="Katılımcıları ada göre sırala" name="sort_participants_by_name"/> + <menu_item_check label="Katılımcıları son faaliyetlere göre sırala" name="sort_participants_by_recent"/> + <menu_item_call label="Sohbet tercihleri..." name="chat_preferences"/> + <menu_item_call label="Gizlilik tercihleri..." name="privacy_preferences"/> + <menu_item_check label="Sohbet günlüğü..." name="Conversation"/> + <menu_item_check label="Yakındaki sohbeti çevir" name="Translate_chat"/> + <menu_item_check label="Çeviri ayarları..." name="Translation_settings"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/tr/menu_people_blocked_gear.xml b/indra/newview/skins/default/xui/tr/menu_people_blocked_gear.xml new file mode 100644 index 0000000000..2bf1101b48 --- /dev/null +++ b/indra/newview/skins/default/xui/tr/menu_people_blocked_gear.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_blocked_gear"> + <menu_item_call label="Engellemeyi Kaldır" name="unblock"/> + <menu_item_call label="Profil..." name="profile"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/tr/menu_people_blocked_plus.xml b/indra/newview/skins/default/xui/tr/menu_people_blocked_plus.xml new file mode 100644 index 0000000000..a869e2ae7d --- /dev/null +++ b/indra/newview/skins/default/xui/tr/menu_people_blocked_plus.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_blocked_plus"> + <menu_item_call label="Sakini ada göre engelle..." name="block_resident_by_name"/> + <menu_item_call label="Nesneyi ada göre engelle" name="block_object_by_name"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/tr/menu_people_blocked_view.xml b/indra/newview/skins/default/xui/tr/menu_people_blocked_view.xml new file mode 100644 index 0000000000..14b3de3a9f --- /dev/null +++ b/indra/newview/skins/default/xui/tr/menu_people_blocked_view.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_blocked_view"> + <menu_item_check label="Ada göre sırala" name="sort_by_name"/> + <menu_item_check label="Türe göre sırala" name="sort_by_type"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/tr/menu_people_friends_view.xml b/indra/newview/skins/default/xui/tr/menu_people_friends_view.xml new file mode 100644 index 0000000000..609584d6a6 --- /dev/null +++ b/indra/newview/skins/default/xui/tr/menu_people_friends_view.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_group_plus"> + <menu_item_check label="Ada Göre Sırala" name="sort_name"/> + <menu_item_check label="Duruma Göre Sırala" name="sort_status"/> + <menu_item_check label="KiÅŸi Simgelerini Göster" name="view_icons"/> + <menu_item_check label="Verilen Ä°zinleri Göster" name="view_permissions"/> + <menu_item_check label="Sohbet Günlüğünü Göster..." name="view_conversation"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/tr/menu_people_groups.xml b/indra/newview/skins/default/xui/tr/menu_people_groups.xml index 9f2946e310..743b01844d 100644 --- a/indra/newview/skins/default/xui/tr/menu_people_groups.xml +++ b/indra/newview/skins/default/xui/tr/menu_people_groups.xml @@ -2,7 +2,7 @@ <menu name="menu_group_plus"> <menu_item_call label="Bilgileri Görüntüle" name="View Info"/> <menu_item_call label="Sohbet" name="Chat"/> - <menu_item_call label="Ara" name="Call"/> + <menu_item_call label="Sesli arama" name="Call"/> <menu_item_call label="EtkinleÅŸtir" name="Activate"/> <menu_item_call label="Ayrıl" name="Leave"/> </menu> diff --git a/indra/newview/skins/default/xui/tr/menu_people_groups_view.xml b/indra/newview/skins/default/xui/tr/menu_people_groups_view.xml new file mode 100644 index 0000000000..e550b20add --- /dev/null +++ b/indra/newview/skins/default/xui/tr/menu_people_groups_view.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_group_plus"> + <menu_item_check label="Grup Simgelerini Göster" name="Display Group Icons"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/tr/menu_people_nearby.xml b/indra/newview/skins/default/xui/tr/menu_people_nearby.xml index ee859a9450..2d61461c91 100644 --- a/indra/newview/skins/default/xui/tr/menu_people_nearby.xml +++ b/indra/newview/skins/default/xui/tr/menu_people_nearby.xml @@ -1,13 +1,16 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <context_menu name="Avatar Context Menu"> - <menu_item_call label="Profili Göster" name="View Profile"/> - <menu_item_call label="ArkadaÅŸ Ekle" name="Add Friend"/> - <menu_item_call label="Arkadaşı Çıkar" name="Remove Friend"/> - <menu_item_call label="AÄ°" name="IM"/> - <menu_item_call label="Ara" name="Call"/> - <menu_item_call label="Harita" name="Map"/> - <menu_item_call label="PaylaÅŸ" name="Share"/> - <menu_item_call label="Öde" name="Pay"/> - <menu_item_check label="Engelle/Engeli Kaldır" name="Block/Unblock"/> - <menu_item_call label="Işınlama Teklif Et" name="teleport"/> + <menu_item_call label="Profili Göster" name="view_profile"/> + <menu_item_call label="AÄ°" name="im"/> + <menu_item_call label="Işınlama Teklif Et" name="offer_teleport"/> + <menu_item_call label="Sesli arama" name="voice_call"/> + <menu_item_call label="Sohbet geçmiÅŸini göster..." name="chat_history"/> + <menu_item_call label="ArkadaÅŸ Ekle" name="add_friend"/> + <menu_item_call label="Arkadaşı Çıkar" name="remove_friend"/> + <menu_item_call label="Gruba davet et..." name="invite_to_group"/> + <menu_item_call label="YakınlaÅŸtır" name="zoom_in"/> + <menu_item_call label="Harita" name="map"/> + <menu_item_call label="PaylaÅŸ" name="share"/> + <menu_item_call label="Öde" name="pay"/> + <menu_item_check label="Engelle/Engeli Kaldır" name="block_unblock"/> </context_menu> diff --git a/indra/newview/skins/default/xui/tr/menu_people_nearby_multiselect.xml b/indra/newview/skins/default/xui/tr/menu_people_nearby_multiselect.xml index 5c89f87906..20695d98e8 100644 --- a/indra/newview/skins/default/xui/tr/menu_people_nearby_multiselect.xml +++ b/indra/newview/skins/default/xui/tr/menu_people_nearby_multiselect.xml @@ -1,10 +1,10 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <context_menu name="Multi-Selected People Context Menu"> - <menu_item_call label="ArkadaÅŸ Ekle" name="Add Friends"/> - <menu_item_call label="Arkadaşı Çıkar" name="Remove Friend"/> - <menu_item_call label="AÄ°" name="IM"/> - <menu_item_call label="Ara" name="Call"/> - <menu_item_call label="PaylaÅŸ" name="Share"/> - <menu_item_call label="Öde" name="Pay"/> - <menu_item_call label="Işınlama Teklif Et" name="teleport"/> + <menu_item_call label="ArkadaÅŸ Ekle" name="add_friends"/> + <menu_item_call label="Arkadaşı Çıkar" name="remove_friends"/> + <menu_item_call label="AÄ°" name="im"/> + <menu_item_call label="Ara" name="call"/> + <menu_item_call label="PaylaÅŸ" name="share"/> + <menu_item_call label="Öde" name="pay"/> + <menu_item_call label="Işınlama Teklif Et" name="offer_teleport"/> </context_menu> diff --git a/indra/newview/skins/default/xui/tr/menu_people_nearby_view.xml b/indra/newview/skins/default/xui/tr/menu_people_nearby_view.xml new file mode 100644 index 0000000000..59ea7c145f --- /dev/null +++ b/indra/newview/skins/default/xui/tr/menu_people_nearby_view.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_group_plus"> + <menu_item_check label="Son KonuÅŸanlara Göre Sırala" name="sort_by_recent_speakers"/> + <menu_item_check label="Ada Göre Sırala" name="sort_name"/> + <menu_item_check label="Mesafeye Göre Sırala" name="sort_distance"/> + <menu_item_check label="KiÅŸi Simgelerini Göster" name="view_icons"/> + <menu_item_check label="Haritayı Göster" name="view_map"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/tr/menu_people_recent_view.xml b/indra/newview/skins/default/xui/tr/menu_people_recent_view.xml new file mode 100644 index 0000000000..02be715ed2 --- /dev/null +++ b/indra/newview/skins/default/xui/tr/menu_people_recent_view.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_group_plus"> + <menu_item_check label="En Sonunculara Göre Sırala" name="sort_most"/> + <menu_item_check label="Ada Göre Sırala" name="sort_name"/> + <menu_item_check label="KiÅŸi Simgelerini Göster" name="view_icons"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/tr/menu_url_agent.xml b/indra/newview/skins/default/xui/tr/menu_url_agent.xml index d82b52aea8..b14a0509bf 100644 --- a/indra/newview/skins/default/xui/tr/menu_url_agent.xml +++ b/indra/newview/skins/default/xui/tr/menu_url_agent.xml @@ -1,6 +1,8 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <context_menu name="Url Popup"> - <menu_item_call label="Sakin Profilini Göster" name="show_agent"/> + <menu_item_call label="Profili Göster" name="show_agent"/> + <menu_item_call label="AÄ° Gönder..." name="send_im"/> + <menu_item_call label="ArkadaÅŸ Ekle..." name="add_friend"/> <menu_item_call label="Adı panoya kopyala" name="url_copy_label"/> <menu_item_call label="SLurl'yi Panoya Kopyala" name="url_copy"/> </context_menu> diff --git a/indra/newview/skins/default/xui/tr/menu_url_objectim.xml b/indra/newview/skins/default/xui/tr/menu_url_objectim.xml index d55e34c11c..00fa3c27c2 100644 --- a/indra/newview/skins/default/xui/tr/menu_url_objectim.xml +++ b/indra/newview/skins/default/xui/tr/menu_url_objectim.xml @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <context_menu name="Url Popup"> - <menu_item_call label="Nesne Bilgilerini Göster" name="show_object"/> + <menu_item_call label="Nesne Profili..." name="show_object"/> <menu_item_call label="Haritada Göster" name="show_on_map"/> <menu_item_call label="Nesne Konumuna Işınla" name="teleport_to_object"/> <menu_item_call label="Nesne Adını panoya kopyala" name="url_copy_label"/> diff --git a/indra/newview/skins/default/xui/tr/menu_viewer.xml b/indra/newview/skins/default/xui/tr/menu_viewer.xml index 7a7faf6ac4..6ec5e6d7a3 100644 --- a/indra/newview/skins/default/xui/tr/menu_viewer.xml +++ b/indra/newview/skins/default/xui/tr/menu_viewer.xml @@ -16,10 +16,7 @@ <menu_item_call label="Beni Anime Etmeyi Durdur" name="Stop Animating My Avatar"/> <menu_item_call label="Yürü / koÅŸ / uç..." name="Walk / run / fly"/> </menu> - <menu label="Durum" name="Status"> - <menu_item_call label="Uzakta" name="Set Away"/> - <menu_item_call label="MeÅŸgul" name="Set Busy"/> - </menu> + <menu label="Durum" name="Status"/> <menu_item_call label="L$ Satın Al..." name="Buy and Sell L$"/> <menu_item_call label="Satıcı Giden Kutusu..." name="MerchantOutbox"/> <menu_item_call label="Hesap kontrol paneli..." name="Manage My Account"/> @@ -30,14 +27,18 @@ <menu_item_call label="[APP_NAME]'den Çık" name="Quit"/> </menu> <menu label="Ä°letiÅŸim Kur" name="Communicate"> - <menu_item_check label="Sohbet..." name="Nearby Chat"/> + <menu_item_check label="Sohbetler..." name="Conversations"/> + <menu_item_check label="Yakındaki Sohbet..." name="Nearby Chat"/> <menu_item_check label="KonuÅŸ" name="Speak"/> - <menu_item_check label="Ses ayarları..." name="Nearby Voice"/> - <menu_item_check label="Ses ÅŸekillendirme..." name="ShowVoice"/> + <menu label="Ses ÅŸekillendirme" name="VoiceMorphing"> + <menu_item_check label="Ses ÅŸekillendirme yok" name="NoVoiceMorphing"/> + <menu_item_check label="Önizleme..." name="Preview"/> + <menu_item_call label="Abone ol..." name="Subscribe"/> + </menu> <menu_item_check label="Mimikler..." name="Gestures"/> - <menu_item_call label="ArkadaÅŸlar" name="My Friends"/> - <menu_item_call label="Gruplar" name="My Groups"/> - <menu_item_call label="Yakındaki kiÅŸiler" name="Active Speakers"/> + <menu_item_check label="ArkadaÅŸlar" name="My Friends"/> + <menu_item_check label="Gruplar" name="My Groups"/> + <menu_item_check label="Yakındaki kiÅŸiler" name="Active Speakers"/> <menu_item_call label="Engelleme Listesi" name="Block List"/> </menu> <menu label="Dünya" name="World"> @@ -305,7 +306,7 @@ <menu_item_call label="Seçilen Doku Bilgi Temeli" name="Selected Texture Info Basis"/> <menu_item_check label="Telkafes" name="Wireframe"/> <menu_item_check label="Görünen Nesneler İçin Gölgeleme" name="Object-Object Occlusion"/> - <menu_item_check label="Işıklandırma ve Gölgeler" name="Lighting and Shadows"/> + <menu_item_check label="Işıklandırma ve Gölgeler" name="Advanced Lighting Model"/> <menu_item_check label="GüneÅŸ/Ay/Projektörlerden Gelen Gölgeler" name="Shadows from Sun/Moon/Projectors"/> <menu_item_check label="SSAO ve Gölge YumuÅŸatma" name="SSAO and Shadow Smoothing"/> <menu_item_check label="GL Hata Ayıklama" name="Debug GL"/> diff --git a/indra/newview/skins/default/xui/tr/notifications.xml b/indra/newview/skins/default/xui/tr/notifications.xml index 488702f9ca..ad92a4b478 100644 --- a/indra/newview/skins/default/xui/tr/notifications.xml +++ b/indra/newview/skins/default/xui/tr/notifications.xml @@ -516,6 +516,24 @@ Daha fazla bilgi için [_URL] adresini ziyaret etmek ister misiniz? </url> <usetemplate ignoretext="Grafik sürücüm güncel deÄŸil" name="okcancelignore" notext="Hayır" yestext="Evet"/> </notification> + <notification name="AMDOldDriver"> + 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://support.amd.com/us/Pages/AMDSupportHub.aspx + </url> + <usetemplate ignoretext="Grafik sürücüm güncel deÄŸil" name="okcancelignore" notext="Hayır" yestext="Evet"/> + </notification> + <notification name="NVIDIAOldDriver"> + 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.nvidia.com/Download/index.aspx?lang=en-us + </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. @@ -1546,10 +1564,13 @@ Gruptan ayrılmak istiyor musunuz? Åžu anda arkadaÅŸlık teklif edilemiyor. Lütfen biraz sonra tekrar deneyin. <usetemplate name="okbutton" yestext="Tamam"/> </notification> - <notification name="BusyModeSet"> - Durumunuz MeÅŸgul olarak ayarlandı. -Sohbet ve anlık iletiler gizlenecek. Anlık iletilere MeÅŸgul durumu için belirlediÄŸiniz yanıt gönderilecek. Tüm ışınlanma teklifleri reddedilecek. Tüm envanter teklifleri Çöp Kutunuza gidecek. - <usetemplate ignoretext="Durumumu MeÅŸgul olarak deÄŸiÅŸtiriyorum" name="okignore" yestext="Tamam"/> + <notification name="DoNotDisturbModeSet"> + Rahatsız Etme açık. Gelen iletiÅŸimlerle ilgili size bilgi verilmeyecek. + +- DiÄŸer sakinlere sizin Rahatsız Etmeyin yanıtı iletilecektir (Tercihler > Genel içerisinde ayarlanır). +- Işınlanma teklifleri reddedilecektir. +- Sesli aramalar reddedilecektir. + <usetemplate ignoretext="Durumumu Rahatsız Etme moduna deÄŸiÅŸtiriyorum" name="okignore" yestext="Tamam"/> </notification> <notification name="JoinedTooManyGroupsMember"> Maksimum grup sayısına eriÅŸtiniz. Lütfen bu gruba katılmadan önce baÅŸka bir gruptan ayrılın ya da bu teklifi reddedin. @@ -2033,6 +2054,10 @@ Envanter öğesi/öğeleri taşınsın mı? Hesap geçmiÅŸinizi görüntülemek için [http://secondlife.com/account/ Kontrol Paneli] adresine gitmek istiyor musunuz? <usetemplate ignoretext="Hesap geçmiÅŸimi görüntülemek için tarayıcımı baÅŸlat" name="okcancelignore" notext="Ä°ptal" yestext="Sayfaya git"/> </notification> + <notification name="ConfirmAddingChatParticipants"> + Mevcut bir sohbete bir kiÅŸi eklediÄŸinizde yeni bir sohbet oluÅŸturulur. Tüm katılımcılara yeni sohbet bildirimi gönderilir. + <usetemplate ignoretext="Sohbet katılımcılarının eklenmesini doÄŸrula" name="okcancelignore" notext="Ä°ptal" yestext="Tamam"/> + </notification> <notification name="ConfirmQuit"> Çıkmak istediÄŸinize emin misiniz? <usetemplate ignoretext="Çıkmadan önce doÄŸrulama iste" name="okcancelignore" notext="Çıkma" yestext="Çık"/> @@ -2107,14 +2132,14 @@ Bu nesneyi seçilen nesne ile deÄŸiÅŸtirmek istiyor musunuz? <button ignore="Hiçbir Zaman DeÄŸiÅŸtirme" name="No" text="Ä°ptal"/> </form> </notification> - <notification label="MeÅŸgul Durumu Uyarısı" name="BusyModePay"> - Durumunuz MeÅŸgul olarak ayarlanmış; bu da, bu ödemenin karşılığında teklif edilen hiçbir öğeyi almayacağınız anlamına gelir. + <notification label="Rahatsız Etme Modu Uyarısı" name="DoNotDisturbModePay"> + Rahatsız Etme seçeneÄŸini devreye aldınız. Bu ödemenin karşılığında sunulan hiçbir öğeyi almayacaksınız. -Bu iÅŸlemi tamamlamadan önce MeÅŸgul durumundan çıkmak ister misiniz? +Bu iÅŸlemi tamamlamadan önce Rahatsız Etme'yi kapatmak ister misiniz? <form name="form"> - <ignore name="ignore" text="MeÅŸgul durumundayken bir kiÅŸiye veya bir nesneye ödeme yapmak üzereyim."/> - <button ignore="Her zaman MeÅŸgul durumundan çık" name="Yes" text="Tamam"/> - <button ignore="Hiçbir zaman MeÅŸgul durumundan çıkma" name="No" text="Ä°ptal"/> + <ignore name="ignore" text="Rahatsız Etmeyin modundayken bir kiÅŸiye veya bir nesneye ödeme yapmak üzereyim"/> + <button ignore="Rahatsız Etme Modundan daima çıkılsın" name="Yes" text="Tamam"/> + <button ignore="Rahatsız Etme Modundan asla çıkılmasın" name="No" text="Ä°ptal"/> </form> </notification> <notification name="ConfirmDeleteProtectedCategory"> @@ -2249,11 +2274,8 @@ DiÄŸer kiÅŸilerin bu konuma kolayca eriÅŸmesini saÄŸlamak için bu adrese bir we <notification name="GroupNotice"> Konu: [SUBJECT], Ä°leti: [MESSAGE] </notification> - <notification name="FriendOnline"> - <nolink>[NAME]</nolink> çevrimiçi - </notification> - <notification name="FriendOffline"> - <nolink>[NAME]</nolink> çevrimdışı + <notification name="FriendOnlineOffline"> + <nolink>[NAME]</nolink> durumu: [STATUS] </notification> <notification name="AddSelfFriend"> Çok iyi biri olduÄŸunuza eminiz fakat kendinizi arkadaÅŸ olarak ekleyemezsiniz. @@ -2482,13 +2504,6 @@ Burada uçamazsınız. <notification name="DynamicPathfindingDisabled"> Bu bölgede dinamik yol bulma etkin deÄŸil. Yol bulma LSL çaÄŸrılarını kullanan komut dosyalı nesneler, bu bölgede beklendiiÄŸi gibi çalışmayabilir. </notification> - <notification name="PathfindingRebakeNavmesh"> - Bu bölgede belirli diÄŸer nesneleri deÄŸiÅŸtirmek, hareket eden baÅŸka nesnelerin yanlış davranmasına neden olabilir. Hareket eden baÅŸka nesnelerin doÄŸru davranmasını saÄŸlamak için “Bölgeyi yeniden kaydet†düğmesine tıklayın. Daha fazla bilgi edinmek için “Yardım†seçimini yapın. - <url name="url"> - http://wiki.secondlife.com/wiki/Pathfinding_Tools_in_the_Second_Life_Viewer - </url> - <usetemplate helptext="Yardım" ignoretext="Bu bölgede belirli diÄŸer nesneleri deÄŸiÅŸtirmek, hareket eden baÅŸka nesnelerin yanlış davranmasına neden olabilir." name="okhelpignore" yestext="Tamam"/> - </notification> <notification name="PathfindingCannotRebakeNavmesh"> Bir hata meydana geldi. Bir aÄŸ veya sunucu sorunu olabilir ya da oluÅŸturma haklarına sahip olmayabilirsiniz. Bazen oturumu kapatıp, tekrar açmak bu sorunu çözer. <usetemplate name="okbutton" yestext="Tamam"/> @@ -2751,7 +2766,7 @@ Kabul ediyor musunuz? <notification name="ScriptQuestionCaution"> Uyarı: '<nolink>[OBJECTNAME]</nolink>' 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. +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="Tam eriÅŸime izin ver"/> <button name="Deny" text="Reddet"/> @@ -3333,4 +3348,626 @@ GiriÅŸim iptal edildi. [NUM_ITEMS] öğeyi siliyorsunuz. Devam etmek istediÄŸinize emin misiniz? <usetemplate ignoretext="Birden çok öğeyi silmek istediÄŸinize emin misiniz?" name="okcancelignore" notext="Hayır" yestext="Evet"/> </notification> + <notification name="AvatarFrozen"> + [AV_FREEZER] sizi dondurdu. Hareket edemez veya dünyayla etkileÅŸim kuramazsınız. + </notification> + <notification name="AvatarFrozenDuration"> + [AV_FREEZER] sizi [AV_FREEZE_TIME] saniye boyunca dondurdu. Hareket edemez veya dünyayla etkileÅŸim kuramazsınız. + </notification> + <notification name="YouFrozeAvatar"> + Avatar donduruldu. + </notification> + <notification name="AvatarHasUnFrozenYou"> + [AV_FREEZER] sizin dondurulmanızı kaldırdı. + </notification> + <notification name="AvatarUnFrozen"> + Avatar artık dondurulmuÅŸ deÄŸil. + </notification> + <notification name="AvatarFreezeFailure"> + Dondurma baÅŸarılamadı çünkü bu parsel için yönetici iznine sahip deÄŸilsiniz. + </notification> + <notification name="AvatarFreezeThaw"> + Dondurmanızın süresi sona erdi, istediÄŸinizi yapabilirsiniz. + </notification> + <notification name="AvatarCantFreeze"> + Ãœzgünüz, bu kullanıcı dondurulamaz. + </notification> + <notification name="NowOwnObject"> + Artık [OBJECT_NAME] nesnesinin sahibisiniz + </notification> + <notification name="CantRezOnLand"> + [OBJECT_POS] konumunda nesneyi oluÅŸturamazsınız çünkü bu arazinin sahibi buna izin vermiyor. Arazinin sahibini görmek için arazi aracını kullanın. + </notification> + <notification name="RezFailTooManyRequests"> + Çok fazla talep olduÄŸu için nesne oluÅŸturulamadı. + </notification> + <notification name="SitFailCantMove"> + Oturamazsınız çünkü ÅŸu anda hareket edemezsiniz. + </notification> + <notification name="SitFailNotAllowedOnLand"> + Oturamazsınız çünkü bu araziye girme izniniz yok. + </notification> + <notification name="SitFailNotSameRegion"> + Daha yakına gelmeyi deneyin. Nesne sizinle aynı bölgede olmadığı için nesnenin üzerine oturulamaz. + </notification> + <notification name="NoNewObjectRegionFull"> + Yeni nesne oluÅŸturulamıyor. Bölge dolu. + </notification> + <notification name="FailedToPlaceObject"> + Belirtilen konuma nesne yerleÅŸtirilemedi. Lütfen tekrar deneyin. + </notification> + <notification name="NoOwnNoGardening"> + Sahibi olmadığınız arazide aÄŸaçlar ve çimen oluÅŸturamazsınız. + </notification> + <notification name="NoCopyPermsNoObject"> + '[OBJ_NAME]' nesnesini kopyalama izniniz olmadığı için kopyalama baÅŸarılamadı. + </notification> + <notification name="NoTransPermsNoObject"> + '[OBJ_NAME]' nesnesi size aktarılamadığı için kopyalama baÅŸarılamadı. + </notification> + <notification name="AddToNavMeshNoCopy"> + '[OBJ_NAME]' nesnesi navmesh'e katkıda bulunduÄŸu için kopyalama baÅŸarılamadı. + </notification> + <notification name="DupeWithNoRootsSelected"> + Kök nesne seçili olmayan kopya. + </notification> + <notification name="CantDupeCuzRegionIsFull"> + Nesneler çoÄŸaltılamıyor çünkü bölge dolu. + </notification> + <notification name="CantDupeCuzParcelNotFound"> + Nesneler çoÄŸaltılamadı - Ãœzerinde oldukları parsel bulunamadı. + </notification> + <notification name="CantCreateCuzParcelFull"> + Nesne oluÅŸturulamıyor çünkü +parsel dolu. + </notification> + <notification name="RezAttemptFailed"> + Bir nesneyi oluÅŸturma giriÅŸimi baÅŸarısız oldu. + </notification> + <notification name="ToxicInvRezAttemptFailed"> + Bu bölgede hatalara yol açmış olan öğe oluÅŸturulamıyor. + </notification> + <notification name="InvItemIsBlacklisted"> + Bu envanter öğesi kara listeye alınmış. + </notification> + <notification name="NoCanRezObjects"> + Åžu anda nesne oluÅŸturmanıza izin verilmiyor. + </notification> + <notification name="LandSearchBlocked"> + Arazi Arama Engellendi. +Çok fazla sayıda arazi aramasını çok hızlı gerçekleÅŸtirdiniz. +Lütfen bir dakika sonra tekrar deneyin. + </notification> + <notification name="NotEnoughResourcesToAttach"> + Nesneyi iliÅŸtirmek için yeterli komut dosyası kaynağı mevcut deÄŸil! + </notification> + <notification name="YouDiedAndGotTPHome"> + Hayatınızı kaybettiniz ve ana konumunuza ışınlandınız + </notification> + <notification name="EjectComingSoon"> + Daha fazla burada olma izniniz yok ve ayrılmak için [EJECT_TIME] saniyeniz var. + </notification> + <notification name="NoEnterServerFull"> + Bu bölgeye giremezsiniz çünkü +sunucu dolu. + </notification> + <notification name="SaveBackToInvDisabled"> + Envantere Geri Kaydet devre dışı bırakıldı. + </notification> + <notification name="NoExistNoSaveToContents"> + '[OBJ_NAME]' nesne içeriÄŸine kaydedilemedi, çünkü oluÅŸturulurken temel alınan nesne artık mevcut deÄŸil. + </notification> + <notification name="NoModNoSaveToContents"> + '[DEST_NAME]' nesnesini deÄŸiÅŸtirme izniniz olmadığı için '[OBJ_NAME]' nesne içeriÄŸine kaydedilemedi. + </notification> + <notification name="NoSaveBackToInvDisabled"> + '[OBJ_NAME]' envantere geri kaydedilemez -- bu iÅŸlem devre dışı bırakıldı. + </notification> + <notification name="NoCopyNoSelCopy"> + '[OBJ_NAME]' nesnesini kopyalama izniniz olmadığı için seçiminizi kopyalamayazsınız. + </notification> + <notification name="NoTransNoSelCopy"> + '[OBJ_NAME]' nesnesi aktarılamaz olduÄŸu için seçiminizi kopyalayamazsınız. + </notification> + <notification name="NoTransNoCopy"> + '[OBJ_NAME]' nesnesi aktarılamaz olduÄŸu için seçiminizi kopyalayamazsınız. + </notification> + <notification name="NoPermsNoRemoval"> + Benzeticiden '[OBJ_NAME]' nesnesinin kaldırılmasına izinler sistemi izin vermiyor. + </notification> + <notification name="NoModNoSaveSelection"> + '[OBJ_NAME]' nesnesini deÄŸiÅŸtirme izniniz olmadığı için seçiminizi kaydedemezsiniz. + </notification> + <notification name="NoCopyNoSaveSelection"> + '[OBJ_NAME]' nesnesi kopyalanamaz olduÄŸu için seçiminizi kaydedemezsiniz. + </notification> + <notification name="NoModNoTaking"> + '[OBJ_NAME]' nesnesini deÄŸiÅŸtirme izniniz olmadığı için seçiminizi alamazsınız. + </notification> + <notification name="RezDestInternalError"> + Dahili Hata: Bilinmeyen hedef türü. + </notification> + <notification name="DeleteFailObjNotFound"> + Nesne bulunamadığı için silme baÅŸarılamadı + </notification> + <notification name="SorryCantEjectUser"> + Ãœzgünüz, bu kullanıcı çıkartılamaz. + </notification> + <notification name="RegionSezNotAHome"> + Bu bölge, ana konumunuzu buraya kurmanıza izin vermiyor. + </notification> + <notification name="HomeLocationLimits"> + 'Ana Konum'unuzu sadece arazinizde veya anakarada bir Bilgi Ä°stasyonu'nda ayarlayabilirsiniz. + </notification> + <notification name="HomePositionSet"> + Ana konum ayarlandı. + </notification> + <notification name="AvatarEjected"> + Avatar çıkartıldı. + </notification> + <notification name="AvatarEjectFailed"> + Çıkarma baÅŸarılamadı çünkü bu parsel için yönetici iznine sahip deÄŸilsiniz. + </notification> + <notification name="CantMoveObjectParcelFull"> + [REGION_NAME] bölgesinde '[OBJECT_NAME]' nesnesi [OBJ_POSITION] konumuna hareket ettirilemiyor çünkü parsel dolu. + </notification> + <notification name="CantMoveObjectParcelPerms"> + [REGION_NAME] bölgesinde '[OBJECT_NAME]' nesnesi [OBJ_POSITION] konumuna hareket ettirilemiyor çünkü bu parselde nesnelerinize izin verilmiyor. + </notification> + <notification name="CantMoveObjectParcelResources"> + [REGION_NAME] bölgesinde '[OBJECT_NAME]' nesnesi [OBJ_POSITION] konumuna hareket ettirilemiyor, çünkü bu parselde bu nesne için yeterli kaynak yok. + </notification> + <notification name="CantMoveObjectRegionVersion"> + [REGION_NAME] bölgesinde '[OBJECT_NAME]' nesnesi [OBJ_POSITION] konumuna hareket ettirilemiyor çünkü bölgede çalıştırılan eski versiyon, bölge deÄŸiÅŸtirme üzerinden bu nesnenin alınmasını desteklemiyor. + </notification> + <notification name="CantMoveObjectNavMesh"> + [REGION_NAME] bölgesinde '[OBJECT_NAME]' nesnesi [OBJ_POSITION] konumuna hareket ettirilemiyor çünkü navmesh'i bölge sınırları ötesinde deÄŸiÅŸtiremezsiniz. + </notification> + <notification name="CantMoveObjectWTF"> + Bilinmeyen bir nedenden ötürü [REGION_NAME] bölgesinde '[OBJECT_NAME]' nesnesi [OBJ_POSITION] konumuna hareket ettirilemiyor. ([FAILURE_TYPE]) + </notification> + <notification name="NoPermModifyObject"> + Bu nesneyi deÄŸiÅŸtirme izniniz yok + </notification> + <notification name="CantEnablePhysObjContributesToNav"> + Navmesh'e katkıda bulunan bir nesne için fizik etkinleÅŸtirilemez. + </notification> + <notification name="CantEnablePhysKeyframedObj"> + Anahtar karelenmiÅŸ nesneler için fizik etkinleÅŸtirilemez. + </notification> + <notification name="CantEnablePhysNotEnoughLandResources"> + Nesne için fizik etkinleÅŸtirilemedi -- arazi kaynakları yetersiz. + </notification> + <notification name="CantEnablePhysCostTooGreat"> + Fizik kaynağı maliyeti [MAX_OBJECTS]'dan büyük nesne için fizik etkinleÅŸtirilemedi + </notification> + <notification name="PhantomWithConcavePiece"> + Bu nesne fantom olduÄŸu ve navmesh'e katkıda bulunduÄŸu için konkav bir parçaya sahip olamaz. + </notification> + <notification name="UnableAddItem"> + Öğe eklenemedi! + </notification> + <notification name="UnableEditItem"> + Bu düzenlenemiyor! + </notification> + <notification name="NoPermToEdit"> + Bunu düzenleme izni yok. + </notification> + <notification name="NoPermToCopyInventory"> + Bu envanteri kopyalama izni yok. + </notification> + <notification name="CantSaveItemDoesntExist"> + Nesne içeriklerine kaydedilemedi: Öğe artık mevcut deÄŸil. + </notification> + <notification name="CantSaveItemAlreadyExists"> + Nesne içeriklerine kaydedilemedi: Bu ada sahip öğe envanterde zaten mevcut + </notification> + <notification name="CantSaveModifyAttachment"> + Nesne içeriklerine kaydedilemedi: Bu, aksesuar izinlerini deÄŸiÅŸtirmeyi gerektirirdi. + </notification> + <notification name="TooManyScripts"> + Çok fazla komut dosyası. + </notification> + <notification name="UnableAddScript"> + Komut dosyası eklenemedi! + </notification> + <notification name="AssetServerTimeoutObjReturn"> + Varlık sunucusu zamanında yanıt vermedi. Nesne sime iade edildi. + </notification> + <notification name="RegionDisablePhysicsShapes"> + Bu bölgede fiziksel ÅŸekiller etkin deÄŸil. + </notification> + <notification name="NoModNavmeshAcrossRegions"> + Navmesh'i bölge sınırlarının ötesinde deÄŸiÅŸtiremezsiniz. + </notification> + <notification name="NoSetPhysicsPropertiesOnObjectType"> + Bu nesne türü üzerinde fizik özellikleri ayarlanamaz. + </notification> + <notification name="NoSetRootPrimWithNoShape"> + Kök prim ÅŸekilsiz olacak ÅŸekilde ayarlanamaz. + </notification> + <notification name="NoRegionSupportPhysMats"> + Bu bölgede fiziksel malzemeler etkin deÄŸil. + </notification> + <notification name="OnlyRootPrimPhysMats"> + Sadece kök primlerin fizik malzemeleri ayarlanabilir. + </notification> + <notification name="NoSupportCharacterPhysMats"> + Karakterler üzerinde fizik malzemelerin ayarlanması henüz desteklenmiyor. + </notification> + <notification name="InvalidPhysMatProperty"> + Belirtilen fizik malzemesi özelliklerinden biri veya daha fazlası geçersiz. + </notification> + <notification name="NoPermsAlterStitchingMeshObj"> + Bir örgü nesnesinin dikiÅŸ türünü deÄŸiÅŸtiremezsiniz. + </notification> + <notification name="NoPermsAlterShapeMeshObj"> + Bir örgü nesnesinin ÅŸeklini deÄŸiÅŸtiremezsiniz + </notification> + <notification name="FullRegionCantEnter"> + Bu bölgeye giremezsiniz çünkü \nbölge dolu. + </notification> + <notification name="LinkFailedOwnersDiffer"> + BaÄŸlantı baÅŸarısız oldu -- sahipler farklı + </notification> + <notification name="LinkFailedNoModNavmeshAcrossRegions"> + BaÄŸlntı baÅŸarılamadı -- navmesh'i bölge sınırlarının ötesinde deÄŸiÅŸtiremezsiniz. + </notification> + <notification name="LinkFailedNoPermToEdit"> + Düzenleme iznine sahip olmadığınız için baÄŸlantı baÅŸarılamadı. + </notification> + <notification name="LinkFailedTooManyPrims"> + BaÄŸlantı baÅŸarısız oldu -- çok fazla ilkel öğe var + </notification> + <notification name="LinkFailedCantLinkNoCopyNoTrans"> + BaÄŸlantı baÅŸarısız oldu -- aktarılamayanla kopyalanamayan arasında baÄŸlantı kurulamaz + </notification> + <notification name="LinkFailedNothingLinkable"> + BaÄŸlantı baÅŸarısız oldu -- baÄŸlantı verilebilecek bir ÅŸey yok. + </notification> + <notification name="LinkFailedTooManyPathfindingChars"> + BaÄŸlantı baÅŸarısız oldu -- çok fazla yol bulma karakteri var + </notification> + <notification name="LinkFailedInsufficientLand"> + BaÄŸlantı baÅŸarısız oldu -- arazi kaynakları yetersiz + </notification> + <notification name="LinkFailedTooMuchPhysics"> + Nesne çok fazla fizik kaynağı kullanıyor -- dinamikleri devre dışı bırakıldı. + </notification> + <notification name="TeleportedHomeByObjectOnParcel"> + '[PARCEL_NAME]' parseli üzerindeki '[OBJECT_NAME]' nesnesi tarafından ana konuma ışınlandınız + </notification> + <notification name="TeleportedHomeByObject"> + '[OBJECT_NAME]' nesnesi tarafından ana konuma ışınlandınız + </notification> + <notification name="TeleportedByAttachment"> + You have been teleported by an attachment on [ITEM_ID] + </notification> + <notification name="TeleportedByObjectOnParcel"> + '[PARCEL_NAME]' parseli üzerindeki '[OBJECT_NAME]' nesnesi tarafından ışınlandınız + </notification> + <notification name="TeleportedByObjectOwnedBy"> + Sahibi [OWNER_ID] olan '[OBJECT_NAME]' nesnesi tarafından ışınlandınız + </notification> + <notification name="TeleportedByObjectUnknownUser"> + Bilinmeyen bir sahibi olan '[OBJECT_NAME]' nesnesi tarafından ışınlandınız. + </notification> + <notification name="CantCreateObjectRegionFull"> + Talep edilen nesne oluÅŸturulamıyor. Bölge dolu. + </notification> + <notification name="CantAttackMultipleObjOneSpot"> + Tek bir noktaya birden fazla nesne iliÅŸtiremezsiniz. + </notification> + <notification name="CantCreateMultipleObjAtLoc"> + Burada birden fazla nesne oluÅŸturamazsınız. + </notification> + <notification name="UnableToCreateObjTimeOut"> + Talep edilen nesne oluÅŸturulamıyor. Nesne veri tabanında yok. + </notification> + <notification name="UnableToCreateObjUnknown"> + Talep edilen nesne oluÅŸturulamıyor. Talep zaman aşımına uÄŸradı. Lütfen tekrar deneyin. + </notification> + <notification name="UnableToCreateObjMissingFromDB"> + Talep edilen nesne oluÅŸturulamıyor. Lütfen tekrar deneyin. + </notification> + <notification name="RezFailureTookTooLong"> + OluÅŸturma baÅŸarısız oldu, talep edilen nesnenin yüklenmesi çok zaman aldı. + </notification> + <notification name="FailedToPlaceObjAtLoc"> + Belirtilen konuma nesne yerleÅŸtirilemedi. Lütfen tekrar deneyin. + </notification> + <notification name="CantCreatePlantsOnLand"> + Bu arazide bitkiler oluÅŸturamazsınız. + </notification> + <notification name="CantRestoreObjectNoWorldPos"> + Nesne geri yüklenemiyor. Dünya konumu bulunamadı. + </notification> + <notification name="CantRezObjectInvalidMeshData"> + Örgü verileri geçersiz olduÄŸu için nesne oluÅŸturulamadı. + </notification> + <notification name="CantRezObjectTooManyScripts"> + Bölgede zaten fazlasıyla komut dosyası olduÄŸu için nesne oluÅŸturulamadı. + </notification> + <notification name="CantCreateObjectNoAccess"> + EriÅŸim ayrıcalıklarınız orada nesne oluÅŸturmanıza izin vermiyor. + </notification> + <notification name="CantCreateObject"> + Åžu anda nesne oluÅŸturmanıza izin verilmiyor. + </notification> + <notification name="InvalidObjectParams"> + Geçersiz nesne parametreleri + </notification> + <notification name="CantDuplicateObjectNoAcess"> + EriÅŸim ayrıcalıklarınız burada nesne çoÄŸaltmanıza izin vermiyor. + </notification> + <notification name="CantChangeShape"> + Bu ÅŸekli deÄŸiÅŸtirmenize izin verilmiyor. + </notification> + <notification name="NoAccessToClaimObjects"> + EriÅŸim ayrıcalıklarınız burada nesneler üzerinde hak talebinde bulunmanıza izin vermiyor. + </notification> + <notification name="DeedFailedNoPermToDeedForGroup"> + Grubunuz adına nesne devretmek için gerekli izne sahip olmadığınız için devretme baÅŸarılamadı. + </notification> + <notification name="NoPrivsToBuyObject"> + EriÅŸim ayrıcalıklarınız burada nesneler satın almanıza izin vermiyor. + </notification> + <notification name="CantAttachObjectAvatarSittingOnIt"> + Ãœzerinde bir avatar oturduÄŸu için nesne iliÅŸtirilemiyor. + </notification> + <notification name="WhyAreYouTryingToWearShrubbery"> + AÄŸaçlar ve çimen aksesuar olarak giyilemez. + </notification> + <notification name="CantAttachGroupOwnedObjs"> + Sahibi grup olan nesneler iliÅŸtirilemiyor. + </notification> + <notification name="CantAttachObjectsNotOwned"> + Sahip olmadığınız nesneleri iliÅŸtiremezsiniz. + </notification> + <notification name="CantAttachNavmeshObjects"> + Navmesh'e katkıda bulunan nesneler iliÅŸtirilemez. + </notification> + <notification name="CantAttachObjectNoMovePermissions"> + Nesneyi hareket ettirme izniniz olmadığı için nesneyi iliÅŸtiremiyorsanız. + </notification> + <notification name="CantAttachNotEnoughScriptResources"> + Nesneyi iliÅŸtirmek için yeterli komut dosyası kaynağı mevcut deÄŸil! + </notification> + <notification name="CantDropItemTrialUser"> + Buraya nesne düşüremezsiniz; Ãœcretsiz Deneme alanını deneyin. + </notification> + <notification name="CantDropMeshAttachment"> + Örgü aksesuarlarını düşüremezsiniz. Envantere ayırın, sonra dünyada oluÅŸturun. + </notification> + <notification name="CantDropAttachmentNoPermission"> + Aksesuar düşürülemedi: Burada düşürme izniniz yok. + </notification> + <notification name="CantDropAttachmentInsufficientLandResources"> + Aksesuar düşürülemedi: Mevcut arazi kaynakları yetersiz. + </notification> + <notification name="CantDropAttachmentInsufficientResources"> + Aksesuarlar düşürülemedi: Mevcut kaynaklar yetersiz. + </notification> + <notification name="CantDropObjectFullParcel"> + Nesne buraya düşürülemez. Parsel dolu. + </notification> + <notification name="CantTouchObjectBannedFromParcel"> + Bu arazi parselinde yasaklandığınız için bu nesneye dokunamıyor/tutamıyorsunuz. + </notification> + <notification name="PlzNarrowDeleteParams"> + Lütfen silme parametrelerinizi daraltın. + </notification> + <notification name="UnableToUploadAsset"> + Varlık karşıya yüklenemiyor. + </notification> + <notification name="CantTeleportCouldNotFindUser"> + Ana konuma ışınlanacak kullanıcı bulunamadı + </notification> + <notification name="GodlikeRequestFailed"> + tanrısal talep baÅŸarısız oldu + </notification> + <notification name="GenericRequestFailed"> + genel talep baÅŸarısız oldu + </notification> + <notification name="CantUploadPostcard"> + Posta kartı karşıya yüklenemiyor. Daha sonra tekrar deneyin. + </notification> + <notification name="CantFetchInventoryForGroupNotice"> + Grup bildirimi için envanter ayrıntıları alınamadı. + </notification> + <notification name="CantSendGroupNoticeNotPermitted"> + Grup bildirimi gönderilemedi -- izin verilmiyor. + </notification> + <notification name="CantSendGroupNoticeCantConstructInventory"> + Grup bildirimi gönderilemedi -- envanter oluÅŸturulamadı. + </notification> + <notification name="CantParceInventoryInNotice"> + Bildirimde envanter ayrıştırılamadı. + </notification> + <notification name="TerrainUploadFailed"> + Yüzeyin karşıya yüklemesi baÅŸarılamadı. + </notification> + <notification name="TerrainFileWritten"> + Yüzey dosyası yazıldı. + </notification> + <notification name="TerrainFileWrittenStartingDownload"> + Yüzey dosyası yazıldı, karşıdan yükleme baÅŸlatılıyor... + </notification> + <notification name="TerrainBaked"> + Yüzey kaydedildi. + </notification> + <notification name="TenObjectsDisabledPlzRefresh"> + Sadece seçilen ilk 10 nesne devre dışı bırakıldı. Gerekiyorsa yenileyin ve ilave seçimler yapın. + </notification> + <notification name="UpdateViewerBuyParcel"> + Bu parseli satın almak için görüntüleyicinizi güncelleÅŸtirmelisiniz. + </notification> + <notification name="CantBuyParcelNotForSale"> + Satın alınamıyor, bu parsel satılık deÄŸil. + </notification> + <notification name="CantBuySalePriceOrLandAreaChanged"> + Satın alınamıyor, satış fiyatı veya arazi bölgesi deÄŸiÅŸmiÅŸ. + </notification> + <notification name="CantBuyParcelNotAuthorized"> + Bu parsel için yetkili alıcı deÄŸilsiniz. + </notification> + <notification name="CantBuyParcelAwaitingPurchaseAuth"> + Bu parseli satın alamazsınız çünkü zaten satın alım yetkilendirmesi bekliyor + </notification> + <notification name="CantBuildOverflowParcel"> + Burada nesneler inÅŸa edemezsiniz, aksi halde parselin kaynak sınırları aşılır. + </notification> + <notification name="SelectedMultipleOwnedLand"> + Farklı sahiplere ait araziler seçtiniz. Lütfen daha küçük bir alan seçin ve tekrar deneyin. + </notification> + <notification name="CantJoinTooFewLeasedParcels"> + Seçimde birleÅŸtirilecek yeterli sayıda lease edilmiÅŸ parsel yok. + </notification> + <notification name="CantDivideLandMultipleParcelsSelected"> + Arazi bölünemedi.\nBirden fazla parsel seçili durumda.\nDaha küçük bir arazi parçası seçmeyi deneyin. + </notification> + <notification name="CantDivideLandCantFindParcel"> + Arazi bölünemiyor.\nParsel bulunamıyor.\nLütfen Yardım -> Hata Bildir ile bildirin... + </notification> + <notification name="CantDivideLandWholeParcelSelected"> + Arazi bölünemiyor. Tüm parsel seçilidir.\nDaha küçük bir arazi parçası seçmeyi deneyin. + </notification> + <notification name="LandHasBeenDivided"> + Arazi bölündü. + </notification> + <notification name="PassPurchased"> + Bir geçiÅŸ hakkı satın aldınız. + </notification> + <notification name="RegionDisallowsClassifieds"> + Bölgede seri ilanlara izin verilmiyor. + </notification> + <notification name="LandPassExpireSoon"> + Bu arazi için geçiÅŸ hakkınız sona ermek üzere. + </notification> + <notification name="CantSitNoSuitableSurface"> + Ãœzerinde oturulabilecek uygun bir yüzey yok, baÅŸka bir noktayı deneyin. + </notification> + <notification name="CantSitNoRoom"> + Burada oturacak yer yok, baÅŸka bir yer deneyin. + </notification> + <notification name="ClaimObjectFailedNoPermission"> + Ä°zniniz olmadığı için nesne üzerinde hak talep etme baÅŸarılamadı + </notification> + <notification name="ClaimObjectFailedNoMoney"> + Sahip olduÄŸunuz L$ yeterli olmadığı için nesne üzerinde hak talep etme baÅŸarılamadı. + </notification> + <notification name="CantDeedGroupLand"> + Grubun sahip olduÄŸu araziyi devredemezsiniz. + </notification> + <notification name="BuyObjectFailedNoMoney"> + Sahip olduÄŸunuz L$ yeterli olmadığı için nesne satın alma baÅŸarılamadı. + </notification> + <notification name="BuyInventoryFailedNoMoney"> + Sahip olduÄŸunuz L$ yeterli olmadığı için envanter satın alma baÅŸarılamadı. + </notification> + <notification name="BuyPassFailedNoMoney"> + Sahibi olduÄŸunuz L$ bu araziye geçiÅŸ hakkı almanıza yeterli deÄŸil. + </notification> + <notification name="CantBuyPassTryAgain"> + Åžu anda geçiÅŸ hakkı satın alınamıyor. Daha sonra tekrar deneyin. + </notification> + <notification name="CantCreateObjectParcelFull"> + Nesne oluÅŸturulamıyor çünkü \nparsel dolu. + </notification> + <notification name="FailedPlacingObject"> + Belirtilen konuma nesne yerleÅŸtirilemedi. Lütfen tekrar deneyin. + </notification> + <notification name="CantCreateLandmarkForEvent"> + Etkinlik için yer imi oluÅŸturulamıyor. + </notification> + <notification name="GodBeatsFreeze"> + Tanrısal güçleriniz dondurmayı devre dışı bıraktı! + </notification> + <notification name="SpecialPowersRequestFailedLogged"> + Özel yetkiler talebi baÅŸarısız oldu. Bu talep günlüğe kaydedildi. + </notification> + <notification name="ExpireExplanation"> + Sistem ÅŸu anda talebinizi iÅŸleyemiyor. Talep zaman aşımına uÄŸradı. + </notification> + <notification name="DieExplanation"> + Sistem talebinizi iÅŸleyemiyor. + </notification> + <notification name="AddPrimitiveFailure"> + Ä°lkel öğeyi oluÅŸturmak için yeterli fon yok. + </notification> + <notification name="RezObjectFailure"> + Nesneyi oluÅŸturmak için yeterli fon yok. + </notification> + <notification name="ResetHomePositionNotLegal"> + Ana konum sıfırlandı çünkü Ana konum yasal deÄŸildi. + </notification> + <notification name="CantInviteRegionFull"> + Åžu anda konumunuza kimseyi davet edemezsiniz çünkü bölge dolu. Daha sonra tekrar deneyin. + </notification> + <notification name="CantSetHomeAtRegion"> + Bu bölge, ana konumunuzu buraya kurmanıza izin vermiyor. + </notification> + <notification name="ListValidHomeLocations"> + 'Ana Konum'unuzu sadece arazinizde veya anakarada bir Bilgi Ä°stasyonu'nda ayarlayabilirsiniz. + </notification> + <notification name="SetHomePosition"> + Ana konum ayarlandı. + </notification> + <notification name="CantDerezInventoryError"> + Envanter hatasından ötürü nesne oluÅŸturulması geri alınamıyor. + </notification> + <notification name="CantCreateRequestedInv"> + Talep edilen envanter oluÅŸturulamadı. + </notification> + <notification name="CantCreateRequestedInvFolder"> + Talep edilen envanter klasörü oluÅŸturulamadı. + </notification> + <notification name="CantCreateInventory"> + Bu envanter oluÅŸturulamadı. + </notification> + <notification name="CantCreateLandmark"> + Yer imi oluÅŸturulamıyor. + </notification> + <notification name="CantCreateOutfit"> + Dış görünüm ÅŸu anda oluÅŸturulamıyor. Bir dakika sonra tekrar deneyin. + </notification> + <notification name="InventoryNotForSale"> + Envanter satılık deÄŸil. + </notification> + <notification name="CantFindInvItem"> + Envanter öğesi bulunamıyor. + </notification> + <notification name="CantFindObject"> + Nesne bulunamıyor. + </notification> + <notification name="CantTransfterMoneyRegionDisabled"> + Nesnelere para transferleri bölgede ÅŸu anda devre dışı bırakılmış durumda. + </notification> + <notification name="CantPayNoAgent"> + Kime ödeme yapılacağı belirlenemedi. + </notification> + <notification name="CantDonateToPublicObjects"> + Kamusal nesnelere L$ veremezsiniz. + </notification> + <notification name="InventoryCreationInWorldObjectFailed"> + Dünya içerisindeki nesnede envater oluÅŸturma baÅŸarısız oldu. + </notification> + <notification name="UserBalanceOrLandUsageError"> + Dahili bir hata nedeniyle görüntüleyicinizi gerektiÄŸi gibi güncelleyemedik. Görüntüleyicinizde gösterilen L$ bakiyesi veya parsel tutarı sunucular üzerinde gerçekteki bakiyenizi yansıtmayabilir. + </notification> + <notification name="LargePrimAgentIntersect"> + BaÅŸka oyuncularla kesiÅŸen büyük primler oluÅŸturulamaz. Öbür oyuncular hareket ettiÄŸinde lütfen tekrar deneyin. + </notification> + <notification name="PreferenceChatClearLog"> + Bu, geçmiÅŸ sohbetlerin günlüklerini ve bu dosyanın tüm yedeklerini silecektir. + <usetemplate ignoretext="Ben geçmiÅŸ sohbetlerin günlüğünü silmeden önce doÄŸrula." name="okcancelignore" notext="Ä°ptal" yestext="Tamam"/> + </notification> + <notification name="PreferenceChatDeleteTranscripts"> + Bu, tüm geçmiÅŸ sohbetlerin dökümlerini silecektir. GeçmiÅŸ sohbetlerin listesi bundan etkilenmez. [FOLDER] klasöründe .txt ve txt.backup uzantısına sahip tüm dosyalar silinecektir. + <usetemplate ignoretext="Ben dökümleri silmeden önce doÄŸrulama iste." name="okcancelignore" notext="Ä°ptal" yestext="Tamam"/> + </notification> + <notification name="PreferenceChatPathChanged"> + Dosyalar taşınamıyor. Önceki yol geri yüklendi. + <usetemplate ignoretext="Dosyalar taşınamıyor. Önceki yol geri yüklendi." name="okignore" yestext="Tamam"/> + </notification> </notifications> diff --git a/indra/newview/skins/default/xui/tr/panel_avatar_list_item.xml b/indra/newview/skins/default/xui/tr/panel_avatar_list_item.xml index 7542778aca..f330bd85e8 100644 --- a/indra/newview/skins/default/xui/tr/panel_avatar_list_item.xml +++ b/indra/newview/skins/default/xui/tr/panel_avatar_list_item.xml @@ -27,5 +27,6 @@ <icon name="permission_edit_mine_icon" tool_tip="Bu arkadaşınız nesnelerinizi düzenleyebilir, silebilir veya alabilir"/> <icon name="permission_map_icon" tool_tip="Bu arkadaşınız haritada sizi bulabilir"/> <icon name="permission_online_icon" tool_tip="Bu arkadaşınız çevrimiçi olduÄŸunuzda sizi görebilir"/> + <button name="info_btn" tool_tip="Ek bilgi"/> <button name="profile_btn" tool_tip="Profili göster"/> </panel> diff --git a/indra/newview/skins/default/xui/tr/panel_block_list_sidetray.xml b/indra/newview/skins/default/xui/tr/panel_block_list_sidetray.xml index 0464b7ec07..87b67e249e 100644 --- a/indra/newview/skins/default/xui/tr/panel_block_list_sidetray.xml +++ b/indra/newview/skins/default/xui/tr/panel_block_list_sidetray.xml @@ -1,10 +1,11 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="block_list_panel"> - <text name="title_text"> - Listeyi Engelle - </text> - <scroll_list name="blocked" tool_tip="Åžu anda engellenmiÅŸ olan Sakinler listesi"/> - <button label="KiÅŸiyi engelle" name="Block resident..." tool_tip="Engellenecek bir Sakin seç"/> - <button label="Nesneyi ada göre engelle" name="Block object by name..." tool_tip="Ada göre engellenecek bir nesne seç"/> - <button label="Engellemeyi Kaldır" name="Unblock" tool_tip="Engelleme listesinden Sakini veya nesneyi kaldır"/> + <panel label="bottom_panel" name="blocked_buttons_panel"> + <filter_editor label="Filtrele" name="blocked_filter_input"/> + <menu_button name="blocked_gear_btn" tool_tip="Seçilen kiÅŸi veya nesne üzerindeki eylemler"/> + <menu_button name="view_btn" tool_tip="Sıralama seçenekleri"/> + <menu_button name="plus_btn" tool_tip="Engellenecek bir Sakin veya nesne seç"/> + <button name="unblock_btn" tool_tip="Engelleme listesinden Sakini veya nesneyi kaldır"/> + </panel> + <block_list name="blocked" tool_tip="Åžu anda engellenmiÅŸ olan Sakinler listesi"/> </panel> diff --git a/indra/newview/skins/default/xui/tr/panel_conversation_list_item.xml b/indra/newview/skins/default/xui/tr/panel_conversation_list_item.xml new file mode 100644 index 0000000000..c7227f02b6 --- /dev/null +++ b/indra/newview/skins/default/xui/tr/panel_conversation_list_item.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="conversation_list_item"> + <layout_stack name="conversation_item_stack"> + <layout_panel name="conversation_title_panel"> + <text name="conversation_title" value="(yükleniyor)"/> + </layout_panel> + </layout_stack> +</panel> diff --git a/indra/newview/skins/default/xui/tr/panel_conversation_log_list_item.xml b/indra/newview/skins/default/xui/tr/panel_conversation_log_list_item.xml new file mode 100644 index 0000000000..79895f9c21 --- /dev/null +++ b/indra/newview/skins/default/xui/tr/panel_conversation_log_list_item.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="conversation_log_list_item"> + <icon name="voice_session_icon" tool_tip="Sohbet ses dahil edildi"/> + <icon name="unread_ims_icon" tool_tip="Oturumunuz kapalıyken mesajlar geldi"/> + <button name="delete_btn" tool_tip="Bu giriÅŸi kaldır"/> +</panel> diff --git a/indra/newview/skins/default/xui/tr/panel_group_list_item.xml b/indra/newview/skins/default/xui/tr/panel_group_list_item.xml index 2bc597f2fa..f44d2b5e76 100644 --- a/indra/newview/skins/default/xui/tr/panel_group_list_item.xml +++ b/indra/newview/skins/default/xui/tr/panel_group_list_item.xml @@ -1,5 +1,6 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="group_list_item"> <text name="group_name" value="Bilinmiyor"/> + <button name="info_btn" tool_tip="Ek bilgi"/> <button name="profile_btn" tool_tip="Profili göster"/> </panel> diff --git a/indra/newview/skins/default/xui/tr/panel_people.xml b/indra/newview/skins/default/xui/tr/panel_people.xml index 1a1e53bac2..08efd0aa61 100644 --- a/indra/newview/skins/default/xui/tr/panel_people.xml +++ b/indra/newview/skins/default/xui/tr/panel_people.xml @@ -14,81 +14,53 @@ Birlikte takılacak kiÅŸiler mi arıyorsunuz? [secondlife:///app/worldmap Dünya <string name="no_filtered_friends_msg"> Aradığınızı bulamadınız mı? [secondlife:///app/search/people/[SEARCH_TERM] Ara] deneyin. </string> - <string name="people_filter_label" value="KiÅŸileri Filtrele"/> - <string name="groups_filter_label" value="Grupları Filtrele"/> <string name="no_filtered_groups_msg" value="Aradığınızı bulamadınız mı? [secondlife:///app/search/groups/[SEARCH_TERM] Ara] deneyin."/> <string name="no_groups_msg" value="Katılacak Gruplar mı arıyorsunuz? [secondlife:///app/search/groups Ara] deneyin."/> <string name="MiniMapToolTipMsg" value="[REGION](Haritayı açmak için çift tıkla, yatay hareket için shift çek)"/> <string name="AltMiniMapToolTipMsg" value="[REGION](Işınlamak için çift tıkla, yatay hareket için shift çek)"/> - <filter_editor label="Filtrele" name="filter_input"/> <tab_container name="tabs"> <panel label="YAKIN" name="nearby_panel"> - <panel label="bottom_panel" name="bottom_panel"> - <menu_button name="nearby_view_sort_btn" tool_tip="Seçenklr."/> - <button name="add_friend_btn" tool_tip="Seçilen Sakini arkadaÅŸ listene ekle"/> + <panel label="bottom_panel" name="nearby_buttons_panel"> + <filter_editor label="KiÅŸileri Filtrele" name="nearby_filter_input"/> + <button name="gear_btn" tool_tip="Seçilen kiÅŸi üzerindeki eylemler"/> + <menu_button name="nearby_view_btn" tool_tip="Gösterme/sıralama seçenekleri"/> + <button name="add_friend_btn" tool_tip="Bir sakine arkadaÅŸlık öner"/> + <dnd_button name="nearby_del_btn" tool_tip="Seçilen kiÅŸiyi arkadaÅŸ olarak kaldır"/> </panel> </panel> - <panel label="ARKADAÅžLARIM" name="friends_panel"> + <panel label="ARKADAÅžLAR" name="friends_panel"> + <panel label="bottom_panel" name="friends_buttons_panel"> + <filter_editor label="KiÅŸileri Filtrele" name="friends_filter_input"/> + <button name="gear_btn" tool_tip="Seçilen kiÅŸi üzerindeki eylemler"/> + <menu_button name="friends_view_btn" tool_tip="Seçenekleri göster/sırala"/> + <button name="friends_add_btn" tool_tip="Bir sakine arkadaÅŸlık öner"/> + <dnd_button name="friends_del_btn" tool_tip="Seçilen kiÅŸiyi arkadaÅŸ olarak kaldır"/> + </panel> <accordion name="friends_accordion"> <accordion_tab name="tab_online" title="Çevrimiçi"/> <accordion_tab name="tab_all" title="Tümü"/> </accordion> - <panel label="bottom_panel" name="bottom_panel"> - <layout_stack name="bottom_panel"> - <layout_panel name="options_gear_btn_panel"> - <menu_button name="friends_viewsort_btn" tool_tip="Ä°lave seçenekleri göster"/> - </layout_panel> - <layout_panel name="add_btn_panel"> - <button name="add_btn" tool_tip="Bir Sakine arkadaÅŸlık öner"/> - </layout_panel> - <layout_panel name="trash_btn_panel"> - <dnd_button name="del_btn" tool_tip="Seçilen kiÅŸiyi arkadaÅŸ Listenden çıkar"/> - </layout_panel> - </layout_stack> - </panel> </panel> - <panel label="GRUPLARIM" name="groups_panel"> - <panel label="bottom_panel" name="bottom_panel"> - <menu_button name="groups_viewsort_btn" tool_tip="Seçenklr."/> - <button name="plus_btn" tool_tip="Gruba katıl/yeni grup oluÅŸtur"/> - <button name="activate_btn" tool_tip="Seçilen grubu etkinleÅŸtir"/> + <panel label="GRUPLAR" name="groups_panel"> + <panel label="bottom_panel" name="groups_buttons_panel"> + <filter_editor label="Grupları Filtrele" name="groups_filter_input"/> + <menu_button name="groups_gear_btn" tool_tip="Seçilen grup üzerindeki eylemler"/> + <menu_button name="groups_view_btn" tool_tip="Seçenekleri göster/sırala"/> + <menu_button name="plus_btn" tool_tip="Gruba katıl/yeni grup oluÅŸtur"/> + <dnd_button name="minus_btn" tool_tip="Seçilen gruptan ayrıl"/> </panel> </panel> <panel label="SON" name="recent_panel"> - <panel label="bottom_panel" name="bottom_panel"> - <menu_button name="recent_viewsort_btn" tool_tip="Seçenklr."/> - <button name="add_friend_btn" tool_tip="Seçilen Sakini arkadaÅŸ listene ekle"/> + <panel label="bottom_panel" name="recent_buttons_panel"> + <filter_editor label="KiÅŸileri Filtrele" name="recent_filter_input"/> + <button name="gear_btn" tool_tip="Seçilen kiÅŸi üzerindeki eylemler"/> + <menu_button name="recent_view_btn" tool_tip="Seçenekleri göster/sırala"/> + <button name="add_friend_btn" tool_tip="Bir sakine arkadaÅŸlık öner"/> + <dnd_button name="recent_del_btn" tool_tip="Seçilen kiÅŸiyi arkadaÅŸ olarak kaldır"/> </panel> </panel> + <panel label="ENGELLENMÄ°Åž" name="blocked_panel"> + <panel label="EngellenmiÅŸ Sakinler ve Nesneler" name="panel_block_list_sidetray"/> + </panel> </tab_container> - <panel name="button_bar"> - <layout_stack name="bottom_bar_ls"> - <layout_panel name="view_profile_btn_lp"> - <button label="Profil" name="view_profile_btn" tool_tip="Resim, grup ve diÄŸer Sakin bilgilerini göster"/> - </layout_panel> - <layout_panel name="im_btn_lp"> - <button label="AÄ°" name="im_btn" tool_tip="Anlık ileti oturumu aç"/> - </layout_panel> - <layout_panel name="call_btn_lp"> - <button label="Ara" name="call_btn" tool_tip="Bu Sakini ara"/> - </layout_panel> - <layout_panel name="share_btn_lp"> - <button label="PaylaÅŸ" name="share_btn" tool_tip="Bir envanter öğesini paylaÅŸ"/> - </layout_panel> - <layout_panel name="teleport_btn_lp"> - <button label="Işınla" name="teleport_btn" tool_tip="Işınlama teklif et"/> - </layout_panel> - </layout_stack> - <layout_stack name="bottom_bar_ls1"> - <layout_panel name="group_info_btn_lp"> - <button label="Grup Profili" name="group_info_btn" tool_tip="Grup bilgilerini göster"/> - </layout_panel> - <layout_panel name="chat_btn_lp"> - <button label="Grup Sohbeti" name="chat_btn" tool_tip="Sohbet oturumu aç"/> - </layout_panel> - <layout_panel name="group_call_btn_lp"> - <button label="Grup Araması" name="group_call_btn" tool_tip="Bu grubu ara"/> - </layout_panel> - </layout_stack> - </panel> </panel> diff --git a/indra/newview/skins/default/xui/tr/panel_preferences_chat.xml b/indra/newview/skins/default/xui/tr/panel_preferences_chat.xml index 231e8fc5fe..aaeebdfe6e 100644 --- a/indra/newview/skins/default/xui/tr/panel_preferences_chat.xml +++ b/indra/newview/skins/default/xui/tr/panel_preferences_chat.xml @@ -1,34 +1,86 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel label="Metin Sohbeti" name="chat"> - <text name="font_size"> - Font büyüklüğü: - </text> - <radio_group name="chat_font_size"> - <radio_item label="Küçük" name="radio" value="0"/> - <radio_item label="Orta" name="radio2" value="1"/> - <radio_item label="Büyük" name="radio3" value="2"/> - </radio_group> - <check_box initial_value="true" label="Sohbet sırasında yazma animasyonunu oynat" name="play_typing_animation"/> - <check_box label="Çevrimdışı olduÄŸunda AÄ°'ler e-posta ile bana gönderilsin" name="send_im_to_email"/> - <check_box label="Düz metin AÄ°'ler ve sohbet geçmiÅŸini etkinleÅŸtir" name="plain_text_chat_history"/> - <check_box label="Balon Sohbeti" name="bubble_text_chat"/> - <text name="show_ims_in_label"> - AÄ°'leri ÅŸurada göster: - </text> - <text name="requires_restart_label"> - (tekrar baÅŸlatma gerekir) - </text> - <radio_group name="chat_window" tool_tip="Anlık Ä°letileri ayrı gezdiricilerde veya çoklu sekmelere sahip tek bir gezdiricide gösterin (tekrar baÅŸlatma gerekir)"> - <radio_item label="Ayrı Pencereler" name="radio" value="0"/> - <radio_item label="Sekmeler" name="radio2" value="1"/> - </radio_group> - <text name="disable_toast_label"> - Gelen sohbet için açılır pencereleri etkinleÅŸtir: - </text> - <check_box label="Grup Sohbetleri" name="EnableGroupChatPopups" tool_tip="Bir Grup Sohbet iletisi gönderildiÄŸinde açılır pencereleri görmek için iÅŸaretle"/> - <check_box label="AÄ° Sohbetleri" name="EnableIMChatPopups" tool_tip="Bir anlık ileti geldiÄŸinde açılır pencereleri görmek için iÅŸaretle"/> - <spinner label="Yakındaki sohbet iletilerinin vurgulanma süresi:" name="nearby_toasts_lifetime"/> - <spinner label="Yakındaki sohbet iletilerinin sönme süresi:" name="nearby_toasts_fadingtime"/> + <panel> + <check_box initial_value="true" label="Sohbet sırasında yazma animasyonunu oynat" name="play_typing_animation"/> + <check_box label="Çevrimdışı olduÄŸunda AÄ°'ler e-posta ile bana gönderilsin" name="send_im_to_email"/> + <check_box label="Sadece arkadaÅŸlar ve gruplar beni arasın veya AÄ° göndersin" name="voice_call_friends_only_check"/> + <text name="font_size"> + Font büyüklüğü: + </text> + <combo_box name="chat_font_size"> + <item label="Küçük" name="Small" value="0"/> + <item label="Orta" name="Medium" value="1"/> + <item label="Büyük" name="Large" value="2"/> + </combo_box> + <check_box label="Balon Sohbeti" name="bubble_text_chat"/> + </panel> + <panel> + <text name="notifications"> + Bildirimler + </text> + <text name="friend_ims"> + ArkadaÅŸ AÄ°'leri: + </text> + <combo_box name="FriendIMOptions"> + <item label="Sohbetler penceresini aç" name="OpenConversationsWindow" value="openconversations"/> + <item label="Mesajı aç" name="PopUpMessage" value="toast"/> + <item label="Araç çubuÄŸu düğmesi yanıp sönsün" name="FlashToolbarButton" value="flash"/> + <item label="Hiçbiri" name="None" value="none"/> + </combo_box> + <text name="non_friend_ims"> + ArkadaÅŸ harici AÄ°'ler: + </text> + <combo_box name="NonFriendIMOptions"> + <item label="Sohbetler penceresini aç" name="OpenConversationsWindow" value="openconversations"/> + <item label="Mesajı açılır pencerede göster" name="PopUpMessage" value="toast"/> + <item label="Araç çubuÄŸu düğmesi yanıp sönsün" name="FlashToolbarButton" value="flash"/> + <item label="Hiçbiri" name="None" value="none"/> + </combo_box> + <text name="conference_ims"> + Konferans AÄ°'leri: + </text> + <combo_box name="ConferenceIMOptions"> + <item label="Sohbetler penceresini aç" name="OpenConversationsWindow" value="openconversations"/> + <item label="Mesajı aç" name="PopUpMessage" value="toast"/> + <item label="Araç çubuÄŸu düğmesi yanıp sönsün" name="FlashToolbarButton" value="flash"/> + <item label="Hiçbiri" name="None" value="none"/> + </combo_box> + <text name="group_chat"> + Grup sohbeti: + </text> + <combo_box name="GroupChatOptions"> + <item label="Sohbetler penceresini aç" name="OpenConversationsWindow" value="openconversations"/> + <item label="Mesajı aç" name="PopUpMessage" value="toast"/> + <item label="Araç çubuÄŸu düğmesi yanıp sönsün" name="FlashToolbarButton" value="flash"/> + <item label="Hiçbiri" name="None" value="none"/> + </combo_box> + <text name="nearby_chat"> + Yakındaki sohbet: + </text> + <combo_box name="NearbyChatOptions"> + <item label="Sohbetler penceresini aç" name="OpenConversationsWindow" value="openconversations"/> + <item label="Mesajı aç" name="PopUpMessage" value="toast"/> + <item label="Araç çubuÄŸu düğmesi yanıp sönsün" name="FlashToolBarButton" value="flash"/> + <item label="Hiçbiri" name="None" value="none"/> + </combo_box> + <text name="notifications_alert"> + Tüm bildirimleri geçici olarak durdurmak için Ä°letiÅŸim Kur > Rahatsız Etme seçeneÄŸini kullanın. + </text> + </panel> + <panel> + <text name="play_sound"> + Sesi çal: + </text> + <check_box label="Yeni sohbet" name="new_conversation"/> + <check_box label="Gelen sesli arama" name="incoming_voice_call"/> + <check_box label="Işınlama teklifi" name="teleport_offer"/> + <check_box label="Envanter teklifi" name="inventory_offer"/> + </panel> + <panel> + <button label="Günlüğü temizle..." name="clear_log"/> + <button label="Dökümleri sil..." name="delete_transcripts"/> + <button label="Gözat..." label_selected="Gözat" name="log_path_button"/> + </panel> <button label="Çeviri..." name="ok_btn"/> <button label="Otomatik Yerine Koy..." name="autoreplace_showgui"/> <button label="Yazım Denetimi Yapılıyor..." name="spellcheck_showgui"/> diff --git a/indra/newview/skins/default/xui/tr/panel_preferences_general.xml b/indra/newview/skins/default/xui/tr/panel_preferences_general.xml index 4a48b1588c..1a13cf8f71 100644 --- a/indra/newview/skins/default/xui/tr/panel_preferences_general.xml +++ b/indra/newview/skins/default/xui/tr/panel_preferences_general.xml @@ -68,9 +68,9 @@ <combo_box.item label="asla" name="item4"/> </combo_box> <text name="text_box3"> - MeÅŸgul durumu cevabı: + Rahatsız Etme yanıtı: </text> - <text_editor name="busy_response"> + <text_editor name="do_not_disturb_response"> log_in_to_change </text_editor> </panel> diff --git a/indra/newview/skins/default/xui/tr/sidepanel_task_info.xml b/indra/newview/skins/default/xui/tr/sidepanel_task_info.xml index b0b9ab7716..9a4cf54fa7 100644 --- a/indra/newview/skins/default/xui/tr/sidepanel_task_info.xml +++ b/indra/newview/skins/default/xui/tr/sidepanel_task_info.xml @@ -72,6 +72,7 @@ <combo_box.item label="Nesneyi satın al" name="Buyobject"/> <combo_box.item label="Nesneye ödeme yap" name="Payobject"/> <combo_box.item label="Aç" name="Open"/> + <combo_box.item label="YakınlaÅŸtır" name="Zoom"/> </combo_box> <panel name="perms_inv"> <text name="perm_modify"> diff --git a/indra/newview/skins/default/xui/tr/strings.xml b/indra/newview/skins/default/xui/tr/strings.xml index 1be8f5974c..155dc8749a 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/index.php?lang=tr-TR&sourceid=[sourceid] + http://join.secondlife.com/?sourceid=[sourceid] </string> <string name="LoginFailedViewerNotPermitted"> Kullandığınız görüntüleyici ile artık Second Life'a eriÅŸemezsiniz. Yeni bir görüntüleyiciyi karşıdan yüklemek için lütfen ÅŸu sayfayı ziyaret edin: @@ -619,8 +619,8 @@ Lütfen bir dakika içerisinde tekrar oturum açmayı deneyin. <string name="AvatarAway"> Uzakta </string> - <string name="AvatarBusy"> - MeÅŸgul + <string name="AvatarDoNotDisturb"> + Rahatsız Etme </string> <string name="AvatarMuted"> EngellenmiÅŸ @@ -856,6 +856,12 @@ Lütfen bir dakika içerisinde tekrar oturum açmayı deneyin. <string name="ST_NO_JOINT"> KÖK veya EKLEM bulunamıyor. </string> + <string name="NearbyChatTitle"> + Yakındaki sohbet + </string> + <string name="NearbyChatLabel"> + (Yakındaki sohbet) + </string> <string name="whisper"> fısıldar: </string> @@ -919,12 +925,15 @@ 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> + <string name="AgentNameSubst"> + (Siz) + </string> + <string name="TeleportYourAgent"> + Sizi ışınlama + </string> <string name="SIM_ACCESS_PG"> Genel </string> @@ -1006,18 +1015,6 @@ Lütfen bir dakika içerisinde tekrar oturum açmayı deneyin. <string name="dictionary_files"> Sözlükler </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> @@ -1986,8 +1983,8 @@ Lütfen bir dakika içerisinde tekrar oturum açmayı deneyin. <string name="PanelContentsNewScript"> Yeni Komut Dosyası </string> - <string name="BusyModeResponseDefault"> - Ä°leti gönderdiÄŸiniz Sakin 'meÅŸgul modu'nda, bu da rahatsız edilmek istemediÄŸi anlamına geliyor. Ä°letiniz daha sonra incelenmesi için kendisine ait AÄ° panelinde gösterilecektir. + <string name="DoNotDisturbModeResponseDefault"> + Bu sakin "Rahatsız Etme" seçeneÄŸini devreye almış, mesajınızı sonra görecek. </string> <string name="MuteByName"> (Adına göre) @@ -2100,9 +2097,6 @@ Lütfen bir dakika içerisinde tekrar oturum açmayı deneyin. <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> @@ -3874,7 +3868,7 @@ Bu iletiyi almaya devam ederseniz, lütfen [SUPPORT_SITE] bölümüne baÅŸvurun. Genel Bölge </string> <string name="LocationCtrlSeeAVsTooltip"> - Bu parselin dışında avatarlar görünür durumda ve sohbete izin veriliyor + Bu parselin içindeki avatarlar, bu parselin dışındaki avatarlar tarafından görülemez veya iÅŸitilemez </string> <string name="LocationCtrlPathfindingDirtyTooltip"> Bölge yeniden kaydedilinceye kadar hareket eden nesneler bu bölgede doÄŸru davranmayabilir. @@ -3951,6 +3945,12 @@ Bu iletiyi almaya devam ederseniz, lütfen [SUPPORT_SITE] bölümüne baÅŸvurun. <string name="IM_unblock_only_groups_friends"> Bu mesajı görmek için Tercihler/Gizlilik'de 'Sadece arkadaÅŸlar ve gruplar beni arasın veya AÄ° göndersin' seçeneÄŸinin iÅŸaretini kaldırmalısınız. </string> + <string name="OnlineStatus"> + Çevrimiçi + </string> + <string name="OfflineStatus"> + Çevrimdışı + </string> <string name="answered_call"> Aramanız yanıtlandı </string> @@ -3960,6 +3960,9 @@ Bu iletiyi almaya devam ederseniz, lütfen [SUPPORT_SITE] bölümüne baÅŸvurun. <string name="you_joined_call"> Sesli aramaya katıldınız </string> + <string name="you_auto_rejected_call-im"> + "Rahatsız Etme" seçeneÄŸini devredeyken sesli aramayı otomatik olarak reddettiniz. + </string> <string name="name_started_call"> [NAME] bir sesli arama baÅŸlattı </string> @@ -3976,7 +3979,7 @@ Bu iletiyi almaya devam ederseniz, lütfen [SUPPORT_SITE] bölümüne baÅŸvurun. BaÄŸlanıyor... </string> <string name="conference-title"> - Özel Konferans + Çok kiÅŸili sohbet </string> <string name="conference-title-incoming"> [AGENT_NAME] ile konferans @@ -4866,6 +4869,9 @@ Düzenleyici yolunu çift tırnakla çevrelemeyi deneyin. <string name="Command_Chat_Label"> Sohbet </string> + <string name="Command_Conversations_Label"> + Sohbetler + </string> <string name="Command_Compass_Label"> Pusula </string> @@ -4941,6 +4947,9 @@ Düzenleyici yolunu çift tırnakla çevrelemeyi deneyin. <string name="Command_Chat_Tooltip"> Metin kullanarak yakındaki kiÅŸilerle sohbet etmek </string> + <string name="Command_Conversations_Tooltip"> + Herkesle sohbet et + </string> <string name="Command_Compass_Tooltip"> Pusula </string> @@ -5070,4 +5079,13 @@ Düzenleyici yolunu çift tırnakla çevrelemeyi deneyin. <string name="UserDictionary"> [User] </string> + <string name="logging_calls_disabled_log_empty"> + Sohbetlerin günlüğü tutulmuyor. Bir günlük tutmaya baÅŸlamak için, Tercihler > Sohbet altında "Kaydet: Sadece günlük" veya "Kaydet: Günlük ve dökümler" seçimini yapın. + </string> + <string name="logging_calls_disabled_log_not_empty"> + Bundan böyle sohbetlerin günlükleri tutulmayacak. Bir günlük tutmaya devam etmek için, Tercihler > Sohbet altında "Kaydet: Sadece günlük" veya "Kaydet: Günlük ve dökümler" seçimini yapın. + </string> + <string name="logging_calls_enabled_log_empty"> + Günlüğü tutulmuÅŸ sohbet yok. Siz biriyle iletiÅŸime geçtikten sonra veya biri sizinle iletiÅŸime geçtikten sonra, burada bir günlük giriÅŸi gösterilir. + </string> </strings> diff --git a/indra/newview/skins/default/xui/zh/floater_conversation_log.xml b/indra/newview/skins/default/xui/zh/floater_conversation_log.xml new file mode 100644 index 0000000000..37115a0310 --- /dev/null +++ b/indra/newview/skins/default/xui/zh/floater_conversation_log.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="floater_conversation_log" title="交談記錄"> + <panel name="buttons_panel"> + <filter_editor label="人員éŽæ¿¾å™¨" name="people_filter_input"/> + <menu_button name="conversation_view_btn" tool_tip="檢視/排åºçš„é¸é …"/> + <menu_button name="conversations_gear_btn" tool_tip="å°æ‰€é¸çš„人或群組採å–動作"/> + </panel> +</floater> diff --git a/indra/newview/skins/default/xui/zh/floater_conversation_preview.xml b/indra/newview/skins/default/xui/zh/floater_conversation_preview.xml new file mode 100644 index 0000000000..ece263f440 --- /dev/null +++ b/indra/newview/skins/default/xui/zh/floater_conversation_preview.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="preview_conversation" title="交談:"> + <floater.string name="Title"> + 交談:[NAME] + </floater.string> + <text name="page_label" value="é "/> +</floater> diff --git a/indra/newview/skins/default/xui/zh/floater_im_container.xml b/indra/newview/skins/default/xui/zh/floater_im_container.xml index 2d66c659fe..84ad869100 100644 --- a/indra/newview/skins/default/xui/zh/floater_im_container.xml +++ b/indra/newview/skins/default/xui/zh/floater_im_container.xml @@ -1,2 +1,29 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<multi_floater name="floater_im_box" title="交談"/> +<multi_floater name="floater_im_box" title="交談"> + <string name="collapse_icon" value="Conv_toolbar_collapse"/> + <string name="expand_icon" value="Conv_toolbar_expand"/> + <layout_stack name="conversations_stack"> + <layout_panel name="conversations_layout_panel"> + <layout_stack name="conversations_pane_buttons_stack"> + <layout_panel name="conversations_pane_buttons_expanded"> + <menu_button name="sort_btn" tool_tip="檢視/排åºçš„é¸é …"/> + <button name="add_btn" tool_tip="開始新的交談"/> + <button name="speak_btn" tool_tip="用麥克風和大家交談"/> + </layout_panel> + <layout_panel name="conversations_pane_buttons_collapsed"> + <button name="expand_collapse_btn" tool_tip="縮疊/展開這個清單"/> + </layout_panel> + </layout_stack> + </layout_panel> + <layout_panel name="messages_layout_panel"> + <panel_container name="im_box_tab_container"> + <panel name="stub_panel"> + <button name="stub_collapse_btn" tool_tip="縮疊這一å€å¡Š"/> + <text name="stub_textbox"> + 這個交談å¦é–‹äº†æ–°è¦–窗。 [secondlife:/// 把它收回來] + </text> + </panel> + </panel_container> + </layout_panel> + </layout_stack> +</multi_floater> diff --git a/indra/newview/skins/default/xui/zh/floater_im_session.xml b/indra/newview/skins/default/xui/zh/floater_im_session.xml index 808a0b6720..d63c5507db 100644 --- a/indra/newview/skins/default/xui/zh/floater_im_session.xml +++ b/indra/newview/skins/default/xui/zh/floater_im_session.xml @@ -1,8 +1,59 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="panel_im"> - <layout_stack name="im_panels"> - <layout_panel> - <line_editor label="至" name="chat_editor"/> - </layout_panel> - </layout_stack> + <floater.string name="call_btn_start"> + Conv_toolbar_open_call + </floater.string> + <floater.string name="call_btn_stop"> + Conv_toolbar_hang_up + </floater.string> + <floater.string name="collapseline_icon" value="Conv_collapse_to_one_line"/> + <floater.string name="expandline_icon" value="Conv_expand_one_line"/> + <floater.string name="collapse_icon" value="Conv_toolbar_collapse"/> + <floater.string name="expand_icon" value="Conv_toolbar_expand"/> + <floater.string name="tear_off_icon" value="Conv_toolbar_arrow_ne"/> + <floater.string name="return_icon" value="Conv_toolbar_arrow_sw"/> + <floater.string name="participant_added" value="[NAME] å·²å—é‚€åŠ å…¥äº¤è«‡ã€‚"/> + <floater.string name="multiple_participants_added" value="[NAME] å·²å—é‚€åŠ å…¥äº¤è«‡ã€‚"/> + <floater.string name="tooltip_to_separate_window" value="為這個交談å¦é–‹æ–°è¦–窗"/> + <floater.string name="tooltip_to_main_window" value="將這個交談移回到主視窗"/> + <floater.string name="start_call_button_tooltip" value="建立語音通è¯"/> + <floater.string name="end_call_button_tooltip" value="切斷語音通è¯"/> + <floater.string name="expcol_button_not_tearoff_tooltip" value="縮疊這一å€å¡Š"/> + <floater.string name="expcol_button_tearoff_and_expanded_tooltip" value="縮疊åƒèˆ‡è€…清單"/> + <floater.string name="expcol_button_tearoff_and_collapsed_tooltip" value="展開åƒèˆ‡è€…清單"/> + <view name="contents_view"> + <layout_stack name="main_stack"> + <layout_panel name="toolbar_panel"> + <menu_button name="view_options_btn" tool_tip="檢視/排åºçš„é¸é …"/> + <menu_button name="gear_btn" tool_tip="å°é¸å–的人採å–動作"/> + <button name="add_btn" tool_tip="新增æŸäººåˆ°é€™å€‹äº¤è«‡"/> + <button name="voice_call_btn" tool_tip="建立語音通è¯"/> + <button name="close_btn" tool_tip="çµæŸé€™å€‹äº¤è«‡"/> + <button name="expand_collapse_btn" tool_tip="縮疊/展開這個框"/> + </layout_panel> + <layout_panel name="body_panel"> + <layout_stack name="im_panels"> + <layout_panel name="right_part_holder"> + <panel name="trnsAndChat_panel"> + <layout_stack name="translate_and_chat_stack"> + <layout_panel name="translate_chat_checkbox_lp"> + <check_box label="ç¿»è¯èŠå¤©å…§å®¹" name="translate_chat_checkbox"/> + </layout_panel> + </layout_stack> + </panel> + </layout_panel> + </layout_stack> + </layout_panel> + <layout_panel name="chat_layout_panel"> + <layout_stack name="input_panels"> + <layout_panel name="input_editor_layout_panel"> + <chat_editor label="至" name="chat_editor"/> + </layout_panel> + <layout_panel name="input_button_layout_panel"> + <button name="minz_btn" tool_tip="顯示/éš±è—訊æ¯æ¡†"/> + </layout_panel> + </layout_stack> + </layout_panel> + </layout_stack> + </view> </floater> diff --git a/indra/newview/skins/default/xui/zh/floater_incoming_call.xml b/indra/newview/skins/default/xui/zh/floater_incoming_call.xml index 45a003d3c8..4526eff21d 100644 --- a/indra/newview/skins/default/xui/zh/floater_incoming_call.xml +++ b/indra/newview/skins/default/xui/zh/floater_incoming_call.xml @@ -25,9 +25,9 @@ 是å¦é›¢é–‹ [CURRENT_CHAT] ä¸¦åŠ å…¥é€™å€‹èªžéŸ³èŠå¤©ï¼Ÿ </floater.string> <text name="question"> - 是å¦é›¢é–‹ [CURRENT_CHAT] ä¸¦åŠ å…¥é€™å€‹èªžéŸ³èŠå¤©ï¼Ÿ + 如果接è½ï¼Œä½ 將切斷目å‰çš„語音交談。 </text> - <button label="接å—" label_selected="接å—" name="Accept"/> - <button label="拒絕" label_selected="拒絕" name="Reject"/> - <button label="開始 IM" name="Start IM"/> + <button label="接è½" label_selected="接è½" name="Accept"/> + <button label="忽視" label_selected="忽視" name="Reject"/> + <button label="ä¸æŽ¥è½ä½†é–‹å•Ÿ IM" name="Start IM"/> </floater> diff --git a/indra/newview/skins/default/xui/zh/floater_pathfinding_console.xml b/indra/newview/skins/default/xui/zh/floater_pathfinding_console.xml index be009b54d8..d0978b8b01 100644 --- a/indra/newview/skins/default/xui/zh/floater_pathfinding_console.xml +++ b/indra/newview/skins/default/xui/zh/floater_pathfinding_console.xml @@ -71,7 +71,7 @@ <text name="show_label"> 顯示: </text> - <check_box label="世界" name="show_world"/> + <check_box label="測試" name="show_world"/> <check_box label="僅é™å¯ç§»å‹•çš„" name="show_world_movables_only"/> <check_box label="導航網é¢" name="show_navmesh"/> <text name="show_walkability_label"> diff --git a/indra/newview/skins/default/xui/zh/floater_texture_ctrl.xml b/indra/newview/skins/default/xui/zh/floater_texture_ctrl.xml index e909a67e2c..02d06323d4 100644 --- a/indra/newview/skins/default/xui/zh/floater_texture_ctrl.xml +++ b/indra/newview/skins/default/xui/zh/floater_texture_ctrl.xml @@ -19,7 +19,7 @@ <button label="é è¨" label_selected="é è¨" name="Default"/> <button label="空白" label_selected="空白" name="Blank"/> <button label="ç„¡" label_selected="ç„¡" name="None"/> - <check_box initial_value="true" label="實時é 覽" name="apply_immediate_check"/> + <check_box initial_value="true" label="ç«‹å³å¥—用" name="apply_immediate_check"/> <text name="preview_disabled" value="å·²åœç”¨é 覽"/> <filter_editor label="æ質éŽæ¿¾å™¨" name="inventory search editor"/> <check_box initial_value="false" label="顯示資料夾" name="show_folders_check"/> diff --git a/indra/newview/skins/default/xui/zh/floater_voice_chat_volume.xml b/indra/newview/skins/default/xui/zh/floater_voice_chat_volume.xml new file mode 100644 index 0000000000..96caa7d333 --- /dev/null +++ b/indra/newview/skins/default/xui/zh/floater_voice_chat_volume.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="floater_voice_volume" title="語音èŠå¤©éŸ³é‡"> + <slider label="語音èŠå¤©" name="chat_voice_volume"/> +</floater> diff --git a/indra/newview/skins/default/xui/zh/floater_voice_effect.xml b/indra/newview/skins/default/xui/zh/floater_voice_effect.xml index 81e0204262..aab5fa6028 100644 --- a/indra/newview/skins/default/xui/zh/floater_voice_effect.xml +++ b/indra/newview/skins/default/xui/zh/floater_voice_effect.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater label="地點" name="voice_effects" title="語音變è²"> +<floater label="地點" name="voice_effects" title="語音變è²è©¦è½"> <string name="no_voice_effect"> (無變è²æ•ˆæžœï¼‰ </string> diff --git a/indra/newview/skins/default/xui/zh/floater_voice_volume.xml b/indra/newview/skins/default/xui/zh/floater_voice_volume.xml new file mode 100644 index 0000000000..4260a8d331 --- /dev/null +++ b/indra/newview/skins/default/xui/zh/floater_voice_volume.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<!-- + Not can_close / no title to avoid window chrome + Single instance - only have one at a time, recycle it each spawn +--> +<floater name="floater_voice_volume" title="音é‡"> + <slider name="volume_slider" tool_tip="音é‡" value="0.5"/> +</floater> diff --git a/indra/newview/skins/default/xui/zh/menu_cof_gear.xml b/indra/newview/skins/default/xui/zh/menu_cof_gear.xml index cd069f9601..eb7093a23c 100644 --- a/indra/newview/skins/default/xui/zh/menu_cof_gear.xml +++ b/indra/newview/skins/default/xui/zh/menu_cof_gear.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <toggleable_menu name="Gear COF"> <menu label="æ–°è¡£æœ" name="COF.Gear.New_Clothes"/> - <menu label="新身體部ä½" name="COF.Geear.New_Body_Parts"/> + <menu label="新身體部ä½" name="COF.Gear.New_Body_Parts"/> </toggleable_menu> diff --git a/indra/newview/skins/default/xui/zh/menu_conversation.xml b/indra/newview/skins/default/xui/zh/menu_conversation.xml new file mode 100644 index 0000000000..507255d0c0 --- /dev/null +++ b/indra/newview/skins/default/xui/zh/menu_conversation.xml @@ -0,0 +1,31 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_conversation_participant"> + <menu_item_call label="關閉交談" name="close_conversation"/> + <menu_item_call label="開啟語音交談" name="open_voice_conversation"/> + <menu_item_call label="切斷語音交談" name="disconnect_from_voice"/> + <menu_item_call label="察看檔案" name="view_profile"/> + <menu_item_call label="IM" name="im"/> + <menu_item_call label="發出瞬間傳é€é‚€è«‹" name="offer_teleport"/> + <menu_item_call label="語音通話" name="voice_call"/> + <menu_item_call label="èŠå¤©æ·å²â€¦â€¦" name="chat_history"/> + <menu_item_call label="新增朋å‹" name="add_friend"/> + <menu_item_call label="移除朋å‹" name="remove_friend"/> + <menu_item_call label="移除朋å‹" name="remove_friends"/> + <menu_item_call label="é‚€è«‹åŠ å…¥ç¾¤çµ„â€¦â€¦" name="invite_to_group"/> + <menu_item_call label="放大" name="zoom_in"/> + <menu_item_call label="地圖" name="map"/> + <menu_item_call label="分享" name="share"/> + <menu_item_call label="支付" name="pay"/> + <menu_item_check label="ç¦æ¢èªžéŸ³" name="block_unblock"/> + <menu_item_check label="ç¦æ¢æ–‡å—" name="MuteText"/> + <menu_item_call label="群組檔案" name="group_profile"/> + <menu_item_call label="啟用群組" name="activate_group"/> + <menu_item_call label="離開群組" name="leave_group"/> + <context_menu label="主æŒäººé¸é …" name="Moderator Options"> + <menu_item_check label="å…許文å—èŠå¤©" name="AllowTextChat"/> + <menu_item_call label="å°‡æ¤äººæ¶ˆéŸ³" name="ModerateVoiceMuteSelected"/> + <menu_item_call label="å–消å°æ¤äººçš„消音" name="ModerateVoiceUnMuteSelected"/> + <menu_item_call label="所有人消音" name="ModerateVoiceMute"/> + <menu_item_call label="å–消所有人的消音" name="ModerateVoiceUnmute"/> + </context_menu> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/zh/menu_conversation_log_gear.xml b/indra/newview/skins/default/xui/zh/menu_conversation_log_gear.xml new file mode 100644 index 0000000000..49e91417e8 --- /dev/null +++ b/indra/newview/skins/default/xui/zh/menu_conversation_log_gear.xml @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="Conversation Context Menu"> + <menu_item_call label="IM…" name="IM"/> + <menu_item_call label="語音通話…" name="Call"/> + <menu_item_call label="é–‹å•ŸèŠå¤©æ·å²â€¦" name="Chat history"/> + <menu_item_call label="察看檔案" name="View Profile"/> + <menu_item_call label="發給瞬間傳é€è«‹æ±‚" name="teleport"/> + <menu_item_call label="åŠ ç‚ºæœ‹å‹" name="add_friend"/> + <menu_item_call label="移除朋å‹" name="remove_friend"/> + <menu_item_call label="é‚€è«‹åŠ å…¥ç¾¤çµ„â€¦â€¦" name="Invite"/> + <menu_item_call label="地圖" name="Map"/> + <menu_item_call label="分享" name="Share"/> + <menu_item_call label="支付" name="Pay"/> + <menu_item_check label="å°éŽ–/ä¸å†å°éŽ–" name="Block/Unblock"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/zh/menu_conversation_log_view.xml b/indra/newview/skins/default/xui/zh/menu_conversation_log_view.xml new file mode 100644 index 0000000000..3fa99a5cd7 --- /dev/null +++ b/indra/newview/skins/default/xui/zh/menu_conversation_log_view.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_conversation_view"> + <menu_item_check label="ä¾å稱排åº" name="sort_by_name"/> + <menu_item_check label="ä¾æ—¥æœŸæŽ’åº" name="sort_by_date"/> + <menu_item_check label="將朋å‹åˆ—åœ¨é ‚ç«¯" name="sort_by_friends"/> + <menu_item_call label="檢視附近èŠå¤©æ·å²â€¦â€¦" name="view_nearby_chat_history"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/zh/menu_im_conversation.xml b/indra/newview/skins/default/xui/zh/menu_im_conversation.xml new file mode 100644 index 0000000000..815b0b594c --- /dev/null +++ b/indra/newview/skins/default/xui/zh/menu_im_conversation.xml @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="Conversation Gear Menu"> + <menu_item_call label="察看檔案" name="View Profile"/> + <menu_item_call label="åŠ ç‚ºæœ‹å‹" name="Add Friend"/> + <menu_item_call label="移除朋å‹" name="remove_friend"/> + <menu_item_call label="發出瞬間傳é€é‚€è«‹" name="offer_teleport"/> + <menu_item_call label="é‚€è«‹åŠ å…¥ç¾¤çµ„â€¦â€¦" name="invite_to_group"/> + <menu_item_call label="èŠå¤©æ·å²â€¦â€¦" name="chat_history"/> + <menu_item_call label="放大" name="zoom_in"/> + <menu_item_call label="地圖" name="map"/> + <menu_item_call label="分享" name="Share"/> + <menu_item_call label="支付" name="Pay"/> + <menu_item_check label="ç¦æ¢èªžéŸ³" name="Block/Unblock"/> + <menu_item_check label="ç¦æ¢æ–‡å—" name="MuteText"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/zh/menu_im_session_showmodes.xml b/indra/newview/skins/default/xui/zh/menu_im_session_showmodes.xml new file mode 100644 index 0000000000..a7006e524a --- /dev/null +++ b/indra/newview/skins/default/xui/zh/menu_im_session_showmodes.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_modes"> + <menu_item_check label="精簡視野" name="compact_view"/> + <menu_item_check label="全展視野" name="expanded_view"/> + <menu_item_check label="顯示時間" name="IMShowTime"/> + <menu_item_check label="一å°ä¸€äº¤è«‡æ™‚顯示åå—" name="IMShowNamesForP2PConv"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/zh/menu_object_icon.xml b/indra/newview/skins/default/xui/zh/menu_object_icon.xml index f4f93b0bdc..9655732f2e 100644 --- a/indra/newview/skins/default/xui/zh/menu_object_icon.xml +++ b/indra/newview/skins/default/xui/zh/menu_object_icon.xml @@ -2,4 +2,6 @@ <menu name="Object Icon Menu"> <menu_item_call label="物件檔案..." name="Object Profile"/> <menu_item_call label="å°éŽ–…" name="Block"/> + <menu_item_call label="顯示在地圖上" name="show_on_map"/> + <menu_item_call label="瞬間傳é€åˆ°ç‰©ä»¶ä½ç½®" name="teleport_to_object"/> </menu> diff --git a/indra/newview/skins/default/xui/zh/menu_outfit_gear.xml b/indra/newview/skins/default/xui/zh/menu_outfit_gear.xml index e85b4b7182..258d0d6b20 100644 --- a/indra/newview/skins/default/xui/zh/menu_outfit_gear.xml +++ b/indra/newview/skins/default/xui/zh/menu_outfit_gear.xml @@ -23,6 +23,8 @@ <menu_item_call label="æ–°é é«®" name="New Hair"/> <menu_item_call label="新眼ç›" name="New Eyes"/> </menu> + <menu_item_call label="展開全部資料夾" name="expand"/> + <menu_item_call label="摺疊全部資料夾" name="collapse"/> <menu_item_call label="è£æ‰®æ›´å" name="rename"/> <menu_item_call label="刪除è£æ‰®" name="delete_outfit"/> </toggleable_menu> diff --git a/indra/newview/skins/default/xui/zh/menu_participant_view.xml b/indra/newview/skins/default/xui/zh/menu_participant_view.xml new file mode 100644 index 0000000000..8b35860eb6 --- /dev/null +++ b/indra/newview/skins/default/xui/zh/menu_participant_view.xml @@ -0,0 +1,13 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="participant_manu_view"> + <menu_item_check label="將交談ä¾é¡žåž‹æŽ’åº" name="sort_sessions_by_type"/> + <menu_item_check label="將交談ä¾åå—排åº" name="sort_sessions_by_name"/> + <menu_item_check label="將交談ä¾æœ€è¿‘活動排åº" name="sort_sessions_by_recent"/> + <menu_item_check label="å°‡åƒèˆ‡è€…ä¾åå—排åº" name="sort_participants_by_name"/> + <menu_item_check label="å°‡åƒèˆ‡è€…ä¾æœ€è¿‘活動排åº" name="sort_participants_by_recent"/> + <menu_item_call label="èŠå¤©å好è¨å®šâ€¦â€¦" name="chat_preferences"/> + <menu_item_call label="éš±ç§å好è¨å®šâ€¦â€¦" name="privacy_preferences"/> + <menu_item_check label="交談記錄……" name="Conversation"/> + <menu_item_check label="ç¿»è¯é™„è¿‘çš„èŠå¤©" name="Translate_chat"/> + <menu_item_check label="ç¿»è¯è¨å®šâ€¦â€¦" name="Translation_settings"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/zh/menu_people_blocked_gear.xml b/indra/newview/skins/default/xui/zh/menu_people_blocked_gear.xml new file mode 100644 index 0000000000..9a2a3c403d --- /dev/null +++ b/indra/newview/skins/default/xui/zh/menu_people_blocked_gear.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_blocked_gear"> + <menu_item_call label="解除å°éŽ–" name="unblock"/> + <menu_item_call label="檔案..." name="profile"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/zh/menu_people_blocked_plus.xml b/indra/newview/skins/default/xui/zh/menu_people_blocked_plus.xml new file mode 100644 index 0000000000..a8cecb4e14 --- /dev/null +++ b/indra/newview/skins/default/xui/zh/menu_people_blocked_plus.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_blocked_plus"> + <menu_item_call label="按åå—å°éŽ–居民……" name="block_resident_by_name"/> + <menu_item_call label="ä¾å稱å°éŽ–物件" name="block_object_by_name"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/zh/menu_people_blocked_view.xml b/indra/newview/skins/default/xui/zh/menu_people_blocked_view.xml new file mode 100644 index 0000000000..5b70cd35bf --- /dev/null +++ b/indra/newview/skins/default/xui/zh/menu_people_blocked_view.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_blocked_view"> + <menu_item_check label="ä¾å稱排åº" name="sort_by_name"/> + <menu_item_check label="ä¾é¡žåž‹æŽ’åº" name="sort_by_type"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/zh/menu_people_friends_view.xml b/indra/newview/skins/default/xui/zh/menu_people_friends_view.xml new file mode 100644 index 0000000000..4251238fd9 --- /dev/null +++ b/indra/newview/skins/default/xui/zh/menu_people_friends_view.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_group_plus"> + <menu_item_check label="ä¾å稱排åº" name="sort_name"/> + <menu_item_check label="ä¾ç‹€æ…‹æŽ’åº" name="sort_status"/> + <menu_item_check label="察看人群圖示" name="view_icons"/> + <menu_item_check label="察看許å¯æ¬Šé™" name="view_permissions"/> + <menu_item_check label="檢視交談記錄……" name="view_conversation"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/zh/menu_people_groups.xml b/indra/newview/skins/default/xui/zh/menu_people_groups.xml index 5768c554c9..b4b566f5ca 100644 --- a/indra/newview/skins/default/xui/zh/menu_people_groups.xml +++ b/indra/newview/skins/default/xui/zh/menu_people_groups.xml @@ -2,7 +2,7 @@ <menu name="menu_group_plus"> <menu_item_call label="察看資訊" name="View Info"/> <menu_item_call label="èŠå¤©" name="Chat"/> - <menu_item_call label="通話" name="Call"/> + <menu_item_call label="語音通話" name="Call"/> <menu_item_call label="å•Ÿå‹•" name="Activate"/> <menu_item_call label="退出" name="Leave"/> </menu> diff --git a/indra/newview/skins/default/xui/zh/menu_people_groups_view.xml b/indra/newview/skins/default/xui/zh/menu_people_groups_view.xml new file mode 100644 index 0000000000..05a30d938f --- /dev/null +++ b/indra/newview/skins/default/xui/zh/menu_people_groups_view.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_group_plus"> + <menu_item_check label="顯示群組圖示" name="Display Group Icons"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/zh/menu_people_nearby.xml b/indra/newview/skins/default/xui/zh/menu_people_nearby.xml index 38d5f3d324..d25adaf8fb 100644 --- a/indra/newview/skins/default/xui/zh/menu_people_nearby.xml +++ b/indra/newview/skins/default/xui/zh/menu_people_nearby.xml @@ -1,13 +1,16 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <context_menu name="Avatar Context Menu"> - <menu_item_call label="察看檔案" name="View Profile"/> - <menu_item_call label="åŠ ç‚ºæœ‹å‹" name="Add Friend"/> - <menu_item_call label="移除朋å‹" name="Remove Friend"/> - <menu_item_call label="IM" name="IM"/> - <menu_item_call label="通話" name="Call"/> - <menu_item_call label="地圖" name="Map"/> - <menu_item_call label="分享" name="Share"/> - <menu_item_call label="支付" name="Pay"/> - <menu_item_check label="å°éŽ–/ä¸å†å°éŽ–" name="Block/Unblock"/> - <menu_item_call label="發給瞬間傳é€è«‹æ±‚" name="teleport"/> + <menu_item_call label="察看檔案" name="view_profile"/> + <menu_item_call label="IM" name="im"/> + <menu_item_call label="發給瞬間傳é€è«‹æ±‚" name="offer_teleport"/> + <menu_item_call label="語音通話" name="voice_call"/> + <menu_item_call label="檢視èŠå¤©æ·å²â€¦â€¦" name="chat_history"/> + <menu_item_call label="åŠ ç‚ºæœ‹å‹" name="add_friend"/> + <menu_item_call label="移除朋å‹" name="remove_friend"/> + <menu_item_call label="é‚€è«‹åŠ å…¥ç¾¤çµ„â€¦â€¦" name="invite_to_group"/> + <menu_item_call label="放大" name="zoom_in"/> + <menu_item_call label="地圖" name="map"/> + <menu_item_call label="分享" name="share"/> + <menu_item_call label="支付" name="pay"/> + <menu_item_check label="å°éŽ–/ä¸å†å°éŽ–" name="block_unblock"/> </context_menu> diff --git a/indra/newview/skins/default/xui/zh/menu_people_nearby_multiselect.xml b/indra/newview/skins/default/xui/zh/menu_people_nearby_multiselect.xml index 1380e0b307..69f0eab7dc 100644 --- a/indra/newview/skins/default/xui/zh/menu_people_nearby_multiselect.xml +++ b/indra/newview/skins/default/xui/zh/menu_people_nearby_multiselect.xml @@ -1,10 +1,10 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <context_menu name="Multi-Selected People Context Menu"> - <menu_item_call label="åŠ ç‚ºæœ‹å‹" name="Add Friends"/> - <menu_item_call label="移除朋å‹" name="Remove Friend"/> - <menu_item_call label="IM" name="IM"/> - <menu_item_call label="通話" name="Call"/> - <menu_item_call label="分享" name="Share"/> - <menu_item_call label="支付" name="Pay"/> - <menu_item_call label="發給瞬間傳é€è«‹æ±‚" name="teleport"/> + <menu_item_call label="åŠ ç‚ºæœ‹å‹" name="add_friends"/> + <menu_item_call label="移除朋å‹" name="remove_friends"/> + <menu_item_call label="IM" name="im"/> + <menu_item_call label="通話" name="call"/> + <menu_item_call label="分享" name="share"/> + <menu_item_call label="支付" name="pay"/> + <menu_item_call label="發給瞬間傳é€è«‹æ±‚" name="offer_teleport"/> </context_menu> diff --git a/indra/newview/skins/default/xui/zh/menu_people_nearby_view.xml b/indra/newview/skins/default/xui/zh/menu_people_nearby_view.xml new file mode 100644 index 0000000000..9bc5638472 --- /dev/null +++ b/indra/newview/skins/default/xui/zh/menu_people_nearby_view.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_group_plus"> + <menu_item_check label="ä¾æœ€è¿‘說話者排åº" name="sort_by_recent_speakers"/> + <menu_item_check label="ä¾å稱排åº" name="sort_name"/> + <menu_item_check label="ä¾è·é›¢æŽ’åº" name="sort_distance"/> + <menu_item_check label="察看人群圖示" name="view_icons"/> + <menu_item_check label="察看地圖" name="view_map"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/zh/menu_people_recent_view.xml b/indra/newview/skins/default/xui/zh/menu_people_recent_view.xml new file mode 100644 index 0000000000..382234c3ec --- /dev/null +++ b/indra/newview/skins/default/xui/zh/menu_people_recent_view.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_group_plus"> + <menu_item_check label="ä¾æœ€è¿‘排åº" name="sort_most"/> + <menu_item_check label="ä¾å稱排åº" name="sort_name"/> + <menu_item_check label="察看人群圖示" name="view_icons"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/zh/menu_url_agent.xml b/indra/newview/skins/default/xui/zh/menu_url_agent.xml index 592bb6561e..72629822d4 100644 --- a/indra/newview/skins/default/xui/zh/menu_url_agent.xml +++ b/indra/newview/skins/default/xui/zh/menu_url_agent.xml @@ -1,6 +1,8 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <context_menu name="Url Popup"> - <menu_item_call label="顯示居民檔案" name="show_agent"/> + <menu_item_call label="察看檔案" name="show_agent"/> + <menu_item_call label="é€å‡º IM..." name="send_im"/> + <menu_item_call label="åŠ ç‚ºæœ‹å‹..." name="add_friend"/> <menu_item_call label="覆製å稱到剪貼簿" name="url_copy_label"/> <menu_item_call label="覆製 SLurl 到剪貼簿" name="url_copy"/> </context_menu> diff --git a/indra/newview/skins/default/xui/zh/menu_url_objectim.xml b/indra/newview/skins/default/xui/zh/menu_url_objectim.xml index b344b21c62..9f3a9d58ff 100644 --- a/indra/newview/skins/default/xui/zh/menu_url_objectim.xml +++ b/indra/newview/skins/default/xui/zh/menu_url_objectim.xml @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <context_menu name="Url Popup"> - <menu_item_call label="顯示物件資訊" name="show_object"/> + <menu_item_call label="物件檔案..." name="show_object"/> <menu_item_call label="顯示在地圖上" name="show_on_map"/> <menu_item_call label="瞬間傳é€åˆ°ç‰©ä»¶ä½ç½®" name="teleport_to_object"/> <menu_item_call label="覆製物件å稱到剪貼簿" name="url_copy_label"/> diff --git a/indra/newview/skins/default/xui/zh/menu_viewer.xml b/indra/newview/skins/default/xui/zh/menu_viewer.xml index ac0e9e7e35..fdae3f3bd4 100644 --- a/indra/newview/skins/default/xui/zh/menu_viewer.xml +++ b/indra/newview/skins/default/xui/zh/menu_viewer.xml @@ -16,10 +16,7 @@ <menu_item_call label="åœæ¢æˆ‘身上的動作" name="Stop Animating My Avatar"/> <menu_item_call label="行走 / è·‘æ¥ / 飛行…" name="Walk / run / fly"/> </menu> - <menu label="狀態" name="Status"> - <menu_item_call label="離開" name="Set Away"/> - <menu_item_call label="忙碌" name="Set Busy"/> - </menu> + <menu label="狀態" name="Status"/> <menu_item_call label="購買 L$…" name="Buy and Sell L$"/> <menu_item_call label="商家發件匣…" name="MerchantOutbox"/> <menu_item_call label="帳戶主控臺…" name="Manage My Account"/> @@ -30,14 +27,18 @@ <menu_item_call label="退出 [APP_NAME]" name="Quit"/> </menu> <menu label="æºé€š" name="Communicate"> - <menu_item_check label="èŠå¤©â€¦" name="Nearby Chat"/> + <menu_item_check label="交談……" name="Conversations"/> + <menu_item_check label="附近的èŠå¤©â€¦â€¦" name="Nearby Chat"/> <menu_item_check label="說話" name="Speak"/> - <menu_item_check label="語音è¨å®šâ€¦" name="Nearby Voice"/> - <menu_item_check label="語音變è²â€¦" name="ShowVoice"/> + <menu label="語音變è²" name="VoiceMorphing"> + <menu_item_check label="沒有變è²æ•ˆæžœ" name="NoVoiceMorphing"/> + <menu_item_check label="é 覽……" name="Preview"/> + <menu_item_call label="訂閱……" name="Subscribe"/> + </menu> <menu_item_check label="姿勢…" name="Gestures"/> - <menu_item_call label="朋å‹" name="My Friends"/> - <menu_item_call label="群組" name="My Groups"/> - <menu_item_call label="附近的人群" name="Active Speakers"/> + <menu_item_check label="朋å‹" name="My Friends"/> + <menu_item_check label="群組" name="My Groups"/> + <menu_item_check label="附近的人群" name="Active Speakers"/> <menu_item_call label="å°éŽ–清單" name="Block List"/> </menu> <menu label="世界" name="World"> @@ -305,7 +306,7 @@ <menu_item_call label="å·²é¸å–æ質資訊基礎" name="Selected Texture Info Basis"/> <menu_item_check label="線框" name="Wireframe"/> <menu_item_check label="物件導å‘çš„é®è”½" name="Object-Object Occlusion"/> - <menu_item_check label="光線和陰影" name="Lighting and Shadows"/> + <menu_item_check label="光線和陰影" name="Advanced Lighting Model"/> <menu_item_check label="來自日/月/投影物的陰影" name="Shadows from Sun/Moon/Projectors"/> <menu_item_check label="å±å¹•ç©ºé–“環境光é®è”½å’Œé™°å½±å¹³æ»‘技術" name="SSAO and Shadow Smoothing"/> <menu_item_check label="GL 除錯" name="Debug GL"/> diff --git a/indra/newview/skins/default/xui/zh/notifications.xml b/indra/newview/skins/default/xui/zh/notifications.xml index 9fecf2c104..59be26d43b 100644 --- a/indra/newview/skins/default/xui/zh/notifications.xml +++ b/indra/newview/skins/default/xui/zh/notifications.xml @@ -516,6 +516,24 @@ </url> <usetemplate ignoretext="我的顯示驅動程å¼å¤ªè€èˆŠ" name="okcancelignore" notext="å¦" yestext="是"/> </notification> + <notification name="AMDOldDriver"> + ä½ çš„é¡¯ç¤ºå¡å¾ˆå¯èƒ½æœ‰æ–°ç‰ˆçš„驅動程å¼ã€‚ 更新顯示驅動程å¼æœƒå¤§å¹…改善性能。 + + å‰å¾€ [_URL] 察看是å¦æœ‰æ–°ç‰ˆé©…動程å¼ï¼Ÿ + <url name="url"> + http://support.amd.com/us/Pages/AMDSupportHub.aspx + </url> + <usetemplate ignoretext="我的顯示驅動程å¼å¤ªè€èˆŠ" name="okcancelignore" notext="å¦" yestext="是"/> + </notification> + <notification name="NVIDIAOldDriver"> + ä½ çš„é¡¯ç¤ºå¡å¾ˆå¯èƒ½æœ‰æ–°ç‰ˆçš„驅動程å¼ã€‚ 更新顯示驅動程å¼æœƒå¤§å¹…改善性能。 + + å‰å¾€ [_URL] 察看是å¦æœ‰æ–°ç‰ˆé©…動程å¼ï¼Ÿ + <url name="url"> + http://www.nvidia.com/Download/index.aspx?lang=tw + </url> + <usetemplate ignoretext="我的顯示驅動程å¼å¤ªè€èˆŠ" name="okcancelignore" notext="å¦" yestext="是"/> + </notification> <notification name="UnknownGPU"> ä½ çš„ç³»çµ±å«æœ‰ä¸€å€‹ [APP_NAME] 無法辨èªçš„顯åƒå¡ã€‚ åŽŸå› å¾ˆå¯èƒ½æ˜¯ [APP_NAME] 尚未é‡å°æ–°ç¡¬é«”完æˆæ¸¬è©¦ã€‚ 這大概ä¸æœƒå‡ºå•é¡Œï¼Œä½†ä½ å¯èƒ½éœ€è¦èª¿æ•´é¡¯åƒè¨å®šã€‚ @@ -1536,10 +1554,13 @@ SHA1 指紋:[MD5_DIGEST] æ¤æ™‚無法發出交å‹é‚€è«‹ã€‚ è«‹ç¨å€™å†è©¦ã€‚ <usetemplate name="okbutton" yestext="確定"/> </notification> - <notification name="BusyModeSet"> - å·²è¨ç‚ºå¿™ç¢Œæ¨¡å¼ã€‚ -èŠå¤©å’Œå³æ™‚訊æ¯å…§å®¹å°‡è¢«éš±è—。 å³æ™‚訊æ¯ç™¼é€è€…å°‡æ”¶åˆ°ä½ çš„ã€Œå¿™ç¢Œæ¨¡å¼ã€å›žæ‡‰ã€‚ 所有的瞬間傳é€é‚€è«‹éƒ½å°‡è¢«å©‰æ‹’。 æ¤æ™‚èµ·é€çµ¦ä½ 的收ç´å€ç‰©é …都將丟入垃圾桶。 - <usetemplate ignoretext="我變更我的狀態為忙碌模å¼" name="okignore" yestext="確定"/> + <notification name="DoNotDisturbModeSet"> + 「請勿打擾ã€æ¨¡å¼ç›®å‰æ˜¯é–‹å•Ÿç‹€æ…‹ã€‚ ä½ å°‡ä¸æœƒæ”¶åˆ°ä»»ä½•ç™¼çµ¦ä½ 的訊æ¯é€šçŸ¥ã€‚ + +- å…¶ä»–å±…æ°‘å°‡æ”¶åˆ°ä½ çš„ã€Œè«‹å‹¿æ‰“æ“¾ã€å›žæ‡‰ï¼ˆå›žæ‡‰å…§å®¹è¨æ–¼ã€Œå好è¨å®š > 一般è¨å®šã€ï¼‰ã€‚ +- 所有瞬間傳é€çš„邀請都將被婉拒。 +- 所有語音來電都將拒絕接è½ã€‚ + <usetemplate ignoretext="我變更我的狀態為「請勿打擾ã€æ¨¡å¼" name="okignore" yestext="確定"/> </notification> <notification name="JoinedTooManyGroupsMember"> ä½ å·²é”å¯åŒæ™‚åŠ å…¥çš„ç¾¤çµ„æ•¸ä¸Šé™ã€‚ 請先離開å¦ä¸€å€‹ç¾¤çµ„å†åŠ å…¥é€™ä¸€å€‹ï¼Œæˆ–å©‰æ‹’åŠ å…¥é‚€è«‹ã€‚ @@ -2024,6 +2045,10 @@ SHA1 指紋:[MD5_DIGEST] å‰å¾€ä½ çš„[http://secondlife.com/account/ 塗鴉牆]ä»¥å¯Ÿçœ‹ä½ çš„å¸³æˆ¶æ·å²ç´€éŒ„? <usetemplate ignoretext="啟動我的ç€è¦½å™¨ä»¥å¯Ÿçœ‹æˆ‘的帳戶æ·å²ç´€éŒ„" name="okcancelignore" notext="å–消" yestext="å‰å¾€é é¢"/> </notification> + <notification name="ConfirmAddingChatParticipants"> + 新增一個人到ç¾æœ‰çš„交談,ç‰æ–¼å»ºç«‹æ–°çš„交談。 所有交談者將會收到新交談通知。 + <usetemplate ignoretext="確èªæ–°å¢žèŠå¤©è€…" name="okcancelignore" notext="å–消" yestext="確定"/> + </notification> <notification name="ConfirmQuit"> ä½ ç¢ºå®šä½ è¦çµæŸé€€å‡ºï¼Ÿ <usetemplate ignoretext="當我çµæŸé€€å‡ºæ™‚進行確èª" name="okcancelignore" notext="ä¸è¦çµæŸé€€å‡º" yestext="çµæŸé€€å‡º"/> @@ -2098,14 +2123,14 @@ SHA1 指紋:[MD5_DIGEST] <button ignore="絕ä¸å–代" name="No" text="å–消"/> </form> </notification> - <notification label="忙碌模å¼è¦å‘Š" name="BusyModePay"> - ä½ ç¾åœ¨è™•æ–¼å¿™ç¢Œæ¨¡å¼ï¼Œé€™æ„å‘³è‘—ä½ ä»˜è²»å¾Œä»å°‡ä¸æœƒæ”¶åˆ°ä»»ä½•ç‰©é …。 + <notification label="「請勿打擾ã€æ¨¡å¼è¦å‘Š" name="DoNotDisturbModePay"> + ä½ å·²é–‹å•Ÿã€Œè«‹å‹¿æ‰“æ“¾ã€ã€‚ ä½ å°‡ä¸æœƒæ”¶åˆ°ä»»ä½•ä»˜æ¬¾è³¼è²·çš„ç‰©é …ã€‚ -ä½ æ˜¯å¦è¦å…ˆé›¢é–‹å¿™ç¢Œæ¨¡å¼ï¼Œå†å®Œæˆäº¤æ˜“? +是å¦è¦åœ¨å®Œæˆäº¤æ˜“之å‰ï¼Œå…ˆé—œé–‰ã€Œè«‹å‹¿æ‰“擾ã€æ¨¡å¼ï¼Ÿ <form name="form"> - <ignore name="ignore" text="當我在忙碌模å¼æ™‚,將è¦æ”¯ä»˜é‡‘錢或給他人物件"/> - <button ignore="總是離開忙碌模å¼" name="Yes" text="確定"/> - <button ignore="絕ä¸é›¢é–‹å¿™ç¢Œæ¨¡å¼" name="No" text="å–消"/> + <ignore name="ignore" text="我å³å°‡åœ¨ã€Œè«‹å‹¿æ‰“擾ã€æ¨¡å¼ä¸‹ï¼Œè©¦åœ–付錢給他人或給一個物件"/> + <button ignore="固定é¸æ“‡é›¢é–‹ã€Œè«‹å‹¿æ‰“擾ã€æ¨¡å¼" name="Yes" text="確定"/> + <button ignore="æ°¸ä¸é›¢é–‹ã€Œè«‹å‹¿æ‰“擾ã€æ¨¡å¼" name="No" text="å–消"/> </form> </notification> <notification name="ConfirmDeleteProtectedCategory"> @@ -2240,11 +2265,8 @@ SHA1 指紋:[MD5_DIGEST] <notification name="GroupNotice"> 主旨:[SUBJECT],訊æ¯ï¼š[MESSAGE] </notification> - <notification name="FriendOnline"> - <nolink>[NAME]</nolink> ç›®å‰åœ¨ç·šä¸Š - </notification> - <notification name="FriendOffline"> - <nolink>[NAME]</nolink> ç›®å‰é›¢ç·š + <notification name="FriendOnlineOffline"> + <nolink>[NAME]</nolink> ç›®å‰ç‹€æ…‹ç‚º [STATUS] </notification> <notification name="AddSelfFriend"> é›–ç„¶ä½ äººå¾ˆå¥½ï¼Œä½ é‚„æ˜¯ä¸èƒ½æŠŠè‡ªå·±åŠ 為朋å‹ã€‚ @@ -2472,13 +2494,6 @@ SHA1 指紋:[MD5_DIGEST] <notification name="DynamicPathfindingDisabled"> 這地å€ä¸¦æœªå•Ÿç”¨å‹•æ…‹å°‹å¾‘。 使用尋徑 LSL 呼å«çš„帶腳本物件,在æ¤åœ°å€å¯èƒ½ç„¡æ³•æ£å¸¸é‹ä½œã€‚ </notification> - <notification name="PathfindingRebakeNavmesh"> - 更改本地å€çš„æŸäº›ç‰©ä»¶å°‡å°Žè‡´å…¶ä»–移動物件的é‹ä½œç™¼ç”Ÿå•é¡Œã€‚ è¦ä½¿ç§»å‹•ç‰©ä»¶æ£å¸¸é‹ä½œï¼Œè«‹é»žæŒ‰ã€Œé‡æ–°ç”¢å‡ºåœ°å€ã€æŒ‰éˆ•ã€‚ 欲ç²çŸ¥è©³æƒ…è«‹é¸æ“‡ã€Œå¹«åŠ©ã€ã€‚ - <url name="url"> - http://wiki.secondlife.com/wiki/Pathfinding_Tools_in_the_Second_Life_Viewer - </url> - <usetemplate helptext="幫助" ignoretext="更改本地å€çš„æŸäº›ç‰©ä»¶å°‡å°Žè‡´å…¶ä»–移動物件的é‹ä½œç™¼ç”Ÿå•é¡Œã€‚" name="okhelpignore" yestext="確定"/> - </notification> <notification name="PathfindingCannotRebakeNavmesh"> 發生錯誤。 å•é¡Œå¯èƒ½å‡ºåœ¨ç¶²è·¯æˆ–伺æœå™¨ï¼Œä¹Ÿå¯èƒ½å› ç‚ºä½ ç„¡æ¬Šå»ºè£½ç‰©ä»¶ã€‚ 有時,åªè¦ç™»å‡ºå†ç™»å…¥å³èƒ½è§£æ±ºé€™é¡žå•é¡Œã€‚ <usetemplate name="okbutton" yestext="確定"/> @@ -2741,7 +2756,7 @@ SHA1 指紋:[MD5_DIGEST] <notification name="ScriptQuestionCaution"> è¦å‘Šï¼šç‰©ä»¶ '<nolink>[OBJECTNAME]</nolink>' è¦æ±‚全權å˜å–ä½ çš„æž—ç™»å¹£å¸³æˆ¶ã€‚ ä½ å¦‚æžœå…許å˜å–帳戶,它將å¯åœ¨ä»»ä½•æ™‚å€™å¾žä½ å¸³æˆ¶å–èµ°è³‡é‡‘ï¼Œæˆ–å®Œå…¨åŠ ä»¥æ¸…ç©ºï¼Œæˆ–å®šæœŸå–走部分資金,且ä¸æœƒç™¼å‡ºè¦å‘Šã€‚ -這很å¯èƒ½æ˜¯ç¨®ä¸ç•¶çš„è¦æ±‚。 å¦‚æžœä½ ä¸å®Œå…¨çžè§£å®ƒç‚ºä½•è¦æ±‚å˜å–ä½ çš„å¸³æˆ¶ï¼Œè«‹å‹¿å…准。 +å¦‚æžœä½ ä¸å®Œå…¨çžè§£å®ƒç‚ºä½•è¦æ±‚å˜å–ä½ çš„å¸³æˆ¶ï¼Œè«‹å‹¿å…准。 <form name="form"> <button name="Grant" text="å…許全權å˜å–"/> <button name="Deny" text="拒絕"/> @@ -3323,4 +3338,633 @@ SHA1 指紋:[MD5_DIGEST] ä½ æ£åœ¨åˆªé™¤ [NUM_ITEMS] å€‹ç‰©é …ã€‚ ä½ ç¢ºå®šä½ è¦ç¹¼çºŒï¼Ÿ <usetemplate ignoretext="確定è¦åˆªé™¤å¤šå€‹ç‰©é …?" name="okcancelignore" notext="å¦" yestext="是"/> </notification> + <notification name="AvatarFrozen"> + [AV_FREEZER] å‡çµäº†ä½ 。 ä½ æ¤æ™‚無法移動或與周é互動。 + </notification> + <notification name="AvatarFrozenDuration"> + [AV_FREEZER] å‡çµäº†ä½ [AV_FREEZE_TIME] 秒é˜ã€‚ ä½ æ¤æ™‚無法移動或與周é互動。 + </notification> + <notification name="YouFrozeAvatar"> + 化身已å‡çµã€‚ + </notification> + <notification name="AvatarHasUnFrozenYou"> + [AV_FREEZER] 解除了å°ä½ çš„å‡çµã€‚ + </notification> + <notification name="AvatarUnFrozen"> + 化身已解除å‡çµã€‚ + </notification> + <notification name="AvatarFreezeFailure"> + å‡çµå¤±æ•—ï¼Œå› ç‚ºä½ åœ¨è©²åœ°æ®µæ²’æœ‰ç®¡ç†å“¡æ¬Šé™ã€‚ + </notification> + <notification name="AvatarFreezeThaw"> + ä½ éå‡çµçš„時間已éŽï¼Œè«‹æ¢å¾©æ£å¸¸æ´»å‹•ã€‚ + </notification> + <notification name="AvatarCantFreeze"> + 抱æ‰ï¼Œç„¡æ³•å‡çµè©²ç”¨æˆ¶ã€‚ + </notification> + <notification name="NowOwnObject"> + ä½ ç¾åœ¨æ˜¯ç‰©ä»¶ [OBJECT_NAME] 的所有人 + </notification> + <notification name="CantRezOnLand"> + 無法在 [OBJECT_POS] ç”¢ç”Ÿç‰©ä»¶ï¼Œå› ç‚ºé€™åœŸåœ°çš„æ‰€æœ‰äººä¸å…許。 請用土地工具察看所有人。 + </notification> + <notification name="RezFailTooManyRequests"> + 無法產生物件,æ¤åˆ»è¦æ±‚數目éŽå¤šã€‚ + </notification> + <notification name="SitFailCantMove"> + ä½ ç„¡æ³•åä¸‹ï¼Œå› ç‚ºæ¤åˆ»ä½ ä¸èƒ½ç§»å‹•ã€‚ + </notification> + <notification name="SitFailNotAllowedOnLand"> + ä½ ä¸èƒ½åä¸‹ï¼Œå› ç‚ºè©²åœŸåœ°ä¸å…許。 + </notification> + <notification name="SitFailNotSameRegion"> + 請挨近一點。 無法ååœ¨ç‰©ä»¶ä¸Šï¼Œå› ç‚º +å®ƒå’Œä½ ä¸åœ¨åŒä¸€å€‹åœ°å€ã€‚ + </notification> + <notification name="NoNewObjectRegionFull"> + 無法建立新物件。 地å€å·²æ»¿è¼‰ã€‚ + </notification> + <notification name="FailedToPlaceObject"> + 無法將物件置於指定地點。 è«‹å†è©¦ä¸€æ¬¡ã€‚ + </notification> + <notification name="NoOwnNoGardening"> + ä½ ç„¡æ³•åœ¨åˆ¥äººçš„åœŸåœ°ä¸Šå»ºç«‹æ¨¹å’Œè‰ã€‚ + </notification> + <notification name="NoCopyPermsNoObject"> + è¤‡è£½å¤±æ•—ï¼Œä½ ç„¡æ¬Šè¤‡è£½ç‰©ä»¶ '[OBJ_NAME]'。 + </notification> + <notification name="NoTransPermsNoObject"> + è¤‡è£½å¤±æ•—ï¼Œå› ç‚ºç‰©ä»¶ '[OBJ_NAME]' ç„¡æ³•è½‰ç§»çµ¦ä½ ã€‚ + </notification> + <notification name="AddToNavMeshNoCopy"> + è¤‡è£½å¤±æ•—ï¼Œå› ç‚ºç‰©ä»¶ '[OBJ_NAME]' å°å°Žèˆªç¶²é¢æœ‰è²¢ç»ã€‚ + </notification> + <notification name="DupeWithNoRootsSelected"> + é¸å–äº†æ²’æœ‰æ ¹çš„é‡è¦†ç‰©ä»¶ã€‚ + </notification> + <notification name="CantDupeCuzRegionIsFull"> + ç„¡æ³•è¤‡è£½ç‰©ä»¶ï¼Œå› ç‚ºåœ°å€æ»¿è¼‰ã€‚ + </notification> + <notification name="CantDupeCuzParcelNotFound"> + 無法複製物件,找ä¸åˆ°å®ƒå€‘所在的地段。 + </notification> + <notification name="CantCreateCuzParcelFull"> + ç„¡æ³•å»ºç«‹ç‰©ä»¶ï¼Œå› ç‚º +地段滿載。 + </notification> + <notification name="RezAttemptFailed"> + 試圖產生物件失敗。 + </notification> + <notification name="ToxicInvRezAttemptFailed"> + 無法建立已在æ¤åœ°å€é€ æˆå•é¡Œçš„物件。 + </notification> + <notification name="InvItemIsBlacklisted"> + 該收ç´å€ç‰©é …已被列入黑å單。 + </notification> + <notification name="NoCanRezObjects"> + ä½ æ¤æ™‚無權建立物件。 + </notification> + <notification name="LandSearchBlocked"> + 土地æœå°‹éç¦ã€‚ +ä½ åœ¨çŸæ™‚間內進行了太多次土地æœå°‹ã€‚ +è«‹ç¨å€™å†è©¦ã€‚ + </notification> + <notification name="NotEnoughResourcesToAttach"> + 腳本資æºä¸è¶³ï¼Œç„¡æ³•é™„è‘—ç‰©ä»¶ï¼ + </notification> + <notification name="YouDiedAndGotTPHome"> + ä½ å·²ç¶“æ»äº¡ä¸¦ä¸”被瞬間傳é€å›žä½ 的家的ä½ç½® + </notification> + <notification name="EjectComingSoon"> + ä½ ä¸å†å…è¨±å¾…åœ¨é€™è£¡ï¼Œå¿…é ˆåœ¨ [EJECT_TIME] 秒內離開。 + </notification> + <notification name="NoEnterServerFull"> + ä½ ç„¡æ³•é€²å…¥é€™åœ°å€ï¼Œå› 為 +伺æœå™¨æ»¿è¼‰ã€‚ + </notification> + <notification name="SaveBackToInvDisabled"> + 「儲å˜å›žæ”¶ç´å€ã€åŠŸèƒ½å·²è¢«åœç”¨ã€‚ + </notification> + <notification name="NoExistNoSaveToContents"> + 無法將 '[OBJ_NAME]' 儲å˜åˆ°ç‰©ä»¶å…§å®¹ï¼Œå› 為產生它的來æºç‰©ä»¶å·²ä¸å˜åœ¨ã€‚ + </notification> + <notification name="NoModNoSaveToContents"> + ç„¡æ³•å„²å˜ [OBJ_NAME] åˆ°ç‰©ä»¶å…§å®¹ï¼Œä½ ç„¡æ¬Šä¿®æ”¹ '[DEST_NAME]' 物件。 + </notification> + <notification name="NoSaveBackToInvDisabled"> + 無法將 '[OBJ_NAME]' 儲å˜å›žæ”¶ç´å€ï¼Œæ¤å‹•ä½œå·²è¢«åœç”¨ã€‚ + </notification> + <notification name="NoCopyNoSelCopy"> + ç„¡æ³•è¤‡è£½ä½ æ‰€é¸çš„ï¼Œå› ç‚ºä½ ç„¡æ¬Šè¤‡è£½ç‰©ä»¶ '[OBJ_NAME]'。 + </notification> + <notification name="NoTransNoSelCopy"> + 無法é¸å–è¤‡è£½ï¼Œå› ç‚ºç‰©ä»¶ '[OBJ_NAME]' ä¸å¯è½‰ç§»ã€‚ + </notification> + <notification name="NoTransNoCopy"> + 無法é¸å–è¤‡è£½ï¼Œå› ç‚ºç‰©ä»¶ '[OBJ_NAME]' ä¸å¯è½‰ç§»ã€‚ + </notification> + <notification name="NoPermsNoRemoval"> + 權é™ç³»çµ±ä¸å…許從模擬器移除物件 '[OBJ_NAME]'。 + </notification> + <notification name="NoModNoSaveSelection"> + 無法儲å˜ä½ 所é¸çš„ï¼Œå› ç‚ºä½ ç„¡æ¬Šä¿®æ”¹ '[OBJ_NAME]' 物件。 + </notification> + <notification name="NoCopyNoSaveSelection"> + 無法儲å˜ä½ 所é¸çš„ï¼Œå› ç‚ºç‰©ä»¶ '[OBJ_NAME]' ä¸å¯è¤‡è£½ã€‚ + </notification> + <notification name="NoModNoTaking"> + 無法拿å–ä½ æ‰€é¸çš„ï¼Œå› ç‚ºä½ ç„¡æ¬Šä¿®æ”¹ '[OBJ_NAME]' 物件。 + </notification> + <notification name="RezDestInternalError"> + 內部錯誤:未知的目的地類型。 + </notification> + <notification name="DeleteFailObjNotFound"> + åˆªé™¤å¤±æ•—ï¼Œå› ç‚ºæ‰¾ä¸åˆ°ç‰©ä»¶ + </notification> + <notification name="SorryCantEjectUser"> + 抱æ‰ï¼Œç„¡æ³•è¸¢å‡ºè©²ç”¨æˆ¶ã€‚ + </notification> + <notification name="RegionSezNotAHome"> + æ¤åœ°å€ä¸è¨±ä½ 在æ¤è¨å®šã€Œæˆ‘的家ã€ã€‚ + </notification> + <notification name="HomeLocationLimits"> + ä½ åªèƒ½åœ¨è‡ªå·±çš„土地或大陸資訊ä¸å¿ƒä¸Šè¨å®šã€Œæˆ‘的家ã€ã€‚ + </notification> + <notification name="HomePositionSet"> + 我的家ä½ç½®å·²å®šã€‚ + </notification> + <notification name="AvatarEjected"> + 化身已被踢出。 + </notification> + <notification name="AvatarEjectFailed"> + è¸¢å‡ºå¤±æ•—ï¼Œå› ç‚ºä½ åœ¨è©²åœ°æ®µæ²’æœ‰ç®¡ç†å“¡æ¬Šé™ã€‚ + </notification> + <notification name="CantMoveObjectParcelFull"> + 無法移動 '[OBJECT_NAME]' 物件到 +åœ°å€ [REGION_NAME] çš„ [OBJ_POSITION]ï¼Œå› ç‚ºè©²ç›®æ¨™åœ°æ®µå·²æ»¿è¼‰ã€‚ + </notification> + <notification name="CantMoveObjectParcelPerms"> + 無法移動 '[OBJECT_NAME]' 物件到 +åœ°å€ [REGION_NAME] çš„ [OBJ_POSITION]ï¼Œå› ç‚ºæ¤åœ°æ®µä¸å…è¨±ä½ çš„ç‰©ä»¶ã€‚ + </notification> + <notification name="CantMoveObjectParcelResources"> + 無法移動 '[OBJECT_NAME]' 物件到 + [REGION_NAME] 地å€çš„ [OBJ_POSITION]ï¼Œå› ç‚ºæ¤åœ°æ®µè³‡æºä¸è¶³å®¹ç´æ¤ç‰©ä»¶ã€‚ + </notification> + <notification name="CantMoveObjectRegionVersion"> + 無法移動 '[OBJECT_NAME]' 物件到 + [REGION_NAME] 地å€çš„ [OBJ_POSITION]ï¼Œå› ç‚ºè©²åœ°å€æ‰€åŸ·è¡Œçš„軟體版本éŽèˆŠï¼Œä¸æ”¯æ´è·¨åœ°å€æŽ¥å—這個物件。 + </notification> + <notification name="CantMoveObjectNavMesh"> + 無法移動 '[OBJECT_NAME]' 物件到 +åœ°å€ [REGION_NAME] çš„ [OBJ_POSITION]ï¼Œå› ç‚ºä½ ä¸å¾—修改跨越地å€ç•Œé™çš„導航網é¢ã€‚ + </notification> + <notification name="CantMoveObjectWTF"> + 無法移動 '[OBJECT_NAME]' 物件到 +åœ°å€ [REGION_NAME] çš„ [OBJ_POSITION]ï¼ŒåŽŸå› ä¸æ˜Žã€‚ ([FAILURE_TYPE]) + </notification> + <notification name="NoPermModifyObject"> + ä½ ç„¡æ¬Šè®Šæ›´è©²ç‰©ä»¶ + </notification> + <notification name="CantEnablePhysObjContributesToNav"> + å°å°Žèˆªç¶²é¢æœ‰è²¢ç»çš„物件,無法啟用物ç†ã€‚ + </notification> + <notification name="CantEnablePhysKeyframedObj"> + éµæ ¼å‹•ç•«ç‰©ä»¶ç„¡æ³•å•Ÿç”¨ç‰©ç†ã€‚ + </notification> + <notification name="CantEnablePhysNotEnoughLandResources"> + 無法啟用物件的物ç†â€”—土地資æºä¸è¶³ã€‚ + </notification> + <notification name="CantEnablePhysCostTooGreat"> + 物件的物ç†è³‡æºæˆæœ¬è¶…éŽ [MAX_OBJECTS]ï¼Œç„¡æ³•å•Ÿç”¨ç‰©ç† + </notification> + <notification name="PhantomWithConcavePiece"> + æ¤ç‰©ä»¶ä¸å¾—有凹é¢éƒ¨ä»¶ï¼Œå› 為物件是幻影物件,å°å°Žèˆªç¶²é¢æœ‰è²¢ç»ã€‚ + </notification> + <notification name="UnableAddItem"> + ç„¡æ³•æ–°å¢žé …ç›®ï¼ + </notification> + <notification name="UnableEditItem"> + ç„¡æ³•ç·¨è¼¯é€™é …ç›®ï¼ + </notification> + <notification name="NoPermToEdit"> + ç„¡æ¬Šç·¨è¼¯é€™é …ç›®ã€‚ + </notification> + <notification name="NoPermToCopyInventory"> + 無權複製該收ç´å€ã€‚ + </notification> + <notification name="CantSaveItemDoesntExist"> + 無法儲å˜åˆ°ç‰©ä»¶å…§å®¹ï¼šè©²é …目已ä¸å˜åœ¨ã€‚ + </notification> + <notification name="CantSaveItemAlreadyExists"> + 無法儲å˜åˆ°ç‰©ä»¶å…§å®¹ï¼šæ”¶ç´å€å·²å˜åœ¨åŒåç¨±çš„é …ç›® + </notification> + <notification name="CantSaveModifyAttachment"> + 無法儲å˜åˆ°ç‰©ä»¶å…§å®¹ï¼šé€™éº¼åšå°‡ä¿®æ”¹é™„件的權é™ã€‚ + </notification> + <notification name="TooManyScripts"> + 腳本太多。 + </notification> + <notification name="UnableAddScript"> + ç„¡æ³•æ–°å¢žè…³æœ¬ï¼ + </notification> + <notification name="AssetServerTimeoutObjReturn"> + 資產伺æœå™¨æœªåœ¨æ£å¸¸æ™‚é–“å…§å應。 物件已返交模擬器。 + </notification> + <notification name="RegionDisablePhysicsShapes"> + 本地å€æœªå•Ÿç”¨ç‰©ç†å½¢ç‹€ã€‚ + </notification> + <notification name="NoModNavmeshAcrossRegions"> + ä½ ç„¡æ³•è®Šæ›´è·¨è¶Šåœ°å€ç•Œé™çš„導航網é¢ã€‚ + </notification> + <notification name="NoSetPhysicsPropertiesOnObjectType"> + 該物件類型ä¸å¾—è¨å®šç‰©ç†æ€§è³ªã€‚ + </notification> + <notification name="NoSetRootPrimWithNoShape"> + æ ¹å¹¾ä½•å…ƒä»¶ç„¡æ³•è¨æˆç„¡å½¢ç‹€ã€‚ + </notification> + <notification name="NoRegionSupportPhysMats"> + 本地å€æœªå•Ÿç”¨ç‰©ç†æ料。 + </notification> + <notification name="OnlyRootPrimPhysMats"> + åªèƒ½èª¿æ•´æ ¹å¹¾ä½•å…ƒä»¶çš„物ç†æ料。 + </notification> + <notification name="NoSupportCharacterPhysMats"> + å°šä¸æ”¯æ´è§’色è¨å®šç‰©ç†æ料。 + </notification> + <notification name="InvalidPhysMatProperty"> + 指定的物ç†æ料屬性ä¸ï¼Œè‡³å°‘有一個無效。 + </notification> + <notification name="NoPermsAlterStitchingMeshObj"> + 網é¢ç‰©ä»¶çš„縫åˆé¡žåž‹ä¸å¾—變更。 + </notification> + <notification name="NoPermsAlterShapeMeshObj"> + 網é¢ç‰©ä»¶çš„形狀ä¸å¾—變更。 + </notification> + <notification name="FullRegionCantEnter"> + ä½ ç„¡æ³•é€²å…¥é€™åœ°å€ï¼Œ\nå› ç‚ºåœ°å€æ»¿è¼‰ã€‚ + </notification> + <notification name="LinkFailedOwnersDiffer"> + è¯çµå¤±æ•———所有人ä¸åŒ + </notification> + <notification name="LinkFailedNoModNavmeshAcrossRegions"> + è¯çµå¤±æ•———無法修改跨越地å€ç•Œé™çš„導航網é¢ã€‚ + </notification> + <notification name="LinkFailedNoPermToEdit"> + è¯çµå¤±æ•—ï¼Œä½ ç„¡æ¬Šç·¨è¼¯ã€‚ + </notification> + <notification name="LinkFailedTooManyPrims"> + è¯çµå¤±æ•———幾何元件太多 + </notification> + <notification name="LinkFailedCantLinkNoCopyNoTrans"> + è¯çµå¤±æ•———無法將「ç¦æ¢è¤‡è£½ã€å’Œã€Œç¦æ¢è½‰ç§»ã€ç‰©ä»¶è¯çµèµ·ä¾† + </notification> + <notification name="LinkFailedNothingLinkable"> + è¯çµå¤±æ•———沒有å¯è¯çµçš„æ±è¥¿ã€‚ + </notification> + <notification name="LinkFailedTooManyPathfindingChars"> + è¯çµå¤±æ•———尋徑角色太多 + </notification> + <notification name="LinkFailedInsufficientLand"> + è¯çµå¤±æ•———土地資æºä¸è¶³ + </notification> + <notification name="LinkFailedTooMuchPhysics"> + 物件使用了éŽå¤šç‰©ç†è³‡æºï¼Œå…¶å‹•æ…‹ç‰¹æ€§å·²è¢«åœç”¨ã€‚ + </notification> + <notification name="TeleportedHomeByObjectOnParcel"> + ä½ å·²è¢« '[PARCEL_NAME]' 地段的物件 '[OBJECT_NAME]' æˆåŠŸçž¬é–“傳é€å›žå®¶ + </notification> + <notification name="TeleportedHomeByObject"> + ä½ å·²æˆåŠŸè¢«ç‰©ä»¶ '[OBJECT_NAME]' 瞬間傳é€å›žå®¶ + </notification> + <notification name="TeleportedByAttachment"> + ä½ å·²æˆåŠŸè¢« [ITEM_ID] ä¸Šçš„ä¸€å€‹é™„ä»¶çž¬é–“å‚³é€ + </notification> + <notification name="TeleportedByObjectOnParcel"> + ä½ å·²æˆåŠŸè¢« '[PARCEL_NAME]' 地段的物件 '[OBJECT_NAME]' çž¬é–“å‚³é€ + </notification> + <notification name="TeleportedByObjectOwnedBy"> + ä½ å·²æˆåŠŸè¢« [OWNER_ID] æ“有的物件 '[OBJECT_NAME]' çž¬é–“å‚³é€ + </notification> + <notification name="TeleportedByObjectUnknownUser"> + ä½ å·²æˆåŠŸè¢«æŸæœªçŸ¥ç”¨æˆ¶æ“有的物件 '[OBJECT_NAME]' 瞬間傳é€ã€‚ + </notification> + <notification name="CantCreateObjectRegionFull"> + 無法建立è¦æ±‚的物件。 地å€å·²æ»¿è¼‰ã€‚ + </notification> + <notification name="CantAttackMultipleObjOneSpot"> + ä½ ä¸èƒ½å°‡å¤šå€‹ç‰©ä»¶é™„著到åŒä¸€å€‹é»žã€‚ + </notification> + <notification name="CantCreateMultipleObjAtLoc"> + ä½ ä¸èƒ½åœ¨æ¤å»ºç«‹å¤šå€‹ç‰©ä»¶ã€‚ + </notification> + <notification name="UnableToCreateObjTimeOut"> + 無法建立è¦æ±‚的物件。 物件在資料庫ä¸æ‰¾ä¸åˆ°ã€‚ + </notification> + <notification name="UnableToCreateObjUnknown"> + 無法建立è¦æ±‚的物件。 è¦æ±‚逾時,無法完æˆã€‚ è«‹å†è©¦ä¸€æ¬¡ã€‚ + </notification> + <notification name="UnableToCreateObjMissingFromDB"> + 無法建立è¦æ±‚的物件。 è«‹å†è©¦ä¸€æ¬¡ã€‚ + </notification> + <notification name="RezFailureTookTooLong"> + 物件產生失敗,è¦æ±‚的物件載入時間太久。 + </notification> + <notification name="FailedToPlaceObjAtLoc"> + 無法將物件置於指定地點。 è«‹å†è©¦ä¸€æ¬¡ã€‚ + </notification> + <notification name="CantCreatePlantsOnLand"> + ä½ ä¸å¾—在這土地上建立æ¤ç‰©ã€‚ + </notification> + <notification name="CantRestoreObjectNoWorldPos"> + 無法æ¢å¾©ç‰©ä»¶ã€‚ 找ä¸åˆ°è™›æ“¬ä¸–界的ä½ç½®ã€‚ + </notification> + <notification name="CantRezObjectInvalidMeshData"> + 無法產生物件,它的網é¢è³‡æ–™ç„¡æ•ˆã€‚ + </notification> + <notification name="CantRezObjectTooManyScripts"> + ç„¡æ³•ç”¢ç”Ÿç‰©ä»¶ï¼Œå› ç‚ºé€™åœ°å€å·²æœ‰å¤ªå¤šçš„腳本。 + </notification> + <notification name="CantCreateObjectNoAccess"> + ä½ ç„¡æ¬Šåœ¨æ¤å»ºç«‹ç‰©ä»¶ã€‚ + </notification> + <notification name="CantCreateObject"> + ä½ æ¤æ™‚無權建立物件。 + </notification> + <notification name="InvalidObjectParams"> + 無效的物件åƒæ•¸ + </notification> + <notification name="CantDuplicateObjectNoAcess"> + ä½ æ¬Šé™ä¸å¤ ,無法在æ¤è¤‡è£½ç‰©ä»¶ã€‚ + </notification> + <notification name="CantChangeShape"> + ä½ ç„¡æ¬Šè®Šæ›´é€™å€‹å½¢ç‹€ã€‚ + </notification> + <notification name="NoAccessToClaimObjects"> + ä½ æ¬Šé™ä¸å¤ ,無法在æ¤æ”¶å–物件。 + </notification> + <notification name="DeedFailedNoPermToDeedForGroup"> + è®“æ¸¡å¤±æ•—ï¼Œä½ ç„¡æ¬Šç‚ºä½ çš„ç¾¤çµ„è®“æ¸¡ç‰©ä»¶ã€‚ + </notification> + <notification name="NoPrivsToBuyObject"> + ä½ æ¬Šé™ä¸å¤ ,無法在æ¤è³¼è²·ç‰©ä»¶ã€‚ + </notification> + <notification name="CantAttachObjectAvatarSittingOnIt"> + 無法附著物件,有個化身æ£å在物件上。 + </notification> + <notification name="WhyAreYouTryingToWearShrubbery"> + 樹和è‰ä¸èƒ½ç•¶é™„件穿戴。 + </notification> + <notification name="CantAttachGroupOwnedObjs"> + 無法附著群組所æ“有的物件。 + </notification> + <notification name="CantAttachObjectsNotOwned"> + 無法附著ä¸æ˜¯ä½ æ“有的物件。 + </notification> + <notification name="CantAttachNavmeshObjects"> + 無法附著å°å°Žèˆªç¶²é¢æœ‰è²¢ç»çš„物件。 + </notification> + <notification name="CantAttachObjectNoMovePermissions"> + ç„¡æ³•é™„è‘—ç‰©ä»¶ï¼Œä½ ç„¡æ¬Šç§»å‹•è©²ç‰©ä»¶ã€‚ + </notification> + <notification name="CantAttachNotEnoughScriptResources"> + 腳本資æºä¸è¶³ï¼Œç„¡æ³•é™„è‘—ç‰©ä»¶ï¼ + </notification> + <notification name="CantDropItemTrialUser"> + ä½ ç„¡æ³•åœ¨æ¤å¸é™¤ç‰©ä»¶ï¼Œè«‹åˆ°ã€Œè‡ªç”±å˜—試ã€å€åŸŸå†è©¦ã€‚ + </notification> + <notification name="CantDropMeshAttachment"> + ä½ ç„¡æ³•åœ¨æ¤å¸é™¤é™„件。 è«‹é¸æ“‡æŠŠå¸é™¤é™„件é€å›žæ”¶ç´å€ï¼Œå†é‡æ–°æˆå½¢ã€‚ + </notification> + <notification name="CantDropAttachmentNoPermission"> + å¸é™¤é™„ä»¶å¤±æ•—ï¼šä½ ç„¡æ¬Šåœ¨æ¤è™•å¸é™¤ã€‚ + </notification> + <notification name="CantDropAttachmentInsufficientLandResources"> + å¸é™¤é™„件失敗:å¯ç”¨åœŸåœ°è³‡æºä¸è¶³ã€‚ + </notification> + <notification name="CantDropAttachmentInsufficientResources"> + å¸é™¤é™„件失敗:å¯ç”¨è³‡æºä¸è¶³ã€‚ + </notification> + <notification name="CantDropObjectFullParcel"> + 無法在æ¤å¸é™¤ç‰©ä»¶ã€‚ 地段滿載。 + </notification> + <notification name="CantTouchObjectBannedFromParcel"> + 無法觸摸/抓å–æ¤ç‰©ä»¶ï¼Œå› ç‚ºä½ åœ¨è©²åœŸåœ°åœ°æ®µéç¦ã€‚ + </notification> + <notification name="PlzNarrowDeleteParams"> + 請將刪除åƒæ•¸ç¯„åœèª¿å°ä¸€é»žã€‚ + </notification> + <notification name="UnableToUploadAsset"> + 無法上傳資產。 + </notification> + <notification name="CantTeleportCouldNotFindUser"> + 找ä¸åˆ°è¦çž¬é–“傳é€åˆ°å®¶çš„用戶 + </notification> + <notification name="GodlikeRequestFailed"> + è¦æ±‚神的權力失敗 + </notification> + <notification name="GenericRequestFailed"> + 普通請求失敗 + </notification> + <notification name="CantUploadPostcard"> + 無法上傳明信片。 è«‹ç¨å€™å†è©¦ä¸€æ¬¡ã€‚ + </notification> + <notification name="CantFetchInventoryForGroupNotice"> + 無法å–得群組通知的收ç´å€ç´°ç¯€ã€‚ + </notification> + <notification name="CantSendGroupNoticeNotPermitted"> + 無法é€å‡ºç¾¤çµ„通知——未准許。 + </notification> + <notification name="CantSendGroupNoticeCantConstructInventory"> + 無法é€å‡ºç¾¤çµ„通知——收ç´å€å»ºç«‹å¤±æ•—。 + </notification> + <notification name="CantParceInventoryInNotice"> + 無法剖æžé€šçŸ¥è£¡çš„收ç´å“é …ã€‚ + </notification> + <notification name="TerrainUploadFailed"> + 地形上傳失敗。 + </notification> + <notification name="TerrainFileWritten"> + 地形檔案已寫入。 + </notification> + <notification name="TerrainFileWrittenStartingDownload"> + 地形檔案已寫入,開始下載…… + </notification> + <notification name="TerrainBaked"> + 地形已定貌。 + </notification> + <notification name="TenObjectsDisabledPlzRefresh"> + åªæˆåŠŸåœç”¨å‰ 10 個所é¸ç‰©ä»¶ã€‚ 若有需è¦ï¼Œè«‹åˆ·æ–°ä¹‹å¾Œå†é¸å–æ›´å¤šçš„é …ç›®ã€‚ + </notification> + <notification name="UpdateViewerBuyParcel"> + ä½ å¿…é ˆå…ˆæ›´æ–°ç€è¦½å™¨å¾Œï¼Œæ‰å¯è³¼è²·é€™å€‹åœ°æ®µã€‚ + </notification> + <notification name="CantBuyParcelNotForSale"> + 無法購買,æ¤åœ°æ®µä¸ä¾›å‡ºå”®ã€‚ + </notification> + <notification name="CantBuySalePriceOrLandAreaChanged"> + 無法購買,售價或土地é¢ç©å·²è®Šã€‚ + </notification> + <notification name="CantBuyParcelNotAuthorized"> + ä½ ä¸æ˜¯æ¤åœ°æ®µçš„ç²æŽˆæ¬Šçš„買主。 + </notification> + <notification name="CantBuyParcelAwaitingPurchaseAuth"> + ä½ ç„¡æ³•è³¼è²·æ¤åœ°æ®µï¼Œè©²åœ°æ®µå·²åœ¨ç‰å€™æ‰¹å‡†è³¼è²· + </notification> + <notification name="CantBuildOverflowParcel"> + ä½ ä¸å¾—在æ¤å»ºç«‹ç‰©ä»¶ï¼Œé€™éº¼åšå°‡å°Žè‡´åœ°æ®µè¶…載。 + </notification> + <notification name="SelectedMultipleOwnedLand"> + ä½ é¸æ“‡çš„土地範åœï¼Œç‚ºä¸åŒäººæ‰€æ“有。 請縮å°é¸æ“‡ç¯„åœï¼Œå†è©¦ä¸€æ¬¡ã€‚ + </notification> + <notification name="CantJoinTooFewLeasedParcels"> + 未é¸å–è¶³å¤ ç§Ÿç”¨åœ°æ®µï¼Œç„¡æ³•åˆä½µã€‚ + </notification> + <notification name="CantDivideLandMultipleParcelsSelected"> + 無法分割土地,\nå› ç‚ºä½ é¸å–了多個地段,\n請縮å°æ‰€é¸åœŸåœ°ã€‚ + </notification> + <notification name="CantDivideLandCantFindParcel"> + 無法分割土地。\n找ä¸åˆ°åœ°æ®µã€‚\n請到「幫助 > å›žå ±éŒ¯èª¤â€¦â€¦ã€å›žå ±å•é¡Œ + </notification> + <notification name="CantDivideLandWholeParcelSelected"> + 無法分割土地。 é¸å–了整個地段。\n請試著縮å°æ‰€é¸çš„土地。 + </notification> + <notification name="LandHasBeenDivided"> + 土地分割æˆåŠŸã€‚ + </notification> + <notification name="PassPurchased"> + ä½ è³¼è²·äº†é€šè¡Œæ¬Šã€‚ + </notification> + <notification name="RegionDisallowsClassifieds"> + 地å€ä¸å…許分類廣告。 + </notification> + <notification name="LandPassExpireSoon"> + ä½ åœ¨æ¤åœŸåœ°çš„通行權å³å°‡åˆ°æœŸå¤±æ•ˆã€‚ + </notification> + <notification name="CantSitNoSuitableSurface"> + 沒有åˆé©çš„表é¢è®“ä½ å下,請試一試別處。 + </notification> + <notification name="CantSitNoRoom"> + é€™è£¡æ²’æœ‰ç©ºé–“è®“ä½ å下,請試試å¦ä¸€è™•ã€‚ + </notification> + <notification name="ClaimObjectFailedNoPermission"> + 收å–ç‰©ä»¶å¤±æ•—ï¼Œå› ç‚ºä½ æ¬Šé™ä¸è¶³ã€‚ + </notification> + <notification name="ClaimObjectFailedNoMoney"> + 收å–ç‰©ä»¶å¤±æ•—ï¼Œå› ç‚ºä½ L$ 金é¡ä¸è¶³ã€‚ + </notification> + <notification name="CantDeedGroupLand"> + 無法讓渡群組所æ“有的土地。 + </notification> + <notification name="BuyObjectFailedNoMoney"> + è³¼è²·ç‰©ä»¶å¤±æ•—ï¼Œä½ L$ 金é¡ä¸è¶³ã€‚ + </notification> + <notification name="BuyInventoryFailedNoMoney"> + 購買收ç´å€å¤±æ•—ï¼Œä½ L$ 金é¡ä¸è¶³ã€‚ + </notification> + <notification name="BuyPassFailedNoMoney"> + ä½ çš„ L$ ä¸è¶³ï¼Œç„¡æ³•è³¼è²·æ¤åœŸåœ°çš„通行權。 + </notification> + <notification name="CantBuyPassTryAgain"> + æ¤æ™‚無法購買通行權。 è«‹ç¨å€™å†è©¦ä¸€æ¬¡ã€‚ + </notification> + <notification name="CantCreateObjectParcelFull"> + 無法建立物件,\n地段滿載。 + </notification> + <notification name="FailedPlacingObject"> + 無法將物件置於指定地點。 è«‹å†è©¦ä¸€æ¬¡ã€‚ + </notification> + <notification name="CantCreateLandmarkForEvent"> + 無法為活動建立地標。 + </notification> + <notification name="GodBeatsFreeze"> + ä½ æ“有的神力解除了å‡çµï¼ + </notification> + <notification name="SpecialPowersRequestFailedLogged"> + è¦æ±‚特殊能力失敗。 該è¦æ±‚已載入記錄。 + </notification> + <notification name="ExpireExplanation"> + 系統æ¤æ™‚無法處ç†ä½ çš„è¦æ±‚。 è¦æ±‚逾時,無法完æˆã€‚ + </notification> + <notification name="DieExplanation"> + 系統無法處ç†ä½ çš„è¦æ±‚。 + </notification> + <notification name="AddPrimitiveFailure"> + 金é¡ä¸è¶³ï¼Œç„¡æ³•å»ºç«‹å¹¾ä½•å…ƒä»¶ã€‚ + </notification> + <notification name="RezObjectFailure"> + 金é¡ä¸è¶³ï¼Œç„¡æ³•å»ºç«‹ç‰©ä»¶ã€‚ + </notification> + <notification name="ResetHomePositionNotLegal"> + å·²é‡è¨ã€Œæˆ‘的家ã€ä½ç½®ï¼Œå› 為å‰ä¸€å€‹ä½ç½®ä¸åˆæ³•ã€‚ + </notification> + <notification name="CantInviteRegionFull"> + æ¤åˆ»ä½ ç„¡æ³•é‚€è«‹ä»»ä½•äººåˆ°ä½ çš„ä½ç½®ï¼Œå› 為地å€æ»¿è¼‰ã€‚ è«‹ç¨å€™å†è©¦ä¸€æ¬¡ã€‚ + </notification> + <notification name="CantSetHomeAtRegion"> + æ¤åœ°å€ä¸è¨±ä½ 在æ¤è¨å®šã€Œæˆ‘的家ã€ã€‚ + </notification> + <notification name="ListValidHomeLocations"> + ä½ åªèƒ½åœ¨è‡ªå·±çš„土地或大陸資訊ä¸å¿ƒä¸Šè¨å®šã€Œæˆ‘的家ã€ã€‚ + </notification> + <notification name="SetHomePosition"> + 我的家ä½ç½®å·²å®šã€‚ + </notification> + <notification name="CantDerezInventoryError"> + 收ç´å€å‡ºéŒ¯ï¼Œç„¡æ³•æ”¶ç´ç‰©ä»¶ã€‚ + </notification> + <notification name="CantCreateRequestedInv"> + 無法建立è¦æ±‚的收ç´å€ã€‚ + </notification> + <notification name="CantCreateRequestedInvFolder"> + 無法建立è¦æ±‚的收ç´å€è³‡æ–™å¤¾ã€‚ + </notification> + <notification name="CantCreateInventory"> + 無法建立該收ç´å€ã€‚ + </notification> + <notification name="CantCreateLandmark"> + 無法建立地標。 + </notification> + <notification name="CantCreateOutfit"> + æ¤æ™‚無法建立è£æ‰®ã€‚ è«‹éŽä¸€åˆ†é˜å¾Œå†è©¦ã€‚ + </notification> + <notification name="InventoryNotForSale"> + 收ç´å€æ²’有待售。 + </notification> + <notification name="CantFindInvItem"> + 找ä¸åˆ°æ”¶ç´å€ç‰©é …。 + </notification> + <notification name="CantFindObject"> + 找ä¸åˆ°ç‰©ä»¶ã€‚ + </notification> + <notification name="CantTransfterMoneyRegionDisabled"> + æ¤åœ°å€ç›®å‰æœªå•Ÿç”¨è½‰ç§»é‡‘錢給物件的功能。 + </notification> + <notification name="CantPayNoAgent"> + 無法決定付款給誰。 + </notification> + <notification name="CantDonateToPublicObjects"> + ä½ ç„¡æ³•å°‡ L$ é€çµ¦å…¬å…±ç‰©ä»¶ã€‚ + </notification> + <notification name="InventoryCreationInWorldObjectFailed"> + é‡å°è™›æ“¬ä¸–界物件建立收ç´å€å¤±æ•—。 + </notification> + <notification name="UserBalanceOrLandUsageError"> + ç™¼ç”Ÿå…§éƒ¨éŒ¯èª¤ï¼Œæˆ‘å€‘ç„¡æ³•å¦‚å¸¸æ›´æ–°ä½ çš„ç€è¦½å™¨ã€‚ ä½ ç€è¦½å™¨é¡¯ç¤ºçš„ L$ 餘é¡æˆ–æ“有地段,å¯èƒ½å’Œä¼ºæœå™¨ä¸Šçš„æ£ç¢ºæ•¸é¡ä¸ä¸€è‡´ã€‚ + </notification> + <notification name="LargePrimAgentIntersect"> + 無法建立和其他åƒèˆ‡è€…發生交截的大型幾何元件。 è«‹ç‰å…¶ä»–åƒèˆ‡è€…移開後å†è©¦ã€‚ + </notification> + <notification name="PreferenceChatClearLog"> + 這動作將刪除先å‰äº¤è«‡çš„記錄,和所有記錄備份。 + <usetemplate ignoretext="刪除先å‰äº¤è«‡è¨˜éŒ„å‰ï¼Œå…ˆå‘我確èªã€‚" name="okcancelignore" notext="å–消" yestext="確定"/> + </notification> + <notification name="PreferenceChatDeleteTranscripts"> + 這將刪除所有先å‰äº¤è«‡çš„內容記錄。 éŽåŽ»äº¤è«‡æ·å²æ¸…å–®ä¸å—影響。 資料夾 [FOLDER] 所有副檔å .txt å’Œ txt.backup 的檔案都將刪除。 + <usetemplate ignoretext="刪除交談內容記錄å‰å…ˆå‘我確èªã€‚" name="okcancelignore" notext="å–消" yestext="確定"/> + </notification> + <notification name="PreferenceChatPathChanged"> + 無法移動檔案。 å·²æ¢å¾©å‰ä¸€å€‹è·¯å¾‘。 + <usetemplate ignoretext="無法移動檔案。 å·²æ¢å¾©å‰ä¸€å€‹è·¯å¾‘。" name="okignore" yestext="確定"/> + </notification> </notifications> diff --git a/indra/newview/skins/default/xui/zh/panel_avatar_list_item.xml b/indra/newview/skins/default/xui/zh/panel_avatar_list_item.xml index 1c8b56b3d6..e0a49a0add 100644 --- a/indra/newview/skins/default/xui/zh/panel_avatar_list_item.xml +++ b/indra/newview/skins/default/xui/zh/panel_avatar_list_item.xml @@ -27,5 +27,6 @@ <icon name="permission_edit_mine_icon" tool_tip="這ä½æœ‹å‹èƒ½ç·¨è¼¯ã€åˆªé™¤æˆ–å–å¾—ä½ çš„ç‰©ä»¶"/> <icon name="permission_map_icon" tool_tip="這ä½æœ‹å‹èƒ½åœ¨åœ°åœ–ä¸Šæ‰¾åˆ°ä½ çš„ä½ç½®"/> <icon name="permission_online_icon" tool_tip="這ä½æœ‹å‹ç•¶ä½ 上線能看到訊æ¯"/> + <button name="info_btn" tool_tip="詳情"/> <button name="profile_btn" tool_tip="察看檔案"/> </panel> diff --git a/indra/newview/skins/default/xui/zh/panel_block_list_sidetray.xml b/indra/newview/skins/default/xui/zh/panel_block_list_sidetray.xml index 1dfa024138..9f59bb32f8 100644 --- a/indra/newview/skins/default/xui/zh/panel_block_list_sidetray.xml +++ b/indra/newview/skins/default/xui/zh/panel_block_list_sidetray.xml @@ -1,10 +1,11 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="block_list_panel"> - <text name="title_text"> - å°éŽ–清單 - </text> - <scroll_list name="blocked" tool_tip="ç›®å‰å°éŽ–的居民清單"/> - <button label="å°éŽ–他人" name="Block resident..." tool_tip="挑é¸ä¸€ä½å±…民以進行å°éŽ–"/> - <button label="ä¾å稱å°éŽ–物件" name="Block object by name..." tool_tip="ä¾å稱挑é¸ä¸€å€‹ç‰©ä»¶é€²è¡Œå°éŽ–"/> - <button label="解除å°éŽ–" name="Unblock" tool_tip="將居民或物件由å°éŽ–清單ä¸ç§»é™¤"/> + <panel label="bottom_panel" name="blocked_buttons_panel"> + <filter_editor label="éŽæ¿¾å™¨" name="blocked_filter_input"/> + <menu_button name="blocked_gear_btn" tool_tip="å°æ‰€é¸çš„人或物件採å–動作"/> + <menu_button name="view_btn" tool_tip="排åºé¸é …"/> + <menu_button name="plus_btn" tool_tip="挑é¸ä¸€ä½å±…æ°‘æˆ–ç‰©ä»¶ï¼ŒåŠ ä»¥å°éŽ–"/> + <button name="unblock_btn" tool_tip="將居民或物件由å°éŽ–清單ä¸ç§»é™¤"/> + </panel> + <block_list name="blocked" tool_tip="ç›®å‰å°éŽ–的居民清單"/> </panel> diff --git a/indra/newview/skins/default/xui/zh/panel_conversation_list_item.xml b/indra/newview/skins/default/xui/zh/panel_conversation_list_item.xml new file mode 100644 index 0000000000..6524d41645 --- /dev/null +++ b/indra/newview/skins/default/xui/zh/panel_conversation_list_item.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="conversation_list_item"> + <layout_stack name="conversation_item_stack"> + <layout_panel name="conversation_title_panel"> + <text name="conversation_title" value="(載入ä¸ï¼‰"/> + </layout_panel> + </layout_stack> +</panel> diff --git a/indra/newview/skins/default/xui/zh/panel_conversation_log_list_item.xml b/indra/newview/skins/default/xui/zh/panel_conversation_log_list_item.xml new file mode 100644 index 0000000000..8446ce2130 --- /dev/null +++ b/indra/newview/skins/default/xui/zh/panel_conversation_log_list_item.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="conversation_log_list_item"> + <icon name="voice_session_icon" tool_tip="包å«èªžéŸ³äº¤è«‡"/> + <icon name="unread_ims_icon" tool_tip="訊æ¯åœ¨ä½ 登出期間傳來"/> + <button name="delete_btn" tool_tip="移除æ¤é …ç›®"/> +</panel> diff --git a/indra/newview/skins/default/xui/zh/panel_group_list_item.xml b/indra/newview/skins/default/xui/zh/panel_group_list_item.xml index 175293cdf7..fec4bb572a 100644 --- a/indra/newview/skins/default/xui/zh/panel_group_list_item.xml +++ b/indra/newview/skins/default/xui/zh/panel_group_list_item.xml @@ -1,5 +1,6 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="group_list_item"> <text name="group_name" value="未知"/> + <button name="info_btn" tool_tip="詳情"/> <button name="profile_btn" tool_tip="察看檔案"/> </panel> diff --git a/indra/newview/skins/default/xui/zh/panel_people.xml b/indra/newview/skins/default/xui/zh/panel_people.xml index 59ea7b70e2..5f7aca387a 100644 --- a/indra/newview/skins/default/xui/zh/panel_people.xml +++ b/indra/newview/skins/default/xui/zh/panel_people.xml @@ -14,81 +14,53 @@ <string name="no_filtered_friends_msg"> 找ä¸åˆ°ä½ è¦æ‰¾çš„嗎? 請試試[secondlife:///app/search/people/[SEARCH_TERM] æœå°‹]。 </string> - <string name="people_filter_label" value="人員éŽæ¿¾å™¨"/> - <string name="groups_filter_label" value="群組éŽæ¿¾å™¨"/> <string name="no_filtered_groups_msg" value="找ä¸åˆ°ä½ è¦æ‰¾çš„嗎? 請試試[secondlife:///app/search/groups/[SEARCH_TERM] æœå°‹]。"/> <string name="no_groups_msg" value="è¦å°‹æ‰¾ç¾¤çµ„è€ƒæ…®åŠ å…¥å—Žï¼Ÿ 請試試[secondlife:///app/search/groups æœå°‹]。"/> <string name="MiniMapToolTipMsg" value="[REGION](雙擊以開啟地圖,按下 shift éµæ‹–曳來平移)"/> <string name="AltMiniMapToolTipMsg" value="[REGION](雙擊以瞬間傳é€ï¼ŒæŒ‰ä¸‹ shift éµæ‹–曳來平移)"/> - <filter_editor label="éŽæ¿¾å™¨" name="filter_input"/> <tab_container name="tabs"> <panel label="附近" name="nearby_panel"> - <panel label="bottom_panel" name="bottom_panel"> - <menu_button name="nearby_view_sort_btn" tool_tip="é¸é …"/> - <button name="add_friend_btn" tool_tip="æ·»åŠ æ‰€é¸çš„å±…æ°‘åˆ°ä½ çš„æœ‹å‹æ¸…å–®"/> + <panel label="bottom_panel" name="nearby_buttons_panel"> + <filter_editor label="人員éŽæ¿¾å™¨" name="nearby_filter_input"/> + <button name="gear_btn" tool_tip="å°é¸å–的人採å–動作"/> + <menu_button name="nearby_view_btn" tool_tip="檢視/排åºçš„é¸é …"/> + <button name="add_friend_btn" tool_tip="å‘æŸä½å±…民發出交å‹é‚€è«‹"/> + <dnd_button name="nearby_del_btn" tool_tip="å°‡é¸å–的人從朋å‹å單移除"/> </panel> </panel> - <panel label="我的朋å‹" name="friends_panel"> + <panel label="朋å‹" name="friends_panel"> + <panel label="bottom_panel" name="friends_buttons_panel"> + <filter_editor label="人員éŽæ¿¾å™¨" name="friends_filter_input"/> + <button name="gear_btn" tool_tip="å°é¸å–的人採å–動作"/> + <menu_button name="friends_view_btn" tool_tip="檢視/排åºçš„é¸é …"/> + <button name="friends_add_btn" tool_tip="å‘æŸä½å±…民發出交å‹é‚€è«‹"/> + <dnd_button name="friends_del_btn" tool_tip="å°‡é¸å–的人從朋å‹å單移除"/> + </panel> <accordion name="friends_accordion"> <accordion_tab name="tab_online" title="上線"/> <accordion_tab name="tab_all" title="全部"/> </accordion> - <panel label="bottom_panel" name="bottom_panel"> - <layout_stack name="bottom_panel"> - <layout_panel name="options_gear_btn_panel"> - <menu_button name="friends_viewsort_btn" tool_tip="顯示é¡å¤–é¸é …"/> - </layout_panel> - <layout_panel name="add_btn_panel"> - <button name="add_btn" tool_tip="å‘居民發出交å‹é‚€è«‹"/> - </layout_panel> - <layout_panel name="trash_btn_panel"> - <dnd_button name="del_btn" tool_tip="ç”±ä½ çš„æœ‹å‹æ¸…單移除所é¸æ“‡çš„人"/> - </layout_panel> - </layout_stack> - </panel> </panel> - <panel label="我的群組" name="groups_panel"> - <panel label="bottom_panel" name="bottom_panel"> - <menu_button name="groups_viewsort_btn" tool_tip="é¸é …"/> - <button name="plus_btn" tool_tip="åŠ å…¥ç¾¤çµ„/創立新群組"/> - <button name="activate_btn" tool_tip="啟用所é¸æ“‡çš„群組"/> + <panel label="群組" name="groups_panel"> + <panel label="bottom_panel" name="groups_buttons_panel"> + <filter_editor label="群組éŽæ¿¾å™¨" name="groups_filter_input"/> + <menu_button name="groups_gear_btn" tool_tip="å°æ‰€é¸ç¾¤çµ„採å–動作"/> + <menu_button name="groups_view_btn" tool_tip="檢視/排åºçš„é¸é …"/> + <menu_button name="plus_btn" tool_tip="åŠ å…¥ç¾¤çµ„/創立新群組"/> + <dnd_button name="minus_btn" tool_tip="離開所é¸ç¾¤çµ„"/> </panel> </panel> <panel label="最近" name="recent_panel"> - <panel label="bottom_panel" name="bottom_panel"> - <menu_button name="recent_viewsort_btn" tool_tip="é¸é …"/> - <button name="add_friend_btn" tool_tip="æ·»åŠ æ‰€é¸çš„å±…æ°‘åˆ°ä½ çš„æœ‹å‹æ¸…å–®"/> + <panel label="bottom_panel" name="recent_buttons_panel"> + <filter_editor label="人員éŽæ¿¾å™¨" name="recent_filter_input"/> + <button name="gear_btn" tool_tip="å°é¸å–的人採å–動作"/> + <menu_button name="recent_view_btn" tool_tip="檢視/排åºçš„é¸é …"/> + <button name="add_friend_btn" tool_tip="å‘æŸä½å±…民發出交å‹é‚€è«‹"/> + <dnd_button name="recent_del_btn" tool_tip="å°‡é¸å–的人從朋å‹å單移除"/> </panel> </panel> + <panel label="å·²å°éŽ–çš„" name="blocked_panel"> + <panel label="被å°éŽ–的居民與物件" name="panel_block_list_sidetray"/> + </panel> </tab_container> - <panel name="button_bar"> - <layout_stack name="bottom_bar_ls"> - <layout_panel name="view_profile_btn_lp"> - <button label="檔案" name="view_profile_btn" tool_tip="顯示圖片ã€ç¾¤çµ„與其他居民資訊"/> - </layout_panel> - <layout_panel name="im_btn_lp"> - <button label="IM" name="im_btn" tool_tip="é–‹å•Ÿå³æ™‚訊æ¯æœƒè©±"/> - </layout_panel> - <layout_panel name="call_btn_lp"> - <button label="通話" name="call_btn" tool_tip="和這ä½å±…民通話"/> - </layout_panel> - <layout_panel name="share_btn_lp"> - <button label="分享" name="share_btn" tool_tip="分享一個收ç´å€ç‰©å“"/> - </layout_panel> - <layout_panel name="teleport_btn_lp"> - <button label="瞬間傳é€" name="teleport_btn" tool_tip="發出瞬間傳é€é‚€è«‹"/> - </layout_panel> - </layout_stack> - <layout_stack name="bottom_bar_ls1"> - <layout_panel name="group_info_btn_lp"> - <button label="群組檔案" name="group_info_btn" tool_tip="顯示群組資訊"/> - </layout_panel> - <layout_panel name="chat_btn_lp"> - <button label="群組èŠå¤©" name="chat_btn" tool_tip="é–‹å•ŸèŠå¤©æœƒè©±"/> - </layout_panel> - <layout_panel name="group_call_btn_lp"> - <button label="群組通話" name="group_call_btn" tool_tip="與æ¤ç¾¤çµ„進行通話"/> - </layout_panel> - </layout_stack> - </panel> </panel> diff --git a/indra/newview/skins/default/xui/zh/panel_preferences_chat.xml b/indra/newview/skins/default/xui/zh/panel_preferences_chat.xml index cf2f81d313..e700e35516 100644 --- a/indra/newview/skins/default/xui/zh/panel_preferences_chat.xml +++ b/indra/newview/skins/default/xui/zh/panel_preferences_chat.xml @@ -1,34 +1,86 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel label="æ–‡å—èŠå¤©" name="chat"> - <text name="font_size"> - å—型尺寸: - </text> - <radio_group name="chat_font_size"> - <radio_item label="å°" name="radio" value="0"/> - <radio_item label="ä¸" name="radio2" value="1"/> - <radio_item label="大" name="radio3" value="2"/> - </radio_group> - <check_box initial_value="true" label="èŠå¤©æ™‚æ’放打å—動作" name="play_typing_animation"/> - <check_box label="當我離線時將收到的 IM 訊æ¯éƒµå¯„給我" name="send_im_to_email"/> - <check_box label="啟用純本文 IM 與èŠå¤©æ·å²ç´€éŒ„" name="plain_text_chat_history"/> - <check_box label="èŠå¤©æ³¡æ³¡" name="bubble_text_chat"/> - <text name="show_ims_in_label"> - 顯示 IMs 於: - </text> - <text name="requires_restart_label"> - ï¼ˆé ˆé‡æ–°å•Ÿå‹•ï¼‰ - </text> - <radio_group name="chat_window" tool_tip="é¡¯ç¤ºä½ çš„å³æ™‚訊æ¯åœ¨åˆ†é–‹çš„浮動視窗,或是使用很多é ç±¤çš„å–®ä¸€æµ®å‹•è¦–çª—ï¼ˆé ˆé‡æ–°å•Ÿå‹•ï¼‰"> - <radio_item label="分開視窗" name="radio" value="0"/> - <radio_item label="é 籤" name="radio2" value="1"/> - </radio_group> - <text name="disable_toast_label"> - 啟用傳入èŠå¤©çš„çªé¡¯ç¤ºè¦–窗: - </text> - <check_box label="群組èŠå¤©" name="EnableGroupChatPopups" tool_tip="當群組èŠå¤©è¨Šæ¯æŠµé”時查看çªé¡¯å¼è¦–窗"/> - <check_box label="IM èŠå¤©" name="EnableIMChatPopups" tool_tip="當å³æ™‚訊æ¯æŠµé”時查看çªé¡¯å¼è¦–窗"/> - <spinner label="附近èŠå¤©å…§å®¹æ示框åœé§æ™‚間:" name="nearby_toasts_lifetime"/> - <spinner label="附近èŠå¤©å…§å®¹æ示框消退時間:" name="nearby_toasts_fadingtime"/> + <panel> + <check_box initial_value="true" label="èŠå¤©æ™‚æ’放打å—動作" name="play_typing_animation"/> + <check_box label="當我離線時將收到的 IM 訊æ¯éƒµå¯„給我" name="send_im_to_email"/> + <check_box label="åªæœ‰æˆ‘的朋å‹å’Œç¾¤çµ„å¯ä»¥ IM 或與我通話。" name="voice_call_friends_only_check"/> + <text name="font_size"> + å—型尺寸: + </text> + <combo_box name="chat_font_size"> + <item label="å°" name="Small" value="0"/> + <item label="ä¸" name="Medium" value="1"/> + <item label="大" name="Large" value="2"/> + </combo_box> + <check_box label="èŠå¤©æ³¡æ³¡" name="bubble_text_chat"/> + </panel> + <panel> + <text name="notifications"> + 通知 + </text> + <text name="friend_ims"> + æœ‹å‹ IM: + </text> + <combo_box name="FriendIMOptions"> + <item label="開啟交談視窗" name="OpenConversationsWindow" value="openconversations"/> + <item label="以çªé¡¯å¼è¦–窗顯示訊æ¯" name="PopUpMessage" value="toast"/> + <item label="Flash 工具列按鈕" name="FlashToolbarButton" value="flash"/> + <item label="ç„¡" name="None" value="ç„¡"/> + </combo_box> + <text name="non_friend_ims"> + éžæœ‹å‹ IM: + </text> + <combo_box name="NonFriendIMOptions"> + <item label="開啟交談視窗" name="OpenConversationsWindow" value="openconversations"/> + <item label="以çªé¡¯å¼è¦–窗顯示訊æ¯" name="PopUpMessage" value="toast"/> + <item label="Flash 工具列按鈕" name="FlashToolbarButton" value="flash"/> + <item label="ç„¡" name="None" value="ç„¡"/> + </combo_box> + <text name="conference_ims"> + 多方交談 IM: + </text> + <combo_box name="ConferenceIMOptions"> + <item label="開啟交談視窗" name="OpenConversationsWindow" value="openconversations"/> + <item label="以çªé¡¯å¼è¦–窗顯示訊æ¯" name="PopUpMessage" value="toast"/> + <item label="Flash 工具列按鈕" name="FlashToolbarButton" value="flash"/> + <item label="ç„¡" name="None" value="ç„¡"/> + </combo_box> + <text name="group_chat"> + 群組èŠå¤©ï¼š + </text> + <combo_box name="GroupChatOptions"> + <item label="開啟交談視窗" name="OpenConversationsWindow" value="openconversations"/> + <item label="以çªé¡¯å¼è¦–窗顯示訊æ¯" name="PopUpMessage" value="toast"/> + <item label="Flash 工具列按鈕" name="FlashToolbarButton" value="flash"/> + <item label="ç„¡" name="None" value="ç„¡"/> + </combo_box> + <text name="nearby_chat"> + 附近的èŠå¤©ï¼š + </text> + <combo_box name="NearbyChatOptions"> + <item label="開啟交談視窗" name="OpenConversationsWindow" value="openconversations"/> + <item label="以çªé¡¯å¼è¦–窗顯示訊æ¯" name="PopUpMessage" value="toast"/> + <item label="Flash 工具列按鈕" name="FlashToolBarButton" value="flash"/> + <item label="ç„¡" name="None" value="ç„¡"/> + </combo_box> + <text name="notifications_alert"> + è‹¥è¦æš«æ™‚åœæ¢æ‰€æœ‰é€šçŸ¥ï¼Œè«‹è¨å®šã€Œæºé€š > 請勿打擾ã€ã€‚ + </text> + </panel> + <panel> + <text name="play_sound"> + æ’放è²éŸ³ï¼š + </text> + <check_box label="新交談" name="new_conversation"/> + <check_box label="語音通話來電" name="incoming_voice_call"/> + <check_box label="瞬間傳é€é‚€è«‹" name="teleport_offer"/> + <check_box label="收ç´ç‰©å“è´ˆé€" name="inventory_offer"/> + </panel> + <panel> + <button label="清空記錄……" name="clear_log"/> + <button label="刪除交談內容記錄……" name="delete_transcripts"/> + <button label="ç€è¦½â€¦" label_selected="ç€è¦½" name="log_path_button"/> + </panel> <button label="ç¿»è¯â€¦" name="ok_btn"/> <button label="自動å–代…" name="autoreplace_showgui"/> <button label="拼å—檢查…" name="spellcheck_showgui"/> diff --git a/indra/newview/skins/default/xui/zh/panel_preferences_general.xml b/indra/newview/skins/default/xui/zh/panel_preferences_general.xml index 7e67a0d02d..044edbed70 100644 --- a/indra/newview/skins/default/xui/zh/panel_preferences_general.xml +++ b/indra/newview/skins/default/xui/zh/panel_preferences_general.xml @@ -68,9 +68,9 @@ <combo_box.item label="絕ä¸" name="item4"/> </combo_box> <text name="text_box3"> - 忙碌模å¼å›žæ‡‰ï¼š + 「請勿打擾ã€é è¨å›žæ‡‰ï¼š </text> - <text_editor name="busy_response"> + <text_editor name="do_not_disturb_response"> log_in_to_change </text_editor> </panel> diff --git a/indra/newview/skins/default/xui/zh/sidepanel_task_info.xml b/indra/newview/skins/default/xui/zh/sidepanel_task_info.xml index 982dde4010..60f44a3d88 100644 --- a/indra/newview/skins/default/xui/zh/sidepanel_task_info.xml +++ b/indra/newview/skins/default/xui/zh/sidepanel_task_info.xml @@ -72,6 +72,7 @@ <combo_box.item label="購買物件" name="Buyobject"/> <combo_box.item label="支付物件" name="Payobject"/> <combo_box.item label="打開" name="Open"/> + <combo_box.item label="縮放" name="Zoom"/> </combo_box> <panel name="perms_inv"> <text name="perm_modify"> diff --git a/indra/newview/skins/default/xui/zh/strings.xml b/indra/newview/skins/default/xui/zh/strings.xml index 7e17ed6864..31713ac281 100644 --- a/indra/newview/skins/default/xui/zh/strings.xml +++ b/indra/newview/skins/default/xui/zh/strings.xml @@ -614,8 +614,8 @@ http://secondlife.com/viewer-access-faq <string name="AvatarAway"> 離開 </string> - <string name="AvatarBusy"> - 忙碌 + <string name="AvatarDoNotDisturb"> + 請勿打擾 </string> <string name="AvatarMuted"> å°éŽ–çš„ @@ -851,6 +851,12 @@ http://secondlife.com/viewer-access-faq <string name="ST_NO_JOINT"> 找ä¸åˆ° ROOT 或旋軸。 </string> + <string name="NearbyChatTitle"> + 附近的èŠå¤©ä¸ + </string> + <string name="NearbyChatLabel"> + (附近的èŠå¤©ï¼‰ + </string> <string name="whisper"> 低語: </string> @@ -914,12 +920,15 @@ http://secondlife.com/viewer-access-faq <string name="ControlYourCamera"> æŽ§åˆ¶ä½ çš„æ”影機 </string> - <string name="TeleportYourAgent"> - 瞬間傳é€ä½ 本人 - </string> <string name="NotConnected"> 未è¯æŽ¥ </string> + <string name="AgentNameSubst"> + ï¼ˆä½ ï¼‰ + </string> + <string name="TeleportYourAgent"> + 瞬間傳é€ä½ 本人 + </string> <string name="SIM_ACCESS_PG"> 一般普級 </string> @@ -1001,18 +1010,6 @@ http://secondlife.com/viewer-access-faq <string name="dictionary_files"> å—å…¸ </string> - <string name="AvatarSetNotAway"> - éžé›¢é–‹ - </string> - <string name="AvatarSetAway"> - 離開 - </string> - <string name="AvatarSetNotBusy"> - éžå¿™ç¢Œ - </string> - <string name="AvatarSetBusy"> - 忙碌 - </string> <string name="shape"> 體形 </string> @@ -1981,8 +1978,8 @@ http://secondlife.com/viewer-access-faq <string name="PanelContentsNewScript"> 新腳本 </string> - <string name="BusyModeResponseDefault"> - ä½ å‚³è¨ŠéŽåŽ»çš„å±…æ°‘ç›®å‰è™•æ–¼å¿™ç¢Œç‹€æ…‹ï¼Œé€™æ„味著他è¦æ±‚ä¸è¢«æ‰“擾。 ä½ çš„è¨Šæ¯ä»å°‡ç•™å˜ä¸¦é¡¯ç¤ºæ–¼å°æ–¹çš„ IM é¢æ¿ä¸Šä¾›ç¨å¾ŒæŸ¥é–±ã€‚ + <string name="DoNotDisturbModeResponseDefault"> + 這居民處於「請勿打擾ã€ç‹€æ…‹ï¼Œä¸æœƒç«‹å³çœ‹åˆ°ä½ 的訊æ¯ã€‚ </string> <string name="MuteByName"> (按å稱) @@ -2095,9 +2092,6 @@ http://secondlife.com/viewer-access-faq <string name="GroupMoneyDate"> [weekday,datetime,utc] [mth,datetime,utc] [day,datetime,utc], [year,datetime,utc] </string> - <string name="ViewerObjectContents"> - 內容 - </string> <string name="AcquiredItems"> å–å¾—ç‰©å“ </string> @@ -3869,7 +3863,7 @@ http://secondlife.com/viewer-access-faq ä¸€èˆ¬æ™®ç´šåœ°å€ </string> <string name="LocationCtrlSeeAVsTooltip"> - å¯çœ‹åˆ°æœ¬åœ°æ®µå¤–的化身,並與之交談 + 這地段外的其他化身,看ä¸è¦‹ä¹Ÿè½ä¸åˆ°ä½æ–¼åœ°æ®µè£¡çš„化身 </string> <string name="LocationCtrlPathfindingDirtyTooltip"> 地å€é‡æ–°ç”¢å‡ºä¹‹å‰ï¼Œå¯ç§»å‹•ç‰©ä»¶å¯èƒ½ç„¡æ³•æ£å¸¸é‹ä½œã€‚ @@ -3946,6 +3940,12 @@ http://secondlife.com/viewer-access-faq <string name="IM_unblock_only_groups_friends"> è¦å¯Ÿçœ‹é€™è¨Šæ¯ï¼Œä½ å¿…é ˆåˆ°ã€Œå好è¨å®š / éš±ç§ã€ï¼Œå–消勾é¸ã€Œåªæœ‰æˆ‘的朋å‹å’Œç¾¤çµ„å¯ä»¥ IM 或與我通話ã€ã€‚ </string> + <string name="OnlineStatus"> + 上線 + </string> + <string name="OfflineStatus"> + 離線 + </string> <string name="answered_call"> ä½ çš„é€šè©±å·²ç¶“æŽ¥é€š </string> @@ -3955,6 +3955,9 @@ http://secondlife.com/viewer-access-faq <string name="you_joined_call"> ä½ ç™¼èµ·äº†èªžéŸ³é€šè©± </string> + <string name="you_auto_rejected_call-im"> + å› ç‚ºè™•æ–¼ã€Œè«‹å‹¿æ‰“æ“¾ã€æ¨¡å¼ï¼Œä½ 已自動拒è½é€™é€šèªžéŸ³ä¾†é›»ã€‚ + </string> <string name="name_started_call"> [NAME] 發起了語音通話 </string> @@ -3971,7 +3974,7 @@ http://secondlife.com/viewer-access-faq è¯æŽ¥ä¸... </string> <string name="conference-title"> - 臨時多方通話 + 多人èŠå¤© </string> <string name="conference-title-incoming"> å’Œ [AGENT_NAME] 多方通話 @@ -4863,6 +4866,9 @@ http://secondlife.com/viewer-access-faq <string name="Command_Chat_Label"> èŠå¤© </string> + <string name="Command_Conversations_Label"> + 交談 + </string> <string name="Command_Compass_Label"> 羅盤 </string> @@ -4938,6 +4944,9 @@ http://secondlife.com/viewer-access-faq <string name="Command_Chat_Tooltip"> é€éŽæ–‡å—和附近人們èŠå¤© </string> + <string name="Command_Conversations_Tooltip"> + 和所有人交談 + </string> <string name="Command_Compass_Tooltip"> 指å—é‡ </string> @@ -5067,4 +5076,13 @@ http://secondlife.com/viewer-access-faq <string name="UserDictionary"> [User] </string> + <string name="logging_calls_disabled_log_empty"> + 交談未留記錄。 若想開始留記錄,請到「å好è¨å®š > èŠå¤©ã€ï¼Œé¸æ“‡ã€Œå„²å˜ï¼šåªç•™æ·å²è¨˜éŒ„ã€æˆ–「儲å˜ï¼šæ·å²è¨˜éŒ„兼交談內容ã€ã€‚ + </string> + <string name="logging_calls_disabled_log_not_empty"> + å°‡ä¸å†ç‚ºäº¤è«‡ç•™è¨˜éŒ„。 若想æ¢å¾©ç•™å˜è¨˜éŒ„,請到「å好è¨å®š > èŠå¤©ã€ï¼Œé¸æ“‡ã€Œå„²å˜ï¼šåªç•™æ·å²è¨˜éŒ„ã€æˆ–「儲å˜ï¼šæ·å²è¨˜éŒ„兼交談內容ã€ã€‚ + </string> + <string name="logging_calls_enabled_log_empty"> + ç›®å‰æ²’有交談記錄。 åœ¨ä½ è¯çµ¡æŸäººæˆ–æŸäººè¯çµ¡ä½ 之後,這裡將留å˜è¨˜éŒ„。 + </string> </strings> diff --git a/indra/newview/tests/llmediadataclient_test.cpp b/indra/newview/tests/llmediadataclient_test.cpp index 41cb344808..3e55336f2d 100644 --- a/indra/newview/tests/llmediadataclient_test.cpp +++ b/indra/newview/tests/llmediadataclient_test.cpp @@ -39,6 +39,7 @@ #include "../llvovolume.h" #include "../../llprimitive/llmediaentry.cpp" +#include "../../llprimitive/llmaterialid.cpp" #include "../../llprimitive/lltextureentry.cpp" #include "../../llmessage/tests/llcurl_stub.cpp" diff --git a/indra/newview/tests/llviewerassetstats_test.cpp b/indra/newview/tests/llviewerassetstats_test.cpp index a331d9aa9e..a331d9aa9e 100755..100644 --- a/indra/newview/tests/llviewerassetstats_test.cpp +++ b/indra/newview/tests/llviewerassetstats_test.cpp diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index 69248e26bc..276ae8fc01 100644 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -367,10 +367,14 @@ class WindowsManifest(ViewerManifest): print err.message print "Skipping COLLADA and GLOD libraries (assumming linked statically)" - - # Get fmod dll, continue if missing - if not self.path("fmod.dll"): - print "Skipping fmod.dll" + # Get fmodex dll, continue if missing + try: + if self.args['configuration'].lower() == 'debug': + self.path("fmodexL.dll") + else: + self.path("fmodex.dll") + except: + print "Skipping fmodex audio library(assuming other audio engine)" # For textures if self.args['configuration'].lower() == 'debug': @@ -743,6 +747,7 @@ class DarwinManifest(ViewerManifest): "libcollada14dom.dylib", "libexpat.1.5.2.dylib", "libexception_handler.dylib", + "libfmodex.dylib", "libGLOD.dylib", ): dylibs += path_optional(os.path.join(libdir, libfile), libfile) @@ -758,10 +763,6 @@ class DarwinManifest(ViewerManifest): ): self.path2basename(libdir, libfile) - # FMOD for sound - libfile = "libfmodwrapper.dylib" - path_optional(os.path.join(self.args['configuration'], libfile), libfile) - # our apps for app_bld_dir, app in (("mac_crash_logger", "mac-crash-logger.app"), ("mac_updater", "mac-updater.app"), @@ -1073,9 +1074,7 @@ class Linux_i686Manifest(LinuxManifest): self.path("libboost_filesystem-mt.so.*") self.path("libboost_signals-mt.so.*") self.path("libboost_system-mt.so.*") - self.path("libbreakpad_client.so.0.0.0") - self.path("libbreakpad_client.so.0") - self.path("libbreakpad_client.so") + #self.path("libbreakpad_client.a") self.path("libcollada14dom.so") self.path("libdb*.so") self.path("libcrypto.so.*") @@ -1122,11 +1121,13 @@ class Linux_i686Manifest(LinuxManifest): pass try: - self.path("libfmod-3.75.so") + self.path("libfmodex-*.so") + self.path("libfmodex.so") pass except: - print "Skipping libfmod-3.75.so - not found" + print "Skipping libfmodex.so - not found" pass + self.end_prefix("lib") # Vivox runtimes diff --git a/indra/win_crash_logger/CMakeLists.txt b/indra/win_crash_logger/CMakeLists.txt index aa35c3b05e..3c9a4b9756 100644 --- a/indra/win_crash_logger/CMakeLists.txt +++ b/indra/win_crash_logger/CMakeLists.txt @@ -82,6 +82,7 @@ target_link_libraries(windows-crash-logger gdi32 ole32 oleaut32 + wininet Wldap32 ) |