Changeset View
Changeset View
Standalone View
Standalone View
source/blender/modifiers/intern/MOD_triangulate.cc
- This file was moved from source/blender/modifiers/intern/MOD_triangulate.c.
| Show All 39 Lines | static Mesh *triangulate_mesh(Mesh *mesh, | ||||
| const int ngon_method, | const int ngon_method, | ||||
| const int min_vertices, | const int min_vertices, | ||||
| const int flag) | const int flag) | ||||
| { | { | ||||
| Mesh *result; | Mesh *result; | ||||
| BMesh *bm; | BMesh *bm; | ||||
| int edges_num, i; | int edges_num, i; | ||||
| MEdge *me; | MEdge *me; | ||||
| CustomData_MeshMasks cd_mask_extra = { | CustomData_MeshMasks cd_mask_extra{}; | ||||
| .vmask = CD_MASK_ORIGINDEX, .emask = CD_MASK_ORIGINDEX, .pmask = CD_MASK_ORIGINDEX}; | cd_mask_extra.vmask = CD_MASK_ORIGINDEX; | ||||
| cd_mask_extra.emask = CD_MASK_ORIGINDEX; | |||||
| cd_mask_extra.pmask = CD_MASK_ORIGINDEX; | |||||
| bool keep_clnors = (flag & MOD_TRIANGULATE_KEEP_CUSTOMLOOP_NORMALS) != 0; | bool keep_clnors = (flag & MOD_TRIANGULATE_KEEP_CUSTOMLOOP_NORMALS) != 0; | ||||
| if (keep_clnors) { | if (keep_clnors) { | ||||
| BKE_mesh_calc_normals_split(mesh); | BKE_mesh_calc_normals_split(mesh); | ||||
| /* We need that one to 'survive' to/from BMesh conversions. */ | /* We need that one to 'survive' to/from BMesh conversions. */ | ||||
| CustomData_clear_layer_flag(&mesh->ldata, CD_NORMAL, CD_FLAG_TEMPORARY); | CustomData_clear_layer_flag(&mesh->ldata, CD_NORMAL, CD_FLAG_TEMPORARY); | ||||
| cd_mask_extra.lmask |= CD_MASK_NORMAL; | cd_mask_extra.lmask |= CD_MASK_NORMAL; | ||||
| } | } | ||||
| bm = BKE_mesh_to_bmesh_ex(mesh, | BMeshCreateParams bmesh_create_params{}; | ||||
| &((struct BMeshCreateParams){0}), | BMeshFromMeshParams bmesh_from_mesh_params{}; | ||||
| &((struct BMeshFromMeshParams){ | bmesh_from_mesh_params.calc_face_normal = true; | ||||
| .calc_face_normal = true, | bmesh_from_mesh_params.calc_vert_normal = false; | ||||
| .calc_vert_normal = false, | bmesh_from_mesh_params.cd_mask_extra = cd_mask_extra; | ||||
| .cd_mask_extra = cd_mask_extra, | |||||
| })); | |||||
| BM_mesh_triangulate(bm, quad_method, ngon_method, min_vertices, false, NULL, NULL, NULL); | bm = BKE_mesh_to_bmesh_ex(mesh, &bmesh_create_params, &bmesh_from_mesh_params); | ||||
| BM_mesh_triangulate( | |||||
| bm, quad_method, ngon_method, min_vertices, false, nullptr, nullptr, nullptr); | |||||
| result = BKE_mesh_from_bmesh_for_eval_nomain(bm, &cd_mask_extra, mesh); | result = BKE_mesh_from_bmesh_for_eval_nomain(bm, &cd_mask_extra, mesh); | ||||
| BM_mesh_free(bm); | BM_mesh_free(bm); | ||||
| if (keep_clnors) { | if (keep_clnors) { | ||||
| float(*lnors)[3] = CustomData_get_layer(&result->ldata, CD_NORMAL); | float(*lnors)[3] = static_cast<float(*)[3]>(CustomData_get_layer(&result->ldata, CD_NORMAL)); | ||||
| BLI_assert(lnors != NULL); | BLI_assert(lnors != nullptr); | ||||
| BKE_mesh_set_custom_normals(result, lnors); | BKE_mesh_set_custom_normals(result, lnors); | ||||
| /* Do some cleanup, we do not want those temp data to stay around. */ | /* Do some cleanup, we do not want those temp data to stay around. */ | ||||
| CustomData_set_layer_flag(&mesh->ldata, CD_NORMAL, CD_FLAG_TEMPORARY); | CustomData_set_layer_flag(&mesh->ldata, CD_NORMAL, CD_FLAG_TEMPORARY); | ||||
| CustomData_set_layer_flag(&result->ldata, CD_NORMAL, CD_FLAG_TEMPORARY); | CustomData_set_layer_flag(&result->ldata, CD_NORMAL, CD_FLAG_TEMPORARY); | ||||
| } | } | ||||
| Show All 36 Lines | |||||
| { | { | ||||
| uiLayout *layout = panel->layout; | uiLayout *layout = panel->layout; | ||||
| PointerRNA ob_ptr; | PointerRNA ob_ptr; | ||||
| PointerRNA *ptr = modifier_panel_get_property_pointers(panel, &ob_ptr); | PointerRNA *ptr = modifier_panel_get_property_pointers(panel, &ob_ptr); | ||||
| uiLayoutSetPropSep(layout, true); | uiLayoutSetPropSep(layout, true); | ||||
| uiItemR(layout, ptr, "quad_method", 0, NULL, ICON_NONE); | uiItemR(layout, ptr, "quad_method", 0, nullptr, ICON_NONE); | ||||
| uiItemR(layout, ptr, "ngon_method", 0, NULL, ICON_NONE); | uiItemR(layout, ptr, "ngon_method", 0, nullptr, ICON_NONE); | ||||
| uiItemR(layout, ptr, "min_vertices", 0, NULL, ICON_NONE); | uiItemR(layout, ptr, "min_vertices", 0, nullptr, ICON_NONE); | ||||
| uiItemR(layout, ptr, "keep_custom_normals", 0, NULL, ICON_NONE); | uiItemR(layout, ptr, "keep_custom_normals", 0, nullptr, ICON_NONE); | ||||
| modifier_panel_end(layout, ptr); | modifier_panel_end(layout, ptr); | ||||
| } | } | ||||
| static void panelRegister(ARegionType *region_type) | static void panelRegister(ARegionType *region_type) | ||||
| { | { | ||||
| modifier_panel_register(region_type, eModifierType_Triangulate, panel_draw); | modifier_panel_register(region_type, eModifierType_Triangulate, panel_draw); | ||||
| } | } | ||||
| ModifierTypeInfo modifierType_Triangulate = { | ModifierTypeInfo modifierType_Triangulate = { | ||||
| /* name */ N_("Triangulate"), | /* name */ N_("Triangulate"), | ||||
| /* structName */ "TriangulateModifierData", | /* structName */ "TriangulateModifierData", | ||||
| /* structSize */ sizeof(TriangulateModifierData), | /* structSize */ sizeof(TriangulateModifierData), | ||||
| /* srna */ &RNA_TriangulateModifier, | /* srna */ &RNA_TriangulateModifier, | ||||
| /* type */ eModifierTypeType_Constructive, | /* type */ eModifierTypeType_Constructive, | ||||
| /* flags */ eModifierTypeFlag_AcceptsMesh | eModifierTypeFlag_SupportsEditmode | | /* flags */ eModifierTypeFlag_AcceptsMesh | eModifierTypeFlag_SupportsEditmode | | ||||
| eModifierTypeFlag_SupportsMapping | eModifierTypeFlag_EnableInEditmode | | eModifierTypeFlag_SupportsMapping | eModifierTypeFlag_EnableInEditmode | | ||||
| eModifierTypeFlag_AcceptsCVs, | eModifierTypeFlag_AcceptsCVs, | ||||
| /* icon */ ICON_MOD_TRIANGULATE, | /* icon */ ICON_MOD_TRIANGULATE, | ||||
| /* copyData */ BKE_modifier_copydata_generic, | /* copyData */ BKE_modifier_copydata_generic, | ||||
| /* deformVerts */ NULL, | /* deformVerts */ nullptr, | ||||
| /* deformMatrices */ NULL, | /* deformMatrices */ nullptr, | ||||
| /* deformVertsEM */ NULL, | /* deformVertsEM */ nullptr, | ||||
| /* deformMatricesEM */ NULL, | /* deformMatricesEM */ nullptr, | ||||
| /* modifyMesh */ modifyMesh, | /* modifyMesh */ modifyMesh, | ||||
| /* modifyGeometrySet */ NULL, | /* modifyGeometrySet */ nullptr, | ||||
| /* initData */ initData, | /* initData */ initData, | ||||
| /* requiredDataMask */ NULL, // requiredDataMask, | /* requiredDataMask */ nullptr, // requiredDataMask, | ||||
| /* freeData */ NULL, | /* freeData */ nullptr, | ||||
| /* isDisabled */ NULL, | /* isDisabled */ nullptr, | ||||
| /* updateDepsgraph */ NULL, | /* updateDepsgraph */ nullptr, | ||||
| /* dependsOnTime */ NULL, | /* dependsOnTime */ nullptr, | ||||
| /* dependsOnNormals */ NULL, | /* dependsOnNormals */ nullptr, | ||||
| /* foreachIDLink */ NULL, | /* foreachIDLink */ nullptr, | ||||
| /* foreachTexLink */ NULL, | /* foreachTexLink */ nullptr, | ||||
| /* freeRuntimeData */ NULL, | /* freeRuntimeData */ nullptr, | ||||
| /* panelRegister */ panelRegister, | /* panelRegister */ panelRegister, | ||||
| /* blendWrite */ NULL, | /* blendWrite */ nullptr, | ||||
| /* blendRead */ NULL, | /* blendRead */ nullptr, | ||||
| }; | }; | ||||