voxspatium/src/Shader.h

77 lines
2.7 KiB
C++

// Voxspatium Engine - Voxel Planets engine
// Copyright (C) 2018 Evert "Diamond" Prants <evert@lunasqu.ee>
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <https://www.gnu.org/licenses/>.
#ifndef __SHADER_H__
#define __SHADER_H__
#include <fstream>
#include <map>
#include "util/Common.h"
class Shader
{
public:
static Shader& createShader(const std::string& vertexShaderFilePath, const std::string& fragmentShaderFilePath);
static Shader& createShader(const std::string& vertexShaderFilePath, const std::string& fragmentShaderFilePath, const std::string& geometryShaderFilePath);
void linkShaders();
void setAttribute(const std::string& name, GLint size, GLboolean normalized, GLsizei stride, GLuint offset, GLenum type = GL_FLOAT);
GLuint getUniformLocation(const std::string& uniformName);
inline GLuint operator[](const std::string& name) { return getUniformLocation(name); }
GLuint getAttribLocation(const std::string& attrbuteName);
// Set uniforms
void setUniform(const std::string& name, float x, float y, float z);
void setUniform(const std::string& name, const glm::vec3& v);
void setUniform(const std::string& name, const glm::dvec3& v);
void setUniform(const std::string& name, const glm::vec4& v);
void setUniform(const std::string& name, const glm::dvec4& v);
void setUniform(const std::string& name, const glm::dmat4& m);
void setUniform(const std::string& name, const glm::mat4& m);
void setUniform(const std::string& name, const glm::mat3& m);
void setUniform(const std::string& name, float val);
void setUniform(const std::string& name, int val);
void setBuffers(GLint vao, GLint vbo, GLint ebo);
// Bind Attributes and start the shader program
void use();
// Start the shader program without binding attributes
void start();
void stop();
private:
struct Attribute;
bool m_valid;
GLuint m_programID;
GLuint m_vertexShaderID;
GLuint m_fragmentShaderID;
GLuint m_geometryShaderID;
std::map<std::string, GLuint> m_uniforms;
std::map<std::string, Attribute> m_attributes;
GLint vao, vbo, ebo;
static void compileShader(const std::string& filePath, GLuint& id);
};
#endif // __SHADER_H__