Graphite Version 3
An experimental 3D geometry processing program
Loading...
Searching...
No Matches
application.h
Go to the documentation of this file.
1/*
2 * Copyright (c) 2000-2022 Inria
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 *
8 * * Redistributions of source code must retain the above copyright notice,
9 * this list of conditions and the following disclaimer.
10 * * Redistributions in binary form must reproduce the above copyright notice,
11 * this list of conditions and the following disclaimer in the documentation
12 * and/or other materials provided with the distribution.
13 * * Neither the name of the ALICE Project-Team nor the names of its
14 * contributors may be used to endorse or promote products derived from this
15 * software without specific prior written permission.
16 *
17 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
18 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
21 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
22 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
23 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
24 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
25 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
26 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27 * POSSIBILITY OF SUCH DAMAGE.
28 *
29 * Contact: Bruno Levy
30 *
31 * https://www.inria.fr/fr/bruno-levy
32 *
33 * Inria,
34 * Domaine de Voluceau,
35 * 78150 Le Chesnay - Rocquencourt
36 * FRANCE
37 *
38 */
39
40#ifndef H_GEOGRAM_GFX_GUI_APPLICATION_H
41#define H_GEOGRAM_GFX_GUI_APPLICATION_H
42
44#include <geogram_gfx/gui/events.h>
45#include <atomic>
46
47#ifndef GEO_OS_ANDROID
48# define GEO_GLFW
49#endif
50
56#ifdef GEO_OS_WINDOWS
57#define GEO_APPLICATION_GLOBALS \
58 extern "C" { __declspec(dllexport) DWORD NvOptimusEnablement = 0x00000000; }
59#else
60#define GEO_APPLICATION_GLOBALS
61#endif
62
63namespace GEO {
64
65 class Image;
66 class ApplicationData;
67
75 public:
76
81 Application(const std::string& name);
82
86 virtual ~Application();
87
93 return instance_;
94 }
95
96
101 const std::string& name() const {
102 return name_;
103 }
104
105
112 virtual void start(int argc=0, char** argv=nullptr);
113
117 virtual void stop();
118
123 const std::string& get_style() const {
124 return style_;
125 }
126
132 virtual void set_style(const std::string& value);
133
139 static std::string get_styles();
140
146
152 return font_size_;
153 }
154
158 virtual void update();
159
165
173 ++nb_update_locks_;
174 }
175
180 // Note: Under Windows, when the Graphite window is iconified,
181 // it can happen that nb_update_locks_ is already 0 when
182 // reaching this point.
183 if(nb_update_locks_ > 0) {
184 --nb_update_locks_;
185 }
186 }
187
196 bool updates_locked() const {
197 return (nb_update_locks_ > 0);
198 }
199
206 virtual void draw();
207
213 double scaling() const;
214
223 index_t w=0, index_t h=0, index_t hz=0,
224 index_t monitor=0
225 );
226
233
240
244 void iconify();
245
249 void restore();
250
257 void set_gui_state(std::string x);
258
264 std::string get_gui_state() const;
265
271 void set_full_screen(bool x);
272
278 bool get_full_screen() const;
279
288 return width_;
289 }
290
299 return height_;
300 }
301
309 return frame_buffer_width_;
310 }
311
319 return frame_buffer_height_;
320 }
321
328 void set_accept_drops(bool value) {
329 accept_drops_ = value;
330 }
331
338 bool get_accept_drops() const {
339 return accept_drops_;
340 }
341
346 void set_window_icon(Image* image);
347
358 int button, int action, int mods=0, int source=EVENT_SOURCE_MOUSE
359 );
360
365 virtual void scroll_callback(double xoffset, double yoffset);
366
374 double x, double y, int source=EVENT_SOURCE_MOUSE
375 );
376
382 virtual void drop_callback(int nb, const char** f);
383
389 virtual void char_callback(unsigned int c);
390
398 virtual void key_callback(int key, int scancode, int action, int mods);
399
404 void restart_gui() {
405 ImGui_restart_ = true;
406 }
407
413 ApplicationData* impl_data() {
414 return data_;
415 }
416
422 void* impl_window();
423
431 double hidpi_scaling() const {
432 return hidpi_scaling_;
433 }
434
446 double pixel_ratio() const {
447 return pixel_ratio_;
448 }
449
454 soft_keyboard_visible_ = false;
455 }
456
457 //protected:
458 public:
459
465 const char* key_to_string(int key);
466
472 virtual void draw_gui();
473
480 virtual void draw_graphics();
481
487 virtual void pre_draw();
488
493 virtual void post_draw();
494
500 virtual bool needs_to_redraw() const;
501
505 virtual void create_window();
506
510 virtual void delete_window();
511
520 virtual void resize(index_t w, index_t h, index_t fb_w, index_t fb_h);
521
526 virtual void one_frame(bool draw_GUI = true);
527
534 virtual void main_loop();
535
539 virtual void GL_initialize();
540
544 virtual void GL_terminate();
545
549 virtual void ImGui_initialize();
550
554 virtual void ImGui_load_fonts();
555
559 virtual void ImGui_terminate();
560
564 virtual void ImGui_new_frame();
565
566 /*
567 * \param[in] argc , argv command line parameters, used
568 * to initialize geogram.
569 */
570 virtual void geogram_initialize(int argc, char** argv);
571
578 virtual void declare_args();
579
584
589 const std::vector<std::string>& filenames() const {
590 return filenames_;
591 }
592
593 bool animate() const {
594 return animate_;
595 }
596
597 bool* animate_ptr() {
598 return &animate_;
599 }
600
601 void start_animation() {
602 animate_ = true;
603 }
604
605 void stop_animation() {
606 animate_ = false;
607 }
608
609 private:
610 static Application* instance_;
611 ApplicationData* data_;
612 index_t width_;
613 index_t height_;
614 index_t frame_buffer_width_;
615 index_t frame_buffer_height_;
616 bool in_main_loop_;
617 bool accept_drops_;
618 double scaling_;
619 std::atomic<index_t> nb_update_locks_;
620 std::string style_;
621 bool ImGui_restart_;
622 bool ImGui_reload_font_;
623 bool ImGui_initialized_;
624 index_t font_size_;
625 index_t nb_frames_update_;
626 double hidpi_scaling_;
627 double pixel_ratio_;
628 std::string name_;
629 bool currently_drawing_gui_;
630 std::vector<std::string> filenames_;
631 bool animate_;
634 protected:
636 bool menubar_visible_;
638 bool soft_keyboard_visible_;
639
640#ifdef GEO_OS_EMSCRIPTEN
641 friend void emscripten_one_frame();
642#endif
643 };
644
645}
646
647#endif
Base class for all applications.
Definition application.h:74
void set_full_screen(bool x)
Sets full-screen mode.
virtual void main_loop()
Enters the main application loop.
index_t get_font_size() const
Gets the font size.
void restart_gui()
Restarts the gui.
double hidpi_scaling() const
MacOS non-sense.
virtual void ImGui_load_fonts()
Loads the fonts in ImGui.
void lock_updates()
Lock updates.
bool get_accept_drops() const
Tests whether drag and drop events are taken into account.
bool updates_locked() const
Tests whether graphic updates are locked.
index_t get_frame_buffer_width() const
Gets the width of the frame buffer.
void reset_soft_keyboard_flag()
Used internally.
void draw_dock_space()
Draws a dockspace that fills the current window.
static Application * instance()
Gets the instance.
Definition application.h:92
virtual void mouse_button_callback(int button, int action, int mods=0, int source=EVENT_SOURCE_MOUSE)
Callback called whenenver a mouse button changed.
virtual void ImGui_terminate()
Deallocates objects used by the ImGui library.
virtual void GL_terminate()
Deallocates OpenGL and GLUP objects.
void set_accept_drops(bool value)
Sets whether drag and drop events should be taken into account.
void set_full_screen_mode(index_t w=0, index_t h=0, index_t hz=0, index_t monitor=0)
Sets full-screen mode.
void set_font_size(index_t value)
Sets the font size.
double scaling() const
Gets the global scaling to be applied to all GUI elements.
virtual void scroll_callback(double xoffset, double yoffset)
Callback called whenenver the mouse wheel is moved.
void list_video_modes()
Lists the video modes that can be used for set_full_screen_mode()
index_t get_height() const
Gets the height of the window.
index_t get_width() const
Gets the width of the window.
void unlock_updates()
Unlock updates.
void set_windowed_mode(index_t w=0, index_t h=0)
Sets windowed mode.
virtual void pre_draw()
This function is called before starting drawing operations.
void iconify()
Iconifies this application.
virtual void ImGui_initialize()
Initializes the ImGui library.
virtual void resize(index_t w, index_t h, index_t fb_w, index_t fb_h)
Called whenever window size changes.
virtual void drop_callback(int nb, const char **f)
Callback called whenever files are dropped in the window.
virtual void update()
Indicates that the main window should be redrawn.
virtual void stop()
Stops the application.
Application(const std::string &name)
Application constructor.
virtual void key_callback(int key, int scancode, int action, int mods)
Callback called whenever a key is pushed (low level version)
void callbacks_initialize()
Initializes the callbacks if not already initialized.
const std::string & get_style() const
Gets the style.
const char * key_to_string(int key)
Converts a key to a symbolic string with the name of the key.
virtual void start(int argc=0, char **argv=nullptr)
Starts the main event loop of the application.
const std::vector< std::string > & filenames() const
Gets all the filenames specified on the command line.
void set_gui_state(std::string x)
Sets the gui state.
virtual void declare_args()
Called by geogram_initialize(), right before parsing command line arguments.
double pixel_ratio() const
More MacOS non-sense.
virtual void post_draw()
This function is called after all drawing operations.
virtual void create_window()
Creates the window using GLFW.
virtual void draw_gui()
This function is called when the GUI should be redisplayed.
virtual void delete_window()
Deletes the window created by GLFW.
void set_window_icon(Image *image)
Sets the icon of the window.
const std::string & name() const
Gets the name of this application.
virtual ~Application()
Application destructor.
index_t get_frame_buffer_height() const
Gets the height of the frame buffer.
void restore()
Restores this application.
ApplicationData * impl_data()
Gets a pointer to the implementation-specific data.
virtual void set_style(const std::string &value)
Sets the style of the application.
virtual void cursor_pos_callback(double x, double y, int source=EVENT_SOURCE_MOUSE)
Callback called whenever the mouse cursor is moved.
virtual void ImGui_new_frame()
Notifies ImGui that a new frame has just started.
virtual void GL_initialize()
Initializes OpenGL and GLUP objects.
virtual void one_frame(bool draw_GUI=true)
Draws one frame.
void * impl_window()
Gets a pointer to the implementation-specific window.
virtual bool needs_to_redraw() const
Tests whether the window needs to be redrawn.
std::string get_gui_state() const
Gets the gui state.
virtual void draw_graphics()
This function is called when the 3d content should be redisplayed.
bool get_full_screen() const
Tests whether this application is in full-screen mode.
static std::string get_styles()
Gets the possible styles.
virtual void char_callback(unsigned int c)
Callback called whenever a key is pushed (high level version)
virtual void draw()
Redraws the main window.
An image.
Definition image.h:59
Common include file, providing basic definitions. Should be included before anything else by all head...
#define GEOGRAM_GFX_API
Linkage declaration for geogram symbols.
Definition defs.h:55
Global Vorpaline namespace.
geo_index_t index_t
The type for storing and manipulating indices.
Definition numeric.h:329