From e12a327cc0b4f1e59f4a66a80b170ec41ce97be6 Mon Sep 17 00:00:00 2001 From: John Tsiombikas Date: Tue, 28 Nov 2017 08:47:33 +0200 Subject: [PATCH] rudimentary scenegraph treeview --- src/app.cc | 22 +++++++++------------- src/dbg_gui.cc | 2 ++ src/dbg_gui.h | 3 +++ src/metascene.cc | 25 +++++++++++++++++++++++++ src/scene.cc | 1 + src/scene.h | 3 +++ src/sceneload.cc | 3 +++ src/snode.cc | 15 +++++++++++++++ 8 files changed, 61 insertions(+), 13 deletions(-) diff --git a/src/app.cc b/src/app.cc index a03fd34..46b0152 100644 --- a/src/app.cc +++ b/src/app.cc @@ -71,8 +71,6 @@ static bool show_blobs; static Renderer *rend; -static bool show_debug_gui; - bool app_init(int argc, char **argv) { @@ -347,11 +345,9 @@ void app_display() float dt = (float)(time_msec - prev_msec) / 1000.0f; prev_msec = time_msec; - if(show_debug_gui) { + if(debug_gui) { ImGui::GetIOPtr()->DeltaTime = dt; ImGui::NewFrame(); - - ImGui::ShowTestWindow(); } if(opt.vr) { @@ -378,7 +374,7 @@ void app_display() draw_vrhands(); } - if(show_debug_gui) { + if(debug_gui) { ImGui::Render(); } } @@ -408,7 +404,7 @@ void app_display() glUseProgram(0); } - if(show_debug_gui) { + if(debug_gui) { ImGui::Render(); } app_swap_buffers(); @@ -500,7 +496,7 @@ void app_keyboard(int key, bool pressed) { unsigned int mod = app_get_modifiers(); - if(show_debug_gui && !(pressed && (key == '`' || key == 27))) { + if(debug_gui && !(pressed && (key == '`' || key == 27))) { debug_gui_key(key, pressed, mod); return; // ignore all keystrokes when GUI is visible } @@ -519,8 +515,8 @@ void app_keyboard(int key, bool pressed) break; case '`': - show_debug_gui = !show_debug_gui; - show_message("debug gui %s", show_debug_gui ? "enabled" : "disabled"); + debug_gui = !debug_gui; + show_message("debug gui %s", debug_gui ? "enabled" : "disabled"); break; case 'm': @@ -592,7 +588,7 @@ void app_keyboard(int key, bool pressed) void app_mouse_button(int bn, bool pressed, int x, int y) { - if(show_debug_gui) { + if(debug_gui) { debug_gui_mbutton(bn, pressed, x, y); return; // ignore mouse events while GUI is visible } @@ -620,7 +616,7 @@ static void mouse_zoom(float dx, float dy) void app_mouse_motion(int x, int y) { - if(show_debug_gui) { + if(debug_gui) { debug_gui_mmotion(x, y); return; // ignore mouse events while GUI is visible } @@ -651,7 +647,7 @@ void app_mouse_delta(int dx, int dy) void app_mouse_wheel(int dir) { - if(show_debug_gui) { + if(debug_gui) { debug_gui_wheel(dir); } } diff --git a/src/dbg_gui.cc b/src/dbg_gui.cc index a968b29..68832ce 100644 --- a/src/dbg_gui.cc +++ b/src/dbg_gui.cc @@ -7,6 +7,8 @@ static void render_func(ImDrawData *ddat); +bool debug_gui, parent_expanded; + static ImGuiIO *io; static Texture *tex; diff --git a/src/dbg_gui.h b/src/dbg_gui.h index 739e1af..f6ff011 100644 --- a/src/dbg_gui.h +++ b/src/dbg_gui.h @@ -3,6 +3,9 @@ #include "imgui/imgui.h" +extern bool debug_gui; +extern bool parent_expanded; + bool init_debug_gui(); void cleanup_debug_gui(); diff --git a/src/metascene.cc b/src/metascene.cc index fd4569b..64946cb 100644 --- a/src/metascene.cc +++ b/src/metascene.cc @@ -16,6 +16,7 @@ #include "treestore.h" #include "logger.h" #include "app.h" +#include "dbg_gui.h" #if defined(WIN32) || defined(__WIN32__) #include @@ -73,9 +74,33 @@ bool MetaScene::load(const char *fname) void MetaScene::update(float dt) { + bool expanded; + static char text[256]; + if(debug_gui) { + ImGui::Begin("MetaScene nodes", 0, 0); + } + int nscn = scenes.size(); for(int i=0; iname.empty()) { + sprintf(text, "scene %3d", i); + } else { + sprintf(text, "scene %3d: %s", i, scenes[i]->name.c_str()); + } + expanded = parent_expanded = ImGui::TreeNode(text); + } + scenes[i]->update(dt); + + if(debug_gui && expanded) { + ImGui::TreePop(); + } + } + + if(debug_gui) { + ImGui::End(); } } diff --git a/src/scene.cc b/src/scene.cc index adc90fb..012847c 100644 --- a/src/scene.cc +++ b/src/scene.cc @@ -2,6 +2,7 @@ #include "scene.h" #include "objmesh.h" #include "app.h" +#include "dbg_gui.h" static void destroy_node_tree(SceneNode *n); diff --git a/src/scene.h b/src/scene.h index c0a5612..dd421d9 100644 --- a/src/scene.h +++ b/src/scene.h @@ -3,6 +3,7 @@ #include #include +#include #include "mesh.h" #include "snode.h" #include "texture.h" @@ -21,6 +22,8 @@ class MetaScene; class Scene { public: + std::string name; + MetaScene *metascn; DataMap datamap; diff --git a/src/sceneload.cc b/src/sceneload.cc index 1996663..4c0d324 100644 --- a/src/sceneload.cc +++ b/src/sceneload.cc @@ -68,6 +68,9 @@ bool Scene::load(const char *fname, unsigned int flags) } info_log("Loading scene file: %s\n", fname); + if(this->name.empty()) { + this->name = std::string(fname); + } const aiScene *aiscn = aiImportFile(fname, ppflags); if(!aiscn) { diff --git a/src/snode.cc b/src/snode.cc index ffb1d08..a1d41ae 100644 --- a/src/snode.cc +++ b/src/snode.cc @@ -3,6 +3,7 @@ #include #include "snode.h" #include "objmesh.h" +#include "dbg_gui.h" SceneNode::SceneNode() : scale(1, 1, 1) @@ -194,12 +195,26 @@ void SceneNode::update_node(float dt) void SceneNode::update(float dt) { + bool expanded = false; + + if(debug_gui) { + if(parent_expanded) { + int flags = children.empty() ? ImGuiTreeNodeFlags_Leaf : 0; + expanded = ImGui::TreeNodeEx(name ? name : "", flags); + } + } + update_node(dt); int num = children.size(); for(int i=0; iupdate(dt); } + + if(debug_gui && expanded) { + ImGui::TreePop(); + } } void SceneNode::apply_xform() -- 1.7.10.4