Decouple the usage of PDT evaluator of chart player.

This commit is contained in:
2023-07-28 14:13:49 +08:00
parent 8b64165fb7
commit 3db8f61e3b
15 changed files with 96 additions and 77 deletions

View File

@@ -66,7 +66,7 @@ namespace Cryville.Crtr {
if (comps[i] == "") comps[i] = "0"; if (comps[i] == "") comps[i] = "0";
} }
_itor.SetSource(string.Format("({0});", string.Join(',', comps))); _itor.SetSource(string.Format("({0});", string.Join(',', comps)));
ChartPlayer.etor.Evaluate(_vecop, _itor.GetExp()); PdtEvaluator.Instance.Evaluate(_vecop, _itor.GetExp());
return _vecbuf; return _vecbuf;
} }
} }
@@ -99,18 +99,18 @@ namespace Cryville.Crtr {
var exp = _itor.GetExp(); var exp = _itor.GetExp();
switch (c) { switch (c) {
case '@': case '@':
ChartPlayer.etor.Evaluate(_vecop, exp); PdtEvaluator.Instance.Evaluate(_vecop, exp);
node.Time = new Vec1(_vecbuf); node.Time = new Vec1(_vecbuf);
break; break;
case '~': case '~':
ChartPlayer.etor.Evaluate(_vecop, exp); PdtEvaluator.Instance.Evaluate(_vecop, exp);
node.EndTime = new Vec1(_vecbuf); node.EndTime = new Vec1(_vecbuf);
break; break;
case '^': case '^':
node.Transition = exp; node.Transition = exp;
break; break;
case ':': case ':':
ChartPlayer.etor.Evaluate(_vecop, exp); PdtEvaluator.Instance.Evaluate(_vecop, exp);
node.Value = Vector.Construct(ChartPlayer.motionRegistry[name].Type, _vecbuf); node.Value = Vector.Construct(ChartPlayer.motionRegistry[name].Type, _vecbuf);
break; break;
default: default:

View File

@@ -60,8 +60,6 @@ namespace Cryville.Crtr {
public static float sv = 16f; public static float sv = 16f;
public static Dictionary<Identifier, MotionRegistry> motionRegistry; public static Dictionary<Identifier, MotionRegistry> motionRegistry;
public static PdtEvaluator etor;
#endregion #endregion
#region MonoBehaviour #region MonoBehaviour
@@ -548,7 +546,7 @@ namespace Cryville.Crtr {
effectManager.Dispose(); effectManager.Dispose();
effectManager = null; effectManager = null;
} }
etor = null; PdtEvaluator.Instance.Reset();
motionRegistry = null; motionRegistry = null;
Logger.Log("main", 1, "Game", "Stopped"); Logger.Log("main", 1, "Game", "Stopped");
} }
@@ -614,7 +612,7 @@ namespace Cryville.Crtr {
}; };
using (StreamReader reader = new StreamReader(info.chartFile.FullName, Encoding.UTF8)) { using (StreamReader reader = new StreamReader(info.chartFile.FullName, Encoding.UTF8)) {
etor = new PdtEvaluator(); PdtEvaluator.Instance.Reset();
LoadRuleset(info.rulesetFile); loadPregress = .05f; LoadRuleset(info.rulesetFile); loadPregress = .05f;
@@ -634,7 +632,7 @@ namespace Cryville.Crtr {
Logger.Log("main", 0, "Load/WorkerThread", "Initializing judge and input"); loadPregress = .35f; Logger.Log("main", 0, "Load/WorkerThread", "Initializing judge and input"); loadPregress = .35f;
judge = new Judge(this, pruleset); judge = new Judge(this, pruleset);
etor.ContextJudge = judge; PdtEvaluator.Instance.ContextJudge = judge;
inputProxy = new InputProxy(pruleset, judge, screenSize); inputProxy = new InputProxy(pruleset, judge, screenSize);
inputProxy.LoadFrom(_rscfg.inputs); inputProxy.LoadFrom(_rscfg.inputs);
@@ -686,7 +684,7 @@ namespace Cryville.Crtr {
if (ruleset.format != Ruleset.CURRENT_FORMAT) throw new FormatException("Invalid ruleset file version"); if (ruleset.format != Ruleset.CURRENT_FORMAT) throw new FormatException("Invalid ruleset file version");
ruleset.LoadPdt(dir); ruleset.LoadPdt(dir);
pruleset = ruleset.Root; pruleset = ruleset.Root;
pruleset.Optimize(etor); pruleset.Optimize(PdtEvaluator.Instance);
} }
RMVPool.Shared = new RMVPool(); RMVPool.Shared = new RMVPool();
MotionCachePool.Shared = new MotionCachePool(); MotionCachePool.Shared = new MotionCachePool();
@@ -698,7 +696,7 @@ namespace Cryville.Crtr {
Logger.Log("main", 0, "Load/WorkerThread", "Loading skin: {0}", file); Logger.Log("main", 0, "Load/WorkerThread", "Loading skin: {0}", file);
skin.LoadPdt(dir); skin.LoadPdt(dir);
pskin = skin.Root; pskin = skin.Root;
pskin.Optimize(etor); pskin.Optimize(PdtEvaluator.Instance);
effectManager = new EffectManager(pskin); effectManager = new EffectManager(pskin);
} }
#endregion #endregion

View File

@@ -26,7 +26,7 @@ namespace Cryville.Crtr.Config {
void OnEnable() { void OnEnable() {
try { try {
ChartPlayer.etor = new PdtEvaluator(); PdtEvaluator.Instance.Reset();
FileInfo file = new FileInfo( FileInfo file = new FileInfo(
Game.GameDataPath + "/rulesets/" + Settings.Default.LoadRuleset Game.GameDataPath + "/rulesets/" + Settings.Default.LoadRuleset
); );

View File

@@ -17,9 +17,9 @@ namespace Cryville.Crtr {
_skinContainer = new SkinContainer(this, _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(); PdtEvaluator.Instance.ContextCascadeInsertBlock();
_skinContainer.MatchStatic(); _skinContainer.MatchStatic();
ChartPlayer.etor.ContextCascadeDiscardBlock(); PdtEvaluator.Instance.ContextCascadeDiscardBlock();
_comps = RootTransform.GetComponentsInChildren<SkinComponent>(); _comps = RootTransform.GetComponentsInChildren<SkinComponent>();
foreach (var i in _comps) i.Init(); foreach (var i in _comps) i.Init();
_indexSrc = new PropSrc.Float(() => Index); _indexSrc = new PropSrc.Float(() => Index);
@@ -57,8 +57,8 @@ namespace Cryville.Crtr {
} }
public void OnEmit(double time, Transform target) { public void OnEmit(double time, Transform target) {
_currentTarget = target; _currentTarget = target;
_ctxev = ChartPlayer.etor.ContextEvent; _ctxev = PdtEvaluator.Instance.ContextEvent;
_ctxstate = ChartPlayer.etor.ContextState; _ctxstate = PdtEvaluator.Instance.ContextState;
_skinContainer.MatchDynamic(0, true); _skinContainer.MatchDynamic(0, true);
if (_currentStateName.Key == 0) { if (_currentStateName.Key == 0) {
EnterState(_def.init, time, _currentTarget, true); EnterState(_def.init, time, _currentTarget, true);
@@ -73,11 +73,11 @@ namespace Cryville.Crtr {
_currentState = _def.states[name]; _currentState = _def.states[name];
Rewind(time, target); Rewind(time, target);
RootTransform.gameObject.SetActive(true); RootTransform.gameObject.SetActive(true);
ChartPlayer.etor.ContextCascadeInsert(); PdtEvaluator.Instance.ContextCascadeInsert();
ChartPlayer.etor.ContextCascadeUpdate(_VAR_EFFECT_INDEX, _indexSrc); PdtEvaluator.Instance.ContextCascadeUpdate(_VAR_EFFECT_INDEX, _indexSrc);
ChartPlayer.etor.Evaluate(_durationOp, _currentState.duration); PdtEvaluator.Instance.Evaluate(_durationOp, _currentState.duration);
_skinContainer.MatchDynamic(1, emitting); _skinContainer.MatchDynamic(1, emitting);
ChartPlayer.etor.ContextCascadeDiscard(); PdtEvaluator.Instance.ContextCascadeDiscard();
} }
public bool OnStateDone() { public bool OnStateDone() {
if (_currentState.next.Key == 0) { if (_currentState.next.Key == 0) {
@@ -87,11 +87,11 @@ namespace Cryville.Crtr {
return false; return false;
} }
else { else {
ChartPlayer.etor.ContextEvent = _ctxev; PdtEvaluator.Instance.ContextEvent = _ctxev;
ChartPlayer.etor.ContextState = _ctxstate; PdtEvaluator.Instance.ContextState = _ctxstate;
EnterState(_currentState.next, EndTime, _currentTarget, false); EnterState(_currentState.next, EndTime, _currentTarget, false);
ChartPlayer.etor.ContextEvent = null; PdtEvaluator.Instance.ContextEvent = null;
ChartPlayer.etor.ContextState = null; PdtEvaluator.Instance.ContextState = null;
return true; return true;
} }
} }

View File

@@ -127,12 +127,12 @@ namespace Cryville.Crtr.Event {
a_tail = RegisterAnchor(_a_tail, true); a_tail = RegisterAnchor(_a_tail, true);
} }
public virtual void Init() { public virtual void Init() {
ChartPlayer.etor.ContextState = ps; PdtEvaluator.Instance.ContextState = ps;
ChartPlayer.etor.ContextEvent = Container; PdtEvaluator.Instance.ContextEvent = Container;
skinContainer.MatchStatic(); skinContainer.MatchStatic();
MatchDynamic(ps, 0); MatchDynamic(ps, 0);
ChartPlayer.etor.ContextEvent = null; PdtEvaluator.Instance.ContextEvent = null;
ChartPlayer.etor.ContextState = null; PdtEvaluator.Instance.ContextState = null;
foreach (Transform child in RootTransform) { foreach (Transform child in RootTransform) {
if (child.CompareTag(TagRootTransform)) continue; if (child.CompareTag(TagRootTransform)) continue;
_comps.AddRange(child.GetComponentsInChildren<SkinComponent>()); _comps.AddRange(child.GetComponentsInChildren<SkinComponent>());
@@ -199,11 +199,11 @@ namespace Cryville.Crtr.Event {
protected static bool CanDoGraphicalUpdate(ContainerState s) { return s.CloneType >= 2 && s.CloneType < 16; } protected static bool CanDoGraphicalUpdate(ContainerState s) { return s.CloneType >= 2 && s.CloneType < 16; }
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
void MatchDynamic(ContainerState s, int dl) { void MatchDynamic(ContainerState s, int dl) {
ChartPlayer.etor.ContextState = s; PdtEvaluator.Instance.ContextState = s;
ChartPlayer.etor.ContextEvent = Container; PdtEvaluator.Instance.ContextEvent = Container;
skinContainer.MatchDynamic(dl); skinContainer.MatchDynamic(dl);
ChartPlayer.etor.ContextEvent = null; PdtEvaluator.Instance.ContextEvent = null;
ChartPlayer.etor.ContextState = null; PdtEvaluator.Instance.ContextState = null;
} }
#endregion #endregion
#region Anchor #region Anchor

View File

@@ -462,9 +462,9 @@ namespace Cryville.Crtr.Event {
if (transition == null) return new Vector4(time, time, time, time); if (transition == null) return new Vector4(time, time, time, time);
_ttime = time; _ttime = time;
_ttimesrc.Invalidate(); _ttimesrc.Invalidate();
ChartPlayer.etor.ContextSelfValue = _ttimesrc; PdtEvaluator.Instance.ContextSelfValue = _ttimesrc;
ChartPlayer.etor.Evaluate(_transop, transition); PdtEvaluator.Instance.Evaluate(_transop, transition);
ChartPlayer.etor.ContextSelfValue = null; PdtEvaluator.Instance.ContextSelfValue = null;
return _trans; return _trans;
} }

View File

@@ -23,7 +23,7 @@ namespace Cryville.Crtr {
_vecsrcs[i] = vecsrc; _vecsrcs[i] = vecsrc;
_vecops[i] = new InputVectorOp(vecsrc); _vecops[i] = new InputVectorOp(vecsrc);
} }
_etor = judge != null ? judge._etor : ChartPlayer.etor; _etor = judge != null ? judge._etor : PdtEvaluator.Instance;
_ruleset = ruleset; _ruleset = ruleset;
_judge = judge; _judge = judge;
_screenSize = new InputVector(screenSize.x, screenSize.y); _screenSize = new InputVector(screenSize.x, screenSize.y);

View File

@@ -11,42 +11,42 @@ namespace Cryville.Crtr {
var exp = (PdtExpression)value; var exp = (PdtExpression)value;
if (type.Equals(typeof(bool))) { if (type.Equals(typeof(bool))) {
bool result = false; bool result = false;
ChartPlayer.etor.Evaluate(new PropOp.Boolean(r => result = r), exp); PdtEvaluator.Instance.Evaluate(new PropOp.Boolean(r => result = r), exp);
return result; return result;
} }
else if (type.Equals(typeof(int))) { else if (type.Equals(typeof(int))) {
int result = 0; int result = 0;
ChartPlayer.etor.Evaluate(new PropOp.Integer(r => result = r), exp); PdtEvaluator.Instance.Evaluate(new PropOp.Integer(r => result = r), exp);
return result; return result;
} }
else if (type.Equals(typeof(float))) { else if (type.Equals(typeof(float))) {
float result = 0; float result = 0;
ChartPlayer.etor.Evaluate(new PropOp.Float(r => result = r), exp); PdtEvaluator.Instance.Evaluate(new PropOp.Float(r => result = r), exp);
return result; return result;
} }
else if (type.Equals(typeof(string))) { else if (type.Equals(typeof(string))) {
string result = default(string); string result = default(string);
ChartPlayer.etor.Evaluate(new PropOp.String(r => result = r), exp); PdtEvaluator.Instance.Evaluate(new PropOp.String(r => result = r), exp);
return result; return result;
} }
else if (type.IsEnum) { else if (type.IsEnum) {
object result = null; object result = null;
ChartPlayer.etor.Evaluate(new PropOp.Enum(type, r => result = r), exp); PdtEvaluator.Instance.Evaluate(new PropOp.Enum(type, r => result = r), exp);
return result; return result;
} }
else if (type.Equals(typeof(Clip))) { else if (type.Equals(typeof(Clip))) {
Clip result = default(Clip); Clip result = default(Clip);
ChartPlayer.etor.Evaluate(new PropOp.Clip(r => result = r), exp); PdtEvaluator.Instance.Evaluate(new PropOp.Clip(r => result = r), exp);
return result; return result;
} }
else if (type.Equals(typeof(Identifier))) { else if (type.Equals(typeof(Identifier))) {
Identifier result = default(Identifier); Identifier result = default(Identifier);
ChartPlayer.etor.Evaluate(new pop_identstr(r => result = r), exp); PdtEvaluator.Instance.Evaluate(new pop_identstr(r => result = r), exp);
return result; return result;
} }
else if (type.Equals(typeof(Identifier[]))) { else if (type.Equals(typeof(Identifier[]))) {
Identifier[] result = null; Identifier[] result = null;
ChartPlayer.etor.Evaluate(new pop_identstrarr(r => result = r), exp); PdtEvaluator.Instance.Evaluate(new pop_identstrarr(r => result = r), exp);
return result; return result;
} }
} }

View File

@@ -10,6 +10,15 @@ using UnityEngine;
namespace Cryville.Crtr { namespace Cryville.Crtr {
public class PdtEvaluator : PdtEvaluatorBase { public class PdtEvaluator : PdtEvaluatorBase {
[ThreadStatic]
static PdtEvaluator m_instance;
public static PdtEvaluator Instance {
get {
if (m_instance == null) m_instance = new PdtEvaluator();
return m_instance;
}
}
readonly Dictionary<PdtOperatorSignature, PdtOperator> _shortops = new Dictionary<PdtOperatorSignature, PdtOperator>(); readonly Dictionary<PdtOperatorSignature, PdtOperator> _shortops = new Dictionary<PdtOperatorSignature, PdtOperator>();
readonly IntKeyedDictionary<PdtOperator> _ctxops = new IntKeyedDictionary<PdtOperator>(); readonly IntKeyedDictionary<PdtOperator> _ctxops = new IntKeyedDictionary<PdtOperator>();
@@ -152,6 +161,18 @@ namespace Cryville.Crtr {
ContextCascade[--_cascadeHeight].Clear(); ContextCascade[--_cascadeHeight].Clear();
} }
public void Reset() {
_cascadeHeight = 0;
ContextCascadeBlocks.Clear();
ContextCascadeBlocks.Push(0);
ContextEvent = null;
ContextJudge = null;
ContextSelfValue = null;
ContextSkinContainer = null;
ContextState = null;
ContextTransform = null;
}
public PdtEvaluator() { public PdtEvaluator() {
ContextCascadeBlocks.Push(0); ContextCascadeBlocks.Push(0);
for (int i = 0; i < ContextCascade.Length; i++) ContextCascade[i] = new IntKeyedDictionary<PropSrc>(); for (int i = 0; i < ContextCascade.Length; i++) ContextCascade[i] = new IntKeyedDictionary<PropSrc>();

View File

@@ -21,7 +21,7 @@ namespace Cryville.Crtr {
var op = GetOperand(0); var op = GetOperand(0);
var value = new byte[op.Length]; var value = new byte[op.Length];
op.CopyTo(value, 0); op.CopyTo(value, 0);
ChartPlayer.etor.ContextCascadeUpdate(Name, new PropSrc.Arbitrary(op.Type, value)); PdtEvaluator.Instance.ContextCascadeUpdate(Name, new PropSrc.Arbitrary(op.Type, value));
} }
} }
public class Boolean : PropOp { public class Boolean : PropOp {

View File

@@ -157,7 +157,7 @@ namespace Cryville.Crtr {
} }
} }
public void PrePatch(ChartEvent ev) { public void PrePatch(ChartEvent ev) {
var etor = ChartPlayer.etor; var etor = PdtEvaluator.Instance;
PropSrc src; PropSrc src;
etor.ContextCascadeInsert(); etor.ContextCascadeInsert();
etor.ContextEvent = ev; etor.ContextEvent = ev;

View File

@@ -90,10 +90,10 @@ namespace Cryville.Crtr {
etor.Optimize(_exp); etor.Optimize(_exp);
} }
public override IEnumerable<ChartEvent> Match(ChartEvent ev) { public override IEnumerable<ChartEvent> Match(ChartEvent ev) {
ChartPlayer.etor.ContextEvent = ev; PdtEvaluator.Instance.ContextEvent = ev;
if (!ChartPlayer.etor.Evaluate(_op, _exp)) if (!PdtEvaluator.Instance.Evaluate(_op, _exp))
throw new EvaluationFailureException(); throw new EvaluationFailureException();
ChartPlayer.etor.ContextEvent = null; PdtEvaluator.Instance.ContextEvent = null;
if (_flag) return new ChartEvent[] { ev }; if (_flag) return new ChartEvent[] { ev };
else return null; else return null;
} }

View File

@@ -43,8 +43,8 @@ namespace Cryville.Crtr {
} }
void MatchStatic(SkinElement rel, 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; PdtEvaluator.Instance.ContextTransform = rc.Transform;
if (rc.PropSrcs != null) ChartPlayer.etor.ContextCascadeInsert(rc.PropSrcs); if (rc.PropSrcs != null) PdtEvaluator.Instance.ContextCascadeInsert(rc.PropSrcs);
foreach (var p in rel.properties) { foreach (var p in rel.properties) {
try { try {
p.Key.ExecuteStatic(_group, ctx, p.Value, Variables); p.Key.ExecuteStatic(_group, ctx, p.Value, Variables);
@@ -54,7 +54,7 @@ namespace Cryville.Crtr {
new DynamicProperty { Context = ctx, Key = p.Key, Value = p.Value } new DynamicProperty { Context = ctx, Key = p.Key, Value = p.Value }
); );
} }
ChartPlayer.etor.ContextTransform = null; PdtEvaluator.Instance.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);
@@ -73,7 +73,7 @@ namespace Cryville.Crtr {
); );
} }
} }
if (rc.PropSrcs != null) ChartPlayer.etor.ContextCascadeDiscard(); if (rc.PropSrcs != null) PdtEvaluator.Instance.ContextCascadeDiscard();
} }
public void MatchDynamic(int dl, bool recursive = false) { public void MatchDynamic(int dl, bool recursive = false) {
var stack = _stacks[dl]; var stack = _stacks[dl];
@@ -81,7 +81,7 @@ namespace Cryville.Crtr {
var nstack = dl + 1 < _stacks.Length ? _stacks[dl + 1] : null; var nstack = dl + 1 < _stacks.Length ? _stacks[dl + 1] : null;
if (nstack != null) nstack.Clear(); if (nstack != null) nstack.Clear();
Profiler.BeginSample("SkinContainer.MatchDynamic"); Profiler.BeginSample("SkinContainer.MatchDynamic");
if (!recursive) ChartPlayer.etor.ContextSkinContainer = this; if (!recursive) PdtEvaluator.Instance.ContextSkinContainer = this;
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, Variables, dl); p.Key.ExecuteDynamic(_group, p.Context, p.Value, Variables, dl);
@@ -93,7 +93,7 @@ namespace Cryville.Crtr {
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];
var psrcs = e.Context.ReadContext.PropSrcs; var psrcs = e.Context.ReadContext.PropSrcs;
if (psrcs != null) ChartPlayer.etor.ContextCascadeInsert(psrcs); if (psrcs != null) PdtEvaluator.Instance.ContextCascadeInsert(psrcs);
if (e.Selectors.IsUpdatable(_group, dl)) { if (e.Selectors.IsUpdatable(_group, dl)) {
try { try {
var nctx = e.Selectors.MatchDynamic(_group, e.Context.ReadContext); var nctx = e.Selectors.MatchDynamic(_group, e.Context.ReadContext);
@@ -115,15 +115,15 @@ namespace Cryville.Crtr {
if (nstack == null) throw new SelectorNotAvailableException(); if (nstack == null) throw new SelectorNotAvailableException();
nstack.Elements.Add(e); nstack.Elements.Add(e);
} }
if (psrcs != null) ChartPlayer.etor.ContextCascadeDiscard(); if (psrcs != null) PdtEvaluator.Instance.ContextCascadeDiscard();
} }
if (!recursive) ChartPlayer.etor.ContextSkinContainer = null; if (!recursive) PdtEvaluator.Instance.ContextSkinContainer = null;
Profiler.EndSample(); Profiler.EndSample();
} }
void MatchDynamic(SkinElement rel, 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; PdtEvaluator.Instance.ContextTransform = rc.Transform;
if (rc.PropSrcs != null) ChartPlayer.etor.ContextCascadeInsert(rc.PropSrcs); if (rc.PropSrcs != null) PdtEvaluator.Instance.ContextCascadeInsert(rc.PropSrcs);
foreach (var p in rel.properties) { foreach (var p in rel.properties) {
if (p.Key.annotations.Contains("once")) { if (p.Key.annotations.Contains("once")) {
if (_once.Contains(p.Key)) continue; if (_once.Contains(p.Key)) continue;
@@ -134,7 +134,7 @@ namespace Cryville.Crtr {
p.Key.ExecuteDynamic(_group, ctx, p.Value, Variables, dl); p.Key.ExecuteDynamic(_group, ctx, p.Value, Variables, dl);
} }
} }
ChartPlayer.etor.ContextTransform = null; PdtEvaluator.Instance.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);
@@ -149,16 +149,16 @@ namespace Cryville.Crtr {
); );
} }
} }
if (rc.PropSrcs != null) ChartPlayer.etor.ContextCascadeDiscard(); if (rc.PropSrcs != null) PdtEvaluator.Instance.ContextCascadeDiscard();
} }
float _rtime; float _rtime;
readonly PropSrc _rtimeSrc; readonly PropSrc _rtimeSrc;
public void MatchAnimation(AnimationSpan span, float rtime, RuntimeSkinContext ctx) { public void MatchAnimation(AnimationSpan span, float rtime, RuntimeSkinContext ctx) {
ChartPlayer.etor.ContextSkinContainer = this; PdtEvaluator.Instance.ContextSkinContainer = this;
ChartPlayer.etor.ContextSelfValue = _rtimeSrc; PdtEvaluator.Instance.ContextSelfValue = _rtimeSrc;
MatchAnimationInternal(span, rtime, ctx); MatchAnimationInternal(span, rtime, ctx);
ChartPlayer.etor.ContextSelfValue = null; PdtEvaluator.Instance.ContextSelfValue = null;
ChartPlayer.etor.ContextSkinContainer = null; PdtEvaluator.Instance.ContextSkinContainer = null;
} }
void MatchAnimationInternal(AnimationSpan span, float rtime, RuntimeSkinContext ctx) { void MatchAnimationInternal(AnimationSpan span, float rtime, RuntimeSkinContext ctx) {
_rtime = rtime; _rtime = rtime;

View File

@@ -90,10 +90,10 @@ namespace Cryville.Crtr {
} }
void Execute(RuntimeSkinContext ctx, PdtOperator op, PdtExpression exp) { void Execute(RuntimeSkinContext ctx, PdtOperator op, PdtExpression exp) {
var psrcs = ctx.ReadContext.PropSrcs; var psrcs = ctx.ReadContext.PropSrcs;
if (psrcs != null) ChartPlayer.etor.ContextCascadeInsert(psrcs); if (psrcs != null) PdtEvaluator.Instance.ContextCascadeInsert(psrcs);
if (!ChartPlayer.etor.Evaluate(op, exp)) if (!PdtEvaluator.Instance.Evaluate(op, exp))
throw new EvaluationFailureException(); throw new EvaluationFailureException();
if (psrcs != null) ChartPlayer.etor.ContextCascadeDiscard(); if (psrcs != null) PdtEvaluator.Instance.ContextCascadeDiscard();
} }
SkinProperty GetPropOp(Transform obj) { SkinProperty GetPropOp(Transform obj) {
var ctype = Component; var ctype = Component;
@@ -145,10 +145,10 @@ namespace Cryville.Crtr {
public override void ExecuteDynamic(ISkinnableGroup group, RuntimeSkinContext ctx, PdtExpression exp, IntKeyedDictionary<SkinVariable> vars, int dl) { public override void ExecuteDynamic(ISkinnableGroup group, RuntimeSkinContext ctx, PdtExpression exp, IntKeyedDictionary<SkinVariable> vars, int dl) {
if (dl != 1) return; if (dl != 1) return;
var psrcs = ctx.ReadContext.PropSrcs; var psrcs = ctx.ReadContext.PropSrcs;
if (psrcs != null) ChartPlayer.etor.ContextCascadeInsert(psrcs); if (psrcs != null) PdtEvaluator.Instance.ContextCascadeInsert(psrcs);
if (!ChartPlayer.etor.Evaluate(_timeOp, exp)) if (!PdtEvaluator.Instance.Evaluate(_timeOp, exp))
throw new EvaluationFailureException(); throw new EvaluationFailureException();
if (psrcs != null) ChartPlayer.etor.ContextCascadeDiscard(); if (psrcs != null) PdtEvaluator.Instance.ContextCascadeDiscard();
group.PushAnchorEvent(_time, Name); group.PushAnchorEvent(_time, Name);
} }
} }
@@ -170,7 +170,7 @@ namespace Cryville.Crtr {
float _index; float _index;
readonly PropOp _op; readonly PropOp _op;
public override void ExecuteDynamic(ISkinnableGroup group, RuntimeSkinContext ctx, PdtExpression exp, IntKeyedDictionary<SkinVariable> vars, int dl) { public override void ExecuteDynamic(ISkinnableGroup group, RuntimeSkinContext ctx, PdtExpression exp, IntKeyedDictionary<SkinVariable> vars, int dl) {
if (!ChartPlayer.etor.Evaluate(_op, exp)) if (!PdtEvaluator.Instance.Evaluate(_op, exp))
throw new EvaluationFailureException(); throw new EvaluationFailureException();
if (IsSelf) ChartPlayer.effectManager.EmitSelf(Name, _index, ctx.WriteTransform); if (IsSelf) ChartPlayer.effectManager.EmitSelf(Name, _index, ctx.WriteTransform);
else ChartPlayer.effectManager.Emit(Name, _index); else ChartPlayer.effectManager.Emit(Name, _index);
@@ -189,14 +189,14 @@ namespace Cryville.Crtr {
SkinVariable v; SkinVariable v;
if (!vars.TryGetValue(Name, out v)) if (!vars.TryGetValue(Name, out v))
vars.Add(Name, v = new SkinVariable()); vars.Add(Name, v = new SkinVariable());
if (!ChartPlayer.etor.Evaluate(v.Op, exp)) if (!PdtEvaluator.Instance.Evaluate(v.Op, exp))
throw new EvaluationFailureException(); throw new EvaluationFailureException();
} }
public override void ExecuteDynamic(ISkinnableGroup group, RuntimeSkinContext ctx, PdtExpression exp, IntKeyedDictionary<SkinVariable> vars, int dl) { public override void ExecuteDynamic(ISkinnableGroup group, RuntimeSkinContext ctx, PdtExpression exp, IntKeyedDictionary<SkinVariable> vars, int dl) {
SkinVariable v; SkinVariable v;
if (!vars.TryGetValue(Name, out v)) if (!vars.TryGetValue(Name, out v))
throw new InvalidOperationException(string.Format("Variable \"{0}\" not defined", IdentifierManager.Shared.Retrieve(Name))); throw new InvalidOperationException(string.Format("Variable \"{0}\" not defined", IdentifierManager.Shared.Retrieve(Name)));
if (!ChartPlayer.etor.Evaluate(v.Op, exp)) if (!PdtEvaluator.Instance.Evaluate(v.Op, exp))
throw new EvaluationFailureException(); throw new EvaluationFailureException();
} }
} }

View File

@@ -129,9 +129,9 @@ namespace Cryville.Crtr {
return Match(c); return Match(c);
} }
public SkinContext Match(SkinContext a) { public SkinContext Match(SkinContext a) {
ChartPlayer.etor.ContextTransform = a.Transform; PdtEvaluator.Instance.ContextTransform = a.Transform;
try { try {
if (!ChartPlayer.etor.Evaluate(_op, _exp)) if (!PdtEvaluator.Instance.Evaluate(_op, _exp))
throw new EvaluationFailureException(); throw new EvaluationFailureException();
return _flag ? a : null; return _flag ? a : null;
} }
@@ -139,7 +139,7 @@ namespace Cryville.Crtr {
throw new SelectorNotAvailableException("The expression is not evaluatable under the current context", ex); throw new SelectorNotAvailableException("The expression is not evaluatable under the current context", ex);
} }
finally { finally {
ChartPlayer.etor.ContextTransform = null; PdtEvaluator.Instance.ContextTransform = null;
} }
} }
} }