Changeset View
Changeset View
Standalone View
Standalone View
source/blender/modifiers/intern/MOD_normal_edit.c
| Show First 20 Lines • Show All 143 Lines • ▼ Show 20 Lines | switch (mix_mode) { | ||||
| break; | break; | ||||
| } | } | ||||
| interp_v3_v3v3_slerp_safe(*no_new, *no_old, *no_new, fac); | interp_v3_v3v3_slerp_safe(*no_new, *no_old, *no_new, fac); | ||||
| } | } | ||||
| MEM_SAFE_FREE(facs); | MEM_SAFE_FREE(facs); | ||||
| } | } | ||||
| /* Check poly normals and new loop normals are compatible, otherwise flip polygons | |||||
| * (and invert matching poly normals). */ | |||||
| static bool polygons_check_flip( | |||||
| MLoop *mloop, float (*nos)[3], CustomData *ldata, | |||||
| MPoly *mpoly, float (*polynors)[3], const int num_polys) | |||||
| { | |||||
| MPoly *mp; | |||||
| int i; | |||||
| bool flipped = false; | |||||
| for (i = 0, mp = mpoly; i < num_polys; i++, mp++) { | |||||
| float norsum[3] = {0.0f}; | |||||
| float (*no)[3]; | |||||
| int j; | |||||
| for (j = 0, no = &nos[mp->loopstart]; j < mp->totloop; j++, no++) { | |||||
| add_v3_v3(norsum, *no); | |||||
| } | |||||
| if (!normalize_v3(norsum)) { | |||||
| continue; | |||||
| } | |||||
| /* If average of new loop normals is opposed to polygon normal, flip polygon. */ | |||||
| if (dot_v3v3(polynors[i], norsum) < 0.0f) { | |||||
| BKE_mesh_polygon_flip(mp, mloop, ldata); | |||||
| negate_v3(polynors[i]); | |||||
| flipped = true; | |||||
| } | |||||
| } | |||||
| return flipped; | |||||
| } | |||||
| static void normalEditModifier_do_radial( | static void normalEditModifier_do_radial( | ||||
| NormalEditModifierData *smd, Object *ob, DerivedMesh *dm, | NormalEditModifierData *smd, Object *ob, DerivedMesh *dm, | ||||
| short (*clnors)[2], float (*loopnors)[3], float (*polynors)[3], | short (*clnors)[2], float (*loopnors)[3], float (*polynors)[3], | ||||
| const short mix_mode, const float mix_factor, | const short mix_mode, const float mix_factor, | ||||
| MDeformVert *dvert, const int defgrp_index, const bool use_invert_vgroup, | MDeformVert *dvert, const int defgrp_index, const bool use_invert_vgroup, | ||||
| MVert *mvert, const int num_verts, MEdge *medge, const int num_edges, | MVert *mvert, const int num_verts, MEdge *medge, const int num_edges, | ||||
| MLoop *mloop, const int num_loops, MPoly *mpoly, const int num_polys) | MLoop *mloop, const int num_loops, MPoly *mpoly, const int num_polys) | ||||
| { | { | ||||
| ▲ Show 20 Lines • Show All 69 Lines • ▼ Show 20 Lines | */ | ||||
| } | } | ||||
| } | } | ||||
| if (loopnors) { | if (loopnors) { | ||||
| mix_normals(mix_factor, dvert, defgrp_index, use_invert_vgroup, | mix_normals(mix_factor, dvert, defgrp_index, use_invert_vgroup, | ||||
| mix_mode, num_verts, mloop, loopnors, nos, num_loops); | mix_mode, num_verts, mloop, loopnors, nos, num_loops); | ||||
| } | } | ||||
| if (polygons_check_flip(mloop, nos, dm->getLoopDataLayout(dm), mpoly, polynors, num_polys)) { | |||||
| dm->dirty |= DM_DIRTY_TESS_CDLAYERS; | |||||
| } | |||||
| BKE_mesh_normals_loop_custom_set(mvert, num_verts, medge, num_edges, mloop, nos, num_loops, | BKE_mesh_normals_loop_custom_set(mvert, num_verts, medge, num_edges, mloop, nos, num_loops, | ||||
| mpoly, (const float(*)[3])polynors, num_polys, clnors); | mpoly, (const float(*)[3])polynors, num_polys, clnors); | ||||
| MEM_freeN(cos); | MEM_freeN(cos); | ||||
| MEM_freeN(nos); | MEM_freeN(nos); | ||||
| MEM_freeN(done_verts); | MEM_freeN(done_verts); | ||||
| } | } | ||||
| ▲ Show 20 Lines • Show All 57 Lines • ▼ Show 20 Lines | else { | ||||
| MEM_freeN(done_verts); | MEM_freeN(done_verts); | ||||
| } | } | ||||
| if (loopnors) { | if (loopnors) { | ||||
| mix_normals(mix_factor, dvert, defgrp_index, use_invert_vgroup, | mix_normals(mix_factor, dvert, defgrp_index, use_invert_vgroup, | ||||
| mix_mode, num_verts, mloop, loopnors, nos, num_loops); | mix_mode, num_verts, mloop, loopnors, nos, num_loops); | ||||
| } | } | ||||
| if (polygons_check_flip(mloop, nos, dm->getLoopDataLayout(dm), mpoly, polynors, num_polys)) { | |||||
| dm->dirty |= DM_DIRTY_TESS_CDLAYERS; | |||||
| } | |||||
| BKE_mesh_normals_loop_custom_set(mvert, num_verts, medge, num_edges, mloop, nos, num_loops, | BKE_mesh_normals_loop_custom_set(mvert, num_verts, medge, num_edges, mloop, nos, num_loops, | ||||
| mpoly, (const float(*)[3])polynors, num_polys, clnors); | mpoly, (const float(*)[3])polynors, num_polys, clnors); | ||||
| MEM_freeN(cos); | MEM_freeN(cos); | ||||
| MEM_freeN(nos); | MEM_freeN(nos); | ||||
| } | } | ||||
| static bool is_valid_target(NormalEditModifierData *smd) | static bool is_valid_target(NormalEditModifierData *smd) | ||||
| ▲ Show 20 Lines • Show All 206 Lines • Show Last 20 Lines | |||||