#pragma once #include "location.h" #include #include #include #include class BufferedLocation { public: BufferedLocation(glm::vec3 = {}, glm::vec3 = {}); BufferedLocation(const Location &); virtual ~BufferedLocation() = default; 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: virtual void updateBuffer() = 0; Location loc; }; template class BufferedLocationT : public BufferedLocation { public: template BufferedLocationT(Target &&... target, LocationArgs &&... t) : BufferedLocation {std::forward(t)...}, target {std::forward(target)...} { updateBuffer(); } using BufferedLocation::operator=; private: void updateBuffer() override { std::apply(std::invoke, target) = getTransform(); } std::tuple target; };