Blender  V2.93
Functions
bmesh_polygon.h File Reference
#include "BLI_compiler_attrs.h"

Go to the source code of this file.

Functions

void BM_mesh_calc_tessellation (BMesh *bm, BMLoop *(*looptris)[3], int *r_looptris_tot)
 BM_mesh_calc_tessellation get the looptris and its number from a certain bmesh. More...
 
void BM_mesh_calc_tessellation_beauty (BMesh *bm, BMLoop *(*looptris)[3], int *r_looptris_tot)
 
void BM_face_calc_tessellation (const BMFace *f, const 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. More...
 
float BM_face_calc_normal_vcos (const BMesh *bm, const BMFace *f, float r_no[3], float const (*vertexCos)[3]) 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 (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], float const (*vertexCos)[3]) 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], float const (*vertexCos)[3]) 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, const 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, const int cd_loop_mdisp_offset, const bool use_loop_mdisp_flip) ATTR_NONNULL()
 Face Flip Normal. More...
 
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, const int quad_method, const int ngon_method, const bool use_tag, struct MemArena *pf_arena, struct Heap *pf_heap) ATTR_NONNULL(1
 
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 691 of file bmesh_polygon.c.

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 1512 of file bmesh_polygon.c.

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 1495 of file bmesh_polygon.c.

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 1474 of file bmesh_polygon.c.

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()

void BM_face_as_array_vert_tri ( BMFace f,
BMVert r_verts[3] 
)

◆ BM_face_calc_area()

float BM_face_calc_area ( const BMFace f)

◆ BM_face_calc_area_uv()

float BM_face_calc_area_uv ( const BMFace f,
int  cd_loop_uv_offset 
)

get the area of UV face

Definition at line 264 of file bmesh_polygon.c.

References BM_ELEM_CD_GET_VOID_P, BM_FACE_FIRST_LOOP, cross(), fabsf, BMLoop::next, and MLoopUV::uv.

Referenced by mesh_edituv_stretch_area_finish().

◆ BM_face_calc_area_with_mat3()

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

Get the area of the face in world space.

Definition at line 242 of file bmesh_polygon.c.

References add_newell_cross_v3_v3v3(), BM_FACE_FIRST_LOOP, BMVert::co, copy_v3_v3(), len_v3(), mul_v3_m3v3(), BMLoop::next, BMLoop::v, and zero_v3().

Referenced by similar_face_select_exec().

◆ 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 571 of file bmesh_polygon.c.

References BM_FACE_FIRST_LOOP, BMVert::co, max, 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] 
)

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

Definition at line 583 of file bmesh_polygon.c.

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

Referenced by bmo_poke_exec(), bpy_bmface_calc_center_bounds(), choose_rep_face(), and DRW_text_edit_mesh_measure_stats().

◆ BM_face_calc_center_bounds_vcos()

void BM_face_calc_center_bounds_vcos ( const BMesh bm,
const BMFace f,
float  r_cent[3],
float const (*)  vertexCos[3] 
)

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

Definition at line 601 of file bmesh_polygon.c.

References BLI_assert, bm, BM_elem_index_get, BM_FACE_FIRST_LOOP, BM_VERT, BMesh::elem_index_dirty, INIT_MINMAX, max, 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()

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

◆ BM_face_calc_center_median_vcos()

void BM_face_calc_center_median_vcos ( const BMesh bm,
const BMFace f,
float  r_center[3],
float const (*)  vertexCos[3] 
)

◆ 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 822 of file bmesh_polygon.c.

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_is_normal_valid(), and BM_face_normal_update().

◆ 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 998 of file bmesh_polygon.c.

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],
float const (*)  vertexCos[3] 
)

◆ BM_face_calc_perimeter()

float BM_face_calc_perimeter ( const BMFace f)

compute the perimeter of an ngon

Definition at line 283 of file bmesh_polygon.c.

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 299 of file bmesh_polygon.c.

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 550 of file bmesh_polygon.c.

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_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 401 of file bmesh_polygon.c.

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 480 of file bmesh_polygon.c.

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 415 of file bmesh_polygon.c.

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(), NULL, 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 517 of file bmesh_polygon.c.

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,
const 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 130 of file bmesh_polygon.c.

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()

void BM_face_normal_flip ( BMesh bm,
BMFace f 
)

◆ BM_face_normal_flip_ex()

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

Face Flip Normal.

Reverses the winding of a face.

Note
This updates the calculated normal.

Definition at line 1037 of file bmesh_polygon.c.

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

Referenced by BM_face_normal_flip(), BMD_mesh_bm_create(), and bmo_reverse_faces_exec().

◆ BM_face_normal_update()

void BM_face_normal_update ( BMFace f)

◆ 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 1062 of file bmesh_polygon.c.

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(), 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 1337 of file bmesh_polygon.c.

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, center, BMVert::co, EDGE_SHARE_VERT, BMesh::elem_index_dirty, float(), 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, NULL, 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 1438 of file bmesh_polygon.c.

References BM_vert_pair_share_face_by_angle(), len, NULL, 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,
const int  quad_method,
const int  ngon_method,
const bool  use_tag,
struct MemArena pf_arena,
struct Heap pf_heap 
)

◆ BM_mesh_calc_tessellation()

void BM_mesh_calc_tessellation ( BMesh bm,
BMLoop *(*)  looptris[3],
int *  r_looptris_tot 
)

◆ BM_mesh_calc_tessellation_beauty()

void BM_mesh_calc_tessellation_beauty ( BMesh bm,
BMLoop *(*)  looptris[3],
int *  r_looptris_tot 
)

◆ 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,
const char  hflag,
float  r_no[3] 
)

◆ BM_vert_normal_update()

void BM_vert_normal_update ( BMVert v)

update a vert normal (but not the faces incident on it)

Definition at line 807 of file bmesh_polygon.c.

References BM_vert_calc_normal(), BMVert::no, and v.

Referenced by bm_decim_edge_collapse(), BM_edge_normals_update(), bm_vert_connect_pair(), bpy_bmvert_normal_update(), calc_solidify_normals(), and pbvh_bmesh_normals_update().

◆ BM_vert_normal_update_all()

void BM_vert_normal_update_all ( BMVert v)

◆ 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 367 of file bmesh_polygon.c.

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 384 of file bmesh_polygon.c.

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 990 of file bmesh_polygon.c.

References BM_verts_calc_normal_from_cloud_ex(), and NULL.

◆ 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 894 of file bmesh_polygon.c.

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

Referenced by BM_verts_calc_normal_from_cloud(), and BM_verts_sort_radial_plane().