示例#1
0
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;
}
示例#2
0
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;
}