mirror of
https://github.com/overte-org/overte.git
synced 2025-08-09 17:01:18 +02:00
Merge pull request #833 from AleziaKurdis/CreataAppOCT2020
Create Application: Improvements October 2020
This commit is contained in:
commit
a123a2171b
10 changed files with 681 additions and 54 deletions
Binary file not shown.
|
@ -1696,7 +1696,7 @@ function recursiveDelete(entities, childrenList, deletedIDs, entityHostType) {
|
||||||
}
|
}
|
||||||
|
|
||||||
function unparentSelectedEntities() {
|
function unparentSelectedEntities() {
|
||||||
if (SelectionManager.hasSelection()) {
|
if (SelectionManager.hasSelection() && SelectionManager.hasUnlockedSelection()) {
|
||||||
var selectedEntities = selectionManager.selections;
|
var selectedEntities = selectionManager.selections;
|
||||||
var parentCheck = false;
|
var parentCheck = false;
|
||||||
|
|
||||||
|
@ -1720,6 +1720,9 @@ function unparentSelectedEntities() {
|
||||||
} else {
|
} else {
|
||||||
Window.notify("Entity unparented");
|
Window.notify("Entity unparented");
|
||||||
}
|
}
|
||||||
|
//Refresh
|
||||||
|
entityListTool.sendUpdate();
|
||||||
|
selectionManager._update(false, this);
|
||||||
} else {
|
} else {
|
||||||
audioFeedback.rejection();
|
audioFeedback.rejection();
|
||||||
if (selectedEntities.length > 1) {
|
if (selectedEntities.length > 1) {
|
||||||
|
@ -1730,11 +1733,11 @@ function unparentSelectedEntities() {
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
audioFeedback.rejection();
|
audioFeedback.rejection();
|
||||||
Window.notifyEditError("You have nothing selected to unparent");
|
Window.notifyEditError("You have nothing selected or the selection has locked entities.");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
function parentSelectedEntities() {
|
function parentSelectedEntities() {
|
||||||
if (SelectionManager.hasSelection()) {
|
if (SelectionManager.hasSelection() && SelectionManager.hasUnlockedSelection()) {
|
||||||
var selectedEntities = selectionManager.selections;
|
var selectedEntities = selectionManager.selections;
|
||||||
if (selectedEntities.length <= 1) {
|
if (selectedEntities.length <= 1) {
|
||||||
audioFeedback.rejection();
|
audioFeedback.rejection();
|
||||||
|
@ -1756,17 +1759,20 @@ function parentSelectedEntities() {
|
||||||
if (parentCheck) {
|
if (parentCheck) {
|
||||||
audioFeedback.confirmation();
|
audioFeedback.confirmation();
|
||||||
Window.notify("Entities parented");
|
Window.notify("Entities parented");
|
||||||
|
//Refresh
|
||||||
|
entityListTool.sendUpdate();
|
||||||
|
selectionManager._update(false, this);
|
||||||
} else {
|
} else {
|
||||||
audioFeedback.rejection();
|
audioFeedback.rejection();
|
||||||
Window.notify("Entities are already parented to last");
|
Window.notify("Entities are already parented to last");
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
audioFeedback.rejection();
|
audioFeedback.rejection();
|
||||||
Window.notifyEditError("You have nothing selected to parent");
|
Window.notifyEditError("You have nothing selected or the selection has locked entities.");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
function deleteSelectedEntities() {
|
function deleteSelectedEntities() {
|
||||||
if (SelectionManager.hasSelection()) {
|
if (SelectionManager.hasSelection() && SelectionManager.hasUnlockedSelection()) {
|
||||||
var deletedIDs = [];
|
var deletedIDs = [];
|
||||||
|
|
||||||
SelectionManager.saveProperties();
|
SelectionManager.saveProperties();
|
||||||
|
@ -1797,6 +1803,9 @@ function deleteSelectedEntities() {
|
||||||
pushCommandForSelections([], savedProperties);
|
pushCommandForSelections([], savedProperties);
|
||||||
entityListTool.deleteEntities(deletedIDs);
|
entityListTool.deleteEntities(deletedIDs);
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
audioFeedback.rejection();
|
||||||
|
Window.notifyEditError("You have nothing selected or the selection has locked entities.");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2963,4 +2972,22 @@ function zoneSortOrder(a, b) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function getParentState(id) {
|
||||||
|
var state = "NONE";
|
||||||
|
var properties = Entities.getEntityProperties(id, ["parentID"]);
|
||||||
|
var children = Entities.getChildrenIDs(id);
|
||||||
|
if (properties.parentID !== Uuid.NULL) {
|
||||||
|
if (children.length > 0) {
|
||||||
|
state = "PARENT_CHILDREN";
|
||||||
|
} else {
|
||||||
|
state = "CHILDREN";
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (children.length > 0) {
|
||||||
|
state = "PARENT";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return state;
|
||||||
|
}
|
||||||
|
|
||||||
}()); // END LOCAL_SCOPE
|
}()); // END LOCAL_SCOPE
|
||||||
|
|
|
@ -190,7 +190,7 @@ EntityListTool = function(shouldUseEditTabletApp) {
|
||||||
PROFILE("getMultipleProperties", function () {
|
PROFILE("getMultipleProperties", function () {
|
||||||
var multipleProperties = Entities.getMultipleEntityProperties(ids, ['position', 'name', 'type', 'locked',
|
var multipleProperties = Entities.getMultipleEntityProperties(ids, ['position', 'name', 'type', 'locked',
|
||||||
'visible', 'renderInfo', 'modelURL', 'materialURL', 'imageURL', 'script', 'certificateID',
|
'visible', 'renderInfo', 'modelURL', 'materialURL', 'imageURL', 'script', 'certificateID',
|
||||||
'skybox.url', 'ambientLight.url']);
|
'skybox.url', 'ambientLight.url', 'created', 'lastEdited']);
|
||||||
for (var i = 0; i < multipleProperties.length; i++) {
|
for (var i = 0; i < multipleProperties.length; i++) {
|
||||||
var properties = multipleProperties[i];
|
var properties = multipleProperties[i];
|
||||||
|
|
||||||
|
@ -203,6 +203,17 @@ EntityListTool = function(shouldUseEditTabletApp) {
|
||||||
} else if (properties.type === "Image") {
|
} else if (properties.type === "Image") {
|
||||||
url = properties.imageURL;
|
url = properties.imageURL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var parentStatus = getParentState(ids[i]);
|
||||||
|
var parentState = "";
|
||||||
|
if (parentStatus === "PARENT") {
|
||||||
|
parentState = "A";
|
||||||
|
} else if (parentStatus === "CHILDREN") {
|
||||||
|
parentState = "C";
|
||||||
|
} else if (parentStatus === "PARENT_CHILDREN") {
|
||||||
|
parentState = "B";
|
||||||
|
}
|
||||||
|
|
||||||
entities.push({
|
entities.push({
|
||||||
id: ids[i],
|
id: ids[i],
|
||||||
name: properties.name,
|
name: properties.name,
|
||||||
|
@ -222,7 +233,10 @@ EntityListTool = function(shouldUseEditTabletApp) {
|
||||||
isBaked: entityIsBaked(properties),
|
isBaked: entityIsBaked(properties),
|
||||||
drawCalls: (properties.renderInfo !== undefined ?
|
drawCalls: (properties.renderInfo !== undefined ?
|
||||||
valueIfDefined(properties.renderInfo.drawCalls) : ""),
|
valueIfDefined(properties.renderInfo.drawCalls) : ""),
|
||||||
hasScript: properties.script !== ""
|
hasScript: properties.script !== "",
|
||||||
|
parentState: parentState,
|
||||||
|
created: formatToStringDateTime(properties.created),
|
||||||
|
lastEdited: formatToStringDateTime(properties.lastEdited)
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -242,6 +256,22 @@ EntityListTool = function(shouldUseEditTabletApp) {
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
function formatToStringDateTime(timestamp) {
|
||||||
|
var d = new Date(Math.floor(timestamp/1000));
|
||||||
|
var dateTime = d.getUTCFullYear() + "-" + zeroPad((d.getUTCMonth() + 1), 2) + "-" + zeroPad(d.getUTCDate(), 2);
|
||||||
|
dateTime = dateTime + " " + zeroPad(d.getUTCHours(), 2) + ":" + zeroPad(d.getUTCMinutes(), 2) + ":" + zeroPad(d.getUTCSeconds(), 2);
|
||||||
|
dateTime = dateTime + "." + zeroPad(d.getUTCMilliseconds(), 3);
|
||||||
|
return dateTime;
|
||||||
|
}
|
||||||
|
|
||||||
|
function zeroPad(num, size) {
|
||||||
|
num = num.toString();
|
||||||
|
while (num.length < size) {
|
||||||
|
num = "0" + num;
|
||||||
|
}
|
||||||
|
return num;
|
||||||
|
}
|
||||||
|
|
||||||
function onFileSaveChanged(filename) {
|
function onFileSaveChanged(filename) {
|
||||||
Window.saveFileChanged.disconnect(onFileSaveChanged);
|
Window.saveFileChanged.disconnect(onFileSaveChanged);
|
||||||
if (filename !== "") {
|
if (filename !== "") {
|
||||||
|
@ -323,6 +353,24 @@ EntityListTool = function(shouldUseEditTabletApp) {
|
||||||
unparentSelectedEntities();
|
unparentSelectedEntities();
|
||||||
} else if (data.type === 'hmdMultiSelectMode') {
|
} else if (data.type === 'hmdMultiSelectMode') {
|
||||||
hmdMultiSelectMode = data.value;
|
hmdMultiSelectMode = data.value;
|
||||||
|
} else if (data.type === 'selectAllInBox') {
|
||||||
|
selectAllEntitiesInCurrentSelectionBox(false);
|
||||||
|
} else if (data.type === 'selectAllTouchingBox') {
|
||||||
|
selectAllEntitiesInCurrentSelectionBox(true);
|
||||||
|
} else if (data.type === 'selectParent') {
|
||||||
|
SelectionManager.selectParent();
|
||||||
|
} else if (data.type === 'selectTopParent') {
|
||||||
|
SelectionManager.selectTopParent();
|
||||||
|
} else if (data.type === 'addChildrenToSelection') {
|
||||||
|
SelectionManager.addChildrenToSelection();
|
||||||
|
} else if (data.type === 'selectFamily') {
|
||||||
|
SelectionManager.selectFamily();
|
||||||
|
} else if (data.type === 'selectTopFamily') {
|
||||||
|
SelectionManager.selectTopFamily();
|
||||||
|
} else if (data.type === 'teleportToEntity') {
|
||||||
|
SelectionManager.teleportToEntity();
|
||||||
|
} else if (data.type === 'moveEntitySelectionToAvatar') {
|
||||||
|
SelectionManager.moveEntitiesSelectionToAvatar();
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -32,19 +32,8 @@
|
||||||
</div>
|
</div>
|
||||||
<button id="toggle-space-mode" class="hifi-edit-button space-mode-local">Local</button>
|
<button id="toggle-space-mode" class="hifi-edit-button space-mode-local">Local</button>
|
||||||
<input type="button" class="vglyph" id="hmdmultiselect" value="I" style="display: none;" />
|
<input type="button" class="vglyph" id="hmdmultiselect" value="I" style="display: none;" />
|
||||||
<input type="button" class="blue vglyph" id="hmdcut" value="D" style="display: none;" />
|
<input type="button" class="normal" id="selection" value="Selection..." />
|
||||||
<input type="button" class="blue vglyph" id="hmdcopy" value="B" style="display: none;" />
|
<input type="button" class="normal" id="actions" value="Actions..." />
|
||||||
<input type="button" class="blue vglyph" id="hmdpaste" value="E" style="display: none;" />
|
|
||||||
<input type="button" class="green vglyph" id="hmdduplicate" value="A" style="display: none;" />
|
|
||||||
<div>
|
|
||||||
<input type="button" class="vglyph" id="parent" value="K" />
|
|
||||||
<input type="button" class="vglyph" id="unparent" value="L" />
|
|
||||||
</div>
|
|
||||||
<div>
|
|
||||||
<input type="button" class="orange vglyph" id="undo" value="F" />
|
|
||||||
<input type="button" class="orange vglyph" id="redo" value="G" />
|
|
||||||
</div>
|
|
||||||
<input type="button" class="red glyph" id="delete" value="{" />
|
|
||||||
</div>
|
</div>
|
||||||
<div id="entity-list">
|
<div id="entity-list">
|
||||||
<div id="filter-area">
|
<div id="filter-area">
|
||||||
|
@ -102,5 +91,142 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="entity-list-menu" id="actions-menu" >
|
||||||
|
<button class="menu-button" id="undo" >
|
||||||
|
<div class = "menu-item">
|
||||||
|
<div class = "menu-item-caption">Undo</div>
|
||||||
|
<div class = "menu-item-shortcut">Ctrl-Z</div>
|
||||||
|
</div>
|
||||||
|
</button>
|
||||||
|
<button class="menu-button" id="redo" >
|
||||||
|
<div class = "menu-item">
|
||||||
|
<div class = "menu-item-caption">Redo</div>
|
||||||
|
<div class = "menu-item-shortcut">Ctrl-Y</div>
|
||||||
|
</div>
|
||||||
|
</button>
|
||||||
|
<div class="menu-separator"></div>
|
||||||
|
<button class="menu-button" id="hmdcut" >
|
||||||
|
<div class = "menu-item">
|
||||||
|
<div class = "menu-item-caption">Cut</div>
|
||||||
|
<div class = "menu-item-shortcut">Ctrl-X</div>
|
||||||
|
</div>
|
||||||
|
</button>
|
||||||
|
<button class="menu-button" id="hmdcopy" >
|
||||||
|
<div class = "menu-item">
|
||||||
|
<div class = "menu-item-caption">Copy</div>
|
||||||
|
<div class = "menu-item-shortcut">Ctrl-C</div>
|
||||||
|
</div>
|
||||||
|
</button>
|
||||||
|
<button class="menu-button" id="hmdpaste" >
|
||||||
|
<div class = "menu-item">
|
||||||
|
<div class = "menu-item-caption">Paste</div>
|
||||||
|
<div class = "menu-item-shortcut">Ctrl-V</div>
|
||||||
|
</div>
|
||||||
|
</button>
|
||||||
|
<button class="menu-button" id="hmdduplicate" >
|
||||||
|
<div class = "menu-item">
|
||||||
|
<div class = "menu-item-caption">Duplicate</div>
|
||||||
|
<div class = "menu-item-shortcut">Ctrl-D</div>
|
||||||
|
</div>
|
||||||
|
</button>
|
||||||
|
<button class="menu-button" id="delete" >
|
||||||
|
<div class = "menu-item">
|
||||||
|
<div class = "menu-item-caption">Delete</div>
|
||||||
|
<div class = "menu-item-shortcut">Del</div>
|
||||||
|
</div>
|
||||||
|
</button>
|
||||||
|
<div class="menu-separator"></div>
|
||||||
|
<button class="menu-button" id="parent" >
|
||||||
|
<div class = "menu-item">
|
||||||
|
<div class = "menu-item-caption">Parent Entities to the Last Selected</div>
|
||||||
|
<div class = "menu-item-shortcut">Ctrl-P</div>
|
||||||
|
</div>
|
||||||
|
</button>
|
||||||
|
<button class="menu-button" id="unparent" >
|
||||||
|
<div class = "menu-item">
|
||||||
|
<div class = "menu-item-caption">Unparent Entity</div>
|
||||||
|
<div class = "menu-item-shortcut">Ctrl-Shift-P</div>
|
||||||
|
</div>
|
||||||
|
</button>
|
||||||
|
<div class="menu-separator"></div>
|
||||||
|
<button class="menu-button" id="moveEntitySelectionToAvatar" >
|
||||||
|
<div class = "menu-item">
|
||||||
|
<div class = "menu-item-caption">Move Selected Entities to Avatar</div>
|
||||||
|
<div class = "menu-item-shortcut"></div>
|
||||||
|
</div>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
<div class="entity-list-menu" id="selection-menu" >
|
||||||
|
<button class="menu-button" id="selectall" >
|
||||||
|
<div class = "menu-item">
|
||||||
|
<div class = "menu-item-caption">Select All</div>
|
||||||
|
<div class = "menu-item-shortcut">Ctrl-A</div>
|
||||||
|
</div>
|
||||||
|
</button>
|
||||||
|
<button class="menu-button" id="selectnone" >
|
||||||
|
<div class = "menu-item">
|
||||||
|
<div class = "menu-item-caption">Select None</div>
|
||||||
|
<div class = "menu-item-shortcut"></div>
|
||||||
|
</div>
|
||||||
|
</button>
|
||||||
|
<button class="menu-button" id="selectinverse" >
|
||||||
|
<div class = "menu-item">
|
||||||
|
<div class = "menu-item-caption">Inverse Selection</div>
|
||||||
|
<div class = "menu-item-shortcut">Ctrl-I</div>
|
||||||
|
</div>
|
||||||
|
</button>
|
||||||
|
<div class="menu-separator"></div>
|
||||||
|
<button class="menu-button" id="selectallinbox" >
|
||||||
|
<div class = "menu-item">
|
||||||
|
<div class = "menu-item-caption">Select All Entities In Box</div>
|
||||||
|
<div class = "menu-item-shortcut"></div>
|
||||||
|
</div>
|
||||||
|
</button>
|
||||||
|
<button class="menu-button" id="selectalltouchingbox" >
|
||||||
|
<div class = "menu-item">
|
||||||
|
<div class = "menu-item-caption">Select All Entities Touching Box</div>
|
||||||
|
<div class = "menu-item-shortcut"></div>
|
||||||
|
</div>
|
||||||
|
</button>
|
||||||
|
<div class="menu-separator"></div>
|
||||||
|
<button class="menu-button" id="selectparent" >
|
||||||
|
<div class = "menu-item">
|
||||||
|
<div class = "menu-item-caption">Select Parent</div>
|
||||||
|
<div class = "menu-item-shortcut"></div>
|
||||||
|
</div>
|
||||||
|
</button>
|
||||||
|
<button class="menu-button" id="selecttopparent" >
|
||||||
|
<div class = "menu-item">
|
||||||
|
<div class = "menu-item-caption">Select Top Parent</div>
|
||||||
|
<div class = "menu-item-shortcut"></div>
|
||||||
|
</div>
|
||||||
|
</button>
|
||||||
|
<button class="menu-button" id="addchildrentoselection" >
|
||||||
|
<div class = "menu-item">
|
||||||
|
<div class = "menu-item-caption">Add Children To Selection</div>
|
||||||
|
<div class = "menu-item-shortcut"></div>
|
||||||
|
</div>
|
||||||
|
</button>
|
||||||
|
<button class="menu-button" id="selectfamily" >
|
||||||
|
<div class = "menu-item">
|
||||||
|
<div class = "menu-item-caption">Select Family</div>
|
||||||
|
<div class = "menu-item-shortcut"></div>
|
||||||
|
</div>
|
||||||
|
</button>
|
||||||
|
<button class="menu-button" id="selecttopfamily" >
|
||||||
|
<div class = "menu-item">
|
||||||
|
<div class = "menu-item-caption">Select Top Family</div>
|
||||||
|
<div class = "menu-item-shortcut"></div>
|
||||||
|
</div>
|
||||||
|
</button>
|
||||||
|
<div class="menu-separator"></div>
|
||||||
|
<button class="menu-button" id="teleport-to-entity" >
|
||||||
|
<div class = "menu-item">
|
||||||
|
<div class = "menu-item-caption">Teleport To Selected Entities</div>
|
||||||
|
<div class = "menu-item-shortcut"></div>
|
||||||
|
</div>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
<div id="menuBackgroundOverlay" ></div>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|
|
@ -47,6 +47,14 @@ const COLUMNS = {
|
||||||
alwaysShown: true,
|
alwaysShown: true,
|
||||||
defaultSortOrder: ASCENDING_SORT,
|
defaultSortOrder: ASCENDING_SORT,
|
||||||
},
|
},
|
||||||
|
parentState: {
|
||||||
|
columnHeader: "A",
|
||||||
|
vglyph: true,
|
||||||
|
dropdownLabel: "Hierarchy",
|
||||||
|
propertyID: "parentState",
|
||||||
|
initialWidth: 0.08,
|
||||||
|
defaultSortOrder: DESCENDING_SORT,
|
||||||
|
},
|
||||||
name: {
|
name: {
|
||||||
columnHeader: "Name",
|
columnHeader: "Name",
|
||||||
propertyID: "name",
|
propertyID: "name",
|
||||||
|
@ -134,6 +142,20 @@ const COLUMNS = {
|
||||||
initialWidth: 0.06,
|
initialWidth: 0.06,
|
||||||
defaultSortOrder: DESCENDING_SORT,
|
defaultSortOrder: DESCENDING_SORT,
|
||||||
},
|
},
|
||||||
|
created: {
|
||||||
|
columnHeader: "Created (UTC)",
|
||||||
|
dropdownLabel: "Creation Date",
|
||||||
|
propertyID: "created",
|
||||||
|
initialWidth: 0.38,
|
||||||
|
defaultSortOrder: DESCENDING_SORT,
|
||||||
|
},
|
||||||
|
lastEdited: {
|
||||||
|
columnHeader: "Modified (UTC)",
|
||||||
|
dropdownLabel: "Modification Date",
|
||||||
|
propertyID: "lastEdited",
|
||||||
|
initialWidth: 0.38,
|
||||||
|
defaultSortOrder: DESCENDING_SORT,
|
||||||
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
const FILTER_TYPES = [
|
const FILTER_TYPES = [
|
||||||
|
@ -200,6 +222,9 @@ let elEntityTable,
|
||||||
elRefresh,
|
elRefresh,
|
||||||
elToggleLocked,
|
elToggleLocked,
|
||||||
elToggleVisible,
|
elToggleVisible,
|
||||||
|
elActionsMenu,
|
||||||
|
elSelectionMenu,
|
||||||
|
elMenuBackgroundOverlay,
|
||||||
elHmdMultiSelect,
|
elHmdMultiSelect,
|
||||||
elHmdCopy,
|
elHmdCopy,
|
||||||
elHmdCut,
|
elHmdCut,
|
||||||
|
@ -210,6 +235,18 @@ let elEntityTable,
|
||||||
elParent,
|
elParent,
|
||||||
elUnparent,
|
elUnparent,
|
||||||
elDelete,
|
elDelete,
|
||||||
|
elMoveEntitySelectionToAvatar,
|
||||||
|
elSelectAll,
|
||||||
|
elSelectInverse,
|
||||||
|
elSelectNone,
|
||||||
|
elSelectAllInBox,
|
||||||
|
elSelectAllTouchingBox,
|
||||||
|
elSelectParent,
|
||||||
|
elSelectTopParent,
|
||||||
|
elAddChildrenToSelection,
|
||||||
|
elSelectFamily,
|
||||||
|
elSelectTopFamily,
|
||||||
|
elTeleportToEntity,
|
||||||
elFilterTypeMultiselectBox,
|
elFilterTypeMultiselectBox,
|
||||||
elFilterTypeText,
|
elFilterTypeText,
|
||||||
elFilterTypeOptions,
|
elFilterTypeOptions,
|
||||||
|
@ -254,6 +291,9 @@ function loaded() {
|
||||||
elToggleLocked = document.getElementById("locked");
|
elToggleLocked = document.getElementById("locked");
|
||||||
elToggleVisible = document.getElementById("visible");
|
elToggleVisible = document.getElementById("visible");
|
||||||
elHmdMultiSelect = document.getElementById("hmdmultiselect");
|
elHmdMultiSelect = document.getElementById("hmdmultiselect");
|
||||||
|
elActionsMenu = document.getElementById("actions");
|
||||||
|
elSelectionMenu = document.getElementById("selection");
|
||||||
|
elMenuBackgroundOverlay = document.getElementById("menuBackgroundOverlay");
|
||||||
elHmdCopy = document.getElementById("hmdcopy");
|
elHmdCopy = document.getElementById("hmdcopy");
|
||||||
elHmdCut = document.getElementById("hmdcut");
|
elHmdCut = document.getElementById("hmdcut");
|
||||||
elHmdPaste = document.getElementById("hmdpaste");
|
elHmdPaste = document.getElementById("hmdpaste");
|
||||||
|
@ -263,6 +303,18 @@ function loaded() {
|
||||||
elParent = document.getElementById("parent");
|
elParent = document.getElementById("parent");
|
||||||
elUnparent = document.getElementById("unparent");
|
elUnparent = document.getElementById("unparent");
|
||||||
elDelete = document.getElementById("delete");
|
elDelete = document.getElementById("delete");
|
||||||
|
elMoveEntitySelectionToAvatar = document.getElementById("moveEntitySelectionToAvatar");
|
||||||
|
elSelectAll = document.getElementById("selectall");
|
||||||
|
elSelectInverse = document.getElementById("selectinverse");
|
||||||
|
elSelectNone = document.getElementById("selectnone");
|
||||||
|
elSelectAllInBox = document.getElementById("selectallinbox");
|
||||||
|
elSelectAllTouchingBox = document.getElementById("selectalltouchingbox");
|
||||||
|
elSelectParent = document.getElementById("selectparent");
|
||||||
|
elSelectTopParent = document.getElementById("selecttopparent");
|
||||||
|
elAddChildrenToSelection = document.getElementById("addchildrentoselection");
|
||||||
|
elSelectFamily = document.getElementById("selectfamily");
|
||||||
|
elSelectTopFamily = document.getElementById("selecttopfamily");
|
||||||
|
elTeleportToEntity = document.getElementById("teleport-to-entity");
|
||||||
elFilterTypeMultiselectBox = document.getElementById("filter-type-multiselect-box");
|
elFilterTypeMultiselectBox = document.getElementById("filter-type-multiselect-box");
|
||||||
elFilterTypeText = document.getElementById("filter-type-text");
|
elFilterTypeText = document.getElementById("filter-type-text");
|
||||||
elFilterTypeOptions = document.getElementById("filter-type-options");
|
elFilterTypeOptions = document.getElementById("filter-type-options");
|
||||||
|
@ -300,32 +352,146 @@ function loaded() {
|
||||||
}
|
}
|
||||||
EventBridge.emitWebEvent(JSON.stringify({ type: 'hmdMultiSelectMode', value: hmdMultiSelectMode }));
|
EventBridge.emitWebEvent(JSON.stringify({ type: 'hmdMultiSelectMode', value: hmdMultiSelectMode }));
|
||||||
};
|
};
|
||||||
|
elActionsMenu.onclick = function() {
|
||||||
|
document.getElementById("menuBackgroundOverlay").style.display = "block";
|
||||||
|
document.getElementById("actions-menu").style.display = "block";
|
||||||
|
};
|
||||||
|
elSelectionMenu.onclick = function() {
|
||||||
|
document.getElementById("menuBackgroundOverlay").style.display = "block";
|
||||||
|
document.getElementById("selection-menu").style.display = "block";
|
||||||
|
};
|
||||||
|
elMenuBackgroundOverlay.onclick = function() {
|
||||||
|
closeAllEntityListMenu();
|
||||||
|
};
|
||||||
elHmdCopy.onclick = function() {
|
elHmdCopy.onclick = function() {
|
||||||
EventBridge.emitWebEvent(JSON.stringify({ type: 'copy' }));
|
EventBridge.emitWebEvent(JSON.stringify({ type: 'copy' }));
|
||||||
|
closeAllEntityListMenu();
|
||||||
};
|
};
|
||||||
elHmdCut.onclick = function() {
|
elHmdCut.onclick = function() {
|
||||||
EventBridge.emitWebEvent(JSON.stringify({ type: 'cut' }));
|
EventBridge.emitWebEvent(JSON.stringify({ type: 'cut' }));
|
||||||
|
closeAllEntityListMenu();
|
||||||
};
|
};
|
||||||
elHmdPaste.onclick = function() {
|
elHmdPaste.onclick = function() {
|
||||||
EventBridge.emitWebEvent(JSON.stringify({ type: 'paste' }));
|
EventBridge.emitWebEvent(JSON.stringify({ type: 'paste' }));
|
||||||
|
closeAllEntityListMenu();
|
||||||
};
|
};
|
||||||
elHmdDuplicate.onclick = function() {
|
elHmdDuplicate.onclick = function() {
|
||||||
EventBridge.emitWebEvent(JSON.stringify({ type: 'duplicate' }));
|
EventBridge.emitWebEvent(JSON.stringify({ type: 'duplicate' }));
|
||||||
|
closeAllEntityListMenu();
|
||||||
};
|
};
|
||||||
elParent.onclick = function() {
|
elParent.onclick = function() {
|
||||||
EventBridge.emitWebEvent(JSON.stringify({ type: 'parent' }));
|
EventBridge.emitWebEvent(JSON.stringify({ type: 'parent' }));
|
||||||
|
closeAllEntityListMenu();
|
||||||
};
|
};
|
||||||
elUnparent.onclick = function() {
|
elUnparent.onclick = function() {
|
||||||
EventBridge.emitWebEvent(JSON.stringify({ type: 'unparent' }));
|
EventBridge.emitWebEvent(JSON.stringify({ type: 'unparent' }));
|
||||||
|
closeAllEntityListMenu();
|
||||||
};
|
};
|
||||||
elUndo.onclick = function() {
|
elUndo.onclick = function() {
|
||||||
EventBridge.emitWebEvent(JSON.stringify({ type: 'undo' }));
|
EventBridge.emitWebEvent(JSON.stringify({ type: 'undo' }));
|
||||||
|
closeAllEntityListMenu();
|
||||||
};
|
};
|
||||||
elRedo.onclick = function() {
|
elRedo.onclick = function() {
|
||||||
EventBridge.emitWebEvent(JSON.stringify({ type: 'redo' }));
|
EventBridge.emitWebEvent(JSON.stringify({ type: 'redo' }));
|
||||||
|
closeAllEntityListMenu();
|
||||||
};
|
};
|
||||||
elDelete.onclick = function() {
|
elDelete.onclick = function() {
|
||||||
EventBridge.emitWebEvent(JSON.stringify({ type: 'delete' }));
|
EventBridge.emitWebEvent(JSON.stringify({ type: 'delete' }));
|
||||||
|
closeAllEntityListMenu();
|
||||||
|
};
|
||||||
|
elMoveEntitySelectionToAvatar.onclick = function() {
|
||||||
|
EventBridge.emitWebEvent(JSON.stringify({ type: 'moveEntitySelectionToAvatar' }));
|
||||||
|
closeAllEntityListMenu();
|
||||||
|
};
|
||||||
|
elSelectAll.onclick = function() {
|
||||||
|
|
||||||
|
let visibleEntityIDs = visibleEntities.map(visibleEntity => visibleEntity.id);
|
||||||
|
let selectionIncludesAllVisibleEntityIDs = visibleEntityIDs.every(visibleEntityID => {
|
||||||
|
return selectedEntities.includes(visibleEntityID);
|
||||||
|
});
|
||||||
|
|
||||||
|
let selection = [];
|
||||||
|
|
||||||
|
if (!selectionIncludesAllVisibleEntityIDs) {
|
||||||
|
selection = visibleEntityIDs;
|
||||||
|
}
|
||||||
|
|
||||||
|
updateSelectedEntities(selection, false);
|
||||||
|
|
||||||
|
EventBridge.emitWebEvent(JSON.stringify({
|
||||||
|
"type": "selectionUpdate",
|
||||||
|
"focus": false,
|
||||||
|
"entityIds": selection
|
||||||
|
}));
|
||||||
|
|
||||||
|
closeAllEntityListMenu();
|
||||||
|
};
|
||||||
|
elSelectInverse.onclick = function() {
|
||||||
|
let visibleEntityIDs = visibleEntities.map(visibleEntity => visibleEntity.id);
|
||||||
|
let selectionIncludesAllVisibleEntityIDs = visibleEntityIDs.every(visibleEntityID => {
|
||||||
|
return selectedEntities.includes(visibleEntityID);
|
||||||
|
});
|
||||||
|
|
||||||
|
let selection = [];
|
||||||
|
|
||||||
|
if (!selectionIncludesAllVisibleEntityIDs) {
|
||||||
|
visibleEntityIDs.forEach(function(id) {
|
||||||
|
if (!selectedEntities.includes(id)) {
|
||||||
|
selection.push(id);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
updateSelectedEntities(selection, false);
|
||||||
|
|
||||||
|
EventBridge.emitWebEvent(JSON.stringify({
|
||||||
|
"type": "selectionUpdate",
|
||||||
|
"focus": false,
|
||||||
|
"entityIds": selection
|
||||||
|
}));
|
||||||
|
|
||||||
|
closeAllEntityListMenu();
|
||||||
|
};
|
||||||
|
elSelectNone.onclick = function() {
|
||||||
|
updateSelectedEntities([], false);
|
||||||
|
EventBridge.emitWebEvent(JSON.stringify({
|
||||||
|
"type": "selectionUpdate",
|
||||||
|
"focus": false,
|
||||||
|
"entityIds": []
|
||||||
|
}));
|
||||||
|
closeAllEntityListMenu();
|
||||||
|
};
|
||||||
|
elSelectAllInBox.onclick = function() {
|
||||||
|
EventBridge.emitWebEvent(JSON.stringify({ type: 'selectAllInBox' }));
|
||||||
|
closeAllEntityListMenu();
|
||||||
|
};
|
||||||
|
elSelectAllTouchingBox.onclick = function() {
|
||||||
|
EventBridge.emitWebEvent(JSON.stringify({ type: 'selectAllTouchingBox' }));
|
||||||
|
closeAllEntityListMenu();
|
||||||
|
};
|
||||||
|
elSelectParent.onclick = function() {
|
||||||
|
EventBridge.emitWebEvent(JSON.stringify({ type: 'selectParent' }));
|
||||||
|
closeAllEntityListMenu();
|
||||||
|
};
|
||||||
|
elSelectTopParent.onclick = function() {
|
||||||
|
EventBridge.emitWebEvent(JSON.stringify({ type: 'selectTopParent' }));
|
||||||
|
closeAllEntityListMenu();
|
||||||
|
};
|
||||||
|
elAddChildrenToSelection.onclick = function() {
|
||||||
|
EventBridge.emitWebEvent(JSON.stringify({ type: 'addChildrenToSelection' }));
|
||||||
|
closeAllEntityListMenu();
|
||||||
|
};
|
||||||
|
elSelectFamily.onclick = function() {
|
||||||
|
EventBridge.emitWebEvent(JSON.stringify({ type: 'selectFamily' }));
|
||||||
|
closeAllEntityListMenu();
|
||||||
|
};
|
||||||
|
elSelectTopFamily.onclick = function() {
|
||||||
|
EventBridge.emitWebEvent(JSON.stringify({ type: 'selectTopFamily' }));
|
||||||
|
closeAllEntityListMenu();
|
||||||
|
};
|
||||||
|
elTeleportToEntity.onclick = function () {
|
||||||
|
EventBridge.emitWebEvent(JSON.stringify({ type: "teleportToEntity" }));
|
||||||
|
closeAllEntityListMenu();
|
||||||
};
|
};
|
||||||
elToggleSpaceMode.onclick = function() {
|
elToggleSpaceMode.onclick = function() {
|
||||||
EventBridge.emitWebEvent(JSON.stringify({ type: 'toggleSpaceMode' }));
|
EventBridge.emitWebEvent(JSON.stringify({ type: 'toggleSpaceMode' }));
|
||||||
|
@ -384,9 +550,12 @@ function loaded() {
|
||||||
elTh.setAttribute("id", thID);
|
elTh.setAttribute("id", thID);
|
||||||
elTh.setAttribute("columnIndex", columnIndex);
|
elTh.setAttribute("columnIndex", columnIndex);
|
||||||
elTh.setAttribute("columnID", columnID);
|
elTh.setAttribute("columnID", columnID);
|
||||||
if (columnData.glyph) {
|
if (columnData.glyph || columnData.vglyph) {
|
||||||
let elGlyph = document.createElement("span");
|
let elGlyph = document.createElement("span");
|
||||||
elGlyph.className = "glyph";
|
elGlyph.className = "glyph";
|
||||||
|
if (columnData.vglyph) {
|
||||||
|
elGlyph.className = "vglyph";
|
||||||
|
}
|
||||||
elGlyph.innerHTML = columnData.columnHeader;
|
elGlyph.innerHTML = columnData.columnHeader;
|
||||||
elTh.appendChild(elGlyph);
|
elTh.appendChild(elGlyph);
|
||||||
} else {
|
} else {
|
||||||
|
@ -686,6 +855,9 @@ function loaded() {
|
||||||
isBaked: entity.isBaked,
|
isBaked: entity.isBaked,
|
||||||
drawCalls: displayIfNonZero(entity.drawCalls),
|
drawCalls: displayIfNonZero(entity.drawCalls),
|
||||||
hasScript: entity.hasScript,
|
hasScript: entity.hasScript,
|
||||||
|
parentState: entity.parentState,
|
||||||
|
created: entity.created,
|
||||||
|
lastEdited: entity.lastEdited,
|
||||||
elRow: null, // if this entity has a visible row element assigned to it
|
elRow: null, // if this entity has a visible row element assigned to it
|
||||||
selected: false // if this entity is selected for edit regardless of having a visible row
|
selected: false // if this entity is selected for edit regardless of having a visible row
|
||||||
};
|
};
|
||||||
|
@ -945,6 +1117,8 @@ function loaded() {
|
||||||
let elCell = elRow.childNodes[i];
|
let elCell = elRow.childNodes[i];
|
||||||
if (column.data.glyph) {
|
if (column.data.glyph) {
|
||||||
elCell.innerHTML = itemData[column.data.propertyID] ? column.data.columnHeader : null;
|
elCell.innerHTML = itemData[column.data.propertyID] ? column.data.columnHeader : null;
|
||||||
|
} else if (column.data.vglyph) {
|
||||||
|
elCell.innerHTML = itemData[column.data.propertyID];
|
||||||
} else {
|
} else {
|
||||||
let value = itemData[column.data.propertyID];
|
let value = itemData[column.data.propertyID];
|
||||||
if (column.data.format) {
|
if (column.data.format) {
|
||||||
|
@ -1032,6 +1206,9 @@ function loaded() {
|
||||||
let column = columnsByID[columnID];
|
let column = columnsByID[columnID];
|
||||||
let visible = column.elTh.style.visibility !== "hidden";
|
let visible = column.elTh.style.visibility !== "hidden";
|
||||||
let className = column.data.glyph ? "glyph" : "";
|
let className = column.data.glyph ? "glyph" : "";
|
||||||
|
if (column.data.vglyph) {
|
||||||
|
className = "vglyph";
|
||||||
|
}
|
||||||
className += visible ? "" : " hidden";
|
className += visible ? "" : " hidden";
|
||||||
return className;
|
return className;
|
||||||
}
|
}
|
||||||
|
@ -1381,7 +1558,7 @@ function loaded() {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (controlKey && keyCodeString === "A") {
|
if (controlKey && !shiftKey && !altKey && keyCodeString === "A") {
|
||||||
let visibleEntityIDs = visibleEntities.map(visibleEntity => visibleEntity.id);
|
let visibleEntityIDs = visibleEntities.map(visibleEntity => visibleEntity.id);
|
||||||
let selectionIncludesAllVisibleEntityIDs = visibleEntityIDs.every(visibleEntityID => {
|
let selectionIncludesAllVisibleEntityIDs = visibleEntityIDs.every(visibleEntityID => {
|
||||||
return selectedEntities.includes(visibleEntityID);
|
return selectedEntities.includes(visibleEntityID);
|
||||||
|
@ -1404,6 +1581,32 @@ function loaded() {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (controlKey && !shiftKey && !altKey && keyCodeString === "I") {
|
||||||
|
let visibleEntityIDs = visibleEntities.map(visibleEntity => visibleEntity.id);
|
||||||
|
let selectionIncludesAllVisibleEntityIDs = visibleEntityIDs.every(visibleEntityID => {
|
||||||
|
return selectedEntities.includes(visibleEntityID);
|
||||||
|
});
|
||||||
|
|
||||||
|
let selection = [];
|
||||||
|
|
||||||
|
if (!selectionIncludesAllVisibleEntityIDs) {
|
||||||
|
visibleEntityIDs.forEach(function(id) {
|
||||||
|
if (!selectedEntities.includes(id)) {
|
||||||
|
selection.push(id);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
updateSelectedEntities(selection);
|
||||||
|
|
||||||
|
EventBridge.emitWebEvent(JSON.stringify({
|
||||||
|
"type": "selectionUpdate",
|
||||||
|
"focus": false,
|
||||||
|
"entityIds": selection
|
||||||
|
}));
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
EventBridge.emitWebEvent(JSON.stringify({
|
EventBridge.emitWebEvent(JSON.stringify({
|
||||||
type: 'keyUpEvent',
|
type: 'keyUpEvent',
|
||||||
|
@ -1454,16 +1657,8 @@ function loaded() {
|
||||||
} else if (data.type === "confirmHMDstate") {
|
} else if (data.type === "confirmHMDstate") {
|
||||||
if (data.isHmd) {
|
if (data.isHmd) {
|
||||||
document.getElementById("hmdmultiselect").style.display = "inline";
|
document.getElementById("hmdmultiselect").style.display = "inline";
|
||||||
document.getElementById("hmdcopy").style.display = "inline";
|
|
||||||
document.getElementById("hmdcut").style.display = "inline";
|
|
||||||
document.getElementById("hmdpaste").style.display = "inline";
|
|
||||||
document.getElementById("hmdduplicate").style.display = "inline";
|
|
||||||
} else {
|
} else {
|
||||||
document.getElementById("hmdmultiselect").style.display = "none";
|
document.getElementById("hmdmultiselect").style.display = "none";
|
||||||
document.getElementById("hmdcopy").style.display = "none";
|
|
||||||
document.getElementById("hmdcut").style.display = "none";
|
|
||||||
document.getElementById("hmdpaste").style.display = "none";
|
|
||||||
document.getElementById("hmdduplicate").style.display = "none";
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
@ -1489,4 +1684,11 @@ function loaded() {
|
||||||
$(window).blur(function() {
|
$(window).blur(function() {
|
||||||
entityListContextMenu.close();
|
entityListContextMenu.close();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
function closeAllEntityListMenu() {
|
||||||
|
document.getElementById("menuBackgroundOverlay").style.display = "none";
|
||||||
|
document.getElementById("selection-menu").style.display = "none";
|
||||||
|
document.getElementById("actions-menu").style.display = "none";
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1618,7 +1618,8 @@ const GROUPS = [
|
||||||
type: "vec3",
|
type: "vec3",
|
||||||
vec3Type: "pyr",
|
vec3Type: "pyr",
|
||||||
multiplier: DEGREES_TO_RADIANS,
|
multiplier: DEGREES_TO_RADIANS,
|
||||||
decimals: 4,
|
decimals: 6,
|
||||||
|
step: 1,
|
||||||
subLabels: [ "x", "y", "z" ],
|
subLabels: [ "x", "y", "z" ],
|
||||||
unit: "deg/s",
|
unit: "deg/s",
|
||||||
propertyID: "localAngularVelocity",
|
propertyID: "localAngularVelocity",
|
||||||
|
|
|
@ -19,6 +19,7 @@
|
||||||
const SPACE_LOCAL = "local";
|
const SPACE_LOCAL = "local";
|
||||||
const SPACE_WORLD = "world";
|
const SPACE_WORLD = "world";
|
||||||
const HIGHLIGHT_LIST_NAME = "editHandleHighlightList";
|
const HIGHLIGHT_LIST_NAME = "editHandleHighlightList";
|
||||||
|
const MIN_DISTANCE_TO_REZ_FROM_AVATAR = 3;
|
||||||
|
|
||||||
Script.include([
|
Script.include([
|
||||||
"../../libraries/controllers.js",
|
"../../libraries/controllers.js",
|
||||||
|
@ -26,7 +27,6 @@ Script.include([
|
||||||
"../../libraries/utils.js"
|
"../../libraries/utils.js"
|
||||||
]);
|
]);
|
||||||
|
|
||||||
|
|
||||||
function deepCopy(v) {
|
function deepCopy(v) {
|
||||||
return JSON.parse(JSON.stringify(v));
|
return JSON.parse(JSON.stringify(v));
|
||||||
}
|
}
|
||||||
|
@ -636,6 +636,141 @@ SelectionManager = (function() {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
that.teleportToEntity = function() {
|
||||||
|
if (that.hasSelection()) {
|
||||||
|
var distanceFromTarget = MIN_DISTANCE_TO_REZ_FROM_AVATAR + Math.max(Math.max(that.worldDimensions.x, that.worldDimensions.y), that.worldDimensions.z);
|
||||||
|
var teleportTargetPosition = Vec3.sum(that.worldPosition, Vec3.multiplyQbyV(MyAvatar.orientation, { x: 0, y: 0, z: distanceFromTarget }));
|
||||||
|
MyAvatar.goToLocation(teleportTargetPosition, false);
|
||||||
|
} else {
|
||||||
|
audioFeedback.rejection();
|
||||||
|
Window.notifyEditError("You have nothing selected.");
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
that.moveEntitiesSelectionToAvatar = function() {
|
||||||
|
if (that.hasSelection() && that.hasUnlockedSelection()) {
|
||||||
|
that.saveProperties();
|
||||||
|
var distanceFromTarget = MIN_DISTANCE_TO_REZ_FROM_AVATAR + Math.max(Math.max(that.worldDimensions.x, that.worldDimensions.y), that.worldDimensions.z);
|
||||||
|
var targetPosition = Vec3.sum(MyAvatar.position, Vec3.multiplyQbyV(MyAvatar.orientation, { x: 0, y: 0, z: -distanceFromTarget }));
|
||||||
|
// editing a parent will cause all the children to automatically follow along, so don't
|
||||||
|
// edit any entity who has an ancestor in that.selections
|
||||||
|
var toMove = that.selections.filter(function (selection) {
|
||||||
|
if (that.selections.indexOf(that.savedProperties[selection].parentID) >= 0) {
|
||||||
|
return false; // a parent is also being moved, so don't issue an edit for this entity
|
||||||
|
} else {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
for (var i = 0; i < toMove.length; i++) {
|
||||||
|
var id = toMove[i];
|
||||||
|
var properties = that.savedProperties[id];
|
||||||
|
var relativePosition = Vec3.subtract(properties.position, that.worldPosition);
|
||||||
|
var newPosition = Vec3.sum(relativePosition, targetPosition);
|
||||||
|
Entities.editEntity(id, { "position": newPosition });
|
||||||
|
}
|
||||||
|
that._update(false, this);
|
||||||
|
} else {
|
||||||
|
audioFeedback.rejection();
|
||||||
|
Window.notifyEditError("You have nothing selected or the selection has locked entities.");
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
that.selectParent = function() {
|
||||||
|
if (that.hasSelection()) {
|
||||||
|
var currentSelection = that.selections;
|
||||||
|
that.selections = [];
|
||||||
|
for (var i = 0; i < currentSelection.length; i++) {
|
||||||
|
var properties = Entities.getEntityProperties(currentSelection[i], ['parentID']);
|
||||||
|
if (properties.parentID !== Uuid.NULL) {
|
||||||
|
that.selections.push(properties.parentID);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
that._update(true, this);
|
||||||
|
} else {
|
||||||
|
audioFeedback.rejection();
|
||||||
|
Window.notifyEditError("You have nothing selected.");
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
that.selectTopParent = function() {
|
||||||
|
if (that.hasSelection()) {
|
||||||
|
var currentSelection = that.selections;
|
||||||
|
that.selections = [];
|
||||||
|
for (var i = 0; i < currentSelection.length; i++) {
|
||||||
|
var topParentId = getTopParent(currentSelection[i]);
|
||||||
|
if (topParentId !== Uuid.NULL) {
|
||||||
|
that.selections.push(topParentId);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
that._update(true, this);
|
||||||
|
} else {
|
||||||
|
audioFeedback.rejection();
|
||||||
|
Window.notifyEditError("You have nothing selected.");
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
function getTopParent(id) {
|
||||||
|
var topParentId = Uuid.NULL;
|
||||||
|
var properties = Entities.getEntityProperties(id, ['parentID']);
|
||||||
|
if (properties.parentID === Uuid.NULL) {
|
||||||
|
topParentId = id;
|
||||||
|
} else {
|
||||||
|
topParentId = getTopParent(properties.parentID);
|
||||||
|
}
|
||||||
|
return topParentId;
|
||||||
|
}
|
||||||
|
|
||||||
|
that.addChildrenToSelection = function() {
|
||||||
|
if (that.hasSelection()) {
|
||||||
|
for (var i = 0; i < that.selections.length; i++) {
|
||||||
|
var childrenIDs = Entities.getChildrenIDs(that.selections[i]);
|
||||||
|
var collectNewChildren;
|
||||||
|
var j;
|
||||||
|
var k = 0;
|
||||||
|
do {
|
||||||
|
collectNewChildren = Entities.getChildrenIDs(childrenIDs[k]);
|
||||||
|
if (collectNewChildren.length > 0) {
|
||||||
|
for (j = 0; j < collectNewChildren.length; j++) {
|
||||||
|
childrenIDs.push(collectNewChildren[j]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
k++;
|
||||||
|
} while (k < childrenIDs.length);
|
||||||
|
if (childrenIDs.length > 0) {
|
||||||
|
for (j = 0; j < childrenIDs.length; j++) {
|
||||||
|
that.selections.push(childrenIDs[j]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
that._update(true, this);
|
||||||
|
} else {
|
||||||
|
audioFeedback.rejection();
|
||||||
|
Window.notifyEditError("You have nothing selected.");
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
that.hasUnlockedSelection = function() {
|
||||||
|
var selectionNotLocked = true;
|
||||||
|
for (var i = 0; i < that.selections.length; i++) {
|
||||||
|
var properties = Entities.getEntityProperties(that.selections[i], ['locked']);
|
||||||
|
if (properties.locked) {
|
||||||
|
selectionNotLocked = false;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return selectionNotLocked;
|
||||||
|
};
|
||||||
|
|
||||||
|
that.selectFamily = function() {
|
||||||
|
that.selectParent();
|
||||||
|
that.addChildrenToSelection();
|
||||||
|
};
|
||||||
|
|
||||||
|
that.selectTopFamily = function() {
|
||||||
|
that.selectTopParent();
|
||||||
|
that.addChildrenToSelection();
|
||||||
|
};
|
||||||
|
|
||||||
return that;
|
return that;
|
||||||
})();
|
})();
|
||||||
|
|
||||||
|
@ -660,8 +795,10 @@ SelectionDisplay = (function() {
|
||||||
const COLOR_HOVER = { red: 255, green: 220, blue: 82 };
|
const COLOR_HOVER = { red: 255, green: 220, blue: 82 };
|
||||||
const COLOR_DUPLICATOR = { red: 162, green: 0, blue: 255 };
|
const COLOR_DUPLICATOR = { red: 162, green: 0, blue: 255 };
|
||||||
const COLOR_ROTATE_CURRENT_RING = { red: 255, green: 99, blue: 9 };
|
const COLOR_ROTATE_CURRENT_RING = { red: 255, green: 99, blue: 9 };
|
||||||
const COLOR_BOUNDING_EDGE = { red: 128, green: 128, blue: 128 };
|
const COLOR_BOUNDING_EDGE = { red: 160, green: 160, blue: 160 };
|
||||||
const COLOR_SCALE_CUBE = { red: 160, green: 160, blue: 160 };
|
const COLOR_BOUNDING_EDGE_PARENT = { red: 194, green: 123, blue: 0 };
|
||||||
|
const COLOR_BOUNDING_EDGE_CHILDREN = { red: 0, green: 168, blue: 214 };
|
||||||
|
const COLOR_SCALE_CUBE = { red: 192, green: 192, blue: 192 };
|
||||||
const COLOR_DEBUG_PICK_PLANE = { red: 255, green: 255, blue: 255 };
|
const COLOR_DEBUG_PICK_PLANE = { red: 255, green: 255, blue: 255 };
|
||||||
const COLOR_DEBUG_PICK_PLANE_HIT = { red: 255, green: 165, blue: 0 };
|
const COLOR_DEBUG_PICK_PLANE_HIT = { red: 255, green: 165, blue: 0 };
|
||||||
|
|
||||||
|
@ -1791,6 +1928,18 @@ SelectionDisplay = (function() {
|
||||||
var rotationZ = Quat.multiply(rotation, localRotationZ);
|
var rotationZ = Quat.multiply(rotation, localRotationZ);
|
||||||
worldRotationZ = rotationZ;
|
worldRotationZ = rotationZ;
|
||||||
|
|
||||||
|
var handleBoundingBoxColor = COLOR_BOUNDING_EDGE;
|
||||||
|
if (SelectionManager.selections.length === 1) {
|
||||||
|
var parentState = getParentState(SelectionManager.selections[0]);
|
||||||
|
if (parentState === "CHILDREN") {
|
||||||
|
handleBoundingBoxColor = COLOR_BOUNDING_EDGE_CHILDREN;
|
||||||
|
} else {
|
||||||
|
if (parentState === "PARENT" || parentState === "PARENT_CHILDREN") {
|
||||||
|
handleBoundingBoxColor = COLOR_BOUNDING_EDGE_PARENT;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
var selectionBoxGeometry = {
|
var selectionBoxGeometry = {
|
||||||
position: position,
|
position: position,
|
||||||
rotation: rotation,
|
rotation: rotation,
|
||||||
|
@ -1912,6 +2061,7 @@ SelectionDisplay = (function() {
|
||||||
Entities.editEntity(handleBoundingBox, {
|
Entities.editEntity(handleBoundingBox, {
|
||||||
position: position,
|
position: position,
|
||||||
rotation: rotation,
|
rotation: rotation,
|
||||||
|
color: handleBoundingBoxColor,
|
||||||
dimensions: dimensions
|
dimensions: dimensions
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
@ -55,7 +55,7 @@ Rectangle {
|
||||||
|
|
||||||
Text {
|
Text {
|
||||||
id: text1
|
id: text1
|
||||||
text: qsTr("Material URL (Optional)")
|
text: qsTr("Material URL <i>(Optional)</i>")
|
||||||
color: "#ffffff"
|
color: "#ffffff"
|
||||||
font.pixelSize: 12
|
font.pixelSize: 12
|
||||||
}
|
}
|
||||||
|
|
|
@ -55,7 +55,7 @@ Rectangle {
|
||||||
|
|
||||||
Text {
|
Text {
|
||||||
id: text1
|
id: text1
|
||||||
text: qsTr("Model URL")
|
text: qsTr("Model URL <i>(.fbx, .fst, .glb, .gltf, .obj, .gz)</i>")
|
||||||
color: "#ffffff"
|
color: "#ffffff"
|
||||||
font.pixelSize: 12
|
font.pixelSize: 12
|
||||||
}
|
}
|
||||||
|
|
|
@ -415,6 +415,13 @@ input[type=button].glyph, button.hifi-edit-button.glyph {
|
||||||
padding: 0;
|
padding: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
input[type=button].normal, button.hifi-edit-button.normal {
|
||||||
|
font-family: FiraSans-SemiBold;
|
||||||
|
font-size: 15px;
|
||||||
|
text-transform: none;
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
|
||||||
input[type=button].vglyph, button.hifi-edit-button.vglyph {
|
input[type=button].vglyph, button.hifi-edit-button.vglyph {
|
||||||
font-family: Vircadia-Glyphs;
|
font-family: Vircadia-Glyphs;
|
||||||
font-size: 20px;
|
font-size: 20px;
|
||||||
|
@ -1236,7 +1243,6 @@ textarea:enabled[scrolling="true"]::-webkit-resizer {
|
||||||
background: #2e2e2e url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAACKSURBVChTjdAxDsMgDAXQT4UYuQIzCwsSKxsSJ4YDoByDY7AwUOG2aZMQqX+xhd9gzIwxA3/k8a7LCCFgraX+Fk4UY4RSCoyxNfwgzjlyzhhjXOEvSimhtUbvB3hGUkp472m2wxUKIaD3TnOCd6jWim3bvlBrfdjJOUeolEJoZj/4PMH83bl/BXgCWSs2Z09IjgoAAAAASUVORK5CYII=) no-repeat bottom right;
|
background: #2e2e2e url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAACKSURBVChTjdAxDsMgDAXQT4UYuQIzCwsSKxsSJ4YDoByDY7AwUOG2aZMQqX+xhd9gzIwxA3/k8a7LCCFgraX+Fk4UY4RSCoyxNfwgzjlyzhhjXOEvSimhtUbvB3hGUkp472m2wxUKIaD3TnOCd6jWim3bvlBrfdjJOUeolEJoZj/4PMH83bl/BXgCWSs2Z09IjgoAAAAASUVORK5CYII=) no-repeat bottom right;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
div#grid-section, body#entity-list-body {
|
div#grid-section, body#entity-list-body {
|
||||||
padding-bottom: 0;
|
padding-bottom: 0;
|
||||||
margin: 16px;
|
margin: 16px;
|
||||||
|
@ -1267,12 +1273,6 @@ div#grid-section, body#entity-list-body {
|
||||||
border-bottom-left-radius: 0;
|
border-bottom-left-radius: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
#delete {
|
|
||||||
float: right;
|
|
||||||
margin-right: 0;
|
|
||||||
background-color: #ff0000;
|
|
||||||
}
|
|
||||||
|
|
||||||
#entity-list {
|
#entity-list {
|
||||||
position: relative; /* New positioning context. */
|
position: relative; /* New positioning context. */
|
||||||
}
|
}
|
||||||
|
@ -1448,6 +1448,11 @@ input[type=button]#export {
|
||||||
font-size: 15px;
|
font-size: 15px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#entity-table-scroll .vglyph {
|
||||||
|
font-family: Vircadia-Glyphs;
|
||||||
|
font-size: 15px;
|
||||||
|
}
|
||||||
|
|
||||||
#entity-table {
|
#entity-table {
|
||||||
margin-top: -28px;
|
margin-top: -28px;
|
||||||
margin-bottom: -18px;
|
margin-bottom: -18px;
|
||||||
|
@ -1460,7 +1465,7 @@ input[type=button]#export {
|
||||||
background: none;
|
background: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
#entity-table .glyph {
|
#entity-table .glyph .vglyph {
|
||||||
margin: 0 -2px 0 -2px;
|
margin: 0 -2px 0 -2px;
|
||||||
vertical-align: middle;
|
vertical-align: middle;
|
||||||
}
|
}
|
||||||
|
@ -1493,11 +1498,11 @@ input[type=button]#export {
|
||||||
outline: none;
|
outline: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
#entity-table th .glyph {
|
#entity-table th .glyph .vglyph {
|
||||||
position: relative;
|
position: relative;
|
||||||
left: 4px;
|
left: 4px;
|
||||||
}
|
}
|
||||||
#entity-table th .glyph + .sort-order {
|
#entity-table th .glyph .vglyph + .sort-order {
|
||||||
position: relative;
|
position: relative;
|
||||||
left: 4px;
|
left: 4px;
|
||||||
}
|
}
|
||||||
|
@ -1524,7 +1529,7 @@ input[type=button]#export {
|
||||||
#entity-table td {
|
#entity-table td {
|
||||||
box-sizing: border-box;
|
box-sizing: border-box;
|
||||||
}
|
}
|
||||||
#entity-table td.glyph {
|
#entity-table td .glyph .vglyph {
|
||||||
text-align: center;
|
text-align: center;
|
||||||
padding: 0;
|
padding: 0;
|
||||||
}
|
}
|
||||||
|
@ -1860,3 +1865,71 @@ div.multiZoneSelToolbar {
|
||||||
padding: 0px;
|
padding: 0px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#menuBackgroundOverlay{
|
||||||
|
background-color:transparent;
|
||||||
|
position:fixed;
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
top:0;
|
||||||
|
left:0;
|
||||||
|
right:0;
|
||||||
|
bottom:0;
|
||||||
|
display:none;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.entity-list-menu {
|
||||||
|
position: fixed;
|
||||||
|
display: none;
|
||||||
|
width: 70%;
|
||||||
|
height: 30px;
|
||||||
|
top: 42px;
|
||||||
|
left: 150px;
|
||||||
|
right: 0;
|
||||||
|
bottom: 0;
|
||||||
|
border-style: solid;
|
||||||
|
border-color: #505050;
|
||||||
|
border-width: 1px;
|
||||||
|
background-color: #c0c0c0;
|
||||||
|
z-index: 2;
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.menu-separator{
|
||||||
|
width: 90%;
|
||||||
|
height: 2px;
|
||||||
|
background-color: #505050;
|
||||||
|
}
|
||||||
|
|
||||||
|
button.menu-button {
|
||||||
|
font-family: FiraSans-SemiBold;
|
||||||
|
font-size: 15px;
|
||||||
|
width: 100%;
|
||||||
|
height: auto;
|
||||||
|
border-radius: 0;
|
||||||
|
padding: 6px;
|
||||||
|
text-align: left;
|
||||||
|
background-color: #c0c0c0;
|
||||||
|
border: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
button.menu-button:hover {
|
||||||
|
background-color: #00B4EF;
|
||||||
|
border: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
button.menu-button:active {
|
||||||
|
background-color: #00B4EF;
|
||||||
|
border: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.menu-item {
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.menu-item-caption {
|
||||||
|
float: left;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.menu-item-shortcut {
|
||||||
|
float: right;
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue