Blender V4.3
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
9#include <cstring>
10
11#include "MEM_guardedalloc.h"
12
13#include "BLI_utildefines.h"
14
15#include "BLT_translation.hh"
16
17#include "DNA_defaults.h"
18#include "DNA_screen_types.h"
19
20#include "BKE_mesh.hh"
21#include "BKE_modifier.hh"
22
23#include "UI_interface.hh"
24#include "UI_resources.hh"
25
26#include "RNA_prototypes.hh"
27
28#include "bmesh.hh"
29#include "bmesh_tools.hh"
30
31#include "MOD_ui_common.hh"
32
34 const int quad_method,
35 const int ngon_method,
36 const int min_vertices,
37 const int flag)
38{
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) {
49 void *data = CustomData_add_layer(
50 &mesh->corner_data, CD_NORMAL, CD_CONSTRUCT, mesh->corners_num);
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) {
70 float(*corner_normals)[3] = static_cast<float(*)[3]>(
71 CustomData_get_layer_for_write(&result->corner_data, CD_NORMAL, result->corners_num));
72 BKE_mesh_set_custom_normals_normalized(result, corner_normals);
73 CustomData_free_layers(&result->corner_data, CD_NORMAL, result->corners_num);
74 }
75
76 return result;
77}
78
79static void init_data(ModifierData *md)
80{
82
84
86
87 /* Enable in editmode by default */
89}
90
91static Mesh *modify_mesh(ModifierData *md, const ModifierEvalContext * /*ctx*/, Mesh *mesh)
92{
94 Mesh *result;
95 if (!(result = triangulate_mesh(
96 mesh, tmd->quad_method, tmd->ngon_method, tmd->min_vertices, tmd->flag)))
97 {
98 return mesh;
99 }
100
101 return result;
102}
103
104static void panel_draw(const bContext * /*C*/, Panel *panel)
105{
106 uiLayout *layout = panel->layout;
107
108 PointerRNA ob_ptr;
110
111 uiLayoutSetPropSep(layout, true);
112
113 uiItemR(layout, ptr, "quad_method", UI_ITEM_NONE, nullptr, ICON_NONE);
114 uiItemR(layout, ptr, "ngon_method", UI_ITEM_NONE, nullptr, ICON_NONE);
115 uiItemR(layout, ptr, "min_vertices", UI_ITEM_NONE, nullptr, ICON_NONE);
116 uiItemR(layout, ptr, "keep_custom_normals", UI_ITEM_NONE, nullptr, ICON_NONE);
117
118 modifier_panel_end(layout, ptr);
119}
120
121static void panel_register(ARegionType *region_type)
122{
124}
125
127 /*idname*/ "Triangulate",
128 /*name*/ N_("Triangulate"),
129 /*struct_name*/ "TriangulateModifierData",
130 /*struct_size*/ sizeof(TriangulateModifierData),
131 /*srna*/ &RNA_TriangulateModifier,
136 /*icon*/ ICON_MOD_TRIANGULATE,
137
138 /*copy_data*/ BKE_modifier_copydata_generic,
139
140 /*deform_verts*/ nullptr,
141 /*deform_matrices*/ nullptr,
142 /*deform_verts_EM*/ nullptr,
143 /*deform_matrices_EM*/ nullptr,
144 /*modify_mesh*/ modify_mesh,
145 /*modify_geometry_set*/ nullptr,
146
147 /*init_data*/ init_data,
148 /*required_data_mask*/ nullptr, // required_data_mask,
149 /*free_data*/ nullptr,
150 /*is_disabled*/ nullptr,
151 /*update_depsgraph*/ nullptr,
152 /*depends_on_time*/ nullptr,
153 /*depends_on_normals*/ nullptr,
154 /*foreach_ID_link*/ nullptr,
155 /*foreach_tex_link*/ nullptr,
156 /*free_runtime_data*/ nullptr,
157 /*panel_register*/ panel_register,
158 /*blend_write*/ nullptr,
159 /*blend_read*/ nullptr,
160 /*foreach_cache*/ nullptr,
161};
@ CD_CONSTRUCT
void CustomData_free_layers(CustomData *data, eCustomDataType type, int totelem)
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)
void BKE_mesh_set_custom_normals_normalized(Mesh *mesh, float(*r_custom_loop_normals)[3])
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:50
#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
struct TriangulateModifierData TriangulateModifierData
@ MOD_TRIANGULATE_KEEP_CUSTOMLOOP_NORMALS
Read Guarded memory(de)allocation.
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)
void modifier_panel_end(uiLayout *layout, PointerRNA *ptr)
PanelType * modifier_panel_register(ARegionType *region_type, ModifierType type, PanelDrawFn draw)
PointerRNA * modifier_panel_get_property_pointers(Panel *panel, PointerRNA *r_ob_ptr)
void uiLayoutSetPropSep(uiLayout *layout, bool is_sep)
#define UI_ITEM_NONE
void uiItemR(uiLayout *layout, PointerRNA *ptr, const char *propname, eUI_Item_Flag flag, const char *name, int icon)
ATTR_WARN_UNUSED_RESULT 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)
draw_view in_light_buf[] float
struct uiLayout * layout
#define N_(msgid)
PointerRNA * ptr
Definition wm_files.cc:4126
uint8_t flag
Definition wm_window.cc:138