Index: source/blender/modifiers/intern/MOD_solidify.c =================================================================== --- source/blender/modifiers/intern/MOD_solidify.c (revision 35657) +++ source/blender/modifiers/intern/MOD_solidify.c (working copy) @@ -378,6 +378,35 @@ ed->v2 += numVerts; } + // calculate internal unconditional smooth normals if necessary + { + if(vert_nors==NULL) { + vert_nors= MEM_callocN(sizeof(float) * numVerts * 3, "mod_solid_vno"); + } + + for(i=0, mf=mface; iv4) ? vert_nors[mf->v4] : NULL; + float *c4 = (mf->v4) ? mvert[mf->v4].co : NULL; + + if(mf->v4) + normal_quad_v3(f_no, mvert[mf->v1].co, mvert[mf->v2].co, mvert[mf->v3].co, mvert[mf->v4].co); + else + normal_tri_v3(f_no, mvert[mf->v1].co, mvert[mf->v2].co, mvert[mf->v3].co); + + accumulate_vertex_normals(vert_nors[mf->v1], vert_nors[mf->v2], vert_nors[mf->v3], n4, f_no, mvert[mf->v1].co, mvert[mf->v2].co, mvert[mf->v3].co, c4); + } + + for(i=0; ico); + } + } + /* note, copied vertex layers dont have flipped normals yet. do this after applying offset */ if((smd->flag & MOD_SOLIDIFY_EVEN) == 0) { /* no even thickness, very simple */ @@ -386,7 +415,7 @@ if(ofs_new != 0.0f) { - scalar_short= scalar_short_vgroup= ofs_new / 32767.0f; + scalar_short= scalar_short_vgroup= ofs_new; mv= mvert + ((ofs_new >= ofs_orig) ? 0 : numVerts); dv= dvert; for(i=0; ico, mv->co, mv->no, scalar_short_vgroup); + VECADDFAC(mv->co, mv->co, vert_nors[i], scalar_short_vgroup); } } if(ofs_orig != 0.0f) { - scalar_short= scalar_short_vgroup= ofs_orig / 32767.0f; + scalar_short= scalar_short_vgroup= ofs_orig; mv= mvert + ((ofs_new >= ofs_orig) ? numVerts : 0); /* same as above but swapped, intentional use of 'ofs_new' */ dv= dvert; for(i=0; ico, mv->co, mv->no, scalar_short_vgroup); + VECADDFAC(mv->co, mv->co, vert_nors[i], scalar_short_vgroup); } } @@ -431,12 +460,6 @@ face_nors_calc= 1; } - if(vert_nors==NULL) { - vert_nors= MEM_mallocN(sizeof(float) * numVerts * 3, "mod_solid_vno"); - for(i=0, mv=mvert; ino); - } - } for(i=0, mf=mface; i