[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