1 /**
2  * Copyright:       Copyright (C) 2018 Gabriel Gheorghe, All Rights Reserved
3  * Authors:         $(Gabriel Gheorghe)
4  * License:         $(LINK2 https://www.gnu.org/licenses/gpl-3.0.txt, GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007)
5  * Source:          $(LINK2 https://github.com/GabyForceQ/LibertyEngine/blob/master/source/liberty/camera/preset.d)
6  * Documentation:
7  * Coverage:
8 **/
9 module liberty.camera.preset;
10 
11 import liberty.core.engine;
12 import liberty.input.impl;
13 import liberty.input.keyboard.constants;
14 import liberty.camera;
15 import liberty.math.transform;
16 
17 /// A camera custom setting.
18 class CameraPreset {
19   ///
20   void delegate(Camera) runImplicitProcess;
21   ///
22   void delegate(Camera, CameraMovement, float) runKeyboardProcess;
23 
24   ///
25   this(void delegate(Camera) runImplicitProcess,
26     void delegate(Camera, CameraMovement, float) runKeyboardProcess)
27   do {
28     this.runImplicitProcess = runImplicitProcess;
29     this.runKeyboardProcess = runKeyboardProcess;
30   }
31 
32   /// Returns an empty camera preset.
33   static typeof(this) getEmpty() {
34     return new CameraPreset((camera) {
35     }, (camera, direction, velocity) {
36     });
37   }
38 
39   /// Returns implicit camera preset.
40   static typeof(this) getDefault() {
41     return new CameraPreset((camera) {
42       if (Input.getKeyboard.isButtonHold(KeyboardButton.W))
43         camera.processKeyboard(CameraMovement.FORWARD);
44       if (Input.getKeyboard.isButtonHold(KeyboardButton.S))
45         camera.processKeyboard(CameraMovement.BACKWARD);
46       if (Input.getKeyboard.isButtonHold(KeyboardButton.A))
47         camera.processKeyboard(CameraMovement.LEFT);
48       if (Input.getKeyboard.isButtonHold(KeyboardButton.D))
49         camera.processKeyboard(CameraMovement.RIGHT);
50     }, (camera, direction, velocity) {
51       final switch (direction) with (CameraMovement) {
52         case FORWARD:
53           camera.component!Transform.setLocation!"+="(camera.frontVector * velocity);
54           break;
55         case BACKWARD:
56           camera.component!Transform.setLocation!"-="(camera.frontVector * velocity);
57           break;
58         case LEFT:
59           camera.component!Transform.setLocation!"-="(camera.rightVector * velocity);
60           break;
61         case RIGHT:
62           camera.component!Transform.setLocation!"+="(camera.rightVector * velocity);
63           break;
64         case UP:
65           camera.component!Transform.setLocation!"+="(camera.upVector * velocity);
66           break;
67         case DOWN:
68           camera.component!Transform.setLocation!"-="(camera.upVector * velocity);
69       }
70     });
71   }
72 }