diff options
Diffstat (limited to 'io_coat3D/tex.py')
-rw-r--r-- | io_coat3D/tex.py | 533 |
1 files changed, 241 insertions, 292 deletions
diff --git a/io_coat3D/tex.py b/io_coat3D/tex.py index f532177c..c9feec95 100644 --- a/io_coat3D/tex.py +++ b/io_coat3D/tex.py @@ -19,8 +19,9 @@ 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'))): @@ -28,308 +29,256 @@ def find_index(objekti): luku = luku +1 return luku -def gettex(mat_list, objekti, scene,export): - - coat3D = bpy.context.scene.coat3D - coa = objekti.coat3D - - if(bpy.context.scene.render.engine == 'VRAY_RENDER' or bpy.context.scene.render.engine == 'VRAY_RENDER_PREVIEW'): - vray = True - else: - vray = False +def RemoveFbxNodes(objekti): + Node_Tree = objekti.active_material.node_tree + for node in Node_Tree.nodes: + if node.type != 'OUTPUT_MATERIAL': + Node_Tree.nodes.remove(node) + else: + output = node + output.location = 340,400 + Prin_mat = Node_Tree.nodes.new(type="ShaderNodeBsdfPrincipled") + Prin_mat.location = 13, 375 - take_color = 0 - take_spec = 0 - take_normal = 0 - take_disp = 0 + Node_Tree.links.new(Prin_mat.outputs[0], output.inputs[0]) - bring_color = 1 - bring_spec = 1 - bring_normal = 1 - bring_disp = 1 +def readtexturefolder(mat_list,texturelist,is_new): #read textures from texture file texcoat = {} texcoat['color'] = [] - texcoat['specular'] = [] + texcoat['metalness'] = [] + texcoat['rough'] = [] texcoat['nmap'] = [] texcoat['disp'] = [] - texu = [] - - if(export): - objekti.coat3D.objpath = export - nimi = os.path.split(export)[1] - osoite = os.path.dirname(export) + os.sep #pitaa ehka muuttaa - for mate in objekti.material_slots: - for tex_slot in mate.material.texture_slots: - if(hasattr(tex_slot,'texture')): - if(tex_slot.texture.type == 'IMAGE'): - if tex_slot.texture.image is not None: - tex_slot.texture.image.reload() - else: - if(os.sys.platform == 'win32'): - osoite = os.path.expanduser("~") + os.sep + 'Documents' + os.sep + '3DC2Blender' + os.sep + 'Textures' + os.sep - else: - osoite = os.path.expanduser("~") + os.sep + '3DC2Blender' + os.sep + 'Textures' + os.sep - ki = os.path.split(coa.applink_name)[1] - ko = os.path.splitext(ki)[0] - just_nimi = ko + '_' - just_nimi_len = len(just_nimi) - print('terve:' + coa.applink_name) - - if(len(objekti.material_slots) != 0): - for obj_tex in objekti.active_material.texture_slots: - if(hasattr(obj_tex,'texture')): - if(obj_tex.texture.type == 'IMAGE'): - if(obj_tex.use_map_color_diffuse): - bring_color = 0; - if(obj_tex.use_map_specular): - bring_spec = 0; - if(obj_tex.use_map_normal): - bring_normal = 0; - if(obj_tex.use_map_displacement): - bring_disp = 0; - - files = os.listdir(osoite) - for i in files: - tui = i[:just_nimi_len] - if(tui == just_nimi): - texu.append(i) - - for yy in texu: - minimi = (yy.rfind('_'))+1 - maksimi = (yy.rfind('.')) - tex_name = yy[minimi:maksimi] - koko = '' - koko += osoite - koko += yy - texcoat[tex_name].append(koko) - - if((texcoat['color'] or texcoat['nmap'] or texcoat['disp'] or texcoat['specular']) and (len(objekti.material_slots)) == 0): - materials_old = bpy.data.materials.keys() - bpy.ops.material.new() - materials_new = bpy.data.materials.keys() - new_ma = list(set(materials_new).difference(set(materials_old))) - new_mat = new_ma[0] - ki = bpy.data.materials[new_mat] - objekti.data.materials.append(ki) - - if(bring_color == 1 and texcoat['color']): - index = find_index(objekti) - tex = bpy.ops.Texture - objekti.active_material.texture_slots.create(index) - total_mat = len(objekti.active_material.texture_slots.items()) - useold = '' - - for seekco in bpy.data.textures: - if((seekco.name[:5] == 'Color') and (seekco.users_material == ())): - useold = seekco - - - if(useold == ''): - - textures_old = bpy.data.textures.keys() - bpy.data.textures.new('Color',type='IMAGE') - textures_new = bpy.data.textures.keys() - name_te = list(set(textures_new).difference(set(textures_old))) - name_tex = name_te[0] - - bpy.ops.image.new(name=name_tex) - bpy.data.images[name_tex].filepath = texcoat['color'][0] - bpy.data.images[name_tex].source = 'FILE' - - objekti.active_material.texture_slots[index].texture = bpy.data.textures[name_tex] - objekti.active_material.texture_slots[index].texture.image = bpy.data.images[name_tex] - - if(objekti.data.uv_textures.active): - objekti.active_material.texture_slots[index].texture_coords = 'UV' - objekti.active_material.texture_slots[index].uv_layer = objekti.data.uv_textures.active.name - - objekti.active_material.texture_slots[index].texture.image.reload() - - - elif(useold != ''): - - objekti.active_material.texture_slots[index].texture = useold - objekti.active_material.texture_slots[index].texture.image = bpy.data.images[useold.name] - objekti.active_material.texture_slots[index].texture.image.filepath = texcoat['color'][0] - if(objekti.data.uv_textures.active): - objekti.active_material.texture_slots[index].texture_coords = 'UV' - objekti.active_material.texture_slots[index].uv_layer = objekti.data.uv_textures.active.name - - - if(bring_normal == 1 and texcoat['nmap']): - index = find_index(objekti) - tex = bpy.ops.Texture - objekti.active_material.texture_slots.create(index) - total_mat = len(objekti.active_material.texture_slots.items()) - useold = '' - - for seekco in bpy.data.textures: - if((seekco.name[:6] == 'Normal') and (seekco.users_material == ())): - useold = seekco - - if(useold == ''): - - textures_old = bpy.data.textures.keys() - bpy.data.textures.new('Normal',type='IMAGE') - textures_new = bpy.data.textures.keys() - name_te = list(set(textures_new).difference(set(textures_old))) - name_tex = name_te[0] - - bpy.ops.image.new(name=name_tex) - bpy.data.images[name_tex].filepath = texcoat['nmap'][0] - bpy.data.images[name_tex].source = 'FILE' - - objekti.active_material.texture_slots[index].texture = bpy.data.textures[name_tex] - objekti.active_material.texture_slots[index].texture.image = bpy.data.images[name_tex] - - if(objekti.data.uv_textures.active): - objekti.active_material.texture_slots[index].texture_coords = 'UV' - objekti.active_material.texture_slots[index].uv_layer = objekti.data.uv_textures.active.name - - objekti.active_material.texture_slots[index].use_map_color_diffuse = False - objekti.active_material.texture_slots[index].use_map_normal = True - - objekti.active_material.texture_slots[index].texture.image.reload() - if(vray): - bpy.data.textures[name_tex].vray_slot.BRDFBump.map_type = 'TANGENT' - - else: - bpy.data.textures[name_tex].use_normal_map = True - objekti.active_material.texture_slots[index].normal_map_space = 'TANGENT' - objekti.active_material.texture_slots[index].normal_factor = 1 - + texcoat['emissive'] = [] + + + for texture_info in texturelist: + if texture_info[0] == mat_list[0].name: + if texture_info[2] == 'color' or texture_info[2] == 'diffuse': + texcoat['color'].append(texture_info[3]) + if texture_info[2] == 'metalness' or texture_info[2] == 'reflection': + texcoat['metalness'].append(texture_info[3]) + if texture_info[2] == 'rough' or texture_info[2] == 'roughness': + texcoat['rough'].append(texture_info[3]) + if texture_info[2] == 'nmap' or texture_info[2] == 'normal_map': + texcoat['nmap'].append(texture_info[3]) + if texture_info[2] == 'emissive': + texcoat['emissive'].append(texture_info[3]) + + createnodes(mat_list, 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(mat_list,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 - - elif(useold != ''): - - objekti.active_material.texture_slots[index].texture = useold - objekti.active_material.texture_slots[index].texture.image = bpy.data.images[useold.name] - objekti.active_material.texture_slots[index].texture.image.filepath = texcoat['nmap'][0] - if(objekti.data.uv_textures.active): - objekti.active_material.texture_slots[index].texture_coords = 'UV' - objekti.active_material.texture_slots[index].uv_layer = objekti.data.uv_textures.active.name - objekti.active_material.texture_slots[index].use_map_color_diffuse = False - objekti.active_material.texture_slots[index].use_map_normal = True - objekti.active_material.texture_slots[index].normal_factor = 1 - - - if(bring_spec == 1 and texcoat['specular']): - - index = find_index(objekti) - - objekti.active_material.texture_slots.create(index) - useold = '' - - for seekco in bpy.data.textures: - if((seekco.name[:8] == 'Specular') and (seekco.users_material == ())): - useold = seekco - - if(useold == ''): - - textures_old = bpy.data.textures.keys() - bpy.data.textures.new('Specular',type='IMAGE') - textures_new = bpy.data.textures.keys() - name_te = list(set(textures_new).difference(set(textures_old))) - name_tex = name_te[0] - - bpy.ops.image.new(name=name_tex) - bpy.data.images[name_tex].filepath = texcoat['specular'][0] - bpy.data.images[name_tex].source = 'FILE' - - objekti.active_material.texture_slots[index].texture = bpy.data.textures[name_tex] - objekti.active_material.texture_slots[index].texture.image = bpy.data.images[name_tex] - - if(objekti.data.uv_textures.active): - objekti.active_material.texture_slots[index].texture_coords = 'UV' - objekti.active_material.texture_slots[index].uv_layer = objekti.data.uv_textures.active.name - - objekti.active_material.texture_slots[index].use_map_color_diffuse = False - objekti.active_material.texture_slots[index].use_map_specular = True - - objekti.active_material.texture_slots[index].texture.image.reload() - - - elif(useold != ''): - - objekti.active_material.texture_slots[index].texture = useold - objekti.active_material.texture_slots[index].texture.image = bpy.data.images[useold.name] - objekti.active_material.texture_slots[index].texture.image.filepath = texcoat['specular'][0] - if(objekti.data.uv_textures.active): - objekti.active_material.texture_slots[index].texture_coords = 'UV' - objekti.active_material.texture_slots[index].uv_layer = objekti.data.uv_textures.active.name - objekti.active_material.texture_slots[index].use_map_color_diffuse = False - objekti.active_material.texture_slots[index].use_map_specular = True - - if(bring_disp == 1 and texcoat['disp']): - - index = find_index(objekti) - - - objekti.active_material.texture_slots.create(index) - useold = '' - - for seekco in bpy.data.textures: - if((seekco.name[:12] == 'Displacement') and (seekco.users_material == ())): - useold = seekco - - if useold == "": - - textures_old = bpy.data.textures.keys() - bpy.data.textures.new('Displacement',type='IMAGE') - textures_new = bpy.data.textures.keys() - name_te = list(set(textures_new).difference(set(textures_old))) - name_tex = name_te[0] - - bpy.ops.image.new(name=name_tex) - bpy.data.images[name_tex].filepath = texcoat['disp'][0] - bpy.data.images[name_tex].source = 'FILE' - - objekti.active_material.texture_slots[index].texture = bpy.data.textures[name_tex] - objekti.active_material.texture_slots[index].texture.image = bpy.data.images[name_tex] - - if(objekti.data.uv_textures.active): - objekti.active_material.texture_slots[index].texture_coords = 'UV' - objekti.active_material.texture_slots[index].uv_layer = objekti.data.uv_textures.active.name - - objekti.active_material.texture_slots[index].use_map_color_diffuse = False - objekti.active_material.texture_slots[index].use_map_displacement = True - - objekti.active_material.texture_slots[index].texture.image.reload() - - - elif(useold != ''): - - objekti.active_material.texture_slots[index].texture = useold - objekti.active_material.texture_slots[index].texture.image = bpy.data.images[useold.name] - objekti.active_material.texture_slots[index].texture.image.filepath = texcoat['disp'][0] - if(objekti.data.uv_textures.active): - objekti.active_material.texture_slots[index].texture_coords = 'UV' - objekti.active_material.texture_slots[index].uv_layer = objekti.data.uv_textures.active.name - objekti.active_material.texture_slots[index].use_map_color_diffuse = False - objekti.active_material.texture_slots[index].use_map_displacement = True - - if(vray): - objekti.active_material.texture_slots[index].texture.use_interpolation = False - objekti.active_material.texture_slots[index].displacement_factor = 0.05 + coat3D = bpy.context.scene.coat3D + coatMat = mat_list[0] + + if(coatMat.use_nodes == False): + coatMat.use_nodes = True + act_material = coatMat.node_tree + main_material = coatMat.node_tree + applink_group_node = False + + #ensimmaiseksi kaydaan kaikki image nodet lapi ja tarkistetaan onko nimi 3DC alkunen jos on niin reload + print('texcoat:',texcoat) + for node in act_material.nodes: + if(node.name == '3DC_Applink' and node.type == 'GROUP'): + applink_group_node = True + act_material = node.node_tree + break + for node in act_material.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 + if(applink_group_node == False and coat3D.creategroup): + group_tree = bpy.data.node_groups.new('3DC_Applink', 'ShaderNodeTree') + applink_tree = act_material.nodes.new('ShaderNodeGroup') + applink_tree.name = '3DC_Applink' + applink_tree.node_tree = group_tree + applink_tree.location = -400, 300 + act_material = group_tree + notegroup = act_material.nodes.new('NodeGroupOutput') + + main_mat = main_material.nodes['Material Output'] + if(main_mat.inputs['Surface'].is_linked == True): + glue_mat = main_mat.inputs['Surface'].links[0].from_node + if(glue_mat.inputs.find('Base Color') == -1): + input_color = glue_mat.inputs.find('Color') else: - disp_modi = '' - for seek_modi in objekti.modifiers: - if(seek_modi.type == 'DISPLACE'): - disp_modi = seek_modi - break - if(disp_modi): - disp_modi.texture = objekti.active_material.texture_slots[index].texture - if(objekti.data.uv_textures.active): - disp_modi.texture_coords = 'UV' - disp_modi.uv_layer = objekti.data.uv_textures.active.name + input_color = glue_mat.inputs.find('Base Color') + input_index = 0 + #Color + if(bring_color == True and texcoat['color'] != []): + print('image:', bpy.data.images) + node = act_material.nodes.new('ShaderNodeTexImage') + node.name = '3DC_color' + if (texcoat['color']): + sameimage = False + for image in bpy.data.images: + if(image.filepath == texcoat['color'][0]): + sameimage = True + imagename = image + break + + if sameimage == True: + node.image = imagename + else: + node.image = bpy.data.images.load(texcoat['color'][0]) + if(coat3D.createnodes): + curvenode = act_material.nodes.new('ShaderNodeRGBCurve') + curvenode.name = '3DC_RGBCurve' + huenode = act_material.nodes.new('ShaderNodeHueSaturation') + huenode.name = '3DC_HueSaturation' + act_material.links.new(huenode.outputs[0], glue_mat.inputs[input_color]) + act_material.links.new(curvenode.outputs[0], huenode.inputs[4]) + act_material.links.new(node.outputs[0], curvenode.inputs[1]) + node.location = -990, 530 + curvenode.location = -660, 480 + huenode.location = -337, 335 + if(coat3D.creategroup): + act_material.links.new(huenode.outputs[0], notegroup.inputs[input_index]) + group_tree.outputs[input_index].name = 'Color' + main_material.links.new(applink_tree.outputs[input_index], glue_mat.inputs[input_color]) + input_index += 1 + else: + if (coat3D.creategroup): + node.location = -400, 400 + act_material.links.new(node.outputs[0], notegroup.inputs[input_index]) + if (input_color != -1): + main_material.links.new(applink_tree.outputs[input_index], glue_mat.inputs[input_color]) + input_index += 1 + + else: + node.location = -400,400 + if (input_color != -1): + act_material.links.new(node.outputs[0], glue_mat.inputs[input_color]) + #Metalness + if(bring_metalness == True and texcoat['metalness'] != []): + node = act_material.nodes.new('ShaderNodeTexImage') + node.name='3DC_metalness' + input_color = glue_mat.inputs.find('Metallic') + if(texcoat['metalness']): + node.image = bpy.data.images.load(texcoat['metalness'][0]) + node.color_space = 'NONE' + if (coat3D.createnodes): + curvenode = act_material.nodes.new('ShaderNodeRGBCurve') + curvenode.name = '3DC_RGBCurve' + huenode = act_material.nodes.new('ShaderNodeHueSaturation') + huenode.name = '3DC_HueSaturation' + act_material.links.new(huenode.outputs[0], glue_mat.inputs[input_color]) + act_material.links.new(curvenode.outputs[0], huenode.inputs[4]) + act_material.links.new(node.outputs[0], curvenode.inputs[1]) + node.location = -994, 119 + curvenode.location = -668, 113 + huenode.location = -345, 118 + if (coat3D.creategroup): + act_material.links.new(huenode.outputs[0], notegroup.inputs[input_index]) + group_tree.outputs[input_index].name = 'Metalness' + main_material.links.new(applink_tree.outputs[input_index], glue_mat.inputs[input_color]) + input_index += 1 + else: + if (coat3D.creategroup): + node.location = -830, 160 + act_material.links.new(node.outputs[0], notegroup.inputs[input_index]) + if (input_color != -1): + main_material.links.new(applink_tree.outputs[input_index], glue_mat.inputs[input_color]) + input_index += 1 + else: + node.location = -830, 160 + if (input_color != -1): + act_material.links.new(node.outputs[0], glue_mat.inputs[input_color]) + + #Roughness + if(bring_roughness == True and texcoat['rough'] != []): + node = act_material.nodes.new('ShaderNodeTexImage') + node.name='3DC_roughness' + input_color = glue_mat.inputs.find('Roughness') + if(texcoat['rough']): + node.image = bpy.data.images.load(texcoat['rough'][0]) + node.color_space = 'NONE' + if (coat3D.createnodes): + curvenode = act_material.nodes.new('ShaderNodeRGBCurve') + curvenode.name = '3DC_RGBCurve' + huenode = act_material.nodes.new('ShaderNodeHueSaturation') + huenode.name = '3DC_HueSaturation' + act_material.links.new(huenode.outputs[0], glue_mat.inputs[input_color]) + act_material.links.new(curvenode.outputs[0], huenode.inputs[4]) + act_material.links.new(node.outputs[0], curvenode.inputs[1]) + node.location = -1000, -276 + curvenode.location = -670, -245 + huenode.location = -340, -100 + if (coat3D.creategroup): + act_material.links.new(huenode.outputs[0], notegroup.inputs[input_index]) + group_tree.outputs[input_index].name = 'Roughness' + main_material.links.new(applink_tree.outputs[input_index], glue_mat.inputs[input_color]) + input_index += 1 else: - objekti.modifiers.new('Displace',type='DISPLACE') - objekti.modifiers['Displace'].texture = objekti.active_material.texture_slots[index].texture - if(objekti.data.uv_textures.active): - objekti.modifiers['Displace'].texture_coords = 'UV' - objekti.modifiers['Displace'].uv_layer = objekti.data.uv_textures.active.name + if (coat3D.creategroup): + node.location = -550, 0 + act_material.links.new(node.outputs[0], notegroup.inputs[input_index]) + if (input_color != -1): + main_material.links.new(applink_tree.outputs[input_index], glue_mat.inputs[input_color]) + input_index += 1 + else: + node.location = -550, 0 + if (input_color != -1): + act_material.links.new(node.outputs[0], glue_mat.inputs[input_color]) + + #Normal map + if(bring_normal == True and texcoat['nmap'] != []): + node = act_material.nodes.new('ShaderNodeTexImage') + normal_node = act_material.nodes.new('ShaderNodeNormalMap') + node.location = -600,-670 + normal_node.location = -300,-300 + node.name='3DC_normal' + normal_node.name='3DC_normalnode' + 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.links.new(node.outputs[0], normal_node.inputs[1]) + act_material.links.new(normal_node.outputs[0], glue_mat.inputs[input_color]) + if (coat3D.creategroup): + act_material.links.new(normal_node.outputs[0], notegroup.inputs[input_index]) + main_material.links.new(applink_tree.outputs[input_index], glue_mat.inputs[input_color]) + input_index += 1 + + + +def matlab(objekti,mat_list,texturelist,is_new): + + ''' FBX Materials: remove all nodes and create princibles node''' + if(is_new): + RemoveFbxNodes(objekti) + + '''Main Loop for Texture Update''' + #checkmaterial(mat_list, objekti) + readtexturefolder(mat_list,texturelist,is_new) return('FINISHED') |