Skip to content

Instantly share code, notes, and snippets.

@malustewart
Created March 2, 2020 20:53
Show Gist options
  • Save malustewart/ebe0f9fdb0ef9db016a2ccb7422228a5 to your computer and use it in GitHub Desktop.
Save malustewart/ebe0f9fdb0ef9db016a2ccb7422228a5 to your computer and use it in GitHub Desktop.
Dear ImGui basic examples
// dear imgui: standalone example application for Allegro 5
// If you are new to dear imgui, see examples/README.txt and documentation at the top of imgui.cpp.
#include <stdint.h>
#include <allegro5/allegro.h>
#include <allegro5/allegro_primitives.h>
#include "imgui.h"
#include "imgui_impl_allegro5.h"
/************************************************
Descomentar para correr los diferentes ejemplos
*************************************************/
//#define EJ_BEGIN_END_STACK
//#define EJ_BEGIN_END_TWO_WINDOWS
//#define EJ_BEGIN_END_SAME_ID
//#define EJ_BEGIN_END_SAME_LABEL
//#define EJ_BEGIN_END_CLOSING_BOOL
#define EJ_IMGUI_WIDGETS
//#define EJ_BUTTON
//#define EJ_CHECKBOX
int main(int, char**)
{
// ---------- Inicializacion de Allegro. ----------
al_init();
// Dear ImGui necesita Allegro para poder graficar. Para esto, usa el add-on de primitivas.
al_init_primitives_addon();
// El display usado es el de Allegro. Se registran sus eventos para poder cerrarlo
// apretando 'X' o para poder cambiar su tamanio en ejecucion.
al_set_new_display_flags(ALLEGRO_RESIZABLE);
ALLEGRO_DISPLAY* display = al_create_display(1280, 720);
ALLEGRO_EVENT_QUEUE* queue = al_create_event_queue();
al_register_event_source(queue, al_get_display_event_source(display));
// Tambien necesita Allegro para recibir eventos del usuario, por lo que hay que instalar
// el mouse y el teclado y registrar sus eventos.
al_install_keyboard(); al_register_event_source(queue, al_get_keyboard_event_source());
al_install_mouse(); al_register_event_source(queue, al_get_mouse_event_source());
// Setup de Dear ImGui
IMGUI_CHECKVERSION(); // Control de version de Dear ImGui
ImGui::CreateContext(); ImGui_ImplAllegro5_Init(display); // Inicializa Dear ImGui
ImGuiIO& io = ImGui::GetIO(); // Me permite obtener informacion y cambiar parametros del mouse y de teclado.
// Por ejemplo, puedo cambiar la velocidad a la que se repiten los caracteres
// cuando mantengo una tecla presionada, o puedo saber si el evento de
// mouse/teclado que acaba de llegar fue dentro de una ventana de ImGui o fuera.
ImGui::StyleColorsLight(); // Opcional: cambiar la paleta de colores default por otra
bool running = true; // true hasta que se cierre el display.
bool keep_open = true; // true hasta que se cierre la ventana a la que se asigna.
//variables auxiliares que usan los widgets
bool show_another_window = false;
bool show_demo_window = false;
unsigned int counter = 0;
float f = 0.0f;
ImVec4 clear_color = ImVec4(0.45f, 0.55f, 0.60f, 1.00f);
unsigned int intensity = 0;
bool checkbox_A_selected = false;
while (running)
{
ALLEGRO_EVENT ev;
while (al_get_next_event(queue, &ev))
{
ImGui_ImplAllegro5_ProcessEvent(&ev); // Mandar el evento a Dear ImGui para que lo procese
if (ev.type == ALLEGRO_EVENT_DISPLAY_CLOSE)
running = false;
if (ev.type == ALLEGRO_EVENT_DISPLAY_RESIZE)
{
ImGui_ImplAllegro5_InvalidateDeviceObjects();
al_acknowledge_resize(display);
ImGui_ImplAllegro5_CreateDeviceObjects();
}
// io.WantCaptureKeyboard devuelve true si el ultimo evento fue de teclado y ademas fue
// usado por el usuario para interactuar con las ventanas de Dear Imgui. Por este motivo,
// sabemos que no estaba dirigido a nuestra aplicacion principal y no debemos mandarselo a
// su dispatcher. Idem para io.WantCaptureMouse y los eventos de mouse
if (!io.WantCaptureKeyboard && !io.WantCaptureMouse)
{
// Dispatch a nuestra aplicacion principal
}
}
// Inicio el frame. Se realiza una vez por cada pantalla que dibujo.
ImGui_ImplAllegro5_NewFrame();
ImGui::NewFrame();
////////////////////////////////////////////////////////////////////////
//Ejemplos de uso de widgets (sacado del repo principal de DearImGui) //
////////////////////////////////////////////////////////////////////////
#ifdef EJ_IMGUI_WIDGETS
// 2. Show a simple window that we create ourselves. We use a Begin/End pair to created a named window.
if (show_demo_window)
ImGui::ShowDemoWindow(&show_demo_window);
// 2. Show a simple window that we create ourselves. We use a Begin/End pair to created a named window.
{
ImGui::Begin("Hello, world!"); // Create a window called "Hello, world!" and append into it.
ImGui::Text("This is some useful text."); // Display some text (you can use a format strings too)
ImGui::Checkbox("Demo Window", &show_demo_window); // Edit bools storing our window open/close state
ImGui::Checkbox("Another Window", &show_another_window);
ImGui::SliderFloat("float", &f, 0.0f, 1.0f); // Edit 1 float using a slider from 0.0f to 1.0f
ImGui::ColorEdit3("clear color", (float*)&clear_color); // Edit 3 floats representing a color
if (ImGui::Button("Button")) // Buttons return true when clicked (most widgets return true when edited/activated)
counter++;
ImGui::SameLine();
ImGui::Text("counter = %d", counter);
ImGui::Text("Application average %.3f ms/frame (%.1f FPS)", 1000.0f / ImGui::GetIO().Framerate, ImGui::GetIO().Framerate);
ImGui::End();
}
// 3. Show another simple window.
if (show_another_window)
{
ImGui::Begin("Another Window", &show_another_window); // Pass a pointer to our bool variable (the window will have a closing button that will clear the bool when clicked)
ImGui::Text("Hello from another window!");
if (ImGui::Button("Close Me"))
show_another_window = false;
ImGui::End();
}
#endif // EJ_BASIC_WIDGETS
#ifdef EJ_BUTTON
ImGui::Begin("Button Example");
if (ImGui::Button("Increase intensity"))
intensity++;
else if (ImGui::Button("Decrease Intensity"))
intensity--;
ImGui::Text("Intensity = %d", intensity);
ImGui::End();
#endif // EJ_BUTTON
#ifdef EJ_CHECKBOX
ImGui::Begin("Checkbox Example");
ImGui::Checkbox("Checkbox A", &checkbox_A_selected);
if (checkbox_A_selected)
ImGui::Text("Checkbox A is selected");
else
ImGui::Text("Checkbox A is not selected");
ImGui::End();
#endif // EJ_CHECKBOX
////////////////////////////////////////////////////////////////////////
//Ejemplos de uso de ImGui::Begin() y ImGui::End()
////////////////////////////////////////////////////////////////////////
#ifdef EJ_BEGIN_END_STACK
ImGui::Begin("Primera ventana");
ImGui::Text("Primer texto");
ImGui::Begin("Segunda ventana");
ImGui::Text("Segundo texto");
ImGui::End();
ImGui::Text("Tercer texto"); //Se va a escribir en la primer ventana
ImGui::End();
#endif
#ifdef EJ_BEGIN_END_TWO_WINDOWS
ImGui::Begin("Primera Ventana");
ImGui::Text("Primer Texto");
ImGui::End();
ImGui::Begin("Segunda Ventana");
ImGui::Text("Segundo Texto");
ImGui::End();
#endif // EJ_BEGIN_END_TWO_WINDOWS
#ifdef EJ_BEGIN_END_SAME_ID
ImGui::Begin("Label 1");
ImGui::Text("Primer texto");
ImGui::End();
ImGui::Begin("Label 2");
ImGui::Text("Segundo texto");
ImGui::End();
ImGui::Begin("Label 1");
ImGui::Text("Tercer texto"); //Se va a escribir en la primer ventana
ImGui::End();
#endif // EJ_BEGIN_END_SAME_ID
#ifdef EJ_BEGIN_END_SAME_LABEL
ImGui::Begin("Label A##1");
ImGui::Text("Primer texto");
ImGui::End();
ImGui::Begin("Label A##2");
ImGui::Text("Segundo texto");
ImGui::End();
#endif // EJ_BEGIN_END_SAME_LABEL
#ifdef EJ_BEGIN_END_CLOSING_BOOL
if (keep_open)
{
ImGui::Begin("Ventana que se cierra", &keep_open);
ImGui::Text("Tiene una 'X' porque puede cerrarse");
ImGui::End();
}
#endif // EJ_BEGIN_END_CLOSING_BOOL
// Rendering
ImGui::Render(); //No dibuja! Solamente calcula que es lo que tiene que dibujarse
// Puedo usar funciones de dibujo de Allegro ademas de las de
// ImGui.
// Todo lo que dibuje antes de ImGui_ImplAllegro5_RenderDrawData
// va a quedar detras de las ventanas de DearImGui, y todo lo
// que dibuje despues va a quedar encima de las ventanas de
// DearImGui.
al_clear_to_color(al_map_rgba_f(1,1,0.8,1)); //Va a quedar detras de las ventanas
ImGui_ImplAllegro5_RenderDrawData(ImGui::GetDrawData()); //Dibuja las ventanas, pero no hace al_flip_display()
//Todo lo que dibuje aca va a quedar por encima de las ventanas de DearImGui
al_flip_display(); //DearImGui nunca hace al_flip_display()
}
// Cleanup final
ImGui_ImplAllegro5_Shutdown();
ImGui::DestroyContext();
al_destroy_event_queue(queue);
al_destroy_display(display);
al_shutdown_primitives_addon();
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment