34 void (*func)(
void *user_data,
int index,
const float co[3],
const float no[3]),
38 if (mesh->
runtime->edit_mesh !=
nullptr && mesh->
runtime->edit_data !=
nullptr) {
44 if (!mesh->
runtime->edit_data->vert_positions.is_empty()) {
52 func(user_data,
i, positions[
i], no);
58 func(user_data,
i, eve->
co, no);
64 const int *index =
static_cast<const int *
>(
68 vert_normals = mesh->vert_normals();
74 const int orig = *index++;
78 func(user_data, orig, positions[
i], no);
84 func(user_data,
i, positions[
i], no);
93 void (*func)(
void *user_data,
int index,
const float v0co[3],
const float v1co[3]),
96 if (mesh->
runtime->edit_mesh !=
nullptr && mesh->
runtime->edit_data) {
102 if (!mesh->
runtime->edit_data->vert_positions.is_empty()) {
114 func(user_data,
i, eed->
v1->
co, eed->
v2->
co);
121 const int *index =
static_cast<const int *
>(
127 const int orig = *index++;
131 func(user_data, orig, positions[edges[
i][0]], positions[edges[
i][1]]);
136 func(user_data,
i, positions[edges[
i][0]], positions[edges[
i][1]]);
143 void (*func)(
void *user_data,
155 if (mesh->
runtime->edit_mesh !=
nullptr && mesh->
runtime->edit_data) {
166 corner_normals = mesh->corner_normals();
185 }
while ((l_iter = l_iter->
next) != l_first);
191 corner_normals = mesh->corner_normals();
197 const int *v_index =
static_cast<const int *
>(
199 const int *f_index =
static_cast<const int *
>(
202 if (v_index || f_index) {
203 for (
const int face_i :
faces.index_range()) {
204 for (
const int corner :
faces[face_i]) {
205 const int vert = corner_verts[corner];
206 const int v_idx = v_index ? v_index[vert] : vert;
207 const int f_idx = f_index ? f_index[face_i] : face_i;
208 const float *no = corner_normals.
is_empty() ?
nullptr : &corner_normals[corner].x;
212 func(user_data, v_idx, f_idx, positions[vert], no);
217 for (
const int face_i :
faces.index_range()) {
218 for (
const int corner :
faces[face_i]) {
219 const int vert = corner_verts[corner];
220 const float *no = corner_normals.
is_empty() ?
nullptr : &corner_normals[corner].x;
221 func(user_data, vert, face_i, positions[vert], no);
230 void (*func)(
void *user_data,
int index,
const float cent[3],
const float no[3]),
235 if (mesh->
runtime->edit_mesh !=
nullptr && mesh->
runtime->edit_data !=
nullptr) {
243 *em, *mesh->
runtime->edit_data);
252 const float *no = face_normals[
i];
253 func(user_data,
i, face_centers[
i], no);
259 func(user_data,
i, face_centers[
i], no);
267 const int *index =
static_cast<const int *
>(
271 for (
const int i :
faces.index_range()) {
272 const int orig = *index++;
280 func(user_data, orig, center, normal);
283 func(user_data, orig, center,
nullptr);
288 for (
const int i :
faces.index_range()) {
293 func(user_data,
i, center, normal);
296 func(user_data,
i, center,
nullptr);
305 void (*func)(
void *user_data,
int index,
const float cent[3],
const float no[3]),
314 vert_normals = mesh->vert_normals();
316 const int *index =
static_cast<const int *
>(
321 for (
const int i :
faces.index_range()) {
322 const int orig = *index++;
326 for (
const int vert : corner_verts.
slice(
faces[
i])) {
327 if (facedot_tags[vert]) {
337 for (
const int i :
faces.index_range()) {
338 for (
const int vert : corner_verts.
slice(
faces[
i])) {
339 if (facedot_tags[vert]) {
378 memset(r_cos, 0,
sizeof(*r_cos) * totcos);
CustomData interface, see also DNA_customdata_types.h.
const void * CustomData_get_layer(const CustomData *data, eCustomDataType type)
blender::Span< blender::float3 > BKE_editmesh_cache_ensure_face_centers(BMEditMesh &em, blender::bke::EditMeshData &emd)
blender::Span< blender::float3 > BKE_editmesh_cache_ensure_vert_normals(BMEditMesh &em, blender::bke::EditMeshData &emd)
blender::Span< blender::float3 > BKE_editmesh_cache_ensure_face_normals(BMEditMesh &em, blender::bke::EditMeshData &emd)
@ MESH_FOREACH_USE_NORMAL
#define BLI_BITMAP_NEW(_num, _alloc_string)
#define BLI_BITMAP_TEST(_bitmap, _index)
#define BLI_BITMAP_ENABLE(_bitmap, _index)
MINLINE void copy_v3_v3(float r[3], const float a[3])
Read Guarded memory(de)allocation.
#define BM_FACE_FIRST_LOOP(p)
#define BM_elem_index_get(ele)
#define BM_ITER_MESH_INDEX(ele, iter, bm, itype, indexvar)
void BM_mesh_elem_index_ensure(BMesh *bm, const char htype)
constexpr bool is_empty() const
constexpr Span slice(int64_t start, int64_t size) const
constexpr IndexRange index_range() const
constexpr bool is_empty() const
void MEM_freeN(void *vmemh)
void BKE_mesh_foreach_mapped_loop(Mesh *mesh, void(*func)(void *user_data, int vertex_index, int face_index, const float co[3], const float no[3]), void *user_data, MeshForeachFlag flag)
void BKE_mesh_foreach_mapped_face_center(Mesh *mesh, void(*func)(void *user_data, int index, const float cent[3], const float no[3]), void *user_data, MeshForeachFlag flag)
void BKE_mesh_foreach_mapped_vert_coords_get(const Mesh *mesh_eval, float(*r_cos)[3], const int totcos)
void BKE_mesh_foreach_mapped_subdiv_face_center(Mesh *mesh, void(*func)(void *user_data, int index, const float cent[3], const float no[3]), void *user_data, MeshForeachFlag flag)
static void get_vertexcos__mapFunc(void *user_data, int index, const float co[3], const float[3])
void BKE_mesh_foreach_mapped_edge(Mesh *mesh, const int tot_edges, void(*func)(void *user_data, int index, const float v0co[3], const float v1co[3]), void *user_data)
void BKE_mesh_foreach_mapped_vert(const Mesh *mesh, void(*func)(void *user_data, int index, const float co[3], const float no[3]), void *user_data, MeshForeachFlag flag)
float3 face_normal_calc(Span< float3 > vert_positions, Span< int > face_verts)
float3 face_center_calc(Span< float3 > vert_positions, Span< int > face_verts)
VecBase< float, 3 > float3
BLI_bitmap * vertex_visit
MeshRuntimeHandle * runtime