EasyWeight: Major update #317
@ -17,11 +17,27 @@ class EASYWEIGHT_addon_preferences(bpy.types.AddonPreferences):
|
||||
bl_idname = __package__
|
||||
easyweight_keymap_items = {}
|
||||
|
||||
always_show_zero_weights: BoolProperty(
|
||||
name="Always Show Zero Weights",
|
||||
description="A lack of weights will always be indicated with black color to differentiate it from a weight of 0.0 being assigned",
|
||||
default=True,
|
||||
)
|
||||
always_auto_normalize: BoolProperty(
|
||||
name="Always Auto Normalize",
|
||||
description="Weight auto-normalization will always be turned on, so the sum of all deforming weights on a vertex always add up to 1",
|
||||
default=True,
|
||||
)
|
||||
always_multipaint: BoolProperty(
|
||||
name="Always Multi-Paint",
|
||||
description="Multi-paint will always be turned on, allowing you to select more than one deforming bone while weight painting",
|
||||
default=True,
|
||||
)
|
||||
auto_clean_weights: BoolProperty(
|
||||
name="Auto Clean",
|
||||
name="Always Auto Clean",
|
||||
description="While this is enabled, zero-weights will be removed automatically after every brush stroke",
|
||||
default=True,
|
||||
)
|
||||
|
||||
show_hotkeys: BoolProperty(
|
||||
name="Show Hotkeys",
|
||||
description="Reveal the hotkey list. You may customize or disable these hotkeys",
|
||||
@ -33,6 +49,12 @@ class EASYWEIGHT_addon_preferences(bpy.types.AddonPreferences):
|
||||
layout.use_property_split = True
|
||||
layout.use_property_decorate = False
|
||||
|
||||
col = layout.column()
|
||||
col.prop(self, 'auto_clean_weights')
|
||||
col.prop(self, 'always_show_zero_weights')
|
||||
col.prop(self, 'always_auto_normalize')
|
||||
col.prop(self, 'always_multipaint')
|
||||
|
||||
main_col = layout.column(align=True)
|
||||
hotkey_col = self.draw_fake_dropdown(main_col, self, 'show_hotkeys', "Hotkeys")
|
||||
if self.show_hotkeys:
|
||||
|
@ -1,5 +1,6 @@
|
||||
import bpy
|
||||
from bpy.types import Object, Operator, VIEW3D_MT_paint_weight, VIEW3D_MT_object
|
||||
from .prefs import get_addon_prefs
|
||||
|
||||
# This operator is added to the Object menu.
|
||||
|
||||
@ -27,22 +28,31 @@ def enter_wp(context) -> bool:
|
||||
obj = context.object
|
||||
wm = context.window_manager
|
||||
|
||||
# Store old shading settings in a Custom Property dictionary in the Scene.
|
||||
if 'wpt' not in wm:
|
||||
wm['wpt'] = {}
|
||||
prefs = get_addon_prefs(context)
|
||||
tool_settings = context.scene.tool_settings
|
||||
if prefs.always_show_zero_weights:
|
||||
tool_settings.vertex_group_user = 'ACTIVE'
|
||||
if prefs.always_auto_normalize:
|
||||
tool_settings.use_auto_normalize = True
|
||||
if prefs.always_multipaint:
|
||||
tool_settings.use_multipaint = True
|
||||
|
||||
wpt = wm['wpt']
|
||||
wpt_as_dict = wpt.to_dict()
|
||||
# Store old shading settings in a Custom Property dictionary in the WindowManager.
|
||||
if 'weight_paint_toggle' not in wm:
|
||||
wm['weight_paint_toggle'] = {}
|
||||
|
||||
wp_toggle = wm['weight_paint_toggle']
|
||||
wp_toggle_as_dict = wp_toggle.to_dict()
|
||||
|
||||
# If we are entering WP mode for the first time or if the last time
|
||||
# the operator was exiting WP mode, then save current state.
|
||||
if 'last_switch_in' not in wpt_as_dict or wpt_as_dict['last_switch_in'] == False:
|
||||
wpt['active_object'] = obj
|
||||
if 'last_switch_in' not in wp_toggle_as_dict or wp_toggle_as_dict['last_switch_in'] == False:
|
||||
wp_toggle['active_object'] = obj
|
||||
|
||||
# This flag indicates that the last time this operator ran, we were
|
||||
# switching INTO wp mode.
|
||||
wpt['last_switch_in'] = True
|
||||
wpt['mode'] = obj.mode
|
||||
wp_toggle['last_switch_in'] = True
|
||||
wp_toggle['mode'] = obj.mode
|
||||
|
||||
# Enter WP mode.
|
||||
bpy.ops.object.mode_set(mode='WEIGHT_PAINT')
|
||||
@ -52,21 +62,21 @@ def enter_wp(context) -> bool:
|
||||
if not armature:
|
||||
return
|
||||
# Save all object visibility related info so it can be restored later.
|
||||
wpt['arm_enabled'] = armature.hide_viewport
|
||||
wpt['arm_hide'] = armature.hide_get()
|
||||
wpt['arm_in_front'] = armature.show_in_front
|
||||
wpt['arm_coll_assigned'] = False
|
||||
wp_toggle['arm_enabled'] = armature.hide_viewport
|
||||
wp_toggle['arm_hide'] = armature.hide_get()
|
||||
wp_toggle['arm_in_front'] = armature.show_in_front
|
||||
wp_toggle['arm_coll_assigned'] = False
|
||||
armature.hide_viewport = False
|
||||
armature.hide_set(False)
|
||||
armature.show_in_front = True
|
||||
if context.space_data.local_view:
|
||||
wpt['arm_local_view'] = armature.local_view_get(context.space_data)
|
||||
wp_toggle['arm_local_view'] = armature.local_view_get(context.space_data)
|
||||
armature.local_view_set(context.space_data, True)
|
||||
|
||||
# If the armature is still not visible, add it to the scene root collection.
|
||||
if not armature.visible_get() and not armature.name in context.scene.collection.objects:
|
||||
context.scene.collection.objects.link(armature)
|
||||
wpt['arm_coll_assigned'] = True
|
||||
wp_toggle['arm_coll_assigned'] = True
|
||||
|
||||
if armature.visible_get():
|
||||
context.view_layer.objects.active = armature
|
||||
@ -83,37 +93,37 @@ def leave_wp(context):
|
||||
obj = context.object
|
||||
wm = context.window_manager
|
||||
|
||||
if 'wpt' not in wm or 'mode' not in wm['wpt'].to_dict():
|
||||
if 'weight_paint_toggle' not in wm or 'mode' not in wm['weight_paint_toggle'].to_dict():
|
||||
# There is no saved data to restore from, nothing else to do.
|
||||
bpy.ops.object.mode_set(mode='OBJECT')
|
||||
return {'FINISHED'}
|
||||
|
||||
wpt = wm['wpt']
|
||||
wpt_as_dict = wpt.to_dict()
|
||||
wp_toggle = wm['weight_paint_toggle']
|
||||
wp_toggle_as_dict = wp_toggle.to_dict()
|
||||
|
||||
# Restore mode.
|
||||
bpy.ops.object.mode_set(mode=wpt_as_dict['mode'])
|
||||
bpy.ops.object.mode_set(mode=wp_toggle_as_dict['mode'])
|
||||
|
||||
# Reset the stored data
|
||||
wm['wpt'] = {}
|
||||
wm['weight_paint_toggle'] = {}
|
||||
# Flag to save that the last time the operator ran we were EXITING wp mode.
|
||||
wm['wpt']['last_switch_in'] = False
|
||||
wm['weight_paint_toggle']['last_switch_in'] = False
|
||||
|
||||
armature = get_armature_of_meshob(obj)
|
||||
if not armature:
|
||||
return
|
||||
# If an armature was un-hidden, hide it again.
|
||||
armature.hide_viewport = wpt_as_dict['arm_enabled']
|
||||
armature.hide_set(wpt_as_dict['arm_hide'])
|
||||
armature.show_in_front = wpt_as_dict['arm_in_front']
|
||||
armature.hide_viewport = wp_toggle_as_dict['arm_enabled']
|
||||
armature.hide_set(wp_toggle_as_dict['arm_hide'])
|
||||
armature.show_in_front = wp_toggle_as_dict['arm_in_front']
|
||||
|
||||
# Restore whether the armature is in local view or not.
|
||||
if 'arm_local_view' in wpt_as_dict and context.space_data.local_view:
|
||||
if 'arm_local_view' in wp_toggle_as_dict and context.space_data.local_view:
|
||||
armature.local_view_set(
|
||||
context.space_data, wpt_as_dict['arm_local_view'])
|
||||
context.space_data, wp_toggle_as_dict['arm_local_view'])
|
||||
|
||||
# Remove armature from scene root collection if it was moved there.
|
||||
if wpt_as_dict['arm_coll_assigned']:
|
||||
if wp_toggle_as_dict['arm_coll_assigned']:
|
||||
context.scene.collection.objects.unlink(armature)
|
||||
|
||||
return
|
||||
@ -141,6 +151,9 @@ class EASYWEIGHT_OT_toggle_weight_paint(Operator):
|
||||
return {'FINISHED'}
|
||||
else:
|
||||
leave_wp(context)
|
||||
wm = context.window_manager
|
||||
if 'weight_paint_toggle' in wm:
|
||||
del wm['weight_paint_toggle']
|
||||
return {'FINISHED'}
|
||||
|
||||
|
||||
|
@ -176,7 +176,6 @@ class EASYWEIGHT_OT_wp_context_menu(bpy.types.Operator):
|
||||
return wm.invoke_props_dialog(self)
|
||||
|
||||
def execute(self, context):
|
||||
context.scene.tool_settings.vertex_group_user = 'ACTIVE'
|
||||
return {'FINISHED'}
|
||||
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user