From 0d716d1cd6ffc215d6a41e3415a77013a8673a9d Mon Sep 17 00:00:00 2001 From: Danilo Date: Mon, 20 May 2024 10:29:20 -0300 Subject: [PATCH] Corrige DepthStencil --- framework/platform/depthstencilstate-dx.cpp | 203 ++++++++++++++++++-- framework/platform/sprite-dx.cpp | 4 +- inc/graphics/depthstencilstate.hpp | 79 ++++---- inc/platform-dx/depthstencilstate-dx.hpp | 193 ------------------- inc/platform-dx/implementations.hpp | 13 ++ inc/platform-dx/xna-dx.hpp | 1 - 6 files changed, 248 insertions(+), 245 deletions(-) delete mode 100644 inc/platform-dx/depthstencilstate-dx.hpp diff --git a/framework/platform/depthstencilstate-dx.cpp b/framework/platform/depthstencilstate-dx.cpp index 92c2d7a..8b32bf7 100644 --- a/framework/platform/depthstencilstate-dx.cpp +++ b/framework/platform/depthstencilstate-dx.cpp @@ -1,7 +1,46 @@ -#include "platform-dx/depthstencilstate-dx.hpp" #include "platform-dx/device-dx.hpp" +#include "graphics/depthstencilstate.hpp" +#include "platform-dx/dxheaders.hpp" +#include "platform-dx/implementations.hpp" namespace xna { + static D3D11_DEPTH_STENCIL_DESC defaultDesc() { + D3D11_DEPTH_STENCIL_DESC _description{}; + _description.DepthEnable = true; + _description.StencilEnable = true; + _description.DepthFunc = D3D11_COMPARISON_LESS_EQUAL; + + _description.FrontFace.StencilFunc = D3D11_COMPARISON_ALWAYS; + _description.FrontFace.StencilPassOp = D3D11_STENCIL_OP_KEEP; + _description.FrontFace.StencilFailOp = D3D11_STENCIL_OP_KEEP; + _description.FrontFace.StencilDepthFailOp = D3D11_STENCIL_OP_KEEP; + + _description.BackFace.StencilFunc = D3D11_COMPARISON_ALWAYS; + _description.BackFace.StencilPassOp = D3D11_STENCIL_OP_KEEP; + _description.BackFace.StencilFailOp = D3D11_STENCIL_OP_KEEP; + _description.BackFace.StencilDepthFailOp = D3D11_STENCIL_OP_KEEP; + + _description.StencilReadMask = 0; + _description.StencilWriteMask = 0; + _description.DepthWriteMask = D3D11_DEPTH_WRITE_MASK_ZERO; + + return _description; + } + + DepthStencilState::DepthStencilState() : GraphicsResource(nullptr) { + impl = uNew(); + impl->dxDescription = defaultDesc(); + } + + DepthStencilState::DepthStencilState(sptr const& device) : GraphicsResource(device) { + impl = uNew(); + impl->dxDescription = defaultDesc(); + } + + DepthStencilState::~DepthStencilState() { + impl = nullptr; + } + bool DepthStencilState::Initialize(xna_error_ptr_arg) { if (!m_device || !m_device->_device) { @@ -9,12 +48,14 @@ namespace xna { return false; } - if (dxDepthStencil) { - dxDepthStencil->Release(); - dxDepthStencil = nullptr; + if (impl->dxDepthStencil) { + impl->dxDepthStencil->Release(); + impl->dxDepthStencil = nullptr; } - const auto hr = m_device->_device->CreateDepthStencilState(&dxDescription, &dxDepthStencil); + const auto hr = m_device->_device->CreateDepthStencilState( + &impl->dxDescription, + &impl->dxDepthStencil); if (FAILED(hr)) { xna_error_apply(err, XnaErrorCode::FAILED_OPERATION); @@ -31,37 +72,167 @@ namespace xna { return false; } - if (!dxDepthStencil) { + if (!impl->dxDepthStencil) { xna_error_apply(err, XnaErrorCode::UNINTIALIZED_RESOURCE); return false; } - m_device->_context->OMSetDepthStencilState(dxDepthStencil, 0); + m_device->_context->OMSetDepthStencilState(impl->dxDepthStencil, 0); return true; } uptr DepthStencilState::None() { - auto stencil = std::unique_ptr(new DepthStencilState()); - stencil->dxDescription.DepthEnable = false; - stencil->dxDescription.DepthWriteMask = D3D11_DEPTH_WRITE_MASK_ZERO; + auto stencil = uNew(); + stencil->impl->dxDescription.DepthEnable = false; + stencil->impl->dxDescription.DepthWriteMask = D3D11_DEPTH_WRITE_MASK_ZERO; return stencil; } uptr DepthStencilState::Default() { - auto stencil = std::unique_ptr(new DepthStencilState()); - stencil->dxDescription.DepthEnable = true; - stencil->dxDescription.DepthWriteMask = D3D11_DEPTH_WRITE_MASK_ALL; + auto stencil = uNew(); + stencil->impl->dxDescription.DepthEnable = true; + stencil->impl->dxDescription.DepthWriteMask = D3D11_DEPTH_WRITE_MASK_ALL; return stencil; } uptr DepthStencilState::DepthRead() { - auto stencil = std::unique_ptr(new DepthStencilState()); - stencil->dxDescription.DepthEnable = true; - stencil->dxDescription.DepthWriteMask = D3D11_DEPTH_WRITE_MASK_ZERO; + auto stencil = uNew(); + stencil->impl->dxDescription.DepthEnable = true; + stencil->impl->dxDescription.DepthWriteMask = D3D11_DEPTH_WRITE_MASK_ZERO; return stencil; } + + void DepthStencilState::DepthEnabled(bool value) { + impl->dxDescription.DepthEnable = value; + } + + void DepthStencilState::DepthWriteEnabled(bool value) { + impl->dxDescription.DepthWriteMask = static_cast(value); + } + + void DepthStencilState::DepthCompareFunction(ComparisonFunction value) { + const auto _value = static_cast(value) + 1; + impl->dxDescription.DepthFunc = static_cast(_value); + } + + void DepthStencilState::StencilEnabled(bool value) { + impl->dxDescription.StencilEnable = value; + } + + void DepthStencilState::StencilReadMask(int value) { + impl->dxDescription.StencilReadMask = static_cast(value); + } + + void DepthStencilState::StencilWriteMask(Int value) { + impl->dxDescription.StencilWriteMask = static_cast(value); + } + + void DepthStencilState::StencilFrontFacePass(StencilOperation value) { + const auto _value = static_cast(value) + 1; + impl->dxDescription.FrontFace.StencilPassOp = static_cast(_value); + } + + void DepthStencilState::StencilFrontFaceFail(StencilOperation value) { + const auto _value = static_cast(value) + 1; + impl->dxDescription.FrontFace.StencilFailOp = static_cast(_value); + } + + void DepthStencilState::StencilFrontFaceDepthFail(StencilOperation value) { + const auto _value = static_cast(value) + 1; + impl->dxDescription.FrontFace.StencilDepthFailOp = static_cast(_value); + } + + void DepthStencilState::StencilFrontFaceCompare(ComparisonFunction value) { + const auto _value = static_cast(value) + 1; + impl->dxDescription.FrontFace.StencilFunc = static_cast(_value); + } + + void DepthStencilState::StencilBackFacePass(StencilOperation value) { + const auto _value = static_cast(value) + 1; + impl->dxDescription.BackFace.StencilPassOp = static_cast(_value); + } + + void DepthStencilState::StencilBackFaceFail(StencilOperation value) { + const auto _value = static_cast(value) + 1; + impl->dxDescription.BackFace.StencilFailOp = static_cast(_value); + } + + void DepthStencilState::StencilBackFaceDepthFail(StencilOperation value) { + const auto _value = static_cast(value) + 1; + impl->dxDescription.BackFace.StencilDepthFailOp = static_cast(_value); + } + + void DepthStencilState::StencilBackFaceCompare(ComparisonFunction value) { + const auto _value = static_cast(value) + 1; + impl->dxDescription.BackFace.StencilFunc = static_cast(_value); + } + + bool DepthStencilState::DepthEnabled() const { + return impl->dxDescription.DepthEnable; + } + + bool DepthStencilState::DepthWriteEnabled() const { + return static_cast(impl->dxDescription.DepthWriteMask); + } + + ComparisonFunction DepthStencilState::DepthCompareFunction() const { + const auto _value = static_cast(impl->dxDescription.DepthFunc) - 1; + return static_cast(_value); + } + + bool DepthStencilState::StencilEnabled() const { + return impl->dxDescription.StencilEnable; + } + + Int DepthStencilState::StencilReadMask() const { + return static_cast(impl->dxDescription.StencilReadMask); + } + + Int DepthStencilState::StencilWriteMask() const { + return static_cast(impl->dxDescription.StencilWriteMask); + } + + StencilOperation DepthStencilState::StencilFrontFacePass() const { + const auto _value = static_cast(impl->dxDescription.FrontFace.StencilPassOp) - 1; + return static_cast(_value); + } + + StencilOperation DepthStencilState::StencilFrontFaceFail() const { + const auto _value = static_cast(impl->dxDescription.FrontFace.StencilFailOp) - 1; + return static_cast(_value); + } + + StencilOperation DepthStencilState::StencilFrontFaceDepthFail() const { + const auto _value = static_cast(impl->dxDescription.FrontFace.StencilDepthFailOp) - 1; + return static_cast(_value); + } + + ComparisonFunction DepthStencilState::StencilFrontFaceCompare() const { + const auto _value = static_cast(impl->dxDescription.FrontFace.StencilFunc) - 1; + return static_cast(_value); + } + + StencilOperation DepthStencilState::StencilBackFacePass() const { + const auto _value = static_cast(impl->dxDescription.BackFace.StencilPassOp) - 1; + return static_cast(_value); + } + + StencilOperation DepthStencilState::StencilBackFaceFail() const { + const auto _value = static_cast(impl->dxDescription.BackFace.StencilFailOp) - 1; + return static_cast(_value); + } + + StencilOperation DepthStencilState::StencilBackFaceDepthFail() const { + const auto _value = static_cast(impl->dxDescription.BackFace.StencilDepthFailOp) - 1; + return static_cast(_value); + } + + ComparisonFunction DepthStencilState::StencilBackFaceCompare() const { + const auto _value = static_cast(impl->dxDescription.BackFace.StencilFunc) - 1; + return static_cast(_value); + } } \ No newline at end of file diff --git a/framework/platform/sprite-dx.cpp b/framework/platform/sprite-dx.cpp index 836507d..d6ac299 100644 --- a/framework/platform/sprite-dx.cpp +++ b/framework/platform/sprite-dx.cpp @@ -1,6 +1,5 @@ #include "platform-dx/device-dx.hpp" #include "platform-dx/rasterizerstate-dx.hpp" -#include "platform-dx/depthstencilstate-dx.hpp" #include "platform-dx/samplerstate-dx.hpp" #include "platform-dx/texture-dx.hpp" #include "common/color.hpp" @@ -8,6 +7,7 @@ #include "graphics/sprite.hpp" #include "graphics/viewport.hpp" #include "graphics/blendstate.hpp" +#include "graphics/depthstencilstate.hpp" #include "platform-dx/implementations.hpp" using DxSpriteBatch = DirectX::SpriteBatch; @@ -80,7 +80,7 @@ namespace xna { sort, blendState ? blendState->impl->dxBlendState : nullptr, samplerState ? samplerState->_samplerState : nullptr, - depthStencil ? depthStencil->dxDepthStencil : nullptr, + depthStencil ? depthStencil->impl->dxDepthStencil : nullptr, rasterizerState ? rasterizerState->dxRasterizerState : nullptr, nullptr, matrix diff --git a/inc/graphics/depthstencilstate.hpp b/inc/graphics/depthstencilstate.hpp index b9c31ef..240ca0d 100644 --- a/inc/graphics/depthstencilstate.hpp +++ b/inc/graphics/depthstencilstate.hpp @@ -2,43 +2,56 @@ #define XNA_GRAPHICS_DEPTHSTENCILSTATE_HPP #include "../default.hpp" +#include "gresource.hpp" namespace xna { - class IDepthStencilState { + class DepthStencilState : public GraphicsResource { public: - virtual ~IDepthStencilState(){} - virtual bool Initialize(xna_error_nullarg) = 0; - virtual bool Apply(xna_error_ptr_arg) = 0; - - virtual void DepthEnabled(bool value) = 0; - virtual void DepthWriteEnabled(bool value) = 0; - virtual void DepthCompareFunction(ComparisonFunction value) = 0; - virtual void StencilEnabled(bool value) = 0; - virtual void StencilReadMask(int value) = 0; - virtual void StencilWriteMask(int value) = 0; - virtual void StencilFrontFacePass(StencilOperation value) = 0; - virtual void StencilFrontFaceFail(StencilOperation value) = 0; - virtual void StencilFrontFaceDepthFail(StencilOperation value) = 0; - virtual void StencilFrontFaceCompare(ComparisonFunction value) = 0; - virtual void StencilBackFacePass(StencilOperation value) = 0; - virtual void StencilBackFaceFail(StencilOperation value) = 0; - virtual void StencilBackFaceDepthFail(StencilOperation value) = 0; - virtual void StencilBackFaceCompare(ComparisonFunction value) = 0; - virtual bool DepthEnabled() = 0; - virtual bool DepthWriteEnabled() = 0; - virtual ComparisonFunction DepthCompareFunction() = 0; - virtual bool StencilEnabled() = 0; - virtual int StencilReadMask() = 0; - virtual int StencilWriteMask() = 0; - virtual StencilOperation StencilFrontFacePass() = 0; - virtual StencilOperation StencilFrontFaceFail() = 0; - virtual StencilOperation StencilFrontFaceDepthFail() = 0; - virtual ComparisonFunction StencilFrontFaceCompare() = 0; - virtual StencilOperation StencilBackFacePass() = 0; - virtual StencilOperation StencilBackFaceFail() = 0; - virtual StencilOperation StencilBackFaceDepthFail() = 0; - virtual ComparisonFunction StencilBackFaceCompare() = 0; + DepthStencilState(); + DepthStencilState(sptr const& device); + + ~DepthStencilState(); + bool Initialize(xna_error_nullarg); + bool Apply(xna_error_ptr_arg); + + void DepthEnabled(bool value); + void DepthWriteEnabled(bool value); + void DepthCompareFunction(ComparisonFunction value); + void StencilEnabled(bool value); + void StencilReadMask(Int value); + void StencilWriteMask(Int value); + void StencilFrontFacePass(StencilOperation value); + void StencilFrontFaceFail(StencilOperation value); + void StencilFrontFaceDepthFail(StencilOperation value); + void StencilFrontFaceCompare(ComparisonFunction value); + void StencilBackFacePass(StencilOperation value); + void StencilBackFaceFail(StencilOperation value); + void StencilBackFaceDepthFail(StencilOperation value); + void StencilBackFaceCompare(ComparisonFunction value); + + bool DepthEnabled() const; + bool DepthWriteEnabled() const; + ComparisonFunction DepthCompareFunction() const; + bool StencilEnabled() const; + Int StencilReadMask() const; + Int StencilWriteMask() const; + StencilOperation StencilFrontFacePass() const; + StencilOperation StencilFrontFaceFail() const; + StencilOperation StencilFrontFaceDepthFail() const; + ComparisonFunction StencilFrontFaceCompare() const; + StencilOperation StencilBackFacePass() const; + StencilOperation StencilBackFaceFail() const; + StencilOperation StencilBackFaceDepthFail() const; + ComparisonFunction StencilBackFaceCompare() const; + + static uptr None(); + static uptr Default(); + static uptr DepthRead(); + + public: + struct PlatformImplementation; + uptr impl = nullptr; }; } diff --git a/inc/platform-dx/depthstencilstate-dx.hpp b/inc/platform-dx/depthstencilstate-dx.hpp deleted file mode 100644 index 76b16e4..0000000 --- a/inc/platform-dx/depthstencilstate-dx.hpp +++ /dev/null @@ -1,193 +0,0 @@ -#ifndef XNA_PLATFORM_DEPTHSTENCILSTATE_DX_HPP -#define XNA_PLATFORM_DEPTHSTENCILSTATE_DX_HPP - -#include "../graphics/depthstencilstate.hpp" -#include "../graphics/gresource.hpp" -#include "dxheaders.hpp" - -namespace xna { - class DepthStencilState : public IDepthStencilState, public GraphicsResource { - public: - DepthStencilState(sptr const& device) : GraphicsResource(device) { - dxDescription = defaultDesc(); - } - - virtual ~DepthStencilState() override { - if (dxDepthStencil) { - dxDepthStencil->Release(); - dxDepthStencil = nullptr; - } - } - - virtual bool Initialize(xna_error_nullarg) override; - virtual bool Apply(xna_error_ptr_arg) override; - - virtual constexpr void DepthEnabled(bool value) override { - dxDescription.DepthEnable = value; - } - - virtual constexpr void DepthWriteEnabled(bool value) override { - dxDescription.DepthWriteMask = static_cast(value); - } - - virtual constexpr void DepthCompareFunction(ComparisonFunction value) override { - const auto _value = static_cast(value) + 1; - dxDescription.DepthFunc = static_cast(_value); - } - - virtual constexpr void StencilEnabled(bool value) override { - dxDescription.StencilEnable = value; - } - - virtual constexpr void StencilReadMask(int value) override { - dxDescription.StencilReadMask = static_cast(value); - } - - virtual constexpr void StencilWriteMask(int value) override { - dxDescription.StencilWriteMask = static_cast(value); - } - - virtual constexpr void StencilFrontFacePass(StencilOperation value) override { - const auto _value = static_cast(value) + 1; - dxDescription.FrontFace.StencilPassOp = static_cast(_value); - } - - virtual constexpr void StencilFrontFaceFail(StencilOperation value) override { - const auto _value = static_cast(value) + 1; - dxDescription.FrontFace.StencilFailOp = static_cast(_value); - } - - virtual constexpr void StencilFrontFaceDepthFail(StencilOperation value) override { - const auto _value = static_cast(value) + 1; - dxDescription.FrontFace.StencilDepthFailOp = static_cast(_value); - } - - virtual constexpr void StencilFrontFaceCompare(ComparisonFunction value) override { - const auto _value = static_cast(value) + 1; - dxDescription.FrontFace.StencilFunc = static_cast(_value); - } - - virtual constexpr void StencilBackFacePass(StencilOperation value) override { - const auto _value = static_cast(value) + 1; - dxDescription.BackFace.StencilPassOp = static_cast(_value); - } - - virtual constexpr void StencilBackFaceFail(StencilOperation value) override { - const auto _value = static_cast(value) + 1; - dxDescription.BackFace.StencilFailOp = static_cast(_value); - } - - virtual constexpr void StencilBackFaceDepthFail(StencilOperation value) override { - const auto _value = static_cast(value) + 1; - dxDescription.BackFace.StencilDepthFailOp = static_cast(_value); - } - - virtual constexpr void StencilBackFaceCompare(ComparisonFunction value) override { - const auto _value = static_cast(value) + 1; - dxDescription.BackFace.StencilFunc = static_cast(_value); - } - - virtual constexpr bool DepthEnabled() override { - return dxDescription.DepthEnable; - } - - virtual constexpr bool DepthWriteEnabled() override { - return static_cast(dxDescription.DepthWriteMask); - } - - virtual constexpr ComparisonFunction DepthCompareFunction() override { - const auto _value = static_cast(dxDescription.DepthFunc) - 1; - return static_cast(_value); - } - - virtual constexpr bool StencilEnabled() override { - return dxDescription.StencilEnable; - } - - virtual constexpr int StencilReadMask() override { - return static_cast(dxDescription.StencilReadMask); - } - - virtual constexpr int StencilWriteMask() override { - return static_cast(dxDescription.StencilWriteMask); - } - - virtual constexpr StencilOperation StencilFrontFacePass() override { - const auto _value = static_cast(dxDescription.FrontFace.StencilPassOp) - 1; - return static_cast(_value); - } - - virtual constexpr StencilOperation StencilFrontFaceFail() override { - const auto _value = static_cast(dxDescription.FrontFace.StencilFailOp) - 1; - return static_cast(_value); - } - - virtual constexpr StencilOperation StencilFrontFaceDepthFail() override { - const auto _value = static_cast(dxDescription.FrontFace.StencilDepthFailOp) - 1; - return static_cast(_value); - } - - virtual constexpr ComparisonFunction StencilFrontFaceCompare() override { - const auto _value = static_cast(dxDescription.FrontFace.StencilFunc) - 1; - return static_cast(_value); - } - - virtual constexpr StencilOperation StencilBackFacePass() override { - const auto _value = static_cast(dxDescription.BackFace.StencilPassOp) - 1; - return static_cast(_value); - } - - virtual constexpr StencilOperation StencilBackFaceFail() override { - const auto _value = static_cast(dxDescription.BackFace.StencilFailOp) - 1; - return static_cast(_value); - } - - virtual constexpr StencilOperation StencilBackFaceDepthFail() override { - const auto _value = static_cast(dxDescription.BackFace.StencilDepthFailOp) - 1; - return static_cast(_value); - } - - virtual constexpr ComparisonFunction StencilBackFaceCompare() override { - const auto _value = static_cast(dxDescription.BackFace.StencilFunc) - 1; - return static_cast(_value); - } - - static uptr None(); - static uptr Default(); - static uptr DepthRead(); - - public: - ID3D11DepthStencilState* dxDepthStencil = nullptr; - D3D11_DEPTH_STENCIL_DESC dxDescription{}; - - private: - DepthStencilState() : GraphicsResource(nullptr) { - dxDescription = defaultDesc(); - } - - static D3D11_DEPTH_STENCIL_DESC defaultDesc() { - D3D11_DEPTH_STENCIL_DESC _description{}; - _description.DepthEnable = true; - _description.StencilEnable = true; - _description.DepthFunc = D3D11_COMPARISON_LESS_EQUAL; - - _description.FrontFace.StencilFunc = D3D11_COMPARISON_ALWAYS; - _description.FrontFace.StencilPassOp = D3D11_STENCIL_OP_KEEP; - _description.FrontFace.StencilFailOp = D3D11_STENCIL_OP_KEEP; - _description.FrontFace.StencilDepthFailOp = D3D11_STENCIL_OP_KEEP; - - _description.BackFace.StencilFunc = D3D11_COMPARISON_ALWAYS; - _description.BackFace.StencilPassOp = D3D11_STENCIL_OP_KEEP; - _description.BackFace.StencilFailOp = D3D11_STENCIL_OP_KEEP; - _description.BackFace.StencilDepthFailOp = D3D11_STENCIL_OP_KEEP; - - _description.StencilReadMask = 0; - _description.StencilWriteMask = 0; - _description.DepthWriteMask = D3D11_DEPTH_WRITE_MASK_ZERO; - - return _description; - } - }; -} - -#endif \ No newline at end of file diff --git a/inc/platform-dx/implementations.hpp b/inc/platform-dx/implementations.hpp index 05c72cf..3abb21c 100644 --- a/inc/platform-dx/implementations.hpp +++ b/inc/platform-dx/implementations.hpp @@ -7,6 +7,7 @@ #include "platform-dx/swapchain-dx.hpp" #include "platform-dx/rendertarget-dx.hpp" #include "graphics/blendstate.hpp" +#include "graphics/depthstencilstate.hpp" namespace xna { struct SpriteFont::PlatformImplementation { @@ -248,4 +249,16 @@ namespace xna { _blob = blob; } }; + + struct DepthStencilState::PlatformImplementation { + ~PlatformImplementation() { + if (dxDepthStencil) { + dxDepthStencil->Release(); + dxDepthStencil = nullptr; + } + } + + ID3D11DepthStencilState* dxDepthStencil = nullptr; + D3D11_DEPTH_STENCIL_DESC dxDescription{}; + }; } \ No newline at end of file diff --git a/inc/platform-dx/xna-dx.hpp b/inc/platform-dx/xna-dx.hpp index d9cec6c..a528f14 100644 --- a/inc/platform-dx/xna-dx.hpp +++ b/inc/platform-dx/xna-dx.hpp @@ -1,5 +1,4 @@ #include "audioengine-dx.hpp" -#include "depthstencilstate-dx.hpp" #include "device-dx.hpp" #include "displaymode-dx.hpp" #include "dxheaders.hpp"