Implement set variable annotation.
This commit is contained in:
@@ -73,8 +73,8 @@ 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, _currentState.duration);
|
ChartPlayer.etor.Evaluate(_durationOp, _currentState.duration);
|
||||||
if (emitting) _skinContainer.MatchDynamic(0);
|
if (emitting) _skinContainer.MatchDynamic(0, true);
|
||||||
_skinContainer.MatchDynamic(1);
|
_skinContainer.MatchDynamic(1, emitting);
|
||||||
ChartPlayer.etor.ContextCascadeDiscard();
|
ChartPlayer.etor.ContextCascadeDiscard();
|
||||||
}
|
}
|
||||||
public bool OnStateDone() {
|
public bool OnStateDone() {
|
||||||
|
@@ -32,7 +32,7 @@ namespace Cryville.Crtr {
|
|||||||
else if (name == _var_null) { LoadIdent(0); type = PdtInternalType.Undefined; value = _numbuf; }
|
else if (name == _var_null) { LoadIdent(0); type = PdtInternalType.Undefined; value = _numbuf; }
|
||||||
else {
|
else {
|
||||||
var id = new Identifier(name);
|
var id = new Identifier(name);
|
||||||
PropSrc prop;
|
PropSrc prop; SkinVariable variable;
|
||||||
if (ContextEvent != null && ContextEvent.PropSrcs.TryGetValue(name, out prop)) {
|
if (ContextEvent != null && ContextEvent.PropSrcs.TryGetValue(name, out prop)) {
|
||||||
prop.Get(out type, out value);
|
prop.Get(out type, out value);
|
||||||
}
|
}
|
||||||
@@ -45,6 +45,9 @@ namespace Cryville.Crtr {
|
|||||||
prop.Get(out type, out value);
|
prop.Get(out type, out value);
|
||||||
RevokePotentialConstant();
|
RevokePotentialConstant();
|
||||||
}
|
}
|
||||||
|
else if (ContextSkinContainer != null && ContextSkinContainer.Variables.TryGetValue(name, out variable)) {
|
||||||
|
variable.Src.Get(out type, out value);
|
||||||
|
}
|
||||||
else if (ContextJudge != null && ContextJudge.TryGetScoreSrc(name, out prop)) {
|
else if (ContextJudge != null && ContextJudge.TryGetScoreSrc(name, out prop)) {
|
||||||
prop.Get(out type, out value);
|
prop.Get(out type, out value);
|
||||||
RevokePotentialConstant();
|
RevokePotentialConstant();
|
||||||
@@ -106,6 +109,7 @@ namespace Cryville.Crtr {
|
|||||||
|
|
||||||
public ChartEvent ContextEvent { get; set; }
|
public ChartEvent ContextEvent { get; set; }
|
||||||
public ContainerState ContextState { get; set; }
|
public ContainerState ContextState { get; set; }
|
||||||
|
public SkinContainer ContextSkinContainer { get; set; }
|
||||||
public Transform ContextTransform { get; set; }
|
public Transform ContextTransform { get; set; }
|
||||||
public Judge ContextJudge { get; set; }
|
public Judge ContextJudge { get; set; }
|
||||||
public PropSrc ContextSelfValue { get; set; }
|
public PropSrc ContextSelfValue { get; set; }
|
||||||
|
@@ -9,6 +9,7 @@ namespace Cryville.Crtr {
|
|||||||
readonly SkinElement _rootElement;
|
readonly SkinElement _rootElement;
|
||||||
readonly DynamicStack[] _stacks = new DynamicStack[2];
|
readonly DynamicStack[] _stacks = new DynamicStack[2];
|
||||||
readonly HashSet<SkinPropertyKey> _once = new HashSet<SkinPropertyKey>();
|
readonly HashSet<SkinPropertyKey> _once = new HashSet<SkinPropertyKey>();
|
||||||
|
public readonly Dictionary<int, SkinVariable> Variables = new Dictionary<int, SkinVariable>();
|
||||||
|
|
||||||
class DynamicStack {
|
class DynamicStack {
|
||||||
public readonly List<DynamicProperty> Properties = new List<DynamicProperty>();
|
public readonly List<DynamicProperty> Properties = new List<DynamicProperty>();
|
||||||
@@ -45,7 +46,7 @@ namespace Cryville.Crtr {
|
|||||||
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, Variables);
|
||||||
}
|
}
|
||||||
catch (EvaluationFailureException) { }
|
catch (EvaluationFailureException) { }
|
||||||
if (p.Key.IsValueRequired && !p.Value.IsConstant) stack.Properties.Add(
|
if (p.Key.IsValueRequired && !p.Value.IsConstant) stack.Properties.Add(
|
||||||
@@ -73,15 +74,16 @@ namespace Cryville.Crtr {
|
|||||||
}
|
}
|
||||||
if (rc.PropSrcs != null) ChartPlayer.etor.ContextCascadeDiscard();
|
if (rc.PropSrcs != null) ChartPlayer.etor.ContextCascadeDiscard();
|
||||||
}
|
}
|
||||||
public void MatchDynamic(int dl) {
|
public void MatchDynamic(int dl, bool recursive = false) {
|
||||||
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;
|
||||||
if (nstack != null) nstack.Clear();
|
if (nstack != null) nstack.Clear();
|
||||||
Profiler.BeginSample("SkinContainer.MatchDynamic");
|
Profiler.BeginSample("SkinContainer.MatchDynamic");
|
||||||
|
if (!recursive) ChartPlayer.etor.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, dl);
|
p.Key.ExecuteDynamic(_group, p.Context, p.Value, Variables, dl);
|
||||||
if (p.Key.annotations.Contains("once")) {
|
if (p.Key.annotations.Contains("once")) {
|
||||||
stack.Properties.RemoveAt(i--);
|
stack.Properties.RemoveAt(i--);
|
||||||
}
|
}
|
||||||
@@ -108,6 +110,7 @@ namespace Cryville.Crtr {
|
|||||||
}
|
}
|
||||||
if (psrcs != null) ChartPlayer.etor.ContextCascadeDiscard();
|
if (psrcs != null) ChartPlayer.etor.ContextCascadeDiscard();
|
||||||
}
|
}
|
||||||
|
if (!recursive) ChartPlayer.etor.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) {
|
||||||
@@ -117,11 +120,11 @@ namespace Cryville.Crtr {
|
|||||||
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;
|
||||||
p.Key.ExecuteDynamic(_group, ctx, p.Value, dl);
|
p.Key.ExecuteDynamic(_group, ctx, p.Value, Variables, dl);
|
||||||
_once.Add(p.Key);
|
_once.Add(p.Key);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
p.Key.ExecuteDynamic(_group, ctx, p.Value, dl);
|
p.Key.ExecuteDynamic(_group, ctx, p.Value, Variables, dl);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ChartPlayer.etor.ContextTransform = null;
|
ChartPlayer.etor.ContextTransform = null;
|
||||||
@@ -144,15 +147,17 @@ namespace Cryville.Crtr {
|
|||||||
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;
|
||||||
ChartPlayer.etor.ContextSelfValue = _rtimeSrc;
|
ChartPlayer.etor.ContextSelfValue = _rtimeSrc;
|
||||||
MatchAnimationInternal(span, rtime, ctx);
|
MatchAnimationInternal(span, rtime, ctx);
|
||||||
ChartPlayer.etor.ContextSelfValue = null;
|
ChartPlayer.etor.ContextSelfValue = null;
|
||||||
|
ChartPlayer.etor.ContextSkinContainer = null;
|
||||||
}
|
}
|
||||||
void MatchAnimationInternal(AnimationSpan span, float rtime, RuntimeSkinContext ctx) {
|
void MatchAnimationInternal(AnimationSpan span, float rtime, RuntimeSkinContext ctx) {
|
||||||
_rtime = rtime;
|
_rtime = rtime;
|
||||||
_rtimeSrc.Invalidate();
|
_rtimeSrc.Invalidate();
|
||||||
foreach (var p in span.properties) {
|
foreach (var p in span.properties) {
|
||||||
p.Key.ExecuteDynamic(_group, ctx, p.Value, 0);
|
p.Key.ExecuteDynamic(_group, ctx, p.Value, Variables, 0);
|
||||||
}
|
}
|
||||||
foreach (var s in span.spans) {
|
foreach (var s in span.spans) {
|
||||||
if (rtime < s.Key.Behind || rtime >= s.Key.Ahead) continue;
|
if (rtime < s.Key.Behind || rtime >= s.Key.Ahead) continue;
|
||||||
@@ -202,4 +207,17 @@ namespace Cryville.Crtr {
|
|||||||
void RegisterAnchor(int name);
|
void RegisterAnchor(int name);
|
||||||
void PushAnchorEvent(double time, int name);
|
void PushAnchorEvent(double time, int name);
|
||||||
}
|
}
|
||||||
|
public class SkinVariable {
|
||||||
|
float _value;
|
||||||
|
public PropOp Op { get; private set; }
|
||||||
|
public PropSrc Src { get; private set; }
|
||||||
|
public SkinVariable() {
|
||||||
|
Op = new PropOp.Float(Set);
|
||||||
|
Src = new PropSrc.Float(() => _value);
|
||||||
|
}
|
||||||
|
void Set(float value) {
|
||||||
|
_value = value;
|
||||||
|
Src.Invalidate();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@@ -21,6 +21,10 @@ namespace Cryville.Crtr {
|
|||||||
if (k.Count != 1) throw new FormatException("Invalid effect name");
|
if (k.Count != 1) throw new FormatException("Invalid effect name");
|
||||||
return new EmitEffect(a, IdentifierManager.SharedInstance.Request(k[0]));
|
return new EmitEffect(a, IdentifierManager.SharedInstance.Request(k[0]));
|
||||||
}
|
}
|
||||||
|
else if (a.Remove("var")) {
|
||||||
|
if (k.Count != 1) throw new FormatException("Invalid variable name");
|
||||||
|
return new SetVariable(a, IdentifierManager.SharedInstance.Request(k[0]));
|
||||||
|
}
|
||||||
switch (k.Count) {
|
switch (k.Count) {
|
||||||
case 1:
|
case 1:
|
||||||
if (compKeyFlag) return new CreateComponent(a, GetComponentByName(k[0]));
|
if (compKeyFlag) return new CreateComponent(a, GetComponentByName(k[0]));
|
||||||
@@ -42,8 +46,8 @@ namespace Cryville.Crtr {
|
|||||||
}
|
}
|
||||||
public abstract override string ToString();
|
public abstract override string ToString();
|
||||||
public abstract bool IsValueRequired { get; }
|
public abstract bool IsValueRequired { get; }
|
||||||
public abstract void ExecuteStatic(ISkinnableGroup group, RuntimeSkinContext ctx, PdtExpression exp);
|
public abstract void ExecuteStatic(ISkinnableGroup group, RuntimeSkinContext ctx, PdtExpression exp, Dictionary<int, SkinVariable> vars);
|
||||||
public abstract void ExecuteDynamic(ISkinnableGroup group, RuntimeSkinContext ctx, PdtExpression exp, int dl);
|
public abstract void ExecuteDynamic(ISkinnableGroup group, RuntimeSkinContext ctx, PdtExpression exp, Dictionary<int, SkinVariable> vars, int dl);
|
||||||
public class CreateComponent : SkinPropertyKey {
|
public class CreateComponent : SkinPropertyKey {
|
||||||
public Type Component { get; private set; }
|
public Type Component { get; private set; }
|
||||||
public CreateComponent(IEnumerable<string> a, Type component) : base(a) {
|
public CreateComponent(IEnumerable<string> a, Type component) : base(a) {
|
||||||
@@ -53,10 +57,10 @@ namespace Cryville.Crtr {
|
|||||||
return string.Format("*{0}", Component.Name);
|
return string.Format("*{0}", Component.Name);
|
||||||
}
|
}
|
||||||
public override bool IsValueRequired { get { return false; } }
|
public override bool IsValueRequired { get { return false; } }
|
||||||
public override void ExecuteStatic(ISkinnableGroup group, RuntimeSkinContext ctx, PdtExpression exp) {
|
public override void ExecuteStatic(ISkinnableGroup group, RuntimeSkinContext ctx, PdtExpression exp, Dictionary<int, SkinVariable> vars) {
|
||||||
ctx.WriteTransform.gameObject.AddComponent(Component);
|
ctx.WriteTransform.gameObject.AddComponent(Component);
|
||||||
}
|
}
|
||||||
public override void ExecuteDynamic(ISkinnableGroup group, RuntimeSkinContext ctx, PdtExpression exp, int dl) {
|
public override void ExecuteDynamic(ISkinnableGroup group, RuntimeSkinContext ctx, PdtExpression exp, Dictionary<int, SkinVariable> vars, int dl) {
|
||||||
throw new InvalidOperationException("Component creation in dynamic context is not allowed");
|
throw new InvalidOperationException("Component creation in dynamic context is not allowed");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -71,10 +75,10 @@ namespace Cryville.Crtr {
|
|||||||
return string.Format("{0}.{1}", Component.Name, IdentifierManager.SharedInstance.Retrieve(Name));
|
return string.Format("{0}.{1}", Component.Name, IdentifierManager.SharedInstance.Retrieve(Name));
|
||||||
}
|
}
|
||||||
public override bool IsValueRequired { get { return true; } }
|
public override bool IsValueRequired { get { return true; } }
|
||||||
public override void ExecuteStatic(ISkinnableGroup group, RuntimeSkinContext ctx, PdtExpression exp) {
|
public override void ExecuteStatic(ISkinnableGroup group, RuntimeSkinContext ctx, PdtExpression exp, Dictionary<int, SkinVariable> vars) {
|
||||||
Execute(ctx, GetPropOp(ctx.WriteTransform).Operator, exp);
|
Execute(ctx, GetPropOp(ctx.WriteTransform).Operator, exp);
|
||||||
}
|
}
|
||||||
public override void ExecuteDynamic(ISkinnableGroup group, RuntimeSkinContext ctx, PdtExpression exp, int dl) {
|
public override void ExecuteDynamic(ISkinnableGroup group, RuntimeSkinContext ctx, PdtExpression exp, Dictionary<int, SkinVariable> vars, int dl) {
|
||||||
var prop = GetPropOp(ctx.WriteTransform);
|
var prop = GetPropOp(ctx.WriteTransform);
|
||||||
if (dl > prop.UpdateDynamicLevel) return;
|
if (dl > prop.UpdateDynamicLevel) return;
|
||||||
Execute(ctx, prop.Operator, exp);
|
Execute(ctx, prop.Operator, exp);
|
||||||
@@ -110,10 +114,10 @@ namespace Cryville.Crtr {
|
|||||||
return string.Format("@has {0}", IdentifierManager.SharedInstance.Retrieve(Name));
|
return string.Format("@has {0}", IdentifierManager.SharedInstance.Retrieve(Name));
|
||||||
}
|
}
|
||||||
public override bool IsValueRequired { get { return false; } }
|
public override bool IsValueRequired { get { return false; } }
|
||||||
public override void ExecuteStatic(ISkinnableGroup group, RuntimeSkinContext ctx, PdtExpression exp) {
|
public override void ExecuteStatic(ISkinnableGroup group, RuntimeSkinContext ctx, PdtExpression exp, Dictionary<int, SkinVariable> vars) {
|
||||||
group.RegisterAnchor(Name);
|
group.RegisterAnchor(Name);
|
||||||
}
|
}
|
||||||
public override void ExecuteDynamic(ISkinnableGroup group, RuntimeSkinContext ctx, PdtExpression exp, int dl) {
|
public override void ExecuteDynamic(ISkinnableGroup group, RuntimeSkinContext ctx, PdtExpression exp, Dictionary<int, SkinVariable> vars, int dl) {
|
||||||
throw new InvalidOperationException("Anchor creation in dynamic context is not allowed");
|
throw new InvalidOperationException("Anchor creation in dynamic context is not allowed");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -127,12 +131,12 @@ namespace Cryville.Crtr {
|
|||||||
return string.Format("@at {0}", IdentifierManager.SharedInstance.Retrieve(Name));
|
return string.Format("@at {0}", IdentifierManager.SharedInstance.Retrieve(Name));
|
||||||
}
|
}
|
||||||
public override bool IsValueRequired { get { return true; } }
|
public override bool IsValueRequired { get { return true; } }
|
||||||
public override void ExecuteStatic(ISkinnableGroup group, RuntimeSkinContext ctx, PdtExpression exp) {
|
public override void ExecuteStatic(ISkinnableGroup group, RuntimeSkinContext ctx, PdtExpression exp, Dictionary<int, SkinVariable> vars) {
|
||||||
throw new InvalidOperationException("Setting anchor in static context is not allowed");
|
throw new InvalidOperationException("Setting anchor in static context is not allowed");
|
||||||
}
|
}
|
||||||
float _time;
|
float _time;
|
||||||
readonly PropOp _timeOp;
|
readonly PropOp _timeOp;
|
||||||
public override void ExecuteDynamic(ISkinnableGroup group, RuntimeSkinContext ctx, PdtExpression exp, int dl) {
|
public override void ExecuteDynamic(ISkinnableGroup group, RuntimeSkinContext ctx, PdtExpression exp, Dictionary<int, SkinVariable> vars, int dl) {
|
||||||
if (dl > 0) return;
|
if (dl > 0) return;
|
||||||
var psrcs = ctx.ReadContext.PropSrcs;
|
var psrcs = ctx.ReadContext.PropSrcs;
|
||||||
if (psrcs != null) ChartPlayer.etor.ContextCascadeInsert(psrcs);
|
if (psrcs != null) ChartPlayer.etor.ContextCascadeInsert(psrcs);
|
||||||
@@ -151,15 +155,37 @@ namespace Cryville.Crtr {
|
|||||||
return string.Format("@emit {0}", IdentifierManager.SharedInstance.Retrieve(Name));
|
return string.Format("@emit {0}", IdentifierManager.SharedInstance.Retrieve(Name));
|
||||||
}
|
}
|
||||||
public override bool IsValueRequired { get { return true; } }
|
public override bool IsValueRequired { get { return true; } }
|
||||||
public override void ExecuteStatic(ISkinnableGroup group, RuntimeSkinContext ctx, PdtExpression exp) {
|
public override void ExecuteStatic(ISkinnableGroup group, RuntimeSkinContext ctx, PdtExpression exp, Dictionary<int, SkinVariable> vars) {
|
||||||
throw new InvalidOperationException("Emitting effect in static context is not allowed");
|
throw new InvalidOperationException("Emitting effect in static context is not allowed");
|
||||||
}
|
}
|
||||||
float _index;
|
float _index;
|
||||||
readonly PropOp _op;
|
readonly PropOp _op;
|
||||||
public override void ExecuteDynamic(ISkinnableGroup group, RuntimeSkinContext ctx, PdtExpression exp, int dl) {
|
public override void ExecuteDynamic(ISkinnableGroup group, RuntimeSkinContext ctx, PdtExpression exp, Dictionary<int, SkinVariable> vars, int dl) {
|
||||||
ChartPlayer.etor.Evaluate(_op, exp);
|
ChartPlayer.etor.Evaluate(_op, exp);
|
||||||
ChartPlayer.effectManager.Emit(Name, _index);
|
ChartPlayer.effectManager.Emit(Name, _index);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
public class SetVariable : SkinPropertyKey {
|
||||||
|
public int Name { get; private set; }
|
||||||
|
public SetVariable(IEnumerable<string> a, int name) : base(a) {
|
||||||
|
Name = name;
|
||||||
|
}
|
||||||
|
public override string ToString() {
|
||||||
|
return string.Format("@var {0}", IdentifierManager.SharedInstance.Retrieve(Name));
|
||||||
|
}
|
||||||
|
public override bool IsValueRequired { get { return true; } }
|
||||||
|
public override void ExecuteStatic(ISkinnableGroup group, RuntimeSkinContext ctx, PdtExpression exp, Dictionary<int, SkinVariable> vars) {
|
||||||
|
SkinVariable v;
|
||||||
|
if (!vars.TryGetValue(Name, out v))
|
||||||
|
vars.Add(Name, v = new SkinVariable());
|
||||||
|
ChartPlayer.etor.Evaluate(v.Op, exp);
|
||||||
|
}
|
||||||
|
public override void ExecuteDynamic(ISkinnableGroup group, RuntimeSkinContext ctx, PdtExpression exp, Dictionary<int, SkinVariable> vars, int dl) {
|
||||||
|
SkinVariable v;
|
||||||
|
if (!vars.TryGetValue(Name, out v))
|
||||||
|
throw new InvalidOperationException(string.Format("Variable \"{0}\" not defined", IdentifierManager.SharedInstance.Retrieve(Name)));
|
||||||
|
ChartPlayer.etor.Evaluate(v.Op, exp);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user