- Smooth rescaling

- stop following when leading avatar disconnect
- set max far clip for no more crash with really big avatars
This commit is contained in:
atlante45 2013-08-05 14:05:58 -07:00
parent 1876cd4f44
commit 3d853f5b90
6 changed files with 44 additions and 22 deletions

View file

@ -1389,21 +1389,21 @@ void Application::setRenderThirdPerson(bool thirdPerson) {
}
void Application::increaseAvatarSize() {
if (5.0f < _myAvatar.getScale() + 0.05f) {
if (5.0f < 1.05f * _myAvatar.getNewScale()) {
return;
}
_myAvatar.setScale(_myAvatar.getScale() + 0.05f);
_myCamera.setScale(_myAvatar.getScale() + 0.05f);
_myAvatar.setNewScale(1.05f * _myAvatar.getNewScale());
qDebug("Changed scale to %f\n", _myAvatar.getNewScale());
}
void Application::decreaseAvatarSize() {
if (_myAvatar.getScale() - 0.05f < 0.15f) {
if (.95f * _myAvatar.getNewScale() < 0.15f) {
return;
}
_myAvatar.setScale(_myAvatar.getScale() - 0.05f);
_myCamera.setScale(_myAvatar.getScale() - 0.05f);
_myAvatar.setNewScale(.95f * _myAvatar.getNewScale());
qDebug("Changed scale to %f\n", _myAvatar.getNewScale());
}
void Application::setFrustumOffset(bool frustumOffset) {

View file

@ -105,6 +105,12 @@ void Camera::updateFollowMode(float deltaTime) {
}
}
float Camera::getFarClip() {
return (_scale * _farClip < std::numeric_limits<int16_t>::max())
? _scale * _farClip
: std::numeric_limits<int16_t>::max() - 1;
}
void Camera::setModeShiftRate ( float rate ) {
_modeShiftRate = rate;

View file

@ -56,7 +56,7 @@ public:
float getFieldOfView () { return _fieldOfView; }
float getAspectRatio () { return _aspectRatio; }
float getNearClip () { return _scale * _nearClip; }
float getFarClip () { return _scale * _farClip; }
float getFarClip ();
const glm::vec3& getEyeOffsetPosition () { return _eyeOffsetPosition; }
const glm::quat& getEyeOffsetOrientation () { return _eyeOffsetOrientation; }
float getScale () { return _scale; }

View file

@ -505,11 +505,6 @@ void Avatar::simulate(float deltaTime, Transmitter* transmitter) {
glm::quat orientation = getOrientation();
glm::vec3 front = orientation * IDENTITY_FRONT;
glm::vec3 right = orientation * IDENTITY_RIGHT;
//
if (!isMyAvatar() && _scale != _newScale) {
setScale(_newScale);
}
// Update movement timers
if (isMyAvatar()) {
@ -523,18 +518,30 @@ void Avatar::simulate(float deltaTime, Transmitter* transmitter) {
_elapsedTimeMoving += deltaTime;
}
}
if (_leadingAvatar && !_leadingAvatar->getOwningNode()->isAlive()) {
follow(NULL);
}
// Ajust, scale, thrust and lookAt position when following an other avatar
if (isMyAvatar() && _leadingAvatar && _newScale != _leadingAvatar->getScale()) {
_newScale = _leadingAvatar->getScale();
}
if (isMyAvatar() && _scale != _newScale) {
float scale = 0.95f * _scale + 0.05f * _newScale;
setScale(scale);
Application::getInstance()->getCamera()->setScale(scale);
}
if (!isMyAvatar() && _scale != _newScale) {
setScale(_newScale);
}
// Collect thrust forces from keyboard and devices
if (isMyAvatar()) {
updateThrust(deltaTime, transmitter);
}
// Ajust, scale, thrust and lookAt position when following an other avatar
if (isMyAvatar() && _leadingAvatar && _scale != _leadingAvatar->getScale()) {
float scale = 0.95f * _scale + 0.05f * _leadingAvatar->getScale();
setScale(scale);
Application::getInstance()->getCamera()->setScale(scale);
}
// copy velocity so we can use it later for acceleration
glm::vec3 oldVelocity = getVelocity();
@ -1446,7 +1453,7 @@ void Avatar::loadData(QSettings* settings) {
_leanScale = loadSetting(settings, "leanScale", 0.5f);
_scale = loadSetting(settings, "scale", 1.0f);
_newScale = loadSetting(settings, "scale", 1.0f);
setScale(_scale);
Application::getInstance()->getCamera()->setScale(_scale);
@ -1472,7 +1479,7 @@ void Avatar::saveData(QSettings* set) {
set->setValue("voxelURL", _voxels.getVoxelURL());
set->setValue("leanScale", _leanScale);
set->setValue("scale", _scale);
set->setValue("scale", _newScale);
set->endGroup();
}
@ -1525,9 +1532,16 @@ void Avatar::renderJointConnectingCone(glm::vec3 position1, glm::vec3 position2,
glEnd();
}
void Avatar::setNewScale(const float scale) {
_newScale = scale;
}
void Avatar::setScale(const float scale) {
_scale = scale;
_newScale = _scale;
if (_newScale * .98 < _scale && _scale < _newScale * 1.02) {
_scale = _newScale;
}
_skeleton.setScale(_scale);

View file

@ -135,6 +135,7 @@ public:
void setMouseRay (const glm::vec3 &origin, const glm::vec3 &direction);
void setOrientation (const glm::quat& orientation);
void setScale (const float scale);
void setNewScale (const float scale);
//getters
bool isInitialized () const { return _initialized;}
@ -149,6 +150,7 @@ public:
glm::vec3 getBodyUpDirection () const { return getOrientation() * IDENTITY_UP; }
glm::vec3 getBodyFrontDirection () const { return getOrientation() * IDENTITY_FRONT; }
float getScale () const { return _scale;}
float getNewScale () const { return _newScale;}
const glm::vec3& getVelocity () const { return _velocity;}
float getSpeed () const { return _speed;}
float getHeight () const { return _height;}