Blender V4.3
mesh_mapping.cc File Reference
#include "MEM_guardedalloc.h"
#include "atomic_ops.h"
#include "BLI_array.hh"
#include "BLI_bitmap.h"
#include "BLI_buffer.h"
#include "BLI_function_ref.hh"
#include "BLI_math_geom.h"
#include "BLI_math_vector.h"
#include "BLI_task.hh"
#include "BLI_utildefines.h"
#include "BKE_customdata.hh"
#include "BKE_mesh.hh"
#include "BKE_mesh_mapping.hh"
#include "BLI_memarena.h"
#include "BLI_strict_flags.h"

Go to the source code of this file.

Namespaces

namespace  blender
 
namespace  blender::bke
 
namespace  blender::bke::mesh
 

Functions

static Array< intblender::bke::mesh::create_reverse_offsets (const Span< int > indices, const int items_num)
 
static void blender::bke::mesh::sort_small_groups (const OffsetIndices< int > groups, const int grain_size, MutableSpan< int > indices)
 
static Array< intblender::bke::mesh::reverse_indices_in_groups (const Span< int > group_indices, const OffsetIndices< int > offsets)
 
static void blender::bke::mesh::reverse_group_indices_in_groups (const OffsetIndices< int > groups, const Span< int > group_to_elem, const OffsetIndices< int > offsets, MutableSpan< int > results)
 
static GroupedSpan< intblender::bke::mesh::gather_groups (const Span< int > group_indices, const int groups_num, Array< int > &r_offsets, Array< int > &r_indices)
 
Array< intblender::bke::mesh::build_corner_to_face_map (OffsetIndices< int > faces)
 
GroupedSpan< intblender::bke::mesh::build_vert_to_edge_map (Span< int2 > edges, int verts_num, Array< int > &r_offsets, Array< int > &r_indices)
 
void blender::bke::mesh::build_vert_to_face_indices (OffsetIndices< int > faces, Span< int > corner_verts, OffsetIndices< int > offsets, MutableSpan< int > face_indices)
 
GroupedSpan< intblender::bke::mesh::build_vert_to_face_map (OffsetIndices< int > faces, Span< int > corner_verts, int verts_num, Array< int > &r_offsets, Array< int > &r_indices)
 
Array< intblender::bke::mesh::build_vert_to_corner_indices (Span< int > corner_verts, OffsetIndices< int > offsets)
 
GroupedSpan< intblender::bke::mesh::build_vert_to_corner_map (Span< int > corner_verts, int verts_num, Array< int > &r_offsets, Array< int > &r_indices)
 
GroupedSpan< intblender::bke::mesh::build_edge_to_corner_map (Span< int > corner_edges, int edges_num, Array< int > &r_offsets, Array< int > &r_indices)
 
GroupedSpan< intblender::bke::mesh::build_edge_to_face_map (OffsetIndices< int > faces, Span< int > corner_edges, int edges_num, Array< int > &r_offsets, Array< int > &r_indices)
 
Mesh Connectivity Mapping
UvVertMapBKE_mesh_uv_vert_map_create (const blender::OffsetIndices< int > faces, const bool *hide_poly, const bool *select_poly, const int *corner_verts, const float(*mloopuv)[2], uint totvert, const float limit[2], const bool selected, const bool use_winding)
 
UvMapVertBKE_mesh_uv_vert_map_get_vert (UvVertMap *vmap, uint v)
 
void BKE_mesh_uv_vert_map_free (UvVertMap *vmap)
 
void BKE_mesh_vert_corner_tri_map_create (MeshElemMap **r_map, int **r_mem, const int totvert, const blender::int3 *corner_tris, const int tris_num, const int *corner_verts, const int)
 
void BKE_mesh_origindex_map_create (MeshElemMap **r_map, int **r_mem, const int totsource, const int *final_origindex, const int totfinal)
 
void BKE_mesh_origindex_map_create_corner_tri (MeshElemMap **r_map, int **r_mem, const blender::OffsetIndices< int > faces, const int *corner_tri_faces, const int corner_tris_num)
 

Mesh loops/face islands.

Used currently for UVs and 'smooth groups'.

#define MISLAND_DEFAULT_BUFSIZE   64
 
using MeshRemap_CheckIslandBoundary
 
static void face_edge_loop_islands_calc (const int totedge, const blender::OffsetIndices< int > faces, const blender::Span< int > corner_edges, blender::GroupedSpan< int > edge_face_map, const bool use_bitflags, MeshRemap_CheckIslandBoundary edge_boundary_check, int **r_face_groups, int *r_totgroup, BLI_bitmap **r_edge_borders, int *r_totedgeborder)
 
intBKE_mesh_calc_smoothgroups (int edges_num, const blender::OffsetIndices< int > faces, const blender::Span< int > corner_edges, const blender::Span< bool > sharp_edges, const blender::Span< bool > sharp_faces, int *r_totgroup, bool use_bitflags)
 
void BKE_mesh_loop_islands_init (MeshIslandStore *island_store, const short item_type, const int items_num, const short island_type, const short innercut_type)
 
void BKE_mesh_loop_islands_clear (MeshIslandStore *island_store)
 
void BKE_mesh_loop_islands_free (MeshIslandStore *island_store)
 
void BKE_mesh_loop_islands_add (MeshIslandStore *island_store, const int item_num, const int *items_indices, const int num_island_items, int *island_item_indices, const int num_innercut_items, int *innercut_item_indices)
 
static bool mesh_calc_islands_loop_face_uv (const int totedge, const bool *uv_seams, const blender::OffsetIndices< int > faces, const int *corner_verts, const int *corner_edges, const int corners_num, const float(*luvs)[2], MeshIslandStore *r_island_store)
 
bool BKE_mesh_calc_islands_loop_face_edgeseam (const float(*vert_positions)[3], const int totvert, const blender::int2 *edges, const int totedge, const bool *uv_seams, const blender::OffsetIndices< int > faces, const int *corner_verts, const int *corner_edges, const int corners_num, MeshIslandStore *r_island_store)
 
bool BKE_mesh_calc_islands_loop_face_uvmap (float(*vert_positions)[3], const int totvert, blender::int2 *edges, const int totedge, const bool *uv_seams, const blender::OffsetIndices< int > faces, const int *corner_verts, const int *corner_edges, const int corners_num, const float(*luvs)[2], MeshIslandStore *r_island_store)
 

Detailed Description

Functions for accessing mesh connectivity data. eg: faces connected to verts, UVs connected to verts.

Definition in file mesh_mapping.cc.

Macro Definition Documentation

◆ MISLAND_DEFAULT_BUFSIZE

#define MISLAND_DEFAULT_BUFSIZE   64

Definition at line 705 of file mesh_mapping.cc.

Referenced by BKE_mesh_loop_islands_init().

Typedef Documentation

◆ MeshRemap_CheckIslandBoundary

Initial value:
blender::FunctionRef<bool(int face_index,
int loop_index,
int edge_index,
int edge_user_count,
const blender::Span<int> edge_face_map_elem)>

Callback deciding whether the given face/loop/edge define an island boundary or not.

Definition at line 473 of file mesh_mapping.cc.

Function Documentation

◆ BKE_mesh_calc_islands_loop_face_edgeseam()

bool BKE_mesh_calc_islands_loop_face_edgeseam ( const float(*) vert_positions[3],
int totvert,
const blender::int2 * edges,
int totedge,
const bool * uv_seams,
blender::OffsetIndices< int > faces,
const int * corner_verts,
const int * corner_edges,
int corners_num,
MeshIslandStore * r_island_store )

Calculate 'generic' UV islands, i.e. based only on actual geometry data (edge seams), not some UV layers coordinates.

Definition at line 991 of file mesh_mapping.cc.

References mesh_calc_islands_loop_face_uv(), and UNUSED_VARS.

Referenced by data_transfer_get_loop_islands_generator().

◆ BKE_mesh_calc_islands_loop_face_uvmap()

bool BKE_mesh_calc_islands_loop_face_uvmap ( float(*) vert_positions[3],
int totvert,
blender::int2 * edges,
int totedge,
const bool * uv_seams,
blender::OffsetIndices< int > faces,
const int * corner_verts,
const int * corner_edges,
int corners_num,
const float(*) luvs[2],
MeshIslandStore * r_island_store )

Calculate UV islands.

Note
If no UV layer is passed, we only consider edges tagged as seams as UV boundaries. This has the advantages of simplicity, and being valid/common to all UV maps. However, it means actual UV islands without matching UV seams will not be handled correctly. If a valid UV layer is passed as luvs parameter, UV coordinates are also used to detect islands boundaries.
All this could be optimized. Not sure it would be worth the more complex code, though, those loops are supposed to be really quick to do.

Definition at line 1007 of file mesh_mapping.cc.

References BLI_assert, mesh_calc_islands_loop_face_uv(), and UNUSED_VARS.

◆ BKE_mesh_calc_smoothgroups()

int * BKE_mesh_calc_smoothgroups ( int edges_num,
blender::OffsetIndices< int > faces,
blender::Span< int > corner_edges,
blender::Span< bool > sharp_edges,
blender::Span< bool > sharp_faces,
int * r_totgroup,
bool use_bitflags )

Calculate smooth groups from sharp edges.

Parameters
sharp_edgesOptional (possibly empty) span.
sharp_facesOptional (possibly empty) span.
r_totgroupThe total number of groups, 1 or more.
Returns
Polygon aligned array of group index values (bitflags if use_bitflags is true), starting at 1 (0 being used as 'invalid' flag). Note it's callers's responsibility to MEM_freeN returned array.

Definition at line 661 of file mesh_mapping.cc.

References face_edge_loop_islands_calc(), and blender::Span< T >::is_empty().

Referenced by blender::io::obj::OBJMesh::calc_smooth_groups().

◆ BKE_mesh_loop_islands_add()

void BKE_mesh_loop_islands_add ( MeshIslandStore * island_store,
const int item_num,
const int * items_indices,
const int num_island_items,
int * island_item_indices,
const int num_innercut_items,
int * innercut_item_indices )

◆ BKE_mesh_loop_islands_clear()

◆ BKE_mesh_loop_islands_free()

void BKE_mesh_loop_islands_free ( MeshIslandStore * island_store)

Definition at line 761 of file mesh_mapping.cc.

References BLI_memarena_free(), and MeshIslandStore::mem.

Referenced by BKE_mesh_remap_calc_loops_from_mesh().

◆ BKE_mesh_loop_islands_init()

◆ BKE_mesh_origindex_map_create()

void BKE_mesh_origindex_map_create ( MeshElemMap ** r_map,
int ** r_mem,
int totsource,
const int * final_origindex,
int totfinal )

This function creates a map so the source-data (vert/edge/loop/face) can loop over the destination data (using the destination arrays origindex).

This has the advantage that it can operate on any data-types.

Parameters
totsourceThe total number of elements that final_origindex points to.
totfinalThe size of final_origindex
final_origindexThe size of the final array.
Note
totsource could be faces_num, totfinal could be tottessface and final_origindex its ORIGINDEX custom-data. This would allow a face to loop over its tessfaces.

Definition at line 231 of file mesh_mapping.cc.

References BLI_assert, MeshElemMap::count, indices, MeshElemMap::indices, MEM_mallocN, and ORIGINDEX_NONE.

◆ BKE_mesh_origindex_map_create_corner_tri()

void BKE_mesh_origindex_map_create_corner_tri ( MeshElemMap ** r_map,
int ** r_mem,
blender::OffsetIndices< int > faces,
const int * corner_tri_faces,
int corner_tris_num )

A version of BKE_mesh_origindex_map_create that takes a corner tri array. Making a face -> corner tri map.

Definition at line 272 of file mesh_mapping.cc.

References MeshElemMap::count, blender::bke::mesh::face_triangles_num(), indices, MeshElemMap::indices, MEM_mallocN, and size().

Referenced by BKE_mesh_remap_calc_loops_from_mesh().

◆ BKE_mesh_uv_vert_map_create()

UvVertMap * BKE_mesh_uv_vert_map_create ( const blender::OffsetIndices< int > faces,
const bool * hide_poly,
const bool * select_poly,
const int * corner_verts,
const float(*) mloopuv[2],
uint totvert,
const float limit[2],
const bool selected,
const bool use_winding )

◆ BKE_mesh_uv_vert_map_free()

void BKE_mesh_uv_vert_map_free ( UvVertMap * vmap)

◆ BKE_mesh_uv_vert_map_get_vert()

UvMapVert * BKE_mesh_uv_vert_map_get_vert ( UvVertMap * vmap,
uint v )

◆ BKE_mesh_vert_corner_tri_map_create()

void BKE_mesh_vert_corner_tri_map_create ( MeshElemMap ** r_map,
int ** r_mem,
int totvert,
const blender::int3 * corner_tris,
int tris_num,
const int * corner_verts,
int corners_num )

Generates a map where the key is the edge and the value is a list of corner_tris that use that edge. The lists are allocated from one memory pool.

Definition at line 189 of file mesh_mapping.cc.

References MeshElemMap::count, indices, MeshElemMap::indices, and MEM_mallocN.

Referenced by dynamicPaint_createUVSurface().

◆ face_edge_loop_islands_calc()

static void face_edge_loop_islands_calc ( const int totedge,
const blender::OffsetIndices< int > faces,
const blender::Span< int > corner_edges,
blender::GroupedSpan< int > edge_face_map,
const bool use_bitflags,
MeshRemap_CheckIslandBoundary edge_boundary_check,
int ** r_face_groups,
int * r_totgroup,
BLI_bitmap ** r_edge_borders,
int * r_totedgeborder )
static

◆ mesh_calc_islands_loop_face_uv()

static bool mesh_calc_islands_loop_face_uv ( const int totedge,
const bool * uv_seams,
const blender::OffsetIndices< int > faces,
const int * corner_verts,
const int * corner_edges,
const int corners_num,
const float(*) luvs[2],
MeshIslandStore * r_island_store )
static