Simplifiy API for camera mode transitions

Specify the "period" for the transition rather than the "rate".
This commit is contained in:
Andrew Meadows 2014-02-17 10:27:33 -08:00
parent 91740f89f8
commit 6ce028bbab
3 changed files with 19 additions and 23 deletions

View file

@ -1799,7 +1799,7 @@ void Application::init() {
// TODO: move _myAvatar out of Application. Move relevant code to MyAvataar or AvatarManager // TODO: move _myAvatar out of Application. Move relevant code to MyAvataar or AvatarManager
_avatarManager.init(); _avatarManager.init();
_myCamera.setMode(CAMERA_MODE_FIRST_PERSON); _myCamera.setMode(CAMERA_MODE_FIRST_PERSON);
_myCamera.setModeShiftRate(1.0f); _myCamera.setModeShiftPeriod(1.0f);
_mirrorCamera.setMode(CAMERA_MODE_MIRROR); _mirrorCamera.setMode(CAMERA_MODE_MIRROR);
_mirrorCamera.setAspectRatio((float)MIRROR_VIEW_WIDTH / (float)MIRROR_VIEW_HEIGHT); _mirrorCamera.setAspectRatio((float)MIRROR_VIEW_WIDTH / (float)MIRROR_VIEW_HEIGHT);
@ -2168,17 +2168,17 @@ void Application::cameraMenuChanged() {
if (Menu::getInstance()->isOptionChecked(MenuOption::FullscreenMirror)) { if (Menu::getInstance()->isOptionChecked(MenuOption::FullscreenMirror)) {
if (_myCamera.getMode() != CAMERA_MODE_MIRROR) { if (_myCamera.getMode() != CAMERA_MODE_MIRROR) {
_myCamera.setMode(CAMERA_MODE_MIRROR); _myCamera.setMode(CAMERA_MODE_MIRROR);
_myCamera.setModeShiftRate(100.0f); _myCamera.setModeShiftPeriod(0.00f);
} }
} else if (Menu::getInstance()->isOptionChecked(MenuOption::FirstPerson)) { } else if (Menu::getInstance()->isOptionChecked(MenuOption::FirstPerson)) {
if (_myCamera.getMode() != CAMERA_MODE_FIRST_PERSON) { if (_myCamera.getMode() != CAMERA_MODE_FIRST_PERSON) {
_myCamera.setMode(CAMERA_MODE_FIRST_PERSON); _myCamera.setMode(CAMERA_MODE_FIRST_PERSON);
_myCamera.setModeShiftRate(1.0f); _myCamera.setModeShiftPeriod(1.0f);
} }
} else { } else {
if (_myCamera.getMode() != CAMERA_MODE_THIRD_PERSON) { if (_myCamera.getMode() != CAMERA_MODE_THIRD_PERSON) {
_myCamera.setMode(CAMERA_MODE_THIRD_PERSON); _myCamera.setMode(CAMERA_MODE_THIRD_PERSON);
_myCamera.setModeShiftRate(1.0f); _myCamera.setModeShiftPeriod(1.0f);
} }
} }
} }

View file

@ -15,8 +15,6 @@
#include "Menu.h" #include "Menu.h"
#include "Util.h" #include "Util.h"
const float CAMERA_MINIMUM_MODE_SHIFT_RATE = 0.5f;
const float CAMERA_FIRST_PERSON_MODE_UP_SHIFT = 0.0f; const float CAMERA_FIRST_PERSON_MODE_UP_SHIFT = 0.0f;
const float CAMERA_FIRST_PERSON_MODE_DISTANCE = 0.0f; const float CAMERA_FIRST_PERSON_MODE_DISTANCE = 0.0f;
const float CAMERA_FIRST_PERSON_MODE_TIGHTNESS = 100.0f; const float CAMERA_FIRST_PERSON_MODE_TIGHTNESS = 100.0f;
@ -57,7 +55,7 @@ Camera::Camera() :
_newTightness(0.0f), _newTightness(0.0f),
_modeShift(1.0f), _modeShift(1.0f),
_linearModeShift(0.0f), _linearModeShift(0.0f),
_modeShiftRate(1.0f), _modeShiftPeriod(1.0f),
_scale(1.0f), _scale(1.0f),
_lookingAt(0.0f, 0.0f, 0.0f), _lookingAt(0.0f, 0.0f, 0.0f),
_isKeepLookingAt(false) _isKeepLookingAt(false)
@ -75,18 +73,18 @@ void Camera::update(float deltaTime) {
// use iterative forces to keep the camera at the desired position and angle // use iterative forces to keep the camera at the desired position and angle
void Camera::updateFollowMode(float deltaTime) { void Camera::updateFollowMode(float deltaTime) {
if (_linearModeShift < 1.0f) { if (_linearModeShift < 1.0f) {
_linearModeShift += _modeShiftRate * deltaTime; _linearModeShift += deltaTime / _modeShiftPeriod;
_modeShift = ONE_HALF - ONE_HALF * cosf(_linearModeShift * PIE );
_upShift = _previousUpShift * (1.0f - _modeShift) + _newUpShift * _modeShift;
_distance = _previousDistance * (1.0f - _modeShift) + _newDistance * _modeShift;
_tightness = _previousTightness * (1.0f - _modeShift) + _newTightness * _modeShift;
if (_needsToInitialize || _linearModeShift > 1.0f) { if (_needsToInitialize || _linearModeShift > 1.0f) {
_linearModeShift = 1.0f; _linearModeShift = 1.0f;
_modeShift = 1.0f; _modeShift = 1.0f;
_upShift = _newUpShift; _upShift = _newUpShift;
_distance = _newDistance; _distance = _newDistance;
_tightness = _newTightness; _tightness = _newTightness;
} else {
_modeShift = ONE_HALF - ONE_HALF * cosf(_linearModeShift * PIE );
_upShift = _previousUpShift * (1.0f - _modeShift) + _newUpShift * _modeShift;
_distance = _previousDistance * (1.0f - _modeShift) + _newDistance * _modeShift;
_tightness = _previousTightness * (1.0f - _modeShift) + _newTightness * _modeShift;
} }
} }
@ -121,13 +119,10 @@ float Camera::getFarClip() const {
: std::numeric_limits<int16_t>::max() - 1; : std::numeric_limits<int16_t>::max() - 1;
} }
void Camera::setModeShiftRate ( float rate ) { void Camera::setModeShiftPeriod (float period) {
const float MIN_PERIOD = 0.001f;
_modeShiftRate = rate; const float MAX_PERIOD = 3.0f;
_modeShiftPeriod = glm::clamp(period, MIN_PERIOD, MAX_PERIOD);
if (_modeShiftRate < CAMERA_MINIMUM_MODE_SHIFT_RATE ) {
_modeShiftRate = CAMERA_MINIMUM_MODE_SHIFT_RATE;
}
} }
void Camera::setMode(CameraMode m) { void Camera::setMode(CameraMode m) {
@ -307,7 +302,8 @@ void CameraScriptableObject::setMode(const QString& mode) {
} }
if (currentMode != targetMode) { if (currentMode != targetMode) {
_camera->setMode(targetMode); _camera->setMode(targetMode);
_camera->setModeShiftRate(10.0f); const float DEFAULT_MODE_SHIFT_PERIOD = 0.5f; // half second
_camera->setModeShiftPeriod(DEFAULT_MODE_SHIFT_PERIOD);
} }
} }

View file

@ -43,7 +43,7 @@ public:
void setTargetRotation(const glm::quat& rotation); void setTargetRotation(const glm::quat& rotation);
void setMode(CameraMode m); void setMode(CameraMode m);
void setModeShiftRate(float r); void setModeShiftPeriod(float r);
void setFieldOfView(float f); void setFieldOfView(float f);
void setAspectRatio(float a); void setAspectRatio(float a);
void setNearClip(float n); void setNearClip(float n);
@ -109,7 +109,7 @@ private:
float _newTightness; float _newTightness;
float _modeShift; float _modeShift;
float _linearModeShift; float _linearModeShift;
float _modeShiftRate; float _modeShiftPeriod;
float _scale; float _scale;
glm::vec3 _lookingAt; glm::vec3 _lookingAt;