1
2 #include "camera.h"
3 #include <cmath>
4
5 using namespace std;
6
Camera()7 Camera::Camera()
8 {
9 settings = Settings::Instance();
10 camerasensitivity = settings->getCVarPtr("camerasensitivity");
11
12 // position = btVector3( 0.0f, 0.0f, 0.0f);
13 // rotation = Vector3f( 90.0f, 0.0f, 0.0f);
14 position.setIdentity();
15 // position.setOrigin( btVector3(-5.0f, 10.0f, 0.0f) );
16 // position.getBasis().setEulerZYX( 75.0f*.18f, 0.0f, 0.0f );
17 // position.setOrigin( btVector3(0.0f, 0.0f, 0.0f) );
18 }
19
place()20 void Camera::place()
21 {
22 glViewport(0,0,*settings->winWidth,*settings->winHeight);
23
24 glMatrixMode(GL_PROJECTION);
25 glLoadIdentity();
26
27 float nheight = 0.05f * ((float)(*settings->winHeight) / *settings->winWidth);
28 glFrustum(-0.05f,0.05f,-nheight,nheight,0.1f,10000.0f);
29
30 // glRotatef(rotation.x, 1.0f, 0.0f, 0.0f);
31 // glRotatef(rotation.y, 0.0f, 1.0f, 0.0f);
32 // glRotatef(rotation.z, 0.0f, 0.0f, 1.0f);
33 // glTranslatef(position.getOrigin().getX(), position.getOrigin().getY(), position.getOrigin().getZ());
34
35 btScalar positionr[16];
36 position.inverse().getOpenGLMatrix(positionr);
37 glMultMatrixf(positionr);
38
39 glMatrixMode(GL_MODELVIEW);
40 glLoadIdentity();
41 }
42
follow(btDefaultMotionState * myMotionState) const43 void Camera::follow(btDefaultMotionState* myMotionState) const
44 {
45 glViewport(
46 *settings->winWidth - *settings->winWidth/8,
47 0,
48 *settings->winWidth/8,
49 *settings->winHeight/8
50 );
51 glMatrixMode(GL_PROJECTION);
52 glLoadIdentity();
53
54 float nheight = 0.05f * ((float)(*settings->winHeight) / *settings->winWidth);
55 glFrustum( -0.05f, 0.05f,-nheight,nheight, 0.1f, 10000.0f);
56
57 btScalar position[16];
58 myMotionState->m_graphicsWorldTrans.inverse().getOpenGLMatrix(position);
59 glMultMatrixf(position);
60
61 glMatrixMode(GL_MODELVIEW);
62 glLoadIdentity();
63 }
64
65 // Moving
66
moveForward(const float & factor)67 void Camera::moveForward(const float& factor)
68 {
69 // position.getOrigin() += position.getBasis()[2] * factor;
70 btTransform tr;
71 tr.setIdentity();
72 tr.setOrigin( btVector3(0.0f, 0.0f, -factor * *camerasensitivity) ); // 1.5707f (float)settings->getCVar("energy")/10
73 position *= tr;
74 }
75
moveBackward(const float & factor)76 void Camera::moveBackward(const float& factor)
77 {
78 // position.getOrigin() -= position.getBasis()[2] * factor;
79 btTransform tr;
80 tr.setIdentity();
81 tr.setOrigin( btVector3(0.0f, 0.0f, factor * *camerasensitivity) ); // 1.5707f (float)settings->getCVar("energy")/10
82 position *= tr;
83 }
84
moveRight(const float & factor)85 void Camera::moveRight(const float& factor)
86 {
87 // position.getOrigin() += position.getBasis()[0] * factor;
88 btTransform tr;
89 tr.setIdentity();
90 tr.setOrigin( btVector3(factor * *camerasensitivity, 0.0f, 0.0f) ); // 1.5707f (float)settings->getCVar("energy")/10
91 position *= tr;
92 }
93
moveLeft(const float & factor)94 void Camera::moveLeft(const float& factor)
95 {
96 // position.getOrigin() -= position.getBasis()[0] * factor;
97 btTransform tr;
98 tr.setIdentity();
99 tr.setOrigin( btVector3(-factor * *camerasensitivity, 0.0f, 0.0f) ); // 1.5707f (float)settings->getCVar("energy")/10
100 position *= tr;
101 }
102
moveUp(const float & factor)103 void Camera::moveUp(const float& factor)
104 {
105 // position.getOrigin() -= position.getBasis()[1] * factor;
106 btTransform tr;
107 tr.setIdentity();
108 tr.setOrigin( btVector3(0.0f, factor * *camerasensitivity, 0.0f) ); // 1.5707f (float)settings->getCVar("energy")/10
109 position *= tr;
110 }
111
moveDown(const float & factor)112 void Camera::moveDown(const float& factor)
113 {
114 // position.getOrigin() += position.getBasis()[1] * factor;
115 btTransform tr;
116 tr.setIdentity();
117 tr.setOrigin( btVector3(0.0f, -factor * *camerasensitivity, 0.0f) ); // 1.5707f (float)settings->getCVar("energy")/10
118 position *= tr;
119 }
120
rollLeft(const float & factor)121 void Camera::rollLeft(const float& factor)
122 {
123 // rotation.z += factor * *camerasensitivity;
124 btTransform tr;
125 tr.setIdentity();
126 tr.setOrigin(btVector3(0,0,0));
127 tr.getBasis().setEulerZYX( 0.0f, 0.0f, factor * *camerasensitivity ); // 1.5707f (float)settings->getCVar("energy")/10
128 position.getBasis() *= tr.getBasis();
129 }
130
rollRight(const float & factor)131 void Camera::rollRight(const float& factor)
132 {
133 // rotation.z -= factor * *camerasensitivity;
134 btTransform tr;
135 tr.setIdentity();
136 tr.setOrigin(btVector3(0,0,0));
137 tr.getBasis().setEulerZYX( 0.0f, 0.0f, -factor * *camerasensitivity ); // 1.5707f (float)settings->getCVar("energy")/10
138 position.getBasis() *= tr.getBasis();
139 }
140
141 // Looking
142
lookRight(const float & factor)143 void Camera::lookRight(const float& factor)
144 {
145 // rotation.y += factor * *camerasensitivity;
146 // if ( rotation.y > 360.0f ) rotation.y -= 360.0f;
147 btTransform tr;
148 tr.setIdentity();
149 tr.setOrigin(btVector3(0,0,0));
150 tr.getBasis().setEulerZYX( 0.0f, -factor * *camerasensitivity, 0.0f ); // 1.5707f (float)settings->getCVar("energy")/10
151 position.getBasis() *= tr.getBasis();
152 }
153
lookLeft(const float & factor)154 void Camera::lookLeft(const float& factor)
155 {
156 // rotation.y -= factor * *camerasensitivity;
157 // if ( rotation.y < 0.0f ) rotation.y += 360.0f;
158 btTransform tr;
159 tr.setIdentity();
160 tr.setOrigin(btVector3(0,0,0));
161 tr.getBasis().setEulerZYX( 0.0f, factor * *camerasensitivity, 0.0f ); // 1.5707f (float)settings->getCVar("energy")/10
162 position *= tr;
163 }
164
lookUp(const float & factor)165 void Camera::lookUp(const float& factor)
166 {
167 // rotation.x -= factor * *camerasensitivity;
168 // if ( rotation.x < 0.0f ) rotation.x += 360.0f;
169
170 btTransform tr;
171 tr.setIdentity();
172 tr.setOrigin(btVector3(0,0,0));
173 tr.getBasis().setEulerZYX( factor * *camerasensitivity, 0.0f, 0.0f ); // 1.5707f (float)settings->getCVar("energy")/10
174 position *= tr;
175 }
176
lookDown(const float & factor)177 void Camera::lookDown(const float& factor)
178 {
179 // rotation.x += factor * *camerasensitivity;
180 // if ( rotation.x > 360.0f ) rotation.x -= 360.0f;
181
182 btTransform tr;
183 tr.setIdentity();
184 tr.setOrigin(btVector3(0,0,0));
185 tr.getBasis().setEulerZYX( -factor * *camerasensitivity, 0.0f, 0.0f ); // 1.5707f (float)settings->getCVar("energy")/10
186 position *= tr;
187 }
188
moveTowards(const btVector3 & direction)189 void Camera::moveTowards(const btVector3& direction)
190 {
191 position.setOrigin( position.getOrigin() + direction );
192 }
193
moveAwayFrom(const btVector3 & direction)194 void Camera::moveAwayFrom(const btVector3& direction)
195 {
196 position.setOrigin( position.getOrigin() - direction );
197 }
198
getScreenDirection(const int & x,const int & y)199 btVector3 Camera::getScreenDirection(const int& x, const int& y)
200 {
201 float directionlength = 1000000.f;
202
203 btVector3 forwardRay(
204 -position.getBasis()[0][2],
205 -position.getBasis()[1][2],
206 -position.getBasis()[2][2]);
207 forwardRay *= directionlength;
208
209 btVector3 upRay(
210 position.getBasis()[0][1],
211 position.getBasis()[1][1],
212 position.getBasis()[2][1]);
213
214 btVector3 hor = forwardRay.cross(upRay);
215 hor.normalize();
216 hor *= directionlength;
217
218 upRay = hor.cross(forwardRay);
219 upRay.normalize();
220 upRay *= directionlength * ((float)*settings->winHeight / *settings->winWidth);
221
222 btVector3 rayTo = (position.getOrigin() + forwardRay) - (0.5f * hor) + (0.5f * upRay);
223 rayTo += x * (hor * (1.0f/((float)*settings->winWidth)));
224 rayTo -= y * (upRay * (1.0f/((float)*settings->winHeight)));
225
226 return rayTo;
227 }
228
~Camera()229 Camera::~Camera()
230 {
231 }
232