Create blender-import.py
This commit is contained in:
@@ -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))
|
||||
Reference in New Issue
Block a user