diff options
author | Tamito Kajiyama <rd6t-kjym@asahi-net.or.jp> | 2012-08-18 19:20:35 +0400 |
---|---|---|
committer | Tamito Kajiyama <rd6t-kjym@asahi-net.or.jp> | 2012-08-18 19:20:35 +0400 |
commit | 22b30da565de53a0a1d34079d72b08fdb54ec8e3 (patch) | |
tree | 3961db6cd06907f41ca64a8ddff92baa36d318aa /source/blender/blenkernel/intern/material.c | |
parent | 44e4c5f8316b34835c7900dc649bf8a1570afc0a (diff) | |
parent | e982e9b04f13be046d194643ed28aaedd6181f3b (diff) |
Merged changes in the trunk up to revision 49986.
Diffstat (limited to 'source/blender/blenkernel/intern/material.c')
-rw-r--r-- | source/blender/blenkernel/intern/material.c | 48 |
1 files changed, 37 insertions, 11 deletions
diff --git a/source/blender/blenkernel/intern/material.c b/source/blender/blenkernel/intern/material.c index ad9aa8c9cb1..936aac9726d 100644 --- a/source/blender/blenkernel/intern/material.c +++ b/source/blender/blenkernel/intern/material.c @@ -495,6 +495,9 @@ short *give_totcolp(Object *ob) /* same as above but for ID's */ Material ***give_matarar_id(ID *id) { + /* ensure we don't try get materials from non-obdata */ + BLI_assert(OB_DATA_SUPPORT_ID(GS(id->name))); + switch (GS(id->name)) { case ID_ME: return &(((Mesh *)id)->mat); @@ -511,6 +514,9 @@ Material ***give_matarar_id(ID *id) short *give_totcolp_id(ID *id) { + /* ensure we don't try get materials from non-obdata */ + BLI_assert(OB_DATA_SUPPORT_ID(GS(id->name))); + switch (GS(id->name)) { case ID_ME: return &(((Mesh *)id)->totcol); @@ -527,6 +533,9 @@ short *give_totcolp_id(ID *id) static void data_delete_material_index_id(ID *id, short index) { + /* ensure we don't try get materials from non-obdata */ + BLI_assert(OB_DATA_SUPPORT_ID(GS(id->name))); + switch (GS(id->name)) { case ID_ME: BKE_mesh_delete_material_index((Mesh *)id, index); @@ -766,11 +775,12 @@ void assign_material_id(ID *id, Material *ma, short act) test_object_materials(id); } -void assign_material(Object *ob, Material *ma, short act) +void assign_material(Object *ob, Material *ma, short act, int assign_type) { Material *mao, **matar, ***matarar; char *matbits; short *totcolp; + char bit = 0; if (act > MAXMAT) return; if (act < 1) act = 1; @@ -797,8 +807,29 @@ void assign_material(Object *ob, Material *ma, short act) *matarar = matar; *totcolp = act; } - + + // Determine the object/mesh linking + if (assign_type == BKE_MAT_ASSIGN_USERPREF && ob->totcol && ob->actcol) { + /* copy from previous material */ + bit = ob->matbits[ob->actcol - 1]; + } + else { + switch (assign_type) { + case BKE_MAT_ASSIGN_OBDATA: + bit = 0; + break; + case BKE_MAT_ASSIGN_OBJECT: + bit = 1; + break; + case BKE_MAT_ASSIGN_USERPREF: + default: + bit = (U.flag & USER_MAT_ON_OB) ? 1 : 0; + break; + } + } + if (act > ob->totcol) { + /* Need more space in the material arrays */ matar = MEM_callocN(sizeof(void *) * act, "matarray2"); matbits = MEM_callocN(sizeof(char) * act, "matbits1"); if (ob->totcol) { @@ -810,17 +841,12 @@ void assign_material(Object *ob, Material *ma, short act) ob->mat = matar; ob->matbits = matbits; ob->totcol = act; - - /* copy object/mesh linking, or assign based on userpref */ - if (ob->actcol) - ob->matbits[act - 1] = ob->matbits[ob->actcol - 1]; - else - ob->matbits[act - 1] = (U.flag & USER_MAT_ON_OB) ? 1 : 0; } /* do it */ - if (ob->matbits[act - 1]) { /* in object */ + ob->matbits[act - 1] = bit; + if (bit == 1) { /* in object */ mao = ob->mat[act - 1]; if (mao) mao->id.us--; ob->mat[act - 1] = ma; @@ -846,7 +872,7 @@ void assign_matarar(struct Object *ob, struct Material ***matar, short totcol) /* now we have the right number of slots */ for (i = 0; i < totcol; i++) - assign_material(ob, (*matar)[i], i + 1); + assign_material(ob, (*matar)[i], i + 1, BKE_MAT_ASSIGN_USERPREF); if (actcol_orig > ob->totcol) actcol_orig = ob->totcol; @@ -880,7 +906,7 @@ int object_add_material_slot(Object *ob) if (ob == NULL) return FALSE; if (ob->totcol >= MAXMAT) return FALSE; - assign_material(ob, NULL, ob->totcol + 1); + assign_material(ob, NULL, ob->totcol + 1, BKE_MAT_ASSIGN_USERPREF); ob->actcol = ob->totcol; return TRUE; } |