[Bf-blender-cvs] [b09f7dc] dyntopo_holes: Merge branch 'master' into dyntopo_holes

Campbell Barton noreply at git.blender.org
Tue Oct 7 10:25:49 CEST 2014


Commit: b09f7dcaa7b487ada53c8dbaa811deaa1201d163
Author: Campbell Barton
Date:   Tue Oct 7 10:22:47 2014 +0200
Branches: dyntopo_holes
https://developer.blender.org/rBb09f7dcaa7b487ada53c8dbaa811deaa1201d163

Merge branch 'master' into dyntopo_holes

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



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

diff --cc source/blender/blenkernel/intern/pbvh_bmesh.c
index e71fe71,1a0ddac..28c01e0
--- a/source/blender/blenkernel/intern/pbvh_bmesh.c
+++ b/source/blender/blenkernel/intern/pbvh_bmesh.c
@@@ -1286,96 -1026,6 +1283,95 @@@ static bool pbvh_bmesh_collapse_short_e
  	return any_collapsed;
  }
  
 +#ifdef USE_HOLE_VOLUME_CLEAN
 +
 +static float len_to_tetrahedron_volume(float f)
 +{
 +	return (f * f * f) / 6.0f;
 +}
 +
 +static bool pbvh_bmesh_collapse_small_tetrahedrons(
 +        EdgeQueueContext *eq_ctx,
 +        PBVH *bvh,
-         BLI_Buffer *edge_loops,
 +        BLI_Buffer *deleted_faces)
 +{
 +	/* length as a tetrahedron volume, x1.5x to remove more... gives a bit nicer results */
 +	float min_volume = len_to_tetrahedron_volume(bvh->bm_min_edge_len) * 1.5f;
 +	GSet *deleted_verts;
 +	bool any_collapsed = false;
 +
 +	deleted_verts = BLI_gset_ptr_new("deleted_verts");
 +
 +	while (!BLI_heap_is_empty(eq_ctx->q->heap)) {
 +		BMLoop *l_a, *l_b;
 +		BMVert **pair = BLI_heap_popmin(eq_ctx->q->heap);
 +		BMVert *v1 = pair[0], *v2 = pair[1];
 +		BMEdge *e;
 +
 +		/* values on either side of the edge */
 +		BMLoop *l_adj;
 +		BMVert *v1_alt;
 +		BMVert *v2_alt;
 +		BMEdge *e_alt;
 +
 +		BLI_mempool_free(eq_ctx->pool, pair);
 +		pair = NULL;
 +
 +		/* Check the verts still exist */
 +		if (BLI_gset_haskey(deleted_verts, v1) ||
 +		    BLI_gset_haskey(deleted_verts, v2))
 +		{
 +			continue;
 +		}
 +
 +		/* Check that the edge still exists */
 +		if (!(e = BM_edge_exists(v1, v2))) {
 +			continue;
 +		}
 +
 +		if (!BM_edge_loop_pair(e, &l_a, &l_b)) {
 +			continue;
 +		}
 +
 +		v1_alt = l_a->prev->v;
 +		v2_alt = l_b->prev->v;
 +
 +		if (bm_edge_calc_volume_weighted(e) > min_volume) {
 +			continue;
 +		}
 +
 +		/* Check that the edge's vertices are still in the PBVH. It's
 +		 * possible that an edge collapse has deleted adjacent faces
 +		 * and the node has been split, thus leaving wire edges and
 +		 * associated vertices. */
 +		if ((BM_ELEM_CD_GET_INT(e->v1, eq_ctx->cd_vert_node_offset) == DYNTOPO_NODE_NONE) ||
 +		    (BM_ELEM_CD_GET_INT(e->v2, eq_ctx->cd_vert_node_offset) == DYNTOPO_NODE_NONE))
 +		{
 +			continue;
 +		}
 +
 +		any_collapsed = true;
 +
 +		/* Remove all faces adjacent to the edge, we _KNOW_ there are 2! */
 +		while ((l_adj = e->l)) {
 +			BMFace *f_adj = l_adj->f;
 +			pbvh_bmesh_face_remove(bvh, f_adj, eq_ctx->cd_vert_node_offset, eq_ctx->cd_face_node_offset);
 +			BM_face_kill(bvh->bm, f_adj);
 +		}
 +
 +		e_alt = BM_edge_create(bvh->bm, v1_alt, v2_alt, NULL, BM_CREATE_NO_DOUBLE);
 +
 +		pbvh_bmesh_collapse_edge(bvh, e_alt, v1_alt, v2_alt,
- 		                         deleted_verts, edge_loops,
++		                         deleted_verts,
 +		                         deleted_faces, eq_ctx);
 +	}
 +
 +	BLI_gset_free(deleted_verts, NULL);
 +
 +	return any_collapsed;
 +}
 +#endif  /* USE_HOLE_VOLUME_CLEAN */
 +
  /************************* Called from pbvh.c *************************/
  
  bool pbvh_bmesh_node_raycast(PBVHNode *node, const float ray_start[3],
@@@ -2039,33 -1233,6 +2035,33 @@@ bool BKE_pbvh_bmesh_update_topology(PBV
  		BLI_mempool_destroy(queue_pool);
  	}
  
 +	if (mode & PBVH_TopologyGenus) {
 +		EdgeQueue q;
 +		BLI_mempool *queue_pool = BLI_mempool_create(sizeof(BMVert *[2]),
 +		                                             128, 128, 0);
 +		EdgeQueueContext eq_ctx = {&q, queue_pool, bvh->bm, cd_vert_mask_offset, cd_vert_node_offset, cd_face_node_offset};
 +
 +		close_vert_queue_create(&eq_ctx, bvh, center, radius);
 +		pbvh_bmesh_collapse_close_verts(&eq_ctx, bvh);
 +		BLI_heap_free(q.heap, NULL);
 +		BLI_mempool_destroy(queue_pool);
 +	}
 +
 +	/* remove low volume areas (test!) */
 +#ifdef USE_HOLE_VOLUME_CLEAN
 +	if (mode & PBVH_TopologyGenus) {
 +		EdgeQueue q;
 +		BLI_mempool *queue_pool = BLI_mempool_create(sizeof(BMEdge *),
 +		                                             128, 128, 0);
 +		EdgeQueueContext eq_ctx = {&q, queue_pool, bvh->bm, cd_vert_mask_offset, cd_vert_node_offset, cd_face_node_offset};
 +
 +		tetrahedron_edge_queue_create(&eq_ctx, bvh, center, radius);
- 		pbvh_bmesh_collapse_small_tetrahedrons(&eq_ctx, bvh, &edge_loops, &deleted_faces);
++		pbvh_bmesh_collapse_small_tetrahedrons(&eq_ctx, bvh, &deleted_faces);
 +		BLI_heap_free(q.heap, NULL);
 +		BLI_mempool_destroy(queue_pool);
 +	}
 +#endif
 +
  	if (mode & PBVH_Subdivide) {
  		EdgeQueue q;
  		BLI_mempool *queue_pool = BLI_mempool_create(sizeof(BMVert *[2]), 0, 128, BLI_MEMPOOL_NOP);




More information about the Bf-blender-cvs mailing list