mirror of
https://github.com/xibyte/jsketcher
synced 2025-12-10 10:25:36 +01:00
110 lines
No EOL
2.6 KiB
JavaScript
110 lines
No EOL
2.6 KiB
JavaScript
import {findAncestor} from 'scene/sceneGraph';
|
|
|
|
export function activate(context) {
|
|
const {services, streams} = context;
|
|
let domElement = services.viewer.sceneSetup.domElement();
|
|
|
|
domElement.addEventListener('mousedown', mousedown, false);
|
|
domElement.addEventListener('mouseup', mouseup, false);
|
|
domElement.addEventListener('mousemove', mousemove, false);
|
|
|
|
let performRaycast = e => services.viewer.raycast(e, services.viewer.sceneSetup.scene.children);
|
|
|
|
let toDrag = null;
|
|
let pressed = new Set();
|
|
|
|
function startDrag(objectToDrag, e) {
|
|
if (toDrag) {
|
|
stopDrag(e);
|
|
}
|
|
toDrag = objectToDrag;
|
|
services.viewer.sceneSetup.trackballControls.enabled = false;
|
|
}
|
|
|
|
function stopDrag(e) {
|
|
toDrag.dragDrop(e);
|
|
toDrag = null;
|
|
services.viewer.sceneSetup.trackballControls.enabled = true;
|
|
}
|
|
|
|
function mousedown(e) {
|
|
pressed.clear();
|
|
let hits = performRaycast(e);
|
|
for (let hit of hits) {
|
|
let obj = hit.object;
|
|
if (obj && obj.onMouseDown) {
|
|
obj.onMouseDown(e, hits, objectToDrag => startDrag(objectToDrag, e));
|
|
}
|
|
pressed.add(obj);
|
|
if (!hit.object.passMouseEvent || !hit.object.passMouseEvent(e, hits)) {
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
function mouseup(e) {
|
|
if (toDrag) {
|
|
stopDrag(e);
|
|
mousemove(e);
|
|
} else {
|
|
let hits = performRaycast(e);
|
|
for (let hit of hits) {
|
|
let obj = hit.object;
|
|
if (obj && obj.onMouseUp) {
|
|
obj.onMouseUp(e, hits);
|
|
}
|
|
if (pressed.has(obj) && obj.onMouseClick) {
|
|
obj.onMouseClick(e, hits);
|
|
}
|
|
if (!hit.object.passMouseEvent || !hit.object.passMouseEvent(e, hits)) {
|
|
break;
|
|
}
|
|
}
|
|
pressed.clear();
|
|
}
|
|
}
|
|
|
|
let entered = new Set();
|
|
let valid = new Set();
|
|
|
|
function mousemove(e) {
|
|
|
|
if (toDrag) {
|
|
toDrag.dragMove(e);
|
|
} else {
|
|
let hits = performRaycast(e);
|
|
|
|
valid.clear();
|
|
for (let hit of hits) {
|
|
valid.add(hit.object);
|
|
if (!hit.object.passMouseEvent || !hit.object.passMouseEvent(e, hits)) {
|
|
break;
|
|
}
|
|
}
|
|
|
|
entered.forEach(e => {
|
|
if (!valid.has(e) && e.onMouseLeave) {
|
|
e.onMouseLeave(e, hits);
|
|
}
|
|
});
|
|
|
|
valid.forEach(e => {
|
|
if (!entered.has(e) && e.onMouseEnter) {
|
|
e.onMouseEnter(e, hits);
|
|
}
|
|
if (e.onMouseMove) {
|
|
e.onMouseMove(e, hits);
|
|
}
|
|
});
|
|
|
|
let t = valid;
|
|
valid = entered;
|
|
entered = t;
|
|
valid.clear();
|
|
}
|
|
}
|
|
}
|
|
|
|
export function hasObject(hits, object) {
|
|
return hits.find(hit => hit.object === object);
|
|
} |