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:
parent
c2048dd644
commit
2982ea8768
@ -7,6 +7,7 @@
|
|||||||
#include "xna/graphics/blendstate.hpp"
|
#include "xna/graphics/blendstate.hpp"
|
||||||
#include "xna/graphics/depthstencilstate.hpp"
|
#include "xna/graphics/depthstencilstate.hpp"
|
||||||
#include "xna/platform-dx/dx.hpp"
|
#include "xna/platform-dx/dx.hpp"
|
||||||
|
#include <functional>
|
||||||
|
|
||||||
using DxSpriteBatch = DirectX::SpriteBatch;
|
using DxSpriteBatch = DirectX::SpriteBatch;
|
||||||
using DxSpriteSortMode = DirectX::SpriteSortMode;
|
using DxSpriteSortMode = DirectX::SpriteSortMode;
|
||||||
@ -127,18 +128,18 @@ namespace xna {
|
|||||||
if (!device->impl->_context)
|
if (!device->impl->_context)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
implementation = unew<PlatformImplementation>();
|
impl = unew<PlatformImplementation>();
|
||||||
implementation->_dxspriteBatch = snew<DxSpriteBatch>(
|
impl->_dxspriteBatch = snew<DxSpriteBatch>(
|
||||||
//ID3D11DeviceContext* deviceContext
|
//ID3D11DeviceContext* deviceContext
|
||||||
device->impl->_context.Get()
|
device->impl->_context.Get()
|
||||||
);
|
);
|
||||||
|
|
||||||
Viewport(device->Viewport());
|
Viewport(device->Viewport());
|
||||||
}
|
}
|
||||||
|
|
||||||
void SpriteBatch::Begin(SpriteSortMode sortMode, BlendState* blendState, SamplerState* samplerState, DepthStencilState* depthStencil, RasterizerState* rasterizerState, Effect* effect, Matrix const& transformMatrix) {
|
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;
|
return;
|
||||||
|
|
||||||
DxSpriteSortMode sort = DxHelpers::SpriteSortToDx(sortMode);
|
DxSpriteSortMode sort = DxHelpers::SpriteSortToDx(sortMode);
|
||||||
@ -148,28 +149,49 @@ namespace xna {
|
|||||||
t.M11, t.M12, t.M13, t.M14,
|
t.M11, t.M12, t.M13, t.M14,
|
||||||
t.M21, t.M22, t.M23, t.M24,
|
t.M21, t.M22, t.M23, t.M24,
|
||||||
t.M31, t.M32, t.M33, t.M34,
|
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,
|
sort,
|
||||||
blendState ? blendState->impl->dxBlendState.Get() : nullptr,
|
blendState ? blendState->impl->dxBlendState.Get() : nullptr,
|
||||||
samplerState ? samplerState->impl->_samplerState.Get() : nullptr,
|
samplerState ? samplerState->impl->_samplerState.Get() : nullptr,
|
||||||
depthStencil ? depthStencil->impl->dxDepthStencil.Get() : nullptr,
|
depthStencil ? depthStencil->impl->dxDepthStencil.Get() : nullptr,
|
||||||
rasterizerState ? rasterizerState->impl->dxRasterizerState.Get() : nullptr,
|
rasterizerState ? rasterizerState->impl->dxRasterizerState.Get() : nullptr,
|
||||||
nullptr,
|
effect ? funcEffect : funcVoid,
|
||||||
matrix
|
matrix
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
void SpriteBatch::End() {
|
void SpriteBatch::End() {
|
||||||
if (!implementation->_dxspriteBatch)
|
if (!impl->_dxspriteBatch)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
implementation->_dxspriteBatch->End();
|
impl->_dxspriteBatch->End();
|
||||||
}
|
}
|
||||||
|
|
||||||
void SpriteBatch::Draw(Texture2D& texture, Vector2 const& position, Color const& color) {
|
void SpriteBatch::Draw(Texture2D& texture, Vector2 const& position, Color const& color) {
|
||||||
if (!implementation->_dxspriteBatch)
|
if (!impl->_dxspriteBatch)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (!texture.impl->dxShaderResource)
|
if (!texture.impl->dxShaderResource)
|
||||||
@ -179,7 +201,7 @@ namespace xna {
|
|||||||
const auto v4 = color.ToVector4();
|
const auto v4 = color.ToVector4();
|
||||||
XMVECTORF32 _color = { v4.X, v4.Y, v4.Z, v4.W };
|
XMVECTORF32 _color = { v4.X, v4.Y, v4.Z, v4.W };
|
||||||
|
|
||||||
implementation->_dxspriteBatch->Draw(
|
impl->_dxspriteBatch->Draw(
|
||||||
texture.impl->dxShaderResource.Get(),
|
texture.impl->dxShaderResource.Get(),
|
||||||
_position,
|
_position,
|
||||||
_color
|
_color
|
||||||
@ -187,7 +209,7 @@ namespace xna {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void SpriteBatch::Draw(Texture2D& texture, Vector2 const& position, std::optional<Rectangle> const& sourceRectangle, Color const& color) {
|
void SpriteBatch::Draw(Texture2D& texture, Vector2 const& position, std::optional<Rectangle> const& sourceRectangle, Color const& color) {
|
||||||
if (!implementation->_dxspriteBatch)
|
if (!impl->_dxspriteBatch)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (!texture.impl->dxShaderResource)
|
if (!texture.impl->dxShaderResource)
|
||||||
@ -206,7 +228,7 @@ namespace xna {
|
|||||||
_sourceRect.bottom = sourceRectangle->Y + sourceRectangle->Height;
|
_sourceRect.bottom = sourceRectangle->Y + sourceRectangle->Height;
|
||||||
};
|
};
|
||||||
|
|
||||||
implementation->_dxspriteBatch->Draw(
|
impl->_dxspriteBatch->Draw(
|
||||||
texture.impl->dxShaderResource.Get(),
|
texture.impl->dxShaderResource.Get(),
|
||||||
_position,
|
_position,
|
||||||
sourceRectangle ? &_sourceRect : nullptr,
|
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) {
|
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;
|
return;
|
||||||
|
|
||||||
if (!texture.impl->dxShaderResource)
|
if (!texture.impl->dxShaderResource)
|
||||||
@ -236,7 +258,7 @@ namespace xna {
|
|||||||
|
|
||||||
const DxSpriteEffects _effects = static_cast<DxSpriteEffects>(effects);
|
const DxSpriteEffects _effects = static_cast<DxSpriteEffects>(effects);
|
||||||
|
|
||||||
implementation->_dxspriteBatch->Draw(
|
impl->_dxspriteBatch->Draw(
|
||||||
texture.impl->dxShaderResource.Get(),
|
texture.impl->dxShaderResource.Get(),
|
||||||
_position,
|
_position,
|
||||||
sourceRectangle ? &_sourceRect : nullptr,
|
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) {
|
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;
|
return;
|
||||||
|
|
||||||
if (!texture.impl->dxShaderResource)
|
if (!texture.impl->dxShaderResource)
|
||||||
@ -272,7 +294,7 @@ namespace xna {
|
|||||||
const auto _effects = static_cast<DxSpriteEffects>(effects);
|
const auto _effects = static_cast<DxSpriteEffects>(effects);
|
||||||
const XMFLOAT2 _scale = { scale.X, scale.Y };
|
const XMFLOAT2 _scale = { scale.X, scale.Y };
|
||||||
|
|
||||||
implementation->_dxspriteBatch->Draw(
|
impl->_dxspriteBatch->Draw(
|
||||||
texture.impl->dxShaderResource.Get(),
|
texture.impl->dxShaderResource.Get(),
|
||||||
_position,
|
_position,
|
||||||
sourceRectangle ? &_sourceRect : nullptr,
|
sourceRectangle ? &_sourceRect : nullptr,
|
||||||
@ -285,7 +307,7 @@ namespace xna {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void SpriteBatch::Draw(Texture2D& texture, Rectangle const& destinationRectangle, Color const& color) {
|
void SpriteBatch::Draw(Texture2D& texture, Rectangle const& destinationRectangle, Color const& color) {
|
||||||
if (!implementation->_dxspriteBatch)
|
if (!impl->_dxspriteBatch)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (!texture.impl->dxShaderResource)
|
if (!texture.impl->dxShaderResource)
|
||||||
@ -300,11 +322,11 @@ namespace xna {
|
|||||||
const auto v4 = color.ToVector4();
|
const auto v4 = color.ToVector4();
|
||||||
const XMVECTORF32 _color = { v4.X, v4.Y, v4.Z, v4.W };
|
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) {
|
void SpriteBatch::Draw(Texture2D& texture, Rectangle const& destinationRectangle, std::optional<Rectangle> const& sourceRectangle, Color const& color) {
|
||||||
if (!implementation->_dxspriteBatch)
|
if (!impl->_dxspriteBatch)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (!texture.impl->dxShaderResource)
|
if (!texture.impl->dxShaderResource)
|
||||||
@ -328,11 +350,11 @@ namespace xna {
|
|||||||
_sourceRect.bottom = sourceRectangle->Y + sourceRectangle->Height;
|
_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) {
|
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;
|
return;
|
||||||
|
|
||||||
if (!texture.impl->dxShaderResource)
|
if (!texture.impl->dxShaderResource)
|
||||||
@ -359,7 +381,7 @@ namespace xna {
|
|||||||
auto _origin = XMFLOAT2(origin.X, origin.Y);
|
auto _origin = XMFLOAT2(origin.X, origin.Y);
|
||||||
const auto _effects = static_cast<DxSpriteEffects>(effects);
|
const auto _effects = static_cast<DxSpriteEffects>(effects);
|
||||||
|
|
||||||
implementation->_dxspriteBatch->Draw(
|
impl->_dxspriteBatch->Draw(
|
||||||
texture.impl->dxShaderResource.Get(),
|
texture.impl->dxShaderResource.Get(),
|
||||||
_destinationRect,
|
_destinationRect,
|
||||||
sourceRectangle ? &_sourceRect : nullptr,
|
sourceRectangle ? &_sourceRect : nullptr,
|
||||||
@ -371,7 +393,7 @@ namespace xna {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void SpriteBatch::Viewport(xna::Viewport const& value) {
|
void SpriteBatch::Viewport(xna::Viewport const& value) {
|
||||||
if (!implementation->_dxspriteBatch)
|
if (!impl->_dxspriteBatch)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
D3D11_VIEWPORT _view{};
|
D3D11_VIEWPORT _view{};
|
||||||
@ -382,11 +404,11 @@ namespace xna {
|
|||||||
_view.MinDepth = value.MinDetph;
|
_view.MinDepth = value.MinDetph;
|
||||||
_view.MaxDepth = value.MaxDepth;
|
_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) {
|
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;
|
return;
|
||||||
|
|
||||||
const auto _position = XMFLOAT2(position.X, position.Y);
|
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 };
|
const XMVECTORF32 _color = { v4.X, v4.Y, v4.Z, v4.W };
|
||||||
|
|
||||||
spriteFont.impl->_dxSpriteFont->DrawString(
|
spriteFont.impl->_dxSpriteFont->DrawString(
|
||||||
implementation->_dxspriteBatch.get(),
|
impl->_dxspriteBatch.get(),
|
||||||
text.c_str(),
|
text.c_str(),
|
||||||
_position,
|
_position,
|
||||||
_color
|
_color
|
||||||
@ -403,7 +425,7 @@ namespace xna {
|
|||||||
|
|
||||||
void SpriteBatch::DrawString(SpriteFont& spriteFont, String const& text, Vector2 const& position,
|
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) {
|
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;
|
return;
|
||||||
|
|
||||||
const auto _position = XMFLOAT2(position.X, position.Y);
|
const auto _position = XMFLOAT2(position.X, position.Y);
|
||||||
@ -413,7 +435,7 @@ namespace xna {
|
|||||||
const auto _effects = static_cast<DxSpriteEffects>(effects);
|
const auto _effects = static_cast<DxSpriteEffects>(effects);
|
||||||
|
|
||||||
spriteFont.impl->_dxSpriteFont->DrawString(
|
spriteFont.impl->_dxSpriteFont->DrawString(
|
||||||
implementation->_dxspriteBatch.get(),
|
impl->_dxspriteBatch.get(),
|
||||||
text.c_str(),
|
text.c_str(),
|
||||||
_position,
|
_position,
|
||||||
_color,
|
_color,
|
||||||
|
@ -87,7 +87,7 @@ namespace xna {
|
|||||||
|
|
||||||
public:
|
public:
|
||||||
struct PlatformImplementation;
|
struct PlatformImplementation;
|
||||||
uptr<PlatformImplementation> implementation = nullptr;
|
uptr<PlatformImplementation> impl = nullptr;
|
||||||
};
|
};
|
||||||
|
|
||||||
//Represents a font texture.
|
//Represents a font texture.
|
||||||
|
@ -572,6 +572,7 @@ namespace xna {
|
|||||||
|
|
||||||
struct SpriteBatch::PlatformImplementation {
|
struct SpriteBatch::PlatformImplementation {
|
||||||
sptr<DirectX::SpriteBatch> _dxspriteBatch = nullptr;
|
sptr<DirectX::SpriteBatch> _dxspriteBatch = nullptr;
|
||||||
|
comptr<ID3D11InputLayout> dxInputLayout = nullptr;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct GraphicsAdapter::PlatformImplementation {
|
struct GraphicsAdapter::PlatformImplementation {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user