From d6bc9fef6cbb0c57f59df3d1fce2b9cbc5525f9f Mon Sep 17 00:00:00 2001
From: Rye Mutt <rye@alchemyviewer.org>
Date: Sat, 21 Mar 2020 13:05:18 -0400
Subject: [PATCH] Some cleanup and opts to initSkinningMatrixPalette

---
 indra/llmath/llmatrix4a.cpp             | 52 -------------------------
 indra/llmath/llmatrix4a.h               | 52 ++++++++++++++++++++++++-
 indra/newview/lldrawpoolavatar.cpp      |  4 +-
 indra/newview/llfloatermodelpreview.cpp |  2 +-
 indra/newview/llskinningutil.cpp        |  9 ++---
 indra/newview/llskinningutil.h          |  2 +-
 indra/newview/llvovolume.cpp            |  2 +-
 7 files changed, 60 insertions(+), 63 deletions(-)

diff --git a/indra/llmath/llmatrix4a.cpp b/indra/llmath/llmatrix4a.cpp
index fe8f0b98f36..7f402ee267b 100644
--- a/indra/llmath/llmatrix4a.cpp
+++ b/indra/llmath/llmatrix4a.cpp
@@ -26,55 +26,3 @@
 
 #include "llmath.h"
 #include "llmatrix4a.h"
-
-// Convert a bounding box into other coordinate system. Should give
-// the same results as transforming every corner of the bounding box
-// and extracting the bounding box of that, although that's not
-// necessarily the fastest way to implement.
-void matMulBoundBox(const LLMatrix4a &mat, const LLVector4a *in_extents, LLVector4a *out_extents)
-{
-		//get 8 corners of bounding box
-		LLVector4Logical mask[6];
-
-		for (U32 i = 0; i < 6; ++i)
-		{
-			mask[i].clear();
-		}
-
-		mask[0].setElement<2>(); //001
-		mask[1].setElement<1>(); //010
-		mask[2].setElement<1>(); //011
-		mask[2].setElement<2>();
-		mask[3].setElement<0>(); //100
-		mask[4].setElement<0>(); //101
-		mask[4].setElement<2>();
-		mask[5].setElement<0>(); //110
-		mask[5].setElement<1>();
-
-		LLVector4a v[8];
-
-		v[6] = in_extents[0];
-		v[7] = in_extents[1];
-
-		for (U32 i = 0; i < 6; ++i)
-		{
-			v[i].setSelectWithMask(mask[i], in_extents[0], in_extents[1]);
-		}
-
-		LLVector4a tv[8];
-
-		//transform bounding box into drawable space
-		for (U32 i = 0; i < 8; ++i)
-		{
-			mat.affineTransform(v[i], tv[i]);
-		}
-	
-		//find bounding box
-		out_extents[0] = out_extents[1] = tv[0];
-
-		for (U32 i = 1; i < 8; ++i)
-		{
-			out_extents[0].setMin(out_extents[0], tv[i]);
-			out_extents[1].setMax(out_extents[1], tv[i]);
-		}
-}
diff --git a/indra/llmath/llmatrix4a.h b/indra/llmath/llmatrix4a.h
index ee3ce332e7d..36f92a51c3d 100644
--- a/indra/llmath/llmatrix4a.h
+++ b/indra/llmath/llmatrix4a.h
@@ -185,6 +185,56 @@ inline std::ostream& operator<<(std::ostream& s, const LLMatrix4a& m)
     return s;
 } 
 
-void matMulBoundBox(const LLMatrix4a &a, const LLVector4a *in_extents, LLVector4a *out_extents);
+// Convert a bounding box into other coordinate system. Should give
+// the same results as transforming every corner of the bounding box
+// and extracting the bounding box of that, although that's not
+// necessarily the fastest way to implement.
+inline void matMulBoundBox(const LLMatrix4a & mat, const LLVector4a *in_extents, LLVector4a *out_extents)
+{
+	//get 8 corners of bounding box
+	LLVector4Logical mask[6];
+
+	for (U32 i = 0; i < 6; ++i)
+	{
+		mask[i].clear();
+	}
+
+	mask[0].setElement<2>(); //001
+	mask[1].setElement<1>(); //010
+	mask[2].setElement<1>(); //011
+	mask[2].setElement<2>();
+	mask[3].setElement<0>(); //100
+	mask[4].setElement<0>(); //101
+	mask[4].setElement<2>();
+	mask[5].setElement<0>(); //110
+	mask[5].setElement<1>();
+
+	LLVector4a v[8];
+
+	v[6] = in_extents[0];
+	v[7] = in_extents[1];
+
+	for (U32 i = 0; i < 6; ++i)
+	{
+		v[i].setSelectWithMask(mask[i], in_extents[0], in_extents[1]);
+	}
+
+	LLVector4a tv[8];
+
+	//transform bounding box into drawable space
+	for (U32 i = 0; i < 8; ++i)
+	{
+		mat.affineTransform(v[i], tv[i]);
+	}
+
+	//find bounding box
+	out_extents[0] = out_extents[1] = tv[0];
+
+	for (U32 i = 1; i < 8; ++i)
+	{
+		out_extents[0].setMin(out_extents[0], tv[i]);
+		out_extents[1].setMax(out_extents[1], tv[i]);
+	}
+}
 
 #endif
diff --git a/indra/newview/lldrawpoolavatar.cpp b/indra/newview/lldrawpoolavatar.cpp
index 5cef15918b0..2bd011972ff 100644
--- a/indra/newview/lldrawpoolavatar.cpp
+++ b/indra/newview/lldrawpoolavatar.cpp
@@ -1955,7 +1955,7 @@ void LLDrawPoolAvatar::updateRiggedFaceVertexBuffer(
 		//build matrix palette
 		LLMatrix4a mat[LL_MAX_JOINTS_PER_MESH_OBJECT];
         U32 count = LLSkinningUtil::getMeshJointCount(skin);
-        LLSkinningUtil::initSkinningMatrixPalette((LLMatrix4*)mat, count, skin, avatar);
+        LLSkinningUtil::initSkinningMatrixPalette(mat, count, skin, avatar);
         LLSkinningUtil::checkSkinWeights(weights, buffer->getNumVerts(), skin);
 
 		LLMatrix4a bind_shape_matrix;
@@ -2170,7 +2170,7 @@ void LLDrawPoolAvatar::renderRigged(LLVOAvatar* avatar, U32 type, bool glow)
                 // upload matrix palette to shader
 				LLMatrix4a mat[LL_MAX_JOINTS_PER_MESH_OBJECT];
 				U32 count = LLSkinningUtil::getMeshJointCount(skin);
-                LLSkinningUtil::initSkinningMatrixPalette((LLMatrix4*)mat, count, skin, avatar);
+                LLSkinningUtil::initSkinningMatrixPalette(mat, count, skin, avatar);
 
 				stop_glerror();
 
diff --git a/indra/newview/llfloatermodelpreview.cpp b/indra/newview/llfloatermodelpreview.cpp
index bc44e37c5ad..7dc45784170 100644
--- a/indra/newview/llfloatermodelpreview.cpp
+++ b/indra/newview/llfloatermodelpreview.cpp
@@ -4152,7 +4152,7 @@ BOOL LLModelPreview::render()
 							LLMatrix4a mat[LL_MAX_JOINTS_PER_MESH_OBJECT];
                             const LLMeshSkinInfo *skin = &model->mSkinInfo;
 							U32 count = LLSkinningUtil::getMeshJointCount(skin);
-                            LLSkinningUtil::initSkinningMatrixPalette((LLMatrix4*)mat, count,
+                            LLSkinningUtil::initSkinningMatrixPalette(mat, count,
                                                                         skin, getPreviewAvatar());
                             LLMatrix4a bind_shape_matrix;
                             bind_shape_matrix.loadu(skin->mBindShapeMatrix);
diff --git a/indra/newview/llskinningutil.cpp b/indra/newview/llskinningutil.cpp
index 1fb63c7444c..c4d50ef670b 100644
--- a/indra/newview/llskinningutil.cpp
+++ b/indra/newview/llskinningutil.cpp
@@ -123,7 +123,7 @@ void LLSkinningUtil::scrubInvalidJoints(LLVOAvatar *avatar, LLMeshSkinInfo* skin
 #define MAT_USE_SSE 1
 
 void LLSkinningUtil::initSkinningMatrixPalette(
-    LLMatrix4* mat,
+    LLMatrix4a* mat,
     S32 count, 
     const LLMeshSkinInfo* skin,
     LLVOAvatar *avatar)
@@ -136,11 +136,10 @@ void LLSkinningUtil::initSkinningMatrixPalette(
         if (joint)
         {
 #ifdef MAT_USE_SSE
-            LLMatrix4a bind, world, res;
+            LLMatrix4a bind, world;
             bind.loadu(skin->mInvBindMatrix[j]);
             world.loadu(joint->getWorldMatrix());
-            matMul(bind,world,res);
-            memcpy(mat[j].mMatrix,res.mMatrix,16*sizeof(float));
+            matMul(bind,world, mat[j]);
 #else
             mat[j] = skin->mInvBindMatrix[j];
             mat[j] *= joint->getWorldMatrix();
@@ -148,7 +147,7 @@ void LLSkinningUtil::initSkinningMatrixPalette(
         }
         else
         {
-            mat[j] = skin->mInvBindMatrix[j];
+            mat[j].loadu(skin->mInvBindMatrix[j]);
 #if DEBUG_SKINNING
             // This  shouldn't  happen   -  in  mesh  upload,  skinned
             // rendering  should  be disabled  unless  all joints  are
diff --git a/indra/newview/llskinningutil.h b/indra/newview/llskinningutil.h
index 549aa6a29f7..8926389c82a 100644
--- a/indra/newview/llskinningutil.h
+++ b/indra/newview/llskinningutil.h
@@ -42,7 +42,7 @@ namespace LLSkinningUtil
     S32 getMaxJointCount();
     U32 getMeshJointCount(const LLMeshSkinInfo *skin);
     void scrubInvalidJoints(LLVOAvatar *avatar, LLMeshSkinInfo* skin);
-    void initSkinningMatrixPalette(LLMatrix4* mat, S32 count, const LLMeshSkinInfo* skin, LLVOAvatar *avatar);
+    void initSkinningMatrixPalette(LLMatrix4a* mat, S32 count, const LLMeshSkinInfo* skin, LLVOAvatar *avatar);
     void checkSkinWeights(LLVector4a* weights, U32 num_vertices, const LLMeshSkinInfo* skin);
     void scrubSkinWeights(LLVector4a* weights, U32 num_vertices, const LLMeshSkinInfo* skin);
     void getPerVertexSkinMatrix(F32* weights, LLMatrix4a* mat, bool handle_bad_scale, LLMatrix4a& final_mat, U32 max_joints);
diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp
index 925eb91cc1a..526c5657ab3 100644
--- a/indra/newview/llvovolume.cpp
+++ b/indra/newview/llvovolume.cpp
@@ -4827,7 +4827,7 @@ void LLRiggedVolume::update(const LLMeshSkinInfo* skin, LLVOAvatar* avatar, cons
 
 	LLMatrix4a mat[kMaxJoints];
 	U32 maxJoints = LLSkinningUtil::getMeshJointCount(skin);
-    LLSkinningUtil::initSkinningMatrixPalette((LLMatrix4*)mat, maxJoints, skin, avatar);
+    LLSkinningUtil::initSkinningMatrixPalette(mat, maxJoints, skin, avatar);
 
     S32 rigged_vert_count = 0;
     S32 rigged_face_count = 0;
-- 
GitLab