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:
authorAlexander Gavrilov <angavrilov@gmail.com>2019-04-28 15:05:13 +0300
committerAlexander Gavrilov <angavrilov@gmail.com>2019-05-01 16:34:54 +0300
commitdf8e5d66e3f7678af70f5c007bc2b4884978b341 (patch)
treefd4136e34051b138f0b870d8b01e231d6f12ee95 /source/blender/blenkernel/intern/lattice.c
parent4d043b5c17fbdf9c68600f15745f687d6d6b57ef (diff)
Modifiers: support parallelism in Armature and Lattice Deform.
This partially mitigates the performance drop in Spring 02_055_A.anim caused by dependency changes in D4715. Differential Revision: https://developer.blender.org/D4753
Diffstat (limited to 'source/blender/blenkernel/intern/lattice.c')
-rw-r--r--source/blender/blenkernel/intern/lattice.c53
1 files changed, 38 insertions, 15 deletions
diff --git a/source/blender/blenkernel/intern/lattice.c b/source/blender/blenkernel/intern/lattice.c
index c9a0cf50e65..b8178bec52f 100644
--- a/source/blender/blenkernel/intern/lattice.c
+++ b/source/blender/blenkernel/intern/lattice.c
@@ -32,6 +32,7 @@
#include "BLI_listbase.h"
#include "BLI_bitmap.h"
#include "BLI_math.h"
+#include "BLI_task.h"
#include "DNA_mesh_types.h"
#include "DNA_meshdata_types.h"
@@ -878,6 +879,31 @@ void curve_deform_vector(
mul_m4_v3(cd.objectspace, vec);
}
+typedef struct LatticeDeformUserdata {
+ LatticeDeformData *lattice_deform_data;
+ float (*vertexCos)[3];
+ MDeformVert *dvert;
+ int defgrp_index;
+ float fac;
+} LatticeDeformUserdata;
+
+static void lattice_deform_vert_task(void *__restrict userdata,
+ const int index,
+ const ParallelRangeTLS *__restrict UNUSED(tls))
+{
+ const LatticeDeformUserdata *data = userdata;
+
+ if (data->dvert != NULL) {
+ const float weight = defvert_find_weight(data->dvert + index, data->defgrp_index);
+ if (weight > 0.0f) {
+ calc_latt_deform(data->lattice_deform_data, data->vertexCos[index], weight * data->fac);
+ }
+ }
+ else {
+ calc_latt_deform(data->lattice_deform_data, data->vertexCos[index], data->fac);
+ }
+}
+
void lattice_deform_verts(Object *laOb,
Object *target,
Mesh *mesh,
@@ -889,7 +915,6 @@ void lattice_deform_verts(Object *laOb,
LatticeDeformData *lattice_deform_data;
MDeformVert *dvert = NULL;
int defgrp_index = -1;
- int a;
if (laOb->type != OB_LATTICE) {
return;
@@ -916,20 +941,18 @@ void lattice_deform_verts(Object *laOb,
}
}
}
- if (dvert) {
- MDeformVert *dvert_iter;
- for (a = 0, dvert_iter = dvert; a < numVerts; a++, dvert_iter++) {
- const float weight = defvert_find_weight(dvert_iter, defgrp_index);
- if (weight > 0.0f) {
- calc_latt_deform(lattice_deform_data, vertexCos[a], weight * fac);
- }
- }
- }
- else {
- for (a = 0; a < numVerts; a++) {
- calc_latt_deform(lattice_deform_data, vertexCos[a], fac);
- }
- }
+
+ LatticeDeformUserdata data = {.lattice_deform_data = lattice_deform_data,
+ .vertexCos = vertexCos,
+ .dvert = dvert,
+ .defgrp_index = defgrp_index,
+ .fac = fac};
+
+ ParallelRangeSettings settings;
+ BLI_parallel_range_settings_defaults(&settings);
+ settings.min_iter_per_thread = 32;
+ BLI_task_parallel_range(0, numVerts, &data, lattice_deform_vert_task, &settings);
+
end_latt_deform(lattice_deform_data);
}