mathMatrixTest.cpp 40 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075
  1. #include "testing/unitTesting.h"
  2. #include "platform/platform.h"
  3. #include "console/simBase.h"
  4. #include "console/consoleTypes.h"
  5. #include "console/scriptObjects.h"
  6. #include "console/simBase.h"
  7. #include "console/engineAPI.h"
  8. #include "math/mMath.h"
  9. #include "math/util/frustum.h"
  10. #include "math/mathUtils.h"
  11. TEST(MatrixTest, TestIdentityInit)
  12. {
  13. MatrixF test(true);
  14. EXPECT_NEAR(test(0, 0), 1.0f, 0.001f);
  15. EXPECT_NEAR(test(1, 1), 1.0f, 0.001f);
  16. EXPECT_NEAR(test(2, 2), 1.0f, 0.001f);
  17. EXPECT_NEAR(test(3, 3), 1.0f, 0.001f);
  18. }
  19. TEST(MatrixTest, TestIdentitySet)
  20. {
  21. MatrixF test(false);
  22. test.identity();
  23. EXPECT_NEAR(test(0, 0), 1.0f, 0.001f);
  24. EXPECT_NEAR(test(1, 1), 1.0f, 0.001f);
  25. EXPECT_NEAR(test(2, 2), 1.0f, 0.001f);
  26. EXPECT_NEAR(test(3, 3), 1.0f, 0.001f);
  27. }
  28. TEST(MatrixTest, TestIsIdentity)
  29. {
  30. MatrixF test(true);
  31. EXPECT_TRUE(test.isIdentity());
  32. }
  33. TEST(MatrixTest, TestEulerInit)
  34. {
  35. MatrixF test(EulerF(1.0f, 0.0f, 1.0f));
  36. EXPECT_NEAR(test(0, 0), 0.5403f, 0.001f); EXPECT_NEAR(test(0, 1), 0.8415f, 0.001f); EXPECT_NEAR(test(0, 2), 0.0f, 0.001f); EXPECT_NEAR(test(0, 3), 0.0f, 0.001f);
  37. EXPECT_NEAR(test(1, 0), -0.4546f, 0.001f); EXPECT_NEAR(test(1, 1), 0.2919f, 0.001f); EXPECT_NEAR(test(1, 2), 0.8415f, 0.001f); EXPECT_NEAR(test(1, 3), 0.0f, 0.001f);
  38. EXPECT_NEAR(test(2, 0), 0.7081f, 0.001f); EXPECT_NEAR(test(2, 1), -0.4546f, 0.001f); EXPECT_NEAR(test(2, 2), 0.5403f, 0.001f); EXPECT_NEAR(test(2, 3), 0.0f, 0.001f);
  39. EXPECT_NEAR(test(3, 0), 0.0f, 0.001f); EXPECT_NEAR(test(3, 1), 0.0f, 0.001f); EXPECT_NEAR(test(3, 2), 0.0f, 0.001f); EXPECT_NEAR(test(3, 3), 1.0f, 0.001f);
  40. }
  41. TEST(MatrixTest, TestEulerSet)
  42. {
  43. MatrixF test(true);
  44. test.set(EulerF(1.0f, 0.0f, 1.0f));
  45. EXPECT_NEAR(test(0, 0), 0.5403f, 0.001f); EXPECT_NEAR(test(0, 1), 0.8415f, 0.001f); EXPECT_NEAR(test(0, 2), 0.0f, 0.001f); EXPECT_NEAR(test(0, 3), 0.0f, 0.001f);
  46. EXPECT_NEAR(test(1, 0), -0.4546f, 0.001f); EXPECT_NEAR(test(1, 1), 0.2919f, 0.001f); EXPECT_NEAR(test(1, 2), 0.8415f, 0.001f); EXPECT_NEAR(test(1, 3), 0.0f, 0.001f);
  47. EXPECT_NEAR(test(2, 0), 0.7081f, 0.001f); EXPECT_NEAR(test(2, 1), -0.4546f, 0.001f); EXPECT_NEAR(test(2, 2), 0.5403f, 0.001f); EXPECT_NEAR(test(2, 3), 0.0f, 0.001f);
  48. EXPECT_NEAR(test(3, 0), 0.0f, 0.001f); EXPECT_NEAR(test(3, 1), 0.0f, 0.001f); EXPECT_NEAR(test(3, 2), 0.0f, 0.001f); EXPECT_NEAR(test(3, 3), 1.0f, 0.001f);
  49. }
  50. TEST(MatrixTest, TestToEuler)
  51. {
  52. MatrixF test(true);
  53. test.set(EulerF(1.0f, 0.0f, 1.0f));
  54. EulerF euler = test.toEuler();
  55. EXPECT_NEAR(euler.x, 1.0f, 0.001f); EXPECT_NEAR(euler.y, 0.0f, 0.001f); EXPECT_NEAR(euler.z, 1.0f, 0.001f);
  56. }
  57. TEST(MatrixTest, TestEulerPointInit)
  58. {
  59. MatrixF test(EulerF(1.0f, 0.0f, 1.0f), Point3F(5.0f, 0.0f, 1.0f));
  60. EXPECT_NEAR(test(0, 0), 0.5403f, 0.001f); EXPECT_NEAR(test(0, 1), 0.8415f, 0.001f); EXPECT_NEAR(test(0, 2), 0.0f, 0.001f); EXPECT_NEAR(test(0, 3), 5.0f, 0.001f);
  61. EXPECT_NEAR(test(1, 0), -0.4546f, 0.001f); EXPECT_NEAR(test(1, 1), 0.2919f, 0.001f); EXPECT_NEAR(test(1, 2), 0.8415f, 0.001f); EXPECT_NEAR(test(1, 3), 0.0f, 0.001f);
  62. EXPECT_NEAR(test(2, 0), 0.7081f, 0.001f); EXPECT_NEAR(test(2, 1), -0.4546f, 0.001f); EXPECT_NEAR(test(2, 2), 0.5403f, 0.001f); EXPECT_NEAR(test(2, 3), 1.0f, 0.001f);
  63. EXPECT_NEAR(test(3, 0), 0.0f, 0.001f); EXPECT_NEAR(test(3, 1), 0.0f, 0.001f); EXPECT_NEAR(test(3, 2), 0.0f, 0.001f); EXPECT_NEAR(test(3, 3), 1.0f, 0.001f);
  64. }
  65. TEST(MatrixTest, TestEulerPointSet)
  66. {
  67. MatrixF test(true);
  68. test.set(EulerF(1.0f, 0.0f, 1.0f), Point3F(5.0f, 0.0f, 1.0f));
  69. EXPECT_NEAR(test(0, 0), 0.5403f, 0.001f); EXPECT_NEAR(test(0, 1), 0.8415f, 0.001f); EXPECT_NEAR(test(0, 2), 0.0f, 0.001f); EXPECT_NEAR(test(0, 3), 5.0f, 0.001f);
  70. EXPECT_NEAR(test(1, 0), -0.4546f, 0.001f); EXPECT_NEAR(test(1, 1), 0.2919f, 0.001f); EXPECT_NEAR(test(1, 2), 0.8415f, 0.001f); EXPECT_NEAR(test(1, 3), 0.0f, 0.001f);
  71. EXPECT_NEAR(test(2, 0), 0.7081f, 0.001f); EXPECT_NEAR(test(2, 1), -0.4546f, 0.001f); EXPECT_NEAR(test(2, 2), 0.5403f, 0.001f); EXPECT_NEAR(test(2, 3), 1.0f, 0.001f);
  72. EXPECT_NEAR(test(3, 0), 0.0f, 0.001f); EXPECT_NEAR(test(3, 1), 0.0f, 0.001f); EXPECT_NEAR(test(3, 2), 0.0f, 0.001f); EXPECT_NEAR(test(3, 3), 1.0f, 0.001f);
  73. }
  74. TEST(MatrixTest, TestGetColumn4)
  75. {
  76. MatrixF test(true);
  77. test.set(EulerF(1.0f, 0.0f, 1.0f), Point3F(5.0f, 0.0f, 1.0f));
  78. Point4F column;
  79. test.getColumn(0, &column);
  80. EXPECT_NEAR(column.x, test(0, 0), 0.001f);
  81. EXPECT_NEAR(column.y, test(1, 0), 0.001f);
  82. EXPECT_NEAR(column.z, test(2, 0), 0.001f);
  83. EXPECT_NEAR(column.w, test(3, 0), 0.001f);
  84. test.getColumn(1, &column);
  85. EXPECT_NEAR(column.x, test(0, 1), 0.001f);
  86. EXPECT_NEAR(column.y, test(1, 1), 0.001f);
  87. EXPECT_NEAR(column.z, test(2, 1), 0.001f);
  88. EXPECT_NEAR(column.w, test(3, 1), 0.001f);
  89. test.getColumn(2, &column);
  90. EXPECT_NEAR(column.x, test(0, 2), 0.001f);
  91. EXPECT_NEAR(column.y, test(1, 2), 0.001f);
  92. EXPECT_NEAR(column.z, test(2, 2), 0.001f);
  93. EXPECT_NEAR(column.w, test(3, 2), 0.001f);
  94. test.getColumn(3, &column);
  95. EXPECT_NEAR(column.x, test(0, 3), 0.001f);
  96. EXPECT_NEAR(column.y, test(1, 3), 0.001f);
  97. EXPECT_NEAR(column.z, test(2, 3), 0.001f);
  98. EXPECT_NEAR(column.w, test(3, 3), 0.001f);
  99. }
  100. TEST(MatrixTest, TestGetRow4)
  101. {
  102. MatrixF test(true);
  103. test.set(EulerF(1.0f, 0.0f, 1.0f), Point3F(5.0f, 0.0f, 1.0f));
  104. Point4F column;
  105. test.getRow(0, &column);
  106. EXPECT_NEAR(column.x, test(0, 0), 0.001f);
  107. EXPECT_NEAR(column.y, test(0, 1), 0.001f);
  108. EXPECT_NEAR(column.z, test(0, 2), 0.001f);
  109. EXPECT_NEAR(column.w, test(0, 3), 0.001f);
  110. test.getRow(1, &column);
  111. EXPECT_NEAR(column.x, test(1, 0), 0.001f);
  112. EXPECT_NEAR(column.y, test(1, 1), 0.001f);
  113. EXPECT_NEAR(column.z, test(1, 2), 0.001f);
  114. EXPECT_NEAR(column.w, test(1, 3), 0.001f);
  115. test.getRow(2, &column);
  116. EXPECT_NEAR(column.x, test(2, 0), 0.001f);
  117. EXPECT_NEAR(column.y, test(2, 1), 0.001f);
  118. EXPECT_NEAR(column.z, test(2, 2), 0.001f);
  119. EXPECT_NEAR(column.w, test(2, 3), 0.001f);
  120. test.getRow(3, &column);
  121. EXPECT_NEAR(column.x, test(3, 0), 0.001f);
  122. EXPECT_NEAR(column.y, test(3, 1), 0.001f);
  123. EXPECT_NEAR(column.z, test(3, 2), 0.001f);
  124. EXPECT_NEAR(column.w, test(3, 3), 0.001f);
  125. }
  126. TEST(MatrixTest, TestGetColumn3)
  127. {
  128. MatrixF test(true);
  129. test.set(EulerF(1.0f, 0.0f, 1.0f), Point3F(5.0f, 0.0f, 1.0f));
  130. Point3F column;
  131. test.getColumn(0, &column);
  132. EXPECT_NEAR(column.x, test(0, 0), 0.001f);
  133. EXPECT_NEAR(column.y, test(1, 0), 0.001f);
  134. EXPECT_NEAR(column.z, test(2, 0), 0.001f);
  135. test.getColumn(1, &column);
  136. EXPECT_NEAR(column.x, test(0, 1), 0.001f);
  137. EXPECT_NEAR(column.y, test(1, 1), 0.001f);
  138. EXPECT_NEAR(column.z, test(2, 1), 0.001f);
  139. test.getColumn(2, &column);
  140. EXPECT_NEAR(column.x, test(0, 2), 0.001f);
  141. EXPECT_NEAR(column.y, test(1, 2), 0.001f);
  142. EXPECT_NEAR(column.z, test(2, 2), 0.001f);
  143. test.getColumn(3, &column);
  144. EXPECT_NEAR(column.x, test(0, 3), 0.001f);
  145. EXPECT_NEAR(column.y, test(1, 3), 0.001f);
  146. EXPECT_NEAR(column.z, test(2, 3), 0.001f);
  147. }
  148. TEST(MatrixTest, TestGetRow3)
  149. {
  150. MatrixF test(true);
  151. test.set(EulerF(1.0f, 0.0f, 1.0f), Point3F(5.0f, 0.0f, 1.0f));
  152. Point3F column;
  153. test.getRow(0, &column);
  154. EXPECT_NEAR(column.x, test(0, 0), 0.001f);
  155. EXPECT_NEAR(column.y, test(0, 1), 0.001f);
  156. EXPECT_NEAR(column.z, test(0, 2), 0.001f);
  157. test.getRow(1, &column);
  158. EXPECT_NEAR(column.x, test(1, 0), 0.001f);
  159. EXPECT_NEAR(column.y, test(1, 1), 0.001f);
  160. EXPECT_NEAR(column.z, test(1, 2), 0.001f);
  161. test.getRow(2, &column);
  162. EXPECT_NEAR(column.x, test(2, 0), 0.001f);
  163. EXPECT_NEAR(column.y, test(2, 1), 0.001f);
  164. EXPECT_NEAR(column.z, test(2, 2), 0.001f);
  165. test.getRow(3, &column);
  166. EXPECT_NEAR(column.x, test(3, 0), 0.001f);
  167. EXPECT_NEAR(column.y, test(3, 1), 0.001f);
  168. EXPECT_NEAR(column.z, test(3, 2), 0.001f);
  169. }
  170. TEST(MatrixTest, TestGetColumn4F)
  171. {
  172. MatrixF test(true);
  173. test.set(EulerF(1.0f, 0.0f, 1.0f), Point3F(5.0f, 0.0f, 1.0f));
  174. Point4F column;
  175. column = test.getColumn4F(0);
  176. EXPECT_NEAR(column.x, test(0, 0), 0.001f);
  177. EXPECT_NEAR(column.y, test(1, 0), 0.001f);
  178. EXPECT_NEAR(column.z, test(2, 0), 0.001f);
  179. EXPECT_NEAR(column.w, test(3, 0), 0.001f);
  180. column = test.getColumn4F(1);
  181. EXPECT_NEAR(column.x, test(0, 1), 0.001f);
  182. EXPECT_NEAR(column.y, test(1, 1), 0.001f);
  183. EXPECT_NEAR(column.z, test(2, 1), 0.001f);
  184. EXPECT_NEAR(column.w, test(3, 1), 0.001f);
  185. column = test.getColumn4F(2);
  186. EXPECT_NEAR(column.x, test(0, 2), 0.001f);
  187. EXPECT_NEAR(column.y, test(1, 2), 0.001f);
  188. EXPECT_NEAR(column.z, test(2, 2), 0.001f);
  189. EXPECT_NEAR(column.w, test(3, 2), 0.001f);
  190. column = test.getColumn4F(3);
  191. EXPECT_NEAR(column.x, test(0, 3), 0.001f);
  192. EXPECT_NEAR(column.y, test(1, 3), 0.001f);
  193. EXPECT_NEAR(column.z, test(2, 3), 0.001f);
  194. EXPECT_NEAR(column.w, test(3, 3), 0.001f);
  195. }
  196. TEST(MatrixTest, TestGetRow4F)
  197. {
  198. MatrixF test(true);
  199. test.set(EulerF(1.0f, 0.0f, 1.0f), Point3F(5.0f, 0.0f, 1.0f));
  200. Point4F column;
  201. column = test.getRow4F(0);
  202. EXPECT_NEAR(column.x, test(0, 0), 0.001f);
  203. EXPECT_NEAR(column.y, test(0, 1), 0.001f);
  204. EXPECT_NEAR(column.z, test(0, 2), 0.001f);
  205. EXPECT_NEAR(column.w, test(0, 3), 0.001f);
  206. column = test.getRow4F(1);
  207. EXPECT_NEAR(column.x, test(1, 0), 0.001f);
  208. EXPECT_NEAR(column.y, test(1, 1), 0.001f);
  209. EXPECT_NEAR(column.z, test(1, 2), 0.001f);
  210. EXPECT_NEAR(column.w, test(1, 3), 0.001f);
  211. column = test.getRow4F(2);
  212. EXPECT_NEAR(column.x, test(2, 0), 0.001f);
  213. EXPECT_NEAR(column.y, test(2, 1), 0.001f);
  214. EXPECT_NEAR(column.z, test(2, 2), 0.001f);
  215. EXPECT_NEAR(column.w, test(2, 3), 0.001f);
  216. column = test.getRow4F(3);
  217. EXPECT_NEAR(column.x, test(3, 0), 0.001f);
  218. EXPECT_NEAR(column.y, test(3, 1), 0.001f);
  219. EXPECT_NEAR(column.z, test(3, 2), 0.001f);
  220. EXPECT_NEAR(column.w, test(3, 3), 0.001f);
  221. }
  222. TEST(MatrixTest, TestGetColumn3F)
  223. {
  224. MatrixF test(true);
  225. test.set(EulerF(1.0f, 0.0f, 1.0f), Point3F(5.0f, 0.0f, 1.0f));
  226. Point3F column;
  227. column = test.getColumn3F(0);
  228. EXPECT_NEAR(column.x, test(0, 0), 0.001f);
  229. EXPECT_NEAR(column.y, test(1, 0), 0.001f);
  230. EXPECT_NEAR(column.z, test(2, 0), 0.001f);
  231. column = test.getColumn3F(1);
  232. EXPECT_NEAR(column.x, test(0, 1), 0.001f);
  233. EXPECT_NEAR(column.y, test(1, 1), 0.001f);
  234. EXPECT_NEAR(column.z, test(2, 1), 0.001f);
  235. column = test.getColumn3F(2);
  236. EXPECT_NEAR(column.x, test(0, 2), 0.001f);
  237. EXPECT_NEAR(column.y, test(1, 2), 0.001f);
  238. EXPECT_NEAR(column.z, test(2, 2), 0.001f);
  239. column = test.getColumn3F(3);
  240. EXPECT_NEAR(column.x, test(0, 3), 0.001f);
  241. EXPECT_NEAR(column.y, test(1, 3), 0.001f);
  242. EXPECT_NEAR(column.z, test(2, 3), 0.001f);
  243. }
  244. TEST(MatrixTest, TestGetRow3F)
  245. {
  246. MatrixF test(true);
  247. test.set(EulerF(1.0f, 0.0f, 1.0f), Point3F(5.0f, 0.0f, 1.0f));
  248. Point3F column;
  249. column = test.getRow3F(0);
  250. EXPECT_NEAR(column.x, test(0, 0), 0.001f);
  251. EXPECT_NEAR(column.y, test(0, 1), 0.001f);
  252. EXPECT_NEAR(column.z, test(0, 2), 0.001f);
  253. column = test.getRow3F(1);
  254. EXPECT_NEAR(column.x, test(1, 0), 0.001f);
  255. EXPECT_NEAR(column.y, test(1, 1), 0.001f);
  256. EXPECT_NEAR(column.z, test(1, 2), 0.001f);
  257. column = test.getRow3F(2);
  258. EXPECT_NEAR(column.x, test(2, 0), 0.001f);
  259. EXPECT_NEAR(column.y, test(2, 1), 0.001f);
  260. EXPECT_NEAR(column.z, test(2, 2), 0.001f);
  261. column = test.getRow3F(3);
  262. EXPECT_NEAR(column.x, test(3, 0), 0.001f);
  263. EXPECT_NEAR(column.y, test(3, 1), 0.001f);
  264. EXPECT_NEAR(column.z, test(3, 2), 0.001f);
  265. }
  266. TEST(MatrixTest, TestSetColumn4)
  267. {
  268. MatrixF test(true);
  269. test.set(EulerF(1.0f, 0.0f, 1.0f), Point3F(5.0f, 0.0f, 1.0f));
  270. Point4F column(1.0f, 1.0f, 1.0f, 1.0f);
  271. test.setColumn(0, column);
  272. EXPECT_NEAR(column.x, test(0, 0), 0.001f);
  273. EXPECT_NEAR(column.y, test(1, 0), 0.001f);
  274. EXPECT_NEAR(column.z, test(2, 0), 0.001f);
  275. EXPECT_NEAR(column.w, test(3, 0), 0.001f);
  276. test.setColumn(1, column);
  277. EXPECT_NEAR(column.x, test(0, 1), 0.001f);
  278. EXPECT_NEAR(column.y, test(1, 1), 0.001f);
  279. EXPECT_NEAR(column.z, test(2, 1), 0.001f);
  280. EXPECT_NEAR(column.w, test(3, 1), 0.001f);
  281. test.setColumn(2, column);
  282. EXPECT_NEAR(column.x, test(0, 2), 0.001f);
  283. EXPECT_NEAR(column.y, test(1, 2), 0.001f);
  284. EXPECT_NEAR(column.z, test(2, 2), 0.001f);
  285. EXPECT_NEAR(column.w, test(3, 2), 0.001f);
  286. test.setColumn(3, column);
  287. EXPECT_NEAR(column.x, test(0, 3), 0.001f);
  288. EXPECT_NEAR(column.y, test(1, 3), 0.001f);
  289. EXPECT_NEAR(column.z, test(2, 3), 0.001f);
  290. EXPECT_NEAR(column.w, test(3, 3), 0.001f);
  291. }
  292. TEST(MatrixTest, TestSetRow4)
  293. {
  294. MatrixF test(true);
  295. test.set(EulerF(1.0f, 0.0f, 1.0f), Point3F(5.0f, 0.0f, 1.0f));
  296. Point4F column(1.0f, 1.0f, 1.0f, 1.0f);
  297. test.setRow(0, column);
  298. EXPECT_NEAR(column.x, test(0, 0), 0.001f);
  299. EXPECT_NEAR(column.y, test(0, 1), 0.001f);
  300. EXPECT_NEAR(column.z, test(0, 2), 0.001f);
  301. EXPECT_NEAR(column.w, test(0, 3), 0.001f);
  302. test.setRow(1, column);
  303. EXPECT_NEAR(column.x, test(1, 0), 0.001f);
  304. EXPECT_NEAR(column.y, test(1, 1), 0.001f);
  305. EXPECT_NEAR(column.z, test(1, 2), 0.001f);
  306. EXPECT_NEAR(column.w, test(1, 3), 0.001f);
  307. test.setRow(2, column);
  308. EXPECT_NEAR(column.x, test(2, 0), 0.001f);
  309. EXPECT_NEAR(column.y, test(2, 1), 0.001f);
  310. EXPECT_NEAR(column.z, test(2, 2), 0.001f);
  311. EXPECT_NEAR(column.w, test(2, 3), 0.001f);
  312. test.setRow(3, column);
  313. EXPECT_NEAR(column.x, test(3, 0), 0.001f);
  314. EXPECT_NEAR(column.y, test(3, 1), 0.001f);
  315. EXPECT_NEAR(column.z, test(3, 2), 0.001f);
  316. EXPECT_NEAR(column.w, test(3, 3), 0.001f);
  317. }
  318. TEST(MatrixTest, TestSetColumn3)
  319. {
  320. MatrixF test(true);
  321. test.set(EulerF(1.0f, 0.0f, 1.0f), Point3F(5.0f, 0.0f, 1.0f));
  322. Point3F column(1.0f, 1.0f, 1.0f);
  323. test.setColumn(0, column);
  324. EXPECT_NEAR(column.x, test(0, 0), 0.001f);
  325. EXPECT_NEAR(column.y, test(1, 0), 0.001f);
  326. EXPECT_NEAR(column.z, test(2, 0), 0.001f);
  327. test.setColumn(1, column);
  328. EXPECT_NEAR(column.x, test(0, 1), 0.001f);
  329. EXPECT_NEAR(column.y, test(1, 1), 0.001f);
  330. EXPECT_NEAR(column.z, test(2, 1), 0.001f);
  331. test.setColumn(2, column);
  332. EXPECT_NEAR(column.x, test(0, 2), 0.001f);
  333. EXPECT_NEAR(column.y, test(1, 2), 0.001f);
  334. EXPECT_NEAR(column.z, test(2, 2), 0.001f);
  335. test.setColumn(3, column);
  336. EXPECT_NEAR(column.x, test(0, 3), 0.001f);
  337. EXPECT_NEAR(column.y, test(1, 3), 0.001f);
  338. EXPECT_NEAR(column.z, test(2, 3), 0.001f);
  339. }
  340. TEST(MatrixTest, TestSetRow3)
  341. {
  342. MatrixF test(true);
  343. test.set(EulerF(1.0f, 0.0f, 1.0f), Point3F(5.0f, 0.0f, 1.0f));
  344. Point3F column(1.0f, 1.0f, 1.0f);
  345. test.setRow(0, column);
  346. EXPECT_NEAR(column.x, test(0, 0), 0.001f);
  347. EXPECT_NEAR(column.y, test(0, 1), 0.001f);
  348. EXPECT_NEAR(column.z, test(0, 2), 0.001f);
  349. test.setRow(1, column);
  350. EXPECT_NEAR(column.x, test(1, 0), 0.001f);
  351. EXPECT_NEAR(column.y, test(1, 1), 0.001f);
  352. EXPECT_NEAR(column.z, test(1, 2), 0.001f);
  353. test.setRow(2, column);
  354. EXPECT_NEAR(column.x, test(2, 0), 0.001f);
  355. EXPECT_NEAR(column.y, test(2, 1), 0.001f);
  356. EXPECT_NEAR(column.z, test(2, 2), 0.001f);
  357. test.setRow(3, column);
  358. EXPECT_NEAR(column.x, test(3, 0), 0.001f);
  359. EXPECT_NEAR(column.y, test(3, 1), 0.001f);
  360. EXPECT_NEAR(column.z, test(3, 2), 0.001f);
  361. }
  362. TEST(MatrixTest, TestDisplace)
  363. {
  364. MatrixF test(true);
  365. test.set(EulerF(1.0f, 0.0f, 1.0f), Point3F(5.0f, 0.0f, 1.0f));
  366. Point3F column(1.0f, 1.0f, 1.0f);
  367. test.displace(column);
  368. EXPECT_NEAR(test(0, 3), 6.0f, 0.001f);
  369. EXPECT_NEAR(test(1, 3), 1.0f, 0.001f);
  370. EXPECT_NEAR(test(2, 3), 2.0f, 0.001f);
  371. }
  372. TEST(MatrixTest, TestGetVectorFunctions)
  373. {
  374. MatrixF test(true);
  375. test.set(EulerF(1.0f, 0.0f, 1.0f), Point3F(5.0f, 0.0f, 1.0f));
  376. VectorF vector;
  377. vector = test.getRightVector();
  378. EXPECT_NEAR(vector.x, test(0, 0), 0.001f);
  379. EXPECT_NEAR(vector.y, test(1, 0), 0.001f);
  380. EXPECT_NEAR(vector.z, test(2, 0), 0.001f);
  381. vector = test.getForwardVector();
  382. EXPECT_NEAR(vector.x, test(0, 1), 0.001f);
  383. EXPECT_NEAR(vector.y, test(1, 1), 0.001f);
  384. EXPECT_NEAR(vector.z, test(2, 1), 0.001f);
  385. vector = test.getUpVector();
  386. EXPECT_NEAR(vector.x, test(0, 2), 0.001f);
  387. EXPECT_NEAR(vector.y, test(1, 2), 0.001f);
  388. EXPECT_NEAR(vector.z, test(2, 2), 0.001f);
  389. }
  390. TEST(MatrixTest, TestSetCrossProduct)
  391. {
  392. MatrixF test(true);
  393. test.setCrossProduct(Point3F(5.0f, 0.0f, 1.0f));
  394. EXPECT_NEAR(test(0, 0), 0.0f, 0.001f); EXPECT_NEAR(test(0, 1), -1.0f, 0.001f); EXPECT_NEAR(test(0, 2), 0.0f, 0.001f); EXPECT_NEAR(test(0, 3), 0.0f, 0.001f);
  395. EXPECT_NEAR(test(1, 0), 1.0f, 0.001f); EXPECT_NEAR(test(1, 1), 0.0, 0.001f); EXPECT_NEAR(test(1, 2), -5.0f, 0.001f); EXPECT_NEAR(test(1, 3), 0.0f, 0.001f);
  396. EXPECT_NEAR(test(2, 0), 0.0f, 0.001f); EXPECT_NEAR(test(2, 1), 5.0f, 0.001f); EXPECT_NEAR(test(2, 2), 0.0f, 0.001f); EXPECT_NEAR(test(2, 3), 0.0f, 0.001f);
  397. EXPECT_NEAR(test(3, 0), 0.0f, 0.001f); EXPECT_NEAR(test(3, 1), 0.0f, 0.001f); EXPECT_NEAR(test(3, 2), 0.0f, 0.001f); EXPECT_NEAR(test(3, 3), 1.0f, 0.001f);
  398. }
  399. TEST(MatrixTest, TestSetTensorProduct)
  400. {
  401. MatrixF test(true);
  402. test.setTensorProduct(Point3F(5.0f, 2.0f, 1.0f), Point3F(5.0f, 2.0f, 1.0f));
  403. EXPECT_NEAR(test(0, 0), 25.0f, 0.001f); EXPECT_NEAR(test(0, 1), 10.0f, 0.001f); EXPECT_NEAR(test(0, 2), 5.0f, 0.001f); EXPECT_NEAR(test(0, 3), 0.0f, 0.001f);
  404. EXPECT_NEAR(test(1, 0), 10.0f, 0.001f); EXPECT_NEAR(test(1, 1), 4.0, 0.001f); EXPECT_NEAR(test(1, 2), 2.0f, 0.001f); EXPECT_NEAR(test(1, 3), 0.0f, 0.001f);
  405. EXPECT_NEAR(test(2, 0), 5.0f, 0.001f); EXPECT_NEAR(test(2, 1), 2.0f, 0.001f); EXPECT_NEAR(test(2, 2), 1.0f, 0.001f); EXPECT_NEAR(test(2, 3), 0.0f, 0.001f);
  406. EXPECT_NEAR(test(3, 0), 0.0f, 0.001f); EXPECT_NEAR(test(3, 1), 0.0f, 0.001f); EXPECT_NEAR(test(3, 2), 0.0f, 0.001f); EXPECT_NEAR(test(3, 3), 1.0f, 0.001f);
  407. }
  408. TEST(MatrixTest, TestMulFunction)
  409. {
  410. MatrixF test(true);
  411. test.setPosition(Point3F(5.0f, 2.0f, 1.0f));
  412. MatrixF test2(EulerF(1.0f, 0.0f, 1.0f));
  413. test.mul(test2);
  414. EXPECT_NEAR(test(0, 0), 0.5403f, 0.001f); EXPECT_NEAR(test(0, 1), 0.8415f, 0.001f); EXPECT_NEAR(test(0, 2), 0.0f, 0.001f); EXPECT_NEAR(test(0, 3), 5.0f, 0.001f);
  415. EXPECT_NEAR(test(1, 0), -0.4546f, 0.001f); EXPECT_NEAR(test(1, 1), 0.2919f, 0.001f); EXPECT_NEAR(test(1, 2), 0.8415f, 0.001f); EXPECT_NEAR(test(1, 3), 2.0f, 0.001f);
  416. EXPECT_NEAR(test(2, 0), 0.7081f, 0.001f); EXPECT_NEAR(test(2, 1), -0.4546f, 0.001f); EXPECT_NEAR(test(2, 2), 0.5403f, 0.001f); EXPECT_NEAR(test(2, 3), 1.0f, 0.001f);
  417. EXPECT_NEAR(test(3, 0), 0.0f, 0.001f); EXPECT_NEAR(test(3, 1), 0.0f, 0.001f); EXPECT_NEAR(test(3, 2), 0.0f, 0.001f); EXPECT_NEAR(test(3, 3), 1.0f, 0.001f);
  418. }
  419. TEST(MatrixTest, TestMulOperator)
  420. {
  421. MatrixF test(true);
  422. test.setPosition(Point3F(5.0f, 2.0f, 1.0f));
  423. MatrixF test2(EulerF(1.0f, 0.0f, 1.0f));
  424. test = test * test2;
  425. EXPECT_NEAR(test(0, 0), 0.5403f, 0.001f); EXPECT_NEAR(test(0, 1), 0.8415f, 0.001f); EXPECT_NEAR(test(0, 2), 0.0f, 0.001f); EXPECT_NEAR(test(0, 3), 5.0f, 0.001f);
  426. EXPECT_NEAR(test(1, 0), -0.4546f, 0.001f); EXPECT_NEAR(test(1, 1), 0.2919f, 0.001f); EXPECT_NEAR(test(1, 2), 0.8415f, 0.001f); EXPECT_NEAR(test(1, 3), 2.0f, 0.001f);
  427. EXPECT_NEAR(test(2, 0), 0.7081f, 0.001f); EXPECT_NEAR(test(2, 1), -0.4546f, 0.001f); EXPECT_NEAR(test(2, 2), 0.5403f, 0.001f); EXPECT_NEAR(test(2, 3), 1.0f, 0.001f);
  428. EXPECT_NEAR(test(3, 0), 0.0f, 0.001f); EXPECT_NEAR(test(3, 1), 0.0f, 0.001f); EXPECT_NEAR(test(3, 2), 0.0f, 0.001f); EXPECT_NEAR(test(3, 3), 1.0f, 0.001f);
  429. }
  430. TEST(MatrixTest, TestMulLFunction)
  431. {
  432. MatrixF test(true);
  433. test.setPosition(Point3F(5.0f, 2.0f, 1.0f));
  434. MatrixF test2(EulerF(1.0f, 0.0f, 1.0f));
  435. test.mulL(test2);
  436. EXPECT_NEAR(test(0, 0), 0.5403f, 0.001f); EXPECT_NEAR(test(0, 1), 0.8415f, 0.001f); EXPECT_NEAR(test(0, 2), 0.0f, 0.001f); EXPECT_NEAR(test(0, 3), 4.3845f, 0.001f);
  437. EXPECT_NEAR(test(1, 0), -0.4546f, 0.001f); EXPECT_NEAR(test(1, 1), 0.2919f, 0.001f); EXPECT_NEAR(test(1, 2), 0.8415f, 0.001f); EXPECT_NEAR(test(1, 3), -0.8479f, 0.001f);
  438. EXPECT_NEAR(test(2, 0), 0.7081f, 0.001f); EXPECT_NEAR(test(2, 1), -0.4546f, 0.001f); EXPECT_NEAR(test(2, 2), 0.5403f, 0.001f); EXPECT_NEAR(test(2, 3), 3.1714, 0.001f);
  439. EXPECT_NEAR(test(3, 0), 0.0f, 0.001f); EXPECT_NEAR(test(3, 1), 0.0f, 0.001f); EXPECT_NEAR(test(3, 2), 0.0f, 0.001f); EXPECT_NEAR(test(3, 3), 1.0f, 0.001f);
  440. }
  441. TEST(MatrixTest, TestMulArgMatrixFunction)
  442. {
  443. MatrixF testResult(true);
  444. MatrixF test(true);
  445. test.setPosition(Point3F(5.0f, 2.0f, 1.0f));
  446. MatrixF test2(EulerF(1.0f, 0.0f, 1.0f));
  447. testResult.mul(test2, test);
  448. EXPECT_NEAR(testResult(0, 0), 0.5403f, 0.001f); EXPECT_NEAR(testResult(0, 1), 0.8415f, 0.001f); EXPECT_NEAR(testResult(0, 2), 0.0f, 0.001f); EXPECT_NEAR(testResult(0, 3), 4.3845f, 0.001f);
  449. EXPECT_NEAR(testResult(1, 0), -0.4546f, 0.001f); EXPECT_NEAR(testResult(1, 1), 0.2919f, 0.001f); EXPECT_NEAR(testResult(1, 2), 0.8415f, 0.001f); EXPECT_NEAR(testResult(1, 3), -0.8479f, 0.001f);
  450. EXPECT_NEAR(testResult(2, 0), 0.7081f, 0.001f); EXPECT_NEAR(testResult(2, 1), -0.4546f, 0.001f); EXPECT_NEAR(testResult(2, 2), 0.5403f, 0.001f); EXPECT_NEAR(testResult(2, 3), 3.1714, 0.001f);
  451. EXPECT_NEAR(testResult(3, 0), 0.0f, 0.001f); EXPECT_NEAR(testResult(3, 1), 0.0f, 0.001f); EXPECT_NEAR(testResult(3, 2), 0.0f, 0.001f); EXPECT_NEAR(testResult(3, 3), 1.0f, 0.001f);
  452. }
  453. TEST(MatrixTest, TestMulArgMultipleRotationMatrix)
  454. {
  455. MatrixF testResult(true);
  456. MatrixF xRot(EulerF(-1.54f, 0.0f, 0.0f));
  457. MatrixF zRot(EulerF(0.0f, 0.0f, -1.57f));
  458. testResult.mul(zRot, xRot);
  459. EXPECT_NEAR(testResult(0, 0), 0.0008f, 0.001f); EXPECT_NEAR(testResult(0, 1), -0.0308f, 0.001f);EXPECT_NEAR(testResult(0, 2), 0.9995f, 0.001f); EXPECT_NEAR(testResult(0, 3), 0.0f, 0.001f);
  460. EXPECT_NEAR(testResult(1, 0), 1.0f, 0.001f); EXPECT_NEAR(testResult(1, 1), 0.0f, 0.001f); EXPECT_NEAR(testResult(1, 2), -0.0008f, 0.001f); EXPECT_NEAR(testResult(1, 3), 0.0f, 0.001f);
  461. EXPECT_NEAR(testResult(2, 0), 0.0f, 0.001f); EXPECT_NEAR(testResult(2, 1), 0.9995f, 0.001f); EXPECT_NEAR(testResult(2, 2), 0.0308f, 0.001f); EXPECT_NEAR(testResult(2, 3), 0.0f, 0.001f);
  462. EXPECT_NEAR(testResult(3, 0), 0.0f, 0.001f); EXPECT_NEAR(testResult(3, 1), 0.0f, 0.001f); EXPECT_NEAR(testResult(3, 2), 0.0f, 0.001f); EXPECT_NEAR(testResult(3, 3), 1.0f, 0.001f);
  463. }
  464. TEST(MatrixTest, TestMulScalarFunction)
  465. {
  466. MatrixF test(true);
  467. test.setPosition(Point3F(5.0f, 2.0f, 1.0f));
  468. MatrixF test2(EulerF(1.0f, 0.0f, 1.0f));
  469. test.mulL(test2);
  470. test.mul(2.0f);
  471. EXPECT_NEAR(test(0, 0), 1.0806f, 0.001f); EXPECT_NEAR(test(0, 1), 1.6829f, 0.001f); EXPECT_NEAR(test(0, 2), 0.0f, 0.001f); EXPECT_NEAR(test(0, 3), 8.7689f, 0.001f);
  472. EXPECT_NEAR(test(1, 0), -0.9093f, 0.001f); EXPECT_NEAR(test(1, 1), 0.5839f, 0.001f); EXPECT_NEAR(test(1, 2), 1.6829f, 0.001f); EXPECT_NEAR(test(1, 3), -1.6958f, 0.001f);
  473. EXPECT_NEAR(test(2, 0), 1.4161f, 0.001f); EXPECT_NEAR(test(2, 1), -0.9093f, 0.001f); EXPECT_NEAR(test(2, 2), 1.0806f, 0.001f); EXPECT_NEAR(test(2, 3), 6.3427f, 0.001f);
  474. EXPECT_NEAR(test(3, 0), 0.0f, 0.001f); EXPECT_NEAR(test(3, 1), 0.0f, 0.001f); EXPECT_NEAR(test(3, 2), 0.0f, 0.001f); EXPECT_NEAR(test(3, 3), 2.0f, 0.001f);
  475. }
  476. TEST(MatrixTest, TestMulMatScalarFunction)
  477. {
  478. MatrixF testTran(true);
  479. testTran.setPosition(Point3F(5.0f, 2.0f, 1.0f));
  480. MatrixF test2(EulerF(1.0f, 0.0f, 1.0f));
  481. testTran.mulL(test2);
  482. MatrixF test(true);
  483. test.mul(testTran, 2.0f);
  484. EXPECT_NEAR(test(0, 0), 1.0806f, 0.001f); EXPECT_NEAR(test(0, 1), 1.6829f, 0.001f); EXPECT_NEAR(test(0, 2), 0.0f, 0.001f); EXPECT_NEAR(test(0, 3), 8.7689f, 0.001f);
  485. EXPECT_NEAR(test(1, 0), -0.9093f, 0.001f); EXPECT_NEAR(test(1, 1), 0.5839f, 0.001f); EXPECT_NEAR(test(1, 2), 1.6829f, 0.001f); EXPECT_NEAR(test(1, 3), -1.6958f, 0.001f);
  486. EXPECT_NEAR(test(2, 0), 1.4161f, 0.001f); EXPECT_NEAR(test(2, 1), -0.9093f, 0.001f); EXPECT_NEAR(test(2, 2), 1.0806f, 0.001f); EXPECT_NEAR(test(2, 3), 6.3427f, 0.001f);
  487. EXPECT_NEAR(test(3, 0), 0.0f, 0.001f); EXPECT_NEAR(test(3, 1), 0.0f, 0.001f); EXPECT_NEAR(test(3, 2), 0.0f, 0.001f); EXPECT_NEAR(test(3, 3), 2.0f, 0.001f);
  488. }
  489. TEST(MatrixTest, TestMulPoint4)
  490. {
  491. MatrixF test(true);
  492. test.setPosition(Point3F(5.0f, 2.0f, 1.0f));
  493. MatrixF test2(EulerF(1.0f, 0.0f, 1.0f));
  494. test.mulL(test2);
  495. Point4F testPoint(0.5f, 1.0f, 2.0f, 1.0f);
  496. test.mul(testPoint);
  497. EXPECT_NEAR(testPoint.x, 5.496f, 0.001f); EXPECT_NEAR(testPoint.y, 0.899f, 0.001f); EXPECT_NEAR(testPoint.z, 4.151f, 0.001f); EXPECT_NEAR(testPoint.w, 1.0f, 0.001f);
  498. }
  499. TEST(MatrixTest, TestMulPoint3)
  500. {
  501. MatrixF test(true);
  502. test.setPosition(Point3F(5.0f, 2.0f, 1.0f));
  503. MatrixF test2(EulerF(1.0f, 0.0f, 1.0f));
  504. test.mulL(test2);
  505. Point3F testPoint(0.5f, 1.0f, 2.0f);
  506. test.mulP(testPoint);
  507. EXPECT_NEAR(testPoint.x, 5.496f, 0.001f); EXPECT_NEAR(testPoint.y, 0.899f, 0.001f); EXPECT_NEAR(testPoint.z, 4.151f, 0.001f);
  508. }
  509. TEST(MatrixTest, TestMulPoint3ToPoint3)
  510. {
  511. MatrixF test(true);
  512. test.setPosition(Point3F(5.0f, 2.0f, 1.0f));
  513. MatrixF test2(EulerF(1.0f, 0.0f, 1.0f));
  514. test.mulL(test2);
  515. Point3F point(0.5f, 1.0f, 2.0f);
  516. Point3F testPoint;
  517. test.mulP(point, &testPoint);
  518. EXPECT_NEAR(testPoint.x, 5.496f, 0.001f); EXPECT_NEAR(testPoint.y, 0.899f, 0.001f); EXPECT_NEAR(testPoint.z, 4.151f, 0.001f);
  519. }
  520. TEST(MatrixTest, TestMulVector)
  521. {
  522. MatrixF test(true);
  523. test.setPosition(Point3F(5.0f, 2.0f, 1.0f));
  524. MatrixF test2(EulerF(1.0f, 0.0f, 1.0f));
  525. test.mulL(test2);
  526. VectorF testPoint(0.5f, 1.0f, 2.0f);
  527. test.mulV(testPoint);
  528. EXPECT_NEAR(testPoint.x, 1.111f, 0.001f); EXPECT_NEAR(testPoint.y, 1.747f, 0.001f); EXPECT_NEAR(testPoint.z, 0.979f, 0.001f);
  529. }
  530. TEST(MatrixTest, TestMulVectorToPoint3)
  531. {
  532. MatrixF test(true);
  533. test.setPosition(Point3F(5.0f, 2.0f, 1.0f));
  534. MatrixF test2(EulerF(1.0f, 0.0f, 1.0f));
  535. test.mulL(test2);
  536. VectorF vec(0.5f, 1.0f, 2.0f);
  537. Point3F testPoint;
  538. test.mulV(vec, &testPoint);
  539. EXPECT_NEAR(testPoint.x, 1.111f, 0.001f); EXPECT_NEAR(testPoint.y, 1.747f, 0.001f); EXPECT_NEAR(testPoint.z, 0.979f, 0.001f);
  540. }
  541. TEST(MatrixTest, TestMulBox)
  542. {
  543. MatrixF test(true);
  544. test.setPosition(Point3F(5.0f, 2.0f, 1.0f));
  545. MatrixF test2(EulerF(1.0f, 0.0f, 1.0f));
  546. Box3F testBox(1.0f);
  547. test.mul(testBox);
  548. EXPECT_NEAR(testBox.minExtents.x, 4.5f, 0.001f); EXPECT_NEAR(testBox.minExtents.y, 1.5f, 0.001f); EXPECT_NEAR(testBox.minExtents.z, 0.5f, 0.001f);
  549. EXPECT_NEAR(testBox.maxExtents.x, 5.5f, 0.001f); EXPECT_NEAR(testBox.maxExtents.y, 2.5f, 0.001f); EXPECT_NEAR(testBox.maxExtents.z, 1.5f, 0.001f);
  550. }
  551. TEST(MatrixTest, TestMatrixAdd)
  552. {
  553. MatrixF test(true);
  554. MatrixF test2(true);
  555. for (U32 i = 0; i < 4; i++)
  556. {
  557. for (U32 j = 0; j < 4; j++)
  558. {
  559. test(i, j) = 1.0f;
  560. test2(i, j) = 1.0f;
  561. }
  562. }
  563. test.add(test2);
  564. for (U32 i = 0; i < 4; i++)
  565. {
  566. for (U32 j = 0; j < 4; j++)
  567. {
  568. EXPECT_NEAR(test(i,j), 2.0f, 0.001f);
  569. }
  570. }
  571. }
  572. TEST(MatrixTest, TestCalcPlaneCulls)
  573. {
  574. Point3F lightDir(-0.346188605f, -0.742403805f, -0.573576510f);
  575. const F32 shadowDistance = 100.0f;
  576. // frustum transform
  577. MatrixF test(true);
  578. test(0, 0) = -0.8930f; test(0, 1) = 0.3043f; test(0, 2) = 0.3314f; test(0, 3) = -8.3111f;
  579. test(1, 0) = -0.4499f; test(1, 1) = -0.6039f; test(1, 2) = -0.6578f; test(1, 3) = 8.4487f;
  580. test(2, 0) = -0.0f; test(2, 1) = -0.7366f; test(2, 2) = 0.6763f; test(2, 3) = 12.5414f;
  581. test(0, 0) = 0.00f; test(0, 1) = 0.0f; test(0, 2) = 0.0f; test(0, 3) = 1.0f;
  582. Box3F viewBB(-shadowDistance, -shadowDistance, -shadowDistance,
  583. shadowDistance, shadowDistance, shadowDistance);
  584. Frustum testFrustum(false, -0.119894862f, 0.119894862f, 0.0767327100f, -0.0767327100f, 0.1f, 1000.0f, test);
  585. testFrustum.getTransform().mul(viewBB);
  586. testFrustum.cropNearFar(0.1f, shadowDistance);
  587. PlaneF lightFarPlane, lightNearPlane;
  588. Point3F viewDir = testFrustum.getTransform().getForwardVector();
  589. EXPECT_NEAR(viewDir.x, 0.0f, 0.001f); EXPECT_NEAR(viewDir.y, -0.6039f, 0.001f); EXPECT_NEAR(viewDir.z, -0.7365f, 0.001f);
  590. viewDir.normalize();
  591. const Point3F viewPosition = testFrustum.getPosition();
  592. EXPECT_NEAR(viewPosition.x, 1.0f, 0.001f); EXPECT_NEAR(viewPosition.y, 8.4486f, 0.001f); EXPECT_NEAR(viewPosition.z, 12.5414f, 0.001f);
  593. const F32 viewDistance = testFrustum.getBounds().len();
  594. EXPECT_NEAR(viewDistance, 243.6571f, 0.001f);
  595. lightNearPlane = PlaneF(viewPosition + (viewDistance * -lightDir), lightDir);
  596. const Point3F lightFarPlanePos = viewPosition + (viewDistance * lightDir);
  597. lightFarPlane = PlaneF(lightFarPlanePos, -lightDir);
  598. MatrixF invLightFarPlaneMat(true);
  599. MatrixF lightFarPlaneMat = MathUtils::createOrientFromDir(-lightDir);
  600. lightFarPlaneMat.setPosition(lightFarPlanePos);
  601. lightFarPlaneMat.invertTo(&invLightFarPlaneMat);
  602. Vector<Point2F> projVertices;
  603. //project all frustum vertices into plane
  604. // all vertices are 2d and local to far plane
  605. projVertices.setSize(8);
  606. for (int i = 0; i < 8; ++i) //
  607. {
  608. const Point3F& point = testFrustum.getPoints()[i];
  609. Point3F localPoint(lightFarPlane.project(point));
  610. invLightFarPlaneMat.mulP(localPoint);
  611. projVertices[i] = Point2F(localPoint.x, localPoint.z);
  612. }
  613. EXPECT_NEAR(projVertices[0].x, 0.0240f, 0.001f); EXPECT_NEAR(projVertices[0].y, 0.0117f, 0.001f);
  614. EXPECT_NEAR(projVertices[1].x, 0.0696f, 0.001f); EXPECT_NEAR(projVertices[1].y, 0.0678f, 0.001f);
  615. EXPECT_NEAR(projVertices[2].x, -0.0186f, 0.001f); EXPECT_NEAR(projVertices[2].y, -0.1257f, 0.001f);
  616. EXPECT_NEAR(projVertices[3].x, 0.0269f, 0.001f); EXPECT_NEAR(projVertices[3].y, -0.0696f, 0.001f);
  617. EXPECT_NEAR(projVertices[4].x, 24.0571f, 0.001f); EXPECT_NEAR(projVertices[4].y, 11.7618f, 0.001f);
  618. EXPECT_NEAR(projVertices[5].x, 69.6498f, 0.001f); EXPECT_NEAR(projVertices[5].y, 67.8426f, 0.001f);
  619. EXPECT_NEAR(projVertices[6].x, -18.6059f, 0.001f); EXPECT_NEAR(projVertices[6].y, -125.7341f, 0.001f);
  620. EXPECT_NEAR(projVertices[7].x, 26.9866f, 0.001f); EXPECT_NEAR(projVertices[7].y, -69.6534f, 0.001f);
  621. }
  622. TEST(MatrixTest, TestFrustumProjectionMatrix)
  623. {
  624. MatrixF test(true);
  625. Frustum testFrustum(false, -0.119894862f, 0.119894862f, 0.0767327100f, -0.0767327100f, 0.1f, 1000.0f);
  626. testFrustum.getProjectionMatrix(&test);
  627. EXPECT_NEAR(test(0, 0), 0.8341f, 0.001f); EXPECT_NEAR(test(0, 1), 0.0f, 0.001f); EXPECT_NEAR(test(0, 2), 0.0f, 0.001f); EXPECT_NEAR(test(0, 3), 0.0f, 0.001f);
  628. EXPECT_NEAR(test(1, 0), 0.0f, 0.001f); EXPECT_NEAR(test(1, 1), 0.0f, 0.001f); EXPECT_NEAR(test(1, 2), 1.3032f, 0.001f); EXPECT_NEAR(test(1, 3), 0.0, 0.001f);
  629. EXPECT_NEAR(test(2, 0), 0.0f, 0.001f); EXPECT_NEAR(test(2, 1), -0.0001f, 0.001f); EXPECT_NEAR(test(2, 2), 0.0f, 0.001f); EXPECT_NEAR(test(2, 3), 0.1f, 0.001f);
  630. EXPECT_NEAR(test(3, 0), 0.0f, 0.001f); EXPECT_NEAR(test(3, 1), 1.0f, 0.001f); EXPECT_NEAR(test(3, 2), 0.0f, 0.001f); EXPECT_NEAR(test(3, 3), 0.0f, 0.001f);
  631. test.reverseProjection();
  632. EXPECT_NEAR(test(0, 0), 0.8341f, 0.001f); EXPECT_NEAR(test(0, 1), 0.0f, 0.001f); EXPECT_NEAR(test(0, 2), 0.0f, 0.001f); EXPECT_NEAR(test(0, 3), 0.0f, 0.001f);
  633. EXPECT_NEAR(test(1, 0), 0.0f, 0.001f); EXPECT_NEAR(test(1, 1), 0.0f, 0.001f); EXPECT_NEAR(test(1, 2), 1.3032f, 0.001f); EXPECT_NEAR(test(1, 3), 0.0, 0.001f);
  634. EXPECT_NEAR(test(2, 0), 0.0f, 0.001f); EXPECT_NEAR(test(2, 1), 1.0001f, 0.001f); EXPECT_NEAR(test(2, 2), 0.0f, 0.001f); EXPECT_NEAR(test(2, 3), -0.1f, 0.001f);
  635. EXPECT_NEAR(test(3, 0), 0.0f, 0.001f); EXPECT_NEAR(test(3, 1), 1.0f, 0.001f); EXPECT_NEAR(test(3, 2), 0.0f, 0.001f); EXPECT_NEAR(test(3, 3), 0.0f, 0.001f);
  636. test.inverse();
  637. EXPECT_NEAR(test(0, 0), 1.1989f, 0.001f); EXPECT_NEAR(test(0, 1), 0.0f, 0.001f); EXPECT_NEAR(test(0, 2), 0.0f, 0.001f); EXPECT_NEAR(test(0, 3), 0.0f, 0.001f);
  638. EXPECT_NEAR(test(1, 0), 0.0f, 0.001f); EXPECT_NEAR(test(1, 1), 0.0f, 0.001f); EXPECT_NEAR(test(1, 2), 0.9999f, 0.001f); EXPECT_NEAR(test(1, 3), 0.1f, 0.001f);
  639. EXPECT_NEAR(test(2, 0), 0.0f, 0.001f); EXPECT_NEAR(test(2, 1), 0.7673f, 0.001f); EXPECT_NEAR(test(2, 2), 0.0f, 0.001f); EXPECT_NEAR(test(2, 3), 0.0f, 0.001f);
  640. EXPECT_NEAR(test(3, 0), 0.0f, 0.001f); EXPECT_NEAR(test(3, 1), 1.0f, 0.001f); EXPECT_NEAR(test(3, 2), 0.0f, 0.001f); EXPECT_NEAR(test(3, 3), 0.0f, 0.001f);
  641. }
  642. TEST(MatrixTest, TestUnProjectStack)
  643. {
  644. MatrixF saveModel(true);
  645. MatrixF saveProjection(true);
  646. RectI renderRect(0 ,0, 1600, 1024);
  647. Frustum testFrustum(false, -0.119894862f, 0.119894862f, 0.0767327100f, -0.0767327100f, 0.1f, 1000.0f);
  648. testFrustum.getProjectionMatrix(&saveProjection);
  649. Point3F dest;
  650. MathUtils::mProjectScreenToWorld(Point3F(626.0f, 600.0f, 1.0f), &dest, renderRect, saveModel, saveProjection, 0.1f, 10.0f);
  651. EXPECT_NEAR(dest.x, -0.2868f, 0.001f); EXPECT_NEAR(dest.y, 1.1998f, 0.001f); EXPECT_NEAR(dest.z, -0.1450f, 0.001f);
  652. }
  653. TEST(MatrixTest, TestInverse)
  654. {
  655. MatrixF test(true);
  656. test.setPosition(Point3F(5.0f, 2.0f, 1.0f));
  657. MatrixF test2(EulerF(1.0f, 0.0f, 1.0f));
  658. test.mulL(test2);
  659. test.inverse();
  660. EXPECT_NEAR(test(0, 0), 0.5403f, 0.001f); EXPECT_NEAR(test(0, 1), -0.4546f, 0.001f); EXPECT_NEAR(test(0, 2), 0.7081f, 0.001f); EXPECT_NEAR(test(0, 3), -5.0f, 0.001f);
  661. EXPECT_NEAR(test(1, 0), 0.8415f, 0.001f); EXPECT_NEAR(test(1, 1), 0.2919f, 0.001f); EXPECT_NEAR(test(1, 2), -0.4546f, 0.001f); EXPECT_NEAR(test(1, 3), -2.0f, 0.001f);
  662. EXPECT_NEAR(test(2, 0), 0.0, 0.001f); EXPECT_NEAR(test(2, 1), 0.8415f, 0.001f); EXPECT_NEAR(test(2, 2), 0.5403f, 0.001f); EXPECT_NEAR(test(2, 3), -1.0f, 0.001f);
  663. EXPECT_NEAR(test(3, 0), 0.0f, 0.001f); EXPECT_NEAR(test(3, 1), 0.0f, 0.001f); EXPECT_NEAR(test(3, 2), 0.0f, 0.001f); EXPECT_NEAR(test(3, 3), 1.0f, 0.001f);
  664. }
  665. TEST(MatrixTest, TestInvertTo)
  666. {
  667. MatrixF test1(true);
  668. test1.setPosition(Point3F(5.0f, 2.0f, 1.0f));
  669. MatrixF test2(EulerF(1.0f, 0.0f, 1.0f));
  670. test1.mulL(test2);
  671. MatrixF test(true);
  672. test1.invertTo(&test);
  673. EXPECT_NEAR(test(0, 0), 0.5403f, 0.001f); EXPECT_NEAR(test(0, 1), -0.4546f, 0.001f); EXPECT_NEAR(test(0, 2), 0.7081f, 0.001f); EXPECT_NEAR(test(0, 3), -5.0f, 0.001f);
  674. EXPECT_NEAR(test(1, 0), 0.8415f, 0.001f); EXPECT_NEAR(test(1, 1), 0.2919f, 0.001f); EXPECT_NEAR(test(1, 2), -0.4546f, 0.001f); EXPECT_NEAR(test(1, 3), -2.0f, 0.001f);
  675. EXPECT_NEAR(test(2, 0), 0.0, 0.001f); EXPECT_NEAR(test(2, 1), 0.8415f, 0.001f); EXPECT_NEAR(test(2, 2), 0.5403f, 0.001f); EXPECT_NEAR(test(2, 3), -1.0f, 0.001f);
  676. EXPECT_NEAR(test(3, 0), 0.0f, 0.001f); EXPECT_NEAR(test(3, 1), 0.0f, 0.001f); EXPECT_NEAR(test(3, 2), 0.0f, 0.001f); EXPECT_NEAR(test(3, 3), 1.0f, 0.001f);
  677. }
  678. TEST(MatrixTest, TestFullInverse)
  679. {
  680. MatrixF test(true);
  681. test.setPosition(Point3F(5.0f, 2.0f, 1.0f));
  682. MatrixF test2(EulerF(1.0f, 0.0f, 1.0f));
  683. test.mulL(test2);
  684. EXPECT_TRUE(test.fullInverse());
  685. EXPECT_NEAR(test(0, 0), 0.5403f, 0.001f); EXPECT_NEAR(test(0, 1), -0.4546f, 0.001f); EXPECT_NEAR(test(0, 2), 0.7081f, 0.001f); EXPECT_NEAR(test(0, 3), -5.0f, 0.001f);
  686. EXPECT_NEAR(test(1, 0), 0.8415f, 0.001f); EXPECT_NEAR(test(1, 1), 0.2919f, 0.001f); EXPECT_NEAR(test(1, 2), -0.4546f, 0.001f); EXPECT_NEAR(test(1, 3), -2.0f, 0.001f);
  687. EXPECT_NEAR(test(2, 0), 0.0, 0.001f); EXPECT_NEAR(test(2, 1), 0.8415f, 0.001f); EXPECT_NEAR(test(2, 2), 0.5403f, 0.001f); EXPECT_NEAR(test(2, 3), -1.0f, 0.001f);
  688. EXPECT_NEAR(test(3, 0), 0.0f, 0.001f); EXPECT_NEAR(test(3, 1), 0.0f, 0.001f); EXPECT_NEAR(test(3, 2), 0.0f, 0.001f); EXPECT_NEAR(test(3, 3), 1.0f, 0.001f);
  689. }
  690. TEST(MatrixTest, TestIsAffine)
  691. {
  692. MatrixF test(true);
  693. test.setPosition(Point3F(5.0f, 2.0f, 1.0f));
  694. MatrixF test2(EulerF(1.0f, 0.0f, 1.0f));
  695. test.mulL(test2);
  696. EXPECT_TRUE(test.isAffine());
  697. }
  698. TEST(MatrixTest, TestScale)
  699. {
  700. MatrixF test(true);
  701. test.setPosition(Point3F(5.0f, 2.0f, 1.0f));
  702. MatrixF test2(EulerF(1.0f, 0.0f, 1.0f));
  703. test.mulL(test2);
  704. test.scale(2.0f);
  705. EXPECT_NEAR(test(0, 0), 1.0806f, 0.001f); EXPECT_NEAR(test(0, 1), 1.6829f, 0.001f); EXPECT_NEAR(test(0, 2), 0.0f, 0.001f); EXPECT_NEAR(test(0, 3), 4.3845f, 0.001f);
  706. EXPECT_NEAR(test(1, 0), -0.9093f, 0.001f); EXPECT_NEAR(test(1, 1), 0.5839f, 0.001f); EXPECT_NEAR(test(1, 2), 1.6829f, 0.001f); EXPECT_NEAR(test(1, 3), -0.8479f, 0.001f);
  707. EXPECT_NEAR(test(2, 0), 1.4161f, 0.001f); EXPECT_NEAR(test(2, 1), -0.9093f, 0.001f); EXPECT_NEAR(test(2, 2), 1.0806f, 0.001f); EXPECT_NEAR(test(2, 3), 3.1714f, 0.001f);
  708. EXPECT_NEAR(test(3, 0), 0.0f, 0.001f); EXPECT_NEAR(test(3, 1), 0.0f, 0.001f); EXPECT_NEAR(test(3, 2), 0.0f, 0.001f); EXPECT_NEAR(test(3, 3), 1.0f, 0.001f);
  709. }
  710. TEST(MatrixTest, TestGetScale)
  711. {
  712. MatrixF test(true);
  713. test.setPosition(Point3F(5.0f, 2.0f, 1.0f));
  714. MatrixF test2(EulerF(1.0f, 0.0f, 1.0f));
  715. test.mulL(test2);
  716. test.scale(2.0f);
  717. Point3F scale;
  718. scale = test.getScale();
  719. EXPECT_NEAR(scale.x, 2.0f, 0.001f); EXPECT_NEAR(scale.y, 2.0f, 0.001f); EXPECT_NEAR(scale.z, 2.0f, 0.001f);
  720. }
  721. TEST(MatrixTest, TestAffineInverse)
  722. {
  723. MatrixF test(true);
  724. test.setPosition(Point3F(5.0f, 2.0f, 1.0f));
  725. MatrixF test2(EulerF(1.0f, 0.0f, 1.0f));
  726. test.mulL(test2);
  727. test.affineInverse();
  728. EXPECT_NEAR(test(0, 0), 0.5403f, 0.001f); EXPECT_NEAR(test(0, 1), -0.4546f, 0.001f); EXPECT_NEAR(test(0, 2), 0.7081f, 0.001f); EXPECT_NEAR(test(0, 3), -5.0f, 0.001f);
  729. EXPECT_NEAR(test(1, 0), 0.8415f, 0.001f); EXPECT_NEAR(test(1, 1), 0.2919f, 0.001f); EXPECT_NEAR(test(1, 2), -0.4546f, 0.001f); EXPECT_NEAR(test(1, 3), -2.0f, 0.001f);
  730. EXPECT_NEAR(test(2, 0), 0.0, 0.001f); EXPECT_NEAR(test(2, 1), 0.8415f, 0.001f); EXPECT_NEAR(test(2, 2), 0.5403f, 0.001f); EXPECT_NEAR(test(2, 3), -1.0f, 0.001f);
  731. EXPECT_NEAR(test(3, 0), 0.0f, 0.001f); EXPECT_NEAR(test(3, 1), 0.0f, 0.001f); EXPECT_NEAR(test(3, 2), 0.0f, 0.001f); EXPECT_NEAR(test(3, 3), 1.0f, 0.001f);
  732. }
  733. TEST(MatrixTest, TestTranspose)
  734. {
  735. MatrixF test(true);
  736. test.setPosition(Point3F(5.0f, 2.0f, 1.0f));
  737. MatrixF test2(EulerF(1.0f, 0.0f, 1.0f));
  738. test.mulL(test2);
  739. test.transpose();
  740. EXPECT_NEAR(test(0, 0), 0.5403f, 0.001f); EXPECT_NEAR(test(0, 1), -0.4546f, 0.001f); EXPECT_NEAR(test(0, 2), 0.7081f, 0.001f); EXPECT_NEAR(test(0, 3), 0.0f, 0.001f);
  741. EXPECT_NEAR(test(1, 0), 0.8415f, 0.001f); EXPECT_NEAR(test(1, 1), 0.2919f, 0.001f); EXPECT_NEAR(test(1, 2), -0.4546f, 0.001f); EXPECT_NEAR(test(1, 3), 0.0f, 0.001f);
  742. EXPECT_NEAR(test(2, 0), 0.0, 0.001f); EXPECT_NEAR(test(2, 1), 0.8415f, 0.001f); EXPECT_NEAR(test(2, 2), 0.5403f, 0.001f); EXPECT_NEAR(test(2, 3), 0.0f, 0.001f);
  743. EXPECT_NEAR(test(3, 0), 4.3845f, 0.001f); EXPECT_NEAR(test(3, 1), -0.8479f, 0.001f); EXPECT_NEAR(test(3, 2), 3.1714, 0.001f); EXPECT_NEAR(test(3, 3), 1.0f, 0.001f);
  744. }
  745. TEST(MatrixTest, TestTransposeTo)
  746. {
  747. MatrixF test1(true);
  748. test1.setPosition(Point3F(5.0f, 2.0f, 1.0f));
  749. MatrixF test2(EulerF(1.0f, 0.0f, 1.0f));
  750. test1.mulL(test2);
  751. MatrixF test(true);
  752. test1.transposeTo(test);
  753. EXPECT_NEAR(test(0, 0), 0.5403f, 0.001f); EXPECT_NEAR(test(0, 1), -0.4546f, 0.001f); EXPECT_NEAR(test(0, 2), 0.7081f, 0.001f); EXPECT_NEAR(test(0, 3), 0.0f, 0.001f);
  754. EXPECT_NEAR(test(1, 0), 0.8415f, 0.001f); EXPECT_NEAR(test(1, 1), 0.2919f, 0.001f); EXPECT_NEAR(test(1, 2), -0.4546f, 0.001f); EXPECT_NEAR(test(1, 3), 0.0f, 0.001f);
  755. EXPECT_NEAR(test(2, 0), 0.0, 0.001f); EXPECT_NEAR(test(2, 1), 0.8415f, 0.001f); EXPECT_NEAR(test(2, 2), 0.5403f, 0.001f); EXPECT_NEAR(test(2, 3), 0.0f, 0.001f);
  756. EXPECT_NEAR(test(3, 0), 4.3845f, 0.001f); EXPECT_NEAR(test(3, 1), -0.8479f, 0.001f); EXPECT_NEAR(test(3, 2), 3.1714, 0.001f); EXPECT_NEAR(test(3, 3), 1.0f, 0.001f);
  757. }
  758. TEST(MatrixTest, TestTransformPlane)
  759. {
  760. MatrixF test(true);
  761. test.setPosition(Point3F(5.0f, 2.0f, 1.0f));
  762. MatrixF test2(EulerF(1.0f, 0.0f, 1.0f));
  763. test.mulL(test2);
  764. PlaneF plane(Point3F(0.0f, 0.0f, 0.0f), Point3F(0.0f, 0.0f, 1.0f));
  765. PlaneF res;
  766. mTransformPlane(test, Point3F(1.0f, 1.0f, 1.0f), plane, &res);
  767. EXPECT_NEAR(res.x, 0.0f, 0.001f);
  768. EXPECT_NEAR(res.y, 0.8414f, 0.001f);
  769. EXPECT_NEAR(res.z, 0.5403f, 0.001f);
  770. EXPECT_NEAR(res.d, -1.0f, 0.001f);
  771. }