From 8f84e67b7b9dcd4f5993909aa9ee2e222a207836 Mon Sep 17 00:00:00 2001 From: Dan Goodliffe Date: Sun, 23 Apr 2023 20:56:49 +0100 Subject: Assert the buffer is actually mapped Will fail if the context is deleted. We shouldn't trigger that, but we do right now. --- gfx/gl/instanceVertices.h | 2 ++ 1 file changed, 2 insertions(+) (limited to 'gfx') diff --git a/gfx/gl/instanceVertices.h b/gfx/gl/instanceVertices.h index 228020d..8bb2f21 100644 --- a/gfx/gl/instanceVertices.h +++ b/gfx/gl/instanceVertices.h @@ -1,6 +1,7 @@ #pragma once #include "glArrays.h" +#include #include #include #include @@ -186,6 +187,7 @@ protected: { if (!data) { data = static_cast(glMapNamedBuffer(buffer, GL_READ_WRITE)); + assert(data); } } -- cgit v1.2.3 From 5e022ee1ea94812b3446cac76e4f9ff9f3856d8c Mon Sep 17 00:00:00 2001 From: Dan Goodliffe Date: Sun, 23 Apr 2023 21:26:32 +0100 Subject: Add BufferedLocation Wraps Location, storing a pre-computed mat4 transformation of the position/rotation in a VBO handled by InstanceVertices. --- gfx/gl/bufferedLocation.cpp | 77 +++++++++++++++++++++++++++++++++++++++++++++ gfx/gl/bufferedLocation.h | 30 ++++++++++++++++++ 2 files changed, 107 insertions(+) create mode 100644 gfx/gl/bufferedLocation.cpp create mode 100644 gfx/gl/bufferedLocation.h (limited to 'gfx') diff --git a/gfx/gl/bufferedLocation.cpp b/gfx/gl/bufferedLocation.cpp new file mode 100644 index 0000000..4484053 --- /dev/null +++ b/gfx/gl/bufferedLocation.cpp @@ -0,0 +1,77 @@ +#include "bufferedLocation.h" +#include "location.hpp" +#include "maths.h" +#include + +BufferedLocation::BufferedLocation(InstanceVertices & i, glm::vec3 p, glm::vec3 r) : + BufferedLocation {i, Location {p, r}} +{ +} + +BufferedLocation::BufferedLocation(InstanceVertices & i, const Location & l) : + loc {l}, buffer {i.acquire(getTransform())} +{ +} + +BufferedLocation::operator const Location &() const +{ + return loc; +} + +BufferedLocation & +BufferedLocation::operator=(const Location & l) +{ + loc = l; + updateBuffer(); + return *this; +} + +glm::vec3 +BufferedLocation::position() const +{ + return loc.pos; +} + +glm::vec3 +BufferedLocation::rotation() const +{ + return loc.rot; +} + +void +BufferedLocation::setPosition(glm::vec3 p, bool update) +{ + loc.pos = p; + if (update) { + updateBuffer(); + } +} + +void +BufferedLocation::setRotation(glm::vec3 r, bool update) +{ + loc.rot = r; + if (update) { + updateBuffer(); + } +} + +void +BufferedLocation::setLocation(glm::vec3 p, glm::vec3 r) +{ + loc.pos = p; + loc.rot = r; + updateBuffer(); +} + +void +BufferedLocation::updateBuffer() +{ + buffer = getTransform(); +} + +glm::mat4 +BufferedLocation::getTransform() const +{ + return loc.getTransform(); +} diff --git a/gfx/gl/bufferedLocation.h b/gfx/gl/bufferedLocation.h new file mode 100644 index 0000000..cf7afed --- /dev/null +++ b/gfx/gl/bufferedLocation.h @@ -0,0 +1,30 @@ +#pragma once + +#include "instanceVertices.h" +#include "location.hpp" +#include +#include + +class BufferedLocation { +public: + BufferedLocation(InstanceVertices &, glm::vec3 = {}, glm::vec3 = {}); + BufferedLocation(InstanceVertices &, const Location &); + + BufferedLocation & operator=(const Location &); + + operator const Location &() const; + + glm::vec3 position() const; + glm::vec3 rotation() const; + void setPosition(glm::vec3, bool update = true); + void setRotation(glm::vec3, bool update = true); + void setLocation(glm::vec3, glm::vec3); + + glm::mat4 getTransform() const; + +private: + void updateBuffer(); + + Location loc; + InstanceVertices::InstanceProxy buffer; +}; -- cgit v1.2.3 From e751ab465bbbf1365ec6e108c64dafd03ce42f1d Mon Sep 17 00:00:00 2001 From: Dan Goodliffe Date: Sun, 23 Apr 2023 21:46:21 +0100 Subject: Pop and complete instanced shadow support --- gfx/gl/shaders/shadowDynamicPointInst.vs | 13 +++++++++++++ gfx/gl/shadowMapper.cpp | 7 +++++-- gfx/gl/shadowMapper.h | 4 ++-- 3 files changed, 20 insertions(+), 4 deletions(-) create mode 100644 gfx/gl/shaders/shadowDynamicPointInst.vs (limited to 'gfx') diff --git a/gfx/gl/shaders/shadowDynamicPointInst.vs b/gfx/gl/shaders/shadowDynamicPointInst.vs new file mode 100644 index 0000000..eb7313a --- /dev/null +++ b/gfx/gl/shaders/shadowDynamicPointInst.vs @@ -0,0 +1,13 @@ +#version 330 core + +include(`meshIn.glsl') +layout(location = 5) in mat4 model; + +uniform mat4 viewProjection; + +void +main() +{ + gl_Position = viewProjection * model * vec4(position, 1.0); + gl_Position.z = max(gl_Position.z, -1); +} diff --git a/gfx/gl/shadowMapper.cpp b/gfx/gl/shadowMapper.cpp index 7649a54..9f1e420 100644 --- a/gfx/gl/shadowMapper.cpp +++ b/gfx/gl/shadowMapper.cpp @@ -2,6 +2,7 @@ #include "camera.h" #include "collections.hpp" #include "gfx/gl/shaders/vs-shadowDynamicPoint.h" +#include "gfx/gl/shaders/vs-shadowDynamicPointInst.h" #include "gfx/gl/shaders/vs-shadowFixedPoint.h" #include "location.hpp" #include "maths.h" @@ -14,7 +15,8 @@ #include #include -ShadowMapper::ShadowMapper(const glm::ivec2 & s) : size {s} +ShadowMapper::ShadowMapper(const glm::ivec2 & s) : + fixedPoint {shadowFixedPoint_vs}, dynamicPointInst {shadowDynamicPointInst_vs}, size {s} { glBindTexture(GL_TEXTURE_2D, depthMap); glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, size.x, size.y, 0, GL_DEPTH_COMPONENT, GL_FLOAT, nullptr); @@ -144,6 +146,7 @@ ShadowMapper::update(const SceneProvider & scene, const glm::vec3 & dir, const C const auto lightViewProjection = lightProjection * lightView; fixedPoint.setViewProjection(lightViewProjection); dynamicPoint.setViewProjection(lightViewProjection); + dynamicPointInst.setViewProjection(lightViewProjection); const auto & viewport = viewports[bands][out.maps]; glViewport(size.x >> viewport.x, size.y >> viewport.y, size.x >> viewport.z, size.y >> viewport.w); @@ -157,7 +160,7 @@ ShadowMapper::update(const SceneProvider & scene, const glm::vec3 & dir, const C return out; } -ShadowMapper::FixedPoint::FixedPoint() : Program {shadowFixedPoint_vs}, viewProjectionLoc {*this, "viewProjection"} { } +ShadowMapper::FixedPoint::FixedPoint(const Shader & vs) : Program {vs}, viewProjectionLoc {*this, "viewProjection"} { } void ShadowMapper::FixedPoint::setViewProjection(const glm::mat4 & viewProjection) const { diff --git a/gfx/gl/shadowMapper.h b/gfx/gl/shadowMapper.h index a5c2c7b..36371eb 100644 --- a/gfx/gl/shadowMapper.h +++ b/gfx/gl/shadowMapper.h @@ -22,7 +22,7 @@ public: class FixedPoint : public Program { public: - FixedPoint(); + FixedPoint(const Shader & vs); void setViewProjection(const glm::mat4 &) const; void use() const; @@ -40,7 +40,7 @@ public: RequiredUniformLocation viewProjectionLoc; RequiredUniformLocation modelLoc; }; - FixedPoint fixedPoint; + FixedPoint fixedPoint, dynamicPointInst; DynamicPoint dynamicPoint; // NOLINTNEXTLINE(hicpp-explicit-conversions) -- cgit v1.2.3 From ac0e30371f3cbddde990179711997acac507a09c Mon Sep 17 00:00:00 2001 From: Dan Goodliffe Date: Mon, 24 Apr 2023 19:56:07 +0100 Subject: Point shaders can all share the same implementation now in a single place They all just get `model` from a different place --- gfx/gl/shaders/commonPoint.glsl | 13 +++++++++++++ gfx/gl/shaders/dynamicPoint.vs | 14 +------------- gfx/gl/shaders/dynamicPointInst.vs | 16 ++-------------- gfx/gl/shaders/fixedPoint.vs | 13 ++----------- 4 files changed, 18 insertions(+), 38 deletions(-) create mode 100644 gfx/gl/shaders/commonPoint.glsl (limited to 'gfx') diff --git a/gfx/gl/shaders/commonPoint.glsl b/gfx/gl/shaders/commonPoint.glsl new file mode 100644 index 0000000..ecf5fc9 --- /dev/null +++ b/gfx/gl/shaders/commonPoint.glsl @@ -0,0 +1,13 @@ +void +main() +{ + vec4 worldPos = model * vec4(position, 1.0); + + FragPos = worldPos.xyz; + TexCoords = texCoord; + Normal = (model * vec4(normal, 0.0)).xyz; + Colour = colour; + Material = material; + + gl_Position = viewProjection * worldPos; +} diff --git a/gfx/gl/shaders/dynamicPoint.vs b/gfx/gl/shaders/dynamicPoint.vs index e1701ed..ffa8275 100644 --- a/gfx/gl/shaders/dynamicPoint.vs +++ b/gfx/gl/shaders/dynamicPoint.vs @@ -6,16 +6,4 @@ include(`materialInterface.glsl') uniform mat4 viewProjection; uniform mat4 model; -void -main() -{ - vec4 worldPos = model * vec4(position, 1.0); - - FragPos = worldPos.xyz; - TexCoords = texCoord; - Normal = (model * vec4(normal, 0.0)).xyz; - Colour = colour; - Material = material; - - gl_Position = viewProjection * worldPos; -} +include(`commonPoint.glsl') diff --git a/gfx/gl/shaders/dynamicPointInst.vs b/gfx/gl/shaders/dynamicPointInst.vs index 1c66979..e4c8526 100644 --- a/gfx/gl/shaders/dynamicPointInst.vs +++ b/gfx/gl/shaders/dynamicPointInst.vs @@ -1,21 +1,9 @@ #version 330 core include(`meshIn.glsl') -layout(location = 5) in mat4 model; include(`materialInterface.glsl') uniform mat4 viewProjection; +layout(location = 5) in mat4 model; -void -main() -{ - vec4 worldPos = model * vec4(position, 1.0); - - FragPos = worldPos.xyz; - TexCoords = texCoord; - Normal = (model * vec4(normal, 0.0)).xyz; - Colour = colour; - Material = material; - - gl_Position = viewProjection * worldPos; -} +include(`commonPoint.glsl') diff --git a/gfx/gl/shaders/fixedPoint.vs b/gfx/gl/shaders/fixedPoint.vs index 0cc8153..6f517ca 100644 --- a/gfx/gl/shaders/fixedPoint.vs +++ b/gfx/gl/shaders/fixedPoint.vs @@ -4,15 +4,6 @@ include(`meshIn.glsl') include(`materialInterface.glsl') uniform mat4 viewProjection; +const mat4 model = mat4(1); -void -main() -{ - FragPos = position; - TexCoords = texCoord; - Normal = normal; - Colour = colour; - Material = material; - - gl_Position = viewProjection * vec4(position, 1.0); -} +include(`commonPoint.glsl') -- cgit v1.2.3 From 553f738d55e1492f11ee7f150758963344ac79d4 Mon Sep 17 00:00:00 2001 From: Dan Goodliffe Date: Mon, 24 Apr 2023 19:56:07 +0100 Subject: Point shaders (shadows) can all share the same implementation now in a single place They all just get `model` from a different place --- gfx/gl/shaders/commonShadowPoint.glsl | 6 ++++++ gfx/gl/shaders/shadowDynamicPoint.vs | 7 +------ gfx/gl/shaders/shadowDynamicPointInst.vs | 9 ++------- gfx/gl/shaders/shadowFixedPoint.vs | 8 ++------ 4 files changed, 11 insertions(+), 19 deletions(-) create mode 100644 gfx/gl/shaders/commonShadowPoint.glsl (limited to 'gfx') diff --git a/gfx/gl/shaders/commonShadowPoint.glsl b/gfx/gl/shaders/commonShadowPoint.glsl new file mode 100644 index 0000000..c7cbd3e --- /dev/null +++ b/gfx/gl/shaders/commonShadowPoint.glsl @@ -0,0 +1,6 @@ +void +main() +{ + gl_Position = viewProjection * model * vec4(position, 1.0); + gl_Position.z = max(gl_Position.z, -1); +} diff --git a/gfx/gl/shaders/shadowDynamicPoint.vs b/gfx/gl/shaders/shadowDynamicPoint.vs index 531d8de..f3ed533 100644 --- a/gfx/gl/shaders/shadowDynamicPoint.vs +++ b/gfx/gl/shaders/shadowDynamicPoint.vs @@ -5,9 +5,4 @@ include(`meshIn.glsl') uniform mat4 viewProjection; uniform mat4 model; -void -main() -{ - gl_Position = viewProjection * model * vec4(position, 1.0); - gl_Position.z = max(gl_Position.z, -1); -} +include(`commonShadowPoint.glsl') diff --git a/gfx/gl/shaders/shadowDynamicPointInst.vs b/gfx/gl/shaders/shadowDynamicPointInst.vs index eb7313a..1bf74ef 100644 --- a/gfx/gl/shaders/shadowDynamicPointInst.vs +++ b/gfx/gl/shaders/shadowDynamicPointInst.vs @@ -1,13 +1,8 @@ #version 330 core include(`meshIn.glsl') -layout(location = 5) in mat4 model; uniform mat4 viewProjection; +layout(location = 5) in mat4 model; -void -main() -{ - gl_Position = viewProjection * model * vec4(position, 1.0); - gl_Position.z = max(gl_Position.z, -1); -} +include(`commonShadowPoint.glsl') diff --git a/gfx/gl/shaders/shadowFixedPoint.vs b/gfx/gl/shaders/shadowFixedPoint.vs index c9fa19b..8921707 100644 --- a/gfx/gl/shaders/shadowFixedPoint.vs +++ b/gfx/gl/shaders/shadowFixedPoint.vs @@ -3,10 +3,6 @@ include(`meshIn.glsl') uniform mat4 viewProjection; +const mat4 model = mat4(1); -void -main() -{ - gl_Position = viewProjection * vec4(position, 1.0); - gl_Position.z = max(gl_Position.z, -1); -} +include(`commonShadowPoint.glsl') -- cgit v1.2.3 From 4b560f03201f1c2d7c632126cd1e512ed4027072 Mon Sep 17 00:00:00 2001 From: Dan Goodliffe Date: Wed, 26 Apr 2023 01:16:06 +0100 Subject: Add Mesh helper for drawing instances Assumes the supplied VAO was created and configured for the mesh it's passed back to. --- gfx/models/mesh.cpp | 10 ++++++++++ gfx/models/mesh.h | 1 + 2 files changed, 11 insertions(+) (limited to 'gfx') diff --git a/gfx/models/mesh.cpp b/gfx/models/mesh.cpp index 55759cb..3faf252 100644 --- a/gfx/models/mesh.cpp +++ b/gfx/models/mesh.cpp @@ -42,3 +42,13 @@ Mesh::Draw() const glBindVertexArray(0); } + +void +Mesh::DrawInstanced(GLuint vao, GLsizei count) const +{ + glBindVertexArray(vao); + + glDrawElementsInstanced(mode, m_numIndices, GL_UNSIGNED_INT, nullptr, count); + + glBindVertexArray(0); +} diff --git a/gfx/models/mesh.h b/gfx/models/mesh.h index 472b7ed..a2205a1 100644 --- a/gfx/models/mesh.h +++ b/gfx/models/mesh.h @@ -14,6 +14,7 @@ public: Mesh(const std::span vertices, const std::span indices, GLenum = GL_TRIANGLES); void Draw() const; + void DrawInstanced(GLuint vao, GLsizei count) const; VertexArrayObject & configureVAO(VertexArrayObject &&) const; GLsizei count() const; GLenum type() const; -- cgit v1.2.3 From c3af3f3ec6aff3e366acb8825413096581c736c1 Mon Sep 17 00:00:00 2001 From: Dan Goodliffe Date: Wed, 26 Apr 2023 02:04:17 +0100 Subject: Revert "Export mesh size and primitive type" This reverts commit f3343e1cc8a56f039888d4d375a6d5a088a68494. --- gfx/models/mesh.cpp | 12 ------------ gfx/models/mesh.h | 2 -- 2 files changed, 14 deletions(-) (limited to 'gfx') diff --git a/gfx/models/mesh.cpp b/gfx/models/mesh.cpp index 3faf252..52c9275 100644 --- a/gfx/models/mesh.cpp +++ b/gfx/models/mesh.cpp @@ -21,18 +21,6 @@ Mesh::configureVAO(VertexArrayObject && vao) const .addIndices(m_vertexArrayBuffers[1]); } -GLsizei -Mesh::count() const -{ - return m_numIndices; -} - -GLenum -Mesh::type() const -{ - return mode; -} - void Mesh::Draw() const { diff --git a/gfx/models/mesh.h b/gfx/models/mesh.h index a2205a1..538c57a 100644 --- a/gfx/models/mesh.h +++ b/gfx/models/mesh.h @@ -16,8 +16,6 @@ public: void Draw() const; void DrawInstanced(GLuint vao, GLsizei count) const; VertexArrayObject & configureVAO(VertexArrayObject &&) const; - GLsizei count() const; - GLenum type() const; private: glVertexArray m_vertexArrayObject; -- cgit v1.2.3