Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,10 @@ pybind11_add_module(polyscope_bindings
src/cpp/implicit_helpers.cpp
src/cpp/managed_buffer.cpp
src/cpp/imgui.cpp
src/cpp/implot.cpp

src/cpp/utils.h
src/cpp/imgui_utils.h
)
set_target_properties(polyscope_bindings PROPERTIES CXX_VISIBILITY_PRESET "default")

Expand Down
2 changes: 2 additions & 0 deletions src/cpp/core.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@ void bind_floating_quantities(py::module& m);
void bind_implicit_helpers(py::module& m);
void bind_managed_buffer(py::module& m);
void bind_imgui(py::module& m);
void bind_implot(py::module& m);

// Signal handler (makes ctrl-c work, etc)
void checkSignals() {
Expand Down Expand Up @@ -607,6 +608,7 @@ PYBIND11_MODULE(polyscope_bindings, m) {
bind_camera_view(m);
bind_managed_buffer(m);
bind_imgui(m);
bind_implot(m);

}

Expand Down
50 changes: 18 additions & 32 deletions src/cpp/imgui.cpp
Original file line number Diff line number Diff line change
@@ -1,38 +1,36 @@
#include "imgui.h"
#include "implot.h"

#include <pybind11/functional.h>
#include <pybind11/numpy.h>
#include <pybind11/pybind11.h>
#include <pybind11/stl.h>

namespace py = pybind11;
#include "Eigen/Dense"

// Type translations between Python and ImGui. Prefer native Python types (tuples, arrays), translating into ImGui
// equivalents.
using Vec2T = std::tuple<float, float>;
using Vec4T = std::tuple<float, float, float, float>;
#include "utils.h"
#include "imgui_utils.h"

ImVec2 to_vec2(const Vec2T& v) { return ImVec2(std::get<0>(v), std::get<1>(v)); }
ImVec4 to_vec4(const Vec4T& v) { return ImVec4(std::get<0>(v), std::get<1>(v), std::get<2>(v), std::get<3>(v)); }

Vec2T from_vec2(const ImVec2& v) { return std::make_tuple(v.x, v.y); }
Vec4T from_vec4(const ImVec4& v) { return std::make_tuple(v.x, v.y, v.z, v.w); }
void bind_imgui_structs(py::module& m);
void bind_imgui_methods(py::module& m);
void bind_imgui_enums(py::module& m);

void bind_imgui(py::module& m) {
auto imgui_module = m.def_submodule("imgui", "ImGui bindings");
bind_imgui_structs(imgui_module);
bind_imgui_methods(imgui_module);
bind_imgui_enums(imgui_module);
}

// clang-format off

struct InputTextCallback_UserData {
std::string* str;
ImGuiInputTextCallback chain_callback;
void* chain_callback_user_data;
};

std::vector<const char*> convert_string_items(const std::vector<std::string>& items) {
auto _items = std::vector<const char*>();
_items.reserve(items.size());
for (const auto& item : items) {
_items.push_back(item.data());
}
return _items;
}

static int input_text_callback(ImGuiInputTextCallbackData* data) {
auto* user_data = reinterpret_cast<InputTextCallback_UserData*>(data->UserData);
if (data->EventFlag == ImGuiInputTextFlags_CallbackResize) {
Expand All @@ -52,20 +50,6 @@ static int input_text_callback(ImGuiInputTextCallbackData* data) {
}


void bind_imgui_structs(py::module& m);
void bind_imgui_methods(py::module& m);
void bind_imgui_enums(py::module& m);

void bind_imgui(py::module& m) {
auto imgui_module = m.def_submodule("imgui", "ImGui bindings");
bind_imgui_structs(imgui_module);
bind_imgui_methods(imgui_module);
bind_imgui_enums(imgui_module);
}

// clang-format off


// clang-format off
void bind_imgui_structs(py::module& m) {

Expand Down Expand Up @@ -2322,3 +2306,5 @@ void bind_imgui_enums(py::module& m) {
m.attr("ImGuiCond_FirstUseEver") = static_cast<int>(ImGuiCond_FirstUseEver);
m.attr("ImGuiCond_Appearing") = static_cast<int>(ImGuiCond_Appearing);
}


25 changes: 25 additions & 0 deletions src/cpp/imgui_utils.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
#pragma once

namespace py = pybind11;
namespace ps = polyscope;

// Type translations between Python and ImGui. Prefer native Python types (tuples, arrays), translating into ImGui
// equivalents.
using Vec2T = std::tuple<float, float>;
using Vec4T = std::tuple<float, float, float, float>;

inline ImVec2 to_vec2(const Vec2T& v) { return ImVec2(std::get<0>(v), std::get<1>(v)); }
inline ImVec4 to_vec4(const Vec4T& v) { return ImVec4(std::get<0>(v), std::get<1>(v), std::get<2>(v), std::get<3>(v)); }

inline Vec2T from_vec2(const ImVec2& v) { return std::make_tuple(v.x, v.y); }
inline Vec4T from_vec4(const ImVec4& v) { return std::make_tuple(v.x, v.y, v.z, v.w); }


inline std::vector<const char*> convert_string_items(const std::vector<std::string>& items) {
auto _items = std::vector<const char*>();
_items.reserve(items.size());
for (const auto& item : items) {
_items.push_back(item.data());
}
return _items;
}
Loading
Loading