Updated ImGUI configuration to hook into the GLM math functions that control the Model, View, and Projection matrix
This commit is contained in:
parent
a1544ce989
commit
d8c82d3351
@ -3,6 +3,6 @@ Pos=60,60
|
|||||||
Size=400,400
|
Size=400,400
|
||||||
|
|
||||||
[Window][Agnosia Debug]
|
[Window][Agnosia Debug]
|
||||||
Pos=410,116
|
Pos=124,277
|
||||||
Size=494,375
|
Size=583,225
|
||||||
|
|
||||||
|
@ -1,19 +1,113 @@
|
|||||||
#include "agnosiaimgui.h"
|
#include "agnosiaimgui.h"
|
||||||
#include "imgui.h"
|
#include "graphics/buffers.h"
|
||||||
|
|
||||||
namespace agnosia_imgui {
|
namespace agnosia_imgui {
|
||||||
|
|
||||||
struct {
|
VkDescriptorPool imGuiDescriptorPool;
|
||||||
} ImGuiSettings;
|
|
||||||
|
|
||||||
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::BeginTabBar("MainTabBar", ImGuiTabBarFlags_Reorderable)) {
|
||||||
if (ImGui::BeginTabItem("Graphics Pipeline")) {
|
if (ImGui::BeginTabItem("Transforms Control")) {
|
||||||
ImGui::Text("Test");
|
initWindow();
|
||||||
ImGui::EndTabItem();
|
ImGui::EndTabItem();
|
||||||
}
|
}
|
||||||
|
|
||||||
ImGui::EndTabBar();
|
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
|
} // namespace agnosia_imgui
|
||||||
|
@ -1,11 +1,15 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
#include "global.h"
|
#include "global.h"
|
||||||
|
#include "graphics/texture.h"
|
||||||
#include "imgui.h"
|
#include "imgui.h"
|
||||||
|
#include "imgui_impl_glfw.h"
|
||||||
|
#include "imgui_impl_vulkan.h"
|
||||||
#include <map>
|
#include <map>
|
||||||
|
|
||||||
namespace agnosia_imgui {
|
namespace agnosia_imgui {
|
||||||
class Gui {
|
class Gui {
|
||||||
public:
|
public:
|
||||||
static void drawTabs();
|
static void drawImGui();
|
||||||
|
static void initImgui(VkInstance instance);
|
||||||
};
|
};
|
||||||
} // namespace agnosia_imgui
|
} // namespace agnosia_imgui
|
||||||
|
@ -1,3 +1,4 @@
|
|||||||
|
#include "agnosiaimgui.h"
|
||||||
#include "entrypoint.h"
|
#include "entrypoint.h"
|
||||||
#include "global.h"
|
#include "global.h"
|
||||||
#include "graphics/texture.h"
|
#include "graphics/texture.h"
|
||||||
@ -105,14 +106,14 @@ void initVulkan() {
|
|||||||
buffers_libs::Buffers::createDescriptorSets();
|
buffers_libs::Buffers::createDescriptorSets();
|
||||||
graphics_pipeline::Graphics::createCommandBuffer();
|
graphics_pipeline::Graphics::createCommandBuffer();
|
||||||
render_present::Render::createSyncObject();
|
render_present::Render::createSyncObject();
|
||||||
render_present::Render::init_imgui(vulkaninstance);
|
agnosia_imgui::Gui::initImgui(vulkaninstance);
|
||||||
}
|
}
|
||||||
|
|
||||||
void mainLoop() {
|
void mainLoop() {
|
||||||
while (!glfwWindowShouldClose(Global::window)) {
|
while (!glfwWindowShouldClose(Global::window)) {
|
||||||
glfwPollEvents();
|
glfwPollEvents();
|
||||||
|
|
||||||
render_present::Render::drawImGui();
|
agnosia_imgui::Gui::drawImGui();
|
||||||
render_present::Render::drawFrame();
|
render_present::Render::drawFrame();
|
||||||
}
|
}
|
||||||
vkDeviceWaitIdle(Global::device);
|
vkDeviceWaitIdle(Global::device);
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
#include "buffers.h"
|
#include "buffers.h"
|
||||||
|
#include <glm/fwd.hpp>
|
||||||
|
|
||||||
VkBuffer vertexBuffer;
|
VkBuffer vertexBuffer;
|
||||||
VkDeviceMemory vertexBufferMemory;
|
VkDeviceMemory vertexBufferMemory;
|
||||||
@ -10,6 +11,13 @@ std::vector<VkBuffer> uniformBuffers;
|
|||||||
std::vector<VkDeviceMemory> uniformBuffersMemory;
|
std::vector<VkDeviceMemory> uniformBuffersMemory;
|
||||||
std::vector<void *> uniformBuffersMapped;
|
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 {
|
namespace buffers_libs {
|
||||||
uint32_t Buffers::findMemoryType(uint32_t typeFilter,
|
uint32_t Buffers::findMemoryType(uint32_t typeFilter,
|
||||||
VkMemoryPropertyFlags properties) {
|
VkMemoryPropertyFlags properties) {
|
||||||
@ -238,20 +246,22 @@ void Buffers::updateUniformBuffer(uint32_t currentImage) {
|
|||||||
ubo.time = time;
|
ubo.time = time;
|
||||||
// Modify the model projection transformation to rotate around the Z over
|
// Modify the model projection transformation to rotate around the Z over
|
||||||
// time.
|
// time.
|
||||||
ubo.model = glm::rotate(glm::mat4(1.0f), time * glm::radians(30.0f),
|
ubo.model = glm::translate(glm::mat4(1.0f),
|
||||||
glm::vec3(0.0f, 0.0f, 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
|
// 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
|
// degree angle. This takes the eye position, center position, and the up
|
||||||
// direction.
|
// direction.
|
||||||
ubo.view =
|
ubo.view = glm::lookAt(glm::vec3(camPos[0], camPos[1], camPos[2]),
|
||||||
glm::lookAt(glm::vec3(2.0f, 2.0f * sin(time), 2.0f),
|
glm::vec3(centerPos[0], centerPos[1], centerPos[2]),
|
||||||
glm::vec3(0.0f, 0.0f, 0.5f), glm::vec3(0.0f, 0.0f, 1.0f));
|
glm::vec3(upDir[0], upDir[1], upDir[2]));
|
||||||
// 45 degree field of view, set aspect ratio, and near and far clipping range.
|
// 45 degree field of view, set aspect ratio, and near and far clipping range.
|
||||||
ubo.proj = glm::perspective(
|
ubo.proj = glm::perspective(
|
||||||
glm::radians(45.0f),
|
glm::radians(depthField),
|
||||||
device_libs::DeviceControl::getSwapChainExtent().width /
|
device_libs::DeviceControl::getSwapChainExtent().width /
|
||||||
(float)device_libs::DeviceControl::getSwapChainExtent().height,
|
(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
|
// GLM was created for OpenGL, where the Y coordinate was inverted. This
|
||||||
// simply flips the sign.
|
// simply flips the sign.
|
||||||
@ -341,4 +351,10 @@ void Buffers::destroyDescriptorPool() {
|
|||||||
vkDestroyDescriptorPool(Global::device, descriptorPool, nullptr);
|
vkDestroyDescriptorPool(Global::device, descriptorPool, nullptr);
|
||||||
}
|
}
|
||||||
VkDescriptorPool Buffers::getDescriptorPool() { return descriptorPool; }
|
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
|
} // namespace buffers_libs
|
||||||
|
@ -24,5 +24,12 @@ public:
|
|||||||
static void createDescriptorSets();
|
static void createDescriptorSets();
|
||||||
static void destroyDescriptorPool();
|
static void destroyDescriptorPool();
|
||||||
static VkDescriptorPool getDescriptorPool();
|
static VkDescriptorPool getDescriptorPool();
|
||||||
|
|
||||||
|
static float *getObjPos();
|
||||||
|
static float *getCamPos();
|
||||||
|
static float *getCenterPos();
|
||||||
|
static float *getUpDir();
|
||||||
|
static float *getDepthField();
|
||||||
|
static float *getDistanceField();
|
||||||
};
|
};
|
||||||
} // namespace buffers_libs
|
} // namespace buffers_libs
|
||||||
|
@ -6,9 +6,7 @@
|
|||||||
#include "texture.h"
|
#include "texture.h"
|
||||||
#include <stdexcept>
|
#include <stdexcept>
|
||||||
|
|
||||||
#include "../agnosiaimgui.h"
|
|
||||||
#include "imgui.h"
|
#include "imgui.h"
|
||||||
#include "imgui_impl_glfw.h"
|
|
||||||
#include "imgui_impl_vulkan.h"
|
#include "imgui_impl_vulkan.h"
|
||||||
|
|
||||||
namespace render_present {
|
namespace render_present {
|
||||||
@ -16,9 +14,6 @@ namespace render_present {
|
|||||||
std::vector<VkSemaphore> imageAvailableSemaphores;
|
std::vector<VkSemaphore> imageAvailableSemaphores;
|
||||||
std::vector<VkSemaphore> renderFinishedSemaphores;
|
std::vector<VkSemaphore> renderFinishedSemaphores;
|
||||||
std::vector<VkFence> inFlightFences;
|
std::vector<VkFence> inFlightFences;
|
||||||
VkDescriptorPool imGuiDescriptorPool;
|
|
||||||
|
|
||||||
static float floatBar = 0.0f;
|
|
||||||
|
|
||||||
void recreateSwapChain() {
|
void recreateSwapChain() {
|
||||||
int width = 0, height = 0;
|
int width = 0, height = 0;
|
||||||
@ -118,32 +113,7 @@ void Render::drawFrame() {
|
|||||||
Global::currentFrame =
|
Global::currentFrame =
|
||||||
(Global::currentFrame + 1) % Global::MAX_FRAMES_IN_FLIGHT;
|
(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
|
#pragma info
|
||||||
// SEMAPHORES
|
// SEMAPHORES
|
||||||
// Synchronization of execution on the GPU in Vulkan is *explicit* The Order of
|
// 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);
|
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
|
} // namespace render_present
|
||||||
|
@ -8,8 +8,6 @@ public:
|
|||||||
static void createSyncObject();
|
static void createSyncObject();
|
||||||
static void destroyFenceSemaphores();
|
static void destroyFenceSemaphores();
|
||||||
static void cleanupSwapChain();
|
static void cleanupSwapChain();
|
||||||
static void init_imgui(VkInstance instance);
|
|
||||||
static void drawImGui();
|
|
||||||
static float getFloatBar();
|
static float getFloatBar();
|
||||||
};
|
};
|
||||||
} // namespace render_present
|
} // namespace render_present
|
||||||
|
Loading…
Reference in New Issue
Block a user