From 40fec8a318ecb98a0fa297899d5fce19f00f2c7b Mon Sep 17 00:00:00 2001 From: David Back Date: Thu, 5 Jul 2018 11:58:45 -0700 Subject: [PATCH 1/7] reparent after duplication --- .../system/libraries/entitySelectionTool.js | 20 ++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/scripts/system/libraries/entitySelectionTool.js b/scripts/system/libraries/entitySelectionTool.js index d30de1045f..282c6083d9 100644 --- a/scripts/system/libraries/entitySelectionTool.js +++ b/scripts/system/libraries/entitySelectionTool.js @@ -183,15 +183,33 @@ SelectionManager = (function() { that.duplicateSelection = function() { var duplicatedEntityIDs = []; + var entityIDsNeedingNewParent = []; + var oldEntityToNewEntityID = []; Object.keys(that.savedProperties).forEach(function(otherEntityID) { var properties = that.savedProperties[otherEntityID]; if (!properties.locked && (!properties.clientOnly || properties.owningAvatarID === MyAvatar.sessionUUID)) { + var newEntityID = Entities.addEntity(properties); duplicatedEntityIDs.push({ - entityID: Entities.addEntity(properties), + entityID: newEntityID, properties: properties }); + if (properties.parentID !== Uuid.NULL) { + entityIDsNeedingNewParent[newEntityID] = properties.parentID; + } + oldEntityToNewEntityID[otherEntityID] = newEntityID; } }); + Object.keys(entityIDsNeedingNewParent).forEach(function(entityIDNeedingNewParent) { + var oldParentID = entityIDsNeedingNewParent[entityIDNeedingNewParent]; + var newParentID = oldEntityToNewEntityID[oldParentID]; + Entities.editEntity(entityIDNeedingNewParent, { parentID: newParentID }); + for (var i = 0; i < duplicatedEntityIDs.length; i++) { + var duplicatedEntity = duplicatedEntityIDs[i]; + if (duplicatedEntity.entityID === entityIDNeedingNewParent) { + duplicatedEntity.properties.parentID = newParentID; + } + } + }); return duplicatedEntityIDs; }; From 25d55b9cc50c6d0a96bf12838dadc8cd0f35cc51 Mon Sep 17 00:00:00 2001 From: David Back Date: Thu, 5 Jul 2018 11:59:05 -0700 Subject: [PATCH 2/7] tabs --- .../system/libraries/entitySelectionTool.js | 36 +++++++++---------- 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/scripts/system/libraries/entitySelectionTool.js b/scripts/system/libraries/entitySelectionTool.js index 282c6083d9..36aad40169 100644 --- a/scripts/system/libraries/entitySelectionTool.js +++ b/scripts/system/libraries/entitySelectionTool.js @@ -183,33 +183,33 @@ SelectionManager = (function() { that.duplicateSelection = function() { var duplicatedEntityIDs = []; - var entityIDsNeedingNewParent = []; - var oldEntityToNewEntityID = []; + var entityIDsNeedingNewParent = []; + var oldEntityToNewEntityID = []; Object.keys(that.savedProperties).forEach(function(otherEntityID) { var properties = that.savedProperties[otherEntityID]; if (!properties.locked && (!properties.clientOnly || properties.owningAvatarID === MyAvatar.sessionUUID)) { - var newEntityID = Entities.addEntity(properties); + var newEntityID = Entities.addEntity(properties); duplicatedEntityIDs.push({ entityID: newEntityID, properties: properties }); - if (properties.parentID !== Uuid.NULL) { - entityIDsNeedingNewParent[newEntityID] = properties.parentID; - } - oldEntityToNewEntityID[otherEntityID] = newEntityID; + if (properties.parentID !== Uuid.NULL) { + entityIDsNeedingNewParent[newEntityID] = properties.parentID; + } + oldEntityToNewEntityID[otherEntityID] = newEntityID; + } + }); + Object.keys(entityIDsNeedingNewParent).forEach(function(entityIDNeedingNewParent) { + var oldParentID = entityIDsNeedingNewParent[entityIDNeedingNewParent]; + var newParentID = oldEntityToNewEntityID[oldParentID]; + Entities.editEntity(entityIDNeedingNewParent, { parentID: newParentID }); + for (var i = 0; i < duplicatedEntityIDs.length; i++) { + var duplicatedEntity = duplicatedEntityIDs[i]; + if (duplicatedEntity.entityID === entityIDNeedingNewParent) { + duplicatedEntity.properties.parentID = newParentID; + } } }); - Object.keys(entityIDsNeedingNewParent).forEach(function(entityIDNeedingNewParent) { - var oldParentID = entityIDsNeedingNewParent[entityIDNeedingNewParent]; - var newParentID = oldEntityToNewEntityID[oldParentID]; - Entities.editEntity(entityIDNeedingNewParent, { parentID: newParentID }); - for (var i = 0; i < duplicatedEntityIDs.length; i++) { - var duplicatedEntity = duplicatedEntityIDs[i]; - if (duplicatedEntity.entityID === entityIDNeedingNewParent) { - duplicatedEntity.properties.parentID = newParentID; - } - } - }); return duplicatedEntityIDs; }; From 1cc79f0e7c4ca97ec33b805d96af852b89b7a032 Mon Sep 17 00:00:00 2001 From: David Back Date: Thu, 5 Jul 2018 12:07:13 -0700 Subject: [PATCH 3/7] renaming --- .../system/libraries/entitySelectionTool.js | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/scripts/system/libraries/entitySelectionTool.js b/scripts/system/libraries/entitySelectionTool.js index 36aad40169..02d3244e55 100644 --- a/scripts/system/libraries/entitySelectionTool.js +++ b/scripts/system/libraries/entitySelectionTool.js @@ -183,10 +183,10 @@ SelectionManager = (function() { that.duplicateSelection = function() { var duplicatedEntityIDs = []; - var entityIDsNeedingNewParent = []; - var oldEntityToNewEntityID = []; - Object.keys(that.savedProperties).forEach(function(otherEntityID) { - var properties = that.savedProperties[otherEntityID]; + var duplicatedChildrenWithOldParents = []; + var originalEntityToNewEntityID = []; + Object.keys(that.savedProperties).forEach(function(originalEntityID) { + var properties = that.savedProperties[originalEntityID]; if (!properties.locked && (!properties.clientOnly || properties.owningAvatarID === MyAvatar.sessionUUID)) { var newEntityID = Entities.addEntity(properties); duplicatedEntityIDs.push({ @@ -194,18 +194,18 @@ SelectionManager = (function() { properties: properties }); if (properties.parentID !== Uuid.NULL) { - entityIDsNeedingNewParent[newEntityID] = properties.parentID; + duplicatedChildrenWithOldParents[newEntityID] = properties.parentID; } - oldEntityToNewEntityID[otherEntityID] = newEntityID; + originalEntityToNewEntityID[originalEntityID] = newEntityID; } }); - Object.keys(entityIDsNeedingNewParent).forEach(function(entityIDNeedingNewParent) { - var oldParentID = entityIDsNeedingNewParent[entityIDNeedingNewParent]; - var newParentID = oldEntityToNewEntityID[oldParentID]; - Entities.editEntity(entityIDNeedingNewParent, { parentID: newParentID }); + Object.keys(duplicatedChildrenWithOldParents).forEach(function(childIDNeedingNewParent) { + var originalParentID = duplicatedChildrenWithOldParents[childIDNeedingNewParent]; + var newParentID = originalEntityToNewEntityID[originalParentID]; + Entities.editEntity(childIDNeedingNewParent, { parentID: newParentID }); for (var i = 0; i < duplicatedEntityIDs.length; i++) { var duplicatedEntity = duplicatedEntityIDs[i]; - if (duplicatedEntity.entityID === entityIDNeedingNewParent) { + if (duplicatedEntity.entityID === childIDNeedingNewParent) { duplicatedEntity.properties.parentID = newParentID; } } From fbe670d8c0603edf3b0fa05317c78406024bb777 Mon Sep 17 00:00:00 2001 From: David Back Date: Thu, 5 Jul 2018 12:43:37 -0700 Subject: [PATCH 4/7] also copy unselected children --- .../system/libraries/entitySelectionTool.js | 21 ++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/scripts/system/libraries/entitySelectionTool.js b/scripts/system/libraries/entitySelectionTool.js index 02d3244e55..9ea8cfda4f 100644 --- a/scripts/system/libraries/entitySelectionTool.js +++ b/scripts/system/libraries/entitySelectionTool.js @@ -182,11 +182,28 @@ SelectionManager = (function() { }; that.duplicateSelection = function() { + var entitiesToDuplicate = []; var duplicatedEntityIDs = []; var duplicatedChildrenWithOldParents = []; var originalEntityToNewEntityID = []; + Object.keys(that.savedProperties).forEach(function(originalEntityID) { + entitiesToDuplicate.push(originalEntityID); + var children = Entities.getChildrenIDs(originalEntityID); + for (var i = 0; i < children.length; i++) { + var childID = children[i]; + if (entitiesToDuplicate.indexOf(childID) < 0) { + entitiesToDuplicate.push(childID); + } + } + }); + + for (var i = 0; i < entitiesToDuplicate.length; i++) { + var originalEntityID = entitiesToDuplicate[i]; var properties = that.savedProperties[originalEntityID]; + if (properties === undefined) { + properties = Entities.getEntityProperties(originalEntityID); + } if (!properties.locked && (!properties.clientOnly || properties.owningAvatarID === MyAvatar.sessionUUID)) { var newEntityID = Entities.addEntity(properties); duplicatedEntityIDs.push({ @@ -198,7 +215,8 @@ SelectionManager = (function() { } originalEntityToNewEntityID[originalEntityID] = newEntityID; } - }); + } + Object.keys(duplicatedChildrenWithOldParents).forEach(function(childIDNeedingNewParent) { var originalParentID = duplicatedChildrenWithOldParents[childIDNeedingNewParent]; var newParentID = originalEntityToNewEntityID[originalParentID]; @@ -210,6 +228,7 @@ SelectionManager = (function() { } } }); + return duplicatedEntityIDs; }; From 2bcc96269e110e049aa33da4d603ba1a351decd8 Mon Sep 17 00:00:00 2001 From: David Back Date: Thu, 5 Jul 2018 13:10:56 -0700 Subject: [PATCH 5/7] comments, fix doubles in list, fix re-parenting to 0 --- .../system/libraries/entitySelectionTool.js | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/scripts/system/libraries/entitySelectionTool.js b/scripts/system/libraries/entitySelectionTool.js index 9ea8cfda4f..86c92174e1 100644 --- a/scripts/system/libraries/entitySelectionTool.js +++ b/scripts/system/libraries/entitySelectionTool.js @@ -187,8 +187,11 @@ SelectionManager = (function() { var duplicatedChildrenWithOldParents = []; var originalEntityToNewEntityID = []; + // build list of entities to duplicate by including any unselected children of selected parent entities Object.keys(that.savedProperties).forEach(function(originalEntityID) { - entitiesToDuplicate.push(originalEntityID); + if (entitiesToDuplicate.indexOf(originalEntityID) < 0) { + entitiesToDuplicate.push(originalEntityID); + } var children = Entities.getChildrenIDs(originalEntityID); for (var i = 0; i < children.length; i++) { var childID = children[i]; @@ -198,6 +201,7 @@ SelectionManager = (function() { } }); + // duplicate entities from above and store their original to new entity mappings and children needing re-parenting for (var i = 0; i < entitiesToDuplicate.length; i++) { var originalEntityID = entitiesToDuplicate[i]; var properties = that.savedProperties[originalEntityID]; @@ -217,14 +221,17 @@ SelectionManager = (function() { } } + // re-parent duplicated children to the duplicate entities of their original parents (if they were duplicated) Object.keys(duplicatedChildrenWithOldParents).forEach(function(childIDNeedingNewParent) { var originalParentID = duplicatedChildrenWithOldParents[childIDNeedingNewParent]; var newParentID = originalEntityToNewEntityID[originalParentID]; - Entities.editEntity(childIDNeedingNewParent, { parentID: newParentID }); - for (var i = 0; i < duplicatedEntityIDs.length; i++) { - var duplicatedEntity = duplicatedEntityIDs[i]; - if (duplicatedEntity.entityID === childIDNeedingNewParent) { - duplicatedEntity.properties.parentID = newParentID; + if (newParentID) { + Entities.editEntity(childIDNeedingNewParent, { parentID: newParentID }); + for (var i = 0; i < duplicatedEntityIDs.length; i++) { + var duplicatedEntity = duplicatedEntityIDs[i]; + if (duplicatedEntity.entityID === childIDNeedingNewParent) { + duplicatedEntity.properties.parentID = newParentID; + } } } }); From 33e170315c3601407432cf496beb8dff6469f628 Mon Sep 17 00:00:00 2001 From: David Back Date: Fri, 6 Jul 2018 15:38:40 -0700 Subject: [PATCH 6/7] recurse on children of children --- .../system/libraries/entitySelectionTool.js | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/scripts/system/libraries/entitySelectionTool.js b/scripts/system/libraries/entitySelectionTool.js index 86c92174e1..26000d86c7 100644 --- a/scripts/system/libraries/entitySelectionTool.js +++ b/scripts/system/libraries/entitySelectionTool.js @@ -180,6 +180,17 @@ SelectionManager = (function() { that.selections = []; that._update(true); }; + + that.addChildrenEntities = function(parentEntityID, entityList) { + var children = Entities.getChildrenIDs(parentEntityID); + for (var i = 0; i < children.length; i++) { + var childID = children[i]; + if (entityList.indexOf(childID) < 0) { + entityList.push(childID); + } + that.addChildrenEntities(childID, entityList); + } + }; that.duplicateSelection = function() { var entitiesToDuplicate = []; @@ -192,13 +203,7 @@ SelectionManager = (function() { if (entitiesToDuplicate.indexOf(originalEntityID) < 0) { entitiesToDuplicate.push(originalEntityID); } - var children = Entities.getChildrenIDs(originalEntityID); - for (var i = 0; i < children.length; i++) { - var childID = children[i]; - if (entitiesToDuplicate.indexOf(childID) < 0) { - entitiesToDuplicate.push(childID); - } - } + that.addChildrenEntities(originalEntityID, entitiesToDuplicate); }); // duplicate entities from above and store their original to new entity mappings and children needing re-parenting From a546d8b279a9123f584fca6efdda43e8dd36d217 Mon Sep 17 00:00:00 2001 From: David Back Date: Fri, 6 Jul 2018 15:48:53 -0700 Subject: [PATCH 7/7] tabs --- scripts/system/libraries/entitySelectionTool.js | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/scripts/system/libraries/entitySelectionTool.js b/scripts/system/libraries/entitySelectionTool.js index 26000d86c7..f42f18254a 100644 --- a/scripts/system/libraries/entitySelectionTool.js +++ b/scripts/system/libraries/entitySelectionTool.js @@ -180,17 +180,17 @@ SelectionManager = (function() { that.selections = []; that._update(true); }; - - that.addChildrenEntities = function(parentEntityID, entityList) { - var children = Entities.getChildrenIDs(parentEntityID); + + that.addChildrenEntities = function(parentEntityID, entityList) { + var children = Entities.getChildrenIDs(parentEntityID); for (var i = 0; i < children.length; i++) { var childID = children[i]; - if (entityList.indexOf(childID) < 0) { - entityList.push(childID); + if (entityList.indexOf(childID) < 0) { + entityList.push(childID); } - that.addChildrenEntities(childID, entityList); + that.addChildrenEntities(childID, entityList); } - }; + }; that.duplicateSelection = function() { var entitiesToDuplicate = []; @@ -203,7 +203,7 @@ SelectionManager = (function() { if (entitiesToDuplicate.indexOf(originalEntityID) < 0) { entitiesToDuplicate.push(originalEntityID); } - that.addChildrenEntities(originalEntityID, entitiesToDuplicate); + that.addChildrenEntities(originalEntityID, entitiesToDuplicate); }); // duplicate entities from above and store their original to new entity mappings and children needing re-parenting