Blender V4.3
bmesh_mesh_normals.cc File Reference
#include "MEM_guardedalloc.h"
#include "DNA_scene_types.h"
#include "BLI_array.hh"
#include "BLI_bitmap.h"
#include "BLI_linklist_stack.h"
#include "BLI_math_base.hh"
#include "BLI_math_vector.h"
#include "BLI_task.h"
#include "BLI_utildefines.h"
#include "BLI_vector.hh"
#include "BKE_customdata.hh"
#include "BKE_editmesh.hh"
#include "BKE_global.hh"
#include "BKE_mesh.hh"
#include "intern/bmesh_private.hh"

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
 

Functions

Update Vertex & Face Normals (Partial Updates)
static void bm_partial_faces_parallel_range_calc_normals_cb (void *userdata, const int iter, const TaskParallelTLS *__restrict)
 
static void bm_partial_verts_parallel_range_calc_normal_cb (void *userdata, const int iter, const TaskParallelTLS *__restrict)
 
void BM_mesh_normals_update_with_partial_ex (BMesh *, const BMPartialUpdate *bmpinfo, const BMeshNormalsUpdate_Params *params)
 
void BM_mesh_normals_update_with_partial (BMesh *bm, const BMPartialUpdate *bmpinfo)
 
Update Vertex & Face Normals (Custom Coords)
void BM_verts_calc_normal_vcos (BMesh *bm, const Span< float3 > fnos, const Span< float3 > vcos, MutableSpan< float3 > vnos)
 
Tagging Utility Functions
void BM_normals_loops_edges_tag (BMesh *bm, const bool do_edges)
 
static void bm_mesh_edges_sharp_tag (BMesh *bm, const Span< float3 > fnos, float split_angle_cos, const bool do_sharp_edges_tag)
 
void BM_edges_sharp_from_angle_set (BMesh *bm, const float split_angle)
 
Loop Normal Edit Data Array API

Utilities for creating/freeing BMLoopNorEditDataArray.

void BM_lnorspace_err (BMesh *bm)
 
static void bm_loop_normal_mark_indiv_do_loop (BMLoop *l, BLI_bitmap *loops, MLoopNorSpaceArray *lnor_spacearr, int *totloopsel, const bool do_all_loops_of_vert)
 
static int bm_loop_normal_mark_indiv (BMesh *bm, BLI_bitmap *loops, const bool do_all_loops_of_vert)
 
static void loop_normal_editdata_init (BMesh *bm, BMLoopNorEditData *lnor_ed, BMVert *v, BMLoop *l, const int offset)
 
BMLoopNorEditDataArrayBM_loop_normal_editdata_array_init (BMesh *bm, const bool do_all_loops_of_vert)
 
void BM_loop_normal_editdata_array_free (BMLoopNorEditDataArray *lnors_ed_arr)
 
Custom Normals / Vector Layer Conversion
bool BM_custom_loop_normals_to_vector_layer (BMesh *bm)
 
void BM_custom_loop_normals_from_vector_layer (BMesh *bm, bool add_sharp_edges)
 

Update Vertex & Face Normals

#define BM_LNORSPACE_UPDATE   _FLAG_MF
 
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])
 
static void bm_vert_calc_normals_impl (BMVert *v)
 
static void bm_vert_calc_normals_cb (void *, MempoolIterData *mp_v, const TaskParallelTLS *__restrict)
 
static void bm_vert_calc_normals_with_coords (BMVert *v, BMVertsCalcNormalsWithCoordsData *data)
 
static void bm_vert_calc_normals_with_coords_cb (void *userdata, MempoolIterData *mp_v, const TaskParallelTLS *__restrict)
 
static void bm_mesh_verts_calc_normals (BMesh *bm, const Span< float3 > fnos, const Span< float3 > vcos, MutableSpan< float3 > vnos)
 
static void bm_face_calc_normals_cb (void *, MempoolIterData *mp_f, const TaskParallelTLS *__restrict)
 
void BM_mesh_normals_update_ex (BMesh *bm, const BMeshNormalsUpdate_Params *params)
 BMesh Compute Normals.
 
void BM_mesh_normals_update (BMesh *bm)
 

Loop Normals Calculation API

#define LNOR_SPACE_TRIGO_THRESHOLD   (1.0f - 1e-4f)
 
static void bm_edge_tag_from_smooth_and_set_sharp (Span< float3 > fnos, BMEdge *e, const float split_angle_cos)
 
static void bm_edge_tag_from_smooth (Span< float3 > fnos, 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 Span< float3 > vcos, const Span< float3 > fnos, const short(*clnors_data)[2], const int cd_loop_clnors_offset, const bool has_clnors, blender::Vector< blender::float3, 16 > *edge_vectors, BMLoop *l_curr, MutableSpan< float3 > r_lnos, 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 Span< float3 > vcos, const Span< float3 > fnos, MutableSpan< float3 > r_lnos, const short(*clnors_data)[2], const int cd_loop_clnors_offset, const bool do_rebuild, const float split_angle_cos, MLoopNorSpaceArray *r_lnors_spacearr, blender::Vector< blender::float3, 16 > *edge_vectors, BMVert *v)
 
static void bm_mesh_loops_calc_normals_for_vert_without_clnors (BMesh *bm, const Span< float3 > vcos, const Span< float3 > fnos, MutableSpan< float3 > r_lnos, const bool do_rebuild, const float split_angle_cos, MLoopNorSpaceArray *r_lnors_spacearr, blender::Vector< blender::float3, 16 > *edge_vectors, BMVert *v)
 
static void bm_mesh_loops_calc_normals__single_threaded (BMesh *bm, const Span< float3 > vcos, const Span< float3 > fnos, MutableSpan< float3 > r_lnos, 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, 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 Span< float3 > vcos, const Span< float3 > fnos, MutableSpan< float3 > r_lnos, 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 Span< float3 > vcos, const Span< float3 > fnos, MutableSpan< float3 > r_lnos, 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 Span< float3 > vcos, const Span< float3 > fnos, 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 Span< float3 > vnos, const Span< float3 > fnos, MutableSpan< float3 > r_lnos)
 
void BM_loops_calc_normal_vcos (BMesh *bm, const Span< float3 > vcos, const Span< float3 > vnos, const Span< float3 > fnos, const bool use_split_normals, MutableSpan< float3 > r_lnos, MLoopNorSpaceArray *r_lnors_spacearr, short(*clnors_data)[2], const int cd_loop_clnors_offset, const bool do_rebuild)
 

Loop Normal Space API

#define CLEAR_SPACEARRAY_THRESHOLD(x)   ((x) / 2)
 
void BM_lnorspacearr_store (BMesh *bm, MutableSpan< float3 > r_lnors)
 
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)
 

Detailed Description

BM mesh normal calculation functions.

See also
mesh_normals.cc for the equivalent Mesh functionality.

Definition in file bmesh_mesh_normals.cc.

Macro Definition Documentation

◆ BM_LNORSPACE_UPDATE

◆ CLEAR_SPACEARRAY_THRESHOLD

#define CLEAR_SPACEARRAY_THRESHOLD ( x)    ((x) / 2)

Definition at line 1754 of file bmesh_mesh_normals.cc.

Referenced by BM_lnorspace_invalidate().

◆ EDGE_TAG_FROM_SPLIT_ANGLE_BYPASS

◆ LNOR_SPACE_TRIGO_THRESHOLD

#define LNOR_SPACE_TRIGO_THRESHOLD   (1.0f - 1e-4f)

Definition at line 1393 of file bmesh_mesh_normals.cc.

Referenced by bm_mesh_loops_split_lnor_fans().

Function Documentation

◆ BM_custom_loop_normals_from_vector_layer()

◆ BM_custom_loop_normals_to_vector_layer()

◆ bm_edge_is_smooth_no_angle_test()

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:

  • The angle between both its polygons normals is below split_angle value.
  • The edge is tagged as smooth.
  • The faces of the edge are tagged as smooth.
  • The faces of the edge have compatible (non-flipped) topological normal (winding), i.e. both loops on the same edge do not share the same vertex.

Definition at line 789 of file bmesh_mesh_normals.cc.

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

◆ bm_edge_tag_from_smooth()

◆ bm_edge_tag_from_smooth_and_set_sharp()

static void bm_edge_tag_from_smooth_and_set_sharp ( const Span< float3 > fnos,
BMEdge * e,
const float split_angle_cos )
static

A version of bm_edge_tag_from_smooth that sets sharp edges when they would be considered smooth but exceed the split angle .

Note
This doesn't have the same atomic requirement as bm_edge_tag_from_smooth since it isn't run from multiple threads at once.

Definition at line 846 of file bmesh_mesh_normals.cc.

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, blender::Span< T >::is_empty(), l_b, BMFace::no, and BMLoop::radial_next.

Referenced by bm_mesh_edges_sharp_tag().

◆ BM_edges_sharp_from_angle_set()

void BM_edges_sharp_from_angle_set ( BMesh * bm,
float split_angle )

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 413 of file bmesh_mesh_normals.cc.

References bm, bm_mesh_edges_sharp_tag(), cosf, and M_PI.

◆ bm_face_calc_normals_cb()

static void bm_face_calc_normals_cb ( void * ,
MempoolIterData * mp_f,
const TaskParallelTLS * __restrict )
static

Definition at line 234 of file bmesh_mesh_normals.cc.

References BM_face_calc_normal(), and BMFace::no.

Referenced by BM_mesh_normals_update_ex().

◆ BM_lnorspace_err()

void BM_lnorspace_err ( BMesh * bm)

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 1921 of file bmesh_mesh_normals.cc.

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(), BMesh::ldata, BMesh::lnor_spacearr, MLoopNorSpaceArray::lspacearr, MEM_freeN(), MLNOR_SPACEARR_BMLOOP_PTR, 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().

◆ BM_lnorspace_invalidate()

◆ BM_lnorspace_rebuild()

◆ BM_lnorspace_update()

◆ BM_lnorspacearr_store()

◆ BM_loop_check_cyclic_smooth_fan()

bool BM_loop_check_cyclic_smooth_fan ( BMLoop * l_curr)

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 429 of file bmesh_mesh_normals.cc.

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

◆ bm_loop_index_cmp()

static int bm_loop_index_cmp ( const void * a,
const void * b )
static

Definition at line 772 of file bmesh_mesh_normals.cc.

References b, BLI_assert, and BM_elem_index_get.

Referenced by bm_mesh_loops_calc_normals_for_vert_with_clnors().

◆ BM_loop_normal_editdata_array_free()

◆ BM_loop_normal_editdata_array_init()

◆ bm_loop_normal_mark_indiv()

◆ bm_loop_normal_mark_indiv_do_loop()

static void bm_loop_normal_mark_indiv_do_loop ( BMLoop * l,
BLI_bitmap * loops,
MLoopNorSpaceArray * lnor_spacearr,
int * totloopsel,
const bool do_all_loops_of_vert )
static

◆ BM_loops_calc_normal_vcos()

void BM_loops_calc_normal_vcos ( BMesh * bm,
const Span< float3 > vcos,
const Span< float3 > vnos,
const Span< float3 > fnos,
const bool use_split_normals,
MutableSpan< float3 > r_lnos,
MLoopNorSpaceArray * r_lnors_spacearr,
short(*) clnors_data[2],
const int cd_loop_clnors_offset,
const bool do_rebuild )

◆ bm_mesh_edges_sharp_tag()

static void bm_mesh_edges_sharp_tag ( BMesh * bm,
const Span< float3 > fnos,
float split_angle_cos,
const bool do_sharp_edges_tag )
static

◆ bm_mesh_loops_assign_normal_data()

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

◆ bm_mesh_loops_calc_normals()

static void bm_mesh_loops_calc_normals ( BMesh * bm,
const Span< float3 > vcos,
const Span< float3 > fnos,
MutableSpan< float3 > r_lnos,
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

◆ bm_mesh_loops_calc_normals__multi_threaded()

◆ bm_mesh_loops_calc_normals__single_threaded()

static void bm_mesh_loops_calc_normals__single_threaded ( BMesh * bm,
const Span< float3 > vcos,
const Span< float3 > fnos,
MutableSpan< float3 > r_lnos,
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

◆ bm_mesh_loops_calc_normals_for_loop()

static int bm_mesh_loops_calc_normals_for_loop ( BMesh * bm,
const Span< float3 > vcos,
const Span< float3 > fnos,
const short(*) clnors_data[2],
const int cd_loop_clnors_offset,
const bool has_clnors,
blender::Vector< blender::float3, 16 > * edge_vectors,
BMLoop * l_curr,
MutableSpan< float3 > r_lnos,
MLoopNorSpaceArray * r_lnors_spacearr )
static

Called for all faces loops.

  • All loops must have BM_ELEM_TAG cleared.
  • Loop indices must be valid.
Note
When custom normals are present, the order of loops can be important. Loops with lower indices must be passed before loops with higher indices (for each vertex). This is needed since the first loop sets the reference point for the custom normal offsets.
Returns
The number of loops that were handled (for early exit when all have been handled).

Definition at line 473 of file bmesh_mesh_normals.cc.

References blender::Vector< T, InlineBufferCapacity, Allocator >::append(), 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, 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(), blender::Vector< T, InlineBufferCapacity, Allocator >::clear(), BMVert::co, copy_v3_v3(), dot_v3v3(), BMLoop::e, BMesh::elem_index_dirty, BMLoop::f, blender::Span< T >::is_empty(), blender::Vector< T, InlineBufferCapacity, Allocator >::is_empty(), LIKELY, madd_v3_v3fl(), BMLoop::next, BMFace::no, nor, normalize_v3(), BMLoop::prev, blender::math::safe_acos_approx(), 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().

◆ bm_mesh_loops_calc_normals_for_vert_free_fn()

static void bm_mesh_loops_calc_normals_for_vert_free_fn ( const void *__restrict userdata,
void *__restrict chunk )
static

Definition at line 1224 of file bmesh_mesh_normals.cc.

Referenced by bm_mesh_loops_calc_normals__multi_threaded().

◆ bm_mesh_loops_calc_normals_for_vert_init_fn()

static void bm_mesh_loops_calc_normals_for_vert_init_fn ( const void *__restrict userdata,
void *__restrict chunk )
static

◆ bm_mesh_loops_calc_normals_for_vert_reduce_fn()

static void bm_mesh_loops_calc_normals_for_vert_reduce_fn ( const void *__restrict userdata,
void * __restrict,
void *__restrict chunk )
static

◆ bm_mesh_loops_calc_normals_for_vert_with_clnors()

static void bm_mesh_loops_calc_normals_for_vert_with_clnors ( BMesh * bm,
const Span< float3 > vcos,
const Span< float3 > fnos,
MutableSpan< float3 > r_lnos,
const short(*) clnors_data[2],
const int cd_loop_clnors_offset,
const bool do_rebuild,
const float split_angle_cos,
MLoopNorSpaceArray * r_lnors_spacearr,
blender::Vector< blender::float3, 16 > * edge_vectors,
BMVert * v )
static

◆ bm_mesh_loops_calc_normals_for_vert_with_clnors_fn()

static void bm_mesh_loops_calc_normals_for_vert_with_clnors_fn ( void * userdata,
MempoolIterData * mp_v,
const TaskParallelTLS *__restrict tls )
static

◆ bm_mesh_loops_calc_normals_for_vert_without_clnors()

static void bm_mesh_loops_calc_normals_for_vert_without_clnors ( BMesh * bm,
const Span< float3 > vcos,
const Span< float3 > fnos,
MutableSpan< float3 > r_lnos,
const bool do_rebuild,
const float split_angle_cos,
MLoopNorSpaceArray * r_lnors_spacearr,
blender::Vector< blender::float3, 16 > * edge_vectors,
BMVert * v )
static

◆ bm_mesh_loops_calc_normals_for_vert_without_clnors_fn()

static void bm_mesh_loops_calc_normals_for_vert_without_clnors_fn ( void * userdata,
MempoolIterData * mp_v,
const TaskParallelTLS *__restrict tls )
static

◆ bm_mesh_loops_calc_normals_no_autosmooth()

static void bm_mesh_loops_calc_normals_no_autosmooth ( BMesh * bm,
const Span< float3 > vnos,
const Span< float3 > fnos,
MutableSpan< float3 > r_lnos )
static

◆ bm_mesh_loops_custom_normals_set()

static void bm_mesh_loops_custom_normals_set ( BMesh * bm,
const Span< float3 > vcos,
const Span< float3 > fnos,
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

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 1583 of file bmesh_mesh_normals.cc.

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, normalize_v3(), and BMesh::totloop.

Referenced by BM_custom_loop_normals_from_vector_layer().

◆ bm_mesh_loops_split_lnor_fans()

static bool bm_mesh_loops_split_lnor_fans ( BMesh * bm,
MLoopNorSpaceArray * lnors_spacearr,
const float(*) new_lnors[3] )
static

◆ BM_mesh_normals_update()

◆ BM_mesh_normals_update_ex()

◆ BM_mesh_normals_update_with_partial()

void BM_mesh_normals_update_with_partial ( BMesh * bm,
const BMPartialUpdate * bmpinfo )

Definition at line 314 of file bmesh_mesh_normals.cc.

References bm, BM_mesh_normals_update_with_partial_ex(), and params.

◆ BM_mesh_normals_update_with_partial_ex()

◆ bm_mesh_verts_calc_normals()

◆ BM_normals_loops_edges_tag()

◆ bm_partial_faces_parallel_range_calc_normals_cb()

static void bm_partial_faces_parallel_range_calc_normals_cb ( void * userdata,
const int iter,
const TaskParallelTLS * __restrict )
static

Definition at line 271 of file bmesh_mesh_normals.cc.

References BM_face_calc_normal(), and BMFace::no.

Referenced by BM_mesh_normals_update_with_partial_ex().

◆ bm_partial_verts_parallel_range_calc_normal_cb()

static void bm_partial_verts_parallel_range_calc_normal_cb ( void * userdata,
const int iter,
const TaskParallelTLS * __restrict )
static

Definition at line 278 of file bmesh_mesh_normals.cc.

References bm_vert_calc_normals_impl(), and v.

Referenced by BM_mesh_normals_update_with_partial_ex().

◆ bm_vert_calc_normals_accum_loop()

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

◆ bm_vert_calc_normals_cb()

static void bm_vert_calc_normals_cb ( void * ,
MempoolIterData * mp_v,
const TaskParallelTLS * __restrict )
static

Definition at line 149 of file bmesh_mesh_normals.cc.

References bm_vert_calc_normals_impl(), and v.

Referenced by bm_mesh_verts_calc_normals().

◆ bm_vert_calc_normals_impl()

◆ bm_vert_calc_normals_with_coords()

◆ bm_vert_calc_normals_with_coords_cb()

static void bm_vert_calc_normals_with_coords_cb ( void * userdata,
MempoolIterData * mp_v,
const TaskParallelTLS * __restrict )
static

Definition at line 200 of file bmesh_mesh_normals.cc.

References bm_vert_calc_normals_with_coords(), and v.

Referenced by bm_mesh_verts_calc_normals().

◆ BM_verts_calc_normal_vcos()

void BM_verts_calc_normal_vcos ( BMesh * bm,
const Span< float3 > fnos,
const Span< float3 > vcos,
MutableSpan< float3 > vnos )

Definition at line 327 of file bmesh_mesh_normals.cc.

References bm, and bm_mesh_verts_calc_normals().

Referenced by BKE_editmesh_cache_ensure_vert_normals().

◆ loop_normal_editdata_init()