main.c 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. /*
  2. * Voxel-a-tord
  3. * main.c:
  4. * Copyright (c) 2022 986-Studio. All rights reserved.
  5. *
  6. * Created by Manoël Trapier on 28/09/2022.
  7. */
  8. #include <stdio.h>
  9. #include <stdint.h>
  10. #include <stdbool.h>
  11. #include <sys/time.h>
  12. #include <SDL.h>
  13. #include <log.h>
  14. #include <display.h>
  15. #include <texture.h>
  16. bool isRunning = false;
  17. int previousFrameTime = 0;
  18. double deltaTime = 0;
  19. static double updateTime, renderTime, waitTime;
  20. static int windowHeight;
  21. static int windowWidth;
  22. uint32_t getMicroSecTime()
  23. {
  24. struct timeval curTime;
  25. gettimeofday(&curTime, NULL);
  26. return ((curTime.tv_sec) * 1000 * 1000) + (curTime.tv_usec);
  27. }
  28. void processInput()
  29. {
  30. SDL_Event event;
  31. while(SDL_PollEvent(&event))
  32. {
  33. switch (event.type)
  34. {
  35. case SDL_QUIT:
  36. isRunning = false;
  37. break;
  38. case SDL_KEYDOWN:
  39. switch (event.key.keysym.sym)
  40. {
  41. case SDLK_ESCAPE: isRunning = false; break;
  42. case SDLK_LEFT: break;
  43. case SDLK_RIGHT: break;
  44. case SDLK_UP: break;
  45. case SDLK_DOWN: break;
  46. case SDLK_PAGEUP: break;
  47. case SDLK_PAGEDOWN: break;
  48. }
  49. break;
  50. default:
  51. break;
  52. }
  53. }
  54. }
  55. void setup()
  56. {
  57. isRunning = true;
  58. }
  59. void update()
  60. {
  61. int i;
  62. uint32_t timeToWait = FRAME_TARGET_TIME - (SDL_GetTicks() - previousFrameTime);
  63. uint32_t ticks = getMicroSecTime();
  64. if (timeToWait <= FRAME_TARGET_TIME)
  65. {
  66. SDL_Delay(timeToWait);
  67. }
  68. deltaTime = (SDL_GetTicks() - previousFrameTime) / 1000.0;
  69. previousFrameTime = SDL_GetTicks();
  70. waitTime = (waitTime + (getMicroSecTime() - ticks) / 1000.) / 2.0;
  71. ticks = getMicroSecTime();
  72. /* [...] */
  73. updateTime = (updateTime + (getMicroSecTime() - ticks) / 1000.) / 2.0;
  74. }
  75. void render()
  76. {
  77. uint32_t ticks = getMicroSecTime();
  78. renderFrameBuffer();
  79. renderTime = (renderTime + (getMicroSecTime() - ticks) / 1000.) / 2.0;
  80. drawText(5, 5, 0x11FF22, "Wait time: %02.2f ms", waitTime);
  81. drawText(5, 17, 0x11FF22, "Update time: %02.2f ms", updateTime);
  82. drawText(5, 29, 0x11FF22, "Render time: %02.2f ms", renderTime);
  83. drawText(5, 41, 0x11FF22, "FPS: %.1f | dT: %.3f", 1000 / (waitTime + updateTime + renderTime), deltaTime);
  84. displayWindowRender();
  85. }
  86. int main(int argc, char *argv[])
  87. {
  88. int param_i, i;
  89. bool fullScreen = false;
  90. MAX_DEBUG_LEVEL = TLOG_DEBUG;
  91. Log(TLOG_ALWAYS, NULL, "Starting Voxel Engine (version %s)!", VERSION);
  92. windowWidth = 320;
  93. windowHeight = 240;
  94. for (param_i = 1 ; (param_i < argc) && (argv[param_i][0] == '-') ; param_i++)
  95. {
  96. switch (argv[param_i][1])
  97. {
  98. default: exit(-1); /* Option not recognized */
  99. case 'f': fullScreen = true; break;
  100. case 'w': windowWidth = atoi(argv[++param_i]); break;
  101. case 'h': windowHeight = atoi(argv[++param_i]); break;
  102. #ifdef DYNA_LOG_LEVEL
  103. case 'l': MAX_DEBUG_LEVEL = atoi(argv[++param_i]); break;
  104. #endif
  105. case '-': goto no_more_params; /* Could use break, but this is more clear */
  106. }
  107. }
  108. no_more_params:
  109. isRunning = initialiseWindow(windowWidth, windowHeight, fullScreen);
  110. setup();
  111. while (isRunning)
  112. {
  113. processInput();
  114. update();
  115. render();
  116. }
  117. destroyWindow();
  118. return 0;
  119. }