Compare commits

..

3 Commits

Author SHA1 Message Date
7a3e5364e0 Add toggle-able Wireframe mode 2021-03-21 20:37:32 +01:00
3254144ff3 Make noise more helix-y 2021-03-21 20:31:14 +01:00
7b6a9c7b45 Add Input system for keyboard movement 2021-03-21 19:31:49 +01:00
5 changed files with 69 additions and 13 deletions

15
Input.h Normal file
View File

@ -0,0 +1,15 @@
#include <map>
class Input {
public:
inline static std::map<int, bool> keys_down;
static void set_key_down(int key, bool down) {
keys_down[key] = down;
}
static bool is_key_down(int key) {
return keys_down[key];
}
};

View File

@ -1,5 +1,6 @@
#include "MCRenderer.h" #include "MCRenderer.h"
#include "Framebuffer3D.h" #include "Framebuffer3D.h"
#include "Input.h"
#include "VertexBuffer.h" #include "VertexBuffer.h"
#include <glm/ext/matrix_transform.hpp> #include <glm/ext/matrix_transform.hpp>
@ -25,7 +26,26 @@ void MCRenderer::render(float delta) {
noise_shader.use(); noise_shader.use();
noise.bind_and_clear(); noise.bind_and_clear();
noise_shader.setFloat("height", 0); if (Input::is_key_down(GLFW_KEY_E)) {
height += delta;
}
if (Input::is_key_down(GLFW_KEY_Q)) {
height -= delta;
}
if (Input::is_key_down(GLFW_KEY_W)) {
camera.translate(glm::vec3(0.0, 0.0, -delta * 20.0));
}
if (Input::is_key_down(GLFW_KEY_S)) {
camera.translate(glm::vec3(0.0, 0.0, delta * 20.0));
}
if (Input::is_key_down(GLFW_KEY_D)) {
camera.rotate(-delta * 90.0, glm::vec3(0.0, 1.0, 0.0));
}
if (Input::is_key_down(GLFW_KEY_A)) {
camera.rotate(delta * 90.0, glm::vec3(0.0, 1.0, 0.0));
}
noise_shader.setFloat("height", height);
for (int i = 0; i < size_z; i++) { for (int i = 0; i < size_z; i++) {
// Create one layer // Create one layer
@ -47,9 +67,6 @@ void MCRenderer::render(float delta) {
glClearColor(0.6f, 0.9f, 0.9f, 1.0f); glClearColor(0.6f, 0.9f, 0.9f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
// Set the camera position
camera.rotate(delta, glm::vec3(0.0, 1.0, 0.0));
// Bind the camera to the rendering shader // Bind the camera to the rendering shader
render_shader.setMat4("proj", camera.get_projection()); render_shader.setMat4("proj", camera.get_projection());
render_shader.setMat4("view", camera.get_view()); render_shader.setMat4("view", camera.get_view());
@ -67,5 +84,5 @@ void MCRenderer::render(float delta) {
// Draw all layers as polygons // Draw all layers as polygons
glDrawArrays(GL_POINTS, 0, size_x * size_y * size_z); glDrawArrays(GL_POINTS, 0, size_x * size_y * size_z);
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); glPolygonMode(GL_FRONT_AND_BACK, Input::is_key_down(GLFW_KEY_X) ? GL_LINE : GL_FILL);
} }

View File

@ -16,6 +16,8 @@ class MCRenderer {
int size_y; int size_y;
int size_z; int size_z;
float height = 0.0;
Shader render_shader; Shader render_shader;
Shader noise_shader; Shader noise_shader;

View File

@ -5,10 +5,16 @@ in vec3 varPosition;
out float noise; out float noise;
void main(void) { void main(void) {
// Just to random stuff to the numbers until it looks nice // Base: Distance to a helix
float f1 = sin((varPosition.x + varPosition.z) * 10.0); vec3 helix_pos = vec3(sin(varPosition.y * 5.0) * 0.2 + 0.5, varPosition.y, cos(varPosition.y * 5.0) * 0.2 + 0.5);
float f2 = cos((varPosition.y + varPosition.x) * 7.0); float dist = distance(helix_pos, varPosition);
float f3 = cos((varPosition.z + varPosition.y) * 8.0);
noise = (f1 * f1 + f2 * f2 + f3 * f3) * (1.0 / 3.0); noise = 0.6 - dist;
// Create some blobby shapes on the helix
float f1 = sin((varPosition.x + varPosition.z) * 7.0);
float f2 = cos((varPosition.y + varPosition.x) * 3.0);
float f3 = cos((varPosition.z + varPosition.y) * 8.0);
noise += abs(f1 + f2 + f3) * 0.1;
} }

View File

@ -6,11 +6,18 @@
#include <iostream> #include <iostream>
#include "Framebuffer3D.h" #include "Framebuffer3D.h"
#include "Input.h"
#include "MCRenderer.h" #include "MCRenderer.h"
#include "Shader.h" #include "Shader.h"
void framebuffer_size_callback(GLFWwindow *window, int width, int height); void framebuffer_size_callback(GLFWwindow *window, int width, int height);
static void key_callback(GLFWwindow *window, int key, int scancode, int action, int mods) {
if (key == GLFW_KEY_ESCAPE && action == GLFW_PRESS) glfwSetWindowShouldClose(window, GLFW_TRUE);
Input::set_key_down(key, action == GLFW_RELEASE ? false : true);
}
// settings // settings
const unsigned int SCR_WIDTH = 1920; const unsigned int SCR_WIDTH = 1920;
const unsigned int SCR_HEIGHT = 1080; const unsigned int SCR_HEIGHT = 1080;
@ -44,6 +51,9 @@ int main() {
return -1; return -1;
} }
// Keyboard input processing function
glfwSetKeyCallback(window, key_callback);
// configure global opengl state // configure global opengl state
// ----------------------------- // -----------------------------
glEnable(GL_DEPTH_TEST); glEnable(GL_DEPTH_TEST);
@ -52,16 +62,22 @@ int main() {
MCRenderer renderer = MCRenderer(128, 128, 128); MCRenderer renderer = MCRenderer(128, 128, 128);
// render loop // render loop
// ----------- double timeInLastFrame = glfwGetTime();
double elapsed_time = 0.0;
while (!glfwWindowShouldClose(window)) { while (!glfwWindowShouldClose(window)) {
renderer.render(0.1); // TODO: Proper delta // Delta time handling
double delta = glfwGetTime() - timeInLastFrame;
timeInLastFrame = glfwGetTime();
elapsed_time += delta;
renderer.render(delta);
// glfw: swap buffers and poll IO events (keys pressed/released, mouse moved etc.) // glfw: swap buffers and poll IO events (keys pressed/released, mouse moved etc.)
glfwSwapBuffers(window); glfwSwapBuffers(window);
glfwPollEvents(); glfwPollEvents();
} }
glfwTerminate();
return 0; return 0;
} }