diff --git a/Assets/Cryville/Crtr/PdtEvaluator.cs b/Assets/Cryville/Crtr/PdtEvaluator.cs index b4f0ee7..c787618 100644 --- a/Assets/Cryville/Crtr/PdtEvaluator.cs +++ b/Assets/Cryville/Crtr/PdtEvaluator.cs @@ -100,6 +100,10 @@ namespace Cryville.Crtr { public void ContextCascadeInsert() { ContextCascade[_cascadeHeight++].Clear(); } + public void ContextCascadeInsert(Dictionary srcs) { + ContextCascadeInsert(); + foreach (var src in srcs) ContextCascadeUpdate(src.Key, src.Value); + } public void ContextCascadeUpdate(int key, PropSrc.Arbitrary value) { ContextCascade[_cascadeHeight - 1][key] = value; } diff --git a/Assets/Cryville/Crtr/SkinContainer.cs b/Assets/Cryville/Crtr/SkinContainer.cs index 9a88209..d4e8b54 100644 --- a/Assets/Cryville/Crtr/SkinContainer.cs +++ b/Assets/Cryville/Crtr/SkinContainer.cs @@ -36,6 +36,7 @@ namespace Cryville.Crtr { void MatchStatic(SkinElement rel, ContainerState state, 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) { if (p.Key.Name == 0) rc.Transform.gameObject.AddComponent(p.Key.Component); @@ -62,6 +63,7 @@ namespace Cryville.Crtr { ); } } + if (rc.PropSrcs != null) ChartPlayer.etor.ContextCascadeDiscard(); } public void MatchDynamic(ContainerState state) { if (dynprops.Count == 0 && dynelems.Count == 0) return; @@ -70,17 +72,23 @@ namespace Cryville.Crtr { ChartPlayer.etor.ContextEvent = state.Container; for (int i = 0; i < dynprops.Count; i++) { DynamicProperty p = dynprops[i]; + var psrcs = p.Context.ReadContext.PropSrcs; + if (psrcs != null) ChartPlayer.etor.ContextCascadeInsert(psrcs); var prop = GetPropOp(p.Context.WriteTransform, p.Key); if (state.CloneType > prop.UpdateCloneType) continue; ChartPlayer.etor.Evaluate(prop.Operator, p.Value); + if (psrcs != null) ChartPlayer.etor.ContextCascadeDiscard(); } for (int i = 0; i < dynelems.Count; i++) { DynamicElement e = dynelems[i]; + var psrcs = e.Context.ReadContext.PropSrcs; + if (psrcs != null) ChartPlayer.etor.ContextCascadeInsert(psrcs); var nctx = e.Selectors.MatchDynamic(state, e.Context.ReadContext); if (nctx != null) MatchDynamic( e.Element, state, new RuntimeSkinContext(nctx, e.Context.ReadContext.Transform, e.Selectors.annotations.Contains("if")) ); + if (psrcs != null) ChartPlayer.etor.ContextCascadeDiscard(); } ChartPlayer.etor.ContextEvent = null; ChartPlayer.etor.ContextState = null; @@ -89,6 +97,7 @@ namespace Cryville.Crtr { void MatchDynamic(SkinElement rel, ContainerState state, 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) { if (p.Key.Name == 0) throw new InvalidOperationException("Component creation in dynamic context is not allowed"); @@ -105,6 +114,7 @@ namespace Cryville.Crtr { new RuntimeSkinContext(nctx, ctx.WriteTransform, r.Key.annotations.Contains("if")) ); } + if (rc.PropSrcs != null) ChartPlayer.etor.ContextCascadeDiscard(); } SkinProperty GetPropOp(Transform obj, SkinPropertyKey key) { var ctype = key.Component;