summaryrefslogtreecommitdiff
path: root/gfx/gl/bufferedLocation.cpp
diff options
context:
space:
mode:
authorDan Goodliffe <dan@randomdan.homeip.net>2023-04-23 21:26:32 +0100
committerDan Goodliffe <dan@randomdan.homeip.net>2023-04-23 21:26:32 +0100
commit5e022ee1ea94812b3446cac76e4f9ff9f3856d8c (patch)
treee1041049d625bc3910117bae08fef2972fd067f4 /gfx/gl/bufferedLocation.cpp
parentUse Location::getTransform in Plant instead of duplicating (diff)
downloadilt-5e022ee1ea94812b3446cac76e4f9ff9f3856d8c.tar.bz2
ilt-5e022ee1ea94812b3446cac76e4f9ff9f3856d8c.tar.xz
ilt-5e022ee1ea94812b3446cac76e4f9ff9f3856d8c.zip
Add BufferedLocation
Wraps Location, storing a pre-computed mat4 transformation of the position/rotation in a VBO handled by InstanceVertices.
Diffstat (limited to 'gfx/gl/bufferedLocation.cpp')
-rw-r--r--gfx/gl/bufferedLocation.cpp77
1 files changed, 77 insertions, 0 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();
+}