summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--game/terrain.cpp5
-rw-r--r--lib/glMappedBufferSpan.h51
-rw-r--r--lib/glMappedBufferWriter.cpp4
-rw-r--r--lib/glMappedBufferWriter.h78
4 files changed, 54 insertions, 84 deletions
diff --git a/game/terrain.cpp b/game/terrain.cpp
index 8bef36e..44ed484 100644
--- a/game/terrain.cpp
+++ b/game/terrain.cpp
@@ -6,7 +6,7 @@
#include <gfx/image.h>
#include <gfx/models/mesh.h>
#include <gfx/models/vertex.h>
-#include <glMappedBufferWriter.h>
+#include <glMappedBufferSpan.h>
#include <glm/glm.hpp>
#include <location.h>
#include <maths.h>
@@ -33,7 +33,8 @@ Terrain::SurfaceKey::operator<(const SurfaceKey & other) const
inline void
Terrain::copyVerticesToBuffer() const
{
- std::ranges::transform(all_vertices(), glMappedBufferWriter<Vertex> {GL_ARRAY_BUFFER, verticesBuffer, n_vertices()},
+ std::ranges::transform(all_vertices(),
+ glMappedBufferSpan<Vertex> {verticesBuffer, n_vertices(), GL_WRITE_ONLY, true}.begin(),
[this](const auto & vertex) {
return Vertex {point(vertex), normal(vertex)};
});
diff --git a/lib/glMappedBufferSpan.h b/lib/glMappedBufferSpan.h
new file mode 100644
index 0000000..d30c911
--- /dev/null
+++ b/lib/glMappedBufferSpan.h
@@ -0,0 +1,51 @@
+#pragma once
+
+#include "special_members.h"
+#include <cstddef>
+#include <glad/gl.h>
+#include <span>
+#include <utility>
+
+template<typename T> class glMappedBufferSpan : public std::span<T> {
+public:
+ glMappedBufferSpan(GLuint buffer, size_t count, GLenum access, bool reinit) :
+ std::span<T> {[&]() {
+ if (reinit) {
+ glNamedBufferData(
+ buffer, static_cast<GLsizeiptr>(sizeof(T) * count), nullptr, GL_DYNAMIC_DRAW);
+ }
+ return static_cast<T *>(glMapNamedBuffer(buffer, access));
+ }(),
+ count},
+ buffer {buffer}
+ {
+ }
+
+ ~glMappedBufferSpan()
+ {
+ if (buffer) {
+ glUnmapNamedBuffer(buffer);
+ }
+ }
+
+ glMappedBufferSpan(glMappedBufferSpan && other) noexcept :
+ std::span<T> {other}, buffer {std::exchange(other.buffer, 0)}
+ {
+ }
+
+ glMappedBufferSpan &
+ operator=(glMappedBufferSpan && other) noexcept
+ {
+ std::span<T>::span = other;
+ if (buffer) {
+ glUnmapBuffer(buffer);
+ }
+ buffer = std::exchange(other.buffer, 0);
+ return *this;
+ }
+
+ NO_COPY(glMappedBufferSpan);
+
+private:
+ GLuint buffer;
+};
diff --git a/lib/glMappedBufferWriter.cpp b/lib/glMappedBufferWriter.cpp
deleted file mode 100644
index cc3c413..0000000
--- a/lib/glMappedBufferWriter.cpp
+++ /dev/null
@@ -1,4 +0,0 @@
-#include "glMappedBufferWriter.h"
-#include <iterator>
-
-static_assert(std::weakly_incrementable<glMappedBufferWriter<int>>);
diff --git a/lib/glMappedBufferWriter.h b/lib/glMappedBufferWriter.h
deleted file mode 100644
index 05540e4..0000000
--- a/lib/glMappedBufferWriter.h
+++ /dev/null
@@ -1,78 +0,0 @@
-#pragma once
-
-#include "special_members.h"
-#include <cstddef>
-#include <glad/gl.h>
-#include <utility>
-
-template<typename T> class glMappedBufferWriter {
-public:
- using difference_type = std::ptrdiff_t;
-
- glMappedBufferWriter(GLenum target, GLuint buffer, size_t count) :
- target {target}, data {[&]() {
- glBindBuffer(target, buffer);
- glBufferData(target, static_cast<GLsizeiptr>(sizeof(T) * count), nullptr, GL_DYNAMIC_DRAW);
- return static_cast<T *>(glMapBuffer(target, GL_WRITE_ONLY));
- }()}
- {
- }
-
- ~glMappedBufferWriter()
- {
- if (target) {
- glUnmapBuffer(target);
- }
- }
-
- glMappedBufferWriter(glMappedBufferWriter && other) noexcept :
- target {std::exchange(other.target, 0)}, data {std::exchange(other.data, nullptr)}
- {
- }
-
- glMappedBufferWriter &
- operator=(glMappedBufferWriter && other) noexcept
- {
- if (target) {
- glUnmapBuffer(target);
- }
- target = std::exchange(other.target, 0);
- data = std::exchange(other.data, nullptr);
- return *this;
- }
-
- NO_COPY(glMappedBufferWriter);
-
- glMappedBufferWriter &
- operator++()
- {
- data++;
- return *this;
- }
-
- glMappedBufferWriter &
- operator++(int)
- {
- glMappedBufferWriter rtn {data};
- data++;
- return rtn;
- }
-
- T &
- operator*()
- {
- return *data;
- }
-
- T *
- operator->() const
- {
- return data;
- }
-
-private:
- explicit glMappedBufferWriter(T * data) : target {0}, data {data} { }
-
- GLenum target;
- T * data;
-};