Create Interface struct and functions to control ImGui windows

Should now be able to get and manipulate data pertaining to the ImGui windows so I can properly update the camera's aspect.
This commit is contained in:
Jack 2024-08-26 16:53:49 -04:00
parent eff5bb09e9
commit 1b54280c52
6 changed files with 151 additions and 88 deletions

View File

@ -4,8 +4,8 @@ Size=400,400
Collapsed=0
[Window][Terrain Controls]
Pos=936,19
Size=344,654
Pos=861,19
Size=419,701
Collapsed=0
DockId=0x00000002,0
@ -19,17 +19,31 @@ Collapsed=0
[Window][TerraVisor]
Pos=0,0
Size=1280,673
Size=2199,944
Collapsed=0
[Window][Scene Window]
Pos=0,19
Size=934,654
Size=859,701
Collapsed=0
DockId=0x00000001,0
DockId=0x00000003,0
[Window][Viewport]
Pos=0,19
Size=1603,925
Collapsed=0
DockId=0x00000003,0
[Window][Scene Settings]
Pos=1605,19
Size=594,925
Collapsed=0
DockId=0x00000004,0
[Docking][Data]
DockSpace ID=0x6F42A598 Window=0xE80F322C Pos=0,19 Size=1280,654 Split=X Selected=0x9F2D9299
DockNode ID=0x00000001 Parent=0x6F42A598 SizeRef=934,701 CentralNode=1 Selected=0x9F2D9299
DockNode ID=0x00000002 Parent=0x6F42A598 SizeRef=344,701 Selected=0xF69494A7
DockSpace ID=0x6F42A598 Window=0xE80F322C Pos=0,19 Size=2199,925 Split=X Selected=0x9F2D9299
DockNode ID=0x00000001 Parent=0x6F42A598 SizeRef=0,0 Split=X Selected=0x13926F0B
DockNode ID=0x00000003 Parent=0x00000001 SizeRef=1603,701 CentralNode=1 Selected=0x13926F0B
DockNode ID=0x00000004 Parent=0x00000001 SizeRef=594,701 Selected=0x413E6147
DockNode ID=0x00000002 Parent=0x6F42A598 SizeRef=419,701 Selected=0xF69494A7

26
include/interface.h Normal file
View File

@ -0,0 +1,26 @@
#ifndef INTERFACE_H_
#define INTERFACE_H_
#include <imgui.h>
#include <string>
#include <vector>
#include <functional>
struct Window {
std::string name;
ImVec2 size;
ImVec2 position;
bool isOpen = true;
std::function<void()> renderContent;
Window(const std::string& name, std::function<void()> renderFunc)
: name(name), size(ImVec2(512, 512)), position(ImVec2(0, 0)), renderContent(renderFunc) {}
};
namespace Interface {
void AddWindow(std::vector<Window>& windows, const std::string& name, std::function<void()> renderFunc);
void RenderWindows(std::vector<Window>& windows);
}
#endif // INTERFACE_H_

View File

@ -8,6 +8,7 @@
#include "fbo.h"
#include "camera.h"
#include "interface.h"
struct Vertex {
glm::vec3 position;
@ -25,6 +26,8 @@ class Scene {
void DrawGui(GLFWwindow* window);
void Idle();
void ReloadShader();
void UpdateCamera();
void UpdateViewport();
std::vector<int16_t> LoadHGT(const std::string& filename, int width, int height);
int window_width;
@ -34,6 +37,7 @@ class Scene {
void InitBuffers();
void InitQuadBuffers();
void InitShaders();
void InitUI();
Camera activeCamera_;
Framebuffer geo_fbo_;
@ -48,11 +52,11 @@ class Scene {
float near_z_;
float far_z_;
float fov_;
std::vector<Window> windows_;
glm::mat4 view_matrix_;
glm::mat4 projection_matrix_;
void UpdateCamera();
int16_t SwapEndian(int16_t val);
GLuint CreateHeightmapTexture(std::vector<int16_t> data, int width, int height);
};

View File

@ -57,6 +57,9 @@ void Callbacks::Resize(GLFWwindow* window, int width, int height)
//Set viewport to cover entire framebuffer
glViewport(0, 0, width, height);
//Set aspect ratio used in view matrix calculation
// scene_->window_width = width;
// scene_->window_height = height;
// scene_->Scene::UpdateCamera();
//Scene::Camera::Aspect = float(width) / float(height);
//Scene::Camera::UpdateP();
}

71
source/interface.cpp Normal file
View File

@ -0,0 +1,71 @@
#include "interface.h"
#include <imgui_impl_glfw.h>
#include <imgui_impl_opengl3.h>
namespace Interface {
void AddWindow(std::vector<Window>& windows, const std::string& name, std::function<void()> renderFunc) {
windows.emplace_back(name, renderFunc);
}
void RenderWindows(std::vector<Window>& windows) {
ImGui_ImplOpenGL3_NewFrame();
ImGui_ImplGlfw_NewFrame();
ImGuiIO& io = ImGui::GetIO();
io.ConfigFlags |= ImGuiConfigFlags_DockingEnable;
ImGui::NewFrame();
static ImGuiDockNodeFlags dockspace_flags = ImGuiDockNodeFlags_PassthruCentralNode;
ImGuiWindowFlags window_flags = ImGuiWindowFlags_MenuBar | ImGuiWindowFlags_NoDocking;
// Style windows
const ImGuiViewport* viewport = ImGui::GetMainViewport();
ImGui::SetNextWindowPos(viewport->WorkPos);
ImGui::SetNextWindowSize(viewport->WorkSize);
ImGui::SetNextWindowViewport(viewport->ID);
ImGui::PushStyleVar(ImGuiStyleVar_WindowRounding, 0.0f);
ImGui::PushStyleVar(ImGuiStyleVar_WindowBorderSize, 0.0f);
window_flags |= ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoCollapse | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoMove;
window_flags |= ImGuiWindowFlags_NoBringToFrontOnFocus | ImGuiWindowFlags_NoNavFocus;
window_flags |= ImGuiWindowFlags_NoBackground;
ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, ImVec2(0.0f, 0.0f));
ImGui::Begin("TerraVisor", nullptr, window_flags);
ImGui::PopStyleVar(3);
// Submit the DockSpace
if (io.ConfigFlags & ImGuiConfigFlags_DockingEnable) {
ImGuiID dockspace_id = ImGui::GetID("MyDockSpace");
ImGui::DockSpace(dockspace_id, ImVec2(0.0f, 0.0f), dockspace_flags);
}
if (ImGui::BeginMenuBar()) {
if (ImGui::BeginMenu("Options")) {
ImGui::Text("Nothing Here Yet, Check Back Later!");
ImGui::EndMenu();
}
ImGui::EndMenuBar();
}
ImGui::End();
for (auto& window : windows) {
if (window.isOpen && ImGui::Begin(window.name.c_str(), &window.isOpen)) {
window.size = ImGui::GetWindowSize();
window.position = ImGui::GetWindowPos();
if (window.renderContent) {
window.renderContent();
}
}
ImGui::End();
}
ImGui::Render();
ImGui_ImplOpenGL3_RenderDrawData(ImGui::GetDrawData());
}
}

View File

@ -9,10 +9,6 @@
#include <glm/gtx/transform.hpp>
#include <glm/gtc/type_ptr.hpp>
#include <imgui.h>
#include <imgui_impl_glfw.h>
#include <imgui_impl_opengl3.h>
#include <iostream>
#include <fstream>
#include <sstream>
@ -29,6 +25,7 @@
#include "InitShader.h"
#include "DebugCallback.h"
#include "load_texture.h"
#include "interface.h"
namespace {
@ -91,6 +88,7 @@ void Scene::Init() {
InitBuffers();
ReloadShader();
InitQuadBuffers();
InitUI();
CameraControls::SetPosition(activeCamera_, glm::vec3(1.4f, 1.4f, 0.0f));
CameraControls::SetRotation(activeCamera_, -glm::normalize(CameraControls::GetPosition(activeCamera_)));
@ -197,6 +195,22 @@ void Scene::InitQuadBuffers() {
glBindVertexArray(0);
}
void Scene::InitUI() {
Interface::AddWindow(windows_, "Viewport", [this]() {
ImGui::Image((void*)(intptr_t)lht_fbo_.albedoTexture, ImVec2(window_width, window_height), ImVec2(0, 1), ImVec2(1, 0));
});
Interface::AddWindow(windows_, "Scene Settings", [this]() {
// if (ImGui::Button("Quit")) {
// glfwSetWindowShouldClose(window, GLFW_TRUE);
// }
ImGui::Text("Application average %.3f ms/frame (%.1f FPS)", 1000.0f / ImGui::GetIO().Framerate, ImGui::GetIO().Framerate);
ImGui::SliderFloat("Tessellation Level", &Uniforms::GeoData.maxTessellation, 1.0f, 64.0f);
ImGui::SliderInt("Patch Grid Density", &Uniforms::GeoData.gridDensity, 1, 24);
});
}
// Allows for runtime shader updates
void Scene::ReloadShader() {
@ -274,85 +288,16 @@ void Scene::Display(GLFWwindow* window) {
FBO::Unbind();
DrawGui(window);
//DrawGui(window);
Interface::RenderWindows(windows_);
glfwSwapBuffers(window);
}
void Scene::DrawGui(GLFWwindow* window) {
// Begin ImGui frame
ImGui_ImplOpenGL3_NewFrame();
ImGui_ImplGlfw_NewFrame();
// Enable docking
ImGuiIO& io = ImGui::GetIO();
io.ConfigFlags |= ImGuiConfigFlags_DockingEnable;
ImGui::NewFrame();
static ImGuiDockNodeFlags dockspace_flags = ImGuiDockNodeFlags_PassthruCentralNode;
// Add menu bar
ImGuiWindowFlags window_flags = ImGuiWindowFlags_MenuBar | ImGuiWindowFlags_NoDocking;
// Style windows
const ImGuiViewport* viewport = ImGui::GetMainViewport();
ImGui::SetNextWindowPos(viewport->WorkPos);
ImGui::SetNextWindowSize(viewport->WorkSize);
ImGui::SetNextWindowViewport(viewport->ID);
ImGui::PushStyleVar(ImGuiStyleVar_WindowRounding, 0.0f);
ImGui::PushStyleVar(ImGuiStyleVar_WindowBorderSize, 0.0f);
window_flags |= ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoCollapse | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoMove;
window_flags |= ImGuiWindowFlags_NoBringToFrontOnFocus | ImGuiWindowFlags_NoNavFocus;
window_flags |= ImGuiWindowFlags_NoBackground;
ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, ImVec2(0.0f, 0.0f));
ImGui::Begin("TerraVisor", nullptr, window_flags);
ImGui::PopStyleVar(3);
// Submit the DockSpace
if (io.ConfigFlags & ImGuiConfigFlags_DockingEnable) {
ImGuiID dockspace_id = ImGui::GetID("MyDockSpace");
ImGui::DockSpace(dockspace_id, ImVec2(0.0f, 0.0f), dockspace_flags);
}
if (ImGui::BeginMenuBar()) {
if (ImGui::BeginMenu("Options")) {
ImGui::Text("Nothing Here Yet, Check Back Later!");
ImGui::EndMenu();
}
ImGui::EndMenuBar();
}
ImGui::End();
// Draw Gui
ImGui::Begin("Terrain Controls");
if (ImGui::Button("Quit")) {
glfwSetWindowShouldClose(window, GLFW_TRUE);
}
ImGui::Text("Application average %.3f ms/frame (%.1f FPS)", 1000.0f / ImGui::GetIO().Framerate, ImGui::GetIO().Framerate);
ImGui::SliderFloat("Tessellation Level", &Uniforms::GeoData.maxTessellation, 1.0f, 64.0f);
ImGui::SliderInt("Patch Grid Density", &Uniforms::GeoData.gridDensity, 1, 24);
ImGui::End();
// Draw FBO to ImGui window
ImGui::Begin("Scene Window");
ImVec2 windowSize = ImGui::GetContentRegionAvail();
if (ImGui::GetWindowSize().x != window_width || ImGui::GetWindowSize().y != window_height) {
void Scene::UpdateViewport() {
window_width = ImGui::GetWindowSize().x;
window_height = ImGui::GetWindowSize().y;
UpdateCamera();
}
ImGui::Image((void*)(intptr_t)lht_fbo_.albedoTexture, ImVec2(window_width, window_height), ImVec2(0, 1), ImVec2(1, 0));
ImGui::End();
ImGui::Render();
ImGui_ImplOpenGL3_RenderDrawData(ImGui::GetDrawData());
}
void Scene::Idle() {