70
70
#include "MOD_modifiertypes.h"
72
static ModifierTypeInfo *modifier_types[NUM_MODIFIER_TYPES] = {NULL};
73
static VirtualModifierData virtualModifierCommonData;
75
void BKE_modifier_init(void)
79
/* Initialize modifier types */
80
modifier_type_init(modifier_types); /* MOD_utils.c */
82
/* Initialize global cmmon storage used for virtual modifier list */
83
md = modifier_new(eModifierType_Armature);
84
virtualModifierCommonData.amd = *((ArmatureModifierData *) md);
87
md = modifier_new(eModifierType_Curve);
88
virtualModifierCommonData.cmd = *((CurveModifierData *) md);
91
md = modifier_new(eModifierType_Lattice);
92
virtualModifierCommonData.lmd = *((LatticeModifierData *) md);
95
md = modifier_new(eModifierType_ShapeKey);
96
virtualModifierCommonData.smd = *((ShapeKeyModifierData *) md);
99
virtualModifierCommonData.amd.modifier.mode |= eModifierMode_Virtual;
100
virtualModifierCommonData.cmd.modifier.mode |= eModifierMode_Virtual;
101
virtualModifierCommonData.lmd.modifier.mode |= eModifierMode_Virtual;
102
virtualModifierCommonData.smd.modifier.mode |= eModifierMode_Virtual;
72
105
ModifierTypeInfo *modifierType_getInfo(ModifierType type)
74
static ModifierTypeInfo *types[NUM_MODIFIER_TYPES] = {NULL};
75
static int types_init = 1;
78
modifier_type_init(types); /* MOD_utils.c */
82
107
/* type unsigned, no need to check < 0 */
83
if (type < NUM_MODIFIER_TYPES && types[type]->name[0] != '\0') {
108
if (type < NUM_MODIFIER_TYPES && modifier_types[type]->name[0] != '\0') {
109
return modifier_types[type];
435
461
/* NOTE: This is to support old files from before Blender supported modifiers,
436
462
* in some cases versioning code updates these so for new files this will
437
463
* return an empty list. */
438
ModifierData *modifiers_getVirtualModifierList(Object *ob)
464
ModifierData *modifiers_getVirtualModifierList(Object *ob, VirtualModifierData *virtualModifierData)
440
/* Kinda hacky, but should be fine since we are never
441
* re-entrant and avoid free hassles.
443
static ArmatureModifierData amd;
444
static CurveModifierData cmd;
445
static LatticeModifierData lmd;
446
static ShapeKeyModifierData smd;
448
466
ModifierData *md;
451
md = modifier_new(eModifierType_Armature);
452
amd = *((ArmatureModifierData *) md);
455
md = modifier_new(eModifierType_Curve);
456
cmd = *((CurveModifierData *) md);
459
md = modifier_new(eModifierType_Lattice);
460
lmd = *((LatticeModifierData *) md);
463
md = modifier_new(eModifierType_ShapeKey);
464
smd = *((ShapeKeyModifierData *) md);
467
amd.modifier.mode |= eModifierMode_Virtual;
468
cmd.modifier.mode |= eModifierMode_Virtual;
469
lmd.modifier.mode |= eModifierMode_Virtual;
470
smd.modifier.mode |= eModifierMode_Virtual;
475
468
md = ob->modifiers.first;
470
*virtualModifierData = virtualModifierCommonData;
477
472
if (ob->parent) {
478
473
if (ob->parent->type == OB_ARMATURE && ob->partype == PARSKEL) {
479
amd.object = ob->parent;
480
amd.modifier.next = md;
481
amd.deformflag = ((bArmature *)(ob->parent->data))->deformflag;
474
virtualModifierData->amd.object = ob->parent;
475
virtualModifierData->amd.modifier.next = md;
476
virtualModifierData->amd.deformflag = ((bArmature *)(ob->parent->data))->deformflag;
477
md = &virtualModifierData->amd.modifier;
484
479
else if (ob->parent->type == OB_CURVE && ob->partype == PARSKEL) {
485
cmd.object = ob->parent;
486
cmd.defaxis = ob->trackflag + 1;
487
cmd.modifier.next = md;
480
virtualModifierData->cmd.object = ob->parent;
481
virtualModifierData->cmd.defaxis = ob->trackflag + 1;
482
virtualModifierData->cmd.modifier.next = md;
483
md = &virtualModifierData->cmd.modifier;
490
485
else if (ob->parent->type == OB_LATTICE && ob->partype == PARSKEL) {
491
lmd.object = ob->parent;
492
lmd.modifier.next = md;
486
virtualModifierData->lmd.object = ob->parent;
487
virtualModifierData->lmd.modifier.next = md;
488
md = &virtualModifierData->lmd.modifier;
497
492
/* shape key modifier, not yet for curves */
498
493
if (ELEM(ob->type, OB_MESH, OB_LATTICE) && BKE_key_from_object(ob)) {
499
494
if (ob->type == OB_MESH && (ob->shapeflag & OB_SHAPE_EDIT_MODE))
500
smd.modifier.mode |= eModifierMode_Editmode | eModifierMode_OnCage;
495
virtualModifierData->smd.modifier.mode |= eModifierMode_Editmode | eModifierMode_OnCage;
502
smd.modifier.mode &= ~eModifierMode_Editmode | eModifierMode_OnCage;
497
virtualModifierData->smd.modifier.mode &= ~eModifierMode_Editmode | eModifierMode_OnCage;
504
smd.modifier.next = md;
499
virtualModifierData->smd.modifier.next = md;
500
md = &virtualModifierData->smd.modifier;
595
594
bool modifier_isCorrectableDeformed(ModifierData *md)
597
if (md->type == eModifierType_Armature)
599
if (md->type == eModifierType_ShapeKey)
596
ModifierTypeInfo *mti = modifierType_getInfo(md->type);
597
return (mti->deformMatricesEM != NULL);
605
bool modifiers_isCorrectableDeformed(Object *ob)
600
bool modifiers_isCorrectableDeformed(struct Scene *scene, Object *ob)
607
ModifierData *md = modifiers_getVirtualModifierList(ob);
602
VirtualModifierData virtualModifierData;
603
ModifierData *md = modifiers_getVirtualModifierList(ob, &virtualModifierData);
604
int required_mode = eModifierMode_Realtime;
606
if (ob->mode == OB_MODE_EDIT)
607
required_mode |= eModifierMode_Editmode;
609
609
for (; md; md = md->next) {
610
if (ob->mode == OB_MODE_EDIT && (md->mode & eModifierMode_Editmode) == 0) {
610
if (!modifier_isEnabled(scene, md, required_mode)) {
613
613
else if (modifier_isCorrectableDeformed(md)) {