GPV3: Modifiers: Add get_drawing_infos_for_write

This API returns a vector with a pointer to each drawing as well
as the starting frame for the keyframe that the drawing came from.
This commit is contained in:
Falk David
2024-01-19 14:58:00 +01:00
parent b6ed5eea8d
commit c5dff902a6
2 changed files with 38 additions and 2 deletions

View File

@@ -37,6 +37,7 @@
namespace blender::modifier::greasepencil {
using bke::greasepencil::Drawing;
using bke::greasepencil::FramesMapKey;
using bke::greasepencil::Layer;
void init_influence_data(GreasePencilModifierInfluenceData *influence_data,
@@ -310,12 +311,12 @@ IndexMask get_filtered_stroke_mask(const Object *ob,
Vector<bke::greasepencil::Drawing *> get_drawings_for_write(GreasePencil &grease_pencil,
const IndexMask &layer_mask,
int frame)
const int frame)
{
/* Set of unique drawing indices. */
Set<int> drawing_indices;
for (const int64_t i : layer_mask.index_range()) {
Layer *layer = grease_pencil.layers_for_write()[layer_mask[i]];
const Layer *layer = grease_pencil.layers()[layer_mask[i]];
const int drawing_index = layer->drawing_index_at(frame);
if (drawing_index >= 0) {
drawing_indices.add(drawing_index);
@@ -334,4 +335,29 @@ Vector<bke::greasepencil::Drawing *> get_drawings_for_write(GreasePencil &grease
return drawings;
}
Vector<DrawingInfo> get_drawing_infos_for_write(GreasePencil &grease_pencil,
const IndexMask &layer_mask,
const int frame)
{
Set<int> drawing_indices;
Vector<DrawingInfo> drawing_infos;
for (const int64_t i : layer_mask.index_range()) {
const Layer *layer = grease_pencil.layers()[layer_mask[i]];
const std::optional<FramesMapKey> start_frame = layer->frame_key_at(frame);
if (!start_frame) {
continue;
}
const GreasePencilFrame &frame = layer->frames().lookup(*start_frame);
if (!drawing_indices.contains(frame.drawing_index)) {
drawing_indices.add(frame.drawing_index);
GreasePencilDrawingBase *drawing_base = grease_pencil.drawing(frame.drawing_index);
if (drawing_base->type == GP_DRAWING) {
GreasePencilDrawing *drawing = reinterpret_cast<GreasePencilDrawing *>(drawing_base);
drawing_infos.append({&drawing->wrap(), *start_frame});
}
}
}
return drawing_infos;
}
} // namespace blender::modifier::greasepencil

View File

@@ -63,4 +63,14 @@ Vector<bke::greasepencil::Drawing *> get_drawings_for_write(GreasePencil &grease
const IndexMask &layer_mask,
int frame);
struct DrawingInfo {
bke::greasepencil::Drawing *drawing;
/* Frame on which this drawing starts. */
int start_frame_number;
};
Vector<DrawingInfo> get_drawing_infos_for_write(GreasePencil &grease_pencil,
const IndexMask &layer_mask,
int frame);
} // namespace blender::modifier::greasepencil