From 9b7086b1fb3f47a7bbcc547d1cd6e4fe64e1b642 Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Mon, 17 Oct 2016 16:11:37 -0700 Subject: [PATCH] added EntityItemProperties.merge function. when sending edits for avatar-entities, don't call setProperties on the entity. Fix currentFrame bug in AnimationPropertyGroup::copyToScriptValue --- .../entities/src/AnimationPropertyGroup.cpp | 23 +++- .../entities/src/AnimationPropertyGroup.h | 3 + .../entities/src/EntityEditPacketSender.cpp | 2 +- .../entities/src/EntityItemProperties.cpp | 127 ++++++++++++++++++ libraries/entities/src/EntityItemProperties.h | 2 + .../entities/src/EntityItemPropertiesMacros.h | 11 +- .../entities/src/KeyLightPropertyGroup.cpp | 9 ++ .../entities/src/KeyLightPropertyGroup.h | 3 + .../entities/src/SkyboxPropertyGroup.cpp | 6 + libraries/entities/src/SkyboxPropertyGroup.h | 3 + libraries/entities/src/StagePropertyGroup.cpp | 11 ++ libraries/entities/src/StagePropertyGroup.h | 3 + 12 files changed, 200 insertions(+), 3 deletions(-) diff --git a/libraries/entities/src/AnimationPropertyGroup.cpp b/libraries/entities/src/AnimationPropertyGroup.cpp index 015d24ab74..258d86172f 100644 --- a/libraries/entities/src/AnimationPropertyGroup.cpp +++ b/libraries/entities/src/AnimationPropertyGroup.cpp @@ -23,7 +23,7 @@ void AnimationPropertyGroup::copyToScriptValue(const EntityPropertyFlags& desire if (_animationLoop) { COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE_GETTER(PROP_ANIMATION_FPS, Animation, animation, FPS, fps, _animationLoop->getFPS); - COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE_GETTER(PROP_ANIMATION_FRAME_INDEX, Animation, animation, CurrentFrame, currentFrame, _animationLoop->getFPS); + COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE_GETTER(PROP_ANIMATION_FRAME_INDEX, Animation, animation, CurrentFrame, currentFrame, _animationLoop->getCurrentFrame); COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE_GETTER(PROP_ANIMATION_PLAYING, Animation, animation, Running, running, _animationLoop->getRunning); COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE_GETTER(PROP_ANIMATION_LOOP, Animation, animation, Loop, loop, _animationLoop->getLoop); COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE_GETTER(PROP_ANIMATION_FIRST_FRAME, Animation, animation, FirstFrame, firstFrame, _animationLoop->getFirstFrame); @@ -79,6 +79,27 @@ void AnimationPropertyGroup::copyFromScriptValue(const QScriptValue& object, boo } +void AnimationPropertyGroup::merge(const AnimationPropertyGroup& other) { + COPY_PROPERTY_IF_CHANGED(url); + if (_animationLoop) { + _fps = _animationLoop->getFPS(); + _currentFrame = _animationLoop->getCurrentFrame(); + _running = _animationLoop->getRunning(); + _loop = _animationLoop->getLoop(); + _firstFrame = _animationLoop->getFirstFrame(); + _lastFrame = _animationLoop->getLastFrame(); + _hold = _animationLoop->getHold(); + } else { + COPY_PROPERTY_IF_CHANGED(fps); + COPY_PROPERTY_IF_CHANGED(currentFrame); + COPY_PROPERTY_IF_CHANGED(running); + COPY_PROPERTY_IF_CHANGED(loop); + COPY_PROPERTY_IF_CHANGED(firstFrame); + COPY_PROPERTY_IF_CHANGED(lastFrame); + COPY_PROPERTY_IF_CHANGED(hold); + } +} + void AnimationPropertyGroup::setFromOldAnimationSettings(const QString& value) { // the animations setting is a JSON string that may contain various animation settings. // if it includes fps, currentFrame, or running, those values will be parsed out and diff --git a/libraries/entities/src/AnimationPropertyGroup.h b/libraries/entities/src/AnimationPropertyGroup.h index 4284be1eda..c9d2a03e57 100644 --- a/libraries/entities/src/AnimationPropertyGroup.h +++ b/libraries/entities/src/AnimationPropertyGroup.h @@ -38,6 +38,9 @@ public: QScriptEngine* engine, bool skipDefaults, EntityItemProperties& defaultEntityProperties) const override; virtual void copyFromScriptValue(const QScriptValue& object, bool& _defaultSettings) override; + + void merge(const AnimationPropertyGroup& other); + virtual void debugDump() const override; virtual void listChangedProperties(QList& out) override; diff --git a/libraries/entities/src/EntityEditPacketSender.cpp b/libraries/entities/src/EntityEditPacketSender.cpp index 3ea3c92b0c..4478e37003 100644 --- a/libraries/entities/src/EntityEditPacketSender.cpp +++ b/libraries/entities/src/EntityEditPacketSender.cpp @@ -63,8 +63,8 @@ void EntityEditPacketSender::queueEditAvatarEntityMessage(PacketType type, // the properties that get serialized into the avatar identity packet should be the entire set // rather than just the ones being edited. - entity->setProperties(properties); EntityItemProperties entityProperties = entity->getProperties(); + entityProperties.merge(properties); QScriptValue scriptProperties = EntityItemNonDefaultPropertiesToScriptValue(&_scriptEngine, entityProperties); QVariant variantProperties = scriptProperties.toVariant(); diff --git a/libraries/entities/src/EntityItemProperties.cpp b/libraries/entities/src/EntityItemProperties.cpp index 588c6e2977..a0142dec8f 100644 --- a/libraries/entities/src/EntityItemProperties.cpp +++ b/libraries/entities/src/EntityItemProperties.cpp @@ -749,6 +749,133 @@ void EntityItemProperties::copyFromScriptValue(const QScriptValue& object, bool _lastEdited = usecTimestampNow(); } +void EntityItemProperties::merge(const EntityItemProperties& other) { + COPY_PROPERTY_IF_CHANGED(position); + COPY_PROPERTY_IF_CHANGED(dimensions); + COPY_PROPERTY_IF_CHANGED(rotation); + COPY_PROPERTY_IF_CHANGED(density); + COPY_PROPERTY_IF_CHANGED(velocity); + COPY_PROPERTY_IF_CHANGED(gravity); + COPY_PROPERTY_IF_CHANGED(acceleration); + COPY_PROPERTY_IF_CHANGED(damping); + COPY_PROPERTY_IF_CHANGED(restitution); + COPY_PROPERTY_IF_CHANGED(friction); + COPY_PROPERTY_IF_CHANGED(lifetime); + COPY_PROPERTY_IF_CHANGED(script); + COPY_PROPERTY_IF_CHANGED(scriptTimestamp); + COPY_PROPERTY_IF_CHANGED(registrationPoint); + COPY_PROPERTY_IF_CHANGED(angularVelocity); + COPY_PROPERTY_IF_CHANGED(angularDamping); + COPY_PROPERTY_IF_CHANGED(visible); + COPY_PROPERTY_IF_CHANGED(color); + COPY_PROPERTY_IF_CHANGED(colorSpread); + COPY_PROPERTY_IF_CHANGED(colorStart); + COPY_PROPERTY_IF_CHANGED(colorFinish); + COPY_PROPERTY_IF_CHANGED(alpha); + COPY_PROPERTY_IF_CHANGED(alphaSpread); + COPY_PROPERTY_IF_CHANGED(alphaStart); + COPY_PROPERTY_IF_CHANGED(alphaFinish); + COPY_PROPERTY_IF_CHANGED(emitterShouldTrail); + COPY_PROPERTY_IF_CHANGED(modelURL); + COPY_PROPERTY_IF_CHANGED(compoundShapeURL); + COPY_PROPERTY_IF_CHANGED(localRenderAlpha); + COPY_PROPERTY_IF_CHANGED(collisionless); + COPY_PROPERTY_IF_CHANGED(collisionMask); + COPY_PROPERTY_IF_CHANGED(dynamic); + COPY_PROPERTY_IF_CHANGED(isSpotlight); + COPY_PROPERTY_IF_CHANGED(intensity); + COPY_PROPERTY_IF_CHANGED(falloffRadius); + COPY_PROPERTY_IF_CHANGED(exponent); + COPY_PROPERTY_IF_CHANGED(cutoff); + COPY_PROPERTY_IF_CHANGED(locked); + COPY_PROPERTY_IF_CHANGED(textures); + COPY_PROPERTY_IF_CHANGED(userData); + COPY_PROPERTY_IF_CHANGED(text); + COPY_PROPERTY_IF_CHANGED(lineHeight); + COPY_PROPERTY_IF_CHANGED(textColor); + COPY_PROPERTY_IF_CHANGED(backgroundColor); + COPY_PROPERTY_IF_CHANGED(shapeType); + COPY_PROPERTY_IF_CHANGED(maxParticles); + COPY_PROPERTY_IF_CHANGED(lifespan); + COPY_PROPERTY_IF_CHANGED(isEmitting); + COPY_PROPERTY_IF_CHANGED(emitRate); + COPY_PROPERTY_IF_CHANGED(emitSpeed); + COPY_PROPERTY_IF_CHANGED(speedSpread); + COPY_PROPERTY_IF_CHANGED(emitOrientation); + COPY_PROPERTY_IF_CHANGED(emitDimensions); + COPY_PROPERTY_IF_CHANGED(emitRadiusStart); + COPY_PROPERTY_IF_CHANGED(polarStart); + COPY_PROPERTY_IF_CHANGED(polarFinish); + COPY_PROPERTY_IF_CHANGED(azimuthStart); + COPY_PROPERTY_IF_CHANGED(azimuthFinish); + COPY_PROPERTY_IF_CHANGED(emitAcceleration); + COPY_PROPERTY_IF_CHANGED(accelerationSpread); + COPY_PROPERTY_IF_CHANGED(particleRadius); + COPY_PROPERTY_IF_CHANGED(radiusSpread); + COPY_PROPERTY_IF_CHANGED(radiusStart); + COPY_PROPERTY_IF_CHANGED(radiusFinish); + COPY_PROPERTY_IF_CHANGED(marketplaceID); + COPY_PROPERTY_IF_CHANGED(name); + COPY_PROPERTY_IF_CHANGED(collisionSoundURL); + + COPY_PROPERTY_IF_CHANGED(backgroundMode); + COPY_PROPERTY_IF_CHANGED(sourceUrl); + COPY_PROPERTY_IF_CHANGED(voxelVolumeSize); + COPY_PROPERTY_IF_CHANGED(voxelData); + COPY_PROPERTY_IF_CHANGED(voxelSurfaceStyle); + COPY_PROPERTY_IF_CHANGED(lineWidth); + COPY_PROPERTY_IF_CHANGED(linePoints); + COPY_PROPERTY_IF_CHANGED(href); + COPY_PROPERTY_IF_CHANGED(description); + COPY_PROPERTY_IF_CHANGED(faceCamera); + COPY_PROPERTY_IF_CHANGED(actionData); + COPY_PROPERTY_IF_CHANGED(normals); + COPY_PROPERTY_IF_CHANGED(strokeWidths); + COPY_PROPERTY_IF_CHANGED(created); + + _animation.merge(other._animation); + _keyLight.merge(other._keyLight); + _skybox.merge(other._skybox); + _stage.merge(other._stage); + + COPY_PROPERTY_IF_CHANGED(xTextureURL); + COPY_PROPERTY_IF_CHANGED(yTextureURL); + COPY_PROPERTY_IF_CHANGED(zTextureURL); + + COPY_PROPERTY_IF_CHANGED(xNNeighborID); + COPY_PROPERTY_IF_CHANGED(yNNeighborID); + COPY_PROPERTY_IF_CHANGED(zNNeighborID); + + COPY_PROPERTY_IF_CHANGED(xPNeighborID); + COPY_PROPERTY_IF_CHANGED(yPNeighborID); + COPY_PROPERTY_IF_CHANGED(zPNeighborID); + + COPY_PROPERTY_IF_CHANGED(parentID); + COPY_PROPERTY_IF_CHANGED(parentJointIndex); + COPY_PROPERTY_IF_CHANGED(queryAACube); + + COPY_PROPERTY_IF_CHANGED(localPosition); + COPY_PROPERTY_IF_CHANGED(localRotation); + COPY_PROPERTY_IF_CHANGED(localVelocity); + COPY_PROPERTY_IF_CHANGED(localAngularVelocity); + + COPY_PROPERTY_IF_CHANGED(jointRotationsSet); + COPY_PROPERTY_IF_CHANGED(jointRotations); + COPY_PROPERTY_IF_CHANGED(jointTranslationsSet); + COPY_PROPERTY_IF_CHANGED(jointTranslations); + COPY_PROPERTY_IF_CHANGED(shape); + + COPY_PROPERTY_IF_CHANGED(flyingAllowed); + COPY_PROPERTY_IF_CHANGED(ghostingAllowed); + + COPY_PROPERTY_IF_CHANGED(clientOnly); + COPY_PROPERTY_IF_CHANGED(owningAvatarID); + + COPY_PROPERTY_IF_CHANGED(dpi); + + _lastEdited = usecTimestampNow(); +} + QScriptValue EntityItemPropertiesToScriptValue(QScriptEngine* engine, const EntityItemProperties& properties) { return properties.copyToScriptValue(engine, false); } diff --git a/libraries/entities/src/EntityItemProperties.h b/libraries/entities/src/EntityItemProperties.h index 809828226a..d5cce92f87 100644 --- a/libraries/entities/src/EntityItemProperties.h +++ b/libraries/entities/src/EntityItemProperties.h @@ -68,6 +68,8 @@ public: EntityItemProperties(EntityPropertyFlags desiredProperties = EntityPropertyFlags()); virtual ~EntityItemProperties() = default; + void merge(const EntityItemProperties& other); + EntityTypes::EntityType getType() const { return _type; } void setType(EntityTypes::EntityType type) { _type = type; } diff --git a/libraries/entities/src/EntityItemPropertiesMacros.h b/libraries/entities/src/EntityItemPropertiesMacros.h index f386a474d8..278d945ab0 100644 --- a/libraries/entities/src/EntityItemPropertiesMacros.h +++ b/libraries/entities/src/EntityItemPropertiesMacros.h @@ -305,7 +305,16 @@ inline xColor xColor_convertFromScriptValue(const QScriptValue& v, bool& isValid } return newValue; } - + + +#define COPY_PROPERTY_IF_CHANGED(P) \ +{ \ + if (other._##P##Changed) { \ + _##P = other._##P; \ + } \ +} + + #define COPY_PROPERTY_FROM_QSCRIPTVALUE(P, T, S) \ { \ diff --git a/libraries/entities/src/KeyLightPropertyGroup.cpp b/libraries/entities/src/KeyLightPropertyGroup.cpp index cac47c907a..f1dae18adc 100644 --- a/libraries/entities/src/KeyLightPropertyGroup.cpp +++ b/libraries/entities/src/KeyLightPropertyGroup.cpp @@ -49,6 +49,15 @@ void KeyLightPropertyGroup::copyFromScriptValue(const QScriptValue& object, bool COPY_PROPERTY_FROM_QSCRIPTVALUE_GETTER(keyLightDirection, glmVec3, setDirection, getDirection); } +void KeyLightPropertyGroup::merge(const KeyLightPropertyGroup& other) { + COPY_PROPERTY_IF_CHANGED(color); + COPY_PROPERTY_IF_CHANGED(intensity); + COPY_PROPERTY_IF_CHANGED(ambientIntensity); + COPY_PROPERTY_IF_CHANGED(direction); + COPY_PROPERTY_IF_CHANGED(ambientURL); +} + + void KeyLightPropertyGroup::debugDump() const { qDebug() << " KeyLightPropertyGroup: ---------------------------------------------"; diff --git a/libraries/entities/src/KeyLightPropertyGroup.h b/libraries/entities/src/KeyLightPropertyGroup.h index 029a257bf1..21ef074679 100644 --- a/libraries/entities/src/KeyLightPropertyGroup.h +++ b/libraries/entities/src/KeyLightPropertyGroup.h @@ -34,6 +34,9 @@ public: QScriptEngine* engine, bool skipDefaults, EntityItemProperties& defaultEntityProperties) const override; virtual void copyFromScriptValue(const QScriptValue& object, bool& _defaultSettings) override; + + void merge(const KeyLightPropertyGroup& other); + virtual void debugDump() const override; virtual void listChangedProperties(QList& out) override; diff --git a/libraries/entities/src/SkyboxPropertyGroup.cpp b/libraries/entities/src/SkyboxPropertyGroup.cpp index 0fd00bfe6e..60800bd819 100644 --- a/libraries/entities/src/SkyboxPropertyGroup.cpp +++ b/libraries/entities/src/SkyboxPropertyGroup.cpp @@ -27,6 +27,12 @@ void SkyboxPropertyGroup::copyFromScriptValue(const QScriptValue& object, bool& COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE(skybox, url, QString, setURL); } +void SkyboxPropertyGroup::merge(const SkyboxPropertyGroup& other) { + COPY_PROPERTY_IF_CHANGED(color); + COPY_PROPERTY_IF_CHANGED(url); +} + + void SkyboxPropertyGroup::debugDump() const { qDebug() << " SkyboxPropertyGroup: ---------------------------------------------"; qDebug() << " Color:" << getColor() << " has changed:" << colorChanged(); diff --git a/libraries/entities/src/SkyboxPropertyGroup.h b/libraries/entities/src/SkyboxPropertyGroup.h index 8b485353b8..57cfe095ee 100644 --- a/libraries/entities/src/SkyboxPropertyGroup.h +++ b/libraries/entities/src/SkyboxPropertyGroup.h @@ -34,6 +34,9 @@ public: QScriptEngine* engine, bool skipDefaults, EntityItemProperties& defaultEntityProperties) const override; virtual void copyFromScriptValue(const QScriptValue& object, bool& _defaultSettings) override; + + void merge(const SkyboxPropertyGroup& other); + virtual void debugDump() const override; virtual void listChangedProperties(QList& out) override; diff --git a/libraries/entities/src/StagePropertyGroup.cpp b/libraries/entities/src/StagePropertyGroup.cpp index 0c10795d6f..d8328164bf 100644 --- a/libraries/entities/src/StagePropertyGroup.cpp +++ b/libraries/entities/src/StagePropertyGroup.cpp @@ -55,6 +55,17 @@ void StagePropertyGroup::copyFromScriptValue(const QScriptValue& object, bool& _ COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE(stage, automaticHourDay, bool, setAutomaticHourDay); } +void StagePropertyGroup::merge(const StagePropertyGroup& other) { + COPY_PROPERTY_IF_CHANGED(sunModelEnabled); + COPY_PROPERTY_IF_CHANGED(latitude); + COPY_PROPERTY_IF_CHANGED(longitude); + COPY_PROPERTY_IF_CHANGED(altitude); + COPY_PROPERTY_IF_CHANGED(day); + COPY_PROPERTY_IF_CHANGED(hour); + COPY_PROPERTY_IF_CHANGED(automaticHourDay); +} + + void StagePropertyGroup::debugDump() const { qDebug() << " StagePropertyGroup: ---------------------------------------------"; qDebug() << " _sunModelEnabled:" << _sunModelEnabled; diff --git a/libraries/entities/src/StagePropertyGroup.h b/libraries/entities/src/StagePropertyGroup.h index 80f02f851a..1b6b234cf5 100644 --- a/libraries/entities/src/StagePropertyGroup.h +++ b/libraries/entities/src/StagePropertyGroup.h @@ -34,6 +34,9 @@ public: QScriptEngine* engine, bool skipDefaults, EntityItemProperties& defaultEntityProperties) const override; virtual void copyFromScriptValue(const QScriptValue& object, bool& _defaultSettings) override; + + void merge(const StagePropertyGroup& other); + virtual void debugDump() const override; virtual void listChangedProperties(QList& out) override;