[Bf-blender-cvs] [5e1d75247db] soc-2017-sculpting_improvements: Fix holes bug in fillets.
Sebastian Witt
noreply at git.blender.org
Tue Aug 22 11:13:56 CEST 2017
Commit: 5e1d75247db2aae8dda7e296d70c1fbdc568140f
Author: Sebastian Witt
Date: Tue Aug 22 11:13:17 2017 +0200
Branches: soc-2017-sculpting_improvements
https://developer.blender.org/rB5e1d75247db2aae8dda7e296d70c1fbdc568140f
Fix holes bug in fillets.
===================================================================
M source/blender/editors/sculpt_paint/sculpt.c
===================================================================
diff --git a/source/blender/editors/sculpt_paint/sculpt.c b/source/blender/editors/sculpt_paint/sculpt.c
index 45219f0d646..98f71b94cfe 100644
--- a/source/blender/editors/sculpt_paint/sculpt.c
+++ b/source/blender/editors/sculpt_paint/sculpt.c
@@ -8078,6 +8078,15 @@ static void find_closest_exact_p(float e1[3], float e2[3], float *exact_p, int t
closest_seg_seg_v3(r, p1, p2, e1, e2);
}
+static int cyclic_dist (int a, int b, int a_size, bool invert)
+{
+ if (invert) {
+ return (a_size + a - b) % a_size;
+ } else {
+ return (a_size + b - a) % a_size;
+ }
+}
+
static void gen_fillet_velp(Mesh *me,
float *exact_p, int exact_p_tot,
int *a_verts, int *b_verts,
@@ -8087,9 +8096,11 @@ static void gen_fillet_velp(Mesh *me,
{
/*If aligned exact points are aligned to a*/
float v1[3], v2[3];
- int v_start, e_start, l_pos, p_start;
- int holes = 0, next_i, aoff, boff, hole, hole_edges = 0;
+ int v_start, e_start, l_pos, p_pos, e_pos;
+ int holes = 0, next_i, aoff, boff, hole, hole_edges = 0, hole_size;
int *hole_pos = NULL;
+ int av, bv, cv, ae, be, ce;
+ int j;
BLI_array_declare(hole_pos);
aoff = me->medge[a_edges[0]].v1 == a_verts[0] ? 0 : 1;
@@ -8142,9 +8153,9 @@ static void gen_fillet_velp(Mesh *me,
}
l_pos = me->totloop;
- p_start = me->totpoly;
- ED_mesh_loops_add(me, NULL, a_size * 7 + (b_size - holes));
- ED_mesh_polys_add(me, NULL, a_size * 2);
+ p_pos = me->totpoly;
+ ED_mesh_loops_add(me, NULL, a_size * 7 + (b_size - holes) + 6 * holes);
+ ED_mesh_polys_add(me, NULL, a_size * 2 + hole_edges + holes);
for (int i = 0; i < a_size; i++) {
next_i = (i + 1) % a_size;
me->mloop[l_pos].v = a_verts[i];
@@ -8160,10 +8171,12 @@ static void gen_fillet_velp(Mesh *me,
me->mloop[l_pos].e = a_edges[(i + aoff) % a_size];
l_pos ++;
- me->mpoly[p_start + i * 2].loopstart = l_pos - 4;
- me->mpoly[p_start + i * 2].totloop = 4;
- me->mpoly[p_start + i * 2].mat_nr = 0;
- me->mpoly[p_start + i * 2].flag = 0;
+ me->mpoly[p_pos].loopstart = l_pos - 4;
+ me->mpoly[p_pos].totloop = 4;
+ me->mpoly[p_pos].mat_nr = 0;
+ me->mpoly[p_pos].flag = 0;
+
+ p_pos ++;
if (map[i] == map[next_i]) {
/*Triangle*/
@@ -8177,37 +8190,108 @@ static void gen_fillet_velp(Mesh *me,
me->mloop[l_pos].e = e_start + 3 * i + 1;
l_pos ++;
- me->mpoly[p_start + i * 2 + 1].loopstart = l_pos - 3;
- me->mpoly[p_start + i * 2 + 1].totloop = 3;
+ me->mpoly[p_pos].loopstart = l_pos - 3;
+ me->mpoly[p_pos].totloop = 3;
+ me->mpoly[p_pos].mat_nr = 0;
+ me->mpoly[p_pos].flag = 0;
+
+ p_pos ++;
} else {
- /* Quad */
- me->mloop[l_pos].v = v_start + i;
- me->mloop[l_pos].e = e_start + 3 * i + 2;
- l_pos ++;
- me->mloop[l_pos].v = b_verts[map[i]];
- me->mloop[l_pos].e = b_edges[(map[i] + boff) % a_size];
- l_pos ++;
- me->mloop[l_pos].v = b_verts[map[next_i]];
- me->mloop[l_pos].e = e_start + 3 * next_i + 2;
- l_pos ++;
- me->mloop[l_pos].v = v_start + next_i;
- me->mloop[l_pos].e = e_start + 3 * i + 1;
- l_pos ++;
+ if (cyclic_dist(map[i], map[next_i], b_size, inverse) <= 1) {
+ /* Quad */
+ me->mloop[l_pos].v = v_start + i;
+ me->mloop[l_pos].e = e_start + 3 * i + 2;
+ l_pos ++;
+ me->mloop[l_pos].v = b_verts[map[i]];
+ me->mloop[l_pos].e = b_edges[(map[i] + boff) % a_size];
+ l_pos ++;
+ me->mloop[l_pos].v = b_verts[map[next_i]];
+ me->mloop[l_pos].e = e_start + 3 * next_i + 2;
+ l_pos ++;
+ me->mloop[l_pos].v = v_start + next_i;
+ me->mloop[l_pos].e = e_start + 3 * i + 1;
+ l_pos ++;
+
+ me->mpoly[p_pos].loopstart = l_pos - 4;
+ me->mpoly[p_pos].totloop = 4;
+ me->mpoly[p_pos].mat_nr = 0;
+ me->mpoly[p_pos].flag = 0;
- me->mpoly[p_start + i * 2 + 1].loopstart = l_pos - 4;
- me->mpoly[p_start + i * 2 + 1].totloop = 4;
+ p_pos ++;
+ }
}
- me->mpoly[p_start + i * 2 + 1].mat_nr = 0;
- me->mpoly[p_start + i * 2 + 1].flag = 0;
}
- /*if (hole_edges > 0) {
+ hole_edges += holes;
+ if (hole_edges > 0) {
+ e_pos = me->totedge;
ED_mesh_edges_add(me, NULL, hole_edges);
}
- for (int i = 0; i < holes; i++) {
+ for (int i = 0; i < BLI_array_count(hole_pos); i++) {
+ hole_size = cyclic_dist(map[hole_pos[i]], map[(hole_pos[i] + 1) % a_size], b_size, inverse) - 1;
+ ae = e_start + 3 * hole_pos[i] + 2;
+ cv = me->medge[e_start + 3 * hole_pos[i] + 2].v2;
+ bv = me->medge[e_start + 3 * hole_pos[i] + 2].v1;
+ for (j = 0; j < hole_size; j++) {
+ be = b_edges[(b_size + map[hole_pos[i]] + (inverse ? -j : j + 1)) % b_size];
+ me->mloop[l_pos].v = bv;
+ me->mloop[l_pos].e = ae;
+ l_pos ++;
- }*/
+ me->mloop[l_pos].v = cv;
+ me->mloop[l_pos].e = be;
+ l_pos ++;
+
+ av = me->medge[be].v1 == cv ? me->medge[be].v2 : me->medge[be].v1;
+
+ me->medge[e_pos].v1 = av;
+ me->medge[e_pos].v2 = bv;
+ me->medge[e_pos].crease = 0;
+ me->medge[e_pos].bweight = 0;
+ me->medge[e_pos].flag = 0;
+ ce = e_pos;
+ e_pos ++;
+
+ me->mloop[l_pos].v = av;
+ me->mloop[l_pos].e = ce;
+ l_pos ++;
+
+ me->mpoly[p_pos].loopstart = l_pos - 3;
+ me->mpoly[p_pos].totloop = 3;
+ me->mpoly[p_pos].mat_nr = 0;
+ me->mpoly[p_pos].flag = 0;
+
+ p_pos ++;
+
+ ae = ce;
+ cv = av;
+ }
+
+ be = b_edges[(b_size + map[hole_pos[i]] + (inverse ? -j : j + 1)) % b_size];
+ me->mloop[l_pos].v = bv;
+ me->mloop[l_pos].e = ae;
+ l_pos ++;
+
+ me->mloop[l_pos].v = av;
+ me->mloop[l_pos].e = be;
+ l_pos ++;
+
+ me->mloop[l_pos].v = me->medge[e_start + 3 * ((hole_pos[i] + 1) % a_size) + 2].v2;
+ me->mloop[l_pos].e = e_start + 3 * ((hole_pos[i] + 1) % a_size) + 2;
+ l_pos ++;
+
+ me->mloop[l_pos].v = me->medge[e_start + 3 * ((hole_pos[i] + 1) % a_size) + 2].v1;
+ me->mloop[l_pos].e = e_start + 3 * hole_pos[i] + 1;
+ l_pos ++;
+
+ me->mpoly[p_pos].loopstart = l_pos - 4;
+ me->mpoly[p_pos].totloop = 4;
+ me->mpoly[p_pos].mat_nr = 0;
+ me->mpoly[p_pos].flag = 0;
+
+ p_pos ++;
+ }
BLI_array_free(hole_pos);
}
More information about the Bf-blender-cvs
mailing list