From d28c400cea46fc1b41d50450f48027ec967c3d77 Mon Sep 17 00:00:00 2001 From: Andrew Meadows Date: Thu, 14 May 2015 12:36:59 -0700 Subject: [PATCH] add restitution and friction Entity properties --- examples/html/entityProperties.html | 23 +++++++- libraries/entities/src/EntityItem.cpp | 53 ++++++++++++++----- libraries/entities/src/EntityItem.h | 11 +++- .../entities/src/EntityItemProperties.cpp | 14 +++++ libraries/entities/src/EntityItemProperties.h | 4 ++ .../src/EntityItemPropertiesDefaults.h | 8 +++ libraries/entities/src/EntityPropertyFlags.h | 2 + libraries/networking/src/PacketHeaders.cpp | 2 +- libraries/networking/src/PacketHeaders.h | 1 + 9 files changed, 101 insertions(+), 17 deletions(-) diff --git a/examples/html/entityProperties.html b/examples/html/entityProperties.html index 25467f7573..0e3494bff8 100644 --- a/examples/html/entityProperties.html +++ b/examples/html/entityProperties.html @@ -233,6 +233,9 @@ var elAngularVelocityZ = document.getElementById("property-avel-z"); var elAngularDamping = document.getElementById("property-adamping"); + var elRestitution = document.getElementById("property-restitution"); + var elFriction = document.getElementById("property-friction"); + var elGravityX = document.getElementById("property-grav-x"); var elGravityY = document.getElementById("property-grav-y"); var elGravityZ = document.getElementById("property-grav-z"); @@ -427,6 +430,9 @@ elAngularVelocityZ.value = (properties.angularVelocity.z * RADIANS_TO_DEGREES).toFixed(2); elAngularDamping.value = properties.angularDamping.toFixed(2); + elRestitution.value = properties.restitution.toFixed(2); + elFriction.value = properties.friction.toFixed(2); + elGravityX.value = properties.gravity.x.toFixed(2); elGravityY.value = properties.gravity.y.toFixed(2); elGravityZ.value = properties.gravity.z.toFixed(2); @@ -607,7 +613,10 @@ elAngularVelocityX.addEventListener('change', angularVelocityChangeFunction); elAngularVelocityY.addEventListener('change', angularVelocityChangeFunction); elAngularVelocityZ.addEventListener('change', angularVelocityChangeFunction); - elAngularDamping.addEventListener('change', createEmitNumberPropertyUpdateFunction('angularDamping')) + elAngularDamping.addEventListener('change', createEmitNumberPropertyUpdateFunction('angularDamping')); + + elRestitution.addEventListener('change', createEmitNumberPropertyUpdateFunction('restitution')); + elFriction.addEventListener('change', createEmitNumberPropertyUpdateFunction('friction')); var gravityChangeFunction = createEmitVec3PropertyUpdateFunction( 'gravity', elGravityX, elGravityY, elGravityZ); @@ -963,6 +972,18 @@ +
+
Restitution
+
+ +
+
+
+
Friction
+
+ +
+
Gravity
diff --git a/libraries/entities/src/EntityItem.cpp b/libraries/entities/src/EntityItem.cpp index 470426d55e..e5b620210f 100644 --- a/libraries/entities/src/EntityItem.cpp +++ b/libraries/entities/src/EntityItem.cpp @@ -51,6 +51,8 @@ EntityItem::EntityItem(const EntityItemID& entityItemID) : _gravity(ENTITY_ITEM_DEFAULT_GRAVITY), _acceleration(ENTITY_ITEM_DEFAULT_ACCELERATION), _damping(ENTITY_ITEM_DEFAULT_DAMPING), + _restitution(ENTITY_ITEM_DEFAULT_RESTITUTION), + _friction(ENTITY_ITEM_DEFAULT_FRICTION), _lifetime(ENTITY_ITEM_DEFAULT_LIFETIME), _script(ENTITY_ITEM_DEFAULT_SCRIPT), _collisionSoundURL(ENTITY_ITEM_DEFAULT_COLLISION_SOUND_URL), @@ -100,6 +102,8 @@ EntityPropertyFlags EntityItem::getEntityProperties(EncodeBitstreamParams& param requestedProperties += PROP_GRAVITY; requestedProperties += PROP_ACCELERATION; requestedProperties += PROP_DAMPING; + requestedProperties += PROP_RESTITUTION; + requestedProperties += PROP_FRICTION; requestedProperties += PROP_LIFETIME; requestedProperties += PROP_SCRIPT; requestedProperties += PROP_COLLISION_SOUND_URL; @@ -227,6 +231,8 @@ OctreeElement::AppendState EntityItem::appendEntityData(OctreePacketData* packet APPEND_ENTITY_PROPERTY(PROP_GRAVITY, getGravity()); APPEND_ENTITY_PROPERTY(PROP_ACCELERATION, getAcceleration()); APPEND_ENTITY_PROPERTY(PROP_DAMPING, getDamping()); + APPEND_ENTITY_PROPERTY(PROP_RESTITUTION, getRestitution()); + APPEND_ENTITY_PROPERTY(PROP_FRICTION, getFriction()); APPEND_ENTITY_PROPERTY(PROP_LIFETIME, getLifetime()); APPEND_ENTITY_PROPERTY(PROP_SCRIPT, getScript()); APPEND_ENTITY_PROPERTY(PROP_REGISTRATION_POINT, getRegistrationPoint()); @@ -552,7 +558,9 @@ int EntityItem::readEntityDataFromBuffer(const unsigned char* data, int bytesLef READ_ENTITY_PROPERTY(PROP_ACCELERATION, glm::vec3, setAcceleration); } - READ_ENTITY_PROPERTY(PROP_DAMPING, float, setDamping); + READ_ENTITY_PROPERTY(PROP_DAMPING, float, updateDamping); + READ_ENTITY_PROPERTY(PROP_RESTITUTION, float, updateRestitution); + READ_ENTITY_PROPERTY(PROP_FRICTION, float, updateFriction); READ_ENTITY_PROPERTY(PROP_LIFETIME, float, updateLifetime); READ_ENTITY_PROPERTY(PROP_SCRIPT, QString, setScript); READ_ENTITY_PROPERTY(PROP_REGISTRATION_POINT, glm::vec3, setRegistrationPoint); @@ -561,7 +569,7 @@ int EntityItem::readEntityDataFromBuffer(const unsigned char* data, int bytesLef } else { READ_ENTITY_PROPERTY(PROP_ANGULAR_VELOCITY, glm::vec3, updateAngularVelocityInDegrees); } - READ_ENTITY_PROPERTY(PROP_ANGULAR_DAMPING, float, setAngularDamping); + READ_ENTITY_PROPERTY(PROP_ANGULAR_DAMPING, float, updateAngularDamping); READ_ENTITY_PROPERTY(PROP_VISIBLE, bool, setVisible); READ_ENTITY_PROPERTY(PROP_IGNORE_FOR_COLLISIONS, bool, updateIgnoreForCollisions); READ_ENTITY_PROPERTY(PROP_COLLISIONS_WILL_MOVE, bool, updateCollisionsWillMove); @@ -697,17 +705,6 @@ void EntityItem::setMass(float mass) { } } -const float DEFAULT_ENTITY_RESTITUTION = 0.5f; -const float DEFAULT_ENTITY_FRICTION = 0.5f; - -float EntityItem::getRestitution() const { - return DEFAULT_ENTITY_RESTITUTION; -} - -float EntityItem::getFriction() const { - return DEFAULT_ENTITY_FRICTION; -} - void EntityItem::simulate(const quint64& now) { if (_lastSimulated == 0) { _lastSimulated = now; @@ -900,6 +897,8 @@ EntityItemProperties EntityItem::getProperties() const { COPY_ENTITY_PROPERTY_TO_PROPERTIES(gravity, getGravity); COPY_ENTITY_PROPERTY_TO_PROPERTIES(acceleration, getAcceleration); COPY_ENTITY_PROPERTY_TO_PROPERTIES(damping, getDamping); + COPY_ENTITY_PROPERTY_TO_PROPERTIES(restitution, getRestitution); + COPY_ENTITY_PROPERTY_TO_PROPERTIES(friction, getFriction); COPY_ENTITY_PROPERTY_TO_PROPERTIES(lifetime, getLifetime); COPY_ENTITY_PROPERTY_TO_PROPERTIES(script, getScript); COPY_ENTITY_PROPERTY_TO_PROPERTIES(collisionSoundURL, getCollisionSoundURL); @@ -933,6 +932,8 @@ bool EntityItem::setProperties(const EntityItemProperties& properties) { SET_ENTITY_PROPERTY_FROM_PROPERTIES(gravity, updateGravity); SET_ENTITY_PROPERTY_FROM_PROPERTIES(acceleration, setAcceleration); SET_ENTITY_PROPERTY_FROM_PROPERTIES(damping, updateDamping); + SET_ENTITY_PROPERTY_FROM_PROPERTIES(restitution, updateRestitution); + SET_ENTITY_PROPERTY_FROM_PROPERTIES(friction, updateFriction); SET_ENTITY_PROPERTY_FROM_PROPERTIES(lifetime, updateLifetime); SET_ENTITY_PROPERTY_FROM_PROPERTIES(script, setScript); SET_ENTITY_PROPERTY_FROM_PROPERTIES(collisionSoundURL, setCollisionSoundURL); @@ -1267,6 +1268,32 @@ void EntityItem::updateCollisionsWillMove(bool value) { } } +void EntityItem::updateRestitution(float value) { + float clampedValue = glm::max(glm::min(ENTITY_ITEM_MAX_RESTITUTION, value), ENTITY_ITEM_MIN_RESTITUTION); + if (_restitution != clampedValue) { + _restitution = clampedValue; + _dirtyFlags |= EntityItem::DIRTY_MATERIAL; + } +} + +void EntityItem::updateFriction(float value) { + float clampedValue = glm::max(glm::min(ENTITY_ITEM_MAX_FRICTION, value), ENTITY_ITEM_MIN_FRICTION); + if (_friction != clampedValue) { + _friction = clampedValue; + _dirtyFlags |= EntityItem::DIRTY_MATERIAL; + } +} + +void EntityItem::setRestitution(float value) { + float clampedValue = glm::max(glm::min(ENTITY_ITEM_MAX_RESTITUTION, value), ENTITY_ITEM_MIN_RESTITUTION); + _restitution = clampedValue; +} + +void EntityItem::setFriction(float value) { + float clampedValue = glm::max(glm::min(ENTITY_ITEM_MAX_FRICTION, value), ENTITY_ITEM_MIN_FRICTION); + _friction = clampedValue; +} + void EntityItem::updateLifetime(float value) { if (_lifetime != value) { _lifetime = value; diff --git a/libraries/entities/src/EntityItem.h b/libraries/entities/src/EntityItem.h index b9dc14251c..4f51e8896c 100644 --- a/libraries/entities/src/EntityItem.h +++ b/libraries/entities/src/EntityItem.h @@ -221,8 +221,11 @@ public: float getDamping() const { return _damping; } void setDamping(float value) { _damping = value; } - float getRestitution() const; - float getFriction() const; + float getRestitution() const { return _restitution; } + void setRestitution(float value); + + float getFriction() const { return _friction; } + void setFriction(float value); // lifetime related properties. float getLifetime() const { return _lifetime; } /// get the lifetime in seconds for the entity @@ -314,6 +317,8 @@ public: void updateVelocityInDomainUnits(const glm::vec3& value); void updateVelocity(const glm::vec3& value); void updateDamping(float value); + void updateRestitution(float value); + void updateFriction(float value); void updateGravityInDomainUnits(const glm::vec3& value); void updateGravity(const glm::vec3& value); void updateAngularVelocity(const glm::vec3& value); @@ -375,6 +380,8 @@ protected: glm::vec3 _gravity; glm::vec3 _acceleration; float _damping; + float _restitution; + float _friction; float _lifetime; QString _script; QString _collisionSoundURL; diff --git a/libraries/entities/src/EntityItemProperties.cpp b/libraries/entities/src/EntityItemProperties.cpp index 2d68a20022..85f5a5511e 100644 --- a/libraries/entities/src/EntityItemProperties.cpp +++ b/libraries/entities/src/EntityItemProperties.cpp @@ -44,6 +44,8 @@ EntityItemProperties::EntityItemProperties() : CONSTRUCT_PROPERTY(gravity, ENTITY_ITEM_DEFAULT_GRAVITY), CONSTRUCT_PROPERTY(acceleration, ENTITY_ITEM_DEFAULT_ACCELERATION), CONSTRUCT_PROPERTY(damping, ENTITY_ITEM_DEFAULT_DAMPING), + CONSTRUCT_PROPERTY(restitution, ENTITY_ITEM_DEFAULT_RESTITUTION), + CONSTRUCT_PROPERTY(friction, ENTITY_ITEM_DEFAULT_FRICTION), CONSTRUCT_PROPERTY(lifetime, ENTITY_ITEM_DEFAULT_LIFETIME), CONSTRUCT_PROPERTY(script, ENTITY_ITEM_DEFAULT_SCRIPT), CONSTRUCT_PROPERTY(collisionSoundURL, ENTITY_ITEM_DEFAULT_COLLISION_SOUND_URL), @@ -287,6 +289,8 @@ EntityPropertyFlags EntityItemProperties::getChangedProperties() const { CHECK_PROPERTY_CHANGE(PROP_GRAVITY, gravity); CHECK_PROPERTY_CHANGE(PROP_ACCELERATION, acceleration); CHECK_PROPERTY_CHANGE(PROP_DAMPING, damping); + CHECK_PROPERTY_CHANGE(PROP_RESTITUTION, restitution); + CHECK_PROPERTY_CHANGE(PROP_FRICTION, friction); CHECK_PROPERTY_CHANGE(PROP_LIFETIME, lifetime); CHECK_PROPERTY_CHANGE(PROP_SCRIPT, script); CHECK_PROPERTY_CHANGE(PROP_COLLISION_SOUND_URL, collisionSoundURL); @@ -362,6 +366,8 @@ QScriptValue EntityItemProperties::copyToScriptValue(QScriptEngine* engine, bool COPY_PROPERTY_TO_QSCRIPTVALUE(gravity); COPY_PROPERTY_TO_QSCRIPTVALUE(acceleration); COPY_PROPERTY_TO_QSCRIPTVALUE(damping); + COPY_PROPERTY_TO_QSCRIPTVALUE(restitution); + COPY_PROPERTY_TO_QSCRIPTVALUE(friction); COPY_PROPERTY_TO_QSCRIPTVALUE(density); COPY_PROPERTY_TO_QSCRIPTVALUE(lifetime); if (!skipDefaults) { @@ -470,6 +476,8 @@ void EntityItemProperties::copyFromScriptValue(const QScriptValue& object) { COPY_PROPERTY_FROM_QSCRIPTVALUE(gravity, glmVec3, setGravity); COPY_PROPERTY_FROM_QSCRIPTVALUE(acceleration, glmVec3, setAcceleration); COPY_PROPERTY_FROM_QSCRIPTVALUE(damping, float, setDamping); + COPY_PROPERTY_FROM_QSCRIPTVALUE(restitution, float, setRestitution); + COPY_PROPERTY_FROM_QSCRIPTVALUE(friction, float, setFriction); COPY_PROPERTY_FROM_QSCRIPTVALUE(lifetime, float, setLifetime); COPY_PROPERTY_FROM_QSCRIPTVALUE(script, QString, setScript); COPY_PROPERTY_FROM_QSCRIPTVALUE(registrationPoint, glmVec3, setRegistrationPoint); @@ -662,6 +670,8 @@ bool EntityItemProperties::encodeEntityEditPacket(PacketType command, EntityItem APPEND_ENTITY_PROPERTY(PROP_GRAVITY, properties.getGravity()); APPEND_ENTITY_PROPERTY(PROP_ACCELERATION, properties.getAcceleration()); APPEND_ENTITY_PROPERTY(PROP_DAMPING, properties.getDamping()); + APPEND_ENTITY_PROPERTY(PROP_RESTITUTION, properties.getRestitution()); + APPEND_ENTITY_PROPERTY(PROP_FRICTION, properties.getFriction()); APPEND_ENTITY_PROPERTY(PROP_LIFETIME, properties.getLifetime()); APPEND_ENTITY_PROPERTY(PROP_SCRIPT, properties.getScript()); APPEND_ENTITY_PROPERTY(PROP_COLOR, properties.getColor()); @@ -922,6 +932,8 @@ bool EntityItemProperties::decodeEntityEditPacket(const unsigned char* data, int READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_GRAVITY, glm::vec3, setGravity); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_ACCELERATION, glm::vec3, setAcceleration); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_DAMPING, float, setDamping); + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_RESTITUTION, float, setRestitution); + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_FRICTION, float, setFriction); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_LIFETIME, float, setLifetime); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_SCRIPT,QString, setScript); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_COLOR, xColor, setColor); @@ -1036,6 +1048,8 @@ void EntityItemProperties::markAllChanged() { _gravityChanged = true; _accelerationChanged = true; _dampingChanged = true; + _restitutionChanged = true; + _frictionChanged = true; _lifetimeChanged = true; _userDataChanged = true; _simulatorIDChanged = true; diff --git a/libraries/entities/src/EntityItemProperties.h b/libraries/entities/src/EntityItemProperties.h index 7d8cbfe9b1..530013bbb6 100644 --- a/libraries/entities/src/EntityItemProperties.h +++ b/libraries/entities/src/EntityItemProperties.h @@ -95,6 +95,8 @@ public: DEFINE_PROPERTY_REF(PROP_GRAVITY, Gravity, gravity, glm::vec3); DEFINE_PROPERTY_REF(PROP_ACCELERATION, Acceleration, acceleration, glm::vec3); DEFINE_PROPERTY(PROP_DAMPING, Damping, damping, float); + DEFINE_PROPERTY(PROP_RESTITUTION, Restitution, restitution, float); + DEFINE_PROPERTY(PROP_FRICTION, Friction, friction, float); DEFINE_PROPERTY(PROP_LIFETIME, Lifetime, lifetime, float); DEFINE_PROPERTY_REF(PROP_SCRIPT, Script, script, QString); DEFINE_PROPERTY_REF(PROP_COLLISION_SOUND_URL, CollisionSoundURL, collisionSoundURL, QString); @@ -243,6 +245,8 @@ inline QDebug operator<<(QDebug debug, const EntityItemProperties& properties) { DEBUG_PROPERTY_IF_CHANGED(debug, properties, Gravity, gravity, ""); DEBUG_PROPERTY_IF_CHANGED(debug, properties, Acceleration, acceleration, "in meters per second"); DEBUG_PROPERTY_IF_CHANGED(debug, properties, Damping, damping, ""); + DEBUG_PROPERTY_IF_CHANGED(debug, properties, Restitution, restitution, ""); + DEBUG_PROPERTY_IF_CHANGED(debug, properties, Friction, friction, ""); DEBUG_PROPERTY_IF_CHANGED(debug, properties, Lifetime, lifetime, ""); DEBUG_PROPERTY_IF_CHANGED(debug, properties, Script, script, ""); DEBUG_PROPERTY_IF_CHANGED(debug, properties, CollisionSoundURL, collisionSoundURL, ""); diff --git a/libraries/entities/src/EntityItemPropertiesDefaults.h b/libraries/entities/src/EntityItemPropertiesDefaults.h index ae44322377..b33e6de1ac 100644 --- a/libraries/entities/src/EntityItemPropertiesDefaults.h +++ b/libraries/entities/src/EntityItemPropertiesDefaults.h @@ -53,6 +53,14 @@ const glm::vec3 ENTITY_ITEM_DEFAULT_ACCELERATION = ENTITY_ITEM_ZERO_VEC3; const float ENTITY_ITEM_DEFAULT_DAMPING = 0.39347f; // approx timescale = 2.0 sec (see damping timescale formula in header) const float ENTITY_ITEM_DEFAULT_ANGULAR_DAMPING = 0.39347f; // approx timescale = 2.0 sec (see damping timescale formula in header) +const float ENTITY_ITEM_MIN_RESTITUTION = 0.0f; +const float ENTITY_ITEM_MAX_RESTITUTION = 0.99f; +const float ENTITY_ITEM_DEFAULT_RESTITUTION = 0.5f; + +const float ENTITY_ITEM_MIN_FRICTION = 0.0f; +const float ENTITY_ITEM_MAX_FRICTION = 0.99f; +const float ENTITY_ITEM_DEFAULT_FRICTION = 0.5f; + const bool ENTITY_ITEM_DEFAULT_IGNORE_FOR_COLLISIONS = false; const bool ENTITY_ITEM_DEFAULT_COLLISIONS_WILL_MOVE = false; diff --git a/libraries/entities/src/EntityPropertyFlags.h b/libraries/entities/src/EntityPropertyFlags.h index 66ec70ae60..8a5d96e8d2 100644 --- a/libraries/entities/src/EntityPropertyFlags.h +++ b/libraries/entities/src/EntityPropertyFlags.h @@ -107,6 +107,8 @@ enum EntityPropertyList { PROP_SIMULATOR_ID, // all entities PROP_NAME, // all entities PROP_COLLISION_SOUND_URL, + PROP_RESTITUTION, + PROP_FRICTION, //////////////////////////////////////////////////////////////////////////////////////////////////// // ATTENTION: add new properties ABOVE this line diff --git a/libraries/networking/src/PacketHeaders.cpp b/libraries/networking/src/PacketHeaders.cpp index 0dcd30a55c..689c958cbb 100644 --- a/libraries/networking/src/PacketHeaders.cpp +++ b/libraries/networking/src/PacketHeaders.cpp @@ -72,7 +72,7 @@ PacketVersion versionForPacketType(PacketType packetType) { return 1; case PacketTypeEntityAddOrEdit: case PacketTypeEntityData: - return VERSION_ENTITIES_HAVE_COLLISION_SOUND_URL; + return VERSION_ENTITIES_HAVE_FRICTION; case PacketTypeEntityErase: return 2; case PacketTypeAudioStreamStats: diff --git a/libraries/networking/src/PacketHeaders.h b/libraries/networking/src/PacketHeaders.h index 01eb488c14..b4e630c677 100644 --- a/libraries/networking/src/PacketHeaders.h +++ b/libraries/networking/src/PacketHeaders.h @@ -177,5 +177,6 @@ const PacketVersion VERSION_ENTITIES_ZONE_ENTITIES_STAGE_HAS_AUTOMATIC_HOURDAY = const PacketVersion VERSION_ENTITIES_PARTICLE_ENTITIES_HAVE_TEXTURES = 23; const PacketVersion VERSION_ENTITIES_HAVE_LINE_TYPE = 24; const PacketVersion VERSION_ENTITIES_HAVE_COLLISION_SOUND_URL = 25; +const PacketVersion VERSION_ENTITIES_HAVE_FRICTION = 26; #endif // hifi_PacketHeaders_h