diff options
author | Sebastian Witt <sebastian.witt@rwth-aachen.de> | 2017-08-29 17:51:29 +0300 |
---|---|---|
committer | Sebastian Witt <sebastian.witt@rwth-aachen.de> | 2017-08-29 17:51:29 +0300 |
commit | f428554df4211aab083e6fe5fbfe9e01fd30704c (patch) | |
tree | 1634334545055e5b82d06f31935c0af2e171d80c /source/blender/editors/sculpt_paint/sculpt.c | |
parent | 0c24cb542df3eda8ed6590700dd0ad7f662b2b49 (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.c | 42 |
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); } |