[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