[Bf-blender-cvs] [8707d299172] greasepencil-object: Fix VFX Swirl modifier

Antonio Vazquez noreply at git.blender.org
Sat Dec 9 17:10:09 CET 2017


Commit: 8707d29917288f0320663d49b4a403822d8545da
Author: Antonio Vazquez
Date:   Sat Dec 9 16:20:39 2017 +0100
Branches: greasepencil-object
https://developer.blender.org/rB8707d29917288f0320663d49b4a403822d8545da

Fix VFX Swirl modifier

There was a problem with the conversion between screen space and camera space.

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

M	release/scripts/startup/bl_ui/properties_data_modifier.py
M	source/blender/draw/engines/gpencil/gpencil_engine.h
M	source/blender/draw/engines/gpencil/gpencil_vfx.c
M	source/blender/draw/engines/gpencil/shaders/gpencil_swirl_frag.glsl
M	source/blender/makesdna/DNA_modifier_types.h
M	source/blender/makesrna/intern/rna_modifier.c
M	source/blender/modifiers/intern/MOD_gpencilswirl.c

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

diff --git a/release/scripts/startup/bl_ui/properties_data_modifier.py b/release/scripts/startup/bl_ui/properties_data_modifier.py
index 51df910a99a..f104990e2ee 100644
--- a/release/scripts/startup/bl_ui/properties_data_modifier.py
+++ b/release/scripts/startup/bl_ui/properties_data_modifier.py
@@ -1889,12 +1889,8 @@ class DATA_PT_modifiers(ModifierButtonsPanel, Panel):
         split = layout.split()
 
         col = split.column()
-        col.prop(md, "use_loc", text="Use Location")
-        col.label(text="Center:")
-        row = col.row()
-        row.enabled = not md.use_loc
-        subcol = row.column()
-        subcol.prop(md, "center", text="")
+        col.label(text="Object:")
+        col.prop(md, "object", text="")
 
         col.separator()
         col.prop(md, "radius")
diff --git a/source/blender/draw/engines/gpencil/gpencil_engine.h b/source/blender/draw/engines/gpencil/gpencil_engine.h
index 5fb5202176d..fba33875ac6 100644
--- a/source/blender/draw/engines/gpencil/gpencil_engine.h
+++ b/source/blender/draw/engines/gpencil/gpencil_engine.h
@@ -72,7 +72,7 @@ struct GPENCIL_StorageList;
 
  /* *********** OBJECTS CACHE *********** */
 typedef struct GPencilVFXSwirl {
-	float center[2];
+	float loc[3];
 	float radius; 
 	float angle;
 	int transparent;
diff --git a/source/blender/draw/engines/gpencil/gpencil_vfx.c b/source/blender/draw/engines/gpencil/gpencil_vfx.c
index b54402eb3f8..c02ff8d5b8b 100644
--- a/source/blender/draw/engines/gpencil/gpencil_vfx.c
+++ b/source/blender/draw/engines/gpencil/gpencil_vfx.c
@@ -298,22 +298,15 @@ static void DRW_gpencil_vfx_swirl(
 	}
 
 	GpencilSwirlModifierData *mmd = (GpencilSwirlModifierData *)md;
+	if (mmd->object == NULL) {
+		return;
+	}
 
 	GPENCIL_StorageList *stl = ((GPENCIL_Data *)vedata)->stl;
 	GPENCIL_PassList *psl = ((GPENCIL_Data *)vedata)->psl;
 	DRWShadingGroup *vfx_shgrp;
-	const DRWContextState *draw_ctx = DRW_context_state_get();
-	ARegion *ar = draw_ctx->ar;
-	int co[2];
-	if (mmd->flag & GP_SWIRL_USE_OB_LOC) {
-		ED_view3d_project_int_global(ar, ob->loc, co, V3D_PROJ_TEST_NOP);
-		stl->vfx[ob_idx].vfx_swirl.center[0] = co[0];
-		stl->vfx[ob_idx].vfx_swirl.center[1] = co[1];
-	}
-	else {
-		stl->vfx[ob_idx].vfx_swirl.center[0] = mmd->center[0];
-		stl->vfx[ob_idx].vfx_swirl.center[1] = mmd->center[1];
-	}
+	bGPdata *gpd = (bGPdata *)ob->data;
+
 	stl->vfx[ob_idx].vfx_swirl.radius = mmd->radius;
 	stl->vfx[ob_idx].vfx_swirl.angle = mmd->angle;
 	stl->vfx[ob_idx].vfx_swirl.transparent = (int)mmd->flag & GP_SWIRL_MAKE_TRANSPARENT;
@@ -324,11 +317,22 @@ static void DRW_gpencil_vfx_swirl(
 	DRW_shgroup_call_add(vfx_shgrp, vfxquad, NULL);
 	DRW_shgroup_uniform_buffer(vfx_shgrp, "strokeColor", &e_data->vfx_fbcolor_color_tx_a);
 	DRW_shgroup_uniform_buffer(vfx_shgrp, "strokeDepth", &e_data->vfx_fbcolor_depth_tx_a);
-	DRW_shgroup_uniform_vec2(vfx_shgrp, "center", &stl->vfx[ob_idx].vfx_swirl.center[0], 1);
+
+	const float *viewport_size = DRW_viewport_size_get();
+	copy_v2_v2(stl->vfx[ob_idx].vfx_light.wsize, viewport_size);
+	DRW_shgroup_uniform_vec2(vfx_shgrp, "Viewport", stl->vfx[ob_idx].vfx_light.wsize, 1);
+
+	copy_v3_v3(stl->vfx[ob_idx].vfx_swirl.loc, &mmd->object->loc[0]);
+	DRW_shgroup_uniform_vec3(vfx_shgrp, "loc", stl->vfx[ob_idx].vfx_swirl.loc, 1);
+
 	DRW_shgroup_uniform_float(vfx_shgrp, "radius", &stl->vfx[ob_idx].vfx_swirl.radius, 1);
 	DRW_shgroup_uniform_float(vfx_shgrp, "angle", &stl->vfx[ob_idx].vfx_swirl.angle, 1);
 	DRW_shgroup_uniform_int(vfx_shgrp, "transparent", &stl->vfx[ob_idx].vfx_swirl.transparent, 1);
 
+	DRW_shgroup_uniform_float(vfx_shgrp, "pixsize", DRW_viewport_pixelsize_get(), 1);
+	DRW_shgroup_uniform_float(vfx_shgrp, "pixelsize", &U.pixelsize, 1);
+	DRW_shgroup_uniform_int(vfx_shgrp, "pixfactor", &gpd->pixfactor, 1);
+
 	/* set first effect sh */
 	if (cache->init_vfx_swirl_sh == NULL) {
 		cache->init_vfx_swirl_sh = vfx_shgrp;
diff --git a/source/blender/draw/engines/gpencil/shaders/gpencil_swirl_frag.glsl b/source/blender/draw/engines/gpencil/shaders/gpencil_swirl_frag.glsl
index efde63aa976..9b48f4c93c2 100644
--- a/source/blender/draw/engines/gpencil/shaders/gpencil_swirl_frag.glsl
+++ b/source/blender/draw/engines/gpencil/shaders/gpencil_swirl_frag.glsl
@@ -1,13 +1,36 @@
-out vec4 FragColor;
+uniform mat4 ProjectionMatrix;
+uniform mat4 ViewMatrix;
 
 uniform sampler2D strokeColor;
 uniform sampler2D strokeDepth;
 
-uniform vec2 center;
+uniform vec2 Viewport;
+uniform vec3 loc;
 uniform float radius;
 uniform float angle;
 uniform int transparent;
 
+uniform float pixsize;   /* rv3d->pixsize */
+uniform float pixelsize; /* U.pixelsize */
+uniform int pixfactor;
+
+out vec4 FragColor;
+
+float defaultpixsize = pixsize * pixelsize * float(pixfactor);
+
+/* project 3d point to 2d on screen space */
+vec2 toScreenSpace(vec4 vertex)
+{
+	/* need to calculate ndc because this is not done by vertex shader */
+	vec3 ndc = vec3(vertex).xyz / vertex.w;
+					
+	vec2 sc;
+	sc.x = ((ndc.x + 1.0) / 2.0) * Viewport.x;
+	sc.y = ((ndc.y + 1.0) / 2.0) * Viewport.y;
+	
+	return sc;
+}
+
 /* This swirl shader is a modified version of original Geeks3d.com code */
 void main()
 {
@@ -15,10 +38,15 @@ void main()
 	float stroke_depth;
 	vec4 outcolor;
 	
+	vec4 center3d = ProjectionMatrix * ViewMatrix * vec4(loc.xyz, 1.0); 
+	vec2 center = toScreenSpace(center3d);
 	vec2 tc = uv - center;
+
 	float dist = length(tc);
-    if (dist <= radius) {
-		float percent = (radius - dist) / radius;
+	float pxradius = (ProjectionMatrix[3][3] == 0.0) ? (radius / (loc.z * defaultpixsize)) : (radius / defaultpixsize);
+	
+	if (dist <= pxradius) {
+		float percent = (pxradius - dist) / pxradius;
 		float theta = percent * percent * angle * 8.0;
 		float s = sin(theta);
 		float c = cos(theta);
diff --git a/source/blender/makesdna/DNA_modifier_types.h b/source/blender/makesdna/DNA_modifier_types.h
index 242817b6d6d..40906003531 100644
--- a/source/blender/makesdna/DNA_modifier_types.h
+++ b/source/blender/makesdna/DNA_modifier_types.h
@@ -1947,7 +1947,7 @@ typedef enum eGpencilPixel_Flag {
 
 typedef struct GpencilSwirlModifierData {
 	ModifierData modifier;
-	int center[2];
+	struct Object *object;
 	int flag;                    /* flags */
 	int radius;
 	float angle;
@@ -1956,7 +1956,6 @@ typedef struct GpencilSwirlModifierData {
 
 typedef enum eGpencilSwirl_Flag {
 	GP_SWIRL_MAKE_TRANSPARENT = (1 << 0),
-	GP_SWIRL_USE_OB_LOC       = (1 << 1),
 } eGpencilSwirl_Flag;
 
 typedef struct GpencilFlipModifierData {
diff --git a/source/blender/makesrna/intern/rna_modifier.c b/source/blender/makesrna/intern/rna_modifier.c
index 5b59aae6d11..1008b268e27 100644
--- a/source/blender/makesrna/intern/rna_modifier.c
+++ b/source/blender/makesrna/intern/rna_modifier.c
@@ -675,6 +675,7 @@ RNA_MOD_OBJECT_SET(Shrinkwrap, auxTarget, OB_MESH);
 RNA_MOD_OBJECT_SET(SurfaceDeform, target, OB_MESH);
 RNA_MOD_OBJECT_SET(GpencilLattice, object, OB_LATTICE);
 RNA_MOD_OBJECT_SET(GpencilLight, object, OB_EMPTY);
+RNA_MOD_OBJECT_SET(GpencilSwirl, object, OB_EMPTY);
 
 static void rna_HookModifier_object_set(PointerRNA *ptr, PointerRNA value)
 {
@@ -5896,12 +5897,6 @@ static void rna_def_modifier_gpencilswirl(BlenderRNA *brna)
 	RNA_def_struct_sdna(srna, "GpencilSwirlModifierData");
 	RNA_def_struct_ui_icon(srna, ICON_SOLO_ON);
 
-	prop = RNA_def_property(srna, "center", PROP_INT, PROP_PIXEL);
-	RNA_def_property_int_sdna(prop, NULL, "center");
-	RNA_def_property_range(prop, 0, INT_MAX);
-	RNA_def_property_ui_text(prop, "Center", "Rotation Center point");
-	RNA_def_property_update(prop, 0, "rna_Modifier_update");
-
 	prop = RNA_def_property(srna, "radius", PROP_INT, PROP_PIXEL);
 	RNA_def_property_int_sdna(prop, NULL, "radius");
 	RNA_def_property_range(prop, 0, INT_MAX);
@@ -5920,10 +5915,11 @@ static void rna_def_modifier_gpencilswirl(BlenderRNA *brna)
 	RNA_def_property_ui_text(prop, "Transparent", "Make image transparent outside of radius");
 	RNA_def_property_update(prop, 0, "rna_Modifier_update");
 
-	prop = RNA_def_property(srna, "use_loc", PROP_BOOLEAN, PROP_NONE);
-	RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_SWIRL_USE_OB_LOC);
-	RNA_def_property_ui_text(prop, "Use Location", "Use object location as center");
-	RNA_def_property_update(prop, 0, "rna_Modifier_update");
+	prop = RNA_def_property(srna, "object", PROP_POINTER, PROP_NONE);
+	RNA_def_property_ui_text(prop, "Object", "Object to determine center location");
+	RNA_def_property_pointer_funcs(prop, NULL, "rna_GpencilSwirlModifier_object_set", NULL, NULL);
+	RNA_def_property_flag(prop, PROP_EDITABLE | PROP_ID_SELF_CHECK);
+	RNA_def_property_update(prop, 0, "rna_Modifier_dependency_update");
 }
 
 static void rna_def_modifier_gpencilflip(BlenderRNA *brna)
diff --git a/source/blender/modifiers/intern/MOD_gpencilswirl.c b/source/blender/modifiers/intern/MOD_gpencilswirl.c
index 424bc666db8..123b99e83a6 100644
--- a/source/blender/modifiers/intern/MOD_gpencilswirl.c
+++ b/source/blender/modifiers/intern/MOD_gpencilswirl.c
@@ -37,15 +37,48 @@
 #include "BLI_math_base.h"
 #include "BLI_utildefines.h"
 
+#include "BKE_library_query.h"
+
 #include "MOD_modifiertypes.h"
 
+#include "DEG_depsgraph.h"
+#include "DEG_depsgraph_build.h"
+
 static void initData(ModifierData *md)
 {
 	GpencilSwirlModifierData *gpmd = (GpencilSwirlModifierData *)md;
 	gpmd->radius = 100;
-	ARRAY_SET_ITEMS(gpmd->center, 600, 600);
 	gpmd->angle = M_PI_2;
-	gpmd->flag |= GP_SWIRL_USE_OB_LOC;
+}
+
+static void updateDepsgraph(ModifierData *md,
+	struct Main *UNUSED(bmain),
+	struct Scene *UNUSED(scene),
+	Object *object,
+	struct DepsNodeHandle *node)
+{
+	GpencilSwirlModifierData *lmd = (GpencilSwirlModifierData *)md;
+	if (lmd->object != NULL) {
+		DEG_add_object_relation(node, lmd->object, DEG_OB_COMP_GEOMETRY, "Swirl Modifier");
+		DEG_add_object_relation(node, lmd->object, DEG_OB_COMP_TRANSFORM, "Swirl Modifier");
+	}
+	DEG_add_object_relation(node, object, DEG_OB_COMP_TRANSFORM, "Swirl Modifier");
+}
+
+static bool isDisabled(ModifierData *md, int UNUSED(userRenderParams))
+{
+	GpencilSwirlModifierData *mmd = (GpencilSwirlModifierData *)md;
+
+	return !mmd->object;
+}
+
+static void foreachObjectLink(
+	ModifierData *md, Object *ob,
+	ObjectWalkFunc walk, void *

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list