Pull up TransformHandler.

This commit is contained in:
2023-04-20 11:36:38 +08:00
parent d6208f19fb
commit 61b72107ae
6 changed files with 156 additions and 135 deletions

View File

@@ -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;
} }

View File

@@ -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; }

View File

@@ -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"; } }

View File

@@ -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;
}
} }
} }

View 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;
}
}
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: cd92dc120682e174cb42752bd304e12a
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant: