[Bf-blender-cvs] [0cc5a2bfd19] greasepencil-refactor: GPencil: Refactor: Add Swirl FX

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


Commit: 0cc5a2bfd19578a57209b4513b44321bbe309982
Author: Clément Foucault
Date:   Thu Dec 19 01:17:27 2019 +0100
Branches: greasepencil-refactor
https://developer.blender.org/rB0cc5a2bfd19578a57209b4513b44321bbe309982

GPencil: Refactor: Add Swirl FX

The angle is no longer mulitplied by 8. We need to change the UI and patch
old files to preserve an appropriate slider feeling.

The Swirl FX (like others) is now affected by distance of the source object.

Transparent option has not been reimplemented as you can use masking for
that.

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

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_shader_fx.c b/source/blender/draw/engines/gpencil/gpencil_shader_fx.c
index e6de1c2c030..8d50d279a81 100644
--- a/source/blender/draw/engines/gpencil/gpencil_shader_fx.c
+++ b/source/blender/draw/engines/gpencil/gpencil_shader_fx.c
@@ -1149,6 +1149,7 @@ static void gpencil_vfx_flip(FlipShaderFxData *fx, Object *UNUSED(ob), gpIterVfx
   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_uniform_float_copy(grp, "swirlRadius", 0.0f);
   DRW_shgroup_call_procedural_triangles(grp, NULL, 1);
 }
 
@@ -1437,12 +1438,9 @@ static void gpencil_vfx_wave(WaveShaderFxData *fx, Object *ob, gpIterVfxData *it
   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);
+  const float w = fabsf(mul_project_m4_v3_zfac(persmat, ob->obmat[3]));
+  mul_v3_m4v3(wave_center, persmat, ob->obmat[3]);
   mul_v3_fl(wave_center, 1.0f / w);
 
   /* Modify by distance to camera and object scale. */
@@ -1481,6 +1479,52 @@ static void gpencil_vfx_wave(WaveShaderFxData *fx, Object *ob, gpIterVfxData *it
   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_uniform_float_copy(grp, "swirlRadius", 0.0f);
+  DRW_shgroup_call_procedural_triangles(grp, NULL, 1);
+}
+
+static void gpencil_vfx_swirl(SwirlShaderFxData *fx, Object *UNUSED(ob), gpIterVfxData *iter)
+{
+  DRWShadingGroup *grp;
+
+  if (fx->object == NULL) {
+    return;
+  }
+
+  float winmat[4][4], persmat[4][4], swirl_center[3];
+  DRW_view_winmat_get(NULL, winmat, false);
+  DRW_view_persmat_get(NULL, persmat, false);
+  const float *vp_size = DRW_viewport_size_get();
+
+  copy_v3_v3(swirl_center, fx->object->obmat[3]);
+
+  const float w = fabsf(mul_project_m4_v3_zfac(persmat, swirl_center));
+  mul_v3_m4v3(swirl_center, persmat, swirl_center);
+  mul_v3_fl(swirl_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(fx->object->obmat);
+  float distance_factor = (world_pixel_scale * scale * winmat[1][1] * vp_size[1]) / w;
+
+  mul_v2_fl(swirl_center, 0.5f);
+  add_v2_fl(swirl_center, 0.5f);
+  mul_v2_v2(swirl_center, vp_size);
+
+  float radius = fx->radius * distance_factor;
+  if (radius < 1.0f) {
+    return;
+  }
+
+  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", (float[2]){1.0f, 1.0f});
+  DRW_shgroup_uniform_vec2_copy(grp, "waveOffset", (float[2]){0.0f, 0.0f});
+  DRW_shgroup_uniform_vec2_copy(grp, "swirlCenter", swirl_center);
+  DRW_shgroup_uniform_float_copy(grp, "swirlAngle", fx->angle);
+  DRW_shgroup_uniform_float_copy(grp, "swirlRadius", radius);
   DRW_shgroup_call_procedural_triangles(grp, NULL, 1);
 }
 
@@ -1528,6 +1572,7 @@ void gpencil_vfx_cache_populate(GPENCIL_Data *vedata, Object *ob, GPENCIL_tObjec
           gpencil_vfx_glow((GlowShaderFxData *)fx, ob, &iter);
           break;
         case eShaderFxType_Swirl:
+          gpencil_vfx_swirl((SwirlShaderFxData *)fx, ob, &iter);
           break;
         case eShaderFxType_Wave:
           gpencil_vfx_wave((WaveShaderFxData *)fx, ob, &iter);
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 ce6987cd6f6..860dae08dde 100644
--- a/source/blender/draw/engines/gpencil/shaders/gpencil_vfx_frag.glsl
+++ b/source/blender/draw/engines/gpencil/shaders/gpencil_vfx_frag.glsl
@@ -112,6 +112,9 @@ uniform vec2 axisFlip = vec2(1.0);
 uniform vec2 waveDir = vec2(0.0);
 uniform vec2 waveOffset = vec2(0.0);
 uniform float wavePhase = 0.0;
+uniform vec2 swirlCenter = vec2(0.0);
+uniform float swirlAngle = 0.0;
+uniform float swirlRadius = 0.0;
 
 void main()
 {
@@ -120,6 +123,18 @@ void main()
   /* Wave deform. */
   float wave_time = dot(uv, waveDir.xy);
   uv += sin(wave_time + wavePhase) * waveOffset;
+  /* Swirl deform. */
+  if (swirlRadius > 0.0) {
+    vec2 tex_size = vec2(textureSize(colorBuf, 0).xy);
+    vec2 pix_coord = uv * tex_size - swirlCenter;
+    float dist = length(pix_coord);
+    float percent = clamp((swirlRadius - dist) / swirlRadius, 0.0, 1.0);
+    float theta = percent * percent * swirlAngle;
+    float s = sin(theta);
+    float c = cos(theta);
+    mat2 rot = mat2(vec2(c, -s), vec2(s, c));
+    uv = (rot * pix_coord + swirlCenter) / tex_size;
+  }
 
   fragColor = texture(colorBuf, uv);
   fragRevealage = texture(revealBuf, uv);



More information about the Bf-blender-cvs mailing list