xform_test.cpp
上传用户:king477883
上传日期:2021-03-01
资源大小:9553k
文件大小:9k
源码类别:

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file xform_test.cpp
  3.  * @author Adroit
  4.  * @date March 2007 
  5.  * @brief Test cases for LLXform
  6.  *
  7.  * $LicenseInfo:firstyear=2007&license=viewergpl$
  8.  * 
  9.  * Copyright (c) 2007-2010, Linden Research, Inc.
  10.  * 
  11.  * Second Life Viewer Source Code
  12.  * The source code in this file ("Source Code") is provided by Linden Lab
  13.  * to you under the terms of the GNU General Public License, version 2.0
  14.  * ("GPL"), unless you have obtained a separate licensing agreement
  15.  * ("Other License"), formally executed by you and Linden Lab.  Terms of
  16.  * the GPL can be found in doc/GPL-license.txt in this distribution, or
  17.  * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
  18.  * 
  19.  * There are special exceptions to the terms and conditions of the GPL as
  20.  * it is applied to this Source Code. View the full text of the exception
  21.  * in the file doc/FLOSS-exception.txt in this software distribution, or
  22.  * online at
  23.  * http://secondlifegrid.net/programs/open_source/licensing/flossexception
  24.  * 
  25.  * By copying, modifying or distributing this software, you acknowledge
  26.  * that you have read and understood your obligations described above,
  27.  * and agree to abide by those obligations.
  28.  * 
  29.  * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
  30.  * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
  31.  * COMPLETENESS OR PERFORMANCE.
  32.  * $/LicenseInfo$
  33.  */
  34. #include "linden_common.h"
  35. #include "../test/lltut.h"
  36. #include "../xform.h"
  37. namespace tut
  38. {
  39. struct xform_test
  40. {
  41. };
  42. typedef test_group<xform_test> xform_test_t;
  43. typedef xform_test_t::object xform_test_object_t;
  44. tut::xform_test_t tut_xform_test("xform_test");
  45. //test case for init(), getParent(), getRotation(), getPositionW(), getWorldRotation() fns.
  46. template<> template<>
  47. void xform_test_object_t::test<1>()
  48. {
  49. LLXform xform_obj;
  50. LLVector3 emptyVec(0.f,0.f,0.f);
  51. LLVector3 initialScaleVec(1.f,1.f,1.f);
  52. ensure("LLXform empty constructor failed: ", !xform_obj.getParent() && !xform_obj.isChanged() &&
  53. xform_obj.getPosition() == emptyVec && 
  54. (xform_obj.getRotation()).isIdentity() &&
  55. xform_obj.getScale() == initialScaleVec && 
  56. xform_obj.getPositionW() == emptyVec && 
  57. (xform_obj.getWorldRotation()).isIdentity() &&
  58. !xform_obj.getScaleChildOffset());
  59. }
  60. // test cases for 
  61. // setScale(const LLVector3& scale) 
  62. // setScale(const F32 x, const F32 y, const F32 z)
  63. // setRotation(const F32 x, const F32 y, const F32 z) 
  64. // setPosition(const F32 x, const F32 y, const F32 z) 
  65. // getLocalMat4(LLMatrix4 &mat)
  66. template<> template<>
  67. void xform_test_object_t::test<2>()
  68. {
  69. LLMatrix4 llmat4;
  70. LLXform xform_obj;
  71. F32 x = 3.6f;
  72. F32 y = 5.5f;
  73. F32 z = 4.2f;
  74. F32 w = 0.f;
  75. F32 posz = z + 2.122f;
  76. LLVector3 vec(x, y, z);
  77. xform_obj.setScale(x, y, z);
  78. xform_obj.setPosition(x, y, posz);
  79. ensure("setScale failed: ", xform_obj.getScale() == vec);
  80. vec.setVec(x, y, posz);
  81. ensure("getPosition failed: ", xform_obj.getPosition() == vec);
  82. x = x * 2.f;
  83. y = y + 2.3f;
  84. z = posz * 4.f; 
  85. vec.setVec(x, y, z);
  86. xform_obj.setPositionX(x);
  87. xform_obj.setPositionY(y);
  88. xform_obj.setPositionZ(z);
  89. ensure("setPositionX/Y/Z failed: ", xform_obj.getPosition() == vec);
  90. xform_obj.setScaleChildOffset(TRUE);
  91. ensure("setScaleChildOffset failed: ", xform_obj.getScaleChildOffset());
  92. vec.setVec(x, y, z);
  93. xform_obj.addPosition(vec);
  94. vec += vec;
  95. ensure("addPosition failed: ", xform_obj.getPosition() == vec);
  96. xform_obj.setScale(vec);
  97. ensure("setScale vector failed: ", xform_obj.getScale() == vec);
  98. LLQuaternion quat(x, y, z, w);
  99. xform_obj.setRotation(quat);
  100. ensure("setRotation quat failed: ", xform_obj.getRotation() == quat);
  101. xform_obj.setRotation(x, y, z, w);
  102. ensure("getRotation 2 failed: ", xform_obj.getRotation() == quat);
  103. xform_obj.setRotation(x, y, z);
  104. quat.setQuat(x,y,z); 
  105. ensure("setRotation xyz failed: ", xform_obj.getRotation() == quat);
  106. // LLXform::setRotation(const F32 x, const F32 y, const F32 z) 
  107. // Does normalization
  108. // LLXform::setRotation(const F32 x, const F32 y, const F32 z, const F32 s) 
  109. // Simply copies the individual values - does not do any normalization. 
  110. // Is that the expected behavior?
  111. }
  112. // test cases for inline BOOL setParent(LLXform *parent) and getParent() fn.
  113. template<> template<>
  114. void xform_test_object_t::test<3>()
  115. {
  116. LLXform xform_obj;
  117. LLXform par;
  118. LLXform grandpar;
  119. xform_obj.setParent(&par); 
  120. par.setParent(&grandpar); 
  121. ensure("setParent/getParent failed: ", &par == xform_obj.getParent());
  122. ensure("getRoot failed: ", &grandpar == xform_obj.getRoot());
  123. ensure("isRoot failed: ", grandpar.isRoot() && !par.isRoot() && !xform_obj.isRoot());
  124. ensure("isRootEdit failed: ", grandpar.isRootEdit() && !par.isRootEdit() && !xform_obj.isRootEdit());
  125. }
  126. template<> template<>
  127. void xform_test_object_t::test<4>()
  128. {
  129. LLXform xform_obj;
  130. xform_obj.setChanged(LLXform::TRANSLATED | LLXform::ROTATED | LLXform::SCALED);
  131. ensure("setChanged/isChanged failed: ", xform_obj.isChanged());
  132. xform_obj.clearChanged(LLXform::TRANSLATED | LLXform::ROTATED | LLXform::SCALED);
  133. ensure("clearChanged failed: ", !xform_obj.isChanged());
  134. LLVector3 llvect3(12.4f, -5.6f, 0.34f);
  135. xform_obj.setScale(llvect3);
  136. ensure("setScale did not set SCALED flag: ", xform_obj.isChanged(LLXform::SCALED));
  137. xform_obj.setPosition(1.2f, 2.3f, 3.4f);
  138. ensure("setScale did not set TRANSLATED flag: ", xform_obj.isChanged(LLXform::TRANSLATED));
  139. ensure("TRANSLATED reset SCALED flag: ", xform_obj.isChanged(LLXform::TRANSLATED | LLXform::SCALED));
  140. xform_obj.clearChanged(LLXform::SCALED);
  141. ensure("reset SCALED failed: ", !xform_obj.isChanged(LLXform::SCALED));
  142. xform_obj.setRotation(1, 2, 3, 4);
  143. ensure("ROTATION flag not set ", xform_obj.isChanged(LLXform::TRANSLATED | LLXform::ROTATED));
  144. xform_obj.setScale(llvect3);
  145. ensure("ROTATION flag not set ", xform_obj.isChanged(LLXform::MOVED));
  146. }
  147. //to test init() and getWorldMatrix() fns.
  148. template<> template<>
  149. void xform_test_object_t::test<5>()
  150. {
  151. LLXformMatrix formMatrix_obj;
  152. formMatrix_obj.init();
  153. LLMatrix4 mat4_obj;
  154. ensure("1. The value is not NULL", 1.f == formMatrix_obj.getWorldMatrix().mMatrix[0][0]);
  155. ensure("2. The value is not NULL", 0.f == formMatrix_obj.getWorldMatrix().mMatrix[0][1]);
  156. ensure("3. The value is not NULL", 0.f == formMatrix_obj.getWorldMatrix().mMatrix[0][2]);
  157. ensure("4. The value is not NULL", 0.f == formMatrix_obj.getWorldMatrix().mMatrix[0][3]);
  158. ensure("5. The value is not NULL", 0.f == formMatrix_obj.getWorldMatrix().mMatrix[1][0]);
  159. ensure("6. The value is not NULL", 1.f == formMatrix_obj.getWorldMatrix().mMatrix[1][1]);
  160. ensure("7. The value is not NULL", 0.f == formMatrix_obj.getWorldMatrix().mMatrix[1][2]);
  161. ensure("8. The value is not NULL", 0.f == formMatrix_obj.getWorldMatrix().mMatrix[1][3]);
  162. ensure("9. The value is not NULL", 0.f == formMatrix_obj.getWorldMatrix().mMatrix[2][0]);
  163. ensure("10. The value is not NULL", 0.f == formMatrix_obj.getWorldMatrix().mMatrix[2][1]);
  164. ensure("11. The value is not NULL", 1.f == formMatrix_obj.getWorldMatrix().mMatrix[2][2]);
  165. ensure("12. The value is not NULL", 0.f == formMatrix_obj.getWorldMatrix().mMatrix[2][3]);
  166. ensure("13. The value is not NULL", 0.f == formMatrix_obj.getWorldMatrix().mMatrix[3][0]);
  167. ensure("14. The value is not NULL", 0.f == formMatrix_obj.getWorldMatrix().mMatrix[3][1]);
  168. ensure("15. The value is not NULL", 0.f == formMatrix_obj.getWorldMatrix().mMatrix[3][2]);
  169. ensure("16. The value is not NULL", 1.f == formMatrix_obj.getWorldMatrix().mMatrix[3][3]);
  170. }
  171. //to test mMin.clearVec() and mMax.clearVec() fns
  172. template<> template<>
  173. void xform_test_object_t::test<6>()
  174. {
  175. LLXformMatrix formMatrix_obj;
  176. formMatrix_obj.init();
  177. LLVector3 llmin_vec3;
  178. LLVector3 llmax_vec3;
  179. formMatrix_obj.getMinMax(llmin_vec3, llmax_vec3);
  180. ensure("1. The value is not NULL", 0.f == llmin_vec3.mV[0]);
  181. ensure("2. The value is not NULL", 0.f == llmin_vec3.mV[1]);
  182. ensure("3. The value is not NULL", 0.f == llmin_vec3.mV[2]);
  183. ensure("4. The value is not NULL", 0.f == llmin_vec3.mV[0]);
  184. ensure("5. The value is not NULL", 0.f == llmin_vec3.mV[1]);
  185. ensure("6. The value is not NULL", 0.f == llmin_vec3.mV[2]);
  186. }
  187. //test case of update() fn.
  188. template<> template<>
  189. void xform_test_object_t::test<7>()
  190. {
  191. LLXformMatrix formMatrix_obj;
  192. LLXformMatrix parent;
  193. LLVector3 llvecpos(1.0, 2.0, 3.0);
  194. LLVector3 llvecpospar(10.0, 20.0, 30.0);
  195. formMatrix_obj.setPosition(llvecpos);
  196. parent.setPosition(llvecpospar);
  197. LLVector3 llvecparentscale(1.0, 2.0, 0);
  198. parent.setScaleChildOffset(TRUE);
  199. parent.setScale(llvecparentscale);
  200. LLQuaternion quat(1, 2, 3, 4);
  201. LLQuaternion quatparent(5, 6, 7, 8);
  202. formMatrix_obj.setRotation(quat);
  203. parent.setRotation(quatparent);
  204. formMatrix_obj.setParent(&parent);
  205. parent.update();
  206. formMatrix_obj.update();
  207. LLVector3 worldPos = llvecpos;
  208. worldPos.scaleVec(llvecparentscale);
  209. worldPos *= quatparent;
  210. worldPos += llvecpospar;
  211. LLQuaternion worldRot = quat * quatparent; 
  212. ensure("getWorldPosition failed: ", formMatrix_obj.getWorldPosition() == worldPos);
  213. ensure("getWorldRotation failed: ", formMatrix_obj.getWorldRotation() == worldRot);
  214. ensure("getWorldPosition for parent failed: ", parent.getWorldPosition() == llvecpospar);
  215. ensure("getWorldRotation for parent failed: ", parent.getWorldRotation() == quatparent);
  216. }
  217. }