Updated ImGUI configuration to hook into the GLM math functions that control the Model, View, and Projection matrix

This commit is contained in:
Lillian Salehi 2024-11-22 22:36:04 -06:00
parent a1544ce989
commit d8c82d3351
8 changed files with 140 additions and 112 deletions

View File

@ -3,6 +3,6 @@ Pos=60,60
Size=400,400
[Window][Agnosia Debug]
Pos=410,116
Size=494,375
Pos=124,277
Size=583,225

View File

@ -1,19 +1,113 @@
#include "agnosiaimgui.h"
#include "imgui.h"
#include "graphics/buffers.h"
namespace agnosia_imgui {
struct {
} ImGuiSettings;
VkDescriptorPool imGuiDescriptorPool;
void Gui::drawTabs() {
void initWindow() {
ImGui::DragFloat3("Object Position", buffers_libs::Buffers::getObjPos());
ImGui::DragFloat3("Camera Position", buffers_libs::Buffers::getCamPos());
ImGui::DragFloat3("Center Position", buffers_libs::Buffers::getCenterPos());
ImGui::DragFloat3("Up Direction", buffers_libs::Buffers::getUpDir());
ImGui::DragFloat("Depth of Field", buffers_libs::Buffers::getDepthField(),
0.1f, 1.0f, 180.0f, NULL, ImGuiSliderFlags_AlwaysClamp);
ImGui::DragFloat2("Near and Far fields",
buffers_libs::Buffers::getDistanceField());
}
void drawTabs() {
if (ImGui::BeginTabBar("MainTabBar", ImGuiTabBarFlags_Reorderable)) {
if (ImGui::BeginTabItem("Graphics Pipeline")) {
ImGui::Text("Test");
if (ImGui::BeginTabItem("Transforms Control")) {
initWindow();
ImGui::EndTabItem();
}
ImGui::EndTabBar();
}
}
void Gui::drawImGui() {
ImGui_ImplVulkan_NewFrame();
ImGui_ImplGlfw_NewFrame();
ImGui::NewFrame();
// 2. Show a simple window that we create ourselves. We use a Begin/End pair
// to create a named window.
ImGui::Begin("Agnosia Debug");
ImGui::Text("Application average %.3f ms/frame (%.1f FPS)",
1000.0f / ImGui::GetIO().Framerate, ImGui::GetIO().Framerate);
drawTabs();
ImGui::End();
ImGui::Render();
}
void Gui::initImgui(VkInstance instance) {
auto load_vk_func = [&](const char *fn) {
if (auto proc = vkGetDeviceProcAddr(Global::device, fn))
return proc;
return vkGetInstanceProcAddr(instance, fn);
};
ImGui_ImplVulkan_LoadFunctions(
[](const char *fn, void *data) {
return (*(decltype(load_vk_func) *)data)(fn);
},
&load_vk_func);
IMGUI_CHECKVERSION();
ImGui::CreateContext();
// TODO
ImGuiIO &io = ImGui::GetIO();
(void)io;
io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard;
ImGui::StyleColorsDark();
ImGui_ImplGlfw_InitForVulkan(Global::window, true);
VkDescriptorPoolSize ImGuiPoolSizes[]{
{VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1},
};
VkDescriptorPoolCreateInfo ImGuiPoolInfo{
.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO,
.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT,
.maxSets = 1,
.poolSizeCount = 1,
.pPoolSizes = ImGuiPoolSizes,
};
if (vkCreateDescriptorPool(Global::device, &ImGuiPoolInfo, nullptr,
&imGuiDescriptorPool) != VK_SUCCESS) {
throw std::runtime_error("Failed to create ImGui descriptor pool!");
}
VkPipelineRenderingCreateInfo pipelineRenderingCreateInfo{
.sType = VK_STRUCTURE_TYPE_PIPELINE_RENDERING_CREATE_INFO,
.colorAttachmentCount = 1,
.pColorAttachmentFormats = device_libs::DeviceControl::getImageFormat(),
.depthAttachmentFormat = texture_libs::Texture::findDepthFormat(),
};
ImGui_ImplVulkan_InitInfo initInfo{
.Instance = instance,
.PhysicalDevice = Global::physicalDevice,
.Device = Global::device,
.QueueFamily = Global::findQueueFamilies(Global::physicalDevice)
.graphicsFamily.value(),
.Queue = Global::graphicsQueue,
.DescriptorPool = imGuiDescriptorPool,
.MinImageCount = Global::MAX_FRAMES_IN_FLIGHT,
.ImageCount = Global::MAX_FRAMES_IN_FLIGHT,
.MSAASamples = Global::perPixelSampleCount,
.UseDynamicRendering = true,
.PipelineRenderingCreateInfo = pipelineRenderingCreateInfo,
};
ImGui_ImplVulkan_Init(&initInfo);
}
} // namespace agnosia_imgui

View File

@ -1,11 +1,15 @@
#pragma once
#include "global.h"
#include "graphics/texture.h"
#include "imgui.h"
#include "imgui_impl_glfw.h"
#include "imgui_impl_vulkan.h"
#include <map>
namespace agnosia_imgui {
class Gui {
public:
static void drawTabs();
static void drawImGui();
static void initImgui(VkInstance instance);
};
} // namespace agnosia_imgui

View File

@ -1,3 +1,4 @@
#include "agnosiaimgui.h"
#include "entrypoint.h"
#include "global.h"
#include "graphics/texture.h"
@ -105,14 +106,14 @@ void initVulkan() {
buffers_libs::Buffers::createDescriptorSets();
graphics_pipeline::Graphics::createCommandBuffer();
render_present::Render::createSyncObject();
render_present::Render::init_imgui(vulkaninstance);
agnosia_imgui::Gui::initImgui(vulkaninstance);
}
void mainLoop() {
while (!glfwWindowShouldClose(Global::window)) {
glfwPollEvents();
render_present::Render::drawImGui();
agnosia_imgui::Gui::drawImGui();
render_present::Render::drawFrame();
}
vkDeviceWaitIdle(Global::device);

View File

@ -1,4 +1,5 @@
#include "buffers.h"
#include <glm/fwd.hpp>
VkBuffer vertexBuffer;
VkDeviceMemory vertexBufferMemory;
@ -10,6 +11,13 @@ std::vector<VkBuffer> uniformBuffers;
std::vector<VkDeviceMemory> uniformBuffersMemory;
std::vector<void *> uniformBuffersMapped;
float objPos[4] = {0.0f, 0.0f, 0.0f, 0.44f};
float camPos[4] = {2.0f, 2.0f, 2.0f, 0.44f};
float centerPos[4] = {0.0f, 0.0f, 0.0f, 0.44f};
float upDir[4] = {0.0f, 0.0f, 1.0f, 0.44f};
float depthField = 45.0f;
float distanceField[2] = {0.1f, 100.0f};
namespace buffers_libs {
uint32_t Buffers::findMemoryType(uint32_t typeFilter,
VkMemoryPropertyFlags properties) {
@ -238,20 +246,22 @@ void Buffers::updateUniformBuffer(uint32_t currentImage) {
ubo.time = time;
// Modify the model projection transformation to rotate around the Z over
// time.
ubo.model = glm::rotate(glm::mat4(1.0f), time * glm::radians(30.0f),
glm::vec3(0.0f, 0.0f, 1.0f));
ubo.model = glm::translate(glm::mat4(1.0f),
glm::vec3(objPos[0], objPos[1], objPos[2]));
// ubo.model = glm::rotate(glm::mat4(1.0f), time * glm::radians(30.0f),
// glm::vec3(0.0f, 0.0f, 1.0f));
// Modify the view transformation to look at the object from above at a 45
// degree angle. This takes the eye position, center position, and the up
// direction.
ubo.view =
glm::lookAt(glm::vec3(2.0f, 2.0f * sin(time), 2.0f),
glm::vec3(0.0f, 0.0f, 0.5f), glm::vec3(0.0f, 0.0f, 1.0f));
ubo.view = glm::lookAt(glm::vec3(camPos[0], camPos[1], camPos[2]),
glm::vec3(centerPos[0], centerPos[1], centerPos[2]),
glm::vec3(upDir[0], upDir[1], upDir[2]));
// 45 degree field of view, set aspect ratio, and near and far clipping range.
ubo.proj = glm::perspective(
glm::radians(45.0f),
glm::radians(depthField),
device_libs::DeviceControl::getSwapChainExtent().width /
(float)device_libs::DeviceControl::getSwapChainExtent().height,
0.1f, 100.0f);
distanceField[0], distanceField[1]);
// GLM was created for OpenGL, where the Y coordinate was inverted. This
// simply flips the sign.
@ -341,4 +351,10 @@ void Buffers::destroyDescriptorPool() {
vkDestroyDescriptorPool(Global::device, descriptorPool, nullptr);
}
VkDescriptorPool Buffers::getDescriptorPool() { return descriptorPool; }
float *Buffers::getObjPos() { return objPos; }
float *Buffers::getCamPos() { return camPos; }
float *Buffers::getCenterPos() { return centerPos; }
float *Buffers::getUpDir() { return upDir; }
float *Buffers::getDepthField() { return &depthField; }
float *Buffers::getDistanceField() { return distanceField; }
} // namespace buffers_libs

View File

@ -24,5 +24,12 @@ public:
static void createDescriptorSets();
static void destroyDescriptorPool();
static VkDescriptorPool getDescriptorPool();
static float *getObjPos();
static float *getCamPos();
static float *getCenterPos();
static float *getUpDir();
static float *getDepthField();
static float *getDistanceField();
};
} // namespace buffers_libs

View File

@ -6,9 +6,7 @@
#include "texture.h"
#include <stdexcept>
#include "../agnosiaimgui.h"
#include "imgui.h"
#include "imgui_impl_glfw.h"
#include "imgui_impl_vulkan.h"
namespace render_present {
@ -16,9 +14,6 @@ namespace render_present {
std::vector<VkSemaphore> imageAvailableSemaphores;
std::vector<VkSemaphore> renderFinishedSemaphores;
std::vector<VkFence> inFlightFences;
VkDescriptorPool imGuiDescriptorPool;
static float floatBar = 0.0f;
void recreateSwapChain() {
int width = 0, height = 0;
@ -118,32 +113,7 @@ void Render::drawFrame() {
Global::currentFrame =
(Global::currentFrame + 1) % Global::MAX_FRAMES_IN_FLIGHT;
}
void Render::drawImGui() {
ImGui_ImplVulkan_NewFrame();
ImGui_ImplGlfw_NewFrame();
ImGui::NewFrame();
// 2. Show a simple window that we create ourselves. We use a Begin/End pair
// to create a named window.
static int counter = 0;
ImGui::Begin("Agnosia Debug"); // Create a window called "Hello, world!" and
// append into it.
ImGui::Text("This is some useful text."); // Display some text (you can use
// a format strings too)
ImGui::SliderFloat("float", &floatBar, 0.0f,
1.0f); // Edit 1 float using a slider from 0.0f to 1.0f
agnosia_imgui::Gui::drawTabs();
ImGui::Text("Application average %.3f ms/frame (%.1f FPS)",
1000.0f / ImGui::GetIO().Framerate, ImGui::GetIO().Framerate);
ImGui::End();
ImGui::Render();
}
#pragma info
// SEMAPHORES
// Synchronization of execution on the GPU in Vulkan is *explicit* The Order of
@ -212,66 +182,4 @@ void Render::cleanupSwapChain() {
vkDestroySwapchainKHR(Global::device, Global::swapChain, nullptr);
}
void Render::init_imgui(VkInstance instance) {
auto load_vk_func = [&](const char *fn) {
if (auto proc = vkGetDeviceProcAddr(Global::device, fn))
return proc;
return vkGetInstanceProcAddr(instance, fn);
};
ImGui_ImplVulkan_LoadFunctions(
[](const char *fn, void *data) {
return (*(decltype(load_vk_func) *)data)(fn);
},
&load_vk_func);
IMGUI_CHECKVERSION();
ImGui::CreateContext();
// TODO
ImGuiIO &io = ImGui::GetIO();
(void)io;
io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard;
ImGui::StyleColorsDark();
ImGui_ImplGlfw_InitForVulkan(Global::window, true);
VkDescriptorPoolSize ImGuiPoolSizes[]{
{VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1},
};
VkDescriptorPoolCreateInfo ImGuiPoolInfo{
.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO,
.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT,
.maxSets = 1,
.poolSizeCount = 1,
.pPoolSizes = ImGuiPoolSizes,
};
if (vkCreateDescriptorPool(Global::device, &ImGuiPoolInfo, nullptr,
&imGuiDescriptorPool) != VK_SUCCESS) {
throw std::runtime_error("Failed to create ImGui descriptor pool!");
}
VkPipelineRenderingCreateInfo pipelineRenderingCreateInfo{
.sType = VK_STRUCTURE_TYPE_PIPELINE_RENDERING_CREATE_INFO,
.colorAttachmentCount = 1,
.pColorAttachmentFormats = device_libs::DeviceControl::getImageFormat(),
.depthAttachmentFormat = texture_libs::Texture::findDepthFormat(),
};
ImGui_ImplVulkan_InitInfo initInfo{
.Instance = instance,
.PhysicalDevice = Global::physicalDevice,
.Device = Global::device,
.QueueFamily = Global::findQueueFamilies(Global::physicalDevice)
.graphicsFamily.value(),
.Queue = Global::graphicsQueue,
.DescriptorPool = imGuiDescriptorPool,
.MinImageCount = Global::MAX_FRAMES_IN_FLIGHT,
.ImageCount = Global::MAX_FRAMES_IN_FLIGHT,
.MSAASamples = Global::perPixelSampleCount,
.UseDynamicRendering = true,
.PipelineRenderingCreateInfo = pipelineRenderingCreateInfo,
};
ImGui_ImplVulkan_Init(&initInfo);
}
} // namespace render_present

View File

@ -8,8 +8,6 @@ public:
static void createSyncObject();
static void destroyFenceSemaphores();
static void cleanupSwapChain();
static void init_imgui(VkInstance instance);
static void drawImGui();
static float getFloatBar();
};
} // namespace render_present