Move Inverse Kinematics panel to Constraint context. Make iTaSC parameter panel more...
[blender-staging.git] / release / scripts / ui / buttons_object_constraint.py
index e089cff264fe86dc459223c5ef421712fc7e9deb..6be166e8af0158230c41b9bd57b2751af09bf4ba 100644 (file)
@@ -536,6 +536,145 @@ class OBJECT_PT_constraints(ConstraintButtonsPanel):
                for con in ob.constraints:
                        self.draw_constraint(context, con)
 
+class BONE_PT_inverse_kinematics(ConstraintButtonsPanel):
+       __label__ = "Inverse Kinematics"
+       __default_closed__ = True
+       __context__ = "bone_constraint"
+       
+       def poll(self, context):
+               ob = context.object
+               bone = context.bone
+
+               if ob and bone:
+                       pchan = ob.pose.pose_channels[bone.name]
+                       return pchan.has_ik
+               
+               return False
+
+       def draw(self, context):
+               layout = self.layout
+               
+               ob = context.object
+               bone = context.bone
+               pchan = ob.pose.pose_channels[bone.name]
+
+               row = layout.row()
+               row.itemR(ob.pose, "ik_solver")
+
+               split = layout.split(percentage=0.25)
+               split.itemR(pchan, "ik_dof_x", text="X")
+               row = split.row()
+               row.itemR(pchan, "ik_stiffness_x", text="Stiffness", slider=True)
+               row.active = pchan.ik_dof_x
+
+               split = layout.split(percentage=0.25)
+               row = split.row()
+               row.itemR(pchan, "ik_limit_x", text="Limit")
+               row.active = pchan.ik_dof_x
+               row = split.row(align=True)
+               row.itemR(pchan, "ik_min_x", text="")
+               row.itemR(pchan, "ik_max_x", text="")
+               row.active = pchan.ik_dof_x and pchan.ik_limit_x
+
+               split = layout.split(percentage=0.25)
+               split.itemR(pchan, "ik_dof_y", text="Y")
+               row = split.row()
+               row.itemR(pchan, "ik_stiffness_y", text="Stiffness", slider=True)
+               row.active = pchan.ik_dof_y
+
+               split = layout.split(percentage=0.25)
+               row = split.row()
+               row.itemR(pchan, "ik_limit_y", text="Limit")
+               row.active = pchan.ik_dof_y
+               row = split.row(align=True)
+               row.itemR(pchan, "ik_min_y", text="")
+               row.itemR(pchan, "ik_max_y", text="")
+               row.active = pchan.ik_dof_y and pchan.ik_limit_y
+
+               split = layout.split(percentage=0.25)
+               split.itemR(pchan, "ik_dof_z", text="Z")
+               row = split.row()
+               row.itemR(pchan, "ik_stiffness_z", text="Stiffness", slider=True)
+               row.active = pchan.ik_dof_z
+
+               split = layout.split(percentage=0.25)
+               row = split.row()
+               row.itemR(pchan, "ik_limit_z", text="Limit")
+               row.active = pchan.ik_dof_z
+               row = split.row(align=True)
+               row.itemR(pchan, "ik_min_z", text="")
+               row.itemR(pchan, "ik_max_z", text="")
+               row.active = pchan.ik_dof_z and pchan.ik_limit_z
+               split = layout.split()
+               split.itemR(pchan, "ik_stretch", text="Stretch", slider=True)
+               split.itemL()
+
+               if ob.pose.ik_solver == "ITASC":
+                       layout.itemL(text="Joint constraint:")
+                       split = layout.split(percentage=0.3)
+                       row = split.row()
+                       row.itemR(pchan, "ik_rot_control", text="Rotation")
+                       row = split.row()
+                       row.itemR(pchan, "ik_rot_weight", text="Weight", slider=True)
+                       row.active = pchan.ik_rot_control
+                       # not supported yet
+                       #split = layout.split(percentage=0.3)
+                       #row = split.row()
+                       #row.itemR(pchan, "ik_lin_control", text="Size")
+                       #row = split.row()
+                       #row.itemR(pchan, "ik_lin_weight", text="Weight", slider=True)
+                       #row.active = pchan.ik_lin_control
+
+class BONE_PT_iksolver_itasc(ConstraintButtonsPanel):
+       __label__ = "iTaSC parameters"
+       __default_closed__ = True
+       __context__ = "bone_constraint"
+       
+       def poll(self, context):
+               ob = context.object
+               bone = context.bone
+
+               if ob and bone:
+                       pchan = ob.pose.pose_channels[bone.name]
+                       return pchan.has_ik and ob.pose.ik_solver == "ITASC" and ob.pose.ik_param
+               
+               return False
+
+       def draw(self, context):
+               layout = self.layout
+
+               ob = context.object
+               itasc = ob.pose.ik_param
+
+               layout.itemR(itasc, "mode", expand=True)
+               simulation = itasc.mode == "SIMULATION"
+               if simulation:
+                       layout.itemL(text="Reiteration:")
+                       layout.itemR(itasc, "reiteration", expand=True)
+               
+               flow = layout.column_flow()
+               flow.itemR(itasc, "precision", text="Prec")
+               flow.itemR(itasc, "num_iter", text="Iter")
+               flow.active = not simulation or itasc.reiteration != "NEVER"
+
+               if simulation:          
+                       layout.itemR(itasc, "auto_step")
+                       row = layout.row()
+                       if itasc.auto_step:
+                               row.itemR(itasc, "min_step", text="Min")
+                               row.itemR(itasc, "max_step", text="Max")
+                       else:
+                               row.itemR(itasc, "num_step")
+                       
+               layout.itemR(itasc, "solver")
+               if simulation:
+                       layout.itemR(itasc, "feedback")
+                       layout.itemR(itasc, "max_velocity")
+               if itasc.solver == "DLS":
+                       row = layout.row()
+                       row.itemR(itasc, "dampmax", text="Damp", slider=True)
+                       row.itemR(itasc, "dampeps", text="Eps", slider=True)
+
 class BONE_PT_constraints(ConstraintButtonsPanel):
        __label__ = "Constraints"
        __context__ = "bone_constraint"
@@ -558,4 +697,6 @@ class BONE_PT_constraints(ConstraintButtonsPanel):
                        self.draw_constraint(context, con)
 
 bpy.types.register(OBJECT_PT_constraints)
+bpy.types.register(BONE_PT_iksolver_itasc)
+bpy.types.register(BONE_PT_inverse_kinematics)
 bpy.types.register(BONE_PT_constraints)