File: CameraHandler.h

package info (click to toggle)
spring 106.0%2Bdfsg-1
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 55,260 kB
  • sloc: cpp: 543,946; ansic: 44,800; python: 12,575; java: 12,201; awk: 5,889; sh: 1,796; asm: 1,546; xml: 655; perl: 405; php: 211; objc: 194; makefile: 76; sed: 2
file content (138 lines) | stat: -rw-r--r-- 3,601 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
/* This file is part of the Spring engine (GPL v2 or later), see LICENSE.html */

#ifndef _CAMERA_HANDLER_H
#define _CAMERA_HANDLER_H

#include <array>
#include <vector>
#include <string>

#include "Camera/CameraController.h"
#include "System/UnorderedMap.hpp"
#include "Console.h"

class CCamera;
class CPlayer;

class CCameraHandler : public CommandReceiver
{
public:
	typedef CCameraController::StateMap ViewData;

	enum {
		CAMERA_MODE_FIRSTPERSON = 0,
		CAMERA_MODE_OVERHEAD    = 1,
		CAMERA_MODE_SPRING      = 2,
		CAMERA_MODE_ROTOVERHEAD = 3,
		CAMERA_MODE_FREE        = 4,
		CAMERA_MODE_OVERVIEW    = 5,
		CAMERA_MODE_DUMMY       = 6,
		CAMERA_MODE_LAST        = 7,
	};

public:
	CCameraHandler();
	~CCameraHandler();


	static void InitStatic();
	static void KillStatic();
	static void SetActiveCamera(unsigned int camType);

	static CCamera* GetCamera(unsigned int camType);
	static CCamera* GetActiveCamera();

	// sets the current active camera, returns the previous
	static CCamera* GetSetActiveCamera(unsigned int camType) {
		CCamera* cam = GetActiveCamera(); SetActiveCamera(camType); return cam;
	}


	void Init();
	void Kill();
	void InitControllers();
	void KillControllers();
	void UpdateController(CPlayer* player, bool fpsMode, bool fsEdgeMove, bool wnEdgeMove);

	void SetCameraMode(unsigned int mode);
	void SetCameraMode(const std::string& mode);
	void PushMode();
	void PopMode();

	void SetTransitionParams(float factor, float expon) {
		camTransState.timeFactor   = factor;
		camTransState.timeExponent =  expon;
  }
	void CameraTransition(float nsecs);
	void UpdateTransition();

	void ToggleState();
	void ToggleOverviewCamera();

	void PushAction(const Action&) override;

	void SaveView(const std::string& name);
	bool LoadView(const std::string& name);

	int GetModeIndex(const std::string& modeName) const;
	unsigned int GetCurrentControllerNum() const { return currCamCtrlNum; }

	float GetTransitionTimeFactor() const { return camTransState.timeFactor; }
	float GetTransitionTimeExponent() const { return camTransState.timeExponent; }


	/**
	 * @brief write current camera settings in a vector
	 */
	void GetState(CCameraController::StateMap& sm) const;

	/**
	 * @brief restore a camera state
	 * @param sm the state to set
	 * @return false when vector has wrong size or garbage data, true when aplied without errors
	 */
	bool SetState(const CCameraController::StateMap& sm);


	const CCameraController& GetCurrentController() const { return *(camControllers[currCamCtrlNum]); }
	      CCameraController& GetCurrentController()       { return *(camControllers[currCamCtrlNum]); }

	const std::array<CCameraController*, CAMERA_MODE_LAST>& GetControllers() const { return camControllers; }

private:
	void UpdateController(CCameraController& camCon, bool keyMove, bool wheelMove, bool edgeMove);
	bool LoadViewData(const ViewData& vd);

private:
	unsigned int currCamCtrlNum = CAMERA_MODE_DUMMY;

	struct CamTransitionState {
		float3 startPos;
		float3 tweenPos;
		float3 startRot;
		float3 tweenRot;

		float startFOV = 0.0f;
		float tweenFOV = 0.0f;

		float timeStart = 0.0f;
		float timeEnd = 0.0f;
		// configurable parameters
		float timeFactor = 0.0f;
		float timeExponent = 0.0f;
	};

	CamTransitionState camTransState;

	// last controller is a dummy
	std::array<CCameraController*, CAMERA_MODE_LAST> camControllers;
	std::vector<unsigned int> controllerStack;

	spring::unordered_map<std::string, ViewData> viewDataMap;
	spring::unordered_map<std::string, unsigned int> nameModeMap;
};

extern CCameraHandler* camHandler;

#endif // _CAMERA_HANDLER_H