From 9b54924524783b3731c2a09f562705902f6ad2a5 Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Mon, 30 Nov 2015 16:21:14 -0800 Subject: [PATCH] edit.js can now manipulate children without flipping the table --- .../entities/src/EntityItemProperties.cpp | 4 ++++ libraries/entities/src/EntityItemProperties.h | 2 ++ .../entities/src/EntityScriptingInterface.cpp | 23 ++++++++++++++++++- libraries/shared/src/SpatiallyNestable.cpp | 3 +++ libraries/shared/src/SpatiallyNestable.h | 2 +- 5 files changed, 32 insertions(+), 2 deletions(-) diff --git a/libraries/entities/src/EntityItemProperties.cpp b/libraries/entities/src/EntityItemProperties.cpp index 2ecb42a9ce..52f98be208 100644 --- a/libraries/entities/src/EntityItemProperties.cpp +++ b/libraries/entities/src/EntityItemProperties.cpp @@ -1789,3 +1789,7 @@ QList EntityItemProperties::listChangedProperties() { return out; } + +bool EntityItemProperties::parentDependentPropertyChanged() { + return localPositionChanged() || positionChanged() || localRotationChanged() || rotationChanged(); +} diff --git a/libraries/entities/src/EntityItemProperties.h b/libraries/entities/src/EntityItemProperties.h index 6bb6b1914c..11d29c5d57 100644 --- a/libraries/entities/src/EntityItemProperties.h +++ b/libraries/entities/src/EntityItemProperties.h @@ -83,6 +83,8 @@ public: { return (float)(usecTimestampNow() - getLastEdited()) / (float)USECS_PER_SECOND; } EntityPropertyFlags getChangedProperties() const; + bool parentDependentPropertyChanged(); // was there a changed in a property that requires parent info to interpret? + AACube getMaximumAACube() const; AABox getAABox() const; diff --git a/libraries/entities/src/EntityScriptingInterface.cpp b/libraries/entities/src/EntityScriptingInterface.cpp index ca963aca6d..39da57f3a8 100644 --- a/libraries/entities/src/EntityScriptingInterface.cpp +++ b/libraries/entities/src/EntityScriptingInterface.cpp @@ -201,10 +201,31 @@ QUuid EntityScriptingInterface::editEntity(QUuid id, EntityItemProperties script bool updatedEntity = false; _entityTree->withWriteLock([&] { + if (scriptSideProperties.parentDependentPropertyChanged()) { + // if the script sets a location property but didn't include parent information, grab the needed + // properties from the entity. + bool recompute = false; + EntityItemPointer entity = nullptr; + if (!scriptSideProperties.parentIDChanged()) { + entity = _entityTree->findEntityByEntityItemID(entityID); + scriptSideProperties.setParentID(entity->getParentID()); + recompute = true; + } + if (!scriptSideProperties.parentJointIndexChanged()) { + if (!entity) { + entity = _entityTree->findEntityByEntityItemID(entityID); + } + scriptSideProperties.setParentJointIndex(entity->getParentJointIndex()); + recompute = true; + } + if (recompute) { + properties = convertLocationFromScriptSemantics(scriptSideProperties); + } + } + updatedEntity = _entityTree->updateEntity(entityID, properties); }); - if (!updatedEntity) { return QUuid(); } diff --git a/libraries/shared/src/SpatiallyNestable.cpp b/libraries/shared/src/SpatiallyNestable.cpp index 31a0dd5647..9b2e809063 100644 --- a/libraries/shared/src/SpatiallyNestable.cpp +++ b/libraries/shared/src/SpatiallyNestable.cpp @@ -218,6 +218,7 @@ void SpatiallyNestable::setOrientation(glm::quat orientation) { } const Transform SpatiallyNestable::getTransform() const { + // return a world-space transform for this object's location Transform parentTransform = getParentTransform(); Transform result; _transformLock.withReadLock([&] { @@ -227,6 +228,8 @@ const Transform SpatiallyNestable::getTransform() const { } const Transform SpatiallyNestable::getTransform(int jointIndex) const { + // this returns the world-space transform for this object. It find its parent's transform (which may + // cause this object's parent to query its parent, etc) and multiplies this object's local transform onto it. Transform worldTransform = getTransform(); Transform jointInObjectFrame = getJointTransformInObjectFrame(jointIndex); Transform jointInWorldFrame; diff --git a/libraries/shared/src/SpatiallyNestable.h b/libraries/shared/src/SpatiallyNestable.h index 8805e72af5..6e0afa24a5 100644 --- a/libraries/shared/src/SpatiallyNestable.h +++ b/libraries/shared/src/SpatiallyNestable.h @@ -69,7 +69,7 @@ public: virtual glm::vec3 getScale() const; virtual void setScale(glm::vec3 scale); - // get world location of a specific joint + // get world-frame values for a specific joint virtual const Transform getTransform(int jointIndex) const; virtual glm::vec3 getPosition(int jointIndex) const; virtual glm::vec3 getScale(int jointIndex) const;