Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSebastian Witt <sebastian.witt@rwth-aachen.de>2017-08-29 17:51:29 +0300
committerSebastian Witt <sebastian.witt@rwth-aachen.de>2017-08-29 17:51:29 +0300
commitf428554df4211aab083e6fe5fbfe9e01fd30704c (patch)
tree1634334545055e5b82d06f31935c0af2e171d80c /source/blender/editors/sculpt_paint/sculpt.c
parent0c24cb542df3eda8ed6590700dd0ad7f662b2b49 (diff)
Fixed a really hard to find crasher bug and a lot of mesh issues!
Diffstat (limited to 'source/blender/editors/sculpt_paint/sculpt.c')
-rw-r--r--source/blender/editors/sculpt_paint/sculpt.c42
1 files changed, 38 insertions, 4 deletions
diff --git a/source/blender/editors/sculpt_paint/sculpt.c b/source/blender/editors/sculpt_paint/sculpt.c
index 74fef34d63b..448746d8523 100644
--- a/source/blender/editors/sculpt_paint/sculpt.c
+++ b/source/blender/editors/sculpt_paint/sculpt.c
@@ -8928,7 +8928,6 @@ static void remove_verts_from_mesh(Mesh *me, int *v_to_rm, int num_v_to_rm){
/* MT: same as above
* Calculate new loop positions + remap edge pointers */
l_rd_table = MEM_callocN(sizeof(int) * me->totloop, "Loop redirect table");
- n_totloop = 0;
for (int i = 0; i < me->totloop; i++) {
l = me->mloop[i];
if(v_rd_table[l.v] == -1 || e_rd_table[l.e] == -1) {
@@ -8937,12 +8936,12 @@ static void remove_verts_from_mesh(Mesh *me, int *v_to_rm, int num_v_to_rm){
l.v = v_rd_table[l.v];
l.e = e_rd_table[l.e];
me->mloop[i] = l;
- l_rd_table[i] = n_totloop;
- n_totloop ++;
+ l_rd_table[i] = 1;
}
}
/* MT: same as above
+ * Subtract unused loops
* Calculate new poly positions + remap pointers */
p_rd_table = MEM_callocN(sizeof(int) * me->totpoly, "Poly redirect table");
n_totpoly = 0;
@@ -8951,16 +8950,36 @@ static void remove_verts_from_mesh(Mesh *me, int *v_to_rm, int num_v_to_rm){
for(int l = p.loopstart; l < p.loopstart + p.totloop; l++){
if(l_rd_table[l] == -1) {
p_rd_table[i] = -1;
+ /* Subtract unused loops */
+ for(int l2 = p.loopstart; l2 < p.loopstart + p.totloop; l2++){
+ l_rd_table[l2] = -1;
+ }
/* TODO: Bad practise? easily solved other way*/
goto skip_poly;
}
}
- me->mpoly[i].loopstart = l_rd_table[me->mpoly[i].loopstart];
p_rd_table[i] = n_totpoly;
n_totpoly ++;
skip_poly:;
}
+ /* Scan/Prefix sum the valid loops */
+ n_totloop = 0;
+ for (int i = 0; i < me->totloop; i++) {
+ if(l_rd_table[i] != -1) {
+ l_rd_table[i] = n_totloop;
+ n_totloop ++;
+ }
+ }
+
+ /* Polys need to be iterated twice since loops depend on polys and vice versa. */
+ for (int i = 0; i < me->totpoly; i++) {
+ if (p_rd_table[i] != -1) {
+ p = me->mpoly[i];
+ me->mpoly[i].loopstart = l_rd_table[me->mpoly[i].loopstart];
+ }
+ }
+
/*Redirection tables are done. Continue to copy and allocate new Customdata blocks*/
CustomData_copy(&me->vdata, &vdata, CD_MASK_EVERYTHING, CD_CALLOC, n_totvert);
CustomData_copy(&me->edata, &edata, CD_MASK_EVERYTHING, CD_CALLOC, n_totedge);
@@ -9256,6 +9275,7 @@ static void sculpt_silhouette_calc_mesh(bContext *C, wmOperator *op)
SculptSession *ss = ob->sculpt;
PBVH *bvh = ss->pbvh;
SculptSearchBBData data;
+ Scene *scene = CTX_data_scene(C);
PBVHNode **nodes = NULL;
SilhouetteStroke *stroke = sil->current_stroke;
@@ -9293,6 +9313,20 @@ static void sculpt_silhouette_calc_mesh(bContext *C, wmOperator *op)
DAG_id_tag_update(&me->id, 0);
WM_event_add_notifier(C, NC_GEOM | ND_DATA, me);
+ /*bool test_out;
+ if(!BKE_mesh_validate_arrays(me,
+ me->mvert, me->totvert,
+ me->medge, me->totedge,
+ me->mface, me->totface,
+ me->mloop, me->totloop,
+ me->mpoly, me->totpoly,
+ me->dvert,
+ true, false,
+ &test_out))
+ {
+ printf("Mesh invalid.\n");
+ }*/
+
BKE_object_free_derived_caches(ob);
}