refactor: remove reactive query ()

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": {}
},
"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;
}
public ReactiveValue<ImmutableList<RenderGroup>> TargetGroups { get; } =
ReactiveValue<ImmutableList<RenderGroup>>.Create(
"Scale Adjuster: Find targets",
async ctx =>
public ImmutableList<RenderGroup> GetTargetGroups(ComputeContext ctx)
{
var scaleAdjusters = ctx.GetComponentsByType<ModularAvatarScaleAdjuster>();
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>();
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<Renderer>(root, true);
var renderers = ctx.GetComponentsInChildren<Renderer>(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<IRenderFilterNode> Instantiate(RenderGroup group, IEnumerable<(Renderer, Renderer)> proxyPairs,
ComputeContext context)

View File

@ -17,40 +17,38 @@ namespace nadena.dev.modular_avatar.core.editor
{
public class ShapeChangerPreview : IRenderFilter
{
public ReactiveValue<ImmutableList<RenderGroup>> TargetGroups { get; }
= ReactiveValue<ImmutableList<RenderGroup>>.Create(
"ShapeChangerPreview.TargetGroups", async ctx =>
public ImmutableList<RenderGroup> GetTargetGroups(ComputeContext 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 =
await ctx.Observe(CommonQueries.GetComponentsByType<ModularAvatarShapeChanger>());
group = ImmutableList.CreateBuilder<ModularAvatarShapeChanger>();
groups[renderer] = group;
}
Dictionary<Renderer, ImmutableList<ModularAvatarShapeChanger>.Builder> groups =
new Dictionary<Renderer, ImmutableList<ModularAvatarShapeChanger>.Builder>(
new ObjectIdentityComparer<Renderer>());
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<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();
});
group.Add(changer);
}
return groups.Select(g => RenderGroup.For(g.Key).WithData(g.Value.ToImmutable()))
.ToImmutableList();
}
public async Task<IRenderFilterNode> Instantiate(
RenderGroup group,
@ -104,15 +102,24 @@ namespace nadena.dev.modular_avatar.core.editor
_changers = _group.GetData<ImmutableList<ModularAvatarShapeChanger>>();
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)
{
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);

View File

@ -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")]

View File

@ -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"
}
}