Fix #130275: Trace sequence operator only uses first frame

The operator needs to look for exact frame matches, otherwise
it simply re-uses the first frame over and over.

Pull Request: https://projects.blender.org/blender/blender/pulls/130317
This commit is contained in:
Lukas Tönne
2024-11-15 15:54:56 +01:00
committed by Falk David
parent 1d571a810f
commit 366c8e247a

View File

@@ -291,16 +291,20 @@ static void trace_end_job(void *customdata)
TraceJob &trace_job = *static_cast<TraceJob *>(customdata);
GreasePencil &grease_pencil = *static_cast<GreasePencil *>(trace_job.ob_grease_pencil->data);
auto ensure_drawing_at_frame = [&](const int frame_number) {
const std::optional<int> start_frame = trace_job.layer->start_frame_at(frame_number);
if (start_frame && *start_frame == frame_number) {
return grease_pencil.get_editable_drawing_at(*trace_job.layer, frame_number);
}
return grease_pencil.insert_frame(*trace_job.layer, frame_number);
};
/* Update all the drawings once the job is done and we're executing in the main thread again.
* Changing drawing array or updating the drawing geometry is not thread-safe. */
switch (trace_job.mode) {
case TraceMode::Single: {
BLI_assert(trace_job.traced_curves.size() == 1);
bke::greasepencil::Drawing *drawing = grease_pencil.get_drawing_at(*trace_job.layer,
trace_job.frame_target);
if (drawing == nullptr) {
drawing = grease_pencil.insert_frame(*trace_job.layer, trace_job.frame_target);
}
bke::greasepencil::Drawing *drawing = ensure_drawing_at_frame(trace_job.frame_target);
BLI_assert(drawing != nullptr);
drawing->strokes_for_write() = trace_job.traced_curves.first();
drawing->tag_topology_changed();
@@ -314,11 +318,7 @@ static void trace_end_job(void *customdata)
BLI_assert(trace_job.traced_curves.size() == num_frames);
for (const int i : IndexRange(num_frames)) {
const int frame_number = init_frame + i;
bke::greasepencil::Drawing *drawing = grease_pencil.get_drawing_at(*trace_job.layer,
frame_number);
if (drawing == nullptr) {
drawing = grease_pencil.insert_frame(*trace_job.layer, frame_number);
}
bke::greasepencil::Drawing *drawing = ensure_drawing_at_frame(frame_number);
BLI_assert(drawing != nullptr);
drawing->strokes_for_write() = trace_job.traced_curves[i];
drawing->tag_topology_changed();