[Bf-blender-cvs] [7d712dcd0bb] master: Gpencil: Add offset(Location, Rotation, Scale) by Layer, Stroke and Material to Offset modifier

frogstomp noreply at git.blender.org
Thu Jan 5 19:22:41 CET 2023


Commit: 7d712dcd0bbdac04c7721bd616d8abaac806b53a
Author: frogstomp
Date:   Thu Jan 5 19:20:04 2023 +0100
Branches: master
https://developer.blender.org/rB7d712dcd0bbdac04c7721bd616d8abaac806b53a

Gpencil: Add offset(Location, Rotation, Scale) by Layer, Stroke and Material to Offset modifier

This patch adds two new panels in which users can control
offset (position, rotation, scale) by layer and by stroke number.

Use cases:
- if you want to create array of Suzannes and place them one behind 
another, in 2d mode, Z depth will be wrong. 
In 3d mode there will be Z fighting. With combination of stroke 
and layer offset we can fight this issue without touching original drawing.
- even easier way to create 2.5d environments.. 
simply draw on layers and then displace them in one panel 
instead fiddling with every layer individually

Possible improvements:
- add offset by material slot
- add step parameter, to allow displacing groups of N strokes.

{F13129598}

Reviewed By: mendio, antoniov

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

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

M	source/blender/gpencil_modifiers/intern/MOD_gpenciloffset.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_gpenciloffset.c b/source/blender/gpencil_modifiers/intern/MOD_gpenciloffset.c
index 8f0abd0a88e..b1079d1b292 100644
--- a/source/blender/gpencil_modifiers/intern/MOD_gpenciloffset.c
+++ b/source/blender/gpencil_modifiers/intern/MOD_gpenciloffset.c
@@ -15,12 +15,16 @@
 
 #include "BLT_translation.h"
 
+#include "BLI_hash.h"
+#include "BLI_math.h"
+#include "BLI_rand.h"
 #include "DNA_defaults.h"
 #include "DNA_gpencil_modifier_types.h"
 #include "DNA_gpencil_types.h"
 #include "DNA_meshdata_types.h"
 #include "DNA_object_types.h"
 #include "DNA_screen_types.h"
+#include "RNA_access.h"
 
 #include "BKE_context.h"
 #include "BKE_deform.h"
@@ -31,6 +35,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"
@@ -46,6 +52,8 @@ static void initData(GpencilModifierData *md)
   BLI_assert(MEMCMP_STRUCT_AFTER_IS_ZERO(gpmd, modifier));
 
   MEMCPY_STRUCT_AFTER(gpmd, DNA_struct_default_get(OffsetGpencilModifierData), modifier);
+  /* Open the first subpanel too, because it's activated by default. */
+  md->ui_expand_flag = UI_PANEL_DATA_EXPAND_ROOT | UI_SUBPANEL_DATA_EXPAND_1;
 }
 
 static void copyData(const GpencilModifierData *md, GpencilModifierData *target)
@@ -84,6 +92,8 @@ static void deformStroke(GpencilModifierData *md,
 
   const bool is_randomized = !(is_zero_v3(mmd->rnd_offset) && is_zero_v3(mmd->rnd_rot) &&
                                is_zero_v3(mmd->rnd_scale));
+  const bool is_general = !(is_zero_v3(mmd->loc) && is_zero_v3(mmd->rot) &&
+                            is_zero_v3(mmd->scale));
 
   int seed = mmd->seed;
   /* Make sure different modifiers get different seeds. */
@@ -92,8 +102,9 @@ static void deformStroke(GpencilModifierData *md,
 
   float rand[3][3];
   float rand_offset = BLI_hash_int_01(seed);
+  bGPdata *gpd = ob->data;
 
-  if (is_randomized) {
+  if (is_randomized && mmd->mode == GP_OFFSET_RANDOM) {
     /* Get stroke index for random offset. */
     int rnd_index = BLI_findindex(&gpf->strokes, gps);
     for (int j = 0; j < 3; j++) {
@@ -117,9 +128,39 @@ static void deformStroke(GpencilModifierData *md,
       }
     }
   }
+  else {
+    if (is_randomized) {
+      const int step = max_ii(mmd->stroke_step, 1);
+      const int start_offset = mmd->stroke_start_offset;
+      int offset_index;
+      int offset_size;
+      float offset_factor;
+      switch (mmd->mode) {
+        case GP_OFFSET_STROKE:
+          offset_size = max_ii(BLI_listbase_count(&gpf->strokes), 1);
+          offset_index = max_ii(BLI_findindex(&gpf->strokes, gps), 0);
+          break;
+        case GP_OFFSET_MATERIAL:
+          offset_size = max_ii(gpd->totcol, 1);
+          offset_index = max_ii(gps->mat_nr, 0);
+          break;
+        case GP_OFFSET_LAYER:
+          offset_size = max_ii(BLI_listbase_count(&gpd->layers), 1);
+          offset_index = max_ii(BLI_findindex(&gpd->layers, gpl), 0);
+          break;
+      }
 
-  bGPdata *gpd = ob->data;
-
+      offset_factor = ((offset_size - (offset_index / step + start_offset % offset_size) %
+                                          offset_size * step % offset_size) -
+                       1) /
+                      (float)offset_size;
+      for (int j = 0; j < 3; j++) {
+        for (int i = 0; i < 3; i++) {
+          rand[j][i] = offset_factor;
+        }
+      }
+    }
+  }
   for (int i = 0; i < gps->totpoints; i++) {
     bGPDspoint *pt = &gps->points[i];
     MDeformVert *dvert = gps->dvert != NULL ? &gps->dvert[i] : NULL;
@@ -151,17 +192,19 @@ static void deformStroke(GpencilModifierData *md,
     }
 
     /* Calculate matrix. */
-    mul_v3_v3fl(loc, mmd->loc, weight);
-    mul_v3_v3fl(rot, mmd->rot, weight);
-    mul_v3_v3fl(scale, mmd->scale, weight);
-    add_v3_fl(scale, 1.0);
-    loc_eul_size_to_mat4(mat, loc, rot, scale);
-
-    /* Apply scale to thickness. */
-    float unit_scale = (fabsf(scale[0]) + fabsf(scale[1]) + fabsf(scale[2])) / 3.0f;
-    pt->pressure *= unit_scale;
-
-    mul_m4_v3(mat, &pt->x);
+    if (is_general) {
+      mul_v3_v3fl(loc, mmd->loc, weight);
+      mul_v3_v3fl(rot, mmd->rot, weight);
+      mul_v3_v3fl(scale, mmd->scale, weight);
+      add_v3_fl(scale, 1.0f);
+      loc_eul_size_to_mat4(mat, loc, rot, scale);
+
+      /* Apply scale to thickness. */
+      float unit_scale = (fabsf(scale[0]) + fabsf(scale[1]) + fabsf(scale[2])) / 3.0f;
+      pt->pressure *= unit_scale;
+
+      mul_m4_v3(mat, &pt->x);
+    }
   }
   /* Calc geometry data. */
   BKE_gpencil_stroke_geometry_update(gpd, gps);
@@ -175,6 +218,13 @@ static void bakeModifier(struct Main *UNUSED(bmain),
   generic_bake_deform_stroke(depsgraph, md, ob, false, deformStroke);
 }
 
+static void updateDepsgraph(GpencilModifierData *md,
+                            const ModifierUpdateDepsgraphContext *ctx,
+                            const int UNUSED(mode))
+{
+  DEG_add_object_relation(ctx->node, ctx->object, DEG_OB_COMP_TRANSFORM, "Offset Modifier");
+}
+
 static void foreachIDLink(GpencilModifierData *md, Object *ob, IDWalkFunc walk, void *userData)
 {
   OffsetGpencilModifierData *mmd = (OffsetGpencilModifierData *)md;
@@ -187,7 +237,6 @@ static void panel_draw(const bContext *UNUSED(C), Panel *panel)
   uiLayout *layout = panel->layout;
 
   PointerRNA *ptr = gpencil_modifier_panel_get_property_pointers(panel, NULL);
-
   uiLayoutSetPropSep(layout, true);
 
   uiItemR(layout, ptr, "location", 0, NULL, ICON_NONE);
@@ -195,21 +244,51 @@ static void panel_draw(const bContext *UNUSED(C), Panel *panel)
   uiItemR(layout, ptr, "scale", 0, NULL, ICON_NONE);
 
   gpencil_modifier_panel_end(layout, ptr);
+  uiLayoutSetActive(layout, true);
 }
 
-static void random_panel_draw(const bContext *UNUSED(C), Panel *panel)
+static void empty_panel_draw(const bContext *UNUSED(C), Panel *panel)
 {
   uiLayout *layout = panel->layout;
 
   PointerRNA *ptr = gpencil_modifier_panel_get_property_pointers(panel, NULL);
+  uiLayoutSetPropSep(layout, true);
 
+  gpencil_modifier_panel_end(layout, ptr);
+}
+
+static void random_panel_draw(const bContext *UNUSED(C), Panel *panel)
+{
+  uiLayout *layout = panel->layout;
+
+  PointerRNA *ptr = gpencil_modifier_panel_get_property_pointers(panel, NULL);
+  int mode = RNA_enum_get(ptr, "mode");
   uiLayoutSetPropSep(layout, true);
 
+  uiItemR(layout, ptr, "mode", 0, NULL, ICON_NONE);
+
   uiItemR(layout, ptr, "random_offset", 0, IFACE_("Offset"), ICON_NONE);
   uiItemR(layout, ptr, "random_rotation", 0, IFACE_("Rotation"), ICON_NONE);
   uiItemR(layout, ptr, "random_scale", 0, IFACE_("Scale"), ICON_NONE);
-  uiItemR(layout, ptr, "use_uniform_random_scale", 0, NULL, ICON_NONE);
-  uiItemR(layout, ptr, "seed", 0, NULL, ICON_NONE);
+  switch (mode) {
+    case GP_OFFSET_RANDOM:
+      uiItemR(layout, ptr, "use_uniform_random_scale", 0, NULL, ICON_NONE);
+      uiItemR(layout, ptr, "seed", 0, NULL, ICON_NONE);
+      break;
+    case GP_OFFSET_STROKE:
+      uiItemR(layout, ptr, "stroke_step", 0, IFACE_("Stroke Step"), ICON_NONE);
+      uiItemR(layout, ptr, "stroke_start_offset", 0, IFACE_("Stroke Offset"), ICON_NONE);
+      break;
+    case GP_OFFSET_MATERIAL:
+      uiItemR(layout, ptr, "stroke_step", 0, IFACE_("Material Step"), ICON_NONE);
+      uiItemR(layout, ptr, "stroke_start_offset", 0, IFACE_("Material Offset"), ICON_NONE);
+      break;
+    case GP_OFFSET_LAYER:
+      uiItemR(layout, ptr, "stroke_step", 0, IFACE_("Layer Step"), ICON_NONE);
+      uiItemR(layout, ptr, "stroke_start_offset", 0, IFACE_("Layer Offset"), ICON_NONE);
+      break;
+  }
+  gpencil_modifier_panel_end(layout, ptr);
 }
 
 static void mask_panel_draw(const bContext *UNUSED(C), Panel *panel)
@@ -220,9 +299,11 @@ static void mask_panel_draw(const bContext *UNUSED(C), Panel *panel)
 static void panelRegister(ARegionType *region_type)
 {
   PanelType *panel_type = gpencil_modifier_panel_register(
-      region_type, eGpencilModifierType_Offset, panel_draw);
+      region_type, eGpencilModifierType_Offset, empty_panel_draw);
+  gpencil_modifier_subpanel_register(
+      region_type, "general", "General", NULL, panel_draw, panel_type);
   gpencil_modifier_subpanel_register(
-      region_type, "randomize", "Randomize", NULL, random_panel_draw, panel_type);
+      region_type, "randomize", "Advanced", NULL, random_panel_draw, panel_type);
   gpencil_modifier_subpanel_register(
       region_type, "mask", "Influence", NULL, mask_panel_draw, panel_type);
 }
@@ -244,7 +325,7 @@ GpencilModifierTypeInfo modifierType_Gpencil_Offset = {
     /* initData */ initData,
     /* freeData */ NULL,
     /* isDisabled */ NULL,
-    /* updateDepsgraph */ NULL,
+    /* updateDepsgraph */ updateDepsgraph,
     /* dependsOnTime */ NULL,
     /* foreachIDLink */ foreachIDLink,
     /* foreachTexLink */ NULL,
diff --git a/source/blender/makesdna/DNA_gpencil_modifier_defaults.h b/source/blender/makesdna/DNA_gpencil_modifier_defaults.h
index 8078283df7a..ae27cbb0195 100644
--- a/source/blender/makesdna/DNA_gpencil_modifier_defaults.h
+++ b/source/blender/makesdna/DNA_gpencil_modifier_defaults.h
@@ -152,6 +152,9 @@
     .vgname = "", \
     .pass_index = 0, \
     .flag = 0, \
+    .stroke_step = 1, \
+    .mode = GP_OFFSET_RANDOM, \
+    .stroke_start_offset = 0, \
     .loc = {0.0f, 0.0f, 0.0f}, \
     .rot = {0.0f, 0.0f, 0.0f}, \
     .scale = {0.0f, 0.0f, 0.0f}, \
diff --git a/source/blender/makesdna/DNA_gpencil_modifier_types.h b/source/blender/makesdna/DNA_gpencil_modifier_types.h
index 0932b7107bb..3f56a25a19b 100644
--- a/source/blender/makesdna/DNA_gpencil_modifier_types.h
+++ b/source/blender/makesdna/DNA_gpencil_modifier_types.h
@@ -388,6 +388,7 @@ typedef struct ArrayGpencilModifierData {
   float rnd_rot[3];
   /** Random Scales. */
   float rnd_scale[3];
+
   char _pad[4];
   /** (first element is the index) random values. */
   int seed;
@@ -759,8 +760,17 @@ typedef enum eSimplifyGpencil_Mode {
   GP_SIMPLIFY_MERGE = 3,
 } eSimplifyGpencil_Mode;
 
+typedef enum eOffsetGpencil_Mode {
+  GP_OFFSET_RANDOM = 0,
+  GP_OFFSET_LAYER = 1,
+  GP_OFFSET_MATERIAL = 2,
+  GP_OFFSET_STROKE = 3
+
+} eOffsetGpencil_M

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list