Update PBR node

This commit is contained in:
Lubos Lenco 2017-07-07 18:21:44 +02:00
parent fe1c7c70c1
commit cef5c03df3
5 changed files with 85 additions and 36 deletions

View file

@ -165,41 +165,75 @@ def parse_shader(node, socket):
if node.node_tree.name.startswith('Armory PBR'):
if parse_surface:
# Base color
parsing_basecolor(True)
out_basecol = parse_vector_input(node.inputs[0])
parsing_basecolor(False)
# Occlusion TODO: deprecated, occlussion is value instead of vector now
if node.inputs[1].type == 'RGBA':
out_occlusion = '{0}.r'.format(parse_vector_input(node.inputs[1]))
else:
out_occlusion = parse_value_input(node.inputs[1])
if node.inputs[2].is_linked or node.inputs[2].default_value != 1.0:
out_occlusion = '({0} * {1})'.format(out_occlusion, parse_value_input(node.inputs[2]))
# Roughness
out_roughness = parse_value_input(node.inputs[3])
if node.inputs[4].is_linked or node.inputs[4].default_value != 1.0:
out_roughness = '({0} * {1})'.format(out_roughness, parse_value_input(node.inputs[4]))
# Metallic
out_metallic = parse_value_input(node.inputs[5])
# Normal
if node.inputs[6].is_linked and node.inputs[6].links[0].from_node.type == 'NORMAL_MAP':
c_state.warn(c_state.mat_name() + ' - Do not use Normal Map node with Armory PBR, connect Image Texture directly')
parse_normal_map_color_input(node.inputs[6], node.inputs[7])
# Emission
if node.inputs[8].is_linked:
if len(node.inputs) != 14:
# Base color
parsing_basecolor(True)
out_emission = parse_vector_input(node.inputs[8])
emission_found = True
out_basecol = parse_vector_input(node.inputs[0])
parsing_basecolor(False)
if node.inputs[9].is_linked or node.inputs[9].default_value != 1.0:
out_emission = '({0} * {1})'.format(out_emission, parse_value_input(node.inputs[9]))
out_basecol = '({0} + {1} * 100.0)'.format(out_basecol, out_emission)
# Occlusion
out_occlusion = parse_value_input(node.inputs[2])
# Roughness
out_roughness = parse_value_input(node.inputs[3])
# Metallic
out_metallic = parse_value_input(node.inputs[4])
# Normal
if node.inputs[5].is_linked and node.inputs[5].links[0].from_node.type == 'NORMAL_MAP':
c_state.warn(c_state.mat_name() + ' - Do not use Normal Map node with Armory PBR, connect Image Texture directly')
parse_normal_map_color_input(node.inputs[5], node.inputs[6])
# Emission
dv = node.inputs[7].default_value
if node.inputs[7].is_linked or dv[0] != 0.0 or dv[1] != 0.0 or dv[2] != 0.0:
parsing_basecolor(True)
out_emission = parse_vector_input(node.inputs[7])
emission_found = True
parsing_basecolor(False)
if node.inputs[8].is_linked or node.inputs[8].default_value != 1.0:
out_emission = '({0} * {1})'.format(out_emission, parse_value_input(node.inputs[9]))
out_basecol = '({0} + {1} * 100.0)'.format(out_basecol, out_emission)
else: # Deprecated
# Base color
parsing_basecolor(True)
out_basecol = parse_vector_input(node.inputs[0])
parsing_basecolor(False)
# Occlusion TODO: deprecated, occlussion is value instead of vector now
if node.inputs[1].type == 'RGBA':
out_occlusion = '{0}.r'.format(parse_vector_input(node.inputs[1]))
else:
out_occlusion = parse_value_input(node.inputs[1])
if node.inputs[2].is_linked or node.inputs[2].default_value != 1.0:
out_occlusion = '({0} * {1})'.format(out_occlusion, parse_value_input(node.inputs[2]))
# Roughness
out_roughness = parse_value_input(node.inputs[3])
if node.inputs[4].is_linked or node.inputs[4].default_value != 1.0:
out_roughness = '({0} * {1})'.format(out_roughness, parse_value_input(node.inputs[4]))
# Metallic
out_metallic = parse_value_input(node.inputs[5])
# Normal
if node.inputs[6].is_linked and node.inputs[6].links[0].from_node.type == 'NORMAL_MAP':
c_state.warn(c_state.mat_name() + ' - Do not use Normal Map node with Armory PBR, connect Image Texture directly')
parse_normal_map_color_input(node.inputs[6], node.inputs[7])
# Emission
if node.inputs[8].is_linked:
parsing_basecolor(True)
out_emission = parse_vector_input(node.inputs[8])
emission_found = True
parsing_basecolor(False)
if node.inputs[9].is_linked or node.inputs[9].default_value != 1.0:
out_emission = '({0} * {1})'.format(out_emission, parse_value_input(node.inputs[9]))
out_basecol = '({0} + {1} * 100.0)'.format(out_basecol, out_emission)
if parse_opacity:
out_opacity = parse_value_input(node.inputs[12])
if node.inputs[13].is_linked or node.inputs[13].default_value != 1.0:
out_opacity = '({0} * {1})'.format(out_opacity, parse_value_input(node.inputs[13]))
if len(node.inputs) != 14:
out_opacity = parse_value_input(node.inputs[1])
else: # Deprecated
out_opacity = parse_value_input(node.inputs[12])
if node.inputs[13].is_linked or node.inputs[13].default_value != 1.0:
out_opacity = '({0} * {1})'.format(out_opacity, parse_value_input(node.inputs[13]))
else:
return parse_group(node, socket)
@ -927,9 +961,14 @@ def parse_value(node, socket):
if node.node_tree.name.startswith('Armory PBR'):
# Displacement
if socket == node.outputs[1]:
res = parse_value_input(node.inputs[10])
if node.inputs[11].is_linked or node.inputs[11].default_value != 1.0:
res = "({0} * {1})".format(res, parse_value_input(node.inputs[11]))
if len(node.inputs) != 14:
res = parse_value_input(node.inputs[9])
else: # Deprecated
res = parse_value_input(node.inputs[10])
if node.inputs[11].is_linked or node.inputs[11].default_value != 1.0:
res = "({0} * {1})".format(res, parse_value_input(node.inputs[11]))
return res
else:
return None

View file

@ -53,6 +53,9 @@ def parse(material, mat_data, mat_users, mat_armusers, rid):
sss_node = arm.nodes.get_node_by_type(material.node_tree, 'BSDF_PRINCIPLED')
if sss_node != None and sss_node.outputs[0].is_linked and (sss_node.inputs[1].is_linked or sss_node.inputs[1].default_value != 0.0):
sss = True
sss_node = arm.nodes.get_node_armorypbr(material.node_tree)
if sss_node != None and sss_node.outputs[0].is_linked and (sss_node.inputs[10].is_linked or sss_node.inputs[10].default_value != 0.0):
sss = True
if sss:
const = {}
const['name'] = 'materialID'

View file

@ -12,7 +12,8 @@ def disp_linked(output_node):
tess_enabled = arm.utils.tess_enabled(make_state.target)
if linked:
l = output_node.inputs[2].links[0]
if l.from_node.type == 'GROUP' and l.from_node.node_tree.name.startswith('Armory PBR') and l.from_node.inputs[10].is_linked == False:
if l.from_node.type == 'GROUP' and l.from_node.node_tree.name.startswith('Armory PBR') and \
((len(l.from_node.inputs) == 14 and l.from_node.inputs[10].is_linked == False) or (l.from_node.inputs[9].is_linked == False)):
return False
if linked and not tess_enabled:
log.warn('Tessellation not available on ' + make_state.target)
@ -77,6 +78,7 @@ def is_transluc_type(node):
if node.type == 'BSDF_GLASS' or \
node.type == 'BSDF_TRANSPARENT' or \
node.type == 'BSDF_TRANSLUCENT' or \
(node.type == 'GROUP' and node.node_tree.name.startswith('Armory PBR') and (node.inputs[12].is_linked or node.inputs[12].default_value != 1.0)):
(node.type == 'GROUP' and node.node_tree.name.startswith('Armory PBR') and len(node.inputs) == 14 and (node.inputs[12].is_linked or node.inputs[12].default_value != 1.0)) or \
(node.type == 'GROUP' and node.node_tree.name.startswith('Armory PBR') and (node.inputs[1].is_linked or node.inputs[1].default_value != 1.0)):
return True
return False

View file

@ -21,6 +21,11 @@ def get_node_by_type(node_group, ntype):
if node.type == ntype:
return node
def get_node_armorypbr(node_group):
for node in node_group.nodes:
if node.type == 'GROUP' and node.node_tree.name.startswith('Armory PBR'):
return node
def get_input_node(node_group, to_node, input_index):
for link in node_group.links:
if link.to_node == to_node and link.to_socket == to_node.inputs[input_index]:

Binary file not shown.