[Bf-blender-cvs] [661f30df512] greasepencil-refactor: Minimum process working but very slow

Antonio Vazquez noreply at git.blender.org
Sat Jan 18 11:54:12 CET 2020


Commit: 661f30df512664be135ee1a5cd62a16fcb248946
Author: Antonio Vazquez
Date:   Sat Jan 11 19:26:33 2020 +0100
Branches: greasepencil-refactor
https://developer.blender.org/rB661f30df512664be135ee1a5cd62a16fcb248946

Minimum process working but very slow

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

M	source/blender/blenkernel/BKE_gpencil.h
M	source/blender/blenkernel/intern/gpencil.c
M	source/blender/blenkernel/intern/object.c
M	source/blender/blenkernel/intern/object_update.c

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

diff --git a/source/blender/blenkernel/BKE_gpencil.h b/source/blender/blenkernel/BKE_gpencil.h
index 337138d37c8..7e9e01cc297 100644
--- a/source/blender/blenkernel/BKE_gpencil.h
+++ b/source/blender/blenkernel/BKE_gpencil.h
@@ -88,6 +88,7 @@ void BKE_gpencil_free_frames(struct bGPDlayer *gpl);
 void BKE_gpencil_free_layers(struct ListBase *list);
 bool BKE_gpencil_free_frame_runtime_data(struct bGPDframe *gpf_eval);
 void BKE_gpencil_free(struct bGPdata *gpd, bool free_all);
+void BKE_gpencil_eval_delete(struct bGPdata *gpd_eval);
 
 void BKE_gpencil_batch_cache_dirty_tag(struct bGPdata *gpd);
 void BKE_gpencil_batch_cache_free(struct bGPdata *gpd);
diff --git a/source/blender/blenkernel/intern/gpencil.c b/source/blender/blenkernel/intern/gpencil.c
index d8003952dba..0d3f98c7b55 100644
--- a/source/blender/blenkernel/intern/gpencil.c
+++ b/source/blender/blenkernel/intern/gpencil.c
@@ -236,6 +236,13 @@ void BKE_gpencil_free(bGPdata *gpd, bool free_all)
   }
 }
 
+void BKE_gpencil_eval_delete(bGPdata *gpd_eval)
+{
+  BKE_gpencil_free(gpd_eval, true);
+  BKE_libblock_free_data(&gpd_eval->id, false);
+  MEM_freeN(gpd_eval);
+}
+
 /* ************************************************** */
 /* Container Creation */
 
diff --git a/source/blender/blenkernel/intern/object.c b/source/blender/blenkernel/intern/object.c
index 8fd08dd385d..c653bdd36c9 100644
--- a/source/blender/blenkernel/intern/object.c
+++ b/source/blender/blenkernel/intern/object.c
@@ -453,7 +453,10 @@ void BKE_object_free_derived_caches(Object *ob)
   BKE_object_to_mesh_clear(ob);
   BKE_object_free_curve_cache(ob);
 
-  /* clear grease pencil data */
+  /* Clear grease pencil data. */
+  if (ob->runtime.gpd_eval != NULL) {
+    BKE_gpencil_eval_delete(ob->runtime.gpd_eval);
+  }
   DRW_gpencil_freecache(ob);
 }
 
diff --git a/source/blender/blenkernel/intern/object_update.c b/source/blender/blenkernel/intern/object_update.c
index 75ee3ea2df6..dd59ac52a2c 100644
--- a/source/blender/blenkernel/intern/object_update.c
+++ b/source/blender/blenkernel/intern/object_update.c
@@ -157,7 +157,6 @@ static void assign_object_gpencil_eval(Object *object)
 {
   BLI_assert(object->id.tag & LIB_TAG_COPIED_ON_WRITE);
 
-  bGPdata *gpd = (bGPdata *)object->data;
   bGPdata *gpd_eval = object->runtime.gpd_eval;
 
   gpd_eval->id.tag |= LIB_TAG_COPIED_ON_WRITE_EVAL_RESULT;
@@ -170,13 +169,6 @@ static void assign_object_gpencil_eval(Object *object)
 void BKE_object_handle_data_update(Depsgraph *depsgraph, Scene *scene, Object *ob)
 {
   DEG_debug_print_eval(depsgraph, __func__, ob->id.name, ob);
-  Object *ob_orig = DEG_get_original_object(ob);
-  printf("%s\tOb Orig:%p Ob Eval:%p Orig_Data:%p Eval Data:%p \n",
-         ob->id.name + 2,
-         ob_orig,
-         ob,
-         ob_orig->data,
-         ob->data);
 
   /* includes all keys and modifiers */
   switch (ob->type) {
@@ -236,11 +228,18 @@ void BKE_object_handle_data_update(Depsgraph *depsgraph, Scene *scene, Object *o
       BKE_lattice_modifiers_calc(depsgraph, scene, ob);
       break;
     case OB_GPENCIL: {
+      bGPdata *gpd = (bGPdata *)ob->data;
+
+      if (ob->runtime.gpd_orig == NULL) {
+        ob->runtime.gpd_orig = gpd;
+      }
+
       /* Copy Datablock to evaluated version. */
-      if (ob->runtime.gpd_eval) {
-        BKE_gpencil_free(ob->runtime.gpd_eval, true);
+      if (ob->runtime.gpd_eval != NULL) {
+        BKE_gpencil_eval_delete(ob->runtime.gpd_eval);
+        ob->data = ob->runtime.gpd_orig;
       }
-      ob->runtime.gpd_orig = (bGPdata *)ob->data;
+
       ob->runtime.gpd_eval = BKE_gpencil_copy_for_eval(ob->runtime.gpd_orig, true);
       assign_object_gpencil_eval(ob);



More information about the Bf-blender-cvs mailing list