-
Notifications
You must be signed in to change notification settings - Fork 0
/
VertexSelector.js
90 lines (50 loc) · 2.32 KB
/
VertexSelector.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
82
83
84
85
86
87
88
89
90
import * as THREE from 'three';
export default class VertexSelector {
constructor(world) {
this._world = world;
var sphereGeometry = new THREE.SphereGeometry( 0.05, 32, 32 );
var sphereMaterial = new THREE.MeshBasicMaterial( {color: 0xffff00} );
this.selectionSphere = new THREE.Mesh( sphereGeometry, sphereMaterial );
this.selectionSphere.name = "Selection Sphere";
// We cannot make the selection sphere a child of the object to keep it updated
// because if we do that it gets scaled with the object.
// So we keep it in scene/world space and update its position manualy.
this._world.scene.add(this.selectionSphere);
this._vertexOwner = undefined;
this.selectedVertexIndex = 0;
}
update() {
if(this._vertexOwner) {
this._updatePositionOfSphere();
}
}
_updatePositionOfSphere() {
const vert = this._vertexOwner.geometry.vertices[this.selectedVertexIndex];
const worldPos = vert.clone().applyMatrix4(this._vertexOwner.matrixWorld);
this.selectionSphere.position.copy(worldPos);
}
hideSelectionSphere() {
this.selectionSphere.material.visible = false;
this.selectionSphere.material.needsUpdate = true;
}
showSelectionSphere() {
this.selectionSphere.material.visible = true;
this.selectionSphere.material.needsUpdate = true;
}
select(intersects) {
this._vertexOwner = intersects[0].object;
this._world.removeOldSelection();
this._world.selectObject(this._vertexOwner, false);
var faceTools = this._world.__ensureFaceTools(this._vertexOwner.geometry);
const vertexInfo = faceTools.getNearestVertex(this._vertexOwner.geometry, intersects[0].face, intersects[0].point, this._vertexOwner.matrixWorld);
this.selectedVertexIndex = vertexInfo.index;
this._updatePositionOfSphere();
this.showSelectionSphere();
}
getVertexPositionWorld() {
return this._vertexOwner.geometry.vertices[this.selectedVertexIndex].clone().applyMatrix4(this._vertexOwner.matrixWorld);
}
getVertexPositionLocal() {
return this._vertexOwner.geometry.vertices[this.selectedVertexIndex].clone();
}
}