#include "Shader.h" #include "Renderer.h" #include "Platform/OpenGL/OpenGLShader.h" #include "Platform/Vulkan/VulkanShader.h" namespace Donut { Ref Shader::Create(const std::string& filepath) { switch (Renderer::GetAPI()) { case RendererAPI::API::OpenGL: return CreateRef(filepath); case RendererAPI::API::Vulkan: return CreateRef(filepath); default: return nullptr; } } Ref Shader::Create(const std::string& name, const std::string& vertexSrc, const std::string& fragmentSrc) { switch (Renderer::GetAPI()) { case RendererAPI::API::OpenGL: return CreateRef(name, vertexSrc, fragmentSrc); case RendererAPI::API::Vulkan: return CreateRef(name, vertexSrc, fragmentSrc); default: return nullptr; } } Ref Shader::CreateCompute(const std::string& name, const std::string& computeSrc) { switch (Renderer::GetAPI()) { case RendererAPI::API::OpenGL: return CreateRef(name, computeSrc); case RendererAPI::API::Vulkan: return CreateRef(name, computeSrc); default: return nullptr; } } void ShaderLibrary::Add(const Ref& shader) { auto& name = shader->GetName(); Add(name, shader); } void ShaderLibrary::Add(const std::string& name, const Ref& shader) { m_Shaders[name] = shader; } Ref ShaderLibrary::Load(const std::string& filepath) { auto shader = Shader::Create(filepath); Add(shader); return shader; } Ref ShaderLibrary::Load(const std::string& name, const std::string& filepath) { auto shader = Shader::Create(filepath); Add(name, shader); return shader; } Ref ShaderLibrary::Get(const std::string& name) { if (Exists(name)) return m_Shaders[name]; return nullptr; } bool ShaderLibrary::Exists(const std::string& name) const { return m_Shaders.find(name) != m_Shaders.end(); } };