[Bf-blender-cvs] [06f86dd4d9a] master: GPencil: Bake GPencil object transforms into a new GPencil object

Antonio Vazquez noreply at git.blender.org
Wed May 26 15:46:24 CEST 2021


Commit: 06f86dd4d9a2a4250279f40acb6ca48191a094da
Author: Antonio  Vazquez
Date:   Wed May 26 15:41:38 2021 +0200
Branches: master
https://developer.blender.org/rB06f86dd4d9a2a4250279f40acb6ca48191a094da

GPencil: Bake GPencil object transforms into a new GPencil object

This operator is a common request of animators to convert the transformation (inluding modifiers) of one grease pencil object, into a new object, generating strokes.

Reviewed By: pepeland

Maniphest Tasks: T87424

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

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

M	release/scripts/startup/bl_ui/space_view3d.py
M	source/blender/editors/gpencil/CMakeLists.txt
A	source/blender/editors/gpencil/gpencil_bake_animation.c
M	source/blender/editors/gpencil/gpencil_intern.h
M	source/blender/editors/gpencil/gpencil_mesh.c
M	source/blender/editors/gpencil/gpencil_ops.c

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

diff --git a/release/scripts/startup/bl_ui/space_view3d.py b/release/scripts/startup/bl_ui/space_view3d.py
index 18c6564b7d4..ae18fc4fb76 100644
--- a/release/scripts/startup/bl_ui/space_view3d.py
+++ b/release/scripts/startup/bl_ui/space_view3d.py
@@ -2314,6 +2314,7 @@ class VIEW3D_MT_object_animation(Menu):
 
         layout.operator("nla.bake", text="Bake Action...")
         layout.operator("gpencil.bake_mesh_animation", text="Bake Mesh to Grease Pencil...")
+        layout.operator("gpencil.bake_grease_pencil_animation", text="Bake Object Transform to Grease Pencil...")
 
 
 class VIEW3D_MT_object_rigid_body(Menu):
diff --git a/source/blender/editors/gpencil/CMakeLists.txt b/source/blender/editors/gpencil/CMakeLists.txt
index f7ab72a8a43..bff7310e9f7 100644
--- a/source/blender/editors/gpencil/CMakeLists.txt
+++ b/source/blender/editors/gpencil/CMakeLists.txt
@@ -41,6 +41,7 @@ set(SRC
   gpencil_add_monkey.c
   gpencil_add_stroke.c
   gpencil_armature.c
+  gpencil_bake_animation.c
   gpencil_convert.c
   gpencil_data.c
   gpencil_edit.c
diff --git a/source/blender/editors/gpencil/gpencil_mesh.c b/source/blender/editors/gpencil/gpencil_bake_animation.c
similarity index 54%
copy from source/blender/editors/gpencil/gpencil_mesh.c
copy to source/blender/editors/gpencil/gpencil_bake_animation.c
index b7ed77801c0..6063594826e 100644
--- a/source/blender/editors/gpencil/gpencil_mesh.c
+++ b/source/blender/editors/gpencil/gpencil_bake_animation.c
@@ -13,9 +13,8 @@
  * 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) 2008, Blender Foundation
+ * The Original Code is Copyright (C) 2021 Blender Foundation
  * This is a new part of Blender
- * Operator for converting Grease Pencil data to geometry
  */
 
 /** \file
@@ -30,12 +29,14 @@
 
 #include "DNA_anim_types.h"
 #include "DNA_gpencil_types.h"
+#include "DNA_material_types.h"
 #include "DNA_scene_types.h"
 #include "DNA_screen_types.h"
 
 #include "BKE_anim_data.h"
 #include "BKE_context.h"
 #include "BKE_duplilist.h"
+#include "BKE_gpencil.h"
 #include "BKE_gpencil_geom.h"
 #include "BKE_layer.h"
 #include "BKE_main.h"
@@ -72,12 +73,18 @@ static void gpencil_bake_set_frame_end(struct Main *UNUSED(main),
 }
 
 /* Extract mesh animation to Grease Pencil. */
-static bool gpencil_bake_mesh_animation_poll(bContext *C)
+static bool gpencil_bake_grease_pencil_animation_poll(bContext *C)
 {
+  Object *obact = CTX_data_active_object(C);
   if (CTX_data_mode_enum(C) != CTX_MODE_OBJECT) {
     return false;
   }
 
+  /* Check if grease pencil or empty for dupli groups. */
+  if ((obact == NULL) || ((obact->type != OB_GPENCIL) && (obact->type != OB_EMPTY))) {
+    return false;
+  }
+
   /* Only if the current view is 3D View. */
   ScrArea *area = CTX_wm_area(C);
   return (area && area->spacetype);
@@ -124,9 +131,10 @@ static void gpencil_bake_duplilist(Depsgraph *depsgraph, Scene *scene, Object *o
   DupliObject *dob;
   lb = object_duplilist(depsgraph, scene, ob);
   for (dob = lb->first; dob; dob = dob->next) {
-    if (dob->ob->type != OB_MESH) {
+    if (dob->ob->type != OB_GPENCIL) {
       continue;
     }
+
     elem = MEM_callocN(sizeof(GpBakeOb), __func__);
     elem->ob = dob->ob;
     BLI_addtail(list, elem);
@@ -135,15 +143,14 @@ static void gpencil_bake_duplilist(Depsgraph *depsgraph, Scene *scene, Object *o
   free_object_duplilist(lb);
 }
 
-static bool gpencil_bake_ob_list(bContext *C, Depsgraph *depsgraph, Scene *scene, ListBase *list)
+static void gpencil_bake_ob_list(bContext *C, Depsgraph *depsgraph, Scene *scene, ListBase *list)
 {
   GpBakeOb *elem = NULL;
-  bool simple_material = false;
 
   /* Add active object. In some files this could not be in selected array. */
   Object *obact = CTX_data_active_object(C);
 
-  if (obact->type == OB_MESH) {
+  if (obact->type == OB_GPENCIL) {
     elem = MEM_callocN(sizeof(GpBakeOb), __func__);
     elem->ob = obact;
     BLI_addtail(list, elem);
@@ -151,7 +158,6 @@ static bool gpencil_bake_ob_list(bContext *C, Depsgraph *depsgraph, Scene *scene
   /* Add duplilist. */
   else if (obact->type == OB_EMPTY) {
     gpencil_bake_duplilist(depsgraph, scene, obact, list);
-    simple_material |= true;
   }
 
   /* Add other selected objects. */
@@ -159,8 +165,8 @@ static bool gpencil_bake_ob_list(bContext *C, Depsgraph *depsgraph, Scene *scene
     if (ob == obact) {
       continue;
     }
-    /* Add selected meshes.*/
-    if (ob->type == OB_MESH) {
+    /* Add selected objects.*/
+    if (ob->type == OB_GPENCIL) {
       elem = MEM_callocN(sizeof(GpBakeOb), __func__);
       elem->ob = ob;
       BLI_addtail(list, elem);
@@ -168,12 +174,10 @@ static bool gpencil_bake_ob_list(bContext *C, Depsgraph *depsgraph, Scene *scene
 
     /* Add duplilist. */
     if (ob->type == OB_EMPTY) {
-      gpencil_bake_duplilist(depsgraph, scene, obact, list);
+      gpencil_bake_duplilist(depsgraph, scene, ob, list);
     }
   }
   CTX_DATA_END;
-
-  return simple_material;
 }
 
 static void gpencil_bake_free_ob_list(ListBase *list)
@@ -183,7 +187,7 @@ static void gpencil_bake_free_ob_list(ListBase *list)
   }
 }
 
-static int gpencil_bake_mesh_animation_exec(bContext *C, wmOperator *op)
+static int gpencil_bake_grease_pencil_animation_exec(bContext *C, wmOperator *op)
 {
   Main *bmain = CTX_data_main(C);
   Depsgraph *depsgraph = CTX_data_ensure_evaluated_depsgraph(C);
@@ -194,13 +198,6 @@ static int gpencil_bake_mesh_animation_exec(bContext *C, wmOperator *op)
   ListBase ob_selected_list = {NULL, NULL};
   gpencil_bake_ob_list(C, depsgraph, scene, &ob_selected_list);
 
-  /* Cannot check this in poll because the active object changes. */
-  if (ob_selected_list.first == NULL) {
-    BKE_report(op->reports, RPT_INFO, "No valid object selected");
-    gpencil_bake_free_ob_list(&ob_selected_list);
-    return OPERATOR_CANCELLED;
-  }
-
   /* Grab all relevant settings. */
   const int step = RNA_int_get(op->ptr, "step");
 
@@ -212,43 +209,19 @@ static int gpencil_bake_mesh_animation_exec(bContext *C, wmOperator *op)
                             scene->r.efra :
                             RNA_int_get(op->ptr, "frame_end");
 
-  const float angle = RNA_float_get(op->ptr, "angle");
-  const int thickness = RNA_int_get(op->ptr, "thickness");
-  const bool use_seams = RNA_boolean_get(op->ptr, "seams");
-  const bool use_faces = RNA_boolean_get(op->ptr, "faces");
   const bool only_selected = RNA_boolean_get(op->ptr, "only_selected");
-  const float offset = RNA_float_get(op->ptr, "offset");
   const int frame_offset = RNA_int_get(op->ptr, "frame_target") - frame_start;
   const int project_type = RNA_enum_get(op->ptr, "project_type");
-  eGP_TargetObjectMode target = RNA_enum_get(op->ptr, "target");
 
-  /* Create a new grease pencil object in origin or reuse selected. */
+  /* Create a new grease pencil object. */
   Object *ob_gpencil = NULL;
-  bool newob = false;
-
-  if (target == GP_TARGET_OB_SELECTED) {
-    ob_gpencil = BKE_view_layer_non_active_selected_object(CTX_data_view_layer(C), v3d);
-    if (ob_gpencil != NULL) {
-      if (ob_gpencil->type != OB_GPENCIL) {
-        BKE_report(op->reports, RPT_WARNING, "Target object not a grease pencil, ignoring!");
-        ob_gpencil = NULL;
-      }
-      else if (BKE_object_obdata_is_libdata(ob_gpencil)) {
-        BKE_report(op->reports, RPT_WARNING, "Target object library-data, ignoring!");
-        ob_gpencil = NULL;
-      }
-    }
-  }
-
-  if (ob_gpencil == NULL) {
-    ushort local_view_bits = (v3d && v3d->localvd) ? v3d->local_view_uuid : 0;
-    const float loc[3] = {0.0f, 0.0f, 0.0f};
-    ob_gpencil = ED_gpencil_add_object(C, loc, local_view_bits);
-    newob = true;
-  }
+  ushort local_view_bits = (v3d && v3d->localvd) ? v3d->local_view_uuid : 0;
+  ob_gpencil = ED_gpencil_add_object(C, scene->cursor.location, local_view_bits);
+  float invmat[4][4];
+  invert_m4_m4(invmat, ob_gpencil->obmat);
 
-  bGPdata *gpd = (bGPdata *)ob_gpencil->data;
-  gpd->draw_mode = (project_type == GP_REPROJECT_KEEP) ? GP_DRAWMODE_3D : GP_DRAWMODE_2D;
+  bGPdata *gpd_dst = (bGPdata *)ob_gpencil->data;
+  gpd_dst->draw_mode = GP_DRAWMODE_2D;
 
   /* Set cursor to indicate working. */
   WM_cursor_wait(true);
@@ -263,15 +236,6 @@ static int gpencil_bake_mesh_animation_exec(bContext *C, wmOperator *op)
 
     /* Init snap context for geometry projection. */
     sctx = ED_transform_snap_object_context_create_view3d(scene, 0, region, CTX_wm_view3d(C));
-
-    /* Tag all existing strokes to avoid reprojections. */
-    LISTBASE_FOREACH (bGPDlayer *, gpl, &gpd->layers) {
-      LISTBASE_FOREACH (bGPDframe *, gpf, &gpl->frames) {
-        LISTBASE_FOREACH (bGPDstroke *, gps, &gpf->strokes) {
-          gps->flag |= GP_STROKE_TAG;
-        }
-      }
-    }
   }
 
   /* Loop all frame range. */
@@ -303,68 +267,74 @@ static int gpencil_bake_mesh_animation_exec(bContext *C, wmOperator *op)
     /* Loop all objects in the list. */
     LISTBASE_FOREACH (GpBakeOb *, elem, &ob_selected_list) {
       Object *ob_eval = (Object *)DEG_get_evaluated_object(depsgraph, elem->ob);
+      bGPdata *gpd_src = ob_eval->data;
+
+      LISTBASE_FOREACH (bGPDlayer *, gpl_src, &gpd_src->layers) {
+        /* Create destination layer. */
+        char *layer_name;
+        layer_name = BLI_sprintfN("%s_%s", elem->ob->id.name + 2, gpl_src->info);
+        bGPDlayer *gpl_dst = BKE_gpencil_layer_named_get(gpd_dst, layer_name);
+        if (gpl_dst == NULL) {
+          gpl_dst = BKE_gpencil_layer_addnew(gpd_dst, layer_name, true, false);
+        }
+        MEM_freeN(layer_name);
 
-      /* Generate strokes. */
-      BKE_gpencil_convert_mesh(bmain,
-                               depsgraph,
-                               scene,
-                               ob_gpencil,
-                               elem->ob,
-                               angle,
-                               thickness,
-                               offset,
-                               ob_eval->obmat,
-                               frame_offset,
-                               use_seams,
-                               use_faces);
-
-

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list