Move Inverse Kinematics panel to Constraint context. Make iTaSC parameter panel more readable.
This commit is contained in:
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user