// Local headers #include "utilities/window.hpp" #include "program.hpp" // System headers #include #include // Standard headers #include #include // A callback which allows GLFW to report errors whenever they occur static void glfwErrorCallback(int error, const char *description) { fprintf(stderr, "GLFW returned an error:\n\t%s (%i)\n", description, error); } GLFWwindow* initialise() { // Initialise GLFW if (!glfwInit()) { fprintf(stderr, "Could not start GLFW\n"); exit(EXIT_FAILURE); } // Set core window options (adjust version numbers if needed) glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4); glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); // Enable the GLFW runtime error callback function defined previously. glfwSetErrorCallback(glfwErrorCallback); // Set additional window options glfwWindowHint(GLFW_RESIZABLE, windowResizable); glfwWindowHint(GLFW_SAMPLES, windowSamples); // MSAA // Create window using GLFW GLFWwindow* window = glfwCreateWindow(windowWidth, windowHeight, windowTitle.c_str(), nullptr, nullptr); // Ensure the window is set up correctly if (!window) { fprintf(stderr, "Could not open GLFW window\n"); glfwTerminate(); exit(EXIT_FAILURE); } // Let the window be the current OpenGL context and initialise glad glfwMakeContextCurrent(window); gladLoadGL(); // Print various OpenGL information to stdout printf("%s: %s\n", glGetString(GL_VENDOR), glGetString(GL_RENDERER)); printf("GLFW\t %s\n", glfwGetVersionString()); printf("OpenGL\t %s\n", glGetString(GL_VERSION)); printf("GLSL\t %s\n\n", glGetString(GL_SHADING_LANGUAGE_VERSION)); return window; } int main(int argc, const char* argb[]) { arrrgh::parser parser("glowbox", "Small breakout like juggling game"); const auto& showHelp = parser.add("help", "Show this help message.", 'h', arrrgh::Optional, false); const auto& enableMusic = parser.add("enable-music", "Play background music while the game is playing", 'm', arrrgh::Optional, false); const auto& enableAutoplay = parser.add("autoplay", "Let the game play itself automatically. Useful for testing.", 'a', arrrgh::Optional, false); // If you want to add more program arguments, define them here, // but do not request their value here (they have not been parsed yet at this point). try { parser.parse(argc, argb); } catch (const std::exception& e) { std::cerr << "Error parsing arguments: " << e.what() << std::endl; parser.show_usage(std::cerr); exit(1); } // Show help if desired if(showHelp.value()) { return 0; } CommandLineOptions options; options.enableMusic = enableMusic.value(); options.enableAutoplay = enableAutoplay.value(); // Initialise window using GLFW GLFWwindow* window = initialise(); // Run an OpenGL application using this window runProgram(window, options); // Terminate GLFW (no need to call glfwDestroyWindow) glfwTerminate(); return EXIT_SUCCESS; }