You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
106 lines
3.1 KiB
106 lines
3.1 KiB
1 year ago
|
#include <igl/readOFF.h>
|
||
|
#include <igl/opengl/glfw/Viewer.h>
|
||
|
#include <igl/opengl/glfw/imgui/ImGuiPlugin.h>
|
||
|
#include <igl/opengl/glfw/imgui/ImGuiMenu.h>
|
||
|
#include <igl/opengl/glfw/imgui/ImGuiHelpers.h>
|
||
|
#include <iostream>
|
||
|
|
||
|
int main(int argc, char *argv[])
|
||
|
{
|
||
|
Eigen::MatrixXd V;
|
||
|
Eigen::MatrixXi F;
|
||
|
|
||
|
// Load a mesh in OFF format
|
||
|
igl::readOFF(TUTORIAL_SHARED_PATH "/bunny.off", V, F);
|
||
|
|
||
|
// Init the viewer
|
||
|
igl::opengl::glfw::Viewer viewer;
|
||
|
|
||
|
// Attach a menu plugin
|
||
|
igl::opengl::glfw::imgui::ImGuiPlugin plugin;
|
||
|
viewer.plugins.push_back(&plugin);
|
||
|
igl::opengl::glfw::imgui::ImGuiMenu menu;
|
||
|
plugin.widgets.push_back(&menu);
|
||
|
|
||
|
// Customize the menu
|
||
|
double doubleVariable = 0.1f; // Shared between two menus
|
||
|
|
||
|
// Add content to the default menu window
|
||
|
menu.callback_draw_viewer_menu = [&]()
|
||
|
{
|
||
|
// Draw parent menu content
|
||
|
menu.draw_viewer_menu();
|
||
|
|
||
|
// Add new group
|
||
|
if (ImGui::CollapsingHeader("New Group", ImGuiTreeNodeFlags_DefaultOpen))
|
||
|
{
|
||
|
// Expose variable directly ...
|
||
|
ImGui::InputDouble("double", &doubleVariable, 0, 0, "%.4f");
|
||
|
|
||
|
// ... or using a custom callback
|
||
|
static bool boolVariable = true;
|
||
|
if (ImGui::Checkbox("bool", &boolVariable))
|
||
|
{
|
||
|
// do something
|
||
|
std::cout << "boolVariable: " << std::boolalpha << boolVariable << std::endl;
|
||
|
}
|
||
|
|
||
|
// Expose an enumeration type
|
||
|
enum Orientation { Up=0, Down, Left, Right };
|
||
|
static Orientation dir = Up;
|
||
|
ImGui::Combo("Direction", (int *)(&dir), "Up\0Down\0Left\0Right\0\0");
|
||
|
|
||
|
// We can also use a std::vector<std::string> defined dynamically
|
||
|
static int num_choices = 3;
|
||
|
static std::vector<std::string> choices;
|
||
|
static int idx_choice = 0;
|
||
|
if (ImGui::InputInt("Num letters", &num_choices))
|
||
|
{
|
||
|
num_choices = std::max(1, std::min(26, num_choices));
|
||
|
}
|
||
|
if (num_choices != (int) choices.size())
|
||
|
{
|
||
|
choices.resize(num_choices);
|
||
|
for (int i = 0; i < num_choices; ++i)
|
||
|
choices[i] = std::string(1, 'A' + i);
|
||
|
if (idx_choice >= num_choices)
|
||
|
idx_choice = num_choices - 1;
|
||
|
}
|
||
|
ImGui::Combo("Letter", &idx_choice, choices);
|
||
|
|
||
|
// Add a button
|
||
|
if (ImGui::Button("Print Hello", ImVec2(-1,0)))
|
||
|
{
|
||
|
std::cout << "Hello\n";
|
||
|
}
|
||
|
}
|
||
|
};
|
||
|
|
||
|
// Draw additional windows
|
||
|
menu.callback_draw_custom_window = [&]()
|
||
|
{
|
||
|
// Define next window position + size
|
||
|
ImGui::SetNextWindowPos(ImVec2(180.f * menu.menu_scaling(), 10), ImGuiCond_FirstUseEver);
|
||
|
ImGui::SetNextWindowSize(ImVec2(200, 160), ImGuiCond_FirstUseEver);
|
||
|
ImGui::Begin(
|
||
|
"New Window", nullptr,
|
||
|
ImGuiWindowFlags_NoSavedSettings
|
||
|
);
|
||
|
|
||
|
// Expose the same variable directly ...
|
||
|
ImGui::PushItemWidth(-80);
|
||
|
ImGui::DragScalar("double", ImGuiDataType_Double, &doubleVariable, 0.1, 0, 0, "%.4f");
|
||
|
ImGui::PopItemWidth();
|
||
|
|
||
|
static std::string str = "bunny";
|
||
|
ImGui::InputText("Name", str);
|
||
|
|
||
|
ImGui::End();
|
||
|
};
|
||
|
|
||
|
// Plot the mesh
|
||
|
viewer.data().set_mesh(V, F);
|
||
|
viewer.data().add_label(viewer.data().V.row(0) + viewer.data().V_normals.row(0).normalized()*0.005, "Hello World!");
|
||
|
viewer.launch();
|
||
|
}
|