#include "image_viewer.h" #include "image_process_v5/osg_helper.h" #include "core/imgui_utility.hpp" #include #include #define image_viewer image_viewer_v2 struct image_viewer::impl { create_config conf; osg::ref_ptr geode; osg::ref_ptr viewer; struct item_info_type : create_config::item_info { osg::ref_ptr img_osg; bool visible = true; }; using item_list_type = std::vector; item_list_type items; item_info_type *current_item = nullptr; explicit impl(create_config _conf) : conf(std::move(_conf)) { geode = new osg::Geode; viewer = new osgViewer::Viewer(); viewer->setSceneData(geode); viewer->setUpViewerAsEmbeddedInWindow(0, 0, 800, 600); const auto camera = viewer->getCamera(); camera->setViewMatrix(osg::Matrix::identity()); camera->setProjectionMatrix(osg::Matrix::identity()); camera->setClearColor({0, 0, 0, 0}); std::ranges::transform( conf.items, std::back_inserter(items), [this](const create_config::item_info &item) { auto ret = item_info_type(); *(create_config::item_info *) &ret = item; ret.img_osg = new ImageGeomSP(); return ret; }); // display first item by default assert(!items.empty()); geode->addDrawable(items[0].img_osg); current_item = &items[0]; } void render() const { const auto vp = query_viewport_size(); for (auto &item: items) { if (!item.visible) continue; try { auto img = OBJ_QUERY(sp_image, item.name); item.img_osg->setImageSP(img); item.img_osg->setViewportRange(vp.aspectRatio(), item.flip); item.img_osg->setNodeMask(-1); // enable } catch (...) { item.img_osg->setNodeMask(0); // disable } } viewer->getCamera()->setViewport(0, 0, vp.width, vp.height); viewer->frame(); } void show_ui() { for (auto &item: items) { if (ImGui::RadioButton(item.display_name.c_str(), &item == current_item)) { geode->removeDrawable(current_item->img_osg); geode->addDrawable(item.img_osg); current_item = &item; } if (&item != &*items.rbegin()) { ImGui::SameLine(); } } } }; image_viewer::image_viewer(const create_config &conf) : pimpl(std::make_unique(conf)) { } image_viewer::~image_viewer() = default; void image_viewer::show_ui() const { pimpl->show_ui(); } void image_viewer_v2::render() const { pimpl->render(); }