Fix T45695: Assigning material reverts MaterialSlot.link
authorCampbell Barton <ideasman42@gmail.com>
Thu, 6 Aug 2015 08:04:13 +0000 (18:04 +1000)
committerCampbell Barton <ideasman42@gmail.com>
Thu, 6 Aug 2015 08:07:44 +0000 (18:07 +1000)
Setting the material was resetting the link bit, this is OK from the UI,
confusing for scripts.

source/blender/blenkernel/BKE_material.h
source/blender/blenkernel/intern/material.c
source/blender/makesrna/intern/rna_object.c

index 0cfa1aeecb539ac8e2fb316ec40bc95be9f26528..bbac607a3fd2cee0e46c9935ad0d76af7ad35da0 100644 (file)
@@ -69,6 +69,8 @@ struct Material ***give_matarar_id(struct ID *id); /* same but for ID's */
 short *give_totcolp_id(struct ID *id);
 
 enum {
+       /* use existing link option */
+       BKE_MAT_ASSIGN_EXISTING,
        BKE_MAT_ASSIGN_USERPREF,
        BKE_MAT_ASSIGN_OBDATA,
        BKE_MAT_ASSIGN_OBJECT
index 283c7a6fc8894f044944ed224d94a0171f537970..dd69de4877fb0c8191bfbde9c648cbee65e268e5 100644 (file)
@@ -879,8 +879,20 @@ void assign_material(Object *ob, Material *ma, short act, int assign_type)
                *totcolp = act;
        }
 
+       if (act > ob->totcol) {
+               /* Need more space in the material arrays */
+               ob->mat = MEM_recallocN_id(ob->mat, sizeof(void *) * act, "matarray2");
+               ob->matbits = MEM_recallocN_id(ob->matbits, sizeof(char) * act, "matbits1");
+               ob->totcol = act;
+       }
+
        /* Determine the object/mesh linking */
-       if (assign_type == BKE_MAT_ASSIGN_USERPREF && ob->totcol && ob->actcol) {
+       if (assign_type == BKE_MAT_ASSIGN_EXISTING) {
+               /* keep existing option (avoid confusion in scripts),
+                * intentionally ignore userpref (default to obdata). */
+               bit = ob->matbits[act - 1];
+       }
+       else if (assign_type == BKE_MAT_ASSIGN_USERPREF && ob->totcol && ob->actcol) {
                /* copy from previous material */
                bit = ob->matbits[ob->actcol - 1];
        }
@@ -898,13 +910,6 @@ void assign_material(Object *ob, Material *ma, short act, int assign_type)
                                break;
                }
        }
-
-       if (act > ob->totcol) {
-               /* Need more space in the material arrays */
-               ob->mat = MEM_recallocN_id(ob->mat, sizeof(void *) * act, "matarray2");
-               ob->matbits = MEM_recallocN_id(ob->matbits, sizeof(char) * act, "matbits1");
-               ob->totcol = act;
-       }
        
        /* do it */
 
index 7e1b0df9ce7d854ee401a4f9a5249dab5da73b37..54f1798b10cd9a23b4685bb5ee1a63e80e2ddf9e 100644 (file)
@@ -710,7 +710,7 @@ static void rna_Object_active_material_set(PointerRNA *ptr, PointerRNA value)
        Object *ob = (Object *)ptr->id.data;
 
        DAG_id_tag_update(value.data, 0);
-       assign_material(ob, value.data, ob->actcol, BKE_MAT_ASSIGN_USERPREF);
+       assign_material(ob, value.data, ob->actcol, BKE_MAT_ASSIGN_EXISTING);
 }
 
 static int rna_Object_active_material_editable(PointerRNA *ptr)
@@ -882,7 +882,7 @@ static void rna_MaterialSlot_material_set(PointerRNA *ptr, PointerRNA value)
        Object *ob = (Object *)ptr->id.data;
        int index = (Material **)ptr->data - ob->mat;
 
-       assign_material(ob, value.data, index + 1, BKE_MAT_ASSIGN_USERPREF);
+       assign_material(ob, value.data, index + 1, BKE_MAT_ASSIGN_EXISTING);
 }
 
 static int rna_MaterialSlot_link_get(PointerRNA *ptr)