[Bf-blender-cvs] [c1518938d86] greasepencil-object: Draw several frames when multiedit is enabled

Antonio Vazquez noreply at git.blender.org
Tue Aug 29 16:10:31 CEST 2017


Commit: c1518938d86ff6b162edd1d5e885811cdbbd2a28
Author: Antonio Vazquez
Date:   Tue Aug 29 11:46:05 2017 +0200
Branches: greasepencil-object
https://developer.blender.org/rBc1518938d86ff6b162edd1d5e885811cdbbd2a28

Draw several frames when multiedit is enabled

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

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 7fab3c5a347..3ab62fd5be8 100644
--- a/source/blender/draw/engines/gpencil/gpencil_draw_cache_impl.c
+++ b/source/blender/draw/engines/gpencil/gpencil_draw_cache_impl.c
@@ -688,18 +688,19 @@ static void gpencil_draw_strokes(GpencilBatchCache *cache, GPENCIL_e_data *e_dat
 	DRWShadingGroup *fillgrp;
 	DRWShadingGroup *strokegrp;
 	float viewmatrix[4][4];
+	bool is_multiedit = (bool)GPENCIL_MULTIEDIT_SESSIONS_ON(gpd);
 
 	/* get parent matrix and save as static data */
 	ED_gpencil_parent_location(ob, gpd, gpl, viewmatrix);
 	copy_m4_m4(derived_gpf->viewmatrix, viewmatrix);
 
 	/* initialization steps */
-	if ((cache->is_dirty) && (ob->modifiers.first)) {
+	if ((cache->is_dirty) && (ob->modifiers.first) && (!is_multiedit)) {
 		BKE_gpencil_reset_modifiers(ob);
 	}
 
 	/* apply geometry modifiers */
-	if ((cache->is_dirty) && (ob->modifiers.first)) {
+	if ((cache->is_dirty) && (ob->modifiers.first) && (!is_multiedit)) {
 		if (BKE_gpencil_has_geometry_modifiers(ob)) {
 			BKE_gpencil_geometry_modifiers(ob, gpl, derived_gpf);
 		}
@@ -751,7 +752,7 @@ static void gpencil_draw_strokes(GpencilBatchCache *cache, GPENCIL_e_data *e_dat
 		strokegrp = stl->shgroups[id].shgrps_stroke;
 
 		/* apply modifiers (only modify geometry, but not create ) */
-		if ((cache->is_dirty) && (ob->modifiers.first)) {
+		if ((cache->is_dirty) && (ob->modifiers.first) && (!is_multiedit)) {
 			BKE_gpencil_stroke_modifiers(ob, gpl, derived_gpf, gps);
 		}
 		/* fill */
@@ -923,6 +924,47 @@ static void gpencil_draw_onionskins(GpencilBatchCache *cache, GPENCIL_e_data *e_
 	}
 }
 
+/* populate a datablock for multiedit (no onions, no modifiers) */
+void DRW_gpencil_populate_multiedit(GPENCIL_e_data *e_data, void *vedata, Scene *scene, Object *ob, ToolSettings *ts, bGPdata *gpd)
+{
+	ListBase tmp_frames = { NULL, NULL };
+	bGPDframe *gpf = NULL;
+
+	GPENCIL_StorageList *stl = ((GPENCIL_Data *)vedata)->stl;
+	GpencilBatchCache *cache = gpencil_batch_cache_get(ob, CFRA);
+	cache->cache_idx = 0;
+
+	/* check if playing animation */
+	bool playing = (bool)stl->storage->playing;
+
+	/* draw strokes */
+	for (bGPDlayer *gpl = gpd->layers.first; gpl; gpl = gpl->next) {
+		/* don't draw layer if hidden */
+		if (gpl->flag & GP_LAYER_HIDE)
+			continue;
+
+		/* list of frames to draw */
+		if (!playing) {
+			for (gpf = gpl->frames.first; gpf; gpf = gpf->next) {
+				if ((gpf == gpl->actframe) || (gpf->flag & GP_FRAME_SELECT)) {
+					gpencil_draw_strokes(cache, e_data, vedata, ts, ob, gpd, gpl, gpf, gpf,
+						gpl->opacity, gpl->tintcolor, false);
+				}
+			}
+		}
+		else {
+			gpf = BKE_gpencil_layer_getframe(gpl, CFRA, 0);
+			if (gpf) {
+				gpencil_draw_strokes(cache, e_data, vedata, ts, ob, gpd, gpl, gpf, gpf,
+					gpl->opacity, gpl->tintcolor, false);
+			}
+		}
+
+	}
+
+	cache->is_dirty = false;
+}
+
 /* helper for populate a complete grease pencil datablock */
 void DRW_gpencil_populate_datablock(GPENCIL_e_data *e_data, void *vedata, Scene *scene, Object *ob, ToolSettings *ts, bGPdata *gpd)
 {
diff --git a/source/blender/draw/engines/gpencil/gpencil_engine.c b/source/blender/draw/engines/gpencil/gpencil_engine.c
index f4c04afca05..17fae17e9fb 100644
--- a/source/blender/draw/engines/gpencil/gpencil_engine.c
+++ b/source/blender/draw/engines/gpencil/gpencil_engine.c
@@ -37,6 +37,7 @@
 #include "gpencil_engine.h"
 
 #include "ED_screen.h"
+#include "ED_gpencil.h"
 
 extern char datatoc_gpencil_fill_vert_glsl[];
 extern char datatoc_gpencil_fill_frag_glsl[];
@@ -327,6 +328,7 @@ static void GPENCIL_cache_finish(void *vedata)
 	Scene *scene = draw_ctx->scene;
 	ToolSettings *ts = scene->toolsettings;
 	tGPencilObjectCache *cache;
+	bool is_multiedit = false; 
 
 	/* Draw all pending objects */
 	if (stl->g_data->gp_cache_used > 0) {
@@ -336,7 +338,13 @@ static void GPENCIL_cache_finish(void *vedata)
 			stl->g_data->gp_object_cache[i].init_grp = stl->storage->shgroup_id;
 
 			/* fill shading groups */
-			DRW_gpencil_populate_datablock(&e_data, vedata, scene, ob, ts, ob->gpd);
+			is_multiedit = (bool)GPENCIL_MULTIEDIT_SESSIONS_ON(ob->gpd);
+			if (!is_multiedit) {
+				DRW_gpencil_populate_datablock(&e_data, vedata, scene, ob, ts, ob->gpd);
+			}
+			else {
+				DRW_gpencil_populate_multiedit(&e_data, vedata, scene, ob, ts, ob->gpd);
+			}
 
 			/* save end shading group */
 			stl->g_data->gp_object_cache[i].end_grp = stl->storage->shgroup_id - 1;
@@ -346,7 +354,7 @@ static void GPENCIL_cache_finish(void *vedata)
 			}
 			/* VFX pass */
 			cache = &stl->g_data->gp_object_cache[i];
-			if (ob->modifiers.first) {
+			if ((!is_multiedit) && (ob->modifiers.first)) {
 				DRW_gpencil_vfx_modifiers(i, &e_data, vedata, ob, cache);
 			}
 		}
diff --git a/source/blender/draw/engines/gpencil/gpencil_engine.h b/source/blender/draw/engines/gpencil/gpencil_engine.h
index b1a68d38198..3f60ba9f98c 100644
--- a/source/blender/draw/engines/gpencil/gpencil_engine.h
+++ b/source/blender/draw/engines/gpencil/gpencil_engine.h
@@ -243,6 +243,7 @@ struct DRWShadingGroup *DRW_gpencil_shgroup_drawing_fill_create(struct DRWPass *
 
 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);
+void DRW_gpencil_populate_multiedit(struct GPENCIL_e_data *e_data, void *vedata, struct Scene *scene, struct Object *ob, struct ToolSettings *ts, struct bGPdata *gpd);
 
 struct Gwn_Batch *DRW_gpencil_get_point_geom(struct bGPDstroke *gps, 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