From 6e6fec158dda66c0c4d6d1290e549eb58eecf5ba Mon Sep 17 00:00:00 2001 From: Andrew Meadows Date: Wed, 6 May 2015 11:47:33 -0700 Subject: [PATCH] split ignore/activation thresholds for updates --- libraries/entities/src/EntityItem.cpp | 122 ++++++++++++++++---------- libraries/entities/src/EntityItem.h | 1 - 2 files changed, 76 insertions(+), 47 deletions(-) diff --git a/libraries/entities/src/EntityItem.cpp b/libraries/entities/src/EntityItem.cpp index a3bb410b2c..71a724c5cf 100644 --- a/libraries/entities/src/EntityItem.cpp +++ b/libraries/entities/src/EntityItem.cpp @@ -549,7 +549,7 @@ int EntityItem::readEntityDataFromBuffer(const unsigned char* data, int bytesLef READ_ENTITY_PROPERTY_SETTER(PROP_GRAVITY, glm::vec3, updateGravityInDomainUnits); } if (args.bitstreamVersion >= VERSION_ENTITIES_HAVE_ACCELERATION) { - READ_ENTITY_PROPERTY_SETTER(PROP_ACCELERATION, glm::vec3, updateAcceleration); + READ_ENTITY_PROPERTY_SETTER(PROP_ACCELERATION, glm::vec3, setAcceleration); } READ_ENTITY_PROPERTY(PROP_DAMPING, float, _damping); @@ -666,12 +666,17 @@ void EntityItem::setDensity(float density) { _density = glm::max(glm::min(density, ENTITY_ITEM_MAX_DENSITY), ENTITY_ITEM_MIN_DENSITY); } +const float ACTIVATION_RELATIVE_DENSITY_DELTA = 0.01f; // 1 percent + void EntityItem::updateDensity(float density) { - const float MIN_DENSITY_CHANGE_FACTOR = 0.001f; // 0.1 percent - float newDensity = glm::max(glm::min(density, ENTITY_ITEM_MAX_DENSITY), ENTITY_ITEM_MIN_DENSITY); - if (fabsf(_density - newDensity) / _density > MIN_DENSITY_CHANGE_FACTOR) { - _density = newDensity; - _dirtyFlags |= EntityItem::DIRTY_MASS; + float clampedDensity = glm::max(glm::min(density, ENTITY_ITEM_MAX_DENSITY), ENTITY_ITEM_MIN_DENSITY); + if (_density != clampedDensity) { + _density = clampedDensity; + + if (fabsf(_density - clampedDensity) / _density > ACTIVATION_RELATIVE_DENSITY_DELTA) { + // the density has changed enough that we should update the physics simulation + _dirtyFlags |= EntityItem::DIRTY_MASS; + } } } @@ -925,7 +930,7 @@ bool EntityItem::setProperties(const EntityItemProperties& properties) { SET_ENTITY_PROPERTY_FROM_PROPERTIES(density, updateDensity); SET_ENTITY_PROPERTY_FROM_PROPERTIES(velocity, updateVelocity); SET_ENTITY_PROPERTY_FROM_PROPERTIES(gravity, updateGravity); - SET_ENTITY_PROPERTY_FROM_PROPERTIES(acceleration, updateAcceleration); + SET_ENTITY_PROPERTY_FROM_PROPERTIES(acceleration, setAcceleration); SET_ENTITY_PROPERTY_FROM_PROPERTIES(damping, updateDamping); SET_ENTITY_PROPERTY_FROM_PROPERTIES(lifetime, updateLifetime); SET_ENTITY_PROPERTY_FROM_PROPERTIES(script, setScript); @@ -1104,14 +1109,22 @@ void EntityItem::computeShapeInfo(ShapeInfo& info) { info.setParams(getShapeType(), 0.5f * getDimensions()); } -const float MIN_POSITION_DELTA = 0.0001f; -const float MIN_DIMENSIONS_DELTA = 0.0005f; -const float MIN_ALIGNMENT_DOT = 0.999999f; -const float MIN_VELOCITY_DELTA = 0.01f; -const float MIN_DAMPING_DELTA = 0.001f; -const float MIN_GRAVITY_DELTA = 0.001f; -const float MIN_ACCELERATION_DELTA = 0.001f; -const float MIN_SPIN_DELTA = 0.0003f; +// these thesholds determine what updates will be ignored (client and server) +const float IGNORE_POSITION_DELTA = 0.0001f; +const float IGNORE_DIMENSIONS_DELTA = 0.0005f; +const float IGNORE_ALIGNMENT_DOT = 0.99997f; +const float IGNORE_LINEAR_VELOCITY_DELTA = 0.001f; +const float IGNORE_DAMPING_DELTA = 0.001f; +const float IGNORE_GRAVITY_DELTA = 0.001f; +const float IGNORE_ANGULAR_VELOCITY_DELTA = 0.0002f; + +// these thresholds determine what updates will activate the physical object +const float ACTIVATION_POSITION_DELTA = 0.005f; +const float ACTIVATION_DIMENSIONS_DELTA = 0.005f; +const float ACTIVATION_ALIGNMENT_DOT = 0.99990f; +const float ACTIVATION_LINEAR_VELOCITY_DELTA = 0.01f; +const float ACTIVATION_GRAVITY_DELTA = 0.1f; +const float ACTIVATION_ANGULAR_VELOCITY_DELTA = 0.03f; void EntityItem::updatePositionInDomainUnits(const glm::vec3& value) { glm::vec3 position = value * (float)TREE_SCALE; @@ -1119,13 +1132,13 @@ void EntityItem::updatePositionInDomainUnits(const glm::vec3& value) { } void EntityItem::updatePosition(const glm::vec3& value) { - if (value != _position) { - auto distance = glm::distance(_position, value); + auto delta = glm::distance(_position, value); + if (delta > IGNORE_POSITION_DELTA) { _dirtyFlags |= EntityItem::DIRTY_POSITION; - if (distance > MIN_POSITION_DELTA) { + _position = value; + if (delta > ACTIVATION_POSITION_DELTA) { _dirtyFlags |= EntityItem::DIRTY_PHYSICS_ACTIVATION; } - _position = value; } } @@ -1135,20 +1148,27 @@ void EntityItem::updateDimensionsInDomainUnits(const glm::vec3& value) { } void EntityItem::updateDimensions(const glm::vec3& value) { - if (glm::distance(_dimensions, value) > MIN_DIMENSIONS_DELTA) { + auto delta = glm::distance(_dimensions, value); + if (delta > IGNORE_DIMENSIONS_DELTA) { _dimensions = value; - _dirtyFlags |= (EntityItem::DIRTY_SHAPE | EntityItem::DIRTY_MASS); + if (delta > ACTIVATION_DIMENSIONS_DELTA) { + // rebuilding the shape will always activate + _dirtyFlags |= (EntityItem::DIRTY_SHAPE | EntityItem::DIRTY_MASS); + } } } void EntityItem::updateRotation(const glm::quat& rotation) { - if (rotation != _rotation) { + if (_rotation != rotation) { + _rotation = rotation; + auto alignmentDot = glm::abs(glm::dot(_rotation, rotation)); - _dirtyFlags |= EntityItem::DIRTY_ROTATION; - if (alignmentDot < MIN_ALIGNMENT_DOT) { + if (alignmentDot < IGNORE_ALIGNMENT_DOT) { + _dirtyFlags |= EntityItem::DIRTY_ROTATION; + } + if (alignmentDot < ACTIVATION_ALIGNMENT_DOT) { _dirtyFlags |= EntityItem::DIRTY_PHYSICS_ACTIVATION; } - _rotation = rotation; } } @@ -1169,9 +1189,11 @@ void EntityItem::updateMass(float mass) { newDensity = glm::max(glm::min(mass / volume, ENTITY_ITEM_MAX_DENSITY), ENTITY_ITEM_MIN_DENSITY); } - const float MIN_DENSITY_CHANGE_FACTOR = 0.001f; // 0.1 percent - if (fabsf(_density - newDensity) / _density > MIN_DENSITY_CHANGE_FACTOR) { - _density = newDensity; + float oldDensity = _density; + _density = newDensity; + + if (fabsf(_density - oldDensity) / _density > ACTIVATION_RELATIVE_DENSITY_DELTA) { + // the density has changed enough that we should update the physics simulation _dirtyFlags |= EntityItem::DIRTY_MASS; } } @@ -1182,20 +1204,26 @@ void EntityItem::updateVelocityInDomainUnits(const glm::vec3& value) { } void EntityItem::updateVelocity(const glm::vec3& value) { - if (glm::distance(_velocity, value) > MIN_VELOCITY_DELTA) { - if (glm::length(value) < MIN_VELOCITY_DELTA) { + auto delta = glm::distance(_velocity, value); + if (delta > IGNORE_LINEAR_VELOCITY_DELTA) { + const float MIN_LINEAR_SPEED = 0.001f; + if (glm::length(value) < MIN_LINEAR_SPEED) { _velocity = ENTITY_ITEM_ZERO_VEC3; } else { _velocity = value; } _dirtyFlags |= EntityItem::DIRTY_LINEAR_VELOCITY; - _dirtyFlags |= EntityItem::DIRTY_PHYSICS_ACTIVATION; + + if (delta > ACTIVATION_LINEAR_VELOCITY_DELTA) { + _dirtyFlags |= EntityItem::DIRTY_PHYSICS_ACTIVATION; + } } } void EntityItem::updateDamping(float value) { - if (fabsf(_damping - value) > MIN_DAMPING_DELTA) { - _damping = glm::clamp(value, 0.0f, 1.0f); + auto clampedDamping = glm::clamp(value, 0.0f, 1.0f); + if (fabsf(_damping - clampedDamping) > IGNORE_DAMPING_DELTA) { + _damping = clampedDamping; _dirtyFlags |= EntityItem::DIRTY_MATERIAL; } } @@ -1206,34 +1234,36 @@ void EntityItem::updateGravityInDomainUnits(const glm::vec3& value) { } void EntityItem::updateGravity(const glm::vec3& value) { - if (glm::distance(_gravity, value) > MIN_GRAVITY_DELTA) { + auto delta = glm::distance(_gravity, value); + if (delta > IGNORE_GRAVITY_DELTA) { _gravity = value; _dirtyFlags |= EntityItem::DIRTY_LINEAR_VELOCITY; - } -} - -void EntityItem::updateAcceleration(const glm::vec3& value) { - if (glm::distance(_acceleration, value) > MIN_ACCELERATION_DELTA) { - _acceleration = value; + if (delta > ACTIVATION_GRAVITY_DELTA) { + _dirtyFlags |= EntityItem::DIRTY_PHYSICS_ACTIVATION; + } } } void EntityItem::updateAngularVelocity(const glm::vec3& value) { - auto distance = glm::distance(_angularVelocity, value); - if (distance > MIN_SPIN_DELTA) { + auto delta = glm::distance(_angularVelocity, value); + if (delta > IGNORE_ANGULAR_VELOCITY_DELTA) { _dirtyFlags |= EntityItem::DIRTY_ANGULAR_VELOCITY; - _dirtyFlags |= EntityItem::DIRTY_PHYSICS_ACTIVATION; - if (glm::length(value) < MIN_SPIN_DELTA) { + const float MIN_ANGULAR_SPEED = 0.0002f; + if (glm::length(value) < MIN_ANGULAR_SPEED) { _angularVelocity = ENTITY_ITEM_ZERO_VEC3; } else { _angularVelocity = value; } + if (delta > ACTIVATION_ANGULAR_VELOCITY_DELTA) { + _dirtyFlags |= EntityItem::DIRTY_PHYSICS_ACTIVATION; + } } } void EntityItem::updateAngularDamping(float value) { - if (fabsf(_angularDamping - value) > MIN_DAMPING_DELTA) { - _angularDamping = glm::clamp(value, 0.0f, 1.0f); + auto clampedDamping = glm::clamp(value, 0.0f, 1.0f); + if (fabsf(_angularDamping - clampedDamping) > IGNORE_DAMPING_DELTA) { + _angularDamping = clampedDamping; _dirtyFlags |= EntityItem::DIRTY_MATERIAL; } } diff --git a/libraries/entities/src/EntityItem.h b/libraries/entities/src/EntityItem.h index f76f311269..56b178cc4f 100644 --- a/libraries/entities/src/EntityItem.h +++ b/libraries/entities/src/EntityItem.h @@ -290,7 +290,6 @@ public: void updateDamping(float value); void updateGravityInDomainUnits(const glm::vec3& value); void updateGravity(const glm::vec3& value); - void updateAcceleration(const glm::vec3& value); void updateAngularVelocity(const glm::vec3& value); void updateAngularVelocityInDegrees(const glm::vec3& value) { updateAngularVelocity(glm::radians(value)); } void updateAngularDamping(float value);