From 4272f4da5721487e1c9863bd6e1edf62555706b2 Mon Sep 17 00:00:00 2001 From: Philip Rosedale Date: Wed, 17 Jul 2013 14:57:29 -0700 Subject: [PATCH] Tiny sliding with gravity removed --- interface/src/Avatar.cpp | 15 ++++++++------- interface/src/Avatar.h | 5 ++++- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/interface/src/Avatar.cpp b/interface/src/Avatar.cpp index e92394af22..950108a65d 100755 --- a/interface/src/Avatar.cpp +++ b/interface/src/Avatar.cpp @@ -98,6 +98,7 @@ Avatar::Avatar(Node* owningNode) : _elapsedTimeMoving(0.0f), _elapsedTimeStopped(0.0f), _elapsedTimeSinceCollision(0.0f), + _lastCollisionPosition(0, 0, 0), _speedBrakes(false), _isThrustOn(false), _voxels(this) @@ -541,11 +542,12 @@ void Avatar::simulate(float deltaTime, Transmitter* transmitter) { // For gravity, always move the avatar by the amount driven by gravity, so that the collision // routines will detect it and collide every frame when pulled by gravity to a surface // - - _velocity += _scale * _gravity * (GRAVITY_EARTH * deltaTime); - _position += _scale * _gravity * (GRAVITY_EARTH * deltaTime) * deltaTime; + const float MIN_DISTANCE_AFTER_COLLISION_FOR_GRAVITY = 0.01f; + if (glm::length(_position - _lastCollisionPosition) > MIN_DISTANCE_AFTER_COLLISION_FOR_GRAVITY) { + _velocity += _scale * _gravity * (GRAVITY_EARTH * deltaTime); + _position += _scale * _gravity * (GRAVITY_EARTH * deltaTime) * deltaTime; + } } - updateCollisionWithEnvironment(deltaTime); updateCollisionWithVoxels(deltaTime); updateAvatarCollisions(deltaTime); @@ -890,11 +892,9 @@ void Avatar::updateCollisionWithEnvironment(float deltaTime) { if (velocityTowardCollision > VISIBLE_GROUND_COLLISION_VELOCITY) { Application::getInstance()->setGroundPlaneImpact(1.0f); } + _lastCollisionPosition = _position; updateCollisionSound(penetration, deltaTime, ENVIRONMENT_COLLISION_FREQUENCY); - applyHardCollision(penetration, ENVIRONMENT_SURFACE_ELASTICITY, ENVIRONMENT_SURFACE_DAMPING); - - } } @@ -908,6 +908,7 @@ void Avatar::updateCollisionWithVoxels(float deltaTime) { if (Application::getInstance()->getVoxels()->findCapsulePenetration( _position - glm::vec3(0.0f, _pelvisFloatingHeight - radius, 0.0f), _position + glm::vec3(0.0f, _height - _pelvisFloatingHeight - radius, 0.0f), radius, penetration)) { + _lastCollisionPosition = _position; updateCollisionSound(penetration, deltaTime, VOXEL_COLLISION_FREQUENCY); applyHardCollision(penetration, VOXEL_ELASTICITY, VOXEL_DAMPING); } diff --git a/interface/src/Avatar.h b/interface/src/Avatar.h index 61207a2d8b..75e0ab2f9b 100755 --- a/interface/src/Avatar.h +++ b/interface/src/Avatar.h @@ -118,7 +118,8 @@ public: const glm::vec3& amplifyAngle, float yawFromTouch, float pitchFromTouch); - void addBodyYaw(float y) {_bodyYaw += y;}; + void addBodyYaw(float bodyYaw) {_bodyYaw += bodyYaw;}; + void addBodyYawDelta(float bodyYawDelta) {_bodyYawDelta += bodyYawDelta;} void render(bool lookingInMirror, bool renderAvatarBalls); //setters @@ -155,6 +156,7 @@ public: float getElapsedTimeStopped () const { return _elapsedTimeStopped;} float getElapsedTimeMoving () const { return _elapsedTimeMoving;} float getElapsedTimeSinceCollision() const { return _elapsedTimeSinceCollision;} + const glm::vec3& getLastCollisionPosition () const { return _lastCollisionPosition;} float getAbsoluteHeadYaw () const; float getAbsoluteHeadPitch () const; Head& getHead () {return _head; } @@ -245,6 +247,7 @@ private: float _elapsedTimeMoving; // Timers to drive camera transitions when moving float _elapsedTimeStopped; float _elapsedTimeSinceCollision; + glm::vec3 _lastCollisionPosition; bool _speedBrakes; bool _isThrustOn;