-
-
Notifications
You must be signed in to change notification settings - Fork 420
Expand file tree
/
Copy pathbehavior.js
More file actions
124 lines (106 loc) · 3.38 KB
/
Copy pathbehavior.js
File metadata and controls
124 lines (106 loc) · 3.38 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
import macro from 'vtk.js/Sources/macros';
import { vec3 } from 'gl-matrix';
export default function widgetBehavior(publicAPI, model) {
model.painting = model._factory.getPainting();
publicAPI.handleLeftButtonPress = (callData) => {
const manipulator =
model.activeState?.getManipulator?.() ?? model.manipulator;
if (!(manipulator && model.activeState && model.activeState.getActive())) {
model.painting = false;
return macro.VOID;
}
const { worldCoords } = manipulator.handleEvent(
callData,
model._apiSpecificRenderWindow
);
if (!worldCoords?.length) {
model.painting = false;
return macro.VOID;
}
model.painting = true;
const trailCircle = model.widgetState.addTrail();
trailCircle.set(
model.activeState.get('origin', 'up', 'right', 'direction', 'scale1')
);
publicAPI.invokeStartInteractionEvent();
return macro.EVENT_ABORT;
};
publicAPI.handleMouseMove = (callData) => publicAPI.handleEvent(callData);
publicAPI.handleLeftButtonRelease = () => {
if (model.painting) {
publicAPI.invokeEndInteractionEvent();
model.widgetState.clearTrailList();
}
model.painting = false;
return macro.VOID;
};
publicAPI.handleEvent = (callData) => {
const manipulator =
model.activeState?.getManipulator?.() ?? model.manipulator;
if (!(manipulator && model.activeState && model.activeState.getActive())) {
model.painting = false;
return macro.VOID;
}
const normal = model._camera.getDirectionOfProjection();
const up = model._camera.getViewUp();
const right = [];
vec3.cross(right, up, normal);
model.activeState.setUp(...up);
model.activeState.setRight(...right);
model.activeState.setDirection(...normal);
const { worldCoords } = manipulator.handleEvent(
callData,
model._apiSpecificRenderWindow
);
if (!worldCoords?.length) {
return macro.VOID;
}
model.widgetState.setTrueOrigin(...worldCoords);
model.activeState.setOrigin(...worldCoords);
if (model.painting) {
const trailCircle = model.widgetState.addTrail();
trailCircle.set(
model.activeState.get('origin', 'up', 'right', 'direction', 'scale1')
);
} else {
return macro.EVENT_ABORT;
}
publicAPI.invokeInteractionEvent();
return macro.EVENT_ABORT;
};
publicAPI.grabFocus = () => {
if (!model.hasFocus) {
model.activeState = model.widgetState.getHandle();
model.activeState.activate();
model._interactor.requestAnimation(publicAPI);
const canvas = model._apiSpecificRenderWindow.getCanvas();
canvas.onmouseenter = () => {
if (
model.hasFocus &&
model.activeState === model.widgetState.getHandle()
) {
model.activeState.setVisible(true);
}
};
canvas.onmouseleave = () => {
if (
model.hasFocus &&
model.activeState === model.widgetState.getHandle()
) {
model.activeState.setVisible(false);
}
};
}
model.hasFocus = true;
};
publicAPI.loseFocus = () => {
if (model.hasFocus) {
model._interactor.cancelAnimation(publicAPI);
}
model.widgetState.deactivate();
model.widgetState.getHandle().deactivate();
model.activeState = null;
model.hasFocus = false;
};
macro.get(publicAPI, model, ['painting']);
}