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>2021-01-07 20:31:06 +0300
committerAlexander Gavrilov <angavrilov@gmail.com>2021-01-08 12:24:50 +0300
commit662b7c3edfcd64ca59a6ba2999eac583fc14cbaa (patch)
tree0eafaf6f4354731cdc9b193ae522ffc7e9e46bf7 /source/blender/modifiers
parentceaed47bf9a31acdce8cd8bdd436c55c74605b27 (diff)
Surface Deform: optimize memory allocation in the evaluation code.
Using malloc to allocate a temporary array for each vertex, which most commonly contains just 4 elements, is not efficient. Checking the mode with a switch is also better. Differential Revision: https://developer.blender.org/D10040
Diffstat (limited to 'source/blender/modifiers')
-rw-r--r--source/blender/modifiers/intern/MOD_surfacedeform.c39
1 files changed, 28 insertions, 11 deletions
diff --git a/source/blender/modifiers/intern/MOD_surfacedeform.c b/source/blender/modifiers/intern/MOD_surfacedeform.c
index 64fad1b370b..5eed2964e70 100644
--- a/source/blender/modifiers/intern/MOD_surfacedeform.c
+++ b/source/blender/modifiers/intern/MOD_surfacedeform.c
@@ -20,6 +20,7 @@
* \ingroup modifiers
*/
+#include "BLI_alloca.h"
#include "BLI_math.h"
#include "BLI_math_geom.h"
#include "BLI_task.h"
@@ -1218,7 +1219,16 @@ static void deformVert(void *__restrict userdata,
for (int j = 0; j < num_binds; j++) {
max_verts = MAX2(max_verts, sdbind[j].numverts);
}
- float(*coords_buffer)[3] = MEM_malloc_arrayN(max_verts, sizeof(*coords_buffer), __func__);
+
+ const bool big_buffer = max_verts > 256;
+ float(*coords_buffer)[3];
+
+ if (UNLIKELY(big_buffer)) {
+ coords_buffer = MEM_malloc_arrayN(max_verts, sizeof(*coords_buffer), __func__);
+ }
+ else {
+ coords_buffer = BLI_array_alloca(coords_buffer, max_verts);
+ }
for (int j = 0; j < num_binds; j++, sdbind++) {
for (int k = 0; k < sdbind->numverts; k++) {
@@ -1228,28 +1238,32 @@ static void deformVert(void *__restrict userdata,
normal_poly_v3(norm, coords_buffer, sdbind->numverts);
zero_v3(temp);
- /* ---------- looptri mode ---------- */
- if (sdbind->mode == MOD_SDEF_MODE_LOOPTRI) {
- madd_v3_v3fl(temp, data->targetCos[sdbind->vert_inds[0]], sdbind->vert_weights[0]);
- madd_v3_v3fl(temp, data->targetCos[sdbind->vert_inds[1]], sdbind->vert_weights[1]);
- madd_v3_v3fl(temp, data->targetCos[sdbind->vert_inds[2]], sdbind->vert_weights[2]);
- }
- else {
+ switch (sdbind->mode) {
+ /* ---------- looptri mode ---------- */
+ case MOD_SDEF_MODE_LOOPTRI: {
+ madd_v3_v3fl(temp, data->targetCos[sdbind->vert_inds[0]], sdbind->vert_weights[0]);
+ madd_v3_v3fl(temp, data->targetCos[sdbind->vert_inds[1]], sdbind->vert_weights[1]);
+ madd_v3_v3fl(temp, data->targetCos[sdbind->vert_inds[2]], sdbind->vert_weights[2]);
+ break;
+ }
+
/* ---------- ngon mode ---------- */
- if (sdbind->mode == MOD_SDEF_MODE_NGON) {
+ case MOD_SDEF_MODE_NGON: {
for (int k = 0; k < sdbind->numverts; k++) {
madd_v3_v3fl(temp, coords_buffer[k], sdbind->vert_weights[k]);
}
+ break;
}
/* ---------- centroid mode ---------- */
- else if (sdbind->mode == MOD_SDEF_MODE_CENTROID) {
+ case MOD_SDEF_MODE_CENTROID: {
float cent[3];
mid_v3_v3_array(cent, coords_buffer, sdbind->numverts);
madd_v3_v3fl(temp, data->targetCos[sdbind->vert_inds[0]], sdbind->vert_weights[0]);
madd_v3_v3fl(temp, data->targetCos[sdbind->vert_inds[1]], sdbind->vert_weights[1]);
madd_v3_v3fl(temp, cent, sdbind->vert_weights[2]);
+ break;
}
}
@@ -1263,7 +1277,10 @@ static void deformVert(void *__restrict userdata,
/* Add the offset to start coord multiplied by the strength and weight values. */
madd_v3_v3fl(vertexCos, offset, data->strength * weight);
- MEM_freeN(coords_buffer);
+
+ if (UNLIKELY(big_buffer)) {
+ MEM_freeN(coords_buffer);
+ }
}
static void surfacedeformModifier_do(ModifierData *md,