toontown-just-works/toontown/effects/PolyTrail.py
2024-07-07 18:08:39 -05:00

165 lines
6.7 KiB
Python

from panda3d.core import *
from direct.motiontrail.MotionTrail import *
import random
class PolyTrail(NodePath):
def __init__(self, root_node_path = None, vertex_list = None, color_list = None, time_window = 0.25):
NodePath.__init__(self, 'PolyTrail')
self.time_window = time_window
self.root_node_path = root_node_path
if not self.root_node_path:
self.root_node_path = render
self.vertex_list = vertex_list
if not self.vertex_list:
self.vertex_list = [Vec4(0.0, 0.4, 0.0, 1.0), Vec4(0.0, 2.0, 0.0, 1.0)]
self.color_list = color_list
if not self.color_list:
self.color_list = []
for i in self.vertex_list:
self.color_list.append(Vec4(0.1, 0.2, 0.4, 1.0))
self.motion_trail = None
self.motion_trail_vertex = None
self.addMotionTrail()
self.setVertexColors(self.color_list)
self.setTimeWindow(self.time_window)
self.motion_trail.attach_motion_trail()
return
def destroy(self):
self.removeMotionTrail()
self.removeNode()
self.root_node_path = None
self.motion_trail = None
self.vertex_list = None
self.motion_trail_vertex = None
return
def beginTrail(self):
if self.motion_trail:
self.motion_trail.begin_motion_trail()
def endTrail(self):
if self.motion_trail:
self.motion_trail.end_motion_trail()
self.motion_trail.time_window = self.time_window
def removeMotionTrail(self):
self.endTrail()
if self.motion_trail:
self.motion_trail.unregister_motion_trail()
self.motion_trail.delete()
self.motion_trail = None
if self.motion_trail_vertex:
self.motion_trail_vertex = None
return
def addMotionTrail(self):
if not self.motion_trail:
self.motion_trail = MotionTrail('motion_trail', self)
self.motion_trail.root_node_path = self.root_node_path
if False:
axis = loader.loadModel('models/misc/xyzAxis')
axis.reparentTo(self)
def test_vertex_function(motion_trail_vertex, vertex_id, context):
return self.vertex_list[vertex_id]
index = 0
total_test_vertices = len(self.vertex_list)
while index < total_test_vertices:
self.motion_trail_vertex = self.motion_trail.add_vertex(index, test_vertex_function, None)
if True:
if index == 0:
self.motion_trail_vertex.start_color = Vec4(0.0, 0.25, 0.0, 1.0)
self.motion_trail_vertex.end_color = Vec4(0.0, 0.0, 0.0, 1.0)
if index == 1:
self.motion_trail_vertex.start_color = Vec4(0.25, 0.0, 0.0, 1.0)
self.motion_trail_vertex.end_color = Vec4(0.0, 0.0, 0.0, 1.0)
if index == 2:
self.motion_trail_vertex.start_color = Vec4(0.0, 0.0, 1.0, 1.0)
self.motion_trail_vertex.end_color = Vec4(0.0, 0.0, 0.0, 1.0)
if index == 3:
self.motion_trail_vertex.start_color = Vec4(0.0, 1.0, 1.0, 1.0)
self.motion_trail_vertex.end_color = Vec4(0.0, 0.0, 0.0, 1.0)
if index == 4:
self.motion_trail_vertex.start_color = Vec4(1.0, 1.0, 0.0, 1.0)
self.motion_trail_vertex.end_color = Vec4(0.0, 0.0, 0.0, 1.0)
index += 1
self.motion_trail.update_vertices()
self.motion_trail.calculate_relative_matrix = True
self.motion_trail.time_window = self.time_window
self.motion_trail.continuous_motion_trail = False
self.motion_trail.end_motion_trail()
self.motion_trail.register_motion_trail()
if False:
axis = Vec3(0.0, 0.0, 1.0)
time = 0.0
angle = (1.0 - time) * 90.0
matrix = Mat4.rotateMat(angle, axis)
self.motion_trail.update_motion_trail(time, matrix)
time = 0.2
angle = (1.0 - time) * 90.0
matrix = Mat4.rotateMat(angle, axis)
self.motion_trail.update_motion_trail(time, matrix)
time = 0.4
angle = (1.0 - time) * 90.0
matrix = Mat4.rotateMat(angle, axis)
self.motion_trail.update_motion_trail(time, matrix)
time = 0.6
angle = (1.0 - time) * 90.0
matrix = Mat4.rotateMat(angle, axis)
self.motion_trail.update_motion_trail(time, matrix)
time = 0.8
angle = (1.0 - time) * 90.0
matrix = Mat4.rotateMat(angle, axis)
self.motion_trail.update_motion_trail(time, matrix)
time = 1.0
angle = (1.0 - time) * 90.0
matrix = Mat4.rotateMat(angle, axis)
self.motion_trail.update_motion_trail(time, matrix)
return
def setVertexColors(self, color_list):
if self.motion_trail:
black = Vec4(0.0, 0.0, 0.0, 1.0)
scale_array = [0.25,
0.4,
0.7,
1.0]
total_scales = len(scale_array)
for index in xrange(len(color_list)):
color = color_list[index]
if index < total_scales:
scale = scale_array[index] * 0.75
else:
scale = 1.0
scaled_color = Vec4(color[0] * scale, color[1] * scale, color[2] * scale, 1.0)
self.motion_trail.set_vertex_color(index, scaled_color, black)
def setUnmodifiedVertexColors(self, color_list):
if self.motion_trail:
for index in xrange(len(color_list)):
color = color_list[index]
self.motion_trail.set_vertex_color(index, color, color)
def setTimeWindow(self, time_window):
if self.motion_trail:
self.motion_trail.time_window = time_window
def setUseNurbs(self, val):
self.motion_trail.use_nurbs = val
def setTexture(self, texture):
if self.motion_trail:
self.motion_trail.set_texture(texture)
def setBlendModeOn(self):
if self.motion_trail:
self.motion_trail.geom_node_path.node().setAttrib(ColorBlendAttrib.make(ColorBlendAttrib.MAdd, ColorBlendAttrib.OIncomingAlpha, ColorBlendAttrib.OOne))
def setBlendModeOff(self):
if self.motion_trail:
self.motion_trail.geom_node_path.node().setAttrib(ColorBlendAttrib.make(ColorBlendAttrib.MNone))