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");
64 r_looptangents =
static_cast<float4 *
>(
66 memset(r_looptangents, 0,
sizeof(
float4) *
mesh->corners_num);
83 "Tangent space computation needs a UV Map, \"%s\" not found, aborting",
91 mesh->corner_normals(),
93 {r_looptangents, mesh->corners_num},
97static void rna_Mesh_free_tangents(
Mesh *
mesh)
102static void rna_Mesh_calc_corner_tri(
Mesh *
mesh)
107static void rna_Mesh_calc_smooth_groups(
Mesh *
mesh,
109 bool use_boundary_vertices_for_bitflags,
111 int *r_poly_group_num,
115 *r_poly_group_num =
mesh->faces_num;
123 mesh->corner_edges(),
124 mesh->corner_verts(),
127 use_boundary_vertices_for_bitflags,
133 mesh->corner_edges(),
140static void rna_Mesh_normals_split_custom_set(
Mesh *
mesh,
147 const int numloops =
mesh->corners_num;
148 if (normals_num != numloops * 3) {
151 "Number of custom normals is not number of loops (%f / %d)",
152 float(normals_num) / 3.0f,
162static void rna_Mesh_normals_split_custom_set_from_vertices(
Mesh *
mesh,
169 const int numverts =
mesh->verts_num;
170 if (normals_num != numverts * 3) {
173 "Number of custom normals is not number of vertices (%f / %d)",
174 float(normals_num) / 3.0f,
184static void rna_Mesh_transform(
Mesh *
mesh,
const float mat[16],
bool shape_keys)
191static void rna_Mesh_flip_normals(
Mesh *
mesh)
200static void rna_Mesh_update(
Mesh *
mesh,
203 const bool calc_edges_loose)
209 if (calc_edges_loose) {
210 mesh->runtime->loose_edges_cache.tag_dirty();
216 mesh->runtime->vert_normals_cache.tag_dirty();
217 mesh->runtime->face_normals_cache.tag_dirty();
218 mesh->runtime->corner_normals_cache.tag_dirty();
219 mesh->runtime->vert_normals_true_cache.tag_dirty();
220 mesh->runtime->face_normals_true_cache.tag_dirty();
226static void rna_Mesh_update_gpu_tag(
Mesh *
mesh)
231static void rna_Mesh_count_selected_items(
Mesh *
mesh,
int r_count[3])
236static void rna_Mesh_clear_geometry(
Mesh *
mesh)
253 const int normals_array_dim[] = {1, 3};
257 "Transform mesh vertices by a matrix "
258 "(Warning: inverts normals if matrix is negative)");
259 parm =
RNA_def_float_matrix(func,
"matrix", 4, 4,
nullptr, 0.0f, 0.0f,
"",
"Matrix", 0.0f, 0.0f);
261 RNA_def_boolean(func,
"shape_keys",
false,
"",
"Transform Shape Keys");
265 "Invert winding of all polygons "
266 "(clears tessellation, does not handle custom normals)");
268 func =
RNA_def_function(srna,
"set_sharp_from_angle",
"rna_Mesh_sharp_from_angle_set");
270 "Reset and fill the \"sharp_edge\" attribute based on the angle "
271 "of faces neighboring manifold edges");
278 "Angle between faces beyond which edges are marked sharp",
289 "Compute tangents and bitangent signs, to be used together with the custom normals "
290 "to get a complete tangent space for normal mapping "
291 "(custom normals are also computed if not yet present)");
297 "Name of the UV map to use for tangent space computation");
302 func =
RNA_def_function(srna,
"calc_loop_triangles",
"rna_Mesh_calc_corner_tri");
304 "Calculate loop triangle tessellation (supports editmode too)");
306 func =
RNA_def_function(srna,
"calc_smooth_groups",
"rna_Mesh_calc_smooth_groups");
309 func,
"use_bitflags",
false,
"",
"Produce bitflags groups instead of simple numeric values");
312 "use_boundary_vertices_for_bitflags",
315 "Also consider different smoothgroups sharing only vertices (but without any common edge) "
316 "as neighbors, preventing them from sharing the same bitflag value. Only effective when "
317 "``use_bitflags`` is set. "
318 "WARNING: Will overflow (run out of available bits) easily with some types of topology, "
319 "e.g. large fans of sharp edges");
321 parm =
RNA_def_int_array(func,
"poly_groups", 1,
nullptr, 0, 0,
"",
"Smooth Groups", 0, 0);
324 func,
"groups", 0, 0, INT_MAX,
"groups",
"Total number of groups", 0, INT_MAX);
327 func =
RNA_def_function(srna,
"normals_split_custom_set",
"rna_Mesh_normals_split_custom_set");
329 "Define custom normals of this mesh "
330 "(use zero-vectors to keep auto ones)");
333 parm =
RNA_def_float_array(func,
"normals", 1,
nullptr, -1.0f, 1.0f,
"",
"Normals", 0.0f, 0.0f);
338 "normals_split_custom_set_from_vertices",
339 "rna_Mesh_normals_split_custom_set_from_vertices");
341 "Define custom normals of this mesh, from vertices' normals "
342 "(use zero-vectors to keep auto ones)");
345 parm =
RNA_def_float_array(func,
"normals", 1,
nullptr, -1.0f, 1.0f,
"",
"Normals", 0.0f, 0.0f);
350 RNA_def_boolean(func,
"calc_edges",
false,
"Calculate Edges",
"Force recalculation of edges");
354 "Calculate Loose Edges",
355 "Calculate the loose state of each edge");
360 func =
RNA_def_function(srna,
"unit_test_compare",
"rna_Mesh_unit_test_compare");
368 "Comparison tolerance threshold",
373 func,
"result",
"nothing", 64,
"Return value",
"String description of result of comparison");
379 "Remove all geometry from the mesh. Note that this does not free shape keys or materials.");
383 "Validate geometry, return True when the mesh has had "
384 "invalid geometry corrected/removed");
385 RNA_def_boolean(func,
"verbose",
false,
"Verbose",
"Output information about the errors found");
390 "Remove temp/cached custom-data layers, like e.g. normals...");
394 func =
RNA_def_function(srna,
"validate_material_indices",
"BKE_mesh_validate_material_indices");
397 "Validate material indices of polygons, return True when the mesh has had "
398 "invalid indices corrected (to default 0)");
402 func =
RNA_def_function(srna,
"count_selected_items",
"rna_Mesh_count_selected_items ");
404 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)
const char * CustomData_get_active_layer_name(const CustomData *data, eCustomDataType type)
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_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
static double angle(const Eigen::Vector3d &v1, const Eigen::Vector3d &v2)
constexpr bool is_empty() const
GAttributeReader lookup(const StringRef attribute_id) const
static float normals[][3]
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 calc_uv_tangent_tris_quads(Span< float3 > vert_positions, OffsetIndices< int > faces, Span< int > corner_verts, Span< float3 > corner_normals, Span< float2 > uv_map, MutableSpan< float4 > results, ReportList *reports)
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)