Skip to content
Snippets Groups Projects
Commit 30dfc919 authored by Adam Nyberg's avatar Adam Nyberg
Browse files

Simple GUI ccontrols with no backend follow up

parent 5adb8f7a
No related branches found
No related tags found
No related merge requests found
......@@ -60,6 +60,7 @@ set(COMMON_SOURCES
src/itterative_PCISPH.cu
src/spawn_particles.cpp
src/Camera.cpp
src/ImGuiManager.cpp
${CMAKE_CURRENT_SOURCE_DIR}/common/GL_utilities.c
# Add other common source files if needed
)
......
......@@ -16,6 +16,8 @@
#include "imgui_impl_glfw.h" // Use the GLFW backend
#include "imgui_impl_opengl3.h" // Use the OpenGL3 backend
#include "include/ImGuiManager.h"
#include "include/FluidConfig.h"
#include "include/PCISPH_sim.h" // Header for CUDA function declarations
#include "include/spawn_particles.h"
#include "include/Camera.h"
......@@ -24,6 +26,8 @@
#define MAIN
#include "VectorUtils4.h"
FluidConfig fluidConfig;
// Number of particles
const int NUM_PARTICLES = 50000;
const float GRID_SPACING = 0.25f;
......@@ -382,18 +386,8 @@ int main(int argc, char** argv) {
// Initialize FBO with initial window size (1280x720)
initFBO(initialWidth, initialHeight, fbo, fboTexture, depthRBO);
// Setup ImGui context
IMGUI_CHECKVERSION();
ImGui::CreateContext();
ImGuiIO& io = ImGui::GetIO(); (void)io;
io.ConfigFlags |= ImGuiConfigFlags_DockingEnable; // Enable docking
// Setup ImGui style
ImGui::StyleColorsDark();
// Setup ImGui Platform/Renderer backends
ImGui_ImplGlfw_InitForOpenGL(window, true);
ImGui_ImplOpenGL3_Init("#version 330");
// Instantiate ImGuiManager
ImGuiManager imguiManager(window, fluidConfig);
// Set GLFW callbacks
glfwSetWindowUserPointer(window, cameraPtr);
......@@ -406,9 +400,10 @@ int main(int argc, char** argv) {
glfwPollEvents();
// Start ImGui frame
ImGui_ImplOpenGL3_NewFrame();
ImGui_ImplGlfw_NewFrame();
ImGui::NewFrame();
imguiManager.newFrame();
// Obtain ImGuiIO reference
ImGuiIO& io = imguiManager.getIO();
// Create a full-screen dockspace
ImGui::SetNextWindowPos(ImVec2(0, 0));
......@@ -423,10 +418,13 @@ int main(int argc, char** argv) {
ImGui::End();
// Controls window
ImGui::Begin("Controls");
ImGui::Text("Control Panel");
// Add your control widgets here (sliders, buttons, etc.)
ImGui::End();
imguiManager.createControlsWindow();
// Frame Stats window
imguiManager.createFrameStatsWindow();
// FBO Selection window
imguiManager.createFBOSelectionWindow();
// Simulation window
ImGui::Begin("Simulation");
......@@ -455,17 +453,13 @@ int main(int argc, char** argv) {
ImGui::End();
// Render ImGui
ImGui::Render();
ImGui_ImplOpenGL3_RenderDrawData(ImGui::GetDrawData());
imguiManager.render();
// Swap buffers
glfwSwapBuffers(window);
}
// Cleanup ImGui and OpenGL resources
ImGui_ImplOpenGL3_Shutdown();
ImGui_ImplGlfw_Shutdown();
ImGui::DestroyContext();
// Cleanup ImGui and OpenGL resources is handled by ImGuiManager destructor
// Cleanup your own resources
cleanup();
......@@ -477,4 +471,4 @@ int main(int argc, char** argv) {
glfwDestroyWindow(window);
glfwTerminate();
return 0;
}
}
\ No newline at end of file
// ImGuiManager.cpp
#include "include/ImGuiManager.h"
#include "imgui_impl_glfw.h"
#include "imgui_impl_opengl3.h"
// Constructor: Initializes ImGui context and sets up backends
ImGuiManager::ImGuiManager(GLFWwindow* window, FluidConfig& config)
: fluidConfig(config) // Initialize the reference
{
// Setup Dear ImGui context
IMGUI_CHECKVERSION();
ImGui::CreateContext();
ImGuiIO& io = ImGui::GetIO(); (void)io;
// Enable Docking
io.ConfigFlags |= ImGuiConfigFlags_DockingEnable;
// Optional: Enable Multi-Viewport / Platform Windows
// io.ConfigFlags |= ImGuiConfigFlags_ViewportsEnable;
// Setup Dear ImGui style
ImGui::StyleColorsDark();
// ImGui::StyleColorsClassic();
// Setup Platform/Renderer backends
ImGui_ImplGlfw_InitForOpenGL(window, true);
ImGui_ImplOpenGL3_Init("#version 330");
}
// Destructor: Cleans up ImGui resources
ImGuiManager::~ImGuiManager() {
// Cleanup ImGui backends
ImGui_ImplOpenGL3_Shutdown();
ImGui_ImplGlfw_Shutdown();
// Destroy ImGui context
ImGui::DestroyContext();
}
// Starts a new ImGui frame
void ImGuiManager::newFrame() {
// Start the Dear ImGui frame
ImGui_ImplOpenGL3_NewFrame();
ImGui_ImplGlfw_NewFrame();
ImGui::NewFrame();
}
// Renders ImGui draw data
void ImGuiManager::render() {
// Rendering
ImGui::Render();
ImGui_ImplOpenGL3_RenderDrawData(ImGui::GetDrawData());
// Update and Render additional Platform Windows (if enabled)
/*
ImGuiIO& io = ImGui::GetIO();
if (io.ConfigFlags & ImGuiConfigFlags_ViewportsEnable){
GLFWwindow* backup_current_context = glfwGetCurrentContext();
ImGui::UpdatePlatformWindows();
ImGui::RenderPlatformWindowsDefault();
glfwMakeContextCurrent(backup_current_context);
}
*/
}
// Provides access to ImGuiIO
ImGuiIO& ImGuiManager::getIO() {
return ImGui::GetIO();
}
void ImGuiManager::createControlsWindow() {
ImGui::Begin("Controls");
ImGui::Text("Fluid Simulation Parameters");
ImGui::Separator(); // Draw a horizontal line to separate sections
ImGui::Spacing();
// Block: Fluid Properties
ImGui::Text("Fluid Properties:");
ImGui::Spacing();
ImGui::Text("Viscosity:");
ImGui::SliderFloat("##ViscositySlider", &fluidConfig.viscosity, 0.0f, 5.0f, "%.2f");
ImGui::Spacing();
ImGui::Text("Particle Mass:");
ImGui::SliderFloat("##ParticleMassSlider", &fluidConfig.particleMass, 0.0f, 2.0f, "%.2f");
ImGui::Spacing();
ImGui::Separator(); // Separate sections visually
ImGui::Spacing();
// Block: Simulation Settings
ImGui::Text("Simulation Settings:");
ImGui::Spacing();
ImGui::Text("Rest Density:");
ImGui::SliderFloat("##RestDensitySlider", &fluidConfig.restDensity, 1000.0f, 5000.0f, "%.0f");
ImGui::Spacing();
ImGui::Text("Smoothing Radius:");
ImGui::SliderFloat("##SmoothingRadiusSlider", &fluidConfig.smoothingRadius, 0.1f, 1.0f, "%.2f");
ImGui::Spacing();
ImGui::Separator(); // Separate sections visually
ImGui::Spacing();
// Additional blocks can be added as needed
// For example:
// ImGui::Text("Additional Settings:");
// ImGui::Spacing();
// ImGui::SliderFloat("SomeOtherParameter", &someConfigValue, min, max, "%.2f");
ImGui::End();
}
// Creates the "Frame Stats" window with FPS graphs
void ImGuiManager::createFrameStatsWindow() {
ImGui::Begin("Frame Stats");
// Example implementation using plot lines
static float fpsHistory[120] = {0};
static float frameTimeHistory[120] = {0};
static int historyIndex = 0;
// Update history arrays (this should be called each frame)
ImGuiIO& io = ImGui::GetIO();
float currentFps = io.Framerate;
float currentFrameTime = 1000.0f / currentFps; // in ms
fpsHistory[historyIndex % 120] = currentFps;
frameTimeHistory[historyIndex % 120] = currentFrameTime;
historyIndex++;
// Plot FPS
ImGui::Text("FPS");
ImGui::PlotLines("##FPS", fpsHistory, 120, historyIndex % 120, NULL, 0.0f, 120.0f, ImVec2(0, 80));
// Plot Frame Time
ImGui::Text("Frame Time (ms)");
ImGui::PlotLines("##FrameTime", frameTimeHistory, 120, historyIndex % 120, NULL, 0.0f, 50.0f, ImVec2(0, 80));
ImGui::End();
}
// Creates the "FBO Selection" window with a dropdown
void ImGuiManager::createFBOSelectionWindow() {
ImGui::Begin("FBO Selection");
static int selectedFBO = 0;
const char* fboOptions[] = { "Stage 1", "Stage 2", "Stage 3", "Stage 4" };
int numFBOs = sizeof(fboOptions) / sizeof(fboOptions[0]);
ImGui::Combo("Select FBO to Render", &selectedFBO, fboOptions, numFBOs);
// You can store 'selectedFBO' to use it later for rendering
// For now, as per your request, no functionality is implemented
ImGui::End();
}
// FluidConfig.h
#ifndef FLUID_CONFIG_H
#define FLUID_CONFIG_H
struct FluidConfig {
float viscosity = 0.2f;
float particleMass = 0.4f;
float restDensity = 3000.0f;
float smoothingRadius = 0.35f; // h_H
// Constructor can initialize from constants if needed
FluidConfig() = default;
};
#endif // FLUID_CONFIG_H
// ImGuiManager.h
#ifndef IMGUI_MANAGER_H
#define IMGUI_MANAGER_H
#include <GLFW/glfw3.h>
#include "imgui.h"
#include "include/FluidConfig.h"
class ImGuiManager {
public:
// Constructor initializes ImGui
ImGuiManager(GLFWwindow* window, FluidConfig& config);
// Destructor cleans up ImGui
~ImGuiManager();
// Starts a new ImGui frame
void newFrame();
// Renders ImGui draw data
void render();
// Provides access to ImGuiIO
ImGuiIO& getIO();
// Function to create the Controls window
void createControlsWindow();
// Function to create the FPS graph
void createFrameStatsWindow();
// Function to create the FBO selection window
void createFBOSelectionWindow();
private:
FluidConfig& fluidConfig; // Reference to fluid configuration
};
#endif // IMGUI_MANAGER_H
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment