summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMel <einebeere@gmail.com>2022-10-01 16:59:29 +0200
committerMel <einebeere@gmail.com>2022-10-01 16:59:29 +0200
commitaca1326e7e3cc4c06e29b92dca256673b46aa510 (patch)
treec7cb614990afa3140700448ab1c89091e1f6e347 /src
parente2234b4afebb266878435d10267e7b162b1fe984 (diff)
downloadmeowcraft-aca1326e7e3cc4c06e29b92dca256673b46aa510.tar.zst
meowcraft-aca1326e7e3cc4c06e29b92dca256673b46aa510.zip
Triangle
Diffstat (limited to 'src')
-rw-r--r--src/Binder.cpp50
-rw-r--r--src/Binder.hpp37
-rw-r--r--src/Math/Math.hpp3
-rw-r--r--src/Math/Vector.hpp9
-rw-r--r--src/Mesh.cpp9
-rw-r--r--src/Mesh.hpp20
-rw-r--r--src/Shader/Shader.cpp24
-rw-r--r--src/Shader/Shader.hpp29
-rw-r--r--src/Shader/ShaderProgram.cpp32
-rw-r--r--src/Shader/ShaderProgram.hpp19
-rw-r--r--src/Shader/ShaderSources.hpp13
-rw-r--r--src/Shader/fragment.glsl8
-rw-r--r--src/Shader/vertex.glsl7
-rw-r--r--src/main.cpp28
14 files changed, 287 insertions, 1 deletions
diff --git a/src/Binder.cpp b/src/Binder.cpp
new file mode 100644
index 0000000..8f9b7df
--- /dev/null
+++ b/src/Binder.cpp
@@ -0,0 +1,50 @@
+#include <GL/glew.h>
+#include "Binder.hpp"
+#include "Mesh.hpp"
+
+namespace MC {
+
+BindableMesh Binder::load(Mesh& mesh) {
+ auto vao = create_vao();
+ store_in_attribute_list(0, 3, mesh.flat(), mesh.size() * 3);
+ unbind_vao();
+
+ return {vao, mesh.size()};
+}
+
+uint32_t Binder::create_vao() {
+ GLuint vao;
+ glGenVertexArrays(1, &vao);
+ glBindVertexArray(vao);
+
+ return static_cast<uint32_t>(vao);
+}
+
+uint32_t Binder::unbind_vao() {
+ glBindVertexArray(0);
+}
+
+void Binder::store_in_attribute_list(uint32_t attribute, size_t size, float* data, size_t data_size) {
+ GLuint vbo;
+ glGenBuffers(1, &vbo);
+
+ glBindBuffer(GL_ARRAY_BUFFER, vbo);
+ glBufferData(GL_ARRAY_BUFFER, data_size * sizeof(float), data, GL_STATIC_DRAW);
+ glVertexAttribPointer(attribute, size, GL_FLOAT, GL_FALSE, 3 * sizeof(float), nullptr);
+}
+
+void BindableMesh::bind() const {
+ glBindVertexArray(m_vao);
+ glEnableVertexAttribArray(0);
+}
+
+void BindableMesh::unbind() {
+ glBindVertexArray(0);
+ glDisableVertexAttribArray(0);
+}
+
+size_t BindableMesh::size() const {
+ return m_vertex_count;
+}
+
+} \ No newline at end of file
diff --git a/src/Binder.hpp b/src/Binder.hpp
new file mode 100644
index 0000000..721ec77
--- /dev/null
+++ b/src/Binder.hpp
@@ -0,0 +1,37 @@
+#pragma once
+
+#include <cstdint>
+#include "Mesh.hpp"
+
+namespace MC {
+
+class BindableMesh {
+public:
+ void bind() const;
+ void unbind();
+
+ size_t size() const;
+
+private:
+ BindableMesh(uint32_t vao, size_t vertex_count) : m_vao(vao), m_vertex_count(vertex_count) {};
+
+ uint32_t m_vao;
+ size_t m_vertex_count;
+
+ friend class Binder;
+};
+
+class Binder {
+public:
+ Binder() = default;;
+
+ static BindableMesh load(Mesh& mesh);
+
+private:
+ static uint32_t create_vao();
+ static uint32_t unbind_vao();
+
+ static void store_in_attribute_list(uint32_t attribute, size_t size, float* data, size_t data_size);
+};
+
+} \ No newline at end of file
diff --git a/src/Math/Math.hpp b/src/Math/Math.hpp
new file mode 100644
index 0000000..66ffd36
--- /dev/null
+++ b/src/Math/Math.hpp
@@ -0,0 +1,3 @@
+#pragma once
+
+#include "Vector.hpp" \ No newline at end of file
diff --git a/src/Math/Vector.hpp b/src/Math/Vector.hpp
new file mode 100644
index 0000000..9c76758
--- /dev/null
+++ b/src/Math/Vector.hpp
@@ -0,0 +1,9 @@
+#pragma once
+
+struct Vector3 {
+public:
+ Vector3(float x, float y, float z)
+ : x(x), y(y), z(z) {};
+
+ float x, y, z;
+};
diff --git a/src/Mesh.cpp b/src/Mesh.cpp
new file mode 100644
index 0000000..b8c3315
--- /dev/null
+++ b/src/Mesh.cpp
@@ -0,0 +1,9 @@
+#include "Mesh.hpp"
+
+float* MC::Mesh::flat() {
+ return (float*)m_positions.data();
+}
+
+std::size_t MC::Mesh::size() {
+ return m_positions.size();
+}
diff --git a/src/Mesh.hpp b/src/Mesh.hpp
new file mode 100644
index 0000000..acf4f3b
--- /dev/null
+++ b/src/Mesh.hpp
@@ -0,0 +1,20 @@
+#pragma once
+
+#include <utility>
+#include <vector>
+#include <cstdint>
+#include "Math/Math.hpp"
+
+namespace MC {
+
+class Mesh {
+public:
+ Mesh(std::vector<Vector3> positions) : m_positions(std::move(positions)) {};
+
+ std::size_t size();
+ float* flat();
+private:
+ std::vector<Vector3> m_positions;
+};
+
+} \ No newline at end of file
diff --git a/src/Shader/Shader.cpp b/src/Shader/Shader.cpp
new file mode 100644
index 0000000..0cd6ab3
--- /dev/null
+++ b/src/Shader/Shader.cpp
@@ -0,0 +1,24 @@
+#include <GL/glew.h>
+#include <stdexcept>
+#include "Shader.hpp"
+
+namespace MC {
+
+Shader::Shader(uint32_t type, const char* source) {
+ m_shader = glCreateShader(type);
+
+ glShaderSource(m_shader, 1, &source, nullptr);
+ glCompileShader(m_shader);
+
+ GLint success;
+ glGetShaderiv(m_shader, GL_COMPILE_STATUS, &success);
+ if(!success) {
+ char message[512] = {};
+ glGetShaderInfoLog(m_shader, 512, nullptr, message);
+
+ throw std::runtime_error(message);
+ }
+}
+
+
+} \ No newline at end of file
diff --git a/src/Shader/Shader.hpp b/src/Shader/Shader.hpp
new file mode 100644
index 0000000..75c4f14
--- /dev/null
+++ b/src/Shader/Shader.hpp
@@ -0,0 +1,29 @@
+#pragma once
+
+#include <cstdint>
+#include "ShaderSources.hpp"
+
+namespace MC {
+
+class Shader {
+
+public:
+ uint32_t get() const {
+ return m_shader;
+ }
+
+ static Shader create_vertex() {
+ return {GL_VERTEX_SHADER, ShaderSources::vertex_shader};
+ }
+
+ static Shader create_fragment() {
+ return {GL_FRAGMENT_SHADER, ShaderSources::fragment_shader};
+ }
+
+private:
+ Shader(uint32_t type, const char* source);
+
+ uint32_t m_shader;
+};
+
+} \ No newline at end of file
diff --git a/src/Shader/ShaderProgram.cpp b/src/Shader/ShaderProgram.cpp
new file mode 100644
index 0000000..854b1bf
--- /dev/null
+++ b/src/Shader/ShaderProgram.cpp
@@ -0,0 +1,32 @@
+#include <GL/glew.h>
+#include <stdexcept>
+#include "ShaderProgram.hpp"
+
+namespace MC {
+
+ShaderProgram::ShaderProgram(Shader fragment, Shader vertex) {
+ m_program = glCreateProgram();
+
+ glAttachShader(m_program, fragment.get());
+ glAttachShader(m_program, vertex.get());
+
+ glLinkProgram(m_program);
+
+ glDeleteShader(fragment.get());
+ glDeleteShader(vertex.get());
+
+ GLint success;
+ glGetProgramiv(m_program, GL_LINK_STATUS, &success);
+ if(!success) {
+ char message[512] = {};
+ glGetProgramInfoLog(m_program, 512, nullptr, message);
+
+ throw std::runtime_error(message);
+ }
+}
+
+void ShaderProgram::bind() const {
+ glUseProgram(m_program);
+}
+
+}
diff --git a/src/Shader/ShaderProgram.hpp b/src/Shader/ShaderProgram.hpp
new file mode 100644
index 0000000..800e3ff
--- /dev/null
+++ b/src/Shader/ShaderProgram.hpp
@@ -0,0 +1,19 @@
+#pragma once
+
+#include "Shader.hpp"
+
+namespace MC {
+
+class ShaderProgram {
+public:
+ ShaderProgram(Shader fragment, Shader vertex);
+
+ void bind() const;
+
+ uint32_t get();
+
+private:
+ uint32_t m_program;
+};
+
+} \ No newline at end of file
diff --git a/src/Shader/ShaderSources.hpp b/src/Shader/ShaderSources.hpp
new file mode 100644
index 0000000..bd413b6
--- /dev/null
+++ b/src/Shader/ShaderSources.hpp
@@ -0,0 +1,13 @@
+#pragma once
+
+namespace MC::ShaderSources {
+
+constexpr const char* vertex_shader =
+#include "Generated/vertex.glsl.includable"
+;
+
+constexpr const char* fragment_shader =
+#include "Generated/fragment.glsl.includable"
+;
+
+} \ No newline at end of file
diff --git a/src/Shader/fragment.glsl b/src/Shader/fragment.glsl
new file mode 100644
index 0000000..017a2c8
--- /dev/null
+++ b/src/Shader/fragment.glsl
@@ -0,0 +1,8 @@
+#version 330 core
+
+out vec4 color;
+
+void main()
+{
+ color = vec4(1.0f, 0.5f, 0.2f, 1.0f);
+} \ No newline at end of file
diff --git a/src/Shader/vertex.glsl b/src/Shader/vertex.glsl
new file mode 100644
index 0000000..8b1bbbd
--- /dev/null
+++ b/src/Shader/vertex.glsl
@@ -0,0 +1,7 @@
+#version 330 core
+
+in vec3 position;
+
+void main() {
+ gl_Position = vec4(position.x, position.y, position.z, 1.0);
+} \ No newline at end of file
diff --git a/src/main.cpp b/src/main.cpp
index 91e1b23..d025c91 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -3,6 +3,9 @@
#include <GLFW/glfw3.h>
#include "Window.hpp"
+#include "Mesh.hpp"
+#include "Binder.hpp"
+#include "Shader/ShaderProgram.hpp"
#define APP_NAME "Meowcraft"
@@ -10,6 +13,7 @@
#define WINDOW_HEIGHT 800
void run();
+void render(MC::BindableMesh&);
void setup_gl();
int main() {
@@ -33,19 +37,41 @@ void run() {
glViewport(0, 0, WINDOW_WIDTH, WINDOW_HEIGHT);
+ MC::Mesh triangle({
+ {-0.5, -0.5, 0.0},
+ {0.5, -0.5, 0.0},
+ {0.0, 0.5, 0.0},
+ });
+
+ auto mesh = MC::Binder::load(triangle);
+
+ MC::ShaderProgram program(MC::Shader::create_fragment(), MC::Shader::create_vertex());
+ program.bind();
+
while (!window.should_close()) {
window.start_frame();
if (window.key(GLFW_KEY_ESCAPE, GLFW_PRESS)) {
window.close();
}
+
+ render(mesh);
}
}
+void render(MC::BindableMesh& mesh) {
+ glClearColor(0.65f, 0.8f, 0.8f, 1.0f);
+ glClear(GL_COLOR_BUFFER_BIT);
+
+ mesh.bind();
+ glDrawArrays(GL_TRIANGLES, 0, mesh.size());
+ mesh.unbind();
+}
+
void setup_gl() {
GLenum error;
if ((error = glewInit()) != GLEW_OK) {
- std::string error_string = std::string(reinterpret_cast<const char*>(glewGetErrorString(error)));
+ std::string error_string(reinterpret_cast<const char*>(glewGetErrorString(error)));
throw std::runtime_error("Failed to load GL functions: " + error_string);
}
}