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()
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()
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()