예제 #1
0
 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()
예제 #2
0
 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()
예제 #3
0
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) )
예제 #4
0
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))