-
Notifications
You must be signed in to change notification settings - Fork 4
/
trail.gd
86 lines (68 loc) · 2.17 KB
/
trail.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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
class_name Trail3D extends MeshInstance3D
var points = []
var widths = []
var lifePoints = []
@export var trailEnabled = true
@export var fromWidth = 0.5
@export var toWidth = 0.0
@export_range(0.5, 1.5) var scaleAcceleration:float = 1.0
@export var motionDelta = 0.1
@export var lifespan = 1.0
@export var scaleTexture = true
@export var startColor = Color(1.0, 1.0, 1.0, 1.0)
@export var endColor = Color(1.0, 1.0, 1.0, 0.0)
var oldPos
func _ready():
oldPos = get_parent().global_transform.origin
mesh = ImmediateMesh.new()
func _process(delta):
if !visible:
return
var origin = get_parent().global_transform.origin
if (oldPos - origin).length() > motionDelta and trailEnabled:
appendPoint()
oldPos = origin
var p = 0
var max_points = points.size()
while p < max_points:
lifePoints[p] += delta
if lifePoints[p] > lifespan:
removePoint(p)
p -= 1
if (p < 0): p = 0
max_points = points.size()
p += 1
mesh.clear_surfaces()
if points.size() < 2:
return
mesh.surface_begin(Mesh.PRIMITIVE_TRIANGLE_STRIP)
for i in range(points.size()):
var t = float(i) / (points.size() - 1.0)
var currColor = startColor.lerp(endColor, 1 - t)
mesh.surface_set_color(currColor)
var currWidth = widths[i][0] - pow(1-t, scaleAcceleration) * widths[i][1]
if scaleTexture:
var t0 = motionDelta * i
var t1 = motionDelta * (i + 1)
mesh.surface_set_uv(Vector2(t0, 0))
mesh.surface_add_vertex(to_local(points[i] + currWidth))
mesh.surface_set_uv(Vector2(t1, 1))
mesh.surface_add_vertex(to_local(points[i] - currWidth))
else:
var t0 = i / points.size()
var t1 = t
mesh.surface_set_uv(Vector2(t0, 0))
mesh.surface_add_vertex(to_local(points[i] + currWidth))
mesh.surface_set_uv(Vector2(t1, 1))
mesh.surface_add_vertex(to_local(points[i] - currWidth))
mesh.surface_end()
func appendPoint():
points.append(get_parent().global_transform.origin)
widths.append([
get_parent().global_transform.basis.x * fromWidth,
get_parent().global_transform.basis.x * fromWidth - get_parent().global_transform.basis.x * toWidth])
lifePoints.append(0.0)
func removePoint(i):
points.remove_at(i)
widths.remove_at(i)
lifePoints.remove_at(i)