[Bf-blender-cvs] [7376444b842] soc-2017-normal-tools: Fixed all clnors in lnorspace not updating
Rohan Rathi
noreply at git.blender.org
Tue Jul 4 08:01:49 CEST 2017
Commit: 7376444b842786252da67551dbad756d8cf76217
Author: Rohan Rathi
Date: Tue Jul 4 11:31:24 2017 +0530
Branches: soc-2017-normal-tools
https://developer.blender.org/rB7376444b842786252da67551dbad756d8cf76217
Fixed all clnors in lnorspace not updating
===================================================================
M source/blender/bmesh/bmesh_class.h
M source/blender/bmesh/intern/bmesh_mesh.c
===================================================================
diff --git a/source/blender/bmesh/bmesh_class.h b/source/blender/bmesh/bmesh_class.h
index 7c0e80d860f..b080c634cdf 100644
--- a/source/blender/bmesh/bmesh_class.h
+++ b/source/blender/bmesh/bmesh_class.h
@@ -373,8 +373,7 @@ enum {
* not have functions clobber them */
BM_ELEM_INTERNAL_TAG = (1 << 7),
- /* Space invalid when set. This is also used to mark individual clnors for editing,
- see BM_loop_normal_indiv() */
+ /* Space invalid when set. */
BM_ELEM_LNORSPACE = (1 << 6)
};
diff --git a/source/blender/bmesh/intern/bmesh_mesh.c b/source/blender/bmesh/intern/bmesh_mesh.c
index 449cbee7b82..f82aebb2478 100644
--- a/source/blender/bmesh/intern/bmesh_mesh.c
+++ b/source/blender/bmesh/intern/bmesh_mesh.c
@@ -1042,6 +1042,7 @@ void BM_lnorspace_invalidate(BMesh *bm, bool inval_all)
}
}
}
+ MEM_freeN(faces);
bm->spacearr_dirty |= BM_SPACEARR_DIRTY;
}
@@ -1177,7 +1178,7 @@ static void BM_lnorspace_err(BMesh *bm)
}
/* Marks the individual clnors to be edited, if multiple selection methods are used */
-static int BM_loop_normal_mark_indiv(BMesh *bm)
+static int BM_loop_normal_mark_indiv(BMesh *bm, BLI_bitmap *loops)
{
BMEditSelection *ese, *vert;
int totloopsel = 0;
@@ -1193,20 +1194,20 @@ static int BM_loop_normal_mark_indiv(BMesh *bm)
if (vert->htype == BM_VERT) {
BMLoop *l = BM_face_vert_share_loop((BMFace *)ese->ele, (BMVert *)vert->ele);
- if (l && !BM_elem_flag_test(l, BM_ELEM_LNORSPACE)) { /* if vert and face selected share a loop, mark it for editing */
- BM_elem_flag_enable(l, BM_ELEM_LNORSPACE);
+ if (l && !BLI_BITMAP_TEST(loops, BM_elem_index_get(l))) { /* if vert and face selected share a loop, mark it for editing */
+ BLI_BITMAP_ENABLE(loops, BM_elem_index_get(l));
totloopsel++;
}
}
else if (vert->htype == BM_EDGE) {
BMLoop *l = BM_face_vert_share_loop((BMFace *)ese->ele, ((BMEdge *)vert->ele)->v1);
- if (l && !BM_elem_flag_test(l, BM_ELEM_LNORSPACE)) {
- BM_elem_flag_enable(l, BM_ELEM_LNORSPACE);
+ if (l && !BLI_BITMAP_TEST(loops, BM_elem_index_get(l))) {
+ BLI_BITMAP_ENABLE(loops, BM_elem_index_get(l));
totloopsel++;
}
l = BM_face_vert_share_loop((BMFace *)ese->ele, ((BMEdge *)vert->ele)->v2);
- if (l && !BM_elem_flag_test(l, BM_ELEM_LNORSPACE)) {
- BM_elem_flag_enable(l, BM_ELEM_LNORSPACE);
+ if (l && !BLI_BITMAP_TEST(loops, BM_elem_index_get(l))) {
+ BLI_BITMAP_ENABLE(loops, BM_elem_index_get(l));
totloopsel++;
}
}
@@ -1214,6 +1215,20 @@ static int BM_loop_normal_mark_indiv(BMesh *bm)
}
}
+ for (int i = 0; i < bm->totloop; i++) { /* Mark all loops in a loop normal space */
+ if (BLI_BITMAP_TEST(loops, i)) {
+ LinkNode *node = bm->lnor_spacearr->lspacearr[i]->loops;
+ while (node) {
+ const int l_index = GET_INT_FROM_POINTER(node->link);
+ if (!BLI_BITMAP_TEST(loops, l_index)) {
+ BLI_BITMAP_ENABLE(loops, l_index);
+ totloopsel++;
+ }
+ node = node->next;
+ }
+ }
+ }
+
return totloopsel;
}
@@ -1224,8 +1239,9 @@ LoopNormalData *BM_loop_normal_init(BMesh *bm)
faces = bm->selectmode & SCE_SELECT_FACE;
int totloopsel = 0;
+ BLI_bitmap *loops = BLI_BITMAP_NEW(bm->totloop, "__func__");
if (verts + edges + faces > 1) { /* More than 1 sel mode, check if only individual normals to edit */
- totloopsel = BM_loop_normal_mark_indiv(bm);
+ totloopsel = BM_loop_normal_mark_indiv(bm, loops);
}
LoopNormalData *ld = MEM_mallocN(sizeof(*ld), "__func__");
int cd_custom_normal_offset = CustomData_get_offset(&bm->ldata, CD_CUSTOMLOOPNORMAL);
@@ -1238,10 +1254,9 @@ LoopNormalData *BM_loop_normal_init(BMesh *bm)
BM_ITER_MESH(v, &viter, bm, BM_VERTS_OF_MESH) {
BM_ITER_ELEM(l, &liter, v, BM_LOOPS_OF_VERT) {
- if (BM_elem_flag_test(l, BM_ELEM_LNORSPACE)) {
+ if (BLI_BITMAP_TEST(loops, BM_elem_index_get(l))) {
InitTransDataNormal(bm, tld, v, l, cd_custom_normal_offset);
- BM_elem_flag_disable(l, BM_ELEM_LNORSPACE);
tld++;
}
}
@@ -1264,6 +1279,7 @@ LoopNormalData *BM_loop_normal_init(BMesh *bm)
ld->totloop = totloopsel;
}
+ MEM_freeN(loops);
ld->offset = cd_custom_normal_offset;
return ld;
}
More information about the Bf-blender-cvs
mailing list