[Bf-blender-cvs] [46821f072d] surface-deform-modifier: Review: Join allocations and some bpoly refactor
Luca Rood
noreply at git.blender.org
Wed Jan 25 07:08:12 CET 2017
Commit: 46821f072d042a955acdf5e33619b946535b3392
Author: Luca Rood
Date: Wed Jan 25 02:28:32 2017 -0200
Branches: surface-deform-modifier
https://developer.blender.org/rB46821f072d042a955acdf5e33619b946535b3392
Review: Join allocations and some bpoly refactor
===================================================================
M source/blender/modifiers/intern/MOD_surfacedeform.c
===================================================================
diff --git a/source/blender/modifiers/intern/MOD_surfacedeform.c b/source/blender/modifiers/intern/MOD_surfacedeform.c
index 344b834df2..dd062c0623 100644
--- a/source/blender/modifiers/intern/MOD_surfacedeform.c
+++ b/source/blender/modifiers/intern/MOD_surfacedeform.c
@@ -42,7 +42,6 @@ typedef struct SDefBindCalcData {
} SDefBindCalcData;
typedef struct SDefBindPoly {
- struct SDefBindPoly *next;
float (*coords)[3];
float (*coords_v2)[2];
float point_v2[2];
@@ -72,6 +71,7 @@ typedef struct SDefBindPoly {
typedef struct SDefBindWeightData {
SDefBindPoly *bind_polys;
+ unsigned int numpoly;
unsigned int numbinds;
} SDefBindWeightData;
@@ -328,15 +328,15 @@ BLI_INLINE int isPolyValid(const float coords[][2], const unsigned int nr)
static void freeBindData(SDefBindWeightData * const bwdata)
{
- SDefBindPoly *bpoly;
-
- for (bpoly = bwdata->bind_polys; bpoly; bpoly = bwdata->bind_polys) {
- bwdata->bind_polys = bpoly->next;
+ SDefBindPoly *bpoly = bwdata->bind_polys;
- MEM_SAFE_FREE(bpoly->coords);
- MEM_SAFE_FREE(bpoly->coords_v2);
+ if (bwdata->bind_polys) {
+ for (int i = 0; i < bwdata->numpoly; bpoly++, i++) {
+ MEM_SAFE_FREE(bpoly->coords);
+ MEM_SAFE_FREE(bpoly->coords_v2);
+ }
- MEM_freeN(bpoly);
+ MEM_freeN(bwdata->bind_polys);
}
MEM_freeN(bwdata);
@@ -359,7 +359,6 @@ BLI_INLINE SDefBindWeightData *computeBindWeights(SDefBindCalcData * const data,
float avg_point_dist = 0.0f;
float tot_weight = 0.0f;
int inf_weight_flags = 0;
- unsigned int numpoly = 0;
bwdata = MEM_callocN(sizeof(*bwdata), "SDefBindWeightData");
if (bwdata == NULL) {
@@ -367,39 +366,47 @@ BLI_INLINE SDefBindWeightData *computeBindWeights(SDefBindCalcData * const data,
return NULL;
}
+ for (vedge = vert_edges; vedge; vedge = vedge->next) {
+ bwdata->numpoly += edge_polys[vedge->index].num;
+ }
+
+ bwdata->numpoly /= 2;
+
+ bpoly = MEM_callocN(sizeof(*bpoly) * bwdata->numpoly, "SDefBindPoly");
+ if (bpoly == NULL) {
+ freeBindData(bwdata);
+ data->success = MOD_SDEF_BIND_RESULT_MEM_ERR;
+ return NULL;
+ }
+
+ bwdata->bind_polys = bpoly;
+
/* Loop over all adjacent edges, and build the SDefBindPoly data for each poly adjacent to those */
for (vedge = vert_edges; vedge; vedge = vedge->next) {
unsigned int edge_ind = vedge->index;
for (int i = 0; i < edge_polys[edge_ind].num; i++) {
- for (bpoly = bwdata->bind_polys; bpoly; bpoly = bpoly->next) {
- if (bpoly->index == edge_polys[edge_ind].polys[i]) {
- break;
+ {
+ bpoly = bwdata->bind_polys;
+
+ for (int j = 0; j < bwdata->numpoly; bpoly++, j++) {
+ /* If coords isn't allocated, we have reached the first uninitialized bpoly */
+ if ((bpoly->index == edge_polys[edge_ind].polys[i]) || (!bpoly->coords)) {
+ break;
+ }
}
}
/* Check if poly was already created by another edge or still has to be initialized */
- if (!bpoly || bpoly->index != edge_polys[edge_ind].polys[i]) {
+ if (!bpoly->coords) {
float angle;
float axis[3];
float tmp_vec_v2[2];
int is_poly_valid;
- /* SDefBindPoly initialization */
- bpoly = MEM_mallocN(sizeof(*bpoly), "SDefBindPoly");
- if (bpoly == NULL) {
- freeBindData(bwdata);
- data->success = MOD_SDEF_BIND_RESULT_MEM_ERR;
- return NULL;
- }
-
- bpoly->next = bwdata->bind_polys;
bpoly->index = edge_polys[edge_ind].polys[i];
bpoly->coords = NULL;
bpoly->coords_v2 = NULL;
- bwdata->bind_polys = bpoly;
-
- numpoly++;
/* Copy poly data */
poly = &data->mpoly[bpoly->index];
@@ -518,7 +525,7 @@ BLI_INLINE SDefBindWeightData *computeBindWeights(SDefBindCalcData * const data,
}
}
- avg_point_dist /= numpoly;
+ avg_point_dist /= bwdata->numpoly;
/* If weights 1 and 2 are not infinite, loop over all adjacent edges again,
* and build adjacency dependent angle data (depends on all polygons having been computed) */
@@ -529,24 +536,25 @@ BLI_INLINE SDefBindWeightData *computeBindWeights(SDefBindCalcData * const data,
float tmp1, tmp2;
unsigned int edge_ind = vedge->index;
unsigned int edge_on_poly[2];
- int i;
epolys = &edge_polys[edge_ind];
/* Find bind polys corresponding to the edge's adjacent polys */
- for (bpoly = bwdata->bind_polys, i = 0; bpoly && i < epolys->num; bpoly = bpoly->next)
+ bpoly = bwdata->bind_polys;
+
+ for (int i = 0, j = 0; (i < bwdata->numpoly) && (j < epolys->num); bpoly++, i++)
{
if (ELEM(bpoly->index, epolys->polys[0], epolys->polys[1])) {
- bpolys[i] = bpoly;
+ bpolys[j] = bpoly;
if (bpoly->edge_inds[0] == edge_ind) {
- edge_on_poly[i] = 0;
+ edge_on_poly[j] = 0;
}
else {
- edge_on_poly[i] = 1;
+ edge_on_poly[j] = 1;
}
- i++;
+ j++;
}
}
@@ -581,7 +589,9 @@ BLI_INLINE SDefBindWeightData *computeBindWeights(SDefBindCalcData * const data,
* scale only unprojected weight if projected weight is infinite,
* scale none if both are infinite. */
if (!inf_weight_flags) {
- for (bpoly = bwdata->bind_polys; bpoly; bpoly = bpoly->next) {
+ bpoly = bwdata->bind_polys;
+
+ for (int i = 0; i < bwdata->numpoly; bpoly++, i++) {
float tmp1 = bpoly->point_edgemid_angles[0] / bpoly->corner_edgemid_angles[0];
float tmp2 = bpoly->point_edgemid_angles[1] / bpoly->corner_edgemid_angles[1];
float scale_weight, sqr, inv_sqr;
@@ -639,7 +649,9 @@ BLI_INLINE SDefBindWeightData *computeBindWeights(SDefBindCalcData * const data,
}
}
else if (!(inf_weight_flags & (1 << 2))) {
- for (bpoly = bwdata->bind_polys; bpoly; bpoly = bpoly->next) {
+ bpoly = bwdata->bind_polys;
+
+ for (int i = 0; i < bwdata->numpoly; bpoly++, i++) {
/* Scale the point distance weight by average point distance, and introduce falloff */
bpoly->weight_dist /= avg_point_dist;
bpoly->weight_dist = powf(bpoly->weight_dist, data->falloff);
@@ -652,7 +664,9 @@ BLI_INLINE SDefBindWeightData *computeBindWeights(SDefBindCalcData * const data,
}
/* Final loop, to compute actual weights */
- for (bpoly = bwdata->bind_polys; bpoly; bpoly = bpoly->next) {
+ bpoly = bwdata->bind_polys;
+
+ for (int i = 0; i < bwdata->numpoly; bpoly++, i++) {
/* Weight computation from components */
if (inf_weight_flags & 1 << 2) {
bpoly->weight = bpoly->weight_dist < FLT_EPSILON ? 1.0f : 0.0f;
@@ -674,7 +688,9 @@ BLI_INLINE SDefBindWeightData *computeBindWeights(SDefBindCalcData * const data,
tot_weight += bpoly->weight;
}
- for (bpoly = bwdata->bind_polys; bpoly; bpoly = bpoly->next) {
+ bpoly = bwdata->bind_polys;
+
+ for (int i = 0; i < bwdata->numpoly; bpoly++, i++) {
bpoly->weight /= tot_weight;
/* Evaluate if this poly is relevant to bind */
@@ -751,7 +767,9 @@ static void bindVert(void *userdata, void *UNUSED(userdata_chunk), const int ind
sdbind = sdvert->binds;
- for (bpoly = bwdata->bind_polys; bpoly; bpoly = bpoly->next) {
+ bpoly = bwdata->bind_polys;
+
+ for (int i = 0; i < bwdata->numbinds; bpoly++) {
if (bpoly->weight >= FLT_EPSILON) {
if (bpoly->inside) {
const MLoop *loop = &data->mloop[bpoly->loopstart];
@@ -776,14 +794,15 @@ static void bindVert(void *userdata, void *UNUSED(userdata_chunk), const int ind
/* Reproject vert based on weights and original poly verts, to reintroduce poly non-planarity */
zero_v3(point_co_proj);
- for (int i = 0; i < bpoly->numverts; i++, loop++) {
- madd_v3_v3fl(point_co_proj, bpoly->coords[i], sdbind->vert_weights[i]);
- sdbind->vert_inds[i] = loop->v;
+ for (int j = 0; j < bpoly->numverts; j++, loop++) {
+ madd_v3_v3fl(point_co_proj, bpoly->coords[j], sdbind->vert_weights[j]);
+ sdbind->vert_inds[j] = loop->v;
}
sdbind->normal_dist = computeNormalDisplacement(point_co, point_co_proj, bpoly->normal);
sdbind++;
+ i++;
}
else {
float tmp_vec[3];
@@ -830,6 +849,7 @@ static void bindVert(void *userdata, void *UNUSED(userdata_chunk), const int ind
sdbind->normal_dist = computeNormalDisplacement(point_co, point_co_proj, bpoly->normal);
sdbind++;
+ i++;
}
if (bpoly->dominant_angle_weight >= FLT_EPSILON) {
@@ -871,6 +891,7 @@ static void bindVert(void *userdata, void *UNUSED(userdata_chunk), const int ind
sdbind->normal_dist = computeNormalDisplacement(point_co, point_co_proj, bpoly->normal);
sdbind++;
+ i++;
}
}
}
More information about the Bf-blender-cvs
mailing list