refactor: remove reactive query (#911)

This commit is contained in:
bd_ 2024-07-02 12:38:27 +09:00 committed by GitHub
parent 4ad38c1229
commit 806d31fd82
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 83 additions and 63 deletions

View File

@ -19,7 +19,7 @@
"dependencies": {} "dependencies": {}
}, },
"nadena.dev.ndmf": { "nadena.dev.ndmf": {
"version": "1.5.0-alpha.2" "version": "1.5.0-alpha.3"
} }
} }
} }

View File

@ -37,37 +37,30 @@ namespace nadena.dev.modular_avatar.core.editor
return null; return null;
} }
public ReactiveValue<ImmutableList<RenderGroup>> TargetGroups { get; } = public ImmutableList<RenderGroup> GetTargetGroups(ComputeContext ctx)
ReactiveValue<ImmutableList<RenderGroup>>.Create( {
"Scale Adjuster: Find targets", var scaleAdjusters = ctx.GetComponentsByType<ModularAvatarScaleAdjuster>();
async ctx =>
var result = ImmutableList.CreateBuilder<RenderGroup>();
foreach (var adjuster in scaleAdjusters)
{ {
var scaleAdjusters = await ctx.Observe(CommonQueries.GetComponentsByType<ModularAvatarScaleAdjuster>()); if (adjuster == null) continue;
ImmutableList<RenderGroup>.Builder result = ImmutableList.CreateBuilder<RenderGroup>(); // Find parent object
// TODO: Reactive helper
foreach (var adjuster in scaleAdjusters) var root = FindAvatarRootObserving(ctx, adjuster.gameObject);
{ if (root == null) continue;
if (adjuster == null) continue;
// Find parent object
// TODO: Reactive helper
var root = FindAvatarRootObserving(ctx, adjuster.gameObject);
if (root == null) continue;
var renderers = ctx.GetComponentsInChildren<Renderer>(root, true); var renderers = ctx.GetComponentsInChildren<Renderer>(root, true);
foreach (var renderer in renderers) foreach (var renderer in renderers)
{ if (renderer is SkinnedMeshRenderer smr)
if (renderer is SkinnedMeshRenderer smr) result.Add(RenderGroup.For(renderer));
{ }
result.Add(RenderGroup.For(renderer));
}
}
}
return result.ToImmutable(); return result.ToImmutable();
}); }
public Task<IRenderFilterNode> Instantiate(RenderGroup group, IEnumerable<(Renderer, Renderer)> proxyPairs, public Task<IRenderFilterNode> Instantiate(RenderGroup group, IEnumerable<(Renderer, Renderer)> proxyPairs,
ComputeContext context) ComputeContext context)

View File

@ -17,40 +17,38 @@ namespace nadena.dev.modular_avatar.core.editor
{ {
public class ShapeChangerPreview : IRenderFilter public class ShapeChangerPreview : IRenderFilter
{ {
public ReactiveValue<ImmutableList<RenderGroup>> TargetGroups { get; } public ImmutableList<RenderGroup> GetTargetGroups(ComputeContext ctx)
= ReactiveValue<ImmutableList<RenderGroup>>.Create( {
"ShapeChangerPreview.TargetGroups", async ctx => var allChangers = ctx.GetComponentsByType<ModularAvatarShapeChanger>();
var groups =
new Dictionary<Renderer, ImmutableList<ModularAvatarShapeChanger>.Builder>(
new ObjectIdentityComparer<Renderer>());
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<SkinnedMeshRenderer>(target);
if (renderer == null) continue;
if (!groups.TryGetValue(renderer, out var group))
{ {
var allChangers = group = ImmutableList.CreateBuilder<ModularAvatarShapeChanger>();
await ctx.Observe(CommonQueries.GetComponentsByType<ModularAvatarShapeChanger>()); groups[renderer] = group;
}
Dictionary<Renderer, ImmutableList<ModularAvatarShapeChanger>.Builder> groups = group.Add(changer);
new Dictionary<Renderer, ImmutableList<ModularAvatarShapeChanger>.Builder>( }
new ObjectIdentityComparer<Renderer>());
return groups.Select(g => RenderGroup.For(g.Key).WithData(g.Value.ToImmutable()))
foreach (var changer in allChangers) .ToImmutableList();
{ }
// TODO: observe avatar root
ctx.Observe(changer);
if (!ctx.ActiveAndEnabled(changer)) continue;
var target = ctx.Observe(changer.targetRenderer.Get(changer));
var renderer = ctx.GetComponent<SkinnedMeshRenderer>(target);
if (renderer == null) continue;
if (!groups.TryGetValue(renderer, out var group))
{
group = ImmutableList.CreateBuilder<ModularAvatarShapeChanger>();
groups[renderer] = group;
}
group.Add(changer);
}
return groups.Select(g => RenderGroup.For(g.Key).WithData(g.Value.ToImmutable()))
.ToImmutableList();
});
public async Task<IRenderFilterNode> Instantiate( public async Task<IRenderFilterNode> Instantiate(
RenderGroup group, RenderGroup group,
@ -104,15 +102,24 @@ namespace nadena.dev.modular_avatar.core.editor
_changers = _group.GetData<ImmutableList<ModularAvatarShapeChanger>>(); _changers = _group.GetData<ImmutableList<ModularAvatarShapeChanger>>();
var toDelete = new HashSet<int>(); var toDelete = new HashSet<int>();
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) foreach (var changer in _changers)
{ {
context.Observe(changer); var shapes = context.Observe(changer, c => c.Shapes.ToImmutableList(), Enumerable.SequenceEqual);
if (!IsChangerActive(changer, context)) continue; if (!IsChangerActive(changer, context)) continue;
foreach (var shape in changer.Shapes) foreach (var shape in shapes)
if (shape.ChangeType == ShapeChangeType.Delete) if (shape.ChangeType == ShapeChangeType.Delete)
{ {
var index = mesh.GetBlendShapeIndex(shape.ShapeName); var index = mesh.GetBlendShapeIndex(shape.ShapeName);

View File

@ -22,6 +22,26 @@ namespace nadena.dev.modular_avatar.core
public string ShapeName; public string ShapeName;
public ShapeChangeType ChangeType; public ShapeChangeType ChangeType;
public float Value; 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")] [AddComponentMenu("Modular Avatar/MA Shape Changer")]

View File

@ -16,6 +16,6 @@
}, },
"vpmDependencies": { "vpmDependencies": {
"com.vrchat.avatars": ">=3.4.0", "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"
} }
} }