patch [#31579] Solidify modifier: Add new option "Flip Normals"

- previous commit was so similar to the patch Shinsuke wrote, better to add him as contributor, this commit will add to generated credits.
- this commit has no functional changes.
This commit is contained in:
Campbell Barton
2012-05-26 09:39:04 +00:00
parent e343a69e76
commit c895c0ee23

View File

@@ -18,11 +18,8 @@
* The Original Code is Copyright (C) 2005 by the Blender Foundation.
* All rights reserved.
*
* Contributor(s): Daniel Dunbar
* Ton Roosendaal,
* Ben Batt,
* Brecht Van Lommel,
* Campbell Barton
* Contributor(s): Campbell Barton
* Shinsuke Irie
*
* ***** END GPL LICENSE BLOCK *****
*
@@ -75,7 +72,7 @@ static void dm_calc_normal(DerivedMesh *dm, float (*temp_nors)[3])
mpoly = dm->getPolyArray(dm);
mvert = dm->getVertArray(dm);
mloop = dm->getLoopArray(dm);
/* we don't want to overwrite any referenced layers */
/* Doesn't work here! */
@@ -107,7 +104,7 @@ static void dm_calc_normal(DerivedMesh *dm, float (*temp_nors)[3])
unsigned int ml_v1;
unsigned int ml_v2;
int j;
f_no = face_nors[i];
if (calc_face_nors)
mesh_calc_poly_normal(mp, mloop + mp->loopstart, mvert, f_no);
@@ -210,9 +207,9 @@ BLI_INLINE void madd_v3v3short_fl(float r[3], const short a[3], const float f)
r[2] += (float)a[2] * f;
}
static DerivedMesh *applyModifier(ModifierData *md, Object *ob,
DerivedMesh *dm,
ModifierApplyFlag UNUSED(flag))
static DerivedMesh *applyModifier(ModifierData *md, Object *ob,
DerivedMesh *dm,
ModifierApplyFlag UNUSED(flag))
{
int i;
DerivedMesh *result;
@@ -227,7 +224,7 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob,
const int numFaces = dm->getNumPolys(dm);
int numLoops = 0, newLoops = 0, newFaces = 0, newEdges = 0;
int j;
/* only use material offsets if we have 2 or more materials */
const short mat_nr_max = ob->totcol > 1 ? ob->totcol - 1 : 0;
const short mat_ofs = mat_nr_max ? smd->mat_ofs : 0;
@@ -251,7 +248,7 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob,
const float ofs_new = smd->offset + ofs_orig;
const float offset_fac_vg = smd->offset_fac_vg;
const float offset_fac_vg_inv = 1.0f - smd->offset_fac_vg;
const int do_flip = (smd->flag & MOD_SOLIDIFY_FLIP) != 0;
const int do_flip = (smd->flag & MOD_SOLIDIFY_FLIP) != 0;
/* weights */
MDeformVert *dvert, *dv = NULL;
@@ -262,7 +259,7 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob,
numLoops = dm->numLoopData;
newLoops = 0;
orig_mvert = dm->getVertArray(dm);
orig_medge = dm->getEdgeArray(dm);
orig_mloop = dm->getLoopArray(dm);
@@ -396,9 +393,9 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob,
ml2[j].e = ml2[j + 1].e;
}
ml2[mp->totloop - 1].e = e;
mp->loopstart += dm->numLoopData;
for (j = 0; j < mp->totloop; j++) {
ml2[j].e += numEdges;
ml2[j].v += numVerts;
@@ -450,7 +447,6 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob,
madd_v3v3short_fl(mv->co, mv->no, scalar_short_vgroup);
}
}
}
else {
/* make a face normal layer if not present */
@@ -572,16 +568,16 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob,
}
if (smd->flag & MOD_SOLIDIFY_RIM) {
/* bugger, need to re-calculate the normals for the new edge faces.
* This could be done in many ways, but probably the quickest way
* is to calculate the average normals for side faces only.
* Then blend them with the normals of the edge verts.
*
*
* at the moment its easiest to allocate an entire array for every vertex,
* even though we only need edge verts - campbell
*/
#define SOLIDIFY_SIDE_NORMALS
#ifdef SOLIDIFY_SIDE_NORMALS
@@ -652,13 +648,13 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob,
if (flip == FALSE) {
ml[j].v = ed->v1;
ml[j++].e = eidx;
ml[j].v = ed->v2;
ml[j++].e = numEdges * 2 + old_vert_arr[ed->v2];
ml[j].v = ed->v2 + numVerts;
ml[j++].e = eidx + numEdges;
ml[j].v = ed->v1 + numVerts;
ml[j++].e = numEdges * 2 + old_vert_arr[ed->v1];
}
@@ -675,7 +671,7 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob,
ml[j].v = ed->v2 + numVerts;
ml[j++].e = numEdges * 2 + old_vert_arr[ed->v2];
}
origindex_edge[ml[j - 3].e] = ORIGINDEX_NONE;
origindex_edge[ml[j - 1].e] = ORIGINDEX_NONE;
@@ -697,7 +693,7 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob,
int tcr = *cr + crease_inner;
*cr = tcr > 255 ? 255 : tcr;
}
#ifdef SOLIDIFY_SIDE_NORMALS
normal_quad_v3(nor,
mvert[ml[j - 4].v].co,
@@ -713,17 +709,17 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob,
}
#endif
}
#ifdef SOLIDIFY_SIDE_NORMALS
ed = medge + (numEdges * 2);
for (i = 0; i < newEdges; i++, ed++) {
float nor_cpy[3];
short *nor_short;
int j;
/* note, only the first vertex (lower half of the index) is calculated */
normalize_v3_v3(nor_cpy, edge_vert_nos[ed->v1]);
for (j = 0; j < 2; j++) { /* loop over both verts of the edge */
nor_short = mvert[*(&ed->v1 + j)].no;
normal_short_to_float_v3(nor, nor_short);
@@ -744,7 +740,7 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob,
if (old_vert_arr)
MEM_freeN(old_vert_arr);
/* must recalculate normals with vgroups since they can displace unevenly [#26888] */
if (dvert) {
CDDM_calc_normals(result);