The open source OpenXR runtime
at main 100 lines 1.7 kB view raw
1// Copyright 2019, Collabora, Ltd. 2// SPDX-License-Identifier: BSL-1.0 3/*! 4 * @file 5 * @brief SDL2 functions to drive the GUI. 6 * @author Jakob Bornecrantz <jakob@collabora.com> 7 * @ingroup gui 8 */ 9 10 11#include "gui_common.h" 12 13#include <vector> 14 15 16struct gui_scene_manager 17{ 18public: 19 std::vector<gui_scene *> scenes = {}; 20 std::vector<gui_scene *> del = {}; 21}; 22 23extern "C" void 24gui_scene_push_front(struct gui_program *p, struct gui_scene *me) 25{ 26 auto &gsm = *p->gsm; 27 28 // Need to remove the scene if it is already on the list. 29 auto index = gsm.scenes.begin(); 30 for (auto scene : gsm.scenes) { 31 if (scene != me) { 32 index++; 33 continue; 34 } 35 36 gsm.scenes.erase(index); 37 break; 38 } 39 40 // Now push it to the front. 41 gsm.scenes.push_back(me); 42} 43 44extern "C" void 45gui_scene_delete_me(struct gui_program *p, struct gui_scene *me) 46{ 47 auto &gsm = *p->gsm; 48 49 auto index = gsm.scenes.begin(); 50 for (auto scene : gsm.scenes) { 51 if (scene != me) { 52 index++; 53 continue; 54 } 55 56 gsm.scenes.erase(index); 57 break; 58 } 59 60 gsm.del.push_back(me); 61} 62 63extern "C" void 64gui_scene_manager_render(struct gui_program *p) 65{ 66 auto &gsm = *p->gsm; 67 auto copy = gsm.scenes; 68 69 for (auto scene : copy) { 70 scene->render(scene, p); 71 } 72 73 copy = gsm.del; 74 gsm.del.clear(); 75 for (auto scene : copy) { 76 scene->destroy(scene, p); 77 } 78 79 // If there are no scenes left stop the program. 80 if (gsm.scenes.empty()) { 81 p->stopped = true; 82 } 83} 84 85extern "C" void 86gui_scene_manager_init(struct gui_program *p) 87{ 88 p->gsm = new gui_scene_manager; 89} 90 91extern "C" void 92gui_scene_manager_destroy(struct gui_program *p) 93{ 94 for (auto scene : p->gsm->scenes) { 95 scene->destroy(scene, p); 96 } 97 98 delete p->gsm; 99 p->gsm = NULL; 100}