[Bf-blender-cvs] [ae27af8] temp-modifier-deltamush-experimental: Minor edits to smooth-data iteration
Campbell Barton
noreply at git.blender.org
Sat Mar 28 21:10:27 CET 2015
Commit: ae27af878038d982f96d11d8fc035a1486737151
Author: Campbell Barton
Date: Sun Mar 29 07:09:27 2015 +1100
Branches: temp-modifier-deltamush-experimental
https://developer.blender.org/rBae27af878038d982f96d11d8fc035a1486737151
Minor edits to smooth-data iteration
Simple changes to array handling gives approx 15% speedup
===================================================================
M source/blender/modifiers/intern/MOD_deltamush.c
===================================================================
diff --git a/source/blender/modifiers/intern/MOD_deltamush.c b/source/blender/modifiers/intern/MOD_deltamush.c
index 710064e..b4f7668 100644
--- a/source/blender/modifiers/intern/MOD_deltamush.c
+++ b/source/blender/modifiers/intern/MOD_deltamush.c
@@ -181,32 +181,39 @@ typedef struct SmoothingData {
static void smooth_iter(
- DeltaMushModifierData *dmmd, DerivedMesh *dm, float(*vertexCos)[3], unsigned int numVerts,
- short *boundaries, SmoothingData *smooth_data)
+ DeltaMushModifierData *dmmd, DerivedMesh *dm,
+ float(*vertexCos)[3], unsigned int numVerts,
+ const short *boundaries, SmoothingData *smooth_data)
{
const unsigned int numEdges = (unsigned int)dm->getNumEdges(dm);
const MEdge *edges = dm->getEdgeArray(dm);
unsigned int i;
for (i = 0; i < numEdges; i++) {
+ SmoothingData *sd;
float edge_dir[3];
- float dist;
+ float edge_dist;
sub_v3_v3v3(edge_dir, vertexCos[edges[i].v2], vertexCos[edges[i].v1]);
- dist = len_v3(edge_dir);
+ edge_dist = len_v3(edge_dir);
+
+ mul_v3_fl(edge_dir, edge_dist);
- mul_v3_fl(edge_dir, dist);
- add_v3_v3(smooth_data[edges[i].v1].delta, edge_dir);
- smooth_data[edges[i].v1].edge_lengths += dist;
- smooth_data[edges[i].v1].edge_count += 1.0f;
+ sd = &smooth_data[edges[i].v1];
+ add_v3_v3(sd->delta, edge_dir);
+ sd->edge_lengths += edge_dist;
+ sd->edge_count += 1.0f;
- sub_v3_v3(smooth_data[edges[i].v2].delta, edge_dir);
- smooth_data[edges[i].v2].edge_lengths += dist;
- smooth_data[edges[i].v2].edge_count += 1.0f;
+ sd = &smooth_data[edges[i].v2];
+ sub_v3_v3(sd->delta, edge_dir);
+ sd->edge_lengths += edge_dist;
+ sd->edge_count += 1.0f;
}
for (i = 0; i < numVerts; i++) {
- if (smooth_data[i].edge_lengths * smooth_data[i].edge_count > FLT_EPSILON * 10.0f) {
+ SmoothingData *sd = &smooth_data[i];
+
+ if (sd->edge_lengths * sd->edge_count > FLT_EPSILON * 10.0f) {
float w = 1.0f;
if (dmmd->smooth_weights) {
w = dmmd->smooth_weights[i];
@@ -214,10 +221,12 @@ static void smooth_iter(
if (boundaries) {
w = w * (boundaries[i] != 0 ? 0.0f : 1.0f);
}
- mul_v3_fl(smooth_data[i].delta, w * dmmd->lambda /
- (smooth_data[i].edge_lengths * smooth_data[i].edge_count));
- add_v3_v3(vertexCos[i], smooth_data[i].delta);
+ mul_v3_fl(sd->delta, (w * dmmd->lambda) / (sd->edge_lengths * sd->edge_count));
+ add_v3_v3(vertexCos[i], sd->delta);
}
+
+ /* zero for the next iteration (saves memset on entire array) */
+ memset(sd, 0, sizeof(*sd));
}
}
@@ -235,9 +244,9 @@ static void smooth_verts(
find_boundaries(derivedData, boundaries);
}
- smooth_data = MEM_mallocN((size_t)numVerts * sizeof(SmoothingData), "delta mush smoothing data");
+ smooth_data = MEM_callocN((size_t)numVerts * sizeof(SmoothingData), "delta mush smoothing data");
for (i = 0; i < dmmd->repeat; i++) {
- memset(smooth_data, 0, (size_t)numVerts * sizeof(SmoothingData));
+ /* no need to memset each time, 'smooth_iter' cleans up after its self */
smooth_iter(dmmd, derivedData, vertexCos, numVerts, boundaries, smooth_data);
}
MEM_freeN(smooth_data);
@@ -266,8 +275,8 @@ static void calc_loop_axis(
add_v3_v3v3(r_tspace[1], v_prev, v_next);
if (compare_v3v3(v_prev, v_next, FLT_EPSILON * 10.0f) == false) {
+ const float weight = fabsf(acosf(dot_v3v3(v_next, v_prev)));
float nor[3];
- float weight = fabsf(acosf(dot_v3v3(v_next, v_prev)));
cross_v3_v3v3(nor, v_prev, v_next);
normalize_v3(nor);
More information about the Bf-blender-cvs
mailing list