From 622ea7d387698361d1349a7fd221ce83cf6d1632 Mon Sep 17 00:00:00 2001 From: raiti-chan Date: Mon, 12 Dec 2022 18:49:32 +0900 Subject: [PATCH 1/7] Fix validation methods to avoid infinite loops. --- .../Editor/Inspector/MenuInstallerEditor.cs | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/Packages/nadena.dev.modular-avatar/Editor/Inspector/MenuInstallerEditor.cs b/Packages/nadena.dev.modular-avatar/Editor/Inspector/MenuInstallerEditor.cs index c7dba388..b9566fe1 100644 --- a/Packages/nadena.dev.modular-avatar/Editor/Inspector/MenuInstallerEditor.cs +++ b/Packages/nadena.dev.modular-avatar/Editor/Inspector/MenuInstallerEditor.cs @@ -205,9 +205,12 @@ namespace nadena.dev.modular_avatar.core.editor return _avatarMenus == null || _avatarMenus.Contains(menu); } - private static ValidateExpressionMenuIconResult ValidateExpressionMenuIcon(VRCExpressionsMenu menu) + private static ValidateExpressionMenuIconResult ValidateExpressionMenuIcon(VRCExpressionsMenu menu, HashSet visitedMenus = null) { if (menu == null) return ValidateExpressionMenuIconResult.Success; + if (visitedMenus == null) visitedMenus = new HashSet(); + if (visitedMenus.Contains(menu)) return ValidateExpressionMenuIconResult.Success; + visitedMenus.Add(menu); foreach (VRCExpressionsMenu.Control control in menu.controls) { @@ -224,7 +227,7 @@ namespace nadena.dev.modular_avatar.core.editor // SubMenu if (control.type != VRCExpressionsMenu.Control.ControlType.SubMenu) continue; - ValidateExpressionMenuIconResult subMenuResult = ValidateExpressionMenuIcon(control.subMenu); + ValidateExpressionMenuIconResult subMenuResult = ValidateExpressionMenuIcon(control.subMenu, visitedMenus); if (subMenuResult != ValidateExpressionMenuIconResult.Success) return subMenuResult; } From 27bb7b631272205180bfc2108bac57cccbfebff1 Mon Sep 17 00:00:00 2001 From: anatawa12 Date: Fri, 9 Dec 2022 13:19:15 +0900 Subject: [PATCH 2/7] fix: worldUpObject of AimConstraint and LookAtConstraint is not fixed up --- .../Editor/MergeArmatureHook.cs | 50 ++++++++++++++++++- 1 file changed, 49 insertions(+), 1 deletion(-) diff --git a/Packages/nadena.dev.modular-avatar/Editor/MergeArmatureHook.cs b/Packages/nadena.dev.modular-avatar/Editor/MergeArmatureHook.cs index a4429ae6..0c792dff 100644 --- a/Packages/nadena.dev.modular-avatar/Editor/MergeArmatureHook.cs +++ b/Packages/nadena.dev.modular-avatar/Editor/MergeArmatureHook.cs @@ -91,6 +91,22 @@ namespace nadena.dev.modular_avatar.core.editor } } + foreach (var c in avatarGameObject.transform.GetComponentsInChildren(true)) + { + if (!AddedConstraints.Contains(c)) + { + FixupAimConstraint(c); + } + } + + foreach (var c in avatarGameObject.transform.GetComponentsInChildren(true)) + { + if (!AddedConstraints.Contains(c)) + { + FixupLookAtConstraint(c); + } + } + foreach (var bone in ToDelete) UnityEngine.Object.DestroyImmediate(bone); return true; @@ -119,6 +135,38 @@ namespace nadena.dev.modular_avatar.core.editor } } + private void FixupAimConstraint(AimConstraint constraint) + { + if (constraint.worldUpObject == null) return; + if (!BoneRemappings.TryGetValue(constraint.worldUpObject, out var remap)) return; + var retarget = BoneDatabase.GetRetargetedBone(remap); + + if (retarget != null) + { + constraint.worldUpObject = retarget; + } + else + { + constraint.worldUpObject = remap; + } + } + + private void FixupLookAtConstraint(LookAtConstraint constraint) + { + if (constraint.worldUpObject == null) return; + if (!BoneRemappings.TryGetValue(constraint.worldUpObject, out var remap)) return; + var retarget = BoneDatabase.GetRetargetedBone(remap); + + if (retarget != null) + { + constraint.worldUpObject = retarget; + } + else + { + constraint.worldUpObject = remap; + } + } + private void UpdateBoneReferences(Component c, Retargetable retargetable = Retargetable.Disable) { SerializedObject so = new SerializedObject(c); @@ -397,4 +445,4 @@ namespace nadena.dev.modular_avatar.core.editor } } } -} \ No newline at end of file +} From 664a6c3081305b20733eb149f6161a860f7866a6 Mon Sep 17 00:00:00 2001 From: anatawa12 Date: Sat, 10 Dec 2022 14:11:06 +0900 Subject: [PATCH 3/7] chore: extract mapping constraint source to one method --- .../Editor/MergeArmatureHook.cs | 46 ++++--------------- 1 file changed, 10 insertions(+), 36 deletions(-) diff --git a/Packages/nadena.dev.modular-avatar/Editor/MergeArmatureHook.cs b/Packages/nadena.dev.modular-avatar/Editor/MergeArmatureHook.cs index 0c792dff..e5eae966 100644 --- a/Packages/nadena.dev.modular-avatar/Editor/MergeArmatureHook.cs +++ b/Packages/nadena.dev.modular-avatar/Editor/MergeArmatureHook.cs @@ -118,53 +118,27 @@ namespace nadena.dev.modular_avatar.core.editor for (int i = 0; i < nSources; i++) { var source = constraint.GetSource(i); - if (source.sourceTransform == null) continue; - if (!BoneRemappings.TryGetValue(source.sourceTransform, out var remap)) continue; - var retarget = BoneDatabase.GetRetargetedBone(remap); - - if (retarget != null) - { - source.sourceTransform = retarget; - } - else - { - source.sourceTransform = remap; - } - + source.sourceTransform = MapConstraintSource(source.sourceTransform); constraint.SetSource(i, source); } } private void FixupAimConstraint(AimConstraint constraint) { - if (constraint.worldUpObject == null) return; - if (!BoneRemappings.TryGetValue(constraint.worldUpObject, out var remap)) return; - var retarget = BoneDatabase.GetRetargetedBone(remap); - - if (retarget != null) - { - constraint.worldUpObject = retarget; - } - else - { - constraint.worldUpObject = remap; - } + constraint.worldUpObject = MapConstraintSource(constraint.worldUpObject); } private void FixupLookAtConstraint(LookAtConstraint constraint) { - if (constraint.worldUpObject == null) return; - if (!BoneRemappings.TryGetValue(constraint.worldUpObject, out var remap)) return; - var retarget = BoneDatabase.GetRetargetedBone(remap); + constraint.worldUpObject = MapConstraintSource(constraint.worldUpObject); + } - if (retarget != null) - { - constraint.worldUpObject = retarget; - } - else - { - constraint.worldUpObject = remap; - } + private Transform MapConstraintSource(Transform transform) + { + if (transform == null) return null; + if (!BoneRemappings.TryGetValue(transform, out var remap)) return transform; + var retarget = BoneDatabase.GetRetargetedBone(remap); + return retarget != null ? retarget : remap; } private void UpdateBoneReferences(Component c, Retargetable retargetable = Retargetable.Disable) From 42d83304abca633db972d12893eb79eef1ea1cea Mon Sep 17 00:00:00 2001 From: anatawa12 Date: Sat, 10 Dec 2022 14:14:52 +0900 Subject: [PATCH 4/7] chore: reduce # of GetComponentsInChildren --- .../Editor/MergeArmatureHook.cs | 32 +++++-------------- 1 file changed, 8 insertions(+), 24 deletions(-) diff --git a/Packages/nadena.dev.modular-avatar/Editor/MergeArmatureHook.cs b/Packages/nadena.dev.modular-avatar/Editor/MergeArmatureHook.cs index e5eae966..01ef7fc2 100644 --- a/Packages/nadena.dev.modular-avatar/Editor/MergeArmatureHook.cs +++ b/Packages/nadena.dev.modular-avatar/Editor/MergeArmatureHook.cs @@ -91,22 +91,6 @@ namespace nadena.dev.modular_avatar.core.editor } } - foreach (var c in avatarGameObject.transform.GetComponentsInChildren(true)) - { - if (!AddedConstraints.Contains(c)) - { - FixupAimConstraint(c); - } - } - - foreach (var c in avatarGameObject.transform.GetComponentsInChildren(true)) - { - if (!AddedConstraints.Contains(c)) - { - FixupLookAtConstraint(c); - } - } - foreach (var bone in ToDelete) UnityEngine.Object.DestroyImmediate(bone); return true; @@ -121,16 +105,16 @@ namespace nadena.dev.modular_avatar.core.editor source.sourceTransform = MapConstraintSource(source.sourceTransform); constraint.SetSource(i, source); } - } - private void FixupAimConstraint(AimConstraint constraint) - { - constraint.worldUpObject = MapConstraintSource(constraint.worldUpObject); - } + if (constraint is AimConstraint aimConstraint) + { + aimConstraint.worldUpObject = MapConstraintSource(aimConstraint.worldUpObject); + } - private void FixupLookAtConstraint(LookAtConstraint constraint) - { - constraint.worldUpObject = MapConstraintSource(constraint.worldUpObject); + if (constraint is LookAtConstraint lookAtConstraint) + { + lookAtConstraint.worldUpObject = MapConstraintSource(lookAtConstraint.worldUpObject); + } } private Transform MapConstraintSource(Transform transform) From 880770ed018c1097af7a1e1bc0a72b370d384385 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 12 Dec 2022 05:12:13 +0000 Subject: [PATCH 5/7] Bump typescript from 4.9.3 to 4.9.4 in /docs Bumps [typescript](https://github.com/Microsoft/TypeScript) from 4.9.3 to 4.9.4. - [Release notes](https://github.com/Microsoft/TypeScript/releases) - [Commits](https://github.com/Microsoft/TypeScript/compare/v4.9.3...v4.9.4) --- updated-dependencies: - dependency-name: typescript dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- docs/package.json | 2 +- docs/yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/package.json b/docs/package.json index e7768865..1466bbdd 100644 --- a/docs/package.json +++ b/docs/package.json @@ -29,7 +29,7 @@ "devDependencies": { "@docusaurus/module-type-aliases": "2.2.0", "@tsconfig/docusaurus": "^1.0.5", - "typescript": "^4.8.4" + "typescript": "^4.9.4" }, "resolutions": { "trim": "1.0.1", diff --git a/docs/yarn.lock b/docs/yarn.lock index 14b79192..44835d1f 100644 --- a/docs/yarn.lock +++ b/docs/yarn.lock @@ -7039,10 +7039,10 @@ typedarray-to-buffer@^3.1.5: dependencies: is-typedarray "^1.0.0" -typescript@^4.8.4: - version "4.9.3" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.3.tgz#3aea307c1746b8c384435d8ac36b8a2e580d85db" - integrity sha512-CIfGzTelbKNEnLpLdGFgdyKhG23CKdKgQPOBc+OUNrkJ2vr+KSzsSV5kq5iWhEQbok+quxgGzrAtGWCyU7tHnA== +typescript@^4.9.4: + version "4.9.4" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.4.tgz#a2a3d2756c079abda241d75f149df9d561091e78" + integrity sha512-Uz+dTXYzxXXbsFpM86Wh3dKCxrQqUcVMxwU54orwlJjOpO3ao8L7j5lH+dWfTwgCwIuM9GQ2kvVotzYJMXTBZg== ua-parser-js@^0.7.30: version "0.7.32" From 1a114b65feabb428aa63c35303bbaf585dfebd5a Mon Sep 17 00:00:00 2001 From: bd_ Date: Sat, 17 Dec 2022 16:52:14 +0900 Subject: [PATCH 6/7] Fix blendshape sync not using remapped names for animations --- .../Editor/BlendshapeSyncAnimationProcessor.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Packages/nadena.dev.modular-avatar/Editor/BlendshapeSyncAnimationProcessor.cs b/Packages/nadena.dev.modular-avatar/Editor/BlendshapeSyncAnimationProcessor.cs index 0fb88eac..4f76ba85 100644 --- a/Packages/nadena.dev.modular-avatar/Editor/BlendshapeSyncAnimationProcessor.cs +++ b/Packages/nadena.dev.modular-avatar/Editor/BlendshapeSyncAnimationProcessor.cs @@ -94,7 +94,7 @@ namespace nadena.dev.modular_avatar.core.editor _bindingMappings[srcBinding] = dstBindings; } - dstBindings.Add(new SummaryBinding(targetObj, binding.Blendshape)); + dstBindings.Add(new SummaryBinding(targetObj, binding.LocalBlendshape)); } } From df8d0d7981a9badaa76061d34eb10e31ba1522b9 Mon Sep 17 00:00:00 2001 From: bd_ Date: Sat, 17 Dec 2022 16:35:50 +0900 Subject: [PATCH 7/7] Workaround Merge Armature breaking parent PBs The Merge Armature logic is in need of an overall rewrite, but this works around issues where added (duplicate) bones break PBs in parents, by adding these to parent PB ignore lists. --- Packages/nadena.dev.modular-avatar/Editor/MergeArmatureHook.cs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Packages/nadena.dev.modular-avatar/Editor/MergeArmatureHook.cs b/Packages/nadena.dev.modular-avatar/Editor/MergeArmatureHook.cs index 01ef7fc2..1b4d7076 100644 --- a/Packages/nadena.dev.modular-avatar/Editor/MergeArmatureHook.cs +++ b/Packages/nadena.dev.modular-avatar/Editor/MergeArmatureHook.cs @@ -327,6 +327,9 @@ namespace nadena.dev.modular_avatar.core.editor transformPath = RuntimeUtil.AvatarRootPath(newParent), path = srcPath }); + // The new merged leaf (if it's retained below) can break parent bone physbones. Add a PB Blocker + // to prevent this becoming an issue. + mergedSrcBone.GetOrAddComponent(); } BoneRemappings[src.transform] = mergedSrcBone.transform;