From afbab7711d77aa4c273c51aab0958f0d416c4b73 Mon Sep 17 00:00:00 2001 From: Lendemor Date: Mon, 4 Jun 2018 21:04:34 +0200 Subject: [PATCH] added window containing basic node info (accessible from window or picker) --- src/editor.cpp | 7 +++++ src/engine.cpp | 32 +++++++++++++++++++++ src/keymapper.cpp | 2 ++ src/scene/playercharacternode.cpp | 1 + src/scene/scenenode.cpp | 35 ++++++++++++++++++++++- src/scene/scenenode.h | 5 ++++ src/scene/scenetree.cpp | 1 + src/sparrowshell/sparrowshell.cpp | 1 + src/test/main.cpp | 2 ++ src/tools/scenepicker.cpp | 46 +++++++++++++++++-------------- src/tools/scenepicker.h | 2 +- 11 files changed, 112 insertions(+), 22 deletions(-) diff --git a/src/editor.cpp b/src/editor.cpp index ebafbb0..a2c5336 100644 --- a/src/editor.cpp +++ b/src/editor.cpp @@ -26,6 +26,7 @@ Editor::Editor() : m_materialEditorEnabled(false), m_editorEnabled(false) { + setID("editor"); m_objectEditor = new ObjectEditor(); addChild(m_pickerNode); m_pickerNode->setEnabled(false); @@ -79,6 +80,12 @@ void Editor::gui() ImGui::EndMenu(); } + if(ImGui::BeginMenu("Scene")) + { + if(ImGui::MenuItem("Show Root Info")) + getEngine().getScene()->getRootObject()->openInfoWindow(); + ImGui::EndMenu(); + } ImGui::EndMainMenuBar(); } } diff --git a/src/engine.cpp b/src/engine.cpp index d4885d7..783adbf 100644 --- a/src/engine.cpp +++ b/src/engine.cpp @@ -118,6 +118,38 @@ void Engine::update() ImGui::ProgressBar(m_loadingThread->getTotalProgress()); ImGui::End(); } + + /* Example overlay from demo + + // Demonstrate creating a simple static window with no decoration + a context-menu to choose which corner of the screen to use. +static void ShowExampleAppFixedOverlay(bool* p_open) +{ + const float DISTANCE = 10.0f; + static int corner = 0; + ImVec2 window_pos = ImVec2((corner & 1) ? ImGui::GetIO().DisplaySize.x - DISTANCE : DISTANCE, (corner & 2) ? ImGui::GetIO().DisplaySize.y - DISTANCE : DISTANCE); + ImVec2 window_pos_pivot = ImVec2((corner & 1) ? 1.0f : 0.0f, (corner & 2) ? 1.0f : 0.0f); + ImGui::SetNextWindowPos(window_pos, ImGuiCond_Always, window_pos_pivot); + ImGui::PushStyleColor(ImGuiCol_WindowBg, ImVec4(0.0f, 0.0f, 0.0f, 0.3f)); // Transparent background + if (ImGui::Begin("Example: Fixed Overlay", p_open, ImGuiWindowFlags_NoTitleBar|ImGuiWindowFlags_NoResize|ImGuiWindowFlags_AlwaysAutoResize|ImGuiWindowFlags_NoMove|ImGuiWindowFlags_NoSavedSettings)) + { + ImGui::Text("Simple overlay\nin the corner of the screen.\n(right-click to change position)"); + ImGui::Separator(); + ImGui::Text("Mouse Position: (%.1f,%.1f)", ImGui::GetIO().MousePos.x, ImGui::GetIO().MousePos.y); + if (ImGui::BeginPopupContextWindow()) + { + if (ImGui::MenuItem("Top-left", NULL, corner == 0)) corner = 0; + if (ImGui::MenuItem("Top-right", NULL, corner == 1)) corner = 1; + if (ImGui::MenuItem("Bottom-left", NULL, corner == 2)) corner = 2; + if (ImGui::MenuItem("Bottom-right", NULL, corner == 3)) corner = 3; + if (p_open && ImGui::MenuItem("Close")) *p_open = false; + ImGui::EndPopup(); + } + ImGui::End(); + } + ImGui::PopStyleColor(); +} + * + * */ } // update Physics diff --git a/src/keymapper.cpp b/src/keymapper.cpp index 2c56149..7cceb24 100644 --- a/src/keymapper.cpp +++ b/src/keymapper.cpp @@ -103,6 +103,8 @@ KeyMapper::KeyMapper() : void KeyMapper::update() { + SceneNode::update(); + if(m_enabled) gui(); } diff --git a/src/scene/playercharacternode.cpp b/src/scene/playercharacternode.cpp index dca91cf..19f3b4f 100644 --- a/src/scene/playercharacternode.cpp +++ b/src/scene/playercharacternode.cpp @@ -75,6 +75,7 @@ PlayerCharacterNode::PlayerCharacterNode(bool noClip) : // m_playerLightNode = new LightNode(m_playerLight); // m_playerLightNode->setParent(this); + setID("player"); // Create the shape btCollisionShape *shape = new btCapsuleShape(TORSO_RADIUS, TORSO_HEIGHT); diff --git a/src/scene/scenenode.cpp b/src/scene/scenenode.cpp index de3c1ad..460c985 100644 --- a/src/scene/scenenode.cpp +++ b/src/scene/scenenode.cpp @@ -35,7 +35,8 @@ SceneNode::SceneNode(std::string node_id,Script* script) : m_transform(glm::mat4()), m_script(script), m_rigidBody(nullptr), - m_motionState(this) + m_motionState(this), + m_showInfo(false) { if(m_script != nullptr) m_script->begin(this); @@ -131,6 +132,7 @@ void SceneNode::update() child->update(); } } + gui(); } void SceneNode::setSceneTree(SceneTree *tree) @@ -294,3 +296,34 @@ SceneNode* SceneNode::clone() node->addChild(child->clone()); return node; } + +void SceneNode::openInfoWindow() +{ + m_showInfo = true; +} + +void SceneNode::gui() +{ + if(m_showInfo & m_id != "undefined id") + { + bool enabled = true; + std::string window_name("Node info##"+m_id); + ImGui::Begin(window_name.data(),&enabled); + ImGui::Text("Id: %s",m_id.data()); + if(m_parent != nullptr) + { + ImGui::Text("Parent Id: %s",m_parent->getID().data()); + if(ImGui::Button("Show Parent Info")) + m_parent->openInfoWindow(); + } + for(SceneNode* child : m_children){ + if(ImGui::Button(child->getID().data())) + child->openInfoWindow(); + } + + ImGui::End(); + if(!enabled) + m_showInfo = false; + } +} + diff --git a/src/scene/scenenode.h b/src/scene/scenenode.h index c703cfb..52e3311 100644 --- a/src/scene/scenenode.h +++ b/src/scene/scenenode.h @@ -83,6 +83,8 @@ private: void setParent(SceneNode* parent); void updateLightSource(); + bool m_showInfo; + public: // constructor/destructor SceneNode(std::string node_id = "undefined id",Script *script = nullptr); @@ -172,6 +174,9 @@ public: archive(m_transform); } + void openInfoWindow(); + void gui(); + // global engine methods Engine& getEngine(); }; diff --git a/src/scene/scenetree.cpp b/src/scene/scenetree.cpp index 41c9359..c5ab3a0 100644 --- a/src/scene/scenetree.cpp +++ b/src/scene/scenetree.cpp @@ -17,6 +17,7 @@ SceneTree::SceneTree(Engine &engine) : m_shaderRefreshRequired(false), m_camera(nullptr) { + m_root.setID("root"); DeferredPipeline *pipeline = new DeferredPipeline(); m_pipeline = pipeline; pipeline->setRenderTarget(FrameBuffer::screen); diff --git a/src/sparrowshell/sparrowshell.cpp b/src/sparrowshell/sparrowshell.cpp index bd9ef1d..8cab5d1 100644 --- a/src/sparrowshell/sparrowshell.cpp +++ b/src/sparrowshell/sparrowshell.cpp @@ -29,6 +29,7 @@ SparrowShell::SparrowShell(sf::Window* window): m_animationProgress(0.f), m_isMoving(false) { + setID("sparrowshell"); sf::Vector2u size = window->getSize(); m_dimension = glm::ivec2(size.x,DEFAULT_FONT_SIZE*(BUFFER_DISPLAYED_LINES+1)); m_buffer->setFontSize(DEFAULT_FONT_SIZE); diff --git a/src/test/main.cpp b/src/test/main.cpp index e5dd78c..57d5f18 100644 --- a/src/test/main.cpp +++ b/src/test/main.cpp @@ -296,6 +296,8 @@ public: SceneNode* tree = Loader::loadMesh("Tree01.obj"); for(int i=0; i<8; ++i) { + std::string id = "tree#"+ std::to_string(i); + tree->setID(id); tree->moveTo(glm::vec3(-(10 + rand()%20), 0, rand()%40 - 5)); sandbox->addChild(tree->clone()); } diff --git a/src/tools/scenepicker.cpp b/src/tools/scenepicker.cpp index 166f73a..5dd26d9 100644 --- a/src/tools/scenepicker.cpp +++ b/src/tools/scenepicker.cpp @@ -34,6 +34,7 @@ Mesh* ScenePicker::generateMesh() ScenePicker::ScenePicker() : m_pickSucceeded(false) { + setID("picker"); setMesh(generateMesh()); } @@ -43,6 +44,30 @@ ScenePicker::~ScenePicker() delete getMesh(); } +void ScenePicker::gui(){ + bool isEnabled = true; + ImGui::Begin("Picker", &isEnabled); + if(m_pickSucceeded) + { + ImGui::Text("Intersection : ( %.3f, %.3f, %.3f )", m_pickedPos.x, m_pickedPos.y, m_pickedPos.z); + if(!isVisible()) setVisible(m_pickSucceeded); + ImGui::Text("Node : %s",m_pickedNode->getID().data()); + if(ImGui::Button("Show Node Info")) + m_pickedNode->openInfoWindow(); + } + else + { + ImGui::Text("No intersection"); + if(isVisible()) setVisible(m_pickSucceeded); + } + // if(ImGui::Button("Teleport")) + //move player to target coordinate + ImGui::End(); + + if(!isEnabled) + getEngine().getEditor()->togglePicker(); +} + void ScenePicker::update() { SceneNode::update(); @@ -50,26 +75,7 @@ void ScenePicker::update() if(isEnabled()) { pick(); - - bool isEnabled = true; - ImGui::Begin("Picker", &isEnabled); - if(m_pickSucceeded) - { - ImGui::Text("Intersection : ( %.3f, %.3f, %.3f )", m_pickedPos.x, m_pickedPos.y, m_pickedPos.z); - if(!isVisible()) setVisible(m_pickSucceeded); - ImGui::Text("Node : %s",m_pickedNode->getID().data()); - } - else - { - ImGui::Text("No intersection"); - if(isVisible()) setVisible(m_pickSucceeded); - } - // if(ImGui::Button("Teleport")) - //move player to target coordinate - ImGui::End(); - - if(!isEnabled) - getEngine().getEditor()->togglePicker(); + gui(); } } diff --git a/src/tools/scenepicker.h b/src/tools/scenepicker.h index b4dc83c..d997e8e 100644 --- a/src/tools/scenepicker.h +++ b/src/tools/scenepicker.h @@ -21,7 +21,7 @@ public: virtual void update(); void pick(); - + void gui(); glm::vec3 getIntersection() { return m_pickedPos; } bool getTraceSucceeded() { m_pickSucceeded; }