[Bf-blender-cvs] [d27e852cb73] greasepencil-refactor: GPencil: Moves buffer drawing data to eval data

Antonio Vazquez noreply at git.blender.org
Fri Jan 31 19:23:03 CET 2020


Commit: d27e852cb733284345398a9e28b0b491c5766b5e
Author: Antonio Vazquez
Date:   Fri Jan 31 17:02:47 2020 +0100
Branches: greasepencil-refactor
https://developer.blender.org/rBd27e852cb733284345398a9e28b0b491c5766b5e

GPencil: Moves buffer drawing data to eval data

Instead to put the sbuffer data in the original datablock, now is copied to evaluated data, but without tagging all datablock that makes things very slow in fast drawing.

This changes removes the hacks to use the original datablock for buffers in the drawing engine.

Note: still there is a problem when a datablock is used several times with modifiers.

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

M	source/blender/blenkernel/intern/gpencil_modifier.c
M	source/blender/draw/engines/gpencil/gpencil_engine.c
M	source/blender/draw/intern/draw_cache_impl_gpencil.c
M	source/blender/editors/gpencil/gpencil_paint.c
M	source/blender/editors/gpencil/gpencil_primitive.c
M	source/blender/editors/gpencil/gpencil_utils.c
M	source/blender/editors/include/ED_gpencil.h

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

diff --git a/source/blender/blenkernel/intern/gpencil_modifier.c b/source/blender/blenkernel/intern/gpencil_modifier.c
index bd951607079..83e6b28a9e8 100644
--- a/source/blender/blenkernel/intern/gpencil_modifier.c
+++ b/source/blender/blenkernel/intern/gpencil_modifier.c
@@ -766,15 +766,28 @@ static void gpencil_copy_activeframe_to_eval(
     Depsgraph *depsgraph, Scene *scene, Object *ob, bGPdata *gpd_orig, bGPdata *gpd_eval)
 {
   /* Copy all relevant data of the datablock. */
-  ListBase layers = gpd_eval->layers;
-  bGPdata_Runtime runtime = gpd_eval->runtime;
   MEM_SAFE_FREE(gpd_eval->mat);
-
-  memcpy(gpd_eval, gpd_orig, sizeof(bGPdata));
-  gpd_eval->layers = layers;
-  gpd_eval->runtime = runtime;
   gpd_eval->mat = MEM_dupallocN(gpd_orig->mat);
 
+  gpd_eval->flag = gpd_orig->flag;
+  gpd_eval->pixfactor = gpd_orig->pixfactor;
+  copy_v4_v4(gpd_eval->line_color, gpd_orig->line_color);
+  gpd_eval->onion_factor = gpd_orig->onion_factor;
+  gpd_eval->onion_mode = gpd_orig->onion_mode;
+  gpd_eval->onion_flag = gpd_orig->onion_flag;
+  gpd_eval->gstep = gpd_orig->gstep;
+  gpd_eval->gstep_next = gpd_orig->gstep_next;
+  copy_v3_v3(gpd_eval->gcolor_prev, gpd_orig->gcolor_prev);
+  copy_v3_v3(gpd_eval->gcolor_next, gpd_orig->gcolor_next);
+  gpd_eval->zdepth_offset = gpd_orig->zdepth_offset;
+  gpd_eval->totcol = gpd_orig->totcol;
+  gpd_eval->totlayer = gpd_orig->totlayer;
+  gpd_eval->totframe = gpd_orig->totframe;
+  gpd_eval->totstroke = gpd_orig->totstroke;
+  gpd_eval->totpoint = gpd_orig->totpoint;
+  gpd_eval->draw_mode = gpd_orig->draw_mode;
+  gpd_eval->onion_keytype = gpd_orig->onion_keytype;
+
   /* Assign (can be NULL if reuse eval copy done by depsgraph). */
   if (ob->runtime.gpd_eval != NULL) {
     ob->data = ob->runtime.gpd_eval;
diff --git a/source/blender/draw/engines/gpencil/gpencil_engine.c b/source/blender/draw/engines/gpencil/gpencil_engine.c
index 4a9aa98c3ce..b0e812a8416 100644
--- a/source/blender/draw/engines/gpencil/gpencil_engine.c
+++ b/source/blender/draw/engines/gpencil/gpencil_engine.c
@@ -228,10 +228,7 @@ void GPENCIL_cache_init(void *ved)
     if (pd->obact && pd->obact->type == OB_GPENCIL) {
       /* Check if active object has a temp stroke data. */
       bGPdata *gpd = (bGPdata *)pd->obact->data;
-      /* Current stroke data is stored in the original id. This is waiting refactor of the
-       * Depsgraph to support more granular update of the GPencil data. */
-      bGPdata *gpd_orig = (bGPdata *)DEG_get_original_id(&gpd->id);
-      if (gpd_orig->runtime.sbuffer_used > 0) {
+      if (gpd->runtime.sbuffer_used > 0) {
         pd->sbuffer_gpd = gpd;
         pd->sbuffer_stroke = DRW_cache_gpencil_sbuffer_stroke_data_get(pd->obact);
         pd->sbuffer_layer = BKE_gpencil_layer_active_get(pd->sbuffer_gpd);
diff --git a/source/blender/draw/intern/draw_cache_impl_gpencil.c b/source/blender/draw/intern/draw_cache_impl_gpencil.c
index 49ab8b020e3..e77026e850a 100644
--- a/source/blender/draw/intern/draw_cache_impl_gpencil.c
+++ b/source/blender/draw/intern/draw_cache_impl_gpencil.c
@@ -483,10 +483,6 @@ GPUBatch *DRW_cache_gpencil_face_wireframe_get(Object *ob)
 bGPDstroke *DRW_cache_gpencil_sbuffer_stroke_data_get(Object *ob)
 {
   bGPdata *gpd = (bGPdata *)ob->data;
-  /* Current stroke data is stored in the original id. This is waiting refactor of the
-   * Depsgraph to support more granular update of the GPencil data. */
-  gpd = (bGPdata *)DEG_get_original_id(&gpd->id);
-
   /* Convert the sbuffer to a bGPDstroke. */
   if (gpd->runtime.sbuffer_gps == NULL) {
     bGPDstroke *gps = MEM_callocN(sizeof(*gps), "bGPDstroke sbuffer");
@@ -603,38 +599,27 @@ static void gpencil_sbuffer_stroke_ensure(bGPdata *gpd, bool do_stroke, bool do_
 GPUBatch *DRW_cache_gpencil_sbuffer_stroke_get(Object *ob)
 {
   bGPdata *gpd = (bGPdata *)ob->data;
-  /* Current stroke data is stored in the original id. This is waiting refactor of the
-   * Depsgraph to support more granular update of the GPencil data. */
-  bGPdata *gpd_orig = (bGPdata *)DEG_get_original_id(&gpd->id);
-
-  gpencil_sbuffer_stroke_ensure(gpd_orig, true, false);
+  gpencil_sbuffer_stroke_ensure(gpd, true, false);
 
-  return gpd_orig->runtime.sbuffer_stroke_batch;
+  return gpd->runtime.sbuffer_stroke_batch;
 }
 
 GPUBatch *DRW_cache_gpencil_sbuffer_fill_get(Object *ob)
 {
   bGPdata *gpd = (bGPdata *)ob->data;
-  /* Current stroke data is stored in the original id. This is waiting refactor of the
-   * Depsgraph to support more granular update of the GPencil data. */
-  bGPdata *gpd_orig = (bGPdata *)DEG_get_original_id(&gpd->id);
   /* Fill batch also need stroke batch to be created (vbo is shared). */
-  gpencil_sbuffer_stroke_ensure(gpd_orig, true, true);
+  gpencil_sbuffer_stroke_ensure(gpd, true, true);
 
-  return gpd_orig->runtime.sbuffer_fill_batch;
+  return gpd->runtime.sbuffer_fill_batch;
 }
 
 /* Sbuffer batches are temporary. We need to clear it after drawing */
 void DRW_cache_gpencil_sbuffer_clear(Object *ob)
 {
   bGPdata *gpd = (bGPdata *)ob->data;
-  /* Current stroke data is stored in the original id. This is waiting refactor of the
-   * Depsgraph to support more granular update of the GPencil data. */
-  bGPdata *gpd_orig = (bGPdata *)DEG_get_original_id(&gpd->id);
-
-  MEM_SAFE_FREE(gpd_orig->runtime.sbuffer_gps);
-  GPU_BATCH_DISCARD_SAFE(gpd_orig->runtime.sbuffer_fill_batch);
-  GPU_BATCH_DISCARD_SAFE(gpd_orig->runtime.sbuffer_stroke_batch);
+  MEM_SAFE_FREE(gpd->runtime.sbuffer_gps);
+  GPU_BATCH_DISCARD_SAFE(gpd->runtime.sbuffer_fill_batch);
+  GPU_BATCH_DISCARD_SAFE(gpd->runtime.sbuffer_stroke_batch);
 }
 
 /** \} */
diff --git a/source/blender/editors/gpencil/gpencil_paint.c b/source/blender/editors/gpencil/gpencil_paint.c
index 8b985988cb6..b85c0946ceb 100644
--- a/source/blender/editors/gpencil/gpencil_paint.c
+++ b/source/blender/editors/gpencil/gpencil_paint.c
@@ -836,6 +836,9 @@ static short gp_stroke_addpoint(tGPsdata *p, const float mval[2], float pressure
       }
     }
 
+    /* Update evaluated data. */
+    ED_gpencil_sbuffer_update_eval(p->depsgraph, p->ob);
+
     return GP_STROKEADD_NORMAL;
   }
   /* return invalid state for now... */
diff --git a/source/blender/editors/gpencil/gpencil_primitive.c b/source/blender/editors/gpencil/gpencil_primitive.c
index 11fb161a280..3ed380fe162 100644
--- a/source/blender/editors/gpencil/gpencil_primitive.c
+++ b/source/blender/editors/gpencil/gpencil_primitive.c
@@ -1052,6 +1052,9 @@ static void gp_primitive_update_strokes(bContext *C, tGPDprimitive *tgpi)
   /* Calc geometry data. */
   BKE_gpencil_stroke_geometry_update(gps);
 
+  /* Update evaluated data. */
+  ED_gpencil_sbuffer_update_eval(tgpi->depsgraph, tgpi->ob);
+
   MEM_SAFE_FREE(depth_arr);
 
   DEG_id_tag_update(&gpd->id, ID_RECALC_COPY_ON_WRITE);
diff --git a/source/blender/editors/gpencil/gpencil_utils.c b/source/blender/editors/gpencil/gpencil_utils.c
index 51e5d839290..b9297fd97bf 100644
--- a/source/blender/editors/gpencil/gpencil_utils.c
+++ b/source/blender/editors/gpencil/gpencil_utils.c
@@ -2474,6 +2474,21 @@ tGPspoint *ED_gpencil_sbuffer_ensure(tGPspoint *buffer_array,
   return buffer_array;
 }
 
+void ED_gpencil_sbuffer_update_eval(Depsgraph *depsgraph, Object *ob)
+{
+  bGPdata *gpd = (bGPdata *)ob->data;
+
+  Object *ob_eval = (Object *)DEG_get_evaluated_id(depsgraph, &ob->id);
+  bGPdata *gpd_eval = (bGPdata *)ob_eval->data;
+
+  gpd_eval->runtime.sbuffer = gpd->runtime.sbuffer;
+  gpd_eval->runtime.sbuffer_sflag = gpd->runtime.sbuffer_sflag;
+  gpd_eval->runtime.sbuffer_used = gpd->runtime.sbuffer_used;
+  gpd_eval->runtime.sbuffer_size = gpd->runtime.sbuffer_size;
+  gpd_eval->runtime.tot_cp_points = gpd->runtime.tot_cp_points;
+  gpd_eval->runtime.cp_points = gpd->runtime.cp_points;
+}
+
 /* Tag all scene grease pencil object to update. */
 void ED_gpencil_tag_scene_gpencil(Scene *scene)
 {
diff --git a/source/blender/editors/include/ED_gpencil.h b/source/blender/editors/include/ED_gpencil.h
index 43d4fd5cebe..40cc7486490 100644
--- a/source/blender/editors/include/ED_gpencil.h
+++ b/source/blender/editors/include/ED_gpencil.h
@@ -287,6 +287,8 @@ struct tGPspoint *ED_gpencil_sbuffer_ensure(struct tGPspoint *buffer_array,
                                             int *buffer_size,
                                             int *buffer_used,
                                             const bool clear);
+void ED_gpencil_sbuffer_update_eval(struct Depsgraph *depsgraph, struct Object *ob);
+
 /* Tag all scene grease pencil object to update. */
 void ED_gpencil_tag_scene_gpencil(struct Scene *scene);



More information about the Bf-blender-cvs mailing list