[Bf-blender-cvs] [d883491e40b] temp-lineart-contained: GPencil: Fading control for opacity/thickness modifier updated.

YimingWu noreply at git.blender.org
Fri Apr 2 06:59:00 CEST 2021


Commit: d883491e40b93a84f0006b6dbf010e48c8474d26
Author: YimingWu
Date:   Fri Apr 2 12:58:30 2021 +0800
Branches: temp-lineart-contained
https://developer.blender.org/rBd883491e40b93a84f0006b6dbf010e48c8474d26

GPencil: Fading control for opacity/thickness modifier updated.

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

M	source/blender/gpencil_modifiers/intern/MOD_gpencil_ui_common.c
M	source/blender/gpencil_modifiers/intern/MOD_gpencil_ui_common.h
M	source/blender/gpencil_modifiers/intern/MOD_gpencilopacity.c
M	source/blender/gpencil_modifiers/intern/MOD_gpencilthick.c
M	source/blender/makesdna/DNA_gpencil_modifier_defaults.h
M	source/blender/makesdna/DNA_gpencil_modifier_types.h
M	source/blender/makesrna/intern/rna_gpencil_modifier.c

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

diff --git a/source/blender/gpencil_modifiers/intern/MOD_gpencil_ui_common.c b/source/blender/gpencil_modifiers/intern/MOD_gpencil_ui_common.c
index a156fca5b7b..0d2e7e93d52 100644
--- a/source/blender/gpencil_modifiers/intern/MOD_gpencil_ui_common.c
+++ b/source/blender/gpencil_modifiers/intern/MOD_gpencil_ui_common.c
@@ -203,6 +203,21 @@ void gpencil_modifier_curve_panel_draw(const bContext *UNUSED(C), Panel *panel)
   uiTemplateCurveMapping(layout, ptr, "curve", 0, false, false, false, false);
 }
 
+void gpencil_modifier_fading_draw(const bContext *UNUSED(C), Panel *panel)
+{
+  PointerRNA *ptr = gpencil_modifier_panel_get_property_pointers(panel, NULL);
+
+  uiLayout *layout = panel->layout;
+  uiLayoutSetPropSep(layout, true);
+
+  bool fading_enabled = RNA_boolean_get(ptr, "use_fading");
+  uiItemR(layout, ptr, "object", 0, NULL, ICON_CUBE);
+  uiLayout *sub = uiLayoutColumn(layout, true);
+  uiItemR(sub, ptr, "fading_start", 0, NULL, ICON_NONE);
+  uiItemR(sub, ptr, "fading_end", 0, IFACE_("End"), ICON_NONE);
+  uiItemR(layout, ptr, "fading_end_factor", 0, NULL, ICON_NONE);
+}
+
 /**
  * Draw modifier error message.
  */
diff --git a/source/blender/gpencil_modifiers/intern/MOD_gpencil_ui_common.h b/source/blender/gpencil_modifiers/intern/MOD_gpencil_ui_common.h
index 782b36d47ed..75907aaa781 100644
--- a/source/blender/gpencil_modifiers/intern/MOD_gpencil_ui_common.h
+++ b/source/blender/gpencil_modifiers/intern/MOD_gpencil_ui_common.h
@@ -37,6 +37,8 @@ void gpencil_modifier_masking_panel_draw(Panel *panel, bool use_material, bool u
 void gpencil_modifier_curve_header_draw(const bContext *C, Panel *panel);
 void gpencil_modifier_curve_panel_draw(const bContext *C, Panel *panel);
 
+void gpencil_modifier_fading_draw(const bContext *UNUSED(C), Panel *panel);
+
 void gpencil_modifier_panel_end(struct uiLayout *layout, PointerRNA *ptr);
 
 struct PointerRNA *gpencil_modifier_panel_get_property_pointers(struct Panel *panel,
diff --git a/source/blender/gpencil_modifiers/intern/MOD_gpencilopacity.c b/source/blender/gpencil_modifiers/intern/MOD_gpencilopacity.c
index c193fc49362..77aa76dc6a2 100644
--- a/source/blender/gpencil_modifiers/intern/MOD_gpencilopacity.c
+++ b/source/blender/gpencil_modifiers/intern/MOD_gpencilopacity.c
@@ -47,6 +47,8 @@
 #include "BKE_screen.h"
 
 #include "DEG_depsgraph.h"
+#include "DEG_depsgraph_build.h"
+#include "DEG_depsgraph_query.h"
 
 #include "UI_interface.h"
 #include "UI_resources.h"
@@ -84,6 +86,39 @@ static void copyData(const GpencilModifierData *md, GpencilModifierData *target)
   tgmd->curve_intensity = BKE_curvemapping_copy(gmd->curve_intensity);
 }
 
+static float give_opacity_fading_factor(OpacityGpencilModifierData *mmd,
+                                        Object *ob_this,
+                                        float *pos,
+                                        bool apply_obmat)
+{
+  float factor_depth = 1;
+
+  if (((mmd->flag & GP_OPACITY_FADING) == 0) || ((mmd->object) == NULL)) {
+    return factor_depth;
+  }
+
+  float gvert[3];
+  if (apply_obmat) {
+    mul_v3_m4v3(gvert, ob_this->obmat, pos);
+  }
+  float dist = len_v3v3(mmd->object->obmat[3], gvert);
+  float fading_max = MAX2(mmd->fading_start, mmd->fading_end);
+  float fading_min = MIN2(mmd->fading_start, mmd->fading_end);
+
+  /* Better with ratiof() function from line art. */
+  if (dist > fading_max) {
+    factor_depth = 0;
+  }
+  else if (dist <= fading_max && dist > fading_min) {
+    factor_depth = (fading_max - dist) / (fading_max - fading_min);
+  }
+  else {
+    factor_depth = 1;
+  }
+
+  return factor_depth;
+}
+
 /* opacity strokes */
 static void deformStroke(GpencilModifierData *md,
                          Depsgraph *UNUSED(depsgraph),
@@ -138,6 +173,9 @@ static void deformStroke(GpencilModifierData *md,
         factor_curve *= BKE_curvemapping_evaluateF(mmd->curve_intensity, 0, value);
       }
 
+      float factor_depth = give_opacity_fading_factor(mmd, ob, &pt->x, true);
+      factor_curve = interpf(mmd->factor, mmd->fading_end_factor, factor_depth);
+
       if (def_nr < 0) {
         if (mmd->flag & GP_OPACITY_NORMALIZE) {
           pt->strength = factor_curve;
@@ -167,6 +205,10 @@ static void deformStroke(GpencilModifierData *md,
   /* Fill using opacity factor. */
   if (mmd->modify_color != GP_MODIFY_COLOR_STROKE) {
     gps->fill_opacity_fac = mmd->factor;
+
+    float factor_depth = give_opacity_fading_factor(mmd, ob, ob->obmat[3], true);
+    gps->fill_opacity_fac = interpf(mmd->factor, mmd->fading_end_factor, factor_depth);
+
     CLAMP(gps->fill_opacity_fac, 0.0f, 1.0f);
   }
 }
@@ -201,6 +243,16 @@ static void foreachIDLink(GpencilModifierData *md, Object *ob, IDWalkFunc walk,
   OpacityGpencilModifierData *mmd = (OpacityGpencilModifierData *)md;
 
   walk(userData, ob, (ID **)&mmd->material, IDWALK_CB_USER);
+  walk(userData, ob, (ID **)&mmd->object, IDWALK_CB_NOP);
+}
+
+static void updateDepsgraph(GpencilModifierData *md, const ModifierUpdateDepsgraphContext *ctx)
+{
+  OpacityGpencilModifierData *mmd = (OpacityGpencilModifierData *)md;
+  if (mmd->object != NULL) {
+    DEG_add_object_relation(ctx->node, mmd->object, DEG_OB_COMP_TRANSFORM, "Opacity Modifier");
+  }
+  DEG_add_object_relation(ctx->node, ctx->object, DEG_OB_COMP_TRANSFORM, "Opacity Modifier");
 }
 
 static void panel_draw(const bContext *UNUSED(C), Panel *panel)
@@ -228,6 +280,20 @@ static void panel_draw(const bContext *UNUSED(C), Panel *panel)
   gpencil_modifier_panel_end(layout, ptr);
 }
 
+static void fading_header_draw(const bContext *UNUSED(C), Panel *panel)
+{
+  uiLayout *layout = panel->layout;
+
+  PointerRNA *ptr = gpencil_modifier_panel_get_property_pointers(panel, NULL);
+
+  uiItemR(layout, ptr, "use_fading", 0, NULL, ICON_NONE);
+}
+
+static void fading_panel_draw(const bContext *C, Panel *panel)
+{
+  gpencil_modifier_fading_draw(C, panel);
+}
+
 static void mask_panel_draw(const bContext *UNUSED(C), Panel *panel)
 {
   PointerRNA *ptr = gpencil_modifier_panel_get_property_pointers(panel, NULL);
@@ -270,6 +336,8 @@ static void panelRegister(ARegionType *region_type)
       region_type, "mask", "Influence", NULL, mask_panel_draw, panel_type);
   gpencil_modifier_subpanel_register(
       region_type, "curve", "", curve_header_draw, curve_panel_draw, mask_panel_type);
+  PanelType *fading_panel_type = gpencil_modifier_subpanel_register(
+      region_type, "fading", "", fading_header_draw, fading_panel_draw, panel_type);
 }
 
 GpencilModifierTypeInfo modifierType_Gpencil_Opacity = {
@@ -289,7 +357,7 @@ GpencilModifierTypeInfo modifierType_Gpencil_Opacity = {
     /* initData */ initData,
     /* freeData */ freeData,
     /* isDisabled */ NULL,
-    /* updateDepsgraph */ NULL,
+    /* updateDepsgraph */ updateDepsgraph,
     /* dependsOnTime */ NULL,
     /* foreachIDLink */ foreachIDLink,
     /* foreachTexLink */ NULL,
diff --git a/source/blender/gpencil_modifiers/intern/MOD_gpencilthick.c b/source/blender/gpencil_modifiers/intern/MOD_gpencilthick.c
index a13f8d64755..bd58daaddea 100644
--- a/source/blender/gpencil_modifiers/intern/MOD_gpencilthick.c
+++ b/source/blender/gpencil_modifiers/intern/MOD_gpencilthick.c
@@ -43,6 +43,8 @@
 #include "BKE_screen.h"
 
 #include "DEG_depsgraph.h"
+#include "DEG_depsgraph_build.h"
+#include "DEG_depsgraph_query.h"
 
 #include "UI_interface.h"
 #include "UI_resources.h"
@@ -128,6 +130,30 @@ static void deformStroke(GpencilModifierData *md,
     }
 
     float curvef = 1.0f;
+
+    float factor_depth = 1;
+
+    if (mmd->flag & GP_THICK_FADING) {
+      if (mmd->object) {
+        float gvert[3];
+        mul_v3_m4v3(gvert, ob->obmat, &pt->x);
+        float dist = len_v3v3(mmd->object->obmat[3], gvert);
+        float fading_max = MAX2(mmd->fading_start, mmd->fading_end);
+        float fading_min = MIN2(mmd->fading_start, mmd->fading_end);
+
+        /* Better with ratiof() function from line art. */
+        if (dist > fading_max) {
+          factor_depth = 0;
+        }
+        else if (dist <= fading_max && dist > fading_min) {
+          factor_depth = (fading_max - dist) / (fading_max - fading_min);
+        }
+        else {
+          factor_depth = 1;
+        }
+      }
+    }
+
     if ((mmd->flag & GP_THICK_CUSTOM_CURVE) && (mmd->curve_thickness)) {
       /* Normalize value to evaluate curve. */
       float value = (float)i / (gps->totpoints - 1);
@@ -144,6 +170,9 @@ static void deformStroke(GpencilModifierData *md,
       weight *= curvef;
     }
 
+    float fac_begin = mmd->flag & GP_THICK_NORMALIZE ? 1 : mmd->thickness_fac;
+    target *= interpf(fac_begin, mmd->fading_end_factor, factor_depth);
+
     pt->pressure = interpf(target, pt->pressure, weight);
 
     CLAMP_MIN(pt->pressure, 0.0f);
@@ -171,6 +200,30 @@ static void foreachIDLink(GpencilModifierData *md, Object *ob, IDWalkFunc walk,
   ThickGpencilModifierData *mmd = (ThickGpencilModifierData *)md;
 
   walk(userData, ob, (ID **)&mmd->material, IDWALK_CB_USER);
+  walk(userData, ob, (ID **)&mmd->object, IDWALK_CB_NOP);
+}
+
+static void updateDepsgraph(GpencilModifierData *md, const ModifierUpdateDepsgraphContext *ctx)
+{
+  ThickGpencilModifierData *mmd = (ThickGpencilModifierData *)md;
+  if (mmd->object != NULL) {
+    DEG_add_object_relation(ctx->node, mmd->object, DEG_OB_COMP_TRANSFORM, "Thickness Modifier");
+  }
+  DEG_add_object_relation(ctx->node, ctx->object, DEG_OB_COMP_TRANSFORM, "Thickness Modifier");
+}
+
+static void fading_header_draw(const bContext *UNUSED(C), Panel *panel)
+{
+  uiLayout *layout = panel->layout;
+
+  PointerRNA *ptr = gpencil_modifier_panel_get_property_pointers(panel, NULL);
+
+  uiItemR(layout, ptr, "use_fading", 0, NULL, ICON_NONE);
+}
+
+static void fading_panel_draw(const bContext *C, Panel *panel)
+{
+  gpencil_modifier_fading_draw(C, panel);
 }
 
 static void panel_draw(const bContext *UNUSED(C), Panel *panel)
@@ -202,6 +255,8 @@ static void panelRegister(ARegionType *region_type)
 {
   PanelType *panel_type = gpencil_modifier_panel_register(
       region_type, eGpencilModifierType_Thick, panel_draw);
+  PanelType *fading_panel_type = gpencil_modifier_subpanel_register(
+      region_type, "fading", "", fading_header_draw, fading_panel_draw, pa

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list