[Bf-blender-cvs] [781a7f0822a] soc-2017-sculpting_improvements: Generating Tri array for later intersection testing.
Sebastian Witt
noreply at git.blender.org
Wed Aug 9 13:20:01 CEST 2017
Commit: 781a7f0822a479ce3fc131a37d4be484000c231c
Author: Sebastian Witt
Date: Wed Aug 9 13:18:38 2017 +0200
Branches: soc-2017-sculpting_improvements
https://developer.blender.org/rB781a7f0822a479ce3fc131a37d4be484000c231c
Generating Tri array for later intersection testing.
===================================================================
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 a6186a4ee05..690a50208f5 100644
--- a/source/blender/blenkernel/BKE_pbvh.h
+++ b/source/blender/blenkernel/BKE_pbvh.h
@@ -363,6 +363,7 @@ void BKE_pbvh_node_get_bm_orco_data(
bool BKE_pbvh_node_vert_update_check_any(PBVH *bvh, PBVHNode *node);
+void BKE_pbvh_get_node_tris_from_verts(PBVH *bvh, PBVHNode *curr_node, GHash *vert_hash, struct MLoopTri **tris, int *r_tot_tris);
//void BKE_pbvh_node_BB_reset(PBVHNode *node);
//void BKE_pbvh_node_BB_expand(PBVHNode *node, float co[3]);
diff --git a/source/blender/blenkernel/intern/pbvh.c b/source/blender/blenkernel/intern/pbvh.c
index 0deccc7019f..aabc72c85ac 100644
--- a/source/blender/blenkernel/intern/pbvh.c
+++ b/source/blender/blenkernel/intern/pbvh.c
@@ -58,6 +58,9 @@
#define PBVH_THREADED_LIMIT 4
+/*TODO: Usefull?*/
+#define TRI_ARRAY_GROW 50
+
typedef struct PBVHStack {
PBVHNode *node;
bool revisiting;
@@ -1561,6 +1564,39 @@ int BKE_pbvh_recalc_looptri_from_me(PBVH *pbvh, Mesh *me)
return looptri_num;
}
+void BKE_pbvh_get_node_tris_from_verts(PBVH *bvh, PBVHNode *node, GHash *vert_hash, MLoopTri **r_tris, int *r_tot_tris)
+{
+
+ const int *faces = node->prim_indices;
+ const MLoop *mloop = bvh->mloop;
+ int totface = node->totprim;
+ MLoopTri *tris;
+ int r_tris_max;
+ /* Estimated that every vert has roughly two tris in a uniform mesh*/
+ tris = MEM_callocN(sizeof(MLoopTri) * BLI_ghash_size(vert_hash) * 2, "tris connected to verts");
+ r_tris_max = BLI_ghash_size(vert_hash) * 2;
+ *r_tot_tris = 0;
+
+ for (int i = 0; i < totface; i++) {
+ const MLoopTri lt = bvh->looptri[faces[i]];
+ /* TODO: Original or not etc?
+ const int *face_verts = node->face_vert_indices[i];*/
+ for(int s = 0; s < 3; s++) {
+ if (BLI_ghash_haskey(vert_hash, SET_INT_IN_POINTER(mloop[lt.tri[s]].v))) {
+ if (*r_tot_tris >= r_tris_max) {
+ r_tris_max += TRI_ARRAY_GROW;
+ tris = MEM_reallocN(tris, sizeof(MLoopTri) * r_tris_max);
+ }
+ tris[*r_tot_tris] = lt;
+ *r_tot_tris += 1;
+ break;
+ }
+ }
+ }
+
+ *r_tris = tris;
+}
+
PBVHNode *BKE_search_closest_pbvh_leaf_node(PBVH *pbvh, PBVHNode *p_node, float *target_bmin, float *target_bmax)
{
BB new_BB;
diff --git a/source/blender/editors/sculpt_paint/sculpt.c b/source/blender/editors/sculpt_paint/sculpt.c
index 67b836cac8a..eb9454461ca 100644
--- a/source/blender/editors/sculpt_paint/sculpt.c
+++ b/source/blender/editors/sculpt_paint/sculpt.c
@@ -7712,10 +7712,10 @@ static void do_calc_fillet_line_task_cb_ex(void *userdata, void *UNUSED(userdata
{
SculptThreadedTaskData *data = userdata;
SculptSession *ss = data->ob->sculpt;
+ PBVH *bvh = ss->pbvh;
SilhouetteData *sil = data->sil;
Mesh *me = data->ob->data;
PBVHNode *curr_node = data->nodes[n];
-
PBVHVertexIter vd;
float point[2], p_on_plane[3], delta_p[3];
float sil_plane[4];
@@ -7731,6 +7731,8 @@ static void do_calc_fillet_line_task_cb_ex(void *userdata, void *UNUSED(userdata
BLI_array_declare(edge_ring_fillet);
BLI_array_declare(ring_start);
int comp_v, idx;
+ MLoopTri *tris = NULL;
+ int tot_tris;
/*GHashIterState state;*/
GHashIterator gh_iter;
@@ -7773,6 +7775,10 @@ static void do_calc_fillet_line_task_cb_ex(void *userdata, void *UNUSED(userdata
}
BKE_pbvh_vertex_iter_end;
+
+ /*TODO: tris need to be freed somewhere!*/
+ BKE_pbvh_get_node_tris_from_verts(bvh, curr_node, vert_hash, &tris, &tot_tris);
+
/* Finished writing all vertices which are within the intersection and need to be removed.
* write them to the shared array. Lock the mutex to avoid collisions */
BLI_mutex_lock(&data->mutex);
@@ -8051,6 +8057,7 @@ static int sculpt_silhouette_modal(bContext *C, wmOperator *op, const wmEvent *e
return OPERATOR_FINISHED;
} else {
if (sil->state == SIL_DRAWING) {
+ /*TODO: Add spacing */
sculpt_silhouette_stroke_update(mouse, op->customdata);
}
return OPERATOR_RUNNING_MODAL;
More information about the Bf-blender-cvs
mailing list