[Bf-blender-cvs] [e0d8817e052] soc-2017-sculpting_improvements: Added 2D shape topology detection, first silhouette geometry gets created. Use with alt+leftclick within sculpting mode. --Experimental/Broken--

witt noreply at git.blender.org
Fri Jun 16 22:35:37 CEST 2017


Commit: e0d8817e052c46edf0009f6b8d79dda2ec221cbd
Author: witt
Date:   Fri Jun 16 22:32:03 2017 +0200
Branches: soc-2017-sculpting_improvements
https://developer.blender.org/rBe0d8817e052c46edf0009f6b8d79dda2ec221cbd

Added 2D shape topology detection, first silhouette geometry gets created. Use with alt+leftclick within sculpting mode.
--Experimental/Broken--

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

M	source/blender/blenkernel/BKE_pbvh.h
M	source/blender/blenkernel/intern/pbvh.c
M	source/blender/editors/sculpt_paint/sculpt.c

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

diff --git a/source/blender/blenkernel/BKE_pbvh.h b/source/blender/blenkernel/BKE_pbvh.h
index d6bdca81b38..a6186a4ee05 100644
--- a/source/blender/blenkernel/BKE_pbvh.h
+++ b/source/blender/blenkernel/BKE_pbvh.h
@@ -63,6 +63,7 @@ typedef void (*BKE_pbvh_HitOccludedCallback)(PBVHNode *node, void *data, float *
 
 PBVH *BKE_pbvh_new(void);
 void BKE_pbvh_attach_mesh(PBVH *pbvh, PBVHNode *node, Mesh *me, int totprim, float *max_bmin, float *max_bmax);
+void BKE_pbvh_build_mesh_complete(PBVH *pbvh, Mesh *me);
 void BKE_pbvh_build_mesh(
         PBVH *bvh,
         const struct MPoly *mpoly, const struct MLoop *mloop,
diff --git a/source/blender/blenkernel/intern/pbvh.c b/source/blender/blenkernel/intern/pbvh.c
index e90a921805f..0deccc7019f 100644
--- a/source/blender/blenkernel/intern/pbvh.c
+++ b/source/blender/blenkernel/intern/pbvh.c
@@ -519,30 +519,30 @@ static void pbvh_build(PBVH *bvh, BB *cb, BBC *prim_bbc, int totprim)
  * Attach a new mesh to a node of the PBVH
  * vertdata etc needs to be already in the basemesh
  */
-void BKE_pbvh_attach_mesh(PBVH *pbvh, PBVHNode *node, Mesh *me, int totprim, float *max_bmin, float *max_bmax){
+void BKE_pbvh_attach_mesh(PBVH *pbvh, PBVHNode *node, Mesh *me, int totprim, float *max_bmin, float *max_bmax)
+{
 	BB new_BB;
 	copy_v3_v3(new_BB.bmin, max_bmin);
 	copy_v3_v3(new_BB.bmax, max_bmax);
 	int d_prim = totprim-pbvh->totprim;
 
-	/*for(int i = 0; i < pbvh->totprim; i++){
+	/*for (int i = 0; i < pbvh->totprim; i++) {
 		printf("%i,",pbvh->prim_indices[i]);
 	}*/
 
-	if(me->totvert <= pbvh->leaf_limit){
+	if (me->totvert <= pbvh->leaf_limit) {
 		pbvh->totvert = me->totvert;
 		pbvh->totprim = totprim;
 		MEM_freeN(pbvh->prim_indices);
 
-		pbvh->prim_indices = MEM_mallocN(sizeof(int) * pbvh->totprim,
-										"bvh prim indices");
+		pbvh->prim_indices = MEM_mallocN(sizeof(int) * pbvh->totprim, "bvh prim indices");
 
 		//TODO: parent nodes need to be scaled as well
 		node->totprim += d_prim;
 		node->prim_indices = pbvh->prim_indices;
 
 		//Fill with all prim to test
-		for(int i = 0; i < pbvh->totprim; i++){
+		for (int i = 0; i < pbvh->totprim; i++) {
 			pbvh->prim_indices[i] = i;
 		}
 
@@ -559,11 +559,49 @@ void BKE_pbvh_attach_mesh(PBVH *pbvh, PBVHNode *node, Mesh *me, int totprim, flo
 
 		BKE_pbvh_node_mark_rebuild_draw(node);
 		printf("Attached new shape to pbvh.\n");
-	}else{
+	} else {
 		//TODO: Attach to multiple nodes.
 	}
 }
 
+void BKE_pbvh_build_mesh_complete(PBVH *pbvh, Mesh *me){
+	PBVHNode *root;
+	int looptri_num;
+
+	//BKE_pbvh_free(pbvh);
+	//pbvh = BKE_pbvh_new();
+
+	looptri_num = BKE_pbvh_recalc_looptri_from_me(pbvh, me);
+
+	BKE_pbvh_build_mesh( pbvh, me->mpoly, me->mloop, me->mvert,
+						me->totvert, &me->vdata,
+						pbvh->looptri, looptri_num);
+
+	/*pbvh_show_diffuse_color_set(pbvh, false);*/
+	root = BKE_pbvh_node_get_root(pbvh);
+
+	BKE_pbvh_node_mark_rebuild_draw(root);
+	BKE_pbvh_update( pbvh, root->flag, NULL);
+
+	/*if (root->flag & PBVH_RebuildDrawBuffers) {
+		root->draw_buffers = NULL;
+	} else if (root->draw_buffers){
+		MEM_freeN(root->draw_buffers);
+		root->draw_buffers = NULL;
+	}
+	root->draw_buffers = NULL;*/
+	/*printf("Buffers freed\n");
+	if (root->flag & PBVH_RebuildDrawBuffers) {
+		root->draw_buffers = NULL;
+	} else {
+		GPU_pbvh_buffers_free(root->draw_buffers);
+		root->draw_buffers = NULL;
+	}
+
+	BKE_pbvh_node_mark_rebuild_draw(root);
+
+	BKE_pbvh_update( pbvh, root->flag, NULL);*/
+}
 /**
  * Do a full rebuild with on Mesh data structure.
  *
@@ -1387,11 +1425,13 @@ BMesh *BKE_pbvh_get_bmesh(PBVH *bvh)
 
 /***************************** Node Access ***********************************/
 
-bool BKE_pbvh_node_is_valid(PBVHNode *node){
+bool BKE_pbvh_node_is_valid(PBVHNode *node)
+{
 	return node->flag; //TODO: check diffrent!
 }
 
-bool BKE_pbvh_node_is_leaf(PBVHNode *node){
+bool BKE_pbvh_node_is_leaf(PBVHNode *node)
+{
 	return node->flag & PBVH_Leaf;
 }
 
@@ -1486,30 +1526,34 @@ void BKE_pbvh_node_get_grids(
 	}
 }
 
-float get_bb_distance_sqr(BB a, BB b){
+static float get_bb_distance_sqr(BB a, BB b)
+{
 	float dist = 0.0f;
-	for(int i = 0; i < 3; i++){
-		if(a.bmin[i] >= b.bmax[i]){
+	for (int i = 0; i < 3; i++) {
+		if (a.bmin[i] >= b.bmax[i]) {
 			dist += (b.bmax[i] - a.bmin[i]) * (b.bmax[i] - a.bmin[i]);
-		}else if(a.bmax[i] < b.bmin[i]){
+		} else if (a.bmax[i] < b.bmin[i]) {
 			dist += (b.bmin[i] - a.bmax[i]) * (b.bmin[i] - a.bmax[i]);
 		}
 	}
 	return dist;
 }
 
-int BKE_pbvh_recalc_looptri_from_me(PBVH *pbvh, Mesh *me){
-	MEM_freeN(pbvh->looptri);
+int BKE_pbvh_recalc_looptri_from_me(PBVH *pbvh, Mesh *me)
+{
+	if(pbvh->looptri){
+		MEM_freeN((void*)pbvh->looptri);
+	}
 	MLoopTri *looptri = NULL;
 	int looptri_num = poly_to_tri_count(me->totpoly, me->totloop);
 	looptri = MEM_mallocN(sizeof(*looptri) * looptri_num, __func__);
 
 	BKE_mesh_recalc_looptri(
-							me->mloop, me->mpoly,
-							me->mvert,
-							me->totloop, me->totpoly,
-							looptri);
-	/*for(int i = 0; i < looptri_num; i++){
+	        me->mloop, me->mpoly,
+	        me->mvert,
+	        me->totloop, me->totpoly,
+	        looptri);
+	/*for (int i = 0; i < looptri_num; i++) {
 		printf("Tri (%i,%i,%i), Poly %i\n", looptri[i].tri[0], looptri[i].tri[1], looptri[i].tri[2], looptri[i].poly);
 	}*/
 
@@ -1517,12 +1561,13 @@ int BKE_pbvh_recalc_looptri_from_me(PBVH *pbvh, Mesh *me){
 	return looptri_num;
 }
 
-PBVHNode *BKE_search_closest_pbvh_leaf_node(PBVH *pbvh, PBVHNode *p_node, float *target_bmin, float *target_bmax){
+PBVHNode *BKE_search_closest_pbvh_leaf_node(PBVH *pbvh, PBVHNode *p_node, float *target_bmin, float *target_bmax)
+{
 	BB new_BB;
 	copy_v3_v3(new_BB.bmin,target_bmin);
 	copy_v3_v3(new_BB.bmax,target_bmax);
 	BB_expand_with_bb(&p_node->vb,&new_BB);
-	if(BKE_pbvh_node_is_leaf(p_node)){
+	if (BKE_pbvh_node_is_leaf(p_node)) {
 		return p_node;
 	}
 	PBVHNode *left = NULL, *right = NULL;
@@ -1532,18 +1577,18 @@ PBVHNode *BKE_search_closest_pbvh_leaf_node(PBVH *pbvh, PBVHNode *p_node, float
 	copy_v3_v3(bb_target.bmax,target_bmax);
 
 	BKE_pbvh_node_get_children(pbvh, p_node, &left, &right);
-	if((!left && !right)){
+	if ((!left && !right)) {
 		return p_node;
-	}else if(!left){
+	} else if (!left) {
 		return BKE_search_closest_pbvh_leaf_node(pbvh, right, bb_target.bmin, bb_target.bmax);
-	}else if(!right){
+	} else if (!right) {
 		return BKE_search_closest_pbvh_leaf_node(pbvh, left, bb_target.bmin, bb_target.bmax);
 	}
-	BKE_pbvh_node_get_BB(left,&bb_left.bmin,&bb_left.bmax);
-	BKE_pbvh_node_get_BB(right,&bb_right.bmin,&bb_right.bmax);
-	if(get_bb_distance_sqr(bb_target,bb_left) > get_bb_distance_sqr(bb_target,bb_right)){
+	BKE_pbvh_node_get_BB(left, bb_left.bmin, bb_left.bmax);
+	BKE_pbvh_node_get_BB(right, bb_right.bmin, bb_right.bmax);
+	if (get_bb_distance_sqr(bb_target,bb_left) > get_bb_distance_sqr(bb_target,bb_right)) {
 		return BKE_search_closest_pbvh_leaf_node(pbvh, right, bb_target.bmin, bb_target.bmax);
-	}else{
+	} else {
 		return BKE_search_closest_pbvh_leaf_node(pbvh, left, bb_target.bmin, bb_target.bmax);
 	}
 }
@@ -1561,12 +1606,14 @@ void BKE_pbvh_node_get_original_BB(PBVHNode *node, float bb_min[3], float bb_max
 	copy_v3_v3(bb_max, node->orig_vb.bmax);
 }
 
-void BKE_pbvh_node_get_children(PBVH *pbvh, PBVHNode *node, PBVHNode **left, PBVHNode **right){
+void BKE_pbvh_node_get_children(PBVH *pbvh, PBVHNode *node, PBVHNode **left, PBVHNode **right)
+{
 	*left = pbvh->nodes+node->children_offset;
 	*right = pbvh->nodes+node->children_offset+1;
 }
 
-PBVHNode *BKE_pbvh_node_get_root(PBVH *pbvh){
+PBVHNode *BKE_pbvh_node_get_root(PBVH *pbvh)
+{
 	return pbvh->nodes;
 }
 
diff --git a/source/blender/editors/sculpt_paint/sculpt.c b/source/blender/editors/sculpt_paint/sculpt.c
index e8146bd2188..e2c34c43240 100644
--- a/source/blender/editors/sculpt_paint/sculpt.c
+++ b/source/blender/editors/sculpt_paint/sculpt.c
@@ -109,17 +109,25 @@
 #include "BKE_editmesh.h"
 #include "BKE_editmesh_bvh.h"
 #include "ED_mesh.h"
+#include "BLI_polyfill2d.h"
+#include "BLI_polyfill2d_beautify.h"
+#include "BLI_memarena.h"
+#include "BLI_heap.h"
+#include "BLI_edgehash.h"
+#include "BLI_linklist.h"
+#include "BLI_alloca.h"
 
 #define DEBUG_DRAW
 #ifdef DEBUG_DRAW
-static void bl_debug_draw(void);
+// static void bl_debug_draw(void);
 /* add these locally when using these functions for testing */
 extern void bl_debug_draw_quad_clear(void);
 extern void bl_debug_draw_quad_add(const float v0[3], const float v1[3], const float v2[3], const float v3[3]);
 extern void bl_debug_draw_edge_add(const float v0[3], const float v1[3]);
 extern void bl_debug_color_set(const unsigned int col);
 
-void bl_debug_draw_point(const float pos[3],const float thickness){
+static void bl_debug_draw_point(const float pos[3],const float thickness)
+{
 	float h = thickness*0.5;
 	float v1[] = {pos[0]-h,pos[1]-h,pos[2]};
 	float v2[] = {pos[0]-h,pos[1]+h,pos[2]};
@@ -5023,8 +5031,85 @@ typedef struct {
 	float bmin[3], bmax[3];
 } BB;
 
+#if 0
+//taken from RecastMeshDetail.cpp
+static int triangulateHull(const float* verts, const int nhull, const int* hull, int *tris)
+{
+	int start = 0, left = 1, right = nhull-1, tri_pos = 0;
+
+	// Start from an ear with shortest perimeter.
+	// This tends to favor well formed triangles as starting point.
+	float dmin = 0;
+	for (int i = 0; i < nhull; i++)
+	{
+		int pi = i-1 >= 0 ? i-1 : nhull-1;
+		int ni = i+1 < nhull ? i+1 : 0;
+		const float* pv = &verts[hull[pi]*2];
+		const float* cv = &verts[hull[i]*2];
+		const float* nv = &verts[hull[ni]*2];
+		const float d = len_v2v2(pv,cv) + len_v2v2(cv,nv) + len_v2v2(nv,pv);
+		if (d < dmin)
+		{
+			start = i;
+			left = ni;
+			right = pi;
+			dmin = d;
+		}
+	}
+
+	// Add first triangle
+	tris[tri_pos] = hull[start];
+	tri_pos++;
+	tris[tri_pos] = hull[left];
+	tri_pos++;
+	tris[tri_pos] = hull[right];
+	tri_pos++;
+
+	// Triangulate the polygon by moving left or right,
+	// depending on which triangle has shorter perimeter.
+	// This heuristic was chose emprically, since it seems
+	// handle tesselated straight edges well.
+	while ((left+1 < nhull ? left+1 : 0) != right)
+	{
+		// Check to see if se should advance left or right.
+		int nleft = (left+1 < nhull ? left+1 : 0);
+		int nrig

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list