py_igl_viewer.cpp 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327
  1. #include <Eigen/Dense>
  2. #include <Eigen/Sparse>
  3. #include "python.h"
  4. #include <igl/viewer/Viewer.h>
  5. #include <igl/viewer/ViewerCore.h>
  6. #include <igl/viewer/ViewerData.h>
  7. void python_export_igl_viewer(py::module &m)
  8. {
  9. py::module me = m.def_submodule(
  10. "viewer", "Mesh viewer");
  11. /////////////////////// DATA
  12. py::class_<igl::viewer::ViewerData> viewerdata_class(me, "ViewerData");
  13. py::enum_<igl::viewer::ViewerData::DirtyFlags>(viewerdata_class, "DirtyFlags")
  14. .value("DIRTY_NONE", igl::viewer::ViewerData::DIRTY_NONE)
  15. .value("DIRTY_POSITION", igl::viewer::ViewerData::DIRTY_POSITION)
  16. .value("DIRTY_UV", igl::viewer::ViewerData::DIRTY_UV)
  17. .value("DIRTY_NORMAL", igl::viewer::ViewerData::DIRTY_NORMAL)
  18. .value("DIRTY_AMBIENT", igl::viewer::ViewerData::DIRTY_AMBIENT)
  19. .value("DIRTY_DIFFUSE", igl::viewer::ViewerData::DIRTY_DIFFUSE)
  20. .value("DIRTY_SPECULAR", igl::viewer::ViewerData::DIRTY_SPECULAR)
  21. .value("DIRTY_TEXTURE", igl::viewer::ViewerData::DIRTY_TEXTURE)
  22. .value("DIRTY_FACE", igl::viewer::ViewerData::DIRTY_FACE)
  23. .value("DIRTY_MESH", igl::viewer::ViewerData::DIRTY_MESH)
  24. .value("DIRTY_OVERLAY_LINES", igl::viewer::ViewerData::DIRTY_OVERLAY_LINES)
  25. .value("DIRTY_OVERLAY_POINTS", igl::viewer::ViewerData::DIRTY_OVERLAY_POINTS)
  26. .value("DIRTY_ALL", igl::viewer::ViewerData::DIRTY_ALL)
  27. .export_values();
  28. viewerdata_class
  29. .def(py::init<>())
  30. .def("set_mesh", &igl::viewer::ViewerData::set_mesh)
  31. .def("set_colors", &igl::viewer::ViewerData::set_colors)
  32. .def("clear", &igl::viewer::ViewerData::clear)
  33. .def("set_face_based", &igl::viewer::ViewerData::set_face_based)
  34. .def("set_vertices", &igl::viewer::ViewerData::set_vertices)
  35. .def("set_normals", &igl::viewer::ViewerData::set_normals)
  36. .def("set_uv",
  37. (void (igl::viewer::ViewerData::*) (const Eigen::MatrixXd &)) &igl::viewer::ViewerData::set_uv
  38. )
  39. .def("set_uv",
  40. (void (igl::viewer::ViewerData::*) (const Eigen::MatrixXd &, const Eigen::MatrixXi&)) &igl::viewer::ViewerData::set_uv
  41. )
  42. .def("set_texture", &igl::viewer::ViewerData::set_texture)
  43. .def("set_points", &igl::viewer::ViewerData::set_points)
  44. .def("add_points", &igl::viewer::ViewerData::add_points)
  45. .def("set_edges", &igl::viewer::ViewerData::set_edges)
  46. .def("add_edges", &igl::viewer::ViewerData::add_edges)
  47. .def("add_label", [] (igl::viewer::ViewerData& data, const Eigen::MatrixXd& P, const std::string& str)
  48. {
  49. assert_is_VectorXd("P",P);
  50. data.add_label(P,str);
  51. })
  52. .def("compute_normals", &igl::viewer::ViewerData::compute_normals)
  53. .def("uniform_colors", [] (igl::viewer::ViewerData& data, const Eigen::MatrixXd& ambient, const Eigen::MatrixXd& diffuse, const Eigen::MatrixXd& specular)
  54. {
  55. assert_is_Vector3d("ambient",ambient);
  56. assert_is_Vector3d("diffuse",diffuse);
  57. assert_is_Vector3d("specular",specular);
  58. data.uniform_colors(ambient,diffuse, specular);
  59. })
  60. .def("grid_texture", &igl::viewer::ViewerData::grid_texture)
  61. .def_readwrite("V", &igl::viewer::ViewerData::V)
  62. .def_readwrite("F", &igl::viewer::ViewerData::F)
  63. .def_readwrite("F_normals", &igl::viewer::ViewerData::F_normals)
  64. .def_readwrite("F_material_ambient", &igl::viewer::ViewerData::F_material_ambient)
  65. .def_readwrite("F_material_diffuse", &igl::viewer::ViewerData::F_material_diffuse)
  66. .def_readwrite("F_material_specular", &igl::viewer::ViewerData::F_material_specular)
  67. .def_readwrite("V_normals", &igl::viewer::ViewerData::V_normals)
  68. .def_readwrite("V_material_ambient", &igl::viewer::ViewerData::V_material_ambient)
  69. .def_readwrite("V_material_diffuse", &igl::viewer::ViewerData::V_material_diffuse)
  70. .def_readwrite("V_material_specular", &igl::viewer::ViewerData::V_material_specular)
  71. .def_readwrite("V_uv", &igl::viewer::ViewerData::V_uv)
  72. .def_readwrite("F_uv", &igl::viewer::ViewerData::F_uv)
  73. .def_readwrite("texture_R", &igl::viewer::ViewerData::texture_R)
  74. .def_readwrite("texture_G", &igl::viewer::ViewerData::texture_G)
  75. .def_readwrite("texture_B", &igl::viewer::ViewerData::texture_B)
  76. .def_readwrite("lines", &igl::viewer::ViewerData::lines)
  77. .def_readwrite("points", &igl::viewer::ViewerData::points)
  78. .def_readwrite("labels_positions", &igl::viewer::ViewerData::labels_positions)
  79. .def_readwrite("labels_strings", &igl::viewer::ViewerData::labels_strings)
  80. .def_readwrite("dirty", &igl::viewer::ViewerData::dirty)
  81. .def_readwrite("face_based", &igl::viewer::ViewerData::face_based)
  82. ;
  83. //////////////////////// CORE
  84. py::class_<igl::viewer::ViewerCore> viewercore_class(me, "ViewerCore");
  85. py::enum_<igl::viewer::ViewerCore::RotationType>(viewercore_class, "RotationType")
  86. .value("ROTATION_TYPE_TRACKBALL", igl::viewer::ViewerCore::ROTATION_TYPE_TRACKBALL)
  87. .value("ROTATION_TYPE_TWO_AXIS_VALUATOR_FIXED_UP", igl::viewer::ViewerCore::ROTATION_TYPE_TWO_AXIS_VALUATOR_FIXED_UP)
  88. .value("NUM_ROTATION_TYPES", igl::viewer::ViewerCore::NUM_ROTATION_TYPES)
  89. .export_values();
  90. viewercore_class
  91. .def(py::init<>())
  92. //.def("align_camera_center", [](igl::viewer::ViewerCore& core, const Eigen::MatrixXd& V, const Eigen::MatrixXi& F){return core.align_camera_center(V,F);})
  93. .def("init", &igl::viewer::ViewerCore::init)
  94. .def("shut", &igl::viewer::ViewerCore::shut)
  95. //.def("InitSerialization", &igl::viewer::ViewerCore::InitSerialization)
  96. .def("align_camera_center",
  97. (void (igl::viewer::ViewerCore::*) (const Eigen::MatrixXd &, const Eigen::MatrixXi &)) &igl::viewer::ViewerCore::align_camera_center
  98. )
  99. .def("align_camera_center",
  100. (void (igl::viewer::ViewerCore::*) (const Eigen::MatrixXd &)) &igl::viewer::ViewerCore::align_camera_center
  101. )
  102. .def("clear_framebuffers",&igl::viewer::ViewerCore::clear_framebuffers)
  103. .def("draw",&igl::viewer::ViewerCore::draw)
  104. .def("draw_buffer",&igl::viewer::ViewerCore::draw_buffer)
  105. .def_readwrite("textrenderer",&igl::viewer::ViewerCore::textrenderer)
  106. .def_readwrite("shininess",&igl::viewer::ViewerCore::shininess)
  107. .def_property("background_color",
  108. [](const igl::viewer::ViewerCore& core) {return Eigen::MatrixXd(core.background_color.cast<double>());},
  109. [](igl::viewer::ViewerCore& core, const Eigen::MatrixXd& v)
  110. {
  111. assert_is_Vector3d("background_color",v);
  112. core.background_color = Eigen::Vector3f(v.cast<float>());
  113. })
  114. .def_property("line_color",
  115. [](const igl::viewer::ViewerCore& core) {return Eigen::MatrixXd(core.line_color.cast<double>());},
  116. [](igl::viewer::ViewerCore& core, const Eigen::MatrixXd& v)
  117. {
  118. assert_is_Vector3d("line_color",v);
  119. core.line_color = Eigen::Vector3f(v.cast<float>());
  120. })
  121. .def_property("light_position",
  122. [](const igl::viewer::ViewerCore& core) {return Eigen::MatrixXd(core.light_position.cast<double>());},
  123. [](igl::viewer::ViewerCore& core, const Eigen::MatrixXd& v)
  124. {
  125. assert_is_Vector3d("light_position",v);
  126. core.light_position = Eigen::Vector3f(v.cast<float>());
  127. })
  128. .def_readwrite("lighting_factor",&igl::viewer::ViewerCore::lighting_factor)
  129. .def_readwrite("model_zoom",&igl::viewer::ViewerCore::model_zoom)
  130. .def_property("model_translation",
  131. [](const igl::viewer::ViewerCore& core) {return Eigen::MatrixXd(core.model_translation.cast<double>());},
  132. [](igl::viewer::ViewerCore& core, const Eigen::MatrixXd& v)
  133. {
  134. assert_is_Vector3d("model_translation",v);
  135. core.model_translation = Eigen::Vector3f(v.cast<float>());
  136. })
  137. .def_readwrite("model_zoom_uv",&igl::viewer::ViewerCore::model_zoom_uv)
  138. .def_property("model_translation_uv",
  139. [](const igl::viewer::ViewerCore& core) {return Eigen::MatrixXd(core.model_translation_uv.cast<double>());},
  140. [](igl::viewer::ViewerCore& core, const Eigen::MatrixXd& v)
  141. {
  142. assert_is_Vector3d("model_translation_uv",v);
  143. core.model_translation_uv = Eigen::Vector3f(v.cast<float>());
  144. })
  145. .def_readwrite("camera_zoom",&igl::viewer::ViewerCore::camera_zoom)
  146. .def_readwrite("orthographic",&igl::viewer::ViewerCore::orthographic)
  147. .def_property("camera_eye",
  148. [](const igl::viewer::ViewerCore& core) {return Eigen::MatrixXd(core.camera_eye.cast<double>());},
  149. [](igl::viewer::ViewerCore& core, const Eigen::MatrixXd& v)
  150. {
  151. assert_is_Vector3d("camera_eye",v);
  152. core.camera_eye = Eigen::Vector3f(v.cast<float>());
  153. })
  154. .def_property("camera_up",
  155. [](const igl::viewer::ViewerCore& core) {return Eigen::MatrixXd(core.camera_up.cast<double>());},
  156. [](igl::viewer::ViewerCore& core, const Eigen::MatrixXd& v)
  157. {
  158. assert_is_Vector3d("camera_up",v);
  159. core.camera_up = Eigen::Vector3f(v.cast<float>());
  160. })
  161. .def_property("camera_center",
  162. [](const igl::viewer::ViewerCore& core) {return Eigen::MatrixXd(core.camera_center.cast<double>());},
  163. [](igl::viewer::ViewerCore& core, const Eigen::MatrixXd& v)
  164. {
  165. assert_is_Vector3d("camera_center",v);
  166. core.camera_center = Eigen::Vector3f(v.cast<float>());
  167. })
  168. .def_readwrite("camera_view_angle",&igl::viewer::ViewerCore::camera_view_angle)
  169. .def_readwrite("camera_dnear",&igl::viewer::ViewerCore::camera_dnear)
  170. .def_readwrite("camera_dfar",&igl::viewer::ViewerCore::camera_dfar)
  171. .def_readwrite("show_overlay",&igl::viewer::ViewerCore::show_overlay)
  172. .def_readwrite("show_overlay_depth",&igl::viewer::ViewerCore::show_overlay_depth)
  173. .def_readwrite("show_texture",&igl::viewer::ViewerCore::show_texture)
  174. .def_readwrite("show_faces",&igl::viewer::ViewerCore::show_faces)
  175. .def_readwrite("show_lines",&igl::viewer::ViewerCore::show_lines)
  176. .def_readwrite("show_vertid",&igl::viewer::ViewerCore::show_vertid)
  177. .def_readwrite("show_faceid",&igl::viewer::ViewerCore::show_faceid)
  178. .def_readwrite("invert_normals",&igl::viewer::ViewerCore::invert_normals)
  179. .def_readwrite("depth_test",&igl::viewer::ViewerCore::depth_test)
  180. .def_readwrite("point_size",&igl::viewer::ViewerCore::point_size)
  181. .def_readwrite("line_width",&igl::viewer::ViewerCore::line_width)
  182. .def_readwrite("is_animating",&igl::viewer::ViewerCore::is_animating)
  183. .def_readwrite("animation_max_fps",&igl::viewer::ViewerCore::animation_max_fps)
  184. .def_readwrite("object_scale",&igl::viewer::ViewerCore::object_scale)
  185. .def_property("viewport",
  186. [](const igl::viewer::ViewerCore& core) {return Eigen::MatrixXd(core.viewport.cast<double>());},
  187. [](igl::viewer::ViewerCore& core, const Eigen::MatrixXd& v)
  188. {
  189. assert_is_Vector4d("viewport",v);
  190. core.viewport = Eigen::Vector4f(v.cast<float>());
  191. })
  192. .def_property("view",
  193. [](const igl::viewer::ViewerCore& core) {return Eigen::MatrixXd(core.view.cast<double>());},
  194. [](igl::viewer::ViewerCore& core, const Eigen::MatrixXd& v)
  195. {
  196. assert_is_Matrix4d("view",v);
  197. core.view = Eigen::Matrix4f(v.cast<float>());
  198. })
  199. .def_property("model",
  200. [](const igl::viewer::ViewerCore& core) {return Eigen::MatrixXd(core.model.cast<double>());},
  201. [](igl::viewer::ViewerCore& core, const Eigen::MatrixXd& v)
  202. {
  203. assert_is_Matrix4d("model",v);
  204. core.model = Eigen::Matrix4f(v.cast<float>());
  205. })
  206. .def_property("proj",
  207. [](const igl::viewer::ViewerCore& core) {return Eigen::MatrixXd(core.proj.cast<double>());},
  208. [](igl::viewer::ViewerCore& core, const Eigen::MatrixXd& v)
  209. {
  210. assert_is_Matrix4d("proj",v);
  211. core.proj = Eigen::Matrix4f(v.cast<float>());
  212. })
  213. .def_readwrite("rotation_type",&igl::viewer::ViewerCore::rotation_type)
  214. // TODO: wrap this!
  215. // Eigen::Quaternionf trackball_angle;
  216. ;
  217. ///////////////////////// VIEWER
  218. // UI Enumerations
  219. py::class_<igl::viewer::Viewer> viewer_class(me, "Viewer");
  220. py::enum_<igl::viewer::Viewer::MouseButton>(viewer_class, "MouseButton")
  221. .value("Left", igl::viewer::Viewer::MouseButton::Left)
  222. .value("Middle", igl::viewer::Viewer::MouseButton::Middle)
  223. .value("Right", igl::viewer::Viewer::MouseButton::Right)
  224. .export_values();
  225. viewer_class
  226. .def(py::init<>())
  227. .def_readwrite("data", &igl::viewer::Viewer::data)
  228. .def_readwrite("core", &igl::viewer::Viewer::core)
  229. .def("launch", &igl::viewer::Viewer::launch, py::arg("resizable") = true, py::arg("fullscreen") = false)
  230. .def("init", &igl::viewer::Viewer::init)
  231. // Scene IO
  232. .def("load_scene", [](igl::viewer::Viewer& viewer)
  233. {
  234. viewer.load_scene();
  235. })
  236. .def("load_scene", [](igl::viewer::Viewer& viewer, std::string str)
  237. {
  238. viewer.load_scene(str);
  239. })
  240. .def("save_scene", &igl::viewer::Viewer::save_scene)
  241. // Draw everything
  242. .def("draw", &igl::viewer::Viewer::draw)
  243. // OpenGL context resize
  244. .def("resize", &igl::viewer::Viewer::resize)
  245. // Helper functions
  246. .def("snap_to_canonical_quaternion", &igl::viewer::Viewer::snap_to_canonical_quaternion)
  247. .def("open_dialog_load_mesh", &igl::viewer::Viewer::open_dialog_load_mesh)
  248. .def("open_dialog_save_mesh", &igl::viewer::Viewer::open_dialog_save_mesh)
  249. // Callbacks
  250. .def_readwrite("callback_init", &igl::viewer::Viewer::callback_init)
  251. .def_readwrite("callback_pre_draw", &igl::viewer::Viewer::callback_pre_draw)
  252. .def_readwrite("callback_post_draw", &igl::viewer::Viewer::callback_post_draw)
  253. .def_readwrite("callback_mouse_down", &igl::viewer::Viewer::callback_mouse_down)
  254. .def_readwrite("callback_mouse_up", &igl::viewer::Viewer::callback_mouse_up)
  255. .def_readwrite("callback_mouse_move", &igl::viewer::Viewer::callback_mouse_move)
  256. .def_readwrite("callback_mouse_scroll", &igl::viewer::Viewer::callback_mouse_scroll)
  257. .def_readwrite("callback_key_pressed", &igl::viewer::Viewer::callback_key_pressed)
  258. .def_readwrite("callback_key_down", &igl::viewer::Viewer::callback_key_down)
  259. .def_readwrite("callback_key_up", &igl::viewer::Viewer::callback_key_up)
  260. ;
  261. }