[Bf-blender-cvs] [96d66c7e4d] surface-deform-modifier: Review: Optimize numpoly calculation

Luca Rood noreply at git.blender.org
Wed Jan 25 07:08:14 CET 2017


Commit: 96d66c7e4dd996cf59936b6954b93aab3cbf3e81
Author: Luca Rood
Date:   Wed Jan 25 02:56:25 2017 -0200
Branches: surface-deform-modifier
https://developer.blender.org/rB96d66c7e4dd996cf59936b6954b93aab3cbf3e81

Review: Optimize numpoly calculation

===================================================================

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 dd062c0623..898888a475 100644
--- a/source/blender/modifiers/intern/MOD_surfacedeform.c
+++ b/source/blender/modifiers/intern/MOD_surfacedeform.c
@@ -22,13 +22,18 @@ typedef struct SDefAdjacency {
 	unsigned int index;
 } SDefAdjacency;
 
+typedef struct SDefAdjacencyArray {
+	SDefAdjacency *first;
+	unsigned int num; /* Careful, this is twice the number of polygons (avoids an extra loop) */
+} SDefAdjacencyArray;
+
 typedef struct SDefEdgePolys {
 	unsigned int polys[2], num;
 } SDefEdgePolys;
 
 typedef struct SDefBindCalcData {
 	BVHTreeFromMesh * const treeData;
-	const SDefAdjacency ** const vert_edges;
+	const SDefAdjacencyArray * const vert_edges;
 	const SDefEdgePolys * const edge_polys;
 	SDefVert * const bind_verts;
 	const MLoopTri * const looptri;
@@ -177,7 +182,7 @@ static void updateDepsgraph(ModifierData *md,
 	}
 }
 
-static void freeAdjacencyMap(SDefAdjacency ** const vert_edges, SDefAdjacency * const adj_ref, SDefEdgePolys * const edge_polys)
+static void freeAdjacencyMap(SDefAdjacencyArray * const vert_edges, SDefAdjacency * const adj_ref, SDefEdgePolys * const edge_polys)
 {
 	MEM_freeN(edge_polys);
 
@@ -187,7 +192,7 @@ static void freeAdjacencyMap(SDefAdjacency ** const vert_edges, SDefAdjacency *
 }
 
 static int buildAdjacencyMap(const MPoly *poly, const MEdge *edge, const MLoop * const mloop, const unsigned int numpoly, const unsigned int numedges,
-                              SDefAdjacency ** const vert_edges, SDefAdjacency *adj, SDefEdgePolys * const edge_polys)
+                              SDefAdjacencyArray * const vert_edges, SDefAdjacency *adj, SDefEdgePolys * const edge_polys)
 {
 	const MLoop *loop;
 
@@ -213,14 +218,16 @@ static int buildAdjacencyMap(const MPoly *poly, const MEdge *edge, const MLoop *
 
 	/* Find edges adjacent to vertices */
 	for (int i = 0; i < numedges; i++, edge++) {
-		adj->next = vert_edges[edge->v1];
+		adj->next = vert_edges[edge->v1].first;
 		adj->index = i;
-		vert_edges[edge->v1] = adj;
+		vert_edges[edge->v1].first = adj;
+		vert_edges[edge->v1].num += edge_polys[i].num;
 		adj++;
 
-		adj->next = vert_edges[edge->v2];
+		adj->next = vert_edges[edge->v2].first;
 		adj->index = i;
-		vert_edges[edge->v2] = adj;
+		vert_edges[edge->v2].first = adj;
+		vert_edges[edge->v2].num += edge_polys[i].num;
 		adj++;
 	}
 
@@ -345,7 +352,7 @@ static void freeBindData(SDefBindWeightData * const bwdata)
 BLI_INLINE SDefBindWeightData *computeBindWeights(SDefBindCalcData * const data, const float point_co[3])
 {
 	const unsigned int nearest = nearestVert(data, point_co);
-	const SDefAdjacency * const vert_edges = data->vert_edges[nearest];
+	const SDefAdjacency * const vert_edges = data->vert_edges[nearest].first;
 	const SDefEdgePolys * const edge_polys = data->edge_polys;
 
 	const SDefAdjacency *vedge;
@@ -366,11 +373,7 @@ 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;
+	bwdata->numpoly = data->vert_edges[nearest].num / 2;
 
 	bpoly = MEM_callocN(sizeof(*bpoly) * bwdata->numpoly, "SDefBindPoly");
 	if (bpoly == NULL) {
@@ -910,7 +913,7 @@ static bool surfacedeformBind(SurfaceDeformModifierData *smd, float (*vertexCos)
 	unsigned int tnumedges = tdm->getNumEdges(tdm);
 	unsigned int tnumverts = tdm->getNumVerts(tdm);
 	int adj_result;
-	SDefAdjacency **vert_edges;
+	SDefAdjacencyArray *vert_edges;
 	SDefAdjacency *adj_array;
 	SDefEdgePolys *edge_polys;
 
@@ -966,7 +969,7 @@ static bool surfacedeformBind(SurfaceDeformModifierData *smd, float (*vertexCos)
 	smd->numpoly = tnumpoly;
 
 	SDefBindCalcData data = {.treeData = &treeData,
-		                     .vert_edges = (const SDefAdjacency **)vert_edges,
+		                     .vert_edges = vert_edges,
 		                     .edge_polys = edge_polys,
 		                     .mpoly = mpoly,
 		                     .medge = medge,




More information about the Bf-blender-cvs mailing list