39static const char *rna_Mesh_unit_test_compare(
Mesh *mesh,
Mesh *mesh2,
float threshold)
51static void rna_Mesh_sharp_from_angle_set(
Mesh *
mesh,
const float angle)
53 mesh->attributes_for_write().remove(
"sharp_edge");
54 mesh->attributes_for_write().remove(
"sharp_face");
61 float(*r_looptangents)[4];
64 r_looptangents =
static_cast<float(*)[4]
>(
66 memset(r_looptangents, 0,
sizeof(
float[4]) *
mesh->corners_num);
77static void rna_Mesh_free_tangents(
Mesh *
mesh)
82static void rna_Mesh_calc_corner_tri(
Mesh *
mesh)
87static void rna_Mesh_calc_smooth_groups(
Mesh *
mesh,
89 bool use_boundary_vertices_for_bitflags,
91 int *r_poly_group_num,
95 *r_poly_group_num =
mesh->faces_num;
103 mesh->corner_edges(),
104 mesh->corner_verts(),
107 use_boundary_vertices_for_bitflags,
113 mesh->corner_edges(),
120static void rna_Mesh_normals_split_custom_set(
Mesh *
mesh,
127 const int numloops =
mesh->corners_num;
128 if (normals_num != numloops * 3) {
131 "Number of custom normals is not number of loops (%f / %d)",
132 float(normals_num) / 3.0f,
142static void rna_Mesh_normals_split_custom_set_from_vertices(
Mesh *
mesh,
149 const int numverts =
mesh->verts_num;
150 if (normals_num != numverts * 3) {
153 "Number of custom normals is not number of vertices (%f / %d)",
154 float(normals_num) / 3.0f,
164static void rna_Mesh_transform(
Mesh *
mesh,
const float mat[16],
bool shape_keys)
171static void rna_Mesh_flip_normals(
Mesh *
mesh)
180static void rna_Mesh_update(
Mesh *
mesh,
183 const bool calc_edges_loose)
189 if (calc_edges_loose) {
190 mesh->runtime->loose_edges_cache.tag_dirty();
196 mesh->runtime->vert_normals_cache.tag_dirty();
197 mesh->runtime->face_normals_cache.tag_dirty();
198 mesh->runtime->corner_normals_cache.tag_dirty();
199 mesh->runtime->vert_normals_true_cache.tag_dirty();
200 mesh->runtime->face_normals_true_cache.tag_dirty();
206static void rna_Mesh_update_gpu_tag(
Mesh *
mesh)
211static void rna_Mesh_count_selected_items(
Mesh *
mesh,
int r_count[3])
216static void rna_Mesh_clear_geometry(
Mesh *
mesh)
233 const int normals_array_dim[] = {1, 3};
237 "Transform mesh vertices by a matrix "
238 "(Warning: inverts normals if matrix is negative)");
239 parm =
RNA_def_float_matrix(func,
"matrix", 4, 4,
nullptr, 0.0f, 0.0f,
"",
"Matrix", 0.0f, 0.0f);
241 RNA_def_boolean(func,
"shape_keys",
false,
"",
"Transform Shape Keys");
245 "Invert winding of all polygons "
246 "(clears tessellation, does not handle custom normals)");
248 func =
RNA_def_function(srna,
"set_sharp_from_angle",
"rna_Mesh_sharp_from_angle_set");
250 "Reset and fill the \"sharp_edge\" attribute based on the angle "
251 "of faces neighboring manifold edges");
258 "Angle between faces beyond which edges are marked sharp",
269 "Compute tangents and bitangent signs, to be used together with the split normals "
270 "to get a complete tangent space for normal mapping "
271 "(split normals are also computed if not yet present)");
277 "Name of the UV map to use for tangent space computation");
282 func =
RNA_def_function(srna,
"calc_loop_triangles",
"rna_Mesh_calc_corner_tri");
284 "Calculate loop triangle tessellation (supports editmode too)");
286 func =
RNA_def_function(srna,
"calc_smooth_groups",
"rna_Mesh_calc_smooth_groups");
289 func,
"use_bitflags",
false,
"",
"Produce bitflags groups instead of simple numeric values");
292 "use_boundary_vertices_for_bitflags",
295 "Also consider different smoothgroups sharing only vertices (but without any common edge) "
296 "as neighbors, preventing them from sharing the same bitflag value. Only effective when "
297 "`use_bitflags` is set. WARNING: Will overflow (run out of available bits) easily with some "
298 "types of topology, e.g. large fans of sharp edges");
300 parm =
RNA_def_int_array(func,
"poly_groups", 1,
nullptr, 0, 0,
"",
"Smooth Groups", 0, 0);
303 func,
"groups", 0, 0, INT_MAX,
"groups",
"Total number of groups", 0, INT_MAX);
306 func =
RNA_def_function(srna,
"normals_split_custom_set",
"rna_Mesh_normals_split_custom_set");
308 "Define custom split normals of this mesh "
309 "(use zero-vectors to keep auto ones)");
312 parm =
RNA_def_float_array(func,
"normals", 1,
nullptr, -1.0f, 1.0f,
"",
"Normals", 0.0f, 0.0f);
317 "normals_split_custom_set_from_vertices",
318 "rna_Mesh_normals_split_custom_set_from_vertices");
321 "Define custom split normals of this mesh, from vertices' normals "
322 "(use zero-vectors to keep auto ones)");
325 parm =
RNA_def_float_array(func,
"normals", 1,
nullptr, -1.0f, 1.0f,
"",
"Normals", 0.0f, 0.0f);
330 RNA_def_boolean(func,
"calc_edges",
false,
"Calculate Edges",
"Force recalculation of edges");
334 "Calculate Loose Edges",
335 "Calculate the loose state of each edge");
340 func =
RNA_def_function(srna,
"unit_test_compare",
"rna_Mesh_unit_test_compare");
348 "Comparison tolerance threshold",
353 func,
"result",
"nothing", 64,
"Return value",
"String description of result of comparison");
359 "Remove all geometry from the mesh. Note that this does not free shape keys or materials.");
363 "Validate geometry, return True when the mesh has had "
364 "invalid geometry corrected/removed");
365 RNA_def_boolean(func,
"verbose",
false,
"Verbose",
"Output information about the errors found");
370 "Remove temp/cached custom-data layers, like e.g. normals...");
374 func =
RNA_def_function(srna,
"validate_material_indices",
"BKE_mesh_validate_material_indices");
377 "Validate material indices of polygons, return True when the mesh has had "
378 "invalid indices corrected (to default 0)");
382 func =
RNA_def_function(srna,
"count_selected_items",
"rna_Mesh_count_selected_items ");
384 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)
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_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
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)
int * BKE_mesh_calc_smoothgroups_bitflags(int edges_num, int verts_num, blender::OffsetIndices< int > faces, blender::Span< int > corner_edges, blender::Span< int > corner_verts, blender::Span< bool > sharp_edges, blender::Span< bool > sharp_faces, bool use_boundary_vertices_for_bitflags, int *r_totgroup)
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
static double angle(const Eigen::Vector3d &v1, const Eigen::Vector3d &v2)
GAttributeReader lookup(const StringRef attribute_id) const
static float normals[][3]
#define MAX_CUSTOMDATA_LAYER_NAME_NO_PREFIX
std::optional< GeoMismatch > 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...
const char * mismatch_to_string(const GeoMismatch &mismatch)
void mesh_sharp_edges_set_from_angle(Mesh &mesh, float angle, bool keep_sharp_edges=false)
void mesh_flip_faces(Mesh &mesh, const IndexMask &selection)
void mesh_calc_edges(Mesh &mesh, bool keep_existing_edges, bool select_new_edges)
void mesh_transform(Mesh &mesh, const float4x4 &transform, bool do_shape_keys)
void mesh_set_custom_normals_from_verts(Mesh &mesh, MutableSpan< float3 > vert_normals)
void mesh_ensure_required_data_layers(Mesh &mesh)
void mesh_set_custom_normals(Mesh &mesh, MutableSpan< float3 > corner_normals)
MatBase< float, 4, 4 > float4x4
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)