1 #include "GlobalCamera.h"
2 
3 #include "Camera.h"
4 #include "CameraSettings.h"
5 
6 #include "ieventmanager.h"
7 #include "iselection.h"
8 
9 // Constructor
GlobalCameraManager()10 GlobalCameraManager::GlobalCameraManager () :
11 	_camWnd(NULL), _cameraModel(NULL), _cameraShown(true)
12 {
13 }
14 
construct()15 void GlobalCameraManager::construct ()
16 {
17 	GlobalEventManager().addCommand("CenterView", MemberCaller<GlobalCameraManager,
18 			&GlobalCameraManager::resetCameraAngles> (*this));
19 	GlobalEventManager().addToggle("ToggleCubicClip", MemberCaller<CameraSettings, &CameraSettings::toggleFarClip> (
20 			*getCameraSettings()));
21 
22 	// Set the default status of the cubic clip
23 	GlobalEventManager().setToggled("ToggleCubicClip", getCameraSettings()->farClipEnabled());
24 
25 	GlobalEventManager().addCommand("CubicClipZoomIn", MemberCaller<GlobalCameraManager,
26 			&GlobalCameraManager::cubicScaleIn> (*this));
27 	GlobalEventManager().addCommand("CubicClipZoomOut", MemberCaller<GlobalCameraManager,
28 			&GlobalCameraManager::cubicScaleOut> (*this));
29 	GlobalEventManager().addCommand("UpFloor", MemberCaller<GlobalCameraManager, &GlobalCameraManager::changeFloorUp> (
30 			*this));
31 
32 	GlobalEventManager().addCommand("DownFloor", MemberCaller<GlobalCameraManager,
33 			&GlobalCameraManager::changeFloorDown> (*this));
34 
35 	GlobalEventManager().addWidgetToggle("ToggleCamera");
36 	GlobalEventManager().setToggled("ToggleCamera", true);
37 
38 	GlobalEventManager().addCommand("LookThroughSelected", MemberCaller<GlobalCameraManager,
39 			&GlobalCameraManager::lookThroughSelected> (*this));
40 	GlobalEventManager().addCommand("LookThroughCamera", MemberCaller<GlobalCameraManager,
41 			&GlobalCameraManager::lookThroughCamera> (*this));
42 
43 	// Insert movement commands
44 	GlobalEventManager().addCommand("CameraForward", MemberCaller<GlobalCameraManager,
45 			&GlobalCameraManager::moveForwardDiscrete> (*this));
46 	GlobalEventManager().addCommand("CameraBack", MemberCaller<GlobalCameraManager,
47 			&GlobalCameraManager::moveBackDiscrete> (*this));
48 	GlobalEventManager().addCommand("CameraLeft", MemberCaller<GlobalCameraManager,
49 			&GlobalCameraManager::rotateLeftDiscrete> (*this));
50 	GlobalEventManager().addCommand("CameraRight", MemberCaller<GlobalCameraManager,
51 			&GlobalCameraManager::rotateRightDiscrete> (*this));
52 	GlobalEventManager().addCommand("CameraStrafeRight", MemberCaller<GlobalCameraManager,
53 			&GlobalCameraManager::moveRightDiscrete> (*this));
54 	GlobalEventManager().addCommand("CameraStrafeLeft", MemberCaller<GlobalCameraManager,
55 			&GlobalCameraManager::moveLeftDiscrete> (*this));
56 	GlobalEventManager().addCommand("CameraUp",
57 			MemberCaller<GlobalCameraManager, &GlobalCameraManager::moveUpDiscrete> (*this));
58 	GlobalEventManager().addCommand("CameraDown", MemberCaller<GlobalCameraManager,
59 			&GlobalCameraManager::moveDownDiscrete> (*this));
60 	GlobalEventManager().addCommand("CameraAngleUp", MemberCaller<GlobalCameraManager,
61 			&GlobalCameraManager::pitchUpDiscrete> (*this));
62 	GlobalEventManager().addCommand("CameraAngleDown", MemberCaller<GlobalCameraManager,
63 			&GlobalCameraManager::pitchDownDiscrete> (*this));
64 
65 	GlobalEventManager().addKeyEvent("CameraFreeMoveForward", MemberCaller<GlobalCameraManager,
66 			&GlobalCameraManager::freelookMoveForwardKeyUp> (*this), MemberCaller<GlobalCameraManager,
67 			&GlobalCameraManager::freelookMoveForwardKeyDown> (*this));
68 	GlobalEventManager().addKeyEvent("CameraFreeMoveBack", MemberCaller<GlobalCameraManager,
69 			&GlobalCameraManager::freelookMoveBackKeyUp> (*this), MemberCaller<GlobalCameraManager,
70 			&GlobalCameraManager::freelookMoveBackKeyDown> (*this));
71 	GlobalEventManager().addKeyEvent("CameraFreeMoveLeft", MemberCaller<GlobalCameraManager,
72 			&GlobalCameraManager::freelookMoveLeftKeyUp> (*this), MemberCaller<GlobalCameraManager,
73 			&GlobalCameraManager::freelookMoveLeftKeyDown> (*this));
74 	GlobalEventManager().addKeyEvent("CameraFreeMoveRight", MemberCaller<GlobalCameraManager,
75 			&GlobalCameraManager::freelookMoveRightKeyUp> (*this), MemberCaller<GlobalCameraManager,
76 			&GlobalCameraManager::freelookMoveRightKeyDown> (*this));
77 	GlobalEventManager().addKeyEvent("CameraFreeMoveUp", MemberCaller<GlobalCameraManager,
78 			&GlobalCameraManager::freelookMoveUpKeyUp> (*this), MemberCaller<GlobalCameraManager,
79 			&GlobalCameraManager::freelookMoveUpKeyDown> (*this));
80 	GlobalEventManager().addKeyEvent("CameraFreeMoveDown", MemberCaller<GlobalCameraManager,
81 			&GlobalCameraManager::freelookMoveDownKeyUp> (*this), MemberCaller<GlobalCameraManager,
82 			&GlobalCameraManager::freelookMoveDownKeyDown> (*this));
83 
84 	CamWnd::captureStates();
85 }
86 
87 // Creates a new CamWnd class on the heap and returns the according pointer
newCamWnd()88 CamWnd* GlobalCameraManager::newCamWnd ()
89 {
90 	return new CamWnd;
91 }
92 
93 // Frees the specified CamWnd class
deleteCamWnd(CamWnd * camWnd)94 void GlobalCameraManager::deleteCamWnd (CamWnd* camWnd)
95 {
96 	if (camWnd != NULL) {
97 		delete camWnd;
98 	}
99 }
100 
101 // Retrieves the pointer to the current CamWnd
getCamWnd()102 CamWnd* GlobalCameraManager::getCamWnd ()
103 {
104 	return _camWnd;
105 }
106 
setCamWnd(CamWnd * camWnd)107 void GlobalCameraManager::setCamWnd (CamWnd* camWnd)
108 {
109 	_camWnd = camWnd;
110 }
111 
resetCameraAngles()112 void GlobalCameraManager::resetCameraAngles ()
113 {
114 	if (_camWnd != NULL) {
115 		Vector3 angles(0.0f, 0.0f, 0.0f);
116 		angles[CAMERA_YAW] = static_cast<float> (22.5 * floor((_camWnd->getCameraAngles()[CAMERA_YAW] + 11) / 22.5));
117 		_camWnd->setCameraAngles(angles);
118 	}
119 }
120 
lookThroughCamera()121 void GlobalCameraManager::lookThroughCamera ()
122 {
123 	if (_cameraModel != 0) {
124 		_camWnd->addHandlersMove();
125 
126 		_cameraModel->setCameraView(NULL, Callback());
127 		_cameraModel = NULL;
128 
129 		_camWnd->getCamera().updateModelview();
130 		_camWnd->getCamera().updateProjection();
131 		_camWnd->update();
132 	}
133 }
134 
lookThroughSelected()135 void GlobalCameraManager::lookThroughSelected ()
136 {
137 	if (_cameraModel != 0) {
138 		lookThroughCamera();
139 	}
140 
141 	if (GlobalSelectionSystem().countSelected() != 0) {
142 		// Get the instance that was most recently selected
143 		scene::Instance& instance = GlobalSelectionSystem().ultimateSelected();
144 
145 		CameraModel* cameraModel = Instance_getCameraModel(instance);
146 
147 		if (cameraModel != 0) {
148 			_camWnd->removeHandlersMove();
149 			_cameraModel = cameraModel;
150 			_cameraModel->setCameraView(_camWnd->getCameraView(), MemberCaller<GlobalCameraManager,
151 					&GlobalCameraManager::lookThroughCamera> (*this));
152 		}
153 	}
154 }
155 
update()156 void GlobalCameraManager::update ()
157 {
158 	_camWnd->update();
159 }
160 
setParent(CamWnd * camwnd,GtkWindow * parent)161 void GlobalCameraManager::setParent (CamWnd* camwnd, GtkWindow* parent)
162 {
163 	camwnd->setParent(parent);
164 
165 	IEvent* event = GlobalEventManager().findEvent("ToggleCamera");
166 
167 	if (event != NULL) {
168 		event->connectWidget(GTK_WIDGET(camwnd->getParent()));
169 		event->updateWidgets();
170 	} else {
171 		globalErrorStream() << "Could not connect ToggleCamera event\n";
172 	}
173 }
174 
changeFloorUp()175 void GlobalCameraManager::changeFloorUp ()
176 {
177 	// Pass the call to the currently active CamWnd
178 	_camWnd->changeFloor(true);
179 }
180 
changeFloorDown()181 void GlobalCameraManager::changeFloorDown ()
182 {
183 	// Pass the call to the currently active CamWnd
184 	_camWnd->changeFloor(false);
185 }
186 
addCameraObserver(CameraObserver * observer)187 void GlobalCameraManager::addCameraObserver (CameraObserver* observer)
188 {
189 	if (observer != NULL) {
190 		// Add the passed observer to the list
191 		_cameraObservers.push_back(observer);
192 	}
193 }
194 
removeCameraObserver(CameraObserver * observer)195 void GlobalCameraManager::removeCameraObserver (CameraObserver* observer)
196 {
197 	// Cycle through the list of observers and call the moved method
198 	for (CameraObserverList::iterator i = _cameraObservers.begin(); i != _cameraObservers.end(); ++i) {
199 		CameraObserver* registered = *i;
200 
201 		if (registered == observer) {
202 			_cameraObservers.erase(i);
203 			return; // Don't continue the loop, the iterator is obsolete
204 		}
205 	}
206 }
207 
movedNotify()208 void GlobalCameraManager::movedNotify ()
209 {
210 	// Cycle through the list of observers and call the moved method
211 	for (CameraObserverList::iterator i = _cameraObservers.begin(); i != _cameraObservers.end(); ++i) {
212 		CameraObserver* observer = *i;
213 
214 		if (observer != NULL) {
215 			observer->cameraMoved();
216 		}
217 	}
218 }
219 
cubicScaleIn()220 void GlobalCameraManager::cubicScaleIn ()
221 {
222 	_camWnd->cubicScaleIn();
223 }
224 
cubicScaleOut()225 void GlobalCameraManager::cubicScaleOut ()
226 {
227 	_camWnd->cubicScaleOut();
228 }
229 
230 // --------------- Keyboard movement methods ------------------------------------------
231 
freelookMoveForwardKeyUp()232 void GlobalCameraManager::freelookMoveForwardKeyUp ()
233 {
234 	_camWnd->getCamera().clearMovementFlags(MOVE_FORWARD);
235 }
236 
freelookMoveForwardKeyDown()237 void GlobalCameraManager::freelookMoveForwardKeyDown ()
238 {
239 	_camWnd->getCamera().setMovementFlags(MOVE_FORWARD);
240 }
241 
freelookMoveBackKeyUp()242 void GlobalCameraManager::freelookMoveBackKeyUp ()
243 {
244 	_camWnd->getCamera().clearMovementFlags(MOVE_BACK);
245 }
246 
freelookMoveBackKeyDown()247 void GlobalCameraManager::freelookMoveBackKeyDown ()
248 {
249 	_camWnd->getCamera().setMovementFlags(MOVE_BACK);
250 }
251 
freelookMoveLeftKeyUp()252 void GlobalCameraManager::freelookMoveLeftKeyUp ()
253 {
254 	_camWnd->getCamera().clearMovementFlags(MOVE_STRAFELEFT);
255 }
256 
freelookMoveLeftKeyDown()257 void GlobalCameraManager::freelookMoveLeftKeyDown ()
258 {
259 	_camWnd->getCamera().setMovementFlags(MOVE_STRAFELEFT);
260 }
261 
freelookMoveRightKeyUp()262 void GlobalCameraManager::freelookMoveRightKeyUp ()
263 {
264 	_camWnd->getCamera().clearMovementFlags(MOVE_STRAFERIGHT);
265 }
266 
freelookMoveRightKeyDown()267 void GlobalCameraManager::freelookMoveRightKeyDown ()
268 {
269 	_camWnd->getCamera().setMovementFlags(MOVE_STRAFERIGHT);
270 }
271 
freelookMoveUpKeyUp()272 void GlobalCameraManager::freelookMoveUpKeyUp ()
273 {
274 	_camWnd->getCamera().clearMovementFlags(MOVE_UP);
275 }
276 
freelookMoveUpKeyDown()277 void GlobalCameraManager::freelookMoveUpKeyDown ()
278 {
279 	_camWnd->getCamera().setMovementFlags(MOVE_UP);
280 }
281 
freelookMoveDownKeyUp()282 void GlobalCameraManager::freelookMoveDownKeyUp ()
283 {
284 	_camWnd->getCamera().clearMovementFlags(MOVE_DOWN);
285 }
286 
freelookMoveDownKeyDown()287 void GlobalCameraManager::freelookMoveDownKeyDown ()
288 {
289 	_camWnd->getCamera().setMovementFlags(MOVE_DOWN);
290 }
291 
moveForwardDiscrete()292 void GlobalCameraManager::moveForwardDiscrete ()
293 {
294 	_camWnd->getCamera().moveForwardDiscrete();
295 }
296 
moveBackDiscrete()297 void GlobalCameraManager::moveBackDiscrete ()
298 {
299 	_camWnd->getCamera().moveBackDiscrete();
300 }
301 
moveUpDiscrete()302 void GlobalCameraManager::moveUpDiscrete ()
303 {
304 	_camWnd->getCamera().moveUpDiscrete();
305 }
306 
moveDownDiscrete()307 void GlobalCameraManager::moveDownDiscrete ()
308 {
309 	_camWnd->getCamera().moveDownDiscrete();
310 }
311 
moveLeftDiscrete()312 void GlobalCameraManager::moveLeftDiscrete ()
313 {
314 	_camWnd->getCamera().moveLeftDiscrete();
315 }
316 
moveRightDiscrete()317 void GlobalCameraManager::moveRightDiscrete ()
318 {
319 	_camWnd->getCamera().moveRightDiscrete();
320 }
321 
rotateLeftDiscrete()322 void GlobalCameraManager::rotateLeftDiscrete ()
323 {
324 	_camWnd->getCamera().rotateLeftDiscrete();
325 }
326 
rotateRightDiscrete()327 void GlobalCameraManager::rotateRightDiscrete ()
328 {
329 	_camWnd->getCamera().rotateRightDiscrete();
330 }
331 
pitchUpDiscrete()332 void GlobalCameraManager::pitchUpDiscrete ()
333 {
334 	_camWnd->getCamera().pitchUpDiscrete();
335 }
336 
pitchDownDiscrete()337 void GlobalCameraManager::pitchDownDiscrete ()
338 {
339 	_camWnd->getCamera().pitchDownDiscrete();
340 }
341 
destroy()342 void GlobalCameraManager::destroy ()
343 {
344 	CamWnd::releaseStates();
345 }
346 
347 // ------------------------------------------------------------------------------------
348 
349 // The accessor function to the GlobalCameraManager instance
GlobalCamera()350 GlobalCameraManager& GlobalCamera ()
351 {
352 	static GlobalCameraManager _cameraManager;
353 	return _cameraManager;
354 }
355