Shader.cpp
branchv_0
changeset 5 ee4ba9f5a053
parent 3 48dc4ae894b0
child 29 dc3c102e1264
--- /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);
+	}
+}