[Bf-blender-cvs] [c6cf0b9999a] greasepencil-object: GPencil: Move Runtime Cache data definition to BKE

Antonioya noreply at git.blender.org
Sat May 4 10:59:47 CEST 2019


Commit: c6cf0b9999ab67af1f45b3865f6dbe6240c92de8
Author: Antonioya
Date:   Sat May 4 10:52:37 2019 +0200
Branches: greasepencil-object
https://developer.blender.org/rBc6cf0b9999ab67af1f45b3865f6dbe6240c92de8

GPencil: Move Runtime Cache data definition to BKE

This is the first step to prepare the code for using the modifiers data in Edit mode.

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

M	source/blender/blenkernel/BKE_gpencil.h
M	source/blender/draw/engines/gpencil/gpencil_cache_utils.c
M	source/blender/draw/engines/gpencil/gpencil_draw_cache_impl.c
M	source/blender/draw/engines/gpencil/gpencil_engine.h

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

diff --git a/source/blender/blenkernel/BKE_gpencil.h b/source/blender/blenkernel/BKE_gpencil.h
index 2e5d5911239..9429ce36830 100644
--- a/source/blender/blenkernel/BKE_gpencil.h
+++ b/source/blender/blenkernel/BKE_gpencil.h
@@ -49,6 +49,50 @@ struct bGPdata;
 struct MDeformVert;
 struct MDeformWeight;
 
+struct GPUBatch;
+struct GPUVertBuf;
+struct GPUVertFormat;
+struct GpencilBatchGroup;
+
+/* GPUBatch Cache Element */
+typedef struct GpencilBatchCacheElem {
+  struct GPUBatch *batch;
+  struct GPUVertBuf *vbo;
+  int vbo_len;
+  /* attr ids */
+  struct GPUVertFormat *format;
+  uint pos_id;
+  uint color_id;
+  uint thickness_id;
+  uint uvdata_id;
+  uint prev_pos_id;
+
+  /* size for VBO alloc */
+  int tot_vertex;
+} GpencilBatchCacheElem;
+
+/* Runtime data for GPU and derived frames after applying modifiers */
+typedef struct GpencilBatchCache {
+  struct GpencilBatchCacheElem b_stroke;
+  struct GpencilBatchCacheElem b_point;
+  struct GpencilBatchCacheElem b_fill;
+  struct GpencilBatchCacheElem b_edit;
+  struct GpencilBatchCacheElem b_edlin;
+
+  /* settings to determine if cache is invalid */
+  bool is_dirty;
+  bool is_editmode;
+  int cache_frame;
+
+  /* data with the shading groups */
+  int grp_used;                        /* total groups in arrays */
+  int grp_size;                        /* max size of the array */
+  struct GpencilBatchGroup *grp_cache; /* array of elements */
+
+  int tot_layers;
+  struct bGPDframe *derived_array; /* runtime data created by modifiers */
+} GpencilBatchCache;
+
 /* ------------ Grease-Pencil API ------------------ */
 
 void BKE_gpencil_free_point_weights(struct MDeformVert *dvert);
diff --git a/source/blender/draw/engines/gpencil/gpencil_cache_utils.c b/source/blender/draw/engines/gpencil/gpencil_cache_utils.c
index 67ffe62f3c6..9b833a99d30 100644
--- a/source/blender/draw/engines/gpencil/gpencil_cache_utils.c
+++ b/source/blender/draw/engines/gpencil/gpencil_cache_utils.c
@@ -301,6 +301,13 @@ static void gpencil_batch_cache_clear(GpencilBatchCache *cache)
   MEM_SAFE_FREE(cache->b_edit.batch);
   MEM_SAFE_FREE(cache->b_edlin.batch);
 
+  /* internal format data */
+  MEM_SAFE_FREE(cache->b_stroke.format);
+  MEM_SAFE_FREE(cache->b_point.format);
+  MEM_SAFE_FREE(cache->b_fill.format);
+  MEM_SAFE_FREE(cache->b_edit.format);
+  MEM_SAFE_FREE(cache->b_edlin.format);
+
   MEM_SAFE_FREE(cache->grp_cache);
   cache->grp_size = 0;
   cache->grp_used = 0;
diff --git a/source/blender/draw/engines/gpencil/gpencil_draw_cache_impl.c b/source/blender/draw/engines/gpencil/gpencil_draw_cache_impl.c
index 7dabbcf4c41..9849c23c947 100644
--- a/source/blender/draw/engines/gpencil/gpencil_draw_cache_impl.c
+++ b/source/blender/draw/engines/gpencil/gpencil_draw_cache_impl.c
@@ -129,6 +129,13 @@ static void gpencil_vbo_ensure_size(GpencilBatchCacheElem *be, int totvertex)
   }
 }
 
+static void gpencil_elem_format_ensure(GpencilBatchCacheElem *be)
+{
+  if (be->format == NULL) {
+    be->format = MEM_callocN(sizeof(GPUVertFormat), __func__);
+  }
+}
+
 /* create batch geometry data for points stroke shader */
 void DRW_gpencil_get_point_geom(GpencilBatchCacheElem *be,
                                 bGPDstroke *gps,
@@ -137,16 +144,17 @@ void DRW_gpencil_get_point_geom(GpencilBatchCacheElem *be,
 {
   int totvertex = gps->totpoints;
   if (be->vbo == NULL) {
-    be->pos_id = GPU_vertformat_attr_add(&be->format, "pos", GPU_COMP_F32, 3, GPU_FETCH_FLOAT);
-    be->color_id = GPU_vertformat_attr_add(&be->format, "color", GPU_COMP_F32, 4, GPU_FETCH_FLOAT);
+    gpencil_elem_format_ensure(be);
+    be->pos_id = GPU_vertformat_attr_add(be->format, "pos", GPU_COMP_F32, 3, GPU_FETCH_FLOAT);
+    be->color_id = GPU_vertformat_attr_add(be->format, "color", GPU_COMP_F32, 4, GPU_FETCH_FLOAT);
     be->thickness_id = GPU_vertformat_attr_add(
-        &be->format, "thickness", GPU_COMP_F32, 1, GPU_FETCH_FLOAT);
+        be->format, "thickness", GPU_COMP_F32, 1, GPU_FETCH_FLOAT);
     be->uvdata_id = GPU_vertformat_attr_add(
-        &be->format, "uvdata", GPU_COMP_F32, 2, GPU_FETCH_FLOAT);
+        be->format, "uvdata", GPU_COMP_F32, 2, GPU_FETCH_FLOAT);
     be->prev_pos_id = GPU_vertformat_attr_add(
-        &be->format, "prev_pos", GPU_COMP_F32, 3, GPU_FETCH_FLOAT);
+        be->format, "prev_pos", GPU_COMP_F32, 3, GPU_FETCH_FLOAT);
 
-    be->vbo = GPU_vertbuf_create_with_format(&be->format);
+    be->vbo = GPU_vertbuf_create_with_format(be->format);
     GPU_vertbuf_data_alloc(be->vbo, be->tot_vertex);
     be->vbo_len = 0;
   }
@@ -214,14 +222,15 @@ void DRW_gpencil_get_stroke_geom(struct GpencilBatchCacheElem *be,
   int totvertex = totpoints + cyclic_add + 2;
 
   if (be->vbo == NULL) {
-    be->pos_id = GPU_vertformat_attr_add(&be->format, "pos", GPU_COMP_F32, 3, GPU_FETCH_FLOAT);
-    be->color_id = GPU_vertformat_attr_add(&be->format, "color", GPU_COMP_F32, 4, GPU_FETCH_FLOAT);
+    gpencil_elem_format_ensure(be);
+    be->pos_id = GPU_vertformat_attr_add(be->format, "pos", GPU_COMP_F32, 3, GPU_FETCH_FLOAT);
+    be->color_id = GPU_vertformat_attr_add(be->format, "color", GPU_COMP_F32, 4, GPU_FETCH_FLOAT);
     be->thickness_id = GPU_vertformat_attr_add(
-        &be->format, "thickness", GPU_COMP_F32, 1, GPU_FETCH_FLOAT);
+        be->format, "thickness", GPU_COMP_F32, 1, GPU_FETCH_FLOAT);
     be->uvdata_id = GPU_vertformat_attr_add(
-        &be->format, "uvdata", GPU_COMP_F32, 2, GPU_FETCH_FLOAT);
+        be->format, "uvdata", GPU_COMP_F32, 2, GPU_FETCH_FLOAT);
 
-    be->vbo = GPU_vertbuf_create_with_format(&be->format);
+    be->vbo = GPU_vertbuf_create_with_format(be->format);
     GPU_vertbuf_data_alloc(be->vbo, be->tot_vertex);
     be->vbo_len = 0;
   }
@@ -327,12 +336,13 @@ void DRW_gpencil_get_fill_geom(struct GpencilBatchCacheElem *be,
   int totvertex = gps->tot_triangles * 3;
 
   if (be->vbo == NULL) {
-    be->pos_id = GPU_vertformat_attr_add(&be->format, "pos", GPU_COMP_F32, 3, GPU_FETCH_FLOAT);
-    be->color_id = GPU_vertformat_attr_add(&be->format, "color", GPU_COMP_F32, 4, GPU_FETCH_FLOAT);
+    gpencil_elem_format_ensure(be);
+    be->pos_id = GPU_vertformat_attr_add(be->format, "pos", GPU_COMP_F32, 3, GPU_FETCH_FLOAT);
+    be->color_id = GPU_vertformat_attr_add(be->format, "color", GPU_COMP_F32, 4, GPU_FETCH_FLOAT);
     be->uvdata_id = GPU_vertformat_attr_add(
-        &be->format, "texCoord", GPU_COMP_F32, 2, GPU_FETCH_FLOAT);
+        be->format, "texCoord", GPU_COMP_F32, 2, GPU_FETCH_FLOAT);
 
-    be->vbo = GPU_vertbuf_create_with_format(&be->format);
+    be->vbo = GPU_vertbuf_create_with_format(be->format);
     GPU_vertbuf_data_alloc(be->vbo, be->tot_vertex);
     be->vbo_len = 0;
   }
@@ -725,12 +735,13 @@ void DRW_gpencil_get_edit_geom(struct GpencilBatchCacheElem *be,
   unselectColor[3] = alpha;
 
   if (be->vbo == NULL) {
-    be->pos_id = GPU_vertformat_attr_add(&be->format, "pos", GPU_COMP_F32, 3, GPU_FETCH_FLOAT);
-    be->color_id = GPU_vertformat_attr_add(&be->format, "color", GPU_COMP_F32, 4, GPU_FETCH_FLOAT);
+    gpencil_elem_format_ensure(be);
+    be->pos_id = GPU_vertformat_attr_add(be->format, "pos", GPU_COMP_F32, 3, GPU_FETCH_FLOAT);
+    be->color_id = GPU_vertformat_attr_add(be->format, "color", GPU_COMP_F32, 4, GPU_FETCH_FLOAT);
     be->thickness_id = GPU_vertformat_attr_add(
-        &be->format, "size", GPU_COMP_F32, 1, GPU_FETCH_FLOAT);
+        be->format, "size", GPU_COMP_F32, 1, GPU_FETCH_FLOAT);
 
-    be->vbo = GPU_vertbuf_create_with_format(&be->format);
+    be->vbo = GPU_vertbuf_create_with_format(be->format);
     GPU_vertbuf_data_alloc(be->vbo, be->tot_vertex);
     be->vbo_len = 0;
   }
@@ -810,10 +821,11 @@ void DRW_gpencil_get_edlin_geom(struct GpencilBatchCacheElem *be,
   copy_v4_v4(linecolor, gpd->line_color);
 
   if (be->vbo == NULL) {
-    be->pos_id = GPU_vertformat_attr_add(&be->format, "pos", GPU_COMP_F32, 3, GPU_FETCH_FLOAT);
-    be->color_id = GPU_vertformat_attr_add(&be->format, "color", GPU_COMP_F32, 4, GPU_FETCH_FLOAT);
+    gpencil_elem_format_ensure(be);
+    be->pos_id = GPU_vertformat_attr_add(be->format, "pos", GPU_COMP_F32, 3, GPU_FETCH_FLOAT);
+    be->color_id = GPU_vertformat_attr_add(be->format, "color", GPU_COMP_F32, 4, GPU_FETCH_FLOAT);
 
-    be->vbo = GPU_vertbuf_create_with_format(&be->format);
+    be->vbo = GPU_vertbuf_create_with_format(be->format);
     GPU_vertbuf_data_alloc(be->vbo, be->tot_vertex);
     be->vbo_len = 0;
   }
diff --git a/source/blender/draw/engines/gpencil/gpencil_engine.h b/source/blender/draw/engines/gpencil/gpencil_engine.h
index 2ac1dc3211c..ba5ee72fd95 100644
--- a/source/blender/draw/engines/gpencil/gpencil_engine.h
+++ b/source/blender/draw/engines/gpencil/gpencil_engine.h
@@ -34,6 +34,8 @@ struct RenderEngine;
 struct RenderLayer;
 struct bGPDstroke;
 struct tGPspoint;
+struct GpencilBatchCache;
+struct GpencilBatchCacheElem;
 
 #define GPENCIL_CACHE_BLOCK_SIZE 8
 #define GPENCIL_MAX_SHGROUPS 65536
@@ -345,23 +347,6 @@ typedef struct GPENCIL_e_data {
 
 } GPENCIL_e_data; /* Engine data */
 
-/* GPUBatch Cache */
-typedef struct GpencilBatchCacheElem {
-  GPUBatch *batch;
-  GPUVertBuf *vbo;
-  int vbo_len;
-  /* attr ids */
-  GPUVertFormat format;
-  uint pos_id;
-  uint color_id;
-  uint thickness_id;
-  uint uvdata_id;
-  uint prev_pos_id;
-
-  /* size for VBO alloc */
-  int tot_vertex;
-} GpencilBatchCacheElem;
-
 typedef struct GpencilBatchGroup {
   bGPDlayer *gpl;  /* reference to original layer */
   bGPDframe *gpf;  /* reference to original frame */
@@ -379,27 +364,6 @@ typedef enum GpencilBatchGroup_Type {
   eGpencilBatchGroupType_Edlin = 5,
 } GpencilBatchGroup_Type;
 
-typedef struct GpencilBatchCache {
-  GpencilBatchCacheElem b_stroke;
-  GpencilBatchCacheElem b_point;
-  GpencilBatchCacheElem b_fill;
-  GpencilBatchCacheElem b_edit;
-  GpencilBatchCacheElem b_edlin;
-
-  /* settings to determine if cache is invalid */
-  bool is_dirty;
-  bool is_editmode;
-  int cache_frame;
-
-  /* data with the shading groups */
-  int grp_used;                        /* total groups in arrays */
-  int grp_size;                        /* max size of the array */
-  struct GpencilBatchGroup *grp_cache; /* array of elements */
-
-  int tot_layers;
-  struct bGPDframe *der

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list