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
|