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..cf55c22f 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; } } @@ -70,13 +77,14 @@ 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; this.staticMode = StaticModes.Inherits; this.originalStaticMode = null; + this.enabled = true; + this._visible = true; this.saveParent = false; this.loadingCube = null; this.errorIcon = null; @@ -110,10 +118,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 +181,13 @@ export default function EditorNodeMixin(Object3DClass) { { name: "visible", props: { - visible: this.visible + visible: this._visible + } + }, + { + name: "editor-settings", + props: { + enabled: this.enabled } } ] @@ -345,40 +369,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..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) { @@ -528,7 +529,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", { @@ -617,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); } }); @@ -630,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; 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/hierarchy/HierarchyPanelContainer.js b/src/ui/hierarchy/HierarchyPanelContainer.js index ca79eaaf..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, isCollapsed, childIndex, lastChild } = node; + const { isLeaf, object, depth, selected, active, iconComponent, isExpanded, childIndex, lastChild, enabled } = node; const editor = useContext(EditorContext); @@ -432,8 +433,8 @@ function TreeNode({ {isLeaf ? ( ) : ( - - {isCollapsed ? : } + + {isExpanded ? : } )} @@ -452,7 +453,7 @@ function TreeNode({ /> ) : ( - + {object.name} )} @@ -485,9 +486,10 @@ 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 + lastChild: PropTypes.bool.isRequired, + enabled: PropTypes.bool.isRequired }) ), renamingNode: PropTypes.object, @@ -506,38 +508,41 @@ TreeNode.propTypes = { const MemoTreeNode = memo(TreeNode, areEqual); -function* treeWalker(editor, collapsedNodes) { +function* treeWalker(editor, expandedNodes) { const stack = []; stack.push({ 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 isCollapsed = collapsedNodes[object.id]; + const isExpanded = expandedNodes[object.id] || object === editor.scene; + const enabled = parentEnabled && object.enabled; yield { id: object.id, isLeaf: object.children.filter(c => c.isNode).length === 0, - isCollapsed, + isExpanded, depth, object, iconComponent, selected: editor.selected.indexOf(object) !== -1, active: editor.selected.length > 0 && object === editor.selected[editor.selected.length - 1], + enabled, childIndex, 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]; @@ -546,7 +551,8 @@ function* treeWalker(editor, collapsedNodes) { depth: depth + 1, object: child, childIndex: i, - lastChild: i === 0 + lastChild: i === 0, + parentEnabled: enabled }); } } @@ -558,68 +564,68 @@ 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) => { - if (propertyName === "name" || !propertyName) { + if (propertyName === "name" || propertyName === "enabled" || !propertyName) { updateNodeHierarchy(); } }, @@ -664,13 +670,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 +844,7 @@ export default function HierarchyPanel() { useEffect(() => { updateNodeHierarchy(); - }, [collapsedNodes, updateNodeHierarchy]); + }, [expandedNodes, updateNodeHierarchy]); return ( 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 f1785baa..0e1e2182 100644 Binary files a/test/integration/snapshots/Editor.test.js.snap and b/test/integration/snapshots/Editor.test.js.snap differ