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
10namespace taichi {
11
12void 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