merge with viewer-release
commit
5ae117aff6
66
.hgtags
66
.hgtags
|
|
@ -72,35 +72,35 @@ b53a0576eec80614d7767ed72b40ed67aeff27c9 DRTVWR-38_2.5.2-release
|
|||
461c8c65b5c799ddfe365422f9be9c0095d91e7d 2.6.0-beta1-tip
|
||||
9e4641f4a7870c0f565a25a2971368d5a29516a1 2.6.0-beta2
|
||||
9e4641f4a7870c0f565a25a2971368d5a29516a1 DRTVWR-41_2.6.0-beta2
|
||||
42f32494bac475d0737799346f6831558ae8bf5d 2.6.0-release
|
||||
42f32494bac475d0737799346f6831558ae8bf5d DRTVWR-39_2.6.0-release
|
||||
c5bdef3aaa2744626aef3c217ce29e1900d357b3 2.6.1-beta1
|
||||
c5bdef3aaa2744626aef3c217ce29e1900d357b3 2.6.1-start
|
||||
c5bdef3aaa2744626aef3c217ce29e1900d357b3 DRTVWR-43_2.6.1-beta1
|
||||
c9182ed77d427c759cfacf49a7b71a2e20d522aa 2.6.1-release
|
||||
c9182ed77d427c759cfacf49a7b71a2e20d522aa DRTVWR-42_2.6.1-release
|
||||
56b2778c743c2a964d82e1caf11084d76a87de2c 2.6.2-start
|
||||
d1203046bb653b763f835b04d184646949d8dd5c 2.6.2-beta1
|
||||
d1203046bb653b763f835b04d184646949d8dd5c DRTVWR-45_2.6.2-beta1
|
||||
42f32494bac475d0737799346f6831558ae8bf5d 2.6.0-release
|
||||
42f32494bac475d0737799346f6831558ae8bf5d DRTVWR-39_2.6.0-release
|
||||
c9182ed77d427c759cfacf49a7b71a2e20d522aa 2.6.1-release
|
||||
c9182ed77d427c759cfacf49a7b71a2e20d522aa DRTVWR-42_2.6.1-release
|
||||
214180ad5714ce8392b82bbebcc92f4babd98300 2.6.2-release
|
||||
214180ad5714ce8392b82bbebcc92f4babd98300 DRTVWR-44_2.6.2-release
|
||||
52b2263ab28f0976c689fd0b76c55a9eb027cdbf end-of-develop.py
|
||||
ec32f1045e7c2644015245df3a9933620aa194b8 2.6.3-start
|
||||
d7fcefabdf32bb61a9ea6d6037c1bb26190a85bc 2.6.3-beta1
|
||||
d7fcefabdf32bb61a9ea6d6037c1bb26190a85bc DRTVWR-47_2.6.3-beta1
|
||||
0630e977504af5ea320c58d33cae4e1ddee793e9 2.6.3-beta2
|
||||
0630e977504af5ea320c58d33cae4e1ddee793e9 DRTVWR-48_2.6.3-beta2
|
||||
3178e311da3a8739a85363665006ea3c4610cad4 dons-headless-hackathon-work
|
||||
214180ad5714ce8392b82bbebcc92f4babd98300 2.6.2-release
|
||||
214180ad5714ce8392b82bbebcc92f4babd98300 DRTVWR-44_2.6.2-release
|
||||
7db558aaa7c176f2022b3e9cfe38ac72f6d1fccd 2.6.5-beta1
|
||||
7db558aaa7c176f2022b3e9cfe38ac72f6d1fccd DRTVWR-50_2.6.5-beta1
|
||||
8f2da1701c81a62352df2b8d413d27fb2cade9a6 2.6.3-release
|
||||
8f2da1701c81a62352df2b8d413d27fb2cade9a6 DRTVWR-46_2.6.3-release
|
||||
3178e311da3a8739a85363665006ea3c4610cad4 dons-headless-hackathon-work
|
||||
7db558aaa7c176f2022b3e9cfe38ac72f6d1fccd 2.6.5-beta1
|
||||
7db558aaa7c176f2022b3e9cfe38ac72f6d1fccd DRTVWR-50_2.6.5-beta1
|
||||
800cefce8d364ffdd2f383cbecb91294da3ea424 2.6.6-start
|
||||
bb1075286b3b147b1dae2e3d6b2d56f04ff03f35 2.6.6-beta1
|
||||
bb1075286b3b147b1dae2e3d6b2d56f04ff03f35 DRTVWR-52_2.6.6-beta1
|
||||
5e349dbe9cc84ea5795af8aeb6d473a0af9d4953 2.6.8-start
|
||||
dac76a711da5f1489a01c1fa62ec97d99c25736d 2.6.6-release
|
||||
dac76a711da5f1489a01c1fa62ec97d99c25736d DRTVWR-51_2.6.6-release
|
||||
5e349dbe9cc84ea5795af8aeb6d473a0af9d4953 2.6.8-start
|
||||
beafa8a9bd1d1b670b7523d865204dc4a4b38eef 2.6.8-beta1
|
||||
beafa8a9bd1d1b670b7523d865204dc4a4b38eef DRTVWR-55_2.6.8-beta1
|
||||
be2000b946f8cb3de5f44b2d419287d4c48ec4eb 2.6.8-release
|
||||
|
|
@ -119,50 +119,50 @@ e67da2c6e3125966dd49eef98b36317afac1fcfe 2.6.9-start
|
|||
9f79a6ed8fdcd2f3dac33ea6b3236eeb278dccfe 2.7.2-start
|
||||
e0dc8b741eaa27dcdfbc9e956bb2579b954d15eb 2.7.2-beta1
|
||||
e0dc8b741eaa27dcdfbc9e956bb2579b954d15eb DRTVWR-63_2.7.2-beta1
|
||||
6a3e7e403bd19e45fdfc2fcc716867af3ab80861 2.7.3-start
|
||||
fe3a8e7973072ea62043c08b19b66626c1a720eb 2.7.1-release
|
||||
fe3a8e7973072ea62043c08b19b66626c1a720eb 2.7.2-release
|
||||
fe3a8e7973072ea62043c08b19b66626c1a720eb DRTVWR-60_2.7.1-release
|
||||
fe3a8e7973072ea62043c08b19b66626c1a720eb DRTVWR-62_2.7.2-release
|
||||
6a3e7e403bd19e45fdfc2fcc716867af3ab80861 2.7.3-start
|
||||
6af10678de4736222b2c3f7e010e984fb5b327de 2.7.4-start
|
||||
be963a4eef635542f9617d7f5fd22ba48fb71958 2.7.4-beta1
|
||||
be963a4eef635542f9617d7f5fd22ba48fb71958 DRTVWR-67_2.7.4-beta1
|
||||
057f319dd8eccdf63a54d99686c68cdcb31b6abc 2.7.4-release
|
||||
057f319dd8eccdf63a54d99686c68cdcb31b6abc DRTVWR-66_2.7.4-release
|
||||
19a498fa62570f352d7d246f17e3c81cc1d82d8b 2.7.5-start
|
||||
09984bfa6cae17e0f72d02b75c1b7393c65eecfc 2.7.5-beta1
|
||||
09984bfa6cae17e0f72d02b75c1b7393c65eecfc DRTVWR-69_2.7.5-beta1
|
||||
6866d9df6efbd441c66451debd376d21211de39c 2.7.5-release
|
||||
6866d9df6efbd441c66451debd376d21211de39c DRTVWR-68_2.7.5-release
|
||||
e1ed60913230dd64269a7f7fc52cbc6004f6d52c 2.8.0-beta1
|
||||
e1ed60913230dd64269a7f7fc52cbc6004f6d52c 2.8.0-start
|
||||
e1ed60913230dd64269a7f7fc52cbc6004f6d52c DRTVWR-71_2.8.0-beta1
|
||||
057f319dd8eccdf63a54d99686c68cdcb31b6abc 2.7.4-release
|
||||
057f319dd8eccdf63a54d99686c68cdcb31b6abc DRTVWR-66_2.7.4-release
|
||||
6866d9df6efbd441c66451debd376d21211de39c 2.7.5-release
|
||||
6866d9df6efbd441c66451debd376d21211de39c DRTVWR-68_2.7.5-release
|
||||
493d9127ee50e84ba08a736a65a23ca86f7a5b01 2.8.0-release
|
||||
493d9127ee50e84ba08a736a65a23ca86f7a5b01 DRTVWR-70_2.8.0-release
|
||||
502f6a5deca9365ddae57db4f1e30172668e171e 2.8.1-start
|
||||
2c7e459e0c883f8e406b932e41e60097e9ee077e 2.8.1-beta1
|
||||
2c7e459e0c883f8e406b932e41e60097e9ee077e DRTVWR-73_2.8.1-beta1
|
||||
493d9127ee50e84ba08a736a65a23ca86f7a5b01 2.8.0-release
|
||||
493d9127ee50e84ba08a736a65a23ca86f7a5b01 DRTVWR-70_2.8.0-release
|
||||
54bc7823ad4e3a436fef79710f685a7372bbf795 2.8.2-start
|
||||
ac0f1a132d35c02a58861d37cca75b0429ac9137 2.8.3-start
|
||||
29e93d7e19991011bd12b5748142b11a5dcb4370 2.8.1-release
|
||||
29e93d7e19991011bd12b5748142b11a5dcb4370 DRTVWR-72_2.8.1-release
|
||||
4780e3bd2b3042f91be3426151f28c30d199bb3b 2.8.1-hotfix
|
||||
4780e3bd2b3042f91be3426151f28c30d199bb3b DRTVWR-76_2.8.1-hotfix
|
||||
54bc7823ad4e3a436fef79710f685a7372bbf795 2.8.2-start
|
||||
ac0f1a132d35c02a58861d37cca75b0429ac9137 2.8.3-start
|
||||
599677276b227357140dda35bea4a2c18e2e67b5 2.8.3-beta1
|
||||
599677276b227357140dda35bea4a2c18e2e67b5 DRTVWR-75_2.8.3-beta1
|
||||
fb85792b84bf28428889c4cc966469d92e5dac4c 2.8.3-release
|
||||
fb85792b84bf28428889c4cc966469d92e5dac4c DRTVWR-74_2.8.3-release
|
||||
6b678ea52f90d5c14181661dcd2546e25bde483e 3.0.0-start
|
||||
b0be6ce3adfef3a014a2389d360539f8a86c5439 3.0.0-beta1
|
||||
b0be6ce3adfef3a014a2389d360539f8a86c5439 DRTVWR-78_3.0.0-beta1
|
||||
fb85792b84bf28428889c4cc966469d92e5dac4c 2.8.3-release
|
||||
fb85792b84bf28428889c4cc966469d92e5dac4c DRTVWR-74_2.8.3-release
|
||||
1778f26b6d0ae762dec3ca37140f66620f2485d9 3.0.0-release
|
||||
1778f26b6d0ae762dec3ca37140f66620f2485d9 DRTVWR-77_3.0.0-release
|
||||
82a2079ffcb57ecb1b3849cb41376b443e1eb912 3.0.1-start
|
||||
364fd63517fbacbbcb9129d096187171ba8c9e48 3.0.1-beta1
|
||||
364fd63517fbacbbcb9129d096187171ba8c9e48 DRTVWR-81_3.0.1-beta1
|
||||
f2412ecd6740803ea9452f1d17fd872e263a0df7 3.0.2-start
|
||||
42784bf50fa01974bada2a1af3892ee09c93fcda 3.0.2-beta1
|
||||
42784bf50fa01974bada2a1af3892ee09c93fcda DRTVWR-83_3.0.2-beta1
|
||||
1778f26b6d0ae762dec3ca37140f66620f2485d9 3.0.0-release
|
||||
1778f26b6d0ae762dec3ca37140f66620f2485d9 DRTVWR-77_3.0.0-release
|
||||
e5c9af2d7980a99a71650be3a0cf7b2b3c3b897e 3.0.2-beta2
|
||||
e5c9af2d7980a99a71650be3a0cf7b2b3c3b897e DRTVWR-86_3.0.2-beta2
|
||||
b95ddac176ac944efdc85cbee94ac2e1eab44c79 3.0.3-start
|
||||
|
|
@ -170,9 +170,9 @@ b95ddac176ac944efdc85cbee94ac2e1eab44c79 3.0.3-start
|
|||
6694f3f062aa45f64ab391d25a3eb3d5eb1b0871 DRTVWR-85_3.0.3-beta1
|
||||
61aa7974df089e8621fe9a4c69bcdefdb3cc208a 3.0.3-beta2
|
||||
61aa7974df089e8621fe9a4c69bcdefdb3cc208a DRTVWR-89_3.0.3-beta2
|
||||
586907287be581817b2422b5137971b22d54ea48 3.0.4-start
|
||||
0496d2f74043cf4e6058e76ac3db03d44cff42ce 3.0.3-release
|
||||
0496d2f74043cf4e6058e76ac3db03d44cff42ce DRTVWR-84_3.0.3-release
|
||||
586907287be581817b2422b5137971b22d54ea48 3.0.4-start
|
||||
92a3aa04775438226399b19deee12ac3b5a62838 3.0.5-start
|
||||
c7282e59f374ee904bd793c3c444455e3399b0c5 3.1.0-start
|
||||
2657fa785bbfac115852c41bd0adaff74c2ad5da 3.1.0-beta1
|
||||
|
|
@ -193,11 +193,11 @@ e440cd1dfbd128d7d5467019e497f7f803640ad6 DRTVWR-95_3.2.0-beta1
|
|||
c4911ec8cd81e676dfd2af438b3e065407a94a7a 3.2.1-start
|
||||
9e390d76807fa70d356b8716fb83b8ce42a629ef 3.2.1-beta1
|
||||
9e390d76807fa70d356b8716fb83b8ce42a629ef DRTVWR-100_3.2.1-beta1
|
||||
a8c7030d6845186fac7c188be4323a0e887b4184 3.2.1-release
|
||||
a8c7030d6845186fac7c188be4323a0e887b4184 DRTVWR-99_3.2.1-release
|
||||
40b46edba007d15d0059c80864b708b99c1da368 3.2.2-start
|
||||
523df3e67378541498d516d52af4402176a26bac 3.2.2-beta1
|
||||
523df3e67378541498d516d52af4402176a26bac DRTVWR-102_3.2.2-beta1
|
||||
a8c7030d6845186fac7c188be4323a0e887b4184 3.2.1-release
|
||||
a8c7030d6845186fac7c188be4323a0e887b4184 DRTVWR-99_3.2.1-release
|
||||
80f3e30d8aa4d8f674a48bd742aaa6d8e9eae0b5 3.2.3-start
|
||||
3fe994349fae64fc40874bb59db387131eb35a41 3.2.4-beta1
|
||||
3fe994349fae64fc40874bb59db387131eb35a41 3.2.4-start
|
||||
|
|
@ -279,6 +279,10 @@ a8057e1b9a1246b434a27405be35e030f7d28b0c 3.3.4-beta3
|
|||
9cd174d3a54d93d409a7c346a15b8bfb40fc58f4 DRTVWR-184
|
||||
ab2ffc547c8a8950ff187c4f6c95e5334fab597b 3.3.4-beta5
|
||||
28e100d0379a2b0710c57647a28fc5239d3d7b99 3.3.4-release
|
||||
6dfb0fba782c9233dd95f24ec48146db0d3f210b DRTVWR-199
|
||||
7c9102fb998885621919f2474a002c35b583539b 3.3.4-release2
|
||||
8c9085066c78ed5f6c9379dc054c82a6fcdb1851 DRTVWR-207
|
||||
351eea5f9dc192fc5ddea3b02958de97677a0a12 3.3.4-release3
|
||||
005dfe5c4c377207d065fb27858d2eb0b53b143a DRTVWR-167
|
||||
888768f162d2c0a8de1dcc5fb9a08bd8bd120a6b DRTVWR-175
|
||||
a8b3eca451a9eaab59987efb0ab1c4217e3f2dcc DRTVWR-182
|
||||
|
|
@ -294,13 +298,9 @@ ae5c83dd61d2d37c45f1d5b8bf2b036d87599f1b DRTVWR-198
|
|||
b1dbb1a83f48f93f6f878cff9e52d2cb635e145c 3.4.0-beta2
|
||||
37402e2b19af970d51b0a814d79892cc5647532b DRTVWR-200
|
||||
182a9bf30e81070361bb020a78003b1cf398e79c 3.4.0-beta3
|
||||
6dfb0fba782c9233dd95f24ec48146db0d3f210b DRTVWR-199
|
||||
7c9102fb998885621919f2474a002c35b583539b 3.3.4-release2
|
||||
7649a3dff5ec22d3727377e5f02efd0f421e4cb5 DRTVWR-201
|
||||
84fb70dfe3444e75a44fb4bee43e2fc8221cebdd 3.4.0-beta4
|
||||
573e863be2f26d3687161def4b9fea9b7038dda8 3.4.0-beta5
|
||||
8c9085066c78ed5f6c9379dc054c82a6fcdb1851 DRTVWR-207
|
||||
351eea5f9dc192fc5ddea3b02958de97677a0a12 3.3.4-release3
|
||||
af7b28e75bd5a629cd9e0dc46fb3f1757626f493 DRTVWR-212
|
||||
015012c2b740ccdec8a8c3d6e5f898449ecfe0b8 DRTVWR-213
|
||||
62b07aa81b1957897c3846292bb9412977b0af6c 3.3.4-beta6
|
||||
|
|
@ -457,3 +457,9 @@ a314f1c94374ab1f6633dd2983f7090a68663eb2 3.5.2-beta4
|
|||
9013c07bfe1c51107233f1924dccdcc5057dd909 3.5.2-beta6
|
||||
9b1b6f33aa5394b27bb652b31b5cb81ef6060370 3.5.2-release
|
||||
a277b841729f2a62ba1e34acacc964bc13c1ad6f 3.5.3-release
|
||||
fb1630153bac5552046ea914af3f14deabc1def8 3.6.0-materials-beta1
|
||||
69429d81ae4dd321eda2607901ef0a0fde71b54c 3.6.0-release
|
||||
69429d81ae4dd321eda2607901ef0a0fde71b54c 3.6.0-release
|
||||
0a56f33ad6aa112032b14a41dad759ad377bdde9 3.6.0-release
|
||||
75cf8e855ae1af6895a35da475314c2b5acf1850 3.6.1-release
|
||||
f6741d5fe8d632651424484df0fe0cb4a01e9fbe 3.6.2-release
|
||||
|
|
|
|||
11
BuildParams
11
BuildParams
|
|
@ -60,6 +60,7 @@ viewer-release.build_debug_release_separately = true
|
|||
viewer-release.build_viewer_update_version_manager = true
|
||||
viewer-release.codeticket_add_context = false
|
||||
|
||||
|
||||
# ========================================
|
||||
# mesh-development
|
||||
# ========================================
|
||||
|
|
@ -122,6 +123,14 @@ viewer-pathfinding.build_CYGWIN_Debug = false
|
|||
viewer-pathfinding.build_viewer_update_version_manager = false
|
||||
|
||||
# ========================================
|
||||
# viewer-materials
|
||||
# ========================================
|
||||
|
||||
viewer-materials.viewer_channel = "Second Life Beta Materials"
|
||||
viewer-materials.build_debug_release_separately = true
|
||||
viewer-materials.build_CYGWIN_Debug = false
|
||||
viewer-materials.build_viewer_update_version_manager = false
|
||||
|
||||
# viewer-chui
|
||||
#
|
||||
# ========================================
|
||||
|
|
@ -189,3 +198,5 @@ runway.build_viewer_update_version_manager = false
|
|||
|
||||
|
||||
# eof
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -0,0 +1,164 @@
|
|||
diff -r fe4bab01522e indra/llprimitive/llrendermaterialtable.cpp
|
||||
--- a/indra/llprimitive/llrendermaterialtable.cpp Wed May 15 17:57:21 2013 +0000
|
||||
+++ b/indra/llprimitive/llrendermaterialtable.cpp Wed May 22 14:23:04 2013 -0700
|
||||
@@ -184,6 +184,44 @@
|
||||
}
|
||||
}
|
||||
|
||||
+// 'v' is an integer value for 100ths of radians (don't ask...)
|
||||
+//
|
||||
+void LLRenderMaterialEntry::LLRenderMaterial::setSpecularMapRotation(S32 v) const
|
||||
+{
|
||||
+ // Store the fact that we're using the new rotation rep
|
||||
+ //
|
||||
+ m_flags |= kNewSpecularMapRotation;
|
||||
+
|
||||
+ // Store 'sign bit' in our m_flags
|
||||
+ //
|
||||
+ m_flags &= ~kSpecularMapRotationNegative;
|
||||
+ m_flags |= (specularMapRotation < 0) ? kSpecularMapRotationNegative : 0;
|
||||
+
|
||||
+ specularRotation = abs(specularRotation);
|
||||
+ specularRotation = llmin(specularRotation, MAX_MATERIAL_MAP_ROTATION);
|
||||
+
|
||||
+ m_specularRotation = (U16)(abs(specularMapRotation));
|
||||
+}
|
||||
+
|
||||
+// 'v' is an integer value for 100ths of radians (don't ask...)
|
||||
+//
|
||||
+void LLRenderMaterialEntry::LLRenderMaterial::setNormalMapRotation(S32 v) const
|
||||
+{
|
||||
+
|
||||
+ // Store the fact that we're using the new rep for this material
|
||||
+ //
|
||||
+ m_flags |= kNewNormalMapRotation;
|
||||
+
|
||||
+ // Store 'sign bit' in our m_flags
|
||||
+ //
|
||||
+ m_flags &= ~kNormalMapRotationNegative;
|
||||
+ m_flags |= (normalMapRotation < 0) ? kNormalMapRotationNegative : 0;
|
||||
+
|
||||
+ normalRotation = abs(normalRotation);
|
||||
+ normalRotation = llmin(normalRotation, MAX_MATERIAL_MAP_ROTATION);
|
||||
+
|
||||
+ m_normalRotation = (U16)(abs(normalMapRotation));
|
||||
+}
|
||||
|
||||
void LLRenderMaterialEntry::LLRenderMaterial::asLLSD( LLSD& dest ) const
|
||||
{
|
||||
@@ -193,20 +231,45 @@
|
||||
dest["NormOffsetY"] = (S32)m_normalOffsetY;
|
||||
dest["NormRepeatX"] = m_normalRepeatX;
|
||||
dest["NormRepeatY"] = m_normalRepeatY;
|
||||
- dest["NormRotation"] = (S32)m_normalRotation;
|
||||
+
|
||||
+ S32 value = (S32)m_normalMapRotation;
|
||||
+
|
||||
+ // If we don't have the flag for new rotations set,
|
||||
+ // then we need to convert it now
|
||||
+ if (!(m_flags & kNewNormalMapRotation))
|
||||
+ {
|
||||
+ F32 old_radians = ((F32)m_normalMapRotation / 10000.0f)
|
||||
+ S32 new_val = (S32)(old_radians * 100.0f);
|
||||
+ setNormalMapRotation(new_Val);
|
||||
+ }
|
||||
+
|
||||
+ dest["NormRotation"] = (m_flags & kNormalMapRotationNegative) ? -(S32)m_normalRotation : (S32)m_normalRotation;
|
||||
|
||||
dest["SpecOffsetX"] = (S32)m_specularOffsetX;
|
||||
dest["SpecOffsetY"] = (S32)m_specularOffsetY;
|
||||
dest["SpecRepeatX"] = m_specularRepeatX;
|
||||
dest["SpecRepeatY"] = m_specularRepeatY;
|
||||
- dest["SpecRotation"] = (S32)m_specularRotation;
|
||||
+
|
||||
+
|
||||
+ value = (S32)m_specularRotation;
|
||||
+
|
||||
+ // If we don't have the flag for new rotations set,
|
||||
+ // then we need to convert it now
|
||||
+ if (!(m_flags & kNewSpecularMapRotation))
|
||||
+ {
|
||||
+ F32 old_radians = ((F32)m_specularMapRotation / 10000.0f)
|
||||
+ S32 new_val = (S32)(old_radians * 100.0f);
|
||||
+ setSpecularMapRotation(new_Val);
|
||||
+ }
|
||||
+
|
||||
+ dest["SpecRotation"] = (m_flags & kSpecularMapRotationNegative) ? -(S32)m_specularRotation : (S32)m_specularRotation;
|
||||
|
||||
dest["SpecMap"] = m_specularMap;
|
||||
dest["SpecColor"] = m_specularLightColor.getValue();
|
||||
dest["SpecExp"] = (S32)m_specularLightExponent;
|
||||
dest["EnvIntensity"] = (S32)m_environmentIntensity;
|
||||
dest["AlphaMaskCutoff"] = (S32)m_alphaMaskCutoff;
|
||||
- dest["DiffuseAlphaMode"] = (S32)m_diffuseAlphaMode;
|
||||
+ dest["DiffuseAlphaMode"] = (S32)(m_diffuseAlphaMode & 0xF);
|
||||
|
||||
}
|
||||
|
||||
@@ -217,7 +280,10 @@
|
||||
m_normalOffsetY = (U16)materialDefinition["NormOffsetY"].asInteger();
|
||||
m_normalRepeatX = materialDefinition["NormRepeatX"].asInteger();
|
||||
m_normalRepeatY = materialDefinition["NormRepeatY"].asInteger();
|
||||
- m_normalRotation = (U16)materialDefinition["NormRotation"].asInteger();
|
||||
+
|
||||
+ S32 normalRotation = materialDefinition["NormRotation"].asInteger();
|
||||
+
|
||||
+ setNormalMapRotation(normalRotation);
|
||||
|
||||
m_specularMap = materialDefinition["SpecMap"].asUUID();
|
||||
|
||||
@@ -225,7 +291,10 @@
|
||||
m_specularOffsetY = (U16)materialDefinition["SpecOffsetY"].asInteger();
|
||||
m_specularRepeatX = materialDefinition["SpecRepeatX"].asInteger();
|
||||
m_specularRepeatY = materialDefinition["SpecRepeatY"].asInteger();
|
||||
- m_specularRotation = (U16)materialDefinition["SpecRotation"].asInteger();
|
||||
+
|
||||
+ S32 specularRotation = materialDefinition["SpecRotation"].asInteger();
|
||||
+
|
||||
+ setSpecularMapRotation(specularRotation);
|
||||
|
||||
m_specularLightColor.setValue( materialDefinition["SpecColor"] );
|
||||
m_specularLightExponent = (U8)materialDefinition["SpecExp"].asInteger();
|
||||
diff -r fe4bab01522e indra/llprimitive/llrendermaterialtable.h
|
||||
--- a/indra/llprimitive/llrendermaterialtable.h Wed May 15 17:57:21 2013 +0000
|
||||
+++ b/indra/llprimitive/llrendermaterialtable.h Wed May 22 14:23:04 2013 -0700
|
||||
@@ -89,11 +89,17 @@
|
||||
|
||||
void computeID();
|
||||
|
||||
+
|
||||
struct LLRenderMaterial
|
||||
{
|
||||
void asLLSD( LLSD& dest ) const;
|
||||
void setFromLLSD( const LLSD& materialDefinition );
|
||||
|
||||
+ void setNormalMapRotation(S32 v);
|
||||
+ void setSpecularMapRotation(S32 v);
|
||||
+
|
||||
+ const S32 MAX_MATERIAL_MAP_ROTATION = 62800;
|
||||
+
|
||||
// 36 bytes
|
||||
LLUUID m_normalMap;
|
||||
LLUUID m_specularMap;
|
||||
@@ -119,7 +125,20 @@
|
||||
U8 m_specularLightExponent;
|
||||
U8 m_environmentIntensity;
|
||||
U8 m_alphaMaskCutoff;
|
||||
- U8 m_diffuseAlphaMode;
|
||||
+ U8 m_diffuseAlphaMode : 4;
|
||||
+ U8 m_flags : 4;
|
||||
+ };
|
||||
+
|
||||
+ // Flags stored in LLRenderMaterial::m_flags to differentiate 'old' rotation format
|
||||
+ // which doesn't handle negative or large rotations correctly from new format.
|
||||
+ // All ancient materials will have these flags unset as the values for diffuseAlphaMode
|
||||
+ // from which the bits were stolen never used more than the bottom 2 bits.
|
||||
+ //
|
||||
+ enum RenderMaterialFlags {
|
||||
+ kNewNormalMapRotation = 0x1,
|
||||
+ kNewSpecularMapRotation = 0x2,
|
||||
+ kNormalMapRotationNegative = 0x4,
|
||||
+ kSpecularMapRotationNegative = 0x8
|
||||
};
|
||||
|
||||
friend struct eastl::hash<LLRenderMaterial>;
|
||||
|
|
@ -404,6 +404,7 @@ Ganymedes Costagravas
|
|||
Geenz Spad
|
||||
STORM-1823
|
||||
STORM-1900
|
||||
NORSPEC-229
|
||||
Gene Frostbite
|
||||
GeneJ Composer
|
||||
Geneko Nemeth
|
||||
|
|
@ -647,6 +648,7 @@ Jonathan Yap
|
|||
STORM-1872
|
||||
STORM-1858
|
||||
STORM-1862
|
||||
OPEN-161
|
||||
Kadah Coba
|
||||
STORM-1060
|
||||
STORM-1843
|
||||
|
|
@ -1023,6 +1025,7 @@ Ryozu Kojima
|
|||
VWR-287
|
||||
Sachi Vixen
|
||||
Sahkolihaa Contepomi
|
||||
MATBUG-102
|
||||
Saii Hallard
|
||||
SaintLEOlions Zimer
|
||||
Salahzar Stenvaag
|
||||
|
|
@ -1173,6 +1176,7 @@ Techwolf Lupindo
|
|||
SNOW-746
|
||||
VWR-12385
|
||||
VWR-20893
|
||||
OPEN-161
|
||||
Templar Merlin
|
||||
tenebrous pau
|
||||
VWR-247
|
||||
|
|
@ -1240,6 +1244,7 @@ Vadim Bigbear
|
|||
VWR-2681
|
||||
Vaalith Jinn
|
||||
STORM-64
|
||||
MATBUG-8
|
||||
Vector Hastings
|
||||
VWR-8726
|
||||
Veritas Raymaker
|
||||
|
|
|
|||
|
|
@ -49,7 +49,7 @@ else (STANDALONE)
|
|||
set(APR_INCLUDE_DIR ${LIBS_PREBUILT_DIR}/include/apr-1)
|
||||
|
||||
if (LINUX)
|
||||
list(APPEND APRUTIL_LIBRARIES ${DB_LIBRARIES} uuid)
|
||||
list(APPEND APRUTIL_LIBRARIES ${DB_LIBRARIES} uuid)
|
||||
list(APPEND APRUTIL_LIBRARIES ${DB_LIBRARIES} rt)
|
||||
endif (LINUX)
|
||||
endif (STANDALONE)
|
||||
|
|
|
|||
|
|
@ -18,7 +18,7 @@ if (NOT DEFINED VIEWER_SHORT_VERSION) # will be true in indra/, false in indra/n
|
|||
find_program(MERCURIAL hg)
|
||||
if (DEFINED MERCURIAL)
|
||||
execute_process(
|
||||
COMMAND ${MERCURIAL} parents --template "{rev}"
|
||||
COMMAND ${MERCURIAL} log -r tip --template "{p1rev}"
|
||||
OUTPUT_VARIABLE VIEWER_VERSION_REVISION
|
||||
OUTPUT_STRIP_TRAILING_WHITESPACE
|
||||
)
|
||||
|
|
|
|||
|
|
@ -12,6 +12,7 @@ set(cmake_SOURCE_FILES
|
|||
Audio.cmake
|
||||
BerkeleyDB.cmake
|
||||
Boost.cmake
|
||||
BuildVersion.cmake
|
||||
CARes.cmake
|
||||
CMakeCopyIfDifferent.cmake
|
||||
ConfigurePkgConfig.cmake
|
||||
|
|
|
|||
|
|
@ -20,6 +20,7 @@ if(WINDOWS)
|
|||
set(vivox_src_dir "${ARCH_PREBUILT_DIRS_RELEASE}")
|
||||
set(vivox_files
|
||||
SLVoice.exe
|
||||
ca-bundle.crt
|
||||
libsndfile-1.dll
|
||||
vivoxplatform.dll
|
||||
vivoxsdk.dll
|
||||
|
|
@ -195,6 +196,7 @@ elseif(DARWIN)
|
|||
set(vivox_src_dir "${ARCH_PREBUILT_DIRS_RELEASE}")
|
||||
set(vivox_files
|
||||
SLVoice
|
||||
ca-bundle.crt
|
||||
libsndfile.dylib
|
||||
libvivoxoal.dylib
|
||||
libortp.dylib
|
||||
|
|
@ -241,6 +243,7 @@ elseif(LINUX)
|
|||
libvivoxplatform.so
|
||||
libvivoxsdk.so
|
||||
SLVoice
|
||||
# ca-bundle.crt #No cert for linux. It is actually still 3.2SDK.
|
||||
)
|
||||
# *TODO - update this to use LIBS_PREBUILT_DIR and LL_ARCH_DIR variables
|
||||
# or ARCH_PREBUILT_DIRS
|
||||
|
|
|
|||
|
|
@ -1,20 +1,20 @@
|
|||
# -*- cmake -*-
|
||||
|
||||
set(OS_DRAG_DROP ON CACHE BOOL "Build the viewer with OS level drag and drop turned on or off")
|
||||
set(OS_DRAG_DROP ON CACHE BOOL "Build the viewer with OS level drag and drop turned on or off")
|
||||
|
||||
if (OS_DRAG_DROP)
|
||||
if (OS_DRAG_DROP)
|
||||
|
||||
if (WINDOWS)
|
||||
add_definitions(-DLL_OS_DRAGDROP_ENABLED=1)
|
||||
endif (WINDOWS)
|
||||
if (WINDOWS)
|
||||
add_definitions(-DLL_OS_DRAGDROP_ENABLED=1)
|
||||
endif (WINDOWS)
|
||||
|
||||
if (DARWIN)
|
||||
add_definitions(-DLL_OS_DRAGDROP_ENABLED=1)
|
||||
endif (DARWIN)
|
||||
if (DARWIN)
|
||||
add_definitions(-DLL_OS_DRAGDROP_ENABLED=1)
|
||||
endif (DARWIN)
|
||||
|
||||
if (LINUX)
|
||||
add_definitions(-DLL_OS_DRAGDROP_ENABLED=0)
|
||||
endif (LINUX)
|
||||
if (LINUX)
|
||||
add_definitions(-DLL_OS_DRAGDROP_ENABLED=0)
|
||||
endif (LINUX)
|
||||
|
||||
endif (OS_DRAG_DROP)
|
||||
endif (OS_DRAG_DROP)
|
||||
|
||||
|
|
|
|||
|
|
@ -12,14 +12,14 @@ set(HAVOK_DEBUG_LIBRARY_PATH ${LIBS_PREBUILT_DIR}/lib/debug/havok-fulldebug)
|
|||
set(HAVOK_RELEASE_LIBRARY_PATH ${LIBS_PREBUILT_DIR}/lib/release/havok)
|
||||
|
||||
if (LL_DEBUG_HAVOK)
|
||||
if (WIN32)
|
||||
# Always link relwithdebinfo to havok-hybrid on windows.
|
||||
set(HAVOK_RELWITHDEBINFO_LIBRARY_PATH ${LIBS_PREBUILT_DIR}/lib/debug/havok-hybrid)
|
||||
else (WIN32)
|
||||
set(HAVOK_RELWITHDEBINFO_LIBRARY_PATH ${LIBS_PREBUILT_DIR}/lib/debug/havok-fulldebug)
|
||||
endif (WIN32)
|
||||
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)
|
||||
set(HAVOK_RELWITHDEBINFO_LIBRARY_PATH ${LIBS_PREBUILT_DIR}/lib/release/havok)
|
||||
endif (LL_DEBUG_HAVOK)
|
||||
|
||||
set(HAVOK_LIBS
|
||||
|
|
@ -51,14 +51,14 @@ unset(HK_RELWITHDEBINFO_LIBRARIES)
|
|||
|
||||
# *TODO: Figure out why we need to extract like this...
|
||||
foreach(HAVOK_LIB ${HAVOK_LIBS})
|
||||
find_library(HAVOK_DEBUG_LIB_${HAVOK_LIB} ${HAVOK_LIB} PATHS ${HAVOK_DEBUG_LIBRARY_PATH})
|
||||
find_library(HAVOK_RELEASE_LIB_${HAVOK_LIB} ${HAVOK_LIB} PATHS ${HAVOK_RELEASE_LIBRARY_PATH})
|
||||
find_library(HAVOK_RELWITHDEBINFO_LIB_${HAVOK_LIB} ${HAVOK_LIB} PATHS ${HAVOK_RELWITHDEBINFO_LIBRARY_PATH})
|
||||
|
||||
if(LINUX)
|
||||
set(debug_dir "${HAVOK_DEBUG_LIBRARY_PATH}/${HAVOK_LIB}")
|
||||
set(release_dir "${HAVOK_RELEASE_LIBRARY_PATH}/${HAVOK_LIB}")
|
||||
set(relwithdebinfo_dir "${HAVOK_RELWITHDEBINFO_LIBRARY_PATH}/${HAVOK_LIB}")
|
||||
find_library(HAVOK_DEBUG_LIB_${HAVOK_LIB} ${HAVOK_LIB} PATHS ${HAVOK_DEBUG_LIBRARY_PATH})
|
||||
find_library(HAVOK_RELEASE_LIB_${HAVOK_LIB} ${HAVOK_LIB} PATHS ${HAVOK_RELEASE_LIBRARY_PATH})
|
||||
find_library(HAVOK_RELWITHDEBINFO_LIB_${HAVOK_LIB} ${HAVOK_LIB} PATHS ${HAVOK_RELWITHDEBINFO_LIBRARY_PATH})
|
||||
|
||||
if(LINUX)
|
||||
set(debug_dir "${HAVOK_DEBUG_LIBRARY_PATH}/${HAVOK_LIB}")
|
||||
set(release_dir "${HAVOK_RELEASE_LIBRARY_PATH}/${HAVOK_LIB}")
|
||||
set(relwithdebinfo_dir "${HAVOK_RELWITHDEBINFO_LIBRARY_PATH}/${HAVOK_LIB}")
|
||||
|
||||
# Try to avoid extracting havok library each time we run cmake.
|
||||
if("${havok_${HAVOK_LIB}_extracted}" STREQUAL "" AND EXISTS "${CMAKE_BINARY_DIR}/temp/havok_${HAVOK_LIB}_extracted")
|
||||
|
|
@ -77,35 +77,35 @@ foreach(HAVOK_LIB ${HAVOK_LIBS})
|
|||
if(DEBUG_PREBUILT)
|
||||
MESSAGE(STATUS "${cmd} ${debug_dir}")
|
||||
endif(DEBUG_PREBUILT)
|
||||
exec_program( ${cmd} ${HAVOK_DEBUG_LIBRARY_PATH} ARGS ${debug_dir} OUTPUT_VARIABLE rv)
|
||||
exec_program( ${cmd} ${HAVOK_DEBUG_LIBRARY_PATH} ARGS ${debug_dir} OUTPUT_VARIABLE rv)
|
||||
|
||||
if(DEBUG_PREBUILT)
|
||||
MESSAGE(STATUS "${cmd} ${release_dir}")
|
||||
endif(DEBUG_PREBUILT)
|
||||
exec_program( ${cmd} ${HAVOK_RELEASE_LIBRARY_PATH} ARGS ${release_dir} OUTPUT_VARIABLE rv)
|
||||
exec_program( ${cmd} ${HAVOK_RELEASE_LIBRARY_PATH} ARGS ${release_dir} OUTPUT_VARIABLE rv)
|
||||
|
||||
if(DEBUG_PREBUILT)
|
||||
MESSAGE(STATUS "${cmd} ${relwithdebinfo_dir}")
|
||||
endif(DEBUG_PREBUILT)
|
||||
exec_program( ${cmd} ${HAVOK_RELWITHDEBINFO_LIBRARY_PATH} ARGS ${relwithdebinfo_dir} OUTPUT_VARIABLE rv)
|
||||
exec_program( ${cmd} ${HAVOK_RELWITHDEBINFO_LIBRARY_PATH} ARGS ${relwithdebinfo_dir} OUTPUT_VARIABLE rv)
|
||||
|
||||
set(cmd "ar")
|
||||
set(arg " -xv")
|
||||
set(arg "${arg} ../lib${HAVOK_LIB}.a")
|
||||
set(cmd "ar")
|
||||
set(arg " -xv")
|
||||
set(arg "${arg} ../lib${HAVOK_LIB}.a")
|
||||
if(DEBUG_PREBUILT)
|
||||
MESSAGE(STATUS "cd ${debug_dir} && ${cmd} ${arg}")
|
||||
endif(DEBUG_PREBUILT)
|
||||
exec_program( ${cmd} ${debug_dir} ARGS ${arg} OUTPUT_VARIABLE rv)
|
||||
exec_program( ${cmd} ${debug_dir} ARGS ${arg} OUTPUT_VARIABLE rv)
|
||||
|
||||
if(DEBUG_PREBUILT)
|
||||
MESSAGE(STATUS "cd ${release_dir} && ${cmd} ${arg}")
|
||||
endif(DEBUG_PREBUILT)
|
||||
exec_program( ${cmd} ${release_dir} ARGS ${arg} OUTPUT_VARIABLE rv)
|
||||
exec_program( ${cmd} ${release_dir} ARGS ${arg} OUTPUT_VARIABLE rv)
|
||||
|
||||
if(DEBUG_PREBUILT)
|
||||
MESSAGE(STATUS "cd ${relwithdebinfo_dir} && ${cmd} ${arg}")
|
||||
endif(DEBUG_PREBUILT)
|
||||
exec_program( ${cmd} ${relwithdebinfo_dir} ARGS ${arg} OUTPUT_VARIABLE rv)
|
||||
exec_program( ${cmd} ${relwithdebinfo_dir} ARGS ${arg} OUTPUT_VARIABLE rv)
|
||||
|
||||
# Just assume success for now.
|
||||
set(havok_${HAVOK_LIB}_extracted 0)
|
||||
|
|
@ -113,9 +113,9 @@ foreach(HAVOK_LIB ${HAVOK_LIBS})
|
|||
|
||||
endif(${CMAKE_BINARY_DIR}/temp/havok-source_installed IS_NEWER_THAN ${CMAKE_BINARY_DIR}/temp/havok_${HAVOK_LIB}_extracted OR NOT ${havok_${HAVOK_LIB}_extracted} EQUAL 0)
|
||||
|
||||
file(GLOB extracted_debug "${debug_dir}/*.o")
|
||||
file(GLOB extracted_release "${release_dir}/*.o")
|
||||
file(GLOB extracted_relwithdebinfo "${relwithdebinfo_dir}/*.o")
|
||||
file(GLOB extracted_debug "${debug_dir}/*.o")
|
||||
file(GLOB extracted_release "${release_dir}/*.o")
|
||||
file(GLOB extracted_relwithdebinfo "${relwithdebinfo_dir}/*.o")
|
||||
|
||||
if(DEBUG_PREBUILT)
|
||||
MESSAGE(STATUS "extracted_debug ${debug_dir}/*.o")
|
||||
|
|
@ -123,15 +123,15 @@ foreach(HAVOK_LIB ${HAVOK_LIBS})
|
|||
MESSAGE(STATUS "extracted_relwithdebinfo ${relwithdebinfo_dir}/*.o")
|
||||
endif(DEBUG_PREBUILT)
|
||||
|
||||
list(APPEND HK_DEBUG_LIBRARIES ${extracted_debug})
|
||||
list(APPEND HK_RELEASE_LIBRARIES ${extracted_release})
|
||||
list(APPEND HK_RELWITHDEBINFO_LIBRARIES ${extracted_relwithdebinfo})
|
||||
else(LINUX)
|
||||
# Win32
|
||||
list(APPEND HK_DEBUG_LIBRARIES ${HAVOK_DEBUG_LIB_${HAVOK_LIB}})
|
||||
list(APPEND HK_RELEASE_LIBRARIES ${HAVOK_RELEASE_LIB_${HAVOK_LIB}})
|
||||
list(APPEND HK_RELWITHDEBINFO_LIBRARIES ${HAVOK_RELWITHDEBINFO_LIB_${HAVOK_LIB}})
|
||||
endif (LINUX)
|
||||
list(APPEND HK_DEBUG_LIBRARIES ${extracted_debug})
|
||||
list(APPEND HK_RELEASE_LIBRARIES ${extracted_release})
|
||||
list(APPEND HK_RELWITHDEBINFO_LIBRARIES ${extracted_relwithdebinfo})
|
||||
else(LINUX)
|
||||
# Win32
|
||||
list(APPEND HK_DEBUG_LIBRARIES ${HAVOK_DEBUG_LIB_${HAVOK_LIB}})
|
||||
list(APPEND HK_RELEASE_LIBRARIES ${HAVOK_RELEASE_LIB_${HAVOK_LIB}})
|
||||
list(APPEND HK_RELWITHDEBINFO_LIBRARIES ${HAVOK_RELWITHDEBINFO_LIB_${HAVOK_LIB}})
|
||||
endif (LINUX)
|
||||
endforeach(HAVOK_LIB)
|
||||
|
||||
endif(NOT DEFINED ${CMAKE_CURRENT_LIST_FILE}_INCLUDED)
|
||||
|
|
|
|||
|
|
@ -2,6 +2,8 @@
|
|||
|
||||
# these should be moved to their own cmake file
|
||||
include(Prebuilt)
|
||||
include(Boost)
|
||||
|
||||
use_prebuilt_binary(colladadom)
|
||||
use_prebuilt_binary(pcre)
|
||||
use_prebuilt_binary(libxml)
|
||||
|
|
@ -15,10 +17,7 @@ if (WINDOWS)
|
|||
optimized llprimitive
|
||||
debug libcollada14dom22-d
|
||||
optimized libcollada14dom22
|
||||
debug libboost_filesystem-mt-gd
|
||||
optimized libboost_filesystem-mt
|
||||
debug libboost_system-mt-gd
|
||||
optimized libboost_system-mt
|
||||
${BOOST_SYSTEM_LIBRARIES}
|
||||
)
|
||||
else (WINDOWS)
|
||||
set(LLPRIMITIVE_LIBRARIES
|
||||
|
|
|
|||
|
|
@ -11,8 +11,8 @@ set(LLRENDER_INCLUDE_DIRS
|
|||
|
||||
if (BUILD_HEADLESS)
|
||||
set(LLRENDER_HEADLESS_LIBRARIES
|
||||
llrenderheadless
|
||||
)
|
||||
llrenderheadless
|
||||
)
|
||||
endif (BUILD_HEADLESS)
|
||||
set(LLRENDER_LIBRARIES
|
||||
llrender
|
||||
|
|
|
|||
|
|
@ -33,10 +33,10 @@ set(LLWINDOW_INCLUDE_DIRS
|
|||
|
||||
if (BUILD_HEADLESS)
|
||||
set(LLWINDOW_HEADLESS_LIBRARIES
|
||||
llwindowheadless
|
||||
)
|
||||
llwindowheadless
|
||||
)
|
||||
endif (BUILD_HEADLESS)
|
||||
|
||||
set(LLWINDOW_LIBRARIES
|
||||
llwindow
|
||||
)
|
||||
set(LLWINDOW_LIBRARIES
|
||||
llwindow
|
||||
)
|
||||
|
|
|
|||
|
|
@ -1,12 +1,12 @@
|
|||
# -*- cmake -*-
|
||||
|
||||
set(INCLUDE_VLD_CMAKE OFF CACHE BOOL "Build the Windows viewer with Visual Leak Detector turned on or off")
|
||||
set(INCLUDE_VLD_CMAKE OFF CACHE BOOL "Build the Windows viewer with Visual Leak Detector turned on or off")
|
||||
|
||||
if (INCLUDE_VLD_CMAKE)
|
||||
if (INCLUDE_VLD_CMAKE)
|
||||
|
||||
if (WINDOWS)
|
||||
add_definitions(-DINCLUDE_VLD=1)
|
||||
endif (WINDOWS)
|
||||
if (WINDOWS)
|
||||
add_definitions(-DINCLUDE_VLD=1)
|
||||
endif (WINDOWS)
|
||||
|
||||
endif (INCLUDE_VLD_CMAKE)
|
||||
endif (INCLUDE_VLD_CMAKE)
|
||||
|
||||
|
|
|
|||
|
|
@ -1,107 +0,0 @@
|
|||
#!/usr/bin/env python
|
||||
"""\
|
||||
@file llversion.py
|
||||
@brief Parses llcommon/llversionserver.h and llcommon/llversionviewer.h
|
||||
for the version string and channel string.
|
||||
Parses hg info for branch and revision.
|
||||
|
||||
$LicenseInfo:firstyear=2006&license=mit$
|
||||
|
||||
Copyright (c) 2006-2009, Linden Research, Inc.
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
THE SOFTWARE.
|
||||
$/LicenseInfo$
|
||||
"""
|
||||
|
||||
import re, sys, os, subprocess
|
||||
|
||||
# Methods for gathering version information from
|
||||
# llversionviewer.h and llversionserver.h
|
||||
|
||||
def get_src_root():
|
||||
indra_lib_python_indra_path = os.path.dirname(__file__)
|
||||
return os.path.abspath(os.path.realpath(indra_lib_python_indra_path + "/../../../../../"))
|
||||
|
||||
def get_version_file_contents(version_type):
|
||||
filepath = get_src_root() + '/indra/llcommon/llversion%s.h' % version_type
|
||||
file = open(filepath,"r")
|
||||
file_str = file.read()
|
||||
file.close()
|
||||
return file_str
|
||||
|
||||
def get_version(version_type):
|
||||
file_str = get_version_file_contents(version_type)
|
||||
m = re.search('const S32 LL_VERSION_MAJOR = (\d+);', file_str)
|
||||
VER_MAJOR = m.group(1)
|
||||
m = re.search('const S32 LL_VERSION_MINOR = (\d+);', file_str)
|
||||
VER_MINOR = m.group(1)
|
||||
m = re.search('const S32 LL_VERSION_PATCH = (\d+);', file_str)
|
||||
VER_PATCH = m.group(1)
|
||||
m = re.search('const S32 LL_VERSION_BUILD = (\d+);', file_str)
|
||||
VER_BUILD = m.group(1)
|
||||
version = "%(VER_MAJOR)s.%(VER_MINOR)s.%(VER_PATCH)s.%(VER_BUILD)s" % locals()
|
||||
return version
|
||||
|
||||
def get_channel(version_type):
|
||||
file_str = get_version_file_contents(version_type)
|
||||
m = re.search('const char \* const LL_CHANNEL = "(.+)";', file_str)
|
||||
return m.group(1)
|
||||
|
||||
def get_viewer_version():
|
||||
return get_version('viewer')
|
||||
|
||||
def get_server_version():
|
||||
return get_version('server')
|
||||
|
||||
def get_viewer_channel():
|
||||
return get_channel('viewer')
|
||||
|
||||
def get_server_channel():
|
||||
return get_channel('server')
|
||||
|
||||
# Methods for gathering hg information
|
||||
def get_hg_repo():
|
||||
child = subprocess.Popen(["hg","showconfig","paths.default"], stdout=subprocess.PIPE)
|
||||
output, error = child.communicate()
|
||||
status = child.returncode
|
||||
if status:
|
||||
print >> sys.stderr, error
|
||||
sys.exit(1)
|
||||
if not output:
|
||||
print >> sys.stderr, 'ERROR: cannot find repo we cloned from'
|
||||
sys.exit(1)
|
||||
return output
|
||||
|
||||
def get_hg_changeset():
|
||||
# The right thing to do would be to use the *global* revision id:
|
||||
# "hg id -i"
|
||||
# For the moment though, we use the parent revision:
|
||||
child = subprocess.Popen(["hg","parents","--template","{rev}"], stdout=subprocess.PIPE)
|
||||
output, error = child.communicate()
|
||||
status = child.returncode
|
||||
if status:
|
||||
print >> sys.stderr, error
|
||||
sys.exit(1)
|
||||
lines = output.splitlines()
|
||||
if len(lines) > 1:
|
||||
print >> sys.stderr, 'ERROR: working directory has %d parents' % len(lines)
|
||||
return lines[0]
|
||||
|
||||
def using_hg():
|
||||
return os.path.isdir(os.path.join(get_src_root(), '.hg'))
|
||||
|
|
@ -26,6 +26,10 @@ include_directories(SYSTEM
|
|||
${LLCOMMON_SYSTEM_INCLUDE_DIRS}
|
||||
${LLXML_SYSTEM_INCLUDE_DIRS}
|
||||
)
|
||||
include_directories(SYSTEM
|
||||
${LLCOMMON_SYSTEM_INCLUDE_DIRS}
|
||||
${LLXML_SYSTEM_INCLUDE_DIRS}
|
||||
)
|
||||
|
||||
set(linux_crash_logger_SOURCE_FILES
|
||||
linux_crash_logger.cpp
|
||||
|
|
|
|||
|
|
@ -597,19 +597,31 @@ void LLPolyMorphTarget::apply( ESex avatar_sex )
|
|||
norm.mul(delta_weight*maskWeight*NORMAL_SOFTEN_FACTOR);
|
||||
scaled_normals[vert_index_mesh].add(norm);
|
||||
norm = scaled_normals[vert_index_mesh];
|
||||
|
||||
// guard against degenerate input data before we create NaNs below!
|
||||
//
|
||||
norm.normalize3fast();
|
||||
normals[vert_index_mesh] = norm;
|
||||
|
||||
// calculate new binormals
|
||||
LLVector4a binorm = mMorphData->mBinormals[vert_index_morph];
|
||||
|
||||
// guard against degenerate input data before we create NaNs below!
|
||||
//
|
||||
if (!binorm.isFinite3() || (binorm.dot3(binorm).getF32() <= F_APPROXIMATELY_ZERO))
|
||||
{
|
||||
binorm.set(1,0,0,1);
|
||||
}
|
||||
|
||||
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.setCross3(norm, tangent);
|
||||
normalized_binormal.normalize3fast();
|
||||
|
||||
|
||||
tex_coords[vert_index_mesh] += mMorphData->mTexCoords[vert_index_morph] * delta_weight * maskWeight;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -67,7 +67,7 @@ inline bool Check_FMOD_Error(FMOD_RESULT result, const char *string)
|
|||
{
|
||||
if(result == FMOD_OK)
|
||||
return false;
|
||||
llwarns << string << " Error: " << FMOD_ErrorString(result) << llendl;
|
||||
lldebugs << string << " Error: " << FMOD_ErrorString(result) << llendl;
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
@ -258,19 +258,29 @@ bool LLAudioEngine_FMODEX::init(const S32 num_channels, void* userdata)
|
|||
|
||||
int r_numbuffers, r_samplerate, r_channels, r_bits;
|
||||
unsigned int r_bufferlength;
|
||||
char r_name[256];
|
||||
mSystem->getDSPBufferSize(&r_bufferlength, &r_numbuffers);
|
||||
mSystem->getSoftwareFormat(&r_samplerate, NULL, &r_channels, NULL, NULL, &r_bits);
|
||||
mSystem->getDriverInfo(0, r_name, 255, 0);
|
||||
r_name[255] = '\0';
|
||||
int latency = (int)(1000.0f * r_bufferlength * r_numbuffers / r_samplerate);
|
||||
LL_INFOS("AppInit") << "LLAudioEngine_FMODEX::init(): r_bufferlength=" << r_bufferlength << " bytes" << LL_ENDL;
|
||||
LL_INFOS("AppInit") << "LLAudioEngine_FMODEX::init(): r_numbuffers=" << r_numbuffers << LL_ENDL;
|
||||
|
||||
LL_INFOS("AppInit") << "FMOD device: "<< r_name << "\n"
|
||||
<< "FMOD Ex parameters: " << r_samplerate << " Hz * " << r_channels << " * " <<r_bits <<" bit\n"
|
||||
<< "\tbuffer " << r_bufferlength << " * " << r_numbuffers << " (" << latency <<"ms)" << LL_ENDL;
|
||||
mSystem->getSoftwareFormat(&r_samplerate, NULL, &r_channels, NULL, NULL, &r_bits);
|
||||
LL_INFOS("AppInit") << "LLAudioEngine_FMODEX::init(): r_samplerate=" << r_samplerate << "Hz" << LL_ENDL;
|
||||
LL_INFOS("AppInit") << "LLAudioEngine_FMODEX::init(): r_channels=" << r_channels << LL_ENDL;
|
||||
LL_INFOS("AppInit") << "LLAudioEngine_FMODEX::init(): r_bits =" << r_bits << LL_ENDL;
|
||||
|
||||
char r_name[512];
|
||||
mSystem->getDriverInfo(0, r_name, 511, 0);
|
||||
r_name[511] = '\0';
|
||||
LL_INFOS("AppInit") << "LLAudioEngine_FMODEX::init(): r_name=\"" << r_name << "\"" << LL_ENDL;
|
||||
|
||||
int latency = 100; // optimistic default - i suspect if sample rate is 0, everything breaks.
|
||||
if ( r_samplerate != 0 )
|
||||
latency = (int)(1000.0f * r_bufferlength * r_numbuffers / r_samplerate);
|
||||
LL_INFOS("AppInit") << "LLAudioEngine_FMODEX::init(): latency=" << latency << "ms" << LL_ENDL;
|
||||
|
||||
mInited = true;
|
||||
|
||||
LL_INFOS("AppInit") << "LLAudioEngine_FMODEX::init(): initialization complete." << LL_ENDL;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
@ -310,8 +320,8 @@ void LLAudioEngine_FMODEX::shutdown()
|
|||
llinfos << "LLAudioEngine_FMODEX::shutdown() closing FMOD Ex" << llendl;
|
||||
if ( mSystem ) // speculative fix for MAINT-2657
|
||||
{
|
||||
mSystem->close();
|
||||
mSystem->release();
|
||||
mSystem->close();
|
||||
mSystem->release();
|
||||
}
|
||||
llinfos << "LLAudioEngine_FMODEX::shutdown() done closing FMOD Ex" << llendl;
|
||||
|
||||
|
|
|
|||
|
|
@ -57,7 +57,7 @@ public:
|
|||
const U32 getInputSamplingRate() { return mInputSamplingRate; }
|
||||
const F32 getNextSample();
|
||||
const F32 getClampedSample(bool clamp, F32 sample);
|
||||
|
||||
|
||||
// newbuffer = the buffer passed from the previous DSP unit.
|
||||
// numsamples = length in samples-per-channel at this mix time.
|
||||
// NOTE: generates L/R interleaved stereo
|
||||
|
|
@ -133,11 +133,11 @@ public:
|
|||
MIXBUFFERFORMAT_T sample_left = (MIXBUFFERFORMAT_T)getClampedSample(clip, mLastSample - (F32)sample_right);
|
||||
|
||||
*cursamplep = sample_left;
|
||||
++cursamplep;
|
||||
++cursamplep;
|
||||
*cursamplep = sample_right;
|
||||
++cursamplep;
|
||||
++cursamplep;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return newbuffer;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -986,9 +986,9 @@ bool windows_post_minidump_callback(const wchar_t* dump_path,
|
|||
}
|
||||
|
||||
llinfos << "generated minidump: " << LLApp::instance()->getMiniDumpFilename() << llendl;
|
||||
// *NOTE:Mani - this code is stolen from LLApp, where its never actually used.
|
||||
// *NOTE:Mani - this code is stolen from LLApp, where its never actually used.
|
||||
//OSMessageBox("Attach Debugger Now", "Error", OSMB_OK);
|
||||
// *TODO: Translate the signals/exceptions into cross-platform stuff
|
||||
// *TODO: Translate the signals/exceptions into cross-platform stuff
|
||||
// Windows implementation
|
||||
llinfos << "Entering Windows Exception Handler..." << llendl;
|
||||
|
||||
|
|
|
|||
|
|
@ -226,9 +226,7 @@ void LLVolatileAPRPool::clearVolatileAPRPool()
|
|||
llassert_always(mNumActiveRef > 0) ;
|
||||
}
|
||||
|
||||
//paranoia check if the pool is jammed.
|
||||
//will remove the check before going to release.
|
||||
llassert_always(mNumTotalRef < (FULL_VOLATILE_APR_POOL << 2)) ;
|
||||
llassert(mNumTotalRef < (FULL_VOLATILE_APR_POOL << 2)) ;
|
||||
}
|
||||
|
||||
BOOL LLVolatileAPRPool::isFull()
|
||||
|
|
|
|||
|
|
@ -63,7 +63,7 @@ public:
|
|||
// For normal names, returns "James Linden (james.linden)"
|
||||
// When display names are disabled returns just "James Linden"
|
||||
std::string getCompleteName() const;
|
||||
|
||||
|
||||
// Returns "James Linden" or "bobsmith123 Resident" for backwards
|
||||
// compatibility with systems like voice and muting
|
||||
// *TODO: Eliminate this in favor of username only
|
||||
|
|
|
|||
|
|
@ -60,7 +60,7 @@ bool LLCoros::cleanup(const LLSD&)
|
|||
// since last tick?
|
||||
if (mi->second->exited())
|
||||
{
|
||||
LL_INFOS("LLCoros") << "LLCoros: cleaning up coroutine " << mi->first << LL_ENDL;
|
||||
LL_INFOS("LLCoros") << "LLCoros: cleaning up coroutine " << mi->first << LL_ENDL;
|
||||
// The erase() call will invalidate its passed iterator value --
|
||||
// so increment mi FIRST -- but pass its original value to
|
||||
// erase(). This is what postincrement is all about.
|
||||
|
|
@ -94,7 +94,7 @@ std::string LLCoros::generateDistinctName(const std::string& prefix) const
|
|||
{
|
||||
if (mCoros.find(name) == mCoros.end())
|
||||
{
|
||||
LL_INFOS("LLCoros") << "LLCoros: launching coroutine " << name << LL_ENDL;
|
||||
LL_INFOS("LLCoros") << "LLCoros: launching coroutine " << name << LL_ENDL;
|
||||
return name;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -201,10 +201,7 @@ namespace {
|
|||
virtual void recordMessage(LLError::ELevel level,
|
||||
const std::string& message)
|
||||
{
|
||||
llutf16string utf16str =
|
||||
wstring_to_utf16str(utf8str_to_wstring(message));
|
||||
utf16str += '\n';
|
||||
OutputDebugString(utf16str.c_str());
|
||||
LL_WINDOWS_OUTPUT_DEBUG(message);
|
||||
}
|
||||
};
|
||||
#endif
|
||||
|
|
@ -1401,5 +1398,27 @@ namespace LLError
|
|||
{
|
||||
sIndex = 0 ;
|
||||
}
|
||||
|
||||
#if LL_WINDOWS
|
||||
void LLOutputDebugUTF8(const std::string& s)
|
||||
{
|
||||
// Be careful when calling OutputDebugString as it throws DBG_PRINTEXCEPTION_C
|
||||
// which works just fine under the windows debugger, but can cause users who
|
||||
// have enabled SEHOP exception chain validation to crash due to interactions
|
||||
// between the Win 32-bit exception handling and boost coroutine fiber stacks. BUG-2707
|
||||
//
|
||||
if (IsDebuggerPresent())
|
||||
{
|
||||
// Need UTF16 for Unicode OutputDebugString
|
||||
//
|
||||
if (s.size())
|
||||
{
|
||||
OutputDebugString(utf8str_to_utf16str(s).c_str());
|
||||
OutputDebugString(TEXT("\n"));
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -34,7 +34,6 @@
|
|||
#include "llerrorlegacy.h"
|
||||
#include "stdtypes.h"
|
||||
|
||||
|
||||
/** Error Logging Facility
|
||||
|
||||
Information for most users:
|
||||
|
|
@ -199,8 +198,20 @@ namespace LLError
|
|||
static void clear() ;
|
||||
static void end(std::ostringstream* _out) ;
|
||||
};
|
||||
|
||||
#if LL_WINDOWS
|
||||
void LLOutputDebugUTF8(const std::string& s);
|
||||
#endif
|
||||
|
||||
}
|
||||
|
||||
#if LL_WINDOWS
|
||||
// Macro accepting a std::string for display in windows debugging console
|
||||
#define LL_WINDOWS_OUTPUT_DEBUG(a) LLError::LLOutputDebugUTF8(a)
|
||||
#else
|
||||
#define LL_WINDOWS_OUTPUT_DEBUG(a)
|
||||
#endif
|
||||
|
||||
//this is cheaper than llcallstacks if no need to output other variables to call stacks.
|
||||
#define llpushcallstacks LLError::LLCallStacks::push(__FUNCTION__, __LINE__)
|
||||
#define llcallstacks \
|
||||
|
|
|
|||
|
|
@ -561,7 +561,7 @@ std::vector<LLFastTimer::NamedTimer*>& LLFastTimer::NamedTimer::getChildren()
|
|||
return mChildren;
|
||||
}
|
||||
|
||||
// static
|
||||
//static
|
||||
LLFastTimer::NamedTimer& LLFastTimer::NamedTimer::getRootNamedTimer()
|
||||
{
|
||||
return *NamedTimerFactory::instance().getRootTimer();
|
||||
|
|
|
|||
|
|
@ -438,7 +438,7 @@ llstdio_filebuf::int_type llstdio_filebuf::overflow(llstdio_filebuf::int_type __
|
|||
_M_set_buffer(0);
|
||||
__ret = traits_type::not_eof(__c);
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (_M_buf_size > 1)
|
||||
{
|
||||
// Overflow in 'uncommitted' mode: set _M_writing, set
|
||||
|
|
@ -496,11 +496,11 @@ bool llstdio_filebuf::_convert_to_external(char_type* __ibuf,
|
|||
if (__r == codecvt_base::ok || __r == codecvt_base::partial)
|
||||
__blen = __bend - __buf;
|
||||
else if (__r == codecvt_base::noconv)
|
||||
{
|
||||
{
|
||||
// Same as the always_noconv case above.
|
||||
__buf = reinterpret_cast<char*>(__ibuf);
|
||||
__blen = __ilen;
|
||||
}
|
||||
}
|
||||
else
|
||||
__throw_ios_failure(__N("llstdio_filebuf::_convert_to_external "
|
||||
"conversion error"));
|
||||
|
|
@ -643,9 +643,9 @@ llstdio_filebuf::int_type llstdio_filebuf::underflow()
|
|||
_M_ext_end, _M_ext_next,
|
||||
this->eback(),
|
||||
this->eback() + __buflen, __iend);
|
||||
}
|
||||
}
|
||||
if (__r == codecvt_base::noconv)
|
||||
{
|
||||
{
|
||||
size_t __avail = _M_ext_end - _M_ext_buf;
|
||||
__ilen = std::min(__avail, __buflen);
|
||||
traits_type::copy(this->eback(),
|
||||
|
|
@ -806,15 +806,15 @@ std::streamsize llstdio_filebuf::xsputn(char_type* __s, std::streamsize __n)
|
|||
__ret = fwrite(__buf, 1, __buffill, _M_file.file());
|
||||
}
|
||||
if (__ret == __buffill)
|
||||
{
|
||||
{
|
||||
__ret += fwrite(reinterpret_cast<const char*>(__s), 1,
|
||||
__n, _M_file.file());
|
||||
}
|
||||
}
|
||||
if (__ret == __buffill + __n)
|
||||
{
|
||||
_M_set_buffer(0);
|
||||
_M_writing = true;
|
||||
}
|
||||
}
|
||||
if (__ret > __buffill)
|
||||
__ret -= __buffill;
|
||||
else
|
||||
|
|
@ -848,7 +848,7 @@ llifstream::llifstream() : _M_filebuf(),
|
|||
#endif
|
||||
|
||||
// explicit
|
||||
llifstream::llifstream(const std::string& _Filename,
|
||||
llifstream::llifstream(const std::string& _Filename,
|
||||
ios_base::openmode _Mode) : _M_filebuf(),
|
||||
#if LL_WINDOWS
|
||||
std::istream(&_M_filebuf)
|
||||
|
|
@ -877,7 +877,7 @@ llifstream::llifstream(const char* _Filename,
|
|||
if (_M_filebuf.open(wideName.c_str(), _Mode | ios_base::in) == 0)
|
||||
{
|
||||
_Myios::setstate(ios_base::failbit);
|
||||
}
|
||||
}
|
||||
}
|
||||
#else
|
||||
std::istream()
|
||||
|
|
@ -951,8 +951,8 @@ void llifstream::close()
|
|||
#else
|
||||
this->setstate(ios_base::failbit);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/************** output file stream ********************************/
|
||||
|
|
@ -1042,7 +1042,7 @@ void llofstream::open(const char* _Filename, ios_base::openmode _Mode)
|
|||
#if LL_WINDOWS
|
||||
llutf16string wideName = utf8str_to_utf16str( _Filename );
|
||||
if (_M_filebuf.open( wideName.c_str(), _Mode | ios_base::out) == 0)
|
||||
{
|
||||
{
|
||||
_Myios::setstate(ios_base::failbit);
|
||||
}
|
||||
else
|
||||
|
|
|
|||
|
|
@ -35,7 +35,7 @@
|
|||
* Attempts to mostly mirror the POSIX style IO functions.
|
||||
*/
|
||||
|
||||
typedef FILE LLFILE;
|
||||
typedef FILE LLFILE;
|
||||
|
||||
#include <fstream>
|
||||
#include <sys/stat.h>
|
||||
|
|
@ -237,7 +237,7 @@ public:
|
|||
ios_base::openmode _Mode = ios_base::in,
|
||||
//size_t _Size = static_cast<size_t>(BUFSIZ));
|
||||
size_t _Size = static_cast<size_t>(1));
|
||||
|
||||
|
||||
/**
|
||||
* @brief Create a stream using an open file descriptor.
|
||||
* @param fd An open file descriptor.
|
||||
|
|
|
|||
|
|
@ -403,7 +403,7 @@ S32 LLSDXMLParser::Impl::parse(std::istream& input, LLSD& data)
|
|||
}
|
||||
if (mEmitErrors)
|
||||
{
|
||||
llinfos << "LLSDXMLParser::Impl::parse: XML_STATUS_ERROR parsing:" << (char*) buffer << llendl;
|
||||
llinfos << "LLSDXMLParser::Impl::parse: XML_STATUS_ERROR parsing:" << (char*) buffer << llendl;
|
||||
}
|
||||
data = LLSD();
|
||||
return LLSDParser::PARSE_FAILURE;
|
||||
|
|
@ -484,7 +484,7 @@ S32 LLSDXMLParser::Impl::parseLines(std::istream& input, LLSD& data)
|
|||
{
|
||||
if (mEmitErrors)
|
||||
{
|
||||
llinfos << "LLSDXMLParser::Impl::parseLines: XML_STATUS_ERROR" << llendl;
|
||||
llinfos << "LLSDXMLParser::Impl::parseLines: XML_STATUS_ERROR" << llendl;
|
||||
}
|
||||
return LLSDParser::PARSE_FAILURE;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -969,10 +969,7 @@ namespace tut
|
|||
childout.getline(), "ok");
|
||||
// important to get the implicit flush from std::endl
|
||||
py.mPy->getWritePipe().get_ostream() << "go" << std::endl;
|
||||
for (i = 0; i < timeout && py.mPy->isRunning() && ! childout.contains("\n"); ++i)
|
||||
{
|
||||
yield();
|
||||
}
|
||||
waitfor(*py.mPy);
|
||||
ensure("script never replied", childout.contains("\n"));
|
||||
ensure_equals("child didn't ack", childout.getline(), "ack");
|
||||
ensure_equals("bad child termination", py.mPy->getStatus().mState, LLProcess::EXITED);
|
||||
|
|
|
|||
|
|
@ -46,6 +46,7 @@ class LLRotation;
|
|||
// of this writing, July 08, 2010) about getting it implemented before you resort to
|
||||
// LLVector3/LLVector4.
|
||||
/////////////////////////////////
|
||||
class LLVector4a;
|
||||
|
||||
LL_ALIGN_PREFIX(16)
|
||||
class LLVector4a
|
||||
|
|
@ -236,6 +237,11 @@ public:
|
|||
// Note that this does not consider zero length vectors!
|
||||
inline void normalize3fast();
|
||||
|
||||
// Normalize this vector with respect to the x, y, and z components only. Accurate only to 10-12 bits of precision. W component is destroyed
|
||||
// Same as above except substitutes default vector contents if the vector is non-finite or degenerate due to zero length.
|
||||
//
|
||||
inline void normalize3fast_checked(LLVector4a* d = 0);
|
||||
|
||||
// Return true if this vector is normalized with respect to x,y,z up to tolerance
|
||||
inline LLBool32 isNormalized3( F32 tolerance = 1e-3 ) const;
|
||||
|
||||
|
|
|
|||
|
|
@ -1392,7 +1392,7 @@ void LLPath::genNGon(const LLPathParams& params, S32 sides, F32 startOff, F32 en
|
|||
pt->mScale.mV[VX] = hole_x * lerp(taper_x_begin, taper_x_end, t);
|
||||
pt->mScale.mV[VY] = hole_y * lerp(taper_y_begin, taper_y_end, t);
|
||||
pt->mTexT = t;
|
||||
|
||||
|
||||
// Twist rotates the path along the x,y plane (I think) - DJS 04/05/02
|
||||
twist.setQuat (lerp(twist_begin,twist_end,t) * 2.f * F_PI - F_PI,0,0,1);
|
||||
// Rotate the point around the circle's center.
|
||||
|
|
@ -1446,7 +1446,7 @@ void LLPath::genNGon(const LLPathParams& params, S32 sides, F32 startOff, F32 en
|
|||
pt->mScale.mV[VX] = hole_x * lerp(taper_x_begin, taper_x_end, t);
|
||||
pt->mScale.mV[VY] = hole_y * lerp(taper_y_begin, taper_y_end, t);
|
||||
pt->mTexT = t;
|
||||
|
||||
|
||||
// Twist rotates the path along the x,y plane (I think) - DJS 04/05/02
|
||||
twist.setQuat (lerp(twist_begin,twist_end,t) * 2.f * F_PI - F_PI,0,0,1);
|
||||
// Rotate the point around the circle's center.
|
||||
|
|
@ -1594,7 +1594,7 @@ BOOL LLPath::generate(const LLPathParams& params, F32 detail, S32 split,
|
|||
S32 sides = (S32)llfloor(llfloor((MIN_DETAIL_FACES * detail + twist_mag * 3.5f * (detail-0.5f))) * params.getRevolutions());
|
||||
|
||||
if (is_sculpted)
|
||||
sides = sculpt_size;
|
||||
sides = llmax(sculpt_size, 1);
|
||||
|
||||
genNGon(params, sides);
|
||||
}
|
||||
|
|
@ -1644,6 +1644,7 @@ BOOL LLPath::generate(const LLPathParams& params, F32 detail, S32 split,
|
|||
mPath[i].mScale.mV[0] = lerp(1,params.getScale().mV[0],t);
|
||||
mPath[i].mScale.mV[1] = lerp(1,params.getScale().mV[1],t);
|
||||
mPath[i].mTexT = t;
|
||||
|
||||
mPath[i].mRot.setQuat(F_PI * params.getTwist() * t,1,0,0);
|
||||
}
|
||||
|
||||
|
|
@ -2079,9 +2080,9 @@ void LLVolume::regen()
|
|||
createVolumeFaces();
|
||||
}
|
||||
|
||||
void LLVolume::genBinormals(S32 face)
|
||||
void LLVolume::genTangents(S32 face)
|
||||
{
|
||||
mVolumeFaces[face].createBinormals();
|
||||
mVolumeFaces[face].createTangents();
|
||||
}
|
||||
|
||||
LLVolume::~LLVolume()
|
||||
|
|
@ -2442,6 +2443,7 @@ bool LLVolume::unpackVolumeFaces(std::istream& is, S32 size)
|
|||
LLVector4a pos_range;
|
||||
pos_range.setSub(max_pos, min_pos);
|
||||
LLVector2 tc_range2 = max_tc - min_tc;
|
||||
|
||||
LLVector4a tc_range;
|
||||
tc_range.set(tc_range2[0], tc_range2[1], tc_range2[0], tc_range2[1]);
|
||||
LLVector4a min_tc4(min_tc[0], min_tc[1], min_tc[0], min_tc[1]);
|
||||
|
|
@ -4392,7 +4394,7 @@ void LLVolume::generateSilhouetteVertices(std::vector<LLVector3> &vertices,
|
|||
segments.push_back(vertices.size());
|
||||
#if DEBUG_SILHOUETTE_BINORMALS
|
||||
vertices.push_back(face.mVertices[j].getPosition());
|
||||
vertices.push_back(face.mVertices[j].getPosition() + face.mVertices[j].mBinormal*0.1f);
|
||||
vertices.push_back(face.mVertices[j].getPosition() + face.mVertices[j].mTangent*0.1f);
|
||||
normals.push_back(LLVector3(0,0,1));
|
||||
normals.push_back(LLVector3(0,0,1));
|
||||
segments.push_back(vertices.size());
|
||||
|
|
@ -4508,22 +4510,9 @@ void LLVolume::generateSilhouetteVertices(std::vector<LLVector3> &vertices,
|
|||
}
|
||||
}
|
||||
|
||||
S32 LLVolume::lineSegmentIntersect(const LLVector3& start, const LLVector3& end,
|
||||
S32 face,
|
||||
LLVector3* intersection,LLVector2* tex_coord, LLVector3* normal, LLVector3* bi_normal)
|
||||
{
|
||||
LLVector4a starta, enda;
|
||||
starta.load3(start.mV);
|
||||
enda.load3(end.mV);
|
||||
|
||||
return lineSegmentIntersect(starta, enda, face, intersection, tex_coord, normal, bi_normal);
|
||||
|
||||
}
|
||||
|
||||
|
||||
S32 LLVolume::lineSegmentIntersect(const LLVector4a& start, const LLVector4a& end,
|
||||
S32 face,
|
||||
LLVector3* intersection,LLVector2* tex_coord, LLVector3* normal, LLVector3* bi_normal)
|
||||
LLVector4a* intersection,LLVector2* tex_coord, LLVector4a* normal, LLVector4a* tangent_out)
|
||||
{
|
||||
S32 hit_face = -1;
|
||||
|
||||
|
|
@ -4561,9 +4550,9 @@ S32 LLVolume::lineSegmentIntersect(const LLVector4a& start, const LLVector4a& en
|
|||
|
||||
if (LLLineSegmentBoxIntersect(start, end, box_center, box_size))
|
||||
{
|
||||
if (bi_normal != NULL) // if the caller wants binormals, we may need to generate them
|
||||
if (tangent_out != NULL) // if the caller wants tangents, we may need to generate them
|
||||
{
|
||||
genBinormals(i);
|
||||
genTangents(i);
|
||||
}
|
||||
|
||||
if (isUnique())
|
||||
|
|
@ -4597,7 +4586,7 @@ S32 LLVolume::lineSegmentIntersect(const LLVector4a& start, const LLVector4a& en
|
|||
LLVector4a intersect = dir;
|
||||
intersect.mul(closest_t);
|
||||
intersect.add(start);
|
||||
intersection->set(intersect.getF32ptr());
|
||||
*intersection = intersect;
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -4612,19 +4601,42 @@ S32 LLVolume::lineSegmentIntersect(const LLVector4a& start, const LLVector4a& en
|
|||
|
||||
if (normal!= NULL)
|
||||
{
|
||||
LLVector4* norm = (LLVector4*) face.mNormals;
|
||||
LLVector4a* norm = face.mNormals;
|
||||
|
||||
LLVector4a n1,n2,n3;
|
||||
n1 = norm[idx0];
|
||||
n1.mul(1.f-a-b);
|
||||
|
||||
n2 = norm[idx1];
|
||||
n2.mul(a);
|
||||
|
||||
n3 = norm[idx2];
|
||||
n3.mul(b);
|
||||
|
||||
*normal = ((1.f - a - b) * LLVector3(norm[idx0]) +
|
||||
a * LLVector3(norm[idx1]) +
|
||||
b * LLVector3(norm[idx2]));
|
||||
n1.add(n2);
|
||||
n1.add(n3);
|
||||
|
||||
*normal = n1;
|
||||
}
|
||||
|
||||
if (bi_normal != NULL)
|
||||
if (tangent_out != NULL)
|
||||
{
|
||||
LLVector4* binormal = (LLVector4*) face.mBinormals;
|
||||
*bi_normal = ((1.f - a - b) * LLVector3(binormal[idx0]) +
|
||||
a * LLVector3(binormal[idx1]) +
|
||||
b * LLVector3(binormal[idx2]));
|
||||
LLVector4a* tangents = face.mTangents;
|
||||
|
||||
LLVector4a t1,t2,t3;
|
||||
t1 = tangents[idx0];
|
||||
t1.mul(1.f-a-b);
|
||||
|
||||
t2 = tangents[idx1];
|
||||
t2.mul(a);
|
||||
|
||||
t3 = tangents[idx2];
|
||||
t3.mul(b);
|
||||
|
||||
t1.add(t2);
|
||||
t1.add(t3);
|
||||
|
||||
*tangent_out = t1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -4637,7 +4649,7 @@ S32 LLVolume::lineSegmentIntersect(const LLVector4a& start, const LLVector4a& en
|
|||
face.createOctree();
|
||||
}
|
||||
|
||||
LLOctreeTriangleRayIntersect intersect(start, dir, &face, &closest_t, intersection, tex_coord, normal, bi_normal);
|
||||
LLOctreeTriangleRayIntersect intersect(start, dir, &face, &closest_t, intersection, tex_coord, normal, tangent_out);
|
||||
intersect.traverse(face.mOctree);
|
||||
if (intersect.mHitFace)
|
||||
{
|
||||
|
|
@ -5183,7 +5195,7 @@ LLVolumeFace::LLVolumeFace() :
|
|||
mNumIndices(0),
|
||||
mPositions(NULL),
|
||||
mNormals(NULL),
|
||||
mBinormals(NULL),
|
||||
mTangents(NULL),
|
||||
mTexCoords(NULL),
|
||||
mIndices(NULL),
|
||||
mWeights(NULL),
|
||||
|
|
@ -5206,7 +5218,7 @@ LLVolumeFace::LLVolumeFace(const LLVolumeFace& src)
|
|||
mNumIndices(0),
|
||||
mPositions(NULL),
|
||||
mNormals(NULL),
|
||||
mBinormals(NULL),
|
||||
mTangents(NULL),
|
||||
mTexCoords(NULL),
|
||||
mIndices(NULL),
|
||||
mWeights(NULL),
|
||||
|
|
@ -5264,15 +5276,15 @@ LLVolumeFace& LLVolumeFace::operator=(const LLVolumeFace& src)
|
|||
}
|
||||
|
||||
|
||||
if (src.mBinormals)
|
||||
if (src.mTangents)
|
||||
{
|
||||
allocateBinormals(src.mNumVertices);
|
||||
LLVector4a::memcpyNonAliased16((F32*) mBinormals, (F32*) src.mBinormals, vert_size);
|
||||
allocateTangents(src.mNumVertices);
|
||||
LLVector4a::memcpyNonAliased16((F32*) mTangents, (F32*) src.mTangents, vert_size);
|
||||
}
|
||||
else
|
||||
{
|
||||
ll_aligned_free_16(mBinormals);
|
||||
mBinormals = NULL;
|
||||
ll_aligned_free_16(mTangents);
|
||||
mTangents = NULL;
|
||||
}
|
||||
|
||||
if (src.mWeights)
|
||||
|
|
@ -5316,8 +5328,8 @@ void LLVolumeFace::freeData()
|
|||
mTexCoords = NULL;
|
||||
ll_aligned_free_16(mIndices);
|
||||
mIndices = NULL;
|
||||
ll_aligned_free_16(mBinormals);
|
||||
mBinormals = NULL;
|
||||
ll_aligned_free_16(mTangents);
|
||||
mTangents = NULL;
|
||||
ll_aligned_free_16(mWeights);
|
||||
mWeights = NULL;
|
||||
|
||||
|
|
@ -5897,7 +5909,7 @@ void LLVolumeFace::cacheOptimize()
|
|||
}
|
||||
|
||||
LLVector4a* binorm = NULL;
|
||||
if (mBinormals)
|
||||
if (mTangents)
|
||||
{
|
||||
binorm = (LLVector4a*) ll_aligned_malloc_16(sizeof(LLVector4a)*num_verts);
|
||||
}
|
||||
|
|
@ -5922,9 +5934,9 @@ void LLVolumeFace::cacheOptimize()
|
|||
{
|
||||
wght[cur_idx] = mWeights[idx];
|
||||
}
|
||||
if (mBinormals)
|
||||
if (mTangents)
|
||||
{
|
||||
binorm[cur_idx] = mBinormals[idx];
|
||||
binorm[cur_idx] = mTangents[idx];
|
||||
}
|
||||
|
||||
cur_idx++;
|
||||
|
|
@ -5940,13 +5952,13 @@ void LLVolumeFace::cacheOptimize()
|
|||
ll_aligned_free_16(mNormals);
|
||||
ll_aligned_free_16(mTexCoords);
|
||||
ll_aligned_free_16(mWeights);
|
||||
ll_aligned_free_16(mBinormals);
|
||||
ll_aligned_free_16(mTangents);
|
||||
|
||||
mPositions = pos;
|
||||
mNormals = norm;
|
||||
mTexCoords = tc;
|
||||
mWeights = wght;
|
||||
mBinormals = binorm;
|
||||
mTangents = binorm;
|
||||
|
||||
//std::string result = llformat("ACMR pre/post: %.3f/%.3f -- %d triangles %d breaks", pre_acmr, post_acmr, mNumIndices/3, breaks);
|
||||
//llinfos << result << llendl;
|
||||
|
|
@ -6027,7 +6039,7 @@ void LLVolumeFace::swapData(LLVolumeFace& rhs)
|
|||
{
|
||||
llswap(rhs.mPositions, mPositions);
|
||||
llswap(rhs.mNormals, mNormals);
|
||||
llswap(rhs.mBinormals, mBinormals);
|
||||
llswap(rhs.mTangents, mTangents);
|
||||
llswap(rhs.mTexCoords, mTexCoords);
|
||||
llswap(rhs.mIndices,mIndices);
|
||||
llswap(rhs.mNumVertices, mNumVertices);
|
||||
|
|
@ -6116,22 +6128,11 @@ BOOL LLVolumeFace::createUnCutCubeCap(LLVolume* volume, BOOL partial_build)
|
|||
corners[2].mTexCoord=swap;
|
||||
}
|
||||
|
||||
LLVector4a binormal;
|
||||
|
||||
calc_binormal_from_triangle( binormal,
|
||||
corners[0].getPosition(), corners[0].mTexCoord,
|
||||
corners[1].getPosition(), corners[1].mTexCoord,
|
||||
corners[2].getPosition(), corners[2].mTexCoord);
|
||||
|
||||
binormal.normalize3fast();
|
||||
|
||||
S32 size = (grid_size+1)*(grid_size+1);
|
||||
resizeVertices(size);
|
||||
allocateBinormals(size);
|
||||
|
||||
|
||||
LLVector4a* pos = (LLVector4a*) mPositions;
|
||||
LLVector4a* norm = (LLVector4a*) mNormals;
|
||||
LLVector4a* binorm = (LLVector4a*) mBinormals;
|
||||
LLVector2* tc = (LLVector2*) mTexCoords;
|
||||
|
||||
for(int gx = 0;gx<grid_size+1;gx++)
|
||||
|
|
@ -6150,8 +6151,7 @@ BOOL LLVolumeFace::createUnCutCubeCap(LLVolume* volume, BOOL partial_build)
|
|||
*pos++ = newVert.getPosition();
|
||||
*norm++ = baseVert.getNormal();
|
||||
*tc++ = newVert.mTexCoord;
|
||||
*binorm++ = binormal;
|
||||
|
||||
|
||||
if (gx == 0 && gy == 0)
|
||||
{
|
||||
min = newVert.getPosition();
|
||||
|
|
@ -6227,8 +6227,7 @@ BOOL LLVolumeFace::createCap(LLVolume* volume, BOOL partial_build)
|
|||
if (!(mTypeMask & HOLLOW_MASK) && !(mTypeMask & OPEN_MASK))
|
||||
{
|
||||
resizeVertices(num_vertices+1);
|
||||
allocateBinormals(num_vertices+1);
|
||||
|
||||
|
||||
if (!partial_build)
|
||||
{
|
||||
resizeIndices(num_indices+3);
|
||||
|
|
@ -6237,8 +6236,7 @@ BOOL LLVolumeFace::createCap(LLVolume* volume, BOOL partial_build)
|
|||
else
|
||||
{
|
||||
resizeVertices(num_vertices);
|
||||
allocateBinormals(num_vertices);
|
||||
|
||||
|
||||
if (!partial_build)
|
||||
{
|
||||
resizeIndices(num_indices);
|
||||
|
|
@ -6272,8 +6270,7 @@ BOOL LLVolumeFace::createCap(LLVolume* volume, BOOL partial_build)
|
|||
LLVector2* tc = (LLVector2*) mTexCoords;
|
||||
LLVector4a* pos = (LLVector4a*) mPositions;
|
||||
LLVector4a* norm = (LLVector4a*) mNormals;
|
||||
LLVector4a* binorm = (LLVector4a*) mBinormals;
|
||||
|
||||
|
||||
// Copy the vertices into the array
|
||||
for (S32 i = 0; i < num_vertices; i++)
|
||||
{
|
||||
|
|
@ -6309,31 +6306,6 @@ BOOL LLVolumeFace::createCap(LLVolume* volume, BOOL partial_build)
|
|||
|
||||
cuv = (min_uv + max_uv)*0.5f;
|
||||
|
||||
LLVector4a binormal;
|
||||
calc_binormal_from_triangle(binormal,
|
||||
*mCenter, cuv,
|
||||
pos[0], tc[0],
|
||||
pos[1], tc[1]);
|
||||
binormal.normalize3fast();
|
||||
|
||||
LLVector4a normal;
|
||||
LLVector4a d0, d1;
|
||||
|
||||
|
||||
d0.setSub(*mCenter, pos[0]);
|
||||
d1.setSub(*mCenter, pos[1]);
|
||||
|
||||
if (mTypeMask & TOP_MASK)
|
||||
{
|
||||
normal.setCross3(d0, d1);
|
||||
}
|
||||
else
|
||||
{
|
||||
normal.setCross3(d1, d0);
|
||||
}
|
||||
|
||||
normal.normalize3fast();
|
||||
|
||||
VertexData vd;
|
||||
vd.setPosition(*mCenter);
|
||||
vd.mTexCoord = cuv;
|
||||
|
|
@ -6342,15 +6314,10 @@ BOOL LLVolumeFace::createCap(LLVolume* volume, BOOL partial_build)
|
|||
{
|
||||
pos[num_vertices] = *mCenter;
|
||||
tc[num_vertices] = cuv;
|
||||
|
||||
num_vertices++;
|
||||
}
|
||||
|
||||
for (S32 i = 0; i < num_vertices; i++)
|
||||
{
|
||||
binorm[i].load4a(binormal.getF32ptr());
|
||||
norm[i].load4a(normal.getF32ptr());
|
||||
}
|
||||
|
||||
if (partial_build)
|
||||
{
|
||||
return TRUE;
|
||||
|
|
@ -6585,63 +6552,68 @@ BOOL LLVolumeFace::createCap(LLVolume* volume, BOOL partial_build)
|
|||
|
||||
|
||||
}
|
||||
|
||||
|
||||
LLVector4a d0,d1;
|
||||
|
||||
d0.setSub(mPositions[mIndices[1]], mPositions[mIndices[0]]);
|
||||
d1.setSub(mPositions[mIndices[2]], mPositions[mIndices[0]]);
|
||||
|
||||
LLVector4a normal;
|
||||
normal.setCross3(d0,d1);
|
||||
|
||||
if (normal.dot3(normal).getF32() > F_APPROXIMATELY_ZERO)
|
||||
{
|
||||
normal.normalize3fast();
|
||||
}
|
||||
else
|
||||
{ //degenerate, make up a value
|
||||
normal.set(0,0,1);
|
||||
}
|
||||
|
||||
llassert(llfinite(normal.getF32ptr()[0]));
|
||||
llassert(llfinite(normal.getF32ptr()[1]));
|
||||
llassert(llfinite(normal.getF32ptr()[2]));
|
||||
|
||||
llassert(!llisnan(normal.getF32ptr()[0]));
|
||||
llassert(!llisnan(normal.getF32ptr()[1]));
|
||||
llassert(!llisnan(normal.getF32ptr()[2]));
|
||||
|
||||
for (S32 i = 0; i < num_vertices; i++)
|
||||
{
|
||||
norm[i].load4a(normal.getF32ptr());
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
void LLVolumeFace::createBinormals()
|
||||
void CalculateTangentArray(U32 vertexCount, const LLVector4a *vertex, const LLVector4a *normal,
|
||||
const LLVector2 *texcoord, U32 triangleCount, const U16* index_array, LLVector4a *tangent);
|
||||
|
||||
void LLVolumeFace::createTangents()
|
||||
{
|
||||
if (!mBinormals)
|
||||
if (!mTangents)
|
||||
{
|
||||
allocateBinormals(mNumVertices);
|
||||
allocateTangents(mNumVertices);
|
||||
|
||||
//generate binormals
|
||||
LLVector4a* pos = mPositions;
|
||||
LLVector2* tc = (LLVector2*) mTexCoords;
|
||||
LLVector4a* binorm = (LLVector4a*) mBinormals;
|
||||
//generate tangents
|
||||
//LLVector4a* pos = mPositions;
|
||||
//LLVector2* tc = (LLVector2*) mTexCoords;
|
||||
LLVector4a* binorm = (LLVector4a*) mTangents;
|
||||
|
||||
LLVector4a* end = mBinormals+mNumVertices;
|
||||
LLVector4a* end = mTangents+mNumVertices;
|
||||
while (binorm < end)
|
||||
{
|
||||
(*binorm++).clear();
|
||||
}
|
||||
|
||||
binorm = mBinormals;
|
||||
binorm = mTangents;
|
||||
|
||||
for (U32 i = 0; i < mNumIndices/3; i++)
|
||||
{ //for each triangle
|
||||
const U16& i0 = mIndices[i*3+0];
|
||||
const U16& i1 = mIndices[i*3+1];
|
||||
const U16& i2 = mIndices[i*3+2];
|
||||
|
||||
//calculate binormal
|
||||
LLVector4a binormal;
|
||||
calc_binormal_from_triangle(binormal,
|
||||
pos[i0], tc[i0],
|
||||
pos[i1], tc[i1],
|
||||
pos[i2], tc[i2]);
|
||||
CalculateTangentArray(mNumVertices, mPositions, mNormals, mTexCoords, mNumIndices/3, mIndices, mTangents);
|
||||
|
||||
|
||||
//add triangle normal to vertices
|
||||
binorm[i0].add(binormal);
|
||||
binorm[i1].add(binormal);
|
||||
binorm[i2].add(binormal);
|
||||
|
||||
//even out quad contributions
|
||||
if (i % 2 == 0)
|
||||
{
|
||||
binorm[i2].add(binormal);
|
||||
}
|
||||
else
|
||||
{
|
||||
binorm[i1].add(binormal);
|
||||
}
|
||||
}
|
||||
|
||||
//normalize binormals
|
||||
//normalize tangents
|
||||
for (U32 i = 0; i < mNumVertices; i++)
|
||||
{
|
||||
binorm[i].normalize3fast();
|
||||
//binorm[i].normalize3fast();
|
||||
//bump map/planar projection code requires normals to be normalized
|
||||
mNormals[i].normalize3fast();
|
||||
}
|
||||
|
|
@ -6652,10 +6624,10 @@ void LLVolumeFace::resizeVertices(S32 num_verts)
|
|||
{
|
||||
ll_aligned_free_16(mPositions);
|
||||
ll_aligned_free_16(mNormals);
|
||||
ll_aligned_free_16(mBinormals);
|
||||
ll_aligned_free_16(mTangents);
|
||||
ll_aligned_free_16(mTexCoords);
|
||||
|
||||
mBinormals = NULL;
|
||||
mTangents = NULL;
|
||||
|
||||
if (num_verts)
|
||||
{
|
||||
|
|
@ -6705,9 +6677,9 @@ void LLVolumeFace::pushVertex(const LLVector4a& pos, const LLVector4a& norm, con
|
|||
ll_assert_aligned(mTexCoords,16);
|
||||
|
||||
|
||||
//just clear binormals
|
||||
ll_aligned_free_16(mBinormals);
|
||||
mBinormals = NULL;
|
||||
//just clear tangents
|
||||
ll_aligned_free_16(mTangents);
|
||||
mTangents = NULL;
|
||||
|
||||
mPositions[mNumVertices] = pos;
|
||||
mNormals[mNumVertices] = norm;
|
||||
|
|
@ -6716,10 +6688,10 @@ void LLVolumeFace::pushVertex(const LLVector4a& pos, const LLVector4a& norm, con
|
|||
mNumVertices++;
|
||||
}
|
||||
|
||||
void LLVolumeFace::allocateBinormals(S32 num_verts)
|
||||
void LLVolumeFace::allocateTangents(S32 num_verts)
|
||||
{
|
||||
ll_aligned_free_16(mBinormals);
|
||||
mBinormals = (LLVector4a*) ll_aligned_malloc_16(sizeof(LLVector4a)*num_verts);
|
||||
ll_aligned_free_16(mTangents);
|
||||
mTangents = (LLVector4a*) ll_aligned_malloc_16(sizeof(LLVector4a)*num_verts);
|
||||
}
|
||||
|
||||
void LLVolumeFace::allocateWeights(S32 num_verts)
|
||||
|
|
@ -6956,7 +6928,6 @@ BOOL LLVolumeFace::createSide(LLVolume* volume, BOOL partial_build)
|
|||
|
||||
if ((mTypeMask & INNER_MASK) && (mTypeMask & FLAT_MASK) && mNumS > 2 && s > 0)
|
||||
{
|
||||
|
||||
pos[cur_vertex].load3(mesh[i].mPos.mV);
|
||||
tc[cur_vertex] = LLVector2(ss,tt);
|
||||
|
||||
|
|
@ -6987,7 +6958,6 @@ BOOL LLVolumeFace::createSide(LLVolume* volume, BOOL partial_build)
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
//get bounding box for this side
|
||||
LLVector4a& face_min = mExtents[0];
|
||||
LLVector4a& face_max = mExtents[1];
|
||||
|
|
@ -7093,6 +7063,14 @@ BOOL LLVolumeFace::createSide(LLVolume* volume, BOOL partial_build)
|
|||
n[1]->add(c);
|
||||
n[2]->add(c);
|
||||
|
||||
llassert(llfinite(c.getF32ptr()[0]));
|
||||
llassert(llfinite(c.getF32ptr()[1]));
|
||||
llassert(llfinite(c.getF32ptr()[2]));
|
||||
|
||||
llassert(!llisnan(c.getF32ptr()[0]));
|
||||
llassert(!llisnan(c.getF32ptr()[1]));
|
||||
llassert(!llisnan(c.getF32ptr()[2]));
|
||||
|
||||
//even out quad contributions
|
||||
n[i%2+1]->add(c);
|
||||
}
|
||||
|
|
@ -7231,53 +7209,101 @@ BOOL LLVolumeFace::createSide(LLVolume* volume, BOOL partial_build)
|
|||
return TRUE;
|
||||
}
|
||||
|
||||
// Finds binormal based on three vertices with texture coordinates.
|
||||
// Fills in dummy values if the triangle has degenerate texture coordinates.
|
||||
void calc_binormal_from_triangle(LLVector4a& binormal,
|
||||
|
||||
const LLVector4a& pos0,
|
||||
const LLVector2& tex0,
|
||||
const LLVector4a& pos1,
|
||||
const LLVector2& tex1,
|
||||
const LLVector4a& pos2,
|
||||
const LLVector2& tex2)
|
||||
//adapted from Lengyel, Eric. “Computing Tangent Space Basis Vectors for an Arbitrary Mesh”. Terathon Software 3D Graphics Library, 2001. http://www.terathon.com/code/tangent.html
|
||||
void CalculateTangentArray(U32 vertexCount, const LLVector4a *vertex, const LLVector4a *normal,
|
||||
const LLVector2 *texcoord, U32 triangleCount, const U16* index_array, LLVector4a *tangent)
|
||||
{
|
||||
LLVector4a rx0( pos0[VX], tex0.mV[VX], tex0.mV[VY] );
|
||||
LLVector4a rx1( pos1[VX], tex1.mV[VX], tex1.mV[VY] );
|
||||
LLVector4a rx2( pos2[VX], tex2.mV[VX], tex2.mV[VY] );
|
||||
|
||||
LLVector4a ry0( pos0[VY], tex0.mV[VX], tex0.mV[VY] );
|
||||
LLVector4a ry1( pos1[VY], tex1.mV[VX], tex1.mV[VY] );
|
||||
LLVector4a ry2( pos2[VY], tex2.mV[VX], tex2.mV[VY] );
|
||||
//LLVector4a *tan1 = new LLVector4a[vertexCount * 2];
|
||||
LLVector4a* tan1 = (LLVector4a*) ll_aligned_malloc_16(vertexCount*2*sizeof(LLVector4a));
|
||||
|
||||
LLVector4a rz0( pos0[VZ], tex0.mV[VX], tex0.mV[VY] );
|
||||
LLVector4a rz1( pos1[VZ], tex1.mV[VX], tex1.mV[VY] );
|
||||
LLVector4a rz2( pos2[VZ], tex2.mV[VX], tex2.mV[VY] );
|
||||
|
||||
LLVector4a lhs, rhs;
|
||||
LLVector4a* tan2 = tan1 + vertexCount;
|
||||
|
||||
LLVector4a r0;
|
||||
lhs.setSub(rx0, rx1); rhs.setSub(rx0, rx2);
|
||||
r0.setCross3(lhs, rhs);
|
||||
memset(tan1, 0, vertexCount*2*sizeof(LLVector4a));
|
||||
|
||||
for (U32 a = 0; a < triangleCount; a++)
|
||||
{
|
||||
U32 i1 = *index_array++;
|
||||
U32 i2 = *index_array++;
|
||||
U32 i3 = *index_array++;
|
||||
|
||||
const LLVector4a& v1 = vertex[i1];
|
||||
const LLVector4a& v2 = vertex[i2];
|
||||
const LLVector4a& v3 = vertex[i3];
|
||||
|
||||
const LLVector2& w1 = texcoord[i1];
|
||||
const LLVector2& w2 = texcoord[i2];
|
||||
const LLVector2& w3 = texcoord[i3];
|
||||
|
||||
const F32* v1ptr = v1.getF32ptr();
|
||||
const F32* v2ptr = v2.getF32ptr();
|
||||
const F32* v3ptr = v3.getF32ptr();
|
||||
|
||||
LLVector4a r1;
|
||||
lhs.setSub(ry0, ry1); rhs.setSub(ry0, ry2);
|
||||
r1.setCross3(lhs, rhs);
|
||||
float x1 = v2ptr[0] - v1ptr[0];
|
||||
float x2 = v3ptr[0] - v1ptr[0];
|
||||
float y1 = v2ptr[1] - v1ptr[1];
|
||||
float y2 = v3ptr[1] - v1ptr[1];
|
||||
float z1 = v2ptr[2] - v1ptr[2];
|
||||
float z2 = v3ptr[2] - v1ptr[2];
|
||||
|
||||
float s1 = w2.mV[0] - w1.mV[0];
|
||||
float s2 = w3.mV[0] - w1.mV[0];
|
||||
float t1 = w2.mV[1] - w1.mV[1];
|
||||
float t2 = w3.mV[1] - w1.mV[1];
|
||||
|
||||
F32 rd = s1*t2-s2*t1;
|
||||
|
||||
LLVector4a r2;
|
||||
lhs.setSub(rz0, rz1); rhs.setSub(rz0, rz2);
|
||||
r2.setCross3(lhs, rhs);
|
||||
float r = ((rd*rd) > FLT_EPSILON) ? 1.0F / rd : 1024.f; //some made up large ratio for division by zero
|
||||
|
||||
if( r0[VX] && r1[VX] && r2[VX] )
|
||||
{
|
||||
binormal.set(
|
||||
-r0[VZ] / r0[VX],
|
||||
-r1[VZ] / r1[VX],
|
||||
-r2[VZ] / r2[VX]);
|
||||
// binormal.normVec();
|
||||
}
|
||||
else
|
||||
{
|
||||
binormal.set( 0, 1 , 0 );
|
||||
}
|
||||
llassert(llfinite(r));
|
||||
llassert(!llisnan(r));
|
||||
|
||||
LLVector4a sdir((t2 * x1 - t1 * x2) * r, (t2 * y1 - t1 * y2) * r,
|
||||
(t2 * z1 - t1 * z2) * r);
|
||||
LLVector4a tdir((s1 * x2 - s2 * x1) * r, (s1 * y2 - s2 * y1) * r,
|
||||
(s1 * z2 - s2 * z1) * r);
|
||||
|
||||
tan1[i1].add(sdir);
|
||||
tan1[i2].add(sdir);
|
||||
tan1[i3].add(sdir);
|
||||
|
||||
tan2[i1].add(tdir);
|
||||
tan2[i2].add(tdir);
|
||||
tan2[i3].add(tdir);
|
||||
}
|
||||
|
||||
for (U32 a = 0; a < vertexCount; a++)
|
||||
{
|
||||
LLVector4a n = normal[a];
|
||||
|
||||
const LLVector4a& t = tan1[a];
|
||||
|
||||
LLVector4a ncrosst;
|
||||
ncrosst.setCross3(n,t);
|
||||
|
||||
// Gram-Schmidt orthogonalize
|
||||
n.mul(n.dot3(t).getF32());
|
||||
|
||||
LLVector4a tsubn;
|
||||
tsubn.setSub(t,n);
|
||||
|
||||
if (tsubn.dot3(tsubn).getF32() > F_APPROXIMATELY_ZERO)
|
||||
{
|
||||
tsubn.normalize3fast();
|
||||
|
||||
// Calculate handedness
|
||||
F32 handedness = ncrosst.dot3(tan2[a]).getF32() < 0.f ? -1.f : 1.f;
|
||||
|
||||
tsubn.getF32ptr()[3] = handedness;
|
||||
|
||||
tangent[a] = tsubn;
|
||||
}
|
||||
else
|
||||
{ //degenerate, make up a value
|
||||
tangent[a].set(0,0,1,1);
|
||||
}
|
||||
}
|
||||
|
||||
ll_aligned_free_16(tan1);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -844,12 +844,12 @@ private:
|
|||
public:
|
||||
|
||||
BOOL create(LLVolume* volume, BOOL partial_build = FALSE);
|
||||
void createBinormals();
|
||||
void createTangents();
|
||||
|
||||
void appendFace(const LLVolumeFace& face, LLMatrix4& transform, LLMatrix4& normal_tranform);
|
||||
|
||||
void resizeVertices(S32 num_verts);
|
||||
void allocateBinormals(S32 num_verts);
|
||||
void allocateTangents(S32 num_verts);
|
||||
void allocateWeights(S32 num_verts);
|
||||
void resizeIndices(S32 num_indices);
|
||||
void fillFromLegacyData(std::vector<LLVolumeFace::VertexData>& v, std::vector<U16>& idx);
|
||||
|
|
@ -916,7 +916,7 @@ public:
|
|||
|
||||
LLVector4a* mPositions;
|
||||
LLVector4a* mNormals;
|
||||
LLVector4a* mBinormals;
|
||||
LLVector4a* mTangents;
|
||||
LLVector2* mTexCoords;
|
||||
U16* mIndices;
|
||||
|
||||
|
|
@ -980,7 +980,7 @@ public:
|
|||
void setDirty() { mPathp->setDirty(); mProfilep->setDirty(); }
|
||||
|
||||
void regen();
|
||||
void genBinormals(S32 face);
|
||||
void genTangents(S32 face);
|
||||
|
||||
BOOL isConvex() const;
|
||||
BOOL isCap(S32 face);
|
||||
|
|
@ -1008,21 +1008,14 @@ public:
|
|||
//get the face index of the face that intersects with the given line segment at the point
|
||||
//closest to start. Moves end to the point of intersection. Returns -1 if no intersection.
|
||||
//Line segment must be in volume space.
|
||||
S32 lineSegmentIntersect(const LLVector3& start, const LLVector3& end,
|
||||
S32 lineSegmentIntersect(const LLVector4a& start, const LLVector4a& end,
|
||||
S32 face = -1, // which face to check, -1 = ALL_SIDES
|
||||
LLVector3* intersection = NULL, // return the intersection point
|
||||
LLVector4a* intersection = NULL, // return the intersection point
|
||||
LLVector2* tex_coord = NULL, // return the texture coordinates of the intersection point
|
||||
LLVector3* normal = NULL, // return the surface normal at the intersection point
|
||||
LLVector3* bi_normal = NULL // return the surface bi-normal at the intersection point
|
||||
LLVector4a* normal = NULL, // return the surface normal at the intersection point
|
||||
LLVector4a* tangent = NULL // return the surface tangent at the intersection point
|
||||
);
|
||||
|
||||
S32 lineSegmentIntersect(const LLVector4a& start, const LLVector4a& end,
|
||||
S32 face = 1,
|
||||
LLVector3* intersection = NULL,
|
||||
LLVector2* tex_coord = NULL,
|
||||
LLVector3* normal = NULL,
|
||||
LLVector3* bi_normal = NULL);
|
||||
|
||||
LLFaceID generateFaceMask();
|
||||
|
||||
BOOL isFaceMaskValid(LLFaceID face_mask);
|
||||
|
|
@ -1081,21 +1074,12 @@ public:
|
|||
|
||||
std::ostream& operator<<(std::ostream &s, const LLVolumeParams &volume_params);
|
||||
|
||||
void calc_binormal_from_triangle(
|
||||
LLVector4a& binormal,
|
||||
const LLVector4a& pos0,
|
||||
const LLVector2& tex0,
|
||||
const LLVector4a& pos1,
|
||||
const LLVector2& tex1,
|
||||
const LLVector4a& pos2,
|
||||
const LLVector2& tex2);
|
||||
|
||||
BOOL LLLineSegmentBoxIntersect(const F32* start, const F32* end, const F32* center, const F32* size);
|
||||
BOOL LLLineSegmentBoxIntersect(const LLVector3& start, const LLVector3& end, const LLVector3& center, const LLVector3& size);
|
||||
BOOL LLLineSegmentBoxIntersect(const LLVector4a& start, const LLVector4a& end, const LLVector4a& center, const LLVector4a& size);
|
||||
|
||||
BOOL LLTriangleRayIntersect(const LLVector3& vert0, const LLVector3& vert1, const LLVector3& vert2, const LLVector3& orig, const LLVector3& dir,
|
||||
F32& intersection_a, F32& intersection_b, F32& intersection_t, BOOL two_sided);
|
||||
//BOOL LLTriangleRayIntersect(const LLVector3& vert0, const LLVector3& vert1, const LLVector3& vert2, const LLVector3& orig, const LLVector3& dir,
|
||||
// F32& intersection_a, F32& intersection_b, F32& intersection_t, BOOL two_sided);
|
||||
|
||||
BOOL LLTriangleRayIntersect(const LLVector4a& vert0, const LLVector4a& vert1, const LLVector4a& vert2, const LLVector4a& orig, const LLVector4a& dir,
|
||||
F32& intersection_a, F32& intersection_b, F32& intersection_t);
|
||||
|
|
|
|||
|
|
@ -94,14 +94,14 @@ void LLVolumeOctreeListener::handleChildAddition(const LLOctreeNode<LLVolumeTria
|
|||
|
||||
LLOctreeTriangleRayIntersect::LLOctreeTriangleRayIntersect(const LLVector4a& start, const LLVector4a& dir,
|
||||
const LLVolumeFace* face, F32* closest_t,
|
||||
LLVector3* intersection,LLVector2* tex_coord, LLVector3* normal, LLVector3* bi_normal)
|
||||
LLVector4a* intersection,LLVector2* tex_coord, LLVector4a* normal, LLVector4a* tangent)
|
||||
: mFace(face),
|
||||
mStart(start),
|
||||
mDir(dir),
|
||||
mIntersection(intersection),
|
||||
mTexCoord(tex_coord),
|
||||
mNormal(normal),
|
||||
mBinormal(bi_normal),
|
||||
mTangent(tangent),
|
||||
mClosestT(closest_t),
|
||||
mHitFace(false)
|
||||
{
|
||||
|
|
@ -112,13 +112,7 @@ void LLOctreeTriangleRayIntersect::traverse(const LLOctreeNode<LLVolumeTriangle>
|
|||
{
|
||||
LLVolumeOctreeListener* vl = (LLVolumeOctreeListener*) node->getListener(0);
|
||||
|
||||
/*const F32* start = mStart.getF32();
|
||||
const F32* end = mEnd.getF32();
|
||||
const F32* center = vl->mBounds[0].getF32();
|
||||
const F32* size = vl->mBounds[1].getF32();*/
|
||||
|
||||
//if (LLLineSegmentBoxIntersect(mStart, mEnd, vl->mBounds[0], vl->mBounds[1]))
|
||||
if (LLLineSegmentBoxIntersect(mStart.getF32ptr(), mEnd.getF32ptr(), vl->mBounds[0].getF32ptr(), vl->mBounds[1].getF32ptr()))
|
||||
if (LLLineSegmentBoxIntersect(mStart, mEnd, vl->mBounds[0], vl->mBounds[1]))
|
||||
{
|
||||
node->accept(this);
|
||||
for (S32 i = 0; i < node->getChildCount(); ++i)
|
||||
|
|
@ -152,34 +146,60 @@ void LLOctreeTriangleRayIntersect::visit(const LLOctreeNode<LLVolumeTriangle>* n
|
|||
LLVector4a intersect = mDir;
|
||||
intersect.mul(*mClosestT);
|
||||
intersect.add(mStart);
|
||||
mIntersection->set(intersect.getF32ptr());
|
||||
*mIntersection = intersect;
|
||||
}
|
||||
|
||||
U32 idx0 = tri->mIndex[0];
|
||||
U32 idx1 = tri->mIndex[1];
|
||||
U32 idx2 = tri->mIndex[2];
|
||||
|
||||
if (mTexCoord != NULL)
|
||||
{
|
||||
LLVector2* tc = (LLVector2*) mFace->mTexCoords;
|
||||
*mTexCoord = ((1.f - a - b) * tc[tri->mIndex[0]] +
|
||||
a * tc[tri->mIndex[1]] +
|
||||
b * tc[tri->mIndex[2]]);
|
||||
*mTexCoord = ((1.f - a - b) * tc[idx0] +
|
||||
a * tc[idx1] +
|
||||
b * tc[idx2]);
|
||||
|
||||
}
|
||||
|
||||
if (mNormal != NULL)
|
||||
{
|
||||
LLVector4* norm = (LLVector4*) mFace->mNormals;
|
||||
LLVector4a* norm = mFace->mNormals;
|
||||
|
||||
LLVector4a n1,n2,n3;
|
||||
n1 = norm[idx0];
|
||||
n1.mul(1.f-a-b);
|
||||
|
||||
n2 = norm[idx1];
|
||||
n2.mul(a);
|
||||
|
||||
n3 = norm[idx2];
|
||||
n3.mul(b);
|
||||
|
||||
*mNormal = ((1.f - a - b) * LLVector3(norm[tri->mIndex[0]]) +
|
||||
a * LLVector3(norm[tri->mIndex[1]]) +
|
||||
b * LLVector3(norm[tri->mIndex[2]]));
|
||||
n1.add(n2);
|
||||
n1.add(n3);
|
||||
|
||||
*mNormal = n1;
|
||||
}
|
||||
|
||||
if (mBinormal != NULL)
|
||||
if (mTangent != NULL)
|
||||
{
|
||||
LLVector4* binormal = (LLVector4*) mFace->mBinormals;
|
||||
*mBinormal = ((1.f - a - b) * LLVector3(binormal[tri->mIndex[0]]) +
|
||||
a * LLVector3(binormal[tri->mIndex[1]]) +
|
||||
b * LLVector3(binormal[tri->mIndex[2]]));
|
||||
LLVector4a* tangents = mFace->mTangents;
|
||||
|
||||
LLVector4a t1,t2,t3;
|
||||
t1 = tangents[idx0];
|
||||
t1.mul(1.f-a-b);
|
||||
|
||||
t2 = tangents[idx1];
|
||||
t2.mul(a);
|
||||
|
||||
t3 = tangents[idx2];
|
||||
t3.mul(b);
|
||||
|
||||
t1.add(t2);
|
||||
t1.add(t3);
|
||||
|
||||
*mTangent = t1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -137,16 +137,16 @@ public:
|
|||
LLVector4a mStart;
|
||||
LLVector4a mDir;
|
||||
LLVector4a mEnd;
|
||||
LLVector3* mIntersection;
|
||||
LLVector4a* mIntersection;
|
||||
LLVector2* mTexCoord;
|
||||
LLVector3* mNormal;
|
||||
LLVector3* mBinormal;
|
||||
LLVector4a* mNormal;
|
||||
LLVector4a* mTangent;
|
||||
F32* mClosestT;
|
||||
bool mHitFace;
|
||||
|
||||
LLOctreeTriangleRayIntersect(const LLVector4a& start, const LLVector4a& dir,
|
||||
const LLVolumeFace* face, F32* closest_t,
|
||||
LLVector3* intersection,LLVector2* tex_coord, LLVector3* normal, LLVector3* bi_normal);
|
||||
LLVector4a* intersection,LLVector2* tex_coord, LLVector4a* normal, LLVector4a* tangent);
|
||||
|
||||
void traverse(const LLOctreeNode<LLVolumeTriangle>* node);
|
||||
|
||||
|
|
|
|||
|
|
@ -242,7 +242,7 @@ if (LL_TESTS)
|
|||
${LLVFS_LIBRARIES}
|
||||
${LLMATH_LIBRARIES}
|
||||
${LLCOMMON_LIBRARIES}
|
||||
${GOOGLEMOCK_LIBRARIES}
|
||||
${GOOGLEMOCK_LIBRARIES}
|
||||
)
|
||||
|
||||
LL_ADD_INTEGRATION_TEST(
|
||||
|
|
|
|||
|
|
@ -99,8 +99,7 @@ void LLAres::QueryResponder::queryError(int code)
|
|||
|
||||
LLAres::LLAres() :
|
||||
chan_(NULL),
|
||||
mInitSuccess(false),
|
||||
mListener(new LLAresListener(this))
|
||||
mInitSuccess(false)
|
||||
{
|
||||
if (ares_library_init( ARES_LIB_INIT_ALL ) != ARES_SUCCESS ||
|
||||
ares_init(&chan_) != ARES_SUCCESS)
|
||||
|
|
@ -109,6 +108,8 @@ LLAres::LLAres() :
|
|||
return;
|
||||
}
|
||||
|
||||
mListener = boost::shared_ptr< LLAresListener >(new LLAresListener(this));
|
||||
|
||||
mInitSuccess = true;
|
||||
}
|
||||
|
||||
|
|
@ -161,12 +162,26 @@ void LLAres::getSrvRecords(const std::string &name, SrvResponder *resp)
|
|||
}
|
||||
|
||||
void LLAres::rewriteURI(const std::string &uri, UriRewriteResponder *resp)
|
||||
{
|
||||
llinfos << "Rewriting " << uri << llendl;
|
||||
{
|
||||
if (resp && uri.size())
|
||||
{
|
||||
LLURI* pURI = new LLURI(uri);
|
||||
|
||||
resp->mUri = LLURI(uri);
|
||||
search("_" + resp->mUri.scheme() + "._tcp." + resp->mUri.hostName(),
|
||||
RES_SRV, resp);
|
||||
resp->mUri = *pURI;
|
||||
|
||||
delete pURI;
|
||||
|
||||
if (!resp->mUri.scheme().size() || !resp->mUri.hostName().size())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
//llinfos << "LLAres::rewriteURI (" << uri << ") search: '" << "_" + resp->mUri.scheme() + "._tcp." + resp->mUri.hostName() << "'" << llendl;
|
||||
|
||||
search("_" + resp->mUri.scheme() + "._tcp." + resp->mUri.hostName(), RES_SRV, resp);
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
LLQueryResponder::LLQueryResponder()
|
||||
|
|
|
|||
|
|
@ -93,5 +93,12 @@ private:
|
|||
|
||||
void LLAresListener::rewriteURI(const LLSD& data)
|
||||
{
|
||||
mAres->rewriteURI(data["uri"], new UriRewriteResponder(data));
|
||||
if (mAres)
|
||||
{
|
||||
mAres->rewriteURI(data["uri"], new UriRewriteResponder(data));
|
||||
}
|
||||
else
|
||||
{
|
||||
llinfos << "LLAresListener::rewriteURI requested without Ares present. Ignoring: " << data << llendl;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -300,11 +300,11 @@ LLIOPipe::EStatus LLURLRequest::process_impl(
|
|||
const F32 TIMEOUT_ADJUSTMENT = 2.0f;
|
||||
mDetail->mByteAccumulator = 0;
|
||||
pump->adjustTimeoutSeconds(TIMEOUT_ADJUSTMENT);
|
||||
lldebugs << "LLURLRequest adjustTimeoutSeconds for request: " << mDetail->mURL << llendl;
|
||||
if (mState == STATE_INITIALIZED)
|
||||
{
|
||||
llinfos << "LLURLRequest adjustTimeoutSeconds called during upload" << llendl;
|
||||
}
|
||||
lldebugs << "LLURLRequest adjustTimeoutSeconds for request: " << mDetail->mURL << llendl;
|
||||
if (mState == STATE_INITIALIZED)
|
||||
{
|
||||
llinfos << "LLURLRequest adjustTimeoutSeconds called during upload" << llendl;
|
||||
}
|
||||
}
|
||||
|
||||
switch(mState)
|
||||
|
|
|
|||
|
|
@ -232,7 +232,7 @@ namespace tut
|
|||
ensureStatusOK();
|
||||
ensure_equals("echoed result matches", getResult(), sd);
|
||||
}
|
||||
|
||||
|
||||
template<> template<>
|
||||
void HTTPClientTestObject::test<4>()
|
||||
{
|
||||
|
|
|
|||
|
|
@ -115,7 +115,7 @@ void LLCocoaPlugin::setupGroup()
|
|||
|
||||
}
|
||||
|
||||
void LLCocoaPlugin::updateWindows() //SPATTERS give this a better name.
|
||||
void LLCocoaPlugin::updateWindows()
|
||||
{
|
||||
// NSArray* window_list = [NSApp orderedWindows];
|
||||
// NSWindow* current_window = [window_list objectAtIndex:0];
|
||||
|
|
|
|||
|
|
@ -24,6 +24,8 @@ include_directories(SYSTEM
|
|||
)
|
||||
|
||||
set(llprimitive_SOURCE_FILES
|
||||
llmaterialid.cpp
|
||||
llmaterial.cpp
|
||||
llmaterialtable.cpp
|
||||
llmediaentry.cpp
|
||||
llmodel.cpp
|
||||
|
|
@ -41,6 +43,8 @@ set(llprimitive_HEADER_FILES
|
|||
CMakeLists.txt
|
||||
|
||||
legacy_object_types.h
|
||||
llmaterial.h
|
||||
llmaterialid.h
|
||||
llmaterialtable.h
|
||||
llmediaentry.h
|
||||
llmodel.h
|
||||
|
|
|
|||
|
|
@ -0,0 +1,227 @@
|
|||
/**
|
||||
* @file llmaterial.cpp
|
||||
* @brief Material definition
|
||||
*
|
||||
* $LicenseInfo:firstyear=2006&license=viewerlgpl$
|
||||
* Second Life Viewer Source Code
|
||||
* Copyright (C) 2010, Linden Research, Inc.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation;
|
||||
* version 2.1 of the License only.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*
|
||||
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
|
||||
* $/LicenseInfo$
|
||||
*/
|
||||
|
||||
#include "linden_common.h"
|
||||
|
||||
#include "llmaterial.h"
|
||||
|
||||
/**
|
||||
* Materials cap parameters
|
||||
*/
|
||||
#define MATERIALS_CAP_NORMAL_MAP_FIELD "NormMap"
|
||||
#define MATERIALS_CAP_NORMAL_MAP_OFFSET_X_FIELD "NormOffsetX"
|
||||
#define MATERIALS_CAP_NORMAL_MAP_OFFSET_Y_FIELD "NormOffsetY"
|
||||
#define MATERIALS_CAP_NORMAL_MAP_REPEAT_X_FIELD "NormRepeatX"
|
||||
#define MATERIALS_CAP_NORMAL_MAP_REPEAT_Y_FIELD "NormRepeatY"
|
||||
#define MATERIALS_CAP_NORMAL_MAP_ROTATION_FIELD "NormRotation"
|
||||
|
||||
#define MATERIALS_CAP_SPECULAR_MAP_FIELD "SpecMap"
|
||||
#define MATERIALS_CAP_SPECULAR_MAP_OFFSET_X_FIELD "SpecOffsetX"
|
||||
#define MATERIALS_CAP_SPECULAR_MAP_OFFSET_Y_FIELD "SpecOffsetY"
|
||||
#define MATERIALS_CAP_SPECULAR_MAP_REPEAT_X_FIELD "SpecRepeatX"
|
||||
#define MATERIALS_CAP_SPECULAR_MAP_REPEAT_Y_FIELD "SpecRepeatY"
|
||||
#define MATERIALS_CAP_SPECULAR_MAP_ROTATION_FIELD "SpecRotation"
|
||||
|
||||
#define MATERIALS_CAP_SPECULAR_COLOR_FIELD "SpecColor"
|
||||
#define MATERIALS_CAP_SPECULAR_EXP_FIELD "SpecExp"
|
||||
#define MATERIALS_CAP_ENV_INTENSITY_FIELD "EnvIntensity"
|
||||
#define MATERIALS_CAP_ALPHA_MASK_CUTOFF_FIELD "AlphaMaskCutoff"
|
||||
#define MATERIALS_CAP_DIFFUSE_ALPHA_MODE_FIELD "DiffuseAlphaMode"
|
||||
|
||||
const LLColor4U LLMaterial::DEFAULT_SPECULAR_LIGHT_COLOR(255,255,255,255);
|
||||
|
||||
/**
|
||||
* Materials constants
|
||||
*/
|
||||
|
||||
const F32 MATERIALS_MULTIPLIER = 10000.f;
|
||||
|
||||
/**
|
||||
* Helper functions
|
||||
*/
|
||||
|
||||
template<typename T> T getMaterialField(const LLSD& data, const std::string& field, const LLSD::Type field_type)
|
||||
{
|
||||
if ( (data.has(field)) && (field_type == data[field].type()) )
|
||||
{
|
||||
return (T)data[field];
|
||||
}
|
||||
llerrs << "Missing or mistyped field '" << field << "' in material definition" << llendl;
|
||||
return (T)LLSD();
|
||||
}
|
||||
|
||||
// GCC didn't like the generic form above for some reason
|
||||
template<> LLUUID getMaterialField(const LLSD& data, const std::string& field, const LLSD::Type field_type)
|
||||
{
|
||||
if ( (data.has(field)) && (field_type == data[field].type()) )
|
||||
{
|
||||
return data[field].asUUID();
|
||||
}
|
||||
llerrs << "Missing or mistyped field '" << field << "' in material definition" << llendl;
|
||||
return LLUUID::null;
|
||||
}
|
||||
|
||||
/**
|
||||
* LLMaterial class
|
||||
*/
|
||||
|
||||
const LLMaterial LLMaterial::null;
|
||||
|
||||
LLMaterial::LLMaterial()
|
||||
: mNormalOffsetX(0.0f)
|
||||
, mNormalOffsetY(0.0f)
|
||||
, mNormalRepeatX(1.0f)
|
||||
, mNormalRepeatY(1.0f)
|
||||
, mNormalRotation(0.0f)
|
||||
, mSpecularOffsetX(0.0f)
|
||||
, mSpecularOffsetY(0.0f)
|
||||
, mSpecularRepeatX(1.0f)
|
||||
, mSpecularRepeatY(1.0f)
|
||||
, mSpecularRotation(0.0f)
|
||||
, mSpecularLightColor(LLMaterial::DEFAULT_SPECULAR_LIGHT_COLOR)
|
||||
, mSpecularLightExponent(LLMaterial::DEFAULT_SPECULAR_LIGHT_EXPONENT)
|
||||
, mEnvironmentIntensity(LLMaterial::DEFAULT_ENV_INTENSITY)
|
||||
, mDiffuseAlphaMode(LLMaterial::DIFFUSE_ALPHA_MODE_BLEND)
|
||||
, mAlphaMaskCutoff(0)
|
||||
{
|
||||
}
|
||||
|
||||
LLMaterial::LLMaterial(const LLSD& material_data)
|
||||
{
|
||||
fromLLSD(material_data);
|
||||
}
|
||||
|
||||
LLSD LLMaterial::asLLSD() const
|
||||
{
|
||||
LLSD material_data;
|
||||
|
||||
material_data[MATERIALS_CAP_NORMAL_MAP_FIELD] = mNormalID;
|
||||
material_data[MATERIALS_CAP_NORMAL_MAP_OFFSET_X_FIELD] = llround(mNormalOffsetX * MATERIALS_MULTIPLIER);
|
||||
material_data[MATERIALS_CAP_NORMAL_MAP_OFFSET_Y_FIELD] = llround(mNormalOffsetY * MATERIALS_MULTIPLIER);
|
||||
material_data[MATERIALS_CAP_NORMAL_MAP_REPEAT_X_FIELD] = llround(mNormalRepeatX * MATERIALS_MULTIPLIER);
|
||||
material_data[MATERIALS_CAP_NORMAL_MAP_REPEAT_Y_FIELD] = llround(mNormalRepeatY * MATERIALS_MULTIPLIER);
|
||||
material_data[MATERIALS_CAP_NORMAL_MAP_ROTATION_FIELD] = llround(mNormalRotation * MATERIALS_MULTIPLIER);
|
||||
|
||||
material_data[MATERIALS_CAP_SPECULAR_MAP_FIELD] = mSpecularID;
|
||||
material_data[MATERIALS_CAP_SPECULAR_MAP_OFFSET_X_FIELD] = llround(mSpecularOffsetX * MATERIALS_MULTIPLIER);
|
||||
material_data[MATERIALS_CAP_SPECULAR_MAP_OFFSET_Y_FIELD] = llround(mSpecularOffsetY * MATERIALS_MULTIPLIER);
|
||||
material_data[MATERIALS_CAP_SPECULAR_MAP_REPEAT_X_FIELD] = llround(mSpecularRepeatX * MATERIALS_MULTIPLIER);
|
||||
material_data[MATERIALS_CAP_SPECULAR_MAP_REPEAT_Y_FIELD] = llround(mSpecularRepeatY * MATERIALS_MULTIPLIER);
|
||||
material_data[MATERIALS_CAP_SPECULAR_MAP_ROTATION_FIELD] = llround(mSpecularRotation * MATERIALS_MULTIPLIER);
|
||||
|
||||
material_data[MATERIALS_CAP_SPECULAR_COLOR_FIELD] = mSpecularLightColor.getValue();
|
||||
material_data[MATERIALS_CAP_SPECULAR_EXP_FIELD] = mSpecularLightExponent;
|
||||
material_data[MATERIALS_CAP_ENV_INTENSITY_FIELD] = mEnvironmentIntensity;
|
||||
material_data[MATERIALS_CAP_DIFFUSE_ALPHA_MODE_FIELD] = mDiffuseAlphaMode;
|
||||
material_data[MATERIALS_CAP_ALPHA_MASK_CUTOFF_FIELD] = mAlphaMaskCutoff;
|
||||
|
||||
return material_data;
|
||||
}
|
||||
|
||||
void LLMaterial::fromLLSD(const LLSD& material_data)
|
||||
{
|
||||
mNormalID = getMaterialField<LLSD::UUID>(material_data, MATERIALS_CAP_NORMAL_MAP_FIELD, LLSD::TypeUUID);
|
||||
mNormalOffsetX = (F32)getMaterialField<LLSD::Integer>(material_data, MATERIALS_CAP_NORMAL_MAP_OFFSET_X_FIELD, LLSD::TypeInteger) / MATERIALS_MULTIPLIER;
|
||||
mNormalOffsetY = (F32)getMaterialField<LLSD::Integer>(material_data, MATERIALS_CAP_NORMAL_MAP_OFFSET_Y_FIELD, LLSD::TypeInteger) / MATERIALS_MULTIPLIER;
|
||||
mNormalRepeatX = (F32)getMaterialField<LLSD::Integer>(material_data, MATERIALS_CAP_NORMAL_MAP_REPEAT_X_FIELD, LLSD::TypeInteger) / MATERIALS_MULTIPLIER;
|
||||
mNormalRepeatY = (F32)getMaterialField<LLSD::Integer>(material_data, MATERIALS_CAP_NORMAL_MAP_REPEAT_Y_FIELD, LLSD::TypeInteger) / MATERIALS_MULTIPLIER;
|
||||
mNormalRotation = (F32)getMaterialField<LLSD::Integer>(material_data, MATERIALS_CAP_NORMAL_MAP_ROTATION_FIELD, LLSD::TypeInteger) / MATERIALS_MULTIPLIER;
|
||||
|
||||
mSpecularID = getMaterialField<LLSD::UUID>(material_data, MATERIALS_CAP_SPECULAR_MAP_FIELD, LLSD::TypeUUID);
|
||||
mSpecularOffsetX = (F32)getMaterialField<LLSD::Integer>(material_data, MATERIALS_CAP_SPECULAR_MAP_OFFSET_X_FIELD, LLSD::TypeInteger) / MATERIALS_MULTIPLIER;
|
||||
mSpecularOffsetY = (F32)getMaterialField<LLSD::Integer>(material_data, MATERIALS_CAP_SPECULAR_MAP_OFFSET_Y_FIELD, LLSD::TypeInteger) / MATERIALS_MULTIPLIER;
|
||||
mSpecularRepeatX = (F32)getMaterialField<LLSD::Integer>(material_data, MATERIALS_CAP_SPECULAR_MAP_REPEAT_X_FIELD, LLSD::TypeInteger) / MATERIALS_MULTIPLIER;
|
||||
mSpecularRepeatY = (F32)getMaterialField<LLSD::Integer>(material_data, MATERIALS_CAP_SPECULAR_MAP_REPEAT_Y_FIELD, LLSD::TypeInteger) / MATERIALS_MULTIPLIER;
|
||||
mSpecularRotation = (F32)getMaterialField<LLSD::Integer>(material_data, MATERIALS_CAP_SPECULAR_MAP_ROTATION_FIELD, LLSD::TypeInteger) / MATERIALS_MULTIPLIER;
|
||||
|
||||
mSpecularLightColor.setValue(getMaterialField<LLSD>(material_data, MATERIALS_CAP_SPECULAR_COLOR_FIELD, LLSD::TypeArray));
|
||||
mSpecularLightExponent = (U8)getMaterialField<LLSD::Integer>(material_data, MATERIALS_CAP_SPECULAR_EXP_FIELD, LLSD::TypeInteger);
|
||||
mEnvironmentIntensity = (U8)getMaterialField<LLSD::Integer>(material_data, MATERIALS_CAP_ENV_INTENSITY_FIELD, LLSD::TypeInteger);
|
||||
mDiffuseAlphaMode = (U8)getMaterialField<LLSD::Integer>(material_data, MATERIALS_CAP_DIFFUSE_ALPHA_MODE_FIELD, LLSD::TypeInteger);
|
||||
mAlphaMaskCutoff = (U8)getMaterialField<LLSD::Integer>(material_data, MATERIALS_CAP_ALPHA_MASK_CUTOFF_FIELD, LLSD::TypeInteger);
|
||||
}
|
||||
|
||||
bool LLMaterial::isNull() const
|
||||
{
|
||||
return (*this == null);
|
||||
}
|
||||
|
||||
bool LLMaterial::operator == (const LLMaterial& rhs) const
|
||||
{
|
||||
return
|
||||
(mNormalID == rhs.mNormalID) && (mNormalOffsetX == rhs.mNormalOffsetX) && (mNormalOffsetY == rhs.mNormalOffsetY) &&
|
||||
(mNormalRepeatX == rhs.mNormalRepeatX) && (mNormalRepeatY == rhs.mNormalRepeatY) && (mNormalRotation == rhs.mNormalRotation) &&
|
||||
(mSpecularID == rhs.mSpecularID) && (mSpecularOffsetX == rhs.mSpecularOffsetX) && (mSpecularOffsetY == rhs.mSpecularOffsetY) &&
|
||||
(mSpecularRepeatX == rhs.mSpecularRepeatX) && (mSpecularRepeatY == rhs.mSpecularRepeatY) && (mSpecularRotation == rhs.mSpecularRotation) &&
|
||||
(mSpecularLightColor == rhs.mSpecularLightColor) && (mSpecularLightExponent == rhs.mSpecularLightExponent) &&
|
||||
(mEnvironmentIntensity == rhs.mEnvironmentIntensity) && (mDiffuseAlphaMode == rhs.mDiffuseAlphaMode) && (mAlphaMaskCutoff == rhs.mAlphaMaskCutoff);
|
||||
}
|
||||
|
||||
bool LLMaterial::operator != (const LLMaterial& rhs) const
|
||||
{
|
||||
return !(*this == rhs);
|
||||
}
|
||||
|
||||
|
||||
U32 LLMaterial::getShaderMask(U32 alpha_mode)
|
||||
{ //NEVER incorporate this value into the message system -- this function will vary depending on viewer implementation
|
||||
U32 ret = 0;
|
||||
|
||||
//two least significant bits are "diffuse alpha mode"
|
||||
if (alpha_mode != DIFFUSE_ALPHA_MODE_DEFAULT)
|
||||
{
|
||||
ret = alpha_mode;
|
||||
}
|
||||
else
|
||||
{
|
||||
ret = getDiffuseAlphaMode();
|
||||
}
|
||||
|
||||
llassert(ret < SHADER_COUNT);
|
||||
|
||||
//next bit is whether or not specular map is present
|
||||
const U32 SPEC_BIT = 0x4;
|
||||
|
||||
if (getSpecularID().notNull())
|
||||
{
|
||||
ret |= SPEC_BIT;
|
||||
}
|
||||
|
||||
llassert(ret < SHADER_COUNT);
|
||||
|
||||
//next bit is whether or not normal map is present
|
||||
const U32 NORM_BIT = 0x8;
|
||||
if (getNormalID().notNull())
|
||||
{
|
||||
ret |= NORM_BIT;
|
||||
}
|
||||
|
||||
llassert(ret < SHADER_COUNT);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -0,0 +1,155 @@
|
|||
/**
|
||||
* @file llmaterial.h
|
||||
* @brief Material definition
|
||||
*
|
||||
* $LicenseInfo:firstyear=2006&license=viewerlgpl$
|
||||
* Second Life Viewer Source Code
|
||||
* Copyright (C) 2010, Linden Research, Inc.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation;
|
||||
* version 2.1 of the License only.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*
|
||||
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
|
||||
* $/LicenseInfo$
|
||||
*/
|
||||
|
||||
#ifndef LL_LLMATERIAL_H
|
||||
#define LL_LLMATERIAL_H
|
||||
|
||||
#include <boost/shared_ptr.hpp>
|
||||
|
||||
#include "llmaterialid.h"
|
||||
#include "llsd.h"
|
||||
#include "v4coloru.h"
|
||||
#include "llpointer.h"
|
||||
#include "llrefcount.h"
|
||||
|
||||
class LLMaterial : public LLRefCount
|
||||
{
|
||||
public:
|
||||
|
||||
typedef enum
|
||||
{
|
||||
DIFFUSE_ALPHA_MODE_NONE = 0,
|
||||
DIFFUSE_ALPHA_MODE_BLEND = 1,
|
||||
DIFFUSE_ALPHA_MODE_MASK = 2,
|
||||
DIFFUSE_ALPHA_MODE_EMISSIVE = 3,
|
||||
DIFFUSE_ALPHA_MODE_DEFAULT = 4,
|
||||
} eDiffuseAlphaMode;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
SHADER_COUNT = 16,
|
||||
ALPHA_SHADER_COUNT = 4
|
||||
} eShaderCount;
|
||||
|
||||
|
||||
|
||||
static const U8 DEFAULT_SPECULAR_LIGHT_EXPONENT = ((U8)(0.2f * 255));
|
||||
static const LLColor4U DEFAULT_SPECULAR_LIGHT_COLOR;
|
||||
static const U8 DEFAULT_ENV_INTENSITY = 0;
|
||||
|
||||
LLMaterial();
|
||||
LLMaterial(const LLSD& material_data);
|
||||
|
||||
LLSD asLLSD() const;
|
||||
void fromLLSD(const LLSD& material_data);
|
||||
|
||||
const LLUUID& getNormalID() const { return mNormalID; }
|
||||
void setNormalID(const LLUUID& normal_id) { mNormalID = normal_id; }
|
||||
void getNormalOffset(F32& offset_x, F32& offset_y) const { offset_x = mNormalOffsetX; offset_y = mNormalOffsetY; }
|
||||
F32 getNormalOffsetX() const { return mNormalOffsetX; }
|
||||
F32 getNormalOffsetY() const { return mNormalOffsetY; }
|
||||
|
||||
void setNormalOffset(F32 offset_x, F32 offset_y) { mNormalOffsetX = offset_x; mNormalOffsetY = offset_y; }
|
||||
void setNormalOffsetX(F32 offset_x) { mNormalOffsetX = offset_x; }
|
||||
void setNormalOffsetY(F32 offset_y) { mNormalOffsetY = offset_y; }
|
||||
|
||||
void getNormalRepeat(F32& repeat_x, F32& repeat_y) const { repeat_x = mNormalRepeatX; repeat_y = mNormalRepeatY; }
|
||||
F32 getNormalRepeatX() const { return mNormalRepeatX; }
|
||||
F32 getNormalRepeatY() const { return mNormalRepeatY; }
|
||||
|
||||
void setNormalRepeat(F32 repeat_x, F32 repeat_y) { mNormalRepeatX = repeat_x; mNormalRepeatY = repeat_y; }
|
||||
void setNormalRepeatX(F32 repeat_x) { mNormalRepeatX = repeat_x; }
|
||||
void setNormalRepeatY(F32 repeat_y) { mNormalRepeatY = repeat_y; }
|
||||
|
||||
F32 getNormalRotation() const { return mNormalRotation; }
|
||||
void setNormalRotation(F32 rot) { mNormalRotation = rot; }
|
||||
|
||||
const LLUUID& getSpecularID() const { return mSpecularID; }
|
||||
void setSpecularID(const LLUUID& specular_id) { mSpecularID = specular_id; }
|
||||
void getSpecularOffset(F32& offset_x, F32& offset_y) const { offset_x = mSpecularOffsetX; offset_y = mSpecularOffsetY; }
|
||||
F32 getSpecularOffsetX() const { return mSpecularOffsetX; }
|
||||
F32 getSpecularOffsetY() const { return mSpecularOffsetY; }
|
||||
|
||||
void setSpecularOffset(F32 offset_x, F32 offset_y) { mSpecularOffsetX = offset_x; mSpecularOffsetY = offset_y; }
|
||||
void setSpecularOffsetX(F32 offset_x) { mSpecularOffsetX = offset_x; }
|
||||
void setSpecularOffsetY(F32 offset_y) { mSpecularOffsetY = offset_y; }
|
||||
|
||||
void getSpecularRepeat(F32& repeat_x, F32& repeat_y) const { repeat_x = mSpecularRepeatX; repeat_y = mSpecularRepeatY; }
|
||||
F32 getSpecularRepeatX() const { return mSpecularRepeatX; }
|
||||
F32 getSpecularRepeatY() const { return mSpecularRepeatY; }
|
||||
|
||||
void setSpecularRepeat(F32 repeat_x, F32 repeat_y) { mSpecularRepeatX = repeat_x; mSpecularRepeatY = repeat_y; }
|
||||
void setSpecularRepeatX(F32 repeat_x) { mSpecularRepeatX = repeat_x; }
|
||||
void setSpecularRepeatY(F32 repeat_y) { mSpecularRepeatY = repeat_y; }
|
||||
|
||||
F32 getSpecularRotation() const { return mSpecularRotation; }
|
||||
void setSpecularRotation(F32 rot) { mSpecularRotation = rot; }
|
||||
|
||||
const LLColor4U getSpecularLightColor() const { return mSpecularLightColor; }
|
||||
void setSpecularLightColor(const LLColor4U& color) { mSpecularLightColor = color; }
|
||||
U8 getSpecularLightExponent() const { return mSpecularLightExponent; }
|
||||
void setSpecularLightExponent(U8 exponent) { mSpecularLightExponent = exponent; }
|
||||
U8 getEnvironmentIntensity() const { return mEnvironmentIntensity; }
|
||||
void setEnvironmentIntensity(U8 intensity) { mEnvironmentIntensity = intensity; }
|
||||
U8 getDiffuseAlphaMode() const { return mDiffuseAlphaMode; }
|
||||
void setDiffuseAlphaMode(U8 alpha_mode) { mDiffuseAlphaMode = alpha_mode; }
|
||||
U8 getAlphaMaskCutoff() const { return mAlphaMaskCutoff; }
|
||||
void setAlphaMaskCutoff(U8 cutoff) { mAlphaMaskCutoff = cutoff; }
|
||||
|
||||
bool isNull() const;
|
||||
static const LLMaterial null;
|
||||
|
||||
bool operator == (const LLMaterial& rhs) const;
|
||||
bool operator != (const LLMaterial& rhs) const;
|
||||
|
||||
U32 getShaderMask(U32 alpha_mode = DIFFUSE_ALPHA_MODE_DEFAULT);
|
||||
|
||||
protected:
|
||||
LLUUID mNormalID;
|
||||
F32 mNormalOffsetX;
|
||||
F32 mNormalOffsetY;
|
||||
F32 mNormalRepeatX;
|
||||
F32 mNormalRepeatY;
|
||||
F32 mNormalRotation;
|
||||
|
||||
LLUUID mSpecularID;
|
||||
F32 mSpecularOffsetX;
|
||||
F32 mSpecularOffsetY;
|
||||
F32 mSpecularRepeatX;
|
||||
F32 mSpecularRepeatY;
|
||||
F32 mSpecularRotation;
|
||||
|
||||
LLColor4U mSpecularLightColor;
|
||||
U8 mSpecularLightExponent;
|
||||
U8 mEnvironmentIntensity;
|
||||
U8 mDiffuseAlphaMode;
|
||||
U8 mAlphaMaskCutoff;
|
||||
};
|
||||
|
||||
typedef LLPointer<LLMaterial> LLMaterialPtr;
|
||||
|
||||
#endif // LL_LLMATERIAL_H
|
||||
|
||||
|
|
@ -0,0 +1,183 @@
|
|||
/**
|
||||
* @file llmaterialid.cpp
|
||||
* @brief Implementation of llmaterialid
|
||||
* @author Stinson@lindenlab.com
|
||||
*
|
||||
* $LicenseInfo:firstyear=2012&license=viewerlgpl$
|
||||
* Second Life Viewer Source Code
|
||||
* Copyright (C) 2012, Linden Research, Inc.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation;
|
||||
* version 2.1 of the License only.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*
|
||||
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
|
||||
* $/LicenseInfo$
|
||||
*/
|
||||
|
||||
#include "linden_common.h"
|
||||
|
||||
#include "llmaterialid.h"
|
||||
|
||||
#include <string>
|
||||
|
||||
#include "llformat.h"
|
||||
|
||||
const LLMaterialID LLMaterialID::null;
|
||||
|
||||
LLMaterialID::LLMaterialID()
|
||||
{
|
||||
clear();
|
||||
}
|
||||
|
||||
LLMaterialID::LLMaterialID(const LLSD& pMaterialID)
|
||||
{
|
||||
llassert(pMaterialID.isBinary());
|
||||
parseFromBinary(pMaterialID.asBinary());
|
||||
}
|
||||
|
||||
LLMaterialID::LLMaterialID(const LLSD::Binary& pMaterialID)
|
||||
{
|
||||
parseFromBinary(pMaterialID);
|
||||
}
|
||||
|
||||
LLMaterialID::LLMaterialID(const void* pMemory)
|
||||
{
|
||||
set(pMemory);
|
||||
}
|
||||
|
||||
LLMaterialID::LLMaterialID(const LLMaterialID& pOtherMaterialID)
|
||||
{
|
||||
copyFromOtherMaterialID(pOtherMaterialID);
|
||||
}
|
||||
|
||||
LLMaterialID::~LLMaterialID()
|
||||
{
|
||||
}
|
||||
|
||||
bool LLMaterialID::operator == (const LLMaterialID& pOtherMaterialID) const
|
||||
{
|
||||
return (compareToOtherMaterialID(pOtherMaterialID) == 0);
|
||||
}
|
||||
|
||||
bool LLMaterialID::operator != (const LLMaterialID& pOtherMaterialID) const
|
||||
{
|
||||
return (compareToOtherMaterialID(pOtherMaterialID) != 0);
|
||||
}
|
||||
|
||||
bool LLMaterialID::operator < (const LLMaterialID& pOtherMaterialID) const
|
||||
{
|
||||
return (compareToOtherMaterialID(pOtherMaterialID) < 0);
|
||||
}
|
||||
|
||||
bool LLMaterialID::operator <= (const LLMaterialID& pOtherMaterialID) const
|
||||
{
|
||||
return (compareToOtherMaterialID(pOtherMaterialID) <= 0);
|
||||
}
|
||||
|
||||
bool LLMaterialID::operator > (const LLMaterialID& pOtherMaterialID) const
|
||||
{
|
||||
return (compareToOtherMaterialID(pOtherMaterialID) > 0);
|
||||
}
|
||||
|
||||
bool LLMaterialID::operator >= (const LLMaterialID& pOtherMaterialID) const
|
||||
{
|
||||
return (compareToOtherMaterialID(pOtherMaterialID) >= 0);
|
||||
}
|
||||
|
||||
LLMaterialID& LLMaterialID::operator = (const LLMaterialID& pOtherMaterialID)
|
||||
{
|
||||
copyFromOtherMaterialID(pOtherMaterialID);
|
||||
return (*this);
|
||||
}
|
||||
|
||||
bool LLMaterialID::isNull() const
|
||||
{
|
||||
return (compareToOtherMaterialID(LLMaterialID::null) == 0);
|
||||
}
|
||||
|
||||
const U8* LLMaterialID::get() const
|
||||
{
|
||||
return mID;
|
||||
}
|
||||
|
||||
void LLMaterialID::set(const void* pMemory)
|
||||
{
|
||||
llassert(pMemory != NULL);
|
||||
|
||||
// assumes that the required size of memory is available
|
||||
memcpy(mID, pMemory, MATERIAL_ID_SIZE * sizeof(U8));
|
||||
}
|
||||
|
||||
void LLMaterialID::clear()
|
||||
{
|
||||
memset(mID, 0, MATERIAL_ID_SIZE * sizeof(U8));
|
||||
}
|
||||
|
||||
LLSD LLMaterialID::asLLSD() const
|
||||
{
|
||||
LLSD::Binary materialIDBinary;
|
||||
|
||||
materialIDBinary.resize(MATERIAL_ID_SIZE * sizeof(U8));
|
||||
memcpy(materialIDBinary.data(), mID, MATERIAL_ID_SIZE * sizeof(U8));
|
||||
|
||||
LLSD materialID = materialIDBinary;
|
||||
return materialID;
|
||||
}
|
||||
|
||||
std::string LLMaterialID::asString() const
|
||||
{
|
||||
std::string materialIDString;
|
||||
for (unsigned int i = 0U; i < static_cast<unsigned int>(MATERIAL_ID_SIZE / sizeof(U32)); ++i)
|
||||
{
|
||||
if (i != 0U)
|
||||
{
|
||||
materialIDString += "-";
|
||||
}
|
||||
const U32 *value = reinterpret_cast<const U32*>(&get()[i * sizeof(U32)]);
|
||||
materialIDString += llformat("%08x", *value);
|
||||
}
|
||||
return materialIDString;
|
||||
}
|
||||
|
||||
std::ostream& operator<<(std::ostream& s, const LLMaterialID &material_id)
|
||||
{
|
||||
s << material_id.asString();
|
||||
return s;
|
||||
}
|
||||
|
||||
|
||||
void LLMaterialID::parseFromBinary (const LLSD::Binary& pMaterialID)
|
||||
{
|
||||
llassert(pMaterialID.size() == (MATERIAL_ID_SIZE * sizeof(U8)));
|
||||
memcpy(mID, &pMaterialID[0], MATERIAL_ID_SIZE * sizeof(U8));
|
||||
}
|
||||
|
||||
void LLMaterialID::copyFromOtherMaterialID(const LLMaterialID& pOtherMaterialID)
|
||||
{
|
||||
memcpy(mID, pOtherMaterialID.get(), MATERIAL_ID_SIZE * sizeof(U8));
|
||||
}
|
||||
|
||||
int LLMaterialID::compareToOtherMaterialID(const LLMaterialID& pOtherMaterialID) const
|
||||
{
|
||||
int retVal = 0;
|
||||
|
||||
for (unsigned int i = 0U; (retVal == 0) && (i < static_cast<unsigned int>(MATERIAL_ID_SIZE / sizeof(U32))); ++i)
|
||||
{
|
||||
const U32 *thisValue = reinterpret_cast<const U32*>(&get()[i * sizeof(U32)]);
|
||||
const U32 *otherValue = reinterpret_cast<const U32*>(&pOtherMaterialID.get()[i * sizeof(U32)]);
|
||||
retVal = ((*thisValue < *otherValue) ? -1 : ((*thisValue > *otherValue) ? 1 : 0));
|
||||
}
|
||||
|
||||
return retVal;
|
||||
}
|
||||
|
|
@ -0,0 +1,76 @@
|
|||
/**
|
||||
* @file llmaterialid.h
|
||||
* @brief Header file for llmaterialid
|
||||
* @author Stinson@lindenlab.com
|
||||
*
|
||||
* $LicenseInfo:firstyear=2012&license=viewerlgpl$
|
||||
* Second Life Viewer Source Code
|
||||
* Copyright (C) 2012, Linden Research, Inc.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation;
|
||||
* version 2.1 of the License only.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*
|
||||
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
|
||||
* $/LicenseInfo$
|
||||
*/
|
||||
#ifndef LL_LLMATERIALID_H
|
||||
#define LL_LLMATERIALID_H
|
||||
|
||||
#define MATERIAL_ID_SIZE 16
|
||||
|
||||
#include <string>
|
||||
|
||||
class LLMaterialID
|
||||
{
|
||||
public:
|
||||
LLMaterialID();
|
||||
LLMaterialID(const LLSD& pMaterialID);
|
||||
LLMaterialID(const LLSD::Binary& pMaterialID);
|
||||
LLMaterialID(const void* pMemory);
|
||||
LLMaterialID(const LLMaterialID& pOtherMaterialID);
|
||||
~LLMaterialID();
|
||||
|
||||
bool operator == (const LLMaterialID& pOtherMaterialID) const;
|
||||
bool operator != (const LLMaterialID& pOtherMaterialID) const;
|
||||
|
||||
bool operator < (const LLMaterialID& pOtherMaterialID) const;
|
||||
bool operator <= (const LLMaterialID& pOtherMaterialID) const;
|
||||
bool operator > (const LLMaterialID& pOtherMaterialID) const;
|
||||
bool operator >= (const LLMaterialID& pOtherMaterialID) const;
|
||||
|
||||
LLMaterialID& operator = (const LLMaterialID& pOtherMaterialID);
|
||||
|
||||
bool isNull() const;
|
||||
|
||||
const U8* get() const;
|
||||
void set(const void* pMemory);
|
||||
void clear();
|
||||
|
||||
LLSD asLLSD() const;
|
||||
std::string asString() const;
|
||||
|
||||
friend std::ostream& operator<<(std::ostream& s, const LLMaterialID &material_id);
|
||||
|
||||
static const LLMaterialID null;
|
||||
|
||||
private:
|
||||
void parseFromBinary(const LLSD::Binary& pMaterialID);
|
||||
void copyFromOtherMaterialID(const LLMaterialID& pOtherMaterialID);
|
||||
int compareToOtherMaterialID(const LLMaterialID& pOtherMaterialID) const;
|
||||
|
||||
U8 mID[MATERIAL_ID_SIZE];
|
||||
} ;
|
||||
|
||||
#endif // LL_LLMATERIALID_H
|
||||
|
||||
|
|
@ -39,6 +39,7 @@
|
|||
#include "llsdutil_math.h"
|
||||
#include "llprimtexturelist.h"
|
||||
#include "imageids.h"
|
||||
#include "llmaterialid.h"
|
||||
|
||||
/**
|
||||
* exported constants
|
||||
|
|
@ -314,6 +315,15 @@ S32 LLPrimitive::setTERotation(const U8 index, const F32 r)
|
|||
return mTextureList.setRotation(index, r);
|
||||
}
|
||||
|
||||
S32 LLPrimitive::setTEMaterialID(const U8 index, const LLMaterialID& pMaterialID)
|
||||
{
|
||||
return mTextureList.setMaterialID(index, pMaterialID);
|
||||
}
|
||||
|
||||
S32 LLPrimitive::setTEMaterialParams(const U8 index, const LLMaterialPtr pMaterialParams)
|
||||
{
|
||||
return mTextureList.setMaterialParams(index, pMaterialParams);
|
||||
}
|
||||
|
||||
//===============================================================
|
||||
S32 LLPrimitive::setTEBumpShinyFullbright(const U8 index, const U8 bump)
|
||||
|
|
@ -364,6 +374,23 @@ S32 LLPrimitive::setTEGlow(const U8 index, const F32 glow)
|
|||
return mTextureList.setGlow(index, glow);
|
||||
}
|
||||
|
||||
void LLPrimitive::setAllTESelected(bool sel)
|
||||
{
|
||||
for (int i = 0, cnt = getNumTEs(); i < cnt; i++)
|
||||
{
|
||||
setTESelected(i, sel);
|
||||
}
|
||||
}
|
||||
|
||||
void LLPrimitive::setTESelected(const U8 te, bool sel)
|
||||
{
|
||||
LLTextureEntry* tep = getTE(te);
|
||||
if ( (tep) && (tep->setSelected(sel)) && (!sel) && (tep->hasPendingMaterialUpdate()) )
|
||||
{
|
||||
LLMaterialID material_id = tep->getMaterialID();
|
||||
setTEMaterialID(te, material_id);
|
||||
}
|
||||
}
|
||||
|
||||
LLPCode LLPrimitive::legacyToPCode(const U8 legacy)
|
||||
{
|
||||
|
|
@ -1044,7 +1071,7 @@ S32 LLPrimitive::unpackTEField(U8 *cur_ptr, U8 *buffer_end, U8 *data_ptr, U8 dat
|
|||
|
||||
while ((cur_ptr < buffer_end) && (*cur_ptr != 0))
|
||||
{
|
||||
// llinfos << "TE exception" << llendl;
|
||||
LL_DEBUGS("TEFieldDecode") << "TE exception" << LL_ENDL;
|
||||
i = 0;
|
||||
while (*cur_ptr & 0x80)
|
||||
{
|
||||
|
|
@ -1059,14 +1086,16 @@ S32 LLPrimitive::unpackTEField(U8 *cur_ptr, U8 *buffer_end, U8 *data_ptr, U8 dat
|
|||
if (i & 0x01)
|
||||
{
|
||||
htonmemcpy(data_ptr+(j*data_size),cur_ptr,type,data_size);
|
||||
// char foo[64];
|
||||
// sprintf(foo,"%x %x",*(data_ptr+(j*data_size)), *(data_ptr+(j*data_size)+1));
|
||||
// llinfos << "Assigning " << foo << " to face " << j << llendl;
|
||||
LL_DEBUGS("TEFieldDecode") << "Assigning " ;
|
||||
char foo[64];
|
||||
sprintf(foo,"%x %x",*(data_ptr+(j*data_size)), *(data_ptr+(j*data_size)+1));
|
||||
LL_CONT << foo << " to face " << j << LL_ENDL;
|
||||
}
|
||||
i = i >> 1;
|
||||
}
|
||||
cur_ptr += data_size;
|
||||
}
|
||||
llassert(cur_ptr <= buffer_end); // buffer underrun
|
||||
return (S32)(cur_ptr - start_loc);
|
||||
}
|
||||
|
||||
|
|
@ -1088,6 +1117,7 @@ BOOL LLPrimitive::packTEMessage(LLMessageSystem *mesgsys) const
|
|||
U8 bump[MAX_TES];
|
||||
U8 media_flags[MAX_TES];
|
||||
U8 glow[MAX_TES];
|
||||
U8 material_data[MAX_TES*16];
|
||||
|
||||
const U32 MAX_TE_BUFFER = 4096;
|
||||
U8 packed_buffer[MAX_TE_BUFFER];
|
||||
|
|
@ -1125,6 +1155,9 @@ BOOL LLPrimitive::packTEMessage(LLMessageSystem *mesgsys) const
|
|||
bump[face_index] = te->getBumpShinyFullbright();
|
||||
media_flags[face_index] = te->getMediaTexGen();
|
||||
glow[face_index] = (U8) llround((llclamp(te->getGlow(), 0.0f, 1.0f) * (F32)0xFF));
|
||||
|
||||
// Directly sending material_ids is not safe!
|
||||
memcpy(&material_data[face_index*16],getTE(face_index)->getMaterialID().get(),16); /* Flawfinder: ignore */
|
||||
}
|
||||
|
||||
cur_ptr += packTEField(cur_ptr, (U8 *)image_ids, sizeof(LLUUID),last_face_index, MVT_LLUUID);
|
||||
|
|
@ -1146,6 +1179,8 @@ BOOL LLPrimitive::packTEMessage(LLMessageSystem *mesgsys) const
|
|||
cur_ptr += packTEField(cur_ptr, (U8 *)media_flags, 1 ,last_face_index, MVT_U8);
|
||||
*cur_ptr++ = 0;
|
||||
cur_ptr += packTEField(cur_ptr, (U8 *)glow, 1 ,last_face_index, MVT_U8);
|
||||
*cur_ptr++ = 0;
|
||||
cur_ptr += packTEField(cur_ptr, (U8 *)material_data, 16, last_face_index, MVT_LLUUID);
|
||||
}
|
||||
mesgsys->addBinaryDataFast(_PREHASH_TextureEntry, packed_buffer, (S32)(cur_ptr - packed_buffer));
|
||||
|
||||
|
|
@ -1167,6 +1202,7 @@ BOOL LLPrimitive::packTEMessage(LLDataPacker &dp) const
|
|||
U8 bump[MAX_TES];
|
||||
U8 media_flags[MAX_TES];
|
||||
U8 glow[MAX_TES];
|
||||
U8 material_data[MAX_TES*16];
|
||||
|
||||
const U32 MAX_TE_BUFFER = 4096;
|
||||
U8 packed_buffer[MAX_TE_BUFFER];
|
||||
|
|
@ -1204,6 +1240,9 @@ BOOL LLPrimitive::packTEMessage(LLDataPacker &dp) const
|
|||
bump[face_index] = te->getBumpShinyFullbright();
|
||||
media_flags[face_index] = te->getMediaTexGen();
|
||||
glow[face_index] = (U8) llround((llclamp(te->getGlow(), 0.0f, 1.0f) * (F32)0xFF));
|
||||
|
||||
// Directly sending material_ids is not safe!
|
||||
memcpy(&material_data[face_index*16],getTE(face_index)->getMaterialID().get(),16); /* Flawfinder: ignore */
|
||||
}
|
||||
|
||||
cur_ptr += packTEField(cur_ptr, (U8 *)image_ids, sizeof(LLUUID),last_face_index, MVT_LLUUID);
|
||||
|
|
@ -1225,6 +1264,8 @@ BOOL LLPrimitive::packTEMessage(LLDataPacker &dp) const
|
|||
cur_ptr += packTEField(cur_ptr, (U8 *)media_flags, 1 ,last_face_index, MVT_U8);
|
||||
*cur_ptr++ = 0;
|
||||
cur_ptr += packTEField(cur_ptr, (U8 *)glow, 1 ,last_face_index, MVT_U8);
|
||||
*cur_ptr++ = 0;
|
||||
cur_ptr += packTEField(cur_ptr, (U8 *)material_data, 16, last_face_index, MVT_LLUUID);
|
||||
}
|
||||
|
||||
dp.packBinaryData(packed_buffer, (S32)(cur_ptr - packed_buffer), "TextureEntry");
|
||||
|
|
@ -1234,6 +1275,9 @@ BOOL LLPrimitive::packTEMessage(LLDataPacker &dp) const
|
|||
S32 LLPrimitive::parseTEMessage(LLMessageSystem* mesgsys, char const* block_name, const S32 block_num, LLTEContents& tec)
|
||||
{
|
||||
S32 retval = 0;
|
||||
// temp buffer for material ID processing
|
||||
// data will end up in tec.material_id[]
|
||||
U8 material_data[LLTEContents::MAX_TES*16];
|
||||
|
||||
if (block_num < 0)
|
||||
{
|
||||
|
|
@ -1282,14 +1326,29 @@ S32 LLPrimitive::parseTEMessage(LLMessageSystem* mesgsys, char const* block_name
|
|||
cur_ptr++;
|
||||
cur_ptr += unpackTEField(cur_ptr, tec.packed_buffer+tec.size, (U8 *)tec.glow, 1, tec.face_count, MVT_U8);
|
||||
|
||||
if (cur_ptr < tec.packed_buffer + tec.size)
|
||||
{
|
||||
cur_ptr++;
|
||||
cur_ptr += unpackTEField(cur_ptr, tec.packed_buffer+tec.size, (U8 *)material_data, 16, tec.face_count, MVT_LLUUID);
|
||||
}
|
||||
else
|
||||
{
|
||||
memset(material_data, 0, sizeof(material_data));
|
||||
}
|
||||
|
||||
for (U32 i = 0; i < tec.face_count; i++)
|
||||
{
|
||||
tec.material_ids[i].set(&material_data[i * 16]);
|
||||
}
|
||||
|
||||
retval = 1;
|
||||
return retval;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
S32 LLPrimitive::applyParsedTEMessage(LLTEContents& tec)
|
||||
{
|
||||
S32 retval = 0;
|
||||
|
||||
|
||||
LLColor4 color;
|
||||
LLColor4U coloru;
|
||||
for (U32 i = 0; i < tec.face_count; i++)
|
||||
|
|
@ -1302,6 +1361,9 @@ S32 LLPrimitive::applyParsedTEMessage(LLTEContents& tec)
|
|||
retval |= setTEBumpShinyFullbright(i, tec.bump[i]);
|
||||
retval |= setTEMediaTexGen(i, tec.media_flags[i]);
|
||||
retval |= setTEGlow(i, (F32)tec.glow[i] / (F32)0xFF);
|
||||
|
||||
retval |= setTEMaterialID(i, tec.material_ids[i]);
|
||||
|
||||
coloru = LLColor4U(tec.colors + 4*i);
|
||||
|
||||
// Note: This is an optimization to send common colors (1.f, 1.f, 1.f, 1.f)
|
||||
|
|
@ -1336,6 +1398,7 @@ S32 LLPrimitive::unpackTEMessage(LLDataPacker &dp)
|
|||
|
||||
// Avoid construction of 32 UUIDs per call
|
||||
static LLUUID image_ids[MAX_TES];
|
||||
static LLMaterialID material_ids[MAX_TES];
|
||||
|
||||
U8 image_data[MAX_TES*16];
|
||||
U8 colors[MAX_TES*4];
|
||||
|
|
@ -1347,6 +1410,7 @@ S32 LLPrimitive::unpackTEMessage(LLDataPacker &dp)
|
|||
U8 bump[MAX_TES];
|
||||
U8 media_flags[MAX_TES];
|
||||
U8 glow[MAX_TES];
|
||||
U8 material_data[MAX_TES*16];
|
||||
|
||||
const U32 MAX_TE_BUFFER = 4096;
|
||||
U8 packed_buffer[MAX_TE_BUFFER];
|
||||
|
|
@ -1389,10 +1453,20 @@ S32 LLPrimitive::unpackTEMessage(LLDataPacker &dp)
|
|||
cur_ptr += unpackTEField(cur_ptr, packed_buffer+size, (U8 *)media_flags, 1, face_count, MVT_U8);
|
||||
cur_ptr++;
|
||||
cur_ptr += unpackTEField(cur_ptr, packed_buffer+size, (U8 *)glow, 1, face_count, MVT_U8);
|
||||
if (cur_ptr < packed_buffer + size)
|
||||
{
|
||||
cur_ptr++;
|
||||
cur_ptr += unpackTEField(cur_ptr, packed_buffer+size, (U8 *)material_data, 16, face_count, MVT_LLUUID);
|
||||
}
|
||||
else
|
||||
{
|
||||
memset(material_data, 0, sizeof(material_data));
|
||||
}
|
||||
|
||||
for (i = 0; i < face_count; i++)
|
||||
{
|
||||
memcpy(image_ids[i].mData,&image_data[i*16],16); /* Flawfinder: ignore */
|
||||
material_ids[i].set(&material_data[i * 16]);
|
||||
}
|
||||
|
||||
LLColor4 color;
|
||||
|
|
@ -1406,6 +1480,7 @@ S32 LLPrimitive::unpackTEMessage(LLDataPacker &dp)
|
|||
retval |= setTEBumpShinyFullbright(i, bump[i]);
|
||||
retval |= setTEMediaTexGen(i, media_flags[i]);
|
||||
retval |= setTEGlow(i, (F32)glow[i] / (F32)0xFF);
|
||||
retval |= setTEMaterialID(i, material_ids[i]);
|
||||
coloru = LLColor4U(colors + 4*i);
|
||||
|
||||
// Note: This is an optimization to send common colors (1.f, 1.f, 1.f, 1.f)
|
||||
|
|
|
|||
|
|
@ -42,6 +42,7 @@ class LLMessageSystem;
|
|||
class LLVolumeParams;
|
||||
class LLColor4;
|
||||
class LLColor3;
|
||||
class LLMaterialID;
|
||||
class LLTextureEntry;
|
||||
class LLDataPacker;
|
||||
class LLVolumeMgr;
|
||||
|
|
@ -309,7 +310,8 @@ struct LLTEContents
|
|||
U8 bump[MAX_TES];
|
||||
U8 media_flags[MAX_TES];
|
||||
U8 glow[MAX_TES];
|
||||
|
||||
LLMaterialID material_ids[MAX_TES];
|
||||
|
||||
static const U32 MAX_TE_BUFFER = 4096;
|
||||
U8 packed_buffer[MAX_TE_BUFFER];
|
||||
|
||||
|
|
@ -359,6 +361,7 @@ public:
|
|||
LLTextureEntry* getTE(const U8 te_num) const;
|
||||
|
||||
virtual void setNumTEs(const U8 num_tes);
|
||||
virtual void setAllTESelected(bool sel);
|
||||
virtual void setAllTETextures(const LLUUID &tex_id);
|
||||
virtual void setTE(const U8 index, const LLTextureEntry& te);
|
||||
virtual S32 setTEColor(const U8 te, const LLColor4 &color);
|
||||
|
|
@ -381,7 +384,10 @@ public:
|
|||
virtual S32 setTEFullbright(const U8 te, const U8 fullbright);
|
||||
virtual S32 setTEMediaFlags(const U8 te, const U8 flags);
|
||||
virtual S32 setTEGlow(const U8 te, const F32 glow);
|
||||
virtual S32 setTEMaterialID(const U8 te, const LLMaterialID& pMaterialID);
|
||||
virtual S32 setTEMaterialParams(const U8 index, const LLMaterialPtr pMaterialParams);
|
||||
virtual BOOL setMaterial(const U8 material); // returns TRUE if material changed
|
||||
virtual void setTESelected(const U8 te, bool sel);
|
||||
|
||||
void copyTEs(const LLPrimitive *primitive);
|
||||
S32 packTEField(U8 *cur_ptr, U8 *data_ptr, U8 data_size, U8 last_face_index, EMsgVariableType type) const;
|
||||
|
|
|
|||
|
|
@ -27,6 +27,7 @@
|
|||
#include "linden_common.h"
|
||||
|
||||
#include "llprimtexturelist.h"
|
||||
#include "llmaterialid.h"
|
||||
#include "lltextureentry.h"
|
||||
|
||||
// static
|
||||
|
|
@ -358,6 +359,24 @@ S32 LLPrimTextureList::setGlow(const U8 index, const F32 glow)
|
|||
return TEM_CHANGE_NONE;
|
||||
}
|
||||
|
||||
S32 LLPrimTextureList::setMaterialID(const U8 index, const LLMaterialID& pMaterialID)
|
||||
{
|
||||
if (index < mEntryList.size())
|
||||
{
|
||||
return mEntryList[index]->setMaterialID(pMaterialID);
|
||||
}
|
||||
return TEM_CHANGE_NONE;
|
||||
}
|
||||
|
||||
S32 LLPrimTextureList::setMaterialParams(const U8 index, const LLMaterialPtr pMaterialParams)
|
||||
{
|
||||
if (index < mEntryList.size())
|
||||
{
|
||||
return mEntryList[index]->setMaterialParams(pMaterialParams);
|
||||
}
|
||||
return TEM_CHANGE_NONE;
|
||||
}
|
||||
|
||||
S32 LLPrimTextureList::size() const
|
||||
{
|
||||
return mEntryList.size();
|
||||
|
|
|
|||
|
|
@ -31,9 +31,11 @@
|
|||
#include "lluuid.h"
|
||||
#include "v3color.h"
|
||||
#include "v4color.h"
|
||||
#include "llmaterial.h"
|
||||
|
||||
|
||||
class LLTextureEntry;
|
||||
class LLMaterialID;
|
||||
|
||||
// this is a list of LLTextureEntry*'s because in practice the list's elements
|
||||
// are of some derived class: LLFooTextureEntry
|
||||
|
|
@ -102,6 +104,8 @@ public:
|
|||
S32 setFullbright(const U8 index, const U8 t);
|
||||
S32 setMediaFlags(const U8 index, const U8 media_flags);
|
||||
S32 setGlow(const U8 index, const F32 glow);
|
||||
S32 setMaterialID(const U8 index, const LLMaterialID& pMaterialID);
|
||||
S32 setMaterialParams(const U8 index, const LLMaterialPtr pMaterialParams);
|
||||
|
||||
S32 size() const;
|
||||
|
||||
|
|
|
|||
|
|
@ -29,6 +29,7 @@
|
|||
#include "lluuid.h"
|
||||
#include "llmediaentry.h"
|
||||
#include "lltextureentry.h"
|
||||
#include "llmaterialid.h"
|
||||
#include "llsdutil_math.h"
|
||||
#include "v4color.h"
|
||||
|
||||
|
|
@ -60,18 +61,24 @@ LLTextureEntry* LLTextureEntry::newTextureEntry()
|
|||
//===============================================================
|
||||
LLTextureEntry::LLTextureEntry()
|
||||
: mMediaEntry(NULL)
|
||||
, mSelected(false)
|
||||
, mMaterialUpdatePending(false)
|
||||
{
|
||||
init(LLUUID::null,1.f,1.f,0.f,0.f,0.f,DEFAULT_BUMP_CODE);
|
||||
}
|
||||
|
||||
LLTextureEntry::LLTextureEntry(const LLUUID& tex_id)
|
||||
: mMediaEntry(NULL)
|
||||
, mSelected(false)
|
||||
, mMaterialUpdatePending(false)
|
||||
{
|
||||
init(tex_id,1.f,1.f,0.f,0.f,0.f,DEFAULT_BUMP_CODE);
|
||||
}
|
||||
|
||||
LLTextureEntry::LLTextureEntry(const LLTextureEntry &rhs)
|
||||
: mMediaEntry(NULL)
|
||||
, mSelected(false)
|
||||
, mMaterialUpdatePending(false)
|
||||
{
|
||||
mID = rhs.mID;
|
||||
mScaleS = rhs.mScaleS;
|
||||
|
|
@ -83,6 +90,8 @@ LLTextureEntry::LLTextureEntry(const LLTextureEntry &rhs)
|
|||
mBump = rhs.mBump;
|
||||
mMediaFlags = rhs.mMediaFlags;
|
||||
mGlow = rhs.mGlow;
|
||||
mMaterialID = rhs.mMaterialID;
|
||||
mMaterial = rhs.mMaterial;
|
||||
if (rhs.mMediaEntry != NULL) {
|
||||
// Make a copy
|
||||
mMediaEntry = new LLMediaEntry(*rhs.mMediaEntry);
|
||||
|
|
@ -103,6 +112,8 @@ LLTextureEntry &LLTextureEntry::operator=(const LLTextureEntry &rhs)
|
|||
mBump = rhs.mBump;
|
||||
mMediaFlags = rhs.mMediaFlags;
|
||||
mGlow = rhs.mGlow;
|
||||
mMaterialID = rhs.mMaterialID;
|
||||
mMaterial = rhs.mMaterial;
|
||||
if (mMediaEntry != NULL) {
|
||||
delete mMediaEntry;
|
||||
}
|
||||
|
|
@ -130,6 +141,7 @@ void LLTextureEntry::init(const LLUUID& tex_id, F32 scale_s, F32 scale_t, F32 of
|
|||
mBump = bump;
|
||||
mMediaFlags = 0x0;
|
||||
mGlow = 0;
|
||||
mMaterialID.clear();
|
||||
|
||||
setColor(LLColor4(1.f, 1.f, 1.f, 1.f));
|
||||
if (mMediaEntry != NULL) {
|
||||
|
|
@ -159,6 +171,7 @@ bool LLTextureEntry::operator!=(const LLTextureEntry &rhs) const
|
|||
if (mBump != rhs.mBump) return (true);
|
||||
if (mMediaFlags != rhs.mMediaFlags) return (true);
|
||||
if (mGlow != rhs.mGlow) return (true);
|
||||
if (mMaterialID != rhs.mMaterialID) return (true);
|
||||
return(false);
|
||||
}
|
||||
|
||||
|
|
@ -174,6 +187,7 @@ bool LLTextureEntry::operator==(const LLTextureEntry &rhs) const
|
|||
if (mBump != rhs.mBump) return (false);
|
||||
if (mMediaFlags != rhs.mMediaFlags) return false;
|
||||
if (mGlow != rhs.mGlow) return false;
|
||||
if (mMaterialID != rhs.mMaterialID) return (false);
|
||||
return(true);
|
||||
}
|
||||
|
||||
|
|
@ -523,6 +537,34 @@ S32 LLTextureEntry::setGlow(F32 glow)
|
|||
return TEM_CHANGE_NONE;
|
||||
}
|
||||
|
||||
S32 LLTextureEntry::setMaterialID(const LLMaterialID& pMaterialID)
|
||||
{
|
||||
if ( (mMaterialID != pMaterialID) || (mMaterialUpdatePending && !mSelected) )
|
||||
{
|
||||
if (mSelected)
|
||||
{
|
||||
mMaterialUpdatePending = true;
|
||||
mMaterialID = pMaterialID;
|
||||
return TEM_CHANGE_NONE;
|
||||
}
|
||||
|
||||
mMaterialUpdatePending = false;
|
||||
mMaterialID = pMaterialID;
|
||||
return TEM_CHANGE_TEXTURE;
|
||||
}
|
||||
return TEM_CHANGE_NONE;
|
||||
}
|
||||
|
||||
S32 LLTextureEntry::setMaterialParams(const LLMaterialPtr pMaterialParams)
|
||||
{
|
||||
if (mSelected)
|
||||
{
|
||||
mMaterialUpdatePending = true;
|
||||
}
|
||||
mMaterial = pMaterialParams;
|
||||
return TEM_CHANGE_TEXTURE;
|
||||
}
|
||||
|
||||
void LLTextureEntry::setMediaData(const LLMediaEntry &media_entry)
|
||||
{
|
||||
mMediaFlags |= MF_HAS_MEDIA;
|
||||
|
|
|
|||
|
|
@ -30,6 +30,8 @@
|
|||
#include "lluuid.h"
|
||||
#include "v4color.h"
|
||||
#include "llsd.h"
|
||||
#include "llmaterialid.h"
|
||||
#include "llmaterial.h"
|
||||
|
||||
// These bits are used while unpacking TEM messages to tell which aspects of
|
||||
// the texture entry changed.
|
||||
|
|
@ -98,6 +100,10 @@ public:
|
|||
|
||||
void init(const LLUUID& tex_id, F32 scale_s, F32 scale_t, F32 offset_s, F32 offset_t, F32 rotation, U8 bump);
|
||||
|
||||
bool hasPendingMaterialUpdate() const { return mMaterialUpdatePending; }
|
||||
bool isSelected() const { return mSelected; }
|
||||
bool setSelected(bool sel) { bool prev_sel = mSelected; mSelected = sel; return prev_sel; }
|
||||
|
||||
// These return a TEM_ flag from above to indicate if something changed.
|
||||
S32 setID (const LLUUID &tex_id);
|
||||
S32 setColor(const LLColor4 &color);
|
||||
|
|
@ -121,11 +127,19 @@ public:
|
|||
S32 setTexGen(U8 texGen);
|
||||
S32 setMediaTexGen(U8 media);
|
||||
S32 setGlow(F32 glow);
|
||||
S32 setMaterialID(const LLMaterialID& pMaterialID);
|
||||
S32 setMaterialParams(const LLMaterialPtr pMaterialParams);
|
||||
|
||||
virtual const LLUUID &getID() const { return mID; }
|
||||
const LLColor4 &getColor() const { return mColor; }
|
||||
void getScale(F32 *s, F32 *t) const { *s = mScaleS; *t = mScaleT; }
|
||||
F32 getScaleS() const { return mScaleS; }
|
||||
F32 getScaleT() const { return mScaleT; }
|
||||
|
||||
void getOffset(F32 *s, F32 *t) const { *s = mOffsetS; *t = mOffsetT; }
|
||||
F32 getOffsetS() const { return mOffsetS; }
|
||||
F32 getOffsetT() const { return mOffsetT; }
|
||||
|
||||
F32 getRotation() const { return mRotation; }
|
||||
void getRotation(F32 *theta) const { *theta = mRotation; }
|
||||
|
||||
|
|
@ -136,9 +150,11 @@ public:
|
|||
U8 getBumpShinyFullbright() const { return mBump; }
|
||||
|
||||
U8 getMediaFlags() const { return mMediaFlags & TEM_MEDIA_MASK; }
|
||||
U8 getTexGen() const { return mMediaFlags & TEM_TEX_GEN_MASK; }
|
||||
LLTextureEntry::e_texgen getTexGen() const { return LLTextureEntry::e_texgen(mMediaFlags & TEM_TEX_GEN_MASK); }
|
||||
U8 getMediaTexGen() const { return mMediaFlags; }
|
||||
F32 getGlow() const { return mGlow; }
|
||||
const LLMaterialID& getMaterialID() const { return mMaterialID; };
|
||||
const LLMaterialPtr getMaterialParams() const { return mMaterial; };
|
||||
|
||||
// *NOTE: it is possible for hasMedia() to return true, but getMediaData() to return NULL.
|
||||
// CONVERSELY, it is also possible for hasMedia() to return false, but getMediaData()
|
||||
|
|
@ -188,11 +204,15 @@ public:
|
|||
static const char* TEXTURE_MEDIA_DATA_KEY;
|
||||
|
||||
protected:
|
||||
bool mSelected;
|
||||
LLUUID mID; // Texture GUID
|
||||
LLColor4 mColor;
|
||||
U8 mBump; // Bump map, shiny, and fullbright
|
||||
U8 mMediaFlags; // replace with web page, movie, etc.
|
||||
F32 mGlow;
|
||||
bool mMaterialUpdatePending;
|
||||
LLMaterialID mMaterialID;
|
||||
LLMaterialPtr mMaterial;
|
||||
|
||||
// Note the media data is not sent via the same message structure as the rest of the TE
|
||||
LLMediaEntry* mMediaEntry; // The media data for the face
|
||||
|
|
|
|||
|
|
@ -92,7 +92,7 @@ if (BUILD_HEADLESS)
|
|||
|
||||
set_property(TARGET llrenderheadless
|
||||
PROPERTY COMPILE_DEFINITIONS LL_MESA=1 LL_MESA_HEADLESS=1
|
||||
)
|
||||
)
|
||||
|
||||
target_link_libraries(llrenderheadless
|
||||
${LLCOMMON_LIBRARIES}
|
||||
|
|
|
|||
|
|
@ -86,7 +86,7 @@ void APIENTRY gl_debug_callback(GLenum source,
|
|||
}
|
||||
else
|
||||
{
|
||||
llwarns << "----- GL WARNING -------" << llendl;
|
||||
llwarns << "----- GL WARNING -------" << llendl;
|
||||
}
|
||||
llwarns << "Type: " << std::hex << type << llendl;
|
||||
llwarns << "ID: " << std::hex << id << llendl;
|
||||
|
|
@ -216,6 +216,11 @@ PFNGLGETQUERYIVARBPROC glGetQueryivARB = NULL;
|
|||
PFNGLGETQUERYOBJECTIVARBPROC glGetQueryObjectivARB = NULL;
|
||||
PFNGLGETQUERYOBJECTUIVARBPROC glGetQueryObjectuivARB = NULL;
|
||||
|
||||
// GL_ARB_timer_query
|
||||
PFNGLQUERYCOUNTERPROC glQueryCounter = NULL;
|
||||
PFNGLGETQUERYOBJECTI64VPROC glGetQueryObjecti64v = NULL;
|
||||
PFNGLGETQUERYOBJECTUI64VPROC glGetQueryObjectui64v = NULL;
|
||||
|
||||
// GL_ARB_point_parameters
|
||||
PFNGLPOINTPARAMETERFARBPROC glPointParameterfARB = NULL;
|
||||
PFNGLPOINTPARAMETERFVARBPROC glPointParameterfvARB = NULL;
|
||||
|
|
@ -421,6 +426,7 @@ LLGLManager::LLGLManager() :
|
|||
mHasFragmentShader(FALSE),
|
||||
mNumTextureImageUnits(0),
|
||||
mHasOcclusionQuery(FALSE),
|
||||
mHasTimerQuery(FALSE),
|
||||
mHasOcclusionQuery2(FALSE),
|
||||
mHasPointParameters(FALSE),
|
||||
mHasDrawBuffers(FALSE),
|
||||
|
|
@ -445,7 +451,9 @@ LLGLManager::LLGLManager() :
|
|||
mIsGFFX(FALSE),
|
||||
mATIOffsetVerticalLines(FALSE),
|
||||
mATIOldDriver(FALSE),
|
||||
|
||||
#if LL_DARWIN
|
||||
mIsMobileGF(FALSE),
|
||||
#endif
|
||||
mHasRequirements(TRUE),
|
||||
|
||||
mHasSeparateSpecularColor(FALSE),
|
||||
|
|
@ -638,6 +646,13 @@ bool LLGLManager::initGL()
|
|||
{
|
||||
mIsGF3 = TRUE;
|
||||
}
|
||||
#if LL_DARWIN
|
||||
else if ((mGLRenderer.find("9400M") != std::string::npos)
|
||||
|| (mGLRenderer.find("9600M") != std::string::npos))
|
||||
{
|
||||
mIsMobileGF = TRUE;
|
||||
}
|
||||
#endif
|
||||
|
||||
}
|
||||
else if (mGLVendor.find("INTEL") != std::string::npos
|
||||
|
|
@ -746,12 +761,13 @@ bool LLGLManager::initGL()
|
|||
{ //using multisample textures on ATI results in black screen for some reason
|
||||
mHasTextureMultisample = FALSE;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
if (mIsIntel && mGLVersion <= 3.f)
|
||||
{ //never try to use framebuffer objects on older intel drivers (crashy)
|
||||
mHasFramebufferObject = FALSE;
|
||||
}
|
||||
#endif
|
||||
|
||||
if (mHasFramebufferObject)
|
||||
{
|
||||
|
|
@ -948,13 +964,15 @@ void LLGLManager::initExtensions()
|
|||
mHasARBEnvCombine = ExtensionExists("GL_ARB_texture_env_combine", gGLHExts.mSysExts);
|
||||
mHasCompressedTextures = glh_init_extensions("GL_ARB_texture_compression");
|
||||
mHasOcclusionQuery = ExtensionExists("GL_ARB_occlusion_query", gGLHExts.mSysExts);
|
||||
mHasTimerQuery = ExtensionExists("GL_ARB_timer_query", gGLHExts.mSysExts);
|
||||
mHasOcclusionQuery2 = ExtensionExists("GL_ARB_occlusion_query2", gGLHExts.mSysExts);
|
||||
mHasVertexBufferObject = ExtensionExists("GL_ARB_vertex_buffer_object", gGLHExts.mSysExts);
|
||||
mHasVertexArrayObject = ExtensionExists("GL_ARB_vertex_array_object", gGLHExts.mSysExts);
|
||||
mHasSync = ExtensionExists("GL_ARB_sync", gGLHExts.mSysExts);
|
||||
mHasMapBufferRange = ExtensionExists("GL_ARB_map_buffer_range", gGLHExts.mSysExts);
|
||||
mHasFlushBufferRange = ExtensionExists("GL_APPLE_flush_buffer_range", gGLHExts.mSysExts);
|
||||
mHasDepthClamp = ExtensionExists("GL_ARB_depth_clamp", gGLHExts.mSysExts) || ExtensionExists("GL_NV_depth_clamp", gGLHExts.mSysExts);
|
||||
//mHasDepthClamp = ExtensionExists("GL_ARB_depth_clamp", gGLHExts.mSysExts) || ExtensionExists("GL_NV_depth_clamp", gGLHExts.mSysExts);
|
||||
mHasDepthClamp = FALSE;
|
||||
// mask out FBO support when packed_depth_stencil isn't there 'cause we need it for LLRenderTarget -Brad
|
||||
#ifdef GL_ARB_framebuffer_object
|
||||
mHasFramebufferObject = ExtensionExists("GL_ARB_framebuffer_object", gGLHExts.mSysExts);
|
||||
|
|
@ -964,6 +982,15 @@ void LLGLManager::initExtensions()
|
|||
ExtensionExists("GL_EXT_framebuffer_multisample", gGLHExts.mSysExts) &&
|
||||
ExtensionExists("GL_EXT_packed_depth_stencil", gGLHExts.mSysExts);
|
||||
#endif
|
||||
#ifdef GL_EXT_texture_sRGB
|
||||
mHassRGBTexture = ExtensionExists("GL_EXT_texture_sRGB", gGLHExts.mSysExts);
|
||||
#endif
|
||||
|
||||
#ifdef GL_ARB_framebuffer_sRGB
|
||||
mHassRGBFramebuffer = ExtensionExists("GL_ARB_framebuffer_sRGB", gGLHExts.mSysExts);
|
||||
#else
|
||||
mHassRGBFramebuffer = ExtensionExists("GL_EXT_framebuffer_sRGB", gGLHExts.mSysExts);
|
||||
#endif
|
||||
|
||||
mHasMipMapGeneration = mHasFramebufferObject || mGLVersion >= 1.4f;
|
||||
|
||||
|
|
@ -1254,6 +1281,13 @@ void LLGLManager::initExtensions()
|
|||
glGetQueryObjectivARB = (PFNGLGETQUERYOBJECTIVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glGetQueryObjectivARB");
|
||||
glGetQueryObjectuivARB = (PFNGLGETQUERYOBJECTUIVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glGetQueryObjectuivARB");
|
||||
}
|
||||
if (mHasTimerQuery)
|
||||
{
|
||||
llinfos << "initExtensions() TimerQuery-related procs..." << llendl;
|
||||
glQueryCounter = (PFNGLQUERYCOUNTERPROC) GLH_EXT_GET_PROC_ADDRESS("glQueryCounter");
|
||||
glGetQueryObjecti64v = (PFNGLGETQUERYOBJECTI64VPROC) GLH_EXT_GET_PROC_ADDRESS("glGetQueryObjecti64v");
|
||||
glGetQueryObjectui64v = (PFNGLGETQUERYOBJECTUI64VPROC) GLH_EXT_GET_PROC_ADDRESS("glGetQueryObjectui64v");
|
||||
}
|
||||
if (mHasPointParameters)
|
||||
{
|
||||
llinfos << "initExtensions() PointParameters-related procs..." << llendl;
|
||||
|
|
|
|||
|
|
@ -98,6 +98,7 @@ public:
|
|||
BOOL mHasFragmentShader;
|
||||
S32 mNumTextureImageUnits;
|
||||
BOOL mHasOcclusionQuery;
|
||||
BOOL mHasTimerQuery;
|
||||
BOOL mHasOcclusionQuery2;
|
||||
BOOL mHasPointParameters;
|
||||
BOOL mHasDrawBuffers;
|
||||
|
|
@ -115,6 +116,8 @@ public:
|
|||
BOOL mHasARBEnvCombine;
|
||||
BOOL mHasCubeMap;
|
||||
BOOL mHasDebugOutput;
|
||||
BOOL mHassRGBTexture;
|
||||
BOOL mHassRGBFramebuffer;
|
||||
|
||||
// Vendor-specific extensions
|
||||
BOOL mIsATI;
|
||||
|
|
@ -126,6 +129,11 @@ public:
|
|||
BOOL mATIOffsetVerticalLines;
|
||||
BOOL mATIOldDriver;
|
||||
|
||||
#if LL_DARWIN
|
||||
// Needed to distinguish problem cards on older Macs that break with Materials
|
||||
BOOL mIsMobileGF;
|
||||
#endif
|
||||
|
||||
// Whether this version of GL is good enough for SL to use
|
||||
BOOL mHasRequirements;
|
||||
|
||||
|
|
|
|||
|
|
@ -116,6 +116,11 @@ extern PFNGLGETQUERYIVARBPROC glGetQueryivARB;
|
|||
extern PFNGLGETQUERYOBJECTIVARBPROC glGetQueryObjectivARB;
|
||||
extern PFNGLGETQUERYOBJECTUIVARBPROC glGetQueryObjectuivARB;
|
||||
|
||||
// GL_ARB_timer_query
|
||||
extern PFNGLQUERYCOUNTERPROC glQueryCounter;
|
||||
extern PFNGLGETQUERYOBJECTI64VPROC glGetQueryObjecti64v;
|
||||
extern PFNGLGETQUERYOBJECTUI64VPROC glGetQueryObjectui64v;
|
||||
|
||||
// GL_ARB_point_parameters
|
||||
extern PFNGLPOINTPARAMETERFARBPROC glPointParameterfARB;
|
||||
extern PFNGLPOINTPARAMETERFVARBPROC glPointParameterfvARB;
|
||||
|
|
@ -378,6 +383,11 @@ extern PFNGLGETQUERYIVARBPROC glGetQueryivARB;
|
|||
extern PFNGLGETQUERYOBJECTIVARBPROC glGetQueryObjectivARB;
|
||||
extern PFNGLGETQUERYOBJECTUIVARBPROC glGetQueryObjectuivARB;
|
||||
|
||||
// GL_ARB_timer_query
|
||||
extern PFNGLQUERYCOUNTERPROC glQueryCounter;
|
||||
extern PFNGLGETQUERYOBJECTI64VPROC glGetQueryObjecti64v;
|
||||
extern PFNGLGETQUERYOBJECTUI64VPROC glGetQueryObjectui64v;
|
||||
|
||||
// GL_ARB_point_parameters
|
||||
extern PFNGLPOINTPARAMETERFARBPROC glPointParameterfARB;
|
||||
extern PFNGLPOINTPARAMETERFVARBPROC glPointParameterfvARB;
|
||||
|
|
@ -619,6 +629,12 @@ extern PFNGLGETQUERYIVARBPROC glGetQueryivARB;
|
|||
extern PFNGLGETQUERYOBJECTIVARBPROC glGetQueryObjectivARB;
|
||||
extern PFNGLGETQUERYOBJECTUIVARBPROC glGetQueryObjectuivARB;
|
||||
|
||||
// GL_ARB_timer_query
|
||||
extern PFNGLQUERYCOUNTERPROC glQueryCounter;
|
||||
extern PFNGLGETQUERYOBJECTI64VPROC glGetQueryObjecti64v;
|
||||
extern PFNGLGETQUERYOBJECTUI64VPROC glGetQueryObjectui64v;
|
||||
|
||||
|
||||
// GL_ARB_point_parameters
|
||||
extern PFNGLPOINTPARAMETERFARBPROC glPointParameterfARB;
|
||||
extern PFNGLPOINTPARAMETERFVARBPROC glPointParameterfvARB;
|
||||
|
|
|
|||
|
|
@ -53,6 +53,12 @@ GLhandleARB LLGLSLShader::sCurBoundShader = 0;
|
|||
LLGLSLShader* LLGLSLShader::sCurBoundShaderPtr = NULL;
|
||||
S32 LLGLSLShader::sIndexedTextureChannels = 0;
|
||||
bool LLGLSLShader::sNoFixedFunction = false;
|
||||
bool LLGLSLShader::sProfileEnabled = false;
|
||||
std::set<LLGLSLShader*> LLGLSLShader::sInstances;
|
||||
U64 LLGLSLShader::sTotalTimeElapsed = 0;
|
||||
U32 LLGLSLShader::sTotalTrianglesDrawn = 0;
|
||||
U64 LLGLSLShader::sTotalSamplesDrawn = 0;
|
||||
U32 LLGLSLShader::sTotalDrawCalls = 0;
|
||||
|
||||
//UI shader -- declared here so llui_libtest will link properly
|
||||
LLGLSLShader gUIProgram;
|
||||
|
|
@ -87,19 +93,240 @@ LLShaderFeatures::LLShaderFeatures()
|
|||
//===============================
|
||||
// LLGLSL Shader implementation
|
||||
//===============================
|
||||
LLGLSLShader::LLGLSLShader()
|
||||
: mProgramObject(0), mActiveTextureChannels(0), mShaderLevel(0), mShaderGroup(SG_DEFAULT), mUniformsDirty(FALSE)
|
||||
{
|
||||
|
||||
//static
|
||||
void LLGLSLShader::initProfile()
|
||||
{
|
||||
sProfileEnabled = true;
|
||||
sTotalTimeElapsed = 0;
|
||||
sTotalTrianglesDrawn = 0;
|
||||
sTotalSamplesDrawn = 0;
|
||||
sTotalDrawCalls = 0;
|
||||
|
||||
for (std::set<LLGLSLShader*>::iterator iter = sInstances.begin(); iter != sInstances.end(); ++iter)
|
||||
{
|
||||
(*iter)->clearStats();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
struct LLGLSLShaderCompareTimeElapsed
|
||||
{
|
||||
bool operator()(const LLGLSLShader* const& lhs, const LLGLSLShader* const& rhs)
|
||||
{
|
||||
return lhs->mTimeElapsed < rhs->mTimeElapsed;
|
||||
}
|
||||
};
|
||||
|
||||
//static
|
||||
void LLGLSLShader::finishProfile()
|
||||
{
|
||||
sProfileEnabled = false;
|
||||
|
||||
std::vector<LLGLSLShader*> sorted;
|
||||
|
||||
for (std::set<LLGLSLShader*>::iterator iter = sInstances.begin(); iter != sInstances.end(); ++iter)
|
||||
{
|
||||
sorted.push_back(*iter);
|
||||
}
|
||||
|
||||
std::sort(sorted.begin(), sorted.end(), LLGLSLShaderCompareTimeElapsed());
|
||||
|
||||
for (std::vector<LLGLSLShader*>::iterator iter = sorted.begin(); iter != sorted.end(); ++iter)
|
||||
{
|
||||
(*iter)->dumpStats();
|
||||
}
|
||||
|
||||
llinfos << "-----------------------------------" << llendl;
|
||||
llinfos << "Total rendering time: " << llformat("%.4f ms", sTotalTimeElapsed/1000000.f) << llendl;
|
||||
llinfos << "Total samples drawn: " << llformat("%.4f million", sTotalSamplesDrawn/1000000.f) << llendl;
|
||||
llinfos << "Total triangles drawn: " << llformat("%.3f million", sTotalTrianglesDrawn/1000000.f) << llendl;
|
||||
}
|
||||
|
||||
void LLGLSLShader::clearStats()
|
||||
{
|
||||
mTrianglesDrawn = 0;
|
||||
mTimeElapsed = 0;
|
||||
mSamplesDrawn = 0;
|
||||
mDrawCalls = 0;
|
||||
mTextureStateFetched = false;
|
||||
mTextureMagFilter.clear();
|
||||
mTextureMinFilter.clear();
|
||||
}
|
||||
|
||||
void LLGLSLShader::dumpStats()
|
||||
{
|
||||
if (mDrawCalls > 0)
|
||||
{
|
||||
llinfos << "=============================================" << llendl;
|
||||
llinfos << mName << llendl;
|
||||
for (U32 i = 0; i < mShaderFiles.size(); ++i)
|
||||
{
|
||||
llinfos << mShaderFiles[i].first << llendl;
|
||||
}
|
||||
for (U32 i = 0; i < mTexture.size(); ++i)
|
||||
{
|
||||
GLint idx = mTexture[i];
|
||||
|
||||
if (idx >= 0)
|
||||
{
|
||||
GLint uniform_idx = getUniformLocation(i);
|
||||
llinfos << mUniformNameMap[uniform_idx] << " - " << std::hex << mTextureMagFilter[i] << "/" << mTextureMinFilter[i] << std::dec << llendl;
|
||||
}
|
||||
}
|
||||
llinfos << "=============================================" << llendl;
|
||||
|
||||
F32 ms = mTimeElapsed/1000000.f;
|
||||
F32 seconds = ms/1000.f;
|
||||
|
||||
F32 pct_tris = (F32) mTrianglesDrawn/(F32)sTotalTrianglesDrawn*100.f;
|
||||
F32 tris_sec = (F32) (mTrianglesDrawn/1000000.0);
|
||||
tris_sec /= seconds;
|
||||
|
||||
F32 pct_samples = (F32) ((F64)mSamplesDrawn/(F64)sTotalSamplesDrawn)*100.f;
|
||||
F32 samples_sec = (F32) mSamplesDrawn/1000000000.0;
|
||||
samples_sec /= seconds;
|
||||
|
||||
F32 pct_calls = (F32) mDrawCalls/(F32)sTotalDrawCalls*100.f;
|
||||
U32 avg_batch = mTrianglesDrawn/mDrawCalls;
|
||||
|
||||
llinfos << "Triangles Drawn: " << mTrianglesDrawn << " " << llformat("(%.2f pct of total, %.3f million/sec)", pct_tris, tris_sec ) << llendl;
|
||||
llinfos << "Draw Calls: " << mDrawCalls << " " << llformat("(%.2f pct of total, avg %d tris/call)", pct_calls, avg_batch) << llendl;
|
||||
llinfos << "SamplesDrawn: " << mSamplesDrawn << " " << llformat("(%.2f pct of total, %.3f billion/sec)", pct_samples, samples_sec) << llendl;
|
||||
llinfos << "Time Elapsed: " << mTimeElapsed << " " << llformat("(%.2f pct of total, %.5f ms)\n", (F32) ((F64)mTimeElapsed/(F64)sTotalTimeElapsed)*100.f, ms) << llendl;
|
||||
}
|
||||
}
|
||||
|
||||
//static
|
||||
void LLGLSLShader::startProfile()
|
||||
{
|
||||
if (sProfileEnabled && sCurBoundShaderPtr)
|
||||
{
|
||||
sCurBoundShaderPtr->placeProfileQuery();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
//static
|
||||
void LLGLSLShader::stopProfile(U32 count, U32 mode)
|
||||
{
|
||||
if (sProfileEnabled)
|
||||
{
|
||||
sCurBoundShaderPtr->readProfileQuery(count, mode);
|
||||
}
|
||||
}
|
||||
|
||||
void LLGLSLShader::placeProfileQuery()
|
||||
{
|
||||
#if !LL_DARWIN
|
||||
if (mTimerQuery == 0)
|
||||
{
|
||||
glGenQueriesARB(1, &mTimerQuery);
|
||||
}
|
||||
|
||||
if (!mTextureStateFetched)
|
||||
{
|
||||
mTextureStateFetched = true;
|
||||
mTextureMagFilter.resize(mTexture.size());
|
||||
mTextureMinFilter.resize(mTexture.size());
|
||||
|
||||
U32 cur_active = gGL.getCurrentTexUnitIndex();
|
||||
|
||||
for (U32 i = 0; i < mTexture.size(); ++i)
|
||||
{
|
||||
GLint idx = mTexture[i];
|
||||
|
||||
if (idx >= 0)
|
||||
{
|
||||
gGL.getTexUnit(idx)->activate();
|
||||
|
||||
U32 mag = 0xFFFFFFFF;
|
||||
U32 min = 0xFFFFFFFF;
|
||||
|
||||
U32 type = LLTexUnit::getInternalType(gGL.getTexUnit(idx)->getCurrType());
|
||||
|
||||
glGetTexParameteriv(type, GL_TEXTURE_MAG_FILTER, (GLint*) &mag);
|
||||
glGetTexParameteriv(type, GL_TEXTURE_MIN_FILTER, (GLint*) &min);
|
||||
|
||||
mTextureMagFilter[i] = mag;
|
||||
mTextureMinFilter[i] = min;
|
||||
}
|
||||
}
|
||||
|
||||
gGL.getTexUnit(cur_active)->activate();
|
||||
}
|
||||
|
||||
|
||||
glBeginQueryARB(GL_SAMPLES_PASSED, 1);
|
||||
glBeginQueryARB(GL_TIME_ELAPSED, mTimerQuery);
|
||||
#endif
|
||||
}
|
||||
|
||||
void LLGLSLShader::readProfileQuery(U32 count, U32 mode)
|
||||
{
|
||||
#if !LL_DARWIN
|
||||
glEndQueryARB(GL_TIME_ELAPSED);
|
||||
glEndQueryARB(GL_SAMPLES_PASSED);
|
||||
|
||||
U64 time_elapsed = 0;
|
||||
glGetQueryObjectui64v(mTimerQuery, GL_QUERY_RESULT, &time_elapsed);
|
||||
|
||||
U64 samples_passed = 0;
|
||||
glGetQueryObjectui64v(1, GL_QUERY_RESULT, &samples_passed);
|
||||
|
||||
sTotalTimeElapsed += time_elapsed;
|
||||
mTimeElapsed += time_elapsed;
|
||||
|
||||
sTotalSamplesDrawn += samples_passed;
|
||||
mSamplesDrawn += samples_passed;
|
||||
|
||||
U32 tri_count = 0;
|
||||
switch (mode)
|
||||
{
|
||||
case LLRender::TRIANGLES: tri_count = count/3; break;
|
||||
case LLRender::TRIANGLE_FAN: tri_count = count-2; break;
|
||||
case LLRender::TRIANGLE_STRIP: tri_count = count-2; break;
|
||||
default: tri_count = count; break; //points lines etc just use primitive count
|
||||
}
|
||||
|
||||
mTrianglesDrawn += tri_count;
|
||||
sTotalTrianglesDrawn += tri_count;
|
||||
|
||||
sTotalDrawCalls++;
|
||||
mDrawCalls++;
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
|
||||
LLGLSLShader::LLGLSLShader()
|
||||
: mProgramObject(0),
|
||||
mAttributeMask(0),
|
||||
mTotalUniformSize(0),
|
||||
mActiveTextureChannels(0),
|
||||
mShaderLevel(0),
|
||||
mShaderGroup(SG_DEFAULT),
|
||||
mUniformsDirty(FALSE),
|
||||
mTimerQuery(0)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
LLGLSLShader::~LLGLSLShader()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void LLGLSLShader::unload()
|
||||
{
|
||||
sInstances.erase(this);
|
||||
|
||||
stop_glerror();
|
||||
mAttribute.clear();
|
||||
mTexture.clear();
|
||||
mUniform.clear();
|
||||
mShaderFiles.clear();
|
||||
mDefines.clear();
|
||||
|
||||
if (mProgramObject)
|
||||
{
|
||||
|
|
@ -133,6 +360,8 @@ BOOL LLGLSLShader::createShader(vector<string> * attributes,
|
|||
U32 varying_count,
|
||||
const char** varyings)
|
||||
{
|
||||
sInstances.insert(this);
|
||||
|
||||
//reloading, reset matrix hash values
|
||||
for (U32 i = 0; i < LLRender::NUM_MATRIX_MODES; ++i)
|
||||
{
|
||||
|
|
@ -150,7 +379,7 @@ BOOL LLGLSLShader::createShader(vector<string> * attributes,
|
|||
vector< pair<string,GLenum> >::iterator fileIter = mShaderFiles.begin();
|
||||
for ( ; fileIter != mShaderFiles.end(); fileIter++ )
|
||||
{
|
||||
GLhandleARB shaderhandle = LLShaderMgr::instance()->loadShaderFile((*fileIter).first, mShaderLevel, (*fileIter).second, mFeatures.mIndexedTextureChannels);
|
||||
GLhandleARB shaderhandle = LLShaderMgr::instance()->loadShaderFile((*fileIter).first, mShaderLevel, (*fileIter).second, &mDefines, mFeatures.mIndexedTextureChannels);
|
||||
LL_DEBUGS("ShaderLoading") << "SHADER FILE: " << (*fileIter).first << " mShaderLevel=" << mShaderLevel << LL_ENDL;
|
||||
if (shaderhandle > 0)
|
||||
{
|
||||
|
|
@ -285,6 +514,8 @@ BOOL LLGLSLShader::mapAttributes(const vector<string> * attributes)
|
|||
if (res)
|
||||
{ //read back channel locations
|
||||
|
||||
mAttributeMask = 0;
|
||||
|
||||
//read back reserved channels first
|
||||
for (U32 i = 0; i < LLShaderMgr::instance()->mReservedAttribs.size(); i++)
|
||||
{
|
||||
|
|
@ -293,6 +524,7 @@ BOOL LLGLSLShader::mapAttributes(const vector<string> * attributes)
|
|||
if (index != -1)
|
||||
{
|
||||
mAttribute[i] = index;
|
||||
mAttributeMask |= 1 << i;
|
||||
LL_DEBUGS("ShaderLoading") << "Attribute " << name << " assigned to channel " << index << LL_ENDL;
|
||||
}
|
||||
}
|
||||
|
|
@ -325,11 +557,56 @@ void LLGLSLShader::mapUniform(GLint index, const vector<string> * uniforms)
|
|||
|
||||
GLenum type;
|
||||
GLsizei length;
|
||||
GLint size;
|
||||
GLint size = -1;
|
||||
char name[1024]; /* Flawfinder: ignore */
|
||||
name[0] = 0;
|
||||
|
||||
|
||||
glGetActiveUniformARB(mProgramObject, index, 1024, &length, &size, &type, (GLcharARB *)name);
|
||||
#if !LL_DARWIN
|
||||
if (size > 0)
|
||||
{
|
||||
switch(type)
|
||||
{
|
||||
case GL_FLOAT_VEC2: size *= 2; break;
|
||||
case GL_FLOAT_VEC3: size *= 3; break;
|
||||
case GL_FLOAT_VEC4: size *= 4; break;
|
||||
case GL_DOUBLE: size *= 2; break;
|
||||
case GL_DOUBLE_VEC2: size *= 2; break;
|
||||
case GL_DOUBLE_VEC3: size *= 6; break;
|
||||
case GL_DOUBLE_VEC4: size *= 8; break;
|
||||
case GL_INT_VEC2: size *= 2; break;
|
||||
case GL_INT_VEC3: size *= 3; break;
|
||||
case GL_INT_VEC4: size *= 4; break;
|
||||
case GL_UNSIGNED_INT_VEC2: size *= 2; break;
|
||||
case GL_UNSIGNED_INT_VEC3: size *= 3; break;
|
||||
case GL_UNSIGNED_INT_VEC4: size *= 4; break;
|
||||
case GL_BOOL_VEC2: size *= 2; break;
|
||||
case GL_BOOL_VEC3: size *= 3; break;
|
||||
case GL_BOOL_VEC4: size *= 4; break;
|
||||
case GL_FLOAT_MAT2: size *= 4; break;
|
||||
case GL_FLOAT_MAT3: size *= 9; break;
|
||||
case GL_FLOAT_MAT4: size *= 16; break;
|
||||
case GL_FLOAT_MAT2x3: size *= 6; break;
|
||||
case GL_FLOAT_MAT2x4: size *= 8; break;
|
||||
case GL_FLOAT_MAT3x2: size *= 6; break;
|
||||
case GL_FLOAT_MAT3x4: size *= 12; break;
|
||||
case GL_FLOAT_MAT4x2: size *= 8; break;
|
||||
case GL_FLOAT_MAT4x3: size *= 12; break;
|
||||
case GL_DOUBLE_MAT2: size *= 8; break;
|
||||
case GL_DOUBLE_MAT3: size *= 18; break;
|
||||
case GL_DOUBLE_MAT4: size *= 32; break;
|
||||
case GL_DOUBLE_MAT2x3: size *= 12; break;
|
||||
case GL_DOUBLE_MAT2x4: size *= 16; break;
|
||||
case GL_DOUBLE_MAT3x2: size *= 12; break;
|
||||
case GL_DOUBLE_MAT3x4: size *= 24; break;
|
||||
case GL_DOUBLE_MAT4x2: size *= 16; break;
|
||||
case GL_DOUBLE_MAT4x3: size *= 24; break;
|
||||
}
|
||||
mTotalUniformSize += size;
|
||||
}
|
||||
#endif
|
||||
|
||||
S32 location = glGetUniformLocationARB(mProgramObject, name);
|
||||
if (location != -1)
|
||||
{
|
||||
|
|
@ -342,6 +619,7 @@ void LLGLSLShader::mapUniform(GLint index, const vector<string> * uniforms)
|
|||
}
|
||||
|
||||
mUniformMap[name] = location;
|
||||
mUniformNameMap[location] = name;
|
||||
LL_DEBUGS("ShaderLoading") << "Uniform " << name << " is at location " << location << LL_ENDL;
|
||||
|
||||
//find the index of this uniform
|
||||
|
|
@ -372,11 +650,21 @@ void LLGLSLShader::mapUniform(GLint index, const vector<string> * uniforms)
|
|||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void LLGLSLShader::addPermutation(std::string name, std::string value)
|
||||
{
|
||||
mDefines[name] = value;
|
||||
}
|
||||
|
||||
void LLGLSLShader::removePermutation(std::string name)
|
||||
{
|
||||
mDefines[name].erase();
|
||||
}
|
||||
|
||||
GLint LLGLSLShader::mapUniformTextureChannel(GLint location, GLenum type)
|
||||
{
|
||||
if (type >= GL_SAMPLER_1D_ARB && type <= GL_SAMPLER_2D_RECT_SHADOW_ARB ||
|
||||
if ((type >= GL_SAMPLER_1D_ARB && type <= GL_SAMPLER_2D_RECT_SHADOW_ARB) ||
|
||||
type == GL_SAMPLER_2D_MULTISAMPLE)
|
||||
{ //this here is a texture
|
||||
glUniform1iARB(location, mActiveTextureChannels);
|
||||
|
|
@ -390,9 +678,11 @@ BOOL LLGLSLShader::mapUniforms(const vector<string> * uniforms)
|
|||
{
|
||||
BOOL res = TRUE;
|
||||
|
||||
mTotalUniformSize = 0;
|
||||
mActiveTextureChannels = 0;
|
||||
mUniform.clear();
|
||||
mUniformMap.clear();
|
||||
mUniformNameMap.clear();
|
||||
mTexture.clear();
|
||||
mValue.clear();
|
||||
//initialize arrays
|
||||
|
|
@ -413,6 +703,7 @@ BOOL LLGLSLShader::mapUniforms(const vector<string> * uniforms)
|
|||
|
||||
unbind();
|
||||
|
||||
LL_DEBUGS("ShaderLoading") << "Total Uniform Size: " << mTotalUniformSize << llendl;
|
||||
return res;
|
||||
}
|
||||
|
||||
|
|
@ -471,6 +762,58 @@ void LLGLSLShader::bindNoShader(void)
|
|||
}
|
||||
}
|
||||
|
||||
S32 LLGLSLShader::bindTexture(const std::string &uniform, LLTexture *texture, LLTexUnit::eTextureType mode)
|
||||
{
|
||||
S32 channel = 0;
|
||||
channel = getUniformLocation(uniform);
|
||||
|
||||
return bindTexture(channel, texture, mode);
|
||||
}
|
||||
|
||||
S32 LLGLSLShader::bindTexture(S32 uniform, LLTexture *texture, LLTexUnit::eTextureType mode)
|
||||
{
|
||||
if (uniform < 0 || uniform >= (S32)mTexture.size())
|
||||
{
|
||||
UNIFORM_ERRS << "Uniform out of range: " << uniform << LL_ENDL;
|
||||
return -1;
|
||||
}
|
||||
|
||||
uniform = mTexture[uniform];
|
||||
|
||||
if (uniform > -1)
|
||||
{
|
||||
gGL.getTexUnit(uniform)->bind(texture, mode);
|
||||
}
|
||||
|
||||
return uniform;
|
||||
}
|
||||
|
||||
S32 LLGLSLShader::unbindTexture(const std::string &uniform, LLTexUnit::eTextureType mode)
|
||||
{
|
||||
S32 channel = 0;
|
||||
channel = getUniformLocation(uniform);
|
||||
|
||||
return unbindTexture(channel);
|
||||
}
|
||||
|
||||
S32 LLGLSLShader::unbindTexture(S32 uniform, LLTexUnit::eTextureType mode)
|
||||
{
|
||||
if (uniform < 0 || uniform >= (S32)mTexture.size())
|
||||
{
|
||||
UNIFORM_ERRS << "Uniform out of range: " << uniform << LL_ENDL;
|
||||
return -1;
|
||||
}
|
||||
|
||||
uniform = mTexture[uniform];
|
||||
|
||||
if (uniform > -1)
|
||||
{
|
||||
gGL.getTexUnit(uniform)->unbind(mode);
|
||||
}
|
||||
|
||||
return uniform;
|
||||
}
|
||||
|
||||
S32 LLGLSLShader::enableTexture(S32 uniform, LLTexUnit::eTextureType mode)
|
||||
{
|
||||
if (uniform < 0 || uniform >= (S32)mTexture.size())
|
||||
|
|
@ -857,6 +1200,23 @@ void LLGLSLShader::uniform1i(const string& uniform, GLint v)
|
|||
}
|
||||
}
|
||||
|
||||
void LLGLSLShader::uniform2i(const string& uniform, GLint i, GLint j)
|
||||
{
|
||||
GLint location = getUniformLocation(uniform);
|
||||
|
||||
if (location >= 0)
|
||||
{
|
||||
std::map<GLint, LLVector4>::iterator iter = mValue.find(location);
|
||||
LLVector4 vec(i,j,0.f,0.f);
|
||||
if (iter == mValue.end() || shouldChange(iter->second,vec))
|
||||
{
|
||||
glUniform2iARB(location, i, j);
|
||||
mValue[location] = vec;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void LLGLSLShader::uniform1f(const string& uniform, GLfloat v)
|
||||
{
|
||||
GLint location = getUniformLocation(uniform);
|
||||
|
|
|
|||
|
|
@ -67,14 +67,29 @@ public:
|
|||
SG_WATER
|
||||
};
|
||||
|
||||
static std::set<LLGLSLShader*> sInstances;
|
||||
static bool sProfileEnabled;
|
||||
|
||||
LLGLSLShader();
|
||||
~LLGLSLShader();
|
||||
|
||||
static GLhandleARB sCurBoundShader;
|
||||
static LLGLSLShader* sCurBoundShaderPtr;
|
||||
static S32 sIndexedTextureChannels;
|
||||
static bool sNoFixedFunction;
|
||||
|
||||
static void initProfile();
|
||||
static void finishProfile();
|
||||
|
||||
static void startProfile();
|
||||
static void stopProfile(U32 count, U32 mode);
|
||||
|
||||
void unload();
|
||||
void clearStats();
|
||||
void dumpStats();
|
||||
void placeProfileQuery();
|
||||
void readProfileQuery(U32 count, U32 mode);
|
||||
|
||||
BOOL createShader(std::vector<std::string> * attributes,
|
||||
std::vector<std::string> * uniforms,
|
||||
U32 varying_count = 0,
|
||||
|
|
@ -96,6 +111,7 @@ public:
|
|||
void uniform3fv(U32 index, U32 count, const GLfloat* v);
|
||||
void uniform4fv(U32 index, U32 count, const GLfloat* v);
|
||||
void uniform1i(const std::string& uniform, GLint i);
|
||||
void uniform2i(const std::string& uniform, GLint i, GLint j);
|
||||
void uniform1f(const std::string& uniform, GLfloat v);
|
||||
void uniform2f(const std::string& uniform, GLfloat x, GLfloat y);
|
||||
void uniform3f(const std::string& uniform, GLfloat x, GLfloat y, GLfloat z);
|
||||
|
|
@ -123,12 +139,22 @@ public:
|
|||
GLint getAttribLocation(U32 attrib);
|
||||
GLint mapUniformTextureChannel(GLint location, GLenum type);
|
||||
|
||||
void addPermutation(std::string name, std::string value);
|
||||
void removePermutation(std::string name);
|
||||
|
||||
//enable/disable texture channel for specified uniform
|
||||
//if given texture uniform is active in the shader,
|
||||
//the corresponding channel will be active upon return
|
||||
//returns channel texture is enabled in from [0-MAX)
|
||||
S32 enableTexture(S32 uniform, LLTexUnit::eTextureType mode = LLTexUnit::TT_TEXTURE);
|
||||
S32 disableTexture(S32 uniform, LLTexUnit::eTextureType mode = LLTexUnit::TT_TEXTURE);
|
||||
S32 disableTexture(S32 uniform, LLTexUnit::eTextureType mode = LLTexUnit::TT_TEXTURE);
|
||||
|
||||
// bindTexture returns the texture unit we've bound the texture to.
|
||||
// You can reuse the return value to unbind a texture when required.
|
||||
S32 bindTexture(const std::string& uniform, LLTexture *texture, LLTexUnit::eTextureType mode = LLTexUnit::TT_TEXTURE);
|
||||
S32 bindTexture(S32 uniform, LLTexture *texture, LLTexUnit::eTextureType mode = LLTexUnit::TT_TEXTURE);
|
||||
S32 unbindTexture(const std::string& uniform, LLTexUnit::eTextureType mode = LLTexUnit::TT_TEXTURE);
|
||||
S32 unbindTexture(S32 uniform, LLTexUnit::eTextureType mode = LLTexUnit::TT_TEXTURE);
|
||||
|
||||
BOOL link(BOOL suppress_errors = FALSE);
|
||||
void bind();
|
||||
|
|
@ -142,10 +168,13 @@ public:
|
|||
|
||||
GLhandleARB mProgramObject;
|
||||
std::vector<GLint> mAttribute; //lookup table of attribute enum to attribute channel
|
||||
U32 mAttributeMask; //mask of which reserved attributes are set (lines up with LLVertexBuffer::getTypeMask())
|
||||
std::vector<GLint> mUniform; //lookup table of uniform enum to uniform location
|
||||
std::map<std::string, GLint> mUniformMap; //lookup map of uniform name to uniform location
|
||||
std::map<GLint, std::string> mUniformNameMap; //lookup map of uniform location to uniform name
|
||||
std::map<GLint, LLVector4> mValue; //lookup map of uniform location to last known value
|
||||
std::vector<GLint> mTexture;
|
||||
S32 mTotalUniformSize;
|
||||
S32 mActiveTextureChannels;
|
||||
S32 mShaderLevel;
|
||||
S32 mShaderGroup;
|
||||
|
|
@ -153,6 +182,23 @@ public:
|
|||
LLShaderFeatures mFeatures;
|
||||
std::vector< std::pair< std::string, GLenum > > mShaderFiles;
|
||||
std::string mName;
|
||||
boost::unordered_map<std::string, std::string> mDefines;
|
||||
|
||||
//statistcis for profiling shader performance
|
||||
U32 mTimerQuery;
|
||||
U64 mTimeElapsed;
|
||||
static U64 sTotalTimeElapsed;
|
||||
U32 mTrianglesDrawn;
|
||||
static U32 sTotalTrianglesDrawn;
|
||||
U64 mSamplesDrawn;
|
||||
static U64 sTotalSamplesDrawn;
|
||||
U32 mDrawCalls;
|
||||
static U32 sTotalDrawCalls;
|
||||
|
||||
bool mTextureStateFetched;
|
||||
std::vector<U32> mTextureMagFilter;
|
||||
std::vector<U32> mTextureMinFilter;
|
||||
|
||||
};
|
||||
|
||||
//UI shader (declared here so llui_libtest will link properly)
|
||||
|
|
|
|||
|
|
@ -748,12 +748,16 @@ void LLImageGL::setImage(const U8* data_in, BOOL data_hasmips)
|
|||
S32 height = getHeight(mCurrentDiscardLevel);
|
||||
S32 nummips = mMaxDiscardLevel - mCurrentDiscardLevel + 1;
|
||||
S32 w = width, h = height;
|
||||
|
||||
|
||||
const U8* new_data = 0;
|
||||
(void)new_data;
|
||||
|
||||
const U8* prev_mip_data = 0;
|
||||
const U8* cur_mip_data = 0;
|
||||
#ifdef SHOW_ASSERT
|
||||
S32 cur_mip_size = 0;
|
||||
#endif
|
||||
|
||||
mMipLevels = nummips;
|
||||
|
||||
for (int m=0; m<nummips; m++)
|
||||
|
|
@ -773,14 +777,22 @@ void LLImageGL::setImage(const U8* data_in, BOOL data_hasmips)
|
|||
llassert(cur_mip_size == bytes*4);
|
||||
#endif
|
||||
U8* new_data = new U8[bytes];
|
||||
|
||||
#ifdef SHOW_ASSERT
|
||||
llassert(prev_mip_data);
|
||||
llassert(cur_mip_size == bytes*4);
|
||||
llassert_always(new_data);
|
||||
#endif
|
||||
|
||||
LLImageBase::generateMip(prev_mip_data, new_data, w, h, mComponents);
|
||||
cur_mip_data = new_data;
|
||||
#ifdef SHOW_ASSERT
|
||||
cur_mip_size = bytes;
|
||||
#endif
|
||||
|
||||
}
|
||||
llassert(w > 0 && h > 0 && cur_mip_data);
|
||||
(void)cur_mip_data;
|
||||
{
|
||||
// LLFastTimer t1(FTM_TEMP4);
|
||||
if(mFormatSwapBytes)
|
||||
|
|
@ -1119,30 +1131,30 @@ void LLImageGL::deleteTextures(LLTexUnit::eTextureType type, U32 format, S32 mip
|
|||
default:
|
||||
{
|
||||
if (type == LLTexUnit::TT_CUBE_MAP || mip_levels == -1)
|
||||
{ //unknown internal format or unknown number of mip levels, not safe to reuse
|
||||
glDeleteTextures(numTextures, textures);
|
||||
}
|
||||
else
|
||||
{
|
||||
for (S32 i = 0; i < numTextures; ++i)
|
||||
{ //remove texture from VRAM by setting its size to zero
|
||||
{ //unknown internal format or unknown number of mip levels, not safe to reuse
|
||||
glDeleteTextures(numTextures, textures);
|
||||
}
|
||||
else
|
||||
{
|
||||
for (S32 i = 0; i < numTextures; ++i)
|
||||
{ //remove texture from VRAM by setting its size to zero
|
||||
|
||||
for (S32 j = 0; j <= mip_levels; j++)
|
||||
{
|
||||
gGL.getTexUnit(0)->bindManual(type, textures[i]);
|
||||
for (S32 j = 0; j <= mip_levels; j++)
|
||||
{
|
||||
gGL.getTexUnit(0)->bindManual(type, textures[i]);
|
||||
U32 internal_type = LLTexUnit::getInternalType(type);
|
||||
glTexImage2D(internal_type, j, format, 0, 0, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
|
||||
stop_glerror();
|
||||
}
|
||||
}
|
||||
|
||||
llassert(std::find(sDeadTextureList[type][format].begin(),
|
||||
sDeadTextureList[type][format].end(), textures[i]) ==
|
||||
sDeadTextureList[type][format].end());
|
||||
llassert(std::find(sDeadTextureList[type][format].begin(),
|
||||
sDeadTextureList[type][format].end(), textures[i]) ==
|
||||
sDeadTextureList[type][format].end());
|
||||
|
||||
sDeadTextureList[type][format].push_back(textures[i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
sDeadTextureList[type][format].push_back(textures[i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -262,6 +262,14 @@ class LLRender
|
|||
friend class LLTexUnit;
|
||||
public:
|
||||
|
||||
enum eTexIndex
|
||||
{
|
||||
DIFFUSE_MAP = 0,
|
||||
NORMAL_MAP,
|
||||
SPECULAR_MAP,
|
||||
NUM_TEXTURE_CHANNELS,
|
||||
};
|
||||
|
||||
typedef enum {
|
||||
TRIANGLES = 0,
|
||||
TRIANGLE_STRIP,
|
||||
|
|
|
|||
|
|
@ -53,11 +53,19 @@ void check_framebuffer_status()
|
|||
bool LLRenderTarget::sUseFBO = false;
|
||||
U32 LLRenderTarget::sCurFBO = 0;
|
||||
|
||||
|
||||
extern S32 gGLViewport[4];
|
||||
|
||||
U32 LLRenderTarget::sCurResX = 0;
|
||||
U32 LLRenderTarget::sCurResY = 0;
|
||||
|
||||
LLRenderTarget::LLRenderTarget() :
|
||||
mResX(0),
|
||||
mResY(0),
|
||||
mFBO(0),
|
||||
mPreviousFBO(0),
|
||||
mPreviousResX(0),
|
||||
mPreviousResY(0),
|
||||
mDepth(0),
|
||||
mStencil(0),
|
||||
mUseDepth(false),
|
||||
|
|
@ -390,13 +398,12 @@ void LLRenderTarget::bindTarget()
|
|||
{
|
||||
if (mFBO)
|
||||
{
|
||||
mPreviousFBO = sCurFBO;
|
||||
|
||||
stop_glerror();
|
||||
|
||||
mPreviousFBO = sCurFBO;
|
||||
glBindFramebuffer(GL_FRAMEBUFFER, mFBO);
|
||||
sCurFBO = mFBO;
|
||||
|
||||
|
||||
stop_glerror();
|
||||
if (gGLManager.mHasDrawBuffers)
|
||||
{ //setup multiple render targets
|
||||
|
|
@ -418,7 +425,12 @@ void LLRenderTarget::bindTarget()
|
|||
stop_glerror();
|
||||
}
|
||||
|
||||
mPreviousResX = sCurResX;
|
||||
mPreviousResY = sCurResY;
|
||||
glViewport(0, 0, mResX, mResY);
|
||||
sCurResX = mResX;
|
||||
sCurResY = mResY;
|
||||
|
||||
sBoundTarget = this;
|
||||
}
|
||||
|
||||
|
|
@ -489,6 +501,20 @@ void LLRenderTarget::flush(bool fetch_depth)
|
|||
stop_glerror();
|
||||
glBindFramebuffer(GL_FRAMEBUFFER, mPreviousFBO);
|
||||
sCurFBO = mPreviousFBO;
|
||||
|
||||
if (mPreviousFBO)
|
||||
{
|
||||
glViewport(0, 0, mPreviousResX, mPreviousResY);
|
||||
sCurResX = mPreviousResX;
|
||||
sCurResY = mPreviousResY;
|
||||
}
|
||||
else
|
||||
{
|
||||
glViewport(gGLViewport[0],gGLViewport[1],gGLViewport[2],gGLViewport[3]);
|
||||
sCurResX = gGLViewport[2];
|
||||
sCurResY = gGLViewport[3];
|
||||
}
|
||||
|
||||
stop_glerror();
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -63,6 +63,9 @@ public:
|
|||
static bool sUseFBO;
|
||||
static U32 sBytesAllocated;
|
||||
static U32 sCurFBO;
|
||||
static U32 sCurResX;
|
||||
static U32 sCurResY;
|
||||
|
||||
|
||||
LLRenderTarget();
|
||||
~LLRenderTarget();
|
||||
|
|
@ -146,6 +149,9 @@ protected:
|
|||
std::vector<U32> mInternalFormat;
|
||||
U32 mFBO;
|
||||
U32 mPreviousFBO;
|
||||
U32 mPreviousResX;
|
||||
U32 mPreviousResY;
|
||||
|
||||
U32 mDepth;
|
||||
bool mStencil;
|
||||
bool mUseDepth;
|
||||
|
|
|
|||
|
|
@ -521,7 +521,7 @@ void LLShaderMgr::dumpObjectLog(GLhandleARB ret, BOOL warns)
|
|||
}
|
||||
}
|
||||
|
||||
GLhandleARB LLShaderMgr::loadShaderFile(const std::string& filename, S32 & shader_level, GLenum type, S32 texture_index_channels)
|
||||
GLhandleARB LLShaderMgr::loadShaderFile(const std::string& filename, S32 & shader_level, GLenum type, boost::unordered_map<std::string, std::string>* defines, S32 texture_index_channels)
|
||||
{
|
||||
GLenum error = GL_NO_ERROR;
|
||||
if (gDebugGL)
|
||||
|
|
@ -650,13 +650,15 @@ GLhandleARB LLShaderMgr::loadShaderFile(const std::string& filename, S32 & shade
|
|||
text[count++] = strdup("#define shadow2DRect(a,b) vec2(texture(a,b))\n");
|
||||
}
|
||||
}
|
||||
|
||||
//copy preprocessor definitions into buffer
|
||||
for (std::map<std::string,std::string>::iterator iter = mDefinitions.begin(); iter != mDefinitions.end(); ++iter)
|
||||
|
||||
if (defines)
|
||||
{
|
||||
for (boost::unordered_map<std::string,std::string>::iterator iter = defines->begin(); iter != defines->end(); ++iter)
|
||||
{
|
||||
std::string define = "#define " + iter->first + " " + iter->second + "\n";
|
||||
text[count++] = (GLcharARB *) strdup(define.c_str());
|
||||
}
|
||||
}
|
||||
|
||||
if (texture_index_channels > 0 && type == GL_FRAGMENT_SHADER_ARB)
|
||||
{
|
||||
|
|
@ -693,6 +695,8 @@ GLhandleARB LLShaderMgr::loadShaderFile(const std::string& filename, S32 & shade
|
|||
}
|
||||
*/
|
||||
|
||||
text[count++] = strdup("#define HAS_DIFFUSE_LOOKUP 1\n");
|
||||
|
||||
//uniform declartion
|
||||
for (S32 i = 0; i < texture_index_channels; ++i)
|
||||
{
|
||||
|
|
@ -750,6 +754,10 @@ GLhandleARB LLShaderMgr::loadShaderFile(const std::string& filename, S32 & shade
|
|||
llerrs << "Indexed texture rendering requires GLSL 1.30 or later." << llendl;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
text[count++] = strdup("#define HAS_DIFFUSE_LOOKUP 0\n");
|
||||
}
|
||||
|
||||
//copy file into memory
|
||||
while( fgets((char *)buff, 1024, file) != NULL && count < LL_ARRAY_SIZE(text) )
|
||||
|
|
@ -806,7 +814,6 @@ GLhandleARB LLShaderMgr::loadShaderFile(const std::string& filename, S32 & shade
|
|||
//an error occured, print log
|
||||
LL_WARNS("ShaderLoading") << "GLSL Compilation Error: (" << error << ") in " << filename << LL_ENDL;
|
||||
dumpObjectLog(ret);
|
||||
|
||||
#if LL_WINDOWS
|
||||
std::stringstream ostr;
|
||||
//dump shader source for debugging
|
||||
|
|
@ -824,8 +831,20 @@ GLhandleARB LLShaderMgr::loadShaderFile(const std::string& filename, S32 & shade
|
|||
}
|
||||
|
||||
LL_WARNS("ShaderLoading") << "\n" << ostr.str() << llendl;
|
||||
#endif // LL_WINDOWS
|
||||
|
||||
#else
|
||||
std::string str;
|
||||
|
||||
for (GLuint i = 0; i < count; i++) {
|
||||
str.append(text[i]);
|
||||
|
||||
if (i % 128 == 0)
|
||||
{
|
||||
LL_WARNS("ShaderLoading") << str << llendl;
|
||||
str = "";
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
ret = 0;
|
||||
}
|
||||
}
|
||||
|
|
@ -854,7 +873,7 @@ GLhandleARB LLShaderMgr::loadShaderFile(const std::string& filename, S32 & shade
|
|||
if (shader_level > 1)
|
||||
{
|
||||
shader_level--;
|
||||
return loadShaderFile(filename,shader_level,type,texture_index_channels);
|
||||
return loadShaderFile(filename,shader_level,type, defines, texture_index_channels);
|
||||
}
|
||||
LL_WARNS("ShaderLoading") << "Failed to load " << filename << LL_ENDL;
|
||||
}
|
||||
|
|
@ -958,7 +977,7 @@ void LLShaderMgr::initAttribsAndUniforms()
|
|||
mReservedAttribs.push_back("texcoord3");
|
||||
mReservedAttribs.push_back("diffuse_color");
|
||||
mReservedAttribs.push_back("emissive");
|
||||
mReservedAttribs.push_back("binormal");
|
||||
mReservedAttribs.push_back("tangent");
|
||||
mReservedAttribs.push_back("weight");
|
||||
mReservedAttribs.push_back("weight4");
|
||||
mReservedAttribs.push_back("clothing");
|
||||
|
|
@ -1055,6 +1074,7 @@ void LLShaderMgr::initAttribsAndUniforms()
|
|||
|
||||
|
||||
mReservedUniforms.push_back("minimum_alpha");
|
||||
mReservedUniforms.push_back("emissive_brightness");
|
||||
|
||||
mReservedUniforms.push_back("shadow_matrix");
|
||||
mReservedUniforms.push_back("env_mat");
|
||||
|
|
@ -1115,6 +1135,12 @@ void LLShaderMgr::initAttribsAndUniforms()
|
|||
mReservedUniforms.push_back("lightMap");
|
||||
mReservedUniforms.push_back("bloomMap");
|
||||
mReservedUniforms.push_back("projectionMap");
|
||||
|
||||
mReservedUniforms.push_back("global_gamma");
|
||||
mReservedUniforms.push_back("texture_gamma");
|
||||
|
||||
mReservedUniforms.push_back("specular_color");
|
||||
mReservedUniforms.push_back("env_intensity");
|
||||
|
||||
llassert(mReservedUniforms.size() == END_RESERVED_UNIFORMS);
|
||||
|
||||
|
|
|
|||
|
|
@ -109,6 +109,7 @@ public:
|
|||
GLOW_DELTA,
|
||||
|
||||
MINIMUM_ALPHA,
|
||||
EMISSIVE_BRIGHTNESS,
|
||||
|
||||
DEFERRED_SHADOW_MATRIX,
|
||||
DEFERRED_ENV_MAT,
|
||||
|
|
@ -164,6 +165,13 @@ public:
|
|||
DEFERRED_LIGHT,
|
||||
DEFERRED_BLOOM,
|
||||
DEFERRED_PROJECTION,
|
||||
|
||||
GLOBAL_GAMMA,
|
||||
TEXTURE_GAMMA,
|
||||
|
||||
SPECULAR_COLOR,
|
||||
ENVIRONMENT_INTENSITY,
|
||||
|
||||
END_RESERVED_UNIFORMS
|
||||
} eGLSLReservedUniforms;
|
||||
|
||||
|
|
@ -176,7 +184,7 @@ public:
|
|||
void dumpObjectLog(GLhandleARB ret, BOOL warns = TRUE);
|
||||
BOOL linkProgramObject(GLhandleARB obj, BOOL suppress_errors = FALSE);
|
||||
BOOL validateProgramObject(GLhandleARB obj);
|
||||
GLhandleARB loadShaderFile(const std::string& filename, S32 & shader_level, GLenum type, S32 texture_index_channels = -1);
|
||||
GLhandleARB loadShaderFile(const std::string& filename, S32 & shader_level, GLenum type, boost::unordered_map<std::string, std::string>* defines = NULL, S32 texture_index_channels = -1);
|
||||
|
||||
// Implemented in the application to actually point to the shader directory.
|
||||
virtual std::string getShaderDirPrefix(void) = 0; // Pure Virtual
|
||||
|
|
|
|||
|
|
@ -342,13 +342,32 @@ S32 LLVertexBuffer::sTypeSize[LLVertexBuffer::TYPE_MAX] =
|
|||
sizeof(LLVector2), // TYPE_TEXCOORD3,
|
||||
sizeof(LLColor4U), // TYPE_COLOR,
|
||||
sizeof(LLColor4U), // TYPE_EMISSIVE, only alpha is used currently
|
||||
sizeof(LLVector4), // TYPE_BINORMAL,
|
||||
sizeof(LLVector4), // TYPE_TANGENT,
|
||||
sizeof(F32), // TYPE_WEIGHT,
|
||||
sizeof(LLVector4), // TYPE_WEIGHT4,
|
||||
sizeof(LLVector4), // TYPE_CLOTHWEIGHT,
|
||||
sizeof(LLVector4), // TYPE_TEXTURE_INDEX (actually exists as position.w), no extra data, but stride is 16 bytes
|
||||
};
|
||||
|
||||
static std::string vb_type_name[] =
|
||||
{
|
||||
"TYPE_VERTEX",
|
||||
"TYPE_NORMAL",
|
||||
"TYPE_TEXCOORD0",
|
||||
"TYPE_TEXCOORD1",
|
||||
"TYPE_TEXCOORD2",
|
||||
"TYPE_TEXCOORD3",
|
||||
"TYPE_COLOR",
|
||||
"TYPE_EMISSIVE",
|
||||
"TYPE_TANGENT",
|
||||
"TYPE_WEIGHT",
|
||||
"TYPE_WEIGHT4",
|
||||
"TYPE_CLOTHWEIGHT",
|
||||
"TYPE_TEXTURE_INDEX",
|
||||
"TYPE_MAX",
|
||||
"TYPE_INDEX",
|
||||
};
|
||||
|
||||
U32 LLVertexBuffer::sGLMode[LLRender::NUM_MODES] =
|
||||
{
|
||||
GL_TRIANGLES,
|
||||
|
|
@ -523,16 +542,16 @@ void LLVertexBuffer::setupClientArrays(U32 data_mask)
|
|||
}
|
||||
}
|
||||
|
||||
if (sLastMask & MAP_BINORMAL)
|
||||
if (sLastMask & MAP_TANGENT)
|
||||
{
|
||||
if (!(data_mask & MAP_BINORMAL))
|
||||
if (!(data_mask & MAP_TANGENT))
|
||||
{
|
||||
glClientActiveTextureARB(GL_TEXTURE2_ARB);
|
||||
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
|
||||
glClientActiveTextureARB(GL_TEXTURE0_ARB);
|
||||
}
|
||||
}
|
||||
else if (data_mask & MAP_BINORMAL)
|
||||
else if (data_mask & MAP_TANGENT)
|
||||
{
|
||||
glClientActiveTextureARB(GL_TEXTURE2_ARB);
|
||||
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
|
||||
|
|
@ -593,8 +612,9 @@ void LLVertexBuffer::drawArrays(U32 mode, const std::vector<LLVector3>& pos, con
|
|||
glVertexPointer(3, GL_FLOAT, 0, pos[0].mV);
|
||||
glNormalPointer(GL_FLOAT, 0, norm[0].mV);
|
||||
}
|
||||
|
||||
LLGLSLShader::startProfile();
|
||||
glDrawArrays(sGLMode[mode], 0, count);
|
||||
LLGLSLShader::stopProfile(count, mode);
|
||||
}
|
||||
|
||||
//static
|
||||
|
|
@ -631,7 +651,9 @@ void LLVertexBuffer::drawElements(U32 mode, const LLVector4a* pos, const LLVecto
|
|||
glVertexPointer(3, GL_FLOAT, 16, pos);
|
||||
}
|
||||
|
||||
LLGLSLShader::startProfile();
|
||||
glDrawElements(sGLMode[mode], num_indices, GL_UNSIGNED_SHORT, indicesp);
|
||||
LLGLSLShader::stopProfile(num_indices, mode);
|
||||
}
|
||||
|
||||
void LLVertexBuffer::validateRange(U32 start, U32 end, U32 count, U32 indices_offset) const
|
||||
|
|
@ -731,9 +753,14 @@ void LLVertexBuffer::drawRange(U32 mode, U32 start, U32 end, U32 count, U32 indi
|
|||
U16* idx = ((U16*) getIndicesPointer())+indices_offset;
|
||||
|
||||
stop_glerror();
|
||||
LLGLSLShader::startProfile();
|
||||
glDrawRangeElements(sGLMode[mode], start, end, count, GL_UNSIGNED_SHORT,
|
||||
idx);
|
||||
LLGLSLShader::stopProfile(count, mode);
|
||||
stop_glerror();
|
||||
|
||||
|
||||
|
||||
placeFence();
|
||||
}
|
||||
|
||||
|
|
@ -777,8 +804,10 @@ void LLVertexBuffer::draw(U32 mode, U32 count, U32 indices_offset) const
|
|||
}
|
||||
|
||||
stop_glerror();
|
||||
LLGLSLShader::startProfile();
|
||||
glDrawElements(sGLMode[mode], count, GL_UNSIGNED_SHORT,
|
||||
((U16*) getIndicesPointer()) + indices_offset);
|
||||
LLGLSLShader::stopProfile(count, mode);
|
||||
stop_glerror();
|
||||
placeFence();
|
||||
}
|
||||
|
|
@ -820,9 +849,12 @@ void LLVertexBuffer::drawArrays(U32 mode, U32 first, U32 count) const
|
|||
|
||||
{
|
||||
LLFastTimer t2(FTM_GL_DRAW_ARRAYS);
|
||||
stop_glerror();
|
||||
glDrawArrays(sGLMode[mode], first, count);
|
||||
}
|
||||
stop_glerror();
|
||||
LLGLSLShader::startProfile();
|
||||
glDrawArrays(sGLMode[mode], first, count);
|
||||
LLGLSLShader::stopProfile(count, mode);
|
||||
}
|
||||
|
||||
stop_glerror();
|
||||
placeFence();
|
||||
}
|
||||
|
|
@ -1322,7 +1354,7 @@ void LLVertexBuffer::setupVertexArray()
|
|||
2, //TYPE_TEXCOORD3,
|
||||
4, //TYPE_COLOR,
|
||||
4, //TYPE_EMISSIVE,
|
||||
3, //TYPE_BINORMAL,
|
||||
4, //TYPE_TANGENT,
|
||||
1, //TYPE_WEIGHT,
|
||||
4, //TYPE_WEIGHT4,
|
||||
4, //TYPE_CLOTHWEIGHT,
|
||||
|
|
@ -1339,7 +1371,7 @@ void LLVertexBuffer::setupVertexArray()
|
|||
GL_FLOAT, //TYPE_TEXCOORD3,
|
||||
GL_UNSIGNED_BYTE, //TYPE_COLOR,
|
||||
GL_UNSIGNED_BYTE, //TYPE_EMISSIVE,
|
||||
GL_FLOAT, //TYPE_BINORMAL,
|
||||
GL_FLOAT, //TYPE_TANGENT,
|
||||
GL_FLOAT, //TYPE_WEIGHT,
|
||||
GL_FLOAT, //TYPE_WEIGHT4,
|
||||
GL_FLOAT, //TYPE_CLOTHWEIGHT,
|
||||
|
|
@ -1356,7 +1388,7 @@ void LLVertexBuffer::setupVertexArray()
|
|||
false, //TYPE_TEXCOORD3,
|
||||
false, //TYPE_COLOR,
|
||||
false, //TYPE_EMISSIVE,
|
||||
false, //TYPE_BINORMAL,
|
||||
false, //TYPE_TANGENT,
|
||||
false, //TYPE_WEIGHT,
|
||||
false, //TYPE_WEIGHT4,
|
||||
false, //TYPE_CLOTHWEIGHT,
|
||||
|
|
@ -1373,7 +1405,7 @@ void LLVertexBuffer::setupVertexArray()
|
|||
GL_FALSE, //TYPE_TEXCOORD3,
|
||||
GL_TRUE, //TYPE_COLOR,
|
||||
GL_TRUE, //TYPE_EMISSIVE,
|
||||
GL_FALSE, //TYPE_BINORMAL,
|
||||
GL_FALSE, //TYPE_TANGENT,
|
||||
GL_FALSE, //TYPE_WEIGHT,
|
||||
GL_FALSE, //TYPE_WEIGHT4,
|
||||
GL_FALSE, //TYPE_CLOTHWEIGHT,
|
||||
|
|
@ -2038,14 +2070,21 @@ bool LLVertexBuffer::getTexCoord1Strider(LLStrider<LLVector2>& strider, S32 inde
|
|||
{
|
||||
return VertexBufferStrider<LLVector2,TYPE_TEXCOORD1>::get(*this, strider, index, count, map_range);
|
||||
}
|
||||
|
||||
bool LLVertexBuffer::getTexCoord2Strider(LLStrider<LLVector2>& strider, S32 index, S32 count, bool map_range)
|
||||
{
|
||||
return VertexBufferStrider<LLVector2,TYPE_TEXCOORD2>::get(*this, strider, index, count, map_range);
|
||||
}
|
||||
bool LLVertexBuffer::getNormalStrider(LLStrider<LLVector3>& strider, S32 index, S32 count, bool map_range)
|
||||
{
|
||||
return VertexBufferStrider<LLVector3,TYPE_NORMAL>::get(*this, strider, index, count, map_range);
|
||||
}
|
||||
bool LLVertexBuffer::getBinormalStrider(LLStrider<LLVector3>& strider, S32 index, S32 count, bool map_range)
|
||||
bool LLVertexBuffer::getTangentStrider(LLStrider<LLVector3>& strider, S32 index, S32 count, bool map_range)
|
||||
{
|
||||
return VertexBufferStrider<LLVector3,TYPE_BINORMAL>::get(*this, strider, index, count, map_range);
|
||||
return VertexBufferStrider<LLVector3,TYPE_TANGENT>::get(*this, strider, index, count, map_range);
|
||||
}
|
||||
bool LLVertexBuffer::getTangentStrider(LLStrider<LLVector4a>& strider, S32 index, S32 count, bool map_range)
|
||||
{
|
||||
return VertexBufferStrider<LLVector4a,TYPE_TANGENT>::get(*this, strider, index, count, map_range);
|
||||
}
|
||||
bool LLVertexBuffer::getColorStrider(LLStrider<LLColor4U>& strider, S32 index, S32 count, bool map_range)
|
||||
{
|
||||
|
|
@ -2200,7 +2239,7 @@ void LLVertexBuffer::setBuffer(U32 data_mask)
|
|||
|
||||
if ((data_mask & required_mask) != required_mask)
|
||||
{
|
||||
llerrs << "Shader consumption mismatches data provision." << llendl;
|
||||
llwarns << "Shader consumption mismatches data provision." << llendl;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -2318,6 +2357,14 @@ void LLVertexBuffer::setupVertexBuffer(U32 data_mask)
|
|||
|
||||
if (gDebugGL && ((data_mask & mTypeMask) != data_mask))
|
||||
{
|
||||
for (U32 i = 0; i < LLVertexBuffer::TYPE_MAX; ++i)
|
||||
{
|
||||
U32 mask = 1 << i;
|
||||
if (mask & data_mask && !(mask & mTypeMask))
|
||||
{ //bit set in data_mask, but not set in mTypeMask
|
||||
llwarns << "Missing required component " << vb_type_name[i] << llendl;
|
||||
}
|
||||
}
|
||||
llerrs << "LLVertexBuffer::setupVertexBuffer missing required components for supplied data mask." << llendl;
|
||||
}
|
||||
|
||||
|
|
@ -2347,11 +2394,11 @@ void LLVertexBuffer::setupVertexBuffer(U32 data_mask)
|
|||
void* ptr = (void*)(base + mOffsets[TYPE_TEXCOORD1]);
|
||||
glVertexAttribPointerARB(loc,2,GL_FLOAT, GL_FALSE, LLVertexBuffer::sTypeSize[TYPE_TEXCOORD1], ptr);
|
||||
}
|
||||
if (data_mask & MAP_BINORMAL)
|
||||
if (data_mask & MAP_TANGENT)
|
||||
{
|
||||
S32 loc = TYPE_BINORMAL;
|
||||
void* ptr = (void*)(base + mOffsets[TYPE_BINORMAL]);
|
||||
glVertexAttribPointerARB(loc, 3,GL_FLOAT, GL_FALSE, LLVertexBuffer::sTypeSize[TYPE_BINORMAL], ptr);
|
||||
S32 loc = TYPE_TANGENT;
|
||||
void* ptr = (void*)(base + mOffsets[TYPE_TANGENT]);
|
||||
glVertexAttribPointerARB(loc, 4,GL_FLOAT, GL_FALSE, LLVertexBuffer::sTypeSize[TYPE_TANGENT], ptr);
|
||||
}
|
||||
if (data_mask & MAP_TEXCOORD0)
|
||||
{
|
||||
|
|
@ -2429,10 +2476,10 @@ void LLVertexBuffer::setupVertexBuffer(U32 data_mask)
|
|||
glTexCoordPointer(2,GL_FLOAT, LLVertexBuffer::sTypeSize[TYPE_TEXCOORD1], (void*)(base + mOffsets[TYPE_TEXCOORD1]));
|
||||
glClientActiveTextureARB(GL_TEXTURE0_ARB);
|
||||
}
|
||||
if (data_mask & MAP_BINORMAL)
|
||||
if (data_mask & MAP_TANGENT)
|
||||
{
|
||||
glClientActiveTextureARB(GL_TEXTURE2_ARB);
|
||||
glTexCoordPointer(3,GL_FLOAT, LLVertexBuffer::sTypeSize[TYPE_BINORMAL], (void*)(base + mOffsets[TYPE_BINORMAL]));
|
||||
glTexCoordPointer(4,GL_FLOAT, LLVertexBuffer::sTypeSize[TYPE_TANGENT], (void*)(base + mOffsets[TYPE_TANGENT]));
|
||||
glClientActiveTextureARB(GL_TEXTURE0_ARB);
|
||||
}
|
||||
if (data_mask & MAP_TEXCOORD0)
|
||||
|
|
|
|||
|
|
@ -174,7 +174,7 @@ public:
|
|||
TYPE_TEXCOORD3,
|
||||
TYPE_COLOR,
|
||||
TYPE_EMISSIVE,
|
||||
TYPE_BINORMAL,
|
||||
TYPE_TANGENT,
|
||||
TYPE_WEIGHT,
|
||||
TYPE_WEIGHT4,
|
||||
TYPE_CLOTHWEIGHT,
|
||||
|
|
@ -192,7 +192,7 @@ public:
|
|||
MAP_COLOR = (1<<TYPE_COLOR),
|
||||
MAP_EMISSIVE = (1<<TYPE_EMISSIVE),
|
||||
// These use VertexAttribPointer and should possibly be made generic
|
||||
MAP_BINORMAL = (1<<TYPE_BINORMAL),
|
||||
MAP_TANGENT = (1<<TYPE_TANGENT),
|
||||
MAP_WEIGHT = (1<<TYPE_WEIGHT),
|
||||
MAP_WEIGHT4 = (1<<TYPE_WEIGHT4),
|
||||
MAP_CLOTHWEIGHT = (1<<TYPE_CLOTHWEIGHT),
|
||||
|
|
@ -250,8 +250,10 @@ public:
|
|||
bool getIndexStrider(LLStrider<U16>& strider, S32 index=0, S32 count = -1, bool map_range = false);
|
||||
bool getTexCoord0Strider(LLStrider<LLVector2>& strider, S32 index=0, S32 count = -1, bool map_range = false);
|
||||
bool getTexCoord1Strider(LLStrider<LLVector2>& strider, S32 index=0, S32 count = -1, bool map_range = false);
|
||||
bool getTexCoord2Strider(LLStrider<LLVector2>& strider, S32 index=0, S32 count = -1, bool map_range = false);
|
||||
bool getNormalStrider(LLStrider<LLVector3>& strider, S32 index=0, S32 count = -1, bool map_range = false);
|
||||
bool getBinormalStrider(LLStrider<LLVector3>& strider, S32 index=0, S32 count = -1, bool map_range = false);
|
||||
bool getTangentStrider(LLStrider<LLVector3>& strider, S32 index=0, S32 count = -1, bool map_range = false);
|
||||
bool getTangentStrider(LLStrider<LLVector4a>& strider, S32 index=0, S32 count = -1, bool map_range = false);
|
||||
bool getColorStrider(LLStrider<LLColor4U>& strider, S32 index=0, S32 count = -1, bool map_range = false);
|
||||
bool getTextureIndexStrider(LLStrider<LLColor4U>& strider, S32 index=0, S32 count = -1, bool map_range = false);
|
||||
bool getEmissiveStrider(LLStrider<LLColor4U>& strider, S32 index=0, S32 count = -1, bool map_range = false);
|
||||
|
|
|
|||
|
|
@ -33,7 +33,7 @@
|
|||
|
||||
|
||||
LLScreenClipRect::LLScreenClipRect(const LLRect& rect, BOOL enabled)
|
||||
: mScissorState(GL_SCISSOR_TEST),
|
||||
: mScissorState(GL_SCISSOR_TEST),
|
||||
mEnabled(enabled)
|
||||
{
|
||||
if (mEnabled)
|
||||
|
|
@ -100,10 +100,10 @@ void LLScreenClipRect::updateScissorRegion()
|
|||
// LLLocalClipRect
|
||||
//---------------------------------------------------------------------------
|
||||
LLLocalClipRect::LLLocalClipRect(const LLRect& rect, BOOL enabled /* = TRUE */)
|
||||
: LLScreenClipRect(LLRect(rect.mLeft + LLFontGL::sCurOrigin.mX,
|
||||
rect.mTop + LLFontGL::sCurOrigin.mY,
|
||||
rect.mRight + LLFontGL::sCurOrigin.mX,
|
||||
rect.mBottom + LLFontGL::sCurOrigin.mY), enabled)
|
||||
: LLScreenClipRect(LLRect(rect.mLeft + LLFontGL::sCurOrigin.mX,
|
||||
rect.mTop + LLFontGL::sCurOrigin.mY,
|
||||
rect.mRight + LLFontGL::sCurOrigin.mX,
|
||||
rect.mBottom + LLFontGL::sCurOrigin.mY), enabled)
|
||||
{}
|
||||
|
||||
LLLocalClipRect::~LLLocalClipRect()
|
||||
|
|
|
|||
|
|
@ -1309,10 +1309,8 @@ bool LLXUIParser::writeSDValue(Parser& parser, const void* val_ptr, name_stack_t
|
|||
void LLXUIParser::parserWarning(const std::string& message)
|
||||
{
|
||||
#ifdef LL_WINDOWS
|
||||
// use Visual Studo friendly formatting of output message for easy access to originating xml
|
||||
llutf16string utf16str = utf8str_to_utf16str(llformat("%s(%d):\t%s", mCurFileName.c_str(), mCurReadNode->getLineNumber(), message.c_str()).c_str());
|
||||
utf16str += '\n';
|
||||
OutputDebugString(utf16str.c_str());
|
||||
// use Visual Studio friendly formatting of output message for easy access to originating xml
|
||||
LL_WINDOWS_OUTPUT_DEBUG(llformat("%s(%d):\t%s", mCurFileName.c_str(), mCurReadNode->getLineNumber(), message.c_str()));
|
||||
#else
|
||||
Parser::parserWarning(message);
|
||||
#endif
|
||||
|
|
@ -1321,9 +1319,8 @@ void LLXUIParser::parserWarning(const std::string& message)
|
|||
void LLXUIParser::parserError(const std::string& message)
|
||||
{
|
||||
#ifdef LL_WINDOWS
|
||||
llutf16string utf16str = utf8str_to_utf16str(llformat("%s(%d):\t%s", mCurFileName.c_str(), mCurReadNode->getLineNumber(), message.c_str()).c_str());
|
||||
utf16str += '\n';
|
||||
OutputDebugString(utf16str.c_str());
|
||||
// use Visual Studio friendly formatting of output message for easy access to originating xml
|
||||
LL_WINDOWS_OUTPUT_DEBUG(llformat("%s(%d):\t%s", mCurFileName.c_str(), mCurReadNode->getLineNumber(), message.c_str()));
|
||||
#else
|
||||
Parser::parserError(message);
|
||||
#endif
|
||||
|
|
@ -1640,10 +1637,8 @@ bool LLSimpleXUIParser::processText()
|
|||
void LLSimpleXUIParser::parserWarning(const std::string& message)
|
||||
{
|
||||
#ifdef LL_WINDOWS
|
||||
// use Visual Studo friendly formatting of output message for easy access to originating xml
|
||||
llutf16string utf16str = utf8str_to_utf16str(llformat("%s(%d):\t%s", mCurFileName.c_str(), LINE_NUMBER_HERE, message.c_str()).c_str());
|
||||
utf16str += '\n';
|
||||
OutputDebugString(utf16str.c_str());
|
||||
// use Visual Studio friendly formatting of output message for easy access to originating xml
|
||||
LL_WINDOWS_OUTPUT_DEBUG(llformat("%s(%d):\t%s", mCurFileName.c_str(), LINE_NUMBER_HERE, message.c_str()));
|
||||
#else
|
||||
Parser::parserWarning(message);
|
||||
#endif
|
||||
|
|
@ -1652,9 +1647,8 @@ void LLSimpleXUIParser::parserWarning(const std::string& message)
|
|||
void LLSimpleXUIParser::parserError(const std::string& message)
|
||||
{
|
||||
#ifdef LL_WINDOWS
|
||||
llutf16string utf16str = utf8str_to_utf16str(llformat("%s(%d):\t%s", mCurFileName.c_str(), LINE_NUMBER_HERE, message.c_str()).c_str());
|
||||
utf16str += '\n';
|
||||
OutputDebugString(utf16str.c_str());
|
||||
// use Visual Studio friendly formatting of output message for easy access to originating xml
|
||||
LL_WINDOWS_OUTPUT_DEBUG(llformat("%s(%d):\t%s", mCurFileName.c_str(), LINE_NUMBER_HERE, message.c_str()));
|
||||
#else
|
||||
Parser::parserError(message);
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -134,7 +134,7 @@ LLDir_Mac::LLDir_Mac()
|
|||
|
||||
{
|
||||
mOSCacheDir = *cachedir;
|
||||
//SPATTERS TODO: This changes from ~/Library/Cache/Secondlife to ~/Library/Cache/com.app.secondlife/Secondlife. Last dir level could go away.
|
||||
//Aura TODO: This changes from ~/Library/Cache/Secondlife to ~/Library/Cache/com.app.secondlife/Secondlife. Last dir level could go away.
|
||||
CreateDirectory(mOSCacheDir, secondLifeString, NULL);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -131,7 +131,7 @@ LLDir_Win32::LLDir_Win32()
|
|||
mAppRODataDir = mExecutableDir;
|
||||
}
|
||||
|
||||
llinfos << "mAppRODataDir = " << mAppRODataDir << llendl;
|
||||
// llinfos << "mAppRODataDir = " << mAppRODataDir << llendl;
|
||||
|
||||
mSkinBaseDir = mAppRODataDir + mDirDelimiter + "skins";
|
||||
|
||||
|
|
|
|||
|
|
@ -135,7 +135,7 @@ U8* LLVFile::readFile(LLVFS *vfs, const LLUUID &uuid, LLAssetType::EType type, S
|
|||
data = NULL;
|
||||
}
|
||||
else
|
||||
{
|
||||
{
|
||||
data = (U8*) ll_aligned_malloc_16(file_size);
|
||||
file.read(data, file_size); /* Flawfinder: ignore */
|
||||
|
||||
|
|
|
|||
|
|
@ -58,7 +58,7 @@ std::string* findSystemDirectory(NSSearchPathDirectory searchPathDirectory,
|
|||
if ([paths count])
|
||||
{
|
||||
path = [paths objectAtIndex:0];
|
||||
//SPATTERS HACK: Always attempt to create directory, ignore errors.
|
||||
//HACK: Always attempt to create directory, ignore errors.
|
||||
NSError *error = nil;
|
||||
|
||||
[[NSFileManager defaultManager] createDirectoryAtPath:path withIntermediateDirectories:YES attributes:nil error:&error];
|
||||
|
|
|
|||
|
|
@ -165,7 +165,7 @@ if (BUILD_HEADLESS)
|
|||
set(llwindowheadless_HEADER_FILES
|
||||
llwindowmesaheadless.h
|
||||
llmousehandler.h
|
||||
)
|
||||
)
|
||||
add_library (llwindowheadless
|
||||
${llwindow_SOURCE_FILES}
|
||||
${llwindowheadless_SOURCE_FILES}
|
||||
|
|
@ -180,12 +180,12 @@ if (llwindow_HEADER_FILES)
|
|||
list(APPEND llwindow_SOURCE_FILES ${llwindow_HEADER_FILES})
|
||||
endif (llwindow_HEADER_FILES)
|
||||
|
||||
list(APPEND viewer_SOURCE_FILES ${viewer_HEADER_FILES})
|
||||
list(APPEND viewer_SOURCE_FILES ${viewer_HEADER_FILES})
|
||||
|
||||
add_library (llwindow
|
||||
${llwindow_SOURCE_FILES}
|
||||
${viewer_SOURCE_FILES}
|
||||
)
|
||||
add_library (llwindow
|
||||
${llwindow_SOURCE_FILES}
|
||||
${viewer_SOURCE_FILES}
|
||||
)
|
||||
|
||||
if (SDL_FOUND)
|
||||
set_property(TARGET llwindow
|
||||
|
|
@ -193,5 +193,5 @@ if (SDL_FOUND)
|
|||
)
|
||||
endif (SDL_FOUND)
|
||||
|
||||
target_link_libraries (llwindow ${llwindow_LINK_LIBRARIES})
|
||||
target_link_libraries (llwindow ${llwindow_LINK_LIBRARIES})
|
||||
|
||||
|
|
|
|||
|
|
@ -42,7 +42,7 @@ list(APPEND llxml_SOURCE_FILES ${llxml_HEADER_FILES})
|
|||
add_library (llxml ${llxml_SOURCE_FILES})
|
||||
# Libraries on which this library depends, needed for Linux builds
|
||||
# Sort by high-level to low-level
|
||||
target_link_libraries(llxml
|
||||
target_link_libraries( llxml
|
||||
${LLVFS_LIBRARIES}
|
||||
${LLMATH_LIBRARIES}
|
||||
${LLCOMMON_LIBRARIES}
|
||||
|
|
|
|||
|
|
@ -79,11 +79,9 @@ void parse_string();
|
|||
#define yyfree indra_free
|
||||
|
||||
|
||||
#if defined(__cplusplus)
|
||||
extern "C" { int yylex( void ); }
|
||||
extern "C" { int yyparse( void ); }
|
||||
extern "C" { int yyerror(const char *fmt, ...); }
|
||||
#endif
|
||||
int yylex( void );
|
||||
int yyparse( void );
|
||||
int yyerror(const char *fmt, ...);
|
||||
|
||||
%}
|
||||
|
||||
|
|
|
|||
|
|
@ -2,10 +2,6 @@
|
|||
#include "linden_common.h"
|
||||
#include "lscript_tree.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
int yylex(void);
|
||||
int yyparse( void );
|
||||
int yyerror(const char *fmt, ...);
|
||||
|
|
@ -20,9 +16,6 @@
|
|||
#pragma warning( disable : 4065 ) // warning: switch statement contains 'default' but no 'case' labels
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
%}
|
||||
|
||||
%union
|
||||
|
|
|
|||
Binary file not shown.
|
|
@ -56,7 +56,7 @@ void ll_winmm_shim_initialize(){
|
|||
// grab winmm.dll from system path, where it should live
|
||||
wsprintf(dll_path, "%s\\winmm.dll", system_path);
|
||||
HMODULE winmm_handle = ::LoadLibrary(dll_path);
|
||||
|
||||
|
||||
if (winmm_handle != NULL)
|
||||
{ // we have a dll, let's get out pointers!
|
||||
initialized = true;
|
||||
|
|
|
|||
|
|
@ -4,6 +4,7 @@ project(viewer)
|
|||
|
||||
include(00-Common)
|
||||
include(Boost)
|
||||
include(BuildVersion)
|
||||
include(DBusGlib)
|
||||
include(DirectX)
|
||||
include(OpenSSL)
|
||||
|
|
@ -174,6 +175,7 @@ set(viewer_SOURCE_FILES
|
|||
lldrawpoolavatar.cpp
|
||||
lldrawpoolbump.cpp
|
||||
lldrawpoolground.cpp
|
||||
lldrawpoolmaterials.cpp
|
||||
lldrawpoolsimple.cpp
|
||||
lldrawpoolsky.cpp
|
||||
lldrawpoolterrain.cpp
|
||||
|
|
@ -359,6 +361,7 @@ set(viewer_SOURCE_FILES
|
|||
llmaniptranslate.cpp
|
||||
llmarketplacefunctions.cpp
|
||||
llmarketplacenotifications.cpp
|
||||
llmaterialmgr.cpp
|
||||
llmediactrl.cpp
|
||||
llmediadataclient.cpp
|
||||
llmenuoptionpathfindingrebakenavmesh.cpp
|
||||
|
|
@ -756,6 +759,7 @@ set(viewer_HEADER_FILES
|
|||
lldrawpoolalpha.h
|
||||
lldrawpoolavatar.h
|
||||
lldrawpoolbump.h
|
||||
lldrawpoolmaterials.h
|
||||
lldrawpoolground.h
|
||||
lldrawpoolsimple.h
|
||||
lldrawpoolsky.h
|
||||
|
|
@ -941,6 +945,7 @@ set(viewer_HEADER_FILES
|
|||
llmaniptranslate.h
|
||||
llmarketplacefunctions.h
|
||||
llmarketplacenotifications.h
|
||||
llmaterialmgr.h
|
||||
llmediactrl.h
|
||||
llmediadataclient.h
|
||||
llmenuoptionpathfindingrebakenavmesh.h
|
||||
|
|
@ -1567,7 +1572,7 @@ endif (WINDOWS)
|
|||
|
||||
if (OPENAL)
|
||||
set(LLSTARTUP_COMPILE_FLAGS "${LLSTARTUP_COMPILE_FLAGS} -DLL_OPENAL")
|
||||
endif (OPENAL)
|
||||
endif (OPENAL)
|
||||
|
||||
if (FMODEX)
|
||||
set(LLSTARTUP_COMPILE_FLAGS "${LLSTARTUP_COMPILE_FLAGS} -DLL_FMODEX")
|
||||
|
|
@ -1669,6 +1674,7 @@ if (WINDOWS)
|
|||
${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/zlib1.dll
|
||||
${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/vivoxplatform.dll
|
||||
${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/vivoxoal.dll
|
||||
${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/ca-bundle.crt
|
||||
${GOOGLE_PERF_TOOLS_SOURCE}
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/licenses-win32.txt
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/featuretable.txt
|
||||
|
|
@ -1987,7 +1993,7 @@ if (DARWIN)
|
|||
configure_file(
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/Info-SecondLife.plist"
|
||||
"${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/${product}.app/Contents/Info.plist"
|
||||
)
|
||||
)
|
||||
|
||||
add_custom_command(
|
||||
TARGET ${VIEWER_BINARY_NAME} POST_BUILD
|
||||
|
|
@ -2151,6 +2157,40 @@ if (LL_TESTS)
|
|||
LL_TEST_ADDITIONAL_LIBRARIES "${CURL_LIBRARIES}"
|
||||
)
|
||||
|
||||
set_source_files_properties(
|
||||
llviewerhelputil.cpp
|
||||
PROPERTIES
|
||||
LL_TEST_ADDITIONAL_LIBRARIES "${BOOST_SYSTEM_LIBRARY}"
|
||||
)
|
||||
|
||||
set_source_files_properties(
|
||||
llremoteparcelrequest.cpp
|
||||
PROPERTIES
|
||||
LL_TEST_ADDITIONAL_LIBRARIES "${BOOST_SYSTEM_LIBRARY}"
|
||||
)
|
||||
|
||||
set_source_files_properties(
|
||||
llworldmap.cpp
|
||||
llworldmipmap.cpp
|
||||
PROPERTIES
|
||||
LL_TEST_ADDITIONAL_SOURCE_FILES
|
||||
tests/llviewertexture_stub.cpp
|
||||
#llviewertexturelist.cpp
|
||||
LL_TEST_ADDITIONAL_LIBRARIES "${BOOST_SYSTEM_LIBRARY}"
|
||||
)
|
||||
|
||||
set_source_files_properties(
|
||||
llmediadataclient.cpp
|
||||
PROPERTIES
|
||||
LL_TEST_ADDITIONAL_LIBRARIES "${LLPRIMITIVE_LIBRARIES}"
|
||||
)
|
||||
|
||||
set_source_files_properties(
|
||||
llagentaccess.cpp
|
||||
PROPERTIES
|
||||
LL_TEST_ADDITIONAL_LIBRARIES "${BOOST_SYSTEM_LIBRARY}"
|
||||
)
|
||||
|
||||
set_source_files_properties(
|
||||
lllogininstance.cpp
|
||||
PROPERTIES
|
||||
|
|
|
|||
|
|
@ -1 +1 @@
|
|||
3.5.4
|
||||
3.6.3
|
||||
|
|
|
|||
|
|
@ -2873,6 +2873,17 @@
|
|||
<key>Value</key>
|
||||
<integer>0</integer>
|
||||
</map>
|
||||
<key>DefaultBlankNormalTexture</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Texture used as 'Blank' in texture picker for normal maps. (UUID texture reference)</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>String</string>
|
||||
<key>Value</key>
|
||||
<string>5b53359e-59dd-d8a2-04c3-9e65134da47a</string>
|
||||
</map>
|
||||
<key>DefaultFemaleAvatar</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
|
|
@ -2895,8 +2906,29 @@
|
|||
<key>Value</key>
|
||||
<string>Male Shape & Outfit</string>
|
||||
</map>
|
||||
|
||||
<key>DefaultObjectTexture</key>
|
||||
<key>DefaultObjectNormalTexture</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Texture used as 'Default' in texture picker for normal map. (UUID texture reference)</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>String</string>
|
||||
<key>Value</key>
|
||||
<string>85f28839-7a1c-b4e3-d71d-967792970a7b</string>
|
||||
</map>
|
||||
<key>DefaultObjectSpecularTexture</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Texture used as 'Default' in texture picker for specular map. (UUID texture reference)</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>String</string>
|
||||
<key>Value</key>
|
||||
<string>87e0e8f7-8729-1ea8-cfc9-8915773009db</string>
|
||||
</map>
|
||||
<key>DefaultObjectTexture</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Texture used as 'Default' in texture picker. (UUID texture reference)</string>
|
||||
|
|
@ -3347,17 +3379,6 @@
|
|||
<key>Value</key>
|
||||
<integer>1</integer>
|
||||
</map>
|
||||
<key>EnableTextureAtlas</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Whether to use texture atlas or not</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>Boolean</string>
|
||||
<key>Value</key>
|
||||
<integer>0</integer>
|
||||
</map>
|
||||
<key>EnableUIHints</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
|
|
@ -7711,7 +7732,7 @@
|
|||
<key>Type</key>
|
||||
<string>S32</string>
|
||||
<key>Value</key>
|
||||
<integer>4</integer>
|
||||
<integer>3</integer>
|
||||
</map>
|
||||
|
||||
<key>OctreeAlphaDistanceFactor</key>
|
||||
|
|
@ -8440,7 +8461,7 @@
|
|||
<key>RenderSpotLightsInNondeferred</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Whether to support projectors as spotlights when Lighting and Shadows is disabled</string>
|
||||
<string>Whether to support projectors as spotlights when Advanced Lighting Model is disabled</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
|
|
@ -8483,7 +8504,6 @@
|
|||
<key>Value</key>
|
||||
<real>1.0</real>
|
||||
</map>
|
||||
|
||||
<key>RenderDeferredTreeShadowBias</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
|
|
@ -8581,7 +8601,7 @@
|
|||
<key>Type</key>
|
||||
<string>U32</string>
|
||||
<key>Value</key>
|
||||
<real>512</real>
|
||||
<real>1024</real>
|
||||
</map>
|
||||
|
||||
<key>RenderSpecularResY</key>
|
||||
|
|
@ -8593,7 +8613,7 @@
|
|||
<key>Type</key>
|
||||
<string>U32</string>
|
||||
<key>Value</key>
|
||||
<real>128</real>
|
||||
<real>256</real>
|
||||
</map>
|
||||
|
||||
<key>RenderSpecularExponent</key>
|
||||
|
|
@ -8611,7 +8631,7 @@
|
|||
<key>RenderDeferred</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Use deferred rendering pipeline.</string>
|
||||
<string>Use deferred rendering pipeline (Advanced Lighting Model).</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
|
|
@ -8799,7 +8819,7 @@
|
|||
<key>RenderAutoMaskAlphaNonDeferred</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Use alpha masks where appropriate, in the non-deferred (non-'Lighting and Shadows') graphics mode</string>
|
||||
<string>Use alpha masks where appropriate when not using the Advanced Lighting Model</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
|
|
@ -8810,7 +8830,7 @@
|
|||
<key>RenderAutoMaskAlphaDeferred</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Use alpha masks where appropriate, in the deferred ('Lighting and Shadows') graphics mode</string>
|
||||
<string>Use alpha masks where appropriate in the Advanced Lighting Model</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
|
|
@ -12472,17 +12492,6 @@
|
|||
<key>Value</key>
|
||||
<integer>3</integer>
|
||||
</map>
|
||||
<key>UpdaterWillingToTest</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Allow upgrades to release candidate viewers with new features and fixes.</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>Boolean</string>
|
||||
<key>Value</key>
|
||||
<integer>1</integer>
|
||||
</map>
|
||||
<key>UpdaterServiceCheckPeriod</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
|
|
@ -12866,7 +12875,6 @@
|
|||
<key>Type</key>
|
||||
<string>LLSD</string>
|
||||
<key>Value</key>
|
||||
<string/>
|
||||
</map>
|
||||
<key>VFSOldSize</key>
|
||||
<map>
|
||||
|
|
@ -14535,5 +14543,16 @@
|
|||
<key>Value</key>
|
||||
<integer>7000</integer>
|
||||
</map>
|
||||
<key>DisablePrecacheDelayAfterTeleporting</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Disables the artificial delay in the viewer that precaches some incoming assets</string>
|
||||
<key>Persist</key>
|
||||
<integer>0</integer>
|
||||
<key>Type</key>
|
||||
<string>Boolean</string>
|
||||
<key>Value</key>
|
||||
<integer>0</integer>
|
||||
</map>
|
||||
</map>
|
||||
</llsd>
|
||||
|
|
|
|||
|
|
@ -25,17 +25,33 @@
|
|||
|
||||
#extension GL_ARB_texture_rectangle : enable
|
||||
|
||||
#define INDEXED 1
|
||||
#define NON_INDEXED 2
|
||||
#define NON_INDEXED_NO_COLOR 3
|
||||
|
||||
#ifdef DEFINE_GL_FRAGCOLOR
|
||||
out vec4 frag_color;
|
||||
#else
|
||||
#define frag_color gl_FragColor
|
||||
#endif
|
||||
|
||||
uniform sampler2DRect depthMap;
|
||||
#if HAS_SHADOW
|
||||
uniform sampler2DShadow shadowMap0;
|
||||
uniform sampler2DShadow shadowMap1;
|
||||
uniform sampler2DShadow shadowMap2;
|
||||
uniform sampler2DShadow shadowMap3;
|
||||
|
||||
vec4 diffuseLookup(vec2 texcoord);
|
||||
uniform vec2 shadow_res;
|
||||
|
||||
uniform vec2 screen_res;
|
||||
uniform mat4 shadow_matrix[6];
|
||||
uniform vec4 shadow_clip;
|
||||
uniform float shadow_bias;
|
||||
|
||||
#endif
|
||||
|
||||
#ifdef USE_DIFFUSE_TEX
|
||||
uniform sampler2D diffuseMap;
|
||||
#endif
|
||||
|
||||
vec3 atmosLighting(vec3 light);
|
||||
vec3 scaleSoftClip(vec3 light);
|
||||
|
|
@ -45,11 +61,80 @@ VARYING vec3 vary_directional;
|
|||
VARYING vec3 vary_fragcoord;
|
||||
VARYING vec3 vary_position;
|
||||
VARYING vec3 vary_pointlight_col;
|
||||
|
||||
VARYING vec4 vertex_color;
|
||||
VARYING vec2 vary_texcoord0;
|
||||
VARYING vec3 vary_norm;
|
||||
|
||||
#ifdef USE_VERTEX_COLOR
|
||||
VARYING vec4 vertex_color;
|
||||
#endif
|
||||
|
||||
uniform vec4 light_position[8];
|
||||
uniform vec3 light_direction[8];
|
||||
uniform vec3 light_attenuation[8];
|
||||
uniform vec3 light_diffuse[8];
|
||||
|
||||
uniform vec2 screen_res;
|
||||
|
||||
vec3 calcDirectionalLight(vec3 n, vec3 l)
|
||||
{
|
||||
float a = max(dot(n,l),0.0);
|
||||
a = pow(a, 1.0/1.3);
|
||||
return vec3(a,a,a);
|
||||
}
|
||||
|
||||
vec3 calcPointLightOrSpotLight(vec3 v, vec3 n, vec4 lp, vec3 ln, float la, float fa, float is_pointlight)
|
||||
{
|
||||
//get light vector
|
||||
vec3 lv = lp.xyz-v;
|
||||
|
||||
//get distance
|
||||
float d = length(lv);
|
||||
|
||||
float da = 0.0;
|
||||
|
||||
if (d > 0.0 && la > 0.0 && fa > 0.0)
|
||||
{
|
||||
//normalize light vector
|
||||
lv = normalize(lv);
|
||||
|
||||
//distance attenuation
|
||||
float dist = d/la;
|
||||
da = clamp(1.0-(dist-1.0*(1.0-fa))/fa, 0.0, 1.0);
|
||||
da *= da;
|
||||
da *= 1.4;
|
||||
|
||||
|
||||
// spotlight coefficient.
|
||||
float spot = max(dot(-ln, lv), is_pointlight);
|
||||
da *= spot*spot; // GL_SPOT_EXPONENT=2
|
||||
|
||||
//angular attenuation
|
||||
da *= max(dot(n, lv), 0.0);
|
||||
}
|
||||
|
||||
return vec3(da,da,da);
|
||||
}
|
||||
|
||||
#if HAS_SHADOW
|
||||
float pcfShadow(sampler2DShadow shadowMap, vec4 stc)
|
||||
{
|
||||
stc.xyz /= stc.w;
|
||||
stc.z += shadow_bias;
|
||||
|
||||
stc.x = floor(stc.x*shadow_res.x + fract(stc.y*shadow_res.y*12345))/shadow_res.x; // add some chaotic jitter to X sample pos according to Y to disguise the snapping going on here
|
||||
|
||||
float cs = shadow2D(shadowMap, stc.xyz).x;
|
||||
float shadow = cs;
|
||||
|
||||
shadow += shadow2D(shadowMap, stc.xyz+vec3(2.0/shadow_res.x, 1.5/shadow_res.y, 0.0)).x;
|
||||
shadow += shadow2D(shadowMap, stc.xyz+vec3(1.0/shadow_res.x, -1.5/shadow_res.y, 0.0)).x;
|
||||
shadow += shadow2D(shadowMap, stc.xyz+vec3(-1.0/shadow_res.x, 1.5/shadow_res.y, 0.0)).x;
|
||||
shadow += shadow2D(shadowMap, stc.xyz+vec3(-2.0/shadow_res.x, -1.5/shadow_res.y, 0.0)).x;
|
||||
|
||||
return shadow*0.2;
|
||||
}
|
||||
#endif
|
||||
|
||||
uniform mat4 inv_proj;
|
||||
|
||||
void main()
|
||||
{
|
||||
|
|
@ -58,16 +143,123 @@ void main()
|
|||
|
||||
vec4 pos = vec4(vary_position, 1.0);
|
||||
|
||||
vec4 diff= diffuseLookup(vary_texcoord0.xy);
|
||||
|
||||
vec4 col = vec4(vary_ambient + vary_directional.rgb, vertex_color.a);
|
||||
vec4 color = diff * col;
|
||||
#if HAS_SHADOW
|
||||
float shadow = 0.0;
|
||||
vec4 spos = pos;
|
||||
|
||||
if (spos.z > -shadow_clip.w)
|
||||
{
|
||||
vec4 lpos;
|
||||
|
||||
vec4 near_split = shadow_clip*-0.75;
|
||||
vec4 far_split = shadow_clip*-1.25;
|
||||
vec4 transition_domain = near_split-far_split;
|
||||
float weight = 0.0;
|
||||
|
||||
if (spos.z < near_split.z)
|
||||
{
|
||||
lpos = shadow_matrix[3]*spos;
|
||||
|
||||
float w = 1.0;
|
||||
w -= max(spos.z-far_split.z, 0.0)/transition_domain.z;
|
||||
shadow += pcfShadow(shadowMap3, lpos)*w;
|
||||
weight += w;
|
||||
shadow += max((pos.z+shadow_clip.z)/(shadow_clip.z-shadow_clip.w)*2.0-1.0, 0.0);
|
||||
}
|
||||
|
||||
if (spos.z < near_split.y && spos.z > far_split.z)
|
||||
{
|
||||
lpos = shadow_matrix[2]*spos;
|
||||
|
||||
float w = 1.0;
|
||||
w -= max(spos.z-far_split.y, 0.0)/transition_domain.y;
|
||||
w -= max(near_split.z-spos.z, 0.0)/transition_domain.z;
|
||||
shadow += pcfShadow(shadowMap2, lpos)*w;
|
||||
weight += w;
|
||||
}
|
||||
|
||||
if (spos.z < near_split.x && spos.z > far_split.y)
|
||||
{
|
||||
lpos = shadow_matrix[1]*spos;
|
||||
|
||||
float w = 1.0;
|
||||
w -= max(spos.z-far_split.x, 0.0)/transition_domain.x;
|
||||
w -= max(near_split.y-spos.z, 0.0)/transition_domain.y;
|
||||
shadow += pcfShadow(shadowMap1, lpos)*w;
|
||||
weight += w;
|
||||
}
|
||||
|
||||
if (spos.z > far_split.x)
|
||||
{
|
||||
lpos = shadow_matrix[0]*spos;
|
||||
|
||||
float w = 1.0;
|
||||
w -= max(near_split.x-spos.z, 0.0)/transition_domain.x;
|
||||
|
||||
shadow += pcfShadow(shadowMap0, lpos)*w;
|
||||
weight += w;
|
||||
}
|
||||
|
||||
|
||||
shadow /= weight;
|
||||
}
|
||||
else
|
||||
{
|
||||
shadow = 1.0;
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef USE_INDEXED_TEX
|
||||
vec4 diff = diffuseLookup(vary_texcoord0.xy);
|
||||
#else
|
||||
vec4 diff = texture2D(diffuseMap,vary_texcoord0.xy);
|
||||
#endif
|
||||
vec4 gamma_diff = diff;
|
||||
|
||||
diff.rgb = pow(diff.rgb, vec3(2.2f, 2.2f, 2.2f));
|
||||
|
||||
#ifdef USE_VERTEX_COLOR
|
||||
float vertex_color_alpha = vertex_color.a;
|
||||
#else
|
||||
float vertex_color_alpha = 1.0;
|
||||
#endif
|
||||
|
||||
vec3 normal = vary_norm;
|
||||
|
||||
vec3 l = light_position[0].xyz;
|
||||
vec3 dlight = calcDirectionalLight(normal, l);
|
||||
dlight = dlight * vary_directional.rgb * vary_pointlight_col;
|
||||
|
||||
#if HAS_SHADOW
|
||||
vec4 col = vec4(vary_ambient + dlight * shadow, vertex_color_alpha);
|
||||
#else
|
||||
vec4 col = vec4(vary_ambient + dlight, vertex_color_alpha);
|
||||
#endif
|
||||
|
||||
vec4 color = gamma_diff * col;
|
||||
|
||||
color.rgb = atmosLighting(color.rgb);
|
||||
|
||||
color.rgb = scaleSoftClip(color.rgb);
|
||||
|
||||
color.rgb += diff.rgb * vary_pointlight_col.rgb;
|
||||
color.rgb = pow(color.rgb, vec3(2.2));
|
||||
col = vec4(0,0,0,0);
|
||||
|
||||
|
||||
#define LIGHT_LOOP(i) col.rgb += light_diffuse[i].rgb * calcPointLightOrSpotLight(pos.xyz, normal, light_position[i], light_direction[i].xyz, light_attenuation[i].x, light_attenuation[i].y, light_attenuation[i].z);
|
||||
|
||||
LIGHT_LOOP(1)
|
||||
LIGHT_LOOP(2)
|
||||
LIGHT_LOOP(3)
|
||||
LIGHT_LOOP(4)
|
||||
LIGHT_LOOP(5)
|
||||
LIGHT_LOOP(6)
|
||||
LIGHT_LOOP(7)
|
||||
|
||||
color.rgb += diff.rgb * pow(vary_pointlight_col, vec3(2.2)) * col.rgb;
|
||||
|
||||
color.rgb = pow(color.rgb, vec3(1.0/2.2));
|
||||
|
||||
frag_color = color;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -47,9 +47,51 @@ VARYING vec3 vary_position;
|
|||
VARYING vec3 vary_pointlight_col;
|
||||
VARYING vec2 vary_texcoord0;
|
||||
VARYING vec4 vertex_color;
|
||||
VARYING vec3 vary_norm;
|
||||
|
||||
uniform mat4 inv_proj;
|
||||
|
||||
uniform vec4 light_position[8];
|
||||
uniform vec3 light_direction[8];
|
||||
uniform vec3 light_attenuation[8];
|
||||
uniform vec3 light_diffuse[8];
|
||||
|
||||
vec3 calcDirectionalLight(vec3 n, vec3 l)
|
||||
{
|
||||
float a = pow(max(dot(n,l),0.0), 0.7);
|
||||
return vec3(a,a,a);
|
||||
}
|
||||
|
||||
vec3 calcPointLightOrSpotLight(vec3 v, vec3 n, vec4 lp, vec3 ln, float la, float fa, float is_pointlight)
|
||||
{
|
||||
//get light vector
|
||||
vec3 lv = lp.xyz-v;
|
||||
|
||||
//get distance
|
||||
float d = dot(lv,lv);
|
||||
|
||||
float da = 0.0;
|
||||
|
||||
if (d > 0.0 && la > 0.0 && fa > 0.0)
|
||||
{
|
||||
//normalize light vector
|
||||
lv = normalize(lv);
|
||||
|
||||
//distance attenuation
|
||||
float dist2 = d/la;
|
||||
da = clamp(1.0-(dist2-1.0*(1.0-fa))/fa, 0.0, 1.0);
|
||||
|
||||
// spotlight coefficient.
|
||||
float spot = max(dot(-ln, lv), is_pointlight);
|
||||
da *= spot*spot; // GL_SPOT_EXPONENT=2
|
||||
|
||||
//angular attenuation
|
||||
da *= max(pow(dot(n, lv), 0.7), 0.0);
|
||||
}
|
||||
|
||||
return vec3(da,da,da);
|
||||
}
|
||||
|
||||
vec4 getPosition(vec2 pos_screen)
|
||||
{
|
||||
float depth = texture2DRect(depthMap, pos_screen.xy).a;
|
||||
|
|
@ -72,14 +114,33 @@ void main()
|
|||
|
||||
vec4 diff= texture2D(diffuseMap,vary_texcoord0.xy);
|
||||
|
||||
vec4 col = vec4(vary_ambient + vary_directional.rgb, vertex_color.a);
|
||||
vec3 n = vary_norm;
|
||||
vec3 l = light_position[0].xyz;
|
||||
vec3 dlight = calcDirectionalLight(n, l);
|
||||
dlight = dlight * vary_directional.rgb * vary_pointlight_col;
|
||||
|
||||
vec4 col = vec4(vary_ambient + dlight, vertex_color.a);
|
||||
vec4 color = diff * col;
|
||||
|
||||
color.rgb = atmosLighting(color.rgb);
|
||||
|
||||
color.rgb = scaleSoftClip(color.rgb);
|
||||
vec3 light_col = vec3(0,0,0);
|
||||
|
||||
color.rgb += diff.rgb * vary_pointlight_col.rgb;
|
||||
#define LIGHT_LOOP(i) \
|
||||
light_col += light_diffuse[i].rgb * calcPointLightOrSpotLight(pos.xyz, vary_norm, light_position[i], light_direction[i], light_attenuation[i].x, light_attenuation[i].y, light_attenuation[i].z);
|
||||
|
||||
LIGHT_LOOP(1)
|
||||
LIGHT_LOOP(2)
|
||||
LIGHT_LOOP(3)
|
||||
LIGHT_LOOP(4)
|
||||
LIGHT_LOOP(5)
|
||||
LIGHT_LOOP(6)
|
||||
LIGHT_LOOP(7)
|
||||
|
||||
color.rgb += diff.rgb * vary_pointlight_col * light_col;
|
||||
|
||||
color.rgb = pow(color.rgb, vec3(1.0/2.2));
|
||||
|
||||
frag_color = color;
|
||||
//frag_color = vec4(1,0,1,1);
|
||||
|
|
|
|||
|
|
@ -46,6 +46,7 @@ VARYING vec3 vary_pointlight_col;
|
|||
VARYING vec4 vertex_color;
|
||||
VARYING vec2 vary_texcoord0;
|
||||
|
||||
VARYING vec3 vary_norm;
|
||||
|
||||
uniform float near_clip;
|
||||
|
||||
|
|
@ -104,7 +105,7 @@ void main()
|
|||
|
||||
norm = position.xyz + normal.xyz;
|
||||
norm = normalize(( trans*vec4(norm, 1.0) ).xyz-pos.xyz);
|
||||
|
||||
vary_norm = norm;
|
||||
vec4 frag_pos = projection_matrix * pos;
|
||||
gl_Position = frag_pos;
|
||||
|
||||
|
|
@ -112,27 +113,18 @@ void main()
|
|||
|
||||
calcAtmospherics(pos.xyz);
|
||||
|
||||
//vec4 color = calcLighting(pos.xyz, norm, diffuse_color, vec4(0.));
|
||||
vec4 col = vec4(0.0, 0.0, 0.0, diffuse_color.a);
|
||||
|
||||
// Collect normal lights
|
||||
col.rgb += light_diffuse[2].rgb*calcPointLightOrSpotLight(pos.xyz, norm, light_position[2], light_direction[2], light_attenuation[2].x, light_attenuation[2].y, light_attenuation[2].z);
|
||||
col.rgb += light_diffuse[3].rgb*calcPointLightOrSpotLight(pos.xyz, norm, light_position[3], light_direction[3], light_attenuation[3].x, light_attenuation[3].y, light_attenuation[3].z);
|
||||
col.rgb += light_diffuse[4].rgb*calcPointLightOrSpotLight(pos.xyz, norm, light_position[4], light_direction[4], light_attenuation[4].x, light_attenuation[4].y, light_attenuation[4].z);
|
||||
col.rgb += light_diffuse[5].rgb*calcPointLightOrSpotLight(pos.xyz, norm, light_position[5], light_direction[5], light_attenuation[5].x, light_attenuation[5].y, light_attenuation[5].z);
|
||||
col.rgb += light_diffuse[6].rgb*calcPointLightOrSpotLight(pos.xyz, norm, light_position[6], light_direction[6], light_attenuation[6].x, light_attenuation[6].y, light_attenuation[6].z);
|
||||
col.rgb += light_diffuse[7].rgb*calcPointLightOrSpotLight(pos.xyz, norm, light_position[7], light_direction[7], light_attenuation[7].x, light_attenuation[7].y, light_attenuation[7].z);
|
||||
|
||||
vary_pointlight_col = col.rgb*diffuse_color.rgb;
|
||||
|
||||
vary_pointlight_col = diffuse_color.rgb;
|
||||
col.rgb = vec3(0,0,0);
|
||||
|
||||
// Add windlight lights
|
||||
col.rgb = atmosAmbient(vec3(0.));
|
||||
|
||||
vary_ambient = col.rgb*diffuse_color.rgb;
|
||||
vary_directional = diffuse_color.rgb*atmosAffectDirectionalLight(max(calcDirectionalLight(norm, light_position[0].xyz), (1.0-diffuse_color.a)*(1.0-diffuse_color.a)));
|
||||
vary_directional.rgb = atmosAffectDirectionalLight(1);
|
||||
|
||||
col.rgb = min(col.rgb*diffuse_color.rgb, 1.0);
|
||||
col.rgb = col.rgb*diffuse_color.rgb;
|
||||
|
||||
vertex_color = col;
|
||||
|
||||
|
|
|
|||
|
|
@ -23,22 +23,41 @@
|
|||
* $/LicenseInfo$
|
||||
*/
|
||||
|
||||
#define INDEXED 1
|
||||
#define NON_INDEXED 2
|
||||
#define NON_INDEXED_NO_COLOR 3
|
||||
|
||||
uniform mat3 normal_matrix;
|
||||
uniform mat4 texture_matrix0;
|
||||
uniform mat4 projection_matrix;
|
||||
uniform mat4 modelview_matrix;
|
||||
uniform mat4 modelview_projection_matrix;
|
||||
|
||||
ATTRIBUTE vec3 position;
|
||||
|
||||
#ifdef USE_INDEXED_TEX
|
||||
void passTextureIndex();
|
||||
#endif
|
||||
|
||||
ATTRIBUTE vec3 normal;
|
||||
|
||||
#ifdef USE_VERTEX_COLOR
|
||||
ATTRIBUTE vec4 diffuse_color;
|
||||
#endif
|
||||
|
||||
ATTRIBUTE vec2 texcoord0;
|
||||
|
||||
#ifdef HAS_SKIN
|
||||
mat4 getObjectSkinnedTransform();
|
||||
#else
|
||||
#ifdef IS_AVATAR_SKIN
|
||||
mat4 getSkinnedTransform();
|
||||
#endif
|
||||
#endif
|
||||
|
||||
vec4 calcLighting(vec3 pos, vec3 norm, vec4 color, vec4 baseCol);
|
||||
void calcAtmospherics(vec3 inPositionEye);
|
||||
|
||||
float calcDirectionalLight(vec3 n, vec3 l);
|
||||
|
||||
vec3 atmosAmbient(vec3 light);
|
||||
vec3 atmosAffectDirectionalLight(float lightIntensity);
|
||||
vec3 scaleDownLight(vec3 light);
|
||||
|
|
@ -50,26 +69,24 @@ VARYING vec3 vary_fragcoord;
|
|||
VARYING vec3 vary_position;
|
||||
VARYING vec3 vary_pointlight_col;
|
||||
|
||||
#ifdef USE_VERTEX_COLOR
|
||||
VARYING vec4 vertex_color;
|
||||
#endif
|
||||
|
||||
VARYING vec2 vary_texcoord0;
|
||||
|
||||
VARYING vec3 vary_norm;
|
||||
|
||||
uniform float near_clip;
|
||||
uniform float shadow_offset;
|
||||
uniform float shadow_bias;
|
||||
|
||||
uniform vec4 light_position[8];
|
||||
uniform vec3 light_direction[8];
|
||||
uniform vec3 light_attenuation[8];
|
||||
uniform vec3 light_diffuse[8];
|
||||
|
||||
float calcDirectionalLight(vec3 n, vec3 l)
|
||||
{
|
||||
float a = max(dot(n,l),0.0);
|
||||
return a;
|
||||
}
|
||||
uniform vec3 sun_dir;
|
||||
|
||||
float calcPointLightOrSpotLight(vec3 v, vec3 n, vec4 lp, vec3 ln, float la, float fa, float is_pointlight)
|
||||
vec3 calcPointLightOrSpotLight(vec3 v, vec3 n, vec4 lp, vec3 ln, float la, float fa, float is_pointlight)
|
||||
{
|
||||
//get light vector
|
||||
vec3 lv = lp.xyz-v;
|
||||
|
|
@ -96,53 +113,110 @@ float calcPointLightOrSpotLight(vec3 v, vec3 n, vec4 lp, vec3 ln, float la, floa
|
|||
da *= max(dot(n, lv), 0.0);
|
||||
}
|
||||
|
||||
return da;
|
||||
return vec3(da,da,da);
|
||||
}
|
||||
|
||||
void main()
|
||||
{
|
||||
vec4 pos;
|
||||
vec3 norm;
|
||||
|
||||
//transform vertex
|
||||
#ifdef HAS_SKIN
|
||||
mat4 trans = getObjectSkinnedTransform();
|
||||
trans = modelview_matrix * trans;
|
||||
|
||||
pos = trans * vec4(position.xyz, 1.0);
|
||||
|
||||
norm = position.xyz + normal.xyz;
|
||||
norm = normalize((trans * vec4(norm, 1.0)).xyz - pos.xyz);
|
||||
vec4 frag_pos = projection_matrix * pos;
|
||||
gl_Position = frag_pos;
|
||||
#else
|
||||
|
||||
#ifdef IS_AVATAR_SKIN
|
||||
mat4 trans = getSkinnedTransform();
|
||||
vec4 pos_in = vec4(position.xyz, 1.0);
|
||||
pos.x = dot(trans[0], pos_in);
|
||||
pos.y = dot(trans[1], pos_in);
|
||||
pos.z = dot(trans[2], pos_in);
|
||||
pos.w = 1.0;
|
||||
|
||||
norm.x = dot(trans[0].xyz, normal);
|
||||
norm.y = dot(trans[1].xyz, normal);
|
||||
norm.z = dot(trans[2].xyz, normal);
|
||||
norm = normalize(norm);
|
||||
|
||||
vec4 frag_pos = projection_matrix * pos;
|
||||
gl_Position = frag_pos;
|
||||
#else
|
||||
norm = normalize(normal_matrix * normal);
|
||||
vec4 vert = vec4(position.xyz, 1.0);
|
||||
passTextureIndex();
|
||||
vec4 pos = (modelview_matrix * vert);
|
||||
pos = (modelview_matrix * vert);
|
||||
gl_Position = modelview_projection_matrix*vec4(position.xyz, 1.0);
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
#ifdef USE_INDEXED_TEX
|
||||
passTextureIndex();
|
||||
vary_texcoord0 = (texture_matrix0 * vec4(texcoord0,0,1)).xy;
|
||||
#else
|
||||
vary_texcoord0 = texcoord0;
|
||||
#endif
|
||||
|
||||
vec3 norm = normalize(normal_matrix * normal);
|
||||
|
||||
float dp_directional_light = max(0.0, dot(norm, light_position[0].xyz));
|
||||
vary_position = pos.xyz + light_position[0].xyz * (1.0-dp_directional_light)*shadow_offset;
|
||||
|
||||
vary_norm = norm;
|
||||
vary_position = pos.xyz;
|
||||
|
||||
calcAtmospherics(pos.xyz);
|
||||
|
||||
#ifndef USE_VERTEX_COLOR
|
||||
vec4 diffuse_color = vec4(1,1,1,1);
|
||||
#endif
|
||||
//vec4 color = calcLighting(pos.xyz, norm, diffuse_color, vec4(0.));
|
||||
vec4 col = vec4(0.0, 0.0, 0.0, diffuse_color.a);
|
||||
|
||||
// Collect normal lights
|
||||
col.rgb += light_diffuse[2].rgb*calcPointLightOrSpotLight(pos.xyz, norm, light_position[2], light_direction[2], light_attenuation[2].x, light_attenuation[2].y, light_attenuation[2].z);
|
||||
col.rgb += light_diffuse[3].rgb*calcPointLightOrSpotLight(pos.xyz, norm, light_position[3], light_direction[3], light_attenuation[3].x, light_attenuation[3].y, light_attenuation[3].z);
|
||||
col.rgb += light_diffuse[4].rgb*calcPointLightOrSpotLight(pos.xyz, norm, light_position[4], light_direction[4], light_attenuation[4].x, light_attenuation[4].y, light_attenuation[4].z);
|
||||
col.rgb += light_diffuse[5].rgb*calcPointLightOrSpotLight(pos.xyz, norm, light_position[5], light_direction[5], light_attenuation[5].x, light_attenuation[5].y, light_attenuation[5].z);
|
||||
col.rgb += light_diffuse[6].rgb*calcPointLightOrSpotLight(pos.xyz, norm, light_position[6], light_direction[6], light_attenuation[6].x, light_attenuation[6].y, light_attenuation[6].z);
|
||||
col.rgb += light_diffuse[7].rgb*calcPointLightOrSpotLight(pos.xyz, norm, light_position[7], light_direction[7], light_attenuation[7].x, light_attenuation[7].y, light_attenuation[7].z);
|
||||
|
||||
vary_pointlight_col = col.rgb*diffuse_color.rgb;
|
||||
vec3 diff = diffuse_color.rgb;
|
||||
|
||||
|
||||
|
||||
vary_pointlight_col = diff;
|
||||
|
||||
|
||||
col.rgb = vec3(0,0,0);
|
||||
|
||||
// Add windlight lights
|
||||
col.rgb = atmosAmbient(vec3(0.));
|
||||
col.rgb = atmosAmbient(col.rgb);
|
||||
|
||||
vary_ambient = col.rgb*diffuse_color.rgb;
|
||||
vary_directional.rgb = diffuse_color.rgb*atmosAffectDirectionalLight(max(calcDirectionalLight(norm, light_position[0].xyz), (1.0-diffuse_color.a)*(1.0-diffuse_color.a)));
|
||||
|
||||
col.rgb = col.rgb*diffuse_color.rgb;
|
||||
|
||||
vertex_color = col;
|
||||
float ambient = min(abs(dot(norm.xyz, sun_dir.xyz)), 1.0);
|
||||
ambient *= 0.5;
|
||||
ambient *= ambient;
|
||||
ambient = (1.0-ambient);
|
||||
|
||||
col.rgb *= ambient;
|
||||
|
||||
vary_ambient = col.rgb*diff.rgb;
|
||||
|
||||
vary_directional.rgb = atmosAffectDirectionalLight(1.0f);
|
||||
|
||||
col.rgb = col.rgb*diff.rgb;
|
||||
|
||||
#ifdef USE_VERTEX_COLOR
|
||||
vertex_color = col;
|
||||
#endif
|
||||
|
||||
#ifdef HAS_SKIN
|
||||
vary_fragcoord.xyz = frag_pos.xyz + vec3(0,0,near_clip);
|
||||
#else
|
||||
|
||||
#ifdef IS_AVATAR_SKIN
|
||||
vary_fragcoord.xyz = pos.xyz + vec3(0,0,near_clip);
|
||||
#else
|
||||
pos = modelview_projection_matrix * vert;
|
||||
vary_fragcoord.xyz = pos.xyz + vec3(0,0,near_clip);
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -39,7 +39,12 @@ void main()
|
|||
mat = modelview_matrix * mat;
|
||||
vec3 pos = (mat*vec4(position.xyz, 1.0)).xyz;
|
||||
|
||||
|
||||
vec4 p = projection_matrix * vec4(pos, 1.0);
|
||||
#if !DEPTH_CLAMP
|
||||
p.z = max(p.z, -p.w+0.01);
|
||||
gl_Position = p;
|
||||
#else
|
||||
gl_Position = p;
|
||||
#endif
|
||||
}
|
||||
|
|
|
|||
|
|
@ -47,6 +47,7 @@ VARYING vec3 vary_directional;
|
|||
VARYING vec3 vary_fragcoord;
|
||||
VARYING vec3 vary_pointlight_col;
|
||||
VARYING vec2 vary_texcoord0;
|
||||
VARYING vec3 vary_norm;
|
||||
|
||||
|
||||
uniform float near_clip;
|
||||
|
|
@ -112,6 +113,7 @@ void main()
|
|||
norm.y = dot(trans[1].xyz, normal);
|
||||
norm.z = dot(trans[2].xyz, normal);
|
||||
norm = normalize(norm);
|
||||
vary_norm = norm;
|
||||
|
||||
vec4 frag_pos = projection_matrix * pos;
|
||||
gl_Position = frag_pos;
|
||||
|
|
|
|||
|
|
@ -34,6 +34,12 @@ uniform sampler2D diffuseMap;
|
|||
VARYING vec3 vary_normal;
|
||||
VARYING vec2 vary_texcoord0;
|
||||
|
||||
vec2 encode_normal(vec3 n)
|
||||
{
|
||||
float f = sqrt(8 * n.z + 8);
|
||||
return n.xy / f + 0.5;
|
||||
}
|
||||
|
||||
void main()
|
||||
{
|
||||
vec4 diff = texture2D(diffuseMap, vary_texcoord0.xy);
|
||||
|
|
@ -46,6 +52,6 @@ void main()
|
|||
frag_data[0] = vec4(diff.rgb, 0.0);
|
||||
frag_data[1] = vec4(0,0,0,0);
|
||||
vec3 nvn = normalize(vary_normal);
|
||||
frag_data[2] = vec4(nvn.xyz * 0.5 + 0.5, 0.0);
|
||||
frag_data[2] = vec4(encode_normal(nvn.xyz), 0.0, 0.0);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -31,12 +31,16 @@ out vec4 frag_color;
|
|||
|
||||
uniform sampler2D diffuseMap;
|
||||
|
||||
#if !DEPTH_CLAMP
|
||||
VARYING vec4 post_pos;
|
||||
#endif
|
||||
|
||||
void main()
|
||||
{
|
||||
frag_color = vec4(1,1,1,1);
|
||||
|
||||
#if !DEPTH_CLAMP
|
||||
gl_FragDepth = max(post_pos.z/post_pos.w*0.5+0.5, 0.0);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -31,7 +31,9 @@ ATTRIBUTE vec3 position;
|
|||
ATTRIBUTE vec3 normal;
|
||||
ATTRIBUTE vec2 texcoord0;
|
||||
|
||||
#if !DEPTH_CLAMP
|
||||
VARYING vec4 post_pos;
|
||||
#endif
|
||||
|
||||
void main()
|
||||
{
|
||||
|
|
@ -51,9 +53,13 @@ void main()
|
|||
norm = normalize(norm);
|
||||
|
||||
pos = projection_matrix * pos;
|
||||
#if !DEPTH_CLAMP
|
||||
post_pos = pos;
|
||||
|
||||
gl_Position = vec4(pos.x, pos.y, pos.w*0.5, pos.w);
|
||||
#else
|
||||
gl_Position = pos;
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -46,11 +46,6 @@ VARYING vec2 vary_fragcoord;
|
|||
uniform mat4 inv_proj;
|
||||
uniform vec2 screen_res;
|
||||
|
||||
vec3 getKern(int i)
|
||||
{
|
||||
return kern[i];
|
||||
}
|
||||
|
||||
vec4 getPosition(vec2 pos_screen)
|
||||
{
|
||||
float depth = texture2DRect(depthMap, pos_screen.xy).r;
|
||||
|
|
@ -64,18 +59,53 @@ vec4 getPosition(vec2 pos_screen)
|
|||
return pos;
|
||||
}
|
||||
|
||||
#ifdef SINGLE_FP_ONLY
|
||||
vec2 encode_normal(vec3 n)
|
||||
{
|
||||
vec2 sn;
|
||||
sn.xy = (n.xy * vec2(0.5f,0.5f)) + vec2(0.5f,0.5f);
|
||||
return sn;
|
||||
}
|
||||
|
||||
vec3 decode_normal (vec2 enc)
|
||||
{
|
||||
vec3 n;
|
||||
n.xy = (enc.xy * vec2(2.0f,2.0f)) - vec2(1.0f,1.0f);
|
||||
n.z = sqrt(1.0f - dot(n.xy,n.xy));
|
||||
return n;
|
||||
}
|
||||
#else
|
||||
vec2 encode_normal(vec3 n)
|
||||
{
|
||||
float f = sqrt(8 * n.z + 8);
|
||||
return n.xy / f + 0.5;
|
||||
}
|
||||
|
||||
vec3 decode_normal (vec2 enc)
|
||||
{
|
||||
vec2 fenc = enc*4-2;
|
||||
float f = dot(fenc,fenc);
|
||||
float g = sqrt(1-f/4);
|
||||
vec3 n;
|
||||
n.xy = fenc*g;
|
||||
n.z = 1-f/2;
|
||||
return n;
|
||||
}
|
||||
#endif
|
||||
|
||||
void main()
|
||||
{
|
||||
vec2 tc = vary_fragcoord.xy;
|
||||
vec3 norm = texture2DRect(normalMap, tc).xyz;
|
||||
norm = vec3((norm.xy-0.5)*2.0,norm.z); // unpack norm
|
||||
norm = decode_normal(norm.xy); // unpack norm
|
||||
|
||||
vec3 pos = getPosition(tc).xyz;
|
||||
vec4 ccol = texture2DRect(lightMap, tc).rgba;
|
||||
|
||||
vec2 dlt = kern_scale * delta / (1.0+norm.xy*norm.xy);
|
||||
dlt /= max(-pos.z*dist_factor, 1.0);
|
||||
|
||||
vec2 defined_weight = getKern(0).xy; // special case the first (centre) sample's weight in the blur; we have to sample it anyway so we get it for 'free'
|
||||
vec2 defined_weight = kern[0].xy; // special case the first (centre) sample's weight in the blur; we have to sample it anyway so we get it for 'free'
|
||||
vec4 col = defined_weight.xyxx * ccol;
|
||||
|
||||
// relax tolerance according to distance to avoid speckling artifacts, as angles and distances are a lot more abrupt within a small screen area at larger distances
|
||||
|
|
@ -85,28 +115,33 @@ void main()
|
|||
float tc_mod = 0.5*(tc.x + tc.y); // mod(tc.x+tc.y,2)
|
||||
tc_mod -= floor(tc_mod);
|
||||
tc_mod *= 2.0;
|
||||
tc += ( (tc_mod - 0.5) * getKern(1).z * dlt * 0.5 );
|
||||
tc += ( (tc_mod - 0.5) * kern[1].z * dlt * 0.5 );
|
||||
|
||||
for (int i = 1; i < 4; i++)
|
||||
{
|
||||
vec2 samptc = tc + getKern(i).z*dlt;
|
||||
vec3 samppos = getPosition(samptc).xyz;
|
||||
vec2 samptc = tc + kern[i].z*dlt;
|
||||
vec3 samppos = getPosition(samptc).xyz;
|
||||
|
||||
float d = dot(norm.xyz, samppos.xyz-pos.xyz);// dist from plane
|
||||
|
||||
if (d*d <= pointplanedist_tolerance_pow2)
|
||||
{
|
||||
col += texture2DRect(lightMap, samptc)*getKern(i).xyxx;
|
||||
defined_weight += getKern(i).xy;
|
||||
col += texture2DRect(lightMap, samptc)*kern[i].xyxx;
|
||||
defined_weight += kern[i].xy;
|
||||
}
|
||||
}
|
||||
|
||||
for (int i = 1; i < 4; i++)
|
||||
{
|
||||
vec2 samptc = tc - getKern(i).z*dlt;
|
||||
vec3 samppos = getPosition(samptc).xyz;
|
||||
vec2 samptc = tc - kern[i].z*dlt;
|
||||
vec3 samppos = getPosition(samptc).xyz;
|
||||
|
||||
float d = dot(norm.xyz, samppos.xyz-pos.xyz);// dist from plane
|
||||
|
||||
if (d*d <= pointplanedist_tolerance_pow2)
|
||||
{
|
||||
col += texture2DRect(lightMap, samptc)*getKern(i).xyxx;
|
||||
defined_weight += getKern(i).xy;
|
||||
col += texture2DRect(lightMap, samptc)*kern[i].xyxx;
|
||||
defined_weight += kern[i].xy;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -39,6 +39,12 @@ VARYING vec3 vary_mat2;
|
|||
VARYING vec4 vertex_color;
|
||||
VARYING vec2 vary_texcoord0;
|
||||
|
||||
vec2 encode_normal(vec3 n)
|
||||
{
|
||||
float f = sqrt(8 * n.z + 8);
|
||||
return n.xy / f + 0.5;
|
||||
}
|
||||
|
||||
void main()
|
||||
{
|
||||
vec3 col = vertex_color.rgb * texture2D(diffuseMap, vary_texcoord0.xy).rgb;
|
||||
|
|
@ -52,5 +58,5 @@ void main()
|
|||
frag_data[1] = vertex_color.aaaa; // spec
|
||||
//frag_data[1] = vec4(vec3(vertex_color.a), vertex_color.a+(1.0-vertex_color.a)*vertex_color.a); // spec - from former class3 - maybe better, but not so well tested
|
||||
vec3 nvn = normalize(tnorm);
|
||||
frag_data[2] = vec4(nvn.xyz * 0.5 + 0.5, 0.0);
|
||||
frag_data[2] = vec4(encode_normal(nvn.xyz), vertex_color.a, 0.0);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -30,7 +30,7 @@ ATTRIBUTE vec3 position;
|
|||
ATTRIBUTE vec4 diffuse_color;
|
||||
ATTRIBUTE vec3 normal;
|
||||
ATTRIBUTE vec2 texcoord0;
|
||||
ATTRIBUTE vec3 binormal;
|
||||
ATTRIBUTE vec4 tangent;
|
||||
|
||||
VARYING vec3 vary_mat0;
|
||||
VARYING vec3 vary_mat1;
|
||||
|
|
@ -52,8 +52,8 @@ void main()
|
|||
|
||||
|
||||
vec3 n = normalize((mat * vec4(normal.xyz+position.xyz, 1.0)).xyz-pos.xyz);
|
||||
vec3 b = normalize((mat * vec4(binormal.xyz+position.xyz, 1.0)).xyz-pos.xyz);
|
||||
vec3 t = cross(b, n);
|
||||
vec3 t = normalize((mat * vec4(tangent.xyz+position.xyz, 1.0)).xyz-pos.xyz);
|
||||
vec3 b = cross(n, t) * tangent.w;
|
||||
|
||||
vary_mat0 = vec3(t.x, b.x, n.x);
|
||||
vary_mat1 = vec3(t.y, b.y, n.y);
|
||||
|
|
|
|||
|
|
@ -31,7 +31,7 @@ ATTRIBUTE vec3 position;
|
|||
ATTRIBUTE vec4 diffuse_color;
|
||||
ATTRIBUTE vec3 normal;
|
||||
ATTRIBUTE vec2 texcoord0;
|
||||
ATTRIBUTE vec3 binormal;
|
||||
ATTRIBUTE vec4 tangent;
|
||||
|
||||
VARYING vec3 vary_mat0;
|
||||
VARYING vec3 vary_mat1;
|
||||
|
|
@ -46,8 +46,8 @@ void main()
|
|||
vary_texcoord0 = (texture_matrix0 * vec4(texcoord0,0,1)).xy;
|
||||
|
||||
vec3 n = normalize(normal_matrix * normal);
|
||||
vec3 b = normalize(normal_matrix * binormal);
|
||||
vec3 t = cross(b, n);
|
||||
vec3 t = normalize(normal_matrix * tangent.xyz);
|
||||
vec3 b = cross(n, t) * tangent.w;
|
||||
|
||||
vary_mat0 = vec3(t.x, b.x, n.x);
|
||||
vary_mat1 = vec3(t.y, b.y, n.y);
|
||||
|
|
|
|||
|
|
@ -37,6 +37,12 @@ VARYING vec3 vary_normal;
|
|||
VARYING vec4 vertex_color;
|
||||
VARYING vec2 vary_texcoord0;
|
||||
|
||||
vec2 encode_normal(vec3 n)
|
||||
{
|
||||
float f = sqrt(8 * n.z + 8);
|
||||
return n.xy / f + 0.5;
|
||||
}
|
||||
|
||||
void main()
|
||||
{
|
||||
vec4 col = texture2D(diffuseMap, vary_texcoord0.xy) * vertex_color;
|
||||
|
|
@ -49,6 +55,6 @@ void main()
|
|||
frag_data[0] = vec4(col.rgb, 0.0);
|
||||
frag_data[1] = vec4(0,0,0,0); // spec
|
||||
vec3 nvn = normalize(vary_normal);
|
||||
frag_data[2] = vec4(nvn.xyz * 0.5 + 0.5, 0.0);
|
||||
frag_data[2] = vec4(encode_normal(nvn.xyz), 0.0, 0.0);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -36,6 +36,12 @@ uniform float minimum_alpha;
|
|||
VARYING vec4 vertex_color;
|
||||
VARYING vec2 vary_texcoord0;
|
||||
|
||||
vec2 encode_normal(vec3 n)
|
||||
{
|
||||
float f = sqrt(8 * n.z + 8);
|
||||
return n.xy / f + 0.5;
|
||||
}
|
||||
|
||||
void main()
|
||||
{
|
||||
vec4 col = diffuseLookup(vary_texcoord0.xy) * vertex_color;
|
||||
|
|
@ -48,5 +54,5 @@ void main()
|
|||
frag_data[0] = vec4(col.rgb, 0.0);
|
||||
frag_data[1] = vec4(0,0,0,0);
|
||||
vec3 nvn = normalize(vary_normal);
|
||||
frag_data[2] = vec4(nvn.xyz * 0.5 + 0.5, 0.0);
|
||||
frag_data[2] = vec4(encode_normal(nvn.xyz), 0.0, 0.0);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -37,6 +37,12 @@ uniform sampler2D diffuseMap;
|
|||
VARYING vec3 vary_normal;
|
||||
VARYING vec2 vary_texcoord0;
|
||||
|
||||
vec2 encode_normal(vec3 n)
|
||||
{
|
||||
float f = sqrt(8 * n.z + 8);
|
||||
return n.xy / f + 0.5;
|
||||
}
|
||||
|
||||
void main()
|
||||
{
|
||||
vec4 col = texture2D(diffuseMap, vary_texcoord0.xy);
|
||||
|
|
@ -49,6 +55,6 @@ void main()
|
|||
frag_data[0] = vec4(col.rgb, 0.0);
|
||||
frag_data[1] = vec4(0,0,0,0); // spec
|
||||
vec3 nvn = normalize(vary_normal);
|
||||
frag_data[2] = vec4(nvn.xyz * 0.5 + 0.5, 0.0);
|
||||
frag_data[2] = vec4(encode_normal(nvn.xyz), 0.0, 0.0);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -35,6 +35,12 @@ VARYING vec3 vary_normal;
|
|||
VARYING vec4 vertex_color;
|
||||
VARYING vec2 vary_texcoord0;
|
||||
|
||||
vec2 encode_normal(vec3 n)
|
||||
{
|
||||
float f = sqrt(8 * n.z + 8);
|
||||
return n.xy / f + 0.5;
|
||||
}
|
||||
|
||||
void main()
|
||||
{
|
||||
vec3 col = vertex_color.rgb * texture2D(diffuseMap, vary_texcoord0.xy).rgb;
|
||||
|
|
@ -42,6 +48,6 @@ void main()
|
|||
frag_data[1] = vertex_color.aaaa; // spec
|
||||
//frag_data[1] = vec4(vec3(vertex_color.a), vertex_color.a+(1.0-vertex_color.a)*vertex_color.a); // spec - from former class3 - maybe better, but not so well tested
|
||||
vec3 nvn = normalize(vary_normal);
|
||||
frag_data[2] = vec4(nvn.xyz * 0.5 + 0.5, 0.0);
|
||||
frag_data[2] = vec4(encode_normal(nvn.xyz), vertex_color.a, 0.0);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -33,13 +33,22 @@ VARYING vec3 vary_normal;
|
|||
VARYING vec4 vertex_color;
|
||||
VARYING vec2 vary_texcoord0;
|
||||
|
||||
vec2 encode_normal(vec3 n)
|
||||
{
|
||||
float f = sqrt(8 * n.z + 8);
|
||||
return n.xy / f + 0.5;
|
||||
}
|
||||
|
||||
|
||||
void main()
|
||||
{
|
||||
vec3 col = vertex_color.rgb * diffuseLookup(vary_texcoord0.xy).rgb;
|
||||
|
||||
vec3 spec;
|
||||
spec.rgb = vec3(vertex_color.a);
|
||||
|
||||
frag_data[0] = vec4(col, 0.0);
|
||||
frag_data[1] = vertex_color.aaaa; // spec
|
||||
//frag_data[1] = vec4(vec3(vertex_color.a), vertex_color.a+(1.0-vertex_color.a)*vertex_color.a); // spec - from former class3 - maybe better, but not so well tested
|
||||
frag_data[1] = vec4(spec, vertex_color.a); // spec
|
||||
vec3 nvn = normalize(vary_normal);
|
||||
frag_data[2] = vec4(nvn.xyz * 0.5 + 0.5, 0.0);
|
||||
frag_data[2] = vec4(encode_normal(nvn.xyz), vertex_color.a, 0.0);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -47,6 +47,6 @@ void main()
|
|||
|
||||
passTextureIndex();
|
||||
vary_normal = normalize(normal_matrix * normal);
|
||||
|
||||
|
||||
vertex_color = diffuse_color;
|
||||
}
|
||||
|
|
|
|||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue