Blender
V3.3
|
#include "MEM_guardedalloc.h"
#include "DNA_scene_types.h"
#include "BLI_bitmap.h"
#include "BLI_linklist_stack.h"
#include "BLI_math.h"
#include "BLI_stack.h"
#include "BLI_task.h"
#include "BLI_utildefines.h"
#include "BKE_customdata.h"
#include "BKE_editmesh.h"
#include "BKE_global.h"
#include "BKE_mesh.h"
#include "intern/bmesh_private.h"
Go to the source code of this file.
Classes | |
struct | BMVertsCalcNormalsWithCoordsData |
struct | BMLoopsCalcNormalsWithCoordsData |
struct | BMLoopsCalcNormalsWithCoords_TLS |
Macros | |
#define | EDGE_TAG_FROM_SPLIT_ANGLE_BYPASS -FLT_MAX |
Loop Normals Calculation API | |
#define | LNOR_SPACE_TRIGO_THRESHOLD (1.0f - 1e-4f) |
typedef struct BMLoopsCalcNormalsWithCoordsData | BMLoopsCalcNormalsWithCoordsData |
typedef struct BMLoopsCalcNormalsWithCoords_TLS | BMLoopsCalcNormalsWithCoords_TLS |
static void | bm_edge_tag_from_smooth_and_set_sharp (const float(*fnos)[3], BMEdge *e, const float split_angle_cos) |
static void | bm_edge_tag_from_smooth (const float(*fnos)[3], BMEdge *e, const float split_angle_cos) |
bool | BM_loop_check_cyclic_smooth_fan (BMLoop *l_curr) |
static int | bm_mesh_loops_calc_normals_for_loop (BMesh *bm, const float(*vcos)[3], const float(*fnos)[3], const short(*clnors_data)[2], const int cd_loop_clnors_offset, const bool has_clnors, BLI_Stack *edge_vectors, BMLoop *l_curr, float(*r_lnos)[3], MLoopNorSpaceArray *r_lnors_spacearr) |
static int | bm_loop_index_cmp (const void *a, const void *b) |
BLI_INLINE bool | bm_edge_is_smooth_no_angle_test (const BMEdge *e, const BMLoop *l_a, const BMLoop *l_b) |
static void | bm_mesh_loops_calc_normals_for_vert_with_clnors (BMesh *bm, const float(*vcos)[3], const float(*fnos)[3], float(*r_lnos)[3], const short(*clnors_data)[2], const int cd_loop_clnors_offset, const bool do_rebuild, const float split_angle_cos, MLoopNorSpaceArray *r_lnors_spacearr, BLI_Stack *edge_vectors, BMVert *v) |
static void | bm_mesh_loops_calc_normals_for_vert_without_clnors (BMesh *bm, const float(*vcos)[3], const float(*fnos)[3], float(*r_lnos)[3], const bool do_rebuild, const float split_angle_cos, MLoopNorSpaceArray *r_lnors_spacearr, BLI_Stack *edge_vectors, BMVert *v) |
static void | bm_mesh_loops_calc_normals__single_threaded (BMesh *bm, const float(*vcos)[3], const float(*fnos)[3], float(*r_lnos)[3], MLoopNorSpaceArray *r_lnors_spacearr, const short(*clnors_data)[2], const int cd_loop_clnors_offset, const bool do_rebuild, const float split_angle_cos) |
static void | bm_mesh_loops_calc_normals_for_vert_init_fn (const void *__restrict userdata, void *__restrict chunk) |
static void | bm_mesh_loops_calc_normals_for_vert_reduce_fn (const void *__restrict userdata, void *__restrict UNUSED(chunk_join), void *__restrict chunk) |
static void | bm_mesh_loops_calc_normals_for_vert_free_fn (const void *__restrict userdata, void *__restrict chunk) |
static void | bm_mesh_loops_calc_normals_for_vert_with_clnors_fn (void *userdata, MempoolIterData *mp_v, const TaskParallelTLS *__restrict tls) |
static void | bm_mesh_loops_calc_normals_for_vert_without_clnors_fn (void *userdata, MempoolIterData *mp_v, const TaskParallelTLS *__restrict tls) |
static void | bm_mesh_loops_calc_normals__multi_threaded (BMesh *bm, const float(*vcos)[3], const float(*fnos)[3], float(*r_lnos)[3], MLoopNorSpaceArray *r_lnors_spacearr, const short(*clnors_data)[2], const int cd_loop_clnors_offset, const bool do_rebuild, const float split_angle_cos) |
static void | bm_mesh_loops_calc_normals (BMesh *bm, const float(*vcos)[3], const float(*fnos)[3], float(*r_lnos)[3], MLoopNorSpaceArray *r_lnors_spacearr, const short(*clnors_data)[2], const int cd_loop_clnors_offset, const bool do_rebuild, const float split_angle_cos) |
static bool | bm_mesh_loops_split_lnor_fans (BMesh *bm, MLoopNorSpaceArray *lnors_spacearr, const float(*new_lnors)[3]) |
static void | bm_mesh_loops_assign_normal_data (BMesh *bm, MLoopNorSpaceArray *lnors_spacearr, short(*r_clnors_data)[2], const int cd_loop_clnors_offset, const float(*new_lnors)[3]) |
static void | bm_mesh_loops_custom_normals_set (BMesh *bm, const float(*vcos)[3], const float(*fnos)[3], MLoopNorSpaceArray *r_lnors_spacearr, short(*r_clnors_data)[2], const int cd_loop_clnors_offset, float(*new_lnors)[3], const int cd_new_lnors_offset, bool do_split_fans) |
static void | bm_mesh_loops_calc_normals_no_autosmooth (BMesh *bm, const float(*vnos)[3], const float(*fnos)[3], float(*r_lnos)[3]) |
void | BM_loops_calc_normal_vcos (BMesh *bm, const float(*vcos)[3], const float(*vnos)[3], const float(*fnos)[3], const bool use_split_normals, const float split_angle, float(*r_lnos)[3], MLoopNorSpaceArray *r_lnors_spacearr, short(*clnors_data)[2], const int cd_loop_clnors_offset, const bool do_rebuild) |
BMesh Compute Loop Normals from/to external data. More... | |
Loop Normal Space API | |
#define | CLEAR_SPACEARRAY_THRESHOLD(x) ((x) / 2) |
void | BM_lnorspacearr_store (BMesh *bm, float(*r_lnors)[3]) |
void | BM_lnorspace_invalidate (BMesh *bm, const bool do_invalidate_all) |
void | BM_lnorspace_rebuild (BMesh *bm, bool preserve_clnor) |
void | BM_lnorspace_update (BMesh *bm) |
BM mesh normal calculation functions.
Definition in file bmesh_mesh_normals.c.
Helpers for BM_mesh_normals_update and BM_verts_calc_normal_vcos
Definition at line 49 of file bmesh_mesh_normals.c.
Definition at line 1744 of file bmesh_mesh_normals.c.
#define EDGE_TAG_FROM_SPLIT_ANGLE_BYPASS -FLT_MAX |
Definition at line 30 of file bmesh_mesh_normals.c.
Definition at line 1376 of file bmesh_mesh_normals.c.
typedef struct BMLoopsCalcNormalsWithCoords_TLS BMLoopsCalcNormalsWithCoords_TLS |
typedef struct BMLoopsCalcNormalsWithCoordsData BMLoopsCalcNormalsWithCoordsData |
typedef struct BMVertsCalcNormalsWithCoordsData BMVertsCalcNormalsWithCoordsData |
Definition at line 2239 of file bmesh_mesh_normals.c.
References bm, bm_mesh_loops_custom_normals_set(), BM_SPACEARR_DIRTY, BM_SPACEARR_DIRTY_ALL, CD_CUSTOMLOOPNORMAL, CD_NORMAL, CustomData_get_offset(), CustomData_has_layer(), BMesh::ldata, BMesh::lnor_spacearr, MEM_callocN, NULL, and BMesh::spacearr_dirty.
Referenced by edbm_connect_vert_pair(), edbm_delete_exec(), edbm_dissolve_edges_exec(), edbm_dissolve_faces_exec(), edbm_dissolve_limited_exec(), edbm_dissolve_verts_exec(), edbm_edge_split_selected_edges(), edbm_edge_split_selected_verts(), edbm_knife_cut_exec(), edbm_merge_exec(), edbm_quads_convert_to_tris_exec(), edbm_remove_doubles_exec(), edbm_rip_invoke(), edbm_split_exec(), edbm_tris_convert_to_quads_exec(), edbm_vert_connect_path_exec(), and mesh_separate_arrays().
Definition at line 2202 of file bmesh_mesh_normals.c.
References BKE_lnor_space_custom_data_to_normal(), bm, BM_data_layer_add(), BM_ELEM_CD_GET_VOID_P, BM_FACES_OF_MESH, BM_ITER_ELEM, BM_ITER_MESH, BM_lnorspace_update(), BM_LOOPS_OF_FACE, CD_CUSTOMLOOPNORMAL, CD_FLAG_TEMPORARY, CD_NORMAL, CustomData_get_offset(), CustomData_has_layer(), CustomData_set_layer_flag(), l, BMesh::ldata, BMesh::lnor_spacearr, MLoopNorSpaceArray::lspacearr, and normal.
Referenced by edbm_connect_vert_pair(), edbm_delete_exec(), edbm_dissolve_edges_exec(), edbm_dissolve_faces_exec(), edbm_dissolve_limited_exec(), edbm_dissolve_verts_exec(), edbm_edge_split_selected_edges(), edbm_edge_split_selected_verts(), edbm_knife_cut_exec(), edbm_merge_exec(), edbm_quads_convert_to_tris_exec(), edbm_remove_doubles_exec(), edbm_rip_invoke(), edbm_split_exec(), edbm_tris_convert_to_quads_exec(), edbm_vert_connect_path_exec(), and mesh_separate_loose().
BLI_INLINE bool bm_edge_is_smooth_no_angle_test | ( | const BMEdge * | e, |
const BMLoop * | l_a, | ||
const BMLoop * | l_b | ||
) |
We only tag edges that are really smooth when the following conditions are met:
Definition at line 776 of file bmesh_mesh_normals.c.
References BLI_assert, BM_elem_flag_test, BM_ELEM_SMOOTH, e, BMLoop::f, l_b, BMLoop::radial_next, and BMLoop::v.
Referenced by bm_edge_tag_from_smooth(), and bm_edge_tag_from_smooth_and_set_sharp().
|
static |
Definition at line 792 of file bmesh_mesh_normals.c.
References BLI_assert, bm_edge_is_smooth_no_angle_test(), BM_elem_index_get, BM_ELEM_TAG, dot_v3v3(), e, BMLoop::f, BMVert::head, BMHeader::hflag, l_b, BMFace::no, NULL, and BMLoop::radial_next.
Referenced by bm_mesh_edges_sharp_tag(), bm_mesh_loops_calc_normals_for_vert_with_clnors(), and bm_mesh_loops_calc_normals_for_vert_without_clnors().
|
static |
A version of bm_edge_tag_from_smooth that sets sharp edges when they would be considered smooth but exceed the split angle .
Definition at line 831 of file bmesh_mesh_normals.c.
References BLI_assert, bm_edge_is_smooth_no_angle_test(), BM_elem_flag_disable, BM_elem_flag_set, BM_elem_index_get, BM_ELEM_SMOOTH, BM_ELEM_TAG, dot_v3v3(), e, BMLoop::f, l_b, BMFace::no, NULL, and BMLoop::radial_next.
Referenced by bm_mesh_edges_sharp_tag().
Define sharp edges as needed to mimic 'autosmooth' from angle threshold.
Used when defining an empty custom loop normals data layer, to keep same shading as with auto-smooth!
Definition at line 409 of file bmesh_mesh_normals.c.
References bm, bm_mesh_edges_sharp_tag(), cosf, M_PI, and NULL.
Referenced by bevel_harden_normals(), BKE_editmesh_lnorspace_update(), and mesh_customdata_custom_splitnormals_add_exec().
|
static |
Definition at line 227 of file bmesh_mesh_normals.c.
References BM_face_calc_normal(), and BMFace::no.
Referenced by BM_mesh_normals_update_ex().
Auxiliary function only used by rebuild to detect if any spaces were not marked as invalid. Reports error if any of the lnor spaces change after rebuilding, meaning that all the possible lnor spaces to be rebuilt were not correctly marked.
Definition at line 1920 of file bmesh_mesh_normals.c.
References BKE_lnor_spacearr_free(), BKE_lnor_spacearr_init(), BLI_assert, bm, BM_loops_calc_normal_vcos(), BM_SPACEARR_DIRTY_ALL, CD_CUSTOMLOOPNORMAL, clear(), compare_ff(), compare_v3v3(), CustomData_get_offset(), float(), BMesh::ldata, BMesh::lnor_spacearr, MLoopNorSpaceArray::lspacearr, M_PI, MEM_callocN, MEM_freeN, MLNOR_SPACEARR_BMLOOP_PTR, NULL, MLoopNorSpace::ref_alpha, MLoopNorSpace::ref_beta, BMesh::spacearr_dirty, BMesh::totloop, MLoopNorSpace::vec_lnor, MLoopNorSpace::vec_ortho, and MLoopNorSpace::vec_ref.
Referenced by BM_lnorspace_rebuild().
Definition at line 1746 of file bmesh_mesh_normals.c.
References BLI_BITMAP_ENABLE, BLI_BITMAP_NEW, BLI_BITMAP_TEST, bm, BM_ELEM_API_FLAG_ENABLE, BM_elem_flag_test, BM_elem_index_get, BM_ELEM_SELECT, BM_ITER_ELEM, BM_ITER_MESH, BM_LNORSPACE_UPDATE, BM_LOOPS_OF_VERT, BM_mesh_elem_index_ensure(), BM_SPACEARR_DIRTY, BM_SPACEARR_DIRTY_ALL, BM_VERT, BM_VERTS_OF_MESH, CLEAR_SPACEARRAY_THRESHOLD, l, BMesh::lnor_spacearr, MEM_freeN, BMLoop::next, NULL, BMLoop::prev, BMesh::spacearr_dirty, BMesh::totvert, BMesh::totvertsel, BMLoop::v, and v.
Referenced by EDBM_update(), and initTransform().
Definition at line 1814 of file bmesh_mesh_normals.c.
References BKE_lnor_space_custom_data_to_normal(), BKE_lnor_space_custom_normal_to_data(), BKE_lnor_spacearr_clear(), BLI_assert, bm, BM_ELEM_API_FLAG_DISABLE, BM_ELEM_API_FLAG_TEST, BM_ELEM_CD_GET_VOID_P, BM_elem_index_get, BM_FACES_OF_MESH, BM_ITER_ELEM, BM_ITER_MESH, BM_lnorspace_err(), BM_LNORSPACE_UPDATE, BM_LOOP, BM_loops_calc_normal_vcos(), BM_LOOPS_OF_FACE, BM_mesh_elem_index_ensure(), BM_SPACEARR_DIRTY, BM_SPACEARR_DIRTY_ALL, CD_CUSTOMLOOPNORMAL, CustomData_get_offset(), float(), l, BMesh::ldata, BMesh::lnor_spacearr, MLoopNorSpaceArray::lspacearr, M_PI, MEM_callocN, MEM_freeN, MEM_mallocN, MEM_SAFE_FREE, NULL, BMesh::spacearr_dirty, and BMesh::totloop.
Referenced by BM_lnorspace_update(), and transformEnd().
Definition at line 1889 of file bmesh_mesh_normals.c.
References bm, BM_lnorspace_rebuild(), BM_lnorspacearr_store(), BM_SPACEARR_DIRTY, BM_SPACEARR_DIRTY_ALL, float(), BMesh::lnor_spacearr, MLoopNorSpaceArray::lspacearr, MEM_callocN, MEM_freeN, NULL, BMesh::spacearr_dirty, and BMesh::totloop.
Referenced by bevel_harden_normals(), BKE_editmesh_lnorspace_update(), BM_custom_loop_normals_to_vector_layer(), edbm_flip_normals_custom_loop_normals(), flip_custom_normals(), and flip_custom_normals_init_data().
Definition at line 1720 of file bmesh_mesh_normals.c.
References BLI_assert, bm, BM_data_layer_add(), BM_loops_calc_normal_vcos(), BM_SPACEARR_DIRTY, BM_SPACEARR_DIRTY_ALL, CD_CUSTOMLOOPNORMAL, CustomData_get_offset(), CustomData_has_layer(), BMesh::ldata, BMesh::lnor_spacearr, M_PI, NULL, and BMesh::spacearr_dirty.
Referenced by BM_lnorspace_update().
Check whether given loop is part of an unknown-so-far cyclic smooth fan, or not. Needed because cyclic smooth fans have no obvious 'entry point', and yet we need to walk them once, and only once.
Definition at line 425 of file bmesh_mesh_normals.c.
References BLI_assert, BM_elem_flag_enable, BM_elem_flag_test, BM_ELEM_TAG, BM_vert_step_fan_loop(), and BMLoop::e.
Referenced by bm_mesh_loops_calc_normals_for_loop(), edbm_average_normals_exec(), and normals_split().
Definition at line 759 of file bmesh_mesh_normals.c.
References Freestyle::a, usdtokens::b(), BLI_assert, and BM_elem_index_get.
Referenced by bm_mesh_loops_calc_normals_for_vert_with_clnors().
void BM_loop_normal_editdata_array_free | ( | BMLoopNorEditDataArray * | lnors_ed_arr | ) |
Definition at line 2189 of file bmesh_mesh_normals.c.
References BMLoopNorEditDataArray::lidx_to_lnor_editdata, BMLoopNorEditDataArray::lnor_editdata, MEM_freeN, and MEM_SAFE_FREE.
Referenced by edbm_flip_normals_custom_loop_normals(), edbm_flip_normals_face_winding(), edbm_normals_make_consistent_exec(), edbm_normals_tools_exec(), edbm_smooth_normals_exec(), flip_custom_normals(), freeCustomNormalArray(), normals_split_merge(), and point_normals_free().
BMLoopNorEditDataArray* BM_loop_normal_editdata_array_init | ( | BMesh * | bm, |
const bool | do_all_loops_of_vert | ||
) |
Definition at line 2141 of file bmesh_mesh_normals.c.
References BLI_assert, BLI_BITMAP_NEW, BLI_BITMAP_TEST, bm, BM_data_layer_add(), BM_elem_index_get, BM_ITER_ELEM, BM_ITER_MESH, BM_LOOP, bm_loop_normal_mark_indiv(), BM_LOOPS_OF_VERT, BM_mesh_elem_index_ensure(), BM_VERTS_OF_MESH, BMLoopNorEditDataArray::cd_custom_normal_offset, CD_CUSTOMLOOPNORMAL, CustomData_get_offset(), CustomData_has_layer(), l, BMesh::ldata, BMLoopNorEditDataArray::lidx_to_lnor_editdata, BMLoopNorEditDataArray::lnor_editdata, loop_normal_editdata_init(), MEM_callocN, MEM_freeN, MEM_mallocN, BMesh::spacearr_dirty, BMesh::totloop, BMLoopNorEditDataArray::totloop, and v.
Referenced by edbm_flip_normals_custom_loop_normals(), edbm_normals_tools_exec(), edbm_smooth_normals_exec(), flip_custom_normals(), flip_custom_normals_init_data(), normals_split_merge(), point_normals_init(), and storeCustomLNorValue().
|
static |
Definition at line 2007 of file bmesh_mesh_normals.c.
References BLI_assert, bm, BM_EDGE, BM_EDGES_OF_MESH, BM_elem_flag_test, BM_ELEM_SELECT, BM_FACE, BM_face_vert_share_loop(), BM_FACES_OF_MESH, BM_ITER_ELEM, BM_ITER_MESH, BM_LOOP, bm_loop_normal_mark_indiv_do_loop(), BM_LOOPS_OF_EDGE, BM_LOOPS_OF_FACE, BM_LOOPS_OF_VERT, BM_mesh_elem_index_ensure(), BM_VERT, BM_vert_in_edge(), BM_VERTS_OF_MESH, MLoopNorSpaceArray::data_type, e, BMEditSelection::ele, BMEditSelection::htype, l, ListBase::last, BMesh::lnor_spacearr, MLNOR_SPACEARR_BMLOOP_PTR, BMLoop::next, NULL, BMLoop::prev, BMEditSelection::prev, SCE_SELECT_EDGE, SCE_SELECT_FACE, SCE_SELECT_VERTEX, BMesh::selected, BMesh::selectmode, BMLoop::v, and v.
Referenced by BM_loop_normal_editdata_array_init().
|
static |
Definition at line 1962 of file bmesh_mesh_normals.c.
References BLI_BITMAP_ENABLE, BLI_BITMAP_TEST, BM_elem_index_get, BM_ITER_ELEM, BM_LOOPS_OF_VERT, MLoopNorSpace::flags, l, MLoopNorSpace::loops, MLoopNorSpaceArray::lspacearr, MLNOR_SPACE_IS_SINGLE, node, NULL, and BMLoop::v.
Referenced by bm_loop_normal_mark_indiv().
void BM_loops_calc_normal_vcos | ( | BMesh * | bm, |
const float(*) | vcos[3], | ||
const float(*) | vnos[3], | ||
const float(*) | fnos[3], | ||
bool | use_split_normals, | ||
float | split_angle, | ||
float(*) | r_lnos[3], | ||
struct MLoopNorSpaceArray * | r_lnors_spacearr, | ||
short(*) | clnors_data[2], | ||
int | cd_loop_clnors_offset, | ||
bool | do_rebuild | ||
) |
BMesh Compute Loop Normals from/to external data.
Compute split normals, i.e. vertex normals associated with each poly (hence 'loop normals'). Useful to materialize sharp edges (or non-smooth faces) without actually modifying the geometry (splitting edges).
Definition at line 1683 of file bmesh_mesh_normals.c.
References BLI_assert, bm, bm_mesh_loops_calc_normals(), bm_mesh_loops_calc_normals_no_autosmooth(), and cosf.
Referenced by BM_lnorspace_err(), BM_lnorspace_rebuild(), BM_lnorspacearr_store(), and mesh_render_data_update_normals().
|
static |
Helpers for #BM_mesh_loop_normals_update and BM_loops_calc_normal_vcos
Definition at line 376 of file bmesh_mesh_normals.c.
References bm, BM_EDGE, bm_edge_tag_from_smooth(), bm_edge_tag_from_smooth_and_set_sharp(), BM_EDGES_OF_MESH, BM_elem_index_set, BM_FACE, BM_ITER_MESH_INDEX, BM_mesh_elem_index_ensure(), e, BMesh::elem_index_dirty, and NULL.
Referenced by BM_edges_sharp_from_angle_set(), bm_mesh_loops_calc_normals__single_threaded(), and bm_mesh_loops_custom_normals_set().
|
static |
Assign custom normal data from given normal vectors, averaging normals from one smooth fan as necessary.
Definition at line 1478 of file bmesh_mesh_normals.c.
References add_v3_v3(), BKE_lnor_space_custom_normal_to_data(), BLI_assert, BLI_BITMAP_ENABLE, BLI_BITMAP_NEW, BLI_BITMAP_TEST, BLI_SMALLSTACK_DECLARE, BLI_SMALLSTACK_POP, BLI_SMALLSTACK_PUSH, bm, BM_ELEM_CD_GET_VOID_P, BM_elem_index_get, MLoopNorSpaceArray::data_type, MLoopNorSpace::flags, G, G_DEBUG, LinkNode::link, MLoopNorSpace::loops, MLoopNorSpaceArray::lspacearr, MEM_freeN, MLNOR_SPACE_IS_SINGLE, MLNOR_SPACEARR_BMLOOP_PTR, mul_v3_fl(), LinkNode::next, nor, BMesh::totloop, and zero_v3().
Referenced by bm_mesh_loops_custom_normals_set().
|
static |
Definition at line 1341 of file bmesh_mesh_normals.c.
References bm, bm_mesh_loops_calc_normals__multi_threaded(), bm_mesh_loops_calc_normals__single_threaded(), BM_OMP_LIMIT, and BMesh::totloop.
Referenced by BM_loops_calc_normal_vcos(), and bm_mesh_loops_custom_normals_set().
|
static |
Definition at line 1265 of file bmesh_mesh_normals.c.
References BKE_lnor_spacearr_free(), BKE_lnor_spacearr_init(), BLI_parallel_mempool_settings_defaults(), bm, BM_FACE, BM_LOOP, BM_mesh_elem_index_ensure(), bm_mesh_loops_calc_normals_for_vert_free_fn(), bm_mesh_loops_calc_normals_for_vert_init_fn(), bm_mesh_loops_calc_normals_for_vert_reduce_fn(), bm_mesh_loops_calc_normals_for_vert_with_clnors_fn(), bm_mesh_loops_calc_normals_for_vert_without_clnors_fn(), BM_VERT, BM_VERTS_OF_MESH, data, TaskParallelSettings::func_free, TaskParallelSettings::func_init, TaskParallelSettings::func_reduce, MLNOR_SPACEARR_BMLOOP_PTR, NULL, BMesh::totloop, TaskParallelSettings::userdata_chunk, and TaskParallelSettings::userdata_chunk_size.
Referenced by bm_mesh_loops_calc_normals().
|
static |
BMesh version of BKE_mesh_normals_loop_split() in mesh_evaluate.cc
Will use first clnors_data array, and fallback to cd_loop_clnors_offset (use NULL and -1 to not use clnors).
Definition at line 1063 of file bmesh_mesh_normals.c.
References BKE_lnor_spacearr_free(), BKE_lnor_spacearr_init(), BLI_stack_free(), BLI_stack_new, bm, BM_ELEM_API_FLAG_TEST, BM_elem_flag_disable, BM_elem_index_set, BM_ELEM_TAG, BM_FACE, BM_FACE_FIRST_LOOP, BM_FACES_OF_MESH, BM_ITER_MESH, BM_ITER_MESH_INDEX, BM_LNORSPACE_UPDATE, BM_LOOP, bm_mesh_edges_sharp_tag(), BM_mesh_elem_index_ensure(), bm_mesh_loops_calc_normals_for_loop(), BM_SPACEARR_DIRTY_ALL, BM_VERT, EDGE_TAG_FROM_SPLIT_ANGLE_BYPASS, BMesh::elem_index_dirty, MLNOR_SPACEARR_BMLOOP_PTR, BMLoop::next, NULL, BMesh::spacearr_dirty, and BMesh::totloop.
Referenced by bm_mesh_loops_calc_normals().
|
static |
Called for all faces loops.
Definition at line 469 of file bmesh_mesh_normals.c.
References BKE_lnor_space_add_loop(), BKE_lnor_space_create(), BKE_lnor_space_custom_data_to_normal(), BKE_lnor_space_define(), BLI_assert, BLI_SMALLSTACK_DECLARE, BLI_SMALLSTACK_POP, BLI_SMALLSTACK_PUSH, BLI_stack_is_empty(), BLI_stack_push(), bm, BM_edge_other_vert(), BM_ELEM_CD_GET_VOID_P, BM_elem_flag_enable, BM_elem_flag_test, BM_elem_index_get, BM_ELEM_TAG, BM_FACE, BM_LOOP, BM_loop_check_cyclic_smooth_fan(), BM_VERT, BM_vert_step_fan_loop(), BMVert::co, copy_v3_v3(), dot_v3v3(), BMLoop::e, BMesh::elem_index_dirty, BMLoop::f, LIKELY, madd_v3_v3fl(), BMLoop::next, BMFace::no, nor, normal, normalize_v3(), NULL, BMLoop::prev, saacos(), sub_v3_v3v3(), UNLIKELY, UNUSED_VARS_NDEBUG, and BMLoop::v.
Referenced by bm_mesh_loops_calc_normals__single_threaded(), bm_mesh_loops_calc_normals_for_vert_with_clnors(), and bm_mesh_loops_calc_normals_for_vert_without_clnors().
|
static |
Definition at line 1206 of file bmesh_mesh_normals.c.
References BLI_stack_free(), data, and BMLoopsCalcNormalsWithCoords_TLS::edge_vectors.
Referenced by bm_mesh_loops_calc_normals__multi_threaded().
|
static |
Definition at line 1179 of file bmesh_mesh_normals.c.
References BKE_lnor_spacearr_tls_init(), BLI_stack_new, data, BMLoopsCalcNormalsWithCoords_TLS::edge_vectors, BMLoopsCalcNormalsWithCoords_TLS::lnors_spacearr, BMLoopsCalcNormalsWithCoords_TLS::lnors_spacearr_buf, and NULL.
Referenced by bm_mesh_loops_calc_normals__multi_threaded().
|
static |
Definition at line 1194 of file bmesh_mesh_normals.c.
References BKE_lnor_spacearr_tls_join(), data, and BMLoopsCalcNormalsWithCoords_TLS::lnors_spacearr.
Referenced by bm_mesh_loops_calc_normals__multi_threaded().
|
static |
Operate on all vertices loops. operating on vertices this is needed for multi-threading so there is a guarantee that each thread has isolated loops.
Definition at line 866 of file bmesh_mesh_normals.c.
References BLI_assert, BLI_linklist_prepend_alloca, BLI_linklist_sort(), bm, BM_DISK_EDGE_NEXT, bm_edge_tag_from_smooth(), BM_ELEM_API_FLAG_TEST, BM_elem_flag_disable, BM_elem_index_get, BM_ELEM_TAG, BM_LNORSPACE_UPDATE, bm_loop_index_cmp(), bm_mesh_loops_calc_normals_for_loop(), BM_SPACEARR_DIRTY_ALL, BMVert::e, EDGE_TAG_FROM_SPLIT_ANGLE_BYPASS, BMEdge::l, LinkNode::link, LinkNode::next, NULL, BMLoop::radial_next, BMesh::spacearr_dirty, SWAP, UINT_MAX, UNLIKELY, BMLoop::v, and v.
Referenced by bm_mesh_loops_calc_normals_for_vert_with_clnors_fn().
|
static |
Definition at line 1217 of file bmesh_mesh_normals.c.
References bm_mesh_loops_calc_normals_for_vert_with_clnors(), data, BMVert::e, BMLoopsCalcNormalsWithCoords_TLS::edge_vectors, BMLoopsCalcNormalsWithCoords_TLS::lnors_spacearr, NULL, and v.
Referenced by bm_mesh_loops_calc_normals__multi_threaded().
|
static |
A simplified version of bm_mesh_loops_calc_normals_for_vert_with_clnors that can operate on loops in any order.
Definition at line 986 of file bmesh_mesh_normals.c.
References bm, BM_DISK_EDGE_NEXT, bm_edge_tag_from_smooth(), BM_ELEM_API_FLAG_TEST, BM_elem_flag_disable, BM_ELEM_TAG, BM_LNORSPACE_UPDATE, bm_mesh_loops_calc_normals_for_loop(), BM_SPACEARR_DIRTY_ALL, BMVert::e, EDGE_TAG_FROM_SPLIT_ANGLE_BYPASS, BMEdge::l, NULL, BMLoop::radial_next, BMesh::spacearr_dirty, BMLoop::v, and v.
Referenced by bm_mesh_loops_calc_normals_for_vert_without_clnors_fn().
|
static |
Definition at line 1242 of file bmesh_mesh_normals.c.
References bm_mesh_loops_calc_normals_for_vert_without_clnors(), data, BMVert::e, BMLoopsCalcNormalsWithCoords_TLS::edge_vectors, BMLoopsCalcNormalsWithCoords_TLS::lnors_spacearr, NULL, and v.
Referenced by bm_mesh_loops_calc_normals__multi_threaded().
|
static |
Definition at line 1650 of file bmesh_mesh_normals.c.
References bm, BM_elem_flag_test, BM_elem_index_get, BM_ELEM_SMOOTH, BM_FACE, BM_FACE_FIRST_LOOP, BM_FACES_OF_MESH, BM_ITER_MESH, BM_LOOP, BM_mesh_elem_index_ensure(), BM_VERT, copy_v3_v3(), BMLoop::next, BMVert::no, BMFace::no, and BMLoop::v.
Referenced by BM_loops_calc_normal_vcos().
|
static |
Compute internal representation of given custom normals (as an array of float[2] or data layer).
It also makes sure the mesh matches those custom normals, by marking new sharp edges to split the smooth fans when loop normals for the same vertex are different, or averaging the normals instead, depending on the do_split_fans parameter.
Definition at line 1563 of file bmesh_mesh_normals.c.
References BKE_lnor_spacearr_clear(), bm, BM_ELEM_CD_GET_VOID_P, BM_elem_index_get, BM_FACES_OF_MESH, BM_ITER_ELEM, BM_ITER_MESH, BM_LOOPS_OF_FACE, bm_mesh_edges_sharp_tag(), bm_mesh_loops_assign_normal_data(), bm_mesh_loops_calc_normals(), bm_mesh_loops_split_lnor_fans(), copy_v3_v3(), EDGE_TAG_FROM_SPLIT_ANGLE_BYPASS, float(), is_zero_v3(), l, MEM_freeN, MEM_mallocN, normal, normalize_v3(), NULL, and BMesh::totloop.
Referenced by BM_custom_loop_normals_from_vector_layer().
|
static |
Check each current smooth fan (one lnor space per smooth fan!), and if all its matching custom lnors are not (enough) equal, add sharp edges as needed.
Definition at line 1382 of file bmesh_mesh_normals.c.
References BLI_assert, BLI_BITMAP_ENABLE, BLI_BITMAP_NEW, BLI_BITMAP_TEST, bm, BM_elem_flag_disable, BM_elem_index_get, BM_ELEM_SMOOTH, BM_ELEM_TAG, MLoopNorSpaceArray::data_type, dot_v3v3(), BMLoop::e, e, MLoopNorSpace::flags, G, G_DEBUG, LinkNode::link, LNOR_SPACE_TRIGO_THRESHOLD, MLoopNorSpace::loops, MLoopNorSpaceArray::lspacearr, MEM_freeN, MLNOR_SPACE_IS_SINGLE, MLNOR_SPACEARR_BMLOOP_PTR, LinkNode::next, nor, NULL, BMLoop::prev, and BMesh::totloop.
Referenced by bm_mesh_loops_custom_normals_set().
Definition at line 251 of file bmesh_mesh_normals.c.
References bm, and BM_mesh_normals_update_ex().
Referenced by bevel_harden_normals(), BKE_mesh_remesh_voxel_fix_poles(), bmesh_edit_begin(), bmesh_edit_end(), bpy_bmesh_normal_update(), ED_transverts_update_obedit(), mesh_separate_tagged(), modwrap_dependsOnNormals(), SCULPT_dynamic_topology_enable_ex(), and slice_paint_mask().
void BM_mesh_normals_update_ex | ( | BMesh * | bm, |
const struct BMeshNormalsUpdate_Params * | param | ||
) |
BMesh Compute Normals.
Updates the normals of a mesh.
Definition at line 236 of file bmesh_mesh_normals.c.
References BLI_parallel_mempool_settings_defaults(), bm, bm_face_calc_normals_cb(), BM_FACES_OF_MESH, bm_mesh_verts_calc_normals(), BM_OMP_LIMIT, NULL, params, BMesh::totedge, and TaskParallelSettings::use_threading.
Referenced by BKE_editmesh_looptri_and_normals_calc(), BM_mesh_normals_update(), and EDBM_mesh_normals_update_ex().
void BM_mesh_normals_update_with_partial | ( | BMesh * | bm, |
const BMPartialUpdate * | bmpinfo | ||
) |
Definition at line 308 of file bmesh_mesh_normals.c.
References bm, and BM_mesh_normals_update_with_partial_ex().
void BM_mesh_normals_update_with_partial_ex | ( | BMesh * | UNUSEDbm, |
const BMPartialUpdate * | bmpinfo, | ||
const struct BMeshNormalsUpdate_Params * | params | ||
) |
Definition at line 279 of file bmesh_mesh_normals.c.
References BLI_assert, BLI_parallel_range_settings_defaults(), BLI_task_parallel_range(), bm_partial_faces_parallel_range_calc_normals_cb(), bm_partial_verts_parallel_range_calc_normal_cb(), BMPartialUpdate_Params::do_normals, faces, BMPartialUpdate::faces, BMPartialUpdate::faces_len, BMPartialUpdate::params, params, UNLIKELY, BMPartialUpdate::verts, verts, and BMPartialUpdate::verts_len.
Referenced by BKE_editmesh_looptri_and_normals_calc_with_partial(), BM_mesh_normals_update_with_partial(), and tc_mesh_partial_update().
|
static |
Definition at line 202 of file bmesh_mesh_normals.c.
References BLI_assert, BLI_parallel_mempool_settings_defaults(), bm, BM_FACE, BM_mesh_elem_index_ensure(), BM_OMP_LIMIT, BM_VERT, bm_vert_calc_normals_cb(), bm_vert_calc_normals_with_coords_cb(), BM_VERTS_OF_MESH, data, ELEM, NULL, BMesh::totvert, and TaskParallelSettings::use_threading.
Referenced by BM_mesh_normals_update_ex(), and BM_verts_calc_normal_vcos().
Definition at line 338 of file bmesh_mesh_normals.c.
References bm, BM_EDGE, BM_edge_loop_pair(), BM_EDGES_OF_MESH, BM_elem_flag_disable, BM_elem_flag_enable, BM_elem_flag_test, BM_elem_index_set, BM_ELEM_SMOOTH, BM_ELEM_TAG, BM_FACE, BM_FACE_FIRST_LOOP, BM_FACES_OF_MESH, BM_ITER_MESH_INDEX, BM_LOOP, e, BMesh::elem_index_dirty, l_b, BMLoop::next, and BMLoop::v.
Referenced by edbm_average_normals_exec(), normals_merge(), and normals_split().
|
static |
Definition at line 265 of file bmesh_mesh_normals.c.
References BM_face_calc_normal(), and BMFace::no.
Referenced by BM_mesh_normals_update_with_partial_ex().
|
static |
Definition at line 272 of file bmesh_mesh_normals.c.
References bm_vert_calc_normals_impl(), and v.
Referenced by BM_mesh_normals_update_with_partial_ex().
BLI_INLINE void bm_vert_calc_normals_accum_loop | ( | const BMLoop * | l_iter, |
const float | e1diff[3], | ||
const float | e2diff[3], | ||
const float | f_no[3], | ||
float | v_no[3] | ||
) |
Definition at line 60 of file bmesh_mesh_normals.c.
References BLI_assert, dot_v3v3(), BMLoop::e, libmv::isnan(), madd_v3_v3fl(), BMLoop::prev, saacos(), BMLoop::v, and BMEdge::v1.
Referenced by bm_vert_calc_normals_impl(), and bm_vert_calc_normals_with_coords().
|
static |
Definition at line 142 of file bmesh_mesh_normals.c.
References bm_vert_calc_normals_impl(), and v.
Referenced by bm_mesh_verts_calc_normals().
Definition at line 79 of file bmesh_mesh_normals.c.
References BM_DISK_EDGE_NEXT, bm_vert_calc_normals_accum_loop(), BMVert::co, BMVert::e, BMLoop::e, BMLoop::f, BMEdge::l, LIKELY, BMVert::no, BMFace::no, normalize_v3(), normalize_v3_v3(), NULL, BMLoop::prev, BMLoop::radial_next, sub_v3_v3v3(), BMLoop::v, v, BMEdge::v1, BMEdge::v2, and zero_v3().
Referenced by bm_partial_verts_parallel_range_calc_normal_cb(), and bm_vert_calc_normals_cb().
|
static |
Definition at line 150 of file bmesh_mesh_normals.c.
References BM_DISK_EDGE_NEXT, BM_elem_index_get, bm_vert_calc_normals_accum_loop(), data, BMVert::e, BMLoop::e, BMLoop::f, BMEdge::l, LIKELY, normalize_v3(), normalize_v3_v3(), NULL, BMLoop::prev, BMLoop::radial_next, sub_v3_v3v3(), BMLoop::v, v, BMEdge::v1, BMEdge::v2, and zero_v3().
Referenced by bm_vert_calc_normals_with_coords_cb().
|
static |
Definition at line 193 of file bmesh_mesh_normals.c.
References bm_vert_calc_normals_with_coords(), data, and v.
Referenced by bm_mesh_verts_calc_normals().
void BM_verts_calc_normal_vcos | ( | BMesh * | bm, |
const float(*) | fnos[3], | ||
const float(*) | vcos[3], | ||
float(*) | vnos[3] | ||
) |
BMesh Compute Normals from/to external data.
Computes the vertex normals of a mesh into vnos, using given vertex coordinates (vcos) and polygon normals (fnos).
Definition at line 323 of file bmesh_mesh_normals.c.
References bm, and bm_mesh_verts_calc_normals().
Referenced by BKE_editmesh_cache_ensure_vert_normals().
|
static |
Definition at line 2118 of file bmesh_mesh_normals.c.
References BKE_lnor_space_custom_data_to_normal(), BLI_assert, bm, BM_ELEM_CD_GET_VOID_P, BM_elem_index_get, BMLoopNorEditData::clnors_data, BMVert::co, copy_v3_v3(), l, BMesh::lnor_spacearr, BMLoopNorEditData::loc, BMLoopNorEditData::loop, BMLoopNorEditData::loop_index, MLoopNorSpaceArray::lspacearr, BMLoopNorEditData::niloc, BMLoopNorEditData::nloc, NULL, offset, and v.
Referenced by BM_loop_normal_editdata_array_init().