소스 검색

Add Surface Deform

Joseph Brandenburg 4 달 전
부모
커밋
e925c7935a
3개의 변경된 파일76개의 추가작업 그리고 0개의 파일을 삭제
  1. 41 0
      deformer_containers.py
  2. 16 0
      deformer_definitions.py
  3. 19 0
      deformer_socket_templates.py

+ 41 - 0
deformer_containers.py

@@ -17,6 +17,7 @@ def TellClasses():
              DeformerHook,
              DeformerMorphTarget,
              DeformerMorphTargetDeform,
+             DeformerSurfaceDeform,
            ]
 
 # object instance probably can't use the deformer but it doesn't hurt to try.
@@ -556,3 +557,43 @@ class DeformerMorphTargetDeform(MantisDeformerNode):
                 self.gen_shape_key(xf, bContext)
             else:
                 self.gen_morph_target_modifier(xf, bContext)
+
+
+
+class DeformerSurfaceDeform(MantisDeformerNode):
+    '''A node representing an surface deform modifier'''
+
+    def __init__(self, signature, base_tree):
+        super().__init__(signature, base_tree, SurfaceDeformSockets)
+        # now set up the traverse target...
+        self.init_parameters(additional_parameters={"Name":None})
+        self.set_traverse([("Deformer", "Deformer")])
+        self.prepared = True
+
+    def GetxForm(self, socket="Deformer"):
+        if socket == "Deformer":
+            return super().GetxForm()
+        else:
+            trace_xForm_back(self, socket)
+    
+    def bExecute(self, bContext = None,):
+        self.executed = True
+         
+    def bFinalize(self, bContext=None):
+        prGreen("Executing Surface Deform Node")
+        mod_name = self.evaluate_input("Name")
+        for xf in self.GetxForm():
+            ob = xf.bGetObject()
+            d = ob.modifiers.new(mod_name, type='SURFACE_DEFORM')
+            if d is None:
+                raise RuntimeError(f"Modifier was not created in node {self} -- the object is invalid.")
+            self.bObject.append(d)
+            self.get_target_and_subtarget(d, input_name="Target")
+            props_sockets = self.gen_property_socket_map()
+            evaluate_sockets(self, d, props_sockets)
+            # now we have to bind it
+
+            import bpy
+            target = d.target
+            with bpy.context.temp_override(**{'active_object':ob, 'selected_objects':[ob, target]}):
+                bpy.ops.object.surfacedeform_bind(modifier=d.name)

+ 16 - 0
deformer_definitions.py

@@ -14,6 +14,7 @@ def TellClasses():
              DeformerHook,
              DeformerMorphTargetDeform,
              DeformerMorphTarget,
+             DeformerSurfaceDeform,
            ]
 
 
@@ -211,6 +212,21 @@ class DeformerMorphTarget(Node, DeformerNode):
 
         self.initialized = True
 
+
+# TODO: there is no reason for this to be a separate node!
+class DeformerSurfaceDeform(Node, DeformerNode):
+    '''A node representing a Surface Deform modifier'''
+    bl_idname = 'DeformerSurfaceDeform'
+    bl_label = "Surface Deform"
+    bl_icon = 'MOD_SOFT'
+    initialized : bpy.props.BoolProperty(default = False)
+    num_targets : bpy.props.IntProperty(default = 0)
+    mantis_node_class_name=bl_idname
+
+    def init(self, context):
+        self.init_sockets(SurfaceDeformSockets)
+        self.initialized = True
+
 # Set up the class property that ties the UI classes to the Mantis classes.
 for cls in TellClasses():
     cls.set_mantis_class()

+ 19 - 0
deformer_socket_templates.py

@@ -23,4 +23,23 @@ HookSockets= [
         is_input=True, default_value=True,),
     DeformerOutput := SockTemplate(name="Deformer", bl_idname='DeformerSocket',
         is_input=False,), 
+]
+
+SurfaceDeformSockets= [
+    DeformerInput := SockTemplate(name="Deformer", bl_idname='DeformerSocket',
+        is_input=True,),
+    SurfaceDeformTarget := replace(Target, name="Target",),
+    replace(SplineIndexTemplate,),
+    Falloff := SockTemplate(name="Falloff", bl_idname='FloatSocket',
+        is_input=True, default_value=4.0, blender_property="falloff", ),
+    Strength := replace(Influence, name="Strength", bl_idname='FloatSocket',
+        is_input=True, default_value=1.0, blender_property='strength'),
+    VertexGroup := SockTemplate(name="Vertex Group", bl_idname='StringSocket',
+        is_input=True, default_value="", blender_property="vertex_group"),
+    InvertVertexGroup := SockTemplate(name="Invert Vertex Group", bl_idname='BooleanSocket',
+        is_input=True, default_value=False, blender_property="invert_vertex_group"),
+    SparseBind := SockTemplate(name="Sparse Bind", bl_idname='BooleanSocket',
+        is_input=True, default_value=False, blender_property="use_sparse_bind"),
+    DeformerOutput := SockTemplate(name="Deformer", bl_idname='DeformerSocket',
+        is_input=False,), 
 ]