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) {
39 BMEditMesh *em = mesh->runtime->edit_mesh.get();
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();
72 for (
int i = 0; i < mesh->verts_num; i++) {
74 const int orig = *index++;
78 func(user_data, orig, positions[i], no);
82 for (
int i = 0; i < mesh->verts_num; i++) {
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) {
97 BMEditMesh *em = mesh->runtime->edit_mesh.get();
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 *
>(
125 for (
const int i : edges.index_range()) {
127 const int orig = *index++;
131 func(user_data, orig, positions[edges[i][0]], positions[edges[i][1]]);
134 else if (mesh->edges_num == tot_edges) {
135 for (
const int i : edges.index_range()) {
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) {
156 BMEditMesh *em = mesh->runtime->edit_mesh.get();
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) {
236 BMEditMesh *em = mesh->runtime->edit_mesh.get();
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++;
277 const float3 center = bke::mesh::face_center_calc(positions, face_verts);
279 const float3 normal = bke::mesh::face_normal_calc(positions, face_verts);
280 func(user_data, orig, center, normal);
283 func(user_data, orig, center,
nullptr);
288 for (
const int i : faces.index_range()) {
290 const float3 center = bke::mesh::face_center_calc(positions, face_verts);
292 const float3 normal = bke::mesh::face_normal_calc(positions, face_verts);
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)
ATTR_WARN_UNUSED_RESULT BMesh * bm
void BM_mesh_elem_index_ensure(BMesh *bm, const char htype)
constexpr Span slice(int64_t start, int64_t size) const
constexpr bool is_empty() const
draw_view in_light_buf[] float
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)
VecBase< float, 3 > float3
BLI_bitmap * vertex_visit