[Bf-blender-cvs] [a9a37ac46c7] greasepencil-object: Fix problem of VFX double drawing

Antonio Vazquez noreply at git.blender.org
Tue Aug 8 11:19:16 CEST 2017


Commit: a9a37ac46c7c4ed0853b062852986affd766ed85
Author: Antonio Vazquez
Date:   Mon Aug 7 10:52:00 2017 +0200
Branches: greasepencil-object
https://developer.blender.org/rBa9a37ac46c7c4ed0853b062852986affd766ed85

Fix problem of VFX double drawing

The vfx pass needs a separate framebuffer to avoid double drawing of the strokes.

If necessary, a full copy of the initial texture is done to be used by all vfx modifiers.

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

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

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

diff --git a/source/blender/draw/engines/gpencil/gpencil_engine.c b/source/blender/draw/engines/gpencil/gpencil_engine.c
index a6d22ee8446..9044549a702 100644
--- a/source/blender/draw/engines/gpencil/gpencil_engine.c
+++ b/source/blender/draw/engines/gpencil/gpencil_engine.c
@@ -70,6 +70,16 @@ static void GPENCIL_engine_init(void *vedata)
 		(int)viewport_size[0], (int)viewport_size[1],
 		tex_color, ARRAY_SIZE(tex_color));
 
+	/* vfx */
+	DRWFboTexture vfx_color[2] = { {
+			&e_data.vfx_fbcolor_depth_tx, DRW_TEX_DEPTH_24, DRW_TEX_TEMP },
+			{ &e_data.vfx_fbcolor_color_tx, DRW_TEX_RGBA_16, DRW_TEX_TEMP }
+	};
+	DRW_framebuffer_init(
+		&fbl->vfx_color_fb, &draw_engine_gpencil_type,
+		(int)viewport_size[0], (int)viewport_size[1],
+		vfx_color, ARRAY_SIZE(vfx_color));
+
 	/* normal fill shader */
 	if (!e_data.gpencil_fill_sh) {
 		e_data.gpencil_fill_sh = DRW_shader_create(datatoc_gpencil_fill_vert_glsl, NULL,
@@ -222,13 +232,20 @@ static void GPENCIL_cache_init(void *vedata)
 
 		/* we need a full screen pass to combine the result of zdepth */
 		struct Gwn_Batch *quad = DRW_cache_fullscreen_quad_get();
-
 		psl->mix_pass = DRW_pass_create("GPencil Mix Pass", DRW_STATE_WRITE_COLOR | DRW_STATE_BLEND | DRW_STATE_WRITE_DEPTH | DRW_STATE_DEPTH_LESS);
 		DRWShadingGroup *mix_shgrp = DRW_shgroup_create(e_data.gpencil_fullscreen_sh, psl->mix_pass);
 		DRW_shgroup_call_add(mix_shgrp, quad, NULL);
 		DRW_shgroup_uniform_buffer(mix_shgrp, "strokeColor", &e_data.temp_fbcolor_color_tx);
 		DRW_shgroup_uniform_buffer(mix_shgrp, "strokeDepth", &e_data.temp_fbcolor_depth_tx);
 
+		/* mix vfx pass */
+		struct Gwn_Batch *vfxquad = DRW_cache_fullscreen_quad_get();
+		psl->mix_vfx_pass = DRW_pass_create("GPencil Mix VFX Pass", DRW_STATE_WRITE_COLOR | DRW_STATE_BLEND | DRW_STATE_WRITE_DEPTH | DRW_STATE_DEPTH_LESS);
+		DRWShadingGroup *mix_vfx_shgrp = DRW_shgroup_create(e_data.gpencil_fullscreen_sh, psl->mix_vfx_pass);
+		DRW_shgroup_call_add(mix_vfx_shgrp, vfxquad, NULL);
+		DRW_shgroup_uniform_buffer(mix_vfx_shgrp, "strokeColor", &e_data.vfx_fbcolor_color_tx);
+		DRW_shgroup_uniform_buffer(mix_vfx_shgrp, "strokeDepth", &e_data.vfx_fbcolor_depth_tx);
+
 		/* VFX pass */
 		psl->vfx_pass = DRW_pass_create("GPencil VFX Pass", DRW_STATE_WRITE_COLOR | DRW_STATE_BLEND | DRW_STATE_WRITE_DEPTH | DRW_STATE_DEPTH_LESS);
 	}
@@ -284,8 +301,7 @@ static void GPENCIL_cache_finish(void *vedata)
 			}
 			/* VFX pass */
 			cache = &stl->g_data->gp_object_cache[i];
-			DRW_gpencil_vfx_blur(i, &e_data, vedata, ob, cache);
-			DRW_gpencil_vfx_wave(i, &e_data, vedata, ob, cache);
+			DRW_gpencil_vfx_modifiers(i, &e_data, vedata, ob, cache);
 		}
 	}
 }
@@ -316,6 +332,9 @@ static void GPENCIL_draw_scene(void *vedata)
 	DRW_framebuffer_texture_attach(fbl->temp_color_fb, e_data.temp_fbcolor_depth_tx, 0, 0);
 	DRW_framebuffer_texture_attach(fbl->temp_color_fb, e_data.temp_fbcolor_color_tx, 0, 0);
 
+	DRW_framebuffer_texture_attach(fbl->vfx_color_fb, e_data.vfx_fbcolor_depth_tx, 0, 0);
+	DRW_framebuffer_texture_attach(fbl->vfx_color_fb, e_data.vfx_fbcolor_color_tx, 0, 0);
+
 	/* Draw all pending objects */
 	if (stl->g_data->gp_cache_used > 0) {
 
@@ -351,15 +370,23 @@ static void GPENCIL_draw_scene(void *vedata)
 
 			/* vfx pass */
 			if ((cache->init_vfx_sh) && (cache->init_vfx_sh)) {
+				DRW_framebuffer_bind(fbl->vfx_color_fb);
+				DRW_framebuffer_clear(true, true, false, clearcol, 1.0f);
+
 				DRW_draw_pass_subset(psl->vfx_pass,
 					cache->init_vfx_sh,
 					cache->end_vfx_sh);
+				/* Combine with scene buffer */
+				DRW_framebuffer_bind(dfbl->default_fb);
+				/* Mix VFX Pass */
+				DRW_draw_pass(psl->mix_vfx_pass);
+			}
+			else {
+				/* Combine with scene buffer */
+				DRW_framebuffer_bind(dfbl->default_fb);
+				/* Mix Pass: DRW_STATE_WRITE_COLOR | DRW_STATE_BLEND | DRW_STATE_WRITE_DEPTH | DRW_STATE_DEPTH_LESS */
+				DRW_draw_pass(psl->mix_pass);
 			}
-			/* Combine with scene buffer */
-			DRW_framebuffer_bind(dfbl->default_fb);
-
-			/* Mix Pass: DRW_STATE_WRITE_COLOR | DRW_STATE_BLEND | DRW_STATE_WRITE_DEPTH | DRW_STATE_DEPTH_LESS */
-			DRW_draw_pass(psl->mix_pass);
 		}
 		/* edit points */
 		DRW_draw_pass(psl->edit_pass);
@@ -379,6 +406,9 @@ static void GPENCIL_draw_scene(void *vedata)
 	DRW_framebuffer_texture_detach(e_data.temp_fbcolor_depth_tx);
 	DRW_framebuffer_texture_detach(e_data.temp_fbcolor_color_tx);
 
+	DRW_framebuffer_texture_detach(e_data.vfx_fbcolor_depth_tx);
+	DRW_framebuffer_texture_detach(e_data.vfx_fbcolor_color_tx);
+
 	/* attach again default framebuffer */
 	DRW_framebuffer_bind(dfbl->default_fb);
 }
diff --git a/source/blender/draw/engines/gpencil/gpencil_engine.h b/source/blender/draw/engines/gpencil/gpencil_engine.h
index 1d84ce7ceb0..c22b32b447a 100644
--- a/source/blender/draw/engines/gpencil/gpencil_engine.h
+++ b/source/blender/draw/engines/gpencil/gpencil_engine.h
@@ -108,12 +108,14 @@ typedef struct GPENCIL_PassList {
 	struct DRWPass *edit_pass;
 	struct DRWPass *drawing_pass;
 	struct DRWPass *mix_pass;
+	struct DRWPass *mix_vfx_pass;
 	struct DRWPass *vfx_pass;
 } GPENCIL_PassList;
 
 typedef struct GPENCIL_FramebufferList {
 	struct GPUFrameBuffer *fb;
 	struct GPUFrameBuffer *temp_color_fb;
+	struct GPUFrameBuffer *vfx_color_fb;
 } GPENCIL_FramebufferList;
 
 typedef struct GPENCIL_TextureList {
@@ -157,6 +159,10 @@ typedef struct GPENCIL_e_data {
 	/* temp depth texture */
 	struct GPUTexture *temp_fbcolor_depth_tx;
 	struct GPUTexture *temp_fbcolor_color_tx;
+	
+	struct GPUTexture *vfx_fbcolor_depth_tx;
+	struct GPUTexture *vfx_fbcolor_color_tx;
+
 	struct GPUTexture *gpencil_blank_texture;
 } GPENCIL_e_data; /* Engine data */
 
@@ -212,7 +218,6 @@ void gpencil_object_cache_add(struct tGPencilObjectCache *cache, struct Object *
 
 void gpencil_array_modifiers(struct GPENCIL_StorageList *stl, struct Object *ob);
 
-void DRW_gpencil_vfx_blur(int ob_idx, struct GPENCIL_e_data *e_data, struct GPENCIL_Data *vedata, struct Object *ob, struct tGPencilObjectCache *cache);
-void DRW_gpencil_vfx_wave(int ob_idx, struct GPENCIL_e_data *e_data, struct GPENCIL_Data *vedata, struct Object *ob, struct tGPencilObjectCache *cache);
+void DRW_gpencil_vfx_modifiers(int ob_idx, struct GPENCIL_e_data *e_data, struct GPENCIL_Data *vedata, struct Object *ob, struct tGPencilObjectCache *cache);
 
 #endif /* __GPENCIL_ENGINE_H__ */
diff --git a/source/blender/draw/engines/gpencil/gpencil_vfx.c b/source/blender/draw/engines/gpencil/gpencil_vfx.c
index f0bc3c5c2bc..b974c5afb2d 100644
--- a/source/blender/draw/engines/gpencil/gpencil_vfx.c
+++ b/source/blender/draw/engines/gpencil/gpencil_vfx.c
@@ -37,7 +37,7 @@
 /* verify if this modifier is  available in the context, return NULL if not available */
 static ModifierData *modifier_available(Object *ob, ModifierType type)
 {
-	ModifierData  *md = modifiers_findByType(ob, type);
+	ModifierData *md = modifiers_findByType(ob, type);
 	if (md == NULL) {
 		return NULL;
 	}
@@ -48,70 +48,39 @@ static ModifierData *modifier_available(Object *ob, ModifierType type)
 	}
 
 	bool is_edit = (bool)((gpd->flag & (GP_DATA_STROKE_EDITMODE | GP_DATA_STROKE_SCULPTMODE | GP_DATA_STROKE_WEIGHTMODE)));
-	if ((md->mode & eModifierMode_Realtime) && (G.f & G_RENDER_OGL)) {
-		return NULL;
-	}
-
-	if (((md->mode & eModifierMode_Render) == 0) && (G.f & G_RENDER_OGL)) {
-		return NULL;
+	if (((md->mode & eModifierMode_Realtime) && ((G.f & G_RENDER_OGL) == 0)) ||
+		((md->mode & eModifierMode_Render) && (G.f & G_RENDER_OGL)) ||
+		((md->mode & eModifierMode_Editmode) && (is_edit)))
+	{
+		return md;
 	}
 
-	if ((md->mode & eModifierMode_Editmode) && (!is_edit)) {
-		return NULL;
-	}
-
-	return md;
+	return NULL;
 }
 
-/* Gaussian Blur VFX
- * The effect is done using two shading groups because is faster to apply horizontal
- * and vertical in different operations.
- */
-void DRW_gpencil_vfx_blur(int ob_idx, GPENCIL_e_data *e_data, GPENCIL_Data *vedata, Object *ob, tGPencilObjectCache *cache)
+/* Copy image as is to fill vfx texture */
+static void DRW_gpencil_vfx_copy(int ob_idx, GPENCIL_e_data *e_data, GPENCIL_Data *vedata, Object *ob, tGPencilObjectCache *cache)
 {
-	ModifierData *md = modifier_available(ob, eModifierType_GpencilBlur);
-	if (md == NULL) {
-		return;
-	}
-
-	GpencilBlurModifierData *mmd = (GpencilBlurModifierData *)md;
-
-	GPENCIL_StorageList *stl = ((GPENCIL_Data *)vedata)->stl;
 	GPENCIL_PassList *psl = ((GPENCIL_Data *)vedata)->psl;
-	const float *viewport_size = DRW_viewport_size_get();
-	stl->vfx[ob_idx].vfx_blur.x = mmd->radius[0];
-	stl->vfx[ob_idx].vfx_blur.y = mmd->radius[1] * (viewport_size[1] / viewport_size[0]);
 
 	struct Gwn_Batch *vfxquad = DRW_cache_fullscreen_quad_get();
-	/* horizontal blur */
-	DRWShadingGroup *vfx_shgrp = DRW_shgroup_create(e_data->gpencil_vfx_blur_sh, psl->vfx_pass);
+	DRWShadingGroup *vfx_shgrp = DRW_shgroup_create(e_data->gpencil_fullscreen_sh, psl->vfx_pass);
 	DRW_shgroup_call_add(vfx_shgrp, vfxquad, NULL);
 	DRW_shgroup_uniform_buffer(vfx_shgrp, "strokeColor", &e_data->temp_fbcolor_color_tx);
 	DRW_shgroup_uniform_buffer(vfx_shgrp, "strokeDepth", &e_data->temp_fbcolor_depth_tx);
-	DRW_shgroup_uniform_vec2(vfx_shgrp, "dir", stl->storage->blur1, 1);
-	DRW_shgroup_uniform_float(vfx_shgrp, "blur", &stl->vfx[ob_idx].vfx_blur.x, 1);
 
 	/* set first effect sh */
 	if (cache->init_vfx_sh == NULL) {
 		cache->init_vfx_sh = vfx_shgrp;
 	}
 
-	/* vertical blur */
-	vfx_shgrp = DRW_shgroup_create(e_data->gpencil_vfx_blur_sh, psl->vfx_pass);
-	DRW_shgroup_call_add(vfx_shgrp, vfxquad, NULL);
-	DRW_shgroup_uniform_buffer(vfx_shgrp, "strokeColor", &e_data->temp_fbcolor_color_tx);
-	DRW_shgroup_uniform_buffer(vfx_shgrp, "strokeDepth", &e_data->temp_fbcolor_depth_tx);
-	DRW_shgroup_uniform_vec2(vfx_shgrp, "dir", stl->storage->blur2, 1);
-	DRW_shgroup_uniform_float(vfx_shgrp, "blur", &stl->vfx[ob_idx].vfx_blur.y, 1);
-
 	/* set last effect sh */
 	cache->end_vfx_sh = vfx_shgrp;
 }
 
 /* Wave Distorsion VFX */
-void DRW_gpencil_vfx_wave(int ob_idx, GPENCIL_e_data *e_data, GPENCIL_Data *vedata, Object *ob, tGPencilObjectCache *cache)
+static void DRW_gpencil_vfx_wave(ModifierData *md, int ob_idx, GPENCIL_e_data *e_data, GPENCIL_Data *vedata, Object *ob, tGPencilObjectCache *cach

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list