diff --git a/Source/Engine/Graphics/Models/ModelData.cpp b/Source/Engine/Graphics/Models/ModelData.cpp index 50361d309..02cb9e6eb 100644 --- a/Source/Engine/Graphics/Models/ModelData.cpp +++ b/Source/Engine/Graphics/Models/ModelData.cpp @@ -515,12 +515,21 @@ void MeshData::TransformBuffer(const Matrix& matrix) for (int32 i = 0; i < blendShape.Vertices.Count(); i++) { auto& v = vv[i]; - Float3 p = Positions[v.VertexIndex], vp; - Float3::Transform(p + v.PositionDelta, matrix, vp); + + Float3 p = Positions[v.VertexIndex]; + Float3 vp = p + v.PositionDelta; + Float3::Transform(vp, matrix, vp); Float3::Transform(p, matrix, p); v.PositionDelta = vp - p; - Float3::TransformNormal(v.NormalDelta, inverseTransposeMatrix, v.NormalDelta); - v.NormalDelta.Normalize(); + + Float3 n = Normals[v.VertexIndex]; + Float3 vn = n + v.NormalDelta; + vn.Normalize(); + Float3::TransformNormal(vn, inverseTransposeMatrix, vn); + vn.Normalize(); + Float3::TransformNormal(n, inverseTransposeMatrix, n); + n.Normalize(); + v.NormalDelta = vn - n; } } diff --git a/Source/Engine/Level/Actors/AnimatedModel.cpp b/Source/Engine/Level/Actors/AnimatedModel.cpp index fbc434099..18bd7fc87 100644 --- a/Source/Engine/Level/Actors/AnimatedModel.cpp +++ b/Source/Engine/Level/Actors/AnimatedModel.cpp @@ -640,7 +640,7 @@ void AnimatedModel::RunBlendShapeDeformer(const MeshBase* mesh, MeshDeformationD ASSERT_LOW_LAYER(blendShapeVertex.VertexIndex < vertexCount); VB0SkinnedElementType& vertex = *(data + blendShapeVertex.VertexIndex); vertex.Position = vertex.Position + blendShapeVertex.PositionDelta * q.Second; - Float3 normal = (vertex.Normal.ToFloat3() * 2.0f - 1.0f) + blendShapeVertex.NormalDelta; + Float3 normal = (vertex.Normal.ToFloat3() * 2.0f - 1.0f) + blendShapeVertex.NormalDelta * q.Second; vertex.Normal = normal * 0.5f + 0.5f; } } diff --git a/Source/Engine/Tools/ModelTool/ModelTool.OpenFBX.cpp b/Source/Engine/Tools/ModelTool/ModelTool.OpenFBX.cpp index b4b46c2f3..a9f06d239 100644 --- a/Source/Engine/Tools/ModelTool/ModelTool.OpenFBX.cpp +++ b/Source/Engine/Tools/ModelTool/ModelTool.OpenFBX.cpp @@ -786,11 +786,13 @@ bool ProcessMesh(ModelData& result, OpenFbxImporterData& data, const ofbx::Mesh* auto shapeNormals = shape->getNormals(); for (int32 i = 0; i < blendShapeData.Vertices.Count(); i++) { - /*auto delta = ToFloat3(shapeNormals[i + firstVertexOffset]) - mesh.Normals[i]; - auto length = delta.Length(); - if (length > ZeroTolerance) - delta /= length;*/ - auto delta = Float3::Zero; // TODO: blend shape normals deltas fix when importing from fbx + auto delta = ToFloat3(shapeNormals[i + firstVertexOffset]); + if (data.ConvertRH) + { + // Mirror normals along the Z axis + delta.Z *= -1.0f; + } + delta = delta - mesh.Normals.Get()[i]; blendShapeData.Vertices.Get()[i].NormalDelta = delta; } }