From 427a3ad4b29f2fa1e6a11d72a574772ebe9853a0 Mon Sep 17 00:00:00 2001 From: Pullusb Date: Tue, 12 Apr 2022 11:21:00 +0200 Subject: [PATCH] cahnged actions name and custom panel tab 0.7.1 - customizable panel category name - Change generated action name: - `expanded` -> `baked` - `autogen` -> `pinned` --- CHANGELOG.md | 63 +++++++++++++++++++++++++++++++++++++++++ OP_animate_path.py | 10 +++---- OP_expand_cycle_step.py | 6 ++-- README.md | 59 +------------------------------------- __init__.py | 7 ++++- fn.py | 12 ++++---- panels.py | 21 +++++++++++--- preferences.py | 10 +++++++ 8 files changed, 111 insertions(+), 77 deletions(-) create mode 100644 CHANGELOG.md diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..7066bda --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,63 @@ +# Changelog + +0.7.1 + +- customizable panel category name +- Change generated action name: + - `expanded` -> `baked` + - `autogen` -> `pinned` + +0.7.0 + +- auto-detect foot to use for path animation +- button to go back and forth between curve edit and armature pose mode +- UI revamp showing better separation of tool categories + +0.6.0 + +- World paste and `Jump next frame` +- more compact and improved ui for world paste +- fix errors in some operators + +0.5.0 + +- pin feet working + +0.4.2 + +- context manager for `expand cycle step` store / restore + +0.4.1 + +- update fcurve after bake + +0.4.0 + +- better curve creation + +0.3.5 + +- partly working + +0.3.3 + +- total wip + +0.3.0 + +- Rework interface +- Add manual bone pinning: simple world space copy/paste + pose and jump prev/next +- Faster pin feets +- bool prop to disable end/curve stepping (interpolation as linear if needed) +- Switch action back to new curve when re-snapping to ground +- fix shrinkwrap +- fix rebake with linear +- error message when no fcurve has anim cycle + +0.2.0: + +- first working version + +0.1.0: + +- initial commit, halfway there \ No newline at end of file diff --git a/OP_animate_path.py b/OP_animate_path.py index 918678f..394855b 100644 --- a/OP_animate_path.py +++ b/OP_animate_path.py @@ -81,8 +81,8 @@ def find_best_foot(ob): return ('ERROR', f'No action active on {ob.name}') # use original action as ref - if '_expanded' in act.name: - base_act_name = act.name.split('_expanded')[0] + if '_baked' in act.name: + base_act_name = act.name.split('_baked')[0] base_act = bpy.data.actions.get(base_act_name) if base_act: act = base_act @@ -161,8 +161,8 @@ def anim_path_from_translate(): return ('ERROR', f'No action active on {ob.name}') # use original action as ref - if '_expanded' in act.name: - base_act_name = act.name.split('_expanded')[0] + if '_baked' in act.name: + base_act_name = act.name.split('_baked')[0] base_act = bpy.data.actions.get(base_act_name) if base_act: act = base_act @@ -362,7 +362,7 @@ class UAC_OT_adjust_animation_length(bpy.types.Operator): self.report({'ERROR'}, f'No action on {ob.name} data') return {"CANCELLED"} - # if '_expanded' in self.act.name: + # if '_baked' in self.act.name: # self.report({'WARNING'}, f'Action is expanded') const = root.constraints.get("Follow Path") diff --git a/OP_expand_cycle_step.py b/OP_expand_cycle_step.py index 34cbd6d..315c2b2 100644 --- a/OP_expand_cycle_step.py +++ b/OP_expand_cycle_step.py @@ -14,7 +14,7 @@ def bake_cycle(on_selection=True): print('ERROR', 'active is not an armature type') return - act = fn.set_expanded_action(obj) + act = fn.set_baked_action(obj) if not act: return @@ -107,7 +107,7 @@ def bake_cycle(on_selection=True): ct += 1 if ct_fcu == ct_no_cycle: # skipped because no cycle exists - rexpand = re.compile(r'_expanded\.?\d{0,3}$') + rexpand = re.compile(r'_baked\.?\d{0,3}$') if rexpand.search(act.name): # is an autogenerated one org_action_name = rexpand.sub('', act.name) @@ -246,7 +246,7 @@ def pin_down_feets(): debug = fn.get_addon_prefs().debug scn = bpy.context.scene # Delete current action if its not the main one - # create a new '_autogen' one + # create a new '_pinned' one act = fn.set_generated_action(obj) if not act: return ('ERROR', f'No action on {obj.name}') diff --git a/README.md b/README.md index e07deab..61f0908 100644 --- a/README.md +++ b/README.md @@ -52,61 +52,4 @@ Bonus: - align curve to root - Put curve forward motion on bones modifier's offset value as negative time offset (instead of using curve ) --> ---- - -## Changelog: - -0.7.0 - -- auto-detect foot to use for path animation -- button to go back and forth between curve edit and armature pose mode -- UI revamp showing better separation of tool categories - -0.6.0 - -- World paste and `Jump next frame` -- more compact and improved ui for world paste -- fix errors in some operators - -0.5.0 - -- pin feet working - -0.4.2 - -- context manager for `expand cycle step` store / restore - -0.4.1 - -- update fcurve after bake - -0.4.0 - -- better curve creation - -0.3.5 - -- partly working - -0.3.3 - -- total wip - -0.3.0 - -- Rework interface -- Add manual bone pinning: simple world space copy/paste + pose and jump prev/next -- Faster pin feets -- bool prop to disable end/curve stepping (interpolation as linear if needed) -- Switch action back to new curve when re-snapping to ground -- fix shrinkwrap -- fix rebake with linear -- error message when no fcurve has anim cycle - -0.2.0: - -- first working version - -0.1.0: - -- initial commit, halfway there \ No newline at end of file + \ No newline at end of file diff --git a/__init__.py b/__init__.py index e4bbf00..eba20f4 100644 --- a/__init__.py +++ b/__init__.py @@ -4,7 +4,7 @@ bl_info = { "name": "Unfold Anim Cycle", "description": "Anim tools to develop walk/run cycles along a curve", "author": "Samuel Bernou", - "version": (0, 7, 0), + "version": (0, 7, 1), "blender": (3, 0, 0), "location": "View3D", "warning": "WIP", @@ -34,6 +34,7 @@ else: from . import panels import bpy +from . import fn mods = ( properties, @@ -47,12 +48,16 @@ mods = ( panels, ) + + def register(): if bpy.app.background: return for module in mods: module.register() + panels.update_panel(fn.get_addon_prefs(), bpy.context) + def unregister(): if bpy.app.background: return diff --git a/fn.py b/fn.py index dcc9dcf..d41dd34 100644 --- a/fn.py +++ b/fn.py @@ -107,14 +107,14 @@ def get_obj_action(obj): return act def set_generated_action(obj): - '''Backup object action and return a new action suffixed '_autogen' + '''Backup object action and return a new action suffixed '_pinned' associated with the object ''' print(helper()) act = get_obj_action(obj) if not act: return - regen = re.compile(r'_autogen\.?\d{0,3}$') + regen = re.compile(r'_pinned\.?\d{0,3}$') if regen.search(act.name): # is an autogenerated one @@ -132,18 +132,18 @@ def set_generated_action(obj): # backup action before doing anything crazy act.use_fake_user = True new_act = act.copy() - new_act.name = act.name + '_autogen' + new_act.name = act.name + '_pinned' obj.animation_data.action = new_act return new_act -def set_expanded_action(obj): +def set_baked_action(obj): '''Backup object action and return a new action associated with the object ''' print(helper()) - rexpand = re.compile(r'_expanded\.?\d{0,3}$') + rexpand = re.compile(r'_baked\.?\d{0,3}$') act = obj.animation_data.action if rexpand.search(act.name): @@ -162,7 +162,7 @@ def set_expanded_action(obj): # backup action before doing anything crazy act.use_fake_user = True new_act = act.copy() - new_act.name = act.name + '_expanded' + new_act.name = act.name + '_baked' obj.animation_data.action = new_act return new_act diff --git a/panels.py b/panels.py index 7e0296b..884adb9 100644 --- a/panels.py +++ b/panels.py @@ -4,7 +4,7 @@ from . import fn class UAC_PT_walk_cycle_anim_panel(bpy.types.Panel): bl_space_type = "VIEW_3D" bl_region_type = "UI" - bl_category = "Anim" + bl_category = "Walk" bl_label = "Walk Cycle Anim" def draw(self, context): @@ -85,13 +85,17 @@ class UAC_PT_walk_cycle_anim_panel(bpy.types.Panel): # Pin feet col.operator('anim.pin_feets', text='Pin feets', icon='PINNED') - + + ## show a dropdown allowing to go back to unpinned, unbaked version of the animation + # if ob.type == 'ARMATURE': + # pass + class UAC_PT_anim_tools_panel(bpy.types.Panel): bl_space_type = "VIEW_3D" bl_region_type = "UI" - bl_category = "Anim" + bl_category = "Walk" bl_label = "Tools" def draw(self, context): @@ -120,12 +124,21 @@ class UAC_PT_anim_tools_panel(bpy.types.Panel): row.scale_x = 2 - classes=( UAC_PT_walk_cycle_anim_panel, UAC_PT_anim_tools_panel, ) +## Addons Preferences Update Panel +def update_panel(self, context): + for cls in classes: + try: + bpy.utils.unregister_class(cls) + except: + pass + cls.bl_category = self.category#fn.get_addon_prefs().category + bpy.utils.register_class(cls) + def register(): for cls in classes: bpy.utils.register_class(cls) diff --git a/preferences.py b/preferences.py index baa6a8e..95b89a6 100644 --- a/preferences.py +++ b/preferences.py @@ -1,10 +1,17 @@ import bpy +from .panels import update_panel class UAC_addon_prefs(bpy.types.AddonPreferences): ## can be just __name__ if prefs are in the __init__ mainfile # Else need the splitext '__name__ = addonname.subfile' (or use a static name) bl_idname = __name__.split('.')[0] # or with: os.path.splitext(__name__)[0] + category : bpy.props.StringProperty( + name="Category", + description="Choose a name for the category of the panel", + default="Walk", + update=update_panel) + # some_bool_prop to display in the addon pref debug : bpy.props.IntProperty( name='Debug', @@ -37,6 +44,9 @@ class UAC_addon_prefs(bpy.types.AddonPreferences): layout = self.layout layout.use_property_split = True + box = layout.box() + box.prop(self, "category") + box = layout.box() box.label(text='Curve creation parameters:') box.prop(self, "tgt_bone")