Math Lib: minor optimization interp_weights_poly

This commit is contained in:
Campbell Barton 2015-08-23 17:07:35 +10:00
parent 58c9a0b11a
commit 0cb23fafe7
1 changed files with 36 additions and 34 deletions

View File

@ -3065,18 +3065,22 @@ void interp_weights_poly_v3(float *w, float v[][3], const int n, const float co[
const float *v_curr, *v_next;
float ht_prev, ht; /* half tangents */
float totweight = 0.0f;
int i = 0;
int i_curr, i_next;
char ix_flag = 0;
struct Float3_Len d_curr, d_next;
v_curr = v[0];
v_next = v[1];
/* loop over 'i_next' */
i_curr = n - 1;
i_next = 0;
DIR_V3_SET(&d_curr, v[n - 1], co);
DIR_V3_SET(&d_next, v_curr, co);
v_curr = v[i_curr];
v_next = v[i_next];
DIR_V3_SET(&d_curr, v_curr - 3 /* v[n - 2] */, co);
DIR_V3_SET(&d_next, v_curr /* v[n - 1] */, co);
ht_prev = mean_value_half_tan_v3(&d_curr, &d_next);
while (i < n) {
while (i_next < n) {
/* Mark Mayer et al algorithm that is used here does not operate well if vertex is close
* to borders of face. In that case, do simple linear interpolation between the two edge vertices */
@ -3093,22 +3097,19 @@ void interp_weights_poly_v3(float *w, float v[][3], const int n, const float co[
d_curr = d_next;
DIR_V3_SET(&d_next, v_next, co);
ht = mean_value_half_tan_v3(&d_curr, &d_next);
w[i] = (ht_prev + ht) / d_curr.len;
totweight += w[i];
w[i_curr] = (ht_prev + ht) / d_curr.len;
totweight += w[i_curr];
/* step */
i++;
i_curr = i_next++;
v_curr = v_next;
v_next = v[(i + 1) % n];
v_next = v[i_next];
ht_prev = ht;
}
if (ix_flag) {
const int i_curr = i;
for (i = 0; i < n; i++) {
w[i] = 0.0f;
}
memset(w, 0, sizeof(*w) * (size_t)n);
if (ix_flag & IS_POINT_IX) {
w[i_curr] = 1.0f;
@ -3117,13 +3118,13 @@ void interp_weights_poly_v3(float *w, float v[][3], const int n, const float co[
float fac = line_point_factor_v3(co, v_curr, v_next);
CLAMP(fac, 0.0f, 1.0f);
w[i_curr] = 1.0f - fac;
w[(i_curr + 1) % n] = fac;
w[i_next] = fac;
}
}
else {
if (totweight != 0.0f) {
for (i = 0; i < n; i++) {
w[i] /= totweight;
for (i_curr = 0; i_curr < n; i_curr++) {
w[i_curr] /= totweight;
}
}
}
@ -3137,18 +3138,22 @@ void interp_weights_poly_v2(float *w, float v[][2], const int n, const float co[
const float *v_curr, *v_next;
float ht_prev, ht; /* half tangents */
float totweight = 0.0f;
int i = 0;
int i_curr, i_next;
char ix_flag = 0;
struct Float2_Len d_curr, d_next;
v_curr = v[0];
v_next = v[1];
/* loop over 'i_next' */
i_curr = n - 1;
i_next = 0;
DIR_V2_SET(&d_curr, v[n - 1], co);
DIR_V2_SET(&d_next, v_curr, co);
v_curr = v[i_curr];
v_next = v[i_next];
DIR_V2_SET(&d_curr, v_curr - 2 /* v[n - 2] */, co);
DIR_V2_SET(&d_next, v_curr /* v[n - 1] */, co);
ht_prev = mean_value_half_tan_v2(&d_curr, &d_next);
while (i < n) {
while (i_next < n) {
/* Mark Mayer et al algorithm that is used here does not operate well if vertex is close
* to borders of face. In that case, do simple linear interpolation between the two edge vertices */
@ -3165,22 +3170,19 @@ void interp_weights_poly_v2(float *w, float v[][2], const int n, const float co[
d_curr = d_next;
DIR_V2_SET(&d_next, v_next, co);
ht = mean_value_half_tan_v2(&d_curr, &d_next);
w[i] = (ht_prev + ht) / d_curr.len;
totweight += w[i];
w[i_curr] = (ht_prev + ht) / d_curr.len;
totweight += w[i_curr];
/* step */
i++;
i_curr = i_next++;
v_curr = v_next;
v_next = v[(i + 1) % n];
v_next = v[i_next];
ht_prev = ht;
}
if (ix_flag) {
const int i_curr = i;
for (i = 0; i < n; i++) {
w[i] = 0.0f;
}
memset(w, 0, sizeof(*w) * (size_t)n);
if (ix_flag & IS_POINT_IX) {
w[i_curr] = 1.0f;
@ -3189,13 +3191,13 @@ void interp_weights_poly_v2(float *w, float v[][2], const int n, const float co[
float fac = line_point_factor_v2(co, v_curr, v_next);
CLAMP(fac, 0.0f, 1.0f);
w[i_curr] = 1.0f - fac;
w[(i_curr + 1) % n] = fac;
w[i_next] = fac;
}
}
else {
if (totweight != 0.0f) {
for (i = 0; i < n; i++) {
w[i] /= totweight;
for (i_curr = 0; i_curr < n; i_curr++) {
w[i_curr] /= totweight;
}
}
}