From 49a8d57ec8f541fc47ce7d57004a591eb0bfc3f6 Mon Sep 17 00:00:00 2001 From: Legonzaur <34353603+Legonzaur@users.noreply.github.com> Date: Mon, 17 Jul 2023 15:45:55 +0200 Subject: [PATCH] Create blender-import.py --- blender-import.py | 166 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 166 insertions(+) create mode 100644 blender-import.py diff --git a/blender-import.py b/blender-import.py new file mode 100644 index 0000000..4b1a87a --- /dev/null +++ b/blender-import.py @@ -0,0 +1,166 @@ +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))