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

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file llviewerjointmesh.cpp
  3.  * @brief LLV4* class header file - vector processor enabled math
  4.  *
  5.  * $LicenseInfo:firstyear=2007&license=viewergpl$
  6.  * 
  7.  * Copyright (c) 2007-2010, Linden Research, Inc.
  8.  * 
  9.  * Second Life Viewer Source Code
  10.  * The source code in this file ("Source Code") is provided by Linden Lab
  11.  * to you under the terms of the GNU General Public License, version 2.0
  12.  * ("GPL"), unless you have obtained a separate licensing agreement
  13.  * ("Other License"), formally executed by you and Linden Lab.  Terms of
  14.  * the GPL can be found in doc/GPL-license.txt in this distribution, or
  15.  * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
  16.  * 
  17.  * There are special exceptions to the terms and conditions of the GPL as
  18.  * it is applied to this Source Code. View the full text of the exception
  19.  * in the file doc/FLOSS-exception.txt in this software distribution, or
  20.  * online at
  21.  * http://secondlifegrid.net/programs/open_source/licensing/flossexception
  22.  * 
  23.  * By copying, modifying or distributing this software, you acknowledge
  24.  * that you have read and understood your obligations described above,
  25.  * and agree to abide by those obligations.
  26.  * 
  27.  * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
  28.  * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
  29.  * COMPLETENESS OR PERFORMANCE.
  30.  * $/LicenseInfo$
  31.  */
  32. #ifndef LL_LLV4MATRIX4_H
  33. #define LL_LLV4MATRIX4_H
  34. #include "llv4math.h"
  35. #include "llv4matrix3.h" // just for operator LLV4Matrix3()
  36. #include "llv4vector3.h"
  37. //-----------------------------------------------------------------------------
  38. //-----------------------------------------------------------------------------
  39. // LLV4Matrix4
  40. //-----------------------------------------------------------------------------
  41. //-----------------------------------------------------------------------------
  42. LL_LLV4MATH_ALIGN_PREFIX
  43. class LLV4Matrix4
  44. {
  45. public:
  46. union {
  47. F32 mMatrix[LLV4_NUM_AXIS][LLV4_NUM_AXIS];
  48. V4F32 mV[LLV4_NUM_AXIS];
  49. };
  50. void lerp(const LLV4Matrix4 &a, const LLV4Matrix4 &b, const F32 &w);
  51. void multiply(const LLVector3 &a, LLVector3& o) const;
  52. void multiply(const LLVector3 &a, LLV4Vector3& o) const;
  53. const LLV4Matrix4& transpose();
  54. const LLV4Matrix4&  translate(const LLVector3 &vec);
  55. const LLV4Matrix4&  translate(const LLV4Vector3 &vec);
  56. const LLV4Matrix4& operator=(const LLMatrix4& a);
  57. operator LLMatrix4() const { return *(reinterpret_cast<const LLMatrix4*>(const_cast<const F32*>(&mMatrix[0][0]))); }
  58. operator LLV4Matrix3() const { return *(reinterpret_cast<const LLV4Matrix3*>(const_cast<const F32*>(&mMatrix[0][0]))); }
  59. friend LLVector3 operator*(const LLVector3 &a, const LLV4Matrix4 &b);
  60. }
  61. LL_LLV4MATH_ALIGN_POSTFIX;
  62. //-----------------------------------------------------------------------------
  63. //-----------------------------------------------------------------------------
  64. // LLV4Matrix4 - SSE
  65. //-----------------------------------------------------------------------------
  66. //-----------------------------------------------------------------------------
  67. #if LL_VECTORIZE
  68. inline void LLV4Matrix4::lerp(const LLV4Matrix4 &a, const LLV4Matrix4 &b, const F32 &w)
  69. {
  70. __m128 vw = _mm_set1_ps(w);
  71. mV[VX] = _mm_add_ps(_mm_mul_ps(_mm_sub_ps(b.mV[VX], a.mV[VX]), vw), a.mV[VX]); // ( b - a ) * w + a
  72. mV[VY] = _mm_add_ps(_mm_mul_ps(_mm_sub_ps(b.mV[VY], a.mV[VY]), vw), a.mV[VY]);
  73. mV[VZ] = _mm_add_ps(_mm_mul_ps(_mm_sub_ps(b.mV[VZ], a.mV[VZ]), vw), a.mV[VZ]);
  74. mV[VW] = _mm_add_ps(_mm_mul_ps(_mm_sub_ps(b.mV[VW], a.mV[VW]), vw), a.mV[VW]);
  75. }
  76. inline void LLV4Matrix4::multiply(const LLVector3 &a, LLVector3& o) const
  77. {
  78. LLV4Vector3 j;
  79. j.v = _mm_add_ps(mV[VW], _mm_mul_ps(_mm_set1_ps(a.mV[VX]), mV[VX])); // ( ax * vx ) + vw
  80. j.v = _mm_add_ps(j.v   , _mm_mul_ps(_mm_set1_ps(a.mV[VY]), mV[VY]));
  81. j.v = _mm_add_ps(j.v   , _mm_mul_ps(_mm_set1_ps(a.mV[VZ]), mV[VZ]));
  82. o.setVec(j.mV);
  83. }
  84. inline void LLV4Matrix4::multiply(const LLVector3 &a, LLV4Vector3& o) const
  85. {
  86. o.v = _mm_add_ps(mV[VW], _mm_mul_ps(_mm_set1_ps(a.mV[VX]), mV[VX])); // ( ax * vx ) + vw
  87. o.v = _mm_add_ps(o.v   , _mm_mul_ps(_mm_set1_ps(a.mV[VY]), mV[VY]));
  88. o.v = _mm_add_ps(o.v   , _mm_mul_ps(_mm_set1_ps(a.mV[VZ]), mV[VZ]));
  89. }
  90. inline const LLV4Matrix4& LLV4Matrix4::translate(const LLV4Vector3 &vec)
  91. {
  92. mV[VW] = _mm_add_ps(mV[VW], vec.v);
  93. return (*this);
  94. }
  95. //-----------------------------------------------------------------------------
  96. //-----------------------------------------------------------------------------
  97. // LLV4Matrix4
  98. //-----------------------------------------------------------------------------
  99. //-----------------------------------------------------------------------------
  100. #else
  101. inline void LLV4Matrix4::lerp(const LLV4Matrix4 &a, const LLV4Matrix4 &b, const F32 &w)
  102. {
  103. mMatrix[VX][VX] = llv4lerp(a.mMatrix[VX][VX], b.mMatrix[VX][VX], w);
  104. mMatrix[VX][VY] = llv4lerp(a.mMatrix[VX][VY], b.mMatrix[VX][VY], w);
  105. mMatrix[VX][VZ] = llv4lerp(a.mMatrix[VX][VZ], b.mMatrix[VX][VZ], w);
  106. mMatrix[VY][VX] = llv4lerp(a.mMatrix[VY][VX], b.mMatrix[VY][VX], w);
  107. mMatrix[VY][VY] = llv4lerp(a.mMatrix[VY][VY], b.mMatrix[VY][VY], w);
  108. mMatrix[VY][VZ] = llv4lerp(a.mMatrix[VY][VZ], b.mMatrix[VY][VZ], w);
  109. mMatrix[VZ][VX] = llv4lerp(a.mMatrix[VZ][VX], b.mMatrix[VZ][VX], w);
  110. mMatrix[VZ][VY] = llv4lerp(a.mMatrix[VZ][VY], b.mMatrix[VZ][VY], w);
  111. mMatrix[VZ][VZ] = llv4lerp(a.mMatrix[VZ][VZ], b.mMatrix[VZ][VZ], w);
  112. mMatrix[VW][VX] = llv4lerp(a.mMatrix[VW][VX], b.mMatrix[VW][VX], w);
  113. mMatrix[VW][VY] = llv4lerp(a.mMatrix[VW][VY], b.mMatrix[VW][VY], w);
  114. mMatrix[VW][VZ] = llv4lerp(a.mMatrix[VW][VZ], b.mMatrix[VW][VZ], w);
  115. }
  116. inline void LLV4Matrix4::multiply(const LLVector3 &a, LLVector3& o) const
  117. {
  118. o.setVec( a.mV[VX] * mMatrix[VX][VX] + 
  119. a.mV[VY] * mMatrix[VY][VX] + 
  120. a.mV[VZ] * mMatrix[VZ][VX] +
  121. mMatrix[VW][VX],
  122.  
  123. a.mV[VX] * mMatrix[VX][VY] + 
  124. a.mV[VY] * mMatrix[VY][VY] + 
  125. a.mV[VZ] * mMatrix[VZ][VY] +
  126. mMatrix[VW][VY],
  127.  
  128. a.mV[VX] * mMatrix[VX][VZ] + 
  129. a.mV[VY] * mMatrix[VY][VZ] + 
  130. a.mV[VZ] * mMatrix[VZ][VZ] +
  131. mMatrix[VW][VZ]);
  132. }
  133. inline void LLV4Matrix4::multiply(const LLVector3 &a, LLV4Vector3& o) const
  134. {
  135. o.setVec( a.mV[VX] * mMatrix[VX][VX] + 
  136. a.mV[VY] * mMatrix[VY][VX] + 
  137. a.mV[VZ] * mMatrix[VZ][VX] +
  138. mMatrix[VW][VX],
  139.  
  140. a.mV[VX] * mMatrix[VX][VY] + 
  141. a.mV[VY] * mMatrix[VY][VY] + 
  142. a.mV[VZ] * mMatrix[VZ][VY] +
  143. mMatrix[VW][VY],
  144.  
  145. a.mV[VX] * mMatrix[VX][VZ] + 
  146. a.mV[VY] * mMatrix[VY][VZ] + 
  147. a.mV[VZ] * mMatrix[VZ][VZ] +
  148. mMatrix[VW][VZ]);
  149. }
  150. inline const LLV4Matrix4& LLV4Matrix4::translate(const LLV4Vector3 &vec)
  151. {
  152. mMatrix[3][0] += vec.mV[0];
  153. mMatrix[3][1] += vec.mV[1];
  154. mMatrix[3][2] += vec.mV[2];
  155. return (*this);
  156. }
  157. //-----------------------------------------------------------------------------
  158. //-----------------------------------------------------------------------------
  159. // LLV4Matrix4
  160. //-----------------------------------------------------------------------------
  161. //-----------------------------------------------------------------------------
  162. #endif
  163. inline const LLV4Matrix4& LLV4Matrix4::operator=(const LLMatrix4& a)
  164. {
  165. memcpy(mMatrix, a.mMatrix, sizeof(F32) * 16 );
  166. return *this;
  167. }
  168. inline const LLV4Matrix4& LLV4Matrix4::transpose()
  169. {
  170. #if LL_VECTORIZE && defined(_MM_TRANSPOSE4_PS)
  171. _MM_TRANSPOSE4_PS(mV[VX], mV[VY], mV[VZ], mV[VW]);
  172. #else
  173. LLV4Matrix4 mat;
  174. mat.mMatrix[0][0] = mMatrix[0][0];
  175. mat.mMatrix[1][0] = mMatrix[0][1];
  176. mat.mMatrix[2][0] = mMatrix[0][2];
  177. mat.mMatrix[3][0] = mMatrix[0][3];
  178. mat.mMatrix[0][1] = mMatrix[1][0];
  179. mat.mMatrix[1][1] = mMatrix[1][1];
  180. mat.mMatrix[2][1] = mMatrix[1][2];
  181. mat.mMatrix[3][1] = mMatrix[1][3];
  182. mat.mMatrix[0][2] = mMatrix[2][0];
  183. mat.mMatrix[1][2] = mMatrix[2][1];
  184. mat.mMatrix[2][2] = mMatrix[2][2];
  185. mat.mMatrix[3][2] = mMatrix[2][3];
  186. mat.mMatrix[0][3] = mMatrix[3][0];
  187. mat.mMatrix[1][3] = mMatrix[3][1];
  188. mat.mMatrix[2][3] = mMatrix[3][2];
  189. mat.mMatrix[3][3] = mMatrix[3][3];
  190. *this = mat;
  191. #endif
  192. return *this;
  193. }
  194. inline const LLV4Matrix4& LLV4Matrix4::translate(const LLVector3 &vec)
  195. {
  196. mMatrix[3][0] += vec.mV[0];
  197. mMatrix[3][1] += vec.mV[1];
  198. mMatrix[3][2] += vec.mV[2];
  199. return (*this);
  200. }
  201. inline LLVector3 operator*(const LLVector3 &a, const LLV4Matrix4 &b)
  202. {
  203. return LLVector3(a.mV[VX] * b.mMatrix[VX][VX] + 
  204.  a.mV[VY] * b.mMatrix[VY][VX] + 
  205.  a.mV[VZ] * b.mMatrix[VZ][VX] +
  206.  b.mMatrix[VW][VX],
  207.  
  208.  a.mV[VX] * b.mMatrix[VX][VY] + 
  209.  a.mV[VY] * b.mMatrix[VY][VY] + 
  210.  a.mV[VZ] * b.mMatrix[VZ][VY] +
  211.  b.mMatrix[VW][VY],
  212.  
  213.  a.mV[VX] * b.mMatrix[VX][VZ] + 
  214.  a.mV[VY] * b.mMatrix[VY][VZ] + 
  215.  a.mV[VZ] * b.mMatrix[VZ][VZ] +
  216.  b.mMatrix[VW][VZ]);
  217. }
  218. #endif