Skip to content

Commit fafcc78

Browse files
[Rendering] Bugfixes to skinned mesh renderers;
1 parent eae33be commit fafcc78

File tree

4 files changed

+50
-41
lines changed

4 files changed

+50
-41
lines changed

Engine/Core/Rendering/Animation/SkinnedMeshRenderSystem.cs

Lines changed: 44 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,11 @@ private struct RenderInfo
2020
/// </summary>
2121
public SkinnedMeshRenderer renderer;
2222

23+
/// <summary>
24+
/// The render cache
25+
/// </summary>
26+
public RenderCache cache;
27+
2328
/// <summary>
2429
/// The current position of the object
2530
/// </summary>
@@ -36,9 +41,16 @@ private struct RenderInfo
3641
public ushort viewID;
3742
}
3843

44+
private class RenderCache
45+
{
46+
public Matrix4x4[] boneMatrices;
47+
48+
public VertexBuffer boneBuffer;
49+
}
50+
3951
private readonly ExpandableContainer<RenderInfo> renderers = new();
4052

41-
private readonly Dictionary<int, Matrix4x4[]> cachedBoneMatrices = [];
53+
private readonly Dictionary<int, RenderCache> renderCache = [];
4254

4355
public void Startup()
4456
{
@@ -94,23 +106,39 @@ public void Process((Entity, Transform, IComponent)[] entities, Camera activeCam
94106

95107
renderer.animator ??= new(entity, EntityQueryMode.Parent, false);
96108

109+
var animator = renderer.animator.Content;
110+
var mesh = renderer.mesh;
111+
var meshAsset = mesh.meshAsset;
112+
113+
Matrix4x4[] boneMatrices;
114+
115+
if (renderCache.TryGetValue(meshAsset.Guid.GetHashCode(), out var cache) == false)
116+
{
117+
boneMatrices = new Matrix4x4[meshAsset.BoneCount];
118+
119+
cache = new()
120+
{
121+
boneMatrices = boneMatrices,
122+
};
123+
124+
renderCache.Add(meshAsset.Guid.GetHashCode(), cache);
125+
}
126+
else
127+
{
128+
boneMatrices = cache.boneMatrices;
129+
}
130+
97131
renderers.Add(new()
98132
{
99133
renderer = renderer,
134+
cache = cache,
100135
position = transform.Position,
101136
transform = transform.Matrix,
102137
viewID = viewId
103138
});
104139

105-
var animator = renderer.animator.Content;
106-
var mesh = renderer.mesh;
107-
var meshAsset = mesh.meshAsset;
108-
var meshAssetMesh = meshAsset.meshes[mesh.meshAssetIndex];
109-
110140
var useAnimator = animator != null && animator.evaluator != null;
111141

112-
Matrix4x4[] boneMatrices;
113-
114142
if (useAnimator)
115143
{
116144
if((animator?.cachedBoneMatrices?.Length ?? 0) == 0)
@@ -120,25 +148,21 @@ public void Process((Entity, Transform, IComponent)[] entities, Camera activeCam
120148

121149
boneMatrices = animator.cachedBoneMatrices;
122150
}
123-
else if (cachedBoneMatrices.TryGetValue(meshAsset.Guid.GetHashCode(), out boneMatrices) == false)
151+
else
124152
{
125-
boneMatrices = new Matrix4x4[meshAsset.BoneCount];
126-
127-
cachedBoneMatrices.Add(meshAsset.Guid.GetHashCode(), boneMatrices);
128-
129153
UpdateBoneMatrices(meshAsset, boneMatrices, meshAsset.nodes);
130154
}
131155

132-
if (useAnimator == false && (renderer.boneMatrixBuffer?.Disposed ?? true))
156+
if (useAnimator == false && (cache.boneBuffer?.Disposed ?? true))
133157
{
134-
renderer.boneMatrixBuffer = VertexBuffer.CreateDynamic(new VertexLayoutBuilder()
158+
cache.boneBuffer = VertexBuffer.CreateDynamic(new VertexLayoutBuilder()
135159
.Add(VertexAttribute.TexCoord0, 4, VertexAttributeType.Float)
136160
.Add(VertexAttribute.TexCoord1, 4, VertexAttributeType.Float)
137161
.Add(VertexAttribute.TexCoord2, 4, VertexAttributeType.Float)
138162
.Add(VertexAttribute.TexCoord3, 4, VertexAttributeType.Float)
139163
.Build(), RenderBufferFlags.ComputeRead, true, (uint)boneMatrices.Length);
140164

141-
renderer.boneMatrixBuffer.Update(boneMatrices.AsSpan(), 0, true);
165+
cache.boneBuffer.Update(boneMatrices.AsSpan(), 0, true);
142166
}
143167
}
144168
}
@@ -165,6 +189,7 @@ public void Submit()
165189
foreach(var pair in renderers.Contents)
166190
{
167191
var renderer = pair.renderer;
192+
var cache = pair.cache;
168193
var mesh = renderer.mesh;
169194
var meshAsset = mesh.meshAsset;
170195
var animator = renderer.animator.Content;
@@ -228,14 +253,9 @@ public void Submit()
228253
bgfx.DiscardFlags.IndexBuffer |
229254
bgfx.DiscardFlags.Transform;
230255

231-
if (useAnimator)
232-
{
233-
animator.boneMatrixBuffer?.SetBufferActive(15, Access.Read);
234-
}
235-
else
236-
{
237-
renderer.boneMatrixBuffer?.SetBufferActive(15, Access.Read);
238-
}
256+
var buffer = useAnimator ? animator.boneMatrixBuffer : cache.boneBuffer;
257+
258+
buffer?.SetBufferActive(15, Access.Read);
239259

240260
bgfx.submit(pair.viewID, program, 0, (byte)flags);
241261
}
Lines changed: 1 addition & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,11 @@
11
using System.Collections.Generic;
2-
using System.Numerics;
32

43
namespace Staple;
54

65
/// <summary>
76
/// Skinned Mesh Renderer component
87
/// </summary>
9-
public sealed class SkinnedMeshRenderer : Renderable, IComponentDisposable
8+
public sealed class SkinnedMeshRenderer : Renderable
109
{
1110
/// <summary>
1211
/// The mesh used for this
@@ -27,16 +26,4 @@ public sealed class SkinnedMeshRenderer : Renderable, IComponentDisposable
2726
/// Cached animator for this renderer
2827
/// </summary>
2928
internal EntityQuery<SkinnedMeshAnimator> animator;
30-
31-
/// <summary>
32-
/// The bone matrix compute buffer for skinning
33-
/// </summary>
34-
internal VertexBuffer boneMatrixBuffer;
35-
36-
public void DisposeComponent()
37-
{
38-
boneMatrixBuffer?.Destroy();
39-
40-
boneMatrixBuffer = null;
41-
}
4229
}

Engine/Core/Rendering/Mesh/MeshAsset.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -479,9 +479,9 @@ public void ApplyTo(Transform transform)
479479

480480
Matrix4x4.Decompose(GlobalTransform, out var scale, out var rotation, out var position);
481481

482-
transform.Position = position;
483-
transform.Rotation = rotation;
484-
transform.Scale = scale;
482+
transform.LocalPosition = position;
483+
transform.LocalRotation = rotation;
484+
transform.LocalScale = scale;
485485
}
486486

487487
/// <summary>

Engine/Editor/EditorUtils.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -338,6 +338,8 @@ internal static Entity InstanceMesh(string name, MeshAsset asset, Entity parentE
338338

339339
nodeTransform.SetParent(baseTransform);
340340

341+
node.ApplyTo(nodeTransform);
342+
341343
foreach (var index in node.meshIndices)
342344
{
343345
if (index < 0 || index >= asset.meshes.Count)

0 commit comments

Comments
 (0)