py_igl_viewer.cpp 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452
  1. // This file is part of libigl, a simple c++ geometry processing library.
  2. //
  3. // Copyright (C) 2017 Sebastian Koch <s.koch@tu-berlin.de> and Daniele Panozzo <daniele.panozzo@gmail.com>
  4. //
  5. // This Source Code Form is subject to the terms of the Mozilla Public License
  6. // v. 2.0. If a copy of the MPL was not distributed with this file, You can
  7. // obtain one at http://mozilla.org/MPL/2.0/.
  8. #include <Eigen/Dense>
  9. #include <Eigen/Sparse>
  10. #include "../python_shared.h"
  11. #define ENABLE_SERIALIZATION
  12. #include <igl/viewer/Viewer.h>
  13. #include <igl/viewer/ViewerCore.h>
  14. #include <igl/viewer/ViewerData.h>
  15. #include <igl/viewer/OpenGL_state.h>
  16. #include <igl/serialize.h>
  17. #ifdef IGL_VIEWER_WITH_NANOGUI
  18. #include "../../../external/nanogui/include/nanogui/formhelper.h"
  19. #include "../../../external/nanogui/include/nanogui/screen.h"
  20. #endif
  21. void python_export_igl_viewer(py::module &m)
  22. {
  23. py::module me = m.def_submodule(
  24. "viewer", "Mesh viewer");
  25. /////////////////////// DATA
  26. py::class_<igl::viewer::ViewerData> viewerdata_class(me, "ViewerData");
  27. py::enum_<igl::viewer::ViewerData::DirtyFlags>(viewerdata_class, "DirtyFlags")
  28. .value("DIRTY_NONE", igl::viewer::ViewerData::DIRTY_NONE)
  29. .value("DIRTY_POSITION", igl::viewer::ViewerData::DIRTY_POSITION)
  30. .value("DIRTY_UV", igl::viewer::ViewerData::DIRTY_UV)
  31. .value("DIRTY_NORMAL", igl::viewer::ViewerData::DIRTY_NORMAL)
  32. .value("DIRTY_AMBIENT", igl::viewer::ViewerData::DIRTY_AMBIENT)
  33. .value("DIRTY_DIFFUSE", igl::viewer::ViewerData::DIRTY_DIFFUSE)
  34. .value("DIRTY_SPECULAR", igl::viewer::ViewerData::DIRTY_SPECULAR)
  35. .value("DIRTY_TEXTURE", igl::viewer::ViewerData::DIRTY_TEXTURE)
  36. .value("DIRTY_FACE", igl::viewer::ViewerData::DIRTY_FACE)
  37. .value("DIRTY_MESH", igl::viewer::ViewerData::DIRTY_MESH)
  38. .value("DIRTY_OVERLAY_LINES", igl::viewer::ViewerData::DIRTY_OVERLAY_LINES)
  39. .value("DIRTY_OVERLAY_POINTS", igl::viewer::ViewerData::DIRTY_OVERLAY_POINTS)
  40. .value("DIRTY_ALL", igl::viewer::ViewerData::DIRTY_ALL)
  41. .export_values();
  42. viewerdata_class
  43. .def(py::init<>())
  44. .def("set_mesh", &igl::viewer::ViewerData::set_mesh)
  45. .def("set_colors", &igl::viewer::ViewerData::set_colors)
  46. .def("clear", &igl::viewer::ViewerData::clear)
  47. .def("set_face_based", &igl::viewer::ViewerData::set_face_based)
  48. .def("set_vertices", &igl::viewer::ViewerData::set_vertices)
  49. .def("set_normals", &igl::viewer::ViewerData::set_normals)
  50. .def("set_uv",
  51. (void (igl::viewer::ViewerData::*) (const Eigen::MatrixXd &)) &igl::viewer::ViewerData::set_uv
  52. )
  53. .def("set_uv",
  54. (void (igl::viewer::ViewerData::*) (const Eigen::MatrixXd &, const Eigen::MatrixXi&)) &igl::viewer::ViewerData::set_uv
  55. )
  56. .def("set_texture",
  57. (void (igl::viewer::ViewerData::*) (
  58. const Eigen::Matrix<unsigned char,Eigen::Dynamic,Eigen::Dynamic>&,
  59. const Eigen::Matrix<unsigned char,Eigen::Dynamic,Eigen::Dynamic>&,
  60. const Eigen::Matrix<unsigned char,Eigen::Dynamic,Eigen::Dynamic>&)
  61. ) &igl::viewer::ViewerData::set_texture
  62. )
  63. .def("set_texture",
  64. (void (igl::viewer::ViewerData::*) (
  65. const Eigen::Matrix<unsigned char,Eigen::Dynamic,Eigen::Dynamic>&,
  66. const Eigen::Matrix<unsigned char,Eigen::Dynamic,Eigen::Dynamic>&,
  67. const Eigen::Matrix<unsigned char,Eigen::Dynamic,Eigen::Dynamic>&,
  68. const Eigen::Matrix<unsigned char,Eigen::Dynamic,Eigen::Dynamic>&)
  69. ) &igl::viewer::ViewerData::set_texture
  70. )
  71. .def("set_points", &igl::viewer::ViewerData::set_points)
  72. .def("add_points", &igl::viewer::ViewerData::add_points)
  73. .def("set_edges", &igl::viewer::ViewerData::set_edges)
  74. .def("add_edges", &igl::viewer::ViewerData::add_edges)
  75. .def("add_label", [] (igl::viewer::ViewerData& data, const Eigen::MatrixXd& P, const std::string& str)
  76. {
  77. assert_is_VectorX("P",P);
  78. data.add_label(P,str);
  79. })
  80. .def("compute_normals", &igl::viewer::ViewerData::compute_normals)
  81. .def("uniform_colors", [] (igl::viewer::ViewerData& data, const Eigen::MatrixXd& ambient, const Eigen::MatrixXd& diffuse, const Eigen::MatrixXd& specular)
  82. {
  83. if (ambient.cols() == 3)
  84. {
  85. assert_is_Vector3("ambient",ambient);
  86. assert_is_Vector3("diffuse",diffuse);
  87. assert_is_Vector3("specular",specular);
  88. Eigen::Vector3d vambient = ambient;
  89. Eigen::Vector3d vdiffuse = diffuse;
  90. Eigen::Vector3d vspecular = specular;
  91. data.uniform_colors(vambient,vdiffuse, vspecular);
  92. }
  93. if (ambient.cols() == 4)
  94. {
  95. assert_is_Vector4("ambient",ambient);
  96. assert_is_Vector4("diffuse",diffuse);
  97. assert_is_Vector4("specular",specular);
  98. Eigen::Vector4d vambient = ambient;
  99. Eigen::Vector4d vdiffuse = diffuse;
  100. Eigen::Vector4d vspecular = specular;
  101. data.uniform_colors(vambient,vdiffuse,vspecular);
  102. }
  103. })
  104. .def("grid_texture", &igl::viewer::ViewerData::grid_texture)
  105. .def_readwrite("V", &igl::viewer::ViewerData::V)
  106. .def_readwrite("F", &igl::viewer::ViewerData::F)
  107. .def_readwrite("F_normals", &igl::viewer::ViewerData::F_normals)
  108. .def_readwrite("F_material_ambient", &igl::viewer::ViewerData::F_material_ambient)
  109. .def_readwrite("F_material_diffuse", &igl::viewer::ViewerData::F_material_diffuse)
  110. .def_readwrite("F_material_specular", &igl::viewer::ViewerData::F_material_specular)
  111. .def_readwrite("V_normals", &igl::viewer::ViewerData::V_normals)
  112. .def_readwrite("V_material_ambient", &igl::viewer::ViewerData::V_material_ambient)
  113. .def_readwrite("V_material_diffuse", &igl::viewer::ViewerData::V_material_diffuse)
  114. .def_readwrite("V_material_specular", &igl::viewer::ViewerData::V_material_specular)
  115. .def_readwrite("V_uv", &igl::viewer::ViewerData::V_uv)
  116. .def_readwrite("F_uv", &igl::viewer::ViewerData::F_uv)
  117. .def_readwrite("texture_R", &igl::viewer::ViewerData::texture_R)
  118. .def_readwrite("texture_G", &igl::viewer::ViewerData::texture_G)
  119. .def_readwrite("texture_B", &igl::viewer::ViewerData::texture_B)
  120. .def_readwrite("lines", &igl::viewer::ViewerData::lines)
  121. .def_readwrite("points", &igl::viewer::ViewerData::points)
  122. .def_readwrite("labels_positions", &igl::viewer::ViewerData::labels_positions)
  123. .def_readwrite("labels_strings", &igl::viewer::ViewerData::labels_strings)
  124. .def_readwrite("dirty", &igl::viewer::ViewerData::dirty)
  125. .def_readwrite("face_based", &igl::viewer::ViewerData::face_based)
  126. .def("serialize", [](igl::viewer::ViewerData& data)
  127. {
  128. std::vector<char> a;
  129. igl::serialize(data,"Data",a);
  130. return a;
  131. })
  132. .def("deserialize", [](igl::viewer::ViewerData& data, const std::vector<char>& a)
  133. {
  134. igl::deserialize(data,"Data",a);
  135. return;
  136. })
  137. ;
  138. //////////////////////// OPENGL_State
  139. py::class_<igl::viewer::OpenGL_state> opengl_state_class(me, "OpenGL_state");
  140. opengl_state_class
  141. .def(py::init<>())
  142. .def("init", &igl::viewer::OpenGL_state::init)
  143. ;
  144. //////////////////////// CORE
  145. py::class_<igl::viewer::ViewerCore> viewercore_class(me, "ViewerCore");
  146. py::enum_<igl::viewer::ViewerCore::RotationType>(viewercore_class, "RotationType")
  147. .value("ROTATION_TYPE_TRACKBALL", igl::viewer::ViewerCore::ROTATION_TYPE_TRACKBALL)
  148. .value("ROTATION_TYPE_TWO_AXIS_VALUATOR_FIXED_UP", igl::viewer::ViewerCore::ROTATION_TYPE_TWO_AXIS_VALUATOR_FIXED_UP)
  149. .value("NUM_ROTATION_TYPES", igl::viewer::ViewerCore::NUM_ROTATION_TYPES)
  150. .export_values();
  151. viewercore_class
  152. .def(py::init<>())
  153. //.def("align_camera_center", [](igl::viewer::ViewerCore& core, const Eigen::MatrixXd& V, const Eigen::MatrixXi& F){return core.align_camera_center(V,F);})
  154. .def("init", &igl::viewer::ViewerCore::init)
  155. .def("shut", &igl::viewer::ViewerCore::shut)
  156. //.def("InitSerialization", &igl::viewer::ViewerCore::InitSerialization)
  157. .def("align_camera_center",
  158. (void (igl::viewer::ViewerCore::*) (const Eigen::MatrixXd &, const Eigen::MatrixXi &)) &igl::viewer::ViewerCore::align_camera_center
  159. )
  160. .def("align_camera_center",
  161. (void (igl::viewer::ViewerCore::*) (const Eigen::MatrixXd &)) &igl::viewer::ViewerCore::align_camera_center
  162. )
  163. .def("clear_framebuffers",&igl::viewer::ViewerCore::clear_framebuffers)
  164. .def("draw",&igl::viewer::ViewerCore::draw)
  165. .def("draw_buffer",&igl::viewer::ViewerCore::draw_buffer)
  166. .def_readwrite("shininess",&igl::viewer::ViewerCore::shininess)
  167. .def_property("background_color",
  168. [](const igl::viewer::ViewerCore& core) {return Eigen::MatrixXd(core.background_color.cast<double>());},
  169. [](igl::viewer::ViewerCore& core, const Eigen::MatrixXd& v)
  170. {
  171. assert_is_Vector4("background_color",v);
  172. core.background_color << Eigen::Vector4f(v.cast<float>());
  173. })
  174. .def_property("line_color",
  175. [](const igl::viewer::ViewerCore& core) {return Eigen::MatrixXd(core.line_color.cast<double>());},
  176. [](igl::viewer::ViewerCore& core, const Eigen::MatrixXd& v)
  177. {
  178. assert_is_Vector4("line_color",v);
  179. core.line_color = Eigen::Vector4f(v.cast<float>());
  180. })
  181. .def_property("light_position",
  182. [](const igl::viewer::ViewerCore& core) {return Eigen::MatrixXd(core.light_position.cast<double>());},
  183. [](igl::viewer::ViewerCore& core, const Eigen::MatrixXd& v)
  184. {
  185. assert_is_Vector3("light_position",v);
  186. core.light_position = Eigen::Vector3f(v.cast<float>());
  187. })
  188. .def_readwrite("lighting_factor",&igl::viewer::ViewerCore::lighting_factor)
  189. .def_readwrite("model_zoom",&igl::viewer::ViewerCore::model_zoom)
  190. .def_property("trackball_angle",
  191. [](const igl::viewer::ViewerCore& core) {return Eigen::Quaterniond(core.trackball_angle.cast<double>());},
  192. [](igl::viewer::ViewerCore& core, const Eigen::Quaterniond& q)
  193. {
  194. core.trackball_angle = Eigen::Quaternionf(q.cast<float>());
  195. })
  196. .def_property("model_translation",
  197. [](const igl::viewer::ViewerCore& core) {return Eigen::MatrixXd(core.model_translation.cast<double>());},
  198. [](igl::viewer::ViewerCore& core, const Eigen::MatrixXd& v)
  199. {
  200. assert_is_Vector3("model_translation",v);
  201. core.model_translation = Eigen::Vector3f(v.cast<float>());
  202. })
  203. .def_readwrite("model_zoom_uv",&igl::viewer::ViewerCore::model_zoom_uv)
  204. .def_property("model_translation_uv",
  205. [](const igl::viewer::ViewerCore& core) {return Eigen::MatrixXd(core.model_translation_uv.cast<double>());},
  206. [](igl::viewer::ViewerCore& core, const Eigen::MatrixXd& v)
  207. {
  208. assert_is_Vector3("model_translation_uv",v);
  209. core.model_translation_uv = Eigen::Vector3f(v.cast<float>());
  210. })
  211. .def_readwrite("camera_zoom",&igl::viewer::ViewerCore::camera_zoom)
  212. .def_readwrite("orthographic",&igl::viewer::ViewerCore::orthographic)
  213. .def_property("camera_eye",
  214. [](const igl::viewer::ViewerCore& core) {return Eigen::MatrixXd(core.camera_eye.cast<double>());},
  215. [](igl::viewer::ViewerCore& core, const Eigen::MatrixXd& v)
  216. {
  217. assert_is_Vector3("camera_eye",v);
  218. core.camera_eye = Eigen::Vector3f(v.cast<float>());
  219. })
  220. .def_property("camera_up",
  221. [](const igl::viewer::ViewerCore& core) {return Eigen::MatrixXd(core.camera_up.cast<double>());},
  222. [](igl::viewer::ViewerCore& core, const Eigen::MatrixXd& v)
  223. {
  224. assert_is_Vector3("camera_up",v);
  225. core.camera_up = Eigen::Vector3f(v.cast<float>());
  226. })
  227. .def_property("camera_center",
  228. [](const igl::viewer::ViewerCore& core) {return Eigen::MatrixXd(core.camera_center.cast<double>());},
  229. [](igl::viewer::ViewerCore& core, const Eigen::MatrixXd& v)
  230. {
  231. assert_is_Vector3("camera_center",v);
  232. core.camera_center = Eigen::Vector3f(v.cast<float>());
  233. })
  234. .def_readwrite("camera_view_angle",&igl::viewer::ViewerCore::camera_view_angle)
  235. .def_readwrite("camera_dnear",&igl::viewer::ViewerCore::camera_dnear)
  236. .def_readwrite("camera_dfar",&igl::viewer::ViewerCore::camera_dfar)
  237. .def_readwrite("show_overlay",&igl::viewer::ViewerCore::show_overlay)
  238. .def_readwrite("show_overlay_depth",&igl::viewer::ViewerCore::show_overlay_depth)
  239. .def_readwrite("show_texture",&igl::viewer::ViewerCore::show_texture)
  240. .def_readwrite("show_faces",&igl::viewer::ViewerCore::show_faces)
  241. .def_readwrite("show_lines",&igl::viewer::ViewerCore::show_lines)
  242. .def_readwrite("show_vertid",&igl::viewer::ViewerCore::show_vertid)
  243. .def_readwrite("show_faceid",&igl::viewer::ViewerCore::show_faceid)
  244. .def_readwrite("invert_normals",&igl::viewer::ViewerCore::invert_normals)
  245. .def_readwrite("depth_test",&igl::viewer::ViewerCore::depth_test)
  246. .def_readwrite("point_size",&igl::viewer::ViewerCore::point_size)
  247. .def_readwrite("line_width",&igl::viewer::ViewerCore::line_width)
  248. .def_readwrite("is_animating",&igl::viewer::ViewerCore::is_animating)
  249. .def_readwrite("animation_max_fps",&igl::viewer::ViewerCore::animation_max_fps)
  250. .def_readwrite("object_scale",&igl::viewer::ViewerCore::object_scale)
  251. .def_property("viewport",
  252. [](const igl::viewer::ViewerCore& core) {return Eigen::MatrixXd(core.viewport.cast<double>());},
  253. [](igl::viewer::ViewerCore& core, const Eigen::MatrixXd& v)
  254. {
  255. assert_is_Vector4("viewport",v);
  256. core.viewport = Eigen::Vector4f(v.cast<float>());
  257. })
  258. .def_property("view",
  259. [](const igl::viewer::ViewerCore& core) {return Eigen::MatrixXd(core.view.cast<double>());},
  260. [](igl::viewer::ViewerCore& core, const Eigen::MatrixXd& v)
  261. {
  262. assert_is_Matrix4("view",v);
  263. core.view = Eigen::Matrix4f(v.cast<float>());
  264. })
  265. .def_property("model",
  266. [](const igl::viewer::ViewerCore& core) {return Eigen::MatrixXd(core.model.cast<double>());},
  267. [](igl::viewer::ViewerCore& core, const Eigen::MatrixXd& v)
  268. {
  269. assert_is_Matrix4("model",v);
  270. core.model = Eigen::Matrix4f(v.cast<float>());
  271. })
  272. .def_property("proj",
  273. [](const igl::viewer::ViewerCore& core) {return Eigen::MatrixXd(core.proj.cast<double>());},
  274. [](igl::viewer::ViewerCore& core, const Eigen::MatrixXd& v)
  275. {
  276. assert_is_Matrix4("proj",v);
  277. core.proj = Eigen::Matrix4f(v.cast<float>());
  278. })
  279. .def_readwrite("rotation_type",&igl::viewer::ViewerCore::rotation_type)
  280. .def("serialize", [](igl::viewer::ViewerCore& core)
  281. {
  282. std::vector<char> a;
  283. igl::serialize(core,"Core",a);
  284. return a;
  285. })
  286. .def("deserialize", [](igl::viewer::ViewerCore& core, const std::vector<char>& a)
  287. {
  288. igl::deserialize(core,"Core",a);
  289. return;
  290. })
  291. // TODO: wrap this!
  292. // Eigen::Quaternionf trackball_angle;
  293. ;
  294. ///////////////////////// VIEWER
  295. // UI Enumerations
  296. py::class_<igl::viewer::Viewer> viewer_class(me, "Viewer");
  297. // #ifdef IGL_VIEWER_WITH_NANOGUI
  298. // py::object fh = (py::object) py::module::import("nanogui").attr("FormHelper");
  299. // py::class_<nanogui::FormHelper> form_helper_class(me, "FormHelper", fh);
  300. // py::object screen = (py::object) py::module::import("nanogui").attr("Screen");
  301. // py::class_<nanogui::Screen> screen_class(me, "Screen", screen);
  302. // #endif
  303. py::enum_<igl::viewer::Viewer::MouseButton>(viewer_class, "MouseButton")
  304. .value("Left", igl::viewer::Viewer::MouseButton::Left)
  305. .value("Middle", igl::viewer::Viewer::MouseButton::Middle)
  306. .value("Right", igl::viewer::Viewer::MouseButton::Right)
  307. .export_values();
  308. viewer_class
  309. .def(py::init<>())
  310. .def_readwrite("data", &igl::viewer::Viewer::data)
  311. .def_readwrite("core", &igl::viewer::Viewer::core)
  312. .def_readwrite("opengl", &igl::viewer::Viewer::opengl)
  313. #ifdef IGL_VIEWER_WITH_NANOGUI
  314. .def_readwrite("ngui", &igl::viewer::Viewer::ngui)
  315. .def_readwrite("screen", &igl::viewer::Viewer::screen)
  316. #endif
  317. .def("launch", &igl::viewer::Viewer::launch, py::arg("resizable") = true, py::arg("fullscreen") = false)
  318. .def("launch_init", &igl::viewer::Viewer::launch_init, py::arg("resizable") = true, py::arg("fullscreen") = false)
  319. .def("launch_rendering", &igl::viewer::Viewer::launch_rendering, py::arg("loop") = true)
  320. .def("launch_shut", &igl::viewer::Viewer::launch_shut)
  321. .def("init", &igl::viewer::Viewer::init)
  322. .def("serialize", [](igl::viewer::Viewer& viewer)
  323. {
  324. std::vector<char> a;
  325. igl::serialize(viewer.core,"Core",a);
  326. igl::serialize(viewer.data,"Data",a);
  327. return a;
  328. })
  329. .def("deserialize", [](igl::viewer::Viewer& viewer, const std::vector<char>& a)
  330. {
  331. igl::deserialize(viewer.core,"Core",a);
  332. igl::deserialize(viewer.data,"Data",a);
  333. return;
  334. })
  335. // Scene IO
  336. .def("load_scene", [](igl::viewer::Viewer& viewer)
  337. {
  338. viewer.load_scene();
  339. })
  340. .def("load_scene", [](igl::viewer::Viewer& viewer, std::string str)
  341. {
  342. viewer.load_scene(str);
  343. })
  344. .def("save_scene", &igl::viewer::Viewer::save_scene)
  345. // Draw everything
  346. .def("draw", &igl::viewer::Viewer::draw)
  347. // OpenGL context resize
  348. .def("resize", &igl::viewer::Viewer::resize)
  349. // Helper functions
  350. .def("snap_to_canonical_quaternion", &igl::viewer::Viewer::snap_to_canonical_quaternion)
  351. .def("open_dialog_load_mesh", &igl::viewer::Viewer::open_dialog_load_mesh)
  352. .def("open_dialog_save_mesh", &igl::viewer::Viewer::open_dialog_save_mesh)
  353. // Input handling
  354. .def_readwrite("current_mouse_x", &igl::viewer::Viewer::current_mouse_x)
  355. .def_readwrite("current_mouse_y", &igl::viewer::Viewer::current_mouse_y)
  356. // Callbacks
  357. .def_readwrite("callback_init", &igl::viewer::Viewer::callback_init)
  358. .def_readwrite("callback_pre_draw", &igl::viewer::Viewer::callback_pre_draw)
  359. .def_readwrite("callback_post_draw", &igl::viewer::Viewer::callback_post_draw)
  360. .def_readwrite("callback_mouse_down", &igl::viewer::Viewer::callback_mouse_down)
  361. .def_readwrite("callback_mouse_up", &igl::viewer::Viewer::callback_mouse_up)
  362. .def_readwrite("callback_mouse_move", &igl::viewer::Viewer::callback_mouse_move)
  363. .def_readwrite("callback_mouse_scroll", &igl::viewer::Viewer::callback_mouse_scroll)
  364. .def_readwrite("callback_key_pressed", &igl::viewer::Viewer::callback_key_pressed)
  365. .def_readwrite("callback_key_down", &igl::viewer::Viewer::callback_key_down)
  366. .def_readwrite("callback_key_up", &igl::viewer::Viewer::callback_key_up)
  367. ;
  368. }