Blender  V2.93
MOD_solidify.c
Go to the documentation of this file.
1 /*
2  * This program is free software; you can redistribute it and/or
3  * modify it under the terms of the GNU General Public License
4  * as published by the Free Software Foundation; either version 2
5  * of the License, or (at your option) any later version.
6  *
7  * This program is distributed in the hope that it will be useful,
8  * but WITHOUT ANY WARRANTY; without even the implied warranty of
9  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10  * GNU General Public License for more details.
11  *
12  * You should have received a copy of the GNU General Public License
13  * along with this program; if not, write to the Free Software Foundation,
14  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
15  *
16  * The Original Code is Copyright (C) 2005 by the Blender Foundation.
17  * All rights reserved.
18  */
19 
24 #include <string.h>
25 
26 #include "BLI_utildefines.h"
27 
28 #include "BLT_translation.h"
29 
30 #include "DNA_defaults.h"
31 #include "DNA_mesh_types.h"
32 #include "DNA_object_types.h"
33 #include "DNA_screen_types.h"
34 
35 #include "BKE_context.h"
36 #include "BKE_particle.h"
37 #include "BKE_screen.h"
38 
39 #include "UI_interface.h"
40 #include "UI_resources.h"
41 
42 #include "RNA_access.h"
43 
44 #include "MOD_modifiertypes.h"
45 #include "MOD_ui_common.h"
46 
47 #include "MOD_solidify_util.h"
48 
50 {
51  const SolidifyModifierData *smd = (SolidifyModifierData *)md;
52  /* even when we calculate our own normals,
53  * the vertex normals are used as a fallback
54  * if manifold is enabled vertex normals are not used */
55  return smd->mode == MOD_SOLIDIFY_MODE_EXTRUDE;
56 }
57 
58 static void initData(ModifierData *md)
59 {
61 
63 
65 }
66 
67 #ifdef __GNUC__
68 # pragma GCC diagnostic error "-Wsign-conversion"
69 #endif
70 
71 static void requiredDataMask(Object *UNUSED(ob),
72  ModifierData *md,
73  CustomData_MeshMasks *r_cddata_masks)
74 {
76 
77  /* ask for vertexgroups if we need them */
78  if (smd->defgrp_name[0] != '\0' || smd->shell_defgrp_name[0] != '\0' ||
79  smd->rim_defgrp_name[0] != '\0') {
80  r_cddata_masks->vmask |= CD_MASK_MDEFORMVERT;
81  }
82 }
83 
85 {
86  const SolidifyModifierData *smd = (SolidifyModifierData *)md;
87  switch (smd->mode) {
89  return MOD_solidify_extrude_modifyMesh(md, ctx, mesh);
92  default:
93  BLI_assert(0);
94  }
95  return mesh;
96 }
97 
98 static void panel_draw(const bContext *UNUSED(C), Panel *panel)
99 {
100  uiLayout *sub, *row, *col;
101  uiLayout *layout = panel->layout;
102 
103  PointerRNA ob_ptr;
105 
106  int solidify_mode = RNA_enum_get(ptr, "solidify_mode");
107  bool has_vertex_group = RNA_string_length(ptr, "vertex_group") != 0;
108 
109  uiLayoutSetPropSep(layout, true);
110 
111  uiItemR(layout, ptr, "solidify_mode", 0, NULL, ICON_NONE);
112 
113  if (solidify_mode == MOD_SOLIDIFY_MODE_NONMANIFOLD) {
114  uiItemR(layout, ptr, "nonmanifold_thickness_mode", 0, IFACE_("Thickness Mode"), ICON_NONE);
115  uiItemR(layout, ptr, "nonmanifold_boundary_mode", 0, IFACE_("Boundary"), ICON_NONE);
116  }
117 
118  uiItemR(layout, ptr, "thickness", 0, NULL, ICON_NONE);
119  uiItemR(layout, ptr, "offset", 0, NULL, ICON_NONE);
120 
121  if (solidify_mode == MOD_SOLIDIFY_MODE_NONMANIFOLD) {
122  uiItemR(layout, ptr, "nonmanifold_merge_threshold", 0, NULL, ICON_NONE);
123  }
124  else {
125  uiItemR(layout, ptr, "use_even_offset", 0, NULL, ICON_NONE);
126  }
127 
128  col = uiLayoutColumnWithHeading(layout, false, IFACE_("Rim"));
129  uiItemR(col, ptr, "use_rim", 0, IFACE_("Fill"), ICON_NONE);
130  sub = uiLayoutColumn(col, false);
131  uiLayoutSetActive(sub, RNA_boolean_get(ptr, "use_rim"));
132  uiItemR(sub, ptr, "use_rim_only", 0, NULL, ICON_NONE);
133 
134  uiItemS(layout);
135 
136  modifier_vgroup_ui(layout, ptr, &ob_ptr, "vertex_group", "invert_vertex_group", NULL);
137  row = uiLayoutRow(layout, false);
138  uiLayoutSetActive(row, has_vertex_group);
139  uiItemR(row, ptr, "thickness_vertex_group", 0, IFACE_("Factor"), ICON_NONE);
140 
141  if (solidify_mode == MOD_SOLIDIFY_MODE_NONMANIFOLD) {
142  row = uiLayoutRow(layout, false);
143  uiLayoutSetActive(row, has_vertex_group);
144  uiItemR(row, ptr, "use_flat_faces", 0, NULL, ICON_NONE);
145  }
146 
147  modifier_panel_end(layout, ptr);
148 }
149 
150 static void normals_panel_draw(const bContext *UNUSED(C), Panel *panel)
151 {
152  uiLayout *col;
153  uiLayout *layout = panel->layout;
154 
155  PointerRNA ob_ptr;
157 
158  int solidify_mode = RNA_enum_get(ptr, "solidify_mode");
159 
160  uiLayoutSetPropSep(layout, true);
161 
162  col = uiLayoutColumn(layout, false);
163  uiItemR(col, ptr, "use_flip_normals", 0, IFACE_("Flip"), ICON_NONE);
164  if (solidify_mode == MOD_SOLIDIFY_MODE_EXTRUDE) {
165  uiItemR(col, ptr, "use_quality_normals", 0, IFACE_("High Quality"), ICON_NONE);
166  }
167 }
168 
169 static void materials_panel_draw(const bContext *UNUSED(C), Panel *panel)
170 {
171  uiLayout *col;
172  uiLayout *layout = panel->layout;
173 
174  PointerRNA ob_ptr;
176 
177  uiLayoutSetPropSep(layout, true);
178 
179  uiItemR(layout, ptr, "material_offset", 0, NULL, ICON_NONE);
180  col = uiLayoutColumn(layout, true);
182  uiItemR(col, ptr, "material_offset_rim", 0, IFACE_("Rim"), ICON_NONE);
183 }
184 
185 static void edge_data_panel_draw(const bContext *UNUSED(C), Panel *panel)
186 {
187  uiLayout *layout = panel->layout;
188 
189  PointerRNA ob_ptr;
191 
192  int solidify_mode = RNA_enum_get(ptr, "solidify_mode");
193 
194  uiLayoutSetPropSep(layout, true);
195 
196  if (solidify_mode == MOD_SOLIDIFY_MODE_EXTRUDE) {
197  uiLayout *col;
198  col = uiLayoutColumn(layout, true);
199  uiItemR(col, ptr, "edge_crease_inner", 0, IFACE_("Crease Inner"), ICON_NONE);
200  uiItemR(col, ptr, "edge_crease_outer", 0, IFACE_("Outer"), ICON_NONE);
201  uiItemR(col, ptr, "edge_crease_rim", 0, IFACE_("Rim"), ICON_NONE);
202  }
203  uiItemR(layout, ptr, "bevel_convex", UI_ITEM_R_SLIDER, NULL, ICON_NONE);
204 }
205 
206 static void clamp_panel_draw(const bContext *UNUSED(C), Panel *panel)
207 {
208  uiLayout *row, *col;
209  uiLayout *layout = panel->layout;
210 
211  PointerRNA ob_ptr;
213 
214  uiLayoutSetPropSep(layout, true);
215 
216  col = uiLayoutColumn(layout, false);
217  uiItemR(col, ptr, "thickness_clamp", 0, NULL, ICON_NONE);
218  row = uiLayoutRow(col, false);
219  uiLayoutSetActive(row, RNA_float_get(ptr, "thickness_clamp") > 0.0f);
220  uiItemR(row, ptr, "use_thickness_angle_clamp", 0, NULL, ICON_NONE);
221 }
222 
223 static void vertex_group_panel_draw(const bContext *UNUSED(C), Panel *panel)
224 {
225  uiLayout *col;
226  uiLayout *layout = panel->layout;
227 
228  PointerRNA ob_ptr;
230 
231  uiLayoutSetPropSep(layout, true);
232 
233  col = uiLayoutColumn(layout, false);
235  col, ptr, "shell_vertex_group", &ob_ptr, "vertex_groups", IFACE_("Shell"), ICON_NONE);
236  uiItemPointerR(col, ptr, "rim_vertex_group", &ob_ptr, "vertex_groups", IFACE_("Rim"), ICON_NONE);
237 }
238 
239 static void panelRegister(ARegionType *region_type)
240 {
243  region_type, "normals", "Normals", NULL, normals_panel_draw, panel_type);
245  region_type, "materials", "Materials", NULL, materials_panel_draw, panel_type);
247  region_type, "edge_data", "Edge Data", NULL, edge_data_panel_draw, panel_type);
249  region_type, "clamp", "Thickness Clamp", NULL, clamp_panel_draw, panel_type);
250  modifier_subpanel_register(region_type,
251  "vertex_groups",
252  "Output Vertex Groups",
253  NULL,
255  panel_type);
256 }
257 
259  /* name */ "Solidify",
260  /* structName */ "SolidifyModifierData",
261  /* structSize */ sizeof(SolidifyModifierData),
262  /* srna */ &RNA_SolidifyModifier,
264 
268  /* icon */ ICON_MOD_SOLIDIFY,
269 
270  /* copyData */ BKE_modifier_copydata_generic,
271 
272  /* deformVerts */ NULL,
273  /* deformMatrices */ NULL,
274  /* deformVertsEM */ NULL,
275  /* deformMatricesEM */ NULL,
276  /* modifyMesh */ modifyMesh,
277  /* modifyHair */ NULL,
278  /* modifyGeometrySet */ NULL,
279  /* modifyVolume */ NULL,
280 
281  /* initData */ initData,
282  /* requiredDataMask */ requiredDataMask,
283  /* freeData */ NULL,
284  /* isDisabled */ NULL,
285  /* updateDepsgraph */ NULL,
286  /* dependsOnTime */ NULL,
287  /* dependsOnNormals */ dependsOnNormals,
288  /* foreachIDLink */ NULL,
289  /* foreachTexLink */ NULL,
290  /* freeRuntimeData */ NULL,
291  /* panelRegister */ panelRegister,
292  /* blendWrite */ NULL,
293  /* blendRead */ NULL,
294 };
@ eModifierTypeFlag_AcceptsCVs
Definition: BKE_modifier.h:81
@ eModifierTypeFlag_SupportsMapping
Definition: BKE_modifier.h:82
@ eModifierTypeFlag_EnableInEditmode
Definition: BKE_modifier.h:92
@ eModifierTypeFlag_SupportsEditmode
Definition: BKE_modifier.h:83
@ eModifierTypeFlag_AcceptsMesh
Definition: BKE_modifier.h:80
void BKE_modifier_copydata_generic(const struct ModifierData *md, struct ModifierData *md_dst, const int flag)
@ eModifierTypeType_Constructive
Definition: BKE_modifier.h:61
#define BLI_assert(a)
Definition: BLI_assert.h:58
#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:44
struct SolidifyModifierData SolidifyModifierData
@ MOD_SOLIDIFY_MODE_NONMANIFOLD
@ MOD_SOLIDIFY_MODE_EXTRUDE
@ 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:223
static Mesh * modifyMesh(ModifierData *md, const ModifierEvalContext *ctx, Mesh *mesh)
Definition: MOD_solidify.c:84
static void materials_panel_draw(const bContext *UNUSED(C), Panel *panel)
Definition: MOD_solidify.c:169
static bool dependsOnNormals(ModifierData *md)
Definition: MOD_solidify.c:49
static void edge_data_panel_draw(const bContext *UNUSED(C), Panel *panel)
Definition: MOD_solidify.c:185
static void normals_panel_draw(const bContext *UNUSED(C), Panel *panel)
Definition: MOD_solidify.c:150
static void panel_draw(const bContext *UNUSED(C), Panel *panel)
Definition: MOD_solidify.c:98
static void clamp_panel_draw(const bContext *UNUSED(C), Panel *panel)
Definition: MOD_solidify.c:206
static void initData(ModifierData *md)
Definition: MOD_solidify.c:58
static void panelRegister(ARegionType *region_type)
Definition: MOD_solidify.c:239
static void requiredDataMask(Object *UNUSED(ob), ModifierData *md, CustomData_MeshMasks *r_cddata_masks)
Definition: MOD_solidify.c:71
ModifierTypeInfo modifierType_Solidify
Definition: MOD_solidify.c:258
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)
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)
StructRNA RNA_SolidifyModifier
#define C
Definition: RandGen.cpp:39
void uiLayoutSetActive(uiLayout *layout, bool active)
@ UI_ITEM_R_SLIDER
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)
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:6355
int RNA_string_length(PointerRNA *ptr, const char *name)
Definition: rna_access.c:6539
bool RNA_boolean_get(PointerRNA *ptr, const char *name)
Definition: rna_access.c:6261
int RNA_enum_get(PointerRNA *ptr, const char *name)
Definition: rna_access.c:6402
struct uiLayout * layout
PointerRNA * ptr
Definition: wm_files.c:3157