[Bf-blender-cvs] [6abd28097d8] greasepencil-object: New VFX Wave modifier

Antonio Vazquez noreply at git.blender.org
Tue Aug 8 11:19:14 CEST 2017


Commit: 6abd28097d8355381a80054e70fd304518652629
Author: Antonio Vazquez
Date:   Sun Aug 6 17:07:53 2017 +0200
Branches: greasepencil-object
https://developer.blender.org/rB6abd28097d8355381a80054e70fd304518652629

New VFX Wave modifier

Distorsion using sinusoidal wave

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

M	release/scripts/startup/bl_ui/properties_data_modifier.py
M	source/blender/blenkernel/BKE_gpencil.h
M	source/blender/draw/CMakeLists.txt
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_vfx.c
A	source/blender/draw/engines/gpencil/shaders/gpencil_wave_frag.glsl
M	source/blender/makesdna/DNA_modifier_types.h
M	source/blender/makesrna/RNA_access.h
M	source/blender/makesrna/intern/rna_modifier.c
M	source/blender/modifiers/CMakeLists.txt
M	source/blender/modifiers/MOD_modifiertypes.h
A	source/blender/modifiers/intern/MOD_gpencilwave.c
M	source/blender/modifiers/intern/MOD_util.c

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

diff --git a/release/scripts/startup/bl_ui/properties_data_modifier.py b/release/scripts/startup/bl_ui/properties_data_modifier.py
index 11e1f78b1e0..6d8d5341278 100644
--- a/release/scripts/startup/bl_ui/properties_data_modifier.py
+++ b/release/scripts/startup/bl_ui/properties_data_modifier.py
@@ -1789,6 +1789,18 @@ class DATA_PT_modifiers(ModifierButtonsPanel, Panel):
         col.label(text="Factor:")
         col.prop(md, "factor", text="")
 
+    def GP_WAVE(self, layout, ob, md):
+        row = layout.row(align=True)
+        row.prop(md, "orientation", expand=True)
+
+        split = layout.split()
+        col = split.column()
+        col.separator()
+        col.label(text="Wave:")
+        col.prop(md, "amplitude")
+        col.prop(md, "period")
+        col.prop(md, "phase")
+
 classes = (
     DATA_PT_modifiers,
 )
diff --git a/source/blender/blenkernel/BKE_gpencil.h b/source/blender/blenkernel/BKE_gpencil.h
index 570e64ac1af..09e12fde229 100644
--- a/source/blender/blenkernel/BKE_gpencil.h
+++ b/source/blender/blenkernel/BKE_gpencil.h
@@ -55,8 +55,6 @@ struct GpencilDupliModifierData;
 struct GpencilOpacityModifierData;
 struct GpencilLatticeModifierData;
 
-struct GpencilBlurModifierData;
-
 /* ------------ Grease-Pencil API ------------------ */
 
 void BKE_gpencil_free_point_weights(struct bGPDspoint *pt);
diff --git a/source/blender/draw/CMakeLists.txt b/source/blender/draw/CMakeLists.txt
index a8dcffc94ee..92aa801c67d 100644
--- a/source/blender/draw/CMakeLists.txt
+++ b/source/blender/draw/CMakeLists.txt
@@ -213,6 +213,7 @@ data_to_c_simple(engines/gpencil/shaders/gpencil_point_vert.glsl SRC)
 data_to_c_simple(engines/gpencil/shaders/gpencil_point_geom.glsl SRC)
 data_to_c_simple(engines/gpencil/shaders/gpencil_point_frag.glsl SRC)
 data_to_c_simple(engines/gpencil/shaders/gpencil_gaussian_blur_frag.glsl SRC)
+data_to_c_simple(engines/gpencil/shaders/gpencil_wave_frag.glsl SRC)
 
 list(APPEND INC
 )
diff --git a/source/blender/draw/engines/gpencil/gpencil_engine.c b/source/blender/draw/engines/gpencil/gpencil_engine.c
index 9a3106d3743..a6d22ee8446 100644
--- a/source/blender/draw/engines/gpencil/gpencil_engine.c
+++ b/source/blender/draw/engines/gpencil/gpencil_engine.c
@@ -46,6 +46,7 @@ extern char datatoc_gpencil_point_vert_glsl[];
 extern char datatoc_gpencil_point_geom_glsl[];
 extern char datatoc_gpencil_point_frag_glsl[];
 extern char datatoc_gpencil_gaussian_blur_frag_glsl[];
+extern char datatoc_gpencil_wave_frag_glsl[];
 
 /* *********** STATIC *********** */
 static GPENCIL_e_data e_data = {NULL}; /* Engine data */
@@ -128,6 +129,7 @@ static void GPENCIL_engine_free(void)
 	DRW_SHADER_FREE_SAFE(e_data.gpencil_point_sh);
 	DRW_SHADER_FREE_SAFE(e_data.gpencil_fullscreen_sh);
 	DRW_SHADER_FREE_SAFE(e_data.gpencil_vfx_blur_sh);
+	DRW_SHADER_FREE_SAFE(e_data.gpencil_vfx_wave_sh);
 
 	DRW_TEXTURE_FREE_SAFE(e_data.gpencil_blank_texture);
 }
@@ -172,6 +174,9 @@ static void GPENCIL_cache_init(void *vedata)
 	if (!e_data.gpencil_vfx_blur_sh) {
 		e_data.gpencil_vfx_blur_sh = DRW_shader_create_fullscreen(datatoc_gpencil_gaussian_blur_frag_glsl, NULL);
 	}
+	if (!e_data.gpencil_vfx_wave_sh) {
+		e_data.gpencil_vfx_wave_sh = DRW_shader_create_fullscreen(datatoc_gpencil_wave_frag_glsl, NULL);
+	}
 
 	{
 		/* Stroke pass */
@@ -280,6 +285,7 @@ static void GPENCIL_cache_finish(void *vedata)
 			/* VFX pass */
 			cache = &stl->g_data->gp_object_cache[i];
 			DRW_gpencil_vfx_blur(i, &e_data, vedata, ob, cache);
+			DRW_gpencil_vfx_wave(i, &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 f7afc034246..1d84ce7ceb0 100644
--- a/source/blender/draw/engines/gpencil/gpencil_engine.h
+++ b/source/blender/draw/engines/gpencil/gpencil_engine.h
@@ -49,6 +49,13 @@ typedef struct GPencilVFXBlur {
 	float y;
 } GPencilVFXBlur;
 
+typedef struct GPencilVFXWave {
+	int orientation;
+	float amplitude;
+	float period;
+	float phase;
+} GPencilVFXWave;
+
  /* used to save gpencil objects */
 typedef struct tGPencilObjectCache {
 	struct Object *ob;
@@ -61,6 +68,7 @@ typedef struct tGPencilObjectCache {
   /* *********** LISTS *********** */
 typedef struct GPENCIL_vfx {
 	GPencilVFXBlur vfx_blur;
+	GPencilVFXWave vfx_wave;
 } GPENCIL_vfx;
 
 typedef struct GPENCIL_shgroup {
@@ -145,6 +153,7 @@ typedef struct GPENCIL_e_data {
 	struct GPUShader *gpencil_drawing_fill_sh;
 	struct GPUShader *gpencil_fullscreen_sh;
 	struct GPUShader *gpencil_vfx_blur_sh;
+	struct GPUShader *gpencil_vfx_wave_sh;
 	/* temp depth texture */
 	struct GPUTexture *temp_fbcolor_depth_tx;
 	struct GPUTexture *temp_fbcolor_color_tx;
@@ -204,5 +213,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(int ob_idx, struct GPENCIL_e_data *e_data, struct GPENCIL_Data *vedata, struct Object *ob, struct tGPencilObjectCache *cache);
+void DRW_gpencil_vfx_wave(int ob_idx, 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
index dd05dbe988e..f0bc3c5c2bc 100644
--- a/source/blender/draw/engines/gpencil/gpencil_vfx.c
+++ b/source/blender/draw/engines/gpencil/gpencil_vfx.c
@@ -107,3 +107,40 @@ void DRW_gpencil_vfx_blur(int ob_idx, GPENCIL_e_data *e_data, GPENCIL_Data *veda
 	/* set last effect sh */
 	cache->end_vfx_sh = vfx_shgrp;
 }
+
+/* Wave Distorsion VFX */
+void DRW_gpencil_vfx_wave(int ob_idx, GPENCIL_e_data *e_data, GPENCIL_Data *vedata, Object *ob, tGPencilObjectCache *cache)
+{
+	ModifierData *md = modifier_available(ob, eModifierType_GpencilWave);
+	if (md == NULL) {
+		return;
+	}
+
+	GpencilWaveModifierData *mmd = (GpencilWaveModifierData *)md;
+
+	GPENCIL_StorageList *stl = ((GPENCIL_Data *)vedata)->stl;
+	GPENCIL_PassList *psl = ((GPENCIL_Data *)vedata)->psl;
+	stl->vfx[ob_idx].vfx_wave.amplitude = mmd->amplitude;
+	stl->vfx[ob_idx].vfx_wave.period = mmd->period;
+	stl->vfx[ob_idx].vfx_wave.phase = mmd->phase;
+	stl->vfx[ob_idx].vfx_wave.orientation = mmd->orientation;
+
+	struct Gwn_Batch *vfxquad = DRW_cache_fullscreen_quad_get();
+
+	DRWShadingGroup *vfx_shgrp = DRW_shgroup_create(e_data->gpencil_vfx_wave_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_float(vfx_shgrp, "amplitude", &stl->vfx[ob_idx].vfx_wave.amplitude, 1);
+	DRW_shgroup_uniform_float(vfx_shgrp, "period", &stl->vfx[ob_idx].vfx_wave.period, 1);
+	DRW_shgroup_uniform_float(vfx_shgrp, "phase", &stl->vfx[ob_idx].vfx_wave.phase, 1);
+	DRW_shgroup_uniform_int(vfx_shgrp, "orientation", &stl->vfx[ob_idx].vfx_wave.orientation, 1);
+
+	/* set first effect sh */
+	if (cache->init_vfx_sh == NULL) {
+		cache->init_vfx_sh = vfx_shgrp;
+	}
+
+	/* set last effect sh */
+	cache->end_vfx_sh = vfx_shgrp;
+}
diff --git a/source/blender/draw/engines/gpencil/shaders/gpencil_wave_frag.glsl b/source/blender/draw/engines/gpencil/shaders/gpencil_wave_frag.glsl
new file mode 100644
index 00000000000..96f95f8194d
--- /dev/null
+++ b/source/blender/draw/engines/gpencil/shaders/gpencil_wave_frag.glsl
@@ -0,0 +1,33 @@
+
+out vec4 FragColor;
+
+uniform sampler2D strokeColor;
+uniform sampler2D strokeDepth;
+
+uniform float amplitude;
+uniform float period;
+uniform float phase;
+uniform int orientation;
+
+#define HORIZONTAL 0
+#define VERTICAL 1
+
+void main()
+{
+	vec4 outcolor;
+	ivec2 uv = ivec2(gl_FragCoord.xy);
+	float stroke_depth = texelFetch(strokeDepth, uv, 0).r;
+	gl_FragDepth = stroke_depth;
+
+	float value;
+	if (orientation == HORIZONTAL) {
+		value = amplitude * sin((period * uv.x) + phase);
+		outcolor = texelFetch(strokeColor, ivec2(uv.x, uv.y + value), 0);
+	}
+	else {
+		value = amplitude * sin((period * uv.y) + phase);
+		outcolor = texelFetch(strokeColor, ivec2(uv.x + value, uv.y), 0);
+	}
+
+	FragColor = outcolor;
+}
diff --git a/source/blender/makesdna/DNA_modifier_types.h b/source/blender/makesdna/DNA_modifier_types.h
index 90e2a5c7907..50b5dc936e8 100644
--- a/source/blender/makesdna/DNA_modifier_types.h
+++ b/source/blender/makesdna/DNA_modifier_types.h
@@ -98,6 +98,7 @@ typedef enum ModifierType {
 	eModifierType_GpencilLattice    = 62,
 	eModifierType_GpencilSimplify   = 63,
 	eModifierType_GpencilBlur       = 64,
+	eModifierType_GpencilWave       = 65,
 	NUM_MODIFIER_TYPES
 } ModifierType;
 
@@ -1808,6 +1809,16 @@ typedef struct GpencilBlurModifierData {
 	char pad[4];
 } GpencilBlurModifierData;
 
+typedef struct GpencilWaveModifierData {
+	ModifierData modifier;
+	float amplitude;
+	float period;
+	float phase;
+	int orientation;
+	int flag;                    /* flags */
+	char pad[4];
+} GpencilWaveModifierData;
+
 #define MOD_MESHSEQ_READ_ALL \
 	(MOD_MESHSEQ_READ_VERT | MOD_MESHSEQ_READ_POLY | MOD_MESHSEQ_READ_UV | MOD_MESHSEQ_READ_COLOR)
 
diff --git a/source/blender/makesrna/RNA_access.h b/source/blender/makesrna/RNA_access.h
index f5f40546109..5bc586b74fe 100644
--- a/source/blender/makesrna/RNA_access.h
+++ b/source/blender/makesrna/RNA_access.h
@@ -623,6 +623,7 @@ extern StructRNA RNA_GpencilDupliModifier;
 extern StructRNA RNA_GpencilOpacityModifier;
 extern StructRNA RNA_GpencilLatticeModifier;
 extern StructRNA RNA_GpencilBlurModifier;
+extern StructRNA RNA_GpencilWaveModifier;
 extern StructRNA RNA_TexMapping;
 extern StructRNA RNA_Text;
 extern StructRNA RNA_TextBox;
diff --git a/source/blender/makesrna/intern/rna_modifier.c b/source/blender/makesrna/intern/rna_modifier.c
index d2639419659..112388e6b9a 100644
--- a/source/blender/makesrna/intern/rna_modifier.c
+++ b/source/blender/makesrna/intern/rna_modifier.c
@@ -133,6 +133,7 @@ EnumPropertyItem rna_enum_object_modifier_type_items[] = {
 	{eModifierType_GpencilOpacity, "GP_OPACITY", ICON_MOD_MASK, "Opacity", "Opacity of the strokes" },
 	{ 0, "", 0, N_("

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list