Skip to content

Commit 9c7ceb2

Browse files
[Rendering] WIP on texture binding and default uniforms;
1 parent 553da61 commit 9c7ceb2

File tree

12 files changed

+330
-177
lines changed

12 files changed

+330
-177
lines changed

Engine/Staple.Core/Rendering/Animation/SkinnedMeshRenderSystem.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -326,7 +326,7 @@ void SetupMaterial()
326326
continue;
327327
}
328328

329-
material.ApplyProperties(Material.ApplyMode.All);
329+
//material.ApplyProperties(Material.ApplyMode.All, ref renderState);
330330
}
331331

332332
SetupMaterial();

Engine/Staple.Core/Rendering/Graphics.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ public static void RenderGeometry(VertexBuffer vertex, IndexBuffer index,
5656
vertexCount = vertexCount,
5757
indexCount = indexCount,
5858
vertexLayout = vertex.layout,
59+
world = transform,
5960
};
6061

6162
if(materialSetupCallback != null)
@@ -64,7 +65,7 @@ public static void RenderGeometry(VertexBuffer vertex, IndexBuffer index,
6465
}
6566
else
6667
{
67-
material.ApplyProperties(Material.ApplyMode.All);
68+
material.ApplyProperties(Material.ApplyMode.All, ref renderState);
6869

6970
material.DisableShaderKeyword(Shader.SkinningKeyword);
7071

Engine/Staple.Core/Rendering/Material.cs

Lines changed: 48 additions & 75 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,50 @@ internal static Texture WhiteTexture
101101
internal Shader shader;
102102
internal MaterialMetadata metadata;
103103

104+
internal Texture[] textures;
105+
106+
internal Texture[] Textures
107+
{
108+
get
109+
{
110+
var textureCount = hasMainTexture ? 1 : 0;
111+
112+
foreach(var pair in parameters)
113+
{
114+
if(pair.Value?.textureValue?.Disposed ?? true)
115+
{
116+
continue;
117+
}
118+
119+
textureCount++;
120+
}
121+
122+
if(textures == null || textures.Length != textureCount)
123+
{
124+
Array.Resize(ref textures, textureCount);
125+
}
126+
127+
if(hasMainTexture)
128+
{
129+
textures[0] = MainTexture;
130+
}
131+
132+
var counter = 1;
133+
134+
foreach (var pair in parameters)
135+
{
136+
if (pair.Value?.textureValue?.Disposed ?? true)
137+
{
138+
continue;
139+
}
140+
141+
textures[counter++] = pair.Value.textureValue;
142+
}
143+
144+
return textures;
145+
}
146+
}
147+
104148
internal Dictionary<int, ParameterInfo> parameters = [];
105149

106150
internal Dictionary<int, ParameterInfo> instanceParameters = [];
@@ -989,23 +1033,17 @@ internal ShaderHandle GetShaderHandle(string name)
9891033
/// Applies the default properties of this material to the shader
9901034
/// </summary>
9911035
/// <param name="applyMode">How to apply the properties</param>
992-
internal void ApplyProperties(ApplyMode applyMode)
1036+
/// <param name="state">The render state to apply to</param>
1037+
internal void ApplyProperties(ApplyMode applyMode, ref RenderState state)
9931038
{
9941039
if(shader == null)
9951040
{
9961041
return;
9971042
}
9981043

999-
if(hasMainTexture && applyMode != ApplyMode.IgnoreTextures)
1044+
if(applyMode != ApplyMode.IgnoreTextures)
10001045
{
1001-
var t = mainTexture;
1002-
1003-
if (t?.Disposed ?? true)
1004-
{
1005-
MainTexture = WhiteTexture;
1006-
}
1007-
1008-
shader.SetTexture(mainTextureHandle, mainTexture);
1046+
state.textures = Textures;
10091047
}
10101048

10111049
if(hasMainColor)
@@ -1031,71 +1069,6 @@ internal void ApplyProperties(ApplyMode applyMode)
10311069

10321070
switch (parameter.type)
10331071
{
1034-
case MaterialParameterType.Texture:
1035-
1036-
if(applyMode == ApplyMode.IgnoreTextures)
1037-
{
1038-
continue;
1039-
}
1040-
1041-
applyPropertiesCallbacks[counter++] = () =>
1042-
{
1043-
if (parameter.hasTexture == false)
1044-
{
1045-
if (parameter.shaderHandle.Variant != null)
1046-
{
1047-
DisableShaderKeyword(parameter.shaderHandle.Variant);
1048-
}
1049-
1050-
return;
1051-
}
1052-
1053-
var texture = parameter.textureValue;
1054-
1055-
if (parameter.relatedParameters.Length == 0)
1056-
{
1057-
parameter.relatedParameters =
1058-
[
1059-
parameters.TryGetValue($"{key}_UMapping".GetHashCode(), out var p) &&
1060-
p.type == MaterialParameterType.TextureWrap ? p : null,
1061-
1062-
parameters.TryGetValue($"{key}_VMapping".GetHashCode(), out p) &&
1063-
p.type == MaterialParameterType.TextureWrap ? p : null,
1064-
];
1065-
}
1066-
1067-
if (parameter.relatedParameters[0] != null &&
1068-
parameter.relatedParameters[1] != null)
1069-
{
1070-
/*
1071-
overrideFlags |=
1072-
parameter.relatedParameters[0].textureWrapValue switch
1073-
{
1074-
TextureWrap.Mirror => TextureFlags.SamplerUMirror,
1075-
TextureWrap.Repeat => 0,
1076-
_ => TextureFlags.SamplerUClamp,
1077-
};
1078-
1079-
overrideFlags |=
1080-
parameter.relatedParameters[1].textureWrapValue switch
1081-
{
1082-
TextureWrap.Mirror => TextureFlags.SamplerVMirror,
1083-
TextureWrap.Repeat => 0,
1084-
_ => TextureFlags.SamplerVClamp,
1085-
};
1086-
*/
1087-
}
1088-
1089-
if (parameter.shaderHandle.Variant != null)
1090-
{
1091-
EnableShaderKeyword(parameter.shaderHandle.Variant);
1092-
}
1093-
1094-
shader.SetTexture(parameter.shaderHandle, texture);
1095-
};
1096-
1097-
break;
1098-
10991072
case MaterialParameterType.Matrix3x3:
11001073

11011074
applyPropertiesCallbacks[counter++] = () =>

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

Lines changed: 16 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -351,6 +351,20 @@ void SetupMaterial()
351351
lightSystem?.ApplyMaterialLighting(material, lighting);
352352
}
353353

354+
var renderState = new RenderState()
355+
{
356+
cull = material.CullingMode,
357+
primitiveType = mesh.MeshTopology,
358+
depthWrite = true,
359+
enableDepth = true,
360+
indexBuffer = mesh.indexBuffer,
361+
vertexBuffer = mesh.vertexBuffer,
362+
indexCount = mesh.IndexCount,
363+
vertexCount = mesh.VertexCount,
364+
vertexLayout = mesh.vertexBuffer.layout,
365+
world = item.transform.Matrix,
366+
};
367+
354368
if (needsChange)
355369
{
356370
lastMaterial = material;
@@ -364,7 +378,7 @@ void SetupMaterial()
364378
continue;
365379
}
366380

367-
material.ApplyProperties(Material.ApplyMode.All);
381+
material.ApplyProperties(Material.ApplyMode.All, ref renderState);
368382
}
369383

370384
SetupMaterial();
@@ -374,32 +388,11 @@ void SetupMaterial()
374388
continue;
375389
}
376390

377-
unsafe
378-
{
379-
var transform = item.transform.Matrix;
380-
381-
//_ = bgfx.set_transform(&transform, 1);
382-
}
383-
384-
//mesh.SetActive(0);
385-
386391
lightSystem?.ApplyLightProperties(material, RenderSystem.CurrentCamera.Item2.Position, lighting);
387392

388393
var program = material.ShaderProgram;
389394

390-
var renderState = new RenderState()
391-
{
392-
cull = material.CullingMode,
393-
primitiveType = mesh.MeshTopology,
394-
depthWrite = true,
395-
enableDepth = true,
396-
indexBuffer = mesh.indexBuffer,
397-
vertexBuffer = mesh.vertexBuffer,
398-
indexCount = mesh.IndexCount,
399-
vertexCount = mesh.VertexCount,
400-
program = program,
401-
vertexLayout = mesh.vertexBuffer.layout,
402-
};
395+
renderState.program = program;
403396

404397
RenderSystem.Submit(RenderSystem.GetViewPass(viewID), renderState, mesh.SubmeshTriangleCount(0), 1);
405398
}

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

Lines changed: 18 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
using System;
22
using System.Collections.Generic;
33
using System.Numerics;
4+
using System.Reflection.Metadata;
45
using System.Runtime.InteropServices;
56

67
namespace Staple.Internal;
@@ -72,19 +73,6 @@ public static void RenderMesh(Mesh mesh, Vector3 position, Quaternion rotation,
7273

7374
var matrix = Matrix4x4.TRS(position, scale, rotation);
7475

75-
/*
76-
bgfx.StateFlags state = material.shader.StateFlags |
77-
mesh.PrimitiveFlag() |
78-
material.CullingFlag;
79-
80-
unsafe
81-
{
82-
_ = bgfx.set_transform(&matrix, 1);
83-
}
84-
85-
bgfx.set_state((ulong)state, 0);
86-
*/
87-
8876
var renderState = new RenderState()
8977
{
9078
enableDepth = true,
@@ -96,6 +84,7 @@ public static void RenderMesh(Mesh mesh, Vector3 position, Quaternion rotation,
9684
vertexLayout = mesh.vertexBuffer.layout,
9785
indexCount = mesh.IndexCount,
9886
vertexCount = mesh.VertexCount,
87+
world = matrix,
9988
};
10089

10190
mesh.SetActive(ref renderState);
@@ -104,7 +93,7 @@ public static void RenderMesh(Mesh mesh, Vector3 position, Quaternion rotation,
10493

10594
material.DisableShaderKeyword(Shader.InstancingKeyword);
10695

107-
material.ApplyProperties(Material.ApplyMode.All);
96+
material.ApplyProperties(Material.ApplyMode.All, ref renderState);
10897

10998
var lightSystem = RenderSystem.Instance.Get<LightSystem>();
11099

@@ -309,6 +298,13 @@ public void Submit(ushort viewID)
309298

310299
var lightSystem = RenderSystem.Instance.Get<LightSystem>();
311300

301+
var renderState = new RenderState()
302+
{
303+
cull = material.CullingMode,
304+
depthWrite = true,
305+
enableDepth = true,
306+
};
307+
312308
if (needsDiscard)
313309
{
314310
lastMaterial = material;
@@ -325,7 +321,7 @@ public void Submit(ushort viewID)
325321
continue;
326322
}
327323

328-
material.ApplyProperties(Material.ApplyMode.All);
324+
material.ApplyProperties(Material.ApplyMode.All, ref renderState);
329325

330326
lightSystem?.ApplyLightProperties(material, RenderSystem.CurrentCamera.Item2.Position,
331327
contents.instanceInfos.Contents[0].lighting);
@@ -386,32 +382,20 @@ public void Submit(ushort viewID)
386382
{
387383
var content = contents.instanceInfos.Contents[i];
388384

389-
/*
390-
unsafe
391-
{
392-
var transform = content.transform.Matrix;
393-
394-
_ = bgfx.set_transform(&transform, 1);
395-
}
396-
*/
397-
398-
var renderState = new RenderState()
399-
{
400-
cull = material.CullingMode,
401-
depthWrite = true,
402-
enableDepth = true,
403-
vertexBuffer = content.mesh.vertexBuffer,
404-
indexBuffer = content.mesh.indexBuffer,
405-
vertexLayout = content.mesh.vertexBuffer.layout,
406-
primitiveType = content.mesh.MeshTopology,
407-
};
385+
renderState.vertexBuffer = content.mesh.vertexBuffer;
386+
renderState.indexBuffer = content.mesh.indexBuffer;
387+
renderState.vertexLayout = content.mesh.vertexBuffer.layout;
388+
renderState.primitiveType = content.mesh.MeshTopology;
389+
renderState.world = content.transform.Matrix;
408390

409391
content.mesh.SetActive(ref renderState, content.submeshIndex);
410392

411393
var program = material.ShaderProgram;
412394

413395
if(program != null)
414396
{
397+
renderState.program = program;
398+
415399
RenderSystem.Submit(RenderSystem.GetViewPass(viewID), renderState, renderData.mesh.SubmeshTriangleCount(content.submeshIndex), 1);
416400
}
417401
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,6 @@ public IRenderPass BeginRenderPass(RenderTarget target, CameraClearMode clear, C
108108

109109
SDL.SDL_SetGPUViewport(renderPass, in viewportData);
110110

111-
return new SDLGPURenderPass(renderPass, view, projection);
111+
return new SDLGPURenderPass(commandBuffer, renderPass, view, projection);
112112
}
113113
}

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,11 @@
33

44
namespace Staple.Internal;
55

6-
internal class SDLGPURenderPass(nint renderPass, Matrix4x4 view, Matrix4x4 projection) : IRenderPass
6+
internal class SDLGPURenderPass(nint commandBuffer, nint renderPass, Matrix4x4 view, Matrix4x4 projection) : IRenderPass
77
{
88
public nint renderPass = renderPass;
99

10+
public readonly nint commandBuffer = commandBuffer;
1011
public readonly Matrix4x4 view = view;
1112
public readonly Matrix4x4 projection = projection;
1213

0 commit comments

Comments
 (0)