Blame mono/Assistance/InputModifierSegmentation.cs

Ivan Mahonin c3ebff
using System;
Ivan Mahonin c3ebff
using System.Collections.Generic;
Ivan Mahonin c3ebff
Ivan Mahonin c3ebff
namespace Assistance {
Ivan Mahonin ed66f8
	public class InputModifierSegmentation: InputManager.Modifier {
Ivan Mahonin 72d2fd
		public static readonly int maxRecursion = 10;
Ivan Mahonin 0f2bf8
	
Ivan Mahonin c3ebff
		public readonly double precision;
Ivan Mahonin c3ebff
		public readonly double precisionSqr;
Ivan Mahonin c3ebff
		
Ivan Mahonin ed66f8
		public InputModifierSegmentation(double precision = 1.0) {
Ivan Mahonin 1d3aae
			this.precision = Math.Max(precision, Geometry.precision);
Ivan Mahonin 1d3aae
			this.precisionSqr = this.precision*this.precision;
Ivan Mahonin c3ebff
		}
Ivan Mahonin c3ebff
	
Ivan Mahonin ed66f8
		public void addSegments(Track track, Track.Point p0, Track.Point p1, int level = 0) {
Ivan Mahonin 72d2fd
			if (level >= maxRecursion || (p1.position - p0.position).lenSqr() <= precisionSqr) {
Ivan Mahonin 72d2fd
				track.add(p1);
Ivan Mahonin 72d2fd
				return;
Ivan Mahonin 72d2fd
			}
Ivan Mahonin 702257
			Track.Point p = track.modifier.calcPoint(0.5*(p0.originalIndex + p1.originalIndex));
Ivan Mahonin ed66f8
			addSegments(track, p0, p, level + 1);
Ivan Mahonin ed66f8
			addSegments(track, p, p1, level + 1);
Ivan Mahonin c3ebff
		}
Ivan Mahonin c3ebff
	
Ivan Mahonin 589f9a
		public override void modify(Track track, InputManager.KeyPoint keyPoint, List<Track> outTracks) {
Ivan Mahonin 72d2fd
  			if (track.handler == null) {
Ivan Mahonin c3ebff
				track.handler = new Track.Handler(this, track);
Ivan Mahonin c3ebff
				track.handler.tracks.Add(new Track( new Track.Modifier(track.handler) ));
Ivan Mahonin c3ebff
			}
Ivan Mahonin c3ebff
			
Ivan Mahonin c3ebff
			Track subTrack = track.handler.tracks[0];
Ivan Mahonin c3ebff
			outTracks.Add(subTrack);
Ivan Mahonin c3ebff
			
Ivan Mahonin 72d2fd
			if (!track.wasChanged)
Ivan Mahonin c3ebff
				return;
Ivan Mahonin c3ebff
			
Ivan Mahonin c3ebff
			// remove points
Ivan Mahonin 72d2fd
			int start = track.count - track.pointsAdded;
Ivan Mahonin c3ebff
			if (start < 0) start = 0;
Ivan Mahonin 72d2fd
			int subStart = subTrack.floorIndex(subTrack.indexByOriginalIndex(start-1)) + 1;
Ivan Mahonin 72d2fd
			subTrack.truncate(subStart);
Ivan Mahonin c3ebff
			
Ivan Mahonin c3ebff
			// add points
Ivan Mahonin 702257
			Track.Point p0 = subTrack.modifier.calcPoint(start - 1);
Ivan Mahonin 72d2fd
			for(int i = start; i < track.count; ++i) {
Ivan Mahonin 702257
				Track.Point p1 = subTrack.modifier.calcPoint(i);
Ivan Mahonin ed66f8
				addSegments(subTrack, p0, p1);
Ivan Mahonin c3ebff
				p0 = p1;
Ivan Mahonin c3ebff
			}
Ivan Mahonin 72d2fd
Ivan Mahonin 72d2fd
			track.resetCounters();
Ivan Mahonin c3ebff
		}
Ivan Mahonin c3ebff
	}
Ivan Mahonin c3ebff
}
Ivan Mahonin c3ebff