Fix T37519: Screw Modifier ignores material setup

This was more a missing feature then a bug, the modifier never handled
existing faces however with ngons its possible to get more useful
results. Also order edges from the faces (if available),
gives control over the face-winding-direction.
This commit is contained in:
Campbell Barton 2013-11-19 13:11:31 +11:00
parent 4da651c8f0
commit 74a1e4dcf2
Notes: blender-bot 2023-04-14 09:18:04 +02:00
Referenced by issue #37519, Screw Modifier ignores material setup
2 changed files with 43 additions and 3 deletions

@ -1 +1 @@
Subproject commit c50944e808d6c74148237e85866e893628f0fee6
Subproject commit 2bfbbe4182d7e5d5332d963054f298c9fddc5f09

View File

@ -151,6 +151,8 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob,
int maxVerts = 0, maxEdges = 0, maxPolys = 0;
const unsigned int totvert = dm->getNumVerts(dm);
const unsigned int totedge = dm->getNumEdges(dm);
const unsigned int totpoly = dm->getNumPolys(dm);
int *edge_poly_map = NULL;
char axis_char = 'X', close;
float angle = ltmd->angle;
@ -168,8 +170,8 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob,
int edge_offset;
MPoly *mpoly_new, *mp_new;
MLoop *mloop_new, *ml_new;
MPoly *mpoly_orig, *mpoly_new, *mp_new;
MLoop *mloop_orig, *mloop_new, *ml_new;
MEdge *medge_orig, *med_orig, *med_new, *med_new_firstloop, *medge_new;
MVert *mvert_new, *mvert_orig, *mv_orig, *mv_new, *mv_new_base;
@ -333,6 +335,29 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob,
med_new->flag = med_orig->flag & ~ME_LOOSEEDGE;
}
/* build polygon -> edge map */
if (totpoly) {
MPoly *mp_orig;
mpoly_orig = dm->getPolyArray(dm);
mloop_orig = dm->getLoopArray(dm);
edge_poly_map = MEM_mallocN(sizeof(*edge_poly_map) * totedge, __func__);
fill_vn_i(edge_poly_map, totedge, -1);
for (i = 0, mp_orig = mpoly_orig; i < totpoly; i++, mp_orig++) {
MLoop *ml_orig = &mloop_orig[mp_orig->loopstart];
int j;
for (j = 0; j < mp_orig->totloop; j++, ml_orig++) {
edge_poly_map[ml_orig->e] = i;
/* also order edges based on faces */
if (medge_new[ml_orig->e].v1 != ml_orig->v) {
SWAP(unsigned int, medge_new[ml_orig->e].v1, medge_new[ml_orig->e].v2);
}
}
}
}
if (ltmd->flag & MOD_SCREW_NORMAL_CALC) {
/*
* Normal Calculation (for face flipping)
@ -775,10 +800,19 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob,
edge_offset = totedge + (totvert * (step_tot - (close ? 0 : 1)));
for (i = 0; i < totedge; i++, med_new_firstloop++) {
short mat_nr;
/* for each edge, make a cylinder of quads */
i1 = med_new_firstloop->v1;
i2 = med_new_firstloop->v2;
if (totpoly && (edge_poly_map[i] != -1)) {
mat_nr = mpoly_orig[edge_poly_map[i]].mat_nr;
}
else {
mat_nr = 0;
}
for (step = 0; step < step_tot - 1; step++) {
/* new face */
@ -808,6 +842,7 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob,
mp_new->loopstart = mpoly_index * 4;
mp_new->totloop = 4;
mp_new->mat_nr = mat_nr;
mp_new->flag = mpoly_flag;
origindex[mpoly_index] = ORIGINDEX_NONE;
mp_new++;
@ -853,6 +888,7 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob,
mp_new->loopstart = mpoly_index * 4;
mp_new->totloop = 4;
mp_new->mat_nr = mat_nr;
mp_new->flag = mpoly_flag;
origindex[mpoly_index] = ORIGINDEX_NONE;
mp_new++;
@ -896,6 +932,10 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob,
}
#endif
if (edge_poly_map) {
MEM_freeN(edge_poly_map);
}
if ((ltmd->flag & MOD_SCREW_NORMAL_CALC) == 0) {
result->dirty |= DM_DIRTY_NORMALS;
}