|
@@ -9,12 +9,13 @@
|
|
#include "gaming-core/utils/Utils.h"
|
|
#include "gaming-core/utils/Utils.h"
|
|
#include "gaming-core/wrapper/GL.h"
|
|
#include "gaming-core/wrapper/GL.h"
|
|
|
|
|
|
-Game::Game(Shader& shader, Shader& noiceShader, LayeredFramebuffer& buffer,
|
|
|
|
- Buttons& buttons, const Size& size)
|
|
|
|
- : shader(shader), noiceShader(noiceShader), noiceBuffer(buffer),
|
|
|
|
- bricks("resources/bricks.png"), bricksBump("resources/bricks_bump.png"),
|
|
|
|
|
|
+Game::Game(Shader& shader, Shader& noiceShader, Shader& particleShader,
|
|
|
|
+ LayeredFramebuffer& buffer, Buttons& buttons, const Size& size)
|
|
|
|
+ : shader(shader), noiceShader(noiceShader), particleShader(particleShader),
|
|
|
|
+ noiceBuffer(buffer), bricks("resources/bricks.png"),
|
|
|
|
+ bricksBump("resources/bricks_bump.png"),
|
|
bricksNormal("resources/bricks_normal.png"), buttons(buttons), size(size),
|
|
bricksNormal("resources/bricks_normal.png"), buttons(buttons), size(size),
|
|
- frustum(60, 0.1f, 1000.0f, size), up(GLFW_KEY_SPACE, "Up"),
|
|
|
|
|
|
+ frustum(60.0f, 0.1f, 1000.0f, size), up(GLFW_KEY_SPACE, "Up"),
|
|
down(GLFW_KEY_LEFT_SHIFT, "Down"), left(GLFW_KEY_A, "left"),
|
|
down(GLFW_KEY_LEFT_SHIFT, "Down"), left(GLFW_KEY_A, "left"),
|
|
right(GLFW_KEY_D, "right"), front(GLFW_KEY_W, "front"),
|
|
right(GLFW_KEY_D, "right"), front(GLFW_KEY_W, "front"),
|
|
back(GLFW_KEY_S, "back"), toggle(GLFW_KEY_T, "toggle"),
|
|
back(GLFW_KEY_S, "back"), toggle(GLFW_KEY_T, "toggle"),
|
|
@@ -22,8 +23,11 @@ Game::Game(Shader& shader, Shader& noiceShader, LayeredFramebuffer& buffer,
|
|
stepsUp(GLFW_KEY_Y, "steps up"), stepsDown(GLFW_KEY_U, "steps down"),
|
|
stepsUp(GLFW_KEY_Y, "steps up"), stepsDown(GLFW_KEY_U, "steps down"),
|
|
fineStepsUp(GLFW_KEY_I, "fine steps up"),
|
|
fineStepsUp(GLFW_KEY_I, "fine steps up"),
|
|
fineStepsDown(GLFW_KEY_O, "fine steps down"),
|
|
fineStepsDown(GLFW_KEY_O, "fine steps down"),
|
|
- modeToggle(GLFW_KEY_C, "mode toggle"), oldHeight(0.0f), height(0.0f),
|
|
|
|
- heightScale(0.01f), steps(1), fineSteps(1), mode(false) {
|
|
|
|
|
|
+ modeToggle(GLFW_KEY_C, "mode toggle"),
|
|
|
|
+ primaryMouse(GLFW_MOUSE_BUTTON_1, "primary click"),
|
|
|
|
+ timeUp(GLFW_KEY_N, "time up"), timeDown(GLFW_KEY_M, "time down"),
|
|
|
|
+ oldHeight(0.0f), height(0.0f), heightScale(0.01f), steps(1), fineSteps(1),
|
|
|
|
+ mode(false), time(0.0f), emitterAge(999999.0f), timeFactor(1.0f) {
|
|
buttons.add(up);
|
|
buttons.add(up);
|
|
buttons.add(down);
|
|
buttons.add(down);
|
|
buttons.add(left);
|
|
buttons.add(left);
|
|
@@ -38,6 +42,10 @@ Game::Game(Shader& shader, Shader& noiceShader, LayeredFramebuffer& buffer,
|
|
buttons.add(fineStepsUp);
|
|
buttons.add(fineStepsUp);
|
|
buttons.add(fineStepsDown);
|
|
buttons.add(fineStepsDown);
|
|
buttons.add(modeToggle);
|
|
buttons.add(modeToggle);
|
|
|
|
+ buttons.add(timeUp);
|
|
|
|
+ buttons.add(timeDown);
|
|
|
|
+
|
|
|
|
+ buttons.addMouse(primaryMouse);
|
|
|
|
|
|
bricks.setLinearFilter();
|
|
bricks.setLinearFilter();
|
|
bricksBump.setLinearFilter();
|
|
bricksBump.setLinearFilter();
|
|
@@ -68,7 +76,8 @@ void Game::render(float lag) {
|
|
shader.use();
|
|
shader.use();
|
|
GL::bindMainFramebuffer();
|
|
GL::bindMainFramebuffer();
|
|
GL::clear();
|
|
GL::clear();
|
|
- shader.setMatrix("proj", frustum.updateProjection().getValues());
|
|
|
|
|
|
+ Matrix& proj = frustum.updateProjection();
|
|
|
|
+ shader.setMatrix("proj", proj.getValues());
|
|
|
|
|
|
Matrix m;
|
|
Matrix m;
|
|
m.translate(Utils::interpolate(oldPosition, position, lag));
|
|
m.translate(Utils::interpolate(oldPosition, position, lag));
|
|
@@ -92,16 +101,94 @@ void Game::render(float lag) {
|
|
bricksNormal.bindTo(3);
|
|
bricksNormal.bindTo(3);
|
|
emptyBuffer.drawPoints(64 * 64 * 64);
|
|
emptyBuffer.drawPoints(64 * 64 * 64);
|
|
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
|
|
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
|
|
|
|
+
|
|
|
|
+ glPointSize(5.0f);
|
|
|
|
+ particleShader.use();
|
|
|
|
+ particleShader.setMatrix("proj", proj.getValues());
|
|
|
|
+ m.translateTo(Utils::interpolate(oldPosition, position, lag));
|
|
|
|
+ m.translateY(-32.0f - (oldHeight + (height - oldHeight) * lag));
|
|
|
|
+ particleShader.setMatrix("view", m.getValues());
|
|
|
|
+ particleShader.setFloat("time", time + lag);
|
|
|
|
+
|
|
|
|
+ GL::enableBlending();
|
|
|
|
+ glDepthMask(false);
|
|
|
|
+
|
|
|
|
+ if(primaryMouse.wasReleased()) {
|
|
|
|
+ noiceBuffer.bindTextureTo(0);
|
|
|
|
+ static float buffer[64][64][64];
|
|
|
|
+ glGetTexImage(GL_TEXTURE_3D, 0, GL_RED, GL_FLOAT, buffer);
|
|
|
|
+
|
|
|
|
+ float hWidth = size.width * 0.5f;
|
|
|
|
+ float hHeight = size.height * 0.5f;
|
|
|
|
+
|
|
|
|
+ float x = (buttons.getMouseX() - hWidth) / hWidth;
|
|
|
|
+ float y = -(buttons.getMouseY() - hHeight) / hHeight;
|
|
|
|
+
|
|
|
|
+ float aspect = hWidth / hHeight;
|
|
|
|
+ float tan = tanf((0.5f * frustum.fieldOfView) * M_PI / 180.0f);
|
|
|
|
+ float q = 1.0f / tan;
|
|
|
|
+
|
|
|
|
+ Vector3 direction(x / (q / aspect), y / q, 1.0f);
|
|
|
|
+ direction[2] = -direction[2];
|
|
|
|
+ direction.normalize();
|
|
|
|
+
|
|
|
|
+ Vector3 pos = -position;
|
|
|
|
+ pos[1] = 32.0f;
|
|
|
|
+ pos[1] = 32.0f;
|
|
|
|
+ for(int i = 0; i < 150; i++) {
|
|
|
|
+ int x = pos[0] + 0.5f;
|
|
|
|
+ int y = pos[1] + 0.5f;
|
|
|
|
+ int z = pos[2] + 0.5f;
|
|
|
|
+ if(x >= 0 && x < 64 && y >= 0 && y < 64 && z >= 0 && z < 64 &&
|
|
|
|
+ buffer[x][y][z] > 0.5f) {
|
|
|
|
+ emitterPos = pos + Vector3(0.0f, height, 0.0f);
|
|
|
|
+ emitterAge = time;
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+ pos += direction;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ particleShader.setFloat("timeFactor", timeFactor);
|
|
|
|
+
|
|
|
|
+ particleShader.setVector("position", emitterPos);
|
|
|
|
+ particleShader.setFloat("age", emitterAge);
|
|
|
|
+ particleShader.setVector("color", Vector4(1.0f, 0.0f, 0.0f, 1.0f));
|
|
|
|
+ particleShader.setInt("seedBase", 0);
|
|
|
|
+ emptyBuffer.drawPoints(2000000);
|
|
|
|
+
|
|
|
|
+ particleShader.setVector("position", emitterPos);
|
|
|
|
+ particleShader.setFloat("age", emitterAge + 5);
|
|
|
|
+ particleShader.setVector("color", Vector4(0.0f, 1.0f, 0.0f, 1.0f));
|
|
|
|
+ particleShader.setInt("seedBase", 1);
|
|
|
|
+ emptyBuffer.drawPoints(10000);
|
|
|
|
+
|
|
|
|
+ particleShader.setVector("position", emitterPos);
|
|
|
|
+ particleShader.setFloat("age", emitterAge + 10);
|
|
|
|
+ particleShader.setVector("color", Vector4(0.0f, 0.0f, 1.0f, 1.0f));
|
|
|
|
+ particleShader.setInt("seedBase", 2);
|
|
|
|
+ emptyBuffer.drawPoints(5000);
|
|
|
|
+
|
|
|
|
+ particleShader.setVector("position", emitterPos);
|
|
|
|
+ particleShader.setFloat("age", emitterAge + 20);
|
|
|
|
+ particleShader.setVector("color", Vector4(0.0f, 1.0f, 1.0f, 1.0f));
|
|
|
|
+ particleShader.setInt("seedBase", 2);
|
|
|
|
+ emptyBuffer.drawPoints(5000);
|
|
|
|
+
|
|
|
|
+ glDepthMask(true);
|
|
|
|
+ GL::disableBlending();
|
|
}
|
|
}
|
|
|
|
|
|
void Game::tick() {
|
|
void Game::tick() {
|
|
- StringBuffer<50>()
|
|
|
|
- .append(steps)
|
|
|
|
- .append(" ")
|
|
|
|
- .append(fineSteps)
|
|
|
|
- .append(" ")
|
|
|
|
- .append(heightScale)
|
|
|
|
- .printLine();
|
|
|
|
|
|
+ if(timeUp.isDown()) {
|
|
|
|
+ timeFactor *= 1.05f;
|
|
|
|
+ std::cout << timeFactor << "\n";
|
|
|
|
+ }
|
|
|
|
+ if(timeDown.isDown()) {
|
|
|
|
+ timeFactor /= 1.05f;
|
|
|
|
+ std::cout << timeFactor << "\n";
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ time++;
|
|
oldHeight = height;
|
|
oldHeight = height;
|
|
oldPosition = position;
|
|
oldPosition = position;
|
|
if(up.isDown()) {
|
|
if(up.isDown()) {
|