Files
blender-rpak/blender-import.py
T
2023-07-17 15:45:55 +02:00

167 lines
6.8 KiB
Python

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))