]> git.tdb.fi Git - libs/gl.git/commitdiff
Update Blender exporter for changes in Blender 4.0
authorMikko Rasa <tdb@tdb.fi>
Sun, 7 Jul 2024 14:20:01 +0000 (17:20 +0300)
committerMikko Rasa <tdb@tdb.fi>
Sun, 7 Jul 2024 14:20:01 +0000 (17:20 +0300)
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.

blender/io_mspgl/material.py

index b1d2756ebf7eb264ebc5e0412a307401b6d019f7..df6192d0e1a0b82f0ea9ecc163b49e877741e475 100644 (file)
@@ -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"])