merge LL 3.4.0 viewer-beta
commit
d9c7b9253d
375
.hgtags
375
.hgtags
|
|
@ -25,343 +25,304 @@ a44cac445a433bbe5d8adced3771b3cd9a1c8a8f LL_3.3.3_beta_merge_to_fs
|
|||
cd7063d469aafb0c2f54ea994cc9f51f1877e332 Pathfinding_merge
|
||||
cabedbb91c914e0ed56d69ca4d9886be2a7c0264 Firestorm_4.2.1_Release
|
||||
983962c3d00d42449fc6bb578f3ef622b88ca957 Firestorm_4.2.2_Release
|
||||
bb38ff1a763738609e1b3cada6d15fa61e5e84b9 2.1.1-release
|
||||
003dd9461bfa479049afcc34545ab3431b147c7c v2start
|
||||
08398e650c222336bb2b6de0cd3bba944aef11b4 2-1rn1
|
||||
0962101bfa7df0643a6e625786025fe7f8a6dc97 2-1-beta-2
|
||||
12769e547e30067d494a6c01479a18107366ce2f beta-5
|
||||
17fc2908e9a1ef34a9f53a41a393caf5c3cac390 beta-3-5
|
||||
19547b909b404552593be5ec7c18241e062a6d65 2-1-1-beta-1
|
||||
1e2b517adc2ecb342cd3c865f2a6ccf82a3cf8d7 2-1-beta-3
|
||||
3469d90a115b900f8f250e137bbd9b684130f5d2 beta-4
|
||||
3e4b947f79d88c385e8218cbc0731cef0e42cfc4 2-1-beta-1
|
||||
434973a76ab2755f98ab55e1afc193e16692d5c5 2-1-1-beta-2
|
||||
46002088d9a4489e323b8d56131c680eaa21258c viewer-2-1-0-start
|
||||
4f777ffb99fefdc6497c61385c22688ff149c659 viewer-2-0-0
|
||||
52d96ad3d39be29147c5b2181b3bb46af6164f0e alpha-3
|
||||
668851b2ef0f8cf8df07a0fba429e4a6c1e70abb viewer-2-0-1
|
||||
6e3b2e13906ba8ff22d3c8490b02d518adb2c907 2-1-1-beta-2
|
||||
d6781e22543acd7e21b967209f3c6e7003d380e3 fork to viewer-2-0
|
||||
7f16e79826d377f5f9f5b33dc721ab56d0d7dc8f alpha-4
|
||||
7f16e79826d377f5f9f5b33dc721ab56d0d7dc8f fork to viewer-20qa
|
||||
80bc6cff515118a36108967af49d3f8105c95bc9 viewer-2-0-2-start
|
||||
87bfaf8c76f9b22d9c65d4b315358861be87c863 2-1-1-release
|
||||
b03065d018b8a2e28b7de85b293a4c992cb4c12d 2-1-release
|
||||
b8419565906e4feb434426d8d9b17dd1458e24b2 alpha-6
|
||||
bb38ff1a763738609e1b3cada6d15fa61e5e84b9 2-1-1-release
|
||||
c6969fe44e58c542bfc6f1bd6c0be2fa860929ac 2-1-beta-4
|
||||
d2382d374139850efa5bb6adfb229e3e656cfc40 howard-demo
|
||||
d40ac9dd949cba6dab1cc386da6a2027690c2519 alpha-5
|
||||
d6781e22543acd7e21b967209f3c6e7003d380e3 fork to viewer-2-0
|
||||
d2382d374139850efa5bb6adfb229e3e656cfc40 howard-demo
|
||||
b8419565906e4feb434426d8d9b17dd1458e24b2 alpha-6
|
||||
17fc2908e9a1ef34a9f53a41a393caf5c3cac390 beta-3-5
|
||||
3469d90a115b900f8f250e137bbd9b684130f5d2 beta-4
|
||||
12769e547e30067d494a6c01479a18107366ce2f beta-5
|
||||
4f777ffb99fefdc6497c61385c22688ff149c659 viewer-2-0-0
|
||||
668851b2ef0f8cf8df07a0fba429e4a6c1e70abb viewer-2-0-1
|
||||
08398e650c222336bb2b6de0cd3bba944aef11b4 2-1rn1
|
||||
80bc6cff515118a36108967af49d3f8105c95bc9 viewer-2-0-2-start
|
||||
46002088d9a4489e323b8d56131c680eaa21258c viewer-2-1-0-start
|
||||
3e4b947f79d88c385e8218cbc0731cef0e42cfc4 2-1-beta-1
|
||||
0962101bfa7df0643a6e625786025fe7f8a6dc97 2-1-beta-2
|
||||
1e2b517adc2ecb342cd3c865f2a6ccf82a3cf8d7 2-1-beta-3
|
||||
c6969fe44e58c542bfc6f1bd6c0be2fa860929ac 2-1-beta-4
|
||||
b03065d018b8a2e28b7de85b293a4c992cb4c12d 2-1-release
|
||||
19547b909b404552593be5ec7c18241e062a6d65 2-1-1-beta-1
|
||||
6e3b2e13906ba8ff22d3c8490b02d518adb2c907 2-1-1-beta-2
|
||||
bb38ff1a763738609e1b3cada6d15fa61e5e84b9 2-1-1-release
|
||||
bb38ff1a763738609e1b3cada6d15fa61e5e84b9 2.1.1-release
|
||||
c6e6324f5be1401f077ad18a4a0f6b46451c2f7b last_sprint
|
||||
7076e22f9f43f479a4ea75eac447a36364bead5a beta_2.1.3
|
||||
7076e22f9f43f479a4ea75eac447a36364bead5a 2.2.0-beta1
|
||||
7076e22f9f43f479a4ea75eac447a36364bead5a DRTVWR-5_2.2.0-beta1
|
||||
7076e22f9f43f479a4ea75eac447a36364bead5a beta_2.1.3
|
||||
9822eb3e25f7fe0c28ffd8aba45c507caa383cbc 2.2.0-beta2
|
||||
9822eb3e25f7fe0c28ffd8aba45c507caa383cbc DRTVWR-3_2.2.0-beta2
|
||||
b0cd7e150009809a0b5b0a9d5785cd4bb230413a 2.2.0-beta3
|
||||
b0cd7e150009809a0b5b0a9d5785cd4bb230413a DRTVWR-7_2.2.0-beta3
|
||||
00a831292231faad7e44c69f76cb96f175b8dfad 2.2.0-beta4
|
||||
98e0d6df638429fd2f0476667504bd5a6b298def 2.3.0-beta1
|
||||
1415e6538d54fd5d568ee88343424d57c6803c2c 2.2.0-release
|
||||
1415e6538d54fd5d568ee88343424d57c6803c2c DRTVWR-8_2.2.0-release
|
||||
98e0d6df638429fd2f0476667504bd5a6b298def 2.3.0-start
|
||||
a3c12342b1af0951b8aa3b828aacef17fcea8178 2.3.0-beta1
|
||||
a3c12342b1af0951b8aa3b828aacef17fcea8178 DRTVWR-14_2.3.0-beta1
|
||||
db0fe9bb65187f365e58a717dd23d0f4754a9c1d 2.3.0-beta2
|
||||
db0fe9bb65187f365e58a717dd23d0f4754a9c1d DRTVWR-17_2.3.0-beta2
|
||||
6ad3d6fa35a4e320e9ce442fce2bf9c7fc852556 2.3.0-beta3
|
||||
6ad3d6fa35a4e320e9ce442fce2bf9c7fc852556 2.3.0-release
|
||||
dbc206fc61d89ff4cfe15aade0bf0c7bc7fee1c9 2.4.0-start
|
||||
dc6483491b4af559060bccaef8e9045a303212dd 2.4.0-beta1
|
||||
dc6483491b4af559060bccaef8e9045a303212dd 2.4.0-beta1
|
||||
3bc1f50a72e117f4d4ad8d555f0c785ea8cc201e 2.4.0-beta1
|
||||
25bd6007e3d2fc15db9326ed4b18a24a5969a46a 2.4.0-beta2
|
||||
1ed382c6a08ba3850b6ce9061bc551ddece0ea07 2.4.0-release
|
||||
a82e5b1e22c7f90e3c7977d146b80588f004ed0d 2.5.0-start
|
||||
76f586a8e22b1abe6b2339758c8ac0fa718975de 76f586a8e22b
|
||||
345b17e7cf630db77e840b4fe3451bd476d750a3 2.5.0-beta1
|
||||
54d772d8687c69b1d773f6ce14bbc7bdc9d6c05f 2.5.0-beta2
|
||||
b542f8134a2bb5dd054ff4e509a44b2ee463b1bf nat-eventapi2-base
|
||||
7076e22f9f43f479a4ea75eac447a36364bead5a DRTVWR-5_2.2.0-beta1
|
||||
9822eb3e25f7fe0c28ffd8aba45c507caa383cbc DRTVWR-3_2.2.0-beta2
|
||||
b0cd7e150009809a0b5b0a9d5785cd4bb230413a DRTVWR-7_2.2.0-beta3
|
||||
1415e6538d54fd5d568ee88343424d57c6803c2c DRTVWR-8_2.2.0-release
|
||||
a3c12342b1af0951b8aa3b828aacef17fcea8178 DRTVWR-14_2.3.0-beta1
|
||||
db0fe9bb65187f365e58a717dd23d0f4754a9c1d DRTVWR-17_2.3.0-beta2
|
||||
6ad3d6fa35a4e320e9ce442fce2bf9c7fc852556 DRTVWR-20_2.3.0-beta3
|
||||
6ad3d6fa35a4e320e9ce442fce2bf9c7fc852556 DRTVWR-13_2.3.0-release
|
||||
6ad3d6fa35a4e320e9ce442fce2bf9c7fc852556 DRTVWR-20_2.3.0-beta3
|
||||
dbc206fc61d89ff4cfe15aade0bf0c7bc7fee1c9 2.4.0-start
|
||||
3bc1f50a72e117f4d4ad8d555f0c785ea8cc201e 2.4.0-beta1
|
||||
3bc1f50a72e117f4d4ad8d555f0c785ea8cc201e DRTVWR-26_2.4.0-beta1
|
||||
25bd6007e3d2fc15db9326ed4b18a24a5969a46a 2.4.0-beta2
|
||||
25bd6007e3d2fc15db9326ed4b18a24a5969a46a DRTVWR-27_2.4.0-beta2
|
||||
1ed382c6a08ba3850b6ce9061bc551ddece0ea07 2.4.0-release
|
||||
1ed382c6a08ba3850b6ce9061bc551ddece0ea07 DRTVWR-25_2.4.0-release
|
||||
a82e5b1e22c7f90e3c7977d146b80588f004ed0d 2.5.0-start
|
||||
345b17e7cf630db77e840b4fe3451bd476d750a3 2.5.0-beta1
|
||||
345b17e7cf630db77e840b4fe3451bd476d750a3 DRTVWR-32_2.5.0-beta1
|
||||
54d772d8687c69b1d773f6ce14bbc7bdc9d6c05f 2.5.0-beta2
|
||||
54d772d8687c69b1d773f6ce14bbc7bdc9d6c05f DRTVWR-33--2.5.0beta2
|
||||
54d772d8687c69b1d773f6ce14bbc7bdc9d6c05f DRTVWR-33_2.5.0-beta2
|
||||
b723921b5c711bd24dbe77dc76ef488b544dac78 2.5.0-beta3
|
||||
b723921b5c711bd24dbe77dc76ef488b544dac78 DRTVWR-34_2.5.0-beta3
|
||||
b723921b5c711bd24dbe77dc76ef488b544dac78 2.5.0-release
|
||||
b723921b5c711bd24dbe77dc76ef488b544dac78 DRTVWR-31_2.5.0-release
|
||||
3178e311da3a8739a85363665006ea3c4610cad4 dons-headless-hackathon-work
|
||||
b723921b5c711bd24dbe77dc76ef488b544dac78 DRTVWR-34_2.5.0-beta3
|
||||
b542f8134a2bb5dd054ff4e509a44b2ee463b1bf nat-eventapi2-base
|
||||
63a6aedfce785a6c760377bf685b2dae616797d2 2.5.1-start
|
||||
4dede9ae1ec74d41f6887719f6f1de7340d8578d 2.5.1-release
|
||||
4dede9ae1ec74d41f6887719f6f1de7340d8578d DRTVWR-37_2.5.1-release
|
||||
b53a0576eec80614d7767ed72b40ed67aeff27c9 DRTVWR-38_2.5.2-release
|
||||
b53a0576eec80614d7767ed72b40ed67aeff27c9 2.5.2-release
|
||||
8f16fc4647d4a97b02042094a213b1fdea5c9462 FSmerge-2.5.2
|
||||
b53a0576eec80614d7767ed72b40ed67aeff27c9 DRTVWR-38_2.5.2-release
|
||||
4e9eec6a347f89b2b3f295beb72f1cf7837dff66 2.6.0-start
|
||||
9283d6d1d7eb71dfe4c330e7c9144857e7356bde 2.6.0-beta1
|
||||
9283d6d1d7eb71dfe4c330e7c9144857e7356bde DRTVWR-40_2.6.0-beta1
|
||||
9e4641f4a7870c0f565a25a2971368d5a29516a1 DRTVWR-41_2.6.0-beta2
|
||||
9e4641f4a7870c0f565a25a2971368d5a29516a1 2.6.0-beta2
|
||||
9e4641f4a7870c0f565a25a2971368d5a29516a1 DRTVWR-41_2.6.0-beta2
|
||||
c5bdef3aaa2744626aef3c217ce29e1900d357b3 2.6.1-beta1
|
||||
c5bdef3aaa2744626aef3c217ce29e1900d357b3 2.6.1-start
|
||||
c5bdef3aaa2744626aef3c217ce29e1900d357b3 DRTVWR-43_2.6.1-beta1
|
||||
c5bdef3aaa2744626aef3c217ce29e1900d357b3 2.6.1-beta1
|
||||
c9182ed77d427c759cfacf49a7b71a2e20d522aa DRTVWR-42_2.6.1-release
|
||||
c9182ed77d427c759cfacf49a7b71a2e20d522aa 2.6.1-release
|
||||
56b2778c743c2a964d82e1caf11084d76a87de2c 2.6.2-start
|
||||
42f32494bac475d0737799346f6831558ae8bf5d DRTVWR-39_2.6.0-release
|
||||
42f32494bac475d0737799346f6831558ae8bf5d 2.6.0-release
|
||||
d1203046bb653b763f835b04d184646949d8dd5c DRTVWR-45_2.6.2-beta1
|
||||
d1203046bb653b763f835b04d184646949d8dd5c 2.6.2-beta1
|
||||
214180ad5714ce8392b82bbebcc92f4babd98300 DRTVWR-44_2.6.2-release
|
||||
214180ad5714ce8392b82bbebcc92f4babd98300 2.6.2-release
|
||||
d1203046bb653b763f835b04d184646949d8dd5c DRTVWR-45_2.6.2-beta1
|
||||
42f32494bac475d0737799346f6831558ae8bf5d 2.6.0-release
|
||||
42f32494bac475d0737799346f6831558ae8bf5d DRTVWR-39_2.6.0-release
|
||||
c9182ed77d427c759cfacf49a7b71a2e20d522aa 2.6.1-release
|
||||
c9182ed77d427c759cfacf49a7b71a2e20d522aa DRTVWR-42_2.6.1-release
|
||||
52b2263ab28f0976c689fd0b76c55a9eb027cdbf end-of-develop.py
|
||||
ec32f1045e7c2644015245df3a9933620aa194b8 2.6.3-start
|
||||
d7fcefabdf32bb61a9ea6d6037c1bb26190a85bc DRTVWR-47_2.6.3-beta1
|
||||
d7fcefabdf32bb61a9ea6d6037c1bb26190a85bc 2.6.3-beta1
|
||||
0630e977504af5ea320c58d33cae4e1ddee793e9 DRTVWR-48_2.6.3-beta2
|
||||
d7fcefabdf32bb61a9ea6d6037c1bb26190a85bc DRTVWR-47_2.6.3-beta1
|
||||
0630e977504af5ea320c58d33cae4e1ddee793e9 2.6.3-beta2
|
||||
7db558aaa7c176f2022b3e9cfe38ac72f6d1fccd DRTVWR-50_2.6.5-beta1
|
||||
0630e977504af5ea320c58d33cae4e1ddee793e9 DRTVWR-48_2.6.3-beta2
|
||||
3178e311da3a8739a85363665006ea3c4610cad4 dons-headless-hackathon-work
|
||||
214180ad5714ce8392b82bbebcc92f4babd98300 2.6.2-release
|
||||
214180ad5714ce8392b82bbebcc92f4babd98300 DRTVWR-44_2.6.2-release
|
||||
7db558aaa7c176f2022b3e9cfe38ac72f6d1fccd 2.6.5-beta1
|
||||
800cefce8d364ffdd2f383cbecb91294da3ea424 2.6.6-start
|
||||
bb1075286b3b147b1dae2e3d6b2d56f04ff03f35 DRTVWR-52_2.6.6-beta1
|
||||
bb1075286b3b147b1dae2e3d6b2d56f04ff03f35 2.6.6-beta1
|
||||
5e349dbe9cc84ea5795af8aeb6d473a0af9d4953 2.6.8-start
|
||||
beafa8a9bd1d1b670b7523d865204dc4a4b38eef DRTVWR-55_2.6.8-beta1
|
||||
bb9932a7a5fd00edf52d95f354e3b37ae6a942db DRTVWR-156
|
||||
beafa8a9bd1d1b670b7523d865204dc4a4b38eef 2.6.8-beta1
|
||||
e67da2c6e3125966dd49eef98b36317afac1fcfe 2.6.9-start
|
||||
07f65b6181edcc2edddd4e084e7aa0e5c67fcb84 FSmerge-2.6.9
|
||||
77e5a08344c95738ab879f9671b7758cddd712a3 DRTVWR-57_2.6.9-beta1
|
||||
77e5a08344c95738ab879f9671b7758cddd712a3 2.6.9-beta1
|
||||
be2000b946f8cb3de5f44b2d419287d4c48ec4eb DRTVWR-54_2.6.8-release
|
||||
be2000b946f8cb3de5f44b2d419287d4c48ec4eb 2.6.8-release
|
||||
dac76a711da5f1489a01c1fa62ec97d99c25736d DRTVWR-51_2.6.6-release
|
||||
dac76a711da5f1489a01c1fa62ec97d99c25736d 2.6.6-release
|
||||
8f2da1701c81a62352df2b8d413d27fb2cade9a6 DRTVWR-46_2.6.3-release
|
||||
7db558aaa7c176f2022b3e9cfe38ac72f6d1fccd DRTVWR-50_2.6.5-beta1
|
||||
8f2da1701c81a62352df2b8d413d27fb2cade9a6 2.6.3-release
|
||||
77e5a08344c95738ab879f9671b7758cddd712a3 DRTVWR-56_2.6.9-release
|
||||
8f2da1701c81a62352df2b8d413d27fb2cade9a6 DRTVWR-46_2.6.3-release
|
||||
800cefce8d364ffdd2f383cbecb91294da3ea424 2.6.6-start
|
||||
bb1075286b3b147b1dae2e3d6b2d56f04ff03f35 2.6.6-beta1
|
||||
bb1075286b3b147b1dae2e3d6b2d56f04ff03f35 DRTVWR-52_2.6.6-beta1
|
||||
5e349dbe9cc84ea5795af8aeb6d473a0af9d4953 2.6.8-start
|
||||
dac76a711da5f1489a01c1fa62ec97d99c25736d 2.6.6-release
|
||||
dac76a711da5f1489a01c1fa62ec97d99c25736d DRTVWR-51_2.6.6-release
|
||||
beafa8a9bd1d1b670b7523d865204dc4a4b38eef 2.6.8-beta1
|
||||
beafa8a9bd1d1b670b7523d865204dc4a4b38eef DRTVWR-55_2.6.8-beta1
|
||||
be2000b946f8cb3de5f44b2d419287d4c48ec4eb 2.6.8-release
|
||||
be2000b946f8cb3de5f44b2d419287d4c48ec4eb DRTVWR-54_2.6.8-release
|
||||
e67da2c6e3125966dd49eef98b36317afac1fcfe 2.6.9-start
|
||||
77e5a08344c95738ab879f9671b7758cddd712a3 2.6.9-beta1
|
||||
77e5a08344c95738ab879f9671b7758cddd712a3 2.6.9-release
|
||||
77e5a08344c95738ab879f9671b7758cddd712a3 DRTVWR-56_2.6.9-release
|
||||
77e5a08344c95738ab879f9671b7758cddd712a3 DRTVWR-57_2.6.9-beta1
|
||||
8835e0e3c0d3a48244c287bc05811dfc2fba43ec 2.7.0-start
|
||||
43c7ee846b7eed80786acbbf35d03bd016a3e85d DRTVWR-59_2.7.0-beta1
|
||||
43c7ee846b7eed80786acbbf35d03bd016a3e85d 2.7.0-beta1
|
||||
43c7ee846b7eed80786acbbf35d03bd016a3e85d DRTVWR-59_2.7.0-beta1
|
||||
54fd44ac92e4c61435ea33effe093a3527e18d98 2.7.1-start
|
||||
0c4d0c24278074f219e5a32e72b449e78301d11b DRTVWR-61_2.7.1-beta1
|
||||
0c4d0c24278074f219e5a32e72b449e78301d11b 2.7.1-beta1
|
||||
a9abb9633a266c8d2fe62411cfd1c86d32da72bf DRTVWR-60_2.7.1-release
|
||||
a9abb9633a266c8d2fe62411cfd1c86d32da72bf 2.7.1-release
|
||||
0c4d0c24278074f219e5a32e72b449e78301d11b DRTVWR-61_2.7.1-beta1
|
||||
9f79a6ed8fdcd2f3dac33ea6b3236eeb278dccfe 2.7.2-start
|
||||
e0dc8b741eaa27dcdfbc9e956bb2579b954d15eb DRTVWR-63_2.7.2-beta1
|
||||
e0dc8b741eaa27dcdfbc9e956bb2579b954d15eb 2.7.2-beta1
|
||||
e0dc8b741eaa27dcdfbc9e956bb2579b954d15eb DRTVWR-63_2.7.2-beta1
|
||||
6a3e7e403bd19e45fdfc2fcc716867af3ab80861 2.7.3-start
|
||||
fe3a8e7973072ea62043c08b19b66626c1a720eb 2.7.1-release
|
||||
fe3a8e7973072ea62043c08b19b66626c1a720eb 2.7.2-release
|
||||
fe3a8e7973072ea62043c08b19b66626c1a720eb DRTVWR-60_2.7.1-release
|
||||
fe3a8e7973072ea62043c08b19b66626c1a720eb DRTVWR-62_2.7.2-release
|
||||
6af10678de4736222b2c3f7e010e984fb5b327de 2.7.4-start
|
||||
be963a4eef635542f9617d7f5fd22ba48fb71958 DRTVWR-67_2.7.4-beta1
|
||||
be963a4eef635542f9617d7f5fd22ba48fb71958 2.7.4-beta1
|
||||
057f319dd8eccdf63a54d99686c68cdcb31b6abc DRTVWR-66_2.7.4-release
|
||||
057f319dd8eccdf63a54d99686c68cdcb31b6abc 2.7.4-release
|
||||
a9abb9633a266c8d2fe62411cfd1c86d32da72bf DRTVWR-60_2.7.1-release
|
||||
be963a4eef635542f9617d7f5fd22ba48fb71958 DRTVWR-67_2.7.4-beta1
|
||||
be963a4eef635542f9617d7f5fd22ba48fb71958 2.7.4-beta1
|
||||
a9abb9633a266c8d2fe62411cfd1c86d32da72bf 2.7.1-release
|
||||
19a498fa62570f352d7d246f17e3c81cc1d82d8b 2.7.5-start
|
||||
09984bfa6cae17e0f72d02b75c1b7393c65eecfc DRTVWR-69_2.7.5-beta1
|
||||
09984bfa6cae17e0f72d02b75c1b7393c65eecfc 2.7.5-beta1
|
||||
e1ed60913230dd64269a7f7fc52cbc6004f6d52c 2.8.0-start
|
||||
502f6a5deca9365ddae57db4f1e30172668e171e 2.8.1-start
|
||||
2a3965b3ad202df7ea25d2be689291bb14a1280e DRTVWR-155
|
||||
6866d9df6efbd441c66451debd376d21211de39c DRTVWR-68_2.7.5-release
|
||||
6866d9df6efbd441c66451debd376d21211de39c 2.7.5-release
|
||||
e1ed60913230dd64269a7f7fc52cbc6004f6d52c DRTVWR-71_2.8.0-beta1
|
||||
09984bfa6cae17e0f72d02b75c1b7393c65eecfc DRTVWR-69_2.7.5-beta1
|
||||
e1ed60913230dd64269a7f7fc52cbc6004f6d52c 2.8.0-beta1
|
||||
493d9127ee50e84ba08a736a65a23ca86f7a5b01 DRTVWR-70_2.8.0-release
|
||||
493d9127ee50e84ba08a736a65a23ca86f7a5b01 2.8.0-release
|
||||
2c7e459e0c883f8e406b932e41e60097e9ee077e DRTVWR-73_2.8.1-beta1
|
||||
e1ed60913230dd64269a7f7fc52cbc6004f6d52c 2.8.0-start
|
||||
e1ed60913230dd64269a7f7fc52cbc6004f6d52c DRTVWR-71_2.8.0-beta1
|
||||
057f319dd8eccdf63a54d99686c68cdcb31b6abc 2.7.4-release
|
||||
057f319dd8eccdf63a54d99686c68cdcb31b6abc DRTVWR-66_2.7.4-release
|
||||
6866d9df6efbd441c66451debd376d21211de39c 2.7.5-release
|
||||
6866d9df6efbd441c66451debd376d21211de39c DRTVWR-68_2.7.5-release
|
||||
502f6a5deca9365ddae57db4f1e30172668e171e 2.8.1-start
|
||||
2c7e459e0c883f8e406b932e41e60097e9ee077e 2.8.1-beta1
|
||||
29e93d7e19991011bd12b5748142b11a5dcb4370 DRTVWR-72_2.8.1-release
|
||||
29e93d7e19991011bd12b5748142b11a5dcb4370 2.8.1-release
|
||||
4780e3bd2b3042f91be3426151f28c30d199bb3b DRTVWR-76_2.8.1-hotfix
|
||||
4780e3bd2b3042f91be3426151f28c30d199bb3b 2.8.1-hotfix
|
||||
2c7e459e0c883f8e406b932e41e60097e9ee077e DRTVWR-73_2.8.1-beta1
|
||||
493d9127ee50e84ba08a736a65a23ca86f7a5b01 2.8.0-release
|
||||
493d9127ee50e84ba08a736a65a23ca86f7a5b01 DRTVWR-70_2.8.0-release
|
||||
54bc7823ad4e3a436fef79710f685a7372bbf795 2.8.2-start
|
||||
29e93d7e19991011bd12b5748142b11a5dcb4370 DRTVWR-72_2.8.1-release
|
||||
29e93d7e19991011bd12b5748142b11a5dcb4370 2.8.1-release
|
||||
ac0f1a132d35c02a58861d37cca75b0429ac9137 2.8.3-start
|
||||
637901b23d335e4240c2c1763b45d1df71be84be FSmerge-2.8.3
|
||||
599677276b227357140dda35bea4a2c18e2e67b5 DRTVWR-75_2.8.3-beta1
|
||||
29e93d7e19991011bd12b5748142b11a5dcb4370 2.8.1-release
|
||||
29e93d7e19991011bd12b5748142b11a5dcb4370 DRTVWR-72_2.8.1-release
|
||||
4780e3bd2b3042f91be3426151f28c30d199bb3b 2.8.1-hotfix
|
||||
4780e3bd2b3042f91be3426151f28c30d199bb3b DRTVWR-76_2.8.1-hotfix
|
||||
599677276b227357140dda35bea4a2c18e2e67b5 2.8.3-beta1
|
||||
fb85792b84bf28428889c4cc966469d92e5dac4c DRTVWR-74_2.8.3-release
|
||||
fb85792b84bf28428889c4cc966469d92e5dac4c 2.8.3-release
|
||||
46a010f4885a9d223b511eac553ba5720284b1dc 3.0.0-start
|
||||
b0be6ce3adfef3a014a2389d360539f8a86c5439 DRTVWR-78_3.0.0-beta1
|
||||
b0be6ce3adfef3a014a2389d360539f8a86c5439 3.0.0-beta1
|
||||
599677276b227357140dda35bea4a2c18e2e67b5 DRTVWR-75_2.8.3-beta1
|
||||
6b678ea52f90d5c14181661dcd2546e25bde483e 3.0.0-start
|
||||
b0be6ce3adfef3a014a2389d360539f8a86c5439 3.0.0-beta1
|
||||
b0be6ce3adfef3a014a2389d360539f8a86c5439 DRTVWR-78_3.0.0-beta1
|
||||
fb85792b84bf28428889c4cc966469d92e5dac4c 2.8.3-release
|
||||
fb85792b84bf28428889c4cc966469d92e5dac4c DRTVWR-74_2.8.3-release
|
||||
82a2079ffcb57ecb1b3849cb41376b443e1eb912 3.0.1-start
|
||||
364fd63517fbacbbcb9129d096187171ba8c9e48 DRTVWR-81_3.0.1-beta1
|
||||
364fd63517fbacbbcb9129d096187171ba8c9e48 3.0.1-beta1
|
||||
364fd63517fbacbbcb9129d096187171ba8c9e48 DRTVWR-81_3.0.1-beta1
|
||||
f2412ecd6740803ea9452f1d17fd872e263a0df7 3.0.2-start
|
||||
1778f26b6d0ae762dec3ca37140f66620f2485d9 DRTVWR-78_3.0.0-release
|
||||
1778f26b6d0ae762dec3ca37140f66620f2485d9 3.0.0-release
|
||||
42784bf50fa01974bada2a1af3892ee09c93fcda DRTVWR-83_3.0.2-beta1
|
||||
42784bf50fa01974bada2a1af3892ee09c93fcda 3.0.2-beta1
|
||||
e5c9af2d7980a99a71650be3a0cf7b2b3c3b897e DRTVWR-86_3.0.2-beta2
|
||||
e5c9af2d7980a99a71650be3a0cf7b2b3c3b897e 3.0.2-beta2
|
||||
b95ddac176ac944efdc85cbee94ac2e1eab44c79 3.0.3-start
|
||||
1778f26b6d0ae762dec3ca37140f66620f2485d9 DRTVWR-78_3.0.0-release
|
||||
0000000000000000000000000000000000000000 DRTVWR-78_3.0.0-release
|
||||
42784bf50fa01974bada2a1af3892ee09c93fcda DRTVWR-83_3.0.2-beta1
|
||||
1778f26b6d0ae762dec3ca37140f66620f2485d9 3.0.0-release
|
||||
1778f26b6d0ae762dec3ca37140f66620f2485d9 DRTVWR-77_3.0.0-release
|
||||
6694f3f062aa45f64ab391d25a3eb3d5eb1b0871 DRTVWR-85_3.0.3-beta1
|
||||
e5c9af2d7980a99a71650be3a0cf7b2b3c3b897e 3.0.2-beta2
|
||||
e5c9af2d7980a99a71650be3a0cf7b2b3c3b897e DRTVWR-86_3.0.2-beta2
|
||||
b95ddac176ac944efdc85cbee94ac2e1eab44c79 3.0.3-start
|
||||
6694f3f062aa45f64ab391d25a3eb3d5eb1b0871 3.0.3-beta1
|
||||
586907287be581817b2422b5137971b22d54ea48 3.0.4-start
|
||||
61aa7974df089e8621fe9a4c69bcdefdb3cc208a DRTVWR-89_3.0.3-beta2
|
||||
6694f3f062aa45f64ab391d25a3eb3d5eb1b0871 DRTVWR-85_3.0.3-beta1
|
||||
61aa7974df089e8621fe9a4c69bcdefdb3cc208a 3.0.3-beta2
|
||||
0496d2f74043cf4e6058e76ac3db03d44cff42ce DRTVWR-84_3.0.3-release
|
||||
61aa7974df089e8621fe9a4c69bcdefdb3cc208a DRTVWR-89_3.0.3-beta2
|
||||
586907287be581817b2422b5137971b22d54ea48 3.0.4-start
|
||||
0496d2f74043cf4e6058e76ac3db03d44cff42ce 3.0.3-release
|
||||
0496d2f74043cf4e6058e76ac3db03d44cff42ce DRTVWR-84_3.0.3-release
|
||||
92a3aa04775438226399b19deee12ac3b5a62838 3.0.5-start
|
||||
c7282e59f374ee904bd793c3c444455e3399b0c5 3.1.0-start
|
||||
2657fa785bbfac115852c41bd0adaff74c2ad5da DRTVWR-93_3.1.0-beta1
|
||||
2657fa785bbfac115852c41bd0adaff74c2ad5da 3.1.0-beta1
|
||||
dbaaef19266478a20654c46395300640163e98e3 DRTVWR-96_3.1.0-beta2
|
||||
dbaaef19266478a20654c46395300640163e98e3 3.1.0-beta2
|
||||
dbaaef19266478a20654c46395300640163e98e3 DRTVWR-96_3.1.0-beta2
|
||||
bc01ee26fd0f1866e266429e85f76340523e91f1 DRTVWR-96_3.1.0-beta2
|
||||
dbaaef19266478a20654c46395300640163e98e3 3.1.0-beta2
|
||||
2657fa785bbfac115852c41bd0adaff74c2ad5da DRTVWR-93_3.1.0-beta1
|
||||
bc01ee26fd0f1866e266429e85f76340523e91f1 3.1.0-beta2
|
||||
ae2de7b0b33c03dc5bdf3a7bfa54463b512221b2 DRTVWR-92_3.1.0-release
|
||||
bc01ee26fd0f1866e266429e85f76340523e91f1 DRTVWR-96_3.1.0-beta2
|
||||
ae2de7b0b33c03dc5bdf3a7bfa54463b512221b2 3.1.0-release
|
||||
ae2de7b0b33c03dc5bdf3a7bfa54463b512221b2 DRTVWR-92_3.1.0-release
|
||||
a8230590e28e4f30f5105549e0e43211d9d55711 3.2.0-start
|
||||
e440cd1dfbd128d7d5467019e497f7f803640ad6 DRTVWR-95_3.2.0-beta1
|
||||
e440cd1dfbd128d7d5467019e497f7f803640ad6 3.2.0-beta1
|
||||
9bcc2b7176634254e501e3fb4c5b56c1f637852e DRTVWR-97_3.2.0-beta2
|
||||
e440cd1dfbd128d7d5467019e497f7f803640ad6 DRTVWR-95_3.2.0-beta1
|
||||
9bcc2b7176634254e501e3fb4c5b56c1f637852e 3.2.0-beta2
|
||||
2a13d30ee50ccfed50268238e36bb90d738ccc9e DRTVWR-98_3.2.0-beta3
|
||||
9bcc2b7176634254e501e3fb4c5b56c1f637852e DRTVWR-97_3.2.0-beta2
|
||||
2a13d30ee50ccfed50268238e36bb90d738ccc9e 3.2.0-beta3
|
||||
3150219d229d628f0c15e58e8a51511cbd97e58d DRTVWR-94_3.2.0-release
|
||||
2a13d30ee50ccfed50268238e36bb90d738ccc9e DRTVWR-98_3.2.0-beta3
|
||||
3150219d229d628f0c15e58e8a51511cbd97e58d 3.2.0-release
|
||||
3150219d229d628f0c15e58e8a51511cbd97e58d DRTVWR-94_3.2.0-release
|
||||
c4911ec8cd81e676dfd2af438b3e065407a94a7a 3.2.1-start
|
||||
3150219d229d628f0c15e58e8a51511cbd97e58d DRTVWR-94_3.2.0-release
|
||||
3150219d229d628f0c15e58e8a51511cbd97e58d 3.2.0-release
|
||||
40b46edba007d15d0059c80864b708b99c1da368 3.2.2-start
|
||||
3150219d229d628f0c15e58e8a51511cbd97e58d DRTVWR-94_3.2.0-release
|
||||
3150219d229d628f0c15e58e8a51511cbd97e58d 3.2.0-release
|
||||
9e390d76807fa70d356b8716fb83b8ce42a629ef DRTVWR-100_3.2.1-beta1
|
||||
9e390d76807fa70d356b8716fb83b8ce42a629ef 3.2.1-beta1
|
||||
523df3e67378541498d516d52af4402176a26bac DRTVWR-102_3.2.2-beta1
|
||||
9e390d76807fa70d356b8716fb83b8ce42a629ef DRTVWR-100_3.2.1-beta1
|
||||
40b46edba007d15d0059c80864b708b99c1da368 3.2.2-start
|
||||
523df3e67378541498d516d52af4402176a26bac 3.2.2-beta1
|
||||
80f3e30d8aa4d8f674a48bd742aaa6d8e9eae0b5 3.2.3-start
|
||||
a8c7030d6845186fac7c188be4323a0e887b4184 DRTVWR-99_3.2.1-release
|
||||
523df3e67378541498d516d52af4402176a26bac DRTVWR-102_3.2.2-beta1
|
||||
a8c7030d6845186fac7c188be4323a0e887b4184 3.2.1-release
|
||||
a9abb9633a266c8d2fe62411cfd1c86d32da72bf DRTVWR-60_2.7.1-release
|
||||
fe3a8e7973072ea62043c08b19b66626c1a720eb DRTVWR-60_2.7.1-release
|
||||
a9abb9633a266c8d2fe62411cfd1c86d32da72bf 2.7.1-release
|
||||
fe3a8e7973072ea62043c08b19b66626c1a720eb 2.7.1-release
|
||||
3fe994349fae64fc40874bb59db387131eb35a41 3.2.4-start
|
||||
a9abb9633a266c8d2fe62411cfd1c86d32da72bf DRTVWR-60_2.7.1-release
|
||||
fe3a8e7973072ea62043c08b19b66626c1a720eb DRTVWR-60_2.7.1-release
|
||||
a9abb9633a266c8d2fe62411cfd1c86d32da72bf 2.7.1-release
|
||||
fe3a8e7973072ea62043c08b19b66626c1a720eb 2.7.1-release
|
||||
3fe994349fae64fc40874bb59db387131eb35a41 DRTVWR-104_3.2.4-beta1
|
||||
a8c7030d6845186fac7c188be4323a0e887b4184 DRTVWR-99_3.2.1-release
|
||||
80f3e30d8aa4d8f674a48bd742aaa6d8e9eae0b5 3.2.3-start
|
||||
3fe994349fae64fc40874bb59db387131eb35a41 3.2.4-beta1
|
||||
8a44ff3d2104269ce76145c2772cf1bdff2a2abe 3.2.5-start
|
||||
fe3a8e7973072ea62043c08b19b66626c1a720eb DRTVWR-62_2.7.2-release
|
||||
fe3a8e7973072ea62043c08b19b66626c1a720eb 2.7.2-release
|
||||
bd6bcde2584491fd9228f1fa51c4575f4e764e19 DRTVWR-103_3.2.4-release
|
||||
3fe994349fae64fc40874bb59db387131eb35a41 3.2.4-start
|
||||
3fe994349fae64fc40874bb59db387131eb35a41 DRTVWR-104_3.2.4-beta1
|
||||
bd6bcde2584491fd9228f1fa51c4575f4e764e19 3.2.4-release
|
||||
3d2d5d244c6398a4214c666d5dd3965b0918709a DRTVWR-106_3.2.5-beta1
|
||||
bd6bcde2584491fd9228f1fa51c4575f4e764e19 DRTVWR-103_3.2.4-release
|
||||
8a44ff3d2104269ce76145c2772cf1bdff2a2abe 3.2.5-start
|
||||
3d2d5d244c6398a4214c666d5dd3965b0918709a 3.2.5-beta1
|
||||
65a2c1c8d855b88edfbea4e16ef2f27e7cff8b1d DRTVWR-107_3.2.5-beta2
|
||||
3d2d5d244c6398a4214c666d5dd3965b0918709a DRTVWR-106_3.2.5-beta1
|
||||
65a2c1c8d855b88edfbea4e16ef2f27e7cff8b1d 3.2.5-beta2
|
||||
c6175c955a19e9b9353d242889ec1779b5762522 DRTVWR-105_3.2.5-release
|
||||
65a2c1c8d855b88edfbea4e16ef2f27e7cff8b1d DRTVWR-107_3.2.5-beta2
|
||||
c6175c955a19e9b9353d242889ec1779b5762522 3.2.5-release
|
||||
c6175c955a19e9b9353d242889ec1779b5762522 DRTVWR-105_3.2.5-release
|
||||
2174ed1c7129562428a5cfe8651ed77b8d26ae18 3.2.6-start
|
||||
286d73ff5c19f6c00e023dc1b60975ed6bbe2872 3.2.6-beta1
|
||||
286d73ff5c19f6c00e023dc1b60975ed6bbe2872 DRTVWR-109_3.2.6-beta1
|
||||
4891c46a56fed7512c783b9cbe7cb7260727bf0c 3.2.7-start
|
||||
286d73ff5c19f6c00e023dc1b60975ed6bbe2872 3.2.6-beta1
|
||||
c6175c955a19e9b9353d242889ec1779b5762522 DRTVWR-105_3.2.5-release
|
||||
c6175c955a19e9b9353d242889ec1779b5762522 3.2.5-release
|
||||
3d75c836d178c7c7e788f256afe195f6cab764a2 DRTVWR-111_3.2.7-beta1
|
||||
3d75c836d178c7c7e788f256afe195f6cab764a2 3.2.7-beta1
|
||||
3d75c836d178c7c7e788f256afe195f6cab764a2 DRTVWR-111_3.2.7-beta1
|
||||
89980333c99dbaf1787fe20784f1d8849e9b5d4f 3.2.8-start
|
||||
16f8e2915f3f2e4d732fb3125daf229cb0fd1875 DRTVWR-114_3.2.8-beta1
|
||||
37dd400ad721e2a89ee820ffc1e7e433c68f3ca2 3.2.9-start
|
||||
16f8e2915f3f2e4d732fb3125daf229cb0fd1875 3.2.8-beta1
|
||||
089e5c84b2dece68f2b016c842ef9b5de4786842 DRTVWR-161
|
||||
16f8e2915f3f2e4d732fb3125daf229cb0fd1875 DRTVWR-114_3.2.8-beta1
|
||||
987425b1acf4752379b2e1eb20944b4b35d67a85 3.2.8-beta2
|
||||
987425b1acf4752379b2e1eb20944b4b35d67a85 DRTVWR-115_3.2.8-beta2
|
||||
987425b1acf4752379b2e1eb20944b4b35d67a85 3.2.8-beta2
|
||||
51b2fd52e36aab8f670e0874e7e1472434ec4b4a DRTVWR-113_3.2.8-release
|
||||
51b2fd52e36aab8f670e0874e7e1472434ec4b4a 3.2.8-release
|
||||
e9c82fca5ae6fb8a8af29012d78fb194a29323f3 DRTVWR-117_3.2.9-beta1
|
||||
51b2fd52e36aab8f670e0874e7e1472434ec4b4a DRTVWR-113_3.2.8-release
|
||||
37dd400ad721e2a89ee820ffc1e7e433c68f3ca2 3.2.9-start
|
||||
e9c82fca5ae6fb8a8af29012d78fb194a29323f3 3.2.9-beta1
|
||||
a01ef9bed28627f4ca543fbc1d70c79cc297a90f DRTVWR-118_3.2.9-beta2
|
||||
e9c82fca5ae6fb8a8af29012d78fb194a29323f3 DRTVWR-117_3.2.9-beta1
|
||||
a01ef9bed28627f4ca543fbc1d70c79cc297a90f 3.2.9-beta2
|
||||
987425b1acf4752379b2e1eb20944b4b35d67a85 3.2.8-beta2
|
||||
d5f263687f43f278107363365938f0a214920a4b DRTVWR-119
|
||||
a01ef9bed28627f4ca543fbc1d70c79cc297a90f DRTVWR-118_3.2.9-beta2
|
||||
d5f263687f43f278107363365938f0a214920a4b 3.3.0-beta1
|
||||
5e8d2662f38a66eca6c591295f5880d47afc73f7 viewer-release-candidate
|
||||
5e8d2662f38a66eca6c591295f5880d47afc73f7 3.3.0-release
|
||||
d5f263687f43f278107363365938f0a214920a4b 3.3.0-start
|
||||
dffd0457ee0745de65bf95f0642a5c9e46b8e2f0 viewer-beta-candidate
|
||||
d5f263687f43f278107363365938f0a214920a4b DRTVWR-119
|
||||
d5f263687f43f278107363365938f0a214920a4b 3.3.0-beta1
|
||||
5e8d2662f38a66eca6c591295f5880d47afc73f7 viewer-release-candidate
|
||||
5e8d2662f38a66eca6c591295f5880d47afc73f7 3.3.0-release
|
||||
28b95a6a28dca3338d9a1f4f204b96678df9f6a5 viewer-beta-candidate
|
||||
b43cd25be49e3984ff5361cefad020e069131d98 3.3.1-start
|
||||
3e2fca4ed1a0dc9fe6d8a6664e71098bb035a367 DRTVWR-125
|
||||
dffd0457ee0745de65bf95f0642a5c9e46b8e2f0 viewer-beta-candidate
|
||||
3e2fca4ed1a0dc9fe6d8a6664e71098bb035a367 viewer-beta-candidate
|
||||
3e2fca4ed1a0dc9fe6d8a6664e71098bb035a367 viewer-beta-candidate
|
||||
3e2fca4ed1a0dc9fe6d8a6664e71098bb035a367 3.3.1-start
|
||||
3e2fca4ed1a0dc9fe6d8a6664e71098bb035a367 DRTVWR-125
|
||||
28b95a6a28dca3338d9a1f4f204b96678df9f6a5 3.3.1-beta1
|
||||
1dc545e44617975da2a4a32fe303386c687a6ca1 viewer-beta-candidate
|
||||
1dc545e44617975da2a4a32fe303386c687a6ca1 3.3.1-beta2
|
||||
1dc545e44617975da2a4a32fe303386c687a6ca1 DRTVWR-139
|
||||
5e8d2662f38a66eca6c591295f5880d47afc73f7 viewer-release-candidate
|
||||
c623bbc854b6f7ee1b33a3718f76715046aa2937 viewer-release-candidate
|
||||
1dc545e44617975da2a4a32fe303386c687a6ca1 viewer-beta-candidate
|
||||
c623bbc854b6f7ee1b33a3718f76715046aa2937 3.3.1-release
|
||||
d29a260119f8d5a5d168e25fed0c7ea6b3f40161 3.3.2-beta1
|
||||
675668bd24d3bea570814f71762a2a806f7e1b8d 3.3.2-beta2
|
||||
c623bbc854b6f7ee1b33a3718f76715046aa2937 viewer-release-candidate
|
||||
675668bd24d3bea570814f71762a2a806f7e1b8d viewer-release-candidate
|
||||
675668bd24d3bea570814f71762a2a806f7e1b8d 3.3.2-release
|
||||
675668bd24d3bea570814f71762a2a806f7e1b8d viewer-release-candidate
|
||||
050e48759337249130f684b4a21080b683f61732 DRTVWR-168
|
||||
b9d0170b62eb1c7c3adaa37a0b13a833e5e659f9 DRTVWR-171
|
||||
c08e2ac17a99973b2a94477659220b99b8847ae2 DRTVWR-163
|
||||
600f3b3920d94de805ac6dc8bb6def9c069dd360 DRTVWR-162
|
||||
600f3b3920d94de805ac6dc8bb6def9c069dd360 DRTVWR-162
|
||||
9a78ac13f047056f788c4734dd91aebfe30970e3 DRTVWR-157
|
||||
a716684aa7c07c440b1de5815b8a1f3dd3fd8bfb DRTVWR-159
|
||||
24a7281bef42bd4430ceb25db8b195449c2c7de3 DRTVWR-153
|
||||
15e90b52dc0297921b022b90d10d797436b8a1bd viewer-release-candidate
|
||||
bb9932a7a5fd00edf52d95f354e3b37ae6a942db DRTVWR-156
|
||||
6414ecdabc5d89515b08d1f872cf923ed3a5523a DRTVWR-148
|
||||
1b7f311b5a5dbfbed3dcbb4ed44afa20f89cad4c DRTVWR-144
|
||||
1b7f311b5a5dbfbed3dcbb4ed44afa20f89cad4c 3.3.3-beta1
|
||||
2a3965b3ad202df7ea25d2be689291bb14a1280e DRTVWR-155
|
||||
24a7281bef42bd4430ceb25db8b195449c2c7de3 DRTVWR-153
|
||||
5910f8063a7e1ddddf504c2f35ca831cc5e8f469 DRTVWR-160
|
||||
1b7f311b5a5dbfbed3dcbb4ed44afa20f89cad4c 3.3.3-beta1
|
||||
f0a174c2adb4bc39b16722a61d7eeb4f2a1d4843 3.3.3-beta1
|
||||
1b7f311b5a5dbfbed3dcbb4ed44afa20f89cad4c DRTVWR-144
|
||||
f0a174c2adb4bc39b16722a61d7eeb4f2a1d4843 DRTVWR-144
|
||||
2d6c0634b11e6f3df11002b8510a72a0433da00a DRTVWR-164
|
||||
600f3b3920d94de805ac6dc8bb6def9c069dd360 DRTVWR-162
|
||||
80b5e5e9775966d3839331ffa7a16a60f9d7c930 DRTVWR-165
|
||||
fdcc08a4f20ae9bb060f4693c8980d216534efdf 3.3.3-beta2
|
||||
af5f3e43e6e4424b1da19d9e16f6b853a7b822ed DRTVWR-169
|
||||
4b3c68199a86cabaa5d9466d7b0f7e141e901d7a 3.3.3-beta3
|
||||
6428242e124b523813bfaf4c45b3d422f0298c81 3.3.3-release
|
||||
57d221de3df94f90b55204313c2cef044a3c0ae2 DRTVWR-176
|
||||
a716684aa7c07c440b1de5815b8a1f3dd3fd8bfb DRTVWR-159
|
||||
9a78ac13f047056f788c4734dd91aebfe30970e3 DRTVWR-157
|
||||
089e5c84b2dece68f2b016c842ef9b5de4786842 DRTVWR-161
|
||||
c08e2ac17a99973b2a94477659220b99b8847ae2 DRTVWR-163
|
||||
b9d0170b62eb1c7c3adaa37a0b13a833e5e659f9 DRTVWR-171
|
||||
050e48759337249130f684b4a21080b683f61732 DRTVWR-168
|
||||
09ef7fd1b0781f33b8a3a9af6236b7bcb4831910 DRTVWR-170
|
||||
f87bfbe0b62d26f451d02a47c80ebef6b9168fc2 3.3.4-beta1
|
||||
f87bfbe0b62d26f451d02a47c80ebef6b9168fc2 DRTVWR-158
|
||||
f87bfbe0b62d26f451d02a47c80ebef6b9168fc2 3.3.4-beta1
|
||||
cbea6356ce9cb0c313b6777f10c5c14783264fcc DRTVWR-174
|
||||
bce218b2b45b730b22cc51e4807aa8b571cadef3 DRTVWR-173
|
||||
f91d003091a61937a044652c4c674447f7dcbb7a 3.3.4-beta1
|
||||
bce218b2b45b730b22cc51e4807aa8b571cadef3 DRTVWR-173
|
||||
cbea6356ce9cb0c313b6777f10c5c14783264fcc DRTVWR-174
|
||||
82b5330bc8b17d0d4b598832e9c5a92e90075682 3.3.4-beta2
|
||||
57d221de3df94f90b55204313c2cef044a3c0ae2 DRTVWR-176
|
||||
eb539c65e6ee26eea2bf373af2d0f4b52dc91289 DRTVWR-177
|
||||
a8057e1b9a1246b434a27405be35e030f7d28b0c 3.3.4-beta3
|
||||
4281aa899fb2cedb7a9ca7ce91c5c29d4aa69594 DRTVWR-180
|
||||
9cd174d3a54d93d409a7c346a15b8bfb40fc58f4 DRTVWR-184
|
||||
5c08e1d8edd871807153603b690e3ee9dbb548aa DRTVWR-183
|
||||
6c75f220b103db1420919c8b635fe53e2177f318 3.3.4-beta4
|
||||
9cd174d3a54d93d409a7c346a15b8bfb40fc58f4 DRTVWR-184
|
||||
ab2ffc547c8a8950ff187c4f6c95e5334fab597b 3.3.4-beta5
|
||||
28e100d0379a2b0710c57647a28fc5239d3d7b99 3.3.4-release
|
||||
005dfe5c4c377207d065fb27858d2eb0b53b143a DRTVWR-167
|
||||
888768f162d2c0a8de1dcc5fb9a08bd8bd120a6b DRTVWR-175
|
||||
4ad8a3afe40e0200309e3ada68932c4295ac2795 DRTVWR-179
|
||||
a8b3eca451a9eaab59987efb0ab1c4217e3f2dcc DRTVWR-182
|
||||
1f27cdfdc54246484f8afbbe42ce48e954175cbd 3.4.0-beta1
|
||||
9ee9387789701d597130f879d9011a4958753862 DRTVWR-189
|
||||
47f0d08ba7ade0a3905074009067c6d3df7e16ae DRTVWR-190
|
||||
421126293dcbde918e0da027ca0ab9deb5b4fbf2 DRTVWR-192
|
||||
33a2fc7a910ae29ff8b4850316ed7fbff9f64d33 DRTVWR-195
|
||||
e9732c739c8a72a590216951505ea9c76a526a84 DRTVWR-193
|
||||
7602f61c804a512764e349c034c02ddabeefebc4 DRTVWR-196
|
||||
ae5c83dd61d2d37c45f1d5b8bf2b036d87599f1b DRTVWR-198
|
||||
507bdfbd6bf844a511c1ffeda4baa80016ed1346 DRTVWR-197
|
||||
b1dbb1a83f48f93f6f878cff9e52d2cb635e145c 3.4.0-beta2
|
||||
37402e2b19af970d51b0a814d79892cc5647532b DRTVWR-200
|
||||
182a9bf30e81070361bb020a78003b1cf398e79c 3.4.0-beta3
|
||||
6dfb0fba782c9233dd95f24ec48146db0d3f210b DRTVWR-199
|
||||
7c9102fb998885621919f2474a002c35b583539b 3.3.4-release2
|
||||
7649a3dff5ec22d3727377e5f02efd0f421e4cb5 DRTVWR-201
|
||||
84fb70dfe3444e75a44fb4bee43e2fc8221cebdd 3.4.0-beta4
|
||||
573e863be2f26d3687161def4b9fea9b7038dda8 3.4.0-beta5
|
||||
|
|
|
|||
|
|
@ -1187,6 +1187,54 @@
|
|||
</map>
|
||||
</map>
|
||||
</map>
|
||||
<key>libhunspell</key>
|
||||
<map>
|
||||
<key>license</key>
|
||||
<string>libhunspell</string>
|
||||
<key>license_file</key>
|
||||
<string>LICENSES/hunspell.txt</string>
|
||||
<key>name</key>
|
||||
<string>libhunspell</string>
|
||||
<key>platforms</key>
|
||||
<map>
|
||||
<key>darwin</key>
|
||||
<map>
|
||||
<key>archive</key>
|
||||
<map>
|
||||
<key>hash</key>
|
||||
<string>6f5db0ef258df6e5c93c843ec559db6d</string>
|
||||
<key>url</key>
|
||||
<string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-hunspell/rev/259874/arch/Darwin/installer/libhunspell-1.3.2-darwin-20120616.tar.bz2</string>
|
||||
</map>
|
||||
<key>name</key>
|
||||
<string>darwin</string>
|
||||
</map>
|
||||
<key>linux</key>
|
||||
<map>
|
||||
<key>archive</key>
|
||||
<map>
|
||||
<key>hash</key>
|
||||
<string>0c432d2626aea2e91a56335879c92965</string>
|
||||
<key>url</key>
|
||||
<string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-hunspell/rev/259874/arch/Linux/installer/libhunspell-1.3.2-linux-20120616.tar.bz2</string>
|
||||
</map>
|
||||
<key>name</key>
|
||||
<string>linux</string>
|
||||
</map>
|
||||
<key>windows</key>
|
||||
<map>
|
||||
<key>archive</key>
|
||||
<map>
|
||||
<key>hash</key>
|
||||
<string>6a140e5620826aa5e587b4157f57b389</string>
|
||||
<key>url</key>
|
||||
<string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-hunspell/rev/259874/arch/CYGWIN/installer/libhunspell-1.3.2-windows-20120616.tar.bz2</string>
|
||||
</map>
|
||||
<key>name</key>
|
||||
<string>windows</string>
|
||||
</map>
|
||||
</map>
|
||||
</map>
|
||||
<key>libpng</key>
|
||||
<map>
|
||||
<key>license</key>
|
||||
|
|
|
|||
|
|
@ -71,6 +71,7 @@ if (WINDOWS)
|
|||
/Oy-
|
||||
/Zc:wchar_t-
|
||||
/arch:SSE2
|
||||
/fp:fast
|
||||
)
|
||||
|
||||
# Are we using the crummy Visual Studio KDU build workaround?
|
||||
|
|
|
|||
|
|
@ -63,10 +63,10 @@ if(WINDOWS)
|
|||
libhunspell.dll
|
||||
)
|
||||
|
||||
if(USE_GOOGLE_PERFTOOLS)
|
||||
if(USE_TCMALLOC)
|
||||
set(debug_files ${debug_files} libtcmalloc_minimal-debug.dll)
|
||||
set(release_files ${release_files} libtcmalloc_minimal.dll)
|
||||
endif(USE_GOOGLE_PERFTOOLS)
|
||||
endif(USE_TCMALLOC)
|
||||
|
||||
if (FMOD)
|
||||
set(debug_files ${debug_files} fmod.dll)
|
||||
|
|
@ -276,7 +276,6 @@ elseif(LINUX)
|
|||
libopenal.so
|
||||
libopenjpeg.so
|
||||
libssl.so
|
||||
libtcmalloc_minimal.so
|
||||
libuuid.so.16
|
||||
libuuid.so.16.0.22
|
||||
libssl.so.1.0.0
|
||||
|
|
@ -284,6 +283,10 @@ elseif(LINUX)
|
|||
#libnotify.so # *TODO test/fix/get linux libnotify(growl)
|
||||
)
|
||||
|
||||
if (USE_TCMALLOC)
|
||||
set(release_files ${release_files} "libtcmalloc_minimal.so")
|
||||
endif (USE_TCMALLOC)
|
||||
|
||||
if (FMOD)
|
||||
set(release_files ${release_files} "libfmod-3.75.so")
|
||||
endif (FMOD)
|
||||
|
|
|
|||
|
|
@ -1,20 +1,34 @@
|
|||
# -*- cmake -*-
|
||||
include(Prebuilt)
|
||||
|
||||
# If you want to enable or disable TCMALLOC in viewer builds, this is the place.
|
||||
# set ON or OFF as desired.
|
||||
set (USE_TCMALLOC ON)
|
||||
|
||||
if (STANDALONE)
|
||||
include(FindGooglePerfTools)
|
||||
else (STANDALONE)
|
||||
if (WINDOWS)
|
||||
use_prebuilt_binary(tcmalloc)
|
||||
set(TCMALLOC_LIBRARIES
|
||||
debug libtcmalloc_minimal-debug
|
||||
optimized libtcmalloc_minimal)
|
||||
if (USE_TCMALLOC)
|
||||
use_prebuilt_binary(tcmalloc)
|
||||
set(TCMALLOC_LIBRARIES
|
||||
debug libtcmalloc_minimal-debug
|
||||
optimized libtcmalloc_minimal)
|
||||
set(TCMALLOC_LINK_FLAGS "/INCLUDE:__tcmalloc")
|
||||
else (USE_TCMALLOC)
|
||||
set(TCMALLOC_LIBRARIES)
|
||||
set(TCMALLOC_LINK_FLAGS)
|
||||
endif (USE_TCMALLOC)
|
||||
set(GOOGLE_PERFTOOLS_FOUND "YES")
|
||||
endif (WINDOWS)
|
||||
if (LINUX)
|
||||
use_prebuilt_binary(tcmalloc)
|
||||
set(TCMALLOC_LIBRARIES
|
||||
tcmalloc)
|
||||
if (USE_TCMALLOC)
|
||||
use_prebuilt_binary(tcmalloc)
|
||||
set(TCMALLOC_LIBRARIES
|
||||
tcmalloc)
|
||||
else (USE_TCMALLOC)
|
||||
set(TCMALLOC_LIBRARIES)
|
||||
endif (USE_TCMALLOC)
|
||||
set(PROFILER_LIBRARIES profiler)
|
||||
set(GOOGLE_PERFTOOLS_INCLUDE_DIR
|
||||
${LIBS_PREBUILT_DIR}/include)
|
||||
|
|
@ -29,13 +43,19 @@ if (GOOGLE_PERFTOOLS_FOUND)
|
|||
endif (GOOGLE_PERFTOOLS_FOUND)
|
||||
|
||||
if (WINDOWS)
|
||||
set(USE_GOOGLE_PERFTOOLS ON)
|
||||
set(USE_GOOGLE_PERFTOOLS ON)
|
||||
endif (WINDOWS)
|
||||
|
||||
if (USE_GOOGLE_PERFTOOLS)
|
||||
set(TCMALLOC_FLAG -ULL_USE_TCMALLOC=1)
|
||||
if (USE_TCMALLOC)
|
||||
set(TCMALLOC_FLAG -DLL_USE_TCMALLOC=1)
|
||||
else (USE_TCMALLOC)
|
||||
set(TCMALLOC_FLAG -ULL_USE_TCMALLOC)
|
||||
endif (USE_TCMALLOC)
|
||||
endif (USE_GOOGLE_PERFTOOLS)
|
||||
|
||||
if (USE_GOOGLE_PERFTOOLS)
|
||||
include_directories(${GOOGLE_PERFTOOLS_INCLUDE_DIR})
|
||||
set(GOOGLE_PERFTOOLS_LIBRARIES ${TCMALLOC_LIBRARIES} ${STACKTRACE_LIBRARIES} ${PROFILER_LIBRARIES})
|
||||
else (USE_GOOGLE_PERFTOOLS)
|
||||
set(TCMALLOC_FLAG -ULL_USE_TCMALLOC)
|
||||
endif (USE_GOOGLE_PERFTOOLS)
|
||||
|
|
|
|||
|
|
@ -7,13 +7,16 @@ list(APPEND Havok_INCLUDE_DIRS ${LIBS_PREBUILT_DIR}/include/havok/Demo)
|
|||
set(HAVOK_DEBUG_LIBRARY_PATH ${LIBS_PREBUILT_DIR}/lib/debug/havok-fulldebug)
|
||||
set(HAVOK_RELEASE_LIBRARY_PATH ${LIBS_PREBUILT_DIR}/lib/release/havok)
|
||||
|
||||
if (LL_DEBUG_HAVOK AND NOT WIN32)
|
||||
set(HAVOK_RELWITHDEBINFO_LIBRARY_PATH ${LIBS_PREBUILT_DIR}/lib/debug/havok-fulldebug)
|
||||
else (LL_DEBUG_HAVOK AND NOT WIN32)
|
||||
# Always link relwithdebinfo to havok-hybrid on windows.
|
||||
set(HAVOK_RELWITHDEBINFO_LIBRARY_PATH ${LIBS_PREBUILT_DIR}/lib/debug/havok-hybrid)
|
||||
endif (LL_DEBUG_HAVOK AND NOT WIN32)
|
||||
|
||||
if (LL_DEBUG_HAVOK)
|
||||
if (WIN32)
|
||||
# Always link relwithdebinfo to havok-hybrid on windows.
|
||||
set(HAVOK_RELWITHDEBINFO_LIBRARY_PATH ${LIBS_PREBUILT_DIR}/lib/debug/havok-hybrid)
|
||||
else (WIN32)
|
||||
set(HAVOK_RELWITHDEBINFO_LIBRARY_PATH ${LIBS_PREBUILT_DIR}/lib/debug/havok-fulldebug)
|
||||
endif (WIN32)
|
||||
else (LL_DEBUG_HAVOK)
|
||||
set(HAVOK_RELWITHDEBINFO_LIBRARY_PATH ${LIBS_PREBUILT_DIR}/lib/release/havok)
|
||||
endif (LL_DEBUG_HAVOK)
|
||||
|
||||
set(HAVOK_LIBS
|
||||
hkBase
|
||||
|
|
|
|||
|
|
@ -214,6 +214,15 @@ FUNCTION(LL_ADD_INTEGRATION_TEST
|
|||
SET_TARGET_PROPERTIES(INTEGRATION_TEST_${testname} PROPERTIES COMPILE_FLAGS -I"${TUT_INCLUDE_DIR}")
|
||||
endif(STANDALONE)
|
||||
|
||||
if (WINDOWS)
|
||||
SET_TARGET_PROPERTIES(INTEGRATION_TEST_${testname}
|
||||
PROPERTIES
|
||||
LINK_FLAGS "/debug /NODEFAULTLIB:LIBCMT /SUBSYSTEM:WINDOWS ${TCMALLOC_LINK_FLAGS}"
|
||||
LINK_FLAGS_DEBUG "/NODEFAULTLIB:\"LIBCMT;LIBCMTD;MSVCRT\" /INCREMENTAL:NO"
|
||||
LINK_FLAGS_RELEASE ""
|
||||
)
|
||||
endif (WINDOWS)
|
||||
|
||||
# Add link deps to the executable
|
||||
if(TEST_DEBUG)
|
||||
message(STATUS "TARGET_LINK_LIBRARIES(INTEGRATION_TEST_${testname} ${libraries})")
|
||||
|
|
|
|||
|
|
@ -1,22 +1,30 @@
|
|||
# -*- cmake -*-
|
||||
include(Prebuilt)
|
||||
|
||||
# There are three possible solutions to provide the llphysicsextensions:
|
||||
# - The full source package, selected by -DHAVOK:BOOL=ON
|
||||
# - The stub source package, selected by -DHAVOK:BOOL=OFF
|
||||
# - The prebuilt package available to those with sublicenses, selected by -DHAVOK_TPV:BOOL=ON
|
||||
|
||||
if (INSTALL_PROPRIETARY)
|
||||
set(HAVOK ON CACHE BOOL "Use Havok physics library")
|
||||
endif (INSTALL_PROPRIETARY)
|
||||
|
||||
|
||||
# Note that the use_prebuilt_binary macros below do not in fact include binaries;
|
||||
# the llphysicsextensions_* packages are source only and are built here.
|
||||
# The source package and the stub package both build libraries of the same name.
|
||||
|
||||
# Using the real wrapper or the stub can be controlled with -DHAVOK:BOOL={ON,OFF}
|
||||
# the default
|
||||
if (INSTALL_PROPRIETARY)
|
||||
set(HAVOK ON CACHE BOOL "Use Havok physics library")
|
||||
endif (INSTALL_PROPRIETARY)
|
||||
|
||||
if (HAVOK)
|
||||
include(Havok)
|
||||
use_prebuilt_binary(llphysicsextensions_source)
|
||||
set(LLPHYSICSEXTENSIONS_SRC_DIR ${LIBS_PREBUILT_DIR}/llphysicsextensions/src)
|
||||
set(LLPHYSICSEXTENSIONS_LIBRARIES llphysicsextensions)
|
||||
|
||||
elseif (HAVOK_TPV)
|
||||
use_prebuilt_binary(llphysicsextensions_tpv)
|
||||
set(LLPHYSICSEXTENSIONS_LIBRARIES llphysicsextensions_tpv)
|
||||
|
||||
# <FS:ND> include paths for LLs version and ours are different.
|
||||
set(LLPHYSICSEXTENSIONS_INCLUDE_DIRS ${LIBS_PREBUILT_DIR}/include/llphysicsextensions)
|
||||
# </FS:ND>
|
||||
|
|
|
|||
|
|
@ -189,6 +189,7 @@ void LLCharacter::requestStopMotion( LLMotion* motion)
|
|||
//-----------------------------------------------------------------------------
|
||||
static LLFastTimer::DeclareTimer FTM_UPDATE_ANIMATION("Update Animation");
|
||||
static LLFastTimer::DeclareTimer FTM_UPDATE_HIDDEN_ANIMATION("Update Hidden Anim");
|
||||
static LLFastTimer::DeclareTimer FTM_UPDATE_MOTIONS("Update Motions");
|
||||
|
||||
void LLCharacter::updateMotions(e_update_t update_type)
|
||||
{
|
||||
|
|
@ -206,7 +207,10 @@ void LLCharacter::updateMotions(e_update_t update_type)
|
|||
mMotionController.unpauseAllMotions();
|
||||
}
|
||||
bool force_update = (update_type == FORCE_UPDATE);
|
||||
mMotionController.updateMotions(force_update);
|
||||
{
|
||||
LLFastTimer t(FTM_UPDATE_MOTIONS);
|
||||
mMotionController.updateMotions(force_update);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -542,6 +542,8 @@ void LLMotionController::updateIdleActiveMotions()
|
|||
//-----------------------------------------------------------------------------
|
||||
// updateMotionsByType()
|
||||
//-----------------------------------------------------------------------------
|
||||
static LLFastTimer::DeclareTimer FTM_MOTION_ON_UPDATE("Motion onUpdate");
|
||||
|
||||
void LLMotionController::updateMotionsByType(LLMotion::LLMotionBlendType anim_type)
|
||||
{
|
||||
BOOL update_result = TRUE;
|
||||
|
|
@ -699,7 +701,10 @@ void LLMotionController::updateMotionsByType(LLMotion::LLMotionBlendType anim_ty
|
|||
}
|
||||
|
||||
// perform motion update
|
||||
update_result = motionp->onUpdate(mAnimTime - motionp->mActivationTimestamp, last_joint_signature);
|
||||
{
|
||||
LLFastTimer t(FTM_MOTION_ON_UPDATE);
|
||||
update_result = motionp->onUpdate(mAnimTime - motionp->mActivationTimestamp, last_joint_signature);
|
||||
}
|
||||
}
|
||||
|
||||
//**********************
|
||||
|
|
@ -810,7 +815,7 @@ void LLMotionController::updateMotions(bool force_update)
|
|||
|
||||
// Always cap the number of loaded motions
|
||||
purgeExcessMotions();
|
||||
|
||||
|
||||
// Update timing info for this time step.
|
||||
if (!mPaused)
|
||||
{
|
||||
|
|
@ -832,6 +837,7 @@ void LLMotionController::updateMotions(bool force_update)
|
|||
}
|
||||
|
||||
updateLoadingMotions();
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
@ -850,7 +856,7 @@ void LLMotionController::updateMotions(bool force_update)
|
|||
}
|
||||
|
||||
updateLoadingMotions();
|
||||
|
||||
|
||||
resetJointSignatures();
|
||||
|
||||
if (mPaused && !force_update)
|
||||
|
|
@ -861,11 +867,12 @@ void LLMotionController::updateMotions(bool force_update)
|
|||
{
|
||||
// update additive motions
|
||||
updateAdditiveMotions();
|
||||
|
||||
resetJointSignatures();
|
||||
|
||||
|
||||
// update all regular motions
|
||||
updateRegularMotions();
|
||||
|
||||
|
||||
if (use_quantum)
|
||||
{
|
||||
mPoseBlender.blendAndCache(TRUE);
|
||||
|
|
|
|||
|
|
@ -27,7 +27,7 @@
|
|||
#include "linden_common.h"
|
||||
#include "llallocator.h"
|
||||
|
||||
#if LL_USE_TCMALLOC
|
||||
#if (LL_USE_TCMALLOC && LL_USE_HEAP_PROFILER)
|
||||
|
||||
#include "google/heap-profiler.h"
|
||||
#include "google/commandlineflags_public.h"
|
||||
|
|
|
|||
|
|
@ -61,6 +61,18 @@ BOOL LLMemory::sEnableMemoryFailurePrevention = FALSE;
|
|||
LLPrivateMemoryPoolManager::mem_allocation_info_t LLPrivateMemoryPoolManager::sMemAllocationTracker;
|
||||
#endif
|
||||
|
||||
void ll_assert_aligned_func(uintptr_t ptr,U32 alignment)
|
||||
{
|
||||
#ifdef SHOW_ASSERT
|
||||
// Redundant, place to set breakpoints.
|
||||
if (ptr%alignment!=0)
|
||||
{
|
||||
llwarns << "alignment check failed" << llendl;
|
||||
}
|
||||
llassert(ptr%alignment==0);
|
||||
#endif
|
||||
}
|
||||
|
||||
//static
|
||||
void LLMemory::initClass()
|
||||
{
|
||||
|
|
|
|||
|
|
@ -27,7 +27,6 @@
|
|||
#define LLMEMORY_H
|
||||
|
||||
#include "llmemtype.h"
|
||||
#if LL_DEBUG
|
||||
inline void* ll_aligned_malloc( size_t size, int align )
|
||||
{
|
||||
void* mem = malloc( size + (align - 1) + sizeof(void*) );
|
||||
|
|
@ -43,10 +42,11 @@ inline void ll_aligned_free( void* ptr )
|
|||
free( ((void**)ptr)[-1] );
|
||||
}
|
||||
|
||||
#if !LL_USE_TCMALLOC
|
||||
inline void* ll_aligned_malloc_16(size_t size) // returned hunk MUST be freed with ll_aligned_free_16().
|
||||
{
|
||||
#if defined(LL_WINDOWS)
|
||||
return _mm_malloc(size, 16);
|
||||
return _aligned_malloc(size, 16);
|
||||
#elif defined(LL_DARWIN)
|
||||
return malloc(size); // default osx malloc is 16 byte aligned.
|
||||
#else
|
||||
|
|
@ -58,21 +58,38 @@ inline void* ll_aligned_malloc_16(size_t size) // returned hunk MUST be freed wi
|
|||
#endif
|
||||
}
|
||||
|
||||
inline void* ll_aligned_realloc_16(void* ptr, size_t size) // returned hunk MUST be freed with ll_aligned_free_16().
|
||||
{
|
||||
#if defined(LL_WINDOWS)
|
||||
return _aligned_realloc(ptr, size, 16);
|
||||
#elif defined(LL_DARWIN)
|
||||
return realloc(ptr,size); // default osx malloc is 16 byte aligned.
|
||||
#else
|
||||
return realloc(ptr,size); // FIXME not guaranteed to be aligned.
|
||||
#endif
|
||||
}
|
||||
|
||||
inline void ll_aligned_free_16(void *p)
|
||||
{
|
||||
#if defined(LL_WINDOWS)
|
||||
_mm_free(p);
|
||||
_aligned_free(p);
|
||||
#elif defined(LL_DARWIN)
|
||||
return free(p);
|
||||
#else
|
||||
free(p); // posix_memalign() is compatible with heap deallocator
|
||||
#endif
|
||||
}
|
||||
#else // USE_TCMALLOC
|
||||
// ll_aligned_foo_16 are not needed with tcmalloc
|
||||
#define ll_aligned_malloc_16 malloc
|
||||
#define ll_aligned_realloc_16 realloc
|
||||
#define ll_aligned_free_16 free
|
||||
#endif // USE_TCMALLOC
|
||||
|
||||
inline void* ll_aligned_malloc_32(size_t size) // returned hunk MUST be freed with ll_aligned_free_32().
|
||||
{
|
||||
#if defined(LL_WINDOWS)
|
||||
return _mm_malloc(size, 32);
|
||||
return _aligned_malloc(size, 32);
|
||||
#elif defined(LL_DARWIN)
|
||||
return ll_aligned_malloc( size, 32 );
|
||||
#else
|
||||
|
|
@ -87,22 +104,13 @@ inline void* ll_aligned_malloc_32(size_t size) // returned hunk MUST be freed wi
|
|||
inline void ll_aligned_free_32(void *p)
|
||||
{
|
||||
#if defined(LL_WINDOWS)
|
||||
_mm_free(p);
|
||||
_aligned_free(p);
|
||||
#elif defined(LL_DARWIN)
|
||||
ll_aligned_free( p );
|
||||
#else
|
||||
free(p); // posix_memalign() is compatible with heap deallocator
|
||||
#endif
|
||||
}
|
||||
#else // LL_DEBUG
|
||||
// ll_aligned_foo are noops now that we use tcmalloc everywhere (tcmalloc aligns automatically at appropriate intervals)
|
||||
#define ll_aligned_malloc( size, align ) malloc(size)
|
||||
#define ll_aligned_free( ptr ) free(ptr)
|
||||
#define ll_aligned_malloc_16 malloc
|
||||
#define ll_aligned_free_16 free
|
||||
#define ll_aligned_malloc_32 malloc
|
||||
#define ll_aligned_free_32 free
|
||||
#endif // LL_DEBUG
|
||||
|
||||
#ifndef __DEBUG_PRIVATE_MEM__
|
||||
#define __DEBUG_PRIVATE_MEM__ 0
|
||||
|
|
@ -515,6 +523,14 @@ void LLPrivateMemoryPoolTester::operator delete[](void* addr)
|
|||
|
||||
// LLSingleton moved to llsingleton.h
|
||||
|
||||
LL_COMMON_API void ll_assert_aligned_func(uintptr_t ptr,U32 alignment);
|
||||
|
||||
#ifdef SHOW_ASSERT
|
||||
#define ll_assert_aligned(ptr,alignment) ll_assert_aligned_func(reinterpret_cast<uintptr_t>(ptr),((U32)alignment))
|
||||
#else
|
||||
#define ll_assert_aligned(ptr,alignment)
|
||||
#endif
|
||||
|
||||
// <FS:ND> HACK! There are times when there's pointer that are not 0, but 1
|
||||
// This is to find those and research where they are coming.
|
||||
inline bool ndIsValidPtr( void const *aPtr )
|
||||
|
|
@ -523,4 +539,5 @@ inline bool ndIsValidPtr( void const *aPtr )
|
|||
}
|
||||
// </FS:ND>
|
||||
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -117,6 +117,7 @@ if (LL_TESTS)
|
|||
# INTEGRATION TESTS
|
||||
set(test_libs llmath llcommon ${LLCOMMON_LIBRARIES} ${WINDOWS_LIBRARIES})
|
||||
# TODO: Some of these need refactoring to be proper Unit tests rather than Integration tests.
|
||||
LL_ADD_INTEGRATION_TEST(alignment "" "${test_libs}")
|
||||
LL_ADD_INTEGRATION_TEST(llbbox llbbox.cpp "${test_libs}")
|
||||
LL_ADD_INTEGRATION_TEST(llquaternion llquaternion.cpp "${test_libs}")
|
||||
LL_ADD_INTEGRATION_TEST(mathmisc "" "${test_libs}")
|
||||
|
|
|
|||
|
|
@ -60,7 +60,7 @@ static const F32 MAX_FIELD_OF_VIEW = 175.f * DEG_TO_RAD;
|
|||
// roll(), pitch(), yaw()
|
||||
// etc...
|
||||
|
||||
|
||||
LL_ALIGN_PREFIX(16)
|
||||
class LLCamera
|
||||
: public LLCoordFrame
|
||||
{
|
||||
|
|
@ -108,7 +108,7 @@ public:
|
|||
};
|
||||
|
||||
private:
|
||||
LLPlane mAgentPlanes[7]; //frustum planes in agent space a la gluUnproject (I'm a bastard, I know) - DaveP
|
||||
LL_ALIGN_16(LLPlane mAgentPlanes[7]); //frustum planes in agent space a la gluUnproject (I'm a bastard, I know) - DaveP
|
||||
U8 mPlaneMask[8]; // 8 for alignment
|
||||
|
||||
F32 mView; // angle between top and bottom frustum planes in radians.
|
||||
|
|
@ -116,13 +116,13 @@ private:
|
|||
S32 mViewHeightInPixels; // for ViewHeightInPixels() only
|
||||
F32 mNearPlane;
|
||||
F32 mFarPlane;
|
||||
LLPlane mLocalPlanes[4];
|
||||
LL_ALIGN_16(LLPlane mLocalPlanes[4]);
|
||||
F32 mFixedDistance; // Always return this distance, unless < 0
|
||||
LLVector3 mFrustCenter; // center of frustum and radius squared for ultra-quick exclusion test
|
||||
F32 mFrustRadiusSquared;
|
||||
|
||||
LLPlane mWorldPlanes[PLANE_NUM];
|
||||
LLPlane mHorizPlanes[HORIZ_PLANE_NUM];
|
||||
LL_ALIGN_16(LLPlane mWorldPlanes[PLANE_NUM]);
|
||||
LL_ALIGN_16(LLPlane mHorizPlanes[HORIZ_PLANE_NUM]);
|
||||
|
||||
U32 mPlaneCount; //defaults to 6, if setUserClipPlane is called, uses user supplied clip plane in
|
||||
|
||||
|
|
@ -208,7 +208,7 @@ protected:
|
|||
void calculateFrustumPlanes(F32 left, F32 right, F32 top, F32 bottom);
|
||||
void calculateFrustumPlanesFromWindow(F32 x1, F32 y1, F32 x2, F32 y2);
|
||||
void calculateWorldFrustumPlanes();
|
||||
};
|
||||
} LL_ALIGN_POSTFIX(16);
|
||||
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -111,7 +111,7 @@ public:
|
|||
|
||||
protected:
|
||||
|
||||
LLVector4a mColumns[3];
|
||||
LL_ALIGN_16(LLVector4a mColumns[3]);
|
||||
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -34,7 +34,7 @@
|
|||
class LLMatrix4a
|
||||
{
|
||||
public:
|
||||
LLVector4a mMatrix[4];
|
||||
LL_ALIGN_16(LLVector4a mMatrix[4]);
|
||||
|
||||
inline void clear()
|
||||
{
|
||||
|
|
|
|||
|
|
@ -31,7 +31,6 @@
|
|||
#include "v3math.h"
|
||||
#include "llvector4a.h"
|
||||
#include <vector>
|
||||
#include <set>
|
||||
|
||||
#define OCT_ERRS LL_WARNS("OctreeErrors")
|
||||
|
||||
|
|
@ -79,16 +78,18 @@ public:
|
|||
|
||||
typedef LLOctreeTraveler<T> oct_traveler;
|
||||
typedef LLTreeTraveler<T> tree_traveler;
|
||||
typedef typename std::set<LLPointer<T> > element_list;
|
||||
typedef typename element_list::iterator element_iter;
|
||||
typedef typename element_list::const_iterator const_element_iter;
|
||||
typedef LLPointer<T>* element_list;
|
||||
typedef LLPointer<T>* element_iter;
|
||||
typedef const LLPointer<T>* const_element_iter;
|
||||
typedef typename std::vector<LLTreeListener<T>*>::iterator tree_listener_iter;
|
||||
typedef typename std::vector<LLOctreeNode<T>* > child_list;
|
||||
typedef LLOctreeNode<T>** child_list;
|
||||
typedef LLOctreeNode<T>** child_iter;
|
||||
|
||||
typedef LLTreeNode<T> BaseType;
|
||||
typedef LLOctreeNode<T> oct_node;
|
||||
typedef LLOctreeListener<T> oct_listener;
|
||||
|
||||
/*void* operator new(size_t size)
|
||||
void* operator new(size_t size)
|
||||
{
|
||||
return ll_aligned_malloc_16(size);
|
||||
}
|
||||
|
|
@ -96,7 +97,7 @@ public:
|
|||
void operator delete(void* ptr)
|
||||
{
|
||||
ll_aligned_free_16(ptr);
|
||||
}*/
|
||||
}
|
||||
|
||||
LLOctreeNode( const LLVector4a& center,
|
||||
const LLVector4a& size,
|
||||
|
|
@ -105,6 +106,9 @@ public:
|
|||
: mParent((oct_node*)parent),
|
||||
mOctant(octant)
|
||||
{
|
||||
mData = NULL;
|
||||
mDataEnd = NULL;
|
||||
|
||||
mCenter = center;
|
||||
mSize = size;
|
||||
|
||||
|
|
@ -123,6 +127,16 @@ public:
|
|||
{
|
||||
BaseType::destroyListeners();
|
||||
|
||||
for (U32 i = 0; i < mElementCount; ++i)
|
||||
{
|
||||
mData[i]->setBinIndex(-1);
|
||||
mData[i] = NULL;
|
||||
}
|
||||
|
||||
free(mData);
|
||||
mData = NULL;
|
||||
mDataEnd = NULL;
|
||||
|
||||
for (U32 i = 0; i < getChildCount(); i++)
|
||||
{
|
||||
delete getChild(i);
|
||||
|
|
@ -219,12 +233,17 @@ public:
|
|||
}
|
||||
|
||||
void accept(oct_traveler* visitor) { visitor->visit(this); }
|
||||
virtual bool isLeaf() const { return mChild.empty(); }
|
||||
virtual bool isLeaf() const { return mChildCount == 0; }
|
||||
|
||||
U32 getElementCount() const { return mElementCount; }
|
||||
bool isEmpty() const { return mElementCount == 0; }
|
||||
element_list& getData() { return mData; }
|
||||
const element_list& getData() const { return mData; }
|
||||
|
||||
element_iter getDataBegin() { return mData; }
|
||||
element_iter getDataEnd() { return mDataEnd; }
|
||||
const_element_iter getDataBegin() const { return mData; }
|
||||
const_element_iter getDataEnd() const { return mDataEnd; }
|
||||
|
||||
U32 getChildCount() const { return mChildCount; }
|
||||
oct_node* getChild(U32 index) { return mChild[index]; }
|
||||
const oct_node* getChild(U32 index) const { return mChild[index]; }
|
||||
|
|
@ -289,7 +308,7 @@ public:
|
|||
|
||||
virtual bool insert(T* data)
|
||||
{
|
||||
if (data == NULL)
|
||||
if (data == NULL || data->getBinIndex() != -1)
|
||||
{
|
||||
OCT_ERRS << "!!! INVALID ELEMENT ADDED TO OCTREE BRANCH !!!" << llendl;
|
||||
return false;
|
||||
|
|
@ -302,13 +321,16 @@ public:
|
|||
if ((getElementCount() < gOctreeMaxCapacity && contains(data->getBinRadius()) ||
|
||||
(data->getBinRadius() > getSize()[0] && parent && parent->getElementCount() >= gOctreeMaxCapacity)))
|
||||
{ //it belongs here
|
||||
//if this is a redundant insertion, error out (should never happen)
|
||||
llassert(mData.find(data) == mData.end());
|
||||
mElementCount++;
|
||||
mData = (element_list) realloc(mData, sizeof(LLPointer<T>)*mElementCount);
|
||||
|
||||
mData.insert(data);
|
||||
//avoid unref on uninitialized memory
|
||||
memset(mData+mElementCount-1, 0, sizeof(LLPointer<T>));
|
||||
|
||||
mData[mElementCount-1] = data;
|
||||
mDataEnd = mData + mElementCount;
|
||||
data->setBinIndex(mElementCount-1);
|
||||
BaseType::insert(data);
|
||||
|
||||
mElementCount = mData.size();
|
||||
return true;
|
||||
}
|
||||
else
|
||||
|
|
@ -342,10 +364,16 @@ public:
|
|||
|
||||
if( lt == 0x7 )
|
||||
{
|
||||
mData.insert(data);
|
||||
BaseType::insert(data);
|
||||
mElementCount++;
|
||||
mData = (element_list) realloc(mData, sizeof(LLPointer<T>)*mElementCount);
|
||||
|
||||
mElementCount = mData.size();
|
||||
//avoid unref on uninitialized memory
|
||||
memset(mData+mElementCount-1, 0, sizeof(LLPointer<T>));
|
||||
|
||||
mData[mElementCount-1] = data;
|
||||
mDataEnd = mData + mElementCount;
|
||||
data->setBinIndex(mElementCount-1);
|
||||
BaseType::insert(data);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
@ -394,23 +422,59 @@ public:
|
|||
return false;
|
||||
}
|
||||
|
||||
void _remove(T* data, S32 i)
|
||||
{ //precondition -- mElementCount > 0, idx is in range [0, mElementCount)
|
||||
|
||||
mElementCount--;
|
||||
data->setBinIndex(-1);
|
||||
|
||||
if (mElementCount > 0)
|
||||
{
|
||||
if (mElementCount != i)
|
||||
{
|
||||
mData[i] = mData[mElementCount]; //might unref data, do not access data after this point
|
||||
mData[i]->setBinIndex(i);
|
||||
}
|
||||
|
||||
mData[mElementCount] = NULL; //needed for unref
|
||||
mData = (element_list) realloc(mData, sizeof(LLPointer<T>)*mElementCount);
|
||||
mDataEnd = mData+mElementCount;
|
||||
}
|
||||
else
|
||||
{
|
||||
mData[0] = NULL; //needed for unref
|
||||
free(mData);
|
||||
mData = NULL;
|
||||
mDataEnd = NULL;
|
||||
}
|
||||
|
||||
notifyRemoval(data);
|
||||
checkAlive();
|
||||
}
|
||||
|
||||
bool remove(T* data)
|
||||
{
|
||||
if (mData.find(data) != mData.end())
|
||||
{ //we have data
|
||||
mData.erase(data);
|
||||
mElementCount = mData.size();
|
||||
notifyRemoval(data);
|
||||
checkAlive();
|
||||
return true;
|
||||
S32 i = data->getBinIndex();
|
||||
|
||||
if (i >= 0 && i < mElementCount)
|
||||
{
|
||||
if (mData[i] == data)
|
||||
{ //found it
|
||||
_remove(data, i);
|
||||
llassert(data->getBinIndex() == -1);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
else if (isInside(data))
|
||||
|
||||
if (isInside(data))
|
||||
{
|
||||
oct_node* dest = getNodeAt(data);
|
||||
|
||||
if (dest != this)
|
||||
{
|
||||
return dest->remove(data);
|
||||
bool ret = dest->remove(data);
|
||||
llassert(data->getBinIndex() == -1);
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -429,19 +493,20 @@ public:
|
|||
//node is now root
|
||||
llwarns << "!!! OCTREE REMOVING FACE BY ADDRESS, SEVERE PERFORMANCE PENALTY |||" << llendl;
|
||||
node->removeByAddress(data);
|
||||
llassert(data->getBinIndex() == -1);
|
||||
return true;
|
||||
}
|
||||
|
||||
void removeByAddress(T* data)
|
||||
{
|
||||
if (mData.find(data) != mData.end())
|
||||
for (U32 i = 0; i < mElementCount; ++i)
|
||||
{
|
||||
mData.erase(data);
|
||||
mElementCount = mData.size();
|
||||
notifyRemoval(data);
|
||||
llwarns << "FOUND!" << llendl;
|
||||
checkAlive();
|
||||
return;
|
||||
if (mData[i] == data)
|
||||
{ //we have data
|
||||
_remove(data, i);
|
||||
llwarns << "FOUND!" << llendl;
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
for (U32 i = 0; i < getChildCount(); i++)
|
||||
|
|
@ -453,8 +518,8 @@ public:
|
|||
|
||||
void clearChildren()
|
||||
{
|
||||
mChild.clear();
|
||||
mChildCount = 0;
|
||||
|
||||
U32* foo = (U32*) mChildMap;
|
||||
foo[0] = foo[1] = 0xFFFFFFFF;
|
||||
}
|
||||
|
|
@ -516,7 +581,7 @@ public:
|
|||
|
||||
mChildMap[child->getOctant()] = mChildCount;
|
||||
|
||||
mChild.push_back(child);
|
||||
mChild[mChildCount] = child;
|
||||
++mChildCount;
|
||||
child->setParent(this);
|
||||
|
||||
|
|
@ -543,9 +608,12 @@ public:
|
|||
mChild[index]->destroy();
|
||||
delete mChild[index];
|
||||
}
|
||||
mChild.erase(mChild.begin() + index);
|
||||
|
||||
--mChildCount;
|
||||
|
||||
mChild[index] = mChild[mChildCount];
|
||||
|
||||
|
||||
//rebuild child map
|
||||
U32* foo = (U32*) mChildMap;
|
||||
foo[0] = foo[1] = 0xFFFFFFFF;
|
||||
|
|
@ -601,11 +669,12 @@ protected:
|
|||
oct_node* mParent;
|
||||
U8 mOctant;
|
||||
|
||||
child_list mChild;
|
||||
LLOctreeNode<T>* mChild[8];
|
||||
U8 mChildMap[8];
|
||||
U32 mChildCount;
|
||||
|
||||
element_list mData;
|
||||
element_iter mDataEnd;
|
||||
U32 mElementCount;
|
||||
|
||||
};
|
||||
|
|
|
|||
|
|
@ -36,6 +36,8 @@
|
|||
// The plane normal = [A, B, C]
|
||||
// The closest approach = D / sqrt(A*A + B*B + C*C)
|
||||
|
||||
|
||||
LL_ALIGN_PREFIX(16)
|
||||
class LLPlane
|
||||
{
|
||||
public:
|
||||
|
|
@ -94,7 +96,7 @@ public:
|
|||
|
||||
private:
|
||||
LLVector4a mV;
|
||||
};
|
||||
} LL_ALIGN_POSTFIX(16);
|
||||
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -67,11 +67,10 @@ template <typename T> T* LL_NEXT_ALIGNED_ADDRESS_64(T* address)
|
|||
|
||||
#define LL_ALIGN_16(var) LL_ALIGN_PREFIX(16) var LL_ALIGN_POSTFIX(16)
|
||||
|
||||
|
||||
|
||||
#include <xmmintrin.h>
|
||||
#include <emmintrin.h>
|
||||
|
||||
#include "llmemory.h"
|
||||
#include "llsimdtypes.h"
|
||||
#include "llsimdtypes.inl"
|
||||
|
||||
|
|
|
|||
|
|
@ -62,6 +62,7 @@ inline LLSimdScalar operator/(const LLSimdScalar& a, const LLSimdScalar& b)
|
|||
inline LLSimdScalar operator-(const LLSimdScalar& a)
|
||||
{
|
||||
static LL_ALIGN_16(const U32 signMask[4]) = {0x80000000, 0x80000000, 0x80000000, 0x80000000 };
|
||||
ll_assert_aligned(signMask,16);
|
||||
return _mm_xor_ps(*reinterpret_cast<const LLQuad*>(signMask), a);
|
||||
}
|
||||
|
||||
|
|
@ -146,6 +147,7 @@ inline LLSimdScalar& LLSimdScalar::operator/=(const LLSimdScalar& rhs)
|
|||
inline LLSimdScalar LLSimdScalar::getAbs() const
|
||||
{
|
||||
static const LL_ALIGN_16(U32 F_ABS_MASK_4A[4]) = { 0x7FFFFFFF, 0x7FFFFFFF, 0x7FFFFFFF, 0x7FFFFFFF };
|
||||
ll_assert_aligned(F_ABS_MASK_4A,16);
|
||||
return _mm_and_ps( mQ, *reinterpret_cast<const LLQuad*>(F_ABS_MASK_4A));
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -24,6 +24,7 @@
|
|||
* $/LicenseInfo$
|
||||
*/
|
||||
|
||||
#include "llmemory.h"
|
||||
#include "llmath.h"
|
||||
#include "llquantize.h"
|
||||
|
||||
|
|
@ -46,7 +47,10 @@ extern const LLVector4a LL_V4A_EPSILON = reinterpret_cast<const LLVector4a&> ( F
|
|||
assert(dst != NULL);
|
||||
assert(bytes > 0);
|
||||
assert((bytes % sizeof(F32))== 0);
|
||||
|
||||
ll_assert_aligned(src,16);
|
||||
ll_assert_aligned(dst,16);
|
||||
assert(bytes%16==0);
|
||||
|
||||
F32* end = dst + (bytes / sizeof(F32) );
|
||||
|
||||
if (bytes > 64)
|
||||
|
|
@ -199,6 +203,8 @@ void LLVector4a::quantize16( const LLVector4a& low, const LLVector4a& high )
|
|||
LLVector4a oneOverDelta;
|
||||
{
|
||||
static LL_ALIGN_16( const F32 F_TWO_4A[4] ) = { 2.f, 2.f, 2.f, 2.f };
|
||||
ll_assert_aligned(F_TWO_4A,16);
|
||||
|
||||
LLVector4a two; two.load4a( F_TWO_4A );
|
||||
|
||||
// Here we use _mm_rcp_ps plus one round of newton-raphson
|
||||
|
|
|
|||
|
|
@ -32,6 +32,7 @@ class LLRotation;
|
|||
|
||||
#include <assert.h>
|
||||
#include "llpreprocessor.h"
|
||||
#include "llmemory.h"
|
||||
|
||||
///////////////////////////////////
|
||||
// FIRST TIME USERS PLEASE READ
|
||||
|
|
@ -46,6 +47,7 @@ class LLRotation;
|
|||
// LLVector3/LLVector4.
|
||||
/////////////////////////////////
|
||||
|
||||
LL_ALIGN_PREFIX(16)
|
||||
class LLVector4a
|
||||
{
|
||||
public:
|
||||
|
|
@ -82,6 +84,7 @@ public:
|
|||
}
|
||||
|
||||
// Copy words 16-byte blocks from src to dst. Source and destination must not overlap.
|
||||
// Source and dest must be 16-byte aligned and size must be multiple of 16.
|
||||
static void memcpyNonAliased16(F32* __restrict dst, const F32* __restrict src, size_t bytes);
|
||||
|
||||
////////////////////////////////////
|
||||
|
|
@ -90,6 +93,7 @@ public:
|
|||
|
||||
LLVector4a()
|
||||
{ //DO NOT INITIALIZE -- The overhead is completely unnecessary
|
||||
ll_assert_aligned(this,16);
|
||||
}
|
||||
|
||||
LLVector4a(F32 x, F32 y, F32 z, F32 w = 0.f)
|
||||
|
|
@ -313,7 +317,7 @@ public:
|
|||
|
||||
private:
|
||||
LLQuad mQ;
|
||||
};
|
||||
} LL_ALIGN_POSTFIX(16);
|
||||
|
||||
inline void update_min_max(LLVector4a& min, LLVector4a& max, const LLVector4a& p)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -475,6 +475,7 @@ inline void LLVector4a::setLerp(const LLVector4a& lhs, const LLVector4a& rhs, F3
|
|||
inline LLBool32 LLVector4a::isFinite3() const
|
||||
{
|
||||
static LL_ALIGN_16(const U32 nanOrInfMask[4]) = { 0x7f800000, 0x7f800000, 0x7f800000, 0x7f800000 };
|
||||
ll_assert_aligned(nanOrInfMask,16);
|
||||
const __m128i nanOrInfMaskV = *reinterpret_cast<const __m128i*> (nanOrInfMask);
|
||||
const __m128i maskResult = _mm_and_si128( _mm_castps_si128(mQ), nanOrInfMaskV );
|
||||
const LLVector4Logical equalityCheck = _mm_castsi128_ps(_mm_cmpeq_epi32( maskResult, nanOrInfMaskV ));
|
||||
|
|
|
|||
|
|
@ -27,6 +27,7 @@
|
|||
#ifndef LL_VECTOR4LOGICAL_H
|
||||
#define LL_VECTOR4LOGICAL_H
|
||||
|
||||
#include "llmemory.h"
|
||||
|
||||
////////////////////////////
|
||||
// LLVector4Logical
|
||||
|
|
@ -77,6 +78,7 @@ public:
|
|||
inline LLVector4Logical& invert()
|
||||
{
|
||||
static const LL_ALIGN_16(U32 allOnes[4]) = { 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF };
|
||||
ll_assert_aligned(allOnes,16);
|
||||
mQ = _mm_andnot_ps( mQ, *(LLQuad*)(allOnes) );
|
||||
return *this;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -112,17 +112,6 @@ struct TrianglesPerLODCache
|
|||
};
|
||||
// </FS:ND>
|
||||
|
||||
void assert_aligned(void* ptr, uintptr_t alignment)
|
||||
{
|
||||
#if 0
|
||||
uintptr_t t = (uintptr_t) ptr;
|
||||
if (t%alignment != 0)
|
||||
{
|
||||
llerrs << "Alignment check failed." << llendl;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
BOOL check_same_clock_dir( const LLVector3& pt1, const LLVector3& pt2, const LLVector3& pt3, const LLVector3& norm)
|
||||
{
|
||||
LLVector3 test = (pt2-pt1)%(pt3-pt2);
|
||||
|
|
@ -345,16 +334,16 @@ public:
|
|||
LLVector4a& min = node->mExtents[0];
|
||||
LLVector4a& max = node->mExtents[1];
|
||||
|
||||
if (!branch->getData().empty())
|
||||
if (!branch->isEmpty())
|
||||
{ //node has data, find AABB that binds data set
|
||||
const LLVolumeTriangle* tri = *(branch->getData().begin());
|
||||
const LLVolumeTriangle* tri = *(branch->getDataBegin());
|
||||
|
||||
//initialize min/max to first available vertex
|
||||
min = *(tri->mV[0]);
|
||||
max = *(tri->mV[0]);
|
||||
|
||||
for (LLOctreeNode<LLVolumeTriangle>::const_element_iter iter =
|
||||
branch->getData().begin(); iter != branch->getData().end(); ++iter)
|
||||
branch->getDataBegin(); iter != branch->getDataEnd(); ++iter)
|
||||
{ //for each triangle in node
|
||||
|
||||
//stretch by triangles in node
|
||||
|
|
@ -369,7 +358,7 @@ public:
|
|||
max.setMax(max, *tri->mV[2]);
|
||||
}
|
||||
}
|
||||
else if (!branch->getChildren().empty())
|
||||
else if (!branch->isLeaf())
|
||||
{ //no data, but child nodes exist
|
||||
LLVolumeOctreeListener* child = (LLVolumeOctreeListener*) branch->getChild(0)->getListener(0);
|
||||
|
||||
|
|
@ -7005,14 +6994,14 @@ void LLVolumeFace::resizeVertices(S32 num_verts)
|
|||
if (num_verts)
|
||||
{
|
||||
mPositions = (LLVector4a*) ll_aligned_malloc_16(sizeof(LLVector4a)*num_verts);
|
||||
assert_aligned(mPositions, 16);
|
||||
ll_assert_aligned(mPositions, 16);
|
||||
mNormals = (LLVector4a*) ll_aligned_malloc_16(sizeof(LLVector4a)*num_verts);
|
||||
assert_aligned(mNormals, 16);
|
||||
ll_assert_aligned(mNormals, 16);
|
||||
|
||||
//pad texture coordinate block end to allow for QWORD reads
|
||||
S32 size = ((num_verts*sizeof(LLVector2)) + 0xF) & ~0xF;
|
||||
mTexCoords = (LLVector2*) ll_aligned_malloc_16(size);
|
||||
assert_aligned(mTexCoords, 16);
|
||||
ll_assert_aligned(mTexCoords, 16);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
@ -7036,14 +7025,17 @@ void LLVolumeFace::pushVertex(const LLVector4a& pos, const LLVector4a& norm, con
|
|||
// S32 old_size = mNumVertices*16;
|
||||
|
||||
//positions
|
||||
mPositions = (LLVector4a*) realloc(mPositions, new_size);
|
||||
mPositions = (LLVector4a*) ll_aligned_realloc_16(mPositions, new_size);
|
||||
ll_assert_aligned(mPositions,16);
|
||||
|
||||
//normals
|
||||
mNormals = (LLVector4a*) realloc(mNormals, new_size);
|
||||
|
||||
mNormals = (LLVector4a*) ll_aligned_realloc_16(mNormals, new_size);
|
||||
ll_assert_aligned(mNormals,16);
|
||||
|
||||
//tex coords
|
||||
new_size = ((new_verts*8)+0xF) & ~0xF;
|
||||
mTexCoords = (LLVector2*) realloc(mTexCoords, new_size);
|
||||
mTexCoords = (LLVector2*) ll_aligned_realloc_16(mTexCoords, new_size);
|
||||
ll_assert_aligned(mTexCoords,16);
|
||||
|
||||
|
||||
//just clear binormals
|
||||
|
|
@ -7096,7 +7088,8 @@ void LLVolumeFace::pushIndex(const U16& idx)
|
|||
S32 old_size = ((mNumIndices*2)+0xF) & ~0xF;
|
||||
if (new_size != old_size)
|
||||
{
|
||||
mIndices = (U16*) realloc(mIndices, new_size);
|
||||
mIndices = (U16*) ll_aligned_realloc_16(mIndices, new_size);
|
||||
ll_assert_aligned(mIndices,16);
|
||||
}
|
||||
|
||||
mIndices[mNumIndices++] = idx;
|
||||
|
|
@ -7137,12 +7130,12 @@ void LLVolumeFace::appendFace(const LLVolumeFace& face, LLMatrix4& mat_in, LLMat
|
|||
}
|
||||
|
||||
//allocate new buffer space
|
||||
mPositions = (LLVector4a*) realloc(mPositions, new_count*sizeof(LLVector4a));
|
||||
assert_aligned(mPositions, 16);
|
||||
mNormals = (LLVector4a*) realloc(mNormals, new_count*sizeof(LLVector4a));
|
||||
assert_aligned(mNormals, 16);
|
||||
mTexCoords = (LLVector2*) realloc(mTexCoords, (new_count*sizeof(LLVector2)+0xF) & ~0xF);
|
||||
assert_aligned(mTexCoords, 16);
|
||||
mPositions = (LLVector4a*) ll_aligned_realloc_16(mPositions, new_count*sizeof(LLVector4a));
|
||||
ll_assert_aligned(mPositions, 16);
|
||||
mNormals = (LLVector4a*) ll_aligned_realloc_16(mNormals, new_count*sizeof(LLVector4a));
|
||||
ll_assert_aligned(mNormals, 16);
|
||||
mTexCoords = (LLVector2*) ll_aligned_realloc_16(mTexCoords, (new_count*sizeof(LLVector2)+0xF) & ~0xF);
|
||||
ll_assert_aligned(mTexCoords, 16);
|
||||
|
||||
mNumVertices = new_count;
|
||||
|
||||
|
|
@ -7188,7 +7181,7 @@ void LLVolumeFace::appendFace(const LLVolumeFace& face, LLMatrix4& mat_in, LLMat
|
|||
new_count = mNumIndices + face.mNumIndices;
|
||||
|
||||
//allocate new index buffer
|
||||
mIndices = (U16*) realloc(mIndices, (new_count*sizeof(U16)+0xF) & ~0xF);
|
||||
mIndices = (U16*) ll_aligned_realloc_16(mIndices, (new_count*sizeof(U16)+0xF) & ~0xF);
|
||||
|
||||
//get destination address into new index buffer
|
||||
U16* dst_idx = mIndices+mNumIndices;
|
||||
|
|
|
|||
|
|
@ -131,7 +131,7 @@ void LLOctreeTriangleRayIntersect::traverse(const LLOctreeNode<LLVolumeTriangle>
|
|||
void LLOctreeTriangleRayIntersect::visit(const LLOctreeNode<LLVolumeTriangle>* node)
|
||||
{
|
||||
for (LLOctreeNode<LLVolumeTriangle>::const_element_iter iter =
|
||||
node->getData().begin(); iter != node->getData().end(); ++iter)
|
||||
node->getDataBegin(); iter != node->getDataEnd(); ++iter)
|
||||
{
|
||||
const LLVolumeTriangle* tri = *iter;
|
||||
|
||||
|
|
@ -236,8 +236,8 @@ void LLVolumeOctreeValidate::visit(const LLOctreeNode<LLVolumeTriangle>* branch)
|
|||
}
|
||||
|
||||
//children fit, check data
|
||||
for (LLOctreeNode<LLVolumeTriangle>::const_element_iter iter = branch->getData().begin();
|
||||
iter != branch->getData().end(); ++iter)
|
||||
for (LLOctreeNode<LLVolumeTriangle>::const_element_iter iter = branch->getDataBegin();
|
||||
iter != branch->getDataEnd(); ++iter)
|
||||
{
|
||||
const LLVolumeTriangle* tri = *iter;
|
||||
|
||||
|
|
|
|||
|
|
@ -37,9 +37,19 @@
|
|||
class LLVolumeTriangle : public LLRefCount
|
||||
{
|
||||
public:
|
||||
void* operator new(size_t size)
|
||||
{
|
||||
return ll_aligned_malloc_16(size);
|
||||
}
|
||||
|
||||
void operator delete(void* ptr)
|
||||
{
|
||||
ll_aligned_free_16(ptr);
|
||||
}
|
||||
|
||||
LLVolumeTriangle()
|
||||
{
|
||||
|
||||
mBinIndex = -1;
|
||||
}
|
||||
|
||||
LLVolumeTriangle(const LLVolumeTriangle& rhs)
|
||||
|
|
@ -58,21 +68,38 @@ public:
|
|||
|
||||
}
|
||||
|
||||
LLVector4a mPositionGroup;
|
||||
LL_ALIGN_16(LLVector4a mPositionGroup);
|
||||
|
||||
const LLVector4a* mV[3];
|
||||
U16 mIndex[3];
|
||||
|
||||
F32 mRadius;
|
||||
mutable S32 mBinIndex;
|
||||
|
||||
|
||||
virtual const LLVector4a& getPositionGroup() const;
|
||||
virtual const F32& getBinRadius() const;
|
||||
|
||||
S32 getBinIndex() const { return mBinIndex; }
|
||||
void setBinIndex(S32 idx) const { mBinIndex = idx; }
|
||||
|
||||
|
||||
};
|
||||
|
||||
class LLVolumeOctreeListener : public LLOctreeListener<LLVolumeTriangle>
|
||||
{
|
||||
public:
|
||||
|
||||
void* operator new(size_t size)
|
||||
{
|
||||
return ll_aligned_malloc_16(size);
|
||||
}
|
||||
|
||||
void operator delete(void* ptr)
|
||||
{
|
||||
ll_aligned_free_16(ptr);
|
||||
}
|
||||
|
||||
LLVolumeOctreeListener(LLOctreeNode<LLVolumeTriangle>* node);
|
||||
~LLVolumeOctreeListener();
|
||||
|
||||
|
|
@ -99,8 +126,8 @@ public:
|
|||
|
||||
|
||||
public:
|
||||
LLVector4a mBounds[2]; // bounding box (center, size) of this node and all its children (tight fit to objects)
|
||||
LLVector4a mExtents[2]; // extents (min, max) of this node and all its children
|
||||
LL_ALIGN_16(LLVector4a mBounds[2]); // bounding box (center, size) of this node and all its children (tight fit to objects)
|
||||
LL_ALIGN_16(LLVector4a mExtents[2]); // extents (min, max) of this node and all its children
|
||||
};
|
||||
|
||||
class LLOctreeTriangleRayIntersect : public LLOctreeTraveler<LLVolumeTriangle>
|
||||
|
|
|
|||
|
|
@ -0,0 +1,128 @@
|
|||
/**
|
||||
* @file v3dmath_test.cpp
|
||||
* @author Vir
|
||||
* @date 2011-12
|
||||
* @brief v3dmath test cases.
|
||||
*
|
||||
* $LicenseInfo:firstyear=2011&license=viewerlgpl$
|
||||
* Second Life Viewer Source Code
|
||||
* Copyright (C) 2011, Linden Research, Inc.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation;
|
||||
* version 2.1 of the License only.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*
|
||||
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
|
||||
* $/LicenseInfo$
|
||||
*/
|
||||
|
||||
// Tests related to allocating objects with alignment constraints, particularly for SSE support.
|
||||
|
||||
#include "linden_common.h"
|
||||
#include "../test/lltut.h"
|
||||
#include "../llmath.h"
|
||||
#include "../llsimdmath.h"
|
||||
#include "../llvector4a.h"
|
||||
|
||||
void* operator new(size_t size)
|
||||
{
|
||||
return ll_aligned_malloc_16(size);
|
||||
}
|
||||
|
||||
void operator delete(void *p)
|
||||
{
|
||||
ll_aligned_free_16(p);
|
||||
}
|
||||
|
||||
namespace tut
|
||||
{
|
||||
|
||||
#define is_aligned(ptr,alignment) ((reinterpret_cast<uintptr_t>(ptr))%(alignment)==0)
|
||||
#define is_aligned_relative(ptr,base_ptr,alignment) ((reinterpret_cast<uintptr_t>(ptr)-reinterpret_cast<uintptr_t>(base_ptr))%(alignment)==0)
|
||||
|
||||
struct alignment_test {};
|
||||
|
||||
typedef test_group<alignment_test> alignment_test_t;
|
||||
typedef alignment_test_t::object alignment_test_object_t;
|
||||
tut::alignment_test_t tut_alignment_test("LLAlignment");
|
||||
|
||||
LL_ALIGN_PREFIX(16)
|
||||
class MyVector4a
|
||||
{
|
||||
LLQuad mQ;
|
||||
} LL_ALIGN_POSTFIX(16);
|
||||
|
||||
|
||||
// Verify that aligned allocators perform as advertised.
|
||||
template<> template<>
|
||||
void alignment_test_object_t::test<1>()
|
||||
{
|
||||
# ifdef LL_DEBUG
|
||||
skip("This test fails on Windows when compiled in debug mode.");
|
||||
# endif
|
||||
|
||||
const int num_tests = 7;
|
||||
void *align_ptr;
|
||||
for (int i=0; i<num_tests; i++)
|
||||
{
|
||||
align_ptr = ll_aligned_malloc_16(sizeof(MyVector4a));
|
||||
ensure("ll_aligned_malloc_16 failed", is_aligned(align_ptr,16));
|
||||
|
||||
align_ptr = ll_aligned_realloc_16(align_ptr,2*sizeof(MyVector4a));
|
||||
ensure("ll_aligned_realloc_16 failed", is_aligned(align_ptr,16));
|
||||
|
||||
ll_aligned_free_16(align_ptr);
|
||||
|
||||
align_ptr = ll_aligned_malloc_32(sizeof(MyVector4a));
|
||||
ensure("ll_aligned_malloc_32 failed", is_aligned(align_ptr,32));
|
||||
ll_aligned_free_32(align_ptr);
|
||||
}
|
||||
}
|
||||
|
||||
// In-place allocation of objects and arrays.
|
||||
template<> template<>
|
||||
void alignment_test_object_t::test<2>()
|
||||
{
|
||||
MyVector4a vec1;
|
||||
ensure("LLAlignment vec1 unaligned", is_aligned(&vec1,16));
|
||||
|
||||
MyVector4a veca[12];
|
||||
ensure("LLAlignment veca unaligned", is_aligned(veca,16));
|
||||
}
|
||||
|
||||
// Heap allocation of objects and arrays.
|
||||
template<> template<>
|
||||
void alignment_test_object_t::test<3>()
|
||||
{
|
||||
# ifdef LL_DEBUG
|
||||
skip("This test fails on Windows when compiled in debug mode.");
|
||||
# endif
|
||||
|
||||
const int ARR_SIZE = 7;
|
||||
for(int i=0; i<ARR_SIZE; i++)
|
||||
{
|
||||
MyVector4a *vecp = new MyVector4a;
|
||||
ensure("LLAlignment vecp unaligned", is_aligned(vecp,16));
|
||||
delete vecp;
|
||||
}
|
||||
|
||||
MyVector4a *veca = new MyVector4a[ARR_SIZE];
|
||||
ensure("LLAligment veca base", is_aligned(veca,16));
|
||||
for(int i=0; i<ARR_SIZE; i++)
|
||||
{
|
||||
std::cout << "veca[" << i << "]" << std::endl;
|
||||
ensure("LLAlignment veca member unaligned", is_aligned(&veca[i],16));
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -306,6 +306,8 @@ LLIOPipe::EStatus LLURLRequest::handleError(
|
|||
}
|
||||
|
||||
static LLFastTimer::DeclareTimer FTM_PROCESS_URL_REQUEST("URL Request");
|
||||
static LLFastTimer::DeclareTimer FTM_PROCESS_URL_REQUEST_GET_RESULT("Get Result");
|
||||
static LLFastTimer::DeclareTimer FTM_URL_PERFORM("Perform");
|
||||
|
||||
// virtual
|
||||
LLIOPipe::EStatus LLURLRequest::process_impl(
|
||||
|
|
@ -375,7 +377,6 @@ LLIOPipe::EStatus LLURLRequest::process_impl(
|
|||
{
|
||||
PUMP_DEBUG;
|
||||
LLIOPipe::EStatus status = STATUS_BREAK;
|
||||
static LLFastTimer::DeclareTimer FTM_URL_PERFORM("Perform");
|
||||
{
|
||||
LLFastTimer t(FTM_URL_PERFORM);
|
||||
if(!mDetail->mCurlRequest->wait())
|
||||
|
|
@ -388,8 +389,6 @@ LLIOPipe::EStatus LLURLRequest::process_impl(
|
|||
{
|
||||
CURLcode result;
|
||||
|
||||
static LLFastTimer::DeclareTimer FTM_PROCESS_URL_REQUEST_GET_RESULT("Get Result");
|
||||
|
||||
bool newmsg = false;
|
||||
{
|
||||
LLFastTimer t(FTM_PROCESS_URL_REQUEST_GET_RESULT);
|
||||
|
|
|
|||
|
|
@ -258,6 +258,7 @@ namespace tut
|
|||
void HTTPClientTestObject::test<1>()
|
||||
{
|
||||
LLHTTPClient::get(local_server, newResult());
|
||||
|
||||
runThePump();
|
||||
ensureStatusOK();
|
||||
ensure("result object wasn't destroyed", mResultDeleted);
|
||||
|
|
|
|||
|
|
@ -1026,7 +1026,8 @@ void LLModel::setVolumeFaceData(
|
|||
|
||||
if (tc.get())
|
||||
{
|
||||
LLVector4a::memcpyNonAliased16((F32*) face.mTexCoords, (F32*) tc.get(), num_verts*2*sizeof(F32));
|
||||
U32 tex_size = (num_verts*2*sizeof(F32)+0xF)&~0xF;
|
||||
LLVector4a::memcpyNonAliased16((F32*) face.mTexCoords, (F32*) tc.get(), tex_size);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
|
|||
|
|
@ -237,9 +237,11 @@ S32 LLImageGL::dataFormatComponents(S32 dataformat)
|
|||
|
||||
//----------------------------------------------------------------------------
|
||||
|
||||
static LLFastTimer::DeclareTimer FTM_IMAGE_UPDATE_STATS("Image Stats");
|
||||
// static
|
||||
void LLImageGL::updateStats(F32 current_time)
|
||||
{
|
||||
LLFastTimer t(FTM_IMAGE_UPDATE_STATS);
|
||||
sLastFrameTime = current_time;
|
||||
sBoundTextureMemoryInBytes = sCurBoundTextureMemory;
|
||||
sCurBoundTextureMemory = 0;
|
||||
|
|
|
|||
|
|
@ -69,6 +69,42 @@ LLRenderTarget::~LLRenderTarget()
|
|||
release();
|
||||
}
|
||||
|
||||
void LLRenderTarget::resize(U32 resx, U32 resy, U32 color_fmt)
|
||||
{
|
||||
//for accounting, get the number of pixels added/subtracted
|
||||
S32 pix_diff = (resx*resy)-(mResX*mResY);
|
||||
|
||||
mResX = resx;
|
||||
mResY = resy;
|
||||
|
||||
for (U32 i = 0; i < mTex.size(); ++i)
|
||||
{ //resize color attachments
|
||||
gGL.getTexUnit(0)->bindManual(mUsage, mTex[i]);
|
||||
LLImageGL::setManualImage(LLTexUnit::getInternalType(mUsage), 0, color_fmt, mResX, mResY, GL_RGBA, GL_UNSIGNED_BYTE, NULL, false);
|
||||
sBytesAllocated += pix_diff*4;
|
||||
}
|
||||
|
||||
if (mDepth)
|
||||
{ //resize depth attachment
|
||||
if (mStencil)
|
||||
{
|
||||
//use render buffers where stencil buffers are in play
|
||||
glBindRenderbuffer(GL_RENDERBUFFER, mDepth);
|
||||
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, mResX, mResY);
|
||||
glBindRenderbuffer(GL_RENDERBUFFER, 0);
|
||||
}
|
||||
else
|
||||
{
|
||||
gGL.getTexUnit(0)->bindManual(mUsage, mDepth);
|
||||
U32 internal_type = LLTexUnit::getInternalType(mUsage);
|
||||
LLImageGL::setManualImage(internal_type, 0, GL_DEPTH_COMPONENT24, mResX, mResY, GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, NULL, false);
|
||||
}
|
||||
|
||||
sBytesAllocated += pix_diff*4;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
bool LLRenderTarget::allocate(U32 resx, U32 resy, U32 color_fmt, bool depth, bool stencil, LLTexUnit::eTextureType usage, bool use_fbo, S32 samples)
|
||||
{
|
||||
stop_glerror();
|
||||
|
|
|
|||
|
|
@ -57,8 +57,6 @@
|
|||
|
||||
*/
|
||||
|
||||
class LLMultisampleBuffer;
|
||||
|
||||
class LLRenderTarget
|
||||
{
|
||||
public:
|
||||
|
|
@ -74,6 +72,12 @@ public:
|
|||
//multiple calls will release previously allocated resources
|
||||
bool allocate(U32 resx, U32 resy, U32 color_fmt, bool depth, bool stencil, LLTexUnit::eTextureType usage = LLTexUnit::TT_TEXTURE, bool use_fbo = false, S32 samples = 0);
|
||||
|
||||
//resize existing attachments to use new resolution and color format
|
||||
// CAUTION: if the GL runs out of memory attempting to resize, this render target will be undefined
|
||||
// DO NOT use for screen space buffers or for scratch space for an image that might be uploaded
|
||||
// DO use for render targets that resize often and aren't likely to ruin someone's day if they break
|
||||
void resize(U32 resx, U32 resy, U32 color_fmt);
|
||||
|
||||
//add color buffer attachment
|
||||
//limit of 4 color attachments per render target
|
||||
bool addColorAttachment(U32 color_fmt);
|
||||
|
|
|
|||
|
|
@ -38,10 +38,6 @@
|
|||
#include "llglslshader.h"
|
||||
#include "llmemory.h"
|
||||
|
||||
#if LL_DARWIN
|
||||
#define LL_VBO_POOLING 1
|
||||
#else
|
||||
#endif
|
||||
//Next Highest Power Of Two
|
||||
//helper function, returns first number > v that is a power of 2, or v if v is already a power of 2
|
||||
U32 nhpo2(U32 v)
|
||||
|
|
@ -294,6 +290,8 @@ void LLVBOPool::seedPool()
|
|||
}
|
||||
|
||||
|
||||
|
||||
|
||||
void LLVBOPool::cleanup()
|
||||
{
|
||||
U32 size = LL_VBO_BLOCK_SIZE;
|
||||
|
|
|
|||
|
|
@ -626,6 +626,7 @@ void LLLineEditor::onSpellCheckSettingsChange()
|
|||
mMisspellRanges.clear();
|
||||
mSpellCheckStart = mSpellCheckEnd = -1;
|
||||
}
|
||||
|
||||
BOOL LLLineEditor::handleDoubleClick(S32 x, S32 y, MASK mask)
|
||||
{
|
||||
setFocus( TRUE );
|
||||
|
|
|
|||
|
|
@ -3023,6 +3023,7 @@ void LLWindowMacOSX::initCursors()
|
|||
initPixmapCursor(UI_CURSOR_SIZENESW, 10, 10);
|
||||
initPixmapCursor(UI_CURSOR_SIZEWE, 10, 10);
|
||||
initPixmapCursor(UI_CURSOR_SIZENS, 10, 10);
|
||||
|
||||
}
|
||||
|
||||
void LLWindowMacOSX::captureMouse()
|
||||
|
|
|
|||
|
|
@ -51,7 +51,10 @@ include(Growl)
|
|||
if( LLPHYSICSEXTENSIONS_SRC_DIR )
|
||||
# </FS:ND>
|
||||
|
||||
add_subdirectory(${LLPHYSICSEXTENSIONS_SRC_DIR} llphysicsextensions)
|
||||
if (NOT HAVOK_TPV)
|
||||
# When using HAVOK_TPV, the library is precompiled, so no need for this
|
||||
add_subdirectory(${LLPHYSICSEXTENSIONS_SRC_DIR} llphysicsextensions)
|
||||
endif (NOT HAVOK_TPV)
|
||||
|
||||
# <FS:ND>
|
||||
endif( LLPHYSICSEXTENSIONS_SRC_DIR )
|
||||
|
|
@ -1750,9 +1753,7 @@ set(PACKAGE ON CACHE BOOL
|
|||
if (WINDOWS)
|
||||
set_target_properties(${VIEWER_BINARY_NAME}
|
||||
PROPERTIES
|
||||
# *TODO -reenable this once we get server usage sorted out
|
||||
#LINK_FLAGS "/debug /NODEFAULTLIB:LIBCMT /SUBSYSTEM:WINDOWS /INCLUDE:\"__tcmalloc\""
|
||||
LINK_FLAGS "/debug /NODEFAULTLIB:LIBCMT /SUBSYSTEM:WINDOWS /INCLUDE:__tcmalloc "
|
||||
LINK_FLAGS "/debug /NODEFAULTLIB:LIBCMT /SUBSYSTEM:WINDOWS ${TCMALLOC_LINK_FLAGS}"
|
||||
LINK_FLAGS_DEBUG "/NODEFAULTLIB:\"LIBCMT;LIBCMTD;MSVCRT\" /INCREMENTAL:NO"
|
||||
LINK_FLAGS_RELEASE "/FORCE:MULTIPLE /MAP\"secondlife-bin.MAP\" /OPT:REF"
|
||||
)
|
||||
|
|
@ -1771,7 +1772,7 @@ if (WINDOWS)
|
|||
# In the meantime, if you have any ideas on how to easily maintain one list, either here or in viewer_manifest.py
|
||||
# and have the build deps get tracked *please* tell me about it.
|
||||
|
||||
if(USE_GOOGLE_PERFTOOLS)
|
||||
if(USE_TCMALLOC)
|
||||
# Configure a var for tcmalloc location, if used.
|
||||
# Note the need to specify multiple names explicitly.
|
||||
set(GOOGLE_PERF_TOOLS_SOURCE
|
||||
|
|
@ -1779,7 +1780,7 @@ if (WINDOWS)
|
|||
${SHARED_LIB_STAGING_DIR}/RelWithDebInfo/libtcmalloc_minimal.dll
|
||||
${SHARED_LIB_STAGING_DIR}/Debug/libtcmalloc_minimal-debug.dll
|
||||
)
|
||||
endif(USE_GOOGLE_PERFTOOLS)
|
||||
endif(USE_TCMALLOC)
|
||||
|
||||
|
||||
set(COPY_INPUT_DEPENDENCIES
|
||||
|
|
|
|||
|
|
@ -6979,7 +6979,7 @@
|
|||
<key>LoginLocation</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Login location ('last', 'home')</string>
|
||||
<string>Default Login location ('last', 'home') preference</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
|
|
@ -8172,7 +8172,7 @@
|
|||
<key>NextLoginLocation</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Location to log into by default.</string>
|
||||
<string>Location to log into for this session - set from command line or the login panel, cleared following a successfull login.</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
|
|
@ -14817,6 +14817,17 @@ Change of this parameter will affect the layout of buttons in notification toast
|
|||
<string>Disabling this option might lead to severely degraded viewer performance and increased rezzing time.</string>
|
||||
</map>
|
||||
<key>RenderSynchronousOcclusion</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Don't let occlusion queries get more than one frame behind (block until they complete).</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>Boolean</string>
|
||||
<key>Value</key>
|
||||
<integer>1</integer>
|
||||
</map>
|
||||
<key>RenderSynchronousOcclusion</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Don't let occlusion queries get more than one frame behind (block until they complete).</string>
|
||||
|
|
@ -14882,6 +14893,28 @@ Change of this parameter will affect the layout of buttons in notification toast
|
|||
<key>Value</key>
|
||||
<string>English (United States),Second Life Glossary</string>
|
||||
</map>
|
||||
<key>SpellCheck</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Enable spellchecking on line and text editors</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>Boolean</string>
|
||||
<key>Value</key>
|
||||
<integer>1</integer>
|
||||
</map>
|
||||
<key>SpellCheckDictionary</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Current primary and secondary dictionaries used for spell checking</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>String</string>
|
||||
<key>Value</key>
|
||||
<string>English (United States),Second Life Glossary</string>
|
||||
</map>
|
||||
<key>UseNewWalkRun</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
|
|
|
|||
|
|
@ -3061,7 +3061,6 @@ void LLAgent::sendMaturityPreferenceToServer(U8 pPreferredMaturity)
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
BOOL LLAgent::getAdminOverride() const
|
||||
{
|
||||
return mAgentAccess->getAdminOverride();
|
||||
|
|
|
|||
|
|
@ -89,6 +89,7 @@
|
|||
#include "lllogininstance.h"
|
||||
#include "llprogressview.h"
|
||||
#include "llvocache.h"
|
||||
#include "llvopartgroup.h"
|
||||
// [RLVa:KB] - Checked: 2010-05-03 (RLVa-1.2.0g)
|
||||
#include "rlvhandler.h"
|
||||
// [/RLVa:KB]
|
||||
|
|
@ -726,6 +727,9 @@ bool LLAppViewer::init()
|
|||
// initialize SSE options
|
||||
LLVector4a::initClass();
|
||||
|
||||
//initialize particle index pool
|
||||
LLVOPartGroup::initClass();
|
||||
|
||||
// Need to do this initialization before we do anything else, since anything
|
||||
// that touches files should really go through the lldir API
|
||||
gDirUtilp->initAppDirs("Firestorm");
|
||||
|
|
@ -2811,6 +2815,19 @@ bool LLAppViewer::initConfiguration()
|
|||
}
|
||||
}
|
||||
|
||||
if (gSavedSettings.getBOOL("SpellCheck"))
|
||||
{
|
||||
std::list<std::string> dict_list;
|
||||
std::string dict_setting = gSavedSettings.getString("SpellCheckDictionary");
|
||||
boost::split(dict_list, dict_setting, boost::is_any_of(std::string(",")));
|
||||
if (!dict_list.empty())
|
||||
{
|
||||
LLSpellChecker::setUseSpellCheck(dict_list.front());
|
||||
dict_list.pop_front();
|
||||
LLSpellChecker::instance().setSecondaryDictionaries(dict_list);
|
||||
}
|
||||
}
|
||||
|
||||
mYieldTime = gSavedSettings.getS32("YieldTime");
|
||||
|
||||
// Read skin/branding settings if specified.
|
||||
|
|
@ -2970,16 +2987,31 @@ bool LLAppViewer::initConfiguration()
|
|||
}
|
||||
}
|
||||
|
||||
// need to do this here - need to have initialized global settings first
|
||||
// NextLoginLocation is set from the command line option
|
||||
std::string nextLoginLocation = gSavedSettings.getString( "NextLoginLocation" );
|
||||
if ( !nextLoginLocation.empty() )
|
||||
{
|
||||
// <FS:AW crash on startup>
|
||||
// also here LLSLURLs are not available at this point of startup
|
||||
// LLStartUp::setStartSLURL(LLSLURL(nextLoginLocation));
|
||||
LLStartUp::setStartSLURLString(nextLoginLocation);
|
||||
// </FS:AW crash on startup>
|
||||
};
|
||||
LL_DEBUGS("AppInit")<<"set start from NextLoginLocation: "<<nextLoginLocation<<LL_ENDL;
|
||||
LLStartUp::setStartSLURL(LLSLURL(nextLoginLocation));
|
||||
}
|
||||
else if ( ( clp.hasOption("login") || clp.hasOption("autologin"))
|
||||
&& !clp.hasOption("url")
|
||||
&& !clp.hasOption("slurl"))
|
||||
{
|
||||
// If automatic login from command line with --login switch
|
||||
// init StartSLURL location.
|
||||
std::string start_slurl_setting = gSavedSettings.getString("LoginLocation");
|
||||
LL_DEBUGS("AppInit") << "start slurl setting '" << start_slurl_setting << "'" << LL_ENDL;
|
||||
// <FS:AW crash on startup>
|
||||
// also here LLSLURLs are not available at this point of startup
|
||||
// LLStartUp::setStartSLURL(LLSLURL(start_slurl_setting));
|
||||
LLStartUp::setStartSLURLString(start_slurl_setting);
|
||||
// </FS:AW crash on startup>
|
||||
}
|
||||
else
|
||||
{
|
||||
// the login location will be set by the login panel (see LLPanelLogin)
|
||||
}
|
||||
|
||||
gLastRunVersion = gSavedSettings.getString("LastRunVersion");
|
||||
|
||||
|
|
@ -5447,7 +5479,7 @@ void LLAppViewer::handleLoginComplete()
|
|||
|
||||
// we logged in successfully, so save settings on logout
|
||||
lldebugs << "Login successful, per account settings will be saved on logout." << llendl;
|
||||
mSavePerAccountSettings=TRUE;
|
||||
mSavePerAccountSettings=true;
|
||||
}
|
||||
|
||||
void LLAppViewer::launchUpdater()
|
||||
|
|
|
|||
|
|
@ -130,6 +130,8 @@ int APIENTRY WINMAIN(HINSTANCE hInstance,
|
|||
// This results in a 2-3x improvement in opening a new Inventory window (which uses a large numebr of allocations)
|
||||
// Note: This won't work when running from the debugger unless the _NO_DEBUG_HEAP environment variable is set to 1
|
||||
|
||||
// Enable to get mem debugging within visual studio.
|
||||
//_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
|
||||
_CrtSetDbgFlag(0); // default, just making explicit
|
||||
|
||||
ULONG ulEnableLFH = 2;
|
||||
|
|
|
|||
|
|
@ -57,6 +57,8 @@ const F32 MIN_SHADOW_CASTER_RADIUS = 2.0f;
|
|||
|
||||
static LLFastTimer::DeclareTimer FTM_CULL_REBOUND("Cull Rebound");
|
||||
|
||||
extern bool gShiftFrame;
|
||||
|
||||
|
||||
////////////////////////
|
||||
//
|
||||
|
|
@ -108,6 +110,8 @@ void LLDrawable::init()
|
|||
|
||||
mGeneration = -1;
|
||||
mBinRadius = 1.f;
|
||||
mBinIndex = -1;
|
||||
|
||||
mSpatialBridge = NULL;
|
||||
}
|
||||
|
||||
|
|
@ -714,6 +718,11 @@ void LLDrawable::updateDistance(LLCamera& camera, bool force_update)
|
|||
return;
|
||||
}
|
||||
|
||||
if (gShiftFrame)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
//switch LOD with the spatial group to avoid artifacts
|
||||
//LLSpatialGroup* sg = getSpatialGroup();
|
||||
|
||||
|
|
@ -811,14 +820,19 @@ void LLDrawable::shiftPos(const LLVector4a &shift_vector)
|
|||
mXform.setPosition(mVObjp->getPositionAgent());
|
||||
}
|
||||
|
||||
mXform.setRotation(mVObjp->getRotation());
|
||||
mXform.setScale(1,1,1);
|
||||
mXform.updateMatrix();
|
||||
|
||||
if (isStatic())
|
||||
{
|
||||
LLVOVolume* volume = getVOVolume();
|
||||
if (!volume)
|
||||
|
||||
bool rebuild = (!volume &&
|
||||
getRenderType() != LLPipeline::RENDER_TYPE_TREE &&
|
||||
getRenderType() != LLPipeline::RENDER_TYPE_TERRAIN &&
|
||||
getRenderType() != LLPipeline::RENDER_TYPE_SKY &&
|
||||
getRenderType() != LLPipeline::RENDER_TYPE_GROUND);
|
||||
|
||||
if (rebuild)
|
||||
{
|
||||
gPipeline.markRebuild(this, LLDrawable::REBUILD_ALL, TRUE);
|
||||
}
|
||||
|
|
@ -832,7 +846,7 @@ void LLDrawable::shiftPos(const LLVector4a &shift_vector)
|
|||
facep->mExtents[0].add(shift_vector);
|
||||
facep->mExtents[1].add(shift_vector);
|
||||
|
||||
if (!volume && facep->hasGeometry())
|
||||
if (rebuild && facep->hasGeometry())
|
||||
{
|
||||
facep->clearVertexBuffer();
|
||||
}
|
||||
|
|
@ -943,6 +957,12 @@ void LLDrawable::updateUVMinMax()
|
|||
{
|
||||
}
|
||||
|
||||
LLSpatialGroup* LLDrawable::getSpatialGroup() const
|
||||
{
|
||||
llassert((mSpatialGroupp == NULL) ? getBinIndex() == -1 : getBinIndex() != -1);
|
||||
return mSpatialGroupp;
|
||||
}
|
||||
|
||||
void LLDrawable::setSpatialGroup(LLSpatialGroup *groupp)
|
||||
{
|
||||
/*if (mSpatialGroupp && (groupp != mSpatialGroupp))
|
||||
|
|
@ -965,6 +985,8 @@ void LLDrawable::setSpatialGroup(LLSpatialGroup *groupp)
|
|||
}
|
||||
|
||||
mSpatialGroupp = groupp;
|
||||
|
||||
llassert((mSpatialGroupp == NULL) ? getBinIndex() == -1 : getBinIndex() != -1);
|
||||
}
|
||||
|
||||
LLSpatialPartition* LLDrawable::getSpatialPartition()
|
||||
|
|
@ -1087,6 +1109,8 @@ LLSpatialBridge::LLSpatialBridge(LLDrawable* root, BOOL render_by_group, U32 dat
|
|||
mDrawable = root;
|
||||
root->setSpatialBridge(this);
|
||||
|
||||
mBinIndex = -1;
|
||||
|
||||
mRenderType = mDrawable->mRenderType;
|
||||
mDrawableType = mDrawable->mRenderType;
|
||||
|
||||
|
|
@ -1390,6 +1414,11 @@ void LLSpatialBridge::updateDistance(LLCamera& camera_in, bool force_update)
|
|||
markDead();
|
||||
return;
|
||||
}
|
||||
|
||||
if (gShiftFrame)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (mDrawable->getVObj())
|
||||
{
|
||||
|
|
@ -1468,7 +1497,13 @@ void LLSpatialBridge::cleanupReferences()
|
|||
LLDrawable::cleanupReferences();
|
||||
if (mDrawable)
|
||||
{
|
||||
mDrawable->setSpatialGroup(NULL);
|
||||
LLSpatialGroup* group = mDrawable->getSpatialGroup();
|
||||
if (group)
|
||||
{
|
||||
group->mOctreeNode->remove(mDrawable);
|
||||
mDrawable->setSpatialGroup(NULL);
|
||||
}
|
||||
|
||||
if (mDrawable->getVObj())
|
||||
{
|
||||
LLViewerObject::const_child_list_t& child_list = mDrawable->getVObj()->getChildren();
|
||||
|
|
@ -1479,7 +1514,12 @@ void LLSpatialBridge::cleanupReferences()
|
|||
LLDrawable* drawable = child->mDrawable;
|
||||
if (drawable)
|
||||
{
|
||||
drawable->setSpatialGroup(NULL);
|
||||
LLSpatialGroup* group = drawable->getSpatialGroup();
|
||||
if (group)
|
||||
{
|
||||
group->mOctreeNode->remove(drawable);
|
||||
drawable->setSpatialGroup(NULL);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -59,6 +59,7 @@ class LLViewerTexture;
|
|||
const U32 SILHOUETTE_HIGHLIGHT = 0;
|
||||
|
||||
// All data for new renderer goes into this class.
|
||||
LL_ALIGN_PREFIX(16)
|
||||
class LLDrawable : public LLRefCount
|
||||
{
|
||||
public:
|
||||
|
|
@ -75,6 +76,16 @@ public:
|
|||
|
||||
static void initClass();
|
||||
|
||||
void* operator new(size_t size)
|
||||
{
|
||||
return ll_aligned_malloc_16(size);
|
||||
}
|
||||
|
||||
void operator delete(void* ptr)
|
||||
{
|
||||
ll_aligned_free_16(ptr);
|
||||
}
|
||||
|
||||
LLDrawable() { init(); }
|
||||
MEM_TYPE_NEW(LLMemType::MTYPE_DRAWABLE);
|
||||
|
||||
|
|
@ -109,6 +120,9 @@ public:
|
|||
F32 getIntensity() const { return llmin(mXform.getScale().mV[0], 4.f); }
|
||||
S32 getLOD() const { return mVObjp ? mVObjp->getLOD() : 1; }
|
||||
F32 getBinRadius() const { return mBinRadius; }
|
||||
S32 getBinIndex() const { return mBinIndex; }
|
||||
void setBinIndex(S32 index) const { mBinIndex = index; }
|
||||
|
||||
void getMinMax(LLVector3& min,LLVector3& max) const { mXform.getMinMax(min,max); }
|
||||
LLXformMatrix* getXform() { return &mXform; }
|
||||
|
||||
|
|
@ -194,7 +208,7 @@ public:
|
|||
S32 findReferences(LLDrawable *drawablep); // Not const because of @#$! iterators...
|
||||
|
||||
void setSpatialGroup(LLSpatialGroup *groupp);
|
||||
LLSpatialGroup *getSpatialGroup() const { return mSpatialGroupp; }
|
||||
LLSpatialGroup *getSpatialGroup() const;
|
||||
LLSpatialPartition* getSpatialPartition();
|
||||
|
||||
// Statics
|
||||
|
|
@ -281,8 +295,8 @@ public:
|
|||
} EDrawableFlags;
|
||||
|
||||
private: //aligned members
|
||||
LLVector4a mExtents[2];
|
||||
LLVector4a mPositionGroup;
|
||||
LL_ALIGN_16(LLVector4a mExtents[2]);
|
||||
LL_ALIGN_16(LLVector4a mPositionGroup);
|
||||
|
||||
public:
|
||||
LLXformMatrix mXform;
|
||||
|
|
@ -315,6 +329,7 @@ private:
|
|||
mutable U32 mVisible;
|
||||
F32 mRadius;
|
||||
F32 mBinRadius;
|
||||
mutable S32 mBinIndex;
|
||||
S32 mGeneration;
|
||||
|
||||
LLVector3 mCurrentScale;
|
||||
|
|
@ -323,7 +338,7 @@ private:
|
|||
|
||||
static U32 sNumZombieDrawables;
|
||||
static LLDynamicArrayPtr<LLPointer<LLDrawable> > sDeadList;
|
||||
};
|
||||
} LL_ALIGN_POSTFIX(16);
|
||||
|
||||
|
||||
inline LLFace* LLDrawable::getFace(const S32 i) const
|
||||
|
|
|
|||
|
|
@ -254,48 +254,6 @@ void LLFacePool::dirtyTextures(const std::set<LLViewerFetchedTexture*>& textures
|
|||
{
|
||||
}
|
||||
|
||||
// static
|
||||
S32 LLFacePool::drawLoop(face_array_t& face_list)
|
||||
{
|
||||
S32 res = 0;
|
||||
if (!face_list.empty())
|
||||
{
|
||||
for (std::vector<LLFace*>::iterator iter = face_list.begin();
|
||||
iter != face_list.end(); iter++)
|
||||
{
|
||||
LLFace *facep = *iter;
|
||||
res += facep->renderIndexed();
|
||||
}
|
||||
}
|
||||
return res;
|
||||
}
|
||||
|
||||
// static
|
||||
S32 LLFacePool::drawLoopSetTex(face_array_t& face_list, S32 stage)
|
||||
{
|
||||
S32 res = 0;
|
||||
if (!face_list.empty())
|
||||
{
|
||||
for (std::vector<LLFace*>::iterator iter = face_list.begin();
|
||||
iter != face_list.end(); iter++)
|
||||
{
|
||||
LLFace *facep = *iter;
|
||||
gGL.getTexUnit(stage)->bind(facep->getTexture(), TRUE) ;
|
||||
gGL.getTexUnit(0)->activate();
|
||||
res += facep->renderIndexed();
|
||||
}
|
||||
}
|
||||
return res;
|
||||
}
|
||||
|
||||
void LLFacePool::drawLoop()
|
||||
{
|
||||
if (!mDrawFace.empty())
|
||||
{
|
||||
drawLoop(mDrawFace);
|
||||
}
|
||||
}
|
||||
|
||||
void LLFacePool::enqueue(LLFace* facep)
|
||||
{
|
||||
mDrawFace.push_back(facep);
|
||||
|
|
@ -443,7 +401,7 @@ void LLRenderPass::renderTexture(U32 type, U32 mask)
|
|||
|
||||
void LLRenderPass::pushBatches(U32 type, U32 mask, BOOL texture, BOOL batch_textures)
|
||||
{
|
||||
for (LLCullResult::drawinfo_list_t::iterator i = gPipeline.beginRenderMap(type); i != gPipeline.endRenderMap(type); ++i)
|
||||
for (LLCullResult::drawinfo_iterator i = gPipeline.beginRenderMap(type); i != gPipeline.endRenderMap(type); ++i)
|
||||
{
|
||||
LLDrawInfo* pparams = *i;
|
||||
if (pparams)
|
||||
|
|
|
|||
|
|
@ -190,10 +190,6 @@ public:
|
|||
|
||||
void buildEdges();
|
||||
|
||||
static S32 drawLoop(face_array_t& face_list);
|
||||
static S32 drawLoopSetTex(face_array_t& face_list, S32 stage);
|
||||
void drawLoop();
|
||||
|
||||
void addFaceReference(LLFace *facep);
|
||||
void removeFaceReference(LLFace *facep);
|
||||
|
||||
|
|
|
|||
|
|
@ -348,7 +348,7 @@ void LLDrawPoolAlpha::render(S32 pass)
|
|||
|
||||
void LLDrawPoolAlpha::renderAlphaHighlight(U32 mask)
|
||||
{
|
||||
for (LLCullResult::sg_list_t::iterator i = gPipeline.beginAlphaGroups(); i != gPipeline.endAlphaGroups(); ++i)
|
||||
for (LLCullResult::sg_iterator i = gPipeline.beginAlphaGroups(); i != gPipeline.endAlphaGroups(); ++i)
|
||||
{
|
||||
LLSpatialGroup* group = *i;
|
||||
if (group->mSpatialPartition->mRenderByGroup &&
|
||||
|
|
@ -385,7 +385,7 @@ void LLDrawPoolAlpha::renderAlpha(U32 mask)
|
|||
|
||||
BOOL use_shaders = gPipeline.canUseVertexShaders();
|
||||
|
||||
for (LLCullResult::sg_list_t::iterator i = gPipeline.beginAlphaGroups(); i != gPipeline.endAlphaGroups(); ++i)
|
||||
for (LLCullResult::sg_iterator i = gPipeline.beginAlphaGroups(); i != gPipeline.endAlphaGroups(); ++i)
|
||||
{
|
||||
LLSpatialGroup* group = *i;
|
||||
llassert(group);
|
||||
|
|
@ -411,6 +411,18 @@ void LLDrawPoolAlpha::renderAlpha(U32 mask)
|
|||
continue;
|
||||
}
|
||||
|
||||
if ((params.mVertexBuffer->getTypeMask() & mask) != mask)
|
||||
{ //FIXME!
|
||||
llwarns << "Missing required components, skipping render batch." << llendl;
|
||||
continue;
|
||||
}
|
||||
|
||||
if ((params.mVertexBuffer->getTypeMask() & mask) != mask)
|
||||
{ //FIXME!
|
||||
llwarns << "Missing required components, skipping render batch." << llendl;
|
||||
continue;
|
||||
}
|
||||
|
||||
LLRenderPass::applyModelMatrix(params);
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -1036,9 +1036,13 @@ void LLDrawPoolAvatar::endDeferredSkinned()
|
|||
gGL.getTexUnit(0)->activate();
|
||||
}
|
||||
|
||||
static LLFastTimer::DeclareTimer FTM_RENDER_AVATARS("renderAvatars");
|
||||
|
||||
|
||||
void LLDrawPoolAvatar::renderAvatars(LLVOAvatar* single_avatar, S32 pass)
|
||||
{
|
||||
LLFastTimer t(FTM_RENDER_AVATARS);
|
||||
|
||||
if (pass == -1)
|
||||
{
|
||||
for (S32 i = 1; i < getNumPasses(); i++)
|
||||
|
|
@ -1195,15 +1199,6 @@ void LLDrawPoolAvatar::renderAvatars(LLVOAvatar* single_avatar, S32 pass)
|
|||
|
||||
if (pass >= 7 && pass < 9)
|
||||
{
|
||||
LLGLEnable blend(GL_BLEND);
|
||||
|
||||
gGL.setColorMask(true, true);
|
||||
gGL.blendFunc(LLRender::BF_SOURCE_ALPHA,
|
||||
LLRender::BF_ONE_MINUS_SOURCE_ALPHA,
|
||||
LLRender::BF_ZERO,
|
||||
LLRender::BF_ONE_MINUS_SOURCE_ALPHA);
|
||||
|
||||
|
||||
if (pass == 7)
|
||||
{
|
||||
renderRiggedAlpha(avatarp);
|
||||
|
|
@ -1219,20 +1214,8 @@ void LLDrawPoolAvatar::renderAvatars(LLVOAvatar* single_avatar, S32 pass)
|
|||
|
||||
if (pass == 9)
|
||||
{
|
||||
LLGLEnable blend(GL_BLEND);
|
||||
LLGLDisable test(GL_ALPHA_TEST);
|
||||
gGL.flush();
|
||||
|
||||
LLGLEnable polyOffset(GL_POLYGON_OFFSET_FILL);
|
||||
glPolygonOffset(-1.0f, -1.0f);
|
||||
gGL.setSceneBlendType(LLRender::BT_ADD);
|
||||
|
||||
LLGLDepthTest depth(GL_TRUE, GL_FALSE);
|
||||
gGL.setColorMask(false, true);
|
||||
|
||||
renderRiggedGlow(avatarp);
|
||||
gGL.setColorMask(true, false);
|
||||
gGL.setSceneBlendType(LLRender::BT_ALPHA);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
@ -1430,7 +1413,7 @@ void LLDrawPoolAvatar::updateRiggedFaceVertexBuffer(LLVOAvatar* avatar, LLFace*
|
|||
|
||||
void LLDrawPoolAvatar::renderRigged(LLVOAvatar* avatar, U32 type, bool glow)
|
||||
{
|
||||
if (avatar->isSelf() && !gAgent.needsRenderAvatar() || !gMeshRepo.meshRezEnabled())
|
||||
if (avatar->isSelf() && !gAgent.needsRenderAvatar())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
|
@ -1559,8 +1542,12 @@ void LLDrawPoolAvatar::renderDeferredRiggedBump(LLVOAvatar* avatar)
|
|||
renderRigged(avatar, RIGGED_DEFERRED_BUMP);
|
||||
}
|
||||
|
||||
static LLFastTimer::DeclareTimer FTM_RIGGED_VBO("Rigged VBO");
|
||||
|
||||
void LLDrawPoolAvatar::updateRiggedVertexBuffers(LLVOAvatar* avatar)
|
||||
{
|
||||
LLFastTimer t(FTM_RIGGED_VBO);
|
||||
|
||||
//update rigged vertex buffers
|
||||
for (U32 type = 0; type < NUM_RIGGED_PASSES; ++type)
|
||||
{
|
||||
|
|
@ -1632,17 +1619,56 @@ void LLDrawPoolAvatar::renderRiggedFullbrightShiny(LLVOAvatar* avatar)
|
|||
|
||||
void LLDrawPoolAvatar::renderRiggedAlpha(LLVOAvatar* avatar)
|
||||
{
|
||||
renderRigged(avatar, RIGGED_ALPHA);
|
||||
if (!mRiggedFace[RIGGED_ALPHA].empty())
|
||||
{
|
||||
LLGLEnable blend(GL_BLEND);
|
||||
|
||||
gGL.setColorMask(true, true);
|
||||
gGL.blendFunc(LLRender::BF_SOURCE_ALPHA,
|
||||
LLRender::BF_ONE_MINUS_SOURCE_ALPHA,
|
||||
LLRender::BF_ZERO,
|
||||
LLRender::BF_ONE_MINUS_SOURCE_ALPHA);
|
||||
|
||||
renderRigged(avatar, RIGGED_ALPHA);
|
||||
}
|
||||
}
|
||||
|
||||
void LLDrawPoolAvatar::renderRiggedFullbrightAlpha(LLVOAvatar* avatar)
|
||||
{
|
||||
renderRigged(avatar, RIGGED_FULLBRIGHT_ALPHA);
|
||||
if (!mRiggedFace[RIGGED_FULLBRIGHT_ALPHA].empty())
|
||||
{
|
||||
LLGLEnable blend(GL_BLEND);
|
||||
|
||||
gGL.setColorMask(true, true);
|
||||
gGL.blendFunc(LLRender::BF_SOURCE_ALPHA,
|
||||
LLRender::BF_ONE_MINUS_SOURCE_ALPHA,
|
||||
LLRender::BF_ZERO,
|
||||
LLRender::BF_ONE_MINUS_SOURCE_ALPHA);
|
||||
|
||||
renderRigged(avatar, RIGGED_FULLBRIGHT_ALPHA);
|
||||
}
|
||||
}
|
||||
|
||||
void LLDrawPoolAvatar::renderRiggedGlow(LLVOAvatar* avatar)
|
||||
{
|
||||
renderRigged(avatar, RIGGED_GLOW, true);
|
||||
if (!mRiggedFace[RIGGED_GLOW].empty())
|
||||
{
|
||||
LLGLEnable blend(GL_BLEND);
|
||||
LLGLDisable test(GL_ALPHA_TEST);
|
||||
gGL.flush();
|
||||
|
||||
LLGLEnable polyOffset(GL_POLYGON_OFFSET_FILL);
|
||||
glPolygonOffset(-1.0f, -1.0f);
|
||||
gGL.setSceneBlendType(LLRender::BT_ADD);
|
||||
|
||||
LLGLDepthTest depth(GL_TRUE, GL_FALSE);
|
||||
gGL.setColorMask(false, true);
|
||||
|
||||
renderRigged(avatar, RIGGED_GLOW, true);
|
||||
|
||||
gGL.setColorMask(true, false);
|
||||
gGL.setSceneBlendType(LLRender::BT_ALPHA);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -847,12 +847,12 @@ void LLDrawPoolBump::renderDeferred(S32 pass)
|
|||
LLFastTimer ftm(FTM_RENDER_BUMP);
|
||||
|
||||
U32 type = LLRenderPass::PASS_BUMP;
|
||||
LLCullResult::drawinfo_list_t::iterator begin = gPipeline.beginRenderMap(type);
|
||||
LLCullResult::drawinfo_list_t::iterator end = gPipeline.endRenderMap(type);
|
||||
LLCullResult::drawinfo_iterator begin = gPipeline.beginRenderMap(type);
|
||||
LLCullResult::drawinfo_iterator end = gPipeline.endRenderMap(type);
|
||||
|
||||
U32 mask = LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_TEXCOORD0 | LLVertexBuffer::MAP_BINORMAL | LLVertexBuffer::MAP_NORMAL | LLVertexBuffer::MAP_COLOR;
|
||||
|
||||
for (LLCullResult::drawinfo_list_t::iterator i = begin; i != end; ++i)
|
||||
for (LLCullResult::drawinfo_iterator i = begin; i != end; ++i)
|
||||
{
|
||||
LLDrawInfo& params = **i;
|
||||
|
||||
|
|
@ -1448,10 +1448,10 @@ void LLBumpImageList::onSourceLoaded( BOOL success, LLViewerTexture *src_vi, LLI
|
|||
|
||||
void LLDrawPoolBump::renderBump(U32 type, U32 mask)
|
||||
{
|
||||
LLCullResult::drawinfo_list_t::iterator begin = gPipeline.beginRenderMap(type);
|
||||
LLCullResult::drawinfo_list_t::iterator end = gPipeline.endRenderMap(type);
|
||||
LLCullResult::drawinfo_iterator begin = gPipeline.beginRenderMap(type);
|
||||
LLCullResult::drawinfo_iterator end = gPipeline.endRenderMap(type);
|
||||
|
||||
for (LLCullResult::drawinfo_list_t::iterator i = begin; i != end; ++i)
|
||||
for (LLCullResult::drawinfo_iterator i = begin; i != end; ++i)
|
||||
{
|
||||
LLDrawInfo& params = **i;
|
||||
|
||||
|
|
|
|||
|
|
@ -294,6 +294,34 @@ void LLDrawPoolTerrain::renderShadow(S32 pass)
|
|||
//glCullFace(GL_BACK);
|
||||
}
|
||||
|
||||
|
||||
void LLDrawPoolTerrain::drawLoop()
|
||||
{
|
||||
if (!mDrawFace.empty())
|
||||
{
|
||||
for (std::vector<LLFace*>::iterator iter = mDrawFace.begin();
|
||||
iter != mDrawFace.end(); iter++)
|
||||
{
|
||||
LLFace *facep = *iter;
|
||||
|
||||
LLMatrix4* model_matrix = &(facep->getDrawable()->getRegion()->mRenderMatrix);
|
||||
|
||||
if (model_matrix != gGLLastMatrix)
|
||||
{
|
||||
gGLLastMatrix = model_matrix;
|
||||
gGL.loadMatrix(gGLModelView);
|
||||
if (model_matrix)
|
||||
{
|
||||
gGL.multMatrix((GLfloat*) model_matrix->mMatrix);
|
||||
}
|
||||
gPipeline.mMatrixOpCount++;
|
||||
}
|
||||
|
||||
facep->renderIndexed();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void LLDrawPoolTerrain::renderFullShader()
|
||||
{
|
||||
// Hack! Get the region that this draw pool is rendering from!
|
||||
|
|
|
|||
|
|
@ -83,6 +83,7 @@ protected:
|
|||
void renderFull2TU();
|
||||
void renderFull4TU();
|
||||
void renderFullShader();
|
||||
void drawLoop();
|
||||
};
|
||||
|
||||
#endif // LL_LLDRAWPOOLSIMPLE_H
|
||||
|
|
|
|||
|
|
@ -37,6 +37,7 @@
|
|||
#include "llviewershadermgr.h"
|
||||
#include "llrender.h"
|
||||
#include "llviewercontrol.h"
|
||||
#include "llviewerregion.h"
|
||||
|
||||
S32 LLDrawPoolTree::sDiffTex = 0;
|
||||
static LLGLSLShader* shader = NULL;
|
||||
|
|
@ -104,8 +105,22 @@ void LLDrawPoolTree::render(S32 pass)
|
|||
{
|
||||
LLFace *face = *iter;
|
||||
LLVertexBuffer* buff = face->getVertexBuffer();
|
||||
|
||||
if(buff)
|
||||
{
|
||||
LLMatrix4* model_matrix = &(face->getDrawable()->getRegion()->mRenderMatrix);
|
||||
|
||||
if (model_matrix != gGLLastMatrix)
|
||||
{
|
||||
gGLLastMatrix = model_matrix;
|
||||
gGL.loadMatrix(gGLModelView);
|
||||
if (model_matrix)
|
||||
{
|
||||
gGL.multMatrix((GLfloat*) model_matrix->mMatrix);
|
||||
}
|
||||
gPipeline.mMatrixOpCount++;
|
||||
}
|
||||
|
||||
buff->setBuffer(LLDrawPoolTree::VERTEX_DATA_MASK);
|
||||
buff->drawRange(LLRender::TRIANGLES, 0, buff->getNumVerts()-1, buff->getNumIndices(), 0);
|
||||
gPipeline.addTrianglesDrawn(buff->getNumIndices());
|
||||
|
|
|
|||
|
|
@ -155,6 +155,7 @@ LLDriverParam::LLDriverParam(LLVOAvatar *avatarp) :
|
|||
mAvatarp(avatarp),
|
||||
mWearablep(NULL)
|
||||
{
|
||||
mDefaultVec.clear();
|
||||
}
|
||||
|
||||
LLDriverParam::LLDriverParam(LLWearable *wearablep) :
|
||||
|
|
@ -162,6 +163,7 @@ LLDriverParam::LLDriverParam(LLWearable *wearablep) :
|
|||
mAvatarp(NULL),
|
||||
mWearablep(wearablep)
|
||||
{
|
||||
mDefaultVec.clear();
|
||||
}
|
||||
|
||||
LLDriverParam::~LLDriverParam()
|
||||
|
|
@ -341,18 +343,19 @@ F32 LLDriverParam::getTotalDistortion()
|
|||
return sum;
|
||||
}
|
||||
|
||||
const LLVector3 &LLDriverParam::getAvgDistortion()
|
||||
const LLVector4a &LLDriverParam::getAvgDistortion()
|
||||
{
|
||||
// It's not actually correct to take the average of averages, but it good enough here.
|
||||
LLVector3 sum;
|
||||
LLVector4a sum;
|
||||
sum.clear();
|
||||
S32 count = 0;
|
||||
for( entry_list_t::iterator iter = mDriven.begin(); iter != mDriven.end(); iter++ )
|
||||
{
|
||||
LLDrivenEntry* driven = &(*iter);
|
||||
sum += driven->mParam->getAvgDistortion();
|
||||
sum.add(driven->mParam->getAvgDistortion());
|
||||
count++;
|
||||
}
|
||||
sum /= (F32)count;
|
||||
sum.mul( 1.f/(F32)count);
|
||||
|
||||
mDefaultVec = sum;
|
||||
return mDefaultVec;
|
||||
|
|
@ -375,21 +378,22 @@ F32 LLDriverParam::getMaxDistortion()
|
|||
}
|
||||
|
||||
|
||||
LLVector3 LLDriverParam::getVertexDistortion(S32 index, LLPolyMesh *poly_mesh)
|
||||
LLVector4a LLDriverParam::getVertexDistortion(S32 index, LLPolyMesh *poly_mesh)
|
||||
{
|
||||
LLVector3 sum;
|
||||
LLVector4a sum;
|
||||
sum.clear();
|
||||
for( entry_list_t::iterator iter = mDriven.begin(); iter != mDriven.end(); iter++ )
|
||||
{
|
||||
LLDrivenEntry* driven = &(*iter);
|
||||
sum += driven->mParam->getVertexDistortion( index, poly_mesh );
|
||||
sum.add(driven->mParam->getVertexDistortion( index, poly_mesh ));
|
||||
}
|
||||
return sum;
|
||||
}
|
||||
|
||||
const LLVector3* LLDriverParam::getFirstDistortion(U32 *index, LLPolyMesh **poly_mesh)
|
||||
const LLVector4a* LLDriverParam::getFirstDistortion(U32 *index, LLPolyMesh **poly_mesh)
|
||||
{
|
||||
mCurrentDistortionParam = NULL;
|
||||
const LLVector3* v = NULL;
|
||||
const LLVector4a* v = NULL;
|
||||
for( entry_list_t::iterator iter = mDriven.begin(); iter != mDriven.end(); iter++ )
|
||||
{
|
||||
LLDrivenEntry* driven = &(*iter);
|
||||
|
|
@ -404,7 +408,7 @@ const LLVector3* LLDriverParam::getFirstDistortion(U32 *index, LLPolyMesh **poly
|
|||
return v;
|
||||
};
|
||||
|
||||
const LLVector3* LLDriverParam::getNextDistortion(U32 *index, LLPolyMesh **poly_mesh)
|
||||
const LLVector4a* LLDriverParam::getNextDistortion(U32 *index, LLPolyMesh **poly_mesh)
|
||||
{
|
||||
llassert( mCurrentDistortionParam );
|
||||
if( !mCurrentDistortionParam )
|
||||
|
|
@ -432,7 +436,7 @@ const LLVector3* LLDriverParam::getNextDistortion(U32 *index, LLPolyMesh **poly_
|
|||
}
|
||||
|
||||
// We're already in the middle of a param's distortions, so get the next one.
|
||||
const LLVector3* v = driven->mParam->getNextDistortion( index, poly_mesh );
|
||||
const LLVector4a* v = driven->mParam->getNextDistortion( index, poly_mesh );
|
||||
if( (!v) && (iter != mDriven.end()) )
|
||||
{
|
||||
// This param is finished, so start the next param. It might not have any
|
||||
|
|
|
|||
|
|
@ -105,18 +105,18 @@ public:
|
|||
|
||||
// LLViewerVisualParam Virtual functions
|
||||
/*virtual*/ F32 getTotalDistortion();
|
||||
/*virtual*/ const LLVector3& getAvgDistortion();
|
||||
/*virtual*/ const LLVector4a& getAvgDistortion();
|
||||
/*virtual*/ F32 getMaxDistortion();
|
||||
/*virtual*/ LLVector3 getVertexDistortion(S32 index, LLPolyMesh *poly_mesh);
|
||||
/*virtual*/ const LLVector3* getFirstDistortion(U32 *index, LLPolyMesh **poly_mesh);
|
||||
/*virtual*/ const LLVector3* getNextDistortion(U32 *index, LLPolyMesh **poly_mesh);
|
||||
/*virtual*/ LLVector4a getVertexDistortion(S32 index, LLPolyMesh *poly_mesh);
|
||||
/*virtual*/ const LLVector4a* getFirstDistortion(U32 *index, LLPolyMesh **poly_mesh);
|
||||
/*virtual*/ const LLVector4a* getNextDistortion(U32 *index, LLPolyMesh **poly_mesh);
|
||||
|
||||
protected:
|
||||
F32 getDrivenWeight(const LLDrivenEntry* driven, F32 input_weight);
|
||||
void setDrivenWeight(LLDrivenEntry *driven, F32 driven_weight, bool upload_bake);
|
||||
|
||||
|
||||
LLVector3 mDefaultVec; // temp holder
|
||||
LLVector4a mDefaultVec; // temp holder
|
||||
typedef std::vector<LLDrivenEntry> entry_list_t;
|
||||
entry_list_t mDriven;
|
||||
LLViewerVisualParam* mCurrentDistortionParam;
|
||||
|
|
|
|||
|
|
@ -36,6 +36,16 @@
|
|||
class LLViewerDynamicTexture : public LLViewerTexture
|
||||
{
|
||||
public:
|
||||
void* operator new(size_t size)
|
||||
{
|
||||
return ll_aligned_malloc_16(size);
|
||||
}
|
||||
|
||||
void operator delete(void* ptr)
|
||||
{
|
||||
ll_aligned_free_16(ptr);
|
||||
}
|
||||
|
||||
enum
|
||||
{
|
||||
LL_VIEWER_DYNAMIC_TEXTURE = LLViewerTexture::DYNAMIC_TEXTURE,
|
||||
|
|
@ -85,7 +95,7 @@ protected:
|
|||
protected:
|
||||
BOOL mClamp;
|
||||
LLCoordGL mOrigin;
|
||||
LLCamera mCamera;
|
||||
LL_ALIGN_16(LLCamera mCamera);
|
||||
|
||||
typedef std::set<LLViewerDynamicTexture*> instance_list_t;
|
||||
static instance_list_t sInstances[ LLViewerDynamicTexture::ORDER_COUNT ];
|
||||
|
|
|
|||
|
|
@ -163,16 +163,10 @@ void LLFace::init(LLDrawable* drawablep, LLViewerObject* objp)
|
|||
mGeomCount = 0;
|
||||
mGeomIndex = 0;
|
||||
mIndicesCount = 0;
|
||||
if (drawablep->getRenderType() == LLPipeline::RENDER_TYPE_PARTICLES ||
|
||||
drawablep->getRenderType() == LLPipeline::RENDER_TYPE_HUD_PARTICLES)
|
||||
{ //indicate to LLParticlePartition that this particle is uninitialized
|
||||
mIndicesIndex = 0xFFFFFFFF;
|
||||
}
|
||||
else
|
||||
{
|
||||
mIndicesIndex = 0;
|
||||
}
|
||||
mIndexInTex = 0;
|
||||
|
||||
//special value to indicate uninitialized position
|
||||
mIndicesIndex = 0xFFFFFFFF;
|
||||
|
||||
mTexture = NULL;
|
||||
mTEOffset = -1;
|
||||
mTextureIndex = 255;
|
||||
|
|
@ -207,13 +201,10 @@ void LLFace::destroy()
|
|||
mTexture->removeFace(this) ;
|
||||
}
|
||||
|
||||
if (mDrawablep.notNull() &&
|
||||
(mDrawablep->getRenderType() == LLPipeline::RENDER_TYPE_PARTICLES ||
|
||||
mDrawablep->getRenderType() == LLPipeline::RENDER_TYPE_HUD_PARTICLES) &&
|
||||
mIndicesIndex != 0xFFFFFFFF)
|
||||
if (isState(LLFace::PARTICLE))
|
||||
{
|
||||
LLVOPartGroup::freeVBSlot(getGeomIndex()/4);
|
||||
mIndicesIndex = 0xFFFFFFFF;
|
||||
clearState(LLFace::PARTICLE);
|
||||
}
|
||||
|
||||
if (mDrawPoolp)
|
||||
|
|
@ -1220,19 +1211,25 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume,
|
|||
{
|
||||
if (num_indices + (S32) mIndicesIndex > mVertexBuffer->getNumIndices())
|
||||
{
|
||||
llwarns << "Index buffer overflow!" << llendl;
|
||||
llwarns << "Indices Count: " << mIndicesCount
|
||||
<< " VF Num Indices: " << num_indices
|
||||
<< " Indices Index: " << mIndicesIndex
|
||||
<< " VB Num Indices: " << mVertexBuffer->getNumIndices() << llendl;
|
||||
llwarns << " Face Index: " << f
|
||||
<< " Pool Type: " << mPoolType << llendl;
|
||||
if (gDebugGL)
|
||||
{
|
||||
llwarns << "Index buffer overflow!" << llendl;
|
||||
llwarns << "Indices Count: " << mIndicesCount
|
||||
<< " VF Num Indices: " << num_indices
|
||||
<< " Indices Index: " << mIndicesIndex
|
||||
<< " VB Num Indices: " << mVertexBuffer->getNumIndices() << llendl;
|
||||
llwarns << " Face Index: " << f
|
||||
<< " Pool Type: " << mPoolType << llendl;
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if (num_vertices + mGeomIndex > mVertexBuffer->getNumVerts())
|
||||
{
|
||||
llwarns << "Vertex buffer overflow!" << llendl;
|
||||
if (gDebugGL)
|
||||
{
|
||||
llwarns << "Vertex buffer overflow!" << llendl;
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
|
@ -1664,7 +1661,8 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume,
|
|||
if (!do_xform)
|
||||
{
|
||||
LLFastTimer t(FTM_FACE_TEX_QUICK_NO_XFORM);
|
||||
LLVector4a::memcpyNonAliased16((F32*) tex_coords.get(), (F32*) vf.mTexCoords, num_vertices*2*sizeof(F32));
|
||||
S32 tc_size = (num_vertices*2*sizeof(F32)+0xF) & ~0xF;
|
||||
LLVector4a::memcpyNonAliased16((F32*) tex_coords.get(), (F32*) vf.mTexCoords, tc_size);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
|
|||
|
|
@ -59,6 +59,17 @@ class LLFace
|
|||
{
|
||||
public:
|
||||
|
||||
void* operator new(size_t size)
|
||||
{
|
||||
return ll_aligned_malloc_16(size);
|
||||
}
|
||||
|
||||
void operator delete(void* ptr)
|
||||
{
|
||||
ll_aligned_free_16(ptr);
|
||||
}
|
||||
|
||||
|
||||
LLFace(const LLFace& rhs)
|
||||
{
|
||||
*this = rhs;
|
||||
|
|
@ -79,6 +90,7 @@ public:
|
|||
USE_FACE_COLOR = 0x0010,
|
||||
TEXTURE_ANIM = 0x0020,
|
||||
RIGGED = 0x0040,
|
||||
PARTICLE = 0x0080,
|
||||
};
|
||||
|
||||
static void initClass();
|
||||
|
|
|
|||
|
|
@ -65,7 +65,7 @@ LLVolumeImplFlexible::LLVolumeImplFlexible(LLViewerObject* vo, LLFlexibleObjectD
|
|||
mFrameNum = 0;
|
||||
mCollisionSphereRadius = 0.f;
|
||||
mRenderRes = 1;
|
||||
|
||||
|
||||
if(mVO->mDrawable.notNull())
|
||||
{
|
||||
mVO->mDrawable->makeActive() ;
|
||||
|
|
@ -255,50 +255,28 @@ void LLVolumeImplFlexible::onSetVolume(const LLVolumeParams &volume_params, cons
|
|||
{
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------------
|
||||
// This calculates the physics of the flexible object. Note that it has to be 0
|
||||
// updated every time step. In the future, perhaps there could be an
|
||||
// optimization similar to what Havok does for objects that are stationary.
|
||||
//---------------------------------------------------------------------------------
|
||||
static LLFastTimer::DeclareTimer FTM_FLEXIBLE_UPDATE("Update Flexies");
|
||||
BOOL LLVolumeImplFlexible::doIdleUpdate(LLAgent &agent, LLWorld &world, const F64 &time)
|
||||
|
||||
void LLVolumeImplFlexible::updateRenderRes()
|
||||
{
|
||||
if (mVO->mDrawable.isNull())
|
||||
{
|
||||
// Don't do anything until we have a drawable
|
||||
return FALSE; // (we are not initialized or updated)
|
||||
}
|
||||
LLDrawable* drawablep = mVO->mDrawable;
|
||||
|
||||
BOOL force_update = mSimulateRes == 0 ? TRUE : FALSE;
|
||||
|
||||
//flexible objects never go static
|
||||
mVO->mDrawable->mQuietCount = 0;
|
||||
if (!mVO->mDrawable->isRoot())
|
||||
{
|
||||
LLViewerObject* parent = (LLViewerObject*) mVO->getParent();
|
||||
parent->mDrawable->mQuietCount = 0;
|
||||
}
|
||||
|
||||
LLFastTimer ftm(FTM_FLEXIBLE_UPDATE);
|
||||
|
||||
S32 new_res = mAttributes->getSimulateLOD();
|
||||
|
||||
//number of segments only cares about z axis
|
||||
F32 app_angle = llround((F32) atan2( mVO->getScale().mV[2]*2.f, mVO->mDrawable->mDistanceWRTCamera) * RAD_TO_DEG, 0.01f);
|
||||
#if 1 //optimal approximation of previous behavior that doesn't rely on atan2
|
||||
F32 app_angle = mVO->getScale().mV[2]/drawablep->mDistanceWRTCamera;
|
||||
|
||||
// Rendering sections increases with visible angle on the screen
|
||||
mRenderRes = (S32) (12.f*app_angle);
|
||||
#else //legacy behavior
|
||||
//number of segments only cares about z axis
|
||||
F32 app_angle = llround((F32) atan2( mVO->getScale().mV[2]*2.f, drawablep->mDistanceWRTCamera) * RAD_TO_DEG, 0.01f);
|
||||
|
||||
// Rendering sections increases with visible angle on the screen
|
||||
mRenderRes = (S32)(FLEXIBLE_OBJECT_MAX_SECTIONS*4*app_angle*DEG_TO_RAD/LLViewerCamera::getInstance()->getView());
|
||||
if (mRenderRes > FLEXIBLE_OBJECT_MAX_SECTIONS)
|
||||
{
|
||||
mRenderRes = FLEXIBLE_OBJECT_MAX_SECTIONS;
|
||||
}
|
||||
|
||||
|
||||
// Bottom cap at 1/4 the original number of sections
|
||||
if (mRenderRes < mAttributes->getSimulateLOD()-1)
|
||||
{
|
||||
mRenderRes = mAttributes->getSimulateLOD()-1;
|
||||
}
|
||||
#endif
|
||||
|
||||
mRenderRes = llclamp(mRenderRes, new_res-1, (S32) FLEXIBLE_OBJECT_MAX_SECTIONS);
|
||||
|
||||
// Throttle back simulation of segments we're not rendering
|
||||
if (mRenderRes < new_res)
|
||||
{
|
||||
|
|
@ -311,43 +289,65 @@ BOOL LLVolumeImplFlexible::doIdleUpdate(LLAgent &agent, LLWorld &world, const F6
|
|||
setAttributesOfAllSections();
|
||||
mInitialized = TRUE;
|
||||
}
|
||||
if (!gPipeline.hasRenderDebugFeatureMask(LLPipeline::RENDER_DEBUG_FEATURE_FLEXIBLE))
|
||||
{
|
||||
return FALSE; // (we are not initialized or updated)
|
||||
}
|
||||
}
|
||||
//---------------------------------------------------------------------------------
|
||||
// This calculates the physics of the flexible object. Note that it has to be 0
|
||||
// updated every time step. In the future, perhaps there could be an
|
||||
// optimization similar to what Havok does for objects that are stationary.
|
||||
//---------------------------------------------------------------------------------
|
||||
static LLFastTimer::DeclareTimer FTM_FLEXIBLE_UPDATE("Update Flexies");
|
||||
void LLVolumeImplFlexible::doIdleUpdate(LLAgent &agent, LLWorld &world, const F64 &time)
|
||||
{
|
||||
LLDrawable* drawablep = mVO->mDrawable;
|
||||
|
||||
bool visible = mVO->mDrawable->isVisible();
|
||||
|
||||
if (force_update && visible)
|
||||
if (drawablep)
|
||||
{
|
||||
gPipeline.markRebuild(mVO->mDrawable, LLDrawable::REBUILD_POSITION, FALSE);
|
||||
}
|
||||
else if (visible &&
|
||||
!mVO->mDrawable->isState(LLDrawable::IN_REBUILD_Q1) &&
|
||||
mVO->getPixelArea() > 256.f)
|
||||
{
|
||||
U32 id;
|
||||
F32 pixel_area = mVO->getPixelArea();
|
||||
//LLFastTimer ftm(FTM_FLEXIBLE_UPDATE);
|
||||
|
||||
if (mVO->isRootEdit())
|
||||
//flexible objects never go static
|
||||
drawablep->mQuietCount = 0;
|
||||
if (!drawablep->isRoot())
|
||||
{
|
||||
id = mID;
|
||||
}
|
||||
else
|
||||
{
|
||||
LLVOVolume* parent = (LLVOVolume*) mVO->getParent();
|
||||
id = parent->getVolumeInterfaceID();
|
||||
LLViewerObject* parent = (LLViewerObject*) mVO->getParent();
|
||||
parent->mDrawable->mQuietCount = 0;
|
||||
}
|
||||
|
||||
U32 update_period = (U32) (LLViewerCamera::getInstance()->getScreenPixelArea()*0.01f/(pixel_area*(sUpdateFactor+1.f)))+1;
|
||||
|
||||
if ((LLDrawable::getCurrentFrame()+id)%update_period == 0)
|
||||
if (gPipeline.hasRenderDebugFeatureMask(LLPipeline::RENDER_DEBUG_FEATURE_FLEXIBLE))
|
||||
{
|
||||
gPipeline.markRebuild(mVO->mDrawable, LLDrawable::REBUILD_POSITION, FALSE);
|
||||
bool visible = drawablep->isVisible();
|
||||
|
||||
if ((mSimulateRes == 0) && visible)
|
||||
{
|
||||
updateRenderRes();
|
||||
gPipeline.markRebuild(drawablep, LLDrawable::REBUILD_POSITION, FALSE);
|
||||
}
|
||||
else if (visible &&
|
||||
!drawablep->isState(LLDrawable::IN_REBUILD_Q1) &&
|
||||
mVO->getPixelArea() > 256.f)
|
||||
{
|
||||
U32 id;
|
||||
F32 pixel_area = mVO->getPixelArea();
|
||||
|
||||
if (mVO->isRootEdit())
|
||||
{
|
||||
id = mID;
|
||||
}
|
||||
else
|
||||
{
|
||||
LLVOVolume* parent = (LLVOVolume*) mVO->getParent();
|
||||
id = parent->getVolumeInterfaceID();
|
||||
}
|
||||
|
||||
U32 update_period = (U32) (LLViewerCamera::getInstance()->getScreenPixelArea()*0.01f/(pixel_area*(sUpdateFactor+1.f)))+1;
|
||||
|
||||
if ((LLDrawable::getCurrentFrame()+id)%update_period == 0)
|
||||
{
|
||||
updateRenderRes();
|
||||
gPipeline.markRebuild(drawablep, LLDrawable::REBUILD_POSITION, FALSE);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return force_update;
|
||||
}
|
||||
|
||||
inline S32 log2(S32 x)
|
||||
|
|
@ -368,8 +368,11 @@ void LLVolumeImplFlexible::doFlexibleUpdate()
|
|||
LLPath *path = &volume->getPath();
|
||||
if ((mSimulateRes == 0 || !mInitialized) && mVO->mDrawable->isVisible())
|
||||
{
|
||||
//mVO->markForUpdate(TRUE);
|
||||
if (!doIdleUpdate(gAgent, *LLWorld::getInstance(), 0.0))
|
||||
BOOL force_update = mSimulateRes == 0 ? TRUE : FALSE;
|
||||
|
||||
doIdleUpdate(gAgent, *LLWorld::getInstance(), 0.0);
|
||||
|
||||
if (!force_update || !gPipeline.hasRenderDebugFeatureMask(LLPipeline::RENDER_DEBUG_FEATURE_FLEXIBLE))
|
||||
{
|
||||
return; // we did not get updated or initialized, proceeding without can be dangerous
|
||||
}
|
||||
|
|
|
|||
|
|
@ -78,7 +78,8 @@ class LLVolumeImplFlexible : public LLVolumeInterface
|
|||
LLVector3 getFramePosition() const;
|
||||
LLQuaternion getFrameRotation() const;
|
||||
LLVolumeInterfaceType getInterfaceType() const { return INTERFACE_FLEXIBLE; }
|
||||
BOOL doIdleUpdate(LLAgent &agent, LLWorld &world, const F64 &time);
|
||||
void updateRenderRes();
|
||||
void doIdleUpdate(LLAgent &agent, LLWorld &world, const F64 &time);
|
||||
BOOL doUpdateGeometry(LLDrawable *drawable);
|
||||
LLVector3 getPivotPosition() const;
|
||||
void onSetVolume(const LLVolumeParams &volume_params, const S32 detail);
|
||||
|
|
@ -128,7 +129,7 @@ class LLVolumeImplFlexible : public LLVolumeInterface
|
|||
LLVector3 mCollisionSpherePosition;
|
||||
F32 mCollisionSphereRadius;
|
||||
U32 mID;
|
||||
|
||||
|
||||
//--------------------------------------
|
||||
// private methods
|
||||
//--------------------------------------
|
||||
|
|
|
|||
|
|
@ -211,8 +211,8 @@ void LLFloaterBuyContents::inventoryChanged(LLViewerObject* obj,
|
|||
|
||||
BOOL item_is_multi = FALSE;
|
||||
if ((inv_item->getFlags() & LLInventoryItemFlags::II_FLAGS_LANDMARK_VISITED
|
||||
|| inv_item->getFlags() & LLInventoryItemFlags::II_FLAGS_OBJECT_HAS_MULTIPLE_ITEMS)
|
||||
&& !(inv_item->getFlags() & LLInventoryItemFlags::II_FLAGS_WEARABLES_MASK))
|
||||
|| inv_item->getFlags() & LLInventoryItemFlags::II_FLAGS_OBJECT_HAS_MULTIPLE_ITEMS)
|
||||
&& !(inv_item->getFlags() & LLInventoryItemFlags::II_FLAGS_WEARABLES_MASK))
|
||||
{
|
||||
item_is_multi = TRUE;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -2303,8 +2303,8 @@ void LLPanelLandOptions::onCommitAny(LLUICtrl *ctrl, void *userdata)
|
|||
BOOL allow_damage = !self->mCheckSafe->get();
|
||||
BOOL allow_fly = self->mCheckFly->get();
|
||||
BOOL allow_landmark = TRUE; // cannot restrict landmark creation
|
||||
BOOL allow_group_scripts = self->mCheckGroupScripts->get() || self->mCheckOtherScripts->get();
|
||||
BOOL allow_other_scripts = self->mCheckOtherScripts->get();
|
||||
BOOL allow_group_scripts = self->mCheckGroupScripts->get() || allow_other_scripts;
|
||||
BOOL allow_publish = FALSE;
|
||||
BOOL mature_publish = self->mMatureCtrl->get();
|
||||
BOOL push_restriction = self->mPushRestrictionCtrl->get();
|
||||
|
|
@ -2317,11 +2317,16 @@ void LLPanelLandOptions::onCommitAny(LLUICtrl *ctrl, void *userdata)
|
|||
LLViewerRegion* region;
|
||||
region = LLViewerParcelMgr::getInstance()->getSelectionRegion();
|
||||
|
||||
if (!allow_other_scripts && region && region->getAllowDamage())
|
||||
{
|
||||
|
||||
LLNotificationsUtil::add("UnableToDisableOutsideScripts");
|
||||
return;
|
||||
if (region && region->getAllowDamage())
|
||||
{ // Damage is allowed on the region - server will always allow scripts
|
||||
if ( (!allow_other_scripts && parcel->getParcelFlag(PF_ALLOW_OTHER_SCRIPTS)) ||
|
||||
(!allow_group_scripts && parcel->getParcelFlag(PF_ALLOW_GROUP_SCRIPTS)) )
|
||||
{ // Don't allow turning off "Run Scripts" if damage is allowed in the region
|
||||
self->mCheckOtherScripts->set(parcel->getParcelFlag(PF_ALLOW_OTHER_SCRIPTS)); // Restore UI to actual settings
|
||||
self->mCheckGroupScripts->set(parcel->getParcelFlag(PF_ALLOW_GROUP_SCRIPTS));
|
||||
LLNotificationsUtil::add("UnableToDisableOutsideScripts");
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
// Push data into current parcel
|
||||
|
|
|
|||
|
|
@ -4819,7 +4819,8 @@ void LLModelPreview::genBuffers(S32 lod, bool include_skin_weights)
|
|||
if (vf.mTexCoords)
|
||||
{
|
||||
vb->getTexCoord0Strider(tc_strider);
|
||||
LLVector4a::memcpyNonAliased16((F32*) tc_strider.get(), (F32*) vf.mTexCoords, num_vertices*2*sizeof(F32));
|
||||
S32 tex_size = (num_vertices*2*sizeof(F32)+0xF) & ~0xF;
|
||||
LLVector4a::memcpyNonAliased16((F32*) tc_strider.get(), (F32*) vf.mTexCoords, tex_size);
|
||||
}
|
||||
|
||||
if (vf.mNormals)
|
||||
|
|
|
|||
|
|
@ -2275,12 +2275,11 @@ void LLFolderView::doIdle()
|
|||
arrangeAll();
|
||||
}
|
||||
|
||||
if (mFilter->isModified() && mFilter->isNotDefault())
|
||||
{
|
||||
mNeedsAutoSelect = TRUE;
|
||||
}
|
||||
BOOL filter_modified_and_active = mFilter->isModified() && mFilter->isNotDefault();
|
||||
mNeedsAutoSelect = filter_modified_and_active &&
|
||||
!(gFocusMgr.childHasKeyboardFocus(this) || gFocusMgr.getMouseCapture());
|
||||
mFilter->clearModified();
|
||||
|
||||
|
||||
// filter to determine visibility before arranging
|
||||
filterFromRoot();
|
||||
|
||||
|
|
@ -2290,7 +2289,7 @@ void LLFolderView::doIdle()
|
|||
LLFastTimer t3(FTM_AUTO_SELECT);
|
||||
// select new item only if a filtered item not currently selected
|
||||
LLFolderViewItem* selected_itemp = mSelectedItems.empty() ? NULL : mSelectedItems.back();
|
||||
if (!mAutoSelectOverride && (!selected_itemp || !selected_itemp->potentiallyFiltered()))
|
||||
if (!mAutoSelectOverride && (!selected_itemp || !selected_itemp->potentiallyVisible()))
|
||||
{
|
||||
// these are named variables to get around gcc not binding non-const references to rvalues
|
||||
// and functor application is inherently non-const to allow for stateful functors
|
||||
|
|
@ -2300,7 +2299,7 @@ void LLFolderView::doIdle()
|
|||
|
||||
// Open filtered folders for folder views with mAutoSelectOverride=TRUE.
|
||||
// Used by LLPlacesFolderView.
|
||||
if (mAutoSelectOverride && !mFilter->getFilterSubString().empty())
|
||||
if (!mFilter->getFilterSubString().empty())
|
||||
{
|
||||
// these are named variables to get around gcc not binding non-const references to rvalues
|
||||
// and functor application is inherently non-const to allow for stateful functors
|
||||
|
|
@ -2592,6 +2591,25 @@ void LLFolderView::onRenamerLost()
|
|||
}
|
||||
}
|
||||
|
||||
LLFolderViewItem* LLFolderView::getNextUnselectedItem()
|
||||
{
|
||||
LLFolderViewItem* last_item = *mSelectedItems.rbegin();
|
||||
LLFolderViewItem* new_selection = last_item->getNextOpenNode(FALSE);
|
||||
while(new_selection && new_selection->isSelected())
|
||||
{
|
||||
new_selection = new_selection->getNextOpenNode(FALSE);
|
||||
}
|
||||
if (!new_selection)
|
||||
{
|
||||
new_selection = last_item->getPreviousOpenNode(FALSE);
|
||||
while (new_selection && (new_selection->isInSelection()))
|
||||
{
|
||||
new_selection = new_selection->getPreviousOpenNode(FALSE);
|
||||
}
|
||||
}
|
||||
return new_selection;
|
||||
}
|
||||
|
||||
LLInventoryFilter* LLFolderView::getFilter()
|
||||
{
|
||||
return mFilter;
|
||||
|
|
|
|||
|
|
@ -208,6 +208,8 @@ public:
|
|||
virtual void doDelete();
|
||||
virtual BOOL canDoDelete() const;
|
||||
|
||||
LLFolderViewItem* getNextUnselectedItem();
|
||||
|
||||
// Public rename functionality - can only start the process
|
||||
void startRenamingSelectedItem( void );
|
||||
|
||||
|
|
|
|||
|
|
@ -1248,7 +1248,12 @@ void LLFolderViewItem::draw()
|
|||
// End Multi-substring inventory search
|
||||
}
|
||||
|
||||
bool LLFolderViewItem::isInSelection() const
|
||||
{
|
||||
return mIsSelected || (mParentFolder && mParentFolder->isInSelection());
|
||||
}
|
||||
// <ND> Don't bother with unneeded tooltips in inventor
|
||||
|
||||
BOOL LLFolderViewItem::handleToolTip(S32 x, S32 y, MASK mask)
|
||||
{
|
||||
if( childrenHandleToolTip( x, y, mask ) )
|
||||
|
|
|
|||
|
|
@ -257,6 +257,7 @@ public:
|
|||
virtual void destroyView();
|
||||
|
||||
BOOL isSelected() const { return mIsSelected; }
|
||||
bool isInSelection() const;
|
||||
|
||||
void setUnselected() { mIsSelected = FALSE; }
|
||||
|
||||
|
|
|
|||
|
|
@ -66,7 +66,6 @@
|
|||
#include "llavataractions.h"
|
||||
#include "llgroupactions.h"
|
||||
#include "llvoicechannel.h"
|
||||
|
||||
//TL: for support group chat prefix
|
||||
#include "fsdata.h"
|
||||
#include "llversioninfo.h"
|
||||
|
|
|
|||
|
|
@ -1431,9 +1431,12 @@ void LLItemBridge::performAction(LLInventoryModel* model, std::string action)
|
|||
else if ("cut" == action)
|
||||
{
|
||||
cutToClipboard();
|
||||
// MAINT-1197: This is temp code to work around a deselection/reselection bug. Please discard when merging CHUI.
|
||||
LLFolderViewItem* item_to_select = mRoot->getNextUnselectedItem();
|
||||
// <FS:Ansariel> FIRE-6714: Don't move objects to trash during cut&paste
|
||||
//LLFolderView::removeCutItems();
|
||||
// </FS:Ansariel> FIRE-6714: Don't move objects to trash during cut&paste
|
||||
mRoot->setSelection(item_to_select, item_to_select ? item_to_select->isOpen() : false, false);
|
||||
return;
|
||||
}
|
||||
else if ("copy" == action)
|
||||
|
|
@ -2880,9 +2883,12 @@ void LLFolderBridge::performAction(LLInventoryModel* model, std::string action)
|
|||
else if ("cut" == action)
|
||||
{
|
||||
cutToClipboard();
|
||||
// MAINT-1197: This is temp code to work around a deselection/reselection bug. Please discard when merging CHUI.
|
||||
LLFolderViewItem* item_to_select = mRoot->getNextUnselectedItem();
|
||||
// <FS:Ansariel> FIRE-6714: Don't move objects to trash during cut&paste
|
||||
//LLFolderView::removeCutItems();
|
||||
// </FS:Ansariel> FIRE-6714: Don't move objects to trash during cut&paste
|
||||
mRoot->setSelection(item_to_select, item_to_select ? item_to_select->isOpen() : false, false);
|
||||
return;
|
||||
}
|
||||
else if ("copy" == action)
|
||||
|
|
|
|||
|
|
@ -1,4 +1,6 @@
|
|||
/*
|
||||
#include "llautoreplace.h"
|
||||
mChatBox->setAutoreplaceCallback(boost::bind(&LLAutoReplace::autoreplaceCallback, LLAutoReplace::getInstance(), _1, _2));
|
||||
|
||||
This file is not used by Firestorm. It's being kept in place to track merges.
|
||||
|
||||
|
|
|
|||
|
|
@ -67,6 +67,19 @@ inline F64 llsgn(const F64 a)
|
|||
class LLPhysicsMotion
|
||||
{
|
||||
public:
|
||||
typedef enum
|
||||
{
|
||||
SMOOTHING = 0,
|
||||
MASS,
|
||||
GRAVITY,
|
||||
SPRING,
|
||||
GAIN,
|
||||
DAMPING,
|
||||
DRAG,
|
||||
MAX_EFFECT,
|
||||
NUM_PARAMS
|
||||
} eParamName;
|
||||
|
||||
/*
|
||||
param_driver_name: The param that controls the params that are being affected by the physics.
|
||||
joint_name: The joint that the body part is attached to. The joint is
|
||||
|
|
@ -98,6 +111,11 @@ public:
|
|||
mPositionLastUpdate_local(0)
|
||||
{
|
||||
mJointState = new LLJointState;
|
||||
|
||||
for (U32 i = 0; i < NUM_PARAMS; ++i)
|
||||
{
|
||||
mParamCache[i] = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
BOOL initialize();
|
||||
|
|
@ -111,16 +129,43 @@ public:
|
|||
return mJointState;
|
||||
}
|
||||
protected:
|
||||
F32 getParamValue(const std::string& controller_key)
|
||||
{
|
||||
const controller_map_t::const_iterator& entry = mParamControllers.find(controller_key);
|
||||
|
||||
F32 getParamValue(eParamName param)
|
||||
{
|
||||
static std::string controller_key[] =
|
||||
{
|
||||
"Smoothing",
|
||||
"Mass",
|
||||
"Gravity",
|
||||
"Spring",
|
||||
"Gain",
|
||||
"Damping",
|
||||
"Drag",
|
||||
"MaxEffect"
|
||||
};
|
||||
|
||||
if (!mParamCache[param])
|
||||
{
|
||||
const controller_map_t::const_iterator& entry = mParamControllers.find(controller_key[param]);
|
||||
if (entry == mParamControllers.end())
|
||||
{
|
||||
return sDefaultController[controller_key];
|
||||
return sDefaultController[controller_key[param]];
|
||||
}
|
||||
const std::string& param_name = (*entry).second.c_str();
|
||||
return mCharacter->getVisualParamWeight(param_name.c_str());
|
||||
}
|
||||
mParamCache[param] = mCharacter->getVisualParam(param_name.c_str());
|
||||
}
|
||||
|
||||
if (mParamCache[param])
|
||||
{
|
||||
return mParamCache[param]->getWeight();
|
||||
}
|
||||
else
|
||||
{
|
||||
return sDefaultController[controller_key[param]];
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void setParamValue(LLViewerVisualParam *param,
|
||||
const F32 new_value_local,
|
||||
F32 behavior_maxeffect);
|
||||
|
|
@ -150,6 +195,8 @@ private:
|
|||
|
||||
F32 mLastTime;
|
||||
|
||||
LLVisualParam* mParamCache[NUM_PARAMS];
|
||||
|
||||
static default_controller_map_t sDefaultController;
|
||||
};
|
||||
|
||||
|
|
@ -427,7 +474,6 @@ BOOL LLPhysicsMotionController::onUpdate(F32 time, U8* joint_mask)
|
|||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
// Return TRUE if character has to update visual params.
|
||||
BOOL LLPhysicsMotion::onUpdate(F32 time)
|
||||
{
|
||||
|
|
@ -471,15 +517,16 @@ BOOL LLPhysicsMotion::onUpdate(F32 time)
|
|||
|
||||
LLJoint *joint = mJointState->getJoint();
|
||||
|
||||
const F32 behavior_mass = getParamValue("Mass");
|
||||
const F32 behavior_gravity = getParamValue("Gravity");
|
||||
const F32 behavior_spring = getParamValue("Spring");
|
||||
const F32 behavior_gain = getParamValue("Gain");
|
||||
const F32 behavior_damping = getParamValue("Damping");
|
||||
const F32 behavior_drag = getParamValue("Drag");
|
||||
const BOOL physics_test = FALSE; // Enable this to simulate bouncing on all parts.
|
||||
const F32 behavior_mass = getParamValue(MASS);
|
||||
const F32 behavior_gravity = getParamValue(GRAVITY);
|
||||
const F32 behavior_spring = getParamValue(SPRING);
|
||||
const F32 behavior_gain = getParamValue(GAIN);
|
||||
const F32 behavior_damping = getParamValue(DAMPING);
|
||||
const F32 behavior_drag = getParamValue(DRAG);
|
||||
F32 behavior_maxeffect = getParamValue(MAX_EFFECT);
|
||||
|
||||
const BOOL physics_test = FALSE; // Enable this to simulate bouncing on all parts.
|
||||
|
||||
F32 behavior_maxeffect = getParamValue("MaxEffect");
|
||||
if (physics_test)
|
||||
behavior_maxeffect = 1.0f;
|
||||
|
||||
|
|
|
|||
|
|
@ -129,22 +129,22 @@ void LLPolyMeshSharedData::freeMeshData()
|
|||
{
|
||||
mNumVertices = 0;
|
||||
|
||||
delete [] mBaseCoords;
|
||||
ll_aligned_free_16(mBaseCoords);
|
||||
mBaseCoords = NULL;
|
||||
|
||||
delete [] mBaseNormals;
|
||||
ll_aligned_free_16(mBaseNormals);
|
||||
mBaseNormals = NULL;
|
||||
|
||||
delete [] mBaseBinormals;
|
||||
ll_aligned_free_16(mBaseBinormals);
|
||||
mBaseBinormals = NULL;
|
||||
|
||||
delete [] mTexCoords;
|
||||
ll_aligned_free_16(mTexCoords);
|
||||
mTexCoords = NULL;
|
||||
|
||||
delete [] mDetailTexCoords;
|
||||
ll_aligned_free_16(mDetailTexCoords);
|
||||
mDetailTexCoords = NULL;
|
||||
|
||||
delete [] mWeights;
|
||||
ll_aligned_free_16(mWeights);
|
||||
mWeights = NULL;
|
||||
}
|
||||
|
||||
|
|
@ -229,15 +229,19 @@ U32 LLPolyMeshSharedData::getNumKB()
|
|||
BOOL LLPolyMeshSharedData::allocateVertexData( U32 numVertices )
|
||||
{
|
||||
U32 i;
|
||||
mBaseCoords = new LLVector3[ numVertices ];
|
||||
mBaseNormals = new LLVector3[ numVertices ];
|
||||
mBaseBinormals = new LLVector3[ numVertices ];
|
||||
mTexCoords = new LLVector2[ numVertices ];
|
||||
mDetailTexCoords = new LLVector2[ numVertices ];
|
||||
mWeights = new F32[ numVertices ];
|
||||
mBaseCoords = (LLVector4a*) ll_aligned_malloc_16(numVertices*sizeof(LLVector4a));
|
||||
mBaseNormals = (LLVector4a*) ll_aligned_malloc_16(numVertices*sizeof(LLVector4a));
|
||||
mBaseBinormals = (LLVector4a*) ll_aligned_malloc_16(numVertices*sizeof(LLVector4a));
|
||||
mTexCoords = (LLVector2*) ll_aligned_malloc_16(numVertices*sizeof(LLVector2));
|
||||
mDetailTexCoords = (LLVector2*) ll_aligned_malloc_16(numVertices*sizeof(LLVector2));
|
||||
mWeights = (F32*) ll_aligned_malloc_16(numVertices*sizeof(F32));
|
||||
for (i = 0; i < numVertices; i++)
|
||||
{
|
||||
mWeights[i] = 0.f;
|
||||
mBaseCoords[i].clear();
|
||||
mBaseNormals[i].clear();
|
||||
mBaseBinormals[i].clear();
|
||||
mTexCoords[i].clear();
|
||||
mWeights[i] = 0.f;
|
||||
}
|
||||
mNumVertices = numVertices;
|
||||
return TRUE;
|
||||
|
|
@ -408,39 +412,47 @@ BOOL LLPolyMeshSharedData::loadMesh( const std::string& fileName )
|
|||
|
||||
allocateVertexData( numVertices );
|
||||
|
||||
//----------------------------------------------------------------
|
||||
// Coords
|
||||
//----------------------------------------------------------------
|
||||
numRead = fread(mBaseCoords, 3*sizeof(float), numVertices, fp);
|
||||
llendianswizzle(mBaseCoords, sizeof(float), 3*numVertices);
|
||||
if (numRead != numVertices)
|
||||
{
|
||||
llerrs << "can't read Coordinates from " << fileName << llendl;
|
||||
return FALSE;
|
||||
}
|
||||
for (U16 i = 0; i < numVertices; ++i)
|
||||
{
|
||||
//----------------------------------------------------------------
|
||||
// Coords
|
||||
//----------------------------------------------------------------
|
||||
numRead = fread(&mBaseCoords[i], sizeof(float), 3, fp);
|
||||
llendianswizzle(&mBaseCoords[i], sizeof(float), 3);
|
||||
if (numRead != 3)
|
||||
{
|
||||
llerrs << "can't read Coordinates from " << fileName << llendl;
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------
|
||||
// Normals
|
||||
//----------------------------------------------------------------
|
||||
numRead = fread(mBaseNormals, 3*sizeof(float), numVertices, fp);
|
||||
llendianswizzle(mBaseNormals, sizeof(float), 3*numVertices);
|
||||
if (numRead != numVertices)
|
||||
{
|
||||
llerrs << " can't read Normals from " << fileName << llendl;
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------
|
||||
// Binormals
|
||||
//----------------------------------------------------------------
|
||||
numRead = fread(mBaseBinormals, 3*sizeof(float), numVertices, fp);
|
||||
llendianswizzle(mBaseBinormals, sizeof(float), 3*numVertices);
|
||||
if (numRead != numVertices)
|
||||
{
|
||||
llerrs << " can't read Binormals from " << fileName << llendl;
|
||||
return FALSE;
|
||||
}
|
||||
for (U16 i = 0; i < numVertices; ++i)
|
||||
{
|
||||
//----------------------------------------------------------------
|
||||
// Normals
|
||||
//----------------------------------------------------------------
|
||||
numRead = fread(&mBaseNormals[i], sizeof(float), 3, fp);
|
||||
llendianswizzle(&mBaseNormals[i], sizeof(float), 3);
|
||||
if (numRead != 3)
|
||||
{
|
||||
llerrs << " can't read Normals from " << fileName << llendl;
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
for (U16 i = 0; i < numVertices; ++i)
|
||||
{
|
||||
//----------------------------------------------------------------
|
||||
// Binormals
|
||||
//----------------------------------------------------------------
|
||||
numRead = fread(&mBaseBinormals[i], sizeof(float), 3, fp);
|
||||
llendianswizzle(&mBaseBinormals[i], sizeof(float), 3);
|
||||
if (numRead != 3)
|
||||
{
|
||||
llerrs << " can't read Binormals from " << fileName << llendl;
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------
|
||||
// TexCoords
|
||||
|
|
@ -767,21 +779,28 @@ LLPolyMesh::LLPolyMesh(LLPolyMeshSharedData *shared_data, LLPolyMesh *reference_
|
|||
{
|
||||
// Allocate memory without initializing every vector
|
||||
// NOTE: This makes asusmptions about the size of LLVector[234]
|
||||
int nverts = mSharedData->mNumVertices;
|
||||
int nfloats = nverts * (2*4 + 3*3 + 2 + 4);
|
||||
S32 nverts = mSharedData->mNumVertices;
|
||||
//make sure it's an even number of verts for alignment
|
||||
nverts += nverts%2;
|
||||
S32 nfloats = nverts * (
|
||||
4 + //coords
|
||||
4 + //normals
|
||||
4 + //weights
|
||||
2 + //coords
|
||||
4 + //scaled normals
|
||||
4 + //binormals
|
||||
4); //scaled binormals
|
||||
|
||||
//use 16 byte aligned vertex data to make LLPolyMesh SSE friendly
|
||||
mVertexData = (F32*) ll_aligned_malloc_16(nfloats*4);
|
||||
int offset = 0;
|
||||
mCoords = (LLVector4*)(mVertexData + offset); offset += 4*nverts;
|
||||
mNormals = (LLVector4*)(mVertexData + offset); offset += 4*nverts;
|
||||
mClothingWeights = (LLVector4*)(mVertexData + offset); offset += 4*nverts;
|
||||
mTexCoords = (LLVector2*)(mVertexData + offset); offset += 2*nverts;
|
||||
|
||||
// these members don't need to be 16-byte aligned, but the first one might be
|
||||
// read during an aligned memcpy of mTexCoords
|
||||
mScaledNormals = (LLVector3*)(mVertexData + offset); offset += 3*nverts;
|
||||
mBinormals = (LLVector3*)(mVertexData + offset); offset += 3*nverts;
|
||||
mScaledBinormals = (LLVector3*)(mVertexData + offset); offset += 3*nverts;
|
||||
S32 offset = 0;
|
||||
mCoords = (LLVector4a*)(mVertexData + offset); offset += 4*nverts;
|
||||
mNormals = (LLVector4a*)(mVertexData + offset); offset += 4*nverts;
|
||||
mClothingWeights = (LLVector4a*)(mVertexData + offset); offset += 4*nverts;
|
||||
mTexCoords = (LLVector2*)(mVertexData + offset); offset += 2*nverts;
|
||||
mScaledNormals = (LLVector4a*)(mVertexData + offset); offset += 4*nverts;
|
||||
mBinormals = (LLVector4a*)(mVertexData + offset); offset += 4*nverts;
|
||||
mScaledBinormals = (LLVector4a*)(mVertexData + offset); offset += 4*nverts;
|
||||
initializeForMorph();
|
||||
}
|
||||
}
|
||||
|
|
@ -906,7 +925,7 @@ void LLPolyMesh::dumpDiagInfo()
|
|||
//-----------------------------------------------------------------------------
|
||||
// getWritableCoords()
|
||||
//-----------------------------------------------------------------------------
|
||||
LLVector4 *LLPolyMesh::getWritableCoords()
|
||||
LLVector4a *LLPolyMesh::getWritableCoords()
|
||||
{
|
||||
return mCoords;
|
||||
}
|
||||
|
|
@ -914,7 +933,7 @@ LLVector4 *LLPolyMesh::getWritableCoords()
|
|||
//-----------------------------------------------------------------------------
|
||||
// getWritableNormals()
|
||||
//-----------------------------------------------------------------------------
|
||||
LLVector4 *LLPolyMesh::getWritableNormals()
|
||||
LLVector4a *LLPolyMesh::getWritableNormals()
|
||||
{
|
||||
return mNormals;
|
||||
}
|
||||
|
|
@ -922,7 +941,7 @@ LLVector4 *LLPolyMesh::getWritableNormals()
|
|||
//-----------------------------------------------------------------------------
|
||||
// getWritableBinormals()
|
||||
//-----------------------------------------------------------------------------
|
||||
LLVector3 *LLPolyMesh::getWritableBinormals()
|
||||
LLVector4a *LLPolyMesh::getWritableBinormals()
|
||||
{
|
||||
return mBinormals;
|
||||
}
|
||||
|
|
@ -931,7 +950,7 @@ LLVector3 *LLPolyMesh::getWritableBinormals()
|
|||
//-----------------------------------------------------------------------------
|
||||
// getWritableClothingWeights()
|
||||
//-----------------------------------------------------------------------------
|
||||
LLVector4 *LLPolyMesh::getWritableClothingWeights()
|
||||
LLVector4a *LLPolyMesh::getWritableClothingWeights()
|
||||
{
|
||||
return mClothingWeights;
|
||||
}
|
||||
|
|
@ -947,7 +966,7 @@ LLVector2 *LLPolyMesh::getWritableTexCoords()
|
|||
//-----------------------------------------------------------------------------
|
||||
// getScaledNormals()
|
||||
//-----------------------------------------------------------------------------
|
||||
LLVector3 *LLPolyMesh::getScaledNormals()
|
||||
LLVector4a *LLPolyMesh::getScaledNormals()
|
||||
{
|
||||
return mScaledNormals;
|
||||
}
|
||||
|
|
@ -955,7 +974,7 @@ LLVector3 *LLPolyMesh::getScaledNormals()
|
|||
//-----------------------------------------------------------------------------
|
||||
// getScaledBinormals()
|
||||
//-----------------------------------------------------------------------------
|
||||
LLVector3 *LLPolyMesh::getScaledBinormals()
|
||||
LLVector4a *LLPolyMesh::getScaledBinormals()
|
||||
{
|
||||
return mScaledBinormals;
|
||||
}
|
||||
|
|
@ -966,17 +985,17 @@ LLVector3 *LLPolyMesh::getScaledBinormals()
|
|||
//-----------------------------------------------------------------------------
|
||||
void LLPolyMesh::initializeForMorph()
|
||||
{
|
||||
for (U32 i = 0; i < mSharedData->mNumVertices; ++i)
|
||||
{
|
||||
mCoords[i] = LLVector4(mSharedData->mBaseCoords[i]);
|
||||
mNormals[i] = LLVector4(mSharedData->mBaseNormals[i]);
|
||||
}
|
||||
LLVector4a::memcpyNonAliased16((F32*) mCoords, (F32*) mSharedData->mBaseCoords, sizeof(LLVector4a) * mSharedData->mNumVertices);
|
||||
LLVector4a::memcpyNonAliased16((F32*) mNormals, (F32*) mSharedData->mBaseNormals, sizeof(LLVector4a) * mSharedData->mNumVertices);
|
||||
LLVector4a::memcpyNonAliased16((F32*) mScaledNormals, (F32*) mSharedData->mBaseNormals, sizeof(LLVector4a) * mSharedData->mNumVertices);
|
||||
LLVector4a::memcpyNonAliased16((F32*) mBinormals, (F32*) mSharedData->mBaseNormals, sizeof(LLVector4a) * mSharedData->mNumVertices);
|
||||
LLVector4a::memcpyNonAliased16((F32*) mScaledBinormals, (F32*) mSharedData->mBaseNormals, sizeof(LLVector4a) * mSharedData->mNumVertices);
|
||||
LLVector4a::memcpyNonAliased16((F32*) mTexCoords, (F32*) mSharedData->mTexCoords, sizeof(LLVector2) * (mSharedData->mNumVertices + mSharedData->mNumVertices%2));
|
||||
|
||||
memcpy(mScaledNormals, mSharedData->mBaseNormals, sizeof(LLVector3) * mSharedData->mNumVertices); /*Flawfinder: ignore*/
|
||||
memcpy(mBinormals, mSharedData->mBaseBinormals, sizeof(LLVector3) * mSharedData->mNumVertices); /*Flawfinder: ignore*/
|
||||
memcpy(mScaledBinormals, mSharedData->mBaseBinormals, sizeof(LLVector3) * mSharedData->mNumVertices); /*Flawfinder: ignore*/
|
||||
memcpy(mTexCoords, mSharedData->mTexCoords, sizeof(LLVector2) * mSharedData->mNumVertices); /*Flawfinder: ignore*/
|
||||
memset(mClothingWeights, 0, sizeof(LLVector4) * mSharedData->mNumVertices);
|
||||
for (U32 i = 0; i < mSharedData->mNumVertices; ++i)
|
||||
{
|
||||
mClothingWeights[i].clear();
|
||||
}
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
|
|
@ -1098,7 +1117,7 @@ BOOL LLPolySkeletalDistortionInfo::parseXml(LLXmlTreeNode* node)
|
|||
LLPolySkeletalDistortion::LLPolySkeletalDistortion(LLVOAvatar *avatarp)
|
||||
{
|
||||
mAvatar = avatarp;
|
||||
mDefaultVec.setVec(0.001f, 0.001f, 0.001f);
|
||||
mDefaultVec.splat(0.001f);
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
|
|
@ -1171,8 +1190,12 @@ BOOL LLPolySkeletalDistortion::setInfo(LLPolySkeletalDistortionInfo *info)
|
|||
//-----------------------------------------------------------------------------
|
||||
// apply()
|
||||
//-----------------------------------------------------------------------------
|
||||
static LLFastTimer::DeclareTimer FTM_POLYSKELETAL_DISTORTION_APPLY("Skeletal Distortion");
|
||||
|
||||
void LLPolySkeletalDistortion::apply( ESex avatar_sex )
|
||||
{
|
||||
LLFastTimer t(FTM_POLYSKELETAL_DISTORTION_APPLY);
|
||||
|
||||
F32 effective_weight = ( getSex() & avatar_sex ) ? mCurWeight : getDefaultWeight();
|
||||
|
||||
LLJoint* joint;
|
||||
|
|
@ -1228,11 +1251,14 @@ LLPolyMorphData *clone_morph_param_direction(const LLPolyMorphData *src_data,
|
|||
{
|
||||
LLPolyMorphData* cloned_morph_data = new LLPolyMorphData(*src_data);
|
||||
cloned_morph_data->mName = name;
|
||||
LLVector4a dir;
|
||||
dir.load3(direction.mV);
|
||||
|
||||
for (U32 v=0; v < cloned_morph_data->mNumIndices; v++)
|
||||
{
|
||||
cloned_morph_data->mCoords[v] = direction;
|
||||
cloned_morph_data->mNormals[v] = LLVector3(0,0,0);
|
||||
cloned_morph_data->mBinormals[v] = LLVector3(0,0,0);
|
||||
cloned_morph_data->mCoords[v] = dir;
|
||||
cloned_morph_data->mNormals[v].clear();
|
||||
cloned_morph_data->mBinormals[v].clear();
|
||||
}
|
||||
return cloned_morph_data;
|
||||
}
|
||||
|
|
@ -1243,17 +1269,27 @@ LLPolyMorphData *clone_morph_param_cleavage(const LLPolyMorphData *src_data,
|
|||
{
|
||||
LLPolyMorphData* cloned_morph_data = new LLPolyMorphData(*src_data);
|
||||
cloned_morph_data->mName = name;
|
||||
|
||||
LLVector4a sc;
|
||||
sc.splat(scale);
|
||||
|
||||
LLVector4a nsc;
|
||||
nsc.set(scale, -scale, scale, scale);
|
||||
|
||||
for (U32 v=0; v < cloned_morph_data->mNumIndices; v++)
|
||||
{
|
||||
cloned_morph_data->mCoords[v] = src_data->mCoords[v]*scale;
|
||||
cloned_morph_data->mNormals[v] = src_data->mNormals[v]*scale;
|
||||
cloned_morph_data->mBinormals[v] = src_data->mBinormals[v]*scale;
|
||||
if (cloned_morph_data->mCoords[v][1] < 0)
|
||||
{
|
||||
cloned_morph_data->mCoords[v][1] *= -1;
|
||||
cloned_morph_data->mNormals[v][1] *= -1;
|
||||
cloned_morph_data->mBinormals[v][1] *= -1;
|
||||
}
|
||||
if (cloned_morph_data->mCoords[v][1] < 0)
|
||||
{
|
||||
cloned_morph_data->mCoords[v].setMul(src_data->mCoords[v],nsc);
|
||||
cloned_morph_data->mNormals[v].setMul(src_data->mNormals[v],nsc);
|
||||
cloned_morph_data->mBinormals[v].setMul(src_data->mBinormals[v],nsc);
|
||||
}
|
||||
else
|
||||
{
|
||||
cloned_morph_data->mCoords[v].setMul(src_data->mCoords[v],sc);
|
||||
cloned_morph_data->mNormals[v].setMul(src_data->mNormals[v], sc);
|
||||
cloned_morph_data->mBinormals[v].setMul(src_data->mBinormals[v],sc);
|
||||
}
|
||||
}
|
||||
return cloned_morph_data;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -73,9 +73,9 @@ private:
|
|||
|
||||
// vertex data
|
||||
S32 mNumVertices;
|
||||
LLVector3 *mBaseCoords;
|
||||
LLVector3 *mBaseNormals;
|
||||
LLVector3 *mBaseBinormals;
|
||||
LLVector4a *mBaseCoords;
|
||||
LLVector4a *mBaseNormals;
|
||||
LLVector4a *mBaseBinormals;
|
||||
LLVector2 *mTexCoords;
|
||||
LLVector2 *mDetailTexCoords;
|
||||
F32 *mWeights;
|
||||
|
|
@ -217,41 +217,41 @@ public:
|
|||
}
|
||||
|
||||
// Get coords
|
||||
const LLVector4 *getCoords() const{
|
||||
const LLVector4a *getCoords() const{
|
||||
return mCoords;
|
||||
}
|
||||
|
||||
// non const version
|
||||
LLVector4 *getWritableCoords();
|
||||
LLVector4a *getWritableCoords();
|
||||
|
||||
// Get normals
|
||||
const LLVector4 *getNormals() const{
|
||||
const LLVector4a *getNormals() const{
|
||||
return mNormals;
|
||||
}
|
||||
|
||||
// Get normals
|
||||
const LLVector3 *getBinormals() const{
|
||||
const LLVector4a *getBinormals() const{
|
||||
return mBinormals;
|
||||
}
|
||||
|
||||
// Get base mesh normals
|
||||
const LLVector3 *getBaseNormals() const{
|
||||
const LLVector4a *getBaseNormals() const{
|
||||
llassert(mSharedData);
|
||||
return mSharedData->mBaseNormals;
|
||||
}
|
||||
|
||||
// Get base mesh normals
|
||||
const LLVector3 *getBaseBinormals() const{
|
||||
const LLVector4a *getBaseBinormals() const{
|
||||
llassert(mSharedData);
|
||||
return mSharedData->mBaseBinormals;
|
||||
}
|
||||
|
||||
// intermediate morphed normals and output normals
|
||||
LLVector4 *getWritableNormals();
|
||||
LLVector3 *getScaledNormals();
|
||||
LLVector4a *getWritableNormals();
|
||||
LLVector4a *getScaledNormals();
|
||||
|
||||
LLVector3 *getWritableBinormals();
|
||||
LLVector3 *getScaledBinormals();
|
||||
LLVector4a *getWritableBinormals();
|
||||
LLVector4a *getScaledBinormals();
|
||||
|
||||
// Get texCoords
|
||||
const LLVector2 *getTexCoords() const {
|
||||
|
|
@ -275,9 +275,9 @@ public:
|
|||
|
||||
F32 *getWritableWeights() const;
|
||||
|
||||
LLVector4 *getWritableClothingWeights();
|
||||
LLVector4a *getWritableClothingWeights();
|
||||
|
||||
const LLVector4 *getClothingWeights()
|
||||
const LLVector4a *getClothingWeights()
|
||||
{
|
||||
return mClothingWeights;
|
||||
}
|
||||
|
|
@ -341,17 +341,17 @@ protected:
|
|||
// Single array of floats for allocation / deletion
|
||||
F32 *mVertexData;
|
||||
// deformed vertices (resulting from application of morph targets)
|
||||
LLVector4 *mCoords;
|
||||
LLVector4a *mCoords;
|
||||
// deformed normals (resulting from application of morph targets)
|
||||
LLVector3 *mScaledNormals;
|
||||
LLVector4a *mScaledNormals;
|
||||
// output normals (after normalization)
|
||||
LLVector4 *mNormals;
|
||||
LLVector4a *mNormals;
|
||||
// deformed binormals (resulting from application of morph targets)
|
||||
LLVector3 *mScaledBinormals;
|
||||
LLVector4a *mScaledBinormals;
|
||||
// output binormals (after normalization)
|
||||
LLVector3 *mBinormals;
|
||||
LLVector4a *mBinormals;
|
||||
// weight values that mark verts as clothing/skin
|
||||
LLVector4 *mClothingWeights;
|
||||
LLVector4a *mClothingWeights;
|
||||
// output texture coordinates
|
||||
LLVector2 *mTexCoords;
|
||||
|
||||
|
|
@ -419,17 +419,17 @@ public:
|
|||
|
||||
// LLViewerVisualParam Virtual functions
|
||||
/*virtual*/ F32 getTotalDistortion() { return 0.1f; }
|
||||
/*virtual*/ const LLVector3& getAvgDistortion() { return mDefaultVec; }
|
||||
/*virtual*/ const LLVector4a& getAvgDistortion() { return mDefaultVec; }
|
||||
/*virtual*/ F32 getMaxDistortion() { return 0.1f; }
|
||||
/*virtual*/ LLVector3 getVertexDistortion(S32 index, LLPolyMesh *poly_mesh){return LLVector3(0.001f, 0.001f, 0.001f);}
|
||||
/*virtual*/ const LLVector3* getFirstDistortion(U32 *index, LLPolyMesh **poly_mesh){index = 0; poly_mesh = NULL; return &mDefaultVec;};
|
||||
/*virtual*/ const LLVector3* getNextDistortion(U32 *index, LLPolyMesh **poly_mesh){index = 0; poly_mesh = NULL; return NULL;};
|
||||
/*virtual*/ LLVector4a getVertexDistortion(S32 index, LLPolyMesh *poly_mesh){return LLVector4a(0.001f, 0.001f, 0.001f);}
|
||||
/*virtual*/ const LLVector4a* getFirstDistortion(U32 *index, LLPolyMesh **poly_mesh){index = 0; poly_mesh = NULL; return &mDefaultVec;};
|
||||
/*virtual*/ const LLVector4a* getNextDistortion(U32 *index, LLPolyMesh **poly_mesh){index = 0; poly_mesh = NULL; return NULL;};
|
||||
|
||||
protected:
|
||||
typedef std::map<LLJoint*, LLVector3> joint_vec_map_t;
|
||||
joint_vec_map_t mJointScales;
|
||||
joint_vec_map_t mJointOffsets;
|
||||
LLVector3 mDefaultVec;
|
||||
LLVector4a mDefaultVec;
|
||||
// Backlink only; don't make this an LLPointer.
|
||||
LLVOAvatar *mAvatar;
|
||||
};
|
||||
|
|
|
|||
|
|
@ -48,7 +48,7 @@ LLPolyMorphData::LLPolyMorphData(const std::string& morph_name)
|
|||
mNumIndices = 0;
|
||||
mCurrentIndex = 0;
|
||||
mTotalDistortion = 0.f;
|
||||
mAvgDistortion.zeroVec();
|
||||
mAvgDistortion.clear();
|
||||
mMaxDistortion = 0.f;
|
||||
mVertexIndices = NULL;
|
||||
mCoords = NULL;
|
||||
|
|
@ -73,9 +73,9 @@ LLPolyMorphData::LLPolyMorphData(const LLPolyMorphData &rhs) :
|
|||
{
|
||||
const S32 numVertices = mNumIndices;
|
||||
|
||||
mCoords = new LLVector3[numVertices];
|
||||
mNormals = new LLVector3[numVertices];
|
||||
mBinormals = new LLVector3[numVertices];
|
||||
mCoords = new LLVector4a[numVertices];
|
||||
mNormals = new LLVector4a[numVertices];
|
||||
mBinormals = new LLVector4a[numVertices];
|
||||
mTexCoords = new LLVector2[numVertices];
|
||||
mVertexIndices = new U32[numVertices];
|
||||
|
||||
|
|
@ -121,16 +121,16 @@ BOOL LLPolyMorphData::loadBinary(LLFILE *fp, LLPolyMeshSharedData *mesh)
|
|||
//-------------------------------------------------------------------------
|
||||
// allocate vertices
|
||||
//-------------------------------------------------------------------------
|
||||
mCoords = new LLVector3[numVertices];
|
||||
mNormals = new LLVector3[numVertices];
|
||||
mBinormals = new LLVector3[numVertices];
|
||||
mCoords = new LLVector4a[numVertices];
|
||||
mNormals = new LLVector4a[numVertices];
|
||||
mBinormals = new LLVector4a[numVertices];
|
||||
mTexCoords = new LLVector2[numVertices];
|
||||
// Actually, we are allocating more space than we need for the skiplist
|
||||
mVertexIndices = new U32[numVertices];
|
||||
mNumIndices = 0;
|
||||
mTotalDistortion = 0.f;
|
||||
mMaxDistortion = 0.f;
|
||||
mAvgDistortion.zeroVec();
|
||||
mAvgDistortion.clear();
|
||||
mMesh = mesh;
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
|
@ -152,36 +152,36 @@ BOOL LLPolyMorphData::loadBinary(LLFILE *fp, LLPolyMeshSharedData *mesh)
|
|||
}
|
||||
|
||||
|
||||
numRead = fread(&mCoords[v].mV, sizeof(F32), 3, fp);
|
||||
llendianswizzle(&mCoords[v].mV, sizeof(F32), 3);
|
||||
numRead = fread(&mCoords[v], sizeof(F32), 3, fp);
|
||||
llendianswizzle(&mCoords[v], sizeof(F32), 3);
|
||||
if (numRead != 3)
|
||||
{
|
||||
llwarns << "Can't read morph target vertex coordinates" << llendl;
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
F32 magnitude = mCoords[v].magVec();
|
||||
F32 magnitude = mCoords[v].getLength3().getF32();
|
||||
|
||||
mTotalDistortion += magnitude;
|
||||
mAvgDistortion.mV[VX] += fabs(mCoords[v].mV[VX]);
|
||||
mAvgDistortion.mV[VY] += fabs(mCoords[v].mV[VY]);
|
||||
mAvgDistortion.mV[VZ] += fabs(mCoords[v].mV[VZ]);
|
||||
LLVector4a t;
|
||||
t.setAbs(mCoords[v]);
|
||||
mAvgDistortion.add(t);
|
||||
|
||||
if (magnitude > mMaxDistortion)
|
||||
{
|
||||
mMaxDistortion = magnitude;
|
||||
}
|
||||
|
||||
numRead = fread(&mNormals[v].mV, sizeof(F32), 3, fp);
|
||||
llendianswizzle(&mNormals[v].mV, sizeof(F32), 3);
|
||||
numRead = fread(&mNormals[v], sizeof(F32), 3, fp);
|
||||
llendianswizzle(&mNormals[v], sizeof(F32), 3);
|
||||
if (numRead != 3)
|
||||
{
|
||||
llwarns << "Can't read morph target normal" << llendl;
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
numRead = fread(&mBinormals[v].mV, sizeof(F32), 3, fp);
|
||||
llendianswizzle(&mBinormals[v].mV, sizeof(F32), 3);
|
||||
numRead = fread(&mBinormals[v], sizeof(F32), 3, fp);
|
||||
llendianswizzle(&mBinormals[v], sizeof(F32), 3);
|
||||
if (numRead != 3)
|
||||
{
|
||||
llwarns << "Can't read morph target binormal" << llendl;
|
||||
|
|
@ -200,8 +200,8 @@ BOOL LLPolyMorphData::loadBinary(LLFILE *fp, LLPolyMeshSharedData *mesh)
|
|||
mNumIndices++;
|
||||
}
|
||||
|
||||
mAvgDistortion = mAvgDistortion * (1.f/(F32)mNumIndices);
|
||||
mAvgDistortion.normVec();
|
||||
mAvgDistortion.mul(1.f/(F32)mNumIndices);
|
||||
mAvgDistortion.normalize3fast();
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
|
@ -367,9 +367,9 @@ BOOL LLPolyMorphTarget::parseData(LLXmlTreeNode* node)
|
|||
//-----------------------------------------------------------------------------
|
||||
// getVertexDistortion()
|
||||
//-----------------------------------------------------------------------------
|
||||
LLVector3 LLPolyMorphTarget::getVertexDistortion(S32 requested_index, LLPolyMesh *mesh)
|
||||
LLVector4a LLPolyMorphTarget::getVertexDistortion(S32 requested_index, LLPolyMesh *mesh)
|
||||
{
|
||||
if (!mMorphData || mMesh != mesh) return LLVector3::zero;
|
||||
if (!mMorphData || mMesh != mesh) return LLVector4a::getZero();
|
||||
|
||||
for(U32 index = 0; index < mMorphData->mNumIndices; index++)
|
||||
{
|
||||
|
|
@ -379,17 +379,17 @@ LLVector3 LLPolyMorphTarget::getVertexDistortion(S32 requested_index, LLPolyMesh
|
|||
}
|
||||
}
|
||||
|
||||
return LLVector3::zero;
|
||||
return LLVector4a::getZero();
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// getFirstDistortion()
|
||||
//-----------------------------------------------------------------------------
|
||||
const LLVector3 *LLPolyMorphTarget::getFirstDistortion(U32 *index, LLPolyMesh **poly_mesh)
|
||||
const LLVector4a *LLPolyMorphTarget::getFirstDistortion(U32 *index, LLPolyMesh **poly_mesh)
|
||||
{
|
||||
if (!mMorphData) return &LLVector3::zero;
|
||||
if (!mMorphData) return &LLVector4a::getZero();
|
||||
|
||||
LLVector3* resultVec;
|
||||
LLVector4a* resultVec;
|
||||
mMorphData->mCurrentIndex = 0;
|
||||
if (mMorphData->mNumIndices)
|
||||
{
|
||||
|
|
@ -411,11 +411,11 @@ const LLVector3 *LLPolyMorphTarget::getFirstDistortion(U32 *index, LLPolyMesh **
|
|||
//-----------------------------------------------------------------------------
|
||||
// getNextDistortion()
|
||||
//-----------------------------------------------------------------------------
|
||||
const LLVector3 *LLPolyMorphTarget::getNextDistortion(U32 *index, LLPolyMesh **poly_mesh)
|
||||
const LLVector4a *LLPolyMorphTarget::getNextDistortion(U32 *index, LLPolyMesh **poly_mesh)
|
||||
{
|
||||
if (!mMorphData) return &LLVector3::zero;
|
||||
if (!mMorphData) return &LLVector4a::getZero();
|
||||
|
||||
LLVector3* resultVec;
|
||||
LLVector4a* resultVec;
|
||||
mMorphData->mCurrentIndex++;
|
||||
if (mMorphData->mCurrentIndex < mMorphData->mNumIndices)
|
||||
{
|
||||
|
|
@ -451,7 +451,7 @@ F32 LLPolyMorphTarget::getTotalDistortion()
|
|||
//-----------------------------------------------------------------------------
|
||||
// getAvgDistortion()
|
||||
//-----------------------------------------------------------------------------
|
||||
const LLVector3& LLPolyMorphTarget::getAvgDistortion()
|
||||
const LLVector4a& LLPolyMorphTarget::getAvgDistortion()
|
||||
{
|
||||
if (mMorphData)
|
||||
{
|
||||
|
|
@ -459,7 +459,7 @@ const LLVector3& LLPolyMorphTarget::getAvgDistortion()
|
|||
}
|
||||
else
|
||||
{
|
||||
return LLVector3::zero;
|
||||
return LLVector4a::getZero();
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -481,6 +481,8 @@ F32 LLPolyMorphTarget::getMaxDistortion()
|
|||
//-----------------------------------------------------------------------------
|
||||
// apply()
|
||||
//-----------------------------------------------------------------------------
|
||||
static LLFastTimer::DeclareTimer FTM_APPLY_MORPH_TARGET("Apply Morph");
|
||||
|
||||
void LLPolyMorphTarget::apply( ESex avatar_sex )
|
||||
{
|
||||
if (!mMorphData || mNumMorphMasksPending > 0)
|
||||
|
|
@ -488,6 +490,8 @@ void LLPolyMorphTarget::apply( ESex avatar_sex )
|
|||
return;
|
||||
}
|
||||
|
||||
LLFastTimer t(FTM_APPLY_MORPH_TARGET);
|
||||
|
||||
mLastSex = avatar_sex;
|
||||
|
||||
// Check for NaN condition (NaN is detected if a variable doesn't equal itself.
|
||||
|
|
@ -508,15 +512,15 @@ void LLPolyMorphTarget::apply( ESex avatar_sex )
|
|||
if (delta_weight != 0.f)
|
||||
{
|
||||
llassert(!mMesh->isLOD());
|
||||
LLVector4 *coords = mMesh->getWritableCoords();
|
||||
LLVector4a *coords = mMesh->getWritableCoords();
|
||||
|
||||
LLVector3 *scaled_normals = mMesh->getScaledNormals();
|
||||
LLVector4 *normals = mMesh->getWritableNormals();
|
||||
LLVector4a *scaled_normals = mMesh->getScaledNormals();
|
||||
LLVector4a *normals = mMesh->getWritableNormals();
|
||||
|
||||
LLVector3 *scaled_binormals = mMesh->getScaledBinormals();
|
||||
LLVector3 *binormals = mMesh->getWritableBinormals();
|
||||
LLVector4a *scaled_binormals = mMesh->getScaledBinormals();
|
||||
LLVector4a *binormals = mMesh->getWritableBinormals();
|
||||
|
||||
LLVector4 *clothing_weights = mMesh->getWritableClothingWeights();
|
||||
LLVector4a *clothing_weights = mMesh->getWritableClothingWeights();
|
||||
LLVector2 *tex_coords = mMesh->getWritableTexCoords();
|
||||
|
||||
F32 *maskWeightArray = (mVertMask) ? mVertMask->getMorphMaskWeights() : NULL;
|
||||
|
|
@ -531,31 +535,38 @@ void LLPolyMorphTarget::apply( ESex avatar_sex )
|
|||
maskWeight = maskWeightArray[vert_index_morph];
|
||||
}
|
||||
|
||||
coords[vert_index_mesh] += LLVector4(mMorphData->mCoords[vert_index_morph] * delta_weight * maskWeight);
|
||||
|
||||
LLVector4a pos = mMorphData->mCoords[vert_index_morph];
|
||||
pos.mul(delta_weight*maskWeight);
|
||||
coords[vert_index_mesh].add(pos);
|
||||
|
||||
if (getInfo()->mIsClothingMorph && clothing_weights)
|
||||
{
|
||||
LLVector3 clothing_offset = mMorphData->mCoords[vert_index_morph] * delta_weight * maskWeight;
|
||||
LLVector4* clothing_weight = &clothing_weights[vert_index_mesh];
|
||||
clothing_weight->mV[VX] += clothing_offset.mV[VX];
|
||||
clothing_weight->mV[VY] += clothing_offset.mV[VY];
|
||||
clothing_weight->mV[VZ] += clothing_offset.mV[VZ];
|
||||
clothing_weight->mV[VW] = maskWeight;
|
||||
LLVector4a clothing_offset = mMorphData->mCoords[vert_index_morph];
|
||||
clothing_offset.mul(delta_weight * maskWeight);
|
||||
LLVector4a* clothing_weight = &clothing_weights[vert_index_mesh];
|
||||
clothing_weight->add(clothing_offset);
|
||||
clothing_weight->getF32ptr()[VW] = maskWeight;
|
||||
}
|
||||
|
||||
// calculate new normals based on half angles
|
||||
scaled_normals[vert_index_mesh] += mMorphData->mNormals[vert_index_morph] * delta_weight * maskWeight * NORMAL_SOFTEN_FACTOR;
|
||||
LLVector3 normalized_normal = scaled_normals[vert_index_mesh];
|
||||
normalized_normal.normVec();
|
||||
normals[vert_index_mesh] = LLVector4(normalized_normal);
|
||||
LLVector4a norm = mMorphData->mNormals[vert_index_morph];
|
||||
norm.mul(delta_weight*maskWeight*NORMAL_SOFTEN_FACTOR);
|
||||
scaled_normals[vert_index_mesh].add(norm);
|
||||
norm = scaled_normals[vert_index_mesh];
|
||||
norm.normalize3fast();
|
||||
normals[vert_index_mesh] = norm;
|
||||
|
||||
// calculate new binormals
|
||||
scaled_binormals[vert_index_mesh] += mMorphData->mBinormals[vert_index_morph] * delta_weight * maskWeight * NORMAL_SOFTEN_FACTOR;
|
||||
LLVector3 tangent = scaled_binormals[vert_index_mesh] % normalized_normal;
|
||||
LLVector3 normalized_binormal = normalized_normal % tangent;
|
||||
normalized_binormal.normVec();
|
||||
binormals[vert_index_mesh] = normalized_binormal;
|
||||
|
||||
LLVector4a binorm = mMorphData->mBinormals[vert_index_morph];
|
||||
binorm.mul(delta_weight*maskWeight*NORMAL_SOFTEN_FACTOR);
|
||||
scaled_binormals[vert_index_mesh].add(binorm);
|
||||
LLVector4a tangent;
|
||||
tangent.setCross3(scaled_binormals[vert_index_mesh], norm);
|
||||
LLVector4a& normalized_binormal = binormals[vert_index_mesh];
|
||||
normalized_binormal.setCross3(norm, tangent);
|
||||
normalized_binormal.normalize3fast();
|
||||
|
||||
tex_coords[vert_index_mesh] += mMorphData->mTexCoords[vert_index_morph] * delta_weight * maskWeight;
|
||||
}
|
||||
|
||||
|
|
@ -582,7 +593,7 @@ void LLPolyMorphTarget::apply( ESex avatar_sex )
|
|||
//-----------------------------------------------------------------------------
|
||||
void LLPolyMorphTarget::applyMask(U8 *maskTextureData, S32 width, S32 height, S32 num_components, BOOL invert)
|
||||
{
|
||||
LLVector4 *clothing_weights = getInfo()->mIsClothingMorph ? mMesh->getWritableClothingWeights() : NULL;
|
||||
LLVector4a *clothing_weights = getInfo()->mIsClothingMorph ? mMesh->getWritableClothingWeights() : NULL;
|
||||
|
||||
if (!mVertMask)
|
||||
{
|
||||
|
|
@ -596,29 +607,47 @@ void LLPolyMorphTarget::applyMask(U8 *maskTextureData, S32 width, S32 height, S3
|
|||
|
||||
if (maskWeights)
|
||||
{
|
||||
LLVector4 *coords = mMesh->getWritableCoords();
|
||||
LLVector3 *scaled_normals = mMesh->getScaledNormals();
|
||||
LLVector3 *scaled_binormals = mMesh->getScaledBinormals();
|
||||
LLVector4a *coords = mMesh->getWritableCoords();
|
||||
LLVector4a *scaled_normals = mMesh->getScaledNormals();
|
||||
LLVector4a *scaled_binormals = mMesh->getScaledBinormals();
|
||||
LLVector2 *tex_coords = mMesh->getWritableTexCoords();
|
||||
|
||||
LLVector4Logical clothing_mask;
|
||||
clothing_mask.clear();
|
||||
clothing_mask.setElement<0>();
|
||||
clothing_mask.setElement<1>();
|
||||
clothing_mask.setElement<2>();
|
||||
|
||||
|
||||
for(U32 vert = 0; vert < mMorphData->mNumIndices; vert++)
|
||||
{
|
||||
F32 lastMaskWeight = mLastWeight * maskWeights[vert];
|
||||
S32 out_vert = mMorphData->mVertexIndices[vert];
|
||||
|
||||
// remove effect of existing masked morph
|
||||
coords[out_vert] -= LLVector4(mMorphData->mCoords[vert]) * lastMaskWeight;
|
||||
scaled_normals[out_vert] -= mMorphData->mNormals[vert] * lastMaskWeight * NORMAL_SOFTEN_FACTOR;
|
||||
scaled_binormals[out_vert] -= mMorphData->mBinormals[vert] * lastMaskWeight * NORMAL_SOFTEN_FACTOR;
|
||||
LLVector4a t;
|
||||
t = mMorphData->mCoords[vert];
|
||||
t.mul(lastMaskWeight);
|
||||
coords[out_vert].sub(t);
|
||||
|
||||
t = mMorphData->mNormals[vert];
|
||||
t.mul(lastMaskWeight*NORMAL_SOFTEN_FACTOR);
|
||||
scaled_normals[out_vert].sub(t);
|
||||
|
||||
t = mMorphData->mBinormals[vert];
|
||||
t.mul(lastMaskWeight*NORMAL_SOFTEN_FACTOR);
|
||||
scaled_binormals[out_vert].sub(t);
|
||||
|
||||
tex_coords[out_vert] -= mMorphData->mTexCoords[vert] * lastMaskWeight;
|
||||
|
||||
if (clothing_weights)
|
||||
{
|
||||
LLVector3 clothing_offset = mMorphData->mCoords[vert] * lastMaskWeight;
|
||||
LLVector4* clothing_weight = &clothing_weights[out_vert];
|
||||
clothing_weight->mV[VX] -= clothing_offset.mV[VX];
|
||||
clothing_weight->mV[VY] -= clothing_offset.mV[VY];
|
||||
clothing_weight->mV[VZ] -= clothing_offset.mV[VZ];
|
||||
LLVector4a clothing_offset = mMorphData->mCoords[vert];
|
||||
clothing_offset.mul(lastMaskWeight);
|
||||
LLVector4a* clothing_weight = &clothing_weights[out_vert];
|
||||
LLVector4a t;
|
||||
t.setSub(*clothing_weight, clothing_offset);
|
||||
clothing_weight->setSelectWithMask(clothing_mask, t, *clothing_weight);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -654,7 +683,7 @@ LLPolyVertexMask::~LLPolyVertexMask()
|
|||
//-----------------------------------------------------------------------------
|
||||
// generateMask()
|
||||
//-----------------------------------------------------------------------------
|
||||
void LLPolyVertexMask::generateMask(U8 *maskTextureData, S32 width, S32 height, S32 num_components, BOOL invert, LLVector4 *clothing_weights)
|
||||
void LLPolyVertexMask::generateMask(U8 *maskTextureData, S32 width, S32 height, S32 num_components, BOOL invert, LLVector4a *clothing_weights)
|
||||
{
|
||||
// RN debug output that uses Image Debugger (http://www.cs.unc.edu/~baxter/projects/imdebug/)
|
||||
// BOOL debugImg = FALSE;
|
||||
|
|
@ -698,7 +727,7 @@ void LLPolyVertexMask::generateMask(U8 *maskTextureData, S32 width, S32 height,
|
|||
|
||||
if (clothing_weights)
|
||||
{
|
||||
clothing_weights[vertIndex].mV[VW] = mWeights[index];
|
||||
clothing_weights[vertIndex].getF32ptr()[VW] = mWeights[index];
|
||||
}
|
||||
}
|
||||
mWeightsGenerated = TRUE;
|
||||
|
|
|
|||
|
|
@ -58,14 +58,14 @@ public:
|
|||
U32 mNumIndices;
|
||||
U32* mVertexIndices;
|
||||
U32 mCurrentIndex;
|
||||
LLVector3* mCoords;
|
||||
LLVector3* mNormals;
|
||||
LLVector3* mBinormals;
|
||||
LLVector4a* mCoords;
|
||||
LLVector4a* mNormals;
|
||||
LLVector4a* mBinormals;
|
||||
LLVector2* mTexCoords;
|
||||
|
||||
F32 mTotalDistortion; // vertex distortion summed over entire morph
|
||||
F32 mMaxDistortion; // maximum single vertex distortion in a given morph
|
||||
LLVector3 mAvgDistortion; // average vertex distortion, to infer directionality of the morph
|
||||
LLVector4a mAvgDistortion; // average vertex distortion, to infer directionality of the morph
|
||||
LLPolyMeshSharedData* mMesh;
|
||||
};
|
||||
|
||||
|
|
@ -78,7 +78,7 @@ public:
|
|||
LLPolyVertexMask(LLPolyMorphData* morph_data);
|
||||
~LLPolyVertexMask();
|
||||
|
||||
void generateMask(U8 *maskData, S32 width, S32 height, S32 num_components, BOOL invert, LLVector4 *clothing_weights);
|
||||
void generateMask(U8 *maskData, S32 width, S32 height, S32 num_components, BOOL invert, LLVector4a *clothing_weights);
|
||||
F32* getMorphMaskWeights();
|
||||
|
||||
|
||||
|
|
@ -157,11 +157,11 @@ public:
|
|||
|
||||
// LLViewerVisualParam Virtual functions
|
||||
/*virtual*/ F32 getTotalDistortion();
|
||||
/*virtual*/ const LLVector3& getAvgDistortion();
|
||||
/*virtual*/ const LLVector4a& getAvgDistortion();
|
||||
/*virtual*/ F32 getMaxDistortion();
|
||||
/*virtual*/ LLVector3 getVertexDistortion(S32 index, LLPolyMesh *poly_mesh);
|
||||
/*virtual*/ const LLVector3* getFirstDistortion(U32 *index, LLPolyMesh **poly_mesh);
|
||||
/*virtual*/ const LLVector3* getNextDistortion(U32 *index, LLPolyMesh **poly_mesh);
|
||||
/*virtual*/ LLVector4a getVertexDistortion(S32 index, LLPolyMesh *poly_mesh);
|
||||
/*virtual*/ const LLVector4a* getFirstDistortion(U32 *index, LLPolyMesh **poly_mesh);
|
||||
/*virtual*/ const LLVector4a* getNextDistortion(U32 *index, LLPolyMesh **poly_mesh);
|
||||
|
||||
void applyMask(U8 *maskData, S32 width, S32 height, S32 num_components, BOOL invert);
|
||||
void addPendingMorphMask() { mNumMorphMasksPending++; }
|
||||
|
|
|
|||
|
|
@ -362,7 +362,7 @@ void LLSidepanelItemInfo::refreshFromItem(LLViewerInventoryItem* item)
|
|||
getChildView("BtnCreator")->setEnabled(FALSE);
|
||||
getChildView("LabelCreatorTitle")->setEnabled(FALSE);
|
||||
getChildView("LabelCreatorName")->setEnabled(FALSE);
|
||||
getChild<LLUICtrl>("LabelCreatorName")->setValue(getString("unknown"));
|
||||
getChild<LLUICtrl>("LabelCreatorName")->setValue(getString("unknown_multiple"));
|
||||
}
|
||||
|
||||
////////////////
|
||||
|
|
|
|||
|
|
@ -68,6 +68,7 @@ const F32 SG_OCCLUSION_FUDGE = 0.25f;
|
|||
#define assert_states_valid(x)
|
||||
#endif
|
||||
|
||||
extern bool gShiftFrame;
|
||||
|
||||
// <FS:ND> helper to extract the tree data before iterating over it
|
||||
bool extractDrawables( const LLSpatialGroup::OctreeNode* branch, std::vector< LLPointer< LLDrawable > >& );
|
||||
|
|
@ -534,6 +535,7 @@ void LLSpatialGroup::setVisible()
|
|||
|
||||
void LLSpatialGroup::validate()
|
||||
{
|
||||
ll_assert_aligned(this,64);
|
||||
#if LL_OCTREE_PARANOIA_CHECK
|
||||
|
||||
sg_assert(!isState(DIRTY));
|
||||
|
|
@ -546,7 +548,7 @@ void LLSpatialGroup::validate()
|
|||
|
||||
validateDrawMap();
|
||||
|
||||
for (element_iter i = getData().begin(); i != getData().end(); ++i)
|
||||
for (element_iter i = getDataBegin(); i != getDataEnd(); ++i)
|
||||
{
|
||||
LLDrawable* drawable = *i;
|
||||
sg_assert(drawable->getSpatialGroup() == this);
|
||||
|
|
@ -763,7 +765,7 @@ BOOL LLSpatialGroup::boundObjects(BOOL empty, LLVector4a& minOut, LLVector4a& ma
|
|||
{
|
||||
const OctreeNode* node = mOctreeNode;
|
||||
|
||||
if (node->getData().empty())
|
||||
if (node->isEmpty())
|
||||
{ //don't do anything if there are no objects
|
||||
if (empty && mOctreeNode->getParent())
|
||||
{ //only root is allowed to be empty
|
||||
|
|
@ -780,14 +782,14 @@ BOOL LLSpatialGroup::boundObjects(BOOL empty, LLVector4a& minOut, LLVector4a& ma
|
|||
clearState(OBJECT_DIRTY);
|
||||
|
||||
//initialize bounding box to first element
|
||||
OctreeNode::const_element_iter i = node->getData().begin();
|
||||
OctreeNode::const_element_iter i = node->getDataBegin();
|
||||
LLDrawable* drawablep = *i;
|
||||
const LLVector4a* minMax = drawablep->getSpatialExtents();
|
||||
|
||||
newMin = minMax[0];
|
||||
newMax = minMax[1];
|
||||
|
||||
for (++i; i != node->getData().end(); ++i)
|
||||
for (++i; i != node->getDataEnd(); ++i)
|
||||
{
|
||||
drawablep = *i;
|
||||
minMax = drawablep->getSpatialExtents();
|
||||
|
|
@ -928,7 +930,10 @@ void LLSpatialGroup::shift(const LLVector4a &offset)
|
|||
mObjectExtents[0].add(offset);
|
||||
mObjectExtents[1].add(offset);
|
||||
|
||||
//if (!mSpatialPartition->mRenderByGroup)
|
||||
if (!mSpatialPartition->mRenderByGroup &&
|
||||
mSpatialPartition->mPartitionType != LLViewerRegion::PARTITION_TREE &&
|
||||
mSpatialPartition->mPartitionType != LLViewerRegion::PARTITION_TERRAIN &&
|
||||
mSpatialPartition->mPartitionType != LLViewerRegion::PARTITION_BRIDGE)
|
||||
{
|
||||
setState(GEOM_DIRTY);
|
||||
gPipeline.markRebuild(this, TRUE);
|
||||
|
|
@ -1200,6 +1205,8 @@ LLSpatialGroup::LLSpatialGroup(OctreeNode* node, LLSpatialPartition* part) :
|
|||
mCurUpdatingSlotp(NULL),
|
||||
mCurUpdatingTexture (NULL)
|
||||
{
|
||||
ll_assert_aligned(this,16);
|
||||
|
||||
sNodeCount++;
|
||||
LLMemType mt(LLMemType::MTYPE_SPACE_PARTITION);
|
||||
|
||||
|
|
@ -1243,13 +1250,18 @@ void LLSpatialGroup::updateDistance(LLCamera &camera)
|
|||
return;
|
||||
}
|
||||
|
||||
if (gShiftFrame)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
#if !LL_RELEASE_FOR_DOWNLOAD
|
||||
if (isState(LLSpatialGroup::OBJECT_DIRTY))
|
||||
{
|
||||
llerrs << "Spatial group dirty on distance update." << llendl;
|
||||
}
|
||||
#endif
|
||||
if (!getData().empty())
|
||||
if (!isEmpty())
|
||||
{
|
||||
mRadius = mSpatialPartition->mRenderByGroup ? mObjectBounds[1].getLength3().getF32() :
|
||||
(F32) mOctreeNode->getSize().getLength3().getF32();
|
||||
|
|
@ -1400,7 +1412,7 @@ void LLSpatialGroup::handleDestruction(const TreeNode* node)
|
|||
LLMemType mt(LLMemType::MTYPE_SPACE_PARTITION);
|
||||
setState(DEAD);
|
||||
|
||||
for (element_iter i = getData().begin(); i != getData().end(); ++i)
|
||||
for (element_iter i = getDataBegin(); i != getDataEnd(); ++i)
|
||||
{
|
||||
LLDrawable* drawable = *i;
|
||||
if (drawable->getSpatialGroup() == this)
|
||||
|
|
@ -1487,7 +1499,7 @@ void LLSpatialGroup::destroyGL(bool keep_occlusion)
|
|||
}
|
||||
|
||||
|
||||
for (LLSpatialGroup::element_iter i = getData().begin(); i != getData().end(); ++i)
|
||||
for (LLSpatialGroup::element_iter i = getDataBegin(); i != getDataEnd(); ++i)
|
||||
{
|
||||
LLDrawable* drawable = *i;
|
||||
for (S32 j = 0; j < drawable->getNumFaces(); j++)
|
||||
|
|
@ -1843,12 +1855,14 @@ BOOL LLSpatialPartition::remove(LLDrawable *drawablep, LLSpatialGroup *curp)
|
|||
{
|
||||
LLMemType mt(LLMemType::MTYPE_SPACE_PARTITION);
|
||||
|
||||
drawablep->setSpatialGroup(NULL);
|
||||
|
||||
if (!curp->removeObject(drawablep))
|
||||
{
|
||||
OCT_ERRS << "Failed to remove drawable from octree!" << llendl;
|
||||
}
|
||||
else
|
||||
{
|
||||
drawablep->setSpatialGroup(NULL);
|
||||
}
|
||||
|
||||
assert_octree_valid(mOctree);
|
||||
|
||||
|
|
@ -2119,7 +2133,7 @@ public:
|
|||
|
||||
virtual void processGroup(LLSpatialGroup* group)
|
||||
{
|
||||
llassert(!group->isState(LLSpatialGroup::DIRTY) && !group->getData().empty())
|
||||
llassert(!group->isState(LLSpatialGroup::DIRTY) && !group->isEmpty())
|
||||
|
||||
if (mRes < 2)
|
||||
{
|
||||
|
|
@ -2186,7 +2200,7 @@ public:
|
|||
{
|
||||
LLSpatialGroup::OctreeNode* branch = group->mOctreeNode;
|
||||
|
||||
for (LLSpatialGroup::OctreeNode::const_element_iter i = branch->getData().begin(); i != branch->getData().end(); ++i)
|
||||
for (LLSpatialGroup::OctreeNode::const_element_iter i = branch->getDataBegin(); i != branch->getDataEnd(); ++i)
|
||||
{
|
||||
LLDrawable* drawable = *i;
|
||||
|
||||
|
|
@ -2310,7 +2324,7 @@ public:
|
|||
LLSpatialGroup* group = (LLSpatialGroup*) state->getListener(0);
|
||||
group->destroyGL();
|
||||
|
||||
for (LLSpatialGroup::element_iter i = group->getData().begin(); i != group->getData().end(); ++i)
|
||||
for (LLSpatialGroup::element_iter i = group->getDataBegin(); i != group->getDataEnd(); ++i)
|
||||
{
|
||||
LLDrawable* drawable = *i;
|
||||
if (drawable->getVObj().notNull() && !group->mSpatialPartition->mRenderByGroup)
|
||||
|
|
@ -2620,7 +2634,7 @@ void renderOctree(LLSpatialGroup* group)
|
|||
gGL.flush();
|
||||
glLineWidth(1.f);
|
||||
gGL.flush();
|
||||
for (LLSpatialGroup::element_iter i = group->getData().begin(); i != group->getData().end(); ++i)
|
||||
for (LLSpatialGroup::element_iter i = group->getDataBegin(); i != group->getDataEnd(); ++i)
|
||||
{
|
||||
LLDrawable* drawable = *i;
|
||||
if (!group->mSpatialPartition->isBridge())
|
||||
|
|
@ -2666,7 +2680,7 @@ void renderOctree(LLSpatialGroup* group)
|
|||
}
|
||||
else
|
||||
{
|
||||
if (group->mBufferUsage == GL_STATIC_DRAW_ARB && !group->getData().empty()
|
||||
if (group->mBufferUsage == GL_STATIC_DRAW_ARB && !group->isEmpty()
|
||||
&& group->mSpatialPartition->mRenderByGroup)
|
||||
{
|
||||
col.setVec(0.8f, 0.4f, 0.1f, 0.1f);
|
||||
|
|
@ -2734,7 +2748,7 @@ void renderVisibility(LLSpatialGroup* group, LLCamera* camera)
|
|||
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
|
||||
|
||||
BOOL render_objects = (!LLPipeline::sUseOcclusion || !group->isOcclusionState(LLSpatialGroup::OCCLUDED)) && group->isVisible() &&
|
||||
!group->getData().empty();
|
||||
!group->isEmpty();
|
||||
|
||||
if (render_objects)
|
||||
{
|
||||
|
|
@ -3465,7 +3479,7 @@ void renderPhysicsShape(LLDrawable* drawable, LLVOVolume* volume)
|
|||
|
||||
void renderPhysicsShapes(LLSpatialGroup* group)
|
||||
{
|
||||
for (LLSpatialGroup::OctreeNode::const_element_iter i = group->getData().begin(); i != group->getData().end(); ++i)
|
||||
for (LLSpatialGroup::OctreeNode::const_element_iter i = group->getDataBegin(); i != group->getDataEnd(); ++i)
|
||||
{
|
||||
LLDrawable* drawable = *i;
|
||||
LLVOVolume* volume = drawable->getVOVolume();
|
||||
|
|
@ -3814,7 +3828,7 @@ public:
|
|||
|
||||
LLVector3 center, size;
|
||||
|
||||
if (branch->getData().empty())
|
||||
if (branch->isEmpty())
|
||||
{
|
||||
gGL.diffuseColor3f(1.f,0.2f,0.f);
|
||||
center.set(branch->getCenter().getF32ptr());
|
||||
|
|
@ -3850,8 +3864,8 @@ public:
|
|||
}
|
||||
|
||||
gGL.begin(LLRender::TRIANGLES);
|
||||
for (LLOctreeNode<LLVolumeTriangle>::const_element_iter iter = branch->getData().begin();
|
||||
iter != branch->getData().end();
|
||||
for (LLOctreeNode<LLVolumeTriangle>::const_element_iter iter = branch->getDataBegin();
|
||||
iter != branch->getDataEnd();
|
||||
++iter)
|
||||
{
|
||||
const LLVolumeTriangle* tri = *iter;
|
||||
|
|
@ -4088,7 +4102,7 @@ public:
|
|||
|
||||
if (gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_BBOXES))
|
||||
{
|
||||
if (!group->getData().empty())
|
||||
if (!group->isEmpty())
|
||||
{
|
||||
gGL.diffuseColor3f(0,0,1);
|
||||
drawBoxOutline(group->mObjectBounds[0],
|
||||
|
|
@ -4096,7 +4110,7 @@ public:
|
|||
}
|
||||
}
|
||||
|
||||
for (LLSpatialGroup::OctreeNode::const_element_iter i = branch->getData().begin(); i != branch->getData().end(); ++i)
|
||||
for (LLSpatialGroup::OctreeNode::const_element_iter i = branch->getDataBegin(); i != branch->getDataEnd(); ++i)
|
||||
{
|
||||
LLDrawable* drawable = *i;
|
||||
|
||||
|
|
@ -4182,7 +4196,7 @@ public:
|
|||
{
|
||||
if (index < 255)
|
||||
{
|
||||
if (facep->mDrawInfo->mTextureList.size() <= index)
|
||||
if (facep->mDrawInfo->mTextureList.size()<= index)
|
||||
{
|
||||
llerrs << "Face texture index out of bounds." << llendl;
|
||||
}
|
||||
|
|
@ -4285,7 +4299,7 @@ public:
|
|||
return;
|
||||
}
|
||||
|
||||
for (LLSpatialGroup::OctreeNode::const_element_iter i = branch->getData().begin(); i != branch->getData().end(); ++i)
|
||||
for (LLSpatialGroup::OctreeNode::const_element_iter i = branch->getDataBegin(); i != branch->getDataEnd(); ++i)
|
||||
{
|
||||
LLDrawable* drawable = *i;
|
||||
|
||||
|
|
@ -4511,7 +4525,7 @@ public:
|
|||
{
|
||||
// <FS:ND> Tree can change while we are visiting, make sure to restart iteration if the tree changes
|
||||
|
||||
// for (LLSpatialGroup::OctreeNode::const_element_iter i = branch->getData().begin(); i != branch->getData().end(); ++i)
|
||||
// for (LLSpatialGroup::OctreeNode::const_element_iter i = branch->getDataBegin(); i != branch->getDataEnd(); ++i)
|
||||
// {
|
||||
// check(*i);
|
||||
// }
|
||||
|
|
@ -4733,28 +4747,62 @@ LLVertexBuffer* LLGeometryManager::createVertexBuffer(U32 type_mask, U32 usage)
|
|||
|
||||
LLCullResult::LLCullResult()
|
||||
{
|
||||
mVisibleGroupsAllocated = 0;
|
||||
mAlphaGroupsAllocated = 0;
|
||||
mOcclusionGroupsAllocated = 0;
|
||||
mDrawableGroupsAllocated = 0;
|
||||
mVisibleListAllocated = 0;
|
||||
mVisibleBridgeAllocated = 0;
|
||||
|
||||
mVisibleGroups = NULL;
|
||||
mVisibleGroupsEnd = NULL;
|
||||
mAlphaGroups = NULL;
|
||||
mAlphaGroupsEnd = NULL;
|
||||
mOcclusionGroups = NULL;
|
||||
mOcclusionGroupsEnd = NULL;
|
||||
mDrawableGroups = NULL;
|
||||
mDrawableGroupsEnd = NULL;
|
||||
mVisibleList = NULL;
|
||||
mVisibleListEnd = NULL;
|
||||
mVisibleBridge = NULL;
|
||||
mVisibleBridgeEnd = NULL;
|
||||
|
||||
for (U32 i = 0; i < LLRenderPass::NUM_RENDER_TYPES; i++)
|
||||
{
|
||||
mRenderMap[i] = NULL;
|
||||
mRenderMapEnd[i] = NULL;
|
||||
mRenderMapAllocated[i] = 0;
|
||||
}
|
||||
|
||||
clear();
|
||||
}
|
||||
|
||||
void LLCullResult::pushBack(void**& head, U32& count, void* val)
|
||||
{
|
||||
count++;
|
||||
head = (void**) realloc((void*) head, sizeof(void*) * count);
|
||||
head[count-1] = val;
|
||||
}
|
||||
|
||||
void LLCullResult::clear()
|
||||
{
|
||||
mVisibleGroupsSize = 0;
|
||||
mVisibleGroupsEnd = mVisibleGroups.begin();
|
||||
mVisibleGroupsEnd = mVisibleGroups;
|
||||
|
||||
mAlphaGroupsSize = 0;
|
||||
mAlphaGroupsEnd = mAlphaGroups.begin();
|
||||
mAlphaGroupsEnd = mAlphaGroups;
|
||||
|
||||
mOcclusionGroupsSize = 0;
|
||||
mOcclusionGroupsEnd = mOcclusionGroups.begin();
|
||||
mOcclusionGroupsEnd = mOcclusionGroups;
|
||||
|
||||
mDrawableGroupsSize = 0;
|
||||
mDrawableGroupsEnd = mDrawableGroups.begin();
|
||||
mDrawableGroupsEnd = mDrawableGroups;
|
||||
|
||||
mVisibleListSize = 0;
|
||||
mVisibleListEnd = mVisibleList.begin();
|
||||
mVisibleListEnd = mVisibleList;
|
||||
|
||||
mVisibleBridgeSize = 0;
|
||||
mVisibleBridgeEnd = mVisibleBridge.begin();
|
||||
mVisibleBridgeEnd = mVisibleBridge;
|
||||
|
||||
|
||||
for (U32 i = 0; i < LLRenderPass::NUM_RENDER_TYPES; i++)
|
||||
|
|
@ -4764,176 +4812,176 @@ void LLCullResult::clear()
|
|||
mRenderMap[i][j] = 0;
|
||||
}
|
||||
mRenderMapSize[i] = 0;
|
||||
mRenderMapEnd[i] = mRenderMap[i].begin();
|
||||
mRenderMapEnd[i] = mRenderMap[i];
|
||||
}
|
||||
}
|
||||
|
||||
LLCullResult::sg_list_t::iterator LLCullResult::beginVisibleGroups()
|
||||
LLCullResult::sg_iterator LLCullResult::beginVisibleGroups()
|
||||
{
|
||||
return mVisibleGroups.begin();
|
||||
return mVisibleGroups;
|
||||
}
|
||||
|
||||
LLCullResult::sg_list_t::iterator LLCullResult::endVisibleGroups()
|
||||
LLCullResult::sg_iterator LLCullResult::endVisibleGroups()
|
||||
{
|
||||
return mVisibleGroupsEnd;
|
||||
}
|
||||
|
||||
LLCullResult::sg_list_t::iterator LLCullResult::beginAlphaGroups()
|
||||
LLCullResult::sg_iterator LLCullResult::beginAlphaGroups()
|
||||
{
|
||||
return mAlphaGroups.begin();
|
||||
return mAlphaGroups;
|
||||
}
|
||||
|
||||
LLCullResult::sg_list_t::iterator LLCullResult::endAlphaGroups()
|
||||
LLCullResult::sg_iterator LLCullResult::endAlphaGroups()
|
||||
{
|
||||
return mAlphaGroupsEnd;
|
||||
}
|
||||
|
||||
LLCullResult::sg_list_t::iterator LLCullResult::beginOcclusionGroups()
|
||||
LLCullResult::sg_iterator LLCullResult::beginOcclusionGroups()
|
||||
{
|
||||
return mOcclusionGroups.begin();
|
||||
return mOcclusionGroups;
|
||||
}
|
||||
|
||||
LLCullResult::sg_list_t::iterator LLCullResult::endOcclusionGroups()
|
||||
LLCullResult::sg_iterator LLCullResult::endOcclusionGroups()
|
||||
{
|
||||
return mOcclusionGroupsEnd;
|
||||
}
|
||||
|
||||
LLCullResult::sg_list_t::iterator LLCullResult::beginDrawableGroups()
|
||||
LLCullResult::sg_iterator LLCullResult::beginDrawableGroups()
|
||||
{
|
||||
return mDrawableGroups.begin();
|
||||
return mDrawableGroups;
|
||||
}
|
||||
|
||||
LLCullResult::sg_list_t::iterator LLCullResult::endDrawableGroups()
|
||||
LLCullResult::sg_iterator LLCullResult::endDrawableGroups()
|
||||
{
|
||||
return mDrawableGroupsEnd;
|
||||
}
|
||||
|
||||
LLCullResult::drawable_list_t::iterator LLCullResult::beginVisibleList()
|
||||
LLCullResult::drawable_iterator LLCullResult::beginVisibleList()
|
||||
{
|
||||
return mVisibleList.begin();
|
||||
return mVisibleList;
|
||||
}
|
||||
|
||||
LLCullResult::drawable_list_t::iterator LLCullResult::endVisibleList()
|
||||
LLCullResult::drawable_iterator LLCullResult::endVisibleList()
|
||||
{
|
||||
return mVisibleListEnd;
|
||||
}
|
||||
|
||||
LLCullResult::bridge_list_t::iterator LLCullResult::beginVisibleBridge()
|
||||
LLCullResult::bridge_iterator LLCullResult::beginVisibleBridge()
|
||||
{
|
||||
return mVisibleBridge.begin();
|
||||
return mVisibleBridge;
|
||||
}
|
||||
|
||||
LLCullResult::bridge_list_t::iterator LLCullResult::endVisibleBridge()
|
||||
LLCullResult::bridge_iterator LLCullResult::endVisibleBridge()
|
||||
{
|
||||
return mVisibleBridgeEnd;
|
||||
}
|
||||
|
||||
LLCullResult::drawinfo_list_t::iterator LLCullResult::beginRenderMap(U32 type)
|
||||
LLCullResult::drawinfo_iterator LLCullResult::beginRenderMap(U32 type)
|
||||
{
|
||||
return mRenderMap[type].begin();
|
||||
return mRenderMap[type];
|
||||
}
|
||||
|
||||
LLCullResult::drawinfo_list_t::iterator LLCullResult::endRenderMap(U32 type)
|
||||
LLCullResult::drawinfo_iterator LLCullResult::endRenderMap(U32 type)
|
||||
{
|
||||
return mRenderMapEnd[type];
|
||||
}
|
||||
|
||||
void LLCullResult::pushVisibleGroup(LLSpatialGroup* group)
|
||||
{
|
||||
if (mVisibleGroupsSize < mVisibleGroups.size())
|
||||
if (mVisibleGroupsSize < mVisibleGroupsAllocated)
|
||||
{
|
||||
mVisibleGroups[mVisibleGroupsSize] = group;
|
||||
}
|
||||
else
|
||||
{
|
||||
mVisibleGroups.push_back(group);
|
||||
pushBack((void**&) mVisibleGroups, mVisibleGroupsAllocated, (void*) group);
|
||||
}
|
||||
++mVisibleGroupsSize;
|
||||
mVisibleGroupsEnd = mVisibleGroups.begin()+mVisibleGroupsSize;
|
||||
mVisibleGroupsEnd = mVisibleGroups+mVisibleGroupsSize;
|
||||
}
|
||||
|
||||
void LLCullResult::pushAlphaGroup(LLSpatialGroup* group)
|
||||
{
|
||||
if (mAlphaGroupsSize < mAlphaGroups.size())
|
||||
if (mAlphaGroupsSize < mAlphaGroupsAllocated)
|
||||
{
|
||||
mAlphaGroups[mAlphaGroupsSize] = group;
|
||||
}
|
||||
else
|
||||
{
|
||||
mAlphaGroups.push_back(group);
|
||||
pushBack((void**&) mAlphaGroups, mAlphaGroupsAllocated, (void*) group);
|
||||
}
|
||||
++mAlphaGroupsSize;
|
||||
mAlphaGroupsEnd = mAlphaGroups.begin()+mAlphaGroupsSize;
|
||||
mAlphaGroupsEnd = mAlphaGroups+mAlphaGroupsSize;
|
||||
}
|
||||
|
||||
void LLCullResult::pushOcclusionGroup(LLSpatialGroup* group)
|
||||
{
|
||||
if (mOcclusionGroupsSize < mOcclusionGroups.size())
|
||||
if (mOcclusionGroupsSize < mOcclusionGroupsAllocated)
|
||||
{
|
||||
mOcclusionGroups[mOcclusionGroupsSize] = group;
|
||||
}
|
||||
else
|
||||
{
|
||||
mOcclusionGroups.push_back(group);
|
||||
pushBack((void**&) mOcclusionGroups, mOcclusionGroupsAllocated, (void*) group);
|
||||
}
|
||||
++mOcclusionGroupsSize;
|
||||
mOcclusionGroupsEnd = mOcclusionGroups.begin()+mOcclusionGroupsSize;
|
||||
mOcclusionGroupsEnd = mOcclusionGroups+mOcclusionGroupsSize;
|
||||
}
|
||||
|
||||
void LLCullResult::pushDrawableGroup(LLSpatialGroup* group)
|
||||
{
|
||||
if (mDrawableGroupsSize < mDrawableGroups.size())
|
||||
if (mDrawableGroupsSize < mDrawableGroupsAllocated)
|
||||
{
|
||||
mDrawableGroups[mDrawableGroupsSize] = group;
|
||||
}
|
||||
else
|
||||
{
|
||||
mDrawableGroups.push_back(group);
|
||||
pushBack((void**&) mDrawableGroups, mDrawableGroupsAllocated, (void*) group);
|
||||
}
|
||||
++mDrawableGroupsSize;
|
||||
mDrawableGroupsEnd = mDrawableGroups.begin()+mDrawableGroupsSize;
|
||||
mDrawableGroupsEnd = mDrawableGroups+mDrawableGroupsSize;
|
||||
}
|
||||
|
||||
void LLCullResult::pushDrawable(LLDrawable* drawable)
|
||||
{
|
||||
if (mVisibleListSize < mVisibleList.size())
|
||||
if (mVisibleListSize < mVisibleListAllocated)
|
||||
{
|
||||
mVisibleList[mVisibleListSize] = drawable;
|
||||
}
|
||||
else
|
||||
{
|
||||
mVisibleList.push_back(drawable);
|
||||
pushBack((void**&) mVisibleList, mVisibleListAllocated, (void*) drawable);
|
||||
}
|
||||
++mVisibleListSize;
|
||||
mVisibleListEnd = mVisibleList.begin()+mVisibleListSize;
|
||||
mVisibleListEnd = mVisibleList+mVisibleListSize;
|
||||
}
|
||||
|
||||
void LLCullResult::pushBridge(LLSpatialBridge* bridge)
|
||||
{
|
||||
if (mVisibleBridgeSize < mVisibleBridge.size())
|
||||
if (mVisibleBridgeSize < mVisibleBridgeAllocated)
|
||||
{
|
||||
mVisibleBridge[mVisibleBridgeSize] = bridge;
|
||||
}
|
||||
else
|
||||
{
|
||||
mVisibleBridge.push_back(bridge);
|
||||
pushBack((void**&) mVisibleBridge, mVisibleBridgeAllocated, (void*) bridge);
|
||||
}
|
||||
++mVisibleBridgeSize;
|
||||
mVisibleBridgeEnd = mVisibleBridge.begin()+mVisibleBridgeSize;
|
||||
mVisibleBridgeEnd = mVisibleBridge+mVisibleBridgeSize;
|
||||
}
|
||||
|
||||
void LLCullResult::pushDrawInfo(U32 type, LLDrawInfo* draw_info)
|
||||
{
|
||||
if (mRenderMapSize[type] < mRenderMap[type].size())
|
||||
if (mRenderMapSize[type] < mRenderMapAllocated[type])
|
||||
{
|
||||
mRenderMap[type][mRenderMapSize[type]] = draw_info;
|
||||
}
|
||||
else
|
||||
{
|
||||
mRenderMap[type].push_back(draw_info);
|
||||
pushBack((void**&) mRenderMap[type], mRenderMapAllocated[type], (void*) draw_info);
|
||||
}
|
||||
++mRenderMapSize[type];
|
||||
mRenderMapEnd[type] = mRenderMap[type].begin() + mRenderMapSize[type];
|
||||
mRenderMapEnd[type] = mRenderMap[type] + mRenderMapSize[type];
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -4954,7 +5002,7 @@ void LLCullResult::assertDrawMapsEmpty()
|
|||
bool extractDrawables( const LLSpatialGroup::OctreeNode* branch, std::vector< LLPointer< LLDrawable > > &aTree )
|
||||
{
|
||||
std::vector< LLPointer< LLDrawable > > vTree;
|
||||
for (LLSpatialGroup::OctreeNode::const_element_iter i = branch->getData().begin(); i != branch->getData().end(); ++i)
|
||||
for (LLSpatialGroup::OctreeNode::const_element_iter i = branch->getDataBegin(); i != branch->getDataEnd(); ++i)
|
||||
vTree.push_back( *i );
|
||||
|
||||
if( aTree.empty() )
|
||||
|
|
|
|||
|
|
@ -68,6 +68,16 @@ protected:
|
|||
~LLDrawInfo();
|
||||
|
||||
public:
|
||||
void* operator new(size_t size)
|
||||
{
|
||||
return ll_aligned_malloc_16(size);
|
||||
}
|
||||
|
||||
void operator delete(void* ptr)
|
||||
{
|
||||
ll_aligned_free_16(ptr);
|
||||
}
|
||||
|
||||
|
||||
LLDrawInfo(const LLDrawInfo& rhs)
|
||||
{
|
||||
|
|
@ -106,7 +116,7 @@ public:
|
|||
F32 mPartSize;
|
||||
F32 mVSize;
|
||||
LLSpatialGroup* mGroup;
|
||||
LLFace* mFace; //associated face
|
||||
LL_ALIGN_16(LLFace* mFace); //associated face
|
||||
F32 mDistance;
|
||||
U32 mDrawMode;
|
||||
|
||||
|
|
@ -181,7 +191,7 @@ public:
|
|||
};
|
||||
};
|
||||
|
||||
LL_ALIGN_PREFIX(64)
|
||||
LL_ALIGN_PREFIX(16)
|
||||
class LLSpatialGroup : public LLOctreeListener<LLDrawable>
|
||||
{
|
||||
friend class LLSpatialPartition;
|
||||
|
|
@ -193,6 +203,16 @@ public:
|
|||
*this = rhs;
|
||||
}
|
||||
|
||||
void* operator new(size_t size)
|
||||
{
|
||||
return ll_aligned_malloc_16(size);
|
||||
}
|
||||
|
||||
void operator delete(void* ptr)
|
||||
{
|
||||
ll_aligned_free_16(ptr);
|
||||
}
|
||||
|
||||
const LLSpatialGroup& operator=(const LLSpatialGroup& rhs)
|
||||
{
|
||||
llerrs << "Illegal operation!" << llendl;
|
||||
|
|
@ -325,8 +345,13 @@ public:
|
|||
|
||||
void dirtyGeom() { setState(GEOM_DIRTY); }
|
||||
void dirtyMesh() { setState(MESH_DIRTY); }
|
||||
|
||||
//octree wrappers to make code more readable
|
||||
element_list& getData() { return mOctreeNode->getData(); }
|
||||
element_iter getDataBegin() { return mOctreeNode->getDataBegin(); }
|
||||
element_iter getDataEnd() { return mOctreeNode->getDataEnd(); }
|
||||
U32 getElementCount() const { return mOctreeNode->getElementCount(); }
|
||||
bool isEmpty() const { return mOctreeNode->isEmpty(); }
|
||||
|
||||
void drawObjectBox(LLColor4 col);
|
||||
|
||||
|
|
@ -370,12 +395,12 @@ public:
|
|||
V4_COUNT = 10
|
||||
} eV4Index;
|
||||
|
||||
LLVector4a mBounds[2]; // bounding box (center, size) of this node and all its children (tight fit to objects)
|
||||
LLVector4a mExtents[2]; // extents (min, max) of this node and all its children
|
||||
LLVector4a mObjectExtents[2]; // extents (min, max) of objects in this node
|
||||
LLVector4a mObjectBounds[2]; // bounding box (center, size) of objects in this node
|
||||
LLVector4a mViewAngle;
|
||||
LLVector4a mLastUpdateViewAngle;
|
||||
LL_ALIGN_16(LLVector4a mBounds[2]); // bounding box (center, size) of this node and all its children (tight fit to objects)
|
||||
LL_ALIGN_16(LLVector4a mExtents[2]); // extents (min, max) of this node and all its children
|
||||
LL_ALIGN_16(LLVector4a mObjectExtents[2]); // extents (min, max) of objects in this node
|
||||
LL_ALIGN_16(LLVector4a mObjectBounds[2]); // bounding box (center, size) of objects in this node
|
||||
LL_ALIGN_16(LLVector4a mViewAngle);
|
||||
LL_ALIGN_16(LLVector4a mLastUpdateViewAngle);
|
||||
|
||||
F32 mObjectBoxSize; //cached mObjectBounds[1].getLength3()
|
||||
|
||||
|
|
@ -542,34 +567,39 @@ class LLCullResult
|
|||
public:
|
||||
LLCullResult();
|
||||
|
||||
typedef std::vector<LLSpatialGroup*> sg_list_t;
|
||||
typedef std::vector<LLDrawable*> drawable_list_t;
|
||||
typedef std::vector<LLSpatialBridge*> bridge_list_t;
|
||||
typedef std::vector<LLDrawInfo*> drawinfo_list_t;
|
||||
typedef LLSpatialGroup** sg_list_t;
|
||||
typedef LLDrawable** drawable_list_t;
|
||||
typedef LLSpatialBridge** bridge_list_t;
|
||||
typedef LLDrawInfo** drawinfo_list_t;
|
||||
|
||||
typedef LLSpatialGroup** sg_iterator;
|
||||
typedef LLSpatialBridge** bridge_iterator;
|
||||
typedef LLDrawInfo** drawinfo_iterator;
|
||||
typedef LLDrawable** drawable_iterator;
|
||||
|
||||
void clear();
|
||||
|
||||
sg_list_t::iterator beginVisibleGroups();
|
||||
sg_list_t::iterator endVisibleGroups();
|
||||
sg_iterator beginVisibleGroups();
|
||||
sg_iterator endVisibleGroups();
|
||||
|
||||
sg_list_t::iterator beginAlphaGroups();
|
||||
sg_list_t::iterator endAlphaGroups();
|
||||
sg_iterator beginAlphaGroups();
|
||||
sg_iterator endAlphaGroups();
|
||||
|
||||
bool hasOcclusionGroups() { return mOcclusionGroupsSize > 0; }
|
||||
sg_list_t::iterator beginOcclusionGroups();
|
||||
sg_list_t::iterator endOcclusionGroups();
|
||||
sg_iterator beginOcclusionGroups();
|
||||
sg_iterator endOcclusionGroups();
|
||||
|
||||
sg_list_t::iterator beginDrawableGroups();
|
||||
sg_list_t::iterator endDrawableGroups();
|
||||
sg_iterator beginDrawableGroups();
|
||||
sg_iterator endDrawableGroups();
|
||||
|
||||
drawable_list_t::iterator beginVisibleList();
|
||||
drawable_list_t::iterator endVisibleList();
|
||||
drawable_iterator beginVisibleList();
|
||||
drawable_iterator endVisibleList();
|
||||
|
||||
bridge_list_t::iterator beginVisibleBridge();
|
||||
bridge_list_t::iterator endVisibleBridge();
|
||||
bridge_iterator beginVisibleBridge();
|
||||
bridge_iterator endVisibleBridge();
|
||||
|
||||
drawinfo_list_t::iterator beginRenderMap(U32 type);
|
||||
drawinfo_list_t::iterator endRenderMap(U32 type);
|
||||
drawinfo_iterator beginRenderMap(U32 type);
|
||||
drawinfo_iterator endRenderMap(U32 type);
|
||||
|
||||
void pushVisibleGroup(LLSpatialGroup* group);
|
||||
void pushAlphaGroup(LLSpatialGroup* group);
|
||||
|
|
@ -589,28 +619,41 @@ public:
|
|||
void assertDrawMapsEmpty();
|
||||
|
||||
private:
|
||||
|
||||
void pushBack(void** &head, U32& count, void* val);
|
||||
|
||||
U32 mVisibleGroupsSize;
|
||||
U32 mAlphaGroupsSize;
|
||||
U32 mOcclusionGroupsSize;
|
||||
U32 mDrawableGroupsSize;
|
||||
U32 mVisibleListSize;
|
||||
U32 mVisibleBridgeSize;
|
||||
|
||||
U32 mVisibleGroupsAllocated;
|
||||
U32 mAlphaGroupsAllocated;
|
||||
U32 mOcclusionGroupsAllocated;
|
||||
U32 mDrawableGroupsAllocated;
|
||||
U32 mVisibleListAllocated;
|
||||
U32 mVisibleBridgeAllocated;
|
||||
|
||||
U32 mRenderMapSize[LLRenderPass::NUM_RENDER_TYPES];
|
||||
|
||||
sg_list_t mVisibleGroups;
|
||||
sg_list_t::iterator mVisibleGroupsEnd;
|
||||
sg_iterator mVisibleGroupsEnd;
|
||||
sg_list_t mAlphaGroups;
|
||||
sg_list_t::iterator mAlphaGroupsEnd;
|
||||
sg_iterator mAlphaGroupsEnd;
|
||||
sg_list_t mOcclusionGroups;
|
||||
sg_list_t::iterator mOcclusionGroupsEnd;
|
||||
sg_iterator mOcclusionGroupsEnd;
|
||||
sg_list_t mDrawableGroups;
|
||||
sg_list_t::iterator mDrawableGroupsEnd;
|
||||
sg_iterator mDrawableGroupsEnd;
|
||||
drawable_list_t mVisibleList;
|
||||
drawable_list_t::iterator mVisibleListEnd;
|
||||
drawable_iterator mVisibleListEnd;
|
||||
bridge_list_t mVisibleBridge;
|
||||
bridge_list_t::iterator mVisibleBridgeEnd;
|
||||
bridge_iterator mVisibleBridgeEnd;
|
||||
drawinfo_list_t mRenderMap[LLRenderPass::NUM_RENDER_TYPES];
|
||||
drawinfo_list_t::iterator mRenderMapEnd[LLRenderPass::NUM_RENDER_TYPES];
|
||||
U32 mRenderMapAllocated[LLRenderPass::NUM_RENDER_TYPES];
|
||||
drawinfo_iterator mRenderMapEnd[LLRenderPass::NUM_RENDER_TYPES];
|
||||
|
||||
};
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -121,6 +121,7 @@ public:
|
|||
// </AW: opensim>
|
||||
|
||||
static void setStartSLURL(const LLSLURL& slurl);
|
||||
//static LLSLURL& getStartSLURL(); //FS:TM link fix: use what we had before 3.4.0 merge
|
||||
static LLSLURL& getStartSLURL() { return sStartSLURL; }
|
||||
|
||||
static bool startLLProxy(); // Initialize the SOCKS 5 proxy
|
||||
|
|
|
|||
|
|
@ -56,6 +56,7 @@
|
|||
#include "lldrawable.h"
|
||||
|
||||
extern LLPipeline gPipeline;
|
||||
extern bool gShiftFrame;
|
||||
|
||||
LLColor4U MAX_WATER_COLOR(0, 48, 96, 240);
|
||||
|
||||
|
|
@ -294,7 +295,7 @@ void LLSurface::initTextures()
|
|||
mWaterObjp = (LLVOWater *)gObjectList.createObjectViewer(LLViewerObject::LL_VO_WATER, mRegionp);
|
||||
gPipeline.createObject(mWaterObjp);
|
||||
LLVector3d water_pos_global = from_region_handle(mRegionp->getHandle());
|
||||
water_pos_global += LLVector3d(128.0, 128.0, DEFAULT_WATER_HEIGHT);
|
||||
water_pos_global += LLVector3d(128.0, 128.0, DEFAULT_WATER_HEIGHT); // region doesn't have a valid water height yet
|
||||
mWaterObjp->setPositionGlobal(water_pos_global);
|
||||
}
|
||||
}
|
||||
|
|
@ -621,6 +622,11 @@ void LLSurface::moveZ(const S32 x, const S32 y, const F32 delta)
|
|||
|
||||
void LLSurface::updatePatchVisibilities(LLAgent &agent)
|
||||
{
|
||||
if (gShiftFrame)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
LLVector3 pos_region = mRegionp->getPosRegionFromGlobal(gAgentCamera.getCameraPositionGlobal());
|
||||
|
||||
LLSurfacePatch *patchp;
|
||||
|
|
|
|||
|
|
@ -43,6 +43,7 @@
|
|||
#include "lldrawpool.h"
|
||||
#include "noise.h"
|
||||
|
||||
extern bool gShiftFrame;
|
||||
extern U64 gFrameTime;
|
||||
extern LLPipeline gPipeline;
|
||||
|
||||
|
|
@ -218,7 +219,7 @@ void LLSurfacePatch::eval(const U32 x, const U32 y, const U32 stride, LLVector3
|
|||
pos_agent.mV[VX] += x * mSurfacep->getMetersPerGrid();
|
||||
pos_agent.mV[VY] += y * mSurfacep->getMetersPerGrid();
|
||||
pos_agent.mV[VZ] = *(mDataZ + point_offset);
|
||||
*vertex = pos_agent;
|
||||
*vertex = pos_agent-mVObjp->getRegion()->getOriginAgent();
|
||||
|
||||
LLVector3 rel_pos = pos_agent - mSurfacep->getOriginAgent();
|
||||
LLVector3 tex_pos = rel_pos * (1.f/surface_stride);
|
||||
|
|
@ -366,10 +367,13 @@ void LLSurfacePatch::updateCameraDistanceRegion(const LLVector3 &pos_region)
|
|||
{
|
||||
if (LLPipeline::sDynamicLOD)
|
||||
{
|
||||
LLVector3 dv = pos_region;
|
||||
dv -= mCenterRegion;
|
||||
mVisInfo.mDistance = llmax(0.f, (F32)(dv.magVec() - mRadius))/
|
||||
llmax(LLVOSurfacePatch::sLODFactor, 0.1f);
|
||||
if (!gShiftFrame)
|
||||
{
|
||||
LLVector3 dv = pos_region;
|
||||
dv -= mCenterRegion;
|
||||
mVisInfo.mDistance = llmax(0.f, (F32)(dv.magVec() - mRadius))/
|
||||
llmax(LLVOSurfacePatch::sLODFactor, 0.1f);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
|
|||
|
|
@ -76,11 +76,11 @@ public:
|
|||
|
||||
// LLViewerVisualParam Virtual functions
|
||||
/*virtual*/ F32 getTotalDistortion() { return 1.f; }
|
||||
/*virtual*/ const LLVector3& getAvgDistortion() { return mAvgDistortionVec; }
|
||||
/*virtual*/ const LLVector4a& getAvgDistortion() { return mAvgDistortionVec; }
|
||||
/*virtual*/ F32 getMaxDistortion() { return 3.f; }
|
||||
/*virtual*/ LLVector3 getVertexDistortion(S32 index, LLPolyMesh *poly_mesh) { return LLVector3(1.f, 1.f, 1.f);}
|
||||
/*virtual*/ const LLVector3* getFirstDistortion(U32 *index, LLPolyMesh **poly_mesh) { index = 0; poly_mesh = NULL; return &mAvgDistortionVec;};
|
||||
/*virtual*/ const LLVector3* getNextDistortion(U32 *index, LLPolyMesh **poly_mesh) { index = 0; poly_mesh = NULL; return NULL;};
|
||||
/*virtual*/ LLVector4a getVertexDistortion(S32 index, LLPolyMesh *poly_mesh) { return LLVector4a(1.f, 1.f, 1.f);}
|
||||
/*virtual*/ const LLVector4a* getFirstDistortion(U32 *index, LLPolyMesh **poly_mesh) { index = 0; poly_mesh = NULL; return &mAvgDistortionVec;};
|
||||
/*virtual*/ const LLVector4a* getNextDistortion(U32 *index, LLPolyMesh **poly_mesh) { index = 0; poly_mesh = NULL; return NULL;};
|
||||
|
||||
// New functions
|
||||
BOOL render( S32 x, S32 y, S32 width, S32 height );
|
||||
|
|
@ -94,7 +94,7 @@ private:
|
|||
LLPointer<LLImageRaw> mStaticImageRaw;
|
||||
BOOL mNeedsCreateTexture;
|
||||
BOOL mStaticImageInvalid;
|
||||
LLVector3 mAvgDistortionVec;
|
||||
LLVector4a mAvgDistortionVec;
|
||||
F32 mCachedEffectiveWeight;
|
||||
|
||||
public:
|
||||
|
|
@ -155,18 +155,18 @@ public:
|
|||
|
||||
// LLViewerVisualParam Virtual functions
|
||||
/*virtual*/ F32 getTotalDistortion() { return 1.f; }
|
||||
/*virtual*/ const LLVector3& getAvgDistortion() { return mAvgDistortionVec; }
|
||||
/*virtual*/ const LLVector4a& getAvgDistortion() { return mAvgDistortionVec; }
|
||||
/*virtual*/ F32 getMaxDistortion() { return 3.f; }
|
||||
/*virtual*/ LLVector3 getVertexDistortion(S32 index, LLPolyMesh *poly_mesh) { return LLVector3(1.f, 1.f, 1.f); }
|
||||
/*virtual*/ const LLVector3* getFirstDistortion(U32 *index, LLPolyMesh **poly_mesh) { index = 0; poly_mesh = NULL; return &mAvgDistortionVec;};
|
||||
/*virtual*/ const LLVector3* getNextDistortion(U32 *index, LLPolyMesh **poly_mesh) { index = 0; poly_mesh = NULL; return NULL;};
|
||||
/*virtual*/ LLVector4a getVertexDistortion(S32 index, LLPolyMesh *poly_mesh) { return LLVector4a(1.f, 1.f, 1.f); }
|
||||
/*virtual*/ const LLVector4a* getFirstDistortion(U32 *index, LLPolyMesh **poly_mesh) { index = 0; poly_mesh = NULL; return &mAvgDistortionVec;};
|
||||
/*virtual*/ const LLVector4a* getNextDistortion(U32 *index, LLPolyMesh **poly_mesh) { index = 0; poly_mesh = NULL; return NULL;};
|
||||
|
||||
// New functions
|
||||
LLColor4 getNetColor() const;
|
||||
protected:
|
||||
virtual void onGlobalColorChanged(bool upload_bake) {}
|
||||
private:
|
||||
LLVector3 mAvgDistortionVec;
|
||||
LLVector4a mAvgDistortionVec;
|
||||
};
|
||||
|
||||
class LLTexLayerParamColorInfo : public LLViewerVisualParamInfo
|
||||
|
|
|
|||
|
|
@ -51,9 +51,19 @@ const BOOL NOT_FOR_SELECTION = FALSE;
|
|||
extern template class LLViewerCamera* LLSingleton<class LLViewerCamera>::getInstance();
|
||||
#endif
|
||||
|
||||
LL_ALIGN_PREFIX(16)
|
||||
class LLViewerCamera : public LLCamera, public LLSingleton<LLViewerCamera>
|
||||
{
|
||||
public:
|
||||
void* operator new(size_t size)
|
||||
{
|
||||
return ll_aligned_malloc_16(size);
|
||||
}
|
||||
|
||||
void operator delete(void* ptr)
|
||||
{
|
||||
ll_aligned_free_16(ptr);
|
||||
}
|
||||
|
||||
typedef enum
|
||||
{
|
||||
|
|
@ -137,6 +147,7 @@ protected:
|
|||
S16 mZoomSubregion;
|
||||
|
||||
public:
|
||||
};
|
||||
} LL_ALIGN_POSTFIX(16);
|
||||
|
||||
|
||||
#endif // LL_LLVIEWERCAMERA_H
|
||||
|
|
|
|||
|
|
@ -83,6 +83,7 @@
|
|||
// [/RLVa:KB]
|
||||
|
||||
extern LLPointer<LLViewerTexture> gStartTexture;
|
||||
extern bool gShiftFrame;
|
||||
|
||||
LLPointer<LLViewerTexture> gDisconnectedImagep = NULL;
|
||||
|
||||
|
|
@ -166,8 +167,11 @@ void display_startup()
|
|||
glClear(GL_DEPTH_BUFFER_BIT);
|
||||
}
|
||||
|
||||
static LLFastTimer::DeclareTimer FTM_UPDATE_CAMERA("Update Camera");
|
||||
|
||||
void display_update_camera()
|
||||
{
|
||||
LLFastTimer t(FTM_UPDATE_CAMERA);
|
||||
LLMemType mt_uc(LLMemType::MTYPE_DISPLAY_UPDATE_CAMERA);
|
||||
// TODO: cut draw distance down if customizing avatar?
|
||||
// TODO: cut draw distance on per-parcel basis?
|
||||
|
|
@ -221,6 +225,11 @@ static LLFastTimer::DeclareTimer FTM_IMAGE_UPDATE_CLASS("Class");
|
|||
static LLFastTimer::DeclareTimer FTM_IMAGE_UPDATE_BUMP("Bump");
|
||||
static LLFastTimer::DeclareTimer FTM_IMAGE_UPDATE_LIST("List");
|
||||
static LLFastTimer::DeclareTimer FTM_IMAGE_UPDATE_DELETE("Delete");
|
||||
static LLFastTimer::DeclareTimer FTM_RESIZE_WINDOW("Resize Window");
|
||||
static LLFastTimer::DeclareTimer FTM_HUD_UPDATE("HUD Update");
|
||||
static LLFastTimer::DeclareTimer FTM_DISPLAY_UPDATE_GEOM("Update Geom");
|
||||
static LLFastTimer::DeclareTimer FTM_TEXTURE_UNBIND("Texture Unbind");
|
||||
static LLFastTimer::DeclareTimer FTM_TELEPORT_DISPLAY("Teleport Display");
|
||||
|
||||
// Paint the display!
|
||||
void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)
|
||||
|
|
@ -230,6 +239,7 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)
|
|||
|
||||
if (gWindowResized)
|
||||
{ //skip render on frames where window has been resized
|
||||
LLFastTimer t(FTM_RESIZE_WINDOW);
|
||||
gGL.flush();
|
||||
glClear(GL_COLOR_BUFFER_BIT);
|
||||
gViewerWindow->getWindow()->swapBuffers();
|
||||
|
|
@ -366,6 +376,7 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)
|
|||
|
||||
if (gTeleportDisplay)
|
||||
{
|
||||
LLFastTimer t(FTM_TELEPORT_DISPLAY);
|
||||
LLAppViewer::instance()->pingMainloopTimeout("Display:Teleport");
|
||||
const F32 TELEPORT_ARRIVAL_DELAY = 2.f; // Time to preload the world before raising the curtain after we've actually already arrived.
|
||||
|
||||
|
|
@ -421,14 +432,14 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)
|
|||
|
||||
gAgent.setTeleportState( LLAgent::TELEPORT_REQUESTED );
|
||||
gAgent.setTeleportMessage(
|
||||
LLAgent::sTeleportProgressMessages["requesting"]);
|
||||
LLAgent::sTeleportProgressMessages["requesting"]);
|
||||
gViewerWindow->setProgressString(LLAgent::sTeleportProgressMessages["requesting"]);
|
||||
break;
|
||||
|
||||
case LLAgent::TELEPORT_REQUESTED:
|
||||
// Waiting for source simulator to respond
|
||||
gViewerWindow->setProgressPercent( llmin(teleport_percent, 37.5f) );
|
||||
gViewerWindow->setProgressString(message);
|
||||
gViewerWindow->setProgressString(message);
|
||||
break;
|
||||
|
||||
case LLAgent::TELEPORT_MOVING:
|
||||
|
|
@ -483,7 +494,7 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)
|
|||
case LLAgent::TELEPORT_NONE:
|
||||
// No teleport in progress
|
||||
gViewerWindow->setShowProgress(FALSE,FALSE);
|
||||
gTeleportDisplay = FALSE;
|
||||
gTeleportDisplay = FALSE;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
|
@ -615,6 +626,7 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)
|
|||
|
||||
// *TODO: merge these two methods
|
||||
{
|
||||
LLFastTimer t(FTM_HUD_UPDATE);
|
||||
LLMemType mt_uh(LLMemType::MTYPE_DISPLAY_UPDATE_HUD);
|
||||
LLHUDManager::getInstance()->updateEffects();
|
||||
LLHUDObject::updateAll();
|
||||
|
|
@ -622,6 +634,7 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)
|
|||
}
|
||||
|
||||
{
|
||||
LLFastTimer t(FTM_DISPLAY_UPDATE_GEOM);
|
||||
LLMemType mt_ug(LLMemType::MTYPE_DISPLAY_UPDATE_GEOM);
|
||||
const F32 max_geom_update_time = 0.005f*10.f*gFrameIntervalSeconds; // 50 ms/second update time
|
||||
gPipeline.createObjects(max_geom_update_time);
|
||||
|
|
@ -631,6 +644,7 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)
|
|||
}
|
||||
|
||||
gPipeline.updateGL();
|
||||
|
||||
stop_glerror();
|
||||
|
||||
S32 water_clip = 0;
|
||||
|
|
@ -790,7 +804,7 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)
|
|||
LLImageGL::deleteDeadTextures();
|
||||
stop_glerror();
|
||||
}*/
|
||||
}
|
||||
}
|
||||
|
||||
LLGLState::checkStates();
|
||||
LLGLState::checkClientArrays();
|
||||
|
|
@ -962,14 +976,18 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)
|
|||
stop_glerror();
|
||||
}
|
||||
|
||||
for (U32 i = 0; i < gGLManager.mNumTextureImageUnits; i++)
|
||||
{ //dummy cleanup of any currently bound textures
|
||||
if (gGL.getTexUnit(i)->getCurrType() != LLTexUnit::TT_NONE)
|
||||
{
|
||||
gGL.getTexUnit(i)->unbind(gGL.getTexUnit(i)->getCurrType());
|
||||
gGL.getTexUnit(i)->disable();
|
||||
{
|
||||
LLFastTimer t(FTM_TEXTURE_UNBIND);
|
||||
for (U32 i = 0; i < gGLManager.mNumTextureImageUnits; i++)
|
||||
{ //dummy cleanup of any currently bound textures
|
||||
if (gGL.getTexUnit(i)->getCurrType() != LLTexUnit::TT_NONE)
|
||||
{
|
||||
gGL.getTexUnit(i)->unbind(gGL.getTexUnit(i)->getCurrType());
|
||||
gGL.getTexUnit(i)->disable();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
LLAppViewer::instance()->pingMainloopTimeout("Display:RenderFlush");
|
||||
|
||||
if (to_texture)
|
||||
|
|
@ -1035,6 +1053,8 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)
|
|||
display_stats();
|
||||
|
||||
LLAppViewer::instance()->pingMainloopTimeout("Display:Done");
|
||||
|
||||
gShiftFrame = false;
|
||||
}
|
||||
|
||||
void render_hud_attachments()
|
||||
|
|
|
|||
|
|
@ -729,8 +729,10 @@ void LLViewerJointMesh::updateFaceData(LLFace *face, F32 pixel_area, BOOL damp_w
|
|||
F32* vw = (F32*) vertex_weightsp.get();
|
||||
F32* cw = (F32*) clothing_weightsp.get();
|
||||
|
||||
LLVector4a::memcpyNonAliased16(tc, (F32*) mMesh->getTexCoords(), num_verts*2*sizeof(F32));
|
||||
LLVector4a::memcpyNonAliased16(vw, (F32*) mMesh->getWeights(), num_verts*sizeof(F32));
|
||||
S32 tc_size = (num_verts*2*sizeof(F32)+0xF) & ~0xF;
|
||||
LLVector4a::memcpyNonAliased16(tc, (F32*) mMesh->getTexCoords(), tc_size);
|
||||
S32 vw_size = (num_verts*sizeof(F32)+0xF) & ~0xF;
|
||||
LLVector4a::memcpyNonAliased16(vw, (F32*) mMesh->getWeights(), vw_size);
|
||||
LLVector4a::memcpyNonAliased16(cw, (F32*) mMesh->getClothingWeights(), num_verts*4*sizeof(F32));
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -9699,6 +9699,9 @@ void initialize_menus()
|
|||
// Communicate
|
||||
view_listener_t::addMenu(new LLCommunicateBlockList(), "Communicate.BlockList");
|
||||
|
||||
// Communicate
|
||||
view_listener_t::addMenu(new LLCommunicateBlockList(), "Communicate.BlockList");
|
||||
|
||||
// World menu
|
||||
view_listener_t::addMenu(new LLWorldAlwaysRun(), "World.AlwaysRun");
|
||||
view_listener_t::addMenu(new LLWorldCreateLandmark(), "World.CreateLandmark");
|
||||
|
|
|
|||
|
|
@ -167,6 +167,7 @@ static const U32 LLREQUEST_PERMISSION_THROTTLE_LIMIT = 5; // requests
|
|||
static const F32 LLREQUEST_PERMISSION_THROTTLE_INTERVAL = 10.0f; // seconds
|
||||
|
||||
extern BOOL gDebugClicks;
|
||||
extern bool gShiftFrame;
|
||||
|
||||
// function prototypes
|
||||
bool check_offer_throttle(const std::string& from_name, bool check_only);
|
||||
|
|
@ -4652,6 +4653,7 @@ void process_avatar_init_complete(LLMessageSystem* msg, void**)
|
|||
|
||||
void process_agent_movement_complete(LLMessageSystem* msg, void**)
|
||||
{
|
||||
gShiftFrame = true;
|
||||
gAgentMovementCompleted = true;
|
||||
|
||||
LLUUID agent_id;
|
||||
|
|
|
|||
|
|
@ -203,6 +203,7 @@ LLViewerObject::LLViewerObject(const LLUUID &id, const LLPCode pcode, LLViewerRe
|
|||
mID(id),
|
||||
mLocalID(0),
|
||||
mTotalCRC(0),
|
||||
mListIndex(-1),
|
||||
mTEImages(NULL),
|
||||
mGLName(0),
|
||||
mbCanSelect(TRUE),
|
||||
|
|
@ -239,6 +240,7 @@ LLViewerObject::LLViewerObject(const LLUUID &id, const LLPCode pcode, LLViewerRe
|
|||
mNumFaces(0),
|
||||
mTimeDilation(1.f),
|
||||
mRotTime(0.f),
|
||||
mAngularVelocityRot(),
|
||||
mJointInfo(NULL),
|
||||
mState(0),
|
||||
mMedia(NULL),
|
||||
|
|
@ -269,6 +271,7 @@ LLViewerObject::LLViewerObject(const LLUUID &id, const LLPCode pcode, LLViewerRe
|
|||
{
|
||||
mPositionAgent = mRegionp->getOriginAgent();
|
||||
}
|
||||
resetRot();
|
||||
|
||||
LLViewerObject::sNumObjects++;
|
||||
}
|
||||
|
|
@ -2111,18 +2114,24 @@ U32 LLViewerObject::processUpdateMessage(LLMessageSystem *mesgsys,
|
|||
}
|
||||
}
|
||||
|
||||
if (new_rot != mLastRot
|
||||
if (new_rot != getRotation()
|
||||
|| new_angv != old_angv)
|
||||
{
|
||||
if (new_rot != mLastRot)
|
||||
if (new_angv != old_angv)
|
||||
{
|
||||
mLastRot = new_rot;
|
||||
setRotation(new_rot);
|
||||
if (flagUsePhysics())
|
||||
{
|
||||
resetRot();
|
||||
}
|
||||
else
|
||||
{
|
||||
resetRotTime();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Set the rotation of the object followed by adjusting for the accumulated angular velocity (llSetTargetOmega)
|
||||
setRotation(new_rot * mAngularVelocityRot);
|
||||
setChanged(ROTATED | SILHOUETTE);
|
||||
|
||||
resetRot();
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -2215,8 +2224,8 @@ BOOL LLViewerObject::isActive() const
|
|||
|
||||
BOOL LLViewerObject::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time)
|
||||
{
|
||||
static LLFastTimer::DeclareTimer ftm("Viewer Object");
|
||||
LLFastTimer t(ftm);
|
||||
//static LLFastTimer::DeclareTimer ftm("Viewer Object");
|
||||
//LLFastTimer t(ftm);
|
||||
|
||||
if (mDead)
|
||||
{
|
||||
|
|
@ -4872,9 +4881,11 @@ void LLViewerObject::deleteParticleSource()
|
|||
// virtual
|
||||
void LLViewerObject::updateDrawable(BOOL force_damped)
|
||||
{
|
||||
if (mDrawable.notNull() &&
|
||||
!mDrawable->isState(LLDrawable::ON_MOVE_LIST) &&
|
||||
isChanged(MOVED))
|
||||
if (!isChanged(MOVED))
|
||||
{ //most common case, having an empty if case here makes for better branch prediction
|
||||
}
|
||||
else if (mDrawable.notNull() &&
|
||||
!mDrawable->isState(LLDrawable::ON_MOVE_LIST))
|
||||
{
|
||||
BOOL damped_motion =
|
||||
!isChanged(SHIFTED) && // not shifted between regions this frame and...
|
||||
|
|
@ -5614,18 +5625,31 @@ void LLViewerObject::applyAngularVelocity(F32 dt)
|
|||
|
||||
ang_vel *= 1.f/omega;
|
||||
|
||||
// calculate the delta increment based on the object's angular velocity
|
||||
dQ.setQuat(angle, ang_vel);
|
||||
|
||||
// accumulate the angular velocity rotations to re-apply in the case of an object update
|
||||
mAngularVelocityRot *= dQ;
|
||||
|
||||
// Just apply the delta increment to the current rotation
|
||||
setRotation(getRotation()*dQ);
|
||||
setChanged(MOVED | SILHOUETTE);
|
||||
}
|
||||
}
|
||||
|
||||
void LLViewerObject::resetRot()
|
||||
void LLViewerObject::resetRotTime()
|
||||
{
|
||||
mRotTime = 0.0f;
|
||||
}
|
||||
|
||||
void LLViewerObject::resetRot()
|
||||
{
|
||||
resetRotTime();
|
||||
|
||||
// Reset the accumulated angular velocity rotation
|
||||
mAngularVelocityRot.loadIdentity();
|
||||
}
|
||||
|
||||
U32 LLViewerObject::getPartitionType() const
|
||||
{
|
||||
return LLViewerRegion::PARTITION_NONE;
|
||||
|
|
|
|||
|
|
@ -212,6 +212,9 @@ public:
|
|||
virtual BOOL updateLOD();
|
||||
virtual BOOL setDrawableParent(LLDrawable* parentp);
|
||||
F32 getRotTime() { return mRotTime; }
|
||||
private:
|
||||
void resetRotTime();
|
||||
public:
|
||||
void resetRot();
|
||||
void applyAngularVelocity(F32 dt);
|
||||
|
||||
|
|
@ -224,11 +227,13 @@ public:
|
|||
LLViewerRegion* getRegion() const { return mRegionp; }
|
||||
|
||||
BOOL isSelected() const { return mUserSelected; }
|
||||
virtual void setSelected(BOOL sel) { mUserSelected = sel; mRotTime = 0.f;}
|
||||
virtual void setSelected(BOOL sel) { mUserSelected = sel; resetRot();}
|
||||
|
||||
const LLUUID &getID() const { return mID; }
|
||||
U32 getLocalID() const { return mLocalID; }
|
||||
U32 getCRC() const { return mTotalCRC; }
|
||||
S32 getListIndex() const { return mListIndex; }
|
||||
void setListIndex(S32 idx) { mListIndex = idx; }
|
||||
|
||||
virtual BOOL isFlexible() const { return FALSE; }
|
||||
virtual BOOL isSculpted() const { return FALSE; }
|
||||
|
|
@ -610,6 +615,9 @@ public:
|
|||
// Last total CRC received from sim, used for caching
|
||||
U32 mTotalCRC;
|
||||
|
||||
// index into LLViewerObjectList::mActiveObjects or -1 if not in list
|
||||
S32 mListIndex;
|
||||
|
||||
LLPointer<LLViewerTexture> *mTEImages;
|
||||
|
||||
// Selection, picking and rendering variables
|
||||
|
|
@ -737,7 +745,7 @@ protected:
|
|||
|
||||
F32 mTimeDilation; // Time dilation sent with the object.
|
||||
F32 mRotTime; // Amount (in seconds) that object has rotated according to angular velocity (llSetTargetOmega)
|
||||
LLQuaternion mLastRot; // last rotation received from the simulator
|
||||
LLQuaternion mAngularVelocityRot; // accumulated rotation from the angular velocity computations
|
||||
|
||||
LLVOJointInfo* mJointInfo;
|
||||
U8 mState; // legacy
|
||||
|
|
|
|||
|
|
@ -927,21 +927,30 @@ void LLViewerObjectList::update(LLAgent &agent, LLWorld &world)
|
|||
LLViewerObject *objectp = NULL;
|
||||
|
||||
// Make a copy of the list in case something in idleUpdate() messes with it
|
||||
std::vector<LLViewerObject*> idle_list;
|
||||
|
||||
static std::vector<LLViewerObject*> idle_list;
|
||||
|
||||
U32 idle_count = 0;
|
||||
|
||||
static LLFastTimer::DeclareTimer idle_copy("Idle Copy");
|
||||
|
||||
{
|
||||
LLFastTimer t(idle_copy);
|
||||
idle_list.reserve( mActiveObjects.size() );
|
||||
|
||||
for (std::set<LLPointer<LLViewerObject> >::iterator active_iter = mActiveObjects.begin();
|
||||
|
||||
for (std::vector<LLPointer<LLViewerObject> >::iterator active_iter = mActiveObjects.begin();
|
||||
active_iter != mActiveObjects.end(); active_iter++)
|
||||
{
|
||||
objectp = *active_iter;
|
||||
if (objectp)
|
||||
{
|
||||
idle_list.push_back( objectp );
|
||||
if (idle_count >= idle_list.size())
|
||||
{
|
||||
idle_list.push_back( objectp );
|
||||
}
|
||||
else
|
||||
{
|
||||
idle_list[idle_count] = objectp;
|
||||
}
|
||||
++idle_count;
|
||||
}
|
||||
else
|
||||
{ // There shouldn't be any NULL pointers in the list, but they have caused
|
||||
|
|
@ -951,10 +960,13 @@ void LLViewerObjectList::update(LLAgent &agent, LLWorld &world)
|
|||
}
|
||||
}
|
||||
|
||||
std::vector<LLViewerObject*>::iterator idle_end = idle_list.begin()+idle_count;
|
||||
|
||||
if (gSavedSettings.getBOOL("FreezeTime"))
|
||||
{
|
||||
|
||||
for (std::vector<LLViewerObject*>::iterator iter = idle_list.begin();
|
||||
iter != idle_list.end(); iter++)
|
||||
iter != idle_end; iter++)
|
||||
{
|
||||
objectp = *iter;
|
||||
if (objectp->isAvatar())
|
||||
|
|
@ -966,17 +978,17 @@ void LLViewerObjectList::update(LLAgent &agent, LLWorld &world)
|
|||
else
|
||||
{
|
||||
for (std::vector<LLViewerObject*>::iterator idle_iter = idle_list.begin();
|
||||
idle_iter != idle_list.end(); idle_iter++)
|
||||
idle_iter != idle_end; idle_iter++)
|
||||
{
|
||||
objectp = *idle_iter;
|
||||
if (!objectp->idleUpdate(agent, world, frame_time))
|
||||
if (objectp->idleUpdate(agent, world, frame_time))
|
||||
{
|
||||
// If Idle Update returns false, kill object!
|
||||
kill_list.push_back(objectp);
|
||||
num_active_objects++;
|
||||
}
|
||||
else
|
||||
{
|
||||
num_active_objects++;
|
||||
// If Idle Update returns false, kill object!
|
||||
kill_list.push_back(objectp);
|
||||
}
|
||||
}
|
||||
for (std::vector<LLViewerObject*>::iterator kill_iter = kill_list.begin();
|
||||
|
|
@ -1214,7 +1226,7 @@ void LLViewerObjectList::cleanupReferences(LLViewerObject *objectp)
|
|||
{
|
||||
//llinfos << "Removing " << objectp->mID << " " << objectp->getPCodeString() << " from active list in cleanupReferences." << llendl;
|
||||
objectp->setOnActiveList(FALSE);
|
||||
mActiveObjects.erase(objectp);
|
||||
removeFromActiveList(objectp);
|
||||
}
|
||||
|
||||
if (objectp->isOnMap())
|
||||
|
|
@ -1391,6 +1403,26 @@ void LLViewerObjectList::cleanDeadObjects(BOOL use_timer)
|
|||
mNumDeadObjects = 0;
|
||||
}
|
||||
|
||||
void LLViewerObjectList::removeFromActiveList(LLViewerObject* objectp)
|
||||
{
|
||||
S32 idx = objectp->getListIndex();
|
||||
if (idx != -1)
|
||||
{ //remove by moving last element to this object's position
|
||||
llassert(mActiveObjects[idx] == objectp);
|
||||
|
||||
objectp->setListIndex(-1);
|
||||
|
||||
S32 last_index = mActiveObjects.size()-1;
|
||||
|
||||
if (idx != last_index)
|
||||
{
|
||||
mActiveObjects[idx] = mActiveObjects[last_index];
|
||||
mActiveObjects[idx]->setListIndex(idx);
|
||||
mActiveObjects.pop_back();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void LLViewerObjectList::updateActive(LLViewerObject *objectp)
|
||||
{
|
||||
LLMemType mt(LLMemType::MTYPE_OBJECT);
|
||||
|
|
@ -1405,13 +1437,29 @@ void LLViewerObjectList::updateActive(LLViewerObject *objectp)
|
|||
if (active)
|
||||
{
|
||||
//llinfos << "Adding " << objectp->mID << " " << objectp->getPCodeString() << " to active list." << llendl;
|
||||
mActiveObjects.insert(objectp);
|
||||
objectp->setOnActiveList(TRUE);
|
||||
S32 idx = objectp->getListIndex();
|
||||
if (idx <= -1)
|
||||
{
|
||||
mActiveObjects.push_back(objectp);
|
||||
objectp->setListIndex(mActiveObjects.size()-1);
|
||||
objectp->setOnActiveList(TRUE);
|
||||
}
|
||||
else
|
||||
{
|
||||
llassert(idx < mActiveObjects.size());
|
||||
llassert(mActiveObjects[idx] == objectp);
|
||||
|
||||
if (idx >= mActiveObjects.size() ||
|
||||
mActiveObjects[idx] != objectp)
|
||||
{
|
||||
llwarns << "Invalid object list index detected!" << llendl;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
//llinfos << "Removing " << objectp->mID << " " << objectp->getPCodeString() << " from active list." << llendl;
|
||||
mActiveObjects.erase(objectp);
|
||||
removeFromActiveList(objectp);
|
||||
objectp->setOnActiveList(FALSE);
|
||||
}
|
||||
}
|
||||
|
|
@ -1485,6 +1533,10 @@ void LLViewerObjectList::onPhysicsFlagsFetchFailure(const LLUUID& object_id)
|
|||
mPendingPhysicsFlags.erase(object_id);
|
||||
}
|
||||
|
||||
static LLFastTimer::DeclareTimer FTM_SHIFT_OBJECTS("Shift Objects");
|
||||
static LLFastTimer::DeclareTimer FTM_PIPELINE_SHIFT("Pipeline Shift");
|
||||
static LLFastTimer::DeclareTimer FTM_REGION_SHIFT("Region Shift");
|
||||
|
||||
void LLViewerObjectList::shiftObjects(const LLVector3 &offset)
|
||||
{
|
||||
// This is called when we shift our origin when we cross region boundaries...
|
||||
|
|
@ -1496,6 +1548,8 @@ void LLViewerObjectList::shiftObjects(const LLVector3 &offset)
|
|||
return;
|
||||
}
|
||||
|
||||
LLFastTimer t(FTM_SHIFT_OBJECTS);
|
||||
|
||||
LLViewerObject *objectp;
|
||||
for (vobj_list_t::iterator iter = mObjects.begin(); iter != mObjects.end(); ++iter)
|
||||
{
|
||||
|
|
@ -1512,8 +1566,15 @@ void LLViewerObjectList::shiftObjects(const LLVector3 &offset)
|
|||
}
|
||||
}
|
||||
|
||||
gPipeline.shiftObjects(offset);
|
||||
LLWorld::getInstance()->shiftRegions(offset);
|
||||
{
|
||||
LLFastTimer t(FTM_PIPELINE_SHIFT);
|
||||
gPipeline.shiftObjects(offset);
|
||||
}
|
||||
|
||||
{
|
||||
LLFastTimer t(FTM_REGION_SHIFT);
|
||||
LLWorld::getInstance()->shiftRegions(offset);
|
||||
}
|
||||
}
|
||||
|
||||
void LLViewerObjectList::repartitionObjects()
|
||||
|
|
|
|||
|
|
@ -118,7 +118,9 @@ public:
|
|||
|
||||
void dirtyAllObjectInventory();
|
||||
|
||||
void removeFromActiveList(LLViewerObject* objectp);
|
||||
void updateActive(LLViewerObject *objectp);
|
||||
|
||||
void updateAvatarVisibility();
|
||||
|
||||
// Selection related stuff
|
||||
|
|
@ -197,7 +199,7 @@ protected:
|
|||
typedef std::vector<LLPointer<LLViewerObject> > vobj_list_t;
|
||||
|
||||
vobj_list_t mObjects;
|
||||
std::set<LLPointer<LLViewerObject> > mActiveObjects;
|
||||
std::vector<LLPointer<LLViewerObject> > mActiveObjects;
|
||||
|
||||
vobj_list_t mMapObjects;
|
||||
|
||||
|
|
|
|||
|
|
@ -1493,7 +1493,8 @@ void LLViewerRegion::unpackRegionHandshake()
|
|||
// all of our terrain stuff, by
|
||||
if (compp->getParamsReady())
|
||||
{
|
||||
getLand().dirtyAllPatches();
|
||||
//this line creates frame stalls on region crossing and removing it appears to have no effect
|
||||
//getLand().dirtyAllPatches();
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
|
|||
|
|
@ -83,11 +83,11 @@ public:
|
|||
|
||||
// New Virtual functions
|
||||
virtual F32 getTotalDistortion() = 0;
|
||||
virtual const LLVector3& getAvgDistortion() = 0;
|
||||
virtual const LLVector4a& getAvgDistortion() = 0;
|
||||
virtual F32 getMaxDistortion() = 0;
|
||||
virtual LLVector3 getVertexDistortion(S32 index, LLPolyMesh *mesh) = 0;
|
||||
virtual const LLVector3* getFirstDistortion(U32 *index, LLPolyMesh **mesh) = 0;
|
||||
virtual const LLVector3* getNextDistortion(U32 *index, LLPolyMesh **mesh) = 0;
|
||||
virtual LLVector4a getVertexDistortion(S32 index, LLPolyMesh *mesh) = 0;
|
||||
virtual const LLVector4a* getFirstDistortion(U32 *index, LLPolyMesh **mesh) = 0;
|
||||
virtual const LLVector4a* getNextDistortion(U32 *index, LLPolyMesh **mesh) = 0;
|
||||
|
||||
// interface methods
|
||||
F32 getDisplayOrder() const { return getInfo()->mEditGroupDisplayOrder; }
|
||||
|
|
|
|||
|
|
@ -5074,8 +5074,11 @@ void LLViewerWindow::requestResolutionUpdate()
|
|||
mResDirty = true;
|
||||
}
|
||||
|
||||
static LLFastTimer::DeclareTimer FTM_WINDOW_CHECK_SETTINGS("Window Settings");
|
||||
|
||||
void LLViewerWindow::checkSettings()
|
||||
{
|
||||
LLFastTimer t(FTM_WINDOW_CHECK_SETTINGS);
|
||||
if (mStatesDirty)
|
||||
{
|
||||
gGL.refreshState();
|
||||
|
|
|
|||
|
|
@ -835,6 +835,7 @@ LLVOAvatar::~LLVOAvatar()
|
|||
lldebugs << "LLVOAvatar Destructor (0x" << this << ") id:" << mID << llendl;
|
||||
|
||||
mRoot.removeAllChildren();
|
||||
mJointMap.clear();
|
||||
|
||||
deleteAndClearArray(mSkeleton);
|
||||
deleteAndClearArray(mCollisionVolumes);
|
||||
|
|
@ -1518,8 +1519,6 @@ void LLVOAvatar::onShift(const LLVector4a& shift_vector)
|
|||
const LLVector3& shift = reinterpret_cast<const LLVector3&>(shift_vector);
|
||||
mLastAnimExtents[0] += shift;
|
||||
mLastAnimExtents[1] += shift;
|
||||
mNeedsImpostorUpdate = TRUE;
|
||||
mNeedsAnimUpdate = TRUE;
|
||||
}
|
||||
|
||||
void LLVOAvatar::updateSpatialExtents(LLVector4a& newMin, LLVector4a &newMax)
|
||||
|
|
@ -1993,6 +1992,7 @@ void LLVOAvatar::buildCharacter()
|
|||
// remove all of mRoot's children
|
||||
//-------------------------------------------------------------------------
|
||||
mRoot.removeAllChildren();
|
||||
mJointMap.clear();
|
||||
mIsBuilt = FALSE;
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
|
@ -2449,7 +2449,7 @@ S32 LLVOAvatar::setTETexture(const U8 te, const LLUUID& uuid)
|
|||
}
|
||||
}
|
||||
|
||||
static LLFastTimer::DeclareTimer FTM_AVATAR_UPDATE("Update Avatar");
|
||||
static LLFastTimer::DeclareTimer FTM_AVATAR_UPDATE("Avatar Update");
|
||||
static LLFastTimer::DeclareTimer FTM_JOINT_UPDATE("Update Joints");
|
||||
|
||||
//------------------------------------------------------------------------
|
||||
|
|
@ -2751,7 +2751,7 @@ void LLVOAvatar::idleUpdateMisc(bool detailed_update)
|
|||
|
||||
if (isImpostor() && !mNeedsImpostorUpdate)
|
||||
{
|
||||
LLVector4a ext[2];
|
||||
LL_ALIGN_16(LLVector4a ext[2]);
|
||||
F32 distance;
|
||||
LLVector3 angle;
|
||||
|
||||
|
|
@ -5445,7 +5445,20 @@ const LLUUID& LLVOAvatar::getID() const
|
|||
// RN: avatar joints are multi-rooted to include screen-based attachments
|
||||
LLJoint *LLVOAvatar::getJoint( const std::string &name )
|
||||
{
|
||||
LLJoint* jointp = mRoot.findJoint(name);
|
||||
joint_map_t::iterator iter = mJointMap.find(name);
|
||||
|
||||
LLJoint* jointp = NULL;
|
||||
|
||||
if (iter == mJointMap.end() || iter->second == NULL)
|
||||
{ //search for joint and cache found joint in lookup table
|
||||
jointp = mRoot.findJoint(name);
|
||||
mJointMap[name] = jointp;
|
||||
}
|
||||
else
|
||||
{ //return cached pointer
|
||||
jointp = iter->second;
|
||||
}
|
||||
|
||||
return jointp;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -93,6 +93,16 @@ protected:
|
|||
**/
|
||||
|
||||
public:
|
||||
void* operator new(size_t size)
|
||||
{
|
||||
return ll_aligned_malloc_16(size);
|
||||
}
|
||||
|
||||
void operator delete(void* ptr)
|
||||
{
|
||||
ll_aligned_free_16(ptr);
|
||||
}
|
||||
|
||||
LLVOAvatar(const LLUUID &id, const LLPCode pcode, LLViewerRegion *regionp);
|
||||
virtual void markDead();
|
||||
static void initClass(); // Initialize data that's only init'd once per class.
|
||||
|
|
@ -216,7 +226,7 @@ public:
|
|||
bool isBuilt() const { return mIsBuilt; }
|
||||
|
||||
private: //aligned members
|
||||
LLVector4a mImpostorExtents[2];
|
||||
LL_ALIGN_16(LLVector4a mImpostorExtents[2]);
|
||||
|
||||
private:
|
||||
BOOL mSupportsAlphaLayers; // For backwards compatibility, TRUE for 1.23+ clients
|
||||
|
|
@ -359,6 +369,10 @@ public:
|
|||
|
||||
LLVector3 mHeadOffset; // current head position
|
||||
LLViewerJoint mRoot;
|
||||
|
||||
typedef std::map<std::string, LLJoint*> joint_map_t;
|
||||
joint_map_t mJointMap;
|
||||
|
||||
protected:
|
||||
static BOOL parseSkeletonFile(const std::string& filename);
|
||||
void buildCharacter();
|
||||
|
|
|
|||
|
|
@ -49,6 +49,16 @@ class LLVOAvatarSelf :
|
|||
**/
|
||||
|
||||
public:
|
||||
void* operator new(size_t size)
|
||||
{
|
||||
return ll_aligned_malloc_16(size);
|
||||
}
|
||||
|
||||
void operator delete(void* ptr)
|
||||
{
|
||||
ll_aligned_free_16(ptr);
|
||||
}
|
||||
|
||||
LLVOAvatarSelf(const LLUUID &id, const LLPCode pcode, LLViewerRegion *regionp);
|
||||
virtual ~LLVOAvatarSelf();
|
||||
virtual void markDead();
|
||||
|
|
|
|||
|
|
@ -622,7 +622,7 @@ void LLGrassPartition::addGeometryCount(LLSpatialGroup* group, U32& vertex_count
|
|||
mFaceList.clear();
|
||||
|
||||
LLViewerCamera* camera = LLViewerCamera::getInstance();
|
||||
for (LLSpatialGroup::element_iter i = group->getData().begin(); i != group->getData().end(); ++i)
|
||||
for (LLSpatialGroup::element_iter i = group->getDataBegin(); i != group->getDataEnd(); ++i)
|
||||
{
|
||||
LLDrawable* drawablep = *i;
|
||||
|
||||
|
|
|
|||
|
|
@ -52,8 +52,7 @@ LLPointer<LLVertexBuffer> LLVOPartGroup::sVB = NULL;
|
|||
S32 LLVOPartGroup::sVBSlotFree[];
|
||||
S32* LLVOPartGroup::sVBSlotCursor = NULL;
|
||||
|
||||
//static
|
||||
void LLVOPartGroup::restoreGL()
|
||||
void LLVOPartGroup::initClass()
|
||||
{
|
||||
for (S32 i = 0; i < LL_MAX_PARTICLE_COUNT; ++i)
|
||||
{
|
||||
|
|
@ -61,7 +60,11 @@ void LLVOPartGroup::restoreGL()
|
|||
}
|
||||
|
||||
sVBSlotCursor = sVBSlotFree;
|
||||
}
|
||||
|
||||
//static
|
||||
void LLVOPartGroup::restoreGL()
|
||||
{
|
||||
sVB = new LLVertexBuffer(VERTEX_DATA_MASK, GL_STREAM_DRAW_ARB);
|
||||
U32 count = LL_MAX_PARTICLE_COUNT;
|
||||
sVB->allocateBuffer(count*4, count*6, true);
|
||||
|
|
@ -554,7 +557,7 @@ void LLParticlePartition::addGeometryCount(LLSpatialGroup* group, U32& vertex_co
|
|||
mFaceList.clear();
|
||||
|
||||
LLViewerCamera* camera = LLViewerCamera::getInstance();
|
||||
for (LLSpatialGroup::element_iter i = group->getData().begin(); i != group->getData().end(); ++i)
|
||||
for (LLSpatialGroup::element_iter i = group->getDataBegin(); i != group->getDataEnd(); ++i)
|
||||
{
|
||||
LLDrawable* drawablep = *i;
|
||||
|
||||
|
|
@ -626,7 +629,7 @@ void LLParticlePartition::getGeometry(LLSpatialGroup* group)
|
|||
LLFace* facep = *i;
|
||||
LLAlphaObject* object = (LLAlphaObject*) facep->getViewerObject();
|
||||
|
||||
if (facep->getIndicesStart() == 0xFFFFFFFF)
|
||||
if (!facep->isState(LLFace::PARTICLE))
|
||||
{ //set the indices of this face
|
||||
S32 idx = LLVOPartGroup::findAvailableVBSlot();
|
||||
if (idx >= 0)
|
||||
|
|
@ -635,6 +638,7 @@ void LLParticlePartition::getGeometry(LLSpatialGroup* group)
|
|||
facep->setIndicesIndex(idx*6);
|
||||
facep->setVertexBuffer(LLVOPartGroup::sVB);
|
||||
facep->setPoolType(LLDrawPool::POOL_ALPHA);
|
||||
facep->setState(LLFace::PARTICLE);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
|
|||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue