Main.cpp 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. #include <iostream>
  2. #include <cstring>
  3. #include <fstream>
  4. #include "rendering/GLFW.h"
  5. #include "rendering/Window.h"
  6. #include "rendering/Shader.h"
  7. #include "input/Keys.h"
  8. #include "rendering/GL.h"
  9. #include "rendering/Renderer.h"
  10. #include "Game.h"
  11. #include "utils/Random.h"
  12. bool initGLEW() {
  13. GLenum err = glewInit();
  14. if(err != GLEW_OK) {
  15. std::cout << "could not initialize GLEW: " << glewGetErrorString(err) << "\n";
  16. return true;
  17. }
  18. std::cout << "using GLEW " << glewGetString(GLEW_VERSION) << "\n";
  19. return false;
  20. }
  21. void initCallbacks(Window& w, Keys& keys) {
  22. static Keys& cKeys = keys;
  23. w.setFramebufferSizeCallback([](GLFWwindow*, int newWidth, int newHeight) {
  24. glViewport(0, 0, newWidth, newHeight);
  25. });
  26. w.setKeyCallback([](GLFWwindow*, int key, int, int action, int) {
  27. if(action == GLFW_PRESS) {
  28. cKeys.press(key);
  29. } else if(action == GLFW_RELEASE) {
  30. cKeys.release(key);
  31. }
  32. });
  33. }
  34. int main(int argAmount, const char** args) {
  35. if(argAmount < 2 || strcmp(args[1], "-r") == 0) {
  36. std::cout << "expecting at least one argument: filename or number\n";
  37. return 0;
  38. }
  39. bool steps = true;
  40. bool skip = true;
  41. for(int i = 1; i < argAmount; i++) {
  42. if(strcmp(args[i], "-r") == 0) {
  43. steps = false;
  44. } else if(strcmp(args[i], "-v") == 0) {
  45. skip = false;
  46. }
  47. }
  48. if(skip) {
  49. Keys keys;
  50. Game game(keys, args[1], steps);
  51. return 0;
  52. }
  53. if(GLFW::hasError()) {
  54. return 0;
  55. }
  56. Window window(1024, 620, "Test");
  57. if(window.hasError() || initGLEW()) {
  58. return 0;
  59. }
  60. Shader shader;
  61. if(shader.hasError()) {
  62. return 0;
  63. }
  64. Keys keys;
  65. Game game(keys, args[1], steps);
  66. initCallbacks(window, keys);
  67. window.show();
  68. GL::disableDepthTesting();
  69. GL::checkAndPrintError("setup error");
  70. const u64 nanosPerTick = 25000000;
  71. u64 lastTime = GLFW::getTimeNanos();
  72. u64 lag = 0;
  73. while(!window.shouldClose() && game.isRunning()) {
  74. GL::checkAndPrintError("loop error");
  75. GL::prepareMainFramebuffer();
  76. shader.use();
  77. Renderer renderer;
  78. game.render(static_cast<float> (lag) / nanosPerTick, renderer);
  79. window.swapBuffers();
  80. u64 currentTime = GLFW::getTimeNanos();
  81. lag += currentTime - lastTime;
  82. lastTime = currentTime;
  83. while(lag >= nanosPerTick) {
  84. lag -= nanosPerTick;
  85. keys.tick();
  86. game.tick();
  87. }
  88. glfwPollEvents();
  89. }
  90. return 0;
  91. }