summaryrefslogtreecommitdiff
path: root/gfx
diff options
context:
space:
mode:
authorDan Goodliffe <dan.goodliffe@octal.co.uk>2026-03-02 13:17:28 +0000
committerDan Goodliffe <dan.goodliffe@octal.co.uk>2026-03-02 13:17:28 +0000
commit64ede41ebaade64ad6705f7f55ca4a778a156481 (patch)
tree6d2fbc64cd28d272fe3f5bbf79ddd41ecc5e2626 /gfx
parentRefactor glArrays to better expose underlying types (diff)
downloadilt-64ede41ebaade64ad6705f7f55ca4a778a156481.tar.bz2
ilt-64ede41ebaade64ad6705f7f55ca4a778a156481.tar.xz
ilt-64ede41ebaade64ad6705f7f55ca4a778a156481.zip
Wrap up some low level texture operations in glTexture classHEADmain
Fixes previously hard coded billboard texture size.
Diffstat (limited to 'gfx')
-rw-r--r--gfx/gl/billboardPainter.cpp6
-rw-r--r--gfx/gl/glTexture.cpp18
-rw-r--r--gfx/gl/glTexture.h17
-rw-r--r--gfx/gl/sceneRenderer.cpp32
-rw-r--r--gfx/gl/shadowMapper.cpp2
-rw-r--r--gfx/gl/shadowMapper.h6
-rw-r--r--gfx/gl/shadowStenciller.cpp5
-rw-r--r--gfx/models/texture.cpp23
-rw-r--r--gfx/models/texture.h3
9 files changed, 62 insertions, 50 deletions
diff --git a/gfx/gl/billboardPainter.cpp b/gfx/gl/billboardPainter.cpp
index e72e72d..06e13ca 100644
--- a/gfx/gl/billboardPainter.cpp
+++ b/gfx/gl/billboardPainter.cpp
@@ -40,8 +40,8 @@ BillboardPainter::createBillBoardTextures(GLsizei width, GLsizei height)
glTextures<3> textures;
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
- const auto configuregdata = [width, height](const GLuint texture, const GLint iformat, const GLenum format) {
- glBindTexture(GL_TEXTURE_2D_ARRAY, texture);
+ const auto configuregdata = [width, height](const auto & texture, const GLint iformat, const GLenum format) {
+ texture.bind(GL_TEXTURE_2D_ARRAY);
glTexParameter(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameter(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameter(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
@@ -78,7 +78,7 @@ BillboardPainter::renderBillBoard(
}
glUseProgram(program);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
- const TextureDimensions billboardSize = {256, 256, 8}; // Texture::getSize(billboard[0]);
+ const TextureDimensions billboardSize = billboard[0].getSize();
glViewport(0, 0, billboardSize.x, billboardSize.y);
const auto & centre = mesh.getDimensions().centre;
const auto & size = mesh.getDimensions().size;
diff --git a/gfx/gl/glTexture.cpp b/gfx/gl/glTexture.cpp
new file mode 100644
index 0000000..8dcf16f
--- /dev/null
+++ b/gfx/gl/glTexture.cpp
@@ -0,0 +1,18 @@
+#include "glTexture.h"
+
+TextureDimensions
+Impl::glTexture::getSize() const
+{
+ TextureDimensions size {};
+ glGetTextureLevelParameteriv(name, 0, GL_TEXTURE_WIDTH, &size.x);
+ glGetTextureLevelParameteriv(name, 0, GL_TEXTURE_HEIGHT, &size.y);
+ glGetTextureLevelParameteriv(name, 0, GL_TEXTURE_DEPTH, &size.z);
+ return size;
+}
+
+void
+Impl::glTexture::bind(GLenum type, GLenum unit) const
+{
+ glActiveTexture(unit);
+ glBindTexture(type, name);
+}
diff --git a/gfx/gl/glTexture.h b/gfx/gl/glTexture.h
new file mode 100644
index 0000000..c482198
--- /dev/null
+++ b/gfx/gl/glTexture.h
@@ -0,0 +1,17 @@
+#pragma once
+
+#include "config/types.h"
+#include "glArrays.h"
+
+namespace Impl {
+ // NOLINTNEXTLINE(readability-identifier-naming)
+ struct glTexture : Detail::glNamed {
+ [[nodiscard]] TextureDimensions getSize() const;
+ void bind(GLenum type = GL_TEXTURE_2D, GLenum unit = GL_TEXTURE0) const;
+ };
+}
+
+// NOLINTBEGIN(readability-identifier-naming)
+template<size_t N> using glTextures = glManagedArray<Impl::glTexture, N, &glGenTextures, &glDeleteTextures>;
+using glTexture = glManagedSingle<Impl::glTexture, &glGenTextures, &glDeleteTextures>;
+// NOLINTEND(readability-identifier-naming)
diff --git a/gfx/gl/sceneRenderer.cpp b/gfx/gl/sceneRenderer.cpp
index e693787..efa08ef 100644
--- a/gfx/gl/sceneRenderer.cpp
+++ b/gfx/gl/sceneRenderer.cpp
@@ -24,9 +24,9 @@ SceneRenderer::SceneRenderer(ScreenAbsCoord s, GLuint o, glDebugScope) :
shader.setViewPort({0, 0, size.x, size.y});
VertexArrayObject {displayVAO}.addAttribs<glm::i8vec4>(displayVBO, displayVAOdata);
- const auto configuregdata = [this](const GLuint data, const std::initializer_list<GLint> iformats,
+ const auto configuregdata = [this](const auto & data, const std::initializer_list<GLint> iformats,
const GLenum format, const GLenum attachment) {
- glBindTexture(GL_TEXTURE_2D, data);
+ data.bind();
glTexParameter(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameter(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
for (const auto iformat : iformats) {
@@ -65,8 +65,8 @@ SceneRenderer::resize(ScreenAbsCoord newSize)
glDebugScope _ {output};
size = newSize;
camera.setAspect(ratio(size));
- const auto configuregdata = [this](const GLuint data, const GLint iformat, const GLenum format) {
- glBindTexture(GL_TEXTURE_2D, data);
+ const auto configuregdata = [this](const auto & data, const GLint iformat, const GLenum format) {
+ data.bind();
glTexImage2D(GL_TEXTURE_2D, 0, iformat, size.x, size.y, 0, format, GL_BYTE, nullptr);
};
configuregdata(gPosition, GL_RGB32I, GL_RGB_INTEGER);
@@ -124,12 +124,9 @@ SceneRenderer::render(const SceneProvider & scene) const
// * per light - reads normal and position, writes illumination
glBindFramebuffer(GL_FRAMEBUFFER, gBufferIll);
glBlendFunc(GL_ONE, GL_ONE);
- glActiveTexture(GL_TEXTURE0);
- glBindTexture(GL_TEXTURE_2D, gPosition);
- glActiveTexture(GL_TEXTURE1);
- glBindTexture(GL_TEXTURE_2D, gNormal);
- glActiveTexture(GL_TEXTURE2);
- glBindTexture(GL_TEXTURE_2D_ARRAY, shadowMapper);
+ gPosition.bind(GL_TEXTURE_2D, GL_TEXTURE0);
+ gNormal.bind(GL_TEXTURE_2D, GL_TEXTURE1);
+ shadowMapper.bind(GL_TEXTURE2);
glDisable(GL_DEPTH_TEST);
scene.lights(shader);
}
@@ -141,10 +138,8 @@ SceneRenderer::render(const SceneProvider & scene) const
glCullFace(GL_BACK);
glDisable(GL_BLEND);
glDisable(GL_DEPTH_TEST);
- glActiveTexture(GL_TEXTURE2);
- glBindTexture(GL_TEXTURE_2D, gAlbedoSpec);
- glActiveTexture(GL_TEXTURE3);
- glBindTexture(GL_TEXTURE_2D, gIllumination);
+ gAlbedoSpec.bind(GL_TEXTURE_2D, GL_TEXTURE2);
+ gIllumination.bind(GL_TEXTURE_2D, GL_TEXTURE3);
lighting.use();
renderQuad();
}
@@ -168,12 +163,9 @@ SceneRenderer::setDirectionalLight(
const auto lvp = shadowMapper.update(scene, direction, camera);
glBindFramebuffer(GL_FRAMEBUFFER, gBufferIll);
glBlendFunc(GL_ONE, GL_ONE);
- glActiveTexture(GL_TEXTURE0);
- glBindTexture(GL_TEXTURE_2D, gPosition);
- glActiveTexture(GL_TEXTURE1);
- glBindTexture(GL_TEXTURE_2D, gNormal);
- glActiveTexture(GL_TEXTURE2);
- glBindTexture(GL_TEXTURE_2D_ARRAY, shadowMapper);
+ gPosition.bind(GL_TEXTURE_2D, GL_TEXTURE0);
+ gNormal.bind(GL_TEXTURE_2D, GL_TEXTURE1);
+ shadowMapper.bind(GL_TEXTURE2);
glViewport(0, 0, size.x, size.y);
dirLight.use();
dirLight.setDirectionalLight(colour, direction.vector(), camera.getPosition(), lvp);
diff --git a/gfx/gl/shadowMapper.cpp b/gfx/gl/shadowMapper.cpp
index 35c225b..03851f5 100644
--- a/gfx/gl/shadowMapper.cpp
+++ b/gfx/gl/shadowMapper.cpp
@@ -32,7 +32,7 @@ ShadowMapper::ShadowMapper(const TextureAbsCoord & s) :
size {s}, frustum {{}, {}, {}}
{
glDebugScope _ {depthMap};
- glBindTexture(GL_TEXTURE_2D_ARRAY, depthMap);
+ depthMap.bind(GL_TEXTURE_2D_ARRAY);
glTexImage3D(
GL_TEXTURE_2D_ARRAY, 0, GL_DEPTH_COMPONENT, size.x, size.y, 4, 0, GL_DEPTH_COMPONENT, GL_FLOAT, nullptr);
glTexParameter(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
diff --git a/gfx/gl/shadowMapper.h b/gfx/gl/shadowMapper.h
index 8b5e0b6..0d9763a 100644
--- a/gfx/gl/shadowMapper.h
+++ b/gfx/gl/shadowMapper.h
@@ -68,10 +68,10 @@ public:
DynamicPoint dynamicPoint;
StencilShadowProgram stencilShadowProgram;
- // NOLINTNEXTLINE(hicpp-explicit-conversions)
- operator GLuint() const
+ void
+ bind(GLenum unit) const
{
- return depthMap;
+ depthMap.bind(GL_TEXTURE_2D_ARRAY, unit);
}
private:
diff --git a/gfx/gl/shadowStenciller.cpp b/gfx/gl/shadowStenciller.cpp
index aee7161..7a0fc9b 100644
--- a/gfx/gl/shadowStenciller.cpp
+++ b/gfx/gl/shadowStenciller.cpp
@@ -1,7 +1,6 @@
#include "shadowStenciller.h"
#include "gfx/lightDirection.h"
#include "gfx/models/mesh.h"
-#include "glArrays.h"
#include "gl_traits.h"
#include "gldebug.h"
#include "maths.h"
@@ -34,7 +33,7 @@ glTexture
ShadowStenciller::createStencilTexture(GLsizei width, GLsizei height)
{
glTexture stencil;
- glBindTexture(GL_TEXTURE_2D_ARRAY, stencil);
+ stencil.bind(GL_TEXTURE_2D_ARRAY);
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glTexParameter(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
@@ -62,7 +61,7 @@ ShadowStenciller::renderStencil(const glTexture & stencil, const MeshBase & mesh
}
glUseProgram(shadowCaster);
glClear(GL_DEPTH_BUFFER_BIT);
- const auto stencilSize = Texture::getSize(stencil);
+ const auto stencilSize = stencil.getSize();
glViewport(0, 0, stencilSize.x, stencilSize.y);
const auto & centre = mesh.getDimensions().centre;
const auto & size = mesh.getDimensions().size;
diff --git a/gfx/models/texture.cpp b/gfx/models/texture.cpp
index 3457fb5..46bdff8 100644
--- a/gfx/models/texture.cpp
+++ b/gfx/models/texture.cpp
@@ -1,6 +1,5 @@
#include "texture.h"
#include "config/types.h"
-#include "glArrays.h"
#include "tga.h"
#include <fcntl.h>
#include <filesystem.h>
@@ -41,7 +40,7 @@ Texture::Texture(GLsizei width, GLsizei height, TextureOptions to) : Texture {wi
Texture::Texture(GLsizei width, GLsizei height, const void * data, TextureOptions to) : type {to.type}
{
- glBindTexture(type, m_texture);
+ m_texture.bind(type);
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glTexParameter(type, GL_TEXTURE_WRAP_S, TextureOptions::glMapMode(to.wrapU));
@@ -65,25 +64,14 @@ Texture::Texture(GLsizei width, GLsizei height, const void * data, TextureOption
void
Texture::bind(GLenum unit) const
{
- glActiveTexture(unit);
- glBindTexture(type, m_texture);
-}
-
-TextureDimensions
-Texture::getSize(const glTexture & texture)
-{
- TextureDimensions size {};
- glGetTextureLevelParameteriv(texture, 0, GL_TEXTURE_WIDTH, &size.x);
- glGetTextureLevelParameteriv(texture, 0, GL_TEXTURE_HEIGHT, &size.y);
- glGetTextureLevelParameteriv(texture, 0, GL_TEXTURE_DEPTH, &size.z);
- return size;
+ m_texture.bind(type, unit);
}
void
Texture::save(
const glTexture & texture, GLenum format, GLenum type, uint8_t channels, const char * path, uint8_t tgaFormat)
{
- const auto size = getSize(texture);
+ const auto size = texture.getSize();
const size_t dataSize = (static_cast<size_t>(size.x * size.y * size.z * channels));
const size_t fileSize = dataSize + sizeof(TGAHead);
@@ -132,7 +120,7 @@ Texture::saveNormal(const glTexture & texture, const char * path)
TextureAtlas::TextureAtlas(GLsizei width, GLsizei height, GLuint count) : Texture(width, height, nullptr, {})
{
- glBindTexture(GL_TEXTURE_RECTANGLE, m_atlas);
+ m_atlas.bind(GL_TEXTURE_RECTANGLE);
glTexParameter(GL_TEXTURE_RECTANGLE, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameter(GL_TEXTURE_RECTANGLE, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
@@ -147,8 +135,7 @@ void
TextureAtlas::bind(GLenum unit) const
{
Texture::bind(unit);
- glActiveTexture(unit + 1);
- glBindTexture(GL_TEXTURE_RECTANGLE, m_atlas);
+ m_atlas.bind(GL_TEXTURE_RECTANGLE, unit + 1);
}
GLuint
diff --git a/gfx/models/texture.h b/gfx/models/texture.h
index d8c3b29..03d296a 100644
--- a/gfx/models/texture.h
+++ b/gfx/models/texture.h
@@ -1,7 +1,7 @@
#pragma once
#include "config/types.h"
-#include "glArrays.h"
+#include "gfx/gl/glTexture.h"
#include "stdTypeDefs.h"
#include <filesystem>
#include <glm/fwd.hpp>
@@ -38,7 +38,6 @@ public:
static void saveDepth(const glTexture &, const char * path);
static void saveNormal(const glTexture &, const char * path);
static void savePosition(const glTexture &, const char * path);
- static TextureDimensions getSize(const glTexture &);
protected:
static void save(const glTexture &, GLenum, GLenum, uint8_t channels, const char * path, uint8_t tgaFormat);