Browse Source

Finish Shrinkwrap Implementation

 - UI display & update
 - switching modes
 - testing

 seems that everything works! Why didn't I add this earlier?
Joseph Brandenburg 1 month ago
parent
commit
322f8a7293
3 changed files with 49 additions and 13 deletions
  1. 30 0
      link_nodes_ui.py
  2. 18 12
      link_socket_templates.py
  3. 1 1
      socket_definitions.py

+ 30 - 0
link_nodes_ui.py

@@ -404,6 +404,36 @@ class LinkShrinkWrapNode(Node, LinkNode):
         self.color = trackingColor
         self.initialized = True
 
+    def display_update(self, parsed_tree, context):
+        # vast majority of the time user doesn't link this.
+        shrink_type = self.inputs['Mode'].default_value
+        if self.inputs['Mode'].is_linked:# 1% or less of cases
+            node_tree = context.space_data.path[0].node_tree
+            nc = parsed_tree.get(get_signature_from_edited_tree(self, context))
+            shrink_is_project = False
+            if nc:
+                shrink_type = nc.evaluate_input("Mode")
+        if shrink_type != "PROJECT":
+            self.inputs['Project Axis'].hide=True
+            self.inputs['Space'].hide=True
+            self.inputs['Project Distance'].hide=True
+            self.inputs['Project Opposite'].hide=True
+            self.inputs['Face Cull'].hide=True
+            self.inputs['Invert Cull'].hide=True
+        else:
+            for inp in self.inputs:
+                inp.hide=False
+        if shrink_type == 'NEAREST_VERTEX':
+            self.inputs['Snap Mode'].hide=True
+            self.inputs['Align to Normal'].hide=True
+            self.inputs['Align Normal Axis'].hide=True
+        else:
+            self.inputs['Snap Mode'].hide=False
+            self.inputs['Align to Normal'].hide=False
+            self.inputs['Align Normal Axis'].hide=False
+        # TODO: this stuff should be handled by input tags
+        # once I get that working.
+
 # DRIVERS!!
 class LinkDrivenParameterNode(Node, LinkNode):
     """Represents a driven parameter in the downstream xForm node."""

+ 18 - 12
link_socket_templates.py

@@ -430,28 +430,34 @@ LinkShrinkWrapSockets = [
     TargetTemplate, # IMPORTANT TO DO: targets should be an array
     # and the constraints are made  ONLY if the target is valid...
     # for BONE targets, maybe auto-magically build a mesh for the user.
-    CullFaceTemplate := SockTemplate(name='Face Cull', is_input = True,
-            bl_idname="EnumShrinkwrapFaceCullSocket", default_value='OFF',
-            blender_property = "cull_face"),
+    # this is a little bit too hard to do for now. Users can just make a schema.
     SWDistanceTemplate := SockTemplate(name="Distance", bl_idname="FloatSocket",
             is_input=True, default_value=0.0, blender_property='distance'),
+    ShrinkwrapModeTemplate := SockTemplate(name="Mode",
+            bl_idname="EnumShrinkwrapTypeSocket", is_input=True,
+            blender_property='shrinkwrap_type'),
     ProjectAxisTemplate := SockTemplate(name="Project Axis",
             bl_idname="EnumShrinkwrapProjectAxisSocket", is_input=True,
-            blender_property='project_axis'),
-    TrackAxisTemplate:= SockTemplate(name="Track Axis", bl_idname="EnumTrackAxis",
-            is_input=True, blender_property='track_axis'),
+            blender_property='project_axis', default_value='NEG_Y'),
     ProjectAxisSpaceTemplate := replace(TargetSpaceTemplate, name='Space',
-            blender_property='project_axis_space'),
+            blender_property='project_axis_space', default_value='LOCAL'),
+    SWDistanceTemplate := SockTemplate(name="Project Distance", bl_idname="FloatSocket",
+            is_input=True, default_value=0.0, blender_property='project_limit'),
+    UseProjectOppositeTemplate:= SockTemplate(name="Project Opposite", is_input=True,
+            bl_idname="BooleanSocket", blender_property='use_project_opposite'),
+    CullFaceTemplate := SockTemplate(name='Face Cull', is_input = True,
+            bl_idname="EnumShrinkwrapFaceCullSocket", default_value='OFF',
+            blender_property = "cull_face"),
     UseInvertCullTemplate:= SockTemplate(name="Invert Cull",
             bl_idname="BooleanSocket", is_input=True,
             blender_property='use_invert_cull'),
-    UseProjectOppositeTemplate:= replace(UseInvertCullTemplate,
-            name="Project Opposite", blender_property='use_project_opposite'),
-    UseTrackNormalTemplate:= replace(UseInvertCullTemplate,
-            name="Align to Normal", blender_property='use_track_normal'),
-    ShrinkwrapModeTemplate := SockTemplate(name="Snap Mode",
+    SnapModeTemplate := SockTemplate(name="Snap Mode",
             bl_idname="EnumShrinkwrapModeSocket", is_input=True,
             blender_property='wrap_mode'),
+    UseTrackNormalTemplate:= SockTemplate(name="Align to Normal", is_input=True,
+            bl_idname="BooleanSocket", blender_property='use_track_normal'),
+    TrackAxisTemplate:= SockTemplate(name="Align Normal Axis", bl_idname="EnumTrackAxis",
+            is_input=True, blender_property='track_axis', default_value='TRACK_Y'),
     InfluenceTemplate,
     EnableTemplate,
     OutputRelationshipTemplate,

+ 1 - 1
socket_definitions.py

@@ -2130,7 +2130,7 @@ class EnumBBoneHandleType(MantisSocket):
         return self.color_simple
 
 eShrinkwrapType = (
-        ('NEAREST_SURFACE ', "Nearest Surface Point",
+        ('NEAREST_SURFACE', "Nearest Surface Point",
                      "Shrink the location to the nearest target surface.", 0),
         ('PROJECT', "Project", "Shrink the location to the nearest target "
                      "surface along a given axis.", 1),