From 6837d3f7ee6fea6e727a73ff500c8289bb1a9275 Mon Sep 17 00:00:00 2001 From: PopSlime Date: Fri, 24 Feb 2023 15:25:04 +0800 Subject: [PATCH] Make the group in skin container readonly. --- Assets/Cryville/Crtr/EffectInstance.cs | 8 ++--- .../Cryville/Crtr/Event/ContainerHandler.cs | 6 ++-- Assets/Cryville/Crtr/SkinContainer.cs | 34 ++++++++++--------- 3 files changed, 25 insertions(+), 23 deletions(-) diff --git a/Assets/Cryville/Crtr/EffectInstance.cs b/Assets/Cryville/Crtr/EffectInstance.cs index 63a56ba..2c613de 100644 --- a/Assets/Cryville/Crtr/EffectInstance.cs +++ b/Assets/Cryville/Crtr/EffectInstance.cs @@ -12,11 +12,11 @@ namespace Cryville.Crtr { public Transform RootTransform { get; private set; } public EffectInstance(EffectDefinition def) { _def = def; - _skinContainer = new SkinContainer(_def.elements); + _skinContainer = new SkinContainer(this, _def.elements); RootTransform = new GameObject("effect:" + GetHashCode().ToString(CultureInfo.InvariantCulture)).transform; SkinContext = new SkinContext(RootTransform); ChartPlayer.etor.ContextCascadeInsertBlock(); - _skinContainer.MatchStatic(this); + _skinContainer.MatchStatic(); ChartPlayer.etor.ContextCascadeDiscardBlock(); foreach (var i in RootTransform.GetComponentsInChildren()) i.Init(); @@ -39,7 +39,7 @@ namespace Cryville.Crtr { readonly PropOp _durationOp; public double EndTime { get { return _startTime + _duration; } } public void Tick() { - _skinContainer.MatchDynamic(this, 1); + _skinContainer.MatchDynamic(1); } public void OnEmit(double time) { _startTime = time; @@ -47,7 +47,7 @@ namespace Cryville.Crtr { ChartPlayer.etor.ContextCascadeInsert(); ChartPlayer.etor.ContextCascadeUpdate(_VAR_EFFECT_INDEX, _indexSrc); ChartPlayer.etor.Evaluate(_durationOp, _def.duration); - _skinContainer.MatchDynamic(this, 0); + _skinContainer.MatchDynamic(0); ChartPlayer.etor.ContextCascadeDiscard(); } public void OnDone() { diff --git a/Assets/Cryville/Crtr/Event/ContainerHandler.cs b/Assets/Cryville/Crtr/Event/ContainerHandler.cs index 75ee0e2..f959e6f 100644 --- a/Assets/Cryville/Crtr/Event/ContainerHandler.cs +++ b/Assets/Cryville/Crtr/Event/ContainerHandler.cs @@ -70,7 +70,7 @@ namespace Cryville.Crtr.Event { SkinContainer skinContainer; protected Judge judge; public void AttachSystems(PdtSkin skin, Judge judge) { - skinContainer = new SkinContainer(skin.elements); + skinContainer = new SkinContainer(this, skin.elements); this.judge = judge; } @@ -126,7 +126,7 @@ namespace Cryville.Crtr.Event { public virtual void Init() { ChartPlayer.etor.ContextState = ps; ChartPlayer.etor.ContextEvent = Container; - skinContainer.MatchStatic(this); + skinContainer.MatchStatic(); ChartPlayer.etor.ContextEvent = null; ChartPlayer.etor.ContextState = null; foreach (var i in gogroup.GetComponentsInChildren()) @@ -193,7 +193,7 @@ namespace Cryville.Crtr.Event { void MatchDynamic(ContainerState s, int dl) { ChartPlayer.etor.ContextState = s; ChartPlayer.etor.ContextEvent = Container; - skinContainer.MatchDynamic(this, dl); + skinContainer.MatchDynamic(dl); ChartPlayer.etor.ContextEvent = null; ChartPlayer.etor.ContextState = null; } diff --git a/Assets/Cryville/Crtr/SkinContainer.cs b/Assets/Cryville/Crtr/SkinContainer.cs index af6a05e..064ba8a 100644 --- a/Assets/Cryville/Crtr/SkinContainer.cs +++ b/Assets/Cryville/Crtr/SkinContainer.cs @@ -5,6 +5,7 @@ using UnityEngine.Profiling; namespace Cryville.Crtr { public class SkinContainer { + readonly ISkinnableGroup _group; readonly SkinElement _rootElement; readonly DynamicStack[] _stacks = new DynamicStack[2]; class DynamicStack { @@ -25,22 +26,23 @@ namespace Cryville.Crtr { public SkinSelectors Selectors { get; set; } public SkinElement Element { get; set; } } - public SkinContainer(SkinElement rootElement) { + public SkinContainer(ISkinnableGroup group, SkinElement rootElement) { + _group = group; _rootElement = rootElement; for (int i = 0; i < _stacks.Length; i++) _stacks[i] = new DynamicStack(); } - public void MatchStatic(ISkinnableGroup group) { + public void MatchStatic() { var stack = _stacks[0]; stack.Clear(); - MatchStatic(_rootElement, group, stack, new RuntimeSkinContext(group.SkinContext)); + MatchStatic(_rootElement, stack, new RuntimeSkinContext(_group.SkinContext)); } - void MatchStatic(SkinElement rel, ISkinnableGroup group, DynamicStack stack, RuntimeSkinContext ctx) { + void MatchStatic(SkinElement rel, DynamicStack stack, RuntimeSkinContext ctx) { var rc = ctx.ReadContext; ChartPlayer.etor.ContextTransform = rc.Transform; if (rc.PropSrcs != null) ChartPlayer.etor.ContextCascadeInsert(rc.PropSrcs); foreach (var p in rel.properties) { try { - p.Key.ExecuteStatic(group, ctx, p.Value); + p.Key.ExecuteStatic(_group, ctx, p.Value); } catch (EvaluationFailureException) { } if (p.Key.IsValueRequired && !p.Value.IsConstant) stack.Properties.Add( @@ -50,13 +52,13 @@ namespace Cryville.Crtr { ChartPlayer.etor.ContextTransform = null; foreach (var e in rel.elements) { try { - var nctxs = e.Key.MatchStatic(group, rc); + var nctxs = e.Key.MatchStatic(_group, rc); if (nctxs != null) { var roflag = e.Key.annotations.Contains("if"); var woflag = e.Key.annotations.Contains("then"); foreach (var nctx in nctxs) { var nrctx = new RuntimeSkinContext(nctx, ctx, roflag, woflag); - MatchStatic(e.Value, group, stack, nrctx); + MatchStatic(e.Value, stack, nrctx); } } } @@ -68,7 +70,7 @@ namespace Cryville.Crtr { } if (rc.PropSrcs != null) ChartPlayer.etor.ContextCascadeDiscard(); } - public void MatchDynamic(ISkinnableGroup group, int dl) { + public void MatchDynamic(int dl) { var stack = _stacks[dl]; if (stack.Properties.Count == 0 && stack.Elements.Count == 0) return; var nstack = dl + 1 < _stacks.Length ? _stacks[dl + 1] : null; @@ -76,7 +78,7 @@ namespace Cryville.Crtr { Profiler.BeginSample("SkinContainer.MatchDynamic"); for (int i = 0; i < stack.Properties.Count; i++) { DynamicProperty p = stack.Properties[i]; - p.Key.ExecuteDynamic(group, p.Context, p.Value, dl); + p.Key.ExecuteDynamic(_group, p.Context, p.Value, dl); } for (int i = 0; i < stack.Elements.Count; i++) { DynamicElement e = stack.Elements[i]; @@ -84,14 +86,14 @@ namespace Cryville.Crtr { if (psrcs != null) ChartPlayer.etor.ContextCascadeInsert(psrcs); SkinContext nctx = null; try { - nctx = e.Selectors.MatchDynamic(group, e.Context.ReadContext); + nctx = e.Selectors.MatchDynamic(_group, e.Context.ReadContext); } catch (SelectorNotAvailableException) { if (nstack == null) throw; nstack.Elements.Add(e); } if (nctx != null) { - MatchDynamic(e.Element, group, dl, nstack, new RuntimeSkinContext( + MatchDynamic(e.Element, dl, nstack, new RuntimeSkinContext( nctx, e.Context, e.Selectors.annotations.Contains("if"), e.Selectors.annotations.Contains("then") )); if (e.Selectors.annotations.Contains("once")) { @@ -102,18 +104,18 @@ namespace Cryville.Crtr { } Profiler.EndSample(); } - void MatchDynamic(SkinElement rel, ISkinnableGroup group, int dl, DynamicStack stack, RuntimeSkinContext ctx) { + void MatchDynamic(SkinElement rel, int dl, DynamicStack stack, RuntimeSkinContext ctx) { var rc = ctx.ReadContext; ChartPlayer.etor.ContextTransform = rc.Transform; if (rc.PropSrcs != null) ChartPlayer.etor.ContextCascadeInsert(rc.PropSrcs); foreach (var p in rel.properties) { - p.Key.ExecuteDynamic(group, ctx, p.Value, dl); + p.Key.ExecuteDynamic(_group, ctx, p.Value, dl); } ChartPlayer.etor.ContextTransform = null; foreach (var e in rel.elements) { - if (e.Key.IsUpdatable(group, dl)) { - SkinContext nctx = e.Key.MatchDynamic(group, rc); - if (nctx != null) MatchDynamic(e.Value, group, dl, stack, new RuntimeSkinContext( + if (e.Key.IsUpdatable(_group, dl)) { + SkinContext nctx = e.Key.MatchDynamic(_group, rc); + if (nctx != null) MatchDynamic(e.Value, dl, stack, new RuntimeSkinContext( nctx, ctx, e.Key.annotations.Contains("if"), e.Key.annotations.Contains("then") )); }