import bpy from mathutils import Vector import os from itertools import chain from rpak import functions texturesPath = 'C:\\Users\\legon\\Downloads\\mp_colony\\textures' path = "F:\\rpaks" rpaks: list[functions.Rpak] = [] for file in os.listdir(path): if file.endswith(".rpak"): rpaks.append(functions.Rpak(os.path.join(path,file))) textures = map(lambda x : x.Assets['textures'], rpaks) textures = list(chain.from_iterable(textures)) textureGuids = map(lambda x : x.assetEntry.nameHash, textures) textureDict = dict(zip(textureGuids, textures)) materials = map(lambda x : x.Assets['materials'], rpaks) materials = list(chain.from_iterable(materials)) length = len(materials) for index, material in enumerate(materials): material.populateTextures(textureDict) functions.percent_complete(index, length, title="Linking textures") #SGBlenderTree = [ng for ng in bpy.data.node_groups if ng.bl_idname == 'ShaderNodeTree' and ng.name == 'S/G-Blender'] #if(len(SGBlenderTree) == 0): raise Exception('S/G-Blender shader not present!') #SGBlenderTree = SGBlenderTree[0] length = len(bpy.data.materials) for index, m in enumerate(bpy.data.materials): functions.percent_complete(index, length, title="Loading Blender material") # materials = list(filter(lambda x : x.header.name == m.name.lower(), rpak.Assets['materials'])) rpakMats = [x for x in materials if x.header.name == m.name.lower()] if(len(rpakMats) == 0): rpakMats = [x for x in materials if x.header.name.split('\\')[-1] == m.name.lower()] if(len(rpakMats) == 0): continue rpakMaterial = rpakMats[0] m.blend_method = 'CLIP' textures = rpakMaterial.textures m.use_nodes = True nodes = m.node_tree.nodes for node in nodes: if node.type != 'OUTPUT_MATERIAL': nodes.remove(node) # SGB = nodes.new(type='ShaderNodeGroup') # SGB.node_tree = SGBlenderTree bsdf = nodes.new(type='ShaderNodeBsdfPrincipled') material_output = nodes.get('Material Output') if(material_output == None): material_output = nodes.new(type='OUTPUT_MATERIAL') m.node_tree.links.new(bsdf.outputs['BSDF'], material_output.inputs['Surface']) # m.node_tree.links.new(SGB.outputs['BSDF'], material_output.inputs['Surface']) # add image texture if(textures[0] != None): filename = textures[0].header.name.split('\\')[-1] col = os.path.join(texturesPath, filename+".png") if(os.path.isfile(col) == False): continue colNode = nodes.new('ShaderNodeTexImage') colImage = bpy.data.images.load(col, check_existing=True) colNode.image = bpy.data.images.get(filename+".png") m.node_tree.links.new(bsdf.inputs['Base Color'], colNode.outputs['Color']) m.node_tree.links.new(bsdf.inputs['Alpha'], colNode.outputs['Alpha']) colNode.location = Vector((-400.0, 500.0)) if(len(textures) < 2): continue if(textures[1] != None): filename = textures[1].header.name.split('\\')[-1] nml = os.path.join(texturesPath, filename+".png") if(os.path.isfile(nml) == True): nmlNode = nodes.new('ShaderNodeTexImage') nmlConverterNode = nodes.new('ShaderNodeNormalMap') nmlImage = bpy.data.images.load(nml, check_existing=True) nmlNode.image = bpy.data.images.get(filename+".png") m.node_tree.links.new(nmlConverterNode.inputs['Color'], nmlNode.outputs['Color']) m.node_tree.links.new(bsdf.inputs['Normal'], nmlConverterNode.outputs['Normal']) nmlNode.location = Vector((-800.0, -800.0)) nmlConverterNode.location = Vector((-400.0, -800.0)) if(len(textures) < 3): continue if(textures[2] != None): filename = textures[2].header.name.split('\\')[-1] gls = os.path.join(texturesPath, filename+".png") if(os.path.isfile(gls) == True): glsNode = nodes.new('ShaderNodeTexImage') glsConverterNode = nodes.new('ShaderNodeInvert') glsImage = bpy.data.images.load(gls, check_existing=True) glsNode.image = bpy.data.images.get(filename+".png") m.node_tree.links.new(glsConverterNode.inputs['Color'], glsNode.outputs['Color']) m.node_tree.links.new(bsdf.inputs['Roughness'], glsConverterNode.outputs['Color']) glsNode.location = Vector((-800.0, -400.0)) glsConverterNode.location = Vector((-400.0, -400.0)) if(len(textures) < 4): continue if(textures[3] != None): filename = textures[3].header.name.split('\\')[-1] spc = os.path.join(texturesPath, filename+".png") if(os.path.isfile(spc) == True): spcNode = nodes.new('ShaderNodeTexImage') spcImage = bpy.data.images.load(spc, check_existing=True) spcNode.image = bpy.data.images.get(filename+".png") m.node_tree.links.new(bsdf.inputs['Specular'], spcNode.outputs['Color']) spcNode.location = Vector((-400.0, 0.0)) # spc = os.path.join(directory, material+"_spc.png") # if(len(rpakMats) > 1 and rpakMats[1] != None): # # continue # spcNode = nodes.new('ShaderNodeTexImage') # spcImage = bpy.data.images.load(spc, check_existing=True) # spcNode.image = bpy.data.images.get(material+"_spc.png") # m.node_tree.links.new(bsdf.inputs['Specular'], # spcNode.outputs['Color']) # spcNode.location = Vector((-400.0, 200.0)) # nml = os.path.join(directory, material+"_nml.png") # if(os.path.isfile(nml)): # nmlNode = nodes.new('ShaderNodeTexImage') # nmlConverterNode = nodes.new('ShaderNodeNormalMap') # nmlImage = bpy.data.images.load(nml, check_existing=True) # nmlNode.image = bpy.data.images.get(material+"_nml.png") # m.node_tree.links.new(nmlConverterNode.inputs['Color'], # nmlNode.outputs['Color']) # m.node_tree.links.new(bsdf.inputs['Normal'], # nmlConverterNode.outputs['Normal']) # nmlNode.location = Vector((-800.0, -400.0)) # nmlConverterNode.location = Vector((-400.0, -400.0)) # # # gls = os.path.join(directory, material+"_gls.png") # if(os.path.isfile(gls)): # glsNode = nodes.new('ShaderNodeTexImage') # glsConverterNode = nodes.new('ShaderNodeInvert') # glsImage = bpy.data.images.load(gls, check_existing=True) # glsNode.image = bpy.data.images.get(material+"_gls.png") # m.node_tree.links.new(glsConverterNode.inputs['Color'], # glsNode.outputs['Color']) # m.node_tree.links.new(bsdf.inputs['Roughness'], # glsConverterNode.outputs['Color']) # glsNode.location = Vector((-800.0, -100.0)) # glsConverterNode.location = Vector((-400.0, -100.0))