diff options
author | Dan Goodliffe <dan@randomdan.homeip.net> | 2023-04-27 17:55:30 +0100 |
---|---|---|
committer | Dan Goodliffe <dan@randomdan.homeip.net> | 2023-04-27 17:55:30 +0100 |
commit | 4f34ed9c949785784f0006f971b5fd2bb9508553 (patch) | |
tree | 20f6627a2f441212365d05d04160a5a6a97063e7 /gfx | |
parent | Merge remote-tracking branch 'origin/assimp-normals' (diff) | |
parent | Revert "Export mesh size and primitive type" (diff) | |
download | ilt-4f34ed9c949785784f0006f971b5fd2bb9508553.tar.bz2 ilt-4f34ed9c949785784f0006f971b5fd2bb9508553.tar.xz ilt-4f34ed9c949785784f0006f971b5fd2bb9508553.zip |
Merge branch 'instancing-pt2'
Diffstat (limited to 'gfx')
-rw-r--r-- | gfx/gl/bufferedLocation.cpp | 77 | ||||
-rw-r--r-- | gfx/gl/bufferedLocation.h | 30 | ||||
-rw-r--r-- | gfx/gl/instanceVertices.h | 2 | ||||
-rw-r--r-- | gfx/gl/shaders/commonPoint.glsl | 13 | ||||
-rw-r--r-- | gfx/gl/shaders/commonShadowPoint.glsl | 6 | ||||
-rw-r--r-- | gfx/gl/shaders/dynamicPoint.vs | 14 | ||||
-rw-r--r-- | gfx/gl/shaders/dynamicPointInst.vs | 16 | ||||
-rw-r--r-- | gfx/gl/shaders/fixedPoint.vs | 13 | ||||
-rw-r--r-- | gfx/gl/shaders/shadowDynamicPoint.vs | 7 | ||||
-rw-r--r-- | gfx/gl/shaders/shadowDynamicPointInst.vs | 8 | ||||
-rw-r--r-- | gfx/gl/shaders/shadowFixedPoint.vs | 8 | ||||
-rw-r--r-- | gfx/gl/shadowMapper.cpp | 7 | ||||
-rw-r--r-- | gfx/gl/shadowMapper.h | 4 | ||||
-rw-r--r-- | gfx/models/mesh.cpp | 20 | ||||
-rw-r--r-- | gfx/models/mesh.h | 3 |
15 files changed, 161 insertions, 67 deletions
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 <glm/gtx/transform.hpp> + +BufferedLocation::BufferedLocation(InstanceVertices<glm::mat4> & i, glm::vec3 p, glm::vec3 r) : + BufferedLocation {i, Location {p, r}} +{ +} + +BufferedLocation::BufferedLocation(InstanceVertices<glm::mat4> & 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 <glm/mat4x4.hpp> +#include <glm/vec3.hpp> + +class BufferedLocation { +public: + BufferedLocation(InstanceVertices<glm::mat4> &, glm::vec3 = {}, glm::vec3 = {}); + BufferedLocation(InstanceVertices<glm::mat4> &, 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<glm::mat4>::InstanceProxy buffer; +}; 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 <cassert> #include <iterator> #include <span> #include <special_members.hpp> @@ -186,6 +187,7 @@ protected: { if (!data) { data = static_cast<T *>(glMapNamedBuffer(buffer, GL_READ_WRITE)); + assert(data); } } 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/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/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') 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 new file mode 100644 index 0000000..1bf74ef --- /dev/null +++ b/gfx/gl/shaders/shadowDynamicPointInst.vs @@ -0,0 +1,8 @@ +#version 330 core + +include(`meshIn.glsl') + +uniform mat4 viewProjection; +layout(location = 5) in mat4 model; + +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') 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 <tuple> #include <vector> -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) diff --git a/gfx/models/mesh.cpp b/gfx/models/mesh.cpp index 55759cb..52c9275 100644 --- a/gfx/models/mesh.cpp +++ b/gfx/models/mesh.cpp @@ -21,24 +21,22 @@ Mesh::configureVAO(VertexArrayObject && vao) const .addIndices(m_vertexArrayBuffers[1]);
}
-GLsizei
-Mesh::count() const
+void
+Mesh::Draw() const
{
- return m_numIndices;
-}
+ glBindVertexArray(m_vertexArrayObject);
-GLenum
-Mesh::type() const
-{
- return mode;
+ glDrawElements(mode, m_numIndices, GL_UNSIGNED_INT, nullptr);
+
+ glBindVertexArray(0);
}
void
-Mesh::Draw() const
+Mesh::DrawInstanced(GLuint vao, GLsizei count) const
{
- glBindVertexArray(m_vertexArrayObject);
+ glBindVertexArray(vao);
- glDrawElements(mode, m_numIndices, GL_UNSIGNED_INT, nullptr);
+ 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..538c57a 100644 --- a/gfx/models/mesh.h +++ b/gfx/models/mesh.h @@ -14,9 +14,8 @@ public: Mesh(const std::span<const Vertex> vertices, const std::span<const unsigned int> indices, GLenum = GL_TRIANGLES);
void Draw() const;
+ void DrawInstanced(GLuint vao, GLsizei count) const;
VertexArrayObject & configureVAO(VertexArrayObject &&) const;
- GLsizei count() const;
- GLenum type() const;
private:
glVertexArray m_vertexArrayObject;
|