[Bf-blender-cvs] [b90321c] temp-modifier-deltamush-experimental: Minor optimizations to smooth_iter,
Campbell Barton
noreply at git.blender.org
Sat Mar 28 22:38:30 CET 2015
Commit: b90321c7cbf696e778354d3769aef72d967af306
Author: Campbell Barton
Date: Sun Mar 29 08:07:59 2015 +1100
Branches: temp-modifier-deltamush-experimental
https://developer.blender.org/rBb90321c7cbf696e778354d3769aef72d967af306
Minor optimizations to smooth_iter,
Use fast-path, for simple case (no weights, no boundaries), approx 6% 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 04f5f95..951059d 100644
--- a/source/blender/modifiers/intern/MOD_deltamush.c
+++ b/source/blender/modifiers/intern/MOD_deltamush.c
@@ -187,6 +187,8 @@ static void smooth_iter(
{
const unsigned int numEdges = (unsigned int)dm->getNumEdges(dm);
const MEdge *edges = dm->getEdgeArray(dm);
+ const float lambda = dmmd->lambda;
+ const float eps = FLT_EPSILON * 10.0f;
unsigned int i;
for (i = 0; i < numEdges; i++) {
@@ -210,23 +212,40 @@ static void smooth_iter(
sd->edge_count += 1.0f;
}
- for (i = 0; i < numVerts; i++) {
- 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];
- }
- if (boundaries) {
- w = w * (boundaries[i] != 0 ? 0.0f : 1.0f);
+ if ((dmmd->smooth_weights == NULL) && (boundaries == NULL)) {
+ /* fast-path */
+ for (i = 0; i < numVerts; i++) {
+ SmoothingData *sd = &smooth_data[i];
+ float div = sd->edge_lengths * sd->edge_count;
+ if (div > eps) {
+ madd_v3_v3fl(vertexCos[i], sd->delta, lambda / div);
}
- 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));
}
+ }
+ else {
+
+ for (i = 0; i < numVerts; i++) {
+ SmoothingData *sd = &smooth_data[i];
+ float div = sd->edge_lengths * sd->edge_count;
+
+ if (div > eps) {
+ float lambda_alt = lambda;
- /* zero for the next iteration (saves memset on entire array) */
- memset(sd, 0, sizeof(*sd));
+ if (dmmd->smooth_weights) {
+ lambda_alt *= dmmd->smooth_weights[i];
+ }
+
+ if (boundaries) {
+ lambda_alt *= (boundaries[i] != 0 ? 0.0f : 1.0f);
+ }
+
+ madd_v3_v3fl(vertexCos[i], sd->delta, lambda_alt / div);
+ }
+
+ memset(sd, 0, sizeof(*sd));
+ }
}
}
More information about the Bf-blender-cvs
mailing list