Add rewind and tick mechanism for skin component.

This commit is contained in:
2023-02-27 00:16:44 +08:00
parent 256c656e9c
commit 9a51cf1b56
4 changed files with 17 additions and 7 deletions

View File

@@ -26,6 +26,8 @@ namespace Cryville.Crtr.Components {
} }
public virtual void Init() { } public virtual void Init() { }
public virtual void Rewind(double time) { }
public virtual void Tick(SkinContainer c, double time) { }
protected abstract void OnDestroy(); protected abstract void OnDestroy();
} }
public struct SkinProperty { public struct SkinProperty {

View File

@@ -41,7 +41,7 @@ namespace Cryville.Crtr {
_endQueue.RemoveAt(0); _endQueue.RemoveAt(0);
} }
foreach (var instance in _instances) { foreach (var instance in _instances) {
instance.Value.Tick(); instance.Value.Tick(time);
} }
} }
public void Emit(float index) { public void Emit(float index) {
@@ -53,6 +53,7 @@ namespace Cryville.Crtr {
else { else {
_instances.Add(index, instance = _pool.Rent()); _instances.Add(index, instance = _pool.Rent());
} }
instance.Rewind(_time);
instance.Index = index; instance.Index = index;
instance.OnEmit(_time); instance.OnEmit(_time);
var i2 = ~_endQueue.BinarySearch(instance); var i2 = ~_endQueue.BinarySearch(instance);

View File

@@ -10,6 +10,7 @@ namespace Cryville.Crtr {
readonly EffectDefinition _def; readonly EffectDefinition _def;
readonly SkinContainer _skinContainer; readonly SkinContainer _skinContainer;
public Transform RootTransform { get; private set; } public Transform RootTransform { get; private set; }
readonly SkinComponent[] _comps;
public EffectInstance(EffectDefinition def) { public EffectInstance(EffectDefinition def) {
_def = def; _def = def;
_skinContainer = new SkinContainer(this, _def.elements); _skinContainer = new SkinContainer(this, _def.elements);
@@ -18,11 +19,14 @@ namespace Cryville.Crtr {
ChartPlayer.etor.ContextCascadeInsertBlock(); ChartPlayer.etor.ContextCascadeInsertBlock();
_skinContainer.MatchStatic(); _skinContainer.MatchStatic();
ChartPlayer.etor.ContextCascadeDiscardBlock(); ChartPlayer.etor.ContextCascadeDiscardBlock();
foreach (var i in RootTransform.GetComponentsInChildren<SkinComponent>()) _comps = RootTransform.GetComponentsInChildren<SkinComponent>();
i.Init(); foreach (var i in _comps) i.Init();
_indexSrc = new PropSrc.Float(() => Index); _indexSrc = new PropSrc.Float(() => Index);
_durationOp = new PropOp.Float(v => _duration = v); _durationOp = new PropOp.Float(v => _duration = v);
} }
public void Rewind(double time) {
foreach (var i in _comps) i.Rewind(time);
}
private float m_index; private float m_index;
public float Index { public float Index {
get { return m_index; } get { return m_index; }
@@ -38,8 +42,8 @@ namespace Cryville.Crtr {
float _duration; float _duration;
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(double time) {
_skinContainer.MatchDynamic(1); foreach (var i in _comps) i.Tick(_skinContainer, time);
} }
public void OnEmit(double time) { public void OnEmit(double time) {
_startTime = time; _startTime = time;

View File

@@ -42,6 +42,8 @@ namespace Cryville.Crtr.Event {
/// </summary> /// </summary>
protected Transform gogroup; protected Transform gogroup;
SkinComponent[] _comps;
public Vector3 Position { get; protected set; } public Vector3 Position { get; protected set; }
public Quaternion Rotation { get; protected set; } public Quaternion Rotation { get; protected set; }
public bool Alive { get; private set; } public bool Alive { get; private set; }
@@ -129,8 +131,8 @@ namespace Cryville.Crtr.Event {
skinContainer.MatchStatic(); 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>()) _comps = gogroup.GetComponentsInChildren<SkinComponent>();
i.Init(); foreach (var i in _comps) i.Init();
} }
public virtual void PostInit() { public virtual void PostInit() {
PropSrcs.Add(_var_current_time, new PropSrc.Float(() => (float)cs.rootPrototype.Time)); PropSrcs.Add(_var_current_time, new PropSrc.Float(() => (float)cs.rootPrototype.Time));
@@ -205,6 +207,7 @@ namespace Cryville.Crtr.Event {
atime_head = cs.StampedContainer.Time; atime_head = cs.StampedContainer.Time;
atime_tail = atime_head + cs.StampedContainer.Duration; atime_tail = atime_head + cs.StampedContainer.Duration;
MatchDynamic(cs, 0); MatchDynamic(cs, 0);
foreach (var i in _comps) i.Tick(skinContainer, cs.Time);
if (cs.Active) PushAnchorEvent(cs.Time, a_cur); if (cs.Active) PushAnchorEvent(cs.Time, a_cur);
if (double.IsNaN(DynamicAnchorSetTime[_a_head])) DynamicAnchorSetTime[_a_head] = atime_head; if (double.IsNaN(DynamicAnchorSetTime[_a_head])) DynamicAnchorSetTime[_a_head] = atime_head;
if (double.IsNaN(DynamicAnchorSetTime[_a_tail])) DynamicAnchorSetTime[_a_tail] = atime_tail; if (double.IsNaN(DynamicAnchorSetTime[_a_tail])) DynamicAnchorSetTime[_a_tail] = atime_tail;