From 4fe90cd82fd5be3162380ed63d25684064e8dca9 Mon Sep 17 00:00:00 2001 From: Robert Long Date: Thu, 14 Jan 2021 15:46:42 -0800 Subject: [PATCH 1/8] Support for custom navigation meshes --- src/editor/nodes/FloorPlanNode.js | 219 ++++++++++++++++++----- src/ui/properties/FloorPlanNodeEditor.js | 175 ++++++++++-------- 2 files changed, 273 insertions(+), 121 deletions(-) diff --git a/src/editor/nodes/FloorPlanNode.js b/src/editor/nodes/FloorPlanNode.js index 848e6e77..8ec61c06 100644 --- a/src/editor/nodes/FloorPlanNode.js +++ b/src/editor/nodes/FloorPlanNode.js @@ -8,11 +8,17 @@ import mergeMeshGeometries from "../utils/mergeMeshGeometries"; import RecastClient from "../recast/RecastClient"; import HeightfieldClient from "../heightfield/HeightfieldClient"; import SpawnPointNode from "../nodes/SpawnPointNode"; +import { RethrownError } from "../utils/errors"; import * as recastWasmUrl from "recast-wasm/dist/recast.wasm"; const recastClient = new RecastClient(); const heightfieldClient = new HeightfieldClient(); +export const NavMeshMode = { + Automatic: "Automatic", + Custom: "Custom" +}; + export default class FloorPlanNode extends EditorNodeMixin(FloorPlan) { static nodeName = "Floor Plan"; @@ -24,7 +30,7 @@ export default class FloorPlanNode extends EditorNodeMixin(FloorPlan) { return editor.scene.findNodeByType(FloorPlanNode) === null; } - static async deserialize(editor, json) { + static async deserialize(editor, json, loadAsync, onError) { const node = await super.deserialize(editor, json); const { @@ -37,7 +43,9 @@ export default class FloorPlanNode extends EditorNodeMixin(FloorPlan) { agentMaxSlope, regionMinSize, maxTriangles, - forceTrimesh + forceTrimesh, + navMeshMode, + navMeshSrc } = json.components.find(c => c.name === "floor-plan").props; node.autoCellSize = autoCellSize; @@ -51,6 +59,20 @@ export default class FloorPlanNode extends EditorNodeMixin(FloorPlan) { node.maxTriangles = maxTriangles || 1000; node.forceTrimesh = forceTrimesh || false; + node._navMeshMode = navMeshMode || NavMeshMode.Automatic; + + if (navMeshSrc) { + if (navMeshMode === NavMeshMode.Custom) { + loadAsync( + (async () => { + await node.load(navMeshSrc, onError); + })() + ); + } else { + node._navMeshSrc = navMeshSrc; + } + } + return node; } @@ -67,6 +89,87 @@ export default class FloorPlanNode extends EditorNodeMixin(FloorPlan) { this.maxTriangles = 1000; this.forceTrimesh = false; this.heightfieldMesh = null; + this._navMeshMode = NavMeshMode.Automatic; + this._navMeshSrc = ""; + this.navMesh = null; + this.trimesh = null; + this.heightfieldMesh = null; + } + + get navMeshMode() { + return this._navMeshMode; + } + + set navMeshMode(value) { + if (value === NavMeshMode.Custom) { + this.load(this._navMeshSrc).catch(console.error); + } else if (this.navMesh) { + this.remove(this.navMesh); + this.navMesh = null; + } + + this._navMeshMode = value; + } + + get navMeshSrc() { + return this._navMeshSrc; + } + + set navMeshSrc(value) { + this.load(value).catch(console.error); + } + + async load(src, onError) { + const nextSrc = src || ""; + + if (nextSrc === this._navMeshSrc && nextSrc !== "") { + return; + } + + this._navMeshSrc = nextSrc; + this.issues = []; + + if (this.navMesh) { + this.remove(this.navMesh); + this.navMesh = null; + } + + try { + const { accessibleUrl } = await this.editor.api.resolveMedia(nextSrc); + + const loader = this.editor.gltfCache.getLoader(accessibleUrl); + + const { scene } = await loader.getDependency("gltf"); + + const mesh = scene.getObjectByProperty("type", "Mesh"); + + if (!mesh) { + throw new Error("No mesh available."); + } + + const geometry = mesh.geometry.clone(); // Clone in case the user reuses a mesh for the navmesh. + mesh.updateMatrixWorld(); + geometry.applyMatrix(mesh.matrixWorld); + + this.setNavMesh(new Mesh(geometry, new MeshBasicMaterial({ color: 0x0000ff, transparent: true, opacity: 0.2 }))); + + if (this.navMesh) { + this.navMesh.visible = this.editor.selected.indexOf(this) !== -1; + } + } catch (error) { + const modelError = new RethrownError(`Error loading custom navmesh "${this._navMeshSrc}"`, error); + + if (onError) { + onError(this, modelError); + } + + console.error(modelError); + + this.issues.push({ severity: "error", message: "Error loading custom navmesh." }); + } + + this.editor.emit("objectsChanged", [this]); + this.editor.emit("selectionChanged"); } onSelect() { @@ -98,7 +201,6 @@ export default class FloorPlanNode extends EditorNodeMixin(FloorPlan) { } async generate(signal) { - window.scene = this; const collidableMeshes = []; const walkableMeshes = []; @@ -124,56 +226,63 @@ export default class FloorPlanNode extends EditorNodeMixin(FloorPlan) { } }); - const boxColliderNodes = this.editor.scene.getNodesByType(BoxColliderNode); + if (this.navMeshMode === NavMeshMode.Automatic) { + const boxColliderNodes = this.editor.scene.getNodesByType(BoxColliderNode); - for (const node of boxColliderNodes) { - if (node.walkable) { - const helperMesh = node.helper.object; - const boxColliderMesh = new Mesh(helperMesh.geometry, new MeshBasicMaterial()); - boxColliderMesh.applyMatrix(node.matrixWorld); - boxColliderMesh.updateMatrixWorld(); - walkableMeshes.push(boxColliderMesh); + for (const node of boxColliderNodes) { + if (node.walkable) { + const helperMesh = node.helper.object; + const boxColliderMesh = new Mesh(helperMesh.geometry, new MeshBasicMaterial()); + boxColliderMesh.applyMatrix(node.matrixWorld); + boxColliderMesh.updateMatrixWorld(); + walkableMeshes.push(boxColliderMesh); + } } - } - const walkableGeometry = mergeMeshGeometries(walkableMeshes); + const walkableGeometry = mergeMeshGeometries(walkableMeshes); - const box = new Box3().setFromBufferAttribute(walkableGeometry.attributes.position); - const size = new Vector3(); - box.getSize(size); - if (Math.max(size.x, size.y, size.z) > 2000) { - throw new Error( - `Scene is too large (${size.x.toFixed(3)} x ${size.y.toFixed(3)} x ${size.z.toFixed(3)}) ` + - `to generate a floor plan.\n` + - `You can un-check the "walkable" checkbox on models to exclude them from the floor plan.` + const box = new Box3().setFromBufferAttribute(walkableGeometry.attributes.position); + const size = new Vector3(); + box.getSize(size); + if (Math.max(size.x, size.y, size.z) > 2000) { + throw new Error( + `Scene is too large (${size.x.toFixed(3)} x ${size.y.toFixed(3)} x ${size.z.toFixed(3)}) ` + + `to generate a floor plan.\n` + + `You can un-check the "walkable" checkbox on models to exclude them from the floor plan.` + ); + } + + const area = size.x * size.z; + + // Tuned to produce cell sizes from ~0.5 to ~1.5 for areas from ~200 to ~350,000. + const cellSize = this.autoCellSize ? Math.pow(area, 1 / 3) / 50 : this.cellSize; + + const navGeometry = await recastClient.buildNavMesh( + walkableGeometry, + { + cellSize, + cellHeight: this.cellHeight, + agentHeight: this.agentHeight, + agentRadius: this.agentRadius, + agentMaxClimb: this.agentMaxClimb, + agentMaxSlope: this.agentMaxSlope, + regionMinSize: this.regionMinSize, + wasmUrl: new URL(recastWasmUrl, configs.BASE_ASSETS_PATH || window.location).href + }, + signal ); + + const navMesh = new Mesh( + navGeometry, + new MeshBasicMaterial({ color: 0x0000ff, transparent: true, opacity: 0.2 }) + ); + + this.setNavMesh(navMesh); } - const area = size.x * size.z; - - // Tuned to produce cell sizes from ~0.5 to ~1.5 for areas from ~200 to ~350,000. - const cellSize = this.autoCellSize ? Math.pow(area, 1 / 3) / 50 : this.cellSize; - - const navGeometry = await recastClient.buildNavMesh( - walkableGeometry, - { - cellSize, - cellHeight: this.cellHeight, - agentHeight: this.agentHeight, - agentRadius: this.agentRadius, - agentMaxClimb: this.agentMaxClimb, - agentMaxSlope: this.agentMaxSlope, - regionMinSize: this.regionMinSize, - wasmUrl: new URL(recastWasmUrl, configs.BASE_ASSETS_PATH || window.location).href - }, - signal - ); - - const navMesh = new Mesh(navGeometry, new MeshBasicMaterial({ color: 0x0000ff, transparent: true, opacity: 0.2 })); - - this.setNavMesh(navMesh); - - navMesh.visible = this.editor.selected.indexOf(this) !== -1; + if (this.navMesh) { + this.navMesh.visible = this.editor.selected.indexOf(this) !== -1; + } const collidableGeometry = mergeMeshGeometries(collidableMeshes); @@ -247,6 +356,7 @@ export default class FloorPlanNode extends EditorNodeMixin(FloorPlan) { copy(source, recursive = true) { if (recursive) { this.remove(this.heightfieldMesh); + this.remove(this.navMesh); } super.copy(source, recursive); @@ -257,6 +367,12 @@ export default class FloorPlanNode extends EditorNodeMixin(FloorPlan) { if (heightfieldMeshIndex !== -1) { this.heightfieldMesh = this.children[heightfieldMeshIndex]; } + + const navMeshIndex = source.children.findIndex(child => child === source.navMesh); + + if (navMeshIndex !== -1) { + this.navMesh = this.children[navMeshIndex]; + } } this.autoCellSize = source.autoCellSize; @@ -269,6 +385,9 @@ export default class FloorPlanNode extends EditorNodeMixin(FloorPlan) { this.regionMinSize = source.regionMinSize; this.maxTriangles = source.maxTriangles; this.forceTrimesh = source.forceTrimesh; + this._navMeshMode = source._navMeshMode; + this._navMeshSrc = source._navMeshSrc; + return this; } @@ -284,7 +403,9 @@ export default class FloorPlanNode extends EditorNodeMixin(FloorPlan) { agentMaxSlope: this.agentMaxSlope, regionMinSize: this.regionMinSize, maxTriangles: this.maxTriangles, - forceTrimesh: this.forceTrimesh + forceTrimesh: this.forceTrimesh, + navMeshMode: this.navMeshMode, + navMeshSrc: this.navMeshSrc } }); } @@ -296,6 +417,10 @@ export default class FloorPlanNode extends EditorNodeMixin(FloorPlan) { this.remove(this.heightfieldMesh); } + if (!this.navMesh && this.navMeshMode === NavMeshMode.Custom) { + throw new Error("The FloorPlan Node is set to use a custom navigation mesh but none was provided."); + } + const navMeshMaterial = this.navMesh.material; navMeshMaterial.transparent = true; navMeshMaterial.opacity = 0; diff --git a/src/ui/properties/FloorPlanNodeEditor.js b/src/ui/properties/FloorPlanNodeEditor.js index d7c6a307..56452225 100644 --- a/src/ui/properties/FloorPlanNodeEditor.js +++ b/src/ui/properties/FloorPlanNodeEditor.js @@ -10,6 +10,20 @@ import ErrorDialog from "../dialogs/ErrorDialog"; import { withDialog } from "../contexts/DialogContext"; import { withSettings } from "../contexts/SettingsContext"; import { ShoePrints } from "styled-icons/fa-solid/ShoePrints"; +import { NavMeshMode } from "../../editor/nodes/FloorPlanNode"; +import SelectInput from "../inputs/SelectInput"; +import ModelInput from "../inputs/ModelInput"; + +const NavMeshModeOptions = [ + { + label: "Automatic", + value: NavMeshMode.Automatic + }, + { + label: "Custom", + value: NavMeshMode.Custom + } +]; class FloorPlanNodeEditor extends Component { static propTypes = { @@ -37,6 +51,8 @@ class FloorPlanNodeEditor extends Component { this.onChangeRegionMinSize = createPropSetter("regionMinSize"); this.onChangeMaxTriangles = createPropSetter("maxTriangles"); this.onChangeForceTrimesh = createPropSetter("forceTrimesh"); + this.onChangeNavMeshMode = createPropSetter("navMeshMode"); + this.onChangeNavMeshSrc = createPropSetter("navMeshSrc"); } onRegenerate = async () => { @@ -72,82 +88,93 @@ class FloorPlanNodeEditor extends Component { return ( - - + + - {!node.autoCellSize && ( - + {node.navMeshMode === NavMeshMode.Automatic ? ( + <> + + + + {!node.autoCellSize && ( + + )} + + + + + + + + ) : ( + + + )} - - - - - - From 14adcbaca5f3878f9e02a379692f60e35aeef322 Mon Sep 17 00:00:00 2001 From: Robert Long Date: Tue, 26 Jan 2021 15:02:09 -0800 Subject: [PATCH 2/8] Fix changing navMeshMode --- src/editor/nodes/FloorPlanNode.js | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/editor/nodes/FloorPlanNode.js b/src/editor/nodes/FloorPlanNode.js index 8ec61c06..d993da07 100644 --- a/src/editor/nodes/FloorPlanNode.js +++ b/src/editor/nodes/FloorPlanNode.js @@ -102,7 +102,8 @@ export default class FloorPlanNode extends EditorNodeMixin(FloorPlan) { set navMeshMode(value) { if (value === NavMeshMode.Custom) { - this.load(this._navMeshSrc).catch(console.error); + // Force reloading nav mesh since it was removed and this._navMeshSrc didn't change + this.load(this._navMeshSrc, undefined, true).catch(console.error); } else if (this.navMesh) { this.remove(this.navMesh); this.navMesh = null; @@ -119,10 +120,10 @@ export default class FloorPlanNode extends EditorNodeMixin(FloorPlan) { this.load(value).catch(console.error); } - async load(src, onError) { + async load(src, onError, force = false) { const nextSrc = src || ""; - if (nextSrc === this._navMeshSrc && nextSrc !== "") { + if (nextSrc === this._navMeshSrc && nextSrc !== "" && !force) { return; } From c5a84fd0b6a268b96fe743ddaf9c89faca563d34 Mon Sep 17 00:00:00 2001 From: Robert Long Date: Tue, 26 Jan 2021 15:07:59 -0800 Subject: [PATCH 3/8] Fix floor plan material after export --- src/editor/nodes/FloorPlanNode.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/editor/nodes/FloorPlanNode.js b/src/editor/nodes/FloorPlanNode.js index d993da07..3618c586 100644 --- a/src/editor/nodes/FloorPlanNode.js +++ b/src/editor/nodes/FloorPlanNode.js @@ -422,9 +422,10 @@ export default class FloorPlanNode extends EditorNodeMixin(FloorPlan) { throw new Error("The FloorPlan Node is set to use a custom navigation mesh but none was provided."); } - const navMeshMaterial = this.navMesh.material; + const navMeshMaterial = this.navMesh.material.clone(); navMeshMaterial.transparent = true; navMeshMaterial.opacity = 0; + this.navMesh.material = navMeshMaterial; this.navMesh.name = "navMesh"; this.navMesh.userData.gltfExtensions = { @@ -436,10 +437,11 @@ export default class FloorPlanNode extends EditorNodeMixin(FloorPlan) { if (this.trimesh) { this.trimesh.name = "trimesh"; - const trimeshMaterial = this.trimesh.material; + const trimeshMaterial = this.trimesh.material.clone(); trimeshMaterial.transparent = true; trimeshMaterial.opacity = 0; trimeshMaterial.wireframe = false; + this.trimesh.material = trimeshMaterial; this.trimesh.userData.gltfExtensions = { MOZ_hubs_components: { From e11b3fe30a4cf26f0a3a4487c42e46571167b38a Mon Sep 17 00:00:00 2001 From: Robert Long Date: Tue, 26 Jan 2021 15:41:10 -0800 Subject: [PATCH 4/8] Make nav mesh mode enums lowercase --- src/editor/nodes/FloorPlanNode.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/editor/nodes/FloorPlanNode.js b/src/editor/nodes/FloorPlanNode.js index a593e186..83e535f6 100644 --- a/src/editor/nodes/FloorPlanNode.js +++ b/src/editor/nodes/FloorPlanNode.js @@ -16,8 +16,8 @@ const recastClient = new RecastClient(); const heightfieldClient = new HeightfieldClient(); export const NavMeshMode = { - Automatic: "Automatic", - Custom: "Custom" + Automatic: "automatic", + Custom: "custom" }; export default class FloorPlanNode extends EditorNodeMixin(FloorPlan) { From 44b20c5e05a39c59c54e4145d3cbff7faed28f7c Mon Sep 17 00:00:00 2001 From: Robert Long Date: Tue, 26 Jan 2021 15:50:39 -0800 Subject: [PATCH 5/8] Update test snapshots --- test/integration/snapshots/Editor.test.js.md | 8 ++++++++ .../integration/snapshots/Editor.test.js.snap | Bin 29421 -> 29539 bytes 2 files changed, 8 insertions(+) diff --git a/test/integration/snapshots/Editor.test.js.md b/test/integration/snapshots/Editor.test.js.md index 29908e70..4383cec1 100644 --- a/test/integration/snapshots/Editor.test.js.md +++ b/test/integration/snapshots/Editor.test.js.md @@ -732,6 +732,8 @@ Generated by [AVA](https://avajs.dev). cellSize: 1, forceTrimesh: false, maxTriangles: 1000, + navMeshMode: 'automatic', + navMeshSrc: '', regionMinSize: 4, }, }, @@ -1420,6 +1422,8 @@ Generated by [AVA](https://avajs.dev). cellSize: 0.1200000000000001, forceTrimesh: false, maxTriangles: 1000, + navMeshMode: 'automatic', + navMeshSrc: '', regionMinSize: 4, }, }, @@ -2730,6 +2734,8 @@ Generated by [AVA](https://avajs.dev). cellSize: 0.1200000000000001, forceTrimesh: false, maxTriangles: 1000, + navMeshMode: 'automatic', + navMeshSrc: '', regionMinSize: 4, }, }, @@ -3931,6 +3937,8 @@ Generated by [AVA](https://avajs.dev). cellSize: 0.1200000000000001, forceTrimesh: false, maxTriangles: 1000, + navMeshMode: 'automatic', + navMeshSrc: '', regionMinSize: 4, }, }, diff --git a/test/integration/snapshots/Editor.test.js.snap b/test/integration/snapshots/Editor.test.js.snap index 0e1e2182de8b3de62f22c60852df33f6e56ae18d..3c2d858c6a5614a8e66264f37d14eb757a5820d6 100644 GIT binary patch literal 29539 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 J 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

OM@7)`bKYiLVz#}co& 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 L^S4L=3E_VM28;v- From 39b7eda50866b817abe193d84aea1f9abbe5d0e7 Mon Sep 17 00:00:00 2001 From: Sarthak Duggal <52778617+sardug10@users.noreply.github.com> Date: Tue, 2 Feb 2021 15:54:48 +0530 Subject: [PATCH 6/8] Update SpotLightNodeEditor.js Changed Spot Light Intensity Unit from 'Degrees' to 'Candela'. --- src/ui/properties/SpotLightNodeEditor.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ui/properties/SpotLightNodeEditor.js b/src/ui/properties/SpotLightNodeEditor.js index d5f0ac93..c754dc65 100644 --- a/src/ui/properties/SpotLightNodeEditor.js +++ b/src/ui/properties/SpotLightNodeEditor.js @@ -58,7 +58,7 @@ export default class SpotLightNodeEditor extends Component { largeStep={0.1} value={node.intensity} onChange={this.onChangeIntensity} - unit="°" + unit="cd" /> Date: Wed, 3 Feb 2021 13:38:45 -0800 Subject: [PATCH 7/8] Check for empty attribution strings --- src/api/Api.js | 2 +- src/editor/nodes/SceneNode.js | 8 +++++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/api/Api.js b/src/api/Api.js index 848ff105..564c7da1 100644 --- a/src/api/Api.js +++ b/src/api/Api.js @@ -891,7 +891,7 @@ export default class Project extends EventEmitter { allow_promotion: publishParams.allowPromotion, name: publishParams.name, attributions: { - creator: publishParams.creatorAttribution, + creator: publishParams.creatorAttribution && publishParams.creatorAttribution.trim(), content: publishParams.contentAttributions } }; diff --git a/src/editor/nodes/SceneNode.js b/src/editor/nodes/SceneNode.js index 93de4cba..54bbf2b4 100644 --- a/src/editor/nodes/SceneNode.js +++ b/src/editor/nodes/SceneNode.js @@ -656,7 +656,13 @@ export default class SceneNode extends EditorNodeMixin(Scene) { if (!attribution) return; - const attributionKey = attribution.url || `${attribution.title}_${attribution.author}`; + const url = attribution.url && attribution.url.trim(); + const title = attribution.title && attribution.title.trim(); + const author = attribution.author && attribution.author.trim(); + + if (!url && !title && !author) return; + + const attributionKey = url || `${title}_${author}`; if (seenAttributions.has(attributionKey)) return; seenAttributions.add(attributionKey); contentAttributions.push(attribution); From d293ca621a92f06ce409c5505bcce5104621f749 Mon Sep 17 00:00:00 2001 From: Robert Long Date: Thu, 11 Feb 2021 16:17:00 -0800 Subject: [PATCH 8/8] Fix PR feedback --- src/editor/nodes/FloorPlanNode.js | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/src/editor/nodes/FloorPlanNode.js b/src/editor/nodes/FloorPlanNode.js index 83e535f6..663b4167 100644 --- a/src/editor/nodes/FloorPlanNode.js +++ b/src/editor/nodes/FloorPlanNode.js @@ -62,16 +62,10 @@ export default class FloorPlanNode extends EditorNodeMixin(FloorPlan) { node._navMeshMode = navMeshMode || NavMeshMode.Automatic; - if (navMeshSrc) { - if (navMeshMode === NavMeshMode.Custom) { - loadAsync( - (async () => { - await node.load(navMeshSrc, onError); - })() - ); - } else { - node._navMeshSrc = navMeshSrc; - } + if (navMeshMode === NavMeshMode.Custom) { + loadAsync(node.load(navMeshSrc, onError)); + } else { + node._navMeshSrc = navMeshSrc || ""; } return node;