From 6f19093cb9959881b2002393ba6f66aec6c1d498 Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Mon, 23 Nov 2015 10:03:35 -0800 Subject: [PATCH 1/4] if an entity with an action has a motion-type of static, flag it so it gets updated in bullet --- libraries/entities/src/EntityItem.h | 1 + libraries/physics/src/ObjectAction.cpp | 9 +++++++++ 2 files changed, 10 insertions(+) diff --git a/libraries/entities/src/EntityItem.h b/libraries/entities/src/EntityItem.h index 5ceccef4b1..727a806b62 100644 --- a/libraries/entities/src/EntityItem.h +++ b/libraries/entities/src/EntityItem.h @@ -398,6 +398,7 @@ public: void getAllTerseUpdateProperties(EntityItemProperties& properties) const; void flagForOwnership() { _dirtyFlags |= Simulation::DIRTY_SIMULATOR_OWNERSHIP; } + void flagForMotionStateChange() { _dirtyFlags |= Simulation::DIRTY_MOTION_TYPE; } bool addAction(EntitySimulation* simulation, EntityActionPointer action); bool updateAction(EntitySimulation* simulation, const QUuid& actionID, const QVariantMap& arguments); diff --git a/libraries/physics/src/ObjectAction.cpp b/libraries/physics/src/ObjectAction.cpp index 3188283f68..8e0cdfd266 100644 --- a/libraries/physics/src/ObjectAction.cpp +++ b/libraries/physics/src/ObjectAction.cpp @@ -244,6 +244,15 @@ void ObjectAction::activateBody() { if (rigidBody) { rigidBody->activate(); } + auto ownerEntity = _ownerEntity.lock(); + if (!ownerEntity) { + return; + } + void* physicsInfo = ownerEntity->getPhysicsInfo(); + ObjectMotionState* motionState = static_cast(physicsInfo); + if (motionState && motionState->getMotionType() == MOTION_TYPE_STATIC) { + ownerEntity->flagForMotionStateChange(); + } } bool ObjectAction::lifetimeIsOver() { From 5612174894b602f818528023dfea37376e1ff658 Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Mon, 23 Nov 2015 11:02:41 -0800 Subject: [PATCH 2/4] call activateBody when a hold action is deserialized --- interface/src/avatar/AvatarActionHold.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/interface/src/avatar/AvatarActionHold.cpp b/interface/src/avatar/AvatarActionHold.cpp index 8e13fa8385..ca96cc9166 100644 --- a/interface/src/avatar/AvatarActionHold.cpp +++ b/interface/src/avatar/AvatarActionHold.cpp @@ -326,5 +326,6 @@ void AvatarActionHold::deserialize(QByteArray serializedArguments) { #endif _active = true; + activateBody(); }); } From c3821d7202b4acc409e56c6702f2278304612170 Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Mon, 23 Nov 2015 11:24:56 -0800 Subject: [PATCH 3/4] avoid deadlock --- interface/src/avatar/AvatarActionHold.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/interface/src/avatar/AvatarActionHold.cpp b/interface/src/avatar/AvatarActionHold.cpp index ca96cc9166..39490ddbc5 100644 --- a/interface/src/avatar/AvatarActionHold.cpp +++ b/interface/src/avatar/AvatarActionHold.cpp @@ -326,6 +326,7 @@ void AvatarActionHold::deserialize(QByteArray serializedArguments) { #endif _active = true; - activateBody(); }); + + activateBody(); } From d4937071e189121dab2dd0d46b0d33eeb1878771 Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Mon, 23 Nov 2015 12:17:15 -0800 Subject: [PATCH 4/4] rather than activating rigid body and forcing non-static on deserialize, just force non-static --- interface/src/avatar/AvatarActionHold.cpp | 2 +- libraries/physics/src/ObjectAction.cpp | 3 +++ libraries/physics/src/ObjectAction.h | 1 + 3 files changed, 5 insertions(+), 1 deletion(-) diff --git a/interface/src/avatar/AvatarActionHold.cpp b/interface/src/avatar/AvatarActionHold.cpp index 39490ddbc5..dd96b3a3d9 100644 --- a/interface/src/avatar/AvatarActionHold.cpp +++ b/interface/src/avatar/AvatarActionHold.cpp @@ -328,5 +328,5 @@ void AvatarActionHold::deserialize(QByteArray serializedArguments) { _active = true; }); - activateBody(); + forceBodyNonStatic(); } diff --git a/libraries/physics/src/ObjectAction.cpp b/libraries/physics/src/ObjectAction.cpp index 8e0cdfd266..17b565ba21 100644 --- a/libraries/physics/src/ObjectAction.cpp +++ b/libraries/physics/src/ObjectAction.cpp @@ -244,6 +244,9 @@ void ObjectAction::activateBody() { if (rigidBody) { rigidBody->activate(); } +} + +void ObjectAction::forceBodyNonStatic() { auto ownerEntity = _ownerEntity.lock(); if (!ownerEntity) { return; diff --git a/libraries/physics/src/ObjectAction.h b/libraries/physics/src/ObjectAction.h index afb6745e9c..e44036eadc 100644 --- a/libraries/physics/src/ObjectAction.h +++ b/libraries/physics/src/ObjectAction.h @@ -63,6 +63,7 @@ protected: virtual glm::vec3 getAngularVelocity(); virtual void setAngularVelocity(glm::vec3 angularVelocity); virtual void activateBody(); + virtual void forceBodyNonStatic(); EntityItemWeakPointer _ownerEntity; QString _tag;