void make_editLatt(Object *obedit) { Lattice *lt = obedit->data; KeyBlock *actkey; free_editLatt(obedit); actkey = BKE_keyblock_from_object(obedit); if (actkey) BKE_key_convert_to_lattice(actkey, lt); lt->editlatt = MEM_callocN(sizeof(EditLatt), "editlatt"); lt->editlatt->latt = MEM_dupallocN(lt); lt->editlatt->latt->def = MEM_dupallocN(lt->def); if (lt->dvert) { int tot = lt->pntsu * lt->pntsv * lt->pntsw; lt->editlatt->latt->dvert = MEM_mallocN(sizeof(MDeformVert) * tot, "Lattice MDeformVert"); BKE_defvert_array_copy(lt->editlatt->latt->dvert, lt->dvert, tot); } if (lt->key) lt->editlatt->shapenr = obedit->shapenr; }
static bool ED_object_shape_key_remove(Main *bmain, Object *ob) { KeyBlock *kb, *rkb; Key *key; key = BKE_key_from_object(ob); if (key == NULL) return false; kb = BLI_findlink(&key->block, ob->shapenr - 1); if (kb) { for (rkb = key->block.first; rkb; rkb = rkb->next) if (rkb->relative == ob->shapenr - 1) rkb->relative = 0; BLI_remlink(&key->block, kb); key->totkey--; if (key->refkey == kb) { key->refkey = key->block.first; if (key->refkey) { /* apply new basis key on original data */ switch (ob->type) { case OB_MESH: BKE_key_convert_to_mesh(key->refkey, ob->data); break; case OB_CURVE: case OB_SURF: BKE_key_convert_to_curve(key->refkey, ob->data, BKE_curve_nurbs_get(ob->data)); break; case OB_LATTICE: BKE_key_convert_to_lattice(key->refkey, ob->data); break; } } } if (kb->data) MEM_freeN(kb->data); MEM_freeN(kb); if (ob->shapenr > 1) { ob->shapenr--; } } if (key->totkey == 0) { switch (GS(key->from->name)) { case ID_ME: ((Mesh *)key->from)->key = NULL; break; case ID_CU: ((Curve *)key->from)->key = NULL; break; case ID_LT: ((Lattice *)key->from)->key = NULL; break; } BKE_libblock_free_us(bmain, key); } return true; }