From 44179cd1909a70c8a13d4d593d2a96ffcf0c1b65 Mon Sep 17 00:00:00 2001 From: Fernando Velazquez Innella Date: Wed, 7 Aug 2024 14:35:11 -0400 Subject: [PATCH] st/gui: draw gui_widget_native_images with header, scale slider and rotation checkbox Part-of: --- src/xrt/state_trackers/gui/gui_scene_debug.c | 9 +++ .../gui/gui_widget_native_images.c | 68 +++++++++++++++++-- .../gui/gui_widget_native_images.h | 6 ++ 3 files changed, 76 insertions(+), 7 deletions(-) diff --git a/src/xrt/state_trackers/gui/gui_scene_debug.c b/src/xrt/state_trackers/gui/gui_scene_debug.c index 8d4436fe5..e8a224bdc 100644 --- a/src/xrt/state_trackers/gui/gui_scene_debug.c +++ b/src/xrt/state_trackers/gui/gui_scene_debug.c @@ -444,9 +444,18 @@ on_sink_debug_var(const char *name, void *ptr, struct draw_state *state) static void on_native_images_debug_var(const char *name, void *ptr, struct draw_state *state) { + bool gui_header = !state->inhibit_sink_headers; + struct debug_scene *ds = state->ds; struct u_native_images_debug *unid = (struct u_native_images_debug *)ptr; + if (gui_header) { + const ImGuiTreeNodeFlags_ flags = ImGuiTreeNodeFlags_DefaultOpen; + if (!igCollapsingHeaderBoolPtr(name, NULL, flags)) { + return; + } + } + struct gui_widget_native_images *gwni = gui_widget_native_images_storage_ensure(&ds->gwnis, unid); if (gwni == NULL) { return; diff --git a/src/xrt/state_trackers/gui/gui_widget_native_images.c b/src/xrt/state_trackers/gui/gui_widget_native_images.c index 351937e3e..5a36485e9 100644 --- a/src/xrt/state_trackers/gui/gui_widget_native_images.c +++ b/src/xrt/state_trackers/gui/gui_widget_native_images.c @@ -15,6 +15,7 @@ #include "util/u_native_images_debug.h" #include "gui_ogl.h" +#include "gui_imgui.h" #include "gui_widget_native_images.h" #include @@ -71,6 +72,52 @@ recreate_locked(struct gui_widget_native_images *gwni, struct u_native_images_de gwni->flip_y = unid->flip_y; } +/* + * + * Misc helpers and interface functions. + * + */ + +static void +window_draw_misc(struct gui_widget_native_images *gwni) +{ + igSliderFloat("", &gwni->scale, 20.0, 300.f, "Scale %f%%", ImGuiSliderFlags_None); + + static ImVec2 button_dims = {0, 0}; + + igSameLine(0.0f, 4.0f); + bool minus = igButton("-", button_dims); + + igSameLine(0.0f, 4.0f); + bool plus = igButton("+", button_dims); + + static const double scales[] = { + 25.0, 50.0, 100.0, 200.0, 300.0, + }; + + if (plus) { + for (uint32_t i = 0; i < ARRAY_SIZE(scales); i++) { + if (gwni->scale >= scales[i]) { + continue; + } + gwni->scale = scales[i]; + break; + } + } else if (minus) { + // Initial length always greater then 0 so safe. + for (uint32_t i = ARRAY_SIZE(scales); i-- > 0;) { + if (gwni->scale <= scales[i]) { + continue; + } + gwni->scale = scales[i]; + break; + } + } + + igSameLine(0, 30); + + igCheckbox("Rotate 180 degrees", &gwni->rotate_180); +} /* * @@ -83,6 +130,7 @@ gui_widget_native_images_init(struct gui_widget_native_images *gwni) { U_ZERO(gwni); gwni->active_index = GUI_WIDGET_SWAPCHAIN_INVALID_INDEX; + gwni->scale = 50.0f; } void @@ -115,15 +163,21 @@ gui_widget_native_images_render(struct gui_widget_native_images *gwni, struct gu return; } + igPushIDPtr(gwni); + + window_draw_misc(gwni); + uint32_t tex_id = gwni->textures[gwni->active_index]; - gui_ogl_draw_image( // - gwni->width, // width - gwni->height, // height - tex_id, // tex_id - 0.5f, // scale - false, // rotate_180 - gwni->flip_y); // flip_y + gui_ogl_draw_image( // + gwni->width, // width + gwni->height, // height + tex_id, // tex_id + gwni->scale / 100.0f, // scale + gwni->rotate_180, // rotate_180 + gwni->flip_y); // flip_y + + igPopID(); } void diff --git a/src/xrt/state_trackers/gui/gui_widget_native_images.h b/src/xrt/state_trackers/gui/gui_widget_native_images.h index bd9995f5a..911db5a3e 100644 --- a/src/xrt/state_trackers/gui/gui_widget_native_images.h +++ b/src/xrt/state_trackers/gui/gui_widget_native_images.h @@ -42,6 +42,12 @@ struct gui_widget_native_images //! Dimensions. uint32_t width, height; + //! Scale + float scale; + + //! Rotate the image by 180 degrees + bool rotate_180; + //! Set to GUI_WIDGET_SWAPCHAIN_INVALID_INDEX on invalid. uint32_t active_index;