From 835520edb888f144b5657420016b88cbada68e57 Mon Sep 17 00:00:00 2001 From: karl Date: Fri, 19 Mar 2021 18:27:00 +0100 Subject: [PATCH] Basic structure there, but not functional --- Camera.h | 27 ++++++ Framebuffer3D.cpp | 40 +++++++++ Framebuffer3D.h | 21 +++++ MCRenderer.cpp | 49 +++++++++++ MCRenderer.h | 22 +++++ Shader/mc.fs | 16 ++-- Shader/mc.gs | 217 ++++++++++++++++++++++++++++++++++++++++------ Shader/mc.vs | 38 +++++--- Shader/noise.fs | 13 +++ Shader/noise.vs | 13 +++ Spatial.h | 72 +++++++++++++++ VertexBuffer.cpp | 18 ++++ VertexBuffer.h | 21 +++++ main.cpp | 58 +++---------- 14 files changed, 535 insertions(+), 90 deletions(-) create mode 100644 Camera.h create mode 100644 Framebuffer3D.cpp create mode 100644 Framebuffer3D.h create mode 100644 MCRenderer.cpp create mode 100644 MCRenderer.h create mode 100644 Shader/noise.fs create mode 100644 Shader/noise.vs create mode 100644 Spatial.h create mode 100644 VertexBuffer.cpp create mode 100644 VertexBuffer.h diff --git a/Camera.h b/Camera.h new file mode 100644 index 0000000..48d0355 --- /dev/null +++ b/Camera.h @@ -0,0 +1,27 @@ +#pragma once + +#include +#include + +#include "Spatial.h" + +class Camera : public Spatial { + public: + /// Create a camera with a field of view (in degrees), width and height (in any unit) and near + /// and far distances + Camera(float fov, float width, float height, float near, float far) + : projection(glm::perspective(glm::radians(fov), width / height, near, far)) { + } + + glm::mat4 get_projection() { + return projection; + } + + glm::mat4 get_view() { + return view; + } + + private: + glm::mat4 projection; + glm::mat4 view; +}; \ No newline at end of file diff --git a/Framebuffer3D.cpp b/Framebuffer3D.cpp new file mode 100644 index 0000000..2fc90c1 --- /dev/null +++ b/Framebuffer3D.cpp @@ -0,0 +1,40 @@ +#include "Framebuffer3D.h" + +Framebuffer3D::Framebuffer3D(int width, int height, int depth) { + glGenTextures(1, &texture); + glBindTexture(GL_TEXTURE_3D, texture); + glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER); + glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_BORDER); + glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER); + glTexImage3D(GL_TEXTURE_3D, 0, GL_R32F, width, height, depth, 0, GL_RED, GL_FLOAT, nullptr); + + glGenFramebuffers(1, &buffer); + glBindFramebuffer(GL_FRAMEBUFFER, buffer); + + GLenum c = GL_COLOR_ATTACHMENT0; + + glFramebufferTexture3D(GL_FRAMEBUFFER, c, GL_TEXTURE_3D, texture, 0, 0); + glDrawBuffers(1, &c); +} + +Framebuffer3D::~Framebuffer3D() { + glDeleteFramebuffers(1, &buffer); + glDeleteTextures(1, &texture); +} + +void Framebuffer3D::bind_and_clear() { + glBindFramebuffer(GL_FRAMEBUFFER, buffer); + glClear(GL_COLOR_BUFFER_BIT); +} + +void Framebuffer3D::bind_to(int unit) const { + glActiveTexture(GL_TEXTURE0 + unit); + glBindTexture(GL_TEXTURE_3D, texture); +} + +void Framebuffer3D::bind_layer(int layer) { + glBindFramebuffer(GL_FRAMEBUFFER, buffer); + glFramebufferTexture3D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_3D, texture, 0, layer); +} \ No newline at end of file diff --git a/Framebuffer3D.h b/Framebuffer3D.h new file mode 100644 index 0000000..549a27f --- /dev/null +++ b/Framebuffer3D.h @@ -0,0 +1,21 @@ +#pragma once + +// Must be the first include +#include + +// Other includes +#include + +class Framebuffer3D { + public: + Framebuffer3D(int width, int height, int depth); + ~Framebuffer3D(); + + void bind_and_clear(); + void bind_to(int unit) const; + void bind_layer(int layer); + + private: + GLuint texture; + GLuint buffer; +}; \ No newline at end of file diff --git a/MCRenderer.cpp b/MCRenderer.cpp new file mode 100644 index 0000000..b8d4051 --- /dev/null +++ b/MCRenderer.cpp @@ -0,0 +1,49 @@ +#include "MCRenderer.h" +#include "Framebuffer3D.h" +#include "VertexBuffer.h" + +MCRenderer::MCRenderer() + : render_shader(Shader("Shader/mc.vs", "Shader/mc.fs", "Shader/mc.gs")), + noise_shader(Shader("Shader/noise.vs", "Shader/noise.fs")), noise(Framebuffer3D(64, 64, 64)), + camera(Camera(90, 1920, 1080, 0.1, 100.0)) { + float rectangle_data[6][2] = {{-1.0f, -1.0f}, {-1.0, 1.0}, {1.0, -1.0}, + {1.0f, 1.0f}, {-1.0, 1.0}, {1.0, -1.0}}; + + vertex_rectangle.set_data(sizeof(rectangle_data), rectangle_data, 0); +} + +void MCRenderer::render(float delta) { + // Create the noise + noise_shader.use(); + noise.bind_and_clear(); + + noise_shader.setFloat("height", 0); + + for (int i = 0; i < 64; i++) { + // Create one layer + noise_shader.setFloat("layer", i * (1.0f / 63.0f)); + noise.bind_layer(i); + + // Each layer is made up of a rectangle of vertices + vertex_rectangle.draw(); + } + + // Actual rendering + glViewport(0, 0, 1920, 1080); + + glClearColor(0.6f, 0.9f, 0.9f, 1.0f); + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + render_shader.use(); + + // Bind the camera to the rendering shader + render_shader.setMat4("proj", camera.get_projection()); + render_shader.setMat4("view", camera.get_view()); + + // Bind the noise texture to the rendering shader + noise.bind_to(0); + + // Draw all layers as polygons + glDrawArrays(GL_POINTS, 0, 64 * 64 * 64); + glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); +} \ No newline at end of file diff --git a/MCRenderer.h b/MCRenderer.h new file mode 100644 index 0000000..857dc01 --- /dev/null +++ b/MCRenderer.h @@ -0,0 +1,22 @@ +#pragma once + +#include "Camera.h" +#include "Framebuffer3D.h" +#include "Shader.h" +#include "VertexBuffer.h" + +class MCRenderer { + public: + MCRenderer(); + + void render(float delta); + + private: + Shader render_shader; + Shader noise_shader; + + Framebuffer3D noise; + VertexBuffer vertex_rectangle; + + Camera camera; +}; diff --git a/Shader/mc.fs b/Shader/mc.fs index 4ddaf65..9eb10ba 100644 --- a/Shader/mc.fs +++ b/Shader/mc.fs @@ -1,10 +1,12 @@ -#version 330 core -out vec4 FragColor; +#version 430 -in vec3 fColor; +layout (binding = 0) uniform sampler3D densities; -void main() -{ - FragColor = vec4(fColor, 1.0); +in vec3 varTextureG; + +out vec4 color; + +void main(void) { + float f = texture(densities, varTextureG).r; + color = vec4(f, f, f, 1.0); } - diff --git a/Shader/mc.gs b/Shader/mc.gs index 7f2ab76..efed0c1 100644 --- a/Shader/mc.gs +++ b/Shader/mc.gs @@ -1,31 +1,196 @@ -#version 330 core +#version 430 + layout (points) in; -layout (triangle_strip, max_vertices = 5) out; +layout (triangle_strip, max_vertices = 12) out; -in VS_OUT { - vec3 color; -} gs_in[]; +uniform mat4 proj; +uniform mat4 view; -out vec3 fColor; +in vec3 varTexture[]; +in int varIndex[]; +out vec3 varTextureG; -void build_house(vec4 position) -{ - fColor = gs_in[0].color; // gs_in[0] since there's only one input vertex - gl_Position = position + vec4(-0.2, -0.2, 0.0, 0.0); // 1:bottom-left - EmitVertex(); - gl_Position = position + vec4( 0.2, -0.2, 0.0, 0.0); // 2:bottom-right - EmitVertex(); - gl_Position = position + vec4(-0.2, 0.2, 0.0, 0.0); // 3:top-left - EmitVertex(); - gl_Position = position + vec4( 0.2, 0.2, 0.0, 0.0); // 4:top-right - EmitVertex(); - gl_Position = position + vec4( 0.0, 0.4, 0.0, 0.0); // 5:top - fColor = vec3(1.0, 1.0, 1.0); - EmitVertex(); - EndPrimitive(); +vec3 vectors[13] = { + vec3(0.0, 0.0, 0.0), vec3(0.5, 1.0, 1.0), vec3(0.0, 0.5, 1.0), + vec3(0.0, 1.0, 0.5), vec3(1.0, 0.5, 1.0), vec3(1.0, 1.0, 0.5), + vec3(0.5, 1.0, 0.0), vec3(1.0, 0.5, 0.0), vec3(0.0, 0.5, 0.0), + vec3(0.0, 0.0, 0.5), vec3(0.5, 0.0, 1.0), vec3(1.0, 0.0, 0.5), + vec3(0.5, 0.0, 0.0)}; + +int table[3072] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 4, 1, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 5, + 2, 5, 2, 4, 0, 0, 0, 0, 0, 0, 5, 6, 7, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 5, 6, 7, 3, 1, 2, 0, 0, 0, 0, 0, 0, 7, 4, 6, 4, + 6, 1, 0, 0, 0, 0, 0, 0, 3, 6, 2, 7, 6, 2, 7, 2, 4, 0, 0, + 0, 3, 8, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 1, 8, 1, 8, 2, + 0, 0, 0, 0, 0, 0, 6, 3, 8, 1, 5, 4, 0, 0, 0, 0, 0, 0, 6, + 5, 8, 4, 5, 8, 4, 8, 2, 0, 0, 0, 5, 3, 7, 3, 7, 8, 0, 0, + 0, 0, 0, 0, 5, 1, 7, 2, 1, 7, 2, 7, 8, 0, 0, 0, 1, 3, 4, + 8, 3, 4, 8, 4, 7, 0, 0, 0, 8, 7, 2, 4, 7, 2, 0, 0, 0, 0, + 0, 0, 9, 2, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 3, 10, 3, 10, + 1, 0, 0, 0, 0, 0, 0, 4, 1, 5, 2, 10, 9, 0, 0, 0, 0, 0, 0, + 4, 10, 5, 9, 10, 5, 9, 5, 3, 0, 0, 0, 9, 2, 10, 5, 7, 6, 0, + 0, 0, 0, 0, 0, 9, 3, 10, 3, 10, 1, 7, 6, 5, 0, 0, 0, 7, 4, + 6, 4, 6, 1, 9, 10, 2, 0, 0, 0, 4, 10, 7, 3, 10, 7, 3, 10, 9, + 3, 6, 7, 9, 2, 10, 3, 8, 6, 0, 0, 0, 0, 0, 0, 9, 8, 10, 6, + 8, 10, 6, 10, 1, 0, 0, 0, 6, 8, 3, 10, 2, 9, 1, 4, 5, 0, 0, + 0, 4, 5, 6, 4, 10, 6, 8, 10, 6, 8, 10, 9, 5, 3, 7, 3, 7, 8, + 10, 2, 9, 0, 0, 0, 9, 7, 1, 9, 10, 1, 5, 7, 1, 9, 7, 8, 9, + 10, 8, 4, 10, 8, 4, 10, 7, 3, 2, 1, 9, 10, 8, 4, 10, 8, 4, 8, + 7, 0, 0, 0, 10, 4, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 4, 11, + 1, 2, 3, 0, 0, 0, 0, 0, 0, 5, 11, 1, 11, 1, 10, 0, 0, 0, 0, + 0, 0, 10, 2, 11, 3, 2, 11, 3, 11, 5, 0, 0, 0, 7, 5, 6, 4, 11, + 10, 0, 0, 0, 0, 0, 0, 3, 2, 1, 11, 4, 10, 5, 7, 6, 0, 0, 0, + 7, 11, 6, 10, 11, 6, 10, 6, 1, 0, 0, 0, 7, 6, 3, 7, 11, 3, 2, + 11, 3, 2, 11, 10, 10, 4, 11, 6, 8, 3, 0, 0, 0, 0, 0, 0, 6, 1, + 8, 1, 8, 2, 11, 4, 10, 0, 0, 0, 10, 1, 11, 1, 11, 5, 8, 3, 6, + 0, 0, 0, 10, 8, 5, 10, 11, 5, 6, 8, 5, 10, 8, 2, 8, 7, 3, 7, + 3, 5, 10, 11, 4, 0, 0, 0, 10, 11, 2, 7, 11, 2, 7, 11, 8, 1, 4, + 5, 7, 11, 8, 1, 11, 8, 1, 11, 10, 1, 3, 8, 10, 11, 2, 7, 11, 2, + 7, 2, 8, 0, 0, 0, 11, 9, 4, 9, 4, 2, 0, 0, 0, 0, 0, 0, 1, + 4, 3, 11, 4, 3, 11, 3, 9, 0, 0, 0, 2, 1, 9, 5, 1, 9, 5, 9, + 11, 0, 0, 0, 3, 5, 9, 11, 5, 9, 0, 0, 0, 0, 0, 0, 2, 4, 9, + 4, 9, 11, 6, 5, 7, 0, 0, 0, 7, 6, 11, 3, 6, 11, 3, 6, 9, 4, + 5, 1, 7, 1, 9, 7, 11, 9, 2, 1, 9, 7, 1, 6, 7, 6, 11, 3, 6, + 11, 3, 11, 9, 0, 0, 0, 11, 9, 4, 9, 4, 2, 6, 8, 3, 0, 0, 0, + 1, 4, 6, 9, 4, 6, 9, 4, 11, 9, 8, 6, 6, 8, 5, 9, 8, 5, 9, + 8, 11, 1, 3, 2, 6, 8, 5, 9, 8, 5, 9, 5, 11, 0, 0, 0, 7, 11, + 9, 7, 9, 9, 5, 4, 2, 5, 2, 2, 9, 11, 8, 11, 8, 7, 1, 4, 5, + 0, 0, 0, 7, 8, 11, 8, 11, 9, 1, 3, 2, 0, 0, 0, 9, 11, 8, 11, + 8, 7, 0, 0, 0, 0, 0, 0, 11, 7, 12, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 11, 7, 12, 3, 2, 1, 0, 0, 0, 0, 0, 0, 11, 7, 12, 5, 4, 1, + 0, 0, 0, 0, 0, 0, 3, 5, 2, 5, 2, 4, 12, 7, 11, 0, 0, 0, 11, + 5, 12, 5, 12, 6, 0, 0, 0, 0, 0, 0, 11, 5, 12, 5, 12, 6, 2, 1, + 3, 0, 0, 0, 11, 4, 12, 1, 4, 12, 1, 12, 6, 0, 0, 0, 11, 2, 6, + 11, 12, 6, 3, 2, 6, 11, 2, 4, 7, 12, 11, 8, 6, 3, 0, 0, 0, 0, + 0, 0, 2, 8, 1, 8, 1, 6, 11, 12, 7, 0, 0, 0, 1, 4, 5, 12, 7, + 11, 6, 8, 3, 0, 0, 0, 11, 12, 4, 8, 12, 4, 8, 12, 2, 5, 7, 6, + 8, 12, 3, 11, 12, 3, 11, 3, 5, 0, 0, 0, 8, 12, 2, 5, 12, 2, 5, + 12, 11, 5, 1, 2, 8, 3, 1, 8, 12, 1, 4, 12, 1, 4, 12, 11, 11, 12, + 4, 8, 12, 4, 8, 4, 2, 0, 0, 0, 12, 11, 7, 10, 9, 2, 0, 0, 0, + 0, 0, 0, 1, 10, 3, 10, 3, 9, 7, 11, 12, 0, 0, 0, 12, 7, 11, 1, + 4, 5, 10, 2, 9, 0, 0, 0, 12, 7, 9, 5, 7, 9, 5, 7, 3, 10, 11, + 4, 6, 12, 5, 12, 5, 11, 2, 9, 10, 0, 0, 0, 12, 9, 3, 12, 3, 3, + 11, 10, 1, 11, 1, 1, 11, 4, 12, 1, 4, 12, 1, 4, 6, 9, 10, 2, 3, + 9, 6, 9, 6, 12, 4, 10, 11, 0, 0, 0, 3, 6, 8, 11, 12, 7, 9, 10, + 2, 0, 0, 0, 7, 11, 6, 10, 11, 6, 10, 11, 1, 8, 12, 9, 12, 8, 9, + 6, 7, 5, 1, 2, 3, 6, 7, 5, 9, 8, 12, 5, 7, 6, 11, 4, 10, 0, + 0, 0, 8, 12, 3, 11, 12, 3, 11, 12, 5, 2, 9, 10, 5, 11, 1, 11, 1, + 10, 8, 12, 9, 0, 0, 0, 8, 12, 9, 4, 10, 11, 2, 1, 3, 0, 0, 0, + 11, 10, 4, 9, 12, 8, 0, 0, 0, 0, 0, 0, 12, 10, 7, 10, 7, 4, 0, + 0, 0, 0, 0, 0, 12, 10, 7, 10, 7, 4, 3, 2, 1, 0, 0, 0, 5, 7, + 1, 12, 7, 1, 12, 1, 10, 0, 0, 0, 12, 7, 10, 3, 7, 10, 3, 7, 5, + 3, 2, 10, 4, 5, 10, 6, 5, 10, 6, 10, 12, 0, 0, 0, 4, 5, 10, 6, + 5, 10, 6, 5, 12, 2, 1, 3, 12, 6, 10, 1, 6, 10, 0, 0, 0, 0, 0, + 0, 3, 2, 6, 10, 2, 6, 10, 6, 12, 0, 0, 0, 4, 7, 10, 7, 10, 12, + 3, 6, 8, 0, 0, 0, 6, 8, 2, 6, 2, 2, 7, 12, 10, 7, 10, 10, 5, + 7, 1, 12, 7, 1, 12, 7, 10, 3, 6, 8, 10, 12, 2, 12, 2, 8, 5, 7, + 6, 0, 0, 0, 4, 12, 3, 4, 5, 3, 8, 12, 3, 4, 12, 10, 8, 2, 12, + 2, 12, 10, 5, 1, 4, 0, 0, 0, 8, 3, 12, 1, 3, 12, 1, 12, 10, 0, + 0, 0, 10, 12, 2, 12, 2, 8, 0, 0, 0, 0, 0, 0, 12, 9, 7, 2, 9, + 7, 2, 7, 4, 0, 0, 0, 12, 4, 3, 12, 9, 3, 1, 4, 3, 12, 4, 7, + 2, 1, 5, 2, 9, 5, 7, 9, 5, 7, 9, 12, 12, 7, 9, 5, 7, 9, 5, + 9, 3, 0, 0, 0, 2, 9, 4, 6, 9, 4, 6, 9, 12, 6, 5, 4, 12, 6, + 9, 6, 9, 3, 4, 5, 1, 0, 0, 0, 2, 9, 1, 12, 9, 1, 12, 1, 6, + 0, 0, 0, 3, 9, 6, 9, 6, 12, 0, 0, 0, 0, 0, 0, 12, 9, 7, 2, + 9, 7, 2, 9, 4, 6, 8, 3, 1, 6, 4, 6, 4, 7, 9, 8, 12, 0, 0, + 0, 5, 7, 6, 9, 8, 12, 3, 2, 1, 0, 0, 0, 12, 8, 9, 6, 7, 5, + 0, 0, 0, 0, 0, 0, 4, 2, 5, 2, 5, 3, 12, 9, 8, 0, 0, 0, 12, + 8, 9, 1, 4, 5, 0, 0, 0, 0, 0, 0, 8, 9, 12, 2, 3, 1, 0, 0, + 0, 0, 0, 0, 12, 8, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 8, 9, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 9, 12, 2, 3, 1, 0, 0, 0, 0, + 0, 0, 12, 8, 9, 1, 4, 5, 0, 0, 0, 0, 0, 0, 4, 2, 5, 2, 5, + 3, 12, 9, 8, 0, 0, 0, 12, 8, 9, 6, 7, 5, 0, 0, 0, 0, 0, 0, + 5, 7, 6, 9, 8, 12, 3, 2, 1, 0, 0, 0, 1, 6, 4, 6, 4, 7, 9, + 8, 12, 0, 0, 0, 12, 9, 7, 2, 9, 7, 2, 9, 4, 6, 8, 3, 3, 9, + 6, 9, 6, 12, 0, 0, 0, 0, 0, 0, 2, 9, 1, 12, 9, 1, 12, 1, 6, + 0, 0, 0, 12, 6, 9, 6, 9, 3, 4, 5, 1, 0, 0, 0, 2, 9, 4, 6, + 9, 4, 6, 9, 12, 6, 5, 4, 12, 7, 9, 5, 7, 9, 5, 9, 3, 0, 0, + 0, 2, 1, 5, 2, 9, 5, 7, 9, 5, 7, 9, 12, 12, 4, 3, 12, 9, 3, + 1, 4, 3, 12, 4, 7, 12, 9, 7, 2, 9, 7, 2, 7, 4, 0, 0, 0, 10, + 12, 2, 12, 2, 8, 0, 0, 0, 0, 0, 0, 8, 3, 12, 1, 3, 12, 1, 12, + 10, 0, 0, 0, 8, 2, 12, 2, 12, 10, 5, 1, 4, 0, 0, 0, 4, 12, 3, + 4, 5, 3, 8, 12, 3, 4, 12, 10, 10, 12, 2, 12, 2, 8, 5, 7, 6, 0, + 0, 0, 5, 7, 1, 12, 7, 1, 12, 7, 10, 3, 6, 8, 6, 8, 2, 6, 2, + 2, 7, 12, 10, 7, 10, 10, 4, 7, 10, 7, 10, 12, 3, 6, 8, 0, 0, 0, + 3, 2, 6, 10, 2, 6, 10, 6, 12, 0, 0, 0, 12, 6, 10, 1, 6, 10, 0, + 0, 0, 0, 0, 0, 4, 5, 10, 6, 5, 10, 6, 5, 12, 2, 1, 3, 4, 5, + 10, 6, 5, 10, 6, 10, 12, 0, 0, 0, 12, 7, 10, 3, 7, 10, 3, 7, 5, + 3, 2, 10, 5, 7, 1, 12, 7, 1, 12, 1, 10, 0, 0, 0, 12, 10, 7, 10, + 7, 4, 3, 2, 1, 0, 0, 0, 12, 10, 7, 10, 7, 4, 0, 0, 0, 0, 0, + 0, 11, 10, 4, 9, 12, 8, 0, 0, 0, 0, 0, 0, 8, 12, 9, 4, 10, 11, + 2, 1, 3, 0, 0, 0, 5, 11, 1, 11, 1, 10, 8, 12, 9, 0, 0, 0, 8, + 12, 3, 11, 12, 3, 11, 12, 5, 2, 9, 10, 9, 8, 12, 5, 7, 6, 11, 4, + 10, 0, 0, 0, 12, 8, 9, 6, 7, 5, 1, 2, 3, 6, 7, 5, 7, 11, 6, + 10, 11, 6, 10, 11, 1, 8, 12, 9, 3, 6, 8, 11, 12, 7, 9, 10, 2, 0, + 0, 0, 3, 9, 6, 9, 6, 12, 4, 10, 11, 0, 0, 0, 11, 4, 12, 1, 4, + 12, 1, 4, 6, 9, 10, 2, 12, 9, 3, 12, 3, 3, 11, 10, 1, 11, 1, 1, + 6, 12, 5, 12, 5, 11, 2, 9, 10, 0, 0, 0, 12, 7, 9, 5, 7, 9, 5, + 7, 3, 10, 11, 4, 12, 7, 11, 1, 4, 5, 10, 2, 9, 0, 0, 0, 1, 10, + 3, 10, 3, 9, 7, 11, 12, 0, 0, 0, 12, 11, 7, 10, 9, 2, 0, 0, 0, + 0, 0, 0, 11, 12, 4, 8, 12, 4, 8, 4, 2, 0, 0, 0, 8, 3, 1, 8, + 12, 1, 4, 12, 1, 4, 12, 11, 8, 12, 2, 5, 12, 2, 5, 12, 11, 5, 1, + 2, 8, 12, 3, 11, 12, 3, 11, 3, 5, 0, 0, 0, 11, 12, 4, 8, 12, 4, + 8, 12, 2, 5, 7, 6, 1, 4, 5, 12, 7, 11, 6, 8, 3, 0, 0, 0, 2, + 8, 1, 8, 1, 6, 11, 12, 7, 0, 0, 0, 7, 12, 11, 8, 6, 3, 0, 0, + 0, 0, 0, 0, 11, 2, 6, 11, 12, 6, 3, 2, 6, 11, 2, 4, 11, 4, 12, + 1, 4, 12, 1, 12, 6, 0, 0, 0, 11, 5, 12, 5, 12, 6, 2, 1, 3, 0, + 0, 0, 11, 5, 12, 5, 12, 6, 0, 0, 0, 0, 0, 0, 3, 5, 2, 5, 2, + 4, 12, 7, 11, 0, 0, 0, 11, 7, 12, 5, 4, 1, 0, 0, 0, 0, 0, 0, + 11, 7, 12, 3, 2, 1, 0, 0, 0, 0, 0, 0, 11, 7, 12, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 9, 11, 8, 11, 8, 7, 0, 0, 0, 0, 0, 0, 7, 8, + 11, 8, 11, 9, 1, 3, 2, 0, 0, 0, 9, 11, 8, 11, 8, 7, 1, 4, 5, + 0, 0, 0, 7, 11, 9, 7, 9, 9, 5, 4, 2, 5, 2, 2, 6, 8, 5, 9, + 8, 5, 9, 5, 11, 0, 0, 0, 6, 8, 5, 9, 8, 5, 9, 8, 11, 1, 3, + 2, 1, 4, 6, 9, 4, 6, 9, 4, 11, 9, 8, 6, 11, 9, 4, 9, 4, 2, + 6, 8, 3, 0, 0, 0, 7, 6, 11, 3, 6, 11, 3, 11, 9, 0, 0, 0, 7, + 1, 9, 7, 11, 9, 2, 1, 9, 7, 1, 6, 7, 6, 11, 3, 6, 11, 3, 6, + 9, 4, 5, 1, 2, 4, 9, 4, 9, 11, 6, 5, 7, 0, 0, 0, 3, 5, 9, + 11, 5, 9, 0, 0, 0, 0, 0, 0, 2, 1, 9, 5, 1, 9, 5, 9, 11, 0, + 0, 0, 1, 4, 3, 11, 4, 3, 11, 3, 9, 0, 0, 0, 11, 9, 4, 9, 4, + 2, 0, 0, 0, 0, 0, 0, 10, 11, 2, 7, 11, 2, 7, 2, 8, 0, 0, 0, + 7, 11, 8, 1, 11, 8, 1, 11, 10, 1, 3, 8, 10, 11, 2, 7, 11, 2, 7, + 11, 8, 1, 4, 5, 8, 7, 3, 7, 3, 5, 10, 11, 4, 0, 0, 0, 10, 8, + 5, 10, 11, 5, 6, 8, 5, 10, 8, 2, 10, 1, 11, 1, 11, 5, 8, 3, 6, + 0, 0, 0, 6, 1, 8, 1, 8, 2, 11, 4, 10, 0, 0, 0, 10, 4, 11, 6, + 8, 3, 0, 0, 0, 0, 0, 0, 7, 6, 3, 7, 11, 3, 2, 11, 3, 2, 11, + 10, 7, 11, 6, 10, 11, 6, 10, 6, 1, 0, 0, 0, 3, 2, 1, 11, 4, 10, + 5, 7, 6, 0, 0, 0, 7, 5, 6, 4, 11, 10, 0, 0, 0, 0, 0, 0, 10, + 2, 11, 3, 2, 11, 3, 11, 5, 0, 0, 0, 5, 11, 1, 11, 1, 10, 0, 0, + 0, 0, 0, 0, 10, 4, 11, 1, 2, 3, 0, 0, 0, 0, 0, 0, 10, 4, 11, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 10, 8, 4, 10, 8, 4, 8, 7, 0, + 0, 0, 9, 10, 8, 4, 10, 8, 4, 10, 7, 3, 2, 1, 9, 7, 1, 9, 10, + 1, 5, 7, 1, 9, 7, 8, 5, 3, 7, 3, 7, 8, 10, 2, 9, 0, 0, 0, + 4, 5, 6, 4, 10, 6, 8, 10, 6, 8, 10, 9, 6, 8, 3, 10, 2, 9, 1, + 4, 5, 0, 0, 0, 9, 8, 10, 6, 8, 10, 6, 10, 1, 0, 0, 0, 9, 2, + 10, 3, 8, 6, 0, 0, 0, 0, 0, 0, 4, 10, 7, 3, 10, 7, 3, 10, 9, + 3, 6, 7, 7, 4, 6, 4, 6, 1, 9, 10, 2, 0, 0, 0, 9, 3, 10, 3, + 10, 1, 7, 6, 5, 0, 0, 0, 9, 2, 10, 5, 7, 6, 0, 0, 0, 0, 0, + 0, 4, 10, 5, 9, 10, 5, 9, 5, 3, 0, 0, 0, 4, 1, 5, 2, 10, 9, + 0, 0, 0, 0, 0, 0, 9, 3, 10, 3, 10, 1, 0, 0, 0, 0, 0, 0, 9, + 2, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 7, 2, 4, 7, 2, 0, 0, + 0, 0, 0, 0, 1, 3, 4, 8, 3, 4, 8, 4, 7, 0, 0, 0, 5, 1, 7, + 2, 1, 7, 2, 7, 8, 0, 0, 0, 5, 3, 7, 3, 7, 8, 0, 0, 0, 0, + 0, 0, 6, 5, 8, 4, 5, 8, 4, 8, 2, 0, 0, 0, 6, 3, 8, 1, 5, + 4, 0, 0, 0, 0, 0, 0, 6, 1, 8, 1, 8, 2, 0, 0, 0, 0, 0, 0, + 3, 8, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 6, 2, 7, 6, 2, 7, + 2, 4, 0, 0, 0, 7, 4, 6, 4, 6, 1, 0, 0, 0, 0, 0, 0, 5, 6, + 7, 3, 1, 2, 0, 0, 0, 0, 0, 0, 5, 6, 7, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 3, 5, 2, 5, 2, 4, 0, 0, 0, 0, 0, 0, 4, 1, 5, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +}; + +void main(void) { + vec4 base = gl_in[0].gl_Position; + int index = varIndex[0] * 12; + for(int i = 0; i < 12; i += 3) { + for(int k = 0; k < 3; k++) { + gl_Position = proj * view * (base + vec4(vectors[table[index + i + k]], 0.0)); + varTextureG = varTexture[0]; + EmitVertex(); + } + EndPrimitive(); + } } - -void main() { - build_house(gl_in[0].gl_Position); -} - diff --git a/Shader/mc.vs b/Shader/mc.vs index b45753b..670bc0b 100644 --- a/Shader/mc.vs +++ b/Shader/mc.vs @@ -1,14 +1,30 @@ -#version 330 core -layout (location = 0) in vec2 aPos; -layout (location = 1) in vec3 aColor; +#version 430 -out VS_OUT { - vec3 color; -} vs_out; +layout (binding = 0) uniform sampler3D densities; -void main() -{ - vs_out.color = aColor; - gl_Position = vec4(aPos.x, aPos.y, 0.0, 1.0); +out vec3 varTexture; +out int varIndex; + +const float step = 1.0 / 63.0; + +void main(void) { + int id = gl_VertexID; + int x = id & 0x3F; + int y = (id >> 6) & 0x3F; + int z = (id >> 12) & 0x3F; + + vec3 xyz = vec3(x, y, z); + gl_Position = vec4(xyz, 1.0); + varTexture = xyz * step; + + int b1 = int(texture(densities, varTexture).r < 0.5f); + int b2 = int(texture(densities, varTexture + vec3(step, 0.0, 0.0)).r < 0.5f); + int b3 = int(texture(densities, varTexture + vec3(step, 0.0, step)).r < 0.5f); + int b4 = int(texture(densities, varTexture + vec3(0.0, 0.0, step)).r < 0.5f); + int b5 = int(texture(densities, varTexture + vec3(0.0, step, 0.0)).r < 0.5f); + int b6 = int(texture(densities, varTexture + vec3(step, step, 0.0)).r < 0.5f); + int b7 = int(texture(densities, varTexture + vec3(step, step, step)).r < 0.5f); + int b8 = int(texture(densities, varTexture + vec3(0.0, step, step)).r < 0.5f); + varIndex = (b1 << 7) | (b2 << 6) | (b3 << 5) | (b4 << 4) | + (b5 << 3) | (b6 << 2) | (b7 << 1) | b8; } - diff --git a/Shader/noise.fs b/Shader/noise.fs new file mode 100644 index 0000000..cc29a58 --- /dev/null +++ b/Shader/noise.fs @@ -0,0 +1,13 @@ + #version 430 + + in vec3 varPosition; + + out float noise; + + void main(void) { + float sinX = sin(varPosition.x * 5.8905); + float cosY = cos(varPosition.y * 5.8905); + float cosZ = cos(varPosition.z * 5.8905); + + noise = (sinX * sinX + cosY * cosY + cosZ * cosZ) * (1.0f / 3.0f); + } diff --git a/Shader/noise.vs b/Shader/noise.vs new file mode 100644 index 0000000..61aca14 --- /dev/null +++ b/Shader/noise.vs @@ -0,0 +1,13 @@ + #version 430 + + layout (location = 0) in vec2 position; + + uniform float layer; + uniform float height; + + out vec3 varPosition; + + void main(void) { + gl_Position = vec4(position, 0.0, 1.0); + varPosition = vec3(position.x, position.y + height, layer); + } diff --git a/Spatial.h b/Spatial.h new file mode 100644 index 0000000..8f6b5d8 --- /dev/null +++ b/Spatial.h @@ -0,0 +1,72 @@ +#pragma once + +#include +#include +#include + +#include "glm/gtx/string_cast.hpp" + +class Spatial { + public: + Spatial() = default; + + void translate(glm::vec3 offset) { + matrix = glm::translate(matrix, offset); + } + + glm::vec3 get_translation() { + return glm::vec3(matrix[3]); + } + + void uniform_scale(float factor) { + scale(glm::vec3(factor, factor, factor)); + } + + void scale(glm::vec3 factors) { + matrix = glm::scale(matrix, factors); + } + + void rotate(float degrees, glm::vec3 axis) { + matrix = glm::rotate(matrix, glm::radians(degrees), axis); + } + + void set_origin(glm::vec3 position) { + origin = position; + } + + void add_to_origin(glm::vec3 addition) { + origin += addition; + } + + void set_rotation_from_quat(glm::quat quaternion) { + // Remember translation + glm::vec4 save = matrix[3]; + + matrix = glm::mat4_cast(quaternion); + matrix[3] = save; + } + + glm::vec3 get_origin() const { + return origin; + } + + glm::mat4 get_matrix() { + return matrix; + } + + glm::vec3 forward() const { + return matrix * glm::vec4(0.0, 0.0, -1.0, 0.0); + } + + glm::vec3 up() const { + return matrix * glm::vec4(0.0, 1.0, 0.0, 0.0); + } + + glm::vec3 right() const { + return matrix * glm::vec4(1.0, 0.0, 0.0, 0.0); + } + + private: + glm::mat4 matrix = glm::mat4(1.0f); // Initialize as identity + glm::vec3 origin = glm::vec3(0.0f, 0.0f, 0.0f); +}; \ No newline at end of file diff --git a/VertexBuffer.cpp b/VertexBuffer.cpp new file mode 100644 index 0000000..229408b --- /dev/null +++ b/VertexBuffer.cpp @@ -0,0 +1,18 @@ +#include "VertexBuffer.h" + +VertexBuffer::VertexBuffer() { + glGenVertexArrays(1, &vertex_array); + glGenBuffers(1, &vertex_buffer); +} + +void VertexBuffer::set_data(unsigned int size, const void *data, int flag) { + this->size = size; + + glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer); + glBufferData(GL_ARRAY_BUFFER, size, data, flag); +} + +void VertexBuffer::draw() { + glBindVertexArray(vertex_array); + glDrawArrays(GL_TRIANGLES, 0, size); +} \ No newline at end of file diff --git a/VertexBuffer.h b/VertexBuffer.h new file mode 100644 index 0000000..0cddf46 --- /dev/null +++ b/VertexBuffer.h @@ -0,0 +1,21 @@ +#pragma once + +// Must be the first include +#include + +// Other includes +#include + +class VertexBuffer { + public: + VertexBuffer(); + + void set_data(unsigned int size, const void *data, int flag); + + void draw(); + + private: + GLuint vertex_array; + GLuint vertex_buffer; + unsigned int size; +}; diff --git a/main.cpp b/main.cpp index 8d3fbc7..3fd93c0 100644 --- a/main.cpp +++ b/main.cpp @@ -1,18 +1,19 @@ - +// Must be the first include #include -// Needs to be second +// Other includes #include - -#include "Shader.h" - #include +#include "Framebuffer3D.h" +#include "MCRenderer.h" +#include "Shader.h" + void framebuffer_size_callback(GLFWwindow *window, int width, int height); // settings -const unsigned int SCR_WIDTH = 800; -const unsigned int SCR_HEIGHT = 600; +const unsigned int SCR_WIDTH = 1920; +const unsigned int SCR_HEIGHT = 1080; int main() { // glfw: initialize and configure @@ -28,7 +29,7 @@ int main() { // glfw window creation // -------------------- - GLFWwindow *window = glfwCreateWindow(SCR_WIDTH, SCR_HEIGHT, "LearnOpenGL", NULL, NULL); + GLFWwindow *window = glfwCreateWindow(SCR_WIDTH, SCR_HEIGHT, "Marching Cubes", NULL, NULL); if (window == NULL) { std::cout << "Failed to create GLFW window" << std::endl; glfwTerminate(); @@ -47,54 +48,19 @@ int main() { // ----------------------------- glEnable(GL_DEPTH_TEST); - // build and compile shaders - // ------------------------- - Shader shader("Shader/mc.vs", "Shader/mc.fs", "Shader/mc.gs"); - - // set up vertex data (and buffer(s)) and configure vertex attributes - // ------------------------------------------------------------------ - float points[] = { - -0.5f, 0.5f, 1.0f, 0.0f, 0.0f, // top-left - 0.5f, 0.5f, 0.0f, 1.0f, 0.0f, // top-right - 0.5f, -0.5f, 0.0f, 0.0f, 1.0f, // bottom-right - -0.5f, -0.5f, 1.0f, 1.0f, 0.0f // bottom-left - }; - unsigned int VBO, VAO; - glGenBuffers(1, &VBO); - glGenVertexArrays(1, &VAO); - glBindVertexArray(VAO); - glBindBuffer(GL_ARRAY_BUFFER, VBO); - glBufferData(GL_ARRAY_BUFFER, sizeof(points), &points, GL_STATIC_DRAW); - glEnableVertexAttribArray(0); - glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 5 * sizeof(float), 0); - glEnableVertexAttribArray(1); - glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 5 * sizeof(float), (void *)(2 * sizeof(float))); - glBindVertexArray(0); + // Setup the Marching Cubes renderer + MCRenderer renderer = MCRenderer(); // render loop // ----------- while (!glfwWindowShouldClose(window)) { - // render - // ------ - glClearColor(0.1f, 0.1f, 0.1f, 1.0f); - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - - // draw points - shader.use(); - glBindVertexArray(VAO); - glDrawArrays(GL_POINTS, 0, 4); + renderer.render(1.0); // TODO: Proper delta // glfw: swap buffers and poll IO events (keys pressed/released, mouse moved etc.) - // ------------------------------------------------------------------------------- glfwSwapBuffers(window); glfwPollEvents(); } - // optional: de-allocate all resources once they've outlived their purpose: - // ------------------------------------------------------------------------ - glDeleteVertexArrays(1, &VAO); - glDeleteBuffers(1, &VBO); - glfwTerminate(); return 0; }