49 return td2d->
loc2d_i && td2d->
h1 ==
nullptr;
69 drawing.
runtime->fake_user =
true;
86 drawing.
runtime->fake_user =
false;
93 const bool use_duplicates)
96 LayerTransformData &trans_data = layer.
runtime->trans_data_;
98 if (trans_data.status != LayerTransformData::TRANS_CLEAR) {
111 trans_data.frames_static = layer.
frames();
112 trans_data.frames_transformed.
clear();
114 for (
const int frame_number : frames_affected) {
115 const bool was_duplicated = use_duplicates &&
116 trans_data.duplicated_frames_buffer.contains(frame_number);
122 trans_data.duplicated_frames_buffer :
126 trans_data.frames_transformed.add_overwrite(frame_number, frame_transformed);
128 if (!was_duplicated) {
132 trans_data.frames_static.remove_as(frame_number);
136 trans_data.frames_duration.clear();
137 trans_data.frames_destination.clear();
139 for (
const auto [frame_number, frame] : layer.
frames().
items()) {
140 if (frame.is_end()) {
148 trans_data.status = LayerTransformData::TRANS_INIT;
155 LayerTransformData &trans_data = layer.
runtime->trans_data_;
160 if (trans_data.status == LayerTransformData::TRANS_CLEAR) {
163 trans_data.status = LayerTransformData::TRANS_INIT;
168 const int src_frame_number,
169 const int dst_frame_number)
172 LayerTransformData &trans_data = layer.
runtime->trans_data_;
174 if (trans_data.status == LayerTransformData::TRANS_CLEAR) {
178 if (trans_data.status == LayerTransformData::TRANS_INIT) {
185 trans_data.status = LayerTransformData::TRANS_RUNNING;
188 if (!trans_data.frames_transformed.contains(src_frame_number)) {
196 const GreasePencilFrame src_frame = trans_data.frames_transformed.lookup(src_frame_number);
197 const int src_duration = trans_data.frames_duration.lookup_default(src_frame_number, 0);
204 trans_data.frames_destination.add_overwrite(src_frame_number, dst_frame_number);
212 const bool duplicate)
215 LayerTransformData &trans_data = layer.
runtime->trans_data_;
217 if (trans_data.status == LayerTransformData::TRANS_CLEAR) {
224 for (
const auto [frame_number, frame] : trans_data.frames_transformed.items()) {
225 if (trans_data.duplicated_frames_buffer.contains(frame_number)) {
235 grease_pencil.move_duplicate_frames(
236 layer, trans_data.frames_destination, trans_data.duplicated_frames_buffer);
239 if (canceled && duplicate) {
241 for (
const GreasePencilFrame &duplicate_frame : trans_data.duplicated_frames_buffer.values()) {
251 grease_pencil.remove_drawings_with_no_users();
254 trans_data.frames_static.clear();
255 trans_data.frames_transformed.clear();
256 trans_data.frames_destination.clear();
257 trans_data.duplicated_frames_buffer.clear();
258 trans_data.status = LayerTransformData::TRANS_CLEAR;
275 int i,
count = 0, count_all = 0;
277 if (
ELEM(
nullptr, fcu, fcu->
bezt)) {
294 if (is_prop_edit &&
count > 0) {
305 int count = 0, count_all = 0;
307 if (gpl ==
nullptr) {
321 if (is_prop_edit &&
count > 0) {
330 const bool is_prop_edit,
331 const bool use_duplicated)
333 if (layer ==
nullptr) {
337 int count_selected = 0;
340 if (use_duplicated) {
342 count_selected += layer->
runtime->trans_data_.duplicated_frames_buffer.size();
343 count_all += count_selected;
347 for (
const auto &[frame_number, frame] : layer->
frames().
items()) {
351 if (frame.is_selected()) {
358 if (is_prop_edit && count_selected > 0) {
361 return count_selected;
367 int count = 0, count_all = 0;
369 if (masklay ==
nullptr) {
383 if (is_prop_edit &&
count > 0) {
393 float *time = bezt->
vec[1];
396 td2d->
loc[0] = *time;
398 td2d->
h1 = bezt->
vec[0];
399 td2d->
h2 = bezt->
vec[2];
457 if (
ELEM(
nullptr, fcu, fcu->
bezt)) {
463 if (is_prop_edit || (bezt->
f2 &
SELECT))
501 if (is_prop_edit || is_selected) {
503 td2d->
loc[0] =
float(gpf->framenum);
504 td2d->
loc2d_i = &gpf->framenum;
540 const bool is_prop_edit,
542 const bool duplicate)
546 int total_trans_frames = 0;
547 bool any_frame_affected =
false;
550 const auto grease_pencil_frame_to_trans_data = [&](
const int frame_number,
551 const bool frame_selected) {
555 if ((!is_prop_edit && !frame_selected) || !
FrameOnMouseSide(side, frame_number, cfra)) {
567 if (frame_selected) {
581 total_trans_frames++;
583 frames_affected.
append(frame_number);
584 any_frame_affected =
true;
588 duplicate ? (layer->
runtime->trans_data_.duplicated_frames_buffer) : layer->
frames();
590 for (
const auto [frame_number, frame] : frame_map.
items()) {
591 grease_pencil_frame_to_trans_data(frame_number, frame.is_selected());
594 if (total_trans_frames == 0) {
595 return total_trans_frames;
600 if (any_frame_affected) {
602 *grease_pencil, *layer, frames_affected.
as_span(), duplicate);
605 return total_trans_frames;
625 td2d->
loc[0] =
float(masklay_shape->frame);
626 td2d->
loc2d_i = &masklay_shape->frame;
666 ListBase anim_data = {
nullptr,
nullptr};
713 static_cast<Layer *
>(ale->data), t->
frame_side, cfra, is_prop_edit, use_duplicated);
768 gpf_count += ale_count;
776 if (
count == 0 && gpf_count == 0) {
795 if (is_prop_edit && !ale->tag) {
812 Layer *layer =
static_cast<Layer *
>(ale->data);
816 td, td2d, grease_pencil, layer, t->
frame_side, cfra, is_prop_edit, ypos, use_duplicated);
859 int val =
abs(gpf->framenum - gpf_iter->framenum);
871 Layer *layer =
static_cast<Layer *
>(ale->data);
873 const auto grease_pencil_closest_selected_frame = [&](
const int frame_number,
874 const bool frame_selected) {
875 if (frame_selected) {
881 int closest_selected = INT_MAX;
882 for (
const auto [neighbor_frame_number, neighbor_frame] : layer->
frames().
items()) {
883 if (!neighbor_frame.is_selected() ||
888 const int distance =
abs(neighbor_frame_number - frame_number);
889 closest_selected = std::min(closest_selected,
distance);
896 for (
const auto [frame_number, frame] : layer->
frames().
items()) {
897 grease_pencil_closest_selected_frame(frame_number, frame.is_selected());
900 if (use_duplicated) {
902 for (
const auto [frame_number, frame] :
903 layer->
runtime->trans_data_.duplicated_frames_buffer.items())
905 grease_pencil_closest_selected_frame(frame_number, frame.is_selected());
922 int val =
abs(masklay_shape->frame - masklay_iter->frame);
947 for (j = 0, bezt_iter = fcu->
bezt; j < fcu->totvert; j++, bezt_iter++) {
950 float val =
fabs(bezt->
vec[1][0] - bezt_iter->
vec[1][0]);
994 ListBase anim_data = {
nullptr,
nullptr};
1098 *((
bool *)thunk) =
true;
1110 bool is_double =
false;
1115 for (masklay_shape =
static_cast<MaskLayerShape *
>(masklay->splines_shapes.first);
1117 masklay_shape = masklay_shape_next)
1119 masklay_shape_next = masklay_shape->
next;
1120 if (masklay_shape_next && masklay_shape->
frame == masklay_shape_next->
frame) {
1127 for (masklay_shape =
static_cast<MaskLayerShape *
>(masklay->splines_shapes.first);
1129 masklay_shape = masklay_shape->
next)
1148 bool is_double =
false;
1153 for (gpf =
static_cast<bGPDframe *
>(gpl->frames.first); gpf; gpf = gpfn) {
1162 for (gpf =
static_cast<bGPDframe *
>(gpl->frames.first); gpf; gpf = gpf->
next) {
1180 ListBase anim_data = {
nullptr,
nullptr};
1192 ale,
static_cast<FCurve *
>(ale->key_data),
false,
false);
1197 ale,
static_cast<FCurve *
>(ale->key_data),
true,
false);
1220 ListBase anim_data = {
nullptr,
nullptr};
1228 switch (ale->datatype) {
1261 BLI_assert_msg(
false,
"Keys cannot be transformed into this animation type.");
1300 ListBase anim_data = {
nullptr,
nullptr};
1306 switch (ale->datatype) {
1341 ListBase anim_data = {
nullptr,
nullptr};
Main * CTX_data_main(const bContext *C)
void BKE_fcurve_merge_duplicate_keys(FCurve *fcu, const int sel_flag, const bool use_handle)
void BKE_gpencil_layer_frames_sort(struct bGPDlayer *gpl, bool *r_has_duplicate_frames)
bool BKE_gpencil_layer_frame_delete(struct bGPDlayer *gpl, struct bGPDframe *gpf)
Low-level operations for grease pencil.
Key * BKE_key_from_object(Object *ob)
void BKE_view_layer_synced_ensure(const Scene *scene, ViewLayer *view_layer)
Object * BKE_view_layer_active_object_get(const ViewLayer *view_layer)
void BKE_mask_layer_shape_unlink(struct MaskLayer *masklay, struct MaskLayerShape *masklay_shape)
#define BLI_assert_unreachable()
#define BLI_assert_msg(a, msg)
#define LISTBASE_FOREACH(type, var, list)
void void void BLI_listbase_sort_r(ListBase *listbase, int(*cmp)(void *, const void *, const void *), void *thunk) ATTR_NONNULL(1
MINLINE int round_fl_to_int(float a)
MINLINE void copy_v2_v2(float r[2], const float a[2])
MINLINE void copy_v3_v3(float r[3], const float a[3])
BLI_INLINE int BLI_rcti_size_y(const struct rcti *rct)
BLI_INLINE float BLI_rctf_cent_y(const struct rctf *rct)
BLI_INLINE int BLI_rcti_size_x(const struct rcti *rct)
BLI_INLINE float BLI_rctf_size_x(const struct rctf *rct)
BLI_INLINE float BLI_rctf_size_y(const struct rctf *rct)
void DEG_id_tag_update(ID *id, unsigned int flags)
@ SACTION_NOREALTIMEUPDATES
@ ANIMTYPE_SPECIALDATA__UNUSED
@ ANIMTYPE_GREASE_PENCIL_DATABLOCK
@ ANIMTYPE_GREASE_PENCIL_LAYER
@ ANIMTYPE_FILLACT_LAYERED
@ ANIMTYPE_GREASE_PENCIL_LAYER_GROUP
@ ANIMFILTER_DATA_VISIBLE
Read Guarded memory(de)allocation.
void ANIM_animdata_freelist(ListBase *anim_data)
void ANIM_id_update(Main *bmain, ID *id)
void ANIM_list_elem_update(Main *bmain, Scene *scene, bAnimListElem *ale)
void ANIM_nla_mapping_apply_if_needed_fcurve(bAnimListElem *ale, FCurve *fcu, const bool restore, const bool only_keys)
bool ANIM_nla_mapping_allowed(const bAnimListElem *ale)
float ANIM_nla_tweakedit_remap(bAnimListElem *ale, const float cframe, const eNlaTime_ConvertModes mode)
bool ANIM_animdata_get_context(const bContext *C, bAnimContext *ac)
bool ANIM_animdata_context_getdata(bAnimContext *ac)
size_t ANIM_animdata_filter(bAnimContext *ac, ListBase *anim_data, const eAnimFilter_Flags filter_mode, void *data, const eAnimCont_Types datatype)
int ED_markers_post_apply_transform(ListBase *markers, Scene *scene, int mode, float value, char side)
ListBase * ED_context_get_markers(const bContext *C)
bool add_overwrite(const Key &key, const Value &value)
ItemIterator items() const &
const Value & lookup(const Key &key) const
ItemIterator items() const &
void append(const T &value)
Span< T > as_span() const
void tag_frames_map_keys_changed()
bool remove_frame(FramesMapKeyT key)
const Map< FramesMapKeyT, GreasePencilFrame > & frames() const
GreasePencilFrame * add_frame(FramesMapKeyT key, int duration=0)
int get_frame_duration_at(const int frame_number) const
Map< FramesMapKeyT, GreasePencilFrame > & frames_for_write()
float distance(VecOp< float, D >, VecOp< float, D >) RET
void ANIM_editkeyframes_refresh(bAnimContext *ac)
void * MEM_calloc_arrayN(size_t len, size_t size, const char *str)
ccl_device_inline float2 fabs(const float2 a)
ccl_device_inline float2 mask(const MaskType mask, const float2 a)
float wrap(float value, float max, float min)
GreasePencilDrawingRuntimeHandle * runtime
GreasePencilLayerRuntimeHandle * runtime
struct MaskLayerShape * next
void WM_main_add_notifier(uint type, void *reference)