-
-
Notifications
You must be signed in to change notification settings - Fork 780
/
fireball.py
executable file
·81 lines (65 loc) · 2.69 KB
/
fireball.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
80
81
#!/usr/bin/env python
from random import choice
from panda3d.core import Point3, Vec4
from direct.showbase.ShowBase import ShowBase
from direct.motiontrail.MotionTrail import MotionTrail
from direct.interval.LerpInterval import LerpPosInterval, LerpHprInterval
from direct.interval.LerpInterval import LerpScaleInterval
from direct.interval.LerpInterval import LerpTexOffsetInterval
from direct.interval.IntervalGlobal import Sequence
base = ShowBase()
base.set_background_color(0.1, 0.1, 0.1, 1)
base.cam.set_pos(0, -128, 32)
base.cam.look_at(render)
flame_colors = (
Vec4(1.0, 0.0, 0.0, 1),
Vec4(1.0, 0.2, 0.0, 1),
Vec4(1.0, 0.7, 0.0, 1),
Vec4(0.0, 0.0, 0.2, 1),
)
# A NodePath, rotating in empty space.
pivot = render.attach_new_node("pivot")
pivot.hprInterval(3, (360, 0, 0)).loop()
Sequence( # Bobs up and down
LerpPosInterval(pivot, 0.3, (0, 0,-2), (0, 0, 1), blendType="easeInOut"),
LerpPosInterval(pivot, 0.5, (0, 0, 1), (0, 0,-2), blendType="easeInOut")
).loop()
# A little chunk of charcoal that rotates along the pivot with an offset.
charcoal = loader.load_model("models/smiley").copy_to(pivot)
charcoal.set_texture(loader.load_texture("models/plasma.png"), 1)
charcoal.set_color(flame_colors[0] * 1.5)
charcoal.set_x(-32)
# It leaves a trail of flames.
fire_trail = MotionTrail("fire trail", charcoal)
fire_trail.register_motion_trail()
fire_trail.geom_node_path.reparent_to(render)
fire_trail.set_texture(loader.load_texture("models/plasma.png"))
fire_trail.time_window = 3 # Length of trail
# A circle as the trail's shape, by plotting a NodePath in a circle.
center = render.attach_new_node("center")
around = center.attach_new_node("around")
around.set_z(1)
res = 8 # Amount of angles in "circle". Higher is smoother.
for i in range(res + 1):
center.set_r((360 / res) * i)
vertex_pos = around.get_pos(render)
fire_trail.add_vertex(vertex_pos)
start_color = flame_colors[i % len(flame_colors)] * 1.7
end_color = Vec4(1, 1, 0, 1)
fire_trail.set_vertex_color(i, start_color, end_color)
'''
# A simple flat line, tron lightcycle-style, would be like so:
fire_trail.add_vertex(Point3(0, 0, 1))
fire_trail.add_vertex(Point3(0, 0,-1))
fire_trail.set_vertex_color(0, flame_colors[0], flame_colors[0])
fire_trail.set_vertex_color(1, flame_colors[1], flame_colors[1])
'''
fire_trail.update_vertices()
# Adding intervals to the trail to give it swoops and bends.
LerpHprInterval(fire_trail, 2, (0, 0, -360)).loop()
LerpTexOffsetInterval(fire_trail.geom_node_path, 4, (1, 1), (1, 0)).loop()
Sequence( # Grow and shrink
LerpScaleInterval(fire_trail, 0.3, 1.4, 0.4, blendType="easeInOut"),
LerpScaleInterval(fire_trail, 0.5, 0.4, 1.4, blendType="easeInOut")
).loop()
base.run()