mathMatrixTest.cpp 41 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014
  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, POINT_EPSILON);
  15. EXPECT_NEAR(test(1, 1), 1.0f, POINT_EPSILON);
  16. EXPECT_NEAR(test(2, 2), 1.0f, POINT_EPSILON);
  17. EXPECT_NEAR(test(3, 3), 1.0f, POINT_EPSILON);
  18. }
  19. TEST(MatrixTest, TestIdentitySet)
  20. {
  21. MatrixF test(false);
  22. test.identity();
  23. EXPECT_NEAR(test(0, 0), 1.0f, POINT_EPSILON);
  24. EXPECT_NEAR(test(1, 1), 1.0f, POINT_EPSILON);
  25. EXPECT_NEAR(test(2, 2), 1.0f, POINT_EPSILON);
  26. EXPECT_NEAR(test(3, 3), 1.0f, POINT_EPSILON);
  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, POINT_EPSILON); EXPECT_NEAR(test(0, 1), 0.8415f, POINT_EPSILON); EXPECT_NEAR(test(0, 2), 0.0f, POINT_EPSILON); EXPECT_NEAR(test(0, 3), 0.0f, POINT_EPSILON);
  37. EXPECT_NEAR(test(1, 0), -0.4546f, POINT_EPSILON); EXPECT_NEAR(test(1, 1), 0.2919f, POINT_EPSILON); EXPECT_NEAR(test(1, 2), 0.8415f, POINT_EPSILON); EXPECT_NEAR(test(1, 3), 0.0f, POINT_EPSILON);
  38. EXPECT_NEAR(test(2, 0), 0.7081f, POINT_EPSILON); EXPECT_NEAR(test(2, 1), -0.4546f, POINT_EPSILON); EXPECT_NEAR(test(2, 2), 0.5403f, POINT_EPSILON); EXPECT_NEAR(test(2, 3), 0.0f, POINT_EPSILON);
  39. EXPECT_NEAR(test(3, 0), 0.0f, POINT_EPSILON); EXPECT_NEAR(test(3, 1), 0.0f, POINT_EPSILON); EXPECT_NEAR(test(3, 2), 0.0f, POINT_EPSILON); EXPECT_NEAR(test(3, 3), 1.0f, POINT_EPSILON);
  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, POINT_EPSILON); EXPECT_NEAR(test(0, 1), 0.8415f, POINT_EPSILON); EXPECT_NEAR(test(0, 2), 0.0f, POINT_EPSILON); EXPECT_NEAR(test(0, 3), 0.0f, POINT_EPSILON);
  46. EXPECT_NEAR(test(1, 0), -0.4546f, POINT_EPSILON); EXPECT_NEAR(test(1, 1), 0.2919f, POINT_EPSILON); EXPECT_NEAR(test(1, 2), 0.8415f, POINT_EPSILON); EXPECT_NEAR(test(1, 3), 0.0f, POINT_EPSILON);
  47. EXPECT_NEAR(test(2, 0), 0.7081f, POINT_EPSILON); EXPECT_NEAR(test(2, 1), -0.4546f, POINT_EPSILON); EXPECT_NEAR(test(2, 2), 0.5403f, POINT_EPSILON); EXPECT_NEAR(test(2, 3), 0.0f, POINT_EPSILON);
  48. EXPECT_NEAR(test(3, 0), 0.0f, POINT_EPSILON); EXPECT_NEAR(test(3, 1), 0.0f, POINT_EPSILON); EXPECT_NEAR(test(3, 2), 0.0f, POINT_EPSILON); EXPECT_NEAR(test(3, 3), 1.0f, POINT_EPSILON);
  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, POINT_EPSILON); EXPECT_NEAR(euler.y, 0.0f, POINT_EPSILON); EXPECT_NEAR(euler.z, 1.0f, POINT_EPSILON);
  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, POINT_EPSILON); EXPECT_NEAR(test(0, 1), 0.8415f, POINT_EPSILON); EXPECT_NEAR(test(0, 2), 0.0f, POINT_EPSILON); EXPECT_NEAR(test(0, 3), 5.0f, POINT_EPSILON);
  61. EXPECT_NEAR(test(1, 0), -0.4546f, POINT_EPSILON); EXPECT_NEAR(test(1, 1), 0.2919f, POINT_EPSILON); EXPECT_NEAR(test(1, 2), 0.8415f, POINT_EPSILON); EXPECT_NEAR(test(1, 3), 0.0f, POINT_EPSILON);
  62. EXPECT_NEAR(test(2, 0), 0.7081f, POINT_EPSILON); EXPECT_NEAR(test(2, 1), -0.4546f, POINT_EPSILON); EXPECT_NEAR(test(2, 2), 0.5403f, POINT_EPSILON); EXPECT_NEAR(test(2, 3), 1.0f, POINT_EPSILON);
  63. EXPECT_NEAR(test(3, 0), 0.0f, POINT_EPSILON); EXPECT_NEAR(test(3, 1), 0.0f, POINT_EPSILON); EXPECT_NEAR(test(3, 2), 0.0f, POINT_EPSILON); EXPECT_NEAR(test(3, 3), 1.0f, POINT_EPSILON);
  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, POINT_EPSILON); EXPECT_NEAR(test(0, 1), 0.8415f, POINT_EPSILON); EXPECT_NEAR(test(0, 2), 0.0f, POINT_EPSILON); EXPECT_NEAR(test(0, 3), 5.0f, POINT_EPSILON);
  70. EXPECT_NEAR(test(1, 0), -0.4546f, POINT_EPSILON); EXPECT_NEAR(test(1, 1), 0.2919f, POINT_EPSILON); EXPECT_NEAR(test(1, 2), 0.8415f, POINT_EPSILON); EXPECT_NEAR(test(1, 3), 0.0f, POINT_EPSILON);
  71. EXPECT_NEAR(test(2, 0), 0.7081f, POINT_EPSILON); EXPECT_NEAR(test(2, 1), -0.4546f, POINT_EPSILON); EXPECT_NEAR(test(2, 2), 0.5403f, POINT_EPSILON); EXPECT_NEAR(test(2, 3), 1.0f, POINT_EPSILON);
  72. EXPECT_NEAR(test(3, 0), 0.0f, POINT_EPSILON); EXPECT_NEAR(test(3, 1), 0.0f, POINT_EPSILON); EXPECT_NEAR(test(3, 2), 0.0f, POINT_EPSILON); EXPECT_NEAR(test(3, 3), 1.0f, POINT_EPSILON);
  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), POINT_EPSILON);
  81. EXPECT_NEAR(column.y, test(1, 0), POINT_EPSILON);
  82. EXPECT_NEAR(column.z, test(2, 0), POINT_EPSILON);
  83. EXPECT_NEAR(column.w, test(3, 0), POINT_EPSILON);
  84. test.getColumn(1, &column);
  85. EXPECT_NEAR(column.x, test(0, 1), POINT_EPSILON);
  86. EXPECT_NEAR(column.y, test(1, 1), POINT_EPSILON);
  87. EXPECT_NEAR(column.z, test(2, 1), POINT_EPSILON);
  88. EXPECT_NEAR(column.w, test(3, 1), POINT_EPSILON);
  89. test.getColumn(2, &column);
  90. EXPECT_NEAR(column.x, test(0, 2), POINT_EPSILON);
  91. EXPECT_NEAR(column.y, test(1, 2), POINT_EPSILON);
  92. EXPECT_NEAR(column.z, test(2, 2), POINT_EPSILON);
  93. EXPECT_NEAR(column.w, test(3, 2), POINT_EPSILON);
  94. test.getColumn(3, &column);
  95. EXPECT_NEAR(column.x, test(0, 3), POINT_EPSILON);
  96. EXPECT_NEAR(column.y, test(1, 3), POINT_EPSILON);
  97. EXPECT_NEAR(column.z, test(2, 3), POINT_EPSILON);
  98. EXPECT_NEAR(column.w, test(3, 3), POINT_EPSILON);
  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), POINT_EPSILON);
  107. EXPECT_NEAR(column.y, test(0, 1), POINT_EPSILON);
  108. EXPECT_NEAR(column.z, test(0, 2), POINT_EPSILON);
  109. EXPECT_NEAR(column.w, test(0, 3), POINT_EPSILON);
  110. test.getRow(1, &column);
  111. EXPECT_NEAR(column.x, test(1, 0), POINT_EPSILON);
  112. EXPECT_NEAR(column.y, test(1, 1), POINT_EPSILON);
  113. EXPECT_NEAR(column.z, test(1, 2), POINT_EPSILON);
  114. EXPECT_NEAR(column.w, test(1, 3), POINT_EPSILON);
  115. test.getRow(2, &column);
  116. EXPECT_NEAR(column.x, test(2, 0), POINT_EPSILON);
  117. EXPECT_NEAR(column.y, test(2, 1), POINT_EPSILON);
  118. EXPECT_NEAR(column.z, test(2, 2), POINT_EPSILON);
  119. EXPECT_NEAR(column.w, test(2, 3), POINT_EPSILON);
  120. test.getRow(3, &column);
  121. EXPECT_NEAR(column.x, test(3, 0), POINT_EPSILON);
  122. EXPECT_NEAR(column.y, test(3, 1), POINT_EPSILON);
  123. EXPECT_NEAR(column.z, test(3, 2), POINT_EPSILON);
  124. EXPECT_NEAR(column.w, test(3, 3), POINT_EPSILON);
  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), POINT_EPSILON);
  133. EXPECT_NEAR(column.y, test(1, 0), POINT_EPSILON);
  134. EXPECT_NEAR(column.z, test(2, 0), POINT_EPSILON);
  135. test.getColumn(1, &column);
  136. EXPECT_NEAR(column.x, test(0, 1), POINT_EPSILON);
  137. EXPECT_NEAR(column.y, test(1, 1), POINT_EPSILON);
  138. EXPECT_NEAR(column.z, test(2, 1), POINT_EPSILON);
  139. test.getColumn(2, &column);
  140. EXPECT_NEAR(column.x, test(0, 2), POINT_EPSILON);
  141. EXPECT_NEAR(column.y, test(1, 2), POINT_EPSILON);
  142. EXPECT_NEAR(column.z, test(2, 2), POINT_EPSILON);
  143. test.getColumn(3, &column);
  144. EXPECT_NEAR(column.x, test(0, 3), POINT_EPSILON);
  145. EXPECT_NEAR(column.y, test(1, 3), POINT_EPSILON);
  146. EXPECT_NEAR(column.z, test(2, 3), POINT_EPSILON);
  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), POINT_EPSILON);
  155. EXPECT_NEAR(column.y, test(0, 1), POINT_EPSILON);
  156. EXPECT_NEAR(column.z, test(0, 2), POINT_EPSILON);
  157. test.getRow(1, &column);
  158. EXPECT_NEAR(column.x, test(1, 0), POINT_EPSILON);
  159. EXPECT_NEAR(column.y, test(1, 1), POINT_EPSILON);
  160. EXPECT_NEAR(column.z, test(1, 2), POINT_EPSILON);
  161. test.getRow(2, &column);
  162. EXPECT_NEAR(column.x, test(2, 0), POINT_EPSILON);
  163. EXPECT_NEAR(column.y, test(2, 1), POINT_EPSILON);
  164. EXPECT_NEAR(column.z, test(2, 2), POINT_EPSILON);
  165. test.getRow(3, &column);
  166. EXPECT_NEAR(column.x, test(3, 0), POINT_EPSILON);
  167. EXPECT_NEAR(column.y, test(3, 1), POINT_EPSILON);
  168. EXPECT_NEAR(column.z, test(3, 2), POINT_EPSILON);
  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), POINT_EPSILON);
  177. EXPECT_NEAR(column.y, test(1, 0), POINT_EPSILON);
  178. EXPECT_NEAR(column.z, test(2, 0), POINT_EPSILON);
  179. EXPECT_NEAR(column.w, test(3, 0), POINT_EPSILON);
  180. column = test.getColumn4F(1);
  181. EXPECT_NEAR(column.x, test(0, 1), POINT_EPSILON);
  182. EXPECT_NEAR(column.y, test(1, 1), POINT_EPSILON);
  183. EXPECT_NEAR(column.z, test(2, 1), POINT_EPSILON);
  184. EXPECT_NEAR(column.w, test(3, 1), POINT_EPSILON);
  185. column = test.getColumn4F(2);
  186. EXPECT_NEAR(column.x, test(0, 2), POINT_EPSILON);
  187. EXPECT_NEAR(column.y, test(1, 2), POINT_EPSILON);
  188. EXPECT_NEAR(column.z, test(2, 2), POINT_EPSILON);
  189. EXPECT_NEAR(column.w, test(3, 2), POINT_EPSILON);
  190. column = test.getColumn4F(3);
  191. EXPECT_NEAR(column.x, test(0, 3), POINT_EPSILON);
  192. EXPECT_NEAR(column.y, test(1, 3), POINT_EPSILON);
  193. EXPECT_NEAR(column.z, test(2, 3), POINT_EPSILON);
  194. EXPECT_NEAR(column.w, test(3, 3), POINT_EPSILON);
  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), POINT_EPSILON);
  203. EXPECT_NEAR(column.y, test(0, 1), POINT_EPSILON);
  204. EXPECT_NEAR(column.z, test(0, 2), POINT_EPSILON);
  205. EXPECT_NEAR(column.w, test(0, 3), POINT_EPSILON);
  206. column = test.getRow4F(1);
  207. EXPECT_NEAR(column.x, test(1, 0), POINT_EPSILON);
  208. EXPECT_NEAR(column.y, test(1, 1), POINT_EPSILON);
  209. EXPECT_NEAR(column.z, test(1, 2), POINT_EPSILON);
  210. EXPECT_NEAR(column.w, test(1, 3), POINT_EPSILON);
  211. column = test.getRow4F(2);
  212. EXPECT_NEAR(column.x, test(2, 0), POINT_EPSILON);
  213. EXPECT_NEAR(column.y, test(2, 1), POINT_EPSILON);
  214. EXPECT_NEAR(column.z, test(2, 2), POINT_EPSILON);
  215. EXPECT_NEAR(column.w, test(2, 3), POINT_EPSILON);
  216. column = test.getRow4F(3);
  217. EXPECT_NEAR(column.x, test(3, 0), POINT_EPSILON);
  218. EXPECT_NEAR(column.y, test(3, 1), POINT_EPSILON);
  219. EXPECT_NEAR(column.z, test(3, 2), POINT_EPSILON);
  220. EXPECT_NEAR(column.w, test(3, 3), POINT_EPSILON);
  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), POINT_EPSILON);
  229. EXPECT_NEAR(column.y, test(1, 0), POINT_EPSILON);
  230. EXPECT_NEAR(column.z, test(2, 0), POINT_EPSILON);
  231. column = test.getColumn3F(1);
  232. EXPECT_NEAR(column.x, test(0, 1), POINT_EPSILON);
  233. EXPECT_NEAR(column.y, test(1, 1), POINT_EPSILON);
  234. EXPECT_NEAR(column.z, test(2, 1), POINT_EPSILON);
  235. column = test.getColumn3F(2);
  236. EXPECT_NEAR(column.x, test(0, 2), POINT_EPSILON);
  237. EXPECT_NEAR(column.y, test(1, 2), POINT_EPSILON);
  238. EXPECT_NEAR(column.z, test(2, 2), POINT_EPSILON);
  239. column = test.getColumn3F(3);
  240. EXPECT_NEAR(column.x, test(0, 3), POINT_EPSILON);
  241. EXPECT_NEAR(column.y, test(1, 3), POINT_EPSILON);
  242. EXPECT_NEAR(column.z, test(2, 3), POINT_EPSILON);
  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), POINT_EPSILON);
  251. EXPECT_NEAR(column.y, test(0, 1), POINT_EPSILON);
  252. EXPECT_NEAR(column.z, test(0, 2), POINT_EPSILON);
  253. column = test.getRow3F(1);
  254. EXPECT_NEAR(column.x, test(1, 0), POINT_EPSILON);
  255. EXPECT_NEAR(column.y, test(1, 1), POINT_EPSILON);
  256. EXPECT_NEAR(column.z, test(1, 2), POINT_EPSILON);
  257. column = test.getRow3F(2);
  258. EXPECT_NEAR(column.x, test(2, 0), POINT_EPSILON);
  259. EXPECT_NEAR(column.y, test(2, 1), POINT_EPSILON);
  260. EXPECT_NEAR(column.z, test(2, 2), POINT_EPSILON);
  261. column = test.getRow3F(3);
  262. EXPECT_NEAR(column.x, test(3, 0), POINT_EPSILON);
  263. EXPECT_NEAR(column.y, test(3, 1), POINT_EPSILON);
  264. EXPECT_NEAR(column.z, test(3, 2), POINT_EPSILON);
  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), POINT_EPSILON);
  273. EXPECT_NEAR(column.y, test(1, 0), POINT_EPSILON);
  274. EXPECT_NEAR(column.z, test(2, 0), POINT_EPSILON);
  275. EXPECT_NEAR(column.w, test(3, 0), POINT_EPSILON);
  276. test.setColumn(1, column);
  277. EXPECT_NEAR(column.x, test(0, 1), POINT_EPSILON);
  278. EXPECT_NEAR(column.y, test(1, 1), POINT_EPSILON);
  279. EXPECT_NEAR(column.z, test(2, 1), POINT_EPSILON);
  280. EXPECT_NEAR(column.w, test(3, 1), POINT_EPSILON);
  281. test.setColumn(2, column);
  282. EXPECT_NEAR(column.x, test(0, 2), POINT_EPSILON);
  283. EXPECT_NEAR(column.y, test(1, 2), POINT_EPSILON);
  284. EXPECT_NEAR(column.z, test(2, 2), POINT_EPSILON);
  285. EXPECT_NEAR(column.w, test(3, 2), POINT_EPSILON);
  286. test.setColumn(3, column);
  287. EXPECT_NEAR(column.x, test(0, 3), POINT_EPSILON);
  288. EXPECT_NEAR(column.y, test(1, 3), POINT_EPSILON);
  289. EXPECT_NEAR(column.z, test(2, 3), POINT_EPSILON);
  290. EXPECT_NEAR(column.w, test(3, 3), POINT_EPSILON);
  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), POINT_EPSILON);
  299. EXPECT_NEAR(column.y, test(0, 1), POINT_EPSILON);
  300. EXPECT_NEAR(column.z, test(0, 2), POINT_EPSILON);
  301. EXPECT_NEAR(column.w, test(0, 3), POINT_EPSILON);
  302. test.setRow(1, column);
  303. EXPECT_NEAR(column.x, test(1, 0), POINT_EPSILON);
  304. EXPECT_NEAR(column.y, test(1, 1), POINT_EPSILON);
  305. EXPECT_NEAR(column.z, test(1, 2), POINT_EPSILON);
  306. EXPECT_NEAR(column.w, test(1, 3), POINT_EPSILON);
  307. test.setRow(2, column);
  308. EXPECT_NEAR(column.x, test(2, 0), POINT_EPSILON);
  309. EXPECT_NEAR(column.y, test(2, 1), POINT_EPSILON);
  310. EXPECT_NEAR(column.z, test(2, 2), POINT_EPSILON);
  311. EXPECT_NEAR(column.w, test(2, 3), POINT_EPSILON);
  312. test.setRow(3, column);
  313. EXPECT_NEAR(column.x, test(3, 0), POINT_EPSILON);
  314. EXPECT_NEAR(column.y, test(3, 1), POINT_EPSILON);
  315. EXPECT_NEAR(column.z, test(3, 2), POINT_EPSILON);
  316. EXPECT_NEAR(column.w, test(3, 3), POINT_EPSILON);
  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), POINT_EPSILON);
  325. EXPECT_NEAR(column.y, test(1, 0), POINT_EPSILON);
  326. EXPECT_NEAR(column.z, test(2, 0), POINT_EPSILON);
  327. test.setColumn(1, column);
  328. EXPECT_NEAR(column.x, test(0, 1), POINT_EPSILON);
  329. EXPECT_NEAR(column.y, test(1, 1), POINT_EPSILON);
  330. EXPECT_NEAR(column.z, test(2, 1), POINT_EPSILON);
  331. test.setColumn(2, column);
  332. EXPECT_NEAR(column.x, test(0, 2), POINT_EPSILON);
  333. EXPECT_NEAR(column.y, test(1, 2), POINT_EPSILON);
  334. EXPECT_NEAR(column.z, test(2, 2), POINT_EPSILON);
  335. test.setColumn(3, column);
  336. EXPECT_NEAR(column.x, test(0, 3), POINT_EPSILON);
  337. EXPECT_NEAR(column.y, test(1, 3), POINT_EPSILON);
  338. EXPECT_NEAR(column.z, test(2, 3), POINT_EPSILON);
  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), POINT_EPSILON);
  347. EXPECT_NEAR(column.y, test(0, 1), POINT_EPSILON);
  348. EXPECT_NEAR(column.z, test(0, 2), POINT_EPSILON);
  349. test.setRow(1, column);
  350. EXPECT_NEAR(column.x, test(1, 0), POINT_EPSILON);
  351. EXPECT_NEAR(column.y, test(1, 1), POINT_EPSILON);
  352. EXPECT_NEAR(column.z, test(1, 2), POINT_EPSILON);
  353. test.setRow(2, column);
  354. EXPECT_NEAR(column.x, test(2, 0), POINT_EPSILON);
  355. EXPECT_NEAR(column.y, test(2, 1), POINT_EPSILON);
  356. EXPECT_NEAR(column.z, test(2, 2), POINT_EPSILON);
  357. test.setRow(3, column);
  358. EXPECT_NEAR(column.x, test(3, 0), POINT_EPSILON);
  359. EXPECT_NEAR(column.y, test(3, 1), POINT_EPSILON);
  360. EXPECT_NEAR(column.z, test(3, 2), POINT_EPSILON);
  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, POINT_EPSILON);
  369. EXPECT_NEAR(test(1, 3), 1.0f, POINT_EPSILON);
  370. EXPECT_NEAR(test(2, 3), 2.0f, POINT_EPSILON);
  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), POINT_EPSILON);
  379. EXPECT_NEAR(vector.y, test(1, 0), POINT_EPSILON);
  380. EXPECT_NEAR(vector.z, test(2, 0), POINT_EPSILON);
  381. vector = test.getForwardVector();
  382. EXPECT_NEAR(vector.x, test(0, 1), POINT_EPSILON);
  383. EXPECT_NEAR(vector.y, test(1, 1), POINT_EPSILON);
  384. EXPECT_NEAR(vector.z, test(2, 1), POINT_EPSILON);
  385. vector = test.getUpVector();
  386. EXPECT_NEAR(vector.x, test(0, 2), POINT_EPSILON);
  387. EXPECT_NEAR(vector.y, test(1, 2), POINT_EPSILON);
  388. EXPECT_NEAR(vector.z, test(2, 2), POINT_EPSILON);
  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, POINT_EPSILON); EXPECT_NEAR(test(0, 1), -1.0f, POINT_EPSILON); EXPECT_NEAR(test(0, 2), 0.0f, POINT_EPSILON); EXPECT_NEAR(test(0, 3), 0.0f, POINT_EPSILON);
  395. EXPECT_NEAR(test(1, 0), 1.0f, POINT_EPSILON); EXPECT_NEAR(test(1, 1), 0.0, POINT_EPSILON); EXPECT_NEAR(test(1, 2), -5.0f, POINT_EPSILON); EXPECT_NEAR(test(1, 3), 0.0f, POINT_EPSILON);
  396. EXPECT_NEAR(test(2, 0), 0.0f, POINT_EPSILON); EXPECT_NEAR(test(2, 1), 5.0f, POINT_EPSILON); EXPECT_NEAR(test(2, 2), 0.0f, POINT_EPSILON); EXPECT_NEAR(test(2, 3), 0.0f, POINT_EPSILON);
  397. EXPECT_NEAR(test(3, 0), 0.0f, POINT_EPSILON); EXPECT_NEAR(test(3, 1), 0.0f, POINT_EPSILON); EXPECT_NEAR(test(3, 2), 0.0f, POINT_EPSILON); EXPECT_NEAR(test(3, 3), 1.0f, POINT_EPSILON);
  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, POINT_EPSILON); EXPECT_NEAR(test(0, 1), 10.0f, POINT_EPSILON); EXPECT_NEAR(test(0, 2), 5.0f, POINT_EPSILON); EXPECT_NEAR(test(0, 3), 0.0f, POINT_EPSILON);
  404. EXPECT_NEAR(test(1, 0), 10.0f, POINT_EPSILON); EXPECT_NEAR(test(1, 1), 4.0, POINT_EPSILON); EXPECT_NEAR(test(1, 2), 2.0f, POINT_EPSILON); EXPECT_NEAR(test(1, 3), 0.0f, POINT_EPSILON);
  405. EXPECT_NEAR(test(2, 0), 5.0f, POINT_EPSILON); EXPECT_NEAR(test(2, 1), 2.0f, POINT_EPSILON); EXPECT_NEAR(test(2, 2), 1.0f, POINT_EPSILON); EXPECT_NEAR(test(2, 3), 0.0f, POINT_EPSILON);
  406. EXPECT_NEAR(test(3, 0), 0.0f, POINT_EPSILON); EXPECT_NEAR(test(3, 1), 0.0f, POINT_EPSILON); EXPECT_NEAR(test(3, 2), 0.0f, POINT_EPSILON); EXPECT_NEAR(test(3, 3), 1.0f, POINT_EPSILON);
  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, POINT_EPSILON); EXPECT_NEAR(test(0, 1), 0.8415f, POINT_EPSILON); EXPECT_NEAR(test(0, 2), 0.0f, POINT_EPSILON); EXPECT_NEAR(test(0, 3), 5.0f, POINT_EPSILON);
  415. EXPECT_NEAR(test(1, 0), -0.4546f, POINT_EPSILON); EXPECT_NEAR(test(1, 1), 0.2919f, POINT_EPSILON); EXPECT_NEAR(test(1, 2), 0.8415f, POINT_EPSILON); EXPECT_NEAR(test(1, 3), 2.0f, POINT_EPSILON);
  416. EXPECT_NEAR(test(2, 0), 0.7081f, POINT_EPSILON); EXPECT_NEAR(test(2, 1), -0.4546f, POINT_EPSILON); EXPECT_NEAR(test(2, 2), 0.5403f, POINT_EPSILON); EXPECT_NEAR(test(2, 3), 1.0f, POINT_EPSILON);
  417. EXPECT_NEAR(test(3, 0), 0.0f, POINT_EPSILON); EXPECT_NEAR(test(3, 1), 0.0f, POINT_EPSILON); EXPECT_NEAR(test(3, 2), 0.0f, POINT_EPSILON); EXPECT_NEAR(test(3, 3), 1.0f, POINT_EPSILON);
  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, POINT_EPSILON); EXPECT_NEAR(test(0, 1), 0.8415f, POINT_EPSILON); EXPECT_NEAR(test(0, 2), 0.0f, POINT_EPSILON); EXPECT_NEAR(test(0, 3), 5.0f, POINT_EPSILON);
  426. EXPECT_NEAR(test(1, 0), -0.4546f, POINT_EPSILON); EXPECT_NEAR(test(1, 1), 0.2919f, POINT_EPSILON); EXPECT_NEAR(test(1, 2), 0.8415f, POINT_EPSILON); EXPECT_NEAR(test(1, 3), 2.0f, POINT_EPSILON);
  427. EXPECT_NEAR(test(2, 0), 0.7081f, POINT_EPSILON); EXPECT_NEAR(test(2, 1), -0.4546f, POINT_EPSILON); EXPECT_NEAR(test(2, 2), 0.5403f, POINT_EPSILON); EXPECT_NEAR(test(2, 3), 1.0f, POINT_EPSILON);
  428. EXPECT_NEAR(test(3, 0), 0.0f, POINT_EPSILON); EXPECT_NEAR(test(3, 1), 0.0f, POINT_EPSILON); EXPECT_NEAR(test(3, 2), 0.0f, POINT_EPSILON); EXPECT_NEAR(test(3, 3), 1.0f, POINT_EPSILON);
  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, POINT_EPSILON); EXPECT_NEAR(test(0, 1), 0.8415f, POINT_EPSILON); EXPECT_NEAR(test(0, 2), 0.0f, POINT_EPSILON); EXPECT_NEAR(test(0, 3), 4.3845f, POINT_EPSILON);
  437. EXPECT_NEAR(test(1, 0), -0.4546f, POINT_EPSILON); EXPECT_NEAR(test(1, 1), 0.2919f, POINT_EPSILON); EXPECT_NEAR(test(1, 2), 0.8415f, POINT_EPSILON); EXPECT_NEAR(test(1, 3), -0.8479f, POINT_EPSILON);
  438. EXPECT_NEAR(test(2, 0), 0.7081f, POINT_EPSILON); EXPECT_NEAR(test(2, 1), -0.4546f, POINT_EPSILON); EXPECT_NEAR(test(2, 2), 0.5403f, POINT_EPSILON); EXPECT_NEAR(test(2, 3), 3.1714, POINT_EPSILON);
  439. EXPECT_NEAR(test(3, 0), 0.0f, POINT_EPSILON); EXPECT_NEAR(test(3, 1), 0.0f, POINT_EPSILON); EXPECT_NEAR(test(3, 2), 0.0f, POINT_EPSILON); EXPECT_NEAR(test(3, 3), 1.0f, POINT_EPSILON);
  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, POINT_EPSILON); EXPECT_NEAR(testResult(0, 1), 0.8415f, POINT_EPSILON); EXPECT_NEAR(testResult(0, 2), 0.0f, POINT_EPSILON); EXPECT_NEAR(testResult(0, 3), 4.3845f, POINT_EPSILON);
  449. EXPECT_NEAR(testResult(1, 0), -0.4546f, POINT_EPSILON); EXPECT_NEAR(testResult(1, 1), 0.2919f, POINT_EPSILON); EXPECT_NEAR(testResult(1, 2), 0.8415f, POINT_EPSILON); EXPECT_NEAR(testResult(1, 3), -0.8479f, POINT_EPSILON);
  450. EXPECT_NEAR(testResult(2, 0), 0.7081f, POINT_EPSILON); EXPECT_NEAR(testResult(2, 1), -0.4546f, POINT_EPSILON); EXPECT_NEAR(testResult(2, 2), 0.5403f, POINT_EPSILON); EXPECT_NEAR(testResult(2, 3), 3.1714, POINT_EPSILON);
  451. EXPECT_NEAR(testResult(3, 0), 0.0f, POINT_EPSILON); EXPECT_NEAR(testResult(3, 1), 0.0f, POINT_EPSILON); EXPECT_NEAR(testResult(3, 2), 0.0f, POINT_EPSILON); EXPECT_NEAR(testResult(3, 3), 1.0f, POINT_EPSILON);
  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, POINT_EPSILON); EXPECT_NEAR(testResult(0, 1), -0.0308f, POINT_EPSILON);EXPECT_NEAR(testResult(0, 2), 0.9995f, POINT_EPSILON); EXPECT_NEAR(testResult(0, 3), 0.0f, POINT_EPSILON);
  460. EXPECT_NEAR(testResult(1, 0), 1.0f, POINT_EPSILON); EXPECT_NEAR(testResult(1, 1), 0.0f, POINT_EPSILON); EXPECT_NEAR(testResult(1, 2), -0.0008f, POINT_EPSILON); EXPECT_NEAR(testResult(1, 3), 0.0f, POINT_EPSILON);
  461. EXPECT_NEAR(testResult(2, 0), 0.0f, POINT_EPSILON); EXPECT_NEAR(testResult(2, 1), 0.9995f, POINT_EPSILON); EXPECT_NEAR(testResult(2, 2), 0.0308f, POINT_EPSILON); EXPECT_NEAR(testResult(2, 3), 0.0f, POINT_EPSILON);
  462. EXPECT_NEAR(testResult(3, 0), 0.0f, POINT_EPSILON); EXPECT_NEAR(testResult(3, 1), 0.0f, POINT_EPSILON); EXPECT_NEAR(testResult(3, 2), 0.0f, POINT_EPSILON); EXPECT_NEAR(testResult(3, 3), 1.0f, POINT_EPSILON);
  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, POINT_EPSILON); EXPECT_NEAR(test(0, 1), 1.6829f, POINT_EPSILON); EXPECT_NEAR(test(0, 2), 0.0f, POINT_EPSILON); EXPECT_NEAR(test(0, 3), 8.7689f, POINT_EPSILON);
  472. EXPECT_NEAR(test(1, 0), -0.9093f, POINT_EPSILON); EXPECT_NEAR(test(1, 1), 0.5839f, POINT_EPSILON); EXPECT_NEAR(test(1, 2), 1.6829f, POINT_EPSILON); EXPECT_NEAR(test(1, 3), -1.6958f, POINT_EPSILON);
  473. EXPECT_NEAR(test(2, 0), 1.4161f, POINT_EPSILON); EXPECT_NEAR(test(2, 1), -0.9093f, POINT_EPSILON); EXPECT_NEAR(test(2, 2), 1.0806f, POINT_EPSILON); EXPECT_NEAR(test(2, 3), 6.3427f, POINT_EPSILON);
  474. EXPECT_NEAR(test(3, 0), 0.0f, POINT_EPSILON); EXPECT_NEAR(test(3, 1), 0.0f, POINT_EPSILON); EXPECT_NEAR(test(3, 2), 0.0f, POINT_EPSILON); EXPECT_NEAR(test(3, 3), 2.0f, POINT_EPSILON);
  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, POINT_EPSILON); EXPECT_NEAR(test(0, 1), 1.6829f, POINT_EPSILON); EXPECT_NEAR(test(0, 2), 0.0f, POINT_EPSILON); EXPECT_NEAR(test(0, 3), 8.7689f, POINT_EPSILON);
  485. EXPECT_NEAR(test(1, 0), -0.9093f, POINT_EPSILON); EXPECT_NEAR(test(1, 1), 0.5839f, POINT_EPSILON); EXPECT_NEAR(test(1, 2), 1.6829f, POINT_EPSILON); EXPECT_NEAR(test(1, 3), -1.6958f, POINT_EPSILON);
  486. EXPECT_NEAR(test(2, 0), 1.4161f, POINT_EPSILON); EXPECT_NEAR(test(2, 1), -0.9093f, POINT_EPSILON); EXPECT_NEAR(test(2, 2), 1.0806f, POINT_EPSILON); EXPECT_NEAR(test(2, 3), 6.3427f, POINT_EPSILON);
  487. EXPECT_NEAR(test(3, 0), 0.0f, POINT_EPSILON); EXPECT_NEAR(test(3, 1), 0.0f, POINT_EPSILON); EXPECT_NEAR(test(3, 2), 0.0f, POINT_EPSILON); EXPECT_NEAR(test(3, 3), 2.0f, POINT_EPSILON);
  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.4960f, POINT_EPSILON); EXPECT_NEAR(testPoint.y, 0.8996f, POINT_EPSILON); EXPECT_NEAR(testPoint.z, 4.1513f, POINT_EPSILON); EXPECT_NEAR(testPoint.w, 1.0f, POINT_EPSILON);
  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.4960f, POINT_EPSILON); EXPECT_NEAR(testPoint.y, 0.8996f, POINT_EPSILON); EXPECT_NEAR(testPoint.z, 4.1513f, POINT_EPSILON);
  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.4960f, POINT_EPSILON); EXPECT_NEAR(testPoint.y, 0.8996f, POINT_EPSILON); EXPECT_NEAR(testPoint.z, 4.1513f, POINT_EPSILON);
  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.1116f, POINT_EPSILON); EXPECT_NEAR(testPoint.y, 1.7475f, POINT_EPSILON); EXPECT_NEAR(testPoint.z, 0.9799f, POINT_EPSILON);
  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.1116f, POINT_EPSILON); EXPECT_NEAR(testPoint.y, 1.7475f, POINT_EPSILON); EXPECT_NEAR(testPoint.z, 0.9799f, POINT_EPSILON);
  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, POINT_EPSILON); EXPECT_NEAR(testBox.minExtents.y, 1.5f, POINT_EPSILON); EXPECT_NEAR(testBox.minExtents.z, 0.5f, POINT_EPSILON);
  549. EXPECT_NEAR(testBox.maxExtents.x, 5.5f, POINT_EPSILON); EXPECT_NEAR(testBox.maxExtents.y, 2.5f, POINT_EPSILON); EXPECT_NEAR(testBox.maxExtents.z, 1.5f, POINT_EPSILON);
  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, POINT_EPSILON);
  569. }
  570. }
  571. }
  572. TEST(MatrixTest, TestFrustumProjectionMatrix)
  573. {
  574. MatrixF test(true);
  575. Frustum testFrustum(false, -0.119894862f, 0.119894862f, 0.0767327100f, -0.0767327100f, 0.1f, 1000.0f);
  576. testFrustum.getProjectionMatrix(&test);
  577. EXPECT_NEAR(test(0, 0), 0.8341f, POINT_EPSILON); EXPECT_NEAR(test(0, 1), 0.0f, POINT_EPSILON); EXPECT_NEAR(test(0, 2), 0.0f, POINT_EPSILON); EXPECT_NEAR(test(0, 3), 0.0f, POINT_EPSILON);
  578. EXPECT_NEAR(test(1, 0), 0.0f, POINT_EPSILON); EXPECT_NEAR(test(1, 1), 0.0f, POINT_EPSILON); EXPECT_NEAR(test(1, 2), 1.3032f, POINT_EPSILON); EXPECT_NEAR(test(1, 3), 0.0, POINT_EPSILON);
  579. EXPECT_NEAR(test(2, 0), 0.0f, POINT_EPSILON); EXPECT_NEAR(test(2, 1), -0.0001f, POINT_EPSILON); EXPECT_NEAR(test(2, 2), 0.0f, POINT_EPSILON); EXPECT_NEAR(test(2, 3), 0.1f, POINT_EPSILON);
  580. EXPECT_NEAR(test(3, 0), 0.0f, POINT_EPSILON); EXPECT_NEAR(test(3, 1), 1.0f, POINT_EPSILON); EXPECT_NEAR(test(3, 2), 0.0f, POINT_EPSILON); EXPECT_NEAR(test(3, 3), 0.0f, POINT_EPSILON);
  581. test.reverseProjection();
  582. EXPECT_NEAR(test(0, 0), 0.8341f, POINT_EPSILON); EXPECT_NEAR(test(0, 1), 0.0f, POINT_EPSILON); EXPECT_NEAR(test(0, 2), 0.0f, POINT_EPSILON); EXPECT_NEAR(test(0, 3), 0.0f, POINT_EPSILON);
  583. EXPECT_NEAR(test(1, 0), 0.0f, POINT_EPSILON); EXPECT_NEAR(test(1, 1), 0.0f, POINT_EPSILON); EXPECT_NEAR(test(1, 2), 1.3032f, POINT_EPSILON); EXPECT_NEAR(test(1, 3), 0.0, POINT_EPSILON);
  584. EXPECT_NEAR(test(2, 0), 0.0f, POINT_EPSILON); EXPECT_NEAR(test(2, 1), 1.0001f, POINT_EPSILON); EXPECT_NEAR(test(2, 2), 0.0f, POINT_EPSILON); EXPECT_NEAR(test(2, 3), -0.1f, POINT_EPSILON);
  585. EXPECT_NEAR(test(3, 0), 0.0f, POINT_EPSILON); EXPECT_NEAR(test(3, 1), 1.0f, POINT_EPSILON); EXPECT_NEAR(test(3, 2), 0.0f, POINT_EPSILON); EXPECT_NEAR(test(3, 3), 0.0f, POINT_EPSILON);
  586. test.inverse();
  587. EXPECT_NEAR(test(0, 0), 1.1989f, POINT_EPSILON); EXPECT_NEAR(test(0, 1), 0.0f, POINT_EPSILON); EXPECT_NEAR(test(0, 2), 0.0f, POINT_EPSILON); EXPECT_NEAR(test(0, 3), 0.0f, POINT_EPSILON);
  588. EXPECT_NEAR(test(1, 0), 0.0f, POINT_EPSILON); EXPECT_NEAR(test(1, 1), 0.0f, POINT_EPSILON); EXPECT_NEAR(test(1, 2), 0.9999f, POINT_EPSILON); EXPECT_NEAR(test(1, 3), 0.1f, POINT_EPSILON);
  589. EXPECT_NEAR(test(2, 0), 0.0f, POINT_EPSILON); EXPECT_NEAR(test(2, 1), 0.7673f, POINT_EPSILON); EXPECT_NEAR(test(2, 2), 0.0f, POINT_EPSILON); EXPECT_NEAR(test(2, 3), 0.0f, POINT_EPSILON);
  590. EXPECT_NEAR(test(3, 0), 0.0f, POINT_EPSILON); EXPECT_NEAR(test(3, 1), 1.0f, POINT_EPSILON); EXPECT_NEAR(test(3, 2), 0.0f, POINT_EPSILON); EXPECT_NEAR(test(3, 3), 0.0f, POINT_EPSILON);
  591. }
  592. TEST(MatrixTest, TestUnProjectStack)
  593. {
  594. MatrixF saveModel(true);
  595. MatrixF saveProjection(true);
  596. RectI renderRect(0 ,0, 1600, 1024);
  597. Frustum testFrustum(false, -0.119894862f, 0.119894862f, 0.0767327100f, -0.0767327100f, 0.1f, 1000.0f);
  598. testFrustum.getProjectionMatrix(&saveProjection);
  599. Point3F dest;
  600. MathUtils::mProjectScreenToWorld(Point3F(626.0f, 600.0f, 1.0f), &dest, renderRect, saveModel, saveProjection, 0.1f, 10.0f);
  601. EXPECT_NEAR(dest.x, -0.2868f, POINT_EPSILON); EXPECT_NEAR(dest.y, 1.1998f, POINT_EPSILON); EXPECT_NEAR(dest.z, -0.1450f, POINT_EPSILON);
  602. }
  603. TEST(MatrixTest, TestInverse)
  604. {
  605. MatrixF test(true);
  606. test.setPosition(Point3F(5.0f, 2.0f, 1.0f));
  607. MatrixF test2(EulerF(1.0f, 0.0f, 1.0f));
  608. test.mulL(test2);
  609. test.inverse();
  610. EXPECT_NEAR(test(0, 0), 0.5403f, POINT_EPSILON); EXPECT_NEAR(test(0, 1), -0.4546f, POINT_EPSILON); EXPECT_NEAR(test(0, 2), 0.7081f, POINT_EPSILON); EXPECT_NEAR(test(0, 3), -5.0f, POINT_EPSILON);
  611. EXPECT_NEAR(test(1, 0), 0.8415f, POINT_EPSILON); EXPECT_NEAR(test(1, 1), 0.2919f, POINT_EPSILON); EXPECT_NEAR(test(1, 2), -0.4546f, POINT_EPSILON); EXPECT_NEAR(test(1, 3), -2.0f, POINT_EPSILON);
  612. EXPECT_NEAR(test(2, 0), 0.0, POINT_EPSILON); EXPECT_NEAR(test(2, 1), 0.8415f, POINT_EPSILON); EXPECT_NEAR(test(2, 2), 0.5403f, POINT_EPSILON); EXPECT_NEAR(test(2, 3), -1.0f, POINT_EPSILON);
  613. EXPECT_NEAR(test(3, 0), 0.0f, POINT_EPSILON); EXPECT_NEAR(test(3, 1), 0.0f, POINT_EPSILON); EXPECT_NEAR(test(3, 2), 0.0f, POINT_EPSILON); EXPECT_NEAR(test(3, 3), 1.0f, POINT_EPSILON);
  614. }
  615. TEST(MatrixTest, TestInvertTo)
  616. {
  617. MatrixF test1(true);
  618. test1.setPosition(Point3F(5.0f, 2.0f, 1.0f));
  619. MatrixF test2(EulerF(1.0f, 0.0f, 1.0f));
  620. test1.mulL(test2);
  621. MatrixF test(true);
  622. test1.invertTo(&test);
  623. EXPECT_NEAR(test(0, 0), 0.5403f, POINT_EPSILON); EXPECT_NEAR(test(0, 1), -0.4546f, POINT_EPSILON); EXPECT_NEAR(test(0, 2), 0.7081f, POINT_EPSILON); EXPECT_NEAR(test(0, 3), -5.0f, POINT_EPSILON);
  624. EXPECT_NEAR(test(1, 0), 0.8415f, POINT_EPSILON); EXPECT_NEAR(test(1, 1), 0.2919f, POINT_EPSILON); EXPECT_NEAR(test(1, 2), -0.4546f, POINT_EPSILON); EXPECT_NEAR(test(1, 3), -2.0f, POINT_EPSILON);
  625. EXPECT_NEAR(test(2, 0), 0.0, POINT_EPSILON); EXPECT_NEAR(test(2, 1), 0.8415f, POINT_EPSILON); EXPECT_NEAR(test(2, 2), 0.5403f, POINT_EPSILON); EXPECT_NEAR(test(2, 3), -1.0f, POINT_EPSILON);
  626. EXPECT_NEAR(test(3, 0), 0.0f, POINT_EPSILON); EXPECT_NEAR(test(3, 1), 0.0f, POINT_EPSILON); EXPECT_NEAR(test(3, 2), 0.0f, POINT_EPSILON); EXPECT_NEAR(test(3, 3), 1.0f, POINT_EPSILON);
  627. // make sure our original matrix is unchanged
  628. EXPECT_NEAR(test1(0, 0), 0.5403f, POINT_EPSILON); EXPECT_NEAR(test1(0, 1), 0.8415f, POINT_EPSILON); EXPECT_NEAR(test1(0, 2), 0.0f, POINT_EPSILON); EXPECT_NEAR(test1(0, 3), 4.3845f, POINT_EPSILON);
  629. EXPECT_NEAR(test1(1, 0), -0.4546f, POINT_EPSILON); EXPECT_NEAR(test1(1, 1), 0.2919f, POINT_EPSILON); EXPECT_NEAR(test1(1, 2), 0.8415f, POINT_EPSILON); EXPECT_NEAR(test1(1, 3), -0.8479f, POINT_EPSILON);
  630. EXPECT_NEAR(test1(2, 0), 0.7081f, POINT_EPSILON); EXPECT_NEAR(test1(2, 1), -0.4546f, POINT_EPSILON); EXPECT_NEAR(test1(2, 2), 0.5403f, POINT_EPSILON); EXPECT_NEAR(test1(2, 3), 3.1714, POINT_EPSILON);
  631. EXPECT_NEAR(test1(3, 0), 0.0f, POINT_EPSILON); EXPECT_NEAR(test1(3, 1), 0.0f, POINT_EPSILON); EXPECT_NEAR(test1(3, 2), 0.0f, POINT_EPSILON); EXPECT_NEAR(test1(3, 3), 1.0f, POINT_EPSILON);
  632. }
  633. TEST(MatrixTest, TestFullInverse)
  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. EXPECT_TRUE(test.fullInverse());
  640. EXPECT_NEAR(test(0, 0), 0.5403f, POINT_EPSILON); EXPECT_NEAR(test(0, 1), -0.4546f, POINT_EPSILON); EXPECT_NEAR(test(0, 2), 0.7081f, POINT_EPSILON); EXPECT_NEAR(test(0, 3), -5.0f, POINT_EPSILON);
  641. EXPECT_NEAR(test(1, 0), 0.8415f, POINT_EPSILON); EXPECT_NEAR(test(1, 1), 0.2919f, POINT_EPSILON); EXPECT_NEAR(test(1, 2), -0.4546f, POINT_EPSILON); EXPECT_NEAR(test(1, 3), -2.0f, POINT_EPSILON);
  642. EXPECT_NEAR(test(2, 0), 0.0, POINT_EPSILON); EXPECT_NEAR(test(2, 1), 0.8415f, POINT_EPSILON); EXPECT_NEAR(test(2, 2), 0.5403f, POINT_EPSILON); EXPECT_NEAR(test(2, 3), -1.0f, POINT_EPSILON);
  643. EXPECT_NEAR(test(3, 0), 0.0f, POINT_EPSILON); EXPECT_NEAR(test(3, 1), 0.0f, POINT_EPSILON); EXPECT_NEAR(test(3, 2), 0.0f, POINT_EPSILON); EXPECT_NEAR(test(3, 3), 1.0f, POINT_EPSILON);
  644. }
  645. TEST(MatrixTest, TestIsAffine)
  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. EXPECT_TRUE(test.isAffine());
  652. }
  653. TEST(MatrixTest, TestScale)
  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.scale(2.0f);
  660. EXPECT_NEAR(test(0, 0), 1.0806f, POINT_EPSILON); EXPECT_NEAR(test(0, 1), 1.6829f, POINT_EPSILON); EXPECT_NEAR(test(0, 2), 0.0f, POINT_EPSILON); EXPECT_NEAR(test(0, 3), 4.3845f, POINT_EPSILON);
  661. EXPECT_NEAR(test(1, 0), -0.9093f, POINT_EPSILON); EXPECT_NEAR(test(1, 1), 0.5839f, POINT_EPSILON); EXPECT_NEAR(test(1, 2), 1.6829f, POINT_EPSILON); EXPECT_NEAR(test(1, 3), -0.8479f, POINT_EPSILON);
  662. EXPECT_NEAR(test(2, 0), 1.4161f, POINT_EPSILON); EXPECT_NEAR(test(2, 1), -0.9093f, POINT_EPSILON); EXPECT_NEAR(test(2, 2), 1.0806f, POINT_EPSILON); EXPECT_NEAR(test(2, 3), 3.1714f, POINT_EPSILON);
  663. EXPECT_NEAR(test(3, 0), 0.0f, POINT_EPSILON); EXPECT_NEAR(test(3, 1), 0.0f, POINT_EPSILON); EXPECT_NEAR(test(3, 2), 0.0f, POINT_EPSILON); EXPECT_NEAR(test(3, 3), 1.0f, POINT_EPSILON);
  664. }
  665. TEST(MatrixTest, TestGetScale)
  666. {
  667. MatrixF test(true);
  668. test.setPosition(Point3F(5.0f, 2.0f, 1.0f));
  669. MatrixF test2(EulerF(1.0f, 0.0f, 1.0f));
  670. test.mulL(test2);
  671. test.scale(2.0f);
  672. Point3F scale;
  673. scale = test.getScale();
  674. EXPECT_NEAR(scale.x, 2.0f, POINT_EPSILON); EXPECT_NEAR(scale.y, 2.0f, POINT_EPSILON); EXPECT_NEAR(scale.z, 2.0f, POINT_EPSILON);
  675. }
  676. TEST(MatrixTest, TestAffineInverse)
  677. {
  678. MatrixF test(true);
  679. test.setPosition(Point3F(5.0f, 2.0f, 1.0f));
  680. MatrixF test2(EulerF(1.0f, 0.0f, 1.0f));
  681. test.mulL(test2);
  682. test.affineInverse();
  683. EXPECT_NEAR(test(0, 0), 0.5403f, POINT_EPSILON); EXPECT_NEAR(test(0, 1), -0.4546f, POINT_EPSILON); EXPECT_NEAR(test(0, 2), 0.7081f, POINT_EPSILON); EXPECT_NEAR(test(0, 3), -5.0f, POINT_EPSILON);
  684. EXPECT_NEAR(test(1, 0), 0.8415f, POINT_EPSILON); EXPECT_NEAR(test(1, 1), 0.2919f, POINT_EPSILON); EXPECT_NEAR(test(1, 2), -0.4546f, POINT_EPSILON); EXPECT_NEAR(test(1, 3), -2.0f, POINT_EPSILON);
  685. EXPECT_NEAR(test(2, 0), 0.0, POINT_EPSILON); EXPECT_NEAR(test(2, 1), 0.8415f, POINT_EPSILON); EXPECT_NEAR(test(2, 2), 0.5403f, POINT_EPSILON); EXPECT_NEAR(test(2, 3), -1.0f, POINT_EPSILON);
  686. EXPECT_NEAR(test(3, 0), 0.0f, POINT_EPSILON); EXPECT_NEAR(test(3, 1), 0.0f, POINT_EPSILON); EXPECT_NEAR(test(3, 2), 0.0f, POINT_EPSILON); EXPECT_NEAR(test(3, 3), 1.0f, POINT_EPSILON);
  687. }
  688. TEST(MatrixTest, TestTranspose)
  689. {
  690. MatrixF test(true);
  691. test.setPosition(Point3F(5.0f, 2.0f, 1.0f));
  692. MatrixF test2(EulerF(1.0f, 0.0f, 1.0f));
  693. test.mulL(test2);
  694. test.transpose();
  695. EXPECT_NEAR(test(0, 0), 0.5403f, POINT_EPSILON); EXPECT_NEAR(test(0, 1), -0.4546f, POINT_EPSILON); EXPECT_NEAR(test(0, 2), 0.7081f, POINT_EPSILON); EXPECT_NEAR(test(0, 3), 0.0f, POINT_EPSILON);
  696. EXPECT_NEAR(test(1, 0), 0.8415f, POINT_EPSILON); EXPECT_NEAR(test(1, 1), 0.2919f, POINT_EPSILON); EXPECT_NEAR(test(1, 2), -0.4546f, POINT_EPSILON); EXPECT_NEAR(test(1, 3), 0.0f, POINT_EPSILON);
  697. EXPECT_NEAR(test(2, 0), 0.0, POINT_EPSILON); EXPECT_NEAR(test(2, 1), 0.8415f, POINT_EPSILON); EXPECT_NEAR(test(2, 2), 0.5403f, POINT_EPSILON); EXPECT_NEAR(test(2, 3), 0.0f, POINT_EPSILON);
  698. EXPECT_NEAR(test(3, 0), 4.3845f, POINT_EPSILON); EXPECT_NEAR(test(3, 1), -0.8479f, POINT_EPSILON); EXPECT_NEAR(test(3, 2), 3.1714, POINT_EPSILON); EXPECT_NEAR(test(3, 3), 1.0f, POINT_EPSILON);
  699. }
  700. TEST(MatrixTest, TestTransposeTo)
  701. {
  702. MatrixF test1(true);
  703. test1.setPosition(Point3F(5.0f, 2.0f, 1.0f));
  704. MatrixF test2(EulerF(1.0f, 0.0f, 1.0f));
  705. test1.mulL(test2);
  706. MatrixF test(true);
  707. test1.transposeTo(test);
  708. EXPECT_NEAR(test(0, 0), 0.5403f, POINT_EPSILON); EXPECT_NEAR(test(0, 1), -0.4546f, POINT_EPSILON); EXPECT_NEAR(test(0, 2), 0.7081f, POINT_EPSILON); EXPECT_NEAR(test(0, 3), 0.0f, POINT_EPSILON);
  709. EXPECT_NEAR(test(1, 0), 0.8415f, POINT_EPSILON); EXPECT_NEAR(test(1, 1), 0.2919f, POINT_EPSILON); EXPECT_NEAR(test(1, 2), -0.4546f, POINT_EPSILON); EXPECT_NEAR(test(1, 3), 0.0f, POINT_EPSILON);
  710. EXPECT_NEAR(test(2, 0), 0.0, POINT_EPSILON); EXPECT_NEAR(test(2, 1), 0.8415f, POINT_EPSILON); EXPECT_NEAR(test(2, 2), 0.5403f, POINT_EPSILON); EXPECT_NEAR(test(2, 3), 0.0f, POINT_EPSILON);
  711. EXPECT_NEAR(test(3, 0), 4.3845f, POINT_EPSILON); EXPECT_NEAR(test(3, 1), -0.8479f, POINT_EPSILON); EXPECT_NEAR(test(3, 2), 3.1714, POINT_EPSILON); EXPECT_NEAR(test(3, 3), 1.0f, POINT_EPSILON);
  712. }
  713. TEST(MatrixTest, TestTransformPlane)
  714. {
  715. MatrixF test(true);
  716. test.setPosition(Point3F(5.0f, 2.0f, 1.0f));
  717. MatrixF test2(EulerF(1.0f, 0.0f, 1.0f));
  718. test.mulL(test2);
  719. PlaneF plane(Point3F(0.0f, 0.0f, 0.0f), Point3F(0.0f, 0.0f, 1.0f));
  720. PlaneF res;
  721. mTransformPlane(test, Point3F(1.0f, 1.0f, 1.0f), plane, &res);
  722. EXPECT_NEAR(res.x, 0.0f, POINT_EPSILON);
  723. EXPECT_NEAR(res.y, 0.8414f, POINT_EPSILON);
  724. EXPECT_NEAR(res.z, 0.5403f, POINT_EPSILON);
  725. EXPECT_NEAR(res.d, -1.0f, POINT_EPSILON);
  726. }