// // Created by cflin on 4/8/23. // #ifndef RIGIDIPC_COLORBARPLUGIN_H #define RIGIDIPC_COLORBARPLUGIN_H #include #include #include class ColorbarPlugin { public: ColorbarPlugin() { // initialize Eigen::MatrixXd rgb; Eigen::MatrixXd f=Eigen::VectorXd::LinSpaced(100,0.0,1.0); for (size_t i = 0; i < igl::NUM_COLOR_MAP_TYPES; ++i) { GLuint id = 0; igl::colormap(static_cast(i),f,0.0,1.0,rgb); // std::cout<(colormaps_[n]), ImVec2(ImGui::GetTextLineHeight(), ImGui::GetTextLineHeight()), ImVec2(0, 0), ImVec2(1, 1)); ImGui::SameLine(); ImGui::Text("%s", items[n]); if (is_selected) { ImGui::SetItemDefaultFocus(); } ImGui::PopID(); } ImGui::EndCombo(); } ImVec2 backup_pos = ImGui::GetCursorScreenPos(); ImGuiStyle &style = ImGui::GetStyle(); ImGui::SetCursorScreenPos(ImVec2(combo_pos.x + style.FramePadding.x, combo_pos.y + style.FramePadding.y)); float h = ImGui::GetTextLineHeight(); ImGui::Image( reinterpret_cast(colormaps_[selected_index]), ImVec2(h, h)); ImGui::SameLine(); ImGui::Text("%s", current_item); ImGui::SetCursorScreenPos(backup_pos); return selected_index; } void draw_colorbar(igl::ColorMapType cm, float xmin, float xmax, const Eigen::Vector4f &background_color) const { ImVec4 color(0, 0, 0, 1); auto rgb = background_color; // http://stackoverflow.com/a/3943023/112731 if (rgb[0] * 0.299 + rgb[1] * 0.587 + rgb[2] * 0.114 > 186) { color = ImVec4(1, 1, 1, 1); } float w = 20; float h = 100; ImGui::BeginGroup(); ImGui::BeginGroup(); ImGui::TextColored(color, "%.3g", xmin); ImGui::Dummy(ImVec2(0, h - 2 * ImGui::GetTextLineHeightWithSpacing())); ImGui::TextColored(color, "%.3g", xmax); ImGui::EndGroup(); ImGui::SameLine(); ImGui::Image(reinterpret_cast(colormaps_[cm]), ImVec2(w, h)); ImGui::EndGroup(); } static void texture_from_colormap(const Eigen::MatrixXd &rgb, GLuint &id) { int width = 1; int height = (int) rgb.rows(); Eigen::Matrix cmap; if (rgb.maxCoeff() > 1.0) { cmap = rgb.cast(); } else { cmap = (rgb.array() * 255.f).cast(); } assert(cmap.cols() == 3); cmap.conservativeResize(cmap.rows(), 4); cmap.col(3).setConstant(255); if (id == 0) { glGenTextures(1, &id); } glBindTexture(GL_TEXTURE_2D, id); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, cmap.data()); glGenerateMipmap(GL_TEXTURE_2D); glBindTexture(GL_TEXTURE_2D, 0); } protected: std::array colormaps_; igl::ColorMapType colormap_type_ = igl::COLOR_MAP_TYPE_VIRIDIS; }; #endif //RIGIDIPC_COLORBARPLUGIN_H