mirror of
https://github.com/AxioDL/metaforce.git
synced 2025-12-20 11:39:13 +00:00
Tons of refactors and bug fixes
This commit is contained in:
@@ -11,23 +11,17 @@
|
||||
namespace urde
|
||||
{
|
||||
|
||||
template <class FilterImp>
|
||||
template <class ShaderImp>
|
||||
class TMultiBlendShader
|
||||
{
|
||||
public:
|
||||
struct IDataBindingFactory
|
||||
{
|
||||
virtual boo::IShaderDataBinding* BuildShaderDataBinding(boo::IGraphicsDataFactory::Context& ctx,
|
||||
boo::IShaderPipeline* pipeline,
|
||||
boo::IVertexFormat* vtxFmt,
|
||||
FilterImp& filter)=0;
|
||||
CCameraFilterPass::EFilterType type,
|
||||
ShaderImp& filter)=0;
|
||||
};
|
||||
|
||||
static boo::IShaderPipeline* m_alphaBlendPipeline;
|
||||
static boo::IShaderPipeline* m_additiveAlphaPipeline;
|
||||
static boo::IShaderPipeline* m_colorMultiplyPipeline;
|
||||
static boo::IVertexFormat* m_vtxFmt; /* No OpenGL */
|
||||
|
||||
static std::unique_ptr<IDataBindingFactory> m_bindFactory;
|
||||
static boo::GraphicsDataToken m_gfxToken;
|
||||
|
||||
@@ -42,29 +36,22 @@ public:
|
||||
switch (ctx.platform())
|
||||
{
|
||||
case boo::IGraphicsDataFactory::Platform::OpenGL:
|
||||
m_bindFactory.reset(FilterImp::Initialize(static_cast<boo::GLDataFactory::Context&>(ctx),
|
||||
m_alphaBlendPipeline, m_additiveAlphaPipeline, m_colorMultiplyPipeline));
|
||||
m_bindFactory.reset(ShaderImp::Initialize(static_cast<boo::GLDataFactory::Context&>(ctx)));
|
||||
break;
|
||||
#if _WIN32
|
||||
case boo::IGraphicsDataFactory::Platform::D3D11:
|
||||
case boo::IGraphicsDataFactory::Platform::D3D12:
|
||||
m_bindFactory.reset(FilterImp::Initialize(static_cast<boo::ID3DDataFactory::Context&>(ctx),
|
||||
m_alphaBlendPipeline, m_additiveAlphaPipeline,
|
||||
m_colorMultiplyPipeline, m_vtxFmt));
|
||||
m_bindFactory.reset(FilterImp::Initialize(static_cast<boo::ID3DDataFactory::Context&>(ctx)));
|
||||
break;
|
||||
#endif
|
||||
#if BOO_HAS_METAL
|
||||
case boo::IGraphicsDataFactory::Platform::Metal:
|
||||
m_bindFactory.reset(FilterImp::Initialize(static_cast<boo::MetalDataFactory::Context&>(ctx),
|
||||
m_alphaBlendPipeline, m_additiveAlphaPipeline,
|
||||
m_colorMultiplyPipeline, m_vtxFmt));
|
||||
m_bindFactory.reset(ShaderImp::Initialize(static_cast<boo::MetalDataFactory::Context&>(ctx)));
|
||||
break;
|
||||
#endif
|
||||
#if BOO_HAS_VULKAN
|
||||
case boo::IGraphicsDataFactory::Platform::Vulkan:
|
||||
m_bindFactory.reset(FilterImp::Initialize(static_cast<boo::VulkanDataFactory::Context&>(ctx),
|
||||
m_alphaBlendPipeline, m_additiveAlphaPipeline,
|
||||
m_colorMultiplyPipeline, m_vtxFmt));
|
||||
m_bindFactory.reset(FilterImp::Initialize(static_cast<boo::VulkanDataFactory::Context&>(ctx)));
|
||||
break;
|
||||
#endif
|
||||
default: break;
|
||||
@@ -75,47 +62,25 @@ public:
|
||||
|
||||
static void Shutdown()
|
||||
{
|
||||
ShaderImp::Shutdown();
|
||||
m_gfxToken.doDestroy();
|
||||
}
|
||||
|
||||
static boo::IShaderDataBinding* BuildShaderDataBinding(boo::IGraphicsDataFactory::Context& ctx,
|
||||
CCameraFilterPass::EFilterType type,
|
||||
FilterImp& filter)
|
||||
ShaderImp& filter)
|
||||
{
|
||||
if (type == CCameraFilterPass::EFilterType::Add)
|
||||
return m_bindFactory->BuildShaderDataBinding(ctx, m_additiveAlphaPipeline, m_vtxFmt, filter);
|
||||
else if (type == CCameraFilterPass::EFilterType::Multiply)
|
||||
return m_bindFactory->BuildShaderDataBinding(ctx, m_colorMultiplyPipeline, m_vtxFmt, filter);
|
||||
else
|
||||
return m_bindFactory->BuildShaderDataBinding(ctx, m_alphaBlendPipeline, m_vtxFmt, filter);
|
||||
return m_bindFactory->BuildShaderDataBinding(ctx, type, filter);
|
||||
}
|
||||
};
|
||||
|
||||
#define URDE_DECL_SPECIALIZE_MULTI_BLEND_SHADER(cls) \
|
||||
template <> boo::IShaderPipeline* \
|
||||
TMultiBlendShader<cls>::m_alphaBlendPipeline; \
|
||||
template <> boo::IShaderPipeline* \
|
||||
TMultiBlendShader<cls>::m_additiveAlphaPipeline; \
|
||||
template <> boo::IShaderPipeline* \
|
||||
TMultiBlendShader<cls>::m_colorMultiplyPipeline; \
|
||||
template <> boo::IVertexFormat* \
|
||||
TMultiBlendShader<cls>::m_vtxFmt; \
|
||||
\
|
||||
template <> std::unique_ptr<TMultiBlendShader<cls>::IDataBindingFactory> \
|
||||
TMultiBlendShader<cls>::m_bindFactory; \
|
||||
template <> boo::GraphicsDataToken \
|
||||
TMultiBlendShader<cls>::m_gfxToken; \
|
||||
|
||||
#define URDE_SPECIALIZE_MULTI_BLEND_SHADER(cls) \
|
||||
template <> boo::IShaderPipeline* \
|
||||
TMultiBlendShader<cls>::m_alphaBlendPipeline = nullptr; \
|
||||
template <> boo::IShaderPipeline* \
|
||||
TMultiBlendShader<cls>::m_additiveAlphaPipeline = nullptr; \
|
||||
template <> boo::IShaderPipeline* \
|
||||
TMultiBlendShader<cls>::m_colorMultiplyPipeline = nullptr; \
|
||||
template <> boo::IVertexFormat* \
|
||||
TMultiBlendShader<cls>::m_vtxFmt = nullptr; \
|
||||
\
|
||||
template <> std::unique_ptr<TMultiBlendShader<cls>::IDataBindingFactory> \
|
||||
TMultiBlendShader<cls>::m_bindFactory = {}; \
|
||||
template <> boo::GraphicsDataToken \
|
||||
|
||||
Reference in New Issue
Block a user