/**
* ShaderShark
* Copyright © 2023 František Kučera (Frantovo.cz, GlobalCode.info)
*
* 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, version 3 of the License.
*
* 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 <http://www.gnu.org/licenses/>.
*/
#include <string>
#include <stdexcept>
#include "Shader.h"
class Shader::Impl {
public:
Shader::Type type;
GLuint id;
std::string fileName;
};
Shader::Shader(
const Type type,
const Buffer& source,
const std::string& fileName) : impl(new Impl()) {
impl->type = type;
impl->fileName = fileName;
impl->id = glCreateShader((GLenum) impl->type);
update(source);
}
Shader::~Shader() {
glDeleteShader(impl->id);
delete impl;
}
GLuint Shader::getId() const {
return impl->id;
}
const std::string Shader::getFileName() const {
return impl->fileName;
}
void Shader::update(const Buffer& source) {
auto fileData = source.getData();
GLint fileSize = source.getSize();
glShaderSource(impl->id, 1, &fileData, &fileSize);
glCompileShader(impl->id);
GLint compileStatus;
glGetShaderiv(impl->id, GL_COMPILE_STATUS, &compileStatus);
if (compileStatus != GL_TRUE) {
char error[512];
glGetShaderInfoLog(impl->id, sizeof (error), NULL, error);
throw std::logic_error(
std::string("GLSL: shader failed to compile: ") + error);
}
}