diff --git a/framework/CMakeLists.txt b/framework/CMakeLists.txt index aa5304e..e290be2 100644 --- a/framework/CMakeLists.txt +++ b/framework/CMakeLists.txt @@ -3,7 +3,7 @@ # # Add source to this project's executable. -add_executable (xna WIN32 "xna.cpp" "xna.h" "platform/window-dx.cpp" "platform/device-dx.cpp" "platform/adapter-dx.cpp" "platform/swapchain-dx.cpp" "platform/rendertarget-dx.cpp" "platform/texture-dx.cpp" "platform/blendstate-dx.cpp" "platform/game-dx.cpp" "platform/clock-dx.cpp" "csharp/stream.cpp" "platform/gdevicemanager-dx.cpp" "platform/vertexinput-dx.cpp" "platform/shader-dx.cpp") +add_executable (xna WIN32 "xna.cpp" "xna.h" "platform/window-dx.cpp" "platform/device-dx.cpp" "platform/adapter-dx.cpp" "platform/swapchain-dx.cpp" "platform/rendertarget-dx.cpp" "platform/texture-dx.cpp" "platform/blendstate-dx.cpp" "platform/game-dx.cpp" "platform/clock-dx.cpp" "csharp/stream.cpp" "platform/gdevicemanager-dx.cpp" "platform/vertexinput-dx.cpp" "platform/shader-dx.cpp" "platform/rasterizer-dx.cpp") if (CMAKE_VERSION VERSION_GREATER 3.12) set_property(TARGET xna PROPERTY CXX_STANDARD 20) diff --git a/framework/enums.hpp b/framework/enums.hpp index e7c22e3..462c4ca 100644 --- a/framework/enums.hpp +++ b/framework/enums.hpp @@ -20,15 +20,7 @@ namespace xna { InverseSource1Color, Source1Alpha, InverseSource1Alpha - }; - - enum class ColorWriteChannels { - Red, - Green, - Blue, - Alpha, - All - }; + }; enum class BlendFunction { Add = 0, @@ -40,6 +32,20 @@ namespace xna { using BlendOperation = BlendFunction; + enum class ColorWriteChannels { + Red, + Green, + Blue, + Alpha, + All + }; + + enum class CullMode { + None, + CullClockwiseFace, + CullCounterClockwiseFace, + }; + enum class DepthFormat { None, Depth16, @@ -54,6 +60,12 @@ namespace xna { Portrait = 4, }; + enum class FillMode + { + Solid, + WireFrame, + }; + enum class GraphicsProfile { Reach, HiDef diff --git a/framework/forward.hpp b/framework/forward.hpp index 2372f5a..d9a2353 100644 --- a/framework/forward.hpp +++ b/framework/forward.hpp @@ -99,6 +99,8 @@ namespace xna { using PTexture = std::shared_ptr; class Texture2D; using PTexture2D = std::shared_ptr; + class RasterizerState; + using PRasterizerState = std::shared_ptr; class Shader; using PShader = std::shared_ptr; class VertexInputLayout; diff --git a/framework/graphics/rasterizer.hpp b/framework/graphics/rasterizer.hpp new file mode 100644 index 0000000..ef099dc --- /dev/null +++ b/framework/graphics/rasterizer.hpp @@ -0,0 +1,18 @@ +#ifndef XNA_GRAPHICS_RASTERIZER_HPP +#define XNA_GRAPHICS_RASTERIZER_HPP + +#include "../default.hpp" + +namespace xna { + class IRasterizerState { + public: + virtual ~IRasterizerState() {} + virtual bool Initialize(GraphicsDevice& device, xna_error_nullarg) = 0; + virtual xna::CullMode CullMode() const = 0; + virtual void CullMode(xna::CullMode value) = 0; + virtual xna::FillMode FillMode() const = 0; + virtual void FillMode(xna::FillMode value) = 0; + }; +} + +#endif \ No newline at end of file diff --git a/framework/platform/rasterizer-dx.cpp b/framework/platform/rasterizer-dx.cpp new file mode 100644 index 0000000..dda98c1 --- /dev/null +++ b/framework/platform/rasterizer-dx.cpp @@ -0,0 +1,16 @@ +#include "rasterizer-dx.hpp" +#include "device-dx.hpp" + +namespace xna { + bool RasterizerState::Initialize(GraphicsDevice& device, xna_error_ptr_arg) + { + const auto hr = device._device->CreateRasterizerState(&_description, &_rasterizerState); + + if (FAILED(hr)) { + xna_error_apply(err, XnaErrorCode::INVALID_OPERATION); + return false; + } + + return true; + } +} diff --git a/framework/platform/rasterizer-dx.hpp b/framework/platform/rasterizer-dx.hpp new file mode 100644 index 0000000..b5ca04e --- /dev/null +++ b/framework/platform/rasterizer-dx.hpp @@ -0,0 +1,109 @@ +#ifndef XNA_PLATFORM_RASTERIZER_DX_HPP +#define XNA_PLATFORM_RASTERIZER_DX_HPP + +#include "../graphics/rasterizer.hpp" +#include "dxheaders.hpp" + +namespace xna { + class RasterizerState : public IRasterizerState { + public: + RasterizerState(){} + + virtual ~RasterizerState() override { + if (_rasterizerState) { + _rasterizerState->Release(); + _rasterizerState = nullptr; + } + } + + virtual bool Initialize(GraphicsDevice& device, xna_error_nullarg) override; + + virtual constexpr xna::CullMode CullMode() const override { + switch (_description.CullMode) + { + case D3D11_CULL_NONE: + return xna::CullMode::None; + case D3D11_CULL_FRONT: + return xna::CullMode::CullClockwiseFace; + case D3D11_CULL_BACK: + return xna::CullMode::CullCounterClockwiseFace; + default: + return xna::CullMode::None; + } + } + + virtual constexpr void CullMode(xna::CullMode value) override { + switch (value) + { + case xna::CullMode::None: + _description.CullMode = D3D11_CULL_NONE; + break; + case xna::CullMode::CullClockwiseFace: + _description.CullMode = D3D11_CULL_FRONT; + break; + case xna::CullMode::CullCounterClockwiseFace: + _description.CullMode = D3D11_CULL_BACK; + break; + default: + _description.CullMode = D3D11_CULL_NONE; + break; + } + } + + virtual constexpr xna::FillMode FillMode() const override { + switch (_description.FillMode) { + case D3D11_FILL_SOLID: + return xna::FillMode::Solid; + case D3D11_FILL_WIREFRAME: + return xna::FillMode::WireFrame; + default: + return xna::FillMode::Solid; + } + } + + virtual constexpr void FillMode(xna::FillMode value) override { + switch (value) + { + case xna::FillMode::Solid: + _description.FillMode = D3D11_FILL_SOLID; + break; + case xna::FillMode::WireFrame: + _description.FillMode = D3D11_FILL_WIREFRAME; + break; + default: + _description.FillMode = D3D11_FILL_SOLID; + break; + } + } + + static PRasterizerState CullNone() { + auto raster = New(); + raster->_description.FillMode = D3D11_FILL_SOLID; + raster->_description.CullMode = D3D11_CULL_MODE::D3D11_CULL_NONE; + raster->_description.DepthClipEnable = true; + return raster; + } + + static PRasterizerState CullClockwise() { + auto raster = New(); + raster->_description.FillMode = D3D11_FILL_SOLID; + raster->_description.CullMode = D3D11_CULL_MODE::D3D11_CULL_FRONT; + raster->_description.DepthClipEnable = true; + return raster; + } + + static PRasterizerState CullCounterClockwise() { + auto raster = New(); + raster->_description.FillMode = D3D11_FILL_SOLID; + raster->_description.CullMode = D3D11_CULL_MODE::D3D11_CULL_BACK; + raster->_description.DepthClipEnable = true; + return raster; + } + + public: + ID3D11RasterizerState* _rasterizerState = nullptr; + D3D11_RASTERIZER_DESC _description{}; + }; +} + +#endif \ No newline at end of file diff --git a/framework/platform/vertexinput-dx.cpp b/framework/platform/vertexinput-dx.cpp index 7de6220..b1f7e0f 100644 --- a/framework/platform/vertexinput-dx.cpp +++ b/framework/platform/vertexinput-dx.cpp @@ -13,7 +13,7 @@ namespace xna { const auto hr = _device->_device->CreateInputLayout( _description.data(), - _description.size(), + static_cast(_description.size()), blob->GetBufferPointer(), blob->GetBufferSize(), &_inputLayout);