20 VkPhysicalDeviceProperties deviceProperties;
21 vkGetPhysicalDeviceProperties(physicalDevice, &deviceProperties);
22 ImGui_ImplVulkan_NewFrame();
23 ImGui_ImplGlfw_NewFrame();
25 renderFrameWindow(clockData);
27 rendererSection(renderer, ubo);
28 cameraSection(camera);
29 lightsSection(sceneManager);
30 objectsSection(sceneManager);
32 devicePropertiesSection(deviceProperties);
50 ImGui::SetNextWindowPos(ImVec2(0.0F, 45.0F), ImGuiCond_Always, ImVec2(0.0F, 0.0F));
51 ImGui::Begin(
"Editor tools");
52 if (ImGui::CollapsingHeader(
"Renderer")) {
55 if (ImGui::BeginTable(
"ClearColorTable", 2)) {
56 ImGui::TableNextColumn();
59 if (ImGui::ColorEdit4(
"Clear Color", clearColor.data())) {
60 const VkClearColorValue clearColorValue = {{clearColor[0], clearColor[1], clearColor[2], clearColor[3]}};
64 ImGui::TableNextColumn();
65 static int item_current = 0;
67 if (ImGui::Combo(
"Color Presets##clearColor",
69 [](
void*,
const int idx,
const char** out_text) ->
bool {
79 ImGui::TableNextColumn();
81 ImGui::TableNextColumn();
82 if (ImGui::Combo(
"Color Presets##ambientColor",
84 [](
void*,
const int idx,
const char** out_text) ->
bool {
94 ImGui::TableNextColumn();
95 ImGui::SliderFloat((
"Intensity##" + std::to_string(0)).c_str(), &ubo.
ambientLightColor.a, 0.0F, 1.0F);
96 ImGui::TableNextColumn();
102 static bool fullscreen =
false;
103 if (ImGui::Checkbox(
"Fullscreen", &fullscreen)) {
111 if (ImGui::CollapsingHeader(
"Camera")) {
112 float fov = camera.
getFov();
113 float tnear = camera.
getNear();
114 float tfar = camera.
getFar();
115 if (ImGui::BeginTable(
"CameraTable", 2)) {
116 ImGui::TableNextColumn();
118 ImGui::TableNextColumn();
121 ImGui::TableNextColumn();
123 ImGui::TableNextColumn();
126 ImGui::TableNextColumn();
127 if (ImGui::SliderFloat(
"FOV", &fov, glm::radians(0.1F), glm::radians(180.0F))) { camera.
setFov(fov); }
128 ImGui::TableNextColumn();
131 ImGui::TableNextColumn();
132 if (ImGui::SliderFloat(
"Near", &tnear, 0.001F, 10.0F)) { camera.
setNear(tnear); }
133 ImGui::TableNextColumn();
136 ImGui::TableNextColumn();
137 if (ImGui::SliderFloat(
"Far", &tfar, 1.F, 1000.0F)) { camera.
setFar(tfar); }
138 ImGui::TableNextColumn();
141 ImGui::TableNextColumn();
143 if (ImGui::SliderFloat(
"Move speed", &moveSpeed, 0.1F, 10.0F)) { camera.
setMoveSpeed(moveSpeed); }
144 ImGui::TableNextColumn();
147 ImGui::TableNextColumn();
149 if (ImGui::SliderFloat(
"Look speed", &lookSpeed, 0.1F, 10.0F)) { camera.
setLookSpeed(lookSpeed); }
150 ImGui::TableNextColumn();
160 if (ImGui::CollapsingHeader(
"Objects")) {
164 open = ImGui::TreeNode(std::string(
object.getName() +
" [" + std::to_string(
object.getId()) +
"]").c_str());
165 ImGui::PopStyleColor(1);
167 if (ImGui::Button((
"Delete##" +
object.getName()).c_str())) {
168 m_objectsToRemove.push_back(
id);
172 if (ImGui::Button((
"Duplicate##" +
object.getName()).c_str())) {
175 ImGui::Text(
"Address: %p",
static_cast<void*
>(&
object));
176 ImGui::DragFloat3((
"Position##" +
object.getName()).c_str(), glm::value_ptr(
object.transform.translation), 0.1F);
177 ImGui::DragFloat3((
"Rotation##" +
object.getName()).c_str(), glm::value_ptr(
object.transform.rotation), 0.1F);
178 ImGui::DragFloat3((
"Scale##" +
object.getName()).c_str(), glm::value_ptr(
object.transform.scale), 0.1F);
188 if (ImGui::CollapsingHeader(
"Lights")) {
190 float tempIntensity = m_intensity;
191 float tempShininess = m_shininess;
194 if (ImGui::BeginTable(
"LightTable", 2)) {
195 ImGui::TableNextColumn();
196 if (ImGui::SliderFloat(
"Global Intensity", &tempIntensity, 0.0F, 5.F)) {
197 m_intensity = tempIntensity;
198 for (
auto&[fst, snd] : lights) {
199 snd.color.a = m_intensity;
202 ImGui::TableNextColumn();
203 if (ImGui::Button(
"Reset")) {
205 tempIntensity = m_intensity;
206 for (
auto&[fst, snd] : lights) {
207 snd.color.a = m_intensity;
211 ImGui::TableNextColumn();
212 if (ImGui::SliderFloat(
"Global Shininess", &tempShininess, 0.0F, 512.F)) {
213 m_shininess = tempShininess;
214 for (
auto&[fst, snd] : lights) {
215 snd.setShininess(m_shininess);
219 ImGui::TableNextColumn();
220 if (ImGui::Button(
"Reset")) {
222 tempShininess = m_shininess;
223 for (
auto&[fst, snd] : lights) {
224 snd.setShininess(m_shininess);
231 for (
auto& [
id, light] : lights) {
232 ImGui::PushStyleColor(ImGuiCol_Text, {light.color.r, light.color.g, light.color.b, 1.0F});
233 open = ImGui::TreeNode(std::string(light.getName() +
" [" + std::to_string(light.getId()) +
"]").c_str());
234 ImGui::PopStyleColor(1);
236 if (ImGui::Button((
"Delete##" + light.getName()).c_str())) {
237 m_lightsToRemove.push_back(
id);
241 if (ImGui::Button((
"Duplicate##" + light.getName()).c_str())) {
244 ImGui::Text(
"Address: %p",
static_cast<void*
>(&light));
245 ImGui::DragFloat3((
"Position##" + std::to_string(light.getId())).c_str(), glm::value_ptr(light.transform.translation), 0.1F);
246 ImGui::DragFloat3((
"Rotation##" + std::to_string(light.getId())).c_str(), glm::value_ptr(light.transform.rotation), 0.1F);
247 ImGui::DragFloat3((
"Scale##" + std::to_string(light.getId())).c_str(), glm::value_ptr(light.transform.scale), 0.1F);
248 if (ImGui::BeginTable(
"ColorTable", 2)) {
249 ImGui::TableNextColumn();
250 ImGui::ColorEdit4((
"Color##" + std::to_string(light.getId())).c_str(), glm::value_ptr(light.color));
251 ImGui::TableNextColumn();
252 static int item_current = 0;
253 if (ImGui::Combo(
"Color Presets",
255 [](
void*,
const int idx,
const char** out_text) ->
bool {
266 ImGui::SliderFloat((
"Intensity##" + std::to_string(light.getId())).c_str(), &light.color.a, 0.0F, 5.F);
268 if (ImGui::Button((
"Reset##" + std::to_string(light.getId())).c_str())) { light.color.a =
DEFAULT_LIGHT_INTENSITY; }
269 float shininess = light.getShininess();
270 if (ImGui::SliderFloat(
"Shininess", &shininess, 0.0F, 512.F)) {
271 light.setShininess(shininess);
274 if (ImGui::Button(
"Reset##shininess")) { light.setShininess(
DEFAULT_SHININESS); }
284 if (ImGui::CollapsingHeader(
"Input")) {
285 ImGui::IsMousePosValid() ? ImGui::Text(
"Mouse pos: (%g, %g)", io.MousePos.x, io.MousePos.y) : ImGui::Text(
"Mouse pos: <INVALID>");
286 ImGui::Text(
"Mouse delta: (%g, %g)", io.MouseDelta.x, io.MouseDelta.y);
287 ImGui::Text(
"Mouse down:");
288 for (
int i = 0; i < static_cast<int>(std::size(io.MouseDown)); i++) {
289 if (ImGui::IsMouseDown(i)) {
291 ImGui::Text(
"b%d (%.02f secs)", i, io.MouseDownDuration[i]);
294 ImGui::Text(
"Mouse wheel: %.1f", io.MouseWheel);
295 ImGui::Text(
"Keys down:");
296 for (
auto key =
static_cast<ImGuiKey
>(0); key < ImGuiKey_NamedKey_END; key = static_cast<ImGuiKey>(key + 1)) {
297 if (funcs::IsLegacyNativeDupe(key) || !ImGui::IsKeyDown(key)) {
continue; }
299 ImGui::Text((key < ImGuiKey_NamedKey_BEGIN) ?
"\"%s\"" :
"\"%s\" %d", ImGui::GetKeyName(key), key);
306 if (ImGui::CollapsingHeader(
"Device Properties")) {
307 if (ImGui::BeginTable(
"DevicePropertiesTable", 2)) {
309 ImGui::TableNextColumn(); ImGui::Text(
"Device Name: %s", deviceProperties.deviceName);
310 ImGui::TableNextColumn(); ImGui::Text(
"API Version: %d.%d.%d", VK_VERSION_MAJOR(deviceProperties.apiVersion), VK_VERSION_MINOR(deviceProperties.apiVersion), VK_VERSION_PATCH(deviceProperties.apiVersion));
311 ImGui::TableNextColumn(); ImGui::Text(
"Driver Version: %d.%d.%d", VK_VERSION_MAJOR(deviceProperties.driverVersion), VK_VERSION_MINOR(deviceProperties.driverVersion), VK_VERSION_PATCH(deviceProperties.driverVersion));
312 ImGui::TableNextColumn(); ImGui::Text(
"Vendor ID: %d", deviceProperties.vendorID);
313 ImGui::TableNextColumn(); ImGui::Text(
"Device ID: %d", deviceProperties.deviceID);
314 ImGui::TableNextColumn(); ImGui::Text(
"Device Type: %d", deviceProperties.deviceType);
315 ImGui::TableNextColumn(); ImGui::Text(
"Discrete Queue Priorities: %d", deviceProperties.limits.discreteQueuePriorities);
316 ImGui::TableNextColumn(); ImGui::Text(
"Max Push Constants Size: %d", deviceProperties.limits.maxPushConstantsSize);
317 ImGui::TableNextColumn(); ImGui::Text(
"Max Memory Allocation Count: %d", deviceProperties.limits.maxMemoryAllocationCount);
318 ImGui::TableNextColumn(); ImGui::Text(
"Max Image Dimension 1D: %d", deviceProperties.limits.maxImageDimension1D);
319 ImGui::TableNextColumn(); ImGui::Text(
"Max Image Dimension 2D: %d", deviceProperties.limits.maxImageDimension2D);
320 ImGui::TableNextColumn(); ImGui::Text(
"Max Image Dimension 3D: %d", deviceProperties.limits.maxImageDimension3D);
321 ImGui::TableNextColumn(); ImGui::Text(
"Max Image Dimension Cube: %d", deviceProperties.limits.maxImageDimensionCube);
322 ImGui::TableNextColumn(); ImGui::Text(
"Max Image Array Layers: %d", deviceProperties.limits.maxImageArrayLayers);
323 ImGui::TableNextColumn(); ImGui::Text(
"Max Texel Buffer Elements: %d", deviceProperties.limits.maxTexelBufferElements);
324 ImGui::TableNextColumn(); ImGui::Text(
"Max Uniform Buffer Range: %d", deviceProperties.limits.maxUniformBufferRange);
325 ImGui::TableNextColumn(); ImGui::Text(
"Max Storage Buffer Range: %d", deviceProperties.limits.maxStorageBufferRange);