42static const char *rna_Mesh_unit_test_compare(
Mesh *mesh,
Mesh *mesh2,
float threshold)
45 const std::optional<MeshMismatch> mismatch =
compare_meshes(*mesh, *mesh2, threshold);
54static void rna_Mesh_sharp_from_angle_set(
Mesh *mesh,
const float angle)
56 mesh->attributes_for_write().remove(
"sharp_edge");
57 mesh->attributes_for_write().remove(
"sharp_face");
62static void rna_Mesh_calc_tangents(
Mesh *mesh,
ReportList *reports,
const char *uvmap)
64 float(*r_looptangents)[4];
67 r_looptangents =
static_cast<float(*)[4]
>(
69 memset(r_looptangents, 0,
sizeof(
float[4]) * mesh->corners_num);
80static void rna_Mesh_free_tangents(
Mesh *mesh)
85static void rna_Mesh_calc_corner_tri(
Mesh *mesh)
90static void rna_Mesh_calc_smooth_groups(
91 Mesh *mesh,
bool use_bitflags,
int **r_poly_group,
int *r_poly_group_num,
int *r_group_total)
94 *r_poly_group_num = mesh->faces_num;
96 const VArraySpan sharp_edges = *attributes.lookup<
bool>(
"sharp_edge", bke::AttrDomain::Edge);
97 const VArraySpan sharp_faces = *attributes.lookup<
bool>(
"sharp_face", bke::AttrDomain::Face);
100 mesh->corner_edges(),
107static void rna_Mesh_normals_split_custom_set(
Mesh *mesh,
109 const float *normals,
112 float(*corner_normals)[3] = (
float(*)[3])normals;
113 const int numloops = mesh->corners_num;
114 if (normals_num != numloops * 3) {
117 "Number of custom normals is not number of loops (%f / %d)",
118 float(normals_num) / 3.0f,
128static void rna_Mesh_normals_split_custom_set_from_vertices(
Mesh *mesh,
130 const float *normals,
133 float(*vert_normals)[3] = (
float(*)[3])normals;
134 const int numverts = mesh->verts_num;
135 if (normals_num != numverts * 3) {
138 "Number of custom normals is not number of vertices (%f / %d)",
139 float(normals_num) / 3.0f,
149static void rna_Mesh_transform(
Mesh *mesh,
const float mat[16],
bool shape_keys)
156static void rna_Mesh_flip_normals(
Mesh *mesh)
159 bke::mesh_flip_faces(*mesh, IndexMask(mesh->faces_num));
165static void rna_Mesh_update(
Mesh *mesh,
167 const bool calc_edges,
168 const bool calc_edges_loose)
170 if (calc_edges || ((mesh->faces_num || mesh->totface_legacy) && mesh->edges_num == 0)) {
174 if (calc_edges_loose) {
175 mesh->runtime->loose_edges_cache.tag_dirty();
181 mesh->runtime->vert_normals_cache.tag_dirty();
182 mesh->runtime->face_normals_cache.tag_dirty();
183 mesh->runtime->corner_normals_cache.tag_dirty();
189static void rna_Mesh_update_gpu_tag(
Mesh *mesh)
194static void rna_Mesh_count_selected_items(
Mesh *mesh,
int r_count[3])
199static void rna_Mesh_clear_geometry(
Mesh *mesh)
216 const int normals_array_dim[] = {1, 3};
220 "Transform mesh vertices by a matrix "
221 "(Warning: inverts normals if matrix is negative)");
222 parm =
RNA_def_float_matrix(func,
"matrix", 4, 4,
nullptr, 0.0f, 0.0f,
"",
"Matrix", 0.0f, 0.0f);
224 RNA_def_boolean(func,
"shape_keys",
false,
"",
"Transform Shape Keys");
228 "Invert winding of all polygons "
229 "(clears tessellation, does not handle custom normals)");
231 func =
RNA_def_function(srna,
"set_sharp_from_angle",
"rna_Mesh_sharp_from_angle_set");
233 "Reset and fill the \"sharp_edge\" attribute based on the angle "
234 "of faces neighboring manifold edges");
241 "Angle between faces beyond which edges are marked sharp",
252 "Compute tangents and bitangent signs, to be used together with the split normals "
253 "to get a complete tangent space for normal mapping "
254 "(split normals are also computed if not yet present)");
260 "Name of the UV map to use for tangent space computation");
265 func =
RNA_def_function(srna,
"calc_loop_triangles",
"rna_Mesh_calc_corner_tri");
267 "Calculate loop triangle tessellation (supports editmode too)");
269 func =
RNA_def_function(srna,
"calc_smooth_groups",
"rna_Mesh_calc_smooth_groups");
272 func,
"use_bitflags",
false,
"",
"Produce bitflags groups instead of simple numeric values");
274 parm =
RNA_def_int_array(func,
"poly_groups", 1,
nullptr, 0, 0,
"",
"Smooth Groups", 0, 0);
277 func,
"groups", 0, 0, INT_MAX,
"groups",
"Total number of groups", 0, INT_MAX);
280 func =
RNA_def_function(srna,
"normals_split_custom_set",
"rna_Mesh_normals_split_custom_set");
282 "Define custom split normals of this mesh "
283 "(use zero-vectors to keep auto ones)");
286 parm =
RNA_def_float_array(func,
"normals", 1,
nullptr, -1.0f, 1.0f,
"",
"Normals", 0.0f, 0.0f);
291 "normals_split_custom_set_from_vertices",
292 "rna_Mesh_normals_split_custom_set_from_vertices");
295 "Define custom split normals of this mesh, from vertices' normals "
296 "(use zero-vectors to keep auto ones)");
299 parm =
RNA_def_float_array(func,
"normals", 1,
nullptr, -1.0f, 1.0f,
"",
"Normals", 0.0f, 0.0f);
304 RNA_def_boolean(func,
"calc_edges",
false,
"Calculate Edges",
"Force recalculation of edges");
308 "Calculate Loose Edges",
309 "Calculate the loose state of each edge");
314 func =
RNA_def_function(srna,
"unit_test_compare",
"rna_Mesh_unit_test_compare");
322 "Comparison tolerance threshold",
327 func,
"result",
"nothing", 64,
"Return value",
"String description of result of comparison");
333 "Remove all geometry from the mesh. Note that this does not free shape keys or materials.");
337 "Validate geometry, return True when the mesh has had "
338 "invalid geometry corrected/removed");
339 RNA_def_boolean(func,
"verbose",
false,
"Verbose",
"Output information about the errors found");
344 "Remove temp/cached custom-data layers, like e.g. normals...");
348 func =
RNA_def_function(srna,
"validate_material_indices",
"BKE_mesh_validate_material_indices");
351 "Validate material indices of polygons, return True when the mesh has had "
352 "invalid indices corrected (to default 0)");
356 func =
RNA_def_function(srna,
"count_selected_items",
"rna_Mesh_count_selected_items ");
358 parm =
RNA_def_int_vector(func,
"result", 3,
nullptr, 0, INT_MAX,
"Result",
nullptr, 0, INT_MAX);
void BKE_animdata_free(ID *id, bool do_id_user)
void CustomData_set_layer_flag(CustomData *data, eCustomDataType type, int flag)
void CustomData_free_layers(CustomData *data, eCustomDataType type, int totelem)
void * CustomData_get_layer_for_write(CustomData *data, eCustomDataType type, int totelem)
bool CustomData_has_layer(const CustomData *data, eCustomDataType type)
void * CustomData_add_layer(CustomData *data, eCustomDataType type, eCDAllocType alloctype, int totelem)
void BKE_mesh_batch_cache_dirty_tag(Mesh *mesh, eMeshBatchDirtyMode mode)
void BKE_mesh_set_custom_normals(Mesh *mesh, float(*r_custom_loop_normals)[3])
void BKE_mesh_tessface_clear(Mesh *mesh)
void BKE_mesh_clear_geometry_and_metadata(Mesh *mesh)
void BKE_mesh_count_selected_items(const Mesh *mesh, int r_count[3])
@ BKE_MESH_BATCH_DIRTY_ALL
void BKE_mesh_set_custom_normals_from_verts(Mesh *mesh, float(*r_custom_vert_normals)[3])
void BKE_mesh_transform(Mesh *mesh, const float mat[4][4], bool do_keys)
int * BKE_mesh_calc_smoothgroups(int edges_num, blender::OffsetIndices< int > faces, blender::Span< int > corner_edges, blender::Span< bool > sharp_edges, blender::Span< bool > sharp_faces, int *r_totgroup, bool use_bitflags)
void BKE_mesh_runtime_clear_geometry(Mesh *mesh)
void BKE_mesh_calc_loop_tangent_single(Mesh *mesh, const char *uvmap, float(*r_looptangents)[4], ReportList *reports)
void BKE_reportf(ReportList *reports, eReportType type, const char *format,...) ATTR_PRINTF_FORMAT(3
void DEG_id_tag_update(ID *id, unsigned int flags)
@ ID_RECALC_GEOMETRY_ALL_MODES
#define MAX_CUSTOMDATA_LAYER_NAME_NO_PREFIX
draw_view in_light_buf[] float
const char * mismatch_to_string(const MeshMismatch &mismatch)
std::optional< MeshMismatch > compare_meshes(const Mesh &mesh1, const Mesh &mesh2, float threshold)
Checks if the two meshes are different, returning the type of mismatch if any. Changes in index order...
void mesh_sharp_edges_set_from_angle(Mesh &mesh, float angle, bool keep_sharp_edges=false)
void mesh_calc_edges(Mesh &mesh, bool keep_existing_edges, bool select_new_edges)
void mesh_ensure_required_data_layers(Mesh &mesh)
PropertyRNA * RNA_def_float_factor(StructOrFunctionRNA *cont_, const char *identifier, const float default_value, const float hardmin, const float hardmax, const char *ui_name, const char *ui_description, const float softmin, const float softmax)
PropertyRNA * RNA_def_string(StructOrFunctionRNA *cont_, const char *identifier, const char *default_value, const int maxlen, const char *ui_name, const char *ui_description)
PropertyRNA * RNA_def_int_array(StructOrFunctionRNA *cont_, const char *identifier, const int len, 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_function_return(FunctionRNA *func, PropertyRNA *ret)
PropertyRNA * RNA_def_float_matrix(StructOrFunctionRNA *cont_, const char *identifier, const int rows, const int columns, const float *default_value, const float hardmin, const float hardmax, const char *ui_name, const char *ui_description, const float softmin, const float softmax)
PropertyRNA * RNA_def_float(StructOrFunctionRNA *cont_, const char *identifier, const float default_value, const float hardmin, const float hardmax, const char *ui_name, const char *ui_description, const float softmin, const float softmax)
void RNA_def_property_multi_array(PropertyRNA *prop, int dimension, const int length[])
PropertyRNA * RNA_def_int_vector(StructOrFunctionRNA *cont_, const char *identifier, const int len, const int *default_value, const int hardmin, const int hardmax, const char *ui_name, const char *ui_description, const int softmin, const int softmax)
FunctionRNA * RNA_def_function(StructRNA *srna, const char *identifier, const char *call)
PropertyRNA * RNA_def_pointer(StructOrFunctionRNA *cont_, const char *identifier, const char *type, const char *ui_name, const char *ui_description)
void RNA_def_function_ui_description(FunctionRNA *func, const char *description)
void RNA_def_function_flag(FunctionRNA *func, int flag)
PropertyRNA * RNA_def_float_array(StructOrFunctionRNA *cont_, const char *identifier, const int len, const float *default_value, const float hardmin, const float hardmax, const char *ui_name, const char *ui_description, const float softmin, const float softmax)
PropertyRNA * RNA_def_boolean(StructOrFunctionRNA *cont_, const char *identifier, const bool default_value, const char *ui_name, const char *ui_description)
void RNA_def_function_output(FunctionRNA *, PropertyRNA *ret)
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_parameter_flags(PropertyRNA *prop, PropertyFlag flag_property, ParameterFlag flag_parameter)
void RNA_api_mesh(StructRNA *srna)
void WM_main_add_notifier(uint type, void *reference)
void WM_event_add_notifier(const bContext *C, uint type, void *reference)