diff options
| -rw-r--r-- | CMakeLists.txt | 2 | ||||
| -rw-r--r-- | src/GFX/Image/PPMParser.cpp | 2 | ||||
| -rw-r--r-- | src/GFX/Image/RawImage.hpp | 4 | ||||
| -rw-r--r-- | src/GFX/Shading/Program.cpp | 4 | ||||
| -rw-r--r-- | src/GFX/Shading/Program.hpp | 1 | ||||
| -rw-r--r-- | src/Util/ImageViewer.cpp | 59 | ||||
| -rw-r--r-- | src/Util/ImageViewer.hpp | 35 |
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 |
