From 51ecc9ce113fa115813e240a579e31deb77049d6 Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Fri, 26 Jul 2024 20:04:26 -0400 Subject: [PATCH] fix handle drag + snap --- src/mesh/sketch.js | 35 +++++++++++++++++++++++------------ 1 file changed, 23 insertions(+), 12 deletions(-) diff --git a/src/mesh/sketch.js b/src/mesh/sketch.js index 1fabe62d..e6c172b7 100644 --- a/src/mesh/sketch.js +++ b/src/mesh/sketch.js @@ -26,6 +26,12 @@ const mapp = mesh; const worker = moto.client.fn; const POLYS = base.polygons; const drag = {}; +const hpos = [ + [-1, 1, 1], + [ 1, 1, 1], + [-1,-1, 1], + [ 1,-1, 1], +]; const material = { normal: new MeshBasicMaterial({ color: 0x888888, side: DoubleSide, transparent: true, opacity: 0.25 }), @@ -317,12 +323,7 @@ mesh.sketch = class MeshSketch extends mesh.object { center.z += z; this.render(); } else if (handle >= 0) { - const sf = [ - [-1, 1, 1], - [ 1, 1, 1], - [-1,-1, 1], - [ 1,-1, 1], - ][handle]; + const sf = hpos[handle]; center.x += x / 2; center.y += y / 2; center.z += z / 2; @@ -352,6 +353,17 @@ mesh.sketch = class MeshSketch extends mesh.object { this.render(); } + handle_pos(handle) { + if (handle < 0) return; + let { scale, center } = this; + let v = hpos[handle]; + return { + x: v[0] * scale.x/2 + center.x, + y: v[1] * scale.y/2 + center.y, + z: v[2] * scale.z/2 + center.z, + }; + } + drag(opt = {}) { let { items, center, handles } = this; let { start, delta, offset, end } = opt; @@ -359,18 +371,17 @@ mesh.sketch = class MeshSketch extends mesh.object { let selected = items.filter(i => i.selected); let target = start.sketch_item ? selected : start; let item = Array.isArray(target) ? target[0] : undefined; - let handle = this.handles.indexOf(target); - drag.handle = handle >= 0 ? handles[handle] : undefined; + drag.handle = handles.indexOf(target); drag.item = item; drag.target = target; - drag.start = Object.assign({}, drag.handle ? - util.extract(util.bounds(drag.handle).mid, { map: true }) : + drag.start = Object.assign({}, drag.handle >= 0 ? + this.handle_pos(drag.handle) : item?.center ?? center); } else if (offset) { let { start, item, handle } = drag; let { snap, snapon } = api.prefs.map.space; - let pos = handle ? - util.extract(util.bounds(handle).mid, { map: true }) : + let pos = handle >= 0 ? + this.handle_pos(handle) : item?.center ?? center; let end = { x: start.x + offset.x,