#include "xna/graphics/rasterizerstate.hpp" #include "xna/platform-dx/dx.hpp" namespace xna { RasterizerState::RasterizerState() : GraphicsResource(nullptr){ impl = unew(); } RasterizerState::RasterizerState(sptr const& device) : GraphicsResource(device) { impl = unew(); } RasterizerState::~RasterizerState() { impl = nullptr; } bool RasterizerState::Initialize() { if (!impl || !m_device || !m_device->impl->_device) { Exception::Throw(ExMessage::InitializeComponent); } if (impl->dxRasterizerState) { impl->dxRasterizerState->Release(); impl->dxRasterizerState = nullptr; } const auto hr = m_device->impl->_device->CreateRasterizerState( &impl->dxDescription, &impl->dxRasterizerState); if (FAILED(hr)) { Exception::Throw(ExMessage::CreateComponent); } return true; } bool RasterizerState::Apply() { if (!impl || !m_device || !m_device->impl->_context) { Exception::Throw(ExMessage::InitializeComponent); } if (!impl->dxRasterizerState) { Exception::Throw(ExMessage::UnintializedComponent); } m_device->impl->_context->RSSetState(impl->dxRasterizerState); return true; } uptr RasterizerState::CullNone() { auto raster = unew(); raster->impl->dxDescription.FillMode = D3D11_FILL_SOLID; raster->impl->dxDescription.CullMode = D3D11_CULL_MODE::D3D11_CULL_NONE; raster->impl->dxDescription.DepthClipEnable = true; return raster; } uptr RasterizerState::CullClockwise() { auto raster = unew(); raster->impl->dxDescription.FillMode = D3D11_FILL_SOLID; raster->impl->dxDescription.CullMode = D3D11_CULL_MODE::D3D11_CULL_FRONT; raster->impl->dxDescription.DepthClipEnable = true; return raster; } uptr RasterizerState::CullCounterClockwise() { auto raster = unew(); raster->impl->dxDescription.FillMode = D3D11_FILL_SOLID; raster->impl->dxDescription.CullMode = D3D11_CULL_MODE::D3D11_CULL_BACK; raster->impl->dxDescription.DepthClipEnable = true; return raster; } xna::CullMode RasterizerState::CullMode() const { if (!impl) return xna::CullMode::None; return static_cast(static_cast(impl->dxDescription.CullMode) - 1); } void RasterizerState::CullMode(xna::CullMode value) { if (!impl) return; impl->dxDescription.CullMode = static_cast(static_cast(value) + 1); } xna::FillMode RasterizerState::FillMode() const { if (!impl) return xna::FillMode::WireFrame; return static_cast(static_cast(impl->dxDescription.FillMode) - 2); } void RasterizerState::FillMode(xna::FillMode value) { if (!impl) return; impl->dxDescription.FillMode = static_cast(static_cast(value) + 2); } }