[Bf-blender-cvs] [e010d5e3b1b] blender2.8: GP: New Time modifier

Antonioya noreply at git.blender.org
Mon Oct 22 18:30:38 CEST 2018


Commit: e010d5e3b1b2110afd83c37d321b358692a478a8
Author: Antonioya
Date:   Mon Oct 22 18:25:13 2018 +0200
Branches: blender2.8
https://developer.blender.org/rBe010d5e3b1b2110afd83c37d321b358692a478a8

GP: New Time modifier

This modifier allows to offset the keyframe animated to get more variations in the animation when reuse the same datablock.

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

M	release/scripts/startup/bl_ui/properties_data_modifier.py
M	source/blender/blenkernel/BKE_gpencil_modifier.h
M	source/blender/blenkernel/intern/gpencil_modifier.c
M	source/blender/draw/engines/gpencil/gpencil_draw_utils.c
M	source/blender/editors/interface/interface_templates.c
M	source/blender/editors/object/object_gpencil_modifier.c
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
M	source/blender/gpencil_modifiers/intern/MOD_gpencilarmature.c
M	source/blender/gpencil_modifiers/intern/MOD_gpencilbuild.c
M	source/blender/gpencil_modifiers/intern/MOD_gpencilcolor.c
M	source/blender/gpencil_modifiers/intern/MOD_gpencilhook.c
M	source/blender/gpencil_modifiers/intern/MOD_gpencilinstance.c
M	source/blender/gpencil_modifiers/intern/MOD_gpencillattice.c
M	source/blender/gpencil_modifiers/intern/MOD_gpencilmirror.c
M	source/blender/gpencil_modifiers/intern/MOD_gpencilnoise.c
M	source/blender/gpencil_modifiers/intern/MOD_gpenciloffset.c
M	source/blender/gpencil_modifiers/intern/MOD_gpencilopacity.c
M	source/blender/gpencil_modifiers/intern/MOD_gpencilsimplify.c
M	source/blender/gpencil_modifiers/intern/MOD_gpencilsmooth.c
M	source/blender/gpencil_modifiers/intern/MOD_gpencilsubdiv.c
M	source/blender/gpencil_modifiers/intern/MOD_gpencilthick.c
M	source/blender/gpencil_modifiers/intern/MOD_gpenciltint.c
A	source/blender/gpencil_modifiers/intern/mod_gpenciltime.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 b7c2f232102..b58438a7678 100644
--- a/release/scripts/startup/bl_ui/properties_data_modifier.py
+++ b/release/scripts/startup/bl_ui/properties_data_modifier.py
@@ -1790,6 +1790,21 @@ class DATA_PT_gpencil_modifiers(ModifierButtonsPanel, Panel):
         row.prop(md, "create_materials")
         row.prop(md, "modify_color")
 
+    def GP_TIME(self, layout, ob, md):
+        gpd = ob.data
+
+        row = layout.row()
+        row.prop(md, "offset")
+
+        row = layout.row()
+        row.label(text="Layer:")
+        row = layout.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()
+        row.prop(md, "use_keep_loop")
+
     def GP_COLOR(self, layout, ob, md):
         gpd = ob.data
         split = layout.split()
diff --git a/source/blender/blenkernel/BKE_gpencil_modifier.h b/source/blender/blenkernel/BKE_gpencil_modifier.h
index cce1d4b0a4a..5efc390015c 100644
--- a/source/blender/blenkernel/BKE_gpencil_modifier.h
+++ b/source/blender/blenkernel/BKE_gpencil_modifier.h
@@ -83,6 +83,8 @@ typedef enum {
 
 	/* can't be added manually by user */
 	eGpencilModifierTypeFlag_NoUserAdd = (1 << 5),
+	/* can't be applied */
+	eGpencilModifierTypeFlag_NoApply = (1 << 6),
 } GpencilModifierTypeFlag;
 
 /* IMPORTANT! Keep ObjectWalkFunc and IDWalkFunc signatures compatible. */
@@ -150,8 +152,18 @@ typedef struct GpencilModifierTypeInfo {
 	void (*bakeModifier)(struct Main *bmain, struct Depsgraph *depsgraph,
                            struct GpencilModifierData *md, struct Object *ob);
 
+
 	/********************* Optional functions *********************/
 
+	/* Callback for GP "time" modifiers that offset keyframe time
+	 * Returns the frame number to be used after apply the modifier. This is
+	 * usually an offset of the animation for duplicated datablocks.
+	 *
+	 * This function is optional.
+	 */
+	int (*remapTime)(struct GpencilModifierData *md, struct Depsgraph *depsgraph,
+		struct Scene *scene, struct Object *ob, struct bGPDlayer *gpl, int cfra);
+
 	/* Initialize new instance data for this modifier type, this function
 	 * should set modifier variables to their default values.
 	 *
@@ -242,6 +254,7 @@ void BKE_gpencil_modifiers_foreachIDLink(struct Object *ob, GreasePencilIDWalkFu
 void BKE_gpencil_modifiers_foreachTexLink(struct Object *ob, GreasePencilTexWalkFunc walk, void *userData);
 
 bool BKE_gpencil_has_geometry_modifiers(struct Object *ob);
+bool BKE_gpencil_has_time_modifiers(struct Object *ob);
 
 void BKE_gpencil_stroke_modifiers(
 	struct Depsgraph *depsgraph, struct Object *ob,
@@ -249,6 +262,9 @@ void BKE_gpencil_stroke_modifiers(
 void BKE_gpencil_geometry_modifiers(
 	struct Depsgraph *depsgraph, struct Object *ob,
 	struct bGPDlayer *gpl, struct bGPDframe *gpf, bool is_render);
+int BKE_gpencil_time_modifier(
+	struct Depsgraph *depsgraph, struct Scene *scene, struct Object *ob,
+	struct bGPDlayer *gpl, int cfra, bool is_render);
 
 void BKE_gpencil_lattice_init(struct Object *ob);
 void BKE_gpencil_lattice_clear(struct Object *ob);
diff --git a/source/blender/blenkernel/intern/gpencil_modifier.c b/source/blender/blenkernel/intern/gpencil_modifier.c
index 1e05a8c271c..d5c1c831c2c 100644
--- a/source/blender/blenkernel/intern/gpencil_modifier.c
+++ b/source/blender/blenkernel/intern/gpencil_modifier.c
@@ -402,6 +402,20 @@ bool BKE_gpencil_has_geometry_modifiers(Object *ob)
 	return false;
 }
 
+/* check if exist time modifiers */
+bool BKE_gpencil_has_time_modifiers(Object *ob)
+{
+	GpencilModifierData *md;
+	for (md = ob->greasepencil_modifiers.first; md; md = md->next) {
+		const GpencilModifierTypeInfo *mti = BKE_gpencil_modifierType_getInfo(md->type);
+
+		if (mti && mti->remapTime) {
+			return true;
+		}
+	}
+	return false;
+}
+
 /* apply stroke modifiers */
 void BKE_gpencil_stroke_modifiers(Depsgraph *depsgraph, Object *ob, bGPDlayer *gpl, bGPDframe *UNUSED(gpf), bGPDstroke *gps, bool is_render)
 {
@@ -459,6 +473,31 @@ void BKE_gpencil_geometry_modifiers(Depsgraph *depsgraph, Object *ob, bGPDlayer
 	}
 }
 
+/* apply time modifiers */
+int BKE_gpencil_time_modifier(Depsgraph *depsgraph, Scene *scene, Object *ob,
+	bGPDlayer *gpl, int cfra, bool is_render)
+{
+	GpencilModifierData *md;
+	bGPdata *gpd = ob->data;
+	const bool is_edit = GPENCIL_ANY_EDIT_MODE(gpd);
+
+	for (md = ob->greasepencil_modifiers.first; md; md = md->next) {
+		if (GPENCIL_MODIFIER_ACTIVE(md, is_render)) {
+			const GpencilModifierTypeInfo *mti = BKE_gpencil_modifierType_getInfo(md->type);
+
+			if (GPENCIL_MODIFIER_EDIT(md, is_edit)) {
+				continue;
+			}
+
+			if (mti->remapTime) {
+				return mti->remapTime(md, depsgraph, scene, ob, gpl, cfra);
+			}
+		}
+	}
+
+	/* if no time modifier, return original frame number */
+	return cfra;
+}
 /* *************************************************** */
 
 void BKE_gpencil_eval_geometry(Depsgraph *depsgraph,
diff --git a/source/blender/draw/engines/gpencil/gpencil_draw_utils.c b/source/blender/draw/engines/gpencil/gpencil_draw_utils.c
index f03947ddf87..4375d62f4b2 100644
--- a/source/blender/draw/engines/gpencil/gpencil_draw_utils.c
+++ b/source/blender/draw/engines/gpencil/gpencil_draw_utils.c
@@ -1250,12 +1250,16 @@ void DRW_gpencil_populate_datablock(
 	View3D *v3d = draw_ctx->v3d;
 	int cfra_eval = (int)DEG_get_ctime(draw_ctx->depsgraph);
 	ToolSettings *ts = scene->toolsettings;
+
 	bGPDframe *derived_gpf = NULL;
 	const bool main_onion = v3d != NULL ? (v3d->gp_flag & V3D_GP_SHOW_ONION_SKIN) : true;
 	const bool do_onion = (bool)((gpd->flag & GP_DATA_STROKE_WEIGHTMODE) == 0) && main_onion;
 	const bool overlay = v3d != NULL ? (bool)((v3d->flag2 & V3D_RENDER_OVERRIDE) == 0) : true;
+	const bool time_remap = BKE_gpencil_has_time_modifiers(ob);
+
 	float opacity;
 	bGPDframe *p = NULL;
+	bGPDframe *gpf = NULL;
 
 	/* check if playing animation */
 	bool playing = stl->storage->is_playing;
@@ -1274,8 +1278,16 @@ void DRW_gpencil_populate_datablock(
 		/* don't draw layer if hidden */
 		if (gpl->flag & GP_LAYER_HIDE)
 			continue;
+		if ((!time_remap) || (stl->storage->simplify_modif)) {
+			gpf = BKE_gpencil_layer_getframe(gpl, cfra_eval, GP_GETFRAME_USE_PREV);
+		}
+		else {
+			int remap_cfra = BKE_gpencil_time_modifier(
+											draw_ctx->depsgraph, scene,ob, gpl, cfra_eval,
+											stl->storage->is_render);
 
-		bGPDframe *gpf = BKE_gpencil_layer_getframe(gpl, cfra_eval, GP_GETFRAME_USE_PREV);
+			gpf = BKE_gpencil_layer_getframe(gpl, remap_cfra, GP_GETFRAME_USE_PREV);
+		}
 		if (gpf == NULL)
 			continue;
 
diff --git a/source/blender/editors/interface/interface_templates.c b/source/blender/editors/interface/interface_templates.c
index c61a8f95ee6..f5d14330499 100644
--- a/source/blender/editors/interface/interface_templates.c
+++ b/source/blender/editors/interface/interface_templates.c
@@ -1657,9 +1657,13 @@ static uiLayout *gpencil_draw_modifier(
 		UI_block_lock_set(block, BKE_object_obdata_is_libdata(ob), ERROR_LIBDATA_MESSAGE);
 
 		uiLayoutSetOperatorContext(row, WM_OP_INVOKE_DEFAULT);
-		uiItemEnumO(row, "OBJECT_OT_gpencil_modifier_apply", CTX_IFACE_(BLT_I18NCONTEXT_OPERATOR_DEFAULT, "Apply"),
-			0, "apply_as", MODIFIER_APPLY_DATA);
 
+		sub = uiLayoutRow(row, false);
+		if (mti->flags & eGpencilModifierTypeFlag_NoApply) {
+			uiLayoutSetEnabled(sub, false);
+		}
+		uiItemEnumO(sub, "OBJECT_OT_gpencil_modifier_apply", CTX_IFACE_(BLT_I18NCONTEXT_OPERATOR_DEFAULT, "Apply"),
+				0, "apply_as", MODIFIER_APPLY_DATA);
 		uiItemO(row, CTX_IFACE_(BLT_I18NCONTEXT_OPERATOR_DEFAULT, "Copy"), ICON_NONE,
 			"OBJECT_OT_gpencil_modifier_copy");
 
diff --git a/source/blender/editors/object/object_gpencil_modifier.c b/source/blender/editors/object/object_gpencil_modifier.c
index cb46185a087..d67b79375e2 100644
--- a/source/blender/editors/object/object_gpencil_modifier.c
+++ b/source/blender/editors/object/object_gpencil_modifier.c
@@ -207,7 +207,7 @@ int ED_object_gpencil_modifier_move_down(ReportList *UNUSED(reports), Object *ob
 }
 
 static int gpencil_modifier_apply_obdata(
-        ReportList *reports, Main *bmain, Depsgraph *depsgraph, Object *ob, GpencilModifierData *md)
+        ReportList *reports, Main *bmain, Depsgraph *depsgraph,	Object *ob, GpencilModifierData *md)
 {
 	const GpencilModifierTypeInfo *mti = BKE_gpencil_modifierType_getInfo(md->type);
 
@@ -269,9 +269,18 @@ int ED_object_gpencil_modifier_apply(
 	return 1;
 }
 
-int ED_object_gpencil_modifier_copy(ReportList *UNUSED(reports), Object *ob, GpencilModifierData *md)
+int ED_object_gpencil_modifier_copy(ReportList *reports, Object *ob, GpencilModifierData *md)
 {
 	GpencilModifierData *nmd;
+	const GpencilModifierTypeInfo *mti = BKE_gpencil_modifierType_getInfo(md->type);
+	GpencilModifierType type = md->type;
+
+	if (mti->flags & eGpencilModifierTypeFlag_Single) {
+		if (BKE_gpencil_modifiers_findByType(ob, type)) {
+			BKE_report(reports, RPT_WARNING, "Only one modifier of this type is allowed");
+			return 0;
+		}
+	}
 
 	nmd = BKE_gpencil_modifier_new(md->type);
 	BKE_gpencil_modifier_copyData(md, nmd);
diff --git a/source/blender/gpencil_modifiers/CMakeLists.txt b/source/blender/gpencil_modifiers/CMakeLists.txt
index 44689a1d091..00a387c58e8 100644
--- a/source/blender/gpencil_modifiers/CMakeLists.txt
+++ b/source/blender/gpencil_modifiers/CMakeLists.txt
@@ -58,6 +58,7 @@ set(SRC
 	intern/MOD_gpencilsmooth.c
 	intern/MOD_gpencilhook.c
 	intern/MOD_gpenciloffset.c
+	intern/MOD_gpenciltime.c
 
 	MOD_gpencil_modifiertypes.h
 )
diff --git a/source/blender/gpencil_modifiers/MOD_gpencil_modifiertypes.h b/source/blender/gpencil_modifiers/MOD_gpencil_modifiertypes.h
index 968f7e73544..d820bbcc7c8 100644
--- a/source/blender/gpencil_modifiers/MOD_gpencil_modifiertypes.h
+++ b/source/blender/gpencil_modifiers/MOD_gpencil_modifiertypes.h
@@ -45,6 +45,7 @@ extern GpencilModifierTypeInfo modifierType_Gpencil_Smooth;
 extern GpencilModifierTypeInfo modifierType_Gpencil_Hook;
 extern GpencilModifierTypeInfo modifierType_Gpencil_Offset;
 extern Gpencil

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list