Blender  V3.3
Classes | Variables
mesh_remap.c File Reference
#include <limits.h>
#include "CLG_log.h"
#include "MEM_guardedalloc.h"
#include "DNA_mesh_types.h"
#include "DNA_meshdata_types.h"
#include "BLI_alloca.h"
#include "BLI_astar.h"
#include "BLI_bitmap.h"
#include "BLI_math.h"
#include "BLI_memarena.h"
#include "BLI_polyfill_2d.h"
#include "BLI_rand.h"
#include "BLI_utildefines.h"
#include "BKE_bvhutils.h"
#include "BKE_customdata.h"
#include "BKE_mesh.h"
#include "BKE_mesh_mapping.h"
#include "BKE_mesh_remap.h"
#include "BKE_mesh_runtime.h"
#include "BLI_strict_flags.h"

Go to the source code of this file.

Classes

struct  IslandResult
 

Functions

Some Generic Helpers
static bool mesh_remap_bvhtree_query_nearest (BVHTreeFromMesh *treedata, BVHTreeNearest *nearest, const float co[3], const float max_dist_sq, float *r_hit_dist)
 
static bool mesh_remap_bvhtree_query_raycast (BVHTreeFromMesh *treedata, BVHTreeRayHit *rayhit, const float co[3], const float no[3], const float radius, const float max_dist, float *r_hit_dist)
 
Auto-match.

Find transform of a mesh to get best match with another.

float BKE_mesh_remap_calc_difference_from_mesh (const SpaceTransform *space_transform, const MVert *verts_dst, const int numverts_dst, Mesh *me_src)
 
static void mesh_calc_eigen_matrix (const MVert *verts, const float(*vcos)[3], const int numverts, float r_mat[4][4])
 
void BKE_mesh_remap_find_best_match_from_mesh (const MVert *verts_dst, const int numverts_dst, Mesh *me_src, SpaceTransform *r_space_transform)
 

Variables

static CLG_LogRef LOG = {"bke.mesh"}
 

Mesh to Mesh Mapping

#define MREMAP_RAYCAST_APPROXIMATE_NR   3
 
#define MREMAP_RAYCAST_APPROXIMATE_FAC   5.0f
 
#define MREMAP_RAYCAST_TRI_SAMPLES_MIN   4
 
#define MREMAP_RAYCAST_TRI_SAMPLES_MAX   20
 
#define MREMAP_DEFAULT_BUFSIZE   32
 
#define POLY_UNSET   0
 
#define POLY_CENTER_INIT   1
 
#define POLY_COMPLETE   2
 
#define ASTAR_STEPS_MAX   64
 
typedef struct IslandResult IslandResult
 
void BKE_mesh_remap_calc_source_cddata_masks_from_map_modes (const int UNUSED(vert_mode), const int UNUSED(edge_mode), const int loop_mode, const int UNUSED(poly_mode), CustomData_MeshMasks *r_cddata_mask)
 
void BKE_mesh_remap_init (MeshPairRemap *map, const int items_num)
 
void BKE_mesh_remap_free (MeshPairRemap *map)
 
static void mesh_remap_item_define (MeshPairRemap *map, const int index, const float UNUSED(hit_dist), const int island, const int sources_num, const int *indices_src, const float *weights_src)
 
void BKE_mesh_remap_item_define_invalid (MeshPairRemap *map, const int index)
 
static int mesh_remap_interp_poly_data_get (const MPoly *mp, MLoop *mloops, const float(*vcos_src)[3], const float point[3], size_t *buff_size, float(**vcos)[3], const bool use_loops, int **indices, float **weights, const bool do_weights, int *r_closest_index)
 
void BKE_mesh_remap_calc_verts_from_mesh (const int mode, const SpaceTransform *space_transform, const float max_dist, const float ray_radius, const MVert *verts_dst, const int numverts_dst, const bool UNUSED(dirty_nors_dst), Mesh *me_src, Mesh *me_dst, MeshPairRemap *r_map)
 
void BKE_mesh_remap_calc_edges_from_mesh (const int mode, const SpaceTransform *space_transform, const float max_dist, const float ray_radius, const MVert *verts_dst, const int numverts_dst, const MEdge *edges_dst, const int numedges_dst, const bool UNUSED(dirty_nors_dst), Mesh *me_src, Mesh *me_dst, MeshPairRemap *r_map)
 
static void mesh_island_to_astar_graph_edge_process (MeshIslandStore *islands, const int island_index, BLI_AStarGraph *as_graph, MVert *verts, MPoly *polys, MLoop *loops, const int edge_idx, BLI_bitmap *done_edges, MeshElemMap *edge_to_poly_map, const bool is_edge_innercut, const int *poly_island_index_map, float(*poly_centers)[3], unsigned char *poly_status)
 
static void mesh_island_to_astar_graph (MeshIslandStore *islands, const int island_index, MVert *verts, MeshElemMap *edge_to_poly_map, const int numedges, MLoop *loops, MPoly *polys, const int numpolys, BLI_AStarGraph *r_as_graph)
 
static float mesh_remap_calc_loops_astar_f_cost (BLI_AStarGraph *as_graph, BLI_AStarSolution *as_solution, BLI_AStarGNLink *link, const int node_idx_curr, const int node_idx_next, const int node_idx_dst)
 
void BKE_mesh_remap_calc_loops_from_mesh (const int mode, const SpaceTransform *space_transform, const float max_dist, const float ray_radius, Mesh *mesh_dst, MVert *verts_dst, const int numverts_dst, MEdge *edges_dst, const int numedges_dst, MLoop *loops_dst, const int numloops_dst, MPoly *polys_dst, const int numpolys_dst, CustomData *ldata_dst, const bool use_split_nors_dst, const float split_angle_dst, const bool dirty_nors_dst, Mesh *me_src, MeshRemapIslandsCalc gen_islands_src, const float islands_precision_src, MeshPairRemap *r_map)
 
void BKE_mesh_remap_calc_polys_from_mesh (const int mode, const SpaceTransform *space_transform, const float max_dist, const float ray_radius, Mesh *mesh_dst, MVert *verts_dst, MLoop *loops_dst, MPoly *polys_dst, const int numpolys_dst, Mesh *me_src, MeshPairRemap *r_map)
 

Detailed Description

Functions for mapping data between meshes.

Definition in file mesh_remap.c.

Macro Definition Documentation

◆ ASTAR_STEPS_MAX

#define ASTAR_STEPS_MAX   64

Definition at line 1230 of file mesh_remap.c.

◆ MREMAP_DEFAULT_BUFSIZE

#define MREMAP_DEFAULT_BUFSIZE   32

Definition at line 471 of file mesh_remap.c.

◆ MREMAP_RAYCAST_APPROXIMATE_FAC

#define MREMAP_RAYCAST_APPROXIMATE_FAC   5.0f

Definition at line 464 of file mesh_remap.c.

◆ MREMAP_RAYCAST_APPROXIMATE_NR

#define MREMAP_RAYCAST_APPROXIMATE_NR   3
Note
About all BVH/ray-casting stuff below:
  • We must use our ray radius as BVH epsilon too, else rays not hitting anything but 'passing near' an item would be missed (since BVH handling would not detect them, 'refining' callbacks won't be executed, even though they would return a valid hit).
  • However, in 'islands' case where each hit gets a weight, 'precise' hits should have a better weight than 'approximate' hits. To address that, we simplify things with:

    • A first ray-cast with default, given ray-radius;
    • If first one fails, we do more ray-casting with bigger radius, but if hit is found it will get smaller weight.

    This only concerns loops, currently (because of islands), and 'sampled' edges/polys norproj.

Definition at line 462 of file mesh_remap.c.

◆ MREMAP_RAYCAST_TRI_SAMPLES_MAX

#define MREMAP_RAYCAST_TRI_SAMPLES_MAX   20

Definition at line 468 of file mesh_remap.c.

◆ MREMAP_RAYCAST_TRI_SAMPLES_MIN

#define MREMAP_RAYCAST_TRI_SAMPLES_MIN   4

Definition at line 467 of file mesh_remap.c.

◆ POLY_CENTER_INIT

#define POLY_CENTER_INIT   1

Definition at line 1043 of file mesh_remap.c.

◆ POLY_COMPLETE

#define POLY_COMPLETE   2

Definition at line 1044 of file mesh_remap.c.

◆ POLY_UNSET

#define POLY_UNSET   0

Definition at line 1042 of file mesh_remap.c.

Typedef Documentation

◆ IslandResult

typedef struct IslandResult IslandResult

Little helper when dealing with source islands

Function Documentation

◆ BKE_mesh_remap_calc_difference_from_mesh()

float BKE_mesh_remap_calc_difference_from_mesh ( const SpaceTransform space_transform,
const MVert verts_dst,
const int  numverts_dst,
Mesh me_src 
)

◆ BKE_mesh_remap_calc_edges_from_mesh()

void BKE_mesh_remap_calc_edges_from_mesh ( const int  mode,
const SpaceTransform space_transform,
const float  max_dist,
const float  ray_radius,
const MVert verts_dst,
const int  numverts_dst,
const MEdge edges_dst,
const int  numedges_dst,
const bool   UNUSEDdirty_nors_dst,
Mesh me_src,
Mesh me_dst,
MeshPairRemap r_map 
)

◆ BKE_mesh_remap_calc_loops_from_mesh()

void BKE_mesh_remap_calc_loops_from_mesh ( const int  mode,
const SpaceTransform space_transform,
const float  max_dist,
const float  ray_radius,
Mesh mesh_dst,
MVert verts_dst,
const int  numverts_dst,
MEdge edges_dst,
const int  numedges_dst,
MLoop loops_dst,
const int  numloops_dst,
MPoly polys_dst,
const int  numpolys_dst,
CustomData ldata_dst,
const bool  use_split_nors_dst,
const float  split_angle_dst,
const bool  dirty_nors_dst,
Mesh me_src,
MeshRemapIslandsCalc  gen_islands_src,
const float  islands_precision_src,
MeshPairRemap r_map 
)

Definition at line 1232 of file mesh_remap.c.

References ASTAR_STEPS_MAX, BKE_bvhtree_from_mesh_get(), BKE_mesh_calc_poly_center(), BKE_mesh_edge_poly_map_create(), BKE_mesh_loop_islands_free(), BKE_mesh_normals_loop_split(), BKE_mesh_origindex_map_create_looptri(), BKE_mesh_poly_normals_ensure(), BKE_mesh_remap_init(), BKE_mesh_remap_item_define_invalid(), BKE_mesh_runtime_looptri_ensure(), BKE_mesh_vert_coords_alloc(), BKE_mesh_vert_loop_map_create(), BKE_mesh_vert_poly_map_create(), BKE_mesh_vertex_normals_ensure(), BLI_assert, BLI_astar_graph_free(), BLI_astar_graph_solve(), BLI_astar_solution_clear(), BLI_astar_solution_free(), BLI_astar_solution_init(), BLI_BITMAP_ENABLE, BLI_BITMAP_NEW, BLI_bitmap_set_all(), BLI_BITMAP_TEST, BLI_space_transform_apply(), BLI_space_transform_apply_normal(), BVHTREE_FROM_LOOPTRI, bvhtree_from_mesh_looptri_ex(), bvhtree_from_mesh_verts_ex(), BVHTREE_FROM_VERTS, CD_CALLOC, CD_CUSTOMLOOPNORMAL, CD_FLAG_TEMPORARY, CD_NORMAL, closest_on_tri_to_point_v3(), BVHTreeNearest::co, BVHTreeRayHit::co, MVert::co, copy_v3_v3(), MeshElemMap::count, count, BLI_AStarGNLink::custom_data, BLI_AStarSolution::custom_data, BLI_AStarGraph::custom_data, CustomData_add_layer(), CustomData_get_layer(), CustomData_set_layer_flag(), blender::math::dot(), dot_v3v3(), ELEM, IslandResult::factor, float(), free_bvhtree_from_mesh(), IslandResult::hit_dist, IslandResult::hit_point, if(), BVHTreeNearest::index, BVHTreeRayHit::index, IslandResult::index_src, MeshElemMap::indices, MeshIslandStore::innercut_type, MeshIslandStore::island_type, MeshIslandStore::islands, MeshIslandStore::islands_num, MeshIslandStore::item_type, MeshIslandStore::items_to_islands, Mesh::ldata, MLoopTri_Store::len, len_squared_v3v3(), MPoly::loopstart, BVHTreeFromMesh::looptri, Mesh_Runtime::looptris, max_ii(), Mesh::medge, MEM_callocN, MEM_freeN, MEM_mallocN, MEM_reallocN, mesh_island_to_astar_graph(), mesh_remap_bvhtree_query_nearest(), mesh_remap_bvhtree_query_raycast(), mesh_remap_calc_loops_astar_f_cost(), mesh_remap_interp_poly_data_get(), mesh_remap_item_define(), MISLAND_TYPE_EDGE, MISLAND_TYPE_LOOP, MISLAND_TYPE_POLY, Mesh::mloop, Mesh::mpoly, MREMAP_DEFAULT_BUFSIZE, MREMAP_MODE_LOOP, MREMAP_MODE_LOOP_NEAREST_LOOPNOR, MREMAP_MODE_LOOP_NEAREST_POLYNOR, MREMAP_MODE_LOOP_POLY_NEAREST, MREMAP_MODE_TOPOLOGY, MREMAP_RAYCAST_APPROXIMATE_FAC, MREMAP_RAYCAST_APPROXIMATE_NR, MREMAP_USE_LOOP, MREMAP_USE_NORMAL, MREMAP_USE_NORPROJ, MREMAP_USE_POLY, MREMAP_USE_VERT, Mesh::mvert, NULL, POINTER_AS_INT, POINTER_FROM_INT, MLoopTri::poly, BLI_AStarSolution::prev_links, BLI_AStarSolution::prev_nodes, Mesh::runtime, BLI_AStarSolution::steps, Mesh::totedge, Mesh::totloop, MPoly::totloop, Mesh::totpoly, Mesh::totvert, MLoopTri::tri, v, MLoop::v, and w().

◆ BKE_mesh_remap_calc_polys_from_mesh()

void BKE_mesh_remap_calc_polys_from_mesh ( const int  mode,
const SpaceTransform space_transform,
const float  max_dist,
const float  ray_radius,
Mesh mesh_dst,
MVert verts_dst,
MLoop loops_dst,
MPoly polys_dst,
const int  numpolys_dst,
Mesh me_src,
MeshPairRemap r_map 
)

◆ BKE_mesh_remap_calc_source_cddata_masks_from_map_modes()

void BKE_mesh_remap_calc_source_cddata_masks_from_map_modes ( const int   UNUSEDvert_mode,
const int   UNUSEDedge_mode,
const int  loop_mode,
const int   UNUSEDpoly_mode,
CustomData_MeshMasks r_cddata_mask 
)

◆ BKE_mesh_remap_calc_verts_from_mesh()

void BKE_mesh_remap_calc_verts_from_mesh ( const int  mode,
const SpaceTransform space_transform,
const float  max_dist,
const float  ray_radius,
const MVert verts_dst,
const int  numverts_dst,
const bool   UNUSEDdirty_nors_dst,
Mesh me_src,
Mesh me_dst,
MeshPairRemap r_map 
)

◆ BKE_mesh_remap_find_best_match_from_mesh()

void BKE_mesh_remap_find_best_match_from_mesh ( const MVert verts_dst,
const int  numverts_dst,
Mesh me_src,
SpaceTransform r_space_transform 
)

◆ BKE_mesh_remap_free()

void BKE_mesh_remap_free ( MeshPairRemap map)

Definition at line 338 of file mesh_remap.c.

References BLI_memarena_free(), map, and NULL.

Referenced by BKE_mesh_remap_init(), and BKE_object_data_transfer_ex().

◆ BKE_mesh_remap_init()

void BKE_mesh_remap_init ( MeshPairRemap map,
const int  items_num 
)

◆ BKE_mesh_remap_item_define_invalid()

void BKE_mesh_remap_item_define_invalid ( MeshPairRemap map,
const int  index 
)

◆ mesh_calc_eigen_matrix()

static void mesh_calc_eigen_matrix ( const MVert verts,
const float(*)  vcos[3],
const int  numverts,
float  r_mat[4][4] 
)
static

◆ mesh_island_to_astar_graph()

static void mesh_island_to_astar_graph ( MeshIslandStore islands,
const int  island_index,
MVert verts,
MeshElemMap edge_to_poly_map,
const int  numedges,
MLoop loops,
MPoly polys,
const int  numpolys,
BLI_AStarGraph r_as_graph 
)
static

◆ mesh_island_to_astar_graph_edge_process()

static void mesh_island_to_astar_graph_edge_process ( MeshIslandStore islands,
const int  island_index,
BLI_AStarGraph as_graph,
MVert verts,
MPoly polys,
MLoop loops,
const int  edge_idx,
BLI_bitmap done_edges,
MeshElemMap edge_to_poly_map,
const bool  is_edge_innercut,
const int *  poly_island_index_map,
float(*)  poly_centers[3],
unsigned char *  poly_status 
)
static

◆ mesh_remap_bvhtree_query_nearest()

static bool mesh_remap_bvhtree_query_nearest ( BVHTreeFromMesh treedata,
BVHTreeNearest nearest,
const float  co[3],
const float  max_dist_sq,
float r_hit_dist 
)
static

◆ mesh_remap_bvhtree_query_raycast()

static bool mesh_remap_bvhtree_query_raycast ( BVHTreeFromMesh treedata,
BVHTreeRayHit rayhit,
const float  co[3],
const float  no[3],
const float  radius,
const float  max_dist,
float r_hit_dist 
)
static

◆ mesh_remap_calc_loops_astar_f_cost()

static float mesh_remap_calc_loops_astar_f_cost ( BLI_AStarGraph as_graph,
BLI_AStarSolution as_solution,
BLI_AStarGNLink link,
const int  node_idx_curr,
const int  node_idx_next,
const int  node_idx_dst 
)
static

◆ mesh_remap_interp_poly_data_get()

static int mesh_remap_interp_poly_data_get ( const MPoly mp,
MLoop mloops,
const float(*)  vcos_src[3],
const float  point[3],
size_t *  buff_size,
float(**)  vcos[3],
const bool  use_loops,
int **  indices,
float **  weights,
const bool  do_weights,
int *  r_closest_index 
)
static

◆ mesh_remap_item_define()

static void mesh_remap_item_define ( MeshPairRemap map,
const int  index,
const float   UNUSEDhit_dist,
const int  island,
const int  sources_num,
const int *  indices_src,
const float weights_src 
)
static

Variable Documentation

◆ LOG

CLG_LogRef LOG = {"bke.mesh"}
static