def __init__(self, skeleton, savefile_name, skin=False): super(BoneUILayer, self).__init__() self.user_skin = skin self.count = 0 self.savefile_name = savefile_name try: self.animation = cPickle.load(open(savefile_name)) except IOError: self.animation = Animation(skeleton) self.timeline = ui.TimeLine(self.animation) self.add(self.timeline) self.tick_delta = 1.0 / 16 self.skeleton = skeleton self.editable_skeleton = None self.animating = False self.animation.move_start() self.update_visual()
def __init__(self, skeleton, savefile_name, skin=False): super(BoneUILayer, self).__init__() self.user_skin = skin self.count = 0 self.savefile_name = savefile_name try: self.animation = cPickle.load( open(savefile_name) ) except IOError: self.animation = Animation(skeleton) self.timeline = ui.TimeLine(self.animation) self.add(self.timeline) self.tick_delta = 1.0/16 self.skeleton = skeleton self.editable_skeleton = None self.animating = False self.animation.move_start() self.update_visual()
class BoneUILayer(ui.UILayer): def __init__(self, skeleton, savefile_name, skin=False): super(BoneUILayer, self).__init__() self.user_skin = skin self.count = 0 self.savefile_name = savefile_name try: self.animation = cPickle.load( open(savefile_name) ) except IOError: self.animation = Animation(skeleton) self.timeline = ui.TimeLine(self.animation) self.add(self.timeline) self.tick_delta = 1.0/16 self.skeleton = skeleton self.editable_skeleton = None self.animating = False self.animation.move_start() self.update_visual() def save(self): cPickle.dump(self.animation, open(self.savefile_name,"w") ) def start_animation(self): self.clean_skins() self.animating = True self.clean_control_points() if self.user_skin: skin = BitmapSkin(self.skeleton, self.user_skin) else: skin = ColorSkin( self.skeleton, (255,255,255,255)) self.add( skin ) xs, ys = director.get_window_size() skin.position = xs/2-6, ys/2-11 self.animation.move_start() skin.do( Animate(self.animation) + CallFunc(lambda: self.remove(skin)) + CallFunc(self.stop_animation) ) skin.do( UpdateTimeline(self.animation.get_duration()), target=self.animation) def stop_animation(self): self.animating = False self.update_visual() def add_skin_for_skeleton(self, skeleton, color, z=-1, editable=False): if self.user_skin: skin = BitmapSkin(skeleton, self.user_skin, alpha=color[3]) else: skin = ColorSkin(skeleton, color) self.skin = skin self.add( skin, z=z ) xs, ys = director.get_window_size() skin.position = xs/2-6, ys/2-11 if editable: self.editable_skeleton = skeleton self.editable_skin = skin self.generate_control_points() def on_key_press(self, k, mods): if not self.animating: if k == key.S: self.save() self.count += 1 elif k == key.LEFT: self.animation.move_position( -self.tick_delta ) elif k == key.RIGHT: self.animation.move_position( self.tick_delta ) elif k in (key.PLUS, key.NUM_ADD): self.animation.insert_keyframe() elif k in (key.MINUS, key.NUM_SUBTRACT): self.animation.remove_keyframe() elif k == key.PAGEDOWN: self.animation.next_keyframe() elif k == key.PAGEUP: self.animation.prev_keyframe() elif k == key.INSERT: self.animation.insert_time( self.tick_delta ) elif k == key.DELETE: self.animation.delete_time( self.tick_delta ) elif k == key.HOME: self.animation.move_start() elif k == key.END: self.animation.move_end() self.update_visual() if k == key.SPACE: self.start_animation() else: # what to do when animating pass def update_visual(self): self.editable_skeleton = None self.clean_control_points() self.clean_skins() _, curr = self.animation.get_keyframe() _, prev = self.animation.get_keyframe(-1) _, prev2 = self.animation.get_keyframe(-2) _, next = self.animation.get_keyframe(1) if curr: self.add_skin_for_skeleton(curr, (255,255,255,255), -1, True) if prev: self.add_skin_for_skeleton(prev, (255,255,255,32), -2) if prev2: self.add_skin_for_skeleton(prev2, (255,255,255,16), -3) if next: self.add_skin_for_skeleton(next, (0,0,255,32), -2) def clean_control_points(self): cps = [ cp for cp in self.get_children() if isinstance(cp, ui.BallWidget) ] for cp in cps: self.remove(cp) def clean_skins(self): skins = [ cp for cp in self.get_children() if isinstance(cp, Skin) ] for skin in skins: self.remove(skin) def on_mouse_release(self, *args): if self.dragging: self.clean_control_points() self.generate_control_points() super(BoneUILayer, self).on_mouse_release(*args) def on_mouse_drag(self, x, y, dx, dy, button, modifiers): if self.hovering: cps = [ cp for cp in self.get_children() if isinstance(cp, ui.BallWidget) and cp != self.hovering ] for cp in cps: self.remove(cp) super(BoneUILayer, self).on_mouse_drag(x, y, dx, dy, button, modifiers) def generate_control_points(self): if self.editable_skeleton: skinpos = euclid.Point2(*self.editable_skin.position) for cp in self.editable_skeleton.get_control_points(): if isinstance(cp, Skeleton): self.add( SkeletonControl(cp, skinpos) ) else: self.add( BoneControl(cp, skinpos) )
class BoneUILayer(ui.UILayer): def __init__(self, skeleton, savefile_name, skin=False): super(BoneUILayer, self).__init__() self.user_skin = skin self.count = 0 self.savefile_name = savefile_name try: self.animation = cPickle.load(open(savefile_name)) except IOError: self.animation = Animation(skeleton) self.timeline = ui.TimeLine(self.animation) self.add(self.timeline) self.tick_delta = 1.0 / 16 self.skeleton = skeleton self.editable_skeleton = None self.animating = False self.animation.move_start() self.update_visual() def save(self): cPickle.dump(self.animation, open(self.savefile_name, "w")) def start_animation(self): self.clean_skins() self.animating = True self.clean_control_points() if self.user_skin: skin = BitmapSkin(self.skeleton, self.user_skin) else: skin = ColorSkin(self.skeleton, (255, 255, 255, 255)) self.add(skin) xs, ys = director.get_window_size() skin.position = xs / 2 - 6, ys / 2 - 11 self.animation.move_start() skin.do( Animate(self.animation) + CallFunc(lambda: self.remove(skin)) + CallFunc(self.stop_animation)) skin.do(UpdateTimeline(self.animation.get_duration()), target=self.animation) def stop_animation(self): self.animating = False self.update_visual() def add_skin_for_skeleton(self, skeleton, color, z=-1, editable=False): if self.user_skin: skin = BitmapSkin(skeleton, self.user_skin, alpha=color[3]) else: skin = ColorSkin(skeleton, color) self.skin = skin self.add(skin, z=z) xs, ys = director.get_window_size() skin.position = xs / 2 - 6, ys / 2 - 11 if editable: self.editable_skeleton = skeleton self.editable_skin = skin self.generate_control_points() def on_key_press(self, k, mods): if not self.animating: if k == key.S: self.save() self.count += 1 elif k == key.LEFT: self.animation.move_position(-self.tick_delta) elif k == key.RIGHT: self.animation.move_position(self.tick_delta) elif k in (key.PLUS, key.NUM_ADD): self.animation.insert_keyframe() elif k in (key.MINUS, key.NUM_SUBTRACT): self.animation.remove_keyframe() elif k == key.PAGEDOWN: self.animation.next_keyframe() elif k == key.PAGEUP: self.animation.prev_keyframe() elif k == key.INSERT: self.animation.insert_time(self.tick_delta) elif k == key.DELETE: self.animation.delete_time(self.tick_delta) elif k == key.HOME: self.animation.move_start() elif k == key.END: self.animation.move_end() self.update_visual() if k == key.SPACE: self.start_animation() else: # what to do when animating pass def update_visual(self): self.editable_skeleton = None self.clean_control_points() self.clean_skins() _, curr = self.animation.get_keyframe() _, prev = self.animation.get_keyframe(-1) _, prev2 = self.animation.get_keyframe(-2) _, next = self.animation.get_keyframe(1) if curr: self.add_skin_for_skeleton(curr, (255, 255, 255, 255), -1, True) if prev: self.add_skin_for_skeleton(prev, (255, 255, 255, 32), -2) if prev2: self.add_skin_for_skeleton(prev2, (255, 255, 255, 16), -3) if next: self.add_skin_for_skeleton(next, (0, 0, 255, 32), -2) def clean_control_points(self): cps = [ cp for cp in self.get_children() if isinstance(cp, ui.BallWidget) ] for cp in cps: self.remove(cp) def clean_skins(self): skins = [cp for cp in self.get_children() if isinstance(cp, Skin)] for skin in skins: self.remove(skin) def on_mouse_release(self, *args): if self.dragging: self.clean_control_points() self.generate_control_points() super(BoneUILayer, self).on_mouse_release(*args) def on_mouse_drag(self, x, y, dx, dy, button, modifiers): if self.hovering: cps = [ cp for cp in self.get_children() if isinstance(cp, ui.BallWidget) and cp != self.hovering ] for cp in cps: self.remove(cp) super(BoneUILayer, self).on_mouse_drag(x, y, dx, dy, button, modifiers) def generate_control_points(self): if self.editable_skeleton: skinpos = euclid.Point2(*self.editable_skin.position) for cp in self.editable_skeleton.get_control_points(): if isinstance(cp, Skeleton): self.add(SkeletonControl(cp, skinpos)) else: self.add(BoneControl(cp, skinpos))