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