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 }