move _accelerationNearlyGravityCount and _shouldClaimSimulationOwnership from EntityItem to EntityMotionState

This commit is contained in:
Seth Alves 2015-04-22 21:36:36 -07:00
parent 4ca076ed94
commit 9e96026c52
5 changed files with 35 additions and 29 deletions

View file

@ -47,7 +47,6 @@ EntityItem::EntityItem(const EntityItemID& entityItemID) :
_velocity(ENTITY_ITEM_DEFAULT_VELOCITY), _velocity(ENTITY_ITEM_DEFAULT_VELOCITY),
_gravity(ENTITY_ITEM_DEFAULT_GRAVITY), _gravity(ENTITY_ITEM_DEFAULT_GRAVITY),
_acceleration(ENTITY_ITEM_DEFAULT_ACCELERATION), _acceleration(ENTITY_ITEM_DEFAULT_ACCELERATION),
_accelerationNearlyGravityCount(0),
_damping(ENTITY_ITEM_DEFAULT_DAMPING), _damping(ENTITY_ITEM_DEFAULT_DAMPING),
_lifetime(ENTITY_ITEM_DEFAULT_LIFETIME), _lifetime(ENTITY_ITEM_DEFAULT_LIFETIME),
_script(ENTITY_ITEM_DEFAULT_SCRIPT), _script(ENTITY_ITEM_DEFAULT_SCRIPT),
@ -61,7 +60,6 @@ EntityItem::EntityItem(const EntityItemID& entityItemID) :
_userData(ENTITY_ITEM_DEFAULT_USER_DATA), _userData(ENTITY_ITEM_DEFAULT_USER_DATA),
_simulatorID(ENTITY_ITEM_DEFAULT_SIMULATOR_ID), _simulatorID(ENTITY_ITEM_DEFAULT_SIMULATOR_ID),
_simulatorIDChangedTime(0), _simulatorIDChangedTime(0),
_shouldClaimSimulationOwnership(false),
_marketplaceID(ENTITY_ITEM_DEFAULT_MARKETPLACE_ID), _marketplaceID(ENTITY_ITEM_DEFAULT_MARKETPLACE_ID),
_physicsInfo(NULL), _physicsInfo(NULL),
_dirtyFlags(0), _dirtyFlags(0),

View file

@ -258,8 +258,6 @@ public:
QUuid getSimulatorID() const { return _simulatorID; } QUuid getSimulatorID() const { return _simulatorID; }
void setSimulatorID(const QUuid& value); void setSimulatorID(const QUuid& value);
quint64 getSimulatorIDChangedTime() const { return _simulatorIDChangedTime; } quint64 getSimulatorIDChangedTime() const { return _simulatorIDChangedTime; }
void setShouldClaimSimulationOwnership(bool value) { _shouldClaimSimulationOwnership = value; }
bool getShouldClaimSimulationOwnership() { return _shouldClaimSimulationOwnership; }
const QString& getMarketplaceID() const { return _marketplaceID; } const QString& getMarketplaceID() const { return _marketplaceID; }
void setMarketplaceID(const QString& value) { _marketplaceID = value; } void setMarketplaceID(const QString& value) { _marketplaceID = value; }
@ -311,10 +309,6 @@ public:
static void setSendPhysicsUpdates(bool value) { _sendPhysicsUpdates = value; } static void setSendPhysicsUpdates(bool value) { _sendPhysicsUpdates = value; }
static bool getSendPhysicsUpdates() { return _sendPhysicsUpdates; } static bool getSendPhysicsUpdates() { return _sendPhysicsUpdates; }
void incrementAccelerationNearlyGravityCount() { _accelerationNearlyGravityCount++; }
void resetAccelerationNearlyGravityCount() { _accelerationNearlyGravityCount = 0; }
quint8 getAccelerationNearlyGravityCount() { return _accelerationNearlyGravityCount; }
protected: protected:
static bool _sendPhysicsUpdates; static bool _sendPhysicsUpdates;
@ -344,7 +338,6 @@ protected:
glm::vec3 _velocity; glm::vec3 _velocity;
glm::vec3 _gravity; glm::vec3 _gravity;
glm::vec3 _acceleration; glm::vec3 _acceleration;
quint8 _accelerationNearlyGravityCount;
float _damping; float _damping;
float _lifetime; float _lifetime;
QString _script; QString _script;
@ -358,7 +351,6 @@ protected:
QString _userData; QString _userData;
QUuid _simulatorID; // id of Node which is currently responsible for simulating this Entity QUuid _simulatorID; // id of Node which is currently responsible for simulating this Entity
quint64 _simulatorIDChangedTime; // when was _simulatorID last updated? quint64 _simulatorIDChangedTime; // when was _simulatorID last updated?
bool _shouldClaimSimulationOwnership;
QString _marketplaceID; QString _marketplaceID;
// NOTE: Damping is applied like this: v *= pow(1 - damping, dt) // NOTE: Damping is applied like this: v *= pow(1 - damping, dt)

View file

@ -35,8 +35,11 @@ void EntityMotionState::enqueueOutgoingEntity(EntityItem* entity) {
_outgoingEntityList->insert(entity); _outgoingEntityList->insert(entity);
} }
EntityMotionState::EntityMotionState(EntityItem* entity) EntityMotionState::EntityMotionState(EntityItem* entity) :
: _entity(entity) { _entity(entity),
_accelerationNearlyGravityCount(0),
_shouldClaimSimulationOwnership(false)
{
_type = MOTION_STATE_TYPE_ENTITY; _type = MOTION_STATE_TYPE_ENTITY;
assert(entity != NULL); assert(entity != NULL);
} }
@ -192,7 +195,7 @@ bool EntityMotionState::shouldSendUpdate(uint32_t simulationFrame) {
return false; return false;
} }
if (_entity->getShouldClaimSimulationOwnership()) { if (getShouldClaimSimulationOwnership()) {
return true; return true;
} }
@ -219,19 +222,19 @@ void EntityMotionState::sendUpdate(OctreeEditPacketSender* packetSender, uint32_
float accVsGravity = glm::abs(glm::length(_measuredAcceleration) - gravityLength); float accVsGravity = glm::abs(glm::length(_measuredAcceleration) - gravityLength);
if (accVsGravity < ACCELERATION_EQUIVALENT_EPSILON_RATIO * gravityLength) { if (accVsGravity < ACCELERATION_EQUIVALENT_EPSILON_RATIO * gravityLength) {
// acceleration measured during the most recent simulation step was close to gravity. // acceleration measured during the most recent simulation step was close to gravity.
if (_entity->getAccelerationNearlyGravityCount() < STEPS_TO_DECIDE_BALLISTIC) { if (getAccelerationNearlyGravityCount() < STEPS_TO_DECIDE_BALLISTIC) {
// only increment this if we haven't reached the threshold yet. this is to avoid // only increment this if we haven't reached the threshold yet. this is to avoid
// overflowing the counter. // overflowing the counter.
_entity->incrementAccelerationNearlyGravityCount(); incrementAccelerationNearlyGravityCount();
} }
} else { } else {
// acceleration wasn't similar to this entities gravity, so reset the went-ballistic counter // acceleration wasn't similar to this entities gravity, so reset the went-ballistic counter
_entity->resetAccelerationNearlyGravityCount(); resetAccelerationNearlyGravityCount();
} }
// if this entity has been accelerated at close to gravity for a certain number of simulation-steps, let // if this entity has been accelerated at close to gravity for a certain number of simulation-steps, let
// the entity server's estimates include gravity. // the entity server's estimates include gravity.
if (_entity->getAccelerationNearlyGravityCount() >= STEPS_TO_DECIDE_BALLISTIC) { if (getAccelerationNearlyGravityCount() >= STEPS_TO_DECIDE_BALLISTIC) {
_entity->setAcceleration(_entity->getGravity()); _entity->setAcceleration(_entity->getGravity());
} else { } else {
_entity->setAcceleration(glm::vec3(0.0f)); _entity->setAcceleration(glm::vec3(0.0f));
@ -283,10 +286,10 @@ void EntityMotionState::sendUpdate(OctreeEditPacketSender* packetSender, uint32_
QUuid myNodeID = nodeList->getSessionUUID(); QUuid myNodeID = nodeList->getSessionUUID();
QUuid simulatorID = _entity->getSimulatorID(); QUuid simulatorID = _entity->getSimulatorID();
if (_entity->getShouldClaimSimulationOwnership()) { if (getShouldClaimSimulationOwnership()) {
_entity->setSimulatorID(myNodeID); _entity->setSimulatorID(myNodeID);
properties.setSimulatorID(myNodeID); properties.setSimulatorID(myNodeID);
_entity->setShouldClaimSimulationOwnership(false); setShouldClaimSimulationOwnership(false);
} }
if (simulatorID == myNodeID && zeroSpeed && zeroSpin) { if (simulatorID == myNodeID && zeroSpeed && zeroSpin) {

View file

@ -64,8 +64,17 @@ public:
EntityItem* getEntity() const { return _entity; } EntityItem* getEntity() const { return _entity; }
void incrementAccelerationNearlyGravityCount() { _accelerationNearlyGravityCount++; }
void resetAccelerationNearlyGravityCount() { _accelerationNearlyGravityCount = 0; }
quint8 getAccelerationNearlyGravityCount() { return _accelerationNearlyGravityCount; }
void setShouldClaimSimulationOwnership(bool value) { _shouldClaimSimulationOwnership = value; }
bool getShouldClaimSimulationOwnership() { return _shouldClaimSimulationOwnership; }
protected: protected:
EntityItem* _entity; EntityItem* _entity;
quint8 _accelerationNearlyGravityCount;
bool _shouldClaimSimulationOwnership;
}; };
#endif // hifi_EntityMotionState_h #endif // hifi_EntityMotionState_h

View file

@ -392,9 +392,11 @@ void PhysicsEngine::computeCollisionEvents() {
} }
void* a = objectA->getUserPointer(); void* a = objectA->getUserPointer();
EntityItem* entityA = a ? static_cast<EntityMotionState*>(a)->getEntity() : NULL; EntityMotionState* entityMotionStateA = static_cast<EntityMotionState*>(a);
EntityItem* entityA = entityMotionStateA ? entityMotionStateA->getEntity() : NULL;
void* b = objectB->getUserPointer(); void* b = objectB->getUserPointer();
EntityItem* entityB = b ? static_cast<EntityMotionState*>(b)->getEntity() : NULL; EntityMotionState* entityMotionStateB = static_cast<EntityMotionState*>(b);
EntityItem* entityB = entityMotionStateB ? entityMotionStateB->getEntity() : NULL;
if (a || b) { if (a || b) {
// the manifold has up to 4 distinct points, but only extract info from the first // the manifold has up to 4 distinct points, but only extract info from the first
_contactMap[ContactKey(a, b)].update(_numContactFrames, contactManifold->getContactPoint(0), _originOffset); _contactMap[ContactKey(a, b)].update(_numContactFrames, contactManifold->getContactPoint(0), _originOffset);
@ -403,14 +405,14 @@ void PhysicsEngine::computeCollisionEvents() {
// ownership of anything that collides with our avatar. // ownership of anything that collides with our avatar.
if (entityA && entityB && !objectA->isStaticOrKinematicObject() && !objectB->isStaticOrKinematicObject()) { if (entityA && entityB && !objectA->isStaticOrKinematicObject() && !objectB->isStaticOrKinematicObject()) {
if (entityA->getSimulatorID() == myNodeID || if (entityA->getSimulatorID() == myNodeID ||
entityA->getShouldClaimSimulationOwnership() || entityMotionStateA->getShouldClaimSimulationOwnership() ||
objectA == characterCollisionObject) { objectA == characterCollisionObject) {
entityB->setShouldClaimSimulationOwnership(true); entityMotionStateB->setShouldClaimSimulationOwnership(true);
} }
if (entityB->getSimulatorID() == myNodeID || if (entityB->getSimulatorID() == myNodeID ||
entityB->getShouldClaimSimulationOwnership() || entityMotionStateA->getShouldClaimSimulationOwnership() ||
objectB == characterCollisionObject) { objectB == characterCollisionObject) {
entityA->setShouldClaimSimulationOwnership(true); entityMotionStateB->setShouldClaimSimulationOwnership(true);
} }
} }
} }
@ -543,17 +545,19 @@ void PhysicsEngine::bump(EntityItem* bumpEntity) {
void* a = objectA->getUserPointer(); void* a = objectA->getUserPointer();
void* b = objectB->getUserPointer(); void* b = objectB->getUserPointer();
if (a && b) { if (a && b) {
EntityItem* entityA = a ? static_cast<EntityMotionState*>(a)->getEntity() : NULL; EntityMotionState* entityMotionStateA = static_cast<EntityMotionState*>(a);
EntityItem* entityB = b ? static_cast<EntityMotionState*>(b)->getEntity() : NULL; EntityMotionState* entityMotionStateB = static_cast<EntityMotionState*>(b);
EntityItem* entityA = entityMotionStateA ? entityMotionStateA->getEntity() : NULL;
EntityItem* entityB = entityMotionStateB ? entityMotionStateB->getEntity() : NULL;
if (entityA && entityB) { if (entityA && entityB) {
if (entityA == bumpEntity) { if (entityA == bumpEntity) {
entityB->setShouldClaimSimulationOwnership(true); entityMotionStateB->setShouldClaimSimulationOwnership(true);
if (!objectB->isActive()) { if (!objectB->isActive()) {
objectB->setActivationState(ACTIVE_TAG); objectB->setActivationState(ACTIVE_TAG);
} }
} }
if (entityB == bumpEntity) { if (entityB == bumpEntity) {
entityA->setShouldClaimSimulationOwnership(true); entityMotionStateA->setShouldClaimSimulationOwnership(true);
if (!objectA->isActive()) { if (!objectA->isActive()) {
objectA->setActivationState(ACTIVE_TAG); objectA->setActivationState(ACTIVE_TAG);
} }