Engine.cpp 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. #include <getopt.h>
  2. #include "Engine.h"
  3. #include "Game.h"
  4. #include "input/Controller.h"
  5. #include "rendering/Shader.h"
  6. #include "rendering/Window.h"
  7. static Window window;
  8. static Shader shader;
  9. static bool parseArgs(int argAmount, char* const* args,
  10. WindowOptions& options) {
  11. while(true) {
  12. switch(getopt(argAmount, args, "fv")) {
  13. case '?': return true;
  14. case 'f': options.fullscreen = true; break;
  15. case 'v': options.vsync = true; break;
  16. case -1: return false;
  17. }
  18. }
  19. }
  20. bool Engine::init(int argAmount, char* const* args) {
  21. WindowOptions options(3, 0, {800, 480}, true, "Pigine");
  22. if(parseArgs(argAmount, args, options)) {
  23. return true;
  24. }
  25. Error error = window.open(options);
  26. if(error.has()) {
  27. error.message.printLine();
  28. return true;
  29. }
  30. error = shader.compile("resources/shader/vertex.vs",
  31. "resources/shader/fragment.fs");
  32. if(error.has()) {
  33. error.message.printLine();
  34. return true;
  35. }
  36. Controller::init(window.buttons);
  37. return false;
  38. }
  39. struct Loop {
  40. Renderer renderer{shader};
  41. void tick() {
  42. Game::tick();
  43. }
  44. void render(float lag) {
  45. GL::clear();
  46. const Size& size = window.getSize();
  47. GL::setViewport(size.width, size.height);
  48. Matrix view;
  49. view.scale(Vector3(2.0f / size.width, -2.0f / size.height, 1.0f));
  50. view.translate(Vector3(-1.0f, 1.0f, 0.0f));
  51. shader.setMatrix("view", view.getValues());
  52. Game::render(lag, renderer);
  53. GL::printError("GL-Error");
  54. }
  55. bool isRunning() const {
  56. return Game::isRunning();
  57. }
  58. };
  59. void Engine::start() {
  60. Loop loop;
  61. window.run(loop, 10'000'000);
  62. }
  63. const Size& Engine::getSize() {
  64. return window.getSize();
  65. }