Merge
commit
d8c02bf062
76
.hgtags
76
.hgtags
|
|
@ -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
|
||||
288539fc0408ed4b69a99665de33bbbc2c3c08fe DRTVWR-216
|
||||
e664473c16df1d82ffaff382e7b3e023da202d52 3.4.2-beta2
|
||||
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
|
||||
288539fc0408ed4b69a99665de33bbbc2c3c08fe DRTVWR-216
|
||||
e664473c16df1d82ffaff382e7b3e023da202d52 3.4.2-beta2
|
||||
93ab02d83f51e30a3cabad98aff89601befd9413 DRTVWR-240
|
||||
0891d7a773a31397dcad48be3fa66531d567a821 DRTVWR-242
|
||||
710785535362b3cb801b6a3dc4703be3373bd0cd 3.4.2-beta3
|
||||
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
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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 );
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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 = 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_PLANE_LEFT = 0,
|
||||
AGENT_PLANE_RIGHT,
|
||||
AGENT_PLANE_NEAR,
|
||||
AGENT_PLANE_BOTTOM,
|
||||
AGENT_PLANE_TOP,
|
||||
AGENT_PLANE_FAR,
|
||||
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]; }
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
|
|
@ -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];
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -155,6 +155,7 @@ public:
|
|||
S32 mVRAM; // VRAM in MB
|
||||
S32 mGLMaxVertexRange;
|
||||
S32 mGLMaxIndexRange;
|
||||
S32 mGLMaxTextureSize;
|
||||
|
||||
void getPixelFormat(); // Get the best pixel format
|
||||
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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++)
|
||||
|
|
|
|||
|
|
@ -341,7 +341,7 @@ public:
|
|||
|
||||
static void onClickColumn(void *userdata);
|
||||
|
||||
virtual void updateColumns();
|
||||
virtual void updateColumns(bool force_update = false);
|
||||
S32 calcMaxContentWidth();
|
||||
bool updateColumnWidths();
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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];
|
||||
|
|
|
|||
|
|
@ -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); }
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -1 +1 @@
|
|||
3.6.2
|
||||
3.6.4
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -45,3 +45,4 @@ mat4 getObjectSkinnedTransform()
|
|||
|
||||
return mat;
|
||||
}
|
||||
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load Diff
|
|
@ -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 (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)
|
||||
{
|
||||
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);
|
||||
}
|
||||
}
|
||||
drawable->clearState(LLDrawable::REBUILD_ALL);
|
||||
|
||||
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);
|
||||
buffer = face->getVertexBuffer();
|
||||
}
|
||||
else
|
||||
{ //resize existing buffer
|
||||
buffer->resizeBuffer(vol_face.mNumVertices, vol_face.mNumIndices);
|
||||
{ //just rebuild this face
|
||||
getRiggedGeometry(face, buffer, data_mask, skin, volume, vol_face);
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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++)
|
||||
|
||||
newMin = newMax = tv[0];
|
||||
|
||||
for (U32 i = 1; i < 8; ++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);
|
||||
|
||||
llassert(less_than_max_mag(newMin));
|
||||
llassert(less_than_max_mag(newMax));
|
||||
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;
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -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));
|
||||
|
||||
|
|
|
|||
|
|
@ -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());
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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())
|
||||
{
|
||||
|
|
|
|||
|
|
@ -413,7 +413,7 @@ public:
|
|||
|
||||
void startRequest() { ++mPendingUploads; }
|
||||
void stopRequest() { --mPendingUploads; }
|
||||
|
||||
|
||||
bool finished() { return mFinished; }
|
||||
virtual void run();
|
||||
void preStart();
|
||||
|
|
|
|||
|
|
@ -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())
|
||||
{
|
||||
|
|
|
|||
|
|
@ -149,7 +149,7 @@ public:
|
|||
|
||||
void sortByName(BOOL ascending);
|
||||
|
||||
/*virtual*/ void updateColumns();
|
||||
/*virtual*/ void updateColumns(bool force_update);
|
||||
|
||||
/*virtual*/ void mouseOverHighlightNthItem( S32 index );
|
||||
private:
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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));
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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");
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -502,9 +502,13 @@ void LLViewerPartSim::destroyClass()
|
|||
//static
|
||||
BOOL LLViewerPartSim::shouldAddPart()
|
||||
{
|
||||
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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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 ;
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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; }
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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]);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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."
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
Loading…
Reference in New Issue