Cache sorted layer indices on Art

This commit is contained in:
Jared Miller 2026-02-12 21:09:48 -05:00
parent 7abbb6bffb
commit 4619444ed1
Signed by: shmup
GPG key ID: 22B5C6D66A38B06C
3 changed files with 15 additions and 3 deletions

View file

@ -141,6 +141,7 @@ class Art:
self.instances = [] self.instances = []
"List of ArtInstances using us as their source" "List of ArtInstances using us as their source"
# init frames and layers - ArtFromDisk has its own logic for this # init frames and layers - ArtFromDisk has its own logic for this
self._sorted_layers = None
self.init_layers() self.init_layers()
self.init_frames() self.init_frames()
# support non-square characters: # support non-square characters:
@ -177,6 +178,14 @@ class Art:
self.layers_visibility = [True] self.layers_visibility = [True]
self.layer_names = ["Layer 1"] self.layer_names = ["Layer 1"]
def get_sorted_layers(self):
"Return layer indices sorted by Z depth, cached until invalidated."
if self._sorted_layers is None:
self._sorted_layers = tuple(
sorted(range(self.layers), key=lambda i: self.layers_z[i])
)
return self._sorted_layers
def init_frames(self): def init_frames(self):
self.frames = 0 self.frames = 0
# current frame being edited # current frame being edited
@ -309,6 +318,7 @@ class Art:
self.layer_names.append(new_name) self.layer_names.append(new_name)
# rebuild geo with added verts for new layer # rebuild geo with added verts for new layer
self.geo_changed = True self.geo_changed = True
self._sorted_layers = None
# set new layer as active # set new layer as active
if self is self.app.ui.active_art: if self is self.app.ui.active_art:
self.app.ui.set_active_layer(self.layers - 1) self.app.ui.set_active_layer(self.layers - 1)
@ -346,6 +356,7 @@ class Art:
self.layer_names.pop(index) self.layer_names.pop(index)
self.layers -= 1 self.layers -= 1
self.geo_changed = True self.geo_changed = True
self._sorted_layers = None
self.mark_all_frames_changed() self.mark_all_frames_changed()
if self.active_layer > self.layers - 1: if self.active_layer > self.layers - 1:
self.app.ui.set_active_layer(self.layers - 1) self.app.ui.set_active_layer(self.layers - 1)
@ -1316,6 +1327,7 @@ class ArtInstance(Art):
self.renderables = [] self.renderables = []
# instances shouldn't have instances; cause user problems if attempted # instances shouldn't have instances; cause user problems if attempted
self.instances = None self.instances = None
self._sorted_layers = None
self.restore_from_source() self.restore_from_source()
self.source.instances.append(self) self.source.instances.append(self)
@ -1339,6 +1351,7 @@ class ArtInstance(Art):
setattr(self, prop, getattr(self.source, prop)) setattr(self, prop, getattr(self.source, prop))
# copy lists # copy lists
self.layers_z = self.source.layers_z[:] self.layers_z = self.source.layers_z[:]
self._sorted_layers = None
self.layers_visibility = self.source.layers_visibility[:] self.layers_visibility = self.source.layers_visibility[:]
self.layer_names = self.source.layer_names[:] self.layer_names = self.source.layer_names[:]
self.frame_delays = self.source.frame_delays[:] self.frame_delays = self.source.frame_delays[:]

View file

@ -528,9 +528,7 @@ class TileRenderable:
GL.glBlendFunc(GL.GL_SRC_ALPHA, GL.GL_ONE_MINUS_SRC_ALPHA) GL.glBlendFunc(GL.GL_SRC_ALPHA, GL.GL_ONE_MINUS_SRC_ALPHA)
# draw all specified layers if no list given # draw all specified layers if no list given
if layers is None: if layers is None:
# sort layers in Z depth layers = self.art.get_sorted_layers()
layers = list(range(self.art.layers))
layers.sort(key=lambda i: self.art.layers_z[i], reverse=False)
# handle a single int param # handle a single int param
elif type(layers) is int: elif type(layers) is int:
layers = [layers] layers = [layers]

View file

@ -693,6 +693,7 @@ class SetLayerZDialog(UIDialog):
return return
new_z = float(self.field_texts[0]) new_z = float(self.field_texts[0])
self.ui.active_art.layers_z[self.ui.active_art.active_layer] = new_z self.ui.active_art.layers_z[self.ui.active_art.active_layer] = new_z
self.ui.active_art._sorted_layers = None
self.ui.active_art.set_unsaved_changes(True) self.ui.active_art.set_unsaved_changes(True)
self.ui.app.grid.reset() self.ui.app.grid.reset()
self.dismiss() self.dismiss()