[Bf-blender-cvs] [27fa133435f] greasepencil-refactor: GPencil: Refactor: Add Flip FX

Clément Foucault noreply at git.blender.org
Thu Dec 19 01:31:08 CET 2019


Commit: 27fa133435f7e3b6a96485225f7079bf423c9282
Author: Clément Foucault
Date:   Wed Dec 18 23:23:46 2019 +0100
Branches: greasepencil-refactor
https://developer.blender.org/rB27fa133435f7e3b6a96485225f7079bf423c9282

GPencil: Refactor: Add Flip FX

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

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_shader.c
M	source/blender/draw/engines/gpencil/gpencil_shader_fx.c
M	source/blender/draw/engines/gpencil/shaders/gpencil_vfx_frag.glsl

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

diff --git a/source/blender/draw/engines/gpencil/gpencil_engine.c b/source/blender/draw/engines/gpencil/gpencil_engine.c
index 4fd6ca82a54..e66a77817b9 100644
--- a/source/blender/draw/engines/gpencil/gpencil_engine.c
+++ b/source/blender/draw/engines/gpencil/gpencil_engine.c
@@ -362,6 +362,7 @@ static void GPENCIL_engine_free(void)
   DRW_SHADER_FREE_SAFE(e_data.fx_blur_sh);
   DRW_SHADER_FREE_SAFE(e_data.fx_colorize_sh);
   DRW_SHADER_FREE_SAFE(e_data.fx_composite_sh);
+  DRW_SHADER_FREE_SAFE(e_data.fx_flip_sh);
   DRW_SHADER_FREE_SAFE(e_data.fx_glow_sh);
   DRW_SHADER_FREE_SAFE(e_data.fx_pixel_sh);
   DRW_SHADER_FREE_SAFE(e_data.fx_rim_sh);
diff --git a/source/blender/draw/engines/gpencil/gpencil_engine.h b/source/blender/draw/engines/gpencil/gpencil_engine.h
index be5be0f2861..bc5196f5bae 100644
--- a/source/blender/draw/engines/gpencil/gpencil_engine.h
+++ b/source/blender/draw/engines/gpencil/gpencil_engine.h
@@ -472,6 +472,7 @@ typedef struct GPENCIL_e_data {
   /* Effects. */
   struct GPUShader *fx_composite_sh;
   struct GPUShader *fx_colorize_sh;
+  struct GPUShader *fx_flip_sh;
   struct GPUShader *fx_blur_sh;
   struct GPUShader *fx_glow_sh;
   struct GPUShader *fx_pixel_sh;
@@ -717,6 +718,7 @@ struct GPUShader *GPENCIL_shader_depth_merge_get(GPENCIL_e_data *e_data);
 struct GPUShader *GPENCIL_shader_fx_blur_get(GPENCIL_e_data *e_data);
 struct GPUShader *GPENCIL_shader_fx_colorize_get(GPENCIL_e_data *e_data);
 struct GPUShader *GPENCIL_shader_fx_composite_get(GPENCIL_e_data *e_data);
+struct GPUShader *GPENCIL_shader_fx_flip_get(GPENCIL_e_data *e_data);
 struct GPUShader *GPENCIL_shader_fx_glow_get(GPENCIL_e_data *e_data);
 struct GPUShader *GPENCIL_shader_fx_pixelize_get(GPENCIL_e_data *e_data);
 struct GPUShader *GPENCIL_shader_fx_rim_get(GPENCIL_e_data *e_data);
diff --git a/source/blender/draw/engines/gpencil/gpencil_shader.c b/source/blender/draw/engines/gpencil/gpencil_shader.c
index 8f29c288cd8..20f81a16b16 100644
--- a/source/blender/draw/engines/gpencil/gpencil_shader.c
+++ b/source/blender/draw/engines/gpencil/gpencil_shader.c
@@ -175,6 +175,15 @@ struct GPUShader *GPENCIL_shader_fx_composite_get(GPENCIL_e_data *e_data)
   return e_data->fx_composite_sh;
 }
 
+struct GPUShader *GPENCIL_shader_fx_flip_get(GPENCIL_e_data *e_data)
+{
+  if (!e_data->fx_flip_sh) {
+    e_data->fx_flip_sh = DRW_shader_create_fullscreen(datatoc_gpencil_vfx_frag_glsl,
+                                                      "#define FLIP\n");
+  }
+  return e_data->fx_flip_sh;
+}
+
 struct GPUShader *GPENCIL_shader_fx_glow_get(GPENCIL_e_data *e_data)
 {
   if (!e_data->fx_glow_sh) {
diff --git a/source/blender/draw/engines/gpencil/gpencil_shader_fx.c b/source/blender/draw/engines/gpencil/gpencil_shader_fx.c
index 38f4e831dd7..b96a291eb5f 100644
--- a/source/blender/draw/engines/gpencil/gpencil_shader_fx.c
+++ b/source/blender/draw/engines/gpencil/gpencil_shader_fx.c
@@ -1135,6 +1135,22 @@ static void gpencil_vfx_colorize(ColorizeShaderFxData *fx, Object *UNUSED(ob), g
   DRW_shgroup_call_procedural_triangles(grp, NULL, 1);
 }
 
+static void gpencil_vfx_flip(FlipShaderFxData *fx, Object *UNUSED(ob), gpIterVfxData *iter)
+{
+  DRWShadingGroup *grp;
+
+  float axis_flip[2];
+  axis_flip[0] = (fx->flag & FX_FLIP_HORIZONTAL) ? -1.0f : 1.0f;
+  axis_flip[1] = (fx->flag & FX_FLIP_VERTICAL) ? -1.0f : 1.0f;
+
+  GPUShader *sh = GPENCIL_shader_fx_flip_get(&en_data);
+
+  DRWState state = DRW_STATE_WRITE_COLOR;
+  grp = gpencil_vfx_pass_create("Fx Flip", state, iter, sh);
+  DRW_shgroup_uniform_vec2_copy(grp, "axisFlip", axis_flip);
+  DRW_shgroup_call_procedural_triangles(grp, NULL, 1);
+}
+
 static void gpencil_vfx_rim(RimShaderFxData *fx, Object *ob, gpIterVfxData *iter)
 {
   DRWShadingGroup *grp;
@@ -1437,6 +1453,7 @@ void gpencil_vfx_cache_populate(GPENCIL_Data *vedata, Object *ob, GPENCIL_tObjec
           gpencil_vfx_colorize((ColorizeShaderFxData *)fx, ob, &iter);
           break;
         case eShaderFxType_Flip:
+          gpencil_vfx_flip((FlipShaderFxData *)fx, ob, &iter);
           break;
         case eShaderFxType_Light:
           break;
@@ -1455,6 +1472,7 @@ void gpencil_vfx_cache_populate(GPENCIL_Data *vedata, Object *ob, GPENCIL_tObjec
         case eShaderFxType_Swirl:
           break;
         case eShaderFxType_Wave:
+          // gpencil_vfx_wave((GlowShaderFxData *)fx, ob, &iter);
           break;
         default:
           break;
diff --git a/source/blender/draw/engines/gpencil/shaders/gpencil_vfx_frag.glsl b/source/blender/draw/engines/gpencil/shaders/gpencil_vfx_frag.glsl
index 3449e439c99..46f9d666806 100644
--- a/source/blender/draw/engines/gpencil/shaders/gpencil_vfx_frag.glsl
+++ b/source/blender/draw/engines/gpencil/shaders/gpencil_vfx_frag.glsl
@@ -106,6 +106,17 @@ void main()
   fragRevealage /= weight_accum;
 }
 
+#elif defined(FLIP)
+
+uniform vec2 axisFlip;
+
+void main()
+{
+  vec2 uv = (uvcoordsvar.xy - 0.5) * axisFlip + 0.5;
+  fragColor = texture(colorBuf, uv);
+  fragRevealage = texture(revealBuf, uv);
+}
+
 #elif defined(GLOW)
 
 uniform vec3 glowColor;



More information about the Bf-blender-cvs mailing list