1 | /******************************************************************************* |
2 | Copyright (c) The Taichi Authors (2016- ). All Rights Reserved. |
3 | The use of this software is governed by the LICENSE file. |
4 | *******************************************************************************/ |
5 | |
6 | #include "taichi/python/export.h" |
7 | #include "taichi/util/image_io.h" |
8 | #include "taichi/ui/gui/gui.h" |
9 | |
10 | namespace taichi { |
11 | |
12 | void export_visual(py::module &m) { |
13 | // GUI |
14 | using Line = Canvas::Line; |
15 | using Circle = Canvas::Circle; |
16 | using Type = GUI::KeyEvent::Type; |
17 | |
18 | auto key_event = py::class_<GUI::KeyEvent>(m, "KeyEvent" ); |
19 | key_event.def_readonly("type" , &GUI::KeyEvent::type) |
20 | .def_readonly("key" , &GUI::KeyEvent::key) |
21 | .def_readonly("pos" , &GUI::KeyEvent::pos) |
22 | .def_readonly("delta" , &GUI::KeyEvent::delta); |
23 | py::enum_<GUI::KeyEvent::Type>(key_event, "EType" ) |
24 | .value("Move" , Type::move) |
25 | .value("Press" , Type::press) |
26 | .value("Release" , Type::release); |
27 | py::class_<GUI>(m, "GUI" ) |
28 | .def(py::init<std::string, Vector2i, bool, bool, bool, uintptr_t>()) |
29 | .def_readwrite("frame_delta_limit" , &GUI::frame_delta_limit) |
30 | .def_readwrite("should_close" , &GUI::should_close) |
31 | .def("get_canvas" , &GUI::get_canvas, py::return_value_policy::reference) |
32 | .def("set_img" , |
33 | [&](GUI *gui, std::size_t ptr) { |
34 | auto &img = gui->canvas->img; |
35 | std::memcpy((void *)img.get_data().data(), (void *)ptr, |
36 | img.get_data_size()); |
37 | }) |
38 | .def("get_img" , |
39 | [&](GUI *gui, std::size_t ptr) { |
40 | auto &img = gui->canvas->img; |
41 | std::memcpy((void *)ptr, (void *)img.get_data().data(), |
42 | img.get_data_size()); |
43 | }) |
44 | .def("screenshot" , &GUI::screenshot) |
45 | .def("set_widget_value" , |
46 | [](GUI *gui, int wid, float value) { |
47 | *gui->widget_values.at(wid) = value; |
48 | }) |
49 | .def("get_widget_value" , |
50 | [](GUI *gui, int wid) -> float { |
51 | return *gui->widget_values.at(wid); |
52 | }) |
53 | .def("make_slider" , |
54 | [](GUI *gui, std::string text, float init_value, float minimum, |
55 | float maximum, float step) { |
56 | auto val = std::make_unique<float>(init_value); |
57 | auto val_ptr = val.get(); |
58 | gui->widget_values.push_back(std::move(val)); |
59 | gui->slider(text, *val_ptr, minimum, maximum, step); |
60 | return gui->widget_values.size() - 1; |
61 | }) |
62 | .def("make_label" , |
63 | [](GUI *gui, std::string text, float init_value) { |
64 | auto val = std::make_unique<float>(init_value); |
65 | auto val_ptr = val.get(); |
66 | gui->widget_values.push_back(std::move(val)); |
67 | gui->label(text, *val_ptr); |
68 | return gui->widget_values.size() - 1; |
69 | }) |
70 | .def("make_button" , |
71 | [](GUI *gui, std::string text, std::string event_name) { |
72 | gui->button(text, [=]() { |
73 | gui->key_events.push_back(GUI::KeyEvent{ |
74 | GUI::KeyEvent::Type::press, event_name, gui->cursor_pos}); |
75 | }); |
76 | }) |
77 | .def("canvas_untransform" , &GUI::canvas_untransform) |
78 | .def("has_key_event" , &GUI::has_key_event) |
79 | .def("wait_key_event" , &GUI::wait_key_event) |
80 | .def("get_key_event_head" , &GUI::get_key_event_head) |
81 | .def("pop_key_event_head" , &GUI::pop_key_event_head) |
82 | .def("get_cursor_pos" , &GUI::get_cursor_pos) |
83 | .def_readwrite("title" , &GUI::window_name) |
84 | .def("update" , &GUI::update); |
85 | py::class_<Canvas>(m, "Canvas" ) |
86 | .def("clear" , static_cast<void (Canvas::*)(uint32)>(&Canvas::clear)) |
87 | .def("rect" , &Canvas::rect, py::return_value_policy::reference) |
88 | .def("path" , |
89 | static_cast<Line &(Canvas::*)(Vector2, Vector2)>(&Canvas::path), |
90 | py::return_value_policy::reference) |
91 | .def("path_single" , &Canvas::path_single) |
92 | .def("paths_batched" , &Canvas::paths_batched) |
93 | .def("triangle_single" , &Canvas::triangle_single) |
94 | .def("triangles_batched" , &Canvas::triangles_batched) |
95 | .def("circles_batched" , &Canvas::circles_batched) |
96 | .def("circle_single" , &Canvas::circle_single) |
97 | .def("circle" , static_cast<Circle &(Canvas::*)(Vector2)>(&Canvas::circle), |
98 | py::return_value_policy::reference) |
99 | .def("text" , &Canvas::text); |
100 | py::class_<Line>(m, "Line" ) |
101 | .def("finish" , &Line::finish) |
102 | .def("radius" , &Line::radius, py::return_value_policy::reference) |
103 | .def("close" , &Line::close, py::return_value_policy::reference) |
104 | .def("color" , static_cast<Line &(Line::*)(int)>(&Line::color), |
105 | py::return_value_policy::reference); |
106 | py::class_<Circle>(m, "Circle" ) |
107 | .def("finish" , &Circle::finish) |
108 | .def("radius" , &Circle::radius, py::return_value_policy::reference) |
109 | .def("color" , static_cast<Circle &(Circle::*)(int)>(&Circle::color), |
110 | py::return_value_policy::reference); |
111 | m.def("imwrite" , &imwrite); |
112 | m.def("imread" , &imread); |
113 | // TODO(archibate): See misc/image.py |
114 | m.def("C_memcpy" , [](size_t dst, size_t src, size_t size) { |
115 | std::memcpy((void *)dst, (void *)src, size); |
116 | }); |
117 | } |
118 | |
119 | } // namespace taichi |
120 | |