Merge pull request #8837 from sethalves/fix-avatar-entities-delete

fix crash when deleting avatar-entities
This commit is contained in:
Brad Hefta-Gaub 2016-10-17 21:20:27 -07:00 committed by GitHub
commit 478c0856f3
12 changed files with 200 additions and 3 deletions

View file

@ -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

View file

@ -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<QString>& out) override;

View file

@ -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();

View file

@ -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);
}

View file

@ -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; }

View file

@ -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) \
{ \

View file

@ -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: ---------------------------------------------";

View file

@ -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<QString>& out) override;

View file

@ -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();

View file

@ -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<QString>& out) override;

View file

@ -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;

View file

@ -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<QString>& out) override;