summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMel <einebeere@gmail.com>2022-10-10 16:23:26 +0200
committerMel <einebeere@gmail.com>2022-10-10 16:23:26 +0200
commitcb3ddae385c03a8830d39dc37fcd5bf273524d5e (patch)
tree0ccddcd6b32838b8fc2b65805a4fba96c4c0ff39 /src
parent799c06e0387e01bdb8a10019be6192f9db00a824 (diff)
downloadmeowcraft-cb3ddae385c03a8830d39dc37fcd5bf273524d5e.tar.zst
meowcraft-cb3ddae385c03a8830d39dc37fcd5bf273524d5e.zip
Try to add second VBO
Diffstat (limited to 'src')
-rw-r--r--src/Binder.cpp6
-rw-r--r--src/Image/PPMParser.cpp11
-rw-r--r--src/Image/RawImage.cpp16
-rw-r--r--src/Image/RawImage.hpp15
-rw-r--r--src/Mesh.cpp8
-rw-r--r--src/Mesh.hpp8
-rw-r--r--src/Texture.cpp27
-rw-r--r--src/Texture.hpp17
-rw-r--r--src/main.cpp9
9 files changed, 97 insertions, 20 deletions
diff --git a/src/Binder.cpp b/src/Binder.cpp
index 409c4ef..9bca480 100644
--- a/src/Binder.cpp
+++ b/src/Binder.cpp
@@ -8,6 +8,7 @@ BindableMesh Binder::load(Mesh& mesh) {
auto vao = create_vao();
store_indices(mesh.raw_indices(), mesh.indices_size());
store_in_attribute_list(0, 3, mesh.raw(), mesh.size() * 3);
+ store_in_attribute_list(1, 2, mesh.raw_tex_coords(), mesh.tex_coords_size() * 2);
unbind_vao();
return {vao, mesh.indices_size()};
@@ -39,17 +40,20 @@ void Binder::store_in_attribute_list(uint32_t attribute, size_t size, float* dat
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);
+ glVertexAttribPointer(attribute, size, GL_FLOAT, GL_FALSE, size * sizeof(float), nullptr);
+ glBindBuffer(GL_ARRAY_BUFFER, 0);
}
void BindableMesh::bind() const {
glBindVertexArray(m_vao);
glEnableVertexAttribArray(0);
+ glEnableVertexAttribArray(1);
}
void BindableMesh::unbind() {
glBindVertexArray(0);
glDisableVertexAttribArray(0);
+ glDisableVertexAttribArray(1);
}
size_t BindableMesh::size() const {
diff --git a/src/Image/PPMParser.cpp b/src/Image/PPMParser.cpp
index 0a9da54..d7d8c6a 100644
--- a/src/Image/PPMParser.cpp
+++ b/src/Image/PPMParser.cpp
@@ -8,8 +8,6 @@ namespace MC::Image {
RawImage PPMParser::parse() {
auto header = parse_header();
- std::cout << header.type << " " << header.width << " " << header.height << " " << (uint64_t)header.max_color << std::endl;
-
if (header.max_color != 255) {
throw std::logic_error("PPM max color values other than 255 are not implemented.");
}
@@ -20,7 +18,7 @@ RawImage PPMParser::parse() {
auto pixel_count = header.width * header.height;
- RawImage image(pixel_count);
+ RawImage image(pixel_count, 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);
@@ -97,16 +95,10 @@ uint64_t PPMParser::chomp_number() {
uint8_t digit = digit_ascii - '0';
- std::cout << "digit_ascii: " << digit_ascii << std::endl;
- std::cout << "digit: " << (uint64_t)digit << std::endl;
-
number *= 10;
number += digit;
-
- std::cout << "number: " << (uint64_t)number << std::endl;
}
- std::cout << "chomp number: " << number << std::endl;
return number;
}
@@ -125,7 +117,6 @@ std::string_view PPMParser::chomp_part() {
auto part = m_source.substr(m_cursor, length);
m_cursor += length;
- std::cout << "chomped: " << part << std::endl;
return part;
}
diff --git a/src/Image/RawImage.cpp b/src/Image/RawImage.cpp
index 50478ad..00bfb0c 100644
--- a/src/Image/RawImage.cpp
+++ b/src/Image/RawImage.cpp
@@ -6,12 +6,24 @@ void RawImage::add(RawImage::Pixel pixel) {
m_pixels.push_back(pixel);
}
-size_t RawImage::size() {
+size_t RawImage::size() const {
return m_pixels.size();
}
-uint8_t* RawImage::raw() {
+uint8_t* RawImage::raw() const {
return (uint8_t*)m_pixels.data();
}
+uint32_t RawImage::width() const {
+ return m_width;
+}
+
+uint32_t RawImage::height() const {
+ return m_height;
+}
+
+uint8_t RawImage::channels() const {
+ return m_channels;
+}
+
} \ No newline at end of file
diff --git a/src/Image/RawImage.hpp b/src/Image/RawImage.hpp
index 4414ee0..6c4b122 100644
--- a/src/Image/RawImage.hpp
+++ b/src/Image/RawImage.hpp
@@ -8,9 +8,10 @@ namespace MC::Image {
class RawImage {
public:
- RawImage() : m_pixels() {};
+ RawImage() : m_pixels(), m_width(0), m_height(0), m_channels(0) {};
- explicit RawImage(size_t pixel_count) : m_pixels() {
+ explicit RawImage(size_t pixel_count, 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);
}
@@ -20,11 +21,17 @@ public:
void add(Pixel pixel);
- size_t size();
- uint8_t* raw();
+ size_t size() const;
+ uint8_t* raw() const;
+ uint32_t width() const;
+ uint32_t height() const;
+ uint8_t channels() const;
private:
std::vector<Pixel> m_pixels;
+
+ uint32_t m_width, m_height;
+ uint8_t m_channels;
};
}
diff --git a/src/Mesh.cpp b/src/Mesh.cpp
index d1f3a88..56ce9dc 100644
--- a/src/Mesh.cpp
+++ b/src/Mesh.cpp
@@ -15,3 +15,11 @@ uint32_t* MC::Mesh::raw_indices() {
size_t MC::Mesh::indices_size() {
return m_indices.size();
}
+
+float* MC::Mesh::raw_tex_coords() {
+ return (float*)m_tex_coords.data();
+}
+
+size_t MC::Mesh::tex_coords_size() {
+ return m_tex_coords.size();
+}
diff --git a/src/Mesh.hpp b/src/Mesh.hpp
index a9dadb7..50fc629 100644
--- a/src/Mesh.hpp
+++ b/src/Mesh.hpp
@@ -9,8 +9,8 @@ namespace MC {
class Mesh {
public:
- Mesh(std::vector<Vector<3>> positions, std::vector<uint32_t> indices)
- : m_positions(std::move(positions)), m_indices(std::move(indices)) {};
+ Mesh(std::vector<Vector<3>> positions, std::vector<Vector<2>> tex_coords, std::vector<uint32_t> indices)
+ : m_positions(std::move(positions)), m_tex_coords(std::move(tex_coords)), m_indices(std::move(indices)) {};
float* raw();
size_t size();
@@ -18,8 +18,12 @@ public:
uint32_t* raw_indices();
size_t indices_size();
+ float* raw_tex_coords();
+ size_t tex_coords_size();
+
private:
std::vector<Vector<3>> m_positions;
+ std::vector<Vector<2>> m_tex_coords;
std::vector<uint32_t> m_indices;
};
diff --git a/src/Texture.cpp b/src/Texture.cpp
new file mode 100644
index 0000000..d32a75a
--- /dev/null
+++ b/src/Texture.cpp
@@ -0,0 +1,27 @@
+#include <GL/glew.h>
+#include "Texture.hpp"
+
+namespace MC {
+
+Texture::Texture(const Image::RawImage& image) {
+ glGenTextures(1, &m_texture);
+ glBindTexture(GL_TEXTURE_2D, m_texture);
+
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
+
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, image.width(), image.height(), 0, GL_RGB, GL_UNSIGNED_BYTE, image.raw());
+ glGenerateMipmap(GL_TEXTURE_2D);
+}
+
+void Texture::bind() {
+ glBindTexture(GL_TEXTURE_2D, m_texture);
+}
+
+void Texture::unbind() {
+ glBindTexture(GL_TEXTURE_2D, 0);
+}
+} \ No newline at end of file
diff --git a/src/Texture.hpp b/src/Texture.hpp
new file mode 100644
index 0000000..91b5e54
--- /dev/null
+++ b/src/Texture.hpp
@@ -0,0 +1,17 @@
+#pragma once
+
+#include "Image/RawImage.hpp"
+
+namespace MC {
+
+class Texture {
+public:
+ Texture(const Image::RawImage& image);
+
+ void bind();
+ void unbind();
+private:
+ uint32_t m_texture;
+};
+
+} \ No newline at end of file
diff --git a/src/main.cpp b/src/main.cpp
index 3da3d90..1f5d3a2 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -61,7 +61,14 @@ void run() {
{0.5f, -0.5f, -0.5f},
{0.5f, 0.5f, -0.5f},
{-0.5f, 0.5f, -0.5f}
- }, {
+ },
+ {
+ {-0.5f, -0.5f}, {0.5f, 0.5f},
+ {-0.5f, 0.5f}, {0.5f, 0.5f},
+ {0.5f, -0.5f}, {0.5f, 0.5f},
+ {-0.5f, -0.5f}, {-0.5f, 0.5f}
+ },
+ {
0, 1, 2, 2, 3, 0,
1, 5, 6, 6, 2, 1,
7, 6, 5, 5, 4, 7,