Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCampbell Barton <ideasman42@gmail.com>2013-06-12 11:16:13 +0400
committerCampbell Barton <ideasman42@gmail.com>2013-06-12 11:16:13 +0400
commit293b3f0bdff8ca5368ee4625ae9fb8470973e28b (patch)
treece6c640a408296ce2296033b6d14f74ad0fc19d8 /source/blender/modifiers/intern/MOD_solidify.c
parentf0b991c944e8a4af383619f620eb2115595abb04 (diff)
optimize solidify, no need to do edgehash lookups, the edges are known.
Diffstat (limited to 'source/blender/modifiers/intern/MOD_solidify.c')
-rw-r--r--source/blender/modifiers/intern/MOD_solidify.c65
1 files changed, 21 insertions, 44 deletions
diff --git a/source/blender/modifiers/intern/MOD_solidify.c b/source/blender/modifiers/intern/MOD_solidify.c
index 89deeefbfaf..7ca187aa039 100644
--- a/source/blender/modifiers/intern/MOD_solidify.c
+++ b/source/blender/modifiers/intern/MOD_solidify.c
@@ -36,7 +36,6 @@
#include "BLI_utildefines.h"
#include "BLI_math.h"
-#include "BLI_edgehash.h"
#include "BLI_string.h"
#include "BKE_cdderivedmesh.h"
@@ -59,11 +58,17 @@ typedef struct EdgeFaceRef {
int f2;
} EdgeFaceRef;
+BLI_INLINE bool edgeref_is_init(const EdgeFaceRef *edge_ref)
+{
+ return (edge_ref->f1 != 0) && (edge_ref->f2 != 0);
+}
+
static void dm_calc_normal(DerivedMesh *dm, float (*temp_nors)[3])
{
int i, numVerts, numEdges, numFaces;
MPoly *mpoly, *mp;
MLoop *mloop, *ml;
+ MEdge *medge, *ed;
MVert *mvert, *mv;
float (*face_nors)[3];
@@ -74,6 +79,7 @@ static void dm_calc_normal(DerivedMesh *dm, float (*temp_nors)[3])
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 +101,12 @@ static void dm_calc_normal(DerivedMesh *dm, float (*temp_nors)[3])
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 +115,12 @@ static void dm_calc_normal(DerivedMesh *dm, float (*temp_nors)[3])
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 (!edgeref_is_init(edge_ref)) {
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,15 +129,10 @@ static void dm_calc_normal(DerivedMesh *dm, float (*temp_nors)[3])
}
}
- 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) {
+ if (edgeref_is_init(edge_ref) && (edge_ref->f2 != -1)) {
/* We have 2 faces using this edge, calculate the edges normal
* using the angle between the 2 faces as a weighting */
#if 0
@@ -160,11 +149,9 @@ static void dm_calc_normal(DerivedMesh *dm, float (*temp_nors)[3])
/* 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 +273,6 @@ static DerivedMesh *applyModifier(
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 +293,8 @@ static DerivedMesh *applyModifier(
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 +310,7 @@ static DerivedMesh *applyModifier(
{
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 +322,15 @@ static DerivedMesh *applyModifier(
}
}
- 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 +344,6 @@ static DerivedMesh *applyModifier(
mv->flag &= ~ME_VERT_TMP_TAG;
}
}
-
- BLI_edgehash_free(edgehash, NULL);
}
if (smd->flag & MOD_SOLIDIFY_NORMAL_CALC) {