[Bf-blender-cvs] [dfb8e1f895e] greasepencil-object: Initial gpencil undo system patch

Falk David noreply at git.blender.org
Mon Feb 7 18:35:13 CET 2022


Commit: dfb8e1f895ecd9b2dd68a6caf405c922adc2f407
Author: Falk David
Date:   Wed Feb 2 15:22:01 2022 +0100
Branches: greasepencil-object
https://developer.blender.org/rBdfb8e1f895ecd9b2dd68a6caf405c922adc2f407

Initial gpencil undo system patch

Co-authored-by: @yann-lty

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

M	release/scripts/startup/bl_ui/space_userpref.py
M	source/blender/blenkernel/BKE_gpencil.h
M	source/blender/blenkernel/BKE_gpencil_update_cache.h
M	source/blender/blenkernel/BKE_object.h
M	source/blender/blenkernel/BKE_undo_system.h
M	source/blender/blenkernel/intern/gpencil.c
M	source/blender/blenkernel/intern/gpencil_update_cache.c
M	source/blender/blenkernel/intern/undo_system.c
M	source/blender/blenlib/intern/DLRB_tree.c
M	source/blender/depsgraph/intern/eval/deg_eval_copy_on_write.cc
M	source/blender/editors/gpencil/gpencil_paint.c
M	source/blender/editors/gpencil/gpencil_undo.c
M	source/blender/editors/include/ED_gpencil.h
M	source/blender/editors/undo/undo_system_types.c
M	source/blender/makesdna/DNA_gpencil_types.h
M	source/blender/makesdna/DNA_userdef_types.h
M	source/blender/makesrna/intern/rna_userdef.c

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

diff --git a/release/scripts/startup/bl_ui/space_userpref.py b/release/scripts/startup/bl_ui/space_userpref.py
index bd92d0d2ff9..a6304211f8a 100644
--- a/release/scripts/startup/bl_ui/space_userpref.py
+++ b/release/scripts/startup/bl_ui/space_userpref.py
@@ -2241,11 +2241,14 @@ class ExperimentalPanel:
         layout.use_property_split = False
         layout.use_property_decorate = False
 
-        for prop_keywords, reference in items:
+        for prop_keywords, reference, poll_function in items:
             split = layout.split(factor=0.66)
             col = split.split()
             col.prop(experimental, **prop_keywords)
 
+            if poll_function:
+                col.enabled = poll_function(context)
+
             if reference:
                 if type(reference) is tuple:
                     url_ext = reference[0]
@@ -2268,8 +2271,8 @@ class USERPREF_PT_experimental_virtual_reality(ExperimentalPanel, Panel):
     def draw(self, context):
         self._draw_items(
             context, (
-                ({"property": "use_virtual_reality_scene_inspection"}, "T71347"),
-                ({"property": "use_virtual_reality_immersive_drawing"}, "T71348"),
+                ({"property": "use_virtual_reality_scene_inspection"}, "T71347", None),
+                ({"property": "use_virtual_reality_immersive_drawing"}, "T71348", None),
             )
         )
 """
@@ -2281,10 +2284,10 @@ class USERPREF_PT_experimental_new_features(ExperimentalPanel, Panel):
     def draw(self, context):
         self._draw_items(
             context, (
-                ({"property": "use_sculpt_vertex_colors"}, "T71947"),
-                ({"property": "use_sculpt_tools_tilt"}, "T82877"),
-                ({"property": "use_extended_asset_browser"}, ("project/view/130/", "Project Page")),
-                ({"property": "use_override_templates"}, ("T73318", "Milestone 4")),
+                ({"property": "use_sculpt_vertex_colors"}, "T71947", None),
+                ({"property": "use_sculpt_tools_tilt"}, "T82877", None),
+                ({"property": "use_extended_asset_browser"}, ("project/view/130/", "Project Page"), None),
+                ({"property": "use_override_templates"}, ("T73318", "Milestone 4"), None),
             ),
         )
 
@@ -2295,9 +2298,9 @@ class USERPREF_PT_experimental_prototypes(ExperimentalPanel, Panel):
     def draw(self, context):
         self._draw_items(
             context, (
-                ({"property": "use_new_hair_type"}, "T68981"),
-                ({"property": "use_new_point_cloud_type"}, "T75717"),
-                ({"property": "use_full_frame_compositor"}, "T88150"),
+                ({"property": "use_new_hair_type"}, "T68981", None),
+                ({"property": "use_new_point_cloud_type"}, "T75717", None),
+                ({"property": "use_full_frame_compositor"}, "T88150", None),
             ),
         )
 
@@ -2314,13 +2317,15 @@ class USERPREF_PT_experimental_debugging(ExperimentalPanel, Panel):
     def draw(self, context):
         self._draw_items(
             context, (
-                ({"property": "use_undo_legacy"}, "T60695"),
-                ({"property": "override_auto_resync"}, "T83811"),
-                ({"property": "use_cycles_debug"}, None),
-                ({"property": "use_geometry_nodes_legacy"}, "T91274"),
-                ({"property": "show_asset_debug_info"}, None),
-                ({"property": "use_asset_indexing"}, None),
-                ({"property": "use_gpencil_update_cache"}, "T95401"),
+                ({"property": "use_undo_legacy"}, "T60695", None),
+                ({"property": "override_auto_resync"}, "T83811", None),
+                ({"property": "use_cycles_debug"}, None, None),
+                ({"property": "use_geometry_nodes_legacy"}, "T91274", None),
+                ({"property": "show_asset_debug_info"}, None, None),
+                ({"property": "use_asset_indexing"}, None, None),
+                ({"property": "use_gpencil_update_cache"}, "T95401", None),
+                # Disabled if use_gpencil_update_cache is disabled
+                ({"property": "use_gpencil_undo_system"}, "TODO", lambda ctx: ctx.preferences.experimental.use_gpencil_update_cache),
             ),
         )
 
diff --git a/source/blender/blenkernel/BKE_gpencil.h b/source/blender/blenkernel/BKE_gpencil.h
index 4aec1e684af..6bd7ba255cf 100644
--- a/source/blender/blenkernel/BKE_gpencil.h
+++ b/source/blender/blenkernel/BKE_gpencil.h
@@ -222,12 +222,13 @@ struct bGPDstroke *BKE_gpencil_stroke_duplicate(struct bGPDstroke *gps_src,
 
 /**
  * Make a copy of a given gpencil data-block.
- *
- * XXX: Should this be deprecated?
+ * \param bmain: Main structure. Can be NULL which will make a localized copy of the data-block
+ * outside of bmain.
+ * \param gpd: The grease pencil data-block to duplicate.
  */
-struct bGPdata *BKE_gpencil_data_duplicate(struct Main *bmain,
-                                           const struct bGPdata *gpd,
-                                           bool internal_copy);
+void BKE_gpencil_data_duplicate(struct Main *bmain,
+                                const struct bGPdata *gpd,
+                                struct bGPdata **gpd_dst);
 
 /**
  * Delete the last stroke of the given frame.
diff --git a/source/blender/blenkernel/BKE_gpencil_update_cache.h b/source/blender/blenkernel/BKE_gpencil_update_cache.h
index 8c833f6091d..074b7b44635 100644
--- a/source/blender/blenkernel/BKE_gpencil_update_cache.h
+++ b/source/blender/blenkernel/BKE_gpencil_update_cache.h
@@ -139,12 +139,32 @@ void BKE_gpencil_tag_light_update(struct bGPdata *gpd,
                                   struct bGPDframe *gpf,
                                   struct bGPDstroke *gps);
 
+/**
+ *
+ */
+GPencilUpdateCache *BKE_gpencil_duplicate_update_cache_and_data(GPencilUpdateCache *gpd_cache);
+
+/**
+ *
+ */
+bool BKE_gpencil_compare_update_caches(GPencilUpdateCache *cache_a, GPencilUpdateCache *cache_b);
+
 /**
  * Frees the GPencilUpdateCache on the gpd->runtime. This will not free the data that the cache
  * node might point to. It assumes that the cache does not own the data.
  */
 void BKE_gpencil_free_update_cache(struct bGPdata *gpd);
 
+/**
+ *
+ */
+void BKE_gpencil_free_update_cache_and_data(GPencilUpdateCache *cache);
+
+/**
+ *
+ */
+void BKE_gpencil_print_update_cache(struct bGPdata *gpd);
+
 #ifdef __cplusplus
 }
 #endif
diff --git a/source/blender/blenkernel/BKE_object.h b/source/blender/blenkernel/BKE_object.h
index 99758f4ad78..a4a9b5fc5ac 100644
--- a/source/blender/blenkernel/BKE_object.h
+++ b/source/blender/blenkernel/BKE_object.h
@@ -167,6 +167,7 @@ bool BKE_object_has_mode_data(const struct Object *ob, eObjectMode object_mode);
 bool BKE_object_is_mode_compat(const struct Object *ob, eObjectMode object_mode);
 
 bool BKE_object_data_is_in_editmode(const struct ID *id);
+bool BKE_object_data_is_in_paint_mode(const struct ID *id);
 
 char *BKE_object_data_editmode_flush_ptr_get(struct ID *id);
 
diff --git a/source/blender/blenkernel/BKE_undo_system.h b/source/blender/blenkernel/BKE_undo_system.h
index 88a9ac9d0bf..859051e8a3f 100644
--- a/source/blender/blenkernel/BKE_undo_system.h
+++ b/source/blender/blenkernel/BKE_undo_system.h
@@ -183,6 +183,7 @@ extern const UndoType *BKE_UNDOSYS_TYPE_PAINTCURVE;
 extern const UndoType *BKE_UNDOSYS_TYPE_PARTICLE;
 extern const UndoType *BKE_UNDOSYS_TYPE_SCULPT;
 extern const UndoType *BKE_UNDOSYS_TYPE_TEXT;
+extern const UndoType *BKE_UNDOSYS_TYPE_GPENCIL;
 
 /** \} */
 
diff --git a/source/blender/blenkernel/intern/gpencil.c b/source/blender/blenkernel/intern/gpencil.c
index b9ebd19a617..68d3c7d1350 100644
--- a/source/blender/blenkernel/intern/gpencil.c
+++ b/source/blender/blenkernel/intern/gpencil.c
@@ -65,6 +65,7 @@
 #include "BKE_material.h"
 #include "BKE_paint.h"
 
+#include "BLI_dlrbTree.h"
 #include "BLI_math_color.h"
 
 #include "DEG_depsgraph_query.h"
@@ -1075,33 +1076,29 @@ void BKE_gpencil_stroke_copy_settings(const bGPDstroke *gps_src, bGPDstroke *gps
   copy_v4_v4(gps_dst->vert_color_fill, gps_src->vert_color_fill);
 }
 
-bGPdata *BKE_gpencil_data_duplicate(Main *bmain, const bGPdata *gpd_src, bool internal_copy)
+void BKE_gpencil_data_duplicate(Main *bmain, const bGPdata *gpd_src, bGPdata **gpd_dst)
 {
-  bGPdata *gpd_dst;
-
-  /* Yuck and super-uber-hyper yuck!!!
-   * Should be replaceable with a no-main copy (LIB_ID_COPY_NO_MAIN etc.), but not sure about it,
-   * so for now keep old code for that one. */
-
   /* error checking */
   if (gpd_src == NULL) {
-    return NULL;
+    return;
   }
 
-  if (internal_copy) {
-    /* make a straight copy for undo buffers used during stroke drawing */
-    gpd_dst = MEM_dupallocN(gpd_src);
+  bGPdata *gpd_new = *gpd_dst;
+
+  if (bmain == NULL) {
+    if (gpd_new == NULL) {
+      *gpd_dst = MEM_dupallocN(gpd_src);
+      gpd_new = *gpd_dst;
+    }
+    else {
+      *gpd_new = *gpd_src;
+    }
+    greasepencil_copy_data(NULL, (ID *)gpd_new, (ID *)gpd_src, 0);
+    gpd_new->runtime.update_cache = NULL;
   }
   else {
-    BLI_assert(bmain != NULL);
-    gpd_dst = (bGPdata *)BKE_id_copy(bmain, &gpd_src->id);
+    *gpd_dst = (bGPdata *)BKE_id_copy(bmain, &gpd_src->id);
   }
-
-  /* Copy internal data (layers, etc.) */
-  greasepencil_copy_data(bmain, &gpd_dst->id, &gpd_src->id, 0);
-
-  /* return new */
-  return gpd_dst;
 }
 
 /* ************************************************** */
@@ -1619,6 +1616,7 @@ void BKE_gpencil_layer_active_set(bGPdata *gpd, bGPDlayer *active)
     if (gpd->flag & GP_DATA_AUTOLOCK_LAYERS) {
       gpl->flag |= GP_LAYER_LOCKED;
     }
+    BKE_gpencil_tag_light_update(gpd, gpl, NULL, NULL);
   }
 
   /* set as active one */
@@ -1644,6 +1642,7 @@ void BKE_gpencil_layer_autolock_set(bGPdata *gpd, const bool unlock)
       else {
         gpl->flag |= GP_LAYER_LOCKED;
       }
+      BKE_gpencil_tag_light_update(gpd, gpl, NULL, NULL);
     }
   }
   else {
@@ -1653,6 +1652,7 @@ void BKE_gpencil_layer_autolock_set(bGPdata *gpd, const bool unlock)
     if (unlock) {
       LISTBASE_FOREACH (bGPDlayer *, gpl, &gpd->layers) {
         gpl->flag &= ~GP_LAYER_LOCKED;
+        BKE_gpencil_tag_light_update(gpd, gpl, NULL, NUL

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list