import os
-def get_linked_node_and_socket(node_tree, socket):
- for l in node_tree.links:
- if socket==l.to_socket:
- return (l.from_node, l.from_socket)
- elif socket==l.from_socket:
- return (l.to_node, l.to_socket)
- return (None, None)
-
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:
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)
self.value = input_socket.default_value
if self.tex_keyword:
+ from .util import get_linked_node_and_socket
+
from_node, _ = get_linked_node_and_socket(node_tree, input_socket)
alpha_from = None
if from_node:
self.render_mode = material.render_mode
self.technique = material.technique
self.shader = material.shader
+ self.receive_shadows = material.receive_shadows
+ self.cast_shadows = (material.shadow_method!='NONE')
+ self.image_based_lighting = material.image_based_lighting
if self.render_mode=='EXTERNAL' and not self.technique:
raise Exception("Invalid configuration on material {}: No technique for external rendering".format(self.name))
elif self.render_mode=='CUSTOM' and not self.shader:
raise Exception("Invalid configuration on material {}: No shader for custom rendering".format(self.name))
- out_node = None
- for n in material.node_tree.nodes:
- if n.type=='OUTPUT_MATERIAL':
- out_node = n
- break
-
+ out_node = next((n for n in material.node_tree.nodes if n.type=='OUTPUT_MATERIAL'), None)
if not out_node:
raise Exception("No output node found on material {}".format(self.name))
+ from .util import get_linked_node_and_socket
+
surface_node, _ = get_linked_node_and_socket(material.node_tree, out_node.inputs["Surface"])
if not surface_node:
if self.render_mode=='BUILTIN':
self.name = "material_atlas_"+os.path.splitext(self.shader)[0]
else:
self.name = "material_atlas"
+ self.receive_shadows = materials[0].receive_shadows
+ self.cast_shadows = (materials[0].shadow_method!='NONE')
self.materials = materials
self.material_names = [m.name for m in self.materials]
for m in self.materials:
raise Exception("Conflicting render modes in MaterialAtlas constructor")
if self.render_mode=='CUSTOM' and m.shader!=self.shader:
raise Exception("Conflicting shaders in MaterialAtlas constructor")
+ if m.receive_shadows!=self.receive_shadows or m.shadow_method!=materials[0].shadow_method:
+ raise Exception("Conflicting shadow settings in MaterialAtlas constructor")
count = len(self.materials)
size = 1