class Layout3D(FloatLayout): canvas3d = None '''canvas3d ''' post_processing = BooleanProperty(False) '''post_processing ''' shadow = BooleanProperty(True) '''shadow ''' _nodes = [] '''_nodes ''' _init_request = [False, False] '''_init_request ''' canvas_size = ListProperty(Window.size) def __init__(self, **kwargs): self.canvas_size = kwargs.get("canvas_size", Window.size) super(Layout3D, self).__init__(**kwargs) 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.effect_widget = BlurEffectWidget(mask_effect=self.canvas3d.picking_fbo, motion_effect=self.canvas3d.motion_blur_fbo) 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 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) 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]) 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.add_widget(self.canvas3d) self.effect_widget.effect_mask = self.canvas3d.picking_fbo self.add_widget(self.effect_widget, 100000) else: self.add_widget(self.canvas3d, 100000) def add_widget(self, *largs): widget = largs[0] if isinstance(widget, Node): print(widget.fbo_widget) float_str = str(self.canvas3d.current_id)[0:4] self.canvas3d.fbo_list[float_str] = widget.fbo_widget widget.pick_id = self.canvas3d.current_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__) except: self._nodes.append(widget) self.canvas3d.add_widget(widget.fbo_widget) self.canvas3d.current_id += 0.02 self.canvas3d.current_id = round(self.canvas3d.current_id, 2) else: ret = super(Layout3D, self).add_widget(*largs) return ret
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 ''' _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) 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.effect_widget = BlurEffectWidget( mask_effect=self.canvas3d.picking_fbo, motion_effect=self.canvas3d.motion_blur_fbo) 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.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.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.add_widget(self.canvas3d) self.effect_widget.effect_mask = self.canvas3d.picking_fbo self.add_widget(self.effect_widget, 100000) else: self.add_widget(self.canvas3d, 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 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_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