-
Notifications
You must be signed in to change notification settings - Fork 122
/
Copy pathManipulate.js
81 lines (70 loc) · 3.11 KB
/
Manipulate.js
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
const THREE = require('three');
const {viewModes} = require('../../../core/lib/viewMode');
/**
* Manipulate service initializer for Three.js library
* @memberof K3D.Providers.ThreeJS.Initializers
*/
module.exports = function (K3D) {
const world = K3D.getWorld();
let draggingState = false;
K3D.on(K3D.events.VIEW_MODE_CHANGE, (mode) => {
if (mode === viewModes.manipulate) {
world.K3DObjects.children.forEach((obj) => {
if (!obj.transformControls && world.ObjectsListJson[obj.K3DIdentifier].model_matrix) {
const control = new THREE.TransformControls(world.camera, world.renderer.domElement);
control.addEventListener('change', () => {
// K3D.dispatch(K3D.events.OBJECT_CHANGE, {
// id: obj.K3DIdentifier,
// key: 'model_matrix',
// value: {
// data: new Float32Array(obj.matrixWorld.elements),
// shape: [4, 4]
// }
// });
world.render();
});
control.addEventListener('dragging-changed', (event) => {
world.controls.enabled = !event.value;
if (draggingState === false && event.value) {
draggingState = true;
world.K3DObjects.children.forEach((o) => {
if (o.transformControls && o.transformControls !== event.target) {
o.transformControls.enabled = false;
}
});
}
if (draggingState === true && !event.value) {
draggingState = false;
world.K3DObjects.children.forEach((o) => {
if (o.transformControls) {
o.transformControls.enabled = true;
}
});
}
});
control.setMode(K3D.parameters.manipulateMode);
world.scene.add(control);
control.attach(obj);
obj.transformControls = control;
}
});
} else {
world.K3DObjects.children.forEach((obj) => {
if (obj.transformControls) {
obj.transformControls.detach();
obj.transformControls.dispose();
delete obj.transformControls;
}
});
}
});
K3D.on(K3D.events.MANIPULATE_MODE_CHANGE, (manipulateMode) => {
world.K3DObjects.children.forEach((obj) => {
if (obj.transformControls) {
if (['translate', 'rotate', 'scale'].indexOf(manipulateMode) !== -1) {
obj.transformControls.setMode(manipulateMode);
}
}
});
});
};