summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CMakeLists.txt2
-rw-r--r--src/GFX/Image/PPMParser.cpp2
-rw-r--r--src/GFX/Image/RawImage.hpp4
-rw-r--r--src/GFX/Shading/Program.cpp4
-rw-r--r--src/GFX/Shading/Program.hpp1
-rw-r--r--src/Util/ImageViewer.cpp59
-rw-r--r--src/Util/ImageViewer.hpp35
7 files changed, 103 insertions, 4 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 5e67d85..bc602f5 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -10,7 +10,7 @@ if (LINUX)
find_package(OpenGL REQUIRED)
endif (LINUX)
-add_executable(meowcraft src/main.cpp src/GFX/Window.cpp src/GFX/Window.hpp src/GFX/Mesh.cpp src/GFX/Mesh.hpp src/Math/Vector.hpp src/Math/Math.hpp src/GFX/Binder.cpp src/GFX/Binder.hpp src/GFX/Shading/Shader.cpp src/GFX/Shading/Shader.hpp src/GFX/Shading/Program.cpp src/GFX/Shading/Program.hpp src/Math/Matrix.hpp src/Math/MVP.cpp src/Math/MVP.hpp src/GFX/Camera.cpp src/GFX/Camera.hpp src/Math/Rotation.hpp src/GFX/Shading/Uniform.cpp src/GFX/Shading/Uniform.hpp src/GFX/Mouse.cpp src/GFX/Mouse.hpp src/Math/Trig.hpp src/GFX/Texture.cpp src/GFX/Texture.hpp src/Assets.cpp src/Assets.hpp src/GFX/Image/RawImage.cpp src/GFX/Image/RawImage.hpp src/GFX/Image/PPMParser.cpp src/GFX/Image/PPMParser.hpp src/World/Chunk.cpp src/World/Chunk.hpp src/World/BlockType.hpp src/World/Generator.cpp src/World/Generator.hpp src/World/BlockSide.hpp src/World/World.cpp src/World/World.hpp src/World/ChunkIndex.hpp src/Math/Noise.hpp src/Math/Noise.cpp)
+add_executable(meowcraft src/main.cpp src/GFX/Window.cpp src/GFX/Window.hpp src/GFX/Mesh.cpp src/GFX/Mesh.hpp src/Math/Vector.hpp src/Math/Math.hpp src/GFX/Binder.cpp src/GFX/Binder.hpp src/GFX/Shading/Shader.cpp src/GFX/Shading/Shader.hpp src/GFX/Shading/Program.cpp src/GFX/Shading/Program.hpp src/Math/Matrix.hpp src/Math/MVP.cpp src/Math/MVP.hpp src/GFX/Camera.cpp src/GFX/Camera.hpp src/Math/Rotation.hpp src/GFX/Shading/Uniform.cpp src/GFX/Shading/Uniform.hpp src/GFX/Mouse.cpp src/GFX/Mouse.hpp src/Math/Trig.hpp src/GFX/Texture.cpp src/GFX/Texture.hpp src/Assets.cpp src/Assets.hpp src/GFX/Image/RawImage.cpp src/GFX/Image/RawImage.hpp src/GFX/Image/PPMParser.cpp src/GFX/Image/PPMParser.hpp src/World/Chunk.cpp src/World/Chunk.hpp src/World/BlockType.hpp src/World/Generator.cpp src/World/Generator.hpp src/World/BlockSide.hpp src/World/World.cpp src/World/World.hpp src/World/ChunkIndex.hpp src/Math/Noise.hpp src/Math/Noise.cpp src/Util/ImageViewer.cpp src/Util/ImageViewer.hpp)
target_link_libraries(meowcraft glfw GLEW::GLEW)
if (LINUX)
diff --git a/src/GFX/Image/PPMParser.cpp b/src/GFX/Image/PPMParser.cpp
index b809ef1..31be0ab 100644
--- a/src/GFX/Image/PPMParser.cpp
+++ b/src/GFX/Image/PPMParser.cpp
@@ -17,7 +17,7 @@ RawImage PPMParser::parse() {
auto pixel_count = header.width * header.height;
- RawImage image(pixel_count, header.width, header.height, 3);
+ RawImage image(header.width, header.height, 3);
for (uint64_t pixel_index = 0; pixel_index < pixel_count; pixel_index++) {
RawImage::Pixel pixel = parse_pixel(header.max_color);
image.add(pixel);
diff --git a/src/GFX/Image/RawImage.hpp b/src/GFX/Image/RawImage.hpp
index 916671b..2b10cb0 100644
--- a/src/GFX/Image/RawImage.hpp
+++ b/src/GFX/Image/RawImage.hpp
@@ -10,9 +10,9 @@ class RawImage {
public:
RawImage() : m_pixels(), m_width(0), m_height(0), m_channels(0) {};
- explicit RawImage(size_t pixel_count, uint32_t width, uint32_t height, uint8_t channels)
+ explicit RawImage(uint32_t width, uint32_t height, uint8_t channels)
: m_pixels(), m_width(width), m_height(height), m_channels(channels) {
- m_pixels.reserve(pixel_count);
+ m_pixels.reserve(width * height);
}
struct Pixel {
diff --git a/src/GFX/Shading/Program.cpp b/src/GFX/Shading/Program.cpp
index 2b675f8..6efb30b 100644
--- a/src/GFX/Shading/Program.cpp
+++ b/src/GFX/Shading/Program.cpp
@@ -29,6 +29,10 @@ void Program::bind() const {
glUseProgram(m_program);
}
+void Program::unbind() const {
+ glUseProgram(0);
+}
+
Uniform Program::uniform(const std::string& name) const {
auto index = glGetUniformLocation(m_program, name.c_str());
diff --git a/src/GFX/Shading/Program.hpp b/src/GFX/Shading/Program.hpp
index b04dfff..b7db953 100644
--- a/src/GFX/Shading/Program.hpp
+++ b/src/GFX/Shading/Program.hpp
@@ -17,6 +17,7 @@ public:
Uniform uniform(const std::string& name) const;
void bind() const;
+ void unbind() const;
private:
uint32_t m_program;
diff --git a/src/Util/ImageViewer.cpp b/src/Util/ImageViewer.cpp
new file mode 100644
index 0000000..76faa3e
--- /dev/null
+++ b/src/Util/ImageViewer.cpp
@@ -0,0 +1,59 @@
+#include <GL/glew.h>
+#include "ImageViewer.hpp"
+
+namespace MC::Util {
+
+void ImageViewer::render() {
+ m_program.bind();
+ m_texture.bind();
+ m_mesh.bind();
+ glDrawElements(GL_TRIANGLES, m_mesh.size(), GL_UNSIGNED_INT, nullptr);
+ m_mesh.unbind();
+ m_texture.unbind();
+ m_program.unbind();
+}
+
+GFX::Mesh ImageViewer::create_default_mesh() {
+ return {{
+ std::vector<Vector<3>>{
+ {0.0f, 1.0f, 0.0f}, // top left
+ {0.0f, 0.0f, 0.0f}, // bottom left
+ {1.0f, 0.0f, 0.0f}, // bottom right
+ {1.0f, 0.0f, 0.0f } // top right
+ },
+ std::vector<Vector<2>>{
+ {1.0f, 1.0f},
+ {1.0f, 0.0f,},
+ {0.0f, 0.0f},
+ {0.0f, 1.0f},
+ },
+ }, {0, 1, 2, 0, 2, 3}};
+}
+
+const char* ImageViewer::vertex = R"v(
+#version 330 core
+
+layout (location = 0) in vec3 position;
+layout (location = 1) in vec2 tex_coord;
+
+out vec2 frag_tex_coord;
+
+void main() {
+ gl_Position = vec4(position, 1.0);
+ frag_tex_coord = tex_coord;
+})v";
+
+const char* ImageViewer::fragment = R"f(
+#version 330 core
+
+uniform sampler2D image;
+
+in vec2 frag_tex_coord;
+out vec4 color;
+
+void main() {
+ //color = texture(image, frag_tex_coord);
+ color = vec4(0.3, 0.5, 1.0, 1.0);
+})f";
+
+} \ No newline at end of file
diff --git a/src/Util/ImageViewer.hpp b/src/Util/ImageViewer.hpp
new file mode 100644
index 0000000..d583aa8
--- /dev/null
+++ b/src/Util/ImageViewer.hpp
@@ -0,0 +1,35 @@
+#pragma once
+
+#include "../GFX/Image/RawImage.hpp"
+#include "../GFX/Binder.hpp"
+#include "../GFX/Texture.hpp"
+#include "../GFX/Shading/Program.hpp"
+
+namespace MC::Util {
+
+class ImageViewer {
+public:
+ explicit ImageViewer(
+ GFX::Image::RawImage& image
+ ) : m_texture(image),
+ m_program(
+ {GFX::Shading::Shader::Type::Vertex, ImageViewer::vertex},
+ {GFX::Shading::Shader::Type::Fragment, ImageViewer::fragment}
+ ),
+ m_mesh(GFX::Binder::load(default_mesh)) {};
+
+ void render();
+private:
+ static GFX::Mesh create_default_mesh();
+
+ static inline GFX::Mesh default_mesh = create_default_mesh();
+
+ static const char* vertex;
+ static const char* fragment;
+
+ MC::GFX::BindableMesh m_mesh;
+ MC::GFX::Shading::Program m_program;
+ MC::GFX::Texture m_texture;
+};
+
+} \ No newline at end of file