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:
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user