1 module mutils.timeline.trace;
2 
3 import std.stdio;
4 
5 import mutils.container.sorted_vector;
6 import mutils.container.vector;
7 import mutils.linalg.algorithm;
8 import mutils.timeline.utils;
9 
10 /**
11  *
12  * Class to get interpolated(mix) T value in given time, useful for contigious paths 
13  * 
14  */
15 struct Trace(T, alias mixFunction=mix){
16 	SortedVector!(DataPoint, "a.time < b.time") data;
17 	TimeIndexGetter indexGetter;
18 
19 	struct DataPoint{
20 		T point;
21 		float time=0;
22 	}
23 
24 	void add(T point, float time){
25 		data~=DataPoint(point, time);
26 	}
27 	
28 	void remove(size_t i){
29 		data.remove(i);
30 	}
31 	
32 	T get(float time){
33 		uint[2] ti=indexGetter.index(data[], time);
34 		DataPoint curr=data[ti[0]];
35 		DataPoint next=data[ti[1]];
36 		if(ti[0]==ti[1]){
37 			return curr.point;
38 		}
39 		float blend=(time-curr.time)/(next.time-curr.time);
40 		return mixFunction(curr.point, next.point, blend);
41 	}
42 
43 
44 }
45 
46 
47 unittest{
48 	import mutils.linalg.vec;
49 	alias vec2i=Vec!(int,2);//ints because there are no precision errors
50 	alias TraceVec2i=Trace!(vec2i);
51 	TraceVec2i trace;
52 	trace.add(vec2i(0,0),0);
53 	trace.add(vec2i(0,0),2);
54 	trace.add(vec2i(2,2),1);
55 	trace.add(vec2i(2,2),3);
56 
57 	assert(trace.data[2].point==vec2i(0,0));
58 
59 	assert(trace.get(-10)==vec2i(0,0));
60 	assert(trace.get(0)==vec2i(0,0));
61 	assert(trace.get(1)==vec2i(2,2));
62 	assert(trace.get(2.5)==vec2i(1,1));
63 	assert(trace.get(5)==vec2i(2,2));
64 	assert(trace.get(-10)==vec2i(0,0));
65 	assert(trace.get(0)==vec2i(0,0));	
66 }
67