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