Ejemplo n.º 1
0
 def initialize_gl(self):
     assert not self.gl_active
     vb = context.application.vis_backend
     self.gl_active = True
     self.bounding_box = BoundingBox()
     self.draw_list = vb.create_list(self)
     self.boundingbox_list = vb.create_list()
     self.total_list = vb.create_list()
     ##print "Created lists (%i, %i, %i): %s" % (self.draw_list, self.boundingbox_list, self.total_list, self.get_name())
     self.draw_list_valid = True
     self.boundingbox_list_valid = True
     self.total_list_valid = True
     self.invalidate_all_lists()
     if isinstance(self.parent, GLMixin):
         self.parent.invalidate_all_lists()
Ejemplo n.º 2
0
 def initialize_gl(self):
     assert not self.gl_active
     vb = context.application.vis_backend
     self.gl_active = True
     self.bounding_box = BoundingBox()
     self.draw_list = vb.create_list(self)
     self.boundingbox_list = vb.create_list()
     self.total_list = vb.create_list()
     ##print "Created lists (%i, %i, %i): %s" % (self.draw_list, self.boundingbox_list, self.total_list, self.get_name())
     self.draw_list_valid = True
     self.boundingbox_list_valid = True
     self.total_list_valid = True
     self.invalidate_all_lists()
     if isinstance(self.parent, GLMixin):
         self.parent.invalidate_all_lists()
Ejemplo n.º 3
0
class GLMixin(gobject.GObject):

    __metaclass__ = NodeClass
    double_sided = False

    #
    # State
    #

    def initnonstate(self):
        self.gl_active = False
        self.connect("on-selected", self.on_select_changed)
        self.connect("on-deselected", self.on_select_changed)

    #
    # Properties
    #

    def set_visible(self, visible, init=False):
        if init:
            self.visible = visible
        elif self.visible != visible:
            self.visible = visible
            self.invalidate_total_list()

    properties = [
        Property("visible", True, lambda self: self.visible, set_visible)
    ]

    #
    # Dialog fields (see action EditProperties)
    #

    dialog_fields = set([
        DialogFieldInfo(
            "Markup", (1, 2),
            fields.edit.CheckButton(
                label_text="Visible (also hides children)",
                attribute_name="visible",
            )),
        DialogFieldInfo(
            "Basic", (0, 3),
            fields.read.BBox(
                label_text="Bounding box",
                attribute_name="bounding_box",
            )),
    ])

    #
    # OpenGL
    #

    def initialize_gl(self):
        assert not self.gl_active
        vb = context.application.vis_backend
        self.gl_active = True
        self.bounding_box = BoundingBox()
        self.draw_list = vb.create_list(self)
        self.boundingbox_list = vb.create_list()
        self.total_list = vb.create_list()
        ##print "Created lists (%i, %i, %i): %s" % (self.draw_list, self.boundingbox_list, self.total_list, self.get_name())
        self.draw_list_valid = True
        self.boundingbox_list_valid = True
        self.total_list_valid = True
        self.invalidate_all_lists()
        if isinstance(self.parent, GLMixin):
            self.parent.invalidate_all_lists()

    def cleanup_gl(self):
        assert self.gl_active
        self.gl_active = False
        vb = context.application.vis_backend
        ##print "Deleting lists (%i, %i, %i): %s" % (self.draw_list, self.boundingbox_list, self.total_list, self.get_name())
        vb.delete_list(self.draw_list)
        vb.delete_list(self.boundingbox_list)
        vb.delete_list(self.total_list)
        del self.bounding_box
        del self.draw_list
        del self.boundingbox_list
        del self.total_list
        del self.draw_list_valid
        del self.boundingbox_list_valid
        del self.total_list_valid
        if isinstance(self.parent, GLMixin):
            self.parent.invalidate_all_lists()

    #
    # Invalidation
    #

    def invalidate_draw_list(self):
        if self.gl_active and self.draw_list_valid:
            self.draw_list_valid = False
            context.application.main.drawing_area.queue_draw()
            context.application.scene.add_revalidation(
                self.revalidate_draw_list)
            self.emit("on-draw-list-invalidated")
            ##print "EMIT %s: on-draw-list-invalidated" % self.get_name()
            if isinstance(self.parent, GLMixin):
                self.parent.invalidate_boundingbox_list()

    def invalidate_boundingbox_list(self):
        ##print "TRY: %s: on-boundingbox-list-invalidated"  % self.get_name()
        if self.gl_active and self.boundingbox_list_valid:
            self.boundingbox_list_valid = False
            context.application.main.drawing_area.queue_draw()
            context.application.scene.add_revalidation(
                self.revalidate_boundingbox_list)
            self.emit("on-boundingbox-list-invalidated")
            ##print "EMIT %s: on-boundingbox-list-invalidated"  % self.get_name()
            if isinstance(self.parent, GLMixin):
                self.parent.invalidate_boundingbox_list()

    def invalidate_total_list(self):
        if self.gl_active and self.total_list_valid:
            self.total_list_valid = False
            context.application.main.drawing_area.queue_draw()
            context.application.scene.add_revalidation(
                self.revalidate_total_list)
            self.emit("on-total-list-invalidated")
            ##print "EMIT %s: on-total-list-invalidated" % self.get_name()
            if isinstance(self.parent, GLMixin):
                self.parent.invalidate_boundingbox_list()

    def invalidate_all_lists(self):
        self.invalidate_total_list()
        self.invalidate_boundingbox_list()
        self.invalidate_draw_list()

    #
    # Revalidation
    #

    def revalidate_draw_list(self):
        if self.gl_active:
            vb = context.application.vis_backend
            ##print "Compiling draw list (%i): %s" % (self.draw_list, self.get_name())
            vb.begin_list(self.draw_list)
            self.prepare_draw()
            self.draw()
            self.finish_draw()
            vb.end_list()
            self.draw_list_valid = True

    def revalidate_boundingbox_list(self):
        if self.gl_active:
            vb = context.application.vis_backend
            ##print "Compiling selection list (%i): %s" % (self.boundingbox_list, self.get_name())
            vb.begin_list(self.boundingbox_list)
            self.revalidate_bounding_box()
            self.bounding_box.draw()
            vb.end_list()
            self.boundingbox_list_valid = True

    def revalidate_bounding_box(self):
        self.bounding_box.clear()

    def revalidate_total_list(self):
        if self.gl_active:
            vb = context.application.vis_backend
            ##print "Compiling total list (%i): %s" % (self.total_list, self.get_name())
            vb.begin_list(self.total_list)
            if self.visible:
                vb.push_name(self.draw_list)
                self.draw_selection()
                vb.call_list(self.draw_list)
                vb.pop_name()
            vb.end_list()
            self.total_list_valid = True

    #
    # Draw
    #

    def draw_selection(self):
        vb = context.application.vis_backend
        if self.selected:
            vb.set_bright(True)
        else:
            vb.set_bright(False)

    def call_list(self):
        ##print "Executing total list (%i): %s" % (self.total_list, self.get_name())
        context.application.vis_backend.call_list(self.total_list)

    def prepare_draw(self):
        pass

    def draw(self):
        pass

    def finish_draw(self):
        pass

    #
    # Frame
    #

    def get_bounding_box_in_parent_frame(self):
        return self.bounding_box

    def get_absolute_frame(self):
        return self.get_absolute_parentframe()

    def get_absolute_parentframe(self):
        if not isinstance(self.parent, GLMixin):
            return Complete.identity()
        else:
            return self.parent.get_absolute_frame()

    def get_frame_up_to(self, upper_parent):
        if (upper_parent == self) or (self.parent == upper_parent):
            return Complete.identity()
        else:
            return self.get_parentframe_up_to(upper_parent)

    def get_parentframe_up_to(self, upper_parent):
        if not isinstance(self.parent, GLMixin):
            assert upper_parent is None, "upper_parent must be (an indirect) parent of self."
            return Complete.identity()
        elif self.parent == upper_parent:
            return Complete.identity()
        else:
            return self.parent.get_frame_up_to(upper_parent)

    def get_frame_relative_to(self, other):
        common = common_parent([self, other])
        return other.get_frame_up_to(common).inv * self.get_frame_up_to(common)

    #
    # Signal handlers
    #

    def on_select_changed(self, foo):
        self.invalidate_total_list()
Ejemplo n.º 4
0
class GLMixin(gobject.GObject):

    __metaclass__ = NodeClass
    double_sided = False

    #
    # State
    #

    def initnonstate(self):
        self.gl_active = False
        self.connect("on-selected", self.on_select_changed)
        self.connect("on-deselected", self.on_select_changed)

    #
    # Properties
    #

    def set_visible(self, visible, init=False):
        if init:
            self.visible = visible
        elif self.visible != visible:
            self.visible = visible
            self.invalidate_total_list()

    properties = [Property("visible", True, lambda self: self.visible, set_visible)]

    #
    # Dialog fields (see action EditProperties)
    #

    dialog_fields = set(
        [
            DialogFieldInfo(
                "Markup",
                (1, 2),
                fields.edit.CheckButton(label_text="Visible (also hides children)", attribute_name="visible"),
            ),
            DialogFieldInfo(
                "Basic", (0, 3), fields.read.BBox(label_text="Bounding box", attribute_name="bounding_box")
            ),
        ]
    )

    #
    # OpenGL
    #

    def initialize_gl(self):
        assert not self.gl_active
        vb = context.application.vis_backend
        self.gl_active = True
        self.bounding_box = BoundingBox()
        self.draw_list = vb.create_list(self)
        self.boundingbox_list = vb.create_list()
        self.total_list = vb.create_list()
        ##print "Created lists (%i, %i, %i): %s" % (self.draw_list, self.boundingbox_list, self.total_list, self.get_name())
        self.draw_list_valid = True
        self.boundingbox_list_valid = True
        self.total_list_valid = True
        self.invalidate_all_lists()
        if isinstance(self.parent, GLMixin):
            self.parent.invalidate_all_lists()

    def cleanup_gl(self):
        assert self.gl_active
        self.gl_active = False
        vb = context.application.vis_backend
        ##print "Deleting lists (%i, %i, %i): %s" % (self.draw_list, self.boundingbox_list, self.total_list, self.get_name())
        vb.delete_list(self.draw_list)
        vb.delete_list(self.boundingbox_list)
        vb.delete_list(self.total_list)
        del self.bounding_box
        del self.draw_list
        del self.boundingbox_list
        del self.total_list
        del self.draw_list_valid
        del self.boundingbox_list_valid
        del self.total_list_valid
        if isinstance(self.parent, GLMixin):
            self.parent.invalidate_all_lists()

    #
    # Invalidation
    #

    def invalidate_draw_list(self):
        if self.gl_active and self.draw_list_valid:
            self.draw_list_valid = False
            context.application.main.drawing_area.queue_draw()
            context.application.scene.add_revalidation(self.revalidate_draw_list)
            self.emit("on-draw-list-invalidated")
            ##print "EMIT %s: on-draw-list-invalidated" % self.get_name()
            if isinstance(self.parent, GLMixin):
                self.parent.invalidate_boundingbox_list()

    def invalidate_boundingbox_list(self):
        ##print "TRY: %s: on-boundingbox-list-invalidated"  % self.get_name()
        if self.gl_active and self.boundingbox_list_valid:
            self.boundingbox_list_valid = False
            context.application.main.drawing_area.queue_draw()
            context.application.scene.add_revalidation(self.revalidate_boundingbox_list)
            self.emit("on-boundingbox-list-invalidated")
            ##print "EMIT %s: on-boundingbox-list-invalidated"  % self.get_name()
            if isinstance(self.parent, GLMixin):
                self.parent.invalidate_boundingbox_list()

    def invalidate_total_list(self):
        if self.gl_active and self.total_list_valid:
            self.total_list_valid = False
            context.application.main.drawing_area.queue_draw()
            context.application.scene.add_revalidation(self.revalidate_total_list)
            self.emit("on-total-list-invalidated")
            ##print "EMIT %s: on-total-list-invalidated" % self.get_name()
            if isinstance(self.parent, GLMixin):
                self.parent.invalidate_boundingbox_list()

    def invalidate_all_lists(self):
        self.invalidate_total_list()
        self.invalidate_boundingbox_list()
        self.invalidate_draw_list()

    #
    # Revalidation
    #

    def revalidate_draw_list(self):
        if self.gl_active:
            vb = context.application.vis_backend
            ##print "Compiling draw list (%i): %s" % (self.draw_list, self.get_name())
            vb.begin_list(self.draw_list)
            self.prepare_draw()
            self.draw()
            self.finish_draw()
            vb.end_list()
            self.draw_list_valid = True

    def revalidate_boundingbox_list(self):
        if self.gl_active:
            vb = context.application.vis_backend
            ##print "Compiling selection list (%i): %s" % (self.boundingbox_list, self.get_name())
            vb.begin_list(self.boundingbox_list)
            self.revalidate_bounding_box()
            self.bounding_box.draw()
            vb.end_list()
            self.boundingbox_list_valid = True

    def revalidate_bounding_box(self):
        self.bounding_box.clear()

    def revalidate_total_list(self):
        if self.gl_active:
            vb = context.application.vis_backend
            ##print "Compiling total list (%i): %s" % (self.total_list, self.get_name())
            vb.begin_list(self.total_list)
            if self.visible:
                vb.push_name(self.draw_list)
                self.draw_selection()
                vb.call_list(self.draw_list)
                vb.pop_name()
            vb.end_list()
            self.total_list_valid = True

    #
    # Draw
    #

    def draw_selection(self):
        vb = context.application.vis_backend
        if self.selected:
            vb.set_bright(True)
        else:
            vb.set_bright(False)

    def call_list(self):
        ##print "Executing total list (%i): %s" % (self.total_list, self.get_name())
        context.application.vis_backend.call_list(self.total_list)

    def prepare_draw(self):
        pass

    def draw(self):
        pass

    def finish_draw(self):
        pass

    #
    # Frame
    #

    def get_bounding_box_in_parent_frame(self):
        return self.bounding_box

    def get_absolute_frame(self):
        return self.get_absolute_parentframe()

    def get_absolute_parentframe(self):
        if not isinstance(self.parent, GLMixin):
            return Complete.identity()
        else:
            return self.parent.get_absolute_frame()

    def get_frame_up_to(self, upper_parent):
        if (upper_parent == self) or (self.parent == upper_parent):
            return Complete.identity()
        else:
            return self.get_parentframe_up_to(upper_parent)

    def get_parentframe_up_to(self, upper_parent):
        if not isinstance(self.parent, GLMixin):
            assert upper_parent is None, "upper_parent must be (an indirect) parent of self."
            return Complete.identity()
        elif self.parent == upper_parent:
            return Complete.identity()
        else:
            return self.parent.get_frame_up_to(upper_parent)

    def get_frame_relative_to(self, other):
        common = common_parent([self, other])
        return other.get_frame_up_to(common).inv * self.get_frame_up_to(common)

    #
    # Signal handlers
    #

    def on_select_changed(self, foo):
        self.invalidate_total_list()