Browse Source

Drivers, Keyframe, and fCurve cleanup & defaults

Joseph Brandenburg 8 months ago
parent
commit
e70888e8fe
1 changed files with 23 additions and 8 deletions
  1. 23 8
      misc_containers.py

+ 23 - 8
misc_containers.py

@@ -722,6 +722,8 @@ class UtilityKeyframe:
         key = self.parameters["Keyframe"]
         from mathutils import Vector
         key["co"]= Vector( (self.evaluate_input("Frame"), self.evaluate_input("Value"),))
+        key["type"]="GENERATED"
+        key["interpolation"] = "LINEAR"
         # eventually this will have the right data, TODO
         # self.parameters["Keyframe"] = key
         self.prepared = True
@@ -768,10 +770,10 @@ class UtilityFCurve:
         if True: #np.use_kf_nodes:
             for k in self.inputs.keys():
                 # print (self.inputs[k])
-                key = self.evaluate_input(k)
-                key["type"]="GENERATED"
-                key["interpolation"] = "LINEAR"
-                keys.append(key)
+                if (key := self.evaluate_input(k)) is None:
+                    prOrange(f"WARN: No enough keyframes connected to {self}:{k}. Skipping Link.")
+                else:
+                    keys.append(key)
 
         else:
             raise NotImplementedError("Getting the keys from an fCurve isn't really working anymore lol need to fix")
@@ -793,6 +795,8 @@ class UtilityFCurve:
                 link.to_node.parameters[link.to_socket] = keys
         # the above was a HACK. I don't want nodes modiying their descenedents.
         # If the above was necessary, I want to get an error from it so I can fix it in the descendent's class
+        if len(keys) <1:
+            prOrange(f"WARN: no keys in fCurve {self}.")
         self.prepared = True
         self.executed = True
                 
@@ -833,20 +837,27 @@ class UtilityDriver:
         from .drivers import MantisDriver
         #prPurple("Executing Driver Node")
         my_vars = []
-        
+        if (keys := self.evaluate_input("fCurve")) is None:
+            keys={}
+            prWhite(f"INFO: no fCurve connected to {self}; using default fCurve.")
+            from mathutils import Vector
+            keys = [
+                {"co":Vector( (0, 0,)), "type":"GENERATED", "interpolation":"LINEAR" },
+                {"co":Vector( (1, 1,)), "type":"GENERATED", "interpolation":"LINEAR" },
+            ]
         for inp in list(self.inputs.keys() )[3:]:
             if (new_var := self.evaluate_input(inp)):
                 new_var["name"] = inp
                 my_vars.append(new_var)
             else:
-                raise RuntimeError("Failed to initialize Driver variable")
+                raise RuntimeError(f"Failed to initialize Driver variable for {self}")
         my_driver ={ "owner"      :  None,
                      "prop"       :  None, # will be filled out in the node that uses the driver
                      "expression" :  self.evaluate_input("Expression"),
                      "ind"        :  -1, # same here
                      "type"       :  self.evaluate_input("Driver Type"),
                      "vars"       :  my_vars,
-                     "keys"       :  self.evaluate_input("fCurve"), }
+                     "keys"       :  keys, }
         
         my_driver = MantisDriver(my_driver)
         
@@ -1113,7 +1124,11 @@ class InputExistingGeometryObject:
     
     def bPrepare(self, bContext=None):
         from bpy import data
-        self.bObject = data.objects.get( self.evaluate_input("Name") )
+        name = self.evaluate_input("Name")
+        if name:
+          self.bObject = data.objects.get( name  )
+        else:
+          self.bObject = None
         if self is None and (name := self.evaluate_input("Name")):
           prRed(f"No object found with name {name} in {self}")
         self.prepared = True; self.executed = True