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

游戏引擎

开发平台:

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_LLV4MATRIX3_H
  33. #define LL_LLV4MATRIX3_H
  34. #include "llv4math.h"
  35. #include "llv4vector3.h"
  36. #include "m3math.h" // for operator LLMatrix3()
  37. //-----------------------------------------------------------------------------
  38. //-----------------------------------------------------------------------------
  39. // LLV4Matrix3
  40. //-----------------------------------------------------------------------------
  41. //-----------------------------------------------------------------------------
  42. LL_LLV4MATH_ALIGN_PREFIX
  43. class LLV4Matrix3
  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 LLV4Matrix3 &a, const LLV4Matrix3 &b, const F32 &w);
  51. void multiply(const LLVector3 &a, LLVector3& out) const;
  52. void multiply(const LLVector4 &a, LLV4Vector3& out) const;
  53. void multiply(const LLVector3 &a, LLV4Vector3& out) const;
  54. const LLV4Matrix3& transpose();
  55. const LLV4Matrix3& operator=(const LLMatrix3& a);
  56. operator LLMatrix3() const { return (reinterpret_cast<const LLMatrix4*>(const_cast<const F32*>(&mMatrix[0][0])))->getMat3(); }
  57. friend LLVector3 operator*(const LLVector3& a, const LLV4Matrix3& b);
  58. }
  59. LL_LLV4MATH_ALIGN_POSTFIX;
  60. //-----------------------------------------------------------------------------
  61. //-----------------------------------------------------------------------------
  62. // LLV4Matrix3 - SSE
  63. //-----------------------------------------------------------------------------
  64. //-----------------------------------------------------------------------------
  65. #if LL_VECTORIZE
  66. inline void LLV4Matrix3::lerp(const LLV4Matrix3 &a, const LLV4Matrix3 &b, const F32 &w)
  67. {
  68. __m128 vw = _mm_set1_ps(w);
  69. 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
  70. mV[VY] = _mm_add_ps(_mm_mul_ps(_mm_sub_ps(b.mV[VY], a.mV[VY]), vw), a.mV[VY]);
  71. mV[VZ] = _mm_add_ps(_mm_mul_ps(_mm_sub_ps(b.mV[VZ], a.mV[VZ]), vw), a.mV[VZ]);
  72. }
  73. inline void LLV4Matrix3::multiply(const LLVector3 &a, LLVector3& o) const
  74. {
  75. LLV4Vector3 j;
  76. j.v =    _mm_mul_ps(_mm_set1_ps(a.mV[VX]), mV[VX]); // ( ax * vx ) + ...
  77. j.v = _mm_add_ps(j.v  , _mm_mul_ps(_mm_set1_ps(a.mV[VY]), mV[VY]));
  78. j.v = _mm_add_ps(j.v  , _mm_mul_ps(_mm_set1_ps(a.mV[VZ]), mV[VZ]));
  79. o.setVec(j.mV);
  80. }
  81. inline void LLV4Matrix3::multiply(const LLVector4 &a, LLV4Vector3& o) const
  82. {
  83. o.v = _mm_mul_ps(_mm_set1_ps(a.mV[VX]), mV[VX]); // ( ax * vx ) + ...
  84. o.v = _mm_add_ps(o.v  , _mm_mul_ps(_mm_set1_ps(a.mV[VY]), mV[VY]));
  85. o.v = _mm_add_ps(o.v  , _mm_mul_ps(_mm_set1_ps(a.mV[VZ]), mV[VZ]));
  86. }
  87. inline void LLV4Matrix3::multiply(const LLVector3 &a, LLV4Vector3& o) const
  88. {
  89. o.v = _mm_mul_ps(_mm_set1_ps(a.mV[VX]), mV[VX]); // ( ax * vx ) + ...
  90. o.v = _mm_add_ps(o.v  , _mm_mul_ps(_mm_set1_ps(a.mV[VY]), mV[VY]));
  91. o.v = _mm_add_ps(o.v  , _mm_mul_ps(_mm_set1_ps(a.mV[VZ]), mV[VZ]));
  92. }
  93. //-----------------------------------------------------------------------------
  94. //-----------------------------------------------------------------------------
  95. // LLV4Matrix3
  96. //-----------------------------------------------------------------------------
  97. //-----------------------------------------------------------------------------
  98. #else
  99. inline void LLV4Matrix3::lerp(const LLV4Matrix3 &a, const LLV4Matrix3 &b, const F32 &w)
  100. {
  101. mMatrix[VX][VX] = llv4lerp(a.mMatrix[VX][VX], b.mMatrix[VX][VX], w);
  102. mMatrix[VX][VY] = llv4lerp(a.mMatrix[VX][VY], b.mMatrix[VX][VY], w);
  103. mMatrix[VX][VZ] = llv4lerp(a.mMatrix[VX][VZ], b.mMatrix[VX][VZ], w);
  104. mMatrix[VY][VX] = llv4lerp(a.mMatrix[VY][VX], b.mMatrix[VY][VX], w);
  105. mMatrix[VY][VY] = llv4lerp(a.mMatrix[VY][VY], b.mMatrix[VY][VY], w);
  106. mMatrix[VY][VZ] = llv4lerp(a.mMatrix[VY][VZ], b.mMatrix[VY][VZ], w);
  107. mMatrix[VZ][VX] = llv4lerp(a.mMatrix[VZ][VX], b.mMatrix[VZ][VX], w);
  108. mMatrix[VZ][VY] = llv4lerp(a.mMatrix[VZ][VY], b.mMatrix[VZ][VY], w);
  109. mMatrix[VZ][VZ] = llv4lerp(a.mMatrix[VZ][VZ], b.mMatrix[VZ][VZ], w);
  110. }
  111. inline void LLV4Matrix3::multiply(const LLVector3 &a, LLVector3& o) const
  112. {
  113. o.setVec( a.mV[VX] * mMatrix[VX][VX] + 
  114. a.mV[VY] * mMatrix[VY][VX] + 
  115. a.mV[VZ] * mMatrix[VZ][VX],
  116.  
  117. a.mV[VX] * mMatrix[VX][VY] + 
  118. a.mV[VY] * mMatrix[VY][VY] + 
  119. a.mV[VZ] * mMatrix[VZ][VY],
  120.  
  121. a.mV[VX] * mMatrix[VX][VZ] + 
  122. a.mV[VY] * mMatrix[VY][VZ] + 
  123. a.mV[VZ] * mMatrix[VZ][VZ]);
  124. }
  125. inline void LLV4Matrix3::multiply(const LLVector4 &a, LLV4Vector3& o) const
  126. {
  127. o.setVec( a.mV[VX] * mMatrix[VX][VX] + 
  128. a.mV[VY] * mMatrix[VY][VX] + 
  129. a.mV[VZ] * mMatrix[VZ][VX],
  130.  
  131. a.mV[VX] * mMatrix[VX][VY] + 
  132. a.mV[VY] * mMatrix[VY][VY] + 
  133. a.mV[VZ] * mMatrix[VZ][VY],
  134.  
  135. a.mV[VX] * mMatrix[VX][VZ] + 
  136. a.mV[VY] * mMatrix[VY][VZ] + 
  137. a.mV[VZ] * mMatrix[VZ][VZ]);
  138. }
  139. inline void LLV4Matrix3::multiply(const LLVector3 &a, LLV4Vector3& o) const
  140. {
  141. o.setVec( a.mV[VX] * mMatrix[VX][VX] + 
  142. a.mV[VY] * mMatrix[VY][VX] + 
  143. a.mV[VZ] * mMatrix[VZ][VX],
  144.  
  145. a.mV[VX] * mMatrix[VX][VY] + 
  146. a.mV[VY] * mMatrix[VY][VY] + 
  147. a.mV[VZ] * mMatrix[VZ][VY],
  148.  
  149. a.mV[VX] * mMatrix[VX][VZ] + 
  150. a.mV[VY] * mMatrix[VY][VZ] + 
  151. a.mV[VZ] * mMatrix[VZ][VZ]);
  152. }
  153. //-----------------------------------------------------------------------------
  154. //-----------------------------------------------------------------------------
  155. // LLV4Matrix3
  156. //-----------------------------------------------------------------------------
  157. //-----------------------------------------------------------------------------
  158. #endif
  159. inline const LLV4Matrix3& LLV4Matrix3::transpose()
  160. {
  161. #if LL_VECTORIZE && defined(_MM_TRANSPOSE4_PS)
  162. _MM_TRANSPOSE4_PS(mV[VX], mV[VY], mV[VZ], mV[VW]);
  163. return *this;
  164. #else
  165. F32 temp;
  166. temp = mMatrix[VX][VY]; mMatrix[VX][VY] = mMatrix[VY][VX]; mMatrix[VY][VX] = temp;
  167. temp = mMatrix[VX][VZ]; mMatrix[VX][VZ] = mMatrix[VZ][VX]; mMatrix[VZ][VX] = temp;
  168. temp = mMatrix[VY][VZ]; mMatrix[VY][VZ] = mMatrix[VZ][VY]; mMatrix[VZ][VY] = temp;
  169. #endif
  170. return *this;
  171. }
  172. inline const LLV4Matrix3& LLV4Matrix3::operator=(const LLMatrix3& a)
  173. {
  174. memcpy(mMatrix[VX], a.mMatrix[VX], sizeof(F32) * 3 );
  175. memcpy(mMatrix[VY], a.mMatrix[VY], sizeof(F32) * 3 );
  176. memcpy(mMatrix[VZ], a.mMatrix[VZ], sizeof(F32) * 3 );
  177. return *this;
  178. }
  179. inline LLVector3 operator*(const LLVector3& a, const LLV4Matrix3& b)
  180. {
  181. return LLVector3(
  182. a.mV[VX] * b.mMatrix[VX][VX] + 
  183. a.mV[VY] * b.mMatrix[VY][VX] + 
  184. a.mV[VZ] * b.mMatrix[VZ][VX],
  185. a.mV[VX] * b.mMatrix[VX][VY] + 
  186. a.mV[VY] * b.mMatrix[VY][VY] + 
  187. a.mV[VZ] * b.mMatrix[VZ][VY],
  188. a.mV[VX] * b.mMatrix[VX][VZ] + 
  189. a.mV[VY] * b.mMatrix[VY][VZ] + 
  190. a.mV[VZ] * b.mMatrix[VZ][VZ] );
  191. }
  192. #endif