1 module dlangui.graphics.scene.camera;
2
3 public import dlangui.core.config;
4 static if (ENABLE_OPENGL):
5 static if (BACKEND_GUI):
6
7 import dlangui.graphics.scene.node;
8
9 import dlangui.core.math3d;
10
11 /// Camera
12 class Camera : Node3d {
13
14 protected mat4 _projectionMatrix;
15 protected mat4 _viewMatrix;
16 protected mat4 _viewProjectionMatrix;
17 protected bool _dirtyViewProjection = true;
18 protected bool _dirtyView = true;
19
20 protected bool _enabled;
21
22 protected float _far = 100;
23
24 this(string ID = null) {
25 super(ID);
26 _enabled = true;
27 setPerspective(4.0f, 3.0f, 45.0f, 0.1f, 100.0f);
28 }
29
30 /// returns FAR range of camera
31 @property float farRange() { return _far; }
32
33 /// returns true if camera is active (enabled)
34 @property bool enabled() { return _enabled; }
35
36 /// activates / deactivates camera
37 @property void enabled(bool v) {
38 if (scene)
39 scene.activeCamera = null;
40 _enabled = v;
41 }
42
43 /// returns true if some changes occured in projection or view matrix since last matrix getter call
44 @property bool viewChanged() {
45 return _dirtyTransform || _dirtyViewProjection || _dirtyView;
46 }
47
48 /// get projection matrix
49 @property ref const(mat4) projectionMatrix() {
50 return _projectionMatrix;
51 }
52
53 /// set custom projection matrix
54 @property void projectionMatrix(mat4 v) {
55 _projectionMatrix = v;
56 _dirtyViewProjection = true;
57 }
58
59 override protected void invalidateTransform() {
60 _dirtyTransform = true;
61 _dirtyViewProjection = true;
62 _dirtyView = true;
63 }
64
65 override @property ref const(mat4) viewMatrix() {
66 if (_dirtyView) {
67 _viewMatrix = matrix.invert();
68 _dirtyView = false;
69 }
70 return _viewMatrix;
71 }
72
73 /// get projection*view matrix
74 override @property ref const(mat4) projectionViewMatrix() {
75 if (_dirtyTransform || _dirtyViewProjection) {
76 _viewProjectionMatrix = _projectionMatrix * viewMatrix;
77 _dirtyViewProjection = false;
78 }
79 return _viewProjectionMatrix;
80 }
81
82 /// set orthographic projection
83 void setOrtho(float left, float right, float bottom, float top, float near, float far) {
84 _far = far;
85 _projectionMatrix.setOrtho(left, right, bottom, top, near, far);
86 _dirtyViewProjection = true;
87 }
88
89 /// set perspective projection
90 void setPerspective(float width, float height, float fov, float near, float far) {
91 _far = far;
92 _projectionMatrix.setPerspective(fov, width / height, near, far);
93 _dirtyViewProjection = true;
94 }
95
96 ~this() {
97 // disconnect active camera
98 if (scene && scene.activeCamera is this)
99 scene.activeCamera = null;
100 }
101 }