diff --git a/direct/src/motiontrail/MotionTrail.py b/direct/src/motiontrail/MotionTrail.py index 5c55c30216..abb0f15823 100644 --- a/direct/src/motiontrail/MotionTrail.py +++ b/direct/src/motiontrail/MotionTrail.py @@ -1,6 +1,6 @@ from pandac.PandaModules import * - +from direct.task import Task from otp.otpbase import OTPRender @@ -11,6 +11,7 @@ class MotionTrailVertex: self.context = context self.vertex = Vec4 (0.0, 0.0, 0.0, 1.0) + # default self.start_color = Vec4 (1.0, 1.0, 1.0, 1.0) self.end_color = Vec4 (0.0, 0.0, 0.0, 1.0) self.v = 0.0 @@ -21,13 +22,114 @@ class MotionTrailFrame: self.transform = transform class MotionTrail(NodePath): + notify = directNotify.newCategory ("MotionTrail") + task_added = False + motion_trail_list = [ ] + + def print_matrix (self, matrix): + separator = ' ' + print matrix.getCell (0, 0), separator, matrix.getCell (0, 1), separator, matrix.getCell (0, 2), separator, matrix.getCell (0, 3) + print matrix.getCell (1, 0), separator, matrix.getCell (1, 1), separator, matrix.getCell (1, 2), separator, matrix.getCell (1, 3) + print matrix.getCell (2, 0), separator, matrix.getCell (2, 1), separator, matrix.getCell (2, 2), separator, matrix.getCell (2, 3) + print matrix.getCell (3, 0), separator, matrix.getCell (3, 1), separator, matrix.getCell (3, 2), separator, matrix.getCell (3, 3) + + def motion_trail_task (self, task): + + current_time = task.time + + index = 0 + total_motion_trails = len (MotionTrail.motion_trail_list) + while (index < total_motion_trails): + motion_trail = MotionTrail.motion_trail_list [index] + if (motion_trail.active and motion_trail.check_for_update (current_time)): + + transform = None + + """ + transform = motion_trail.getNetTransform ( ).getMat ( ) + print "net matrix", transform.__repr__ ( ) + + # transform = motion_trail.root_node_path.getTransform (motion_trail.parent_node_path).getMat ( ) + transform = motion_trail.parent_node_path.getTransform (motion_trail.root_node_path).getMat ( ) + print "rel matrix", transform.__repr__ ( ) + + transform = motion_trail.parent_node_path.getTransform (motion_trail).getMat ( ) + print "lll matrix", transform.__repr__ ( ) + """ + + if (motion_trail.root_node_path != None): + # motion_trail.parent_node_path + + # transform_state = motion_trail.parent_node_path.getTransform (motion_trail.root_node_path); + # transform = transform_state.getMat ( ) + pass + else: + pass + + net_matrix = motion_trail.getNetTransform ( ).getMat ( ) + if (motion_trail.previous_matrix != None): + +# i_matrix = Mat4 (Mat4.identMat ( )) +# print "i matrix" +# self.print_matrix (i_matrix) + + print "net matrix" + self.print_matrix (net_matrix) + + print "previous matrix" + self.print_matrix (motion_trail.previous_matrix) + + matrix = Mat4 (net_matrix) + matrix.invertInPlace ( ) + print "inverse matrix" + self.print_matrix (matrix) + + relative_matrix = Mat4 (Mat4.identMat ( )) + relative_matrix.multiply (matrix, motion_trail.previous_matrix) + print "relative_matrix #1" + self.print_matrix (relative_matrix) + + relative_matrix.multiply (motion_trail.previous_matrix, matrix) + print "relative_matrix #2" + self.print_matrix (relative_matrix) + + + motion_trail.previous_matrix = Mat4 (net_matrix) + + """ + current_matrix = Mat4.translateMat (Vec3 (0.0, 8.0, 0.0)) + + inverse_matrix = Mat4 (current_matrix) + inverse_matrix.invertInPlace ( ) + + previous_matrix = Mat4.translateMat (Vec3 (0.0, 5.0, 0.0)) + + relative_matrix = Mat4 (Mat4.identMat ( )) + relative_matrix.multiply (inverse_matrix, previous_matrix) + print "relative_matrix 111", relative_matrix.__repr__ ( ) + + relative_matrix = Mat4 (Mat4.identMat ( )) + relative_matrix.multiply (previous_matrix, inverse_matrix) + print "relative_matrix 222", relative_matrix.__repr__ ( ) + """ + + if (False and transform != None): + motion_trail.update_motion_trail (current_time, transform) + + index += 1 + + # print "motion_trail_task ( ): time =", task.time + + return Task.cont + def __init__ (self,name,parent_node_path): NodePath.__init__ (self,name) # required initialization + self.active = True self.enable = True self.pause = False @@ -43,6 +145,11 @@ class MotionTrail(NodePath): self.texture = None self.vertex_list = [ ] self.frame_list = [ ] + + self.parent_node_path = parent_node_path + + self.previous_matrix = None + self.calculate_relative_matrix = False # default options self.color_scale = 1.0 @@ -50,24 +157,37 @@ class MotionTrail(NodePath): self.sampling_time = 1.0 / 30.0 self.square_t = True + self.task_transform = False + self.root_node_path = None + # render self.reparentTo (parent_node_path) self.geom_node = GeomNode ("motion_trail") self.geom_node_path = self.attachNewNode(self.geom_node) node_path = self.geom_node_path - # set render states - node_path.node ( ).setAttrib (ColorBlendAttrib.make (ColorBlendAttrib.MAdd)) + ### set render states node_path.setTransparency (True) node_path.setDepthWrite (False) node_path.setTwoSided (True) + # additive blend + node_path.node ( ).setAttrib (ColorBlendAttrib.make (ColorBlendAttrib.MAdd)) + + # disable writes to destination alpha + node_path.setAttrib (ColorWriteAttrib.make (ColorWriteAttrib.CRed | ColorWriteAttrib.CGreen | ColorWriteAttrib.CBlue)); + # do not light node_path.setLightOff ( ) # do not display in reflections OTPRender.renderReflection (False, self, 'motion_trail', None) + + if (MotionTrail.task_added == False): + taskMgr.add (self.motion_trail_task, "motion_trail_task", priority = 50) + MotionTrail.task_added = True + return def add_vertex (self, vertex_id, vertex_function, context): @@ -115,6 +235,14 @@ class MotionTrail(NodePath): return + def register_motion_trail (self): + MotionTrail.motion_trail_list = MotionTrail.motion_trail_list + [self] + return + + def unregister_motion_trail (self): + MotionTrail.motion_trail_list = MotionTrail.motion_trail_list.remove (self) + return + def begin_geometry (self): self.vertex_index = 0; @@ -166,16 +294,24 @@ class MotionTrail(NodePath): self.geom_node.removeAllGeoms ( ) self.geom_node.addGeom (self.geometry) - def update_motion_trail (self, current_time, transform): - update = False + def check_for_update (self, current_time): + + state = False if ((current_time - self.last_update_time) >= self.sampling_time): - update = True + state = True if (self.pause): - update = False - - if (update): + state = False + + update = state and self.enable + + return state + + def update_motion_trail (self, current_time, transform): + + if (self.check_for_update (current_time)): + color_scale = self.color_scale; if (self.fade): @@ -242,7 +378,12 @@ class MotionTrail(NodePath): # print "minimum_time", minimum_time # print "delta_time", delta_time - + + + if (self.calculate_relative_matrix): + inverse_matrix = Mat4 (transform) + inverse_matrix.invertInPlace ( ) + segment_index = 0 while (segment_index < total_segments): motion_trail_frame_start = self.frame_list [segment_index] @@ -267,9 +408,27 @@ class MotionTrail(NodePath): vertex_segement_index = 0 total_vertex_segments = self.total_vertices - 1 + if (self.calculate_relative_matrix): + start_transform = Mat4 (Mat4.identMat ( )) + end_transform = Mat4 (Mat4.identMat ( )) +# start_transform = Mat4 ( ) +# end_transform = Mat4 ( ) +# start_transform.multiply (motion_trail_frame_start.transform, inverse_matrix) +# end_transform.multiply (motion_trail_frame_end.transform, inverse_matrix) + start_transform.multiply (inverse_matrix, motion_trail_frame_start.transform) + end_transform.multiply (inverse_matrix, motion_trail_frame_end.transform) + + print "relative_matrix 111", start_transform.__repr__ ( ) + print "relative_matrix 222", end_transform.__repr__ ( ) + + else: + start_transform = motion_trail_frame_start.transform + end_transform = motion_trail_frame_end.transform + motion_trail_vertex_start = self.vertex_list [0] - v0 = motion_trail_frame_start.transform.xform (motion_trail_vertex_start.vertex) - v2 = motion_trail_frame_end.transform.xform (motion_trail_vertex_start.vertex) + + v0 = start_transform.xform (motion_trail_vertex_start.vertex) + v2 = end_transform.xform (motion_trail_vertex_start.vertex) vertex_start_color = motion_trail_vertex_start.end_color + (motion_trail_vertex_start.start_color - motion_trail_vertex_start.end_color) color_start_t = color_scale * start_t @@ -285,8 +444,8 @@ class MotionTrail(NodePath): motion_trail_vertex_start = self.vertex_list [vertex_segement_index] motion_trail_vertex_end = self.vertex_list [vertex_segement_index + 1] - v1 = motion_trail_frame_start.transform.xform (motion_trail_vertex_end.vertex) - v3 = motion_trail_frame_end.transform.xform (motion_trail_vertex_end.vertex) + v1 = start_transform.xform (motion_trail_vertex_end.vertex) + v3 = end_transform.xform (motion_trail_vertex_end.vertex) """ print v0