fix: minor issues with scale adjuster (#679)

* fix: undo operations can cause scale adjuster to perma-disable meshes

* fix: tool is left hidden after scale adjuster is deleted
This commit is contained in:
bd_ 2024-02-18 21:47:48 +09:00 committed by GitHub
parent 6eab55ae26
commit d57e211d0b
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 47 additions and 22 deletions

View File

@ -127,10 +127,30 @@ namespace nadena.dev.modular_avatar.core.editor
private static Vector3 _gizmoScale; private static Vector3 _gizmoScale;
private static Quaternion _handleRotation; private static Quaternion _handleRotation;
private static bool _toolHidden;
private static bool ToolHidden
{
get => _toolHidden;
set
{
if (_toolHidden && !value)
{
Tools.hidden = false;
} else if (value)
{
Tools.hidden = true;
}
_toolHidden = value;
}
}
private static void OnSelectionChanged() private static void OnSelectionChanged()
{ {
_selection.Clear(); _selection.Clear();
Tools.hidden = false; ToolHidden = false;
_active = null; _active = null;
} }
@ -140,7 +160,7 @@ namespace nadena.dev.modular_avatar.core.editor
{ {
if (_active == true) if (_active == true)
{ {
Tools.hidden = false; ToolHidden = false;
_active = null; _active = null;
} }
@ -149,10 +169,12 @@ namespace nadena.dev.modular_avatar.core.editor
if (ShouldEnable()) if (ShouldEnable())
{ {
Tools.hidden = true; ToolHidden = true;
} }
else else
{ {
ToolHidden = false;
return; return;
} }

View File

@ -15,7 +15,7 @@ namespace nadena.dev.modular_avatar.core
[RequireComponent(typeof(SkinnedMeshRenderer))] [RequireComponent(typeof(SkinnedMeshRenderer))]
internal class ScaleAdjusterRenderer : MonoBehaviour, IEditorOnly internal class ScaleAdjusterRenderer : MonoBehaviour, IEditorOnly
{ {
private static event Action OnPreInspector; private static event Action OnClearAllOverrides;
private static int RecreateHierarchyIndexCount = 0; private static int RecreateHierarchyIndexCount = 0;
#if UNITY_EDITOR #if UNITY_EDITOR
@ -72,9 +72,10 @@ namespace nadena.dev.modular_avatar.core
private void OnDestroy() private void OnDestroy()
{ {
ClearOverrides(); ClearAllOverrides();
} }
#if UNITY_EDITOR
private void Update() private void Update()
{ {
if (myRenderer == null) if (myRenderer == null)
@ -124,7 +125,7 @@ namespace nadena.dev.modular_avatar.core
myRenderer.SetBlendShapeWeight(i, parentRenderer.GetBlendShapeWeight(i)); myRenderer.SetBlendShapeWeight(i, parentRenderer.GetBlendShapeWeight(i));
} }
ClearOverrides(); ClearAllOverrides();
myRenderer.enabled = parentRenderer.enabled; myRenderer.enabled = parentRenderer.enabled;
} }
@ -136,7 +137,7 @@ namespace nadena.dev.modular_avatar.core
return; return;
} }
ClearOverrides(); ClearAllOverrides();
if (!parentRenderer.enabled || !parentRenderer.gameObject.activeInHierarchy) if (!parentRenderer.enabled || !parentRenderer.gameObject.activeInHierarchy)
{ {
@ -145,23 +146,25 @@ namespace nadena.dev.modular_avatar.core
parentRenderer.enabled = false; parentRenderer.enabled = false;
wasActive = true; wasActive = true;
OnPreInspector += ClearOverrides; var objName = parentRenderer.gameObject.name;
OnClearAllOverrides += ClearLocalOverride;
// Sometimes - e.g. around domain reloads or undo operations - the parent renderer's enabled field might get
// re-disabled; re-enabler it in delayCall in this case.
UnityEditor.EditorApplication.delayCall += ClearLocalOverride;
}
#endif
private void ClearLocalOverride()
{
if (parentRenderer != null)
{
parentRenderer.enabled = true;
}
} }
private void OnPostRender() private void OnPostRender()
{ {
ClearOverrides(); ClearAllOverrides();
}
private void ClearOverrides()
{
if (this == null) return;
if (wasActive && parentRenderer != null)
{
parentRenderer.enabled = true;
wasActive = false;
}
} }
public void ClearBoneCache() public void ClearBoneCache()
@ -171,8 +174,8 @@ namespace nadena.dev.modular_avatar.core
internal static void ClearAllOverrides() internal static void ClearAllOverrides()
{ {
OnPreInspector?.Invoke(); OnClearAllOverrides?.Invoke();
OnPreInspector = null; OnClearAllOverrides = null;
} }
} }
} }