mirror of
https://github.com/AxioDL/metaforce.git
synced 2025-12-09 06:27:43 +00:00
CSplashScreen integration
This commit is contained in:
@@ -4,6 +4,11 @@
|
||||
namespace urde
|
||||
{
|
||||
|
||||
CTexturedQuadFilter::CTexturedQuadFilter(boo::ITexture* tex)
|
||||
: m_booTex(tex)
|
||||
{
|
||||
}
|
||||
|
||||
CTexturedQuadFilter::CTexturedQuadFilter(CCameraFilterPass::EFilterType type, boo::ITexture* tex)
|
||||
: m_booTex(tex)
|
||||
{
|
||||
@@ -23,7 +28,30 @@ CTexturedQuadFilter::CTexturedQuadFilter(CCameraFilterPass::EFilterType type,
|
||||
m_tex = tex;
|
||||
}
|
||||
|
||||
void CTexturedQuadFilter::draw(const zeus::CColor& color, float uvScale)
|
||||
void CTexturedQuadFilter::draw(const zeus::CColor& color, float uvScale, const zeus::CRectangle& rect)
|
||||
{
|
||||
Vert verts[4] =
|
||||
{
|
||||
{{0.f, 0.f}, {0.f, 0.f}},
|
||||
{{0.f, 1.f}, {0.f, 1.f}},
|
||||
{{1.f, 0.f}, {1.f, 0.f}},
|
||||
{{1.f, 1.f}, {1.f, 1.f}},
|
||||
};
|
||||
m_vbo->load(verts, sizeof(verts));
|
||||
|
||||
m_uniform.m_matrix[0][0] = rect.size.x * 2.f;
|
||||
m_uniform.m_matrix[1][1] = rect.size.y * 2.f;
|
||||
m_uniform.m_matrix[3][0] = rect.position.x * 2.f - 1.f;
|
||||
m_uniform.m_matrix[3][1] = rect.position.y * 2.f - 1.f;
|
||||
m_uniform.m_color = color;
|
||||
m_uniform.m_uvScale = uvScale;
|
||||
m_uniBuf->load(&m_uniform, sizeof(m_uniform));
|
||||
|
||||
CGraphics::g_BooMainCommandQueue->setShaderDataBinding(m_dataBind);
|
||||
CGraphics::g_BooMainCommandQueue->draw(0, 4);
|
||||
}
|
||||
|
||||
void CTexturedQuadFilter::drawCropped(const zeus::CColor& color, float uvScale)
|
||||
{
|
||||
float xFac = CGraphics::g_CroppedViewport.xc_width / float(CGraphics::g_ViewportResolution.x);
|
||||
float yFac = CGraphics::g_CroppedViewport.x10_height / float(CGraphics::g_ViewportResolution.y);
|
||||
@@ -47,6 +75,29 @@ void CTexturedQuadFilter::draw(const zeus::CColor& color, float uvScale)
|
||||
CGraphics::g_BooMainCommandQueue->draw(0, 4);
|
||||
}
|
||||
|
||||
const zeus::CRectangle CTexturedQuadFilter::DefaultRect = {0.f, 0.f, 1.f, 1.f};
|
||||
|
||||
URDE_SPECIALIZE_MULTI_BLEND_SHADER(CTexturedQuadFilter)
|
||||
|
||||
CTexturedQuadFilterAlpha::CTexturedQuadFilterAlpha(CCameraFilterPass::EFilterType type, boo::ITexture* tex)
|
||||
: CTexturedQuadFilter(tex)
|
||||
{
|
||||
m_token = CGraphics::g_BooFactory->commitTransaction([&](boo::IGraphicsDataFactory::Context& ctx) -> bool
|
||||
{
|
||||
m_vbo = ctx.newDynamicBuffer(boo::BufferUse::Vertex, 32, 4);
|
||||
m_uniBuf = ctx.newDynamicBuffer(boo::BufferUse::Uniform, sizeof(Uniform), 1);
|
||||
m_dataBind = TMultiBlendShader<CTexturedQuadFilterAlpha>::BuildShaderDataBinding(ctx, type, *this);
|
||||
return true;
|
||||
});
|
||||
}
|
||||
|
||||
CTexturedQuadFilterAlpha::CTexturedQuadFilterAlpha(CCameraFilterPass::EFilterType type,
|
||||
TLockedToken<CTexture> tex)
|
||||
: CTexturedQuadFilterAlpha(type, tex->GetBooTexture())
|
||||
{
|
||||
m_tex = tex;
|
||||
}
|
||||
|
||||
URDE_SPECIALIZE_MULTI_BLEND_SHADER(CTexturedQuadFilterAlpha)
|
||||
|
||||
}
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
#include "TMultiBlendShader.hpp"
|
||||
#include "zeus/CMatrix4f.hpp"
|
||||
#include "zeus/CColor.hpp"
|
||||
#include "zeus/CRectangle.hpp"
|
||||
#include "Camera/CCameraFilter.hpp"
|
||||
#include "CToken.hpp"
|
||||
|
||||
@@ -17,6 +18,7 @@ class CTexturedQuadFilter
|
||||
friend struct CTexturedQuadFilterMetalDataBindingFactory;
|
||||
friend struct CTexturedQuadFilterD3DDataBindingFactory;
|
||||
|
||||
protected:
|
||||
struct Vert
|
||||
{
|
||||
zeus::CVector2f m_pos;
|
||||
@@ -25,6 +27,7 @@ class CTexturedQuadFilter
|
||||
|
||||
struct Uniform
|
||||
{
|
||||
zeus::CMatrix4f m_matrix;
|
||||
zeus::CColor m_color;
|
||||
float m_uvScale;
|
||||
};
|
||||
@@ -36,16 +39,33 @@ class CTexturedQuadFilter
|
||||
boo::IShaderDataBinding* m_dataBind = nullptr;
|
||||
Uniform m_uniform;
|
||||
|
||||
CTexturedQuadFilter(boo::ITexture* tex);
|
||||
public:
|
||||
static const zeus::CRectangle DefaultRect;
|
||||
CTexturedQuadFilter(CCameraFilterPass::EFilterType type, TLockedToken<CTexture> tex);
|
||||
CTexturedQuadFilter(CCameraFilterPass::EFilterType type, boo::ITexture* tex);
|
||||
void draw(const zeus::CColor& color, float uvScale);
|
||||
void draw(const zeus::CColor& color, float uvScale, const zeus::CRectangle& rect=DefaultRect);
|
||||
void drawCropped(const zeus::CColor& color, float uvScale);
|
||||
const TLockedToken<CTexture>& GetTex() const { return m_tex; }
|
||||
|
||||
using _CLS = CTexturedQuadFilter;
|
||||
#include "TMultiBlendShaderDecl.hpp"
|
||||
};
|
||||
|
||||
class CTexturedQuadFilterAlpha : public CTexturedQuadFilter
|
||||
{
|
||||
friend struct CTexturedQuadFilterAlphaGLDataBindingFactory;
|
||||
friend struct CTexturedQuadFilterAlphaVulkanDataBindingFactory;
|
||||
friend struct CTexturedQuadFilterAlphaMetalDataBindingFactory;
|
||||
friend struct CTexturedQuadFilterAlphaD3DDataBindingFactory;
|
||||
|
||||
public:
|
||||
CTexturedQuadFilterAlpha(CCameraFilterPass::EFilterType type, TLockedToken<CTexture> tex);
|
||||
CTexturedQuadFilterAlpha(CCameraFilterPass::EFilterType type, boo::ITexture* tex);
|
||||
using _CLS = CTexturedQuadFilterAlpha;
|
||||
#include "TMultiBlendShaderDecl.hpp"
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
#endif // __URDE_CTEXTUREDQUADFILTER_HPP__
|
||||
|
||||
@@ -13,6 +13,7 @@ BOO_GLSL_BINDING_HEAD
|
||||
"\n"
|
||||
"UBINDING0 uniform TexuredQuadUniform\n"
|
||||
"{\n"
|
||||
" mat4 mtx;\n"
|
||||
" vec4 color;\n"
|
||||
" float uvScale;\n"
|
||||
"};\n"
|
||||
@@ -28,7 +29,7 @@ BOO_GLSL_BINDING_HEAD
|
||||
"{\n"
|
||||
" vtf.color = color;\n"
|
||||
" vtf.uv = uvIn.xy * uvScale;\n"
|
||||
" gl_Position = vec4(posIn.xyz, 1.0);\n"
|
||||
" gl_Position = mtx * vec4(posIn.xyz, 1.0);\n"
|
||||
"}\n";
|
||||
|
||||
static const char* FS =
|
||||
@@ -48,6 +49,23 @@ BOO_GLSL_BINDING_HEAD
|
||||
" colorOut = vtf.color * vec4(texture(tex, vtf.uv).rgb, 1.0);\n"
|
||||
"}\n";
|
||||
|
||||
static const char* FSAlpha =
|
||||
"#version 330\n"
|
||||
BOO_GLSL_BINDING_HEAD
|
||||
"struct VertToFrag\n"
|
||||
"{\n"
|
||||
" vec4 color;\n"
|
||||
" vec2 uv;\n"
|
||||
"};\n"
|
||||
"\n"
|
||||
"SBINDING(0) in VertToFrag vtf;\n"
|
||||
"layout(location=0) out vec4 colorOut;\n"
|
||||
"TBINDING0 uniform sampler2D tex;\n"
|
||||
"void main()\n"
|
||||
"{\n"
|
||||
" colorOut = vtf.color * texture(tex, vtf.uv);\n"
|
||||
"}\n";
|
||||
|
||||
URDE_DECL_SPECIALIZE_MULTI_BLEND_SHADER(CTexturedQuadFilter)
|
||||
|
||||
struct CTexturedQuadFilterGLDataBindingFactory : TMultiBlendShader<CTexturedQuadFilter>::IDataBindingFactory
|
||||
@@ -133,4 +151,89 @@ CTexturedQuadFilter::Initialize(boo::VulkanDataFactory::Context& ctx,
|
||||
}
|
||||
#endif
|
||||
|
||||
URDE_DECL_SPECIALIZE_MULTI_BLEND_SHADER(CTexturedQuadFilterAlpha)
|
||||
|
||||
struct CTexturedQuadFilterAlphaGLDataBindingFactory : TMultiBlendShader<CTexturedQuadFilterAlpha>::IDataBindingFactory
|
||||
{
|
||||
boo::IShaderDataBinding* BuildShaderDataBinding(boo::IGraphicsDataFactory::Context& ctx,
|
||||
boo::IShaderPipeline* pipeline,
|
||||
boo::IVertexFormat*,
|
||||
CTexturedQuadFilterAlpha& filter)
|
||||
{
|
||||
boo::GLDataFactory::Context& cctx = static_cast<boo::GLDataFactory::Context&>(ctx);
|
||||
|
||||
const boo::VertexElementDescriptor VtxVmt[] =
|
||||
{
|
||||
{filter.m_vbo, nullptr, boo::VertexSemantic::Position4},
|
||||
{filter.m_vbo, nullptr, boo::VertexSemantic::UV4}
|
||||
};
|
||||
boo::IGraphicsBuffer* bufs[] = {filter.m_uniBuf};
|
||||
boo::PipelineStage stages[] = {boo::PipelineStage::Vertex};
|
||||
boo::ITexture* texs[] = {filter.m_booTex};
|
||||
return cctx.newShaderDataBinding(pipeline,
|
||||
ctx.newVertexFormat(2, VtxVmt), filter.m_vbo, nullptr, nullptr,
|
||||
1, bufs, stages, nullptr, nullptr, 1, texs);
|
||||
}
|
||||
};
|
||||
|
||||
#if BOO_HAS_VULKAN
|
||||
struct CTexturedQuadFilterAlphaVulkanDataBindingFactory : TMultiBlendShader<CTexturedQuadFilterAlpha>::IDataBindingFactory
|
||||
{
|
||||
boo::IShaderDataBinding* BuildShaderDataBinding(boo::IGraphicsDataFactory::Context& ctx,
|
||||
boo::IShaderPipeline* pipeline,
|
||||
boo::IVertexFormat* vtxFmt,
|
||||
CTexturedQuadFilterAlpha& filter)
|
||||
{
|
||||
boo::VulkanDataFactory::Context& cctx = static_cast<boo::VulkanDataFactory::Context&>(ctx);
|
||||
|
||||
boo::IGraphicsBuffer* bufs[] = {filter.m_uniBuf};
|
||||
boo::ITexture* texs[] = {filter.m_booTex};
|
||||
return cctx.newShaderDataBinding(pipeline, vtxFmt,
|
||||
filter.m_vbo, nullptr, nullptr, 1, bufs,
|
||||
nullptr, nullptr, nullptr, 1, texs);
|
||||
}
|
||||
};
|
||||
#endif
|
||||
|
||||
TMultiBlendShader<CTexturedQuadFilterAlpha>::IDataBindingFactory*
|
||||
CTexturedQuadFilterAlpha::Initialize(boo::GLDataFactory::Context& ctx,
|
||||
boo::IShaderPipeline*& alphaPipeOut,
|
||||
boo::IShaderPipeline*& additivePipeOut,
|
||||
boo::IShaderPipeline*& colorMultiplyPipeOut)
|
||||
{
|
||||
const char* texNames[] = {"tex"};
|
||||
const char* uniNames[] = {"TexuredQuadUniform"};
|
||||
alphaPipeOut = ctx.newShaderPipeline(VS, FSAlpha, 1, texNames, 1, uniNames, boo::BlendFactor::SrcAlpha,
|
||||
boo::BlendFactor::InvSrcAlpha, boo::Primitive::TriStrips, false, false, false);
|
||||
additivePipeOut = ctx.newShaderPipeline(VS, FSAlpha, 1, texNames, 1, uniNames, boo::BlendFactor::SrcAlpha,
|
||||
boo::BlendFactor::One, boo::Primitive::TriStrips, false, false, false);
|
||||
colorMultiplyPipeOut = ctx.newShaderPipeline(VS, FSAlpha, 1, texNames, 1, uniNames, boo::BlendFactor::SrcColor,
|
||||
boo::BlendFactor::DstColor, boo::Primitive::TriStrips, false, false, false);
|
||||
return new CTexturedQuadFilterAlphaGLDataBindingFactory;
|
||||
}
|
||||
|
||||
#if BOO_HAS_VULKAN
|
||||
TMultiBlendShader<CTexturedQuadFilterAlpha>::IDataBindingFactory*
|
||||
CTexturedQuadFilterAlpha::Initialize(boo::VulkanDataFactory::Context& ctx,
|
||||
boo::IShaderPipeline*& alphaPipeOut,
|
||||
boo::IShaderPipeline*& additivePipeOut,
|
||||
boo::IShaderPipeline*& colorMultiplyPipeOut,
|
||||
boo::IVertexFormat*& vtxFmtOut)
|
||||
{
|
||||
const boo::VertexElementDescriptor VtxVmt[] =
|
||||
{
|
||||
{nullptr, nullptr, boo::VertexSemantic::Position4},
|
||||
{nullptr, nullptr, boo::VertexSemantic::UV4}
|
||||
};
|
||||
vtxFmtOut = ctx.newVertexFormat(2, VtxVmt);
|
||||
alphaPipeOut = ctx.newShaderPipeline(VS, FSAlpha, vtxFmtOut, boo::BlendFactor::SrcAlpha,
|
||||
boo::BlendFactor::InvSrcAlpha, boo::Primitive::TriStrips, false, false, false);
|
||||
additivePipeOut = ctx.newShaderPipeline(VS, FSAlpha, vtxFmtOut, boo::BlendFactor::SrcAlpha,
|
||||
boo::BlendFactor::One, boo::Primitive::TriStrips, false, false, false);
|
||||
colorMultiplyPipeOut = ctx.newShaderPipeline(VS, FSAlpha, vtxFmtOut, boo::BlendFactor::SrcColor,
|
||||
boo::BlendFactor::DstColor, boo::Primitive::TriStrips, false, false, false);
|
||||
return new CTexturedQuadFilterAlphaVulkanDataBindingFactory;
|
||||
}
|
||||
#endif
|
||||
|
||||
}
|
||||
|
||||
@@ -14,6 +14,7 @@ static const char* VS =
|
||||
"\n"
|
||||
"cbuffer TexuredQuadUniform : register(b0)\n"
|
||||
"{\n"
|
||||
" float4x4 mat;\n"
|
||||
" float4 color;\n"
|
||||
"};\n"
|
||||
"\n"
|
||||
@@ -30,7 +31,7 @@ static const char* VS =
|
||||
" vtf.color = color;\n"
|
||||
" vtf.uv = v.uvIn.xy;\n"
|
||||
" vtf.uv.y = -vtf.uv.y;\n"
|
||||
" vtf.position = float4(v.posIn.xyz, 1.0);\n"
|
||||
" vtf.position = mul(mat, float4(v.posIn.xyz, 1.0));\n"
|
||||
" return vtf;\n"
|
||||
"}\n";
|
||||
|
||||
|
||||
@@ -16,6 +16,7 @@ static const char* VS =
|
||||
"\n"
|
||||
"struct TexuredQuadUniform\n"
|
||||
"{\n"
|
||||
" float4x4 mat;\n"
|
||||
" float4 color;\n"
|
||||
"};\n"
|
||||
"\n"
|
||||
@@ -32,7 +33,7 @@ static const char* VS =
|
||||
" vtf.color = tqu.color;\n"
|
||||
" vtf.uv = v.uvIn.xy;\n"
|
||||
" vtf.uv.y = -vtf.uv.y;\n"
|
||||
" vtf.position = float4(v.posIn.xyz, 1.0);\n"
|
||||
" vtf.position = tqu.mat * float4(v.posIn.xyz, 1.0);\n"
|
||||
" return vtf;\n"
|
||||
"}\n";
|
||||
|
||||
|
||||
Reference in New Issue
Block a user