示例#1
0
文件: mball.c 项目: mcgrathd/blender
void BKE_mball_make_local(MetaBall *mb)
{
    Main *bmain = G.main;
    Object *ob;
    bool is_local = false, is_lib = false;

    /* - only lib users: do nothing
     * - only local users: set flag
     * - mixed: make copy
     */

    if (mb->id.lib == NULL) return;
    if (mb->id.us == 1) {
        id_clear_lib_data(bmain, &mb->id);
        extern_local_mball(mb);

        return;
    }

    for (ob = G.main->object.first; ob && ELEM(0, is_lib, is_local); ob = ob->id.next) {
        if (ob->data == mb) {
            if (ob->id.lib) is_lib = true;
            else is_local = true;
        }
    }

    if (is_local && is_lib == false) {
        id_clear_lib_data(bmain, &mb->id);
        extern_local_mball(mb);
    }
    else if (is_local && is_lib) {
        MetaBall *mb_new = BKE_mball_copy(mb);
        mb_new->id.us = 0;

        /* Remap paths of new ID using old library as base. */
        BKE_id_lib_local_paths(bmain, mb->id.lib, &mb_new->id);

        for (ob = G.main->object.first; ob; ob = ob->id.next) {
            if (ob->data == mb) {
                if (ob->id.lib == NULL) {
                    ob->data = mb_new;
                    mb_new->id.us++;
                    mb->id.us--;
                }
            }
        }
    }
}
示例#2
0
int id_copy(ID *id, ID **newid, int test)
{
    if (!test) *newid = NULL;

    /* conventions:
     * - make shallow copy, only this ID block
     * - id.us of the new ID is set to 1 */
    switch (GS(id->name)) {
    case ID_SCE:
        return 0; /* can't be copied from here */
    case ID_LI:
        return 0; /* can't be copied from here */
    case ID_OB:
        if (!test) *newid = (ID *)BKE_object_copy((Object *)id);
        return 1;
    case ID_ME:
        if (!test) *newid = (ID *)BKE_mesh_copy((Mesh *)id);
        return 1;
    case ID_CU:
        if (!test) *newid = (ID *)BKE_curve_copy((Curve *)id);
        return 1;
    case ID_MB:
        if (!test) *newid = (ID *)BKE_mball_copy((MetaBall *)id);
        return 1;
    case ID_MA:
        if (!test) *newid = (ID *)BKE_material_copy((Material *)id);
        return 1;
    case ID_TE:
        if (!test) *newid = (ID *)BKE_texture_copy((Tex *)id);
        return 1;
    case ID_IM:
        if (!test) *newid = (ID *)BKE_image_copy((Image *)id);
        return 1;
    case ID_LT:
        if (!test) *newid = (ID *)BKE_lattice_copy((Lattice *)id);
        return 1;
    case ID_LA:
        if (!test) *newid = (ID *)BKE_lamp_copy((Lamp *)id);
        return 1;
    case ID_SPK:
        if (!test) *newid = (ID *)BKE_speaker_copy((Speaker *)id);
        return 1;
    case ID_CA:
        if (!test) *newid = (ID *)BKE_camera_copy((Camera *)id);
        return 1;
    case ID_IP:
        return 0; /* deprecated */
    case ID_KE:
        if (!test) *newid = (ID *)BKE_key_copy((Key *)id);
        return 1;
    case ID_WO:
        if (!test) *newid = (ID *)BKE_world_copy((World *)id);
        return 1;
    case ID_SCR:
        return 0; /* can't be copied from here */
    case ID_VF:
        return 0; /* not implemented */
    case ID_TXT:
        if (!test) *newid = (ID *)BKE_text_copy((Text *)id);
        return 1;
    case ID_SCRIPT:
        return 0; /* deprecated */
    case ID_SO:
        return 0; /* not implemented */
    case ID_GR:
        if (!test) *newid = (ID *)BKE_group_copy((Group *)id);
        return 1;
    case ID_AR:
        if (!test) *newid = (ID *)BKE_armature_copy((bArmature *)id);
        return 1;
    case ID_AC:
        if (!test) *newid = (ID *)BKE_action_copy((bAction *)id);
        return 1;
    case ID_NT:
        if (!test) *newid = (ID *)ntreeCopyTree((bNodeTree *)id);
        return 1;
    case ID_BR:
        if (!test) *newid = (ID *)BKE_brush_copy((Brush *)id);
        return 1;
    case ID_PA:
        if (!test) *newid = (ID *)BKE_particlesettings_copy((ParticleSettings *)id);
        return 1;
    case ID_WM:
        return 0; /* can't be copied from here */
    case ID_GD:
        return 0; /* not implemented */
    }

    return 0;
}