+#include <math.h>
+
#include <gmath/gmath.h>
+
#include "camera.h"
+#include "state_manager.h"
+
+Camera::Camera() {}
+Camera::~Camera() {}
-Camera::Camera()
+void Camera::use() const
+{
+ state_manager.set_state("st_view_matrix", get_view_matrix());
+}
+
+OrbitCamera::OrbitCamera()
{
phi = theta = distance = 0;
- fov = 0;
- m_projection = Mat4::identity;
}
-Camera::Camera(float phi, float theta, float distance, float fov)
+OrbitCamera::~OrbitCamera() {}
+
+void OrbitCamera::set_orbit_params(float theta, float phi, float distance)
{
this->phi = phi;
this->theta = theta;
this->distance = distance;
+}
+
+Mat4 OrbitCamera::get_view_matrix() const
+{
+ Mat4 view_matrix;
+ view_matrix.translation(-position);
+ view_matrix.rotate_y(theta * (float)M_PI / 180);
+ view_matrix.rotate_x(phi * (float)M_PI / 180);
+ view_matrix.translate(Vec3(0, 0, -distance));
- this->fov = fov;
+ return view_matrix;
}
-Camera::~Camera() {}
\ No newline at end of file
+Mat4 calc_projection_matrix(float fov_deg, float aspect, float n, float f)
+{
+ float fov = fov_deg / 180 * M_PI;
+
+ float tmp;
+ tmp = 1 / tan(fov / 2.0);
+
+ /* near - far clipping planes */
+ float range = n - f;
+
+ Mat4 pmat = Mat4(
+ tmp/aspect, 0, 0, 0,
+ 0, tmp, 0, 0,
+ 0, 0, (f + n) / range, -1,
+ 0, 0, 2 * n * f / range, 0
+ );
+
+ return pmat;
+}
+
+void OrbitCamera::set_position(float x, float y, float z)
+{
+ position.x = x;
+ position.y = y;
+ position.z = z;
+}
\ No newline at end of file