diff --git a/src/graphics.cpp b/src/graphics.cpp index 6d150a1..d2cf4ee 100644 --- a/src/graphics.cpp +++ b/src/graphics.cpp @@ -1,6 +1,6 @@ +#include #include #include -#include #include #include // glad must be loaded before GLFW @@ -14,14 +14,15 @@ using namespace std; ShaderProgram::Base ShaderProgram::baseFromName(string name) { string lname = name; boost::algorithm::to_lower(lname); // yes, cpp needs a library to do this. + // luckily I'm already using boost so I + // don't need to worry too much about it. // can't do a switch over strings in cpp. if (lname == "empty") { return Empty; } if (lname == "triangle") { return Triangle; - } - else { + } else { BOOST_LOG_TRIVIAL(fatal) << "unknown base program \"" << name << "\""; exit(EXIT_USAGE); } @@ -63,23 +64,66 @@ ShaderProgram::ShaderProgram(Base base, char **vertexSource, glShaderSource(this->frag, 2, fragSource, NULL); BOOST_LOG_TRIVIAL(trace) << "compiling fragments shader"; glCompileShader(this->frag); + + // check if the compilation was successful + int success; + char infoLog[512]; + glGetShaderiv(this->vertex, GL_COMPILE_STATUS, &success); + if (!success) { + glGetShaderInfoLog(this->vertex, 512, NULL, infoLog); + BOOST_LOG_TRIVIAL(fatal) << "could not compile vertex shader:\n\n" + << infoLog << std::endl; + exit(EXIT_SHADER); + } + glGetShaderiv(this->frag, GL_COMPILE_STATUS, &success); + if (!success) { + glGetShaderInfoLog(this->frag, 512, NULL, infoLog); + BOOST_LOG_TRIVIAL(fatal) << "could not compile fragments shader:\n\n" + << infoLog << std::endl; + exit(EXIT_SHADER); + } } -/** runs for every frame +/** defines the base program behavior. * * will be called in `mainWindow`. - * - * FIXME: dont run the switch case every frame. */ -int ShaderProgram::run() { - switch (this->base) { - case Empty: // same as default - default: - glClearColor(0.2f, 0.3f, 0.3f, 1.0f); - glClear(GL_COLOR_BUFFER_BIT); - break; +int ShaderProgram::run(GLFWwindow *window) { + if (this->base == Triangle) { + float vTriangle[] = { + -0.5f, -0.5f, 0.0f, // opengl + 0.5f, -0.5f, 0.0f, // treats 3d arrays + 0.0f, 0.5f, 0.0f // as large 1d arrays + }; + unsigned int oTriangle; + glGenBuffers(1, &oTriangle); + glBindBuffer(GL_ARRAY_BUFFER, oTriangle); + glBufferData(GL_ARRAY_BUFFER, sizeof(vTriangle), vTriangle, GL_STATIC_DRAW); + while (!glfwWindowShouldClose(window)) { + processInput(window); + + glClearColor(0.9f, 0.3f, 0.3f, 1.0f); + glClear(GL_COLOR_BUFFER_BIT); + + glfwSwapBuffers(window); + glfwPollEvents(); + } + return 0; + } else // Empty + { + + return 0; + while (!glfwWindowShouldClose(window)) { + processInput(window); + + glClearColor(0.2f, 0.3f, 0.3f, 1.0f); + glClear(GL_COLOR_BUFFER_BIT); + + glfwSwapBuffers(window); + glfwPollEvents(); + } + return 0; } - return 0; } /* functions that run out graphics stuff */ @@ -117,14 +161,9 @@ int mainWindow(ShaderProgram *shaderProgram, GLFWwindow *window) { int result = 0; - BOOST_LOG_TRIVIAL(trace) << "Entering window loop"; - while (!glfwWindowShouldClose(window)) { - processInput(window); - shaderProgram->run(); - glfwSwapBuffers(window); - glfwPollEvents(); - } - BOOST_LOG_TRIVIAL(trace) << "Left window loop"; + BOOST_LOG_TRIVIAL(trace) << "Base program"; + result = shaderProgram->run(window); + BOOST_LOG_TRIVIAL(trace) << "Left base program"; glfwTerminate(); return result; diff --git a/src/graphics.hpp b/src/graphics.hpp index 54c2376..2729069 100644 --- a/src/graphics.hpp +++ b/src/graphics.hpp @@ -11,7 +11,7 @@ public: std::string baseName(); static Base baseFromName(std::string name); ShaderProgram(Base base, char** vertexSource, char** fragSource); - int run(); + int run(GLFWwindow* window); protected: unsigned int vertex; diff --git a/src/main.cpp b/src/main.cpp index 85f1270..f14d62c 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -116,7 +116,8 @@ void help(char *prog, po::options_description desc) { << "1\tGeneric Failure" << endl << "2\tBad arguments" << endl << "3\tI/O Error" << endl - << "3\tOpenGL Error" << endl + << "4\tOpenGL Error" << endl + << "5\tShader Source Error" << endl << endl << endl << "base programs:" << endl diff --git a/src/main.hpp b/src/main.hpp index de0a69f..2cdb704 100644 --- a/src/main.hpp +++ b/src/main.hpp @@ -14,6 +14,7 @@ const int EXIT_USAGE = 2; const int EXIT_IO = 3; const int EXIT_GL = 4; +const int EXIT_SHADER = 5; namespace po = boost::program_options; using namespace std;