1
0
mirror of https://github.com/borgesdan/xn65 synced 2024-12-29 21:54:47 +01:00

Implementa Effect em SpriteBatch.Begin

This commit is contained in:
Danilo 2024-06-27 16:08:42 -03:00
parent c2048dd644
commit 2982ea8768
3 changed files with 53 additions and 30 deletions

View File

@ -7,6 +7,7 @@
#include "xna/graphics/blendstate.hpp"
#include "xna/graphics/depthstencilstate.hpp"
#include "xna/platform-dx/dx.hpp"
#include <functional>
using DxSpriteBatch = DirectX::SpriteBatch;
using DxSpriteSortMode = DirectX::SpriteSortMode;
@ -127,18 +128,18 @@ namespace xna {
if (!device->impl->_context)
return;
implementation = unew<PlatformImplementation>();
implementation->_dxspriteBatch = snew<DxSpriteBatch>(
impl = unew<PlatformImplementation>();
impl->_dxspriteBatch = snew<DxSpriteBatch>(
//ID3D11DeviceContext* deviceContext
device->impl->_context.Get()
);
Viewport(device->Viewport());
}
}
void SpriteBatch::Begin(SpriteSortMode sortMode, BlendState* blendState, SamplerState* samplerState, DepthStencilState* depthStencil, RasterizerState* rasterizerState, Effect* effect, Matrix const& transformMatrix) {
if (!implementation->_dxspriteBatch)
if (!impl->_dxspriteBatch)
return;
DxSpriteSortMode sort = DxHelpers::SpriteSortToDx(sortMode);
@ -148,28 +149,49 @@ namespace xna {
t.M11, t.M12, t.M13, t.M14,
t.M21, t.M22, t.M23, t.M24,
t.M31, t.M32, t.M33, t.M34,
t.M41, t.M42, t.M43, t.M44);
t.M41, t.M42, t.M43, t.M44);
implementation->_dxspriteBatch->Begin(
if (effect && !impl->dxInputLayout) {
void const* shaderByteCode;
size_t byteCodeLength;
effect->impl->dxEffect->GetVertexShaderBytecode(&shaderByteCode, &byteCodeLength);
m_device->impl->_device->CreateInputLayout(
DirectX::VertexPositionColorTexture::InputElements,
DirectX::VertexPositionColorTexture::InputElementCount,
shaderByteCode, byteCodeLength,
impl->dxInputLayout.GetAddressOf());
}
auto& context = m_device->impl->_context;
std::function funcEffect = [=] {
effect->impl->dxEffect->Apply(context.Get());
context->IASetInputLayout(impl->dxInputLayout.Get());
};
std::function funcVoid = [=] {};
impl->_dxspriteBatch->Begin(
sort,
blendState ? blendState->impl->dxBlendState.Get() : nullptr,
samplerState ? samplerState->impl->_samplerState.Get() : nullptr,
depthStencil ? depthStencil->impl->dxDepthStencil.Get() : nullptr,
rasterizerState ? rasterizerState->impl->dxRasterizerState.Get() : nullptr,
nullptr,
effect ? funcEffect : funcVoid,
matrix
);
}
void SpriteBatch::End() {
if (!implementation->_dxspriteBatch)
if (!impl->_dxspriteBatch)
return;
implementation->_dxspriteBatch->End();
impl->_dxspriteBatch->End();
}
void SpriteBatch::Draw(Texture2D& texture, Vector2 const& position, Color const& color) {
if (!implementation->_dxspriteBatch)
if (!impl->_dxspriteBatch)
return;
if (!texture.impl->dxShaderResource)
@ -179,7 +201,7 @@ namespace xna {
const auto v4 = color.ToVector4();
XMVECTORF32 _color = { v4.X, v4.Y, v4.Z, v4.W };
implementation->_dxspriteBatch->Draw(
impl->_dxspriteBatch->Draw(
texture.impl->dxShaderResource.Get(),
_position,
_color
@ -187,7 +209,7 @@ namespace xna {
}
void SpriteBatch::Draw(Texture2D& texture, Vector2 const& position, std::optional<Rectangle> const& sourceRectangle, Color const& color) {
if (!implementation->_dxspriteBatch)
if (!impl->_dxspriteBatch)
return;
if (!texture.impl->dxShaderResource)
@ -206,7 +228,7 @@ namespace xna {
_sourceRect.bottom = sourceRectangle->Y + sourceRectangle->Height;
};
implementation->_dxspriteBatch->Draw(
impl->_dxspriteBatch->Draw(
texture.impl->dxShaderResource.Get(),
_position,
sourceRectangle ? &_sourceRect : nullptr,
@ -214,7 +236,7 @@ namespace xna {
}
void SpriteBatch::Draw(Texture2D& texture, Vector2 const& position, std::optional<Rectangle> const& sourceRectangle, Color const& color, float rotation, Vector2 const& origin, float scale, SpriteEffects effects, float layerDepth) {
if (!implementation->_dxspriteBatch)
if (!impl->_dxspriteBatch)
return;
if (!texture.impl->dxShaderResource)
@ -236,7 +258,7 @@ namespace xna {
const DxSpriteEffects _effects = static_cast<DxSpriteEffects>(effects);
implementation->_dxspriteBatch->Draw(
impl->_dxspriteBatch->Draw(
texture.impl->dxShaderResource.Get(),
_position,
sourceRectangle ? &_sourceRect : nullptr,
@ -249,7 +271,7 @@ namespace xna {
}
void SpriteBatch::Draw(Texture2D& texture, Vector2 const& position, std::optional<Rectangle> const& sourceRectangle, Color const& color, float rotation, Vector2 const& origin, Vector2 const& scale, SpriteEffects effects, float layerDepth) {
if (!implementation->_dxspriteBatch)
if (!impl->_dxspriteBatch)
return;
if (!texture.impl->dxShaderResource)
@ -272,7 +294,7 @@ namespace xna {
const auto _effects = static_cast<DxSpriteEffects>(effects);
const XMFLOAT2 _scale = { scale.X, scale.Y };
implementation->_dxspriteBatch->Draw(
impl->_dxspriteBatch->Draw(
texture.impl->dxShaderResource.Get(),
_position,
sourceRectangle ? &_sourceRect : nullptr,
@ -285,7 +307,7 @@ namespace xna {
}
void SpriteBatch::Draw(Texture2D& texture, Rectangle const& destinationRectangle, Color const& color) {
if (!implementation->_dxspriteBatch)
if (!impl->_dxspriteBatch)
return;
if (!texture.impl->dxShaderResource)
@ -300,11 +322,11 @@ namespace xna {
const auto v4 = color.ToVector4();
const XMVECTORF32 _color = { v4.X, v4.Y, v4.Z, v4.W };
implementation->_dxspriteBatch->Draw(texture.impl->dxShaderResource.Get(), _destinationRect, _color);
impl->_dxspriteBatch->Draw(texture.impl->dxShaderResource.Get(), _destinationRect, _color);
}
void SpriteBatch::Draw(Texture2D& texture, Rectangle const& destinationRectangle, std::optional<Rectangle> const& sourceRectangle, Color const& color) {
if (!implementation->_dxspriteBatch)
if (!impl->_dxspriteBatch)
return;
if (!texture.impl->dxShaderResource)
@ -328,11 +350,11 @@ namespace xna {
_sourceRect.bottom = sourceRectangle->Y + sourceRectangle->Height;
};
implementation->_dxspriteBatch->Draw(texture.impl->dxShaderResource.Get(), _destinationRect, sourceRectangle ? &_sourceRect : nullptr, _color);
impl->_dxspriteBatch->Draw(texture.impl->dxShaderResource.Get(), _destinationRect, sourceRectangle ? &_sourceRect : nullptr, _color);
}
void SpriteBatch::Draw(Texture2D& texture, Rectangle const& destinationRectangle, std::optional<Rectangle> const& sourceRectangle, Color const& color, float rotation, Vector2 const& origin, SpriteEffects effects, float layerDepth) {
if (!implementation->_dxspriteBatch)
if (!impl->_dxspriteBatch)
return;
if (!texture.impl->dxShaderResource)
@ -359,7 +381,7 @@ namespace xna {
auto _origin = XMFLOAT2(origin.X, origin.Y);
const auto _effects = static_cast<DxSpriteEffects>(effects);
implementation->_dxspriteBatch->Draw(
impl->_dxspriteBatch->Draw(
texture.impl->dxShaderResource.Get(),
_destinationRect,
sourceRectangle ? &_sourceRect : nullptr,
@ -371,7 +393,7 @@ namespace xna {
}
void SpriteBatch::Viewport(xna::Viewport const& value) {
if (!implementation->_dxspriteBatch)
if (!impl->_dxspriteBatch)
return;
D3D11_VIEWPORT _view{};
@ -382,11 +404,11 @@ namespace xna {
_view.MinDepth = value.MinDetph;
_view.MaxDepth = value.MaxDepth;
implementation->_dxspriteBatch->SetViewport(_view);
impl->_dxspriteBatch->SetViewport(_view);
}
void SpriteBatch::DrawString(SpriteFont& spriteFont, String const& text, Vector2 const& position, Color const& color) {
if (!implementation->_dxspriteBatch || !spriteFont.impl->_dxSpriteFont)
if (!impl->_dxspriteBatch || !spriteFont.impl->_dxSpriteFont)
return;
const auto _position = XMFLOAT2(position.X, position.Y);
@ -394,7 +416,7 @@ namespace xna {
const XMVECTORF32 _color = { v4.X, v4.Y, v4.Z, v4.W };
spriteFont.impl->_dxSpriteFont->DrawString(
implementation->_dxspriteBatch.get(),
impl->_dxspriteBatch.get(),
text.c_str(),
_position,
_color
@ -403,7 +425,7 @@ namespace xna {
void SpriteBatch::DrawString(SpriteFont& spriteFont, String const& text, Vector2 const& position,
Color const& color, float rotation, Vector2 const& origin, float scale, SpriteEffects effects, float layerDepth) {
if (!implementation->_dxspriteBatch || !spriteFont.impl->_dxSpriteFont)
if (!impl->_dxspriteBatch || !spriteFont.impl->_dxSpriteFont)
return;
const auto _position = XMFLOAT2(position.X, position.Y);
@ -413,7 +435,7 @@ namespace xna {
const auto _effects = static_cast<DxSpriteEffects>(effects);
spriteFont.impl->_dxSpriteFont->DrawString(
implementation->_dxspriteBatch.get(),
impl->_dxspriteBatch.get(),
text.c_str(),
_position,
_color,

View File

@ -87,7 +87,7 @@ namespace xna {
public:
struct PlatformImplementation;
uptr<PlatformImplementation> implementation = nullptr;
uptr<PlatformImplementation> impl = nullptr;
};
//Represents a font texture.

View File

@ -572,6 +572,7 @@ namespace xna {
struct SpriteBatch::PlatformImplementation {
sptr<DirectX::SpriteBatch> _dxspriteBatch = nullptr;
comptr<ID3D11InputLayout> dxInputLayout = nullptr;
};
struct GraphicsAdapter::PlatformImplementation {