From: Mikko Rasa Date: Sun, 7 Jul 2024 14:20:01 +0000 (+0300) Subject: Update Blender exporter for changes in Blender 4.0 X-Git-Url: https://git.tdb.fi/?a=commitdiff_plain;h=4d7730f7c2d2f2654033787000bdd4b2b837fdb7;p=libs%2Fgl.git Update Blender exporter for changes in Blender 4.0 The default values of principled BSDF have changed so that emission color defaults to white but strength defaults to zero. We must account for the strength or materials end up having very strong emission. --- diff --git a/blender/io_mspgl/material.py b/blender/io_mspgl/material.py index b1d2756e..df6192d0 100644 --- a/blender/io_mspgl/material.py +++ b/blender/io_mspgl/material.py @@ -193,11 +193,13 @@ class MaterialProperty: self.scale = 1.0 self.tint = None - def set_from_input(self, node_tree, input_socket, alpha_socket=None): + def set_from_input(self, node_tree, input_socket, *, alpha_socket=None, strength_socket=None): if self.keyword: if type(self.value)==tuple: if alpha_socket: self.value = input_socket.default_value[:len(self.value)-1]+(alpha_socket.default_value,) + elif strength_socket: + self.value = tuple(c*strength_socket.default_value for c in input_socket.default_value[:len(self.value)]) else: self.value = input_socket.default_value[:len(self.value)] else: @@ -207,6 +209,16 @@ class MaterialProperty: from .util import get_linked_node_and_socket from_node, from_sock = get_linked_node_and_socket(node_tree, input_socket) + if strength_socket: + if not from_node: + if input_socket.default_value[:3]!=(1.0, 1.0, 1.0): + raise Exception("Unsupported material property scale {}".format(input_socket.default_value)) + from_node, from_sock = get_linked_node_and_socket(node_tree, strength_socket) + elif strength_socket.is_linked: + raise Exception("Separate inputs for value and strength are not supported") + elif strength_socket.default_value!=1.0: + raise Exception("Unsupported material property scale {}".format(strength_node.default_value)) + alpha_from = None if from_node: channels = None @@ -370,10 +382,10 @@ class Material: normal = self.create_property("normal_map") emission = self.create_property("emission", (0.0, 0.0, 0.0)) - base_color.set_from_input(node_tree, from_node.inputs["Base Color"], from_node.inputs["Alpha"]) + base_color.set_from_input(node_tree, from_node.inputs["Base Color"], alpha_socket=from_node.inputs["Alpha"]) if base_color.tint: tint.value = base_color.tint metalness.set_from_input(node_tree, from_node.inputs["Metallic"]) roughness.set_from_input(node_tree, from_node.inputs["Roughness"]) normal.set_from_input(node_tree, from_node.inputs["Normal"]) - emission.set_from_input(node_tree, from_node.inputs["Emission"]) + emission.set_from_input(node_tree, from_node.inputs["Emission Color"], strength_socket=from_node.inputs["Emission Strength"])