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