[Bf-blender-cvs] [e8f31652827] soc-2017-sculpting_improvements: Finished T-intersection topology. Next up connecting the parts.
Sebastian Witt
noreply at git.blender.org
Tue Jul 11 20:32:36 CEST 2017
Commit: e8f3165282715e21073c64c2f2386102593ce00e
Author: Sebastian Witt
Date: Tue Jul 11 20:30:55 2017 +0200
Branches: soc-2017-sculpting_improvements
https://developer.blender.org/rBe8f3165282715e21073c64c2f2386102593ce00e
Finished T-intersection topology. Next up connecting the parts.
===================================================================
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 ab8126da94f..3f8a61073e2 100644
--- a/source/blender/editors/sculpt_paint/sculpt.c
+++ b/source/blender/editors/sculpt_paint/sculpt.c
@@ -5759,6 +5759,71 @@ static void bridge_loops(Mesh *me, int e_start_a, int e_start_b, int totvert, bo
}
}
+/*
+ * Generate a quad from three edges. Returning the newly created edge.
+ * ___a___
+ * | |
+ * b new
+ * | |
+ * ___c___
+ */
+static int add_quad(Mesh *me, int edge_b, int edge_a, int edge_c, bool flip)
+{
+ int v_a, v_c;
+ MEdge e_a, e_b, e_c;
+ int e_start = me->totedge;
+ int l_start = me->totloop;
+ int p_start = me->totpoly;
+ bool b_flip = false;
+
+ e_a = me->medge[edge_a];
+ e_b = me->medge[edge_b];
+ e_c = me->medge[edge_c];
+
+ if (e_a.v1 == e_b.v1 || e_a.v1 == e_b.v2){
+ b_flip = (e_a.v1 == e_b.v1);
+ v_a = e_a.v2;
+ } else {
+ b_flip = (e_a.v2 == e_b.v1);
+ v_a = e_a.v1;
+ }
+ if (e_c.v1 == e_b.v1 || e_c.v1 == e_b.v2){
+ v_c = e_c.v2;
+ } else {
+ v_c = e_c.v1;
+ }
+
+ ED_mesh_edges_add(me, NULL, 1);
+
+ me->medge[e_start].v2 = v_a;
+ me->medge[e_start].v1 = v_c;
+ me->medge[e_start].crease = 0;
+ me->medge[e_start].bweight = 0;
+ me->medge[e_start].flag = 0;
+
+ ED_mesh_loops_add(me, NULL, 4);
+ me->mloop[l_start].v = b_flip ? e_b.v1 : e_b.v2;
+ me->mloop[l_start].e = edge_a;
+
+ me->mloop[l_start + (flip ? 1 : 3)].v = v_a;
+ me->mloop[l_start + (flip ? 1 : 3)].e = e_start;
+
+ me->mloop[l_start + 2].v = v_c;
+ me->mloop[l_start + 2].e = edge_c;
+
+ me->mloop[l_start + (flip ? 3 : 1)].v = b_flip ? e_b.v2 : e_b.v1;
+ me->mloop[l_start + (flip ? 3 : 1)].e = edge_b;
+
+ ED_mesh_polys_add(me, NULL, 1);
+ me->mpoly[p_start].loopstart = l_start;
+ me->mpoly[p_start].totloop = 4;
+ me->mpoly[p_start].mat_nr = 0;
+ me->mpoly[p_start].flag = 0;
+ me->mpoly[p_start].pad = 0;
+
+ return e_start;
+}
+
/* TODO: is there a sort function already?*/
static int cmpfunc (const void * a, const void * b)
{
@@ -6090,7 +6155,9 @@ static void add_ss_tinter(SilhouetteData *sil, SpineBranch *branch, Mesh *me, fl
float v1[3], v2[3], v3[3], v4[3], center[3], center_up[3];
float center_s[3 * 3];
int w_h_steps = w_steps / 2;
- int v_start;
+ int v_start, v_start_center;
+ int e_start[3], e_start_center, e_start_inner[3], e_t_sign[6];
+ int stride_le;
BLI_array_declare(sa);
/* calc and sort hullpoints for the three sides */
@@ -6153,11 +6220,17 @@ static void add_ss_tinter(SilhouetteData *sil, SpineBranch *branch, Mesh *me, fl
/*needs to be uneven*/
u_steps |= 1;
+ v_start_center = me->totvert;
+ ED_mesh_vertices_add(me, NULL, u_steps + u_steps / 2);
+ e_start_center = me->totedge;
+ ED_mesh_edges_add(me, NULL, (u_steps / 2) * 3);
+
for (int s = 0; s < 3; s++) {
step_length = sa[b_start[s] + b_tot[s] * 4 - 1] / (float)u_steps;
add_v3_v3v3(v3, ¢er_s[s * 3], z_vec);
+ v_start = me->totvert;
calc_vert_half(me,
&sa[b_start[s]],
&sa[b_start[(s + 2) % 3] + b_tot[(s + 2) % 3] * 4 - 4],
@@ -6167,6 +6240,17 @@ static void add_ss_tinter(SilhouetteData *sil, SpineBranch *branch, Mesh *me, fl
w_steps,
smoothness);
+ e_start[s] = me->totedge;
+
+ ED_mesh_edges_add(me, NULL, v_steps * 2 + w_steps - 1);
+ for(int v = 0; v < v_steps * 2 + w_steps - 1; v++){
+ me->medge[e_start[s] + v].v1 = v_start + v;
+ me->medge[e_start[s] + v].v2 = v_start + v + 1;
+ me->medge[e_start[s] + v].crease = 0;
+ me->medge[e_start[s] + v].bweight = 0;
+ me->medge[e_start[s] + v].flag = 0;
+ }
+
v_start = me->totvert;
for (int u = 1; u < u_steps - 1; u++) {
@@ -6188,25 +6272,123 @@ static void add_ss_tinter(SilhouetteData *sil, SpineBranch *branch, Mesh *me, fl
f = fabs((float)(u_steps / 2 - u) / ((float)u_steps / 2.0f));
if (u < u_steps / 2){
interp_v3_v3v3(v4, center, ¢er_s[s * 3], f);
+ add_v3_v3v3(v2, v4, z_vec);
+
+ copy_v3_v3(me->mvert[v_start_center + s * (u_steps / 2) + u].co, v2);
+ me->mvert[v_start_center + s * (u_steps / 2) + u].flag = 0;
+ me->mvert[v_start_center + s * (u_steps / 2) + u].bweight = 0;
} else if (u == u_steps / 2) {
copy_v3_v3(v4, center);
+ add_v3_v3v3(v2, v4, z_vec);
+ if (s == 0) {
+ /* Add center at v2 */
+ copy_v3_v3(me->mvert[v_start_center].co, v2);
+ me->mvert[v_start_center].flag = 0;
+ me->mvert[v_start_center].bweight = 0;
+ }
} else {
interp_v3_v3v3(v4, center, ¢er_s[(s + 1) % 3 * 3], f);
+ add_v3_v3v3(v2, v4, z_vec);
}
- add_v3_v3v3(v2, v4, z_vec);
-
- bl_debug_color_set(0xff0000);
- bl_debug_draw_point(v2, 0.2f);
- bl_debug_color_set(0x000000);
calc_vert_quarter(me, v1, v4, v2, v_steps, w_h_steps, smoothness, false);
}
+ me->medge[e_start_center + s * (u_steps / 2)].v1 = me->medge[e_start[s] + v_steps + w_steps / 2].v1;
+ me->medge[e_start_center + s * (u_steps / 2)].v2 = v_start_center + s * (u_steps / 2) + 1;
+ me->medge[e_start_center + s * (u_steps / 2)].crease = 0;
+ me->medge[e_start_center + s * (u_steps / 2)].bweight = 0;
+ me->medge[e_start_center + s * (u_steps / 2)].flag = 0;
+
+ for (int u = 1; u < u_steps / 2 - 1; u++) {
+ me->medge[e_start_center + s * (u_steps / 2) + u].v1 = v_start_center + s * (u_steps / 2) + u;
+ me->medge[e_start_center + s * (u_steps / 2) + u].v2 = v_start_center + s * (u_steps / 2) + 1 + u;
+ me->medge[e_start_center + s * (u_steps / 2) + u].crease = 0;
+ me->medge[e_start_center + s * (u_steps / 2) + u].bweight = 0;
+ me->medge[e_start_center + s * (u_steps / 2) + u].flag = 0;
+ }
+
+ me->medge[e_start_center + (s + 1) * (u_steps / 2) - 1].v1 = v_start_center + s * (u_steps / 2) + 1 + (u_steps / 2 - 2);
+ me->medge[e_start_center + (s + 1) * (u_steps / 2) - 1].v2 = v_start_center;
+ me->medge[e_start_center + (s + 1) * (u_steps / 2) - 1].crease = 0;
+ me->medge[e_start_center + (s + 1) * (u_steps / 2) - 1].bweight = 0;
+ me->medge[e_start_center + (s + 1) * (u_steps / 2) - 1].flag = 0;
+
+ e_start_inner[s] = me->totedge;
generate_mesh_grid_f_e(me, u_steps - 2, v_steps + w_steps / 2, v_start, false);
}
+ for(int s = 0; s < 3; s++){
+ int e_end_a, e_end_b;
+ bridge_loops(me,
+ e_start_inner[s],
+ e_start[s],
+ v_steps + w_steps / 2,
+ false,
+ 2,
+ 1,
+ false);
- /* TODO: faces */
+ e_end_a = me->totedge;
+ bridge_loops(me,
+ e_start_inner[(s + 2) % 3] + (u_steps - 3) * (2 * (v_steps + w_steps / 2) - 1),
+ e_start[s] + v_steps * 2 + w_steps - 2,
+ v_steps + w_steps / 2,
+ true,
+ 1,
+ 1,
+ true);
+ e_end_b = me->totedge;
+
+ int e_side_a, e_side_b;
+ e_side_a = add_quad(me, e_start[s] + v_steps + w_steps / 2, e_start_center + s * (u_steps / 2), e_end_b - 1, true);
+ e_side_b = add_quad(me, e_start[s] + v_steps + w_steps / 2 - 1, e_end_a - 1, e_start_center + s * (u_steps / 2), true);
+ stride_le = (2 * (v_steps + w_steps / 2) - 1);
+
+ for (int u = 1; u < u_steps / 2 - 1; u++) {
+ e_side_b = add_quad(me,
+ e_side_b,
+ e_start_inner[s] - 1 + stride_le * u,
+ e_start_center + s * (u_steps / 2) + u,
+ true);
+ e_side_a = add_quad(me,
+ e_side_a,
+ e_start_inner[(s + 2) % 3] - 1 + stride_le * (u_steps - 2 - u),
+ e_start_center + s * (u_steps / 2) + u,
+ false);
+ }
+
+ e_t_sign[s * 2] = add_quad(me,
+ e_side_b,
+ e_start_inner[s] - 1 + stride_le * ((u_steps / 2) - 1),
+ e_start_center + s * (u_steps / 2) + u_steps / 2 - 1,
+ true);
+
+ e_t_sign[s * 2 + 1] = e_side_a;
+ }
+
+ for(int s = 0; s < 3; s++){
+ ED_mesh_loops_add(me, NULL, 4);
+ me->mloop[me->totloop - 4].v = me->medge[e_t_sign[(s + 2) % 3 * 2]].v1;
+ me->mloop[me->totloop - 4].e = e_t_sign[(s + 2) % 3 * 2];
+
+ me->mloop[me->totloop - 1].v = me->medge[e_start_center + s * (u_steps / 2) + u_steps / 2 - 1].v1;
+ me->mloop[me->totloop - 1].e = e_start_center + s * (u_steps / 2) + u_steps / 2 - 1;
+
+ me->mloop[me->totloop - 2].v = me->medge[e_t_sign[s * 2 + 1]].v2;
+ me->mloop[me->totloop - 2].e = e_t_sign[s * 2 + 1];
+
+ me->mloop[me->totloop - 3].v = me->medge[e_start_inner[(s + 2) % 3] - 1 + stride_le * ((u_steps / 2))].v1;
+ me->mloop[me->totloop - 3].e = e_start_inner[(s + 2) % 3] - 1 + stride_le * ((u_steps / 2));
+
+ ED_mesh_polys_add(me, NULL, 1);
+ me->mpoly[me->totpoly - 1].loopstart = me->totloop - 4;
+ me->mpoly[me->totpoly - 1].totloop = 4;
+ me->mpoly[me->totpoly - 1].mat_nr = 0;
+ me->mpoly[me->totpoly - 1].flag = 0;
+ me->mpoly[me->totpoly - 1].pad = 0;
+
+ }
BLI_array_free(sa);
}
More information about the Bf-blender-cvs
mailing list