Commit: abbd82a5040baa3950801c5be3596c0cd71c94fc
Author: Campbell Barton
Date:   Thu Jul 23 15:10:12 2015 +1000
Branches: master
https://developer.blender.org/rBabbd82a5040baa3950801c5be3596c0cd71c94fc

Use looptri for mesh remapping

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

M       source/blender/blenkernel/intern/mesh_remap.c

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

diff --git a/source/blender/blenkernel/intern/mesh_remap.c 
b/source/blender/blenkernel/intern/mesh_remap.c
index 082e0de..ec8b362 100644
--- a/source/blender/blenkernel/intern/mesh_remap.c
+++ b/source/blender/blenkernel/intern/mesh_remap.c
@@ -537,7 +537,6 @@ void BKE_mesh_remap_calc_verts_from_dm(
                        MPoly *polys_src = dm_src->getPolyArray(dm_src);
                        MLoop *loops_src = dm_src->getLoopArray(dm_src);
                        float (*vcos_src)[3] = MEM_mallocN(sizeof(*vcos_src) * 
(size_t)dm_src->getNumVerts(dm_src), __func__);
-                       int *tessface_to_poly_map_src;
 
                        size_t tmp_buff_size = MREMAP_DEFAULT_BUFSIZE;
                        float (*vcos)[3] = MEM_mallocN(sizeof(*vcos) * 
tmp_buff_size, __func__);
@@ -545,9 +544,7 @@ void BKE_mesh_remap_calc_verts_from_dm(
                        float *weights = MEM_mallocN(sizeof(*weights) * 
tmp_buff_size, __func__);
 
                        dm_src->getVertCos(dm_src, vcos_src);
-                       bvhtree_from_mesh_faces(&treedata, dm_src, (mode & 
MREMAP_USE_NORPROJ) ? ray_radius : 0.0f, 2, 6);
-                       /* bvhtree here uses tesselated faces... */
-                       tessface_to_poly_map_src = 
dm_src->getTessFaceDataArray(dm_src, CD_ORIGINDEX);
+                       bvhtree_from_mesh_looptri(&treedata, dm_src, (mode & 
MREMAP_USE_NORPROJ) ? ray_radius : 0.0f, 2, 6);
 
                        if (mode == MREMAP_MODE_VERT_POLYINTERP_VNORPROJ) {
                                for (i = 0; i < numverts_dst; i++) {
@@ -565,7 +562,8 @@ void BKE_mesh_remap_calc_verts_from_dm(
                                        if (mesh_remap_bvhtree_query_raycast(
                                                &treedata, &rayhit, tmp_co, 
tmp_no, ray_radius, max_dist, &hit_dist))
                                        {
-                                               MPoly *mp_src = 
&polys_src[tessface_to_poly_map_src[rayhit.index]];
+                                               const MLoopTri *lt = 
&treedata.looptri[rayhit.index];
+                                               MPoly *mp_src = 
&polys_src[lt->poly];
                                                const int sources_num = 
mesh_remap_interp_poly_data_get(
                                                        mp_src, loops_src, 
(const float (*)[3])vcos_src, rayhit.co,
                                                        &tmp_buff_size, &vcos, 
false, &indices, &weights, true, NULL);
@@ -592,7 +590,8 @@ void BKE_mesh_remap_calc_verts_from_dm(
                                        }
 
                                        if 
(mesh_remap_bvhtree_query_nearest(&treedata, &nearest, tmp_co, max_dist_sq, 
&hit_dist)) {
-                                               MPoly *mp = 
&polys_src[tessface_to_poly_map_src[nearest.index]];
+                                               const MLoopTri *lt = 
&treedata.looptri[rayhit.index];
+                                               MPoly *mp = 
&polys_src[lt->poly];
 
                                                if (mode == 
MREMAP_MODE_VERT_POLY_NEAREST) {
                                                        int index;
@@ -810,12 +809,9 @@ void BKE_mesh_remap_calc_edges_from_dm(
                        MPoly *polys_src = dm_src->getPolyArray(dm_src);
                        MLoop *loops_src = dm_src->getLoopArray(dm_src);
                        float (*vcos_src)[3] = MEM_mallocN(sizeof(*vcos_src) * 
(size_t)dm_src->getNumVerts(dm_src), __func__);
-                       int *tessface_to_poly_map_src;
 
                        dm_src->getVertCos(dm_src, vcos_src);
-                       bvhtree_from_mesh_faces(&treedata, dm_src, 0.0f, 2, 6);
-                       /* bvhtree here uses tesselated faces... */
-                       tessface_to_poly_map_src = 
dm_src->getTessFaceDataArray(dm_src, CD_ORIGINDEX);
+                       bvhtree_from_mesh_looptri(&treedata, dm_src, 0.0f, 2, 
6);
 
                        for (i = 0; i < numedges_dst; i++) {
                                float tmp_co[3];
@@ -828,7 +824,8 @@ void BKE_mesh_remap_calc_edges_from_dm(
                                }
 
                                if (mesh_remap_bvhtree_query_nearest(&treedata, 
&nearest, tmp_co, max_dist_sq, &hit_dist)) {
-                                       MPoly *mp_src = 
&polys_src[tessface_to_poly_map_src[nearest.index]];
+                                       const MLoopTri *lt = 
&treedata.looptri[rayhit.index];
+                                       MPoly *mp_src = &polys_src[lt->poly];
                                        MLoop *ml_src = 
&loops_src[mp_src->loopstart];
                                        int nloops = mp_src->totloop;
                                        float best_dist_sq = FLT_MAX;
@@ -1177,12 +1174,11 @@ void BKE_mesh_remap_calc_loops_from_dm(
                int *vert_to_poly_map_src_buff = NULL;
                MeshElemMap *edge_to_poly_map_src = NULL;
                int *edge_to_poly_map_src_buff = NULL;
-               MeshElemMap *poly_to_tessface_map_src = NULL;
-               int *poly_to_tessface_map_src_buff = NULL;
+               MeshElemMap *poly_to_looptri_map_src = NULL;
+               int *poly_to_looptri_map_src_buff = NULL;
 
                /* Unlike above, those are one-to-one mappings, simpler! */
                int *loop_to_poly_map_src = NULL;
-               int *tessface_to_poly_map_src = NULL;
 
                bool verts_allocated_src;
                MVert *verts_src = DM_get_vert_array(dm_src, 
&verts_allocated_src);
@@ -1197,9 +1193,9 @@ void BKE_mesh_remap_calc_loops_from_dm(
                bool polys_allocated_src;
                MPoly *polys_src = DM_get_poly_array(dm_src, 
&polys_allocated_src);
                const int num_polys_src = dm_src->getNumPolys(dm_src);
-               bool faces_allocated_src = false;
-               MFace *faces_src = NULL;
-               int num_faces_src = 0;
+               bool looptri_allocated_src = false;
+               const MLoopTri *looptri_src = NULL;
+               int num_looptri_src = 0;
 
                size_t buff_size_interp = MREMAP_DEFAULT_BUFSIZE;
                float (*vcos_interp)[3] = NULL;
@@ -1379,52 +1375,58 @@ void BKE_mesh_remap_calc_loops_from_dm(
                }
                else {  /* We use polygons. */
                        if (use_islands) {
-                               /* bvhtree here uses tesselated faces... */
+                               /* bvhtree here uses looptri faces... */
                                const unsigned int dirty_tess_flag = 
dm_src->dirty & DM_DIRTY_TESS_CDLAYERS;
-                               BLI_bitmap *faces_active;
+                               BLI_bitmap *looptri_active;
 
                                /* We do not care about tessellated data here, 
only geometry itself is important. */
                                if (dirty_tess_flag) {
                                        dm_src->dirty &= ~dirty_tess_flag;
                                }
-                               DM_ensure_tessface(dm_src);
+                               DM_ensure_looptri(dm_src);
                                if (dirty_tess_flag) {
                                        dm_src->dirty |= dirty_tess_flag;
                                }
-                               faces_src = DM_get_tessface_array(dm_src, 
&faces_allocated_src);
-                               num_faces_src = dm_src->getNumTessFaces(dm_src);
-                               tessface_to_poly_map_src = 
dm_src->getTessFaceDataArray(dm_src, CD_ORIGINDEX);
-                               faces_active = 
BLI_BITMAP_NEW((size_t)num_faces_src, __func__);
+
+                               looptri_src = DM_get_looptri_array(
+                                       dm_src,
+                                       verts_src,
+                                       polys_src, num_polys_src,
+                                       loops_src, num_loops_src,
+                                       &looptri_allocated_src);
+                               num_looptri_src = dm_src->getNumLoopTri(dm_src);
+                               looptri_active = 
BLI_BITMAP_NEW((size_t)num_looptri_src, __func__);
 
                                for (tindex = 0; tindex < num_trees; tindex++) {
-                                       int num_faces_active = 0;
-                                       BLI_BITMAP_SET_ALL(faces_active, false, 
(size_t)num_faces_src);
-                                       for (i = 0; i < num_faces_src; i++) {
-                                               mp_src = 
&polys_src[tessface_to_poly_map_src[i]];
+                                       int num_looptri_active = 0;
+                                       BLI_BITMAP_SET_ALL(looptri_active, 
false, (size_t)num_looptri_src);
+                                       for (i = 0; i < num_looptri_src; i++) {
+                                               mp_src = 
&polys_src[looptri_src[i].poly];
                                                if 
(island_store.items_to_islands[mp_src->loopstart] == tindex) {
-                                                       
BLI_BITMAP_ENABLE(faces_active, i);
-                                                       num_faces_active++;
+                                                       
BLI_BITMAP_ENABLE(looptri_active, i);
+                                                       num_looptri_active++;
                                                }
                                        }
                                        /* verts and faces 'ownership' is 
transfered to treedata here, which will handle its freeing. */
-                                       bvhtree_from_mesh_faces_ex(
-                                               &treedata[tindex], verts_src, 
verts_allocated_src,
-                                               faces_src, num_faces_src, 
faces_allocated_src,
-                                               faces_active, num_faces_active, 
bvh_epsilon, 2, 6);
+                                       bvhtree_from_mesh_looptri_ex(
+                                               &treedata[tindex],
+                                               verts_src, verts_allocated_src,
+                                               loops_src, loops_allocated_src,
+                                               looptri_src, num_looptri_src, 
looptri_allocated_src,
+                                               looptri_active, 
num_looptri_active, bvh_epsilon, 2, 6);
                                        if (verts_allocated_src) {
                                                verts_allocated_src = false;  
/* Only 'give' our verts once, to first tree! */
                                        }
-                                       if (faces_allocated_src) {
-                                               faces_allocated_src = false;  
/* Only 'give' our faces once, to first tree! */
+                                       if (looptri_allocated_src) {
+                                               looptri_allocated_src = false;  
/* Only 'give' our looptri once, to first tree! */
                                        }
                                }
 
-                               MEM_freeN(faces_active);
+                               MEM_freeN(looptri_active);
                        }
                        else {
                                BLI_assert(num_trees == 1);
-                               bvhtree_from_mesh_faces(&treedata[0], dm_src, 
bvh_epsilon, 2, 6);
-                               tessface_to_poly_map_src = 
dm_src->getTessFaceDataArray(dm_src, CD_ORIGINDEX);
+                               bvhtree_from_mesh_looptri(&treedata[0], dm_src, 
bvh_epsilon, 2, 6);
                        }
                }
 
@@ -1571,7 +1573,7 @@ void BKE_mesh_remap_calc_loops_from_dm(
                                                        {
                                                                
islands_res[tindex][plidx_dst].factor = (hit_dist ? (1.0f / hit_dist) : 1e18f) 
* w;
                                                                
islands_res[tindex][plidx_dst].hit_dist = hit_dist;
-                                                               
islands_res[tindex][plidx_dst].index_src = 
tessface_to_poly_map_src[rayhit.index];
+                                                               
islands_res[tindex][plidx_dst].index_src = 
(int)tdata->looptri[rayhit.index].poly;
                                                                
copy_v3_v3(islands_res[tindex][plidx_dst].hit_point, rayhit.co);
                                                                break;
                                                        }
@@ -1599,7 +1601,7 @@ void BKE_mesh_remap_calc_loops_from_dm(
 
                                                        if 
(mesh_remap_bvhtree_query_nearest(tdata, &nearest, tmp_co, max_dist_sq, 
&hit_dist)) {
                                                                
islands_res[tindex][plidx_dst].hit_dist = hit_dist;
-                                                               
islands_res[tindex][plidx_dst].index_src = 
tessface_to_poly_map_src[nearest.index];
+                                                               
islands_res[tindex][plidx_dst].index_src = 
(int)tdata->looptri[nearest.index].poly;
                                                                
copy_v3_v3(islands_res[tindex][plidx_dst].hit_point, nearest.co);
                                                        }
                                                        else {
@@ -1623,7 +1625,7 @@ void BKE_mesh_remap_calc_loops_from_dm(
                                                if 
(mesh_remap_bvhtree_query_nearest(tdata, &nearest, tmp_co, max_dist_sq, 
&hit_dist)) {
                                                        
islands_res[tindex][plidx_dst].factor = hit_dist ? (1.0f / hit_dist) : 1e18f;
                                                        
islands_res[tindex][plidx_dst].hit_dist = hit_dist;
-                                                       
islands_res[tindex][plidx_dst].index_src = 
tessface_to_poly_map_src[nearest.index];
+                                                       
islands_res[tindex][plidx_dst].index_src = 
(int)tdata->looptri[nearest.index].poly;
                                                        
copy_v3_v3(islands_res[tindex][plidx_dst].hit_point, nearest.co);
                                                }
                                                else {
@@ -1835,35 +1837,28 @@ void BKE_mesh_remap_calc_loops_from_dm(
                                                                                
mp_src = &polys_src[pidx_src];
 
                                                                                
/* Create that one on demand. */
-                                                                               
if (poly_to_tessface_map_src == NULL) {
-                                                                               
        BKE_mesh_origindex_map_create(
-                                                                               
                &poly_to_tessface_map_src, &poly_to_tessface_map_src_buff,
-                                                                               
                num_faces_src, tessface_to_poly_map_src, num_polys_src);
+                                                                               
if (poly_to_looptri_map_src == NULL) {
+                                                                               
        BKE_mesh_origindex_map_create_looptri(
+                                                                               
                &poly_to_looptri_map_src, &poly_to_looptri_map_src_buff,
+                                                                               
                polys_src, num_polys_src,
+                                                                               
                looptri_src, num_looptri_src);
                                                                                
}
 
-                                                               

@@ Diff output truncated at 10240 characters. @@

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

Reply via email to