From d6d10c65a0762652287457346620a09aed0a3b5c Mon Sep 17 00:00:00 2001 From: Robert Long Date: Wed, 20 Jan 2021 15:13:34 -0800 Subject: [PATCH 1/4] Add node enabled flag --- src/editor/Editor.js | 2 +- src/editor/nodes/EditorNodeMixin.js | 87 ++-- src/editor/nodes/FloorPlanNode.js | 13 +- src/editor/nodes/SceneNode.js | 6 +- src/editor/utils/traverseFilteredSubtrees.js | 11 + src/ui/properties/PropertiesPanelContainer.js | 17 +- test/integration/snapshots/Editor.test.js.md | 444 ++++++++++++++++++ .../integration/snapshots/Editor.test.js.snap | Bin 27475 -> 29421 bytes 8 files changed, 542 insertions(+), 38 deletions(-) create mode 100644 src/editor/utils/traverseFilteredSubtrees.js diff --git a/src/editor/Editor.js b/src/editor/Editor.js index 6dc576f1..c24521c3 100644 --- a/src/editor/Editor.js +++ b/src/editor/Editor.js @@ -350,7 +350,7 @@ export default class Editor extends EventEmitter { const scene = this.scene; - const floorPlanNode = scene.findNodeByType(FloorPlanNode); + const floorPlanNode = scene.findNodeByType(FloorPlanNode, false); if (floorPlanNode) { await floorPlanNode.generate(signal); diff --git a/src/editor/nodes/EditorNodeMixin.js b/src/editor/nodes/EditorNodeMixin.js index 83ff002c..b47b94af 100644 --- a/src/editor/nodes/EditorNodeMixin.js +++ b/src/editor/nodes/EditorNodeMixin.js @@ -10,6 +10,7 @@ import { Color, Object3D } from "three"; import serializeColor from "../utils/serializeColor"; import LoadingCube from "../objects/LoadingCube"; import ErrorIcon from "../objects/ErrorIcon"; +import traverseFilteredSubtrees from "../utils/traverseFilteredSubtrees"; export default function EditorNodeMixin(Object3DClass) { return class extends Object3DClass { @@ -56,7 +57,13 @@ export default function EditorNodeMixin(Object3DClass) { const visibleComponent = json.components.find(c => c.name === "visible"); if (visibleComponent) { - node.visible = visibleComponent.props.visible; + node._visible = visibleComponent.props.visible; + } + + const editorSettingsComponent = json.components.find(c => c.name === "editor-settings"); + + if (editorSettingsComponent) { + node.enabled = editorSettingsComponent.props.enabled; } } @@ -77,6 +84,8 @@ export default function EditorNodeMixin(Object3DClass) { this.staticMode = StaticModes.Inherits; this.originalStaticMode = null; + this.enabled = true; + this._visible = true; this.saveParent = false; this.loadingCube = null; this.errorIcon = null; @@ -110,10 +119,20 @@ export default function EditorNodeMixin(Object3DClass) { } this.issues = source.issues.slice(); + this._visible = source._visible; + this.enabled = source.enabled; return this; } + get visible() { + return this.enabled && this._visible; + } + + set visible(value) { + this._visible = value; + } + onPlay() {} onUpdate(dt) { @@ -163,7 +182,13 @@ export default function EditorNodeMixin(Object3DClass) { { name: "visible", props: { - visible: this.visible + visible: this._visible + } + }, + { + name: "editor-settings", + props: { + enabled: this.enabled } } ] @@ -345,40 +370,46 @@ export default function EditorNodeMixin(Object3DClass) { return isDynamic(this); } - findNodeByType(nodeType) { - if (this.constructor === nodeType) { - return this; - } + findNodeByType(nodeType, includeDisabled = true) { + let node = null; - for (const child of this.children) { - if (child.isNode) { - const result = child.findNodeByType(nodeType); - - if (result) { - return result; - } + traverseFilteredSubtrees(this, child => { + if (node) { + return false; } - } - return null; + if (!child.isNode) { + return; + } + + if (!child.enabled && !includeDisabled) { + return false; + } + + if (child.constructor === nodeType) { + node = child; + } + }); + + return node; } - getNodesByType(nodeType) { + getNodesByType(nodeType, includeDisabled = true) { const nodes = []; - if (this.constructor === nodeType) { - nodes.push(this); - } - - for (const child of this.children) { - if (child.isNode) { - const results = child.getNodesByType(nodeType); - - for (const result of results) { - nodes.push(result); - } + traverseFilteredSubtrees(this, child => { + if (!child.isNode) { + return; } - } + + if (!child.enabled && !includeDisabled) { + return false; + } + + if (child.constructor === nodeType) { + nodes.push(this); + } + }); return nodes; } diff --git a/src/editor/nodes/FloorPlanNode.js b/src/editor/nodes/FloorPlanNode.js index 848e6e77..8f647f60 100644 --- a/src/editor/nodes/FloorPlanNode.js +++ b/src/editor/nodes/FloorPlanNode.js @@ -9,6 +9,7 @@ import RecastClient from "../recast/RecastClient"; import HeightfieldClient from "../heightfield/HeightfieldClient"; import SpawnPointNode from "../nodes/SpawnPointNode"; import * as recastWasmUrl from "recast-wasm/dist/recast.wasm"; +import traverseFilteredSubtrees from "../utils/traverseFilteredSubtrees"; const recastClient = new RecastClient(); const heightfieldClient = new HeightfieldClient(); @@ -102,13 +103,17 @@ export default class FloorPlanNode extends EditorNodeMixin(FloorPlan) { const collidableMeshes = []; const walkableMeshes = []; - const groundPlaneNode = this.editor.scene.findNodeByType(GroundPlaneNode); + const groundPlaneNode = this.editor.scene.findNodeByType(GroundPlaneNode, false); if (groundPlaneNode && groundPlaneNode.walkable) { walkableMeshes.push(groundPlaneNode.walkableMesh); } - this.editor.scene.traverse(object => { + traverseFilteredSubtrees(this.editor.scene, object => { + if (!object.enabled) { + return false; + } + if (object.isNode && object.model && (object.collidable || object.walkable)) { object.model.traverse(child => { if (child.isMesh) { @@ -124,7 +129,7 @@ export default class FloorPlanNode extends EditorNodeMixin(FloorPlan) { } }); - const boxColliderNodes = this.editor.scene.getNodesByType(BoxColliderNode); + const boxColliderNodes = this.editor.scene.getNodesByType(BoxColliderNode, false); for (const node of boxColliderNodes) { if (node.walkable) { @@ -179,7 +184,7 @@ export default class FloorPlanNode extends EditorNodeMixin(FloorPlan) { let heightfield = null; if (!this.forceTrimesh) { - const spawnPoints = this.editor.scene.getNodesByType(SpawnPointNode); + const spawnPoints = this.editor.scene.getNodesByType(SpawnPointNode, false); let minY = Number.POSITIVE_INFINITY; for (let j = 0; j < spawnPoints.length; j++) { diff --git a/src/editor/nodes/SceneNode.js b/src/editor/nodes/SceneNode.js index 785415c7..c216e0b8 100644 --- a/src/editor/nodes/SceneNode.js +++ b/src/editor/nodes/SceneNode.js @@ -528,7 +528,11 @@ export default class SceneNode extends EditorNodeMixin(Scene) { }); for (const node of nodeList) { - node.prepareForExport(ctx); + if (node.enabled) { + node.prepareForExport(ctx); + } else { + node.parent.remove(node); + } } this.addGLTFComponent("background", { diff --git a/src/editor/utils/traverseFilteredSubtrees.js b/src/editor/utils/traverseFilteredSubtrees.js new file mode 100644 index 00000000..1fc2969f --- /dev/null +++ b/src/editor/utils/traverseFilteredSubtrees.js @@ -0,0 +1,11 @@ +export default function traverseFilteredSubtrees(object, cb) { + if (cb(object) === false) { + return; + } + + const children = object.children; + + for (let i = 0; i < children.length; i++) { + traverseFilteredSubtrees(children[i], cb); + } +} diff --git a/src/ui/properties/PropertiesPanelContainer.js b/src/ui/properties/PropertiesPanelContainer.js index 539a3f96..85838f57 100644 --- a/src/ui/properties/PropertiesPanelContainer.js +++ b/src/ui/properties/PropertiesPanelContainer.js @@ -98,7 +98,11 @@ class PropertiesPanelContainer extends Component { }; onChangeVisible = value => { - this.props.editor.setPropertySelected("visible", value); + this.props.editor.setPropertySelected("_visible", value); + }; + + onChangeEnabled = value => { + this.props.editor.setPropertySelected("enabled", value); }; render() { @@ -140,9 +144,14 @@ class PropertiesPanelContainer extends Component { {activeNode.nodeName !== "Scene" && ( - - - + <> + + + + + + + )} {!disableTransform && } diff --git a/test/integration/snapshots/Editor.test.js.md b/test/integration/snapshots/Editor.test.js.md index 3ac6f466..29908e70 100644 --- a/test/integration/snapshots/Editor.test.js.md +++ b/test/integration/snapshots/Editor.test.js.md @@ -38,6 +38,12 @@ Generated by [AVA](https://avajs.dev). visible: true, }, }, + { + name: 'editor-settings', + props: { + enabled: true, + }, + }, { name: 'box-collider', props: {}, @@ -75,6 +81,12 @@ Generated by [AVA](https://avajs.dev). visible: true, }, }, + { + name: 'editor-settings', + props: { + enabled: true, + }, + }, { name: 'trigger-volume', props: { @@ -120,6 +132,12 @@ Generated by [AVA](https://avajs.dev). visible: true, }, }, + { + name: 'editor-settings', + props: { + enabled: true, + }, + }, { name: 'spawner', props: { @@ -160,6 +178,12 @@ Generated by [AVA](https://avajs.dev). visible: true, }, }, + { + name: 'editor-settings', + props: { + enabled: true, + }, + }, { name: 'group', props: {}, @@ -197,6 +221,12 @@ Generated by [AVA](https://avajs.dev). visible: true, }, }, + { + name: 'editor-settings', + props: { + enabled: true, + }, + }, { name: 'video', props: { @@ -249,6 +279,12 @@ Generated by [AVA](https://avajs.dev). visible: true, }, }, + { + name: 'editor-settings', + props: { + enabled: true, + }, + }, { name: 'image', props: { @@ -292,6 +328,12 @@ Generated by [AVA](https://avajs.dev). visible: true, }, }, + { + name: 'editor-settings', + props: { + enabled: true, + }, + }, { name: 'gltf-model', props: { @@ -351,6 +393,12 @@ Generated by [AVA](https://avajs.dev). visible: true, }, }, + { + name: 'editor-settings', + props: { + enabled: true, + }, + }, { name: 'ambient-light', props: { @@ -391,6 +439,12 @@ Generated by [AVA](https://avajs.dev). visible: true, }, }, + { + name: 'editor-settings', + props: { + enabled: true, + }, + }, { name: 'spawn-point', props: {}, @@ -428,6 +482,12 @@ Generated by [AVA](https://avajs.dev). visible: true, }, }, + { + name: 'editor-settings', + props: { + enabled: true, + }, + }, { name: 'gltf-model', props: { @@ -491,6 +551,12 @@ Generated by [AVA](https://avajs.dev). visible: true, }, }, + { + name: 'editor-settings', + props: { + enabled: true, + }, + }, { name: 'point-light', props: { @@ -539,6 +605,12 @@ Generated by [AVA](https://avajs.dev). visible: true, }, }, + { + name: 'editor-settings', + props: { + enabled: true, + }, + }, { name: 'directional-light', props: { @@ -586,6 +658,12 @@ Generated by [AVA](https://avajs.dev). visible: true, }, }, + { + name: 'editor-settings', + props: { + enabled: true, + }, + }, { name: 'spot-light', props: { @@ -636,6 +714,12 @@ Generated by [AVA](https://avajs.dev). visible: true, }, }, + { + name: 'editor-settings', + props: { + enabled: true, + }, + }, { name: 'floor-plan', props: { @@ -684,6 +768,12 @@ Generated by [AVA](https://avajs.dev). visible: true, }, }, + { + name: 'editor-settings', + props: { + enabled: true, + }, + }, { name: 'image', props: { @@ -727,6 +817,12 @@ Generated by [AVA](https://avajs.dev). visible: true, }, }, + { + name: 'editor-settings', + props: { + enabled: true, + }, + }, { name: 'link', props: { @@ -766,6 +862,12 @@ Generated by [AVA](https://avajs.dev). visible: true, }, }, + { + name: 'editor-settings', + props: { + enabled: true, + }, + }, { name: 'skybox', props: { @@ -812,6 +914,12 @@ Generated by [AVA](https://avajs.dev). visible: true, }, }, + { + name: 'editor-settings', + props: { + enabled: true, + }, + }, { name: 'ground-plane', props: { @@ -861,6 +969,12 @@ Generated by [AVA](https://avajs.dev). visible: true, }, }, + { + name: 'editor-settings', + props: { + enabled: true, + }, + }, { name: 'video', props: { @@ -913,6 +1027,12 @@ Generated by [AVA](https://avajs.dev). visible: true, }, }, + { + name: 'editor-settings', + props: { + enabled: true, + }, + }, { name: 'spawn-point', props: {}, @@ -950,6 +1070,12 @@ Generated by [AVA](https://avajs.dev). visible: true, }, }, + { + name: 'editor-settings', + props: { + enabled: true, + }, + }, { name: 'hemisphere-light', props: { @@ -991,6 +1117,12 @@ Generated by [AVA](https://avajs.dev). visible: true, }, }, + { + name: 'editor-settings', + props: { + enabled: true, + }, + }, { name: 'group', props: {}, @@ -1079,6 +1211,12 @@ Generated by [AVA](https://avajs.dev). visible: true, }, }, + { + name: 'editor-settings', + props: { + enabled: true, + }, + }, { name: 'trigger-volume', props: { @@ -1124,6 +1262,12 @@ Generated by [AVA](https://avajs.dev). visible: true, }, }, + { + name: 'editor-settings', + props: { + enabled: true, + }, + }, { name: 'point-light', props: { @@ -1211,6 +1355,12 @@ Generated by [AVA](https://avajs.dev). visible: true, }, }, + { + name: 'editor-settings', + props: { + enabled: true, + }, + }, { name: 'hemisphere-light', props: { @@ -1252,6 +1402,12 @@ Generated by [AVA](https://avajs.dev). visible: true, }, }, + { + name: 'editor-settings', + props: { + enabled: true, + }, + }, { name: 'floor-plan', props: { @@ -1300,6 +1456,12 @@ Generated by [AVA](https://avajs.dev). visible: true, }, }, + { + name: 'editor-settings', + props: { + enabled: true, + }, + }, { name: 'ambient-light', props: { @@ -1340,6 +1502,12 @@ Generated by [AVA](https://avajs.dev). visible: true, }, }, + { + name: 'editor-settings', + props: { + enabled: true, + }, + }, { name: 'simple-water', props: { @@ -1400,6 +1568,12 @@ Generated by [AVA](https://avajs.dev). visible: true, }, }, + { + name: 'editor-settings', + props: { + enabled: true, + }, + }, { name: 'spawn-point', props: {}, @@ -1437,6 +1611,12 @@ Generated by [AVA](https://avajs.dev). visible: true, }, }, + { + name: 'editor-settings', + props: { + enabled: true, + }, + }, { name: 'kit-piece', props: { @@ -1502,6 +1682,12 @@ Generated by [AVA](https://avajs.dev). visible: true, }, }, + { + name: 'editor-settings', + props: { + enabled: true, + }, + }, { name: 'link', props: { @@ -1541,6 +1727,12 @@ Generated by [AVA](https://avajs.dev). visible: true, }, }, + { + name: 'editor-settings', + props: { + enabled: true, + }, + }, { name: 'kit-piece', props: { @@ -1606,6 +1798,12 @@ Generated by [AVA](https://avajs.dev). visible: true, }, }, + { + name: 'editor-settings', + props: { + enabled: true, + }, + }, { name: 'gltf-model', props: { @@ -1665,6 +1863,12 @@ Generated by [AVA](https://avajs.dev). visible: true, }, }, + { + name: 'editor-settings', + props: { + enabled: true, + }, + }, { name: 'particle-emitter', props: { @@ -1731,6 +1935,12 @@ Generated by [AVA](https://avajs.dev). visible: true, }, }, + { + name: 'editor-settings', + props: { + enabled: true, + }, + }, { name: 'image', props: { @@ -1774,6 +1984,12 @@ Generated by [AVA](https://avajs.dev). visible: true, }, }, + { + name: 'editor-settings', + props: { + enabled: true, + }, + }, { name: 'video', props: { @@ -1826,6 +2042,12 @@ Generated by [AVA](https://avajs.dev). visible: true, }, }, + { + name: 'editor-settings', + props: { + enabled: true, + }, + }, { name: 'box-collider', props: {}, @@ -1863,6 +2085,12 @@ Generated by [AVA](https://avajs.dev). visible: true, }, }, + { + name: 'editor-settings', + props: { + enabled: true, + }, + }, { name: 'spawner', props: { @@ -1903,6 +2131,12 @@ Generated by [AVA](https://avajs.dev). visible: true, }, }, + { + name: 'editor-settings', + props: { + enabled: true, + }, + }, { name: 'media-frame', props: { @@ -1942,6 +2176,12 @@ Generated by [AVA](https://avajs.dev). visible: true, }, }, + { + name: 'editor-settings', + props: { + enabled: true, + }, + }, { name: 'audio', props: { @@ -1993,6 +2233,12 @@ Generated by [AVA](https://avajs.dev). visible: true, }, }, + { + name: 'editor-settings', + props: { + enabled: true, + }, + }, { name: 'directional-light', props: { @@ -2040,6 +2286,12 @@ Generated by [AVA](https://avajs.dev). visible: true, }, }, + { + name: 'editor-settings', + props: { + enabled: true, + }, + }, { name: 'ground-plane', props: { @@ -2089,6 +2341,12 @@ Generated by [AVA](https://avajs.dev). visible: true, }, }, + { + name: 'editor-settings', + props: { + enabled: true, + }, + }, { name: 'skybox', props: { @@ -2135,6 +2393,12 @@ Generated by [AVA](https://avajs.dev). visible: true, }, }, + { + name: 'editor-settings', + props: { + enabled: true, + }, + }, { name: 'group', props: {}, @@ -2172,6 +2436,12 @@ Generated by [AVA](https://avajs.dev). visible: true, }, }, + { + name: 'editor-settings', + props: { + enabled: true, + }, + }, { name: 'waypoint', props: { @@ -2251,6 +2521,12 @@ Generated by [AVA](https://avajs.dev). visible: true, }, }, + { + name: 'editor-settings', + props: { + enabled: true, + }, + }, { name: 'trigger-volume', props: { @@ -2296,6 +2572,12 @@ Generated by [AVA](https://avajs.dev). visible: true, }, }, + { + name: 'editor-settings', + props: { + enabled: true, + }, + }, { name: 'point-light', props: { @@ -2383,6 +2665,12 @@ Generated by [AVA](https://avajs.dev). visible: true, }, }, + { + name: 'editor-settings', + props: { + enabled: true, + }, + }, { name: 'hemisphere-light', props: { @@ -2424,6 +2712,12 @@ Generated by [AVA](https://avajs.dev). visible: true, }, }, + { + name: 'editor-settings', + props: { + enabled: true, + }, + }, { name: 'floor-plan', props: { @@ -2472,6 +2766,12 @@ Generated by [AVA](https://avajs.dev). visible: true, }, }, + { + name: 'editor-settings', + props: { + enabled: true, + }, + }, { name: 'ambient-light', props: { @@ -2512,6 +2812,12 @@ Generated by [AVA](https://avajs.dev). visible: true, }, }, + { + name: 'editor-settings', + props: { + enabled: true, + }, + }, { name: 'simple-water', props: { @@ -2572,6 +2878,12 @@ Generated by [AVA](https://avajs.dev). visible: true, }, }, + { + name: 'editor-settings', + props: { + enabled: true, + }, + }, { name: 'scene-preview-camera', props: {}, @@ -2609,6 +2921,12 @@ Generated by [AVA](https://avajs.dev). visible: true, }, }, + { + name: 'editor-settings', + props: { + enabled: true, + }, + }, { name: 'spawn-point', props: {}, @@ -2646,6 +2964,12 @@ Generated by [AVA](https://avajs.dev). visible: true, }, }, + { + name: 'editor-settings', + props: { + enabled: true, + }, + }, { name: 'kit-piece', props: { @@ -2711,6 +3035,12 @@ Generated by [AVA](https://avajs.dev). visible: true, }, }, + { + name: 'editor-settings', + props: { + enabled: true, + }, + }, { name: 'link', props: { @@ -2750,6 +3080,12 @@ Generated by [AVA](https://avajs.dev). visible: true, }, }, + { + name: 'editor-settings', + props: { + enabled: true, + }, + }, { name: 'kit-piece', props: { @@ -2815,6 +3151,12 @@ Generated by [AVA](https://avajs.dev). visible: true, }, }, + { + name: 'editor-settings', + props: { + enabled: true, + }, + }, { name: 'gltf-model', props: { @@ -2874,6 +3216,12 @@ Generated by [AVA](https://avajs.dev). visible: true, }, }, + { + name: 'editor-settings', + props: { + enabled: true, + }, + }, { name: 'particle-emitter', props: { @@ -2940,6 +3288,12 @@ Generated by [AVA](https://avajs.dev). visible: true, }, }, + { + name: 'editor-settings', + props: { + enabled: true, + }, + }, { name: 'image', props: { @@ -2983,6 +3337,12 @@ Generated by [AVA](https://avajs.dev). visible: true, }, }, + { + name: 'editor-settings', + props: { + enabled: true, + }, + }, { name: 'video', props: { @@ -3035,6 +3395,12 @@ Generated by [AVA](https://avajs.dev). visible: true, }, }, + { + name: 'editor-settings', + props: { + enabled: true, + }, + }, { name: 'box-collider', props: {}, @@ -3072,6 +3438,12 @@ Generated by [AVA](https://avajs.dev). visible: true, }, }, + { + name: 'editor-settings', + props: { + enabled: true, + }, + }, { name: 'spawner', props: { @@ -3112,6 +3484,12 @@ Generated by [AVA](https://avajs.dev). visible: true, }, }, + { + name: 'editor-settings', + props: { + enabled: true, + }, + }, { name: 'media-frame', props: { @@ -3151,6 +3529,12 @@ Generated by [AVA](https://avajs.dev). visible: true, }, }, + { + name: 'editor-settings', + props: { + enabled: true, + }, + }, { name: 'audio', props: { @@ -3202,6 +3586,12 @@ Generated by [AVA](https://avajs.dev). visible: true, }, }, + { + name: 'editor-settings', + props: { + enabled: true, + }, + }, { name: 'directional-light', props: { @@ -3249,6 +3639,12 @@ Generated by [AVA](https://avajs.dev). visible: true, }, }, + { + name: 'editor-settings', + props: { + enabled: true, + }, + }, { name: 'ground-plane', props: { @@ -3298,6 +3694,12 @@ Generated by [AVA](https://avajs.dev). visible: true, }, }, + { + name: 'editor-settings', + props: { + enabled: true, + }, + }, { name: 'skybox', props: { @@ -3344,6 +3746,12 @@ Generated by [AVA](https://avajs.dev). visible: true, }, }, + { + name: 'editor-settings', + props: { + enabled: true, + }, + }, { name: 'group', props: {}, @@ -3381,6 +3789,12 @@ Generated by [AVA](https://avajs.dev). visible: true, }, }, + { + name: 'editor-settings', + props: { + enabled: true, + }, + }, { name: 'waypoint', props: { @@ -3499,6 +3913,12 @@ Generated by [AVA](https://avajs.dev). visible: true, }, }, + { + name: 'editor-settings', + props: { + enabled: true, + }, + }, { name: 'floor-plan', props: { @@ -3547,6 +3967,12 @@ Generated by [AVA](https://avajs.dev). visible: true, }, }, + { + name: 'editor-settings', + props: { + enabled: true, + }, + }, { name: 'spawn-point', props: {}, @@ -3584,6 +4010,12 @@ Generated by [AVA](https://avajs.dev). visible: true, }, }, + { + name: 'editor-settings', + props: { + enabled: true, + }, + }, { name: 'gltf-model', props: { @@ -3643,6 +4075,12 @@ Generated by [AVA](https://avajs.dev). visible: true, }, }, + { + name: 'editor-settings', + props: { + enabled: true, + }, + }, { name: 'directional-light', props: { @@ -3690,6 +4128,12 @@ Generated by [AVA](https://avajs.dev). visible: true, }, }, + { + name: 'editor-settings', + props: { + enabled: true, + }, + }, { name: 'skybox', props: { diff --git a/test/integration/snapshots/Editor.test.js.snap b/test/integration/snapshots/Editor.test.js.snap index f1785baa5effb86d451b27e354e9069664f1fdce..0e1e2182de8b3de62f22c60852df33f6e56ae18d 100644 GIT binary patch literal 29421 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

OM@7)`bKYiLVz#}co& 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 L^S4L=3E_VM28;v- literal 27475 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

    OtX2`#Y_!DuqbI+TmQp(&Z%Pv&s3Dh%IWK*hS7^ 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 S)+k4=T`0c3p^e2sLij&kc;Lza From 9f4832a9be0db7a54f805d16ef333b9e1956b806 Mon Sep 17 00:00:00 2001 From: Robert Long Date: Wed, 20 Jan 2021 15:39:14 -0800 Subject: [PATCH 2/4] Make nodes collapsed by default --- src/editor/nodes/EditorNodeMixin.js | 1 - src/ui/hierarchy/HierarchyPanelContainer.js | 70 ++++++++++----------- 2 files changed, 35 insertions(+), 36 deletions(-) diff --git a/src/editor/nodes/EditorNodeMixin.js b/src/editor/nodes/EditorNodeMixin.js index b47b94af..cf55c22f 100644 --- a/src/editor/nodes/EditorNodeMixin.js +++ b/src/editor/nodes/EditorNodeMixin.js @@ -77,7 +77,6 @@ export default function EditorNodeMixin(Object3DClass) { this.nodeName = this.constructor.nodeName; this.name = this.constructor.nodeName; this.isNode = true; - this.isCollapsed = false; this.disableTransform = this.constructor.disableTransform; this.useMultiplePlacementMode = this.constructor.useMultiplePlacementMode; this.ignoreRaycast = this.constructor.ignoreRaycast; diff --git a/src/ui/hierarchy/HierarchyPanelContainer.js b/src/ui/hierarchy/HierarchyPanelContainer.js index ca79eaaf..25cec086 100644 --- a/src/ui/hierarchy/HierarchyPanelContainer.js +++ b/src/ui/hierarchy/HierarchyPanelContainer.js @@ -173,7 +173,7 @@ function TreeNode({ style }) { const node = nodes[index]; - const { isLeaf, object, depth, selected, active, iconComponent, isCollapsed, childIndex, lastChild } = node; + const { isLeaf, object, depth, selected, active, iconComponent, isExpanded, childIndex, lastChild } = node; const editor = useContext(EditorContext); @@ -432,8 +432,8 @@ function TreeNode({ {isLeaf ? ( ) : ( - - {isCollapsed ? : } + + {isExpanded ? : } )} @@ -485,7 +485,7 @@ TreeNode.propTypes = { selected: PropTypes.bool, active: PropTypes.bool, iconComponent: PropTypes.object, - isCollapsed: PropTypes.bool, + isExpanded: PropTypes.bool, childIndex: PropTypes.number.isRequired, lastChild: PropTypes.bool.isRequired }) @@ -506,7 +506,7 @@ TreeNode.propTypes = { const MemoTreeNode = memo(TreeNode, areEqual); -function* treeWalker(editor, collapsedNodes) { +function* treeWalker(editor, expandedNodes) { const stack = []; stack.push({ @@ -522,12 +522,12 @@ function* treeWalker(editor, collapsedNodes) { const NodeEditor = editor.getNodeEditor(object) || DefaultNodeEditor; const iconComponent = NodeEditor.iconComponent || DefaultNodeEditor.iconComponent; - const isCollapsed = collapsedNodes[object.id]; + const isExpanded = expandedNodes[object.id] || object === editor.scene; yield { id: object.id, isLeaf: object.children.filter(c => c.isNode).length === 0, - isCollapsed, + isExpanded, depth, object, iconComponent, @@ -537,7 +537,7 @@ function* treeWalker(editor, collapsedNodes) { lastChild }; - if (object.children.length !== 0 && !isCollapsed) { + if (object.children.length !== 0 && isExpanded) { for (let i = object.children.length - 1; i >= 0; i--) { const child = object.children[i]; @@ -558,64 +558,64 @@ export default function HierarchyPanel() { const editor = useContext(EditorContext); const onUpload = useUpload(uploadOptions); const [renamingNode, setRenamingNode] = useState(null); - const [collapsedNodes, setCollapsedNodes] = useState({}); + const [expandedNodes, setExpandedNodes] = useState({}); const [nodes, setNodes] = useState([]); const updateNodeHierarchy = useCallback(() => { - setNodes(Array.from(treeWalker(editor, collapsedNodes))); - }, [editor, collapsedNodes]); + setNodes(Array.from(treeWalker(editor, expandedNodes))); + }, [editor, expandedNodes]); const expandNode = useCallback( node => { - delete collapsedNodes[node.id]; - setCollapsedNodes({ ...collapsedNodes }); + setExpandedNodes({ ...expandedNodes, [node.id]: true }); }, - [collapsedNodes] + [expandedNodes] ); const collapseNode = useCallback( node => { - setCollapsedNodes({ ...collapsedNodes, [node.id]: true }); + delete expandedNodes[node.id]; + setExpandedNodes({ ...expandedNodes }); }, - [setCollapsedNodes, collapsedNodes] + [setExpandedNodes, expandedNodes] ); const expandChildren = useCallback( node => { node.object.traverse(child => { if (child.isNode) { - delete collapsedNodes[child.id]; + expandedNodes[child.id] = true; } }); - setCollapsedNodes({ ...collapsedNodes }); + setExpandedNodes({ ...expandedNodes }); }, - [setCollapsedNodes, collapsedNodes] + [setExpandedNodes, expandedNodes] ); const collapseChildren = useCallback( node => { node.object.traverse(child => { if (child.isNode) { - collapsedNodes[child.id] = true; + delete expandedNodes[child.id]; } }); - setCollapsedNodes({ ...collapsedNodes }); + setExpandedNodes({ ...expandedNodes }); }, - [setCollapsedNodes, collapsedNodes] + [setExpandedNodes, expandedNodes] ); const onExpandAllNodes = useCallback(() => { - setCollapsedNodes({}); - }, [setCollapsedNodes]); - - const onCollapseAllNodes = useCallback(() => { - const newCollapsedNodes = {}; + const newExpandedNodes = {}; editor.scene.traverse(child => { if (child.isNode) { - newCollapsedNodes[child.id] = true; + newExpandedNodes[child.id] = true; } }); - setCollapsedNodes(newCollapsedNodes); - }, [editor, setCollapsedNodes]); + setExpandedNodes(newExpandedNodes); + }, [editor, setExpandedNodes]); + + const onCollapseAllNodes = useCallback(() => { + setExpandedNodes({}); + }, [setExpandedNodes]); const onObjectChanged = useCallback( (objects, propertyName) => { @@ -664,13 +664,13 @@ export default function HierarchyPanel() { const onToggle = useCallback( (_e, node) => { - if (collapsedNodes[node.id]) { - expandNode(node); - } else { + if (expandedNodes[node.id]) { collapseNode(node); + } else { + expandNode(node); } }, - [collapsedNodes, expandNode, collapseNode] + [expandedNodes, expandNode, collapseNode] ); const onKeyDown = useCallback( @@ -838,7 +838,7 @@ export default function HierarchyPanel() { useEffect(() => { updateNodeHierarchy(); - }, [collapsedNodes, updateNodeHierarchy]); + }, [expandedNodes, updateNodeHierarchy]); return ( From c48afa0c82def34a52d3267538469da19b3b1343 Mon Sep 17 00:00:00 2001 From: Robert Long Date: Thu, 21 Jan 2021 11:20:54 -0800 Subject: [PATCH 3/4] Ignore disabled node's animations and attributions --- src/editor/nodes/SceneNode.js | 34 ++++++++++++++++++++++++---------- 1 file changed, 24 insertions(+), 10 deletions(-) diff --git a/src/editor/nodes/SceneNode.js b/src/editor/nodes/SceneNode.js index c216e0b8..93de4cba 100644 --- a/src/editor/nodes/SceneNode.js +++ b/src/editor/nodes/SceneNode.js @@ -7,6 +7,7 @@ import GroupNode from "./GroupNode"; import getNodeWithUUID from "../utils/getNodeWithUUID"; import serializeColor from "../utils/serializeColor"; import { DistanceModelType } from "../objects/AudioSource"; +import traverseFilteredSubtrees from "../utils/traverseFilteredSubtrees"; // Migrate v1 spoke scene to v2 function migrateV1ToV2(json) { @@ -621,8 +622,16 @@ export default class SceneNode extends EditorNodeMixin(Scene) { getAnimationClips() { const animations = []; - this.traverse(child => { - if (child.isNode && child.type === "Model") { + traverseFilteredSubtrees(this, child => { + if (!child.isNode) { + return; + } + + if (!child.enabled) { + return false; + } + + if (child.type === "Model") { animations.push(...child.clips); } }); @@ -634,18 +643,23 @@ export default class SceneNode extends EditorNodeMixin(Scene) { const contentAttributions = []; const seenAttributions = new Set(); - this.traverse(obj => { - if (!(obj.isNode && obj.attribution)) return; + traverseFilteredSubtrees(this, obj => { + if (!obj.isNode) { + return; + } + + if (!obj.enabled) { + return false; + } + const attribution = obj.attribution; if (!attribution) return; - if (attribution) { - const attributionKey = attribution.url || `${attribution.title}_${attribution.author}`; - if (seenAttributions.has(attributionKey)) return; - seenAttributions.add(attributionKey); - contentAttributions.push(attribution); - } + const attributionKey = attribution.url || `${attribution.title}_${attribution.author}`; + if (seenAttributions.has(attributionKey)) return; + seenAttributions.add(attributionKey); + contentAttributions.push(attribution); }); return contentAttributions; From 8e2d2bc17cace41025598da3b47d88380de01824 Mon Sep 17 00:00:00 2001 From: Robert Long Date: Thu, 21 Jan 2021 11:21:16 -0800 Subject: [PATCH 4/4] Show disabled node status in hierarchy panel --- src/ui/hierarchy/HierarchyPanelContainer.js | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/src/ui/hierarchy/HierarchyPanelContainer.js b/src/ui/hierarchy/HierarchyPanelContainer.js index 25cec086..ed2ff565 100644 --- a/src/ui/hierarchy/HierarchyPanelContainer.js +++ b/src/ui/hierarchy/HierarchyPanelContainer.js @@ -132,6 +132,7 @@ const TreeNodeLabel = styled.div` color: ${props => (props.isOver && props.canDrop ? props.theme.text : "inherit")}; border-radius: 4px; padding: 0 2px; + text-decoration: ${props => (props.enabled ? "none" : "line-through")}; `; function borderStyle({ isOver, canDrop, position }) { @@ -173,7 +174,7 @@ function TreeNode({ style }) { const node = nodes[index]; - const { isLeaf, object, depth, selected, active, iconComponent, isExpanded, childIndex, lastChild } = node; + const { isLeaf, object, depth, selected, active, iconComponent, isExpanded, childIndex, lastChild, enabled } = node; const editor = useContext(EditorContext); @@ -452,7 +453,7 @@ function TreeNode({ /> ) : ( - + {object.name} )} @@ -487,7 +488,8 @@ TreeNode.propTypes = { iconComponent: PropTypes.object, isExpanded: PropTypes.bool, childIndex: PropTypes.number.isRequired, - lastChild: PropTypes.bool.isRequired + lastChild: PropTypes.bool.isRequired, + enabled: PropTypes.bool.isRequired }) ), renamingNode: PropTypes.object, @@ -513,16 +515,18 @@ function* treeWalker(editor, expandedNodes) { depth: 0, object: editor.scene, childIndex: 0, - lastChild: true + lastChild: true, + parentEnabled: true }); while (stack.length !== 0) { - const { depth, object, childIndex, lastChild } = stack.pop(); + const { depth, object, childIndex, lastChild, parentEnabled } = stack.pop(); const NodeEditor = editor.getNodeEditor(object) || DefaultNodeEditor; const iconComponent = NodeEditor.iconComponent || DefaultNodeEditor.iconComponent; const isExpanded = expandedNodes[object.id] || object === editor.scene; + const enabled = parentEnabled && object.enabled; yield { id: object.id, @@ -533,6 +537,7 @@ function* treeWalker(editor, expandedNodes) { iconComponent, selected: editor.selected.indexOf(object) !== -1, active: editor.selected.length > 0 && object === editor.selected[editor.selected.length - 1], + enabled, childIndex, lastChild }; @@ -546,7 +551,8 @@ function* treeWalker(editor, expandedNodes) { depth: depth + 1, object: child, childIndex: i, - lastChild: i === 0 + lastChild: i === 0, + parentEnabled: enabled }); } } @@ -619,7 +625,7 @@ export default function HierarchyPanel() { const onObjectChanged = useCallback( (objects, propertyName) => { - if (propertyName === "name" || !propertyName) { + if (propertyName === "name" || propertyName === "enabled" || !propertyName) { updateNodeHierarchy(); } },