Blender V5.0
MOD_triangulate.cc
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2023 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
8
9#include <cstring>
10
11#include "BLI_utildefines.h"
12
13#include "BLT_translation.hh"
14
15#include "DNA_defaults.h"
16#include "DNA_screen_types.h"
17
18#include "BKE_mesh.hh"
19#include "BKE_modifier.hh"
20
22#include "UI_resources.hh"
23
24#include "RNA_prototypes.hh"
25#include "RNA_types.hh"
26
27#include "bmesh.hh"
28#include "bmesh_tools.hh"
29
30#include "MOD_ui_common.hh"
31
33 const int quad_method,
34 const int ngon_method,
35 const int min_vertices,
36 const int flag)
37{
38 using namespace blender;
39 Mesh *result;
40 BMesh *bm;
41 CustomData_MeshMasks cd_mask_extra{};
42 cd_mask_extra.vmask = CD_MASK_ORIGINDEX;
43 cd_mask_extra.emask = CD_MASK_ORIGINDEX;
44 cd_mask_extra.pmask = CD_MASK_ORIGINDEX;
45
46 bool keep_clnors = (flag & MOD_TRIANGULATE_KEEP_CUSTOMLOOP_NORMALS) != 0;
47
48 if (keep_clnors) {
51 memcpy(data, mesh->corner_normals().data(), mesh->corner_normals().size_in_bytes());
52 cd_mask_extra.lmask |= CD_MASK_NORMAL;
53 }
54
55 BMeshCreateParams bmesh_create_params{};
56 BMeshFromMeshParams bmesh_from_mesh_params{};
57 bmesh_from_mesh_params.calc_face_normal = true;
58 bmesh_from_mesh_params.calc_vert_normal = false;
59 bmesh_from_mesh_params.cd_mask_extra = cd_mask_extra;
60
61 bm = BKE_mesh_to_bmesh_ex(mesh, &bmesh_create_params, &bmesh_from_mesh_params);
62
64 bm, quad_method, ngon_method, min_vertices, false, nullptr, nullptr, nullptr);
65
66 result = BKE_mesh_from_bmesh_for_eval_nomain(bm, &cd_mask_extra, mesh);
68
69 if (keep_clnors) {
71 *result,
72 {static_cast<float3 *>(
73 CustomData_get_layer_for_write(&result->corner_data, CD_NORMAL, result->corners_num)),
74 result->corners_num});
76 }
77
78 return result;
79}
80
92
93static Mesh *modify_mesh(ModifierData *md, const ModifierEvalContext * /*ctx*/, Mesh *mesh)
94{
97 mesh, tmd->quad_method, tmd->ngon_method, tmd->min_vertices, tmd->flag);
98 return (result) ? result : mesh;
99}
100
101static void panel_draw(const bContext * /*C*/, Panel *panel)
102{
103 uiLayout *layout = panel->layout;
104
105 PointerRNA ob_ptr;
107
108 layout->use_property_split_set(true);
109
110 layout->prop(ptr, "quad_method", UI_ITEM_NONE, std::nullopt, ICON_NONE);
111 layout->prop(ptr, "ngon_method", UI_ITEM_NONE, std::nullopt, ICON_NONE);
112 layout->prop(ptr, "min_vertices", UI_ITEM_NONE, std::nullopt, ICON_NONE);
113 layout->prop(ptr, "keep_custom_normals", UI_ITEM_NONE, std::nullopt, ICON_NONE);
114
116}
117
118static void panel_register(ARegionType *region_type)
119{
121}
122
124 /*idname*/ "Triangulate",
125 /*name*/ N_("Triangulate"),
126 /*struct_name*/ "TriangulateModifierData",
127 /*struct_size*/ sizeof(TriangulateModifierData),
128 /*srna*/ &RNA_TriangulateModifier,
133 /*icon*/ ICON_MOD_TRIANGULATE,
134
135 /*copy_data*/ BKE_modifier_copydata_generic,
136
137 /*deform_verts*/ nullptr,
138 /*deform_matrices*/ nullptr,
139 /*deform_verts_EM*/ nullptr,
140 /*deform_matrices_EM*/ nullptr,
141 /*modify_mesh*/ modify_mesh,
142 /*modify_geometry_set*/ nullptr,
143
144 /*init_data*/ init_data,
145 /*required_data_mask*/ nullptr, // required_data_mask,
146 /*free_data*/ nullptr,
147 /*is_disabled*/ nullptr,
148 /*update_depsgraph*/ nullptr,
149 /*depends_on_time*/ nullptr,
150 /*depends_on_normals*/ nullptr,
151 /*foreach_ID_link*/ nullptr,
152 /*foreach_tex_link*/ nullptr,
153 /*free_runtime_data*/ nullptr,
154 /*panel_register*/ panel_register,
155 /*blend_write*/ nullptr,
156 /*blend_read*/ nullptr,
157 /*foreach_cache*/ nullptr,
158 /*foreach_working_space_color*/ nullptr,
159};
@ CD_CONSTRUCT
void CustomData_free_layers(CustomData *data, eCustomDataType type)
void * CustomData_get_layer_for_write(CustomData *data, eCustomDataType type, int totelem)
void * CustomData_add_layer(CustomData *data, eCustomDataType type, eCDAllocType alloctype, int totelem)
Mesh * BKE_mesh_from_bmesh_for_eval_nomain(BMesh *bm, const CustomData_MeshMasks *cd_mask_extra, const Mesh *me_settings)
BMesh * BKE_mesh_to_bmesh_ex(const Mesh *mesh, const BMeshCreateParams *create_params, const BMeshFromMeshParams *convert_params)
void BKE_modifier_copydata_generic(const ModifierData *md, ModifierData *md_dst, int flag)
@ eModifierTypeFlag_AcceptsCVs
@ eModifierTypeFlag_SupportsMapping
@ eModifierTypeFlag_EnableInEditmode
@ eModifierTypeFlag_SupportsEditmode
@ eModifierTypeFlag_AcceptsMesh
#define BLI_assert(a)
Definition BLI_assert.h:46
#define MEMCMP_STRUCT_AFTER_IS_ZERO(struct_var, member)
#define MEMCPY_STRUCT_AFTER(struct_dst, struct_src, member)
#define CD_MASK_NORMAL
#define CD_MASK_ORIGINDEX
#define DNA_struct_default_get(struct_name)
@ eModifierMode_Editmode
@ eModifierType_Triangulate
@ MOD_TRIANGULATE_KEEP_CUSTOMLOOP_NORMALS
static void init_data(ModifierData *md)
static void panel_register(ARegionType *region_type)
static void panel_draw(const bContext *, Panel *panel)
static Mesh * modify_mesh(ModifierData *md, const ModifierEvalContext *ctx, Mesh *mesh)
Definition MOD_array.cc:862
static void init_data(ModifierData *md)
static Mesh * triangulate_mesh(Mesh *mesh, const int quad_method, const int ngon_method, const int min_vertices, const int flag)
static void panel_register(ARegionType *region_type)
ModifierTypeInfo modifierType_Triangulate
static Mesh * modify_mesh(ModifierData *md, const ModifierEvalContext *, Mesh *mesh)
static void panel_draw(const bContext *, Panel *panel)
PanelType * modifier_panel_register(ARegionType *region_type, ModifierType type, PanelDrawFn draw)
PointerRNA * modifier_panel_get_property_pointers(Panel *panel, PointerRNA *r_ob_ptr)
void modifier_error_message_draw(uiLayout *layout, PointerRNA *ptr)
#define UI_ITEM_NONE
BMesh const char void * data
BMesh * bm
void BM_mesh_free(BMesh *bm)
BMesh Free Mesh.
void BM_mesh_triangulate(BMesh *bm, const int quad_method, const int ngon_method, const int min_vertices, const bool tag_only, BMOperator *op, BMOpSlot *slot_facemap_out, BMOpSlot *slot_facemap_double_out)
void mesh_set_custom_normals_normalized(Mesh &mesh, MutableSpan< float3 > corner_normals)
struct CustomData_MeshMasks cd_mask_extra
int corners_num
CustomData corner_data
struct uiLayout * layout
void use_property_split_set(bool value)
void prop(PointerRNA *ptr, PropertyRNA *prop, int index, int value, eUI_Item_Flag flag, std::optional< blender::StringRef > name_opt, int icon, std::optional< blender::StringRef > placeholder=std::nullopt)
#define N_(msgid)
PointerRNA * ptr
Definition wm_files.cc:4238
uint8_t flag
Definition wm_window.cc:145