1/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */
2/* If you are missing that file, acquire a complete release at teeworlds.com. */
3#ifndef GAME_CLIENT_COMPONENTS_CAMERA_H
4#define GAME_CLIENT_COMPONENTS_CAMERA_H
5#include <base/bezier.h>
6#include <base/vmath.h>
7
8#include <engine/client.h>
9#include <engine/console.h>
10
11#include <game/client/component.h>
12
13class CCamera : public CComponent
14{
15 friend class CMenuBackground;
16
17public:
18 enum
19 {
20 CAMTYPE_UNDEFINED = -1,
21 CAMTYPE_SPEC,
22 CAMTYPE_PLAYER,
23 };
24
25private:
26 int m_CamType;
27 vec2 m_aLastPos[NUM_DUMMIES];
28 vec2 m_PrevCenter;
29
30 int m_PrevSpecId;
31 bool m_WasSpectating;
32
33 bool m_CameraSmoothing;
34 vec2 m_CameraSmoothingCenter;
35 vec2 m_CameraSmoothingTarget;
36 CCubicBezier m_CameraSmoothingBezierX;
37 CCubicBezier m_CameraSmoothingBezierY;
38 float m_CameraSmoothingStart;
39 float m_CameraSmoothingEnd;
40 vec2 m_CenterBeforeSmoothing;
41
42 float CameraSmoothingProgress(float CurrentTime) const;
43
44 CCubicBezier m_ZoomSmoothing;
45 float m_ZoomSmoothingStart;
46 float m_ZoomSmoothingEnd;
47
48 void ScaleZoom(float Factor);
49 void ChangeZoom(float Target, int Smoothness, bool IsUser);
50 float ZoomProgress(float CurrentTime) const;
51
52 float MinZoomLevel();
53 float MaxZoomLevel();
54
55 vec2 m_LastTargetPos;
56 float m_DyncamSmoothingSpeedBias;
57 bool m_CanUseCameraInfo;
58 bool m_UsingAutoSpecCamera;
59
60 char m_aAutoSpecCameraTooltip[512];
61
62public:
63 static constexpr float ZOOM_STEP = 0.866025f;
64
65 /**
66 * Convert zoom steps to zoom value
67 *
68 * @param Steps - Zoom steps, 0.0f converts to default zoom (returns 1.0f)
69 * @return converted zoom value
70 **/
71 static float ZoomStepsToValue(float Steps) { return std::pow(x: CCamera::ZOOM_STEP, y: Steps); }
72
73 vec2 m_Center;
74 bool m_ZoomSet;
75 bool m_Zooming;
76 float m_Zoom;
77 float m_ZoomSmoothingTarget;
78
79 bool m_AutoSpecCameraZooming;
80 bool m_AutoSpecCamera;
81 float m_UserZoomTarget;
82
83 vec2 m_DyncamTargetCameraOffset;
84 vec2 m_aDyncamCurrentCameraOffset[NUM_DUMMIES];
85
86 CCamera();
87 int Sizeof() const override { return sizeof(*this); }
88 void OnRender() override;
89
90 // DDRace
91
92 void OnConsoleInit() override;
93 void OnReset() override;
94
95 void SetView(ivec2 Pos, bool Relative = false);
96 void GotoSwitch(int Number, int Offset = -1);
97 void GotoTele(int Number, int Offset = -1);
98
99 void SetZoom(float Target, int Smoothness, bool IsUser);
100 bool ZoomAllowed() const;
101
102 int Deadzone() const;
103 int FollowFactor() const;
104 int CamType() const { return m_CamType; }
105
106 void UpdateCamera();
107 void ResetAutoSpecCamera();
108 bool SpectatingPlayer() const { return m_CanUseCameraInfo; }
109 bool CanUseAutoSpecCamera() const;
110 void ToggleAutoSpecCamera();
111 void UpdateAutoSpecCameraTooltip();
112
113 const char *AutoSpecCameraTooltip() { return m_aAutoSpecCameraTooltip; }
114
115private:
116 static void ConZoomPlus(IConsole::IResult *pResult, void *pUserData);
117 static void ConZoomMinus(IConsole::IResult *pResult, void *pUserData);
118 static void ConZoom(IConsole::IResult *pResult, void *pUserData);
119 static void ConSetView(IConsole::IResult *pResult, void *pUserData);
120 static void ConSetViewRelative(IConsole::IResult *pResult, void *pUserData);
121 static void ConGotoSwitch(IConsole::IResult *pResult, void *pUserData);
122 static void ConGotoTele(IConsole::IResult *pResult, void *pUserData);
123
124 bool m_ForceFreeview;
125 vec2 m_ForceFreeviewPos;
126 int m_GotoSwitchOffset;
127 int m_GotoTeleOffset;
128 ivec2 m_GotoSwitchLastPos;
129 ivec2 m_GotoTeleLastPos;
130 int m_GotoTeleLastNumber = -1;
131};
132
133#endif
134