Add update capability via a task.
Add preliminary relative matrix calculations (not working properly). Disable alpha writes.
This commit is contained in:
parent
e01defc4f8
commit
d18d28229f
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Reference in New Issue