Skybox
[opengl.git] / program.cpp
diff --git a/program.cpp b/program.cpp
new file mode 100644 (file)
index 0000000..b1f2ede
--- /dev/null
@@ -0,0 +1,50 @@
+#include "program.hpp"
+#include <fstream>
+#include <sstream>
+#include <iostream>
+
+using namespace std;
+
+void attachShader(GLuint progId, string filePath, GLenum type) {
+       GLuint shader = glCreateShader(type);
+
+       if (!shader) {
+               cerr << "error creating shader" << endl;
+               exit(1);
+       }
+
+       ifstream file(filePath);
+       stringstream buffer;
+       buffer << file.rdbuf();
+       string str = buffer.str();
+       const char* contents = str.c_str();
+
+       glShaderSource(shader, 1, (const GLchar**)&contents, NULL);
+       glCompileShader(shader);
+       GLint success;
+       glGetShaderiv(shader, GL_COMPILE_STATUS, &success);
+       if (!success) {
+               GLchar log[1024];
+               glGetShaderInfoLog(shader, 1024, NULL, log);
+               fprintf(stderr, "error: %s\n", log);
+               exit(1);
+       }
+       glAttachShader(progId, shader);
+}
+
+Program::Program(const string vertexShader, const string fragmentShader) {
+       progId = glCreateProgram();
+
+       attachShader(progId, vertexShader, GL_VERTEX_SHADER);
+       attachShader(progId, fragmentShader, GL_FRAGMENT_SHADER);
+
+       glLinkProgram(progId);
+       GLint success = 0;
+       glGetProgramiv(progId, GL_LINK_STATUS, &success);
+       if (!success) {
+               GLchar log[1024];
+               glGetProgramInfoLog(progId, sizeof(log), NULL, log);
+               fprintf(stderr, "error linking: %s\n", log);
+               exit(1);
+       }
+}