From cb0e01bfa462836b40b7cf67aecac7a9978f21b5 Mon Sep 17 00:00:00 2001 From: Dante Ruiz Date: Fri, 11 Nov 2016 22:09:50 +0000 Subject: [PATCH 1/6] fixed child of parent not being added when performing an undo --- scripts/system/edit.js | 88 +++++++++++++++++++++++++++++++++++------- 1 file changed, 74 insertions(+), 14 deletions(-) diff --git a/scripts/system/edit.js b/scripts/system/edit.js index 0ba630b3ff..3ef050e012 100644 --- a/scripts/system/edit.js +++ b/scripts/system/edit.js @@ -1027,19 +1027,76 @@ function selectAllEtitiesInCurrentSelectionBox(keepIfTouching) { } } + +function sortDeleteSelected (selected) { + var tempArray = selected; + var begin = 0; + while (begin < tempArray.length) { + var elementRemoved = false; + var next = begin + 1; + while (next < tempArray.length) { + var beginID = tempArray[begin]; + var nextID = tempArray[next]; + var beginProperties = Entities.getEntityProperties(beginID); + var nextProperties = Entities.getEntityProperties(nextID); + var nextParentID = nextProperties.parentID; + var beginParentID = beginProperties.parentID; + + if (beginID == nextParentID) { + var temp = beginID; + tempArray[begin] = nextID + tempArray[next] = beginID + tempArray.splice(begin, 1); + elementRemoved = true; + break; + } else if (nextID == beginParentID) { + tempArray.splice(begin, 1); + elementRemoved = true; + break; + } + next++; + } + if (!elementRemoved) { + begin++; + } + } + return tempArray; +} + +function recursiveDelete(entities, list) { + var entitiesLength = entities.length; + for (var i = 0; i < entitiesLength; i++) { + var entityID = entities[i]; + var children = Entities.getChildrenIDs(entityID); + var childList = [] + recursiveDelete(children, childList); + var initialProperties = Entities.getEntityProperties(entityID); + list.push({ + entityID: entityID, + properties: initialProperties, + children: childList + }); + Entities.deleteEntity(entityID); + } +} + function deleteSelectedEntities() { if (SelectionManager.hasSelection()) { selectedParticleEntity = 0; particleExplorerTool.destroyWebView(); SelectionManager.saveProperties(); var savedProperties = []; - for (var i = 0; i < selectionManager.selections.length; i++) { - var entityID = SelectionManager.selections[i]; + var newSortedSelection = sortDeleteSelected(selectionManager.selections); + for (var i = 0; i < newSortedSelection.length; i++) { + var entityID = newSortedSelection[i]; var initialProperties = SelectionManager.savedProperties[entityID]; - SelectionManager.savedProperties[entityID]; + var children = Entities.getChildrenIDs(entityID); + var childList = [] + recursiveDelete(children, childList); savedProperties.push({ entityID: entityID, - properties: initialProperties + properties: initialProperties, + children: childList }); Entities.deleteEntity(entityID); } @@ -1253,6 +1310,16 @@ Controller.keyReleaseEvent.connect(function (event) { } }); +function recursiveAdd(newParnetID, parentData) { + var children = parentData.children; + for (var i = 0; i < children.length; i++) { + var childProperties = children[i].properties; + childProperties.parentID = newParnetID; + var newChildID = Entities.addEntity(childProperties); + recursiveAdd(newChildID, children[i]); + } +} + // When an entity has been deleted we need a way to "undo" this deletion. Because it's not currently // possible to create an entity with a specific id, earlier undo commands to the deleted entity // will fail if there isn't a way to find the new entity id. @@ -1274,6 +1341,7 @@ function applyEntityProperties(data) { entityID = data.createEntities[i].entityID; var entityProperties = data.createEntities[i].properties; var newEntityID = Entities.addEntity(entityProperties); + recursiveAdd(newEntityID, data.createEntities[i]); DELETED_ENTITY_MAP[entityID] = newEntityID; if (data.selectCreated) { selectedEntityIDs.push(newEntityID); @@ -1314,19 +1382,11 @@ function pushCommandForSelections(createdEntityData, deletedEntityData) { } undoData.setProperties.push({ entityID: entityID, - properties: { - position: initialProperties.position, - rotation: initialProperties.rotation, - dimensions: initialProperties.dimensions - } + properties: initialProperties }); redoData.setProperties.push({ entityID: entityID, - properties: { - position: currentProperties.position, - rotation: currentProperties.rotation, - dimensions: currentProperties.dimensions - } + properties: currentProperties }); } UndoStack.pushCommand(applyEntityProperties, undoData, applyEntityProperties, redoData); From c52f89327320e113326fbef206d7a5cd3ab6ddbf Mon Sep 17 00:00:00 2001 From: Dante Ruiz Date: Tue, 22 Nov 2016 17:15:52 +0000 Subject: [PATCH 2/6] isChildOfParent --- .../entities/src/EntityScriptingInterface.cpp | 21 +++++++++++++++++++ .../entities/src/EntityScriptingInterface.h | 1 + 2 files changed, 22 insertions(+) diff --git a/libraries/entities/src/EntityScriptingInterface.cpp b/libraries/entities/src/EntityScriptingInterface.cpp index ee4db74c64..33f64d0d00 100644 --- a/libraries/entities/src/EntityScriptingInterface.cpp +++ b/libraries/entities/src/EntityScriptingInterface.cpp @@ -1318,6 +1318,27 @@ QVector EntityScriptingInterface::getChildrenIDs(const QUuid& parentID) { return result; } +bool EntityScriptingInterface::isChildOfParent(QUuid childID, QUuid parentID) { + bool isChild = false; + + if(!_entityTree) { + return isChild; + } + + _entityTree->withReadLock([&] { + EntityItemPointer parent = _entityTree->findEntityByEntityItemID(parentID); + parent->forEachDescendant([&](SpatiallyNestablePointer descendant) { + if(descendant->getID() == childID) { + isChild = true; + return; + } + }); + }); + + qDebug() << "Is Child of parent? : " << isChild; + return isChild; +} + QVector EntityScriptingInterface::getChildrenIDsOfJoint(const QUuid& parentID, int jointIndex) { QVector result; if (!_entityTree) { diff --git a/libraries/entities/src/EntityScriptingInterface.h b/libraries/entities/src/EntityScriptingInterface.h index 7cef753de9..907b489bd2 100644 --- a/libraries/entities/src/EntityScriptingInterface.h +++ b/libraries/entities/src/EntityScriptingInterface.h @@ -255,6 +255,7 @@ public slots: Q_INVOKABLE QStringList getJointNames(const QUuid& entityID); Q_INVOKABLE QVector getChildrenIDs(const QUuid& parentID); Q_INVOKABLE QVector getChildrenIDsOfJoint(const QUuid& parentID, int jointIndex); + Q_INVOKABLE bool isChildOfParent(QUuid childID, QUuid parnetID); Q_INVOKABLE QUuid getKeyboardFocusEntity() const; Q_INVOKABLE void setKeyboardFocusEntity(QUuid id); From 0c9cd5803aed1b42567d956b10906a99792f40c5 Mon Sep 17 00:00:00 2001 From: Dante Ruiz Date: Tue, 22 Nov 2016 19:40:17 +0000 Subject: [PATCH 3/6] added descendant checking --- .../entities/src/EntityScriptingInterface.cpp | 3 +- scripts/system/edit.js | 28 ++++++++----------- 2 files changed, 13 insertions(+), 18 deletions(-) diff --git a/libraries/entities/src/EntityScriptingInterface.cpp b/libraries/entities/src/EntityScriptingInterface.cpp index 33f64d0d00..047a2259de 100644 --- a/libraries/entities/src/EntityScriptingInterface.cpp +++ b/libraries/entities/src/EntityScriptingInterface.cpp @@ -1334,8 +1334,7 @@ bool EntityScriptingInterface::isChildOfParent(QUuid childID, QUuid parentID) { } }); }); - - qDebug() << "Is Child of parent? : " << isChild; + return isChild; } diff --git a/scripts/system/edit.js b/scripts/system/edit.js index 3ef050e012..929b684fe9 100644 --- a/scripts/system/edit.js +++ b/scripts/system/edit.js @@ -1029,28 +1029,24 @@ function selectAllEtitiesInCurrentSelectionBox(keepIfTouching) { function sortDeleteSelected (selected) { - var tempArray = selected; + var array = selected.slice(); var begin = 0; - while (begin < tempArray.length) { + while (begin < array.length) { var elementRemoved = false; var next = begin + 1; - while (next < tempArray.length) { - var beginID = tempArray[begin]; - var nextID = tempArray[next]; - var beginProperties = Entities.getEntityProperties(beginID); - var nextProperties = Entities.getEntityProperties(nextID); - var nextParentID = nextProperties.parentID; - var beginParentID = beginProperties.parentID; + while (next < array.length) { + var beginID = array[begin]; + var nextID = array[next]; - if (beginID == nextParentID) { + if (Entities.isChildOfParent(beginID, nextID)) { var temp = beginID; - tempArray[begin] = nextID - tempArray[next] = beginID - tempArray.splice(begin, 1); + array[begin] = nextID + array[next] = beginID + array.splice(next, 1); elementRemoved = true; break; - } else if (nextID == beginParentID) { - tempArray.splice(begin, 1); + } else if (Entities.isChildOfParent(nextID, beginID)) { + array.splice(next, 1); elementRemoved = true; break; } @@ -1060,7 +1056,7 @@ function sortDeleteSelected (selected) { begin++; } } - return tempArray; + return array; } function recursiveDelete(entities, list) { From 3c1d434449aa9d4d160ea67443394f753d954d4f Mon Sep 17 00:00:00 2001 From: Dante Ruiz Date: Tue, 22 Nov 2016 19:43:17 +0000 Subject: [PATCH 4/6] fixed typo --- scripts/system/edit.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/system/edit.js b/scripts/system/edit.js index 929b684fe9..6fe82e9531 100644 --- a/scripts/system/edit.js +++ b/scripts/system/edit.js @@ -1306,7 +1306,7 @@ Controller.keyReleaseEvent.connect(function (event) { } }); -function recursiveAdd(newParnetID, parentData) { +function recursiveAdd(newParentID, parentData) { var children = parentData.children; for (var i = 0; i < children.length; i++) { var childProperties = children[i].properties; From a35f28725bc34c93205f3607fcfd717cc6f0ff8f Mon Sep 17 00:00:00 2001 From: Dante Ruiz Date: Mon, 28 Nov 2016 19:33:42 +0000 Subject: [PATCH 5/6] fixed child not commit back when performing undo --- scripts/system/edit.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/system/edit.js b/scripts/system/edit.js index 6fe82e9531..fb07b278ac 100644 --- a/scripts/system/edit.js +++ b/scripts/system/edit.js @@ -1310,7 +1310,7 @@ function recursiveAdd(newParentID, parentData) { var children = parentData.children; for (var i = 0; i < children.length; i++) { var childProperties = children[i].properties; - childProperties.parentID = newParnetID; + childProperties.parentID = newParentID; var newChildID = Entities.addEntity(childProperties); recursiveAdd(newChildID, children[i]); } From 348c0c95e5b5da5e73e8a54488582e692b8028e0 Mon Sep 17 00:00:00 2001 From: Dante Ruiz Date: Thu, 1 Dec 2016 22:22:17 +0000 Subject: [PATCH 6/6] conforming to coding standard and better variable naming --- .../entities/src/EntityScriptingInterface.cpp | 2 +- .../entities/src/EntityScriptingInterface.h | 2 +- scripts/system/edit.js | 38 +++++++++---------- 3 files changed, 20 insertions(+), 22 deletions(-) diff --git a/libraries/entities/src/EntityScriptingInterface.cpp b/libraries/entities/src/EntityScriptingInterface.cpp index 047a2259de..43947708ba 100644 --- a/libraries/entities/src/EntityScriptingInterface.cpp +++ b/libraries/entities/src/EntityScriptingInterface.cpp @@ -1321,7 +1321,7 @@ QVector EntityScriptingInterface::getChildrenIDs(const QUuid& parentID) { bool EntityScriptingInterface::isChildOfParent(QUuid childID, QUuid parentID) { bool isChild = false; - if(!_entityTree) { + if (!_entityTree) { return isChild; } diff --git a/libraries/entities/src/EntityScriptingInterface.h b/libraries/entities/src/EntityScriptingInterface.h index 907b489bd2..aa6ea0fcff 100644 --- a/libraries/entities/src/EntityScriptingInterface.h +++ b/libraries/entities/src/EntityScriptingInterface.h @@ -255,7 +255,7 @@ public slots: Q_INVOKABLE QStringList getJointNames(const QUuid& entityID); Q_INVOKABLE QVector getChildrenIDs(const QUuid& parentID); Q_INVOKABLE QVector getChildrenIDsOfJoint(const QUuid& parentID, int jointIndex); - Q_INVOKABLE bool isChildOfParent(QUuid childID, QUuid parnetID); + Q_INVOKABLE bool isChildOfParent(QUuid childID, QUuid parentID); Q_INVOKABLE QUuid getKeyboardFocusEntity() const; Q_INVOKABLE void setKeyboardFocusEntity(QUuid id); diff --git a/scripts/system/edit.js b/scripts/system/edit.js index fb07b278ac..afcfd50bb8 100644 --- a/scripts/system/edit.js +++ b/scripts/system/edit.js @@ -1027,26 +1027,24 @@ function selectAllEtitiesInCurrentSelectionBox(keepIfTouching) { } } - -function sortDeleteSelected (selected) { - var array = selected.slice(); +function sortSelectedEntities(selected) { + var sortedEntities = selected.slice(); var begin = 0; - while (begin < array.length) { + while (begin < sortedEntities.length) { var elementRemoved = false; var next = begin + 1; - while (next < array.length) { - var beginID = array[begin]; - var nextID = array[next]; + while (next < sortedEntities.length) { + var beginID = sortedEntities[begin]; + var nextID = sortedEntities[next]; if (Entities.isChildOfParent(beginID, nextID)) { - var temp = beginID; - array[begin] = nextID - array[next] = beginID - array.splice(next, 1); + sortedEntities[begin] = nextID; + sortedEntities[next] = beginID; + sortedEntities.splice(next, 1); elementRemoved = true; break; } else if (Entities.isChildOfParent(nextID, beginID)) { - array.splice(next, 1); + sortedEntities.splice(next, 1); elementRemoved = true; break; } @@ -1056,21 +1054,21 @@ function sortDeleteSelected (selected) { begin++; } } - return array; + return sortedEntities; } -function recursiveDelete(entities, list) { +function recursiveDelete(entities, childrenList) { var entitiesLength = entities.length; for (var i = 0; i < entitiesLength; i++) { var entityID = entities[i]; var children = Entities.getChildrenIDs(entityID); - var childList = [] - recursiveDelete(children, childList); + var grandchildrenList = []; + recursiveDelete(children, grandchildrenList); var initialProperties = Entities.getEntityProperties(entityID); - list.push({ + childrenList.push({ entityID: entityID, properties: initialProperties, - children: childList + children: grandchildrenList }); Entities.deleteEntity(entityID); } @@ -1082,12 +1080,12 @@ function deleteSelectedEntities() { particleExplorerTool.destroyWebView(); SelectionManager.saveProperties(); var savedProperties = []; - var newSortedSelection = sortDeleteSelected(selectionManager.selections); + var newSortedSelection = sortSelectedEntities(selectionManager.selections); for (var i = 0; i < newSortedSelection.length; i++) { var entityID = newSortedSelection[i]; var initialProperties = SelectionManager.savedProperties[entityID]; var children = Entities.getChildrenIDs(entityID); - var childList = [] + var childList = []; recursiveDelete(children, childList); savedProperties.push({ entityID: entityID,