Commit: 0c6ddc2a7be44086a697307f9a6a3a1a129cfc37 Author: Antonio Vazquez Date: Sun Aug 6 13:20:50 2017 +0200 Branches: greasepencil-object https://developer.blender.org/rB0c6ddc2a7be44086a697307f9a6a3a1a129cfc37
New VFX Gaussian Blur modifier This modifier works only at viewport level and cannot be applied. =================================================================== M source/blender/draw/CMakeLists.txt M source/blender/draw/engines/gpencil/gpencil_engine.c M source/blender/draw/engines/gpencil/gpencil_engine.h A source/blender/draw/engines/gpencil/gpencil_vfx.c M source/blender/draw/engines/gpencil/shaders/gpencil_gaussian_blur_frag.glsl M source/blender/makesdna/DNA_modifier_types.h M source/blender/makesrna/intern/rna_modifier.c M source/blender/modifiers/intern/MOD_gpencilblur.c =================================================================== diff --git a/source/blender/draw/CMakeLists.txt b/source/blender/draw/CMakeLists.txt index d27ac5b7947..a8dcffc94ee 100644 --- a/source/blender/draw/CMakeLists.txt +++ b/source/blender/draw/CMakeLists.txt @@ -92,6 +92,7 @@ set(SRC engines/gpencil/gpencil_engine.c engines/gpencil/gpencil_draw_cache_impl.c engines/gpencil/gpencil_geom.c + engines/gpencil/gpencil_vfx.c DRW_engine.h intern/DRW_render.h diff --git a/source/blender/draw/engines/gpencil/gpencil_engine.c b/source/blender/draw/engines/gpencil/gpencil_engine.c index a3589f2b867..5d634717114 100644 --- a/source/blender/draw/engines/gpencil/gpencil_engine.c +++ b/source/blender/draw/engines/gpencil/gpencil_engine.c @@ -232,7 +232,6 @@ static void GPENCIL_cache_populate(void *vedata, Object *ob) const DRWContextState *draw_ctx = DRW_context_state_get(); Scene *scene = draw_ctx->scene; ToolSettings *ts = scene->toolsettings; - tGPencilObjectCache *cache; /* object datablock (this is not draw now) */ if (ob->type == OB_GPENCIL && ob->gpd) { @@ -247,26 +246,6 @@ static void GPENCIL_cache_populate(void *vedata, Object *ob) gpencil_array_modifiers(stl, ob); /* draw current painting strokes */ DRW_gpencil_populate_buffer_strokes(vedata, ts, ob->gpd); - - /* VFX pass */ - struct Gwn_Batch *vfxquad = DRW_cache_fullscreen_quad_get(); - cache = &stl->g_data->gp_object_cache[stl->g_data->gp_cache_used - 1]; - - /* horizontal blur */ - DRWShadingGroup *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->blur1, 1); - 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); - cache->end_vfx_sh = vfx_shgrp; } } @@ -276,6 +255,7 @@ static void GPENCIL_cache_finish(void *vedata) const DRWContextState *draw_ctx = DRW_context_state_get(); Scene *scene = draw_ctx->scene; ToolSettings *ts = scene->toolsettings; + tGPencilObjectCache *cache; /* Draw all pending objects */ if (stl->g_data->gp_cache_used > 0) { @@ -293,6 +273,9 @@ static void GPENCIL_cache_finish(void *vedata) printf("GPENCIL_cache_finish: %s %d->%d\n", ob->id.name, stl->g_data->gp_object_cache[i].init_grp, stl->g_data->gp_object_cache[i].end_grp); } + /* VFX pass */ + cache = &stl->g_data->gp_object_cache[i]; + DRW_gpencil_vfx_blur(&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 a5dd73f2f14..97cba5a717f 100644 --- a/source/blender/draw/engines/gpencil/gpencil_engine.h +++ b/source/blender/draw/engines/gpencil/gpencil_engine.h @@ -42,6 +42,11 @@ struct GPENCIL_StorageList; #define GPENCIL_COLOR_PATTERN 2 /* *********** OBJECTS CACHE *********** */ +typedef struct tGPencilVFXBlur { + float x; + float y; +} tGPencilVFXBlur; + /* used to save gpencil objects */ typedef struct tGPencilObjectCache { struct Object *ob; @@ -62,6 +67,9 @@ typedef struct GPENCIL_shgroup { int fill_style; int keep_size; float obj_scale; + /* vfx data */ + tGPencilVFXBlur vfx_blur; + struct DRWShadingGroup *shgrps_fill; struct DRWShadingGroup *shgrps_stroke; } GPENCIL_shgroup; @@ -191,4 +199,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(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 new file mode 100644 index 00000000000..a8a68b4f538 --- /dev/null +++ b/source/blender/draw/engines/gpencil/gpencil_vfx.c @@ -0,0 +1,110 @@ +/* + * Copyright 2017, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor(s): Antonio Vazquez + * + */ + +/** \file blender/draw/engines/gpencil/gpencil_vfx.c + * \ingroup draw + */ + +#include "BKE_modifier.h" +#include "BKE_global.h" + +#include "DRW_engine.h" +#include "DRW_render.h" + +#include "DNA_gpencil_types.h" +#include "DNA_modifier_types.h" + +#include "gpencil_engine.h" + +/* 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); + if (md == NULL) { + return NULL; + } + + bGPdata *gpd = ob->gpd; + if (gpd == NULL) { + return NULL; + } + + 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_Editmode) && (!is_edit)) { + return NULL; + } + + return md; +} + +/* 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(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(); + int id = cache->init_grp; + stl->shgroups[id].vfx_blur.x = mmd->radius[0]; + stl->shgroups[id].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); + 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->shgroups[id].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->shgroups[id].vfx_blur.y, 1); + + /* set last effect sh */ + cache->end_vfx_sh = vfx_shgrp; +} diff --git a/source/blender/draw/engines/gpencil/shaders/gpencil_gaussian_blur_frag.glsl b/source/blender/draw/engines/gpencil/shaders/gpencil_gaussian_blur_frag.glsl index f65a04ddd4a..ff5f0d2c3bc 100644 --- a/source/blender/draw/engines/gpencil/shaders/gpencil_gaussian_blur_frag.glsl +++ b/source/blender/draw/engines/gpencil/shaders/gpencil_gaussian_blur_frag.glsl @@ -4,9 +4,7 @@ out vec4 FragColor; uniform sampler2D strokeColor; uniform sampler2D strokeDepth; -/* next 2 fields must be uniforms, now, valuer are only for testing */ -float resolution = 100.0; -float radius = 300.0; +uniform float blur; uniform vec2 dir; void main() @@ -15,7 +13,6 @@ void main() float stroke_depth = texelFetch(strokeDepth, uv, 0).r; gl_FragDepth = stroke_depth; - float blur = radius/resolution; float hstep = dir.x; float vstep = dir.y; vec4 outcolor = vec4(0.0); diff --git a/source/blender/makesdna/DNA_modifier_types.h b/source/blender/makesdna/DNA_modifier_types.h index 6b6f2e3e25f..90e2a5c7907 100644 --- a/source/blender/makesdna/DNA_modifier_types.h +++ b/source/blender/makesdna/DNA_modifier_types.h @@ -1803,8 +1803,7 @@ typedef enum eGpencilSimplify_Flag { typedef struct GpencilBlurModifierData { ModifierData modifier; - float resolution[2]; - float radius[2]; + int radius[2]; int flag; /* flags */ char pad[4]; } GpencilBlurModifierData; diff --git a/source/blender/makesrna/intern/rna_modifier.c b/source/blender/makesrna/intern/rna_modifier.c index aa18c5ee050..d2639419659 100644 --- a/source/blender/makesrna/intern/rna_modifier.c +++ b/source/blender/makesrna/intern/rna_modifier.c @@ -132,7 +132,7 @@ EnumPropertyItem rna_enum_object_modifier_type_items[] = { {eModifierType_GpencilColor, "GP_COLOR", ICON_GROUP_VCOL, "Hue/Saturation", "Apply changes to color" }, {eModifierType_GpencilOpacity, "GP_OPACITY", ICON_MOD_MASK, "Opacity", "Opacity of the strokes" }, { 0, "", 0, N_("VFX"), "" }, @@ Diff output truncated at 10240 characters. @@ _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org https://lists.blender.org/mailman/listinfo/bf-blender-cvs