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 }