Make the group in skin container readonly.

This commit is contained in:
2023-02-24 15:25:04 +08:00
parent 3ecf3b4bfc
commit 6837d3f7ee
3 changed files with 25 additions and 23 deletions

View File

@@ -12,11 +12,11 @@ namespace Cryville.Crtr {
public Transform RootTransform { get; private set; } public Transform RootTransform { get; private set; }
public EffectInstance(EffectDefinition def) { public EffectInstance(EffectDefinition def) {
_def = def; _def = def;
_skinContainer = new SkinContainer(_def.elements); _skinContainer = new SkinContainer(this, _def.elements);
RootTransform = new GameObject("effect:" + GetHashCode().ToString(CultureInfo.InvariantCulture)).transform; RootTransform = new GameObject("effect:" + GetHashCode().ToString(CultureInfo.InvariantCulture)).transform;
SkinContext = new SkinContext(RootTransform); SkinContext = new SkinContext(RootTransform);
ChartPlayer.etor.ContextCascadeInsertBlock(); ChartPlayer.etor.ContextCascadeInsertBlock();
_skinContainer.MatchStatic(this); _skinContainer.MatchStatic();
ChartPlayer.etor.ContextCascadeDiscardBlock(); ChartPlayer.etor.ContextCascadeDiscardBlock();
foreach (var i in RootTransform.GetComponentsInChildren<SkinComponent>()) foreach (var i in RootTransform.GetComponentsInChildren<SkinComponent>())
i.Init(); i.Init();
@@ -39,7 +39,7 @@ namespace Cryville.Crtr {
readonly PropOp _durationOp; readonly PropOp _durationOp;
public double EndTime { get { return _startTime + _duration; } } public double EndTime { get { return _startTime + _duration; } }
public void Tick() { public void Tick() {
_skinContainer.MatchDynamic(this, 1); _skinContainer.MatchDynamic(1);
} }
public void OnEmit(double time) { public void OnEmit(double time) {
_startTime = time; _startTime = time;
@@ -47,7 +47,7 @@ namespace Cryville.Crtr {
ChartPlayer.etor.ContextCascadeInsert(); ChartPlayer.etor.ContextCascadeInsert();
ChartPlayer.etor.ContextCascadeUpdate(_VAR_EFFECT_INDEX, _indexSrc); ChartPlayer.etor.ContextCascadeUpdate(_VAR_EFFECT_INDEX, _indexSrc);
ChartPlayer.etor.Evaluate(_durationOp, _def.duration); ChartPlayer.etor.Evaluate(_durationOp, _def.duration);
_skinContainer.MatchDynamic(this, 0); _skinContainer.MatchDynamic(0);
ChartPlayer.etor.ContextCascadeDiscard(); ChartPlayer.etor.ContextCascadeDiscard();
} }
public void OnDone() { public void OnDone() {

View File

@@ -70,7 +70,7 @@ namespace Cryville.Crtr.Event {
SkinContainer skinContainer; SkinContainer skinContainer;
protected Judge judge; protected Judge judge;
public void AttachSystems(PdtSkin skin, Judge judge) { public void AttachSystems(PdtSkin skin, Judge judge) {
skinContainer = new SkinContainer(skin.elements); skinContainer = new SkinContainer(this, skin.elements);
this.judge = judge; this.judge = judge;
} }
@@ -126,7 +126,7 @@ namespace Cryville.Crtr.Event {
public virtual void Init() { public virtual void Init() {
ChartPlayer.etor.ContextState = ps; ChartPlayer.etor.ContextState = ps;
ChartPlayer.etor.ContextEvent = Container; ChartPlayer.etor.ContextEvent = Container;
skinContainer.MatchStatic(this); skinContainer.MatchStatic();
ChartPlayer.etor.ContextEvent = null; ChartPlayer.etor.ContextEvent = null;
ChartPlayer.etor.ContextState = null; ChartPlayer.etor.ContextState = null;
foreach (var i in gogroup.GetComponentsInChildren<SkinComponent>()) foreach (var i in gogroup.GetComponentsInChildren<SkinComponent>())
@@ -193,7 +193,7 @@ namespace Cryville.Crtr.Event {
void MatchDynamic(ContainerState s, int dl) { void MatchDynamic(ContainerState s, int dl) {
ChartPlayer.etor.ContextState = s; ChartPlayer.etor.ContextState = s;
ChartPlayer.etor.ContextEvent = Container; ChartPlayer.etor.ContextEvent = Container;
skinContainer.MatchDynamic(this, dl); skinContainer.MatchDynamic(dl);
ChartPlayer.etor.ContextEvent = null; ChartPlayer.etor.ContextEvent = null;
ChartPlayer.etor.ContextState = null; ChartPlayer.etor.ContextState = null;
} }

View File

@@ -5,6 +5,7 @@ using UnityEngine.Profiling;
namespace Cryville.Crtr { namespace Cryville.Crtr {
public class SkinContainer { public class SkinContainer {
readonly ISkinnableGroup _group;
readonly SkinElement _rootElement; readonly SkinElement _rootElement;
readonly DynamicStack[] _stacks = new DynamicStack[2]; readonly DynamicStack[] _stacks = new DynamicStack[2];
class DynamicStack { class DynamicStack {
@@ -25,22 +26,23 @@ namespace Cryville.Crtr {
public SkinSelectors Selectors { get; set; } public SkinSelectors Selectors { get; set; }
public SkinElement Element { get; set; } public SkinElement Element { get; set; }
} }
public SkinContainer(SkinElement rootElement) { public SkinContainer(ISkinnableGroup group, SkinElement rootElement) {
_group = group;
_rootElement = rootElement; _rootElement = rootElement;
for (int i = 0; i < _stacks.Length; i++) _stacks[i] = new DynamicStack(); for (int i = 0; i < _stacks.Length; i++) _stacks[i] = new DynamicStack();
} }
public void MatchStatic(ISkinnableGroup group) { public void MatchStatic() {
var stack = _stacks[0]; var stack = _stacks[0];
stack.Clear(); 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; var rc = ctx.ReadContext;
ChartPlayer.etor.ContextTransform = rc.Transform; ChartPlayer.etor.ContextTransform = rc.Transform;
if (rc.PropSrcs != null) ChartPlayer.etor.ContextCascadeInsert(rc.PropSrcs); if (rc.PropSrcs != null) ChartPlayer.etor.ContextCascadeInsert(rc.PropSrcs);
foreach (var p in rel.properties) { foreach (var p in rel.properties) {
try { try {
p.Key.ExecuteStatic(group, ctx, p.Value); p.Key.ExecuteStatic(_group, ctx, p.Value);
} }
catch (EvaluationFailureException) { } catch (EvaluationFailureException) { }
if (p.Key.IsValueRequired && !p.Value.IsConstant) stack.Properties.Add( if (p.Key.IsValueRequired && !p.Value.IsConstant) stack.Properties.Add(
@@ -50,13 +52,13 @@ namespace Cryville.Crtr {
ChartPlayer.etor.ContextTransform = null; ChartPlayer.etor.ContextTransform = null;
foreach (var e in rel.elements) { foreach (var e in rel.elements) {
try { try {
var nctxs = e.Key.MatchStatic(group, rc); var nctxs = e.Key.MatchStatic(_group, rc);
if (nctxs != null) { if (nctxs != null) {
var roflag = e.Key.annotations.Contains("if"); var roflag = e.Key.annotations.Contains("if");
var woflag = e.Key.annotations.Contains("then"); var woflag = e.Key.annotations.Contains("then");
foreach (var nctx in nctxs) { foreach (var nctx in nctxs) {
var nrctx = new RuntimeSkinContext(nctx, ctx, roflag, woflag); 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(); if (rc.PropSrcs != null) ChartPlayer.etor.ContextCascadeDiscard();
} }
public void MatchDynamic(ISkinnableGroup group, int dl) { public void MatchDynamic(int dl) {
var stack = _stacks[dl]; var stack = _stacks[dl];
if (stack.Properties.Count == 0 && stack.Elements.Count == 0) return; if (stack.Properties.Count == 0 && stack.Elements.Count == 0) return;
var nstack = dl + 1 < _stacks.Length ? _stacks[dl + 1] : null; var nstack = dl + 1 < _stacks.Length ? _stacks[dl + 1] : null;
@@ -76,7 +78,7 @@ namespace Cryville.Crtr {
Profiler.BeginSample("SkinContainer.MatchDynamic"); Profiler.BeginSample("SkinContainer.MatchDynamic");
for (int i = 0; i < stack.Properties.Count; i++) { for (int i = 0; i < stack.Properties.Count; i++) {
DynamicProperty p = stack.Properties[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++) { for (int i = 0; i < stack.Elements.Count; i++) {
DynamicElement e = stack.Elements[i]; DynamicElement e = stack.Elements[i];
@@ -84,14 +86,14 @@ namespace Cryville.Crtr {
if (psrcs != null) ChartPlayer.etor.ContextCascadeInsert(psrcs); if (psrcs != null) ChartPlayer.etor.ContextCascadeInsert(psrcs);
SkinContext nctx = null; SkinContext nctx = null;
try { try {
nctx = e.Selectors.MatchDynamic(group, e.Context.ReadContext); nctx = e.Selectors.MatchDynamic(_group, e.Context.ReadContext);
} }
catch (SelectorNotAvailableException) { catch (SelectorNotAvailableException) {
if (nstack == null) throw; if (nstack == null) throw;
nstack.Elements.Add(e); nstack.Elements.Add(e);
} }
if (nctx != null) { 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") nctx, e.Context, e.Selectors.annotations.Contains("if"), e.Selectors.annotations.Contains("then")
)); ));
if (e.Selectors.annotations.Contains("once")) { if (e.Selectors.annotations.Contains("once")) {
@@ -102,18 +104,18 @@ namespace Cryville.Crtr {
} }
Profiler.EndSample(); 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; var rc = ctx.ReadContext;
ChartPlayer.etor.ContextTransform = rc.Transform; ChartPlayer.etor.ContextTransform = rc.Transform;
if (rc.PropSrcs != null) ChartPlayer.etor.ContextCascadeInsert(rc.PropSrcs); if (rc.PropSrcs != null) ChartPlayer.etor.ContextCascadeInsert(rc.PropSrcs);
foreach (var p in rel.properties) { 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; ChartPlayer.etor.ContextTransform = null;
foreach (var e in rel.elements) { foreach (var e in rel.elements) {
if (e.Key.IsUpdatable(group, dl)) { if (e.Key.IsUpdatable(_group, dl)) {
SkinContext nctx = e.Key.MatchDynamic(group, rc); SkinContext nctx = e.Key.MatchDynamic(_group, rc);
if (nctx != null) MatchDynamic(e.Value, group, dl, stack, new RuntimeSkinContext( if (nctx != null) MatchDynamic(e.Value, dl, stack, new RuntimeSkinContext(
nctx, ctx, e.Key.annotations.Contains("if"), e.Key.annotations.Contains("then") nctx, ctx, e.Key.annotations.Contains("if"), e.Key.annotations.Contains("then")
)); ));
} }