using Cryville.Common.Math; using Cryville.Crtr.Event; using System; using UnityEngine; namespace Cryville.Crtr { public class GroupHandler : ContainerHandler { public ChartHandler ch; SquareMatrix matFrame; ContainerState[] tracks; public int TrackCount { get { return tracks.Length; } } public GroupHandler(Chart.Group tg, ChartHandler ch) : base() { this.ch = ch; } public override string TypeName { get { return "group"; } } public override void PreInit() { base.PreInit(); tracks = cs.TypedChildren[typeof(Chart.Track)].ToArray(); matFrame = SquareMatrix.WithPolynomialCoefficients(tracks.Length); frame1 = new ColumnVector(tracks.Length); frame2 = new ColumnVector(tracks.Length); } ColumnVector frame1; ColumnVector frame2; public ColumnVector GetCurrentFrame(Func func) { for (int i = 0; i < tracks.Length; i++) frame1[i] = func(tracks[i]); matFrame.Eliminate(frame1, frame2, Vector3Operator.Instance); return frame2; } } class Vector3Operator : IVectorOperator { public static Vector3Operator Instance = new Vector3Operator(); public Vector3 Add(Vector3 lhs, Vector3 rhs) { return lhs + rhs; } public Vector3 ScalarMultiply(float lhs, Vector3 rhs) { return lhs * rhs; } } }