From 480882f4384102aa98ccf5b0d1a81fa3d9f4220f Mon Sep 17 00:00:00 2001 From: Christoph Lendenfeld Date: Tue, 12 Mar 2024 17:15:59 +0100 Subject: [PATCH 01/10] wip --- source/blender/blenkernel/intern/fcurve.cc | 84 +++++++++++----------- 1 file changed, 42 insertions(+), 42 deletions(-) diff --git a/source/blender/blenkernel/intern/fcurve.cc b/source/blender/blenkernel/intern/fcurve.cc index 47b835fcefd..b5dcfd9599d 100644 --- a/source/blender/blenkernel/intern/fcurve.cc +++ b/source/blender/blenkernel/intern/fcurve.cc @@ -25,6 +25,8 @@ #include "BLI_math_vector_types.hh" #include "BLI_sort_utils.h" #include "BLI_string_utils.hh" +#include "BLI_task.hh" +#include "BLI_timeit.hh" #include "BLT_translation.hh" @@ -1218,6 +1220,7 @@ static BezTriple *cycle_offset_triple( void BKE_fcurve_handles_recalc_ex(FCurve *fcu, eBezTriple_Flag handle_sel_flag) { + SCOPED_TIMER_AVERAGED("recalc handles"); /* Error checking: * - Need at least two points. * - Need bezier keys. @@ -1235,55 +1238,52 @@ void BKE_fcurve_handles_recalc_ex(FCurve *fcu, eBezTriple_Flag handle_sel_flag) const bool cycle = BKE_fcurve_is_cyclic(fcu) && BEZT_IS_AUTOH(first) && BEZT_IS_AUTOH(last); - /* Get initial pointers. */ - BezTriple *bezt = fcu->bezt; - BezTriple *prev = cycle_offset_triple(cycle, &tmp, &fcu->bezt[fcu->totvert - 2], last, first); - BezTriple *next = (bezt + 1); + blender::IndexRange bezt_range(0, fcu->totvert); + blender::threading::parallel_for(bezt_range, 128, [&](const blender::IndexRange range) { + for (const int i : range) { + BezTriple *bezt = &fcu->bezt[i]; + BezTriple *prev = nullptr; + BezTriple *next = nullptr; + if (i > 0) { + prev = (bezt - 1); + } + else { + prev = cycle_offset_triple(cycle, &tmp, &fcu->bezt[fcu->totvert - 2], last, first); + } + if (i < fcu->totvert - 1) { + next = (bezt + 1); + } - /* Loop over all beztriples, adjusting handles. */ - int a = fcu->totvert; - while (a--) { - /* Clamp timing of handles to be on either side of beztriple. */ - if (bezt->vec[0][0] > bezt->vec[1][0]) { - bezt->vec[0][0] = bezt->vec[1][0]; - } - if (bezt->vec[2][0] < bezt->vec[1][0]) { - bezt->vec[2][0] = bezt->vec[1][0]; - } + /* Clamp timing of handles to be on either side of beztriple. */ + if (bezt->vec[0][0] > bezt->vec[1][0]) { + bezt->vec[0][0] = bezt->vec[1][0]; + } + if (bezt->vec[2][0] < bezt->vec[1][0]) { + bezt->vec[2][0] = bezt->vec[1][0]; + } - /* Calculate auto-handles. */ - BKE_nurb_handle_calc_ex(bezt, prev, next, handle_sel_flag, true, fcu->auto_smoothing); + /* Calculate auto-handles. */ + BKE_nurb_handle_calc_ex(bezt, prev, next, handle_sel_flag, true, fcu->auto_smoothing); - /* For automatic ease in and out. */ - if (BEZT_IS_AUTOH(bezt) && !cycle) { - /* Only do this on first or last beztriple. */ - if (ELEM(a, 0, fcu->totvert - 1)) { - /* Set both handles to have same horizontal value as keyframe. */ - if (fcu->extend == FCURVE_EXTRAPOLATE_CONSTANT) { - bezt->vec[0][1] = bezt->vec[2][1] = bezt->vec[1][1]; - /* Remember that these keyframes are special, they don't need to be adjusted. */ - bezt->auto_handle_type = HD_AUTOTYPE_LOCKED_FINAL; + /* For automatic ease in and out. */ + if (BEZT_IS_AUTOH(bezt) && !cycle) { + /* Only do this on first or last beztriple. */ + if (ELEM(fcu->totvert, 0, fcu->totvert - 1)) { + /* Set both handles to have same horizontal value as keyframe. */ + if (fcu->extend == FCURVE_EXTRAPOLATE_CONSTANT) { + bezt->vec[0][1] = bezt->vec[2][1] = bezt->vec[1][1]; + /* Remember that these keyframes are special, they don't need to be adjusted. */ + bezt->auto_handle_type = HD_AUTOTYPE_LOCKED_FINAL; + } } } - } - /* Avoid total smoothing failure on duplicate keyframes (can happen during grab). */ - if (prev && prev->vec[1][0] >= bezt->vec[1][0]) { - prev->auto_handle_type = bezt->auto_handle_type = HD_AUTOTYPE_LOCKED_FINAL; + /* Avoid total smoothing failure on duplicate keyframes (can happen during grab). */ + if (prev && prev->vec[1][0] >= bezt->vec[1][0]) { + prev->auto_handle_type = bezt->auto_handle_type = HD_AUTOTYPE_LOCKED_FINAL; + } } - - /* Advance pointers for next iteration. */ - prev = bezt; - - if (a == 1) { - next = cycle_offset_triple(cycle, &tmp, &fcu->bezt[1], first, last); - } - else if (next != nullptr) { - next++; - } - - bezt++; - } + }); /* If cyclic extrapolation and Auto Clamp has triggered, ensure it is symmetric. */ if (cycle && (first->auto_handle_type != HD_AUTOTYPE_NORMAL || -- 2.30.2 From 97097c065394f330963b3c5b8863055376ba4aeb Mon Sep 17 00:00:00 2001 From: Christoph Lendenfeld Date: Tue, 12 Mar 2024 17:22:52 +0100 Subject: [PATCH 02/10] larger thread work --- source/blender/blenkernel/intern/fcurve.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/blender/blenkernel/intern/fcurve.cc b/source/blender/blenkernel/intern/fcurve.cc index b5dcfd9599d..12252718680 100644 --- a/source/blender/blenkernel/intern/fcurve.cc +++ b/source/blender/blenkernel/intern/fcurve.cc @@ -1239,7 +1239,7 @@ void BKE_fcurve_handles_recalc_ex(FCurve *fcu, eBezTriple_Flag handle_sel_flag) const bool cycle = BKE_fcurve_is_cyclic(fcu) && BEZT_IS_AUTOH(first) && BEZT_IS_AUTOH(last); blender::IndexRange bezt_range(0, fcu->totvert); - blender::threading::parallel_for(bezt_range, 128, [&](const blender::IndexRange range) { + blender::threading::parallel_for(bezt_range, 512, [&](const blender::IndexRange range) { for (const int i : range) { BezTriple *bezt = &fcu->bezt[i]; BezTriple *prev = nullptr; -- 2.30.2 From f758e40519491ac82f86a1151b2a115027778268 Mon Sep 17 00:00:00 2001 From: Christoph Lendenfeld Date: Thu, 14 Mar 2024 13:37:42 +0100 Subject: [PATCH 03/10] remove print --- source/blender/blenkernel/intern/fcurve.cc | 1 - 1 file changed, 1 deletion(-) diff --git a/source/blender/blenkernel/intern/fcurve.cc b/source/blender/blenkernel/intern/fcurve.cc index 12252718680..b62b5f365ec 100644 --- a/source/blender/blenkernel/intern/fcurve.cc +++ b/source/blender/blenkernel/intern/fcurve.cc @@ -1220,7 +1220,6 @@ static BezTriple *cycle_offset_triple( void BKE_fcurve_handles_recalc_ex(FCurve *fcu, eBezTriple_Flag handle_sel_flag) { - SCOPED_TIMER_AVERAGED("recalc handles"); /* Error checking: * - Need at least two points. * - Need bezier keys. -- 2.30.2 From 32a9bd6756d55e3d7286826524c63c3a4d690f19 Mon Sep 17 00:00:00 2001 From: Christoph Lendenfeld Date: Fri, 15 Mar 2024 11:00:41 +0100 Subject: [PATCH 04/10] remove unused include --- source/blender/blenkernel/intern/fcurve.cc | 1 - 1 file changed, 1 deletion(-) diff --git a/source/blender/blenkernel/intern/fcurve.cc b/source/blender/blenkernel/intern/fcurve.cc index b62b5f365ec..7252d2c446c 100644 --- a/source/blender/blenkernel/intern/fcurve.cc +++ b/source/blender/blenkernel/intern/fcurve.cc @@ -26,7 +26,6 @@ #include "BLI_sort_utils.h" #include "BLI_string_utils.hh" #include "BLI_task.hh" -#include "BLI_timeit.hh" #include "BLT_translation.hh" -- 2.30.2 From c7c3cb13fd8fdcecf8804aafd28cbb8b86979c76 Mon Sep 17 00:00:00 2001 From: Christoph Lendenfeld Date: Fri, 15 Mar 2024 11:22:24 +0100 Subject: [PATCH 05/10] fix issue with first and last key --- source/blender/blenkernel/intern/fcurve.cc | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/source/blender/blenkernel/intern/fcurve.cc b/source/blender/blenkernel/intern/fcurve.cc index 7252d2c446c..5e65df78886 100644 --- a/source/blender/blenkernel/intern/fcurve.cc +++ b/source/blender/blenkernel/intern/fcurve.cc @@ -1219,6 +1219,7 @@ static BezTriple *cycle_offset_triple( void BKE_fcurve_handles_recalc_ex(FCurve *fcu, eBezTriple_Flag handle_sel_flag) { + using namespace blender; /* Error checking: * - Need at least two points. * - Need bezier keys. @@ -1231,13 +1232,13 @@ void BKE_fcurve_handles_recalc_ex(FCurve *fcu, eBezTriple_Flag handle_sel_flag) } /* If the first modifier is Cycles, smooth the curve through the cycle. */ - BezTriple *first = &fcu->bezt[0], *last = &fcu->bezt[fcu->totvert - 1]; - BezTriple tmp; - + BezTriple *first = &fcu->bezt[0]; + BezTriple *last = &fcu->bezt[fcu->totvert - 1]; const bool cycle = BKE_fcurve_is_cyclic(fcu) && BEZT_IS_AUTOH(first) && BEZT_IS_AUTOH(last); - blender::IndexRange bezt_range(0, fcu->totvert); - blender::threading::parallel_for(bezt_range, 512, [&](const blender::IndexRange range) { + IndexRange bezt_range(0, fcu->totvert); + threading::parallel_for(bezt_range, 512, [&](const IndexRange range) { + BezTriple tmp; for (const int i : range) { BezTriple *bezt = &fcu->bezt[i]; BezTriple *prev = nullptr; @@ -1251,6 +1252,9 @@ void BKE_fcurve_handles_recalc_ex(FCurve *fcu, eBezTriple_Flag handle_sel_flag) if (i < fcu->totvert - 1) { next = (bezt + 1); } + else { + next = cycle_offset_triple(cycle, &tmp, &fcu->bezt[1], first, last); + } /* Clamp timing of handles to be on either side of beztriple. */ if (bezt->vec[0][0] > bezt->vec[1][0]) { @@ -1266,7 +1270,7 @@ void BKE_fcurve_handles_recalc_ex(FCurve *fcu, eBezTriple_Flag handle_sel_flag) /* For automatic ease in and out. */ if (BEZT_IS_AUTOH(bezt) && !cycle) { /* Only do this on first or last beztriple. */ - if (ELEM(fcu->totvert, 0, fcu->totvert - 1)) { + if (ELEM(i, 0, fcu->totvert - 1)) { /* Set both handles to have same horizontal value as keyframe. */ if (fcu->extend == FCURVE_EXTRAPOLATE_CONSTANT) { bezt->vec[0][1] = bezt->vec[2][1] = bezt->vec[1][1]; -- 2.30.2 From 4447f208eb5072d8e084f9d576ea13e90b201396 Mon Sep 17 00:00:00 2001 From: Christoph Lendenfeld Date: Tue, 26 Mar 2024 10:37:38 +0100 Subject: [PATCH 06/10] grain size to 128 --- source/blender/blenkernel/intern/fcurve.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/blender/blenkernel/intern/fcurve.cc b/source/blender/blenkernel/intern/fcurve.cc index 5e65df78886..0295cae3a91 100644 --- a/source/blender/blenkernel/intern/fcurve.cc +++ b/source/blender/blenkernel/intern/fcurve.cc @@ -1237,7 +1237,7 @@ void BKE_fcurve_handles_recalc_ex(FCurve *fcu, eBezTriple_Flag handle_sel_flag) const bool cycle = BKE_fcurve_is_cyclic(fcu) && BEZT_IS_AUTOH(first) && BEZT_IS_AUTOH(last); IndexRange bezt_range(0, fcu->totvert); - threading::parallel_for(bezt_range, 512, [&](const IndexRange range) { + threading::parallel_for(bezt_range, 128, [&](const IndexRange range) { BezTriple tmp; for (const int i : range) { BezTriple *bezt = &fcu->bezt[i]; -- 2.30.2 From b3f1d39d799fcf42199d52b0d037f62c9820c1c6 Mon Sep 17 00:00:00 2001 From: Christoph Lendenfeld Date: Tue, 30 Apr 2024 11:46:02 +0200 Subject: [PATCH 07/10] use clamp macros --- source/blender/blenkernel/intern/fcurve.cc | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/source/blender/blenkernel/intern/fcurve.cc b/source/blender/blenkernel/intern/fcurve.cc index 76d405c7f15..20ab6ef059b 100644 --- a/source/blender/blenkernel/intern/fcurve.cc +++ b/source/blender/blenkernel/intern/fcurve.cc @@ -1283,12 +1283,8 @@ void BKE_fcurve_handles_recalc_ex(FCurve *fcu, eBezTriple_Flag handle_sel_flag) } /* Clamp timing of handles to be on either side of beztriple. */ - if (bezt->vec[0][0] > bezt->vec[1][0]) { - bezt->vec[0][0] = bezt->vec[1][0]; - } - if (bezt->vec[2][0] < bezt->vec[1][0]) { - bezt->vec[2][0] = bezt->vec[1][0]; - } + CLAMP_MAX(bezt->vec[0][0], bezt->vec[1][0]); + CLAMP_MIN(bezt->vec[2][0], bezt->vec[1][0]); /* Calculate auto-handles. */ BKE_nurb_handle_calc_ex(bezt, prev, next, handle_sel_flag, true, fcu->auto_smoothing); -- 2.30.2 From 422c895967d8d8aba8bb604af34290818902742e Mon Sep 17 00:00:00 2001 From: Christoph Lendenfeld Date: Tue, 30 Apr 2024 12:04:56 +0200 Subject: [PATCH 08/10] set grain size to 512 --- source/blender/blenkernel/intern/fcurve.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/blender/blenkernel/intern/fcurve.cc b/source/blender/blenkernel/intern/fcurve.cc index 20ab6ef059b..cf61c6baca5 100644 --- a/source/blender/blenkernel/intern/fcurve.cc +++ b/source/blender/blenkernel/intern/fcurve.cc @@ -1263,7 +1263,7 @@ void BKE_fcurve_handles_recalc_ex(FCurve *fcu, eBezTriple_Flag handle_sel_flag) const bool cycle = BKE_fcurve_is_cyclic(fcu) && BEZT_IS_AUTOH(first) && BEZT_IS_AUTOH(last); IndexRange bezt_range(0, fcu->totvert); - threading::parallel_for(bezt_range, 128, [&](const IndexRange range) { + threading::parallel_for(bezt_range, 512, [&](const IndexRange range) { BezTriple tmp; for (const int i : range) { BezTriple *bezt = &fcu->bezt[i]; -- 2.30.2 From 9a431650a7a2f1b3780a51a3d8faa406e072d131 Mon Sep 17 00:00:00 2001 From: Christoph Lendenfeld Date: Fri, 3 May 2024 11:58:03 +0200 Subject: [PATCH 09/10] grain size to 256 --- source/blender/blenkernel/intern/fcurve.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/blender/blenkernel/intern/fcurve.cc b/source/blender/blenkernel/intern/fcurve.cc index 52e892b3cb6..70ef55b92db 100644 --- a/source/blender/blenkernel/intern/fcurve.cc +++ b/source/blender/blenkernel/intern/fcurve.cc @@ -1264,7 +1264,7 @@ void BKE_fcurve_handles_recalc_ex(FCurve *fcu, eBezTriple_Flag handle_sel_flag) const bool cycle = BKE_fcurve_is_cyclic(fcu) && BEZT_IS_AUTOH(first) && BEZT_IS_AUTOH(last); IndexRange bezt_range(0, fcu->totvert); - threading::parallel_for(bezt_range, 512, [&](const IndexRange range) { + threading::parallel_for(bezt_range, 256, [&](const IndexRange range) { BezTriple tmp; for (const int i : range) { BezTriple *bezt = &fcu->bezt[i]; -- 2.30.2 From 0d0085c76453d39941abd6daf32d6b57e45d45c1 Mon Sep 17 00:00:00 2001 From: Christoph Lendenfeld Date: Fri, 3 May 2024 16:30:57 +0200 Subject: [PATCH 10/10] simplify IndexRange --- source/blender/blenkernel/intern/fcurve.cc | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/source/blender/blenkernel/intern/fcurve.cc b/source/blender/blenkernel/intern/fcurve.cc index 70ef55b92db..a277cbee604 100644 --- a/source/blender/blenkernel/intern/fcurve.cc +++ b/source/blender/blenkernel/intern/fcurve.cc @@ -1263,8 +1263,7 @@ void BKE_fcurve_handles_recalc_ex(FCurve *fcu, eBezTriple_Flag handle_sel_flag) BezTriple *last = &fcu->bezt[fcu->totvert - 1]; const bool cycle = BKE_fcurve_is_cyclic(fcu) && BEZT_IS_AUTOH(first) && BEZT_IS_AUTOH(last); - IndexRange bezt_range(0, fcu->totvert); - threading::parallel_for(bezt_range, 256, [&](const IndexRange range) { + threading::parallel_for(IndexRange(fcu->totvert), 256, [&](const IndexRange range) { BezTriple tmp; for (const int i : range) { BezTriple *bezt = &fcu->bezt[i]; -- 2.30.2