From ff16f6a895b630a7d1b4d3e189318b04cf1ff378 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20L=C3=BCbe=C3=9F?= Date: Wed, 25 Nov 2020 20:04:51 +0100 Subject: [PATCH] Added RasterizerState --- GlitchyEngine/src/Application.bf | 20 ++---- .../DX11/Renderer/Dx11GraphicsContext.bf | 5 ++ .../DX11/Renderer/Dx11RasterizerState.bf | 63 +++++++++++++++++ GlitchyEngine/src/Renderer/GraphicsContext.bf | 15 +++++ GlitchyEngine/src/Renderer/RasterizerState.bf | 67 +++++++++++++++++++ 5 files changed, 155 insertions(+), 15 deletions(-) create mode 100644 GlitchyEngine/src/Platform/DX11/Renderer/Dx11RasterizerState.bf create mode 100644 GlitchyEngine/src/Renderer/RasterizerState.bf diff --git a/GlitchyEngine/src/Application.bf b/GlitchyEngine/src/Application.bf index ca173b2..ac7b996 100644 --- a/GlitchyEngine/src/Application.bf +++ b/GlitchyEngine/src/Application.bf @@ -72,12 +72,12 @@ namespace GlitchyEngine VertexBuffer _vertexBuffer ~ delete _; IndexBuffer _indexBuffer ~ delete _; + RasterizerState _rasterizerState ~ delete _; + ID3D11VertexShader* _vertexShader ~ _?.Release(); ID3D11PixelShader* _pixelShader ~ _?.Release(); ID3D11InputLayout* _inputLayout ~ _?.Release(); - ID3D11RasterizerState* _rasterizerState ~ _?.Release(); - private Vector3 CircleCoord(float angle) { return .(Math.Cos(angle), Math.Sin(angle), 0); @@ -179,17 +179,8 @@ namespace GlitchyEngine } // Create rasterizer state - RasterizerStateDescription rsDesc = .(); - rsDesc.CullMode = .Back; - rsDesc.FillMode = .Solid; - rsDesc.FrontCounterClockwise = true; - - result = Dx11Cheater.Device.CreateRasterizerState(ref rsDesc, &_rasterizerState); - if(result.Failed) - { - Debug.Write("ERROR: Failed to create Rasterizer State: {}", result); - Runtime.FatalError("Failed to create Rasterizer State"); - } + GlitchyEngine.Renderer.RasterizerStateDescription rsDesc = .(.Solid, .Back, true); + _rasterizerState = new RasterizerState(Window.Context, rsDesc); } public void OnEvent(Event e) @@ -233,8 +224,7 @@ namespace GlitchyEngine _immediateContext.VertexShader.SetShader(_vertexShader, null, 0); - _immediateContext.Rasterizer.SetState(_rasterizerState); - + Window.Context.SetRasterizerState(_rasterizerState); _immediateContext.Rasterizer.SetViewports(1, &Dx11Cheater.BackbufferViewport); diff --git a/GlitchyEngine/src/Platform/DX11/Renderer/Dx11GraphicsContext.bf b/GlitchyEngine/src/Platform/DX11/Renderer/Dx11GraphicsContext.bf index b92cc5a..c317c09 100644 --- a/GlitchyEngine/src/Platform/DX11/Renderer/Dx11GraphicsContext.bf +++ b/GlitchyEngine/src/Platform/DX11/Renderer/Dx11GraphicsContext.bf @@ -155,5 +155,10 @@ namespace GlitchyEngine.Renderer { nativeContext.InputAssembler.SetIndexBuffer(buffer.nativeBuffer, indexFormat == .Index32Bit ? .R32_UInt : .R16_UInt, byteOffset); } + + protected override void SetRasterizerStateImpl() + { + nativeContext.Rasterizer.SetState(_currentRasterizerState.nativeRasterizerState); + } } } diff --git a/GlitchyEngine/src/Platform/DX11/Renderer/Dx11RasterizerState.bf b/GlitchyEngine/src/Platform/DX11/Renderer/Dx11RasterizerState.bf new file mode 100644 index 0000000..12722a4 --- /dev/null +++ b/GlitchyEngine/src/Platform/DX11/Renderer/Dx11RasterizerState.bf @@ -0,0 +1,63 @@ +using DirectX.D3D11; + +using internal GlitchyEngine.Renderer; + +namespace GlitchyEngine.Renderer +{ + extension FillMode + { + public static explicit operator DirectX.D3D11.FillMode(Self fm) => fm == .Solid ? .Solid : .Wireframe; + } + + extension CullMode + { + public static explicit operator DirectX.D3D11.CullMode(Self cm) + { + if(cm == .None) + return .None; + + if(cm == .Front) + return .Front; + + return .Back; + } + } + + extension RasterizerStateDescription + { + public static explicit operator DirectX.D3D11.RasterizerStateDescription(Self description) + { + DirectX.D3D11.RasterizerStateDescription result = .(); + result.FillMode = (.)description.FillMode; + result.CullMode = (.)description.CullMode; + result.FrontCounterClockwise = description.FrontCounterClockwise; + result.DepthBias = description.DepthBias; + result.DepthBiasClamp = description.DepthBiasClamp; + result.SlopeScaledDepthBias = description.SlopeScaledDepthBias; + result.DepthClipEnable = description.DepthClipEnabled; + result.ScissorEnable = description.ScissorEnabled; + result.MultisampleEnable = description.MultisampleEnabled; + result.AntialiasedLineEnable = description.AntialiasedLineEnabled; + + return result; + } + } + + extension RasterizerState + { + internal DirectX.D3D11.RasterizerStateDescription nativeDescription; + internal ID3D11RasterizerState* nativeRasterizerState ~ _?.Release(); + + public override this(GraphicsContext context, GlitchyEngine.Renderer.RasterizerStateDescription description) : this(context) + { + _description = description; + nativeDescription = (.)_description; + + var result = context.nativeDevice.CreateRasterizerState(ref nativeDescription, &nativeRasterizerState); + if(result.Failed) + { + Log.EngineLogger.Error("Failed to create rasterizer state. Message({}): {}", (int)result, result); + } + } + } +} diff --git a/GlitchyEngine/src/Renderer/GraphicsContext.bf b/GlitchyEngine/src/Renderer/GraphicsContext.bf index 3edbcb5..7acb38a 100644 --- a/GlitchyEngine/src/Renderer/GraphicsContext.bf +++ b/GlitchyEngine/src/Renderer/GraphicsContext.bf @@ -7,6 +7,8 @@ namespace GlitchyEngine.Renderer //public abstract class GraphicsContext public class GraphicsContext { + private RasterizerState _currentRasterizerState; + //public abstract SwapChain SwapChain {get;} public extern SwapChain SwapChain {get;} @@ -76,5 +78,18 @@ namespace GlitchyEngine.Renderer } public extern void SetIndexBuffer(Buffer buffer, IndexFormat indexFormat = .Index16Bit, uint32 byteOffset = 0); + + public void SetRasterizerState(RasterizerState rasterizerState) + { + _currentRasterizerState = rasterizerState; + SetRasterizerStateImpl(); + } + + protected extern void SetRasterizerStateImpl(); + + public RasterizerState GetRasterizerState() + { + return _currentRasterizerState; + } } } diff --git a/GlitchyEngine/src/Renderer/RasterizerState.bf b/GlitchyEngine/src/Renderer/RasterizerState.bf new file mode 100644 index 0000000..d554683 --- /dev/null +++ b/GlitchyEngine/src/Renderer/RasterizerState.bf @@ -0,0 +1,67 @@ +namespace GlitchyEngine.Renderer +{ + public enum FillMode + { + Wireframe, + Solid + } + + public enum CullMode + { + None, + Front, + Back + } + + public struct RasterizerStateDescription + { + public FillMode FillMode; + public CullMode CullMode; + public bool FrontCounterClockwise; + public int32 DepthBias; + public float DepthBiasClamp; + public float SlopeScaledDepthBias; + public bool DepthClipEnabled; + public bool ScissorEnabled; + public bool MultisampleEnabled; + public bool AntialiasedLineEnabled; + + public this() => this = default; + + /** + Initializes the RasterizerStateDescription with the specified values + */ + public this(FillMode fillMode, CullMode cullMode = .Back, bool frontCounterClockwise = false, int32 depthBias = 0, float depthBiasClamp = 0.0f, + float slopeScaledDepthBias = 0.0f, bool depthClipEnabled = true, bool scissorEnabled = false, bool multisampleEnabled = false, bool antialiasedLineEnabled = false) + { + FillMode = fillMode; + CullMode = cullMode; + FrontCounterClockwise = frontCounterClockwise; + DepthBias = depthBias; + DepthBiasClamp = depthBiasClamp; + SlopeScaledDepthBias = slopeScaledDepthBias; + DepthClipEnabled = depthClipEnabled; + ScissorEnabled = scissorEnabled; + MultisampleEnabled = multisampleEnabled; + AntialiasedLineEnabled = antialiasedLineEnabled; + } + + public static readonly RasterizerStateDescription Default = .(.Solid, .Back, false, 0, 0f, 0f, true, false, false, false); + } + + public class RasterizerState + { + internal GraphicsContext _context; + private RasterizerStateDescription _description; + + public GraphicsContext Context => _context; + public RasterizerStateDescription Description => _description; + + protected this(GraphicsContext context) + { + _context = context; + } + + public extern this(GraphicsContext context, RasterizerStateDescription description); + } +}