Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCampbell Barton <ideasman42@gmail.com>2021-06-29 09:18:26 +0300
committerCampbell Barton <ideasman42@gmail.com>2021-06-30 09:53:55 +0300
commit2d4ec90497443dc28e342c539e65010c7f4a04bb (patch)
tree62d29a8c932d8b94f43fddf818c581432fb287a2 /source/blender/editors/transform/transform_mode_skin_resize.c
parent501d2443d03cce18985fab3ffad5d23238748f3e (diff)
Transform: support multi-threading for most modes
Multi-threading support for transform modes: bevel-weight, crease, push-pull, rotate, shear, shrink-fatten, skin-resize, to-sphere, trackball & translate. This is done using a parallel loop over transform data. From testing a 1.5million polygon mesh on a 32 core system the overall performance gains were between ~20-28% To ensure the code is thread-safe arguments to shared data are const. Reviewed By: mano-wii
Diffstat (limited to 'source/blender/editors/transform/transform_mode_skin_resize.c')
-rw-r--r--source/blender/editors/transform/transform_mode_skin_resize.c92
1 files changed, 70 insertions, 22 deletions
diff --git a/source/blender/editors/transform/transform_mode_skin_resize.c b/source/blender/editors/transform/transform_mode_skin_resize.c
index 75ad83b0787..45336602c5a 100644
--- a/source/blender/editors/transform/transform_mode_skin_resize.c
+++ b/source/blender/editors/transform/transform_mode_skin_resize.c
@@ -24,6 +24,7 @@
#include <stdlib.h>
#include "BLI_math.h"
+#include "BLI_task.h"
#include "BKE_context.h"
#include "BKE_unit.h"
@@ -38,6 +39,58 @@
#include "transform_snap.h"
/* -------------------------------------------------------------------- */
+/** \name Transform (Skin) Element
+ * \{ */
+
+/**
+ * \note Small arrays / data-structures should be stored copied for faster memory access.
+ */
+struct TransDataArgs_SkinResize {
+ const TransInfo *t;
+ const TransDataContainer *tc;
+ float mat[3][3];
+};
+
+static void transdata_elem_skin_resize(const TransInfo *t,
+ const TransDataContainer *UNUSED(tc),
+ TransData *td,
+ const float mat[3][3])
+{
+ float tmat[3][3], smat[3][3];
+ float fsize[3];
+
+ if (t->flag & T_EDIT) {
+ mul_m3_m3m3(smat, mat, td->mtx);
+ mul_m3_m3m3(tmat, td->smtx, smat);
+ }
+ else {
+ copy_m3_m3(tmat, mat);
+ }
+
+ if (t->con.applySize) {
+ t->con.applySize(t, NULL, NULL, tmat);
+ }
+
+ mat3_to_size(fsize, tmat);
+ td->loc[0] = td->iloc[0] * (1 + (fsize[0] - 1) * td->factor);
+ td->loc[1] = td->iloc[1] * (1 + (fsize[1] - 1) * td->factor);
+}
+
+static void transdata_elem_skin_resize_fn(void *__restrict iter_data_v,
+ const int iter,
+ const TaskParallelTLS *__restrict UNUSED(tls))
+{
+ struct TransDataArgs_SkinResize *data = iter_data_v;
+ TransData *td = &data->tc->data[iter];
+ if (td->flag & TD_SKIP) {
+ return;
+ }
+ transdata_elem_skin_resize(data->t, data->tc, td, data->mat);
+}
+
+/** \} */
+
+/* -------------------------------------------------------------------- */
/** \name Transform (Skin)
* \{ */
@@ -67,29 +120,24 @@ static void applySkinResize(TransInfo *t, const int UNUSED(mval[2]))
headerResize(t, t->values_final, str, sizeof(str));
FOREACH_TRANS_DATA_CONTAINER (t, tc) {
- TransData *td = tc->data;
- for (i = 0; i < tc->data_len; i++, td++) {
- float tmat[3][3], smat[3][3];
- float fsize[3];
- if (td->flag & TD_SKIP) {
- continue;
+ if (tc->data_len < TRANSDATA_THREAD_LIMIT) {
+ TransData *td = tc->data;
+ for (i = 0; i < tc->data_len; i++, td++) {
+ if (td->flag & TD_SKIP) {
+ continue;
+ }
+ transdata_elem_skin_resize(t, tc, td, mat);
}
-
- if (t->flag & T_EDIT) {
- mul_m3_m3m3(smat, mat, td->mtx);
- mul_m3_m3m3(tmat, td->smtx, smat);
- }
- else {
- copy_m3_m3(tmat, mat);
- }
-
- if (t->con.applySize) {
- t->con.applySize(t, NULL, NULL, tmat);
- }
-
- mat3_to_size(fsize, tmat);
- td->loc[0] = td->iloc[0] * (1 + (fsize[0] - 1) * td->factor);
- td->loc[1] = td->iloc[1] * (1 + (fsize[1] - 1) * td->factor);
+ }
+ else {
+ struct TransDataArgs_SkinResize data = {
+ .t = t,
+ .tc = tc,
+ };
+ copy_m3_m3(data.mat, mat);
+ TaskParallelSettings settings;
+ BLI_parallel_range_settings_defaults(&settings);
+ BLI_task_parallel_range(0, tc->data_len, &data, transdata_elem_skin_resize_fn, &settings);
}
}