[Bf-blender-cvs] [073ef79840b] greasepencil-object: Fix T51936: Show draw strokes since first stroke

Antonio Vazquez noreply at git.blender.org
Fri Jun 30 15:34:48 CEST 2017


Commit: 073ef79840b5898ef0efc59c3815ac6e2faae405
Author: Antonio Vazquez
Date:   Fri Jun 30 15:34:34 2017 +0200
Branches: greasepencil-object
https://developer.blender.org/rB073ef79840b5898ef0efc59c3815ac6e2faae405

Fix T51936: Show draw strokes since first stroke

The drawing stroke must not be related to cache drawing because only one stroke is done at time.

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

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

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

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 c79bbc7418d..3905e0724b9 100644
--- a/source/blender/draw/engines/gpencil/gpencil_draw_cache_impl.c
+++ b/source/blender/draw/engines/gpencil/gpencil_draw_cache_impl.c
@@ -200,9 +200,6 @@ void gpencil_batch_cache_clear(bGPdata *gpd)
 		MEM_SAFE_FREE(cache->batch_fill);
 		MEM_SAFE_FREE(cache->batch_edit);
 	}
-
-	BATCH_DISCARD_ALL_SAFE(cache->batch_buffer_stroke);
-	BATCH_DISCARD_ALL_SAFE(cache->batch_buffer_fill);
 }
 
 /* get cache */
@@ -505,7 +502,7 @@ static void gpencil_draw_strokes(GpencilBatchCache *cache, GPENCIL_e_data *e_dat
 }
 
  /* draw stroke in drawing buffer */
-static void gpencil_draw_buffer_strokes(GpencilBatchCache *cache, void *vedata, ToolSettings *ts, bGPdata *gpd)
+void DRW_gpencil_populate_buffer_strokes(void *vedata, ToolSettings *ts, bGPdata *gpd)
 {
 	GPENCIL_StorageList *stl = ((GPENCIL_Data *)vedata)->stl;
 	bGPDbrush *brush = BKE_gpencil_brush_getactive(ts);
@@ -522,21 +519,21 @@ static void gpencil_draw_buffer_strokes(GpencilBatchCache *cache, void *vedata,
 			*/
 			short lthick = brush->thickness;
 			if (gpd->sbuffer_size == 1) {
-				cache->batch_buffer_stroke = DRW_gpencil_get_buffer_point_geom(gpd, lthick);
-				DRW_shgroup_call_add(stl->g_data->shgrps_point_volumetric, cache->batch_buffer_stroke, stl->storage->unit_matrix);
+				stl->g_data->batch_buffer_stroke = DRW_gpencil_get_buffer_point_geom(gpd, lthick);
+				DRW_shgroup_call_add(stl->g_data->shgrps_point_volumetric, stl->g_data->batch_buffer_stroke, stl->storage->unit_matrix);
 			}
 			else {
 				/* use unit matrix because the buffer is in screen space and does not need conversion */
-				cache->batch_buffer_stroke = DRW_gpencil_get_buffer_stroke_geom(gpd, stl->storage->unit_matrix, lthick);
-				DRW_shgroup_call_add(stl->g_data->shgrps_drawing_stroke, cache->batch_buffer_stroke, stl->storage->unit_matrix);
+				stl->g_data->batch_buffer_stroke = DRW_gpencil_get_buffer_stroke_geom(gpd, stl->storage->unit_matrix, lthick);
+				DRW_shgroup_call_add(stl->g_data->shgrps_drawing_stroke, stl->g_data->batch_buffer_stroke, stl->storage->unit_matrix);
 
 				if ((gpd->sbuffer_size >= 3) && (gpd->sfill[3] > GPENCIL_ALPHA_OPACITY_THRESH)) {
 					/* if not solid, fill is simulated with solid color */
 					if (gpd->bfill_style > 0) {
 						gpd->sfill[3] = 0.5f;
 					}
-					cache->batch_buffer_fill = DRW_gpencil_get_buffer_fill_geom(gpd->sbuffer, gpd->sbuffer_size, gpd->sfill);
-					DRW_shgroup_call_add(stl->g_data->shgrps_drawing_fill, cache->batch_buffer_fill, stl->storage->unit_matrix);
+					stl->g_data->batch_buffer_fill = DRW_gpencil_get_buffer_fill_geom(gpd->sbuffer, gpd->sbuffer_size, gpd->sfill);
+					DRW_shgroup_call_add(stl->g_data->shgrps_drawing_fill, stl->g_data->batch_buffer_fill, stl->storage->unit_matrix);
 				}
 			}
 		}
@@ -644,8 +641,6 @@ void DRW_gpencil_populate_datablock(GPENCIL_e_data *e_data, void *vedata, Scene
 		/* draw normal strokes */
 		gpencil_draw_strokes(cache, e_data, vedata, ts, ob, gpd, gpl, gpf, gpl->opacity, gpl->tintcolor, false, false);
 	}
-	/* draw current painting strokes */
-	gpencil_draw_buffer_strokes(cache, vedata, ts, gpd);
 	cache->is_dirty = false;
 }
 
diff --git a/source/blender/draw/engines/gpencil/gpencil_engine.c b/source/blender/draw/engines/gpencil/gpencil_engine.c
index 1e3a8df2379..80817da3a02 100644
--- a/source/blender/draw/engines/gpencil/gpencil_engine.c
+++ b/source/blender/draw/engines/gpencil/gpencil_engine.c
@@ -173,6 +173,9 @@ static void GPENCIL_cache_init(void *vedata)
 static void GPENCIL_cache_populate(void *vedata, Object *ob)
 {
 	GPENCIL_StorageList *stl = ((GPENCIL_Data *)vedata)->stl;
+	const DRWContextState *draw_ctx = DRW_context_state_get();
+	Scene *scene = draw_ctx->scene;
+	ToolSettings *ts = scene->toolsettings;
 
 	/* object datablock (this is not draw now) */
 	if (ob->type == OB_GPENCIL && ob->gpd) {
@@ -183,6 +186,9 @@ static void GPENCIL_cache_populate(void *vedata, Object *ob)
 		stl->g_data->gp_object_cache = gpencil_object_cache_allocate(stl->g_data->gp_object_cache, &stl->g_data->gp_cache_size, &stl->g_data->gp_cache_used);
 		/* add for drawing later */
 		gpencil_object_cache_add(stl->g_data->gp_object_cache, ob, &stl->g_data->gp_cache_used);
+		
+		/* draw current painting strokes */
+		DRW_gpencil_populate_buffer_strokes(vedata, ts, ob->gpd);
 	}
 }
 
@@ -298,9 +304,6 @@ static void GPENCIL_draw_scene(void *vedata)
 		/* edit points */
 		DRW_draw_pass(psl->edit_pass);
 
-		/* current drawing buffer */
-		DRW_draw_pass(psl->drawing_pass);
-
 		/* detach temp textures */
 		DRW_framebuffer_texture_detach(e_data.temp_fbcolor_depth_tx);
 		DRW_framebuffer_texture_detach(e_data.temp_fbcolor_color_tx);
@@ -310,6 +313,9 @@ static void GPENCIL_draw_scene(void *vedata)
 	}
 	/* free memory */
 	MEM_SAFE_FREE(stl->g_data->gp_object_cache);
+
+	/* current drawing buffer */
+	DRW_draw_pass(psl->drawing_pass);
 }
 
 static const DrawEngineDataSize GPENCIL_data_size = DRW_VIEWPORT_DATA_SIZE(GPENCIL_Data);
diff --git a/source/blender/draw/engines/gpencil/gpencil_engine.h b/source/blender/draw/engines/gpencil/gpencil_engine.h
index 26f281e4f37..2fec8d9e87c 100644
--- a/source/blender/draw/engines/gpencil/gpencil_engine.h
+++ b/source/blender/draw/engines/gpencil/gpencil_engine.h
@@ -100,6 +100,10 @@ typedef struct g_data {
 	struct DRWShadingGroup *shgrps_drawing_stroke;
 	struct DRWShadingGroup *shgrps_drawing_fill;
 
+	/* for buffer only one batch is nedeed because the drawing is only of one stroke */
+	Gwn_Batch *batch_buffer_stroke;
+	Gwn_Batch *batch_buffer_fill;
+
 	int gp_cache_used;
 	int gp_cache_size;
 	struct tGPencilObjectCache *gp_object_cache;
@@ -130,10 +134,6 @@ typedef struct GpencilBatchCache {
 	Gwn_Batch **batch_fill;
 	Gwn_Batch **batch_edit;
 
-	/* for buffer only one batch is nedeed because the drawing is only of one stroke */
-	Gwn_Batch *batch_buffer_stroke;
-	Gwn_Batch *batch_buffer_fill;
-
 	/* settings to determine if cache is invalid */
 	bool is_dirty;
 	bool is_editmode;
@@ -150,6 +150,7 @@ struct DRWShadingGroup *DRW_gpencil_shgroup_edit_volumetric_create(struct DRWPas
 struct DRWShadingGroup *DRW_gpencil_shgroup_drawing_fill_create(struct DRWPass *pass, struct GPUShader *shader);
 
 void DRW_gpencil_populate_datablock(struct GPENCIL_e_data *e_data, void *vedata, struct Scene *scene, struct Object *ob, struct ToolSettings *ts, struct bGPdata *gpd);
+void DRW_gpencil_populate_buffer_strokes(void *vedata, struct ToolSettings *ts, struct bGPdata *gpd);
 
 struct Gwn_Batch *DRW_gpencil_get_point_geom(struct bGPDspoint *pt, short thickness, const float ink[4]);
 struct Gwn_Batch *DRW_gpencil_get_stroke_geom(struct bGPDframe *gpf, struct bGPDstroke *gps, short thickness, const float ink[4]);




More information about the Bf-blender-cvs mailing list