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

View File

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

View File

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

View File

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

View File

@@ -127,12 +127,12 @@ namespace Cryville.Crtr.Event {
a_tail = RegisterAnchor(_a_tail, true);
}
public virtual void Init() {
ChartPlayer.etor.ContextState = ps;
ChartPlayer.etor.ContextEvent = Container;
PdtEvaluator.Instance.ContextState = ps;
PdtEvaluator.Instance.ContextEvent = Container;
skinContainer.MatchStatic();
MatchDynamic(ps, 0);
ChartPlayer.etor.ContextEvent = null;
ChartPlayer.etor.ContextState = null;
PdtEvaluator.Instance.ContextEvent = null;
PdtEvaluator.Instance.ContextState = null;
foreach (Transform child in RootTransform) {
if (child.CompareTag(TagRootTransform)) continue;
_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; }
[MethodImpl(MethodImplOptions.AggressiveInlining)]
void MatchDynamic(ContainerState s, int dl) {
ChartPlayer.etor.ContextState = s;
ChartPlayer.etor.ContextEvent = Container;
PdtEvaluator.Instance.ContextState = s;
PdtEvaluator.Instance.ContextEvent = Container;
skinContainer.MatchDynamic(dl);
ChartPlayer.etor.ContextEvent = null;
ChartPlayer.etor.ContextState = null;
PdtEvaluator.Instance.ContextEvent = null;
PdtEvaluator.Instance.ContextState = null;
}
#endregion
#region Anchor

View File

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

View File

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

View File

@@ -11,42 +11,42 @@ namespace Cryville.Crtr {
var exp = (PdtExpression)value;
if (type.Equals(typeof(bool))) {
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;
}
else if (type.Equals(typeof(int))) {
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;
}
else if (type.Equals(typeof(float))) {
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;
}
else if (type.Equals(typeof(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;
}
else if (type.IsEnum) {
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;
}
else if (type.Equals(typeof(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;
}
else if (type.Equals(typeof(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;
}
else if (type.Equals(typeof(Identifier[]))) {
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;
}
}

View File

@@ -10,6 +10,15 @@ using UnityEngine;
namespace Cryville.Crtr {
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 IntKeyedDictionary<PdtOperator> _ctxops = new IntKeyedDictionary<PdtOperator>();
@@ -152,6 +161,18 @@ namespace Cryville.Crtr {
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() {
ContextCascadeBlocks.Push(0);
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 value = new byte[op.Length];
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 {

View File

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

View File

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

View File

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

View File

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

View File

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