From: John Tsiombikas Date: Wed, 17 Jan 2018 16:55:31 +0000 (+0200) Subject: debug gui select/hide nodes X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?p=laserbrain_demo;a=commitdiff_plain;h=fc00873a180b1b7272d94a32dcc40d0d44ed2b72 debug gui select/hide nodes --- diff --git a/src/app.cc b/src/app.cc index d4b516e..8aaaee3 100644 --- a/src/app.cc +++ b/src/app.cc @@ -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); diff --git a/src/dbg_gui.cc b/src/dbg_gui.cc index 68832ce..c1abce3 100644 --- a/src/dbg_gui.cc +++ b/src/dbg_gui.cc @@ -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; diff --git a/src/dbg_gui.h b/src/dbg_gui.h index f6ff011..69b68aa 100644 --- a/src/dbg_gui.h +++ b/src/dbg_gui.h @@ -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(); diff --git a/src/metascene.cc b/src/metascene.cc index 64946cb..d9f96fb 100644 --- a/src/metascene.cc +++ b/src/metascene.cc @@ -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(); diff --git a/src/renderer.cc b/src/renderer.cc index 0987b0d..bb274f2 100644 --- a/src/renderer.cc +++ b/src/renderer.cc @@ -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(); + } } diff --git a/src/snode.cc b/src/snode.cc index fd37f24..b171f35 100644 --- a/src/snode.cc +++ b/src/snode.cc @@ -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 : "", flags); + if(ImGui::IsItemClicked()) { + dbg_sel_node = this; + } + + ImGui::NextColumn(); + ImGui::Checkbox("##vis", &visible); + ImGui::NextColumn(); + ImGui::PopID(); } } diff --git a/src/snode.h b/src/snode.h index 94ccb6a..6fa52ba 100644 --- a/src/snode.h +++ b/src/snode.h @@ -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);