#pragma once #include "location.h" #include #include #include #include class BufferedLocation { public: BufferedLocation(GlobalPosition3D = {}, Rotation3D = {}); BufferedLocation(const Location &); virtual ~BufferedLocation() = default; BufferedLocation & operator=(const Location &); operator const Location &() const; [[nodiscard]] GlobalPosition3D position() const; [[nodiscard]] Rotation3D rotation() const; void setPosition(GlobalPosition3D, bool update = true); void setRotation(Rotation3D, bool update = true); void setLocation(GlobalPosition3D, Rotation3D); [[nodiscard]] glm::mat4 getRotationTransform() const; private: virtual void updateBuffer() const = 0; Location loc; }; class BufferedLocationUpdater : public BufferedLocation { public: template BufferedLocationUpdater(std::function onUpdate, LocationArgs &&... t) : BufferedLocation {std::forward(t)...}, onUpdate {std::move(onUpdate)} { updateBuffer(); } using BufferedLocation::operator=; private: void updateBuffer() const override; std::function onUpdate; };