GPv3: Onion Skinning #119792

Merged
Falk David merged 20 commits from filedescriptor/blender:gpv3-old-onion-skinning into main 2024-04-03 15:34:51 +02:00
1 changed files with 26 additions and 6 deletions
Showing only changes of commit f35b8b7c30 - Show all commits

View File

@ -238,6 +238,7 @@ static std::optional<int> get_frame_id(const bke::greasepencil::Layer &layer,
const int current_frame_index,
const bool use_multi_frame_editing,
const bool do_onion_skinning,
const bool is_before_first,
const GreasePencilOnionSkinningSettings onion_settings)
{
if (use_multi_frame_editing) {
@ -259,14 +260,23 @@ static std::optional<int> get_frame_id(const bke::greasepencil::Layer &layer,
return {};
}
int delta = (onion_settings.mode == GP_ONION_SKINNING_MODE_ABSOLUTE) ?
frame_number - current_frame :
frame_index - current_frame_index;
int delta = 0;
if (onion_settings.mode == GP_ONION_SKINNING_MODE_ABSOLUTE) {
delta = frame_number - current_frame;
}
else {
delta = frame_index - current_frame_index;
}
if (is_before_first) {
delta++;
}
/* Frame range filter. */
if (-delta > onion_settings.num_frames_before || delta > onion_settings.num_frames_after) {
return {};
}
return delta;
return delta;
}
return {};
}
@ -280,8 +290,16 @@ static Array<std::pair<int, int>> get_visible_frames_for_layer(
{
GreasePencilOnionSkinningSettings onion_settings = grease_pencil.onion_skinning_settings;
Vector<std::pair<int, int>> frame_numbers;
const std::optional<int> current_frame_index = layer.frame_key_at(current_frame);
const Span<int> sorted_keys = layer.sorted_keys();
if (sorted_keys.is_empty()) {
return {};
}
const std::optional<bke::greasepencil::FramesMapKey> current_frame_key = layer.frame_key_at(
current_frame);
const int current_frame_index = current_frame_key.has_value() ?
sorted_keys.first_index(*current_frame_key) :
0;
const bool is_before_first = (current_frame < sorted_keys.first());
for (const int frame_i : sorted_keys.index_range()) {
const int frame_number = sorted_keys[frame_i];
if (frame_number == current_frame) {
@ -293,11 +311,13 @@ static Array<std::pair<int, int>> get_visible_frames_for_layer(
frame_number,
frame_i,
current_frame,
*current_frame_index,
current_frame_index,
use_multi_frame_editing,
do_onion_skinning,
is_before_first,
onion_settings);
if (!frame_id.has_value()) {
/* Drawing on this frame is not visible. */
continue;
}