revert PR-13162 from RC68

This commit is contained in:
Andrew Meadows 2018-06-12 03:51:55 -07:00
parent a2399ea1f6
commit d31ee52d79
4 changed files with 19 additions and 50 deletions

View file

@ -21,17 +21,6 @@ AvatarMotionState::AvatarMotionState(AvatarSharedPointer avatar, const btCollisi
_type = MOTIONSTATE_TYPE_AVATAR; _type = MOTIONSTATE_TYPE_AVATAR;
} }
void AvatarMotionState::handleEasyChanges(uint32_t& flags) {
ObjectMotionState::handleEasyChanges(flags);
if (flags & Simulation::DIRTY_PHYSICS_ACTIVATION && !_body->isActive()) {
_body->activate();
}
}
bool AvatarMotionState::handleHardAndEasyChanges(uint32_t& flags, PhysicsEngine* engine) {
return ObjectMotionState::handleHardAndEasyChanges(flags, engine);
}
AvatarMotionState::~AvatarMotionState() { AvatarMotionState::~AvatarMotionState() {
assert(_avatar); assert(_avatar);
_avatar = nullptr; _avatar = nullptr;
@ -57,9 +46,6 @@ PhysicsMotionType AvatarMotionState::computePhysicsMotionType() const {
const btCollisionShape* AvatarMotionState::computeNewShape() { const btCollisionShape* AvatarMotionState::computeNewShape() {
ShapeInfo shapeInfo; ShapeInfo shapeInfo;
std::static_pointer_cast<Avatar>(_avatar)->computeShapeInfo(shapeInfo); std::static_pointer_cast<Avatar>(_avatar)->computeShapeInfo(shapeInfo);
glm::vec3 halfExtents = shapeInfo.getHalfExtents();
halfExtents.y = 0.0f;
_diameter = 2.0f * glm::length(halfExtents);
return getShapeManager()->getShape(shapeInfo); return getShapeManager()->getShape(shapeInfo);
} }
@ -74,31 +60,25 @@ void AvatarMotionState::getWorldTransform(btTransform& worldTrans) const {
worldTrans.setRotation(glmToBullet(getObjectRotation())); worldTrans.setRotation(glmToBullet(getObjectRotation()));
if (_body) { if (_body) {
_body->setLinearVelocity(glmToBullet(getObjectLinearVelocity())); _body->setLinearVelocity(glmToBullet(getObjectLinearVelocity()));
_body->setAngularVelocity(glmToBullet(getObjectAngularVelocity())); _body->setAngularVelocity(glmToBullet(getObjectLinearVelocity()));
} }
} }
// virtual // virtual
void AvatarMotionState::setWorldTransform(const btTransform& worldTrans) { void AvatarMotionState::setWorldTransform(const btTransform& worldTrans) {
// HACK: The PhysicsEngine does not actually move OTHER avatars -- instead it slaves their local RigidBody to the transform
// as specified by a remote simulation. However, to give the remote simulation time to respond to our own objects we tie
// the other avatar's body to its true position with a simple spring. This is a HACK that will have to be improved later.
const float SPRING_TIMESCALE = 0.5f; const float SPRING_TIMESCALE = 0.5f;
float tau = PHYSICS_ENGINE_FIXED_SUBSTEP / SPRING_TIMESCALE; float tau = PHYSICS_ENGINE_FIXED_SUBSTEP / SPRING_TIMESCALE;
btVector3 currentPosition = worldTrans.getOrigin(); btVector3 currentPosition = worldTrans.getOrigin();
btVector3 offsetToTarget = glmToBullet(getObjectPosition()) - currentPosition; btVector3 targetPosition = glmToBullet(getObjectPosition());
float distance = offsetToTarget.length(); btTransform newTransform;
if ((1.0f - tau) * distance > _diameter) { newTransform.setOrigin((1.0f - tau) * currentPosition + tau * targetPosition);
// the avatar body is far from its target --> slam position newTransform.setRotation(glmToBullet(getObjectRotation()));
btTransform newTransform; _body->setWorldTransform(newTransform);
newTransform.setOrigin(currentPosition + offsetToTarget); _body->setLinearVelocity(glmToBullet(getObjectLinearVelocity()));
newTransform.setRotation(glmToBullet(getObjectRotation())); _body->setAngularVelocity(glmToBullet(getObjectLinearVelocity()));
_body->setWorldTransform(newTransform);
_body->setLinearVelocity(glmToBullet(getObjectLinearVelocity()));
_body->setAngularVelocity(glmToBullet(getObjectAngularVelocity()));
} else {
// the avatar body is near its target --> slam velocity
btVector3 velocity = glmToBullet(getObjectLinearVelocity()) + (1.0f / SPRING_TIMESCALE) * offsetToTarget;
_body->setLinearVelocity(velocity);
_body->setAngularVelocity(glmToBullet(getObjectAngularVelocity()));
}
} }
// These pure virtual methods must be implemented for each MotionState type // These pure virtual methods must be implemented for each MotionState type
@ -165,8 +145,3 @@ void AvatarMotionState::computeCollisionGroupAndMask(int16_t& group, int16_t& ma
mask = Physics::getDefaultCollisionMask(group); mask = Physics::getDefaultCollisionMask(group);
} }
// virtual
float AvatarMotionState::getMass() const {
return std::static_pointer_cast<Avatar>(_avatar)->computeMass();
}

View file

@ -23,9 +23,6 @@ class AvatarMotionState : public ObjectMotionState {
public: public:
AvatarMotionState(AvatarSharedPointer avatar, const btCollisionShape* shape); AvatarMotionState(AvatarSharedPointer avatar, const btCollisionShape* shape);
virtual void handleEasyChanges(uint32_t& flags) override;
virtual bool handleHardAndEasyChanges(uint32_t& flags, PhysicsEngine* engine) override;
virtual PhysicsMotionType getMotionType() const override { return _motionType; } virtual PhysicsMotionType getMotionType() const override { return _motionType; }
virtual uint32_t getIncomingDirtyFlags() override; virtual uint32_t getIncomingDirtyFlags() override;
@ -67,8 +64,6 @@ public:
virtual void computeCollisionGroupAndMask(int16_t& group, int16_t& mask) const override; virtual void computeCollisionGroupAndMask(int16_t& group, int16_t& mask) const override;
virtual float getMass() const override;
friend class AvatarManager; friend class AvatarManager;
friend class Avatar; friend class Avatar;
@ -81,7 +76,6 @@ protected:
virtual const btCollisionShape* computeNewShape() override; virtual const btCollisionShape* computeNewShape() override;
AvatarSharedPointer _avatar; AvatarSharedPointer _avatar;
float _diameter { 0.0f };
uint32_t _dirtyFlags; uint32_t _dirtyFlags;
}; };

View file

@ -799,6 +799,7 @@ bool Avatar::shouldRenderHead(const RenderArgs* renderArgs) const {
return true; return true;
} }
// virtual
void Avatar::simulateAttachments(float deltaTime) { void Avatar::simulateAttachments(float deltaTime) {
assert(_attachmentModels.size() == _attachmentModelsTexturesLoaded.size()); assert(_attachmentModels.size() == _attachmentModelsTexturesLoaded.size());
PerformanceTimer perfTimer("attachments"); PerformanceTimer perfTimer("attachments");
@ -1481,14 +1482,12 @@ void Avatar::updateDisplayNameAlpha(bool showDisplayName) {
} }
} }
// virtual
void Avatar::computeShapeInfo(ShapeInfo& shapeInfo) { void Avatar::computeShapeInfo(ShapeInfo& shapeInfo) {
float uniformScale = getModelScale(); float uniformScale = getModelScale();
float radius = uniformScale * _skeletonModel->getBoundingCapsuleRadius(); shapeInfo.setCapsuleY(uniformScale * _skeletonModel->getBoundingCapsuleRadius(),
float height = uniformScale * _skeletonModel->getBoundingCapsuleHeight(); 0.5f * uniformScale * _skeletonModel->getBoundingCapsuleHeight());
shapeInfo.setCapsuleY(radius, 0.5f * height); shapeInfo.setOffset(uniformScale * _skeletonModel->getBoundingCapsuleOffset());
glm::vec3 offset = uniformScale * _skeletonModel->getBoundingCapsuleOffset();
shapeInfo.setOffset(offset);
} }
void Avatar::getCapsule(glm::vec3& start, glm::vec3& end, float& radius) { void Avatar::getCapsule(glm::vec3& start, glm::vec3& end, float& radius) {
@ -1511,8 +1510,9 @@ float Avatar::computeMass() {
return _density * TWO_PI * radius * radius * (glm::length(end - start) + 2.0f * radius / 3.0f); return _density * TWO_PI * radius * radius * (glm::length(end - start) + 2.0f * radius / 3.0f);
} }
// virtual
void Avatar::rebuildCollisionShape() { void Avatar::rebuildCollisionShape() {
addPhysicsFlags(Simulation::DIRTY_SHAPE | Simulation::DIRTY_MASS); addPhysicsFlags(Simulation::DIRTY_SHAPE);
} }
void Avatar::setPhysicsCallback(AvatarPhysicsCallback cb) { void Avatar::setPhysicsCallback(AvatarPhysicsCallback cb) {

View file

@ -111,7 +111,7 @@ public:
virtual PhysicsMotionType getMotionType() const { return _motionType; } virtual PhysicsMotionType getMotionType() const { return _motionType; }
void setMass(float mass); void setMass(float mass);
virtual float getMass() const; float getMass() const;
void setBodyLinearVelocity(const glm::vec3& velocity) const; void setBodyLinearVelocity(const glm::vec3& velocity) const;
void setBodyAngularVelocity(const glm::vec3& velocity) const; void setBodyAngularVelocity(const glm::vec3& velocity) const;