UNPKG

awv3

Version:
206 lines (166 loc) 6.35 kB
import * as THREE from 'three'; var Snapper = /*#__PURE__*/ function () { function Snapper(options) { this.sketch = options.sketch; this.gridStep = options.gridStep; this.pointRadius = options.pointRadius; this.ignoredIds = []; this.keyOffsets = undefined; this.maxSnapDistance = this.gridStep / 5.0; this.sketchPoints = undefined; } //note: subobjects (like endpoints of line) are also marked var _proto = Snapper.prototype; _proto.ignoreObject = function ignoreObject(ccrefs) { ccrefs = [].concat(ccrefs); for (var _iterator = ccrefs, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { var _ref; if (_isArray) { if (_i >= _iterator.length) break; _ref = _iterator[_i++]; } else { _i = _iterator.next(); if (_i.done) break; _ref = _i.value; } var _ccref = _ref; for (var _iterator2 = _ccref.descendants, _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _iterator2[Symbol.iterator]();;) { var _ref2; if (_isArray2) { if (_i2 >= _iterator2.length) break; _ref2 = _iterator2[_i2++]; } else { _i2 = _iterator2.next(); if (_i2.done) break; _ref2 = _i2.value; } var _obj = _ref2; this.ignoredIds.push(_obj.id); } } }; //call this when dragging (or duplicating) many objects // ccrefs: set of objects which is going to be moved // mousePosition: where must cursor is currently // dragged (optional): the object we drag with mouse (note: special case if it is point) _proto.setDraggedObjects = function setDraggedObjects(ccrefs, mousePosition, dragged) { this.keyOffsets = []; for (var _iterator3 = ccrefs, _isArray3 = Array.isArray(_iterator3), _i3 = 0, _iterator3 = _isArray3 ? _iterator3 : _iterator3[Symbol.iterator]();;) { var _ref3; if (_isArray3) { if (_i3 >= _iterator3.length) break; _ref3 = _iterator3[_i3++]; } else { _i3 = _iterator3.next(); if (_i3.done) break; _ref3 = _i3.value; } var obj = _ref3; var subpoints = Array.from(obj.descendants).filter(function (obj) { return obj.isPoint(); }); for (var _iterator4 = subpoints, _isArray4 = Array.isArray(_iterator4), _i4 = 0, _iterator4 = _isArray4 ? _iterator4 : _iterator4[Symbol.iterator]();;) { var _ref4; if (_isArray4) { if (_i4 >= _iterator4.length) break; _ref4 = _iterator4[_i4++]; } else { _i4 = _iterator4.next(); if (_i4.done) break; _ref4 = _i4.value; } var pnt = _ref4; var offset = pnt.pos.clone().sub(mousePosition); if (dragged && dragged.isPoint()) offset.set(0, 0, 0); if (!this.keyOffsets.some(function (vec) { return vec.distanceTo(offset) <= 1e-9; })) this.keyOffsets.push(offset); } } }; //use this to snap dragged object _proto.snapDraggedObject = function snapDraggedObject(mousePosition) { var res = this.noneResult(); for (var _iterator5 = this.keyOffsets, _isArray5 = Array.isArray(_iterator5), _i5 = 0, _iterator5 = _isArray5 ? _iterator5 : _iterator5[Symbol.iterator]();;) { var _ref5; if (_isArray5) { if (_i5 >= _iterator5.length) break; _ref5 = _iterator5[_i5++]; } else { _i5 = _iterator5.next(); if (_i5.done) break; _ref5 = _i5.value; } var key = _ref5; var position = mousePosition.clone().add(key); var tres = this.snapPoint(position); tres.position.sub(key); if (this.compareResult(res, tres) > 0) res = tres; } return res; }; //use this method for drawing things (and NOT for dragging) _proto.snapPoint = function snapPoint(position) { var res = this.noneResult(); var resPoints = this.snapToSketchPoints(position); if (this.compareResult(res, resPoints) > 0) res = resPoints; var resGrid = this.snapToGrid(position); if (this.compareResult(res, resGrid) > 0) res = resGrid; res.position = res.displacement.clone().add(position); return res; }; //internal methods _proto.noneResult = function noneResult() { return { cost: Infinity, displacement: new THREE.Vector3(0, 0, 0) }; }; _proto.compareResult = function compareResult(resA, resB) { if (Math.abs(resA.cost - resB.cost) <= 1e-3) return 0; return resA.cost < resB.cost ? -1 : 1; }; _proto.snapToGrid = function snapToGrid(position) { if (this.gridStep > 0) { var x = Math.round(position.x / this.gridStep) * this.gridStep; var y = Math.round(position.y / this.gridStep) * this.gridStep; var gridNode = new THREE.Vector3(x, y, 0); var dist = gridNode.distanceTo(position); if (dist < this.maxSnapDistance) { return { cost: dist, displacement: gridNode.clone().sub(position) }; } } return this.noneResult(); }; _proto.snapToSketchPoints = function snapToSketchPoints(position) { var res = this.noneResult(); //note: cache sketch points for faster multi-snapping if (this.sketchPoints === undefined) this.sketchPoints = Array.from(this.sketch.descendants).filter(function (obj) { return obj.isPoint(); }); for (var _iterator6 = this.sketchPoints, _isArray6 = Array.isArray(_iterator6), _i6 = 0, _iterator6 = _isArray6 ? _iterator6 : _iterator6[Symbol.iterator]();;) { var _ref6; if (_isArray6) { if (_i6 >= _iterator6.length) break; _ref6 = _iterator6[_i6++]; } else { _i6 = _iterator6.next(); if (_i6.done) break; _ref6 = _i6.value; } var _obj2 = _ref6; if (this.ignoredIds.indexOf(_obj2.id) !== -1) continue; var pointPos = _obj2.pos; var dist = pointPos.distanceTo(position); if (dist > this.maxSnapDistance) continue; var snap = { cost: dist, displacement: pointPos.clone().sub(position), toPoint: _obj2 }; if (this.compareResult(snap, res) < 0) res = snap; } return res; }; return Snapper; }(); export { Snapper as default };