#pragma once #include #include #include #include namespace sophia { enum class ShaderStage { VERTEX, FRAGMENT, COMPUTE }; class Shader { public: class Builder; Shader(const Shader&) = delete; Shader& operator=(const Shader&) = delete; ~Shader() = default; const std::vector& getSpirv() const { return this->spirv; } ShaderStage getStage() const { return this->stage; } private: Shader() = default; void compile(const std::string& path, ShaderStage shaderStage); void load(const std::string& path, ShaderStage shaderStage); ShaderStage stage; std::vector spirv; }; class Shader::Builder { public: Builder() = default; Builder& fromGLSL(const std::string& path); Builder& fromSPIRV(const std::string& path); Builder& setStage(ShaderStage shaderStage); std::unique_ptr build(); private: std::string path; ShaderStage stage; bool stageSet = false; bool precompiled = false; }; } // namespace sophia