Pass EvaluationContext argument everywhere
[blender.git] / source / blender / modifiers / intern / MOD_curve.c
1 /*
2  * ***** BEGIN GPL LICENSE BLOCK *****
3  *
4  * This program is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU General Public License
6  * as published by the Free Software Foundation; either version 2
7  * of the License, or (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software  Foundation,
16  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17  *
18  * The Original Code is Copyright (C) 2005 by the Blender Foundation.
19  * All rights reserved.
20  *
21  * Contributor(s): Daniel Dunbar
22  *                 Ton Roosendaal,
23  *                 Ben Batt,
24  *                 Brecht Van Lommel,
25  *                 Campbell Barton
26  *
27  * ***** END GPL LICENSE BLOCK *****
28  *
29  */
30
31 /** \file blender/modifiers/intern/MOD_curve.c
32  *  \ingroup modifiers
33  */
34
35 #include <string.h>
36
37 #include "DNA_scene_types.h"
38 #include "DNA_object_types.h"
39
40 #include "BLI_utildefines.h"
41
42
43 #include "BKE_cdderivedmesh.h"
44 #include "BKE_lattice.h"
45 #include "BKE_library_query.h"
46 #include "BKE_modifier.h"
47
48 #include "DEG_depsgraph.h"
49 #include "DEG_depsgraph_build.h"
50
51 static void initData(ModifierData *md)
52 {
53         CurveModifierData *cmd = (CurveModifierData *) md;
54
55         cmd->defaxis = MOD_CURVE_POSX;
56 }
57
58 static void copyData(ModifierData *md, ModifierData *target)
59 {
60 #if 0
61         CurveModifierData *cmd = (CurveModifierData *) md;
62         CurveModifierData *tcmd = (CurveModifierData *) target;
63 #endif
64         modifier_copyData_generic(md, target);
65 }
66
67 static CustomDataMask requiredDataMask(Object *UNUSED(ob), ModifierData *md)
68 {
69         CurveModifierData *cmd = (CurveModifierData *)md;
70         CustomDataMask dataMask = 0;
71
72         /* ask for vertexgroups if we need them */
73         if (cmd->name[0]) dataMask |= CD_MASK_MDEFORMVERT;
74
75         return dataMask;
76 }
77
78 static bool isDisabled(ModifierData *md, int UNUSED(userRenderParams))
79 {
80         CurveModifierData *cmd = (CurveModifierData *) md;
81
82         return !cmd->object;
83 }
84
85 static void foreachObjectLink(
86         ModifierData *md, Object *ob,
87         ObjectWalkFunc walk, void *userData)
88 {
89         CurveModifierData *cmd = (CurveModifierData *) md;
90
91         walk(userData, ob, &cmd->object, IDWALK_CB_NOP);
92 }
93
94 static void updateDepsgraph(ModifierData *md,
95                             struct Main *UNUSED(bmain),
96                             struct Scene *UNUSED(scene),
97                             Object *object,
98                             struct DepsNodeHandle *node)
99 {
100         CurveModifierData *cmd = (CurveModifierData *)md;
101         if (cmd->object != NULL) {
102                 /* TODO(sergey): Need to do the same eval_flags trick for path
103                  * as happening in legacy depsgraph callback.
104                  */
105                 /* TODO(sergey): Currently path is evaluated as a part of modifier stack,
106                  * might be changed in the future.
107                  */
108                 struct Depsgraph *depsgraph = DEG_get_graph_from_handle(node);
109                 DEG_add_object_relation(node, cmd->object, DEG_OB_COMP_GEOMETRY, "Curve Modifier");
110                 DEG_add_special_eval_flag(depsgraph, &cmd->object->id, DAG_EVAL_NEED_CURVE_PATH);
111         }
112
113         DEG_add_object_relation(node, object, DEG_OB_COMP_TRANSFORM, "Curve Modifier");
114 }
115
116 static void deformVerts(ModifierData *md, struct EvaluationContext *eval_ctx,
117                         Object *ob, DerivedMesh *derivedData,
118                         float (*vertexCos)[3],
119                         int numVerts,
120                         ModifierApplyFlag UNUSED(flag))
121 {
122         CurveModifierData *cmd = (CurveModifierData *) md;
123
124         /* silly that defaxis and curve_deform_verts are off by 1
125          * but leave for now to save having to call do_versions */
126         curve_deform_verts(eval_ctx, md->scene, cmd->object, ob, derivedData, vertexCos, numVerts,
127                            cmd->name, cmd->defaxis - 1);
128 }
129
130 static void deformVertsEM(
131         ModifierData *md, struct EvaluationContext *eval_ctx, Object *ob, struct BMEditMesh *em,
132         DerivedMesh *derivedData, float (*vertexCos)[3], int numVerts)
133 {
134         DerivedMesh *dm = derivedData;
135
136         if (!derivedData) dm = CDDM_from_editbmesh(em, false, false);
137
138         deformVerts(md, eval_ctx, ob, dm, vertexCos, numVerts, 0);
139
140         if (!derivedData) dm->release(dm);
141 }
142
143
144 ModifierTypeInfo modifierType_Curve = {
145         /* name */              "Curve",
146         /* structName */        "CurveModifierData",
147         /* structSize */        sizeof(CurveModifierData),
148         /* type */              eModifierTypeType_OnlyDeform,
149         /* flags */             eModifierTypeFlag_AcceptsCVs |
150                                 eModifierTypeFlag_AcceptsLattice |
151                                 eModifierTypeFlag_SupportsEditmode,
152
153         /* copyData */          copyData,
154         /* deformVerts */       deformVerts,
155         /* deformMatrices */    NULL,
156         /* deformVertsEM */     deformVertsEM,
157         /* deformMatricesEM */  NULL,
158         /* applyModifier */     NULL,
159         /* applyModifierEM */   NULL,
160         /* initData */          initData,
161         /* requiredDataMask */  requiredDataMask,
162         /* freeData */          NULL,
163         /* isDisabled */        isDisabled,
164         /* updateDepsgraph */   updateDepsgraph,
165         /* dependsOnTime */     NULL,
166         /* dependsOnNormals */  NULL,
167         /* foreachObjectLink */ foreachObjectLink,
168         /* foreachIDLink */     NULL,
169         /* foreachTexLink */    NULL,
170 };