From 3b02022fd79ad0e130b8c49e7707d221bfc97bb5 Mon Sep 17 00:00:00 2001 From: hachem Date: Tue, 12 Aug 2025 19:17:50 +0200 Subject: feat: texture and pixel buffers --- src/platform/opengl/opengl_texture.cpp | 65 ++++++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 src/platform/opengl/opengl_texture.cpp (limited to 'src/platform/opengl/opengl_texture.cpp') diff --git a/src/platform/opengl/opengl_texture.cpp b/src/platform/opengl/opengl_texture.cpp new file mode 100644 index 0000000..87e9345 --- /dev/null +++ b/src/platform/opengl/opengl_texture.cpp @@ -0,0 +1,65 @@ +#include "opengl_texture.h" +#include + +namespace Donut +{ + OpenGLTexture2D::OpenGLTexture2D(uint32_t width, uint32_t height) + : m_width(width), m_height(height) + { + m_internal_format = GL_RGBA8; + m_data_format = GL_RGBA; + + glCreateTextures(GL_TEXTURE_2D, 1, &m_renderer_id); + glTextureStorage2D(m_renderer_id, 1, m_internal_format, m_width, m_height); + + glTextureParameteri(m_renderer_id, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTextureParameteri(m_renderer_id, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + + glTextureParameteri(m_renderer_id, GL_TEXTURE_WRAP_S, GL_REPEAT); + glTextureParameteri(m_renderer_id, GL_TEXTURE_WRAP_T, GL_REPEAT); + } + + OpenGLTexture2D::OpenGLTexture2D(const std::string& path) + : m_path(path) + { + m_width = 1; + m_height = 1; + m_internal_format = GL_RGBA8; + m_data_format = GL_RGBA; + + glCreateTextures(GL_TEXTURE_2D, 1, &m_renderer_id); + glTextureStorage2D(m_renderer_id, 1, m_internal_format, m_width, m_height); + + glTextureParameteri(m_renderer_id, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTextureParameteri(m_renderer_id, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + + glTextureParameteri(m_renderer_id, GL_TEXTURE_WRAP_S, GL_REPEAT); + glTextureParameteri(m_renderer_id, GL_TEXTURE_WRAP_T, GL_REPEAT); + + uint32_t white_pixel = 0xFFFFFFFF; + glTextureSubImage2D(m_renderer_id, 0, 0, 0, m_width, m_height, m_data_format, GL_UNSIGNED_BYTE, &white_pixel); + + std::cout << "Created default texture (stb_image not available for loading: " << path << ")" << std::endl; + } + + OpenGLTexture2D::~OpenGLTexture2D() + { + glDeleteTextures(1, &m_renderer_id); + } + + void OpenGLTexture2D::set_data(void* data, uint32_t size) + { + uint32_t bpp = m_data_format == GL_RGBA ? 4 : 3; + if (size != m_width * m_height * bpp) + { + std::cout << "Data must be entire texture!" << std::endl; + return; + } + glTextureSubImage2D(m_renderer_id, 0, 0, 0, m_width, m_height, m_data_format, GL_UNSIGNED_BYTE, data); + } + + void OpenGLTexture2D::bind(uint32_t slot) const + { + glBindTextureUnit(slot, m_renderer_id); + } +}; -- cgit v1.3