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
378 double x, double y, int source=EVENT_SOURCE_MOUSE
379 );
380
386 virtual void drop_callback(int nb, const char** f);
387
393 virtual void char_callback(unsigned int c);
394
402 virtual void key_callback(int key, int scancode, int action, int mods);
403
408 void restart_gui() {
409 ImGui_restart_ = true;
410 }
411
417 ApplicationData* impl_data() {
418 return data_;
419 }
420
426 void* impl_window();
427
439 double hidpi_scaling() const {
440 return hidpi_scaling_;
441 }
442
456 double pixel_ratio() const {
457 return pixel_ratio_;
458 }
459
464 soft_keyboard_visible_ = false;
465 }
466
467 //protected:
468 public:
469
475 const char* key_to_string(int key);
476
482 virtual void draw_gui();
483
490 virtual void draw_graphics();
491
497 virtual void pre_draw();
498
503 virtual void post_draw();
504
510 virtual bool needs_to_redraw() const;
511
515 virtual void create_window();
516
520 virtual void delete_window();
521
530 virtual void resize(index_t w, index_t h, index_t fb_w, index_t fb_h);
531
536 virtual void one_frame(bool draw_GUI = true);
537
544 virtual void main_loop();
545
549 virtual void GL_initialize();
550
554 virtual void GL_terminate();
555
559 virtual void ImGui_initialize();
560
564 virtual void ImGui_load_fonts();
565
569 virtual void ImGui_terminate();
570
574 virtual void ImGui_new_frame();
575
576 /*
577 * \param[in] argc , argv command line parameters, used
578 * to initialize geogram.
579 */
580 virtual void geogram_initialize(int argc, char** argv);
581
588 virtual void declare_args();
589
594
599 const std::vector<std::string>& filenames() const {
600 return filenames_;
601 }
602
603 bool animate() const {
604 return animate_;
605 }
606
607 bool* animate_ptr() {
608 return &animate_;
609 }
610
611 void start_animation() {
612 animate_ = true;
613 }
614
615 void stop_animation() {
616 animate_ = false;
617 }
618
622 float get_font_size(index_t font_id) const {
623 geo_assert(font_id < font_sizes_.size());
624 return font_sizes_[font_id];
625 }
626
630 float get_font_global_scale() const {
631 return font_global_scale_;
632 }
633
637 void set_font_global_scale(float s) {
638 font_global_scale_ = s;
639 }
640
641 private:
642 static Application* instance_;
643 ApplicationData* data_;
644 index_t width_;
645 index_t height_;
646 index_t frame_buffer_width_;
647 index_t frame_buffer_height_;
648 bool in_main_loop_;
649 bool accept_drops_;
650 double scaling_;
651 std::atomic<index_t> nb_update_locks_;
652 std::string style_;
653 bool ImGui_restart_;
654 bool ImGui_reload_font_;
655 bool ImGui_initialized_;
656 index_t font_size_;
657 index_t nb_frames_update_;
658 double hidpi_scaling_;
659 double pixel_ratio_;
660 std::string name_;
661 bool currently_drawing_gui_;
662 std::vector<std::string> filenames_;
663 bool animate_;
664 vector<float> font_sizes_;
665 float font_global_scale_;
667 protected:
669 bool menubar_visible_;
671 bool soft_keyboard_visible_;
672
673#ifdef GEO_OS_EMSCRIPTEN
674 friend void emscripten_one_frame();
675#endif
676 };
677
678}
679
680#endif
#define geo_assert(x)
Verifies that a condition is met.
Definition assert.h:149
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.
float get_font_size(index_t font_id) const
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.
void set_font_global_scale(float s)
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.
float get_font_global_scale() const
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
Vector with aligned memory allocation.
Definition memory.h:710
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:330