diff --git a/source/blender/blenkernel/intern/object.c b/source/blender/blenkernel/intern/object.c index 5029ac458ab..7a5385def17 100644 --- a/source/blender/blenkernel/intern/object.c +++ b/source/blender/blenkernel/intern/object.c @@ -113,6 +113,8 @@ #include "BPY_extern.h" +#include "blendef.h" + /* Local function protos */ static void solve_parenting (Object *ob, Object *par, float obmat[][4], float slowmat[][4], int simul); @@ -1351,11 +1353,29 @@ void object_make_proxy(Object *ob, Object *target, Object *gob) /* skip constraints, constraintchannels, nla? */ - + /* set object type and link to data */ ob->type= target->type; ob->data= target->data; id_us_plus((ID *)ob->data); /* ensures lib data becomes LIB_EXTERN */ + /* copy material and index information */ + ob->actcol= ob->totcol= 0; + if(ob->mat) MEM_freeN(ob->mat); + ob->mat = NULL; + if ((target->totcol) && (target->mat) && OB_SUPPORT_MATERIAL(ob)) { + int i; + ob->colbits = target->colbits; + + ob->actcol= target->actcol; + ob->totcol= target->totcol; + + ob->mat = MEM_dupallocN(target->mat); + for(i=0; itotcol; i++) { + /* dont need to run test_object_materials since we know this object is new and not used elsewhere */ + id_us_plus(ob->mat[i]); + } + } + /* type conversions */ if(target->type == OB_ARMATURE) { copy_object_pose(ob, target); /* data copy, object pointers in constraints */ diff --git a/source/blender/include/blendef.h b/source/blender/include/blendef.h index beabe2df4b0..93e3aaf03dd 100644 --- a/source/blender/include/blendef.h +++ b/source/blender/include/blendef.h @@ -101,6 +101,7 @@ #define LASTBASE G.scene->base.last #define BASACT (G.scene->basact) #define OBACT (BASACT? BASACT->object: 0) +#define OB_SUPPORT_MATERIAL(ob) ELEM5(ob->type, OB_MESH, OB_CURVE, OB_SURF, OB_FONT, OB_MBALL) #define ID_NEW(a) if( (a) && (a)->id.newid ) (a)= (void *)(a)->id.newid #define ID_NEW_US(a) if( (a)->id.newid) {(a)= (void *)(a)->id.newid; (a)->id.us++;} #define ID_NEW_US2(a) if( ((ID *)a)->newid) {(a)= ((ID *)a)->newid; ((ID *)a)->us++;} diff --git a/source/blender/src/buttons_editing.c b/source/blender/src/buttons_editing.c index dad5b12f421..f1c356a0a77 100644 --- a/source/blender/src/buttons_editing.c +++ b/source/blender/src/buttons_editing.c @@ -5414,8 +5414,7 @@ static void editing_panel_links(Object *ob) } /* now only objects that can be visible rendered */ - if ELEM5(ob->type, OB_MESH, OB_CURVE, OB_SURF, OB_FONT, OB_MBALL); - else return; + if (!OB_SUPPORT_MATERIAL(ob)) return; uiSetButLock(object_data_is_libdata(ob), ERROR_LIBDATA_MESSAGE); give_obdata_texspace(ob, &poin, NULL, NULL, NULL); diff --git a/source/blender/src/editobject.c b/source/blender/src/editobject.c index 8ae5764eb09..cd8038e5c6e 100644 --- a/source/blender/src/editobject.c +++ b/source/blender/src/editobject.c @@ -3675,7 +3675,7 @@ void copy_attr_menu() strcat (str, "|Object Constraints%x22"); strcat (str, "|NLA Strips%x26"); - if ELEM5(ob->type, OB_MESH, OB_CURVE, OB_SURF, OB_FONT, OB_MBALL) { + if (OB_SUPPORT_MATERIAL(ob)) { strcat(str, "|Texture Space%x17"); }