浏览代码

Fix: 5.2 compatibility for Morph Deform

Joseph Brandenburg 4 天之前
父节点
当前提交
6eca9a08aa
共有 3 个文件被更改,包括 58 次插入 和 19 次删除
  1. 8 7
      deformer_nodes.py
  2. 31 9
      utilities/geometry_node_graphgen.py
  3. 19 3
      utilities/node_common.py

+ 8 - 7
deformer_nodes.py

@@ -481,14 +481,15 @@ class DeformerMorphTargetDeform(MantisDeformerNode):
         
         # at this point we make the node tree
         from .utilities.geometry_node_graphgen import gen_morph_target_nodes
-        d, props_sockets = gen_morph_target_nodes(
-                            self.evaluate_input("Name"),
-                            xf.bGetObject(),
-                            targets,
-                            context,
-                            use_offset=self.evaluate_input("Use Offset"))
+        d, props_sockets, b_obs = gen_morph_target_nodes(
+                                    self.evaluate_input("Name"),
+                                    xf.bGetObject(),
+                                    targets,
+                                    context,
+                                    use_offset=self.evaluate_input("Use Offset"))
+        b_obs['DEFAULT']=d
         self.bObject.append(d)
-        evaluate_sockets(self, {"DEFAULT":d}, props_sockets)
+        evaluate_sockets(self, b_obs, props_sockets)
         finish_drivers(self)
 
     def gen_shape_key_lattice(self, xf, context):

+ 31 - 9
utilities/geometry_node_graphgen.py

@@ -5,6 +5,7 @@ from .utilities import (prRed, prGreen, prPurple, prWhite, prOrange,
 
 def gen_morph_target_nodes(mod_name, mod_ob, targets, context, use_offset=True):
     from bpy import data
+    from bpy.app import version as bpy_version
     modifier = mod_ob.modifiers.new(mod_name, type='NODES')
     mod_ob.add_rest_position_attribute = True
     ng = data.node_groups.new(mod_name, "GeometryNodeTree")
@@ -24,6 +25,7 @@ def gen_morph_target_nodes(mod_name, mod_ob, targets, context, use_offset=True):
     add_these = []
 
     props_sockets={}
+    props_sockets_b_objects={}
     object_map = {}
 
     for i, t in enumerate(targets):
@@ -78,17 +80,34 @@ def gen_morph_target_nodes(mod_name, mod_ob, targets, context, use_offset=True):
         else:
             ng.links.new(input=inp.outputs[mt_name+" Value"], output=scale1.inputs["Scale"])
         add_these.append(scale1)
-        object_map["Socket_"+str((i+1)*2)]=mt_node.GetxForm().bGetObject()
+        object_map["Socket_"+str((i+1)*2)] = mt_node.GetxForm().bGetObject()
         from ..mantis_dataclasses import MantisSocketFiller
-        socket_value = MantisSocketFiller(
-            property_name = (prop := "Socket_"+str((i+1)*2+1)),
-            socket_name = (socket_name := "Value."+str(i).zfill(3)),
-            default_value = 1.0
-        )
-        props_sockets[prop] = socket_value
+
+        prop = "Socket_"+str((i+1)*2+1)
+        if bpy_version < (5, 2, 0):
+            socket_value = MantisSocketFiller(
+                property_name = prop,
+                property_group = prop,
+                socket_name = (socket_name := "Value."+str(i).zfill(3)),
+                default_value = 1.0
+            )
+            props_sockets_b_objects[prop] = modifier
+            props_sockets[prop] = socket_value
+        else:
+            socket_value = MantisSocketFiller(
+                property_name = prop,
+                property_group = prop,
+                socket_name = (socket_name := "Value."+str(i).zfill(3)),
+                default_value = 1.0
+            )
+            props_sockets_b_objects[prop] = modifier
+            props_sockets[prop] = socket_value
+            
     
     set_position = ng.nodes.new("GeometryNodeSetPosition")
     bake = ng.nodes.new("GeometryNodeBake")
+    if bpy_version >= (5,0,0):
+        bake.bake_items.new("GEOMETRY", 'Geometry')
     ng.links.new(inp.outputs["Geometry"], output=set_position.inputs["Geometry"])
     ng.links.new(set_position.outputs["Geometry"], output=bake.inputs[0])
     ng.links.new(bake.outputs[0], output=out.inputs[0])
@@ -114,8 +133,11 @@ def gen_morph_target_nodes(mod_name, mod_ob, targets, context, use_offset=True):
         pass # this is unlikely to fail since I package the wheel but if it does it shouldn't crash out.
 
     for socket, ob in object_map.items():
-        modifier[socket]=ob
-    return modifier, props_sockets
+        if bpy_version < (5, 2, 0):
+            modifier[socket]=ob
+        else: # the syntax for this was changed in Blender 5.2.0
+            setattr( getattr(modifier.properties.inputs, socket), 'value',  ob)
+    return modifier, props_sockets, props_sockets_b_objects
 
 def gen_object_instance_node_group():
     from bpy import data

+ 19 - 3
utilities/node_common.py

@@ -384,7 +384,10 @@ def safe_setattr(ob, att_name, val):
     ob_class_name = ob.__class__.__name__
     match ob_class_name:
         case "NodesModifier":
-            ob[att_name]=val
+            if bpy_version < (5, 2, 0):
+                ob[att_name]=val
+            else:
+                setattr( getattr( ob.properties.inputs, att_name), 'value', val)
         case "Key":
             ob.key_blocks[att_name].value=val
         case _:
@@ -457,7 +460,17 @@ def evaluate_sockets(mantis_node, b_objects, props_sockets,):
                         # NOW we can set up the driver.
                         # TODO: Maybe can prefill this in the socket template or cache the result per-socket
                         driver_properties = {} # use this dict to pack this data without mutating the driver itself
-                        driver_properties["path_from_id"] = b_object.path_from_id(prop,)
+
+                        ob_class_name = b_object.__class__.__name__
+                        if ob_class_name == "NodesModifier":
+                            # this doesn't even support path_from_id because it is is a bpy_props property group
+                            # So we'll construct it directly
+                            if bpy_version < (5, 2, 0): # get the path as normal, but with ["brackets and quotes"]
+                                driver_properties["path_from_id"] = b_object.path_from_id(f"[\"{prop}\"]")
+                            else:
+                                driver_properties["path_from_id"] = b_object.path_from_id("properties") + f".inputs.{prop}.value"
+                        else:
+                            driver_properties["path_from_id"] = b_object.path_from_id(prop,)
                         driver_properties['owner'] = b_object # it is the CALLER's responsibility to send the right object!!
                         # we need a special case here for Bones :/
                         # TODO: refactor so I don't need this
@@ -493,7 +506,10 @@ def evaluate_sockets(mantis_node, b_objects, props_sockets,):
             if ob_class_name not in {'NodesModifier', 'Key'}:
                 setattr(b_object, prop, assign_this_value)
             elif ob_class_name == "NodesModifier":
-                b_object[prop] = assign_this_value
+                if bpy_version < (5, 2, 0):
+                    b_object[prop] = assign_this_value
+                else:
+                    setattr( getattr( b_object.properties.inputs, prop), 'value', assign_this_value)
             else: # ob_class_name == "Key":
                 b_object.key_blocks[prop].value = assign_this_value