aboutsummaryrefslogtreecommitdiff
path: root/src/platform/opengl/texture.h
diff options
context:
space:
mode:
authorhachem <im@hachem.wtf>2026-08-23 21:55:36 +0200
committerhachem <im@hachem.wtf>2026-08-23 21:55:36 +0200
commit5ea6c14c0e14bacee766ce1280ab2c71564e05ec (patch)
tree34620051e8eaf65db4ff9cd40ffd982a03e1ccc8 /src/platform/opengl/texture.h
parent8742482311b86bb705d93336805ab26881e96070 (diff)
[feat]: implement ui layer arch
Diffstat (limited to 'src/platform/opengl/texture.h')
-rw-r--r--src/platform/opengl/texture.h83
1 files changed, 83 insertions, 0 deletions
diff --git a/src/platform/opengl/texture.h b/src/platform/opengl/texture.h
new file mode 100644
index 0000000..5f68c78
--- /dev/null
+++ b/src/platform/opengl/texture.h
@@ -0,0 +1,83 @@
+#pragma once
+
+#include "core/memory.h"
+
+#include <string>
+#include <cstdint>
+#include <glm/glm.hpp>
+
+namespace Donut
+{
+ class Texture
+ {
+ public:
+ virtual ~Texture() = default;
+
+ virtual auto get_width() const -> uint32_t = 0;
+ virtual auto get_height() const -> uint32_t = 0;
+ virtual auto get_renderer_id() const -> uint32_t = 0;
+
+ virtual auto set_data(void* data, uint32_t size) -> void = 0;
+ virtual auto bind(uint32_t slot = 0) const -> void = 0;
+ virtual auto bind_as_image(uint32_t slot = 0, bool read_only = false) const -> void = 0;
+
+ virtual auto operator==(const Texture& other) const -> bool = 0;
+ };
+
+ class Texture2D : public Texture
+ {
+ public:
+ Texture2D(uint32_t width, uint32_t height);
+ Texture2D(const std::string& path);
+ ~Texture2D();
+
+ auto get_width() const -> uint32_t override { return m_width; }
+ auto get_height() const -> uint32_t override { return m_height; }
+ auto get_renderer_id() const -> uint32_t override { return m_renderer_id; }
+
+ auto set_data(void* data, uint32_t size) -> void override;
+ auto bind(uint32_t slot = 0) const -> void override;
+ auto bind_as_image(uint32_t slot = 0, bool read_only = false) const -> void override;
+
+ auto operator==(const Texture& other) const -> bool override { return m_renderer_id == other.get_renderer_id(); }
+
+ static auto create(uint32_t width, uint32_t height) -> Ref<Texture2D>;
+ static auto create(const std::string& path) -> Ref<Texture2D>;
+
+ private:
+ std::string m_path;
+ uint32_t m_width = 0, m_height = 0;
+ uint32_t m_renderer_id = 0;
+ uint32_t m_internal_format = 0, m_data_format = 0; // GLenum values
+ };
+
+ class CubemapTexture : public Texture
+ {
+ public:
+ CubemapTexture(uint32_t width, uint32_t height);
+ CubemapTexture(const std::string& path);
+ ~CubemapTexture();
+
+ auto get_width() const -> uint32_t override { return m_width; }
+ auto get_height() const -> uint32_t override { return m_height; }
+ auto get_renderer_id() const -> uint32_t override { return m_renderer_id; }
+
+ auto set_data(void* data, uint32_t size) -> void override;
+ auto bind(uint32_t slot = 0) const -> void override;
+ auto bind_as_image(uint32_t slot = 0, bool read_only = false) const -> void override;
+
+ auto operator==(const Texture& other) const -> bool override { return m_renderer_id == other.get_renderer_id(); }
+
+ static auto create(uint32_t width, uint32_t height) -> Ref<CubemapTexture>;
+ static auto create_from_hdri(const std::string& path) -> Ref<CubemapTexture>;
+
+ private:
+ auto LoadHDRI(const std::string& path) -> void;
+ auto convert_equirectangular_to_cubemap(float* hdr_data, int width, int height) -> void;
+
+ std::string m_path;
+ uint32_t m_width = 0, m_height = 0;
+ uint32_t m_renderer_id = 0;
+ uint32_t m_internal_format = 0, m_data_format = 0; // GLenum values
+ };
+};