+Camera &Camera::Reference(const world::Body &r) noexcept {
+ ref = &r;
+ return *this;
+}
+
+Camera &Camera::LookAt(const glm::vec3 &pos, const glm::vec3 &tgt, const glm::vec3 &up) noexcept {
+ view = glm::lookAt(pos, tgt, up);
+ return *this;
+}
+
+glm::mat4 Camera::Model(const world::Body &b) const noexcept {
+ if (&b == ref) {
+ return track_orient ? glm::mat4(1.0f) : glm::mat4(ref->LocalTransform());
+ } else if (b.HasParent() && &b.Parent() == ref) {
+ return glm::mat4(track_orient
+ ? ref->InverseTransform() * b.FromParent() * b.LocalTransform()
+ : b.FromParent() * b.LocalTransform());
+ } else if (ref->HasParent() && &ref->Parent() == &b) {
+ return glm::mat4(track_orient
+ ? ref->InverseTransform() * ref->ToParent() * b.LocalTransform()
+ : ref->ToParent() * b.LocalTransform());
+ } else {
+ return glm::mat4(track_orient
+ ? ref->InverseTransform() * ref->ToUniverse() * b.FromUniverse() * b.LocalTransform()
+ : ref->ToUniverse() * b.FromUniverse() * b.LocalTransform());
+ }
+}
+
+glm::mat4 Camera::Universe() const noexcept {
+ return glm::mat4(track_orient
+ ? ref->InverseTransform() * ref->ToUniverse()
+ : ref->ToUniverse());