[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