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