Bläddra i källkod

Add set color.
Make texture usage optional.
Add begin/end.
Add actor update to fix LOD problem.

aignacio_sf 19 år sedan
förälder
incheckning
10bf727190
1 ändrade filer med 113 tillägg och 73 borttagningar
  1. 113 73
      direct/src/motiontrail/MotionTrail.py

+ 113 - 73
direct/src/motiontrail/MotionTrail.py

@@ -28,6 +28,76 @@ class MotionTrail(NodePath):
     task_added = False
     motion_trail_list = [ ]    
 
+
+    def __init__ (self,name,parent_node_path):
+
+        NodePath.__init__ (self,name)
+
+        # required initialization
+        self.active = True
+        self.enable = True
+
+        self.pause = False
+        self.pause_time = 0.0
+
+        self.fade = False
+        self.fade_end = False
+        self.fade_start_time = 0.0
+        self.fade_color_scale = 1.0
+        
+        self.total_vertices = 0
+        self.last_update_time = 0.0
+        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.continuous_motion_trail = True
+        self.color_scale = 1.0
+        self.time_window = 1.0
+        self.sampling_time = 1.0 / 30.0
+        self.square_t = True
+
+        self.task_transform = False
+        self.root_node_path = None
+
+        # node path states
+        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.setTwoSided (True)
+
+        # additive blend states
+        node_path.setTransparency (True)
+        node_path.setDepthWrite (False)
+        node_path.node ( ).setAttrib (ColorBlendAttrib.make (ColorBlendAttrib.MAdd))
+
+        # do not light
+        node_path.setLightOff ( )
+
+        # disable writes to destination alpha, write out rgb colors only
+        node_path.setAttrib (ColorWriteAttrib.make (ColorWriteAttrib.CRed | ColorWriteAttrib.CGreen | ColorWriteAttrib.CBlue));
+        
+        # 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)
+            taskMgr.add (self.motion_trail_task, "motion_trail_task")
+            MotionTrail.task_added = True
+
+        return
+
     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)
@@ -47,6 +117,9 @@ class MotionTrail(NodePath):
 
                 transform = None
 
+                if (motion_trail.root_node_path != None):
+                    motion_trail.root_node_path.update ( )
+
                 """
                 transform = motion_trail.getNetTransform ( ).getMat ( )
                 print "net matrix", transform.__repr__ ( )
@@ -128,6 +201,8 @@ class MotionTrail(NodePath):
                 transform = Mat4 (motion_trail.getNetTransform ( ).getMat ( ))
                 if (transform != None):
                     motion_trail.update_motion_trail (current_time, transform)
+    
+#                print "task update"
 
             index += 1
 
@@ -135,73 +210,6 @@ class MotionTrail(NodePath):
 
         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
-        self.pause_time = 0.0
-
-        self.fade = False
-        self.fade_end = False
-        self.fade_start_time = 0.0
-        self.fade_color_scale = 1.0
-        
-        self.total_vertices = 0
-        self.last_update_time = 0.0
-        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
-        self.time_window = 1.0
-        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.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)
-            taskMgr.add (self.motion_trail_task, "motion_trail_task")
-            MotionTrail.task_added = True
-
-        return
-
     def add_vertex (self, vertex_id, vertex_function, context):
 
         motion_trail_vertex = MotionTrailVertex (vertex_id, vertex_function, context)
@@ -210,6 +218,12 @@ class MotionTrail(NodePath):
         self.total_vertices = len (self.vertex_list)
 
         return motion_trail_vertex
+
+    def set_vertex_color (self, vertex_id, start_color, end_color):
+        if (vertex_id >= 0 and vertex_id < self.total_vertices):
+            motion_trail_vertex = self.vertex_list [vertex_id]
+            motion_trail_vertex.start_color = start_color
+            motion_trail_vertex.end_color = end_color
     
     def set_texture (self, texture):
 
@@ -233,6 +247,7 @@ class MotionTrail(NodePath):
                 vertex_index += 1
 
             # calculate v coordinate
+            # this is based on the number of vertices only and not on the relative positions of the vertices
             vertex_index = 0
             float_vertex_index = 0.0
             float_total_vertices = 0.0
@@ -259,12 +274,17 @@ class MotionTrail(NodePath):
 
         self.vertex_index = 0;
 
-        self.format = GeomVertexFormat.getV3c4t2 ( ) 
+        if (self.texture != None):
+            self.format = GeomVertexFormat.getV3c4t2 ( ) 
+        else:
+            self.format = GeomVertexFormat.getV3c4 ( ) 
+        
         self.vertex_data = GeomVertexData ("vertices", self.format, Geom.UHStatic) 
 
         self.vertex_writer = GeomVertexWriter (self.vertex_data, "vertex") 
         self.color_writer = GeomVertexWriter (self.vertex_data, "color")
-        self.texture_writer = GeomVertexWriter (self.vertex_data, "texcoord")
+        if (self.texture != None):
+            self.texture_writer = GeomVertexWriter (self.vertex_data, "texcoord")
         
         self.triangles = GeomTriangles (Geom.UHStatic) 
         
@@ -280,10 +300,11 @@ class MotionTrail(NodePath):
         self.color_writer.addData4f (c2 [0], c2 [1], c2 [2], c2 [3])
         self.color_writer.addData4f (c3 [0], c3 [1], c3 [2], c3 [3])
 
-        self.texture_writer.addData2f (t0 [0], t0 [1])
-        self.texture_writer.addData2f (t1 [0], t1 [1])
-        self.texture_writer.addData2f (t2 [0], t2 [1])
-        self.texture_writer.addData2f (t3 [0], t3 [1])
+        if (self.texture != None):
+            self.texture_writer.addData2f (t0 [0], t0 [1])
+            self.texture_writer.addData2f (t1 [0], t1 [1])
+            self.texture_writer.addData2f (t2 [0], t2 [1])
+            self.texture_writer.addData2f (t3 [0], t3 [1])
 
         vertex_index = self.vertex_index;
         
@@ -395,6 +416,7 @@ class MotionTrail(NodePath):
                 if (self.calculate_relative_matrix):
                     inverse_matrix = Mat4 (transform)
                     inverse_matrix.invertInPlace ( ) 
+#                    inverse_matrix.transposeInPlace ( )
                     
                     """                        
                     print "current matrix"
@@ -522,6 +544,24 @@ class MotionTrail(NodePath):
         self.frame_list = [ ]
         return
 
+    def reset_motion_trail_geometry(self):
+        if (self.geom_node != None):
+            self.geom_node.removeAllGeoms ( )         
+        return
+
+    def begin_motion_trail (self):
+        if (self.continuous_motion_trail == False):
+            self.reset_motion_trail ( )
+            self.active = True;
+        return
+
+    def end_motion_trail (self):
+        if (self.continuous_motion_trail == False):
+            self.active = False
+            self.reset_motion_trail ( )
+            self.reset_motion_trail_geometry ( )
+        return
+                
     def set_fade (self, time, current_time):
         if (self.pause == False):
             self.fade_color_scale = 1.0