Main.cpp 2.6 KB

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