-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathAnchor.gd
69 lines (52 loc) · 1.8 KB
/
Anchor.gd
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
extends MeshInstance3D
class_name Anchor
const anchorMat = preload("res://mats/anchor.tres")
const unselected_col = Color(0, 0, 0, 1)
const selected_col = Color(0, 1, 0, 1)
const outline_col = Color(0, 0, 0, 0.25)
var ab_len = 0.2
var ac_len
var ai
var bi
var face_i
var poly
var selected
func _init(_ai, _bi, _poly, _face_i, mat, _ab_len=0.2):
self.face_i = _face_i
self.poly = _poly
self.ab_len = _ab_len
self.ac_len = self.ab_len * 768 / 634
# Calculate normal
var na = self.poly.vertices[self.poly.faces[_face_i][0]]
var nb = self.poly.vertices[self.poly.faces[_face_i][1]]
var nc = self.poly.vertices[self.poly.faces[_face_i][2]]
var normal = Geom.calculate_normal_from_points(na, nb, nc)
self.ai = _ai
self.bi = _bi
var a = self.poly.vertices[self.ai]
var b = self.poly.vertices[self.bi]
var ab_raw = b - a
var ab = self.ab_len * ab_raw.normalized()
var ac = self.ac_len * ab.cross(normal).normalized()
var to_mid = (ab_raw - ab) / 2
var v1 = a + 0.02 * (normal) + to_mid
var v2 = v1 + ab
var v3 = v2 + ac
var v4 = v3 - ab
var anchor_mesh = Geom.convexhull_to_mesh([v1, v2, v3, v4])
if mat is ShaderMaterial:
mat.set_shader_parameter("color", self.unselected_col)
self.mesh = anchor_mesh
self.material_override = mat
func apply_inverse_anchor_order(inverse_anchor_order):
self.ai = inverse_anchor_order[self.ai]
self.bi = inverse_anchor_order[self.bi]
self.face_i = self.poly.directed_to_face[[ai, bi]]
func select():
self.material_override.set_shader_parameter("color", self.selected_col)
self.material_override.set_shader_parameter("outline", self.outline_col)
self.selected = true
func deselect():
self.material_override.set_shader_parameter("color", self.unselected_col)
self.material_override.set_shader_parameter("outline", Color(0, 0, 0, 0))
self.selected = false