From c23b0484235065359c96158642d173182c68c3a9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20=C5=A0toura=C4=8D?= <525032@mail.muni.cz> Date: Fri, 17 May 2024 14:01:13 +0200 Subject: [PATCH] add debug camera axes --- src/edit/include/edit/scene.hpp | 5 +++ src/edit/src/scene.cpp | 71 ++++++++++++++++++++++++++++++++- src/gfx/include/gfx/shapes.hpp | 8 ++++ 3 files changed, 83 insertions(+), 1 deletion(-) diff --git a/src/edit/include/edit/scene.hpp b/src/edit/include/edit/scene.hpp index 93e33ef..3ad8084 100644 --- a/src/edit/include/edit/scene.hpp +++ b/src/edit/include/edit/scene.hpp @@ -39,6 +39,8 @@ private: bool camera_axes_enabled = false; node_ptr camera_axes; + node_ptr camera_axes_debug; + node_ptr grid; std::vector<light_ptr> lights; @@ -123,6 +125,7 @@ public: void addRotationAxis(glm::vec3 axis_direction, node_ptr selected_node); void addObjectAxes(node_ptr node); void createCameraAxes(); + void createCameraAxesDebug(); bool containsMesh(node_ptr node, mesh_ptr mesh); void findLights(const std::vector<node_ptr> &nodes); @@ -139,7 +142,9 @@ public: void manageSecondaryHighlights(std::vector<std::pair<glm::vec3, node_ptr>> hit_node_pairs); void manageCameraAxes(bool enabled); + void manageCameraAxesDebug(bool enabled); void updateCameraAxesPosition(); + void updateCameraAxesDebugPosition(); void toggleVisibility(node_ptr node, bool visible); }; diff --git a/src/edit/src/scene.cpp b/src/edit/src/scene.cpp index 896a826..f661dbf 100644 --- a/src/edit/src/scene.cpp +++ b/src/edit/src/scene.cpp @@ -423,14 +423,44 @@ void Scene::createCameraAxes() rofi_y_axis->setDrawMode(GL_LINES); rofi_z_axis->setDrawMode(GL_LINES); + // ordered due to disabled depth test + camera_axes->addObject(rofi_z_axis); camera_axes->addObject(rofi_x_axis); camera_axes->addObject(rofi_y_axis); - camera_axes->addObject(rofi_z_axis); ASSUMPTION(!active_cameras.empty()); active_cameras.front().lock()->getNode()->addChild(camera_axes); } +void Scene::createCameraAxesDebug() +{ + camera_axes_debug = Node::create(); + + mesh_ptr debug_x_axis = std::make_shared<Mesh>(shapes::debug_axis_x_vertices, std::vector<float>{}, shapes::debug_axis_indices); + mesh_ptr debug_y_axis = std::make_shared<Mesh>(shapes::debug_axis_y_vertices, std::vector<float>{}, shapes::debug_axis_indices); + mesh_ptr debug_z_axis = std::make_shared<Mesh>(shapes::debug_axis_z_vertices, std::vector<float>{}, shapes::debug_axis_indices); + + debug_x_axis->setMaterial(Material(color::red)); + debug_y_axis->setMaterial(Material(color::green)); + debug_z_axis->setMaterial(Material(color::blue)); + + debug_x_axis->setShaderType("interface"); + debug_y_axis->setShaderType("interface"); + debug_z_axis->setShaderType("interface"); + + debug_x_axis->setDrawMode(GL_LINES); + debug_y_axis->setDrawMode(GL_LINES); + debug_z_axis->setDrawMode(GL_LINES); + + // ordered due to disabled depth test + camera_axes_debug->addObject(debug_y_axis); + camera_axes_debug->addObject(debug_z_axis); + camera_axes_debug->addObject(debug_x_axis); + + ASSUMPTION(!active_cameras.empty()); + active_cameras.front().lock()->getNode()->addChild(camera_axes_debug); +} + bool Scene::containsMesh(node_ptr node, mesh_ptr mesh) { auto node_mesh = getNodeMesh(node); @@ -601,6 +631,24 @@ void Scene::manageCameraAxes(bool enabled) addNode(camera_axes); } camera_axes_enabled = enabled; + + // TO DO: remove + manageCameraAxesDebug(enabled); +} + +void Scene::manageCameraAxesDebug(bool enabled) +{ + if (!enabled) + { + removeNode(camera_axes_debug); + } + else + { + if (!camera_axes_debug) + createCameraAxesDebug(); + + addNode(camera_axes_debug); + } } void Scene::updateCameraAxesPosition() @@ -619,6 +667,27 @@ void Scene::updateCameraAxesPosition() const auto camera_rotation = active_cameras.front().lock()->getNode()->getRotationMatWorld(); camera_axes->setRotationQuat(glm::inverse(camera_rotation)); + + // TO DO: remove + updateCameraAxesDebugPosition(); +} + +void Scene::updateCameraAxesDebugPosition() +{ + if (!camera_axes_enabled) + return; + + ASSUMPTION(!active_cameras.empty()); + + const auto active_cam = active_cameras.front().lock(); + const auto window_size = active_cam->getWindowSize(); + const auto ratio = window_size.x / window_size.y; + const auto screen_offset = 0.06f; + const auto x_compensation = -0.01f; + camera_axes_debug->setPosVec(glm::vec3(screen_offset * ratio + (x_compensation * ratio), screen_offset, -0.15f)); + + const auto camera_rotation = active_cameras.front().lock()->getNode()->getRotationMatWorld(); + camera_axes_debug->setRotationQuat(glm::inverse(camera_rotation)); } void Scene::toggleVisibility(node_ptr node, bool visible) diff --git a/src/gfx/include/gfx/shapes.hpp b/src/gfx/include/gfx/shapes.hpp index 8efc49b..ec912b5 100644 --- a/src/gfx/include/gfx/shapes.hpp +++ b/src/gfx/include/gfx/shapes.hpp @@ -138,6 +138,14 @@ static std::vector<float> rofi_axis_z_vertices = { 0.0f, 0.0f, 0.0f, static std::vector<float> rofi_axis_x_vertices = { 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.01f, }; static std::vector<unsigned int> rofi_axis_indices = { 0, 1, 2 }; + +static std::vector<float> debug_axis_x_vertices = { 0.0f, 0.0f, 0.0f, + 0.01f, 0.0f, 0.0f, }; +static std::vector<float> debug_axis_y_vertices = { 0.0f, 0.0f, 0.0f, + 0.0f, 0.01f, 0.0f, }; +static std::vector<float> debug_axis_z_vertices = { 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.01f, }; +static std::vector<unsigned int> debug_axis_indices = { 0, 1, 2 }; } #endif \ No newline at end of file -- GitLab