GP: New Time modifier

This modifier allows to offset the keyframe animated to get more variations in the animation when reuse the same datablock.
master
Antonioya 6 years ago
parent 4bf4da12de
commit e010d5e3b1

@ -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()

@ -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);

@ -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,

@ -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;

@ -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");

@ -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);

@ -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
)

@ -45,6 +45,7 @@ extern GpencilModifierTypeInfo modifierType_Gpencil_Smooth;
extern GpencilModifierTypeInfo modifierType_Gpencil_Hook;
extern GpencilModifierTypeInfo modifierType_Gpencil_Offset;
extern GpencilModifierTypeInfo modifierType_Gpencil_Armature;
extern GpencilModifierTypeInfo modifierType_Gpencil_Time;
/* MOD_gpencil_util.c */
void gpencil_modifier_type_init(GpencilModifierTypeInfo *types[]);

@ -78,6 +78,7 @@ void gpencil_modifier_type_init(GpencilModifierTypeInfo *types[])
INIT_GP_TYPE(Hook);
INIT_GP_TYPE(Offset);
INIT_GP_TYPE(Armature);
INIT_GP_TYPE(Time);
#undef INIT_GP_TYPE
}

@ -194,7 +194,7 @@ GpencilModifierTypeInfo modifierType_Gpencil_Armature = {
/* deformStroke */ deformStroke,
/* generateStrokes */ NULL,
/* bakeModifier */ bakeModifier,
/* remapTime */ NULL,
/* initData */ initData,
/* freeData */ NULL,
/* isDisabled */ isDisabled,

@ -515,27 +515,6 @@ static void generateStrokes(
}
}
/* ******************************************** */
/* FIXME: Baking the Build Modifier is currently unsupported.
* Adding support for this is more complicated than for other
* modifiers, as to implement this, we'd have to add more frames,
* which would in turn break how the modifier functions.
*/
#if 0
static void bakeModifier(
Main *bmain, const Depsgraph *UNUSED(depsgraph),
GpencilModifierData *md, Object *ob)
{
bGPdata *gpd = ob->data;
for (bGPDlayer *gpl = gpd->layers.first; gpl; gpl = gpl->next) {
for (bGPDframe *gpf = gpl->frames.first; gpf; gpf = gpf->next) {
}
}
}
#endif
/* ******************************************** */
@ -544,13 +523,14 @@ GpencilModifierTypeInfo modifierType_Gpencil_Build = {
/* structName */ "BuildGpencilModifierData",
/* structSize */ sizeof(BuildGpencilModifierData),
/* type */ eGpencilModifierTypeType_Gpencil,
/* flags */ 0,
/* flags */ eGpencilModifierTypeFlag_NoApply,
/* copyData */ copyData,
/* deformStroke */ NULL,
/* generateStrokes */ generateStrokes,
/* bakeModifier */ NULL,
/* remapTime */ NULL,
/* initData */ initData,
/* freeData */ NULL,

@ -151,7 +151,8 @@ GpencilModifierTypeInfo modifierType_Gpencil_Color = {
/* deformStroke */ deformStroke,
/* generateStrokes */ NULL,
/* bakeModifier */ bakeModifier,
/* bakeModifier */ bakeModifier,
/* remapTime */ NULL,
/* initData */ initData,
/* freeData */ NULL,

@ -340,7 +340,8 @@ GpencilModifierTypeInfo modifierType_Gpencil_Hook = {
/* deformStroke */ deformStroke,
/* generateStrokes */ NULL,
/* bakeModifier */ bakeModifier,
/* bakeModifier */ bakeModifier,
/* remapTime */ NULL,
/* initData */ initData,
/* freeData */ freeData,

@ -243,6 +243,7 @@ GpencilModifierTypeInfo modifierType_Gpencil_Instance = {
/* deformStroke */ NULL,
/* generateStrokes */ generateStrokes,
/* bakeModifier */ bakeModifier,
/* remapTime */ NULL,
/* initData */ initData,
/* freeData */ NULL,

@ -198,7 +198,8 @@ GpencilModifierTypeInfo modifierType_Gpencil_Lattice = {
/* deformStroke */ deformStroke,
/* generateStrokes */ NULL,
/* bakeModifier */ bakeModifier,
/* bakeModifier */ bakeModifier,
/* remapTime */ NULL,
/* initData */ initData,
/* freeData */ freeData,

@ -197,7 +197,8 @@ GpencilModifierTypeInfo modifierType_Gpencil_Mirror = {
/* deformStroke */ NULL,
/* generateStrokes */ generateStrokes,
/* bakeModifier */ bakeModifier,
/* bakeModifier */ bakeModifier,
/* remapTime */ NULL,
/* initData */ initData,
/* freeData */ NULL,

@ -272,7 +272,8 @@ GpencilModifierTypeInfo modifierType_Gpencil_Noise = {
/* deformStroke */ deformStroke,
/* generateStrokes */ NULL,
/* bakeModifier */ bakeModifier,
/* bakeModifier */ bakeModifier,
/* remapTime */ NULL,
/* initData */ initData,
/* freeData */ freeData,

@ -130,7 +130,8 @@ GpencilModifierTypeInfo modifierType_Gpencil_Offset = {
/* deformStroke */ deformStroke,
/* generateStrokes */ NULL,
/* bakeModifier */ bakeModifier,
/* bakeModifier */ bakeModifier,
/* remapTime */ NULL,
/* initData */ initData,
/* freeData */ NULL,

@ -171,7 +171,8 @@ GpencilModifierTypeInfo modifierType_Gpencil_Opacity = {
/* deformStroke */ deformStroke,
/* generateStrokes */ NULL,
/* bakeModifier */ bakeModifier,
/* bakeModifier */ bakeModifier,
/* remapTime */ NULL,
/* initData */ initData,
/* freeData */ NULL,

@ -110,7 +110,8 @@ GpencilModifierTypeInfo modifierType_Gpencil_Simplify = {
/* deformStroke */ deformStroke,
/* generateStrokes */ NULL,
/* bakeModifier */ bakeModifier,
/* bakeModifier */ bakeModifier,
/* remapTime */ NULL,
/* initData */ initData,
/* freeData */ NULL,

@ -137,7 +137,8 @@ GpencilModifierTypeInfo modifierType_Gpencil_Smooth = {
/* deformStroke */ deformStroke,
/* generateStrokes */ NULL,
/* bakeModifier */ bakeModifier,
/* bakeModifier */ bakeModifier,
/* remapTime */ NULL,
/* initData */ initData,
/* freeData */ NULL,

@ -107,7 +107,8 @@ GpencilModifierTypeInfo modifierType_Gpencil_Subdiv = {
/* deformStroke */ deformStroke,
/* generateStrokes */ NULL,
/* bakeModifier */ bakeModifier,
/* bakeModifier */ bakeModifier,
/* remapTime */ NULL,
/* initData */ initData,
/* freeData */ NULL,

@ -156,9 +156,10 @@ GpencilModifierTypeInfo modifierType_Gpencil_Thick = {
/* copyData */ copyData,
/* deformStroke */ deformStroke,
/* generateStrokes */ NULL,
/* bakeModifier */ bakeModifier,
/* deformStroke */ deformStroke,
/* generateStrokes */ NULL,
/* bakeModifier */ bakeModifier,
/* remapTime */ NULL,
/* initData */ initData,
/* freeData */ freeData,

@ -159,7 +159,8 @@ GpencilModifierTypeInfo modifierType_Gpencil_Tint = {
/* deformStroke */ deformStroke,
/* generateStrokes */ NULL,
/* bakeModifier */ bakeModifier,
/* bakeModifier */ bakeModifier,
/* remapTime */ NULL,
/* initData */ initData,
/* freeData */ NULL,

@ -0,0 +1,127 @@
/*
* ***** 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.
*
* The Original Code is Copyright (C) 2018, Blender Foundation
* This is a new part of Blender
*
* Contributor(s): Antonio Vazquez
*
* ***** END GPL LICENSE BLOCK *****
*
*/
/** \file blender/gpencil_modifiers/intern/MOD_gpenciltime.c
* \ingroup modifiers
*/
#include <stdio.h>
#include <string.h>
#include "BLI_utildefines.h"
#include "DNA_meshdata_types.h"
#include "DNA_scene_types.h"
#include "DNA_object_types.h"
#include "DNA_gpencil_types.h"
#include "DNA_gpencil_modifier_types.h"
#include "BKE_colortools.h"
#include "BKE_context.h"
#include "BKE_deform.h"
#include "BKE_gpencil.h"
#include "BKE_gpencil_modifier.h"
#include "DEG_depsgraph.h"
#include "MOD_gpencil_util.h"
#include "MOD_gpencil_modifiertypes.h"
static void initData(GpencilModifierData *md)
{
TimeGpencilModifierData *gpmd = (TimeGpencilModifierData *)md;
gpmd->layername[0] = '\0';
gpmd->offset = 1;
gpmd->flag |= GP_TIME_KEEP_LOOP;
}
static void copyData(const GpencilModifierData *md, GpencilModifierData *target)
{
BKE_gpencil_modifier_copyData_generic(md, target);
}
static int remapTime(struct GpencilModifierData *md, struct Depsgraph *UNUSED(depsgraph),
struct Scene *scene, struct Object *ob, struct bGPDlayer *gpl, int cfra)
{
TimeGpencilModifierData *mmd = (TimeGpencilModifierData *)md;
const int sfra = scene->r.sfra;
const int efra = scene->r.efra;
const int nfra = cfra + mmd->offset;
const bool invgpl = mmd->flag & GP_SIMPLIFY_INVERT_LAYER;
/* omit if filter by layer */
if (mmd->layername[0] != '\0') {
if (invgpl == false) {
if (!STREQ(mmd->layername, gpl->info)) {
return cfra;
}
}
else {
if (STREQ(mmd->layername, gpl->info)) {
return cfra;
}
}
}
if (mmd->flag & GP_TIME_KEEP_LOOP) {
/* if the sum of the cfra is out scene frame range, recalc */
if (cfra + mmd->offset < sfra) {
const int delta = abs(sfra - nfra);
return efra - delta + 1;
}
else if (cfra + mmd->offset > efra) {
return nfra - efra + sfra - 1;
}
}
return cfra + mmd->offset;
}
GpencilModifierTypeInfo modifierType_Gpencil_Time = {
/* name */ "Time",
/* structName */ "TimeGpencilModifierData",
/* structSize */ sizeof(TimeGpencilModifierData),
/* type */ eGpencilModifierTypeType_Gpencil,
/* flags */ eGpencilModifierTypeFlag_Single |
eGpencilModifierTypeFlag_NoApply,
/* copyData */ copyData,
/* deformStroke */ NULL,
/* generateStrokes */ NULL,
/* bakeModifier */ NULL,
/* remapTime */ remapTime,
/* initData */ initData,
/* freeData */ NULL,
/* isDisabled */ NULL,
/* updateDepsgraph */ NULL,
/* dependsOnTime */ NULL,
/* foreachObjectLink */ NULL,
/* foreachIDLink */ NULL,
/* foreachTexLink */ NULL,
};

@ -51,6 +51,7 @@ typedef enum GpencilModifierType {
eGpencilModifierType_Offset = 13,
eGpencilModifierType_Mirror = 14,
eGpencilModifierType_Armature = 15,
eGpencilModifierType_Time = 16,
NUM_GREASEPENCIL_MODIFIER_TYPES
} GpencilModifierType;
@ -139,6 +140,18 @@ typedef enum eThickGpencil_Flag {
GP_THICK_NORMALIZE = (1 << 4),
} eThickGpencil_Flag;
typedef struct TimeGpencilModifierData {
GpencilModifierData modifier;
char layername[64]; /* layer name */
int flag; /* flags */
int offset;
} TimeGpencilModifierData;
typedef enum eTimeGpencil_Flag {
GP_TIME_INVERT_LAYER = (1 << 0),
GP_TIME_KEEP_LOOP = (1 << 1),
} eTimeGpencil_Flag;
typedef enum eModifyColorGpencil_Flag {
GP_MODIFY_COLOR_BOTH = 0,
GP_MODIFY_COLOR_STROKE = 1,

@ -605,6 +605,7 @@ extern StructRNA RNA_SubdivGpencilModifier;
extern StructRNA RNA_SimplifyGpencilModifier;
extern StructRNA RNA_ThickGpencilModifier;
extern StructRNA RNA_TintGpencilModifier;
extern StructRNA RNA_TimeGpencilModifier;
extern StructRNA RNA_ColorGpencilModifier;
extern StructRNA RNA_InstanceGpencilModifier;
extern StructRNA RNA_DupliGpencilModifier;

@ -74,6 +74,7 @@ const EnumPropertyItem rna_enum_object_greasepencil_modifier_type_items[] = {
{eGpencilModifierType_Offset, "GP_OFFSET", ICON_MOD_DISPLACE, "Offset", "Change stroke location, rotation or scale"},
{eGpencilModifierType_Smooth, "GP_SMOOTH", ICON_MOD_SMOOTH, "Smooth", "Smooth stroke"},
{eGpencilModifierType_Thick, "GP_THICK", ICON_MAN_ROT, "Thickness", "Change stroke thickness"},
{eGpencilModifierType_Time, "GP_TIME", ICON_MOD_DISPLACE, "Time", "Offset keyframes"},
{0, "", 0, N_("Color"), "" },
{eGpencilModifierType_Color, "GP_COLOR", ICON_GROUP_VCOL, "Hue/Saturation", "Apply changes to stroke colors"},
{eGpencilModifierType_Opacity, "GP_OPACITY", ICON_MOD_MASK, "Opacity", "Opacity of the strokes"},
@ -142,6 +143,8 @@ static StructRNA *rna_GpencilModifier_refine(struct PointerRNA *ptr)
return &RNA_ThickGpencilModifier;
case eGpencilModifierType_Tint:
return &RNA_TintGpencilModifier;
case eGpencilModifierType_Time:
return &RNA_TimeGpencilModifier;
case eGpencilModifierType_Color:
return &RNA_ColorGpencilModifier;
case eGpencilModifierType_Instance:
@ -719,6 +722,40 @@ static void rna_def_modifier_gpenciltint(BlenderRNA *brna)
RNA_def_property_update(prop, 0, "rna_GpencilModifier_update");
}
static void rna_def_modifier_gpenciltime(BlenderRNA *brna)
{
StructRNA *srna;
PropertyRNA *prop;
srna = RNA_def_struct(brna, "TimeGpencilModifier", "GpencilModifier");
RNA_def_struct_ui_text(srna, "Time Modifier", "Time modifier");
RNA_def_struct_sdna(srna, "TimeGpencilModifierData");
RNA_def_struct_ui_icon(srna, ICON_MOD_DISPLACE);
prop = RNA_def_property(srna, "layer", PROP_STRING, PROP_NONE);
RNA_def_property_string_sdna(prop, NULL, "layername");
RNA_def_property_ui_text(prop, "Layer", "Layer name");
RNA_def_property_update(prop, 0, "rna_GpencilModifier_update");
prop = RNA_def_property(srna, "invert_layers", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_TIME_INVERT_LAYER);
RNA_def_property_ui_text(prop, "Inverse Layers", "Inverse filter");
RNA_def_property_update(prop, 0, "rna_GpencilModifier_update");
prop = RNA_def_property(srna, "offset", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "offset");
RNA_def_property_range(prop, -INT_MAX, INT_MAX);
RNA_def_property_ui_text(prop, "Offset",
"Number of frames to offset original keyframe number");
RNA_def_property_update(prop, 0, "rna_GpencilModifier_update");
prop = RNA_def_property(srna, "use_keep_loop", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_TIME_KEEP_LOOP);
RNA_def_property_ui_text(prop, "Keep Loop",
"Retiming end frames and move to start of animation to keep loop");
RNA_def_property_update(prop, 0, "rna_GpencilModifier_update");
}
static void rna_def_modifier_gpencilcolor(BlenderRNA *brna)
{
StructRNA *srna;
@ -1392,6 +1429,7 @@ void RNA_def_greasepencil_modifier(BlenderRNA *brna)
rna_def_modifier_gpencilthick(brna);
rna_def_modifier_gpenciloffset(brna);
rna_def_modifier_gpenciltint(brna);
rna_def_modifier_gpenciltime(brna);
rna_def_modifier_gpencilcolor(brna);
rna_def_modifier_gpencilinstance(brna);
rna_def_modifier_gpencilbuild(brna);

Loading…
Cancel
Save