Blender V5.0
rna_mesh.cc
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2023 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
8
9#include <cstdlib>
10
11#include "DNA_mesh_types.h"
12#include "DNA_meshdata_types.h"
13
14#include "BKE_attribute.h"
15#include "BKE_editmesh.hh"
16#include "BKE_mesh_types.hh"
17
18#include "RNA_define.hh"
19#include "RNA_enum_types.hh"
20#include "RNA_types.hh"
21
22#include "rna_internal.hh"
23
24#include "WM_types.hh"
25
27 {BMO_DELIM_NORMAL, "NORMAL", 0, "Normal", "Delimit by face directions"},
28 {BMO_DELIM_MATERIAL, "MATERIAL", 0, "Material", "Delimit by face material"},
29 {BMO_DELIM_SEAM, "SEAM", 0, "Seam", "Delimit by edge seams"},
30 {BMO_DELIM_SHARP, "SHARP", 0, "Sharp", "Delimit by sharp edges"},
31 {BMO_DELIM_UV, "UV", 0, "UVs", "Delimit by UV coordinates"},
32 {0, nullptr, 0, nullptr, nullptr},
33};
34
36 {REMESH_VOXEL, "VOXEL", 0, "Voxel", "Use the voxel remesher"},
37 {REMESH_QUAD, "QUAD", 0, "Quad", "Use the quad remesher"},
38 {0, nullptr, 0, nullptr, nullptr},
39};
40
41#ifdef RNA_RUNTIME
42
43# include <fmt/format.h>
44
45# include "DNA_material_types.h"
46# include "DNA_scene_types.h"
47# include "DNA_world_types.h"
48
49# include "BLI_math_geom.h"
50# include "BLI_math_vector.h"
51
52# include "BKE_attribute.hh"
53# include "BKE_customdata.hh"
54# include "BKE_lib_id.hh"
55# include "BKE_main.hh"
56# include "BKE_mesh.hh"
57# include "BKE_mesh_runtime.hh"
58# include "BKE_report.hh"
59
60# include "DEG_depsgraph.hh"
61
62# include "ED_mesh.hh" /* XXX Bad level call */
63
64# include "WM_api.hh"
65
66# include "rna_mesh_utils.hh"
67
69
70/* -------------------------------------------------------------------- */
73
74static Mesh *rna_mesh(const PointerRNA *ptr)
75{
76 Mesh *mesh = (Mesh *)ptr->owner_id;
77 return mesh;
78}
79
80static CustomData *rna_mesh_vdata_helper(Mesh *mesh)
81{
82 return (mesh->runtime->edit_mesh) ? &mesh->runtime->edit_mesh->bm->vdata : &mesh->vert_data;
83}
84
85static CustomData *rna_mesh_ldata_helper(Mesh *mesh)
86{
87 return (mesh->runtime->edit_mesh) ? &mesh->runtime->edit_mesh->bm->ldata : &mesh->corner_data;
88}
89
90static CustomData *rna_mesh_vdata(const PointerRNA *ptr)
91{
92 Mesh *mesh = rna_mesh(ptr);
93 return rna_mesh_vdata_helper(mesh);
94}
95static CustomData *rna_mesh_ldata(const PointerRNA *ptr)
96{
97 Mesh *mesh = rna_mesh(ptr);
98 return rna_mesh_ldata_helper(mesh);
99}
100
102
103/* -------------------------------------------------------------------- */
106
107static void rna_cd_layer_name_set(CustomData *cdata, CustomDataLayer *cdl, const char *value)
108{
109 STRNCPY_UTF8(cdl->name, value);
110 CustomData_set_layer_unique_name(cdata, cdl - cdata->layers);
111}
112
113static void rna_MeshVertexLayer_name_set(PointerRNA *ptr, const char *value)
114{
115 CustomDataLayer *layer = (CustomDataLayer *)ptr->data;
116
118 AttributeOwner owner = AttributeOwner::from_id(ptr->owner_id);
119 BKE_attribute_rename(owner, layer->name, value, nullptr);
120 }
121 else {
122 rna_cd_layer_name_set(rna_mesh_vdata(ptr), layer, value);
123 }
124}
125# if 0
126static void rna_MeshEdgeLayer_name_set(PointerRNA *ptr, const char *value)
127{
128 CustomDataLayer *layer = (CustomDataLayer *)ptr->data;
129
131 AttributeOwner owner = AttributeOwner::from_id(ptr->owner_id);
132 BKE_attribute_rename(owner, layer->name, value, nullptr);
133 }
134 else {
135 rna_cd_layer_name_set(rna_mesh_edata(ptr), layer, value);
136 }
137}
138# endif
139static void rna_MeshLoopLayer_name_set(PointerRNA *ptr, const char *value)
140{
141 CustomDataLayer *layer = (CustomDataLayer *)ptr->data;
142
144 AttributeOwner owner = AttributeOwner::from_id(ptr->owner_id);
145 BKE_attribute_rename(owner, layer->name, value, nullptr);
146 }
147 else {
148 rna_cd_layer_name_set(rna_mesh_ldata(ptr), layer, value);
149 }
150}
151
152static bool rna_Mesh_has_custom_normals_get(PointerRNA *ptr)
153{
154 Mesh *mesh = static_cast<Mesh *>(ptr->data);
156}
157
159
160/* -------------------------------------------------------------------- */
167
175static void rna_Mesh_update_data_legacy_deg_tag_all(Main * /*bmain*/,
176 Scene * /*scene*/,
178{
179 ID *id = ptr->owner_id;
180 if (id->us <= 0) { /* See note in section heading. */
181 return;
182 }
183
184 DEG_id_tag_update(id, 0);
186}
187
188static void rna_Mesh_update_geom_and_params(Main * /*bmain*/, Scene * /*scene*/, PointerRNA *ptr)
189{
190 ID *id = ptr->owner_id;
191 if (id->us <= 0) { /* See note in section heading. */
192 return;
193 }
194
197}
198
199static void rna_Mesh_update_data_edit_weight(Main *bmain, Scene *scene, PointerRNA *ptr)
200{
202
203 rna_Mesh_update_data_legacy_deg_tag_all(bmain, scene, ptr);
204}
205
206static void rna_Mesh_update_data_edit_active_color(Main *bmain, Scene *scene, PointerRNA *ptr)
207{
209
210 rna_Mesh_update_data_legacy_deg_tag_all(bmain, scene, ptr);
211}
212static void rna_Mesh_update_select(Main * /*bmain*/, Scene * /*scene*/, PointerRNA *ptr)
213{
214 ID *id = ptr->owner_id;
215 if (id->us <= 0) { /* See note in section heading. */
216 return;
217 }
218
220}
221
222void rna_Mesh_update_draw(Main * /*bmain*/, Scene * /*scene*/, PointerRNA *ptr)
223{
224 ID *id = ptr->owner_id;
225 if (id->us <= 0) { /* See note in section heading. */
226 return;
227 }
228
230}
231
232static void rna_Mesh_update_bone_selection_mode(Main *bmain, Scene *scene, PointerRNA *ptr)
233{
234 Mesh *mesh = static_cast<Mesh *>(ptr->data);
237
239
240 rna_Mesh_update_draw(bmain, scene, ptr);
241}
242
243static void rna_Mesh_update_vertmask(Main *bmain, Scene *scene, PointerRNA *ptr)
244{
245 Mesh *mesh = static_cast<Mesh *>(ptr->data);
248 }
249
251
252 rna_Mesh_update_draw(bmain, scene, ptr);
253}
254
255static void rna_Mesh_update_facemask(Main *bmain, Scene *scene, PointerRNA *ptr)
256{
257 Mesh *mesh = static_cast<Mesh *>(ptr->data);
260 }
261
263
264 rna_Mesh_update_draw(bmain, scene, ptr);
265}
266
267static void rna_Mesh_update_positions_tag(Main *bmain, Scene *scene, PointerRNA *ptr)
268{
269 rna_Mesh_update_data_legacy_deg_tag_all(bmain, scene, ptr);
270}
271
273
274/* -------------------------------------------------------------------- */
277
278static int rna_MeshVertex_index_get(PointerRNA *ptr)
279{
280 const Mesh *mesh = rna_mesh(ptr);
281 const blender::float3 *position = static_cast<const blender::float3 *>(ptr->data);
282 const int index = int(position - mesh->vert_positions().data());
283 BLI_assert(index >= 0);
284 BLI_assert(index < mesh->verts_num);
285 return index;
286}
287
288static int rna_MeshEdge_index_get(PointerRNA *ptr)
289{
290 using namespace blender;
291 const Mesh *mesh = rna_mesh(ptr);
292 const blender::int2 *edge = static_cast<const blender::int2 *>(ptr->data);
293 const blender::int2 *edges = mesh->edges().data();
294 const int index = int(edge - edges);
295 BLI_assert(index >= 0);
296 BLI_assert(index < mesh->edges_num);
297 return index;
298}
299
300static int rna_MeshPolygon_index_get(PointerRNA *ptr)
301{
302 const Mesh *mesh = rna_mesh(ptr);
303 const int *face_offset = static_cast<const int *>(ptr->data);
304 const int index = int(face_offset - mesh->face_offsets().data());
305 BLI_assert(index >= 0);
306 BLI_assert(index < mesh->faces_num);
307 return index;
308}
309
310static int rna_MeshLoop_index_get(PointerRNA *ptr)
311{
312 const Mesh *mesh = rna_mesh(ptr);
313 const int *corner_vert = static_cast<const int *>(ptr->data);
314 const int index = int(corner_vert - mesh->corner_verts().data());
315 BLI_assert(index >= 0);
316 BLI_assert(index < mesh->corners_num);
317 return index;
318}
319
320static int rna_MeshLoopTriangle_index_get(PointerRNA *ptr)
321{
322 const Mesh *mesh = rna_mesh(ptr);
323 const blender::int3 *tri = static_cast<const blender::int3 *>(ptr->data);
324 const int index = int(tri - mesh->corner_tris().data());
325 BLI_assert(index >= 0);
327 return index;
328}
329
330static int rna_MeshLoopTriangle_polygon_index_get(PointerRNA *ptr)
331{
332 const Mesh *mesh = rna_mesh(ptr);
333 const int index = rna_MeshLoopTriangle_index_get(ptr);
334 return mesh->corner_tri_faces()[index];
335}
336
337static void rna_Mesh_loop_triangles_begin(CollectionPropertyIterator *iter, PointerRNA *ptr)
338{
339 const Mesh *mesh = rna_mesh(ptr);
340 const blender::Span<blender::int3> corner_tris = mesh->corner_tris();
342 ptr,
343 const_cast<blender::int3 *>(corner_tris.data()),
344 sizeof(blender::int3),
345 corner_tris.size(),
346 false,
347 nullptr);
348}
349
350static int rna_Mesh_loop_triangles_length(PointerRNA *ptr)
351{
352 const Mesh *mesh = rna_mesh(ptr);
354}
355
356bool rna_Mesh_loop_triangles_lookup_int(PointerRNA *ptr, int index, PointerRNA *r_ptr)
357{
358 const Mesh *mesh = rna_mesh(ptr);
359 if (index < 0 || index >= BKE_mesh_runtime_corner_tris_len(mesh)) {
360 return false;
361 }
362 /* Casting away const is okay because this RNA type doesn't allow changing the value. */
364 &RNA_MeshLoopTriangle,
365 const_cast<blender::int3 *>(&mesh->corner_tris()[index]),
366 *r_ptr);
367 return true;
368}
369
370static void rna_Mesh_loop_triangle_polygons_begin(CollectionPropertyIterator *iter,
372{
373 const Mesh *mesh = rna_mesh(ptr);
375 ptr,
376 const_cast<int *>(mesh->corner_tri_faces().data()),
377 sizeof(int),
379 false,
380 nullptr);
381}
382
383bool rna_Mesh_loop_triangle_polygons_lookup_int(PointerRNA *ptr, int index, PointerRNA *r_ptr)
384{
385 const Mesh *mesh = rna_mesh(ptr);
386 if (index < 0 || index >= BKE_mesh_runtime_corner_tris_len(mesh)) {
387 return false;
388 }
389 /* Casting away const is okay because this RNA type doesn't allow changing the value. */
391 *ptr, &RNA_ReadOnlyInteger, const_cast<int *>(&mesh->corner_tri_faces()[index]), *r_ptr);
392 return true;
393}
394
395static void rna_MeshVertex_co_get(PointerRNA *ptr, float *value)
396{
397 copy_v3_v3(value, (const float *)ptr->data);
398}
399
400static void rna_MeshVertex_co_set(PointerRNA *ptr, const float *value)
401{
402 copy_v3_v3((float *)ptr->data, value);
403 Mesh *mesh = rna_mesh(ptr);
404 mesh->tag_positions_changed();
405}
406
407static void rna_MeshVertex_normal_get(PointerRNA *ptr, float *value)
408{
409 Mesh *mesh = rna_mesh(ptr);
410 const blender::Span<blender::float3> vert_normals = mesh->vert_normals();
411 const int index = rna_MeshVertex_index_get(ptr);
412 copy_v3_v3(value, vert_normals[index]);
413}
414
415static bool rna_MeshVertex_hide_get(PointerRNA *ptr)
416{
417 const Mesh *mesh = rna_mesh(ptr);
418 const blender::bke::AttributeAccessor attributes = mesh->attributes();
419 const blender::VArray hide_vert = *attributes.lookup_or_default<bool>(
420 ".hide_vert", blender::bke::AttrDomain::Point, false);
421 const int index = rna_MeshVertex_index_get(ptr);
422 return hide_vert[index];
423}
424
425static void rna_MeshVertex_hide_set(PointerRNA *ptr, bool value)
426{
427 Mesh *mesh = rna_mesh(ptr);
428 blender::bke::MutableAttributeAccessor attributes = mesh->attributes_for_write();
429 blender::bke::AttributeWriter hide_vert = attributes.lookup_or_add_for_write<bool>(
431 const int index = rna_MeshVertex_index_get(ptr);
432 hide_vert.varray.set(index, value);
433 hide_vert.finish();
434}
435
436static bool rna_MeshVertex_select_get(PointerRNA *ptr)
437{
438 const Mesh *mesh = rna_mesh(ptr);
439 const int index = rna_MeshVertex_index_get(ptr);
440 const blender::bke::AttributeAccessor attributes = mesh->attributes();
441 const blender::VArray select_vert = *attributes.lookup_or_default<bool>(
442 ".select_vert", blender::bke::AttrDomain::Point, false);
443 return select_vert[index];
444}
445
446static void rna_MeshVertex_select_set(PointerRNA *ptr, bool value)
447{
448 Mesh *mesh = rna_mesh(ptr);
449 const int index = rna_MeshVertex_index_get(ptr);
450 blender::bke::MutableAttributeAccessor attributes = mesh->attributes_for_write();
451 blender::bke::AttributeWriter select_vert = attributes.lookup_or_add_for_write<bool>(
453 select_vert.varray.set(index, value);
454 select_vert.finish();
455}
456
457static int rna_MeshLoop_vertex_index_get(PointerRNA *ptr)
458{
459 return *(int *)ptr->data;
460}
461
462static void rna_MeshLoop_vertex_index_set(PointerRNA *ptr, int value)
463{
464 *(int *)ptr->data = value;
465}
466
467static int rna_MeshLoop_edge_index_get(PointerRNA *ptr)
468{
469 const Mesh *mesh = rna_mesh(ptr);
470 const int index = rna_MeshLoop_index_get(ptr);
471 return mesh->corner_edges()[index];
472}
473
474static void rna_MeshLoop_edge_index_set(PointerRNA *ptr, int value)
475{
476 Mesh *mesh = rna_mesh(ptr);
477 const int index = rna_MeshLoop_index_get(ptr);
478 mesh->corner_edges_for_write()[index] = value;
479}
480
481static void rna_MeshLoop_normal_get(PointerRNA *ptr, float *values)
482{
483 Mesh *mesh = rna_mesh(ptr);
484 const int index = rna_MeshLoop_index_get(ptr);
485 copy_v3_v3(values, mesh->corner_normals()[index]);
486}
487
488static void rna_MeshLoop_tangent_get(PointerRNA *ptr, float *values)
489{
490 Mesh *mesh = rna_mesh(ptr);
491 const int index = rna_MeshLoop_index_get(ptr);
492 const blender::float4 *layer = static_cast<const blender::float4 *>(
494
495 if (!layer) {
496 zero_v3(values);
497 }
498 else {
499 copy_v3_v3(values, (const float *)(layer + index));
500 }
501}
502
503static float rna_MeshLoop_bitangent_sign_get(PointerRNA *ptr)
504{
505 Mesh *mesh = rna_mesh(ptr);
506 const int index = rna_MeshLoop_index_get(ptr);
507 const blender::float4 *vec = static_cast<const blender::float4 *>(
509
510 return (vec) ? vec[index][3] : 0.0f;
511}
512
513static void rna_MeshLoop_bitangent_get(PointerRNA *ptr, float *values)
514{
515 Mesh *mesh = rna_mesh(ptr);
516 const int index = rna_MeshLoop_index_get(ptr);
517 const blender::float4 *vec = static_cast<const blender::float4 *>(
519
520 if (vec) {
521 cross_v3_v3v3(values, mesh->corner_normals()[index], vec[index]);
522 mul_v3_fl(values, vec[index][3]);
523 }
524 else {
525 zero_v3(values);
526 }
527}
528
529static void rna_MeshPolygon_normal_get(PointerRNA *ptr, float *values)
530{
531 using namespace blender;
532 Mesh *mesh = rna_mesh(ptr);
533 const int poly_start = *((const int *)ptr->data);
534 const int poly_size = *(((const int *)ptr->data) + 1) - poly_start;
535 const Span<int> face_verts = mesh->corner_verts().slice(poly_start, poly_size);
536 const float3 result = bke::mesh::face_normal_calc(mesh->vert_positions(), face_verts);
537 copy_v3_v3(values, result);
538}
539
540static bool rna_MeshPolygon_hide_get(PointerRNA *ptr)
541{
542 const Mesh *mesh = rna_mesh(ptr);
543 const int index = rna_MeshPolygon_index_get(ptr);
544 const blender::bke::AttributeAccessor attributes = mesh->attributes();
545 const blender::VArray hide_poly = *attributes.lookup_or_default<bool>(
546 ".hide_poly", blender::bke::AttrDomain::Face, false);
547 return hide_poly[index];
548}
549
550static void rna_MeshPolygon_hide_set(PointerRNA *ptr, bool value)
551{
552 Mesh *mesh = rna_mesh(ptr);
553 const int index = rna_MeshPolygon_index_get(ptr);
554 blender::bke::MutableAttributeAccessor attributes = mesh->attributes_for_write();
555 blender::bke::AttributeWriter hide_poly = attributes.lookup_or_add_for_write<bool>(
557 hide_poly.varray.set(index, value);
558 hide_poly.finish();
559}
560
561static bool rna_MeshPolygon_use_smooth_get(PointerRNA *ptr)
562{
563 const Mesh *mesh = rna_mesh(ptr);
564 const int index = rna_MeshPolygon_index_get(ptr);
565 const blender::bke::AttributeAccessor attributes = mesh->attributes();
566 const blender::VArray sharp_face = *attributes.lookup_or_default<bool>(
567 "sharp_face", blender::bke::AttrDomain::Face, false);
568 return !sharp_face[index];
569}
570
571static void rna_MeshPolygon_use_smooth_set(PointerRNA *ptr, bool value)
572{
573 Mesh *mesh = rna_mesh(ptr);
574 const int index = rna_MeshPolygon_index_get(ptr);
575 blender::bke::MutableAttributeAccessor attributes = mesh->attributes_for_write();
576 blender::bke::AttributeWriter sharp_face = attributes.lookup_or_add_for_write<bool>(
578 sharp_face.varray.set(index, !value);
579 sharp_face.finish();
580}
581
582static bool rna_MeshPolygon_select_get(PointerRNA *ptr)
583{
584 const Mesh *mesh = rna_mesh(ptr);
585 const int index = rna_MeshPolygon_index_get(ptr);
586 const blender::bke::AttributeAccessor attributes = mesh->attributes();
587 const blender::VArray select_poly = *attributes.lookup_or_default<bool>(
588 ".select_poly", blender::bke::AttrDomain::Face, false);
589 return select_poly[index];
590}
591
592static void rna_MeshPolygon_select_set(PointerRNA *ptr, bool value)
593{
594 Mesh *mesh = rna_mesh(ptr);
595 const int index = rna_MeshPolygon_index_get(ptr);
596 blender::bke::MutableAttributeAccessor attributes = mesh->attributes_for_write();
597 blender::bke::AttributeWriter select_poly = attributes.lookup_or_add_for_write<bool>(
599 select_poly.varray.set(index, value);
600 select_poly.finish();
601}
602
603static int rna_MeshPolygon_material_index_get(PointerRNA *ptr)
604{
605 using namespace blender;
606 const Mesh *mesh = rna_mesh(ptr);
607 const bke::AttributeAccessor attributes = mesh->attributes();
608 const VArray material_index = *attributes.lookup_or_default<int>(
609 "material_index", bke::AttrDomain::Face, 0);
610 return material_index[rna_MeshPolygon_index_get(ptr)];
611}
612
613static void rna_MeshPolygon_material_index_set(PointerRNA *ptr, int value)
614{
615 using namespace blender;
616 Mesh *mesh = rna_mesh(ptr);
617 bke::MutableAttributeAccessor attributes = mesh->attributes_for_write();
618 bke::AttributeWriter material_index = attributes.lookup_or_add_for_write<int>(
619 "material_index", bke::AttrDomain::Face);
620 material_index.varray.set(rna_MeshPolygon_index_get(ptr), max_ii(0, value));
621 material_index.finish();
622}
623
624static void rna_MeshPolygon_center_get(PointerRNA *ptr, float *values)
625{
626 using namespace blender;
627 Mesh *mesh = rna_mesh(ptr);
628 const int poly_start = *((const int *)ptr->data);
629 const int poly_size = *(((const int *)ptr->data) + 1) - poly_start;
630 const Span<int> face_verts = mesh->corner_verts().slice(poly_start, poly_size);
631 const float3 result = bke::mesh::face_center_calc(mesh->vert_positions(), face_verts);
632 copy_v3_v3(values, result);
633}
634
635static float rna_MeshPolygon_area_get(PointerRNA *ptr)
636{
637 using namespace blender;
638 Mesh *mesh = (Mesh *)ptr->owner_id;
639 const int poly_start = *((const int *)ptr->data);
640 const int poly_size = *(((const int *)ptr->data) + 1) - poly_start;
641 const Span<int> face_verts = mesh->corner_verts().slice(poly_start, poly_size);
642 return bke::mesh::face_area_calc(mesh->vert_positions(), face_verts);
643}
644
645static void rna_MeshPolygon_flip(ID *id, MIntProperty *poly_offset_p)
646{
647 using namespace blender;
648 Mesh *mesh = (Mesh *)id;
649 const int index = reinterpret_cast<int *>(poly_offset_p) - mesh->faces().data().data();
650 bke::mesh_flip_faces(*mesh, IndexMask(IndexRange(index, 1)));
653}
654
655static void rna_MeshLoopTriangle_verts_get(PointerRNA *ptr, int *values)
656{
657 Mesh *mesh = rna_mesh(ptr);
658 const blender::Span<int> corner_verts = mesh->corner_verts();
659 blender::int3 tri = *(blender::int3 *)ptr->data;
660 values[0] = corner_verts[tri[0]];
661 values[1] = corner_verts[tri[1]];
662 values[2] = corner_verts[tri[2]];
663}
664
665static void rna_MeshLoopTriangle_normal_get(PointerRNA *ptr, float *values)
666{
667 Mesh *mesh = rna_mesh(ptr);
668 blender::int3 tri = *(blender::int3 *)ptr->data;
669 const blender::Span<blender::float3> positions = mesh->vert_positions();
670 const blender::Span<int> corner_verts = mesh->corner_verts();
671 const int v1 = corner_verts[tri[0]];
672 const int v2 = corner_verts[tri[1]];
673 const int v3 = corner_verts[tri[2]];
674
675 normal_tri_v3(values, positions[v1], positions[v2], positions[v3]);
676}
677
678static void rna_MeshLoopTriangle_split_normals_get(PointerRNA *ptr, float *values)
679{
680 Mesh *mesh = rna_mesh(ptr);
681 const blender::Span<blender::float3> corner_normals = mesh->corner_normals();
682 const blender::int3 tri = *(const blender::int3 *)ptr->data;
683 copy_v3_v3(values + 0, corner_normals[tri[0]]);
684 copy_v3_v3(values + 3, corner_normals[tri[1]]);
685 copy_v3_v3(values + 6, corner_normals[tri[2]]);
686}
687
688static float rna_MeshLoopTriangle_area_get(PointerRNA *ptr)
689{
690 Mesh *mesh = rna_mesh(ptr);
691 blender::int3 tri = *(blender::int3 *)ptr->data;
692 const blender::Span<blender::float3> positions = mesh->vert_positions();
693 const blender::Span<int> corner_verts = mesh->corner_verts();
694 const int v1 = corner_verts[tri[0]];
695 const int v2 = corner_verts[tri[1]];
696 const int v3 = corner_verts[tri[2]];
697 return area_tri_v3(positions[v1], positions[v2], positions[v3]);
698}
699
700static void rna_MeshLoopColor_color_get(PointerRNA *ptr, float *values)
701{
702 MLoopCol *mlcol = (MLoopCol *)ptr->data;
703
704 values[0] = mlcol->r / 255.0f;
705 values[1] = mlcol->g / 255.0f;
706 values[2] = mlcol->b / 255.0f;
707 values[3] = mlcol->a / 255.0f;
708}
709
710static void rna_MeshLoopColor_color_set(PointerRNA *ptr, const float *values)
711{
712 MLoopCol *mlcol = (MLoopCol *)ptr->data;
713
714 mlcol->r = round_fl_to_uchar_clamp(values[0] * 255.0f);
715 mlcol->g = round_fl_to_uchar_clamp(values[1] * 255.0f);
716 mlcol->b = round_fl_to_uchar_clamp(values[2] * 255.0f);
717 mlcol->a = round_fl_to_uchar_clamp(values[3] * 255.0f);
718}
719
720static int rna_Mesh_texspace_editable(const PointerRNA *ptr, const char ** /*r_info*/)
721{
722 Mesh *mesh = (Mesh *)ptr->data;
724}
725
726static void rna_Mesh_texspace_size_get(PointerRNA *ptr, float values[3])
727{
728 Mesh *mesh = (Mesh *)ptr->data;
729
731
732 copy_v3_v3(values, mesh->texspace_size);
733}
734
735static void rna_Mesh_texspace_location_get(PointerRNA *ptr, float values[3])
736{
737 Mesh *mesh = (Mesh *)ptr->data;
738
740
741 copy_v3_v3(values, mesh->texspace_location);
742}
743
744static void rna_MeshVertex_groups_begin(CollectionPropertyIterator *iter, PointerRNA *ptr)
745{
746 Mesh *mesh = rna_mesh(ptr);
747 MDeformVert *dverts = mesh->deform_verts_for_write().data();
748 if (dverts) {
749 const int index = rna_MeshVertex_index_get(ptr);
750 MDeformVert *dvert = &dverts[index];
751
753 iter, ptr, dvert->dw, sizeof(MDeformWeight), dvert->totweight, 0, nullptr);
754 }
755 else {
756 rna_iterator_array_begin(iter, ptr, nullptr, 0, 0, 0, nullptr);
757 }
758}
759
760static void rna_MeshVertex_undeformed_co_get(PointerRNA *ptr, float values[3])
761{
762 Mesh *mesh = rna_mesh(ptr);
763 const float *position = (const float *)ptr->data;
764 const blender::float3 *orco = static_cast<const blender::float3 *>(
766
767 if (orco) {
768 const int index = rna_MeshVertex_index_get(ptr);
769 /* orco is normalized to 0..1, we do inverse to match the vertex position */
770 float texspace_location[3], texspace_size[3];
771
773 mesh->texcomesh ? mesh->texcomesh : mesh, texspace_location, texspace_size);
774 madd_v3_v3v3v3(values, texspace_location, orco[index], texspace_size);
775 }
776 else {
777 copy_v3_v3(values, position);
778 }
779}
780
781static int rna_CustomDataLayer_active_get(PointerRNA *ptr, CustomData *data, int type, bool render)
782{
783 int n = ((CustomDataLayer *)ptr->data) - data->layers;
784
785 if (render) {
787 }
788 else {
790 }
791}
792
793static int rna_CustomDataLayer_clone_get(PointerRNA *ptr, CustomData *data, int type)
794{
795 int n = ((CustomDataLayer *)ptr->data) - data->layers;
796
798}
799
800static void rna_CustomDataLayer_active_set(
801 PointerRNA *ptr, CustomData *data, int value, int type, int render)
802{
803 Mesh *mesh = (Mesh *)ptr->owner_id;
804 int n = (((CustomDataLayer *)ptr->data) - data->layers) -
806
807 if (value == 0) {
808 return;
809 }
810
811 if (render) {
813 }
814 else {
816 }
817
819}
820
821static void rna_CustomDataLayer_clone_set(PointerRNA *ptr, CustomData *data, int value, int type)
822{
823 int n = ((CustomDataLayer *)ptr->data) - data->layers;
824
825 if (value == 0) {
826 return;
827 }
828
830}
831
832/* uv_layers */
833
836 uv_layer, ldata, CD_PROP_FLOAT2, active, MeshUVLoopLayer)
838 uv_layer, ldata, CD_PROP_FLOAT2, clone, MeshUVLoopLayer)
840 uv_layer, ldata, CD_PROP_FLOAT2, stencil, MeshUVLoopLayer)
842 uv_layer, ldata, CD_PROP_FLOAT2, render, MeshUVLoopLayer)
843
844/* MeshUVLoopLayer */
845
846static std::optional<std::string> rna_MeshUVLoopLayer_path(const PointerRNA *ptr)
847{
848 const CustomDataLayer *cdl = static_cast<const CustomDataLayer *>(ptr->data);
849 char name_esc[sizeof(cdl->name) * 2];
850 BLI_str_escape(name_esc, cdl->name, sizeof(name_esc));
851 return fmt::format("uv_layers[\"{}\"]", name_esc);
852}
853
854static void rna_MeshUVLoopLayer_data_begin(CollectionPropertyIterator *iter, PointerRNA *ptr)
855{
856 Mesh *mesh = rna_mesh(ptr);
857 CustomDataLayer *layer = (CustomDataLayer *)ptr->data;
858 const int length = (mesh->runtime->edit_mesh) ? 0 : mesh->corners_num;
860 rna_iterator_array_begin(iter, ptr, layer->data, sizeof(float[2]), length, 0, nullptr);
861}
862
863static int rna_MeshUVLoopLayer_data_length(PointerRNA *ptr)
864{
865 Mesh *mesh = rna_mesh(ptr);
866 return (mesh->runtime->edit_mesh) ? 0 : mesh->corners_num;
867}
868
869static void bool_layer_begin(CollectionPropertyIterator *iter,
871 StringRef (*layername_func)(const StringRef uv_name, char *buffer))
872{
873 char buffer[MAX_CUSTOMDATA_LAYER_NAME];
874 Mesh *mesh = rna_mesh(ptr);
875 CustomDataLayer *layer = (CustomDataLayer *)ptr->data;
876 const StringRef name = layername_func(layer->name, buffer);
877 if (mesh->runtime->edit_mesh) {
878 rna_iterator_array_begin(iter, ptr, nullptr, sizeof(MBoolProperty), 0, 0, nullptr);
879 return;
880 }
882 &mesh->corner_data, CD_PROP_BOOL, name, mesh->corners_num);
883 if (!data) {
884 rna_iterator_array_begin(iter, ptr, nullptr, sizeof(MBoolProperty), 0, 0, nullptr);
885 return;
886 }
887 rna_iterator_array_begin(iter, ptr, data, sizeof(MBoolProperty), mesh->corners_num, 0, nullptr);
888}
889
890static bool bool_layer_lookup_int(PointerRNA *ptr,
891 int index,
892 PointerRNA *r_ptr,
893 StringRef (*layername_func)(const StringRef uv_name,
894 char *buffer))
895{
896 char buffer[MAX_CUSTOMDATA_LAYER_NAME];
897 Mesh *mesh = rna_mesh(ptr);
898 if (mesh->runtime->edit_mesh || index < 0 || index >= mesh->corners_num) {
899 return 0;
900 }
901 CustomDataLayer *layer = (CustomDataLayer *)ptr->data;
902 const StringRef name = layername_func(layer->name, buffer);
904 &mesh->corner_data, CD_PROP_BOOL, name, mesh->corners_num);
905 if (!data) {
906 return false;
907 }
908 rna_pointer_create_with_ancestors(*ptr, &RNA_BoolAttributeValue, data + index, *r_ptr);
909 return 1;
910}
911
912static int bool_layer_length(PointerRNA *ptr,
913 StringRef (*layername_func)(const StringRef uv_name, char *buffer))
914{
915 char buffer[MAX_CUSTOMDATA_LAYER_NAME];
916 Mesh *mesh = rna_mesh(ptr);
917 CustomDataLayer *layer = (CustomDataLayer *)ptr->data;
918 const StringRef name = layername_func(layer->name, buffer);
919 if (mesh->runtime->edit_mesh) {
920 return 0;
921 }
923 &mesh->corner_data, CD_PROP_BOOL, name, mesh->corners_num);
924 if (!data) {
925 return 0;
926 }
927 return mesh->corners_num;
928}
929
930static PointerRNA bool_layer_ensure(PointerRNA *ptr,
931 StringRef (*layername_func)(const StringRef uv_name,
932 char *buffer))
933{
934 char buffer[MAX_CUSTOMDATA_LAYER_NAME];
935 Mesh *mesh = rna_mesh(ptr);
936 if (mesh->runtime->edit_mesh) {
937 return {};
938 }
939 CustomDataLayer *layer = (CustomDataLayer *)ptr->data;
940 const StringRef name = layername_func(layer->name, buffer);
942 if (index == -1) {
946 }
947 if (index == -1) {
948 return {};
949 }
950 CustomDataLayer *bool_layer = &mesh->corner_data.layers[index];
951 return RNA_pointer_create_discrete(&mesh->id, &RNA_BoolAttribute, bool_layer);
952}
953
954/* Collection accessors for pin. */
955static void rna_MeshUVLoopLayer_pin_begin(CollectionPropertyIterator *iter, PointerRNA *ptr)
956{
957 bool_layer_begin(iter, ptr, BKE_uv_map_pin_name_get);
958}
959
960static bool rna_MeshUVLoopLayer_pin_lookup_int(PointerRNA *ptr, int index, PointerRNA *r_ptr)
961{
962 return bool_layer_lookup_int(ptr, index, r_ptr, BKE_uv_map_pin_name_get);
963}
964
965static int rna_MeshUVLoopLayer_pin_length(PointerRNA *ptr)
966{
967 return bool_layer_length(ptr, BKE_uv_map_pin_name_get);
968}
969
970static PointerRNA rna_MeshUVLoopLayer_pin_ensure(PointerRNA ptr)
971{
972 return bool_layer_ensure(&ptr, BKE_uv_map_pin_name_get);
973}
974
975static void rna_MeshUVLoopLayer_uv_begin(CollectionPropertyIterator *iter, PointerRNA *ptr)
976{
977 Mesh *mesh = rna_mesh(ptr);
978 CustomDataLayer *layer = (CustomDataLayer *)ptr->data;
979
981 ptr,
982 layer->data,
983 sizeof(float[2]),
984 (mesh->runtime->edit_mesh) ? 0 : mesh->corners_num,
985 0,
986 nullptr);
987}
988
989bool rna_MeshUVLoopLayer_uv_lookup_int(PointerRNA *ptr, int index, PointerRNA *r_ptr)
990{
991 Mesh *mesh = rna_mesh(ptr);
992 if (mesh->runtime->edit_mesh || index < 0 || index >= mesh->corners_num) {
993 return 0;
994 }
995 CustomDataLayer *layer = (CustomDataLayer *)ptr->data;
997 *ptr, &RNA_Float2AttributeValue, (float *)layer->data + 2 * index, *r_ptr);
998 return 1;
999}
1000
1001static bool rna_MeshUVLoopLayer_active_render_get(PointerRNA *ptr)
1002{
1003 return rna_CustomDataLayer_active_get(ptr, rna_mesh_ldata(ptr), CD_PROP_FLOAT2, 1);
1004}
1005
1006static bool rna_MeshUVLoopLayer_active_get(PointerRNA *ptr)
1007{
1008 return rna_CustomDataLayer_active_get(ptr, rna_mesh_ldata(ptr), CD_PROP_FLOAT2, 0);
1009}
1010
1011static bool rna_MeshUVLoopLayer_clone_get(PointerRNA *ptr)
1012{
1013 return rna_CustomDataLayer_clone_get(ptr, rna_mesh_ldata(ptr), CD_PROP_FLOAT2);
1014}
1015
1016static void rna_MeshUVLoopLayer_active_render_set(PointerRNA *ptr, bool value)
1017{
1018 rna_CustomDataLayer_active_set(ptr, rna_mesh_ldata(ptr), value, CD_PROP_FLOAT2, 1);
1019}
1020
1021static void rna_MeshUVLoopLayer_active_set(PointerRNA *ptr, bool value)
1022{
1023 rna_CustomDataLayer_active_set(ptr, rna_mesh_ldata(ptr), value, CD_PROP_FLOAT2, 0);
1024}
1025
1026static void rna_MeshUVLoopLayer_clone_set(PointerRNA *ptr, bool value)
1027{
1028 rna_CustomDataLayer_clone_set(ptr, rna_mesh_ldata(ptr), value, CD_PROP_FLOAT2);
1029}
1030
1031/* vertex_color_layers */
1032
1034
1035static PointerRNA rna_Mesh_vertex_color_active_get(PointerRNA *ptr)
1036{
1037 Mesh *mesh = (Mesh *)ptr->data;
1038 AttributeOwner owner = AttributeOwner::from_id(ptr->owner_id);
1041 return RNA_pointer_create_with_parent(*ptr, &RNA_MeshLoopColorLayer, layer);
1042}
1043
1044static void rna_Mesh_vertex_color_active_set(PointerRNA *ptr,
1045 const PointerRNA value,
1046 ReportList * /*reports*/)
1047{
1048 Mesh *mesh = (Mesh *)ptr->data;
1049 CustomDataLayer *layer = (CustomDataLayer *)value.data;
1050
1051 if (!layer) {
1052 return;
1053 }
1054
1055 BKE_id_attributes_active_color_set(&mesh->id, layer->name);
1056}
1057
1058static int rna_Mesh_vertex_color_active_index_get(PointerRNA *ptr)
1059{
1060 Mesh *mesh = (Mesh *)ptr->data;
1061 AttributeOwner owner = AttributeOwner::from_id(ptr->owner_id);
1064 if (!layer) {
1065 return 0;
1066 }
1067 CustomData *ldata = rna_mesh_ldata(ptr);
1068 return layer - ldata->layers + CustomData_get_layer_index(ldata, CD_PROP_BYTE_COLOR);
1069}
1070
1071static void rna_Mesh_vertex_color_active_index_set(PointerRNA *ptr, int value)
1072{
1073 Mesh *mesh = (Mesh *)ptr->data;
1074 CustomData *ldata = rna_mesh_ldata(ptr);
1075
1076 if (value < 0 || value >= CustomData_number_of_layers(ldata, CD_PROP_BYTE_COLOR)) {
1077 fprintf(stderr, "Invalid loop byte attribute index %d\n", value);
1078 return;
1079 }
1080
1082 value;
1083
1085}
1086
1087static void rna_MeshLoopColorLayer_data_begin(CollectionPropertyIterator *iter, PointerRNA *ptr)
1088{
1089 Mesh *mesh = rna_mesh(ptr);
1090 CustomDataLayer *layer = (CustomDataLayer *)ptr->data;
1092 ptr,
1093 layer->data,
1094 sizeof(MLoopCol),
1095 (mesh->runtime->edit_mesh) ? 0 : mesh->corners_num,
1096 0,
1097 nullptr);
1098}
1099
1100static int rna_MeshLoopColorLayer_data_length(PointerRNA *ptr)
1101{
1102 Mesh *mesh = rna_mesh(ptr);
1103 return (mesh->runtime->edit_mesh) ? 0 : mesh->corners_num;
1104}
1105
1106static bool rna_mesh_color_active_render_get(PointerRNA *ptr)
1107{
1108 const Mesh *mesh = rna_mesh(ptr);
1109 const CustomDataLayer *layer = (const CustomDataLayer *)ptr->data;
1110 return mesh->default_color_attribute && STREQ(mesh->default_color_attribute, layer->name);
1111}
1112
1113static bool rna_mesh_color_active_get(PointerRNA *ptr)
1114{
1115 const Mesh *mesh = rna_mesh(ptr);
1116 const CustomDataLayer *layer = (const CustomDataLayer *)ptr->data;
1117 return mesh->active_color_attribute && STREQ(mesh->active_color_attribute, layer->name);
1118}
1119
1120static void rna_mesh_color_active_render_set(PointerRNA *ptr, bool value)
1121{
1122 if (value == false) {
1123 return;
1124 }
1125 Mesh *mesh = (Mesh *)ptr->owner_id;
1126 CustomDataLayer *layer = (CustomDataLayer *)ptr->data;
1127 BKE_id_attributes_default_color_set(&mesh->id, layer->name);
1128}
1129
1130static void rna_mesh_color_active_set(PointerRNA *ptr, bool value)
1131{
1132 if (value == false) {
1133 return;
1134 }
1135 Mesh *mesh = (Mesh *)ptr->owner_id;
1136 CustomDataLayer *layer = (CustomDataLayer *)ptr->data;
1137
1138 BKE_id_attributes_active_color_set(&mesh->id, layer->name);
1139}
1140
1141/* Skin vertices */
1143
1144static std::optional<std::string> rna_MeshSkinVertexLayer_path(const PointerRNA *ptr)
1145{
1146 const CustomDataLayer *cdl = static_cast<const CustomDataLayer *>(ptr->data);
1147 char name_esc[sizeof(cdl->name) * 2];
1148 BLI_str_escape(name_esc, cdl->name, sizeof(name_esc));
1149 return fmt::format("skin_vertices[\"{}\"]", name_esc);
1150}
1151
1152static std::optional<std::string> rna_VertCustomData_data_path(const PointerRNA *ptr,
1153 const char *collection,
1154 int type);
1155static std::optional<std::string> rna_MeshSkinVertex_path(const PointerRNA *ptr)
1156{
1157 return rna_VertCustomData_data_path(ptr, "skin_vertices", CD_MVERT_SKIN);
1158}
1159
1160static void rna_MeshSkinVertexLayer_data_begin(CollectionPropertyIterator *iter, PointerRNA *ptr)
1161{
1162 Mesh *mesh = rna_mesh(ptr);
1163 CustomDataLayer *layer = (CustomDataLayer *)ptr->data;
1165 ptr,
1166 layer->data,
1167 sizeof(MVertSkin),
1168 (mesh->runtime->edit_mesh) ? 0 : mesh->verts_num,
1169 0,
1170 nullptr);
1171}
1172
1173static int rna_MeshSkinVertexLayer_data_length(PointerRNA *ptr)
1174{
1175 Mesh *mesh = rna_mesh(ptr);
1176 return (mesh->runtime->edit_mesh) ? 0 : mesh->verts_num;
1177}
1178
1179/* End skin vertices */
1180
1181/* poly.vertices - this is faked loop access for convenience */
1182static int rna_MeshPoly_vertices_get_length(const PointerRNA *ptr,
1184{
1185 const int *poly_offset_p = static_cast<const int *>(ptr->data);
1186 const int poly_start = *poly_offset_p;
1187 const int poly_size = *(poly_offset_p + 1) - poly_start;
1188 /* NOTE: raw access uses dummy item, this _could_ crash,
1189 * watch out for this, #MFace uses it but it can't work here. */
1190 return (length[0] = poly_size);
1191}
1192
1193static void rna_MeshPoly_vertices_get(PointerRNA *ptr, int *values)
1194{
1195 const Mesh *mesh = rna_mesh(ptr);
1196 const int *poly_offset_p = static_cast<const int *>(ptr->data);
1197 const int poly_start = *poly_offset_p;
1198 const int poly_size = *(poly_offset_p + 1) - poly_start;
1199 memcpy(values, &mesh->corner_verts()[poly_start], sizeof(int) * poly_size);
1200}
1201
1202static int rna_MeshPolygon_loop_total_get(PointerRNA *ptr)
1203{
1204 const int *data = static_cast<const int *>(ptr->data);
1205 return *(data + 1) - *data;
1206}
1207
1208static void rna_MeshPoly_vertices_set(PointerRNA *ptr, const int *values)
1209{
1210 Mesh *mesh = rna_mesh(ptr);
1211 const int *poly_offset_p = static_cast<const int *>(ptr->data);
1212 const int poly_start = *poly_offset_p;
1213 const int poly_size = *(poly_offset_p + 1) - poly_start;
1214 memcpy(&mesh->corner_verts_for_write()[poly_start], values, sizeof(int) * poly_size);
1215}
1216
1217/* disabling, some importers don't know the total material count when assigning materials */
1218# if 0
1219static void rna_MeshPoly_material_index_range(
1220 PointerRNA *ptr, int *min, int *max, int *softmin, int *softmax)
1221{
1222 Mesh *mesh = rna_mesh(ptr);
1223 *min = 0;
1224 *max = max_ii(0, mesh->totcol - 1);
1225}
1226# endif
1227
1228static bool rna_MeshEdge_hide_get(PointerRNA *ptr)
1229{
1230 const Mesh *mesh = rna_mesh(ptr);
1231 const int index = rna_MeshEdge_index_get(ptr);
1232 const blender::bke::AttributeAccessor attributes = mesh->attributes();
1233 const blender::VArray hide_edge = *attributes.lookup_or_default<bool>(
1234 ".hide_edge", blender::bke::AttrDomain::Edge, false);
1235 return hide_edge[index];
1236}
1237
1238static void rna_MeshEdge_hide_set(PointerRNA *ptr, bool value)
1239{
1240 Mesh *mesh = rna_mesh(ptr);
1241 const int index = rna_MeshEdge_index_get(ptr);
1242 blender::bke::MutableAttributeAccessor attributes = mesh->attributes_for_write();
1243 blender::bke::AttributeWriter hide_edge = attributes.lookup_or_add_for_write<bool>(
1245 hide_edge.varray.set(index, value);
1246 hide_edge.finish();
1247}
1248
1249static bool rna_MeshEdge_select_get(PointerRNA *ptr)
1250{
1251 const Mesh *mesh = rna_mesh(ptr);
1252 const int index = rna_MeshEdge_index_get(ptr);
1253 const blender::bke::AttributeAccessor attributes = mesh->attributes();
1254 const blender::VArray select_edge = *attributes.lookup_or_default<bool>(
1255 ".select_edge", blender::bke::AttrDomain::Edge, false);
1256 return select_edge[index];
1257}
1258
1259static void rna_MeshEdge_select_set(PointerRNA *ptr, bool value)
1260{
1261 Mesh *mesh = rna_mesh(ptr);
1262 const int index = rna_MeshEdge_index_get(ptr);
1263 blender::bke::MutableAttributeAccessor attributes = mesh->attributes_for_write();
1264 blender::bke::AttributeWriter select_edge = attributes.lookup_or_add_for_write<bool>(
1266 select_edge.varray.set(index, value);
1267 select_edge.finish();
1268}
1269
1270static bool rna_MeshEdge_use_edge_sharp_get(PointerRNA *ptr)
1271{
1272 const Mesh *mesh = rna_mesh(ptr);
1273 const int index = rna_MeshEdge_index_get(ptr);
1274 const blender::bke::AttributeAccessor attributes = mesh->attributes();
1275 const blender::VArray sharp_edge = *attributes.lookup_or_default<bool>(
1276 "sharp_edge", blender::bke::AttrDomain::Edge, false);
1277 return sharp_edge[index];
1278}
1279
1280static void rna_MeshEdge_use_edge_sharp_set(PointerRNA *ptr, bool value)
1281{
1282 Mesh *mesh = rna_mesh(ptr);
1283 const int index = rna_MeshEdge_index_get(ptr);
1284 blender::bke::MutableAttributeAccessor attributes = mesh->attributes_for_write();
1285 blender::bke::AttributeWriter sharp_edge = attributes.lookup_or_add_for_write<bool>(
1287 sharp_edge.varray.set(index, value);
1288 sharp_edge.finish();
1289}
1290
1291static bool rna_MeshEdge_use_seam_get(PointerRNA *ptr)
1292{
1293 const Mesh *mesh = rna_mesh(ptr);
1294 const int index = rna_MeshEdge_index_get(ptr);
1295 const blender::bke::AttributeAccessor attributes = mesh->attributes();
1296 const blender::VArray uv_seam = *attributes.lookup_or_default<bool>(
1297 "uv_seam", blender::bke::AttrDomain::Edge, false);
1298 return uv_seam[index];
1299}
1300
1301static void rna_MeshEdge_use_seam_set(PointerRNA *ptr, bool value)
1302{
1303 Mesh *mesh = rna_mesh(ptr);
1304 const int index = rna_MeshEdge_index_get(ptr);
1305 blender::bke::MutableAttributeAccessor attributes = mesh->attributes_for_write();
1306 blender::bke::AttributeWriter uv_seam = attributes.lookup_or_add_for_write<bool>(
1308 uv_seam.varray.set(index, value);
1309 uv_seam.finish();
1310}
1311
1312static bool rna_MeshEdge_is_loose_get(PointerRNA *ptr)
1313{
1314 const Mesh *mesh = rna_mesh(ptr);
1315 const int index = rna_MeshEdge_index_get(ptr);
1316 const blender::bke::LooseEdgeCache &loose_edges = mesh->loose_edges();
1317 return loose_edges.count > 0 && loose_edges.is_loose_bits[index];
1318}
1319
1320static int rna_MeshLoopTriangle_material_index_get(PointerRNA *ptr)
1321{
1322 using namespace blender;
1323 const Mesh *mesh = rna_mesh(ptr);
1324 const bke::AttributeAccessor attributes = mesh->attributes();
1325 const VArray material_indices = *attributes.lookup_or_default<int>(
1326 "material_index", bke::AttrDomain::Face, 0);
1327 return material_indices[rna_MeshLoopTriangle_polygon_index_get(ptr)];
1328}
1329
1330static bool rna_MeshLoopTriangle_use_smooth_get(PointerRNA *ptr)
1331{
1332 const Mesh *mesh = rna_mesh(ptr);
1333 const blender::bke::AttributeAccessor attributes = mesh->attributes();
1334 const blender::VArray sharp_face = *attributes.lookup_or_default<bool>(
1335 "sharp_face", blender::bke::AttrDomain::Face, false);
1336 return !sharp_face[rna_MeshLoopTriangle_polygon_index_get(ptr)];
1337}
1338
1339/* path construction */
1340
1341static std::optional<std::string> rna_VertexGroupElement_path(const PointerRNA *ptr)
1342{
1343 const Mesh *mesh = rna_mesh(ptr); /* XXX not always! */
1344 const MDeformWeight *dw = (MDeformWeight *)ptr->data;
1345 const MDeformVert *dvert = mesh->deform_verts().data();
1346 int a, b;
1347
1348 for (a = 0; a < mesh->verts_num; a++, dvert++) {
1349 for (b = 0; b < dvert->totweight; b++) {
1350 if (dw == &dvert->dw[b]) {
1351 return fmt::format("vertices[{}].groups[{}]", a, b);
1352 }
1353 }
1354 }
1355
1356 return std::nullopt;
1357}
1358
1359static std::optional<std::string> rna_MeshPolygon_path(const PointerRNA *ptr)
1360{
1361 return fmt::format("polygons[{}]", rna_MeshPolygon_index_get(const_cast<PointerRNA *>(ptr)));
1362}
1363
1364static std::optional<std::string> rna_MeshLoopTriangle_path(const PointerRNA *ptr)
1365{
1366 const int index = rna_MeshLoopTriangle_index_get(const_cast<PointerRNA *>(ptr));
1367 return fmt::format("loop_triangles[{}]", index);
1368}
1369
1370static std::optional<std::string> rna_MeshEdge_path(const PointerRNA *ptr)
1371{
1372 return fmt::format("edges[{}]", rna_MeshEdge_index_get(const_cast<PointerRNA *>(ptr)));
1373}
1374
1375static std::optional<std::string> rna_MeshLoop_path(const PointerRNA *ptr)
1376{
1377 return fmt::format("loops[{}]", rna_MeshLoop_index_get(const_cast<PointerRNA *>(ptr)));
1378}
1379
1380static std::optional<std::string> rna_MeshVertex_path(const PointerRNA *ptr)
1381{
1382 return fmt::format("vertices[{}]", rna_MeshVertex_index_get(const_cast<PointerRNA *>(ptr)));
1383}
1384
1385static std::optional<std::string> rna_VertCustomData_data_path(const PointerRNA *ptr,
1386 const char *collection,
1387 int type)
1388{
1389 const CustomDataLayer *cdl;
1390 const Mesh *mesh = rna_mesh(ptr);
1391 const CustomData *vdata = rna_mesh_vdata(ptr);
1392 int a, b, totvert = (mesh->runtime->edit_mesh) ? 0 : mesh->verts_num;
1393
1394 for (cdl = vdata->layers, a = 0; a < vdata->totlayer; cdl++, a++) {
1395 if (cdl->type == type) {
1396 b = ((char *)ptr->data - ((char *)cdl->data)) / CustomData_sizeof(eCustomDataType(type));
1397 if (b >= 0 && b < totvert) {
1398 char name_esc[sizeof(cdl->name) * 2];
1399 BLI_str_escape(name_esc, cdl->name, sizeof(name_esc));
1400 return fmt::format("{}[\"{}\"].data[{}]", collection, name_esc, b);
1401 }
1402 }
1403 }
1404
1405 return std::nullopt;
1406}
1407
1408static std::optional<std::string> rna_LoopCustomData_data_path(const PointerRNA *ptr,
1409 const char *collection,
1410 int type)
1411{
1412 const CustomDataLayer *cdl;
1413 const Mesh *mesh = rna_mesh(ptr);
1414 const CustomData *ldata = rna_mesh_ldata(ptr);
1415 int a, b, totloop = (mesh->runtime->edit_mesh) ? 0 : mesh->corners_num;
1416
1417 for (cdl = ldata->layers, a = 0; a < ldata->totlayer; cdl++, a++) {
1418 if (cdl->type == type) {
1419 b = ((char *)ptr->data - ((char *)cdl->data)) / CustomData_sizeof(eCustomDataType(type));
1420 if (b >= 0 && b < totloop) {
1421 char name_esc[sizeof(cdl->name) * 2];
1422 BLI_str_escape(name_esc, cdl->name, sizeof(name_esc));
1423 return fmt::format("{}[\"{}\"].data[{}]", collection, name_esc, b);
1424 }
1425 }
1426 }
1427
1428 return std::nullopt;
1429}
1430
1431static void rna_Mesh_vertices_begin(CollectionPropertyIterator *iter, PointerRNA *ptr)
1432{
1433 Mesh *mesh = rna_mesh(ptr);
1435 ptr,
1436 mesh->vert_positions_for_write().data(),
1437 sizeof(blender::float3),
1438 mesh->verts_num,
1439 false,
1440 nullptr);
1441}
1442static int rna_Mesh_vertices_length(PointerRNA *ptr)
1443{
1444 const Mesh *mesh = rna_mesh(ptr);
1445 return mesh->verts_num;
1446}
1447bool rna_Mesh_vertices_lookup_int(PointerRNA *ptr, int index, PointerRNA *r_ptr)
1448{
1449 Mesh *mesh = rna_mesh(ptr);
1450 if (index < 0 || index >= mesh->verts_num) {
1451 return false;
1452 }
1454 *ptr, &RNA_MeshVertex, &mesh->vert_positions_for_write()[index], *r_ptr);
1455 return true;
1456}
1457
1458static void rna_Mesh_edges_begin(CollectionPropertyIterator *iter, PointerRNA *ptr)
1459{
1460 using namespace blender;
1461 Mesh *mesh = rna_mesh(ptr);
1462 blender::MutableSpan<blender::int2> edges = mesh->edges_for_write();
1464 iter, ptr, edges.data(), sizeof(blender::int2), edges.size(), false, nullptr);
1465}
1466static int rna_Mesh_edges_length(PointerRNA *ptr)
1467{
1468 const Mesh *mesh = rna_mesh(ptr);
1469 return mesh->edges_num;
1470}
1471bool rna_Mesh_edges_lookup_int(PointerRNA *ptr, int index, PointerRNA *r_ptr)
1472{
1473 using namespace blender;
1474 Mesh *mesh = rna_mesh(ptr);
1475 if (index < 0 || index >= mesh->edges_num) {
1476 return false;
1477 }
1478 blender::MutableSpan<blender::int2> edges = mesh->edges_for_write();
1479 rna_pointer_create_with_ancestors(*ptr, &RNA_MeshEdge, &edges[index], *r_ptr);
1480 return true;
1481}
1482
1483static void rna_Mesh_polygons_begin(CollectionPropertyIterator *iter, PointerRNA *ptr)
1484{
1485 Mesh *mesh = rna_mesh(ptr);
1487 ptr,
1488 mesh->face_offsets_for_write().data(),
1489 sizeof(int),
1490 mesh->faces_num,
1491 false,
1492 nullptr);
1493}
1494static int rna_Mesh_polygons_length(PointerRNA *ptr)
1495{
1496 const Mesh *mesh = rna_mesh(ptr);
1497 return mesh->faces_num;
1498}
1499bool rna_Mesh_polygons_lookup_int(PointerRNA *ptr, int index, PointerRNA *r_ptr)
1500{
1501 Mesh *mesh = rna_mesh(ptr);
1502 if (index < 0 || index >= mesh->faces_num) {
1503 return false;
1504 }
1506 *ptr, &RNA_MeshPolygon, &mesh->face_offsets_for_write()[index], *r_ptr);
1507 return true;
1508}
1509
1510static void rna_Mesh_loops_begin(CollectionPropertyIterator *iter, PointerRNA *ptr)
1511{
1512 Mesh *mesh = rna_mesh(ptr);
1514 ptr,
1515 mesh->corner_verts_for_write().data(),
1516 sizeof(int),
1517 mesh->corners_num,
1518 false,
1519 nullptr);
1520}
1521static int rna_Mesh_loops_length(PointerRNA *ptr)
1522{
1523 const Mesh *mesh = rna_mesh(ptr);
1524 return mesh->corners_num;
1525}
1526bool rna_Mesh_loops_lookup_int(PointerRNA *ptr, int index, PointerRNA *r_ptr)
1527{
1528 Mesh *mesh = rna_mesh(ptr);
1529 if (index < 0 || index >= mesh->corners_num) {
1530 return false;
1531 }
1533 *ptr, &RNA_MeshLoop, &mesh->corner_verts_for_write()[index], *r_ptr);
1534 return true;
1535}
1536
1537static int rna_Mesh_normals_domain_get(PointerRNA *ptr)
1538{
1539 return int(rna_mesh(ptr)->normals_domain());
1540}
1541
1542static void rna_Mesh_vertex_normals_begin(CollectionPropertyIterator *iter, PointerRNA *ptr)
1543{
1544 const Mesh *mesh = rna_mesh(ptr);
1545 const blender::Span<blender::float3> normals = mesh->vert_normals();
1547 ptr,
1548 const_cast<blender::float3 *>(normals.data()),
1549 sizeof(blender::float3),
1550 normals.size(),
1551 false,
1552 nullptr);
1553}
1554
1555static int rna_Mesh_vertex_normals_length(PointerRNA *ptr)
1556{
1557 const Mesh *mesh = rna_mesh(ptr);
1558 return mesh->verts_num;
1559}
1560
1561bool rna_Mesh_vertex_normals_lookup_int(PointerRNA *ptr, int index, PointerRNA *r_ptr)
1562{
1563 const Mesh *mesh = rna_mesh(ptr);
1564 if (index < 0 || index >= mesh->verts_num) {
1565 return false;
1566 }
1567 /* Casting away const is okay because this RNA type doesn't allow changing the value. */
1569 &RNA_MeshNormalValue,
1570 const_cast<blender::float3 *>(&mesh->vert_normals()[index]),
1571 *r_ptr);
1572 return true;
1573}
1574
1575static void rna_Mesh_poly_normals_begin(CollectionPropertyIterator *iter, PointerRNA *ptr)
1576{
1577 const Mesh *mesh = rna_mesh(ptr);
1578 const blender::Span<blender::float3> normals = mesh->face_normals();
1580 ptr,
1581 const_cast<blender::float3 *>(normals.data()),
1582 sizeof(blender::float3),
1583 normals.size(),
1584 false,
1585 nullptr);
1586}
1587
1588static int rna_Mesh_poly_normals_length(PointerRNA *ptr)
1589{
1590 const Mesh *mesh = rna_mesh(ptr);
1591 return mesh->faces_num;
1592}
1593
1594bool rna_Mesh_poly_normals_lookup_int(PointerRNA *ptr, int index, PointerRNA *r_ptr)
1595{
1596 const Mesh *mesh = rna_mesh(ptr);
1597 if (index < 0 || index >= mesh->faces_num) {
1598 return false;
1599 }
1600 /* Casting away const is okay because this RNA type doesn't allow changing the value. */
1602 &RNA_MeshNormalValue,
1603 const_cast<blender::float3 *>(&mesh->face_normals()[index]),
1604 *r_ptr);
1605 return true;
1606}
1607
1608static void rna_Mesh_corner_normals_begin(CollectionPropertyIterator *iter, PointerRNA *ptr)
1609{
1610 const Mesh *mesh = rna_mesh(ptr);
1611 const blender::Span<blender::float3> normals = mesh->corner_normals();
1612 if (normals.is_empty()) {
1613 iter->valid = false;
1614 return;
1615 }
1617 iter, ptr, (void *)normals.data(), sizeof(float[3]), mesh->corners_num, false, nullptr);
1618}
1619
1620static int rna_Mesh_corner_normals_length(PointerRNA *ptr)
1621{
1622 const Mesh *mesh = rna_mesh(ptr);
1623 return mesh->corners_num;
1624}
1625
1626bool rna_Mesh_corner_normals_lookup_int(PointerRNA *ptr, int index, PointerRNA *r_ptr)
1627{
1628 const Mesh *mesh = rna_mesh(ptr);
1629 const blender::Span<blender::float3> normals = mesh->corner_normals();
1630 if (index < 0 || index >= mesh->corners_num || normals.is_empty()) {
1631 return false;
1632 }
1633 /* Casting away const is okay because this RNA type doesn't allow changing the value. */
1635 *ptr, &RNA_MeshNormalValue, const_cast<blender::float3 *>(&normals[index]), *r_ptr);
1636 return true;
1637}
1638
1639static std::optional<std::string> rna_MeshUVLoop_path(const PointerRNA *ptr)
1640{
1641 return rna_LoopCustomData_data_path(ptr, "uv_layers", CD_PROP_FLOAT2);
1642}
1653static bool get_uv_index_and_layer(const PointerRNA *ptr,
1654 int *r_uv_map_index,
1655 int *r_index_in_attribute)
1656{
1657 const Mesh *mesh = rna_mesh(ptr);
1658 const blender::float2 *uv_coord = static_cast<const blender::float2 *>(ptr->data);
1659
1660 /* We don't know from which attribute the RNA pointer is from, so we need to scan them all. */
1661 const int uv_layers_num = CustomData_number_of_layers(&mesh->corner_data, CD_PROP_FLOAT2);
1662 for (int layer_i = 0; layer_i < uv_layers_num; layer_i++) {
1663 const blender::float2 *layer_data = static_cast<const blender::float2 *>(
1665 const ptrdiff_t index = uv_coord - layer_data;
1666 if (index >= 0 && index < mesh->corners_num) {
1667 *r_uv_map_index = layer_i;
1668 *r_index_in_attribute = index;
1669 return true;
1670 }
1671 }
1672 /* This can happen if the Customdata arrays were re-allocated between obtaining the
1673 * Python object and accessing it. */
1674 return false;
1675}
1676
1677static bool rna_MeshUVLoop_pin_uv_get(PointerRNA *ptr)
1678{
1679 const Mesh *mesh = rna_mesh(ptr);
1680 int uv_map_index;
1681 int loop_index;
1682 blender::VArray<bool> pin_uv;
1683 if (get_uv_index_and_layer(ptr, &uv_map_index, &loop_index)) {
1684 pin_uv = ED_mesh_uv_map_pin_layer_get(mesh, uv_map_index);
1685 }
1686 return pin_uv ? pin_uv[loop_index] : false;
1687}
1688
1689static void rna_MeshUVLoop_pin_uv_set(PointerRNA *ptr, const bool value)
1690{
1691 Mesh *mesh = rna_mesh(ptr);
1692 int uv_map_index;
1693 int loop_index;
1694 if (get_uv_index_and_layer(ptr, &uv_map_index, &loop_index)) {
1696 uv_map_index);
1697 pin_uv.varray.set(loop_index, value);
1698 pin_uv.finish();
1699 }
1700}
1701
1702static void rna_MeshUVLoop_uv_get(PointerRNA *ptr, float *value)
1703{
1704 copy_v2_v2(value, static_cast<const float *>(ptr->data));
1705}
1706
1707static void rna_MeshUVLoop_uv_set(PointerRNA *ptr, const float *value)
1708{
1709 copy_v2_v2(static_cast<float *>(ptr->data), value);
1710}
1711
1712static std::optional<std::string> rna_MeshLoopColorLayer_path(const PointerRNA *ptr)
1713{
1714 const CustomDataLayer *cdl = static_cast<const CustomDataLayer *>(ptr->data);
1715 char name_esc[sizeof(cdl->name) * 2];
1716 BLI_str_escape(name_esc, cdl->name, sizeof(name_esc));
1717 return fmt::format("vertex_colors[\"{}\"]", name_esc);
1718}
1719
1720static std::optional<std::string> rna_MeshColor_path(const PointerRNA *ptr)
1721{
1722 return rna_LoopCustomData_data_path(ptr, "vertex_colors", CD_PROP_BYTE_COLOR);
1723}
1724
1725/***************************************/
1726
1727static int rna_Mesh_tot_vert_get(PointerRNA *ptr)
1728{
1729 Mesh *mesh = rna_mesh(ptr);
1730 return mesh->runtime->edit_mesh ? mesh->runtime->edit_mesh->bm->totvertsel : 0;
1731}
1732static int rna_Mesh_tot_edge_get(PointerRNA *ptr)
1733{
1734 Mesh *mesh = rna_mesh(ptr);
1735 return mesh->runtime->edit_mesh ? mesh->runtime->edit_mesh->bm->totedgesel : 0;
1736}
1737static int rna_Mesh_tot_face_get(PointerRNA *ptr)
1738{
1739 Mesh *mesh = rna_mesh(ptr);
1740 return mesh->runtime->edit_mesh ? mesh->runtime->edit_mesh->bm->totfacesel : 0;
1741}
1742
1743static PointerRNA rna_Mesh_vertex_color_new(Mesh *mesh,
1744 ReportList *reports,
1745 const char *name,
1746 const bool do_init)
1747{
1748 CustomData *ldata;
1749 CustomDataLayer *cdl = nullptr;
1750 int index = ED_mesh_color_add(mesh, name, false, do_init, reports);
1751
1752 if (index != -1) {
1753 ldata = rna_mesh_ldata_helper(mesh);
1754 cdl = &ldata->layers[CustomData_get_layer_index_n(ldata, CD_PROP_BYTE_COLOR, index)];
1755
1756 if (!mesh->active_color_attribute) {
1758 }
1759 if (!mesh->default_color_attribute) {
1761 }
1762 }
1763
1764 PointerRNA ptr = RNA_pointer_create_discrete(&mesh->id, &RNA_MeshLoopColorLayer, cdl);
1765 return ptr;
1766}
1767
1768static void rna_Mesh_vertex_color_remove(Mesh *mesh, ReportList *reports, CustomDataLayer *layer)
1769{
1771 BKE_attribute_remove(owner, layer->name, reports);
1772}
1773
1774static PointerRNA rna_Mesh_uv_layers_new(Mesh *mesh,
1775 ReportList *reports,
1776 const char *name,
1777 const bool do_init)
1778{
1779 CustomData *ldata;
1780 CustomDataLayer *cdl = nullptr;
1781 int index = ED_mesh_uv_add(mesh, name, false, do_init, reports);
1782
1783 if (index != -1) {
1784 ldata = rna_mesh_ldata_helper(mesh);
1785 cdl = &ldata->layers[CustomData_get_layer_index_n(ldata, CD_PROP_FLOAT2, index)];
1786 }
1787
1788 PointerRNA ptr = RNA_pointer_create_discrete(&mesh->id, &RNA_MeshUVLoopLayer, cdl);
1789 return ptr;
1790}
1791
1792static void rna_Mesh_uv_layers_remove(Mesh *mesh, ReportList *reports, CustomDataLayer *layer)
1793{
1794 using namespace blender;
1797 BKE_reportf(reports, RPT_ERROR, "UV map '%s' not found", layer->name);
1798 return;
1799 }
1800 BKE_attribute_remove(owner, layer->name, reports);
1801}
1802
1803static bool rna_Mesh_is_editmode_get(PointerRNA *ptr)
1804{
1805 Mesh *mesh = rna_mesh(ptr);
1806 return (mesh->runtime->edit_mesh != nullptr);
1807}
1808
1809static bool rna_Mesh_materials_override_apply(Main *bmain,
1810 RNAPropertyOverrideApplyContext &rnaapply_ctx)
1811{
1812 PointerRNA *ptr_dst = &rnaapply_ctx.ptr_dst;
1813 PropertyRNA *prop_dst = rnaapply_ctx.prop_dst;
1814 PointerRNA *ptr_item_dst = &rnaapply_ctx.ptr_item_dst;
1815 PointerRNA *ptr_item_src = &rnaapply_ctx.ptr_item_src;
1817
1819 "Unsupported RNA override operation on collections' objects");
1820 UNUSED_VARS_NDEBUG(opop);
1821
1822 Mesh *mesh_dst = (Mesh *)ptr_dst->owner_id;
1823
1824 if (ptr_item_dst->type == nullptr || ptr_item_src->type == nullptr) {
1825 // BLI_assert_msg(0, "invalid source or destination material.");
1826 return false;
1827 }
1828
1829 Material *mat_dst = static_cast<Material *>(ptr_item_dst->data);
1830 Material *mat_src = static_cast<Material *>(ptr_item_src->data);
1831
1832 if (mat_src == mat_dst) {
1833 return true;
1834 }
1835
1836 bool is_modified = false;
1837 for (int i = 0; i < mesh_dst->totcol; i++) {
1838 if (mesh_dst->mat[i] == mat_dst) {
1839 id_us_min(&mat_dst->id);
1840 mesh_dst->mat[i] = mat_src;
1841 id_us_plus(&mat_src->id);
1842 is_modified = true;
1843 }
1844 }
1845
1846 if (is_modified) {
1847 RNA_property_update_main(bmain, nullptr, ptr_dst, prop_dst);
1848 }
1849
1850 return true;
1851}
1852
1854
1855#else
1856
1857/* -------------------------------------------------------------------- */
1860
1862{
1863 StructRNA *srna;
1864 PropertyRNA *prop;
1865
1866 srna = RNA_def_struct(brna, "VertexGroupElement", nullptr);
1867 RNA_def_struct_sdna(srna, "MDeformWeight");
1868 RNA_def_struct_path_func(srna, "rna_VertexGroupElement_path");
1870 srna, "Vertex Group Element", "Weight value of a vertex in a vertex group");
1871 RNA_def_struct_ui_icon(srna, ICON_GROUP_VERTEX);
1872
1873 /* we can't point to actual group, it is in the object and so
1874 * there is no unique group to point to, hence the index */
1875 prop = RNA_def_property(srna, "group", PROP_INT, PROP_UNSIGNED);
1876 RNA_def_property_int_sdna(prop, nullptr, "def_nr");
1878 RNA_def_property_ui_text(prop, "Group Index", "");
1879 RNA_def_property_update(prop, 0, "rna_Mesh_update_data_legacy_deg_tag_all");
1880
1881 prop = RNA_def_property(srna, "weight", PROP_FLOAT, PROP_NONE);
1882 RNA_def_property_range(prop, 0.0f, 1.0f);
1883 RNA_def_property_ui_text(prop, "Weight", "Vertex Weight");
1884 RNA_def_property_update(prop, 0, "rna_Mesh_update_data_edit_weight");
1885}
1886
1887static void rna_def_mvert(BlenderRNA *brna)
1888{
1889 StructRNA *srna;
1890 PropertyRNA *prop;
1891
1892 srna = RNA_def_struct(brna, "MeshVertex", nullptr);
1893 RNA_def_struct_ui_text(srna, "Mesh Vertex", "Vertex in a Mesh data-block");
1894 RNA_def_struct_path_func(srna, "rna_MeshVertex_path");
1895 RNA_def_struct_ui_icon(srna, ICON_VERTEXSEL);
1896
1897 prop = RNA_def_property(srna, "co", PROP_FLOAT, PROP_TRANSLATION);
1898 RNA_def_property_array(prop, 3);
1899 RNA_def_property_float_funcs(prop, "rna_MeshVertex_co_get", "rna_MeshVertex_co_set", nullptr);
1900 RNA_def_property_ui_text(prop, "Position", "");
1901 RNA_def_property_update(prop, 0, "rna_Mesh_update_positions_tag");
1902
1903 prop = RNA_def_property(srna, "normal", PROP_FLOAT, PROP_DIRECTION);
1904 RNA_def_property_array(prop, 3);
1906 RNA_def_property_float_funcs(prop, "rna_MeshVertex_normal_get", nullptr, nullptr);
1907 RNA_def_property_ui_text(prop, "Normal", "Vertex Normal");
1908
1909 prop = RNA_def_property(srna, "select", PROP_BOOLEAN, PROP_NONE);
1910 RNA_def_property_boolean_funcs(prop, "rna_MeshVertex_select_get", "rna_MeshVertex_select_set");
1912 RNA_def_property_ui_text(prop, "Select", "");
1913 RNA_def_property_update(prop, 0, "rna_Mesh_update_select");
1914
1915 prop = RNA_def_property(srna, "hide", PROP_BOOLEAN, PROP_NONE);
1917 RNA_def_property_ui_text(prop, "Hide", "");
1918 RNA_def_property_boolean_funcs(prop, "rna_MeshVertex_hide_get", "rna_MeshVertex_hide_set");
1919 RNA_def_property_update(prop, 0, "rna_Mesh_update_select");
1920
1921 prop = RNA_def_property(srna, "groups", PROP_COLLECTION, PROP_NONE);
1923 "rna_MeshVertex_groups_begin",
1924 "rna_iterator_array_next",
1925 "rna_iterator_array_end",
1926 "rna_iterator_array_get",
1927 nullptr,
1928 nullptr,
1929 nullptr,
1930 nullptr);
1931 RNA_def_property_struct_type(prop, "VertexGroupElement");
1933 prop, "Groups", "Weights for the vertex groups this vertex is member of");
1934
1935 prop = RNA_def_property(srna, "index", PROP_INT, PROP_UNSIGNED);
1937 RNA_def_property_int_funcs(prop, "rna_MeshVertex_index_get", nullptr, nullptr);
1938 RNA_def_property_ui_text(prop, "Index", "Index of this vertex");
1939
1940 prop = RNA_def_property(srna, "undeformed_co", PROP_FLOAT, PROP_TRANSLATION);
1941 RNA_def_property_array(prop, 3);
1943 prop,
1944 "Undeformed Location",
1945 "For meshes with modifiers applied, the coordinate of the vertex with no deforming "
1946 "modifiers applied, as used for generated texture coordinates");
1947 RNA_def_property_float_funcs(prop, "rna_MeshVertex_undeformed_co_get", nullptr, nullptr);
1949}
1950
1951static void rna_def_medge(BlenderRNA *brna)
1952{
1953 StructRNA *srna;
1954 PropertyRNA *prop;
1955
1956 srna = RNA_def_struct(brna, "MeshEdge", nullptr);
1957 RNA_def_struct_sdna(srna, "vec2i");
1958 RNA_def_struct_ui_text(srna, "Mesh Edge", "Edge in a Mesh data-block");
1959 RNA_def_struct_path_func(srna, "rna_MeshEdge_path");
1960 RNA_def_struct_ui_icon(srna, ICON_EDGESEL);
1961
1962 prop = RNA_def_property(srna, "vertices", PROP_INT, PROP_UNSIGNED);
1963 RNA_def_property_int_sdna(prop, nullptr, "x");
1964 RNA_def_property_array(prop, 2);
1966 RNA_def_property_ui_text(prop, "Vertices", "Vertex indices");
1967 /* XXX allows creating invalid meshes */
1968
1969 prop = RNA_def_property(srna, "select", PROP_BOOLEAN, PROP_NONE);
1970 RNA_def_property_boolean_funcs(prop, "rna_MeshEdge_select_get", "rna_MeshEdge_select_set");
1972 RNA_def_property_ui_text(prop, "Select", "");
1973 RNA_def_property_update(prop, 0, "rna_Mesh_update_select");
1974
1975 prop = RNA_def_property(srna, "hide", PROP_BOOLEAN, PROP_NONE);
1977 RNA_def_property_ui_text(prop, "Hide", "");
1978 RNA_def_property_boolean_funcs(prop, "rna_MeshEdge_hide_get", "rna_MeshEdge_hide_set");
1979 RNA_def_property_update(prop, 0, "rna_Mesh_update_select");
1980
1981 prop = RNA_def_property(srna, "use_seam", PROP_BOOLEAN, PROP_NONE);
1982 RNA_def_property_boolean_funcs(prop, "rna_MeshEdge_use_seam_get", "rna_MeshEdge_use_seam_set");
1983 RNA_def_property_ui_text(prop, "Seam", "Seam edge for UV unwrapping");
1984 RNA_def_property_update(prop, 0, "rna_Mesh_update_select");
1985
1986 prop = RNA_def_property(srna, "use_edge_sharp", PROP_BOOLEAN, PROP_NONE);
1988 prop, "rna_MeshEdge_use_edge_sharp_get", "rna_MeshEdge_use_edge_sharp_set");
1989 RNA_def_property_ui_text(prop, "Sharp", "Sharp edge for shading");
1990 RNA_def_property_update(prop, 0, "rna_Mesh_update_data_legacy_deg_tag_all");
1991
1992 prop = RNA_def_property(srna, "is_loose", PROP_BOOLEAN, PROP_NONE);
1994 RNA_def_property_boolean_funcs(prop, "rna_MeshEdge_is_loose_get", nullptr);
1995 RNA_def_property_ui_text(prop, "Loose", "Edge is not connected to any faces");
1996
1997 prop = RNA_def_property(srna, "index", PROP_INT, PROP_UNSIGNED);
1999 RNA_def_property_int_funcs(prop, "rna_MeshEdge_index_get", nullptr, nullptr);
2000 RNA_def_property_ui_text(prop, "Index", "Index of this edge");
2001}
2002
2004{
2005 StructRNA *srna;
2006 PropertyRNA *prop;
2007 const int splitnor_dim[] = {3, 3};
2008
2009 srna = RNA_def_struct(brna, "MeshLoopTriangle", nullptr);
2010 RNA_def_struct_sdna(srna, "vec3i");
2011 RNA_def_struct_ui_text(srna, "Mesh Loop Triangle", "Tessellated triangle in a Mesh data-block");
2012 RNA_def_struct_path_func(srna, "rna_MeshLoopTriangle_path");
2013 RNA_def_struct_ui_icon(srna, ICON_FACESEL);
2014
2015 prop = RNA_def_property(srna, "vertices", PROP_INT, PROP_UNSIGNED);
2016 RNA_def_property_array(prop, 3);
2017 RNA_def_property_int_funcs(prop, "rna_MeshLoopTriangle_verts_get", nullptr, nullptr);
2018 RNA_def_property_ui_text(prop, "Vertices", "Indices of triangle vertices");
2020
2021 prop = RNA_def_property(srna, "loops", PROP_INT, PROP_UNSIGNED);
2022 RNA_def_property_int_sdna(prop, nullptr, "x");
2023 RNA_def_property_array(prop, 3);
2024 RNA_def_property_ui_text(prop, "Loops", "Indices of mesh loops that make up the triangle");
2026
2027 prop = RNA_def_property(srna, "polygon_index", PROP_INT, PROP_UNSIGNED);
2028 RNA_def_property_int_funcs(prop, "rna_MeshLoopTriangle_polygon_index_get", nullptr, nullptr);
2029 RNA_def_property_ui_text(prop, "Polygon", "Index of mesh face that the triangle is a part of");
2031
2032 prop = RNA_def_property(srna, "normal", PROP_FLOAT, PROP_DIRECTION);
2033 RNA_def_property_array(prop, 3);
2034 RNA_def_property_range(prop, -1.0f, 1.0f);
2036 RNA_def_property_float_funcs(prop, "rna_MeshLoopTriangle_normal_get", nullptr, nullptr);
2038 prop, "Triangle Normal", "Local space unit length normal vector for this triangle");
2039
2040 prop = RNA_def_property(srna, "split_normals", PROP_FLOAT, PROP_DIRECTION);
2041 RNA_def_property_multi_array(prop, 2, splitnor_dim);
2042 RNA_def_property_range(prop, -1.0f, 1.0f);
2044 RNA_def_property_float_funcs(prop, "rna_MeshLoopTriangle_split_normals_get", nullptr, nullptr);
2046 prop,
2047 "Custom Normals",
2048 "Local space unit length custom normal vectors of the face corners of this triangle");
2049
2050 prop = RNA_def_property(srna, "area", PROP_FLOAT, PROP_UNSIGNED);
2052 RNA_def_property_float_funcs(prop, "rna_MeshLoopTriangle_area_get", nullptr, nullptr);
2053 RNA_def_property_ui_text(prop, "Triangle Area", "Area of this triangle");
2054
2055 prop = RNA_def_property(srna, "index", PROP_INT, PROP_UNSIGNED);
2057 RNA_def_property_int_funcs(prop, "rna_MeshLoopTriangle_index_get", nullptr, nullptr);
2058 RNA_def_property_ui_text(prop, "Index", "Index of this loop triangle");
2059
2060 prop = RNA_def_property(srna, "material_index", PROP_INT, PROP_UNSIGNED);
2062 RNA_def_property_int_funcs(prop, "rna_MeshLoopTriangle_material_index_get", nullptr, nullptr);
2063 RNA_def_property_ui_text(prop, "Material Index", "Material slot index of this triangle");
2064
2065 prop = RNA_def_property(srna, "use_smooth", PROP_BOOLEAN, PROP_NONE);
2067 RNA_def_property_boolean_funcs(prop, "rna_MeshLoopTriangle_use_smooth_get", nullptr);
2068 RNA_def_property_ui_text(prop, "Smooth", "");
2069}
2070
2071static void rna_def_mloop(BlenderRNA *brna)
2072{
2073 StructRNA *srna;
2074 PropertyRNA *prop;
2075
2076 srna = RNA_def_struct(brna, "MeshLoop", nullptr);
2077 RNA_def_struct_ui_text(srna, "Mesh Loop", "Loop in a Mesh data-block");
2078 RNA_def_struct_path_func(srna, "rna_MeshLoop_path");
2079 RNA_def_struct_ui_icon(srna, ICON_EDGESEL);
2080
2081 prop = RNA_def_property(srna, "vertex_index", PROP_INT, PROP_UNSIGNED);
2083 prop, "rna_MeshLoop_vertex_index_get", "rna_MeshLoop_vertex_index_set", nullptr);
2085 RNA_def_property_ui_text(prop, "Vertex", "Vertex index");
2086
2087 prop = RNA_def_property(srna, "edge_index", PROP_INT, PROP_UNSIGNED);
2089 prop, "rna_MeshLoop_edge_index_get", "rna_MeshLoop_edge_index_set", nullptr);
2091 RNA_def_property_ui_text(prop, "Edge", "Edge index");
2092
2093 prop = RNA_def_property(srna, "index", PROP_INT, PROP_UNSIGNED);
2095 RNA_def_property_int_funcs(prop, "rna_MeshLoop_index_get", nullptr, nullptr);
2096 RNA_def_property_ui_text(prop, "Index", "Index of this loop");
2097
2098 prop = RNA_def_property(srna, "normal", PROP_FLOAT, PROP_DIRECTION);
2100 RNA_def_property_array(prop, 3);
2101 RNA_def_property_range(prop, -1.0f, 1.0f);
2102 RNA_def_property_float_funcs(prop, "rna_MeshLoop_normal_get", nullptr, nullptr);
2104 "Normal",
2105 "The normal direction of the face corner, taking into account sharp "
2106 "faces, sharp edges, and custom normal data");
2107
2108 prop = RNA_def_property(srna, "tangent", PROP_FLOAT, PROP_DIRECTION);
2109 RNA_def_property_array(prop, 3);
2110 RNA_def_property_range(prop, -1.0f, 1.0f);
2112 RNA_def_property_float_funcs(prop, "rna_MeshLoop_tangent_get", nullptr, nullptr);
2114 "Tangent",
2115 "Local space unit length tangent vector of this vertex for this face "
2116 "(must be computed beforehand using calc_tangents)");
2117
2118 prop = RNA_def_property(srna, "bitangent_sign", PROP_FLOAT, PROP_NONE);
2119 RNA_def_property_range(prop, -1.0f, 1.0f);
2121 RNA_def_property_float_funcs(prop, "rna_MeshLoop_bitangent_sign_get", nullptr, nullptr);
2123 prop,
2124 "Bitangent Sign",
2125 "Sign of the bitangent vector of this vertex for this face (must be computed "
2126 "beforehand using calc_tangents, bitangent = bitangent_sign * cross(normal, tangent))");
2127
2128 prop = RNA_def_property(srna, "bitangent", PROP_FLOAT, PROP_DIRECTION);
2129 RNA_def_property_array(prop, 3);
2130 RNA_def_property_range(prop, -1.0f, 1.0f);
2132 RNA_def_property_float_funcs(prop, "rna_MeshLoop_bitangent_get", nullptr, nullptr);
2134 prop,
2135 "Bitangent",
2136 "Bitangent vector of this vertex for this face (must be computed beforehand using "
2137 "calc_tangents, use it only if really needed, slower access than bitangent_sign)");
2138}
2139
2141{
2142 StructRNA *srna;
2143 PropertyRNA *prop;
2144 FunctionRNA *func;
2145
2146 srna = RNA_def_struct(brna, "MeshPolygon", nullptr);
2147 RNA_def_struct_sdna(srna, "MIntProperty");
2148 RNA_def_struct_ui_text(srna, "Mesh Polygon", "Polygon in a Mesh data-block");
2149 RNA_def_struct_path_func(srna, "rna_MeshPolygon_path");
2150 RNA_def_struct_ui_icon(srna, ICON_FACESEL);
2151
2152 /* Faked, actually access to loop vertex values, don't this way because manually setting up
2153 * vertex/edge per loop is very low level.
2154 * Instead we setup face sizes, assign indices, then calc edges automatic when creating
2155 * meshes from rna/py. */
2156 prop = RNA_def_property(srna, "vertices", PROP_INT, PROP_UNSIGNED);
2157 /* Eek, this is still used in some cases but in fact we don't want to use it at all here. */
2158 RNA_def_property_array(prop, 3);
2160 RNA_def_property_dynamic_array_funcs(prop, "rna_MeshPoly_vertices_get_length");
2162 prop, "rna_MeshPoly_vertices_get", "rna_MeshPoly_vertices_set", nullptr);
2164 RNA_def_property_ui_text(prop, "Vertices", "Vertex indices");
2165
2166 /* these are both very low level access */
2167 prop = RNA_def_property(srna, "loop_start", PROP_INT, PROP_UNSIGNED);
2168 RNA_def_property_int_sdna(prop, nullptr, "i");
2170 RNA_def_property_ui_text(prop, "Loop Start", "Index of the first loop of this face");
2171 /* also low level */
2172 prop = RNA_def_property(srna, "loop_total", PROP_INT, PROP_UNSIGNED);
2174 RNA_def_property_int_funcs(prop, "rna_MeshPolygon_loop_total_get", nullptr, nullptr);
2175 RNA_def_property_ui_text(prop, "Loop Total", "Number of loops used by this face");
2176
2177 prop = RNA_def_property(srna, "material_index", PROP_INT, PROP_UNSIGNED);
2179 prop, "rna_MeshPolygon_material_index_get", "rna_MeshPolygon_material_index_set", nullptr);
2180 RNA_def_property_ui_text(prop, "Material Index", "Material slot index of this face");
2181# if 0
2182 RNA_def_property_int_funcs(prop, nullptr, nullptr, "rna_MeshPoly_material_index_range");
2183# endif
2184 RNA_def_property_update(prop, 0, "rna_Mesh_update_data_legacy_deg_tag_all");
2185
2186 prop = RNA_def_property(srna, "select", PROP_BOOLEAN, PROP_NONE);
2187 RNA_def_property_boolean_funcs(prop, "rna_MeshPolygon_select_get", "rna_MeshPolygon_select_set");
2189 RNA_def_property_ui_text(prop, "Select", "");
2190 RNA_def_property_update(prop, 0, "rna_Mesh_update_select");
2191
2192 prop = RNA_def_property(srna, "hide", PROP_BOOLEAN, PROP_NONE);
2194 RNA_def_property_ui_text(prop, "Hide", "");
2195 RNA_def_property_boolean_funcs(prop, "rna_MeshPolygon_hide_get", "rna_MeshPolygon_hide_set");
2196 RNA_def_property_update(prop, 0, "rna_Mesh_update_select");
2197
2198 prop = RNA_def_property(srna, "use_smooth", PROP_BOOLEAN, PROP_NONE);
2200 prop, "rna_MeshPolygon_use_smooth_get", "rna_MeshPolygon_use_smooth_set");
2201 RNA_def_property_ui_text(prop, "Smooth", "");
2202 RNA_def_property_update(prop, 0, "rna_Mesh_update_data_legacy_deg_tag_all");
2203
2204 prop = RNA_def_property(srna, "normal", PROP_FLOAT, PROP_DIRECTION);
2205 RNA_def_property_array(prop, 3);
2206 RNA_def_property_range(prop, -1.0f, 1.0f);
2208 RNA_def_property_float_funcs(prop, "rna_MeshPolygon_normal_get", nullptr, nullptr);
2210 prop, "Polygon Normal", "Local space unit length normal vector for this face");
2211
2212 prop = RNA_def_property(srna, "center", PROP_FLOAT, PROP_XYZ);
2213 RNA_def_property_array(prop, 3);
2215 RNA_def_property_float_funcs(prop, "rna_MeshPolygon_center_get", nullptr, nullptr);
2216 RNA_def_property_ui_text(prop, "Polygon Center", "Center of this face");
2217
2218 prop = RNA_def_property(srna, "area", PROP_FLOAT, PROP_UNSIGNED);
2220 RNA_def_property_float_funcs(prop, "rna_MeshPolygon_area_get", nullptr, nullptr);
2221 RNA_def_property_ui_text(prop, "Polygon Area", "Read only area of this face");
2222
2223 prop = RNA_def_property(srna, "index", PROP_INT, PROP_UNSIGNED);
2225 RNA_def_property_int_funcs(prop, "rna_MeshPolygon_index_get", nullptr, nullptr);
2226 RNA_def_property_ui_text(prop, "Index", "Index of this face");
2227
2228 func = RNA_def_function(srna, "flip", "rna_MeshPolygon_flip");
2230 RNA_def_function_ui_description(func, "Invert winding of this face (flip its normal)");
2231}
2232
2233/* mesh.loop_uvs */
2234static void rna_def_mloopuv(BlenderRNA *brna)
2235{
2236 FunctionRNA *func;
2237 StructRNA *srna;
2238 PropertyRNA *prop, *parm;
2239
2240 srna = RNA_def_struct(brna, "MeshUVLoopLayer", nullptr);
2241 RNA_def_struct_sdna(srna, "CustomDataLayer");
2242 RNA_def_struct_path_func(srna, "rna_MeshUVLoopLayer_path");
2243
2244 prop = RNA_def_property(srna, "data", PROP_COLLECTION, PROP_NONE);
2245 RNA_def_property_struct_type(prop, "MeshUVLoop");
2247 prop,
2248 "MeshUVLoop (Deprecated)",
2249 "Deprecated, use 'uv', 'vertex_select', 'edge_select' or 'pin' properties instead");
2252 "rna_MeshUVLoopLayer_data_begin",
2253 "rna_iterator_array_next",
2254 "rna_iterator_array_end",
2255 "rna_iterator_array_get",
2256 "rna_MeshUVLoopLayer_data_length",
2257 nullptr,
2258 nullptr,
2259 nullptr);
2260
2261 prop = RNA_def_property(srna, "name", PROP_STRING, PROP_NONE);
2262 RNA_def_struct_name_property(srna, prop);
2263 RNA_def_property_string_funcs(prop, nullptr, nullptr, "rna_MeshLoopLayer_name_set");
2265 RNA_def_property_ui_text(prop, "Name", "Name of UV map");
2266 RNA_def_property_update(prop, 0, "rna_Mesh_update_data_legacy_deg_tag_all");
2267
2268 prop = RNA_def_property(srna, "active", PROP_BOOLEAN, PROP_NONE);
2270 prop, "rna_MeshUVLoopLayer_active_get", "rna_MeshUVLoopLayer_active_set");
2272 RNA_def_property_ui_text(prop, "Active", "Set the map as active for display and editing");
2273 RNA_def_property_update(prop, 0, "rna_Mesh_update_data_legacy_deg_tag_all");
2274
2275 prop = RNA_def_property(srna, "active_render", PROP_BOOLEAN, PROP_NONE);
2276 RNA_def_property_boolean_sdna(prop, nullptr, "active_rnd", 0);
2278 prop, "rna_MeshUVLoopLayer_active_render_get", "rna_MeshUVLoopLayer_active_render_set");
2280 RNA_def_property_ui_text(prop, "Active Render", "Set the UV map as active for rendering");
2281 RNA_def_property_update(prop, 0, "rna_Mesh_update_data_legacy_deg_tag_all");
2282
2283 prop = RNA_def_property(srna, "active_clone", PROP_BOOLEAN, PROP_NONE);
2284 RNA_def_property_boolean_sdna(prop, nullptr, "active_clone", 0);
2286 prop, "rna_MeshUVLoopLayer_clone_get", "rna_MeshUVLoopLayer_clone_set");
2288 RNA_def_property_ui_text(prop, "Active Clone", "Set the map as active for cloning");
2289 RNA_def_property_update(prop, 0, "rna_Mesh_update_data_legacy_deg_tag_all");
2290
2291 prop = RNA_def_property(srna, "uv", PROP_COLLECTION, PROP_NONE);
2292 RNA_def_property_struct_type(prop, "Float2AttributeValue");
2293 RNA_def_property_ui_text(prop, "UV", "UV coordinates on face corners");
2296 "rna_MeshUVLoopLayer_uv_begin",
2297 "rna_iterator_array_next",
2298 "rna_iterator_array_end",
2299 "rna_iterator_array_get",
2300 "rna_MeshUVLoopLayer_data_length",
2301 "rna_MeshUVLoopLayer_uv_lookup_int",
2302 nullptr,
2303 nullptr);
2304
2305 prop = RNA_def_property(srna, "pin", PROP_COLLECTION, PROP_NONE);
2306 RNA_def_property_struct_type(prop, "BoolAttributeValue");
2308 RNA_def_property_ui_text(prop, "UV Pin", "UV pinned state in the UV editor");
2311 "rna_MeshUVLoopLayer_pin_begin",
2312 "rna_iterator_array_next",
2313 "rna_iterator_array_end",
2314 "rna_iterator_array_get",
2315 "rna_MeshUVLoopLayer_pin_length",
2316 "rna_MeshUVLoopLayer_pin_lookup_int",
2317 nullptr,
2318 nullptr);
2319
2320 func = RNA_def_function(srna, "pin_ensure", "rna_MeshUVLoopLayer_pin_ensure");
2322 parm = RNA_def_pointer(func, "layer", "BoolAttribute", "", "The boolean attribute");
2324 RNA_def_function_return(func, parm);
2325
2326 srna = RNA_def_struct(brna, "MeshUVLoop", nullptr);
2328 srna, "Mesh UV Layer", "(Deprecated) Layer of UV coordinates in a Mesh data-block");
2329 RNA_def_struct_path_func(srna, "rna_MeshUVLoop_path");
2330
2331 prop = RNA_def_property(srna, "uv", PROP_FLOAT, PROP_XYZ);
2332 RNA_def_property_array(prop, 2);
2333 RNA_def_property_float_funcs(prop, "rna_MeshUVLoop_uv_get", "rna_MeshUVLoop_uv_set", nullptr);
2334 RNA_def_property_update(prop, 0, "rna_Mesh_update_data_legacy_deg_tag_all");
2335
2336 prop = RNA_def_property(srna, "pin_uv", PROP_BOOLEAN, PROP_NONE);
2337 RNA_def_property_boolean_funcs(prop, "rna_MeshUVLoop_pin_uv_get", "rna_MeshUVLoop_pin_uv_set");
2339 RNA_def_property_ui_text(prop, "UV Pinned", "");
2340}
2341
2343{
2344 StructRNA *srna;
2345 PropertyRNA *prop;
2346
2347 srna = RNA_def_struct(brna, "MeshLoopColorLayer", nullptr);
2349 srna, "Mesh Vertex Color Layer", "Layer of vertex colors in a Mesh data-block");
2350 RNA_def_struct_sdna(srna, "CustomDataLayer");
2351 RNA_def_struct_path_func(srna, "rna_MeshLoopColorLayer_path");
2352 RNA_def_struct_ui_icon(srna, ICON_GROUP_VCOL);
2353
2354 prop = RNA_def_property(srna, "name", PROP_STRING, PROP_NONE);
2355 RNA_def_struct_name_property(srna, prop);
2356 RNA_def_property_string_funcs(prop, nullptr, nullptr, "rna_MeshLoopLayer_name_set");
2358 RNA_def_property_ui_text(prop, "Name", "Name of Vertex color layer");
2359 RNA_def_property_update(prop, 0, "rna_Mesh_update_data_legacy_deg_tag_all");
2360
2361 prop = RNA_def_property(srna, "active", PROP_BOOLEAN, PROP_NONE);
2362 RNA_def_property_boolean_funcs(prop, "rna_mesh_color_active_get", "rna_mesh_color_active_set");
2364 RNA_def_property_ui_text(prop, "Active", "Sets the layer as active for display and editing");
2365 RNA_def_property_update(prop, 0, "rna_Mesh_update_data_legacy_deg_tag_all");
2366
2367 prop = RNA_def_property(srna, "active_render", PROP_BOOLEAN, PROP_NONE);
2368 RNA_def_property_boolean_sdna(prop, nullptr, "active_rnd", 0);
2370 prop, "rna_mesh_color_active_render_get", "rna_mesh_color_active_render_set");
2372 RNA_def_property_ui_text(prop, "Active Render", "Sets the layer as active for rendering");
2373 RNA_def_property_update(prop, 0, "rna_Mesh_update_data_legacy_deg_tag_all");
2374
2375 prop = RNA_def_property(srna, "data", PROP_COLLECTION, PROP_NONE);
2376 RNA_def_property_struct_type(prop, "MeshLoopColor");
2377 RNA_def_property_ui_text(prop, "Data", "");
2380 "rna_MeshLoopColorLayer_data_begin",
2381 "rna_iterator_array_next",
2382 "rna_iterator_array_end",
2383 "rna_iterator_array_get",
2384 "rna_MeshLoopColorLayer_data_length",
2385 nullptr,
2386 nullptr,
2387 nullptr);
2388
2389 srna = RNA_def_struct(brna, "MeshLoopColor", nullptr);
2390 RNA_def_struct_sdna(srna, "MLoopCol");
2391 RNA_def_struct_ui_text(srna, "Mesh Vertex Color", "Vertex loop colors in a Mesh");
2392 RNA_def_struct_path_func(srna, "rna_MeshColor_path");
2393
2394 prop = RNA_def_property(srna, "color", PROP_FLOAT, PROP_COLOR);
2395 RNA_def_property_array(prop, 4);
2396 RNA_def_property_range(prop, 0.0f, 1.0f);
2398 prop, "rna_MeshLoopColor_color_get", "rna_MeshLoopColor_color_set", nullptr);
2399 RNA_def_property_ui_text(prop, "Color", "Color in sRGB color space");
2400 RNA_def_property_update(prop, 0, "rna_Mesh_update_data_legacy_deg_tag_all");
2401}
2402
2403void rna_def_texmat_common(StructRNA *srna, const char *texspace_editable)
2404{
2405 PropertyRNA *prop;
2406
2407 /* texture space */
2408 prop = RNA_def_property(srna, "auto_texspace", PROP_BOOLEAN, PROP_NONE);
2409 RNA_def_property_boolean_sdna(prop, nullptr, "texspace_flag", ME_TEXSPACE_FLAG_AUTO);
2411 prop,
2412 "Auto Texture Space",
2413 "Adjust active object's texture space automatically when transforming object");
2414
2415 prop = RNA_def_property(srna, "texspace_location", PROP_FLOAT, PROP_TRANSLATION);
2416 RNA_def_property_float_sdna(prop, nullptr, "texspace_location");
2417 RNA_def_property_ui_text(prop, "Texture Space Location", "Texture space location");
2418 RNA_def_property_float_funcs(prop, "rna_Mesh_texspace_location_get", nullptr, nullptr);
2419 RNA_def_property_editable_func(prop, texspace_editable);
2420 RNA_def_property_update(prop, 0, "rna_Mesh_update_data_legacy_deg_tag_all");
2421
2422 prop = RNA_def_property(srna, "texspace_size", PROP_FLOAT, PROP_XYZ);
2423 RNA_def_property_float_sdna(prop, nullptr, "texspace_size");
2425 RNA_def_property_ui_text(prop, "Texture Space Size", "Texture space size");
2426 RNA_def_property_float_funcs(prop, "rna_Mesh_texspace_size_get", nullptr, nullptr);
2427 RNA_def_property_editable_func(prop, texspace_editable);
2428 RNA_def_property_update(prop, 0, "rna_Mesh_update_data_legacy_deg_tag_all");
2429
2430 /* materials */
2431 prop = RNA_def_property(srna, "materials", PROP_COLLECTION, PROP_NONE);
2432 RNA_def_property_collection_sdna(prop, nullptr, "mat", "totcol");
2433 RNA_def_property_struct_type(prop, "Material");
2434 RNA_def_property_ui_text(prop, "Materials", "");
2435 RNA_def_property_srna(prop, "IDMaterials"); /* see rna_ID.cc */
2437 RNA_def_property_override_funcs(prop, nullptr, nullptr, "rna_Mesh_materials_override_apply");
2439 nullptr,
2440 nullptr,
2441 nullptr,
2442 nullptr,
2443 nullptr,
2444 nullptr,
2445 nullptr,
2446 "rna_IDMaterials_assign_int");
2447}
2448
2449/* scene.objects */
2450/* mesh.vertices */
2452{
2453 StructRNA *srna;
2454 // PropertyRNA *prop;
2455
2456 FunctionRNA *func;
2457 PropertyRNA *parm;
2458
2459 RNA_def_property_srna(cprop, "MeshVertices");
2460 srna = RNA_def_struct(brna, "MeshVertices", nullptr);
2461 RNA_def_struct_sdna(srna, "Mesh");
2462 RNA_def_struct_ui_text(srna, "Mesh Vertices", "Collection of mesh vertices");
2463
2464 func = RNA_def_function(srna, "add", "ED_mesh_verts_add");
2466 parm = RNA_def_int(
2467 func, "count", 0, 0, INT_MAX, "Count", "Number of vertices to add", 0, INT_MAX);
2469# if 0 /* BMESH_TODO Remove until BMesh merge */
2470 func = RNA_def_function(srna, "remove", "ED_mesh_verts_remove");
2472 RNA_def_int(func, "count", 0, 0, INT_MAX, "Count", "Number of vertices to remove", 0, INT_MAX);
2473# endif
2474}
2475
2476/* mesh.edges */
2478{
2479 StructRNA *srna;
2480 // PropertyRNA *prop;
2481
2482 FunctionRNA *func;
2483 PropertyRNA *parm;
2484
2485 RNA_def_property_srna(cprop, "MeshEdges");
2486 srna = RNA_def_struct(brna, "MeshEdges", nullptr);
2487 RNA_def_struct_sdna(srna, "Mesh");
2488 RNA_def_struct_ui_text(srna, "Mesh Edges", "Collection of mesh edges");
2489
2490 func = RNA_def_function(srna, "add", "ED_mesh_edges_add");
2492 parm = RNA_def_int(func, "count", 0, 0, INT_MAX, "Count", "Number of edges to add", 0, INT_MAX);
2494# if 0 /* BMESH_TODO Remove until BMesh merge */
2495 func = RNA_def_function(srna, "remove", "ED_mesh_edges_remove");
2497 RNA_def_int(func, "count", 0, 0, INT_MAX, "Count", "Number of edges to remove", 0, INT_MAX);
2498# endif
2499}
2500
2501/* mesh.loop_triangles */
2503{
2504 StructRNA *srna;
2505
2506 RNA_def_property_srna(cprop, "MeshLoopTriangles");
2507 srna = RNA_def_struct(brna, "MeshLoopTriangles", nullptr);
2508 RNA_def_struct_sdna(srna, "Mesh");
2510 srna, "Mesh Loop Triangles", "Tessellation of mesh polygons into triangles");
2511}
2512
2513/* mesh.loops */
2515{
2516 StructRNA *srna;
2517
2518 // PropertyRNA *prop;
2519
2520 FunctionRNA *func;
2521 PropertyRNA *parm;
2522
2523 RNA_def_property_srna(cprop, "MeshLoops");
2524 srna = RNA_def_struct(brna, "MeshLoops", nullptr);
2525 RNA_def_struct_sdna(srna, "Mesh");
2526 RNA_def_struct_ui_text(srna, "Mesh Loops", "Collection of mesh loops");
2527
2528 func = RNA_def_function(srna, "add", "ED_mesh_loops_add");
2530 parm = RNA_def_int(func, "count", 0, 0, INT_MAX, "Count", "Number of loops to add", 0, INT_MAX);
2532}
2533
2534/* mesh.polygons */
2536{
2537 StructRNA *srna;
2538
2539 PropertyRNA *prop;
2540
2541 FunctionRNA *func;
2542 PropertyRNA *parm;
2543
2544 RNA_def_property_srna(cprop, "MeshPolygons");
2545 srna = RNA_def_struct(brna, "MeshPolygons", nullptr);
2546 RNA_def_struct_sdna(srna, "Mesh");
2547 RNA_def_struct_ui_text(srna, "Mesh Polygons", "Collection of mesh polygons");
2548
2549 prop = RNA_def_property(srna, "active", PROP_INT, PROP_NONE);
2550 RNA_def_property_int_sdna(prop, nullptr, "act_face");
2552 RNA_def_property_ui_text(prop, "Active Polygon", "The active face for this mesh");
2553
2554 func = RNA_def_function(srna, "add", "ED_mesh_faces_add");
2556 parm = RNA_def_int(
2557 func, "count", 0, 0, INT_MAX, "Count", "Number of polygons to add", 0, INT_MAX);
2559}
2560
2561/* Defines a read-only vector type since normals can not be modified manually. */
2563{
2564 StructRNA *srna = RNA_def_struct(brna, "MeshNormalValue", nullptr);
2565 RNA_def_struct_sdna(srna, "vec3f");
2566 RNA_def_struct_ui_text(srna, "Mesh Normal Vector", "Vector in a mesh normal array");
2567
2568 PropertyRNA *prop = RNA_def_property(srna, "vector", PROP_FLOAT, PROP_DIRECTION);
2569 RNA_def_property_ui_text(prop, "Vector", "3D vector");
2570 RNA_def_property_float_sdna(prop, nullptr, "x");
2571 RNA_def_property_array(prop, 3);
2573}
2574
2576{
2577 StructRNA *srna;
2578 PropertyRNA *prop;
2579
2580 FunctionRNA *func;
2581 PropertyRNA *parm;
2582
2583 RNA_def_property_srna(cprop, "LoopColors");
2584 srna = RNA_def_struct(brna, "LoopColors", nullptr);
2585 RNA_def_struct_sdna(srna, "Mesh");
2586 RNA_def_struct_ui_text(srna, "Loop Colors", "Collection of vertex colors");
2587
2588 func = RNA_def_function(srna, "new", "rna_Mesh_vertex_color_new");
2589 RNA_def_function_ui_description(func, "Add a vertex color layer to Mesh");
2591 RNA_def_string(func, "name", "Col", 0, "", "Vertex color name");
2592 RNA_def_boolean(func,
2593 "do_init",
2594 true,
2595 "",
2596 "Whether new layer's data should be initialized by copying current active one");
2597 parm = RNA_def_pointer(func, "layer", "MeshLoopColorLayer", "", "The newly created layer");
2599 RNA_def_function_return(func, parm);
2600
2601 func = RNA_def_function(srna, "remove", "rna_Mesh_vertex_color_remove");
2602 RNA_def_function_ui_description(func, "Remove a vertex color layer");
2604 parm = RNA_def_pointer(func, "layer", "MeshLoopColorLayer", "", "The layer to remove");
2607
2608 prop = RNA_def_property(srna, "active", PROP_POINTER, PROP_NONE);
2609 RNA_def_property_struct_type(prop, "MeshLoopColorLayer");
2611 "rna_Mesh_vertex_color_active_get",
2612 "rna_Mesh_vertex_color_active_set",
2613 nullptr,
2614 nullptr);
2616 RNA_def_property_ui_text(prop, "Active Vertex Color Layer", "Active vertex color layer");
2617 RNA_def_property_update(prop, 0, "rna_Mesh_update_data_edit_active_color");
2618
2619 prop = RNA_def_property(srna, "active_index", PROP_INT, PROP_UNSIGNED);
2621 "rna_Mesh_vertex_color_active_index_get",
2622 "rna_Mesh_vertex_color_active_index_set",
2623 "rna_Mesh_vertex_color_index_range");
2625 RNA_def_property_ui_text(prop, "Active Vertex Color Index", "Active vertex color index");
2626 RNA_def_property_update(prop, 0, "rna_Mesh_update_data_edit_active_color");
2627}
2628
2629static void rna_def_uv_layers(BlenderRNA *brna, PropertyRNA *cprop)
2630{
2631 StructRNA *srna;
2632 PropertyRNA *prop;
2633
2634 FunctionRNA *func;
2635 PropertyRNA *parm;
2636
2637 RNA_def_property_srna(cprop, "UVLoopLayers");
2638 srna = RNA_def_struct(brna, "UVLoopLayers", nullptr);
2639 RNA_def_struct_sdna(srna, "Mesh");
2640 RNA_def_struct_ui_text(srna, "UV Map Layers", "Collection of UV map layers");
2641
2642 func = RNA_def_function(srna, "new", "rna_Mesh_uv_layers_new");
2644 RNA_def_function_ui_description(func, "Add a UV map layer to Mesh");
2645 RNA_def_string(func, "name", "UVMap", 0, "", "UV map name");
2646 RNA_def_boolean(func,
2647 "do_init",
2648 true,
2649 "",
2650 "Whether new layer's data should be initialized by copying current active one, "
2651 "or if none is active, with a default UVmap");
2652 parm = RNA_def_pointer(func, "layer", "MeshUVLoopLayer", "", "The newly created layer");
2654 RNA_def_function_return(func, parm);
2655
2656 func = RNA_def_function(srna, "remove", "rna_Mesh_uv_layers_remove");
2657 RNA_def_function_ui_description(func, "Remove a UV map layer");
2659 parm = RNA_def_pointer(func, "layer", "MeshUVLoopLayer", "", "The layer to remove");
2661
2662 prop = RNA_def_property(srna, "active", PROP_POINTER, PROP_NONE);
2663 RNA_def_property_struct_type(prop, "MeshUVLoopLayer");
2665 prop, "rna_Mesh_uv_layer_active_get", "rna_Mesh_uv_layer_active_set", nullptr, nullptr);
2668 RNA_def_property_ui_text(prop, "Active UV Map Layer", "Active UV Map layer");
2669 RNA_def_property_update(prop, 0, "rna_Mesh_update_data_legacy_deg_tag_all");
2670
2671 prop = RNA_def_property(srna, "active_index", PROP_INT, PROP_UNSIGNED);
2673 "rna_Mesh_uv_layer_active_index_get",
2674 "rna_Mesh_uv_layer_active_index_set",
2675 "rna_Mesh_uv_layer_index_range");
2677 RNA_def_property_ui_text(prop, "Active UV Map Index", "Active UV map index");
2678 RNA_def_property_update(prop, 0, "rna_Mesh_update_data_legacy_deg_tag_all");
2679}
2680
2681static void rna_def_skin_vertices(BlenderRNA *brna, PropertyRNA * /*cprop*/)
2682{
2683 StructRNA *srna;
2684 PropertyRNA *prop;
2685
2686 srna = RNA_def_struct(brna, "MeshSkinVertexLayer", nullptr);
2688 srna, "Mesh Skin Vertex Layer", "Per-vertex skin data for use with the Skin modifier");
2689 RNA_def_struct_sdna(srna, "CustomDataLayer");
2690 RNA_def_struct_path_func(srna, "rna_MeshSkinVertexLayer_path");
2691
2692 prop = RNA_def_property(srna, "name", PROP_STRING, PROP_NONE);
2693 RNA_def_struct_name_property(srna, prop);
2694 RNA_def_property_string_funcs(prop, nullptr, nullptr, "rna_MeshVertexLayer_name_set");
2696 RNA_def_property_ui_text(prop, "Name", "Name of skin layer");
2697 RNA_def_property_update(prop, 0, "rna_Mesh_update_data_legacy_deg_tag_all");
2698
2699 prop = RNA_def_property(srna, "data", PROP_COLLECTION, PROP_NONE);
2700 RNA_def_property_struct_type(prop, "MeshSkinVertex");
2701 RNA_def_property_ui_text(prop, "Data", "");
2704 "rna_MeshSkinVertexLayer_data_begin",
2705 "rna_iterator_array_next",
2706 "rna_iterator_array_end",
2707 "rna_iterator_array_get",
2708 "rna_MeshSkinVertexLayer_data_length",
2709 nullptr,
2710 nullptr,
2711 nullptr);
2712
2713 /* SkinVertex struct */
2714 srna = RNA_def_struct(brna, "MeshSkinVertex", nullptr);
2715 RNA_def_struct_sdna(srna, "MVertSkin");
2717 srna, "Skin Vertex", "Per-vertex skin data for use with the Skin modifier");
2718 RNA_def_struct_path_func(srna, "rna_MeshSkinVertex_path");
2719
2720 prop = RNA_def_property(srna, "radius", PROP_FLOAT, PROP_UNSIGNED);
2721 RNA_def_property_array(prop, 2);
2722 RNA_def_property_ui_range(prop, 0.001, 100.0, 1, 3);
2723 RNA_def_property_ui_text(prop, "Radius", "Radius of the skin");
2724 RNA_def_property_update(prop, 0, "rna_Mesh_update_data_legacy_deg_tag_all");
2725
2726 /* Flags */
2727
2728 prop = RNA_def_property(srna, "use_root", PROP_BOOLEAN, PROP_NONE);
2729 RNA_def_property_boolean_sdna(prop, nullptr, "flag", MVERT_SKIN_ROOT);
2731 "Root",
2732 "Vertex is a root for rotation calculations and armature generation, "
2733 "setting this flag does not clear other roots in the same mesh island");
2734 RNA_def_property_update(prop, 0, "rna_Mesh_update_data_legacy_deg_tag_all");
2735
2736 prop = RNA_def_property(srna, "use_loose", PROP_BOOLEAN, PROP_NONE);
2737 RNA_def_property_boolean_sdna(prop, nullptr, "flag", MVERT_SKIN_LOOSE);
2739 prop, "Loose", "If vertex has multiple adjacent edges, it is hulled to them directly");
2740 RNA_def_property_update(prop, 0, "rna_Mesh_update_data_legacy_deg_tag_all");
2741}
2742
2744{
2745 StructRNA *srna = RNA_def_struct(brna, "ReadOnlyInteger", nullptr);
2746 RNA_def_struct_sdna(srna, "MIntProperty");
2747 RNA_def_struct_ui_text(srna, "Read-only Integer", "");
2748
2749 PropertyRNA *prop = RNA_def_property(srna, "value", PROP_INT, PROP_NONE);
2750 RNA_def_property_ui_text(prop, "Value", "");
2751 RNA_def_property_int_sdna(prop, nullptr, "i");
2753}
2754
2755static void rna_def_mesh(BlenderRNA *brna)
2756{
2757 StructRNA *srna;
2758 PropertyRNA *prop;
2759
2760 srna = RNA_def_struct(brna, "Mesh", "ID");
2761 RNA_def_struct_ui_text(srna, "Mesh", "Mesh data-block defining geometric surfaces");
2762 RNA_def_struct_ui_icon(srna, ICON_MESH_DATA);
2763
2764 prop = RNA_def_property(srna, "vertices", PROP_COLLECTION, PROP_NONE);
2766 "rna_Mesh_vertices_begin",
2767 "rna_iterator_array_next",
2768 "rna_iterator_array_end",
2769 "rna_iterator_array_get",
2770 "rna_Mesh_vertices_length",
2771 "rna_Mesh_vertices_lookup_int",
2772 nullptr,
2773 nullptr);
2774 RNA_def_property_struct_type(prop, "MeshVertex");
2776 RNA_def_property_ui_text(prop, "Vertices", "Vertices of the mesh");
2777 rna_def_mesh_vertices(brna, prop);
2778
2779 prop = RNA_def_property(srna, "edges", PROP_COLLECTION, PROP_NONE);
2781 "rna_Mesh_edges_begin",
2782 "rna_iterator_array_next",
2783 "rna_iterator_array_end",
2784 "rna_iterator_array_get",
2785 "rna_Mesh_edges_length",
2786 "rna_Mesh_edges_lookup_int",
2787 nullptr,
2788 nullptr);
2789 RNA_def_property_struct_type(prop, "MeshEdge");
2791 RNA_def_property_ui_text(prop, "Edges", "Edges of the mesh");
2792 rna_def_mesh_edges(brna, prop);
2793
2794 prop = RNA_def_property(srna, "loops", PROP_COLLECTION, PROP_NONE);
2796 "rna_Mesh_loops_begin",
2797 "rna_iterator_array_next",
2798 "rna_iterator_array_end",
2799 "rna_iterator_array_get",
2800 "rna_Mesh_loops_length",
2801 "rna_Mesh_loops_lookup_int",
2802 nullptr,
2803 nullptr);
2804 RNA_def_property_struct_type(prop, "MeshLoop");
2806 RNA_def_property_ui_text(prop, "Loops", "Loops of the mesh (face corners)");
2807 rna_def_mesh_loops(brna, prop);
2808
2809 prop = RNA_def_property(srna, "polygons", PROP_COLLECTION, PROP_NONE);
2811 "rna_Mesh_polygons_begin",
2812 "rna_iterator_array_next",
2813 "rna_iterator_array_end",
2814 "rna_iterator_array_get",
2815 "rna_Mesh_polygons_length",
2816 "rna_Mesh_polygons_lookup_int",
2817 nullptr,
2818 nullptr);
2819 RNA_def_property_struct_type(prop, "MeshPolygon");
2821 RNA_def_property_ui_text(prop, "Polygons", "Polygons of the mesh");
2822 rna_def_mesh_polygons(brna, prop);
2823
2825
2826 static const EnumPropertyItem normal_domain_items[] = {
2827 {int(blender::bke::MeshNormalDomain::Point), "POINT", 0, "Point", ""},
2828 {int(blender::bke::MeshNormalDomain::Face), "FACE", 0, "Face", ""},
2829 {int(blender::bke::MeshNormalDomain::Corner), "CORNER", 0, "Corner", ""},
2830 {0, nullptr, 0, nullptr, nullptr},
2831 };
2832
2833 prop = RNA_def_property(srna, "normals_domain", PROP_ENUM, PROP_NONE);
2834 RNA_def_property_enum_items(prop, normal_domain_items);
2836 prop,
2837 "Normal Domain",
2838 "The attribute domain that gives enough information to represent the mesh's normals");
2840 RNA_def_property_enum_funcs(prop, "rna_Mesh_normals_domain_get", nullptr, nullptr);
2841
2842 prop = RNA_def_property(srna, "vertex_normals", PROP_COLLECTION, PROP_NONE);
2843 RNA_def_property_struct_type(prop, "MeshNormalValue");
2846 "Vertex Normals",
2847 "The normal direction of each vertex, defined as the average of the "
2848 "surrounding face normals");
2850 "rna_Mesh_vertex_normals_begin",
2851 "rna_iterator_array_next",
2852 "rna_iterator_array_end",
2853 "rna_iterator_array_get",
2854 "rna_Mesh_vertex_normals_length",
2855 "rna_Mesh_vertex_normals_lookup_int",
2856 nullptr,
2857 nullptr);
2858
2859 prop = RNA_def_property(srna, "polygon_normals", PROP_COLLECTION, PROP_NONE);
2860 RNA_def_property_struct_type(prop, "MeshNormalValue");
2863 "Polygon Normals",
2864 "The normal direction of each face, defined by the winding order "
2865 "and position of its vertices");
2867 "rna_Mesh_poly_normals_begin",
2868 "rna_iterator_array_next",
2869 "rna_iterator_array_end",
2870 "rna_iterator_array_get",
2871 "rna_Mesh_poly_normals_length",
2872 "rna_Mesh_poly_normals_lookup_int",
2873 nullptr,
2874 nullptr);
2875
2876 prop = RNA_def_property(srna, "corner_normals", PROP_COLLECTION, PROP_NONE);
2877 RNA_def_property_struct_type(prop, "MeshNormalValue");
2880 prop,
2881 "Corner Normals",
2882 "The \"slit\" normal direction of each face corner, influenced by vertex normals, "
2883 "sharp faces, sharp edges, and custom normals. May be empty.");
2885 "rna_Mesh_corner_normals_begin",
2886 "rna_iterator_array_next",
2887 "rna_iterator_array_end",
2888 "rna_iterator_array_get",
2889 "rna_Mesh_corner_normals_length",
2890 "rna_Mesh_corner_normals_lookup_int",
2891 nullptr,
2892 nullptr);
2893
2894 prop = RNA_def_property(srna, "loop_triangles", PROP_COLLECTION, PROP_NONE);
2896 "rna_Mesh_loop_triangles_begin",
2897 "rna_iterator_array_next",
2898 "rna_iterator_array_end",
2899 "rna_iterator_array_get",
2900 "rna_Mesh_loop_triangles_length",
2901 "rna_Mesh_loop_triangles_lookup_int",
2902 nullptr,
2903 nullptr);
2904 RNA_def_property_struct_type(prop, "MeshLoopTriangle");
2906 RNA_def_property_ui_text(prop, "Loop Triangles", "Tessellation of mesh polygons into triangles");
2907 rna_def_mesh_looptris(brna, prop);
2908
2910
2911 prop = RNA_def_property(srna, "loop_triangle_polygons", PROP_COLLECTION, PROP_NONE);
2913 "rna_Mesh_loop_triangle_polygons_begin",
2914 "rna_iterator_array_next",
2915 "rna_iterator_array_end",
2916 "rna_iterator_array_get",
2917 "rna_Mesh_loop_triangles_length",
2918 "rna_Mesh_loop_triangle_polygons_lookup_int",
2919 nullptr,
2920 nullptr);
2921 RNA_def_property_struct_type(prop, "ReadOnlyInteger");
2924 RNA_def_property_ui_text(prop, "Triangle Faces", "The face index for each loop triangle");
2925
2926 /* TODO: should this be allowed to be itself? */
2927 prop = RNA_def_property(srna, "texture_mesh", PROP_POINTER, PROP_NONE);
2928 RNA_def_property_pointer_sdna(prop, nullptr, "texcomesh");
2932 prop,
2933 "Texture Mesh",
2934 "Use another mesh for texture indices (vertex indices must be aligned)");
2935
2936 /* UV loop layers */
2937 prop = RNA_def_property(srna, "uv_layers", PROP_COLLECTION, PROP_NONE);
2938 RNA_def_property_collection_sdna(prop, nullptr, "corner_data.layers", "corner_data.totlayer");
2940 "rna_Mesh_uv_layers_begin",
2941 nullptr,
2942 nullptr,
2943 nullptr,
2944 "rna_Mesh_uv_layers_length",
2945 nullptr,
2946 nullptr,
2947 nullptr);
2948 RNA_def_property_struct_type(prop, "MeshUVLoopLayer");
2950 RNA_def_property_ui_text(prop, "UV Loop Layers", "All UV loop layers");
2951 rna_def_uv_layers(brna, prop);
2952
2953 prop = RNA_def_property(srna, "uv_layer_clone", PROP_POINTER, PROP_NONE);
2954 RNA_def_property_struct_type(prop, "MeshUVLoopLayer");
2956 prop, "rna_Mesh_uv_layer_clone_get", "rna_Mesh_uv_layer_clone_set", nullptr, nullptr);
2960 prop, "Clone UV Loop Layer", "UV loop layer to be used as cloning source");
2961
2962 prop = RNA_def_property(srna, "uv_layer_clone_index", PROP_INT, PROP_UNSIGNED);
2964 "rna_Mesh_uv_layer_clone_index_get",
2965 "rna_Mesh_uv_layer_clone_index_set",
2966 "rna_Mesh_uv_layer_index_range");
2968 RNA_def_property_ui_text(prop, "Clone UV Loop Layer Index", "Clone UV loop layer index");
2969
2970 prop = RNA_def_property(srna, "uv_layer_stencil", PROP_POINTER, PROP_NONE);
2971 RNA_def_property_struct_type(prop, "MeshUVLoopLayer");
2973 prop, "rna_Mesh_uv_layer_stencil_get", "rna_Mesh_uv_layer_stencil_set", nullptr, nullptr);
2976 RNA_def_property_ui_text(prop, "Mask UV Loop Layer", "UV loop layer to mask the painted area");
2977
2978 prop = RNA_def_property(srna, "uv_layer_stencil_index", PROP_INT, PROP_UNSIGNED);
2980 "rna_Mesh_uv_layer_stencil_index_get",
2981 "rna_Mesh_uv_layer_stencil_index_set",
2982 "rna_Mesh_uv_layer_index_range");
2984 RNA_def_property_ui_text(prop, "Mask UV Loop Layer Index", "Mask UV loop layer index");
2985 RNA_def_property_update(prop, 0, "rna_Mesh_update_data_legacy_deg_tag_all");
2986
2987 /* Vertex colors */
2988
2989 prop = RNA_def_property(srna, "vertex_colors", PROP_COLLECTION, PROP_NONE);
2990 RNA_def_property_collection_sdna(prop, nullptr, "corner_data.layers", "corner_data.totlayer");
2992 "rna_Mesh_vertex_colors_begin",
2993 nullptr,
2994 nullptr,
2995 nullptr,
2996 "rna_Mesh_vertex_colors_length",
2997 nullptr,
2998 nullptr,
2999 nullptr);
3000 RNA_def_property_struct_type(prop, "MeshLoopColorLayer");
3003 prop,
3004 "Vertex Colors",
3005 "Legacy vertex color layers. Deprecated, use color attributes instead.");
3006 rna_def_loop_colors(brna, prop);
3007
3008 /* Skin vertices */
3009 prop = RNA_def_property(srna, "skin_vertices", PROP_COLLECTION, PROP_NONE);
3010 RNA_def_property_collection_sdna(prop, nullptr, "vert_data.layers", "vert_data.totlayer");
3012 "rna_Mesh_skin_vertices_begin",
3013 nullptr,
3014 nullptr,
3015 nullptr,
3016 "rna_Mesh_skin_vertices_length",
3017 nullptr,
3018 nullptr,
3019 nullptr);
3020 RNA_def_property_struct_type(prop, "MeshSkinVertexLayer");
3022 RNA_def_property_ui_text(prop, "Skin Vertices", "All skin vertices");
3023 rna_def_skin_vertices(brna, prop);
3024 /* End skin vertices */
3025
3026 /* Attributes */
3028
3029 /* Remesh */
3030 prop = RNA_def_property(srna, "remesh_voxel_size", PROP_FLOAT, PROP_DISTANCE);
3031 /* NOTE: allow zero (which skips computation), to avoid zero clamping
3032 * to a small value which is likely to run out of memory, see: #130526. */
3033 RNA_def_property_float_sdna(prop, nullptr, "remesh_voxel_size");
3035 RNA_def_property_ui_range(prop, 0.0001f, FLT_MAX, 0.01, 4);
3037 "Voxel Size",
3038 "Size of the voxel in object space used for volume evaluation. Lower "
3039 "values preserve finer details.");
3040 RNA_def_property_update(prop, 0, "rna_Mesh_update_draw");
3043
3044 prop = RNA_def_property(srna, "remesh_voxel_adaptivity", PROP_FLOAT, PROP_DISTANCE);
3045 RNA_def_property_float_sdna(prop, nullptr, "remesh_voxel_adaptivity");
3046 RNA_def_property_range(prop, 0.0f, 1.0f);
3047 RNA_def_property_ui_range(prop, 0.0f, 1.0f, 0.01, 4);
3049 prop,
3050 "Adaptivity",
3051 "Reduces the final face count by simplifying geometry where detail is not needed, "
3052 "generating triangles. A value greater than 0 disables Fix Poles.");
3053 RNA_def_property_update(prop, 0, "rna_Mesh_update_draw");
3056
3057 prop = RNA_def_property(srna, "use_remesh_fix_poles", PROP_BOOLEAN, PROP_NONE);
3058 RNA_def_property_boolean_sdna(prop, nullptr, "flag", ME_REMESH_FIX_POLES);
3059 RNA_def_property_ui_text(prop, "Fix Poles", "Produces fewer poles and a better topology flow");
3060 RNA_def_property_update(prop, 0, "rna_Mesh_update_draw");
3063
3064 prop = RNA_def_property(srna, "use_remesh_preserve_volume", PROP_BOOLEAN, PROP_NONE);
3067 prop,
3068 "Preserve Volume",
3069 "Projects the mesh to preserve the volume and details of the original mesh");
3070 RNA_def_property_update(prop, 0, "rna_Mesh_update_draw");
3073
3074 prop = RNA_def_property(srna, "use_remesh_preserve_attributes", PROP_BOOLEAN, PROP_NONE);
3076 RNA_def_property_ui_text(prop, "Preserve Attributes", "Transfer all attributes to the new mesh");
3077 RNA_def_property_update(prop, 0, "rna_Mesh_update_draw");
3080
3081 prop = RNA_def_property(srna, "remesh_mode", PROP_ENUM, PROP_NONE);
3082 RNA_def_property_enum_sdna(prop, nullptr, "remesh_mode");
3084 RNA_def_property_ui_text(prop, "Remesh Mode", "");
3085 RNA_def_property_update(prop, 0, "rna_Mesh_update_draw");
3088
3089 /* End remesh */
3090
3091 /* Symmetry */
3092 prop = RNA_def_property(srna, "use_mirror_x", PROP_BOOLEAN, PROP_NONE);
3093 RNA_def_property_boolean_sdna(prop, nullptr, "symmetry", ME_SYMMETRY_X);
3095 RNA_def_property_ui_text(prop, "X", "Enable symmetry in the X axis");
3096 RNA_def_property_update(prop, 0, "rna_Mesh_update_draw");
3097
3098 prop = RNA_def_property(srna, "use_mirror_y", PROP_BOOLEAN, PROP_NONE);
3099 RNA_def_property_boolean_sdna(prop, nullptr, "symmetry", ME_SYMMETRY_Y);
3101 RNA_def_property_ui_text(prop, "Y", "Enable symmetry in the Y axis");
3102 RNA_def_property_update(prop, 0, "rna_Mesh_update_draw");
3103
3104 prop = RNA_def_property(srna, "use_mirror_z", PROP_BOOLEAN, PROP_NONE);
3105 RNA_def_property_boolean_sdna(prop, nullptr, "symmetry", ME_SYMMETRY_Z);
3107 RNA_def_property_ui_text(prop, "Z", "Enable symmetry in the Z axis");
3108 RNA_def_property_update(prop, 0, "rna_Mesh_update_draw");
3109
3110 prop = RNA_def_property(srna, "use_mirror_vertex_groups", PROP_BOOLEAN, PROP_NONE);
3114 "Mirror Vertex Groups",
3115 "Mirror the left/right vertex groups when painting. The symmetry axis "
3116 "is determined by the symmetry settings.");
3117 RNA_def_property_update(prop, 0, "rna_Mesh_update_draw");
3118
3119 prop = RNA_def_property(srna, "radial_symmetry", PROP_INT, PROP_XYZ);
3120 RNA_def_property_int_sdna(prop, nullptr, "radial_symmetry");
3123 RNA_def_property_range(prop, 1, 64);
3124 RNA_def_property_ui_range(prop, 1, 32, 1, 1);
3126 prop, "Radial Symmetry Count", "Number of mirrored regions around a central axis");
3127 /* End Symmetry */
3128
3130 prop = RNA_def_property(srna, "has_custom_normals", PROP_BOOLEAN, PROP_NONE);
3131 RNA_def_property_boolean_sdna(prop, nullptr, "", 0);
3134 prop, "Has Custom Normals", "True if there is custom normal data for this mesh");
3135 RNA_def_property_boolean_funcs(prop, "rna_Mesh_has_custom_normals_get", nullptr);
3137
3138 prop = RNA_def_property(srna, "texco_mesh", PROP_POINTER, PROP_NONE);
3139 RNA_def_property_pointer_sdna(prop, nullptr, "texcomesh");
3143 prop, "Texture Space Mesh", "Derive texture coordinates from another mesh");
3144
3145 prop = RNA_def_property(srna, "shape_keys", PROP_POINTER, PROP_NONE);
3146 RNA_def_property_pointer_sdna(prop, nullptr, "key");
3149 RNA_def_property_ui_text(prop, "Shape Keys", "");
3150
3151 /* texture space */
3152 prop = RNA_def_property(srna, "use_auto_texspace", PROP_BOOLEAN, PROP_NONE);
3153 RNA_def_property_boolean_sdna(prop, nullptr, "texspace_flag", ME_TEXSPACE_FLAG_AUTO);
3155 prop,
3156 "Auto Texture Space",
3157 "Adjust active object's texture space automatically when transforming object");
3158 RNA_def_property_update(prop, 0, "rna_Mesh_update_geom_and_params");
3159
3160# if 0
3161 prop = RNA_def_property(srna, "texspace_location", PROP_FLOAT, PROP_TRANSLATION);
3162 RNA_def_property_array(prop, 3);
3163 RNA_def_property_ui_text(prop, "Texture Space Location", "Texture space location");
3164 RNA_def_property_editable_func(prop, "rna_Mesh_texspace_editable");
3166 prop, "rna_Mesh_texspace_location_get", "rna_Mesh_texspace_location_set", nullptr);
3167 RNA_def_property_update(prop, 0, "rna_Mesh_update_draw");
3168# endif
3169
3170 /* editflag */
3171 prop = RNA_def_property(srna, "use_mirror_topology", PROP_BOOLEAN, PROP_NONE);
3172 RNA_def_property_boolean_sdna(prop, nullptr, "editflag", ME_EDIT_MIRROR_TOPO);
3175 "Topology Mirror",
3176 "Use topology based mirroring "
3177 "(for when both sides of mesh have matching, unique topology)");
3178
3179 prop = RNA_def_property(srna, "use_paint_bone_selection", PROP_BOOLEAN, PROP_NONE);
3181 prop, nullptr, "editflag", ME_EDIT_PAINT_FACE_SEL | ME_EDIT_PAINT_VERT_SEL);
3183 RNA_def_property_ui_text(prop, "Bone Selection", "Bone selection during painting");
3184 RNA_def_property_ui_icon(prop, ICON_BONE_DATA, 0);
3185 RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, "rna_Mesh_update_bone_selection_mode");
3186
3187 prop = RNA_def_property(srna, "use_paint_mask", PROP_BOOLEAN, PROP_NONE);
3188 RNA_def_property_boolean_sdna(prop, nullptr, "editflag", ME_EDIT_PAINT_FACE_SEL);
3190 RNA_def_property_ui_text(prop, "Paint Mask", "Face selection masking for painting");
3191 RNA_def_property_ui_icon(prop, ICON_FACESEL, 0);
3192 RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, "rna_Mesh_update_facemask");
3193
3194 prop = RNA_def_property(srna, "use_paint_mask_vertex", PROP_BOOLEAN, PROP_NONE);
3195 RNA_def_property_boolean_sdna(prop, nullptr, "editflag", ME_EDIT_PAINT_VERT_SEL);
3197 RNA_def_property_ui_text(prop, "Vertex Selection", "Vertex selection masking for painting");
3198 RNA_def_property_ui_icon(prop, ICON_VERTEXSEL, 0);
3199 RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, "rna_Mesh_update_vertmask");
3200
3201 /* readonly editmesh info - use for extrude menu */
3202 prop = RNA_def_property(srna, "total_vert_sel", PROP_INT, PROP_UNSIGNED);
3203 RNA_def_property_int_funcs(prop, "rna_Mesh_tot_vert_get", nullptr, nullptr);
3204 RNA_def_property_ui_text(prop, "Selected Vertex Total", "Selected vertex count in editmode");
3206
3207 prop = RNA_def_property(srna, "total_edge_sel", PROP_INT, PROP_UNSIGNED);
3208 RNA_def_property_int_funcs(prop, "rna_Mesh_tot_edge_get", nullptr, nullptr);
3209 RNA_def_property_ui_text(prop, "Selected Edge Total", "Selected edge count in editmode");
3211
3212 prop = RNA_def_property(srna, "total_face_sel", PROP_INT, PROP_UNSIGNED);
3213 RNA_def_property_int_funcs(prop, "rna_Mesh_tot_face_get", nullptr, nullptr);
3214 RNA_def_property_ui_text(prop, "Selected Face Total", "Selected face count in editmode");
3216
3217 prop = RNA_def_property(srna, "is_editmode", PROP_BOOLEAN, PROP_NONE);
3218 RNA_def_property_boolean_funcs(prop, "rna_Mesh_is_editmode_get", nullptr);
3220 RNA_def_property_ui_text(prop, "Is Editmode", "True when used in editmode");
3221
3222 /* pointers */
3224 rna_def_texmat_common(srna, "rna_Mesh_texspace_editable");
3225
3226 RNA_api_mesh(srna);
3227}
3228
3230{
3231 rna_def_mesh(brna);
3232 rna_def_mvert(brna);
3233 rna_def_mvert_group(brna);
3234 rna_def_medge(brna);
3235 rna_def_mlooptri(brna);
3236 rna_def_mloop(brna);
3237 rna_def_mpolygon(brna);
3238 rna_def_mloopuv(brna);
3239 rna_def_mloopcol(brna);
3240}
3241
3242#endif
3243
Generic geometry attributes built on CustomData.
void BKE_id_attributes_default_color_set(struct ID *id, std::optional< blender::StringRef > name)
blender::StringRef BKE_uv_map_pin_name_get(blender::StringRef uv_map_name, char *buffer)
struct CustomDataLayer * BKE_attribute_search_for_write(AttributeOwner &owner, blender::StringRef name, eCustomDataMask type, AttrDomainMask domain_mask)
Definition attribute.cc:672
struct CustomDataLayer * BKE_attribute_find(const AttributeOwner &owner, blender::StringRef name, eCustomDataType type, blender::bke::AttrDomain domain)
Definition attribute.cc:614
bool BKE_attribute_remove(AttributeOwner &owner, blender::StringRef name, struct ReportList *reports)
Definition attribute.cc:512
@ ATTR_DOMAIN_MASK_CORNER
const struct CustomDataLayer * BKE_attribute_search(const AttributeOwner &owner, blender::StringRef name, eCustomDataMask type, AttrDomainMask domain_mask)
Definition attribute.cc:639
bool BKE_attribute_rename(AttributeOwner &owner, blender::StringRef old_name, blender::StringRef new_name, struct ReportList *reports)
Definition attribute.cc:251
void BKE_id_attributes_active_color_set(struct ID *id, std::optional< blender::StringRef > name)
Definition attribute.cc:985
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)
@ CD_SET_DEFAULT
eCustomDataMask CD_TYPE_AS_MASK(eCustomDataType type)
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_named_layer_index(const CustomData *data, eCustomDataType type, blender::StringRef name)
int CustomData_get_layer_index(const CustomData *data, eCustomDataType type)
void CustomData_set_layer_clone_index(CustomData *data, eCustomDataType type, int n)
void CustomData_set_layer_unique_name(CustomData *data, int index)
void CustomData_ensure_data_is_mutable(CustomDataLayer *layer, int totelem)
int CustomData_get_active_layer_index(const CustomData *data, eCustomDataType type)
int CustomData_number_of_layers(const CustomData *data, eCustomDataType 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 id_us_plus(ID *id)
Definition lib_id.cc:358
void id_us_min(ID *id)
Definition lib_id.cc:366
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)
@ BKE_MESH_BATCH_DIRTY_ALL
Definition BKE_mesh.h:38
void BKE_mesh_texspace_get(Mesh *mesh, float r_texspace_location[3], float r_texspace_size[3])
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
@ RPT_ERROR
Definition BKE_report.hh:39
#define BLI_assert(a)
Definition BLI_assert.h:46
#define BLI_assert_msg(a, msg)
Definition BLI_assert.h:53
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])
Definition math_geom.cc:100
float normal_tri_v3(float n[3], const float v1[3], const float v2[3], const float v3[3])
Definition math_geom.cc:41
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
Definition string.cc:41
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(...)
#define STREQ(a, b)
void DEG_id_tag_update(ID *id, unsigned int flags)
@ ID_RECALC_PARAMETERS
Definition DNA_ID.h:1138
@ ID_RECALC_GEOMETRY
Definition DNA_ID.h:1074
@ LIBOVERRIDE_OP_REPLACE
Definition DNA_ID.h:230
#define MAX_CUSTOMDATA_LAYER_NAME
#define CD_MASK_PROP_BYTE_COLOR
#define CD_MASK_PROP_ALL
@ CD_PROP_BYTE_COLOR
@ CD_MLOOPTANGENT
@ CD_MVERT_SKIN
@ CD_PROP_FLOAT2
#define MAX_CUSTOMDATA_LAYER_NAME_NO_PREFIX
@ ME_EDIT_MIRROR_VERTEX_GROUPS
@ ME_EDIT_PAINT_VERT_SEL
@ ME_EDIT_PAINT_FACE_SEL
@ ME_EDIT_MIRROR_TOPO
@ ME_TEXSPACE_FLAG_AUTO
@ ME_SYMMETRY_X
@ ME_SYMMETRY_Y
@ ME_SYMMETRY_Z
@ ME_REMESH_REPROJECT_ATTRIBUTES
@ ME_REMESH_REPROJECT_VOLUME
@ ME_REMESH_FIX_POLES
@ REMESH_QUAD
@ REMESH_VOXEL
@ MVERT_SKIN_LOOSE
@ MVERT_SKIN_ROOT
blender::bke::AttributeWriter< bool > ED_mesh_uv_map_pin_layer_ensure(Mesh *mesh, int uv_index)
Definition mesh_data.cc:314
int ED_mesh_uv_add(Mesh *mesh, const char *name, bool active_set, bool do_init, ReportList *reports)
Definition mesh_data.cc:218
blender::VArray< bool > ED_mesh_uv_map_pin_layer_get(const Mesh *mesh, int uv_index)
Definition mesh_data.cc:298
int ED_mesh_color_add(Mesh *mesh, const char *name, bool active_set, bool do_init, ReportList *reports)
Definition mesh_data.cc:340
#define RNA_MAX_ARRAY_DIMENSION
Definition RNA_define.hh:27
@ PARM_RNAPTR
Definition RNA_types.hh:547
@ PARM_REQUIRED
Definition RNA_types.hh:545
@ FUNC_USE_REPORTS
Definition RNA_types.hh:914
@ FUNC_SELF_AS_RNA
Definition RNA_types.hh:900
@ FUNC_USE_SELF_ID
Definition RNA_types.hh:889
@ PROP_FLOAT
Definition RNA_types.hh:164
@ PROP_BOOLEAN
Definition RNA_types.hh:162
@ PROP_ENUM
Definition RNA_types.hh:166
@ PROP_INT
Definition RNA_types.hh:163
@ PROP_STRING
Definition RNA_types.hh:165
@ PROP_POINTER
Definition RNA_types.hh:167
@ PROP_COLLECTION
Definition RNA_types.hh:168
@ PROPOVERRIDE_OVERRIDABLE_LIBRARY
Definition RNA_types.hh:503
@ PROPOVERRIDE_IGNORE
Definition RNA_types.hh:523
PropertyFlag
Definition RNA_types.hh:300
@ PROP_THICK_WRAP
Definition RNA_types.hh:423
@ PROP_DYNAMIC
Definition RNA_types.hh:428
@ PROP_ANIMATABLE
Definition RNA_types.hh:319
@ PROP_PROPORTIONAL
Definition RNA_types.hh:349
@ PROP_NEVER_UNLINK
Definition RNA_types.hh:384
@ PROP_EDITABLE
Definition RNA_types.hh:306
@ PROP_NEVER_NULL
Definition RNA_types.hh:377
@ PROP_NO_DEG_UPDATE
Definition RNA_types.hh:439
@ PROP_PTR_NO_OWNERSHIP
Definition RNA_types.hh:395
@ PROP_ID_SELF_CHECK
Definition RNA_types.hh:370
@ PROP_DIRECTION
Definition RNA_types.hh:262
@ PROP_XYZ
Definition RNA_types.hh:269
@ PROP_DISTANCE
Definition RNA_types.hh:256
@ PROP_COLOR
Definition RNA_types.hh:260
@ PROP_NONE
Definition RNA_types.hh:233
@ PROP_TRANSLATION
Definition RNA_types.hh:261
@ PROP_UNSIGNED
Definition RNA_types.hh:249
#define NC_GEOM
Definition WM_types.hh:393
#define ND_DATA
Definition WM_types.hh:509
#define ND_SELECT
Definition WM_types.hh:508
#define ND_SPACE_VIEW3D
Definition WM_types.hh:528
#define NC_SPACE
Definition WM_types.hh:392
BMesh const char void * data
@ BMO_DELIM_NORMAL
@ BMO_DELIM_MATERIAL
@ BMO_DELIM_SEAM
@ BMO_DELIM_SHARP
@ BMO_DELIM_UV
ATTR_WARN_UNUSED_RESULT const BMVert * v2
static AttributeOwner from_id(ID *id)
Definition attribute.cc:44
AttributeSet attributes
constexpr int64_t size() const
Definition BLI_span.hh:493
constexpr T * data() const
Definition BLI_span.hh:539
constexpr const T * data() const
Definition BLI_span.hh:215
constexpr int64_t size() const
Definition BLI_span.hh:252
GAttributeReader lookup_or_default(StringRef attribute_id, AttrDomain domain, AttrType data_type, const void *default_value=nullptr) const
GAttributeWriter lookup_or_add_for_write(StringRef attribute_id, AttrDomain domain, AttrType data_type, const AttributeInit &initializer=AttributeInitDefaultValue())
static float normals[][3]
#define active
float length(VecOp< float, D >) RET
float3 face_normal_calc(Span< float3 > vert_positions, Span< int > face_verts)
float face_area_calc(Span< float3 > vert_positions, Span< int > face_verts)
float3 face_center_calc(Span< float3 > vert_positions, Span< int > face_verts)
void mesh_flip_faces(Mesh &mesh, const IndexMask &selection)
VecBase< float, 4 > float4
VecBase< int32_t, 2 > int2
VecBase< float, 2 > float2
VecBase< int32_t, 3 > int3
VecBase< float, 3 > float3
const char * name
void RNA_property_update_main(Main *bmain, Scene *scene, PointerRNA *ptr, PropertyRNA *prop)
void rna_iterator_array_begin(CollectionPropertyIterator *iter, PointerRNA *ptr, void *data, size_t itemsize, int64_t length, bool free_ptr, IteratorSkipFunc skip)
void rna_pointer_create_with_ancestors(const PointerRNA &parent, StructRNA *type, void *data, PointerRNA &r_ptr)
PointerRNA RNA_pointer_create_discrete(ID *id, StructRNA *type, void *data)
PointerRNA RNA_pointer_create_with_parent(const PointerRNA &parent, StructRNA *type, void *data)
void rna_def_animdata_common(StructRNA *srna)
void rna_def_attributes_common(StructRNA *srna, const AttributeOwnerType type)
void RNA_def_property_boolean_sdna(PropertyRNA *prop, const char *structname, const char *propname, int64_t booleanbit)
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_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_int_default(PropertyRNA *prop, int value)
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)
Definition rna_mesh.cc:2403
static void rna_def_mesh_edges(BlenderRNA *brna, PropertyRNA *cprop)
Definition rna_mesh.cc:2477
static void rna_def_mvert(BlenderRNA *brna)
Definition rna_mesh.cc:1887
static void rna_def_mloopuv(BlenderRNA *brna)
Definition rna_mesh.cc:2234
static void rna_def_mlooptri(BlenderRNA *brna)
Definition rna_mesh.cc:2003
static void rna_def_uv_layers(BlenderRNA *brna, PropertyRNA *cprop)
Definition rna_mesh.cc:2629
static void rna_def_normal_layer_value(BlenderRNA *brna)
Definition rna_mesh.cc:2562
static void rna_def_mpolygon(BlenderRNA *brna)
Definition rna_mesh.cc:2140
static void rna_def_mesh_looptris(BlenderRNA *brna, PropertyRNA *cprop)
Definition rna_mesh.cc:2502
static void rna_def_mesh_vertices(BlenderRNA *brna, PropertyRNA *cprop)
Definition rna_mesh.cc:2451
static void rna_def_mesh_polygons(BlenderRNA *brna, PropertyRNA *cprop)
Definition rna_mesh.cc:2535
static void rna_def_skin_vertices(BlenderRNA *brna, PropertyRNA *)
Definition rna_mesh.cc:2681
static void rna_def_mloopcol(BlenderRNA *brna)
Definition rna_mesh.cc:2342
void RNA_def_mesh(BlenderRNA *brna)
Definition rna_mesh.cc:3229
static void rna_def_loop_colors(BlenderRNA *brna, PropertyRNA *cprop)
Definition rna_mesh.cc:2575
static void rna_def_looptri_poly_value(BlenderRNA *brna)
Definition rna_mesh.cc:2743
const EnumPropertyItem rna_enum_mesh_delimit_mode_items[]
Definition rna_mesh.cc:26
static void rna_def_mesh(BlenderRNA *brna)
Definition rna_mesh.cc:2755
static void rna_def_mvert_group(BlenderRNA *brna)
Definition rna_mesh.cc:1861
static const EnumPropertyItem rna_enum_mesh_remesh_mode_items[]
Definition rna_mesh.cc:35
static void rna_def_medge(BlenderRNA *brna)
Definition rna_mesh.cc:1951
static void rna_def_mloop(BlenderRNA *brna)
Definition rna_mesh.cc:2071
static void rna_def_mesh_loops(BlenderRNA *brna, PropertyRNA *cprop)
Definition rna_mesh.cc:2514
#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)
#define min(a, b)
Definition sort.cc:36
#define FLT_MAX
Definition stdcycles.h:14
CustomDataLayer * layers
Definition DNA_ID.h:414
int us
Definition DNA_ID.h:443
struct MDeformWeight * dw
float texspace_size[3]
struct Mesh * texcomesh
int corners_num
char texspace_flag
int edges_num
MeshRuntimeHandle * runtime
CustomData corner_data
char * default_color_attribute
char editflag
CustomData vert_data
short totcol
float texspace_location[3]
int faces_num
int verts_num
char * active_color_attribute
ID * owner_id
Definition RNA_types.hh:51
IDOverrideLibraryPropertyOperation * liboverride_operation
blender::BitVector is_loose_bits
i
Definition text_draw.cc:230
max
Definition text_draw.cc:251
void WM_main_add_notifier(uint type, void *reference)
PointerRNA * ptr
Definition wm_files.cc:4238