def __init__(self,
              card: Card,
              aspect_ratio: float = 24 / 37,
              path: Optional[str] = None,
              **kwargs):
     """
 Instantiates a new CardWidget.
 :param card: The card value to associate to this widget.
 :param aspect_ratio: The aspect ratio that will be enforced.
 :param path: The path to the folder containing the card images.
 :param kwargs: Parameters to be forwarded to the base class' constructor.
 """
     super().__init__(**kwargs)
     self._card = card
     self._path = path or GameOptions().cards_path
     self._visible = True
     self._grayed_out = False
     self._touch_down_pos: Optional[Tuple[int, int]] = None
     self._shadow_image = _get_drop_shadow_filename(self._path)
     self._shadow_enabled = _SHADOW_STRENGTH
     self.auto_bring_to_front = True
     image = Image(source=_get_card_filename(card, self._path))
     image.keep_ratio = False
     image.allow_stretch = True
     self.fbind("size", image.setter("size"))
     self.add_widget(image)
     self._ratio = aspect_ratio
     self.width = self.height * self._ratio
     self.size_hint = None, None
     self.register_event_type("on_double_tap")
     self.register_event_type("on_card_moved")
     self._check_aspect_ratio = True
     # noinspection PyUnreachableCode
     if __debug__:
         self.fbind("size", self._assert_aspect_ratio)
class AnimationController(Widget):
    mStartingAnimation = StringProperty("")
    _CurrentImage = ObjectProperty(None)
    
    def __init__(self, **kwargs):
        super(AnimationController, self).__init__(**kwargs)
        self.mAnimations = {}
        self._CurrentAnimation = None
        
    def add_widget(self, widget):
        super(AnimationController, self).add_widget(widget)
        
    def InitializeAnimation(self, inAnimationWidget):
        animationID = inAnimationWidget.mID
        print (animationID)
        assert not animationID in self.mAnimations
        if (not animationID in self.mAnimations):
            print ("Initializing Animation %s" % animationID)
            inAnimationWidget.Initialize()
            self.mAnimations[animationID] = inAnimationWidget
    
    def PlayAnimationByName(self, inAnimationName):
        assert inAnimationName in self.mAnimations, "No animation named " + inAnimationName
        if (inAnimationName in self.mAnimations):
            if (self._CurrentAnimation != None):
                self._CurrentAnimation.Stop()
            
            self._CurrentAnimation = self.mAnimations[inAnimationName]
            print ("New Animation: ", self._CurrentAnimation)
            
            self._CurrentAnimation.Start()
            self._CurrentImage.texture = self._CurrentAnimation.mCurrentTextureArea
            print ("Current image: ", self._CurrentImage)

    def Initialize(self, inOwner):
        for currentChild in self.children:
            if isinstance(currentChild, AnimationGraphic):
                print ("Scheduling animaton add")
                self.InitializeAnimation(currentChild)
        
        self._CurrentImage = Image(pos=inOwner.pos)
        self.bind(pos=self._CurrentImage.setter('pos'))
        self.add_widget(self._CurrentImage)
        
        self.PlayAnimationByName(self.mStartingAnimation)

    def Update(self, dt):
        if (self._CurrentAnimation != None):
            self._CurrentAnimation.Update(dt)
            
            self._CurrentImage.texture = self._CurrentAnimation.mCurrentTextureArea
예제 #3
0
class Layout3D(FloatLayout):
    canvas3d = ObjectProperty(None, allownone=True)
    '''canvas3d
    '''

    post_processing = BooleanProperty(False)
    '''post_processing
    '''

    shadow = BooleanProperty(True)
    '''shadow
    '''

    _nodes = ListProperty([])
    '''_nodes
    '''

    _init_request = [False, False]
    '''_init_request
    '''

    look_at = ListProperty([0, 0, 10, 0, 0, 0, 0, 1, 0])
    '''_look_at
    '''

    ambient_light = ListProperty([0, 0, 0, 0])
    '''ambient_light
    '''

    light_intensity = NumericProperty(0.0)
    '''ambient_light
    '''

    light_position = ListProperty([-24.5, 120, 95])
    '''light_position
    '''

    light_orientation = ListProperty([0.01, 0.01, 0.01])
    '''light_position
    '''
    light_0 = ListProperty([0.01, 0.01, 0.01])
    '''light_0
    '''

    light_1 = ListProperty([0.01, 0.01, 0.01])
    '''light_1
    '''

    _id_stack = ListProperty([])

    shadow_offset = NumericProperty(0)

    shadow_origin = ListProperty([0, 0, 0])

    shadow_target = ListProperty([0, -90, -100])

    shadow_threshold = NumericProperty(1.0)

    canvas_size = ListProperty(Window.size)

    picking_scale = NumericProperty(1.0)

    render_texture = ObjectProperty(None, allownone=True)
    '''render_texture
    '''

    effect_widget = ObjectProperty(None, allownone=True)
    '''effect_widget
    '''
    def __init__(self, **kwargs):

        self.canvas_size = kwargs.get("canvas_size", Window.size)
        super(Layout3D, self).__init__(**kwargs)
        self._trigger_layout = Clock.create_trigger(self.do_layout, -1)
        effectwidget.C_SIZE = self.canvas_size

        with self.canvas.before:
            Color(1.0, 1.0, 1.0, 1.0)
            ClearColor(1.0, 1.0, 1.0, 1.0)

        self.create_canvas()
        self.bind(look_at=self.canvas3d.setter('look_at'))
        self.bind(shadow_offset=self.canvas3d.setter('_shadow_offset'))
        self.bind(shadow_threshold=self.canvas3d.setter('shadow_threshold'))
        self.bind(shadow_origin=self.canvas3d.setter('_shadow_pos'))
        self.bind(shadow_target=self.canvas3d.setter('_shadow_target'))
        self.bind(picking_scale=self.canvas3d.setter('picking_scale'))
        self.bind(canvas_size=self.canvas3d.setter('canvas_size'))
        self.bind(ambient_light=self.canvas3d.setter('ambient_light'))
        self.bind(light_intensity=self.canvas3d.setter('light_intensity'))
        self.bind(light_position=self.canvas3d.setter('light_position'))
        self.bind(light_orientation=self.canvas3d.setter('light_orientation'))
        self.bind(light_0=self.canvas3d.setter('light_0'))
        self.bind(light_1=self.canvas3d.setter('light_1'))

        #self.effect_widget = BlurEffectWidget(mask_effect=self.canvas3d.picking_fbo,
        #                                      motion_effect=self.canvas3d.motion_blur_fbo,
        #                                      fbo_canvas=self.canvas3d.canvas)

        self.render_texture = Image(size_hint=(1.0, 1.0),
                                    allow_stretch=True,
                                    keep_ratio=False)
        self.add_widget(self.render_texture, 100000)
        self.render_texture.texture = self.canvas3d.canvas.texture
        self.render_texture.texture.mag_filter = 'linear'
        self.render_texture.texture.min_filter = 'linear'

        if self._init_request[0]:
            self.post_processing = not self._init_request[1]
            self.post_processing = self._init_request[1]
        self._init_request[0] = True
        from kivy3dgui.canvas3d import label, label_debug
        label.parent = None
        try:
            self.add_widget(label)
            self.add_widget(label_debug)
        except Exception as w:
            pass

        self.bind(pos=self.render_texture.setter('pos'))
        self.bind(size=self.render_texture.setter('size'))

    def on_canvas_size(self, widget, value):
        effectwidget.C_SIZE = value
        canvas3d.PICKING_BUFFER_SIZE = value

    def walk(self, value, time):
        self.canvas3d.walk(value, time)

    def strafe(self, value, time):
        self.canvas3d.strafe(value, time)

    def up(self, value, time):
        self.canvas3d.up(value, time)

    def create_canvas(self, *args):
        if self.canvas3d is None:
            self.canvas3d = Canvas3D(shadow=True,
                                     picking=True,
                                     size_hint=(1, 1),
                                     canvas_size=self.canvas_size,
                                     id="CANVAS3D")
            self.add_widget(self.canvas3d)
            self.canvas3d.size = self.size
            self.canvas3d.size_hint = self.size_hint

    def _add_node(self, *args):
        self.canvas3d.add_node(args[0])
        pass

    def on_post_processing(self, widget, value):
        if not self._init_request[0]:
            self._init_request[0] = True
            self._init_request[1] = value
            return

        for children in self.children[:]:
            if isinstance(children, Canvas3D) or isinstance(
                    children, BlurEffectWidget):
                self.remove_widget(children)

        #for children in self.effect_widget.children[:]:
        #    self.effect_widget.remove_widget(children)
        if value:
            self.effect_widget = EffectWidget()
            self.effect_widget.add_widget(self.canvas3d)
            self.effect_widget.effects = [FXAAEffect()]
            self.effect_widget.size = (1366, 768)

            effect = Image(size_hint=(1.0, 1.0),
                           allow_stretch=True,
                           keep_ratio=False)
            effect.texture = self.canvas3d.canvas.texture
            self.effect_widget.add_widget(effect)
            self.add_widget(self.effect_widget, 100000)
            self.remove_widget(self.render_texture)

            effect.texture.mag_filter = 'linear'
            effect.texture.min_filter = 'linear'

            self.effect_widget.texture.mag_filter = 'linear'
            self.effect_widget.texture.min_filter = 'linear'

            # self.effect_widget.add_widget(self.canvas3d)
            # self.effect_widget.effect_mask = self.canvas3d.picking_fbo
            # self.add_widget(self.effect_widget)

        else:
            if self.effect_widget:
                if self.canvas3d in self.effect_widget.children:
                    self.effect_widget.remove_widget(self.canvas3d)
                self.remove_widget(self.effect_widget)

            self.add_widget(self.canvas3d, 100000)
            self.add_widget(self.render_texture, 100000)

    def add_widget(self, *largs):
        widget = largs[0]

        if isinstance(widget, Node):

            # print(widget.fbo_widget)
            inc = True
            c_id = self.canvas3d.current_id
            if self._id_stack:
                top = self._id_stack[-1]
                c_id = top
                self._id_stack.remove(top)
                inc = False
            float_str = str(c_id)[0:4]
            self.canvas3d.fbo_list[float_str] = widget.fbo_widget
            widget.pick_id = c_id

            if widget._start_objs:
                if widget._objs != []:
                    widget._start_objs = False
                self._add_node(widget)
            else:
                widget.parent = self.canvas3d
                try:
                    self._nodes.append(widget.__self__)
                    pass
                except:
                    self._nodes.append(widget)
                    pass

            self.canvas3d.add_widget(widget.fbo_widget)
            """Check the increment"""
            if inc:
                self.canvas3d.current_id += 0.01
                self.canvas3d.current_id = round(self.canvas3d.current_id, 2)
            return None
        else:
            ret = super(Layout3D, self).add_widget(*largs)
            return ret

    def get_nodes(self):
        return self.canvas3d.nodes

    def remove_widget(self, widget):
        if isinstance(widget, Node):
            if widget in self._nodes:
                self._nodes.remove(widget)
            float_str = str(widget.pick_id)[0:4]
            if float_str in self.canvas3d.fbo_list:
                # self.canvas3d.fbo_list.remove(float_str)
                self.canvas3d.fbo_list.pop(float_str)

            id = widget.pick_id
            self._id_stack.append(id)
            self.canvas3d._remove_node(widget)
        else:
            super(Layout3D, self).remove_widget(widget)

    def on_touch_down(self, *args):
        self.canvas3d.last_widget_str = "NONE"
        return super(Layout3D, self).on_touch_down(*args)

    def on_touch_up(self, touch):
        ret = False
        for e in self.children:
            if not isinstance(e, Image):
                if e.collide_point(touch.x, touch.y):
                    ret = e.on_touch_up(touch)
                    break
        return ret
예제 #4
0
class CivMapScreen(BoxLayout):
    def __init__(self, **kwargs):
        super(CivMapScreen, self).__init__(**kwargs)
        self.pos = (0, 0)
        self.nations = []
        self.ms = MapScatter(pos_hint={'x': 0, 'y': 0})
        self.add_widget(self.ms)
        self.im = Image(source='civ_board.png',
                        allow_stretch=True,
                        keep_ratio=False,
                        opacity=1.0)
        self.ms.add_widget(self.im)
        self.fl = FloatLayout(size=self.im.size, pos_hint={'x': 0, 'y': 0})
        self.ms.bind(size=self.fl.setter('size'))
        self.im.add_widget(self.fl)
        self.bind(size=self.im.setter('size'))

        self.sm = ScreenManager(pos_hint={
            'x': 1660 / 4058.0,
            'y': 3 / 2910.0
        },
                                size_hint=((3367 - 1660) / 4058.0,
                                           (2907 - 2105) / 2910.0))
        self.fl.add_widget(self.sm)

        self.st = StockPanel(pos_hint={'x': 0, 'y': 0}, size_hint=(1, 1))
        self.st.ccc_btn.bind(on_press=self.change_screen)
        self.sm.bind(size=self.st.lab.setter('size'))
        screen = Screen(name="Stock and Treasury",
                        pos_hint={
                            'x': 0,
                            'y': 0
                        },
                        size_hint=(1, 1))
        screen.add_widget(self.st)
        self.sm.add_widget(screen)

        self.ccc = CivCardCreditsPanel(pos_hint={
            'x': 0,
            'y': 0
        },
                                       size_hint=(1, 1))
        self.ccc.st_btn.bind(on_press=self.change_screen)
        screen = Screen(name='Civ Card Credits',
                        pos_hint={
                            'x': 0,
                            'y': 0
                        },
                        size_hint=(1, 1))
        screen.add_widget(self.ccc)
        self.sm.add_widget(screen)

    def change_screen(self, instance, *args):
        if instance == self.st.ccc_btn:
            self.sm.current = 'Civ Card Credits'
        elif instance == self.ccc.st_btn:
            self.sm.current = 'Stock and Treasury'
        for obj in [self, self.sm, self.st, self.st.lab]:
            print(obj, obj.pos, obj.pos_hint, obj.size, obj.size_hint)

    def add_spotter(self, spotter):
        print(f'Adding {spotter} to {self.fl}')
        self.fl.add_widget(spotter)