Changeset View
Changeset View
Standalone View
Standalone View
source/blender/editors/object/object_relations.c
| Show First 20 Lines • Show All 2,074 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_modifierObjectLooper(void *UNUSED(userdata), Object *UNUSED(object), Object **object_pointer) | |||||
| { | |||||
| if (*object_pointer) { | |||||
| (*object_pointer)->id.flag &= ~LIB_DOIT; | |||||
| } | |||||
| } | |||||
| static void tag_localizable_constraintObjectLooper(bConstraint *UNUSED(con), ID **id_pointer, | |||||
| short UNUSED(isReference), void *UNUSED(userdata)) | |||||
| { | |||||
| if (*id_pointer) { | |||||
| (*id_pointer)->flag &= ~LIB_DOIT; | |||||
| } | |||||
| } | |||||
| static void tag_localizable_objects(bContext *C, int mode) | |||||
| { | |||||
| Main *bmain = CTX_data_main(C); | |||||
| Curve *curve; | |||||
| Object *object; | |||||
| BKE_main_id_tag_idcode(bmain, ID_OB, false); | |||||
| BKE_main_id_tag_idcode(bmain, ID_CU, 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) { | |||||
| if (ELEM(object->type, OB_CURVE, OB_FONT)) { | |||||
| curve = object->data; | |||||
| curve->id.flag |= LIB_DOIT; | |||||
| } | |||||
| } | |||||
| } | |||||
| CTX_DATA_END; | |||||
| /* Forbid making objects local if they're used by object data datablocks | |||||
| * and those datablocks are not gonna to be local. | |||||
| */ | |||||
| for (curve = bmain->curve.first; curve; curve = curve->id.next) { | |||||
| if ((curve->id.flag & LIB_DOIT) == 0) { | |||||
| if (curve->bevobj && curve->bevobj->id.flag & LIB_DOIT) { | |||||
| curve->bevobj->id.flag &= ~LIB_DOIT; | |||||
| } | |||||
| if (curve->taperobj && curve->taperobj->id.flag & LIB_DOIT) { | |||||
| curve->taperobj->id.flag &= ~LIB_DOIT; | |||||
| } | |||||
| } | |||||
| } | |||||
| /* 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) { | |||||
| modifiers_foreachObjectLink(object, tag_localizable_modifierObjectLooper, NULL); | |||||
| BKE_id_loop_constraints(&object->constraints, tag_localizable_constraintObjectLooper, NULL); | |||||
| } | |||||
| } | |||||
| /* 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 | |||||