Changeset View
Changeset View
Standalone View
Standalone View
source/blender/editors/object/object_relations.c
| Show First 20 Lines • Show All 70 Lines • ▼ Show 20 Lines | |||||
| #include "BKE_DerivedMesh.h" | #include "BKE_DerivedMesh.h" | ||||
| #include "BKE_displist.h" | #include "BKE_displist.h" | ||||
| #include "BKE_global.h" | #include "BKE_global.h" | ||||
| #include "BKE_group.h" | #include "BKE_group.h" | ||||
| #include "BKE_fcurve.h" | #include "BKE_fcurve.h" | ||||
| #include "BKE_lamp.h" | #include "BKE_lamp.h" | ||||
| #include "BKE_lattice.h" | #include "BKE_lattice.h" | ||||
| #include "BKE_library.h" | #include "BKE_library.h" | ||||
| #include "BKE_library_query.h" | |||||
| #include "BKE_main.h" | #include "BKE_main.h" | ||||
| #include "BKE_material.h" | #include "BKE_material.h" | ||||
| #include "BKE_mball.h" | #include "BKE_mball.h" | ||||
| #include "BKE_mesh.h" | #include "BKE_mesh.h" | ||||
| #include "BKE_modifier.h" | #include "BKE_modifier.h" | ||||
| #include "BKE_object.h" | #include "BKE_object.h" | ||||
| #include "BKE_report.h" | #include "BKE_report.h" | ||||
| #include "BKE_sca.h" | #include "BKE_sca.h" | ||||
| ▲ Show 20 Lines • Show All 1,988 Lines • ▼ Show 20 Lines | |||||
| enum { | enum { | ||||
| MAKE_LOCAL_SELECT_OB, | MAKE_LOCAL_SELECT_OB, | ||||
| MAKE_LOCAL_SELECT_OBDATA, | MAKE_LOCAL_SELECT_OBDATA, | ||||
| MAKE_LOCAL_SELECT_OBDATA_MATERIAL, | MAKE_LOCAL_SELECT_OBDATA_MATERIAL, | ||||
| MAKE_LOCAL_ALL | MAKE_LOCAL_ALL | ||||
| }; | }; | ||||
| static void tag_localizable_looper(void *UNUSED(user_data), ID **id_pointer) | |||||
| { | |||||
| (*id_pointer)->flag &= ~LIB_DOIT; | |||||
| } | |||||
| static void tag_localizable_objects(bContext *C, int mode) | |||||
| { | |||||
| Main *bmain = CTX_data_main(C); | |||||
| Object *object; | |||||
| BKE_main_id_tag_all(bmain, false); | |||||
| /* Set LIB_DOIT flag for all selected objects, so next we can check whether | |||||
| * object is gonna to become local or not. | |||||
| */ | |||||
| CTX_DATA_BEGIN (C, Object *, object, selected_objects) | |||||
| { | |||||
| object->id.flag |= LIB_DOIT; | |||||
| /* If data is also gonna to become local, mark data we're interested in | |||||
| * as gonna-to-be-local. | |||||
| */ | |||||
| if (mode == MAKE_LOCAL_SELECT_OBDATA) { | |||||
| ID *data_id = (ID *) object->data; | |||||
| data_id->flag |= LIB_DOIT; | |||||
| } | |||||
| } | |||||
| CTX_DATA_END; | |||||
| /* Also forbid making objects local if other library objects are using | |||||
| * them for modifiers or constraints. | |||||
| */ | |||||
| for (object = bmain->object.first; object; object = object->id.next) { | |||||
| if ((object->id.flag & LIB_DOIT) == 0) { | |||||
| BKE_library_foreach_ID_link(&object->id, tag_localizable_looper, NULL, ID_FOREACH_READONLY); | |||||
| } | |||||
| if (object->data) { | |||||
| ID *data_id = (ID *) object->data; | |||||
| if ((data_id->flag & LIB_DOIT) == 0) { | |||||
| BKE_library_foreach_ID_link(data_id, tag_localizable_looper, NULL, ID_FOREACH_READONLY); | |||||
| } | |||||
| } | |||||
| } | |||||
| /* TODO(sergey): Drivers targets? */ | |||||
| } | |||||
| static int make_local_exec(bContext *C, wmOperator *op) | static int make_local_exec(bContext *C, wmOperator *op) | ||||
| { | { | ||||
| Main *bmain = CTX_data_main(C); | Main *bmain = CTX_data_main(C); | ||||
| AnimData *adt; | AnimData *adt; | ||||
| ParticleSystem *psys; | ParticleSystem *psys; | ||||
| Material *ma, ***matarar; | Material *ma, ***matarar; | ||||
| Lamp *la; | Lamp *la; | ||||
| ID *id; | ID *id; | ||||
| int a, b, mode = RNA_enum_get(op->ptr, "type"); | int a, b, mode = RNA_enum_get(op->ptr, "type"); | ||||
| if (mode == MAKE_LOCAL_ALL) { | if (mode == MAKE_LOCAL_ALL) { | ||||
| BKE_library_make_local(bmain, NULL, false); /* NULL is all libs */ | BKE_library_make_local(bmain, NULL, false); /* NULL is all libs */ | ||||
| WM_event_add_notifier(C, NC_WINDOW, NULL); | WM_event_add_notifier(C, NC_WINDOW, NULL); | ||||
| return OPERATOR_FINISHED; | return OPERATOR_FINISHED; | ||||
| } | } | ||||
| tag_localizable_objects(C, mode); | |||||
| BKE_main_id_clear_newpoins(bmain); | BKE_main_id_clear_newpoins(bmain); | ||||
| CTX_DATA_BEGIN (C, Object *, ob, selected_objects) | CTX_DATA_BEGIN (C, Object *, ob, selected_objects) | ||||
| { | { | ||||
| if ((ob->id.flag & LIB_DOIT) == 0) { | |||||
| continue; | |||||
| } | |||||
| if (ob->id.lib) | if (ob->id.lib) | ||||
| id_make_local(&ob->id, false); | id_make_local(&ob->id, false); | ||||
| } | } | ||||
| CTX_DATA_END; | CTX_DATA_END; | ||||
| /* maybe object pointers */ | /* maybe object pointers */ | ||||
| CTX_DATA_BEGIN (C, Object *, ob, selected_objects) | CTX_DATA_BEGIN (C, Object *, ob, selected_objects) | ||||
| { | { | ||||
| if (ob->id.lib == NULL) { | if (ob->id.lib == NULL) { | ||||
| ID_NEW(ob->parent); | ID_NEW(ob->parent); | ||||
| } | } | ||||
| } | } | ||||
| CTX_DATA_END; | CTX_DATA_END; | ||||
| CTX_DATA_BEGIN (C, Object *, ob, selected_objects) | CTX_DATA_BEGIN (C, Object *, ob, selected_objects) | ||||
| { | { | ||||
| if ((ob->id.flag & LIB_DOIT) == 0) { | |||||
| continue; | |||||
| } | |||||
| id = ob->data; | id = ob->data; | ||||
| if (id && (ELEM(mode, MAKE_LOCAL_SELECT_OBDATA, MAKE_LOCAL_SELECT_OBDATA_MATERIAL))) { | if (id && (ELEM(mode, MAKE_LOCAL_SELECT_OBDATA, MAKE_LOCAL_SELECT_OBDATA_MATERIAL))) { | ||||
| id_make_local(id, false); | id_make_local(id, false); | ||||
| adt = BKE_animdata_from_id(id); | adt = BKE_animdata_from_id(id); | ||||
| if (adt) BKE_animdata_make_local(adt); | if (adt) BKE_animdata_make_local(adt); | ||||
| /* tag indirect data direct */ | /* tag indirect data direct */ | ||||
| Show All 13 Lines | CTX_DATA_BEGIN (C, Object *, ob, selected_objects) | ||||
| adt = BKE_animdata_from_id(&ob->id); | adt = BKE_animdata_from_id(&ob->id); | ||||
| if (adt) BKE_animdata_make_local(adt); | if (adt) BKE_animdata_make_local(adt); | ||||
| } | } | ||||
| CTX_DATA_END; | CTX_DATA_END; | ||||
| if (mode == MAKE_LOCAL_SELECT_OBDATA_MATERIAL) { | if (mode == MAKE_LOCAL_SELECT_OBDATA_MATERIAL) { | ||||
| CTX_DATA_BEGIN (C, Object *, ob, selected_objects) | CTX_DATA_BEGIN (C, Object *, ob, selected_objects) | ||||
| { | { | ||||
| if ((ob->id.flag & LIB_DOIT) == 0) { | |||||
| continue; | |||||
| } | |||||
| if (ob->type == OB_LAMP) { | if (ob->type == OB_LAMP) { | ||||
| la = ob->data; | la = ob->data; | ||||
| for (b = 0; b < MAX_MTEX; b++) | for (b = 0; b < MAX_MTEX; b++) | ||||
| if (la->mtex[b] && la->mtex[b]->tex) | if (la->mtex[b] && la->mtex[b]->tex) | ||||
| id_make_local(&la->mtex[b]->tex->id, false); | id_make_local(&la->mtex[b]->tex->id, false); | ||||
| } | } | ||||
| else { | else { | ||||
| ▲ Show 20 Lines • Show All 157 Lines • Show Last 20 Lines | |||||