diff --git a/src/plugins/metal/src/metal_graphics.h b/src/plugins/metal/src/metal_graphics.h index 86f7672..7e91492 100644 --- a/src/plugins/metal/src/metal_graphics.h +++ b/src/plugins/metal/src/metal_graphics.h @@ -46,6 +46,8 @@ class MetalGraphicsAPI : public GraphicsAPIInternal { const std::string& fragment_src) override; Result> createShader(const std::string& fragment_src) override; + Result> + createShader(const ShaderPack& shader_pack) override; Window* getWindow() override { return window.get(); diff --git a/src/plugins/metal/src/metal_graphics.mm b/src/plugins/metal/src/metal_graphics.mm index fb95fd8..948c290 100644 --- a/src/plugins/metal/src/metal_graphics.mm +++ b/src/plugins/metal/src/metal_graphics.mm @@ -1,5 +1,6 @@ #include "metal_graphics.h" #include "growl/core/assets/font_face.h" +#include "growl/core/assets/shader_pack.h" #include "growl/core/error.h" #include "growl/core/graphics/shader.h" #include "growl/core/imgui.h" @@ -20,6 +21,7 @@ using Growl::MetalGraphicsAPI; using Growl::Result; using Growl::Shader; +using Growl::ShaderPack; using Growl::Texture; using Growl::TextureAtlas; using Growl::TextureOptions; @@ -268,6 +270,24 @@ return createShader(MetalShader::default_vertex, fragment_src); } +Result> +MetalGraphicsAPI::createShader(const ShaderPack& shader_pack) { + auto source = shader_pack.getSources().find(ShaderType::Metal); + if (source == shader_pack.getSources().end()) { + return Error(std::make_unique( + "No Metal sources found in shader pack")); + } + if (!source->second.fragment_src.has_value()) { + return Error(std::make_unique( + "No fragment source found in shader pack")); + } + return createShader( + source->second.vertex_src.has_value() + ? source->second.vertex_src.value() + : MetalShader::default_vertex, + source->second.fragment_src.value()); +} + const std::vector MetalGraphicsAPI::convertRGBAToBGRA(const Image& rgba) { const unsigned char* src = rgba.getRaw();