[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