Changeset View
Changeset View
Standalone View
Standalone View
source/blender/blenkernel/intern/mesh_remesh_voxel.c
| Show First 20 Lines • Show All 475 Lines • ▼ Show 20 Lines | struct Mesh *BKE_mesh_remesh_voxel_fix_poles(struct Mesh *mesh) | ||||
| BM_ITER_MESH (ed, &iter_a, bm, BM_EDGES_OF_MESH) { | BM_ITER_MESH (ed, &iter_a, bm, BM_EDGES_OF_MESH) { | ||||
| if (BM_edge_face_count(ed) != 2) { | if (BM_edge_face_count(ed) != 2) { | ||||
| BM_elem_flag_set(ed, BM_ELEM_TAG, true); | BM_elem_flag_set(ed, BM_ELEM_TAG, true); | ||||
| } | } | ||||
| } | } | ||||
| BM_mesh_edgenet(bm, false, true); | BM_mesh_edgenet(bm, false, true); | ||||
| BMO_op_callf(bm, | |||||
| (BMO_FLAG_DEFAULTS & ~BMO_FLAG_RESPECT_HIDE), | |||||
| "recalc_face_normals faces=%hf", | |||||
| BM_ELEM_TAG); | |||||
| /* Smooth the result */ | /* Smooth the result */ | ||||
| for (int i = 0; i < 4; i++) { | for (int i = 0; i < 4; i++) { | ||||
| BM_ITER_MESH (v, &iter_a, bm, BM_VERTS_OF_MESH) { | BM_ITER_MESH (v, &iter_a, bm, BM_VERTS_OF_MESH) { | ||||
| float co[3]; | float co[3]; | ||||
| zero_v3(co); | zero_v3(co); | ||||
| BM_ITER_ELEM (ed, &iter_b, v, BM_EDGES_OF_VERT) { | BM_ITER_ELEM (ed, &iter_b, v, BM_EDGES_OF_VERT) { | ||||
| BMVert *vert = BM_edge_other_vert(ed, v); | BMVert *vert = BM_edge_other_vert(ed, v); | ||||
| add_v3_v3(co, vert->co); | add_v3_v3(co, vert->co); | ||||
| } | } | ||||
| mul_v3_fl(co, 1.0f / (float)BM_vert_edge_count(v)); | mul_v3_fl(co, 1.0f / (float)BM_vert_edge_count(v)); | ||||
| mid_v3_v3v3(v->co, v->co, co); | mid_v3_v3v3(v->co, v->co, co); | ||||
| } | } | ||||
| } | } | ||||
| BM_mesh_normals_update(bm); | |||||
| BM_mesh_elem_hflag_disable_all(bm, BM_VERT | BM_EDGE | BM_FACE, BM_ELEM_SELECT, false); | BM_mesh_elem_hflag_disable_all(bm, BM_VERT | BM_EDGE | BM_FACE, BM_ELEM_SELECT, false); | ||||
| BM_mesh_elem_hflag_enable_all(bm, BM_FACE, BM_ELEM_TAG, false); | |||||
| BMO_op_callf(bm, | |||||
| (BMO_FLAG_DEFAULTS & ~BMO_FLAG_RESPECT_HIDE), | |||||
| "recalc_face_normals faces=%hf", | |||||
| BM_ELEM_TAG); | |||||
| BM_mesh_elem_hflag_disable_all(bm, BM_VERT | BM_EDGE | BM_FACE, BM_ELEM_TAG, false); | BM_mesh_elem_hflag_disable_all(bm, BM_VERT | BM_EDGE | BM_FACE, BM_ELEM_TAG, false); | ||||
| Mesh *result = BKE_mesh_from_bmesh_nomain(bm, | Mesh *result = BKE_mesh_from_bmesh_nomain(bm, | ||||
| (&(struct BMeshToMeshParams){ | (&(struct BMeshToMeshParams){ | ||||
| .calc_object_remap = false, | .calc_object_remap = false, | ||||
| }), | }), | ||||
| mesh); | mesh); | ||||
| BKE_id_free(NULL, mesh); | BKE_id_free(NULL, mesh); | ||||
| BM_mesh_free(bm); | BM_mesh_free(bm); | ||||
| return result; | return result; | ||||
| } | } | ||||