[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [43739] trunk/blender/source/blender/ modifiers/intern/MOD_boolean_util.c: Fix #30000: Boolean modifier messing up multi material

Sergey Sharybin sergey.vfx at gmail.com
Fri Jan 27 09:04:12 CET 2012


Revision: 43739
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=43739
Author:   nazgul
Date:     2012-01-27 08:04:03 +0000 (Fri, 27 Jan 2012)
Log Message:
-----------
Fix #30000: Boolean modifier messing up multi material

Issue was caused by resetting face's mat_nr to zero if there's no material
map sent to ConvertCSGDescriptorsToDerivedMesh. In case of boolean modifier
we can't use such map because we can't affect on materials present in object.

So the only way which can give reasonable result is:
- Dot change mat_nr for faces from left operand (they should be fine, because
  materials aren't deleting by modifier)
- For faces from right operand check if needed material exists in left operand
  and if so, use it's index as new mat_nr.
- If there are materials in right operand which doesn't exist in left operand,
  they'll be changed to first material from left operand.

Modified Paths:
--------------
    trunk/blender/source/blender/modifiers/intern/MOD_boolean_util.c

Modified: trunk/blender/source/blender/modifiers/intern/MOD_boolean_util.c
===================================================================
--- trunk/blender/source/blender/modifiers/intern/MOD_boolean_util.c	2012-01-27 07:35:57 UTC (rev 43738)
+++ trunk/blender/source/blender/modifiers/intern/MOD_boolean_util.c	2012-01-27 08:04:03 UTC (rev 43739)
@@ -374,10 +374,10 @@
 	}
 
 	// a hash table to remap materials to indices
-	if (mat) {
-		material_hash = BLI_ghash_new(BLI_ghashutil_ptrhash, BLI_ghashutil_ptrcmp, "CSG_mat gh");
+	material_hash = BLI_ghash_new(BLI_ghashutil_ptrhash, BLI_ghashutil_ptrcmp, "CSG_mat gh");
+
+	if (mat)
 		*totmat = 0;
-	}
 
 	origindex_layer = result->getFaceDataArray(result, CD_ORIGINDEX);
 
@@ -422,6 +422,32 @@
 			else
 				mface->mat_nr = GET_INT_FROM_POINTER(BLI_ghash_lookup(material_hash, orig_mat));
 		}
+		else if(orig_mat) {
+			if(orig_ob == ob1) {
+				// No need to change materian index for faces from left operand
+			}
+			else {
+				// for faces from right operand checn if there's needed material in left operand and if it is,
+				// use index of that material, otherwise fallback to first material (material with index=0)
+				if (!BLI_ghash_haskey(material_hash, orig_mat)) {
+					int a;
+
+					mat_nr = 0;
+					for(a = 0; a < ob1->totcol; a++) {
+						if(give_current_material(ob1, a+1) == orig_mat) {
+							mat_nr = a;
+							break;
+						}
+					}
+
+					BLI_ghash_insert(material_hash, orig_mat, SET_INT_IN_POINTER(mat_nr));
+
+					mface->mat_nr = mat_nr;
+				}
+				else
+					mface->mat_nr = GET_INT_FROM_POINTER(BLI_ghash_lookup(material_hash, orig_mat));
+			}
+		}
 		else
 			mface->mat_nr = 0;
 




More information about the Bf-blender-cvs mailing list