2020-10-12 17:34:22 +02:00
// dear imgui: Renderer + Platform Backend for Allegro 5
2018-06-08 19:37:33 +02:00
// (Info: Allegro 5 is a cross-platform general purpose library for handling windows, inputs, graphics, etc.)
2016-03-24 11:00:47 +01:00
2018-02-05 20:34:11 +01:00
// Implemented features:
2019-10-16 11:23:15 +02:00
// [X] Renderer: User texture binding. Use 'ALLEGRO_BITMAP*' as ImTextureID. Read the FAQ about ImTextureID!
2018-06-13 19:22:22 +02:00
// [X] Platform: Clipboard support (from Allegro 5.1.12)
2018-06-11 12:33:51 +02:00
// [X] Platform: Mouse cursor shape and visibility. Disable with 'io.ConfigFlags |= ImGuiConfigFlags_NoMouseCursorChange'.
// Issues:
2018-09-20 10:37:55 +02:00
// [ ] Renderer: The renderer is suboptimal as we need to unindex our buffers and convert vertices manually.
// [ ] Platform: Missing gamepad support.
2016-10-15 11:36:43 +02:00
2021-05-27 13:59:35 +02:00
// You can use unmodified imgui_impl_* files in your project. See examples/ folder for examples of using this.
// Prefer including the entire imgui/ repository into your project (either as a copy or as a submodule), and only build the backends you need.
2020-10-14 12:22:53 +02:00
// If you are new to Dear ImGui, read documentation from the docs/ folder + read the top of imgui.cpp.
// Read online: https://github.com/ocornut/imgui/tree/master/docs
2015-07-08 19:34:36 +02:00
2018-02-16 19:18:16 +01:00
// CHANGELOG
// (minor and older changes stripped away, please see git history for details)
2021-02-07 12:36:54 +01:00
// 2021-05-19: Renderer: Replaced direct access to ImDrawCmd::TextureId with a call to ImDrawCmd::GetTexID(). (will become a requirement)
2021-02-17 19:29:07 +01:00
// 2021-02-18: Change blending equation to preserve alpha in output buffer.
2020-08-10 15:31:48 +02:00
// 2020-08-10: Inputs: Fixed horizontal mouse wheel direction.
2019-12-05 15:43:05 +01:00
// 2019-12-05: Inputs: Added support for ImGuiMouseCursor_NotAllowed mouse cursor.
2019-07-22 03:39:50 +02:00
// 2019-07-21: Inputs: Added mapping for ImGuiKey_KeyPadEnter.
2019-05-11 10:33:56 +02:00
// 2019-05-11: Inputs: Don't filter character value from ALLEGRO_EVENT_KEY_CHAR before calling AddInputCharacter().
2019-04-30 22:28:29 +02:00
// 2019-04-30: Renderer: Added support for special ImDrawCallback_ResetRenderState callback to reset render state.
2018-11-30 16:46:43 +01:00
// 2018-11-30: Platform: Added touchscreen support.
2018-11-30 18:18:15 +01:00
// 2018-11-30: Misc: Setting up io.BackendPlatformName/io.BackendRendererName so they can be displayed in the About Window.
2018-06-13 19:22:22 +02:00
// 2018-06-13: Platform: Added clipboard support (from Allegro 5.1.12).
// 2018-06-13: Renderer: Use draw_data->DisplayPos and draw_data->DisplaySize to setup projection matrix and clipping rectangle.
// 2018-06-13: Renderer: Backup/restore transform and clipping rectangle.
2018-06-11 12:33:51 +02:00
// 2018-06-11: Misc: Setup io.BackendFlags ImGuiBackendFlags_HasMouseCursors flag + honor ImGuiConfigFlags_NoMouseCursorChange flag.
2018-04-18 21:55:12 +02:00
// 2018-04-18: Misc: Renamed file from imgui_impl_a5.cpp to imgui_impl_allegro5.cpp.
2019-11-20 11:58:25 +01:00
// 2018-04-18: Misc: Added support for 32-bit vertex indices to avoid conversion at runtime. Added imconfig_allegro5.h to enforce 32-bit indices when included from imgui.h.
2018-06-08 19:37:33 +02:00
// 2018-02-16: Misc: Obsoleted the io.RenderDrawListsFn callback and exposed ImGui_ImplAllegro5_RenderDrawData() in the .h file so you can call it yourself.
2018-02-16 19:18:16 +01:00
// 2018-02-06: Misc: Removed call to ImGui::Shutdown() which is not available from 1.60 WIP, user needs to call CreateContext/DestroyContext themselves.
// 2018-02-06: Inputs: Added mapping for ImGuiKey_Space.
2015-07-08 19:34:36 +02:00
# include <stdint.h> // uint64_t
# include <cstring> // memcpy
2018-01-29 14:38:46 +01:00
# include "imgui.h"
2018-04-18 21:55:12 +02:00
# include "imgui_impl_allegro5.h"
2018-06-13 19:22:22 +02:00
// Allegro
2015-07-08 19:34:36 +02:00
# include <allegro5/allegro.h>
# include <allegro5/allegro_primitives.h>
# ifdef _WIN32
# include <allegro5/allegro_windows.h>
# endif
2018-06-13 19:22:22 +02:00
# define ALLEGRO_HAS_CLIPBOARD (ALLEGRO_VERSION_INT >= ((5 << 24) | (1 << 16) | (12 << 8))) // Clipboard only supported from Allegro 5.1.12
// Visual Studio warnings
# ifdef _MSC_VER
# pragma warning (disable: 4127) // condition expression is constant
# endif
2015-07-08 19:34:36 +02:00
2015-07-08 19:53:30 +02:00
// Data
2015-07-08 20:16:50 +02:00
static ALLEGRO_DISPLAY * g_Display = NULL ;
2015-07-08 20:41:09 +02:00
static ALLEGRO_BITMAP * g_Texture = NULL ;
2015-07-08 20:16:50 +02:00
static double g_Time = 0.0 ;
static ALLEGRO_MOUSE_CURSOR * g_MouseCursorInvisible = NULL ;
2015-07-08 20:41:09 +02:00
static ALLEGRO_VERTEX_DECL * g_VertexDecl = NULL ;
2018-06-13 19:22:22 +02:00
static char * g_ClipboardTextData = NULL ;
2015-07-08 19:34:36 +02:00
2015-07-08 20:41:09 +02:00
struct ImDrawVertAllegro
{
ImVec2 pos ;
ImVec2 uv ;
ALLEGRO_COLOR col ;
} ;
2015-07-08 19:53:30 +02:00
2019-04-30 22:15:59 +02:00
static void ImGui_ImplAllegro5_SetupRenderState ( ImDrawData * draw_data )
2015-07-08 20:41:09 +02:00
{
2019-04-30 22:15:59 +02:00
// Setup blending
2021-02-17 19:29:07 +01:00
al_set_separate_blender ( ALLEGRO_ADD , ALLEGRO_ALPHA , ALLEGRO_INVERSE_ALPHA , ALLEGRO_ADD , ALLEGRO_ONE , ALLEGRO_INVERSE_ALPHA ) ;
2015-07-08 19:53:30 +02:00
2018-06-13 19:22:22 +02:00
// Setup orthographic projection matrix
2018-09-13 16:44:08 +02:00
// Our visible imgui space lies from draw_data->DisplayPos (top left) to draw_data->DisplayPos+data_data->DisplaySize (bottom right).
2018-06-13 19:22:22 +02:00
{
float L = draw_data - > DisplayPos . x ;
float R = draw_data - > DisplayPos . x + draw_data - > DisplaySize . x ;
float T = draw_data - > DisplayPos . y ;
float B = draw_data - > DisplayPos . y + draw_data - > DisplaySize . y ;
ALLEGRO_TRANSFORM transform ;
al_identity_transform ( & transform ) ;
al_use_transform ( & transform ) ;
al_orthographic_transform ( & transform , L , T , 1.0f , R , B , - 1.0f ) ;
al_use_projection_transform ( & transform ) ;
}
2019-04-30 22:15:59 +02:00
}
// Render function.
void ImGui_ImplAllegro5_RenderDrawData ( ImDrawData * draw_data )
{
// Avoid rendering when minimized
if ( draw_data - > DisplaySize . x < = 0.0f | | draw_data - > DisplaySize . y < = 0.0f )
return ;
// Backup Allegro state that will be modified
ALLEGRO_TRANSFORM last_transform = * al_get_current_transform ( ) ;
ALLEGRO_TRANSFORM last_projection_transform = * al_get_current_projection_transform ( ) ;
int last_clip_x , last_clip_y , last_clip_w , last_clip_h ;
al_get_clipping_rectangle ( & last_clip_x , & last_clip_y , & last_clip_w , & last_clip_h ) ;
int last_blender_op , last_blender_src , last_blender_dst ;
al_get_blender ( & last_blender_op , & last_blender_src , & last_blender_dst ) ;
// Setup desired render state
ImGui_ImplAllegro5_SetupRenderState ( draw_data ) ;
2018-06-13 19:22:22 +02:00
2019-04-30 22:15:59 +02:00
// Render command lists
2016-03-26 15:43:45 +01:00
for ( int n = 0 ; n < draw_data - > CmdListsCount ; n + + )
2015-07-08 19:53:30 +02:00
{
2015-07-08 20:55:40 +02:00
const ImDrawList * cmd_list = draw_data - > CmdLists [ n ] ;
2015-07-08 20:41:09 +02:00
2018-06-13 19:22:22 +02:00
// Allegro's implementation of al_draw_indexed_prim() for DX9 is completely broken. Unindex our buffers ourselves.
2019-11-20 11:58:25 +01:00
// FIXME-OPT: Unfortunately Allegro doesn't support 32-bit packed colors so we have to convert them to 4 float as well..
2015-07-08 20:41:09 +02:00
static ImVector < ImDrawVertAllegro > vertices ;
2018-06-13 19:22:22 +02:00
vertices . resize ( cmd_list - > IdxBuffer . Size ) ;
for ( int i = 0 ; i < cmd_list - > IdxBuffer . Size ; i + + )
2015-07-08 19:53:30 +02:00
{
2018-06-13 19:22:22 +02:00
const ImDrawVert * src_v = & cmd_list - > VtxBuffer [ cmd_list - > IdxBuffer [ i ] ] ;
ImDrawVertAllegro * dst_v = & vertices [ i ] ;
dst_v - > pos = src_v - > pos ;
dst_v - > uv = src_v - > uv ;
unsigned char * c = ( unsigned char * ) & src_v - > col ;
dst_v - > col = al_map_rgba ( c [ 0 ] , c [ 1 ] , c [ 2 ] , c [ 3 ] ) ;
2015-07-08 19:53:30 +02:00
}
2015-07-08 20:41:09 +02:00
2018-04-18 21:51:14 +02:00
const int * indices = NULL ;
if ( sizeof ( ImDrawIdx ) = = 2 )
{
2018-09-13 16:44:08 +02:00
// FIXME-OPT: Unfortunately Allegro doesn't support 16-bit indices.. You can '#define ImDrawIdx int' in imconfig.h to request Dear ImGui to output 32-bit indices.
2018-04-18 21:51:14 +02:00
// Otherwise, we convert them from 16-bit to 32-bit at runtime here, which works perfectly but is a little wasteful.
static ImVector < int > indices_converted ;
indices_converted . resize ( cmd_list - > IdxBuffer . Size ) ;
for ( int i = 0 ; i < cmd_list - > IdxBuffer . Size ; + + i )
indices_converted [ i ] = ( int ) cmd_list - > IdxBuffer . Data [ i ] ;
indices = indices_converted . Data ;
}
else if ( sizeof ( ImDrawIdx ) = = 4 )
{
indices = ( const int * ) cmd_list - > IdxBuffer . Data ;
}
2015-07-08 20:55:40 +02:00
2019-02-11 18:38:07 +01:00
// Render command lists
2015-07-08 20:55:40 +02:00
int idx_offset = 0 ;
2019-02-11 18:38:07 +01:00
ImVec2 clip_off = draw_data - > DisplayPos ;
2016-09-03 19:24:57 +02:00
for ( int cmd_i = 0 ; cmd_i < cmd_list - > CmdBuffer . Size ; cmd_i + + )
2015-07-08 19:53:30 +02:00
{
2015-07-08 20:55:40 +02:00
const ImDrawCmd * pcmd = & cmd_list - > CmdBuffer [ cmd_i ] ;
2016-03-26 15:43:45 +01:00
if ( pcmd - > UserCallback )
2015-07-08 19:53:30 +02:00
{
2019-04-30 22:15:59 +02:00
// User callback, registered via ImDrawList::AddCallback()
// (ImDrawCallback_ResetRenderState is a special callback value used by the user to request the renderer to reset render state.)
if ( pcmd - > UserCallback = = ImDrawCallback_ResetRenderState )
ImGui_ImplAllegro5_SetupRenderState ( draw_data ) ;
else
pcmd - > UserCallback ( cmd_list , pcmd ) ;
2015-07-08 19:53:30 +02:00
}
2016-03-26 15:43:45 +01:00
else
2015-07-08 19:53:30 +02:00
{
2019-04-30 22:15:59 +02:00
// Draw
2021-02-07 12:36:54 +01:00
ALLEGRO_BITMAP * texture = ( ALLEGRO_BITMAP * ) pcmd - > GetTexID ( ) ;
2019-02-11 18:38:07 +01:00
al_set_clipping_rectangle ( pcmd - > ClipRect . x - clip_off . x , pcmd - > ClipRect . y - clip_off . y , pcmd - > ClipRect . z - pcmd - > ClipRect . x , pcmd - > ClipRect . w - pcmd - > ClipRect . y ) ;
2018-06-13 19:22:22 +02:00
al_draw_prim ( & vertices [ 0 ] , g_VertexDecl , texture , idx_offset , idx_offset + pcmd - > ElemCount , ALLEGRO_PRIM_TRIANGLE_LIST ) ;
2015-07-08 19:53:30 +02:00
}
2015-07-08 20:55:40 +02:00
idx_offset + = pcmd - > ElemCount ;
2015-07-08 19:53:30 +02:00
}
2015-07-08 19:34:36 +02:00
}
2018-06-13 19:22:22 +02:00
// Restore modified Allegro state
al_set_blender ( last_blender_op , last_blender_src , last_blender_dst ) ;
al_set_clipping_rectangle ( last_clip_x , last_clip_y , last_clip_w , last_clip_h ) ;
al_use_transform ( & last_transform ) ;
al_use_projection_transform ( & last_projection_transform ) ;
2015-07-08 19:34:36 +02:00
}
2018-06-08 19:37:33 +02:00
bool ImGui_ImplAllegro5_CreateDeviceObjects ( )
2015-07-08 19:34:36 +02:00
{
2015-11-29 15:54:05 +01:00
// Build texture atlas
2020-06-30 15:31:54 +02:00
ImGuiIO & io = ImGui : : GetIO ( ) ;
2019-03-29 16:17:04 +01:00
unsigned char * pixels ;
2015-07-08 19:53:30 +02:00
int width , height ;
io . Fonts - > GetTexDataAsRGBA32 ( & pixels , & width , & height ) ;
// Create texture
int flags = al_get_new_bitmap_flags ( ) ;
int fmt = al_get_new_bitmap_format ( ) ;
2020-06-30 15:31:54 +02:00
al_set_new_bitmap_flags ( ALLEGRO_MEMORY_BITMAP | ALLEGRO_MIN_LINEAR | ALLEGRO_MAG_LINEAR ) ;
2015-07-08 19:53:30 +02:00
al_set_new_bitmap_format ( ALLEGRO_PIXEL_FORMAT_ABGR_8888_LE ) ;
ALLEGRO_BITMAP * img = al_create_bitmap ( width , height ) ;
al_set_new_bitmap_flags ( flags ) ;
al_set_new_bitmap_format ( fmt ) ;
2016-03-26 15:43:45 +01:00
if ( ! img )
2015-07-08 19:53:30 +02:00
return false ;
2020-06-30 15:31:54 +02:00
ALLEGRO_LOCKED_REGION * locked_img = al_lock_bitmap ( img , al_get_bitmap_format ( img ) , ALLEGRO_LOCK_WRITEONLY ) ;
2016-03-26 15:43:45 +01:00
if ( ! locked_img )
2015-07-08 19:53:30 +02:00
{
al_destroy_bitmap ( img ) ;
return false ;
}
2020-06-30 15:31:54 +02:00
memcpy ( locked_img - > data , pixels , sizeof ( int ) * width * height ) ;
2015-07-08 19:53:30 +02:00
al_unlock_bitmap ( img ) ;
// Convert software texture to hardware texture.
ALLEGRO_BITMAP * cloned_img = al_clone_bitmap ( img ) ;
2015-07-08 19:34:36 +02:00
al_destroy_bitmap ( img ) ;
2016-03-26 15:43:45 +01:00
if ( ! cloned_img )
2015-07-08 19:53:30 +02:00
return false ;
2015-07-08 19:34:36 +02:00
2015-07-08 19:53:30 +02:00
// Store our identifier
2021-02-03 18:30:26 +01:00
io . Fonts - > SetTexID ( ( void * ) cloned_img ) ;
2015-07-08 20:41:09 +02:00
g_Texture = cloned_img ;
2015-07-08 19:34:36 +02:00
2015-07-08 20:16:50 +02:00
// Create an invisible mouse cursor
// Because al_hide_mouse_cursor() seems to mess up with the actual inputs..
2020-06-30 15:31:54 +02:00
ALLEGRO_BITMAP * mouse_cursor = al_create_bitmap ( 8 , 8 ) ;
2015-07-08 20:16:50 +02:00
g_MouseCursorInvisible = al_create_mouse_cursor ( mouse_cursor , 0 , 0 ) ;
al_destroy_bitmap ( mouse_cursor ) ;
2015-07-08 19:53:30 +02:00
return true ;
2015-07-08 19:34:36 +02:00
}
2018-06-08 19:37:33 +02:00
void ImGui_ImplAllegro5_InvalidateDeviceObjects ( )
2015-07-08 19:34:36 +02:00
{
2016-03-26 15:43:45 +01:00
if ( g_Texture )
2015-07-08 19:53:30 +02:00
{
2021-02-03 18:30:26 +01:00
ImGuiIO & io = ImGui : : GetIO ( ) ;
io . Fonts - > SetTexID ( NULL ) ;
2015-07-08 20:41:09 +02:00
al_destroy_bitmap ( g_Texture ) ;
g_Texture = NULL ;
2015-07-08 19:53:30 +02:00
}
2015-07-08 20:16:50 +02:00
if ( g_MouseCursorInvisible )
{
al_destroy_mouse_cursor ( g_MouseCursorInvisible ) ;
g_MouseCursorInvisible = NULL ;
}
2015-07-08 19:34:36 +02:00
}
2018-06-13 19:22:22 +02:00
# if ALLEGRO_HAS_CLIPBOARD
static const char * ImGui_ImplAllegro5_GetClipboardText ( void * )
{
if ( g_ClipboardTextData )
al_free ( g_ClipboardTextData ) ;
g_ClipboardTextData = al_get_clipboard_text ( g_Display ) ;
return g_ClipboardTextData ;
}
static void ImGui_ImplAllegro5_SetClipboardText ( void * , const char * text )
{
al_set_clipboard_text ( g_Display , text ) ;
}
# endif
2018-06-08 19:37:33 +02:00
bool ImGui_ImplAllegro5_Init ( ALLEGRO_DISPLAY * display )
2015-07-08 19:34:36 +02:00
{
2015-07-08 19:53:30 +02:00
g_Display = display ;
2016-03-26 15:43:45 +01:00
2020-10-12 17:34:22 +02:00
// Setup backend capabilities flags
2018-06-11 12:33:51 +02:00
ImGuiIO & io = ImGui : : GetIO ( ) ;
io . BackendFlags | = ImGuiBackendFlags_HasMouseCursors ; // We can honor GetMouseCursor() values (optional)
2018-11-30 18:18:15 +01:00
io . BackendPlatformName = io . BackendRendererName = " imgui_impl_allegro5 " ;
2018-06-11 12:33:51 +02:00
2016-03-26 15:43:45 +01:00
// Create custom vertex declaration.
2019-11-20 11:58:25 +01:00
// Unfortunately Allegro doesn't support 32-bit packed colors so we have to convert them to 4 floats.
2015-07-08 20:41:09 +02:00
// We still use a custom declaration to use 'ALLEGRO_PRIM_TEX_COORD' instead of 'ALLEGRO_PRIM_TEX_COORD_PIXEL' else we can't do a reliable conversion.
2016-03-26 15:43:45 +01:00
ALLEGRO_VERTEX_ELEMENT elems [ ] =
2015-07-08 20:41:09 +02:00
{
2018-01-05 22:05:02 +01:00
{ ALLEGRO_PRIM_POSITION , ALLEGRO_PRIM_FLOAT_2 , IM_OFFSETOF ( ImDrawVertAllegro , pos ) } ,
{ ALLEGRO_PRIM_TEX_COORD , ALLEGRO_PRIM_FLOAT_2 , IM_OFFSETOF ( ImDrawVertAllegro , uv ) } ,
{ ALLEGRO_PRIM_COLOR_ATTR , 0 , IM_OFFSETOF ( ImDrawVertAllegro , col ) } ,
2015-07-08 20:41:09 +02:00
{ 0 , 0 , 0 }
} ;
g_VertexDecl = al_create_vertex_decl ( elems , sizeof ( ImDrawVertAllegro ) ) ;
2015-07-08 19:53:30 +02:00
io . KeyMap [ ImGuiKey_Tab ] = ALLEGRO_KEY_TAB ;
io . KeyMap [ ImGuiKey_LeftArrow ] = ALLEGRO_KEY_LEFT ;
io . KeyMap [ ImGuiKey_RightArrow ] = ALLEGRO_KEY_RIGHT ;
io . KeyMap [ ImGuiKey_UpArrow ] = ALLEGRO_KEY_UP ;
io . KeyMap [ ImGuiKey_DownArrow ] = ALLEGRO_KEY_DOWN ;
2015-07-08 20:04:13 +02:00
io . KeyMap [ ImGuiKey_PageUp ] = ALLEGRO_KEY_PGUP ;
io . KeyMap [ ImGuiKey_PageDown ] = ALLEGRO_KEY_PGDN ;
2015-07-08 19:53:30 +02:00
io . KeyMap [ ImGuiKey_Home ] = ALLEGRO_KEY_HOME ;
io . KeyMap [ ImGuiKey_End ] = ALLEGRO_KEY_END ;
2018-01-08 15:30:39 +01:00
io . KeyMap [ ImGuiKey_Insert ] = ALLEGRO_KEY_INSERT ;
2015-07-08 19:53:30 +02:00
io . KeyMap [ ImGuiKey_Delete ] = ALLEGRO_KEY_DELETE ;
io . KeyMap [ ImGuiKey_Backspace ] = ALLEGRO_KEY_BACKSPACE ;
2018-02-06 19:29:31 +01:00
io . KeyMap [ ImGuiKey_Space ] = ALLEGRO_KEY_SPACE ;
2015-07-08 19:53:30 +02:00
io . KeyMap [ ImGuiKey_Enter ] = ALLEGRO_KEY_ENTER ;
io . KeyMap [ ImGuiKey_Escape ] = ALLEGRO_KEY_ESCAPE ;
2019-07-22 03:39:50 +02:00
io . KeyMap [ ImGuiKey_KeyPadEnter ] = ALLEGRO_KEY_PAD_ENTER ;
2015-07-08 19:53:30 +02:00
io . KeyMap [ ImGuiKey_A ] = ALLEGRO_KEY_A ;
io . KeyMap [ ImGuiKey_C ] = ALLEGRO_KEY_C ;
io . KeyMap [ ImGuiKey_V ] = ALLEGRO_KEY_V ;
io . KeyMap [ ImGuiKey_X ] = ALLEGRO_KEY_X ;
io . KeyMap [ ImGuiKey_Y ] = ALLEGRO_KEY_Y ;
io . KeyMap [ ImGuiKey_Z ] = ALLEGRO_KEY_Z ;
2018-11-30 16:46:43 +01:00
io . MousePos = ImVec2 ( - FLT_MAX , - FLT_MAX ) ;
2015-07-08 19:53:30 +02:00
2018-06-13 19:22:22 +02:00
# if ALLEGRO_HAS_CLIPBOARD
io . SetClipboardTextFn = ImGui_ImplAllegro5_SetClipboardText ;
io . GetClipboardTextFn = ImGui_ImplAllegro5_GetClipboardText ;
io . ClipboardUserData = NULL ;
# endif
2015-07-08 19:53:30 +02:00
return true ;
2015-07-08 19:34:36 +02:00
}
2018-06-08 19:37:33 +02:00
void ImGui_ImplAllegro5_Shutdown ( )
2015-07-08 19:34:36 +02:00
{
2018-06-08 19:37:33 +02:00
ImGui_ImplAllegro5_InvalidateDeviceObjects ( ) ;
2019-01-04 13:11:24 +01:00
2018-06-13 19:22:22 +02:00
g_Display = NULL ;
2019-01-04 13:11:24 +01:00
g_Time = 0.0 ;
if ( g_VertexDecl )
al_destroy_vertex_decl ( g_VertexDecl ) ;
g_VertexDecl = NULL ;
2018-06-13 19:22:22 +02:00
if ( g_ClipboardTextData )
al_free ( g_ClipboardTextData ) ;
g_ClipboardTextData = NULL ;
2015-07-08 19:34:36 +02:00
}
Examples: Added a bunch of comments/referencs related to io.WantCaptureMouse, io.WantCaptureKeyboard (#1262, #1237, #1219, #635, #1058, #1051, #912, #533, #703, #446, #459, #364, #213, #52, and more)
2017-11-01 14:24:09 +01:00
// You can read the io.WantCaptureMouse, io.WantCaptureKeyboard flags to tell if dear imgui wants to use your inputs.
// - When io.WantCaptureMouse is true, do not dispatch mouse input data to your main application.
// - When io.WantCaptureKeyboard is true, do not dispatch keyboard input data to your main application.
// Generally you may always pass all inputs to dear imgui, and hide them from your application based on those two flags.
2020-06-30 15:31:54 +02:00
bool ImGui_ImplAllegro5_ProcessEvent ( ALLEGRO_EVENT * ev )
2015-07-08 19:34:36 +02:00
{
2018-06-11 12:33:51 +02:00
ImGuiIO & io = ImGui : : GetIO ( ) ;
2015-07-08 19:53:30 +02:00
2016-03-26 15:43:45 +01:00
switch ( ev - > type )
2015-07-08 19:53:30 +02:00
{
case ALLEGRO_EVENT_MOUSE_AXES :
2018-11-30 16:46:43 +01:00
if ( ev - > mouse . display = = g_Display )
{
io . MouseWheel + = ev - > mouse . dz ;
2020-08-10 15:31:48 +02:00
io . MouseWheelH - = ev - > mouse . dw ;
2018-11-30 16:46:43 +01:00
io . MousePos = ImVec2 ( ev - > mouse . x , ev - > mouse . y ) ;
}
return true ;
case ALLEGRO_EVENT_MOUSE_BUTTON_DOWN :
case ALLEGRO_EVENT_MOUSE_BUTTON_UP :
if ( ev - > mouse . display = = g_Display & & ev - > mouse . button < = 5 )
io . MouseDown [ ev - > mouse . button - 1 ] = ( ev - > type = = ALLEGRO_EVENT_MOUSE_BUTTON_DOWN ) ;
return true ;
case ALLEGRO_EVENT_TOUCH_MOVE :
if ( ev - > touch . display = = g_Display )
io . MousePos = ImVec2 ( ev - > touch . x , ev - > touch . y ) ;
return true ;
case ALLEGRO_EVENT_TOUCH_BEGIN :
case ALLEGRO_EVENT_TOUCH_END :
case ALLEGRO_EVENT_TOUCH_CANCEL :
if ( ev - > touch . display = = g_Display & & ev - > touch . primary )
io . MouseDown [ 0 ] = ( ev - > type = = ALLEGRO_EVENT_TOUCH_BEGIN ) ;
return true ;
case ALLEGRO_EVENT_MOUSE_LEAVE_DISPLAY :
if ( ev - > mouse . display = = g_Display )
io . MousePos = ImVec2 ( - FLT_MAX , - FLT_MAX ) ;
2015-07-08 19:53:30 +02:00
return true ;
case ALLEGRO_EVENT_KEY_CHAR :
2016-03-26 15:43:45 +01:00
if ( ev - > keyboard . display = = g_Display )
2020-05-20 17:48:21 +02:00
if ( ev - > keyboard . unichar ! = 0 )
io . AddInputCharacter ( ( unsigned int ) ev - > keyboard . unichar ) ;
2015-07-08 19:53:30 +02:00
return true ;
2015-07-08 20:04:13 +02:00
case ALLEGRO_EVENT_KEY_DOWN :
2015-07-08 19:53:30 +02:00
case ALLEGRO_EVENT_KEY_UP :
if ( ev - > keyboard . display = = g_Display )
2015-07-08 20:04:13 +02:00
io . KeysDown [ ev - > keyboard . keycode ] = ( ev - > type = = ALLEGRO_EVENT_KEY_DOWN ) ;
2015-07-08 19:53:30 +02:00
return true ;
2015-07-08 19:34:36 +02:00
}
2015-07-08 19:53:30 +02:00
return false ;
2015-07-08 19:34:36 +02:00
}
2018-06-11 12:33:51 +02:00
static void ImGui_ImplAllegro5_UpdateMouseCursor ( )
{
ImGuiIO & io = ImGui : : GetIO ( ) ;
if ( io . ConfigFlags & ImGuiConfigFlags_NoMouseCursorChange )
return ;
ImGuiMouseCursor imgui_cursor = ImGui : : GetMouseCursor ( ) ;
if ( io . MouseDrawCursor | | imgui_cursor = = ImGuiMouseCursor_None )
{
// Hide OS mouse cursor if imgui is drawing it or if it wants no cursor
al_set_mouse_cursor ( g_Display , g_MouseCursorInvisible ) ;
}
else
{
ALLEGRO_SYSTEM_MOUSE_CURSOR cursor_id = ALLEGRO_SYSTEM_MOUSE_CURSOR_DEFAULT ;
switch ( imgui_cursor )
{
case ImGuiMouseCursor_TextInput : cursor_id = ALLEGRO_SYSTEM_MOUSE_CURSOR_EDIT ; break ;
case ImGuiMouseCursor_ResizeAll : cursor_id = ALLEGRO_SYSTEM_MOUSE_CURSOR_MOVE ; break ;
case ImGuiMouseCursor_ResizeNS : cursor_id = ALLEGRO_SYSTEM_MOUSE_CURSOR_RESIZE_N ; break ;
case ImGuiMouseCursor_ResizeEW : cursor_id = ALLEGRO_SYSTEM_MOUSE_CURSOR_RESIZE_E ; break ;
case ImGuiMouseCursor_ResizeNESW : cursor_id = ALLEGRO_SYSTEM_MOUSE_CURSOR_RESIZE_NE ; break ;
case ImGuiMouseCursor_ResizeNWSE : cursor_id = ALLEGRO_SYSTEM_MOUSE_CURSOR_RESIZE_NW ; break ;
2019-12-02 09:52:06 +01:00
case ImGuiMouseCursor_NotAllowed : cursor_id = ALLEGRO_SYSTEM_MOUSE_CURSOR_UNAVAILABLE ; break ;
2018-06-11 12:33:51 +02:00
}
al_set_system_mouse_cursor ( g_Display , cursor_id ) ;
}
}
2018-06-08 19:37:33 +02:00
void ImGui_ImplAllegro5_NewFrame ( )
2015-07-08 19:34:36 +02:00
{
2016-03-26 15:43:45 +01:00
if ( ! g_Texture )
2018-06-08 19:37:33 +02:00
ImGui_ImplAllegro5_CreateDeviceObjects ( ) ;
2015-07-08 19:53:30 +02:00
2020-06-30 15:31:54 +02:00
ImGuiIO & io = ImGui : : GetIO ( ) ;
2015-07-08 19:53:30 +02:00
// Setup display size (every frame to accommodate for window resizing)
int w , h ;
w = al_get_display_width ( g_Display ) ;
h = al_get_display_height ( g_Display ) ;
io . DisplaySize = ImVec2 ( ( float ) w , ( float ) h ) ;
// Setup time step
double current_time = al_get_time ( ) ;
2020-06-30 15:31:54 +02:00
io . DeltaTime = g_Time > 0.0 ? ( float ) ( current_time - g_Time ) : ( float ) ( 1.0f / 60.0f ) ;
2015-07-08 19:53:30 +02:00
g_Time = current_time ;
// Setup inputs
ALLEGRO_KEYBOARD_STATE keys ;
al_get_keyboard_state ( & keys ) ;
2015-07-08 20:04:13 +02:00
io . KeyCtrl = al_key_down ( & keys , ALLEGRO_KEY_LCTRL ) | | al_key_down ( & keys , ALLEGRO_KEY_RCTRL ) ;
io . KeyShift = al_key_down ( & keys , ALLEGRO_KEY_LSHIFT ) | | al_key_down ( & keys , ALLEGRO_KEY_RSHIFT ) ;
io . KeyAlt = al_key_down ( & keys , ALLEGRO_KEY_ALT ) | | al_key_down ( & keys , ALLEGRO_KEY_ALTGR ) ;
2016-04-02 18:22:40 +02:00
io . KeySuper = al_key_down ( & keys , ALLEGRO_KEY_LWIN ) | | al_key_down ( & keys , ALLEGRO_KEY_RWIN ) ;
2015-07-08 19:53:30 +02:00
2018-06-11 12:33:51 +02:00
ImGui_ImplAllegro5_UpdateMouseCursor ( ) ;
2015-07-08 19:34:36 +02:00
}