metaforce/Runtime/Graphics/Shaders/TMultiBlendShader.hpp

112 lines
3.4 KiB
C++
Raw Normal View History

2016-08-17 01:58:53 +00:00
#ifndef __URDE_TMULTIBLENDSHADER_HPP__
#define __URDE_TMULTIBLENDSHADER_HPP__
#include "Graphics/CGraphics.hpp"
#include "boo/graphicsdev/GL.hpp"
#include "boo/graphicsdev/D3D.hpp"
#include "boo/graphicsdev/Metal.hpp"
#include "boo/graphicsdev/Vulkan.hpp"
#include "Camera/CCameraFilter.hpp"
namespace urde
{
2017-01-29 03:58:16 +00:00
template <class ShaderImp>
2016-08-17 01:58:53 +00:00
class TMultiBlendShader
{
public:
struct IDataBindingFactory
{
virtual boo::ObjToken<boo::IShaderDataBinding> BuildShaderDataBinding(boo::IGraphicsDataFactory::Context& ctx,
EFilterType type, ShaderImp& filter)=0;
virtual ~IDataBindingFactory() = default;
2016-08-17 01:58:53 +00:00
};
static std::unique_ptr<IDataBindingFactory> m_bindFactory;
static void Initialize()
{
if (!CGraphics::g_BooFactory)
return;
CGraphics::CommitResources(
[&](boo::IGraphicsDataFactory::Context& ctx)
2016-08-17 01:58:53 +00:00
{
switch (ctx.platform())
{
2017-12-06 03:26:15 +00:00
#if BOO_HAS_GL
2016-08-24 04:35:35 +00:00
case boo::IGraphicsDataFactory::Platform::OpenGL:
2017-01-29 03:58:16 +00:00
m_bindFactory.reset(ShaderImp::Initialize(static_cast<boo::GLDataFactory::Context&>(ctx)));
2016-08-17 01:58:53 +00:00
break;
2017-12-06 03:26:15 +00:00
#endif
2016-08-17 01:58:53 +00:00
#if _WIN32
case boo::IGraphicsDataFactory::Platform::D3D11:
m_bindFactory.reset(ShaderImp::Initialize(static_cast<boo::D3DDataFactory::Context&>(ctx)));
2016-08-17 01:58:53 +00:00
break;
#endif
#if BOO_HAS_METAL
case boo::IGraphicsDataFactory::Platform::Metal:
2017-01-29 03:58:16 +00:00
m_bindFactory.reset(ShaderImp::Initialize(static_cast<boo::MetalDataFactory::Context&>(ctx)));
2016-08-17 01:58:53 +00:00
break;
#endif
#if BOO_HAS_VULKAN
case boo::IGraphicsDataFactory::Platform::Vulkan:
2017-01-29 07:27:48 +00:00
m_bindFactory.reset(ShaderImp::Initialize(static_cast<boo::VulkanDataFactory::Context&>(ctx)));
2016-08-17 01:58:53 +00:00
break;
#endif
default: break;
}
return true;
} BooTrace);
2016-08-17 01:58:53 +00:00
}
static void Shutdown()
{
switch (CGraphics::g_BooFactory->platform())
{
2017-12-06 03:26:15 +00:00
#if BOO_HAS_GL
case boo::IGraphicsDataFactory::Platform::OpenGL:
ShaderImp::template Shutdown<boo::GLDataFactory>();
break;
2017-12-06 03:26:15 +00:00
#endif
#if _WIN32
case boo::IGraphicsDataFactory::Platform::D3D11:
ShaderImp::template Shutdown<boo::D3DDataFactory>();
break;
#endif
#if BOO_HAS_METAL
case boo::IGraphicsDataFactory::Platform::Metal:
ShaderImp::template Shutdown<boo::MetalDataFactory>();
break;
#endif
#if BOO_HAS_VULKAN
case boo::IGraphicsDataFactory::Platform::Vulkan:
ShaderImp::template Shutdown<boo::VulkanDataFactory>();
break;
#endif
default: break;
}
2016-08-17 01:58:53 +00:00
}
static boo::ObjToken<boo::IShaderDataBinding>
BuildShaderDataBinding(boo::IGraphicsDataFactory::Context& ctx,
EFilterType type, ShaderImp& filter)
2016-08-17 01:58:53 +00:00
{
2017-01-29 03:58:16 +00:00
return m_bindFactory->BuildShaderDataBinding(ctx, type, filter);
2016-08-17 01:58:53 +00:00
}
};
#define URDE_DECL_SPECIALIZE_MULTI_BLEND_SHADER(cls) \
template <> std::unique_ptr<TMultiBlendShader<cls>::IDataBindingFactory> \
TMultiBlendShader<cls>::m_bindFactory; \
#define URDE_SPECIALIZE_MULTI_BLEND_SHADER(cls) \
template <> std::unique_ptr<TMultiBlendShader<cls>::IDataBindingFactory> \
TMultiBlendShader<cls>::m_bindFactory = {}; \
\
template class TMultiBlendShader<cls>;
}
#endif // __URDE_TMULTIBLENDSHADER_HPP__