1 module des.mc.core.tracker; 2 3 import des.mc.core.skeleton; 4 import des.mc.core.user; 5 6 interface Tracker 7 { 8 User[] getUsers(); 9 } 10 11 version(unittest) 12 { 13 final class FakeTracker : Tracker 14 { 15 private User[] users; 16 this( in vec3 offset=vec3(0,0,0) ) 17 { users = getFakeUsers( offset, [ vec3(0,2,0), vec3(1,-1,0) ] ); } 18 User[] getUsers() { return users; } 19 } 20 } 21 22 class TransformTracker : Tracker 23 { 24 protected: 25 abstract @property User[] users(); 26 abstract Skeleton transform( in Skeleton ); 27 28 public: 29 final User[] getUsers() 30 { 31 auto src = users; 32 User[] dst; 33 dst.length = src.length; 34 35 foreach( i, user; src ) 36 dst[i] = User( user.id, transform( user.skel ) ); 37 38 return dst; 39 } 40 } 41 42 class MatrixTransformTracker : TransformTracker 43 { 44 protected: 45 override @property User[] users() 46 { return source.getUsers(); } 47 48 override Skeleton transform( in Skeleton skel ) 49 { return skel.transform( mtr ); } 50 51 Tracker source; 52 mat4 mtr; 53 54 public: 55 this( Tracker src, in mat4 tr ) 56 { 57 source = src; 58 mtr = tr; 59 } 60 61 @property 62 { 63 Tracker sourceTracker() { return source; } 64 void sourceTracker( Tracker src ) { source = src; } 65 66 mat4 transformMatrix() const { return mtr; } 67 void transformMatrix( in mat4 tr ) { mtr = tr; } 68 } 69 } 70 71 unittest 72 { 73 auto ltr = new LookAtTransform; 74 ltr.pos = vec3( 0, -1, 0 ); 75 ltr.target = vec3( 0, -1, -1 ); 76 ltr.up = vec3( 0, 1, 0 ); 77 78 auto ft = new FakeTracker; 79 auto mtt = new MatrixTransformTracker( ft, ltr.matrix ); 80 auto uu = ft.getUsers(); 81 auto ut = mtt.getUsers(); 82 assert( ut[0].skel.head.pos == (ltr.matrix * vec4(uu[0].skel.head.pos,1.0) ).xyz ); 83 }