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.
This commit is contained in:
		@@ -374,10 +374,10 @@ static DerivedMesh *ConvertCSGDescriptorsToDerivedMesh(
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// 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 @@ static DerivedMesh *ConvertCSGDescriptorsToDerivedMesh(
 | 
			
		||||
			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;
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user