Real time changes

This commit is contained in:
Cain Kilgore 2017-09-22 00:38:30 +01:00
parent 45f79b4341
commit 0d33976035
2 changed files with 16 additions and 16 deletions

View file

@ -20,9 +20,6 @@
const btVector3 LOCAL_UP_AXIS(0.0f, 1.0f, 0.0f);
const float DEFAULT_CHARACTER_GRAVITY = -5.0f;
float currentAvatarGravity = DEFAULT_CHARACTER_GRAVITY;
#ifdef DEBUG_STATE_CHANGE
#define SET_STATE(desiredState, reason) setState(desiredState, reason)
#else
@ -123,7 +120,7 @@ void CharacterController::setDynamicsWorld(btDynamicsWorld* world) {
_dynamicsWorld->addRigidBody(_rigidBody, collisionGroup, BULLET_COLLISION_MASK_MY_AVATAR);
_dynamicsWorld->addAction(this);
// restore gravity settings because adding an object to the world overwrites its gravity setting
_rigidBody->setGravity(_gravity * _currentUp);
_rigidBody->setGravity(_currentGravity * _currentUp);
btCollisionShape* shape = _rigidBody->getCollisionShape();
assert(shape && shape->getShapeType() == CONVEX_HULL_SHAPE_PROXYTYPE);
_ghost.setCharacterShape(static_cast<btConvexHullShape*>(shape));
@ -305,7 +302,7 @@ void CharacterController::playerStep(btCollisionWorld* collisionWorld, btScalar
// add minimum velocity to counteract gravity's displacement during one step
// Note: the 0.5 factor comes from the fact that we really want the
// average velocity contribution from gravity during the step
stepUpSpeed -= 0.5f * _gravity * timeToStep; // remember: _gravity is negative scalar
stepUpSpeed -= 0.5f * _currentGravity * timeToStep; // remember: _gravity is negative scalar
btScalar vDotUp = velocity.dot(_currentUp);
if (vDotUp < stepUpSpeed) {
@ -354,25 +351,26 @@ static const char* stateToStr(CharacterController::State state) {
}
#endif // #ifdef DEBUG_STATE_CHANGE
void CharacterController::updateGravity() {
void CharacterController::updateCurrentGravity() {
int16_t collisionGroup = computeCollisionGroup();
if (_state == State::Hover || collisionGroup == BULLET_COLLISION_GROUP_COLLISIONLESS) {
_gravity = 0.0f;
_currentGravity = 0.0f;
} else {
_gravity = currentAvatarGravity;
_currentGravity = _gravity;
}
if (_rigidBody) {
_rigidBody->setGravity(_gravity * _currentUp);
_rigidBody->setGravity(_currentGravity * _currentUp);
}
}
void CharacterController::setGravity(float gravity) {
currentAvatarGravity = gravity;
_gravity = gravity;
updateCurrentGravity();
}
float CharacterController::getGravity() {
return currentAvatarGravity;
return _gravity;
}
#ifdef DEBUG_STATE_CHANGE
@ -389,7 +387,7 @@ void CharacterController::setState(State desiredState) {
qCDebug(physics) << "CharacterController::setState" << stateToStr(desiredState) << "from" << stateToStr(_state) << "," << reason;
#endif
_state = desiredState;
updateGravity();
updateCurrentGravity();
}
}
@ -448,14 +446,14 @@ void CharacterController::handleChangedCollisionGroup() {
_dynamicsWorld->addRigidBody(_rigidBody, collisionGroup, BULLET_COLLISION_MASK_MY_AVATAR);
}
_pendingFlags &= ~PENDING_FLAG_UPDATE_COLLISION_GROUP;
updateGravity();
updateCurrentGravity();
}
}
void CharacterController::updateUpAxis(const glm::quat& rotation) {
_currentUp = quatRotate(glmToBullet(rotation), LOCAL_UP_AXIS);
if (_rigidBody) {
_rigidBody->setGravity(_gravity * _currentUp);
_rigidBody->setGravity(_currentGravity * _currentUp);
}
}

View file

@ -24,6 +24,7 @@
#include "BulletUtil.h"
#include "CharacterGhostObject.h"
#include "AvatarConstants.h"
const uint32_t PENDING_FLAG_ADD_TO_SIMULATION = 1U << 0;
const uint32_t PENDING_FLAG_REMOVE_FROM_SIMULATION = 1U << 1;
@ -134,7 +135,7 @@ protected:
#endif
virtual void updateMassProperties() = 0;
void updateGravity();
void updateCurrentGravity();
void updateUpAxis(const glm::quat& rotation);
bool checkForSupport(btCollisionWorld* collisionWorld);
@ -187,7 +188,8 @@ protected:
bool _stepUpEnabled { true };
bool _hasSupport;
btScalar _gravity { 0.0f };
btScalar _currentGravity { 0.0f };
btScalar _gravity { DEFAULT_AVATAR_GRAVITY };
btScalar _followTime;
btVector3 _followLinearDisplacement;