From 6641f5425bf8cfe6f12f7e433a7709c57f597031 Mon Sep 17 00:00:00 2001 From: ackwell Date: Fri, 5 Jan 2024 20:13:39 +1100 Subject: [PATCH] Add morph handling for normal/tangent --- .../Import/Models/Import/VertexAttribute.cs | 38 +++++++++++++++++-- Penumbra/Import/Models/ModelManager.cs | 4 +- 2 files changed, 36 insertions(+), 6 deletions(-) diff --git a/Penumbra/Import/Models/Import/VertexAttribute.cs b/Penumbra/Import/Models/Import/VertexAttribute.cs index 9fd50513..37ccb79d 100644 --- a/Penumbra/Import/Models/Import/VertexAttribute.cs +++ b/Penumbra/Import/Models/Import/VertexAttribute.cs @@ -150,7 +150,7 @@ public class VertexAttribute ); } - public static VertexAttribute? Normal(Accessors accessors) + public static VertexAttribute? Normal(Accessors accessors, IEnumerable morphAccessors) { if (!accessors.TryGetValue("NORMAL", out var accessor)) return null; @@ -164,9 +164,24 @@ public class VertexAttribute var values = accessor.AsVector3Array(); + var foo = morphAccessors + .Select(ma => ma.GetValueOrDefault("NORMAL")?.AsVector3Array()) + .ToArray(); + return new VertexAttribute( element, - index => BuildHalf4(new Vector4(values[index], 0)) + index => BuildHalf4(new Vector4(values[index], 0)), + null, + (morphIndex, vertexIndex) => + { + var value = values[vertexIndex]; + + var delta = foo[morphIndex]?[vertexIndex]; + if (delta != null) + value += delta.Value; + + return BuildHalf4(new Vector4(value, 0)); + } ); } @@ -203,7 +218,7 @@ public class VertexAttribute ); } - public static VertexAttribute? Tangent1(Accessors accessors) + public static VertexAttribute? Tangent1(Accessors accessors, IEnumerable morphAccessors) { if (!accessors.TryGetValue("TANGENT", out var accessor)) return null; @@ -217,9 +232,24 @@ public class VertexAttribute var values = accessor.AsVector4Array(); + var foo = morphAccessors + .Select(ma => ma.GetValueOrDefault("TANGENT")?.AsVector3Array()) + .ToArray(); + return new VertexAttribute( element, - index => BuildByteFloat4(values[index]) + index => BuildByteFloat4(values[index]), + null, + (morphIndex, vertexIndex) => + { + var value = values[vertexIndex]; + + var delta = foo[morphIndex]?[vertexIndex]; + if (delta != null) + value += new Vector4(delta.Value, 0); + + return BuildByteFloat4(value); + } ); } diff --git a/Penumbra/Import/Models/ModelManager.cs b/Penumbra/Import/Models/ModelManager.cs index 223f43ea..d849f3eb 100644 --- a/Penumbra/Import/Models/ModelManager.cs +++ b/Penumbra/Import/Models/ModelManager.cs @@ -523,8 +523,8 @@ public sealed partial class ModelManager : SingleTaskQueue, IDisposable VertexAttribute.Position(accessors, morphAccessors), VertexAttribute.BlendWeight(accessors), VertexAttribute.BlendIndex(accessors), - VertexAttribute.Normal(accessors), - VertexAttribute.Tangent1(accessors), + VertexAttribute.Normal(accessors, morphAccessors), + VertexAttribute.Tangent1(accessors, morphAccessors), VertexAttribute.Color(accessors), VertexAttribute.Uv(accessors), };