debug gui select/hide nodes
authorJohn Tsiombikas <nuclear@member.fsf.org>
Wed, 17 Jan 2018 16:55:31 +0000 (18:55 +0200)
committerJohn Tsiombikas <nuclear@member.fsf.org>
Wed, 17 Jan 2018 16:55:31 +0000 (18:55 +0200)
src/app.cc
src/dbg_gui.cc
src/dbg_gui.h
src/metascene.cc
src/renderer.cc
src/snode.cc
src/snode.h

index d4b516e..8aaaee3 100644 (file)
@@ -20,6 +20,7 @@
 #include "exman.h"
 #include "blob_exhibit.h"
 #include "dbg_gui.h"
+#include "geomdraw.h"
 
 #define NEAR_CLIP      5.0
 #define FAR_CLIP       10000.0
@@ -483,6 +484,11 @@ static void draw_scene()
        }
        */
 
+       if(debug_gui && dbg_sel_node) {
+               AABox bvol = dbg_sel_node->get_bounds();
+               draw_geom_object(&bvol);
+       }
+
        if(show_walk_mesh && mscn->walk_mesh) {
                glPushAttrib(GL_ENABLE_BIT);
                glEnable(GL_BLEND);
index 68832ce..c1abce3 100644 (file)
@@ -8,6 +8,7 @@
 static void render_func(ImDrawData *ddat);
 
 bool debug_gui, parent_expanded;
+SceneNode *dbg_sel_node;
 
 static ImGuiIO *io;
 static Texture *tex;
index f6ff011..69b68aa 100644 (file)
@@ -3,8 +3,11 @@
 
 #include "imgui/imgui.h"
 
+class SceneNode;
+
 extern bool debug_gui;
 extern bool parent_expanded;
+extern SceneNode *dbg_sel_node;
 
 bool init_debug_gui();
 void cleanup_debug_gui();
index 64946cb..d9f96fb 100644 (file)
@@ -78,6 +78,14 @@ void MetaScene::update(float dt)
        static char text[256];
        if(debug_gui) {
                ImGui::Begin("MetaScene nodes", 0, 0);
+               ImGui::Columns(2);
+
+               static bool once;
+               if(!once) {
+                       float x = ImGui::GetColumnOffset(1);
+                       ImGui::SetColumnOffset(1, x * 1.7);
+                       once = true;
+               }
        }
 
        int nscn = scenes.size();
@@ -90,6 +98,8 @@ void MetaScene::update(float dt)
                                sprintf(text, "scene %3d: %s", i, scenes[i]->name.c_str());
                        }
                        expanded = parent_expanded = ImGui::TreeNode(text);
+                       ImGui::NextColumn();
+                       ImGui::NextColumn();
                }
 
                scenes[i]->update(dt);
@@ -100,10 +110,12 @@ void MetaScene::update(float dt)
        }
 
        if(debug_gui) {
+               ImGui::Columns(1);
                ImGui::End();
        }
 }
 
+// XXX not used, renderer draws
 void MetaScene::draw() const
 {
        int nscn = scenes.size();
index 0987b0d..bb274f2 100644 (file)
@@ -45,5 +45,17 @@ void Renderer::draw() const
 
 void Renderer::draw_object(Object *obj) const
 {
-       obj->draw();
+       bool vis = true;
+       SceneNode *n = obj->node;
+       while(n) {
+               if(!n->visible) {
+                       vis = false;
+                       break;
+               }
+               n = n->get_parent();
+       }
+
+       if(vis) {
+               obj->draw();
+       }
 }
index fd37f24..b171f35 100644 (file)
@@ -11,6 +11,7 @@ SceneNode::SceneNode()
        scene = 0;
        parent = 0;
        name = 0;
+       visible = true;
        local_bvol_valid = false;
 }
 
@@ -20,6 +21,7 @@ SceneNode::SceneNode(Object *obj)
        scene = 0;
        parent = 0;
        name = 0;
+       visible = true;
        local_bvol_valid = false;
        add_object(obj);
 }
@@ -205,8 +207,21 @@ void SceneNode::update(float dt)
 
        if(debug_gui) {
                if(parent_expanded) {
-                       int flags = children.empty() ? ImGuiTreeNodeFlags_Leaf : 0;
+                       ImGui::PushID(this);
+                       ImGui::AlignTextToFramePadding();
+
+                       int flags = ImGuiTreeNodeFlags_OpenOnArrow | ImGuiTreeNodeFlags_OpenOnDoubleClick;
+                       if(children.empty()) flags |= ImGuiTreeNodeFlags_Leaf;
+                       if(dbg_sel_node == this) flags |= ImGuiTreeNodeFlags_Selected;
                        expanded = ImGui::TreeNodeEx(name ? name : "<nameless node>", flags);
+                       if(ImGui::IsItemClicked()) {
+                               dbg_sel_node = this;
+                       }
+
+                       ImGui::NextColumn();
+                       ImGui::Checkbox("##vis", &visible);
+                       ImGui::NextColumn();
+                       ImGui::PopID();
                }
        }
 
index 94ccb6a..6fa52ba 100644 (file)
@@ -30,6 +30,7 @@ private:
 public:
        Scene *scene;   // scene to which this node belongs
        Mat4 dbg_xform;
+       bool visible;   // if true, objects of this node are supposed to be visible
 
        SceneNode();
        explicit SceneNode(Object *obj);