Blender  V3.3
MOD_curve.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_scene_types.h"
18 #include "DNA_screen_types.h"
19 
20 #include "BKE_context.h"
21 #include "BKE_curve.h"
22 #include "BKE_deform.h"
23 #include "BKE_editmesh.h"
24 #include "BKE_lib_id.h"
25 #include "BKE_lib_query.h"
26 #include "BKE_mesh.h"
27 #include "BKE_mesh_wrapper.h"
28 #include "BKE_modifier.h"
29 #include "BKE_screen.h"
30 
31 #include "UI_interface.h"
32 #include "UI_resources.h"
33 
34 #include "RNA_access.h"
35 #include "RNA_prototypes.h"
36 
37 #include "DEG_depsgraph.h"
38 #include "DEG_depsgraph_build.h"
39 #include "DEG_depsgraph_query.h"
40 
41 #include "MOD_modifiertypes.h"
42 #include "MOD_ui_common.h"
43 #include "MOD_util.h"
44 
45 static void initData(ModifierData *md)
46 {
48 
50 
52 }
53 
54 static void requiredDataMask(Object *UNUSED(ob),
55  ModifierData *md,
56  CustomData_MeshMasks *r_cddata_masks)
57 {
59 
60  /* ask for vertexgroups if we need them */
61  if (cmd->name[0] != '\0') {
62  r_cddata_masks->vmask |= CD_MASK_MDEFORMVERT;
63  }
64 }
65 
66 static bool isDisabled(const Scene *UNUSED(scene), ModifierData *md, bool UNUSED(userRenderParams))
67 {
69 
70  /* The object type check is only needed here in case we have a placeholder
71  * object assigned (because the library containing the curve is missing).
72  *
73  * In other cases it should be impossible to have a type mismatch.
74  */
75  return !cmd->object || cmd->object->type != OB_CURVES_LEGACY;
76 }
77 
78 static void foreachIDLink(ModifierData *md, Object *ob, IDWalkFunc walk, void *userData)
79 {
81 
82  walk(userData, ob, (ID **)&cmd->object, IDWALK_CB_NOP);
83 }
84 
86 {
88  if (cmd->object != NULL) {
89  /* TODO(sergey): Need to do the same eval_flags trick for path
90  * as happening in legacy depsgraph callback.
91  */
92  /* TODO(sergey): Currently path is evaluated as a part of modifier stack,
93  * might be changed in the future.
94  */
95  DEG_add_object_relation(ctx->node, cmd->object, DEG_OB_COMP_TRANSFORM, "Curve Modifier");
96  DEG_add_object_relation(ctx->node, cmd->object, DEG_OB_COMP_GEOMETRY, "Curve Modifier");
98  }
99 
100  DEG_add_modifier_to_transform_relation(ctx->node, "Curve Modifier");
101 }
102 
103 static void deformVerts(ModifierData *md,
104  const ModifierEvalContext *ctx,
105  Mesh *mesh,
106  float (*vertexCos)[3],
107  int verts_num)
108 {
110  Mesh *mesh_src = NULL;
111 
112  if (ctx->object->type == OB_MESH && cmd->name[0] != '\0') {
113  /* mesh_src is only needed for vgroups. */
114  mesh_src = MOD_deform_mesh_eval_get(ctx->object, NULL, mesh, NULL, verts_num, false, false);
115  }
116 
117  struct MDeformVert *dvert = NULL;
118  int defgrp_index = -1;
119  MOD_get_vgroup(ctx->object, mesh_src, cmd->name, &dvert, &defgrp_index);
120 
121  /* Silly that defaxis and BKE_curve_deform_coords are off by 1
122  * but leave for now to save having to call do_versions */
123 
125  ctx->object,
126  vertexCos,
127  verts_num,
128  dvert,
129  defgrp_index,
130  cmd->flag,
131  cmd->defaxis - 1);
132 
133  if (!ELEM(mesh_src, NULL, mesh)) {
134  BKE_id_free(NULL, mesh_src);
135  }
136 }
137 
138 static void deformVertsEM(ModifierData *md,
139  const ModifierEvalContext *ctx,
140  BMEditMesh *em,
141  Mesh *mesh,
142  float (*vertexCos)[3],
143  int verts_num)
144 {
145  if (mesh != NULL) {
146  deformVerts(md, ctx, mesh, vertexCos, verts_num);
147  return;
148  }
149 
151  bool use_dverts = false;
152  int defgrp_index = -1;
153 
154  if (ctx->object->type == OB_MESH && cmd->name[0] != '\0') {
155  defgrp_index = BKE_object_defgroup_name_index(ctx->object, cmd->name);
156  if (defgrp_index != -1) {
157  use_dverts = true;
158  }
159  }
160 
161  if (use_dverts) {
163  ctx->object,
164  vertexCos,
165  verts_num,
166  defgrp_index,
167  cmd->flag,
168  cmd->defaxis - 1,
169  em);
170  }
171  else {
173  ctx->object,
174  vertexCos,
175  verts_num,
176  NULL,
177  defgrp_index,
178  cmd->flag,
179  cmd->defaxis - 1);
180  }
181 }
182 
183 static void panel_draw(const bContext *UNUSED(C), Panel *panel)
184 {
185  uiLayout *layout = panel->layout;
186 
187  PointerRNA ob_ptr;
189 
190  uiLayoutSetPropSep(layout, true);
191 
192  uiItemR(layout, ptr, "object", 0, IFACE_("Curve Object"), ICON_NONE);
193  uiItemR(layout, ptr, "deform_axis", 0, NULL, ICON_NONE);
194 
195  modifier_vgroup_ui(layout, ptr, &ob_ptr, "vertex_group", "invert_vertex_group", NULL);
196 
197  modifier_panel_end(layout, ptr);
198 }
199 
200 static void panelRegister(ARegionType *region_type)
201 {
203 }
204 
206  /* name */ N_("Curve"),
207  /* structName */ "CurveModifierData",
208  /* structSize */ sizeof(CurveModifierData),
209  /* srna */ &RNA_CurveModifier,
210  /* type */ eModifierTypeType_OnlyDeform,
213  /* icon */ ICON_MOD_CURVE,
214 
215  /* copyData */ BKE_modifier_copydata_generic,
216 
217  /* deformVerts */ deformVerts,
218  /* deformMatrices */ NULL,
219  /* deformVertsEM */ deformVertsEM,
220  /* deformMatricesEM */ NULL,
221  /* modifyMesh */ NULL,
222  /* modifyGeometrySet */ NULL,
223 
224  /* initData */ initData,
225  /* requiredDataMask */ requiredDataMask,
226  /* freeData */ NULL,
227  /* isDisabled */ isDisabled,
228  /* updateDepsgraph */ updateDepsgraph,
229  /* dependsOnTime */ NULL,
230  /* dependsOnNormals */ NULL,
231  /* foreachIDLink */ foreachIDLink,
232  /* foreachTexLink */ NULL,
233  /* freeRuntimeData */ NULL,
234  /* panelRegister */ panelRegister,
235  /* blendWrite */ NULL,
236  /* blendRead */ NULL,
237 };
void BKE_curve_deform_coords_with_editmesh(const struct Object *ob_curve, const struct Object *ob_target, float(*vert_coords)[3], int vert_coords_len, int defgrp_index, short flag, short defaxis, struct BMEditMesh *em_target)
void BKE_curve_deform_coords(const struct Object *ob_curve, const struct Object *ob_target, float(*vert_coords)[3], int vert_coords_len, const struct MDeformVert *dvert, int defgrp_index, short flag, short defaxis)
support for deformation groups and hooks.
int BKE_object_defgroup_name_index(const struct Object *ob, const char *name)
void BKE_id_free(struct Main *bmain, void *idv)
@ IDWALK_CB_NOP
Definition: BKE_lib_query.h:33
void(* IDWalkFunc)(void *userData, struct Object *ob, struct ID **idpoin, int cb_flag)
Definition: BKE_modifier.h:107
@ eModifierTypeFlag_AcceptsCVs
Definition: BKE_modifier.h:67
@ eModifierTypeFlag_SupportsEditmode
Definition: BKE_modifier.h:69
@ eModifierTypeFlag_AcceptsVertexCosOnly
Definition: BKE_modifier.h:100
void BKE_modifier_copydata_generic(const struct ModifierData *md, struct ModifierData *md_dst, int flag)
@ eModifierTypeType_OnlyDeform
Definition: BKE_modifier.h:44
#define BLI_assert(a)
Definition: BLI_assert.h:46
#define UNUSED(x)
#define ELEM(...)
#define MEMCMP_STRUCT_AFTER_IS_ZERO(struct_var, member)
#define MEMCPY_STRUCT_AFTER(struct_dst, struct_src, member)
#define IFACE_(msgid)
@ DAG_EVAL_NEED_CURVE_PATH
Definition: DEG_depsgraph.h:54
void DEG_add_object_relation(struct DepsNodeHandle *node_handle, struct Object *object, eDepsObjectComponentType component, const char *description)
void DEG_add_modifier_to_transform_relation(struct DepsNodeHandle *node_handle, const char *description)
@ DEG_OB_COMP_GEOMETRY
@ DEG_OB_COMP_TRANSFORM
void DEG_add_special_eval_flag(struct DepsNodeHandle *handle, struct ID *id, uint32_t flag)
#define CD_MASK_MDEFORMVERT
#define DNA_struct_default_get(struct_name)
Definition: DNA_defaults.h:29
struct CurveModifierData CurveModifierData
@ eModifierType_Curve
Object is a sort of wrapper for general info.
@ OB_MESH
@ OB_CURVES_LEGACY
static void deformVerts(ModifierData *md, const ModifierEvalContext *ctx, Mesh *mesh, float(*vertexCos)[3], int verts_num)
Definition: MOD_curve.c:103
ModifierTypeInfo modifierType_Curve
Definition: MOD_curve.c:205
static bool isDisabled(const Scene *UNUSED(scene), ModifierData *md, bool UNUSED(userRenderParams))
Definition: MOD_curve.c:66
static void updateDepsgraph(ModifierData *md, const ModifierUpdateDepsgraphContext *ctx)
Definition: MOD_curve.c:85
static void foreachIDLink(ModifierData *md, Object *ob, IDWalkFunc walk, void *userData)
Definition: MOD_curve.c:78
static void deformVertsEM(ModifierData *md, const ModifierEvalContext *ctx, BMEditMesh *em, Mesh *mesh, float(*vertexCos)[3], int verts_num)
Definition: MOD_curve.c:138
static void panel_draw(const bContext *UNUSED(C), Panel *panel)
Definition: MOD_curve.c:183
static void initData(ModifierData *md)
Definition: MOD_curve.c:45
static void panelRegister(ARegionType *region_type)
Definition: MOD_curve.c:200
static void requiredDataMask(Object *UNUSED(ob), ModifierData *md, CustomData_MeshMasks *r_cddata_masks)
Definition: MOD_curve.c:54
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)
Mesh * MOD_deform_mesh_eval_get(Object *ob, struct BMEditMesh *em, Mesh *mesh, const float(*vertexCos)[3], const int verts_num, const bool use_normals, const bool use_orco)
Definition: MOD_util.c:167
void MOD_get_vgroup(Object *ob, struct Mesh *mesh, const char *name, MDeformVert **dvert, int *defgrp_index)
Definition: MOD_util.c:235
#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)
Scene scene
struct Object * object
Definition: DNA_ID.h:368
struct Object * object
Definition: BKE_modifier.h:141
struct DepsNodeHandle * node
Definition: BKE_modifier.h:134
struct uiLayout * layout
#define N_(msgid)
PointerRNA * ptr
Definition: wm_files.c:3480