40#include "RNA_prototypes.hh"
61 tmd->segments_array = segment;
62 tmd->segments_num = 1;
111 return std::max(
efra + 1 -
sfra, 0);
140 for (
const int i : result.index_range()) {
141 const int irev = result.
size() - 1 - i;
142 if (sorted_keys[result[irev]] <= frame_range.
sfra) {
144 result = result.drop_front(irev);
148 for (
const int i : result.index_range()) {
149 if (sorted_keys[result[i]] > frame_range.
efra) {
151 result = result.take_front(i);
166 : offset_(tmd.offset),
167 scale_(tmd.frame_scale),
187 return float(local_frame - offset_) / scale_;
191 return scene_frame * scale_ + offset_;
224 if (!mapping.use_loop()) {
229 const int duration = gp_src.
duration();
235 const FrameRange gp_dst = {mapping.local_frame_before_scene_frame(scene_dst.
sfra),
236 mapping.local_frame_after_scene_frame(scene_dst.
efra)};
248 const int offset = gp_dst_range.
sfra - gp_src_range.
sfra;
250 const int gp_key = sorted_keys[i];
251 const int gp_insert_key = std::max(gp_key, gp_src_range.
sfra);
252 if (gp_insert_key > gp_src_range.
efra) {
256 const int scene_key = mapping.scene_frame_after_local_frame(gp_insert_key + offset);
269 const int offset = gp_dst_range.
sfra - gp_src_range.
sfra;
273 const int irev = sorted_keys.
size() - 1 - i;
275 const int gp_key = sorted_keys[irev];
279 const int gp_end_key = (irev < sorted_keys.
size() - 1) ?
280 std::min(sorted_keys[irev + 1], gp_src_range.
efra + 1) :
281 gp_src_range.
efra + 1;
282 if (gp_end_key < gp_src_range.
sfra) {
287 const int gp_key_rev = gp_src_range.
efra + 1 - (gp_end_key - gp_src_range.
sfra);
288 const int scene_key = mapping.scene_frame_after_local_frame(gp_key_rev + offset);
296 const int gp_src_frame,
300 const FrameRange gp_src_range = {gp_src_frame, gp_src_frame};
301 const FrameRange gp_dst_range = {mapping.local_frame_before_scene_frame(scene_dst_range.
sfra),
302 mapping.local_frame_after_scene_frame(scene_dst_range.
efra)};
315 int repeat_start = 0, repeat_count = 1;
320 for ([[maybe_unused]]
const int repeat_i :
IndexRange(repeat_count)) {
333 int repeat_start = 0, repeat_count = 1;
338 for ([[maybe_unused]]
const int repeat_i :
IndexRange(repeat_count)) {
355 2 * gp_src_range.
efra - gp_src_range.
sfra - 1};
356 int repeat_start = 0, repeat_count = 1;
361 for ([[maybe_unused]]
const int repeat_i :
IndexRange(repeat_count)) {
364 gp_dst_range = gp_dst_range.
shift(gp_src_range_ping.
duration());
367 gp_dst_range = gp_dst_range.
shift(gp_src_range_pong.
duration());
385 auto segment_base_range = [](
const Segment &segment) {
386 return FrameRange{std::min(segment.segment_start, segment.segment_end),
387 std::max(segment.segment_start, segment.segment_end)};
389 auto segment_full_range = [](
const Segment &segment) {
391 std::max(segment.segment_start, segment.segment_end)};
396 base_range.
sfra + segment.segment_repeat * base_duration - 1};
400 int duration = segment_full_range(segments.
first()).
duration();
401 for (
const Segment &segment : segments.
drop_front(1)) {
402 duration += segment_full_range(segment).duration();
407 int repeat_start = 0, repeat_count = 1;
413 for ([[maybe_unused]]
const int repeat_i :
IndexRange(repeat_count)) {
414 for (
const Segment &segment : segments) {
415 const FrameRange segment_src_range = segment_base_range(segment);
416 for ([[maybe_unused]]
const int segment_repeat_i :
IndexRange(segment.segment_repeat)) {
420 mapping, frames, src_keys, segment_src_range, gp_dst_range, dst_frames);
421 gp_dst_range = gp_dst_range.
shift(segment_src_range.
duration());
425 mapping, frames, src_keys, segment_src_range, gp_dst_range, dst_frames);
426 gp_dst_range = gp_dst_range.
shift(segment_src_range.
duration());
430 const FrameRange segment_src_range_ping = {segment_src_range.
sfra,
431 segment_src_range.
efra - 1};
433 mapping, frames, src_keys, segment_src_range_ping, gp_dst_range, dst_frames);
434 gp_dst_range = gp_dst_range.
shift(segment_src_range_ping.
duration());
436 const FrameRange segment_src_range_pong = {segment_src_range.
sfra + 1,
437 segment_src_range.
efra};
439 mapping, frames, src_keys, segment_src_range_pong, gp_dst_range, dst_frames);
440 gp_dst_range = gp_dst_range.
shift(segment_src_range_pong.
duration());
450 const Scene &eval_scene,
466 tmd, frames, sorted_keys, custom_range, scene_dst_range, dst_frames);
470 tmd, frames, sorted_keys, custom_range, scene_dst_range, dst_frames);
477 tmd, frames, sorted_keys, custom_range, scene_dst_range, dst_frames);
481 tmd, frames, sorted_keys, tmd.segments(), scene_range, scene_dst_range, dst_frames);
496 const FrameRange dst_keyframe_range = {scene->r.cfra, scene->r.cfra};
505 grease_pencil, tmd->influence, mask_memory);
507 const Span<Layer *> layers_for_write = grease_pencil.layers_for_write();
509 Layer &layer = *layers_for_write[layer_i];
510 const Span<int> sorted_keys = layer.sorted_keys();
514 fill_scene_timeline(*tmd, *scene, src_frames, sorted_keys, dst_keyframe_range, new_frames);
515 layer.frames_for_write() = std::move(new_frames);
516 layer.tag_frames_map_keys_changed();
529 const bool use_custom_range = !
ELEM(
539 const char *text = use_fixed_offset ?
IFACE_(
"Frame") :
IFACE_(
"Frame Offset");
556 "MOD_UL_grease_pencil_time_modifier_segments",
561 "segment_active_index",
572 uiItemO(sub,
"", ICON_ADD,
"OBJECT_OT_grease_pencil_time_modifier_segment_add");
573 uiItemO(sub,
"", ICON_REMOVE,
"OBJECT_OT_grease_pencil_time_modifier_segment_remove");
577 sub,
"", ICON_TRIA_UP,
"OBJECT_OT_grease_pencil_time_modifier_segment_move",
"type",
"UP");
581 "OBJECT_OT_grease_pencil_time_modifier_segment_move",
585 if (tmd->segments().index_range().contains(tmd->segment_active_index)) {
587 &RNA_GreasePencilTimeModifierSegment,
588 &tmd->segments()[tmd->segment_active_index]);
600 C, layout,
ptr,
"open_custom_range_panel");
616 C, layout,
ptr,
"open_influence_panel",
IFACE_(
"Influence")))
645 STRNCPY(list_type->
idname,
"MOD_UL_grease_pencil_time_modifier_segments");
676 "GreasePencilTimeModifierData",
678 &RNA_GreasePencilTimeModifier,
Low-level operations for curves.
Low-level operations for grease pencil.
void BKE_modifier_copydata_generic(const ModifierData *md, ModifierData *md_dst, int flag)
@ eModifierTypeFlag_SupportsMapping
@ eModifierTypeFlag_AcceptsGreasePencil
@ eModifierTypeFlag_EnableInEditmode
@ eModifierTypeFlag_SupportsEditmode
void(*)(void *user_data, Object *ob, ID **idpoin, int cb_flag) IDWalkFunc
#define STRNCPY(dst, src)
#define STRNCPY_UTF8(dst, src)
#define MEMCMP_STRUCT_AFTER_IS_ZERO(struct_var, member)
#define MEMCPY_STRUCT_AFTER(struct_dst, struct_src, member)
#define BLO_write_struct(writer, struct_name, data_ptr)
#define BLO_write_struct_array(writer, struct_name, array_size, data_ptr)
#define BLO_read_struct_array(reader, struct_name, array_size, ptr_p)
Scene * DEG_get_evaluated_scene(const Depsgraph *graph)
#define DNA_struct_default_get(struct_name)
#define DNA_struct_default_alloc(struct_name)
GreasePencilTimeModifierMode
@ MOD_GREASE_PENCIL_TIME_MODE_FIX
@ MOD_GREASE_PENCIL_TIME_MODE_CHAIN
@ MOD_GREASE_PENCIL_TIME_MODE_PINGPONG
@ MOD_GREASE_PENCIL_TIME_MODE_NORMAL
@ MOD_GREASE_PENCIL_TIME_MODE_REVERSE
@ MOD_GREASE_PENCIL_TIME_KEEP_LOOP
@ MOD_GREASE_PENCIL_TIME_CUSTOM_RANGE
@ eModifierType_GreasePencilTime
struct GreasePencilTimeModifierSegment GreasePencilTimeModifierSegment
struct GreasePencilTimeModifierData GreasePencilTimeModifierData
GreasePencilTimeModifierSegmentMode
@ MOD_GREASE_PENCIL_TIME_SEG_MODE_NORMAL
@ MOD_GREASE_PENCIL_TIME_SEG_MODE_REVERSE
@ MOD_GREASE_PENCIL_TIME_SEG_MODE_PINGPONG
ModifierTypeInfo modifierType_GreasePencilTime
void modifier_panel_end(uiLayout *layout, PointerRNA *ptr)
PanelType * modifier_panel_register(ARegionType *region_type, ModifierType type, PanelDrawFn draw)
PointerRNA * modifier_panel_get_property_pointers(Panel *panel, PointerRNA *r_ob_ptr)
void uiLayoutSetActive(uiLayout *layout, bool active)
void uiItemEnumO_string(uiLayout *layout, const char *name, int icon, const char *opname, const char *propname, const char *value_str)
uiLayout * uiLayoutRow(uiLayout *layout, bool align)
void uiLayoutSetPropSep(uiLayout *layout, bool is_sep)
void uiItemS(uiLayout *layout)
void uiTemplateList(uiLayout *layout, const bContext *C, const char *listtype_name, const char *list_id, PointerRNA *dataptr, const char *propname, PointerRNA *active_dataptr, const char *active_propname, const char *item_dyntip_propname, int rows, int maxrows, int layout_type, int columns, enum uiTemplateListFlags flags)
void uiItemO(uiLayout *layout, const char *name, int icon, const char *opname)
PanelLayout uiLayoutPanelProp(const bContext *C, uiLayout *layout, PointerRNA *open_prop_owner, const char *open_prop_name)
uiLayout * uiLayoutColumn(uiLayout *layout, bool align)
@ UI_TEMPLATE_LIST_FLAG_NONE
void uiItemR(uiLayout *layout, PointerRNA *ptr, const char *propname, eUI_Item_Flag flag, const char *name, int icon)
constexpr int64_t size() const
bool add_overwrite(const Key &key, const Value &value)
constexpr Span drop_front(int64_t n) const
constexpr Span slice(int64_t start, int64_t size) const
constexpr const T & first() const
constexpr int64_t size() const
constexpr IndexRange index_range() const
constexpr bool is_empty() const
void foreach_index(Fn &&fn) const
draw_view in_light_buf[] float
draw_view push_constant(Type::INT, "radiance_src") .push_constant(Type capture_info_buf storage_buf(1, Qualifier::READ, "ObjectBounds", "bounds_buf[]") .push_constant(Type draw_view int
void *(* MEM_callocN)(size_t len, const char *str)
void *(* MEM_dupallocN)(const void *vmemh)
void read_influence_data(BlendDataReader *reader, GreasePencilModifierInfluenceData *influence_data)
void init_influence_data(GreasePencilModifierInfluenceData *influence_data, const bool has_custom_curve)
static IndexMask get_filtered_layer_mask(const GreasePencil &grease_pencil, const std::optional< StringRef > layer_name_filter, const std::optional< int > layer_pass_filter, const bool layer_filter_invert, const bool layer_pass_filter_invert, IndexMaskMemory &memory)
void write_influence_data(BlendWriter *writer, const GreasePencilModifierInfluenceData *influence_data)
void draw_layer_filter_settings(const bContext *, uiLayout *layout, PointerRNA *ptr)
void free_influence_data(GreasePencilModifierInfluenceData *influence_data)
void foreach_influence_ID_link(GreasePencilModifierInfluenceData *influence_data, Object *ob, IDWalkFunc walk, void *user_data)
void copy_influence_data(const GreasePencilModifierInfluenceData *influence_data_src, GreasePencilModifierInfluenceData *influence_data_dst, const int)
static void copy_data(const ModifierData *md, ModifierData *target, const int flag)
static void fill_scene_timeline(const GreasePencilTimeModifierData &tmd, const Scene &eval_scene, const Map< int, GreasePencilFrame > &frames, const Span< int > sorted_keys, const FrameRange scene_dst_range, Map< int, GreasePencilFrame > &dst_frames)
static void blend_write(BlendWriter *writer, const ID *, const ModifierData *md)
static const IndexRange find_key_range(const Span< int > sorted_keys, const FrameRange &frame_range)
static void segment_list_item_draw(uiList *, const bContext *, uiLayout *layout, PointerRNA *, PointerRNA *itemptr, int, PointerRNA *, const char *, int, int)
static void fill_scene_range_fixed(const TimeMapping &mapping, const Map< int, GreasePencilFrame > &frames, const Span< int > sorted_keys, const int gp_src_frame, const FrameRange scene_dst_range, Map< int, GreasePencilFrame > &dst_frames)
static void init_data(ModifierData *md)
static void foreach_ID_link(ModifierData *md, Object *ob, IDWalkFunc walk, void *user_data)
static void panel_draw(const bContext *C, Panel *panel)
static void fill_scene_range_chain(const TimeMapping &mapping, const Map< int, GreasePencilFrame > &frames, const Span< int > sorted_keys, const Span< GreasePencilTimeModifierSegment > segments, const FrameRange gp_src_range, const FrameRange scene_dst_range, Map< int, GreasePencilFrame > &dst_frames)
static void modify_geometry_set(ModifierData *md, const ModifierEvalContext *ctx, bke::GeometrySet *geometry_set)
static void calculate_repetitions(const TimeMapping &mapping, const FrameRange &gp_src, const FrameRange &scene_dst, int &r_start, int &r_count)
static void free_data(ModifierData *md)
static void panel_register(ARegionType *region_type)
static void fill_scene_range_forward(const TimeMapping &mapping, const Map< int, GreasePencilFrame > &frames, const Span< int > sorted_keys, const FrameRange gp_src_range, const FrameRange scene_dst_range, Map< int, GreasePencilFrame > &dst_frames)
static void fill_scene_range_ping_pong(const TimeMapping &mapping, const Map< int, GreasePencilFrame > &frames, const Span< int > sorted_keys, const FrameRange gp_src_range, const FrameRange scene_dst_range, Map< int, GreasePencilFrame > &dst_frames)
static void insert_keys_forward(const TimeMapping &mapping, const Map< int, GreasePencilFrame > &frames, const Span< int > sorted_keys, const FrameRange gp_src_range, const FrameRange gp_dst_range, Map< int, GreasePencilFrame > &dst_frames)
static void blend_read(BlendDataReader *reader, ModifierData *md)
static void fill_scene_range_reverse(const TimeMapping &mapping, const Map< int, GreasePencilFrame > &frames, const Span< int > sorted_keys, const FrameRange gp_src_range, const FrameRange scene_dst_range, Map< int, GreasePencilFrame > &dst_frames)
static void insert_keys_reverse(const TimeMapping &mapping, const Map< int, GreasePencilFrame > &frames, const Span< int > sorted_keys, const FrameRange gp_src_range, const FrameRange gp_dst_range, Map< int, GreasePencilFrame > &dst_frames)
bool RNA_boolean_get(PointerRNA *ptr, const char *name)
PointerRNA RNA_pointer_create(ID *id, StructRNA *type, void *data)
int RNA_enum_get(PointerRNA *ptr, const char *name)
GreasePencilTimeModifierSegment * segments_array
bool is_single_frame() const
FrameRange shift(const int n) const
FrameRange drop_back(const int n) const
FrameRange drop_front(const int n) const
int scene_frame_before_local_frame(const int local_frame) const
int local_frame_after_scene_frame(const int scene_frame) const
int local_frame_before_scene_frame(const int scene_frame) const
int scene_frame_after_local_frame(const int local_frame) const
float to_local_time(const float scene_frame) const
TimeMapping(const GreasePencilTimeModifierData &tmd)
float to_scene_time(const float local_frame) const
bool has_grease_pencil() const
GreasePencil * get_grease_pencil_for_write()
char idname[BKE_ST_MAXNAME]
uiListDrawItemFunc draw_item
bool WM_uilisttype_add(uiListType *ult)