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

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file xform.h
  3.  *
  4.  * $LicenseInfo:firstyear=2001&license=viewergpl$
  5.  * 
  6.  * Copyright (c) 2001-2010, Linden Research, Inc.
  7.  * 
  8.  * Second Life Viewer Source Code
  9.  * The source code in this file ("Source Code") is provided by Linden Lab
  10.  * to you under the terms of the GNU General Public License, version 2.0
  11.  * ("GPL"), unless you have obtained a separate licensing agreement
  12.  * ("Other License"), formally executed by you and Linden Lab.  Terms of
  13.  * the GPL can be found in doc/GPL-license.txt in this distribution, or
  14.  * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
  15.  * 
  16.  * There are special exceptions to the terms and conditions of the GPL as
  17.  * it is applied to this Source Code. View the full text of the exception
  18.  * in the file doc/FLOSS-exception.txt in this software distribution, or
  19.  * online at
  20.  * http://secondlifegrid.net/programs/open_source/licensing/flossexception
  21.  * 
  22.  * By copying, modifying or distributing this software, you acknowledge
  23.  * that you have read and understood your obligations described above,
  24.  * and agree to abide by those obligations.
  25.  * 
  26.  * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
  27.  * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
  28.  * COMPLETENESS OR PERFORMANCE.
  29.  * $/LicenseInfo$
  30.  */
  31. #ifndef LL_XFORM_H
  32. #define LL_XFORM_H
  33. #include "v3math.h"
  34. #include "m4math.h"
  35. #include "llquaternion.h"
  36. const F32 MAX_OBJECT_Z  = 4096.f; // should match REGION_HEIGHT_METERS, Pre-havok4: 768.f
  37. const F32 MIN_OBJECT_Z  = -256.f;
  38. const F32 DEFAULT_MAX_PRIM_SCALE = 10.f;
  39. const F32 MIN_PRIM_SCALE = 0.01f;
  40. const F32 MAX_PRIM_SCALE = 65536.f; // something very high but not near FLT_MAX
  41. class LLXform
  42. {
  43. protected:
  44. LLVector3   mPosition;
  45. LLQuaternion  mRotation; 
  46. LLVector3   mScale;
  47. //RN: TODO: move these world transform members to LLXformMatrix
  48. // as they are *never* updated or accessed in the base class
  49. LLVector3   mWorldPosition;
  50. LLQuaternion  mWorldRotation;
  51. LLXform*      mParent;
  52. U32   mChanged;
  53. BOOL   mScaleChildOffset;
  54. public:
  55. typedef enum e_changed_flags
  56. {
  57. UNCHANGED   = 0x00,
  58. TRANSLATED  = 0x01,
  59. ROTATED = 0x02,
  60. SCALED = 0x04,
  61. SHIFTED = 0x08,
  62. GEOMETRY = 0x10,
  63. TEXTURE = 0x20,
  64. MOVED       = TRANSLATED|ROTATED|SCALED,
  65. SILHOUETTE = 0x40,
  66. ALL_CHANGED = 0x7f
  67. }EChangedFlags;
  68. void init()
  69. {
  70. mParent  = NULL;
  71. mChanged = UNCHANGED;
  72. mPosition.setVec(0,0,0);
  73. mRotation.loadIdentity();
  74. mScale.   setVec(1,1,1);
  75. mWorldPosition.clearVec();
  76. mWorldRotation.loadIdentity();
  77. mScaleChildOffset = FALSE;
  78. }
  79.  LLXform();
  80. virtual ~LLXform();
  81. void getLocalMat4(LLMatrix4 &mat) const { mat.initAll(mScale, mRotation, mPosition); }
  82. inline BOOL setParent(LLXform *parent);
  83. inline void setPosition(const LLVector3& pos);
  84. inline void setPosition(const F32 x, const F32 y, const F32 z);
  85. inline void setPositionX(const F32 x);
  86. inline void setPositionY(const F32 y);
  87. inline void setPositionZ(const F32 z);
  88. inline void addPosition(const LLVector3& pos);
  89. inline void setScale(const LLVector3& scale);
  90. inline void setScale(const F32 x, const F32 y, const F32 z);
  91. inline void setRotation(const LLQuaternion& rot);
  92. inline void setRotation(const F32 x, const F32 y, const F32 z);
  93. inline void setRotation(const F32 x, const F32 y, const F32 z, const F32 s);
  94. // Above functions must be inline for speed, but also
  95. // need to emit warnings.  llwarns causes inline LLError::CallSite
  96. // static objects that make more work for the linker.
  97. // Avoid inline llwarns by calling this function.
  98. void warn(const char* const msg);
  99. void  setChanged(const U32 bits) { mChanged |= bits; }
  100. BOOL isChanged() const { return mChanged; }
  101. BOOL  isChanged(const U32 bits) const { return mChanged & bits; }
  102. void  clearChanged() { mChanged = 0; }
  103. void        clearChanged(U32 bits)                      { mChanged &= ~bits; }
  104. void setScaleChildOffset(BOOL scale) { mScaleChildOffset = scale; }
  105. BOOL getScaleChildOffset() { return mScaleChildOffset; }
  106. LLXform* getParent() const { return mParent; }
  107. LLXform* getRoot() const;
  108. virtual BOOL isRoot() const;
  109. virtual BOOL isRootEdit() const;
  110. const LLVector3& getPosition()  const     { return mPosition; }
  111. const LLVector3& getScale() const { return mScale; }
  112. const LLQuaternion& getRotation() const { return mRotation; }
  113. const LLVector3& getPositionW() const { return mWorldPosition; }
  114. const LLQuaternion& getWorldRotation() const { return mWorldRotation; }
  115. const LLVector3& getWorldPosition() const { return mWorldPosition; }
  116. };
  117. class LLXformMatrix : public LLXform
  118. {
  119. public:
  120. LLXformMatrix() : LLXform() {};
  121. virtual ~LLXformMatrix();
  122. const LLMatrix4&    getWorldMatrix() const      { return mWorldMatrix; }
  123. void setWorldMatrix (const LLMatrix4& mat)   { mWorldMatrix = mat; }
  124. void init()
  125. {
  126. mWorldMatrix.setIdentity();
  127. mMin.clearVec();
  128. mMax.clearVec();
  129. LLXform::init();
  130. }
  131. void update();
  132. void updateMatrix(BOOL update_bounds = TRUE);
  133. void getMinMax(LLVector3& min,LLVector3& max) const;
  134. protected:
  135. LLMatrix4 mWorldMatrix;
  136. LLVector3 mMin;
  137. LLVector3 mMax;
  138. };
  139. BOOL LLXform::setParent(LLXform* parent)
  140. {
  141. // Validate and make sure we're not creating a loop
  142. if (parent == mParent)
  143. {
  144. return TRUE;
  145. }
  146. if (parent)
  147. {
  148. LLXform *cur_par = parent->mParent;
  149. while (cur_par)
  150. {
  151. if (cur_par == this)
  152. {
  153. //warn("LLXform::setParent Creating loop when setting parent!");
  154. return FALSE;
  155. }
  156. cur_par = cur_par->mParent;
  157. }
  158. }
  159. mParent = parent;
  160. return TRUE;
  161. }
  162. void LLXform::setPosition(const LLVector3& pos)
  163. {
  164. setChanged(TRANSLATED);
  165. if (pos.isFinite())
  166. mPosition = pos; 
  167. else
  168. {
  169. mPosition.clearVec();
  170. warn("Non Finite in LLXform::setPosition(LLVector3)");
  171. }
  172. }
  173. void LLXform::setPosition(const F32 x, const F32 y, const F32 z)
  174. {
  175. setChanged(TRANSLATED);
  176. if (llfinite(x) && llfinite(y) && llfinite(z))
  177. mPosition.setVec(x,y,z); 
  178. else
  179. {
  180. mPosition.clearVec();
  181. warn("Non Finite in LLXform::setPosition(F32,F32,F32)");
  182. }
  183. }
  184. void LLXform::setPositionX(const F32 x)
  185. setChanged(TRANSLATED);
  186. if (llfinite(x))
  187. mPosition.mV[VX] = x; 
  188. else
  189. {
  190. mPosition.mV[VX] = 0.f;
  191. warn("Non Finite in LLXform::setPositionX");
  192. }
  193. }
  194. void LLXform::setPositionY(const F32 y)
  195. setChanged(TRANSLATED);
  196. if (llfinite(y))
  197. mPosition.mV[VY] = y; 
  198. else
  199. {
  200. mPosition.mV[VY] = 0.f;
  201. warn("Non Finite in LLXform::setPositionY");
  202. }
  203. }
  204. void LLXform::setPositionZ(const F32 z)
  205. setChanged(TRANSLATED);
  206. if (llfinite(z))
  207. mPosition.mV[VZ] = z; 
  208. else
  209. {
  210. mPosition.mV[VZ] = 0.f;
  211. warn("Non Finite in LLXform::setPositionZ");
  212. }
  213. }
  214. void LLXform::addPosition(const LLVector3& pos)
  215. setChanged(TRANSLATED);
  216. if (pos.isFinite())
  217. mPosition += pos; 
  218. else
  219. warn("Non Finite in LLXform::addPosition");
  220. }
  221. void LLXform::setScale(const LLVector3& scale)
  222. setChanged(SCALED);
  223. if (scale.isFinite())
  224. mScale = scale; 
  225. else
  226. {
  227. mScale.setVec(1.f, 1.f, 1.f);
  228. warn("Non Finite in LLXform::setScale");
  229. }
  230. }
  231. void LLXform::setScale(const F32 x, const F32 y, const F32 z)
  232. setChanged(SCALED);
  233. if (llfinite(x) && llfinite(y) && llfinite(z))
  234. mScale.setVec(x,y,z); 
  235. else
  236. {
  237. mScale.setVec(1.f, 1.f, 1.f);
  238. warn("Non Finite in LLXform::setScale");
  239. }
  240. }
  241. void LLXform::setRotation(const LLQuaternion& rot)
  242. setChanged(ROTATED);
  243. if (rot.isFinite())
  244. mRotation = rot; 
  245. else
  246. {
  247. mRotation.loadIdentity();
  248. warn("Non Finite in LLXform::setRotation");
  249. }
  250. }
  251. void LLXform::setRotation(const F32 x, const F32 y, const F32 z) 
  252. setChanged(ROTATED);
  253. if (llfinite(x) && llfinite(y) && llfinite(z))
  254. {
  255. mRotation.setQuat(x,y,z); 
  256. }
  257. else
  258. {
  259. mRotation.loadIdentity();
  260. warn("Non Finite in LLXform::setRotation");
  261. }
  262. }
  263. void LLXform::setRotation(const F32 x, const F32 y, const F32 z, const F32 s) 
  264. setChanged(ROTATED);
  265. if (llfinite(x) && llfinite(y) && llfinite(z) && llfinite(s))
  266. {
  267. mRotation.mQ[VX] = x; mRotation.mQ[VY] = y; mRotation.mQ[VZ] = z; mRotation.mQ[VS] = s; 
  268. }
  269. else
  270. {
  271. mRotation.loadIdentity();
  272. warn("Non Finite in LLXform::setRotation");
  273. }
  274. }
  275. #endif