Add project files.
This commit is contained in:
172
Assets/Cryville/Crtr/GroupHandler.cs
Normal file
172
Assets/Cryville/Crtr/GroupHandler.cs
Normal file
@@ -0,0 +1,172 @@
|
||||
using Cryville.Common.Math;
|
||||
using Cryville.Crtr.Event;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using UnityEngine;
|
||||
|
||||
namespace Cryville.Crtr {
|
||||
class GroupHandler : ContainerHandler {
|
||||
// private StampedState cs;
|
||||
|
||||
public ChartHandler ch;
|
||||
// Chart.Group group;
|
||||
// Dictionary<StampedEvent, GameObject> notePool = new Dictionary<StampedEvent, GameObject>();
|
||||
|
||||
SquareMatrix matFrame;
|
||||
List<ContainerState> tracks;
|
||||
|
||||
public GroupHandler(Chart.Group tg, ChartHandler ch) : base() {
|
||||
//group = tg;
|
||||
this.ch = ch;
|
||||
/*foreach (Chart.Track t in group.tracks) {
|
||||
handlers.Add(new TrackHandler(t, this));
|
||||
}*/
|
||||
}
|
||||
|
||||
public override string TypeName {
|
||||
get {
|
||||
return "group";
|
||||
}
|
||||
}
|
||||
|
||||
public override void PreInit() {
|
||||
base.PreInit();
|
||||
tracks = (
|
||||
from c in cs.Children
|
||||
where c.Value.Container is Chart.Track
|
||||
select c.Value
|
||||
).ToList();
|
||||
matFrame = SquareMatrix.WithPolynomialCoefficients(tracks.Count);
|
||||
}
|
||||
|
||||
/*EventPrehandler ph;
|
||||
List<StampedEvent> sevs = new List<StampedEvent>();
|
||||
public void StartPrehandler(EventPrehandler parent) {
|
||||
/*List<Chart.Event> appevs = new List<Chart.Event>();
|
||||
foreach (Chart.Note ev in group.notes) {
|
||||
if (ev.duration > 0) {
|
||||
for (float b = 0f; b < ev.duration; b += ev.jdg_interval) {
|
||||
appevs.Add(new Chart.InternalJudgement() { beat = ev.beat, BeatOffset = b, Parent = ev });
|
||||
}
|
||||
}
|
||||
}
|
||||
ph = new EventPrehandler(
|
||||
parent.chart,
|
||||
group.motions.Cast<Chart.Event>()
|
||||
.Concat<Chart.Event>(group.notes.Cast<Chart.Event>()),
|
||||
parent
|
||||
);
|
||||
foreach (TrackHandler h in handlers)
|
||||
h.StartPrehandler(ph);
|
||||
}
|
||||
|
||||
public void PrehandleToTime(float toTime) {
|
||||
ph.ForwardToTime(toTime, ev => {
|
||||
foreach (var h in handlers) h.PrehandleToTime(ph.Time);
|
||||
/*
|
||||
if (ev is Chart.Note) {
|
||||
var tev = (Chart.Note)ev;
|
||||
sevs.Add(new StampedEvent.Judge() {
|
||||
Time = phs.Time - Main.judge * tev.tol,
|
||||
EndTime = phs.Time + Main.judge * tev.tol,
|
||||
Event = tev,
|
||||
Type = tev.wipe ? JudgementType.Held : JudgementType.Attack,
|
||||
JudgeArea = new Area() {
|
||||
Point1 = phs.Point,
|
||||
Point2 = phs.Point + new Chart.Point(0f, 0.1f, 0f, 0.1f).ToRelative(Main.hitRect),
|
||||
Type = AreaType.Circle
|
||||
}
|
||||
});
|
||||
}
|
||||
else if (ev is Chart.InternalJudgement) {
|
||||
var tev = (Chart.InternalJudgement)ev;
|
||||
sevs.Add(new StampedEvent.Judge() {
|
||||
Time = phs.Time - Main.judge * tev.Parent.tol,
|
||||
EndTime = phs.Time + Main.judge * tev.Parent.tol,
|
||||
Event = tev,
|
||||
Type = JudgementType.Held,
|
||||
JudgeArea = new Area() {
|
||||
Point1 = phs.Point,
|
||||
Point2 = phs.Point + new Chart.Point(0f, 0.1f, 0f, 0.1f).ToRelative(Main.hitRect),
|
||||
Type = AreaType.Circle
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public void EndPrehandler(StampedState parent) {
|
||||
sevs = ph.Result;
|
||||
cs = new StampedState(ch.chart, sevs, parent);
|
||||
foreach (var h in handlers) h.EndPrehandler(cs);
|
||||
}*/
|
||||
|
||||
/*List<StampedEvent.Judge> judgements = new List<StampedEvent.Judge>();
|
||||
public void SendInput(int id, TouchPhase phase, Vector2 jpos) {
|
||||
for (int i = judgements.Count - 1; i >= 0; i--) {
|
||||
if (judgements[i].JudgeArea.Contains(jpos)) {
|
||||
if (phase == TouchPhase.Began && judgements[i].Type == JudgementType.Attack) {
|
||||
ch.ReportJudge(true);
|
||||
judgements.RemoveAt(i);
|
||||
}
|
||||
else if ((phase == TouchPhase.Stationary || phase == TouchPhase.Moved) && judgements[i].Type == JudgementType.Held) {
|
||||
ch.ReportJudge(true);
|
||||
judgements.RemoveAt(i);
|
||||
}
|
||||
}
|
||||
}
|
||||
}*/
|
||||
|
||||
/*Vector3 cpoint;
|
||||
Vector3 cpoint2;
|
||||
Vector3 prevp = Vector3.zero;
|
||||
Vector3 prevwp = Vector3.zero;
|
||||
Vector3 prevp2 = Vector3.zero;
|
||||
Vector3 prevwp2 = Vector3.zero;*/
|
||||
|
||||
public override void Update(ContainerState s, StampedEvent ev) {
|
||||
base.Update(s, ev);
|
||||
/*cs.ForwardToTime(toTime);
|
||||
foreach (var handler in handlers) handler.Update(cs.Time);*/
|
||||
//cs.ForwardToTime(toTime);
|
||||
|
||||
/*ss.ForwardToTime(toTime, ev => {
|
||||
if (ev is StampedEvent.Judge) {
|
||||
var tev = (StampedEvent.Judge)ev;
|
||||
judgements.Add(tev);
|
||||
}
|
||||
});
|
||||
|
||||
for (int i = judgements.Count - 1; i >= 0; i--) {
|
||||
if (judgements[i].EndTime < cs.Time) {
|
||||
ch.ReportJudge(false);
|
||||
judgements.RemoveAt(i);
|
||||
}
|
||||
}*/
|
||||
// gogroup.rotation = Quaternion.Euler(cs.Direction);
|
||||
}
|
||||
|
||||
public override void EndUpdate(ContainerState s) {
|
||||
base.EndUpdate(s);
|
||||
}
|
||||
|
||||
public ColumnVector<Vector3> GetCurrentFrame(Func<ContainerState, Vector3> func) {
|
||||
var vl = from t in tracks select func(t);
|
||||
return matFrame.Eliminate(
|
||||
new ColumnVector<Vector3>(vl.ToArray()),
|
||||
new Vector3Operator()
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
class Vector3Operator : IVectorOperator<Vector3> {
|
||||
public Vector3 Add(Vector3 lhs, Vector3 rhs) {
|
||||
return lhs + rhs;
|
||||
}
|
||||
|
||||
public Vector3 ScalarMultiply(float lhs, Vector3 rhs) {
|
||||
return lhs * rhs;
|
||||
}
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user