Merge branch 'blender-v2.81-release'
[blender.git] / source / blender / modifiers / intern / MOD_lattice.c
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
20 /** \file
21  * \ingroup modifiers
22  */
23
24 #include <string.h>
25
26 #include "BLI_utildefines.h"
27
28 #include "DNA_object_types.h"
29
30 #include "BKE_editmesh.h"
31 #include "BKE_lattice.h"
32 #include "BKE_library.h"
33 #include "BKE_library_query.h"
34 #include "BKE_mesh.h"
35 #include "BKE_modifier.h"
36
37 #include "DEG_depsgraph_query.h"
38
39 #include "MEM_guardedalloc.h"
40
41 #include "MOD_util.h"
42
43 static void initData(ModifierData *md)
44 {
45   LatticeModifierData *lmd = (LatticeModifierData *)md;
46   lmd->strength = 1.0f;
47 }
48
49 static void requiredDataMask(Object *UNUSED(ob),
50                              ModifierData *md,
51                              CustomData_MeshMasks *r_cddata_masks)
52 {
53   LatticeModifierData *lmd = (LatticeModifierData *)md;
54
55   /* ask for vertexgroups if we need them */
56   if (lmd->name[0] != '\0') {
57     r_cddata_masks->vmask |= CD_MASK_MDEFORMVERT;
58   }
59 }
60
61 static bool isDisabled(const struct Scene *UNUSED(scene),
62                        ModifierData *md,
63                        bool UNUSED(userRenderParams))
64 {
65   LatticeModifierData *lmd = (LatticeModifierData *)md;
66
67   /* The object type check is only needed here in case we have a placeholder
68    * object assigned (because the library containing the lattice is missing).
69    *
70    * In other cases it should be impossible to have a type mismatch.
71    */
72   return !lmd->object || lmd->object->type != OB_LATTICE;
73 }
74
75 static void foreachObjectLink(ModifierData *md, Object *ob, ObjectWalkFunc walk, void *userData)
76 {
77   LatticeModifierData *lmd = (LatticeModifierData *)md;
78
79   walk(userData, ob, &lmd->object, IDWALK_CB_NOP);
80 }
81
82 static void updateDepsgraph(ModifierData *md, const ModifierUpdateDepsgraphContext *ctx)
83 {
84   LatticeModifierData *lmd = (LatticeModifierData *)md;
85   if (lmd->object != NULL) {
86     DEG_add_object_relation(ctx->node, lmd->object, DEG_OB_COMP_GEOMETRY, "Lattice Modifier");
87     DEG_add_object_relation(ctx->node, lmd->object, DEG_OB_COMP_TRANSFORM, "Lattice Modifier");
88   }
89   DEG_add_modifier_to_transform_relation(ctx->node, "Lattice Modifier");
90 }
91
92 static void deformVerts(ModifierData *md,
93                         const ModifierEvalContext *ctx,
94                         struct Mesh *mesh,
95                         float (*vertexCos)[3],
96                         int numVerts)
97 {
98   LatticeModifierData *lmd = (LatticeModifierData *)md;
99   struct Mesh *mesh_src = MOD_deform_mesh_eval_get(
100       ctx->object, NULL, mesh, NULL, numVerts, false, false);
101
102   MOD_previous_vcos_store(md, vertexCos); /* if next modifier needs original vertices */
103
104   lattice_deform_verts(
105       lmd->object, ctx->object, mesh_src, vertexCos, numVerts, lmd->name, lmd->strength);
106
107   if (!ELEM(mesh_src, NULL, mesh)) {
108     BKE_id_free(NULL, mesh_src);
109   }
110 }
111
112 static void deformVertsEM(ModifierData *md,
113                           const ModifierEvalContext *ctx,
114                           struct BMEditMesh *em,
115                           struct Mesh *mesh,
116                           float (*vertexCos)[3],
117                           int numVerts)
118 {
119   struct Mesh *mesh_src = MOD_deform_mesh_eval_get(
120       ctx->object, em, mesh, NULL, numVerts, false, false);
121
122   deformVerts(md, ctx, mesh_src, vertexCos, numVerts);
123
124   if (!ELEM(mesh_src, NULL, mesh)) {
125     BKE_id_free(NULL, mesh_src);
126   }
127 }
128
129 ModifierTypeInfo modifierType_Lattice = {
130     /* name */ "Lattice",
131     /* structName */ "LatticeModifierData",
132     /* structSize */ sizeof(LatticeModifierData),
133     /* type */ eModifierTypeType_OnlyDeform,
134     /* flags */ eModifierTypeFlag_AcceptsCVs | eModifierTypeFlag_AcceptsLattice |
135         eModifierTypeFlag_SupportsEditmode,
136
137     /* copyData */ modifier_copyData_generic,
138
139     /* deformVerts */ deformVerts,
140     /* deformMatrices */ NULL,
141     /* deformVertsEM */ deformVertsEM,
142     /* deformMatricesEM */ NULL,
143     /* applyModifier */ NULL,
144
145     /* initData */ initData,
146     /* requiredDataMask */ requiredDataMask,
147     /* freeData */ NULL,
148     /* isDisabled */ isDisabled,
149     /* updateDepsgraph */ updateDepsgraph,
150     /* dependsOnTime */ NULL,
151     /* dependsOnNormals */ NULL,
152     /* foreachObjectLink */ foreachObjectLink,
153     /* foreachIDLink */ NULL,
154     /* foreachTexLink */ NULL,
155     /* freeRuntimeData */ NULL,
156 };