Blender  V3.3
MOD_triangulate.c
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-or-later */
2 
7 #include <string.h>
8 
9 #include "MEM_guardedalloc.h"
10 
11 #include "BLI_utildefines.h"
12 
13 #include "BLT_translation.h"
14 
15 #include "DNA_defaults.h"
16 #include "DNA_mesh_types.h"
17 #include "DNA_meshdata_types.h"
18 #include "DNA_object_types.h"
19 #include "DNA_screen_types.h"
20 
21 #include "BKE_context.h"
22 #include "BKE_mesh.h"
23 #include "BKE_modifier.h"
24 #include "BKE_screen.h"
25 
26 #include "UI_interface.h"
27 #include "UI_resources.h"
28 
29 #include "RNA_access.h"
30 #include "RNA_prototypes.h"
31 
32 #include "bmesh.h"
33 #include "bmesh_tools.h"
34 
35 #include "MOD_modifiertypes.h"
36 #include "MOD_ui_common.h"
37 
39  const int quad_method,
40  const int ngon_method,
41  const int min_vertices,
42  const int flag)
43 {
44  Mesh *result;
45  BMesh *bm;
46  int edges_num, i;
47  MEdge *me;
48  CustomData_MeshMasks cd_mask_extra = {
50 
51  bool keep_clnors = (flag & MOD_TRIANGULATE_KEEP_CUSTOMLOOP_NORMALS) != 0;
52 
53  if (keep_clnors) {
55  /* We need that one to 'survive' to/from BMesh conversions. */
57  cd_mask_extra.lmask |= CD_MASK_NORMAL;
58  }
59 
61  &((struct BMeshCreateParams){0}),
62  &((struct BMeshFromMeshParams){
63  .calc_face_normal = true,
64  .calc_vert_normal = false,
65  .cd_mask_extra = cd_mask_extra,
66  }));
67 
68  BM_mesh_triangulate(bm, quad_method, ngon_method, min_vertices, false, NULL, NULL, NULL);
69 
72 
73  if (keep_clnors) {
74  float(*lnors)[3] = CustomData_get_layer(&result->ldata, CD_NORMAL);
75  BLI_assert(lnors != NULL);
76 
78 
79  /* Do some cleanup, we do not want those temp data to stay around. */
82  }
83 
84  edges_num = result->totedge;
85  me = result->medge;
86 
87  /* force drawing of all edges (seems to be omitted in CDDM_from_bmesh) */
88  for (i = 0; i < edges_num; i++, me++) {
90  }
91 
92  return result;
93 }
94 
95 static void initData(ModifierData *md)
96 {
98 
100 
102 
103  /* Enable in editmode by default */
105 }
106 
108 {
110  Mesh *result;
111  if (!(result = triangulate_mesh(
112  mesh, tmd->quad_method, tmd->ngon_method, tmd->min_vertices, tmd->flag))) {
113  return mesh;
114  }
115 
116  return result;
117 }
118 
119 static void panel_draw(const bContext *UNUSED(C), Panel *panel)
120 {
121  uiLayout *layout = panel->layout;
122 
123  PointerRNA ob_ptr;
125 
126  uiLayoutSetPropSep(layout, true);
127 
128  uiItemR(layout, ptr, "quad_method", 0, NULL, ICON_NONE);
129  uiItemR(layout, ptr, "ngon_method", 0, NULL, ICON_NONE);
130  uiItemR(layout, ptr, "min_vertices", 0, NULL, ICON_NONE);
131  uiItemR(layout, ptr, "keep_custom_normals", 0, NULL, ICON_NONE);
132 
133  modifier_panel_end(layout, ptr);
134 }
135 
136 static void panelRegister(ARegionType *region_type)
137 {
139 }
140 
142  /* name */ N_("Triangulate"),
143  /* structName */ "TriangulateModifierData",
144  /* structSize */ sizeof(TriangulateModifierData),
145  /* srna */ &RNA_TriangulateModifier,
150  /* icon */ ICON_MOD_TRIANGULATE,
151 
152  /* copyData */ BKE_modifier_copydata_generic,
153 
154  /* deformVerts */ NULL,
155  /* deformMatrices */ NULL,
156  /* deformVertsEM */ NULL,
157  /* deformMatricesEM */ NULL,
158  /* modifyMesh */ modifyMesh,
159  /* modifyGeometrySet */ NULL,
160 
161  /* initData */ initData,
162  /* requiredDataMask */ NULL, // requiredDataMask,
163  /* freeData */ NULL,
164  /* isDisabled */ NULL,
165  /* updateDepsgraph */ NULL,
166  /* dependsOnTime */ NULL,
167  /* dependsOnNormals */ NULL,
168  /* foreachIDLink */ NULL,
169  /* foreachTexLink */ NULL,
170  /* freeRuntimeData */ NULL,
171  /* panelRegister */ panelRegister,
172  /* blendWrite */ NULL,
173  /* blendRead */ NULL,
174 };
typedef float(TangentPoint)[2]
void CustomData_clear_layer_flag(struct CustomData *data, int type, int flag)
Definition: customdata.cc:2635
void * CustomData_get_layer(const struct CustomData *data, int type)
void CustomData_set_layer_flag(struct CustomData *data, int type, int flag)
Definition: customdata.cc:2626
struct BMesh * BKE_mesh_to_bmesh_ex(const struct Mesh *me, const struct BMeshCreateParams *create_params, const struct BMeshFromMeshParams *convert_params)
struct Mesh * BKE_mesh_from_bmesh_for_eval_nomain(struct BMesh *bm, const struct CustomData_MeshMasks *cd_mask_extra, const struct Mesh *me_settings)
void BKE_mesh_calc_normals_split(struct Mesh *mesh)
Definition: mesh.cc:1911
void BKE_mesh_set_custom_normals(struct Mesh *mesh, float(*r_custom_loopnors)[3])
@ eModifierTypeFlag_AcceptsCVs
Definition: BKE_modifier.h:67
@ eModifierTypeFlag_SupportsMapping
Definition: BKE_modifier.h:68
@ eModifierTypeFlag_EnableInEditmode
Definition: BKE_modifier.h:78
@ eModifierTypeFlag_SupportsEditmode
Definition: BKE_modifier.h:69
@ eModifierTypeFlag_AcceptsMesh
Definition: BKE_modifier.h:66
void BKE_modifier_copydata_generic(const struct ModifierData *md, struct ModifierData *md_dst, int flag)
@ eModifierTypeType_Constructive
Definition: BKE_modifier.h:47
#define BLI_assert(a)
Definition: BLI_assert.h:46
#define UNUSED(x)
#define MEMCMP_STRUCT_AFTER_IS_ZERO(struct_var, member)
#define MEMCPY_STRUCT_AFTER(struct_dst, struct_src, member)
#define CD_MASK_NORMAL
@ CD_FLAG_TEMPORARY
#define CD_MASK_ORIGINDEX
#define DNA_struct_default_get(struct_name)
Definition: DNA_defaults.h:29
@ ME_EDGEDRAW
@ ME_EDGERENDER
@ eModifierMode_Editmode
@ MOD_TRIANGULATE_KEEP_CUSTOMLOOP_NORMALS
@ eModifierType_Triangulate
struct TriangulateModifierData TriangulateModifierData
Object is a sort of wrapper for general info.
Read Guarded memory(de)allocation.
ModifierTypeInfo modifierType_Triangulate
static Mesh * modifyMesh(ModifierData *md, const ModifierEvalContext *UNUSED(ctx), Mesh *mesh)
static Mesh * triangulate_mesh(Mesh *mesh, const int quad_method, const int ngon_method, const int min_vertices, const int flag)
static void panel_draw(const bContext *UNUSED(C), Panel *panel)
static void initData(ModifierData *md)
static void panelRegister(ARegionType *region_type)
PointerRNA * modifier_panel_get_property_pointers(Panel *panel, PointerRNA *r_ob_ptr)
void modifier_panel_end(uiLayout *layout, PointerRNA *ptr)
Definition: MOD_ui_common.c:91
PanelType * modifier_panel_register(ARegionType *region_type, ModifierType type, PanelDrawFn draw)
#define C
Definition: RandGen.cpp:25
void uiLayoutSetPropSep(uiLayout *layout, bool is_sep)
void uiItemR(uiLayout *layout, struct PointerRNA *ptr, const char *propname, int flag, const char *name, int icon)
ATTR_WARN_UNUSED_RESULT BMesh * bm
void BM_mesh_free(BMesh *bm)
BMesh Free Mesh.
Definition: bmesh_mesh.cc:258
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)
CustomData ldata
struct uiLayout * layout
#define N_(msgid)
PointerRNA * ptr
Definition: wm_files.c:3480