[Bf-blender-cvs] [c650ea9a13f] greasepencil-refactor: GPencil: Add automatic sorting for Mask List

Antonio Vazquez noreply at git.blender.org
Tue Feb 11 19:38:39 CET 2020


Commit: c650ea9a13f91c7d44d12b79a570409df72532ca
Author: Antonio Vazquez
Date:   Tue Feb 11 19:37:47 2020 +0100
Branches: greasepencil-refactor
https://developer.blender.org/rBc650ea9a13f91c7d44d12b79a570409df72532ca

GPencil: Add automatic sorting for Mask List

Now the masking is sorted in the same order of the layers. The order is recalculated when any layer is created, deleted or moved.

===================================================================

M	source/blender/blenkernel/BKE_gpencil.h
M	source/blender/blenkernel/intern/gpencil.c
M	source/blender/editors/gpencil/gpencil_data.c
M	source/blender/makesdna/DNA_gpencil_types.h

===================================================================

diff --git a/source/blender/blenkernel/BKE_gpencil.h b/source/blender/blenkernel/BKE_gpencil.h
index f907e7dc871..07f5a0c6fc4 100644
--- a/source/blender/blenkernel/BKE_gpencil.h
+++ b/source/blender/blenkernel/BKE_gpencil.h
@@ -191,6 +191,8 @@ struct bGPDlayer_Mask *BKE_gpencil_layer_mask_add(struct bGPDlayer *gpl, const c
 void BKE_gpencil_layer_mask_remove(struct bGPDlayer *gpl, struct bGPDlayer_Mask *mask);
 void BKE_gpencil_layer_mask_remove_ref(struct bGPdata *gpd, const char *name);
 struct bGPDlayer_Mask *BKE_gpencil_layer_mask_named_get(struct bGPDlayer *gpl, const char *name);
+void BKE_gpencil_layer_mask_sort(struct bGPdata *gpd, struct bGPDlayer *gpl);
+void BKE_gpencil_layer_mask_sort_all(struct bGPdata *gpd);
 
 /* Brush */
 struct Material *BKE_gpencil_brush_material_get(struct Brush *brush);
diff --git a/source/blender/blenkernel/intern/gpencil.c b/source/blender/blenkernel/intern/gpencil.c
index 3533e8e66f6..a0bd57a2a36 100644
--- a/source/blender/blenkernel/intern/gpencil.c
+++ b/source/blender/blenkernel/intern/gpencil.c
@@ -1070,6 +1070,45 @@ void BKE_gpencil_layer_mask_remove_ref(bGPdata *gpd, const char *name)
   }
 }
 
+static int gpencil_cb_sort_masks(const void *arg1, const void *arg2)
+{
+  /* sort is inverted as layer list. */
+  const struct bGPDlayer_Mask *mask1 = arg1;
+  const struct bGPDlayer_Mask *mask2 = arg2;
+  int val = 0;
+
+  if (mask1->sort_index < mask2->sort_index) {
+    val = 1;
+  }
+  else if (mask1->sort_index > mask2->sort_index) {
+    val = -1;
+  }
+
+  return val;
+}
+
+void BKE_gpencil_layer_mask_sort(bGPdata *gpd, bGPDlayer *gpl)
+{
+  /* Update sort index. */
+  LISTBASE_FOREACH (bGPDlayer_Mask *, mask, &gpl->mask_layers) {
+    bGPDlayer *gpl = BKE_gpencil_layer_named_get(gpd, mask->name);
+    if (gpl != NULL) {
+      mask->sort_index = BLI_findindex(&gpd->layers, gpl);
+    }
+    else {
+      mask->sort_index = 0;
+    }
+  }
+  BLI_listbase_sort(&gpl->mask_layers, gpencil_cb_sort_masks);
+}
+
+void BKE_gpencil_layer_mask_sort_all(bGPdata *gpd)
+{
+  LISTBASE_FOREACH (bGPDlayer *, gpl, &gpd->layers) {
+    BKE_gpencil_layer_mask_sort(gpd, gpl);
+  }
+}
+
 /* get the active gp-layer for editing */
 bGPDlayer *BKE_gpencil_layer_active_get(bGPdata *gpd)
 {
diff --git a/source/blender/editors/gpencil/gpencil_data.c b/source/blender/editors/gpencil/gpencil_data.c
index 75064b59528..410279e359d 100644
--- a/source/blender/editors/gpencil/gpencil_data.c
+++ b/source/blender/editors/gpencil/gpencil_data.c
@@ -318,6 +318,9 @@ static int gp_layer_remove_exec(bContext *C, wmOperator *op)
   /* delete the layer now... */
   BKE_gpencil_layer_delete(gpd, gpl);
 
+  /* Reorder masking. */
+  BKE_gpencil_layer_mask_sort_all(gpd);
+
   /* notifiers */
   DEG_id_tag_update(&gpd->id, ID_RECALC_TRANSFORM | ID_RECALC_GEOMETRY);
   WM_event_add_notifier(C, NC_GPENCIL | ND_DATA | NA_EDITED, NULL);
@@ -384,6 +387,9 @@ static int gp_layer_move_exec(bContext *C, wmOperator *op)
 
   BLI_assert(ELEM(direction, -1, 0, 1)); /* we use value below */
   if (BLI_listbase_link_move(&gpd->layers, gpl, direction)) {
+    /* Reorder masking. */
+    BKE_gpencil_layer_mask_sort_all(gpd);
+
     DEG_id_tag_update(&gpd->id, ID_RECALC_TRANSFORM | ID_RECALC_GEOMETRY);
     WM_event_add_notifier(C, NC_GPENCIL | ND_DATA | NA_EDITED, NULL);
   }
@@ -1214,6 +1220,9 @@ static int gp_merge_layer_exec(bContext *C, wmOperator *op)
   BKE_gpencil_layer_delete(gpd, gpl_next);
   BLI_ghash_free(gh_frames_cur, NULL, NULL);
 
+  /* Reorder masking. */
+  BKE_gpencil_layer_mask_sort(gpd, gpl_current);
+
   /* notifiers */
   DEG_id_tag_update(&gpd->id, ID_RECALC_TRANSFORM | ID_RECALC_GEOMETRY);
   WM_event_add_notifier(C, NC_GPENCIL | ND_DATA | NA_EDITED, NULL);
@@ -3350,6 +3359,9 @@ static int gp_layer_mask_add_exec(bContext *C, wmOperator *op)
 
   BKE_gpencil_layer_mask_add(gpl_active, name);
 
+  /* Reorder masking. */
+  BKE_gpencil_layer_mask_sort(gpd, gpl_active);
+
   /* notifiers */
   if (gpd) {
     DEG_id_tag_update(&gpd->id,
@@ -3399,6 +3411,9 @@ static int gp_layer_mask_remove_exec(bContext *C, wmOperator *op)
     }
   }
 
+  /* Reorder masking. */
+  BKE_gpencil_layer_mask_sort(gpd, gpl);
+
   /* notifiers */
   DEG_id_tag_update(&gpd->id, ID_RECALC_TRANSFORM | ID_RECALC_GEOMETRY);
   WM_event_add_notifier(C, NC_GPENCIL | ND_DATA | NA_EDITED, NULL);
diff --git a/source/blender/makesdna/DNA_gpencil_types.h b/source/blender/makesdna/DNA_gpencil_types.h
index 4b118c5359a..b5402478118 100644
--- a/source/blender/makesdna/DNA_gpencil_types.h
+++ b/source/blender/makesdna/DNA_gpencil_types.h
@@ -330,7 +330,9 @@ typedef struct bGPDlayer_Mask {
   struct bGPDlayer_Mask *next, *prev;
   char name[128];
   short flag;
-  char _pad[6];
+  /** Index for sorting. Only valid while sorting algorithm is running. */
+  short sort_index;
+  char _pad[4];
 } bGPDlayer_Mask;
 
 /* bGPDlayer_Mask->flag */



More information about the Bf-blender-cvs mailing list