def __clean_toon_edge(self, obj): if 'mmd_edge_preview' in obj.modifiers: obj.modifiers.remove(obj.modifiers['mmd_edge_preview']) if 'mmd_edge_preview' in obj.vertex_groups: obj.vertex_groups.remove(obj.vertex_groups['mmd_edge_preview']) FnMaterial.clean_materials(obj, can_remove=lambda m: m and m.name.startswith('mmd_edge.'))
def execute(self, context): obj = context.active_object root = mmd_model.Model.findRoot(obj) rig = mmd_model.Model(root) mmd_root = root.mmd_root morph = mmd_root.material_morphs[mmd_root.active_morph] mat_data = morph.data[morph.active_data] meshObj = rig.findMesh(mat_data.related_mesh) if meshObj is None: self.report({ 'ERROR' }, "The model mesh can't be found") return { 'CANCELLED' } try: work_mat_name = mat_data.material + '_temp' work_mat, base_mat = FnMaterial.swap_materials(meshObj, work_mat_name, mat_data.material) except MaterialNotFoundError: self.report({ 'ERROR' }, "Material not found") return { 'CANCELLED' } base_mmd_mat = base_mat.mmd_material work_mmd_mat = work_mat.mmd_material if mat_data.offset_type == "MULT": try: diffuse_offset = divide_vector_components(work_mmd_mat.diffuse_color, base_mmd_mat.diffuse_color) + [special_division(work_mmd_mat.alpha, base_mmd_mat.alpha)] specular_offset = divide_vector_components(work_mmd_mat.specular_color, base_mmd_mat.specular_color) edge_offset = divide_vector_components(work_mmd_mat.edge_color, base_mmd_mat.edge_color) mat_data.diffuse_color = diffuse_offset mat_data.specular_color = specular_offset mat_data.shininess = special_division(work_mmd_mat.shininess, base_mmd_mat.shininess) mat_data.ambient_color = divide_vector_components(work_mmd_mat.ambient_color, base_mmd_mat.ambient_color) mat_data.edge_color = edge_offset mat_data.edge_weight = special_division(work_mmd_mat.edge_weight, base_mmd_mat.edge_weight) except DivisionError: mat_data.offset_type = "ADD" # If there is any 0 division we automatically switch it to type ADD except ValueError: self.report({ 'ERROR' }, 'An unexpected error happened') # We should stop on our tracks and re-raise the exception raise if mat_data.offset_type == "ADD": diffuse_offset = list(work_mmd_mat.diffuse_color - base_mmd_mat.diffuse_color) + [work_mmd_mat.alpha - base_mmd_mat.alpha] specular_offset = list(work_mmd_mat.specular_color - base_mmd_mat.specular_color) edge_offset = Vector(work_mmd_mat.edge_color) - Vector(base_mmd_mat.edge_color) mat_data.diffuse_color = diffuse_offset mat_data.specular_color = specular_offset mat_data.shininess = work_mmd_mat.shininess - base_mmd_mat.shininess mat_data.ambient_color = work_mmd_mat.ambient_color - base_mmd_mat.ambient_color mat_data.edge_color = list(edge_offset) mat_data.edge_weight = work_mmd_mat.edge_weight - base_mmd_mat.edge_weight FnMaterial.clean_materials(meshObj, can_remove=lambda m: m == work_mat) return { 'FINISHED' }
def execute(self, context): obj = context.active_object root = mmd_model.Model.findRoot(obj) rig = mmd_model.Model(root) for meshObj in rig.meshes(): def __pre_remove(m): if m and '_temp' in m.name: base_mat_name = m.name.split('_temp')[0] try: FnMaterial.swap_materials(meshObj, m.name, base_mat_name) return True except MaterialNotFoundError: self.report({ 'WARNING' } ,'Base material for %s was not found'%m.name) return False FnMaterial.clean_materials(meshObj, can_remove=__pre_remove) return { 'FINISHED' }