From 806d31fd8284615fb3d3bdd0d1a6a2e60cb4de78 Mon Sep 17 00:00:00 2001 From: bd_ Date: Tue, 2 Jul 2024 12:38:27 +0900 Subject: [PATCH] refactor: remove reactive query (#911) --- .github/ProjectRoot/vpm-manifest-2022.json | 2 +- Editor/ScaleAdjuster/ScaleAdjusterPreview.cs | 45 +++++------- Editor/ShapeChanger/ShapeChangerPreview.cs | 77 +++++++++++--------- Runtime/ModularAvatarShapeChanger.cs | 20 +++++ package.json | 2 +- 5 files changed, 83 insertions(+), 63 deletions(-) diff --git a/.github/ProjectRoot/vpm-manifest-2022.json b/.github/ProjectRoot/vpm-manifest-2022.json index 9e7156ec..fd2822c3 100644 --- a/.github/ProjectRoot/vpm-manifest-2022.json +++ b/.github/ProjectRoot/vpm-manifest-2022.json @@ -19,7 +19,7 @@ "dependencies": {} }, "nadena.dev.ndmf": { - "version": "1.5.0-alpha.2" + "version": "1.5.0-alpha.3" } } } \ No newline at end of file diff --git a/Editor/ScaleAdjuster/ScaleAdjusterPreview.cs b/Editor/ScaleAdjuster/ScaleAdjusterPreview.cs index f3a08032..5177a872 100644 --- a/Editor/ScaleAdjuster/ScaleAdjusterPreview.cs +++ b/Editor/ScaleAdjuster/ScaleAdjusterPreview.cs @@ -37,37 +37,30 @@ namespace nadena.dev.modular_avatar.core.editor return null; } - public ReactiveValue> TargetGroups { get; } = - ReactiveValue>.Create( - "Scale Adjuster: Find targets", - async ctx => + public ImmutableList GetTargetGroups(ComputeContext ctx) + { + var scaleAdjusters = ctx.GetComponentsByType(); + + var result = ImmutableList.CreateBuilder(); + + foreach (var adjuster in scaleAdjusters) { - var scaleAdjusters = await ctx.Observe(CommonQueries.GetComponentsByType()); + if (adjuster == null) continue; - ImmutableList.Builder result = ImmutableList.CreateBuilder(); - - foreach (var adjuster in scaleAdjusters) - { - if (adjuster == null) continue; - - // Find parent object - // TODO: Reactive helper - var root = FindAvatarRootObserving(ctx, adjuster.gameObject); - if (root == null) continue; + // Find parent object + // TODO: Reactive helper + var root = FindAvatarRootObserving(ctx, adjuster.gameObject); + if (root == null) continue; - var renderers = ctx.GetComponentsInChildren(root, true); + var renderers = ctx.GetComponentsInChildren(root, true); - foreach (var renderer in renderers) - { - if (renderer is SkinnedMeshRenderer smr) - { - result.Add(RenderGroup.For(renderer)); - } - } - } + foreach (var renderer in renderers) + if (renderer is SkinnedMeshRenderer smr) + result.Add(RenderGroup.For(renderer)); + } - return result.ToImmutable(); - }); + return result.ToImmutable(); + } public Task Instantiate(RenderGroup group, IEnumerable<(Renderer, Renderer)> proxyPairs, ComputeContext context) diff --git a/Editor/ShapeChanger/ShapeChangerPreview.cs b/Editor/ShapeChanger/ShapeChangerPreview.cs index 5932705e..c737439d 100644 --- a/Editor/ShapeChanger/ShapeChangerPreview.cs +++ b/Editor/ShapeChanger/ShapeChangerPreview.cs @@ -17,40 +17,38 @@ namespace nadena.dev.modular_avatar.core.editor { public class ShapeChangerPreview : IRenderFilter { - public ReactiveValue> TargetGroups { get; } - = ReactiveValue>.Create( - "ShapeChangerPreview.TargetGroups", async ctx => + public ImmutableList GetTargetGroups(ComputeContext ctx) + { + var allChangers = ctx.GetComponentsByType(); + + var groups = + new Dictionary.Builder>( + new ObjectIdentityComparer()); + + foreach (var changer in allChangers) + { + if (changer == null) continue; + + // TODO: observe avatar root + if (!ctx.ActiveAndEnabled(changer)) continue; + + var target = ctx.Observe(changer.targetRenderer.Get(changer)); + var renderer = ctx.GetComponent(target); + + if (renderer == null) continue; + + if (!groups.TryGetValue(renderer, out var group)) { - var allChangers = - await ctx.Observe(CommonQueries.GetComponentsByType()); + group = ImmutableList.CreateBuilder(); + groups[renderer] = group; + } - Dictionary.Builder> groups = - new Dictionary.Builder>( - new ObjectIdentityComparer()); - - foreach (var changer in allChangers) - { - // TODO: observe avatar root - ctx.Observe(changer); - if (!ctx.ActiveAndEnabled(changer)) continue; - - var target = ctx.Observe(changer.targetRenderer.Get(changer)); - var renderer = ctx.GetComponent(target); - - if (renderer == null) continue; - - if (!groups.TryGetValue(renderer, out var group)) - { - group = ImmutableList.CreateBuilder(); - groups[renderer] = group; - } - - group.Add(changer); - } - - return groups.Select(g => RenderGroup.For(g.Key).WithData(g.Value.ToImmutable())) - .ToImmutableList(); - }); + group.Add(changer); + } + + return groups.Select(g => RenderGroup.For(g.Key).WithData(g.Value.ToImmutable())) + .ToImmutableList(); + } public async Task Instantiate( RenderGroup group, @@ -104,15 +102,24 @@ namespace nadena.dev.modular_avatar.core.editor _changers = _group.GetData>(); var toDelete = new HashSet(); - var mesh = context.Observe(proxy.sharedMesh); + var mesh = context.Observe(proxy, p => p.sharedMesh, (a, b) => + { + if (a != b) + { + Debug.Log($"mesh changed {a.GetInstanceID()} -> {b.GetInstanceID()}"); + return false; + } + + return true; + }); foreach (var changer in _changers) { - context.Observe(changer); + var shapes = context.Observe(changer, c => c.Shapes.ToImmutableList(), Enumerable.SequenceEqual); if (!IsChangerActive(changer, context)) continue; - foreach (var shape in changer.Shapes) + foreach (var shape in shapes) if (shape.ChangeType == ShapeChangeType.Delete) { var index = mesh.GetBlendShapeIndex(shape.ShapeName); diff --git a/Runtime/ModularAvatarShapeChanger.cs b/Runtime/ModularAvatarShapeChanger.cs index c4f7ffdb..0b0bb8e5 100644 --- a/Runtime/ModularAvatarShapeChanger.cs +++ b/Runtime/ModularAvatarShapeChanger.cs @@ -22,6 +22,26 @@ namespace nadena.dev.modular_avatar.core public string ShapeName; public ShapeChangeType ChangeType; public float Value; + + public bool Equals(ChangedShape other) + { + return ShapeName == other.ShapeName && ChangeType == other.ChangeType && Value.Equals(other.Value); + } + + public override bool Equals(object obj) + { + return obj is ChangedShape other && Equals(other); + } + + public override int GetHashCode() + { + return HashCode.Combine(ShapeName, (int)ChangeType, Value); + } + + public override string ToString() + { + return $"{ShapeName} {ChangeType} {Value}"; + } } [AddComponentMenu("Modular Avatar/MA Shape Changer")] diff --git a/package.json b/package.json index e5af1a48..8a722c98 100644 --- a/package.json +++ b/package.json @@ -16,6 +16,6 @@ }, "vpmDependencies": { "com.vrchat.avatars": ">=3.4.0", - "nadena.dev.ndmf": ">=1.5.0-alpha.2 <2.0.0-a" + "nadena.dev.ndmf": ">=1.5.0-alpha.3 <2.0.0-a" } }