| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596 |
- #include "image_viewer.h"
- #include "image_process_v5/osg_helper.h"
- #include "core/imgui_utility.hpp"
- #include <osgViewer/Viewer>
- #include <utility>
- #define image_viewer image_viewer_v2
- struct image_viewer::impl {
- create_config conf;
- osg::ref_ptr<osg::Geode> geode;
- osg::ref_ptr<osgViewer::Viewer> viewer;
- struct item_info_type : create_config::item_info {
- osg::ref_ptr<ImageGeomSP> img_osg;
- bool visible = true;
- };
- using item_list_type = std::vector<item_info_type>;
- 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<impl>(conf)) {
- }
- image_viewer::~image_viewer() = default;
- void image_viewer::show_ui() const {
- pimpl->show_ui();
- }
- void image_viewer_v2::render() const {
- pimpl->render();
- }
|