diff options
| author | Xiaohong Bao <bao@lindenlab.com> | 2013-08-19 16:12:07 -0600 | 
|---|---|---|
| committer | Xiaohong Bao <bao@lindenlab.com> | 2013-08-19 16:12:07 -0600 | 
| commit | 1616b73ef30bcb3e99be68fb7ccc05f0be78ddf6 (patch) | |
| tree | e22c94948ed8d8c7f35422fc064172ea3662b264 | |
| parent | ea45b8acd25785bd2789c2c1928e223c9a8e2fbd (diff) | |
| parent | d8c02bf06250015b8cb0bcc9c0d8445cfb6acf1c (diff) | |
Automated merge with http://bitbucket.org/lindenlab/viewer-interesting
71 files changed, 1439 insertions, 1808 deletions
| @@ -248,31 +248,33 @@ bb9932a7a5fd00edf52d95f354e3b37ae6a942db DRTVWR-156  6414ecdabc5d89515b08d1f872cf923ed3a5523a DRTVWR-148  2a3965b3ad202df7ea25d2be689291bb14a1280e DRTVWR-155  24a7281bef42bd4430ceb25db8b195449c2c7de3 DRTVWR-153 +a716684aa7c07c440b1de5815b8a1f3dd3fd8bfb DRTVWR-159 +9a78ac13f047056f788c4734dd91aebfe30970e3 DRTVWR-157  5910f8063a7e1ddddf504c2f35ca831cc5e8f469 DRTVWR-160  f0a174c2adb4bc39b16722a61d7eeb4f2a1d4843 3.3.3-beta1  f0a174c2adb4bc39b16722a61d7eeb4f2a1d4843 DRTVWR-144 -2d6c0634b11e6f3df11002b8510a72a0433da00a DRTVWR-164 +089e5c84b2dece68f2b016c842ef9b5de4786842 DRTVWR-161  600f3b3920d94de805ac6dc8bb6def9c069dd360 DRTVWR-162 +c08e2ac17a99973b2a94477659220b99b8847ae2 DRTVWR-163 +2d6c0634b11e6f3df11002b8510a72a0433da00a DRTVWR-164  80b5e5e9775966d3839331ffa7a16a60f9d7c930 DRTVWR-165  fdcc08a4f20ae9bb060f4693c8980d216534efdf 3.3.3-beta2  af5f3e43e6e4424b1da19d9e16f6b853a7b822ed DRTVWR-169  4b3c68199a86cabaa5d9466d7b0f7e141e901d7a 3.3.3-beta3  6428242e124b523813bfaf4c45b3d422f0298c81 3.3.3-release -a716684aa7c07c440b1de5815b8a1f3dd3fd8bfb DRTVWR-159 -9a78ac13f047056f788c4734dd91aebfe30970e3 DRTVWR-157 -089e5c84b2dece68f2b016c842ef9b5de4786842 DRTVWR-161 -c08e2ac17a99973b2a94477659220b99b8847ae2 DRTVWR-163  b9d0170b62eb1c7c3adaa37a0b13a833e5e659f9 DRTVWR-171  050e48759337249130f684b4a21080b683f61732 DRTVWR-168  09ef7fd1b0781f33b8a3a9af6236b7bcb4831910 DRTVWR-170  f87bfbe0b62d26f451d02a47c80ebef6b9168fc2 DRTVWR-158  f91d003091a61937a044652c4c674447f7dcbb7a 3.3.4-beta1 +005dfe5c4c377207d065fb27858d2eb0b53b143a DRTVWR-167  bce218b2b45b730b22cc51e4807aa8b571cadef3 DRTVWR-173  cbea6356ce9cb0c313b6777f10c5c14783264fcc DRTVWR-174  82b5330bc8b17d0d4b598832e9c5a92e90075682 3.3.4-beta2  57d221de3df94f90b55204313c2cef044a3c0ae2 DRTVWR-176  eb539c65e6ee26eea2bf373af2d0f4b52dc91289 DRTVWR-177  a8057e1b9a1246b434a27405be35e030f7d28b0c 3.3.4-beta3 +888768f162d2c0a8de1dcc5fb9a08bd8bd120a6b DRTVWR-175  4281aa899fb2cedb7a9ca7ce91c5c29d4aa69594 DRTVWR-180  5c08e1d8edd871807153603b690e3ee9dbb548aa DRTVWR-183  6c75f220b103db1420919c8b635fe53e2177f318 3.3.4-beta4 @@ -283,24 +285,32 @@ ab2ffc547c8a8950ff187c4f6c95e5334fab597b 3.3.4-beta5  7c9102fb998885621919f2474a002c35b583539b 3.3.4-release2  8c9085066c78ed5f6c9379dc054c82a6fcdb1851 DRTVWR-207  351eea5f9dc192fc5ddea3b02958de97677a0a12 3.3.4-release3 -005dfe5c4c377207d065fb27858d2eb0b53b143a DRTVWR-167 -888768f162d2c0a8de1dcc5fb9a08bd8bd120a6b DRTVWR-175  a8b3eca451a9eaab59987efb0ab1c4217e3f2dcc DRTVWR-182  1f27cdfdc54246484f8afbbe42ce48e954175cbd 3.4.0-beta1 -9ee9387789701d597130f879d9011a4958753862 DRTVWR-189 +81f6b745ef27f5915fd07f988fdec9944f2bb73e DRTVWR-186  47f0d08ba7ade0a3905074009067c6d3df7e16ae DRTVWR-190 +cc953f00956be52cc64c30637bbeec310eea603f DRTVWR-181 +c04e68e1b0034fd0a20815ae24c77e5f8428e822 DRTVWR-188 +9ee9387789701d597130f879d9011a4958753862 DRTVWR-189  421126293dcbde918e0da027ca0ab9deb5b4fbf2 DRTVWR-192 +4b2c52aecb7a75de31dbb12d9f5b9a251d8707be DRTVWR-191  33a2fc7a910ae29ff8b4850316ed7fbff9f64d33 DRTVWR-195  e9732c739c8a72a590216951505ea9c76a526a84 DRTVWR-193 +78ca0bbf43a92e8914d4cfa87d69a6717ef7d4cf DRTVWR-194  7602f61c804a512764e349c034c02ddabeefebc4 DRTVWR-196  ae5c83dd61d2d37c45f1d5b8bf2b036d87599f1b DRTVWR-198  507bdfbd6bf844a511c1ffeda4baa80016ed1346 DRTVWR-197  b1dbb1a83f48f93f6f878cff9e52d2cb635e145c 3.4.0-beta2  37402e2b19af970d51b0a814d79892cc5647532b DRTVWR-200  182a9bf30e81070361bb020a78003b1cf398e79c 3.4.0-beta3 +248f4acd92a706c79e842bc83d80baa7369c0c2e DRTVWR-203  7649a3dff5ec22d3727377e5f02efd0f421e4cb5 DRTVWR-201  84fb70dfe3444e75a44fb4bee43e2fc8221cebdd 3.4.0-beta4 +de3be913f68813a9bac7d1c671fef96d1159bcd6 DRTVWR-202  573e863be2f26d3687161def4b9fea9b7038dda8 3.4.0-beta5 +34dbbe2b00afe90352d3acf8290eb10ab90d1c8b oz-build-test-tag +6ee71714935ffcd159db3d4f5800c1929aac54e1 DRTVWR-205 +7b22c612fc756e0ea63b10b163e81d107f85dbf8 DRTVWR-206  af7b28e75bd5a629cd9e0dc46fb3f1757626f493 DRTVWR-212  015012c2b740ccdec8a8c3d6e5f898449ecfe0b8 DRTVWR-213  62b07aa81b1957897c3846292bb9412977b0af6c 3.3.4-beta6 @@ -309,6 +319,7 @@ ceed0b65a69f1eac20d523e0203320a32f9a3f3c DRTVWR-215  97977c67245f52db20eb15f1918cc0f24778cabc 3.4.0-release  5adb2b8f96c3cac88ad7c7d996d707f1b29df336 3.4.1-beta1  b3f74858a1c8720c82d0978f3877a3fc8ba459ec 3.4.1-beta1a +b61afe175b829c149d369524a4e974dfda99facf DRTVWR-219  2b779f233ee6f38c89cb921650c773a96e63da92 DRTVWR-220  0b9d95f4bfb6867cbf56eaec51633b0da2f1262d DRTVWR-221  e6e553761829dc0270eaaa712b7cb0622535b076 3.4.1-beta3 @@ -333,36 +344,31 @@ baf97f06ae17223614c5e31aa42e71d87cff07fe DRTVWR-236  b2f21e3442542283a80e7eaebae9f833e5a927b6 DRTVWR-237  3f9be82de642d468c5fc272cb9d96b46b5498402 3.4.1-beta12  e59ffd3fe0838ae6b09b242a6e9df71761b88f41 3.4.1-release -81f6b745ef27f5915fd07f988fdec9944f2bb73e DRTVWR-186 -cc953f00956be52cc64c30637bbeec310eea603f DRTVWR-181 -c04e68e1b0034fd0a20815ae24c77e5f8428e822 DRTVWR-188 -4b2c52aecb7a75de31dbb12d9f5b9a251d8707be DRTVWR-191 -78ca0bbf43a92e8914d4cfa87d69a6717ef7d4cf DRTVWR-194 -248f4acd92a706c79e842bc83d80baa7369c0c2e DRTVWR-203 -de3be913f68813a9bac7d1c671fef96d1159bcd6 DRTVWR-202 -34dbbe2b00afe90352d3acf8290eb10ab90d1c8b oz-build-test-tag -6ee71714935ffcd159db3d4f5800c1929aac54e1 DRTVWR-205 -7b22c612fc756e0ea63b10b163e81d107f85dbf8 DRTVWR-206 -b61afe175b829c149d369524a4e974dfda99facf DRTVWR-219  32896d5e920ca9a29256ff3b747c2e99752aa5ae DRTVWR-217  704bbae7b182a1f2811a47a054e680522966f54a 3.4.2-beta1 +d799593b53ed733862e9a13871e318e886469377 DRTVWR-208 +e497dcde7a3653e384eb223a8a460030e89c294c DRTVWR-223  288539fc0408ed4b69a99665de33bbbc2c3c08fe DRTVWR-216  e664473c16df1d82ffaff382e7b3e023da202d52 3.4.2-beta2 +93ab02d83f51e30a3cabad98aff89601befd9413 DRTVWR-240  0891d7a773a31397dcad48be3fa66531d567a821 DRTVWR-242  710785535362b3cb801b6a3dc4703be3373bd0cd 3.4.2-beta3 -e9a5886052433d5db9e504ffaca10890f9932979 DRTVWR-243 -73b84b9864dc650fe7c8fc9f52361450f0849004 3.4.2-beta4 -16310aabccf315870f7cc9bf966926c0ad6954fa 3.4.2-release -d799593b53ed733862e9a13871e318e886469377 DRTVWR-208 -e497dcde7a3653e384eb223a8a460030e89c294c DRTVWR-223 -93ab02d83f51e30a3cabad98aff89601befd9413 DRTVWR-240  2aa72e3372a83dece4df9cf72fb1e7c34f90b5e3 DRTVWR-209  f7bedce18ad52283e6072814db23318907261487 DRTVWR-238  7b64c96fbcadf360bd2feaae19d330166b70877c DRTVWR-210 +e9a5886052433d5db9e504ffaca10890f9932979 DRTVWR-243 +73b84b9864dc650fe7c8fc9f52361450f0849004 3.4.2-beta4 +16310aabccf315870f7cc9bf966926c0ad6954fa 3.4.2-release  5e4e4128b256525bafc07a62e35ae8527aaa9c9d DRTVWR-241  f1d3b3fcab28ed9ea532bf50db0ba96f5c8cc8e9 DRTVWR-232  4918b150e75df6b516fb6c2616d32043fa6b4cac DRTVWR-245  94ab2b49458ab372a95d2d6949fdf574f413068d 3.4.3-beta1 +4c3460cb1fb7c6da9965e09c734d282a8e9c81f0 DRTVWR-229 +f4481df42f9a4a92bf475a80f0c51d1a4bbdfd59 DRTVWR-246 +39c5204b6e800983a41ccac8ad6dc993120197c6 DRTVWR-247 +7c7d57d393e8ae7b61623279de06eb4a62ccae6a DRTVWR-249 +f72b50ef168c159d6e79e97aa2bcafaf8577ab99 DRTVWR-230 +b418be80903520c492e1173f3afbc4021cad5d07 DRTVWR-255  965b9a35e260c0f53be1a25f0db7abc8a67eaf47 DRTVWR-252  bb10adc4f76cf0067fca7075146f00cdc0740e9d DRTVWR-251  ab0aa2f6ba22b52fed30a2337197f589156edc75 DRTVWR-253 @@ -371,31 +377,25 @@ ab0aa2f6ba22b52fed30a2337197f589156edc75 DRTVWR-253  44e764a6ac9e672a4f3bce821a4b6a218590c374 DRTVWR-258  c23d734065ed593b2413385aecd8366d8e0ee96b DRTVWR-257  452ce96d4046dc05a3ecaecc203e2cc8ddd72e76 DRTVWR-259 +9aa1aa9f1fe13c194695a0b8f0af298296241dc2 DRTVWR-260  daca610d840625b5bebb966a57cb49581852c417 DRTVWR-265  9afbdc4e24cc04feacfb2b7a10b78a64f780901a DRTVWR-266  73280db02501f5ad041fc18b1eba68e73a81996c DRTVWR-267  870e2d79e0063fda87187f17bbc2747766733194 3.4.3-beta3  0a2ca6546b499239afeb66d17b2fadbcdbe36ab1 3.4.3-release -4c3460cb1fb7c6da9965e09c734d282a8e9c81f0 DRTVWR-229 -f4481df42f9a4a92bf475a80f0c51d1a4bbdfd59 DRTVWR-246 -39c5204b6e800983a41ccac8ad6dc993120197c6 DRTVWR-247 -7c7d57d393e8ae7b61623279de06eb4a62ccae6a DRTVWR-249 -f72b50ef168c159d6e79e97aa2bcafaf8577ab99 DRTVWR-230 -b418be80903520c492e1173f3afbc4021cad5d07 DRTVWR-255 -9aa1aa9f1fe13c194695a0b8f0af298296241dc2 DRTVWR-260  84fbaf2d4141bd161731430e760949dc787ca206 DRTVWR-244  083d2d36b5bb1c54fc3dd7caac0e7ac381a9cef0 3.4.4-beta1 +391a8c74cec7275c5d26c85ad108d4782a3e3dd9 DRTVWR-268  b634dec987c16e8c9c938e11e52591d9ead8fa9b DRTVWR-270  cd39255bd23330fd30c04105f2811e941d8524fe 3.4.4-beta2  2c4011bbc2b15b82198fd8b51f3a9fe765a08c4d DRTVWR-271  2f8a3ef687bc55828abcb17ac1ad7cde70536d7e 3.4.4-beta3  35cfd4cf5b895fa776592f2e630e330be7f0604e DRTVWR-273 +a36f1f354b02aa6e448ca13685de167d0a0a3d03 DRTVWR-272 +37dba00ad820de3a808d4039396b162a9c275b3e DRTVWR-269  c374035d459af3c03dea2dd90880dfc25de64706 DRTVWR-275  05d9f1dd7a954069af2a33abedb7713fa36a04cb 3.4.4-beta4  e1bb1ae7d8b12faeb37933a737c199cc9b9f89cc 3.4.4-release -391a8c74cec7275c5d26c85ad108d4782a3e3dd9 DRTVWR-268 -a36f1f354b02aa6e448ca13685de167d0a0a3d03 DRTVWR-272 -37dba00ad820de3a808d4039396b162a9c275b3e DRTVWR-269  7c6dfdc1b7a2ce0d8e3a8f3ce3058547ea065c0f DRTVWR-250  b9ff9730daa53a541925300cbd02bb14575a5705 DRTVWR-277  af6b711a97073431953b55ee808aaa09900c27e5 DRTVWR-276 @@ -405,6 +405,8 @@ c296133849d1f103c0e2abc41e6599daed00b67b DRTVWR-280  5df4802bec93c8d0a509946d826bb4c50c5442ec DRTVWR-281  7c1c33ba4cfd2d15ca51cc1ac440eca551331a4a DRTVWR-283  6b9c7dbebef793230d64e1b452577c8b142d4143 3.4.5-beta2 +37947e4f771f001b551581bf7cd0051c3153beed DRTVWR-282 +6482cceb91cda68b799f3e6cdc66d33bf123547a DRTVWR-284  ccf991e02dc2f63fb646324230d54832683f4a9b DRTVWR-286  2d849850558a5a0324b398d1c102d30bcbdfb88f DRTVWR-287  e06898df8644fe567bee94f817d03abc1c380993 3.4.5-beta3 @@ -462,3 +464,5 @@ fb1630153bac5552046ea914af3f14deabc1def8 3.6.0-materials-beta1  69429d81ae4dd321eda2607901ef0a0fde71b54c 3.6.0-release  0a56f33ad6aa112032b14a41dad759ad377bdde9 3.6.0-release  75cf8e855ae1af6895a35da475314c2b5acf1850 3.6.1-release +f6741d5fe8d632651424484df0fe0cb4a01e9fbe 3.6.2-release +fe4f7c5e9fd27e09d03deb1cc9ab3e5093f6309e 3.6.3-release diff --git a/autobuild.xml b/autobuild.xml index 90224692db..92f91db32c 100755 --- a/autobuild.xml +++ b/autobuild.xml @@ -522,9 +522,9 @@              <key>archive</key>              <map>                <key>hash</key> -	      <string>91752db72202807cffb33c1ec3fd90fc</string> +              <string>91752db72202807cffb33c1ec3fd90fc</string>                <key>url</key> -	      <string>http://s3-proxy.lindenlab.com/private-builds-secondlife-com/hg/repo/3p-fmodex-private/rev/276321/arch/CYGWIN/installer/fmodex-4.44-windows-20130521.tar.bz2</string> +              <string>http://s3-proxy.lindenlab.com/private-builds-secondlife-com/hg/repo/3p-fmodex-private/rev/276321/arch/CYGWIN/installer/fmodex-4.44-windows-20130521.tar.bz2</string>              </map>              <key>name</key>              <string>windows</string> @@ -761,9 +761,9 @@            <map>              <key>archive</key>              <map> -           <key>hash</key> -	   <string>aff5566e04003de0383941981198e04e</string> -          <key>url</key> +              <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> @@ -773,9 +773,9 @@            <map>              <key>archive</key>              <map> -             <key>hash</key> -	         <string>52257e5eb166a0b69c9c0c38f6e1920e</string> -             <key>url</key> +              <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> @@ -786,7 +786,7 @@              <key>archive</key>              <map>                <key>hash</key> -	      <string>d812a6dfcabe6528198a3191068dac09</string> +              <string>d812a6dfcabe6528198a3191068dac09</string>                <key>url</key>               <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> @@ -879,42 +879,6 @@            </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> -          </map> -        </map> -      </map>        <key>gstreamer</key>        <map>          <key>license</key> @@ -1844,9 +1808,9 @@              <key>archive</key>              <map>                <key>hash</key> -              <string>24e735ae005f3ce7a21a09cc02cece17</string> +              <string>2994f1e028fb200c454c12b5f7ca9108</string>                <key>url</key> -              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-slvoice/rev/231678/arch/Darwin/installer/slvoice-3.2.0002.10426-darwin-20110601.tar.bz2</string> +              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-slvoice/rev/270464/arch/Darwin/installer/slvoice-4.5.0009.17865-darwin-20130215.tar.bz2</string>              </map>              <key>name</key>              <string>darwin</string> @@ -1856,9 +1820,9 @@              <key>archive</key>              <map>                <key>hash</key> -              <string>8a0bc982367d6fdc20a28b391cd40566</string> +              <string>957773fff7148ffaca42b1ea4a18d192</string>                <key>url</key> -              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-slvoice/rev/231678/arch/Linux/installer/slvoice-3.2.0002.10426-linux-20110601.tar.bz2</string> +              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-slvoice/rev/270512/arch/Linux/installer/slvoice-4.5.0009.17865-linux-20130216.tar.bz2</string>              </map>              <key>name</key>              <string>linux</string> @@ -1868,9 +1832,9 @@              <key>archive</key>              <map>                <key>hash</key> -              <string>1e821cc7d25eabad013b7f3db260dd6b</string> +              <string>24710eda136bfd42d6333e5609c2c74f</string>                <key>url</key> -              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-slvoice/rev/231678/arch/CYGWIN/installer/slvoice-3.2.0002.10426-windows-20110601.tar.bz2</string> +              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-slvoice/rev/270464/arch/CYGWIN/installer/slvoice-4.5.0009.17865-windows-20130214.tar.bz2</string>              </map>              <key>name</key>              <string>windows</string> diff --git a/doc/contributions.txt b/doc/contributions.txt index 66ccb404a8..7712f16ade 100755 --- a/doc/contributions.txt +++ b/doc/contributions.txt @@ -175,6 +175,7 @@ Ansariel Hiller  	STORM-1685  	STORM-1713  	STORM-1899 +	MAINT-2368  Aralara Rajal  Ardy Lay  	STORM-859 @@ -479,6 +480,7 @@ Hiro Sommambulist  Hitomi Tiponi  	STORM-1741  	STORM-1862 +	BUG-1067  Holger Gilruth  Horatio Freund  Hoze Menges diff --git a/indra/cmake/Copy3rdPartyLibs.cmake b/indra/cmake/Copy3rdPartyLibs.cmake index 29ab4b1710..1b211ca7b9 100755 --- a/indra/cmake/Copy3rdPartyLibs.cmake +++ b/indra/cmake/Copy3rdPartyLibs.cmake @@ -20,6 +20,7 @@ if(WINDOWS)      set(vivox_src_dir "${ARCH_PREBUILT_DIRS_RELEASE}")      set(vivox_files          SLVoice.exe +        ca-bundle.crt          libsndfile-1.dll          vivoxplatform.dll          vivoxsdk.dll @@ -195,6 +196,7 @@ elseif(DARWIN)      set(vivox_src_dir "${ARCH_PREBUILT_DIRS_RELEASE}")      set(vivox_files          SLVoice +        ca-bundle.crt          libsndfile.dylib          libvivoxoal.dylib          libortp.dylib @@ -241,6 +243,7 @@ elseif(LINUX)          libvivoxplatform.so          libvivoxsdk.so          SLVoice +        # ca-bundle.crt   #No cert for linux.  It is actually still 3.2SDK.         )      # *TODO - update this to use LIBS_PREBUILT_DIR and LL_ARCH_DIR variables      # or ARCH_PREBUILT_DIRS diff --git a/indra/llimage/llimage.cpp b/indra/llimage/llimage.cpp index 83638b56a3..7a46f47473 100755 --- a/indra/llimage/llimage.cpp +++ b/indra/llimage/llimage.cpp @@ -690,8 +690,17 @@ void LLImageRaw::fill( const LLColor4U& color )  	}  } +LLPointer<LLImageRaw> LLImageRaw::duplicate() +{ +	if(getNumRefs() < 2) +	{ +		return this; //nobody else refences to this image, no need to duplicate. +	} - +	//make a duplicate +	LLPointer<LLImageRaw> dup = new LLImageRaw(getData(), getWidth(), getHeight(), getComponents()); +	return dup;  +}  // Src and dst can be any size.  Src and dst can each have 3 or 4 components.  void LLImageRaw::copy(LLImageRaw* src) diff --git a/indra/llimage/llimage.h b/indra/llimage/llimage.h index 8ad6b49dd2..08615dc8ea 100755 --- a/indra/llimage/llimage.h +++ b/indra/llimage/llimage.h @@ -219,6 +219,9 @@ public:  	// Copy operations +	//duplicate this raw image if refCount > 1. +	LLPointer<LLImageRaw> duplicate(); +  	// Src and dst can be any size.  Src and dst can each have 3 or 4 components.  	void copy( LLImageRaw* src ); diff --git a/indra/llmath/llcamera.cpp b/indra/llmath/llcamera.cpp index 6a1e3804be..4d1ee15661 100755 --- a/indra/llmath/llcamera.cpp +++ b/indra/llmath/llcamera.cpp @@ -42,6 +42,11 @@ LLCamera::LLCamera() :  	mPlaneCount(6),  	mFrustumCornerDist(0.f)  { +	for (U32 i = 0; i < PLANE_MASK_NUM; i++) +	{ +		mPlaneMask[i] = PLANE_MASK_NONE; +	} +  	calculateFrustumPlanes();  }  @@ -52,6 +57,11 @@ LLCamera::LLCamera(F32 vertical_fov_rads, F32 aspect_ratio, S32 view_height_in_p  	mPlaneCount(6),  	mFrustumCornerDist(0.f)  { +	for (U32 i = 0; i < PLANE_MASK_NUM; i++) +	{ +		mPlaneMask[i] = PLANE_MASK_NONE; +	} +  	mAspect = llclamp(aspect_ratio, MIN_ASPECT_RATIO, MAX_ASPECT_RATIO);  	mNearPlane = llclamp(near_plane, MIN_NEAR_PLANE, MAX_NEAR_PLANE);  	if(far_plane < 0) far_plane = DEFAULT_FAR_PLANE; @@ -87,14 +97,14 @@ F32 LLCamera::getMaxView() const  void LLCamera::setUserClipPlane(LLPlane& plane)  { -	mPlaneCount = 7; -	mAgentPlanes[6] = plane; -	mPlaneMask[6] = plane.calcPlaneMask(); +	mPlaneCount = AGENT_PLANE_USER_CLIP_NUM; +	mAgentPlanes[AGENT_PLANE_USER_CLIP] = plane; +	mPlaneMask[AGENT_PLANE_USER_CLIP] = plane.calcPlaneMask();  }  void LLCamera::disableUserClipPlane()  { -	mPlaneCount = 6; +	mPlaneCount = AGENT_PLANE_NO_USER_CLIP_NUM;  }  void LLCamera::setView(F32 vertical_fov_rads)  @@ -161,6 +171,18 @@ size_t LLCamera::readFrustumFromBuffer(const char *buffer)  // ---------------- test methods  ----------------  +static	const LLVector4a sFrustumScaler[] =  +{ +	LLVector4a(-1,-1,-1), +	LLVector4a( 1,-1,-1), +	LLVector4a(-1, 1,-1), +	LLVector4a( 1, 1,-1), +	LLVector4a(-1,-1, 1), +	LLVector4a( 1,-1, 1), +	LLVector4a(-1, 1, 1), +	LLVector4a( 1, 1, 1)		// 8 entries +}; +  bool LLCamera::isChanged()  {  	bool changed = false; @@ -179,17 +201,6 @@ bool LLCamera::isChanged()  S32 LLCamera::AABBInFrustum(const LLVector4a ¢er, const LLVector4a& radius, const LLPlane* planes)   { -	static const LLVector4a scaler[] = { -		LLVector4a(-1,-1,-1), -		LLVector4a( 1,-1,-1), -		LLVector4a(-1, 1,-1), -		LLVector4a( 1, 1,-1), -		LLVector4a(-1,-1, 1), -		LLVector4a( 1,-1, 1), -		LLVector4a(-1, 1, 1), -		LLVector4a( 1, 1, 1) -	}; -  	if(!planes)  	{  		//use agent space @@ -200,14 +211,15 @@ S32 LLCamera::AABBInFrustum(const LLVector4a ¢er, const LLVector4a& radius,  	bool result = false;  	LLVector4a rscale, maxp, minp;  	LLSimdScalar d; -	for (U32 i = 0; i < mPlaneCount; i++) +	U32 max_planes = llmin(mPlaneCount, (U32) AGENT_PLANE_USER_CLIP_NUM);		// mAgentPlanes[] size is 7 +	for (U32 i = 0; i < max_planes; i++)  	{  		mask = mPlaneMask[i]; -		if (mask != 0xff) +		if (mask < PLANE_MASK_NUM)  		{  			const LLPlane& p(planes[i]);  			p.getAt<3>(d); -			rscale.setMul(radius, scaler[mask]); +			rscale.setMul(radius, sFrustumScaler[mask]);  			minp.setSub(center, rscale);  			d = -d;  			if (p.dot3(minp).getF32() > d)  @@ -235,17 +247,6 @@ S32 LLCamera::AABBInRegionFrustum(const LLVector4a& center, const LLVector4a& ra  S32 LLCamera::AABBInFrustumNoFarClip(const LLVector4a& center, const LLVector4a& radius, const LLPlane* planes)   { -	static const LLVector4a scaler[] = { -		LLVector4a(-1,-1,-1), -		LLVector4a( 1,-1,-1), -		LLVector4a(-1, 1,-1), -		LLVector4a( 1, 1,-1), -		LLVector4a(-1,-1, 1), -		LLVector4a( 1,-1, 1), -		LLVector4a(-1, 1, 1), -		LLVector4a( 1, 1, 1) -	}; -  	if(!planes)  	{  		//use agent space @@ -256,14 +257,15 @@ S32 LLCamera::AABBInFrustumNoFarClip(const LLVector4a& center, const LLVector4a&  	bool result = false;  	LLVector4a rscale, maxp, minp;  	LLSimdScalar d; -	for (U32 i = 0; i < mPlaneCount; i++) +	U32 max_planes = llmin(mPlaneCount, (U32) AGENT_PLANE_USER_CLIP_NUM);		// mAgentPlanes[] size is 7 +	for (U32 i = 0; i < max_planes; i++)  	{  		mask = mPlaneMask[i]; -		if ((i != 5) && (mask != 0xff)) +		if ((i != 5) && (mask < PLANE_MASK_NUM))  		{  			const LLPlane& p(planes[i]);  			p.getAt<3>(d); -			rscale.setMul(radius, scaler[mask]); +			rscale.setMul(radius, sFrustumScaler[mask]);  			minp.setSub(center, rscale);  			d = -d;  			if (p.dot3(minp).getF32() > d)  @@ -410,7 +412,7 @@ int LLCamera::sphereInFrustum(const LLVector3 &sphere_center, const F32 radius)  	bool res = false;  	for (int i = 0; i < 6; i++)  	{ -		if (mPlaneMask[i] != 0xff) +		if (mPlaneMask[i] != PLANE_MASK_NONE)  		{  			float d = mAgentPlanes[i].dist(sphere_center); @@ -582,14 +584,14 @@ void LLCamera::ignoreAgentFrustumPlane(S32 idx)  		return;  	} -	mPlaneMask[idx] = 0xff; +	mPlaneMask[idx] = PLANE_MASK_NONE;  	mAgentPlanes[idx].clear();  }  void LLCamera::calcAgentFrustumPlanes(LLVector3* frust)  { -	for (int i = 0; i < 8; i++) +	for (int i = 0; i < AGENT_FRUSTRUM_NUM; i++)  	{  		mAgentFrustum[i] = frust[i];  	} @@ -601,22 +603,22 @@ void LLCamera::calcAgentFrustumPlanes(LLVector3* frust)  	//order of planes is important, keep most likely to fail in the front of the list  	//near - frust[0], frust[1], frust[2] -	mAgentPlanes[2] = planeFromPoints(frust[0], frust[1], frust[2]); +	mAgentPlanes[AGENT_PLANE_NEAR] = planeFromPoints(frust[0], frust[1], frust[2]);  	//far   -	mAgentPlanes[5] = planeFromPoints(frust[5], frust[4], frust[6]); +	mAgentPlanes[AGENT_PLANE_FAR] = planeFromPoints(frust[5], frust[4], frust[6]);  	//left   -	mAgentPlanes[0] = planeFromPoints(frust[4], frust[0], frust[7]); +	mAgentPlanes[AGENT_PLANE_LEFT] = planeFromPoints(frust[4], frust[0], frust[7]);  	//right   -	mAgentPlanes[1] = planeFromPoints(frust[1], frust[5], frust[6]); +	mAgentPlanes[AGENT_PLANE_RIGHT] = planeFromPoints(frust[1], frust[5], frust[6]);  	//top   -	mAgentPlanes[4] = planeFromPoints(frust[3], frust[2], frust[6]); +	mAgentPlanes[AGENT_PLANE_TOP] = planeFromPoints(frust[3], frust[2], frust[6]);  	//bottom   -	mAgentPlanes[3] = planeFromPoints(frust[1], frust[0], frust[4]); +	mAgentPlanes[AGENT_PLANE_BOTTOM] = planeFromPoints(frust[1], frust[0], frust[4]);  	//cache plane octant facing mask for use in AABBInFrustum  	for (U32 i = 0; i < mPlaneCount; i++) @@ -693,7 +695,7 @@ void LLCamera::calculateWorldFrustumPlanes()  	LLVector3 center = mOrigin - mXAxis*mNearPlane;  	mWorldPlanePos = center;  	LLVector3 pnorm;	 -	for (int p=0; p<4; p++) +	for (int p = 0; p < PLANE_NUM; p++)  	{  		mLocalPlanes[p].getVector3(pnorm);  		LLVector3 norm = rotateToAbsolute(pnorm); diff --git a/indra/llmath/llcamera.h b/indra/llmath/llcamera.h index a7cdcff4ac..946f9f8d84 100755 --- a/indra/llmath/llcamera.h +++ b/indra/llmath/llcamera.h @@ -76,26 +76,39 @@ public:  		PLANE_RIGHT = 1,  		PLANE_BOTTOM = 2,  		PLANE_TOP = 3, -		PLANE_NUM = 4 +		PLANE_NUM = 4, +		PLANE_MASK_NONE = 0xff		// Disable this plane  	};  	enum {  		PLANE_LEFT_MASK = (1<<PLANE_LEFT),  		PLANE_RIGHT_MASK = (1<<PLANE_RIGHT),  		PLANE_BOTTOM_MASK = (1<<PLANE_BOTTOM),  		PLANE_TOP_MASK = (1<<PLANE_TOP), -		PLANE_ALL_MASK = 0xf +		PLANE_ALL_MASK = 0xf,  	};  	enum -	{ +	{	// Indexes to mAgentPlanes[] and mPlaneMask[]  		AGENT_PLANE_LEFT = 0, -		AGENT_PLANE_RIGHT, -		AGENT_PLANE_NEAR, -		AGENT_PLANE_BOTTOM, -		AGENT_PLANE_TOP, -		AGENT_PLANE_FAR, +		AGENT_PLANE_RIGHT = 1, +		AGENT_PLANE_NEAR = 2, +		AGENT_PLANE_BOTTOM = 3, +		AGENT_PLANE_TOP = 4, +		AGENT_PLANE_FAR = 5, +		AGENT_PLANE_USER_CLIP = 6 +	}; +	enum +	{	// Sizes for mAgentPlanes[].  7th entry is special case for user clip +		AGENT_PLANE_NO_USER_CLIP_NUM = 6, +		AGENT_PLANE_USER_CLIP_NUM = 7, +		PLANE_MASK_NUM = 8			// 7 actually used, 8 is for alignment  	}; +	enum +	{ +		AGENT_FRUSTRUM_NUM = 8 +	}; +	  	enum {  		HORIZ_PLANE_LEFT = 0,  		HORIZ_PLANE_RIGHT = 1, @@ -108,17 +121,17 @@ public:  	};  private: -	LL_ALIGN_16(LLPlane mAgentPlanes[7]);  //frustum planes in agent space a la gluUnproject (I'm a bastard, I know) - DaveP -	LL_ALIGN_16(LLPlane mRegionPlanes[7]);  //frustum planes in a local region space, derived from mAgentPlanes -	LL_ALIGN_16(LLPlane mLastAgentPlanes[7]); -	U8 mPlaneMask[8];         // 8 for alignment	 +	LL_ALIGN_16(LLPlane mAgentPlanes[AGENT_PLANE_USER_CLIP_NUM]);  //frustum planes in agent space a la gluUnproject (I'm a bastard, I know) - DaveP +	LL_ALIGN_16(LLPlane mRegionPlanes[AGENT_PLANE_USER_CLIP_NUM]);  //frustum planes in a local region space, derived from mAgentPlanes +	LL_ALIGN_16(LLPlane mLastAgentPlanes[AGENT_PLANE_USER_CLIP_NUM]); +	U8 mPlaneMask[PLANE_MASK_NUM];         // 8 for alignment	  	F32 mView;					// angle between top and bottom frustum planes in radians.  	F32 mAspect;				// width/height  	S32 mViewHeightInPixels;	// for ViewHeightInPixels() only  	F32 mNearPlane;  	F32 mFarPlane; -	LL_ALIGN_16(LLPlane mLocalPlanes[4]); +	LL_ALIGN_16(LLPlane mLocalPlanes[PLANE_NUM]);  	F32 mFixedDistance;			// Always return this distance, unless < 0  	LLVector3 mFrustCenter;		// center of frustum and radius squared for ultra-quick exclusion test  	F32 mFrustRadiusSquared; @@ -130,7 +143,7 @@ private:  	LLVector3 mWorldPlanePos;		// Position of World Planes (may be offset from camera)  public: -	LLVector3 mAgentFrustum[8];  //8 corners of 6-plane frustum +	LLVector3 mAgentFrustum[AGENT_FRUSTRUM_NUM];  //8 corners of 6-plane frustum  	F32	mFrustumCornerDist;		//distance to corner of frustum against far clip plane  	LLPlane& getAgentPlane(U32 idx) { return mAgentPlanes[idx]; } diff --git a/indra/llmessage/llcurl.cpp b/indra/llmessage/llcurl.cpp index 03989df170..ea20da0146 100755 --- a/indra/llmessage/llcurl.cpp +++ b/indra/llmessage/llcurl.cpp @@ -72,7 +72,8 @@  static const U32 EASY_HANDLE_POOL_SIZE		= 5;  static const S32 MULTI_PERFORM_CALL_REPEAT	= 5; -static const S32 CURL_REQUEST_TIMEOUT = 30; // seconds per operation +static const S32 CURL_REQUEST_TIMEOUT = 120; // seconds per operation +static const S32 CURL_CONNECT_TIMEOUT = 30; //seconds to wait for a connection  static const S32 MAX_ACTIVE_REQUEST_COUNT = 100;  // DEBUG // @@ -517,6 +518,7 @@ void LLCurl::Easy::prepRequest(const std::string& url,  	//don't verify host name so urls with scrubbed host names will work (improves DNS performance)  	setopt(CURLOPT_SSL_VERIFYHOST, 0);  	setopt(CURLOPT_TIMEOUT, llmax(time_out, CURL_REQUEST_TIMEOUT)); +	setopt(CURLOPT_CONNECTTIMEOUT, CURL_CONNECT_TIMEOUT);  	setoptString(CURLOPT_URL, url); diff --git a/indra/llplugin/slplugin/slplugin-objc.mm b/indra/llplugin/slplugin/slplugin-objc.mm index a434739350..a5ab1d95c8 100755 --- a/indra/llplugin/slplugin/slplugin-objc.mm +++ b/indra/llplugin/slplugin/slplugin-objc.mm @@ -115,7 +115,7 @@ void LLCocoaPlugin::setupGroup()  } -void LLCocoaPlugin::updateWindows()  //SPATTERS give this a better name. +void LLCocoaPlugin::updateWindows()    {  //    NSArray* window_list = [NSApp orderedWindows];  //    NSWindow* current_window = [window_list objectAtIndex:0]; diff --git a/indra/llprimitive/llmodel.cpp b/indra/llprimitive/llmodel.cpp index e48613b8ca..3526b22532 100755 --- a/indra/llprimitive/llmodel.cpp +++ b/indra/llprimitive/llmodel.cpp @@ -628,25 +628,41 @@ LLModel::EModelStatus load_face_from_dom_polygons(std::vector<LLVolumeFace>& fac  			if (v)  			{  				U32 v_idx = idx[j*stride+v_offset]*3; +				v_idx = llclamp(v_idx, (U32) 0, (U32) v->getCount());  				vert.getPosition().set(v->get(v_idx),  								v->get(v_idx+1),  								v->get(v_idx+2));  			} -			if (n) +			//bounds check n and t lookups because some FBX to DAE converters +			//use negative indices and empty arrays to indicate data does not exist +			//for a particular channel +			if (n && n->getCount() > 0)  			{  				U32 n_idx = idx[j*stride+n_offset]*3; +				n_idx = llclamp(n_idx, (U32) 0, (U32) n->getCount());  				vert.getNormal().set(n->get(n_idx),  								n->get(n_idx+1),  								n->get(n_idx+2));  			} +			else +			{ +				vert.getNormal().clear(); +			} + -			if (t) +			if (t && t->getCount() > 0)  			{  				U32 t_idx = idx[j*stride+t_offset]*2; +				t_idx = llclamp(t_idx, (U32) 0, (U32) t->getCount());  				vert.mTexCoord.setVec(t->get(t_idx),  								t->get(t_idx+1));								  			} +			else +			{ +				vert.mTexCoord.clear(); +			} +  			verts.push_back(vert);  		} diff --git a/indra/llrender/llgl.cpp b/indra/llrender/llgl.cpp index e20bd6cf9d..90a8bf5f5e 100755 --- a/indra/llrender/llgl.cpp +++ b/indra/llrender/llgl.cpp @@ -1154,7 +1154,8 @@ void LLGLManager::initExtensions()  	// Misc  	glGetIntegerv(GL_MAX_ELEMENTS_VERTICES, (GLint*) &mGLMaxVertexRange);  	glGetIntegerv(GL_MAX_ELEMENTS_INDICES, (GLint*) &mGLMaxIndexRange); -	 +	glGetIntegerv(GL_MAX_TEXTURE_SIZE, (GLint*) &mGLMaxTextureSize); +  #if (LL_WINDOWS || LL_LINUX || LL_SOLARIS) && !LL_MESA_HEADLESS  	LL_DEBUGS("RenderInit") << "GL Probe: Getting symbols" << LL_ENDL;  	if (mHasVertexBufferObject) diff --git a/indra/llrender/llgl.h b/indra/llrender/llgl.h index 60597fd090..75e5fe86ec 100755 --- a/indra/llrender/llgl.h +++ b/indra/llrender/llgl.h @@ -155,6 +155,7 @@ public:  	S32 mVRAM; // VRAM in MB  	S32 mGLMaxVertexRange;  	S32 mGLMaxIndexRange; +	S32 mGLMaxTextureSize;  	void getPixelFormat(); // Get the best pixel format diff --git a/indra/llrender/llimagegl.cpp b/indra/llrender/llimagegl.cpp index 5d46fb290c..5d46fb290c 100644..100755 --- a/indra/llrender/llimagegl.cpp +++ b/indra/llrender/llimagegl.cpp diff --git a/indra/llrender/llrendertarget.cpp b/indra/llrender/llrendertarget.cpp index a4d77b00d6..a9945f9814 100755 --- a/indra/llrender/llrendertarget.cpp +++ b/indra/llrender/llrendertarget.cpp @@ -117,8 +117,8 @@ void LLRenderTarget::resize(U32 resx, U32 resy, U32 color_fmt)  bool LLRenderTarget::allocate(U32 resx, U32 resy, U32 color_fmt, bool depth, bool stencil, LLTexUnit::eTextureType usage, bool use_fbo, S32 samples)  { -	resx = llmin(resx, (U32) 4096); -	resy = llmin(resy, (U32) 4096); +	resx = llmin(resx, (U32) gGLManager.mGLMaxTextureSize); +	resy = llmin(resy, (U32) gGLManager.mGLMaxTextureSize);  	stop_glerror();  	release(); diff --git a/indra/llui/llscrolllistcolumn.cpp b/indra/llui/llscrolllistcolumn.cpp index af124d9826..cc9ff7a487 100755 --- a/indra/llui/llscrolllistcolumn.cpp +++ b/indra/llui/llscrolllistcolumn.cpp @@ -236,7 +236,8 @@ void LLScrollColumnHeader::handleReshape(const LLRect& new_rect, bool by_user)  		// tell scroll list to layout columns again  		// do immediate update to get proper feedback to resize handle  		// which needs to know how far the resize actually went -		mColumn->mParentCtrl->updateColumns(); +		const bool force_update = true; +		mColumn->mParentCtrl->updateColumns(force_update);  	}  } diff --git a/indra/llui/llscrolllistctrl.cpp b/indra/llui/llscrolllistctrl.cpp index 224c2b918d..f54fb36abe 100755 --- a/indra/llui/llscrolllistctrl.cpp +++ b/indra/llui/llscrolllistctrl.cpp @@ -615,7 +615,6 @@ S32 LLScrollListCtrl::calcMaxContentWidth()  		if (mColumnWidthsDirty)  		{ -			mColumnWidthsDirty = false;  			// update max content width for this column, by looking at all items  			column->mMaxContentWidth = column->mHeader ? LLFontGL::getFontSansSerifSmall()->getWidth(column->mLabel) + mColumnPadding + HEADING_TEXT_PADDING : 0;  			item_list::iterator iter; @@ -629,6 +628,7 @@ S32 LLScrollListCtrl::calcMaxContentWidth()  		}  		max_item_width += column->mMaxContentWidth;  	} +	mColumnWidthsDirty = false;  	return max_item_width;  } @@ -643,7 +643,7 @@ bool LLScrollListCtrl::updateColumnWidths()  		if (!column) continue;  		// update column width -		S32 new_width = column->getWidth(); +		S32 new_width = 0;  		if (column->mRelWidth >= 0)  		{  			new_width = (S32)llround(column->mRelWidth*mItemListRect.getWidth()); @@ -652,6 +652,10 @@ bool LLScrollListCtrl::updateColumnWidths()  		{  			new_width = (mItemListRect.getWidth() - mTotalStaticColumnWidth - mTotalColumnPadding) / mNumDynamicWidthColumns;  		} +		else +		{ +			new_width = column->getWidth(); +		}  		if (column->getWidth() != new_width)  		{ @@ -693,9 +697,9 @@ void LLScrollListCtrl::updateLineHeightInsert(LLScrollListItem* itemp)  } -void LLScrollListCtrl::updateColumns() +void LLScrollListCtrl::updateColumns(bool force_update)  { -	if (!mColumnsDirty) +	if (!mColumnsDirty && !force_update)  		return;  	mColumnsDirty = false; @@ -749,7 +753,7 @@ void LLScrollListCtrl::updateColumns()  	}  	// propagate column widths to individual cells -	if (columns_changed_width) +	if (columns_changed_width || force_update)  	{  		item_list::iterator iter;  		for (iter = mItemList.begin(); iter != mItemList.end(); iter++) diff --git a/indra/llui/llscrolllistctrl.h b/indra/llui/llscrolllistctrl.h index 40a49074c1..679aab3fe5 100755 --- a/indra/llui/llscrolllistctrl.h +++ b/indra/llui/llscrolllistctrl.h @@ -341,7 +341,7 @@ public:  	static void onClickColumn(void *userdata); -	virtual void updateColumns(); +	virtual void updateColumns(bool force_update = false);  	S32 calcMaxContentWidth();  	bool updateColumnWidths(); diff --git a/indra/llvfs/lldir_mac.cpp b/indra/llvfs/lldir_mac.cpp index b4900e5f0c..ac9ec8e8ee 100755 --- a/indra/llvfs/lldir_mac.cpp +++ b/indra/llvfs/lldir_mac.cpp @@ -134,7 +134,7 @@ LLDir_Mac::LLDir_Mac()  		{              mOSCacheDir = *cachedir; -            //SPATTERS TODO:  This changes from ~/Library/Cache/Secondlife to ~/Library/Cache/com.app.secondlife/Secondlife.  Last dir level could go away. +            //Aura TODO:  This changes from ~/Library/Cache/Secondlife to ~/Library/Cache/com.app.secondlife/Secondlife.  Last dir level could go away.              CreateDirectory(mOSCacheDir, secondLifeString, NULL);  		} diff --git a/indra/llvfs/llvfs_objc.mm b/indra/llvfs/llvfs_objc.mm index 4f9e2f81e9..47b0e73978 100755 --- a/indra/llvfs/llvfs_objc.mm +++ b/indra/llvfs/llvfs_objc.mm @@ -58,7 +58,7 @@ std::string* findSystemDirectory(NSSearchPathDirectory searchPathDirectory,      if ([paths count])      {          path = [paths objectAtIndex:0]; -        //SPATTERS HACK:  Always attempt to create directory, ignore errors. +        //HACK:  Always attempt to create directory, ignore errors.          NSError *error = nil;          [[NSFileManager defaultManager] createDirectoryAtPath:path withIntermediateDirectories:YES attributes:nil error:&error]; diff --git a/indra/lscript/lscript_compile/indra.l b/indra/lscript/lscript_compile/indra.l index 019d227842..1483151f2b 100755 --- a/indra/lscript/lscript_compile/indra.l +++ b/indra/lscript/lscript_compile/indra.l @@ -335,6 +335,8 @@ int yyerror(const char *fmt, ...);  "ATTACH_HUD_BOTTOM_LEFT" { count(); yylval.ival = 36; return(INTEGER_CONSTANT); }  "ATTACH_HUD_BOTTOM"		{ count(); yylval.ival = 37; return(INTEGER_CONSTANT); }  "ATTACH_HUD_BOTTOM_RIGHT"	{ count(); yylval.ival = 38; return(INTEGER_CONSTANT); } +"ATTACH_NECK"   { count(); yylval.ival = 39; return(INTEGER_CONSTANT); } +"ATTACH_AVATAR_CENTER"   { count(); yylval.ival = 40; return(INTEGER_CONSTANT); }  "LAND_LEVEL"		{ count(); yylval.ival = E_LANDBRUSH_LEVEL; return(INTEGER_CONSTANT); }  "LAND_RAISE"		{ count(); yylval.ival = E_LANDBRUSH_RAISE; return(INTEGER_CONSTANT); } diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index b3e55ccc00..da7466f6b5 100755 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -1675,6 +1675,7 @@ if (WINDOWS)        ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/zlib1.dll        ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/vivoxplatform.dll        ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/vivoxoal.dll +      ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/ca-bundle.crt        ${GOOGLE_PERF_TOOLS_SOURCE}        ${CMAKE_CURRENT_SOURCE_DIR}/licenses-win32.txt        ${CMAKE_CURRENT_SOURCE_DIR}/featuretable.txt diff --git a/indra/newview/VIEWER_VERSION.txt b/indra/newview/VIEWER_VERSION.txt index b72762837e..0f44168a4d 100644 --- a/indra/newview/VIEWER_VERSION.txt +++ b/indra/newview/VIEWER_VERSION.txt @@ -1 +1 @@ -3.6.2 +3.6.4 diff --git a/indra/newview/app_settings/keywords.ini b/indra/newview/app_settings/keywords.ini index f0d8b77afd..a87310955f 100755 --- a/indra/newview/app_settings/keywords.ini +++ b/indra/newview/app_settings/keywords.ini @@ -274,7 +274,8 @@ ATTACH_LLLEG		Passed to llAttachToAvatar to attach task to left lower leg  ATTACH_BELLY		Passed to llAttachToAvatar to attach task to belly  ATTACH_LEFT_PEC		Passed to llAttachToAvatar to attach task to left pectoral  ATTACH_RIGHT_PEC	Passed to llAttachToAvatar to attach task to right pectoral - +ATTACH_NECK			Passed to llAttachToAvatar to attach task to neck +ATTACH_AVATAR_CENTER	Passed to llAttachToAvatar to attach task to avatar center  LAND_LEVEL			Passed to llModifyLand to level terrain  LAND_RAISE			Passed to llModifyLand to raise terrain  LAND_LOWER			Passed to llModifyLand to lower terrain diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index 2a4e10fb6f..015c307afc 100755 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -8489,6 +8489,18 @@      <integer>0</integer>    </map> +  <key>RenderDepthOfFieldInEditMode</key> +  <map> +    <key>Comment</key> +    <string>Whether to use depth of field effect when in edit mode</string> +    <key>Persist</key> +    <integer>1</integer> +    <key>Type</key> +    <string>Boolean</string> +    <key>Value</key> +    <integer>0</integer> +  </map> +    <key>CameraDoFResScale</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..efd0d03965 100755 --- a/indra/newview/app_settings/shaders/class1/avatar/objectSkinV.glsl +++ b/indra/newview/app_settings/shaders/class1/avatar/objectSkinV.glsl @@ -45,3 +45,4 @@ mat4 getObjectSkinnedTransform()  	return mat;  } + diff --git a/indra/newview/gpu_table.txt b/indra/newview/gpu_table.txt index 4c39014c8b..122577b132 100755 --- a/indra/newview/gpu_table.txt +++ b/indra/newview/gpu_table.txt @@ -32,567 +32,531 @@  //		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 -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 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 -ATI ASUS AH26xx							.*ATI.*ASUS.*AH26.*						1	1	1	3.3 -ATI ASUS AH34xx							.*ATI.*ASUS.*AH34.*						1	1	1	3.3 -ATI ASUS AH36xx							.*ATI.*ASUS.*AH36.*						1	1	1	3.3 -ATI ASUS AH46xx							.*ATI.*ASUS.*AH46.*						2	1	1	3.3 -ATI ASUS AX3xx							.*ATI.*ASUS.*AX3.*						1	1	0	0 -ATI ASUS AX5xx							.*ATI.*ASUS.*AX5.*						1	1	0	0 -ATI ASUS AX8xx							.*ATI.*ASUS.*AX8.*						2	1	0	0 -ATI ASUS EAH24xx						.*ATI.*ASUS.*EAH24.*					2	1	0	0 -ATI ASUS EAH26xx						.*ATI.*ASUS.*EAH26.*					3	1	0	0 -ATI ASUS EAH29xx						.*ATI.*ASUS.*EAH29.*					3	1	0	0 -ATI ASUS EAH34xx						.*ATI.*ASUS.*EAH34.*					1	1	0	0 -ATI ASUS EAH36xx						.*ATI.*ASUS.*EAH36.*					2	1	0	0 -ATI ASUS EAH38xx						.*ATI.*ASUS.*EAH38.*					2	1	1	3.3 -ATI ASUS EAH43xx						.*ATI.*ASUS.*EAH43.*					2	1	1	3.3 -ATI ASUS EAH45xx						.*ATI.*ASUS.*EAH45.*					2	1	0	0 -ATI ASUS EAH48xx						.*ATI.*ASUS.*EAH48.*					3	1	1	3.3 -ATI ASUS EAH57xx						.*ATI.*ASUS.*EAH57.*					3	1	1	4.1 -ATI ASUS EAH58xx						.*ATI.*ASUS.*EAH58.*					5	1	1	4.1 -ATI ASUS EAH62xx						.*ATI.*ASUS.*EAH62.*					2	1	0	0 -ATI ASUS EAH63xx						.*ATI.*ASUS.*EAH63.*					2	1	0	0 -ATI ASUS EAH64xx						.*ATI.*ASUS.*EAH64.*					2	1	0	0 -ATI ASUS EAH65xx						.*ATI.*ASUS.*EAH65.*					2	1	0	4.1 -ATI ASUS EAH66xx						.*ATI.*ASUS.*EAH66.*					3	1	0	4.1 -ATI ASUS EAH67xx						.*ATI.*ASUS.*EAH67.*					3	1	0	0 -ATI ASUS EAH68xx						.*ATI.*ASUS.*EAH68.*					5	1	0	4 -ATI ASUS EAH69xx						.*ATI.*ASUS.*EAH69.*					5	1	0	4.1 -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 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 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 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 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 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 -ATI Radeon HD 7100						.*ATI.*AMD Radeon.* HD 71.*				2	1	0	0 -ATI Radeon HD 7200						.*ATI.*AMD Radeon.* HD 72.*				2	1	0	0 -ATI Radeon HD 7300						.*ATI.*AMD Radeon.* HD 73.*				2	1	0	4.2 -ATI Radeon HD 7400						.*ATI.*AMD Radeon.* HD 74.*				2	1	0	4.2 -ATI Radeon HD 7500						.*ATI.*AMD Radeon.* HD 75.*				3	1	1	4.2 -ATI Radeon HD 7600						.*ATI.*AMD Radeon.* HD 76.*				3	1	0	4.2 -ATI Radeon HD 7700						.*ATI.*AMD Radeon.* HD 77.*				4	1	1	4.2 -ATI Radeon HD 7800						.*ATI.*AMD Radeon.* HD 78.*				5	1	1	4.2 -ATI Radeon HD 7900						.*ATI.*AMD Radeon.* HD 79.*				5	1	1	4.2 -ATI ASUS HD7100							.*ATI.*ASUS.* HD71.*					2	1	0	0 -ATI ASUS HD7200							.*ATI.*ASUS.* HD72.*					2	1	0	0 -ATI ASUS HD7300							.*ATI.*ASUS.* HD73.*					2	1	0	0 -ATI ASUS HD7400							.*ATI.*ASUS.* HD74.*					2	1	0	0 -ATI ASUS HD7500							.*ATI.*ASUS.* HD75.*					3	1	1	4.2 -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 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 -ATI Mobility Radeon HD 550v				.*ATI.*Mobility.*HD *550v.*				3	1	1	4 -ATI Mobility Radeon HD 560v				.*ATI.*Mobility.*HD *560v.*				3	1	1	3.2 -ATI Mobility Radeon HD 565v				.*ATI.*Mobility.*HD *565v.*				3	1	1	3.3 -ATI Mobility Radeon HD 2300				.*ATI.*Mobility.*HD *23.*				0	1	1	2.1 -ATI Mobility Radeon HD 2400				.*ATI.*Mobility.*HD *24.*				1	1	1	3.3 -ATI Mobility Radeon HD 2600				.*ATI.*Mobility.*HD *26.*				1	1	1	3.3 -ATI Mobility Radeon HD 2700				.*ATI.*Mobility.*HD *27.*				3	1	0	0 -ATI Mobility Radeon HD 3100				.*ATI.*Mobility.*HD *31.*				0	1	0	0 -ATI Mobility Radeon HD 3200				.*ATI.*Mobility.*HD *32.*				0	1	0	0 -ATI Mobility Radeon HD 3400				.*ATI.*Mobility.*HD *34.*				1	1	1	3.3 -ATI Mobility Radeon HD 3600				.*ATI.*Mobility.*HD *36.*				1	1	1	4 -ATI Mobility Radeon HD 3800				.*ATI.*Mobility.*HD *38.*				3	1	1	3.3 -ATI Mobility Radeon HD 4200				.*ATI.*Mobility.*HD *42.*				1	1	1	4 -ATI Mobility Radeon HD 4300				.*ATI.*Mobility.*HD *43.*				1	1	1	4 -ATI Mobility Radeon HD 4500				.*ATI.*Mobility.*HD *45.*				1	1	1	4 -ATI Mobility Radeon HD 4600				.*ATI.*Mobility.*HD *46.*				2	1	1	3.3 -ATI Mobility Radeon HD 4800				.*ATI.*Mobility.*HD *48.*				3	1	1	3.3 -ATI Mobility Radeon HD 5100				.*ATI.*Mobility.*HD *51.*				3	1	1	3.2 -ATI Mobility Radeon HD 5300				.*ATI.*Mobility.*HD *53.*				3	1	0	0 -ATI Mobility Radeon HD 5400				.*ATI.*Mobility.*HD *54.*				2	1	1	4.2 -ATI Mobility Radeon HD 5500				.*ATI.*Mobility.*HD *55.*				3	1	0	0 -ATI Mobility Radeon HD 5600				.*ATI.*Mobility.*HD *56.*				3	1	1	4.2 -ATI Mobility Radeon HD 5700				.*ATI.*Mobility.*HD *57.*				3	1	1	4.1 -ATI Mobility Radeon HD 6200				.*ATI.*Mobility.*HD *62.*				3	1	0	0 -ATI Mobility Radeon HD 6300				.*ATI.*Mobility.*HD *63.*				3	1	1	4.2 -ATI Mobility Radeon HD 6400M			.*ATI.*Mobility.*HD *64.*				3	1	0	0 -ATI Mobility Radeon HD 6500M			.*ATI.*Mobility.*HD *65.*				5	1	1	4.2 -ATI Mobility Radeon HD 6600M			.*ATI.*Mobility.*HD *66.*				5	1	0	0 -ATI Mobility Radeon HD 6700M			.*ATI.*Mobility.*HD *67.*				5	1	0	0 -ATI Mobility Radeon HD 6800M			.*ATI.*Mobility.*HD *68.*				5	1	0	0 -ATI Mobility Radeon HD 6900M			.*ATI.*Mobility.*HD *69.*				5	1	0	0 -ATI Radeon HD 2300						.*ATI.*Radeon HD *23..					0	1	1	3.3 -ATI Radeon HD 2400						.*ATI.*Radeon HD *24..					1	1	1	4 -ATI Radeon HD 2600						.*ATI.*Radeon HD *26..					2	1	1	3.3 -ATI Radeon HD 2900						.*ATI.*Radeon HD *29..					3	1	1	3.3 -ATI Radeon HD 3000						.*ATI.*Radeon HD *30..					0	1	0	0 -ATI Radeon HD 3100						.*ATI.*Radeon HD *31..					1	1	0	0 -ATI Radeon HD 3200						.*ATI.*Radeon HD *32..					1	1	1	4 -ATI Radeon HD 3300						.*ATI.*Radeon HD *33..					1	1	1	3.3 -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 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 -ATI Radeon HD 4300						.*ATI.*Radeon HD *43..					2	1	1	4 -ATI Radeon HD 4400						.*ATI.*Radeon HD *44..					2	1	0	0 -ATI Radeon HD 4500						.*ATI.*Radeon HD *45..					2	1	1	3.3 -ATI Radeon HD 4600						.*ATI.*Radeon HD *46..					3	1	1	4 -ATI Radeon HD 4700						.*ATI.*Radeon HD *47..					3	1	1	3.3 -ATI Radeon HD 4800						.*ATI.*Radeon HD *48..					3	1	1	4 -ATI ASUS EAH5400						.*ATI.*ASUS EAH54..						3	1	1	4.2 -ATI Radeon HD 5400						.*ATI.*Radeon HD *54..					3	1	1	4.2 -ATI Radeon HD 5500						.*ATI.*Radeon HD *55..					3	1	1	4.2 -ATI ASUS EAH5500						.*ATI.*ASUS EAH55..						3	1	1	4.2 -ATI Radeon HD 5600						.*ATI.*Radeon HD *56..					3	1	1	4.2 -ATI Radeon HD 5700						.*ATI.*Radeon HD *57..					3	1	1	4.2 -ATI Radeon HD 5800						.*ATI.*Radeon HD *58..					4	1	1	4.2 -ATI Radeon HD 5900						.*ATI.*Radeon HD *59..					4	1	1	4.2 -ATI Radeon HD 6200						.*ATI.*Radeon HD *62..					0	1	1	4.2 -ATI Radeon HD 6300						.*ATI.*Radeon HD *63..					1	1	1	4.2 -ATI Radeon HD 6400						.*ATI.*Radeon HD *64..					3	1	1	4.2 -ATI Radeon HD 6500						.*ATI.*Radeon HD *65..					3	1	1	4.2 -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 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 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 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 -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 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 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 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 -ATI FirePro 2000						.*ATI.*FirePro 2.*						2	1	1	4.1 -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 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 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 -Mesa									.*Mesa.*								1	0	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 -NVIDIA G105M							.*NVIDIA .*105M.*						2	1	1	3.3 -NVIDIA G 110M							.*NVIDIA .*110M.*						1	1	1	3.3 -NVIDIA G 120M							.*NVIDIA .*120M.*						1	1	1	3.3 -NVIDIA G 205M							.*NVIDIA .*205M.*						1	1	0	0 -NVIDIA G 410M							.*NVIDIA .*410M.*						3	1	1	4.2 -NVIDIA GT 120M							.*NVIDIA .*GT *12*M.*					3	1	1	3.3 -NVIDIA GT 130M							.*NVIDIA .*GT *13*M.*					3	1	1	3.3 -NVIDIA GT 140M							.*NVIDIA .*GT *14*M.*					3	1	1	3.3 -NVIDIA GT 150M							.*NVIDIA .*GTS *15*M.*					2	1	0	0 -NVIDIA GTS 160M							.*NVIDIA .*GTS *16*M.*					2	1	0	0 -NVIDIA G210M							.*NVIDIA .*G21*M.*						3	1	0	0 -NVIDIA GT 220M							.*NVIDIA .*GT *22*M.*					3	1	1	3.3 -NVIDIA GT 230M							.*NVIDIA .*GT *23*M.*					3	1	1	3.3 -NVIDIA GT 240M							.*NVIDIA .*GT *24*M.*					3	1	1	3.3 -NVIDIA GTS 250M							.*NVIDIA .*GTS *25*M.*					3	1	0	0 -NVIDIA GTS 260M							.*NVIDIA .*GTS *26*M.*					3	1	0	0 -NVIDIA GTX 260M							.*NVIDIA .*GTX *26*M.*					3	1	0	0 -NVIDIA GTX 270M							.*NVIDIA .*GTX *27*M.*					3	1	0	0 -NVIDIA GTX 280M							.*NVIDIA .*GTX *28*M.*					3	1	0	0 -NVIDIA 300M								.*NVIDIA .*30*M.*						3	1	1	4.2 -NVIDIA G 310M							.*NVIDIA .*31*M.*						2	1	0	0 -NVIDIA GT 320M							.*NVIDIA .*GT *32*M.*					3	1	0	0 -NVIDIA GT 325M							.*NVIDIA .*GT *32*M.*					3	1	1	3.3 -NVIDIA GT 330M							.*NVIDIA .*GT *33*M.*					3	1	1	3.3 -NVIDIA GT 340M							.*NVIDIA .*GT *34*M.*					4	1	1	3.3 -NVIDIA GTS 350M							.*NVIDIA .*GTS *35*M.*					4	1	1	3.3 -NVIDIA GTS 360M							.*NVIDIA .*GTS *360M.*					5	1	1	3.3 -NVIDIA 405M								.*NVIDIA .* 40*M.*						2	1	0	4.2 -NVIDIA 410M								.*NVIDIA .* 41*M.*						3	1	0	0 -NVIDIA GT 415M							.*NVIDIA .*GT *41*M.*					3	1	1	4.2 -NVIDIA GT 420M							.*NVIDIA .*GT *42*M.*					3	1	1	4.2 -NVIDIA GT 430M							.*NVIDIA .*GT *43*M.*					3	1	1	4.2 -NVIDIA GT 440M							.*NVIDIA .*GT *44*M.*					3	1	1	4.2 -NVIDIA GT 450M							.*NVIDIA .*GT *45*M.*					3	1	0	0 -NVIDIA GTX 460M							.*NVIDIA .*GTX *46*M.*					4	1	1	4.2 -NVIDIA GTX 470M							.*NVIDIA .*GTX *47*M.*					3	1	0	0 -NVIDIA GTX 480M							.*NVIDIA .*GTX *48*M.*					3	1	1	4.2 -NVIDIA GT 520M							.*NVIDIA .*GT *52*M.*					3	1	1	4.2 -NVIDIA GT 530M							.*NVIDIA .*GT *53*M.*					3	1	1	4.2 -NVIDIA GT 540M							.*NVIDIA .*GT *54*M.*					3	1	1	4.2 -NVIDIA GT 550M							.*NVIDIA .*GT *55*M.*					3	1	1	4.2 -NVIDIA GTX 560M							.*NVIDIA .*GTX *56*M.*					3	1	0	0 -NVIDIA GTX 570M							.*NVIDIA .*GTX *57*M.*					5	1	0	0 -NVIDIA GTX 580M							.*NVIDIA .*GTX *58*M.*					5	1	1	4.2 -NVIDIA 610M								.*NVIDIA.* 61*M.*						3	1	1	4.2 -NVIDIA GT 620M							.*NVIDIA .*GT *62*M.*					3	1	0	0 -NVIDIA GT 630M							.*NVIDIA .*GT *63*M.*					3	1	0	0 -NVIDIA GT 640M							.*NVIDIA .*GT *64*M.*					3	1	0	0 -NVIDIA GT 650M							.*NVIDIA .*GT *65*M.*					3	1	0	0 -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 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 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 -NVIDIA GTS 240							.*NVIDIA .*GTS *24.*					4	1	1	3.3 -NVIDIA GTS 250							.*NVIDIA .*GTS *25.*					4	1	1	3.3 -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 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 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 -NVIDIA GTS 450							.*NVIDIA .*GTS *45.*					4	1	1	4.2 -NVIDIA GTX 460							.*NVIDIA .*GTX *46.*					5	1	1	4.3 -NVIDIA GTX 470							.*NVIDIA .*GTX *47.*					5	1	1	4.2 -NVIDIA GTX 480							.*NVIDIA .*GTX *48.*					5	1	1	4.2 -NVIDIA 510								.*NVIDIA .* 510.*						3	1	0	0 -NVIDIA GT 520							.*NVIDIA .*GT *52.*						3	1	1	4.2 -NVIDIA GT 530							.*NVIDIA .*GT *53.*						3	1	1	4.2 -NVIDIA GT 540							.*NVIDIA .*GT *54.*						3	1	1	4.2 -NVIDIA GTX 550							.*NVIDIA .*GTX *55.*					5	1	1	4.3 -NVIDIA GTX 560							.*NVIDIA .*GTX *56.*					5	1	1	4.2 -NVIDIA GTX 570							.*NVIDIA .*GTX *57.*					5	1	1	4.2 -NVIDIA GTX 580							.*NVIDIA .*GTX *58.*					5	1	1	4.3 -NVIDIA GTX 590							.*NVIDIA .*GTX *59.*					5	1	1	4.2 -NVIDIA GT 610							.*NVIDIA .*GT *61.*						3	1	1	4.2 -NVIDIA GT 620							.*NVIDIA .*GT *62.*						3	1	0	4.2 -NVIDIA GT 630							.*NVIDIA .*GT *63.*						3	1	0	4.2 -NVIDIA GT 640							.*NVIDIA .*GT *64.*						3	1	0	4.3 -NVIDIA GT 650							.*NVIDIA .*GT *65.*						3	1	1	4.2 -NVIDIA GTX 650							.*NVIDIA .*GTX *65.*					3	1	1	4.2 -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 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 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 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 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 8600M					.*NVIDIA .*GeForce 8600M.*				2	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 8800M					.*NVIDIA .*GeForce 8800M.*				2	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 9200M					.*NVIDIA .*GeForce 9200M.*				1	1	0	3.1 -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 9400M					.*NVIDIA .*GeForce 9400M.*				2	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 9600M					.*NVIDIA .*GeForce 9600M.*				2	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 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 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 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 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 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 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 -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 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 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 -NVIDIA Quadro FX 2500M					.*Quadro.*FX *2500M.*					2	1	0	0 -NVIDIA Quadro FX 2700M					.*Quadro.*FX *2700M.*					3	1	0	0 -NVIDIA Quadro FX 2800M					.*Quadro.*FX *2800M.*					3	1	0	3.3 -NVIDIA Quadro FX 3500					.*Quadro.*FX *3500.*					2	1	0	2.1 -NVIDIA Quadro FX 3600					.*Quadro.*FX *3600.*					3	1	0	0 -NVIDIA Quadro FX 3700					.*Quadro.*FX *3700.*					3	1	0	3.3 -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 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 -NVIDIA Quadro NVS 2100M					.*NVIDIA .*NVS *2100M.*					2	1	0	0 -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 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 +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	2.1 +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 Radeon X1300						.*ATI.*(ASUS|Radeon).*X13.*							2	1	1	2.1 +ATI Radeon X1500						.*ATI.*(ASUS|Radeon).*X15.*							2	1	1	2.1 +ATI Radeon X1600						.*ATI.*(ASUS|Radeon).*X16.*							2	1	1	2.1 +ATI Radeon X1700						.*ATI.*(ASUS|Radeon).*X17.*							2	1	1	2.1 +ATI Radeon X1800						.*ATI.*(Radeon|Diamond) X18.* ?.*					3	1	1	2.1 +ATI Radeon X1900						.*ATI.*(Radeon|Diamond|ASUS) X19.* ?.*				2	1	1	2.1 +ATI Radeon X17xx						.*ATI.*(Radeon|Diamond) X17.* ?.*					1	1	1	2.1 +ATI Radeon X16xx						.*ATI.*(Radeon|Diamond) X17.* ?.*					1	1	1	2.1 +ATI Radeon X28xx						.*ATI.*(Radeon|Diamond) X28.. ?.*					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 FirePro M3900						.*ATI.*FirePro.*M39.*								2	1	0	4.1 +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	3.2 +ATI Generic								.*ATI.*Generic.*									0	0	0	0 +ATI Hercules 9800						.*ATI.*Hercules.* 9800.*							1	1	0	0 +ATI IGP 340M							.*ATI.*IGP.* 34[0-9]M.*								0	0	0	1.3 +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 6300M						.*ATI.*AMD Radeon.* (HD|HD )63..M					2	1	1	4.2 +ATI Radeon HD 6400M						.*ATI.*AMD Radeon.* (HD|HD )64..M					2	1	1	4.2 +ATI Radeon HD 6500M						.*ATI.*AMD Radeon.* (HD|HD )65..M					2	1	1	4.2 +ATI Radeon HD 6600M						.*ATI.*AMD Radeon.* (HD 6|6)6..M					3	1	1	4.2 +ATI Radeon HD 6700M						.*ATI.*AMD Radeon.* (HD|HD )67..M					3	1	1	4.2 +ATI Radeon HD 6800M						.*ATI.*AMD Radeon.* (HD|HD )68..M					3	1	1	4.2 +ATI Radeon HD 6300G						.*ATI.*AMD Radeon.* (HD|HD )63..G					2	1	1	4.2 +ATI Radeon HD 6400G						.*ATI.*AMD Radeon.* (HD|HD )64..G					2	1	1	4.2 +ATI Radeon HD 6500G						.*ATI.*AMD Radeon.* (HD|HD )65..G					2	1	1	4.2 +ATI Radeon HD 6600G						.*ATI.*AMD Radeon.* (HD|HD )66..G					3	1	1	4.2 +ATI Radeon HD 7100						.*ATI.*(Radeon|ASUS).* (HD|HD )71.*					2	1	0	0 +ATI Radeon HD 7200						.*ATI.*(Radeon|ASUS).* (HD|HD )72.*					2	1	0	4.2 +ATI Radeon HD 7300						.*ATI.*(Radeon|ASUS).* (HD|HD )73.*					2	1	0	4.2 +ATI Radeon HD 7400						.*ATI.*(Radeon|ASUS).* (HD|HD )74.*					2	1	0	4.2 +ATI Radeon HD 7500						.*ATI.*(Radeon|ASUS).* (HD|HD )75.*					3	1	1	4.2 +ATI Radeon HD 7600						.*ATI.*(Radeon|ASUS).* (HD|HD )76.*					3	1	0	4.2 +ATI Radeon HD 7700						.*ATI.*(Radeon|ASUS).* (HD|HD )77.*					4	1	1	4.2 +ATI Radeon HD 7800						.*ATI.*(Radeon|ASUS).* (HD|HD )78.*					5	1	1	4.2 +ATI Radeon HD 7900						.*ATI.*(Radeon|ASUS).* (HD|HD )79.*					5	1	1	4.2 +ATI Radeon HD 7000 Series				.*ATI.*(Radeon|ASUS).* (HD|HD )7000 Series.*		3	1	1	4.2 +ATI Mobility Radeon 4100				.*ATI.*Mobility.* 41..								1	1	1	3.3 +ATI Mobility Radeon 5000				.*ATI.*Mobility.* 50..								1	1	1	4.2 +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 +ATI Mobility Radeon HD 550v				.*ATI.*Mobility.*HD 550v.*							3	1	1	4 +ATI Mobility Radeon HD 560v				.*ATI.*Mobility.*HD 560v.*							3	1	1	3.2 +ATI Mobility Radeon HD 565v				.*ATI.*Mobility.*HD 565v.*							3	1	1	3.3 +ATI Mobility Radeon HD 2300				.*ATI.*Mobility.*HD 23.*							0	1	1	2.1 +ATI Mobility Radeon HD 2400				.*ATI.*Mobility.*HD 24.*							1	1	1	3.3 +ATI Mobility Radeon HD 2600				.*ATI.*Mobility.*HD 26.*							1	1	1	3.3 +ATI Mobility Radeon HD 2700				.*ATI.*Mobility.*HD 27.*							3	1	0	0 +ATI Mobility Radeon HD 3100				.*ATI.*Mobility.*HD 31.*							0	1	0	0 +ATI Mobility Radeon HD 3200				.*ATI.*Mobility.*HD 32.*							0	1	0	0 +ATI Mobility Radeon HD 3400				.*ATI.*Mobility.*HD 34.*							1	1	1	4 +ATI Mobility Radeon HD 3600				.*ATI.*Mobility.*HD 36.*							1	1	1	4 +ATI Mobility Radeon HD 3800				.*ATI.*Mobility.*HD 38.*							3	1	1	3.3 +ATI Mobility Radeon HD 4200				.*ATI.*Mobility.*HD 42.*							1	1	1	4 +ATI Mobility Radeon HD 4300				.*ATI.*Mobility.*(HD |HD)43.*						1	1	1	4 +ATI Mobility Radeon HD 4500				.*ATI.*Mobility.*HD 45.*							1	1	1	4 +ATI Mobility Radeon HD 4600				.*ATI.*Mobility.*HD 46.*							2	1	1	3.3 +ATI Mobility Radeon HD 4800				.*ATI.*Mobility.*HD 48.*							3	1	1	3.3 +ATI Mobility Radeon HD 5000 Series		.*ATI.*Mobility.*HD 50.*							3	1	1	3.2 +ATI Mobility Radeon HD 5100				.*ATI.*Mobility.*HD 51.*							3	1	1	3.2 +ATI Mobility Radeon HD 5300				.*ATI.*Mobility.*HD 53.*							3	1	0	0 +ATI Mobility Radeon HD 5400				.*ATI.*Mobility.*HD 54.*							2	1	1	4.2 +ATI Mobility Radeon HD 5500				.*ATI.*Mobility.*HD 55.*							3	1	0	4.2 +ATI Mobility Radeon HD 5600				.*ATI.*Mobility.*HD 56.*							3	1	1	4.2 +ATI Mobility Radeon HD 5700				.*ATI.*Mobility.*HD 57.*							3	1	1	4.1 +ATI Mobility Radeon HD 6200				.*ATI.*Mobility.*HD 62.*							3	1	0	0 +ATI Mobility Radeon HD 6300				.*ATI.*Mobility.*HD 63.*							3	1	1	4.2 +ATI Mobility Radeon HD 6400M			.*ATI.*Mobility.*HD 64.*							3	1	0	0 +ATI Mobility Radeon HD 6500M			.*ATI.*Mobility.*HD 65.*							5	1	1	4.2 +ATI Mobility Radeon HD 6600M			.*ATI.*Mobility.*HD 66.*							5	1	0	0 +ATI Mobility Radeon HD 6700M			.*ATI.*Mobility.*HD 67.*							5	1	0	0 +ATI Mobility Radeon HD 6800M			.*ATI.*Mobility.*HD 68.*							5	1	0	0 +ATI Mobility Radeon HD 6900M			.*ATI.*Mobility.*HD 69.*							5	1	0	0 +ATI Mobility Radeon Graphics			.*ATI Mobility Radeon Graphics.*					1	1	0	4 +ATI Radeon HD 2300						.*ATI.*Radeon.* (HD|HD )23..						0	1	1	3.3 +ATI Radeon HD 2400						.*ATI.*(Radeon|ASUS).* (HD|HD |EAH)24..				1	1	1	4 +ATI Radeon HD 2600						.*ATI.*(Radeon|ASUS).* (HD|HD |EAH)26..				2	1	1	4 +ATI Radeon HD 2900						.*ATI.*Radeon.* (HD|HD )29..						3	1	1	3.3 +ATI Radeon HD 3000						.*ATI.*Radeon.* (HD|HD )30..						0	1	0	0 +ATI Radeon HD 3100						.*ATI.*Radeon.* (HD|HD )31..						1	1	0	0 +ATI Radeon HD 3200						.*ATI.*Radeon.* (HD|HD )32..						1	1	1	4 +ATI Radeon HD 3300						.*ATI.*Radeon.* (HD|HD )33..						1	1	1	3.3 +ATI Radeon HD 3400						.*ATI.*(Radeon|ASUS).* (HD|HD |AH|EAH)34..			1	1	1	4 +ATI Radeon HD 3500						.*ATI.*Radeon.* (HD|HD )35..						2	1	0	0 +ATI Radeon HD 3600						.*ATI.*(Radeon|ASUS).* (HD|HD |AH|EAH)36..			3	1	1	4 +ATI Radeon HD 3700						.*ATI.*Radeon.* (HD|HD )37..						3	1	0	3.3 +ATI HD3700								.*ATI.* HD37..										3	1	0	3.3 +ATI Radeon HD 3800						.*ATI.*(Radeon|ASUS).* (HD|HD |EAH)38..				3	1	1	4 +ATI Radeon HD 4100						.*ATI.*Radeon.* (HD|HD )41..						1	1	0	0 +ATI Radeon HD 4200						.*ATI.*Radeon.* (HD|HD )42..						1	1	1	4 +ATI Radeon HD 4300						.*ATI.*(Radeon|ASUS).* (HD4|HD 4|EAH4|4)3..			2	1	1	4 +ATI Radeon HD 4400						.*ATI.*Radeon.* (HD|HD )44..						2	1	0	0 +ATI Radeon HD 4500						.*ATI.*(Radeon|ASUS).* (HD|HD |EAH)45..				2	1	1	3.3 +ATI Radeon HD 4600						.*ATI.*(Radeon|ASUS).* (HD|HD |EAH)46..				3	1	1	4 +ATI Radeon HD 4700						.*ATI.*(Radeon|ASUS).* (HD|HD |EAH)47..				3	1	1	3.3 +ATI Radeon HD 4800						.*ATI.*(Radeon|ASUS).* (HD|HD |EAH)48..				3	1	1	4 +ATI Radeon HD 5400						.*ATI.*(Radeon|ASUS).* (HD|HD |EAH)54..				3	1	1	4.2 +ATI Radeon HD 5500						.*ATI.*(Radeon|ASUS).* (HD|HD |EAH)55..				3	1	1	4.2 +ATI Radeon HD 5600						.*ATI.*(Radeon|ASUS).* (HD|HD |EAH)56..				3	1	1	4.2 +ATI Radeon HD 5700						.*ATI.*(Radeon|ASUS).* (HD|HD |EAH)57..				3	1	1	4.2 +ATI Radeon HD 5800						.*ATI.*(Radeon|ASUS).* (HD|HD |EAH)58..				4	1	1	4.2 +ATI Radeon HD 5900						.*ATI.*Radeon.* (HD|HD )59..						4	1	1	4.2 +ATI Radeon HD 6200						.*ATI.*Radeon.* (HD|HD )62..						0	1	1	4.2 +ATI Radeon HD 6300						.*ATI.*Radeon.* (HD|HD )63..						1	1	1	4.2 +ATI Radeon HD 6400						.*ATI.*(Radeon|ASUS).* (HD|HD |EAH)64..				3	1	1	4.2 +ATI Radeon HD 6500						.*ATI.*(Radeon|ASUS).* (HD|HD |EAH)65..				3	1	1	4.2 +ATI Radeon HD 6600						.*ATI.*(Radeon|ASUS).* (HD|HD |EAH)66..				3	1	1	4.2 +ATI Radeon HD 6700						.*ATI.*(Radeon|ASUS).* (HD|HD |EAH)67..				3	1	1	4.2 +ATI Radeon HD 6800						.*ATI.*(Radeon|ASUS).* (HD|HD |EAH)68..				4	1	1	4.2 +ATI Radeon HD 6900						.*ATI.*(Radeon|ASUS).* (HD|HD |EAH)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 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 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 X600							.*ATI.*(Radeon |ASUS Extreme A)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 X1000						.*ATI.*Radeon ?X10.*								2	1	0	2.1 +ATI Radeon X1200						.*ATI.*Radeon ?X12.*								2	1	0	2.1 +ATI Radeon X1400						.*ATI.*Radeon ?X14.*								2	1	0	2.1 +ATI Radeon X2300						.*ATI.*Radeon ?X23.*								2	1	0	2.1 +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 +ATI ROBSON								.*(AMD|ATI).*ROBSON.*								3	1	0	4 +AMD BARTS (HD 6800)						.*(AMD|ATI).*Barts.*								3	1	1	2.1 +AMD WRESTLER							.*(AMD|ATI).*WRESTLER.*								3	1	1	4 +AMD SUMO								.*(AMD|ATI).*SUMO.*									3	1	1	4.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	2.1 +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	1.4 +AMD TURKS (HD 6500/6600)				.*(AMD|ATI).*Turks.*								3	1	0	2.1 +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	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	1.4 +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.2 +ATI FirePro 3000						.*ATI.*FirePro V3.*									2	1	0	0 +ATI FirePro 4000						.*ATI.*FirePro V4.*									2	1	0	4.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 +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 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	3 +Gallium									.*Gallium.*											1	1	1	2.1 +NVIDIA G100M							.*NVIDIA .* 10[0-9]M.*								4	1	1	3.3 +NVIDIA G 110M							.*NVIDIA .* 11[0-9]M.*								1	1	1	3.3 +NVIDIA G 120M							.*NVIDIA .* 12[0-9]M.*								1	1	1	3.3 +NVIDIA G 200M							.*NVIDIA .* 20[0-9]M.*								1	1	0	0 +NVIDIA G 410M							.*NVIDIA .* 41[0-9]M.*								3	1	1	4.2 +NVIDIA GT 130M							.*NVIDIA .*GT 13[0-9]M.*							3	1	1	3.3 +NVIDIA GT 140M							.*NVIDIA .*GT 14[0-9]M.*							3	1	1	3.3 +NVIDIA GT 150M							.*NVIDIA .*GTS 15[0-9]M.*							2	1	0	0 +NVIDIA GTS 160M							.*NVIDIA .*GTS 16[0-9]M.*							2	1	0	0 +NVIDIA G210M							.*NVIDIA .*G21[0-9]M.*								3	1	0	3.3 +NVIDIA GT 220M							.*NVIDIA .*GT 22[0-9]M.*							3	1	1	3.3 +NVIDIA GT 230M							.*NVIDIA .*GT 23[0-9]M.*							3	1	1	3.3 +NVIDIA GT 240M							.*NVIDIA .*GT 24[0-9]M.*							3	1	1	3.3 +NVIDIA GTS 250M							.*NVIDIA .*GTS 25[0-9]M.*							3	1	0	3.3 +NVIDIA GTS 260M							.*NVIDIA .*GTS 26[0-9]M.*							3	1	0	0 +NVIDIA GTX 260M							.*NVIDIA .*GTX 26[0-9]M.*							3	1	0	3.3 +NVIDIA GTX 270M							.*NVIDIA .*GTX 27[0-9]M.*							3	1	0	0 +NVIDIA GTX 280M							.*NVIDIA .*GTX 28[0-9]M.*							3	1	0	3.3 +NVIDIA 300M								.*NVIDIA .*GT 30[0-9]M.*							3	1	1	4.2 +NVIDIA G 310M							.*NVIDIA .* 31[0-9]M.*								2	1	0	3.3 +NVIDIA GT 320M							.*NVIDIA .* 32[0-9]M.*								3	1	0	3.3 +NVIDIA GT 330M							.*NVIDIA .*GT 33[0-9]M.*							3	1	1	3.3 +NVIDIA GT 340M							.*NVIDIA .*GT 34[0-9]M.*							4	1	1	3.3 +NVIDIA GTS 350M							.*NVIDIA .*GTS 35[0-9]M.*							4	1	1	3.3 +NVIDIA GTS 360M							.*NVIDIA .*GTS 36[0-9]M.*							5	1	1	3.3 +NVIDIA 400M								.*NVIDIA .* 40[0-9]M.*								2	1	0	0 +NVIDIA 410M								.*NVIDIA .* 41[0-9]M.*								3	1	0	0 +NVIDIA GT 420M							.*NVIDIA .*GT 42[0-9]M.*							3	1	1	4.2 +NVIDIA GT 430M							.*NVIDIA .*GT 43[0-9]M.*							3	1	1	4.2 +NVIDIA GT 440M							.*NVIDIA .*GT 44[0-9]M.*							3	1	1	4.2 +NVIDIA GT 450M							.*NVIDIA .*GT 45[0-9]M.*							3	1	0	0 +NVIDIA GTX 460M							.*NVIDIA .*GTX 46[0-9]M.*							4	1	1	4.3 +NVIDIA GTX 470M							.*NVIDIA .*GTX 47[0-9]M.*							3	1	0	4.2 +NVIDIA GTX 480M							.*NVIDIA .*GTX 48[0-9]M.*							3	1	1	4.2 +NVIDIA GT 520M							.*NVIDIA .*GT 52[0-9]M.*							3	1	1	4.2 +NVIDIA GT 530M							.*NVIDIA .*GT 53[0-9]M.*							3	1	1	4.2 +NVIDIA GT 540M							.*NVIDIA .*GT 54[0-9]M.*							3	1	1	4.2 +NVIDIA GT 550M							.*GeForce GT 55[0-9]M.*								3	1	1	4.2 +NVIDIA GTX 560M							.*NVIDIA .*GTX 56[0-9]M.*							3	1	0	4.2 +NVIDIA GTX 570M							.*NVIDIA .*GTX 57[0-9]M.*							5	1	0	4.2 +NVIDIA GTX 580M							.*NVIDIA .*GTX 58[0-9]M.*							5	1	1	4.2 +NVIDIA 610M								.*NVIDIA.* 61[0-9]M.*								3	1	1	4.2 +NVIDIA GT 620M							.*NVIDIA .*GT 62[0-9]M.*							3	1	0	4.2 +NVIDIA GT 630M							.*NVIDIA .*GT 63[0-9]M.*							3	1	0	4.2 +NVIDIA GT 640M							.*NVIDIA .*GT 64[0-9]M.*							3	1	0	4.2 +NVIDIA GT 650M							.*NVIDIA .*GT 65[0-9]M.*							3	1	0	4.2 +NVIDIA GTX 660M							.*NVIDIA .*GTX 66[0-9]M.*							5	1	0	4.3 +NVIDIA GTX 670M							.*NVIDIA .*GTX 67[0-9]M.*							5	1	1	4.2 +NVIDIA GTX 680M							.*NVIDIA .*GTX 68[0-9]M.*							5	1	0	4.2 +NVIDIA GTX 690M							.*NVIDIA .*GTX 69[0-9]M.*							5	1	0	0 +NVIDIA G100								.*NVIDIA .*G10.*									3	1	1	4.2 +NVIDIA GT 120							.*NVIDIA .*GT 12.*									2	1	0	3.3 +NVIDIA GT 130							.*NVIDIA .*GT 13.*									2	1	0	3.3 +NVIDIA GT 140							.*NVIDIA .*GT 14.*									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 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 +NVIDIA GTS 240							.*NVIDIA .*GTS 24.*									4	1	1	3.3 +NVIDIA GTS 250							.*NVIDIA .*GTS 25.*									4	1	1	3.3 +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 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	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.3 +NVIDIA GT 440							.*NVIDIA .*GT 44.*									4	1	0	4.3 +NVIDIA GTS 450							.*NVIDIA .*GTS 45.*									4	1	1	4.2 +NVIDIA GTX 460							.*NVIDIA .*GTX 46.*									5	1	1	4.3 +NVIDIA GTX 470							.*NVIDIA .*GTX 47.*									5	1	1	4.2 +NVIDIA GTX 480							.*NVIDIA .*GTX 48.*									5	1	1	4.2 +NVIDIA 510								.*NVIDIA .* 510.*									3	1	0	4.2 +NVIDIA GT 520							.*NVIDIA .*GT 52.*									3	1	1	4.2 +NVIDIA GT 530							.*NVIDIA .*GT 53.*									3	1	1	4.2 +NVIDIA GT 540							.*NVIDIA .*GT 54.*									3	1	1	4.2 +NVIDIA GTX 550							.*NVIDIA .*GTX 55.*									5	1	1	4.3 +NVIDIA GTX 560							.*NVIDIA .*GTX 56.*									5	1	1	4.3 +NVIDIA GTX 570							.*NVIDIA .*GTX 57.*									5	1	1	4.2 +NVIDIA GTX 580							.*NVIDIA .*GTX 58.*									5	1	1	4.3 +NVIDIA GTX 590							.*NVIDIA .*GTX 59.*									5	1	1	4.2 +NVIDIA 605								.*NVIDIA .* 605.*									3	1	1	4.2 +NVIDIA GT 610							.*NVIDIA .*GT 61.*									3	1	1	4.2 +NVIDIA GT 620							.*NVIDIA .*GT 62.*									3	1	0	4.2 +NVIDIA GT 630							.*NVIDIA .*GT 63.*									3	1	0	4.2 +NVIDIA GT 640							.*NVIDIA .*GT 64.*									3	1	0	4.2 +NVIDIA GT 650							.*NVIDIA .*GT 65.*									3	1	1	4.2 +NVIDIA GTX 650							.*NVIDIA .*GTX 65.*									3	1	1	4.2 +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 GeForce 4						.*NVIDIA .*GeForce ?4.*								0	1	1	1.5 +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	3.3 +NVIDIA GeForce 8200M					.*NVIDIA .*GeForce 820[0-9]M.*						1	1	0	3.3 +NVIDIA GeForce 8200						.*NVIDIA .*GeForce 82.*								1	1	0	3.3 +NVIDIA GeForce 8300						.*NVIDIA .*GeForce 83.*								3	1	1	3.3 +NVIDIA GeForce 8400M					.*NVIDIA .*GeForce 840[0-9]M.*						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 8600M					.*NVIDIA .*GeForce 860[0-9]M.*						2	1	1	3.3 +NVIDIA GeForce 8600						.*NVIDIA .*GeForce 86.*								3	1	1	3.3 +NVIDIA GeForce 8700M					.*NVIDIA .*GeForce 870[0-9]M.*						2	1	1	3.3 +NVIDIA GeForce 8700						.*NVIDIA .*GeForce 87.*								3	1	0	0 +NVIDIA GeForce 8800M					.*NVIDIA .*GeForce 880[0-9]M.*						2	1	1	3.3 +NVIDIA GeForce 8800						.*NVIDIA .*GeForce 88.*								3	1	1	3.3 +NVIDIA GeForce 9100M					.*NVIDIA .*GeForce 910[0-9]M.*						0	1	0	3.3 +NVIDIA GeForce 9100						.*NVIDIA .*GeForce 91.*								0	1	0	3.3 +NVIDIA GeForce 9200M					.*NVIDIA .*GeForce 920[0-9]M.*						1	1	0	3.3 +NVIDIA GeForce 9200						.*NVIDIA .*GeForce 92.*								1	1	0	3.3 +NVIDIA GeForce 9300M					.*NVIDIA .*GeForce 930[0-9]M.*						1	1	1	3.3 +NVIDIA GeForce 9300						.*NVIDIA .*GeForce 93.*								1	1	1	3.3 +NVIDIA GeForce 9400M					.*NVIDIA .*GeForce 940[0-9]M.*						2	1	1	3.3 +NVIDIA GeForce 9400						.*NVIDIA .*GeForce 94.*								3	1	1	3.3 +NVIDIA GeForce 9500M					.*NVIDIA .*GeForce 950[0-9]M.*						1	1	1	3.3 +NVIDIA GeForce 9500						.*NVIDIA .*GeForce 95.*								3	1	1	3.3 +NVIDIA GeForce 9600M					.*NVIDIA .*GeForce 960[0-9]M.*						2	1	1	3.3 +NVIDIA GeForce 9600						.*NVIDIA .*GeForce 96.*								3	1	1	3.3 +NVIDIA GeForce 9700M					.*NVIDIA .*GeForce 970[0-9]M.*						0	1	1	3.3 +NVIDIA GeForce 9800M					.*NVIDIA .*GeForce 980[0-9]M.*						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 FX Go5200				.*NVIDIA .*GeForce FX Go52.*						0	1	0	1.5 +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	1.5 +NVIDIA GeForce Go 6400					.*NVIDIA .*GeForce Go 64.*							1	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	2.1 +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	2.1 +NVIDIA GeForce PCX						.*GeForce PCX.*										0	1	0	1.5 +NVIDIA Generic							.*NVIDIA .*Unknown.*								0	0	0	2.1 +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	2.1 +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	1.5 +NVIDIA Quadro 1000M						.*Quadro.* (K1|1)00[0-9]M.*							2	1	0	4.2 +NVIDIA Quadro 2000 M/D					.*Quadro.* (K2|2)000.*								3	1	0	4.2 +NVIDIA Quadro 3000M						.*Quadro.* (K3|3)00[0-9]M.*							3	1	0	4.2 +NVIDIA Quadro 4000M						.*Quadro.* (K4|4)00[0-9]M.*							3	1	0	4.2 +NVIDIA Quadro 4000						.*Quadro 4000.*										3	1	0	4.2 +NVIDIA Quadro 50x0 M					.*Quadro.* 50.0.*									3	1	0	4.2 +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	4.2 +NVIDIA Quadro4							.*Quadro4.*											0	1	0	1.5 +NVIDIA Quadro DCC						.*Quadro DCC.*										0	1	0	0 +NVIDIA Quadro CX						.*Quadro.*CX.*										3	1	0	0 +NVIDIA Quadro FX 770M					.*Quadro.*FX 77[0-9]M.*								2	1	0	3.3 +NVIDIA Quadro FX 1500M					.*Quadro.*FX 150[0-9]M.*							1	1	0	2.1 +NVIDIA Quadro FX 1600M					.*Quadro.*FX 160[0-9]M.*							2	1	0	3.3 +NVIDIA Quadro FX 2500M					.*Quadro.*FX 250[0-9]M.*							2	1	0	2.1 +NVIDIA Quadro FX 2700M					.*Quadro.*FX 270[0-9]M.*							3	1	0	3.3 +NVIDIA Quadro FX 2800M					.*Quadro.*FX 280[0-9]M.*							3	1	0	3.3 +NVIDIA Quadro FX 3500					.*Quadro.*FX 3500.*									2	1	0	2.1 +NVIDIA Quadro FX 3600					.*Quadro.*FX 3600.*									3	1	0	3.3 +NVIDIA Quadro FX 3700					.*Quadro.*FX 3700.*									3	1	0	3.3 +NVIDIA Quadro FX 3800					.*Quadro.*FX 3800.*									3	1	0	3.3 +NVIDIA Quadro FX 4500					.*Quadro.*FX 45.*									3	1	0	2.1 +NVIDIA Quadro FX 880M					.*Quadro.*FX 88[0-9]M.*								3	1	0	3.3 +NVIDIA Quadro FX 4800					.*NVIDIA .*Quadro FX 4800.*							3	1	0	3.1 +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 30[0-9]M.*							2	1	0	0 +NVIDIA Quadro NVS 320M					.*NVIDIA .*NVS 32[0-9]M.*							2	1	0	0 +NVIDIA Quadro NVS 2100M					.*NVIDIA .*NVS 210[0-9]M.*							2	1	0	3.3 +NVIDIA Quadro NVS 3100M					.*NVIDIA .*NVS 310[0-9]M.*							2	1	0	3.3 +NVIDIA Quadro NVS 4200M					.*NVIDIA .*NVS 420[0-9]M.*							2	1	0	4.2 +NVIDIA Quadro NVS 5100M					.*NVIDIA .*NVS 510[0-9]M.*							2	1	0	0 +NVIDIA Quadro NVS						.*NVIDIA .*NVS										0	1	0	4.2 +NVIDIA Corporation N12P					.*NVIDIA .*N12P.*									1	1	1	4.1 +NVIDIA Corporation N11M					.*NVIDIA .*N11M.*									2	1	0	3.1 +NVIDIA RIVA TNT							.*RIVA TNT.*										0	0	0	1.5 +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/lldrawpoolavatar.cpp b/indra/newview/lldrawpoolavatar.cpp index 39d1b3de50..e366de9b13 100755 --- a/indra/newview/lldrawpoolavatar.cpp +++ b/indra/newview/lldrawpoolavatar.cpp @@ -135,6 +135,16 @@ void LLDrawPoolAvatar::prerender()  	{  		sBufferUsage = GL_STREAM_DRAW_ARB;  	} + +	if (!mDrawFace.empty()) +	{ +		const LLFace *facep = mDrawFace[0]; +		if (facep && facep->getDrawable()) +		{ +			LLVOAvatar* avatarp = (LLVOAvatar *)facep->getDrawable()->getVObj().get(); +			updateRiggedVertexBuffers(avatarp); +		} +	}  }  LLMatrix4& LLDrawPoolAvatar::getModelView() @@ -1434,6 +1444,65 @@ void LLDrawPoolAvatar::renderAvatars(LLVOAvatar* single_avatar, S32 pass)  	}  } +void LLDrawPoolAvatar::getRiggedGeometry(LLFace* face, LLPointer<LLVertexBuffer>& buffer, U32 data_mask, const LLMeshSkinInfo* skin, LLVolume* volume, const LLVolumeFace& vol_face) +{ +	face->setGeomIndex(0); +	face->setIndicesIndex(0); +		 +	//rigged faces do not batch textures +	face->setTextureIndex(255); + +	if (buffer.isNull() || buffer->getTypeMask() != data_mask || !buffer->isWriteable()) +	{ //make a new buffer +		if (sShaderLevel > 0) +		{ +			buffer = new LLVertexBuffer(data_mask, GL_DYNAMIC_DRAW_ARB); +		} +		else +		{ +			buffer = new LLVertexBuffer(data_mask, GL_STREAM_DRAW_ARB); +		} +		buffer->allocateBuffer(vol_face.mNumVertices, vol_face.mNumIndices, true); +	} +	else +	{ //resize existing buffer +		buffer->resizeBuffer(vol_face.mNumVertices, vol_face.mNumIndices); +	} + +	face->setSize(vol_face.mNumVertices, vol_face.mNumIndices); +	face->setVertexBuffer(buffer); + +	U16 offset = 0; +		 +	LLMatrix4 mat_vert = skin->mBindShapeMatrix; +	glh::matrix4f m((F32*) mat_vert.mMatrix); +	m = m.inverse().transpose(); +		 +	F32 mat3[] =  +	{ m.m[0], m.m[1], m.m[2], +		m.m[4], m.m[5], m.m[6], +		m.m[8], m.m[9], m.m[10] }; + +	LLMatrix3 mat_normal(mat3);				 + +	//let getGeometryVolume know if alpha should override shiny +	U32 type = gPipeline.getPoolTypeFromTE(face->getTextureEntry(), face->getTexture()); + +	if (type == LLDrawPool::POOL_ALPHA) +	{ +		face->setPoolType(LLDrawPool::POOL_ALPHA); +	} +	else +	{ +		face->setPoolType(LLDrawPool::POOL_AVATAR); +	} + +	//llinfos << "Rebuilt face " << face->getTEOffset() << " of " << face->getDrawable() << " at " << gFrameTimeSeconds << llendl; +	face->getGeometryVolume(*volume, face->getTEOffset(), mat_vert, mat_normal, offset, true); + +	buffer->flush(); +} +  void LLDrawPoolAvatar::updateRiggedFaceVertexBuffer(LLVOAvatar* avatar, LLFace* face, const LLMeshSkinInfo* skin, LLVolume* volume, const LLVolumeFace& vol_face)  {  	LLVector4a* weight = vol_face.mWeights; @@ -1453,60 +1522,27 @@ void LLDrawPoolAvatar::updateRiggedFaceVertexBuffer(LLVOAvatar* avatar, LLFace*  		buffer->getNumIndices() != vol_face.mNumIndices ||  		(drawable && drawable->isState(LLDrawable::REBUILD_ALL)))  	{ -		face->setGeomIndex(0); -		face->setIndicesIndex(0); -		 -		//rigged faces do not batch textures -		face->setTextureIndex(255); - -		if (buffer.isNull() || buffer->getTypeMask() != data_mask || !buffer->isWriteable()) -		{ //make a new buffer -			if (sShaderLevel > 0) +		if (drawable && drawable->isState(LLDrawable::REBUILD_ALL)) +		{ //rebuild EVERY face in the drawable, not just this one, to avoid missing drawable wide rebuild issues +			for (S32 i = 0; i < drawable->getNumFaces(); ++i)  			{ -				buffer = new LLVertexBuffer(data_mask, GL_DYNAMIC_DRAW_ARB); -			} -			else -			{ -				buffer = new LLVertexBuffer(data_mask, GL_STREAM_DRAW_ARB); +				LLFace* facep = drawable->getFace(i); +				U32 face_data_mask = facep->getRiggedVertexBufferDataMask(); +				if (face_data_mask) +				{ +					LLPointer<LLVertexBuffer> cur_buffer = facep->getVertexBuffer(); +					const LLVolumeFace& cur_vol_face = volume->getVolumeFace(i); +					getRiggedGeometry(facep, cur_buffer, face_data_mask, skin, volume, cur_vol_face); +				}  			} -			buffer->allocateBuffer(vol_face.mNumVertices, vol_face.mNumIndices, true); -		} -		else -		{ //resize existing buffer -			buffer->resizeBuffer(vol_face.mNumVertices, vol_face.mNumIndices); -		} - -		face->setSize(vol_face.mNumVertices, vol_face.mNumIndices); -		face->setVertexBuffer(buffer); - -		U16 offset = 0; -		 -		LLMatrix4 mat_vert = skin->mBindShapeMatrix; -		glh::matrix4f m((F32*) mat_vert.mMatrix); -		m = m.inverse().transpose(); -		 -		F32 mat3[] =  -		{ m.m[0], m.m[1], m.m[2], -		  m.m[4], m.m[5], m.m[6], -		  m.m[8], m.m[9], m.m[10] }; - -		LLMatrix3 mat_normal(mat3);				 - -		//let getGeometryVolume know if alpha should override shiny -		U32 type = gPipeline.getPoolTypeFromTE(face->getTextureEntry(), face->getTexture()); +			drawable->clearState(LLDrawable::REBUILD_ALL); -		if (type == LLDrawPool::POOL_ALPHA) -		{ -			face->setPoolType(LLDrawPool::POOL_ALPHA); +			buffer = face->getVertexBuffer();  		}  		else -		{ -			face->setPoolType(LLDrawPool::POOL_AVATAR); +		{ //just rebuild this face +			getRiggedGeometry(face, buffer, data_mask, skin, volume, vol_face);  		} - -		face->getGeometryVolume(*volume, face->getTEOffset(), mat_vert, mat_normal, offset, true); - -		buffer->flush();  	}  	if (sShaderLevel <= 0 && face->mLastSkinTime < avatar->getLastSkinTime()) @@ -1591,11 +1627,6 @@ void LLDrawPoolAvatar::updateRiggedFaceVertexBuffer(LLVOAvatar* avatar, LLFace*  			}  		}  	} - -	if (drawable && (face->getTEOffset() == drawable->getNumFaces()-1)) -	{ -		drawable->clearState(LLDrawable::REBUILD_ALL); -	}  }  void LLDrawPoolAvatar::renderRigged(LLVOAvatar* avatar, U32 type, bool glow) @@ -1771,7 +1802,6 @@ void LLDrawPoolAvatar::renderRigged(LLVOAvatar* avatar, U32 type, bool glow)  void LLDrawPoolAvatar::renderDeferredRiggedSimple(LLVOAvatar* avatar)  { -	updateRiggedVertexBuffers(avatar);  	renderRigged(avatar, RIGGED_DEFERRED_SIMPLE);  } @@ -1840,7 +1870,6 @@ void LLDrawPoolAvatar::updateRiggedVertexBuffers(LLVOAvatar* avatar)  void LLDrawPoolAvatar::renderRiggedSimple(LLVOAvatar* avatar)  { -	updateRiggedVertexBuffers(avatar);  	renderRigged(avatar, RIGGED_SIMPLE);  } diff --git a/indra/newview/lldrawpoolavatar.h b/indra/newview/lldrawpoolavatar.h index 7d0368a945..4fbda1f862 100755 --- a/indra/newview/lldrawpoolavatar.h +++ b/indra/newview/lldrawpoolavatar.h @@ -133,6 +133,7 @@ public:  	void endDeferredRiggedSimple();  	void endDeferredRiggedBump(); +	void getRiggedGeometry(LLFace* face, LLPointer<LLVertexBuffer>& buffer, U32 data_mask, const LLMeshSkinInfo* skin, LLVolume* volume, const LLVolumeFace& vol_face);  	void updateRiggedFaceVertexBuffer(LLVOAvatar* avatar,  									  LLFace* facep,   									  const LLMeshSkinInfo* skin,  diff --git a/indra/newview/llface.cpp b/indra/newview/llface.cpp index 7882fe6f33..ef816ddaf6 100755 --- a/indra/newview/llface.cpp +++ b/indra/newview/llface.cpp @@ -768,7 +768,7 @@ bool less_than_max_mag(const LLVector4a& vec)  }  BOOL LLFace::genVolumeBBoxes(const LLVolume &volume, S32 f, -								const LLMatrix4& mat_vert_in, const LLMatrix3& mat_normal_in, BOOL global_volume) +								const LLMatrix4& mat_vert_in, BOOL global_volume)  {  	//get bounding box  	if (mDrawablep->isState(LLDrawable::REBUILD_VOLUME | LLDrawable::REBUILD_POSITION | LLDrawable::REBUILD_RIGGED)) @@ -777,10 +777,6 @@ BOOL LLFace::genVolumeBBoxes(const LLVolume &volume, S32 f,  		LLMatrix4a mat_vert;  		mat_vert.loadu(mat_vert_in); -		LLMatrix4a mat_normal; -		mat_normal.loadu(mat_normal_in); - -		//VECTORIZE THIS  		LLVector4a min,max;  		if (f >= volume.getNumVolumeFaces()) @@ -797,100 +793,68 @@ BOOL LLFace::genVolumeBBoxes(const LLVolume &volume, S32 f,  		llassert(less_than_max_mag(max));  		//min, max are in volume space, convert to drawable render space -		LLVector4a center; -		LLVector4a t; -		t.setAdd(min, max); -		t.mul(0.5f); -		mat_vert.affineTransform(t, center); -		LLVector4a size; -		size.setSub(max, min); -		size.mul(0.5f); -		llassert(less_than_max_mag(min)); -		llassert(less_than_max_mag(max)); +		//get 8 corners of bounding box +		LLVector4Logical mask[6]; -		if (!global_volume) +		for (U32 i = 0; i < 6; ++i)  		{ -			//VECTORIZE THIS -			LLVector4a scale; -			scale.load3(mDrawablep->getVObj()->getScale().mV); -			size.mul(scale); +			mask[i].clear();  		} -		// Catch potential badness from normalization before it happens -		// -		mat_normal.mMatrix[0].normalize3fast(); -		mat_normal.mMatrix[1].normalize3fast(); -		mat_normal.mMatrix[2].normalize3fast(); +		mask[0].setElement<2>(); //001 +		mask[1].setElement<1>(); //010 +		mask[2].setElement<1>(); //011 +		mask[2].setElement<2>(); +		mask[3].setElement<0>(); //100 +		mask[4].setElement<0>(); //101 +		mask[4].setElement<2>(); +		mask[5].setElement<0>(); //110 +		mask[5].setElement<1>(); -		llassert(mat_normal.mMatrix[0].isFinite3()); -		llassert(mat_normal.mMatrix[1].isFinite3()); -		llassert(mat_normal.mMatrix[2].isFinite3()); +		LLVector4a v[8]; -		LLVector4a v[4]; +		v[6] = min; +		v[7] = max; -		//get 4 corners of bounding box -		mat_normal.rotate(size,v[0]); +		for (U32 i = 0; i < 6; ++i) +		{ +			v[i].setSelectWithMask(mask[i], min, max); +		} -		//VECTORIZE THIS -		LLVector4a scale; -		 -		scale.set(-1.f, -1.f, 1.f); -		scale.mul(size); -		mat_normal.rotate(scale, v[1]); -		 -		scale.set(1.f, -1.f, -1.f); -		scale.mul(size); -		mat_normal.rotate(scale, v[2]); -		 -		scale.set(-1.f, 1.f, -1.f); -		scale.mul(size); -		mat_normal.rotate(scale, v[3]); +		LLVector4a tv[8]; +		//transform bounding box into drawable space +		for (U32 i = 0; i < 8; ++i) +		{ +			mat_vert.affineTransform(v[i], tv[i]); +		} +	 +		//find bounding box  		LLVector4a& newMin = mExtents[0];  		LLVector4a& newMax = mExtents[1]; -		 -		newMin = newMax = center; -		 -		llassert(less_than_max_mag(center)); -		 -		for (U32 i = 0; i < 4; i++) -		{ -			LLVector4a delta; -			delta.setAbs(v[i]); -			LLVector4a min; -			min.setSub(center, delta); -			LLVector4a max; -			max.setAdd(center, delta); -			newMin.setMin(newMin,min); -			newMax.setMax(newMax,max); +		newMin = newMax = tv[0]; -			llassert(less_than_max_mag(newMin)); -			llassert(less_than_max_mag(newMax)); +		for (U32 i = 1; i < 8; ++i) +		{ +			newMin.setMin(newMin, tv[i]); +			newMax.setMax(newMax, tv[i]);  		}  		if (!mDrawablep->isActive()) -		{ +		{	// Shift position for region  			LLVector4a offset;  			offset.load3(mDrawablep->getRegion()->getOriginAgent().mV);  			newMin.add(offset);  			newMax.add(offset); -			 -			llassert(less_than_max_mag(newMin)); -			llassert(less_than_max_mag(newMax));  		} -		t.setAdd(newMin, newMax); +		LLVector4a t; +		t.setAdd(newMin,newMax);  		t.mul(0.5f); -		llassert(less_than_max_mag(t)); -		 -		//VECTORIZE THIS  		mCenterLocal.set(t.getF32ptr()); -		 -		llassert(less_than_max_mag(newMin)); -		llassert(less_than_max_mag(newMax));  		t.setSub(newMax,newMin);  		mBoundingSphereRadius = t.getLength3().getF32()*0.5f; diff --git a/indra/newview/llface.h b/indra/newview/llface.h index fc22daa4a3..38f03bd403 100755 --- a/indra/newview/llface.h +++ b/indra/newview/llface.h @@ -195,7 +195,7 @@ public:  	void		setSize(S32 numVertices, S32 num_indices = 0, bool align = false);  	BOOL		genVolumeBBoxes(const LLVolume &volume, S32 f, -								   const LLMatrix4& mat, const LLMatrix3& inv_trans_mat, BOOL global_volume = FALSE); +								   const LLMatrix4& mat, BOOL global_volume = FALSE);  	void		init(LLDrawable* drawablep, LLViewerObject* objp);  	void		destroy(); diff --git a/indra/newview/llfloaterland.cpp b/indra/newview/llfloaterland.cpp index 544eee396b..532c44c932 100755 --- a/indra/newview/llfloaterland.cpp +++ b/indra/newview/llfloaterland.cpp @@ -2118,7 +2118,7 @@ void LLPanelLandOptions::refreshSearch()  	bool can_change =  			LLViewerParcelMgr::isParcelModifiableByAgent( -				parcel, GP_LAND_CHANGE_IDENTITY) +				parcel, GP_LAND_FIND_PLACES)  			&& region  			&& !(region->getRegionFlag(REGION_FLAGS_BLOCK_PARCEL_SEARCH)); diff --git a/indra/newview/llgesturemgr.cpp b/indra/newview/llgesturemgr.cpp index 0b10fbb03f..9fa40bc6b9 100755 --- a/indra/newview/llgesturemgr.cpp +++ b/indra/newview/llgesturemgr.cpp @@ -166,7 +166,7 @@ void LLGestureMgr::activateGestures(LLViewerInventoryItem::item_array_t& items)  			continue;  		}  		else  -		{ // Make gesture active and persistent through login sessions.  -spatters 07-12-06 +		{ // Make gesture active and persistent through login sessions.  -Aura 07-12-06  			activateGesture(item->getUUID());  		} diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp index 8809530ad8..4991c8b030 100755 --- a/indra/newview/llinventorybridge.cpp +++ b/indra/newview/llinventorybridge.cpp @@ -3445,7 +3445,7 @@ void LLFolderBridge::buildContextMenuOptions(U32 flags, menuentry_vec_t&   items  			}  		} -		//Added by spatters to force inventory pull on right-click to display folder options correctly. 07-17-06 +		//Added by aura to force inventory pull on right-click to display folder options correctly. 07-17-06  		mCallingCards = mWearables = FALSE;  		LLIsType is_callingcard(LLAssetType::AT_CALLINGCARD); diff --git a/indra/newview/llmenuoptionpathfindingrebakenavmesh.cpp b/indra/newview/llmenuoptionpathfindingrebakenavmesh.cpp index 2b92b0b3d1..a567d1217a 100755 --- a/indra/newview/llmenuoptionpathfindingrebakenavmesh.cpp +++ b/indra/newview/llmenuoptionpathfindingrebakenavmesh.cpp @@ -92,7 +92,7 @@ void LLMenuOptionPathfindingRebakeNavmesh::initialize()  void LLMenuOptionPathfindingRebakeNavmesh::quit()  { -	if (mIsInitialized) +	if (mIsInitialized)		// Quitting from the login screen leaves this uninitialized  	{  		if (mNavMeshSlot.connected())  		{ diff --git a/indra/newview/llmeshrepository.h b/indra/newview/llmeshrepository.h index 8602271f84..8eaf691d6f 100755 --- a/indra/newview/llmeshrepository.h +++ b/indra/newview/llmeshrepository.h @@ -413,7 +413,7 @@ public:  	void startRequest() { ++mPendingUploads; }  	void stopRequest() { --mPendingUploads; } -		 +  	bool finished() { return mFinished; }  	virtual void run();  	void preStart(); diff --git a/indra/newview/llnamelistctrl.cpp b/indra/newview/llnamelistctrl.cpp index 80d3b2ee7b..b2a3a9f645 100755 --- a/indra/newview/llnamelistctrl.cpp +++ b/indra/newview/llnamelistctrl.cpp @@ -416,9 +416,9 @@ void LLNameListCtrl::onAvatarNameCache(const LLUUID& agent_id,  } -void LLNameListCtrl::updateColumns() +void LLNameListCtrl::updateColumns(bool force_update)  { -	LLScrollListCtrl::updateColumns(); +	LLScrollListCtrl::updateColumns(force_update);  	if (!mNameColumn.empty())  	{ diff --git a/indra/newview/llnamelistctrl.h b/indra/newview/llnamelistctrl.h index 271802d48a..5aa1e1c458 100755 --- a/indra/newview/llnamelistctrl.h +++ b/indra/newview/llnamelistctrl.h @@ -149,7 +149,7 @@ public:  	void sortByName(BOOL ascending); -	/*virtual*/ void updateColumns(); +	/*virtual*/ void updateColumns(bool force_update);  	/*virtual*/ void	mouseOverHighlightNthItem( S32 index );  private: diff --git a/indra/newview/llpanelgroupinvite.cpp b/indra/newview/llpanelgroupinvite.cpp index 04f4454adf..dd13e8abf4 100755 --- a/indra/newview/llpanelgroupinvite.cpp +++ b/indra/newview/llpanelgroupinvite.cpp @@ -85,6 +85,7 @@ public:  	std::string		mAlreadyInGroup;  	std::string		mTooManySelected;  	bool		mConfirmedOwnerInvite; +	std::set<LLUUID>	mInviteeIDs;  	void (*mCloseCallback)(void* data); @@ -117,31 +118,30 @@ LLPanelGroupInvite::impl::~impl()  	}  } +const S32 MAX_GROUP_INVITES = 100; // Max invites per request. 100 to match server cap. +  void LLPanelGroupInvite::impl::addUsers(const std::vector<std::string>& names,  										const uuid_vec_t& agent_ids)  {  	std::string name;  	LLUUID id; +	if (names.size() + mInviteeIDs.size() > MAX_GROUP_INVITES) +	{ +		// Fail! Show a warning and don't add any names. +		LLSD msg; +		msg["MESSAGE"] = mTooManySelected; +		LLNotificationsUtil::add("GenericAlert", msg); +		return; +	} +  	for (S32 i = 0; i < (S32)names.size(); i++)  	{  		name = names[i];  		id = agent_ids[i];  		// Make sure this agent isn't already in the list. -		bool already_in_list = false; -		std::vector<LLScrollListItem*> items = mInvitees->getAllData(); -		for (std::vector<LLScrollListItem*>::iterator iter = items.begin(); -			 iter != items.end(); ++iter) -		{ -			LLScrollListItem* item = *iter; -			if (item->getUUID() == id) -			{ -				already_in_list = true; -				break; -			} -		} -		if (already_in_list) +		if (mInviteeIDs.find(id) != mInviteeIDs.end())  		{  			continue;  		} @@ -152,6 +152,7 @@ void LLPanelGroupInvite::impl::addUsers(const std::vector<std::string>& names,  		row["columns"][0]["value"] = name;  		mInvitees->addElement(row); +		mInviteeIDs.insert(id);  	}  } @@ -193,7 +194,6 @@ void LLPanelGroupInvite::impl::submitInvitations()  		role_member_pairs[item->getUUID()] = role_id;  	} -	const S32 MAX_GROUP_INVITES = 100; // Max invites per request. 100 to match server cap.  	if (role_member_pairs.size() > MAX_GROUP_INVITES)  	{  		// Fail! @@ -334,6 +334,12 @@ void LLPanelGroupInvite::impl::handleRemove()  			mInvitees->getAllSelected();  	if (selection.empty()) return; +	std::vector<LLScrollListItem*>::iterator iter; +	for(iter = selection.begin(); iter != selection.end(); ++iter) +	{ +		mInviteeIDs.erase( (*iter)->getUUID() ); +	} +  	// Remove all selected invitees.  	mInvitees->deleteSelectedItems();  	mRemoveButton->setEnabled(FALSE); @@ -459,6 +465,7 @@ void LLPanelGroupInvite::clear()  	mImplementation->mRoleNames->clear();  	mImplementation->mRoleNames->removeall();  	mImplementation->mOKButton->setEnabled(FALSE); +	mImplementation->mInviteeIDs.clear();  }  void LLPanelGroupInvite::addUsers(uuid_vec_t& agent_ids) diff --git a/indra/newview/llspatialpartition.cpp b/indra/newview/llspatialpartition.cpp index 20a2ddc3b1..725afb9014 100755 --- a/indra/newview/llspatialpartition.cpp +++ b/indra/newview/llspatialpartition.cpp @@ -2537,7 +2537,7 @@ void renderPhysicsShape(LLDrawable* drawable, LLVOVolume* volume)  	}  	else if	(type == LLPhysicsShapeBuilderUtil::PhysicsShapeSpecification::SPHERE)  	{ -		/*LLVolumeParams volume_params; +		LLVolumeParams volume_params;  		volume_params.setType( LL_PCODE_PROFILE_CIRCLE_HALF, LL_PCODE_PATH_CIRCLE );  		volume_params.setBeginAndEndS( 0.f, 1.f );  		volume_params.setBeginAndEndT( 0.f, 1.f ); @@ -2547,7 +2547,7 @@ void renderPhysicsShape(LLDrawable* drawable, LLVOVolume* volume)  		gGL.diffuseColor4fv(color.mV);  		pushVerts(sphere); -		LLPrimitive::sVolumeManager->unrefVolume(sphere);*/ +		LLPrimitive::sVolumeManager->unrefVolume(sphere);  	}  	else if (type == LLPhysicsShapeBuilderUtil::PhysicsShapeSpecification::CYLINDER)  	{ @@ -2629,51 +2629,67 @@ void renderPhysicsShapes(LLSpatialGroup* group)  	{  			continue;  		} -		LLVOVolume* volume = drawable->getVOVolume(); -		if (volume && !volume->isAttachment() && volume->getPhysicsShapeType() != LLViewerObject::PHYSICS_SHAPE_NONE ) + +		if (drawable->isSpatialBridge())  		{ -			if (!group->getSpatialPartition()->isBridge()) +			LLSpatialBridge* bridge = drawable->asPartition()->asBridge(); + +			if (bridge)  			{  				gGL.pushMatrix(); -				LLVector3 trans = drawable->getRegion()->getOriginAgent(); -				gGL.translatef(trans.mV[0], trans.mV[1], trans.mV[2]); -				renderPhysicsShape(drawable, volume); +				gGL.multMatrix((F32*)bridge->mDrawable->getRenderMatrix().mMatrix); +				bridge->renderPhysicsShapes();  				gGL.popMatrix();  			} -			else -			{ -				renderPhysicsShape(drawable, volume); -			}  		}  		else  		{ -			LLViewerObject* object = drawable->getVObj(); -			if (object && object->getPCode() == LLViewerObject::LL_VO_SURFACE_PATCH) +			LLVOVolume* volume = drawable->getVOVolume(); +			if (volume && !volume->isAttachment() && volume->getPhysicsShapeType() != LLViewerObject::PHYSICS_SHAPE_NONE )  			{ -				gGL.pushMatrix(); -				gGL.multMatrix((F32*) object->getRegion()->mRenderMatrix.mMatrix); -				//push face vertices for terrain -				for (S32 i = 0; i < drawable->getNumFaces(); ++i) +				if (!group->getSpatialPartition()->isBridge())  				{ -					LLFace* face = drawable->getFace(i); -					if (face) +					gGL.pushMatrix(); +					LLVector3 trans = drawable->getRegion()->getOriginAgent(); +					gGL.translatef(trans.mV[0], trans.mV[1], trans.mV[2]); +					renderPhysicsShape(drawable, volume); +					gGL.popMatrix(); +				} +				else +				{ +					renderPhysicsShape(drawable, volume); +				} +			} +			else +			{ +				LLViewerObject* object = drawable->getVObj(); +				if (object && object->getPCode() == LLViewerObject::LL_VO_SURFACE_PATCH) +				{ +					gGL.pushMatrix(); +					gGL.multMatrix((F32*) object->getRegion()->mRenderMatrix.mMatrix); +					//push face vertices for terrain +					for (S32 i = 0; i < drawable->getNumFaces(); ++i)  					{ -						LLVertexBuffer* buff = face->getVertexBuffer(); -						if (buff) +						LLFace* face = drawable->getFace(i); +						if (face)  						{ -							glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); +							LLVertexBuffer* buff = face->getVertexBuffer(); +							if (buff) +							{ +								glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); -							buff->setBuffer(LLVertexBuffer::MAP_VERTEX); -							gGL.diffuseColor3f(0.2f, 0.5f, 0.3f); -							buff->draw(LLRender::TRIANGLES, buff->getNumIndices(), 0); +								buff->setBuffer(LLVertexBuffer::MAP_VERTEX); +								gGL.diffuseColor3f(0.2f, 0.5f, 0.3f); +								buff->draw(LLRender::TRIANGLES, buff->getNumIndices(), 0); -							gGL.diffuseColor3f(0.2f, 1.f, 0.3f); -							glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); -							buff->draw(LLRender::TRIANGLES, buff->getNumIndices(), 0); +								gGL.diffuseColor3f(0.2f, 1.f, 0.3f); +								glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); +								buff->draw(LLRender::TRIANGLES, buff->getNumIndices(), 0); +							}  						}  					} +					gGL.popMatrix();  				} -				gGL.popMatrix();  			}  		}  	} diff --git a/indra/newview/lltexturecache.cpp b/indra/newview/lltexturecache.cpp index 79cc66fda5..ef852bc905 100755 --- a/indra/newview/lltexturecache.cpp +++ b/indra/newview/lltexturecache.cpp @@ -1922,10 +1922,10 @@ bool LLTextureCache::writeToFastCache(S32 id, LLPointer<LLImageRaw> raw, S32 dis  		h >>= i;  		if(w * h *c > 0) //valid  		{ -			LLPointer<LLImageRaw> newraw = new LLImageRaw(raw->getData(), raw->getWidth(), raw->getHeight(), raw->getComponents()); -			newraw->scale(w, h) ; -			raw = newraw; - +			//make a duplicate to keep the original raw image untouched. +			raw = raw->duplicate(); +			raw->scale(w, h) ; +			  			discardlevel += i ;  		}  	} @@ -1935,9 +1935,12 @@ bool LLTextureCache::writeToFastCache(S32 id, LLPointer<LLImageRaw> raw, S32 dis  	memcpy(mFastCachePadBuffer + sizeof(S32), &h, sizeof(S32));  	memcpy(mFastCachePadBuffer + sizeof(S32) * 2, &c, sizeof(S32));  	memcpy(mFastCachePadBuffer + sizeof(S32) * 3, &discardlevel, sizeof(S32)); -	if(w * h * c > 0) //valid + +	S32 copy_size = w * h * c; +	if(copy_size > 0) //valid  	{ -		memcpy(mFastCachePadBuffer + TEXTURE_FAST_CACHE_ENTRY_OVERHEAD, raw->getData(), w * h * c); +		copy_size = llmin(copy_size, TEXTURE_FAST_CACHE_ENTRY_SIZE - TEXTURE_FAST_CACHE_ENTRY_OVERHEAD); +		memcpy(mFastCachePadBuffer + TEXTURE_FAST_CACHE_ENTRY_OVERHEAD, raw->getData(), copy_size);  	}  	S32 offset = id * TEXTURE_FAST_CACHE_ENTRY_SIZE; diff --git a/indra/newview/lltoolpie.cpp b/indra/newview/lltoolpie.cpp index 28d0abc9d2..558159775f 100755 --- a/indra/newview/lltoolpie.cpp +++ b/indra/newview/lltoolpie.cpp @@ -122,7 +122,7 @@ BOOL LLToolPie::handleMouseDown(S32 x, S32 y, MASK mask)  BOOL LLToolPie::handleRightMouseDown(S32 x, S32 y, MASK mask)  {  	// don't pick transparent so users can't "pay" transparent objects -	mPick = gViewerWindow->pickImmediate(x, y, FALSE); +	mPick = gViewerWindow->pickImmediate(x, y, FALSE, TRUE);  	mPick.mKeyMask = mask;  	// claim not handled so UI focus stays same @@ -1688,6 +1688,13 @@ BOOL LLToolPie::handleRightClickPick()  			showVisualContextMenuEffect();  		}  	} +	else if (mPick.mParticleOwnerID.notNull()) +	{ +		if (gMenuMuteParticle && mPick.mParticleOwnerID != gAgent.getID()) +		{ +			gMenuMuteParticle->show(x,y); +		} +	}  	LLTool::handleRightMouseDown(x, y, mask);  	// We handled the event. diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp index 41ed2faaa5..2d51e62f70 100755 --- a/indra/newview/llviewermenu.cpp +++ b/indra/newview/llviewermenu.cpp @@ -170,6 +170,7 @@ LLContextMenu	*gMenuObject = NULL;  LLContextMenu	*gMenuAttachmentSelf = NULL;  LLContextMenu	*gMenuAttachmentOther = NULL;  LLContextMenu	*gMenuLand	= NULL; +LLContextMenu	*gMenuMuteParticle = NULL;  const std::string SAVE_INTO_TASK_INVENTORY("Save Object Back to Object Contents"); @@ -426,6 +427,9 @@ void init_menus()  	gMenuLand = LLUICtrlFactory::createFromFile<LLContextMenu>(  		"menu_land.xml", gMenuHolder, registry); +	gMenuMuteParticle = LLUICtrlFactory::createFromFile<LLContextMenu>( +		"menu_mute_particle.xml", gMenuHolder, registry); +  	///  	/// set up the colors  	/// @@ -2437,6 +2441,9 @@ void cleanup_menus()  	delete gMenuLand;  	gMenuLand = NULL; +	delete gMenuMuteParticle; +	gMenuMuteParticle = NULL; +  	delete gMenuBarView;  	gMenuBarView = NULL; @@ -2790,6 +2797,13 @@ bool enable_object_edit()  	return enable;  } +bool enable_mute_particle() +{ +	const LLPickInfo& pick = LLToolPie::getInstance()->getPick(); + +	return pick.mParticleOwnerID != LLUUID::null && pick.mParticleOwnerID != gAgent.getID(); +} +  // mutually exclusive - show either edit option or build in menu  bool enable_object_build()  { @@ -6210,6 +6224,33 @@ class LLLandEdit : public view_listener_t  	}  }; +class LLMuteParticle : public view_listener_t +{ +	bool handleEvent(const LLSD& userdata) +	{ +		LLUUID id = LLToolPie::getInstance()->getPick().mParticleOwnerID; +		 +		if (id.notNull()) +		{ +			std::string name; +			gCacheName->getFullName(id, name); + +			LLMute mute(id, name, LLMute::AGENT); +			if (LLMuteList::getInstance()->isMuted(mute.mID)) +			{ +				LLMuteList::getInstance()->remove(mute); +			} +			else +			{ +				LLMuteList::getInstance()->add(mute); +				LLPanelBlockedList::showPanelAndSelect(mute.mID); +			} +		} + +		return true; +	} +}; +  class LLWorldEnableBuyLand : public view_listener_t  {  	bool handleEvent(const LLSD& userdata) @@ -8703,6 +8744,9 @@ void initialize_menus()  	view_listener_t::addMenu(new LLLandBuyPass(), "Land.BuyPass");  	view_listener_t::addMenu(new LLLandEdit(), "Land.Edit"); +	// Particle muting +	view_listener_t::addMenu(new LLMuteParticle(), "Particle.Mute"); +  	view_listener_t::addMenu(new LLLandEnableBuyPass(), "Land.EnableBuyPass");  	commit.add("Land.Buy", boost::bind(&handle_buy_land)); @@ -8725,6 +8769,7 @@ void initialize_menus()  	enable.add("EnablePayObject", boost::bind(&enable_pay_object));  	enable.add("EnablePayAvatar", boost::bind(&enable_pay_avatar));  	enable.add("EnableEdit", boost::bind(&enable_object_edit)); +	enable.add("EnableMuteParticle", boost::bind(&enable_mute_particle));  	enable.add("VisibleBuild", boost::bind(&enable_object_build));  	commit.add("Pathfinding.Linksets.Select", boost::bind(&LLFloaterPathfindingLinksets::openLinksetsWithSelectedObjects));  	enable.add("EnableSelectInPathfindingLinksets", boost::bind(&enable_object_select_in_pathfinding_linksets)); diff --git a/indra/newview/llviewermenu.h b/indra/newview/llviewermenu.h index 143420e227..7f09fc2d8f 100755 --- a/indra/newview/llviewermenu.h +++ b/indra/newview/llviewermenu.h @@ -177,6 +177,7 @@ extern LLContextMenu		*gMenuObject;  extern LLContextMenu		*gMenuAttachmentSelf;  extern LLContextMenu		*gMenuAttachmentOther;  extern LLContextMenu		*gMenuLand; +extern LLContextMenu		*gMenuMuteParticle;  // Needed to build menus when attachment site list available  extern LLMenuGL* gAttachSubMenu; diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp index cbc895390c..b4ed2adb07 100755 --- a/indra/newview/llviewermessage.cpp +++ b/indra/newview/llviewermessage.cpp @@ -7219,8 +7219,12 @@ void process_script_teleport_request(LLMessageSystem* msg, void**)  	LLFloaterWorldMap* instance = LLFloaterWorldMap::getInstance();  	if(instance)  	{ -		instance->trackURL( -						   sim_name, (S32)pos.mV[VX], (S32)pos.mV[VY], (S32)pos.mV[VZ]); +		llinfos << "Object named " << object_name  +			<< " is offering TP to region " +			<< sim_name << " position " << pos +			<< llendl; + +		instance->trackURL(sim_name, (S32)pos.mV[VX], (S32)pos.mV[VY], (S32)pos.mV[VZ]);  		LLFloaterReg::showInstance("world_map", "center");  	} diff --git a/indra/newview/llviewerpartsim.cpp b/indra/newview/llviewerpartsim.cpp index 978c307c60..09b6b8eb4b 100755 --- a/indra/newview/llviewerpartsim.cpp +++ b/indra/newview/llviewerpartsim.cpp @@ -502,9 +502,13 @@ void LLViewerPartSim::destroyClass()  //static  BOOL LLViewerPartSim::shouldAddPart()  { -	if (sParticleCount > PART_THROTTLE_THRESHOLD*sMaxParticleCount) +	if (sParticleCount >= MAX_PART_COUNT)  	{ +		return FALSE; +	} +	if (sParticleCount > PART_THROTTLE_THRESHOLD*sMaxParticleCount) +	{  		F32 frac = (F32)sParticleCount/(F32)sMaxParticleCount;  		frac -= PART_THROTTLE_THRESHOLD;  		frac *= PART_THROTTLE_RESCALE; @@ -514,7 +518,10 @@ BOOL LLViewerPartSim::shouldAddPart()  			return FALSE;  		}  	} -	if (sParticleCount >= MAX_PART_COUNT) + +	// Check frame rate, and don't add more if the viewer is really slow +	const F32 MIN_FRAME_RATE_FOR_NEW_PARTICLES = 4.f; +	if (gFPSClamped < MIN_FRAME_RATE_FOR_NEW_PARTICLES)  	{  		return FALSE;  	} diff --git a/indra/newview/llviewertexture.cpp b/indra/newview/llviewertexture.cpp index 6bda1499d0..8cb35cd30b 100755 --- a/indra/newview/llviewertexture.cpp +++ b/indra/newview/llviewertexture.cpp @@ -1227,10 +1227,10 @@ void LLViewerFetchedTexture::dump()  // ONLY called from LLViewerFetchedTextureList  void LLViewerFetchedTexture::destroyTexture()   { -	//if(LLImageGL::sGlobalTextureMemoryInBytes < sMaxDesiredTextureMemInBytes)//not ready to release unused memory. -	//{ -	//	return; -	//} +	if(LLImageGL::sGlobalTextureMemory < sMaxDesiredTextureMem * 0.95f)//not ready to release unused memory. +	{ +		return ; +	}  	if (mNeedsCreateTexture)//return if in the process of generating a new texture.  	{  		return; @@ -1318,7 +1318,12 @@ void LLViewerFetchedTexture::addToCreateTexture()  							destroyRawImage();  							return;  						} -						mRawImage->scale(w >> i, h >> i);					 + +						{ +							//make a duplicate in case somebody else is using this raw image +							mRawImage = mRawImage->duplicate();  +							mRawImage->scale(w >> i, h >> i) ;					 +						}  					}  				}  			} @@ -1549,7 +1554,7 @@ F32 LLViewerFetchedTexture::calcDecodePriority()  	else if (pixel_priority < 0.001f && !have_all_data)  	{  		// Not on screen but we might want some data -		if (mBoostLevel > BOOST_HIGH) +		if (mBoostLevel > BOOST_SELECTED)  		{  			// Always want high boosted images  			priority = 1.f; @@ -2704,7 +2709,11 @@ void LLViewerFetchedTexture::setCachedRawImage()  				--i;  			} -			mRawImage->scale(w >> i, h >> i); +			{ +				//make a duplicate in case somebody else is using this raw image +				mRawImage = mRawImage->duplicate();  +				mRawImage->scale(w >> i, h >> i) ; +			}  		}  		mCachedRawImage = mRawImage;  		mRawDiscardLevel += i; diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp index 5509c6e0e5..3a62ab68a0 100755 --- a/indra/newview/llviewerwindow.cpp +++ b/indra/newview/llviewerwindow.cpp @@ -229,8 +229,10 @@ LLFrameTimer	gAwayTriggerTimer;  BOOL			gShowOverlayTitle = FALSE;  LLViewerObject*  gDebugRaycastObject = NULL; +LLVOPartGroup* gDebugRaycastParticle = NULL;  LLVector4a       gDebugRaycastIntersection; -LLVector2       gDebugRaycastTexCoord; +LLVector4a		gDebugRaycastParticleIntersection; +LLVector2        gDebugRaycastTexCoord;  LLVector4a       gDebugRaycastNormal;  LLVector4a       gDebugRaycastTangent;  S32				gDebugRaycastFaceHit; @@ -2843,6 +2845,8 @@ void LLViewerWindow::updateUI()  											  &gDebugRaycastTangent,  											  &gDebugRaycastStart,  											  &gDebugRaycastEnd); + +		gDebugRaycastParticle = gPipeline.lineSegmentIntersectParticle(gDebugRaycastStart, gDebugRaycastEnd, &gDebugRaycastParticleIntersection, NULL);  	}  	updateMouseDelta(); @@ -3663,7 +3667,7 @@ void LLViewerWindow::pickAsync(S32 x, S32 y_from_bot, MASK mask, void (*callback  		pick_transparent = TRUE;  	} -	LLPickInfo pick_info(LLCoordGL(x, y_from_bot), mask, pick_transparent, TRUE, callback); +	LLPickInfo pick_info(LLCoordGL(x, y_from_bot), mask, pick_transparent, FALSE, TRUE, callback);  	schedulePick(pick_info);  } @@ -3719,7 +3723,7 @@ void LLViewerWindow::returnEmptyPicks()  }  // Performs the GL object/land pick. -LLPickInfo LLViewerWindow::pickImmediate(S32 x, S32 y_from_bot,  BOOL pick_transparent) +LLPickInfo LLViewerWindow::pickImmediate(S32 x, S32 y_from_bot,  BOOL pick_transparent, BOOL pick_particle)  {  	BOOL in_build_mode = LLFloaterReg::instanceVisible("build");  	if (in_build_mode || LLDrawPoolAlpha::sShowDebugAlpha) @@ -3728,10 +3732,10 @@ LLPickInfo LLViewerWindow::pickImmediate(S32 x, S32 y_from_bot,  BOOL pick_trans  		// "Show Debug Alpha" means no object actually transparent  		pick_transparent = TRUE;  	} - +	  	// shortcut queueing in mPicks and just update mLastPick in place  	MASK	key_mask = gKeyboard->currentMask(TRUE); -	mLastPick = LLPickInfo(LLCoordGL(x, y_from_bot), key_mask, pick_transparent, TRUE, NULL); +	mLastPick = LLPickInfo(LLCoordGL(x, y_from_bot), key_mask, pick_transparent, pick_particle, TRUE, NULL);  	mLastPick.fetchResults();  	return mLastPick; @@ -4290,7 +4294,8 @@ BOOL LLViewerWindow::rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_hei  	F32 scale_factor = 1.0f ;  	if (!keep_window_aspect || (image_width > window_width) || (image_height > window_height))  	{	 -		if ((image_width > window_width || image_height > window_height) && LLPipeline::sRenderDeferred && !show_ui) +		if ((image_width <= gGLManager.mGLMaxTextureSize && image_height <= gGLManager.mGLMaxTextureSize) &&  +			(image_width > window_width || image_height > window_height) && LLPipeline::sRenderDeferred && !show_ui)  		{  			if (scratch_space.allocate(image_width, image_height, GL_RGBA, true, true))  			{ @@ -4305,6 +4310,8 @@ BOOL LLViewerWindow::rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_hei  					snapshot_height = image_height;  					reset_deferred = true;  					mWorldViewRectRaw.set(0, image_height, image_width, 0); +					LLViewerCamera::getInstance()->setViewHeightInPixels( mWorldViewRectRaw.getHeight() ); +					LLViewerCamera::getInstance()->setAspect( getWorldViewAspectRatio() );  					scratch_space.bindTarget();  				}  				else @@ -4515,6 +4522,8 @@ BOOL LLViewerWindow::rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_hei  	if (reset_deferred)  	{  		mWorldViewRectRaw = window_rect; +		LLViewerCamera::getInstance()->setViewHeightInPixels( mWorldViewRectRaw.getHeight() ); +		LLViewerCamera::getInstance()->setAspect( getWorldViewAspectRatio() );  		scratch_space.flush();  		scratch_space.release();  		gPipeline.allocateScreenBuffer(original_width, original_height); @@ -5128,13 +5137,15 @@ LLPickInfo::LLPickInfo()  	  mTangent(),  	  mBinormal(),  	  mHUDIcon(NULL), -	  mPickTransparent(FALSE) +	  mPickTransparent(FALSE), +	  mPickParticle(FALSE)  {  }  LLPickInfo::LLPickInfo(const LLCoordGL& mouse_pos,   		       MASK keyboard_mask,   		       BOOL pick_transparent, +			   BOOL pick_particle,  		       BOOL pick_uv_coords,  		       void (*pick_callback)(const LLPickInfo& pick_info))  	: mMousePt(mouse_pos), @@ -5150,7 +5161,8 @@ LLPickInfo::LLPickInfo(const LLCoordGL& mouse_pos,  	  mTangent(),  	  mBinormal(),  	  mHUDIcon(NULL), -	  mPickTransparent(pick_transparent) +	  mPickTransparent(pick_transparent), +	  mPickParticle(pick_particle)  {  } @@ -5168,6 +5180,10 @@ void LLPickInfo::fetchResults()  	LLVector4a origin;  	origin.load3(LLViewerCamera::getInstance()->getOrigin().mV);  	F32 icon_dist = 0.f; +	LLVector4a start; +	LLVector4a end; +	LLVector4a particle_end; +  	if (hit_icon)  	{  		LLVector4a delta; @@ -5177,14 +5193,24 @@ void LLPickInfo::fetchResults()  	LLViewerObject* hit_object = gViewerWindow->cursorIntersect(mMousePt.mX, mMousePt.mY, 512.f,  									NULL, -1, mPickTransparent, &face_hit, -									&intersection, &uv, &normal, &tangent); +									&intersection, &uv, &normal, &tangent, &start, &end);  	mPickPt = mMousePt;  	U32 te_offset = face_hit > -1 ? face_hit : 0; -	//unproject relative clicked coordinate from window coordinate using GL -	 +	if (mPickParticle) +	{ //get the end point of line segement to use for particle raycast +		if (hit_object) +		{ +			particle_end = intersection; +		} +		else +		{ +			particle_end = end; +		} +	} +  	LLViewerObject* objectp = hit_object; @@ -5199,6 +5225,7 @@ void LLPickInfo::fetchResults()  		mHUDIcon = hit_icon;  		mPickType = PICK_ICON;  		mPosGlobal = mHUDIcon->getPositionGlobal(); +  	}  	else if (objectp)  	{ @@ -5248,6 +5275,18 @@ void LLPickInfo::fetchResults()  		}  	} +	if (mPickParticle) +	{ //search for closest particle to click origin out to intersection point +		S32 part_face = -1; + +		LLVOPartGroup* group = gPipeline.lineSegmentIntersectParticle(start, particle_end, NULL, &part_face); +		if (group) +		{ +			mParticleOwnerID = group->getPartOwner(part_face); +			mParticleSourceID = group->getPartSource(part_face); +		} +	} +  	if (mPickCallback)  	{  		mPickCallback(*this); diff --git a/indra/newview/llviewerwindow.h b/indra/newview/llviewerwindow.h index 930ed9d5a9..5d2df2dfd7 100755 --- a/indra/newview/llviewerwindow.h +++ b/indra/newview/llviewerwindow.h @@ -65,6 +65,7 @@ class LLWindow;  class LLRootView;  class LLWindowListener;  class LLViewerWindowListener; +class LLVOPartGroup;  class LLPopupView;  #define PICK_HALF_WIDTH 5 @@ -87,7 +88,8 @@ public:  	LLPickInfo();  	LLPickInfo(const LLCoordGL& mouse_pos,   		MASK keyboard_mask,  -		BOOL pick_transparent,  +		BOOL pick_transparent, +		BOOL pick_particle,  		BOOL pick_surface_info,  		void (*pick_callback)(const LLPickInfo& pick_info)); @@ -108,6 +110,8 @@ public:  	LLVector3d		mPosGlobal;  	LLVector3		mObjectOffset;  	LLUUID			mObjectID; +	LLUUID			mParticleOwnerID; +	LLUUID			mParticleSourceID;  	S32				mObjectFace;  	LLHUDIcon*		mHUDIcon;  	LLVector3       mIntersection; @@ -118,6 +122,7 @@ public:  	LLVector4		mTangent;  	LLVector3		mBinormal;  	BOOL			mPickTransparent; +	BOOL			mPickParticle;  	void		    getSurfaceInfo();  private: @@ -356,7 +361,7 @@ public:  	void			returnEmptyPicks();  	void			pickAsync(S32 x, S32 y_from_bot, MASK mask, void (*callback)(const LLPickInfo& pick_info), BOOL pick_transparent = FALSE); -	LLPickInfo		pickImmediate(S32 x, S32 y, BOOL pick_transparent); +	LLPickInfo		pickImmediate(S32 x, S32 y, BOOL pick_transparent, BOOL pick_particle = FALSE);  	LLHUDIcon* cursorIntersectIcon(S32 mouse_x, S32 mouse_y, F32 depth,  										   LLVector4a* intersection); @@ -502,6 +507,8 @@ extern LLFrameTimer		gAwayTriggerTimer;		// how long the avatar has been away  extern LLViewerObject*  gDebugRaycastObject;  extern LLVector4a       gDebugRaycastIntersection; +extern LLVOPartGroup*	gDebugRaycastParticle; +extern LLVector4a		gDebugRaycastParticleIntersection;  extern LLVector2        gDebugRaycastTexCoord;  extern LLVector4a       gDebugRaycastNormal;  extern LLVector4a       gDebugRaycastTangent; diff --git a/indra/newview/llvoiceclient.cpp b/indra/newview/llvoiceclient.cpp index b46c55321c..af55c8f741 100755 --- a/indra/newview/llvoiceclient.cpp +++ b/indra/newview/llvoiceclient.cpp @@ -714,14 +714,7 @@ BOOL LLVoiceClient::isParticipantAvatar(const LLUUID& id)  BOOL LLVoiceClient::isOnlineSIP(const LLUUID& id)  { -	if (mVoiceModule)  -	{ -		return mVoiceModule->isOnlineSIP(id); -	} -	else -	{  		return FALSE; -	}  }  BOOL LLVoiceClient::getIsSpeaking(const LLUUID& id) diff --git a/indra/newview/llvoiceclient.h b/indra/newview/llvoiceclient.h index bd9ea029a9..1e20a814a0 100755 --- a/indra/newview/llvoiceclient.h +++ b/indra/newview/llvoiceclient.h @@ -198,7 +198,6 @@ public:  	//@{  	virtual BOOL getVoiceEnabled(const LLUUID& id)=0;		// true if we've received data for this avatar  	virtual std::string getDisplayName(const LLUUID& id)=0; -	virtual BOOL isOnlineSIP(const LLUUID &id)=0;	  	virtual BOOL isParticipantAvatar(const LLUUID &id)=0;  	virtual BOOL getIsSpeaking(const LLUUID& id)=0;  	virtual BOOL getIsModeratorMuted(const LLUUID& id)=0; diff --git a/indra/newview/llvoicevivox.cpp b/indra/newview/llvoicevivox.cpp index 93351d21f5..6ff849cfd2 100755 --- a/indra/newview/llvoicevivox.cpp +++ b/indra/newview/llvoicevivox.cpp @@ -182,17 +182,10 @@ class LLVivoxVoiceClientMuteListObserver : public LLMuteListObserver  	/* virtual */ void onChange()  { LLVivoxVoiceClient::getInstance()->muteListChanged();}  }; -class LLVivoxVoiceClientFriendsObserver : public LLFriendObserver -{ -public: -	/* virtual */ void changed(U32 mask) { LLVivoxVoiceClient::getInstance()->updateFriends(mask);} -};  static LLVivoxVoiceClientMuteListObserver mutelist_listener;  static bool sMuteListListener_listening = false; -static LLVivoxVoiceClientFriendsObserver *friendslist_listener = NULL; -  ///////////////////////////////////////////////////////////////////////////////////////////////  class LLVivoxVoiceClientCapResponder : public LLHTTPClient::Responder @@ -390,7 +383,6 @@ void LLVivoxVoiceClient::terminate()  void LLVivoxVoiceClient::cleanUp()  {  	deleteAllSessions(); -	deleteAllBuddies();  	deleteAllVoiceFonts();  	deleteVoiceFontTemplates();  } @@ -476,10 +468,10 @@ void LLVivoxVoiceClient::connectorCreate()  	std::string savedLogLevel = gSavedSettings.getString("VivoxDebugLevel"); -	if(savedLogLevel != "-1") +	if(savedLogLevel != "-0")  	{  		LL_DEBUGS("Voice") << "creating connector with logging enabled" << LL_ENDL; -		loglevel = "10"; +		loglevel = "0";  	}  	stream  @@ -792,9 +784,9 @@ void LLVivoxVoiceClient::stateMachine()  						std::string loglevel = gSavedSettings.getString("VivoxDebugLevel");  						if(loglevel.empty())  						{ -							loglevel = "-1";	// turn logging off completely +							loglevel = "0";	// turn logging off completely  						} - +						loglevel = "0";	// turn logging off completely  						params.args.add("-ll");  						params.args.add(loglevel);  						params.cwd = gDirUtilp->getAppRODataDir(); @@ -1202,25 +1194,12 @@ void LLVivoxVoiceClient::stateMachine()  				setState(stateVoiceFontsReceived);  			} -			// request the current set of block rules (we'll need them when updating the friends list) -			accountListBlockRulesSendMessage(); -			 -			// request the current set of auto-accept rules -			accountListAutoAcceptRulesSendMessage(); -			  			// Set up the mute list observer if it hasn't been set up already.  			if((!sMuteListListener_listening))  			{  				LLMuteList::getInstance()->addObserver(&mutelist_listener);  				sMuteListListener_listening = true;  			} - -			// Set up the friends list observer if it hasn't been set up already. -			if(friendslist_listener == NULL) -			{ -				friendslist_listener = new LLVivoxVoiceClientFriendsObserver; -				LLAvatarTracker::instance().addObserver(friendslist_listener); -			}  			// Set the initial state of mic mute, local speaker volume, etc.  			{ @@ -1291,9 +1270,7 @@ void LLVivoxVoiceClient::stateMachine()  		case stateNoChannel:  			LL_DEBUGS("Voice") << "State No Channel" << LL_ENDL;  			mSpatialJoiningNum = 0; -			// Do this here as well as inside sendPositionalUpdate().   -			// Otherwise, if you log in but don't join a proximal channel (such as when your login location has voice disabled), your friends list won't sync. -			sendFriendsListUpdates(); +  			if(mSessionTerminateRequested || (!mVoiceEnabled && mIsInitialized))  			{ @@ -1490,7 +1467,6 @@ void LLVivoxVoiceClient::stateMachine()  					mUpdateTimer.setTimerExpirySec(UPDATE_THROTTLE_SECONDS);  					sendPositionalUpdate();  				} -  				mIsInitialized = true;  			}  		break; @@ -1648,7 +1624,7 @@ void LLVivoxVoiceClient::stateMachine()  void LLVivoxVoiceClient::closeSocket(void)  {  	mSocket.reset(); -	mConnected = false;	 +	mConnected = false;  	mConnectorHandle.clear();  	mAccountHandle.clear();  } @@ -1665,7 +1641,7 @@ void LLVivoxVoiceClient::loginSendMessage()  		<< "<AccountName>" << mAccountName << "</AccountName>"  		<< "<AccountPassword>" << mAccountPassword << "</AccountPassword>"  		<< "<AudioSessionAnswerMode>VerifyAnswer</AudioSessionAnswerMode>" -		<< "<EnableBuddiesAndPresence>true</EnableBuddiesAndPresence>" +        << "<EnableBuddiesAndPresence>false</EnableBuddiesAndPresence>"  		<< "<BuddyManagementMode>Application</BuddyManagementMode>"  		<< "<ParticipantPropertyFrequency>5</ParticipantPropertyFrequency>"  		<< (autoPostCrashDumps?"<AutopostCrashDumps>true</AutopostCrashDumps>":"") @@ -1701,42 +1677,6 @@ void LLVivoxVoiceClient::logoutSendMessage()  	}  } -void LLVivoxVoiceClient::accountListBlockRulesSendMessage() -{ -	if(!mAccountHandle.empty()) -	{		 -		std::ostringstream stream; - -		LL_DEBUGS("Voice") << "requesting block rules" << LL_ENDL; - -		stream -		<< "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Account.ListBlockRules.1\">" -			<< "<AccountHandle>" << mAccountHandle << "</AccountHandle>" -		<< "</Request>" -		<< "\n\n\n"; - -		writeString(stream.str()); -	} -} - -void LLVivoxVoiceClient::accountListAutoAcceptRulesSendMessage() -{ -	if(!mAccountHandle.empty()) -	{		 -		std::ostringstream stream; - -		LL_DEBUGS("Voice") << "requesting auto-accept rules" << LL_ENDL; - -		stream -		<< "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Account.ListAutoAcceptRules.1\">" -			<< "<AccountHandle>" << mAccountHandle << "</AccountHandle>" -		<< "</Request>" -		<< "\n\n\n"; - -		writeString(stream.str()); -	} -} -  void LLVivoxVoiceClient::sessionGroupCreateSendMessage()  {  	if(!mAccountHandle.empty()) @@ -2568,10 +2508,7 @@ void LLVivoxVoiceClient::sendPositionalUpdate(void)  	{  		writeString(stream.str());  	} -	 -	// Friends list updates can be huge, especially on the first voice login of an account with lots of friends. -	// Batching them all together can choke SLVoice, so send them in separate writes. -	sendFriendsListUpdates(); +  }  void LLVivoxVoiceClient::buildSetCaptureDevice(std::ostringstream &stream) @@ -2669,275 +2606,6 @@ void LLVivoxVoiceClient::buildLocalAudioUpdates(std::ostringstream &stream)  } -void LLVivoxVoiceClient::checkFriend(const LLUUID& id) -{ -	buddyListEntry *buddy = findBuddy(id); - -	// Make sure we don't add a name before it's been looked up in the avatar name cache -	LLAvatarName av_name; -	if (LLAvatarNameCache::get(id, &av_name)) -	{ -		// *NOTE: We feed legacy names to Vivox because we don't know if their service -		// can support a mix of new and old clients with different sorts of names. -		std::string name = av_name.getAccountName(); -		 -		if (buddy) -		{ -			// This buddy is already in both lists (vivox buddies and avatar cache). -            // Trust the avatar cache more for the display name (vivox display name are notoriously wrong) -            buddy->mDisplayName = name; -		} -		else -		{ -			// This buddy was not in the vivox list, needs to be added. -			buddy = addBuddy(sipURIFromID(id), name); -			buddy->mUUID = id; -		} -		 -		const LLRelationship* relationInfo = LLAvatarTracker::instance().getBuddyInfo(id); -		buddy->mCanSeeMeOnline = (relationInfo && relationInfo->isRightGrantedTo(LLRelationship::GRANT_ONLINE_STATUS)); -		// In all the above cases, the buddy is in the SL friends list and tha name has been resolved (which is how we got here). -		buddy->mNameResolved = true; -		buddy->mInSLFriends = true; -	} -	else -	{ -		// This name hasn't been looked up yet in the avatar cache. Don't do anything with this buddy list entry until it has. -		if (buddy) -		{ -			buddy->mNameResolved = false; -		} -		// Initiate a lookup. -		// The "lookup completed" callback will ensure that the friends list is rechecked after it completes. -		lookupName(id); -	} -} - -void LLVivoxVoiceClient::clearAllLists() -{ -	// FOR TESTING ONLY -	 -	// This will send the necessary commands to delete ALL buddies, autoaccept rules, and block rules SLVoice tells us about. -	buddyListMap::iterator buddy_it; -	for(buddy_it = mBuddyListMap.begin(); buddy_it != mBuddyListMap.end();) -	{ -		buddyListEntry *buddy = buddy_it->second; -		buddy_it++; -		 -		std::ostringstream stream; - -		if(buddy->mInVivoxBuddies) -		{ -			// delete this entry from the vivox buddy list -			buddy->mInVivoxBuddies = false; -			LL_DEBUGS("Voice") << "delete " << buddy->mURI << " (" << buddy->mDisplayName << ")" << LL_ENDL; -			stream << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Account.BuddyDelete.1\">" -				<< "<AccountHandle>" << mAccountHandle << "</AccountHandle>" -				<< "<BuddyURI>" << buddy->mURI << "</BuddyURI>" -				<< "</Request>\n\n\n";		 -		} - -		if(buddy->mHasBlockListEntry) -		{ -			// Delete the associated block list entry (so the block list doesn't fill up with junk) -			buddy->mHasBlockListEntry = false; -			stream << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Account.DeleteBlockRule.1\">" -				<< "<AccountHandle>" << mAccountHandle << "</AccountHandle>" -				<< "<BlockMask>" << buddy->mURI << "</BlockMask>" -				<< "</Request>\n\n\n";								 -		} -		if(buddy->mHasAutoAcceptListEntry) -		{ -			// Delete the associated auto-accept list entry (so the auto-accept list doesn't fill up with junk) -			buddy->mHasAutoAcceptListEntry = false; -			stream << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Account.DeleteAutoAcceptRule.1\">" -				<< "<AccountHandle>" << mAccountHandle << "</AccountHandle>" -				<< "<AutoAcceptMask>" << buddy->mURI << "</AutoAcceptMask>" -				<< "</Request>\n\n\n"; -		} - -		writeString(stream.str()); - -	} -} - -void LLVivoxVoiceClient::sendFriendsListUpdates() -{ -	if(mBuddyListMapPopulated && mBlockRulesListReceived && mAutoAcceptRulesListReceived && mFriendsListDirty) -	{ -		mFriendsListDirty = false; -		 -		if(0) -		{ -			// FOR TESTING ONLY -- clear all buddy list, block list, and auto-accept list entries. -			clearAllLists(); -			return; -		} -		 -		LL_INFOS("Voice") << "Checking vivox buddy list against friends list..." << LL_ENDL; -		 -		buddyListMap::iterator buddy_it; -		for(buddy_it = mBuddyListMap.begin(); buddy_it != mBuddyListMap.end(); buddy_it++) -		{ -			// reset the temp flags in the local buddy list -			buddy_it->second->mInSLFriends = false; -		} -		 -		// correlate with the friends list -		{ -			LLCollectAllBuddies collect; -			LLAvatarTracker::instance().applyFunctor(collect); -			LLCollectAllBuddies::buddy_map_t::const_iterator it = collect.mOnline.begin(); -			LLCollectAllBuddies::buddy_map_t::const_iterator end = collect.mOnline.end(); -			 -			for ( ; it != end; ++it) -			{ -				checkFriend(it->second); -			} -			it = collect.mOffline.begin(); -			end = collect.mOffline.end(); -			for ( ; it != end; ++it) -			{ -				checkFriend(it->second); -			} -		} -				 -		LL_INFOS("Voice") << "Sending friend list updates..." << LL_ENDL; - -		for(buddy_it = mBuddyListMap.begin(); buddy_it != mBuddyListMap.end();) -		{ -			buddyListEntry *buddy = buddy_it->second; -			buddy_it++; -			 -			// Ignore entries that aren't resolved yet. -			if(buddy->mNameResolved) -			{ -				std::ostringstream stream; - -				if(buddy->mInSLFriends && !buddy->mInVivoxBuddies) -				{					 -					if(mNumberOfAliases > 0) -					{ -						// Add (or update) this entry in the vivox buddy list -						buddy->mInVivoxBuddies = true; -						LL_DEBUGS("Voice") << "add/update " << buddy->mURI << " (" << buddy->mDisplayName << ")" << LL_ENDL; -						stream  -							<< "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Account.BuddySet.1\">" -								<< "<AccountHandle>" << mAccountHandle << "</AccountHandle>" -								<< "<BuddyURI>" << buddy->mURI << "</BuddyURI>" -								<< "<DisplayName>" << buddy->mDisplayName << "</DisplayName>" -								<< "<BuddyData></BuddyData>"	// Without this, SLVoice doesn't seem to parse the command. -								<< "<GroupID>0</GroupID>" -							<< "</Request>\n\n\n";	 -					} -				} -				else if(!buddy->mInSLFriends) -				{ -					// This entry no longer exists in your SL friends list.  Remove all traces of it from the Vivox buddy list. - 					if(buddy->mInVivoxBuddies) -					{ -						// delete this entry from the vivox buddy list -						buddy->mInVivoxBuddies = false; -						LL_DEBUGS("Voice") << "delete " << buddy->mURI << " (" << buddy->mDisplayName << ")" << LL_ENDL; -						stream << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Account.BuddyDelete.1\">" -							<< "<AccountHandle>" << mAccountHandle << "</AccountHandle>" -							<< "<BuddyURI>" << buddy->mURI << "</BuddyURI>" -							<< "</Request>\n\n\n";		 -					} - -					if(buddy->mHasBlockListEntry) -					{ -						// Delete the associated block list entry, if any -						buddy->mHasBlockListEntry = false; -						stream << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Account.DeleteBlockRule.1\">" -							<< "<AccountHandle>" << mAccountHandle << "</AccountHandle>" -							<< "<BlockMask>" << buddy->mURI << "</BlockMask>" -							<< "</Request>\n\n\n";								 -					} -					if(buddy->mHasAutoAcceptListEntry) -					{ -						// Delete the associated auto-accept list entry, if any -						buddy->mHasAutoAcceptListEntry = false; -						stream << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Account.DeleteAutoAcceptRule.1\">" -							<< "<AccountHandle>" << mAccountHandle << "</AccountHandle>" -							<< "<AutoAcceptMask>" << buddy->mURI << "</AutoAcceptMask>" -							<< "</Request>\n\n\n"; -					} -				} -				 -				if(buddy->mInSLFriends) -				{ - -					if(buddy->mCanSeeMeOnline) -					{ -						// Buddy should not be blocked. - -						// If this buddy doesn't already have either a block or autoaccept list entry, we'll update their status when we receive a SubscriptionEvent. -						 -						// If the buddy has a block list entry, delete it. -						if(buddy->mHasBlockListEntry) -						{ -							buddy->mHasBlockListEntry = false; -							stream << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Account.DeleteBlockRule.1\">" -								<< "<AccountHandle>" << mAccountHandle << "</AccountHandle>" -								<< "<BlockMask>" << buddy->mURI << "</BlockMask>" -								<< "</Request>\n\n\n";		 -							 -							 -							// If we just deleted a block list entry, add an auto-accept entry. -							if(!buddy->mHasAutoAcceptListEntry) -							{ -								buddy->mHasAutoAcceptListEntry = true;								 -								stream << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Account.CreateAutoAcceptRule.1\">" -									<< "<AccountHandle>" << mAccountHandle << "</AccountHandle>" -									<< "<AutoAcceptMask>" << buddy->mURI << "</AutoAcceptMask>" -									<< "<AutoAddAsBuddy>0</AutoAddAsBuddy>" -									<< "</Request>\n\n\n"; -							} -						} -					} -					else -					{ -						// Buddy should be blocked. -						 -						// If this buddy doesn't already have either a block or autoaccept list entry, we'll update their status when we receive a SubscriptionEvent. - -						// If this buddy has an autoaccept entry, delete it -						if(buddy->mHasAutoAcceptListEntry) -						{ -							buddy->mHasAutoAcceptListEntry = false; -							stream << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Account.DeleteAutoAcceptRule.1\">" -								<< "<AccountHandle>" << mAccountHandle << "</AccountHandle>" -								<< "<AutoAcceptMask>" << buddy->mURI << "</AutoAcceptMask>" -								<< "</Request>\n\n\n"; -						 -							// If we just deleted an auto-accept entry, add a block list entry. -							if(!buddy->mHasBlockListEntry) -							{ -								buddy->mHasBlockListEntry = true; -								stream << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Account.CreateBlockRule.1\">" -									<< "<AccountHandle>" << mAccountHandle << "</AccountHandle>" -									<< "<BlockMask>" << buddy->mURI << "</BlockMask>" -									<< "<PresenceOnly>1</PresenceOnly>" -									<< "</Request>\n\n\n";								 -							} -						} -					} - -					if(!buddy->mInSLFriends && !buddy->mInVivoxBuddies) -					{ -						// Delete this entry from the local buddy list.  This should NOT invalidate the iterator, -						// since it has already been incremented to the next entry. -						deleteBuddy(buddy->mURI); -					} - -				} -				writeString(stream.str()); -			} -		} -	} -} -  /////////////////////////////  // Response/Event handlers @@ -3711,7 +3379,7 @@ void LLVivoxVoiceClient::participantUpdatedEvent(  			 voice participant mIsModeratorMuted is changed after speakers are updated in Speaker Manager                                            			 and event is not fired.                                                                                                                -			 So, we have to call LLSpeakerMgr::update() here.                                                                                                               +			 So, we have to call LLSpeakerMgr::update() here.   			 */  			LLVoiceChannel* voice_cnl = LLVoiceChannel::getCurrentVoiceChannel(); @@ -3743,83 +3411,6 @@ void LLVivoxVoiceClient::participantUpdatedEvent(  	}  } -void LLVivoxVoiceClient::buddyPresenceEvent( -		std::string &uriString,  -		std::string &alias,  -		std::string &statusString, -		std::string &applicationString) -{ -	buddyListEntry *buddy = findBuddy(uriString); -	 -	if(buddy) -	{ -		LL_DEBUGS("Voice") << "Presence event for " << buddy->mDisplayName << " status \"" << statusString << "\", application \"" << applicationString << "\""<< LL_ENDL; -		LL_DEBUGS("Voice") << "before: mOnlineSL = " << (buddy->mOnlineSL?"true":"false") << ", mOnlineSLim = " << (buddy->mOnlineSLim?"true":"false") << LL_ENDL; - -		if(applicationString.empty()) -		{ -			// This presence event is from a client that doesn't set up the Application string.  Do things the old-skool way. -			// NOTE: this will be needed to support people who aren't on the 3010-class SDK yet. - -			if ( stricmp("Unknown", statusString.c_str())== 0)  -			{ -				// User went offline with a non-SLim-enabled viewer. -				buddy->mOnlineSL = false; -			} -			else if ( stricmp("Online", statusString.c_str())== 0)  -			{ -				// User came online with a non-SLim-enabled viewer. -				buddy->mOnlineSL = true; -			} -			else -			{ -				// If the user is online through SLim, their status will be "Online-slc", "Away", or something else. -				// NOTE: we should never see this unless someone is running an OLD version of SLim -- the versions that should be in use now all set the application string. -				buddy->mOnlineSLim = true; -			}  -		} -		else if(applicationString.find("SecondLifeViewer") != std::string::npos) -		{ -			// This presence event is from a viewer that sets the application string -			if ( stricmp("Unknown", statusString.c_str())== 0)  -			{ -				// Viewer says they're offline -				buddy->mOnlineSL = false; -			} -			else -			{ -				// Viewer says they're online -				buddy->mOnlineSL = true; -			} -		} -		else -		{ -			// This presence event is from something which is NOT the SL viewer (assume it's SLim). -			if ( stricmp("Unknown", statusString.c_str())== 0)  -			{ -				// SLim says they're offline -				buddy->mOnlineSLim = false; -			} -			else -			{ -				// SLim says they're online -				buddy->mOnlineSLim = true; -			} -		}  - -		LL_DEBUGS("Voice") << "after: mOnlineSL = " << (buddy->mOnlineSL?"true":"false") << ", mOnlineSLim = " << (buddy->mOnlineSLim?"true":"false") << LL_ENDL; -		 -		// HACK -- increment the internal change serial number in the LLRelationship (without changing the actual status), so the UI notices the change. -		LLAvatarTracker::instance().setBuddyOnline(buddy->mUUID,LLAvatarTracker::instance().isBuddyOnline(buddy->mUUID)); - -		notifyFriendObservers(); -	} -	else -	{ -		LL_DEBUGS("Voice") << "Presence for unknown buddy " << uriString << LL_ENDL; -	}	 -} -  void LLVivoxVoiceClient::messageEvent(  		std::string &sessionHandle,   		std::string &uriString,  @@ -4010,70 +3601,12 @@ void LLVivoxVoiceClient::sessionNotificationEvent(std::string &sessionHandle, st  	}  } -void LLVivoxVoiceClient::subscriptionEvent(std::string &buddyURI, std::string &subscriptionHandle, std::string &alias, std::string &displayName, std::string &applicationString, std::string &subscriptionType) -{ -	buddyListEntry *buddy = findBuddy(buddyURI); -	 -	if(!buddy) -	{ -		// Couldn't find buddy by URI, try converting the alias... -		if(!alias.empty()) -		{ -			LLUUID id; -			if(IDFromName(alias, id)) -			{ -				buddy = findBuddy(id); -			} -		} -	} -	 -	if(buddy) -	{ -		std::ostringstream stream; -		 -		if(buddy->mCanSeeMeOnline) -		{ -			// Sending the response will create an auto-accept rule -			buddy->mHasAutoAcceptListEntry = true; -		} -		else -		{ -			// Sending the response will create a block rule -			buddy->mHasBlockListEntry = true; -		} -		 -		if(buddy->mInSLFriends) -		{ -			buddy->mInVivoxBuddies = true; -		} -		 -		stream -			<< "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Account.SendSubscriptionReply.1\">" -				<< "<AccountHandle>" << mAccountHandle << "</AccountHandle>" -				<< "<BuddyURI>" << buddy->mURI << "</BuddyURI>" -				<< "<RuleType>" << (buddy->mCanSeeMeOnline?"Allow":"Hide") << "</RuleType>" -				<< "<AutoAccept>"<< (buddy->mInSLFriends?"1":"0")<< "</AutoAccept>" -				<< "<SubscriptionHandle>" << subscriptionHandle << "</SubscriptionHandle>" -			<< "</Request>" -			<< "\n\n\n"; -			 -		writeString(stream.str()); -	} -} -  void LLVivoxVoiceClient::auxAudioPropertiesEvent(F32 energy)  {  	LL_DEBUGS("Voice") << "got energy " << energy << LL_ENDL;  	mTuningEnergy = energy;  } -void LLVivoxVoiceClient::buddyListChanged() -{ -	// This is called after we receive a BuddyAndGroupListChangedEvent. -	mBuddyListMapPopulated = true; -	mFriendsListDirty = true; -} -  void LLVivoxVoiceClient::muteListChanged()  {  	// The user's mute list has been updated.  Go through the current participant list and sync it with the mute list. @@ -4092,15 +3625,6 @@ void LLVivoxVoiceClient::muteListChanged()  	}  } -void LLVivoxVoiceClient::updateFriends(U32 mask) -{ -	if(mask & (LLFriendObserver::ADD | LLFriendObserver::REMOVE | LLFriendObserver::POWERS)) -	{ -		// Just resend the whole friend list to the daemon -		mFriendsListDirty = true; -	} -} -  /////////////////////////////  // Managing list of participants  LLVivoxVoiceClient::participantState::participantState(const std::string &uri) :  @@ -4699,34 +4223,6 @@ bool LLVivoxVoiceClient::answerInvite(std::string &sessionHandle)  	return false;  } -BOOL LLVivoxVoiceClient::isOnlineSIP(const LLUUID &id) -{ -	bool result = false; -	buddyListEntry *buddy = findBuddy(id); -	if(buddy) -	{ -		result = buddy->mOnlineSLim; -		LL_DEBUGS("Voice") << "Buddy " << buddy->mDisplayName << " is SIP " << (result?"online":"offline") << LL_ENDL; -	} - -	if(!result) -	{ -		// This user isn't on the buddy list or doesn't show online status through the buddy list, but could be a participant in an existing session if they initiated a text IM. -		sessionState *session = findSession(id); -		if(session && !session->mHandle.empty()) -		{ -			if((session->mTextStreamState != streamStateUnknown) || (session->mMediaStreamState > streamStateIdle)) -			{ -				LL_DEBUGS("Voice") << "Open session with " << id << " found, returning SIP online state" << LL_ENDL; -				// we have a p2p text session open with this user, so by definition they're online. -				result = true; -			} -		} -	} -	 -	return result; -} -  bool LLVivoxVoiceClient::isVoiceWorking() const  {    //Added stateSessionTerminated state to avoid problems with call in parcels with disabled voice (EXT-4758) @@ -4783,7 +4279,7 @@ BOOL LLVivoxVoiceClient::isSessionCallBackPossible(const LLUUID &session_id)  // Currently this will be false only for PSTN P2P calls.  BOOL LLVivoxVoiceClient::isSessionTextIMPossible(const LLUUID &session_id)  { -	bool result = TRUE;  +	bool result = TRUE;  	sessionState *session = findSession(session_id);  	if(session != NULL) @@ -5832,224 +5328,6 @@ void LLVivoxVoiceClient::verifySessionState(void)  	}  } -LLVivoxVoiceClient::buddyListEntry::buddyListEntry(const std::string &uri) : -	mURI(uri) -{ -	mOnlineSL = false; -	mOnlineSLim = false; -	mCanSeeMeOnline = true; -	mHasBlockListEntry = false; -	mHasAutoAcceptListEntry = false; -	mNameResolved = false; -	mInVivoxBuddies = false; -	mInSLFriends = false; -} - -void LLVivoxVoiceClient::processBuddyListEntry(const std::string &uri, const std::string &displayName) -{ -	buddyListEntry *buddy = addBuddy(uri, displayName); -	buddy->mInVivoxBuddies = true;	 -} - -LLVivoxVoiceClient::buddyListEntry *LLVivoxVoiceClient::addBuddy(const std::string &uri) -{ -	std::string empty; -	buddyListEntry *buddy = addBuddy(uri, empty); -	if(buddy->mDisplayName.empty()) -	{ -		buddy->mNameResolved = false; -	} -	return buddy; -} - -LLVivoxVoiceClient::buddyListEntry *LLVivoxVoiceClient::addBuddy(const std::string &uri, const std::string &displayName) -{ -	buddyListEntry *result = NULL; -	buddyListMap::iterator iter = mBuddyListMap.find(uri); -	 -	if (iter != mBuddyListMap.end()) -	{ -		// Found a matching buddy already in the map. -		LL_DEBUGS("Voice") << "adding existing buddy " << uri << LL_ENDL; -		result = iter->second; -	} - -	if (!result) -	{ -		// participant isn't already in one list or the other. -		LL_DEBUGS("Voice") << "adding new buddy " << uri << LL_ENDL; -		result = new buddyListEntry(uri); -		result->mDisplayName = displayName; - -		if (!IDFromName(uri, result->mUUID)) -		{ -			LL_DEBUGS("Voice") << "Couldn't find ID for buddy " << uri << " (\"" << displayName << "\")" << LL_ENDL; -		} - -		mBuddyListMap.insert(buddyListMap::value_type(result->mURI, result)); -	} -	 -	return result; -} - -LLVivoxVoiceClient::buddyListEntry *LLVivoxVoiceClient::findBuddy(const std::string &uri) -{ -	buddyListEntry *result = NULL; -	buddyListMap::iterator iter = mBuddyListMap.find(uri); -	if(iter != mBuddyListMap.end()) -	{ -		result = iter->second; -	} -	 -	return result; -} - -LLVivoxVoiceClient::buddyListEntry *LLVivoxVoiceClient::findBuddy(const LLUUID &id) -{ -	buddyListEntry *result = NULL; -	buddyListMap::iterator iter; - -	for(iter = mBuddyListMap.begin(); iter != mBuddyListMap.end(); iter++) -	{ -		if(iter->second->mUUID == id) -		{ -			result = iter->second; -			break; -		} -	} -	 -	return result; -} - -LLVivoxVoiceClient::buddyListEntry *LLVivoxVoiceClient::findBuddyByDisplayName(const std::string &name) -{ -	buddyListEntry *result = NULL; -	buddyListMap::iterator iter; - -	for(iter = mBuddyListMap.begin(); iter != mBuddyListMap.end(); iter++) -	{ -		if(iter->second->mDisplayName == name) -		{ -			result = iter->second; -			break; -		} -	} -	 -	return result; -} - -void LLVivoxVoiceClient::deleteBuddy(const std::string &uri) -{ -	buddyListMap::iterator iter = mBuddyListMap.find(uri); -	if(iter != mBuddyListMap.end()) -	{ -		LL_DEBUGS("Voice") << "deleting buddy " << uri << LL_ENDL; -		buddyListEntry *buddy = iter->second; -		mBuddyListMap.erase(iter); -		delete buddy; -	} -	else -	{ -		LL_DEBUGS("Voice") << "attempt to delete nonexistent buddy " << uri << LL_ENDL; -	} -	 -} - -void LLVivoxVoiceClient::deleteAllBuddies(void) -{ -	while(!mBuddyListMap.empty()) -	{ -		deleteBuddy(mBuddyListMap.begin()->first); -	} -	 -	// Don't want to correlate with friends list when we've emptied the buddy list. -	mBuddyListMapPopulated = false; -	 -	// Don't want to correlate with friends list when we've reset the block rules. -	mBlockRulesListReceived = false; -	mAutoAcceptRulesListReceived = false; -} - -void LLVivoxVoiceClient::deleteAllBlockRules(void) -{ -	// Clear the block list entry flags from all local buddy list entries -	buddyListMap::iterator buddy_it; -	for(buddy_it = mBuddyListMap.begin(); buddy_it != mBuddyListMap.end(); buddy_it++) -	{ -		buddy_it->second->mHasBlockListEntry = false; -	} -} - -void LLVivoxVoiceClient::deleteAllAutoAcceptRules(void) -{ -	// Clear the auto-accept list entry flags from all local buddy list entries -	buddyListMap::iterator buddy_it; -	for(buddy_it = mBuddyListMap.begin(); buddy_it != mBuddyListMap.end(); buddy_it++) -	{ -		buddy_it->second->mHasAutoAcceptListEntry = false; -	} -} - -void LLVivoxVoiceClient::addBlockRule(const std::string &blockMask, const std::string &presenceOnly) -{ -	buddyListEntry *buddy = NULL; - -	// blockMask is the SIP URI of a friends list entry -	buddyListMap::iterator iter = mBuddyListMap.find(blockMask); -	if(iter != mBuddyListMap.end()) -	{ -		LL_DEBUGS("Voice") << "block list entry for " << blockMask << LL_ENDL; -		buddy = iter->second; -	} - -	if(buddy == NULL) -	{ -		LL_DEBUGS("Voice") << "block list entry for unknown buddy " << blockMask << LL_ENDL; -		buddy = addBuddy(blockMask); -	} -	 -	if(buddy != NULL) -	{ -		buddy->mHasBlockListEntry = true; -	} -} - -void LLVivoxVoiceClient::addAutoAcceptRule(const std::string &autoAcceptMask, const std::string &autoAddAsBuddy) -{ -	buddyListEntry *buddy = NULL; - -	// blockMask is the SIP URI of a friends list entry -	buddyListMap::iterator iter = mBuddyListMap.find(autoAcceptMask); -	if(iter != mBuddyListMap.end()) -	{ -		LL_DEBUGS("Voice") << "auto-accept list entry for " << autoAcceptMask << LL_ENDL; -		buddy = iter->second; -	} - -	if(buddy == NULL) -	{ -		LL_DEBUGS("Voice") << "auto-accept list entry for unknown buddy " << autoAcceptMask << LL_ENDL; -		buddy = addBuddy(autoAcceptMask); -	} - -	if(buddy != NULL) -	{ -		buddy->mHasAutoAcceptListEntry = true; -	} -} - -void LLVivoxVoiceClient::accountListBlockRulesResponse(int statusCode, const std::string &statusString) -{ -	// Block list entries were updated via addBlockRule() during parsing.  Just flag that we're done. -	mBlockRulesListReceived = true; -} - -void LLVivoxVoiceClient::accountListAutoAcceptRulesResponse(int statusCode, const std::string &statusString) -{ -	// Block list entries were updated via addBlockRule() during parsing.  Just flag that we're done. -	mAutoAcceptRulesListReceived = true; -} -  void LLVivoxVoiceClient::addObserver(LLVoiceClientParticipantObserver* observer)  {  	mParticipantObservers.insert(observer); @@ -6198,11 +5476,6 @@ void LLVivoxVoiceClient::onAvatarNameCache(const LLUUID& agent_id,  void LLVivoxVoiceClient::avatarNameResolved(const LLUUID &id, const std::string &name)  { -	// If the avatar whose name just resolved is on our friends list, resync the friends list. -	if(LLAvatarTracker::instance().getBuddyInfo(id) != NULL) -	{ -		mFriendsListDirty = true; -	}  	// Iterate over all sessions.  	for(sessionIterator iter = sessionsBegin(); iter != sessionsEnd(); iter++)  	{ @@ -6815,7 +6088,6 @@ void LLVivoxVoiceClient::updateVoiceMorphingMenu()  		}  	}  } -  void LLVivoxVoiceClient::notifyVoiceFontObservers()  {  	LL_DEBUGS("Voice") << "Notifying voice effect observers. Lists changed: " << mVoiceFontListDirty << LL_ENDL; @@ -7205,18 +6477,6 @@ void LLVivoxProtocolParser::StartTag(const char *tag, const char **attr)  			{  				deviceString.clear();  			}			 -			else if (!stricmp("Buddies", tag)) -			{ -				LLVivoxVoiceClient::getInstance()->deleteAllBuddies(); -			} -			else if (!stricmp("BlockRules", tag)) -			{ -				LLVivoxVoiceClient::getInstance()->deleteAllBlockRules(); -			} -			else if (!stricmp("AutoAcceptRules", tag)) -			{ -				LLVivoxVoiceClient::getInstance()->deleteAllAutoAcceptRules(); -			}  			else if (!stricmp("SessionFont", tag))  			{  				id = 0; @@ -7251,7 +6511,7 @@ void LLVivoxProtocolParser::StartTag(const char *tag, const char **attr)  void LLVivoxProtocolParser::EndTag(const char *tag)  {  	const std::string& string = textBuffer; - +	  	responseDepth--;  	if (ignoringTags) @@ -7348,24 +6608,10 @@ void LLVivoxProtocolParser::EndTag(const char *tag)  		{  			LLVivoxVoiceClient::getInstance()->addRenderDevice(deviceString);  		} -		else if (!stricmp("Buddy", tag)) -		{ -            // NOTE : Vivox does *not* give reliable display name for Buddy tags -            // We don't take those very seriously as a result... -			LLVivoxVoiceClient::getInstance()->processBuddyListEntry(uriString, displayNameString); -		} -		else if (!stricmp("BlockRule", tag)) -		{ -			LLVivoxVoiceClient::getInstance()->addBlockRule(blockMask, presenceOnly); -		}  		else if (!stricmp("BlockMask", tag))  			blockMask = string;  		else if (!stricmp("PresenceOnly", tag))  			presenceOnly = string; -		else if (!stricmp("AutoAcceptRule", tag)) -		{ -			LLVivoxVoiceClient::getInstance()->addAutoAcceptRule(autoAcceptMask, autoAddAsBuddy); -		}  		else if (!stricmp("AutoAcceptMask", tag))  			autoAcceptMask = string;  		else if (!stricmp("AutoAddAsBuddy", tag)) @@ -7597,16 +6843,6 @@ void LLVivoxProtocolParser::processResponse(std::string tag)  			LLVivoxVoiceClient::getInstance()->auxAudioPropertiesEvent(energy);  		} -		else if (!stricmp(eventTypeCstr, "BuddyPresenceEvent")) -		{ -			LLVivoxVoiceClient::getInstance()->buddyPresenceEvent(uriString, alias, statusString, applicationString); -		} -		else if (!stricmp(eventTypeCstr, "BuddyAndGroupListChangedEvent")) -		{ -			// The buddy list was updated during parsing. -			// Need to recheck against the friends list. -			LLVivoxVoiceClient::getInstance()->buddyListChanged(); -		}  		else if (!stricmp(eventTypeCstr, "BuddyChangedEvent"))  		{  			/* @@ -7629,11 +6865,7 @@ void LLVivoxProtocolParser::processResponse(std::string tag)  		{  			LLVivoxVoiceClient::getInstance()->sessionNotificationEvent(sessionHandle, uriString, notificationType);  		} -		else if (!stricmp(eventTypeCstr, "SubscriptionEvent"))   -		{ -			LLVivoxVoiceClient::getInstance()->subscriptionEvent(uriString, subscriptionHandle, alias, displayNameString, applicationString, subscriptionType); -		} -		else if (!stricmp(eventTypeCstr, "SessionUpdatedEvent"))   +		else if (!stricmp(eventTypeCstr, "SessionUpdatedEvent"))  		{  			/*  			 <Event type="SessionUpdatedEvent"> @@ -7696,14 +6928,6 @@ void LLVivoxProtocolParser::processResponse(std::string tag)  		{  			LLVivoxVoiceClient::getInstance()->connectorShutdownResponse(statusCode, statusString);			  		} -		else if (!stricmp(actionCstr, "Account.ListBlockRules.1")) -		{ -			LLVivoxVoiceClient::getInstance()->accountListBlockRulesResponse(statusCode, statusString);						 -		} -		else if (!stricmp(actionCstr, "Account.ListAutoAcceptRules.1")) -		{ -			LLVivoxVoiceClient::getInstance()->accountListAutoAcceptRulesResponse(statusCode, statusString);						 -		}  		else if (!stricmp(actionCstr, "Session.Set3DPosition.1"))  		{  			// We don't need to process these, but they're so spammy we don't want to log them. diff --git a/indra/newview/llvoicevivox.h b/indra/newview/llvoicevivox.h index a6f40eb3e9..e2d1585c15 100755 --- a/indra/newview/llvoicevivox.h +++ b/indra/newview/llvoicevivox.h @@ -48,7 +48,6 @@ class LLVivoxProtocolParser;  class LLAvatarName;  class LLVivoxVoiceAccountProvisionResponder;  class LLVivoxVoiceClientMuteListObserver; -class LLVivoxVoiceClientFriendsObserver;	  class LLVivoxVoiceClient :	public LLSingleton<LLVivoxVoiceClient>, @@ -181,7 +180,6 @@ public:  	//@{  	virtual BOOL getVoiceEnabled(const LLUUID& id);		// true if we've received data for this avatar  	virtual std::string getDisplayName(const LLUUID& id); -	virtual BOOL isOnlineSIP(const LLUUID &id);  	virtual BOOL isParticipantAvatar(const LLUUID &id);  	virtual BOOL getIsSpeaking(const LLUUID& id);  	virtual BOOL getIsModeratorMuted(const LLUUID& id); @@ -490,14 +488,10 @@ protected:  	void participantRemovedEvent(std::string &sessionHandle, std::string &sessionGroupHandle, std::string &uriString, std::string &alias, std::string &nameString);  	void participantUpdatedEvent(std::string &sessionHandle, std::string &sessionGroupHandle, std::string &uriString, std::string &alias, bool isModeratorMuted, bool isSpeaking, int volume, F32 energy);  	void auxAudioPropertiesEvent(F32 energy); -	void buddyPresenceEvent(std::string &uriString, std::string &alias, std::string &statusString, std::string &applicationString);  	void messageEvent(std::string &sessionHandle, std::string &uriString, std::string &alias, std::string &messageHeader, std::string &messageBody, std::string &applicationString);  	void sessionNotificationEvent(std::string &sessionHandle, std::string &uriString, std::string ¬ificationType); -	void subscriptionEvent(std::string &buddyURI, std::string &subscriptionHandle, std::string &alias, std::string &displayName, std::string &applicationString, std::string &subscriptionType); -	void buddyListChanged();  	void muteListChanged(); -	void updateFriends(U32 mask);  	/////////////////////////////  	// Sending updates of current state @@ -588,24 +582,6 @@ protected:  	typedef std::map<std::string, buddyListEntry*> buddyListMap; -	// This should be called when parsing a buddy list entry sent by SLVoice.		 -	void processBuddyListEntry(const std::string &uri, const std::string &displayName); - -	buddyListEntry *addBuddy(const std::string &uri); -	buddyListEntry *addBuddy(const std::string &uri, const std::string &displayName); -	buddyListEntry *findBuddy(const std::string &uri); -	buddyListEntry *findBuddy(const LLUUID &id); -	buddyListEntry *findBuddyByDisplayName(const std::string &name); -	void deleteBuddy(const std::string &uri); -	void deleteAllBuddies(void); - -	void deleteAllBlockRules(void); -	void addBlockRule(const std::string &blockMask, const std::string &presenceOnly); -	void deleteAllAutoAcceptRules(void); -	void addAutoAcceptRule(const std::string &autoAcceptMask, const std::string &autoAddAsBuddy); -	void accountListBlockRulesResponse(int statusCode, const std::string &statusString);						 -	void accountListAutoAcceptRulesResponse(int statusCode, const std::string &statusString); -  	/////////////////////////////  	// session control messages @@ -774,8 +750,7 @@ private:  	void buildSetCaptureDevice(std::ostringstream &stream);  	void buildSetRenderDevice(std::ostringstream &stream); -	void clearAllLists(); -	void checkFriend(const LLUUID& id); +  	void sendFriendsListUpdates();  	// start a text IM session with the specified user diff --git a/indra/newview/llvopartgroup.cpp b/indra/newview/llvopartgroup.cpp index e226583097..6402a484ec 100755 --- a/indra/newview/llvopartgroup.cpp +++ b/indra/newview/llvopartgroup.cpp @@ -193,8 +193,14 @@ void LLVOPartGroup::updateSpatialExtents(LLVector4a& newMin, LLVector4a& newMax)  	const LLVector3& pos_agent = getPositionAgent();  	newMin.load3( (pos_agent - mScale).mV);  	newMax.load3( (pos_agent + mScale).mV); + +	llassert(newMin.isFinite3()); +	llassert(newMax.isFinite3()); +  	LLVector4a pos;  	pos.load3(pos_agent.mV); + +	llassert(pos.isFinite3());  	mDrawable->setPositionGroup(pos);  } @@ -234,6 +240,37 @@ LLDrawable* LLVOPartGroup::createDrawable(LLPipeline *pipeline)   const F32 MAX_PARTICLE_AREA_SCALE = 0.02f; // some tuned constant, limits on how much particle area to draw + LLUUID LLVOPartGroup::getPartOwner(S32 idx) + { +	 LLUUID ret = LLUUID::null; + +	 if (idx < (S32) mViewerPartGroupp->mParticles.size()) +	 { +		 ret = mViewerPartGroupp->mParticles[idx]->mPartSourcep->getOwnerUUID(); +	 } + +	 return ret; + } + + LLUUID LLVOPartGroup::getPartSource(S32 idx) + { +	 LLUUID ret = LLUUID::null; + +	 if (idx < (S32) mViewerPartGroupp->mParticles.size()) +	 { +		 LLViewerPart* part = mViewerPartGroupp->mParticles[idx]; +		 if (part && part->mPartSourcep.notNull() && +			 part->mPartSourcep->mSourceObjectp.notNull()) +		 { +			 LLViewerObject* source = part->mPartSourcep->mSourceObjectp; +			 ret = source->getID(); +		 } +	 } + +	 return ret; + } + +  F32 LLVOPartGroup::getPartSize(S32 idx)  {  	if (idx < (S32) mViewerPartGroupp->mParticles.size()) @@ -316,6 +353,10 @@ BOOL LLVOPartGroup::updateGeometry(LLDrawable *drawable)  			inv_camera_dist_squared = 1.f / camera_dist_squared;  		else  			inv_camera_dist_squared = 1.f; + +		llassert(llfinite(inv_camera_dist_squared)); +		llassert(!llisnan(inv_camera_dist_squared)); +  		F32 area = part->mScale.mV[0] * part->mScale.mV[1] * inv_camera_dist_squared;  		tot_area = llmax(tot_area, area); @@ -387,20 +428,63 @@ BOOL LLVOPartGroup::updateGeometry(LLDrawable *drawable)  	return TRUE;  } -void LLVOPartGroup::getGeometry(S32 idx, -								LLStrider<LLVector4a>& verticesp, -								LLStrider<LLVector3>& normalsp,  -								LLStrider<LLVector2>& texcoordsp, -								LLStrider<LLColor4U>& colorsp,  -								LLStrider<U16>& indicesp) + +BOOL LLVOPartGroup::lineSegmentIntersect(const LLVector4a& start, const LLVector4a& end, +										  S32 face, +										  BOOL pick_transparent, +										  S32* face_hit, +										  LLVector4a* intersection, +										  LLVector2* tex_coord, +										  LLVector4a* normal, +										  LLVector4a* bi_normal)  { -	if (idx >= (S32) mViewerPartGroupp->mParticles.size()) +	LLVector4a dir; +	dir.setSub(end, start); + +	F32 closest_t = 2.f; +	BOOL ret = FALSE; +	 +	for (U32 idx = 0; idx < mViewerPartGroupp->mParticles.size(); ++idx)  	{ -		return; +		const LLViewerPart &part = *((LLViewerPart*) (mViewerPartGroupp->mParticles[idx])); + +		LLVector4a v[4]; +		LLStrider<LLVector4a> verticesp; +		verticesp = v; +		 +		getGeometry(part, verticesp); + +		F32 a,b,t; +		if (LLTriangleRayIntersect(v[0], v[1], v[2], start, dir, a,b,t) || +			LLTriangleRayIntersect(v[1], v[3], v[2], start, dir, a,b,t)) +		{ +			if (t >= 0.f && +				t <= 1.f && +				t < closest_t) +			{ +				ret = TRUE; +				closest_t = t; +				if (face_hit) +				{ +					*face_hit = idx; +				} + +				if (intersection) +				{ +					LLVector4a intersect = dir; +					intersect.mul(closest_t); +					intersection->setAdd(intersect, start); +				} +			} +		}  	} -	const LLViewerPart &part = *((LLViewerPart*) (mViewerPartGroupp->mParticles[idx])); +	return ret; +} +void LLVOPartGroup::getGeometry(const LLViewerPart& part, +								LLStrider<LLVector4a>& verticesp) +{  	LLVector4a part_pos_agent;  	part_pos_agent.load3(part.mPosAgent.mV);  	LLVector4a camera_agent; @@ -452,8 +536,6 @@ void LLVOPartGroup::getGeometry(S32 idx,  	up.mul(0.5f*part.mScale.mV[1]); -	LLVector3 normal = -LLViewerCamera::getInstance()->getXAxis(); -  	//HACK -- the verticesp->mV[3] = 0.f here are to set the texture index to 0 (particles don't use texture batching, maybe they should)  	// this works because there is actually a 4th float stored after the vertex position which is used as a texture index  	// also, somebody please VECTORIZE THIS @@ -472,6 +554,25 @@ void LLVOPartGroup::getGeometry(S32 idx,  	(*verticesp++).getF32ptr()[3] = 0.f;  	verticesp->setAdd(ppamu, right);  	(*verticesp++).getF32ptr()[3] = 0.f; +} + + +								 +void LLVOPartGroup::getGeometry(S32 idx, +								LLStrider<LLVector4a>& verticesp, +								LLStrider<LLVector3>& normalsp,  +								LLStrider<LLVector2>& texcoordsp, +								LLStrider<LLColor4U>& colorsp,  +								LLStrider<U16>& indicesp) +{ +	if (idx >= (S32) mViewerPartGroupp->mParticles.size()) +	{ +		return; +	} +	 +	const LLViewerPart &part = *((LLViewerPart*) (mViewerPartGroupp->mParticles[idx])); + +	getGeometry(part, verticesp);  	*colorsp++ = part.mColor;  	*colorsp++ = part.mColor; @@ -480,6 +581,7 @@ void LLVOPartGroup::getGeometry(S32 idx,  	if (!(part.mFlags & LLPartData::LL_PART_EMISSIVE_MASK))  	{ //not fullbright, needs normal +		LLVector3 normal = -LLViewerCamera::getInstance()->getXAxis();  		*normalsp++   = normal;  		*normalsp++   = normal;  		*normalsp++   = normal; diff --git a/indra/newview/llvopartgroup.h b/indra/newview/llvopartgroup.h index 42c1252d01..2befb01823 100755 --- a/indra/newview/llvopartgroup.h +++ b/indra/newview/llvopartgroup.h @@ -69,11 +69,23 @@ public:  	virtual void updateSpatialExtents(LLVector4a& newMin, LLVector4a& newMax);  	virtual U32 getPartitionType() const; +	/*virtual*/ BOOL lineSegmentIntersect(const LLVector4a& start, const LLVector4a& end, +										  S32 face, +										  BOOL pick_transparent, +										  S32* face_hit, +										  LLVector4a* intersection, +										  LLVector2* tex_coord, +										  LLVector4a* normal, +										  LLVector4a* tangent); +  	/*virtual*/ void setPixelAreaAndAngle(LLAgent &agent);  	/*virtual*/ void updateTextures();  	/*virtual*/ LLDrawable* createDrawable(LLPipeline *pipeline);  	/*virtual*/ BOOL        updateGeometry(LLDrawable *drawable); +	void		getGeometry(const LLViewerPart& part,							 +								LLStrider<LLVector4a>& verticesp); +				  				void		getGeometry(S32 idx,  								LLStrider<LLVector4a>& verticesp,  								LLStrider<LLVector3>& normalsp,  @@ -83,6 +95,9 @@ public:  	void updateFaceSize(S32 idx) { }  	F32 getPartSize(S32 idx); +	LLUUID getPartOwner(S32 idx); +	LLUUID getPartSource(S32 idx); +  	void setViewerPartGroup(LLViewerPartGroup *part_groupp)		{ mViewerPartGroupp = part_groupp; }  	LLViewerPartGroup* getViewerPartGroup()	{ return mViewerPartGroupp; } diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp index 547ea3369d..4ff9bc6981 100755 --- a/indra/newview/llvovolume.cpp +++ b/indra/newview/llvovolume.cpp @@ -1112,7 +1112,13 @@ void LLVOVolume::sculpt()  		S32 max_discard = mSculptTexture->getMaxDiscardLevel();  		if (discard_level > max_discard) -			discard_level = max_discard;    // clamp to the best we can do +		{ +			discard_level = max_discard;    // clamp to the best we can do			 +		} +		if(discard_level > MAX_DISCARD_LEVEL) +		{ +			return; //we think data is not ready yet. +		}  		S32 current_discard = getVolume()->getSculptLevel() ;  		if(current_discard < -2) @@ -1451,7 +1457,7 @@ BOOL LLVOVolume::genBBoxes(BOOL force_global)  			continue;  		}  		res &= face->genVolumeBBoxes(*volume, i, -										mRelativeXform, mRelativeXformInvTrans, +										mRelativeXform,   										(mVolumeImpl && mVolumeImpl->isVolumeGlobal()) || force_global);  		if (rebuild) @@ -4833,7 +4839,14 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group)  			if (is_rigged)  			{ -				drawablep->setState(LLDrawable::RIGGED); +				if (!drawablep->isState(LLDrawable::RIGGED)) +				{ +					drawablep->setState(LLDrawable::RIGGED); + +					//first time this is drawable is being marked as rigged, +					// do another LoD update to use avatar bounding box +					vobj->updateLOD(); +				}  			}  			else  			{ diff --git a/indra/newview/noise.h b/indra/newview/noise.h index 0923bffcf2..b3efad73c5 100755 --- a/indra/newview/noise.h +++ b/indra/newview/noise.h @@ -310,6 +310,8 @@ static void normalize3(F32 v[3])  static void init(void)  { +	// we want repeatable noise (e.g. for stable terrain texturing), so seed with known value +	srand(42);  	int i, j, k;  	for (i = 0 ; i < B ; i++) { @@ -340,6 +342,9 @@ static void init(void)  		for (j = 0 ; j < 3 ; j++)  			g3[B + i][j] = g3[i][j];  	} + +	// reintroduce entropy +	srand(time(NULL));		// Flawfinder: ignore  }  #undef B diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp index 7c74d4dcca..e77d85849d 100755 --- a/indra/newview/pipeline.cpp +++ b/indra/newview/pipeline.cpp @@ -164,6 +164,7 @@ S32 LLPipeline::RenderGlowIterations;  F32 LLPipeline::RenderGlowWidth;  F32 LLPipeline::RenderGlowStrength;  BOOL LLPipeline::RenderDepthOfField; +BOOL LLPipeline::RenderDepthOfFieldInEditMode;  F32 LLPipeline::CameraFocusTransitionTime;  F32 LLPipeline::CameraFNumber;  F32 LLPipeline::CameraFocalLength; @@ -608,6 +609,7 @@ void LLPipeline::init()  	connectRefreshCachedSettingsSafe("RenderGlowWidth");  	connectRefreshCachedSettingsSafe("RenderGlowStrength");  	connectRefreshCachedSettingsSafe("RenderDepthOfField"); +	connectRefreshCachedSettingsSafe("RenderDepthOfFieldInEditMode");  	connectRefreshCachedSettingsSafe("CameraFocusTransitionTime");  	connectRefreshCachedSettingsSafe("CameraFNumber");  	connectRefreshCachedSettingsSafe("CameraFocalLength"); @@ -1118,6 +1120,7 @@ void LLPipeline::refreshCachedSettings()  	RenderGlowWidth = gSavedSettings.getF32("RenderGlowWidth");  	RenderGlowStrength = gSavedSettings.getF32("RenderGlowStrength");  	RenderDepthOfField = gSavedSettings.getBOOL("RenderDepthOfField"); +	RenderDepthOfFieldInEditMode = gSavedSettings.getBOOL("RenderDepthOfFieldInEditMode");  	CameraFocusTransitionTime = gSavedSettings.getF32("CameraFocusTransitionTime");  	CameraFNumber = gSavedSettings.getF32("CameraFNumber");  	CameraFocalLength = gSavedSettings.getF32("CameraFocalLength"); @@ -4843,18 +4846,6 @@ void LLPipeline::renderPhysicsDisplay()  		}  	} -	for (LLCullResult::bridge_iterator i = sCull->beginVisibleBridge(); i != sCull->endVisibleBridge(); ++i) -	{ -		LLSpatialBridge* bridge = *i; -		if (!bridge->isDead() && hasRenderType(bridge->mDrawableType)) -		{ -			gGL.pushMatrix(); -			gGL.multMatrix((F32*)bridge->mDrawable->getRenderMatrix().mMatrix); -			bridge->renderPhysicsShapes(); -			gGL.popMatrix(); -		} -	} -  	gGL.flush();  	if (LLGLSLShader::sNoFixedFunction) @@ -5303,6 +5294,42 @@ void LLPipeline::renderDebug()  		gUIProgram.bind();  	} +	if (hasRenderDebugMask(LLPipeline::RENDER_DEBUG_RAYCAST) && !hud_only) +	{ //draw crosshairs on particle intersection +		if (gDebugRaycastParticle) +		{ +			if (LLGLSLShader::sNoFixedFunction) +			{ //this debug display requires shaders +				gDebugProgram.bind(); + +				gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); + +				LLVector3 center(gDebugRaycastParticleIntersection.getF32ptr()); +				LLVector3 size(0.1f, 0.1f, 0.1f); + +				LLVector3 p[6]; + +				p[0] = center + size.scaledVec(LLVector3(1,0,0)); +				p[1] = center + size.scaledVec(LLVector3(-1,0,0)); +				p[2] = center + size.scaledVec(LLVector3(0,1,0)); +				p[3] = center + size.scaledVec(LLVector3(0,-1,0)); +				p[4] = center + size.scaledVec(LLVector3(0,0,1)); +				p[5] = center + size.scaledVec(LLVector3(0,0,-1)); +				 +				gGL.begin(LLRender::LINES); +				gGL.diffuseColor3f(1.f, 1.f, 0.f); +				for (U32 i = 0; i < 6; i++) +				{ +					gGL.vertex3fv(p[i].mV); +				} +				gGL.end(); +				gGL.flush(); + +				gDebugProgram.unbind(); +			} +		} +	} +  	if (hasRenderDebugMask(LLPipeline::RENDER_DEBUG_SHADOW_FRUSTA))  	{  		LLVertexBuffer::unbind(); @@ -5336,7 +5363,7 @@ void LLPipeline::renderDebug()  			if (i > 3)  			{ //render shadow frusta as volumes  				if (mShadowFrustPoints[i-4].empty()) -			{ +				{  					continue;  				} @@ -6990,6 +7017,48 @@ void LLPipeline::setRenderHighlightTextureChannel(LLRender::eTexIndex channel)  	sRenderHighlightTextureChannel = channel;  } +LLVOPartGroup* LLPipeline::lineSegmentIntersectParticle(const LLVector4a& start, const LLVector4a& end, LLVector4a* intersection, +														S32* face_hit) +{ +	LLVector4a local_end = end; + +	LLVector4a position; + +	LLDrawable* drawable = NULL; + +	for (LLWorld::region_list_t::const_iterator iter = LLWorld::getInstance()->getRegionList().begin();  +			iter != LLWorld::getInstance()->getRegionList().end(); ++iter) +	{ +		LLViewerRegion* region = *iter; + +		LLSpatialPartition* part = region->getSpatialPartition(LLViewerRegion::PARTITION_PARTICLE); +		if (part && hasRenderType(part->mDrawableType)) +		{ +			LLDrawable* hit = part->lineSegmentIntersect(start, local_end, TRUE, face_hit, &position, NULL, NULL, NULL); +			if (hit) +			{ +				drawable = hit; +				local_end = position;						 +			} +		} +	} + +	LLVOPartGroup* ret = NULL; +	if (drawable) +	{ +		//make sure we're returning an LLVOPartGroup +		llassert(drawable->getVObj()->getPCode() == LLViewerObject::LL_VO_PART_GROUP); +		ret = (LLVOPartGroup*) drawable->getVObj().get(); +	} +		 +	if (intersection) +	{ +		*intersection = position; +	} + +	return ret; +} +  LLViewerObject* LLPipeline::lineSegmentIntersectInWorld(const LLVector4a& start, const LLVector4a& end,  														BOOL pick_transparent,												  														S32* face_hit, @@ -7549,7 +7618,7 @@ void LLPipeline::renderBloom(BOOL for_snapshot, F32 zoom_factor, int subfield)  	{  		bool dof_enabled = !LLViewerCamera::getInstance()->cameraUnderWater() && -							!LLToolMgr::getInstance()->inBuildMode() && +			(RenderDepthOfFieldInEditMode || !LLToolMgr::getInstance()->inBuildMode()) &&  							RenderDepthOfField; @@ -9569,7 +9638,7 @@ BOOL LLPipeline::getVisiblePointCloud(LLCamera& camera, LLVector3& min, LLVector  	pp.push_back(LLVector3(max.mV[0], max.mV[1], max.mV[2]));  	//add corners of camera frustum -	for (U32 i = 0; i < 8; i++) +	for (U32 i = 0; i < LLCamera::AGENT_FRUSTRUM_NUM; i++)  	{  		pp.push_back(camera.mAgentFrustum[i]);  	} @@ -9596,7 +9665,7 @@ BOOL LLPipeline::getVisiblePointCloud(LLCamera& camera, LLVector3& min, LLVector  	for (U32 i = 0; i < 12; i++)  	{ //for each line segment in bounding box -		for (U32 j = 0; j < 6; j++)  +		for (U32 j = 0; j < LLCamera::AGENT_PLANE_NO_USER_CLIP_NUM; j++)   		{ //for each plane in camera frustum  			const LLPlane& cp = camera.getAgentPlane(j);  			const LLVector3& v1 = pp[bs[i*2+0]]; @@ -9682,19 +9751,19 @@ BOOL LLPipeline::getVisiblePointCloud(LLCamera& camera, LLVector3& min, LLVector  			}  		} -		for (U32 j = 0; j < 6; ++j) +		for (U32 j = 0; j < LLCamera::AGENT_PLANE_NO_USER_CLIP_NUM; ++j)  		{  			const LLPlane& cp = camera.getAgentPlane(j);  			F32 dist = cp.dist(pp[i]);  			if (dist > 0.05f) //point is above some plane, not contained -					{ +			{  				found = false;  				break; -						} -					} +			} +		} -					if (found) -					{ +		if (found) +		{  			fp.push_back(pp[i]);  		}  	} diff --git a/indra/newview/pipeline.h b/indra/newview/pipeline.h index b03e096042..b12dc3edbb 100755 --- a/indra/newview/pipeline.h +++ b/indra/newview/pipeline.h @@ -47,6 +47,7 @@ class LLViewerObject;  class LLTextureEntry;  class LLCullResult;  class LLVOAvatar; +class LLVOPartGroup;  class LLGLSLShader;  class LLDrawPoolAlpha; @@ -188,6 +189,12 @@ public:  												LLVector4a* normal = NULL,               // return the surface normal at the intersection point  												LLVector4a* tangent = NULL             // return the surface tangent at the intersection point    		); + +	//get the closest particle to start between start and end, returns the LLVOPartGroup and particle index +	LLVOPartGroup* lineSegmentIntersectParticle(const LLVector4a& start, const LLVector4a& end, LLVector4a* intersection, +														S32* face_hit); + +  	LLViewerObject* lineSegmentIntersectInHUD(const LLVector4a& start, const LLVector4a& end,  											  BOOL pick_transparent,  											  S32* face_hit,                          // return the face hit @@ -889,6 +896,7 @@ public:  	static F32 RenderGlowWidth;  	static F32 RenderGlowStrength;  	static BOOL RenderDepthOfField; +	static BOOL RenderDepthOfFieldInEditMode;  	static F32 CameraFocusTransitionTime;  	static F32 CameraFNumber;  	static F32 CameraFocalLength; diff --git a/indra/newview/skins/default/xui/en/menu_attachment_other.xml b/indra/newview/skins/default/xui/en/menu_attachment_other.xml index 46ba4bd29d..0a8beec7de 100755 --- a/indra/newview/skins/default/xui/en/menu_attachment_other.xml +++ b/indra/newview/skins/default/xui/en/menu_attachment_other.xml @@ -112,4 +112,15 @@           <menu_item_call.on_enable            function="Object.EnableInspect" />     </menu_item_call> +  <menu_item_separator +       layout="topleft" /> +  <menu_item_call +     enabled="false" +     label="Block Particle Owner" +     name="Mute Particle"> +    <menu_item_call.on_click +     function="Particle.Mute" /> +    <menu_item_call.on_enable +     function="EnableMuteParticle" /> +  </menu_item_call>  </context_menu> diff --git a/indra/newview/skins/default/xui/en/menu_attachment_self.xml b/indra/newview/skins/default/xui/en/menu_attachment_self.xml index 28e032ce5f..bcbc8d5b86 100755 --- a/indra/newview/skins/default/xui/en/menu_attachment_self.xml +++ b/indra/newview/skins/default/xui/en/menu_attachment_self.xml @@ -143,4 +143,15 @@ name="Edit Outfit">      <menu_item_call.on_enable       function="Attachment.EnableDrop" />    </menu_item_call> +  <menu_item_separator +       layout="topleft" /> +  <menu_item_call +     enabled="false" +     label="Block Particle Owner" +     name="Mute Particle"> +    <menu_item_call.on_click +     function="Particle.Mute" /> +    <menu_item_call.on_enable +     function="EnableMuteParticle" /> +  </menu_item_call>  </context_menu> diff --git a/indra/newview/skins/default/xui/en/menu_avatar_other.xml b/indra/newview/skins/default/xui/en/menu_avatar_other.xml index e7c2b80da2..8be2683680 100755 --- a/indra/newview/skins/default/xui/en/menu_avatar_other.xml +++ b/indra/newview/skins/default/xui/en/menu_avatar_other.xml @@ -103,4 +103,15 @@          <menu_item_call.on_enable           function="EnablePayAvatar" />      </menu_item_call> +  <menu_item_separator +       layout="topleft" /> +  <menu_item_call +     enabled="false" +     label="Block Particle Owner" +     name="Mute Particle"> +    <menu_item_call.on_click +     function="Particle.Mute" /> +    <menu_item_call.on_enable +     function="EnableMuteParticle" /> +  </menu_item_call>  </context_menu> diff --git a/indra/newview/skins/default/xui/en/menu_avatar_self.xml b/indra/newview/skins/default/xui/en/menu_avatar_self.xml index c1ff026a74..ca0c9bd5e4 100755 --- a/indra/newview/skins/default/xui/en/menu_avatar_self.xml +++ b/indra/newview/skins/default/xui/en/menu_avatar_self.xml @@ -269,4 +269,16 @@              <menu_item_call.on_visible               function="Advanced.EnableAppearanceToXML"/>      </menu_item_call> +  <menu_item_separator +       layout="topleft" /> +  <menu_item_call +     enabled="false" +     label="Block Particle Owner" +     name="Mute Particle"> +    <menu_item_call.on_click +     function="Particle.Mute" /> + +    <menu_item_call.on_enable +     function="EnableMuteParticle" /> +  </menu_item_call>  </context_menu> diff --git a/indra/newview/skins/default/xui/en/menu_land.xml b/indra/newview/skins/default/xui/en/menu_land.xml index cc6d8ad9c1..2ad5cbbe95 100755 --- a/indra/newview/skins/default/xui/en/menu_land.xml +++ b/indra/newview/skins/default/xui/en/menu_land.xml @@ -61,4 +61,15 @@          <menu_item_call.on_enable           function="EnableEdit" />      </menu_item_call> +   <menu_item_separator +       layout="topleft" /> +  <menu_item_call +     enabled="false" +     label="Block Particle Owner" +     name="Mute Particle"> +    <menu_item_call.on_click +     function="Particle.Mute" /> +    <menu_item_call.on_enable +     function="EnableMuteParticle" /> +  </menu_item_call>  </context_menu> diff --git a/indra/newview/skins/default/xui/en/menu_mute_particle.xml b/indra/newview/skins/default/xui/en/menu_mute_particle.xml new file mode 100644 index 0000000000..a4261bf39e --- /dev/null +++ b/indra/newview/skins/default/xui/en/menu_mute_particle.xml @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<!-- *NOTE: See also menu_attachment_other.xml --> +<context_menu + layout="topleft" + name="Mute Particle Pie"> +  <menu_item_call +     enabled="false" +     label="Block Particle Owner" +     name="Mute Particle"> +    <menu_item_call.on_click +     function="Particle.Mute" /> +    <menu_item_call.on_enable +     function="EnableMuteParticle" /> +  </menu_item_call> +</context_menu> diff --git a/indra/newview/skins/default/xui/en/menu_object.xml b/indra/newview/skins/default/xui/en/menu_object.xml index f6004621a6..52ab7da515 100755 --- a/indra/newview/skins/default/xui/en/menu_object.xml +++ b/indra/newview/skins/default/xui/en/menu_object.xml @@ -196,4 +196,15 @@      <menu_item_call.on_enable          function="Object.EnableDelete" />    </menu_item_call> +  <menu_item_separator +       layout="topleft" /> +  <menu_item_call +     enabled="false" +     label="Block Particle Owner" +     name="Mute Particle"> +    <menu_item_call.on_click +     function="Particle.Mute" /> +    <menu_item_call.on_enable +     function="EnableMuteParticle" /> +  </menu_item_call>  </context_menu> diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml index 8667d0277a..a4e01ff1c9 100755 --- a/indra/newview/skins/default/xui/en/notifications.xml +++ b/indra/newview/skins/default/xui/en/notifications.xml @@ -6804,7 +6804,6 @@ This will add a bookmark in your inventory so you can quickly IM this Resident.     name="RegionRestartMinutes"     priority="high"     sound="UISndAlert" -   persist="true"     type="notify">  This region will restart in [MINUTES] minutes.  If you stay in this region you will be logged out. @@ -6815,7 +6814,6 @@ If you stay in this region you will be logged out.     name="RegionRestartSeconds"     priority="high"     sound="UISndAlert" -   persist="true"     type="notify">  This region will restart in [SECONDS] seconds.  If you stay in this region you will be logged out. 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 d7db7caf66..3c4d288037 100755 --- a/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml @@ -47,7 +47,7 @@          Better      </text>      <icon -     color="0.12 0.12 0.12 1" +     color="DkGray"       height="14"       image_name="Rounded_Square"       layout="topleft" @@ -56,16 +56,15 @@       top_delta="-2"       width="2" />    <icon -     color="0.12 0.12 0.12 1" +     color="DkGray"       height="14"       image_name="Rounded_Square"       layout="topleft"       left_pad="41" -     name="LowMidraphicsDivet" -     top_delta="-2" +     name="LowMidGraphicsDivet"       width="2" />      <icon -     color="0.12 0.12 0.12 1" +     color="DkGray"       height="14"       image_name="Rounded_Square"       layout="topleft" @@ -74,7 +73,7 @@       top_delta="0"       width="2" />    <icon -     color="0.12 0.12 0.12 1" +     color="DkGray"       height="14"       image_name="Rounded_Square"       layout="topleft" @@ -83,7 +82,7 @@       top_delta="0"       width="2" />      <icon -     color="0.12 0.12 0.12 1" +     color="DkGray"       height="14"       image_name="Rounded_Square"       layout="topleft" @@ -92,7 +91,7 @@       top_delta="0"       width="2" />    <icon -     color="0.12 0.12 0.12 1" +     color="DkGray"       height="14"       image_name="Rounded_Square"       layout="topleft" @@ -101,7 +100,7 @@       top_delta="0"       width="2" />      <icon -     color="0.12 0.12 0.12 1" +     color="DkGray"       height="14"       image_name="Rounded_Square"       layout="topleft" diff --git a/indra/newview/skins/default/xui/en/role_actions.xml b/indra/newview/skins/default/xui/en/role_actions.xml index 89aef57cca..0eeccbeac5 100755 --- a/indra/newview/skins/default/xui/en/role_actions.xml +++ b/indra/newview/skins/default/xui/en/role_actions.xml @@ -70,8 +70,8 @@  		     longdescription="Toggle 'Show Place in Search' and setting a parcel's category in About Land > Options tab."  		     name="land find places" value="17" />  		<action -		     description="Change parcel name, description, and 'Show Place in Search' settings" -		     longdescription="Change parcel name, description, and 'Show Place in Search' settings. This is done in About Land > Options tab." +		     description="Change parcel name, description, and 'Moderate Content' settings" +		     longdescription="Change parcel name, description, and 'Moderate Content' settings. This is done in About Land > Options tab."  		     name="land change identity" value="18" />  		<action description="Set landing point and set teleport routing"  		     longdescription="On a group-owned parcel, Members in a Role with this Ability can set a landing point to specify where incoming teleports arrive, and also set teleport routing for further control. This is done in About Land > Options tab." diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml index 9f02e90ea3..dd7df368c7 100755 --- a/indra/newview/skins/default/xui/en/strings.xml +++ b/indra/newview/skins/default/xui/en/strings.xml @@ -2516,6 +2516,8 @@ Drag folders to this area and click "Send to Marketplace" to list them for sale  	<string name="ATTACH_HUD_BOTTOM_LEFT">HUD Bottom Left</string>  	<string name="ATTACH_HUD_BOTTOM">HUD Bottom</string>  	<string name="ATTACH_HUD_BOTTOM_RIGHT">HUD Bottom Right</string> +	<string name="ATTACH_NECK">Neck</string> +	<string name="ATTACH_AVATAR_CENTER">Avatar Center</string>  	<!-- script editor -->  	<string name="CursorPos">Line [LINE], Column [COLUMN]</string> diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index 53a3e732ca..5e08e54b7c 100755 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -366,6 +366,7 @@ class WindowsManifest(ViewerManifest):              self.path("zlib1.dll")              self.path("vivoxplatform.dll")              self.path("vivoxoal.dll") +            self.path("ca-bundle.crt")              # Security              self.path("ssleay32.dll") @@ -726,6 +727,7 @@ class DarwinManifest(ViewerManifest):                                  'libvivoxoal.dylib',                                  'libvivoxsdk.dylib',                                  'libvivoxplatform.dylib', +                                'ca-bundle.crt',                                  'SLVoice',                                  ):                       self.path2basename(libdir, libfile) | 
