mathMatrixTest.cpp 35 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988
  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. TEST(MatrixTest, TestIdentityInit)
  11. {
  12. MatrixF test(true);
  13. EXPECT_NEAR(test(0, 0), 1.0f, 0.001f);
  14. EXPECT_NEAR(test(1, 1), 1.0f, 0.001f);
  15. EXPECT_NEAR(test(2, 2), 1.0f, 0.001f);
  16. EXPECT_NEAR(test(3, 3), 1.0f, 0.001f);
  17. }
  18. TEST(MatrixTest, TestIdentitySet)
  19. {
  20. MatrixF test(false);
  21. test.identity();
  22. EXPECT_NEAR(test(0, 0), 1.0f, 0.001f);
  23. EXPECT_NEAR(test(1, 1), 1.0f, 0.001f);
  24. EXPECT_NEAR(test(2, 2), 1.0f, 0.001f);
  25. EXPECT_NEAR(test(3, 3), 1.0f, 0.001f);
  26. }
  27. TEST(MatrixTest, TestIsIdentity)
  28. {
  29. MatrixF test(true);
  30. EXPECT_TRUE(test.isIdentity());
  31. }
  32. TEST(MatrixTest, TestEulerInit)
  33. {
  34. MatrixF test(EulerF(1.0f, 0.0f, 1.0f));
  35. 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);
  36. 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);
  37. 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);
  38. 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);
  39. }
  40. TEST(MatrixTest, TestEulerSet)
  41. {
  42. MatrixF test(true);
  43. test.set(EulerF(1.0f, 0.0f, 1.0f));
  44. 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);
  45. 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);
  46. 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);
  47. 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);
  48. }
  49. TEST(MatrixTest, TestToEuler)
  50. {
  51. MatrixF test(true);
  52. test.set(EulerF(1.0f, 0.0f, 1.0f));
  53. EulerF euler = test.toEuler();
  54. EXPECT_NEAR(euler.x, 1.0f, 0.001f); EXPECT_NEAR(euler.y, 0.0f, 0.001f); EXPECT_NEAR(euler.z, 1.0f, 0.001f);
  55. }
  56. TEST(MatrixTest, TestEulerPointInit)
  57. {
  58. MatrixF test(EulerF(1.0f, 0.0f, 1.0f), Point3F(5.0f, 0.0f, 1.0f));
  59. 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);
  60. 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);
  61. 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);
  62. 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);
  63. }
  64. TEST(MatrixTest, TestEulerPointSet)
  65. {
  66. MatrixF test(true);
  67. test.set(EulerF(1.0f, 0.0f, 1.0f), Point3F(5.0f, 0.0f, 1.0f));
  68. 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);
  69. 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);
  70. 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);
  71. 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);
  72. }
  73. TEST(MatrixTest, TestGetColumn4)
  74. {
  75. MatrixF test(true);
  76. test.set(EulerF(1.0f, 0.0f, 1.0f), Point3F(5.0f, 0.0f, 1.0f));
  77. Point4F column;
  78. test.getColumn(0, &column);
  79. EXPECT_NEAR(column.x, test(0, 0), 0.001f);
  80. EXPECT_NEAR(column.y, test(1, 0), 0.001f);
  81. EXPECT_NEAR(column.z, test(2, 0), 0.001f);
  82. EXPECT_NEAR(column.w, test(3, 0), 0.001f);
  83. test.getColumn(1, &column);
  84. EXPECT_NEAR(column.x, test(0, 1), 0.001f);
  85. EXPECT_NEAR(column.y, test(1, 1), 0.001f);
  86. EXPECT_NEAR(column.z, test(2, 1), 0.001f);
  87. EXPECT_NEAR(column.w, test(3, 1), 0.001f);
  88. test.getColumn(2, &column);
  89. EXPECT_NEAR(column.x, test(0, 2), 0.001f);
  90. EXPECT_NEAR(column.y, test(1, 2), 0.001f);
  91. EXPECT_NEAR(column.z, test(2, 2), 0.001f);
  92. EXPECT_NEAR(column.w, test(3, 2), 0.001f);
  93. test.getColumn(3, &column);
  94. EXPECT_NEAR(column.x, test(0, 3), 0.001f);
  95. EXPECT_NEAR(column.y, test(1, 3), 0.001f);
  96. EXPECT_NEAR(column.z, test(2, 3), 0.001f);
  97. EXPECT_NEAR(column.w, test(3, 3), 0.001f);
  98. }
  99. TEST(MatrixTest, TestGetRow4)
  100. {
  101. MatrixF test(true);
  102. test.set(EulerF(1.0f, 0.0f, 1.0f), Point3F(5.0f, 0.0f, 1.0f));
  103. Point4F column;
  104. test.getRow(0, &column);
  105. EXPECT_NEAR(column.x, test(0, 0), 0.001f);
  106. EXPECT_NEAR(column.y, test(0, 1), 0.001f);
  107. EXPECT_NEAR(column.z, test(0, 2), 0.001f);
  108. EXPECT_NEAR(column.w, test(0, 3), 0.001f);
  109. test.getRow(1, &column);
  110. EXPECT_NEAR(column.x, test(1, 0), 0.001f);
  111. EXPECT_NEAR(column.y, test(1, 1), 0.001f);
  112. EXPECT_NEAR(column.z, test(1, 2), 0.001f);
  113. EXPECT_NEAR(column.w, test(1, 3), 0.001f);
  114. test.getRow(2, &column);
  115. EXPECT_NEAR(column.x, test(2, 0), 0.001f);
  116. EXPECT_NEAR(column.y, test(2, 1), 0.001f);
  117. EXPECT_NEAR(column.z, test(2, 2), 0.001f);
  118. EXPECT_NEAR(column.w, test(2, 3), 0.001f);
  119. test.getRow(3, &column);
  120. EXPECT_NEAR(column.x, test(3, 0), 0.001f);
  121. EXPECT_NEAR(column.y, test(3, 1), 0.001f);
  122. EXPECT_NEAR(column.z, test(3, 2), 0.001f);
  123. EXPECT_NEAR(column.w, test(3, 3), 0.001f);
  124. }
  125. TEST(MatrixTest, TestGetColumn3)
  126. {
  127. MatrixF test(true);
  128. test.set(EulerF(1.0f, 0.0f, 1.0f), Point3F(5.0f, 0.0f, 1.0f));
  129. Point3F column;
  130. test.getColumn(0, &column);
  131. EXPECT_NEAR(column.x, test(0, 0), 0.001f);
  132. EXPECT_NEAR(column.y, test(1, 0), 0.001f);
  133. EXPECT_NEAR(column.z, test(2, 0), 0.001f);
  134. test.getColumn(1, &column);
  135. EXPECT_NEAR(column.x, test(0, 1), 0.001f);
  136. EXPECT_NEAR(column.y, test(1, 1), 0.001f);
  137. EXPECT_NEAR(column.z, test(2, 1), 0.001f);
  138. test.getColumn(2, &column);
  139. EXPECT_NEAR(column.x, test(0, 2), 0.001f);
  140. EXPECT_NEAR(column.y, test(1, 2), 0.001f);
  141. EXPECT_NEAR(column.z, test(2, 2), 0.001f);
  142. test.getColumn(3, &column);
  143. EXPECT_NEAR(column.x, test(0, 3), 0.001f);
  144. EXPECT_NEAR(column.y, test(1, 3), 0.001f);
  145. EXPECT_NEAR(column.z, test(2, 3), 0.001f);
  146. }
  147. TEST(MatrixTest, TestGetRow3)
  148. {
  149. MatrixF test(true);
  150. test.set(EulerF(1.0f, 0.0f, 1.0f), Point3F(5.0f, 0.0f, 1.0f));
  151. Point3F column;
  152. test.getRow(0, &column);
  153. EXPECT_NEAR(column.x, test(0, 0), 0.001f);
  154. EXPECT_NEAR(column.y, test(0, 1), 0.001f);
  155. EXPECT_NEAR(column.z, test(0, 2), 0.001f);
  156. test.getRow(1, &column);
  157. EXPECT_NEAR(column.x, test(1, 0), 0.001f);
  158. EXPECT_NEAR(column.y, test(1, 1), 0.001f);
  159. EXPECT_NEAR(column.z, test(1, 2), 0.001f);
  160. test.getRow(2, &column);
  161. EXPECT_NEAR(column.x, test(2, 0), 0.001f);
  162. EXPECT_NEAR(column.y, test(2, 1), 0.001f);
  163. EXPECT_NEAR(column.z, test(2, 2), 0.001f);
  164. test.getRow(3, &column);
  165. EXPECT_NEAR(column.x, test(3, 0), 0.001f);
  166. EXPECT_NEAR(column.y, test(3, 1), 0.001f);
  167. EXPECT_NEAR(column.z, test(3, 2), 0.001f);
  168. }
  169. TEST(MatrixTest, TestGetColumn4F)
  170. {
  171. MatrixF test(true);
  172. test.set(EulerF(1.0f, 0.0f, 1.0f), Point3F(5.0f, 0.0f, 1.0f));
  173. Point4F column;
  174. column = test.getColumn4F(0);
  175. EXPECT_NEAR(column.x, test(0, 0), 0.001f);
  176. EXPECT_NEAR(column.y, test(1, 0), 0.001f);
  177. EXPECT_NEAR(column.z, test(2, 0), 0.001f);
  178. EXPECT_NEAR(column.w, test(3, 0), 0.001f);
  179. column = test.getColumn4F(1);
  180. EXPECT_NEAR(column.x, test(0, 1), 0.001f);
  181. EXPECT_NEAR(column.y, test(1, 1), 0.001f);
  182. EXPECT_NEAR(column.z, test(2, 1), 0.001f);
  183. EXPECT_NEAR(column.w, test(3, 1), 0.001f);
  184. column = test.getColumn4F(2);
  185. EXPECT_NEAR(column.x, test(0, 2), 0.001f);
  186. EXPECT_NEAR(column.y, test(1, 2), 0.001f);
  187. EXPECT_NEAR(column.z, test(2, 2), 0.001f);
  188. EXPECT_NEAR(column.w, test(3, 2), 0.001f);
  189. column = test.getColumn4F(3);
  190. EXPECT_NEAR(column.x, test(0, 3), 0.001f);
  191. EXPECT_NEAR(column.y, test(1, 3), 0.001f);
  192. EXPECT_NEAR(column.z, test(2, 3), 0.001f);
  193. EXPECT_NEAR(column.w, test(3, 3), 0.001f);
  194. }
  195. TEST(MatrixTest, TestGetRow4F)
  196. {
  197. MatrixF test(true);
  198. test.set(EulerF(1.0f, 0.0f, 1.0f), Point3F(5.0f, 0.0f, 1.0f));
  199. Point4F column;
  200. column = test.getRow4F(0);
  201. EXPECT_NEAR(column.x, test(0, 0), 0.001f);
  202. EXPECT_NEAR(column.y, test(0, 1), 0.001f);
  203. EXPECT_NEAR(column.z, test(0, 2), 0.001f);
  204. EXPECT_NEAR(column.w, test(0, 3), 0.001f);
  205. column = test.getRow4F(1);
  206. EXPECT_NEAR(column.x, test(1, 0), 0.001f);
  207. EXPECT_NEAR(column.y, test(1, 1), 0.001f);
  208. EXPECT_NEAR(column.z, test(1, 2), 0.001f);
  209. EXPECT_NEAR(column.w, test(1, 3), 0.001f);
  210. column = test.getRow4F(2);
  211. EXPECT_NEAR(column.x, test(2, 0), 0.001f);
  212. EXPECT_NEAR(column.y, test(2, 1), 0.001f);
  213. EXPECT_NEAR(column.z, test(2, 2), 0.001f);
  214. EXPECT_NEAR(column.w, test(2, 3), 0.001f);
  215. column = test.getRow4F(3);
  216. EXPECT_NEAR(column.x, test(3, 0), 0.001f);
  217. EXPECT_NEAR(column.y, test(3, 1), 0.001f);
  218. EXPECT_NEAR(column.z, test(3, 2), 0.001f);
  219. EXPECT_NEAR(column.w, test(3, 3), 0.001f);
  220. }
  221. TEST(MatrixTest, TestGetColumn3F)
  222. {
  223. MatrixF test(true);
  224. test.set(EulerF(1.0f, 0.0f, 1.0f), Point3F(5.0f, 0.0f, 1.0f));
  225. Point3F column;
  226. column = test.getColumn3F(0);
  227. EXPECT_NEAR(column.x, test(0, 0), 0.001f);
  228. EXPECT_NEAR(column.y, test(1, 0), 0.001f);
  229. EXPECT_NEAR(column.z, test(2, 0), 0.001f);
  230. column = test.getColumn3F(1);
  231. EXPECT_NEAR(column.x, test(0, 1), 0.001f);
  232. EXPECT_NEAR(column.y, test(1, 1), 0.001f);
  233. EXPECT_NEAR(column.z, test(2, 1), 0.001f);
  234. column = test.getColumn3F(2);
  235. EXPECT_NEAR(column.x, test(0, 2), 0.001f);
  236. EXPECT_NEAR(column.y, test(1, 2), 0.001f);
  237. EXPECT_NEAR(column.z, test(2, 2), 0.001f);
  238. column = test.getColumn3F(3);
  239. EXPECT_NEAR(column.x, test(0, 3), 0.001f);
  240. EXPECT_NEAR(column.y, test(1, 3), 0.001f);
  241. EXPECT_NEAR(column.z, test(2, 3), 0.001f);
  242. }
  243. TEST(MatrixTest, TestGetRow3F)
  244. {
  245. MatrixF test(true);
  246. test.set(EulerF(1.0f, 0.0f, 1.0f), Point3F(5.0f, 0.0f, 1.0f));
  247. Point3F column;
  248. column = test.getRow3F(0);
  249. EXPECT_NEAR(column.x, test(0, 0), 0.001f);
  250. EXPECT_NEAR(column.y, test(0, 1), 0.001f);
  251. EXPECT_NEAR(column.z, test(0, 2), 0.001f);
  252. column = test.getRow3F(1);
  253. EXPECT_NEAR(column.x, test(1, 0), 0.001f);
  254. EXPECT_NEAR(column.y, test(1, 1), 0.001f);
  255. EXPECT_NEAR(column.z, test(1, 2), 0.001f);
  256. column = test.getRow3F(2);
  257. EXPECT_NEAR(column.x, test(2, 0), 0.001f);
  258. EXPECT_NEAR(column.y, test(2, 1), 0.001f);
  259. EXPECT_NEAR(column.z, test(2, 2), 0.001f);
  260. column = test.getRow3F(3);
  261. EXPECT_NEAR(column.x, test(3, 0), 0.001f);
  262. EXPECT_NEAR(column.y, test(3, 1), 0.001f);
  263. EXPECT_NEAR(column.z, test(3, 2), 0.001f);
  264. }
  265. TEST(MatrixTest, TestSetColumn4)
  266. {
  267. MatrixF test(true);
  268. test.set(EulerF(1.0f, 0.0f, 1.0f), Point3F(5.0f, 0.0f, 1.0f));
  269. Point4F column(1.0f, 1.0f, 1.0f, 1.0f);
  270. test.setColumn(0, column);
  271. EXPECT_NEAR(column.x, test(0, 0), 0.001f);
  272. EXPECT_NEAR(column.y, test(1, 0), 0.001f);
  273. EXPECT_NEAR(column.z, test(2, 0), 0.001f);
  274. EXPECT_NEAR(column.w, test(3, 0), 0.001f);
  275. test.setColumn(1, column);
  276. EXPECT_NEAR(column.x, test(0, 1), 0.001f);
  277. EXPECT_NEAR(column.y, test(1, 1), 0.001f);
  278. EXPECT_NEAR(column.z, test(2, 1), 0.001f);
  279. EXPECT_NEAR(column.w, test(3, 1), 0.001f);
  280. test.setColumn(2, column);
  281. EXPECT_NEAR(column.x, test(0, 2), 0.001f);
  282. EXPECT_NEAR(column.y, test(1, 2), 0.001f);
  283. EXPECT_NEAR(column.z, test(2, 2), 0.001f);
  284. EXPECT_NEAR(column.w, test(3, 2), 0.001f);
  285. test.setColumn(3, column);
  286. EXPECT_NEAR(column.x, test(0, 3), 0.001f);
  287. EXPECT_NEAR(column.y, test(1, 3), 0.001f);
  288. EXPECT_NEAR(column.z, test(2, 3), 0.001f);
  289. EXPECT_NEAR(column.w, test(3, 3), 0.001f);
  290. }
  291. TEST(MatrixTest, TestSetRow4)
  292. {
  293. MatrixF test(true);
  294. test.set(EulerF(1.0f, 0.0f, 1.0f), Point3F(5.0f, 0.0f, 1.0f));
  295. Point4F column(1.0f, 1.0f, 1.0f, 1.0f);
  296. test.setRow(0, column);
  297. EXPECT_NEAR(column.x, test(0, 0), 0.001f);
  298. EXPECT_NEAR(column.y, test(0, 1), 0.001f);
  299. EXPECT_NEAR(column.z, test(0, 2), 0.001f);
  300. EXPECT_NEAR(column.w, test(0, 3), 0.001f);
  301. test.setRow(1, column);
  302. EXPECT_NEAR(column.x, test(1, 0), 0.001f);
  303. EXPECT_NEAR(column.y, test(1, 1), 0.001f);
  304. EXPECT_NEAR(column.z, test(1, 2), 0.001f);
  305. EXPECT_NEAR(column.w, test(1, 3), 0.001f);
  306. test.setRow(2, column);
  307. EXPECT_NEAR(column.x, test(2, 0), 0.001f);
  308. EXPECT_NEAR(column.y, test(2, 1), 0.001f);
  309. EXPECT_NEAR(column.z, test(2, 2), 0.001f);
  310. EXPECT_NEAR(column.w, test(2, 3), 0.001f);
  311. test.setRow(3, column);
  312. EXPECT_NEAR(column.x, test(3, 0), 0.001f);
  313. EXPECT_NEAR(column.y, test(3, 1), 0.001f);
  314. EXPECT_NEAR(column.z, test(3, 2), 0.001f);
  315. EXPECT_NEAR(column.w, test(3, 3), 0.001f);
  316. }
  317. TEST(MatrixTest, TestSetColumn3)
  318. {
  319. MatrixF test(true);
  320. test.set(EulerF(1.0f, 0.0f, 1.0f), Point3F(5.0f, 0.0f, 1.0f));
  321. Point3F column(1.0f, 1.0f, 1.0f);
  322. test.setColumn(0, column);
  323. EXPECT_NEAR(column.x, test(0, 0), 0.001f);
  324. EXPECT_NEAR(column.y, test(1, 0), 0.001f);
  325. EXPECT_NEAR(column.z, test(2, 0), 0.001f);
  326. test.setColumn(1, column);
  327. EXPECT_NEAR(column.x, test(0, 1), 0.001f);
  328. EXPECT_NEAR(column.y, test(1, 1), 0.001f);
  329. EXPECT_NEAR(column.z, test(2, 1), 0.001f);
  330. test.setColumn(2, column);
  331. EXPECT_NEAR(column.x, test(0, 2), 0.001f);
  332. EXPECT_NEAR(column.y, test(1, 2), 0.001f);
  333. EXPECT_NEAR(column.z, test(2, 2), 0.001f);
  334. test.setColumn(3, column);
  335. EXPECT_NEAR(column.x, test(0, 3), 0.001f);
  336. EXPECT_NEAR(column.y, test(1, 3), 0.001f);
  337. EXPECT_NEAR(column.z, test(2, 3), 0.001f);
  338. }
  339. TEST(MatrixTest, TestSetRow3)
  340. {
  341. MatrixF test(true);
  342. test.set(EulerF(1.0f, 0.0f, 1.0f), Point3F(5.0f, 0.0f, 1.0f));
  343. Point3F column(1.0f, 1.0f, 1.0f);
  344. test.setRow(0, column);
  345. EXPECT_NEAR(column.x, test(0, 0), 0.001f);
  346. EXPECT_NEAR(column.y, test(0, 1), 0.001f);
  347. EXPECT_NEAR(column.z, test(0, 2), 0.001f);
  348. test.setRow(1, column);
  349. EXPECT_NEAR(column.x, test(1, 0), 0.001f);
  350. EXPECT_NEAR(column.y, test(1, 1), 0.001f);
  351. EXPECT_NEAR(column.z, test(1, 2), 0.001f);
  352. test.setRow(2, column);
  353. EXPECT_NEAR(column.x, test(2, 0), 0.001f);
  354. EXPECT_NEAR(column.y, test(2, 1), 0.001f);
  355. EXPECT_NEAR(column.z, test(2, 2), 0.001f);
  356. test.setRow(3, column);
  357. EXPECT_NEAR(column.x, test(3, 0), 0.001f);
  358. EXPECT_NEAR(column.y, test(3, 1), 0.001f);
  359. EXPECT_NEAR(column.z, test(3, 2), 0.001f);
  360. }
  361. TEST(MatrixTest, TestDisplace)
  362. {
  363. MatrixF test(true);
  364. test.set(EulerF(1.0f, 0.0f, 1.0f), Point3F(5.0f, 0.0f, 1.0f));
  365. Point3F column(1.0f, 1.0f, 1.0f);
  366. test.displace(column);
  367. EXPECT_NEAR(test(0, 3), 6.0f, 0.001f);
  368. EXPECT_NEAR(test(1, 3), 1.0f, 0.001f);
  369. EXPECT_NEAR(test(2, 3), 2.0f, 0.001f);
  370. }
  371. TEST(MatrixTest, TestGetVectorFunctions)
  372. {
  373. MatrixF test(true);
  374. test.set(EulerF(1.0f, 0.0f, 1.0f), Point3F(5.0f, 0.0f, 1.0f));
  375. VectorF vector;
  376. vector = test.getRightVector();
  377. EXPECT_NEAR(vector.x, test(0, 0), 0.001f);
  378. EXPECT_NEAR(vector.y, test(1, 0), 0.001f);
  379. EXPECT_NEAR(vector.z, test(2, 0), 0.001f);
  380. vector = test.getForwardVector();
  381. EXPECT_NEAR(vector.x, test(0, 1), 0.001f);
  382. EXPECT_NEAR(vector.y, test(1, 1), 0.001f);
  383. EXPECT_NEAR(vector.z, test(2, 1), 0.001f);
  384. vector = test.getUpVector();
  385. EXPECT_NEAR(vector.x, test(0, 2), 0.001f);
  386. EXPECT_NEAR(vector.y, test(1, 2), 0.001f);
  387. EXPECT_NEAR(vector.z, test(2, 2), 0.001f);
  388. }
  389. TEST(MatrixTest, TestSetCrossProduct)
  390. {
  391. MatrixF test(true);
  392. test.setCrossProduct(Point3F(5.0f, 0.0f, 1.0f));
  393. 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);
  394. 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);
  395. 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);
  396. 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);
  397. }
  398. TEST(MatrixTest, TestSetTensorProduct)
  399. {
  400. MatrixF test(true);
  401. test.setTensorProduct(Point3F(5.0f, 2.0f, 1.0f), Point3F(5.0f, 2.0f, 1.0f));
  402. 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);
  403. 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);
  404. 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);
  405. 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);
  406. }
  407. TEST(MatrixTest, TestMulFunction)
  408. {
  409. MatrixF test(true);
  410. test.setPosition(Point3F(5.0f, 2.0f, 1.0f));
  411. MatrixF test2(EulerF(1.0f, 0.0f, 1.0f));
  412. test.mul(test2);
  413. 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);
  414. 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);
  415. 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);
  416. 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);
  417. }
  418. TEST(MatrixTest, TestMulOperator)
  419. {
  420. MatrixF test(true);
  421. test.setPosition(Point3F(5.0f, 2.0f, 1.0f));
  422. MatrixF test2(EulerF(1.0f, 0.0f, 1.0f));
  423. test = test * test2;
  424. 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);
  425. 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);
  426. 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);
  427. 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);
  428. }
  429. TEST(MatrixTest, TestMulLFunction)
  430. {
  431. MatrixF test(true);
  432. test.setPosition(Point3F(5.0f, 2.0f, 1.0f));
  433. MatrixF test2(EulerF(1.0f, 0.0f, 1.0f));
  434. test.mulL(test2);
  435. 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);
  436. 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);
  437. 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);
  438. 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);
  439. }
  440. TEST(MatrixTest, TestMulArgMatrixFunction)
  441. {
  442. MatrixF testResult(true);
  443. MatrixF test(true);
  444. test.setPosition(Point3F(5.0f, 2.0f, 1.0f));
  445. MatrixF test2(EulerF(1.0f, 0.0f, 1.0f));
  446. testResult.mul(test2, test);
  447. 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);
  448. 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);
  449. 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);
  450. 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);
  451. }
  452. TEST(MatrixTest, TestMulArgMultipleRotationMatrix)
  453. {
  454. MatrixF testResult(true);
  455. MatrixF xRot(EulerF(-1.54f, 0.0f, 0.0f));
  456. MatrixF zRot(EulerF(0.0f, 0.0f, -1.57f));
  457. testResult.mul(zRot, xRot);
  458. 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);
  459. 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);
  460. 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);
  461. 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);
  462. }
  463. TEST(MatrixTest, TestMulScalarFunction)
  464. {
  465. MatrixF test(true);
  466. test.setPosition(Point3F(5.0f, 2.0f, 1.0f));
  467. MatrixF test2(EulerF(1.0f, 0.0f, 1.0f));
  468. test.mulL(test2);
  469. test.mul(2.0f);
  470. 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);
  471. 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);
  472. 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);
  473. 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);
  474. }
  475. TEST(MatrixTest, TestMulMatScalarFunction)
  476. {
  477. MatrixF testTran(true);
  478. testTran.setPosition(Point3F(5.0f, 2.0f, 1.0f));
  479. MatrixF test2(EulerF(1.0f, 0.0f, 1.0f));
  480. testTran.mulL(test2);
  481. MatrixF test(true);
  482. test.mul(testTran, 2.0f);
  483. 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);
  484. 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);
  485. 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);
  486. 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);
  487. }
  488. TEST(MatrixTest, TestMulPoint4)
  489. {
  490. MatrixF test(true);
  491. test.setPosition(Point3F(5.0f, 2.0f, 1.0f));
  492. MatrixF test2(EulerF(1.0f, 0.0f, 1.0f));
  493. test.mulL(test2);
  494. Point4F testPoint(0.5f, 1.0f, 2.0f, 1.0f);
  495. test.mul(testPoint);
  496. 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);
  497. }
  498. TEST(MatrixTest, TestMulPoint3)
  499. {
  500. MatrixF test(true);
  501. test.setPosition(Point3F(5.0f, 2.0f, 1.0f));
  502. MatrixF test2(EulerF(1.0f, 0.0f, 1.0f));
  503. test.mulL(test2);
  504. Point3F testPoint(0.5f, 1.0f, 2.0f);
  505. test.mulP(testPoint);
  506. EXPECT_NEAR(testPoint.x, 5.496f, 0.001f); EXPECT_NEAR(testPoint.y, 0.899f, 0.001f); EXPECT_NEAR(testPoint.z, 4.151f, 0.001f);
  507. }
  508. TEST(MatrixTest, TestMulPoint3ToPoint3)
  509. {
  510. MatrixF test(true);
  511. test.setPosition(Point3F(5.0f, 2.0f, 1.0f));
  512. MatrixF test2(EulerF(1.0f, 0.0f, 1.0f));
  513. test.mulL(test2);
  514. Point3F point(0.5f, 1.0f, 2.0f);
  515. Point3F testPoint;
  516. test.mulP(point, &testPoint);
  517. EXPECT_NEAR(testPoint.x, 5.496f, 0.001f); EXPECT_NEAR(testPoint.y, 0.899f, 0.001f); EXPECT_NEAR(testPoint.z, 4.151f, 0.001f);
  518. }
  519. TEST(MatrixTest, TestMulVector)
  520. {
  521. MatrixF test(true);
  522. test.setPosition(Point3F(5.0f, 2.0f, 1.0f));
  523. MatrixF test2(EulerF(1.0f, 0.0f, 1.0f));
  524. test.mulL(test2);
  525. VectorF testPoint(0.5f, 1.0f, 2.0f);
  526. test.mulV(testPoint);
  527. EXPECT_NEAR(testPoint.x, 1.111f, 0.001f); EXPECT_NEAR(testPoint.y, 1.747f, 0.001f); EXPECT_NEAR(testPoint.z, 0.979f, 0.001f);
  528. }
  529. TEST(MatrixTest, TestMulVectorToPoint3)
  530. {
  531. MatrixF test(true);
  532. test.setPosition(Point3F(5.0f, 2.0f, 1.0f));
  533. MatrixF test2(EulerF(1.0f, 0.0f, 1.0f));
  534. test.mulL(test2);
  535. VectorF vec(0.5f, 1.0f, 2.0f);
  536. Point3F testPoint;
  537. test.mulV(vec, &testPoint);
  538. EXPECT_NEAR(testPoint.x, 1.111f, 0.001f); EXPECT_NEAR(testPoint.y, 1.747f, 0.001f); EXPECT_NEAR(testPoint.z, 0.979f, 0.001f);
  539. }
  540. TEST(MatrixTest, TestMulBox)
  541. {
  542. MatrixF test(true);
  543. test.setPosition(Point3F(5.0f, 2.0f, 1.0f));
  544. MatrixF test2(EulerF(1.0f, 0.0f, 1.0f));
  545. Box3F testBox(1.0f);
  546. test.mul(testBox);
  547. 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);
  548. 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);
  549. }
  550. TEST(MatrixTest, TestMatrixAdd)
  551. {
  552. MatrixF test(true);
  553. MatrixF test2(true);
  554. for (U32 i = 0; i < 4; i++)
  555. {
  556. for (U32 j = 0; j < 4; j++)
  557. {
  558. test(i, j) = 1.0f;
  559. test2(i, j) = 1.0f;
  560. }
  561. }
  562. test.add(test2);
  563. for (U32 i = 0; i < 4; i++)
  564. {
  565. for (U32 j = 0; j < 4; j++)
  566. {
  567. EXPECT_NEAR(test(i,j), 2.0f, 0.001f);
  568. }
  569. }
  570. }
  571. TEST(MatrixTest, TestReverseProjection)
  572. {
  573. MatrixF test(true);
  574. test.setPosition(Point3F(5.0f, 2.0f, 1.0f));
  575. Frustum testFrustum(false, -1.0f, 1.0f, 1.0f, -1.0f, 0.1f, 100.0f, test);
  576. testFrustum.getProjectionMatrix(&test);
  577. // test before and after reverse.
  578. EXPECT_NEAR(test(0, 0), 0.1f, 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);
  579. EXPECT_NEAR(test(1, 0), 0.0f, 0.001f); EXPECT_NEAR(test(1, 1), 0.0f, 0.001f); EXPECT_NEAR(test(1, 2), 0.1, 0.001f); EXPECT_NEAR(test(1, 3), 0.0f, 0.001f);
  580. EXPECT_NEAR(test(2, 0), 0.0f, 0.001f); EXPECT_NEAR(test(2, 1), -0.001f, 0.001f); EXPECT_NEAR(test(2, 2), 0.0f, 0.001f); EXPECT_NEAR(test(2, 3), 0.1001f, 0.001f);
  581. 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);
  582. test.reverseProjection();
  583. EXPECT_NEAR(test(0, 0), 0.1f, 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);
  584. EXPECT_NEAR(test(1, 0), 0.0f, 0.001f); EXPECT_NEAR(test(1, 1), 0.0f, 0.001f); EXPECT_NEAR(test(1, 2), 0.1, 0.001f); EXPECT_NEAR(test(1, 3), 0.0, 0.001f);
  585. EXPECT_NEAR(test(2, 0), 0.0f, 0.001f); EXPECT_NEAR(test(2, 1), 1.001f, 0.001f); EXPECT_NEAR(test(2, 2), 0.0f, 0.001f); EXPECT_NEAR(test(2, 3), -0.1001f, 0.001f);
  586. 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);
  587. }
  588. TEST(MatrixTest, TestInverse)
  589. {
  590. MatrixF test(true);
  591. test.setPosition(Point3F(5.0f, 2.0f, 1.0f));
  592. MatrixF test2(EulerF(1.0f, 0.0f, 1.0f));
  593. test.mulL(test2);
  594. test.inverse();
  595. 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);
  596. 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);
  597. 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);
  598. 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);
  599. }
  600. TEST(MatrixTest, TestInvertTo)
  601. {
  602. MatrixF test1(true);
  603. test1.setPosition(Point3F(5.0f, 2.0f, 1.0f));
  604. MatrixF test2(EulerF(1.0f, 0.0f, 1.0f));
  605. test1.mulL(test2);
  606. MatrixF test(true);
  607. test1.invertTo(&test);
  608. 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);
  609. 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);
  610. 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);
  611. 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);
  612. }
  613. TEST(MatrixTest, TestFullInverse)
  614. {
  615. MatrixF test(true);
  616. test.setPosition(Point3F(5.0f, 2.0f, 1.0f));
  617. MatrixF test2(EulerF(1.0f, 0.0f, 1.0f));
  618. test.mulL(test2);
  619. EXPECT_TRUE(test.fullInverse());
  620. 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);
  621. 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);
  622. 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);
  623. 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);
  624. }
  625. TEST(MatrixTest, TestIsAffine)
  626. {
  627. MatrixF test(true);
  628. test.setPosition(Point3F(5.0f, 2.0f, 1.0f));
  629. MatrixF test2(EulerF(1.0f, 0.0f, 1.0f));
  630. test.mulL(test2);
  631. EXPECT_TRUE(test.isAffine());
  632. }
  633. TEST(MatrixTest, TestScale)
  634. {
  635. MatrixF test(true);
  636. test.setPosition(Point3F(5.0f, 2.0f, 1.0f));
  637. MatrixF test2(EulerF(1.0f, 0.0f, 1.0f));
  638. test.mulL(test2);
  639. test.scale(2.0f);
  640. 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);
  641. 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);
  642. 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);
  643. 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);
  644. }
  645. TEST(MatrixTest, TestGetScale)
  646. {
  647. MatrixF test(true);
  648. test.setPosition(Point3F(5.0f, 2.0f, 1.0f));
  649. MatrixF test2(EulerF(1.0f, 0.0f, 1.0f));
  650. test.mulL(test2);
  651. test.scale(2.0f);
  652. Point3F scale;
  653. scale = test.getScale();
  654. EXPECT_NEAR(scale.x, 2.0f, 0.001f); EXPECT_NEAR(scale.y, 2.0f, 0.001f); EXPECT_NEAR(scale.z, 2.0f, 0.001f);
  655. }
  656. TEST(MatrixTest, TestAffineInverse)
  657. {
  658. MatrixF test(true);
  659. test.setPosition(Point3F(5.0f, 2.0f, 1.0f));
  660. MatrixF test2(EulerF(1.0f, 0.0f, 1.0f));
  661. test.mulL(test2);
  662. test.affineInverse();
  663. 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);
  664. 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);
  665. 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);
  666. 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);
  667. }
  668. TEST(MatrixTest, TestTranspose)
  669. {
  670. MatrixF test(true);
  671. test.setPosition(Point3F(5.0f, 2.0f, 1.0f));
  672. MatrixF test2(EulerF(1.0f, 0.0f, 1.0f));
  673. test.mulL(test2);
  674. test.transpose();
  675. 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);
  676. 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);
  677. 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);
  678. 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);
  679. }
  680. TEST(MatrixTest, TestTransposeTo)
  681. {
  682. MatrixF test1(true);
  683. test1.setPosition(Point3F(5.0f, 2.0f, 1.0f));
  684. MatrixF test2(EulerF(1.0f, 0.0f, 1.0f));
  685. test1.mulL(test2);
  686. MatrixF test(true);
  687. test1.transposeTo(test);
  688. 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);
  689. 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);
  690. 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);
  691. 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);
  692. }
  693. TEST(MatrixTest, TestTransformPlane)
  694. {
  695. MatrixF test(true);
  696. test.setPosition(Point3F(5.0f, 2.0f, 1.0f));
  697. MatrixF test2(EulerF(1.0f, 0.0f, 1.0f));
  698. test.mulL(test2);
  699. PlaneF plane(Point3F(0.0f, 0.0f, 0.0f), Point3F(0.0f, 0.0f, 1.0f));
  700. PlaneF res;
  701. mTransformPlane(test, Point3F(1.0f, 1.0f, 1.0f), plane, &res);
  702. EXPECT_NEAR(res.x, 0.0f, 0.001f);
  703. EXPECT_NEAR(res.y, 0.8414f, 0.001f);
  704. EXPECT_NEAR(res.z, 0.5403f, 0.001f);
  705. EXPECT_NEAR(res.d, -1.0f, 0.001f);
  706. }