diff --git a/Assets/Cryville/Crtr/ChartHandler.cs b/Assets/Cryville/Crtr/ChartHandler.cs index 189b5ad..54e2280 100644 --- a/Assets/Cryville/Crtr/ChartHandler.cs +++ b/Assets/Cryville/Crtr/ChartHandler.cs @@ -1,16 +1,16 @@ using Cryville.Audio.Source; using Cryville.Crtr.Event; -using System; using System.Collections.Generic; using System.IO; namespace Cryville.Crtr { - public class ChartHandler : ContainerHandler { - public Chart chart; + public class ChartHandler : TransformHandler { + protected override TransformHandler Parent { get { return null; } } + + Chart chart; readonly List sounds = new List(); - public ChartHandler(Chart _chart, DirectoryInfo dir) : base() { - if (dir == null) throw new ArgumentNullException("dir"); + public ChartHandler(Chart _chart) { chart = _chart; } diff --git a/Assets/Cryville/Crtr/Event/ContainerHandler.cs b/Assets/Cryville/Crtr/Event/ContainerHandler.cs index d4c5602..c55196d 100644 --- a/Assets/Cryville/Crtr/Event/ContainerHandler.cs +++ b/Assets/Cryville/Crtr/Event/ContainerHandler.cs @@ -41,6 +41,7 @@ namespace Cryville.Crtr.Event { protected Transform RootTransform; readonly List _comps = new List(); + protected IEnumerable Components { get { return _comps; } } public Vector3 Position { get; protected set; } public Quaternion Rotation { get; protected set; } diff --git a/Assets/Cryville/Crtr/GroupHandler.cs b/Assets/Cryville/Crtr/GroupHandler.cs index 0ec7c15..f1703f1 100644 --- a/Assets/Cryville/Crtr/GroupHandler.cs +++ b/Assets/Cryville/Crtr/GroupHandler.cs @@ -4,15 +4,16 @@ using System; using UnityEngine; namespace Cryville.Crtr { - public class GroupHandler : ContainerHandler { - public ChartHandler ch; + public class GroupHandler : TransformHandler { + protected override TransformHandler Parent { get { return _ch; } } + public ChartHandler _ch; ColumnVector coeffs; SquareMatrix matFrame; ContainerState[] tracks; public GroupHandler(Chart.Group tg, ChartHandler ch) : base() { - this.ch = ch; + _ch = ch; } public override string TypeName { get { return "group"; } } diff --git a/Assets/Cryville/Crtr/TrackHandler.cs b/Assets/Cryville/Crtr/TrackHandler.cs index d07271f..cc22744 100644 --- a/Assets/Cryville/Crtr/TrackHandler.cs +++ b/Assets/Cryville/Crtr/TrackHandler.cs @@ -1,135 +1,14 @@ -using Cryville.Crtr.Components; -using Cryville.Crtr.Event; -using UnityEngine; - namespace Cryville.Crtr { - class TrackHandler : ContainerHandler { - readonly GroupHandler gh; - readonly Chart.Track track; + public class TrackHandler : TransformHandler { + protected override TransformHandler Parent { get { return _gh; } } + readonly GroupHandler _gh; + readonly Chart.Track _track; public TrackHandler(Chart.Track ev, GroupHandler gh) : base() { - track = ev; - this.gh = gh; + _track = ev; + _gh = gh; } public override string TypeName { get { return "track"; } } - - public override void Init() { - base.Init(); - sgos = RootTransform.GetComponentsInChildren(); - } - SectionalGameObject[] sgos; - Vector3 spos; - public override void StartPhysicalUpdate(ContainerState s) { - base.StartPhysicalUpdate(s); - if (CanDoGraphicalUpdate(s)) { - TransformAwake(s); - } - } - protected override void StartPreGraphicalUpdate(ContainerState s) { - base.StartPreGraphicalUpdate(s); - spos = Vector3.zero; - TransformAwake(s); - } - protected override void StartGraphicalUpdate(ContainerState s) { - base.StartGraphicalUpdate(s); - if (RootTransform) { - TransformAwake(s); - var p = Position; - foreach (var i in sgos) { - i.Reset(); - i.AppendPoint(p, Rotation); - } - } - } - void TransformAwake(ContainerState s) { - ppt = s.ScreenPoint; - pwp = Vector3.zero; - ptime = s.Time; - Position = spos; - Rotation = s.QuatDir; - } - - Vector3 ppt = Vector3.zero; // Previous point - Vector3 pwp = Vector3.zero; // Previous world point - double ptime; // Previous time - float length; - - public override void Update(ContainerState s, StampedEvent ev) { - base.Update(s, ev); - if (CanDoGraphicalUpdate(s)) { - var tpt = s.ScreenPoint; - var tsv = s.ScrollVelocity; - - Vector3 dpt = (Vector3)tpt - ppt; // Delta 2D point - dpt.z = (float)((s.Time - ptime) * ChartPlayer.sv * tsv); // Delta Z - Quaternion rotq = Quaternion.Euler(s.Direction); // Rotation - var dwp = rotq * dpt; // Delta world point - var nl = length + dwp.magnitude; // New length - var tdist = s.Distance; - if (nl >= tdist) { - s.Break(); - return; - } - length = nl; - var wp = pwp + dwp; // World point - pwp = wp; - ppt += dpt; - - ptime = s.Time; - Position = pwp + spos; - Rotation = s.QuatDir; - - if (!RootTransform || s.CloneType == 3) return; - foreach (var i in sgos) - i.AppendPoint(Position, Rotation); - } - else UpdatePosition(s); - } - - void UpdatePosition(ContainerState s) { - ppt = s.ScreenPoint; - pwp = Vector3.zero; - ptime = s.Time; - length = 0; - Position = pwp + spos; - Rotation = s.QuatDir; - } - - // TODO Fix anchor rotation - public override void Anchor() { - base.Anchor(); - spos = (Vector3)cs.ScreenPoint - Position; - } - - protected override void EndGraphicalUpdate(ContainerState s) { - base.EndGraphicalUpdate(s); - EndUpdatePosition(s); - var p = Position; - foreach (var i in sgos) { - i.AppendPoint(p, Rotation); - i.Seal(); - } - } - - void EndUpdatePosition(ContainerState s) { - var tpt = s.ScreenPoint; - var tsv = s.ScrollVelocity; - - Vector3 dpt = (Vector3)tpt - ppt; - dpt.z = (float)((s.Time - ptime) * ChartPlayer.sv * tsv); - Quaternion rotq = Quaternion.Euler(s.Direction); - var dwp = rotq * dpt; // Delta world point - var nl = length + dwp.magnitude; // New length - var tdist = s.Distance; - if (nl >= tdist) - dwp *= (tdist - length) / (nl - length); - length = nl; - var wp = pwp + dwp; // World point - pwp = wp; - ppt += dpt; - Position = pwp + spos; - Rotation = s.QuatDir; - } } } diff --git a/Assets/Cryville/Crtr/TransformHandler.cs b/Assets/Cryville/Crtr/TransformHandler.cs new file mode 100644 index 0000000..4031ce8 --- /dev/null +++ b/Assets/Cryville/Crtr/TransformHandler.cs @@ -0,0 +1,129 @@ +using Cryville.Crtr.Components; +using Cryville.Crtr.Event; +using System.Linq; +using UnityEngine; + +namespace Cryville.Crtr { + public abstract class TransformHandler : ContainerHandler { + protected abstract TransformHandler Parent { get; } + public override void Init() { + base.Init(); + sgos = Components.Where(c => c is SectionalGameObject).Cast().ToArray(); + } + + SectionalGameObject[] sgos; + + Vector3 spos; // Start position offset + Vector3 ppt = Vector3.zero; // Previous point + Vector3 pwp = Vector3.zero; // Previous world point + double ptime; // Previous time + float length; + + public override void StartPhysicalUpdate(ContainerState s) { + base.StartPhysicalUpdate(s); + if (CanDoGraphicalUpdate(s)) { + TransformAwake(s); + } + } + protected override void StartPreGraphicalUpdate(ContainerState s) { + base.StartPreGraphicalUpdate(s); + spos = Vector3.zero; + TransformAwake(s); + } + protected override void StartGraphicalUpdate(ContainerState s) { + base.StartGraphicalUpdate(s); + if (RootTransform) { + TransformAwake(s); + var p = Position; + foreach (var i in sgos) { + i.Reset(); + i.AppendPoint(p, Rotation); + } + } + } + void TransformAwake(ContainerState s) { + ppt = s.ScreenPoint; + pwp = Vector3.zero; + ptime = s.Time; + Position = spos; + Rotation = s.QuatDir; + } + + public override void Update(ContainerState s, StampedEvent ev) { + base.Update(s, ev); + if (CanDoGraphicalUpdate(s)) { + var tpt = s.ScreenPoint; + var tsv = s.ScrollVelocity; + + Vector3 dpt = (Vector3)tpt - ppt; // Delta 2D point + dpt.z = (float)((s.Time - ptime) * ChartPlayer.sv * tsv); // Delta Z + Quaternion rotq = Quaternion.Euler(s.Direction); // Rotation + var dwp = rotq * dpt; // Delta world point + var nl = length + dwp.magnitude; // New length + var tdist = s.Distance; + if (nl >= tdist) { // TODO Fix dist + s.Break(); + return; + } + length = nl; + var wp = pwp + dwp; // World point + pwp = wp; + ppt += dpt; + + ptime = s.Time; + Position = pwp + spos; + Rotation = s.QuatDir; + + if (!RootTransform || s.CloneType == 3) return; + foreach (var i in sgos) + i.AppendPoint(Position, Rotation); + } + else UpdatePosition(s); + } + + void UpdatePosition(ContainerState s) { + ppt = s.ScreenPoint; + pwp = Vector3.zero; + ptime = s.Time; + length = 0; + Position = pwp + spos; + Rotation = s.QuatDir; + } + + // TODO Fix anchor rotation + public override void Anchor() { + base.Anchor(); + spos = (Vector3)cs.ScreenPoint - Position; + } + + protected override void EndGraphicalUpdate(ContainerState s) { + base.EndGraphicalUpdate(s); + EndUpdatePosition(s); + var p = Position; + foreach (var i in sgos) { + i.AppendPoint(p, Rotation); + i.Seal(); + } + } + + void EndUpdatePosition(ContainerState s) { + var tpt = s.ScreenPoint; + var tsv = s.ScrollVelocity; + + Vector3 dpt = (Vector3)tpt - ppt; + dpt.z = (float)((s.Time - ptime) * ChartPlayer.sv * tsv); + Quaternion rotq = Quaternion.Euler(s.Direction); + var dwp = rotq * dpt; // Delta world point + var nl = length + dwp.magnitude; // New length + var tdist = s.Distance; + if (nl >= tdist) + dwp *= (tdist - length) / (nl - length); + length = nl; + var wp = pwp + dwp; // World point + pwp = wp; + ppt += dpt; + Position = pwp + spos; + Rotation = s.QuatDir; + } + } +} diff --git a/Assets/Cryville/Crtr/TransformHandler.cs.meta b/Assets/Cryville/Crtr/TransformHandler.cs.meta new file mode 100644 index 0000000..9df6107 --- /dev/null +++ b/Assets/Cryville/Crtr/TransformHandler.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: cd92dc120682e174cb42752bd304e12a +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: