|
1 | 1 | using Bgfx; |
2 | 2 | using System; |
3 | 3 | using System.Collections.Generic; |
| 4 | +using System.Linq; |
4 | 5 | using System.Numerics; |
5 | 6 |
|
6 | 7 | namespace Staple.Internal; |
@@ -74,6 +75,8 @@ public static void RenderMesh(Mesh mesh, Vector3 position, Quaternion rotation, |
74 | 75 |
|
75 | 76 | material.DisableShaderKeyword(Shader.SkinningKeyword); |
76 | 77 |
|
| 78 | + material.DisableShaderKeyword(Shader.InstancingKeyword); |
| 79 | + |
77 | 80 | var lightSystem = RenderSystem.Instance.Get<LightSystem>(); |
78 | 81 |
|
79 | 82 | lightSystem?.ApplyMaterialLighting(material, lighting); |
@@ -249,9 +252,9 @@ public void Submit() |
249 | 252 |
|
250 | 253 | foreach(var (viewId, pairs) in instanceCache) |
251 | 254 | { |
252 | | - foreach(var (_, contents) in pairs) |
| 255 | + foreach (var (_, contents) in pairs) |
253 | 256 | { |
254 | | - if(contents.Length == 0) |
| 257 | + if (contents.Length == 0) |
255 | 258 | { |
256 | 259 | continue; |
257 | 260 | } |
@@ -281,27 +284,58 @@ public void Submit() |
281 | 284 | lightSystem?.ApplyLightProperties(contents.Contents[0].position, contents.Contents[0].transform, material, |
282 | 285 | RenderSystem.CurrentCamera.Item2.Position, contents.Contents[0].lighting); |
283 | 286 |
|
284 | | - for(var i = 0; i < contents.Length; i++) |
| 287 | + material.EnableShaderKeyword(Shader.InstancingKeyword); |
| 288 | + |
| 289 | + if(material.Keywords.Contains(Shader.InstancingKeyword)) |
285 | 290 | { |
286 | | - var content = contents.Contents[i]; |
| 291 | + contents.Contents[0].mesh.SetActive(contents.Contents[0].submeshIndex); |
287 | 292 |
|
288 | | - unsafe |
289 | | - { |
290 | | - var transform = content.transform; |
| 293 | + var program = material.ShaderProgram; |
| 294 | + |
| 295 | + var matrices = new Matrix4x4[contents.Length]; |
291 | 296 |
|
292 | | - _ = bgfx.set_transform(&transform, 1); |
| 297 | + for (var i = 0; i < contents.Length; i++) |
| 298 | + { |
| 299 | + matrices[i] = contents.Contents[i].transform; |
293 | 300 | } |
294 | 301 |
|
295 | | - content.mesh.SetActive(content.submeshIndex); |
| 302 | + var instanceBuffer = InstanceBuffer.Create(contents.Length, 16 * sizeof(float)); |
296 | 303 |
|
297 | | - var program = material.ShaderProgram; |
| 304 | + instanceBuffer.SetData(matrices.AsSpan()); |
| 305 | + |
| 306 | + instanceBuffer.Bind(0, instanceBuffer.count); |
298 | 307 |
|
299 | 308 | var flags = bgfx.DiscardFlags.VertexStreams | |
300 | 309 | bgfx.DiscardFlags.IndexBuffer | |
| 310 | + bgfx.DiscardFlags.InstanceData | |
301 | 311 | bgfx.DiscardFlags.Transform; |
302 | 312 |
|
303 | 313 | bgfx.submit(viewId, program, 0, (byte)flags); |
304 | 314 | } |
| 315 | + else |
| 316 | + { |
| 317 | + for (var i = 0; i < contents.Length; i++) |
| 318 | + { |
| 319 | + var content = contents.Contents[i]; |
| 320 | + |
| 321 | + unsafe |
| 322 | + { |
| 323 | + var transform = content.transform; |
| 324 | + |
| 325 | + _ = bgfx.set_transform(&transform, 1); |
| 326 | + } |
| 327 | + |
| 328 | + content.mesh.SetActive(content.submeshIndex); |
| 329 | + |
| 330 | + var program = material.ShaderProgram; |
| 331 | + |
| 332 | + var flags = bgfx.DiscardFlags.VertexStreams | |
| 333 | + bgfx.DiscardFlags.IndexBuffer | |
| 334 | + bgfx.DiscardFlags.Transform; |
| 335 | + |
| 336 | + bgfx.submit(viewId, program, 0, (byte)flags); |
| 337 | + } |
| 338 | + } |
305 | 339 |
|
306 | 340 | contents.Clear(); |
307 | 341 | } |
|
0 commit comments