]> git.tdb.fi Git - libs/gl.git/commitdiff
Field of view is an angle too
authorMikko Rasa <tdb@tdb.fi>
Tue, 18 Jun 2013 21:30:18 +0000 (00:30 +0300)
committerMikko Rasa <tdb@tdb.fi>
Tue, 18 Jun 2013 21:30:18 +0000 (00:30 +0300)
source/camera.cpp
source/camera.h
source/environmentmap.cpp
source/matrix.cpp
source/matrix.h
source/stereocombiner.cpp
source/stereocombiner.h
source/stereoview.cpp
source/stereoview.h

index 406135796f3e10c1cc0135cb23a097ee51e32259..a3ab730d98ddd06ed167a8a0bd739b0e56554890 100644 (file)
@@ -6,7 +6,7 @@ namespace Msp {
 namespace GL {
 
 Camera::Camera():
-       fov(M_PI/4),
+       fov(Geometry::Angle<float>::from_turns(0.125)),
        aspect(4.0/3.0),
        clip_near(0.1),
        clip_far(10),
@@ -15,7 +15,7 @@ Camera::Camera():
        up_dir(0, 1, 0)
 { }
 
-void Camera::set_field_of_view(float f)
+void Camera::set_field_of_view(const Geometry::Angle<float> &f)
 {
        fov = f;
 }
@@ -58,7 +58,7 @@ void Camera::look_at(const Vector3 &p)
 
 Vector3 Camera::project(const Vector4 &p) const
 {
-       float frustum_h = tan(fov/2);
+       float frustum_h = tan(fov/2.0f);
        float frustum_w = frustum_h*aspect;
        float z_range = clip_far-clip_near;
 
@@ -75,7 +75,7 @@ Vector3 Camera::project(const Vector3 &p) const
 
 Vector4 Camera::unproject(const Vector4 &p) const
 {
-       float frustum_h = tan(fov/2);
+       float frustum_h = tan(fov/2.0f);
        float frustum_w = frustum_h*aspect;
        float z_range = clip_far-clip_near;
 
index d86725e6cb037bac933c1f2c4c2db3f84b31cdf9..11d42985c7bd4719a2073c4c16919b69b03b9979 100644 (file)
@@ -10,7 +10,7 @@ namespace GL {
 class Camera
 {
 private:
-       float fov;
+       Geometry::Angle<float> fov;
        float aspect;
        // Some compilers have "near" and "far" keywords
        float clip_near;
@@ -23,10 +23,10 @@ private:
 public:
        Camera();
 
-       void set_field_of_view(float);
+       void set_field_of_view(const Geometry::Angle<float> &);
        void set_aspect(float);
        void set_depth_clip(float, float);
-       float get_field_of_view() const { return fov; }
+       const Geometry::Angle<float> &get_field_of_view() const { return fov; }
        float get_aspect() const { return aspect; }
        float get_near_clip() const { return clip_near; }
        float get_far_clip() const { return clip_far; }
index 82e1f1d9ad86774d2c716306aebc5b03b012c369..8a1dfe399acfae7260c79aa33022a2662337f7b9 100644 (file)
@@ -24,7 +24,7 @@ EnvironmentMap::EnvironmentMap(unsigned s, Renderable &r, Renderable &e):
        }
 
        // XXX Make the depth range configurable
-       camera.set_field_of_view(M_PI/2);
+       camera.set_field_of_view(Geometry::Angle<float>::right());
        camera.set_aspect(1);
        camera.set_depth_clip(0.1, 100);
 
index 092d2c62ca149cb73764d8c40ab00d7382a8f874..cac4a4fcd99afe6d2e110c80030aad39dd9352c1 100644 (file)
@@ -140,9 +140,9 @@ Matrix Matrix::frustum_centered(double w, double h, double n, double f)
        return frustum(-w/2, w/2, -h/2, h/2, n, f);
 }
 
-Matrix Matrix::perspective(double h, double a, double n, double f)
+Matrix Matrix::perspective(const Angle &h, double a, double n, double f)
 {
-       double hh = tan(h/2)*n;
+       double hh = tan(h/2.0)*n;
        return frustum(-hh*a, hh*a, -hh, hh, n, f);
 }
 
index 539a613e6966087fbe47cb2002227a41bd7d57b5..ce21b46f1192aab039ddbdd53b391a3e4e21b43c 100644 (file)
@@ -61,7 +61,7 @@ public:
        static Matrix ortho_topleft(double, double);
        static Matrix frustum(double, double, double, double, double, double);
        static Matrix frustum_centered(double, double, double, double);
-       static Matrix perspective(double, double, double, double);
+       static Matrix perspective(const Angle &, double, double, double);
 };
 
 class MatrixStack
index 27cbb8f7edd4edad0fc8dc14a7be666eeb44c78c..be0b01e986a76d99bd1abc25a2bade3b2e45e152 100644 (file)
@@ -6,8 +6,7 @@ namespace GL {
 StereoCombiner::StereoCombiner():
        width_div(1),
        height_div(1),
-       keep_aspect(false),
-       fov(0)
+       keep_aspect(false)
 { }
 
 } // namespace GL
index 10179309c6d0f3d81de53807997a30588a498353..a4b91bfbf9edfa82c477301a5df26e74e0961911 100644 (file)
@@ -1,6 +1,8 @@
 #ifndef MSP_GL_STEREOCOMBINER_H_
 #define MSP_GL_STEREOCOMBINER_H_
 
+#include <msp/geometry/angle.h>
+
 namespace Msp {
 namespace GL {
 
@@ -12,7 +14,7 @@ protected:
        unsigned width_div;
        unsigned height_div;
        bool keep_aspect;
-       float fov;
+       Geometry::Angle<float> fov;
 
        StereoCombiner();
 public:
@@ -21,7 +23,7 @@ public:
        unsigned get_width_divisor() const { return width_div; }
        unsigned get_height_divisor() const { return height_div; }
        bool is_aspect_kept() const { return keep_aspect; }
-       float get_field_of_view() const { return fov; }
+       const Geometry::Angle<float> &get_field_of_view() const { return fov; }
 
        virtual void render(const Texture2D &, const Texture2D &) const = 0;
 };
index 9a4b0e0c49dad965c6100d2847605bd54663bd55..419e95c5bde699a31e4bf9545298141d49cbe973 100644 (file)
@@ -39,7 +39,7 @@ void StereoView::setup_frame() const
 
        EyeParams params;
        params.fov = combiner->get_field_of_view();
-       if(!params.fov)
+       if(params.fov==Geometry::Angle<float>::zero())
                params.fov = base_camera.get_field_of_view();
 
        params.aspect = base_camera.get_aspect();
index 63ee1834db7b27b2c9f67ea202c32bbf616198ba..4dce63b99870b96aa5c52cdb5296fcdba2311344 100644 (file)
@@ -1,6 +1,7 @@
 #ifndef MSP_GL_STEREOVIEW_H_
 #define MSP_GL_STEREOVIEW_H_
 
+#include <msp/geometry/angle.h>
 #include "camera.h"
 #include "framebuffer.h"
 #include "renderable.h"
@@ -26,7 +27,7 @@ private:
 
        struct EyeParams
        {
-               float fov;
+               Geometry::Angle<float> fov;
                float aspect;
                float near_clip;
                float far_clip;