# ***** BEGIN GPL LICENSE BLOCK ***** # # # 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 2 # 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. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software Foundation, # Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # # ***** END GPL LICENCE BLOCK ***** import bpy import os import re def find_index(objekti): luku = 0 for tex in objekti.active_material.texture_slots: if(not(hasattr(tex,'texture'))): break luku = luku +1 return luku def readtexturefolder(objekti,is_new): #read textures from texture file coat3D = bpy.context.scene.coat3D obj_coat = objekti.coat3D texcoat = {} texcoat['color'] = [] texcoat['metalness'] = [] texcoat['rough'] = [] texcoat['nmap'] = [] texcoat['disp'] = [] if(is_new == True): files_dir = os.path.dirname(os.path.abspath(objekti.coat3D.applink_address)) else: if(bpy.data.filepath == ''): files_dir = os.path.dirname(os.path.abspath(objekti.coat3D.applink_address)) files_dir = files_dir.replace('3DC2Blender' + os.sep + 'Objects','3DC2Blender' + os.sep + 'Textures') else: files_dir = os.path.dirname(bpy.data.filepath) + os.sep + '3DCApplink' + os.sep + 'Textures' files = os.listdir(files_dir) materiaali_muutos = objekti.active_material.name uusin_mat = materiaali_muutos.replace('Material.','Material_') for i in files: if(i.startswith(obj_coat.applink_name + '_' + uusin_mat)): koko_osoite = files_dir + os.sep + i listed = re.split(r'[_.]', i) tex_name = listed[-2] texcoat[tex_name].append(koko_osoite) createnodes(objekti, texcoat) def checkmaterial(mat_list, objekti): #check how many materials object has mat_list = [] for obj_mate in objekti.material_slots: if(obj_mate.material.use_nodes == False): obj_mate.material.use_nodes = True def createnodes(objekti,texcoat): #luo nodes palikat ja linkittaa tekstuurit niihin bring_color = True #naiden tarkoitus on tsekata onko tarvetta luoda uusi node vai riittaako paivitys bring_metalness = True bring_roughness = True bring_normal = True bring_disp = True act_material = objekti.active_material if(objekti.active_material.use_nodes == False): objekti.active_material.use_nodes = True #ensimmaiseksi kaydaan kaikki image nodet lapi ja tarkistetaan onko nimi 3DC alkunen jos on niin reload for node in act_material.node_tree.nodes: if(node.type == 'TEX_IMAGE'): if(node.name == '3DC_color'): bring_color = False node.image.reload() elif(node.name == '3DC_metalness'): bring_metalness = False node.image.reload() elif(node.name == '3DC_roughness'): bring_roughness = False node.image.reload() elif(node.name == '3DC_normal'): bring_normal = False node.image.reload() #seuraavaksi lahdemme rakentamaan node tree. Lahdetaan Material Outputista rakentaa main_mat = act_material.node_tree.nodes['Material Output'] if(main_mat.inputs['Surface'].is_linked == True): glue_mat = main_mat.inputs['Surface'].links[0].from_node #Color if(bring_color == True and glue_mat.inputs.find('Base Color') != -1 and texcoat['color'] != []): node = act_material.node_tree.nodes.new('ShaderNodeTexImage') node.location = -400,400 node.name='3DC_color' if(texcoat['color']): node.image = bpy.data.images.load(texcoat['color'][0]) input_color = glue_mat.inputs.find('Base Color') act_material.node_tree.links.new(node.outputs[0], glue_mat.inputs[input_color]) #Metalness if(bring_metalness == True and glue_mat.inputs.find('Metallic') != -1 and texcoat['metalness'] != []): node = act_material.node_tree.nodes.new('ShaderNodeTexImage') node.location = -600,200 node.name='3DC_metalness' if(texcoat['metalness']): node.image = bpy.data.images.load(texcoat['metalness'][0]) node.color_space = 'NONE' input_color = glue_mat.inputs.find('Metallic') act_material.node_tree.links.new(node.outputs[0], glue_mat.inputs[input_color]) #Roughness if(bring_roughness == True and glue_mat.inputs.find('Roughness') != -1 and texcoat['rough'] != []): node = act_material.node_tree.nodes.new('ShaderNodeTexImage') node.location = -550,0 node.name='3DC_roughness' if(texcoat['rough']): node.image = bpy.data.images.load(texcoat['rough'][0]) node.color_space = 'NONE' input_color = glue_mat.inputs.find('Roughness') act_material.node_tree.links.new(node.outputs[0], glue_mat.inputs[input_color]) #Normal map if(bring_normal == True and glue_mat.inputs.find('Normal') != -1 and texcoat['nmap'] != []): node = act_material.node_tree.nodes.new('ShaderNodeTexImage') normal_node = act_material.node_tree.nodes.new('ShaderNodeNormalMap') node.location = -600,-270 normal_node.location = -300,-170 node.name='3DC_normal' if(texcoat['nmap']): node.image = bpy.data.images.load(texcoat['nmap'][0]) node.color_space = 'NONE' input_color = glue_mat.inputs.find('Normal') act_material.node_tree.links.new(node.outputs[0], normal_node.inputs[1]) act_material.node_tree.links.new(normal_node.outputs[0], glue_mat.inputs[input_color]) bpy.ops.object.editmode_toggle() #HACKKI joka saa tekstuurit nakymaan heti bpy.ops.object.editmode_toggle() def matlab(mat_list, objekti, scene,is_new): #checkmaterial(mat_list, objekti) readtexturefolder(objekti,is_new) return('FINISHED')