# ##### 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 ##### #------------------------------------------------------------------------- # WARNING: Currently adding new CVs to an already animated curve isn't safe # Thanks to Campbell Barton for hes API additions and fixes # Daniel Salazar - ZanQdo #------------------------------------------------------------------------- bl_addon_info = { 'name': 'RotoBezier', 'author': 'Daniel Salazar <zanqdo@gmail.com>', 'version': (0,1), 'blender': (2, 5, 5), 'api': 33198, 'location': 'Select a Curve > Properties > Curve > RotoBezier', 'description': 'Allows animation of bezier curves for rotoscoping', 'warning': '', 'wiki_url': 'http://wiki.blender.org/index.php/Extensions:2.5/Py/Scripts/Animation/RotoBezier', 'tracker_url': 'http://projects.blender.org/tracker/index.php?func=detail&aid=24839&group_id=153&atid=469', 'category': 'Animation'} import bpy # # GUI (Panel) # class OBJECT_PT_rotobezier(bpy.types.Panel): bl_label = "RotoBezier" bl_space_type = "PROPERTIES" bl_region_type = "WINDOW" bl_context = "data" # show this add-on only in the Camera-Data-Panel @classmethod def poll(self, context): return context.active_object.type == 'CURVE' # draw the gui def draw(self, context): layout = self.layout row = layout.row() row.operator('curve.insert_keyframe_rotobezier') row.operator('curve.delete_keyframe_rotobezier') class CURVE_OT_insert_keyframe_rotobezier(bpy.types.Operator): bl_label = 'Insert Keyframe' bl_idname = 'curve.insert_keyframe_rotobezier' bl_description = 'Insert a RotoBezier Keyframe' bl_options = {'REGISTER', 'UNDO'} # on mouse up: def invoke(self, context, event): self.insert_keyframe(context) return {'FINISHED'} def insert_keyframe(op, context): import bpy Obj = bpy.context.active_object if Obj.type == 'CURVE': Mode = False if bpy.context.mode != 'OBJECT': Mode = not Mode bpy.ops.object.editmode_toggle() Data = Obj.data for Splines in Data.splines: for CVs in Splines.bezier_points: CVs.keyframe_insert('co') CVs.keyframe_insert('handle_left') CVs.keyframe_insert('handle_right') if Mode: bpy.ops.object.editmode_toggle() return {'FINISHED'} class CURVE_OT_delete_keyframe_rotobezier(bpy.types.Operator): bl_label = 'Delete Keyframe' bl_idname = 'curve.delete_keyframe_rotobezier' bl_description = 'Delete a RotoBezier Keyframe' # on mouse up: def invoke(self, context, event): self.delete_keyframe(context) return {'FINISHED'} def delete_keyframe(op, context): import bpy Obj = bpy.context.active_object if Obj.type == 'CURVE': Mode = False if bpy.context.mode != 'OBJECT': Mode = not Mode bpy.ops.object.editmode_toggle() Data = Obj.data for Splines in Data.splines: for CVs in Splines.bezier_points: CVs.keyframe_delete('co') CVs.keyframe_delete('handle_left') CVs.keyframe_delete('handle_right') if Mode: bpy.ops.object.editmode_toggle() return {'FINISHED'} def register(): pass def unregister(): pass if __name__ == "__main__": register()