[Bf-blender-cvs] [ce2671b0e29] soc-2017-sculpting_improvements: Fixed some issues when inserting new meshdata into a pbvh.

witt noreply at git.blender.org
Fri Jun 9 17:32:23 CEST 2017


Commit: ce2671b0e29ba91e38d88858d5f5aba387d4e0c2
Author: witt
Date:   Fri Jun 9 17:27:52 2017 +0200
Branches: soc-2017-sculpting_improvements
https://developer.blender.org/rBce2671b0e29ba91e38d88858d5f5aba387d4e0c2

Fixed some issues when inserting new meshdata into a pbvh.

Buffers now get reset and primitives are written.
Works for the simplest cornercase: Alt+Leftclick draw on a mesh with one node outside of that node.

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

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 23b67ff85de..d6bdca81b38 100644
--- a/source/blender/blenkernel/BKE_pbvh.h
+++ b/source/blender/blenkernel/BKE_pbvh.h
@@ -62,7 +62,7 @@ typedef void (*BKE_pbvh_HitOccludedCallback)(PBVHNode *node, void *data, float *
 /* Building */
 
 PBVH *BKE_pbvh_new(void);
-void BKE_pbvh_attach_mesh(PBVH *pbvh, PBVHNode *node, Mesh *me, int totvert, 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);
 void BKE_pbvh_build_mesh(
         PBVH *bvh,
         const struct MPoly *mpoly, const struct MLoop *mloop,
@@ -195,7 +195,7 @@ void BKE_pbvh_node_get_verts(
         PBVH *bvh, PBVHNode *node,
         const int **r_vert_indices, struct MVert **r_verts);
 
-void BKE_pbvh_recalc_looptri_from_me(PBVH *pbvh, Mesh *me);
+int BKE_pbvh_recalc_looptri_from_me(PBVH *pbvh, Mesh *me);
 PBVHNode *BKE_search_closest_pbvh_leaf_node(PBVH *pbvh, PBVHNode *p_node, float *target_bmin, float *target_bmax);
 
 void BKE_pbvh_node_get_BB(PBVHNode *node, float bb_min[3], float bb_max[3]);
diff --git a/source/blender/blenkernel/intern/pbvh.c b/source/blender/blenkernel/intern/pbvh.c
index c3d814c8109..fe3b44e8b76 100644
--- a/source/blender/blenkernel/intern/pbvh.c
+++ b/source/blender/blenkernel/intern/pbvh.c
@@ -519,16 +519,46 @@ 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 totvert, 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;
 
-	if(totvert <= pbvh->leaf_limit){
+	/*for(int i = 0; i < pbvh->totprim; i++){
+		printf("%i,",pbvh->prim_indices[i]);
+	}*/
+
+	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");
+
+		//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++){
+			pbvh->prim_indices[i] = i;
+		}
+
 		BB_expand_with_bb( &node->vb, &new_BB);
 
-		//build_mesh_leaf_node(pbvh, node);
+		pbvh->verts = me->mvert;
+		pbvh->mloop = me->mloop;
+		pbvh->mpoly = me->mpoly;
+
+		build_mesh_leaf_node(pbvh, node);
+
+		MEM_freeN(node->draw_buffers);
+		node->draw_buffers = NULL;
+
+		BKE_pbvh_node_mark_rebuild_draw(node);
+		printf("Attached new shape to pbvh.\n");
 	}else{
 		//TODO: Attach to multiple nodes.
 	}
@@ -1468,9 +1498,9 @@ float get_bb_distance_sqr(BB a, BB b){
 	return dist;
 }
 
-void BKE_pbvh_recalc_looptri_from_me(PBVH *pbvh, Mesh *me){
+int BKE_pbvh_recalc_looptri_from_me(PBVH *pbvh, Mesh *me){
 	MEM_freeN(pbvh->looptri);
-	MLoopTri *looptri;
+	MLoopTri *looptri = NULL;
 	int looptri_num = poly_to_tri_count(me->totpoly, me->totloop);
 	looptri = MEM_mallocN(sizeof(*looptri) * looptri_num, __func__);
 
@@ -1479,7 +1509,12 @@ void BKE_pbvh_recalc_looptri_from_me(PBVH *pbvh, Mesh *me){
 							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);
+	}*/
+
 	pbvh->looptri = looptri;
+	return looptri_num;
 }
 
 PBVHNode *BKE_search_closest_pbvh_leaf_node(PBVH *pbvh, PBVHNode *p_node, float *target_bmin, float *target_bmax){
diff --git a/source/blender/editors/sculpt_paint/sculpt.c b/source/blender/editors/sculpt_paint/sculpt.c
index ba5667fbb08..e8146bd2188 100644
--- a/source/blender/editors/sculpt_paint/sculpt.c
+++ b/source/blender/editors/sculpt_paint/sculpt.c
@@ -5219,78 +5219,74 @@ void silhouette_create_shape_mesh(const bContext *C, Mesh *me, SilhouetteData *s
 	float v_offset[3] = {0.0f,0.0f,1.0f};
 	ED_view3d_global_to_vector(sil->ar->regiondata, (float[3]){0.0f,0.0f,0.0f}, v_offset);
 
-	ED_mesh_vertices_add(me, NULL, stroke->totvert*2);//Barely used is there a better one?
-
-	MVert nu_vert;
-	nu_vert.flag = 0;
-	nu_vert.bweight = 0;
-	for(int i = 0; i < stroke->totvert; i ++){
-		float v1[3], zDepth[3] = {0.0f,0.0f,0.0f};
-
-		ED_view3d_win_to_3d(v3d, sil->ar, zDepth, stroke->points+i*2, v1);
-		copy_v3_v3(nu_vert.co,v1);
-		me->mvert[me->totvert-stroke->totvert*2+i*2] = nu_vert;
-		copy_v3_v3(nu_vert.co,v1);
-		add_v3_v3(nu_vert.co,v_offset);
-		me->mvert[me->totvert-stroke->totvert*2+i*2+1] = nu_vert;
-	}
-
+	float v1[3], zDepth[3] = {0.0f,0.0f,0.0f};
+	int vstart = me->totvert, estart = me->totedge, lstart = me->totloop, pstart = me->totpoly;
+	ED_mesh_vertices_add(me, NULL, stroke->totvert*2);
 	ED_mesh_edges_add(me, NULL, stroke->totvert*3-2);
+	ED_mesh_loops_add(me, NULL, stroke->totvert*4-4);
+	ED_mesh_polys_add(me, NULL, stroke->totvert-1);
+	for(int i = 0; i < stroke->totvert; i++){
+		//Add Verts
+		MVert ref_v;
+		ref_v.flag = 0; ref_v.bweight = 0;
+		ED_view3d_win_to_3d(v3d, sil->ar, zDepth, stroke->points+i*2, v1);
+		copy_v3_v3(ref_v.co,v1);
+		me->mvert[vstart] = ref_v;
+		vstart ++;
+		add_v3_v3(ref_v.co,v_offset);
+		me->mvert[vstart] = ref_v;
+		vstart ++;
+
+		//Add Edges
+		MEdge ref_e;
+		ref_e.crease = 0; ref_e.bweight = 0; ref_e.flag = 0;
+		ref_e.v1 = vstart-2;
+		ref_e.v2 = vstart-1;
+		me->medge[estart] = ref_e;
+		estart ++;
+		if(i < stroke->totvert-1){
+			ref_e.v1 = vstart-2;
+			ref_e.v2 = vstart;
+			me->medge[estart] = ref_e;
+			estart ++;
+			ref_e.v1 = vstart-1;
+			ref_e.v2 = vstart+1;
+			me->medge[estart] = ref_e;
+			estart ++;
+		}
 
-	MEdge nu_edge;
-	nu_edge.crease = 0;
-	nu_edge.bweight = 0;
-	nu_edge.flag = 0;
-	for(int i = 0; i < stroke->totvert-1; i ++){
-		nu_edge.v1 = me->totvert-stroke->totvert*2+i*2;
-		nu_edge.v2 = me->totvert-stroke->totvert*2+i*2+1;
-		me->medge[me->totedge-stroke->totvert*3+2 + i*3] = nu_edge;
-
-		nu_edge.v1 = me->totvert-stroke->totvert*2+i*2;
-		nu_edge.v2 = me->totvert-stroke->totvert*2+i*2+2;
-		me->medge[me->totedge-stroke->totvert*3+2 + i*3+1] = nu_edge;
-
-		nu_edge.v1 = me->totvert-stroke->totvert*2+i*2+1;
-		nu_edge.v2 = me->totvert-stroke->totvert*2+i*2+3;
-		me->medge[me->totedge-stroke->totvert*3+2 + i*3+2] = nu_edge;
-	}
-	nu_edge.v1 = me->totvert-2;
-	nu_edge.v2 = me->totvert-1;
-	me->medge[me->totedge-1] = nu_edge;
-
-	/*ED_mesh_loops_add(me, NULL, stroke->totvert*4-4);
-	MLoop nu_loop;
-	for(int i = 0; i < stroke->totvert-1; i++){
-		nu_loop.v = me->totvert-stroke->totvert*2+i*2;
-		nu_loop.e = me->totedge-stroke->totvert*3+2+i*2;
-		me->mloop[me->totloop-stroke->totvert*4+i*4+4] = nu_loop;
-
-		nu_loop.v = me->totvert-stroke->totvert*2+1+i*2;
-		nu_loop.e = me->totedge-stroke->totvert*3+4+i*2;
-		me->mloop[me->totloop-stroke->totvert*4+i*4+5] = nu_loop;
-
-		nu_loop.v = me->totvert-stroke->totvert*2+3+i*2;
-		nu_loop.e = me->totedge-stroke->totvert*3+5+i*2;
-		me->mloop[me->totloop-stroke->totvert*4+i*4+6] = nu_loop;
+		//Add Loops
+		MLoop ref_l;
+		if(i < stroke->totvert-1){
+			ref_l.v = vstart-2;
+			ref_l.e = estart-3;
+			me->mloop[lstart] = ref_l;
+			lstart ++;
+			ref_l.v = vstart-1;
+			ref_l.e = estart-1;
+			me->mloop[lstart] = ref_l;
+			lstart ++;
+			ref_l.v = vstart+1;
+			ref_l.e = estart;
+			me->mloop[lstart] = ref_l;
+			lstart ++;
+			ref_l.v = vstart;
+			ref_l.e = estart-2;
+			me->mloop[lstart] = ref_l;
+			lstart ++;
+		}
 
-		nu_loop.v = me->totvert-stroke->totvert*2+2+i*2;
-		nu_loop.e = me->totedge-stroke->totvert*3+3+i*2;
-		me->mloop[me->totloop-stroke->totvert*4+i*4+7] = nu_loop;
+		//Add Poly
+		MPoly ref_p;
+		ref_p.mat_nr = 0; ref_p.flag = 0; ref_p.pad = 0;
+		if(i < stroke->totvert-1){
+			ref_p.loopstart = lstart-4;
+			ref_p.totloop = 4;
+			me->mpoly[pstart] = ref_p;
+			pstart ++;
+		}
 	}
 
-	//Loops
-	ED_mesh_polys_add(me, NULL, stroke->totvert-1);
-
-	MPoly nu_poly;
-	nu_poly.mat_nr = 0;
-	nu_poly.flag = 0;
-	nu_poly.pad = 0;
-	for(int i = 0; i < stroke->totvert-1; i++){
-		nu_poly.totloop = 4;
-		nu_poly.loopstart = me->totloop-stroke->totvert*4+4+i*4;
-		me->mpoly[me->totpoly-stroke->totvert+i+1] = nu_poly;
-	}*/
-
 	//ED_mesh_update(me, C, 1, 1);
 
 	//Extend BB
@@ -5303,6 +5299,34 @@ void silhouette_create_shape_mesh(const bContext *C, Mesh *me, SilhouetteData *s
 	}
 }
 
+void debug_mesh(Mesh *me){
+	printf("Logging Mesh:\n");
+	printf("Verts in mesh %i\n",me->totvert);
+	printf("Edges in mesh %i\n",me->totedge);
+	printf("Loops in mesh %i\n",me->totloop);
+	printf("Polys in mesh %i\n",me->totpoly);
+
+	printf("\nVert log:\n");
+	for(int i = 0; i < me->totvert; i++){
+		printf("\nVert %i (%f,%f,%f)", i, me->mvert[i].co[0], me->mvert[i].co[1], me->mvert[i].co[2]);
+	}
+
+	printf("\nEdge log:\n");
+	for(int i = 0; i < me->totedge;i++){
+		printf("Edge %i, v1v2(%i,%i)\n",i,me->medge[i].v1,me->medge[i].v2);
+	}
+
+	printf("\nLoop Log:\n");
+	for(int i = 0; i < me->totloop; i++){
+		printf("Loop %i, v(%i), e(%i)\n", i, me->mloop[i].v, me->mloop[i].e);
+	}
+
+	printf("\nPoly log:\n");
+	for(int i = 0; i < me->totpoly; i++){
+		printf("Poly %i, start(%i), totloop(%i)\n", i, me->mpoly[i].loopstart, me->mpoly[i].totloop);
+	}
+}
+
 static void sculpt_silhouette_stroke_done(const bContext *C, wmOperator *op)
 {
 	/*finalize stroke*/
@@ -5391,7 +5415,10 @@ static void sculpt_silhouette_stroke_done(const bContext *C, wmOperator *op)
 		PBVHNode *closest_node;
 
 		silhouette_create_shape_mesh(C, me, sil, stroke, v3d, &shape_bb);
-		BKE_pbvh_recalc_looptri_from_me(pbvh, me);
+
+		int totprim = BKE_pbvh_recalc_looptri_from_me(pbvh, me);
+
+
 
 		root = BKE_pbvh_node_get_root(pbvh);
 		closest_node = BKE_search_closest_pbvh_leaf_node(pbvh, root, &shape_bb.bmin, &shape_bb.bmax);
@@ -5401,10 +5428,10 @@ static void sculpt_silhouette_stroke_done(const bContext *C, wmOperator *op)
 		bl_debug_draw_BB_add(&res_bb,0xFF0000);
 		bl_debug_draw_BB_add(&shape_bb,0xFF0000);
 
-

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list