-void attachShader(GLuint progId, const char* filePath, GLenum type) {
- GLuint shader = glCreateShader(type);
-
- if (!shader) {
- fprintf(stderr, "error creating shader\n");
- 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);
-}
-
-GLuint compileShaders(char* vertexShader, char* fragmentShader) {
- GLuint 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);
- }
-
- return progId;
-}
-
-#define BUFFER_OFFSET(i) ((char *)NULL + (i))
-
-GLuint setupBuffers(glm::vec3* vertices, glm::vec3* normals, GLuint progId) {
-
- GLfloat colors[] = {
- 0, 1, 0, 1,
- 1, 0, 0, 1,
- 0, 0, 1, 1,
-
- 0, 1, 0, 1,
- 1, 0, 0, 1,
- 0, 0, 1, 1,
-
- 0, 1, 0, 1,
- 1, 0, 0, 1,
- 0, 0, 1, 1,
-
- 0, 1, 0, 1,
- 1, 0, 0, 1,
- 0, 0, 1, 1,
-
- 0, 1, 0, 1,
- 1, 0, 0, 1,
- 0, 0, 1, 1,
-
- 0, 1, 0, 1,
- 1, 0, 0, 1,
- 0, 0, 1, 1
- };
-
- GLuint numVerts = 18;
-
- GLuint vbo;
- glGenBuffers(1, &vbo);
-
- GLuint vao;
- glGenVertexArrays(1, &vao);
-
- GLuint posId = glGetAttribLocation(progId, "vPosition");
- GLuint colorId = glGetAttribLocation(progId, "vColor");
- GLuint normalLoc = glGetAttribLocation(progId, "vNormal");
-
- GLuint vertsLen = numVerts * 3 * sizeof(GLfloat);
- GLuint colorsLen = numVerts * 4 * sizeof(GLfloat);
- GLuint normalLen = numVerts * 3 * sizeof(GLfloat);
-
- glBindBuffer(GL_ARRAY_BUFFER, vbo);
- glBufferData(GL_ARRAY_BUFFER, vertsLen + colorsLen + normalLen, NULL, GL_STATIC_DRAW);
-
- glBufferSubData(GL_ARRAY_BUFFER, 0, vertsLen, glm::value_ptr(vertices[0]));
- glBufferSubData(GL_ARRAY_BUFFER, vertsLen, colorsLen, colors);
- glBufferSubData(GL_ARRAY_BUFFER, vertsLen + colorsLen, normalLen, glm::value_ptr(normals[0]));
-
- glBindVertexArray(vao);
-
- glEnableVertexAttribArray(posId);
- glVertexAttribPointer(posId, 3, GL_FLOAT, GL_FALSE, 0, 0);
-
- glEnableVertexAttribArray(colorId);
- glVertexAttribPointer(colorId, 4, GL_FLOAT, GL_FALSE, 0, BUFFER_OFFSET(vertsLen));
-
- glEnableVertexAttribArray(normalLoc);
- glVertexAttribPointer(normalLoc, 3, GL_FLOAT, GL_FALSE, 0, BUFFER_OFFSET(vertsLen + colorsLen));
-
- return vao;
-}
-
-vector<glm::vec3> quadToTriangles(glm::vec3 *quads) {
- vector<glm::vec3> triangles(6);
- triangles[0] = quads[0];
- triangles[1] = quads[1];
- triangles[2] = quads[2];
- triangles[3] = quads[2];
- triangles[4] = quads[3];
- triangles[5] = quads[0];
- return triangles;
-}
-
-template <typename T>
-void append(vector<T> &a, vector<T> &b) {
- a.insert(a.end(), b.begin(), b.end());
-};
-