Mercurial > MadButterfly
annotate pyink/tween.py @ 1227:983442b2698c
Fix the exception for object without opacity.
author | wycc |
---|---|
date | Fri, 07 Jan 2011 15:58:45 +0800 |
parents | a05c8deb6523 |
children | 447cd3359cf2 |
rev | line source |
---|---|
1140 | 1 # -*- indent-tabs-mode: t; tab-width: 8; python-indent: 4; -*- |
2 # vim: sw=4:ts=8:sts=4 | |
3 import traceback | |
4 import math | |
1151
71c72e8d6755
Refactory cod eof TweenObject.updateTweenContent and MBScene.setCurrentScene().
Thinker K.F. Li <thinker@codemud.net>
parents:
1150
diff
changeset
|
5 |
1225
a05c8deb6523
Add opacity support to implement fadein/fadeout effect
wycc
parents:
1199
diff
changeset
|
6 def parse_opacity(obj): |
a05c8deb6523
Add opacity support to implement fadein/fadeout effect
wycc
parents:
1199
diff
changeset
|
7 style = obj.getAttribute("style") |
a05c8deb6523
Add opacity support to implement fadein/fadeout effect
wycc
parents:
1199
diff
changeset
|
8 arr = style.split(';') |
a05c8deb6523
Add opacity support to implement fadein/fadeout effect
wycc
parents:
1199
diff
changeset
|
9 for a in arr: |
a05c8deb6523
Add opacity support to implement fadein/fadeout effect
wycc
parents:
1199
diff
changeset
|
10 f = a.split(':') |
a05c8deb6523
Add opacity support to implement fadein/fadeout effect
wycc
parents:
1199
diff
changeset
|
11 if f[0] == 'opacity': |
a05c8deb6523
Add opacity support to implement fadein/fadeout effect
wycc
parents:
1199
diff
changeset
|
12 return float(f[1]) |
a05c8deb6523
Add opacity support to implement fadein/fadeout effect
wycc
parents:
1199
diff
changeset
|
13 return 1 |
a05c8deb6523
Add opacity support to implement fadein/fadeout effect
wycc
parents:
1199
diff
changeset
|
14 |
1227 | 15 def change_opacity(obj, opacity): |
16 try: | |
17 style = obj.getAttribute("style") | |
18 except: | |
19 obj.setAttribute("style","opacity:%g" % opacity) | |
20 return | |
1225
a05c8deb6523
Add opacity support to implement fadein/fadeout effect
wycc
parents:
1199
diff
changeset
|
21 arr = style.split(';') |
a05c8deb6523
Add opacity support to implement fadein/fadeout effect
wycc
parents:
1199
diff
changeset
|
22 s='' |
a05c8deb6523
Add opacity support to implement fadein/fadeout effect
wycc
parents:
1199
diff
changeset
|
23 for a in arr: |
a05c8deb6523
Add opacity support to implement fadein/fadeout effect
wycc
parents:
1199
diff
changeset
|
24 f = a.split(':') |
a05c8deb6523
Add opacity support to implement fadein/fadeout effect
wycc
parents:
1199
diff
changeset
|
25 f[0] = f[0].replace(' ','') |
a05c8deb6523
Add opacity support to implement fadein/fadeout effect
wycc
parents:
1199
diff
changeset
|
26 if f[0] == 'opacity': |
a05c8deb6523
Add opacity support to implement fadein/fadeout effect
wycc
parents:
1199
diff
changeset
|
27 if s != '': |
a05c8deb6523
Add opacity support to implement fadein/fadeout effect
wycc
parents:
1199
diff
changeset
|
28 s = s + ('; opacity:%g' % opacity) |
a05c8deb6523
Add opacity support to implement fadein/fadeout effect
wycc
parents:
1199
diff
changeset
|
29 else: |
a05c8deb6523
Add opacity support to implement fadein/fadeout effect
wycc
parents:
1199
diff
changeset
|
30 s = 'opacity:%g' % opacity |
a05c8deb6523
Add opacity support to implement fadein/fadeout effect
wycc
parents:
1199
diff
changeset
|
31 elif f[0] != '': |
a05c8deb6523
Add opacity support to implement fadein/fadeout effect
wycc
parents:
1199
diff
changeset
|
32 if s == '': |
a05c8deb6523
Add opacity support to implement fadein/fadeout effect
wycc
parents:
1199
diff
changeset
|
33 s = a |
a05c8deb6523
Add opacity support to implement fadein/fadeout effect
wycc
parents:
1199
diff
changeset
|
34 else: |
a05c8deb6523
Add opacity support to implement fadein/fadeout effect
wycc
parents:
1199
diff
changeset
|
35 s = s +';'+ a |
a05c8deb6523
Add opacity support to implement fadein/fadeout effect
wycc
parents:
1199
diff
changeset
|
36 obj.setAttribute("style",s) |
a05c8deb6523
Add opacity support to implement fadein/fadeout effect
wycc
parents:
1199
diff
changeset
|
37 |
a05c8deb6523
Add opacity support to implement fadein/fadeout effect
wycc
parents:
1199
diff
changeset
|
38 |
1140 | 39 class TweenObject: |
1151
71c72e8d6755
Refactory cod eof TweenObject.updateTweenContent and MBScene.setCurrentScene().
Thinker K.F. Li <thinker@codemud.net>
parents:
1150
diff
changeset
|
40 TWEEN_TYPE_NORMAL = 0 |
1157
3a891dccabd8
Remove the locate tween. It is a special case for the scale tween
wycc
parents:
1156
diff
changeset
|
41 #TWEEN_TYPE_RELOCATE = 1 |
3a891dccabd8
Remove the locate tween. It is a special case for the scale tween
wycc
parents:
1156
diff
changeset
|
42 TWEEN_TYPE_SCALE = 1 |
1156
ad9c44a08645
If an object does not exist in the destination group, we should duplicate it.
wycc
parents:
1151
diff
changeset
|
43 |
1140 | 44 def __init__(self,doc,dom): |
45 self.document = doc | |
46 self.dom = dom | |
1141 | 47 try: |
48 self.width = float(dom.getAttribute("width")) | |
49 self.height = float(dom.getAttribute("height")) | |
50 except: | |
51 self.width = 640 | |
52 self.height = 480 | |
1140 | 53 |
54 def updateMapping(self): | |
55 self.nodeToItem={} | |
56 root = self.dom | |
57 self.updateMappingNode(root) | |
58 def updateMappingNode(self,node): | |
59 for c in node.childList(): | |
60 self.updateMappingNode(c) | |
1141 | 61 try: |
62 self.nodeToItem[c.getAttribute("id")] = c | |
63 except: | |
64 pass | |
1151
71c72e8d6755
Refactory cod eof TweenObject.updateTweenContent and MBScene.setCurrentScene().
Thinker K.F. Li <thinker@codemud.net>
parents:
1150
diff
changeset
|
65 def updateTweenContent(self, duplicate_group, tween_type, |
71c72e8d6755
Refactory cod eof TweenObject.updateTweenContent and MBScene.setCurrentScene().
Thinker K.F. Li <thinker@codemud.net>
parents:
1150
diff
changeset
|
66 start_scene_group, stop_scene_group, percent): |
1140 | 67 """ |
1151
71c72e8d6755
Refactory cod eof TweenObject.updateTweenContent and MBScene.setCurrentScene().
Thinker K.F. Li <thinker@codemud.net>
parents:
1150
diff
changeset
|
68 Update the content of the duplicate scene group. We will |
71c72e8d6755
Refactory cod eof TweenObject.updateTweenContent and MBScene.setCurrentScene().
Thinker K.F. Li <thinker@codemud.net>
parents:
1150
diff
changeset
|
69 use precent, start_scene_group, stop_scene_group to |
71c72e8d6755
Refactory cod eof TweenObject.updateTweenContent and MBScene.setCurrentScene().
Thinker K.F. Li <thinker@codemud.net>
parents:
1150
diff
changeset
|
70 compute transform matrix and update duplicate scene group |
71c72e8d6755
Refactory cod eof TweenObject.updateTweenContent and MBScene.setCurrentScene().
Thinker K.F. Li <thinker@codemud.net>
parents:
1150
diff
changeset
|
71 specified. |
1140 | 72 """ |
1146
e14ec6d1a661
CHange the implementation to set the transformation matrix only. This is be more friendly for the animation inside the inskcape.
wycc
parents:
1141
diff
changeset
|
73 # Collect ref from the obj |
1151
71c72e8d6755
Refactory cod eof TweenObject.updateTweenContent and MBScene.setCurrentScene().
Thinker K.F. Li <thinker@codemud.net>
parents:
1150
diff
changeset
|
74 node = duplicate_group.firstChild() |
71c72e8d6755
Refactory cod eof TweenObject.updateTweenContent and MBScene.setCurrentScene().
Thinker K.F. Li <thinker@codemud.net>
parents:
1150
diff
changeset
|
75 dup_nodes = {} |
71c72e8d6755
Refactory cod eof TweenObject.updateTweenContent and MBScene.setCurrentScene().
Thinker K.F. Li <thinker@codemud.net>
parents:
1150
diff
changeset
|
76 while node: |
1146
e14ec6d1a661
CHange the implementation to set the transformation matrix only. This is be more friendly for the animation inside the inskcape.
wycc
parents:
1141
diff
changeset
|
77 try: |
1151
71c72e8d6755
Refactory cod eof TweenObject.updateTweenContent and MBScene.setCurrentScene().
Thinker K.F. Li <thinker@codemud.net>
parents:
1150
diff
changeset
|
78 ref = node.getAttribute("ref") |
71c72e8d6755
Refactory cod eof TweenObject.updateTweenContent and MBScene.setCurrentScene().
Thinker K.F. Li <thinker@codemud.net>
parents:
1150
diff
changeset
|
79 dup_nodes[ref] = node |
1146
e14ec6d1a661
CHange the implementation to set the transformation matrix only. This is be more friendly for the animation inside the inskcape.
wycc
parents:
1141
diff
changeset
|
80 except: |
e14ec6d1a661
CHange the implementation to set the transformation matrix only. This is be more friendly for the animation inside the inskcape.
wycc
parents:
1141
diff
changeset
|
81 ref = None |
1151
71c72e8d6755
Refactory cod eof TweenObject.updateTweenContent and MBScene.setCurrentScene().
Thinker K.F. Li <thinker@codemud.net>
parents:
1150
diff
changeset
|
82 pass |
71c72e8d6755
Refactory cod eof TweenObject.updateTweenContent and MBScene.setCurrentScene().
Thinker K.F. Li <thinker@codemud.net>
parents:
1150
diff
changeset
|
83 node = node.next() |
71c72e8d6755
Refactory cod eof TweenObject.updateTweenContent and MBScene.setCurrentScene().
Thinker K.F. Li <thinker@codemud.net>
parents:
1150
diff
changeset
|
84 pass |
1146
e14ec6d1a661
CHange the implementation to set the transformation matrix only. This is be more friendly for the animation inside the inskcape.
wycc
parents:
1141
diff
changeset
|
85 |
1151
71c72e8d6755
Refactory cod eof TweenObject.updateTweenContent and MBScene.setCurrentScene().
Thinker K.F. Li <thinker@codemud.net>
parents:
1150
diff
changeset
|
86 # Collect all nodes in stop scene |
71c72e8d6755
Refactory cod eof TweenObject.updateTweenContent and MBScene.setCurrentScene().
Thinker K.F. Li <thinker@codemud.net>
parents:
1150
diff
changeset
|
87 stop_nodes = {} |
71c72e8d6755
Refactory cod eof TweenObject.updateTweenContent and MBScene.setCurrentScene().
Thinker K.F. Li <thinker@codemud.net>
parents:
1150
diff
changeset
|
88 node = stop_scene_group.firstChild() |
71c72e8d6755
Refactory cod eof TweenObject.updateTweenContent and MBScene.setCurrentScene().
Thinker K.F. Li <thinker@codemud.net>
parents:
1150
diff
changeset
|
89 while node: |
1140 | 90 try: |
1151
71c72e8d6755
Refactory cod eof TweenObject.updateTweenContent and MBScene.setCurrentScene().
Thinker K.F. Li <thinker@codemud.net>
parents:
1150
diff
changeset
|
91 node_label = node.getAttribute("ns0:duplicate-src") |
71c72e8d6755
Refactory cod eof TweenObject.updateTweenContent and MBScene.setCurrentScene().
Thinker K.F. Li <thinker@codemud.net>
parents:
1150
diff
changeset
|
92 stop_nodes[node_label] = node |
1140 | 93 except: |
94 pass | |
1151
71c72e8d6755
Refactory cod eof TweenObject.updateTweenContent and MBScene.setCurrentScene().
Thinker K.F. Li <thinker@codemud.net>
parents:
1150
diff
changeset
|
95 node = node.next() |
71c72e8d6755
Refactory cod eof TweenObject.updateTweenContent and MBScene.setCurrentScene().
Thinker K.F. Li <thinker@codemud.net>
parents:
1150
diff
changeset
|
96 pass |
1199
25e1579ed3d1
Fix bug of running animation
Thinker K.F. Li <thinker@codemud.net>
parents:
1172
diff
changeset
|
97 |
1172
178b126edd2c
Implement the correct normal tween. We will duplicate the node in the start scene. Insted of deleting all nodes which is not in the stop scene, we should delete the object which is not in the start scene instead. If we delete objecvt the the stop scene, the object should appear until we reach the stop scene.
wycc
parents:
1170
diff
changeset
|
98 # Collect all nodes in start scene |
178b126edd2c
Implement the correct normal tween. We will duplicate the node in the start scene. Insted of deleting all nodes which is not in the stop scene, we should delete the object which is not in the start scene instead. If we delete objecvt the the stop scene, the object should appear until we reach the stop scene.
wycc
parents:
1170
diff
changeset
|
99 start_nodes = {} |
178b126edd2c
Implement the correct normal tween. We will duplicate the node in the start scene. Insted of deleting all nodes which is not in the stop scene, we should delete the object which is not in the start scene instead. If we delete objecvt the the stop scene, the object should appear until we reach the stop scene.
wycc
parents:
1170
diff
changeset
|
100 node = start_scene_group.firstChild() |
178b126edd2c
Implement the correct normal tween. We will duplicate the node in the start scene. Insted of deleting all nodes which is not in the stop scene, we should delete the object which is not in the start scene instead. If we delete objecvt the the stop scene, the object should appear until we reach the stop scene.
wycc
parents:
1170
diff
changeset
|
101 while node: |
178b126edd2c
Implement the correct normal tween. We will duplicate the node in the start scene. Insted of deleting all nodes which is not in the stop scene, we should delete the object which is not in the start scene instead. If we delete objecvt the the stop scene, the object should appear until we reach the stop scene.
wycc
parents:
1170
diff
changeset
|
102 try: |
178b126edd2c
Implement the correct normal tween. We will duplicate the node in the start scene. Insted of deleting all nodes which is not in the stop scene, we should delete the object which is not in the start scene instead. If we delete objecvt the the stop scene, the object should appear until we reach the stop scene.
wycc
parents:
1170
diff
changeset
|
103 node_label = node.getAttribute("id") |
178b126edd2c
Implement the correct normal tween. We will duplicate the node in the start scene. Insted of deleting all nodes which is not in the stop scene, we should delete the object which is not in the start scene instead. If we delete objecvt the the stop scene, the object should appear until we reach the stop scene.
wycc
parents:
1170
diff
changeset
|
104 start_nodes[node_label] = node |
178b126edd2c
Implement the correct normal tween. We will duplicate the node in the start scene. Insted of deleting all nodes which is not in the stop scene, we should delete the object which is not in the start scene instead. If we delete objecvt the the stop scene, the object should appear until we reach the stop scene.
wycc
parents:
1170
diff
changeset
|
105 except: |
178b126edd2c
Implement the correct normal tween. We will duplicate the node in the start scene. Insted of deleting all nodes which is not in the stop scene, we should delete the object which is not in the start scene instead. If we delete objecvt the the stop scene, the object should appear until we reach the stop scene.
wycc
parents:
1170
diff
changeset
|
106 pass |
178b126edd2c
Implement the correct normal tween. We will duplicate the node in the start scene. Insted of deleting all nodes which is not in the stop scene, we should delete the object which is not in the start scene instead. If we delete objecvt the the stop scene, the object should appear until we reach the stop scene.
wycc
parents:
1170
diff
changeset
|
107 node = node.next() |
178b126edd2c
Implement the correct normal tween. We will duplicate the node in the start scene. Insted of deleting all nodes which is not in the stop scene, we should delete the object which is not in the start scene instead. If we delete objecvt the the stop scene, the object should appear until we reach the stop scene.
wycc
parents:
1170
diff
changeset
|
108 pass |
1151
71c72e8d6755
Refactory cod eof TweenObject.updateTweenContent and MBScene.setCurrentScene().
Thinker K.F. Li <thinker@codemud.net>
parents:
1150
diff
changeset
|
109 |
1172
178b126edd2c
Implement the correct normal tween. We will duplicate the node in the start scene. Insted of deleting all nodes which is not in the stop scene, we should delete the object which is not in the start scene instead. If we delete objecvt the the stop scene, the object should appear until we reach the stop scene.
wycc
parents:
1170
diff
changeset
|
110 # Remove duplicate nodes that is not in the set of start nodes |
178b126edd2c
Implement the correct normal tween. We will duplicate the node in the start scene. Insted of deleting all nodes which is not in the stop scene, we should delete the object which is not in the start scene instead. If we delete objecvt the the stop scene, the object should appear until we reach the stop scene.
wycc
parents:
1170
diff
changeset
|
111 for node_ref in dup_nodes: |
178b126edd2c
Implement the correct normal tween. We will duplicate the node in the start scene. Insted of deleting all nodes which is not in the stop scene, we should delete the object which is not in the start scene instead. If we delete objecvt the the stop scene, the object should appear until we reach the stop scene.
wycc
parents:
1170
diff
changeset
|
112 if node_ref not in start_nodes: |
178b126edd2c
Implement the correct normal tween. We will duplicate the node in the start scene. Insted of deleting all nodes which is not in the stop scene, we should delete the object which is not in the start scene instead. If we delete objecvt the the stop scene, the object should appear until we reach the stop scene.
wycc
parents:
1170
diff
changeset
|
113 node = dup_nodes[node_ref] |
178b126edd2c
Implement the correct normal tween. We will duplicate the node in the start scene. Insted of deleting all nodes which is not in the stop scene, we should delete the object which is not in the start scene instead. If we delete objecvt the the stop scene, the object should appear until we reach the stop scene.
wycc
parents:
1170
diff
changeset
|
114 duplicate_group.removeChild(node) |
178b126edd2c
Implement the correct normal tween. We will duplicate the node in the start scene. Insted of deleting all nodes which is not in the stop scene, we should delete the object which is not in the start scene instead. If we delete objecvt the the stop scene, the object should appear until we reach the stop scene.
wycc
parents:
1170
diff
changeset
|
115 pass |
178b126edd2c
Implement the correct normal tween. We will duplicate the node in the start scene. Insted of deleting all nodes which is not in the stop scene, we should delete the object which is not in the start scene instead. If we delete objecvt the the stop scene, the object should appear until we reach the stop scene.
wycc
parents:
1170
diff
changeset
|
116 pass |
1160
1a699dc00fa3
Fix the issue of not removing node in old scene when switching scenes.
Thinker K.F. Li <thinker@codemud.net>
parents:
1157
diff
changeset
|
117 |
1151
71c72e8d6755
Refactory cod eof TweenObject.updateTweenContent and MBScene.setCurrentScene().
Thinker K.F. Li <thinker@codemud.net>
parents:
1150
diff
changeset
|
118 # |
71c72e8d6755
Refactory cod eof TweenObject.updateTweenContent and MBScene.setCurrentScene().
Thinker K.F. Li <thinker@codemud.net>
parents:
1150
diff
changeset
|
119 # Node ID of a node of start scene must be mapped to |
71c72e8d6755
Refactory cod eof TweenObject.updateTweenContent and MBScene.setCurrentScene().
Thinker K.F. Li <thinker@codemud.net>
parents:
1150
diff
changeset
|
120 # 'ns0:duplicate-src' attribute of a node of stop scene. The |
71c72e8d6755
Refactory cod eof TweenObject.updateTweenContent and MBScene.setCurrentScene().
Thinker K.F. Li <thinker@codemud.net>
parents:
1150
diff
changeset
|
121 # nodes which can not be mapped to a node of stop scene are |
71c72e8d6755
Refactory cod eof TweenObject.updateTweenContent and MBScene.setCurrentScene().
Thinker K.F. Li <thinker@codemud.net>
parents:
1150
diff
changeset
|
122 # not manipulated by the tween. |
71c72e8d6755
Refactory cod eof TweenObject.updateTweenContent and MBScene.setCurrentScene().
Thinker K.F. Li <thinker@codemud.net>
parents:
1150
diff
changeset
|
123 # |
71c72e8d6755
Refactory cod eof TweenObject.updateTweenContent and MBScene.setCurrentScene().
Thinker K.F. Li <thinker@codemud.net>
parents:
1150
diff
changeset
|
124 # When a scene is duplicated, 'ns0:duplicate-src' attribute of |
71c72e8d6755
Refactory cod eof TweenObject.updateTweenContent and MBScene.setCurrentScene().
Thinker K.F. Li <thinker@codemud.net>
parents:
1150
diff
changeset
|
125 # nodes, in the new scene, must be setted to ID of respective |
71c72e8d6755
Refactory cod eof TweenObject.updateTweenContent and MBScene.setCurrentScene().
Thinker K.F. Li <thinker@codemud.net>
parents:
1150
diff
changeset
|
126 # one in the duplicated scene. |
71c72e8d6755
Refactory cod eof TweenObject.updateTweenContent and MBScene.setCurrentScene().
Thinker K.F. Li <thinker@codemud.net>
parents:
1150
diff
changeset
|
127 # |
71c72e8d6755
Refactory cod eof TweenObject.updateTweenContent and MBScene.setCurrentScene().
Thinker K.F. Li <thinker@codemud.net>
parents:
1150
diff
changeset
|
128 start_node = start_scene_group.firstChild() |
71c72e8d6755
Refactory cod eof TweenObject.updateTweenContent and MBScene.setCurrentScene().
Thinker K.F. Li <thinker@codemud.net>
parents:
1150
diff
changeset
|
129 while start_node: |
71c72e8d6755
Refactory cod eof TweenObject.updateTweenContent and MBScene.setCurrentScene().
Thinker K.F. Li <thinker@codemud.net>
parents:
1150
diff
changeset
|
130 start_node_id = start_node.getAttribute('id') |
1163 | 131 dup_node = dup_nodes.setdefault(start_node_id, None) |
1151
71c72e8d6755
Refactory cod eof TweenObject.updateTweenContent and MBScene.setCurrentScene().
Thinker K.F. Li <thinker@codemud.net>
parents:
1150
diff
changeset
|
132 try: |
71c72e8d6755
Refactory cod eof TweenObject.updateTweenContent and MBScene.setCurrentScene().
Thinker K.F. Li <thinker@codemud.net>
parents:
1150
diff
changeset
|
133 stop_node = stop_nodes[start_node_id] |
71c72e8d6755
Refactory cod eof TweenObject.updateTweenContent and MBScene.setCurrentScene().
Thinker K.F. Li <thinker@codemud.net>
parents:
1150
diff
changeset
|
134 except KeyError: |
1170
e64b02951627
Fix the issue in the normal tween. We duplicate the object only when the object is not in the duplicated node yet.
wycc
parents:
1167
diff
changeset
|
135 self.updateTweenObject(duplicate_group, tween_type, |
e64b02951627
Fix the issue in the normal tween. We duplicate the object only when the object is not in the duplicated node yet.
wycc
parents:
1167
diff
changeset
|
136 start_node, start_node, |
e64b02951627
Fix the issue in the normal tween. We duplicate the object only when the object is not in the duplicated node yet.
wycc
parents:
1167
diff
changeset
|
137 percent, dup_node) |
1151
71c72e8d6755
Refactory cod eof TweenObject.updateTweenContent and MBScene.setCurrentScene().
Thinker K.F. Li <thinker@codemud.net>
parents:
1150
diff
changeset
|
138 start_node = start_node.next() |
71c72e8d6755
Refactory cod eof TweenObject.updateTweenContent and MBScene.setCurrentScene().
Thinker K.F. Li <thinker@codemud.net>
parents:
1150
diff
changeset
|
139 continue |
71c72e8d6755
Refactory cod eof TweenObject.updateTweenContent and MBScene.setCurrentScene().
Thinker K.F. Li <thinker@codemud.net>
parents:
1150
diff
changeset
|
140 |
71c72e8d6755
Refactory cod eof TweenObject.updateTweenContent and MBScene.setCurrentScene().
Thinker K.F. Li <thinker@codemud.net>
parents:
1150
diff
changeset
|
141 |
71c72e8d6755
Refactory cod eof TweenObject.updateTweenContent and MBScene.setCurrentScene().
Thinker K.F. Li <thinker@codemud.net>
parents:
1150
diff
changeset
|
142 self.updateTweenObject(duplicate_group, tween_type, |
71c72e8d6755
Refactory cod eof TweenObject.updateTweenContent and MBScene.setCurrentScene().
Thinker K.F. Li <thinker@codemud.net>
parents:
1150
diff
changeset
|
143 start_node, stop_node, |
71c72e8d6755
Refactory cod eof TweenObject.updateTweenContent and MBScene.setCurrentScene().
Thinker K.F. Li <thinker@codemud.net>
parents:
1150
diff
changeset
|
144 percent, dup_node) |
71c72e8d6755
Refactory cod eof TweenObject.updateTweenContent and MBScene.setCurrentScene().
Thinker K.F. Li <thinker@codemud.net>
parents:
1150
diff
changeset
|
145 start_node = start_node.next() |
71c72e8d6755
Refactory cod eof TweenObject.updateTweenContent and MBScene.setCurrentScene().
Thinker K.F. Li <thinker@codemud.net>
parents:
1150
diff
changeset
|
146 pass |
71c72e8d6755
Refactory cod eof TweenObject.updateTweenContent and MBScene.setCurrentScene().
Thinker K.F. Li <thinker@codemud.net>
parents:
1150
diff
changeset
|
147 pass |
1140 | 148 |
149 def parseTransform(self,obj): | |
150 """ | |
151 Return the transform matrix of an object | |
152 """ | |
153 try: | |
1141 | 154 t = obj.getAttribute("transform") |
1140 | 155 if t[0:9] == 'translate': |
156 fields = t[10:].split(',') | |
157 x = float(fields[0]) | |
158 fields = fields[1].split(')') | |
159 y = float(fields[0]) | |
160 return [1,0,0,1,x,y] | |
161 elif t[0:6] == 'matrix': | |
162 fields=t[7:].split(')') | |
163 fields = fields[0].split(',') | |
164 return [float(fields[0]),float(fields[1]),float(fields[2]),float(fields[3]),float(fields[4]),float(fields[5])] | |
165 except: | |
166 #traceback.print_exc() | |
167 return [1,0,0,1,0,0] | |
168 | |
169 def invA(self,m): | |
170 d = m[0]*m[3]-m[2]*m[1] | |
171 return [m[3]/d, -m[1]/d, -m[2]/d, m[0]/d, (m[1]*m[5]-m[4]*m[3])/d, (m[4]*m[2]-m[0]*m[5])/d] | |
172 | |
173 def mulA(self,a,b): | |
174 return [a[0]*b[0]+a[1]*b[2], | |
175 a[0]*b[1]+a[1]*b[3], | |
176 a[2]*b[0]+a[3]*b[2], | |
177 a[2]*b[1]+a[3]*b[3], | |
178 a[0]*b[4]+a[1]*b[5]+a[4], | |
179 a[2]*b[4]+a[3]*b[5]+a[5]] | |
180 | |
181 def decomposition(self,m): | |
182 """ | |
183 Decompose the affine matrix into production of translation,rotation,shear and scale. | |
184 The algorithm is documented at http://lists.w3.org/Archives/Public/www-style/2010Jun/0602.html | |
185 """ | |
186 if m[0]*m[3] == m[1]*m[2]: | |
187 print "The affine matrix is singular" | |
188 return [1,0,0,1,0,0] | |
189 A=m[0] | |
190 B=m[2] | |
191 C=m[1] | |
192 D=m[3] | |
193 E=m[4] | |
194 F=m[5] | |
195 sx = math.sqrt(A*A+B*B) | |
196 A = A/sx | |
197 B = B/sx | |
198 shear = m[0]*m[1]+m[2]*m[3] | |
199 C = C - A*shear | |
200 D = D - B*shear | |
201 sy = math.sqrt(C*C+D*D) | |
202 C = C/sy | |
203 D = D/sy | |
204 r = A*D-B*C | |
205 if r == -1: | |
206 shear = -shear | |
207 sy = -sy | |
208 R = math.atan2(B,A) | |
209 return [sx,sy, R, E,F] | |
210 | |
211 | |
1146
e14ec6d1a661
CHange the implementation to set the transformation matrix only. This is be more friendly for the animation inside the inskcape.
wycc
parents:
1141
diff
changeset
|
212 def updateTweenObject(self,obj,typ,s,d,p,newobj): |
1140 | 213 """ |
214 Generate tweened object in the @obj by using s and d in the @p percent | |
215 http://lists.w3.org/Archives/Public/www-style/2010Jun/0602.html | |
216 """ | |
1157
3a891dccabd8
Remove the locate tween. It is a special case for the scale tween
wycc
parents:
1156
diff
changeset
|
217 if typ == self.TWEEN_TYPE_SCALE: |
1146
e14ec6d1a661
CHange the implementation to set the transformation matrix only. This is be more friendly for the animation inside the inskcape.
wycc
parents:
1141
diff
changeset
|
218 self.updateTweenObjectScale(obj,s,d,p,newobj) |
1140 | 219 pass |
1151
71c72e8d6755
Refactory cod eof TweenObject.updateTweenContent and MBScene.setCurrentScene().
Thinker K.F. Li <thinker@codemud.net>
parents:
1150
diff
changeset
|
220 elif typ == self.TWEEN_TYPE_NORMAL: |
1170
e64b02951627
Fix the issue in the normal tween. We duplicate the object only when the object is not in the duplicated node yet.
wycc
parents:
1167
diff
changeset
|
221 if newobj == None: |
e64b02951627
Fix the issue in the normal tween. We duplicate the object only when the object is not in the duplicated node yet.
wycc
parents:
1167
diff
changeset
|
222 newobj = s.duplicate(self.document) |
e64b02951627
Fix the issue in the normal tween. We duplicate the object only when the object is not in the duplicated node yet.
wycc
parents:
1167
diff
changeset
|
223 newobj.setAttribute("ref", s.getAttribute("id")) |
e64b02951627
Fix the issue in the normal tween. We duplicate the object only when the object is not in the duplicated node yet.
wycc
parents:
1167
diff
changeset
|
224 obj.appendChild(newobj) |
1140 | 225 pass |
226 | |
1146
e14ec6d1a661
CHange the implementation to set the transformation matrix only. This is be more friendly for the animation inside the inskcape.
wycc
parents:
1141
diff
changeset
|
227 def updateTweenObjectScale(self,obj,s,d,p,newobj): |
1140 | 228 """ |
229 Generate a new group which contains the original group and then | |
230 add the transform matrix to generate a tween frame between the | |
231 origin and destination scene group. | |
232 | |
233 We will parse the transform matrix of the @s and @d and then | |
234 generate the matrix which is (1-p) of @s and p percent of @d. | |
235 """ | |
1146
e14ec6d1a661
CHange the implementation to set the transformation matrix only. This is be more friendly for the animation inside the inskcape.
wycc
parents:
1141
diff
changeset
|
236 if newobj == None: |
e14ec6d1a661
CHange the implementation to set the transformation matrix only. This is be more friendly for the animation inside the inskcape.
wycc
parents:
1141
diff
changeset
|
237 newobj = s.duplicate(self.document) |
e14ec6d1a661
CHange the implementation to set the transformation matrix only. This is be more friendly for the animation inside the inskcape.
wycc
parents:
1141
diff
changeset
|
238 top = self.document.createElement("svg:g") |
e14ec6d1a661
CHange the implementation to set the transformation matrix only. This is be more friendly for the animation inside the inskcape.
wycc
parents:
1141
diff
changeset
|
239 top.setAttribute("ref",s.getAttribute("id")) |
e14ec6d1a661
CHange the implementation to set the transformation matrix only. This is be more friendly for the animation inside the inskcape.
wycc
parents:
1141
diff
changeset
|
240 top.appendChild(newobj) |
e14ec6d1a661
CHange the implementation to set the transformation matrix only. This is be more friendly for the animation inside the inskcape.
wycc
parents:
1141
diff
changeset
|
241 obj.appendChild(top) |
e14ec6d1a661
CHange the implementation to set the transformation matrix only. This is be more friendly for the animation inside the inskcape.
wycc
parents:
1141
diff
changeset
|
242 else: |
e14ec6d1a661
CHange the implementation to set the transformation matrix only. This is be more friendly for the animation inside the inskcape.
wycc
parents:
1141
diff
changeset
|
243 top = newobj |
e14ec6d1a661
CHange the implementation to set the transformation matrix only. This is be more friendly for the animation inside the inskcape.
wycc
parents:
1141
diff
changeset
|
244 newobj = top.firstChild() |
1140 | 245 |
246 if s.name() == 'svg:g': | |
247 # Parse the translate or matrix | |
248 # | |
249 # D = B inv(A) | |
250 try: | |
1141 | 251 item = self.nodeToItem[s.getAttribute("id")] |
1140 | 252 (ox,oy) = item.getCenter() |
253 except: | |
254 ox = 0 | |
255 oy = 0 | |
256 try: | |
1141 | 257 item = self.nodeToItem[d.getAttribute("id")] |
1140 | 258 (dx,dy) = item.getCenter() |
259 except: | |
260 dx = 0 | |
261 dy = 0 | |
1225
a05c8deb6523
Add opacity support to implement fadein/fadeout effect
wycc
parents:
1199
diff
changeset
|
262 try: |
a05c8deb6523
Add opacity support to implement fadein/fadeout effect
wycc
parents:
1199
diff
changeset
|
263 start_opacity = parse_opacity(s) |
a05c8deb6523
Add opacity support to implement fadein/fadeout effect
wycc
parents:
1199
diff
changeset
|
264 except: |
a05c8deb6523
Add opacity support to implement fadein/fadeout effect
wycc
parents:
1199
diff
changeset
|
265 start_opacity = 1 |
a05c8deb6523
Add opacity support to implement fadein/fadeout effect
wycc
parents:
1199
diff
changeset
|
266 |
a05c8deb6523
Add opacity support to implement fadein/fadeout effect
wycc
parents:
1199
diff
changeset
|
267 try: |
a05c8deb6523
Add opacity support to implement fadein/fadeout effect
wycc
parents:
1199
diff
changeset
|
268 end_opacity =parse_opacity( d) |
a05c8deb6523
Add opacity support to implement fadein/fadeout effect
wycc
parents:
1199
diff
changeset
|
269 except: |
a05c8deb6523
Add opacity support to implement fadein/fadeout effect
wycc
parents:
1199
diff
changeset
|
270 end_opacity = 1 |
a05c8deb6523
Add opacity support to implement fadein/fadeout effect
wycc
parents:
1199
diff
changeset
|
271 |
1140 | 272 |
1225
a05c8deb6523
Add opacity support to implement fadein/fadeout effect
wycc
parents:
1199
diff
changeset
|
273 cur_opacity = start_opacity*(1-p)+end_opacity*p |
a05c8deb6523
Add opacity support to implement fadein/fadeout effect
wycc
parents:
1199
diff
changeset
|
274 change_opacity(newobj,cur_opacity) |
1140 | 275 sm = self.parseTransform(s) |
276 ss = self.decomposition(sm) | |
277 dm = self.parseTransform(d) | |
278 dd = self.decomposition(dm) | |
279 sx = (ss[0]*(1-p)+dd[0]*p)/ss[0] | |
280 sy = (ss[1]*(1-p)+dd[1]*p)/ss[0] | |
281 a = ss[2]*(1-p)+dd[2]*p-ss[2] | |
1146
e14ec6d1a661
CHange the implementation to set the transformation matrix only. This is be more friendly for the animation inside the inskcape.
wycc
parents:
1141
diff
changeset
|
282 tx = ox*(1-p)+dx*p |
e14ec6d1a661
CHange the implementation to set the transformation matrix only. This is be more friendly for the animation inside the inskcape.
wycc
parents:
1141
diff
changeset
|
283 ty = oy*(1-p)+dy*p |
1140 | 284 m = [math.cos(a),math.sin(a),-math.sin(a),math.cos(a),0,0] |
285 m = self.mulA([sx,0,0,sy,0,0],m) | |
286 m = self.mulA(m,[1,0,0,1,-ox,oy-self.height]) | |
287 m = self.mulA([1,0,0,1,tx,self.height-ty],m) | |
288 | |
289 top.setAttribute("transform","matrix(%g,%g,%g,%g,%g,%g)" % (m[0],m[2],m[1],m[3],m[4],m[5])) | |
290 else: | |
291 try: | |
1146
e14ec6d1a661
CHange the implementation to set the transformation matrix only. This is be more friendly for the animation inside the inskcape.
wycc
parents:
1141
diff
changeset
|
292 try: |
e14ec6d1a661
CHange the implementation to set the transformation matrix only. This is be more friendly for the animation inside the inskcape.
wycc
parents:
1141
diff
changeset
|
293 sw = float(s.getAttribute("width")) |
e14ec6d1a661
CHange the implementation to set the transformation matrix only. This is be more friendly for the animation inside the inskcape.
wycc
parents:
1141
diff
changeset
|
294 except: |
e14ec6d1a661
CHange the implementation to set the transformation matrix only. This is be more friendly for the animation inside the inskcape.
wycc
parents:
1141
diff
changeset
|
295 sw = 1 |
e14ec6d1a661
CHange the implementation to set the transformation matrix only. This is be more friendly for the animation inside the inskcape.
wycc
parents:
1141
diff
changeset
|
296 try: |
e14ec6d1a661
CHange the implementation to set the transformation matrix only. This is be more friendly for the animation inside the inskcape.
wycc
parents:
1141
diff
changeset
|
297 sh = float(s.getAttribute("height")) |
e14ec6d1a661
CHange the implementation to set the transformation matrix only. This is be more friendly for the animation inside the inskcape.
wycc
parents:
1141
diff
changeset
|
298 except: |
e14ec6d1a661
CHange the implementation to set the transformation matrix only. This is be more friendly for the animation inside the inskcape.
wycc
parents:
1141
diff
changeset
|
299 sh = 1 |
e14ec6d1a661
CHange the implementation to set the transformation matrix only. This is be more friendly for the animation inside the inskcape.
wycc
parents:
1141
diff
changeset
|
300 try: |
e14ec6d1a661
CHange the implementation to set the transformation matrix only. This is be more friendly for the animation inside the inskcape.
wycc
parents:
1141
diff
changeset
|
301 dw = float(d.getAttribute("width")) |
e14ec6d1a661
CHange the implementation to set the transformation matrix only. This is be more friendly for the animation inside the inskcape.
wycc
parents:
1141
diff
changeset
|
302 except: |
e14ec6d1a661
CHange the implementation to set the transformation matrix only. This is be more friendly for the animation inside the inskcape.
wycc
parents:
1141
diff
changeset
|
303 dw = 1 |
e14ec6d1a661
CHange the implementation to set the transformation matrix only. This is be more friendly for the animation inside the inskcape.
wycc
parents:
1141
diff
changeset
|
304 try: |
e14ec6d1a661
CHange the implementation to set the transformation matrix only. This is be more friendly for the animation inside the inskcape.
wycc
parents:
1141
diff
changeset
|
305 dh = float(d.getAttribute("height")) |
e14ec6d1a661
CHange the implementation to set the transformation matrix only. This is be more friendly for the animation inside the inskcape.
wycc
parents:
1141
diff
changeset
|
306 except: |
e14ec6d1a661
CHange the implementation to set the transformation matrix only. This is be more friendly for the animation inside the inskcape.
wycc
parents:
1141
diff
changeset
|
307 dh = 1 |
1225
a05c8deb6523
Add opacity support to implement fadein/fadeout effect
wycc
parents:
1199
diff
changeset
|
308 try: |
a05c8deb6523
Add opacity support to implement fadein/fadeout effect
wycc
parents:
1199
diff
changeset
|
309 start_opacity = parse_opacity(s) |
a05c8deb6523
Add opacity support to implement fadein/fadeout effect
wycc
parents:
1199
diff
changeset
|
310 except: |
a05c8deb6523
Add opacity support to implement fadein/fadeout effect
wycc
parents:
1199
diff
changeset
|
311 start_opacity = 1 |
a05c8deb6523
Add opacity support to implement fadein/fadeout effect
wycc
parents:
1199
diff
changeset
|
312 |
a05c8deb6523
Add opacity support to implement fadein/fadeout effect
wycc
parents:
1199
diff
changeset
|
313 try: |
a05c8deb6523
Add opacity support to implement fadein/fadeout effect
wycc
parents:
1199
diff
changeset
|
314 end_opacity =parse_opacity( d) |
a05c8deb6523
Add opacity support to implement fadein/fadeout effect
wycc
parents:
1199
diff
changeset
|
315 except: |
a05c8deb6523
Add opacity support to implement fadein/fadeout effect
wycc
parents:
1199
diff
changeset
|
316 end_opacity = 1 |
a05c8deb6523
Add opacity support to implement fadein/fadeout effect
wycc
parents:
1199
diff
changeset
|
317 cur_opacity = start_opacity*(1-p)+end_opacity*p |
a05c8deb6523
Add opacity support to implement fadein/fadeout effect
wycc
parents:
1199
diff
changeset
|
318 change_opacity(newobj,cur_opacity) |
a05c8deb6523
Add opacity support to implement fadein/fadeout effect
wycc
parents:
1199
diff
changeset
|
319 |
1140 | 320 try: |
1141 | 321 item = self.nodeToItem[s.getAttribute("id")] |
1140 | 322 (ox,oy) = item.getCenter() |
323 except: | |
324 ox = 0 | |
325 oy = 0 | |
326 try: | |
1141 | 327 item = self.nodeToItem[d.getAttribute("id")] |
1140 | 328 (dx,dy) = item.getCenter() |
329 except: | |
330 dx = 0 | |
331 dy = 0 | |
332 try: | |
333 sm = self.parseTransform(s) | |
334 ss = self.decomposition(sm) | |
335 except: | |
336 ss = [1,1,0,0,0] | |
337 pass | |
338 try: | |
339 dm = self.parseTransform(d) | |
340 dd = self.decomposition(dm) | |
341 except: | |
342 dd = [1,1,0,0,0] | |
1146
e14ec6d1a661
CHange the implementation to set the transformation matrix only. This is be more friendly for the animation inside the inskcape.
wycc
parents:
1141
diff
changeset
|
343 dd[0] = dd[0]*dw/sw |
e14ec6d1a661
CHange the implementation to set the transformation matrix only. This is be more friendly for the animation inside the inskcape.
wycc
parents:
1141
diff
changeset
|
344 dd[1] = dd[1]*dh/sh |
1140 | 345 sx = (ss[0]*(1-p)+dd[0]*p)/ss[0] |
346 sy = (ss[1]*(1-p)+dd[1]*p)/ss[1] | |
347 a = ss[2]*(1-p)+dd[2]*p-ss[2] | |
348 tx = ox*(1-p)+dx*p | |
349 ty = oy*(1-p)+dy*p | |
350 m = [math.cos(a),math.sin(a),-math.sin(a),math.cos(a),0,0] | |
351 m = self.mulA([sx,0,0,sy,0,0],m) | |
352 m = self.mulA(m,[1,0,0,1,-ox,oy-self.height]) | |
353 m = self.mulA([1,0,0,1,tx,self.height-ty],m) | |
354 | |
355 top.setAttribute("transform","matrix(%g,%g,%g,%g,%g,%g)" % (m[0],m[2],m[1],m[3],m[4],m[5])) | |
356 except: | |
357 traceback.print_exc() |