# -*- coding: utf-8 -*- # Original code by (C) 2019 yorikvanhavre # Copyright (C) 2023 Ilia Kurochkin # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. import logging import sys import bpy from bpy_extras.node_shader_utils import PrincipledBSDFWrapper from utils.shininess_to_roughness import shiny_to_rough logger = logging.getLogger(__name__) logging.basicConfig(level=logging.INFO) def set_fem_mat(obj, bobj, fem_mat): if fem_mat.isDerivedFrom("App::MaterialObjectPython"): if fem_mat.References[0][0].Name == obj.Name: fem_mat_name = fem_mat.Material['Name'] if 'DiffuseColor' in fem_mat.Material.keys(): d_col_str = fem_mat.Material['DiffuseColor'] d_col4 = tuple( map(float, d_col_str[1:-1].split(', '))) d_col = d_col4[:-1] else: d_col = (0.5, 0.5, 0.5) if 'Father' in fem_mat.Material.keys(): if fem_mat.Material['Father'] == 'Metal': me = 1 else: me = 0 else: me = 0 if 'Shininess' in fem_mat.Material.keys(): shiny = float(fem_mat.Material['Shininess']) if shiny == 0: rg = 0.5 else: rg = shiny_to_rough(shiny) else: rg = 0.5 if 'EmissiveColor' in fem_mat.Material.keys(): e_col_str = fem_mat.Material['EmissiveColor'] e_col4 = tuple( map(float, e_col_str[1:-1].split(', '))) e_col = e_col4[:-1] else: e_col = (0.0, 0.0, 0.0) if 'Transparency' in fem_mat.Material.keys(): tr_str = fem_mat.Material['Transparency'] alpha = 1.0 - float(tr_str) else: alpha = 1.0 logger.debug('Assign %s to object %s', fem_mat_name, obj.Label) if fem_mat_name in bpy.data.materials: if len(bobj.material_slots) < 1: bobj.data.materials.append(bpy.data.materials[fem_mat_name]) else: bobj.material_slots[0].material = bpy.data.materials[fem_mat_name] else: bmat = bpy.data.materials.new(name=fem_mat_name) bmat.use_nodes = True principled = PrincipledBSDFWrapper(bmat, is_readonly=False) principled.base_color = d_col principled.metallic = me principled.roughness = rg principled.emission_color = e_col principled.alpha = alpha bobj.data.materials.append(bmat)