Blender  V3.3
MOD_solidify.c
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-or-later
2  * Copyright 2005 Blender Foundation. All rights reserved. */
3 
8 #include <string.h>
9 
10 #include "BLI_utildefines.h"
11 
12 #include "BLT_translation.h"
13 
14 #include "DNA_defaults.h"
15 #include "DNA_mesh_types.h"
16 #include "DNA_object_types.h"
17 #include "DNA_screen_types.h"
18 
19 #include "BKE_context.h"
20 #include "BKE_particle.h"
21 #include "BKE_screen.h"
22 
23 #include "UI_interface.h"
24 #include "UI_resources.h"
25 
26 #include "RNA_access.h"
27 #include "RNA_prototypes.h"
28 
29 #include "MOD_modifiertypes.h"
30 #include "MOD_ui_common.h"
31 
32 #include "MOD_solidify_util.h"
33 
35 {
36  const SolidifyModifierData *smd = (SolidifyModifierData *)md;
37  /* even when we calculate our own normals,
38  * the vertex normals are used as a fallback
39  * if manifold is enabled vertex normals are not used */
40  return smd->mode == MOD_SOLIDIFY_MODE_EXTRUDE;
41 }
42 
43 static void initData(ModifierData *md)
44 {
46 
48 
50 }
51 
52 #ifdef __GNUC__
53 # pragma GCC diagnostic error "-Wsign-conversion"
54 #endif
55 
56 static void requiredDataMask(Object *UNUSED(ob),
57  ModifierData *md,
58  CustomData_MeshMasks *r_cddata_masks)
59 {
61 
62  /* ask for vertexgroups if we need them */
63  if (smd->defgrp_name[0] != '\0' || smd->shell_defgrp_name[0] != '\0' ||
64  smd->rim_defgrp_name[0] != '\0') {
65  r_cddata_masks->vmask |= CD_MASK_MDEFORMVERT;
66  }
67 }
68 
70 {
71  const SolidifyModifierData *smd = (SolidifyModifierData *)md;
72  switch (smd->mode) {
74  return MOD_solidify_extrude_modifyMesh(md, ctx, mesh);
77  default:
79  }
80  return mesh;
81 }
82 
83 static void panel_draw(const bContext *UNUSED(C), Panel *panel)
84 {
85  uiLayout *sub, *row, *col;
86  uiLayout *layout = panel->layout;
87 
88  PointerRNA ob_ptr;
90 
91  int solidify_mode = RNA_enum_get(ptr, "solidify_mode");
92  bool has_vertex_group = RNA_string_length(ptr, "vertex_group") != 0;
93 
94  uiLayoutSetPropSep(layout, true);
95 
96  uiItemR(layout, ptr, "solidify_mode", 0, NULL, ICON_NONE);
97 
98  if (solidify_mode == MOD_SOLIDIFY_MODE_NONMANIFOLD) {
99  uiItemR(layout, ptr, "nonmanifold_thickness_mode", 0, IFACE_("Thickness Mode"), ICON_NONE);
100  uiItemR(layout, ptr, "nonmanifold_boundary_mode", 0, IFACE_("Boundary"), ICON_NONE);
101  }
102 
103  uiItemR(layout, ptr, "thickness", 0, NULL, ICON_NONE);
104  uiItemR(layout, ptr, "offset", 0, NULL, ICON_NONE);
105 
106  if (solidify_mode == MOD_SOLIDIFY_MODE_NONMANIFOLD) {
107  uiItemR(layout, ptr, "nonmanifold_merge_threshold", 0, NULL, ICON_NONE);
108  }
109  else {
110  uiItemR(layout, ptr, "use_even_offset", 0, NULL, ICON_NONE);
111  }
112 
113  col = uiLayoutColumnWithHeading(layout, false, IFACE_("Rim"));
114  uiItemR(col, ptr, "use_rim", 0, IFACE_("Fill"), ICON_NONE);
115  sub = uiLayoutColumn(col, false);
116  uiLayoutSetActive(sub, RNA_boolean_get(ptr, "use_rim"));
117  uiItemR(sub, ptr, "use_rim_only", 0, NULL, ICON_NONE);
118 
119  uiItemS(layout);
120 
121  modifier_vgroup_ui(layout, ptr, &ob_ptr, "vertex_group", "invert_vertex_group", NULL);
122  row = uiLayoutRow(layout, false);
123  uiLayoutSetActive(row, has_vertex_group);
124  uiItemR(row, ptr, "thickness_vertex_group", 0, IFACE_("Factor"), ICON_NONE);
125 
126  if (solidify_mode == MOD_SOLIDIFY_MODE_NONMANIFOLD) {
127  row = uiLayoutRow(layout, false);
128  uiLayoutSetActive(row, has_vertex_group);
129  uiItemR(row, ptr, "use_flat_faces", 0, NULL, ICON_NONE);
130  }
131 
132  modifier_panel_end(layout, ptr);
133 }
134 
135 static void normals_panel_draw(const bContext *UNUSED(C), Panel *panel)
136 {
137  uiLayout *col;
138  uiLayout *layout = panel->layout;
139 
140  PointerRNA ob_ptr;
142 
143  int solidify_mode = RNA_enum_get(ptr, "solidify_mode");
144 
145  uiLayoutSetPropSep(layout, true);
146 
147  col = uiLayoutColumn(layout, false);
148  uiItemR(col, ptr, "use_flip_normals", 0, IFACE_("Flip"), ICON_NONE);
149  if (solidify_mode == MOD_SOLIDIFY_MODE_EXTRUDE) {
150  uiItemR(col, ptr, "use_quality_normals", 0, IFACE_("High Quality"), ICON_NONE);
151  }
152 }
153 
154 static void materials_panel_draw(const bContext *UNUSED(C), Panel *panel)
155 {
156  uiLayout *col;
157  uiLayout *layout = panel->layout;
158 
159  PointerRNA ob_ptr;
161 
162  uiLayoutSetPropSep(layout, true);
163 
164  uiItemR(layout, ptr, "material_offset", 0, NULL, ICON_NONE);
165  col = uiLayoutColumn(layout, true);
167  uiItemR(col, ptr, "material_offset_rim", 0, IFACE_("Rim"), ICON_NONE);
168 }
169 
170 static void edge_data_panel_draw(const bContext *UNUSED(C), Panel *panel)
171 {
172  uiLayout *layout = panel->layout;
173 
174  PointerRNA ob_ptr;
176 
177  int solidify_mode = RNA_enum_get(ptr, "solidify_mode");
178 
179  uiLayoutSetPropSep(layout, true);
180 
181  if (solidify_mode == MOD_SOLIDIFY_MODE_EXTRUDE) {
182  uiLayout *col;
183  col = uiLayoutColumn(layout, true);
184  uiItemR(col, ptr, "edge_crease_inner", 0, IFACE_("Crease Inner"), ICON_NONE);
185  uiItemR(col, ptr, "edge_crease_outer", 0, IFACE_("Outer"), ICON_NONE);
186  uiItemR(col, ptr, "edge_crease_rim", 0, IFACE_("Rim"), ICON_NONE);
187  }
188  uiItemR(layout, ptr, "bevel_convex", UI_ITEM_R_SLIDER, NULL, ICON_NONE);
189 }
190 
191 static void clamp_panel_draw(const bContext *UNUSED(C), Panel *panel)
192 {
193  uiLayout *row, *col;
194  uiLayout *layout = panel->layout;
195 
196  PointerRNA ob_ptr;
198 
199  uiLayoutSetPropSep(layout, true);
200 
201  col = uiLayoutColumn(layout, false);
202  uiItemR(col, ptr, "thickness_clamp", 0, NULL, ICON_NONE);
203  row = uiLayoutRow(col, false);
204  uiLayoutSetActive(row, RNA_float_get(ptr, "thickness_clamp") > 0.0f);
205  uiItemR(row, ptr, "use_thickness_angle_clamp", 0, NULL, ICON_NONE);
206 }
207 
208 static void vertex_group_panel_draw(const bContext *UNUSED(C), Panel *panel)
209 {
210  uiLayout *col;
211  uiLayout *layout = panel->layout;
212 
213  PointerRNA ob_ptr;
215 
216  uiLayoutSetPropSep(layout, true);
217 
218  col = uiLayoutColumn(layout, false);
220  col, ptr, "shell_vertex_group", &ob_ptr, "vertex_groups", IFACE_("Shell"), ICON_NONE);
221  uiItemPointerR(col, ptr, "rim_vertex_group", &ob_ptr, "vertex_groups", IFACE_("Rim"), ICON_NONE);
222 }
223 
224 static void panelRegister(ARegionType *region_type)
225 {
228  region_type, "normals", "Normals", NULL, normals_panel_draw, panel_type);
230  region_type, "materials", "Materials", NULL, materials_panel_draw, panel_type);
232  region_type, "edge_data", "Edge Data", NULL, edge_data_panel_draw, panel_type);
234  region_type, "clamp", "Thickness Clamp", NULL, clamp_panel_draw, panel_type);
235  modifier_subpanel_register(region_type,
236  "vertex_groups",
237  "Output Vertex Groups",
238  NULL,
240  panel_type);
241 }
242 
244  /* name */ N_("Solidify"),
245  /* structName */ "SolidifyModifierData",
246  /* structSize */ sizeof(SolidifyModifierData),
247  /* srna */ &RNA_SolidifyModifier,
249 
253  /* icon */ ICON_MOD_SOLIDIFY,
254 
255  /* copyData */ BKE_modifier_copydata_generic,
256 
257  /* deformVerts */ NULL,
258  /* deformMatrices */ NULL,
259  /* deformVertsEM */ NULL,
260  /* deformMatricesEM */ NULL,
261  /* modifyMesh */ modifyMesh,
262  /* modifyGeometrySet */ NULL,
263 
264  /* initData */ initData,
265  /* requiredDataMask */ requiredDataMask,
266  /* freeData */ NULL,
267  /* isDisabled */ NULL,
268  /* updateDepsgraph */ NULL,
269  /* dependsOnTime */ NULL,
270  /* dependsOnNormals */ dependsOnNormals,
271  /* foreachIDLink */ NULL,
272  /* foreachTexLink */ NULL,
273  /* freeRuntimeData */ NULL,
274  /* panelRegister */ panelRegister,
275  /* blendWrite */ NULL,
276  /* blendRead */ NULL,
277 };
@ 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_unreachable()
Definition: BLI_assert.h:93
#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 IFACE_(msgid)
#define CD_MASK_MDEFORMVERT
#define DNA_struct_default_get(struct_name)
Definition: DNA_defaults.h:29
@ MOD_SOLIDIFY_MODE_NONMANIFOLD
@ MOD_SOLIDIFY_MODE_EXTRUDE
struct SolidifyModifierData SolidifyModifierData
@ eModifierType_Solidify
Object is a sort of wrapper for general info.
static void vertex_group_panel_draw(const bContext *UNUSED(C), Panel *panel)
Definition: MOD_solidify.c:208
static Mesh * modifyMesh(ModifierData *md, const ModifierEvalContext *ctx, Mesh *mesh)
Definition: MOD_solidify.c:69
static void materials_panel_draw(const bContext *UNUSED(C), Panel *panel)
Definition: MOD_solidify.c:154
static bool dependsOnNormals(ModifierData *md)
Definition: MOD_solidify.c:34
static void edge_data_panel_draw(const bContext *UNUSED(C), Panel *panel)
Definition: MOD_solidify.c:170
static void normals_panel_draw(const bContext *UNUSED(C), Panel *panel)
Definition: MOD_solidify.c:135
static void panel_draw(const bContext *UNUSED(C), Panel *panel)
Definition: MOD_solidify.c:83
static void clamp_panel_draw(const bContext *UNUSED(C), Panel *panel)
Definition: MOD_solidify.c:191
static void initData(ModifierData *md)
Definition: MOD_solidify.c:43
static void panelRegister(ARegionType *region_type)
Definition: MOD_solidify.c:224
static void requiredDataMask(Object *UNUSED(ob), ModifierData *md, CustomData_MeshMasks *r_cddata_masks)
Definition: MOD_solidify.c:56
ModifierTypeInfo modifierType_Solidify
Definition: MOD_solidify.c:243
Mesh * MOD_solidify_extrude_modifyMesh(ModifierData *md, const ModifierEvalContext *ctx, Mesh *mesh)
Mesh * MOD_solidify_nonmanifold_modifyMesh(ModifierData *md, const ModifierEvalContext *ctx, Mesh *mesh)
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)
void modifier_vgroup_ui(uiLayout *layout, PointerRNA *ptr, PointerRNA *ob_ptr, const char *vgroup_prop, const char *invert_vgroup_prop, const char *text)
PanelType * modifier_subpanel_register(ARegionType *region_type, const char *name, const char *label, PanelDrawFn draw_header, PanelDrawFn draw, PanelType *parent)
#define C
Definition: RandGen.cpp:25
void uiLayoutSetActive(uiLayout *layout, bool active)
uiLayout * uiLayoutColumnWithHeading(uiLayout *layout, bool align, const char *heading)
uiLayout * uiLayoutColumn(uiLayout *layout, bool align)
void uiLayoutSetPropSep(uiLayout *layout, bool is_sep)
void uiItemS(uiLayout *layout)
uiLayout * uiLayoutRow(uiLayout *layout, bool align)
@ UI_ITEM_R_SLIDER
void uiItemR(uiLayout *layout, struct PointerRNA *ptr, const char *propname, int flag, const char *name, int icon)
void uiItemPointerR(uiLayout *layout, struct PointerRNA *ptr, const char *propname, struct PointerRNA *searchptr, const char *searchpropname, const char *name, int icon)
uint col
float RNA_float_get(PointerRNA *ptr, const char *name)
Definition: rna_access.c:4957
int RNA_string_length(PointerRNA *ptr, const char *name)
Definition: rna_access.c:5144
bool RNA_boolean_get(PointerRNA *ptr, const char *name)
Definition: rna_access.c:4863
int RNA_enum_get(PointerRNA *ptr, const char *name)
Definition: rna_access.c:5004
struct uiLayout * layout
#define N_(msgid)
PointerRNA * ptr
Definition: wm_files.c:3480