[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