55
66namespace 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