Remove some dedicated properties on ISkinnableGroup.

This commit is contained in:
2023-02-17 18:10:46 +08:00
parent 88d35e4eaf
commit 9c08cbf0d2
5 changed files with 72 additions and 78 deletions

View File

@@ -8,10 +8,9 @@ using System.Runtime.CompilerServices;
using UnityEngine;
namespace Cryville.Crtr.Event {
public abstract class ContainerHandler {
public abstract class ContainerHandler : ISkinnableGroup {
#region Struct
public ContainerHandler() { }
public abstract string TypeName { get; }
/// <summary>
/// Prehandling <see cref="ContainerState"/>, prehandling the events.
@@ -42,7 +41,6 @@ namespace Cryville.Crtr.Event {
/// <see cref="GameObject"/> group, the <see cref="Transform"/> containing all the generated elements in the <see cref="ContainerHandler"/>.
/// </summary>
protected Transform gogroup;
public SkinContext SkinContext;
public Vector3 Position { get; protected set; }
public Quaternion Rotation { get; protected set; }
@@ -79,7 +77,6 @@ namespace Cryville.Crtr.Event {
public readonly Dictionary<int, List<Anchor>> Anchors = new Dictionary<int, List<Anchor>>();
public readonly Dictionary<int, Anchor> DynamicAnchors = new Dictionary<int, Anchor>();
public readonly Dictionary<int, bool> DynamicAnchorSet = new Dictionary<int, bool>();
public Anchor OpenedAnchor;
Anchor a_cur;
Anchor a_head;
Anchor a_tail;
@@ -127,7 +124,11 @@ namespace Cryville.Crtr.Event {
a_tail = RegisterAnchor(_a_tail, true);
}
public virtual void Init() {
skinContainer.MatchStatic(ps);
ChartPlayer.etor.ContextState = ps;
ChartPlayer.etor.ContextEvent = Container;
skinContainer.MatchStatic(this);
ChartPlayer.etor.ContextEvent = null;
ChartPlayer.etor.ContextState = null;
foreach (var i in gogroup.GetComponentsInChildren<SkinComponent>())
i.Init();
}
@@ -160,7 +161,7 @@ namespace Cryville.Crtr.Event {
tev.Target.Transform.position = Position;
tev.Target.Transform.rotation = Rotation;
#endif
skinContainer.MatchDynamic(s);
MatchDynamic(s, 1);
CloseAnchor();
}
if (tev.Target == a_head) {
@@ -171,7 +172,7 @@ namespace Cryville.Crtr.Event {
}
anchorEvPool.Return(tev);
}
else if (gogroup && s.CloneType == 2) skinContainer.MatchDynamic(s);
else if (gogroup && s.CloneType == 2) MatchDynamic(s, 1);
}
#region End methods
public virtual void EndGraphicalUpdate(ContainerState s) { }
@@ -185,15 +186,25 @@ namespace Cryville.Crtr.Event {
}
public virtual void DisposeAll() { }
#endregion
#region Utils
[MethodImpl(MethodImplOptions.AggressiveInlining)]
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;
skinContainer.MatchDynamic(this, dl);
ChartPlayer.etor.ContextEvent = null;
ChartPlayer.etor.ContextState = null;
}
#endregion
#region Anchor
public virtual void Anchor() {
foreach (var p in PropSrcs.Values) p.Invalidate();
foreach (var a in DynamicAnchors.Keys) DynamicAnchorSet[a] = false;
atime_head = cs.StampedContainer.Time;
atime_tail = atime_head + cs.StampedContainer.Duration;
skinContainer.MatchDynamic(cs);
MatchDynamic(cs, 0);
if (cs.Active) PushAnchorEvent(cs.Time, a_cur);
if (Alive) {
if (!DynamicAnchorSet[_a_head]) PushAnchorEvent(atime_head, a_head, -1, true);
@@ -203,20 +214,6 @@ namespace Cryville.Crtr.Event {
}
static readonly SimpleObjectPool<StampedEvent.Anchor> anchorEvPool
= new SimpleObjectPool<StampedEvent.Anchor>(1024);
public void PushAnchorEvent(double time, int name) {
Anchor anchor;
if (!DynamicAnchors.TryGetValue(name, out anchor))
throw new ArgumentException(string.Format("Specified anchor \"{0}\" not found", IdentifierManager.SharedInstance.Retrieve(name)));
if (DynamicAnchorSet[name])
throw new InvalidOperationException(string.Format("Specified anchor \"{0}\" has been set", IdentifierManager.SharedInstance.Retrieve(name)));
int priority = 0;
bool forced = true;
if (name == _a_head) { priority = -1; atime_head = time; }
else if (name == _a_tail) { priority = 1; atime_tail = time; }
else forced = false;
PushAnchorEvent(time, anchor, priority, forced);
DynamicAnchorSet[name] = true;
}
void PushAnchorEvent(double time, Anchor anchor, int priority = 0, bool forced = false) {
var tev = anchorEvPool.Rent();
tev.Time = time;
@@ -233,5 +230,34 @@ namespace Cryville.Crtr.Event {
}
#endregion
#endregion
#region ISkinnableGroup
public abstract string TypeName { get; }
public SkinContext SkinContext { get; set; }
public Anchor OpenedAnchor { get; set; }
public bool TryGetAnchorsByName(int name, out IReadOnlyCollection<Anchor> result) {
List<Anchor> anchors;
var ret = Anchors.TryGetValue(name, out anchors);
result = anchors;
return ret;
}
void ISkinnableGroup.RegisterAnchor(int name) {
RegisterAnchor(name, true);
}
public void PushAnchorEvent(double time, int name) {
Anchor anchor;
if (!DynamicAnchors.TryGetValue(name, out anchor))
throw new ArgumentException(string.Format("Specified anchor \"{0}\" not found", IdentifierManager.SharedInstance.Retrieve(name)));
if (DynamicAnchorSet[name])
throw new InvalidOperationException(string.Format("Specified anchor \"{0}\" has been set", IdentifierManager.SharedInstance.Retrieve(name)));
int priority = 0;
bool forced = true;
if (name == _a_head) { priority = -1; atime_head = time; }
else if (name == _a_tail) { priority = 1; atime_tail = time; }
else forced = false;
PushAnchorEvent(time, anchor, priority, forced);
DynamicAnchorSet[name] = true;
}
#endregion
}
}

View File

@@ -8,7 +8,7 @@ using System.Runtime.CompilerServices;
using UnityEngine;
namespace Cryville.Crtr.Event {
public class ContainerState : ISkinnableGroup {
public class ContainerState {
#region Struct
public EventBus Bus;
public EventContainer Container;
@@ -466,26 +466,5 @@ namespace Cryville.Crtr.Event {
}
}
#endregion
#region ISkinnableGroup
public int DynamicLevel { get { return CloneType >> 1; } }
public string TypeName { get { return Handler.TypeName; } }
public ContainerState State { get { return this; } }
EventContainer ISkinnableGroup.Container { get { return Container; } }
public SkinContext SkinContext { get { return Handler.SkinContext; } }
public Anchor OpenedAnchor { get { return Handler.OpenedAnchor; } }
public bool TryGetAnchorsByName(int name, out IReadOnlyCollection<Anchor> result) {
List<Anchor> anchors;
var ret = Handler.Anchors.TryGetValue(name, out anchors);
result = anchors;
return ret;
}
public void RegisterAnchor(int name) {
Handler.RegisterAnchor(name, true);
}
public void PushAnchorEvent(double time, int name) {
Handler.PushAnchorEvent(time, name);
}
#endregion
}
}

View File

@@ -33,11 +33,7 @@ namespace Cryville.Crtr {
public void MatchStatic(ISkinnableGroup group) {
var stack = _stacks[0];
stack.Clear();
if (group.State != null) ChartPlayer.etor.ContextState = group.State;
if (group.Container != null) ChartPlayer.etor.ContextEvent = group.Container;
MatchStatic(_rootElement, group, stack, new RuntimeSkinContext(group.SkinContext));
ChartPlayer.etor.ContextEvent = null;
ChartPlayer.etor.ContextState = null;
}
void MatchStatic(SkinElement rel, ISkinnableGroup group, DynamicStack stack, RuntimeSkinContext ctx) {
var rc = ctx.ReadContext;
@@ -70,17 +66,15 @@ namespace Cryville.Crtr {
}
if (rc.PropSrcs != null) ChartPlayer.etor.ContextCascadeDiscard();
}
public void MatchDynamic(ISkinnableGroup group) {
var stack = _stacks[group.DynamicLevel];
var nstack = group.DynamicLevel + 1 < _stacks.Length ? _stacks[group.DynamicLevel + 1] : null;
if (nstack != null) nstack.Clear();
public void MatchDynamic(ISkinnableGroup group, int dl) {
var stack = _stacks[dl];
if (stack.Properties.Count == 0 && stack.Elements.Count == 0) return;
var nstack = dl + 1 < _stacks.Length ? _stacks[dl + 1] : null;
if (nstack != null) nstack.Clear();
Profiler.BeginSample("SkinContainer.MatchDynamic");
if (group.State != null) ChartPlayer.etor.ContextState = group.State;
if (group.Container != null) ChartPlayer.etor.ContextEvent = group.Container;
for (int i = 0; i < stack.Properties.Count; i++) {
DynamicProperty p = stack.Properties[i];
p.Key.ExecuteDynamic(group, p.Context, p.Value);
p.Key.ExecuteDynamic(group, p.Context, p.Value, dl);
}
for (int i = 0; i < stack.Elements.Count; i++) {
DynamicElement e = stack.Elements[i];
@@ -94,27 +88,25 @@ namespace Cryville.Crtr {
if (nstack == null) throw;
nstack.Elements.Add(e);
}
if (nctx != null) MatchDynamic(e.Element, group, nstack, new RuntimeSkinContext(
if (nctx != null) MatchDynamic(e.Element, group, dl, nstack, new RuntimeSkinContext(
nctx, e.Context, e.Selectors.annotations.Contains("if"), e.Selectors.annotations.Contains("then")
));
if (psrcs != null) ChartPlayer.etor.ContextCascadeDiscard();
}
ChartPlayer.etor.ContextEvent = null;
ChartPlayer.etor.ContextState = null;
Profiler.EndSample();
}
void MatchDynamic(SkinElement rel, ISkinnableGroup group, DynamicStack stack, RuntimeSkinContext ctx) {
void MatchDynamic(SkinElement rel, ISkinnableGroup group, int dl, DynamicStack stack, 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) {
p.Key.ExecuteDynamic(group, ctx, p.Value);
p.Key.ExecuteDynamic(group, ctx, p.Value, dl);
}
ChartPlayer.etor.ContextTransform = null;
foreach (var e in rel.elements) {
if (e.Key.IsUpdatable(group)) {
if (e.Key.IsUpdatable(group, dl)) {
SkinContext nctx = e.Key.MatchDynamic(group, rc);
if (nctx != null) MatchDynamic(e.Value, group, stack, new RuntimeSkinContext(
if (nctx != null) MatchDynamic(e.Value, group, dl, stack, new RuntimeSkinContext(
nctx, ctx, e.Key.annotations.Contains("if"), e.Key.annotations.Contains("then")
));
}
@@ -163,10 +155,7 @@ namespace Cryville.Crtr {
}
}
public interface ISkinnableGroup {
int DynamicLevel { get; }
string TypeName { get; }
ContainerState State { get; }
EventContainer Container { get; }
SkinContext SkinContext { get; }
Anchor OpenedAnchor { get; }
bool TryGetAnchorsByName(int name, out IReadOnlyCollection<Anchor> result);

View File

@@ -9,7 +9,7 @@ namespace Cryville.Crtr {
public abstract override string ToString();
public abstract bool IsValueRequired { get; }
public abstract void ExecuteStatic(ISkinnableGroup group, RuntimeSkinContext ctx, PdtExpression exp);
public abstract void ExecuteDynamic(ISkinnableGroup group, RuntimeSkinContext ctx, PdtExpression exp);
public abstract void ExecuteDynamic(ISkinnableGroup group, RuntimeSkinContext ctx, PdtExpression exp, int dl);
public class CreateComponent : SkinPropertyKey {
public Type Component { get; set; }
public override string ToString() {
@@ -19,7 +19,7 @@ namespace Cryville.Crtr {
public override void ExecuteStatic(ISkinnableGroup group, RuntimeSkinContext ctx, PdtExpression exp) {
ctx.WriteTransform.gameObject.AddComponent(Component);
}
public override void ExecuteDynamic(ISkinnableGroup group, RuntimeSkinContext ctx, PdtExpression exp) {
public override void ExecuteDynamic(ISkinnableGroup group, RuntimeSkinContext ctx, PdtExpression exp, int dl) {
throw new InvalidOperationException("Component creation in dynamic context is not allowed");
}
}
@@ -33,9 +33,9 @@ namespace Cryville.Crtr {
public override void ExecuteStatic(ISkinnableGroup group, RuntimeSkinContext ctx, PdtExpression exp) {
Execute(ctx, GetPropOp(ctx.WriteTransform).Operator, exp);
}
public override void ExecuteDynamic(ISkinnableGroup group, RuntimeSkinContext ctx, PdtExpression exp) {
public override void ExecuteDynamic(ISkinnableGroup group, RuntimeSkinContext ctx, PdtExpression exp, int dl) {
var prop = GetPropOp(ctx.WriteTransform);
if (group.DynamicLevel > prop.UpdateDynamicLevel) return;
if (dl > prop.UpdateDynamicLevel) return;
Execute(ctx, prop.Operator, exp);
}
void Execute(RuntimeSkinContext ctx, PdtOperator op, PdtExpression exp) {
@@ -69,7 +69,7 @@ namespace Cryville.Crtr {
public override void ExecuteStatic(ISkinnableGroup group, RuntimeSkinContext ctx, PdtExpression exp) {
group.RegisterAnchor(Name);
}
public override void ExecuteDynamic(ISkinnableGroup group, RuntimeSkinContext ctx, PdtExpression exp) {
public override void ExecuteDynamic(ISkinnableGroup group, RuntimeSkinContext ctx, PdtExpression exp, int dl) {
throw new InvalidOperationException("Anchor creation in dynamic context is not allowed");
}
}
@@ -87,8 +87,8 @@ namespace Cryville.Crtr {
}
float _time;
readonly PropOp _timeOp;
public override void ExecuteDynamic(ISkinnableGroup group, RuntimeSkinContext ctx, PdtExpression exp) {
if (group.DynamicLevel > 0) return;
public override void ExecuteDynamic(ISkinnableGroup group, RuntimeSkinContext ctx, PdtExpression exp, int dl) {
if (dl > 0) return;
var psrcs = ctx.ReadContext.PropSrcs;
if (psrcs != null) ChartPlayer.etor.ContextCascadeInsert(psrcs);
ChartPlayer.etor.Evaluate(_timeOp, exp);
@@ -106,7 +106,7 @@ namespace Cryville.Crtr {
public override void ExecuteStatic(ISkinnableGroup group, RuntimeSkinContext ctx, PdtExpression exp) {
// TODO
}
public override void ExecuteDynamic(ISkinnableGroup group, RuntimeSkinContext ctx, PdtExpression exp) {
public override void ExecuteDynamic(ISkinnableGroup group, RuntimeSkinContext ctx, PdtExpression exp, int dl) {
// TODO
}
}

View File

@@ -43,9 +43,9 @@ namespace Cryville.Crtr {
}
return result;
}
public bool IsUpdatable(ISkinnableGroup g) {
public bool IsUpdatable(ISkinnableGroup g, int dl) {
foreach (var s in selectors)
if (!s.IsUpdatable(g)) return false;
if (!s.IsUpdatable(g, dl)) return false;
return true;
}
public SkinContext MatchDynamic(ISkinnableGroup g, SkinContext ctx) {
@@ -64,7 +64,7 @@ namespace Cryville.Crtr {
public virtual void Optimize(PdtEvaluatorBase etor) { }
public virtual IEnumerable<SkinContext> MatchStatic(ISkinnableGroup g, SkinContext c) { throw new SelectorNotAvailableException(); }
public virtual SkinContext MatchDynamic(ISkinnableGroup g, SkinContext c) { throw new SelectorNotAvailableException(); }
public virtual bool IsUpdatable(ISkinnableGroup g) {
public virtual bool IsUpdatable(ISkinnableGroup g, int dl) {
return true;
}
public class CreateObject : SkinSelector {
@@ -103,8 +103,8 @@ namespace Cryville.Crtr {
public override SkinContext MatchDynamic(ISkinnableGroup g, SkinContext c) {
return g.OpenedAnchor != null && g.OpenedAnchor.Name == Name ? c : null;
}
public override bool IsUpdatable(ISkinnableGroup g) {
return g.DynamicLevel >= 1;
public override bool IsUpdatable(ISkinnableGroup g, int dl) {
return dl >= 1;
}
}
public class Property : SkinSelector {