From 834ca531fd519ae58c33c348ebd3648bf98f6eb1 Mon Sep 17 00:00:00 2001 From: casperlamboo Date: Sat, 6 Jan 2018 20:27:23 +0100 Subject: [PATCH] increase performance of holes --- src/d3/ShapeMesh.js | 14 ++++++++++---- src/d3/ShapesManager.js | 40 ++++++++++++++++++++++++---------------- 2 files changed, 34 insertions(+), 20 deletions(-) diff --git a/src/d3/ShapeMesh.js b/src/d3/ShapeMesh.js index f92a11e..ac69806 100644 --- a/src/d3/ShapeMesh.js +++ b/src/d3/ShapeMesh.js @@ -64,7 +64,7 @@ class ShapeMesh extends THREE.Object3D { if (holes === this._holes && !this._changedGeometry) return false; const fill = this._shapeData.type === 'EXPORT_SHAPE' ? !this._shapeData.originalFill : !this._fill; - if (holes === null || fill) { + if (holes.length === 0 || fill) { if (this._holeMeshIsOriginal && !this._changedGeometry) return false; this._holeMesh.geometry.dispose(); @@ -76,10 +76,16 @@ class ShapeMesh extends THREE.Object3D { const objectGeometry = new THREE.Geometry().fromBufferGeometry(this._mesh.geometry); objectGeometry.mergeVertices(); - let objectBSP = new THREE_BSP(objectGeometry); + const box = new THREE.Box3().setFromPoints(objectGeometry.vertices); + let bsp = new THREE_BSP(objectGeometry); objectGeometry.dispose(); - objectBSP = objectBSP.subtract(holes); - this._holeMesh.geometry = objectBSP.toMesh().geometry; + + for (const hole of holes) { + if (hole.box.intersectsBox(box)) { + bsp = bsp.subtract(hole.bsp); + } + } + this._holeMesh.geometry = bsp.toMesh().geometry; this._holes = holes; this._changedGeometry = false; diff --git a/src/d3/ShapesManager.js b/src/d3/ShapesManager.js index 897e64a..5da2150 100644 --- a/src/d3/ShapesManager.js +++ b/src/d3/ShapesManager.js @@ -14,7 +14,7 @@ export default class ShapesManager extends THREE.Object3D { this._spaces = {}; this.name = 'shapes-manager'; - this._holes = null; + this._holes = []; // this._edges = {}; } @@ -77,23 +77,33 @@ export default class ShapesManager extends THREE.Object3D { } if (holesChanged) { - this._holes = null; + this._holes = []; for (let i = 0; i < ids.length; i ++) { const id = ids[i]; + if (activeShapes[id]) continue; + const { solid, type } = state.objectsById[id]; const d3Visible = SHAPE_TYPE_PROPERTIES[type].D3Visible; - if (!solid && d3Visible) { - const hole = this._meshes[id].mesh._mesh; - const holeGeometry = new THREE.Geometry().fromBufferGeometry(hole.geometry); - if (holeGeometry.vertices.length === 0) continue; - const holeBSP = new THREE_BSP(holeGeometry); - if (!this._holes) { - this._holes = holeBSP; - } else { - this._holes = this._holes.union(holeBSP); - } - holeGeometry.dispose(); + if (solid || !d3Visible) continue; + + const holeMesh = this._meshes[id].mesh._mesh; + const geometry = new THREE.Geometry().fromBufferGeometry(holeMesh.geometry); + if (geometry.vertices.length === 0) continue; + + const box = new THREE.Box3().setFromPoints(geometry.vertices); + const intersectHole = this._holes.find(hole => hole.box.intersectsBox(box)); + + const bsp = new THREE_BSP(geometry); + + if (intersectHole) { + intersectHole.bsp = intersectHole.bsp.union(bsp); + const min = box.min.min(intersectHole.box.min); + const max = box.max.max(intersectHole.box.max); + intersectHole.box = new THREE.Box3(min, max); + } else { + this._holes.push({ bsp, box }); } + geometry.dispose(); } } @@ -104,9 +114,7 @@ export default class ShapesManager extends THREE.Object3D { const d3Visible = SHAPE_TYPE_PROPERTIES[type].D3Visible; if (!active && solid && d3Visible) { const shape = this._meshes[id].mesh; - if (shape.updateHoleGeometry(this._holes)) { - render = true; - } + if (shape.updateHoleGeometry(this._holes)) render = true; } }