1 /* This file is part of the Spring engine (GPL v2 or later), see LICENSE.html */
2 
3 #ifndef _CAMERA_HANDLER_H
4 #define _CAMERA_HANDLER_H
5 
6 #include <vector>
7 #include <map>
8 #include <string>
9 #include <stack>
10 
11 #include "Console.h"
12 #include "Camera/CameraController.h"
13 #include "Game/Camera.h"
14 
15 
16 class CCameraHandler : public CommandReceiver
17 {
18 public:
19 	typedef CCameraController::StateMap ViewData;
20 
21 public:
22 	CCameraHandler();
23 	~CCameraHandler();
24 
25 	void UpdateCam();
26 	void SetCameraMode(unsigned int mode);
27 	void SetCameraMode(const std::string& mode);
28 	void PushMode();
29 	void PopMode();
30 	void CameraTransition(float nsecs);
31 
32 	void ToggleState();
33 	void ToggleOverviewCamera();
34 
35 	void SaveView(const std::string& name);
36 	bool LoadView(const std::string& name);
37 
38 	int GetModeIndex(const std::string& modeName) const;
39 
40 	/**
41 	 * @brief write current camera settings in a vector
42 	 */
43 	void GetState(CCameraController::StateMap& sm) const;
44 
45 	/**
46 	 * @brief restore a camera state
47 	 * @param sm the state to set
48 	 * @return false when vector has wrong size or garbage data, true when aplied without errors
49 	 */
50 	bool SetState(const CCameraController::StateMap& sm);
51 
GetCurrentController()52 	CCameraController& GetCurrentController() { return *currCamCtrl; }
GetCurrentControllerNum()53 	int GetCurrentControllerNum() const { return currCamCtrlNum; }
54 	const std::string GetCurrentControllerName() const;
GetAvailableControllers()55 	const std::vector<CCameraController*>& GetAvailableControllers() const { return camControllers; }
56 
57 	virtual void PushAction(const Action&);
58 
59 	enum {
60 		CAMERA_MODE_FIRSTPERSON = 0,
61 		CAMERA_MODE_OVERHEAD    = 1,
62 		CAMERA_MODE_TOTALWAR    = 2,
63 		CAMERA_MODE_ROTOVERHEAD = 3,
64 		CAMERA_MODE_FREE        = 4,
65 		CAMERA_MODE_SMOOTH      = 5,
66 		CAMERA_MODE_ORBIT       = 6,
67 		CAMERA_MODE_OVERVIEW    = 7,
68 		CAMERA_MODE_LAST        = 8,
69 	};
70 
71 private:
72 	std::vector<CCameraController*> camControllers;
73 	std::stack<unsigned int> controllerStack;
74 	CCameraController* currCamCtrl;
75 	unsigned int currCamCtrlNum;
76 
77 	struct {
78 		float3 pos;
79 		float3 dir;
80 		float  fov;
81 	} startCam;
82 
83 	float cameraTimeStart;
84 	float cameraTimeEnd;
85 	float cameraTimeFactor;
86 	float cameraTimeExponent;
87 
88 	bool LoadViewData(const ViewData& vd);
89 	std::map<std::string, ViewData> views;
90 	std::map<std::string, unsigned int> nameMap;
91 };
92 
93 extern CCameraHandler* camHandler;
94 
95 #endif // _CAMERA_HANDLER_H
96