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]); }