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
|
#include "StdAfx.h"
#include "mmgr.h"
#include "CameraController.h"
#include "ConfigHandler.h"
CCameraController::CCameraController() : pos(2000, 70, 1800)
{
// switchVal:
// * 1.0 = 0 degree = overview
// * 0.0 = 90 degree = first person
switchVal = configHandler->Get("UseDistToGroundForIcons", 0.95f);
mouseScale = configHandler->Get("FPSMouseScale", 0.01f);
scrollSpeed = 1;
fov = 45.0f;
enabled = true;
}
CCameraController::~CCameraController(void)
{
}
bool CCameraController::SetStateBool(const StateMap& sm,
const std::string& name, bool& var)
{
StateMap::const_iterator it = sm.find(name);
if (it != sm.end()) {
const float value = it->second;
var = (value > 0.0f);
return true;
}
return false;
}
bool CCameraController::SetStateFloat(const StateMap& sm,
const std::string& name, float& var)
{
StateMap::const_iterator it = sm.find(name);
if (it != sm.end()) {
const float value = it->second;
var = value;
return true;
}
return false;
}
// Uses distance to ground for large angles (near 90 degree),
// and distance to unit for flat angles (near 0 degree),
// when comparing the camera direction to the map surface,
// assuming the map is flat.
bool CCameraController::GetUseDistToGroundForIcons() {
const float3& dir = GetDir().UnsafeNormalize();
const float dot = std::min(1.0f, std::max(0.0f, fabs(dir.dot(UpVector))));
if (dot < switchVal) {
// flat angle (typical for first person camera)
return false;
} else {
// steep angle (typical for overhead camera)
return true;
}
}
|