GPencil: Implement antialiasing parameter to Pixel FX
authorAntonio Vazquez <blendergit@gmail.com>
Tue, 23 Jun 2020 17:11:52 +0000 (19:11 +0200)
committerAntonio Vazquez <blendergit@gmail.com>
Tue, 23 Jun 2020 17:20:02 +0000 (19:20 +0200)
Related to T78153

Differential Revision: https://developer.blender.org/D8100

source/blender/draw/engines/gpencil/gpencil_shader_fx.c
source/blender/makesdna/DNA_shader_fx_types.h
source/blender/makesrna/intern/rna_shader_fx.c
source/blender/shader_fx/intern/FX_shader_pixel.c

index 7ce7a726bb7d9f2a93323131f01a5127f4a126eb..cf6e78f47024416fb495c1a01df403b037580c79 100644 (file)
@@ -262,6 +262,8 @@ static void gpencil_vfx_pixelize(PixelShaderFxData *fx, Object *ob, gpIterVfxDat
   mul_v3_m4v3(ob_center, persmat, ob->obmat[3]);
   mul_v3_fl(ob_center, 1.0f / w);
 
+  const bool use_antialiasing = ((fx->flag & FX_PIXEL_FILTER_NEAREST) == 0);
+
   /* Convert to uvs. */
   mul_v2_fl(ob_center, 0.5f);
   add_v2_fl(ob_center, 0.5f);
@@ -285,7 +287,8 @@ static void gpencil_vfx_pixelize(PixelShaderFxData *fx, Object *ob, gpIterVfxDat
     DRW_shgroup_uniform_vec2_copy(grp, "targetPixelSize", pixsize_uniform);
     DRW_shgroup_uniform_vec2_copy(grp, "targetPixelOffset", ob_center);
     DRW_shgroup_uniform_vec2_copy(grp, "accumOffset", (float[2]){pixel_size[0], 0.0f});
-    DRW_shgroup_uniform_int_copy(grp, "sampCount", (pixel_size[0] / vp_size_inv[0] > 3.0) ? 2 : 1);
+    int samp_count = (pixel_size[0] / vp_size_inv[0] > 3.0) ? 2 : 1;
+    DRW_shgroup_uniform_int_copy(grp, "sampCount", use_antialiasing ? samp_count : 0);
     DRW_shgroup_call_procedural_triangles(grp, NULL, 1);
   }
 
@@ -294,7 +297,8 @@ static void gpencil_vfx_pixelize(PixelShaderFxData *fx, Object *ob, gpIterVfxDat
     grp = gpencil_vfx_pass_create("Fx Pixelize Y", state, iter, sh);
     DRW_shgroup_uniform_vec2_copy(grp, "targetPixelSize", pixsize_uniform);
     DRW_shgroup_uniform_vec2_copy(grp, "accumOffset", (float[2]){0.0f, pixel_size[1]});
-    DRW_shgroup_uniform_int_copy(grp, "sampCount", (pixel_size[1] / vp_size_inv[1] > 3.0) ? 2 : 1);
+    int samp_count = (pixel_size[1] / vp_size_inv[1] > 3.0) ? 2 : 1;
+    DRW_shgroup_uniform_int_copy(grp, "sampCount", use_antialiasing ? samp_count : 0);
     DRW_shgroup_call_procedural_triangles(grp, NULL, 1);
   }
 }
index 2ccff2da993b6d7197b7f0a1357753346fcd5ca5..39d38c66d4583e37a51c01e265db3fa799da06e4 100644 (file)
@@ -172,6 +172,10 @@ typedef struct PixelShaderFxData {
   ShaderFxData_Runtime runtime;
 } PixelShaderFxData;
 
+typedef enum ePixelShaderFx_Flag {
+  FX_PIXEL_FILTER_NEAREST = (1 << 0),
+} ePixelShaderFx_Flag;
+
 typedef struct RimShaderFxData {
   ShaderFxData shaderfx;
   int offset[2];
index d0565bb3aabe2eb172a0a08dd89c8d138acf576b..80f3cab147caf610cb26b55bd1c4e06358e32c1e 100644 (file)
@@ -336,11 +336,9 @@ static void rna_def_shader_fx_pixel(BlenderRNA *brna)
   RNA_def_property_ui_text(prop, "Size", "Pixel size");
   RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_ShaderFx_update");
 
-  prop = RNA_def_property(srna, "color", PROP_FLOAT, PROP_COLOR);
-  RNA_def_property_range(prop, 0.0, 1.0);
-  RNA_def_property_float_sdna(prop, NULL, "rgba");
-  RNA_def_property_array(prop, 4);
-  RNA_def_property_ui_text(prop, "Color", "Color used for lines");
+  prop = RNA_def_property(srna, "use_antialiasing", PROP_BOOLEAN, PROP_NONE);
+  RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", FX_PIXEL_FILTER_NEAREST);
+  RNA_def_property_ui_text(prop, "Antialiasing", "Antialiase pixels");
   RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_ShaderFx_update");
 }
 
index b22dae1064dd2f8f806e99930a376993959b79ce..bdc4f141017d2bdd012b3d67b56aa2b1e0fc7032 100644 (file)
@@ -68,6 +68,8 @@ static void panel_draw(const bContext *C, Panel *panel)
   uiItemFullR(col, &ptr, prop, 0, 0, 0, IFACE_("Size X"), ICON_NONE);
   uiItemFullR(col, &ptr, prop, 1, 0, 0, IFACE_("Y"), ICON_NONE);
 
+  uiItemR(layout, &ptr, "use_antialiasing", 0, NULL, ICON_NONE);
+
   shaderfx_panel_end(layout, &ptr);
 }