diff options
Diffstat (limited to 'release/scripts/startup/bl_operators/object.py')
-rw-r--r-- | release/scripts/startup/bl_operators/object.py | 85 |
1 files changed, 85 insertions, 0 deletions
diff --git a/release/scripts/startup/bl_operators/object.py b/release/scripts/startup/bl_operators/object.py index b89890a223c..6356da216b1 100644 --- a/release/scripts/startup/bl_operators/object.py +++ b/release/scripts/startup/bl_operators/object.py @@ -685,6 +685,91 @@ class ClearAllRestrictRender(Operator): return {'FINISHED'} +class TransformsToDeltas(Operator): + """Convert normal object transforms to delta transforms, """ \ + """any existing delta transforms will be included as well""" + bl_idname = "object.transforms_to_deltas" + bl_label = "Transforms to Deltas" + bl_options = {'REGISTER', 'UNDO'} + + mode = EnumProperty( + items=(('ALL', + "All Transforms", + "Transfer location, rotation, and scale transforms", + ), + ('LOC', + "Location", + "Transfer location transforms only", + ), + ('ROT', + "Rotation", + "Transfer rotation transforms only", + ), + ('SCALE', + "Scale", + "Transfer scale transforms only", + ), + ), + name="Mode", + description="Which transforms to transfer", + default='ALL', + ) + reset_values = BoolProperty( + name="Reset Values", + description=("Clear transform values after transferring to deltas"), + default=True, + ) + + @classmethod + def poll(cls, context): + obs = context.selected_editable_objects + return (obs is not None) + + def execute(self, context): + for obj in context.selected_editable_objects: + if self.mode in {'ALL', 'LOC'}: + self.transfer_location(obj) + + if self.mode in {'ALL', 'ROT'}: + self.transfer_rotation(obj) + + if self.mode in {'ALL', 'SCALE'}: + self.transfer_scale(obj) + + return {'FINISHED'} + + def transfer_location(self, obj): + obj.delta_location += obj.location + + if self.reset_values: + obj.location.zero() + + def transfer_rotation(self, obj): + # TODO: add transforms together... + if obj.rotation_mode == 'QUATERNION': + obj.delta_rotation_quaternion += obj.rotation_quaternion + + if self.reset_values: + obj.rotation_quaternion.identity() + elif obj.rotation_mode == 'AXIS_ANGLE': + pass # Unsupported + else: + delta = obj.delta_rotation_euler.copy() + obj.delta_rotation_euler = obj.rotation_euler + obj.delta_rotation_euler.rotate(delta) + + if self.reset_values: + obj.rotation_euler.zero() + + def transfer_scale(self, obj): + obj.delta_scale[0] *= obj.scale[0] + obj.delta_scale[1] *= obj.scale[1] + obj.delta_scale[2] *= obj.scale[2] + + if self.reset_values: + obj.scale[:] = (1, 1, 1) + + class TransformsToDeltasAnim(Operator): """Convert object animation for normal transforms to delta transforms""" bl_idname = "object.anim_transforms_to_deltas" |