Blender V4.5
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
21#include "UI_interface.hh"
22#include "UI_resources.hh"
23
24#include "RNA_prototypes.hh"
25
26#include "bmesh.hh"
27#include "bmesh_tools.hh"
28
29#include "MOD_ui_common.hh"
30
32 const int quad_method,
33 const int ngon_method,
34 const int min_vertices,
35 const int flag)
36{
37 using namespace blender;
38 Mesh *result;
39 BMesh *bm;
40 CustomData_MeshMasks cd_mask_extra{};
41 cd_mask_extra.vmask = CD_MASK_ORIGINDEX;
42 cd_mask_extra.emask = CD_MASK_ORIGINDEX;
43 cd_mask_extra.pmask = CD_MASK_ORIGINDEX;
44
45 bool keep_clnors = (flag & MOD_TRIANGULATE_KEEP_CUSTOMLOOP_NORMALS) != 0;
46
47 if (keep_clnors) {
50 memcpy(data, mesh->corner_normals().data(), mesh->corner_normals().size_in_bytes());
51 cd_mask_extra.lmask |= CD_MASK_NORMAL;
52 }
53
54 BMeshCreateParams bmesh_create_params{};
55 BMeshFromMeshParams bmesh_from_mesh_params{};
56 bmesh_from_mesh_params.calc_face_normal = true;
57 bmesh_from_mesh_params.calc_vert_normal = false;
58 bmesh_from_mesh_params.cd_mask_extra = cd_mask_extra;
59
60 bm = BKE_mesh_to_bmesh_ex(mesh, &bmesh_create_params, &bmesh_from_mesh_params);
61
63 bm, quad_method, ngon_method, min_vertices, false, nullptr, nullptr, nullptr);
64
65 result = BKE_mesh_from_bmesh_for_eval_nomain(bm, &cd_mask_extra, mesh);
67
68 if (keep_clnors) {
70 *result,
71 {static_cast<float3 *>(
72 CustomData_get_layer_for_write(&result->corner_data, CD_NORMAL, result->corners_num)),
73 result->corners_num});
75 }
76
77 return result;
78}
79
91
92static Mesh *modify_mesh(ModifierData *md, const ModifierEvalContext * /*ctx*/, Mesh *mesh)
93{
96 mesh, tmd->quad_method, tmd->ngon_method, tmd->min_vertices, tmd->flag);
97 return (result) ? result : mesh;
98}
99
100static void panel_draw(const bContext * /*C*/, Panel *panel)
101{
102 uiLayout *layout = panel->layout;
103
104 PointerRNA ob_ptr;
106
107 uiLayoutSetPropSep(layout, true);
108
109 layout->prop(ptr, "quad_method", UI_ITEM_NONE, std::nullopt, ICON_NONE);
110 layout->prop(ptr, "ngon_method", UI_ITEM_NONE, std::nullopt, ICON_NONE);
111 layout->prop(ptr, "min_vertices", UI_ITEM_NONE, std::nullopt, ICON_NONE);
112 layout->prop(ptr, "keep_custom_normals", UI_ITEM_NONE, std::nullopt, ICON_NONE);
113
115}
116
117static void panel_register(ARegionType *region_type)
118{
120}
121
123 /*idname*/ "Triangulate",
124 /*name*/ N_("Triangulate"),
125 /*struct_name*/ "TriangulateModifierData",
126 /*struct_size*/ sizeof(TriangulateModifierData),
127 /*srna*/ &RNA_TriangulateModifier,
132 /*icon*/ ICON_MOD_TRIANGULATE,
133
134 /*copy_data*/ BKE_modifier_copydata_generic,
135
136 /*deform_verts*/ nullptr,
137 /*deform_matrices*/ nullptr,
138 /*deform_verts_EM*/ nullptr,
139 /*deform_matrices_EM*/ nullptr,
140 /*modify_mesh*/ modify_mesh,
141 /*modify_geometry_set*/ nullptr,
142
143 /*init_data*/ init_data,
144 /*required_data_mask*/ nullptr, // required_data_mask,
145 /*free_data*/ nullptr,
146 /*is_disabled*/ nullptr,
147 /*update_depsgraph*/ nullptr,
148 /*depends_on_time*/ nullptr,
149 /*depends_on_normals*/ nullptr,
150 /*foreach_ID_link*/ nullptr,
151 /*foreach_tex_link*/ nullptr,
152 /*free_runtime_data*/ nullptr,
153 /*panel_register*/ panel_register,
154 /*blend_write*/ nullptr,
155 /*blend_read*/ nullptr,
156 /*foreach_cache*/ nullptr,
157};
@ 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 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)
void uiLayoutSetPropSep(uiLayout *layout, bool is_sep)
#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)
#define CD_MASK_NORMAL
#define CD_MASK_ORIGINDEX
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 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:4227
uint8_t flag
Definition wm_window.cc:139