diff options
-rw-r--r-- | intern/cycles/blender/blender_util.h | 2 | ||||
-rw-r--r-- | source/blender/editors/include/ED_mesh.h | 2 | ||||
-rw-r--r-- | source/blender/editors/mesh/mesh_data.c | 13 | ||||
-rw-r--r-- | source/blender/makesrna/intern/rna_mesh_api.c | 11 | ||||
-rw-r--r-- | source/blenderplayer/bad_level_call_stubs/stubs.c | 2 |
5 files changed, 25 insertions, 5 deletions
diff --git a/intern/cycles/blender/blender_util.h b/intern/cycles/blender/blender_util.h index 64fc352893a..9f7181cc564 100644 --- a/intern/cycles/blender/blender_util.h +++ b/intern/cycles/blender/blender_util.h @@ -47,7 +47,7 @@ static inline BL::Mesh object_to_mesh(BL::BlendData data, BL::Object object, BL: if (me.use_auto_smooth()) { me.calc_normals_split(); } - me.calc_tessface(); + me.calc_tessface(true); } return me; } diff --git a/source/blender/editors/include/ED_mesh.h b/source/blender/editors/include/ED_mesh.h index 8eb7fdf0c40..ccf97221112 100644 --- a/source/blender/editors/include/ED_mesh.h +++ b/source/blender/editors/include/ED_mesh.h @@ -256,7 +256,7 @@ void ED_mesh_faces_remove(struct Mesh *mesh, struct ReportList *reports, int cou void ED_mesh_edges_remove(struct Mesh *mesh, struct ReportList *reports, int count); void ED_mesh_vertices_remove(struct Mesh *mesh, struct ReportList *reports, int count); -void ED_mesh_calc_tessface(struct Mesh *mesh); +void ED_mesh_calc_tessface(struct Mesh *mesh, bool free_mpoly); void ED_mesh_update(struct Mesh *mesh, struct bContext *C, int calc_edges, int calc_tessface); void ED_mesh_uv_texture_ensure(struct Mesh *me, const char *name); diff --git a/source/blender/editors/mesh/mesh_data.c b/source/blender/editors/mesh/mesh_data.c index 30e9a85d083..86991d7dfeb 100644 --- a/source/blender/editors/mesh/mesh_data.c +++ b/source/blender/editors/mesh/mesh_data.c @@ -1235,7 +1235,7 @@ void ED_mesh_polys_add(Mesh *mesh, ReportList *reports, int count) mesh_add_polys(mesh, count); } -void ED_mesh_calc_tessface(Mesh *mesh) +void ED_mesh_calc_tessface(Mesh *mesh, bool free_mpoly) { if (mesh->edit_btmesh) { BKE_editmesh_tessface_calc(mesh->edit_btmesh); @@ -1243,6 +1243,17 @@ void ED_mesh_calc_tessface(Mesh *mesh) else { BKE_mesh_tessface_calc(mesh); } + if (free_mpoly) { + CustomData_free(&mesh->ldata, mesh->totloop); + CustomData_free(&mesh->pdata, mesh->totpoly); + mesh->totloop = 0; + mesh->totpoly = 0; + mesh->mloop = NULL; + mesh->mloopcol = NULL; + mesh->mloopuv = NULL; + mesh->mpoly = NULL; + mesh->mtpoly = NULL; + } } void ED_mesh_report_mirror_ex(wmOperator *op, int totmirr, int totfail, diff --git a/source/blender/makesrna/intern/rna_mesh_api.c b/source/blender/makesrna/intern/rna_mesh_api.c index 3f487698420..a994bf5e9d1 100644 --- a/source/blender/makesrna/intern/rna_mesh_api.c +++ b/source/blender/makesrna/intern/rna_mesh_api.c @@ -141,6 +141,11 @@ static void rna_Mesh_free_tangents(Mesh *mesh) CustomData_free_layers(&mesh->ldata, CD_MLOOPTANGENT, mesh->totloop); } +static void rna_Mesh_calc_tessface(Mesh *mesh, int free_mpoly) +{ + ED_mesh_calc_tessface(mesh, free_mpoly != 0); +} + static void rna_Mesh_calc_smooth_groups(Mesh *mesh, int use_bitflags, int *r_poly_group_len, int **r_poly_group, int *r_group_total) { @@ -269,8 +274,12 @@ void RNA_api_mesh(StructRNA *srna) func = RNA_def_function(srna, "free_tangents", "rna_Mesh_free_tangents"); RNA_def_function_ui_description(func, "Free tangents"); - func = RNA_def_function(srna, "calc_tessface", "ED_mesh_calc_tessface"); + func = RNA_def_function(srna, "calc_tessface", "rna_Mesh_calc_tessface"); RNA_def_function_ui_description(func, "Calculate face tessellation (supports editmode too)"); + RNA_def_boolean(func, "free_mpoly", 0, "Free MPoly", "Free data used by polygons and loops. " + "WARNING: This destructive operation removes regular faces, " + "only used on temporary mesh data-blocks to reduce memory footprint of render " + "engines and export scripts."); func = RNA_def_function(srna, "calc_smooth_groups", "rna_Mesh_calc_smooth_groups"); RNA_def_function_ui_description(func, "Calculate smooth groups from sharp edges"); diff --git a/source/blenderplayer/bad_level_call_stubs/stubs.c b/source/blenderplayer/bad_level_call_stubs/stubs.c index e4319632797..0856b50c19b 100644 --- a/source/blenderplayer/bad_level_call_stubs/stubs.c +++ b/source/blenderplayer/bad_level_call_stubs/stubs.c @@ -673,7 +673,7 @@ int collada_export(struct Scene *sce, BC_export_transformation_type export_transformation_type, int open_sim) RET_ZERO -void ED_mesh_calc_tessface(struct Mesh *mesh) RET_NONE +void ED_mesh_calc_tessface(struct Mesh *mesh, bool free_mpoly) RET_NONE /* bpy/python internal api */ void operator_wrapper(struct wmOperatorType *ot, void *userdata) RET_NONE |