Changeset View
Changeset View
Standalone View
Standalone View
source/blender/blenkernel/intern/modifier.c
| Show First 20 Lines • Show All 472 Lines • ▼ Show 20 Lines | bool modifier_isEnabled(const struct Scene *scene, ModifierData *md, int required_mode) | ||||
| if (scene != NULL && mti->isDisabled && mti->isDisabled(scene, md, required_mode == eModifierMode_Render)) return false; | if (scene != NULL && mti->isDisabled && mti->isDisabled(scene, md, required_mode == eModifierMode_Render)) return false; | ||||
| if (md->mode & eModifierMode_DisableTemporary) return false; | if (md->mode & eModifierMode_DisableTemporary) return false; | ||||
| if ((required_mode & eModifierMode_Editmode) && !(mti->flags & eModifierTypeFlag_SupportsEditmode)) return false; | if ((required_mode & eModifierMode_Editmode) && !(mti->flags & eModifierTypeFlag_SupportsEditmode)) return false; | ||||
| return true; | return true; | ||||
| } | } | ||||
| CDMaskLink *modifiers_calcDataMasks(struct Scene *scene, Object *ob, ModifierData *md, | CDMaskLink *modifiers_calcDataMasks(struct Scene *scene, Object *ob, ModifierData *md, | ||||
| CustomDataMask dataMask, int required_mode, | const CustomData_MeshMasks *dataMask, int required_mode, | ||||
| ModifierData *previewmd, CustomDataMask previewmask) | ModifierData *previewmd, const CustomData_MeshMasks *previewmask) | ||||
| { | { | ||||
| CDMaskLink *dataMasks = NULL; | CDMaskLink *dataMasks = NULL; | ||||
| CDMaskLink *curr, *prev; | CDMaskLink *curr, *prev; | ||||
| /* build a list of modifier data requirements in reverse order */ | /* build a list of modifier data requirements in reverse order */ | ||||
| for (; md; md = md->next) { | for (; md; md = md->next) { | ||||
| const ModifierTypeInfo *mti = modifierType_getInfo(md->type); | const ModifierTypeInfo *mti = modifierType_getInfo(md->type); | ||||
| curr = MEM_callocN(sizeof(CDMaskLink), "CDMaskLink"); | curr = MEM_callocN(sizeof(CDMaskLink), "CDMaskLink"); | ||||
| if (modifier_isEnabled(scene, md, required_mode)) { | if (modifier_isEnabled(scene, md, required_mode)) { | ||||
| if (mti->requiredDataMask) | if (mti->requiredDataMask) | ||||
| curr->mask = mti->requiredDataMask(ob, md); | mti->requiredDataMask(ob, md, &curr->mask); | ||||
| if (previewmd == md) { | if (previewmd == md && previewmask != NULL) { | ||||
| curr->mask |= previewmask; | CustomData_MeshMasks_update(&curr->mask, previewmask); | ||||
| } | } | ||||
| } | } | ||||
| /* prepend new datamask */ | /* prepend new datamask */ | ||||
| curr->next = dataMasks; | curr->next = dataMasks; | ||||
| dataMasks = curr; | dataMasks = curr; | ||||
| } | } | ||||
| /* build the list of required data masks - each mask in the list must | /* build the list of required data masks - each mask in the list must | ||||
| * include all elements of the masks that follow it | * include all elements of the masks that follow it | ||||
| * | * | ||||
| * note the list is currently in reverse order, so "masks that follow it" | * note the list is currently in reverse order, so "masks that follow it" | ||||
| * actually means "masks that precede it" at the moment | * actually means "masks that precede it" at the moment | ||||
| */ | */ | ||||
| for (curr = dataMasks, prev = NULL; curr; prev = curr, curr = curr->next) { | for (curr = dataMasks, prev = NULL; curr; prev = curr, curr = curr->next) { | ||||
| if (prev) { | if (prev) { | ||||
| CustomDataMask prev_mask = prev->mask; | CustomData_MeshMasks_update(&curr->mask, &prev->mask); | ||||
| CustomDataMask curr_mask = curr->mask; | |||||
| curr->mask = curr_mask | prev_mask; | |||||
| } | } | ||||
| else { | else { | ||||
| CustomDataMask curr_mask = curr->mask; | CustomData_MeshMasks_update(&curr->mask, dataMask); | ||||
| curr->mask = curr_mask | dataMask; | |||||
| } | } | ||||
| } | } | ||||
| /* reverse the list so it's in the correct order */ | /* reverse the list so it's in the correct order */ | ||||
| BLI_linklist_reverse((LinkNode **)&dataMasks); | BLI_linklist_reverse((LinkNode **)&dataMasks); | ||||
| return dataMasks; | return dataMasks; | ||||
| } | } | ||||
| ▲ Show 20 Lines • Show All 340 Lines • ▼ Show 20 Lines | struct DerivedMesh *modifier_applyModifier_DM_deprecated( | ||||
| struct DerivedMesh *dm) | struct DerivedMesh *dm) | ||||
| { | { | ||||
| const ModifierTypeInfo *mti = modifierType_getInfo(md->type); | const ModifierTypeInfo *mti = modifierType_getInfo(md->type); | ||||
| /* TODO(sybren): deduplicate all the copies of this code in this file. */ | /* TODO(sybren): deduplicate all the copies of this code in this file. */ | ||||
| Mesh *mesh = NULL; | Mesh *mesh = NULL; | ||||
| if (dm != NULL) { | if (dm != NULL) { | ||||
| mesh = BKE_id_new_nomain(ID_ME, NULL); | mesh = BKE_id_new_nomain(ID_ME, NULL); | ||||
| DM_to_mesh(dm, mesh, ctx->object, CD_MASK_EVERYTHING, false); | DM_to_mesh(dm, mesh, ctx->object, &CD_MASK_EVERYTHING, false); | ||||
| } | } | ||||
| struct Mesh *new_mesh = mti->applyModifier(md, ctx, mesh); | struct Mesh *new_mesh = mti->applyModifier(md, ctx, mesh); | ||||
| /* Make a DM that doesn't reference new_mesh so we can free the latter. */ | /* Make a DM that doesn't reference new_mesh so we can free the latter. */ | ||||
| DerivedMesh *ndm = CDDM_from_mesh_ex(new_mesh, CD_DUPLICATE, CD_MASK_EVERYTHING); | DerivedMesh *ndm = CDDM_from_mesh_ex(new_mesh, CD_DUPLICATE, &CD_MASK_EVERYTHING); | ||||
| if (new_mesh != mesh) { | if (new_mesh != mesh) { | ||||
| BKE_id_free(NULL, new_mesh); | BKE_id_free(NULL, new_mesh); | ||||
| } | } | ||||
| if (mesh != NULL) { | if (mesh != NULL) { | ||||
| BKE_id_free(NULL, mesh); | BKE_id_free(NULL, mesh); | ||||
| } | } | ||||
| Show All 30 Lines | |||||