[Bf-blender-cvs] [e2116ffbf68] greasepencil-object: GPencil: Add new target object and frame offset parameter to Bake

Antonio Vazquez noreply at git.blender.org
Fri Apr 3 14:14:27 CEST 2020


Commit: e2116ffbf6833cc6946c32535e17d1a63a5eb6b7
Author: Antonio Vazquez
Date:   Fri Apr 3 14:12:46 2020 +0200
Branches: greasepencil-object
https://developer.blender.org/rBe2116ffbf6833cc6946c32535e17d1a63a5eb6b7

GPencil: Add new target object and frame offset parameter to Bake

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

M	release/scripts/startup/bl_operators/gpencil_mesh_bake.py
M	source/blender/blenkernel/BKE_gpencil_geom.h
M	source/blender/blenkernel/intern/gpencil_geom.c
M	source/blender/editors/gpencil/gpencil_mesh.c
M	source/blender/editors/object/object_add.c

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

diff --git a/release/scripts/startup/bl_operators/gpencil_mesh_bake.py b/release/scripts/startup/bl_operators/gpencil_mesh_bake.py
index b708a6b023f..ee1a525d25a 100644
--- a/release/scripts/startup/bl_operators/gpencil_mesh_bake.py
+++ b/release/scripts/startup/bl_operators/gpencil_mesh_bake.py
@@ -23,9 +23,23 @@ from bpy.types import Operator
 from bpy.props import (
     IntProperty,
     FloatProperty,
-    BoolProperty
+    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_mesh_bake(Operator):
     """Bake all mesh animation into grease pencil strokes"""
     bl_idname = "gpencil.mesh_bake"
@@ -85,6 +99,17 @@ class GPENCIL_OT_mesh_bake(Operator):
         subtype='DISTANCE',
         unit='LENGTH',
     )
+    target: EnumProperty(
+        name="Target Object",
+        description="Grease Pencil Object",
+        items=my_objlist_callback
+        )
+    frame_offset: IntProperty(
+        name="Frame Offset",
+        description="Number of frames to offset in target object",
+        min=-100, max=100,
+        default=0,
+    )
 
     @classmethod
     def poll(self, context):
@@ -102,7 +127,9 @@ class GPENCIL_OT_mesh_bake(Operator):
             thickness=self.thickness,
             seams=self.seams,
             faces=self.faces,
-            offset=self.offset
+            offset=self.offset,
+            target=self.target,
+            frame_offset=self.frame_offset
         )
 
         return {'FINISHED'}
diff --git a/source/blender/blenkernel/BKE_gpencil_geom.h b/source/blender/blenkernel/BKE_gpencil_geom.h
index 5fbd2f5fdc2..f1f7c999bbc 100644
--- a/source/blender/blenkernel/BKE_gpencil_geom.h
+++ b/source/blender/blenkernel/BKE_gpencil_geom.h
@@ -115,6 +115,7 @@ void BKE_gpencil_convert_mesh(struct Main *bmain,
                               const int thickness,
                               const float offset,
                               const float matrix[4][4],
+                              const int frame_offset,
                               const bool use_seams,
                               const bool use_faces);
 
diff --git a/source/blender/blenkernel/intern/gpencil_geom.c b/source/blender/blenkernel/intern/gpencil_geom.c
index 37ffbc28d54..94ef4e03d86 100644
--- a/source/blender/blenkernel/intern/gpencil_geom.c
+++ b/source/blender/blenkernel/intern/gpencil_geom.c
@@ -2227,6 +2227,7 @@ void BKE_gpencil_convert_mesh(Main *bmain,
                               const int thickness,
                               const float offset,
                               const float matrix[4][4],
+                              const int frame_offset,
                               const bool use_seams,
                               const bool use_faces)
 {
@@ -2246,8 +2247,8 @@ void BKE_gpencil_convert_mesh(Main *bmain,
   int mpoly_len = me->totpoly;
   int i;
 
-  /* If the object has materials means it was created in a previous step. */
-  const bool create_mat = (ob_gp->totcol > 0) ? false : true;
+  /* If the object has enough materials means it was created in a previous step. */
+  const bool create_mat = (ob_gp->totcol >= ob_mesh->totcol) ? false : true;
 
   /* Need at least an edge. */
   if (me->totvert < 2) {
@@ -2285,7 +2286,8 @@ void BKE_gpencil_convert_mesh(Main *bmain,
       if (gpl_fill == NULL) {
         gpl_fill = BKE_gpencil_layer_addnew(gpd, DATA_("Fills"), true);
       }
-      bGPDframe *gpf_fill = BKE_gpencil_layer_frame_get(gpl_fill, CFRA, GP_GETFRAME_ADD_NEW);
+      bGPDframe *gpf_fill = BKE_gpencil_layer_frame_get(
+          gpl_fill, CFRA + frame_offset, GP_GETFRAME_ADD_NEW);
       for (i = 0, mp = mpoly; i < mpoly_len; i++, mp++) {
         MLoop *ml = &mloop[mp->loopstart];
         /* Create fill stroke. */
@@ -2315,7 +2317,8 @@ void BKE_gpencil_convert_mesh(Main *bmain,
   if (gpl_stroke == NULL) {
     gpl_stroke = BKE_gpencil_layer_addnew(gpd, DATA_("Lines"), true);
   }
-  bGPDframe *gpf_stroke = BKE_gpencil_layer_frame_get(gpl_stroke, CFRA, GP_GETFRAME_ADD_NEW);
+  bGPDframe *gpf_stroke = BKE_gpencil_layer_frame_get(
+      gpl_stroke, CFRA + frame_offset, GP_GETFRAME_ADD_NEW);
   gpencil_generate_edgeloops(ob_eval, gpf_stroke, angle, thickness, offset, matrix, use_seams);
 
   /* Tag for recalculation */
diff --git a/source/blender/editors/gpencil/gpencil_mesh.c b/source/blender/editors/gpencil/gpencil_mesh.c
index 39ffd528266..df8d28c2df2 100644
--- a/source/blender/editors/gpencil/gpencil_mesh.c
+++ b/source/blender/editors/gpencil/gpencil_mesh.c
@@ -84,6 +84,7 @@ static int gp_bake_mesh_animation_exec(bContext *C, wmOperator *op)
   Scene *scene = CTX_data_scene(C);
   View3D *v3d = CTX_wm_view3d(C);
   Object *ob = CTX_data_active_object(C);
+  Object *ob_gpencil = NULL;
 
   /* Cannot check this in poll because the active object changes. */
   if ((ob == NULL) || (ob->type != OB_MESH)) {
@@ -112,11 +113,23 @@ static int gp_bake_mesh_animation_exec(bContext *C, wmOperator *op)
   const bool use_seams = RNA_boolean_get(op->ptr, "seams");
   const bool use_faces = RNA_boolean_get(op->ptr, "faces");
   const float offset = RNA_float_get(op->ptr, "offset");
+  const int frame_offset = RNA_int_get(op->ptr, "frame_offset");
+  char target[64];
+  RNA_string_get(op->ptr, "target", target);
 
   /* Create a new grease pencil object in origin. */
-  ushort local_view_bits = (v3d && v3d->localvd) ? v3d->local_view_uuid : 0;
-  float loc[3] = {0.0f, 0.0f, 0.0f};
-  Object *ob_gpencil = ED_gpencil_add_object(C, loc, local_view_bits);
+  if (STREQ(target, "*NEW")) {
+    ushort local_view_bits = (v3d && v3d->localvd) ? v3d->local_view_uuid : 0;
+    float loc[3] = {0.0f, 0.0f, 0.0f};
+    ob_gpencil = ED_gpencil_add_object(C, loc, local_view_bits);
+  }
+  else {
+    ob_gpencil = BLI_findstring(&bmain->objects, target, offsetof(ID, name) + 2);
+  }
+  if ((ob_gpencil == NULL) || (ob_gpencil->type != OB_GPENCIL)) {
+    BKE_report(op->reports, RPT_ERROR, "Target grease pencil object not valid");
+    return OPERATOR_CANCELLED;
+  }
 
   /* Loop all frame range. */
   int oldframe = (int)DEG_get_ctime(depsgraph);
@@ -142,6 +155,7 @@ static int gp_bake_mesh_animation_exec(bContext *C, wmOperator *op)
                              thickness,
                              offset,
                              ob_eval->obmat,
+                             frame_offset,
                              use_seams,
                              use_faces);
   }
@@ -219,4 +233,11 @@ void GPENCIL_OT_bake_mesh_animation(wmOperatorType *ot)
   RNA_def_boolean(ot->srna, "faces", 1, "Export Faces", "Export faces as filled strokes");
   RNA_def_float_distance(
       ot->srna, "offset", 0.001f, 0.0, 100.0, "Offset", "Offset strokes from fill", 0.0, 100.00);
+  RNA_def_int(ot->srna, "frame_offset", 0, -1000, 1000, "Frame Offset", "", -1000, 1000);
+  RNA_def_string(ot->srna,
+                 "target",
+                 "Target",
+                 64,
+                 "",
+                 "Target grease pencil object name. Leave empty for new object");
 }
diff --git a/source/blender/editors/object/object_add.c b/source/blender/editors/object/object_add.c
index 7d7ec0446b9..6a43a78699b 100644
--- a/source/blender/editors/object/object_add.c
+++ b/source/blender/editors/object/object_add.c
@@ -2364,6 +2364,7 @@ static int convert_exec(bContext *C, wmOperator *op)
                                thickness,
                                offset,
                                matrix,
+                               0,
                                use_seams,
                                use_faces);
       gpencilConverted = true;



More information about the Bf-blender-cvs mailing list