separate material lost all materials for the new mesh
authorCampbell Barton <ideasman42@gmail.com>
Thu, 8 Oct 2009 09:22:39 +0000 (09:22 +0000)
committerCampbell Barton <ideasman42@gmail.com>
Thu, 8 Oct 2009 09:22:39 +0000 (09:22 +0000)
source/blender/blenkernel/BKE_material.h
source/blender/blenkernel/intern/material.c
source/blender/blenkernel/intern/object.c
source/blender/editors/mesh/editmesh.c

index b6645ef873786ca192cbcfa7df436119d7ae71e1..85316dddedf19e8316c108a5a57e76dcc2d8f755 100644 (file)
@@ -62,8 +62,8 @@ void assign_matarar(struct Object *ob, struct Material ***matar, int totcol);
 
 int find_material_index(struct Object *ob, struct Material *ma);
 
-void object_add_material_slot(struct Object *ob);
-void object_remove_material_slot(struct Object *ob);
+int object_add_material_slot(struct Object *ob);
+int object_remove_material_slot(struct Object *ob);
 
 /* rendering */
 
index b44c59baaca4081e2fd71bf87ae10b30bbf9bebf..c1093c119dc1e72e2bb6605cb3f7a53043522d5c 100644 (file)
@@ -630,8 +630,7 @@ void assign_matarar(struct Object *ob, struct Material ***matar, int totcol)
 {
        int i, actcol_orig= ob->actcol;
 
-       while(ob->totcol)
-               object_remove_material_slot(ob);
+       while(object_remove_material_slot(ob)) {};
 
        /* now we have the right number of slots */
        for(i=0; i<totcol; i++)
@@ -664,17 +663,18 @@ int find_material_index(Object *ob, Material *ma)
        return 0;          
 }
 
-void object_add_material_slot(Object *ob)
+int object_add_material_slot(Object *ob)
 {
        Material *ma;
        
-       if(ob==0) return;
-       if(ob->totcol>=MAXMAT) return;
+       if(ob==0) return FALSE;
+       if(ob->totcol>=MAXMAT) return FALSE;
        
        ma= give_current_material(ob, ob->actcol);
 
        assign_material(ob, ma, ob->totcol+1);
        ob->actcol= ob->totcol;
+       return TRUE;
 }
 
 static void do_init_render_material(Material *ma, int r_mode, float *amb)
@@ -889,7 +889,7 @@ void automatname(Material *ma)
 }
 
 
-void object_remove_material_slot(Object *ob)
+int object_remove_material_slot(Object *ob)
 {
        Material *mao, ***matarar;
        Object *obt;
@@ -898,7 +898,7 @@ void object_remove_material_slot(Object *ob)
        short *totcolp;
        int a, actcol;
        
-       if(ob==NULL || ob->totcol==0) return;
+       if(ob==NULL || ob->totcol==0) return FALSE;
        
        /* take a mesh/curve/mball as starting point, remove 1 index,
         * AND with all objects that share the ob->data
@@ -909,6 +909,8 @@ void object_remove_material_slot(Object *ob)
        totcolp= give_totcolp(ob);
        matarar= give_matarar(ob);
 
+       if(*matarar==NULL) return FALSE;
+
        /* we delete the actcol */
        if(ob->totcol) {
                mao= (*matarar)[ob->actcol-1];
@@ -971,6 +973,8 @@ void object_remove_material_slot(Object *ob)
                }
                freedisplist(&ob->disp);
        }
+
+       return TRUE;
 }
 
 
index 89757533fb81658a9428606174006b183ed1ba93..0b0a7a54c38782ecbb300ed88e0fb0c08f4d0279 100644 (file)
@@ -1233,6 +1233,7 @@ Object *copy_object(Object *ob)
        if(ob->totcol) {
                obn->mat= MEM_dupallocN(ob->mat);
                obn->matbits= MEM_dupallocN(ob->matbits);
+               obn->totcol= ob->totcol;
        }
        
        if(ob->bb) obn->bb= MEM_dupallocN(ob->bb);
index d540151337d563f45681f13d4b1e4ce658bcb00e..1e3105f5c97046230acad65fe70674ab4d98450b 100644 (file)
@@ -1343,6 +1343,7 @@ static int mesh_separate_selected(Scene *scene, Base *editbase)
        
        /* 2 */
        basenew->object->data= menew= add_mesh(me->id.name);    /* empty */
+       assign_matarar(basenew->object, give_matarar(obedit), *give_totcolp(obedit)); /* new in 2.5 */
        me->id.us--;
        make_editMesh(scene, basenew->object);
        emnew= menew->edit_mesh;