Pull up TransformHandler
.
This commit is contained in:
@@ -1,16 +1,16 @@
|
|||||||
using Cryville.Audio.Source;
|
using Cryville.Audio.Source;
|
||||||
using Cryville.Crtr.Event;
|
using Cryville.Crtr.Event;
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
|
|
||||||
namespace Cryville.Crtr {
|
namespace Cryville.Crtr {
|
||||||
public class ChartHandler : ContainerHandler {
|
public class ChartHandler : TransformHandler {
|
||||||
public Chart chart;
|
protected override TransformHandler Parent { get { return null; } }
|
||||||
|
|
||||||
|
Chart chart;
|
||||||
readonly List<LibavFileAudioSource> sounds = new List<LibavFileAudioSource>();
|
readonly List<LibavFileAudioSource> sounds = new List<LibavFileAudioSource>();
|
||||||
|
|
||||||
public ChartHandler(Chart _chart, DirectoryInfo dir) : base() {
|
public ChartHandler(Chart _chart) {
|
||||||
if (dir == null) throw new ArgumentNullException("dir");
|
|
||||||
chart = _chart;
|
chart = _chart;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -41,6 +41,7 @@ namespace Cryville.Crtr.Event {
|
|||||||
protected Transform RootTransform;
|
protected Transform RootTransform;
|
||||||
|
|
||||||
readonly List<SkinComponent> _comps = new List<SkinComponent>();
|
readonly List<SkinComponent> _comps = new List<SkinComponent>();
|
||||||
|
protected IEnumerable<SkinComponent> Components { get { return _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; }
|
||||||
|
@@ -4,15 +4,16 @@ using System;
|
|||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
|
|
||||||
namespace Cryville.Crtr {
|
namespace Cryville.Crtr {
|
||||||
public class GroupHandler : ContainerHandler {
|
public class GroupHandler : TransformHandler {
|
||||||
public ChartHandler ch;
|
protected override TransformHandler Parent { get { return _ch; } }
|
||||||
|
public ChartHandler _ch;
|
||||||
|
|
||||||
ColumnVector<float> coeffs;
|
ColumnVector<float> coeffs;
|
||||||
SquareMatrix matFrame;
|
SquareMatrix matFrame;
|
||||||
ContainerState[] tracks;
|
ContainerState[] tracks;
|
||||||
|
|
||||||
public GroupHandler(Chart.Group tg, ChartHandler ch) : base() {
|
public GroupHandler(Chart.Group tg, ChartHandler ch) : base() {
|
||||||
this.ch = ch;
|
_ch = ch;
|
||||||
}
|
}
|
||||||
|
|
||||||
public override string TypeName { get { return "group"; } }
|
public override string TypeName { get { return "group"; } }
|
||||||
|
@@ -1,135 +1,14 @@
|
|||||||
using Cryville.Crtr.Components;
|
|
||||||
using Cryville.Crtr.Event;
|
|
||||||
using UnityEngine;
|
|
||||||
|
|
||||||
namespace Cryville.Crtr {
|
namespace Cryville.Crtr {
|
||||||
class TrackHandler : ContainerHandler {
|
public class TrackHandler : TransformHandler {
|
||||||
readonly GroupHandler gh;
|
protected override TransformHandler Parent { get { return _gh; } }
|
||||||
readonly Chart.Track track;
|
readonly GroupHandler _gh;
|
||||||
|
readonly Chart.Track _track;
|
||||||
|
|
||||||
public TrackHandler(Chart.Track ev, GroupHandler gh) : base() {
|
public TrackHandler(Chart.Track ev, GroupHandler gh) : base() {
|
||||||
track = ev;
|
_track = ev;
|
||||||
this.gh = gh;
|
_gh = gh;
|
||||||
}
|
}
|
||||||
|
|
||||||
public override string TypeName { get { return "track"; } }
|
public override string TypeName { get { return "track"; } }
|
||||||
|
|
||||||
public override void Init() {
|
|
||||||
base.Init();
|
|
||||||
sgos = RootTransform.GetComponentsInChildren<SectionalGameObject>();
|
|
||||||
}
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
129
Assets/Cryville/Crtr/TransformHandler.cs
Normal file
129
Assets/Cryville/Crtr/TransformHandler.cs
Normal file
@@ -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<SectionalGameObject>().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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
11
Assets/Cryville/Crtr/TransformHandler.cs.meta
Normal file
11
Assets/Cryville/Crtr/TransformHandler.cs.meta
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: cd92dc120682e174cb42752bd304e12a
|
||||||
|
MonoImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
defaultReferences: []
|
||||||
|
executionOrder: 0
|
||||||
|
icon: {instanceID: 0}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
Reference in New Issue
Block a user