40#include "RNA_prototypes.hh"
59 tmd->segments_array = segment;
60 tmd->segments_num = 1;
109 return std::max(
efra + 1 -
sfra, 0);
138 for (
const int i :
result.index_range()) {
139 const int irev =
result.size() - 1 -
i;
140 if (sorted_keys[
result[irev]] <= frame_range.
sfra) {
146 for (
const int i :
result.index_range()) {
165 scale_(tmd.frame_scale),
185 return float(local_frame - offset_) / scale_;
189 return scene_frame * scale_ + offset_;
227 const int duration = gp_src.
duration();
246 const int offset = gp_dst_range.
sfra - gp_src_range.
sfra;
248 const int gp_key = sorted_keys[
i];
249 const int gp_insert_key = std::max(gp_key, gp_src_range.
sfra);
250 if (gp_insert_key > gp_src_range.
efra) {
267 const int offset = gp_dst_range.
sfra - gp_src_range.
sfra;
271 const int irev = sorted_keys.
size() - 1 -
i;
273 const int gp_key = sorted_keys[irev];
277 const int gp_end_key = (irev < sorted_keys.
size() - 1) ?
278 std::min(sorted_keys[irev + 1], gp_src_range.
efra + 1) :
279 gp_src_range.
efra + 1;
280 if (gp_end_key < gp_src_range.
sfra) {
285 const int gp_key_rev = gp_src_range.
efra + 1 - (gp_end_key - gp_src_range.
sfra);
294 const int gp_src_frame,
298 const FrameRange gp_src_range = {gp_src_frame, gp_src_frame};
313 int repeat_start = 0, repeat_count = 1;
318 for ([[maybe_unused]]
const int repeat_i :
IndexRange(repeat_count)) {
331 int repeat_start = 0, repeat_count = 1;
336 for ([[maybe_unused]]
const int repeat_i :
IndexRange(repeat_count)) {
353 2 * gp_src_range.
efra - gp_src_range.
sfra - 1};
354 int repeat_start = 0, repeat_count = 1;
359 for ([[maybe_unused]]
const int repeat_i :
IndexRange(repeat_count)) {
362 gp_dst_range = gp_dst_range.
shift(gp_src_range_ping.
duration());
365 gp_dst_range = gp_dst_range.
shift(gp_src_range_pong.
duration());
383 auto segment_base_range = [](
const Segment &segment) {
384 return FrameRange{std::min(segment.segment_start, segment.segment_end),
385 std::max(segment.segment_start, segment.segment_end)};
387 auto segment_full_range = [](
const Segment &segment) {
389 std::max(segment.segment_start, segment.segment_end)};
394 base_range.
sfra + segment.segment_repeat * base_duration - 1};
398 int duration = segment_full_range(segments.
first()).duration();
399 for (
const Segment &segment : segments.
drop_front(1)) {
400 duration += segment_full_range(segment).duration();
405 int repeat_start = 0, repeat_count = 1;
411 for ([[maybe_unused]]
const int repeat_i :
IndexRange(repeat_count)) {
412 for (
const Segment &segment : segments) {
413 const FrameRange segment_src_range = segment_base_range(segment);
414 for ([[maybe_unused]]
const int segment_repeat_i :
IndexRange(segment.segment_repeat)) {
418 mapping, frames, src_keys, segment_src_range, gp_dst_range, dst_frames);
419 gp_dst_range = gp_dst_range.
shift(segment_src_range.
duration());
423 mapping, frames, src_keys, segment_src_range, gp_dst_range, dst_frames);
424 gp_dst_range = gp_dst_range.
shift(segment_src_range.
duration());
428 const FrameRange segment_src_range_ping = {segment_src_range.
sfra,
429 segment_src_range.
efra - 1};
431 mapping, frames, src_keys, segment_src_range_ping, gp_dst_range, dst_frames);
432 gp_dst_range = gp_dst_range.
shift(segment_src_range_ping.
duration());
434 const FrameRange segment_src_range_pong = {segment_src_range.
sfra + 1,
435 segment_src_range.
efra};
437 mapping, frames, src_keys, segment_src_range_pong, gp_dst_range, dst_frames);
438 gp_dst_range = gp_dst_range.
shift(segment_src_range_pong.
duration());
448 const Scene &eval_scene,
464 tmd, frames, sorted_keys, custom_range, scene_dst_range, dst_frames);
468 tmd, frames, sorted_keys, custom_range, scene_dst_range, dst_frames);
475 tmd, frames, sorted_keys, custom_range, scene_dst_range, dst_frames);
479 tmd, frames, sorted_keys, tmd.segments(), scene_range, scene_dst_range, dst_frames);
503 grease_pencil, tmd->influence, mask_memory);
505 const Span<Layer *> layers_for_write = grease_pencil.layers_for_write();
507 Layer &layer = *layers_for_write[layer_i];
512 fill_scene_timeline(*tmd, *scene, src_frames, sorted_keys, dst_keyframe_range, new_frames);
527 const bool use_custom_range = !
ELEM(
537 const char *text = use_fixed_offset ?
IFACE_(
"Frame") :
IFACE_(
"Frame Offset");
540 row = &
col->row(
false);
544 row = &layout->
row(
false);
549 row = &layout->
row(
false);
554 "MOD_UL_grease_pencil_time_modifier_segments",
559 "segment_active_index",
570 sub->
op(
"OBJECT_OT_grease_pencil_time_modifier_segment_add",
"", ICON_ADD);
571 sub->
op(
"OBJECT_OT_grease_pencil_time_modifier_segment_remove",
"", ICON_REMOVE);
573 sub = &
col->column(
true);
575 "OBJECT_OT_grease_pencil_dash_modifier_segment_move",
"", ICON_TRIA_UP);
577 op_ptr = layout->
op(
"OBJECT_OT_grease_pencil_dash_modifier_segment_move",
"", ICON_TRIA_DOWN);
580 if (tmd->segments().index_range().contains(tmd->segment_active_index)) {
583 &RNA_GreasePencilTimeModifierSegment,
584 &tmd->segments()[tmd->segment_active_index]);
586 sub = &layout->
column(
true);
587 sub->
prop(&segment_ptr,
"segment_mode",
UI_ITEM_NONE, std::nullopt, ICON_NONE);
588 sub = &layout->
column(
true);
589 sub->
prop(&segment_ptr,
"segment_start",
UI_ITEM_NONE, std::nullopt, ICON_NONE);
590 sub->
prop(&segment_ptr,
"segment_end",
UI_ITEM_NONE, std::nullopt, ICON_NONE);
591 sub->
prop(&segment_ptr,
"segment_repeat",
UI_ITEM_NONE, std::nullopt, ICON_NONE);
597 header->use_property_split_set(
false);
598 header->active_set(use_custom_range);
599 header->prop(
ptr,
"use_custom_frame_range",
UI_ITEM_NONE, std::nullopt, ICON_NONE);
602 body->use_property_split_set(
true);
605 col = &body->column(
true);
611 C,
ptr,
"open_influence_panel",
IFACE_(
"Influence")))
670 "GreasePencilTimeModifierData",
672 &RNA_GreasePencilTimeModifier,
Low-level operations for curves.
Low-level operations for grease pencil.
void(*)(void *user_data, Object *ob, ID **idpoin, LibraryForeachIDCallbackFlag cb_flag) IDWalkFunc
void BKE_modifier_copydata_generic(const ModifierData *md, ModifierData *md_dst, int flag)
@ eModifierTypeFlag_SupportsMapping
@ eModifierTypeFlag_AcceptsGreasePencil
@ eModifierTypeFlag_EnableInEditmode
@ eModifierTypeFlag_SupportsEditmode
#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
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
PanelType * modifier_panel_register(ARegionType *region_type, ModifierType type, PanelDrawFn draw)
PointerRNA * modifier_panel_get_property_pointers(Panel *panel, PointerRNA *r_ob_ptr)
void modifier_error_message_draw(uiLayout *layout, PointerRNA *ptr)
void uiTemplateList(uiLayout *layout, const bContext *C, const char *listtype_name, const char *list_id, PointerRNA *dataptr, blender::StringRefNull 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)
@ UI_TEMPLATE_LIST_FLAG_NONE
bool add_overwrite(const Key &key, const Value &value)
const Value & lookup(const Key &key) const
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 tag_frames_map_keys_changed()
const Map< FramesMapKeyT, GreasePencilFrame > & frames() const
Span< FramesMapKeyT > sorted_keys() const
Map< FramesMapKeyT, GreasePencilFrame > & frames_for_write()
void foreach_index(Fn &&fn) const
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)
void write_influence_data(BlendWriter *writer, const GreasePencilModifierInfluenceData *influence_data)
static IndexMask get_filtered_layer_mask(const GreasePencil &grease_pencil, const std::optional< StringRef > tree_node_name_filter, const std::optional< int > layer_pass_filter, const bool layer_filter_invert, const bool layer_pass_filter_invert, IndexMaskMemory &memory)
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 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 IndexRange find_key_range(const Span< int > sorted_keys, const FrameRange &frame_range)
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)
void RNA_enum_set(PointerRNA *ptr, const char *name, int value)
PointerRNA RNA_pointer_create_discrete(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()
PanelLayout panel_prop(const bContext *C, PointerRNA *open_prop_owner, blender::StringRefNull open_prop_name)
uiLayout & column(bool align)
void active_set(bool active)
uiLayout & row(bool align)
PointerRNA op(wmOperatorType *ot, std::optional< blender::StringRef > name, int icon, blender::wm::OpCallContext context, eUI_Item_Flag flag)
void use_property_split_set(bool value)
void prop(PointerRNA *ptr, PropertyRNA *prop, int index, int value, eUI_Item_Flag flag, std::optional< blender::StringRef > name_opt, int icon, std::optional< blender::StringRef > placeholder=std::nullopt)
char idname[BKE_ST_MAXNAME]
uiListDrawItemFunc draw_item
bool WM_uilisttype_add(uiListType *ult)