2 #include "Viewport.hpp"
4 #include "../creature/Creature.hpp"
5 #include "../math/const.hpp"
6 #include "../world/Body.hpp"
7 #include "../world/Planet.hpp"
11 #include <glm/gtx/euler_angles.hpp>
12 #include <glm/gtx/rotate_vector.hpp>
13 #include <glm/gtx/transform.hpp>
19 Camera::Camera(const world::Body &r) noexcept
24 , projection(glm::perspective(fov, aspect, near, far))
27 , track_orient(false) {
31 Camera::~Camera() noexcept {
34 Camera &Camera::FOV(float f) noexcept {
40 Camera &Camera::Aspect(float r) noexcept {
46 Camera &Camera::Aspect(float w, float h) noexcept {
51 Camera &Camera::Clip(float n, float f) noexcept {
58 Camera &Camera::Reference(const world::Body &r) noexcept {
63 Camera &Camera::Orbital(const glm::vec3 &pos) noexcept {
65 view = glm::lookAt(pos, glm::vec3(0.0f), glm::vec3(0.0f, 1.0f, 0.0f));
69 Camera &Camera::Radial(const creature::Creature &c, double distance, const glm::dvec3 &angle) {
70 const creature::Situation &s = c.GetSituation();
71 glm::dvec3 pos(s.Position());
73 glm::dvec3 dir(0.0, 0.0, -distance);
75 Reference(s.GetPlanet());
77 up = s.GetPlanet().NormalAt(s.Position());
78 glm::dvec3 ref(normalize(cross(up, glm::dvec3(up.z, up.x, up.y))));
80 glm::dmat3(ref, up, cross(ref, up))
81 * glm::dmat3(glm::eulerAngleYX(-angle.y, -angle.x))
85 dir = glm::dmat3(glm::eulerAngleYX(-angle.y, -angle.x)) * dir;
87 pos += up * (c.Size() * 0.5);
88 up = glm::rotate(up, angle.z, glm::normalize(-dir));
89 view = glm::lookAt(pos - dir, pos, up);
93 glm::mat4 Camera::Model(const world::Body &b) const noexcept {
95 return track_orient ? glm::mat4(1.0f) : glm::mat4(ref->LocalTransform());
96 } else if (b.HasParent() && &b.Parent() == ref) {
98 ? ref->InverseTransform() * b.FromParent() * b.LocalTransform()
99 : b.FromParent() * b.LocalTransform();
100 } else if (ref->HasParent() && &ref->Parent() == &b) {
102 ? ref->InverseTransform() * ref->ToParent() * b.LocalTransform()
103 : ref->ToParent() * b.LocalTransform();
106 ? ref->InverseTransform() * ref->ToUniverse() * b.FromUniverse() * b.LocalTransform()
107 : ref->ToUniverse() * b.FromUniverse() * b.LocalTransform();
111 void Camera::UpdateProjection() noexcept {
112 projection = glm::perspective(fov, aspect, near, far);
116 Viewport::Viewport(int w, int h)
120 glClearColor(0.0, 0.0, 0.0, 1.0);
123 Viewport::~Viewport() {
127 void Viewport::Resize(int w, int h) {
130 glViewport(0, 0, w, h);
133 void Viewport::Clear() {
134 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
137 void Viewport::ClearDepth() {
138 glClear(GL_DEPTH_BUFFER_BIT);