[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [57402] trunk/blender/source/blender/ modifiers/intern/MOD_solidify.c: optimize solidify, no need to do edgehash lookups, the edges are known.
Campbell Barton
ideasman42 at gmail.com
Wed Jun 12 09:16:14 CEST 2013
Revision: 57402
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=57402
Author: campbellbarton
Date: 2013-06-12 07:16:13 +0000 (Wed, 12 Jun 2013)
Log Message:
-----------
optimize solidify, no need to do edgehash lookups, the edges are known.
Modified Paths:
--------------
trunk/blender/source/blender/modifiers/intern/MOD_solidify.c
Modified: trunk/blender/source/blender/modifiers/intern/MOD_solidify.c
===================================================================
--- trunk/blender/source/blender/modifiers/intern/MOD_solidify.c 2013-06-12 07:02:52 UTC (rev 57401)
+++ trunk/blender/source/blender/modifiers/intern/MOD_solidify.c 2013-06-12 07:16:13 UTC (rev 57402)
@@ -36,7 +36,6 @@
#include "BLI_utildefines.h"
#include "BLI_math.h"
-#include "BLI_edgehash.h"
#include "BLI_string.h"
#include "BKE_cdderivedmesh.h"
@@ -64,6 +63,7 @@
int i, numVerts, numEdges, numFaces;
MPoly *mpoly, *mp;
MLoop *mloop, *ml;
+ MEdge *medge, *ed;
MVert *mvert, *mv;
float (*face_nors)[3];
@@ -74,6 +74,7 @@
numEdges = dm->getNumEdges(dm);
numFaces = dm->getNumPolys(dm);
mpoly = dm->getPolyArray(dm);
+ medge = dm->getEdgeArray(dm);
mvert = dm->getVertArray(dm);
mloop = dm->getLoopArray(dm);
@@ -95,18 +96,12 @@
mp = mpoly;
{
- EdgeHash *edge_hash = BLI_edgehash_new();
- EdgeHashIterator *edge_iter;
- int edge_ref_count = 0;
- unsigned int ed_v1, ed_v2; /* use when getting the key */
EdgeFaceRef *edge_ref_array = MEM_callocN(sizeof(EdgeFaceRef) * (size_t)numEdges, "Edge Connectivity");
EdgeFaceRef *edge_ref;
float edge_normal[3];
/* This loop adds an edge hash if its not there, and adds the face index */
for (i = 0; i < numFaces; i++, mp++) {
- unsigned int ml_v1;
- unsigned int ml_v2;
int j;
f_no = face_nors[i];
@@ -115,18 +110,12 @@
ml = mloop + mp->loopstart;
- for (j = 0, ml_v2 = ml[mp->totloop - 1].v;
- j < mp->totloop;
- j++, ml++, ml_v2 = ml_v1)
- {
- ml_v1 = ml->v;
+ for (j = 0; j < mp->totloop; j++, ml++) {
/* --- add edge ref to face --- */
- edge_ref = (EdgeFaceRef *)BLI_edgehash_lookup(edge_hash, ml_v1, ml_v2);
- if (!edge_ref) {
- edge_ref = &edge_ref_array[edge_ref_count++];
+ edge_ref = &edge_ref_array[ml->e];
+ if ((edge_ref->f1 == 0) && (edge_ref->f2 == 0)) {
edge_ref->f1 = i;
edge_ref->f2 = -1;
- BLI_edgehash_insert(edge_hash, ml_v1, ml_v2, edge_ref);
}
else {
edge_ref->f2 = i;
@@ -135,13 +124,8 @@
}
}
- for (edge_iter = BLI_edgehashIterator_new(edge_hash);
- !BLI_edgehashIterator_isDone(edge_iter);
- BLI_edgehashIterator_step(edge_iter))
- {
- /* Get the edge vert indices, and edge value (the face indices that use it)*/
- BLI_edgehashIterator_getKey(edge_iter, &ed_v1, &ed_v2);
- edge_ref = BLI_edgehashIterator_getValue(edge_iter);
+ for (i = 0, ed = medge, edge_ref = edge_ref_array; i < numEdges; i++, ed++, edge_ref++) {
+ /* Get the edge vert indices, and edge value (the face indices that use it) */
if (edge_ref->f2 != -1) {
/* We have 2 faces using this edge, calculate the edges normal
@@ -160,11 +144,9 @@
/* an edge without another attached- the weight on this is undefined */
copy_v3_v3(edge_normal, face_nors[edge_ref->f1]);
}
- add_v3_v3(temp_nors[ed_v1], edge_normal);
- add_v3_v3(temp_nors[ed_v2], edge_normal);
+ add_v3_v3(temp_nors[ed->v1], edge_normal);
+ add_v3_v3(temp_nors[ed->v2], edge_normal);
}
- BLI_edgehashIterator_free(edge_iter);
- BLI_edgehash_free(edge_hash, NULL);
MEM_freeN(edge_ref_array);
}
@@ -286,9 +268,6 @@
STACK_INIT(new_edge_arr);
if (smd->flag & MOD_SOLIDIFY_RIM) {
- EdgeHash *edgehash = BLI_edgehash_new();
- EdgeHashIterator *ehi;
- unsigned int v1, v2;
unsigned int eidx;
#define INVALID_UNUSED ((unsigned int)-1)
@@ -309,9 +288,8 @@
fill_vn_i(edge_users, numEdges, INVALID_UNUSED);
#endif
- for (i = 0, ed = orig_medge; i < numEdges; i++, ed++) {
- BLI_edgehash_insert(edgehash, ed->v1, ed->v2, SET_UINT_IN_POINTER(i));
- edge_users[i] = INVALID_UNUSED;
+ for (eidx = 0, ed = orig_medge; eidx < numEdges; eidx++, ed++) {
+ edge_users[eidx] = INVALID_UNUSED;
}
for (i = 0, mp = orig_mpoly; i < numFaces; i++, mp++) {
@@ -327,7 +305,7 @@
{
ml_v1 = ml->v;
/* add edge user */
- eidx = GET_UINT_FROM_POINTER(BLI_edgehash_lookup(edgehash, ml_v1, ml_v2));
+ eidx = ml->e;
if (edge_users[eidx] == INVALID_UNUSED) {
ed = orig_medge + eidx;
edge_users[eidx] = (ml_v1 < ml_v2) == (ed->v1 < ed->v2) ? i : (i + numFaces);
@@ -339,19 +317,15 @@
}
}
- ehi = BLI_edgehashIterator_new(edgehash);
- for (; !BLI_edgehashIterator_isDone(ehi); BLI_edgehashIterator_step(ehi)) {
- eidx = GET_UINT_FROM_POINTER(BLI_edgehashIterator_getValue(ehi));
+ for (eidx = 0, ed = orig_medge; eidx < numEdges; eidx++, ed++) {
if (!ELEM(edge_users[eidx], INVALID_UNUSED, INVALID_PAIR)) {
- BLI_edgehashIterator_getKey(ehi, &v1, &v2);
- orig_mvert[v1].flag |= ME_VERT_TMP_TAG;
- orig_mvert[v2].flag |= ME_VERT_TMP_TAG;
+ orig_mvert[ed->v1].flag |= ME_VERT_TMP_TAG;
+ orig_mvert[ed->v2].flag |= ME_VERT_TMP_TAG;
STACK_PUSH(new_edge_arr, eidx);
newFaces++;
newLoops += 4;
}
}
- BLI_edgehashIterator_free(ehi);
#undef INVALID_UNUSED
#undef INVALID_PAIR
@@ -365,8 +339,6 @@
mv->flag &= ~ME_VERT_TMP_TAG;
}
}
-
- BLI_edgehash_free(edgehash, NULL);
}
if (smd->flag & MOD_SOLIDIFY_NORMAL_CALC) {
More information about the Bf-blender-cvs
mailing list