-
-
Notifications
You must be signed in to change notification settings - Fork 326
/
trail_renderer.py
79 lines (60 loc) · 2.48 KB
/
trail_renderer.py
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
from ursina import *
class TrailRenderer(Entity):
def __init__(self, size=[1,.01], segments=8, min_spacing=.05, fade_speed=0, color_gradient=[color.white, color.clear], **kwargs):
super().__init__(**kwargs)
if color_gradient:
color_gradient = color_gradient[::-1]
self.renderer = Entity(
model = Pipe(
base_shape = Quad(segments=0, scale=size),
path=[Vec3(0,0,i) for i in range(2)],
color_gradient=color_gradient,
static=False,
cap_ends=False,
),
)
self._t = 0
self.segments = segments
self.update_step = .05
self.min_spacing = min_spacing
self.fade_speed = fade_speed
self.on_enable = self.renderer.enable
self.on_disable = self.renderer.disable
def update(self):
self._t += time.dt
if self._t >= self.update_step:
self._t = 0
if distance(self.world_position, self.renderer.model.path[-1]) > self.min_spacing:
self.renderer.model.path.append(self.world_position)
if len(self.renderer.model.path) > self.segments:
self.renderer.model.path.pop(0)
if self.fade_speed:
for i, v in enumerate(self.renderer.model.path):
if i >= len(self.renderer.model.path)-1:
continue
self.renderer.model.path[i] = lerp(v, self.renderer.model.path[i+1], time.dt*self.fade_speed)
self.renderer.model.generate()
def on_destroy(self):
destroy(self.renderer)
if __name__ == '__main__':
app = Ursina(vsync=False)
window.color = color.black
mouse.visible = False
player = Entity(z=1)
player.graphics = Entity(parent=player, scale=.1, model='circle')
pivot = Entity()
trail_renderers = []
for i in range(1):
tr = TrailRenderer(size=[1,1], segments=8, min_spacing=.05, fade_speed=0, parent=player, color_gradient=[color.magenta, color.cyan.tint(-.5), color.clear])
trail_renderers.append(tr)
def update():
player.position = lerp(player.position, mouse.position*10, time.dt*4)
def input(key):
if key == 'escape':
for e in trail_renderers:
e.enabled = not e.enabled
if key == 'space':
destroy(pivot)
EditorCamera()
Entity(model=Grid(8,8), rotation_x=90, color=color.gray, y=-3, scale=8)
app.run()