[Bf-blender-cvs] [e9a6e62d194] soc-2017-sculpting_improvements: Added t-intersections and caps. Next step: bridging the gaps.

witt noreply at git.blender.org
Fri Jun 23 19:53:18 CEST 2017


Commit: e9a6e62d1949eb07f0dc44a0c3a75bd397648cce
Author: witt
Date:   Fri Jun 23 19:50:08 2017 +0200
Branches: soc-2017-sculpting_improvements
https://developer.blender.org/rBe9a6e62d1949eb07f0dc44a0c3a75bd397648cce

Added t-intersections and caps. Next step: bridging the gaps.

===================================================================

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 e2c34c43240..ea0f027f8c3 100644
--- a/source/blender/editors/sculpt_paint/sculpt.c
+++ b/source/blender/editors/sculpt_paint/sculpt.c
@@ -5319,6 +5319,11 @@ typedef enum {
 	SHAPE_RING = 1
 } ShapeTypes;
 
+typedef enum {
+	BRANCH_INIT = 0,
+	BRANCH_VERT_GEN = 1
+} BranchState;
+
 typedef struct ShapePrimitive{
 	ShapeTypes type;
 	float z_pos;
@@ -5333,6 +5338,8 @@ typedef struct SpineBranch{
 	int idx;
 	/*Per fork one terminal: |point fork_idx| = Terminal*/
 	int *terminal_points;
+	BranchState flag;
+	int *gen_verts;
 }SpineBranch;
 
 typedef struct Spine{
@@ -5377,6 +5384,9 @@ static void free_spine_branch(SpineBranch *branch)
 	if (branch->terminal_points) {
 		MEM_freeN(branch->terminal_points);
 	}
+	if (branch->flag & BRANCH_VERT_GEN){
+		MEM_freeN(branch->gen_verts);
+	}
 	MEM_freeN(branch);
 }
 
@@ -5455,11 +5465,11 @@ static Spine *new_spine(int max_alloc, int hull_max)
 }
 
 #ifdef DEBUG_DRAW
-static void debug_branch(SpineBranch *sb, Spine *spine, SilhouetteData *sil, char color){
+static void debug_branch(SpineBranch *sb, Spine *spine, SilhouetteData *sil, unsigned int color){
 	float v1[3], v2[3];
 
 	if(sb->totpoints > 1){
-		bl_debug_color_set(0x0000FF);
+		bl_debug_color_set(color);
 		for(int j = 1; j < sb->totpoints; j++){
 			copy_v3_v3(v1,&sb->points[j*3-3]);
 			copy_v3_v3(v2,&sb->points[j*3  ]);
@@ -5474,7 +5484,7 @@ static void debug_branch(SpineBranch *sb, Spine *spine, SilhouetteData *sil, cha
 	}*/
 
 	/*SpineBranch *rsb;*/
-	unsigned int forkcol = 0xFFFF00;
+	/*unsigned int forkcol = 0xFFFF00;
 	for(int j = 1; j < sb->totforks; j++){
 		printf("Branch fork %i, stroke ids: %i, %i\n", j, sb->terminal_points[j*4], sb->terminal_points[j*4+3]);
 		if (spine->branches[sb->terminal_points[j*4+2]] && spine->branches[sb->terminal_points[j*4+2]]->totforks > 0) {
@@ -5485,7 +5495,7 @@ static void debug_branch(SpineBranch *sb, Spine *spine, SilhouetteData *sil, cha
 			bl_debug_draw_point(v1, 0.2f);
 			bl_debug_color_set(color);
 		}
-	}
+	}*/
 }
 
 static void debug_spine(Spine *spine, SilhouetteData *sil)
@@ -5590,14 +5600,14 @@ static int calc_mid_spine_rec(BMFace *f, Spine *spine, SpineBranch *active_branc
 
 		new_branch = spine_branchoff(spine, active_branch, f, max_alloc, hull_max);
 		sub_added_points = calc_mid_spine_rec(ad_f[0], spine, new_branch, f, max_alloc, hull_max);
-		if(sub_added_points < 5 && new_branch->totforks < 2){
+		if(sub_added_points < 6 && new_branch->totforks < 2){
 			dissolve_branch(spine, new_branch, active_branch);
 		}
 		added_points += sub_added_points;
 
 		new_branch = spine_branchoff(spine, active_branch, f, 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 < 3 && new_branch->totforks < 3){
+		if(sub_added_points < 6 && new_branch->totforks < 2){
 			dissolve_branch(spine, new_branch, active_branch);
 		}
 		added_points += sub_added_points;
@@ -5674,68 +5684,435 @@ static Spine *silhouette_generate_spine(SilhouetteData *sil, SilhouetteStroke *s
 	return spine;
 }
 
+/* Create standardised Mesh (Edges, Loops, Polys):*/
+static void generate_mesh_grid_f_e(Mesh *me, int u_steps, int v_steps, int v_start, bool n_flip)
+{
+	int face_count = (u_steps - 1) * (v_steps - 1);
+	int e_start = me->totedge;
+	int l_start = me->totloop;
+	int p_start = me->totpoly;
+	int p_pos = 0, l_pos = 0, e_pos = 0, v_pos = 0;
+	int edges_per_side = face_count * 2 + u_steps + v_steps - 2;
+	/*TODO: drag out of branch loop*/
+	ED_mesh_edges_add(me, NULL, edges_per_side);
+	ED_mesh_loops_add(me, NULL, face_count * 4);
+	ED_mesh_polys_add(me, NULL, face_count);
+
+	for(int u = 0; u < u_steps; u++){
+		for(int v = 0; v < v_steps; v++){
+			/* add edges */
+			if (v < v_steps - 1 && u < u_steps - 1) {
+				e_pos = e_start + u * (v_steps * 2 - 1) + v * 2;
+				me->medge[e_pos].crease = 0;
+				me->medge[e_pos].bweight = 0;
+				me->medge[e_pos].flag = 0;
+				me->medge[e_pos].v1 = v_start + u * v_steps + v;
+				me->medge[e_pos].v2 = v_start + u * v_steps + v + 1;
+
+				me->medge[e_pos + 1].crease = 0;
+				me->medge[e_pos + 1].bweight = 0;
+				me->medge[e_pos + 1].flag = 0;
+				me->medge[e_pos + 1].v1 = v_start + u * v_steps + v;
+				me->medge[e_pos + 1].v2 = v_start + (u + 1) * v_steps + v;
+
+				/* add loops */
+				l_pos = l_start + u * 4 * (v_steps - 1) + v * 4;
+				v_pos = v_start + u * v_steps + v;
+				me->mloop[l_pos].v = v_pos;
+				me->mloop[l_pos].e = e_pos;
+
+				if (n_flip) {
+					/* clockwise */
+					me->mloop[l_pos + 1].v = v_pos + 1;
+					me->mloop[l_pos + 1].e = e_pos + 3;
+
+					me->mloop[l_pos + 2].v = v_pos + v_steps + 1;
+					me->mloop[l_pos + 2].e = e_pos + v_steps * 2 - 1;
+
+					me->mloop[l_pos + 3].v = v_pos + v_steps;
+					me->mloop[l_pos + 3].e = e_pos + 1;
+				} else {
+					/* anti clockwise */
+					me->mloop[l_pos + 1].v = v_pos + v_steps;
+					me->mloop[l_pos + 1].e = e_pos + 1;
+
+					me->mloop[l_pos + 2].v = v_pos + v_steps + 1;
+					me->mloop[l_pos + 2].e = e_pos + v_steps * 2 - 1;
+
+					me->mloop[l_pos + 3].v = v_pos + 1;
+					me->mloop[l_pos + 3].e = e_pos + 3;
+				}
+
+				/* add Polys */
+				p_pos = p_start + u * (v_steps - 1) + v;
+				me->mpoly[p_pos].totloop = 4;
+				me->mpoly[p_pos].loopstart = l_pos;
+				me->mpoly[p_pos].mat_nr = 0;
+				me->mpoly[p_pos].flag = 0;
+				me->mpoly[p_pos].pad = 0;
+
+
+			} else if (v == v_steps - 1 && u != u_steps - 1){
+				e_pos = e_start + u * (v_steps * 2 - 1) + v * 2;
+				me->medge[e_pos].crease = 0;
+				me->medge[e_pos].bweight = 0;
+				me->medge[e_pos].flag = 0;
+				me->medge[e_pos].v1 = v_start + u * v_steps + v;
+				me->medge[e_pos].v2 = v_start + (u + 1) * v_steps + v;
+			} else if (u == u_steps - 1 && v != v_steps - 1) {
+				e_pos = e_start + u * (v_steps * 2 - 1) + v;
+				me->medge[e_pos].crease = 0;
+				me->medge[e_pos].bweight = 0;
+				me->medge[e_pos].flag = 0;
+				me->medge[e_pos].v1 = v_start + u * v_steps + v;
+				me->medge[e_pos].v2 = v_start + u * v_steps + v + 1;
+			}
+		}
+	}
+}
+
+static void bridge_loop(Mesh *me, int v_start_a, int v_start_b, int totvert, bool flip, int l_start_a, int l_start_b, int l_stride)
+{
+	int e_start = me->totedge;
+	int l_start = me->totloop;
+	int p_start = me->totpoly;
+	ED_mesh_edges_add(me, NULL, totvert);
+	ED_mesh_loops_add(me, NULL, 4 * totvert - 4);
+	ED_mesh_polys_add(me, NULL, totvert - 1);
+
+	for (int i = 0; i < totvert; i++) {
+		me->medge[e_start + i].crease = 0;
+		me->medge[e_start + i].bweight = 0;
+		me->medge[e_start + i].flag = 0;
+		me->medge[e_start + i].v1 = v_start_a + i;
+		me->medge[e_start + i].v2 = v_start_b + (flip ? -i : i);
+
+		if (i < totvert - 1) {
+			me->mloop[l_start + i * 4 + 0].v = v_start_a + i;
+			me->mloop[l_start + i * 4 + 0].e = l_start_a + i * l_stride;
+
+			me->mloop[l_start + i * 4 + 1].v = v_start_a + i + 1;
+			me->mloop[l_start + i * 4 + 1].e = e_start + i + 1;
+
+			me->mloop[l_start + i * 4 + 2].v = v_start_b + (flip ? -i - 1 : i + 1);
+			me->mloop[l_start + i * 4 + 2].e = l_start_b + (flip ? -i : i) * l_stride;
+
+			me->mloop[l_start + i * 4 + 3].v = v_start_b + (flip ? -i : i);
+			me->mloop[l_start + i * 4 + 3].e = e_start + i;
+
+			me->mpoly[p_start + i].loopstart = l_start + i * 4;
+			me->mpoly[p_start + i].totloop = 4;
+			me->mpoly[p_start + i].mat_nr = 0;
+			me->mpoly[p_start + i].flag = 0;
+			me->mpoly[p_start + i].pad = 0;
+		}
+	}
+}
+
 static int cmpfunc (const void * a, const void * b)/* TODO: is there a sort func already?*/
 {
 	return ( *(int*)a - *(int*)b );
 }
 
-static void add_ss_tube(SilhouetteData *sil, SpineBranch *branch, Mesh *me, float z_vec[3], int ss_steps)
+static void add_ss_cap(SilhouetteData *sil, SpineBranch *branch, int *gen_verts, Mesh *me, float z_vec[3], float depth, int ss_steps, int w_steps){
+	float cap_p[branch->tot_hull_points * 4];
+	float v1[3], v2[3], v3[3], z_vec_b[3];
+	float totlength = 0.0f;
+	float step_size = depth / (float)w_steps;
+	qsort (branch->hull_points, branch->tot_hull_points, sizeof(int), cmpfunc);
+
+	for(int i = 0; i < branch->tot_hull_points; i++){
+		silhoute_stroke_point_to_3d(sil, branch->hull_points[i] * 2, &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]);
+	}
+
+	totlength = cap_p[branch->tot_hull_points * 4 - 1];
+
+	float cap_length = fmin(totlength, (w_steps * step_size));
+	step_size = cap_length / (float)w_steps;
+	float cap_pos = (totlength - cap_length) * 0.5f;
+	float a, b, f;
+	int u_pos_i = 1;
+	int v_start = me->totvert;
+
+	if (totlength > step_size * w_steps && false){
+		/*TODO: tubeish ends*/
+	}
+
+	ED_mesh_vertices_add(me, NULL, w_steps * ss_steps);
+
+	for(int u = 0; u < w_steps; u++){
+		while(cap_p[u_pos_i * 4 + 3] < cap_pos){
+			u_pos_i ++;
+		}
+
+		a = cap_p[u_pos_i * 4 - 1];
+		b = cap_p[u_pos_i * 4 + 3];
+		f = (cap_pos - a) / (b - a);
+		interp_v3_v3v3(v1, &cap_p[u_pos_i * 4 - 4], &cap_p[u_pos_i * 4], f);
+		copy_v3_v3(z_vec_b, z_vec);
+
+		for(int v = 0; v < ss_steps; v++){
+			add_v3_v3(v1, z_vec_b);
+			f = (float)v / (float)(ss_steps * 2);
+			f = sin(M_PI * f - M_PI * 0.5f) + 1.0f;
+			interp_v3_v3v3(v3, v1, me->mvert[gen_verts[ss_steps + u]].co, f);
+			me->mvert[v_start + u * ss_steps + v].flag = 0;
+			me->mvert[v_start + u * ss_steps + v].bweight = 0;
+			copy_v3_v3(me->mvert[v_start + u * ss_steps + v].co,v3);
+			mul_v3_fl(z_vec_b, cos(0.5f * M_PI * ((float)v / (float)ss_steps)));
+		}
+		cap_pos += step_size;
+	}
+
+	generate_mesh_grid_f_e(me, w_steps, ss_steps, v_start, false);
+}
+
+static void calc_fork_arc(float v1[3], float v2[3], float *out, int offloop, const float z_vec[3], int ss_steps, int w_steps, float w_fact){
+	float v3[3], v4[3], z_vec_b[3];
+	float f;
+	copy_v3_v3(z_vec_b, z_vec);
+	for(int v = 0; v < ss_steps; v++){
+		add_v3_v3(v1, z_vec_b);
+		add_v3_v3(v2, z_vec_b);
+		f = (float)v/(float)(ss_steps * 2);
+		f = (sin(M_PI * f - M_PI * 0.5f) * 0.5f + 0.5f) * w_fact;
+		interp_v3_v3v3(v3, v1, v2, f);
+		copy_v3_v3(&out[offloop + v * 3], v3);
+		int

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list