Skip to content

Commit 380337c

Browse files
[Math] Slight optimization to BoundingSphere CreateFromAABB;
[Rendering] Optimization for shader uniform retrieval; [Rendering] Optimization for ClearCullingState; [Entities] Add transform cache and fix `ChangedThisFrame` flag to properly reset; [Editor] Fix a crash due to accidentally calling ImGui.EndMenu in entity popups;
1 parent 432195d commit 380337c

File tree

10 files changed

+140
-148
lines changed

10 files changed

+140
-148
lines changed

Engine/Staple.Core/Math/BoundingSphere.cs

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -40,18 +40,15 @@ public static BoundingSphere CreateFromPoints(Span<Vector3> points)
4040
public static BoundingSphere CreateFromAABB(AABB aabb)
4141
{
4242
var center = aabb.center;
43-
var maxDistanceSquare = 0.0f;
4443

45-
void Handle(Vector3 p)
46-
{
47-
var temp = p - center;
48-
var distanceSquare = Vector3.Dot(temp, temp);
44+
var temp = aabb.min - center;
45+
var distanceSquare = Vector3.Dot(temp, temp);
46+
var maxDistanceSquare = distanceSquare;
4947

50-
maxDistanceSquare = Math.Max(maxDistanceSquare, distanceSquare);
51-
}
48+
temp = aabb.max - center;
49+
distanceSquare = Vector3.Dot(temp, temp);
5250

53-
Handle(aabb.min);
54-
Handle(aabb.max);
51+
maxDistanceSquare = Math.Max(maxDistanceSquare, distanceSquare);
5552

5653
return new(center, Math.Sqrt(maxDistanceSquare));
5754
}

Engine/Staple.Core/Rendering/Mesh/MeshRenderSystem.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,7 @@ public void Preprocess(Span<RenderEntry> renderQueue, Camera activeCamera, Trans
117117
{
118118
foreach (var entry in renderQueue)
119119
{
120-
var renderer = entry.component as MeshRenderer;
120+
var renderer = (MeshRenderer)entry.component;
121121

122122
if (renderer.mesh == null ||
123123
renderer.materials == null ||
@@ -171,7 +171,7 @@ public void Process(Span<RenderEntry> renderQueue, Camera activeCamera, Transfor
171171

172172
foreach (var entry in renderQueue)
173173
{
174-
var renderer = entry.component as MeshRenderer;
174+
var renderer = (MeshRenderer)entry.component;
175175

176176
if (renderer.isVisible == false ||
177177
renderer.mesh == null ||

Engine/Staple.Core/Rendering/RenderSystem/Backend/Impls/SDLGPU/SDLGPURendererBackend.cs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1457,7 +1457,7 @@ state.indexBuffer is not SDLGPUIndexBuffer index ||
14571457
var vertexUniformData = new List<StapleShaderUniform>();
14581458
var fragmentUniformData = new List<StapleShaderUniform>();
14591459

1460-
foreach (var pair in shader.vertexUniforms)
1460+
foreach (var pair in shader.vertexMappings)
14611461
{
14621462
if(pair.Key.name == StapleRenderDataUniformName)
14631463
{
@@ -1511,7 +1511,7 @@ state.indexBuffer is not SDLGPUIndexBuffer index ||
15111511
}
15121512
}
15131513

1514-
foreach (var pair in shader.fragmentUniforms)
1514+
foreach (var pair in shader.fragmentMappings)
15151515
{
15161516
if (pair.Key.name == StapleFragmentDataUniformName)
15171517
{
@@ -1623,7 +1623,7 @@ public void RenderTransient<T>(Span<T> vertices, VertexLayout layout, Span<ushor
16231623
var vertexUniformData = new List<StapleShaderUniform>();
16241624
var fragmentUniformData = new List<StapleShaderUniform>();
16251625

1626-
foreach (var pair in shader.vertexUniforms)
1626+
foreach (var pair in shader.vertexMappings)
16271627
{
16281628
if (pair.Key.name == StapleRenderDataUniformName)
16291629
{
@@ -1677,7 +1677,7 @@ public void RenderTransient<T>(Span<T> vertices, VertexLayout layout, Span<ushor
16771677
}
16781678
}
16791679

1680-
foreach (var pair in shader.fragmentUniforms)
1680+
foreach (var pair in shader.fragmentMappings)
16811681
{
16821682
if (pair.Key.name == StapleFragmentDataUniformName)
16831683
{
@@ -1790,7 +1790,7 @@ public void RenderTransient<T>(Span<T> vertices, VertexLayout layout, Span<uint>
17901790
var vertexUniformData = new List<StapleShaderUniform>();
17911791
var fragmentUniformData = new List<StapleShaderUniform>();
17921792

1793-
foreach (var pair in shader.vertexUniforms)
1793+
foreach (var pair in shader.vertexMappings)
17941794
{
17951795
if (pair.Key.name == StapleRenderDataUniformName)
17961796
{
@@ -1844,7 +1844,7 @@ public void RenderTransient<T>(Span<T> vertices, VertexLayout layout, Span<uint>
18441844
}
18451845
}
18461846

1847-
foreach (var pair in shader.fragmentUniforms)
1847+
foreach (var pair in shader.fragmentMappings)
18481848
{
18491849
if (pair.Key.name == StapleFragmentDataUniformName)
18501850
{

Engine/Staple.Core/Rendering/RenderSystem/Backend/Impls/SDLGPU/SDLGPUShaderProgram.cs

Lines changed: 36 additions & 97 deletions
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,15 @@ internal class SDLGPUShaderProgram : IShaderProgram
1515
public nint fragment;
1616
public nint compute;
1717
public bool disposed = false;
18-
public Dictionary<ShaderUniformMapping, byte[]> vertexUniforms;
19-
public Dictionary<ShaderUniformMapping, byte[]> fragmentUniforms;
20-
public Dictionary<ShaderUniformMapping, byte[]> computeUniforms;
2118
public readonly Dictionary<byte, ulong> vertexDataHashes = [];
2219
public readonly Dictionary<byte, ulong> fragmentDataHashes = [];
2320
public readonly Dictionary<byte, ulong> computeDataHashes = [];
21+
public readonly Dictionary<ShaderUniformField, byte[]> vertexFields = [];
22+
public readonly Dictionary<ShaderUniformField, byte[]> fragmentFields = [];
23+
public readonly Dictionary<ShaderUniformField, byte[]> computeFields = [];
24+
public readonly Dictionary<ShaderUniformMapping, byte[]> vertexMappings = [];
25+
public readonly Dictionary<ShaderUniformMapping, byte[]> fragmentMappings = [];
26+
public readonly Dictionary<ShaderUniformMapping, byte[]> computeMappings = [];
2427

2528
public SDLGPUShaderProgram(nint device, nint vertex, nint fragment, ShaderUniformContainer vertexUniforms,
2629
ShaderUniformContainer fragmentUniforms)
@@ -30,17 +33,29 @@ public SDLGPUShaderProgram(nint device, nint vertex, nint fragment, ShaderUnifor
3033
this.device = device;
3134
this.vertex = vertex;
3235
this.fragment = fragment;
33-
this.vertexUniforms = [];
34-
this.fragmentUniforms = [];
3536

3637
foreach(var uniform in vertexUniforms.uniforms)
3738
{
38-
this.vertexUniforms.Add(uniform, new byte[uniform.size]);
39+
var data = new byte[uniform.size];
40+
41+
vertexMappings.Add(uniform, data);
42+
43+
foreach(var field in uniform.fields)
44+
{
45+
vertexFields.Add(field, data);
46+
}
3947
}
4048

4149
foreach (var uniform in fragmentUniforms.uniforms)
4250
{
43-
this.fragmentUniforms.Add(uniform, new byte[uniform.size]);
51+
var data = new byte[uniform.size];
52+
53+
fragmentMappings.Add(uniform, data);
54+
55+
foreach (var field in uniform.fields)
56+
{
57+
fragmentFields.Add(field, data);
58+
}
4459
}
4560
}
4661

@@ -50,12 +65,17 @@ public SDLGPUShaderProgram(nint device, nint compute, ShaderUniformContainer uni
5065

5166
this.device = device;
5267
this.compute = compute;
53-
54-
computeUniforms = [];
5568

5669
foreach(var uniform in uniforms.uniforms)
5770
{
58-
computeUniforms.Add(uniform, new byte[uniform.size]);
71+
var data = new byte[uniform.size];
72+
73+
computeMappings.Add(uniform, data);
74+
75+
foreach (var field in uniform.fields)
76+
{
77+
computeFields.Add(field, data);
78+
}
5979
}
6080
}
6181

@@ -153,22 +173,7 @@ public bool TryGetVertexUniformData(ShaderUniformField field, out byte[] data)
153173
return false;
154174
}
155175

156-
foreach(var pair in vertexUniforms)
157-
{
158-
foreach(var f in pair.Key.fields)
159-
{
160-
if(f == field)
161-
{
162-
data = pair.Value;
163-
164-
return true;
165-
}
166-
}
167-
}
168-
169-
data = default;
170-
171-
return false;
176+
return vertexFields.TryGetValue(field, out data);
172177
}
173178

174179
public bool TryGetVertexUniformData(ShaderUniformMapping mapping, out byte[] data)
@@ -180,19 +185,7 @@ public bool TryGetVertexUniformData(ShaderUniformMapping mapping, out byte[] dat
180185
return false;
181186
}
182187

183-
foreach (var pair in vertexUniforms)
184-
{
185-
if(pair.Key == mapping)
186-
{
187-
data = pair.Value;
188-
189-
return true;
190-
}
191-
}
192-
193-
data = default;
194-
195-
return false;
188+
return vertexMappings.TryGetValue(mapping, out data);
196189
}
197190

198191
public bool TryGetFragmentUniformData(ShaderUniformField field, out byte[] data)
@@ -204,22 +197,7 @@ public bool TryGetFragmentUniformData(ShaderUniformField field, out byte[] data)
204197
return false;
205198
}
206199

207-
foreach (var pair in fragmentUniforms)
208-
{
209-
foreach (var f in pair.Key.fields)
210-
{
211-
if (f == field)
212-
{
213-
data = pair.Value;
214-
215-
return true;
216-
}
217-
}
218-
}
219-
220-
data = default;
221-
222-
return false;
200+
return fragmentFields.TryGetValue(field, out data);
223201
}
224202

225203
public bool TryGetFragmentUniformData(ShaderUniformMapping mapping, out byte[] data)
@@ -231,19 +209,7 @@ public bool TryGetFragmentUniformData(ShaderUniformMapping mapping, out byte[] d
231209
return false;
232210
}
233211

234-
foreach (var pair in fragmentUniforms)
235-
{
236-
if (pair.Key == mapping)
237-
{
238-
data = pair.Value;
239-
240-
return true;
241-
}
242-
}
243-
244-
data = default;
245-
246-
return false;
212+
return fragmentMappings.TryGetValue(mapping, out data);
247213
}
248214

249215
public bool TryGetComputeUniformData(ShaderUniformField field, out byte[] data)
@@ -255,22 +221,7 @@ public bool TryGetComputeUniformData(ShaderUniformField field, out byte[] data)
255221
return false;
256222
}
257223

258-
foreach (var pair in computeUniforms)
259-
{
260-
foreach (var f in pair.Key.fields)
261-
{
262-
if (f == field)
263-
{
264-
data = pair.Value;
265-
266-
return true;
267-
}
268-
}
269-
}
270-
271-
data = default;
272-
273-
return false;
224+
return computeFields.TryGetValue(field, out data);
274225
}
275226

276227
public bool TryGetComputeUniformData(ShaderUniformMapping mapping, out byte[] data)
@@ -282,19 +233,7 @@ public bool TryGetComputeUniformData(ShaderUniformMapping mapping, out byte[] da
282233
return false;
283234
}
284235

285-
foreach (var pair in computeUniforms)
286-
{
287-
if (pair.Key == mapping)
288-
{
289-
data = pair.Value;
290-
291-
return true;
292-
}
293-
}
294-
295-
data = default;
296-
297-
return false;
236+
return computeMappings.TryGetValue(mapping, out data);
298237
}
299238

300239
public void Destroy()

Engine/Staple.Core/Rendering/RenderSystem/RenderSystem+Internal.cs

Lines changed: 24 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
using System.Collections.Generic;
33
using System.Numerics;
44
using System.Reflection;
5-
using System.Runtime.CompilerServices;
65
using System.Runtime.InteropServices;
76
using System.Threading;
87

@@ -79,6 +78,11 @@ internal class DrawBucket
7978
/// </summary>
8079
private readonly SceneQuery<Transform> entityQuery = new();
8180

81+
/// <summary>
82+
/// All renderables
83+
/// </summary>
84+
private readonly List<Renderable> renderables = [];
85+
8286
/// <summary>
8387
/// The renderer backend
8488
/// </summary>
@@ -247,20 +251,9 @@ public void Update()
247251
/// </summary>
248252
internal void ClearCullingStates()
249253
{
250-
foreach (var pair in renderQueue)
254+
for (var i = 0; i < renderables.Count; i++)
251255
{
252-
foreach (var item in pair.Item2)
253-
{
254-
foreach (var entry in item.Item2)
255-
{
256-
if (entry.component is not Renderable r)
257-
{
258-
continue;
259-
}
260-
261-
r.cullingState = CullingState.None;
262-
}
263-
}
256+
renderables[i].cullingState = CullingState.None;
264257
}
265258
}
266259

@@ -289,6 +282,23 @@ public void WorldChanged()
289282
lock (lockObject)
290283
{
291284
renderQueue.Clear();
285+
renderables.Clear();
286+
287+
foreach (var systemInfo in renderSystems)
288+
{
289+
if(systemInfo.isRenderable == false)
290+
{
291+
continue;
292+
}
293+
294+
foreach (var entityInfo in entityQuery.Contents)
295+
{
296+
if (entityInfo.Item1.TryGetComponent(systemInfo.system.RelatedComponent, out var component))
297+
{
298+
renderables.Add((Renderable)component);
299+
}
300+
}
301+
}
292302

293303
var cameras = World.Current.SortedCameras;
294304

Engine/Staple.Core/Rendering/RenderSystem/RenderSystem.cs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,16 @@ public override bool Equals([NotNullWhen(true)] object obj)
2828
{
2929
return obj is RenderSystemInfo info && info.system == system && info.isRenderable == isRenderable;
3030
}
31+
32+
public static bool operator ==(RenderSystemInfo left, RenderSystemInfo right)
33+
{
34+
return left.Equals(right);
35+
}
36+
37+
public static bool operator !=(RenderSystemInfo left, RenderSystemInfo right)
38+
{
39+
return !(left == right);
40+
}
3141
}
3242

3343
public SubsystemType type { get; } = SubsystemType.Update;

0 commit comments

Comments
 (0)