Commit: 0b8e41098c0de0ac09d352080d2eb188517ae6de
Author: Sebastian Parborg
Date:   Thu Aug 9 20:51:46 2018 +0200
Branches: soc-2018-npr
https://developer.blender.org/rB0b8e41098c0de0ac09d352080d2eb188517ae6de

Rewrite mult_radi

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

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 e2e9ba1b905..6468ffd7c49 100644
--- a/source/blender/modifiers/intern/MOD_mybmesh.c
+++ b/source/blender/modifiers/intern/MOD_mybmesh.c
@@ -914,10 +914,8 @@ static void convert_uv_to_new_face(BMEdge *e, BMFace 
*old_f, BMFace *f, float *u
 }
 
 static bool append_vert(BLI_Buffer *C_verts, BMVert *vert){
-       int vert_i;
-
        //check if vert is already in the buffer
-       for(vert_i = 0; vert_i < C_verts->count; vert_i++){
+       for(int vert_i = 0; vert_i < C_verts->count; vert_i++){
                if( vert == BLI_buffer_at(C_verts, BMVert*, vert_i)){
                        return false;
                }
@@ -926,6 +924,17 @@ static bool append_vert(BLI_Buffer *C_verts, BMVert *vert){
        return true;
 }
 
+static bool append_face(BLI_Buffer *faces, BMFace *face){
+       //check if vert is already in the buffer
+       for(int face_i = 0; face_i < faces->count; face_i++){
+               if( face == BLI_buffer_at(faces, BMFace*, face_i)){
+                       return false;
+               }
+       }
+       BLI_buffer_append(faces, BMFace*, face);
+       return true;
+}
+
 static Vert_buf* get_shift_vert( BMVert *vert, MeshData *m_d ){
        int vert_i;
 
@@ -1126,17 +1135,7 @@ static void mult_face_search( BMFace *f, BMFace *f2, 
BMEdge *e, MeshData *m_d ){
        //First face
        BM_ITER_ELEM (vert, &iter_v, f, BM_VERTS_OF_FACE) {
                BM_ITER_ELEM (face, &iter_f, vert, BM_FACES_OF_VERT) {
-                       bool dup_face = false;
-                       //check if face is already in the buffer
-                       for(int face_i = 0; face_i < faces.count; face_i++){
-                               if( face == BLI_buffer_at(&faces, BMFace*, 
face_i)){
-                                       dup_face = true;
-                                       break;
-                               }
-                       }
-                       if (!dup_face){
-                               BLI_buffer_append(&faces, BMFace*, face);
-                       }
+                       append_face(&faces, face);
                }
        }
 
@@ -2157,236 +2156,196 @@ static void mult_radi_search( BLI_Buffer *diff_f, 
const float cent[3], const flo
        BMVert *vert;
        BMFace *face;
        BMIter iter_f, iter_v;
-       int edge_count, f_idx;
-       bool found_vert = false;
-       float mat[3][3];
 
-       for(f_idx = 0; f_idx < diff_f->count; f_idx++){
+       BLI_buffer_declare_static(BMFace*, search_faces, BLI_BUFFER_NOP, 32);
+
+       for(int f_idx = 0; f_idx < diff_f->count; f_idx++){
                BMFace *f = BLI_buffer_at(diff_f, BMFace*, f_idx);
                BM_ITER_ELEM (vert, &iter_v, f, BM_VERTS_OF_FACE) {
-                       if( !BM_vert_is_boundary(vert) && 
BM_vert_edge_count(vert) == BM_vert_face_count(vert) ){
-                               bool e1 = false;
-                               bool e2 = false;
-                               bool f_cent = false;
-
-                float normal[3];
-
-                               BM_face_calc_normal(f, normal);
-                               axis_dominant_v3_to_m3(mat, normal);
-
-                               BM_ITER_ELEM (face, &iter_f, vert, 
BM_FACES_OF_VERT) {
-                                       if( point_inside(mat, edge1_mid, face) 
){
-                                               e1 = true;
-                                       }
-                                       if( point_inside(mat, edge2_mid, face) 
){
-                                               e2 = true;
-                                       }
-                                       if( point_inside(mat, cent, face) ){
-                                               f_cent = true;
-                                       }
-                                       if(e1 && e2 && f_cent){
-                                               edge_count = 
BM_vert_edge_count(vert);
-                                               found_vert = true;
-                                               break;
-                                       }
-                               }
+                       BM_ITER_ELEM (face, &iter_f, vert, BM_FACES_OF_VERT) {
+                               append_face(&search_faces, face);
                        }
-                       if(found_vert){
-                               break;
-                       }
-               }
-               if(found_vert){
-                       break;
                }
        }
 
-       if( !found_vert ){
-               //We can't easily interpolate this edge, do not try to insert a 
new vertex here
-               //printf("Couldn't find any suitable interpolation vertex!\n");
-               return;
-       }
-
+       //Find the faces for our three points
        {
-               int edge_idx = 0;
+               float uvs[3][2];
+               BMFace *face_ids[3];
+               float rad_dir[3];
+               int search_id;
+
+               rad_dir[1] = signf(val_1);
+               rad_dir[2] = signf(val_2);
+
+               for (int face_idx = 0; face_idx < search_faces.count; 
face_idx++) {
+                       int found_points = 0;
+                       for (int i = 0; i < 3; i++) {
+                               float point[3];
+                               float mat[3][3];
 
-               BMLoop *first_loop = BM_face_vert_share_loop( vert->e->l->f, 
vert );
-               BMLoop *cur_loop = first_loop;
-               BMEdge *cur_edge;
-               BMFace **faces = BLI_array_alloca(faces, edge_count);
+                               switch(i){
+                                       case 1 :
+                                               copy_v3_v3(point, edge1_mid);
+                                               break;
+                                       case 2 :
+                                               copy_v3_v3(point, edge2_mid);
+                                               break;
+                                       default:
+                                               copy_v3_v3(point, cent);
+                                               break;
+                               }
 
-               cur_edge = vert->e;
+                               BMFace *f = BLI_buffer_at(&search_faces, 
BMFace*, face_idx);
+                               axis_dominant_v3_to_m3(mat, f->no);
 
-               do {
-                       faces[edge_idx] = cur_loop->f;
-                       edge_idx++;
-               } while (((cur_loop = BM_vert_step_fan_loop(cur_loop, 
&cur_edge)) != first_loop) && (cur_loop != NULL));
+                               if( point_inside(mat, point, f) ){
+                                       float point_v2[2];
+                                       float P[3], du[3], dv[3], temp[3];
 
-               //Find the faces for our three points
-               {
-                       int i;
-                       float uvs[3][2];
-                       BMFace *face_ids[3];
-                       float rad_dir[3];
-                       int search_id;
-
-                       rad_dir[1] = signf(val_1);
-                       rad_dir[2] = signf(val_2);
-
-                       for ( edge_idx = 0; edge_idx < edge_count; edge_idx++) {
-                               for ( i = 0; i < 3; i++) {
-                                       float point[3];
-                                       switch(i){
-                                               case 1 :
-                                                       copy_v3_v3(point, 
edge1_mid);
-                                                       break;
-                                               case 2 :
-                                                       copy_v3_v3(point, 
edge2_mid);
-                                                       break;
-                                               default:
-                                                       copy_v3_v3(point, cent);
-                                                       break;
-                                       }
-
-                                       if( point_inside(mat, point, 
faces[edge_idx]) ){
-                                               float point_v2[2];
-                                               float P[3], du[3], dv[3], 
temp[3];
+                                       mul_v2_m3v3(point_v2, mat, point);
 
-                                               mul_v2_m3v3(point_v2, mat, 
point);
+                                       get_uv_point(f, uvs[i], point_v2, mat);
 
-                                               get_uv_point(faces[edge_idx], 
uvs[i], point_v2, mat);
+                                       face_ids[i] = f;
+                                       found_points++;
+                                       if( i == 0 ){
+                                               //Save rad_dir for cent
+                                               
m_d->eval->evaluateLimit(m_d->eval, BM_elem_index_get(f), uvs[i][0], uvs[i][1], 
P, du, dv);
 
-                                               face_ids[i] = faces[edge_idx];
-                                               if( i == 0 ){
-                                                       //Save rad_dir for cent
-                                                       
m_d->eval->evaluateLimit(m_d->eval, BM_elem_index_get(face_ids[i]), uvs[i][0], 
uvs[i][1], P, du, dv);
-
-                                                       sub_v3_v3v3(temp, P, 
C_vert_pos);
-                                                       rad_dir[i] = 
signf(dot_v3v3(rad_plane_no, temp));
-                                               }
+                                               sub_v3_v3v3(temp, P, 
C_vert_pos);
+                                               rad_dir[i] = 
signf(dot_v3v3(rad_plane_no, temp));
                                        }
                                }
                        }
-                       if( rad_dir[0] == rad_dir[1] ){
-                               search_id = 2;
-                       } else {
-                               search_id = 1;
+                       if (found_points == 3){
+                               //We have found all points inside the same face!
+                               break;
                        }
+               }
+               if( rad_dir[0] == rad_dir[1] ){
+                       search_id = 2;
+               } else {
+                       search_id = 1;
+               }
 
-                       {
-                               float search_val, uv_P[2], P[3], du[3], dv[3], 
temp[3];
-                               float step = 0.5f;
-                               float step_len = 0.25f;
-                               int face_index;
-                               BMFace *orig_face;
-                               Vert_buf v_buf;
-                /*
-                               print_v3("cent", cent);
-                               print_v3("edge1_mid", edge1_mid);
-                               print_v3("edge2_mid", edge2_mid);
-                               print_v3("rad_dir", rad_dir);
-                               print_v2("UV_cent", uvs[0]);
-                               print_v2("UV_edge1", uvs[1]);
-                               print_v2("UV_edge2", uvs[2]);
-                */
-                               if( face_ids[0] == face_ids[search_id] ){
-                                       //We can work in pure uv space
-                                       //printf("UV space\n");
-                                       orig_face = face_ids[0];
-                                       face_index = 
BM_elem_index_get(face_ids[0]);
-                                       for( i = 0; i < 10; i++ ){
-                                               interp_v2_v2v2( uv_P, uvs[0], 
uvs[search_id], step);
-                                               
m_d->eval->evaluateLimit(m_d->eval, face_index, uv_P[0], uv_P[1], P, du, dv);
-
-                                               sub_v3_v3v3(temp, P, 
C_vert_pos);
-                                               search_val = 
dot_v3v3(rad_plane_no, temp);
-
-                                               if( fabs(search_val) < 1e-14 ){
-                                                       //We got lucky and 
found the zero crossing!
-                                                       printf("got lucky\n");
-                                                       break;
-                                               }
-
-                                               search_val = signf(search_val);
-
-                                               if( signf(search_val) == 
rad_dir[0] ){
-                                                       step += step_len;
-                                               } else {
-                                                       step -= step_len;
-                                               }
-
-                                               step_len = step_len/2.0f;
+               {
+                       float search_val, uv_P[2], P[3], du[3], dv[3], temp[3];
+                       float step = 0.5f;
+                       float step_len = 0.25f;
+                       int face_index;
+                       BMFace *orig_face;
+                       Vert_buf v_buf;
+                       /*
+                          print_v3("cent", cent);
+                          print_v3("edge1_mid", edge1_mid);
+                          print_v3("edge2_mid", edge2_mid);
+                          print_v3("rad_dir", rad_dir);
+                          print_v2("UV_cent", uvs[0]);
+                          print_v2("UV_edge1", uvs[1]);
+                          print_v2("UV_edge2", uvs[2]);
+                          */
+                       if( face_ids[0] == face_ids[search_id] ){
+                               //We can work in pure uv space
+                               //printf("UV space\n");
+                               orig_face = face_ids[0];
+                               face_index = BM_elem_index_get(face_ids[0]);
+                               for(int i = 0; i < 10; i++ ){
+                                       interp_v2_v2v2( uv_P, uvs[0], 
uvs[search_id], step);
+                                       m_d->eval->evaluateLimit(m_d->eval, 
face_index, uv_P[0], uv_P[1], P, du, dv);
+
+                                       sub_v3_v3v3(temp, P, C_vert_pos);
+                                       search_val = dot_v3v3(rad_plane_no, 
temp);
+
+                                       if( fabs(search_val) < 1e-14 ){
+                                               //We got lucky and found the 
zero crossing!
+                                               printf("got lucky\n");
+                                               break;
                                        }
-                               } else {
-                                       //Work in coord space
-                                       float cur_p[3], end[3];
 
-                                       //printf("Coord space\n");
-                                       if( search_id == 1 ){
-                                               copy_v3_v3(end, edge1_mid);
+                                       search_val = signf(search_val);
+
+                                       if( signf(search_val) == rad_dir[0] ){
+                                               step += step_len;
                                        } else {
-                                               copy_v3_v3(end, edge2_mid);
+                                               step -= step_len;
                                        }
 
-                                       for( i = 0; i < 10; i++ ){
-                                               interp_v3_v3v3(cur_p, cent, 
end, step);
+                                       step_len = step_len/2.0f;
+                               }
+                       } else {
+                               //Work in coord space
+                               float cur_p[3], end[3];
+                               float mat[3][3];
 
-                                               for ( edge_idx = 0; edge_idx < 
edge_count; edge_idx++) {
-                                                       if( point_inside(mat, 
cur_p, faces[edge_idx]) ){
-                                                               float 
point_v2[2];
-                                                               
mul_v2_m3v3(point_v2, mat, cur_p);
+                               //printf("Coord space\n");
+                               if( search_id == 1 ){
+                                       copy_v3_v3(end, edge1_mid);
+                               } else {
+                                       copy_v3_v3(end, edge2_mid);
+                               }
 
-                                                               
get_uv_point(faces[edge_idx], uv_P, point_v2, mat);
+                               for(int i = 0; i < 10; i++ ){
+                                       interp_v3_v3v3(cur_p, cent, end, step);
 
-                                                               orig_face = 
faces[edge_idx];
-                                                               face_index = 
BM_elem_index_get(faces[edge_idx]);
-                                                               
m_d->eval->evaluateLimit(m_d->eval, face_index, uv_P[0], uv_P[1], P, du, dv);
+                                       for (int face_idx = 0; face_idx < 
search_faces.count; face_idx++) {
+                                               BMFace *f = 
BLI_buffer_at(&search_faces, BMFace*, face_idx);
+                                               axis_dominant_v3_to_m3(mat, 
f->no);
+                                               if( point_inside(mat, cur_p, f) 
){
+                                                       float point_v2[2];
+                                                       mul_v2_m3v3(point_v2, 
mat, cur_p);
 
-                                                               break;
-                                                       }
-                                               }


@@ Diff output truncated at 10240 characters. @@

_______________________________________________
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to