Skip to content

Commit c8169bd

Browse files
committed
+++
1 parent 2687a85 commit c8169bd

File tree

13 files changed

+106
-125
lines changed

13 files changed

+106
-125
lines changed

GAIL/Graphics/GraphicsManager.cs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
using GAIL.Graphics.Material;
33
using GAIL.Graphics.Renderer;
44
using GAIL.Graphics.Renderer.Layer;
5-
using GAIL.Graphics.Renderer.Vulkan.Layer;
65
using LambdaKit.Logging;
76
using VulkanRenderer = GAIL.Graphics.Renderer.Vulkan.Renderer;
87

@@ -41,15 +40,14 @@ public GraphicsManager(Logger logger) {
4140
/// <param name="appInfo">The application info for vulkan.</param>
4241
/// <param name="initialSettings">The inital graphical settings to start with. This is useful to set for when you change settings on startup. The default defaults to the default settings.</param> // What the...
4342
/// <exception cref="APIBackendException"></exception>
44-
public void Initialize(Application.Globals globals, AppInfo appInfo, RendererSettings<IBackendLayer>? initialSettings = null) {
43+
public void Initialize(Application.Globals globals, AppInfo appInfo, RendererSettings<ILayerSettings>? initialSettings = null) {
4544
Logger.LogDebug("Initalizing Graphics.");
4645

4746
initialSettings ??= new();
4847

4948
// TODO: Convert initial settings.
5049
// NOTE: How does one create the initial settings??
5150
// Including layers??
52-
5351
Renderer = new VulkanRenderer(LoggerFactory.CreateSublogger(Logger, "Renderer", "renderer"), globals, initialSettings, appInfo);
5452

5553
IsDisposed = false;
@@ -58,6 +56,9 @@ public void Initialize(Application.Globals globals, AppInfo appInfo, RendererSet
5856
Renderer.Resize(width, height);
5957
};
6058
}
59+
private IRenderer CreateRenderer() {
60+
return new VulkanRenderer(LoggerFactory.CreateSublogger(Logger, "Renderer", "renderer"), )
61+
}
6162
/// <summary>
6263
/// Updates the graphics on the screen.
6364
/// </summary>

GAIL/Graphics/Layer/Layer2D.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ namespace GAIL.Graphics.Layer;
88
/// </summary>
99
public class Layer2D : ILayer {
1010
public static Layer2D Create(GraphicsManager manager, Object[] initialRenderList, IShader shader) {
11-
return new(manager.CreateRasterizationLayer(new() { Shaders = shader, RenderList = [.. initialRenderList] }));
11+
return new(manager.CreateRasterizationLayer(new() { Shader = shader, RenderList = [.. initialRenderList] }));
1212
}
1313
/// <summary>
1414
/// If this 2D layer is disposed.

GAIL/Graphics/Object.cs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
using GAIL.Graphics.Mesh;
2-
31
namespace GAIL.Graphics;
42

53
/// <summary>

GAIL/Graphics/Renderer/IRenderer.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,12 @@ namespace GAIL.Graphics.Renderer;
77
/// <summary>
88
/// Represents a class that can render stuff.
99
/// </summary>
10-
public interface IRenderer<TLayer> : IDisposable, IRendererSettings<TLayer> where TLayer : ILayerSettings {
10+
public interface IRenderer : IDisposable, IRendererSettings {
1111
public void MoveLayer(int layerIndex, int newIndex);
1212
public void RemoveLayerAt(int index);
1313
public bool TryGetLayer(int index, [NotNullWhen(true)] out IBackendLayer? layer);
14-
public IRasterizationLayer? AddRasterizationLayer(RasterizationLayerSettings settings);
15-
public IRasterizationLayer? InsertRasterizationLayer(int index, RasterizationLayerSettings settings);
14+
public IRasterizationLayer? AddRasterizationLayer(in RasterizationLayerSettings settings);
15+
public IRasterizationLayer? InsertRasterizationLayer(int index, in RasterizationLayerSettings settings);
1616

1717
/// <summary>
1818
/// Renders the current frame.

GAIL/Graphics/Renderer/Layer/IBackendLayer.cs

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
1+
using System.Diagnostics.CodeAnalysis;
2+
13
namespace GAIL.Graphics.Renderer.Layer;
24

35
/// <summary>
46
/// Represents an abstraction for a back-end layer.
57
/// </summary>
6-
public interface IBackendLayer : IDisposable {
8+
public interface IBackendLayer : IDisposable, ILayerSettings {
79
// /// <summary>
810
// /// Renders the back-end layer.
911
// /// </summary>
@@ -13,4 +15,10 @@ public interface IBackendLayer : IDisposable {
1315
/// Whether the renderer should re-record the command buffer.
1416
/// </summary>
1517
public bool ShouldRecord { get; }
18+
19+
public void MoveObject(int layerIndex, int newIndex);
20+
public void RemoveObjectAt(int index);
21+
public bool TryGetObject(int index, [NotNullWhen(true)] out Object? layer);
22+
public void AddObject(Object obj);
23+
public void InsertObject(int index, Object obj);
1624
}

GAIL/Graphics/Renderer/Vulkan/Layer/LayerDescription.cs renamed to GAIL/Graphics/Renderer/Layer/LayerDescription.cs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,9 @@
11
using Silk.NET.Vulkan;
22

3-
namespace GAIL.Graphics.Renderer.Vulkan.Layer;
3+
namespace GAIL.Graphics.Renderer;
44

5-
// NOTE: Struct because of size.
65
public struct LayerDescription {
7-
public static LayerDescription[] From(IVulkanLayer[] layers) {
6+
public static LayerDescription[] From() {
87
return [.. layers.Select((l) => new LayerDescription() { type = l.Pipeline.Type })];
98
}
109
public PipelineBindPoint type;

GAIL/Graphics/Renderer/Layer/LayerSettings.cs

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ public enum FillMode {
2525
/// <summary>
2626
/// Specifies the type of face culling.
2727
/// </summary>
28+
[Flags]
2829
public enum CullMode {
2930
/// <summary>
3031
/// Culls the back face (won't render the back face).
@@ -65,7 +66,7 @@ public enum FrontFaceMode {
6566
/// </summary>
6667
public enum MSAA {
6768
/// <summary>
68-
/// No MSAA (off).
69+
/// No MSAA (1).
6970
/// </summary>
7071
MSAAx1 = SampleCountFlags.Count1Bit,
7172
/// <summary>
@@ -106,10 +107,6 @@ public interface ILayerSettings {
106107
/// If the renderer should render. Defaults to true.
107108
/// </summary>
108109
public bool ShouldRender { get; set; }
109-
/// <summary>
110-
/// The shader stages to use for this layer.
111-
/// </summary>
112-
public List<Object> RenderList { get; set; }
113110
}
114111

115112
/// <summary>
@@ -140,27 +137,27 @@ public class RasterizationLayerSettings : IRasterizationLayerSettings {
140137
/// <summary>
141138
/// If the renderer should render. Defaults to true.
142139
/// </summary>
143-
public bool ShouldRender = true;
140+
public bool ShouldRender { get; set; } = true;
144141
/// <summary>
145142
/// What part of the triangle to render. Defaults to <see cref="FillMode.Face"/>.
146143
/// </summary>
147-
public FillMode FillMode = FillMode.Face;
144+
public FillMode FillMode { get; set; } = FillMode.Face;
148145
/// <summary>
149146
/// How the front face is determined. Defaults to <see cref="FrontFaceMode.Clockwise"/>.
150147
/// </summary>
151-
public FrontFaceMode FrontFaceMode = FrontFaceMode.Clockwise;
148+
public FrontFaceMode FrontFaceMode { get; set; } = FrontFaceMode.Clockwise;
152149
/// <summary>
153150
/// The type of face culling. Defaults to <see cref="CullMode.BackFace"/>.
154151
/// </summary>
155-
public CullMode CullMode = CullMode.BackFace;
152+
public CullMode CullMode { get; set; } = CullMode.BackFace;
156153
/// <summary>
157154
/// The shader stages to use for this layer.
158155
/// </summary>
159-
public required IShader Shaders;
156+
public required IShader Shader { get; set; }
160157
/// <summary>
161158
/// The shader stages to use for this layer.
162159
/// </summary>
163-
public required List<Object> RenderList;
160+
public required List<Object> RenderList { get; set; }
164161

165162
/// <summary>
166163
/// Creates new values of the rasterization layer settings.

GAIL/Graphics/Renderer/RendererSettings.cs

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ namespace GAIL.Graphics.Renderer;
66
/// <summary>
77
/// The settings of the current renderer.
88
/// </summary>
9-
public interface IRendererSettings<TLayer> where TLayer : I {
9+
public interface IRendererSettings {
1010
/// <summary>
1111
/// If the renderer should render. Defaults to true.
1212
/// </summary>
@@ -23,20 +23,21 @@ public interface IRendererSettings<TLayer> where TLayer : I {
2323
/// </summary>
2424
public uint MaxFramesInFlight { get; set; }
2525
/// <summary>
26-
/// The layers used by the renderer. Default is empty.
26+
/// The settings of the layers used by the renderer. Default is empty.
2727
/// </summary>
28-
public TLayer[] LayerSettings { get; set; }
28+
public ILayerSettings[] LayerSettings { get; set; }
2929
}
3030

3131
/// <summary>
3232
/// The values of the settings for a renderer.
3333
/// </summary>
34-
public class RendererSettings<TLayer> : IRendererSettings<TLayer> where TLayer : IBackendLayer {
34+
public class RendererSettings : IRendererSettings {
3535
/// <inheritdoc/>
3636
public bool ShouldRender { get; set; } = true;
3737
/// <inheritdoc/>
3838
public Color ClearValue { get; set; } = new(0, 0, 0, 0);
3939
/// <inheritdoc/>
4040
public uint MaxFramesInFlight { get; set; } = 2;
4141
/// <inheritdoc/>
42-
public TLayer[] Layers { get; set; } = [];}
42+
public ILayerSettings[] LayerSettings { get; set; } = [];
43+
}

GAIL/Graphics/Renderer/Vulkan/Layer/IVulkanLayer.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ public interface IVulkanLayer : IBackendLayer {
1919
/// <summary>
2020
/// The vulkan pipeline utility, for custom usage.
2121
/// </summary>
22-
public Pipeline Pipeline { get; internal set; }
22+
public Pipeline Pipeline { get; }
2323
/// <summary>
2424
/// Updates the index of the layer in the renderer.
2525
/// </summary>

GAIL/Graphics/Renderer/Vulkan/Layer/VulkanRasterizationLayer.cs

Lines changed: 44 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -5,58 +5,6 @@
55

66
namespace GAIL.Graphics.Renderer.Vulkan.Layer;
77

8-
/// <summary>
9-
/// Vulkan implementation of the rasterization layer settings.
10-
/// </summary>
11-
public class VulkanRasterizationLayerSettings : RasterizationLayerSettings<VulkanRasterizationLayer> {
12-
/// <summary>
13-
/// Creates new a new Vulkan implementation of the rasterization layer settings.
14-
/// </summary>
15-
/// <param name="layer">The vulkan implementation of the rasterization layer.</param>
16-
/// <param name="values">The initial values of these settings.</param>
17-
public VulkanRasterizationLayerSettings(VulkanRasterizationLayer layer, RasterizationLayerSettings values) : base(layer, values) {
18-
if (values.Shaders is not Shader shader) {
19-
throw new InvalidOperationException("The given shader is no Vulkan shader.");
20-
}
21-
this.shader = shader;
22-
}
23-
24-
/// <inheritdoc/>
25-
public override CullMode CullMode { get => base.CullMode; set {
26-
layer.Pipeline.Dispose();
27-
values.CullMode = value;
28-
layer.Pipeline = new Pipeline(layer);
29-
} }
30-
/// <inheritdoc/>
31-
public override FillMode FillMode { get => base.FillMode; set {
32-
layer.Pipeline.Dispose();
33-
values.FillMode = value;
34-
layer.Pipeline = new Pipeline(layer);
35-
} }
36-
/// <inheritdoc/>
37-
public override FrontFaceMode FrontFaceMode { get => base.FrontFaceMode; set {
38-
layer.Pipeline.Dispose();
39-
values.FrontFaceMode = value;
40-
layer.Pipeline = new Pipeline(layer);
41-
} }
42-
/// <inheritdoc/>
43-
public override IShader Shader { get => shader; set {
44-
layer.Pipeline.Dispose();
45-
if (value is not Shader shader) {
46-
throw new InvalidOperationException("The given shader is no Vulkan shader.");
47-
}
48-
this.shader = shader;
49-
layer.Pipeline = new Pipeline(layer);
50-
} }
51-
internal Shader shader;
52-
/// <inheritdoc/>
53-
public override List<Object> RenderList { get => base.RenderList; set {
54-
layer.UnloadObjects(); // TODO: FIXME: This is inefficient when a new object is added.
55-
values.RenderList = value; // NOTE: For the above: maybe use INotifyCollectionChanged.
56-
layer.LoadObjects();
57-
} }
58-
}
59-
608
/// <summary>
619
/// The Vulkan implementation of the back-end rasterization layer.
6210
/// </summary>
@@ -65,8 +13,8 @@ internal VulkanRasterizationLayer(Renderer renderer, uint index, RasterizationLa
6513
Logger = LoggerFactory.CreateSublogger(renderer.Logger, "Layer "+index, "layer"+index);
6614
Renderer = renderer;
6715
Index = index;
68-
this.settings = new(this, settings);
69-
Logger.LogDebug("Creating a Vulkan rasterization back-end layer.");
16+
this.settings = settings;
17+
Logger.LogDebug("Creating a Vulkan rasterization back-end.");
7018
try {
7119
Pipeline = new Pipeline(this);
7220

@@ -86,23 +34,54 @@ internal VulkanRasterizationLayer(Renderer renderer, uint index, RasterizationLa
8634
public Pipeline Pipeline { get; internal set; }
8735

8836
/// <summary>
89-
/// The renderer corresponding to this back-end layer.
37+
/// The renderer corresponding to this back-end
9038
/// </summary>
9139
public readonly Renderer Renderer;
9240
/// <summary>
93-
/// The logger of this back-end layer.
41+
/// The logger of this back-end
9442
/// </summary>
9543
public readonly Logger Logger;
96-
internal readonly VulkanRasterizationLayerSettings settings;
44+
45+
#region Settings
46+
47+
/// <inheritdoc/>
48+
public CullMode CullMode { get => settings.CullMode; set {
49+
Pipeline.Dispose();
50+
settings.CullMode = value;
51+
Pipeline = new Pipeline(this);
52+
} }
53+
/// <inheritdoc/>
54+
public FillMode FillMode { get => settings.FillMode; set {
55+
Pipeline.Dispose();
56+
settings.FillMode = value;
57+
Pipeline = new Pipeline(this);
58+
} }
9759
/// <inheritdoc/>
98-
public IRasterizationLayerSettings Settings => settings;
99-
internal uint Index;
100-
Pipeline IVulkanLayer.Pipeline { get => Pipeline; set => Pipeline = value; }
101-
uint IVulkanLayer.Index { set {
60+
public FrontFaceMode FrontFaceMode { get => settings.FrontFaceMode; set {
10261
Pipeline.Dispose();
103-
Index = value;
104-
Pipeline = new(this);
62+
settings.FrontFaceMode = value;
63+
Pipeline = new Pipeline(this);
10564
} }
65+
/// <inheritdoc/>
66+
public IShader Shader { get => settings.Shader; set {
67+
Pipeline.Dispose();
68+
if (value is not Shader shader) {
69+
throw new InvalidOperationException("The given shader is no Vulkan shader.");
70+
}
71+
settings.Shader = shader;
72+
Pipeline = new Pipeline(this);
73+
} }
74+
public bool ShouldRender { get => settings.ShouldRender; set {
75+
if (settings.ShouldRender != value) {
76+
settings.ShouldRender = value;
77+
shouldRecord = true;
78+
}
79+
} }
80+
private readonly RasterizationLayerSettings settings;
81+
82+
#endregion Settings
83+
84+
internal uint Index { get; set; }
10685

10786
private bool shouldRecord;
10887
public bool ShouldRecord => shouldRecord;
@@ -147,8 +126,8 @@ private static void Render(Commands commands, RenderSet renderSet) {
147126
commands.Draw(vertexCount:3); // TODO: Temporary...
148127
}
149128

150-
void IVulkanLayer.Recreate() {
151-
Logger.LogDebug("Recreating a Vulkan rasterization back-end layer.");
129+
void IVulkanRecreate() {
130+
Logger.LogDebug("Recreating a Vulkan rasterization back-end ");
152131
try {
153132
Pipeline = new Pipeline(this);
154133

0 commit comments

Comments
 (0)