[Bf-blender-cvs] [6b84b1bb0ac] temp-length-modifier: GPencil Length modifier

YimingWu noreply at git.blender.org
Thu Nov 14 20:05:23 CET 2019


Commit: 6b84b1bb0acf815d54b64c5e6f4dbad981064067
Author: YimingWu
Date:   Thu Nov 14 19:58:05 2019 +0100
Branches: temp-length-modifier
https://developer.blender.org/rB6b84b1bb0acf815d54b64c5e6f4dbad981064067

GPencil Length modifier

This patch includes a modifiers that developed for NPR rendering.

- Length modifier that stretch/shrink a stroke.

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

Prepare patch

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

M	release/scripts/startup/bl_ui/properties_data_modifier.py
M	source/blender/gpencil_modifiers/CMakeLists.txt
M	source/blender/gpencil_modifiers/MOD_gpencil_modifiertypes.h
M	source/blender/gpencil_modifiers/intern/MOD_gpencil_util.c
A	source/blender/gpencil_modifiers/intern/MOD_gpencillength.c
M	source/blender/makesdna/DNA_gpencil_modifier_types.h
M	source/blender/makesrna/RNA_access.h
M	source/blender/makesrna/intern/rna_gpencil_modifier.c

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

diff --git a/release/scripts/startup/bl_ui/properties_data_modifier.py b/release/scripts/startup/bl_ui/properties_data_modifier.py
index 05e8f0fce38..c6ce96b49b8 100644
--- a/release/scripts/startup/bl_ui/properties_data_modifier.py
+++ b/release/scripts/startup/bl_ui/properties_data_modifier.py
@@ -2351,6 +2351,41 @@ class DATA_PT_gpencil_modifiers(ModifierButtonsPanel, Panel):
         sub.active = bool(md.vertex_group)
         sub.prop(md, "invert_vertex_group", text="", icon='ARROW_LEFTRIGHT')
 
+    def GP_LENGTH(self, layout, ob, md):
+        gpd = ob.data
+        sp = layout.split()
+        col = sp.column()
+        col.label(text="Absolute:")
+        col.prop(md, "length")
+
+        col = sp.column()
+        col.label(text="Relative:")
+        col.prop(md, "percentage")
+
+        col = layout.column()
+        col.prop(md, "tip_length");
+
+        col.separator()
+
+        col.label(text="Material:")
+        row = col.row(align=True)
+        row.prop_search(md, "material", gpd, "materials", text="", icon='SHADING_TEXTURE')
+        row.prop(md, "invert_materials", text="", icon='ARROW_LEFTRIGHT')
+        row = layout.row(align=True)
+        row.prop(md, "pass_index", text="Pass")
+        row.prop(md, "invert_material_pass", text="", icon='ARROW_LEFTRIGHT')
+
+        col = layout.column()
+        col.separator()
+
+        col.label(text="Layer:")
+        row = col.row(align=True)
+        row.prop_search(md, "layer", gpd, "layers", text="", icon='GREASEPENCIL')
+        row.prop(md, "invert_layers", text="", icon='ARROW_LEFTRIGHT')
+        row = layout.row(align=True)
+        row.prop(md, "layer_pass", text="Pass")
+        row.prop(md, "invert_layer_pass", text="", icon='ARROW_LEFTRIGHT')
+
     def GP_MULTIPLY(self, layout, ob, md):
         gpd = ob.data
         col = layout.column()
@@ -2360,7 +2395,7 @@ class DATA_PT_gpencil_modifiers(ModifierButtonsPanel, Panel):
         subcol.enabled = md.duplications > 0
         subcol.prop(md, "distance")
         subcol.prop(md, "offset", slider=True)
-    
+
         subcol.separator()
 
         subcol.prop(md, "enable_fading")
@@ -2396,7 +2431,7 @@ class DATA_PT_gpencil_modifiers(ModifierButtonsPanel, Panel):
         row = layout.row(align=True)
         row.prop(md, "layer_pass", text="Pass")
         row.prop(md, "invert_layer_pass", text="", icon='ARROW_LEFTRIGHT')
-            
+
 classes = (
     DATA_PT_modifiers,
     DATA_PT_gpencil_modifiers,
diff --git a/source/blender/gpencil_modifiers/CMakeLists.txt b/source/blender/gpencil_modifiers/CMakeLists.txt
index 44335f4da25..fa01a1cbad3 100644
--- a/source/blender/gpencil_modifiers/CMakeLists.txt
+++ b/source/blender/gpencil_modifiers/CMakeLists.txt
@@ -49,6 +49,7 @@ set(SRC
   intern/MOD_gpencilcolor.c
   intern/MOD_gpencilhook.c
   intern/MOD_gpencillattice.c
+  intern/MOD_gpencillength.c
   intern/MOD_gpencilmirror.c
   intern/MOD_gpencilmultiply.c
   intern/MOD_gpencilnoise.c
diff --git a/source/blender/gpencil_modifiers/MOD_gpencil_modifiertypes.h b/source/blender/gpencil_modifiers/MOD_gpencil_modifiertypes.h
index f5c064c1c07..b84ccbcab64 100644
--- a/source/blender/gpencil_modifiers/MOD_gpencil_modifiertypes.h
+++ b/source/blender/gpencil_modifiers/MOD_gpencil_modifiertypes.h
@@ -42,6 +42,7 @@ extern GpencilModifierTypeInfo modifierType_Gpencil_Hook;
 extern GpencilModifierTypeInfo modifierType_Gpencil_Offset;
 extern GpencilModifierTypeInfo modifierType_Gpencil_Armature;
 extern GpencilModifierTypeInfo modifierType_Gpencil_Time;
+extern GpencilModifierTypeInfo modifierType_Gpencil_Length;
 extern GpencilModifierTypeInfo modifierType_Gpencil_Multiply;
 
 /* MOD_gpencil_util.c */
diff --git a/source/blender/gpencil_modifiers/intern/MOD_gpencil_util.c b/source/blender/gpencil_modifiers/intern/MOD_gpencil_util.c
index 16e585705df..b3321b693a4 100644
--- a/source/blender/gpencil_modifiers/intern/MOD_gpencil_util.c
+++ b/source/blender/gpencil_modifiers/intern/MOD_gpencil_util.c
@@ -71,6 +71,7 @@ void gpencil_modifier_type_init(GpencilModifierTypeInfo *types[])
   INIT_GP_TYPE(Offset);
   INIT_GP_TYPE(Armature);
   INIT_GP_TYPE(Time);
+  INIT_GP_TYPE(Length);
   INIT_GP_TYPE(Multiply);
 #undef INIT_GP_TYPE
 }
diff --git a/source/blender/gpencil_modifiers/intern/MOD_gpencillength.c b/source/blender/gpencil_modifiers/intern/MOD_gpencillength.c
new file mode 100644
index 00000000000..4828a0e3dd8
--- /dev/null
+++ b/source/blender/gpencil_modifiers/intern/MOD_gpencillength.c
@@ -0,0 +1,179 @@
+/*
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software  Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * The Original Code is Copyright (C) 2017, Blender Foundation
+ * This is a new part of Blender
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ *
+ */
+
+/** \file blender/gpencil_modifiers/intern/MOD_gpencilstrokes.c
+ *  \ingroup modifiers
+ */
+
+#include <stdio.h>
+
+#include "MEM_guardedalloc.h"
+
+#include "DNA_scene_types.h"
+#include "DNA_object_types.h"
+#include "DNA_gpencil_types.h"
+#include "DNA_gpencil_modifier_types.h"
+
+#include "BLI_blenlib.h"
+#include "BLI_rand.h"
+#include "BLI_math.h"
+#include "BLI_utildefines.h"
+#include "BLI_linklist.h"
+#include "BLI_alloca.h"
+
+#include "BKE_gpencil.h"
+#include "BKE_gpencil_modifier.h"
+#include "BKE_modifier.h"
+#include "BKE_context.h"
+#include "BKE_global.h"
+#include "BKE_object.h"
+#include "BKE_main.h"
+#include "BKE_scene.h"
+#include "BKE_layer.h"
+#include "BKE_library_query.h"
+#include "BKE_collection.h"
+#include "BKE_mesh.h"
+#include "BKE_mesh_mapping.h"
+
+#include "bmesh.h"
+#include "bmesh_tools.h"
+
+#include "DEG_depsgraph.h"
+#include "DEG_depsgraph_build.h"
+#include "DEG_depsgraph_query.h"
+
+#include "MOD_gpencil_util.h"
+#include "MOD_gpencil_modifiertypes.h"
+
+static void copyData(const GpencilModifierData *md, GpencilModifierData *target)
+{
+  BKE_gpencil_modifier_copyData_generic(md, target);
+}
+
+static void stretchOrShrinkStroke(bGPDstroke *gps, float length, float tip_length)
+{
+  if (length > 0.0f) {
+    BKE_gpencil_stretch_stroke(gps, length, tip_length);
+  }
+  else {
+    BKE_gpencil_shrink_stroke(gps, -length);
+  }
+}
+
+static void applyLength(bGPDstroke *gps, float length, float percentage, float tip_length)
+{
+
+  stretchOrShrinkStroke(gps, length, tip_length);
+
+  float len = BKE_gpencil_stroke_length(gps, true);
+  if (len < FLT_EPSILON) {
+    return;
+  }
+  float length2 = len * percentage / 2.0f; /* Srinking from two tips. */
+
+  stretchOrShrinkStroke(gps, length2, tip_length);
+}
+
+static void bakeModifier(Main *UNUSED(bmain),
+                         Depsgraph *depsgraph,
+                         GpencilModifierData *md,
+                         Object *ob)
+{
+
+  bGPdata *gpd = ob->data;
+
+  for (bGPDlayer *gpl = gpd->layers.first; gpl; gpl = gpl->next) {
+    for (bGPDframe *gpf = gpl->frames.first; gpf; gpf = gpf->next) {
+      LengthGpencilModifierData *lmd = (LengthGpencilModifierData *)md;
+      bGPDstroke *gps;
+      for (gps = gpf->strokes.first; gps; gps = gps->next) {
+        if (is_stroke_affected_by_modifier(ob,
+                                           lmd->layername,
+                                           lmd->materialname,
+                                           lmd->pass_index,
+                                           lmd->layer_pass,
+                                           1,
+                                           gpl,
+                                           gps,
+                                           lmd->flag & GP_MIRROR_INVERT_LAYER,
+                                           lmd->flag & GP_MIRROR_INVERT_PASS,
+                                           lmd->flag & GP_MIRROR_INVERT_LAYERPASS,
+                                           lmd->flag & GP_MIRROR_INVERT_MATERIAL)) {
+          applyLength(gps, lmd->length, lmd->percentage, lmd->tip_length);
+        }
+      }
+    }
+  }
+}
+
+/* -------------------------------- */
+
+/* Generic "generateStrokes" callback */
+static void deformStroke(GpencilModifierData *md,
+                         Depsgraph *depsgraph,
+                         Object *ob,
+                         bGPDlayer *gpl,
+                         bGPDframe *UNUSED(gpf),
+                         bGPDstroke *gps)
+{
+  LengthGpencilModifierData *lmd = (LengthGpencilModifierData *)md;
+  if (is_stroke_affected_by_modifier(ob,
+                                     lmd->layername,
+                                     lmd->materialname,
+                                     lmd->pass_index,
+                                     lmd->layer_pass,
+                                     1,
+                                     gpl,
+                                     gps,
+                                     lmd->flag & GP_MIRROR_INVERT_LAYER,
+                                     lmd->flag & GP_MIRROR_INVERT_PASS,
+                                     lmd->flag & GP_MIRROR_INVERT_LAYERPASS,
+                                     lmd->flag & GP_MIRROR_INVERT_MATERIAL)) {
+    applyLength(gps, lmd->length, lmd->percentage, lmd->tip_length);
+  }
+}
+
+GpencilModifierTypeInfo modifierType_Gpencil_Length = {
+    /* name */ "Length",
+    /* structName */ "LengthGpencilModifierData",
+    /* structSize */ sizeof(LengthGpencilModifierData),
+    /* type */ eGpencilModifierTypeType_Gpencil,
+    /* flags */ eGpencilModifierTypeFlag_SupportsEditmode,
+
+    /* copyData */ copyData,
+
+    /* deformStroke */ deformStroke,
+    /* generateStrokes */ NULL,
+    /* bak

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list