--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Shader.cpp Fri Dec 01 20:25:49 2023 +0100
@@ -0,0 +1,68 @@
+/**
+ * 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);
+ }
+}