diff --git a/animation_animall.py b/animation_animall.py new file mode 100644 index 0000000000000000000000000000000000000000..9ecbf2c19b7c0eabd150c647e30f5636d92518ef --- /dev/null +++ b/animation_animall.py @@ -0,0 +1,265 @@ +# ##### BEGIN GPL LICENSE BLOCK ##### +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# ##### END GPL LICENSE BLOCK ##### + +bl_info = { + 'name': 'AnimAll', + 'author': 'Daniel Salazar <zanqdo@gmail.com>', + 'version': (0, 3), + 'blender': (2, 5, 5), + 'api': 33625, + 'location': 'Select a Mesh: Toolbar > AnimAll panel', + 'description': 'Allows animation of mesh and lattice data (Shape Keys, VCols, VGroups, UVs)', + 'warning': 'Blender API has some bugs around this still', + 'wiki_url': 'http://wiki.blender.org/index.php/Extensions:2.5/Py/Scripts/Animation/AnimAll', + 'tracker_url': 'http://projects.blender.org/tracker/index.php?'\ + 'func=detail&aid=24874', + 'category': 'Animation'} + +'''------------------------------------------------------------------------- +Thanks to Campbell Barton and Joshua Leung for hes API additions and fixes +Daniel 'ZanQdo' Salazar + +Rev 0.1 initial release (animate Mesh points) +Rev 0.2 added support for animating UVs, VCols, VGroups +Rev 0.3 added support for animating Lattice points +Rev 0.4 added support for ShapeKey layer animation, removed support +for direct point animation since this new aproach is much stronger +and inline with the animation system +-------------------------------------------------------------------------''' + +import bpy +from bpy.props import * + + +# +# Property Definitions +# +bpy.types.WindowManager.key_shape = BoolProperty( + name="Shape", + description="Insert keyframes on active Shape Key layer", + default=True) + +bpy.types.WindowManager.key_uvs = BoolProperty( + name="UVs", + description="Insert keyframes on active UV coordinates", + default=False) + +bpy.types.WindowManager.key_vcols = BoolProperty( + name="VCols", + description="Insert keyframes on active Vertex Color values", + default=False) + +bpy.types.WindowManager.key_vgroups = BoolProperty( + name="VGroups", + description="Insert keyframes on active Vertex Group values", + default=False) + + +# +# GUI (Panel) +# +class VIEW3D_PT_animall(bpy.types.Panel): + + bl_space_type = 'VIEW_3D' + bl_region_type = 'TOOLS' + bl_label = 'AnimAll' + + # show this add-on only in the Camera-Data-Panel + @classmethod + def poll(self, context): + if context.active_object: + return context.active_object.type == 'MESH'\ + or context.active_object.type == 'LATTICE' + + # draw the gui + def draw(self, context): + layout = self.layout + + col = layout.column(align=True) + + #col.label(text="Keyframing:") + row = col.row() + row.prop(context.window_manager, "key_shape") + if context.active_object.type == 'MESH': + row.prop(context.window_manager, "key_uvs") + row = col.row() + row.prop(context.window_manager, "key_vcols") + row.prop(context.window_manager, "key_vgroups") + + row = col.row() + row.operator('anim.insert_keyframe_animall', icon='KEY_HLT') + row.operator('anim.delete_keyframe_animall', icon='KEY_DEHLT') + row = layout.row() + row.operator('anim.clear_animation_animall', icon='X') + + +class ANIM_OT_insert_keyframe_animall(bpy.types.Operator): + bl_label = 'Insert' + bl_idname = 'anim.insert_keyframe_animall' + bl_description = 'Insert a Keyframe' + bl_options = {'REGISTER', 'UNDO'} + + + # on mouse up: + def invoke(self, context, event): + + self.execute(context) + + return {'FINISHED'} + + + def execute(op, context): + + Obj = context.active_object + + if Obj.type == 'MESH': + Mode = False + if context.mode == 'EDIT_MESH': + Mode = not Mode + bpy.ops.object.editmode_toggle() + + Data = Obj.data + + if context.window_manager.key_shape: + for Point in Obj.active_shape_key.data: + Point.keyframe_insert('co') + + if context.window_manager.key_vgroups: + for Vert in Data.vertices: + for Group in Vert.groups: + Group.keyframe_insert('weight') + + if context.window_manager.key_uvs: + for UVLayer in Data.uv_textures: + if UVLayer.active: # only insert in active UV layer + for Data in UVLayer.data: + Data.keyframe_insert('uv') + + if context.window_manager.key_vcols: + for VColLayer in Data.vertex_colors: + if VColLayer.active: # only insert in active VCol layer + for Data in VColLayer.data: + Data.keyframe_insert('color1') + Data.keyframe_insert('color2') + Data.keyframe_insert('color3') + Data.keyframe_insert('color4') + + if Mode: + bpy.ops.object.editmode_toggle() + + if Obj.type == 'LATTICE': + if context.window_manager.key_shape: + for Point in Obj.active_shape_key.data: + Point.keyframe_insert('co') + + + return {'FINISHED'} + + +class ANIM_OT_delete_keyframe_animall(bpy.types.Operator): + bl_label = 'Delete' + bl_idname = 'anim.delete_keyframe_animall' + bl_description = 'Delete a Keyframe' + bl_options = {'REGISTER', 'UNDO'} + + + # on mouse up: + def invoke(self, context, event): + + self.execute(context) + + return {'FINISHED'} + + + def execute(op, context): + + Obj = context.active_object + + if Obj.type == 'MESH': + Mode = False + if context.mode == 'EDIT_MESH': + Mode = not Mode + bpy.ops.object.editmode_toggle() + + Data = Obj.data + + if context.window_manager.key_shape: + for Point in Obj.active_shape_key.data: + Point.keyframe_delete('co') + + if context.window_manager.key_vgroups: + for Vert in Data.vertices: + for Group in Vert.groups: + Group.keyframe_delete('weight') + + if context.window_manager.key_uvs: + for UVLayer in Data.uv_textures: + if UVLayer.active: # only delete in active UV layer + for Data in UVLayer.data: + Data.keyframe_delete('uv') + + if context.window_manager.key_vcols: + for VColLayer in Data.vertex_colors: + if VColLayer.active: # only delete in active VCol layer + for Data in VColLayer.data: + Data.keyframe_delete('color1') + Data.keyframe_delete('color2') + Data.keyframe_delete('color3') + Data.keyframe_delete('color4') + + + if Mode: + bpy.ops.object.editmode_toggle() + + if Obj.type == 'LATTICE': + if context.window_manager.key_shape: + for Point in Obj.active_shape_key.data: + Point.keyframe_delete('co') + + return {'FINISHED'} + + +class ANIM_OT_clear_animation_animall(bpy.types.Operator): + bl_label = 'Clear Animation' + bl_idname = 'anim.clear_animation_animall' + bl_description = 'Clear all animation' + bl_options = {'REGISTER', 'UNDO'} + + # on mouse up: + def invoke(self, context, event): + + wm = context.window_manager + return wm.invoke_confirm(self, event) + + + def execute(op, context): + + Data = context.active_object.data + Data.animation_data_clear() + + return {'FINISHED'} + + +def register(): + pass + +def unregister(): + pass + +if __name__ == "__main__": + register()