Main.cpp 2.3 KB

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