Blender V4.3
bmesh_polygon.hh File Reference

Go to the source code of this file.

Functions

void BM_face_calc_tessellation (const BMFace *f, bool use_fixed_quad, BMLoop **r_loops, uint(*r_index)[3])
 
void BM_face_calc_point_in_face (const BMFace *f, float r_co[3])
 
float BM_face_calc_normal (const BMFace *f, float r_no[3]) ATTR_NONNULL()
 BMESH UPDATE FACE NORMAL.
 
float BM_face_calc_normal_vcos (const BMesh *bm, const BMFace *f, float r_no[3], blender::Span< blender::float3 > vertexCos) ATTR_NONNULL()
 
void BM_verts_calc_normal_from_cloud_ex (BMVert **varr, int varr_len, float r_normal[3], float r_center[3], int *r_index_tangent)
 
void BM_verts_calc_normal_from_cloud (BMVert **varr, int varr_len, float r_normal[3])
 
float BM_face_calc_normal_subset (const BMLoop *l_first, const BMLoop *l_last, float r_no[3]) ATTR_NONNULL()
 
float BM_face_calc_area (const BMFace *f) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL()
 
float BM_face_calc_area_with_mat3 (const BMFace *f, const float mat3[3][3]) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL()
 
float BM_face_calc_area_uv_signed (const BMFace *f, int cd_loop_uv_offset) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL()
 
float BM_face_calc_area_uv (const BMFace *f, int cd_loop_uv_offset) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL()
 
float BM_face_calc_perimeter (const BMFace *f) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL()
 
float BM_face_calc_perimeter_with_mat3 (const BMFace *f, const float mat3[3][3]) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL()
 
void BM_face_calc_tangent_edge (const BMFace *f, float r_tangent[3]) ATTR_NONNULL()
 
void BM_face_calc_tangent_edge_pair (const BMFace *f, float r_tangent[3]) ATTR_NONNULL()
 
void BM_face_calc_tangent_edge_diagonal (const BMFace *f, float r_tangent[3]) ATTR_NONNULL()
 
void BM_face_calc_tangent_vert_diagonal (const BMFace *f, float r_tangent[3]) ATTR_NONNULL()
 
void BM_face_calc_tangent_auto (const BMFace *f, float r_tangent[3]) ATTR_NONNULL()
 
void BM_face_calc_center_bounds (const BMFace *f, float r_cent[3]) ATTR_NONNULL()
 
void BM_face_calc_center_bounds_vcos (const BMesh *bm, const BMFace *f, float r_center[3], blender::Span< blender::float3 > vert_positions) ATTR_NONNULL()
 
void BM_face_calc_center_median (const BMFace *f, float r_center[3]) ATTR_NONNULL()
 
void BM_face_calc_center_median_vcos (const BMesh *bm, const BMFace *f, float r_center[3], const blender::Span< blender::float3 > vert_positions) ATTR_NONNULL()
 
void BM_face_calc_center_median_weighted (const BMFace *f, float r_cent[3]) ATTR_NONNULL()
 
void BM_face_calc_bounds_expand (const BMFace *f, float min[3], float max[3])
 
void BM_face_normal_update (BMFace *f) ATTR_NONNULL()
 
void BM_edge_normals_update (BMEdge *e) ATTR_NONNULL()
 
bool BM_vert_calc_normal_ex (const BMVert *v, char hflag, float r_no[3])
 
bool BM_vert_calc_normal (const BMVert *v, float r_no[3])
 
void BM_vert_normal_update (BMVert *v) ATTR_NONNULL()
 
void BM_vert_normal_update_all (BMVert *v) ATTR_NONNULL()
 
void BM_face_normal_flip_ex (BMesh *bm, BMFace *f, int cd_loop_mdisp_offset, bool use_loop_mdisp_flip) ATTR_NONNULL()
 Face Flip Normal.
 
void BM_face_normal_flip (BMesh *bm, BMFace *f) ATTR_NONNULL()
 
bool BM_face_point_inside_test (const BMFace *f, const float co[3]) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL()
 
void BM_face_triangulate (BMesh *bm, BMFace *f, BMFace **r_faces_new, int *r_faces_new_tot, BMEdge **r_edges_new, int *r_edges_new_tot, struct LinkNode **r_faces_double, int quad_method, int ngon_method, bool use_tag, struct MemArena *pf_arena, struct Heap *pf_heap) ATTR_NONNULL(1
 BMESH TRIANGULATE FACE.
 
void void BM_face_splits_check_legal (BMesh *bm, BMFace *f, BMLoop *(*loops)[2], int len) ATTR_NONNULL()
 
void BM_face_splits_check_optimal (BMFace *f, BMLoop *(*loops)[2], int len) ATTR_NONNULL()
 
void BM_face_as_array_vert_tri (BMFace *f, BMVert *r_verts[3]) ATTR_NONNULL()
 
void BM_face_as_array_vert_quad (BMFace *f, BMVert *r_verts[4]) ATTR_NONNULL()
 
void BM_face_as_array_loop_tri (BMFace *f, BMLoop *r_loops[3]) ATTR_NONNULL()
 
void BM_face_as_array_loop_quad (BMFace *f, BMLoop *r_loops[4]) ATTR_NONNULL()
 
void BM_vert_tri_calc_tangent_edge (BMVert *verts[3], float r_tangent[3])
 
void BM_vert_tri_calc_tangent_edge_pair (BMVert *verts[3], float r_tangent[3])
 

Function Documentation

◆ BM_edge_normals_update()

void BM_edge_normals_update ( BMEdge * e)

updates face and vertex normals incident on an edge

Definition at line 596 of file bmesh_polygon.cc.

References BM_face_normal_update(), BM_FACES_OF_EDGE, BM_ITER_ELEM, BM_vert_normal_update(), and e.

Referenced by bpy_bmedge_normal_update().

◆ BM_face_as_array_loop_quad()

void BM_face_as_array_loop_quad ( BMFace * f,
BMLoop * r_loops[4] )

faster alternative to: BM_iter_as_array(bm, BM_LOOPS_OF_FACE, f, (void **)l, 4);

Definition at line 1333 of file bmesh_polygon.cc.

References BLI_assert, BM_FACE_FIRST_LOOP, l, BMFace::len, and BMLoop::next.

Referenced by bm_grid_fill_array().

◆ BM_face_as_array_loop_tri()

void BM_face_as_array_loop_tri ( BMFace * f,
BMLoop * r_loops[3] )

Small utility functions for fast access

faster alternative to: BM_iter_as_array(bm, BM_LOOPS_OF_FACE, f, (void **)l, 3);

Definition at line 1320 of file bmesh_polygon.cc.

References BLI_assert, BM_FACE_FIRST_LOOP, l, BMFace::len, and BMLoop::next.

◆ BM_face_as_array_vert_quad()

void BM_face_as_array_vert_quad ( BMFace * f,
BMVert * r_verts[4] )

faster alternative to: BM_iter_as_array(bm, BM_VERTS_OF_FACE, f, (void **)v, 4);

Definition at line 1305 of file bmesh_polygon.cc.

References BLI_assert, BM_FACE_FIRST_LOOP, l, BMFace::len, BMLoop::next, and BMLoop::v.

Referenced by BM_face_calc_tangent_edge_pair(), and skin_fix_hole_no_good_verts().

◆ BM_face_as_array_vert_tri()

◆ BM_face_calc_area()

◆ BM_face_calc_area_uv()

float BM_face_calc_area_uv ( const BMFace * f,
int cd_loop_uv_offset )

Calculate the area of UV face.

Definition at line 250 of file bmesh_polygon.cc.

References BM_face_calc_area_uv_signed(), and fabsf.

Referenced by get_uv_edge_needle(), get_uv_face_needle(), get_uv_island_needle(), and get_uv_vert_needle().

◆ BM_face_calc_area_uv_signed()

float BM_face_calc_area_uv_signed ( const BMFace * f,
int cd_loop_uv_offset )

Calculate the signed area of UV face.

Definition at line 233 of file bmesh_polygon.cc.

References BM_ELEM_CD_GET_FLOAT_P, BM_FACE_FIRST_LOOP, cross(), and BMLoop::next.

Referenced by BM_face_calc_area_uv(), BM_uv_element_map_create(), and get_uv_face_needle().

◆ BM_face_calc_area_with_mat3()

float BM_face_calc_area_with_mat3 ( const BMFace * f,
const float mat3[3][3] )

◆ BM_face_calc_bounds_expand()

void BM_face_calc_bounds_expand ( const BMFace * f,
float min[3],
float max[3] )

expands bounds (min/max must be initialized).

Definition at line 498 of file bmesh_polygon.cc.

References BM_FACE_FIRST_LOOP, BMVert::co, min, minmax_v3v3_v3(), BMLoop::next, and BMLoop::v.

Referenced by uv_map_transform_calc_bounds().

◆ BM_face_calc_center_bounds()

void BM_face_calc_center_bounds ( const BMFace * f,
float r_cent[3] )

◆ BM_face_calc_center_bounds_vcos()

void BM_face_calc_center_bounds_vcos ( const BMesh * bm,
const BMFace * f,
float r_center[3],
blender::Span< blender::float3 > vert_positions )

computes center of face in 3d. uses center of bounding box.

Definition at line 522 of file bmesh_polygon.cc.

References BLI_assert, bm, BM_elem_index_get, BM_FACE_FIRST_LOOP, BM_VERT, BMesh::elem_index_dirty, INIT_MINMAX, mid_v3_v3v3(), min, minmax_v3v3_v3(), BMLoop::next, and BMLoop::v.

Referenced by DRW_text_edit_mesh_measure_stats().

◆ BM_face_calc_center_median()

◆ BM_face_calc_center_median_vcos()

void BM_face_calc_center_median_vcos ( const BMesh * bm,
const BMFace * f,
float r_center[3],
const blender::Span< blender::float3 > vert_positions )

◆ BM_face_calc_center_median_weighted()

void BM_face_calc_center_median_weighted ( const BMFace * f,
float r_cent[3] )

◆ BM_face_calc_normal()

float BM_face_calc_normal ( const BMFace * f,
float r_no[3] )

BMESH UPDATE FACE NORMAL.

Updates the stored normal for the given face. Requires that a buffer of sufficient length to store projected coordinates for all of the face's vertices is passed in as well.

Definition at line 714 of file bmesh_polygon.cc.

References bm_face_calc_poly_normal(), BM_FACE_FIRST_LOOP, BMVert::co, l, BMFace::len, BMLoop::next, normal_quad_v3(), normal_tri_v3(), and v.

Referenced by bm_face_calc_normals_cb(), BM_face_is_normal_valid(), BM_face_normal_update(), bm_mesh_calc_tessellation__single_threaded(), bm_partial_faces_parallel_range_calc_normals_cb(), and bmesh_calc_tessellation_for_face_impl().

◆ BM_face_calc_normal_subset()

float BM_face_calc_normal_subset ( const BMLoop * l_first,
const BMLoop * l_last,
float r_no[3] )

Calculates the face subset normal.

Definition at line 882 of file bmesh_polygon.cc.

References add_newell_cross_v3_v3v3(), BMVert::co, BMLoop::next, normalize_v3(), BMLoop::v, and zero_v3().

Referenced by bm_face_calc_split_dot(), and bm_face_split_find().

◆ BM_face_calc_normal_vcos()

float BM_face_calc_normal_vcos ( const BMesh * bm,
const BMFace * f,
float r_no[3],
blender::Span< blender::float3 > vertexCos )

◆ BM_face_calc_perimeter()

float BM_face_calc_perimeter ( const BMFace * f)

compute the perimeter of an ngon

Definition at line 255 of file bmesh_polygon.cc.

References BM_FACE_FIRST_LOOP, BMVert::co, len_v3v3(), BMLoop::next, and BMLoop::v.

Referenced by bpy_bmface_calc_perimeter().

◆ BM_face_calc_perimeter_with_mat3()

float BM_face_calc_perimeter_with_mat3 ( const BMFace * f,
const float mat3[3][3] )

Calculate the perimeter of a ngon in world space.

Definition at line 268 of file bmesh_polygon.cc.

References BM_FACE_FIRST_LOOP, BMVert::co, copy_v3_v3(), len_v3v3(), mul_v3_m3v3(), BMLoop::next, and BMLoop::v.

Referenced by similar_face_select_exec().

◆ BM_face_calc_point_in_face()

void BM_face_calc_point_in_face ( const BMFace * f,
float r_co[3] )

◆ BM_face_calc_tangent_auto()

void BM_face_calc_tangent_auto ( const BMFace * f,
float r_tangent[3] )

Compute a meaningful direction along the face (use for gizmo axis).

Note
Callers shouldn't depend on the exact method used here.

Definition at line 480 of file bmesh_polygon.cc.

References BM_face_as_array_vert_tri(), BM_face_calc_tangent_edge(), BM_face_calc_tangent_edge_pair(), BM_vert_tri_calc_tangent_edge(), BMFace::len, and verts.

Referenced by BM_editselection_plane(), BM_loop_interp_from_face(), and getTransformOrientation_ex().

◆ BM_face_calc_tangent_edge()

void BM_face_calc_tangent_edge ( const BMFace * f,
float r_tangent[3] )

Compute the tangent of the face, using the longest edge.

Definition at line 351 of file bmesh_polygon.cc.

References BM_face_find_longest_loop(), BMVert::co, BMLoop::next, normalize_v3(), sub_v3_v3v3(), and BMLoop::v.

Referenced by BM_face_calc_tangent_auto(), and bpy_bmface_calc_tangent_edge().

◆ BM_face_calc_tangent_edge_diagonal()

void BM_face_calc_tangent_edge_diagonal ( const BMFace * f,
float r_tangent[3] )

Compute the tangent of the face, using the edge farthest away from any vertex in the face.

Parameters
r_tangentCalculated unit length tangent (return value).

Definition at line 420 of file bmesh_polygon.cc.

References BLI_assert, BM_FACE_FIRST_LOOP, closest_to_line_segment_v3(), BMVert::co, copy_v3_v3(), ELEM, len_squared_v3(), BMLoop::next, normalize_v3(), BMLoop::prev, sub_v3_v3v3(), BMLoop::v, and zero_v3().

Referenced by bpy_bmface_calc_tangent_edge_diagonal().

◆ BM_face_calc_tangent_edge_pair()

void BM_face_calc_tangent_edge_pair ( const BMFace * f,
float r_tangent[3] )

Compute the tangent of the face, using the two longest disconnected edges.

Parameters
r_tangentCalculated unit length tangent (return value).

Definition at line 360 of file bmesh_polygon.cc.

References add_v3_v3v3(), BM_face_as_array_vert_quad(), BM_face_as_array_vert_tri(), BM_face_find_longest_loop(), BM_vert_tri_calc_tangent_edge_pair(), BMVert::co, copy_v3_v3(), BMFace::len, len_squared_v3(), len_squared_v3v3(), BMLoop::next, normalize_v3(), normalize_v3_v3(), BMLoop::prev, sub_v3_v3v3(), UNLIKELY, BMLoop::v, and verts.

Referenced by BM_face_calc_tangent_auto(), and bpy_bmface_calc_tangent_edge_pair().

◆ BM_face_calc_tangent_vert_diagonal()

void BM_face_calc_tangent_vert_diagonal ( const BMFace * f,
float r_tangent[3] )

Compute the tangent of the face, using longest distance between vertices on the face.

Note
The logic is almost identical to BM_face_calc_tangent_edge_diagonal

Definition at line 452 of file bmesh_polygon.cc.

References BM_FACE_FIRST_LOOP, BMVert::co, copy_v3_v3(), len_squared_v3(), BMLoop::next, normalize_v3(), sub_v3_v3v3(), BMLoop::v, and zero_v3().

Referenced by bpy_bmface_calc_tangent_vert_diagonal().

◆ BM_face_calc_tessellation()

void BM_face_calc_tessellation ( const BMFace * f,
bool use_fixed_quad,
BMLoop ** r_loops,
uint(*) r_index[3] )

For tools that insist on using triangles, ideally we would cache this data.

Parameters
use_fixed_quadWhen true, always split quad along (0 -> 2) regardless of concave corners, (as done in BM_mesh_calc_tessellation).
r_loopsStore face loop pointers, (f->len)
r_indexStore triangle triples, indices into r_loops, ((f->len - 2) * 3)

Definition at line 111 of file bmesh_polygon.cc.

References axis_dominant_v3_to_m3_negate(), BLI_array_alloca, BLI_polyfill_calc(), BM_FACE_FIRST_LOOP, BMVert::co, float, BMFace::len, mul_v2_m3v3(), BMLoop::next, BMFace::no, and BMLoop::v.

Referenced by BM_face_calc_point_in_face(), and bm_mesh_calc_volume_face().

◆ BM_face_normal_flip()

◆ BM_face_normal_flip_ex()

void BM_face_normal_flip_ex ( BMesh * bm,
BMFace * f,
int cd_loop_mdisp_offset,
bool use_loop_mdisp_flip )

Face Flip Normal.

Reverses the winding of a face.

Note
This updates the calculated normal.

Definition at line 914 of file bmesh_polygon.cc.

References bm, bmesh_kernel_loop_reverse(), negate_v3(), and BMFace::no.

Referenced by BM_face_normal_flip(), BMD_mesh_bm_create(), bmo_reverse_faces_exec(), and blender::geometry::boolean::mesh_bm_concat().

◆ BM_face_normal_update()

◆ BM_face_point_inside_test()

bool BM_face_point_inside_test ( const BMFace * f,
const float co[3] )

BM POINT IN FACE

Projects co onto face f, and returns true if it is inside the face bounds.

Note
this uses a best-axis projection test, instead of projecting co directly into f's orientation space, so there might be accuracy issues.

Definition at line 929 of file bmesh_polygon.cc.

References axis_dominant_v3_to_m3(), BLI_array_alloca, BLI_assert, BM_FACE_FIRST_LOOP, BM_face_is_normal_valid(), BMVert::co, float, isect_point_poly_v2(), BMFace::len, mul_v2_m3v3(), BMLoop::next, BMFace::no, and BMLoop::v.

Referenced by bm_vert_pair_share_best_splittable_face_cb(), bpy_bm_geometry_intersect_face_point(), find_face_internal_boundverts(), and knife_verts_edge_in_face().

◆ BM_face_splits_check_legal()

void void BM_face_splits_check_legal ( BMesh * bm,
BMFace * f,
BMLoop *(*) loops[2],
int len )

each pair of loops defines a new edge, a split. this function goes through and sets pairs that are geometrically invalid to null. a split is invalid, if it forms a concave angle or it intersects other edges in the face, or it intersects another split. in the case of intersecting splits, only the first of the set of intersecting splits survives

Definition at line 1180 of file bmesh_polygon.cc.

References add_v2_fl(), add_v2_v2(), axis_dominant_v3_to_m3(), BLI_array_alloca, BLI_assert, bm, BM_elem_index_get, BM_elem_index_set, BM_FACE_FIRST_LOOP, BM_face_is_normal_valid(), BM_LOOP, BMVert::co, EDGE_SHARE_VERT, BMesh::elem_index_dirty, float, FLT_MAX, is_poly_convex_v2(), ISECT_LINE_LINE_CROSS, isect_seg_seg_v2(), l, BMFace::len, len, max_ff(), mid_v2_v2v2(), mul_v2_fl(), mul_v2_m3v3(), BMLoop::next, BMFace::no, sub_v2_v2(), UNPACK2, and BMLoop::v.

Referenced by bm_face_connect_verts(), and bm_face_split_find().

◆ BM_face_splits_check_optimal()

void BM_face_splits_check_optimal ( BMFace * f,
BMLoop *(*) loops[2],
int len )

This simply checks that the verts don't connect faces which would have more optimal splits. but not check for correctness.

Definition at line 1278 of file bmesh_polygon.cc.

References BM_vert_pair_share_face_by_angle(), len, and v.

Referenced by bm_face_connect_verts().

◆ BM_face_triangulate()

void BM_face_triangulate ( BMesh * bm,
BMFace * f,
BMFace ** r_faces_new,
int * r_faces_new_tot,
BMEdge ** r_edges_new,
int * r_edges_new_tot,
struct LinkNode ** r_faces_double,
int quad_method,
int ngon_method,
bool use_tag,
struct MemArena * pf_arena,
struct Heap * pf_heap )

BMESH TRIANGULATE FACE.

Breaks all quads and ngons down to triangles. It uses poly-fill for the ngons splitting, and the beautify operator when use_beauty is true.

Parameters
r_faces_newif non-null, must be an array of BMFace pointers, with a length equal to (f->len - 3). It will be filled with the new triangles (not including the original triangle).
r_faces_doubleWhen newly created faces are duplicates of existing faces, they're added to this list. Caller must handle de-duplication. This is done because its possible all faces exist already, and in that case we would have to remove all faces including the one passed, which causes complications adding/removing faces while looking over them.
Note
The number of faces is almost always (f->len - 3), However there may be faces that already occupying the triangles we would make, so the caller must check r_faces_new_tot.
use_tag tags new flags and edges.

◆ BM_vert_calc_normal()

bool BM_vert_calc_normal ( const BMVert * v,
float r_no[3] )

◆ BM_vert_calc_normal_ex()

bool BM_vert_calc_normal_ex ( const BMVert * v,
char hflag,
float r_no[3] )

◆ BM_vert_normal_update()

void BM_vert_normal_update ( BMVert * v)

◆ BM_vert_normal_update_all()

◆ BM_vert_tri_calc_tangent_edge()

void BM_vert_tri_calc_tangent_edge ( BMVert * verts[3],
float r_tangent[3] )

Calculate a tangent from any 3 vertices.

The tangent aligns to the most unique edge (the edge most unlike the other two).

Parameters
r_tangentCalculated unit length tangent (return value).

Definition at line 328 of file bmesh_polygon.cc.

References bm_vert_tri_find_unique_edge(), normalize_v3(), sub_v3_v3v3(), and verts.

Referenced by BM_face_calc_tangent_auto(), and getTransformOrientation_ex().

◆ BM_vert_tri_calc_tangent_edge_pair()

void BM_vert_tri_calc_tangent_edge_pair ( BMVert * verts[3],
float r_tangent[3] )

Calculate a tangent from any 3 vertices,

The tangent follows the center-line formed by the most unique edges center and the opposite vertex.

Parameters
r_tangentCalculated unit length tangent (return value).

Definition at line 337 of file bmesh_polygon.cc.

References bm_vert_tri_find_unique_edge(), mid_v3_v3v3(), normalize_v3(), sub_v3_v3v3(), and verts.

Referenced by BM_face_calc_tangent_edge_pair().

◆ BM_verts_calc_normal_from_cloud()

void BM_verts_calc_normal_from_cloud ( BMVert ** varr,
int varr_len,
float r_normal[3] )

Definition at line 877 of file bmesh_polygon.cc.

References BM_verts_calc_normal_from_cloud_ex().

◆ BM_verts_calc_normal_from_cloud_ex()

void BM_verts_calc_normal_from_cloud_ex ( BMVert ** varr,
int varr_len,
float r_normal[3],
float r_center[3],
int * r_index_tangent )

Calculate a normal from a vertex cloud.

Note
We could make a higher quality version that takes all vertices into account. Currently it finds 4 outer most points returning its normal.

Definition at line 779 of file bmesh_polygon.cc.

References BMVert::co, copy_v3_v3(), dot_v3v3(), float, FLT_MAX, len_squared_v3(), len_squared_v3v3(), madd_v3_v3fl(), normal_quad_v3(), normal_tri_v3(), normalize_v3(), project_plane_normalized_v3_v3v3(), and sub_v3_v3v3().

Referenced by BM_verts_calc_normal_from_cloud(), and BM_verts_sort_radial_plane().