[Bf-blender-cvs] [08012ebeec7] master: Disable Constraint and Keep Transform

Sybren A. Stüvel noreply at git.blender.org
Wed May 8 10:58:40 CEST 2019


Commit: 08012ebeec74baa6037c88c7c75de0962e4a1b74
Author: Sybren A. Stüvel
Date:   Wed May 8 10:57:17 2019 +0200
Branches: master
https://developer.blender.org/rB08012ebeec74baa6037c88c7c75de0962e4a1b74

Disable Constraint and Keep Transform

A 'Disable and Keep Transform' button for constraints was added. This
allows animators to disable a constraint without moving the constrained
object/bone, making it easier to toggle constriants on and off without
any visual consequence. Typical usage would be a character picking up an
object (enable 'Copy Transform' constraint) and placing it somewhere
else (disable the constraint).

Note that there could still be movement when there are muliple
constraints active. For example, when using this constraint stack

- #1: Copy Transform from Empty.001
- #2: Copy Rotation from Empty.002

and disabling constraint #2, constraint #1 is still active and will
still modify the visual transform of the object. According to our
in-house animators, this is expected behaviour.

Reviewers: campbellbarton, dfelinto, sergey

Reviewed By: campbellbarton

Subscribers: brecht

Tags: #animation

Differential Revision: https://developer.blender.org/D4677

===================================================================

M	release/scripts/startup/bl_operators/constraint.py
M	release/scripts/startup/bl_ui/properties_constraint.py

===================================================================

diff --git a/release/scripts/startup/bl_operators/constraint.py b/release/scripts/startup/bl_operators/constraint.py
index 61b1f7737af..f0318b1d85b 100644
--- a/release/scripts/startup/bl_operators/constraint.py
+++ b/release/scripts/startup/bl_operators/constraint.py
@@ -69,8 +69,53 @@ class CONSTRAINT_OT_normalize_target_weights(Operator):
         return {'FINISHED'}
 
 
+
+class CONSTRAINT_OT_disable_keep_transform(Operator):
+    bl_idname = "constraint.disable_keep_transform"
+    bl_label = "Disable and Keep Transform"
+    bl_description = ("Set the influence of this constraint to zero while "
+        "trying to maintain the object's transformation. Other active "
+        "constraints can still influence the final transformation")
+    bl_options = {'UNDO', 'INTERNAL'}
+
+    @classmethod
+    def poll(cls, context):
+        constraint = getattr(context, "constraint", None)
+        return constraint and constraint.influence > 0.0
+
+    def execute(self, context):
+        """Disable constraint while maintaining the visual transform."""
+
+        # This works most of the time, but when there are multiple constraints active
+        # there could still be one that overrides the visual transform.
+        #
+        # Note that executing this operator and then increasing the constraint
+        # influence may move the object; this happens when the constraint is
+        # additive rather than replacing the transform entirely.
+
+        # Get the matrix in world space.
+        is_bone_constraint = context.space_data.context == 'BONE_CONSTRAINT'
+        if is_bone_constraint:
+            armature = context.object
+            bone = context.pose_bone
+            mat = armature.matrix_world @ bone.matrix
+        else:
+            mat = context.object.matrix_world
+
+        context.constraint.influence = 0.0
+
+        # Set the matrix.
+        if is_bone_constraint:
+            bone.matrix = armature.matrix_world.inverted() @ mat
+        else:
+            context.object.matrix_world = mat
+
+        return {'FINISHED'}
+
+
 classes = (
     CONSTRAINT_OT_add_target,
     CONSTRAINT_OT_remove_target,
     CONSTRAINT_OT_normalize_target_weights,
+    CONSTRAINT_OT_disable_keep_transform,
 )
diff --git a/release/scripts/startup/bl_ui/properties_constraint.py b/release/scripts/startup/bl_ui/properties_constraint.py
index f5b36d6cfd0..310d35c6179 100644
--- a/release/scripts/startup/bl_ui/properties_constraint.py
+++ b/release/scripts/startup/bl_ui/properties_constraint.py
@@ -34,8 +34,18 @@ class ConstraintButtonsPanel:
             # match enum type to our functions, avoids a lookup table.
             getattr(self, con.type)(context, box, con)
 
-            if con.type not in {'RIGID_BODY_JOINT', 'NULL'}:
+            if con.type in {'RIGID_BODY_JOINT', 'NULL'}:
+                return
+
+            if con.type in {'IK', 'SPLINE_IK'}:
+                # constraint.disable_keep_transform doesn't work well
+                # for these constraints.
                 box.prop(con, "influence")
+            else:
+                row = box.row(align=True)
+                row.prop(con, "influence")
+                row.operator("constraint.disable_keep_transform",
+                    text='', icon='CANCEL')
 
     @staticmethod
     def space_template(layout, con, target=True, owner=True):



More information about the Bf-blender-cvs mailing list