From 1f0150f65f4635d00d33d531be46108884ff920f Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Sat, 5 Dec 2015 15:12:44 -0800 Subject: [PATCH 01/15] add parentID and parentJointIndex to terse logging --- libraries/entities/src/EntityItemProperties.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/libraries/entities/src/EntityItemProperties.cpp b/libraries/entities/src/EntityItemProperties.cpp index 52f98be208..9ff5d73616 100644 --- a/libraries/entities/src/EntityItemProperties.cpp +++ b/libraries/entities/src/EntityItemProperties.cpp @@ -1780,6 +1780,12 @@ QList EntityItemProperties::listChangedProperties() { if (zPNeighborIDChanged()) { out += "zPNeighborID"; } + if (parentIDChanged()) { + out += "parentID"; + } + if (parentJointIndexChanged()) { + out += "parentJointIndex"; + } getAnimation().listChangedProperties(out); getKeyLight().listChangedProperties(out); From d518a4573e7965e7693fa0abbd683ff92878bca1 Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Sat, 5 Dec 2015 15:15:33 -0800 Subject: [PATCH 02/15] if script sets parent or jointIndex, don't pop entity off to someplace --- .../entities/src/EntityScriptingInterface.cpp | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/libraries/entities/src/EntityScriptingInterface.cpp b/libraries/entities/src/EntityScriptingInterface.cpp index 2551b2727b..23fbac13cf 100644 --- a/libraries/entities/src/EntityScriptingInterface.cpp +++ b/libraries/entities/src/EntityScriptingInterface.cpp @@ -202,7 +202,7 @@ 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 + // if the script set a location property but didn't include parent information, grab the needed // properties from the entity. if (!scriptSideProperties.parentIDChanged() || !scriptSideProperties.parentJointIndexChanged()) { EntityItemPointer entity = _entityTree->findEntityByEntityItemID(entityID); @@ -214,6 +214,18 @@ QUuid EntityScriptingInterface::editEntity(QUuid id, EntityItemProperties script } } } + if (scriptSideProperties.parentIDChanged() || scriptSideProperties.parentJointIndexChanged()) { + // if the script set parentID or parentJointIndex but didn't include position and rotation, grab + // the missing properties from the entity + if (!scriptSideProperties.localPositionChanged() && !scriptSideProperties.positionChanged()) { + EntityItemPointer entity = _entityTree->findEntityByEntityItemID(entityID); + properties.setPosition(entity->getPosition()); + } + if (!scriptSideProperties.localRotationChanged() && !scriptSideProperties.rotationChanged()) { + EntityItemPointer entity = _entityTree->findEntityByEntityItemID(entityID); + properties.setRotation(entity->getOrientation()); + } + } properties = convertLocationFromScriptSemantics(properties); updatedEntity = _entityTree->updateEntity(entityID, properties); }); From 138125faab4ea4a43ad960243702edc12f6ff61a Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Sun, 6 Dec 2015 05:42:51 -0800 Subject: [PATCH 03/15] fix-up parentJointIndex in terse logging --- libraries/entities/src/EntityTree.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/libraries/entities/src/EntityTree.cpp b/libraries/entities/src/EntityTree.cpp index 2752473b07..892b186a25 100644 --- a/libraries/entities/src/EntityTree.cpp +++ b/libraries/entities/src/EntityTree.cpp @@ -740,6 +740,14 @@ void EntityTree::fixupTerseEditLogging(EntityItemProperties& properties, QList= 0) { + quint16 value = properties.getParentJointIndex(); + changedProperties[index] = QString("parentJointIndex:") + QString::number((int)value); + } + } } int EntityTree::processEditPacketData(NLPacket& packet, const unsigned char* editData, int maxLength, From 9a80c4d681005bfb805410ff0d95de35b67ea196 Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Sun, 6 Dec 2015 05:43:23 -0800 Subject: [PATCH 04/15] call locationChanged on children of joints when joints change --- interface/src/avatar/Avatar.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/interface/src/avatar/Avatar.cpp b/interface/src/avatar/Avatar.cpp index 2c8d970336..7d407046d6 100644 --- a/interface/src/avatar/Avatar.cpp +++ b/interface/src/avatar/Avatar.cpp @@ -201,6 +201,7 @@ void Avatar::simulate(float deltaTime) { _skeletonModel.getRig()->copyJointsFromJointData(_jointData); _skeletonModel.simulate(deltaTime, _hasNewJointRotations || _hasNewJointTranslations); simulateAttachments(deltaTime); + locationChanged(); // joints changed, so if there are any children, update them. _hasNewJointRotations = false; _hasNewJointTranslations = false; } From edc312199ddaac0efea77f3912e94d0111b7bffc Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Sun, 6 Dec 2015 06:16:47 -0800 Subject: [PATCH 05/15] rename a method to match convention in https://docs.google.com/document/d/1LFCmkK26JMVs8Ci33L4Yrle6lL7UU7oxthsWfddzZXQ/edit# --- libraries/shared/src/SpatiallyNestable.cpp | 4 ++-- libraries/shared/src/SpatiallyNestable.h | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/libraries/shared/src/SpatiallyNestable.cpp b/libraries/shared/src/SpatiallyNestable.cpp index 0d7d2a7652..0a2310e43e 100644 --- a/libraries/shared/src/SpatiallyNestable.cpp +++ b/libraries/shared/src/SpatiallyNestable.cpp @@ -232,7 +232,7 @@ const Transform SpatiallyNestable::getTransform(int jointIndex) const { // this returns the world-space transform for this object. It finds 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 jointInObjectFrame = getJointTransformInModelFrame(jointIndex); Transform jointInWorldFrame; Transform::mult(jointInWorldFrame, worldTransform, jointInObjectFrame); return jointInWorldFrame; @@ -339,7 +339,7 @@ QList SpatiallyNestable::getChildren() const { return children; } -const Transform SpatiallyNestable::getJointTransformInObjectFrame(int jointIndex) const { +const Transform SpatiallyNestable::getJointTransformInModelFrame(int jointIndex) const { Transform jointInObjectFrame; glm::vec3 position = getJointTranslation(jointIndex); glm::quat orientation = getJointRotation(jointIndex); diff --git a/libraries/shared/src/SpatiallyNestable.h b/libraries/shared/src/SpatiallyNestable.h index f3056d9a4f..da7aff6b52 100644 --- a/libraries/shared/src/SpatiallyNestable.h +++ b/libraries/shared/src/SpatiallyNestable.h @@ -91,7 +91,7 @@ public: NestableTypes::NestableType getNestableType() const { return _nestableType; } // this object's frame - virtual const Transform getJointTransformInObjectFrame(int jointIndex) const; + virtual const Transform getJointTransformInModelFrame(int jointIndex) const; virtual glm::quat getJointRotation(int index) const { assert(false); return glm::quat(); } virtual glm::vec3 getJointTranslation(int index) const { assert(false); return glm::vec3(); } From a948ae5f1943f7a4e8d51244f80a6ef7348f0e26 Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Sun, 6 Dec 2015 10:48:00 -0800 Subject: [PATCH 06/15] children of avatar joints might be right, now --- interface/src/avatar/Avatar.cpp | 11 ++++++++++ interface/src/avatar/Avatar.h | 3 +++ libraries/animation/src/Rig.cpp | 20 +++++++++++++++++++ libraries/animation/src/Rig.h | 6 ++++-- .../src/RenderableModelEntityItem.cpp | 8 ++++---- .../src/RenderableModelEntityItem.h | 6 +++--- libraries/entities/src/EntityItem.h | 6 +++--- libraries/render-utils/src/Model.cpp | 8 ++++++++ libraries/render-utils/src/Model.h | 4 ++++ libraries/shared/src/SpatiallyNestable.cpp | 12 +++++------ libraries/shared/src/SpatiallyNestable.h | 4 ++-- 11 files changed, 68 insertions(+), 20 deletions(-) diff --git a/interface/src/avatar/Avatar.cpp b/interface/src/avatar/Avatar.cpp index 7d407046d6..29423f4d79 100644 --- a/interface/src/avatar/Avatar.cpp +++ b/interface/src/avatar/Avatar.cpp @@ -869,6 +869,17 @@ glm::vec3 Avatar::getJointTranslation(int index) const { return translation; } +glm::quat Avatar::getJointRotationInModelFrame(int index) const { + glm::quat rotation; + _skeletonModel.getJointRotationInModelFrame(index, rotation); + return Quaternions::Y_180 * rotation; +} + +glm::vec3 Avatar::getJointTranslationInModelFrame(int index) const { + glm::vec3 translation; + _skeletonModel.getJointTranslationInModelFrame(index, translation); + return Quaternions::Y_180 * translation; +} int Avatar::getJointIndex(const QString& name) const { if (QThread::currentThread() != thread()) { diff --git a/interface/src/avatar/Avatar.h b/interface/src/avatar/Avatar.h index dc5014a7ea..3f8b955b6c 100644 --- a/interface/src/avatar/Avatar.h +++ b/interface/src/avatar/Avatar.h @@ -108,6 +108,9 @@ public: virtual int getJointIndex(const QString& name) const; virtual QStringList getJointNames() const; + virtual glm::quat getJointRotationInModelFrame(int index) const; + virtual glm::vec3 getJointTranslationInModelFrame(int index) const; + virtual void setFaceModelURL(const QUrl& faceModelURL); virtual void setSkeletonModelURL(const QUrl& skeletonModelURL); virtual void setAttachmentData(const QVector& attachmentData); diff --git a/libraries/animation/src/Rig.cpp b/libraries/animation/src/Rig.cpp index 8fb56ed699..04c9ba173f 100644 --- a/libraries/animation/src/Rig.cpp +++ b/libraries/animation/src/Rig.cpp @@ -373,6 +373,16 @@ bool Rig::getJointRotation(int jointIndex, glm::quat& rotation) const { } } +bool Rig::getJointRotationInModelFrame(int jointIndex, glm::quat& rotation) const { + QReadLocker readLock(&_externalPoseSetLock); + if (jointIndex >= 0 && jointIndex < (int)_externalPoseSet._absolutePoses.size()) { + rotation = _externalPoseSet._absolutePoses[jointIndex].rot; + return true; + } else { + return false; + } +} + bool Rig::getJointTranslation(int jointIndex, glm::vec3& translation) const { QReadLocker readLock(&_externalPoseSetLock); if (jointIndex >= 0 && jointIndex < (int)_externalPoseSet._relativePoses.size()) { @@ -383,6 +393,16 @@ bool Rig::getJointTranslation(int jointIndex, glm::vec3& translation) const { } } +bool Rig::getJointTranslationInModelFrame(int jointIndex, glm::vec3& translation) const { + QReadLocker readLock(&_externalPoseSetLock); + if (jointIndex >= 0 && jointIndex < (int)_externalPoseSet._absolutePoses.size()) { + translation = _externalPoseSet._absolutePoses[jointIndex].trans; + return true; + } else { + return false; + } +} + bool Rig::getJointCombinedRotation(int jointIndex, glm::quat& result, const glm::quat& rotation) const { // AJT: TODO: used by attachments ASSERT(false); diff --git a/libraries/animation/src/Rig.h b/libraries/animation/src/Rig.h index 64ce8c52ef..956a07c543 100644 --- a/libraries/animation/src/Rig.h +++ b/libraries/animation/src/Rig.h @@ -129,10 +129,12 @@ public: // geometry space (thread-safe) bool getJointRotation(int jointIndex, glm::quat& rotation) const; - - // geometry space (thread-safe) bool getJointTranslation(int jointIndex, glm::vec3& translation) const; + // model space (thread-safe) + bool getJointRotationInModelFrame(int jointIndex, glm::quat& rotation) const; + bool getJointTranslationInModelFrame(int jointIndex, glm::vec3& translation) const; + // legacy bool getJointCombinedRotation(int jointIndex, glm::quat& result, const glm::quat& rotation) const; diff --git a/libraries/entities-renderer/src/RenderableModelEntityItem.cpp b/libraries/entities-renderer/src/RenderableModelEntityItem.cpp index 393c0dc0dc..8f2b54b35a 100644 --- a/libraries/entities-renderer/src/RenderableModelEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderableModelEntityItem.cpp @@ -565,20 +565,20 @@ bool RenderableModelEntityItem::contains(const glm::vec3& point) const { return false; } -glm::quat RenderableModelEntityItem::getJointRotation(int index) const { +glm::quat RenderableModelEntityItem::getJointRotationInModelFrame(int index) const { if (_model) { glm::quat result; - if (_model->getJointRotation(index, result)) { + if (_model->getJointRotationInModelFrame(index, result)) { return result; } } return glm::quat(); } -glm::vec3 RenderableModelEntityItem::getJointTranslation(int index) const { +glm::vec3 RenderableModelEntityItem::getJointTranslationInModelFrame(int index) const { if (_model) { glm::vec3 result; - if (_model->getJointTranslation(index, result)) { + if (_model->getJointTranslationInModelFrame(index, result)) { return result; } } diff --git a/libraries/entities-renderer/src/RenderableModelEntityItem.h b/libraries/entities-renderer/src/RenderableModelEntityItem.h index 2ee4aeb73e..e73289174c 100644 --- a/libraries/entities-renderer/src/RenderableModelEntityItem.h +++ b/libraries/entities-renderer/src/RenderableModelEntityItem.h @@ -67,9 +67,9 @@ public: virtual bool contains(const glm::vec3& point) const override; - // these are in the frame of this object - virtual glm::quat getJointRotation(int index) const; - virtual glm::vec3 getJointTranslation(int index) const; + // these are in the frame of this object (model space) + virtual glm::quat getJointRotationInModelFrame(int index) const; + virtual glm::vec3 getJointTranslationInModelFrame(int index) const; private: void remapTextures(); diff --git a/libraries/entities/src/EntityItem.h b/libraries/entities/src/EntityItem.h index 761208cb06..bfc178f2c3 100644 --- a/libraries/entities/src/EntityItem.h +++ b/libraries/entities/src/EntityItem.h @@ -378,9 +378,9 @@ public: QList getActionsOfType(EntityActionType typeToGet); - // these are in the frame of this object - virtual glm::quat getJointRotation(int index) const { return glm::quat(); } - virtual glm::vec3 getJointTranslation(int index) const { return glm::vec3(0.0f); } + // these are in the frame of this object (model space) + virtual glm::quat getJointRotationInModelFrame(int index) const { return glm::quat(); } + virtual glm::vec3 getJointTranslationInModelFrame(int index) const { return glm::vec3(0.0f); } protected: diff --git a/libraries/render-utils/src/Model.cpp b/libraries/render-utils/src/Model.cpp index f566d0879d..82b3228f0b 100644 --- a/libraries/render-utils/src/Model.cpp +++ b/libraries/render-utils/src/Model.cpp @@ -765,6 +765,14 @@ bool Model::getJointTranslation(int jointIndex, glm::vec3& translation) const { return _rig->getJointTranslation(jointIndex, translation); } +bool Model::getJointRotationInModelFrame(int jointIndex, glm::quat& rotation) const { + return _rig->getJointRotationInModelFrame(jointIndex, rotation); +} + +bool Model::getJointTranslationInModelFrame(int jointIndex, glm::vec3& translation) const { + return _rig->getJointTranslationInModelFrame(jointIndex, translation); +} + bool Model::getJointCombinedRotation(int jointIndex, glm::quat& rotation) const { return _rig->getJointCombinedRotation(jointIndex, rotation, _rotation); } diff --git a/libraries/render-utils/src/Model.h b/libraries/render-utils/src/Model.h index e8e9f93986..287e0046f0 100644 --- a/libraries/render-utils/src/Model.h +++ b/libraries/render-utils/src/Model.h @@ -166,6 +166,10 @@ public: bool getJointRotation(int jointIndex, glm::quat& rotation) const; bool getJointTranslation(int jointIndex, glm::vec3& translation) const; + // model frame + bool getJointRotationInModelFrame(int jointIndex, glm::quat& rotation) const; + bool getJointTranslationInModelFrame(int jointIndex, glm::vec3& translation) const; + /// Returns the index of the parent of the indexed joint, or -1 if not found. int getParentJointIndex(int jointIndex) const; diff --git a/libraries/shared/src/SpatiallyNestable.cpp b/libraries/shared/src/SpatiallyNestable.cpp index 0a2310e43e..7d61442ad1 100644 --- a/libraries/shared/src/SpatiallyNestable.cpp +++ b/libraries/shared/src/SpatiallyNestable.cpp @@ -340,12 +340,12 @@ QList SpatiallyNestable::getChildren() const { } const Transform SpatiallyNestable::getJointTransformInModelFrame(int jointIndex) const { - Transform jointInObjectFrame; - glm::vec3 position = getJointTranslation(jointIndex); - glm::quat orientation = getJointRotation(jointIndex); - jointInObjectFrame.setRotation(orientation); - jointInObjectFrame.setTranslation(position); - return jointInObjectFrame; + Transform jointTransformInObjectFrame; + glm::vec3 position = getJointTranslationInModelFrame(jointIndex); + glm::quat orientation = getJointRotationInModelFrame(jointIndex); + jointTransformInObjectFrame.setRotation(orientation); + jointTransformInObjectFrame.setTranslation(position); + return jointTransformInObjectFrame; } SpatiallyNestablePointer SpatiallyNestable::getThisPointer() const { diff --git a/libraries/shared/src/SpatiallyNestable.h b/libraries/shared/src/SpatiallyNestable.h index da7aff6b52..0d3b00e0eb 100644 --- a/libraries/shared/src/SpatiallyNestable.h +++ b/libraries/shared/src/SpatiallyNestable.h @@ -92,8 +92,8 @@ public: // this object's frame virtual const Transform getJointTransformInModelFrame(int jointIndex) const; - virtual glm::quat getJointRotation(int index) const { assert(false); return glm::quat(); } - virtual glm::vec3 getJointTranslation(int index) const { assert(false); return glm::vec3(); } + virtual glm::quat getJointRotationInModelFrame(int index) const { assert(false); return glm::quat(); } + virtual glm::vec3 getJointTranslationInModelFrame(int index) const { assert(false); return glm::vec3(); } SpatiallyNestablePointer getThisPointer() const; From fff4e3e831ef29114a97b62a3c38c55e4e5b3001 Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Sun, 6 Dec 2015 12:01:30 -0800 Subject: [PATCH 07/15] make SpatiallyNestable setters take values by reference --- interface/src/avatar/Avatar.cpp | 4 ++-- interface/src/avatar/Avatar.h | 4 ++-- libraries/avatars/src/AvatarData.cpp | 4 ++-- libraries/avatars/src/AvatarData.h | 4 ++-- libraries/shared/src/SpatiallyNestable.cpp | 18 +++++++++--------- libraries/shared/src/SpatiallyNestable.h | 18 +++++++++--------- 6 files changed, 26 insertions(+), 26 deletions(-) diff --git a/interface/src/avatar/Avatar.cpp b/interface/src/avatar/Avatar.cpp index 29423f4d79..62ec4de1b2 100644 --- a/interface/src/avatar/Avatar.cpp +++ b/interface/src/avatar/Avatar.cpp @@ -1157,12 +1157,12 @@ glm::quat Avatar::getRightPalmRotation() { return rightRotation; } -void Avatar::setPosition(const glm::vec3 position) { +void Avatar::setPosition(const glm::vec3& position) { AvatarData::setPosition(position); updateAttitude(); } -void Avatar::setOrientation(const glm::quat orientation) { +void Avatar::setOrientation(const glm::quat& orientation) { AvatarData::setOrientation(orientation); updateAttitude(); } diff --git a/interface/src/avatar/Avatar.h b/interface/src/avatar/Avatar.h index 3f8b955b6c..e2eeab2c3d 100644 --- a/interface/src/avatar/Avatar.h +++ b/interface/src/avatar/Avatar.h @@ -158,8 +158,8 @@ public: void setMotionState(AvatarMotionState* motionState) { _motionState = motionState; } AvatarMotionState* getMotionState() { return _motionState; } - virtual void setPosition(glm::vec3 position); - virtual void setOrientation(glm::quat orientation); + virtual void setPosition(const glm::vec3& position); + virtual void setOrientation(const glm::quat& orientation); public slots: diff --git a/libraries/avatars/src/AvatarData.cpp b/libraries/avatars/src/AvatarData.cpp index 76575909aa..fe03fb09cd 100644 --- a/libraries/avatars/src/AvatarData.cpp +++ b/libraries/avatars/src/AvatarData.cpp @@ -1626,10 +1626,10 @@ void AvatarData::setBodyRoll(float bodyRoll) { setOrientation(glm::quat(glm::radians(eulerAngles))); } -void AvatarData::setPosition(const glm::vec3 position) { +void AvatarData::setPosition(const glm::vec3& position) { SpatiallyNestable::setPosition(position); } -void AvatarData::setOrientation(const glm::quat orientation) { +void AvatarData::setOrientation(const glm::quat& orientation) { SpatiallyNestable::setOrientation(orientation); } diff --git a/libraries/avatars/src/AvatarData.h b/libraries/avatars/src/AvatarData.h index 8419ce2154..0db259ceda 100644 --- a/libraries/avatars/src/AvatarData.h +++ b/libraries/avatars/src/AvatarData.h @@ -201,8 +201,8 @@ public: float getBodyRoll() const; void setBodyRoll(float bodyRoll); - virtual void setPosition(glm::vec3 position); - virtual void setOrientation(glm::quat orientation); + virtual void setPosition(const glm::vec3& position); + virtual void setOrientation(const glm::quat& orientation); void nextAttitude(glm::vec3 position, glm::quat orientation); // Can be safely called at any time. void startCapture(); // start/end of the period in which the latest values are about to be captured for camera, etc. diff --git a/libraries/shared/src/SpatiallyNestable.cpp b/libraries/shared/src/SpatiallyNestable.cpp index 7d61442ad1..77b5f57bfb 100644 --- a/libraries/shared/src/SpatiallyNestable.cpp +++ b/libraries/shared/src/SpatiallyNestable.cpp @@ -91,7 +91,7 @@ void SpatiallyNestable::forgetChild(SpatiallyNestablePointer newChild) const { }); } -void SpatiallyNestable::setParentID(const QUuid parentID) { +void SpatiallyNestable::setParentID(const QUuid& parentID) { if (_parentID != parentID) { _parentID = parentID; _parentKnowsMe = false; @@ -188,7 +188,7 @@ glm::vec3 SpatiallyNestable::getPosition(int jointIndex) const { return getTransform(jointIndex).getTranslation(); } -void SpatiallyNestable::setPosition(glm::vec3 position) { +void SpatiallyNestable::setPosition(const glm::vec3& position) { Transform parentTransform = getParentTransform(); Transform myWorldTransform; _transformLock.withWriteLock([&] { @@ -207,7 +207,7 @@ glm::quat SpatiallyNestable::getOrientation(int jointIndex) const { return getTransform(jointIndex).getRotation(); } -void SpatiallyNestable::setOrientation(glm::quat orientation) { +void SpatiallyNestable::setOrientation(const glm::quat& orientation) { Transform parentTransform = getParentTransform(); Transform myWorldTransform; _transformLock.withWriteLock([&] { @@ -238,7 +238,7 @@ const Transform SpatiallyNestable::getTransform(int jointIndex) const { return jointInWorldFrame; } -void SpatiallyNestable::setTransform(const Transform transform) { +void SpatiallyNestable::setTransform(const Transform& transform) { Transform parentTransform = getParentTransform(); _transformLock.withWriteLock([&] { Transform::inverseMult(_transform, parentTransform, transform); @@ -259,7 +259,7 @@ glm::vec3 SpatiallyNestable::getScale(int jointIndex) const { return getScale(); } -void SpatiallyNestable::setScale(glm::vec3 scale) { +void SpatiallyNestable::setScale(const glm::vec3& scale) { _transformLock.withWriteLock([&] { _transform.setScale(scale); }); @@ -274,7 +274,7 @@ const Transform SpatiallyNestable::getLocalTransform() const { return result; } -void SpatiallyNestable::setLocalTransform(const Transform transform) { +void SpatiallyNestable::setLocalTransform(const Transform& transform) { _transformLock.withWriteLock([&] { _transform = transform; }); @@ -289,7 +289,7 @@ glm::vec3 SpatiallyNestable::getLocalPosition() const { return result; } -void SpatiallyNestable::setLocalPosition(glm::vec3 position) { +void SpatiallyNestable::setLocalPosition(const glm::vec3& position) { _transformLock.withWriteLock([&] { _transform.setTranslation(position); }); @@ -304,7 +304,7 @@ glm::quat SpatiallyNestable::getLocalOrientation() const { return result; } -void SpatiallyNestable::setLocalOrientation(glm::quat orientation) { +void SpatiallyNestable::setLocalOrientation(const glm::quat& orientation) { _transformLock.withWriteLock([&] { _transform.setRotation(orientation); }); @@ -319,7 +319,7 @@ glm::vec3 SpatiallyNestable::getLocalScale() const { return result; } -void SpatiallyNestable::setLocalScale(glm::vec3 scale) { +void SpatiallyNestable::setLocalScale(const glm::vec3& scale) { _transformLock.withWriteLock([&] { _transform.setScale(scale); }); diff --git a/libraries/shared/src/SpatiallyNestable.h b/libraries/shared/src/SpatiallyNestable.h index 0d3b00e0eb..dc1be54219 100644 --- a/libraries/shared/src/SpatiallyNestable.h +++ b/libraries/shared/src/SpatiallyNestable.h @@ -42,7 +42,7 @@ public: virtual void setID(const QUuid& id) { _id = id; } virtual const QUuid getParentID() const { return _parentID; } - virtual void setParentID(const QUuid parentID); + virtual void setParentID(const QUuid& parentID); virtual quint16 getParentJointIndex() const { return _parentJointIndex; } virtual void setParentJointIndex(quint16 parentJointIndex) { _parentJointIndex = parentJointIndex; } @@ -55,19 +55,19 @@ public: // world frame virtual const Transform getTransform() const; - virtual void setTransform(const Transform transform); + virtual void setTransform(const Transform& transform); virtual Transform getParentTransform() const; virtual glm::vec3 getPosition() const; - virtual void setPosition(glm::vec3 position); + virtual void setPosition(const glm::vec3& position); virtual glm::quat getOrientation() const; virtual glm::quat getOrientation(int jointIndex) const; - virtual void setOrientation(glm::quat orientation); + virtual void setOrientation(const glm::quat& orientation); virtual glm::vec3 getScale() const; - virtual void setScale(glm::vec3 scale); + virtual void setScale(const glm::vec3& scale); // get world-frame values for a specific joint virtual const Transform getTransform(int jointIndex) const; @@ -76,16 +76,16 @@ public: // object's parent's frame virtual const Transform getLocalTransform() const; - virtual void setLocalTransform(const Transform transform); + virtual void setLocalTransform(const Transform& transform); virtual glm::vec3 getLocalPosition() const; - virtual void setLocalPosition(glm::vec3 position); + virtual void setLocalPosition(const glm::vec3& position); virtual glm::quat getLocalOrientation() const; - virtual void setLocalOrientation(glm::quat orientation); + virtual void setLocalOrientation(const glm::quat& orientation); virtual glm::vec3 getLocalScale() const; - virtual void setLocalScale(glm::vec3 scale); + virtual void setLocalScale(const glm::vec3& scale); QList getChildren() const; NestableTypes::NestableType getNestableType() const { return _nestableType; } From f0fb9966ada9f89ec58ba5612cfae35adb1e9156 Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Sun, 6 Dec 2015 12:34:41 -0800 Subject: [PATCH 08/15] expose parent-joint-index to edit.js --- examples/html/entityProperties.html | 9 +++++++ .../entities/src/EntityScriptingInterface.cpp | 27 +++++++------------ 2 files changed, 19 insertions(+), 17 deletions(-) diff --git a/examples/html/entityProperties.html b/examples/html/entityProperties.html index bef5c825c2..186b2ee828 100644 --- a/examples/html/entityProperties.html +++ b/examples/html/entityProperties.html @@ -226,6 +226,7 @@ var elRescaleDimensionsButton = document.getElementById("dimension-rescale-button"); var elParentID = document.getElementById("property-parent-id"); + var elParentJointIndex = document.getElementById("property-parent-joint-index"); var elRegistrationX = document.getElementById("property-reg-x"); var elRegistrationY = document.getElementById("property-reg-y"); @@ -456,6 +457,7 @@ elDimensionsZ.value = properties.dimensions.z.toFixed(2); elParentID.value = properties.parentID; + elParentJointIndex.value = properties.parentJointIndex; elRegistrationX.value = properties.registrationPoint.x.toFixed(2); elRegistrationY.value = properties.registrationPoint.y.toFixed(2); @@ -671,6 +673,7 @@ elDimensionsZ.addEventListener('change', dimensionsChangeFunction); elParentID.addEventListener('change', createEmitTextPropertyUpdateFunction('parentID')); + elParentJointIndex.addEventListener('change', createEmitNumberPropertyUpdateFunction('parentJointIndex')); var registrationChangeFunction = createEmitVec3PropertyUpdateFunction( 'registrationPoint', elRegistrationX, elRegistrationY, elRegistrationZ); @@ -1067,6 +1070,12 @@ +
+ ParentJointIndex +
+ +
+
Registration
diff --git a/libraries/entities/src/EntityScriptingInterface.cpp b/libraries/entities/src/EntityScriptingInterface.cpp index 23fbac13cf..2488470bfa 100644 --- a/libraries/entities/src/EntityScriptingInterface.cpp +++ b/libraries/entities/src/EntityScriptingInterface.cpp @@ -201,28 +201,21 @@ QUuid EntityScriptingInterface::editEntity(QUuid id, EntityItemProperties script bool updatedEntity = false; _entityTree->withWriteLock([&] { - if (scriptSideProperties.parentDependentPropertyChanged()) { - // if the script set a location property but didn't include parent information, grab the needed - // properties from the entity. - if (!scriptSideProperties.parentIDChanged() || !scriptSideProperties.parentJointIndexChanged()) { - EntityItemPointer entity = _entityTree->findEntityByEntityItemID(entityID); - if (entity && !scriptSideProperties.parentIDChanged()) { - properties.setParentID(entity->getParentID()); - } - if (entity && !scriptSideProperties.parentJointIndexChanged()) { - properties.setParentJointIndex(entity->getParentJointIndex()); - } + if (scriptSideProperties.parentDependentPropertyChanged() || + scriptSideProperties.parentIDChanged() || scriptSideProperties.parentJointIndexChanged()) { + // All of parentID, parentJointIndex, position, rotation are needed to make sense of any of them. + // If any of these changed, pull any missing properties from the entity. + EntityItemPointer entity = _entityTree->findEntityByEntityItemID(entityID); + if (entity && !scriptSideProperties.parentIDChanged()) { + properties.setParentID(entity->getParentID()); + } + if (entity && !scriptSideProperties.parentJointIndexChanged()) { + properties.setParentJointIndex(entity->getParentJointIndex()); } - } - if (scriptSideProperties.parentIDChanged() || scriptSideProperties.parentJointIndexChanged()) { - // if the script set parentID or parentJointIndex but didn't include position and rotation, grab - // the missing properties from the entity if (!scriptSideProperties.localPositionChanged() && !scriptSideProperties.positionChanged()) { - EntityItemPointer entity = _entityTree->findEntityByEntityItemID(entityID); properties.setPosition(entity->getPosition()); } if (!scriptSideProperties.localRotationChanged() && !scriptSideProperties.rotationChanged()) { - EntityItemPointer entity = _entityTree->findEntityByEntityItemID(entityID); properties.setRotation(entity->getOrientation()); } } From 3cc423ca03800da8c3317de05f186f474cfeb632 Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Sun, 6 Dec 2015 17:55:48 -0800 Subject: [PATCH 09/15] remap IDs when importing entities --- interface/src/Application.cpp | 1 + libraries/entities/src/EntityTree.cpp | 6 ++++ libraries/entities/src/EntityTree.h | 2 ++ libraries/entities/src/RemapIDOperator.cpp | 33 ++++++++++++++++++++++ libraries/entities/src/RemapIDOperator.h | 30 ++++++++++++++++++++ 5 files changed, 72 insertions(+) create mode 100644 libraries/entities/src/RemapIDOperator.cpp create mode 100644 libraries/entities/src/RemapIDOperator.h diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 9e98b51442..6ef440843f 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -2480,6 +2480,7 @@ bool Application::importEntities(const QString& urlOrFilename) { bool success = _entityClipboard->readFromURL(url.toString()); if (success) { + _entityClipboard->remapIDs(); _entityClipboard->reaverageOctreeElements(); } return success; diff --git a/libraries/entities/src/EntityTree.cpp b/libraries/entities/src/EntityTree.cpp index 892b186a25..c0ef3e0fe3 100644 --- a/libraries/entities/src/EntityTree.cpp +++ b/libraries/entities/src/EntityTree.cpp @@ -24,6 +24,7 @@ #include "EntitiesLogging.h" #include "RecurseOctreeToMapOperator.h" #include "LogHandler.h" +#include "RemapIDOperator.h" static const quint64 DELETED_ENTITIES_EXTRA_USECS_TO_CONSIDER = USECS_PER_MSEC * 50; @@ -1194,6 +1195,11 @@ bool EntityTree::sendEntitiesOperation(OctreeElementPointer element, void* extra return true; } +void EntityTree::remapIDs() { + RemapIDOperator theOperator; + recurseTreeWithOperator(&theOperator); +} + bool EntityTree::writeToMap(QVariantMap& entityDescription, OctreeElementPointer element, bool skipDefaultValues) { if (! entityDescription.contains("Entities")) { entityDescription["Entities"] = QVariantList(); diff --git a/libraries/entities/src/EntityTree.h b/libraries/entities/src/EntityTree.h index d1e0462f64..97a23124bb 100644 --- a/libraries/entities/src/EntityTree.h +++ b/libraries/entities/src/EntityTree.h @@ -196,6 +196,8 @@ public: bool wantTerseEditLogging() const { return _wantTerseEditLogging; } void setWantTerseEditLogging(bool value) { _wantTerseEditLogging = value; } + void remapIDs(); + bool writeToMap(QVariantMap& entityDescription, OctreeElementPointer element, bool skipDefaultValues); bool readFromMap(QVariantMap& entityDescription); diff --git a/libraries/entities/src/RemapIDOperator.cpp b/libraries/entities/src/RemapIDOperator.cpp new file mode 100644 index 0000000000..eee6e49a1c --- /dev/null +++ b/libraries/entities/src/RemapIDOperator.cpp @@ -0,0 +1,33 @@ +// +// RemapIDOperator.cpp +// libraries/entities/src +// +// Created by Seth Alves on 2015-12-6. +// Copyright 2015 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + + +#include "EntityTree.h" +#include "RemapIDOperator.h" + +QUuid RemapIDOperator::remap(const QUuid& oldID) { + if (oldID.isNull()) { + return oldID; + } + if (!_oldToNew.contains(oldID)) { + _oldToNew[oldID] = QUuid::createUuid(); + } + return _oldToNew[oldID]; +} + +bool RemapIDOperator::postRecursion(OctreeElementPointer element) { + EntityTreeElementPointer entityTreeElement = std::static_pointer_cast(element); + entityTreeElement->forEachEntity([&](EntityItemPointer entityItem) { + entityItem->setID(remap(entityItem->getID())); + entityItem->setParentID(remap(entityItem->getParentID())); + }); + return true; +} diff --git a/libraries/entities/src/RemapIDOperator.h b/libraries/entities/src/RemapIDOperator.h new file mode 100644 index 0000000000..439aec28fc --- /dev/null +++ b/libraries/entities/src/RemapIDOperator.h @@ -0,0 +1,30 @@ +// +// RemapIDOperator.h +// libraries/entities/src +// +// Created by Seth Alves on 2015-12-6. +// Copyright 2015 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + +#ifndef hifi_RemapIDOperator_h +#define hifi_RemapIDOperator_h + +#include "Octree.h" + +// this will change all the IDs in an EntityTree. Parent/Child relationships are maintained. + +class RemapIDOperator : public RecurseOctreeOperator { +public: + RemapIDOperator() : RecurseOctreeOperator() {} + ~RemapIDOperator() {} + virtual bool preRecursion(OctreeElementPointer element) { return true; } + virtual bool postRecursion(OctreeElementPointer element); +private: + QUuid remap(const QUuid& oldID); + QHash _oldToNew; +}; + +#endif // hifi_RemapIDOperator_h From 96e9580473b597f6bb83c3d684d121a6265bf785 Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Mon, 7 Dec 2015 05:30:19 -0800 Subject: [PATCH 10/15] change some more parameters back to being pass-by-reference, where it's safe --- .../entities-renderer/src/RenderableModelEntityItem.cpp | 5 +++-- .../entities-renderer/src/RenderableModelEntityItem.h | 2 +- libraries/entities/src/EntityItem.cpp | 2 +- libraries/entities/src/EntityItem.h | 2 +- libraries/entities/src/EntityItemProperties.cpp | 2 +- libraries/entities/src/EntityItemProperties.h | 2 +- libraries/entities/src/EntityScriptingInterface.cpp | 6 +++--- libraries/entities/src/EntityScriptingInterface.h | 2 +- libraries/entities/src/LightEntityItem.cpp | 2 +- libraries/entities/src/LightEntityItem.h | 2 +- libraries/entities/src/TextEntityItem.cpp | 2 +- libraries/entities/src/TextEntityItem.h | 2 +- libraries/entities/src/WebEntityItem.cpp | 2 +- libraries/entities/src/WebEntityItem.h | 2 +- libraries/shared/src/SpatiallyNestable.cpp | 8 ++++---- libraries/shared/src/SpatiallyNestable.h | 8 ++++---- 16 files changed, 26 insertions(+), 25 deletions(-) diff --git a/libraries/entities-renderer/src/RenderableModelEntityItem.cpp b/libraries/entities-renderer/src/RenderableModelEntityItem.cpp index 8f2b54b35a..95ce59b6a3 100644 --- a/libraries/entities-renderer/src/RenderableModelEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderableModelEntityItem.cpp @@ -33,7 +33,8 @@ EntityItemPointer RenderableModelEntityItem::factory(const EntityItemID& entityI RenderableModelEntityItem::RenderableModelEntityItem(const EntityItemID& entityItemID, bool dimensionsInitialized) : ModelEntityItem(entityItemID), - _dimensionsInitialized(dimensionsInitialized) { + _dimensionsInitialized(dimensionsInitialized) +{ } RenderableModelEntityItem::~RenderableModelEntityItem() { @@ -44,7 +45,7 @@ RenderableModelEntityItem::~RenderableModelEntityItem() { } } -void RenderableModelEntityItem::setDimensions(const glm::vec3 value) { +void RenderableModelEntityItem::setDimensions(const glm::vec3& value) { _dimensionsInitialized = true; ModelEntityItem::setDimensions(value); } diff --git a/libraries/entities-renderer/src/RenderableModelEntityItem.h b/libraries/entities-renderer/src/RenderableModelEntityItem.h index e73289174c..7dba6ac5f0 100644 --- a/libraries/entities-renderer/src/RenderableModelEntityItem.h +++ b/libraries/entities-renderer/src/RenderableModelEntityItem.h @@ -28,7 +28,7 @@ public: virtual ~RenderableModelEntityItem(); - virtual void setDimensions(const glm::vec3 value) override; + virtual void setDimensions(const glm::vec3& value) override; virtual EntityItemProperties getProperties(EntityPropertyFlags desiredProperties = EntityPropertyFlags()) const override; virtual bool setProperties(const EntityItemProperties& properties) override; diff --git a/libraries/entities/src/EntityItem.cpp b/libraries/entities/src/EntityItem.cpp index 51ade5b46e..9b31c2aa59 100644 --- a/libraries/entities/src/EntityItem.cpp +++ b/libraries/entities/src/EntityItem.cpp @@ -1192,7 +1192,7 @@ const Transform EntityItem::getTransformToCenter() const { return result; } -void EntityItem::setDimensions(const glm::vec3 value) { +void EntityItem::setDimensions(const glm::vec3& value) { if (value.x <= 0.0f || value.y <= 0.0f || value.z <= 0.0f) { return; } diff --git a/libraries/entities/src/EntityItem.h b/libraries/entities/src/EntityItem.h index bfc178f2c3..4fc4ee2afb 100644 --- a/libraries/entities/src/EntityItem.h +++ b/libraries/entities/src/EntityItem.h @@ -178,7 +178,7 @@ public: /// Dimensions in meters (0.0 - TREE_SCALE) inline const glm::vec3 getDimensions() const { return getScale(); } - virtual void setDimensions(const glm::vec3 value); + virtual void setDimensions(const glm::vec3& value); float getGlowLevel() const { return _glowLevel; } void setGlowLevel(float glowLevel) { _glowLevel = glowLevel; } diff --git a/libraries/entities/src/EntityItemProperties.cpp b/libraries/entities/src/EntityItemProperties.cpp index 9ff5d73616..d040f785da 100644 --- a/libraries/entities/src/EntityItemProperties.cpp +++ b/libraries/entities/src/EntityItemProperties.cpp @@ -1796,6 +1796,6 @@ QList EntityItemProperties::listChangedProperties() { return out; } -bool EntityItemProperties::parentDependentPropertyChanged() { +bool EntityItemProperties::parentDependentPropertyChanged() const { return localPositionChanged() || positionChanged() || localRotationChanged() || rotationChanged(); } diff --git a/libraries/entities/src/EntityItemProperties.h b/libraries/entities/src/EntityItemProperties.h index 11d29c5d57..c13519996a 100644 --- a/libraries/entities/src/EntityItemProperties.h +++ b/libraries/entities/src/EntityItemProperties.h @@ -83,7 +83,7 @@ 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? + bool parentDependentPropertyChanged() const; // 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 2488470bfa..4cb815f365 100644 --- a/libraries/entities/src/EntityScriptingInterface.cpp +++ b/libraries/entities/src/EntityScriptingInterface.cpp @@ -64,7 +64,7 @@ void EntityScriptingInterface::setEntityTree(EntityTreePointer elementTree) { } } -EntityItemProperties convertLocationToScriptSemantics(EntityItemProperties entitySideProperties) { +EntityItemProperties convertLocationToScriptSemantics(const EntityItemProperties& entitySideProperties) { // In EntityTree code, properties.position and properties.rotation are relative to the parent. In javascript, // they are in world-space. The local versions are put into localPosition and localRotation and position and // rotation are converted from local to world space. @@ -85,7 +85,7 @@ EntityItemProperties convertLocationToScriptSemantics(EntityItemProperties entit } -EntityItemProperties convertLocationFromScriptSemantics(EntityItemProperties scriptSideProperties) { +EntityItemProperties convertLocationFromScriptSemantics(const EntityItemProperties& scriptSideProperties) { // convert position and rotation properties from world-space to local, unless localPosition and localRotation // are set. If they are set, they overwrite position and rotation. EntityItemProperties entitySideProperties = scriptSideProperties; @@ -190,7 +190,7 @@ EntityItemProperties EntityScriptingInterface::getEntityProperties(QUuid identit return convertLocationToScriptSemantics(results); } -QUuid EntityScriptingInterface::editEntity(QUuid id, EntityItemProperties scriptSideProperties) { +QUuid EntityScriptingInterface::editEntity(QUuid id, const EntityItemProperties& scriptSideProperties) { EntityItemProperties properties = scriptSideProperties; EntityItemID entityID(id); // If we have a local entity tree set, then also update it. diff --git a/libraries/entities/src/EntityScriptingInterface.h b/libraries/entities/src/EntityScriptingInterface.h index 84688ab24a..591dee6a85 100644 --- a/libraries/entities/src/EntityScriptingInterface.h +++ b/libraries/entities/src/EntityScriptingInterface.h @@ -86,7 +86,7 @@ public slots: /// edits a model updating only the included properties, will return the identified EntityItemID in case of /// successful edit, if the input entityID is for an unknown model this function will have no effect - Q_INVOKABLE QUuid editEntity(QUuid entityID, EntityItemProperties properties); + Q_INVOKABLE QUuid editEntity(QUuid entityID, const EntityItemProperties& properties); /// deletes a model Q_INVOKABLE void deleteEntity(QUuid entityID); diff --git a/libraries/entities/src/LightEntityItem.cpp b/libraries/entities/src/LightEntityItem.cpp index af3110c000..ac56fc9c1f 100644 --- a/libraries/entities/src/LightEntityItem.cpp +++ b/libraries/entities/src/LightEntityItem.cpp @@ -40,7 +40,7 @@ LightEntityItem::LightEntityItem(const EntityItemID& entityItemID) : EntityItem( _cutoff = PI; } -void LightEntityItem::setDimensions(const glm::vec3 value) { +void LightEntityItem::setDimensions(const glm::vec3& value) { if (_isSpotlight) { // If we are a spotlight, treat the z value as our radius or length, and // recalculate the x/y dimensions to properly encapsulate the spotlight. diff --git a/libraries/entities/src/LightEntityItem.h b/libraries/entities/src/LightEntityItem.h index edb2ca7b3c..103c462809 100644 --- a/libraries/entities/src/LightEntityItem.h +++ b/libraries/entities/src/LightEntityItem.h @@ -23,7 +23,7 @@ public: ALLOW_INSTANTIATION // This class can be instantiated /// set dimensions in domain scale units (0.0 - 1.0) this will also reset radius appropriately - virtual void setDimensions(const glm::vec3 value); + virtual void setDimensions(const glm::vec3& value); // methods for getting/setting all properties of an entity virtual EntityItemProperties getProperties(EntityPropertyFlags desiredProperties = EntityPropertyFlags()) const; diff --git a/libraries/entities/src/TextEntityItem.cpp b/libraries/entities/src/TextEntityItem.cpp index 7d1cfb5c6b..893329d1ce 100644 --- a/libraries/entities/src/TextEntityItem.cpp +++ b/libraries/entities/src/TextEntityItem.cpp @@ -41,7 +41,7 @@ TextEntityItem::TextEntityItem(const EntityItemID& entityItemID) : EntityItem(en const float TEXT_ENTITY_ITEM_FIXED_DEPTH = 0.01f; -void TextEntityItem::setDimensions(const glm::vec3 value) { +void TextEntityItem::setDimensions(const glm::vec3& value) { // NOTE: Text Entities always have a "depth" of 1cm. EntityItem::setDimensions(glm::vec3(value.x, value.y, TEXT_ENTITY_ITEM_FIXED_DEPTH)); } diff --git a/libraries/entities/src/TextEntityItem.h b/libraries/entities/src/TextEntityItem.h index 2080912d92..1caceee085 100644 --- a/libraries/entities/src/TextEntityItem.h +++ b/libraries/entities/src/TextEntityItem.h @@ -23,7 +23,7 @@ public: ALLOW_INSTANTIATION // This class can be instantiated /// set dimensions in domain scale units (0.0 - 1.0) this will also reset radius appropriately - virtual void setDimensions(const glm::vec3 value); + virtual void setDimensions(const glm::vec3& value); virtual ShapeType getShapeType() const { return SHAPE_TYPE_BOX; } // methods for getting/setting all properties of an entity diff --git a/libraries/entities/src/WebEntityItem.cpp b/libraries/entities/src/WebEntityItem.cpp index 35189074bb..5f113f1de4 100644 --- a/libraries/entities/src/WebEntityItem.cpp +++ b/libraries/entities/src/WebEntityItem.cpp @@ -34,7 +34,7 @@ WebEntityItem::WebEntityItem(const EntityItemID& entityItemID) : EntityItem(enti const float WEB_ENTITY_ITEM_FIXED_DEPTH = 0.01f; -void WebEntityItem::setDimensions(const glm::vec3 value) { +void WebEntityItem::setDimensions(const glm::vec3& value) { // NOTE: Web Entities always have a "depth" of 1cm. EntityItem::setDimensions(glm::vec3(value.x, value.y, WEB_ENTITY_ITEM_FIXED_DEPTH)); } diff --git a/libraries/entities/src/WebEntityItem.h b/libraries/entities/src/WebEntityItem.h index 49ab009bb2..8e9d924cde 100644 --- a/libraries/entities/src/WebEntityItem.h +++ b/libraries/entities/src/WebEntityItem.h @@ -22,7 +22,7 @@ public: ALLOW_INSTANTIATION // This class can be instantiated /// set dimensions in domain scale units (0.0 - 1.0) this will also reset radius appropriately - virtual void setDimensions(const glm::vec3 value); + virtual void setDimensions(const glm::vec3& value); virtual ShapeType getShapeType() const { return SHAPE_TYPE_BOX; } // methods for getting/setting all properties of an entity diff --git a/libraries/shared/src/SpatiallyNestable.cpp b/libraries/shared/src/SpatiallyNestable.cpp index 77b5f57bfb..3d697edd92 100644 --- a/libraries/shared/src/SpatiallyNestable.cpp +++ b/libraries/shared/src/SpatiallyNestable.cpp @@ -99,7 +99,7 @@ void SpatiallyNestable::setParentID(const QUuid& parentID) { parentChanged(); } -glm::vec3 SpatiallyNestable::worldToLocal(glm::vec3 position, QUuid parentID, int parentJointIndex) { +glm::vec3 SpatiallyNestable::worldToLocal(const glm::vec3& position, const QUuid& parentID, int parentJointIndex) { QSharedPointer parentFinder = DependencyManager::get(); Transform parentTransform; if (parentFinder) { @@ -122,7 +122,7 @@ glm::vec3 SpatiallyNestable::worldToLocal(glm::vec3 position, QUuid parentID, in return result.getTranslation(); } -glm::quat SpatiallyNestable::worldToLocal(glm::quat orientation, QUuid parentID, int parentJointIndex) { +glm::quat SpatiallyNestable::worldToLocal(const glm::quat& orientation, const QUuid& parentID, int parentJointIndex) { QSharedPointer parentFinder = DependencyManager::get(); Transform parentTransform; if (parentFinder) { @@ -144,7 +144,7 @@ glm::quat SpatiallyNestable::worldToLocal(glm::quat orientation, QUuid parentID, return result.getRotation(); } -glm::vec3 SpatiallyNestable::localToWorld(glm::vec3 position, QUuid parentID, int parentJointIndex) { +glm::vec3 SpatiallyNestable::localToWorld(const glm::vec3& position, const QUuid& parentID, int parentJointIndex) { QSharedPointer parentFinder = DependencyManager::get(); Transform parentTransform; if (parentFinder) { @@ -162,7 +162,7 @@ glm::vec3 SpatiallyNestable::localToWorld(glm::vec3 position, QUuid parentID, in return result.getTranslation(); } -glm::quat SpatiallyNestable::localToWorld(glm::quat orientation, QUuid parentID, int parentJointIndex) { +glm::quat SpatiallyNestable::localToWorld(const glm::quat& orientation, const QUuid& parentID, int parentJointIndex) { QSharedPointer parentFinder = DependencyManager::get(); Transform parentTransform; if (parentFinder) { diff --git a/libraries/shared/src/SpatiallyNestable.h b/libraries/shared/src/SpatiallyNestable.h index dc1be54219..4fdb051e84 100644 --- a/libraries/shared/src/SpatiallyNestable.h +++ b/libraries/shared/src/SpatiallyNestable.h @@ -47,11 +47,11 @@ public: virtual quint16 getParentJointIndex() const { return _parentJointIndex; } virtual void setParentJointIndex(quint16 parentJointIndex) { _parentJointIndex = parentJointIndex; } - static glm::vec3 worldToLocal(glm::vec3 position, QUuid parentID, int parentJointIndex); - static glm::quat worldToLocal(glm::quat orientation, QUuid parentID, int parentJointIndex); + static glm::vec3 worldToLocal(const glm::vec3& position, const QUuid& parentID, int parentJointIndex); + static glm::quat worldToLocal(const glm::quat& orientation, const QUuid& parentID, int parentJointIndex); - static glm::vec3 localToWorld(glm::vec3 position, QUuid parentID, int parentJointIndex); - static glm::quat localToWorld(glm::quat orientation, QUuid parentID, int parentJointIndex); + static glm::vec3 localToWorld(const glm::vec3& position, const QUuid& parentID, int parentJointIndex); + static glm::quat localToWorld(const glm::quat& orientation, const QUuid& parentID, int parentJointIndex); // world frame virtual const Transform getTransform() const; From f53571ac81c50a92f43d32868bd9beb6e576cbc9 Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Mon, 7 Dec 2015 05:41:34 -0800 Subject: [PATCH 11/15] remap IDs on export, also --- interface/src/Application.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 6ef440843f..094f04df29 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -2414,6 +2414,9 @@ bool Application::exportEntities(const QString& filename, const QVectoraddEntity(entityItem->getEntityItemID(), properties); } + // remap IDs on export so that we aren't publishing the IDs of entities in our domain + exportTree->remapIDs(); + exportTree->writeToJSONFile(filename.toLocal8Bit().constData()); // restore the main window's active state From f6b1ef85b30f06ca82eaeed2a1e1c378d20a128a Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Mon, 7 Dec 2015 06:03:47 -0800 Subject: [PATCH 12/15] remap entity IDs on export also --- interface/src/Application.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 094f04df29..4a5811826b 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -2439,6 +2439,10 @@ bool Application::exportEntities(const QString& filename, float x, float y, floa properties.setPosition(properties.getPosition() - root); exportTree->addEntity(id, properties); } + + // remap IDs on export so that we aren't publishing the IDs of entities in our domain + exportTree->remapIDs(); + exportTree->writeToSVOFile(filename.toLocal8Bit().constData()); } else { qCDebug(interfaceapp) << "No models were selected"; From 60b8e65520cc93c70d1e040fa700b341578d6555 Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Mon, 7 Dec 2015 06:03:58 -0800 Subject: [PATCH 13/15] get file dialog working on Linux --- interface/src/scripting/WindowScriptingInterface.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/interface/src/scripting/WindowScriptingInterface.cpp b/interface/src/scripting/WindowScriptingInterface.cpp index a2886c8b77..0bf94f02a9 100644 --- a/interface/src/scripting/WindowScriptingInterface.cpp +++ b/interface/src/scripting/WindowScriptingInterface.cpp @@ -622,7 +622,8 @@ QScriptValue WindowScriptingInterface::showBrowse(const QString& title, const QS fileDialog.setAcceptMode(acceptMode); QUrl fileUrl(directory); if (acceptMode == QFileDialog::AcceptSave) { - fileDialog.setFileMode(QFileDialog::Directory); + // TODO -- Setting this breaks the dialog on Linux. Does it help something on other platforms? + // fileDialog.setFileMode(QFileDialog::Directory); fileDialog.selectFile(fileUrl.fileName()); } if (fileDialog.exec()) { From 0bf276efa59fcae851979aa3e1295f546fe2964a Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Mon, 7 Dec 2015 14:37:35 -0800 Subject: [PATCH 14/15] adjust method names to fit convention --- interface/src/avatar/Avatar.h | 4 ++-- libraries/avatars/src/AvatarData.h | 4 ++-- libraries/entities/src/EntityScriptingInterface.cpp | 8 ++++---- libraries/entities/src/EntityScriptingInterface.h | 6 +++--- 4 files changed, 11 insertions(+), 11 deletions(-) diff --git a/interface/src/avatar/Avatar.h b/interface/src/avatar/Avatar.h index d26a02d815..99a4fc52a9 100644 --- a/interface/src/avatar/Avatar.h +++ b/interface/src/avatar/Avatar.h @@ -158,8 +158,8 @@ public: void setMotionState(AvatarMotionState* motionState) { _motionState = motionState; } AvatarMotionState* getMotionState() { return _motionState; } - virtual void setPosition(const glm::vec3& position); - virtual void setOrientation(const glm::quat& orientation); + virtual void setPosition(const glm::vec3& position) override; + virtual void setOrientation(const glm::quat& orientation) override; public slots: diff --git a/libraries/avatars/src/AvatarData.h b/libraries/avatars/src/AvatarData.h index 67cf6624d4..1fa33ff606 100644 --- a/libraries/avatars/src/AvatarData.h +++ b/libraries/avatars/src/AvatarData.h @@ -201,8 +201,8 @@ public: float getBodyRoll() const; void setBodyRoll(float bodyRoll); - virtual void setPosition(const glm::vec3& position); - virtual void setOrientation(const glm::quat& orientation); + virtual void setPosition(const glm::vec3& position) override; + virtual void setOrientation(const glm::quat& orientation) override; void nextAttitude(glm::vec3 position, glm::quat orientation); // Can be safely called at any time. void startCapture(); // start/end of the period in which the latest values are about to be captured for camera, etc. diff --git a/libraries/entities/src/EntityScriptingInterface.cpp b/libraries/entities/src/EntityScriptingInterface.cpp index a417e094a0..f97e904423 100644 --- a/libraries/entities/src/EntityScriptingInterface.cpp +++ b/libraries/entities/src/EntityScriptingInterface.cpp @@ -806,19 +806,19 @@ glm::vec3 EntityScriptingInterface::localCoordsToVoxelCoords(const QUuid& entity } } -glm::vec3 EntityScriptingInterface::getJointTranslation(const QUuid& entityID, int jointIndex) { +glm::vec3 EntityScriptingInterface::getAbsoluteJointTranslationInObjectFrame(const QUuid& entityID, int jointIndex) { if (auto entity = checkForTreeEntityAndTypeMatch(entityID, EntityTypes::Model)) { auto modelEntity = std::dynamic_pointer_cast(entity); - return modelEntity->getJointTranslation(jointIndex); + return modelEntity->getAbsoluteJointTranslationInObjectFrame(jointIndex); } else { return glm::vec3(0.0f); } } -glm::quat EntityScriptingInterface::getJointRotation(const QUuid& entityID, int jointIndex) { +glm::quat EntityScriptingInterface::getAbsoluteJointRotationInObjectFrame(const QUuid& entityID, int jointIndex) { if (auto entity = checkForTreeEntityAndTypeMatch(entityID, EntityTypes::Model)) { auto modelEntity = std::dynamic_pointer_cast(entity); - return modelEntity->getJointRotation(jointIndex); + return modelEntity->getAbsoluteJointRotationInObjectFrame(jointIndex); } else { return glm::quat(); } diff --git a/libraries/entities/src/EntityScriptingInterface.h b/libraries/entities/src/EntityScriptingInterface.h index 5e1d81583e..f745b6b644 100644 --- a/libraries/entities/src/EntityScriptingInterface.h +++ b/libraries/entities/src/EntityScriptingInterface.h @@ -148,9 +148,9 @@ public slots: Q_INVOKABLE glm::vec3 worldCoordsToVoxelCoords(const QUuid& entityID, glm::vec3 worldCoords); Q_INVOKABLE glm::vec3 voxelCoordsToLocalCoords(const QUuid& entityID, glm::vec3 voxelCoords); Q_INVOKABLE glm::vec3 localCoordsToVoxelCoords(const QUuid& entityID, glm::vec3 localCoords); - - Q_INVOKABLE glm::vec3 getJointTranslation(const QUuid& entityID, int jointIndex); - Q_INVOKABLE glm::quat getJointRotation(const QUuid& entityID, int jointIndex); + + Q_INVOKABLE glm::vec3 getAbsoluteJointTranslationInObjectFrame(const QUuid& entityID, int jointIndex); + Q_INVOKABLE glm::quat getAbsoluteJointRotationInObjectFrame(const QUuid& entityID, int jointIndex); signals: void collisionWithEntity(const EntityItemID& idA, const EntityItemID& idB, const Collision& collision); From ec9f1e0754c165bcc06d375b88b12e09c330856c Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Tue, 8 Dec 2015 09:44:43 -0800 Subject: [PATCH 15/15] possible fix for crash when grabbing bubblewand --- libraries/entities/src/EntityScriptingInterface.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/libraries/entities/src/EntityScriptingInterface.cpp b/libraries/entities/src/EntityScriptingInterface.cpp index f97e904423..a0a6719521 100644 --- a/libraries/entities/src/EntityScriptingInterface.cpp +++ b/libraries/entities/src/EntityScriptingInterface.cpp @@ -206,10 +206,13 @@ QUuid EntityScriptingInterface::editEntity(QUuid id, const EntityItemProperties& // All of parentID, parentJointIndex, position, rotation are needed to make sense of any of them. // If any of these changed, pull any missing properties from the entity. EntityItemPointer entity = _entityTree->findEntityByEntityItemID(entityID); - if (entity && !scriptSideProperties.parentIDChanged()) { + if (!entity) { + return; + } + if (!scriptSideProperties.parentIDChanged()) { properties.setParentID(entity->getParentID()); } - if (entity && !scriptSideProperties.parentJointIndexChanged()) { + if (!scriptSideProperties.parentJointIndexChanged()) { properties.setParentJointIndex(entity->getParentJointIndex()); } if (!scriptSideProperties.localPositionChanged() && !scriptSideProperties.positionChanged()) {