#ifndef PARADISO_SHADER_HPP #define PARADISO_SHADER_HPP #include "globals.hpp" #include #include #include #include #include #include namespace paradiso { struct Shader final { Shader(); ~Shader(); Shader(const Shader&) = delete; Shader(Shader&&) = default; enum class Type { Vertex, Fragment, Geometry, Compute }; void set_source(Type t, const std::string& c) { source_[t] = c; } std::string source(Type t) const { return source_.at(t); } bool build(); bool ready() const; void use() const; Shader& set_uniform_at_location(int location, float v); //!< sets a float in a shader Shader& set_uniform_at_location(int location, uint32_t v); //!< sets a 32bit unsigned in a shader Shader& set_uniform_at_location(int location, int32_t v); //!< sets a 32bit signed in a shader /** * @brief retrieves the position of a uniform * @param name of the uniform * @return position of the uniform or negative if it doesn't exist */ int uniform_location(std::string const& name) const; /** * @brief check if a uniform with the given name exists * @param name of the uniform * @return true if found */ bool has_uniform(std::string const& name) const { return uniform_location(name) >= 0; } /** * sets data of the */ template Shader& set_uniform(std::string const& name, T&& value) { return set_uniform_at_location(uniform_location(name), std::forward(value)); } using uniform_t = std::variant; using uniform_entry_t = std::tuple; using uniform_cache_t = std::vector; void set_uniforms(uniform_cache_t c); uint32_t native_handle() const; private: std::unordered_map source_; struct impl; std::unique_ptr impl_; }; } // namespace paradiso #endif