[Bf-blender-cvs] [d62750ecf90] greasepencil-object: GPencil: Add menu for trace and more options

Antonio Vazquez noreply at git.blender.org
Thu Apr 9 18:56:33 CEST 2020


Commit: d62750ecf90c4bcee0ce9d1f3f2f2b611d9f63de
Author: Antonio Vazquez
Date:   Thu Apr 9 12:30:35 2020 +0200
Branches: greasepencil-object
https://developer.blender.org/rBd62750ecf90c4bcee0ce9d1f3f2f2b611d9f63de

GPencil: Add menu for trace and more options

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

M	release/scripts/startup/bl_operators/__init__.py
A	release/scripts/startup/bl_operators/gpencil_trace_image.py
M	release/scripts/startup/bl_ui/space_image.py
M	source/blender/editors/gpencil/gpencil_mesh.c
M	source/blender/editors/gpencil/gpencil_trace.h
M	source/blender/editors/gpencil/gpencil_trace_ops.c
M	source/blender/editors/gpencil/gpencil_trace_utils.c

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

diff --git a/release/scripts/startup/bl_operators/__init__.py b/release/scripts/startup/bl_operators/__init__.py
index bca9bce8fea..e52a32a6e0d 100644
--- a/release/scripts/startup/bl_operators/__init__.py
+++ b/release/scripts/startup/bl_operators/__init__.py
@@ -49,6 +49,7 @@ _modules = [
     "vertexpaint_dirt",
     "view3d",
     "gpencil_mesh_bake",
+    "gpencil_trace_image",
     "wm",
 ]
 
diff --git a/release/scripts/startup/bl_operators/gpencil_trace_image.py b/release/scripts/startup/bl_operators/gpencil_trace_image.py
new file mode 100644
index 00000000000..3cab16f7d66
--- /dev/null
+++ b/release/scripts/startup/bl_operators/gpencil_trace_image.py
@@ -0,0 +1,114 @@
+# ##### 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.
+#
+# ##### END GPL LICENSE BLOCK #####
+
+# <pep8-80 compliant>
+
+import bpy
+from bpy.types import Operator
+from bpy.props import (
+    IntProperty,
+    FloatProperty,
+    BoolProperty,
+    EnumProperty,
+)
+
+gp_object_items = []
+
+
+def my_objlist_callback(scene, context):
+    gp_object_items.clear()
+    gp_object_items.append(('*NEW', "New Object", ""))
+    for o in context.scene.objects:
+        if o.type == 'GPENCIL':
+            gp_object_items.append((o.name, o.name, ""))
+
+    return gp_object_items
+
+
+class GPENCIL_OT_trace(Operator):
+    bl_idname = "gpencil.trace"
+    bl_label = "Trace Image to Grease Pencil"
+    bl_options = {'REGISTER', 'UNDO'}
+
+    target: EnumProperty(
+        name="Target Object",
+        description="Grease Pencil Object",
+        items=my_objlist_callback
+        )
+    frame_target: IntProperty(
+        name="Target Frame",
+        description="Destination frame for the baked animation",
+        min=1, max=300000,
+        default=1,
+    )
+    thickness: IntProperty(
+        name="Thickness",
+        description="Thickness of the stroke lines",
+        min=1, max=100,
+        default=10,
+    )
+    resolution: IntProperty(
+        name="Resolution",
+        description="Resolution of the generated curves",
+        min=1, max=20,
+        default=5,
+    )
+    scale: FloatProperty(
+        name="Scale",
+        description="Scale of the final output",
+        min=0.001,
+        max=100.0,
+        default=1.0,
+    )
+    threshold: FloatProperty(
+        name="Colot Threshold",
+        description="Determine what is considered white and what blackl",
+        soft_min=0.0, soft_max=1.0,
+        min=0.0, max=1.0,
+        default=0.5,
+        precision=3,
+        step=1,
+    )
+
+    @classmethod
+    def poll(self, context):
+        return True
+
+    def execute(self, context):
+        bpy.ops.gpencil.trace_image(
+            target=self.target,
+            frame_target=self.frame_target,
+            thickness=self.thickness,
+            resolution=self.resolution,
+            scale=self.scale,
+            threshold=self.threshold
+        )
+
+        return {'FINISHED'}
+
+    def invoke(self, context, _event):
+        scene = context.scene
+        self.frame_target = scene.frame_start
+
+        wm = context.window_manager
+        return wm.invoke_props_dialog(self)
+
+
+classes = (
+    GPENCIL_OT_trace,
+)
diff --git a/release/scripts/startup/bl_ui/space_image.py b/release/scripts/startup/bl_ui/space_image.py
index 980f89eaaa4..462681806cf 100644
--- a/release/scripts/startup/bl_ui/space_image.py
+++ b/release/scripts/startup/bl_ui/space_image.py
@@ -242,6 +242,7 @@ class IMAGE_MT_image(Menu):
             layout.separator()
             layout.operator("palette.extract_from_image", text="Extract Palette")
             layout.operator("gpencil.image_to_grease_pencil", text="Generate Grease Pencil")
+            layout.operator("gpencil.trace", text="Trace Image to Grease Pencil...")
 
 
 class IMAGE_MT_image_invert(Menu):
diff --git a/source/blender/editors/gpencil/gpencil_mesh.c b/source/blender/editors/gpencil/gpencil_mesh.c
index 4ad5d36a312..43d1e01ce20 100644
--- a/source/blender/editors/gpencil/gpencil_mesh.c
+++ b/source/blender/editors/gpencil/gpencil_mesh.c
@@ -396,9 +396,9 @@ void GPENCIL_OT_bake_mesh_animation(wmOperatorType *ot)
   RNA_def_int(ot->srna, "frame_target", 1, 1, 100000, "Frame Target", "", 1, 100000);
   RNA_def_string(ot->srna,
                  "target",
-                 "Target",
+                 "*NEW",
                  64,
-                 "",
+                 "Target Object",
                  "Target grease pencil object name. Leave empty for new object");
 
   RNA_def_enum(ot->srna, "project_type", reproject_type, GP_REPROJECT_VIEW, "Projection Type", "");
diff --git a/source/blender/editors/gpencil/gpencil_trace.h b/source/blender/editors/gpencil/gpencil_trace.h
index a020785fc07..dfbf1ccd8a8 100644
--- a/source/blender/editors/gpencil/gpencil_trace.h
+++ b/source/blender/editors/gpencil/gpencil_trace.h
@@ -67,6 +67,9 @@ void ED_gpencil_trace_image_to_bm(struct ImBuf *ibuf,
 void ED_gpencil_trace_data_to_gp(potrace_state_t *st,
                                  struct Object *ob,
                                  struct bGPDframe *gpf,
-                                 int offset[2]);
+                                 int offset[2],
+                                 const float scale,
+                                 const int resolution,
+                                 const int thickness);
 
 #endif /* __GPENCIL_TRACE_H__ */
diff --git a/source/blender/editors/gpencil/gpencil_trace_ops.c b/source/blender/editors/gpencil/gpencil_trace_ops.c
index 348dc2faba8..6916399d0bd 100644
--- a/source/blender/editors/gpencil/gpencil_trace_ops.c
+++ b/source/blender/editors/gpencil/gpencil_trace_ops.c
@@ -88,6 +88,9 @@ static int gp_trace_image_exec(bContext *C, wmOperator *op)
   RNA_string_get(op->ptr, "target", target);
   const int frame_target = RNA_int_get(op->ptr, "frame_target");
   const float threshold = RNA_float_get(op->ptr, "threshold");
+  const float scale = RNA_float_get(op->ptr, "scale");
+  const int resolution = RNA_int_get(op->ptr, "resolution");
+  const int thickness = RNA_int_get(op->ptr, "thickness");
 
   ImBuf *ibuf;
   void *lock;
@@ -163,7 +166,7 @@ static int gp_trace_image_exec(bContext *C, wmOperator *op)
   int offset[2];
   offset[0] = ibuf->x / 2;
   offset[1] = ibuf->y / 2;
-  ED_gpencil_trace_data_to_gp(st, ob_gpencil, gpf, offset);
+  ED_gpencil_trace_data_to_gp(st, ob_gpencil, gpf, offset, scale, resolution, thickness);
 
   /* Free memory. */
   potrace_state_free(st);
@@ -206,17 +209,29 @@ void GPENCIL_OT_trace_image(wmOperatorType *ot)
                  "target",
                  "*NEW",
                  64,
-                 "",
+                 "Target Object",
                  "Target grease pencil object name. Leave empty for new object");
   RNA_def_int(ot->srna, "frame_target", 1, 1, 100000, "Frame Target", "", 1, 100000);
-
+  RNA_def_int(ot->srna, "thickness", 10, 1, 1000, "Thickness", "", 1, 1000);
+  RNA_def_int(
+      ot->srna, "resolution", 5, 1, 20, "Resolution", "Resolution of the generated curves", 1, 20);
+
+  RNA_def_float(ot->srna,
+                "scale",
+                1.0f,
+                0.001f,
+                100.0f,
+                "Scale",
+                "Scale of the final stroke",
+                0.001f,
+                100.0f);
   RNA_def_float_factor(ot->srna,
                        "threshold",
                        0.5f,
                        0.0f,
                        1.0f,
                        "Color Threshold",
-                       "Determine what is considered whithe and what black",
+                       "Determine what is considered white and what black",
                        0.0f,
                        1.0f);
 }
diff --git a/source/blender/editors/gpencil/gpencil_trace_utils.c b/source/blender/editors/gpencil/gpencil_trace_utils.c
index defa3fb80c7..f69fb9b4a97 100644
--- a/source/blender/editors/gpencil/gpencil_trace_utils.c
+++ b/source/blender/editors/gpencil/gpencil_trace_utils.c
@@ -232,13 +232,19 @@ static void add_bezier(bGPDstroke *gps,
  * \param gpf: Currect grease pencil frame
  * \param offset: Offset to center
  */
-void ED_gpencil_trace_data_to_gp(potrace_state_t *st, Object *ob, bGPDframe *gpf, int offset[2])
+void ED_gpencil_trace_data_to_gp(potrace_state_t *st,
+                                 Object *ob,
+                                 bGPDframe *gpf,
+                                 int offset[2],
+                                 const float scale,
+                                 const int resolution,
+                                 const int thickness)
 {
   potrace_path_t *path = st->plist;
   int n, *tag;
   potrace_dpoint_t(*c)[3];
 
-  const float scale = 0.005f;
+  const float scalef = 0.005f * scale;
   /* Draw each curve. */
   path = st->plist;
   while (path != NULL) {
@@ -246,7 +252,7 @@ void ED_gpencil_trace_data_to_gp(potrace_state_t *st, Object *ob, bGPDframe *gpf
     tag = path->curve.tag;
     c = path->curve.c;
     /* Create a new stroke. */
-    bGPDstroke *gps = BKE_gpencil_stroke_add(gpf, 0, 0, 10, false);
+    bGPDstroke *gps = BKE_gpencil_stroke_add(gpf, 0, 0, thickness, false);
     /* Last point that is equals to start point. */
     float start_point[2], last[2];
     start_point[0] = c[n - 1][2].x;
@@ -256,11 +262,11 @@ void ED_gpencil_trace_data_to_gp(potrace_state_t *st, Object *ob, bGPDframe *gpf
       switch (tag[i]) {
         case POTRACE_CORNER: {
           if (gps->totpoints == 0) {
-            add_poin

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list