diff options
Diffstat (limited to 'source/blender/modifiers/intern/MOD_solidify.c')
-rw-r--r-- | source/blender/modifiers/intern/MOD_solidify.c | 27 |
1 files changed, 13 insertions, 14 deletions
diff --git a/source/blender/modifiers/intern/MOD_solidify.c b/source/blender/modifiers/intern/MOD_solidify.c index d3e54651eea..5f9bce9ec36 100644 --- a/source/blender/modifiers/intern/MOD_solidify.c +++ b/source/blender/modifiers/intern/MOD_solidify.c @@ -447,8 +447,6 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, /* same as EM_solidify() in editmesh_lib.c */ float *vert_angles= MEM_callocN(sizeof(float) * numVerts * 2, "mod_solid_pair"); /* 2 in 1 */ float *vert_accum= vert_angles + numVerts; - float *face_angles = NULL; - BLI_array_staticdeclare(face_angles, 16); /* BM_NGON_STACK_SIZE */ int j, vidx; face_nors = CustomData_get_layer(&dm->polyData, CD_NORMAL); @@ -469,27 +467,28 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, mesh_calc_poly_normal(mp, &mloop[mp->loopstart], mvert, face_nors[i]); /* just added, calc the normal */ - BLI_array_empty(face_angles); for (j=0, ml=mloop+mp->loopstart; j<mp->totloop; j++, ml++) { MLoop *ml_prev = ME_POLY_LOOP_PREV(mloop, mp, j); MLoop *ml_next = ME_POLY_LOOP_NEXT(mloop, mp, j); - float e1[3], e2[3], angle; - + float e1[3], e2[3]; + float angle; + + /* TODO - we could speed this up by _not_ normalizing both verts each time + * and always re-usingthe last vector. */ sub_v3_v3v3(e1, mvert[ml_next->v].co, mvert[ml->v].co); sub_v3_v3v3(e2, mvert[ml_prev->v].co, mvert[ml->v].co); - angle = M_PI - angle_normalized_v3v3(e1, e2); - BLI_array_append(face_angles, angle); - } - - for (j=0, ml=mloop+mp->loopstart; j<mp->totloop; j++, ml++) { + + angle = (float)M_PI - angle_v3v3(e1, e2); + if (angle < FLT_EPSILON) { + angle = FLT_EPSILON; + } + vidx = ml->v; - vert_accum[vidx] += face_angles[j]; - vert_angles[vidx]+= shell_angle_to_dist(angle_normalized_v3v3(vert_nors[vidx], face_nors[i])) * face_angles[j]; + vert_accum[vidx]+= angle; + vert_angles[vidx]+= shell_angle_to_dist(angle_normalized_v3v3(vert_nors[vidx], face_nors[i])) * angle; } } - - BLI_array_free(face_angles); /* vertex group support */ if (dvert) { |