// Copyright (c) 2022 Dominic Masters // // This software is released under the MIT License. // https://opensource.org/licenses/MIT #pragma once #include "display/shader/IShader.hpp" #include "dawnopengl.hpp" typedef GLuint shaderparameter_t; namespace Dawn { class Shader : public IShader { private: /** Pointer to an uploaded vertex shader program */ GLuint shaderVertex = -1; /** Pointer to an uploaded fragment shader program */ GLuint shaderFrag = -1; /** Pointer to an uploaded shader program linked */ GLuint shaderProgram = -1; protected: /** * Compiles a GLSL/HLSL shader and stores it on the GPU, updates the * underlying pointers for you. * * @param vertexShader The string source of the vertex shader. * @param fragmentShader The string source of the fragment shader. */ void compileShader( std::map attributeLocations, std::string vertexShader, std::string fragmentShader ); /** * Typically HLSL only, this method allows you to specify where vbo * attributes are bound. Typically 0 for positions, 1 for coordinates, * etc. * * @param name Attribute name in the HLSL shader. * @param location Index pointing to which location it is to be bound to. */ void bindAttributeLocation(std::string name, int32_t location); public: /** * Locate a shader parameter by its name. * * @param name Name of the parameter to get. * @return The shader parameter. */ shaderparameter_t getParameterByName(std::string name); /** * Locate a shader buffer parameter set by its name. * * @param name Name of the buffer to get. * @return The shader buffer. */ shaderbufferlocation_t getBufferLocationByName(std::string name); virtual void compile() override = 0; void bind() override; void setParameterBuffer( shaderbufferlocation_t location, shaderbufferslot_t slot ); void setMatrix(shaderparameter_t parameter, glm::mat4 matrix) override; void setBoolean(shaderparameter_t parameter, bool_t value) override; void setColor(shaderparameter_t parameter, struct Color color) override; void setVector3(shaderparameter_t parameter, glm::vec3 vector) override; void setTexture( shaderparameter_t parameter, textureslot_t texture ) override; void setFloat(shaderparameter_t parameter, float_t value) override; /** * Destroys and deletes the shader from the GPU. */ virtual ~Shader(); }; }