mirror of
https://gitlab.freedesktop.org/monado/monado.git
synced 2025-01-01 12:46:12 +00:00
t/gui: Add scene manager
This commit is contained in:
parent
c474112782
commit
71b3de9c46
|
@ -18,6 +18,7 @@ set(SOURCE_FILES
|
||||||
gui_main.c
|
gui_main.c
|
||||||
gui_ogl.c
|
gui_ogl.c
|
||||||
gui_prober.c
|
gui_prober.c
|
||||||
|
gui_scene.cpp
|
||||||
gui_sdl2.c
|
gui_sdl2.c
|
||||||
../../../external/glad/gl.h
|
../../../external/glad/gl.h
|
||||||
../../../external/glad/gl.c
|
../../../external/glad/gl.c
|
||||||
|
|
|
@ -28,6 +28,7 @@ extern "C" {
|
||||||
struct xrt_device;
|
struct xrt_device;
|
||||||
struct xrt_prober;
|
struct xrt_prober;
|
||||||
struct time_state;
|
struct time_state;
|
||||||
|
struct gui_scene_manager;
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* Common struct holding state for the GUI interface.
|
* Common struct holding state for the GUI interface.
|
||||||
|
@ -42,6 +43,8 @@ struct program
|
||||||
bool stopped;
|
bool stopped;
|
||||||
bool initialized;
|
bool initialized;
|
||||||
|
|
||||||
|
struct gui_scene_manager *gsm;
|
||||||
|
|
||||||
struct
|
struct
|
||||||
{
|
{
|
||||||
SDL_Surface *sf;
|
SDL_Surface *sf;
|
||||||
|
@ -59,6 +62,15 @@ struct program
|
||||||
struct gui_ogl_texture *texs[256];
|
struct gui_ogl_texture *texs[256];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* A single currently running scene.
|
||||||
|
*/
|
||||||
|
struct gui_scene
|
||||||
|
{
|
||||||
|
void (*render)(struct gui_scene *, struct program *);
|
||||||
|
void (*destroy)(struct gui_scene *);
|
||||||
|
};
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* A OpenGL texture.
|
* A OpenGL texture.
|
||||||
*
|
*
|
||||||
|
@ -156,6 +168,46 @@ gui_ogl_sink_create(const char *name,
|
||||||
void
|
void
|
||||||
gui_ogl_sink_update(struct gui_ogl_texture *);
|
gui_ogl_sink_update(struct gui_ogl_texture *);
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* Push the scene to the top of the lists.
|
||||||
|
*
|
||||||
|
* @ingroup gui
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
gui_scene_push_front(struct program *p, struct gui_scene *me);
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* Put a scene on the delete list, also removes it from any other list.
|
||||||
|
*
|
||||||
|
* @ingroup gui
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
gui_scene_delete_me(struct program *p, struct gui_scene *me);
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* Render the scenes.
|
||||||
|
*
|
||||||
|
* @ingroup gui
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
gui_scene_manager_render(struct program *p);
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* Initialize the scene manager.
|
||||||
|
*
|
||||||
|
* @ingroup gui
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
gui_scene_manager_init(struct program *p);
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* Destroy the scene manager.
|
||||||
|
*
|
||||||
|
* @ingroup gui
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
gui_scene_manager_destroy(struct program *p);
|
||||||
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|
96
src/xrt/targets/gui/gui_scene.cpp
Normal file
96
src/xrt/targets/gui/gui_scene.cpp
Normal file
|
@ -0,0 +1,96 @@
|
||||||
|
// Copyright 2019, Collabora, Ltd.
|
||||||
|
// SPDX-License-Identifier: BSL-1.0
|
||||||
|
/*!
|
||||||
|
* @file
|
||||||
|
* @brief SDL2 functions to drive the GUI.
|
||||||
|
* @author Jakob Bornecrantz <jakob@collabora.com>
|
||||||
|
* @ingroup gui
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#include "gui_common.h"
|
||||||
|
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
|
||||||
|
struct gui_scene_manager
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
std::vector<gui_scene *> scenes = {};
|
||||||
|
std::vector<gui_scene *> del = {};
|
||||||
|
};
|
||||||
|
|
||||||
|
extern "C" void
|
||||||
|
gui_scene_push_front(struct program *p, struct gui_scene *me)
|
||||||
|
{
|
||||||
|
auto &gsm = *p->gsm;
|
||||||
|
|
||||||
|
// Need to remove the scene if it is already on the list.
|
||||||
|
auto index = gsm.scenes.begin();
|
||||||
|
for (auto scene : gsm.scenes) {
|
||||||
|
if (scene != me) {
|
||||||
|
index++;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
gsm.scenes.erase(index);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Now push it to the front.
|
||||||
|
gsm.scenes.push_back(me);
|
||||||
|
}
|
||||||
|
|
||||||
|
extern "C" void
|
||||||
|
gui_scene_delete_me(struct program *p, struct gui_scene *me)
|
||||||
|
{
|
||||||
|
auto &gsm = *p->gsm;
|
||||||
|
|
||||||
|
auto index = gsm.scenes.begin();
|
||||||
|
for (auto scene : gsm.scenes) {
|
||||||
|
if (scene != me) {
|
||||||
|
index++;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
gsm.scenes.erase(index);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
gsm.del.push_back(me);
|
||||||
|
}
|
||||||
|
|
||||||
|
extern "C" void
|
||||||
|
gui_scene_manager_render(struct program *p)
|
||||||
|
{
|
||||||
|
auto &gsm = *p->gsm;
|
||||||
|
auto copy = gsm.scenes;
|
||||||
|
|
||||||
|
for (auto scene : copy) {
|
||||||
|
scene->render(scene, p);
|
||||||
|
}
|
||||||
|
|
||||||
|
copy = gsm.del;
|
||||||
|
gsm.del.clear();
|
||||||
|
for (auto scene : copy) {
|
||||||
|
scene->destroy(scene);
|
||||||
|
}
|
||||||
|
|
||||||
|
// If there are no scenes left stop the program.
|
||||||
|
if (gsm.scenes.size() == 0) {
|
||||||
|
p->stopped = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
extern "C" void
|
||||||
|
gui_scene_manager_init(struct program *p)
|
||||||
|
{
|
||||||
|
p->gsm = new gui_scene_manager;
|
||||||
|
}
|
||||||
|
|
||||||
|
extern "C" void
|
||||||
|
gui_scene_manager_destroy(struct program *p)
|
||||||
|
{
|
||||||
|
delete p->gsm;
|
||||||
|
p->gsm = NULL;
|
||||||
|
}
|
Loading…
Reference in a new issue