1 module tpcamera;
2 
3 import derelict.opengl.gl;
4 import dlib.math.vector;
5 import dlib.math.matrix;
6 import dlib.math.affine;
7 import dgl.core.modifier;
8 
9 class ThirdPersonCamera: Modifier
10 {
11     Matrix4x4f localMatrix;
12     Vector3f position;
13     Vector3f playerPosition;
14     Vector3f playerDirection;
15     
16     this()
17     {
18         position = Vector3f(0.0f, 0.0f, 0.0f);
19         playerPosition = Vector3f(0.0f, 0.0f, 1.0f);
20         playerDirection = Vector3f(0.0f, 0.0f, 1.0f);
21         localMatrix = Matrix4x4f.identity;
22     }
23 
24     void collisionResponce(Vector3f contactNormal, float penetrationDepth)
25     {
26         position += contactNormal * penetrationDepth; 
27     }
28 
29     void moveToPoint(Vector3f pt, float speed)
30     {
31         Vector3f dir = pt - position;
32         dir.normalize();
33 
34         float dist = distance(position, pt);
35         if (dist != 0.0f)
36         {
37             if (dist >= speed)
38             {
39                 position += dir * speed;
40             }
41             else
42             {
43                 position += dir * dist;
44             }
45         }
46     }
47 
48     override void bind(double dt)
49     {
50         Vector3f cameraTargetPosition = playerPosition + (-playerDirection * 5.0f);
51         cameraTargetPosition.y += 2.0f;
52         if (position != cameraTargetPosition)
53             position += ((cameraTargetPosition - position) * 5.0f) * dt;
54 
55         localMatrix = lookAtMatrix(
56             position, 
57             playerPosition, 
58             Vector3f(0.0f, 1.0f, 0.0f));
59 
60         glPushMatrix();
61         glMultMatrixf(localMatrix.arrayof.ptr);
62     }
63 
64     override void unbind()
65     {
66         glPopMatrix();
67     }
68 
69     override void free() {}
70 }