[Bf-blender-cvs] [b9ea6fb] master: BMesh: dyntopo used lopsided normals

Campbell Barton noreply at git.blender.org
Wed Apr 15 12:57:24 CEST 2015


Commit: b9ea6fbb301f264110b5b0ab0ace021079434e69
Author: Campbell Barton
Date:   Wed Apr 15 20:52:51 2015 +1000
Branches: master
https://developer.blender.org/rBb9ea6fbb301f264110b5b0ab0ace021079434e69

BMesh: dyntopo used lopsided normals

Normals from subdivided edges were only taken from the edges first vertex.

Interpolate between the two to give more even results.

===================================================================

M	source/blender/blenkernel/intern/pbvh_bmesh.c

===================================================================

diff --git a/source/blender/blenkernel/intern/pbvh_bmesh.c b/source/blender/blenkernel/intern/pbvh_bmesh.c
index 630f3ab..ce405e8 100644
--- a/source/blender/blenkernel/intern/pbvh_bmesh.c
+++ b/source/blender/blenkernel/intern/pbvh_bmesh.c
@@ -330,8 +330,7 @@ static PBVHNode *pbvh_bmesh_node_lookup(PBVH *bvh, void *key)
 
 static BMVert *pbvh_bmesh_vert_create(
         PBVH *bvh, int node_index,
-        const float co[3],
-        const BMVert *example,
+        const float co[3], const float no[3],
         const int cd_vert_mask_offset)
 {
 	PBVHNode *node = &bvh->nodes[node_index];
@@ -340,9 +339,12 @@ static BMVert *pbvh_bmesh_vert_create(
 	BLI_assert((bvh->totnode == 1 || node_index) && node_index <= bvh->totnode);
 
 	/* avoid initializing customdata because its quite involved */
-	v = BM_vert_create(bvh->bm, co, example, BM_CREATE_SKIP_CD);
+	v = BM_vert_create(bvh->bm, co, NULL, BM_CREATE_SKIP_CD);
 	CustomData_bmesh_set_default(&bvh->bm->vdata, &v->head.data);
 
+	/* This value is logged below */
+	copy_v3_v3(v->no, no);
+
 	BLI_gset_insert(node->bm_unique_verts, v);
 	BM_ELEM_CD_SET_INT(v, bvh->cd_vert_node_offset, node_index);
 
@@ -879,17 +881,19 @@ static void pbvh_bmesh_split_edge(EdgeQueueContext *eq_ctx, PBVH *bvh,
                                   BMEdge *e, BLI_Buffer *edge_loops)
 {
 	BMVert *v_new;
-	float mid[3];
+	float co_mid[3], no_mid[3];
 	int i, node_index;
 
 	/* Get all faces adjacent to the edge */
 	pbvh_bmesh_edge_loops(edge_loops, e);
 
 	/* Create a new vertex in current node at the edge's midpoint */
-	mid_v3_v3v3(mid, e->v1->co, e->v2->co);
+	mid_v3_v3v3(co_mid, e->v1->co, e->v2->co);
+	mid_v3_v3v3(no_mid, e->v1->no, e->v2->no);
+	normalize_v3(no_mid);
 
 	node_index = BM_ELEM_CD_GET_INT(e->v1, eq_ctx->cd_vert_node_offset);
-	v_new = pbvh_bmesh_vert_create(bvh, node_index, mid, e->v1, eq_ctx->cd_vert_mask_offset);
+	v_new = pbvh_bmesh_vert_create(bvh, node_index, co_mid, no_mid, eq_ctx->cd_vert_mask_offset);
 
 	/* update paint mask */
 	if (eq_ctx->cd_vert_mask_offset != -1) {




More information about the Bf-blender-cvs mailing list