mirror of
https://github.com/bdunderscore/modular-avatar.git
synced 2025-03-03 20:34:56 +08:00
fix: remove ObjectIdentityComparer (#1211)
Apparently, it's safe to use Unity objects as keys in HashMaps, and doing so actually fixes some edge cases where assets are recreated as a new C# object.
This commit is contained in:
parent
e63a34e2ba
commit
ee64cafe02
@ -61,7 +61,7 @@ namespace nadena.dev.modular_avatar.core.editor
|
|||||||
var grouped = ctx.Observe(target,
|
var grouped = ctx.Observe(target,
|
||||||
t => (t.GroupedBones ?? Array.Empty<GameObject>())
|
t => (t.GroupedBones ?? Array.Empty<GameObject>())
|
||||||
.Select(obj => obj.transform)
|
.Select(obj => obj.transform)
|
||||||
.ToHashSet(new ObjectIdentityComparer<Transform>()),
|
.ToHashSet(),
|
||||||
(x, y) => x.SetEquals(y)
|
(x, y) => x.SetEquals(y)
|
||||||
);
|
);
|
||||||
|
|
||||||
|
@ -45,7 +45,7 @@ namespace nadena.dev.modular_avatar.core.editor
|
|||||||
{
|
{
|
||||||
var converters = context.AvatarRootObject.GetComponentsInChildren<ModularAvatarConvertConstraints>(true)
|
var converters = context.AvatarRootObject.GetComponentsInChildren<ModularAvatarConvertConstraints>(true)
|
||||||
.Select(c => c.gameObject)
|
.Select(c => c.gameObject)
|
||||||
.ToHashSet(new ObjectIdentityComparer<GameObject>());
|
.ToHashSet();
|
||||||
if (converters.Count == 0) return;
|
if (converters.Count == 0) return;
|
||||||
|
|
||||||
var constraintGameObjects = context.AvatarRootObject.GetComponentsInChildren<IConstraint>(true)
|
var constraintGameObjects = context.AvatarRootObject.GetComponentsInChildren<IConstraint>(true)
|
||||||
|
@ -5,7 +5,6 @@ using System.Collections.Generic;
|
|||||||
using System.Collections.Immutable;
|
using System.Collections.Immutable;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using nadena.dev.modular_avatar.core.editor.Simulator;
|
|
||||||
using nadena.dev.ndmf.preview;
|
using nadena.dev.ndmf.preview;
|
||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
using Object = UnityEngine.Object;
|
using Object = UnityEngine.Object;
|
||||||
@ -75,7 +74,7 @@ namespace nadena.dev.modular_avatar.core.editor
|
|||||||
|
|
||||||
ImmutableDictionary<SkinnedMeshRenderer, ImmutableList<(int, float)>>.Builder rendererStates =
|
ImmutableDictionary<SkinnedMeshRenderer, ImmutableList<(int, float)>>.Builder rendererStates =
|
||||||
ImmutableDictionary.CreateBuilder<SkinnedMeshRenderer, ImmutableList<(int, float)>>(
|
ImmutableDictionary.CreateBuilder<SkinnedMeshRenderer, ImmutableList<(int, float)>>(
|
||||||
new ObjectIdentityComparer<SkinnedMeshRenderer>()
|
|
||||||
);
|
);
|
||||||
var avatarRootTransform = avatarRoot.transform;
|
var avatarRootTransform = avatarRoot.transform;
|
||||||
|
|
||||||
|
@ -31,7 +31,7 @@ namespace nadena.dev.modular_avatar.core.editor.ScaleAdjuster
|
|||||||
public BoneState parentHint;
|
public BoneState parentHint;
|
||||||
}
|
}
|
||||||
|
|
||||||
private Dictionary<Component, BoneState> _bones = new(new ObjectIdentityComparer<Component>());
|
private readonly Dictionary<Component, BoneState> _bones = new();
|
||||||
//private List<BoneState> _states = new List<BoneState>();
|
//private List<BoneState> _states = new List<BoneState>();
|
||||||
|
|
||||||
public void Clear()
|
public void Clear()
|
||||||
|
@ -59,7 +59,7 @@ namespace nadena.dev.modular_avatar.core.editor
|
|||||||
var scaleAdjusters = ctx.GetComponentsByType<ModularAvatarScaleAdjuster>();
|
var scaleAdjusters = ctx.GetComponentsByType<ModularAvatarScaleAdjuster>();
|
||||||
|
|
||||||
var avatarToRenderer =
|
var avatarToRenderer =
|
||||||
new Dictionary<GameObject, HashSet<Renderer>>(new ObjectIdentityComparer<GameObject>());
|
new Dictionary<GameObject, HashSet<Renderer>>();
|
||||||
|
|
||||||
foreach (var root in ctx.GetAvatarRoots())
|
foreach (var root in ctx.GetAvatarRoots())
|
||||||
{
|
{
|
||||||
@ -72,8 +72,8 @@ namespace nadena.dev.modular_avatar.core.editor
|
|||||||
{
|
{
|
||||||
continue; // nested avatar descriptor
|
continue; // nested avatar descriptor
|
||||||
}
|
}
|
||||||
|
|
||||||
var renderers = new HashSet<Renderer>(new ObjectIdentityComparer<Renderer>());
|
var renderers = new HashSet<Renderer>();
|
||||||
avatarToRenderer.Add(root, renderers);
|
avatarToRenderer.Add(root, renderers);
|
||||||
|
|
||||||
foreach (var renderer in root.GetComponentsInChildren<Renderer>())
|
foreach (var renderer in root.GetComponentsInChildren<Renderer>())
|
||||||
@ -112,12 +112,12 @@ namespace nadena.dev.modular_avatar.core.editor
|
|||||||
private readonly Dictionary<Transform, Transform> _shadowBoneMap;
|
private readonly Dictionary<Transform, Transform> _shadowBoneMap;
|
||||||
|
|
||||||
// Map from bones found in initial proxy state to shadow bones (with scale adjuster bones substituted)
|
// Map from bones found in initial proxy state to shadow bones (with scale adjuster bones substituted)
|
||||||
private readonly Dictionary<Transform, Transform> _finalBonesMap = new(new ObjectIdentityComparer<Transform>());
|
private readonly Dictionary<Transform, Transform> _finalBonesMap = new();
|
||||||
|
|
||||||
private readonly Dictionary<ModularAvatarScaleAdjuster, Transform> _scaleAdjusters =
|
private readonly Dictionary<ModularAvatarScaleAdjuster, Transform> _scaleAdjusters =
|
||||||
new(new ObjectIdentityComparer<ModularAvatarScaleAdjuster>());
|
new();
|
||||||
|
|
||||||
private Dictionary<Renderer, Transform[]> _rendererBoneStates = new(new ObjectIdentityComparer<Renderer>());
|
private Dictionary<Renderer, Transform[]> _rendererBoneStates = new();
|
||||||
|
|
||||||
public ScaleAdjusterPreviewNode(ComputeContext context, RenderGroup group,
|
public ScaleAdjusterPreviewNode(ComputeContext context, RenderGroup group,
|
||||||
IEnumerable<(Renderer, Renderer)> proxyPairs)
|
IEnumerable<(Renderer, Renderer)> proxyPairs)
|
||||||
@ -169,7 +169,7 @@ namespace nadena.dev.modular_avatar.core.editor
|
|||||||
|
|
||||||
private HashSet<Transform> GetSourceBonesSet(ComputeContext context, List<(Renderer, Renderer)> proxyPairs)
|
private HashSet<Transform> GetSourceBonesSet(ComputeContext context, List<(Renderer, Renderer)> proxyPairs)
|
||||||
{
|
{
|
||||||
var bonesSet = new HashSet<Transform>(new ObjectIdentityComparer<Transform>());
|
var bonesSet = new HashSet<Transform>();
|
||||||
foreach (var (_, r) in proxyPairs)
|
foreach (var (_, r) in proxyPairs)
|
||||||
{
|
{
|
||||||
if (r == null) continue;
|
if (r == null) continue;
|
||||||
@ -248,7 +248,7 @@ namespace nadena.dev.modular_avatar.core.editor
|
|||||||
|
|
||||||
private Dictionary<Transform, Transform> CreateShadowBones(Transform[] srcBones)
|
private Dictionary<Transform, Transform> CreateShadowBones(Transform[] srcBones)
|
||||||
{
|
{
|
||||||
var srcToDst = new Dictionary<Transform, Transform>(new ObjectIdentityComparer<Transform>());
|
var srcToDst = new Dictionary<Transform, Transform>();
|
||||||
|
|
||||||
for (var i = 0; i < srcBones.Length; i++) GetShadowBone(srcBones[i]);
|
for (var i = 0; i < srcBones.Length; i++) GetShadowBone(srcBones[i]);
|
||||||
|
|
||||||
|
@ -1,23 +0,0 @@
|
|||||||
#region
|
|
||||||
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Runtime.CompilerServices;
|
|
||||||
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
namespace nadena.dev.modular_avatar
|
|
||||||
{
|
|
||||||
internal class ObjectIdentityComparer<T> : IEqualityComparer<T>
|
|
||||||
{
|
|
||||||
public bool Equals(T x, T y)
|
|
||||||
{
|
|
||||||
return (object)x == (object)y;
|
|
||||||
}
|
|
||||||
|
|
||||||
public int GetHashCode(T obj)
|
|
||||||
{
|
|
||||||
if (obj == null) return 0;
|
|
||||||
return RuntimeHelpers.GetHashCode(obj);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,3 +0,0 @@
|
|||||||
fileFormatVersion: 2
|
|
||||||
guid: e674cbd75db24fb2b238674cd7010edb
|
|
||||||
timeCreated: 1709448428
|
|
Loading…
Reference in New Issue
Block a user