Game.cpp 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. #include <cmath>
  2. #include <iostream>
  3. #include "Game.h"
  4. #include "MarchingCubes.h"
  5. #include "gaming-core/utils/Array.h"
  6. #include "gaming-core/utils/List.h"
  7. #include "gaming-core/utils/Random.h"
  8. #include "gaming-core/utils/Utils.h"
  9. #include "gaming-core/wrapper/GL.h"
  10. Game::Game(Shader& shader, Shader& noiceShader, LayeredFramebuffer& buffer,
  11. Buttons& buttons, const Size& size)
  12. : shader(shader), noiceShader(noiceShader), noiceBuffer(buffer),
  13. bricks("resources/bricks.png"), bricksBump("resources/bricks_bump.png"),
  14. bricksNormal("resources/bricks_normal.png"), buttons(buttons), size(size),
  15. frustum(60, 0.1f, 1000.0f, size), up(GLFW_KEY_SPACE, "Up"),
  16. down(GLFW_KEY_LEFT_SHIFT, "Down"), left(GLFW_KEY_A, "left"),
  17. right(GLFW_KEY_D, "right"), front(GLFW_KEY_W, "front"),
  18. back(GLFW_KEY_S, "back"), toggle(GLFW_KEY_T, "toggle"),
  19. scaleUp(GLFW_KEY_G, "scale up"), scaleDown(GLFW_KEY_H, "scale down"),
  20. stepsUp(GLFW_KEY_Y, "steps up"), stepsDown(GLFW_KEY_U, "steps down"),
  21. fineStepsUp(GLFW_KEY_I, "fine steps up"),
  22. fineStepsDown(GLFW_KEY_O, "fine steps down"),
  23. modeToggle(GLFW_KEY_C, "mode toggle"), oldHeight(0.0f), height(0.0f),
  24. heightScale(0.01f), steps(1), fineSteps(1), mode(false) {
  25. buttons.add(up);
  26. buttons.add(down);
  27. buttons.add(left);
  28. buttons.add(right);
  29. buttons.add(front);
  30. buttons.add(back);
  31. buttons.add(toggle);
  32. buttons.add(scaleUp);
  33. buttons.add(scaleDown);
  34. buttons.add(stepsUp);
  35. buttons.add(stepsDown);
  36. buttons.add(fineStepsUp);
  37. buttons.add(fineStepsDown);
  38. buttons.add(modeToggle);
  39. bricks.setLinearFilter();
  40. bricksBump.setLinearFilter();
  41. bricksNormal.setLinearFilter();
  42. position = Vector3(-32.0f, 0.0f, -120.0f);
  43. rectangleBuffer.setAttributes(Attributes().addFloat(2));
  44. float recData[6][2] = {{-1.0f, -1.0f}, {-1.0, 1.0}, {1.0, -1.0},
  45. {1.0f, 1.0f}, {-1.0, 1.0}, {1.0, -1.0}};
  46. rectangleBuffer.setStaticData(sizeof(recData), recData);
  47. noiceBuffer.bindTextureTo(0);
  48. }
  49. void Game::render(float lag) {
  50. GL::setViewport(64, 64);
  51. noiceShader.use();
  52. noiceBuffer.bindAndClear();
  53. float step = 1.0f / 31.5f;
  54. noiceShader.setFloat("height", oldHeight * step);
  55. for(int i = 0; i < 64; i++) {
  56. noiceShader.setFloat("layer", i * step - 1.0f);
  57. noiceBuffer.bindLayer(i);
  58. rectangleBuffer.draw(6);
  59. }
  60. GL::setViewport(size.width, size.height);
  61. shader.use();
  62. GL::bindMainFramebuffer();
  63. GL::clear();
  64. shader.setMatrix("proj", frustum.updateProjection().getValues());
  65. Matrix m;
  66. m.translate(Utils::interpolate(oldPosition, position, lag));
  67. m.translateY(-32.0f + (oldHeight - height) * lag);
  68. shader.setMatrix("view", m.getValues());
  69. shader.setFloat("height", oldHeight * step * 0.5f);
  70. shader.setVector("viewPos", -position + Vector3(0.0f, 32.0f, 0.0f));
  71. shader.setVector("lightPos", Vector3());
  72. shader.setFloat("heightScale", heightScale);
  73. shader.setInt("steps", steps);
  74. shader.setInt("fineSteps", fineSteps);
  75. shader.setInt("kajetan", mode);
  76. if(toggle.isDown()) {
  77. glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
  78. }
  79. noiceBuffer.bindTextureTo(0);
  80. bricks.bindTo(1);
  81. bricksBump.bindTo(2);
  82. bricksNormal.bindTo(3);
  83. emptyBuffer.drawPoints(64 * 64 * 64);
  84. glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
  85. }
  86. void Game::tick() {
  87. StringBuffer<50>()
  88. .append(steps)
  89. .append(" ")
  90. .append(fineSteps)
  91. .append(" ")
  92. .append(heightScale)
  93. .printLine();
  94. oldHeight = height;
  95. oldPosition = position;
  96. if(up.isDown()) {
  97. height += 1.0f;
  98. }
  99. if(down.isDown()) {
  100. height -= 1.0f;
  101. }
  102. const float speed = 1.15f;
  103. if(left.isDown()) {
  104. position += Vector3(speed, 0.0f, 0.0f);
  105. }
  106. if(right.isDown()) {
  107. position -= Vector3(speed, 0.0f, 0.0f);
  108. }
  109. if(front.isDown()) {
  110. position += Vector3(0.0f, 0.0f, speed);
  111. }
  112. if(back.isDown()) {
  113. position -= Vector3(0.0f, 0.0f, speed);
  114. }
  115. if(scaleUp.isDown()) {
  116. heightScale += 0.005f;
  117. }
  118. if(scaleDown.isDown()) {
  119. heightScale -= 0.005f;
  120. if(heightScale < 0.0f) {
  121. heightScale = 0.0f;
  122. }
  123. }
  124. if(stepsUp.wasReleased()) {
  125. steps++;
  126. }
  127. if(stepsDown.wasReleased() && steps > 1) {
  128. steps--;
  129. }
  130. if(fineStepsUp.wasReleased()) {
  131. fineSteps++;
  132. }
  133. if(fineStepsDown.wasReleased() && fineSteps > 1) {
  134. fineSteps--;
  135. }
  136. if(modeToggle.wasReleased()) {
  137. mode = !mode;
  138. }
  139. }
  140. bool Game::isRunning() const {
  141. return true;
  142. }