Blender  V2.59
MOD_armature.c
Go to the documentation of this file.
00001 /*
00002 * $Id: MOD_armature.c 36913 2011-05-26 10:21:09Z blendix $
00003 *
00004 * ***** BEGIN GPL LICENSE BLOCK *****
00005 *
00006 * This program is free software; you can redistribute it and/or
00007 * modify it under the terms of the GNU General Public License
00008 * as published by the Free Software Foundation; either version 2
00009 * of the License, or (at your option) any later version.
00010 *
00011 * This program is distributed in the hope that it will be useful,
00012 * but WITHOUT ANY WARRANTY; without even the implied warranty of
00013 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00014 * GNU General Public License for more details.
00015 *
00016 * You should have received a copy of the GNU General Public License
00017 * along with this program; if not, write to the Free Software  Foundation,
00018 * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
00019 *
00020 * The Original Code is Copyright (C) 2005 by the Blender Foundation.
00021 * All rights reserved.
00022 *
00023 * Contributor(s): Daniel Dunbar
00024 *                 Ton Roosendaal,
00025 *                 Ben Batt,
00026 *                 Brecht Van Lommel,
00027 *                 Campbell Barton
00028 *
00029 * ***** END GPL LICENSE BLOCK *****
00030 *
00031 */
00032 
00038 #include <string.h>
00039 
00040 #include "DNA_armature_types.h"
00041 #include "DNA_object_types.h"
00042 #include "DNA_mesh_types.h"
00043 
00044 #include "BLI_utildefines.h"
00045 
00046 
00047 #include "BKE_cdderivedmesh.h"
00048 #include "BKE_lattice.h"
00049 #include "BKE_modifier.h"
00050 
00051 #include "MEM_guardedalloc.h"
00052 
00053 #include "depsgraph_private.h"
00054 
00055 #include "MOD_util.h"
00056 
00057 
00058 static void initData(ModifierData *md)
00059 {
00060         ArmatureModifierData *amd = (ArmatureModifierData*) md;
00061         
00062         amd->deformflag = ARM_DEF_ENVELOPE | ARM_DEF_VGROUP;
00063 }
00064 
00065 static void copyData(ModifierData *md, ModifierData *target)
00066 {
00067         ArmatureModifierData *amd = (ArmatureModifierData*) md;
00068         ArmatureModifierData *tamd = (ArmatureModifierData*) target;
00069 
00070         tamd->object = amd->object;
00071         tamd->deformflag = amd->deformflag;
00072         tamd->multi = amd->multi;
00073         strncpy(tamd->defgrp_name, amd->defgrp_name, 32);
00074 }
00075 
00076 static CustomDataMask requiredDataMask(Object *UNUSED(ob), ModifierData *UNUSED(md))
00077 {
00078         CustomDataMask dataMask = 0;
00079 
00080         /* ask for vertexgroups */
00081         dataMask |= CD_MASK_MDEFORMVERT;
00082 
00083         return dataMask;
00084 }
00085 
00086 static int isDisabled(ModifierData *md, int UNUSED(useRenderParams))
00087 {
00088         ArmatureModifierData *amd = (ArmatureModifierData*) md;
00089 
00090         return !amd->object;
00091 }
00092 
00093 static void foreachObjectLink(
00094                                                    ModifierData *md, Object *ob,
00095                 void (*walk)(void *userData, Object *ob, Object **obpoin),
00096                    void *userData)
00097 {
00098         ArmatureModifierData *amd = (ArmatureModifierData*) md;
00099 
00100         walk(userData, ob, &amd->object);
00101 }
00102 
00103 static void updateDepgraph(ModifierData *md, DagForest *forest,
00104                                                 struct Scene *UNUSED(scene),
00105                                                 Object *UNUSED(ob),
00106                                                 DagNode *obNode)
00107 {
00108         ArmatureModifierData *amd = (ArmatureModifierData*) md;
00109 
00110         if (amd->object) {
00111                 DagNode *curNode = dag_get_node(forest, amd->object);
00112 
00113                 dag_add_relation(forest, curNode, obNode,
00114                                  DAG_RL_DATA_DATA | DAG_RL_OB_DATA, "Armature Modifier");
00115         }
00116 }
00117 
00118 static void deformVerts(ModifierData *md, Object *ob,
00119                                                 DerivedMesh *derivedData,
00120                                                 float (*vertexCos)[3],
00121                                                 int numVerts,
00122                                                 int UNUSED(useRenderParams),
00123                                                 int UNUSED(isFinalCalc))
00124 {
00125         ArmatureModifierData *amd = (ArmatureModifierData*) md;
00126 
00127         modifier_vgroup_cache(md, vertexCos); /* if next modifier needs original vertices */
00128         
00129         armature_deform_verts(amd->object, ob, derivedData, vertexCos, NULL,
00130                 numVerts, amd->deformflag, (float(*)[3])amd->prevCos, amd->defgrp_name);
00131 
00132         /* free cache */
00133         if(amd->prevCos) {
00134                 MEM_freeN(amd->prevCos);
00135                 amd->prevCos= NULL;
00136         }
00137 }
00138 
00139 static void deformVertsEM(
00140                                            ModifierData *md, Object *ob, struct EditMesh *editData,
00141         DerivedMesh *derivedData, float (*vertexCos)[3], int numVerts)
00142 {
00143         ArmatureModifierData *amd = (ArmatureModifierData*) md;
00144         DerivedMesh *dm = derivedData;
00145 
00146         if(!derivedData) dm = CDDM_from_editmesh(editData, ob->data);
00147 
00148         modifier_vgroup_cache(md, vertexCos); /* if next modifier needs original vertices */
00149 
00150         armature_deform_verts(amd->object, ob, dm, vertexCos, NULL,
00151                 numVerts, amd->deformflag, (float(*)[3])amd->prevCos, amd->defgrp_name);
00152 
00153         /* free cache */
00154         if(amd->prevCos) {
00155                 MEM_freeN(amd->prevCos);
00156                 amd->prevCos= NULL;
00157         }
00158 
00159         if(!derivedData) dm->release(dm);
00160 }
00161 
00162 static void deformMatricesEM(
00163                                                   ModifierData *md, Object *ob, struct EditMesh *editData,
00164            DerivedMesh *derivedData, float (*vertexCos)[3],
00165                                                  float (*defMats)[3][3], int numVerts)
00166 {
00167         ArmatureModifierData *amd = (ArmatureModifierData*) md;
00168         DerivedMesh *dm = derivedData;
00169 
00170         if(!derivedData) dm = CDDM_from_editmesh(editData, ob->data);
00171 
00172         armature_deform_verts(amd->object, ob, dm, vertexCos, defMats, numVerts,
00173                                   amd->deformflag, NULL, amd->defgrp_name);
00174 
00175         if(!derivedData) dm->release(dm);
00176 }
00177 
00178 static void deformMatrices(ModifierData *md, Object *ob, DerivedMesh *derivedData,
00179                                                    float (*vertexCos)[3], float (*defMats)[3][3], int numVerts)
00180 {
00181         ArmatureModifierData *amd = (ArmatureModifierData*) md;
00182         DerivedMesh *dm = derivedData;
00183 
00184         if(!derivedData) dm = CDDM_from_mesh((Mesh*)ob->data, ob);
00185 
00186         armature_deform_verts(amd->object, ob, dm, vertexCos, defMats, numVerts,
00187                                   amd->deformflag, NULL, amd->defgrp_name);
00188 
00189         if(!derivedData) dm->release(dm);
00190 }
00191 
00192 ModifierTypeInfo modifierType_Armature = {
00193         /* name */              "Armature",
00194         /* structName */        "ArmatureModifierData",
00195         /* structSize */        sizeof(ArmatureModifierData),
00196         /* type */              eModifierTypeType_OnlyDeform,
00197         /* flags */             eModifierTypeFlag_AcceptsCVs
00198                                                         | eModifierTypeFlag_SupportsEditmode,
00199 
00200         /* copyData */          copyData,
00201         /* deformVerts */       deformVerts,
00202         /* deformMatrices */    deformMatrices,
00203         /* deformVertsEM */     deformVertsEM,
00204         /* deformMatricesEM */  deformMatricesEM,
00205         /* applyModifier */     NULL,
00206         /* applyModifierEM */   NULL,
00207         /* initData */          initData,
00208         /* requiredDataMask */  requiredDataMask,
00209         /* freeData */          NULL,
00210         /* isDisabled */        isDisabled,
00211         /* updateDepgraph */    updateDepgraph,
00212         /* dependsOnTime */     NULL,
00213         /* dependsOnNormals */  NULL,
00214         /* foreachObjectLink */ foreachObjectLink,
00215         /* foreachIDLink */     NULL,
00216 };