code cleanup: make bmesh operator names more consistant since python has access to...
[blender.git] / source / blender / modifiers / intern / MOD_armature.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_armature.c
32  *  \ingroup modifiers
33  */
34
35
36 #include <string.h>
37
38 #include "DNA_armature_types.h"
39 #include "DNA_object_types.h"
40 #include "DNA_mesh_types.h"
41
42 #include "BLI_utildefines.h"
43 #include "BLI_string.h"
44
45
46 #include "BKE_cdderivedmesh.h"
47 #include "BKE_lattice.h"
48 #include "BKE_modifier.h"
49
50 #include "MEM_guardedalloc.h"
51
52 #include "depsgraph_private.h"
53
54 #include "MOD_util.h"
55
56
57 static void initData(ModifierData *md)
58 {
59         ArmatureModifierData *amd = (ArmatureModifierData *) md;
60         
61         amd->deformflag = ARM_DEF_VGROUP;
62 }
63
64 static void copyData(ModifierData *md, ModifierData *target)
65 {
66         ArmatureModifierData *amd = (ArmatureModifierData *) md;
67         ArmatureModifierData *tamd = (ArmatureModifierData *) target;
68
69         tamd->object = amd->object;
70         tamd->deformflag = amd->deformflag;
71         tamd->multi = amd->multi;
72         BLI_strncpy(tamd->defgrp_name, amd->defgrp_name, sizeof(tamd->defgrp_name));
73 }
74
75 static CustomDataMask requiredDataMask(Object *UNUSED(ob), ModifierData *UNUSED(md))
76 {
77         CustomDataMask dataMask = 0;
78
79         /* ask for vertexgroups */
80         dataMask |= CD_MASK_MDEFORMVERT;
81
82         return dataMask;
83 }
84
85 static int isDisabled(ModifierData *md, int UNUSED(useRenderParams))
86 {
87         ArmatureModifierData *amd = (ArmatureModifierData *) md;
88
89         return !amd->object;
90 }
91
92 static void foreachObjectLink(
93         ModifierData *md, Object *ob,
94         void (*walk)(void *userData, Object *ob, Object **obpoin),
95         void *userData)
96 {
97         ArmatureModifierData *amd = (ArmatureModifierData *) md;
98
99         walk(userData, ob, &amd->object);
100 }
101
102 static void updateDepgraph(ModifierData *md, DagForest *forest,
103                            struct Scene *UNUSED(scene),
104                            Object *UNUSED(ob),
105                            DagNode *obNode)
106 {
107         ArmatureModifierData *amd = (ArmatureModifierData *) md;
108
109         if (amd->object) {
110                 DagNode *curNode = dag_get_node(forest, amd->object);
111
112                 dag_add_relation(forest, curNode, obNode,
113                                  DAG_RL_DATA_DATA | DAG_RL_OB_DATA, "Armature Modifier");
114         }
115 }
116
117 static void deformVerts(ModifierData *md, Object *ob,
118                         DerivedMesh *derivedData,
119                         float (*vertexCos)[3],
120                         int numVerts,
121                         ModifierApplyFlag UNUSED(flag))
122 {
123         ArmatureModifierData *amd = (ArmatureModifierData *) md;
124
125         modifier_vgroup_cache(md, vertexCos); /* if next modifier needs original vertices */
126         
127         armature_deform_verts(amd->object, ob, derivedData, vertexCos, NULL,
128                               numVerts, amd->deformflag, (float(*)[3])amd->prevCos, amd->defgrp_name);
129
130         /* free cache */
131         if (amd->prevCos) {
132                 MEM_freeN(amd->prevCos);
133                 amd->prevCos = NULL;
134         }
135 }
136
137 static void deformVertsEM(
138         ModifierData *md, Object *ob, struct BMEditMesh *em,
139         DerivedMesh *derivedData, float (*vertexCos)[3], int numVerts)
140 {
141         ArmatureModifierData *amd = (ArmatureModifierData *) md;
142         DerivedMesh *dm = derivedData;
143
144         if (!derivedData) dm = CDDM_from_editbmesh(em, FALSE, FALSE);
145
146         modifier_vgroup_cache(md, vertexCos); /* if next modifier needs original vertices */
147
148         armature_deform_verts(amd->object, ob, dm, vertexCos, NULL,
149                               numVerts, amd->deformflag, (float(*)[3])amd->prevCos, amd->defgrp_name);
150
151         /* free cache */
152         if (amd->prevCos) {
153                 MEM_freeN(amd->prevCos);
154                 amd->prevCos = NULL;
155         }
156
157         if (!derivedData) dm->release(dm);
158 }
159
160 static void deformMatricesEM(
161         ModifierData *md, Object *ob, struct BMEditMesh *em,
162         DerivedMesh *derivedData, float (*vertexCos)[3],
163         float (*defMats)[3][3], int numVerts)
164 {
165         ArmatureModifierData *amd = (ArmatureModifierData *) md;
166         DerivedMesh *dm = derivedData;
167
168         if (!derivedData) dm = CDDM_from_editbmesh(em, FALSE, FALSE);
169
170         armature_deform_verts(amd->object, ob, dm, vertexCos, defMats, numVerts,
171                               amd->deformflag, NULL, amd->defgrp_name);
172
173         if (!derivedData) dm->release(dm);
174 }
175
176 static void deformMatrices(ModifierData *md, Object *ob, DerivedMesh *derivedData,
177                            float (*vertexCos)[3], float (*defMats)[3][3], int numVerts)
178 {
179         ArmatureModifierData *amd = (ArmatureModifierData *) md;
180         DerivedMesh *dm = derivedData;
181
182         if (!derivedData) dm = CDDM_from_mesh((Mesh *)ob->data, ob);
183
184         armature_deform_verts(amd->object, ob, dm, vertexCos, defMats, numVerts,
185                               amd->deformflag, NULL, amd->defgrp_name);
186
187         if (!derivedData) dm->release(dm);
188 }
189
190 ModifierTypeInfo modifierType_Armature = {
191         /* name */              "Armature",
192         /* structName */        "ArmatureModifierData",
193         /* structSize */        sizeof(ArmatureModifierData),
194         /* type */              eModifierTypeType_OnlyDeform,
195         /* flags */             eModifierTypeFlag_AcceptsCVs |
196                                 eModifierTypeFlag_SupportsEditmode,
197
198         /* copyData */          copyData,
199         /* deformVerts */       deformVerts,
200         /* deformMatrices */    deformMatrices,
201         /* deformVertsEM */     deformVertsEM,
202         /* deformMatricesEM */  deformMatricesEM,
203         /* applyModifier */     NULL,
204         /* applyModifierEM */   NULL,
205         /* initData */          initData,
206         /* requiredDataMask */  requiredDataMask,
207         /* freeData */          NULL,
208         /* isDisabled */        isDisabled,
209         /* updateDepgraph */    updateDepgraph,
210         /* dependsOnTime */     NULL,
211         /* dependsOnNormals */  NULL,
212         /* foreachObjectLink */ foreachObjectLink,
213         /* foreachIDLink */     NULL,
214         /* foreachTexLink */    NULL,
215 };