TerraForge3D  2.3.1
3D Terrain And Landscape Generator
Camera.cpp
1#include "Base/Camera.h"
2
3#include "imgui/imgui.h"
4#include <string>
5
6
7#include <glm/gtc/constants.hpp>
8#include <glm/gtc/quaternion.hpp>
9#include <glm/gtc/matrix_transform.hpp>
10#include <glm/ext/matrix_relational.hpp>
11#include <glm/ext/vector_relational.hpp>
12#include <glm/ext/scalar_relational.hpp>
13
14static int ID = 0;
15
16Camera::Camera(bool ps)
17{
18 perspective = ps;
19 fov = 45;
20 cNear = 0.01f;
21 cFar = 200.0f;
22 aspect = 16.0f / 9.0f;
23 pitch = yaw = roll = 0;
24 view = glm::mat4(1.0f);
25 pv = glm::mat4(1.0f);
26 pers = glm::perspective(fov, 16.0f / 9.0f, cNear, cFar);
27 mposition = glm::vec3(0.0f, 0.0f, 3.0f);
28 mrotation = glm::vec3(1.0f);
29 position[0] = 0.0f;
30 position[1] = 0.2f;
31 position[2] = 3.1f;
32 rotation[0] = 1.0f;
33 rotation[1] = 2530.0f;
34 rotation[2] = 1.0f;
35 camID = ID++;
36}
37
38nlohmann::json Camera::Save()
39{
40 nlohmann::json data;
41 data["cNear"] = cNear;
42 data["cFar"] = cFar;
43 data["aspect"] = aspect;
44 data["fov"] = fov;
45 data["ID"] = camID;
47 tmp["x"] = position[0];
48 tmp["y"] = position[1];
49 tmp["z"] = position[2];
50 data["position"] = tmp;
51 tmp = nlohmann::json();
52 tmp["x"] = rotation[0];
53 tmp["y"] = rotation[1];
54 tmp["z"] = rotation[2];
55 data["rotation"] = tmp;
56 return data;
57}
58
59void Camera::Load(nlohmann::json data)
60{
61 cNear = data["cNear"];
62 cFar = data["cFar"];
63 aspect = data["aspect"];
64 fov = data["fov"];
65 camID = data["ID"];
66 position[0] = data["position"]["x"];
67 position[1] = data["position"]["y"];
68 position[2] = data["position"]["z"];
69 rotation[0] = data["rotation"]["x"];
70 rotation[1] = data["rotation"]["y"];
71 rotation[2] = data["rotation"]["z"];
72}
73
74void Camera::UpdateCamera(float xmax, float ymax)
75{
76 mposition.x = position[0];
77 mposition.y = position[1];
78 mposition.z = position[2];
79 mrotation.x = glm::radians(rotation[0]);
80 mrotation.y = glm::radians(rotation[1]);
81 mrotation.z = glm::radians(rotation[2]);
82 pitch = mrotation.x;
83 yaw = mrotation.y;
84 roll = mrotation.z;
85 view = glm::lookAt(mposition, mposition + cameraFront, cameraUp);
86 view = glm::rotate(view, glm::radians(mrotation.y), glm::vec3(1.0f, 0.0f, 0.0f));
87 view = glm::rotate(view, glm::radians(mrotation.x), glm::vec3(0.0f, 1.0f, 0.0f));
88
89 if (aspect > 200 || aspect < -200)
90 {
91 aspect = 16.0 / 9.0f;
92 }
93
94 if(perspective)
95 {
96 pers = glm::perspective(fov, (float)(fabs(aspect) < 100 ? fabs(aspect) : 1.0f), cNear, cFar);
97 }
98
99 else
100 {
101 pers = glm::ortho(-1.0f, 1.0f, -1.0f, 1.0f, cNear, cFar);
102 }
103
104 pv = pers * view;
105}
106
107void Camera::ShowSettings(bool renderWindow, bool *pOpen)
108{
109 if(pOpen == nullptr || *pOpen)
110 {
111 if (renderWindow)
112 {
113 ImGui::Begin(("Camera Controls##" + std::to_string(camID)).c_str(), pOpen);
114 }
115
116 ImGui::Text("Camera Position");
117 ImGui::DragFloat3("##cameraPosition", position, 0.1f);
118 ImGui::Separator();
119 ImGui::Separator();
120 ImGui::Text("Camera Rotation");
121 ImGui::DragFloat3("##cameraRotation", rotation, 10);
122 ImGui::Separator();
123 ImGui::Separator();
124 ImGui::Text("Projection Settings");
125 ImGui::Separator();
126 ImGui::DragFloat("FOV", &fov, 0.01f);
127 ImGui::DragFloat("Aspect Ratio", &aspect, 0.01f);
128 ImGui::DragFloat("Near Clipping", &cNear, 0.01f);
129 ImGui::DragFloat("Far Clipping", &cFar, 0.01f);
130
131 if (renderWindow)
132 {
133 ImGui::End();
134 }
135 }
136}
a class to store JSON values
Definition: json.hpp:17860
basic_json<> json
default JSON class
Definition: json.hpp:3411