Blender  V3.3
MOD_wireframe.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 "BLI_utildefines.h"
10 
11 #include "BLT_translation.h"
12 
13 #include "DNA_defaults.h"
14 #include "DNA_mesh_types.h"
15 #include "DNA_object_types.h"
16 #include "DNA_screen_types.h"
17 
18 #include "BKE_context.h"
19 #include "BKE_deform.h"
20 #include "BKE_mesh.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 "bmesh.h"
33 #include "tools/bmesh_wireframe.h"
34 
35 static void initData(ModifierData *md)
36 {
38 
40 
42 }
43 
44 static void requiredDataMask(Object *UNUSED(ob),
45  ModifierData *md,
46  CustomData_MeshMasks *r_cddata_masks)
47 {
49 
50  /* ask for vertexgroups if we need them */
51  if (wmd->defgrp_name[0] != '\0') {
52  r_cddata_masks->vmask |= CD_MASK_MDEFORMVERT;
53  }
54 }
55 
57 {
58  return true;
59 }
60 
62 {
63  Mesh *result;
64  BMesh *bm;
65 
66  const int defgrp_index = BKE_id_defgroup_name_index(&mesh->id, wmd->defgrp_name);
67 
69  &(struct BMeshCreateParams){0},
70  &(struct BMeshFromMeshParams){
71  .calc_face_normal = true,
72  .calc_vert_normal = true,
73  .add_key_index = false,
74  .use_shapekey = false,
75  .active_shapekey = 0,
76  .cd_mask_extra = {.vmask = CD_MASK_ORIGINDEX,
77  .emask = CD_MASK_ORIGINDEX,
78  .pmask = CD_MASK_ORIGINDEX},
79  });
80 
82  wmd->offset,
83  wmd->offset_fac,
84  wmd->offset_fac_vg,
85  (wmd->flag & MOD_WIREFRAME_REPLACE) != 0,
86  (wmd->flag & MOD_WIREFRAME_BOUNDARY) != 0,
87  (wmd->flag & MOD_WIREFRAME_OFS_EVEN) != 0,
88  (wmd->flag & MOD_WIREFRAME_OFS_RELATIVE) != 0,
89  (wmd->flag & MOD_WIREFRAME_CREASE) != 0,
90  wmd->crease_weight,
91  defgrp_index,
92  (wmd->flag & MOD_WIREFRAME_INVERT_VGROUP) != 0,
93  wmd->mat_ofs,
94  MAX2(ob->totcol - 1, 0),
95  false);
96 
99 
100  return result;
101 }
102 
103 static Mesh *modifyMesh(ModifierData *md, const struct ModifierEvalContext *ctx, struct Mesh *mesh)
104 {
106 }
107 
108 static void panel_draw(const bContext *UNUSED(C), Panel *panel)
109 {
110  uiLayout *col, *row, *sub;
111  uiLayout *layout = panel->layout;
112 
113  PointerRNA ob_ptr;
115 
116  uiLayoutSetPropSep(layout, true);
117 
118  uiItemR(layout, ptr, "thickness", 0, IFACE_("Thickness"), ICON_NONE);
119  uiItemR(layout, ptr, "offset", 0, NULL, ICON_NONE);
120 
121  col = uiLayoutColumn(layout, true);
122  uiItemR(col, ptr, "use_boundary", 0, IFACE_("Boundary"), ICON_NONE);
123  uiItemR(col, ptr, "use_replace", 0, IFACE_("Replace Original"), ICON_NONE);
124 
125  col = uiLayoutColumnWithHeading(layout, true, IFACE_("Thickness"));
126  uiItemR(col, ptr, "use_even_offset", 0, IFACE_("Even"), ICON_NONE);
127  uiItemR(col, ptr, "use_relative_offset", 0, IFACE_("Relative"), ICON_NONE);
128 
129  row = uiLayoutRowWithHeading(layout, true, IFACE_("Crease Edges"));
130  uiItemR(row, ptr, "use_crease", 0, "", ICON_NONE);
131  sub = uiLayoutRow(row, true);
132  uiLayoutSetActive(sub, RNA_boolean_get(ptr, "use_crease"));
133  uiItemR(sub, ptr, "crease_weight", UI_ITEM_R_SLIDER, "", ICON_NONE);
134 
135  uiItemR(layout, ptr, "material_offset", 0, IFACE_("Material Offset"), ICON_NONE);
136 
137  modifier_panel_end(layout, ptr);
138 }
139 
140 static void vertex_group_panel_draw(const bContext *UNUSED(C), Panel *panel)
141 {
142  uiLayout *row;
143  uiLayout *layout = panel->layout;
144 
145  PointerRNA ob_ptr;
147 
148  bool has_vertex_group = RNA_string_length(ptr, "vertex_group") != 0;
149 
150  uiLayoutSetPropSep(layout, true);
151 
152  modifier_vgroup_ui(layout, ptr, &ob_ptr, "vertex_group", "invert_vertex_group", NULL);
153 
154  row = uiLayoutRow(layout, true);
155  uiLayoutSetActive(row, has_vertex_group);
156  uiItemR(row, ptr, "thickness_vertex_group", 0, IFACE_("Factor"), ICON_NONE);
157 }
158 
159 static void panelRegister(ARegionType *region_type)
160 {
161  PanelType *panel_type = modifier_panel_register(
162  region_type, eModifierType_Wireframe, panel_draw);
164  region_type, "vertex_group", "Vertex Group", NULL, vertex_group_panel_draw, panel_type);
165 }
166 
168  /* name */ N_("Wireframe"),
169  /* structName */ "WireframeModifierData",
170  /* structSize */ sizeof(WireframeModifierData),
171  /* srna */ &RNA_WireframeModifier,
174  /* icon */ ICON_MOD_WIREFRAME,
175 
176  /* copyData */ BKE_modifier_copydata_generic,
177 
178  /* deformVerts */ NULL,
179  /* deformMatrices */ NULL,
180  /* deformVertsEM */ NULL,
181  /* deformMatricesEM */ NULL,
182  /* modifyMesh */ modifyMesh,
183  /* modifyGeometrySet */ NULL,
184 
185  /* initData */ initData,
186  /* requiredDataMask */ requiredDataMask,
187  /* freeData */ NULL,
188  /* isDisabled */ NULL,
189  /* updateDepgraph */ NULL,
190  /* dependsOnTime */ NULL,
191  /* dependsOnNormals */ dependsOnNormals,
192  /* foreachIDLink */ NULL,
193  /* foreachTexLink */ NULL,
194  /* freeRuntimeData */ NULL,
195  /* panelRegister */ panelRegister,
196  /* blendWrite */ NULL,
197  /* blendRead */ NULL,
198 };
support for deformation groups and hooks.
int BKE_id_defgroup_name_index(const struct ID *id, const char *name)
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)
@ 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 MAX2(a, b)
#define MEMCMP_STRUCT_AFTER_IS_ZERO(struct_var, member)
#define MEMCPY_STRUCT_AFTER(struct_dst, struct_src, member)
#define IFACE_(msgid)
#define CD_MASK_ORIGINDEX
#define CD_MASK_MDEFORMVERT
#define DNA_struct_default_get(struct_name)
Definition: DNA_defaults.h:29
@ eModifierType_Wireframe
@ MOD_WIREFRAME_OFS_EVEN
@ MOD_WIREFRAME_OFS_RELATIVE
@ MOD_WIREFRAME_INVERT_VGROUP
@ MOD_WIREFRAME_CREASE
@ MOD_WIREFRAME_BOUNDARY
@ MOD_WIREFRAME_REPLACE
struct WireframeModifierData WireframeModifierData
Object is a sort of wrapper for general info.
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)
ModifierTypeInfo modifierType_Wireframe
static void vertex_group_panel_draw(const bContext *UNUSED(C), Panel *panel)
static bool dependsOnNormals(ModifierData *UNUSED(md))
Definition: MOD_wireframe.c:56
static void panel_draw(const bContext *UNUSED(C), Panel *panel)
static void initData(ModifierData *md)
Definition: MOD_wireframe.c:35
static void panelRegister(ARegionType *region_type)
static Mesh * modifyMesh(ModifierData *md, const struct ModifierEvalContext *ctx, struct Mesh *mesh)
static void requiredDataMask(Object *UNUSED(ob), ModifierData *md, CustomData_MeshMasks *r_cddata_masks)
Definition: MOD_wireframe.c:44
static Mesh * WireframeModifier_do(WireframeModifierData *wmd, Object *ob, Mesh *mesh)
Definition: MOD_wireframe.c:61
#define C
Definition: RandGen.cpp:25
uiLayout * uiLayoutRowWithHeading(uiLayout *layout, bool align, const char *heading)
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)
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)
ATTR_WARN_UNUSED_RESULT BMesh * bm
void BM_mesh_free(BMesh *bm)
BMesh Free Mesh.
Definition: bmesh_mesh.cc:258
void BM_mesh_wireframe(BMesh *bm, const float offset, const float offset_fac, const float offset_fac_vg, const bool use_replace, const bool use_boundary, const bool use_even_offset, const bool use_relative_offset, const bool use_crease, const float crease_weight, const int defgrp_index, const bool defgrp_invert, const short mat_offset, const short mat_max, const bool use_tag)
uint col
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
struct Object * object
Definition: BKE_modifier.h:141
struct uiLayout * layout
#define N_(msgid)
PointerRNA * ptr
Definition: wm_files.c:3480