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