rudimentary scenegraph treeview
authorJohn Tsiombikas <nuclear@member.fsf.org>
Tue, 28 Nov 2017 06:47:33 +0000 (08:47 +0200)
committerJohn Tsiombikas <nuclear@member.fsf.org>
Tue, 28 Nov 2017 06:47:33 +0000 (08:47 +0200)
src/app.cc
src/dbg_gui.cc
src/dbg_gui.h
src/metascene.cc
src/scene.cc
src/scene.h
src/sceneload.cc
src/snode.cc

index a03fd34..46b0152 100644 (file)
@@ -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);
        }
 }
index a968b29..68832ce 100644 (file)
@@ -7,6 +7,8 @@
 
 static void render_func(ImDrawData *ddat);
 
+bool debug_gui, parent_expanded;
+
 static ImGuiIO *io;
 static Texture *tex;
 
index 739e1af..f6ff011 100644 (file)
@@ -3,6 +3,9 @@
 
 #include "imgui/imgui.h"
 
+extern bool debug_gui;
+extern bool parent_expanded;
+
 bool init_debug_gui();
 void cleanup_debug_gui();
 
index fd4569b..64946cb 100644 (file)
@@ -16,6 +16,7 @@
 #include "treestore.h"
 #include "logger.h"
 #include "app.h"
+#include "dbg_gui.h"
 
 #if defined(WIN32) || defined(__WIN32__)
 #include <malloc.h>
@@ -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; i<nscn; i++) {
+
+               if(debug_gui) {
+                       if(scenes[i]->name.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();
        }
 }
 
index adc90fb..012847c 100644 (file)
@@ -2,6 +2,7 @@
 #include "scene.h"
 #include "objmesh.h"
 #include "app.h"
+#include "dbg_gui.h"
 
 static void destroy_node_tree(SceneNode *n);
 
index c0a5612..dd421d9 100644 (file)
@@ -3,6 +3,7 @@
 
 #include <vector>
 #include <list>
+#include <string>
 #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;
 
index 1996663..4c0d324 100644 (file)
@@ -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) {
index ffb1d08..a1d41ae 100644 (file)
@@ -3,6 +3,7 @@
 #include <algorithm>
 #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 : "<nameless node>", flags);
+               }
+       }
+
        update_node(dt);
 
        int num = children.size();
        for(int i=0; i<num; i++) {
+               parent_expanded = expanded;
                children[i]->update(dt);
        }
+
+       if(debug_gui && expanded) {
+               ImGui::TreePop();
+       }
 }
 
 void SceneNode::apply_xform()