diff --git a/Source/Engine/Content/Assets/ModelBase.cpp b/Source/Engine/Content/Assets/ModelBase.cpp index 40971bae0..dd2d970d0 100644 --- a/Source/Engine/Content/Assets/ModelBase.cpp +++ b/Source/Engine/Content/Assets/ModelBase.cpp @@ -666,6 +666,7 @@ bool ModelBase::SaveLOD(WriteStream& stream, const ModelData& modelData, int32 l const bool useSeparatePositions = !isSkinned; const bool useSeparateColors = !isSkinned; PixelFormat blendIndicesFormat = PixelFormat::R8G8B8A8_UInt; + PixelFormat blendWeightsFormat = PixelFormat::R8G8B8A8_UNorm; for (const Int4& indices : mesh.BlendIndices) { if (indices.MaxValue() > MAX_uint8) @@ -705,7 +706,7 @@ bool ModelBase::SaveLOD(WriteStream& stream, const ModelData& modelData, int32 l if (isSkinned) { vb.Add({ VertexElement::Types::BlendIndices, vbIndex, 0, 0, blendIndicesFormat }); - vb.Add({ VertexElement::Types::BlendWeights, vbIndex, 0, 0, PixelFormat::R16G16B16A16_Float }); + vb.Add({ VertexElement::Types::BlendWeights, vbIndex, 0, 0, blendWeightsFormat }); } if (!useSeparateColors && hasColors) vb.Add({ VertexElement::Types::Color, vbIndex, 0, 0, PixelFormat::R8G8B8A8_UNorm }); @@ -784,7 +785,7 @@ bool ModelBase::SaveLOD(WriteStream& stream, const ModelData& modelData, int32 l const Color32 blendIndicesEnc(blendIndices.X, blendIndices.Y, blendIndices.Z, blendIndices.W); stream.Write(blendIndicesEnc); } - else + else //if (blendWeightsFormat == PixelFormat::R16G16B16A16_UInt) { // 16-bit indices const uint16 blendIndicesEnc[4] = { (uint16)blendIndices.X, (uint16)blendIndices.Y, (uint16)blendIndices.Z, (uint16)blendIndices.W }; @@ -795,8 +796,18 @@ bool ModelBase::SaveLOD(WriteStream& stream, const ModelData& modelData, int32 l case VertexElement::Types::BlendWeights: { const Float4 blendWeights = mesh.BlendWeights.Get()[vertex]; - const Half4 blendWeightsEnc(blendWeights); - stream.Write(blendWeightsEnc); + if (blendWeightsFormat == PixelFormat::R8G8B8A8_UNorm) + { + // 8-bit weights + const Color32 blendWeightsEnc(blendWeights); + stream.Write(blendWeightsEnc); + } + else //if (blendWeightsFormat == PixelFormat::R16G16B16A16_Float) + { + // 16-bit weights + const Half4 blendWeightsEnc(blendWeights); + stream.Write(blendWeightsEnc); + } break; } case VertexElement::Types::TexCoord0: diff --git a/Source/Engine/Graphics/Models/SkinnedMesh.cpp b/Source/Engine/Graphics/Models/SkinnedMesh.cpp index 94d0b0f4f..ea1c2c852 100644 --- a/Source/Engine/Graphics/Models/SkinnedMesh.cpp +++ b/Source/Engine/Graphics/Models/SkinnedMesh.cpp @@ -62,7 +62,7 @@ namespace vb0elements.Add({ VertexElement::Types::Tangent, 0, 0, 0, PixelFormat::R10G10B10A2_UNorm }); } vb0elements.Add({ VertexElement::Types::BlendIndices, 0, 0, 0, PixelFormat::R8G8B8A8_UInt }); - vb0elements.Add({ VertexElement::Types::BlendWeights, 0, 0, 0, PixelFormat::R16G16B16A16_Float }); + vb0elements.Add({ VertexElement::Types::BlendWeights, 0, 0, 0, PixelFormat::R8G8B8A8_UNorm }); if (uvs) vb0elements.Add({ VertexElement::Types::TexCoord, 0, 0, 0, PixelFormat::R16G16_Float }); if (colors)