diff options
author | Joshua Leung <aligorith@gmail.com> | 2015-12-13 10:33:35 +0300 |
---|---|---|
committer | Joshua Leung <aligorith@gmail.com> | 2015-12-13 10:33:35 +0300 |
commit | ef2aecf2db981b5344e0d14e7f074f1742b0b2f7 (patch) | |
tree | d016e95050f10eda7bc44e1bdfa2f7c4fc0fc024 /source/blender/modifiers/intern/MOD_boolean.c | |
parent | cf8980559fdc2e9731d9229512a554212173ea4f (diff) | |
parent | d9ee88d126ddb59b68d2561694b522a99e4923b6 (diff) |
Merge branch 'master' into GPencil_Editing_Stage3GPencil_Editing_Stage3
Diffstat (limited to 'source/blender/modifiers/intern/MOD_boolean.c')
-rw-r--r-- | source/blender/modifiers/intern/MOD_boolean.c | 37 |
1 files changed, 26 insertions, 11 deletions
diff --git a/source/blender/modifiers/intern/MOD_boolean.c b/source/blender/modifiers/intern/MOD_boolean.c index 57318e44eec..92570263856 100644 --- a/source/blender/modifiers/intern/MOD_boolean.c +++ b/source/blender/modifiers/intern/MOD_boolean.c @@ -54,7 +54,9 @@ #include "MOD_util.h" #ifdef USE_BMESH +#include "BLI_alloca.h" #include "BLI_math_geom.h" +#include "BKE_material.h" #include "MEM_guardedalloc.h" #include "bmesh.h" @@ -238,17 +240,30 @@ static DerivedMesh *applyModifier_bmesh( /* we need face normals because of 'BM_face_split_edgenet' * we could calculate on the fly too (before calling split). */ - float nmat[4][4]; - invert_m4_m4(nmat, omat); - - BMFace *efa; - i = 0; - BM_ITER_MESH (efa, &iter, bm, BM_FACES_OF_MESH) { - mul_transposed_mat3_m4_v3(nmat, efa->no); - normalize_v3(efa->no); - BM_elem_flag_enable(efa, BM_FACE_TAG); /* temp tag to test which side split faces are from */ - if (++i == i_faces_end) { - break; + { + float nmat[4][4]; + invert_m4_m4(nmat, omat); + + const short ob_src_totcol = bmd->object->totcol; + short *material_remap = BLI_array_alloca(material_remap, ob_src_totcol ? ob_src_totcol : 1); + + BKE_material_remap_object_calc(ob, bmd->object, material_remap); + + BMFace *efa; + i = 0; + BM_ITER_MESH (efa, &iter, bm, BM_FACES_OF_MESH) { + mul_transposed_mat3_m4_v3(nmat, efa->no); + normalize_v3(efa->no); + BM_elem_flag_enable(efa, BM_FACE_TAG); /* temp tag to test which side split faces are from */ + + /* remap material */ + if (LIKELY(efa->mat_nr < ob_src_totcol)) { + efa->mat_nr = material_remap[efa->mat_nr]; + } + + if (++i == i_faces_end) { + break; + } } } } |