[Bf-blender-cvs] [637a32a3d9a] soc-2017-sculpting_improvements: Last commit before mayor rework. Mostly for future reference.
witt
noreply at git.blender.org
Thu Jul 6 17:03:07 CEST 2017
Commit: 637a32a3d9a09cee2d0ce541cd4d8065df055f5a
Author: witt
Date: Thu Jul 6 17:01:34 2017 +0200
Branches: soc-2017-sculpting_improvements
https://developer.blender.org/rB637a32a3d9a09cee2d0ce541cd4d8065df055f5a
Last commit before mayor rework. Mostly for future reference.
===================================================================
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 c1f0f6d08cd..9fb6a514ee7 100644
--- a/source/blender/editors/sculpt_paint/sculpt.c
+++ b/source/blender/editors/sculpt_paint/sculpt.c
@@ -5446,14 +5446,14 @@ static int calc_mid_spine_rec(BMFace *f, Spine *spine, SpineBranch *active_branc
new_branch = spine_branchoff(spine, active_branch, max_alloc, hull_max);
sub_added_points = calc_mid_spine_rec(ad_f[0], spine, new_branch, f, max_alloc, hull_max);
/* Controls when to remove small/stubby branches */
- if (sub_added_points < 6 && new_branch->totforks < 2) {
+ if (sub_added_points < 20 && new_branch->totforks < 3) {
dissolve_branch(spine, new_branch, active_branch);
}
added_points += sub_added_points;
new_branch = spine_branchoff(spine, active_branch, max_alloc, hull_max);
sub_added_points = calc_mid_spine_rec(ad_f[1], spine, new_branch, f, max_alloc, hull_max);
- if (sub_added_points < 6 && new_branch->totforks < 2) {
+ if (sub_added_points < 20 && new_branch->totforks < 3) {
dissolve_branch(spine, new_branch, active_branch);
}
added_points += sub_added_points;
@@ -5858,17 +5858,38 @@ static void add_ss_cap(SilhouetteData *sil, SpineBranch *branch, int *gen_verts,
float totlength = 0.0f;
float step_size = depth / (float)w_steps;
float loop[3 * (ss_steps * 2 + w_steps)];
+ int cyclic_offset = 0, n_i = 0;
+ gen_verts = NULL; /*TODO: Remove gen_verts */
+ /* calc and sort hullpoints for the three sides */
qsort (branch->hull_points, branch->tot_hull_points, sizeof(int), cmpfunc);
+ if (branch->hull_points[0] == 0) {
+ for (int i = 0; i < branch->tot_hull_points; i++) {
+ if (n_i > 0) {
+ cyclic_offset ++;
+ }
+ if (branch->hull_points[i] + 1 != branch->hull_points[i + 1] &&
+ branch->hull_points[i] != branch->hull_points[i + 1] &&
+ i < branch->tot_hull_points - 1)
+ {
+ n_i ++;
+ cyclic_offset = 0;
+ }
+ }
+ }
+
+ printf("New Cap:\n");
for (int i = 0; i < branch->tot_hull_points; i++) {
- silhoute_stroke_point_to_3d(sil, branch->hull_points[i] * 3, &cap_p[i * 4]);
+ n_i = branch->tot_hull_points + i - cyclic_offset;
+ silhoute_stroke_point_to_3d(sil, branch->hull_points[n_i % branch->tot_hull_points] * 3, &cap_p[i * 4]);
if (i > 0) {
cap_p[i * 4 + 3] = len_v3v3(&cap_p[i * 4], v1) + cap_p[i * 4 - 1];
} else {
cap_p[i * 4 + 3] = 0.0f;
}
copy_v3_v3(v1, &cap_p[i * 4]);
+ printf("Added Point %i; length: %f\n", branch->hull_points[n_i % branch->tot_hull_points], cap_p[i * 4 + 3]);
}
totlength = cap_p[branch->tot_hull_points * 4 - 1];
@@ -5891,6 +5912,7 @@ static void add_ss_cap(SilhouetteData *sil, SpineBranch *branch, int *gen_verts,
/* If the cap is big enough a tube is added between the cap and the last branch. */
if (totlength > step_size * w_steps) {
+ printf("Gen Tube before cap\n");
int side_l = cap_pos;
int totl = 0, totr = 0;
float left[branch->tot_hull_points * 4], right[branch->tot_hull_points * 4];
@@ -5919,7 +5941,7 @@ static void add_ss_cap(SilhouetteData *sil, SpineBranch *branch, int *gen_verts,
u_pos_i ++;
}
- if (totl >= 2 && totr >= 2) {
+ if (totl >= 1 && totr >= 1) {
u_steps = fmax(2.0f, fmax(left[totl * 4 - 1], right[totr * 4 - 1]) / (float)(2 * depth / ss_steps));
ve_start_a = me->totedge + ss_steps * (u_steps - 1) * 2 - 2;
fill_tube(me, left, right, totl, totr, u_steps, z_vec, ss_steps, w_steps + 1, w_fact, e_start_tube);
@@ -6007,17 +6029,32 @@ static void add_ss_cap(SilhouetteData *sil, SpineBranch *branch, int *gen_verts,
branch->flag |= BRANCH_EDGE_GEN;
}
- branch->e_start_arr[0] = ve_start_b;
- branch->e_start_arr[1] = ss_steps;
- branch->e_start_arr[2] = 2;
+ if (branch->hull_points[0] == 0) {
+ branch->e_start_arr[6] = ve_start_b;
+ branch->e_start_arr[7] = ss_steps;
+ branch->e_start_arr[8] = 2;
+
+ branch->e_start_arr[0] = ve_start_b + (ss_steps * 2 - 1) * (w_steps - 1);
+ branch->e_start_arr[1] = ss_steps;
+ branch->e_start_arr[2] = 1;
- branch->e_start_arr[3] = ve_start_b + (ss_steps * 2 - 1) - 1;
- branch->e_start_arr[4] = ss_steps;
- branch->e_start_arr[5] = ss_steps * 2 - 1;
+ /* TODO: Inverse fix?*/
+ branch->e_start_arr[3] = ve_start_b + (ss_steps * 2 - 1) - 1;
+ branch->e_start_arr[4] = w_steps;
+ branch->e_start_arr[5] = ss_steps * 2 - 1;
+ } else {
+ branch->e_start_arr[0] = ve_start_b;
+ branch->e_start_arr[1] = ss_steps;
+ branch->e_start_arr[2] = 2;
- branch->e_start_arr[6] = ve_start_b + (ss_steps * 2 - 1) * (w_steps - 1);
- branch->e_start_arr[7] = w_steps;
- branch->e_start_arr[8] = 1;
+ branch->e_start_arr[6] = ve_start_b + (ss_steps * 2 - 1) * (w_steps - 1);
+ branch->e_start_arr[7] = ss_steps;
+ branch->e_start_arr[8] = 1;
+
+ branch->e_start_arr[3] = ve_start_b + (ss_steps * 2 - 1) - 1;
+ branch->e_start_arr[4] = w_steps;
+ branch->e_start_arr[5] = ss_steps * 2 - 1;
+ }
}
}
@@ -6047,35 +6084,28 @@ static void add_ss_tinter(SilhouetteData *sil, SpineBranch *branch, Mesh *me, fl
}
}
- /* TODO: Cyclic Fix (0 within one side) */
+ b_start[0] = 0;
+ filler = 0;
for (int i = 0; i < branch->tot_hull_points; i++) {
- n_i = branch->tot_hull_points + (i - cyclic_offset);
+ n_i = branch->tot_hull_points + i - cyclic_offset;
silhoute_stroke_point_to_3d(sil, branch->hull_points[n_i % branch->tot_hull_points] * 3, &sa[b_start[filler] + b_tot[filler] * 4]);
- if (b_tot[filler] > 0) {
- sa[b_start[filler] + b_tot[filler] * 4 + 3] = len_v3v3(&sa[b_start[filler] + b_tot[filler] * 4],&sa[b_start[filler] + b_tot[filler] * 4 - 4]) + sa[b_start[filler] + b_tot[filler] * 4 - 1];
- } else {
+ if(b_tot[filler] == 0){
sa[b_start[filler] + b_tot[filler] * 4 + 3] = 0.0f;
+ }else{
+ sa[b_start[filler] + b_tot[filler] * 4 + 3] = len_v3v3(&sa[b_start[filler] + b_tot[filler] * 4 - 4], &sa[b_start[filler] + b_tot[filler] * 4]) + sa[b_start[filler] + b_tot[filler] * 4 - 1];
}
b_tot[filler] ++;
-
- if (branch->hull_points[n_i % branch->tot_hull_points] + 1 != branch->hull_points[(i + 1) % branch->tot_hull_points] &&
- branch->hull_points[i % branch->tot_hull_points] != branch->hull_points[(i + 1) % branch->tot_hull_points] &&
- !(cyclic_offset != 0 && b_tot[0] <= cyclic_offset))
+ if (branch->hull_points[n_i % branch->tot_hull_points] + 1 != branch->hull_points[(n_i + 1) % branch->tot_hull_points] &&
+ branch->hull_points[n_i % branch->tot_hull_points] != branch->hull_points[(n_i + 1) % branch->tot_hull_points] &&
+ !(cyclic_offset != 0 && b_tot[0] <= cyclic_offset))
{
- filler = (filler + 1) % 3;
- if (filler > 0) {
- b_start[filler] = b_start[filler - 1] + b_tot[filler - 1] * 4;
+ if ((filler + 1) % 3 > 0){
+ b_start[(filler + 1) % 3] = b_start[filler] + b_tot[filler] * 4;
}
+ filler = (filler + 1) % 3;
}
}
- /*for(int s = 0; s < 3; s++){
- for(int i = 0; i < b_tot[s]; i++){
- bl_debug_color_set(0x00FF00);
- bl_debug_draw_point(&sa[b_start[s] + i * 4],0.2f);
- }
- }*/
-
int loop_length = (ss_steps * 2 + w_steps);
/* a - b */
float loop[3 * loop_length * 3];
@@ -6116,10 +6146,10 @@ static void add_ss_tinter(SilhouetteData *sil, SpineBranch *branch, Mesh *me, fl
int e_start = me->totedge;
int bridge_in_out_start[3];
- /*if (!(branch->flag & BRANCH_EDGE_GEN)){
+ if (!(branch->flag & BRANCH_EDGE_GEN)){
branch->e_start_arr = MEM_callocN(sizeof(int) * 27,"edge startposition array");
branch->flag |= BRANCH_EDGE_GEN;
- }*/
+ }
ED_mesh_vertices_add(me, NULL, 3 * verts_per_side);
int center_face[3 * 2];
@@ -6137,17 +6167,18 @@ static void add_ss_tinter(SilhouetteData *sil, SpineBranch *branch, Mesh *me, fl
interp_v3_v3v3(v3, v3, center, f / (w_steps/2 - w + 1));
copy_v3_v3(me->mvert[v_start + s * verts_per_side + w * u_steps + u].co, v3);
- /*if (u == u_steps - 1) {
- copy_v3_v3(me->mvert[v_start + s * verts_per_side + w * (u_steps + 1) + u + 1].co, v2);
- }*/
if (u == u_steps / 2 && w == w_steps / 2 - 1) {
center_face[s * 2] = v_start + s * verts_per_side + w * u_steps + u;
}
}
}
+ int e_start_off = me->totedge;
generate_mesh_grid_f_e(me, w_steps / 2, u_steps, v_start + s * verts_per_side, true);
- /*int e_start_off = (u_steps - 1) * 2 + 1;*/
- int e_start_tot_ps = (u_steps * (w_steps / 2)) * 2 - u_steps - (w_steps / 2);//(u_steps * 2 - 1) * (w_steps / 2 - 1);
+ branch->e_start_arr[s * 9 + 3] = e_start_off + 1;
+ branch->e_start_arr[s * 9 + 4] = w_steps / 2;
+ branch->e_start_arr[s * 9 + 5] = (u_steps - 1) * 2 + 1;
+
+ int e_start_tot_ps = (u_steps * (w_steps / 2)) * 2 - u_steps - (w_steps / 2);
bridge_in_out_start[s] = e_start + s * e_start_tot_ps;
}
@@ -6189,7 +6220,7 @@ static void add_ss_tinter(SilhouetteData *sil, SpineBranch *branch, Mesh *me, fl
step_l = sa[b_start[s] + b_tot[s] * 4 - 1] / u_steps;
for (int u = 0; u < u_steps; u++) {
- while (u_pos_i < b_tot[s] - 1 && sa[u_pos_i * 4 + 3] <= step_l * (float)u) {
+ while (u_pos_i < b_tot[s] - 1 && sa[b_start[s] + u_pos_i * 4 + 3] <= step_l * (float)u) {
u_pos_i ++;
}
@@ -6198,6 +6229,7 @@ static void add_ss_tinter(SilhouetteData *sil, SpineBranch *branch, Mesh *me, fl
} else {
a = sa[b_start[s] + u_pos_i * 4 - 1];
b = sa[b_start[s] + u_pos_i * 4 + 3];
+ BLI_assert(b > a);
f = (step_l * (float)u - a) / (b - a);
interp_v3_v3v3(v1, &sa[b_start[s] + u_pos_i * 4 - 4], &sa[b_start[s] + u_pos_i * 4], f);
}
@@ -6219,6 +6251,25 @@ static void add_ss_tinter(SilhouetteData *sil, SpineBranch *branch, Mesh *me, fl
}
e_tmp_start = me->totedge;
generate_mesh_grid_f_e(me, u_steps, ss_steps, v_start + s * verts_per_side, false);
+ if (s > 0) {
+ branch->e_start_arr[s * 9 + 6] = e_tmp_start;
+ branch->e_start_arr[s * 9 + 7] = ss_steps;
+ branch->e_start_arr[s * 9 + 8] = 2;
+ } else {
+ branch->e_start_arr[s * 9 + 0] = e_tmp_start;
+ branch->e_start_arr[s * 9 + 1] = ss_steps;
+ branch->e_start_arr[s * 9 + 2] = 2;
+ }
+
+ if ((s + 1) % 3 > 0) {
+ branch->e_start_arr[(s + 1) % 3 * 9 + 0] = e_tmp_start + (u_steps - 1) * ss_steps * 2 - u_steps + 1;
+ branch->e_start_arr[(s + 1) % 3 * 9 + 1]
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list