[Bf-blender-cvs] [3daac4d4cc2] soc-2018-npr: More work on opti edge split

Sebastian Parborg noreply at git.blender.org
Thu Aug 9 09:41:52 CEST 2018


Commit: 3daac4d4cc26ff66884dd4375ee3c457c447bc9a
Author: Sebastian Parborg
Date:   Thu Aug 2 18:53:12 2018 +0200
Branches: soc-2018-npr
https://developer.blender.org/rB3daac4d4cc26ff66884dd4375ee3c457c447bc9a

More work on opti edge split

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

M	source/blender/modifiers/intern/MOD_mybmesh.c

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

diff --git a/source/blender/modifiers/intern/MOD_mybmesh.c b/source/blender/modifiers/intern/MOD_mybmesh.c
index 1555622fbb0..2d837ab9851 100644
--- a/source/blender/modifiers/intern/MOD_mybmesh.c
+++ b/source/blender/modifiers/intern/MOD_mybmesh.c
@@ -3538,9 +3538,6 @@ static void optimization( MeshData *m_d ){
 		for(face_i = 0; face_i < inco_faces.count; face_i++){
 			IncoFace *inface = &BLI_buffer_at(&inco_faces, IncoFace, face_i);
 
-			BMVert *vert;
-			BMIter iter_v;
-
 			if( inface->face == NULL ){
 				//Already fixed this edge
 				continue;
@@ -3619,143 +3616,90 @@ static void optimization( MeshData *m_d ){
 					nr_inco_faces++;
 				}
 			}
+			{
+				BMFace *copy_f = BLI_ghash_lookup(fhash, inface->face);
 
-			BM_ITER_ELEM (vert, &iter_v, inface->face, BM_VERTS_OF_FACE) {
-				BMVert *orig_v = BLI_ghash_lookup(m_d->vert_hash, vert);
-				if( orig_v != NULL ){
-					// This vert exists in the original mesh
-					int face_count = BM_vert_face_count(vert);
-					int edge_count = BM_vert_edge_count(vert);
-					int face_idx, vert_idx;
-					float (*store_2d)[3][3] = BLI_array_alloca(store_2d, face_count);
-					float *face_area = BLI_array_alloca(face_area, face_count);
-					float tot_face_area = 0;
-					float mat[3][3];
-
-					bool done = false;
+				int new_inco_faces;
+				int best_inco_faces = nr_inco_faces;
+				int best_edge;
+				float best_edge_split_pos[3];
+				float best_dist = INFINITY;
+				bool done = false;
 
-					axis_dominant_v3_to_m3(mat, vert->no);
+				BM_ITER_ELEM_INDEX (edge, &iter_e, copy_f, BM_EDGES_OF_FACE, edge_idx) {
+					BMesh *bm_temp = BM_mesh_copy(bm_fan_copy);
+					BMEdge *temp_e = BM_edge_at_index_find(bm_temp, BM_elem_index_get(edge));
+					BMVert *split_vert = NULL;
 
-					BMVert *face_vert;
-					BMIter iter_f_v;
-					BM_ITER_ELEM_INDEX (f, &iter_f, vert, BM_FACES_OF_VERT, face_idx) {
-						BM_ITER_ELEM_INDEX (face_vert, &iter_f_v, f, BM_VERTS_OF_FACE, vert_idx) {
-							mul_v2_m3v3(store_2d[face_idx][vert_idx], mat, face_vert->co);
+					for(int j = 0; j < 10; j++){
+						if (!valid_split_pos[edge_idx][j]){
+							continue;
 						}
+						new_inco_faces = 0;
 
-						face_area[face_idx] = BM_face_calc_area(f);
-						tot_face_area += face_area[face_idx];
-					}
-
-					{
-						float old_pos[3], best_pos[3], best_dist = 0;
-						int best_inco_faces = nr_inco_faces;
-						int best_edge;
-						float best_edge_split_pos[3];
-
-						RNG *rng = BLI_rng_new(0);
-						BMVert *copy_v = BLI_ghash_lookup(vhash, vert);
-						BMFace *copy_f = BLI_ghash_lookup(fhash, inface->face);
-
-						copy_v3_v3( old_pos, vert->co );
-						copy_v3_v3( best_pos, vert->co );
-
-						for( face_idx = 0; face_idx < face_count; face_idx++ ){
-							int samples = (face_area[face_idx] / tot_face_area) * 100;
-
-						for(int i=0; i < samples; i++ ){
-							float cur_v2[2];
-
-							// TODO check if the new point lies inside any of the new mesh faces
-							BLI_rng_get_tri_sample_float_v2(rng, store_2d[face_idx][0], store_2d[face_idx][1], store_2d[face_idx][2], cur_v2);
-
-							BM_ITER_ELEM (f, &iter_f, orig_v, BM_FACES_OF_VERT) {
-								if( point_inside_v2( mat, cur_v2, f ) ){
-									float P[3], du[3], dv[3];
-									float uv_P[2];
+						if( split_vert == NULL){
+							split_vert = split_edge_and_move_nor(bm_temp, temp_e, split_vert_pos[edge_idx][j], inface->face->no);
+						} else {
+							copy_v3_v3(split_vert->co, split_vert_pos[edge_idx][j]);
+						}
 
-									get_uv_point( f, uv_P, cur_v2, mat );
-									m_d->eval->evaluateLimit(m_d->eval, BM_elem_index_get(f), uv_P[0], uv_P[1], P, du, dv);
+						BM_ITER_MESH (f, &iter_f, bm_temp, BM_FACES_OF_MESH){
+							float no[3];
+							float P[3];
+							BM_face_calc_normal(f, no);
+							BM_face_calc_center_mean(f, P);
 
-									copy_v3_v3(copy_v->co, P);
-									//No need to iterate over the remaining faces
-									break;
-								}
+							if( inface->back_f != calc_if_B_nor(m_d->cam_loc, P, no) ){
+								new_inco_faces++;
 							}
+						}
 
-							int new_inco_faces;
-							float new_dist = len_v3v3(old_pos, copy_v->co);
-
-							BM_ITER_ELEM_INDEX (edge, &iter_e, copy_f, BM_EDGES_OF_FACE, edge_idx) {
-								BMesh *bm_temp = BM_mesh_copy(bm_fan_copy);
-								BMEdge *temp_e = BM_edge_at_index_find(bm_temp, BM_elem_index_get(edge));
-								BMVert *split_vert = NULL;
-
-								for(int j = 0; j < 10; j++){
-									if (!valid_split_pos[edge_idx][j]){
-                                    	continue;
-									}
-									new_inco_faces = 0;
-
-									if( split_vert == NULL){
-										split_vert = split_edge_and_move_nor(bm_temp, temp_e, split_vert_pos[edge_idx][j], vert->no);
-									} else {
-                                    	copy_v3_v3(split_vert->co, split_vert_pos[edge_idx][j]);
-									}
-
-									BM_ITER_MESH (f, &iter_f, bm_temp, BM_FACES_OF_MESH){
-										float no[3];
-										float P[3];
-										BM_face_calc_normal(f, no);
-										BM_face_calc_center_mean(f, P);
-
-										if( inface->back_f != calc_if_B_nor(m_d->cam_loc, P, no) ){
-											new_inco_faces++;
-										}
-									}
+						BMEdge *tmp_e;
+						BMIter tmp_iter;
+						float edge_max = 0;
+						float edge_min = INFINITY;
 
-									if( new_inco_faces < best_inco_faces ){
-										best_edge = edge_idx;
-										best_inco_faces = new_inco_faces;
-										best_dist = new_dist;
-										copy_v3_v3( best_pos, copy_v->co );
-										copy_v3_v3( best_edge_split_pos, split_vert_pos[edge_idx][j] );
-										done = true;
-									} else if (new_inco_faces == best_inco_faces && new_dist < best_dist){
-										best_edge = edge_idx;
-										best_dist = new_dist;
-										copy_v3_v3( best_pos, copy_v->co );
-										copy_v3_v3( best_edge_split_pos, split_vert_pos[edge_idx][j] );
-										done = true;
-									}
-								}
-								BM_mesh_free(bm_temp);
+						BM_ITER_ELEM (tmp_e, &tmp_iter, split_vert, BM_EDGES_OF_VERT) {
+							float edge_len = BM_edge_calc_length(tmp_e);
+							if (edge_len > edge_max){
+								edge_max = edge_len;
+							}
+							if (edge_len < edge_min){
+								edge_min = edge_len;
 							}
-						}
 						}
 
-						BLI_rng_free(rng);
-						copy_v3_v3(vert->co, best_pos);
+						float new_dist = edge_max - edge_min;
+
+						if( new_inco_faces < best_inco_faces ){
+							best_edge = edge_idx;
+							best_inco_faces = new_inco_faces;
+							best_dist = new_dist;
+							copy_v3_v3( best_edge_split_pos, split_vert_pos[edge_idx][j] );
+							done = true;
+						} else if (new_inco_faces == best_inco_faces && new_dist < best_dist){
+							best_edge = edge_idx;
+							best_dist = new_dist;
+							copy_v3_v3( best_edge_split_pos, split_vert_pos[edge_idx][j] );
+							done = true;
+						}
+					}
+					BM_mesh_free(bm_temp);
+				}
 
-						if( done ){
-							BM_ITER_ELEM_INDEX (edge, &iter_e, inface->face, BM_EDGES_OF_FACE, edge_idx) {
-                            	if( edge_idx == best_edge ){
-									print_v3("best split pos", best_edge_split_pos);
-									split_edge_and_move_nor(m_d->bm, edge, best_edge_split_pos, vert->no);
-                                	break;
-								}
-							}
-							inface->face = NULL;
-							//null_opti_vert(m_d, vert, inface->back_f, &inco_faces);
-							fixed_verts++;
-							printf("Edge wiggle\n");
+				if( done ){
+					BMVert *split_vert;
+					BM_ITER_ELEM_INDEX (edge, &iter_e, inface->face, BM_EDGES_OF_FACE, edge_idx) {
+						if( edge_idx == best_edge ){
+							print_v3("best split pos", best_edge_split_pos);
+							split_vert = split_edge_and_move_nor(m_d->bm, edge, best_edge_split_pos, inface->face->no);
 							break;
-						} else {
-							printf("Bad edge wiggle\n");
 						}
 					}
-
-
+					null_opti_vert(m_d, split_vert, inface->back_f, &inco_faces);
+					printf("Edge wiggle\n");
+				} else {
+					printf("Bad edge wiggle\n");
 				}
 			}
 
@@ -3796,7 +3740,7 @@ static void optimization( MeshData *m_d ){
 					i++;
 				}
 
-				len = len / (float)(i*2);
+				len = len / (float)i;
 
 				for( i = 0; i < 100; i++ ){
 					BMFace *face;
@@ -3808,9 +3752,9 @@ static void optimization( MeshData *m_d ){
 					copy_v3_v3(co, vert->no);
 
 					if( i % 2 ){
-						cur_len = len * (float)((i+1)/2) / 50.0f;
+						cur_len = len * (float)(i) / 100.0f;
 					} else {
-						cur_len = len * (float)((i+2)/2) / -50.0f;
+						cur_len = len * (float)(i+1) / -100.0f;
 					}
 
 					mul_v3_fl(co, cur_len);



More information about the Bf-blender-cvs mailing list