25 namespace visualization {
42 BitmapEvent(BitmapWindow *target) :
event_target(target) {}
43 virtual ~BitmapEvent() {}
48 struct BitmapDrawEvent :
public BitmapEvent {
49 BitmapDrawEvent(BitmapWindow *target) : BitmapEvent(target) {}
54 struct BitmapResizeEvent :
public BitmapEvent {
55 BitmapResizeEvent(BitmapWindow *target) : BitmapEvent(target) {}
60 struct BitmapMouseEvent :
public BitmapEvent {
63 BitmapMouseEvent(BitmapWindow *target,
const MouseEvent &e)
64 : BitmapEvent(target),
event(e) {}
77 struct BitmapKeyEvent :
public BitmapEvent {
80 BitmapKeyEvent(BitmapWindow *target,
const KeyEvent &e)
81 : BitmapEvent(target),
event(e) {}
86 struct BitmapTextInputEvent :
public BitmapEvent {
89 BitmapTextInputEvent(BitmapWindow *target,
const TextInputEvent &e)
90 : BitmapEvent(target),
textUtf8(e.utf8) {}
100 struct BitmapEventQueue :
public std::queue<std::shared_ptr<BitmapEvent>> {
101 using value_t = std::shared_ptr<BitmapEvent>;
102 using super = std::queue<value_t>;
108 value_t pop_front() {
109 std::lock_guard<std::mutex> lock(evt_q_mutex_);
110 value_t evt = super::front();
114 void push(
const value_t &
event) {
115 if (evt_q_mutex_.try_lock()) {
117 evt_q_mutex_.unlock();
122 std::mutex evt_q_mutex_;
135 #if !defined(__APPLE__) && !defined(_WIN32) && !defined(_WIN64)
139 "BitmapWindowSystem(): HEADLESS is only supported on Linux.");
156 auto t_end = std::chrono::steady_clock::now() +
157 std::chrono::duration<double>(timeout_secs);
158 while (!impl_->event_queue_.empty() &&
159 std::chrono::steady_clock::now() < t_end) {
160 impl_->event_queue_.pop_front()->Execute();
161 std::this_thread::yield();
163 std::this_thread::sleep_until(t_end);
167 return Size(32000, 32000);
180 BitmapWindow *the_deceased = (BitmapWindow *)w;
187 BitmapEventQueue filtered_reversed;
188 while (!impl_->event_queue_.empty()) {
189 auto e = impl_->event_queue_.pop_front();
190 if (e->event_target != the_deceased) {
191 filtered_reversed.push(e);
197 while (!filtered_reversed.empty()) {
198 impl_->event_queue_.push(filtered_reversed.pop_front());
201 delete (BitmapWindow *)w;
205 auto hw = (BitmapWindow *)w;
206 impl_->event_queue_.push(std::make_shared<BitmapDrawEvent>(hw));
210 auto hw = (BitmapWindow *)w;
211 impl_->event_queue_.push(std::make_shared<BitmapMouseEvent>(hw, e));
215 auto hw = (BitmapWindow *)w;
216 impl_->event_queue_.push(std::make_shared<BitmapKeyEvent>(hw, e));
221 auto hw = (BitmapWindow *)w;
222 impl_->event_queue_.push(std::make_shared<BitmapTextInputEvent>(hw, e));
234 return Point(((BitmapWindow *)w)->
frame.x, ((BitmapWindow *)w)->frame.y);
238 ((BitmapWindow *)w)->frame.x = x;
239 ((BitmapWindow *)w)->frame.y = y;
243 return Size(((BitmapWindow *)w)->
frame.width,
244 ((BitmapWindow *)w)->frame.height);
248 BitmapWindow *hw = (BitmapWindow *)w;
249 hw->frame.width =
width;
250 hw->frame.height =
height;
251 hw->o3d_window->OnResize();
271 return ((BitmapWindow *)w)->mouse_pos;
275 return ((BitmapWindow *)w)->mouse_buttons;
285 ((BitmapWindow *)w)->
frame.width, ((BitmapWindow *)w)->frame.height,
288 auto on_after_draw = [
this, renderer, w]() {
289 if (!this->impl_->on_draw_) {
294 Window *window = ((BitmapWindow *)w)->o3d_window;
296 auto on_pixels = [
this, window](std::shared_ptr<core::Tensor>
image) {
297 if (this->impl_->on_draw_) {
298 this->impl_->on_draw_(window,
image);
301 renderer->RequestReadPixels(
size.width,
size.height, on_pixels);
303 renderer->SetOnAfterDraw(on_after_draw);
BitmapWindow * event_target
std::shared_ptr< core::Tensor > image
std::function< void(std::shared_ptr< core::Tensor >)> callback
void SetWindowTitle(OSWindow w, const char *title) override
Point GetMousePosInWindow(OSWindow w) const override
void RaiseWindowToTop(OSWindow w) override
bool IsActiveWindow(OSWindow w) const override
void SetOnWindowDraw(OnDrawCallback callback)
std::function< void(Window *, std::shared_ptr< core::Tensor >)> OnDrawCallback
void PostTextInputEvent(OSWindow w, const TextInputEvent &e)
BitmapWindowSystem(Rendering mode=Rendering::NORMAL)
rendering::FilamentRenderer * CreateRenderer(OSWindow w) override
void SetWindowSizePixels(OSWindow w, const Size &size) override
void WaitEventsTimeout(double timeout_secs) override
float GetUIScaleFactor(OSWindow w) const override
void ResizeRenderer(OSWindow w, rendering::FilamentRenderer *renderer) override
void ShowWindow(OSWindow w, bool show) override
void DestroyWindow(OSWindow w) override
Point GetWindowPos(OSWindow w) const override
void SetWindowPos(OSWindow w, int x, int y) override
void Uninitialize() override
OSWindow CreateOSWindow(Window *o3d_window, int width, int height, const char *title, int flags) override
void SetWindowSize(OSWindow w, int width, int height) override
Size GetWindowSize(OSWindow w) const override
void * GetNativeDrawable(OSWindow w) override
void CancelUserClose(OSWindow w) override
void Initialize() override
Size GetWindowSizePixels(OSWindow w) const override
int GetMouseButtons(OSWindow w) const override
float GetWindowScaleFactor(OSWindow w) const override
bool GetWindowIsVisible(OSWindow w) const override
Size GetScreenSize(OSWindow w) override
MenuBase * CreateOSMenu() override
void PostKeyEvent(OSWindow w, const KeyEvent &e)
void PostRedrawEvent(OSWindow w) override
void PostMouseEvent(OSWindow w, const MouseEvent &e)
static filament::Engine & GetInstance()
static FilamentResourceManager & GetResourceManager()
static void EnableHeadless()
void UpdateBitmapSwapChain(int width, int height) override
Generic file read and write utility for python interface.
BitmapWindowSystem::OnDrawCallback on_draw_
BitmapEventQueue event_queue_