bugfix for [#8256] Creating proxy from linked mesh object removes materials
authorCampbell Barton <ideasman42@gmail.com>
Sat, 19 Apr 2008 11:23:50 +0000 (11:23 +0000)
committerCampbell Barton <ideasman42@gmail.com>
Sat, 19 Apr 2008 11:23:50 +0000 (11:23 +0000)
source/blender/blenkernel/intern/object.c
source/blender/include/blendef.h
source/blender/src/buttons_editing.c
source/blender/src/editobject.c

index 5029ac458ab1ba93b32f307705569e21aa1c0652..7a5385def1725186c6e24b7db6cd7acbb788839e 100644 (file)
 
 #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; i<target->totcol; 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 */
index beabe2df4b0482e4726af4a751a85f761c41be7f..93e3aaf03dd401f28d61318a85a622a4614527ef 100644 (file)
 #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++;}
index dad5b12f42183aa53b9db958a9be39ca9e7ca007..f1c356a0a778737460f8c64798dbac9adb4a7393 100644 (file)
@@ -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);
index 8ae5764eb090ec9527d2e380e132a4bd546421b4..cd8038e5c6ec316763b28846e7e8b041ab582234 100644 (file)
@@ -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");
        }