Blender V4.3
MOD_solidify.cc
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2005 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
9#include <cstring>
10
11#include "BLI_utildefines.h"
12
13#include "BLT_translation.hh"
14
15#include "DNA_defaults.h"
16#include "DNA_mesh_types.h"
17#include "DNA_object_types.h"
18#include "DNA_screen_types.h"
19
20#include "BKE_context.hh"
21#include "BKE_particle.h"
22#include "BKE_screen.hh"
23
24#include "UI_interface.hh"
25#include "UI_resources.hh"
26
27#include "RNA_access.hh"
28#include "RNA_prototypes.hh"
29
30#include "MOD_modifiertypes.hh"
31#include "MOD_ui_common.hh"
32
33#include "MOD_solidify_util.hh"
34
43
44#ifdef __GNUC__
45# pragma GCC diagnostic error "-Wsign-conversion"
46#endif
47
48static void required_data_mask(ModifierData *md, CustomData_MeshMasks *r_cddata_masks)
49{
51
52 /* Ask for vertex-groups if we need them. */
53 if (smd->defgrp_name[0] != '\0' || smd->shell_defgrp_name[0] != '\0' ||
54 smd->rim_defgrp_name[0] != '\0')
55 {
56 r_cddata_masks->vmask |= CD_MASK_MDEFORMVERT;
57 }
58}
59
60static Mesh *modify_mesh(ModifierData *md, const ModifierEvalContext *ctx, Mesh *mesh)
61{
63 switch (smd->mode) {
65 return MOD_solidify_extrude_modifyMesh(md, ctx, mesh);
67 return MOD_solidify_nonmanifold_modifyMesh(md, ctx, mesh);
68 default:
70 }
71 return mesh;
72}
73
74static void panel_draw(const bContext * /*C*/, Panel *panel)
75{
76 uiLayout *sub, *row, *col;
77 uiLayout *layout = panel->layout;
78
79 PointerRNA ob_ptr;
81
82 int solidify_mode = RNA_enum_get(ptr, "solidify_mode");
83 bool has_vertex_group = RNA_string_length(ptr, "vertex_group") != 0;
84
85 uiLayoutSetPropSep(layout, true);
86
87 uiItemR(layout, ptr, "solidify_mode", UI_ITEM_NONE, nullptr, ICON_NONE);
88
89 if (solidify_mode == MOD_SOLIDIFY_MODE_NONMANIFOLD) {
90 uiItemR(layout,
91 ptr,
92 "nonmanifold_thickness_mode",
94 IFACE_("Thickness Mode"),
95 ICON_NONE);
96 uiItemR(layout, ptr, "nonmanifold_boundary_mode", UI_ITEM_NONE, IFACE_("Boundary"), ICON_NONE);
97 }
98
99 uiItemR(layout, ptr, "thickness", UI_ITEM_NONE, nullptr, ICON_NONE);
100 uiItemR(layout, ptr, "offset", UI_ITEM_NONE, nullptr, ICON_NONE);
101
102 if (solidify_mode == MOD_SOLIDIFY_MODE_NONMANIFOLD) {
103 uiItemR(layout, ptr, "nonmanifold_merge_threshold", UI_ITEM_NONE, nullptr, ICON_NONE);
104 }
105 else {
106 uiItemR(layout, ptr, "use_even_offset", UI_ITEM_NONE, nullptr, ICON_NONE);
107 }
108
110 uiItemR(col, ptr, "use_rim", UI_ITEM_NONE, IFACE_("Fill"), ICON_NONE);
111 sub = uiLayoutColumn(col, false);
112 uiLayoutSetActive(sub, RNA_boolean_get(ptr, "use_rim"));
113 uiItemR(sub, ptr, "use_rim_only", UI_ITEM_NONE, nullptr, ICON_NONE);
114
115 uiItemS(layout);
116
117 modifier_vgroup_ui(layout, ptr, &ob_ptr, "vertex_group", "invert_vertex_group", nullptr);
118 row = uiLayoutRow(layout, false);
119 uiLayoutSetActive(row, has_vertex_group);
120 uiItemR(row, ptr, "thickness_vertex_group", UI_ITEM_NONE, IFACE_("Factor"), ICON_NONE);
121
122 if (solidify_mode == MOD_SOLIDIFY_MODE_NONMANIFOLD) {
123 row = uiLayoutRow(layout, false);
124 uiLayoutSetActive(row, has_vertex_group);
125 uiItemR(row, ptr, "use_flat_faces", UI_ITEM_NONE, nullptr, ICON_NONE);
126 }
127
128 modifier_panel_end(layout, ptr);
129}
130
131static void normals_panel_draw(const bContext * /*C*/, Panel *panel)
132{
133 uiLayout *col;
134 uiLayout *layout = panel->layout;
135
136 PointerRNA ob_ptr;
138
139 int solidify_mode = RNA_enum_get(ptr, "solidify_mode");
140
141 uiLayoutSetPropSep(layout, true);
142
143 col = uiLayoutColumn(layout, false);
144 uiItemR(col, ptr, "use_flip_normals", UI_ITEM_NONE, IFACE_("Flip"), ICON_NONE);
145 if (solidify_mode == MOD_SOLIDIFY_MODE_EXTRUDE) {
146 uiItemR(col, ptr, "use_quality_normals", UI_ITEM_NONE, IFACE_("High Quality"), ICON_NONE);
147 }
148}
149
150static void materials_panel_draw(const bContext * /*C*/, Panel *panel)
151{
152 uiLayout *col;
153 uiLayout *layout = panel->layout;
154
155 PointerRNA ob_ptr;
157
158 uiLayoutSetPropSep(layout, true);
159
160 uiItemR(layout, ptr, "material_offset", UI_ITEM_NONE, nullptr, ICON_NONE);
161 col = uiLayoutColumn(layout, true);
163 uiItemR(col,
164 ptr,
165 "material_offset_rim",
168 ICON_NONE);
169}
170
171static void edge_data_panel_draw(const bContext * /*C*/, Panel *panel)
172{
173 uiLayout *layout = panel->layout;
174
175 PointerRNA ob_ptr;
177
178 int solidify_mode = RNA_enum_get(ptr, "solidify_mode");
179
180 uiLayoutSetPropSep(layout, true);
181
182 if (solidify_mode == MOD_SOLIDIFY_MODE_EXTRUDE) {
183 uiLayout *col;
184 col = uiLayoutColumn(layout, true);
185 uiItemR(col, ptr, "edge_crease_inner", UI_ITEM_NONE, IFACE_("Crease Inner"), ICON_NONE);
186 uiItemR(col, ptr, "edge_crease_outer", UI_ITEM_NONE, IFACE_("Outer"), ICON_NONE);
187 uiItemR(col,
188 ptr,
189 "edge_crease_rim",
192 ICON_NONE);
193 }
194 uiItemR(layout, ptr, "bevel_convex", UI_ITEM_R_SLIDER, nullptr, ICON_NONE);
195}
196
197static void clamp_panel_draw(const bContext * /*C*/, Panel *panel)
198{
199 uiLayout *row, *col;
200 uiLayout *layout = panel->layout;
201
202 PointerRNA ob_ptr;
204
205 uiLayoutSetPropSep(layout, true);
206
207 col = uiLayoutColumn(layout, false);
208 uiItemR(col, ptr, "thickness_clamp", UI_ITEM_NONE, nullptr, ICON_NONE);
209 row = uiLayoutRow(col, false);
210 uiLayoutSetActive(row, RNA_float_get(ptr, "thickness_clamp") > 0.0f);
211 uiItemR(row, ptr, "use_thickness_angle_clamp", UI_ITEM_NONE, nullptr, ICON_NONE);
212}
213
214static void vertex_group_panel_draw(const bContext * /*C*/, Panel *panel)
215{
216 uiLayout *col;
217 uiLayout *layout = panel->layout;
218
219 PointerRNA ob_ptr;
221
222 uiLayoutSetPropSep(layout, true);
223
224 col = uiLayoutColumn(layout, false);
226 col, ptr, "shell_vertex_group", &ob_ptr, "vertex_groups", IFACE_("Shell"), ICON_NONE);
228 ptr,
229 "rim_vertex_group",
230 &ob_ptr,
231 "vertex_groups",
233 ICON_NONE);
234}
235
236static void panel_register(ARegionType *region_type)
237{
240 region_type, "normals", "Normals", nullptr, normals_panel_draw, panel_type);
242 region_type, "materials", "Materials", nullptr, materials_panel_draw, panel_type);
244 region_type, "edge_data", "Edge Data", nullptr, edge_data_panel_draw, panel_type);
246 region_type, "clamp", "Thickness Clamp", nullptr, clamp_panel_draw, panel_type);
247 modifier_subpanel_register(region_type,
248 "vertex_groups",
249 "Output Vertex Groups",
250 nullptr,
252 panel_type);
253}
254
256 /*idname*/ "Solidify",
257 /*name*/ N_("Solidify"),
258 /*struct_name*/ "SolidifyModifierData",
259 /*struct_size*/ sizeof(SolidifyModifierData),
260 /*srna*/ &RNA_SolidifyModifier,
262
266 /*icon*/ ICON_MOD_SOLIDIFY,
267
268 /*copy_data*/ BKE_modifier_copydata_generic,
269
270 /*deform_verts*/ nullptr,
271 /*deform_matrices*/ nullptr,
272 /*deform_verts_EM*/ nullptr,
273 /*deform_matrices_EM*/ nullptr,
274 /*modify_mesh*/ modify_mesh,
275 /*modify_geometry_set*/ nullptr,
276
277 /*init_data*/ init_data,
278 /*required_data_mask*/ required_data_mask,
279 /*free_data*/ nullptr,
280 /*is_disabled*/ nullptr,
281 /*update_depsgraph*/ nullptr,
282 /*depends_on_time*/ nullptr,
283 /*depends_on_normals*/ nullptr,
284 /*foreach_ID_link*/ nullptr,
285 /*foreach_tex_link*/ nullptr,
286 /*free_runtime_data*/ nullptr,
287 /*panel_register*/ panel_register,
288 /*blend_write*/ nullptr,
289 /*blend_read*/ nullptr,
290 /*foreach_cache*/ nullptr,
291};
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_unreachable()
Definition BLI_assert.h:97
#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 CTX_IFACE_(context, msgid)
#define IFACE_(msgid)
#define BLT_I18NCONTEXT_ID_MESH
#define CD_MASK_MDEFORMVERT
#define DNA_struct_default_get(struct_name)
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 *, Panel *panel)
static void init_data(ModifierData *md)
static void panel_register(ARegionType *region_type)
static void edge_data_panel_draw(const bContext *, Panel *panel)
static void normals_panel_draw(const bContext *, Panel *panel)
static Mesh * modify_mesh(ModifierData *md, const ModifierEvalContext *ctx, Mesh *mesh)
static void materials_panel_draw(const bContext *, Panel *panel)
static void panel_draw(const bContext *, Panel *panel)
static void required_data_mask(ModifierData *md, CustomData_MeshMasks *r_cddata_masks)
static void clamp_panel_draw(const bContext *, Panel *panel)
ModifierTypeInfo modifierType_Solidify
Mesh * MOD_solidify_extrude_modifyMesh(ModifierData *md, const ModifierEvalContext *ctx, Mesh *mesh)
Mesh * MOD_solidify_nonmanifold_modifyMesh(ModifierData *md, const ModifierEvalContext *ctx, Mesh *mesh)
PanelType * modifier_subpanel_register(ARegionType *region_type, const char *name, const char *label, PanelDrawFn draw_header, PanelDrawFn draw, PanelType *parent)
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 modifier_vgroup_ui(uiLayout *layout, PointerRNA *ptr, PointerRNA *ob_ptr, const char *vgroup_prop, const char *invert_vgroup_prop, const char *text)
void uiLayoutSetActive(uiLayout *layout, bool active)
uiLayout * uiLayoutRow(uiLayout *layout, bool align)
void uiLayoutSetPropSep(uiLayout *layout, bool is_sep)
void uiItemS(uiLayout *layout)
#define UI_ITEM_NONE
void uiItemPointerR(uiLayout *layout, PointerRNA *ptr, const char *propname, PointerRNA *searchptr, const char *searchpropname, const char *name, int icon)
uiLayout * uiLayoutColumnWithHeading(uiLayout *layout, bool align, const char *heading)
uiLayout * uiLayoutColumn(uiLayout *layout, bool align)
void uiItemR(uiLayout *layout, PointerRNA *ptr, const char *propname, eUI_Item_Flag flag, const char *name, int icon)
@ UI_ITEM_R_SLIDER
uint col
float RNA_float_get(PointerRNA *ptr, const char *name)
int RNA_string_length(PointerRNA *ptr, const char *name)
bool RNA_boolean_get(PointerRNA *ptr, const char *name)
int RNA_enum_get(PointerRNA *ptr, const char *name)
struct uiLayout * layout
#define N_(msgid)
PointerRNA * ptr
Definition wm_files.cc:4126