42 {
BMO_DELIM_UV,
"UV", 0,
"UVs",
"Delimit by UV coordinates"},
43 {0,
nullptr, 0,
nullptr,
nullptr},
47 {
REMESH_VOXEL,
"VOXEL", 0,
"Voxel",
"Use the voxel remesher"},
48 {
REMESH_QUAD,
"QUAD", 0,
"Quad",
"Use the quad remesher"},
49 {0,
nullptr, 0,
nullptr,
nullptr},
54# include <fmt/format.h>
87 return (mesh->runtime->edit_mesh) ? &mesh->runtime->edit_mesh->bm->vdata : &mesh->vert_data;
92 return (mesh->runtime->edit_mesh) ? &mesh->runtime->edit_mesh->bm->ldata : &mesh->corner_data;
98 return rna_mesh_vdata_helper(mesh);
103 return rna_mesh_ldata_helper(mesh);
118static void rna_MeshVertexLayer_name_set(
PointerRNA *
ptr,
const char *value)
127 rna_cd_layer_name_set(rna_mesh_vdata(
ptr), layer, value);
131static void rna_MeshEdgeLayer_name_set(
PointerRNA *
ptr,
const char *value)
140 rna_cd_layer_name_set(rna_mesh_edata(
ptr), layer, value);
144static void rna_MeshLoopLayer_name_set(
PointerRNA *
ptr,
const char *value)
153 rna_cd_layer_name_set(rna_mesh_ldata(
ptr), layer, value);
180static void rna_Mesh_update_data_legacy_deg_tag_all(
Main * ,
208 rna_Mesh_update_data_legacy_deg_tag_all(bmain, scene,
ptr);
215 rna_Mesh_update_data_legacy_deg_tag_all(bmain, scene,
ptr);
240 mesh->
editflag &= ~ME_EDIT_PAINT_VERT_SEL;
241 mesh->editflag &= ~ME_EDIT_PAINT_FACE_SEL;
252 mesh->
editflag &= ~ME_EDIT_PAINT_FACE_SEL;
264 mesh->
editflag &= ~ME_EDIT_PAINT_VERT_SEL;
274 rna_Mesh_update_data_legacy_deg_tag_all(bmain, scene,
ptr);
285 const Mesh *mesh = rna_mesh(
ptr);
287 const int index =
int(position - mesh->vert_positions().data());
296 const Mesh *mesh = rna_mesh(
ptr);
300 const int index =
int(edge - edges);
308 const Mesh *mesh = rna_mesh(
ptr);
309 const int *face_offset =
static_cast<const int *
>(
ptr->
data);
310 const int index =
int(face_offset - mesh->face_offsets().data());
318 const Mesh *mesh = rna_mesh(
ptr);
319 const int *corner_vert =
static_cast<const int *
>(
ptr->
data);
320 const int index =
int(corner_vert - mesh->corner_verts().data());
328 const Mesh *mesh = rna_mesh(
ptr);
330 const int index =
int(tri - mesh->corner_tris().data());
336static int rna_MeshLoopTriangle_polygon_index_get(
PointerRNA *
ptr)
338 const Mesh *mesh = rna_mesh(
ptr);
339 const int index = rna_MeshLoopTriangle_index_get(
ptr);
340 return mesh->corner_tri_faces()[index];
345 const Mesh *mesh = rna_mesh(
ptr);
357 const Mesh *mesh = rna_mesh(
ptr);
363 const Mesh *mesh = rna_mesh(
ptr);
369 r_ptr->
type = &RNA_MeshLoopTriangle;
377 const Mesh *mesh = rna_mesh(
ptr);
379 const_cast<int *
>(mesh->corner_tri_faces().data()),
388 const Mesh *mesh = rna_mesh(
ptr);
394 r_ptr->
type = &RNA_ReadOnlyInteger;
395 r_ptr->
data =
const_cast<int *
>(&mesh->corner_tri_faces()[index]);
399static void rna_MeshVertex_co_get(
PointerRNA *
ptr,
float *value)
404static void rna_MeshVertex_co_set(
PointerRNA *
ptr,
const float *value)
408 mesh->tag_positions_changed();
411static void rna_MeshVertex_normal_get(
PointerRNA *
ptr,
float *value)
415 const int index = rna_MeshVertex_index_get(
ptr);
421 const Mesh *mesh = rna_mesh(
ptr);
422 const bool *hide_vert =
static_cast<const bool *
>(
424 const int index = rna_MeshVertex_index_get(
ptr);
425 return hide_vert ==
nullptr ?
false : hide_vert[index];
428static void rna_MeshVertex_hide_set(
PointerRNA *
ptr,
bool value)
432 &mesh->vert_data,
CD_PROP_BOOL,
".hide_vert", mesh->verts_num));
441 const int index = rna_MeshVertex_index_get(
ptr);
442 hide_vert[index] = value;
447 const Mesh *mesh = rna_mesh(
ptr);
448 const bool *select_vert =
static_cast<const bool *
>(
450 const int index = rna_MeshVertex_index_get(
ptr);
451 return select_vert ==
nullptr ?
false : select_vert[index];
454static void rna_MeshVertex_select_set(
PointerRNA *
ptr,
bool value)
458 &mesh->vert_data,
CD_PROP_BOOL,
".select_vert", mesh->verts_num));
467 const int index = rna_MeshVertex_index_get(
ptr);
468 select_vert[index] = value;
476static void rna_MeshLoop_vertex_index_set(
PointerRNA *
ptr,
int value)
483 const Mesh *mesh = rna_mesh(
ptr);
484 const int index = rna_MeshLoop_index_get(
ptr);
485 return mesh->corner_edges()[index];
488static void rna_MeshLoop_edge_index_set(
PointerRNA *
ptr,
int value)
491 const int index = rna_MeshLoop_index_get(
ptr);
492 mesh->corner_edges_for_write()[index] = value;
495static void rna_MeshLoop_normal_get(
PointerRNA *
ptr,
float *values)
498 const int index = rna_MeshLoop_index_get(
ptr);
499 copy_v3_v3(values, mesh->corner_normals()[index]);
502static void rna_MeshLoop_tangent_get(
PointerRNA *
ptr,
float *values)
505 const int index = rna_MeshLoop_index_get(
ptr);
506 const float(*layer)[4] =
static_cast<const float(*)[4]
>(
513 copy_v3_v3(values, (
const float *)(layer + index));
520 const int index = rna_MeshLoop_index_get(
ptr);
521 const float(*vec)[4] =
static_cast<const float(*)[4]
>(
524 return (vec) ? vec[index][3] : 0.0f;
527static void rna_MeshLoop_bitangent_get(
PointerRNA *
ptr,
float *values)
530 const int index = rna_MeshLoop_index_get(
ptr);
531 const float(*vec)[4] =
static_cast<const float(*)[4]
>(
535 cross_v3_v3v3(values, mesh->corner_normals()[index], vec[index]);
543static void rna_MeshPolygon_normal_get(
PointerRNA *
ptr,
float *values)
547 const int poly_start = *((
const int *)
ptr->
data);
548 const int poly_size = *(((
const int *)
ptr->
data) + 1) - poly_start;
549 const Span<int> face_verts = mesh->corner_verts().
slice(poly_start, poly_size);
550 const float3 result = bke::mesh::face_normal_calc(mesh->vert_positions(), face_verts);
556 const Mesh *mesh = rna_mesh(
ptr);
557 const bool *hide_poly =
static_cast<const bool *
>(
559 const int index = rna_MeshPolygon_index_get(
ptr);
560 return hide_poly ==
nullptr ?
false : hide_poly[index];
563static void rna_MeshPolygon_hide_set(
PointerRNA *
ptr,
bool value)
567 &mesh->face_data,
CD_PROP_BOOL,
".hide_poly", mesh->faces_num));
576 const int index = rna_MeshPolygon_index_get(
ptr);
577 hide_poly[index] = value;
582 const Mesh *mesh = rna_mesh(
ptr);
583 const bool *sharp_faces =
static_cast<const bool *
>(
585 const int index = rna_MeshPolygon_index_get(
ptr);
586 return !(sharp_faces && sharp_faces[index]);
589static void rna_MeshPolygon_use_smooth_set(
PointerRNA *
ptr,
bool value)
593 &mesh->face_data,
CD_PROP_BOOL,
"sharp_face", mesh->faces_num));
602 const int index = rna_MeshPolygon_index_get(
ptr);
603 if (value == sharp_faces[index]) {
604 sharp_faces[index] = !value;
605 mesh->tag_sharpness_changed();
611 const Mesh *mesh = rna_mesh(
ptr);
612 const bool *select_poly =
static_cast<const bool *
>(
614 const int index = rna_MeshPolygon_index_get(
ptr);
615 return select_poly ==
nullptr ?
false : select_poly[index];
618static void rna_MeshPolygon_select_set(
PointerRNA *
ptr,
bool value)
622 &mesh->face_data,
CD_PROP_BOOL,
".select_poly", mesh->faces_num));
631 const int index = rna_MeshPolygon_index_get(
ptr);
632 select_poly[index] = value;
635static int rna_MeshPolygon_material_index_get(
PointerRNA *
ptr)
638 const Mesh *mesh = rna_mesh(
ptr);
640 const VArray material_index = *attributes.lookup_or_default<
int>(
641 "material_index", bke::AttrDomain::Face, 0);
642 return material_index[rna_MeshPolygon_index_get(
ptr)];
645static void rna_MeshPolygon_material_index_set(
PointerRNA *
ptr,
int value)
651 "material_index", bke::AttrDomain::Face);
652 material_index.
varray.set(rna_MeshPolygon_index_get(
ptr),
max_ii(0, value));
656static void rna_MeshPolygon_center_get(
PointerRNA *
ptr,
float *values)
660 const int poly_start = *((
const int *)
ptr->
data);
661 const int poly_size = *(((
const int *)
ptr->
data) + 1) - poly_start;
662 const Span<int> face_verts = mesh->corner_verts().
slice(poly_start, poly_size);
663 const float3 result = bke::mesh::face_center_calc(mesh->vert_positions(), face_verts);
671 const int poly_start = *((
const int *)
ptr->
data);
672 const int poly_size = *(((
const int *)
ptr->
data) + 1) - poly_start;
673 const Span<int> face_verts = mesh->corner_verts().
slice(poly_start, poly_size);
674 return bke::mesh::face_area_calc(mesh->vert_positions(), face_verts);
677static void rna_MeshPolygon_flip(
ID *
id,
MIntProperty *poly_offset_p)
681 const int index =
reinterpret_cast<int *
>(poly_offset_p) - mesh->faces().data().data();
682 bke::mesh_flip_faces(*mesh, IndexMask(
IndexRange(index, 1)));
687static void rna_MeshLoopTriangle_verts_get(
PointerRNA *
ptr,
int *values)
692 values[0] = corner_verts[tri[0]];
693 values[1] = corner_verts[tri[1]];
694 values[2] = corner_verts[tri[2]];
697static void rna_MeshLoopTriangle_normal_get(
PointerRNA *
ptr,
float *values)
703 const int v1 = corner_verts[tri[0]];
704 const int v2 = corner_verts[tri[1]];
705 const int v3 = corner_verts[tri[2]];
710static void rna_MeshLoopTriangle_split_normals_get(
PointerRNA *
ptr,
float *values)
715 copy_v3_v3(values + 0, corner_normals[tri[0]]);
716 copy_v3_v3(values + 3, corner_normals[tri[1]]);
717 copy_v3_v3(values + 6, corner_normals[tri[2]]);
726 const int v1 = corner_verts[tri[0]];
727 const int v2 = corner_verts[tri[1]];
728 const int v3 = corner_verts[tri[2]];
729 return area_tri_v3(positions[v1], positions[
v2], positions[v3]);
732static void rna_MeshLoopColor_color_get(
PointerRNA *
ptr,
float *values)
736 values[0] = mlcol->r / 255.0f;
737 values[1] = mlcol->g / 255.0f;
738 values[2] = mlcol->b / 255.0f;
739 values[3] = mlcol->a / 255.0f;
742static void rna_MeshLoopColor_color_set(
PointerRNA *
ptr,
const float *values)
752static int rna_Mesh_texspace_editable(
const PointerRNA *
ptr,
const char ** )
758static void rna_Mesh_texspace_size_get(
PointerRNA *
ptr,
float values[3])
767static void rna_Mesh_texspace_location_get(
PointerRNA *
ptr,
float values[3])
779 MDeformVert *dverts = mesh->deform_verts_for_write().data();
781 const int index = rna_MeshVertex_index_get(
ptr);
791static void rna_MeshVertex_undeformed_co_get(
PointerRNA *
ptr,
float values[3])
794 const float *position = (
const float *)
ptr->
data;
795 const float(*orco)[3] =
static_cast<const float(*)[3]
>(
799 const int index = rna_MeshVertex_index_get(
ptr);
801 float texspace_location[3], texspace_size[3];
804 mesh->texcomesh ? mesh->texcomesh : mesh, texspace_location, texspace_size);
805 madd_v3_v3v3v3(values, texspace_location, orco[index], texspace_size);
831static void rna_CustomDataLayer_active_set(
863static bool rna_MEdge_freestyle_edge_mark_get(
PointerRNA *
ptr)
865 const Mesh *mesh = rna_mesh(
ptr);
866 const int index = rna_MeshEdge_index_get(
ptr);
873static void rna_MEdge_freestyle_edge_mark_set(
PointerRNA *
ptr,
bool value)
876 const int index = rna_MeshEdge_index_get(
ptr);
888 fed[index].
flag &= ~FREESTYLE_EDGE_MARK;
892static bool rna_MPoly_freestyle_face_mark_get(
PointerRNA *
ptr)
894 const Mesh *mesh = rna_mesh(
ptr);
895 const int index = rna_MeshPolygon_index_get(
ptr);
902static void rna_MPoly_freestyle_face_mark_set(
PointerRNA *
ptr,
bool value)
905 const int index = rna_MeshPolygon_index_get(
ptr);
917 ffa[index].
flag &= ~FREESTYLE_FACE_MARK;
935static std::optional<std::string> rna_MeshUVLoopLayer_path(
const PointerRNA *
ptr)
938 char name_esc[
sizeof(cdl->
name) * 2];
940 return fmt::format(
"uv_layers[\"{}\"]", name_esc);
947 const int length = (mesh->runtime->edit_mesh) ? 0 : mesh->corners_num;
955 return (mesh->runtime->edit_mesh) ? 0 : mesh->corners_num;
958static MBoolProperty *MeshUVLoopLayer_get_bool_layer(
Mesh *mesh,
char const *name)
961 &mesh->corner_data,
CD_PROP_BOOL, name, mesh->corners_num);
962 if (layer ==
nullptr) {
974 const char *(*layername_func)(
const char *uv_name,
char *name))
979 layername_func(layer->name, bool_layer_name);
982 MeshUVLoopLayer_get_bool_layer(mesh, bool_layer_name),
984 (mesh->runtime->edit_mesh) ? 0 : mesh->corners_num,
992 const char *(*layername_func)(
const char *uv_name,
char *name))
996 if (mesh->runtime->edit_mesh || index < 0 || index >= mesh->corners_num) {
1000 layername_func(layer->name, bool_layer_name);
1003 r_ptr->
type = &RNA_BoolAttributeValue;
1004 r_ptr->
data = MeshUVLoopLayer_get_bool_layer(mesh, bool_layer_name) + index;
1015static bool rna_MeshUVLoopLayer_vert_select_lookup_int(
PointerRNA *
ptr,
1029static bool rna_MeshUVLoopLayer_edge_select_lookup_int(
PointerRNA *
ptr,
1055 (mesh->runtime->edit_mesh) ? 0 : mesh->corners_num,
1063 if (mesh->runtime->edit_mesh || index < 0 || index >= mesh->corners_num) {
1069 r_ptr->
type = &RNA_Float2AttributeValue;
1070 r_ptr->
data = (
float *)layer->data + 2 * index;
1074static bool rna_MeshUVLoopLayer_active_render_get(
PointerRNA *
ptr)
1089static void rna_MeshUVLoopLayer_active_render_set(
PointerRNA *
ptr,
bool value)
1094static void rna_MeshUVLoopLayer_active_set(
PointerRNA *
ptr,
bool value)
1099static void rna_MeshUVLoopLayer_clone_set(
PointerRNA *
ptr,
bool value)
1117static void rna_Mesh_vertex_color_active_set(
PointerRNA *
ptr,
1131static int rna_Mesh_vertex_color_active_index_get(
PointerRNA *
ptr)
1144static void rna_Mesh_vertex_color_active_index_set(
PointerRNA *
ptr,
int value)
1150 fprintf(stderr,
"Invalid loop byte attribute index %d\n", value);
1167 (mesh->runtime->edit_mesh) ? 0 : mesh->corners_num,
1172static int rna_MeshLoopColorLayer_data_length(
PointerRNA *
ptr)
1175 return (mesh->runtime->edit_mesh) ? 0 : mesh->corners_num;
1178static bool rna_mesh_color_active_render_get(
PointerRNA *
ptr)
1180 const Mesh *mesh = rna_mesh(
ptr);
1182 return mesh->default_color_attribute &&
STREQ(mesh->default_color_attribute, layer->name);
1187 const Mesh *mesh = rna_mesh(
ptr);
1189 return mesh->active_color_attribute &&
STREQ(mesh->active_color_attribute, layer->name);
1192static void rna_mesh_color_active_render_set(
PointerRNA *
ptr,
bool value)
1194 if (value ==
false) {
1202static void rna_mesh_color_active_set(
PointerRNA *
ptr,
bool value)
1204 if (value ==
false) {
1216static std::optional<std::string> rna_MeshSkinVertexLayer_path(
const PointerRNA *
ptr)
1219 char name_esc[
sizeof(cdl->
name) * 2];
1221 return fmt::format(
"skin_vertices[\"{}\"]", name_esc);
1224static std::optional<std::string> rna_VertCustomData_data_path(
const PointerRNA *
ptr,
1225 const char *collection,
1227static std::optional<std::string> rna_MeshSkinVertex_path(
const PointerRNA *
ptr)
1239 (mesh->runtime->edit_mesh) ? 0 : mesh->verts_num,
1244static int rna_MeshSkinVertexLayer_data_length(
PointerRNA *
ptr)
1247 return (mesh->runtime->edit_mesh) ? 0 : mesh->verts_num;
1253static int rna_MeshPoly_vertices_get_length(
const PointerRNA *
ptr,
1256 const int *poly_offset_p =
static_cast<const int *
>(
ptr->
data);
1257 const int poly_start = *poly_offset_p;
1258 const int poly_size = *(poly_offset_p + 1) - poly_start;
1261 return (length[0] = poly_size);
1264static void rna_MeshPoly_vertices_get(
PointerRNA *
ptr,
int *values)
1266 const Mesh *mesh = rna_mesh(
ptr);
1267 const int *poly_offset_p =
static_cast<const int *
>(
ptr->
data);
1268 const int poly_start = *poly_offset_p;
1269 const int poly_size = *(poly_offset_p + 1) - poly_start;
1270 memcpy(values, &mesh->corner_verts()[poly_start],
sizeof(
int) * poly_size);
1275 const int *data =
static_cast<const int *
>(
ptr->
data);
1276 return *(data + 1) - *data;
1279static void rna_MeshPoly_vertices_set(
PointerRNA *
ptr,
const int *values)
1282 const int *poly_offset_p =
static_cast<const int *
>(
ptr->
data);
1283 const int poly_start = *poly_offset_p;
1284 const int poly_size = *(poly_offset_p + 1) - poly_start;
1285 memcpy(&mesh->corner_verts_for_write()[poly_start], values,
sizeof(
int) * poly_size);
1290static void rna_MeshPoly_material_index_range(
1295 *max =
max_ii(0, mesh->totcol - 1);
1301 const Mesh *mesh = rna_mesh(
ptr);
1302 const bool *hide_edge =
static_cast<const bool *
>(
1304 const int index = rna_MeshEdge_index_get(
ptr);
1305 return hide_edge ==
nullptr ?
false : hide_edge[index];
1308static void rna_MeshEdge_hide_set(
PointerRNA *
ptr,
bool value)
1312 &mesh->edge_data,
CD_PROP_BOOL,
".hide_edge", mesh->edges_num));
1321 const int index = rna_MeshEdge_index_get(
ptr);
1322 hide_edge[index] = value;
1327 const Mesh *mesh = rna_mesh(
ptr);
1328 const bool *select_edge =
static_cast<const bool *
>(
1330 const int index = rna_MeshEdge_index_get(
ptr);
1331 return select_edge ==
nullptr ?
false : select_edge[index];
1334static void rna_MeshEdge_select_set(
PointerRNA *
ptr,
bool value)
1338 &mesh->edge_data,
CD_PROP_BOOL,
".select_edge", mesh->edges_num));
1347 const int index = rna_MeshEdge_index_get(
ptr);
1348 select_edge[index] = value;
1353 const Mesh *mesh = rna_mesh(
ptr);
1354 const bool *sharp_edge =
static_cast<const bool *
>(
1356 const int index = rna_MeshEdge_index_get(
ptr);
1357 return sharp_edge ==
nullptr ?
false : sharp_edge[index];
1360static void rna_MeshEdge_use_edge_sharp_set(
PointerRNA *
ptr,
bool value)
1364 &mesh->edge_data,
CD_PROP_BOOL,
"sharp_edge", mesh->edges_num));
1373 const int index = rna_MeshEdge_index_get(
ptr);
1374 if (value != sharp_edge[index]) {
1375 sharp_edge[index] = value;
1376 mesh->tag_sharpness_changed();
1382 const Mesh *mesh = rna_mesh(
ptr);
1383 const bool *seam_edge =
static_cast<const bool *
>(
1385 const int index = rna_MeshEdge_index_get(
ptr);
1386 return seam_edge ==
nullptr ?
false : seam_edge[index];
1389static void rna_MeshEdge_use_seam_set(
PointerRNA *
ptr,
bool value)
1393 &mesh->edge_data,
CD_PROP_BOOL,
".uv_seam", mesh->edges_num));
1402 const int index = rna_MeshEdge_index_get(
ptr);
1403 seam_edge[index] = value;
1408 const Mesh *mesh = rna_mesh(
ptr);
1409 const int index = rna_MeshEdge_index_get(
ptr);
1414static int rna_MeshLoopTriangle_material_index_get(
PointerRNA *
ptr)
1417 const Mesh *mesh = rna_mesh(
ptr);
1419 const VArray material_indices = *attributes.lookup_or_default<
int>(
1420 "material_index", bke::AttrDomain::Face, 0);
1421 return material_indices[rna_MeshLoopTriangle_polygon_index_get(
ptr)];
1424static bool rna_MeshLoopTriangle_use_smooth_get(
PointerRNA *
ptr)
1426 const Mesh *mesh = rna_mesh(
ptr);
1427 const int face_i = rna_MeshLoopTriangle_polygon_index_get(
ptr);
1428 const bool *sharp_faces =
static_cast<const bool *
>(
1430 return !(sharp_faces && sharp_faces[face_i]);
1435static std::optional<std::string> rna_VertexGroupElement_path(
const PointerRNA *
ptr)
1437 const Mesh *mesh = rna_mesh(
ptr);
1439 const MDeformVert *dvert = mesh->deform_verts().data();
1442 for (a = 0; a < mesh->verts_num; a++, dvert++) {
1444 if (dw == &dvert->
dw[
b]) {
1445 return fmt::format(
"vertices[{}].groups[{}]", a,
b);
1450 return std::nullopt;
1453static std::optional<std::string> rna_MeshPolygon_path(
const PointerRNA *
ptr)
1455 return fmt::format(
"polygons[{}]", rna_MeshPolygon_index_get(
const_cast<PointerRNA *
>(
ptr)));
1458static std::optional<std::string> rna_MeshLoopTriangle_path(
const PointerRNA *
ptr)
1460 const int index = rna_MeshLoopTriangle_index_get(
const_cast<PointerRNA *
>(
ptr));
1461 return fmt::format(
"loop_triangles[{}]", index);
1464static std::optional<std::string> rna_MeshEdge_path(
const PointerRNA *
ptr)
1466 return fmt::format(
"edges[{}]", rna_MeshEdge_index_get(
const_cast<PointerRNA *
>(
ptr)));
1469static std::optional<std::string> rna_MeshLoop_path(
const PointerRNA *
ptr)
1471 return fmt::format(
"loops[{}]", rna_MeshLoop_index_get(
const_cast<PointerRNA *
>(
ptr)));
1474static std::optional<std::string> rna_MeshVertex_path(
const PointerRNA *
ptr)
1476 return fmt::format(
"vertices[{}]", rna_MeshVertex_index_get(
const_cast<PointerRNA *
>(
ptr)));
1479static std::optional<std::string> rna_VertCustomData_data_path(
const PointerRNA *
ptr,
1480 const char *collection,
1484 const Mesh *mesh = rna_mesh(
ptr);
1486 int a,
b, totvert = (mesh->runtime->edit_mesh) ? 0 : mesh->verts_num;
1488 for (cdl = vdata->
layers, a = 0; a < vdata->
totlayer; cdl++, a++) {
1489 if (cdl->
type == type) {
1491 if (
b >= 0 &&
b < totvert) {
1492 char name_esc[
sizeof(cdl->
name) * 2];
1494 return fmt::format(
"{}[\"{}\"].data[{}]", collection, name_esc,
b);
1499 return std::nullopt;
1502static std::optional<std::string> rna_LoopCustomData_data_path(
const PointerRNA *
ptr,
1503 const char *collection,
1507 const Mesh *mesh = rna_mesh(
ptr);
1509 int a,
b, totloop = (mesh->runtime->edit_mesh) ? 0 : mesh->corners_num;
1511 for (cdl = ldata->
layers, a = 0; a < ldata->
totlayer; cdl++, a++) {
1512 if (cdl->
type == type) {
1514 if (
b >= 0 &&
b < totloop) {
1515 char name_esc[
sizeof(cdl->
name) * 2];
1517 return fmt::format(
"{}[\"{}\"].data[{}]", collection, name_esc,
b);
1522 return std::nullopt;
1529 mesh->vert_positions_for_write().data(),
1537 const Mesh *mesh = rna_mesh(
ptr);
1538 return mesh->verts_num;
1543 if (index < 0 || index >= mesh->verts_num) {
1547 r_ptr->
type = &RNA_MeshVertex;
1548 r_ptr->
data = &mesh->vert_positions_for_write()[index];
1562 const Mesh *mesh = rna_mesh(
ptr);
1563 return mesh->edges_num;
1569 if (index < 0 || index >= mesh->edges_num) {
1575 r_ptr->
type = &RNA_MeshEdge;
1576 r_ptr->
data = &edges[index];
1584 iter, mesh->face_offsets_for_write().data(),
sizeof(
int), mesh->faces_num,
false,
nullptr);
1588 const Mesh *mesh = rna_mesh(
ptr);
1589 return mesh->faces_num;
1594 if (index < 0 || index >= mesh->faces_num) {
1598 r_ptr->
type = &RNA_MeshPolygon;
1599 r_ptr->
data = &mesh->face_offsets_for_write()[index];
1607 iter, mesh->corner_verts_for_write().data(),
sizeof(
int), mesh->corners_num,
false,
nullptr);
1611 const Mesh *mesh = rna_mesh(
ptr);
1612 return mesh->corners_num;
1617 if (index < 0 || index >= mesh->corners_num) {
1621 r_ptr->
type = &RNA_MeshLoop;
1622 r_ptr->
data = &mesh->corner_verts_for_write()[index];
1628 return int(rna_mesh(
ptr)->normals_domain());
1633 const Mesh *mesh = rna_mesh(
ptr);
1645 const Mesh *mesh = rna_mesh(
ptr);
1646 return mesh->verts_num;
1651 const Mesh *mesh = rna_mesh(
ptr);
1652 if (index < 0 || index >= mesh->verts_num) {
1657 r_ptr->
type = &RNA_MeshNormalValue;
1664 const Mesh *mesh = rna_mesh(
ptr);
1676 const Mesh *mesh = rna_mesh(
ptr);
1677 return mesh->faces_num;
1682 const Mesh *mesh = rna_mesh(
ptr);
1683 if (index < 0 || index >= mesh->faces_num) {
1688 r_ptr->
type = &RNA_MeshNormalValue;
1695 const Mesh *mesh = rna_mesh(
ptr);
1697 if (normals.is_empty()) {
1698 iter->
valid =
false;
1702 iter, (
void *)normals.data(),
sizeof(
float[3]), mesh->corners_num,
false,
nullptr);
1707 const Mesh *mesh = rna_mesh(
ptr);
1708 return mesh->corners_num;
1713 const Mesh *mesh = rna_mesh(
ptr);
1715 if (index < 0 || index >= mesh->corners_num || normals.is_empty()) {
1720 r_ptr->
type = &RNA_MeshNormalValue;
1721 r_ptr->
data = (
float *)&normals[index];
1725static std::optional<std::string> rna_MeshUVLoop_path(
const PointerRNA *
ptr)
1738 int *r_uv_map_index,
1739 int *r_index_in_attribute)
1741 const Mesh *mesh = rna_mesh(
ptr);
1746 for (
int layer_i = 0; layer_i < uv_layers_num; layer_i++) {
1749 const ptrdiff_t index = uv_coord - layer_data;
1750 if (index >= 0 && index < mesh->corners_num) {
1751 *r_uv_map_index = layer_i;
1752 *r_index_in_attribute = index;
1763 const Mesh *mesh = rna_mesh(
ptr);
1766 const bool *
select =
nullptr;
1767 if (get_uv_index_and_layer(
ptr, &uv_map_index, &loop_index)) {
1773static void rna_MeshUVLoop_select_set(
PointerRNA *
ptr,
const bool value)
1778 if (get_uv_index_and_layer(
ptr, &uv_map_index, &loop_index)) {
1780 select[loop_index] = value;
1786 const Mesh *mesh = rna_mesh(
ptr);
1789 const bool *select_edge =
nullptr;
1790 if (get_uv_index_and_layer(
ptr, &uv_map_index, &loop_index)) {
1793 return select_edge ? select_edge[loop_index] :
false;
1796static void rna_MeshUVLoop_select_edge_set(
PointerRNA *
ptr,
const bool value)
1801 if (get_uv_index_and_layer(
ptr, &uv_map_index, &loop_index)) {
1803 select_edge[loop_index] = value;
1809 const Mesh *mesh = rna_mesh(
ptr);
1812 const bool *pin_uv =
nullptr;
1813 if (get_uv_index_and_layer(
ptr, &uv_map_index, &loop_index)) {
1816 return pin_uv ? pin_uv[loop_index] :
false;
1819static void rna_MeshUVLoop_pin_uv_set(
PointerRNA *
ptr,
const bool value)
1824 if (get_uv_index_and_layer(
ptr, &uv_map_index, &loop_index)) {
1826 pin_uv[loop_index] = value;
1830static void rna_MeshUVLoop_uv_get(
PointerRNA *
ptr,
float *value)
1835static void rna_MeshUVLoop_uv_set(
PointerRNA *
ptr,
const float *value)
1840static std::optional<std::string> rna_MeshLoopColorLayer_path(
const PointerRNA *
ptr)
1843 char name_esc[
sizeof(cdl->
name) * 2];
1845 return fmt::format(
"vertex_colors[\"{}\"]", name_esc);
1848static std::optional<std::string> rna_MeshColor_path(
const PointerRNA *
ptr)
1858 return mesh->runtime->edit_mesh ? mesh->runtime->edit_mesh->bm->totvertsel : 0;
1863 return mesh->runtime->edit_mesh ? mesh->runtime->edit_mesh->bm->totedgesel : 0;
1868 return mesh->runtime->edit_mesh ? mesh->runtime->edit_mesh->bm->totfacesel : 0;
1881 ldata = rna_mesh_ldata_helper(mesh);
1884 if (!mesh->active_color_attribute) {
1887 if (!mesh->default_color_attribute) {
1912 ldata = rna_mesh_ldata_helper(mesh);
1934 return (mesh->runtime->edit_mesh !=
nullptr);
1937static bool rna_Mesh_materials_override_apply(
Main *bmain,
1947 "Unsupported RNA override operation on collections' objects");
1952 if (ptr_item_dst->type ==
nullptr || ptr_item_src->type ==
nullptr) {
1960 if (mat_src == mat_dst) {
1964 bool is_modified =
false;
1965 for (
int i = 0; i < mesh_dst->totcol; i++) {
1966 if (mesh_dst->mat[i] == mat_dst) {
1968 mesh_dst->mat[i] = mat_src;
1998 srna,
"Vertex Group Element",
"Weight value of a vertex in a vertex group");
2049 "rna_MeshVertex_groups_begin",
2050 "rna_iterator_array_next",
2051 "rna_iterator_array_end",
2052 "rna_iterator_array_get",
2059 prop,
"Groups",
"Weights for the vertex groups this vertex is member of");
2070 "Undeformed Location",
2071 "For meshes with modifiers applied, the coordinate of the vertex with no deforming "
2072 "modifiers applied, as used for generated texture coordinates");
2111 prop,
"rna_MeshEdge_use_edge_sharp_get",
"rna_MeshEdge_use_edge_sharp_set");
2122 prop,
"rna_MEdge_freestyle_edge_mark_get",
"rna_MEdge_freestyle_edge_mark_set");
2136 const int splitnor_dim[] = {3, 3};
2167 prop,
"Triangle Normal",
"Local space unit length normal vector for this triangle");
2177 "Local space unit length split normal vectors of the face corners of this triangle");
2212 prop,
"rna_MeshLoop_vertex_index_get",
"rna_MeshLoop_vertex_index_set",
nullptr);
2217 prop,
"rna_MeshLoop_edge_index_get",
"rna_MeshLoop_edge_index_set",
nullptr);
2232 "The normal direction of the face corner, taking into account sharp "
2233 "faces, sharp edges, and custom normal data");
2242 "Local space unit length tangent vector of this vertex for this face "
2243 "(must be computed beforehand using calc_tangents)");
2252 "Sign of the bitangent vector of this vertex for this face (must be computed "
2253 "beforehand using calc_tangents, bitangent = bitangent_sign * cross(normal, tangent))");
2263 "Bitangent vector of this vertex for this face (must be computed beforehand using "
2264 "calc_tangents, use it only if really needed, slower access than bitangent_sign)");
2289 prop,
"rna_MeshPoly_vertices_get",
"rna_MeshPoly_vertices_set",
nullptr);
2304 prop,
"rna_MeshPolygon_material_index_get",
"rna_MeshPolygon_material_index_set",
nullptr);
2323 prop,
"rna_MeshPolygon_use_smooth_get",
"rna_MeshPolygon_use_smooth_set");
2329 prop,
"rna_MPoly_freestyle_face_mark_get",
"rna_MPoly_freestyle_face_mark_set");
2339 prop,
"Polygon Normal",
"Local space unit length normal vector for this face");
2376 "MeshUVLoop (Deprecated)",
2377 "Deprecated, use 'uv', 'vertex_select', 'edge_select' or 'pin' properties instead");
2380 "rna_MeshUVLoopLayer_data_begin",
2381 "rna_iterator_array_next",
2382 "rna_iterator_array_end",
2383 "rna_iterator_array_get",
2384 "rna_MeshUVLoopLayer_data_length",
2398 prop,
"rna_MeshUVLoopLayer_active_get",
"rna_MeshUVLoopLayer_active_set");
2405 prop,
"rna_MeshUVLoopLayer_active_render_get",
"rna_MeshUVLoopLayer_active_render_set");
2412 prop,
"rna_MeshUVLoopLayer_clone_get",
"rna_MeshUVLoopLayer_clone_set");
2421 "rna_MeshUVLoopLayer_uv_begin",
2422 "rna_iterator_array_next",
2423 "rna_iterator_array_end",
2424 "rna_iterator_array_get",
2425 "rna_MeshUVLoopLayer_data_length",
2426 "rna_MeshUVLoopLayer_uv_lookup_int",
2433 prop,
"UV Vertex Selection",
"Selection state of the face corner the UV editor");
2436 "rna_MeshUVLoopLayer_vert_select_begin",
2437 "rna_iterator_array_next",
2438 "rna_iterator_array_end",
2439 "rna_iterator_array_get",
2440 "rna_MeshUVLoopLayer_data_length",
2441 "rna_MeshUVLoopLayer_vert_select_lookup_int",
2448 prop,
"UV Edge Selection",
"Selection state of the edge in the UV editor");
2451 "rna_MeshUVLoopLayer_edge_select_begin",
2452 "rna_iterator_array_next",
2453 "rna_iterator_array_end",
2454 "rna_iterator_array_get",
2455 "rna_MeshUVLoopLayer_data_length",
2456 "rna_MeshUVLoopLayer_edge_select_lookup_int",
2465 "rna_MeshUVLoopLayer_pin_begin",
2466 "rna_iterator_array_next",
2467 "rna_iterator_array_end",
2468 "rna_iterator_array_get",
2469 "rna_MeshUVLoopLayer_data_length",
2470 "rna_MeshUVLoopLayer_pin_lookup_int",
2476 srna,
"Mesh UV Layer",
"(Deprecated) Layer of UV coordinates in a Mesh data-block");
2494 prop,
"rna_MeshUVLoop_select_edge_get",
"rna_MeshUVLoop_select_edge_set");
2505 srna,
"Mesh Vertex Color Layer",
"Layer of vertex colors in a Mesh data-block");
2525 prop,
"rna_mesh_color_active_render_get",
"rna_mesh_color_active_render_set");
2534 "rna_MeshLoopColorLayer_data_begin",
2535 "rna_iterator_array_next",
2536 "rna_iterator_array_end",
2537 "rna_iterator_array_get",
2538 "rna_MeshLoopColorLayer_data_length",
2552 prop,
"rna_MeshLoopColor_color_get",
"rna_MeshLoopColor_color_set",
nullptr);
2566 "Auto Texture Space",
2567 "Adjust active object's texture space automatically when transforming object");
2600 "rna_IDMaterials_assign_int");
2621 func,
"count", 0, 0, INT_MAX,
"Count",
"Number of vertices to add", 0, INT_MAX);
2626 RNA_def_int(func,
"count", 0, 0, INT_MAX,
"Count",
"Number of vertices to remove", 0, INT_MAX);
2646 parm =
RNA_def_int(func,
"count", 0, 0, INT_MAX,
"Count",
"Number of edges to add", 0, INT_MAX);
2651 RNA_def_int(func,
"count", 0, 0, INT_MAX,
"Count",
"Number of edges to remove", 0, INT_MAX);
2664 srna,
"Mesh Loop Triangles",
"Tessellation of mesh polygons into triangles");
2684 parm =
RNA_def_int(func,
"count", 0, 0, INT_MAX,
"Count",
"Number of loops to add", 0, INT_MAX);
2710 func,
"count", 0, 0, INT_MAX,
"Count",
"Number of polygons to add", 0, INT_MAX);
2749 "Whether new layer's data should be initialized by copying current active one");
2750 parm =
RNA_def_pointer(func,
"layer",
"MeshLoopColorLayer",
"",
"The newly created layer");
2757 parm =
RNA_def_pointer(func,
"layer",
"MeshLoopColorLayer",
"",
"The layer to remove");
2764 "rna_Mesh_vertex_color_active_get",
2765 "rna_Mesh_vertex_color_active_set",
2774 "rna_Mesh_vertex_color_active_index_get",
2775 "rna_Mesh_vertex_color_active_index_set",
2776 "rna_Mesh_vertex_color_index_range");
2802 "Whether new layer's data should be initialized by copying current active one, "
2803 "or if none is active, with a default UVmap");
2804 parm =
RNA_def_pointer(func,
"layer",
"MeshUVLoopLayer",
"",
"The newly created layer");
2811 parm =
RNA_def_pointer(func,
"layer",
"MeshUVLoopLayer",
"",
"The layer to remove");
2817 prop,
"rna_Mesh_uv_layer_active_get",
"rna_Mesh_uv_layer_active_set",
nullptr,
nullptr);
2824 "rna_Mesh_uv_layer_active_index_get",
2825 "rna_Mesh_uv_layer_active_index_set",
2826 "rna_Mesh_uv_layer_index_range");
2838 srna,
"Mesh Skin Vertex Layer",
"Per-vertex skin data for use with the Skin modifier");
2854 "rna_MeshSkinVertexLayer_data_begin",
2855 "rna_iterator_array_next",
2856 "rna_iterator_array_end",
2857 "rna_iterator_array_get",
2858 "rna_MeshSkinVertexLayer_data_length",
2867 srna,
"Skin Vertex",
"Per-vertex skin data for use with the Skin modifier");
2882 "Vertex is a root for rotation calculations and armature generation, "
2883 "setting this flag does not clear other roots in the same mesh island");
2889 prop,
"Loose",
"If vertex has multiple adjacent edges, it is hulled to them directly");
2916 "rna_Mesh_vertices_begin",
2917 "rna_iterator_array_next",
2918 "rna_iterator_array_end",
2919 "rna_iterator_array_get",
2920 "rna_Mesh_vertices_length",
2921 "rna_Mesh_vertices_lookup_int",
2931 "rna_Mesh_edges_begin",
2932 "rna_iterator_array_next",
2933 "rna_iterator_array_end",
2934 "rna_iterator_array_get",
2935 "rna_Mesh_edges_length",
2936 "rna_Mesh_edges_lookup_int",
2946 "rna_Mesh_loops_begin",
2947 "rna_iterator_array_next",
2948 "rna_iterator_array_end",
2949 "rna_iterator_array_get",
2950 "rna_Mesh_loops_length",
2951 "rna_Mesh_loops_lookup_int",
2961 "rna_Mesh_polygons_begin",
2962 "rna_iterator_array_next",
2963 "rna_iterator_array_end",
2964 "rna_iterator_array_get",
2965 "rna_Mesh_polygons_length",
2966 "rna_Mesh_polygons_lookup_int",
2980 {0,
nullptr, 0,
nullptr,
nullptr},
2988 "The attribute domain that gives enough information to represent the mesh's normals");
2997 "The normal direction of each vertex, defined as the average of the "
2998 "surrounding face normals");
3000 "rna_Mesh_vertex_normals_begin",
3001 "rna_iterator_array_next",
3002 "rna_iterator_array_end",
3003 "rna_iterator_array_get",
3004 "rna_Mesh_vertex_normals_length",
3005 "rna_Mesh_vertex_normals_lookup_int",
3014 "The normal direction of each face, defined by the winding order "
3015 "and position of its vertices");
3017 "rna_Mesh_poly_normals_begin",
3018 "rna_iterator_array_next",
3019 "rna_iterator_array_end",
3020 "rna_iterator_array_get",
3021 "rna_Mesh_poly_normals_length",
3022 "rna_Mesh_poly_normals_lookup_int",
3032 "The \"slit\" normal direction of each face corner, influenced by vertex normals, "
3033 "sharp faces, sharp edges, and custom normals. May be empty.");
3035 "rna_Mesh_corner_normals_begin",
3036 "rna_iterator_array_next",
3037 "rna_iterator_array_end",
3038 "rna_iterator_array_get",
3039 "rna_Mesh_corner_normals_length",
3040 "rna_Mesh_corner_normals_lookup_int",
3046 "rna_Mesh_loop_triangles_begin",
3047 "rna_iterator_array_next",
3048 "rna_iterator_array_end",
3049 "rna_iterator_array_get",
3050 "rna_Mesh_loop_triangles_length",
3051 "rna_Mesh_loop_triangles_lookup_int",
3063 "rna_Mesh_loop_triangle_polygons_begin",
3064 "rna_iterator_array_next",
3065 "rna_iterator_array_end",
3066 "rna_iterator_array_get",
3067 "rna_Mesh_loop_triangles_length",
3068 "rna_Mesh_loop_triangle_polygons_lookup_int",
3084 "Use another mesh for texture indices (vertex indices must be aligned)");
3090 "rna_Mesh_uv_layers_begin",
3094 "rna_Mesh_uv_layers_length",
3106 prop,
"rna_Mesh_uv_layer_clone_get",
"rna_Mesh_uv_layer_clone_set",
nullptr,
nullptr);
3110 prop,
"Clone UV Loop Layer",
"UV loop layer to be used as cloning source");
3114 "rna_Mesh_uv_layer_clone_index_get",
3115 "rna_Mesh_uv_layer_clone_index_set",
3116 "rna_Mesh_uv_layer_index_range");
3122 prop,
"rna_Mesh_uv_layer_stencil_get",
"rna_Mesh_uv_layer_stencil_set",
nullptr,
nullptr);
3129 "rna_Mesh_uv_layer_stencil_index_get",
3130 "rna_Mesh_uv_layer_stencil_index_set",
3131 "rna_Mesh_uv_layer_index_range");
3140 "rna_Mesh_vertex_colors_begin",
3144 "rna_Mesh_vertex_colors_length",
3153 "Legacy vertex color layers. Deprecated, use color attributes instead.");
3160 "rna_Mesh_skin_vertices_begin",
3164 "rna_Mesh_skin_vertices_length",
3184 "Size of the voxel in object space used for volume evaluation. Lower "
3185 "values preserve finer details.");
3196 "Reduces the final face count by simplifying geometry where detail is not needed, "
3197 "generating triangles. A value greater than 0 disables Fix Poles.");
3212 "Projects the mesh to preserve the volume and details of the original mesh");
3250 "Mirror Vertex Groups",
3251 "Mirror the left/right vertex groups when painting. The symmetry axis "
3252 "is determined by the symmetry settings.");
3261 prop,
"Has Custom Normals",
"True if there are custom split normals data in this mesh");
3270 prop,
"Texture Space Mesh",
"Derive texture coordinates from another mesh");
3283 "Auto Texture Space",
3284 "Adjust active object's texture space automatically when transforming object");
3293 prop,
"rna_Mesh_texspace_location_get",
"rna_Mesh_texspace_location_set",
nullptr);
3302 "Use topology based mirroring "
3303 "(for when both sides of mesh have matching, unique topology)");
struct CustomDataLayer * BKE_attribute_search_for_write(AttributeOwner &owner, const char *name, eCustomDataMask type, AttrDomainMask domain_mask)
void BKE_id_attributes_default_color_set(struct ID *id, const char *name)
void BKE_id_attributes_active_color_set(struct ID *id, const char *name)
@ ATTR_DOMAIN_MASK_CORNER
struct CustomDataLayer * BKE_attribute_find(const AttributeOwner &owner, const char *name, eCustomDataType type, blender::bke::AttrDomain domain)
bool BKE_attribute_rename(AttributeOwner &owner, const char *old_name, const char *new_name, struct ReportList *reports)
bool BKE_attribute_remove(AttributeOwner &owner, const char *name, struct ReportList *reports)
const char * BKE_uv_map_pin_name_get(const char *uv_map_name, char *buffer)
const char * BKE_uv_map_vert_select_name_get(const char *uv_map_name, char *buffer)
const char * BKE_uv_map_edge_select_name_get(const char *uv_map_name, char *buffer)
const struct CustomDataLayer * BKE_attribute_search(const AttributeOwner &owner, const char *name, eCustomDataMask type, AttrDomainMask domain_mask)
CustomData interface, see also DNA_customdata_types.h.
int CustomData_sizeof(eCustomDataType type)
void * CustomData_get_layer_named_for_write(CustomData *data, eCustomDataType type, blender::StringRef name, int totelem)
int CustomData_get_layer_index_n(const CustomData *data, eCustomDataType type, int n)
const void * CustomData_get_layer_n(const CustomData *data, eCustomDataType type, int n)
const void * CustomData_get_layer(const CustomData *data, eCustomDataType type)
const void * CustomData_get_layer_named(const CustomData *data, eCustomDataType type, blender::StringRef name)
void * CustomData_add_layer_named(CustomData *data, eCustomDataType type, eCDAllocType alloctype, int totelem, blender::StringRef name)
void CustomData_set_layer_render(CustomData *data, eCustomDataType type, int n)
int CustomData_get_layer_index(const CustomData *data, eCustomDataType type)
void CustomData_set_layer_clone_index(CustomData *data, eCustomDataType type, int n)
void * CustomData_get_layer_for_write(CustomData *data, eCustomDataType type, int totelem)
void CustomData_set_layer_unique_name(CustomData *data, int index)
void CustomData_ensure_data_is_mutable(CustomDataLayer *layer, int totelem)
void * CustomData_add_layer(CustomData *data, eCustomDataType type, eCDAllocType alloctype, int totelem)
int CustomData_get_active_layer_index(const CustomData *data, eCustomDataType type)
int CustomData_number_of_layers(const CustomData *data, eCustomDataType type)
#define CD_TYPE_AS_MASK(_type)
int CustomData_get_render_layer_index(const CustomData *data, eCustomDataType type)
void CustomData_set_layer_active(CustomData *data, eCustomDataType type, int n)
int CustomData_get_clone_layer_index(const CustomData *data, eCustomDataType type)
void BKE_mesh_batch_cache_dirty_tag(Mesh *mesh, eMeshBatchDirtyMode mode)
void BKE_mesh_tessface_clear(Mesh *mesh)
bool BKE_mesh_has_custom_loop_normals(Mesh *mesh)
void BKE_mesh_texspace_ensure(Mesh *mesh)
void BKE_mesh_texspace_get(Mesh *mesh, float r_texspace_location[3], float r_texspace_size[3])
@ BKE_MESH_BATCH_DIRTY_ALL
void BKE_mesh_runtime_clear_geometry(Mesh *mesh)
int BKE_mesh_runtime_corner_tris_len(const Mesh *mesh)
void BKE_reportf(ReportList *reports, eReportType type, const char *format,...) ATTR_PRINTF_FORMAT(3
#define BLI_assert_msg(a, msg)
MINLINE int max_ii(int a, int b)
MINLINE unsigned char round_fl_to_uchar_clamp(float a)
float area_tri_v3(const float v1[3], const float v2[3], const float v3[3])
float normal_tri_v3(float n[3], const float v1[3], const float v2[3], const float v3[3])
MINLINE void madd_v3_v3v3v3(float r[3], const float a[3], const float b[3], const float c[3])
MINLINE void copy_v2_v2(float r[2], const float a[2])
MINLINE void mul_v3_fl(float r[3], float f)
MINLINE void copy_v3_v3(float r[3], const float a[3])
MINLINE void cross_v3_v3v3(float r[3], const float a[3], const float b[3])
MINLINE void zero_v3(float r[3])
char * BLI_strdup(const char *str) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1) ATTR_MALLOC
size_t BLI_str_escape(char *__restrict dst, const char *__restrict src, size_t dst_maxncpy) ATTR_NONNULL(1
#define STRNCPY_UTF8(dst, src)
#define UNUSED_VARS_NDEBUG(...)
void DEG_id_tag_update(ID *id, unsigned int flags)
#define MAX_CUSTOMDATA_LAYER_NAME
#define CD_MASK_PROP_BYTE_COLOR
#define MAX_CUSTOMDATA_LAYER_NAME_NO_PREFIX
@ ME_REMESH_REPROJECT_ATTRIBUTES
@ ME_REMESH_REPROJECT_VOLUME
@ ME_EDIT_MIRROR_VERTEX_GROUPS
Object is a sort of wrapper for general info.
bool * ED_mesh_uv_map_edge_select_layer_ensure(Mesh *mesh, int uv_index)
int ED_mesh_uv_add(Mesh *mesh, const char *name, bool active_set, bool do_init, ReportList *reports)
int ED_mesh_color_add(Mesh *mesh, const char *name, bool active_set, bool do_init, ReportList *reports)
const bool * ED_mesh_uv_map_vert_select_layer_get(const Mesh *mesh, int uv_index)
bool * ED_mesh_uv_map_vert_select_layer_ensure(Mesh *mesh, int uv_index)
const bool * ED_mesh_uv_map_pin_layer_get(const Mesh *mesh, int uv_index)
bool * ED_mesh_uv_map_pin_layer_ensure(Mesh *mesh, int uv_index)
const bool * ED_mesh_uv_map_edge_select_layer_get(const Mesh *mesh, int uv_index)
Read Guarded memory(de)allocation.
#define RNA_MAX_ARRAY_DIMENSION
@ PROPOVERRIDE_OVERRIDABLE_LIBRARY
ATTR_WARN_UNUSED_RESULT const BMVert * v2
static AttributeOwner from_id(ID *id)
constexpr Span slice(int64_t start, int64_t size) const
constexpr const T * data() const
constexpr int64_t size() const
local_group_size(16, 16) .push_constant(Type b
draw_view in_light_buf[] float
draw_view push_constant(Type::INT, "radiance_src") .push_constant(Type capture_info_buf storage_buf(1, Qualifier::READ, "ObjectBounds", "bounds_buf[]") .push_constant(Type draw_view int
ccl_device_inline float4 select(const int4 mask, const float4 a, const float4 b)
void rna_iterator_array_begin(CollectionPropertyIterator *iter, void *ptr, int itemsize, int length, bool free_ptr, IteratorSkipFunc skip)
void RNA_property_update_main(Main *bmain, Scene *scene, PointerRNA *ptr, PropertyRNA *prop)
PointerRNA rna_pointer_inherit_refine(const PointerRNA *ptr, StructRNA *type, void *data)
PointerRNA RNA_pointer_create(ID *id, StructRNA *type, void *data)
void rna_def_animdata_common(StructRNA *srna)
void rna_def_attributes_common(StructRNA *srna, const AttributeOwnerType type)
void RNA_def_struct_name_property(StructRNA *srna, PropertyRNA *prop)
PropertyRNA * RNA_def_string(StructOrFunctionRNA *cont_, const char *identifier, const char *default_value, const int maxlen, const char *ui_name, const char *ui_description)
void RNA_def_property_pointer_sdna(PropertyRNA *prop, const char *structname, const char *propname)
void RNA_def_struct_path_func(StructRNA *srna, const char *path)
void RNA_def_property_boolean_sdna(PropertyRNA *prop, const char *structname, const char *propname, int64_t bit)
void RNA_def_property_string_funcs(PropertyRNA *prop, const char *get, const char *length, const char *set)
void RNA_def_function_return(FunctionRNA *func, PropertyRNA *ret)
void RNA_def_property_float_funcs(PropertyRNA *prop, const char *get, const char *set, const char *range)
void RNA_define_verify_sdna(bool verify)
void RNA_def_property_ui_text(PropertyRNA *prop, const char *name, const char *description)
void RNA_def_property_ui_icon(PropertyRNA *prop, int icon, int consecutive)
void RNA_def_property_srna(PropertyRNA *prop, const char *type)
void RNA_def_property_collection_funcs(PropertyRNA *prop, const char *begin, const char *next, const char *end, const char *get, const char *length, const char *lookupint, const char *lookupstring, const char *assignint)
void RNA_def_struct_ui_text(StructRNA *srna, const char *name, const char *description)
void RNA_def_property_boolean_funcs(PropertyRNA *prop, const char *get, const char *set)
void RNA_def_property_dynamic_array_funcs(PropertyRNA *prop, const char *getlength)
void RNA_def_property_multi_array(PropertyRNA *prop, int dimension, const int length[])
void RNA_def_property_enum_items(PropertyRNA *prop, const EnumPropertyItem *item)
void RNA_def_struct_sdna(StructRNA *srna, const char *structname)
FunctionRNA * RNA_def_function(StructRNA *srna, const char *identifier, const char *call)
void RNA_def_property_array(PropertyRNA *prop, int length)
void RNA_def_property_range(PropertyRNA *prop, double min, double max)
PropertyRNA * RNA_def_pointer(StructOrFunctionRNA *cont_, const char *identifier, const char *type, const char *ui_name, const char *ui_description)
void RNA_def_property_string_maxlength(PropertyRNA *prop, int maxlength)
void RNA_def_property_struct_type(PropertyRNA *prop, const char *type)
void RNA_def_property_collection_sdna(PropertyRNA *prop, const char *structname, const char *propname, const char *lengthpropname)
void RNA_def_function_ui_description(FunctionRNA *func, const char *description)
void RNA_def_property_update(PropertyRNA *prop, int noteflag, const char *func)
PropertyRNA * RNA_def_property(StructOrFunctionRNA *cont_, const char *identifier, int type, int subtype)
void RNA_def_property_enum_funcs(PropertyRNA *prop, const char *get, const char *set, const char *item)
void RNA_def_property_editable_func(PropertyRNA *prop, const char *editable)
StructRNA * RNA_def_struct(BlenderRNA *brna, const char *identifier, const char *from)
void RNA_def_function_flag(FunctionRNA *func, int flag)
void RNA_def_property_clear_flag(PropertyRNA *prop, PropertyFlag flag)
void RNA_def_property_pointer_funcs(PropertyRNA *prop, const char *get, const char *set, const char *type_fn, const char *poll)
void RNA_def_property_enum_sdna(PropertyRNA *prop, const char *structname, const char *propname)
void RNA_def_property_int_funcs(PropertyRNA *prop, const char *get, const char *set, const char *range)
void RNA_def_struct_ui_icon(StructRNA *srna, int icon)
PropertyRNA * RNA_def_boolean(StructOrFunctionRNA *cont_, const char *identifier, const bool default_value, const char *ui_name, const char *ui_description)
void RNA_def_property_override_funcs(PropertyRNA *prop, const char *diff, const char *store, const char *apply)
void RNA_def_property_flag(PropertyRNA *prop, PropertyFlag flag)
void RNA_def_property_float_sdna(PropertyRNA *prop, const char *structname, const char *propname)
void RNA_def_property_ui_range(PropertyRNA *prop, double min, double max, double step, int precision)
void RNA_def_property_int_sdna(PropertyRNA *prop, const char *structname, const char *propname)
PropertyRNA * RNA_def_int(StructOrFunctionRNA *cont_, const char *identifier, const int default_value, const int hardmin, const int hardmax, const char *ui_name, const char *ui_description, const int softmin, const int softmax)
void RNA_def_property_boolean_negative_sdna(PropertyRNA *prop, const char *structname, const char *propname, int64_t booleanbit)
void RNA_def_property_override_flag(PropertyRNA *prop, PropertyOverrideFlag flag)
void RNA_def_parameter_flags(PropertyRNA *prop, PropertyFlag flag_property, ParameterFlag flag_parameter)
void RNA_api_mesh(StructRNA *srna)
void rna_Mesh_update_draw(Main *bmain, Scene *scene, PointerRNA *ptr)
void rna_def_texmat_common(StructRNA *srna, const char *texspace_editable)
static void rna_def_mesh_edges(BlenderRNA *brna, PropertyRNA *cprop)
static void rna_def_mvert(BlenderRNA *brna)
static void rna_def_mloopuv(BlenderRNA *brna)
static void rna_def_mlooptri(BlenderRNA *brna)
static void rna_def_uv_layers(BlenderRNA *brna, PropertyRNA *cprop)
static void rna_def_normal_layer_value(BlenderRNA *brna)
static void rna_def_mpolygon(BlenderRNA *brna)
static void rna_def_mesh_looptris(BlenderRNA *brna, PropertyRNA *cprop)
static void rna_def_mesh_vertices(BlenderRNA *brna, PropertyRNA *cprop)
static void rna_def_mesh_polygons(BlenderRNA *brna, PropertyRNA *cprop)
static void rna_def_skin_vertices(BlenderRNA *brna, PropertyRNA *)
static void rna_def_mloopcol(BlenderRNA *brna)
void RNA_def_mesh(BlenderRNA *brna)
static void rna_def_loop_colors(BlenderRNA *brna, PropertyRNA *cprop)
static void rna_def_looptri_poly_value(BlenderRNA *brna)
const EnumPropertyItem rna_enum_mesh_delimit_mode_items[]
static void rna_def_mesh(BlenderRNA *brna)
static void rna_def_mvert_group(BlenderRNA *brna)
static const EnumPropertyItem rna_enum_mesh_remesh_mode_items[]
static void rna_def_medge(BlenderRNA *brna)
static void rna_def_mloop(BlenderRNA *brna)
static void rna_def_mesh_loops(BlenderRNA *brna, PropertyRNA *cprop)
#define DEFINE_CUSTOMDATA_LAYER_COLLECTION(collection_name, customdata_type, layer_type)
#define DEFINE_CUSTOMDATA_LAYER_COLLECTION_ACTIVEITEM(collection_name, customdata_type, layer_type, active_type, layer_rna_type)
IDOverrideLibraryPropertyOperation * liboverride_operation
VMutableArray< T > varray
blender::BitVector is_loose_bits
void WM_main_add_notifier(uint type, void *reference)