forked from bartvdbraak/blender
move object re-linking into a function.
This commit is contained in:
parent
d8e6dd705f
commit
8b6b5341a5
@ -143,6 +143,8 @@ void object_camera_matrix(
|
||||
float winmat[][4], struct rctf *viewplane, float *clipsta, float *clipend, float *lens, float *ycor,
|
||||
float *viewdx, float *viewdy);
|
||||
|
||||
void object_relink(struct Object *ob);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
@ -3082,3 +3082,32 @@ int object_is_modified(Scene *scene, Object *ob)
|
||||
|
||||
return flag;
|
||||
}
|
||||
|
||||
static void copy_object__forwardModifierLinks(void *UNUSED(userData), Object *UNUSED(ob), ID **idpoin)
|
||||
{
|
||||
/* this is copied from ID_NEW; it might be better to have a macro */
|
||||
if(*idpoin && (*idpoin)->newid) *idpoin = (*idpoin)->newid;
|
||||
}
|
||||
|
||||
void object_relink(Object *ob)
|
||||
{
|
||||
if(ob->id.lib)
|
||||
return;
|
||||
|
||||
relink_constraints(&ob->constraints);
|
||||
if (ob->pose){
|
||||
bPoseChannel *chan;
|
||||
for (chan = ob->pose->chanbase.first; chan; chan=chan->next){
|
||||
relink_constraints(&chan->constraints);
|
||||
}
|
||||
}
|
||||
modifiers_foreachIDLink(ob, copy_object__forwardModifierLinks, NULL);
|
||||
|
||||
if(ob->adt)
|
||||
BKE_relink_animdata(ob->adt);
|
||||
|
||||
ID_NEW(ob->parent);
|
||||
|
||||
ID_NEW(ob->proxy);
|
||||
ID_NEW(ob->proxy_group);
|
||||
}
|
||||
|
@ -843,13 +843,6 @@ void OBJECT_OT_delete(wmOperatorType *ot)
|
||||
|
||||
/**************************** Copy Utilities ******************************/
|
||||
|
||||
static void copy_object__forwardModifierLinks(void *UNUSED(userData), Object *UNUSED(ob),
|
||||
ID **idpoin)
|
||||
{
|
||||
/* this is copied from ID_NEW; it might be better to have a macro */
|
||||
if(*idpoin && (*idpoin)->newid) *idpoin = (*idpoin)->newid;
|
||||
}
|
||||
|
||||
/* after copying objects, copied data should get new pointers */
|
||||
static void copy_object_set_idnew(bContext *C, int dupflag)
|
||||
{
|
||||
@ -860,21 +853,7 @@ static void copy_object_set_idnew(bContext *C, int dupflag)
|
||||
|
||||
/* XXX check object pointers */
|
||||
CTX_DATA_BEGIN(C, Object*, ob, selected_editable_objects) {
|
||||
relink_constraints(&ob->constraints);
|
||||
if (ob->pose){
|
||||
bPoseChannel *chan;
|
||||
for (chan = ob->pose->chanbase.first; chan; chan=chan->next){
|
||||
relink_constraints(&chan->constraints);
|
||||
}
|
||||
}
|
||||
modifiers_foreachIDLink(ob, copy_object__forwardModifierLinks, NULL);
|
||||
|
||||
if(ob->adt)
|
||||
BKE_relink_animdata(ob->adt);
|
||||
|
||||
ID_NEW(ob->parent);
|
||||
ID_NEW(ob->proxy);
|
||||
ID_NEW(ob->proxy_group);
|
||||
object_relink(ob);
|
||||
}
|
||||
CTX_DATA_END;
|
||||
|
||||
|
@ -1366,11 +1366,6 @@ void OBJECT_OT_make_links_data(wmOperatorType *ot)
|
||||
|
||||
/**************************** Make Single User ********************************/
|
||||
|
||||
static void single_object_users__forwardModifierLinks(void *UNUSED(userData), Object *UNUSED(ob), Object **obpoin)
|
||||
{
|
||||
ID_NEW(*obpoin);
|
||||
}
|
||||
|
||||
static void single_object_users(Scene *scene, View3D *v3d, int flag)
|
||||
{
|
||||
Base *base;
|
||||
@ -1402,22 +1397,7 @@ static void single_object_users(Scene *scene, View3D *v3d, int flag)
|
||||
|
||||
/* object pointers */
|
||||
for(base= FIRSTBASE; base; base= base->next) {
|
||||
ob= base->object;
|
||||
if(ob->id.lib==NULL) {
|
||||
relink_constraints(&base->object->constraints);
|
||||
if (base->object->pose){
|
||||
bPoseChannel *chan;
|
||||
for (chan = base->object->pose->chanbase.first; chan; chan=chan->next){
|
||||
relink_constraints(&chan->constraints);
|
||||
}
|
||||
}
|
||||
modifiers_foreachObjectLink(base->object, single_object_users__forwardModifierLinks, NULL);
|
||||
|
||||
if(ob->adt)
|
||||
BKE_relink_animdata(ob->adt);
|
||||
|
||||
ID_NEW(ob->parent);
|
||||
}
|
||||
object_relink(base->object);
|
||||
}
|
||||
|
||||
set_sca_new_poins();
|
||||
|
Loading…
Reference in New Issue
Block a user