[Bf-blender-cvs] [0509f4149ea] greasepencil-refactor: GPencil: Refactor: Add Wave FX

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


Commit: 0509f4149ead4dde896089de9a66b91c7c07612c
Author: Clément Foucault
Date:   Thu Dec 19 00:03:30 2019 +0100
Branches: greasepencil-refactor
https://developer.blender.org/rB0509f4149ead4dde896089de9a66b91c7c07612c

GPencil: Refactor: Add Wave FX

Use the same shader as flip fx because we only transform the uvs and
sample once.

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

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 e66a77817b9..5e5960c536b 100644
--- a/source/blender/draw/engines/gpencil/gpencil_engine.c
+++ b/source/blender/draw/engines/gpencil/gpencil_engine.c
@@ -362,11 +362,11 @@ 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);
   DRW_SHADER_FREE_SAFE(e_data.fx_shadow_sh);
+  DRW_SHADER_FREE_SAFE(e_data.fx_transform_sh);
 
   DRW_TEXTURE_FREE_SAFE(e_data.gpencil_blank_texture);
 
diff --git a/source/blender/draw/engines/gpencil/gpencil_engine.h b/source/blender/draw/engines/gpencil/gpencil_engine.h
index bc5196f5bae..a03897c4413 100644
--- a/source/blender/draw/engines/gpencil/gpencil_engine.h
+++ b/source/blender/draw/engines/gpencil/gpencil_engine.h
@@ -472,12 +472,12 @@ 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;
   struct GPUShader *fx_rim_sh;
   struct GPUShader *fx_shadow_sh;
+  struct GPUShader *fx_transform_sh;
 
   /* general drawing shaders */
   struct GPUShader *gpencil_fill_sh;
@@ -718,7 +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_transform_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 20f81a16b16..10ef5e193ba 100644
--- a/source/blender/draw/engines/gpencil/gpencil_shader.c
+++ b/source/blender/draw/engines/gpencil/gpencil_shader.c
@@ -141,31 +141,6 @@ struct GPUShader *GPENCIL_shader_fx_colorize_get(GPENCIL_e_data *e_data)
   return e_data->fx_colorize_sh;
 }
 
-struct GPUShader *GPENCIL_shader_fx_rim_get(GPENCIL_e_data *e_data)
-{
-  if (!e_data->fx_rim_sh) {
-    e_data->fx_rim_sh = GPU_shader_create_from_arrays({
-        .vert =
-            (const char *[]){
-                datatoc_common_fullscreen_vert_glsl,
-                NULL,
-            },
-        .frag =
-            (const char *[]){
-                datatoc_gpencil_common_lib_glsl,
-                datatoc_gpencil_vfx_frag_glsl,
-                NULL,
-            },
-        .defs =
-            (const char *[]){
-                "#define RIM\n",
-                NULL,
-            },
-    });
-  }
-  return e_data->fx_rim_sh;
-}
-
 struct GPUShader *GPENCIL_shader_fx_composite_get(GPENCIL_e_data *e_data)
 {
   if (!e_data->fx_composite_sh) {
@@ -175,15 +150,6 @@ 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) {
@@ -202,6 +168,31 @@ struct GPUShader *GPENCIL_shader_fx_pixelize_get(GPENCIL_e_data *e_data)
   return e_data->fx_pixel_sh;
 }
 
+struct GPUShader *GPENCIL_shader_fx_rim_get(GPENCIL_e_data *e_data)
+{
+  if (!e_data->fx_rim_sh) {
+    e_data->fx_rim_sh = GPU_shader_create_from_arrays({
+        .vert =
+            (const char *[]){
+                datatoc_common_fullscreen_vert_glsl,
+                NULL,
+            },
+        .frag =
+            (const char *[]){
+                datatoc_gpencil_common_lib_glsl,
+                datatoc_gpencil_vfx_frag_glsl,
+                NULL,
+            },
+        .defs =
+            (const char *[]){
+                "#define RIM\n",
+                NULL,
+            },
+    });
+  }
+  return e_data->fx_rim_sh;
+}
+
 struct GPUShader *GPENCIL_shader_fx_shadow_get(GPENCIL_e_data *e_data)
 {
   if (!e_data->fx_shadow_sh) {
@@ -210,3 +201,12 @@ struct GPUShader *GPENCIL_shader_fx_shadow_get(GPENCIL_e_data *e_data)
   }
   return e_data->fx_shadow_sh;
 }
+
+struct GPUShader *GPENCIL_shader_fx_transform_get(GPENCIL_e_data *e_data)
+{
+  if (!e_data->fx_transform_sh) {
+    e_data->fx_transform_sh = DRW_shader_create_fullscreen(datatoc_gpencil_vfx_frag_glsl,
+                                                           "#define TRANSFORM\n");
+  }
+  return e_data->fx_transform_sh;
+}
diff --git a/source/blender/draw/engines/gpencil/gpencil_shader_fx.c b/source/blender/draw/engines/gpencil/gpencil_shader_fx.c
index b96a291eb5f..e6de1c2c030 100644
--- a/source/blender/draw/engines/gpencil/gpencil_shader_fx.c
+++ b/source/blender/draw/engines/gpencil/gpencil_shader_fx.c
@@ -1143,11 +1143,12 @@ static void gpencil_vfx_flip(FlipShaderFxData *fx, Object *UNUSED(ob), gpIterVfx
   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);
+  GPUShader *sh = GPENCIL_shader_fx_transform_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_uniform_vec2_copy(grp, "waveOffset", (float[2]){0.0f, 0.0f});
   DRW_shgroup_call_procedural_triangles(grp, NULL, 1);
 }
 
@@ -1426,6 +1427,63 @@ static void gpencil_vfx_glow(GlowShaderFxData *fx, Object *UNUSED(ob), gpIterVfx
   DRW_shgroup_call_procedural_triangles(grp, NULL, 1);
 }
 
+static void gpencil_vfx_wave(WaveShaderFxData *fx, Object *ob, gpIterVfxData *iter)
+{
+  DRWShadingGroup *grp;
+
+  float winmat[4][4], persmat[4][4], wave_center[3];
+  float wave_ofs[3], wave_dir[3], wave_phase;
+  DRW_view_winmat_get(NULL, winmat, false);
+  DRW_view_persmat_get(NULL, persmat, false);
+  const float *vp_size = DRW_viewport_size_get();
+  const float *vp_size_inv = DRW_viewport_invert_size_get();
+  const float ratio = vp_size_inv[1] / vp_size_inv[0];
+
+  copy_v3_v3(wave_center, ob->obmat[3]);
+
+  const float w = fabsf(mul_project_m4_v3_zfac(persmat, wave_center));
+  mul_v3_m4v3(wave_center, persmat, wave_center);
+  mul_v3_fl(wave_center, 1.0f / w);
+
+  /* Modify by distance to camera and object scale. */
+  float world_pixel_scale = 1.0f / 2000.0f;
+  float scale = mat4_to_scale(ob->obmat);
+  float distance_factor = (world_pixel_scale * scale * winmat[1][1] * vp_size[1]) / w;
+
+  wave_center[0] = wave_center[0] * 0.5f + 0.5f;
+  wave_center[1] = wave_center[1] * 0.5f + 0.5f;
+
+  if (fx->orientation == 0) {
+    /* Horizontal */
+    copy_v2_fl2(wave_dir, 1.0f, 0.0f);
+  }
+  else {
+    /* Vertical */
+    copy_v2_fl2(wave_dir, 0.0f, 1.0f);
+  }
+  /* Rotate 90°. */
+  copy_v2_v2(wave_ofs, wave_dir);
+  SWAP(float, wave_ofs[0], wave_ofs[1]);
+  wave_ofs[1] *= -1.0f;
+  /* Keep world space scalling and aspect ratio. */
+  mul_v2_fl(wave_dir, 1.0f / (max_ff(1e-8f, fx->period) * distance_factor));
+  mul_v2_v2(wave_dir, vp_size);
+  mul_v2_fl(wave_ofs, fx->amplitude * distance_factor);
+  mul_v2_v2(wave_ofs, vp_size_inv);
+  /* Phase start at shadow center. */
+  wave_phase = fx->phase - dot_v2v2(wave_center, wave_dir);
+
+  GPUShader *sh = GPENCIL_shader_fx_transform_get(&en_data);
+
+  DRWState state = DRW_STATE_WRITE_COLOR;
+  grp = gpencil_vfx_pass_create("Fx Wave", state, iter, sh);
+  DRW_shgroup_uniform_vec2_copy(grp, "axisFlip", (float[2]){1.0f, 1.0f});
+  DRW_shgroup_uniform_vec2_copy(grp, "waveDir", wave_dir);
+  DRW_shgroup_uniform_vec2_copy(grp, "waveOffset", wave_ofs);
+  DRW_shgroup_uniform_float_copy(grp, "wavePhase", wave_phase);
+  DRW_shgroup_call_procedural_triangles(grp, NULL, 1);
+}
+
 void gpencil_vfx_cache_populate(GPENCIL_Data *vedata, Object *ob, GPENCIL_tObject *tgp_ob)
 {
   bGPdata *gpd = (bGPdata *)ob->data;
@@ -1472,7 +1530,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);
+          gpencil_vfx_wave((WaveShaderFxData *)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 46f9d666806..ce6987cd6f6 100644
--- a/source/blender/draw/engines/gpencil/shaders/gpencil_vfx_frag.glsl
+++ b/source/blender/draw/engines/gpencil/shaders/gpencil_vfx_frag.glsl
@@ -106,13 +106,21 @@ void main()
   fragRevealage /= weight_accum;
 }
 
-#elif defined(FLIP)
+#elif defined(TRANSFORM)
 
-uniform vec2 axisFlip;
+uniform vec2 axisFlip = vec2(1.0);
+uniform vec2 waveDir = vec2(0.0);
+uniform vec2 waveOffset = vec2(0.0);
+uniform float wavePhase = 0.0;
 
 void main()
 {
   vec2 uv = (uvcoordsvar.xy - 0.5) * axisFlip + 0.5;
+
+  /* Wave deform. */
+  float wave_time = dot(uv, waveDir.xy);
+  uv += sin(wave_time + wavePhase) * waveOffset;
+
   fragColor = texture(colorBuf, uv);
   fragRevealage = texture(revealBuf, uv);
 }



More information about the Bf-blender-cvs mailing list