|
Blender
V2.59
|
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 }