diff --git a/Source/Engine/Core/Math/Matrix3x4.h b/Source/Engine/Core/Math/Matrix3x4.h
new file mode 100644
index 000000000..49f6cc1ff
--- /dev/null
+++ b/Source/Engine/Core/Math/Matrix3x4.h
@@ -0,0 +1,55 @@
+// Copyright (c) 2012-2021 Wojciech Figat. All rights reserved.
+
+#pragma once
+
+#include "Matrix.h"
+
+///
+/// Helper matrix for optimized float3x4 package of transformation matrices.
+///
+struct FLAXENGINE_API Matrix3x4
+{
+ float M[3][4];
+
+ void SetMatrix(const Matrix& m)
+ {
+ const float* src = m.Raw;
+ float* dst = &M[0][0];
+ dst[0] = src[0];
+ dst[1] = src[1];
+ dst[2] = src[2];
+ dst[3] = src[3];
+ dst[4] = src[4];
+ dst[5] = src[5];
+ dst[6] = src[6];
+ dst[7] = src[7];
+ dst[8] = src[8];
+ dst[9] = src[9];
+ dst[10] = src[10];
+ dst[11] = src[11];
+ }
+
+ void SetMatrixTranspose(const Matrix& m)
+ {
+ const float* src = m.Raw;
+ float* dst = &M[0][0];
+ dst[0] = src[0];
+ dst[1] = src[4];
+ dst[2] = src[8];
+ dst[3] = src[12];
+ dst[4] = src[1];
+ dst[5] = src[5];
+ dst[6] = src[9];
+ dst[7] = src[13];
+ dst[8] = src[2];
+ dst[9] = src[6];
+ dst[10] = src[10];
+ dst[11] = src[14];
+ }
+};
+
+template<>
+struct TIsPODType
+{
+ enum { Value = true };
+};
diff --git a/Source/Engine/Graphics/Models/SkinnedMeshDrawData.cpp b/Source/Engine/Graphics/Models/SkinnedMeshDrawData.cpp
index 2094be3b2..25c29b11a 100644
--- a/Source/Engine/Graphics/Models/SkinnedMeshDrawData.cpp
+++ b/Source/Engine/Graphics/Models/SkinnedMeshDrawData.cpp
@@ -4,53 +4,7 @@
#include "Engine/Graphics/GPUDevice.h"
#include "Engine/Animations/Config.h"
#include "Engine/Core/Math/Matrix.h"
-
-struct SkinMatrix3x4
-{
- float M[3][4];
-
- FORCE_INLINE void SetMatrix(const Matrix& mat)
- {
- const float* src = mat.Raw;
- float* dest = &(M[0][0]);
-
- dest[0] = src[0]; // [0][0]
- dest[1] = src[1]; // [0][1]
- dest[2] = src[2]; // [0][2]
- dest[3] = src[3]; // [0][3]
-
- dest[4] = src[4]; // [1][0]
- dest[5] = src[5]; // [1][1]
- dest[6] = src[6]; // [1][2]
- dest[7] = src[7]; // [1][3]
-
- dest[8] = src[8]; // [2][0]
- dest[9] = src[9]; // [2][1]
- dest[10] = src[10]; // [2][2]
- dest[11] = src[11]; // [2][3]
- }
-
- FORCE_INLINE void SetMatrixTranspose(const Matrix& mat)
- {
- const float* src = mat.Raw;
- float* dest = &(M[0][0]);
-
- dest[0] = src[0]; // [0][0]
- dest[1] = src[4]; // [1][0]
- dest[2] = src[8]; // [2][0]
- dest[3] = src[12]; // [3][0]
-
- dest[4] = src[1]; // [0][1]
- dest[5] = src[5]; // [1][1]
- dest[6] = src[9]; // [2][1]
- dest[7] = src[13]; // [3][1]
-
- dest[8] = src[2]; // [0][2]
- dest[9] = src[6]; // [1][2]
- dest[10] = src[10]; // [2][2]
- dest[11] = src[14]; // [3][2]
- }
-};
+#include "Engine/Core/Math/Matrix3x4.h"
SkinnedMeshDrawData::~SkinnedMeshDrawData()
{
@@ -99,7 +53,6 @@ void SkinnedMeshDrawData::SetData(const Matrix* bones, bool dropHistory)
LOG(Fatal, "Failed to initialize the skinned mesh bones buffer");
}
}
-
Swap(PrevBoneMatrices, BoneMatrices);
}
else
@@ -109,15 +62,15 @@ void SkinnedMeshDrawData::SetData(const Matrix* bones, bool dropHistory)
// Copy bones to the buffer
const int32 count = BonesCount;
- const int32 PreFetchStride = 2;
+ const int32 preFetchStride = 2;
const Matrix* input = bones;
- const auto output = (SkinMatrix3x4*)Data.Get();
- ASSERT(Data.Count() == count * sizeof(SkinMatrix3x4));
+ const auto output = (Matrix3x4*)Data.Get();
+ ASSERT(Data.Count() == count * sizeof(Matrix3x4));
for (int32 i = 0; i < count; i++)
{
- SkinMatrix3x4* bone = output + i;
- Platform::Prefetch(bone + PreFetchStride);
- Platform::Prefetch((byte*)(bone + PreFetchStride) + PLATFORM_CACHE_LINE_SIZE);
+ Matrix3x4* bone = output + i;
+ Platform::Prefetch(bone + preFetchStride);
+ Platform::Prefetch((byte*)(bone + preFetchStride) + PLATFORM_CACHE_LINE_SIZE);
bone->SetMatrixTranspose(input[i]);
}