Blender V5.0
bmesh_beautify.cc File Reference
#include "BLI_heap.h"
#include "BLI_math_geom.h"
#include "BLI_math_vector.h"
#include "BLI_polyfill_2d_beautify.h"
#include "MEM_guardedalloc.h"
#include "bmesh.hh"
#include "bmesh_beautify.hh"

Go to the source code of this file.

Classes

struct  EdRotState

Macros

#define EDGE_ORD(v0, v1)

Functions

static GSeterot_gset_new ()
static void erot_state_ex (const BMEdge *e, int v_index[2], int f_index[2])
static void erot_state_current (const BMEdge *e, EdRotState *e_state)
static void erot_state_alternate (const BMEdge *e, EdRotState *e_state)
static float bm_edge_calc_rotate_beauty__angle (const float v1[3], const float v2[3], const float v3[3], const float v4[3])
float BM_verts_calc_rotate_beauty (const BMVert *v1, const BMVert *v2, const BMVert *v3, const BMVert *v4, const short flag, const short method)
static float bm_edge_calc_rotate_beauty (const BMEdge *e, const short flag, const short method)
BLI_INLINE bool edge_in_array (const BMEdge *e, const BMEdge **edge_array, const int edge_array_len)
static void bm_edge_update_beauty_cost_single (BMEdge *e, Heap *eheap, HeapNode **eheap_table, GSet **edge_state_arr, const BMEdge **edge_array, const int edge_array_len, const short flag, const short method)
static void bm_edge_update_beauty_cost (BMEdge *e, Heap *eheap, HeapNode **eheap_table, GSet **edge_state_arr, const BMEdge **edge_array, const int edge_array_len, const short flag, const short method)
void BM_mesh_beautify_fill (BMesh *bm, BMEdge **edge_array, const int edge_array_len, const short flag, const short method, const short oflag_edge, const short oflag_face)

Detailed Description

Beautify the mesh by rotating edges between triangles to more attractive positions until no more rotations can be made.

In principle this is very simple however there is the possibility of going into an eternal loop where edges keep rotating. To avoid this - each edge stores a set of it previous states so as not to rotate back.

TODO

  • Take face normals into account.

Definition in file bmesh_beautify.cc.

Macro Definition Documentation

◆ EDGE_ORD

#define EDGE_ORD ( v0,
v1 )
Value:
if (v0 > v1) { \
std::swap(v0, v1); \
} \
(void)0

Definition at line 100 of file bmesh_beautify.cc.

Referenced by erot_state_ex().

Function Documentation

◆ bm_edge_calc_rotate_beauty()

float bm_edge_calc_rotate_beauty ( const BMEdge * e,
const short flag,
const short method )
static

Definition at line 198 of file bmesh_beautify.cc.

References BM_verts_calc_rotate_beauty(), e, flag, and v2.

Referenced by bm_edge_update_beauty_cost_single(), and BM_mesh_beautify_fill().

◆ bm_edge_calc_rotate_beauty__angle()

float bm_edge_calc_rotate_beauty__angle ( const float v1[3],
const float v2[3],
const float v3[3],
const float v4[3] )
static

Definition at line 137 of file bmesh_beautify.cc.

References angle_normalized_v3v3(), FLT_MAX, normal_tri_v3(), and v2.

Referenced by BM_verts_calc_rotate_beauty().

◆ bm_edge_update_beauty_cost()

void bm_edge_update_beauty_cost ( BMEdge * e,
Heap * eheap,
HeapNode ** eheap_table,
GSet ** edge_state_arr,
const BMEdge ** edge_array,
const int edge_array_len,
const short flag,
const short method )
static

◆ bm_edge_update_beauty_cost_single()

void bm_edge_update_beauty_cost_single ( BMEdge * e,
Heap * eheap,
HeapNode ** eheap_table,
GSet ** edge_state_arr,
const BMEdge ** edge_array,
const int edge_array_len,
const short flag,
const short method )
static

◆ BM_mesh_beautify_fill()

◆ BM_verts_calc_rotate_beauty()

float BM_verts_calc_rotate_beauty ( const BMVert * v1,
const BMVert * v2,
const BMVert * v3,
const BMVert * v4,
short flag,
short method )

Assuming we have 2 triangles sharing an edge (2 - 4), check if the edge running from (1 - 3) gives better results.

Returns
(negative number means the edge can be rotated, lager == better).

Definition at line 165 of file bmesh_beautify.cc.

References BLI_polyfill_edge_calc_rotate_beauty__area(), bm_edge_calc_rotate_beauty__angle(), BM_elem_flag_test, BM_ELEM_TAG, BMVert::co, EDGE_RESTRICT_DEGENERATE, flag, FLT_MAX, UNLIKELY, v2, and VERT_RESTRICT_TAG.

Referenced by bm_edge_calc_rotate_beauty(), BM_face_triangulate(), and bmesh_calc_tessellation_for_face_beauty().

◆ edge_in_array()

BLI_INLINE bool edge_in_array ( const BMEdge * e,
const BMEdge ** edge_array,
const int edge_array_len )

Definition at line 212 of file bmesh_beautify.cc.

References BLI_INLINE, BM_elem_index_get, and e.

Referenced by bm_edge_update_beauty_cost_single().

◆ erot_gset_new()

GSet * erot_gset_new ( )
static

◆ erot_state_alternate()

void erot_state_alternate ( const BMEdge * e,
EdRotState * e_state )
static

◆ erot_state_current()

void erot_state_current ( const BMEdge * e,
EdRotState * e_state )
static

Definition at line 124 of file bmesh_beautify.cc.

References e, erot_state_ex(), EdRotState::f_pair, and EdRotState::v_pair.

Referenced by BM_mesh_beautify_fill().

◆ erot_state_ex()

void erot_state_ex ( const BMEdge * e,
int v_index[2],
int f_index[2] )
static