Rev Author Line No. Line
1 ovan 1 #include "../../device/device.h"
2 #include "../../library/glm/detail/func_geometric.hpp"
3 #include "../../library/glm/gtc/matrix_transform.hpp"
4 #include "../../library/glm/gtc/type_ptr.hpp"
5 #include "camera.h"
6  
6 ovan 7 /**
8  * TODO remove ogl include
9  */
10  
11 #include "GL/gl.h"
12  
1 ovan 13 namespace sleek
14 {
15     namespace scene3d
16     {
17         namespace camera
18         {
19             Camera::Camera(device::Device *dev) noexcept : screen(dev)
20             {
21                 frust = new Frustum();
22  
23                 fars  = 2500.f;
24                 nears = 0.1f;
25                 fovs  =  45.f;
26                 asps  = (f32)screen->getInfo().size.x/(f32)screen->getInfo().size.y;
27                 mode = CVM_PERSPECTIV;
28 //                mode = CVM_ORTHOGRAPHIC;
29                 updatePerspective();
30                 updateProjection();
31             }
32  
33             Camera::~Camera() noexcept
34             {
35                 delete frust;
36             }
37  
38             bool Camera::manage(device::input*) noexcept
39             {
40             }
41  
42             void Camera::setFovValue(const f32 i) noexcept
43             {
44                 fovs = i;
45             }
46  
47             void Camera::setFarValue(const f32 i) noexcept
48             {
49                 fars = i;
50             }
51  
52             void Camera::setNearValue(const f32 i) noexcept
53             {
54                 nears = i;
55             }
56  
57             void Camera::setAspectRatio(const f32 i) noexcept
58             {
59                 asps = i;
60             }
61  
62             void Camera::setViewMode(const CAMERA_VIEW_MODE i) noexcept
63             {
64                 mode = i;
65             }
66  
67             void Camera::setTarget(const math::vector3df &i) noexcept
68             {
69                 tar = i;
70             }
71  
72             void Camera::setPosition(const math::vector3df &i) noexcept
73             {
74                 pos = i;
75             }
76  
77             void Camera::setRotation(const math::vector3df &i) noexcept
78             {
79                 rot = i;
80             }
81  
82             math::aabbox2di Camera::getViewPort() const noexcept
83             {
84                 return viewport;
85             }
86  
87             math::vector3df Camera::getPosition() const noexcept
88             {
89                 return pos;
90             }
91  
92             math::vector3df Camera::getRotation() const noexcept
93             {
94                 return rot;
95             }
96  
97             math::vector3df Camera::getTarget() const noexcept
98             {
99                 return tar;
100             }
101  
102             CAMERA_VIEW_MODE Camera::getViewMode() const noexcept
103             {
104                 return mode;
105             }
106  
107             Frustum* Camera::getViewFrustum() const noexcept
108             {
109                 return frust;
110             }
111  
112             f32 Camera::getAspectRatio() const noexcept
113             {
114                 return asps;
115             }
116  
117             f32 Camera::getNearValue() const noexcept
118             {
119                 return nears;
120             }
121  
122             f32 Camera::getFarValue() const noexcept
123             {
124                 return fars;
125             }
126  
127             f32 Camera::getFovValue() const noexcept
128             {
129                 return fovs;
130             }
131  
132             void Camera::render() noexcept
133             {
134                 glMatrixMode(GL_PROJECTION);
135                 glLoadMatrixf(glm::value_ptr(pers*proj));
136                 glMatrixMode(GL_MODELVIEW);
137                 glLoadIdentity();
138             }
139  
140             void Camera::updatePerspective() noexcept
141             {
142                 pers = {
143                     mode != CVM_ORTHOGRAPHIC ?
144                     glm::perspective<f32>(fovs, asps, nears, fars) :
145                     glm::ortho<f32>(
146                         -screen->getInfo().size.x/2, screen->getInfo().size.x/2,
147                         -screen->getInfo().size.y/2, screen->getInfo().size.y/2,
148                         nears, fars
149                     )
150                 };
151             }
152  
153             void Camera::updateProjection() noexcept
154             {
155                 eye = pos;
156                 cen = tar;
157                 up = normalize(rot);
158                 proj = glm::lookAt(eye, cen, up);
159             }
160         }
161     }
162 }