diff --git a/.idea/vcs.xml b/.idea/vcs.xml
index 0e0360b35..2d5621676 100644
--- a/.idea/vcs.xml
+++ b/.idea/vcs.xml
@@ -14,6 +14,10 @@
+
+
+
+
diff --git a/CMakeLists.txt b/CMakeLists.txt
index aa2aa3384..0434ed540 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -9,14 +9,17 @@ if(APPLE AND NOT CMAKE_OSX_SYSROOT)
OUTPUT_STRIP_TRAILING_WHITESPACE)
endif()
-project(urde)
-
-option(URDE_CROSSCOMPILING "Don't build tools; attempt package import" Off)
+option(URDE_CROSSCOMPILING "Don't build tools; attempt package import" OFF)
if (URDE_CROSSCOMPILING)
set(CMAKE_CROSSCOMPILING On)
- set(HAVE_WORDS_BIGENDIAN_EXITCODE 0)
endif()
+if(CMAKE_CROSSCOMPILING)
+ set(HAVE_WORDS_BIGENDIAN_EXITCODE 0 CACHE INTEGER "Makes soxr happy" FORCE)
+endif()
+
+project(urde)
+
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(BUILD_SHARED_LIBS OFF CACHE BOOL "Force shared libs off" FORCE)
@@ -30,7 +33,11 @@ if(NOT MSVC OR ${CMAKE_CXX_COMPILER_ID} STREQUAL "MSVC")
include(cotire)
endif()
-set(URDE_VECTOR_ISA "sse2" CACHE STRING "Vector ISA to build for (sse2, sse3, sse41, avx, avx2)")
+if (NX)
+ set(URDE_VECTOR_ISA "neon")
+else()
+ set(URDE_VECTOR_ISA "sse2" CACHE STRING "Vector ISA to build for (sse2, sse3, sse41, avx, avx2)")
+endif()
if(MSVC)
if(${URDE_VECTOR_ISA} STREQUAL "avx2")
@@ -99,12 +106,14 @@ else()
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -msse2")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -msse2")
message(STATUS "Building with SSE2 Vector ISA")
+ elseif(${URDE_VECTOR_ISA} STREQUAL "neon")
+ message(STATUS "Building with NEON Vector ISA")
else()
message(STATUS "Building with x87 Vector ISA")
endif()
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}\
- -Wno-multichar -fno-exceptions -Wno-narrowing -Wno-nullability-completeness -Werror=return-type")
+ -Wno-multichar -fno-exceptions -fno-rtti -Wno-narrowing -Wno-nullability-completeness -Werror=return-type")
if(APPLE)
set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -flto=thin")
@@ -141,13 +150,15 @@ if(USE_LD_GOLD AND ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang" OR "${CMAKE_CXX_
endif()
# Add discord-rpc here
-include_directories(${CMAKE_CURRENT_SOURCE_DIR}/rapidjson/include)
-set(PROJECT_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/discord-rpc)
-if (NOT CMAKE_INSTALL_LIBDIR)
- set(CMAKE_INSTALL_LIBDIR ${CMAKE_BINARY_DIR}/fake-prefix)
+if(NOT GEKKO AND NOT NX)
+ include_directories(${CMAKE_CURRENT_SOURCE_DIR}/rapidjson/include)
+ set(PROJECT_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/discord-rpc)
+ if (NOT CMAKE_INSTALL_LIBDIR)
+ set(CMAKE_INSTALL_LIBDIR ${CMAKE_BINARY_DIR}/fake-prefix)
+ endif()
+ add_subdirectory(discord-rpc/src)
+ include_directories(${CMAKE_CURRENT_SOURCE_DIR}/discord-rpc/include)
endif()
-add_subdirectory(discord-rpc/src)
-include_directories(${CMAKE_CURRENT_SOURCE_DIR}/discord-rpc/include)
add_subdirectory(nod)
set(NOD_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/nod/include)
@@ -185,6 +196,10 @@ set(HECL_DATASPEC_PUSHES
hecl::Database::DATA_SPEC_REGISTRY.push_back(&DataSpec::SpecEntMP3);
hecl::Database::DATA_SPEC_REGISTRY.push_back(&DataSpec::SpecEntMP3PC);
hecl::Database::DATA_SPEC_REGISTRY.push_back(&DataSpec::SpecEntMP3ORIG);")
+add_subdirectory(hecl/shaderc)
+include(hecl/ApplicationTools.cmake)
+add_subdirectory(specter/shaders)
+add_subdirectory(Shaders)
add_subdirectory(hecl)
if(NOT TARGET bintoc)
@@ -233,12 +248,14 @@ add_subdirectory(visigen)
add_dependencies(hecl visigen)
-find_package(Qt5Widgets)
-if (Qt5Widgets_FOUND)
+if (NOT WINDOWS_STORE AND NOT NX)
+ find_package(Qt5Widgets)
+ if (Qt5Widgets_FOUND)
message(STATUS "Qt5 found, hecl-gui will be built")
add_subdirectory(hecl-gui)
-else()
+ else()
message(STATUS "Qt5 not found, hecl-gui will not be built")
+ endif()
endif()
unset(GIT_EXECUTABLE CACHE)
diff --git a/DataSpec/DNAMP3/CMDLMaterials.cpp b/DataSpec/DNAMP3/CMDLMaterials.cpp
index 4a2938088..938d05586 100644
--- a/DataSpec/DNAMP3/CMDLMaterials.cpp
+++ b/DataSpec/DNAMP3/CMDLMaterials.cpp
@@ -156,7 +156,7 @@ void MaterialSet::ConstructMaterial(Stream& out,
for (const Material::SectionFactory& factory : material.sections)
{
factory.section->constructNode(out, pakRouter, entry, prevSection, i++, texMapIdx, texMtxIdx, kColorIdx);
- Material::SectionPASS* pass = dynamic_cast(factory.section.get());
+ Material::SectionPASS* pass = Material::SectionPASS::castTo(factory.section.get());
if (!pass || (pass && Material::SectionPASS::Subtype(pass->subtype.toUint32()) != Material::SectionPASS::Subtype::RFLV))
prevSection = factory.section.get();
}
diff --git a/DataSpec/DNAMP3/CMDLMaterials.hpp b/DataSpec/DNAMP3/CMDLMaterials.hpp
index fe8898fb1..222a126e1 100644
--- a/DataSpec/DNAMP3/CMDLMaterials.hpp
+++ b/DataSpec/DNAMP3/CMDLMaterials.hpp
@@ -74,6 +74,8 @@ struct MaterialSet : BigDNA
struct SectionPASS : ISection
{
SectionPASS() : ISection(ISection::Type::PASS) {}
+ static SectionPASS* castTo(ISection* sec)
+ { return sec->m_type == Type::PASS ? static_cast(sec) : nullptr; }
AT_DECL_DNA
AT_DECL_DNAV
Value size;
@@ -126,6 +128,8 @@ struct MaterialSet : BigDNA
struct SectionCLR : ISection
{
SectionCLR() : ISection(ISection::Type::CLR) {}
+ static SectionCLR* castTo(ISection* sec)
+ { return sec->m_type == Type::CLR ? static_cast(sec) : nullptr; }
AT_DECL_DNA
AT_DECL_DNAV
enum class Subtype : atUint32
@@ -148,6 +152,8 @@ struct MaterialSet : BigDNA
struct SectionINT : ISection
{
SectionINT() : ISection(ISection::Type::INT) {}
+ static SectionINT* castTo(ISection* sec)
+ { return sec->m_type == Type::INT ? static_cast(sec) : nullptr; }
AT_DECL_DNA
AT_DECL_DNAV
enum class Subtype : atUint32
diff --git a/Editor/CMakeLists.txt b/Editor/CMakeLists.txt
index 0ea66faf0..1249ff332 100644
--- a/Editor/CMakeLists.txt
+++ b/Editor/CMakeLists.txt
@@ -101,7 +101,9 @@ target_link_libraries(urde
UrdeIcons
UrdeBadging
RuntimeCommon NESEmulator
- specter specter-fonts freetype ${DATA_SPEC_LIBS}
+ specter specter-fonts
+ ${HECL_APPLICATION_REPS_TARGETS_LIST}
+ freetype ${DATA_SPEC_LIBS}
hecl-full hecl-blender-addon
athena-core nod logvisor athena-libyaml amuse boo
${PNG_LIB} libjpeg-turbo squish xxhash zeus
diff --git a/Editor/Space.cpp b/Editor/Space.cpp
index e1d59b7b1..208bf5b21 100644
--- a/Editor/Space.cpp
+++ b/Editor/Space.cpp
@@ -98,7 +98,7 @@ void SplitSpace::joinViews(specter::SplitView* thisSplit, int thisSlot, specter:
{
if (thisSplit == otherSplit)
{
- SplitSpace* thisSS = dynamic_cast(m_slots[thisSlot].get());
+ SplitSpace* thisSS = m_slots[thisSlot]->castToSplitSpace();
if (thisSS)
{
int ax = thisSS->m_state.axis == specter::SplitView::Axis::Horizontal ? 1 : 0;
@@ -115,7 +115,7 @@ void SplitSpace::joinViews(specter::SplitView* thisSplit, int thisSlot, specter:
{
for (int i=0 ; i<2 ; ++i)
{
- SplitSpace* otherSS = dynamic_cast(m_slots[i].get());
+ SplitSpace* otherSS = m_slots[i]->castToSplitSpace();
if (otherSS && otherSS->m_splitView.get() == otherSplit)
{
int ax = m_state.axis == specter::SplitView::Axis::Horizontal ? 1 : 0;
@@ -248,23 +248,23 @@ void Space::SpaceMenuNode::SubNode::activated(const boo::SWindowCoord &coord)
switch(m_data.m_cls)
{
case Class::InformationCenter:
- if (typeid(InformationCenter) != typeid(m_space))
+ if (m_space.cls() == Class::InformationCenter)
newSpace.reset(new InformationCenter(m_space.m_parent->m_vm, m_space.m_parent));
break;
case Class::EffectEditor:
- if (typeid(EffectEditor) != typeid(m_space))
+ if (m_space.cls() == Class::EffectEditor)
newSpace.reset(new EffectEditor(m_space.m_parent->m_vm, m_space.m_parent));
break;
case Class::ResourceBrowser:
- if (typeid(ResourceBrowser) != typeid(m_space))
+ if (m_space.cls() == Class::ResourceBrowser)
newSpace.reset(new ResourceBrowser(m_space.m_parent->m_vm, m_space.m_parent));
break;
case Class::ModelViewer:
- if (typeid(ModelViewer) != typeid(m_space))
+ if (m_space.cls() == Class::ModelViewer)
newSpace.reset(new ModelViewer(m_space.m_parent->m_vm, m_space.m_parent));
break;
case Class::GameMode:
- if (typeid(GameMode) != typeid(m_space))
+ if (m_space.cls() == Class::GameMode)
newSpace.reset(new GameMode(m_space.m_parent->m_vm, m_space.m_parent));
break;
default: break;
diff --git a/Editor/Space.hpp b/Editor/Space.hpp
index d0afcc679..bf069adcc 100644
--- a/Editor/Space.hpp
+++ b/Editor/Space.hpp
@@ -22,6 +22,7 @@ namespace urde
{
class ViewManager;
class RootSpace;
+class SplitSpace;
class Space : public specter::ISpaceController
{
@@ -160,6 +161,8 @@ public:
{return std::unique_ptr();}
virtual specter::View* basisView() {return m_spaceView.get();}
+ Class cls() const { return m_class; }
+ SplitSpace* castToSplitSpace();
};
class RootSpace : public Space
@@ -359,6 +362,8 @@ public:
specter::View* basisView() {return m_splitView.get();}
};
+inline SplitSpace* Space::castToSplitSpace()
+{ return cls() == Class::SplitSpace ? static_cast(this) : nullptr; }
class ViewerSpace : public Space
{
diff --git a/Editor/ViewManager.cpp b/Editor/ViewManager.cpp
index f4f340796..562fbfa9a 100644
--- a/Editor/ViewManager.cpp
+++ b/Editor/ViewManager.cpp
@@ -20,6 +20,7 @@
#include "Audio/CStreamAudioManager.hpp"
#include "Runtime/CStateManager.hpp"
#include "Runtime/World/CPlayer.hpp"
+#include "hecl/Pipeline.hpp"
#include
using YAMLNode = athena::io::YAMLNode;
@@ -292,6 +293,8 @@ void ViewManager::init(boo::IApplication* app)
float pixelFactor = m_mainWindow->getVirtualPixelFactor();
m_mainBooFactory = m_mainWindow->getMainContextDataFactory();
+ m_pipelineConv = hecl::NewPipelineConverter(m_mainBooFactory);
+ hecl::conv = m_pipelineConv.get();
m_mainPlatformName = m_mainBooFactory->platformName();
m_mainWindow->setTitle(_S("URDE [") + hecl::SystemString(m_mainPlatformName) + _S("]"));
m_mainCommandQueue = m_mainWindow->getCommandQueue();
diff --git a/Editor/ViewManager.hpp b/Editor/ViewManager.hpp
index 561e49985..60c564b1d 100644
--- a/Editor/ViewManager.hpp
+++ b/Editor/ViewManager.hpp
@@ -22,6 +22,8 @@
#include "Runtime/Graphics/Shaders/CCameraBlurFilter.hpp"
#include "Runtime/Audio/CStaticAudioPlayer.hpp"
+namespace hecl { class PipelineConverterBase; }
+
namespace urde
{
class SplashScreen;
@@ -43,6 +45,7 @@ class ViewManager final : public specter::IViewManager
specter::Translator m_translator;
boo::IGraphicsDataFactory* m_mainBooFactory = nullptr;
boo::IGraphicsCommandQueue* m_mainCommandQueue = nullptr;
+ std::unique_ptr m_pipelineConv;
boo::ObjToken m_renderTex;
const boo::SystemChar* m_mainPlatformName;
diff --git a/NESEmulator/CNESShader.cpp b/NESEmulator/CNESShader.cpp
index 0f9683f72..5b13168c2 100644
--- a/NESEmulator/CNESShader.cpp
+++ b/NESEmulator/CNESShader.cpp
@@ -1,334 +1,32 @@
#include "CNESShader.hpp"
#include "Graphics/CGraphics.hpp"
+#include "hecl/Pipeline.hpp"
namespace urde::MP1
{
boo::ObjToken CNESShader::g_Pipeline;
-boo::ObjToken CNESShader::g_VtxFmt;
-static const char* VS_GLSL =
-"#version 330\n"
-BOO_GLSL_BINDING_HEAD
-"layout(location=0) in vec4 posIn;\n"
-"layout(location=1) in vec4 uvIn;\n"
-"\n"
-"UBINDING0 uniform TexuredQuadUniform\n"
-"{\n"
-" mat4 mtx;\n"
-" vec4 color;\n"
-"};\n"
-"\n"
-"struct VertToFrag\n"
-"{\n"
-" vec4 color;\n"
-" vec2 uv;\n"
-"};\n"
-"\n"
-"SBINDING(0) out VertToFrag vtf;\n"
-"void main()\n"
-"{\n"
-" vtf.color = color;\n"
-" vtf.uv = uvIn.xy;\n"
-" gl_Position = mtx * vec4(posIn.xyz, 1.0);\n"
-" gl_Position = FLIPFROMGL(gl_Position);\n"
-"}\n";
-
-static const char* FS_GLSL =
-"#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";
-
-#if _WIN32
-static const char* VS_HLSL =
-"struct VertData\n"
-"{\n"
-" float4 posIn : POSITION;\n"
-" float4 uvIn : UV;\n"
-"};\n"
-"\n"
-"cbuffer TexuredQuadUniform : register(b0)\n"
-"{\n"
-" float4x4 mat;\n"
-" float4 color;\n"
-"};\n"
-"\n"
-"struct VertToFrag\n"
-"{\n"
-" float4 position : SV_Position;\n"
-" float4 color : COLOR;\n"
-" float2 uv : UV;\n"
-"};\n"
-"\n"
-"VertToFrag main(in VertData v)\n"
-"{\n"
-" VertToFrag vtf;\n"
-" vtf.color = color;\n"
-" vtf.uv = v.uvIn.xy;\n"
-" vtf.position = mul(mat, float4(v.posIn.xyz, 1.0));\n"
-" return vtf;\n"
-"}\n";
-
-static const char* FS_HLSL =
-"struct VertToFrag\n"
-"{\n"
-" float4 position : SV_Position;\n"
-" float4 color : COLOR;\n"
-" float2 uv : UV;\n"
-"};\n"
-"\n"
-"Texture2D tex : register(t0);\n"
-"SamplerState samp : register(s4);\n"
-"\n"
-"float4 main(in VertToFrag vtf) : SV_Target0\n"
-"{\n"
-" return vtf.color * tex.Sample(samp, vtf.uv);\n"
-"}\n";
-#endif
-
-#if BOO_HAS_METAL
-static const char* VS_METAL =
-"#include \n"
-"using namespace metal;\n"
-"struct VertData\n"
-"{\n"
-" float4 posIn [[ attribute(0) ]];\n"
-" float4 uvIn [[ attribute(1) ]];\n"
-"};\n"
-"\n"
-"struct TexuredQuadUniform\n"
-"{\n"
-" float4x4 mat;\n"
-" float4 color;\n"
-"};\n"
-"\n"
-"struct VertToFrag\n"
-"{\n"
-" float4 position [[ position ]];\n"
-" float4 color;\n"
-" float2 uv;\n"
-"};\n"
-"\n"
-"vertex VertToFrag vmain(VertData v [[ stage_in ]], constant TexuredQuadUniform& tqu [[ buffer(2) ]])\n"
-"{\n"
-" VertToFrag vtf;\n"
-" vtf.color = tqu.color;\n"
-" vtf.uv = v.uvIn.xy;\n"
-" vtf.position = tqu.mat * float4(v.posIn.xyz, 1.0);\n"
-" return vtf;\n"
-"}\n";
-
-
-static const char* FS_METAL =
-"#include \n"
-"using namespace metal;\n"
-"struct VertToFrag\n"
-"{\n"
-" float4 position [[ position ]];\n"
-" float4 color;\n"
-" float2 uv;\n"
-"};\n"
-"\n"
-"fragment float4 fmain(VertToFrag vtf [[ stage_in ]],\n"
-" sampler clampSamp [[ sampler(4) ]],\n"
-" texture2d tex [[ texture(0) ]])\n"
-"{\n"
-" return vtf.color * tex.sample(clampSamp, vtf.uv);\n"
-"}\n";
-#endif
-
-#if BOO_HAS_GL
-void CNESShader::Initialize(boo::GLDataFactory::Context& ctx)
+void CNESShader::Initialize()
{
- const char* texNames[] = {"tex"};
- const char* uniNames[] = {"TexuredQuadUniform"};
- g_Pipeline = ctx.newShaderPipeline(VS_GLSL, FS_GLSL, 1, texNames, 1, uniNames, boo::BlendFactor::SrcAlpha,
- boo::BlendFactor::InvSrcAlpha, boo::Primitive::TriStrips,
- boo::ZTest::None, false, true, false, boo::CullMode::None);
+ g_Pipeline = hecl::conv->convert(Shader_CNESShader{});
}
-boo::ObjToken CNESShader::BuildShaderDataBinding(boo::GLDataFactory::Context& ctx,
- boo::ObjToken vbo,
- boo::ObjToken uniBuf,
- boo::ObjToken tex)
-{
- const boo::VertexElementDescriptor VtxVmt[] =
- {
- {vbo.get(), nullptr, boo::VertexSemantic::Position4},
- {vbo.get(), nullptr, boo::VertexSemantic::UV4}
- };
- boo::ObjToken bufs[] = {uniBuf.get()};
- boo::PipelineStage stages[] = {boo::PipelineStage::Vertex};
- boo::ObjToken texs[] = {tex.get()};
- return ctx.newShaderDataBinding(g_Pipeline,
- ctx.newVertexFormat(2, VtxVmt), vbo.get(), nullptr, nullptr,
- 1, bufs, stages, nullptr, nullptr, 1, texs, nullptr, nullptr);
-}
-#endif
-
-#if _WIN32
-void CNESShader::Initialize(boo::D3DDataFactory::Context& ctx)
-{
- const boo::VertexElementDescriptor VtxVmt[] =
- {
- {nullptr, nullptr, boo::VertexSemantic::Position4},
- {nullptr, nullptr, boo::VertexSemantic::UV4}
- };
- g_VtxFmt = ctx.newVertexFormat(2, VtxVmt);
- g_Pipeline = ctx.newShaderPipeline(VS_HLSL, FS_HLSL, nullptr, nullptr, nullptr,
- g_VtxFmt, boo::BlendFactor::SrcAlpha,
- boo::BlendFactor::InvSrcAlpha, boo::Primitive::TriStrips,
- boo::ZTest::None, false, true, false, boo::CullMode::None);
-}
-
-boo::ObjToken CNESShader::BuildShaderDataBinding(boo::D3DDataFactory::Context& ctx,
- boo::ObjToken vbo,
- boo::ObjToken uniBuf,
- boo::ObjToken tex)
-{
- boo::ObjToken bufs[] = {uniBuf.get()};
- boo::ObjToken texs[] = {tex.get()};
- return ctx.newShaderDataBinding(g_Pipeline, g_VtxFmt,
- vbo.get(), nullptr, nullptr, 1, bufs,
- nullptr, nullptr, nullptr, 1, texs, nullptr, nullptr);
-}
-#endif
-
-#if BOO_HAS_METAL
-void CNESShader::Initialize(boo::MetalDataFactory::Context& ctx)
-{
- const boo::VertexElementDescriptor VtxVmt[] =
- {
- {nullptr, nullptr, boo::VertexSemantic::Position4},
- {nullptr, nullptr, boo::VertexSemantic::UV4}
- };
- g_VtxFmt = ctx.newVertexFormat(2, VtxVmt);
- g_Pipeline = ctx.newShaderPipeline(VS_METAL, FS_METAL, nullptr, nullptr,
- g_VtxFmt, boo::BlendFactor::SrcAlpha,
- boo::BlendFactor::InvSrcAlpha, boo::Primitive::TriStrips,
- boo::ZTest::None, false, true, false, boo::CullMode::None);
-}
-
-boo::ObjToken CNESShader::BuildShaderDataBinding(boo::MetalDataFactory::Context& ctx,
- boo::ObjToken vbo,
- boo::ObjToken uniBuf,
- boo::ObjToken tex)
-{
- boo::ObjToken bufs[] = {uniBuf.get()};
- boo::ObjToken texs[] = {tex.get()};
- return ctx.newShaderDataBinding(g_Pipeline, g_VtxFmt,
- vbo.get(), nullptr, nullptr, 1, bufs,
- nullptr, nullptr, nullptr, 1, texs, nullptr, nullptr);
-}
-#endif
-
-#if BOO_HAS_VULKAN
-void CNESShader::Initialize(boo::VulkanDataFactory::Context& ctx)
-{
- const boo::VertexElementDescriptor VtxVmt[] =
- {
- {nullptr, nullptr, boo::VertexSemantic::Position4},
- {nullptr, nullptr, boo::VertexSemantic::UV4}
- };
- g_VtxFmt = ctx.newVertexFormat(2, VtxVmt);
- g_Pipeline = ctx.newShaderPipeline(VS_GLSL, FS_GLSL, g_VtxFmt, boo::BlendFactor::SrcAlpha,
- boo::BlendFactor::InvSrcAlpha, boo::Primitive::TriStrips,
- boo::ZTest::None, false, true, false, boo::CullMode::None);
-}
-
-boo::ObjToken CNESShader::BuildShaderDataBinding(boo::VulkanDataFactory::Context& ctx,
- boo::ObjToken vbo,
- boo::ObjToken uniBuf,
- boo::ObjToken tex)
-{
- boo::ObjToken bufs[] = {uniBuf.get()};
- boo::ObjToken texs[] = {tex.get()};
- return ctx.newShaderDataBinding(g_Pipeline, g_VtxFmt,
- vbo.get(), nullptr, nullptr, 1, bufs,
- nullptr, nullptr, nullptr, 1, texs, nullptr, nullptr);
-}
-#endif
-
boo::ObjToken CNESShader::BuildShaderDataBinding(boo::IGraphicsDataFactory::Context& ctx,
boo::ObjToken vbo,
boo::ObjToken uniBuf,
boo::ObjToken tex)
{
- switch (ctx.platform())
- {
-#if BOO_HAS_GL
- case boo::IGraphicsDataFactory::Platform::OpenGL:
- return BuildShaderDataBinding(static_cast(ctx), vbo, uniBuf, tex);
-#endif
-#if _WIN32
- case boo::IGraphicsDataFactory::Platform::D3D11:
- return BuildShaderDataBinding(static_cast(ctx), vbo, uniBuf, tex);
-#endif
-#if BOO_HAS_METAL
- case boo::IGraphicsDataFactory::Platform::Metal:
- return BuildShaderDataBinding(static_cast(ctx), vbo, uniBuf, tex);
-#endif
-#if BOO_HAS_VULKAN
- case boo::IGraphicsDataFactory::Platform::Vulkan:
- return BuildShaderDataBinding(static_cast(ctx), vbo, uniBuf, tex);
-#endif
- default:
- return {};
- }
-}
-
-void CNESShader::Initialize()
-{
- if (!CGraphics::g_BooFactory)
- return;
-
- CGraphics::CommitResources(
- [&](boo::IGraphicsDataFactory::Context& ctx)
- {
- switch (ctx.platform())
- {
-#if BOO_HAS_GL
- case boo::IGraphicsDataFactory::Platform::OpenGL:
- Initialize(static_cast(ctx));
- break;
-#endif
-#if _WIN32
- case boo::IGraphicsDataFactory::Platform::D3D11:
- Initialize(static_cast(ctx));
- break;
-#endif
-#if BOO_HAS_METAL
- case boo::IGraphicsDataFactory::Platform::Metal:
- Initialize(static_cast(ctx));
- break;
-#endif
-#if BOO_HAS_VULKAN
- case boo::IGraphicsDataFactory::Platform::Vulkan:
- Initialize(static_cast(ctx));
- break;
-#endif
- default: break;
- }
- return true;
- } BooTrace);
+ boo::ObjToken bufs[] = {uniBuf.get()};
+ boo::PipelineStage stages[] = {boo::PipelineStage::Vertex};
+ boo::ObjToken texs[] = {tex.get()};
+ return ctx.newShaderDataBinding(g_Pipeline, vbo.get(), nullptr, nullptr,
+ 1, bufs, stages, nullptr, nullptr, 1, texs, nullptr, nullptr);
}
void CNESShader::Shutdown()
{
g_Pipeline.reset();
- g_VtxFmt.reset();
}
}
diff --git a/NESEmulator/CNESShader.hpp b/NESEmulator/CNESShader.hpp
index 68b263bae..6253002f8 100644
--- a/NESEmulator/CNESShader.hpp
+++ b/NESEmulator/CNESShader.hpp
@@ -1,10 +1,7 @@
#ifndef URDE_CNESSHADER_HPP
#define URDE_CNESSHADER_HPP
-#include "boo/graphicsdev/GL.hpp"
-#include "boo/graphicsdev/Metal.hpp"
-#include "boo/graphicsdev/D3D.hpp"
-#include "boo/graphicsdev/Vulkan.hpp"
+#include "boo/graphicsdev/IGraphicsDataFactory.hpp"
namespace urde::MP1
{
@@ -12,34 +9,6 @@ namespace urde::MP1
class CNESShader
{
public:
-#if BOO_HAS_GL
- static void Initialize(boo::GLDataFactory::Context& ctx);
- static boo::ObjToken BuildShaderDataBinding(boo::GLDataFactory::Context& ctx,
- boo::ObjToken vbo,
- boo::ObjToken uniBuf,
- boo::ObjToken tex);
-#endif
-#if _WIN32
- static void Initialize(boo::D3DDataFactory::Context& ctx);
- static boo::ObjToken BuildShaderDataBinding(boo::D3DDataFactory::Context& ctx,
- boo::ObjToken vbo,
- boo::ObjToken uniBuf,
- boo::ObjToken tex);
-#endif
-#if BOO_HAS_METAL
- static void Initialize(boo::MetalDataFactory::Context& ctx);
- static boo::ObjToken BuildShaderDataBinding(boo::MetalDataFactory::Context& ctx,
- boo::ObjToken vbo,
- boo::ObjToken uniBuf,
- boo::ObjToken tex);
-#endif
-#if BOO_HAS_VULKAN
- static void Initialize(boo::VulkanDataFactory::Context& ctx);
- static boo::ObjToken BuildShaderDataBinding(boo::VulkanDataFactory::Context& ctx,
- boo::ObjToken vbo,
- boo::ObjToken uniBuf,
- boo::ObjToken tex);
-#endif
static void Initialize();
static void Shutdown();
@@ -49,7 +18,6 @@ public:
boo::ObjToken tex);
static boo::ObjToken g_Pipeline;
- static boo::ObjToken g_VtxFmt;
};
}
diff --git a/Runtime/CArchitectureMessage.hpp b/Runtime/CArchitectureMessage.hpp
index 2431beff9..0426d6bc2 100644
--- a/Runtime/CArchitectureMessage.hpp
+++ b/Runtime/CArchitectureMessage.hpp
@@ -104,7 +104,7 @@ public:
template
const T* GetParm() const
{
- return dynamic_cast(x8_parm.get());
+ return static_cast(x8_parm.get());
}
};
diff --git a/Runtime/Graphics/CMakeLists.txt b/Runtime/Graphics/CMakeLists.txt
index 907833875..0e85e28a0 100644
--- a/Runtime/Graphics/CMakeLists.txt
+++ b/Runtime/Graphics/CMakeLists.txt
@@ -1,85 +1,3 @@
-if(WIN32)
- set(PLAT_SRCS
- Shaders/CLineRendererShadersHLSL.cpp
- Shaders/CTexturedQuadFilterHLSL.cpp
- Shaders/CColoredQuadFilterHLSL.cpp
- Shaders/CModelShadersHLSL.cpp
- Shaders/CThermalColdFilterHLSL.cpp
- Shaders/CThermalHotFilterHLSL.cpp
- Shaders/CSpaceWarpFilterHLSL.cpp
- Shaders/CCameraBlurFilterHLSL.cpp
- Shaders/CXRayBlurFilterHLSL.cpp
- Shaders/CTextSupportShaderHLSL.cpp
- Shaders/CFogVolumePlaneShaderHLSL.cpp
- Shaders/CFogVolumeFilterHLSL.cpp
- Shaders/CEnergyBarShaderHLSL.cpp
- Shaders/CRadarPaintShaderHLSL.cpp
- Shaders/CMapSurfaceShaderHLSL.cpp
- Shaders/CPhazonSuitFilterHLSL.cpp
- Shaders/CScanLinesFilterHLSL.cpp
- Shaders/CRandomStaticFilterHLSL.cpp
- Shaders/CElementGenShadersHLSL.cpp
- Shaders/CDecalShadersHLSL.cpp
- Shaders/CParticleSwooshShadersHLSL.cpp
- Shaders/CFluidPlaneShaderHLSL.cpp
- Shaders/CAABoxShaderHLSL.cpp
- Shaders/CWorldShadowShaderHLSL.cpp)
-elseif(BOO_HAS_METAL)
- set(PLAT_SRCS
- Shaders/CLineRendererShadersMetal.cpp
- Shaders/CTexturedQuadFilterMetal.cpp
- Shaders/CColoredQuadFilterMetal.cpp
- Shaders/CModelShadersMetal.cpp
- Shaders/CThermalColdFilterMetal.cpp
- Shaders/CThermalHotFilterMetal.cpp
- Shaders/CSpaceWarpFilterMetal.cpp
- Shaders/CCameraBlurFilterMetal.cpp
- Shaders/CXRayBlurFilterMetal.cpp
- Shaders/CTextSupportShaderMetal.cpp
- Shaders/CFogVolumePlaneShaderMetal.cpp
- Shaders/CFogVolumeFilterMetal.cpp
- Shaders/CEnergyBarShaderMetal.cpp
- Shaders/CRadarPaintShaderMetal.cpp
- Shaders/CMapSurfaceShaderMetal.cpp
- Shaders/CPhazonSuitFilterMetal.cpp
- Shaders/CScanLinesFilterMetal.cpp
- Shaders/CRandomStaticFilterMetal.cpp
- Shaders/CElementGenShadersMetal.cpp
- Shaders/CDecalShadersMetal.cpp
- Shaders/CParticleSwooshShadersMetal.cpp
- Shaders/CFluidPlaneShaderMetal.cpp
- Shaders/CAABoxShaderMetal.cpp
- Shaders/CWorldShadowShaderMetal.cpp)
-endif()
-
-if(NOT WINDOWS_STORE)
- list(APPEND PLAT_SRCS
- Shaders/CLineRendererShadersGLSL.cpp
- Shaders/CTexturedQuadFilterGLSL.cpp
- Shaders/CColoredQuadFilterGLSL.cpp
- Shaders/CModelShadersGLSL.cpp
- Shaders/CThermalColdFilterGLSL.cpp
- Shaders/CThermalHotFilterGLSL.cpp
- Shaders/CSpaceWarpFilterGLSL.cpp
- Shaders/CCameraBlurFilterGLSL.cpp
- Shaders/CXRayBlurFilterGLSL.cpp
- Shaders/CTextSupportShaderGLSL.cpp
- Shaders/CFogVolumePlaneShaderGLSL.cpp
- Shaders/CFogVolumeFilterGLSL.cpp
- Shaders/CEnergyBarShaderGLSL.cpp
- Shaders/CRadarPaintShaderGLSL.cpp
- Shaders/CMapSurfaceShaderGLSL.cpp
- Shaders/CPhazonSuitFilterGLSL.cpp
- Shaders/CScanLinesFilterGLSL.cpp
- Shaders/CRandomStaticFilterGLSL.cpp
- Shaders/CElementGenShadersGLSL.cpp
- Shaders/CDecalShadersGLSL.cpp
- Shaders/CParticleSwooshShadersGLSL.cpp
- Shaders/CFluidPlaneShaderGLSL.cpp
- Shaders/CAABoxShaderGLSL.cpp
- Shaders/CWorldShadowShaderGLSL.cpp)
-endif()
-
set(GRAPHICS_SOURCES
IRenderer.hpp
IWeaponRenderer.hpp IWeaponRenderer.cpp
@@ -101,12 +19,11 @@ set(GRAPHICS_SOURCES
CGraphics.hpp CGraphics.cpp
CSimpleShadow.hpp CSimpleShadow.cpp
CRainSplashGenerator.hpp CRainSplashGenerator.cpp
- Shaders/TShader.hpp Shaders/TMultiBlendShader.hpp
- Shaders/TShaderDecl.hpp Shaders/TMultiBlendShaderDecl.hpp
Shaders/CLineRendererShaders.hpp Shaders/CLineRendererShaders.cpp
Shaders/CTexturedQuadFilter.hpp Shaders/CTexturedQuadFilter.cpp
Shaders/CColoredQuadFilter.hpp Shaders/CColoredQuadFilter.cpp
Shaders/CModelShaders.hpp Shaders/CModelShaders.cpp
+ Shaders/CModelShadersGLSL.cpp Shaders/CModelShadersHLSL.cpp Shaders/CModelShadersMetal.cpp
Shaders/CThermalColdFilter.hpp Shaders/CThermalColdFilter.cpp
Shaders/CThermalHotFilter.hpp Shaders/CThermalHotFilter.cpp
Shaders/CSpaceWarpFilter.hpp Shaders/CSpaceWarpFilter.cpp
@@ -126,7 +43,6 @@ set(GRAPHICS_SOURCES
Shaders/CParticleSwooshShaders.hpp Shaders/CParticleSwooshShaders.cpp
Shaders/CFluidPlaneShader.hpp Shaders/CFluidPlaneShader.cpp
Shaders/CAABoxShader.hpp Shaders/CAABoxShader.cpp
- Shaders/CWorldShadowShader.hpp Shaders/CWorldShadowShader.cpp
- ${PLAT_SRCS})
+ Shaders/CWorldShadowShader.hpp Shaders/CWorldShadowShader.cpp)
runtime_add_list(Graphics GRAPHICS_SOURCES)
diff --git a/Runtime/Graphics/CMetroidModelInstance.hpp b/Runtime/Graphics/CMetroidModelInstance.hpp
index fbc878039..ccf7d96be 100644
--- a/Runtime/Graphics/CMetroidModelInstance.hpp
+++ b/Runtime/Graphics/CMetroidModelInstance.hpp
@@ -5,8 +5,8 @@
#include "RetroTypes.hpp"
#include "zeus/CTransform.hpp"
#include "zeus/CAABox.hpp"
-#include "hecl/Runtime.hpp"
#include "hecl/HMDLMeta.hpp"
+#include "Shaders/CModelShaders.hpp"
namespace urde
{
@@ -24,7 +24,7 @@ class CMetroidModelInstance
std::vector m_surfaces;
std::unique_ptr m_instance;
hecl::HMDLMeta m_hmdlMeta;
- std::unordered_map> m_shaders;
+ std::unordered_map m_shaders;
public:
CMetroidModelInstance() = default;
CMetroidModelInstance(CMetroidModelInstance&&) = default;
diff --git a/Runtime/Graphics/CModel.hpp b/Runtime/Graphics/CModel.hpp
index 1e086ddc4..d4dbae713 100644
--- a/Runtime/Graphics/CModel.hpp
+++ b/Runtime/Graphics/CModel.hpp
@@ -103,18 +103,20 @@ struct GeometryUniformLayout
struct SShader
{
+
+
std::vector> x0_textures;
- std::unordered_map> m_shaders;
+ std::unordered_map m_shaders;
MaterialSet m_matSet;
std::experimental::optional m_geomLayout;
int m_matSetIdx;
SShader(int idx) : m_matSetIdx(idx) {}
void InitializeLayout(const CModel* model) { m_geomLayout.emplace(model, &m_matSet); }
void UnlockTextures();
- std::shared_ptr
+ CModelShaders::ShaderPipelines
BuildShader(const hecl::HMDLMeta& meta, const MaterialSet::Material& mat);
void BuildShaders(const hecl::HMDLMeta& meta,
- std::unordered_map>& shaders);
+ std::unordered_map& shaders);
void BuildShaders(const hecl::HMDLMeta& meta) { BuildShaders(meta, m_shaders); }
};
@@ -144,7 +146,7 @@ private:
const MaterialSet* x4_matSet;
const GeometryUniformLayout* m_geomLayout;
int m_matSetIdx = -1;
- const std::unordered_map>* m_pipelines;
+ const std::unordered_map* m_pipelines;
std::vector> x1c_textures;
zeus::CAABox x20_aabb;
CBooSurface* x38_firstUnsortedSurface = nullptr;
@@ -170,15 +172,12 @@ private:
boo::ObjToken m_geomUniformBuffer;
boo::ObjToken m_uniformBuffer;
std::vector>> m_shaderDataBindings;
- boo::ObjToken m_dynamicVtxFmt;
boo::ObjToken m_dynamicVbo;
boo::ObjToken GetBooVBO(const CBooModel& model, boo::IGraphicsDataFactory::Context& ctx);
- boo::ObjToken GetBooVtxFmt(const CBooModel& model, boo::IGraphicsDataFactory::Context& ctx);
};
std::vector m_instances;
- boo::ObjToken m_staticVtxFmt;
boo::ObjToken m_staticVbo;
boo::ObjToken m_staticIbo;
@@ -206,9 +205,8 @@ private:
public:
~CBooModel();
CBooModel(TToken& token, CModel* parent, std::vector* surfaces, SShader& shader,
- const boo::ObjToken& vtxFmt, const boo::ObjToken& vbo,
- const boo::ObjToken& ibo, const zeus::CAABox& aabb, u8 renderMask,
- int numInsts, const boo::ObjToken txtrOverrides[8]);
+ const boo::ObjToken& vbo, const boo::ObjToken& ibo,
+ const zeus::CAABox& aabb, u8 renderMask, int numInsts, const boo::ObjToken txtrOverrides[8]);
static void MakeTexturesFromMats(const MaterialSet& matSet,
std::vector>& toksOut,
@@ -221,7 +219,7 @@ public:
void DisableAllLights();
void RemapMaterialData(SShader& shader);
void RemapMaterialData(SShader& shader,
- const std::unordered_map>& pipelines);
+ const std::unordered_map& pipelines);
bool TryLockTextures() const;
void UnlockTextures() const;
void SyncLoadTextures() const;
@@ -292,7 +290,6 @@ class CModel
int x38_lastFrame;
/* urde addition: boo! */
- boo::ObjToken m_staticVtxFmt;
boo::ObjToken m_staticVbo;
hecl::HMDLMeta m_hmdlMeta;
std::unique_ptr m_dynamicVertexData;
diff --git a/Runtime/Graphics/CModelBoo.cpp b/Runtime/Graphics/CModelBoo.cpp
index dfc411dbc..2de52dabe 100644
--- a/Runtime/Graphics/CModelBoo.cpp
+++ b/Runtime/Graphics/CModelBoo.cpp
@@ -155,13 +155,12 @@ CBooModel::~CBooModel()
}
CBooModel::CBooModel(TToken& token, CModel* parent, std::vector* surfaces, SShader& shader,
- const boo::ObjToken& vtxFmt, const boo::ObjToken& vbo,
- const boo::ObjToken& ibo, const zeus::CAABox& aabb, u8 renderMask,
- int numInsts, const boo::ObjToken txtrOverrides[8])
+ const boo::ObjToken& vbo, const boo::ObjToken& ibo,
+ const zeus::CAABox& aabb, u8 renderMask, int numInsts, const boo::ObjToken txtrOverrides[8])
: m_modelTok(token), m_model(parent), x0_surfaces(surfaces), x4_matSet(&shader.m_matSet),
m_geomLayout(&*shader.m_geomLayout), m_matSetIdx(shader.m_matSetIdx), m_pipelines(&shader.m_shaders),
x1c_textures(shader.x0_textures), x20_aabb(aabb), x40_24_texturesLoaded(false), x40_25_modelVisible(0),
- x41_mask(renderMask), m_staticVtxFmt(vtxFmt), m_staticVbo(vbo), m_staticIbo(ibo)
+ x41_mask(renderMask), m_staticVbo(vbo), m_staticIbo(ibo)
{
if (txtrOverrides)
for (int i=0 ; i<8 ; ++i)
@@ -217,21 +216,6 @@ CBooModel::ModelInstance::GetBooVBO(const CBooModel& model,
return m_dynamicVbo.get();
}
-boo::ObjToken
-CBooModel::ModelInstance::GetBooVtxFmt(const CBooModel& model,
- boo::IGraphicsDataFactory::Context& ctx)
-{
- if (model.m_staticVtxFmt)
- return model.m_staticVtxFmt;
- if (!m_dynamicVtxFmt && model.m_model)
- {
- const CModel& parent = *model.m_model;
- m_dynamicVtxFmt = hecl::Runtime::HMDLData::NewVertexFormat(ctx, parent.m_hmdlMeta,
- GetBooVBO(model, ctx), parent.m_ibo.get());
- }
- return m_dynamicVtxFmt;
-}
-
GeometryUniformLayout::GeometryUniformLayout(const CModel* model, const MaterialSet* matSet)
{
if (model)
@@ -418,14 +402,14 @@ CBooModel::ModelInstance* CBooModel::PushNewModelInstance(int sharedLayoutBuf)
}
thisSizes[3] = 256;
- const std::shared_ptr& pipelines = m_pipelines->at(surf.m_data.matIdx);
+ const CModelShaders::ShaderPipelines& pipelines = m_pipelines->at(surf.m_data.matIdx);
newInst.m_shaderDataBindings.emplace_back();
std::vector>& extendeds = newInst.m_shaderDataBindings.back();
- extendeds.reserve(pipelines->m_pipelines.size());
+ extendeds.reserve(pipelines->size());
int idx = 0;
- for (const boo::ObjToken& pipeline : pipelines->m_pipelines)
+ for (const auto& pipeline : *pipelines)
{
boo::ObjToken* ltexs;
if (idx == EExtendedShader::Thermal)
@@ -454,7 +438,7 @@ CBooModel::ModelInstance* CBooModel::PushNewModelInstance(int sharedLayoutBuf)
ltexs = texs;
}
extendeds.push_back(
- ctx.newShaderDataBinding(pipeline, newInst.GetBooVtxFmt(*this, ctx),
+ ctx.newShaderDataBinding(pipeline,
newInst.GetBooVBO(*this, ctx), nullptr, m_staticIbo.get(), 4, bufs,
stages, thisOffs, thisSizes, 8, ltexs, nullptr, nullptr));
++idx;
@@ -513,7 +497,7 @@ void CBooModel::RemapMaterialData(SShader& shader)
}
void CBooModel::RemapMaterialData(SShader& shader,
- const std::unordered_map>& pipelines)
+ const std::unordered_map& pipelines)
{
if (!shader.m_geomLayout)
return;
@@ -1204,14 +1188,13 @@ std::unique_ptr CModel::MakeNewInstance(int shaderIdx, int subInsts,
if (shaderIdx >= x18_matSets.size())
shaderIdx = 0;
auto ret = std::make_unique(m_selfToken, this, &x8_surfaces, x18_matSets[shaderIdx],
- m_staticVtxFmt, m_staticVbo, m_ibo,
- m_aabb, (m_flags & 0x2) != 0, subInsts, txtrOverrides);
+ m_staticVbo, m_ibo, m_aabb, (m_flags & 0x2) != 0, subInsts, txtrOverrides);
if (lockParent)
ret->LockParent();
return ret;
}
-std::shared_ptr
+CModelShaders::ShaderPipelines
SShader::BuildShader(const hecl::HMDLMeta& meta, const MaterialSet::Material& mat)
{
hecl::Backend::ReflectionType reflectionType;
@@ -1221,16 +1204,15 @@ SShader::BuildShader(const hecl::HMDLMeta& meta, const MaterialSet::Material& ma
reflectionType = hecl::Backend::ReflectionType::Simple;
else
reflectionType = hecl::Backend::ReflectionType::None;
- hecl::Runtime::ShaderTag tag(mat.heclIr,
+ hecl::Backend::ShaderTag tag(mat.heclIr,
meta.colorCount, meta.uvCount, meta.weightCount,
meta.weightCount * 4, boo::Primitive(meta.topology),
reflectionType, true, true, true);
- return CModelShaders::g_ModelShaders->buildExtendedShader
- (tag, mat.heclIr, "CMDL", *CGraphics::g_BooFactory);
+ return CModelShaders::BuildExtendedShader(tag, mat.heclIr);
}
void SShader::BuildShaders(const hecl::HMDLMeta& meta,
- std::unordered_map>& shaders)
+ std::unordered_map& shaders)
{
shaders.reserve(m_matSet.materials.size());
int idx = 0;
@@ -1294,7 +1276,6 @@ CModel::CModel(std::unique_ptr&& in, u32 /* dataLen */, IObjectStore* stor
if (m_hmdlMeta.vertCount)
m_staticVbo = ctx.newStaticBuffer(boo::BufferUse::Vertex, vboData,
m_hmdlMeta.vertStride, m_hmdlMeta.vertCount);
- m_staticVtxFmt = hecl::Runtime::HMDLData::NewVertexFormat(ctx, m_hmdlMeta, m_staticVbo.get(), m_ibo.get());
}
else
{
diff --git a/Runtime/Graphics/CMoviePlayer.cpp b/Runtime/Graphics/CMoviePlayer.cpp
index dcdff70ea..7a20fec40 100644
--- a/Runtime/Graphics/CMoviePlayer.cpp
+++ b/Runtime/Graphics/CMoviePlayer.cpp
@@ -5,158 +5,12 @@
#include "Audio/g721.h"
#include "amuse/DSPCodec.hpp"
#include "CDvdRequest.hpp"
+#include "hecl/Pipeline.hpp"
#include
namespace urde
{
-static const char* VS_GLSL_YUV =
-"#version 330\n"
-BOO_GLSL_BINDING_HEAD
-"layout(location=0) in vec3 posIn;\n"
-"layout(location=1) in vec2 uvIn;\n"
-SPECTER_GLSL_VIEW_VERT_BLOCK
-"struct VertToFrag\n"
-"{\n"
-" vec4 color;\n"
-" vec2 uv;\n"
-"};\n"
-"SBINDING(0) out VertToFrag vtf;\n"
-"void main()\n"
-"{\n"
-" vtf.uv = uvIn;\n"
-" vtf.color = mulColor;\n"
-" gl_Position = mv * vec4(posIn, 1.0);\n"
-" gl_Position = FLIPFROMGL(gl_Position);\n"
-"}\n";
-
-static const char* FS_GLSL_YUV =
-"#version 330\n"
-BOO_GLSL_BINDING_HEAD
-"struct VertToFrag\n"
-"{\n"
-" vec4 color;\n"
-" vec2 uv;\n"
-"};\n"
-"SBINDING(0) in VertToFrag vtf;\n"
-"TBINDING0 uniform sampler2D texY;\n"
-"TBINDING1 uniform sampler2D texU;\n"
-"TBINDING2 uniform sampler2D texV;\n"
-"layout(location=0) out vec4 colorOut;\n"
-"void main()\n"
-"{\n"
-" vec3 yuv;\n"
-" yuv.r = texture(texY, vtf.uv).r;\n"
-" yuv.g = texture(texU, vtf.uv).r;\n"
-" yuv.b = texture(texV, vtf.uv).r;\n"
-" yuv.r = 1.1643*(yuv.r-0.0625);\n"
-" yuv.g = yuv.g-0.5;\n"
-" yuv.b = yuv.b-0.5;\n"
-" colorOut = vec4(yuv.r+1.5958*yuv.b,\n"
-" yuv.r-0.39173*yuv.g-0.81290*yuv.b,\n"
-" yuv.r+2.017*yuv.g, 1.0) * vtf.color;\n"
-"}\n";
-
-#if _WIN32
-static const char* VS_HLSL_YUV =
-"struct VertData\n"
-"{\n"
-" float3 posIn : POSITION;\n"
-" float2 uvIn : UV;\n"
-"};\n"
-SPECTER_HLSL_VIEW_VERT_BLOCK
-"struct VertToFrag\n"
-"{\n"
-" float4 position : SV_Position;\n"
-" float4 color : COLOR;\n"
-" float2 uv : UV;\n"
-"};\n"
-"VertToFrag main(in VertData v)\n"
-"{\n"
-" VertToFrag vtf;\n"
-" vtf.uv = v.uvIn;\n"
-" vtf.color = mulColor;\n"
-" vtf.position = mul(mv, float4(v.posIn, 1.0));\n"
-" return vtf;\n"
-"}\n";
-
-static const char* FS_HLSL_YUV =
-"struct VertToFrag\n"
-"{\n"
-" float4 position : SV_Position;\n"
-" float4 color : COLOR;\n"
-" float2 uv : UV;\n"
-"};\n"
-"Texture2D texs[3] : register(t0);\n"
-"SamplerState samp : register(s0);\n"
-"float4 main(in VertToFrag vtf) : SV_Target0\n"
-"{\n"
-" float3 yuv;\n"
-" yuv.r = texs[0].Sample(samp, vtf.uv).r;\n"
-" yuv.g = texs[1].Sample(samp, vtf.uv).r;\n"
-" yuv.b = texs[2].Sample(samp, vtf.uv).r;\n"
-" yuv.r = 1.1643*(yuv.r-0.0625);\n"
-" yuv.g = yuv.g-0.5;\n"
-" yuv.b = yuv.b-0.5;\n"
-" return float4(yuv.r+1.5958*yuv.b,\n"
-" yuv.r-0.39173*yuv.g-0.81290*yuv.b,\n"
-" yuv.r+2.017*yuv.g, 1.0) * vtf.color;\n"
-"}\n";
-#endif
-
-#if BOO_HAS_METAL
-static const char* VS_METAL_YUV =
-"#include \n"
-"using namespace metal;\n"
-"struct VertData\n"
-"{\n"
-" float3 posIn [[ attribute(0) ]];\n"
-" float2 uvIn [[ attribute(1) ]];\n"
-"};\n"
-SPECTER_METAL_VIEW_VERT_BLOCK
-"struct VertToFrag\n"
-"{\n"
-" float4 position [[ position ]];\n"
-" float4 color;\n"
-" float2 uv;\n"
-"};\n"
-"vertex VertToFrag vmain(VertData v [[ stage_in ]], constant SpecterViewBlock& view [[ buffer(2) ]])\n"
-"{\n"
-" VertToFrag vtf;\n"
-" vtf.uv = v.uvIn;\n"
-" vtf.color = view.mulColor;\n"
-" vtf.position = view.mv * float4(v.posIn, 1.0);\n"
-" return vtf;\n"
-"}\n";
-
-static const char* FS_METAL_YUV =
-"#include \n"
-"using namespace metal;\n"
-"struct VertToFrag\n"
-"{\n"
-" float4 position [[ position ]];\n"
-" float4 color;\n"
-" float2 uv;\n"
-"};\n"
-"fragment float4 fmain(VertToFrag vtf [[ stage_in ]],\n"
-" sampler samp [[ sampler(0) ]],\n"
-" texture2d tex0 [[ texture(0) ]],\n"
-" texture2d tex1 [[ texture(1) ]],\n"
-" texture2d tex2 [[ texture(2) ]])\n"
-"{\n"
-" float3 yuv;\n"
-" yuv.r = tex0.sample(samp, vtf.uv).r;\n"
-" yuv.g = tex1.sample(samp, vtf.uv).r;\n"
-" yuv.b = tex2.sample(samp, vtf.uv).r;\n"
-" yuv.r = 1.1643*(yuv.r-0.0625);\n"
-" yuv.g = yuv.g-0.5;\n"
-" yuv.b = yuv.b-0.5;\n"
-" return float4(yuv.r+1.5958*yuv.b,\n"
-" yuv.r-0.39173*yuv.g-0.81290*yuv.b,\n"
-" yuv.r+2.017*yuv.g, 1.0) * vtf.color;\n"
-"}\n";
-#endif
-
/* used in the original to look up fixed-point dividends on a
* MIDI-style volume scale (0-127) -> (n/0x8000) */
static const u16 StaticVolumeLookup[] =
@@ -180,7 +34,6 @@ static const u16 StaticVolumeLookup[] =
};
/* shared boo resources */
-static boo::ObjToken YUVVTXFmt;
static boo::ObjToken YUVShaderPipeline;
static tjhandle TjHandle = nullptr;
@@ -202,63 +55,12 @@ static const char* TexNames[] = {"texY", "texU", "texV"};
void CMoviePlayer::Initialize()
{
- CGraphics::CommitResources([&](boo::IGraphicsDataFactory::Context& ctx)
- {
- if (!ctx.bindingNeedsVertexFormat())
- {
- boo::VertexElementDescriptor texvdescs[] =
- {
- {nullptr, nullptr, boo::VertexSemantic::Position4},
- {nullptr, nullptr, boo::VertexSemantic::UV4}
- };
- YUVVTXFmt = ctx.newVertexFormat(2, texvdescs);
- }
-
- switch (ctx.platform())
- {
-#if BOO_HAS_GL
- case boo::IGraphicsDataFactory::Platform::OpenGL:
- YUVShaderPipeline = static_cast(ctx).newShaderPipeline
- (VS_GLSL_YUV, FS_GLSL_YUV, 3, TexNames, 1, BlockNames,
- boo::BlendFactor::SrcAlpha, boo::BlendFactor::InvSrcAlpha,
- boo::Primitive::TriStrips, boo::ZTest::None, false, true, false, boo::CullMode::None);
- break;
-#endif
-#if _WIN32
- case boo::IGraphicsDataFactory::Platform::D3D11:
- YUVShaderPipeline = static_cast(ctx).newShaderPipeline
- (VS_HLSL_YUV, FS_HLSL_YUV, nullptr, nullptr, nullptr, YUVVTXFmt,
- boo::BlendFactor::SrcAlpha, boo::BlendFactor::InvSrcAlpha,
- boo::Primitive::TriStrips, boo::ZTest::None, false, true, false, boo::CullMode::None);
- break;
-#endif
-#if BOO_HAS_METAL
- case boo::IGraphicsDataFactory::Platform::Metal:
- YUVShaderPipeline = static_cast(ctx).newShaderPipeline
- (VS_METAL_YUV, FS_METAL_YUV, nullptr, nullptr, YUVVTXFmt,
- boo::BlendFactor::SrcAlpha, boo::BlendFactor::InvSrcAlpha,
- boo::Primitive::TriStrips, boo::ZTest::None, false, true, false, boo::CullMode::None);
- break;
-#endif
-#if BOO_HAS_VULKAN
- case boo::IGraphicsDataFactory::Platform::Vulkan:
- YUVShaderPipeline = static_cast(ctx).newShaderPipeline
- (VS_GLSL_YUV, FS_GLSL_YUV, YUVVTXFmt,
- boo::BlendFactor::SrcAlpha, boo::BlendFactor::InvSrcAlpha,
- boo::Primitive::TriStrips, boo::ZTest::None, false, true, false, boo::CullMode::None);
- break;
-#endif
- default: break;
- }
- return true;
- } BooTrace);
-
+ YUVShaderPipeline = hecl::conv->convert(Shader_CMoviePlayerShader{});
TjHandle = tjInitDecompress();
}
void CMoviePlayer::Shutdown()
{
- YUVVTXFmt.reset();
YUVShaderPipeline.reset();
tjDestroy(TjHandle);
}
@@ -434,17 +236,6 @@ CMoviePlayer::CMoviePlayer(const char* path, float preLoadSeconds, bool loop, bo
m_blockBuf = ctx.newDynamicBuffer(boo::BufferUse::Uniform, sizeof(m_viewVertBlock), 1);
m_vertBuf = ctx.newDynamicBuffer(boo::BufferUse::Vertex, sizeof(specter::View::TexShaderVert), 4);
- boo::ObjToken vtxFmt = YUVVTXFmt;
- if (ctx.bindingNeedsVertexFormat())
- {
- boo::VertexElementDescriptor texvdescs[] =
- {
- {m_vertBuf.get(), nullptr, boo::VertexSemantic::Position4},
- {m_vertBuf.get(), nullptr, boo::VertexSemantic::UV4}
- };
- vtxFmt = ctx.newVertexFormat(2, texvdescs);
- }
-
/* Allocate textures here (rather than at decode time) */
x80_textures.reserve(3);
for (int i=0 ; i<3 ; ++i)
@@ -467,7 +258,7 @@ CMoviePlayer::CMoviePlayer(const char* path, float preLoadSeconds, bool loop, bo
for (int j=0 ; j<2 ; ++j)
{
boo::ObjToken texs[] = {set.Y[j].get(), set.U.get(), set.V.get()};
- set.binding[j] = ctx.newShaderDataBinding(YUVShaderPipeline, vtxFmt, m_vertBuf.get(),
+ set.binding[j] = ctx.newShaderDataBinding(YUVShaderPipeline, m_vertBuf.get(),
nullptr, nullptr, 1, bufs, nullptr,
3, texs, nullptr, nullptr);
}
@@ -484,7 +275,7 @@ CMoviePlayer::CMoviePlayer(const char* path, float preLoadSeconds, bool loop, bo
boo::ObjToken bufs[] = {m_blockBuf.get()};
boo::ObjToken texs[] = {set.Y[0].get(), set.U.get(), set.V.get()};
- set.binding[0] = ctx.newShaderDataBinding(YUVShaderPipeline, vtxFmt, m_vertBuf.get(),
+ set.binding[0] = ctx.newShaderDataBinding(YUVShaderPipeline, m_vertBuf.get(),
nullptr, nullptr, 1, bufs, nullptr,
3, texs, nullptr, nullptr);
}
diff --git a/Runtime/Graphics/Shaders/CAABoxShader.cpp b/Runtime/Graphics/Shaders/CAABoxShader.cpp
index 6c4442fe6..bd9590f9b 100644
--- a/Runtime/Graphics/Shaders/CAABoxShader.cpp
+++ b/Runtime/Graphics/Shaders/CAABoxShader.cpp
@@ -1,16 +1,36 @@
#include "CAABoxShader.hpp"
+#include "hecl/Pipeline.hpp"
+#include "Graphics/CGraphics.hpp"
namespace urde
{
-CAABoxShader::CAABoxShader(bool zOnly)
-: m_zOnly(zOnly)
+static boo::ObjToken s_Pipeline;
+static boo::ObjToken s_zOnlyPipeline;
+
+void CAABoxShader::Initialize()
{
- CGraphics::CommitResources([&](boo::IGraphicsDataFactory::Context& ctx)
+ s_Pipeline = hecl::conv->convert(Shader_CAABoxShader{});
+ s_zOnlyPipeline = hecl::conv->convert(Shader_CAABoxShaderZOnly{});
+}
+
+void CAABoxShader::Shutdown()
+{
+ s_Pipeline.reset();
+ s_zOnlyPipeline.reset();
+}
+
+CAABoxShader::CAABoxShader(bool zOnly)
+{
+ CGraphics::CommitResources([this, zOnly](boo::IGraphicsDataFactory::Context& ctx)
{
m_vbo = ctx.newDynamicBuffer(boo::BufferUse::Vertex, sizeof(zeus::CVector3f), 34);
m_uniBuf = ctx.newDynamicBuffer(boo::BufferUse::Uniform, sizeof(Uniform), 1);
- m_dataBind = TShader::BuildShaderDataBinding(ctx, *this);
+ boo::ObjToken bufs[] = {m_uniBuf.get()};
+ boo::PipelineStage stages[] = {boo::PipelineStage::Vertex};
+ m_dataBind = ctx.newShaderDataBinding(zOnly ? s_zOnlyPipeline : s_Pipeline,
+ m_vbo.get(), nullptr, nullptr, 1, bufs, stages,
+ nullptr, nullptr, 0, nullptr, nullptr, nullptr);
return true;
} BooTrace);
}
@@ -73,6 +93,4 @@ void CAABoxShader::draw(const zeus::CColor& color)
CGraphics::DrawArray(0, 34);
}
-URDE_SPECIALIZE_SHADER(CAABoxShader)
-
}
diff --git a/Runtime/Graphics/Shaders/CAABoxShader.hpp b/Runtime/Graphics/Shaders/CAABoxShader.hpp
index 33b5ac27c..d81511301 100644
--- a/Runtime/Graphics/Shaders/CAABoxShader.hpp
+++ b/Runtime/Graphics/Shaders/CAABoxShader.hpp
@@ -1,7 +1,7 @@
#ifndef __URDE_CAABOXSHADER_HPP__
#define __URDE_CAABOXSHADER_HPP__
-#include "TShader.hpp"
+#include "boo/graphicsdev/IGraphicsDataFactory.hpp"
#include "zeus/CMatrix4f.hpp"
#include "zeus/CColor.hpp"
#include "zeus/CAABox.hpp"
@@ -11,11 +11,6 @@ namespace urde
class CAABoxShader
{
- friend struct CAABoxShaderGLDataBindingFactory;
- friend struct CAABoxShaderVulkanDataBindingFactory;
- friend struct CAABoxShaderMetalDataBindingFactory;
- friend struct CAABoxShaderD3DDataBindingFactory;
-
struct Uniform
{
zeus::CMatrix4f m_xf;
@@ -25,15 +20,13 @@ class CAABoxShader
boo::ObjToken m_uniBuf;
boo::ObjToken m_dataBind;
Uniform m_uniform;
- bool m_zOnly;
public:
+ static void Initialize();
+ static void Shutdown();
CAABoxShader(bool zOnly);
void setAABB(const zeus::CAABox& aabb);
void draw(const zeus::CColor& color);
-
- using _CLS = CAABoxShader;
-#include "TShaderDecl.hpp"
};
}
diff --git a/Runtime/Graphics/Shaders/CAABoxShaderGLSL.cpp b/Runtime/Graphics/Shaders/CAABoxShaderGLSL.cpp
deleted file mode 100644
index 86d020978..000000000
--- a/Runtime/Graphics/Shaders/CAABoxShaderGLSL.cpp
+++ /dev/null
@@ -1,132 +0,0 @@
-#include "CAABoxShader.hpp"
-#include "Graphics/CBooRenderer.hpp"
-
-namespace urde
-{
-
-static const char* VS =
-"#version 330\n"
-BOO_GLSL_BINDING_HEAD
-"layout(location=0) in vec4 posIn;\n"
-"\n"
-"UBINDING0 uniform CAABoxUniform\n"
-"{\n"
-" mat4 xf;\n"
-" vec4 color;\n"
-"};\n"
-"\n"
-"struct VertToFrag\n"
-"{\n"
-" vec4 color;\n"
-"};\n"
-"\n"
-"SBINDING(0) out VertToFrag vtf;\n"
-"void main()\n"
-"{\n"
-" vtf.color = color;\n"
-" gl_Position = xf * vec4(posIn.xyz, 1.0);\n"
-"}\n";
-
-static const char* FS =
-"#version 330\n"
-BOO_GLSL_BINDING_HEAD
-"struct VertToFrag\n"
-"{\n"
-" vec4 color;\n"
-"};\n"
-"\n"
-"SBINDING(0) in VertToFrag vtf;\n"
-"layout(location=0) out vec4 colorOut;\n"
-"void main()\n"
-"{\n"
-" colorOut = vtf.color;\n"
-"}\n";
-
-URDE_DECL_SPECIALIZE_SHADER(CAABoxShader)
-
-static boo::ObjToken s_VtxFmt;
-static boo::ObjToken s_Pipeline;
-static boo::ObjToken s_zOnlyPipeline;
-
-struct CAABoxShaderGLDataBindingFactory : TShader::IDataBindingFactory
-{
- boo::ObjToken BuildShaderDataBinding(boo::IGraphicsDataFactory::Context& ctx,
- CAABoxShader& filter)
- {
- boo::GLDataFactory::Context& cctx = static_cast(ctx);
-
- const boo::VertexElementDescriptor VtxVmt[] =
- {
- {filter.m_vbo.get(), nullptr, boo::VertexSemantic::Position4},
- };
- boo::ObjToken bufs[] = {filter.m_uniBuf.get()};
- boo::PipelineStage stages[] = {boo::PipelineStage::Vertex};
- return cctx.newShaderDataBinding(filter.m_zOnly ? s_zOnlyPipeline : s_Pipeline,
- ctx.newVertexFormat(1, VtxVmt), filter.m_vbo.get(), nullptr, nullptr,
- 1, bufs, stages, nullptr, nullptr, 0, nullptr, nullptr, nullptr);
- }
-};
-
-#if BOO_HAS_VULKAN
-struct CAABoxShaderVulkanDataBindingFactory : TShader::IDataBindingFactory
-{
- boo::ObjToken
- BuildShaderDataBinding(boo::IGraphicsDataFactory::Context& ctx,
- CAABoxShader& filter)
- {
- boo::VulkanDataFactory::Context& cctx = static_cast(ctx);
-
- boo::ObjToken bufs[] = {filter.m_uniBuf.get()};
- return cctx.newShaderDataBinding(filter.m_zOnly ? s_zOnlyPipeline : s_Pipeline, s_VtxFmt,
- filter.m_vbo.get(), nullptr, nullptr, 1, bufs,
- nullptr, nullptr, nullptr, 0, nullptr, nullptr, nullptr);
- }
-};
-#endif
-
-TShader::IDataBindingFactory* CAABoxShader::Initialize(boo::GLDataFactory::Context& ctx)
-{
- const char* uniNames[] = {"CAABoxUniform"};
- s_Pipeline = ctx.newShaderPipeline(VS, FS, 0, nullptr, 1, uniNames, boo::BlendFactor::SrcAlpha,
- boo::BlendFactor::InvSrcAlpha, boo::Primitive::TriStrips,
- boo::ZTest::LEqual, true, true, false, boo::CullMode::None);
- s_zOnlyPipeline = ctx.newShaderPipeline(VS, FS, 0, nullptr, 1, uniNames, boo::BlendFactor::SrcAlpha,
- boo::BlendFactor::InvSrcAlpha, boo::Primitive::TriStrips,
- boo::ZTest::LEqual, true, false, false, boo::CullMode::None);
- return new CAABoxShaderGLDataBindingFactory;
-}
-
-template <>
-void CAABoxShader::Shutdown()
-{
- s_Pipeline.reset();
- s_zOnlyPipeline.reset();
-}
-
-#if BOO_HAS_VULKAN
-TShader::IDataBindingFactory* CAABoxShader::Initialize(boo::VulkanDataFactory::Context& ctx)
-{
- const boo::VertexElementDescriptor VtxVmt[] =
- {
- {nullptr, nullptr, boo::VertexSemantic::Position4},
- };
- s_VtxFmt = ctx.newVertexFormat(1, VtxVmt);
- s_Pipeline = ctx.newShaderPipeline(VS, FS, s_VtxFmt, boo::BlendFactor::SrcAlpha,
- boo::BlendFactor::InvSrcAlpha, boo::Primitive::TriStrips,
- boo::ZTest::LEqual, true, true, false, boo::CullMode::None);
- s_zOnlyPipeline = ctx.newShaderPipeline(VS, FS, s_VtxFmt, boo::BlendFactor::SrcAlpha,
- boo::BlendFactor::InvSrcAlpha, boo::Primitive::TriStrips,
- boo::ZTest::LEqual, true, false, false, boo::CullMode::None);
- return new CAABoxShaderVulkanDataBindingFactory;
-}
-
-template <>
-void CAABoxShader::Shutdown()
-{
- s_VtxFmt.reset();
- s_Pipeline.reset();
- s_zOnlyPipeline.reset();
-}
-#endif
-
-}
diff --git a/Runtime/Graphics/Shaders/CAABoxShaderHLSL.cpp b/Runtime/Graphics/Shaders/CAABoxShaderHLSL.cpp
deleted file mode 100644
index bbc83dd0d..000000000
--- a/Runtime/Graphics/Shaders/CAABoxShaderHLSL.cpp
+++ /dev/null
@@ -1,90 +0,0 @@
-#include "CAABoxShader.hpp"
-#include "Graphics/CBooRenderer.hpp"
-
-namespace urde
-{
-
-static const char* VS =
-"struct VertData\n"
-"{\n"
-" float4 posIn : POSITION;\n"
-"};\n"
-"\n"
-"cbuffer CAABoxUniform : register(b0)\n"
-"{\n"
-" float4x4 xf;\n"
-" float4 color;\n"
-"};\n"
-"\n"
-"struct VertToFrag\n"
-"{\n"
-" float4 pos : SV_Position;\n"
-" float4 color : COLOR;\n"
-"};\n"
-"\n"
-"VertToFrag main(in VertData v)\n"
-"{\n"
-" VertToFrag vtf;\n"
-" vtf.color = color;\n"
-" vtf.pos = mul(xf, float4(v.posIn.xyz, 1.0));\n"
-" return vtf;\n"
-"}\n";
-
-static const char* FS =
-"struct VertToFrag\n"
-"{\n"
-" float4 pos : SV_Position;\n"
-" float4 color : COLOR;\n"
-"};\n"
-"\n"
-"float4 main(in VertToFrag vtf) : SV_Target0\n"
-"{\n"
-" return vtf.color;\n"
-"}\n";
-
-URDE_DECL_SPECIALIZE_SHADER(CAABoxShader)
-
-static boo::ObjToken s_VtxFmt;
-static boo::ObjToken s_Pipeline;
-static boo::ObjToken s_zOnlyPipeline;
-
-struct CAABoxShaderD3DDataBindingFactory : TShader::IDataBindingFactory
-{
- boo::ObjToken
- BuildShaderDataBinding(boo::IGraphicsDataFactory::Context& ctx,
- CAABoxShader& filter)
- {
- boo::D3DDataFactory::Context& cctx = static_cast(ctx);
-
- boo::ObjToken bufs[] = {filter.m_uniBuf.get()};
- return cctx.newShaderDataBinding(filter.m_zOnly ? s_zOnlyPipeline : s_Pipeline, s_VtxFmt,
- filter.m_vbo.get(), nullptr, nullptr, 1, bufs,
- nullptr, nullptr, nullptr, 0, nullptr, nullptr, nullptr);
- }
-};
-
-TShader::IDataBindingFactory* CAABoxShader::Initialize(boo::D3DDataFactory::Context& ctx)
-{
- const boo::VertexElementDescriptor VtxVmt[] =
- {
- {nullptr, nullptr, boo::VertexSemantic::Position4},
- };
- s_VtxFmt = ctx.newVertexFormat(1, VtxVmt);
- s_Pipeline = ctx.newShaderPipeline(VS, FS, nullptr, nullptr, nullptr, s_VtxFmt, boo::BlendFactor::SrcAlpha,
- boo::BlendFactor::InvSrcAlpha, boo::Primitive::TriStrips,
- boo::ZTest::LEqual, true, true, false, boo::CullMode::None);
- s_zOnlyPipeline = ctx.newShaderPipeline(VS, FS, nullptr, nullptr, nullptr, s_VtxFmt, boo::BlendFactor::SrcAlpha,
- boo::BlendFactor::InvSrcAlpha, boo::Primitive::TriStrips,
- boo::ZTest::LEqual, true, false, false, boo::CullMode::None);
- return new CAABoxShaderD3DDataBindingFactory;
-}
-
-template <>
-void CAABoxShader::Shutdown()
-{
- s_VtxFmt.reset();
- s_Pipeline.reset();
- s_zOnlyPipeline.reset();
-}
-
-}
diff --git a/Runtime/Graphics/Shaders/CAABoxShaderMetal.cpp b/Runtime/Graphics/Shaders/CAABoxShaderMetal.cpp
deleted file mode 100644
index 0a6f62b05..000000000
--- a/Runtime/Graphics/Shaders/CAABoxShaderMetal.cpp
+++ /dev/null
@@ -1,95 +0,0 @@
-#include "CAABoxShader.hpp"
-#include "Graphics/CBooRenderer.hpp"
-
-namespace urde
-{
-
-static const char* VS =
-"#include \n"
-"using namespace metal;\n"
-"struct VertData\n"
-"{\n"
-" float4 posIn [[ attribute(0) ]];\n"
-"};\n"
-"\n"
-"struct CAABoxUniform\n"
-"{\n"
-" float4x4 xf;\n"
-" float4 color;\n"
-"};\n"
-"\n"
-"struct VertToFrag\n"
-"{\n"
-" float4 pos [[ position ]];\n"
-" float4 color;\n"
-"};\n"
-"\n"
-"vertex VertToFrag vmain(VertData v [[ stage_in ]], constant CAABoxUniform& bu [[ buffer(2) ]])\n"
-"{\n"
-" VertToFrag vtf;\n"
-" vtf.color = bu.color;\n"
-" vtf.pos = bu.xf * float4(v.posIn.xyz, 1.0);\n"
-" return vtf;\n"
-"}\n";
-
-static const char* FS =
-"#include \n"
-"using namespace metal;\n"
-"struct VertToFrag\n"
-"{\n"
-" float4 pos [[ position ]];\n"
-" float4 color;\n"
-"};\n"
-"\n"
-"fragment float4 fmain(VertToFrag vtf [[ stage_in ]])\n"
-"{\n"
-" return vtf.color;\n"
-"}\n";
-
-URDE_DECL_SPECIALIZE_SHADER(CAABoxShader)
-
-static boo::ObjToken s_VtxFmt;
-static boo::ObjToken s_Pipeline;
-static boo::ObjToken s_zOnlyPipeline;
-
-struct CAABoxShaderMetalDataBindingFactory : TShader::IDataBindingFactory
-{
- boo::ObjToken BuildShaderDataBinding(boo::IGraphicsDataFactory::Context& ctx,
- CAABoxShader& filter)
- {
- boo::MetalDataFactory::Context& cctx = static_cast(ctx);
-
- boo::ObjToken bufs[] = {filter.m_uniBuf.get()};
- return cctx.newShaderDataBinding(filter.m_zOnly ? s_zOnlyPipeline : s_Pipeline, s_VtxFmt,
- filter.m_vbo.get(), nullptr, nullptr, 1, bufs,
- nullptr, nullptr, nullptr, 0, nullptr, nullptr, nullptr);
- }
-};
-
-TShader::IDataBindingFactory* CAABoxShader::Initialize(boo::MetalDataFactory::Context& ctx)
-{
- const boo::VertexElementDescriptor VtxVmt[] =
- {
- {nullptr, nullptr, boo::VertexSemantic::Position4},
- };
- s_VtxFmt = ctx.newVertexFormat(1, VtxVmt);
- s_Pipeline = ctx.newShaderPipeline(VS, FS, nullptr, nullptr,
- s_VtxFmt, boo::BlendFactor::SrcAlpha,
- boo::BlendFactor::InvSrcAlpha, boo::Primitive::TriStrips,
- boo::ZTest::LEqual, true, true, false, boo::CullMode::None);
- s_zOnlyPipeline = ctx.newShaderPipeline(VS, FS, nullptr, nullptr,
- s_VtxFmt, boo::BlendFactor::SrcAlpha,
- boo::BlendFactor::InvSrcAlpha, boo::Primitive::TriStrips,
- boo::ZTest::LEqual, true, false, false, boo::CullMode::None);
- return new CAABoxShaderMetalDataBindingFactory;
-}
-
-template <>
-void CAABoxShader::Shutdown()
-{
- s_VtxFmt.reset();
- s_Pipeline.reset();
- s_zOnlyPipeline.reset();
-}
-
-}
diff --git a/Runtime/Graphics/Shaders/CCameraBlurFilter.cpp b/Runtime/Graphics/Shaders/CCameraBlurFilter.cpp
index c90afccbc..790eefbc7 100644
--- a/Runtime/Graphics/Shaders/CCameraBlurFilter.cpp
+++ b/Runtime/Graphics/Shaders/CCameraBlurFilter.cpp
@@ -1,15 +1,33 @@
#include "CCameraBlurFilter.hpp"
+#include "hecl/Pipeline.hpp"
+#include "Graphics/CGraphics.hpp"
namespace urde
{
+static boo::ObjToken s_Pipeline;
+
+void CCameraBlurFilter::Initialize()
+{
+ s_Pipeline = hecl::conv->convert(Shader_CCameraBlurFilter{});
+}
+
+void CCameraBlurFilter::Shutdown()
+{
+ s_Pipeline.reset();
+}
+
CCameraBlurFilter::CCameraBlurFilter()
{
- CGraphics::CommitResources([&](boo::IGraphicsDataFactory::Context& ctx)
+ CGraphics::CommitResources([this](boo::IGraphicsDataFactory::Context& ctx)
{
m_vbo = ctx.newDynamicBuffer(boo::BufferUse::Vertex, 32, 4);
m_uniBuf = ctx.newDynamicBuffer(boo::BufferUse::Uniform, sizeof(Uniform), 1);
- m_dataBind = TShader::BuildShaderDataBinding(ctx, *this);
+ boo::ObjToken bufs[] = {m_uniBuf.get()};
+ boo::PipelineStage stages[] = {boo::PipelineStage::Vertex};
+ boo::ObjToken texs[] = {CGraphics::g_SpareTexture.get()};
+ m_dataBind = ctx.newShaderDataBinding(s_Pipeline, m_vbo.get(), nullptr, nullptr,
+ 1, bufs, stages, nullptr, nullptr, 1, texs, nullptr, nullptr);
return true;
} BooTrace);
}
@@ -59,6 +77,4 @@ void CCameraBlurFilter::draw(float amount, bool clearDepth)
CGraphics::DrawArray(0, 4);
}
-URDE_SPECIALIZE_SHADER(CCameraBlurFilter)
-
}
diff --git a/Runtime/Graphics/Shaders/CCameraBlurFilter.hpp b/Runtime/Graphics/Shaders/CCameraBlurFilter.hpp
index 18bd54cb3..0f260ac01 100644
--- a/Runtime/Graphics/Shaders/CCameraBlurFilter.hpp
+++ b/Runtime/Graphics/Shaders/CCameraBlurFilter.hpp
@@ -1,7 +1,7 @@
#ifndef __URDE_CCAMERABLURFILTER_HPP__
#define __URDE_CCAMERABLURFILTER_HPP__
-#include "TShader.hpp"
+#include "boo/graphicsdev/IGraphicsDataFactory.hpp"
#include "zeus/CMatrix4f.hpp"
#include "zeus/CColor.hpp"
@@ -10,11 +10,6 @@ namespace urde
class CCameraBlurFilter
{
- friend struct CCameraBlurFilterGLDataBindingFactory;
- friend struct CCameraBlurFilterVulkanDataBindingFactory;
- friend struct CCameraBlurFilterMetalDataBindingFactory;
- friend struct CCameraBlurFilterD3DDataBindingFactory;
-
struct Vert
{
zeus::CVector2f m_pos;
@@ -32,11 +27,10 @@ class CCameraBlurFilter
Uniform m_uniform;
public:
+ static void Initialize();
+ static void Shutdown();
CCameraBlurFilter();
void draw(float amount, bool clearDepth=false);
-
- using _CLS = CCameraBlurFilter;
-#include "TShaderDecl.hpp"
};
}
diff --git a/Runtime/Graphics/Shaders/CCameraBlurFilterGLSL.cpp b/Runtime/Graphics/Shaders/CCameraBlurFilterGLSL.cpp
deleted file mode 100644
index 30e940cc0..000000000
--- a/Runtime/Graphics/Shaders/CCameraBlurFilterGLSL.cpp
+++ /dev/null
@@ -1,163 +0,0 @@
-#include "CCameraBlurFilter.hpp"
-#include "Graphics/CBooRenderer.hpp"
-
-namespace urde
-{
-
-static const char* VS =
-"#version 330\n"
-BOO_GLSL_BINDING_HEAD
-"layout(location=0) in vec4 posIn;\n"
-"layout(location=1) in vec4 uvIn;\n"
-"\n"
-"UBINDING0 uniform CameraBlurUniform\n"
-"{\n"
-" vec4 uv0;\n"
-" vec4 uv1;\n"
-" vec4 uv2;\n"
-" vec4 uv3;\n"
-" vec4 uv4;\n"
-" vec4 uv5;\n"
-" float opacity;\n"
-"};\n"
-"\n"
-"struct VertToFrag\n"
-"{\n"
-" vec2 uvReg;\n"
-" vec2 uv0;\n"
-" vec2 uv1;\n"
-" vec2 uv2;\n"
-" vec2 uv3;\n"
-" vec2 uv4;\n"
-" vec2 uv5;\n"
-" float opacity;\n"
-"};\n"
-"\n"
-"SBINDING(0) out VertToFrag vtf;\n"
-"void main()\n"
-"{\n"
-" vtf.uvReg = uvIn.xy;\n"
-" vtf.uv0 = uv0.xy + uvIn.xy;\n"
-" vtf.uv1 = uv1.xy + uvIn.xy;\n"
-" vtf.uv2 = uv2.xy + uvIn.xy;\n"
-" vtf.uv3 = uv3.xy + uvIn.xy;\n"
-" vtf.uv4 = uv4.xy + uvIn.xy;\n"
-" vtf.uv5 = uv5.xy + uvIn.xy;\n"
-" vtf.opacity = opacity;\n"
-" gl_Position = vec4(posIn.xyz, 1.0);\n"
-"}\n";
-
-static const char* FS =
-"#version 330\n"
-BOO_GLSL_BINDING_HEAD
-"struct VertToFrag\n"
-"{\n"
-" vec2 uvReg;\n"
-" vec2 uv0;\n"
-" vec2 uv1;\n"
-" vec2 uv2;\n"
-" vec2 uv3;\n"
-" vec2 uv4;\n"
-" vec2 uv5;\n"
-" float opacity;\n"
-"};\n"
-"\n"
-"SBINDING(0) in VertToFrag vtf;\n"
-"layout(location=0) out vec4 colorOut;\n"
-"TBINDING0 uniform sampler2D sceneTex;\n"
-"void main()\n"
-"{\n"
-" vec4 colorSample = texture(sceneTex, vtf.uvReg) * 0.14285715;\n"
-" colorSample += texture(sceneTex, vtf.uv0) * 0.14285715;\n"
-" colorSample += texture(sceneTex, vtf.uv1) * 0.14285715;\n"
-" colorSample += texture(sceneTex, vtf.uv2) * 0.14285715;\n"
-" colorSample += texture(sceneTex, vtf.uv3) * 0.14285715;\n"
-" colorSample += texture(sceneTex, vtf.uv4) * 0.14285715;\n"
-" colorSample += texture(sceneTex, vtf.uv5) * 0.14285715;\n"
-" colorOut = vec4(colorSample.rgb, vtf.opacity);\n"
-"}\n";
-
-URDE_DECL_SPECIALIZE_SHADER(CCameraBlurFilter)
-
-static boo::ObjToken s_VtxFmt;
-static boo::ObjToken s_Pipeline;
-
-struct CCameraBlurFilterGLDataBindingFactory : TShader::IDataBindingFactory
-{
- boo::ObjToken BuildShaderDataBinding(boo::IGraphicsDataFactory::Context& ctx,
- CCameraBlurFilter& filter)
- {
- boo::GLDataFactory::Context& cctx = static_cast(ctx);
-
- const boo::VertexElementDescriptor VtxVmt[] =
- {
- {filter.m_vbo.get(), nullptr, boo::VertexSemantic::Position4},
- {filter.m_vbo.get(), nullptr, boo::VertexSemantic::UV4}
- };
- boo::ObjToken bufs[] = {filter.m_uniBuf.get()};
- boo::PipelineStage stages[] = {boo::PipelineStage::Vertex};
- boo::ObjToken texs[] = {CGraphics::g_SpareTexture.get()};
- return cctx.newShaderDataBinding(s_Pipeline,
- ctx.newVertexFormat(2, VtxVmt), filter.m_vbo.get(), nullptr, nullptr,
- 1, bufs, stages, nullptr, nullptr, 1, texs, nullptr, nullptr);
- }
-};
-
-#if BOO_HAS_VULKAN
-struct CCameraBlurFilterVulkanDataBindingFactory : TShader::IDataBindingFactory
-{
- boo::ObjToken
- BuildShaderDataBinding(boo::IGraphicsDataFactory::Context& ctx,
- CCameraBlurFilter& filter)
- {
- boo::VulkanDataFactory::Context& cctx = static_cast(ctx);
-
- boo::ObjToken bufs[] = {filter.m_uniBuf.get()};
- boo::ObjToken texs[] = {CGraphics::g_SpareTexture.get()};
- return cctx.newShaderDataBinding(s_Pipeline, s_VtxFmt,
- filter.m_vbo.get(), nullptr, nullptr, 1, bufs,
- nullptr, nullptr, nullptr, 1, texs, nullptr, nullptr);
- }
-};
-#endif
-
-TShader::IDataBindingFactory* CCameraBlurFilter::Initialize(boo::GLDataFactory::Context& ctx)
-{
- const char* texNames[] = {"sceneTex"};
- const char* uniNames[] = {"CameraBlurUniform"};
- s_Pipeline = ctx.newShaderPipeline(VS, FS, 1, texNames, 1, uniNames, boo::BlendFactor::SrcAlpha,
- boo::BlendFactor::InvSrcAlpha, boo::Primitive::TriStrips,
- boo::ZTest::None, false, true, false, boo::CullMode::None);
- return new CCameraBlurFilterGLDataBindingFactory;
-}
-
-template <>
-void CCameraBlurFilter::Shutdown()
-{
- s_Pipeline.reset();
-}
-
-#if BOO_HAS_VULKAN
-TShader::IDataBindingFactory* CCameraBlurFilter::Initialize(boo::VulkanDataFactory::Context& ctx)
-{
- const boo::VertexElementDescriptor VtxVmt[] =
- {
- {nullptr, nullptr, boo::VertexSemantic::Position4},
- {nullptr, nullptr, boo::VertexSemantic::UV4}
- };
- s_VtxFmt = ctx.newVertexFormat(2, VtxVmt);
- s_Pipeline = ctx.newShaderPipeline(VS, FS, s_VtxFmt, boo::BlendFactor::SrcAlpha,
- boo::BlendFactor::InvSrcAlpha, boo::Primitive::TriStrips,
- boo::ZTest::None, false, true, false, boo::CullMode::None);
- return new CCameraBlurFilterVulkanDataBindingFactory;
-}
-
-template <>
-void CCameraBlurFilter::Shutdown()
-{
- s_VtxFmt.reset();
- s_Pipeline.reset();
-}
-#endif
-
-}
diff --git a/Runtime/Graphics/Shaders/CCameraBlurFilterHLSL.cpp b/Runtime/Graphics/Shaders/CCameraBlurFilterHLSL.cpp
deleted file mode 100644
index 46d3d97b3..000000000
--- a/Runtime/Graphics/Shaders/CCameraBlurFilterHLSL.cpp
+++ /dev/null
@@ -1,131 +0,0 @@
-#include "CCameraBlurFilter.hpp"
-#include "Graphics/CBooRenderer.hpp"
-
-namespace urde
-{
-
-static const char* VS =
-"struct VertData\n"
-"{\n"
-" float4 posIn : POSITION;\n"
-" float4 uvIn : UV;\n"
-"};\n"
-"\n"
-"cbuffer CameraBlurUniform : register(b0)\n"
-"{\n"
-" float4 uv0;\n"
-" float4 uv1;\n"
-" float4 uv2;\n"
-" float4 uv3;\n"
-" float4 uv4;\n"
-" float4 uv5;\n"
-" float opacity;\n"
-"};\n"
-"\n"
-"struct VertToFrag\n"
-"{\n"
-" float4 position : SV_Position;\n"
-" float2 uvReg : UV6;\n"
-" float2 uv0 : UV0;\n"
-" float2 uv1 : UV1;\n"
-" float2 uv2 : UV2;\n"
-" float2 uv3 : UV3;\n"
-" float2 uv4 : UV4;\n"
-" float2 uv5 : UV5;\n"
-" float opacity : OPACITY;\n"
-"};\n"
-"\n"
-"VertToFrag main(in VertData v)\n"
-"{\n"
-" VertToFrag vtf;\n"
-" vtf.uvReg = v.uvIn.xy;\n"
-" vtf.uvReg.y = 1.0 - vtf.uvReg.y;\n"
-" vtf.uv0 = uv0.xy + v.uvIn.xy;\n"
-" vtf.uv0.y = 1.0 - vtf.uv0.y;\n"
-" vtf.uv1 = uv1.xy + v.uvIn.xy;\n"
-" vtf.uv1.y = 1.0 - vtf.uv1.y;\n"
-" vtf.uv2 = uv2.xy + v.uvIn.xy;\n"
-" vtf.uv2.y = 1.0 - vtf.uv2.y;\n"
-" vtf.uv3 = uv3.xy + v.uvIn.xy;\n"
-" vtf.uv3.y = 1.0 - vtf.uv3.y;\n"
-" vtf.uv4 = uv4.xy + v.uvIn.xy;\n"
-" vtf.uv4.y = 1.0 - vtf.uv4.y;\n"
-" vtf.uv5 = uv5.xy + v.uvIn.xy;\n"
-" vtf.uv5.y = 1.0 - vtf.uv5.y;\n"
-" vtf.opacity = opacity;\n"
-" vtf.position = float4(v.posIn.xyz, 1.0);\n"
-" return vtf;\n"
-"}\n";
-
-static const char* FS =
-"Texture2D sceneTex : register(t0);\n"
-"SamplerState samp : register(s0);\n"
-"struct VertToFrag\n"
-"{\n"
-" float4 position : SV_Position;\n"
-" float2 uvReg : UV6;\n"
-" float2 uv0 : UV0;\n"
-" float2 uv1 : UV1;\n"
-" float2 uv2 : UV2;\n"
-" float2 uv3 : UV3;\n"
-" float2 uv4 : UV4;\n"
-" float2 uv5 : UV5;\n"
-" float opacity : OPACITY;\n"
-"};\n"
-"\n"
-"float4 main(in VertToFrag vtf) : SV_Target0\n"
-"{\n"
-" float4 colorSample = sceneTex.Sample(samp, vtf.uvReg) * 0.14285715;\n"
-" colorSample += sceneTex.Sample(samp, vtf.uv0) * 0.14285715;\n"
-" colorSample += sceneTex.Sample(samp, vtf.uv1) * 0.14285715;\n"
-" colorSample += sceneTex.Sample(samp, vtf.uv2) * 0.14285715;\n"
-" colorSample += sceneTex.Sample(samp, vtf.uv3) * 0.14285715;\n"
-" colorSample += sceneTex.Sample(samp, vtf.uv4) * 0.14285715;\n"
-" colorSample += sceneTex.Sample(samp, vtf.uv5) * 0.14285715;\n"
-" return float4(colorSample.rgb, vtf.opacity);\n"
-"}\n";
-
-URDE_DECL_SPECIALIZE_SHADER(CCameraBlurFilter)
-
-static boo::ObjToken s_VtxFmt;
-static boo::ObjToken s_Pipeline;
-
-struct CCameraBlurFilterD3DDataBindingFactory : TShader::IDataBindingFactory
-{
- boo::ObjToken
- BuildShaderDataBinding(boo::IGraphicsDataFactory::Context& ctx,
- CCameraBlurFilter& filter)
- {
- boo::D3DDataFactory::Context& cctx = static_cast(ctx);
-
- boo::ObjToken bufs[] = {filter.m_uniBuf.get()};
- boo::ObjToken texs[] = {CGraphics::g_SpareTexture.get()};
- return cctx.newShaderDataBinding(s_Pipeline, s_VtxFmt,
- filter.m_vbo.get(), nullptr, nullptr, 1, bufs,
- nullptr, nullptr, nullptr, 1, texs, nullptr, nullptr);
- }
-};
-
-TShader::IDataBindingFactory* CCameraBlurFilter::Initialize(boo::D3DDataFactory::Context& ctx)
-{
- const boo::VertexElementDescriptor VtxVmt[] =
- {
- {nullptr, nullptr, boo::VertexSemantic::Position4},
- {nullptr, nullptr, boo::VertexSemantic::UV4}
- };
- s_VtxFmt = ctx.newVertexFormat(2, VtxVmt);
- s_Pipeline = ctx.newShaderPipeline(VS, FS, nullptr, nullptr, nullptr,
- s_VtxFmt, boo::BlendFactor::SrcAlpha,
- boo::BlendFactor::InvSrcAlpha, boo::Primitive::TriStrips,
- boo::ZTest::None, false, true, false, boo::CullMode::None);
- return new CCameraBlurFilterD3DDataBindingFactory;
-}
-
-template <>
-void CCameraBlurFilter::Shutdown()
-{
- s_VtxFmt.reset();
- s_Pipeline.reset();
-}
-
-}
diff --git a/Runtime/Graphics/Shaders/CCameraBlurFilterMetal.cpp b/Runtime/Graphics/Shaders/CCameraBlurFilterMetal.cpp
deleted file mode 100644
index a21a78dca..000000000
--- a/Runtime/Graphics/Shaders/CCameraBlurFilterMetal.cpp
+++ /dev/null
@@ -1,133 +0,0 @@
-#include "CCameraBlurFilter.hpp"
-#include "Graphics/CBooRenderer.hpp"
-
-namespace urde
-{
-
-static const char* VS =
-"#include \n"
-"using namespace metal;\n"
-"struct VertData\n"
-"{\n"
-" float4 posIn [[ attribute(0) ]];\n"
-" float4 uvIn [[ attribute(1) ]];\n"
-"};\n"
-"\n"
-"struct CameraBlurUniform\n"
-"{\n"
-" float4 uv0;\n"
-" float4 uv1;\n"
-" float4 uv2;\n"
-" float4 uv3;\n"
-" float4 uv4;\n"
-" float4 uv5;\n"
-" float opacity;\n"
-"};\n"
-"\n"
-"struct VertToFrag\n"
-"{\n"
-" float4 position [[ position ]];\n"
-" float2 uvReg;\n"
-" float2 uv0;\n"
-" float2 uv1;\n"
-" float2 uv2;\n"
-" float2 uv3;\n"
-" float2 uv4;\n"
-" float2 uv5;\n"
-" float opacity;\n"
-"};\n"
-"\n"
-"vertex VertToFrag vmain(VertData v [[ stage_in ]], constant CameraBlurUniform& cbu [[ buffer(2) ]])\n"
-"{\n"
-" VertToFrag vtf;\n"
-" vtf.uvReg = v.uvIn.xy;\n"
-" vtf.uvReg.y = 1.0 - vtf.uvReg.y;\n"
-" vtf.uv0 = cbu.uv0.xy + v.uvIn.xy;\n"
-" vtf.uv0.y = 1.0 - vtf.uv0.y;\n"
-" vtf.uv1 = cbu.uv1.xy + v.uvIn.xy;\n"
-" vtf.uv1.y = 1.0 - vtf.uv1.y;\n"
-" vtf.uv2 = cbu.uv2.xy + v.uvIn.xy;\n"
-" vtf.uv2.y = 1.0 - vtf.uv2.y;\n"
-" vtf.uv3 = cbu.uv3.xy + v.uvIn.xy;\n"
-" vtf.uv3.y = 1.0 - vtf.uv3.y;\n"
-" vtf.uv4 = cbu.uv4.xy + v.uvIn.xy;\n"
-" vtf.uv4.y = 1.0 - vtf.uv4.y;\n"
-" vtf.uv5 = cbu.uv5.xy + v.uvIn.xy;\n"
-" vtf.uv5.y = 1.0 - vtf.uv5.y;\n"
-" vtf.opacity = cbu.opacity;\n"
-" vtf.position = float4(v.posIn.xyz, 1.0);\n"
-" return vtf;\n"
-"}\n";
-
-static const char* FS =
-"#include \n"
-"using namespace metal;\n"
-"struct VertToFrag\n"
-"{\n"
-" float4 position [[ position ]];\n"
-" float2 uvReg;\n"
-" float2 uv0;\n"
-" float2 uv1;\n"
-" float2 uv2;\n"
-" float2 uv3;\n"
-" float2 uv4;\n"
-" float2 uv5;\n"
-" float opacity;\n"
-"};\n"
-"\n"
-"fragment float4 fmain(VertToFrag vtf [[ stage_in ]], sampler samp [[ sampler(0) ]],\n"
-" texture2d sceneTex [[ texture(0) ]])\n"
-"{\n"
-" float4 colorSample = sceneTex.sample(samp, vtf.uvReg) * 0.14285715;\n"
-" colorSample += sceneTex.sample(samp, vtf.uv0) * 0.14285715;\n"
-" colorSample += sceneTex.sample(samp, vtf.uv1) * 0.14285715;\n"
-" colorSample += sceneTex.sample(samp, vtf.uv2) * 0.14285715;\n"
-" colorSample += sceneTex.sample(samp, vtf.uv3) * 0.14285715;\n"
-" colorSample += sceneTex.sample(samp, vtf.uv4) * 0.14285715;\n"
-" colorSample += sceneTex.sample(samp, vtf.uv5) * 0.14285715;\n"
-" return float4(colorSample.rgb, vtf.opacity);\n"
-"}\n";
-
-URDE_DECL_SPECIALIZE_SHADER(CCameraBlurFilter)
-
-static boo::ObjToken s_VtxFmt;
-static boo::ObjToken s_Pipeline;
-
-struct CCameraBlurFilterMetalDataBindingFactory : TShader::IDataBindingFactory
-{
- boo::ObjToken BuildShaderDataBinding(boo::IGraphicsDataFactory::Context& ctx,
- CCameraBlurFilter& filter)
- {
- boo::MetalDataFactory::Context& cctx = static_cast(ctx);
-
- boo::ObjToken bufs[] = {filter.m_uniBuf.get()};
- boo::ObjToken texs[] = {CGraphics::g_SpareTexture.get()};
- return cctx.newShaderDataBinding(s_Pipeline, s_VtxFmt,
- filter.m_vbo.get(), nullptr, nullptr, 1, bufs,
- nullptr, nullptr, nullptr, 1, texs, nullptr, nullptr);
- }
-};
-
-TShader::IDataBindingFactory* CCameraBlurFilter::Initialize(boo::MetalDataFactory::Context& ctx)
-{
- const boo::VertexElementDescriptor VtxVmt[] =
- {
- {nullptr, nullptr, boo::VertexSemantic::Position4},
- {nullptr, nullptr, boo::VertexSemantic::UV4}
- };
- s_VtxFmt = ctx.newVertexFormat(2, VtxVmt);
- s_Pipeline = ctx.newShaderPipeline(VS, FS, nullptr, nullptr,
- s_VtxFmt, boo::BlendFactor::SrcAlpha,
- boo::BlendFactor::InvSrcAlpha, boo::Primitive::TriStrips,
- boo::ZTest::None, false, true, false, boo::CullMode::None);
- return new CCameraBlurFilterMetalDataBindingFactory;
-}
-
-template <>
-void CCameraBlurFilter::Shutdown()
-{
- s_VtxFmt.reset();
- s_Pipeline.reset();
-}
-
-}
diff --git a/Runtime/Graphics/Shaders/CColoredQuadFilter.cpp b/Runtime/Graphics/Shaders/CColoredQuadFilter.cpp
index 3e32bf650..4cfb6c861 100644
--- a/Runtime/Graphics/Shaders/CColoredQuadFilter.cpp
+++ b/Runtime/Graphics/Shaders/CColoredQuadFilter.cpp
@@ -1,11 +1,46 @@
#include "CColoredQuadFilter.hpp"
+#include "Graphics/CGraphics.hpp"
+#include "hecl/Pipeline.hpp"
namespace urde
{
+static boo::ObjToken s_AlphaPipeline;
+static boo::ObjToken s_AddPipeline;
+static boo::ObjToken s_MultPipeline;
+
+void CColoredQuadFilter::Initialize()
+{
+ s_AlphaPipeline = hecl::conv->convert(Shader_CColoredQuadFilter{});
+ s_AddPipeline = hecl::conv->convert(Shader_CColoredQuadFilterAdd{});
+ s_MultPipeline = hecl::conv->convert(Shader_CColoredQuadFilterMul{});
+}
+
+void CColoredQuadFilter::Shutdown()
+{
+ s_AlphaPipeline.reset();
+ s_AddPipeline.reset();
+ s_MultPipeline.reset();
+}
+
+static boo::ObjToken SelectPipeline(EFilterType type)
+{
+ switch (type)
+ {
+ case EFilterType::Blend:
+ return s_AlphaPipeline;
+ case EFilterType::Add:
+ return s_AddPipeline;
+ case EFilterType::Multiply:
+ return s_MultPipeline;
+ default:
+ return {};
+ }
+}
+
CColoredQuadFilter::CColoredQuadFilter(EFilterType type)
{
- CGraphics::CommitResources([&](boo::IGraphicsDataFactory::Context& ctx)
+ CGraphics::CommitResources([this, type](boo::IGraphicsDataFactory::Context& ctx)
{
struct Vert
{
@@ -19,7 +54,10 @@ CColoredQuadFilter::CColoredQuadFilter(EFilterType type)
};
m_vbo = ctx.newStaticBuffer(boo::BufferUse::Vertex, verts, 16, 4);
m_uniBuf = ctx.newDynamicBuffer(boo::BufferUse::Uniform, sizeof(Uniform), 1);
- m_dataBind = TMultiBlendShader::BuildShaderDataBinding(ctx, type, *this);
+ boo::ObjToken bufs[] = {m_uniBuf.get()};
+ boo::PipelineStage stages[] = {boo::PipelineStage::Vertex};
+ m_dataBind = ctx.newShaderDataBinding(SelectPipeline(type), m_vbo.get(), nullptr, nullptr,
+ 1, bufs, stages, nullptr, nullptr, 0, nullptr, nullptr, nullptr);
return true;
} BooTrace);
}
@@ -90,6 +128,4 @@ void CWideScreenFilter::SetViewportToFull()
const zeus::CRectangle CColoredQuadFilter::DefaultRect = {0.f, 0.f, 1.f, 1.f};
-URDE_SPECIALIZE_MULTI_BLEND_SHADER(CColoredQuadFilter)
-
}
diff --git a/Runtime/Graphics/Shaders/CColoredQuadFilter.hpp b/Runtime/Graphics/Shaders/CColoredQuadFilter.hpp
index f1fe5a2fd..c84e6dc47 100644
--- a/Runtime/Graphics/Shaders/CColoredQuadFilter.hpp
+++ b/Runtime/Graphics/Shaders/CColoredQuadFilter.hpp
@@ -1,7 +1,6 @@
#ifndef __URDE_CCOLOREDQUADFILTER_HPP__
#define __URDE_CCOLOREDQUADFILTER_HPP__
-#include "TMultiBlendShader.hpp"
#include "zeus/CMatrix4f.hpp"
#include "zeus/CColor.hpp"
#include "zeus/CRectangle.hpp"
@@ -12,11 +11,6 @@ namespace urde
class CColoredQuadFilter
{
- friend struct CColoredQuadFilterGLDataBindingFactory;
- friend struct CColoredQuadFilterVulkanDataBindingFactory;
- friend struct CColoredQuadFilterMetalDataBindingFactory;
- friend struct CColoredQuadFilterD3DDataBindingFactory;
-
struct Uniform
{
zeus::CMatrix4f m_matrix;
@@ -28,15 +22,14 @@ class CColoredQuadFilter
Uniform m_uniform;
public:
+ static void Initialize();
+ static void Shutdown();
static const zeus::CRectangle DefaultRect;
CColoredQuadFilter(EFilterType type);
CColoredQuadFilter(EFilterType type, const TLockedToken&)
: CColoredQuadFilter(type) {}
void draw(const zeus::CColor& color, const zeus::CRectangle& rect=DefaultRect);
void DrawFilter(EFilterShape shape, const zeus::CColor& color, float t) { draw(color); }
-
- using _CLS = CColoredQuadFilter;
-#include "TMultiBlendShaderDecl.hpp"
};
class CWideScreenFilter
diff --git a/Runtime/Graphics/Shaders/CColoredQuadFilterGLSL.cpp b/Runtime/Graphics/Shaders/CColoredQuadFilterGLSL.cpp
deleted file mode 100644
index 833fa84bd..000000000
--- a/Runtime/Graphics/Shaders/CColoredQuadFilterGLSL.cpp
+++ /dev/null
@@ -1,157 +0,0 @@
-#include "CColoredQuadFilter.hpp"
-
-namespace urde
-{
-
-static const char* VS =
-"#version 330\n"
-BOO_GLSL_BINDING_HEAD
-"layout(location=0) in vec4 posIn;\n"
-"\n"
-"UBINDING0 uniform ColoredQuadUniform\n"
-"{\n"
-" mat4 xf;\n"
-" vec4 color;\n"
-"};\n"
-"\n"
-"struct VertToFrag\n"
-"{\n"
-" vec4 color;\n"
-"};\n"
-"\n"
-"SBINDING(0) out VertToFrag vtf;\n"
-"void main()\n"
-"{\n"
-" vtf.color = color;\n"
-" gl_Position = xf * vec4(posIn.xyz, 1.0);\n"
-"}\n";
-
-static const char* FS =
-"#version 330\n"
-BOO_GLSL_BINDING_HEAD
-"struct VertToFrag\n"
-"{\n"
-" vec4 color;\n"
-"};\n"
-"\n"
-"SBINDING(0) in VertToFrag vtf;\n"
-"layout(location=0) out vec4 colorOut;\n"
-"void main()\n"
-"{\n"
-" colorOut = vtf.color;\n"
-"}\n";
-
-URDE_DECL_SPECIALIZE_MULTI_BLEND_SHADER(CColoredQuadFilter)
-
-static boo::ObjToken s_VtxFmt;
-static boo::ObjToken s_AlphaPipeline;
-static boo::ObjToken s_AddPipeline;
-static boo::ObjToken s_MultPipeline;
-
-static boo::ObjToken SelectPipeline(EFilterType type)
-{
- switch (type)
- {
- case EFilterType::Blend:
- return s_AlphaPipeline;
- case EFilterType::Add:
- return s_AddPipeline;
- case EFilterType::Multiply:
- return s_MultPipeline;
- default:
- return {};
- }
-}
-
-struct CColoredQuadFilterGLDataBindingFactory : TMultiBlendShader::IDataBindingFactory
-{
- boo::ObjToken BuildShaderDataBinding(boo::IGraphicsDataFactory::Context& ctx,
- EFilterType type, CColoredQuadFilter& filter)
- {
- boo::GLDataFactory::Context& cctx = static_cast(ctx);
-
- const boo::VertexElementDescriptor VtxVmt[] =
- {
- {filter.m_vbo.get(), nullptr, boo::VertexSemantic::Position4}
- };
- boo::ObjToken bufs[] = {filter.m_uniBuf.get()};
- boo::PipelineStage stages[] = {boo::PipelineStage::Vertex};
- return cctx.newShaderDataBinding(SelectPipeline(type),
- ctx.newVertexFormat(1, VtxVmt), filter.m_vbo.get(), nullptr, nullptr,
- 1, bufs, stages, nullptr, nullptr, 0, nullptr, nullptr, nullptr);
- }
-};
-
-#if BOO_HAS_VULKAN
-struct CColoredQuadFilterVulkanDataBindingFactory : TMultiBlendShader::IDataBindingFactory
-{
- boo::ObjToken