def _create_material_instances(self, importer): _LOG.enter() blender = importer["blender_entities"] ui = importer["settings_from_ui"] derived = importer["derived_settings"] if not ui["extra_vertex_groups"]: _LOG.debug("Skipping instances since we haven't created extra vertex groups") return if not ui["material_instances"]: _LOG.debug("Skipping instances since it is disabled") return if ui["skin_material_type"] == "PLAIN": _LOG.debug("Skipping instances since material type is PLAIN") return base_material = None bodyproxy = None if derived["has_body_proxy"] and "bodyproxy" in blender: bodyproxy = blender["bodyproxy"] basemesh = None if "basemesh" in blender: basemesh = blender["basemesh"] if not bodyproxy and not basemesh: _LOG.debug("Skipping instances since neither basemesh nor proxy is available") return if basemesh: base_material = MaterialService.get_material(basemesh) else: if bodyproxy: base_material = MaterialService.get_material(bodyproxy) if not base_material: _LOG.error("Skipping instances since no base material could be found. This should not have happened.") return for group_name in ["nipple", "lips", "fingernails", "toenails", "ears", "genitals"]: _LOG.debug("About to create material instance for", group_name) material_instance = base_material.copy() material_instance.name = derived["prefix"] + group_name if basemesh and ObjectService.has_vertex_group(basemesh, group_name): self._assign_material_instance(importer, basemesh, material_instance, group_name) if bodyproxy and ObjectService.has_vertex_group(bodyproxy, group_name): self._assign_material_instance(importer, bodyproxy, material_instance, group_name)
def _assign_material_instance(self, importer, blender_object, material, group_name): _LOG.enter() _LOG.debug("blender_object, material, group_name", (blender_object, material, group_name)) if not ObjectService.has_vertex_group(blender_object, group_name): return ObjectService.activate_blender_object(blender_object) bpy.ops.object.mode_set(mode='OBJECT', toggle=False) blender_object.data.materials.append(material) slot_number = blender_object.material_slots.find(material.name) _LOG.dump("slot_number", slot_number) bpy.context.object.active_material_index = slot_number bpy.ops.object.mode_set(mode='EDIT', toggle=False) bpy.ops.mesh.select_all(action='DESELECT') bpy.ops.object.vertex_group_set_active(group=group_name) bpy.ops.object.vertex_group_select() bpy.ops.object.material_slot_assign() bpy.ops.object.mode_set(mode='OBJECT', toggle=False)