image_viewer.cpp 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. #include "image_viewer.h"
  2. #include "image_process_v5/osg_helper.h"
  3. #include "core/imgui_utility.hpp"
  4. #include <osgViewer/Viewer>
  5. #include <utility>
  6. #define image_viewer image_viewer_v2
  7. struct image_viewer::impl {
  8. create_config conf;
  9. osg::ref_ptr<osg::Geode> geode;
  10. osg::ref_ptr<osgViewer::Viewer> viewer;
  11. struct item_info_type : create_config::item_info {
  12. osg::ref_ptr<ImageGeomSP> img_osg;
  13. bool visible = true;
  14. };
  15. using item_list_type = std::vector<item_info_type>;
  16. item_list_type items;
  17. item_info_type *current_item = nullptr;
  18. explicit impl(create_config _conf)
  19. : conf(std::move(_conf)) {
  20. geode = new osg::Geode;
  21. viewer = new osgViewer::Viewer();
  22. viewer->setSceneData(geode);
  23. viewer->setUpViewerAsEmbeddedInWindow(0, 0, 800, 600);
  24. const auto camera = viewer->getCamera();
  25. camera->setViewMatrix(osg::Matrix::identity());
  26. camera->setProjectionMatrix(osg::Matrix::identity());
  27. camera->setClearColor({0, 0, 0, 0});
  28. std::ranges::transform(
  29. conf.items, std::back_inserter(items),
  30. [this](const create_config::item_info &item) {
  31. auto ret = item_info_type();
  32. *(create_config::item_info *) &ret = item;
  33. ret.img_osg = new ImageGeomSP();
  34. return ret;
  35. });
  36. // display first item by default
  37. assert(!items.empty());
  38. geode->addDrawable(items[0].img_osg);
  39. current_item = &items[0];
  40. }
  41. void render() const {
  42. const auto vp = query_viewport_size();
  43. for (auto &item: items) {
  44. if (!item.visible) continue;
  45. try {
  46. auto img = OBJ_QUERY(sp_image, item.name);
  47. item.img_osg->setImageSP(img);
  48. item.img_osg->setViewportRange(vp.aspectRatio(), item.flip);
  49. item.img_osg->setNodeMask(-1); // enable
  50. } catch (...) {
  51. item.img_osg->setNodeMask(0); // disable
  52. }
  53. }
  54. viewer->getCamera()->setViewport(0, 0, vp.width, vp.height);
  55. viewer->frame();
  56. }
  57. void show_ui() {
  58. for (auto &item: items) {
  59. if (ImGui::RadioButton(item.display_name.c_str(),
  60. &item == current_item)) {
  61. geode->removeDrawable(current_item->img_osg);
  62. geode->addDrawable(item.img_osg);
  63. current_item = &item;
  64. }
  65. if (&item != &*items.rbegin()) {
  66. ImGui::SameLine();
  67. }
  68. }
  69. }
  70. };
  71. image_viewer::image_viewer(const create_config &conf)
  72. : pimpl(std::make_unique<impl>(conf)) {
  73. }
  74. image_viewer::~image_viewer() = default;
  75. void image_viewer::show_ui() const {
  76. pimpl->show_ui();
  77. }
  78. void image_viewer_v2::render() const {
  79. pimpl->render();
  80. }