+def compute_render_method_hash(material):
+ descr = ""
+ for m in material.render_methods:
+ if descr:
+ descr += ","
+ descr += "{}={}".format(m.tag, m.shader)
+ return hash(descr)
+
+def check_group(node_tree, group, func):
+ from .util import get_linked_node_and_socket
+
+ output = group.node_tree.nodes["Group Output"]
+ from_node, _ = get_linked_node_and_socket(group.node_tree, output.inputs[0])
+ if from_node:
+ from_node, _ = func(group.node_tree, from_node)
+ if from_node and from_node.type=='GROUP_INPUT':
+ return get_linked_node_and_socket(node_tree, group.inputs[0])
+ return (None, None)
+
+def check_invert_green(node_tree, node):
+ if node.type=='GROUP':
+ return check_group(node_tree, node, check_invert_green)
+ elif node.type!='COMBRGB':
+ return (None, None)
+
+ from .util import get_linked_node_and_socket
+
+ green, g_sock = get_linked_node_and_socket(node_tree, node.inputs["G"])
+ if not green or green.type!='MATH' or green.operation!='SUBTRACT':
+ return (None, None)
+ green, g_sock = get_linked_node_and_socket(node_tree, green.inputs[1])
+
+ red, r_sock = get_linked_node_and_socket(node_tree, node.inputs["R"])
+ blue, b_sock = get_linked_node_and_socket(node_tree, node.inputs["B"])
+ if not red or red.type!='SEPRGB' or blue!=red or green!=red:
+ return (None, None)
+
+ return get_linked_node_and_socket(node_tree, red.inputs["Image"])
+
+def get_unlit_inputs(node_tree, node):
+ if node.type=='GROUP':
+ return check_group(node_tree, node, get_unlit_inputs)
+ elif node.type=='MIX_SHADER':
+ from .util import get_linked_node_and_socket
+
+ shader1, _ = get_linked_node_and_socket(node_tree, node.inputs[1])
+ shader2, _ = get_linked_node_and_socket(node_tree, node.inputs[2])
+ if shader1.type=='BSDF_TRANSPARENT' and shader2.type=='EMISSION':
+ factor_input = node.inputs["Fac"]
+ factor_from, _ = get_linked_node_and_socket(node_tree, factor_input)
+ color_input = shader2.inputs["Color"]
+ color_from, _ = get_linked_node_and_socket(node_tree, color_input)
+ if factor_from==color_from:
+ return (color_input, factor_input)
+ elif node.type=='EMISSION':
+ return (node.inputs["Color"], None)