Blender  V2.59
modifier.c
Go to the documentation of this file.
00001 /*
00002 * $Id: modifier.c 35247 2011-02-27 20:40:57Z jesterking $
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 * Modifier stack implementation.
00032 *
00033 * BKE_modifier.h contains the function prototypes for this file.
00034 *
00035 */
00036 
00042 #include <stddef.h>
00043 #include <string.h>
00044 #include <stdarg.h>
00045 #include <math.h>
00046 #include <float.h>
00047 
00048 #include "MEM_guardedalloc.h"
00049 
00050 #include "DNA_armature_types.h"
00051 #include "DNA_object_types.h"
00052 #include "DNA_meshdata_types.h"
00053 
00054 #include "BLI_utildefines.h"
00055 
00056 #include "BKE_bmesh.h"
00057 #include "BKE_cloth.h"
00058 #include "BKE_key.h"
00059 #include "BKE_multires.h"
00060 
00061 #include "MOD_modifiertypes.h"
00062 
00063 ModifierTypeInfo *modifierType_getInfo(ModifierType type)
00064 {
00065         static ModifierTypeInfo *types[NUM_MODIFIER_TYPES]= {NULL};
00066         static int types_init = 1;
00067 
00068         if (types_init) {
00069                 modifier_type_init(types); /* MOD_utils.c */
00070                 types_init= 0;
00071         }
00072 
00073         /* type unsigned, no need to chech < 0 */
00074         if(type < NUM_MODIFIER_TYPES && types[type]->name[0] != '\0') {
00075                 return types[type];
00076         }
00077         else {
00078                 return NULL;
00079         }
00080 }
00081 
00082 /***/
00083 
00084 ModifierData *modifier_new(int type)
00085 {
00086         ModifierTypeInfo *mti = modifierType_getInfo(type);
00087         ModifierData *md = MEM_callocN(mti->structSize, mti->structName);
00088         
00089         // FIXME: we need to make the name always be unique somehow...
00090         strcpy(md->name, mti->name);
00091 
00092         md->type = type;
00093         md->mode = eModifierMode_Realtime
00094                         | eModifierMode_Render | eModifierMode_Expanded;
00095 
00096         if (mti->flags & eModifierTypeFlag_EnableInEditmode)
00097                 md->mode |= eModifierMode_Editmode;
00098 
00099         if (mti->initData) mti->initData(md);
00100 
00101         return md;
00102 }
00103 
00104 void modifier_free(ModifierData *md) 
00105 {
00106         ModifierTypeInfo *mti = modifierType_getInfo(md->type);
00107 
00108         if (mti->freeData) mti->freeData(md);
00109         if (md->error) MEM_freeN(md->error);
00110 
00111         MEM_freeN(md);
00112 }
00113 
00114 void modifier_unique_name(ListBase *modifiers, ModifierData *md)
00115 {
00116         if (modifiers && md) {
00117                 ModifierTypeInfo *mti = modifierType_getInfo(md->type);
00118                 
00119                 BLI_uniquename(modifiers, md, mti->name, '.', offsetof(ModifierData, name), sizeof(md->name));
00120         }
00121 }
00122 
00123 int modifier_dependsOnTime(ModifierData *md) 
00124 {
00125         ModifierTypeInfo *mti = modifierType_getInfo(md->type);
00126 
00127         return mti->dependsOnTime && mti->dependsOnTime(md);
00128 }
00129 
00130 int modifier_supportsMapping(ModifierData *md)
00131 {
00132         ModifierTypeInfo *mti = modifierType_getInfo(md->type);
00133 
00134         return (mti->type==eModifierTypeType_OnlyDeform ||
00135                         (mti->flags & eModifierTypeFlag_SupportsMapping));
00136 }
00137 
00138 ModifierData *modifiers_findByType(Object *ob, ModifierType type)
00139 {
00140         ModifierData *md = ob->modifiers.first;
00141 
00142         for (; md; md=md->next)
00143                 if (md->type==type)
00144                         break;
00145 
00146         return md;
00147 }
00148 
00149 ModifierData *modifiers_findByName(Object *ob, const char *name)
00150 {
00151         return BLI_findstring(&(ob->modifiers), name, offsetof(ModifierData, name));
00152 }
00153 
00154 void modifiers_clearErrors(Object *ob)
00155 {
00156         ModifierData *md = ob->modifiers.first;
00157         /* int qRedraw = 0; */
00158 
00159         for (; md; md=md->next) {
00160                 if (md->error) {
00161                         MEM_freeN(md->error);
00162                         md->error = NULL;
00163 
00164                         /* qRedraw = 1; */
00165                 }
00166         }
00167 }
00168 
00169 void modifiers_foreachObjectLink(Object *ob, ObjectWalkFunc walk,
00170                                  void *userData)
00171 {
00172         ModifierData *md = ob->modifiers.first;
00173 
00174         for (; md; md=md->next) {
00175                 ModifierTypeInfo *mti = modifierType_getInfo(md->type);
00176 
00177                 if (mti->foreachObjectLink)
00178                         mti->foreachObjectLink(md, ob, walk, userData);
00179         }
00180 }
00181 
00182 void modifiers_foreachIDLink(Object *ob, IDWalkFunc walk, void *userData)
00183 {
00184         ModifierData *md = ob->modifiers.first;
00185 
00186         for (; md; md=md->next) {
00187                 ModifierTypeInfo *mti = modifierType_getInfo(md->type);
00188 
00189                 if(mti->foreachIDLink) mti->foreachIDLink(md, ob, walk, userData);
00190                 else if(mti->foreachObjectLink) {
00191                         /* each Object can masquerade as an ID, so this should be OK */
00192                         ObjectWalkFunc fp = (ObjectWalkFunc)walk;
00193                         mti->foreachObjectLink(md, ob, fp, userData);
00194                 }
00195         }
00196 }
00197 
00198 void modifier_copyData(ModifierData *md, ModifierData *target)
00199 {
00200         ModifierTypeInfo *mti = modifierType_getInfo(md->type);
00201 
00202         target->mode = md->mode;
00203 
00204         if (mti->copyData)
00205                 mti->copyData(md, target);
00206 }
00207 
00208 int modifier_couldBeCage(struct Scene *scene, ModifierData *md)
00209 {
00210         ModifierTypeInfo *mti = modifierType_getInfo(md->type);
00211 
00212         md->scene= scene;
00213 
00214         return (        (md->mode & eModifierMode_Realtime) &&
00215                         (md->mode & eModifierMode_Editmode) &&
00216                         (!mti->isDisabled || !mti->isDisabled(md, 0)) &&
00217                         modifier_supportsMapping(md));  
00218 }
00219 
00220 int modifier_sameTopology(ModifierData *md)
00221 {
00222         ModifierTypeInfo *mti = modifierType_getInfo(md->type);
00223         return ( mti->type == eModifierTypeType_OnlyDeform || mti->type == eModifierTypeType_Nonconstructive);
00224 }
00225 
00226 void modifier_setError(ModifierData *md, const char *format, ...)
00227 {
00228         char buffer[512];
00229         va_list ap;
00230 
00231         va_start(ap, format);
00232         vsnprintf(buffer, sizeof(buffer), format, ap);
00233         va_end(ap);
00234         buffer[sizeof(buffer) - 1]= '\0';
00235 
00236         if (md->error)
00237                 MEM_freeN(md->error);
00238 
00239         md->error = BLI_strdup(buffer);
00240 
00241 }
00242 
00243 /* used for buttons, to find out if the 'draw deformed in editmode' option is
00244  * there
00245  * 
00246  * also used in transform_conversion.c, to detect CrazySpace [tm] (2nd arg
00247  * then is NULL) 
00248  * also used for some mesh tools to give warnings
00249  */
00250 int modifiers_getCageIndex(struct Scene *scene, Object *ob, int *lastPossibleCageIndex_r, int virtual_)
00251 {
00252         ModifierData *md = (virtual_)? modifiers_getVirtualModifierList(ob): ob->modifiers.first;
00253         int i, cageIndex = -1;
00254 
00255         if(lastPossibleCageIndex_r) {
00256                 /* ensure the value is initialized */
00257                 *lastPossibleCageIndex_r= -1;
00258         }
00259 
00260         /* Find the last modifier acting on the cage. */
00261         for (i=0; md; i++,md=md->next) {
00262                 ModifierTypeInfo *mti = modifierType_getInfo(md->type);
00263 
00264                 md->scene= scene;
00265 
00266                 if (!(md->mode & eModifierMode_Realtime)) continue;
00267                 if (!(md->mode & eModifierMode_Editmode)) continue;
00268                 if (mti->isDisabled && mti->isDisabled(md, 0)) continue;
00269                 if (!(mti->flags & eModifierTypeFlag_SupportsEditmode)) continue;
00270                 if (md->mode & eModifierMode_DisableTemporary) continue;
00271 
00272                 if (!modifier_supportsMapping(md))
00273                         break;
00274 
00275                 if (lastPossibleCageIndex_r) *lastPossibleCageIndex_r = i;
00276                 if (md->mode & eModifierMode_OnCage)
00277                         cageIndex = i;
00278         }
00279 
00280         return cageIndex;
00281 }
00282 
00283 
00284 int modifiers_isSoftbodyEnabled(Object *ob)
00285 {
00286         ModifierData *md = modifiers_findByType(ob, eModifierType_Softbody);
00287 
00288         return (md && md->mode & (eModifierMode_Realtime | eModifierMode_Render));
00289 }
00290 
00291 int modifiers_isClothEnabled(Object *ob)
00292 {
00293         ModifierData *md = modifiers_findByType(ob, eModifierType_Cloth);
00294 
00295         return (md && md->mode & (eModifierMode_Realtime | eModifierMode_Render));
00296 }
00297 
00298 int modifiers_isParticleEnabled(Object *ob)
00299 {
00300         ModifierData *md = modifiers_findByType(ob, eModifierType_ParticleSystem);
00301 
00302         return (md && md->mode & (eModifierMode_Realtime | eModifierMode_Render));
00303 }
00304 
00305 int modifier_isEnabled(struct Scene *scene, ModifierData *md, int required_mode)
00306 {
00307         ModifierTypeInfo *mti = modifierType_getInfo(md->type);
00308 
00309         md->scene= scene;
00310 
00311         if((md->mode & required_mode) != required_mode) return 0;
00312         if(mti->isDisabled && mti->isDisabled(md, required_mode == eModifierMode_Render)) return 0;
00313         if(md->mode & eModifierMode_DisableTemporary) return 0;
00314         if(required_mode & eModifierMode_Editmode)
00315                 if(!(mti->flags & eModifierTypeFlag_SupportsEditmode)) return 0;
00316         
00317         return 1;
00318 }
00319 
00320 LinkNode *modifiers_calcDataMasks(struct Scene *scene, Object *ob, ModifierData *md, CustomDataMask dataMask, int required_mode)
00321 {
00322         LinkNode *dataMasks = NULL;
00323         LinkNode *curr, *prev;
00324 
00325         /* build a list of modifier data requirements in reverse order */
00326         for(; md; md = md->next) {
00327                 ModifierTypeInfo *mti = modifierType_getInfo(md->type);
00328                 CustomDataMask mask = 0;
00329 
00330                 if(modifier_isEnabled(scene, md, required_mode))
00331                         if(mti->requiredDataMask)
00332                                 mask = mti->requiredDataMask(ob, md);
00333 
00334                 BLI_linklist_prepend(&dataMasks, SET_INT_IN_POINTER(mask));
00335         }
00336 
00337         /* build the list of required data masks - each mask in the list must
00338         * include all elements of the masks that follow it
00339         *
00340         * note the list is currently in reverse order, so "masks that follow it"
00341         * actually means "masks that precede it" at the moment
00342         */
00343         for(curr = dataMasks, prev = NULL; curr; prev = curr, curr = curr->next) {
00344                 if(prev) {
00345                         CustomDataMask prev_mask = (CustomDataMask)GET_INT_FROM_POINTER(prev->link);
00346                         CustomDataMask curr_mask = (CustomDataMask)GET_INT_FROM_POINTER(curr->link);
00347 
00348                         curr->link = SET_INT_IN_POINTER(curr_mask | prev_mask);
00349                 } else {
00350                         CustomDataMask curr_mask = (CustomDataMask)GET_INT_FROM_POINTER(curr->link);
00351 
00352                         curr->link = SET_INT_IN_POINTER(curr_mask | dataMask);
00353                 }
00354         }
00355 
00356         /* reverse the list so it's in the correct order */
00357         BLI_linklist_reverse(&dataMasks);
00358 
00359         return dataMasks;
00360 }
00361 
00362 ModifierData *modifiers_getVirtualModifierList(Object *ob)
00363 {
00364                 /* Kinda hacky, but should be fine since we are never
00365         * reentrant and avoid free hassles.
00366                 */
00367         static ArmatureModifierData amd;
00368         static CurveModifierData cmd;
00369         static LatticeModifierData lmd;
00370         static ShapeKeyModifierData smd;
00371         static int init = 1;
00372         ModifierData *md;
00373 
00374         if (init) {
00375                 md = modifier_new(eModifierType_Armature);
00376                 amd = *((ArmatureModifierData*) md);
00377                 modifier_free(md);
00378 
00379                 md = modifier_new(eModifierType_Curve);
00380                 cmd = *((CurveModifierData*) md);
00381                 modifier_free(md);
00382 
00383                 md = modifier_new(eModifierType_Lattice);
00384                 lmd = *((LatticeModifierData*) md);
00385                 modifier_free(md);
00386 
00387                 md = modifier_new(eModifierType_ShapeKey);
00388                 smd = *((ShapeKeyModifierData*) md);
00389                 modifier_free(md);
00390 
00391                 amd.modifier.mode |= eModifierMode_Virtual;
00392                 cmd.modifier.mode |= eModifierMode_Virtual;
00393                 lmd.modifier.mode |= eModifierMode_Virtual;
00394                 smd.modifier.mode |= eModifierMode_Virtual;
00395 
00396                 init = 0;
00397         }
00398 
00399         md = ob->modifiers.first;
00400 
00401         if(ob->parent) {
00402                 if(ob->parent->type==OB_ARMATURE && ob->partype==PARSKEL) {
00403                         amd.object = ob->parent;
00404                         amd.modifier.next = md;
00405                         amd.deformflag= ((bArmature *)(ob->parent->data))->deformflag;
00406                         md = &amd.modifier;
00407                 } else if(ob->parent->type==OB_CURVE && ob->partype==PARSKEL) {
00408                         cmd.object = ob->parent;
00409                         cmd.defaxis = ob->trackflag + 1;
00410                         cmd.modifier.next = md;
00411                         md = &cmd.modifier;
00412                 } else if(ob->parent->type==OB_LATTICE && ob->partype==PARSKEL) {
00413                         lmd.object = ob->parent;
00414                         lmd.modifier.next = md;
00415                         md = &lmd.modifier;
00416                 }
00417         }
00418 
00419         /* shape key modifier, not yet for curves */
00420         if(ELEM(ob->type, OB_MESH, OB_LATTICE) && ob_get_key(ob)) {
00421                 if(ob->type == OB_MESH && (ob->shapeflag & OB_SHAPE_EDIT_MODE))
00422                         smd.modifier.mode |= eModifierMode_Editmode|eModifierMode_OnCage;
00423                 else
00424                         smd.modifier.mode &= ~eModifierMode_Editmode|eModifierMode_OnCage;
00425 
00426                 smd.modifier.next = md;
00427                 md = &smd.modifier;
00428         }
00429 
00430         return md;
00431 }
00432 /* Takes an object and returns its first selected armature, else just its
00433  * armature
00434  * This should work for multiple armatures per object
00435  */
00436 Object *modifiers_isDeformedByArmature(Object *ob)
00437 {
00438         ModifierData *md = modifiers_getVirtualModifierList(ob);
00439         ArmatureModifierData *amd= NULL;
00440         
00441         /* return the first selected armature, this lets us use multiple armatures
00442         */
00443         for (; md; md=md->next) {
00444                 if (md->type==eModifierType_Armature) {
00445                         amd = (ArmatureModifierData*) md;
00446                         if (amd->object && (amd->object->flag & SELECT))
00447                                 return amd->object;
00448                 }
00449         }
00450         
00451         if (amd) /* if were still here then return the last armature */
00452                 return amd->object;
00453         
00454         return NULL;
00455 }
00456 
00457 /* Takes an object and returns its first selected lattice, else just its
00458 * lattice
00459 * This should work for multiple lattics per object
00460 */
00461 Object *modifiers_isDeformedByLattice(Object *ob)
00462 {
00463         ModifierData *md = modifiers_getVirtualModifierList(ob);
00464         LatticeModifierData *lmd= NULL;
00465         
00466         /* return the first selected lattice, this lets us use multiple lattices
00467         */
00468         for (; md; md=md->next) {
00469                 if (md->type==eModifierType_Lattice) {
00470                         lmd = (LatticeModifierData*) md;
00471                         if (lmd->object && (lmd->object->flag & SELECT))
00472                                 return lmd->object;
00473                 }
00474         }
00475         
00476         if (lmd) /* if were still here then return the last lattice */
00477                 return lmd->object;
00478         
00479         return NULL;
00480 }
00481 
00482 
00483 
00484 int modifiers_usesArmature(Object *ob, bArmature *arm)
00485 {
00486         ModifierData *md = modifiers_getVirtualModifierList(ob);
00487 
00488         for (; md; md=md->next) {
00489                 if (md->type==eModifierType_Armature) {
00490                         ArmatureModifierData *amd = (ArmatureModifierData*) md;
00491                         if (amd->object && amd->object->data==arm) 
00492                                 return 1;
00493                 }
00494         }
00495 
00496         return 0;
00497 }
00498 
00499 int modifier_isCorrectableDeformed(ModifierData *md)
00500 {
00501         if (md->type==eModifierType_Armature)
00502                 return 1;
00503         if (md->type==eModifierType_ShapeKey)
00504                 return 1;
00505         
00506         return 0;
00507 }
00508 
00509 int modifiers_isCorrectableDeformed(Object *ob)
00510 {
00511         ModifierData *md = modifiers_getVirtualModifierList(ob);
00512         
00513         for (; md; md=md->next) {
00514                 if(ob->mode==OB_MODE_EDIT && (md->mode & eModifierMode_Editmode)==0);
00515                 else 
00516                         if(modifier_isCorrectableDeformed(md))
00517                                 return 1;
00518         }
00519         return 0;
00520 }
00521 
00522 int modifiers_indexInObject(Object *ob, ModifierData *md_seek)
00523 {
00524         int i= 0;
00525         ModifierData *md;
00526         
00527         for (md=ob->modifiers.first; (md && md_seek!=md); md=md->next, i++);
00528         if (!md) return -1; /* modifier isnt in the object */
00529         return i;
00530 }
00531 
00532 void modifier_freeTemporaryData(ModifierData *md)
00533 {
00534         if(md->type == eModifierType_Armature) {
00535                 ArmatureModifierData *amd= (ArmatureModifierData*)md;
00536 
00537                 if(amd->prevCos) {
00538                         MEM_freeN(amd->prevCos);
00539                         amd->prevCos= NULL;
00540                 }
00541         }
00542 }
00543 
00544 /* ensure modifier correctness when changing ob->data */
00545 void test_object_modifiers(Object *ob)
00546 {
00547         ModifierData *md;
00548 
00549         /* just multires checked for now, since only multires
00550            modifies mesh data */
00551 
00552         if(ob->type != OB_MESH) return;
00553 
00554         for(md = ob->modifiers.first; md; md = md->next) {
00555                 if(md->type == eModifierType_Multires) {
00556                         MultiresModifierData *mmd = (MultiresModifierData*)md;
00557 
00558                         multiresModifier_set_levels_from_disps(mmd, ob);
00559                 }
00560         }
00561 }