4 changed files with 230 additions and 41 deletions
			
			
		@ -0,0 +1,135 @@ | 
				
			|||||
 | 
					//
 | 
				
			||||
 | 
					// Created by cflin on 4/8/23.
 | 
				
			||||
 | 
					//
 | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					#ifndef RIGIDIPC_COLORBARPLUGIN_H | 
				
			||||
 | 
					#define RIGIDIPC_COLORBARPLUGIN_H | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					#include <Eigen/Dense> | 
				
			||||
 | 
					#include <igl/opengl/glfw/Viewer.h> | 
				
			||||
 | 
					#include <igl/opengl/glfw/imgui/ImGuiMenu.h> | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					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<igl::ColorMapType>(i),f,0.0,1.0,rgb); | 
				
			||||
 | 
					//            std::cout<<std::endl;
 | 
				
			||||
 | 
					//            std::cout<<rgb<<std::endl;
 | 
				
			||||
 | 
					            texture_from_colormap(rgb, id); | 
				
			||||
 | 
					            colormaps_[i] = id; | 
				
			||||
 | 
					        } | 
				
			||||
 | 
					    } | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					// Draws a combo box for selecting the colormap
 | 
				
			||||
 | 
					    int draw_colormap_combo() const { | 
				
			||||
 | 
					        const char *items[]{ | 
				
			||||
 | 
					                "Inferno", | 
				
			||||
 | 
					                "Jet", | 
				
			||||
 | 
					                "Magma", | 
				
			||||
 | 
					                "Parula", | 
				
			||||
 | 
					                "Plasma", | 
				
			||||
 | 
					                "Viridis", | 
				
			||||
 | 
					        }; | 
				
			||||
 | 
					        static int selected_index = 5; | 
				
			||||
 | 
					        static const char *current_item = items[selected_index]; | 
				
			||||
 | 
					        ImVec2 combo_pos = ImGui::GetCursorScreenPos(); | 
				
			||||
 | 
					        if (ImGui::BeginCombo("Colormap##combo", "")) { | 
				
			||||
 | 
					            for (int n = 0; n < IM_ARRAYSIZE(items); ++n) { | 
				
			||||
 | 
					                // You can store your selection however you want, outside or inside your objects
 | 
				
			||||
 | 
					                bool is_selected = (current_item == items[n]); | 
				
			||||
 | 
					                ImGui::PushID(n); | 
				
			||||
 | 
					                if (ImGui::Selectable("", is_selected)) { | 
				
			||||
 | 
					                    current_item = items[n]; | 
				
			||||
 | 
					                    selected_index = n; | 
				
			||||
 | 
					                } | 
				
			||||
 | 
					                ImGui::SameLine(0, 0); | 
				
			||||
 | 
					                ImGui::Image( | 
				
			||||
 | 
					                        reinterpret_cast<ImTextureID>(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<ImTextureID>(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<ImTextureID>(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<unsigned char, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor> cmap; | 
				
			||||
 | 
					        if (rgb.maxCoeff() > 1.0) { | 
				
			||||
 | 
					            cmap = rgb.cast<unsigned char>(); | 
				
			||||
 | 
					        } else { | 
				
			||||
 | 
					            cmap = (rgb.array() * 255.f).cast<unsigned char>(); | 
				
			||||
 | 
					        } | 
				
			||||
 | 
					        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<GLuint, igl::NUM_COLOR_MAP_TYPES> colormaps_; | 
				
			||||
 | 
					    igl::ColorMapType colormap_type_ = igl::COLOR_MAP_TYPE_VIRIDIS; | 
				
			||||
 | 
					}; | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					#endif //RIGIDIPC_COLORBARPLUGIN_H
 | 
				
			||||
					Loading…
					
					
				
		Reference in new issue