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

Reply via email to