Fix T45695: Assigning material reverts MaterialSlot.link
Setting the material was resetting the link bit, this is OK from the UI, confusing for scripts.
This commit is contained in:
parent
fa4172c28c
commit
be1a684755
Notes:
blender-bot
2023-02-14 08:47:34 +01:00
Referenced by issue #60014, PreferencesEdit.material_link not respected Referenced by issue #45695, material_slots[i].link reverts to 'DATA' after material_slots[i].material = m0
|
@ -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
|
||||
|
|
|
@ -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 */
|
||||
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Reference in New Issue