Changeset e66fd66 in opengl-game for IMGUI/imgui.h


Ignore:
Timestamp:
Dec 5, 2020, 7:14:31 PM (4 years ago)
Author:
Dmitry Portnoy <dportnoy@…>
Branches:
feature/imgui-sdl, master
Children:
95c657f
Parents:
78c3045
Message:

In OpenGLReference, change all enums to enum classes and update IMGUI to the latest version

File:
1 edited

Legend:

Unmodified
Added
Removed
  • IMGUI/imgui.h

    r78c3045 re66fd66  
    1 // dear imgui, v1.61 WIP
     1// dear imgui, v1.79
    22// (headers)
    33
    4 // See imgui.cpp file for documentation.
    5 // Call and read ImGui::ShowDemoWindow() in imgui_demo.cpp for demo code.
    6 // Read 'Programmer guide' in imgui.cpp for notes on how to setup ImGui in your codebase.
    7 // Get latest version at https://github.com/ocornut/imgui
     4// Help:
     5// - Read FAQ at http://dearimgui.org/faq
     6// - Newcomers, read 'Programmer guide' in imgui.cpp for notes on how to setup Dear ImGui in your codebase.
     7// - Call and read ImGui::ShowDemoWindow() in imgui_demo.cpp. All applications in examples/ are doing that.
     8// Read imgui.cpp for details, links and comments.
     9
     10// Resources:
     11// - FAQ                   http://dearimgui.org/faq
     12// - Homepage & latest     https://github.com/ocornut/imgui
     13// - Releases & changelog  https://github.com/ocornut/imgui/releases
     14// - Gallery               https://github.com/ocornut/imgui/issues/3488 (please post your screenshots/video there!)
     15// - Glossary              https://github.com/ocornut/imgui/wiki/Glossary
     16// - Wiki                  https://github.com/ocornut/imgui/wiki
     17// - Issues & support      https://github.com/ocornut/imgui/issues
     18
     19/*
     20
     21Index of this file:
     22// Header mess
     23// Forward declarations and basic types
     24// ImGui API (Dear ImGui end-user API)
     25// Flags & Enumerations
     26// Memory allocations macros
     27// ImVector<>
     28// ImGuiStyle
     29// ImGuiIO
     30// Misc data structures (ImGuiInputTextCallbackData, ImGuiSizeCallbackData, ImGuiPayload)
     31// Obsolete functions
     32// Helpers (ImGuiOnceUponAFrame, ImGuiTextFilter, ImGuiTextBuffer, ImGuiStorage, ImGuiListClipper, ImColor)
     33// Draw List API (ImDrawCallback, ImDrawCmd, ImDrawIdx, ImDrawVert, ImDrawChannel, ImDrawListSplitter, ImDrawListFlags, ImDrawList, ImDrawData)
     34// Font API (ImFontConfig, ImFontGlyph, ImFontGlyphRangesBuilder, ImFontAtlasFlags, ImFontAtlas, ImFont)
     35
     36*/
    837
    938#pragma once
    1039
    11 #define IMGUI_DISABLE_INCLUDE_IMCONFIG_H
    12 
    13 // Configuration file (edit imconfig.h or define IMGUI_USER_CONFIG to set your own filename)
     40// Configuration file with compile-time options (edit imconfig.h or #define IMGUI_USER_CONFIG to your own filename)
    1441#ifdef IMGUI_USER_CONFIG
    1542#include IMGUI_USER_CONFIG
     
    1946#endif
    2047
    21 #include <float.h>                  // FLT_MAX
    22 #include <stdarg.h>                 // va_list
     48#ifndef IMGUI_DISABLE
     49
     50//-----------------------------------------------------------------------------
     51// Header mess
     52//-----------------------------------------------------------------------------
     53
     54// Includes
     55#include <float.h>                  // FLT_MIN, FLT_MAX
     56#include <stdarg.h>                 // va_list, va_start, va_end
    2357#include <stddef.h>                 // ptrdiff_t, NULL
    2458#include <string.h>                 // memset, memmove, memcpy, strlen, strchr, strcpy, strcmp
    2559
    2660// Version
    27 #define IMGUI_VERSION               "1.61 WIP"
    28 #define IMGUI_CHECKVERSION()        ImGui::DebugCheckVersionAndDataLayout(IMGUI_VERSION, sizeof(ImGuiIO), sizeof(ImGuiStyle), sizeof(ImVec2), sizeof(ImVec4), sizeof(ImDrawVert))
     61// (Integer encoded as XYYZZ for use in #if preprocessor conditionals. Work in progress versions typically starts at XYY99 then bounce up to XYY00, XYY01 etc. when release tagging happens)
     62#define IMGUI_VERSION               "1.79"
     63#define IMGUI_VERSION_NUM           17900
     64#define IMGUI_CHECKVERSION()        ImGui::DebugCheckVersionAndDataLayout(IMGUI_VERSION, sizeof(ImGuiIO), sizeof(ImGuiStyle), sizeof(ImVec2), sizeof(ImVec4), sizeof(ImDrawVert), sizeof(ImDrawIdx))
    2965
    3066// Define attributes of all API symbols declarations (e.g. for DLL under Windows)
     67// IMGUI_API is used for core imgui functions, IMGUI_IMPL_API is used for the default bindings files (imgui_impl_xxx.h)
     68// Using dear imgui via a shared library is not recommended, because we don't guarantee backward nor forward ABI compatibility (also function call overhead, as dear imgui is a call-heavy API)
    3169#ifndef IMGUI_API
    3270#define IMGUI_API
    3371#endif
    34 
    35 // Helpers
     72#ifndef IMGUI_IMPL_API
     73#define IMGUI_IMPL_API              IMGUI_API
     74#endif
     75
     76// Helper Macros
    3677#ifndef IM_ASSERT
    3778#include <assert.h>
    38 #define IM_ASSERT(_EXPR)            assert(_EXPR)
    39 #endif
    40 #if defined(__clang__) || defined(__GNUC__)
    41 #define IM_FMTARGS(FMT)             __attribute__((format(printf, FMT, FMT+1))) // Apply printf-style warnings to user functions.
     79#define IM_ASSERT(_EXPR)            assert(_EXPR)                               // You can override the default assert handler by editing imconfig.h
     80#endif
     81#if !defined(IMGUI_USE_STB_SPRINTF) && (defined(__clang__) || defined(__GNUC__))
     82#define IM_FMTARGS(FMT)             __attribute__((format(printf, FMT, FMT+1))) // To apply printf-style warnings to our functions.
    4283#define IM_FMTLIST(FMT)             __attribute__((format(printf, FMT, 0)))
    4384#else
     
    4586#define IM_FMTLIST(FMT)
    4687#endif
    47 #define IM_ARRAYSIZE(_ARR)          ((int)(sizeof(_ARR)/sizeof(*_ARR)))         // Size of a static C-style array. Don't use on pointers!
    48 #define IM_OFFSETOF(_TYPE,_MEMBER)  ((size_t)&(((_TYPE*)0)->_MEMBER))           // Offset of _MEMBER within _TYPE. Standardized as offsetof() in modern C++.
    49 
     88#define IM_ARRAYSIZE(_ARR)          ((int)(sizeof(_ARR) / sizeof(*(_ARR))))     // Size of a static C-style array. Don't use on pointers!
     89#define IM_UNUSED(_VAR)             ((void)(_VAR))                              // Used to silence "unused variable warnings". Often useful as asserts may be stripped out from final builds.
     90#if (__cplusplus >= 201100)
     91#define IM_OFFSETOF(_TYPE,_MEMBER)  offsetof(_TYPE, _MEMBER)                    // Offset of _MEMBER within _TYPE. Standardized as offsetof() in C++11
     92#else
     93#define IM_OFFSETOF(_TYPE,_MEMBER)  ((size_t)&(((_TYPE*)0)->_MEMBER))           // Offset of _MEMBER within _TYPE. Old style macro.
     94#endif
     95
     96// Warnings
    5097#if defined(__clang__)
    5198#pragma clang diagnostic push
    5299#pragma clang diagnostic ignored "-Wold-style-cast"
    53 #endif
     100#if __has_warning("-Wzero-as-null-pointer-constant")
     101#pragma clang diagnostic ignored "-Wzero-as-null-pointer-constant"
     102#endif
     103#elif defined(__GNUC__)
     104#pragma GCC diagnostic push
     105#pragma GCC diagnostic ignored "-Wpragmas"                  // warning: unknown option after '#pragma GCC diagnostic' kind
     106#pragma GCC diagnostic ignored "-Wclass-memaccess"          // [__GNUC__ >= 8] warning: 'memset/memcpy' clearing/writing an object of type 'xxxx' with no trivial copy-assignment; use assignment or value-initialization instead
     107#endif
     108
     109//-----------------------------------------------------------------------------
     110// Forward declarations and basic types
     111//-----------------------------------------------------------------------------
    54112
    55113// Forward declarations
    56 struct ImDrawChannel;               // Temporary storage for outputting drawing commands out of order, used by ImDrawList::ChannelsSplit()
    57 struct ImDrawCmd;                   // A single draw command within a parent ImDrawList (generally maps to 1 GPU draw call)
    58 struct ImDrawData;                  // All draw command lists required to render the frame
    59 struct ImDrawList;                  // A single draw command list (generally one per window)
     114struct ImDrawChannel;               // Temporary storage to output draw commands out of order, used by ImDrawListSplitter and ImDrawList::ChannelsSplit()
     115struct ImDrawCmd;                   // A single draw command within a parent ImDrawList (generally maps to 1 GPU draw call, unless it is a callback)
     116struct ImDrawData;                  // All draw command lists required to render the frame + pos/size coordinates to use for the projection matrix.
     117struct ImDrawList;                  // A single draw command list (generally one per window, conceptually you may see this as a dynamic "mesh" builder)
    60118struct ImDrawListSharedData;        // Data shared among multiple draw lists (typically owned by parent ImGui context, but you may create one yourself)
    61 struct ImDrawVert;                  // A single vertex (20 bytes by default, override layout with IMGUI_OVERRIDE_DRAWVERT_STRUCT_LAYOUT)
     119struct ImDrawListSplitter;          // Helper to split a draw list into different layers which can be drawn into out of order, then flattened back.
     120struct ImDrawVert;                  // A single vertex (pos + uv + col = 20 bytes by default. Override layout with IMGUI_OVERRIDE_DRAWVERT_STRUCT_LAYOUT)
    62121struct ImFont;                      // Runtime data for a single font within a parent ImFontAtlas
    63122struct ImFontAtlas;                 // Runtime data for multiple fonts, bake multiple fonts into a single texture, TTF/OTF font loader
    64123struct ImFontConfig;                // Configuration data when adding a font or merging fonts
    65 struct ImColor;                     // Helper functions to create a color that can be converted to either u32 or float4 (*obsolete* please avoid using)
     124struct ImFontGlyph;                 // A single font glyph (code point + coordinates within in ImFontAtlas + offset)
     125struct ImFontGlyphRangesBuilder;    // Helper to build glyph ranges from text/string data
     126struct ImColor;                     // Helper functions to create a color that can be converted to either u32 or float4 (*OBSOLETE* please avoid using)
     127struct ImGuiContext;                // Dear ImGui context (opaque structure, unless including imgui_internal.h)
    66128struct ImGuiIO;                     // Main configuration and I/O between your application and ImGui
    67 struct ImGuiOnceUponAFrame;         // Simple helper for running a block of code not more than once a frame, used by IMGUI_ONCE_UPON_A_FRAME macro
    68 struct ImGuiStorage;                // Simple custom key value storage
     129struct ImGuiInputTextCallbackData;  // Shared state of InputText() when using custom ImGuiInputTextCallback (rare/advanced use)
     130struct ImGuiListClipper;            // Helper to manually clip large list of items
     131struct ImGuiOnceUponAFrame;         // Helper for running a block of code not more than once a frame, used by IMGUI_ONCE_UPON_A_FRAME macro
     132struct ImGuiPayload;                // User data payload for drag and drop operations
     133struct ImGuiSizeCallbackData;       // Callback data when using SetNextWindowSizeConstraints() (rare/advanced use)
     134struct ImGuiStorage;                // Helper for key->value storage
    69135struct ImGuiStyle;                  // Runtime data for styling/colors
    70 struct ImGuiTextFilter;             // Parse and apply text filters. In format "aaaaa[,bbbb][,ccccc]"
    71 struct ImGuiTextBuffer;             // Text buffer for logging/accumulating text
    72 struct ImGuiTextEditCallbackData;   // Shared state of ImGui::InputText() when using custom ImGuiTextEditCallback (rare/advanced use)
    73 struct ImGuiSizeCallbackData;       // Structure used to constraint window size in custom ways when using custom ImGuiSizeCallback (rare/advanced use)
    74 struct ImGuiListClipper;            // Helper to manually clip large list of items
    75 struct ImGuiPayload;                // User data payload for drag and drop operations
    76 struct ImGuiContext;                // ImGui context (opaque)
    77 
    78 #ifndef ImTextureID
    79 typedef void* ImTextureID;          // User data to identify a texture (this is whatever to you want it to be! read the FAQ about ImTextureID in imgui.cpp)
    80 #endif
    81 
    82                                     // Typedefs and Enumerations (declared as int for compatibility with old C++ and to not pollute the top of this file)
    83 typedef unsigned int ImU32;         // 32-bit unsigned integer (typically used to store packed colors)
    84 typedef unsigned int ImGuiID;       // Unique ID used by widgets (typically hashed from a stack of string)
    85 typedef unsigned short ImWchar;     // Character for keyboard input/display
    86 typedef int ImGuiCol;               // enum: a color identifier for styling     // enum ImGuiCol_
    87 typedef int ImGuiDir;               // enum: a cardinal direction               // enum ImGuiDir_
    88 typedef int ImGuiCond;              // enum: a condition for Set*()             // enum ImGuiCond_
    89 typedef int ImGuiKey;               // enum: a key identifier (ImGui-side enum) // enum ImGuiKey_
    90 typedef int ImGuiNavInput;          // enum: an input identifier for navigation // enum ImGuiNavInput_
    91 typedef int ImGuiMouseCursor;       // enum: a mouse cursor identifier          // enum ImGuiMouseCursor_
    92 typedef int ImGuiStyleVar;          // enum: a variable identifier for styling  // enum ImGuiStyleVar_
    93 typedef int ImDrawCornerFlags;      // flags: for ImDrawList::AddRect*() etc.   // enum ImDrawCornerFlags_
    94 typedef int ImDrawListFlags;        // flags: for ImDrawList                    // enum ImDrawListFlags_
    95 typedef int ImFontAtlasFlags;       // flags: for ImFontAtlas                   // enum ImFontAtlasFlags_
    96 typedef int ImGuiBackendFlags;      // flags: for io.BackendFlags               // enum ImGuiBackendFlags_
    97 typedef int ImGuiColorEditFlags;    // flags: for ColorEdit*(), ColorPicker*()  // enum ImGuiColorEditFlags_
    98 typedef int ImGuiColumnsFlags;      // flags: for *Columns*()                   // enum ImGuiColumnsFlags_
    99 typedef int ImGuiConfigFlags;       // flags: for io.ConfigFlags                // enum ImGuiConfigFlags_
    100 typedef int ImGuiDragDropFlags;     // flags: for *DragDrop*()                  // enum ImGuiDragDropFlags_
    101 typedef int ImGuiComboFlags;        // flags: for BeginCombo()                  // enum ImGuiComboFlags_
    102 typedef int ImGuiFocusedFlags;      // flags: for IsWindowFocused()             // enum ImGuiFocusedFlags_
    103 typedef int ImGuiHoveredFlags;      // flags: for IsItemHovered() etc.          // enum ImGuiHoveredFlags_
    104 typedef int ImGuiInputTextFlags;    // flags: for InputText*()                  // enum ImGuiInputTextFlags_
    105 typedef int ImGuiSelectableFlags;   // flags: for Selectable()                  // enum ImGuiSelectableFlags_
    106 typedef int ImGuiTreeNodeFlags;     // flags: for TreeNode*(),CollapsingHeader()// enum ImGuiTreeNodeFlags_
    107 typedef int ImGuiWindowFlags;       // flags: for Begin*()                      // enum ImGuiWindowFlags_
    108 typedef int(*ImGuiTextEditCallback)(ImGuiTextEditCallbackData *data);
    109 typedef void(*ImGuiSizeCallback)(ImGuiSizeCallbackData* data);
     136struct ImGuiTextBuffer;             // Helper to hold and append into a text buffer (~string builder)
     137struct ImGuiTextFilter;             // Helper to parse and apply text filters (e.g. "aaaaa[,bbbbb][,ccccc]")
     138
     139// Enums/Flags (declared as int for compatibility with old C++, to allow using as flags and to not pollute the top of this file)
     140// - Tip: Use your programming IDE navigation facilities on the names in the _central column_ below to find the actual flags/enum lists!
     141//   In Visual Studio IDE: CTRL+comma ("Edit.NavigateTo") can follow symbols in comments, whereas CTRL+F12 ("Edit.GoToImplementation") cannot.
     142//   With Visual Assist installed: ALT+G ("VAssistX.GoToImplementation") can also follow symbols in comments.
     143typedef int ImGuiCol;               // -> enum ImGuiCol_             // Enum: A color identifier for styling
     144typedef int ImGuiCond;              // -> enum ImGuiCond_            // Enum: A condition for many Set*() functions
     145typedef int ImGuiDataType;          // -> enum ImGuiDataType_        // Enum: A primary data type
     146typedef int ImGuiDir;               // -> enum ImGuiDir_             // Enum: A cardinal direction
     147typedef int ImGuiKey;               // -> enum ImGuiKey_             // Enum: A key identifier (ImGui-side enum)
     148typedef int ImGuiNavInput;          // -> enum ImGuiNavInput_        // Enum: An input identifier for navigation
     149typedef int ImGuiMouseButton;       // -> enum ImGuiMouseButton_     // Enum: A mouse button identifier (0=left, 1=right, 2=middle)
     150typedef int ImGuiMouseCursor;       // -> enum ImGuiMouseCursor_     // Enum: A mouse cursor identifier
     151typedef int ImGuiStyleVar;          // -> enum ImGuiStyleVar_        // Enum: A variable identifier for styling
     152typedef int ImDrawCornerFlags;      // -> enum ImDrawCornerFlags_    // Flags: for ImDrawList::AddRect(), AddRectFilled() etc.
     153typedef int ImDrawListFlags;        // -> enum ImDrawListFlags_      // Flags: for ImDrawList
     154typedef int ImFontAtlasFlags;       // -> enum ImFontAtlasFlags_     // Flags: for ImFontAtlas build
     155typedef int ImGuiBackendFlags;      // -> enum ImGuiBackendFlags_    // Flags: for io.BackendFlags
     156typedef int ImGuiButtonFlags;       // -> enum ImGuiButtonFlags_     // Flags: for InvisibleButton()
     157typedef int ImGuiColorEditFlags;    // -> enum ImGuiColorEditFlags_  // Flags: for ColorEdit4(), ColorPicker4() etc.
     158typedef int ImGuiConfigFlags;       // -> enum ImGuiConfigFlags_     // Flags: for io.ConfigFlags
     159typedef int ImGuiComboFlags;        // -> enum ImGuiComboFlags_      // Flags: for BeginCombo()
     160typedef int ImGuiDragDropFlags;     // -> enum ImGuiDragDropFlags_   // Flags: for BeginDragDropSource(), AcceptDragDropPayload()
     161typedef int ImGuiFocusedFlags;      // -> enum ImGuiFocusedFlags_    // Flags: for IsWindowFocused()
     162typedef int ImGuiHoveredFlags;      // -> enum ImGuiHoveredFlags_    // Flags: for IsItemHovered(), IsWindowHovered() etc.
     163typedef int ImGuiInputTextFlags;    // -> enum ImGuiInputTextFlags_  // Flags: for InputText(), InputTextMultiline()
     164typedef int ImGuiKeyModFlags;       // -> enum ImGuiKeyModFlags_     // Flags: for io.KeyMods (Ctrl/Shift/Alt/Super)
     165typedef int ImGuiPopupFlags;        // -> enum ImGuiPopupFlags_      // Flags: for OpenPopup*(), BeginPopupContext*(), IsPopupOpen()
     166typedef int ImGuiSelectableFlags;   // -> enum ImGuiSelectableFlags_ // Flags: for Selectable()
     167typedef int ImGuiSliderFlags;       // -> enum ImGuiSliderFlags_     // Flags: for DragFloat(), DragInt(), SliderFloat(), SliderInt() etc.
     168typedef int ImGuiTabBarFlags;       // -> enum ImGuiTabBarFlags_     // Flags: for BeginTabBar()
     169typedef int ImGuiTabItemFlags;      // -> enum ImGuiTabItemFlags_    // Flags: for BeginTabItem()
     170typedef int ImGuiTreeNodeFlags;     // -> enum ImGuiTreeNodeFlags_   // Flags: for TreeNode(), TreeNodeEx(), CollapsingHeader()
     171typedef int ImGuiWindowFlags;       // -> enum ImGuiWindowFlags_     // Flags: for Begin(), BeginChild()
     172
     173// Other types
     174#ifndef ImTextureID                 // ImTextureID [configurable type: override in imconfig.h with '#define ImTextureID xxx']
     175typedef void* ImTextureID;          // User data for rendering back-end to identify a texture. This is whatever to you want it to be! read the FAQ about ImTextureID for details.
     176#endif
     177typedef unsigned int ImGuiID;       // A unique ID used by widgets, typically hashed from a stack of string.
     178typedef int (*ImGuiInputTextCallback)(ImGuiInputTextCallbackData* data);
     179typedef void (*ImGuiSizeCallback)(ImGuiSizeCallbackData* data);
     180
     181// Decoded character types
     182// (we generally use UTF-8 encoded string in the API. This is storage specifically for a decoded character used for keyboard input and display)
     183typedef unsigned short ImWchar16;   // A single decoded U16 character/code point. We encode them as multi bytes UTF-8 when used in strings.
     184typedef unsigned int ImWchar32;     // A single decoded U32 character/code point. We encode them as multi bytes UTF-8 when used in strings.
     185#ifdef IMGUI_USE_WCHAR32            // ImWchar [configurable type: override in imconfig.h with '#define IMGUI_USE_WCHAR32' to support Unicode planes 1-16]
     186typedef ImWchar32 ImWchar;
     187#else
     188typedef ImWchar16 ImWchar;
     189#endif
     190
     191// Basic scalar data types
     192typedef signed char         ImS8;   // 8-bit signed integer
     193typedef unsigned char       ImU8;   // 8-bit unsigned integer
     194typedef signed short        ImS16;  // 16-bit signed integer
     195typedef unsigned short      ImU16;  // 16-bit unsigned integer
     196typedef signed int          ImS32;  // 32-bit signed integer == int
     197typedef unsigned int        ImU32;  // 32-bit unsigned integer (often used to store packed colors)
    110198#if defined(_MSC_VER) && !defined(__clang__)
    111 typedef unsigned __int64 ImU64;     // 64-bit unsigned integer
     199typedef signed   __int64    ImS64;  // 64-bit signed integer (pre and post C++11 with Visual Studio)
     200typedef unsigned __int64    ImU64;  // 64-bit unsigned integer (pre and post C++11 with Visual Studio)
     201#elif (defined(__clang__) || defined(__GNUC__)) && (__cplusplus < 201100)
     202#include <stdint.h>
     203typedef int64_t             ImS64;  // 64-bit signed integer (pre C++11)
     204typedef uint64_t            ImU64;  // 64-bit unsigned integer (pre C++11)
    112205#else
    113 typedef unsigned long long ImU64;   // 64-bit unsigned integer
    114 #endif
    115 
     206typedef signed   long long  ImS64;  // 64-bit signed integer (post C++11)
     207typedef unsigned long long  ImU64;  // 64-bit unsigned integer (post C++11)
     208#endif
     209
     210// 2D vector (often used to store positions or sizes)
    116211struct ImVec2
    117212{
    118    float     x, y;
    119    ImVec2() { x = y = 0.0f; }
    120    ImVec2(float _x, float _y) { x = _x; y = _y; }
    121    float operator[] (size_t i) const { IM_ASSERT(i <= 1); return (&x)[i]; }    // We very rarely use this [] operator, the assert overhead is fine.
     213    float                                   x, y;
     214    ImVec2()                                { x = y = 0.0f; }
     215    ImVec2(float _x, float _y)              { x = _x; y = _y; }
     216    float  operator[] (size_t idx) const    { IM_ASSERT(idx <= 1); return (&x)[idx]; }    // We very rarely use this [] operator, the assert overhead is fine.
     217    float& operator[] (size_t idx)          { IM_ASSERT(idx <= 1); return (&x)[idx]; }    // We very rarely use this [] operator, the assert overhead is fine.
    122218#ifdef IM_VEC2_CLASS_EXTRA
    123    IM_VEC2_CLASS_EXTRA     // Define additional constructors and implicit cast operators in imconfig.h to convert back and forth between your math types and ImVec2.
    124 #endif
    125 };
    126 
     219    IM_VEC2_CLASS_EXTRA     // Define additional constructors and implicit cast operators in imconfig.h to convert back and forth between your math types and ImVec2.
     220#endif
     221};
     222
     223// 4D vector (often used to store floating-point colors)
    127224struct ImVec4
    128225{
    129    float     x, y, z, w;
    130    ImVec4() { x = y = z = w = 0.0f; }
    131    ImVec4(float _x, float _y, float _z, float _w) { x = _x; y = _y; z = _z; w = _w; }
     226    float                                   x, y, z, w;
     227    ImVec4()                                { x = y = z = w = 0.0f; }
     228    ImVec4(float _x, float _y, float _z, float _w) { x = _x; y = _y; z = _z; w = _w; }
    132229#ifdef IM_VEC4_CLASS_EXTRA
    133    IM_VEC4_CLASS_EXTRA     // Define additional constructors and implicit cast operators in imconfig.h to convert back and forth between your math types and ImVec4.
    134 #endif
    135 };
    136 
    137 // ImGui end-user API
    138 // In a namespace so that user can add extra functions in your own separate file (please don't modify imgui.cpp/.h)
     230    IM_VEC4_CLASS_EXTRA     // Define additional constructors and implicit cast operators in imconfig.h to convert back and forth between your math types and ImVec4.
     231#endif
     232};
     233
     234//-----------------------------------------------------------------------------
     235// ImGui: Dear ImGui end-user API
     236// (This is a namespace. You can add extra ImGui:: functions in your own separate file. Please don't modify imgui source files!)
     237//-----------------------------------------------------------------------------
     238
    139239namespace ImGui
    140240{
    141    // Context creation and access
    142    // All contexts share a same ImFontAtlas by default. If you want different font atlas, you can new() them and overwrite the GetIO().Fonts variable of an ImGui context.
    143    // All those functions are not reliant on the current context.
    144    IMGUI_API ImGuiContext* CreateContext(ImFontAtlas* shared_font_atlas = NULL);
    145    IMGUI_API void          DestroyContext(ImGuiContext* ctx = NULL);   // NULL = destroy current context
    146    IMGUI_API ImGuiContext* GetCurrentContext();
    147    IMGUI_API void          SetCurrentContext(ImGuiContext* ctx);
    148    IMGUI_API bool          DebugCheckVersionAndDataLayout(const char* version_str, size_t sz_io, size_t sz_style, size_t sz_vec2, size_t sz_vec4, size_t sz_drawvert);
    149 
    150    // Main
    151    IMGUI_API ImGuiIO&      GetIO();
    152    IMGUI_API ImGuiStyle&   GetStyle();
    153    IMGUI_API void          NewFrame();                                 // start a new ImGui frame, you can submit any command from this point until Render()/EndFrame().
    154    IMGUI_API void          Render();                                   // ends the ImGui frame, finalize the draw data. (Obsolete: optionally call io.RenderDrawListsFn if set. Nowadays, prefer calling your render function yourself.)
    155    IMGUI_API ImDrawData*   GetDrawData();                              // valid after Render() and until the next call to NewFrame(). this is what you have to render. (Obsolete: this used to be passed to your io.RenderDrawListsFn() function.)
    156    IMGUI_API void          EndFrame();                                 // ends the ImGui frame. automatically called by Render(), so most likely don't need to ever call that yourself directly. If you don't need to render you may call EndFrame() but you'll have wasted CPU already. If you don't need to render, better to not create any imgui windows instead!
    157 
    158                                                                        // Demo, Debug, Information
    159    IMGUI_API void          ShowDemoWindow(bool* p_open = NULL);        // create demo/test window (previously called ShowTestWindow). demonstrate most ImGui features. call this to learn about the library! try to make it always available in your application!
    160    IMGUI_API void          ShowMetricsWindow(bool* p_open = NULL);     // create metrics window. display ImGui internals: draw commands (with individual draw calls and vertices), window list, basic internal state, etc.
    161    IMGUI_API void          ShowStyleEditor(ImGuiStyle* ref = NULL);    // add style editor block (not a window). you can pass in a reference ImGuiStyle structure to compare to, revert to and save to (else it uses the default style)
    162    IMGUI_API bool          ShowStyleSelector(const char* label);       // add style selector block (not a window), essentially a combo listing the default styles.
    163    IMGUI_API void          ShowFontSelector(const char* label);        // add font selector block (not a window), essentially a combo listing the loaded fonts.
    164    IMGUI_API void          ShowUserGuide();                            // add basic help/info block (not a window): how to manipulate ImGui as a end-user (mouse/keyboard controls).
    165    IMGUI_API const char*   GetVersion();                               // get a version string e.g. "1.23"
    166 
    167                                                                        // Styles
    168    IMGUI_API void          StyleColorsDark(ImGuiStyle* dst = NULL);    // new, recommended style (default)
    169    IMGUI_API void          StyleColorsClassic(ImGuiStyle* dst = NULL); // classic imgui style
    170    IMGUI_API void          StyleColorsLight(ImGuiStyle* dst = NULL);   // best used with borders and a custom, thicker font
    171 
    172                                                                        // Windows
    173                                                                        // (Begin = push window to the stack and start appending to it. End = pop window from the stack. You may append multiple times to the same window during the same frame)
    174                                                                        // Begin()/BeginChild() return false to indicate the window being collapsed or fully clipped, so you may early out and omit submitting anything to the window.
    175                                                                        // However you need to always call a matching End()/EndChild() for a Begin()/BeginChild() call, regardless of its return value (this is due to legacy reason and is inconsistent with BeginMenu/EndMenu, BeginPopup/EndPopup and other functions where the End call should only be called if the corresponding Begin function returned true.)
    176                                                                        // Passing 'bool* p_open != NULL' shows a close widget in the upper-right corner of the window, which when clicking will set the boolean to false.
    177                                                                        // Use child windows to introduce independent scrolling/clipping regions within a host window. Child windows can embed their own child.
    178    IMGUI_API bool          Begin(const char* name, bool* p_open = NULL, ImGuiWindowFlags flags = 0);
    179    IMGUI_API void          End();
    180    IMGUI_API bool          BeginChild(const char* str_id, const ImVec2& size = ImVec2(0, 0), bool border = false, ImGuiWindowFlags flags = 0); // Begin a scrolling region. size==0.0f: use remaining window size, size<0.0f: use remaining window size minus abs(size). size>0.0f: fixed size. each axis can use a different mode, e.g. ImVec2(0,400).
    181    IMGUI_API bool          BeginChild(ImGuiID id, const ImVec2& size = ImVec2(0, 0), bool border = false, ImGuiWindowFlags flags = 0);
    182    IMGUI_API void          EndChild();
    183 
    184    // Windows Utilities
    185    IMGUI_API bool          IsWindowAppearing();
    186    IMGUI_API bool          IsWindowCollapsed();
    187    IMGUI_API bool          IsWindowFocused(ImGuiFocusedFlags flags = 0); // is current window focused? or its root/child, depending on flags. see flags for options.
    188    IMGUI_API bool          IsWindowHovered(ImGuiHoveredFlags flags = 0); // is current window hovered (and typically: not blocked by a popup/modal)? see flags for options. NB: If you are trying to check whether your mouse should be dispatched to imgui or to your app, you should use the 'io.WantCaptureMouse' boolean for that! Please read the FAQ!
    189    IMGUI_API ImDrawList*   GetWindowDrawList();                        // get draw list associated to the window, to append your own drawing primitives
    190    IMGUI_API ImVec2        GetWindowPos();                             // get current window position in screen space (useful if you want to do your own drawing via the DrawList API)
    191    IMGUI_API ImVec2        GetWindowSize();                            // get current window size
    192    IMGUI_API float         GetWindowWidth();                           // get current window width (shortcut for GetWindowSize().x)
    193    IMGUI_API float         GetWindowHeight();                          // get current window height (shortcut for GetWindowSize().y)
    194    IMGUI_API ImVec2        GetContentRegionMax();                      // current content boundaries (typically window boundaries including scrolling, or current column boundaries), in windows coordinates
    195    IMGUI_API ImVec2        GetContentRegionAvail();                    // == GetContentRegionMax() - GetCursorPos()
    196    IMGUI_API float         GetContentRegionAvailWidth();               //
    197    IMGUI_API ImVec2        GetWindowContentRegionMin();                // content boundaries min (roughly (0,0)-Scroll), in window coordinates
    198    IMGUI_API ImVec2        GetWindowContentRegionMax();                // content boundaries max (roughly (0,0)+Size-Scroll) where Size can be override with SetNextWindowContentSize(), in window coordinates
    199    IMGUI_API float         GetWindowContentRegionWidth();              //
    200 
    201    IMGUI_API void          SetNextWindowPos(const ImVec2& pos, ImGuiCond cond = 0, const ImVec2& pivot = ImVec2(0, 0)); // set next window position. call before Begin(). use pivot=(0.5f,0.5f) to center on given point, etc.
    202    IMGUI_API void          SetNextWindowSize(const ImVec2& size, ImGuiCond cond = 0);                  // set next window size. set axis to 0.0f to force an auto-fit on this axis. call before Begin()
    203    IMGUI_API void          SetNextWindowSizeConstraints(const ImVec2& size_min, const ImVec2& size_max, ImGuiSizeCallback custom_callback = NULL, void* custom_callback_data = NULL); // set next window size limits. use -1,-1 on either X/Y axis to preserve the current size. Use callback to apply non-trivial programmatic constraints.
    204    IMGUI_API void          SetNextWindowContentSize(const ImVec2& size);                               // set next window content size (~ enforce the range of scrollbars). not including window decorations (title bar, menu bar, etc.). set an axis to 0.0f to leave it automatic. call before Begin()
    205    IMGUI_API void          SetNextWindowCollapsed(bool collapsed, ImGuiCond cond = 0);                 // set next window collapsed state. call before Begin()
    206    IMGUI_API void          SetNextWindowFocus();                                                       // set next window to be focused / front-most. call before Begin()
    207    IMGUI_API void          SetNextWindowBgAlpha(float alpha);                                          // set next window background color alpha. helper to easily modify ImGuiCol_WindowBg/ChildBg/PopupBg.
    208    IMGUI_API void          SetWindowPos(const ImVec2& pos, ImGuiCond cond = 0);                        // (not recommended) set current window position - call within Begin()/End(). prefer using SetNextWindowPos(), as this may incur tearing and side-effects.
    209    IMGUI_API void          SetWindowSize(const ImVec2& size, ImGuiCond cond = 0);                      // (not recommended) set current window size - call within Begin()/End(). set to ImVec2(0,0) to force an auto-fit. prefer using SetNextWindowSize(), as this may incur tearing and minor side-effects.   
    210    IMGUI_API void          SetWindowCollapsed(bool collapsed, ImGuiCond cond = 0);                     // (not recommended) set current window collapsed state. prefer using SetNextWindowCollapsed().
    211    IMGUI_API void          SetWindowFocus();                                                           // (not recommended) set current window to be focused / front-most. prefer using SetNextWindowFocus().
    212    IMGUI_API void          SetWindowFontScale(float scale);                                            // set font scale. Adjust IO.FontGlobalScale if you want to scale all windows
    213    IMGUI_API void          SetWindowPos(const char* name, const ImVec2& pos, ImGuiCond cond = 0);      // set named window position.
    214    IMGUI_API void          SetWindowSize(const char* name, const ImVec2& size, ImGuiCond cond = 0);    // set named window size. set axis to 0.0f to force an auto-fit on this axis.
    215    IMGUI_API void          SetWindowCollapsed(const char* name, bool collapsed, ImGuiCond cond = 0);   // set named window collapsed state
    216    IMGUI_API void          SetWindowFocus(const char* name);                                           // set named window to be focused / front-most. use NULL to remove focus.
    217 
    218                                                                                                        // Windows Scrolling
    219    IMGUI_API float         GetScrollX();                                                   // get scrolling amount [0..GetScrollMaxX()]
    220    IMGUI_API float         GetScrollY();                                                   // get scrolling amount [0..GetScrollMaxY()]
    221    IMGUI_API float         GetScrollMaxX();                                                // get maximum scrolling amount ~~ ContentSize.X - WindowSize.X
    222    IMGUI_API float         GetScrollMaxY();                                                // get maximum scrolling amount ~~ ContentSize.Y - WindowSize.Y
    223    IMGUI_API void          SetScrollX(float scroll_x);                                     // set scrolling amount [0..GetScrollMaxX()]
    224    IMGUI_API void          SetScrollY(float scroll_y);                                     // set scrolling amount [0..GetScrollMaxY()]
    225    IMGUI_API void          SetScrollHere(float center_y_ratio = 0.5f);                     // adjust scrolling amount to make current cursor position visible. center_y_ratio=0.0: top, 0.5: center, 1.0: bottom. When using to make a "default/current item" visible, consider using SetItemDefaultFocus() instead.
    226    IMGUI_API void          SetScrollFromPosY(float pos_y, float center_y_ratio = 0.5f);    // adjust scrolling amount to make given position valid. use GetCursorPos() or GetCursorStartPos()+offset to get valid positions.
    227 
    228                                                                                            // Parameters stacks (shared)
    229    IMGUI_API void          PushFont(ImFont* font);                                         // use NULL as a shortcut to push default font
    230    IMGUI_API void          PopFont();
    231    IMGUI_API void          PushStyleColor(ImGuiCol idx, ImU32 col);
    232    IMGUI_API void          PushStyleColor(ImGuiCol idx, const ImVec4& col);
    233    IMGUI_API void          PopStyleColor(int count = 1);
    234    IMGUI_API void          PushStyleVar(ImGuiStyleVar idx, float val);
    235    IMGUI_API void          PushStyleVar(ImGuiStyleVar idx, const ImVec2& val);
    236    IMGUI_API void          PopStyleVar(int count = 1);
    237    IMGUI_API const ImVec4& GetStyleColorVec4(ImGuiCol idx);                                // retrieve style color as stored in ImGuiStyle structure. use to feed back into PushStyleColor(), otherwise use GetColorU32() to get style color with style alpha baked in.
    238    IMGUI_API ImFont*       GetFont();                                                      // get current font
    239    IMGUI_API float         GetFontSize();                                                  // get current font size (= height in pixels) of current font with current scale applied
    240    IMGUI_API ImVec2        GetFontTexUvWhitePixel();                                       // get UV coordinate for a while pixel, useful to draw custom shapes via the ImDrawList API
    241    IMGUI_API ImU32         GetColorU32(ImGuiCol idx, float alpha_mul = 1.0f);              // retrieve given style color with style alpha applied and optional extra alpha multiplier
    242    IMGUI_API ImU32         GetColorU32(const ImVec4& col);                                 // retrieve given color with style alpha applied
    243    IMGUI_API ImU32         GetColorU32(ImU32 col);                                         // retrieve given color with style alpha applied
    244 
    245                                                                                            // Parameters stacks (current window)
    246    IMGUI_API void          PushItemWidth(float item_width);                                // width of items for the common item+label case, pixels. 0.0f = default to ~2/3 of windows width, >0.0f: width in pixels, <0.0f align xx pixels to the right of window (so -1.0f always align width to the right side)
    247    IMGUI_API void          PopItemWidth();
    248    IMGUI_API float         CalcItemWidth();                                                // width of item given pushed settings and current cursor position
    249    IMGUI_API void          PushTextWrapPos(float wrap_pos_x = 0.0f);                       // word-wrapping for Text*() commands. < 0.0f: no wrapping; 0.0f: wrap to end of window (or column); > 0.0f: wrap at 'wrap_pos_x' position in window local space
    250    IMGUI_API void          PopTextWrapPos();
    251    IMGUI_API void          PushAllowKeyboardFocus(bool allow_keyboard_focus);              // allow focusing using TAB/Shift-TAB, enabled by default but you can disable it for certain widgets
    252    IMGUI_API void          PopAllowKeyboardFocus();
    253    IMGUI_API void          PushButtonRepeat(bool repeat);                                  // in 'repeat' mode, Button*() functions return repeated true in a typematic manner (using io.KeyRepeatDelay/io.KeyRepeatRate setting). Note that you can call IsItemActive() after any Button() to tell if the button is held in the current frame.
    254    IMGUI_API void          PopButtonRepeat();
    255 
    256    // Cursor / Layout
    257    IMGUI_API void          Separator();                                                    // separator, generally horizontal. inside a menu bar or in horizontal layout mode, this becomes a vertical separator.
    258    IMGUI_API void          SameLine(float pos_x = 0.0f, float spacing_w = -1.0f);          // call between widgets or groups to layout them horizontally
    259    IMGUI_API void          NewLine();                                                      // undo a SameLine()
    260    IMGUI_API void          Spacing();                                                      // add vertical spacing
    261    IMGUI_API void          Dummy(const ImVec2& size);                                      // add a dummy item of given size
    262    IMGUI_API void          Indent(float indent_w = 0.0f);                                  // move content position toward the right, by style.IndentSpacing or indent_w if != 0
    263    IMGUI_API void          Unindent(float indent_w = 0.0f);                                // move content position back to the left, by style.IndentSpacing or indent_w if != 0
    264    IMGUI_API void          BeginGroup();                                                   // lock horizontal starting position + capture group bounding box into one "item" (so you can use IsItemHovered() or layout primitives such as SameLine() on whole group, etc.)
    265    IMGUI_API void          EndGroup();
    266    IMGUI_API ImVec2        GetCursorPos();                                                 // cursor position is relative to window position
    267    IMGUI_API float         GetCursorPosX();                                                // "
    268    IMGUI_API float         GetCursorPosY();                                                // "
    269    IMGUI_API void          SetCursorPos(const ImVec2& local_pos);                          // "
    270    IMGUI_API void          SetCursorPosX(float x);                                         // "
    271    IMGUI_API void          SetCursorPosY(float y);                                         // "
    272    IMGUI_API ImVec2        GetCursorStartPos();                                            // initial cursor position
    273    IMGUI_API ImVec2        GetCursorScreenPos();                                           // cursor position in absolute screen coordinates [0..io.DisplaySize] (useful to work with ImDrawList API)
    274    IMGUI_API void          SetCursorScreenPos(const ImVec2& screen_pos);                   // cursor position in absolute screen coordinates [0..io.DisplaySize]
    275    IMGUI_API void          AlignTextToFramePadding();                                      // vertically align upcoming text baseline to FramePadding.y so that it will align properly to regularly framed items (call if you have text on a line before a framed item)
    276    IMGUI_API float         GetTextLineHeight();                                            // ~ FontSize
    277    IMGUI_API float         GetTextLineHeightWithSpacing();                                 // ~ FontSize + style.ItemSpacing.y (distance in pixels between 2 consecutive lines of text)
    278    IMGUI_API float         GetFrameHeight();                                               // ~ FontSize + style.FramePadding.y * 2
    279    IMGUI_API float         GetFrameHeightWithSpacing();                                    // ~ FontSize + style.FramePadding.y * 2 + style.ItemSpacing.y (distance in pixels between 2 consecutive lines of framed widgets)
    280 
    281                                                                                            // ID stack/scopes
    282                                                                                            // Read the FAQ for more details about how ID are handled in dear imgui. If you are creating widgets in a loop you most
    283                                                                                            // likely want to push a unique identifier (e.g. object pointer, loop index) to uniquely differentiate them.
    284                                                                                            // You can also use the "##foobar" syntax within widget label to distinguish them from each others.
    285                                                                                            // In this header file we use the "label"/"name" terminology to denote a string that will be displayed and used as an ID,
    286                                                                                            // whereas "str_id" denote a string that is only used as an ID and not aimed to be displayed.
    287    IMGUI_API void          PushID(const char* str_id);                                     // push identifier into the ID stack. IDs are hash of the entire stack!
    288    IMGUI_API void          PushID(const char* str_id_begin, const char* str_id_end);
    289    IMGUI_API void          PushID(const void* ptr_id);
    290    IMGUI_API void          PushID(int int_id);
    291    IMGUI_API void          PopID();
    292    IMGUI_API ImGuiID       GetID(const char* str_id);                                      // calculate unique ID (hash of whole ID stack + given parameter). e.g. if you want to query into ImGuiStorage yourself
    293    IMGUI_API ImGuiID       GetID(const char* str_id_begin, const char* str_id_end);
    294    IMGUI_API ImGuiID       GetID(const void* ptr_id);
    295 
    296    // Widgets: Text
    297    IMGUI_API void          TextUnformatted(const char* text, const char* text_end = NULL);                // raw text without formatting. Roughly equivalent to Text("%s", text) but: A) doesn't require null terminated string if 'text_end' is specified, B) it's faster, no memory copy is done, no buffer size limits, recommended for long chunks of text.
    298    IMGUI_API void          Text(const char* fmt, ...)                                      IM_FMTARGS(1); // simple formatted text
    299    IMGUI_API void          TextV(const char* fmt, va_list args)                            IM_FMTLIST(1);
    300    IMGUI_API void          TextColored(const ImVec4& col, const char* fmt, ...)            IM_FMTARGS(2); // shortcut for PushStyleColor(ImGuiCol_Text, col); Text(fmt, ...); PopStyleColor();
    301    IMGUI_API void          TextColoredV(const ImVec4& col, const char* fmt, va_list args)  IM_FMTLIST(2);
    302    IMGUI_API void          TextDisabled(const char* fmt, ...)                              IM_FMTARGS(1); // shortcut for PushStyleColor(ImGuiCol_Text, style.Colors[ImGuiCol_TextDisabled]); Text(fmt, ...); PopStyleColor();
    303    IMGUI_API void          TextDisabledV(const char* fmt, va_list args)                    IM_FMTLIST(1);
    304    IMGUI_API void          TextWrapped(const char* fmt, ...)                               IM_FMTARGS(1); // shortcut for PushTextWrapPos(0.0f); Text(fmt, ...); PopTextWrapPos();. Note that this won't work on an auto-resizing window if there's no other widgets to extend the window width, yoy may need to set a size using SetNextWindowSize().
    305    IMGUI_API void          TextWrappedV(const char* fmt, va_list args)                     IM_FMTLIST(1);
    306    IMGUI_API void          LabelText(const char* label, const char* fmt, ...)              IM_FMTARGS(2); // display text+label aligned the same way as value+label widgets
    307    IMGUI_API void          LabelTextV(const char* label, const char* fmt, va_list args)    IM_FMTLIST(2);
    308    IMGUI_API void          BulletText(const char* fmt, ...)                                IM_FMTARGS(1); // shortcut for Bullet()+Text()
    309    IMGUI_API void          BulletTextV(const char* fmt, va_list args)                      IM_FMTLIST(1);
    310 
    311    // Widgets: Main
    312    IMGUI_API bool          Button(const char* label, const ImVec2& size = ImVec2(0, 0));    // button
    313    IMGUI_API bool          SmallButton(const char* label);                                 // button with FramePadding=(0,0) to easily embed within text
    314    IMGUI_API bool          ArrowButton(const char* str_id, ImGuiDir dir);
    315    IMGUI_API bool          InvisibleButton(const char* str_id, const ImVec2& size);        // button behavior without the visuals, useful to build custom behaviors using the public api (along with IsItemActive, IsItemHovered, etc.)
    316    IMGUI_API void          Image(ImTextureID user_texture_id, const ImVec2& size, const ImVec2& uv0 = ImVec2(0, 0), const ImVec2& uv1 = ImVec2(1, 1), const ImVec4& tint_col = ImVec4(1, 1, 1, 1), const ImVec4& border_col = ImVec4(0, 0, 0, 0));
    317    IMGUI_API bool          ImageButton(ImTextureID user_texture_id, const ImVec2& size, const ImVec2& uv0 = ImVec2(0, 0), const ImVec2& uv1 = ImVec2(1, 1), int frame_padding = -1, const ImVec4& bg_col = ImVec4(0, 0, 0, 0), const ImVec4& tint_col = ImVec4(1, 1, 1, 1));    // <0 frame_padding uses default frame padding settings. 0 for no padding
    318    IMGUI_API bool          Checkbox(const char* label, bool* v);
    319    IMGUI_API bool          CheckboxFlags(const char* label, unsigned int* flags, unsigned int flags_value);
    320    IMGUI_API bool          RadioButton(const char* label, bool active);
    321    IMGUI_API bool          RadioButton(const char* label, int* v, int v_button);
    322    IMGUI_API void          PlotLines(const char* label, const float* values, int values_count, int values_offset = 0, const char* overlay_text = NULL, float scale_min = FLT_MAX, float scale_max = FLT_MAX, ImVec2 graph_size = ImVec2(0, 0), int stride = sizeof(float));
    323    IMGUI_API void          PlotLines(const char* label, float(*values_getter)(void* data, int idx), void* data, int values_count, int values_offset = 0, const char* overlay_text = NULL, float scale_min = FLT_MAX, float scale_max = FLT_MAX, ImVec2 graph_size = ImVec2(0, 0));
    324    IMGUI_API void          PlotHistogram(const char* label, const float* values, int values_count, int values_offset = 0, const char* overlay_text = NULL, float scale_min = FLT_MAX, float scale_max = FLT_MAX, ImVec2 graph_size = ImVec2(0, 0), int stride = sizeof(float));
    325    IMGUI_API void          PlotHistogram(const char* label, float(*values_getter)(void* data, int idx), void* data, int values_count, int values_offset = 0, const char* overlay_text = NULL, float scale_min = FLT_MAX, float scale_max = FLT_MAX, ImVec2 graph_size = ImVec2(0, 0));
    326    IMGUI_API void          ProgressBar(float fraction, const ImVec2& size_arg = ImVec2(-1, 0), const char* overlay = NULL);
    327    IMGUI_API void          Bullet();                                                       // draw a small circle and keep the cursor on the same line. advance cursor x position by GetTreeNodeToLabelSpacing(), same distance that TreeNode() uses
    328 
    329                                                                                            // Widgets: Combo Box
    330                                                                                            // The new BeginCombo()/EndCombo() api allows you to manage your contents and selection state however you want it.
    331                                                                                            // The old Combo() api are helpers over BeginCombo()/EndCombo() which are kept available for convenience purpose.
    332    IMGUI_API bool          BeginCombo(const char* label, const char* preview_value, ImGuiComboFlags flags = 0);
    333    IMGUI_API void          EndCombo(); // only call EndCombo() if BeginCombo() returns true!
    334    IMGUI_API bool          Combo(const char* label, int* current_item, const char* const items[], int items_count, int popup_max_height_in_items = -1);
    335    IMGUI_API bool          Combo(const char* label, int* current_item, const char* items_separated_by_zeros, int popup_max_height_in_items = -1);      // Separate items with \0 within a string, end item-list with \0\0. e.g. "One\0Two\0Three\0"
    336    IMGUI_API bool          Combo(const char* label, int* current_item, bool(*items_getter)(void* data, int idx, const char** out_text), void* data, int items_count, int popup_max_height_in_items = -1);
    337 
    338    // Widgets: Drags (tip: ctrl+click on a drag box to input with keyboard. manually input values aren't clamped, can go off-bounds)
    339    // For all the Float2/Float3/Float4/Int2/Int3/Int4 versions of every functions, note that a 'float v[X]' function argument is the same as 'float* v', the array syntax is just a way to document the number of elements that are expected to be accessible. You can pass address of your first element out of a contiguous set, e.g. &myvector.x
    340    // Speed are per-pixel of mouse movement (v_speed=0.2f: mouse needs to move by 5 pixels to increase value by 1). For gamepad/keyboard navigation, minimum speed is Max(v_speed, minimum_step_at_given_precision).
    341    IMGUI_API bool          DragFloat(const char* label, float* v, float v_speed = 1.0f, float v_min = 0.0f, float v_max = 0.0f, const char* format = "%.3f", float power = 1.0f);     // If v_min >= v_max we have no bound
    342    IMGUI_API bool          DragFloat2(const char* label, float v[2], float v_speed = 1.0f, float v_min = 0.0f, float v_max = 0.0f, const char* format = "%.3f", float power = 1.0f);
    343    IMGUI_API bool          DragFloat3(const char* label, float v[3], float v_speed = 1.0f, float v_min = 0.0f, float v_max = 0.0f, const char* format = "%.3f", float power = 1.0f);
    344    IMGUI_API bool          DragFloat4(const char* label, float v[4], float v_speed = 1.0f, float v_min = 0.0f, float v_max = 0.0f, const char* format = "%.3f", float power = 1.0f);
    345    IMGUI_API bool          DragFloatRange2(const char* label, float* v_current_min, float* v_current_max, float v_speed = 1.0f, float v_min = 0.0f, float v_max = 0.0f, const char* format = "%.3f", const char* format_max = NULL, float power = 1.0f);
    346    IMGUI_API bool          DragInt(const char* label, int* v, float v_speed = 1.0f, int v_min = 0, int v_max = 0, const char* format = "%.0f");                                       // If v_min >= v_max we have no bound
    347    IMGUI_API bool          DragInt2(const char* label, int v[2], float v_speed = 1.0f, int v_min = 0, int v_max = 0, const char* format = "%.0f");
    348    IMGUI_API bool          DragInt3(const char* label, int v[3], float v_speed = 1.0f, int v_min = 0, int v_max = 0, const char* format = "%.0f");
    349    IMGUI_API bool          DragInt4(const char* label, int v[4], float v_speed = 1.0f, int v_min = 0, int v_max = 0, const char* format = "%.0f");
    350    IMGUI_API bool          DragIntRange2(const char* label, int* v_current_min, int* v_current_max, float v_speed = 1.0f, int v_min = 0, int v_max = 0, const char* format = "%.0f", const char* format_max = NULL);
    351 
    352    // Widgets: Input with Keyboard
    353    IMGUI_API bool          InputText(const char* label, char* buf, size_t buf_size, ImGuiInputTextFlags flags = 0, ImGuiTextEditCallback callback = NULL, void* user_data = NULL);
    354    IMGUI_API bool          InputTextMultiline(const char* label, char* buf, size_t buf_size, const ImVec2& size = ImVec2(0, 0), ImGuiInputTextFlags flags = 0, ImGuiTextEditCallback callback = NULL, void* user_data = NULL);
    355    IMGUI_API bool          InputFloat(const char* label, float* v, float step = 0.0f, float step_fast = 0.0f, const char* format = "%.3f", ImGuiInputTextFlags extra_flags = 0);
    356    IMGUI_API bool          InputFloat2(const char* label, float v[2], const char* format = "%.3f", ImGuiInputTextFlags extra_flags = 0);
    357    IMGUI_API bool          InputFloat3(const char* label, float v[3], const char* format = "%.3f", ImGuiInputTextFlags extra_flags = 0);
    358    IMGUI_API bool          InputFloat4(const char* label, float v[4], const char* format = "%.3f", ImGuiInputTextFlags extra_flags = 0);
    359    IMGUI_API bool          InputInt(const char* label, int* v, int step = 1, int step_fast = 100, ImGuiInputTextFlags extra_flags = 0);
    360    IMGUI_API bool          InputInt2(const char* label, int v[2], ImGuiInputTextFlags extra_flags = 0);
    361    IMGUI_API bool          InputInt3(const char* label, int v[3], ImGuiInputTextFlags extra_flags = 0);
    362    IMGUI_API bool          InputInt4(const char* label, int v[4], ImGuiInputTextFlags extra_flags = 0);
    363    IMGUI_API bool          InputDouble(const char* label, double* v, double step = 0.0f, double step_fast = 0.0f, const char* format = "%.6f", ImGuiInputTextFlags extra_flags = 0);
    364 
    365    // Widgets: Sliders (tip: ctrl+click on a slider to input with keyboard. manually input values aren't clamped, can go off-bounds)
    366    IMGUI_API bool          SliderFloat(const char* label, float* v, float v_min, float v_max, const char* format = "%.3f", float power = 1.0f);     // adjust format to decorate the value with a prefix or a suffix for in-slider labels or unit display. Use power!=1.0 for logarithmic sliders
    367    IMGUI_API bool          SliderFloat2(const char* label, float v[2], float v_min, float v_max, const char* format = "%.3f", float power = 1.0f);
    368    IMGUI_API bool          SliderFloat3(const char* label, float v[3], float v_min, float v_max, const char* format = "%.3f", float power = 1.0f);
    369    IMGUI_API bool          SliderFloat4(const char* label, float v[4], float v_min, float v_max, const char* format = "%.3f", float power = 1.0f);
    370    IMGUI_API bool          SliderAngle(const char* label, float* v_rad, float v_degrees_min = -360.0f, float v_degrees_max = +360.0f);
    371    IMGUI_API bool          SliderInt(const char* label, int* v, int v_min, int v_max, const char* format = "%.0f");
    372    IMGUI_API bool          SliderInt2(const char* label, int v[2], int v_min, int v_max, const char* format = "%.0f");
    373    IMGUI_API bool          SliderInt3(const char* label, int v[3], int v_min, int v_max, const char* format = "%.0f");
    374    IMGUI_API bool          SliderInt4(const char* label, int v[4], int v_min, int v_max, const char* format = "%.0f");
    375    IMGUI_API bool          VSliderFloat(const char* label, const ImVec2& size, float* v, float v_min, float v_max, const char* format = "%.3f", float power = 1.0f);
    376    IMGUI_API bool          VSliderInt(const char* label, const ImVec2& size, int* v, int v_min, int v_max, const char* format = "%.0f");
    377 
    378    // Widgets: Color Editor/Picker (tip: the ColorEdit* functions have a little colored preview square that can be left-clicked to open a picker, and right-clicked to open an option menu.)
    379    // Note that a 'float v[X]' function argument is the same as 'float* v', the array syntax is just a way to document the number of elements that are expected to be accessible. You can the pass the address of a first float element out of a contiguous structure, e.g. &myvector.x
    380    IMGUI_API bool          ColorEdit3(const char* label, float col[3], ImGuiColorEditFlags flags = 0);
    381    IMGUI_API bool          ColorEdit4(const char* label, float col[4], ImGuiColorEditFlags flags = 0);
    382    IMGUI_API bool          ColorPicker3(const char* label, float col[3], ImGuiColorEditFlags flags = 0);
    383    IMGUI_API bool          ColorPicker4(const char* label, float col[4], ImGuiColorEditFlags flags = 0, const float* ref_col = NULL);
    384    IMGUI_API bool          ColorButton(const char* desc_id, const ImVec4& col, ImGuiColorEditFlags flags = 0, ImVec2 size = ImVec2(0, 0));  // display a colored square/button, hover for details, return true when pressed.
    385    IMGUI_API void          SetColorEditOptions(ImGuiColorEditFlags flags);                     // initialize current options (generally on application startup) if you want to select a default format, picker type, etc. User will be able to change many settings, unless you pass the _NoOptions flag to your calls.
    386 
    387                                                                                                // Widgets: Trees
    388    IMGUI_API bool          TreeNode(const char* label);                                        // if returning 'true' the node is open and the tree id is pushed into the id stack. user is responsible for calling TreePop().
    389    IMGUI_API bool          TreeNode(const char* str_id, const char* fmt, ...) IM_FMTARGS(2);   // read the FAQ about why and how to use ID. to align arbitrary text at the same level as a TreeNode() you can use Bullet().
    390    IMGUI_API bool          TreeNode(const void* ptr_id, const char* fmt, ...) IM_FMTARGS(2);   // "
    391    IMGUI_API bool          TreeNodeV(const char* str_id, const char* fmt, va_list args) IM_FMTLIST(2);
    392    IMGUI_API bool          TreeNodeV(const void* ptr_id, const char* fmt, va_list args) IM_FMTLIST(2);
    393    IMGUI_API bool          TreeNodeEx(const char* label, ImGuiTreeNodeFlags flags = 0);
    394    IMGUI_API bool          TreeNodeEx(const char* str_id, ImGuiTreeNodeFlags flags, const char* fmt, ...) IM_FMTARGS(3);
    395    IMGUI_API bool          TreeNodeEx(const void* ptr_id, ImGuiTreeNodeFlags flags, const char* fmt, ...) IM_FMTARGS(3);
    396    IMGUI_API bool          TreeNodeExV(const char* str_id, ImGuiTreeNodeFlags flags, const char* fmt, va_list args) IM_FMTLIST(3);
    397    IMGUI_API bool          TreeNodeExV(const void* ptr_id, ImGuiTreeNodeFlags flags, const char* fmt, va_list args) IM_FMTLIST(3);
    398    IMGUI_API void          TreePush(const char* str_id);                                       // ~ Indent()+PushId(). Already called by TreeNode() when returning true, but you can call Push/Pop yourself for layout purpose
    399    IMGUI_API void          TreePush(const void* ptr_id = NULL);                                // "
    400    IMGUI_API void          TreePop();                                                          // ~ Unindent()+PopId()
    401    IMGUI_API void          TreeAdvanceToLabelPos();                                            // advance cursor x position by GetTreeNodeToLabelSpacing()
    402    IMGUI_API float         GetTreeNodeToLabelSpacing();                                        // horizontal distance preceding label when using TreeNode*() or Bullet() == (g.FontSize + style.FramePadding.x*2) for a regular unframed TreeNode
    403    IMGUI_API void          SetNextTreeNodeOpen(bool is_open, ImGuiCond cond = 0);              // set next TreeNode/CollapsingHeader open state.
    404    IMGUI_API bool          CollapsingHeader(const char* label, ImGuiTreeNodeFlags flags = 0);  // if returning 'true' the header is open. doesn't indent nor push on ID stack. user doesn't have to call TreePop().
    405    IMGUI_API bool          CollapsingHeader(const char* label, bool* p_open, ImGuiTreeNodeFlags flags = 0); // when 'p_open' isn't NULL, display an additional small close button on upper right of the header
    406 
    407                                                                                                             // Widgets: Selectable / Lists
    408    IMGUI_API bool          Selectable(const char* label, bool selected = false, ImGuiSelectableFlags flags = 0, const ImVec2& size = ImVec2(0, 0));  // "bool selected" carry the selection state (read-only). Selectable() is clicked is returns true so you can modify your selection state. size.x==0.0: use remaining width, size.x>0.0: specify width. size.y==0.0: use label height, size.y>0.0: specify height
    409    IMGUI_API bool          Selectable(const char* label, bool* p_selected, ImGuiSelectableFlags flags = 0, const ImVec2& size = ImVec2(0, 0));       // "bool* p_selected" point to the selection state (read-write), as a convenient helper.
    410    IMGUI_API bool          ListBox(const char* label, int* current_item, const char* const items[], int items_count, int height_in_items = -1);
    411    IMGUI_API bool          ListBox(const char* label, int* current_item, bool(*items_getter)(void* data, int idx, const char** out_text), void* data, int items_count, int height_in_items = -1);
    412    IMGUI_API bool          ListBoxHeader(const char* label, const ImVec2& size = ImVec2(0, 0)); // use if you want to reimplement ListBox() will custom data or interactions. if the function return true, you can output elements then call ListBoxFooter() afterwards.
    413    IMGUI_API bool          ListBoxHeader(const char* label, int items_count, int height_in_items = -1); // "
    414    IMGUI_API void          ListBoxFooter();                                                    // terminate the scrolling region. only call ListBoxFooter() if ListBoxHeader() returned true!
    415 
    416                                                                                                // Widgets: Value() Helpers. Output single value in "name: value" format (tip: freely declare more in your code to handle your types. you can add functions to the ImGui namespace)
    417    IMGUI_API void          Value(const char* prefix, bool b);
    418    IMGUI_API void          Value(const char* prefix, int v);
    419    IMGUI_API void          Value(const char* prefix, unsigned int v);
    420    IMGUI_API void          Value(const char* prefix, float v, const char* float_format = NULL);
    421 
    422    // Tooltips
    423    IMGUI_API void          SetTooltip(const char* fmt, ...) IM_FMTARGS(1);                     // set text tooltip under mouse-cursor, typically use with ImGui::IsItemHovered(). overidde any previous call to SetTooltip().
    424    IMGUI_API void          SetTooltipV(const char* fmt, va_list args) IM_FMTLIST(1);
    425    IMGUI_API void          BeginTooltip();                                                     // begin/append a tooltip window. to create full-featured tooltip (with any kind of contents).
    426    IMGUI_API void          EndTooltip();
    427 
    428    // Menus
    429    IMGUI_API bool          BeginMainMenuBar();                                                 // create and append to a full screen menu-bar.
    430    IMGUI_API void          EndMainMenuBar();                                                   // only call EndMainMenuBar() if BeginMainMenuBar() returns true!
    431    IMGUI_API bool          BeginMenuBar();                                                     // append to menu-bar of current window (requires ImGuiWindowFlags_MenuBar flag set on parent window).
    432    IMGUI_API void          EndMenuBar();                                                       // only call EndMenuBar() if BeginMenuBar() returns true!
    433    IMGUI_API bool          BeginMenu(const char* label, bool enabled = true);                  // create a sub-menu entry. only call EndMenu() if this returns true!
    434    IMGUI_API void          EndMenu();                                                          // only call EndMenu() if BeginMenu() returns true!
    435    IMGUI_API bool          MenuItem(const char* label, const char* shortcut = NULL, bool selected = false, bool enabled = true);  // return true when activated. shortcuts are displayed for convenience but not processed by ImGui at the moment
    436    IMGUI_API bool          MenuItem(const char* label, const char* shortcut, bool* p_selected, bool enabled = true);              // return true when activated + toggle (*p_selected) if p_selected != NULL
    437 
    438                                                                                                                                   // Popups
    439    IMGUI_API void          OpenPopup(const char* str_id);                                      // call to mark popup as open (don't call every frame!). popups are closed when user click outside, or if CloseCurrentPopup() is called within a BeginPopup()/EndPopup() block. By default, Selectable()/MenuItem() are calling CloseCurrentPopup(). Popup identifiers are relative to the current ID-stack (so OpenPopup and BeginPopup needs to be at the same level).
    440    IMGUI_API bool          BeginPopup(const char* str_id, ImGuiWindowFlags flags = 0);                                             // return true if the popup is open, and you can start outputting to it. only call EndPopup() if BeginPopup() returns true!
    441    IMGUI_API bool          BeginPopupContextItem(const char* str_id = NULL, int mouse_button = 1);                                 // helper to open and begin popup when clicked on last item. if you can pass a NULL str_id only if the previous item had an id. If you want to use that on a non-interactive item such as Text() you need to pass in an explicit ID here. read comments in .cpp!
    442    IMGUI_API bool          BeginPopupContextWindow(const char* str_id = NULL, int mouse_button = 1, bool also_over_items = true);  // helper to open and begin popup when clicked on current window.
    443    IMGUI_API bool          BeginPopupContextVoid(const char* str_id = NULL, int mouse_button = 1);                                 // helper to open and begin popup when clicked in void (where there are no imgui windows).
    444    IMGUI_API bool          BeginPopupModal(const char* name, bool* p_open = NULL, ImGuiWindowFlags flags = 0);                     // modal dialog (regular window with title bar, block interactions behind the modal window, can't close the modal window by clicking outside)
    445    IMGUI_API void          EndPopup();                                                                                             // only call EndPopup() if BeginPopupXXX() returns true!
    446    IMGUI_API bool          OpenPopupOnItemClick(const char* str_id = NULL, int mouse_button = 1);                                  // helper to open popup when clicked on last item. return true when just opened.
    447    IMGUI_API bool          IsPopupOpen(const char* str_id);                                    // return true if the popup is open
    448    IMGUI_API void          CloseCurrentPopup();                                                // close the popup we have begin-ed into. clicking on a MenuItem or Selectable automatically close the current popup.
    449 
    450                                                                                                // Columns
    451                                                                                                // You can also use SameLine(pos_x) for simplified columns. The columns API is still work-in-progress and rather lacking.
    452    IMGUI_API void          Columns(int count = 1, const char* id = NULL, bool border = true);
    453    IMGUI_API void          NextColumn();                                                       // next column, defaults to current row or next row if the current row is finished
    454    IMGUI_API int           GetColumnIndex();                                                   // get current column index
    455    IMGUI_API float         GetColumnWidth(int column_index = -1);                              // get column width (in pixels). pass -1 to use current column
    456    IMGUI_API void          SetColumnWidth(int column_index, float width);                      // set column width (in pixels). pass -1 to use current column
    457    IMGUI_API float         GetColumnOffset(int column_index = -1);                             // get position of column line (in pixels, from the left side of the contents region). pass -1 to use current column, otherwise 0..GetColumnsCount() inclusive. column 0 is typically 0.0f
    458    IMGUI_API void          SetColumnOffset(int column_index, float offset_x);                  // set position of column line (in pixels, from the left side of the contents region). pass -1 to use current column
    459    IMGUI_API int           GetColumnsCount();
    460 
    461    // Logging/Capture: all text output from interface is captured to tty/file/clipboard. By default, tree nodes are automatically opened during logging.
    462    IMGUI_API void          LogToTTY(int max_depth = -1);                                       // start logging to tty
    463    IMGUI_API void          LogToFile(int max_depth = -1, const char* filename = NULL);         // start logging to file
    464    IMGUI_API void          LogToClipboard(int max_depth = -1);                                 // start logging to OS clipboard
    465    IMGUI_API void          LogFinish();                                                        // stop logging (close file, etc.)
    466    IMGUI_API void          LogButtons();                                                       // helper to display buttons for logging to tty/file/clipboard
    467    IMGUI_API void          LogText(const char* fmt, ...) IM_FMTARGS(1);                        // pass text data straight to log (without being displayed)
    468 
    469                                                                                                // Drag and Drop
    470                                                                                                // [BETA API] Missing Demo code. API may evolve.
    471    IMGUI_API bool          BeginDragDropSource(ImGuiDragDropFlags flags = 0);                                      // call when the current item is active. If this return true, you can call SetDragDropPayload() + EndDragDropSource()
    472    IMGUI_API bool          SetDragDropPayload(const char* type, const void* data, size_t size, ImGuiCond cond = 0);// type is a user defined string of maximum 32 characters. Strings starting with '_' are reserved for dear imgui internal types. Data is copied and held by imgui.
    473    IMGUI_API void          EndDragDropSource();                                                                    // only call EndDragDropSource() if BeginDragDropSource() returns true!
    474    IMGUI_API bool          BeginDragDropTarget();                                                                  // call after submitting an item that may receive an item. If this returns true, you can call AcceptDragDropPayload() + EndDragDropTarget()
    475    IMGUI_API const ImGuiPayload* AcceptDragDropPayload(const char* type, ImGuiDragDropFlags flags = 0);            // accept contents of a given type. If ImGuiDragDropFlags_AcceptBeforeDelivery is set you can peek into the payload before the mouse button is released.
    476    IMGUI_API void          EndDragDropTarget();                                                                    // only call EndDragDropTarget() if BeginDragDropTarget() returns true!
    477 
    478                                                                                                                    // Clipping
    479    IMGUI_API void          PushClipRect(const ImVec2& clip_rect_min, const ImVec2& clip_rect_max, bool intersect_with_current_clip_rect);
    480    IMGUI_API void          PopClipRect();
    481 
    482    // Focus, Activation
    483    // (Prefer using "SetItemDefaultFocus()" over "if (IsWindowAppearing()) SetScrollHere()" when applicable, to make your code more forward compatible when navigation branch is merged)
    484    IMGUI_API void          SetItemDefaultFocus();                                              // make last item the default focused item of a window. Please use instead of "if (IsWindowAppearing()) SetScrollHere()" to signify "default item".
    485    IMGUI_API void          SetKeyboardFocusHere(int offset = 0);                               // focus keyboard on the next widget. Use positive 'offset' to access sub components of a multiple component widget. Use -1 to access previous widget.
    486 
    487                                                                                                // Utilities
    488    IMGUI_API bool          IsItemHovered(ImGuiHoveredFlags flags = 0);                         // is the last item hovered? (and usable, aka not blocked by a popup, etc.). See ImGuiHoveredFlags for more options.
    489    IMGUI_API bool          IsItemActive();                                                     // is the last item active? (e.g. button being held, text field being edited- items that don't interact will always return false)
    490    IMGUI_API bool          IsItemFocused();                                                    // is the last item focused for keyboard/gamepad navigation?
    491    IMGUI_API bool          IsItemClicked(int mouse_button = 0);                                // is the last item clicked? (e.g. button/node just clicked on)
    492    IMGUI_API bool          IsItemVisible();                                                    // is the last item visible? (aka not out of sight due to clipping/scrolling.)
    493    IMGUI_API bool          IsAnyItemHovered();
    494    IMGUI_API bool          IsAnyItemActive();
    495    IMGUI_API bool          IsAnyItemFocused();
    496    IMGUI_API ImVec2        GetItemRectMin();                                                   // get bounding rectangle of last item, in screen space
    497    IMGUI_API ImVec2        GetItemRectMax();                                                   // "
    498    IMGUI_API ImVec2        GetItemRectSize();                                                  // get size of last item, in screen space
    499    IMGUI_API void          SetItemAllowOverlap();                                              // allow last item to be overlapped by a subsequent item. sometimes useful with invisible buttons, selectables, etc. to catch unused area.
    500    IMGUI_API bool          IsRectVisible(const ImVec2& size);                                  // test if rectangle (of given size, starting from cursor position) is visible / not clipped.
    501    IMGUI_API bool          IsRectVisible(const ImVec2& rect_min, const ImVec2& rect_max);      // test if rectangle (in screen space) is visible / not clipped. to perform coarse clipping on user's side.
    502    IMGUI_API float         GetTime();
    503    IMGUI_API int           GetFrameCount();
    504    IMGUI_API ImDrawList*   GetOverlayDrawList();                                               // this draw list will be the last rendered one, useful to quickly draw overlays shapes/text
    505    IMGUI_API ImDrawListSharedData* GetDrawListSharedData();                                    // you may use this when creating your own ImDrawList instances
    506    IMGUI_API const char*   GetStyleColorName(ImGuiCol idx);
    507    IMGUI_API void          SetStateStorage(ImGuiStorage* storage);                             // replace current window storage with our own (if you want to manipulate it yourself, typically clear subsection of it)
    508    IMGUI_API ImGuiStorage* GetStateStorage();
    509    IMGUI_API ImVec2        CalcTextSize(const char* text, const char* text_end = NULL, bool hide_text_after_double_hash = false, float wrap_width = -1.0f);
    510    IMGUI_API void          CalcListClipping(int items_count, float items_height, int* out_items_display_start, int* out_items_display_end);    // calculate coarse clipping for large list of evenly sized items. Prefer using the ImGuiListClipper higher-level helper if you can.
    511 
    512    IMGUI_API bool          BeginChildFrame(ImGuiID id, const ImVec2& size, ImGuiWindowFlags flags = 0); // helper to create a child window / scrolling region that looks like a normal widget frame
    513    IMGUI_API void          EndChildFrame();                                                    // always call EndChildFrame() regardless of BeginChildFrame() return values (which indicates a collapsed/clipped window)
    514 
    515    IMGUI_API ImVec4        ColorConvertU32ToFloat4(ImU32 in);
    516    IMGUI_API ImU32         ColorConvertFloat4ToU32(const ImVec4& in);
    517    IMGUI_API void          ColorConvertRGBtoHSV(float r, float g, float b, float& out_h, float& out_s, float& out_v);
    518    IMGUI_API void          ColorConvertHSVtoRGB(float h, float s, float v, float& out_r, float& out_g, float& out_b);
    519 
    520    // Inputs
    521    IMGUI_API int           GetKeyIndex(ImGuiKey imgui_key);                                    // map ImGuiKey_* values into user's key index. == io.KeyMap[key]
    522    IMGUI_API bool          IsKeyDown(int user_key_index);                                      // is key being held. == io.KeysDown[user_key_index]. note that imgui doesn't know the semantic of each entry of io.KeysDown[]. Use your own indices/enums according to how your backend/engine stored them into io.KeysDown[]!
    523    IMGUI_API bool          IsKeyPressed(int user_key_index, bool repeat = true);               // was key pressed (went from !Down to Down). if repeat=true, uses io.KeyRepeatDelay / KeyRepeatRate
    524    IMGUI_API bool          IsKeyReleased(int user_key_index);                                  // was key released (went from Down to !Down)..
    525    IMGUI_API int           GetKeyPressedAmount(int key_index, float repeat_delay, float rate); // uses provided repeat rate/delay. return a count, most often 0 or 1 but might be >1 if RepeatRate is small enough that DeltaTime > RepeatRate
    526    IMGUI_API bool          IsMouseDown(int button);                                            // is mouse button held
    527    IMGUI_API bool          IsAnyMouseDown();                                                   // is any mouse button held
    528    IMGUI_API bool          IsMouseClicked(int button, bool repeat = false);                    // did mouse button clicked (went from !Down to Down)
    529    IMGUI_API bool          IsMouseDoubleClicked(int button);                                   // did mouse button double-clicked. a double-click returns false in IsMouseClicked(). uses io.MouseDoubleClickTime.
    530    IMGUI_API bool          IsMouseReleased(int button);                                        // did mouse button released (went from Down to !Down)
    531    IMGUI_API bool          IsMouseDragging(int button = 0, float lock_threshold = -1.0f);      // is mouse dragging. if lock_threshold < -1.0f uses io.MouseDraggingThreshold
    532    IMGUI_API bool          IsMouseHoveringRect(const ImVec2& r_min, const ImVec2& r_max, bool clip = true);  // is mouse hovering given bounding rect (in screen space). clipped by current clipping settings. disregarding of consideration of focus/window ordering/blocked by a popup.
    533    IMGUI_API bool          IsMousePosValid(const ImVec2* mouse_pos = NULL);                    //
    534    IMGUI_API ImVec2        GetMousePos();                                                      // shortcut to ImGui::GetIO().MousePos provided by user, to be consistent with other calls
    535    IMGUI_API ImVec2        GetMousePosOnOpeningCurrentPopup();                                 // retrieve backup of mouse position at the time of opening popup we have BeginPopup() into
    536    IMGUI_API ImVec2        GetMouseDragDelta(int button = 0, float lock_threshold = -1.0f);    // dragging amount since clicking. if lock_threshold < -1.0f uses io.MouseDraggingThreshold
    537    IMGUI_API void          ResetMouseDragDelta(int button = 0);                                //
    538    IMGUI_API ImGuiMouseCursor GetMouseCursor();                                                // get desired cursor type, reset in ImGui::NewFrame(), this is updated during the frame. valid before Render(). If you use software rendering by setting io.MouseDrawCursor ImGui will render those for you
    539    IMGUI_API void          SetMouseCursor(ImGuiMouseCursor type);                              // set desired cursor type
    540    IMGUI_API void          CaptureKeyboardFromApp(bool capture = true);                        // manually override io.WantCaptureKeyboard flag next frame (said flag is entirely left for your application to handle). e.g. force capture keyboard when your widget is being hovered.
    541    IMGUI_API void          CaptureMouseFromApp(bool capture = true);                           // manually override io.WantCaptureMouse flag next frame (said flag is entirely left for your application to handle).
    542 
    543                                                                                                // Clipboard Utilities (also see the LogToClipboard() function to capture or output text data to the clipboard)
    544    IMGUI_API const char*   GetClipboardText();
    545    IMGUI_API void          SetClipboardText(const char* text);
    546 
    547    // Memory Utilities
    548    // All those functions are not reliant on the current context.
    549    // If you reload the contents of imgui.cpp at runtime, you may need to call SetCurrentContext() + SetAllocatorFunctions() again.
    550    IMGUI_API void          SetAllocatorFunctions(void* (*alloc_func)(size_t sz, void* user_data), void(*free_func)(void* ptr, void* user_data), void* user_data = NULL);
    551    IMGUI_API void*         MemAlloc(size_t size);
    552    IMGUI_API void          MemFree(void* ptr);
     241    // Context creation and access
     242    // Each context create its own ImFontAtlas by default. You may instance one yourself and pass it to CreateContext() to share a font atlas between imgui contexts.
     243    // None of those functions is reliant on the current context.
     244    IMGUI_API ImGuiContext* CreateContext(ImFontAtlas* shared_font_atlas = NULL);
     245    IMGUI_API void          DestroyContext(ImGuiContext* ctx = NULL);   // NULL = destroy current context
     246    IMGUI_API ImGuiContext* GetCurrentContext();
     247    IMGUI_API void          SetCurrentContext(ImGuiContext* ctx);
     248
     249    // Main
     250    IMGUI_API ImGuiIO&      GetIO();                                    // access the IO structure (mouse/keyboard/gamepad inputs, time, various configuration options/flags)
     251    IMGUI_API ImGuiStyle&   GetStyle();                                 // access the Style structure (colors, sizes). Always use PushStyleCol(), PushStyleVar() to modify style mid-frame!
     252    IMGUI_API void          NewFrame();                                 // start a new Dear ImGui frame, you can submit any command from this point until Render()/EndFrame().
     253    IMGUI_API void          EndFrame();                                 // ends the Dear ImGui frame. automatically called by Render(). If you don't need to render data (skipping rendering) you may call EndFrame() without Render()... but you'll have wasted CPU already! If you don't need to render, better to not create any windows and not call NewFrame() at all!
     254    IMGUI_API void          Render();                                   // ends the Dear ImGui frame, finalize the draw data. You can get call GetDrawData() to obtain it and run your rendering function (up to v1.60, this used to call io.RenderDrawListsFn(). Nowadays, we allow and prefer calling your render function yourself.)
     255    IMGUI_API ImDrawData*   GetDrawData();                              // valid after Render() and until the next call to NewFrame(). this is what you have to render.
     256
     257    // Demo, Debug, Information
     258    IMGUI_API void          ShowDemoWindow(bool* p_open = NULL);        // create Demo window (previously called ShowTestWindow). demonstrate most ImGui features. call this to learn about the library! try to make it always available in your application!
     259    IMGUI_API void          ShowAboutWindow(bool* p_open = NULL);       // create About window. display Dear ImGui version, credits and build/system information.
     260    IMGUI_API void          ShowMetricsWindow(bool* p_open = NULL);     // create Debug/Metrics window. display Dear ImGui internals: draw commands (with individual draw calls and vertices), window list, basic internal state, etc.
     261    IMGUI_API void          ShowStyleEditor(ImGuiStyle* ref = NULL);    // add style editor block (not a window). you can pass in a reference ImGuiStyle structure to compare to, revert to and save to (else it uses the default style)
     262    IMGUI_API bool          ShowStyleSelector(const char* label);       // add style selector block (not a window), essentially a combo listing the default styles.
     263    IMGUI_API void          ShowFontSelector(const char* label);        // add font selector block (not a window), essentially a combo listing the loaded fonts.
     264    IMGUI_API void          ShowUserGuide();                            // add basic help/info block (not a window): how to manipulate ImGui as a end-user (mouse/keyboard controls).
     265    IMGUI_API const char*   GetVersion();                               // get the compiled version string e.g. "1.23" (essentially the compiled value for IMGUI_VERSION)
     266
     267    // Styles
     268    IMGUI_API void          StyleColorsDark(ImGuiStyle* dst = NULL);    // new, recommended style (default)
     269    IMGUI_API void          StyleColorsClassic(ImGuiStyle* dst = NULL); // classic imgui style
     270    IMGUI_API void          StyleColorsLight(ImGuiStyle* dst = NULL);   // best used with borders and a custom, thicker font
     271
     272    // Windows
     273    // - Begin() = push window to the stack and start appending to it. End() = pop window from the stack.
     274    // - Passing 'bool* p_open != NULL' shows a window-closing widget in the upper-right corner of the window,
     275    //   which clicking will set the boolean to false when clicked.
     276    // - You may append multiple times to the same window during the same frame by calling Begin()/End() pairs multiple times.
     277    //   Some information such as 'flags' or 'p_open' will only be considered by the first call to Begin().
     278    // - Begin() return false to indicate the window is collapsed or fully clipped, so you may early out and omit submitting
     279    //   anything to the window. Always call a matching End() for each Begin() call, regardless of its return value!
     280    //   [Important: due to legacy reason, this is inconsistent with most other functions such as BeginMenu/EndMenu,
     281    //    BeginPopup/EndPopup, etc. where the EndXXX call should only be called if the corresponding BeginXXX function
     282    //    returned true. Begin and BeginChild are the only odd ones out. Will be fixed in a future update.]
     283    // - Note that the bottom of window stack always contains a window called "Debug".
     284    IMGUI_API bool          Begin(const char* name, bool* p_open = NULL, ImGuiWindowFlags flags = 0);
     285    IMGUI_API void          End();
     286
     287    // Child Windows
     288    // - Use child windows to begin into a self-contained independent scrolling/clipping regions within a host window. Child windows can embed their own child.
     289    // - For each independent axis of 'size': ==0.0f: use remaining host window size / >0.0f: fixed size / <0.0f: use remaining window size minus abs(size) / Each axis can use a different mode, e.g. ImVec2(0,400).
     290    // - BeginChild() returns false to indicate the window is collapsed or fully clipped, so you may early out and omit submitting anything to the window.
     291    //   Always call a matching EndChild() for each BeginChild() call, regardless of its return value [as with Begin: this is due to legacy reason and inconsistent with most BeginXXX functions apart from the regular Begin() which behaves like BeginChild().]
     292    IMGUI_API bool          BeginChild(const char* str_id, const ImVec2& size = ImVec2(0, 0), bool border = false, ImGuiWindowFlags flags = 0);
     293    IMGUI_API bool          BeginChild(ImGuiID id, const ImVec2& size = ImVec2(0, 0), bool border = false, ImGuiWindowFlags flags = 0);
     294    IMGUI_API void          EndChild();
     295
     296    // Windows Utilities
     297    // - 'current window' = the window we are appending into while inside a Begin()/End() block. 'next window' = next window we will Begin() into.
     298    IMGUI_API bool          IsWindowAppearing();
     299    IMGUI_API bool          IsWindowCollapsed();
     300    IMGUI_API bool          IsWindowFocused(ImGuiFocusedFlags flags=0); // is current window focused? or its root/child, depending on flags. see flags for options.
     301    IMGUI_API bool          IsWindowHovered(ImGuiHoveredFlags flags=0); // is current window hovered (and typically: not blocked by a popup/modal)? see flags for options. NB: If you are trying to check whether your mouse should be dispatched to imgui or to your app, you should use the 'io.WantCaptureMouse' boolean for that! Please read the FAQ!
     302    IMGUI_API ImDrawList*   GetWindowDrawList();                        // get draw list associated to the current window, to append your own drawing primitives
     303    IMGUI_API ImVec2        GetWindowPos();                             // get current window position in screen space (useful if you want to do your own drawing via the DrawList API)
     304    IMGUI_API ImVec2        GetWindowSize();                            // get current window size
     305    IMGUI_API float         GetWindowWidth();                           // get current window width (shortcut for GetWindowSize().x)
     306    IMGUI_API float         GetWindowHeight();                          // get current window height (shortcut for GetWindowSize().y)
     307
     308    // Prefer using SetNextXXX functions (before Begin) rather that SetXXX functions (after Begin).
     309    IMGUI_API void          SetNextWindowPos(const ImVec2& pos, ImGuiCond cond = 0, const ImVec2& pivot = ImVec2(0, 0)); // set next window position. call before Begin(). use pivot=(0.5f,0.5f) to center on given point, etc.
     310    IMGUI_API void          SetNextWindowSize(const ImVec2& size, ImGuiCond cond = 0);                  // set next window size. set axis to 0.0f to force an auto-fit on this axis. call before Begin()
     311    IMGUI_API void          SetNextWindowSizeConstraints(const ImVec2& size_min, const ImVec2& size_max, ImGuiSizeCallback custom_callback = NULL, void* custom_callback_data = NULL); // set next window size limits. use -1,-1 on either X/Y axis to preserve the current size. Sizes will be rounded down. Use callback to apply non-trivial programmatic constraints.
     312    IMGUI_API void          SetNextWindowContentSize(const ImVec2& size);                               // set next window content size (~ scrollable client area, which enforce the range of scrollbars). Not including window decorations (title bar, menu bar, etc.) nor WindowPadding. set an axis to 0.0f to leave it automatic. call before Begin()
     313    IMGUI_API void          SetNextWindowCollapsed(bool collapsed, ImGuiCond cond = 0);                 // set next window collapsed state. call before Begin()
     314    IMGUI_API void          SetNextWindowFocus();                                                       // set next window to be focused / top-most. call before Begin()
     315    IMGUI_API void          SetNextWindowBgAlpha(float alpha);                                          // set next window background color alpha. helper to easily override the Alpha component of ImGuiCol_WindowBg/ChildBg/PopupBg. you may also use ImGuiWindowFlags_NoBackground.
     316    IMGUI_API void          SetWindowPos(const ImVec2& pos, ImGuiCond cond = 0);                        // (not recommended) set current window position - call within Begin()/End(). prefer using SetNextWindowPos(), as this may incur tearing and side-effects.
     317    IMGUI_API void          SetWindowSize(const ImVec2& size, ImGuiCond cond = 0);                      // (not recommended) set current window size - call within Begin()/End(). set to ImVec2(0, 0) to force an auto-fit. prefer using SetNextWindowSize(), as this may incur tearing and minor side-effects.
     318    IMGUI_API void          SetWindowCollapsed(bool collapsed, ImGuiCond cond = 0);                     // (not recommended) set current window collapsed state. prefer using SetNextWindowCollapsed().
     319    IMGUI_API void          SetWindowFocus();                                                           // (not recommended) set current window to be focused / top-most. prefer using SetNextWindowFocus().
     320    IMGUI_API void          SetWindowFontScale(float scale);                                            // set font scale. Adjust IO.FontGlobalScale if you want to scale all windows. This is an old API! For correct scaling, prefer to reload font + rebuild ImFontAtlas + call style.ScaleAllSizes().
     321    IMGUI_API void          SetWindowPos(const char* name, const ImVec2& pos, ImGuiCond cond = 0);      // set named window position.
     322    IMGUI_API void          SetWindowSize(const char* name, const ImVec2& size, ImGuiCond cond = 0);    // set named window size. set axis to 0.0f to force an auto-fit on this axis.
     323    IMGUI_API void          SetWindowCollapsed(const char* name, bool collapsed, ImGuiCond cond = 0);   // set named window collapsed state
     324    IMGUI_API void          SetWindowFocus(const char* name);                                           // set named window to be focused / top-most. use NULL to remove focus.
     325
     326    // Content region
     327    // - Those functions are bound to be redesigned soon (they are confusing, incomplete and return values in local window coordinates which increases confusion)
     328    IMGUI_API ImVec2        GetContentRegionMax();                                          // current content boundaries (typically window boundaries including scrolling, or current column boundaries), in windows coordinates
     329    IMGUI_API ImVec2        GetContentRegionAvail();                                        // == GetContentRegionMax() - GetCursorPos()
     330    IMGUI_API ImVec2        GetWindowContentRegionMin();                                    // content boundaries min (roughly (0,0)-Scroll), in window coordinates
     331    IMGUI_API ImVec2        GetWindowContentRegionMax();                                    // content boundaries max (roughly (0,0)+Size-Scroll) where Size can be override with SetNextWindowContentSize(), in window coordinates
     332    IMGUI_API float         GetWindowContentRegionWidth();                                  //
     333
     334    // Windows Scrolling
     335    IMGUI_API float         GetScrollX();                                                   // get scrolling amount [0..GetScrollMaxX()]
     336    IMGUI_API float         GetScrollY();                                                   // get scrolling amount [0..GetScrollMaxY()]
     337    IMGUI_API float         GetScrollMaxX();                                                // get maximum scrolling amount ~~ ContentSize.x - WindowSize.x
     338    IMGUI_API float         GetScrollMaxY();                                                // get maximum scrolling amount ~~ ContentSize.y - WindowSize.y
     339    IMGUI_API void          SetScrollX(float scroll_x);                                     // set scrolling amount [0..GetScrollMaxX()]
     340    IMGUI_API void          SetScrollY(float scroll_y);                                     // set scrolling amount [0..GetScrollMaxY()]
     341    IMGUI_API void          SetScrollHereX(float center_x_ratio = 0.5f);                    // adjust scrolling amount to make current cursor position visible. center_x_ratio=0.0: left, 0.5: center, 1.0: right. When using to make a "default/current item" visible, consider using SetItemDefaultFocus() instead.
     342    IMGUI_API void          SetScrollHereY(float center_y_ratio = 0.5f);                    // adjust scrolling amount to make current cursor position visible. center_y_ratio=0.0: top, 0.5: center, 1.0: bottom. When using to make a "default/current item" visible, consider using SetItemDefaultFocus() instead.
     343    IMGUI_API void          SetScrollFromPosX(float local_x, float center_x_ratio = 0.5f);  // adjust scrolling amount to make given position visible. Generally GetCursorStartPos() + offset to compute a valid position.
     344    IMGUI_API void          SetScrollFromPosY(float local_y, float center_y_ratio = 0.5f);  // adjust scrolling amount to make given position visible. Generally GetCursorStartPos() + offset to compute a valid position.
     345
     346    // Parameters stacks (shared)
     347    IMGUI_API void          PushFont(ImFont* font);                                         // use NULL as a shortcut to push default font
     348    IMGUI_API void          PopFont();
     349    IMGUI_API void          PushStyleColor(ImGuiCol idx, ImU32 col);
     350    IMGUI_API void          PushStyleColor(ImGuiCol idx, const ImVec4& col);
     351    IMGUI_API void          PopStyleColor(int count = 1);
     352    IMGUI_API void          PushStyleVar(ImGuiStyleVar idx, float val);
     353    IMGUI_API void          PushStyleVar(ImGuiStyleVar idx, const ImVec2& val);
     354    IMGUI_API void          PopStyleVar(int count = 1);
     355    IMGUI_API const ImVec4& GetStyleColorVec4(ImGuiCol idx);                                // retrieve style color as stored in ImGuiStyle structure. use to feed back into PushStyleColor(), otherwise use GetColorU32() to get style color with style alpha baked in.
     356    IMGUI_API ImFont*       GetFont();                                                      // get current font
     357    IMGUI_API float         GetFontSize();                                                  // get current font size (= height in pixels) of current font with current scale applied
     358    IMGUI_API ImVec2        GetFontTexUvWhitePixel();                                       // get UV coordinate for a while pixel, useful to draw custom shapes via the ImDrawList API
     359    IMGUI_API ImU32         GetColorU32(ImGuiCol idx, float alpha_mul = 1.0f);              // retrieve given style color with style alpha applied and optional extra alpha multiplier
     360    IMGUI_API ImU32         GetColorU32(const ImVec4& col);                                 // retrieve given color with style alpha applied
     361    IMGUI_API ImU32         GetColorU32(ImU32 col);                                         // retrieve given color with style alpha applied
     362
     363    // Parameters stacks (current window)
     364    IMGUI_API void          PushItemWidth(float item_width);                                // push width of items for common large "item+label" widgets. >0.0f: width in pixels, <0.0f align xx pixels to the right of window (so -1.0f always align width to the right side). 0.0f = default to ~2/3 of windows width,
     365    IMGUI_API void          PopItemWidth();
     366    IMGUI_API void          SetNextItemWidth(float item_width);                             // set width of the _next_ common large "item+label" widget. >0.0f: width in pixels, <0.0f align xx pixels to the right of window (so -1.0f always align width to the right side)
     367    IMGUI_API float         CalcItemWidth();                                                // width of item given pushed settings and current cursor position. NOT necessarily the width of last item unlike most 'Item' functions.
     368    IMGUI_API void          PushTextWrapPos(float wrap_local_pos_x = 0.0f);                 // push word-wrapping position for Text*() commands. < 0.0f: no wrapping; 0.0f: wrap to end of window (or column); > 0.0f: wrap at 'wrap_pos_x' position in window local space
     369    IMGUI_API void          PopTextWrapPos();
     370    IMGUI_API void          PushAllowKeyboardFocus(bool allow_keyboard_focus);              // allow focusing using TAB/Shift-TAB, enabled by default but you can disable it for certain widgets
     371    IMGUI_API void          PopAllowKeyboardFocus();
     372    IMGUI_API void          PushButtonRepeat(bool repeat);                                  // in 'repeat' mode, Button*() functions return repeated true in a typematic manner (using io.KeyRepeatDelay/io.KeyRepeatRate setting). Note that you can call IsItemActive() after any Button() to tell if the button is held in the current frame.
     373    IMGUI_API void          PopButtonRepeat();
     374
     375    // Cursor / Layout
     376    // - By "cursor" we mean the current output position.
     377    // - The typical widget behavior is to output themselves at the current cursor position, then move the cursor one line down.
     378    // - You can call SameLine() between widgets to undo the last carriage return and output at the right of the preceding widget.
     379    // - Attention! We currently have inconsistencies between window-local and absolute positions we will aim to fix with future API:
     380    //    Window-local coordinates:   SameLine(), GetCursorPos(), SetCursorPos(), GetCursorStartPos(), GetContentRegionMax(), GetWindowContentRegion*(), PushTextWrapPos()
     381    //    Absolute coordinate:        GetCursorScreenPos(), SetCursorScreenPos(), all ImDrawList:: functions.
     382    IMGUI_API void          Separator();                                                    // separator, generally horizontal. inside a menu bar or in horizontal layout mode, this becomes a vertical separator.
     383    IMGUI_API void          SameLine(float offset_from_start_x=0.0f, float spacing=-1.0f);  // call between widgets or groups to layout them horizontally. X position given in window coordinates.
     384    IMGUI_API void          NewLine();                                                      // undo a SameLine() or force a new line when in an horizontal-layout context.
     385    IMGUI_API void          Spacing();                                                      // add vertical spacing.
     386    IMGUI_API void          Dummy(const ImVec2& size);                                      // add a dummy item of given size. unlike InvisibleButton(), Dummy() won't take the mouse click or be navigable into.
     387    IMGUI_API void          Indent(float indent_w = 0.0f);                                  // move content position toward the right, by style.IndentSpacing or indent_w if != 0
     388    IMGUI_API void          Unindent(float indent_w = 0.0f);                                // move content position back to the left, by style.IndentSpacing or indent_w if != 0
     389    IMGUI_API void          BeginGroup();                                                   // lock horizontal starting position
     390    IMGUI_API void          EndGroup();                                                     // unlock horizontal starting position + capture the whole group bounding box into one "item" (so you can use IsItemHovered() or layout primitives such as SameLine() on whole group, etc.)
     391    IMGUI_API ImVec2        GetCursorPos();                                                 // cursor position in window coordinates (relative to window position)
     392    IMGUI_API float         GetCursorPosX();                                                //   (some functions are using window-relative coordinates, such as: GetCursorPos, GetCursorStartPos, GetContentRegionMax, GetWindowContentRegion* etc.
     393    IMGUI_API float         GetCursorPosY();                                                //    other functions such as GetCursorScreenPos or everything in ImDrawList::
     394    IMGUI_API void          SetCursorPos(const ImVec2& local_pos);                          //    are using the main, absolute coordinate system.
     395    IMGUI_API void          SetCursorPosX(float local_x);                                   //    GetWindowPos() + GetCursorPos() == GetCursorScreenPos() etc.)
     396    IMGUI_API void          SetCursorPosY(float local_y);                                   //
     397    IMGUI_API ImVec2        GetCursorStartPos();                                            // initial cursor position in window coordinates
     398    IMGUI_API ImVec2        GetCursorScreenPos();                                           // cursor position in absolute screen coordinates [0..io.DisplaySize] (useful to work with ImDrawList API)
     399    IMGUI_API void          SetCursorScreenPos(const ImVec2& pos);                          // cursor position in absolute screen coordinates [0..io.DisplaySize]
     400    IMGUI_API void          AlignTextToFramePadding();                                      // vertically align upcoming text baseline to FramePadding.y so that it will align properly to regularly framed items (call if you have text on a line before a framed item)
     401    IMGUI_API float         GetTextLineHeight();                                            // ~ FontSize
     402    IMGUI_API float         GetTextLineHeightWithSpacing();                                 // ~ FontSize + style.ItemSpacing.y (distance in pixels between 2 consecutive lines of text)
     403    IMGUI_API float         GetFrameHeight();                                               // ~ FontSize + style.FramePadding.y * 2
     404    IMGUI_API float         GetFrameHeightWithSpacing();                                    // ~ FontSize + style.FramePadding.y * 2 + style.ItemSpacing.y (distance in pixels between 2 consecutive lines of framed widgets)
     405
     406    // ID stack/scopes
     407    // - Read the FAQ for more details about how ID are handled in dear imgui. If you are creating widgets in a loop you most
     408    //   likely want to push a unique identifier (e.g. object pointer, loop index) to uniquely differentiate them.
     409    // - The resulting ID are hashes of the entire stack.
     410    // - You can also use the "Label##foobar" syntax within widget label to distinguish them from each others.
     411    // - In this header file we use the "label"/"name" terminology to denote a string that will be displayed and used as an ID,
     412    //   whereas "str_id" denote a string that is only used as an ID and not normally displayed.
     413    IMGUI_API void          PushID(const char* str_id);                                     // push string into the ID stack (will hash string).
     414    IMGUI_API void          PushID(const char* str_id_begin, const char* str_id_end);       // push string into the ID stack (will hash string).
     415    IMGUI_API void          PushID(const void* ptr_id);                                     // push pointer into the ID stack (will hash pointer).
     416    IMGUI_API void          PushID(int int_id);                                             // push integer into the ID stack (will hash integer).
     417    IMGUI_API void          PopID();                                                        // pop from the ID stack.
     418    IMGUI_API ImGuiID       GetID(const char* str_id);                                      // calculate unique ID (hash of whole ID stack + given parameter). e.g. if you want to query into ImGuiStorage yourself
     419    IMGUI_API ImGuiID       GetID(const char* str_id_begin, const char* str_id_end);
     420    IMGUI_API ImGuiID       GetID(const void* ptr_id);
     421
     422    // Widgets: Text
     423    IMGUI_API void          TextUnformatted(const char* text, const char* text_end = NULL); // raw text without formatting. Roughly equivalent to Text("%s", text) but: A) doesn't require null terminated string if 'text_end' is specified, B) it's faster, no memory copy is done, no buffer size limits, recommended for long chunks of text.
     424    IMGUI_API void          Text(const char* fmt, ...)                                      IM_FMTARGS(1); // formatted text
     425    IMGUI_API void          TextV(const char* fmt, va_list args)                            IM_FMTLIST(1);
     426    IMGUI_API void          TextColored(const ImVec4& col, const char* fmt, ...)            IM_FMTARGS(2); // shortcut for PushStyleColor(ImGuiCol_Text, col); Text(fmt, ...); PopStyleColor();
     427    IMGUI_API void          TextColoredV(const ImVec4& col, const char* fmt, va_list args)  IM_FMTLIST(2);
     428    IMGUI_API void          TextDisabled(const char* fmt, ...)                              IM_FMTARGS(1); // shortcut for PushStyleColor(ImGuiCol_Text, style.Colors[ImGuiCol_TextDisabled]); Text(fmt, ...); PopStyleColor();
     429    IMGUI_API void          TextDisabledV(const char* fmt, va_list args)                    IM_FMTLIST(1);
     430    IMGUI_API void          TextWrapped(const char* fmt, ...)                               IM_FMTARGS(1); // shortcut for PushTextWrapPos(0.0f); Text(fmt, ...); PopTextWrapPos();. Note that this won't work on an auto-resizing window if there's no other widgets to extend the window width, yoy may need to set a size using SetNextWindowSize().
     431    IMGUI_API void          TextWrappedV(const char* fmt, va_list args)                     IM_FMTLIST(1);
     432    IMGUI_API void          LabelText(const char* label, const char* fmt, ...)              IM_FMTARGS(2); // display text+label aligned the same way as value+label widgets
     433    IMGUI_API void          LabelTextV(const char* label, const char* fmt, va_list args)    IM_FMTLIST(2);
     434    IMGUI_API void          BulletText(const char* fmt, ...)                                IM_FMTARGS(1); // shortcut for Bullet()+Text()
     435    IMGUI_API void          BulletTextV(const char* fmt, va_list args)                      IM_FMTLIST(1);
     436
     437    // Widgets: Main
     438    // - Most widgets return true when the value has been changed or when pressed/selected
     439    // - You may also use one of the many IsItemXXX functions (e.g. IsItemActive, IsItemHovered, etc.) to query widget state.
     440    IMGUI_API bool          Button(const char* label, const ImVec2& size = ImVec2(0, 0));   // button
     441    IMGUI_API bool          SmallButton(const char* label);                                 // button with FramePadding=(0,0) to easily embed within text
     442    IMGUI_API bool          InvisibleButton(const char* str_id, const ImVec2& size, ImGuiButtonFlags flags = 0); // flexible button behavior without the visuals, frequently useful to build custom behaviors using the public api (along with IsItemActive, IsItemHovered, etc.)
     443    IMGUI_API bool          ArrowButton(const char* str_id, ImGuiDir dir);                  // square button with an arrow shape
     444    IMGUI_API void          Image(ImTextureID user_texture_id, const ImVec2& size, const ImVec2& uv0 = ImVec2(0, 0), const ImVec2& uv1 = ImVec2(1,1), const ImVec4& tint_col = ImVec4(1,1,1,1), const ImVec4& border_col = ImVec4(0,0,0,0));
     445    IMGUI_API bool          ImageButton(ImTextureID user_texture_id, const ImVec2& size, const ImVec2& uv0 = ImVec2(0, 0),  const ImVec2& uv1 = ImVec2(1,1), int frame_padding = -1, const ImVec4& bg_col = ImVec4(0,0,0,0), const ImVec4& tint_col = ImVec4(1,1,1,1));    // <0 frame_padding uses default frame padding settings. 0 for no padding
     446    IMGUI_API bool          Checkbox(const char* label, bool* v);
     447    IMGUI_API bool          CheckboxFlags(const char* label, unsigned int* flags, unsigned int flags_value);
     448    IMGUI_API bool          RadioButton(const char* label, bool active);                    // use with e.g. if (RadioButton("one", my_value==1)) { my_value = 1; }
     449    IMGUI_API bool          RadioButton(const char* label, int* v, int v_button);           // shortcut to handle the above pattern when value is an integer
     450    IMGUI_API void          ProgressBar(float fraction, const ImVec2& size_arg = ImVec2(-1, 0), const char* overlay = NULL);
     451    IMGUI_API void          Bullet();                                                       // draw a small circle + keep the cursor on the same line. advance cursor x position by GetTreeNodeToLabelSpacing(), same distance that TreeNode() uses
     452
     453    // Widgets: Combo Box
     454    // - The BeginCombo()/EndCombo() api allows you to manage your contents and selection state however you want it, by creating e.g. Selectable() items.
     455    // - The old Combo() api are helpers over BeginCombo()/EndCombo() which are kept available for convenience purpose.
     456    IMGUI_API bool          BeginCombo(const char* label, const char* preview_value, ImGuiComboFlags flags = 0);
     457    IMGUI_API void          EndCombo(); // only call EndCombo() if BeginCombo() returns true!
     458    IMGUI_API bool          Combo(const char* label, int* current_item, const char* const items[], int items_count, int popup_max_height_in_items = -1);
     459    IMGUI_API bool          Combo(const char* label, int* current_item, const char* items_separated_by_zeros, int popup_max_height_in_items = -1);      // Separate items with \0 within a string, end item-list with \0\0. e.g. "One\0Two\0Three\0"
     460    IMGUI_API bool          Combo(const char* label, int* current_item, bool(*items_getter)(void* data, int idx, const char** out_text), void* data, int items_count, int popup_max_height_in_items = -1);
     461
     462    // Widgets: Drag Sliders
     463    // - CTRL+Click on any drag box to turn them into an input box. Manually input values aren't clamped and can go off-bounds.
     464    // - For all the Float2/Float3/Float4/Int2/Int3/Int4 versions of every functions, note that a 'float v[X]' function argument is the same as 'float* v', the array syntax is just a way to document the number of elements that are expected to be accessible. You can pass address of your first element out of a contiguous set, e.g. &myvector.x
     465    // - Adjust format string to decorate the value with a prefix, a suffix, or adapt the editing and display precision e.g. "%.3f" -> 1.234; "%5.2f secs" -> 01.23 secs; "Biscuit: %.0f" -> Biscuit: 1; etc.
     466    // - Format string may also be set to NULL or use the default format ("%f" or "%d").
     467    // - Speed are per-pixel of mouse movement (v_speed=0.2f: mouse needs to move by 5 pixels to increase value by 1). For gamepad/keyboard navigation, minimum speed is Max(v_speed, minimum_step_at_given_precision).
     468    // - Use v_min < v_max to clamp edits to given limits. Note that CTRL+Click manual input can override those limits.
     469    // - Use v_max = FLT_MAX / INT_MAX etc to avoid clamping to a maximum, same with v_min = -FLT_MAX / INT_MIN to avoid clamping to a minimum.
     470    // - We use the same sets of flags for DragXXX() and SliderXXX() functions as the features are the same and it makes it easier to swap them.
     471    // - Legacy: Pre-1.78 there are DragXXX() function signatures that takes a final `float power=1.0f' argument instead of the `ImGuiSliderFlags flags=0' argument.
     472    //   If you get a warning converting a float to ImGuiSliderFlags, read https://github.com/ocornut/imgui/issues/3361
     473    IMGUI_API bool          DragFloat(const char* label, float* v, float v_speed = 1.0f, float v_min = 0.0f, float v_max = 0.0f, const char* format = "%.3f", ImGuiSliderFlags flags = 0);     // If v_min >= v_max we have no bound
     474    IMGUI_API bool          DragFloat2(const char* label, float v[2], float v_speed = 1.0f, float v_min = 0.0f, float v_max = 0.0f, const char* format = "%.3f", ImGuiSliderFlags flags = 0);
     475    IMGUI_API bool          DragFloat3(const char* label, float v[3], float v_speed = 1.0f, float v_min = 0.0f, float v_max = 0.0f, const char* format = "%.3f", ImGuiSliderFlags flags = 0);
     476    IMGUI_API bool          DragFloat4(const char* label, float v[4], float v_speed = 1.0f, float v_min = 0.0f, float v_max = 0.0f, const char* format = "%.3f", ImGuiSliderFlags flags = 0);
     477    IMGUI_API bool          DragFloatRange2(const char* label, float* v_current_min, float* v_current_max, float v_speed = 1.0f, float v_min = 0.0f, float v_max = 0.0f, const char* format = "%.3f", const char* format_max = NULL, ImGuiSliderFlags flags = 0);
     478    IMGUI_API bool          DragInt(const char* label, int* v, float v_speed = 1.0f, int v_min = 0, int v_max = 0, const char* format = "%d", ImGuiSliderFlags flags = 0);  // If v_min >= v_max we have no bound
     479    IMGUI_API bool          DragInt2(const char* label, int v[2], float v_speed = 1.0f, int v_min = 0, int v_max = 0, const char* format = "%d", ImGuiSliderFlags flags = 0);
     480    IMGUI_API bool          DragInt3(const char* label, int v[3], float v_speed = 1.0f, int v_min = 0, int v_max = 0, const char* format = "%d", ImGuiSliderFlags flags = 0);
     481    IMGUI_API bool          DragInt4(const char* label, int v[4], float v_speed = 1.0f, int v_min = 0, int v_max = 0, const char* format = "%d", ImGuiSliderFlags flags = 0);
     482    IMGUI_API bool          DragIntRange2(const char* label, int* v_current_min, int* v_current_max, float v_speed = 1.0f, int v_min = 0, int v_max = 0, const char* format = "%d", const char* format_max = NULL, ImGuiSliderFlags flags = 0);
     483    IMGUI_API bool          DragScalar(const char* label, ImGuiDataType data_type, void* p_data, float v_speed, const void* p_min = NULL, const void* p_max = NULL, const char* format = NULL, ImGuiSliderFlags flags = 0);
     484    IMGUI_API bool          DragScalarN(const char* label, ImGuiDataType data_type, void* p_data, int components, float v_speed, const void* p_min = NULL, const void* p_max = NULL, const char* format = NULL, ImGuiSliderFlags flags = 0);
     485
     486    // Widgets: Regular Sliders
     487    // - CTRL+Click on any slider to turn them into an input box. Manually input values aren't clamped and can go off-bounds.
     488    // - Adjust format string to decorate the value with a prefix, a suffix, or adapt the editing and display precision e.g. "%.3f" -> 1.234; "%5.2f secs" -> 01.23 secs; "Biscuit: %.0f" -> Biscuit: 1; etc.
     489    // - Format string may also be set to NULL or use the default format ("%f" or "%d").
     490    // - Legacy: Pre-1.78 there are SliderXXX() function signatures that takes a final `float power=1.0f' argument instead of the `ImGuiSliderFlags flags=0' argument.
     491    //   If you get a warning converting a float to ImGuiSliderFlags, read https://github.com/ocornut/imgui/issues/3361
     492    IMGUI_API bool          SliderFloat(const char* label, float* v, float v_min, float v_max, const char* format = "%.3f", ImGuiSliderFlags flags = 0);     // adjust format to decorate the value with a prefix or a suffix for in-slider labels or unit display.
     493    IMGUI_API bool          SliderFloat2(const char* label, float v[2], float v_min, float v_max, const char* format = "%.3f", ImGuiSliderFlags flags = 0);
     494    IMGUI_API bool          SliderFloat3(const char* label, float v[3], float v_min, float v_max, const char* format = "%.3f", ImGuiSliderFlags flags = 0);
     495    IMGUI_API bool          SliderFloat4(const char* label, float v[4], float v_min, float v_max, const char* format = "%.3f", ImGuiSliderFlags flags = 0);
     496    IMGUI_API bool          SliderAngle(const char* label, float* v_rad, float v_degrees_min = -360.0f, float v_degrees_max = +360.0f, const char* format = "%.0f deg", ImGuiSliderFlags flags = 0);
     497    IMGUI_API bool          SliderInt(const char* label, int* v, int v_min, int v_max, const char* format = "%d", ImGuiSliderFlags flags = 0);
     498    IMGUI_API bool          SliderInt2(const char* label, int v[2], int v_min, int v_max, const char* format = "%d", ImGuiSliderFlags flags = 0);
     499    IMGUI_API bool          SliderInt3(const char* label, int v[3], int v_min, int v_max, const char* format = "%d", ImGuiSliderFlags flags = 0);
     500    IMGUI_API bool          SliderInt4(const char* label, int v[4], int v_min, int v_max, const char* format = "%d", ImGuiSliderFlags flags = 0);
     501    IMGUI_API bool          SliderScalar(const char* label, ImGuiDataType data_type, void* p_data, const void* p_min, const void* p_max, const char* format = NULL, ImGuiSliderFlags flags = 0);
     502    IMGUI_API bool          SliderScalarN(const char* label, ImGuiDataType data_type, void* p_data, int components, const void* p_min, const void* p_max, const char* format = NULL, ImGuiSliderFlags flags = 0);
     503    IMGUI_API bool          VSliderFloat(const char* label, const ImVec2& size, float* v, float v_min, float v_max, const char* format = "%.3f", ImGuiSliderFlags flags = 0);
     504    IMGUI_API bool          VSliderInt(const char* label, const ImVec2& size, int* v, int v_min, int v_max, const char* format = "%d", ImGuiSliderFlags flags = 0);
     505    IMGUI_API bool          VSliderScalar(const char* label, const ImVec2& size, ImGuiDataType data_type, void* p_data, const void* p_min, const void* p_max, const char* format = NULL, ImGuiSliderFlags flags = 0);
     506
     507    // Widgets: Input with Keyboard
     508    // - If you want to use InputText() with std::string or any custom dynamic string type, see misc/cpp/imgui_stdlib.h and comments in imgui_demo.cpp.
     509    // - Most of the ImGuiInputTextFlags flags are only useful for InputText() and not for InputFloatX, InputIntX, InputDouble etc.
     510    IMGUI_API bool          InputText(const char* label, char* buf, size_t buf_size, ImGuiInputTextFlags flags = 0, ImGuiInputTextCallback callback = NULL, void* user_data = NULL);
     511    IMGUI_API bool          InputTextMultiline(const char* label, char* buf, size_t buf_size, const ImVec2& size = ImVec2(0, 0), ImGuiInputTextFlags flags = 0, ImGuiInputTextCallback callback = NULL, void* user_data = NULL);
     512    IMGUI_API bool          InputTextWithHint(const char* label, const char* hint, char* buf, size_t buf_size, ImGuiInputTextFlags flags = 0, ImGuiInputTextCallback callback = NULL, void* user_data = NULL);
     513    IMGUI_API bool          InputFloat(const char* label, float* v, float step = 0.0f, float step_fast = 0.0f, const char* format = "%.3f", ImGuiInputTextFlags flags = 0);
     514    IMGUI_API bool          InputFloat2(const char* label, float v[2], const char* format = "%.3f", ImGuiInputTextFlags flags = 0);
     515    IMGUI_API bool          InputFloat3(const char* label, float v[3], const char* format = "%.3f", ImGuiInputTextFlags flags = 0);
     516    IMGUI_API bool          InputFloat4(const char* label, float v[4], const char* format = "%.3f", ImGuiInputTextFlags flags = 0);
     517    IMGUI_API bool          InputInt(const char* label, int* v, int step = 1, int step_fast = 100, ImGuiInputTextFlags flags = 0);
     518    IMGUI_API bool          InputInt2(const char* label, int v[2], ImGuiInputTextFlags flags = 0);
     519    IMGUI_API bool          InputInt3(const char* label, int v[3], ImGuiInputTextFlags flags = 0);
     520    IMGUI_API bool          InputInt4(const char* label, int v[4], ImGuiInputTextFlags flags = 0);
     521    IMGUI_API bool          InputDouble(const char* label, double* v, double step = 0.0, double step_fast = 0.0, const char* format = "%.6f", ImGuiInputTextFlags flags = 0);
     522    IMGUI_API bool          InputScalar(const char* label, ImGuiDataType data_type, void* p_data, const void* p_step = NULL, const void* p_step_fast = NULL, const char* format = NULL, ImGuiInputTextFlags flags = 0);
     523    IMGUI_API bool          InputScalarN(const char* label, ImGuiDataType data_type, void* p_data, int components, const void* p_step = NULL, const void* p_step_fast = NULL, const char* format = NULL, ImGuiInputTextFlags flags = 0);
     524
     525    // Widgets: Color Editor/Picker (tip: the ColorEdit* functions have a little colored preview square that can be left-clicked to open a picker, and right-clicked to open an option menu.)
     526    // - Note that in C++ a 'float v[X]' function argument is the _same_ as 'float* v', the array syntax is just a way to document the number of elements that are expected to be accessible.
     527    // - You can pass the address of a first float element out of a contiguous structure, e.g. &myvector.x
     528    IMGUI_API bool          ColorEdit3(const char* label, float col[3], ImGuiColorEditFlags flags = 0);
     529    IMGUI_API bool          ColorEdit4(const char* label, float col[4], ImGuiColorEditFlags flags = 0);
     530    IMGUI_API bool          ColorPicker3(const char* label, float col[3], ImGuiColorEditFlags flags = 0);
     531    IMGUI_API bool          ColorPicker4(const char* label, float col[4], ImGuiColorEditFlags flags = 0, const float* ref_col = NULL);
     532    IMGUI_API bool          ColorButton(const char* desc_id, const ImVec4& col, ImGuiColorEditFlags flags = 0, ImVec2 size = ImVec2(0, 0)); // display a colored square/button, hover for details, return true when pressed.
     533    IMGUI_API void          SetColorEditOptions(ImGuiColorEditFlags flags);                     // initialize current options (generally on application startup) if you want to select a default format, picker type, etc. User will be able to change many settings, unless you pass the _NoOptions flag to your calls.
     534
     535    // Widgets: Trees
     536    // - TreeNode functions return true when the node is open, in which case you need to also call TreePop() when you are finished displaying the tree node contents.
     537    IMGUI_API bool          TreeNode(const char* label);
     538    IMGUI_API bool          TreeNode(const char* str_id, const char* fmt, ...) IM_FMTARGS(2);   // helper variation to easily decorelate the id from the displayed string. Read the FAQ about why and how to use ID. to align arbitrary text at the same level as a TreeNode() you can use Bullet().
     539    IMGUI_API bool          TreeNode(const void* ptr_id, const char* fmt, ...) IM_FMTARGS(2);   // "
     540    IMGUI_API bool          TreeNodeV(const char* str_id, const char* fmt, va_list args) IM_FMTLIST(2);
     541    IMGUI_API bool          TreeNodeV(const void* ptr_id, const char* fmt, va_list args) IM_FMTLIST(2);
     542    IMGUI_API bool          TreeNodeEx(const char* label, ImGuiTreeNodeFlags flags = 0);
     543    IMGUI_API bool          TreeNodeEx(const char* str_id, ImGuiTreeNodeFlags flags, const char* fmt, ...) IM_FMTARGS(3);
     544    IMGUI_API bool          TreeNodeEx(const void* ptr_id, ImGuiTreeNodeFlags flags, const char* fmt, ...) IM_FMTARGS(3);
     545    IMGUI_API bool          TreeNodeExV(const char* str_id, ImGuiTreeNodeFlags flags, const char* fmt, va_list args) IM_FMTLIST(3);
     546    IMGUI_API bool          TreeNodeExV(const void* ptr_id, ImGuiTreeNodeFlags flags, const char* fmt, va_list args) IM_FMTLIST(3);
     547    IMGUI_API void          TreePush(const char* str_id);                                       // ~ Indent()+PushId(). Already called by TreeNode() when returning true, but you can call TreePush/TreePop yourself if desired.
     548    IMGUI_API void          TreePush(const void* ptr_id = NULL);                                // "
     549    IMGUI_API void          TreePop();                                                          // ~ Unindent()+PopId()
     550    IMGUI_API float         GetTreeNodeToLabelSpacing();                                        // horizontal distance preceding label when using TreeNode*() or Bullet() == (g.FontSize + style.FramePadding.x*2) for a regular unframed TreeNode
     551    IMGUI_API bool          CollapsingHeader(const char* label, ImGuiTreeNodeFlags flags = 0);  // if returning 'true' the header is open. doesn't indent nor push on ID stack. user doesn't have to call TreePop().
     552    IMGUI_API bool          CollapsingHeader(const char* label, bool* p_open, ImGuiTreeNodeFlags flags = 0); // when 'p_open' isn't NULL, display an additional small close button on upper right of the header
     553    IMGUI_API void          SetNextItemOpen(bool is_open, ImGuiCond cond = 0);                  // set next TreeNode/CollapsingHeader open state.
     554
     555    // Widgets: Selectables
     556    // - A selectable highlights when hovered, and can display another color when selected.
     557    // - Neighbors selectable extend their highlight bounds in order to leave no gap between them. This is so a series of selected Selectable appear contiguous.
     558    IMGUI_API bool          Selectable(const char* label, bool selected = false, ImGuiSelectableFlags flags = 0, const ImVec2& size = ImVec2(0, 0)); // "bool selected" carry the selection state (read-only). Selectable() is clicked is returns true so you can modify your selection state. size.x==0.0: use remaining width, size.x>0.0: specify width. size.y==0.0: use label height, size.y>0.0: specify height
     559    IMGUI_API bool          Selectable(const char* label, bool* p_selected, ImGuiSelectableFlags flags = 0, const ImVec2& size = ImVec2(0, 0));      // "bool* p_selected" point to the selection state (read-write), as a convenient helper.
     560
     561    // Widgets: List Boxes
     562    // - FIXME: To be consistent with all the newer API, ListBoxHeader/ListBoxFooter should in reality be called BeginListBox/EndListBox. Will rename them.
     563    IMGUI_API bool          ListBox(const char* label, int* current_item, const char* const items[], int items_count, int height_in_items = -1);
     564    IMGUI_API bool          ListBox(const char* label, int* current_item, bool (*items_getter)(void* data, int idx, const char** out_text), void* data, int items_count, int height_in_items = -1);
     565    IMGUI_API bool          ListBoxHeader(const char* label, const ImVec2& size = ImVec2(0, 0)); // use if you want to reimplement ListBox() will custom data or interactions. if the function return true, you can output elements then call ListBoxFooter() afterwards.
     566    IMGUI_API bool          ListBoxHeader(const char* label, int items_count, int height_in_items = -1); // "
     567    IMGUI_API void          ListBoxFooter();                                                    // terminate the scrolling region. only call ListBoxFooter() if ListBoxHeader() returned true!
     568
     569    // Widgets: Data Plotting
     570    IMGUI_API void          PlotLines(const char* label, const float* values, int values_count, int values_offset = 0, const char* overlay_text = NULL, float scale_min = FLT_MAX, float scale_max = FLT_MAX, ImVec2 graph_size = ImVec2(0, 0), int stride = sizeof(float));
     571    IMGUI_API void          PlotLines(const char* label, float(*values_getter)(void* data, int idx), void* data, int values_count, int values_offset = 0, const char* overlay_text = NULL, float scale_min = FLT_MAX, float scale_max = FLT_MAX, ImVec2 graph_size = ImVec2(0, 0));
     572    IMGUI_API void          PlotHistogram(const char* label, const float* values, int values_count, int values_offset = 0, const char* overlay_text = NULL, float scale_min = FLT_MAX, float scale_max = FLT_MAX, ImVec2 graph_size = ImVec2(0, 0), int stride = sizeof(float));
     573    IMGUI_API void          PlotHistogram(const char* label, float(*values_getter)(void* data, int idx), void* data, int values_count, int values_offset = 0, const char* overlay_text = NULL, float scale_min = FLT_MAX, float scale_max = FLT_MAX, ImVec2 graph_size = ImVec2(0, 0));
     574
     575    // Widgets: Value() Helpers.
     576    // - Those are merely shortcut to calling Text() with a format string. Output single value in "name: value" format (tip: freely declare more in your code to handle your types. you can add functions to the ImGui namespace)
     577    IMGUI_API void          Value(const char* prefix, bool b);
     578    IMGUI_API void          Value(const char* prefix, int v);
     579    IMGUI_API void          Value(const char* prefix, unsigned int v);
     580    IMGUI_API void          Value(const char* prefix, float v, const char* float_format = NULL);
     581
     582    // Widgets: Menus
     583    // - Use BeginMenuBar() on a window ImGuiWindowFlags_MenuBar to append to its menu bar.
     584    // - Use BeginMainMenuBar() to create a menu bar at the top of the screen and append to it.
     585    // - Use BeginMenu() to create a menu. You can call BeginMenu() multiple time with the same identifier to append more items to it.
     586    IMGUI_API bool          BeginMenuBar();                                                     // append to menu-bar of current window (requires ImGuiWindowFlags_MenuBar flag set on parent window).
     587    IMGUI_API void          EndMenuBar();                                                       // only call EndMenuBar() if BeginMenuBar() returns true!
     588    IMGUI_API bool          BeginMainMenuBar();                                                 // create and append to a full screen menu-bar.
     589    IMGUI_API void          EndMainMenuBar();                                                   // only call EndMainMenuBar() if BeginMainMenuBar() returns true!
     590    IMGUI_API bool          BeginMenu(const char* label, bool enabled = true);                  // create a sub-menu entry. only call EndMenu() if this returns true!
     591    IMGUI_API void          EndMenu();                                                          // only call EndMenu() if BeginMenu() returns true!
     592    IMGUI_API bool          MenuItem(const char* label, const char* shortcut = NULL, bool selected = false, bool enabled = true);  // return true when activated. shortcuts are displayed for convenience but not processed by ImGui at the moment
     593    IMGUI_API bool          MenuItem(const char* label, const char* shortcut, bool* p_selected, bool enabled = true);              // return true when activated + toggle (*p_selected) if p_selected != NULL
     594
     595    // Tooltips
     596    // - Tooltip are windows following the mouse which do not take focus away.
     597    IMGUI_API void          BeginTooltip();                                                     // begin/append a tooltip window. to create full-featured tooltip (with any kind of items).
     598    IMGUI_API void          EndTooltip();
     599    IMGUI_API void          SetTooltip(const char* fmt, ...) IM_FMTARGS(1);                     // set a text-only tooltip, typically use with ImGui::IsItemHovered(). override any previous call to SetTooltip().
     600    IMGUI_API void          SetTooltipV(const char* fmt, va_list args) IM_FMTLIST(1);
     601
     602    // Popups, Modals
     603    //  - They block normal mouse hovering detection (and therefore most mouse interactions) behind them.
     604    //  - If not modal: they can be closed by clicking anywhere outside them, or by pressing ESCAPE.
     605    //  - Their visibility state (~bool) is held internally instead of being held by the programmer as we are used to with regular Begin*() calls.
     606    //  - The 3 properties above are related: we need to retain popup visibility state in the library because popups may be closed as any time.
     607    //  - You can bypass the hovering restriction by using ImGuiHoveredFlags_AllowWhenBlockedByPopup when calling IsItemHovered() or IsWindowHovered().
     608    //  - IMPORTANT: Popup identifiers are relative to the current ID stack, so OpenPopup and BeginPopup generally needs to be at the same level of the stack.
     609    //    This is sometimes leading to confusing mistakes. May rework this in the future.
     610    // Popups: begin/end functions
     611    //  - BeginPopup(): query popup state, if open start appending into the window. Call EndPopup() afterwards. ImGuiWindowFlags are forwarded to the window.
     612    //  - BeginPopupModal(): block every interactions behind the window, cannot be closed by user, add a dimming background, has a title bar.
     613    IMGUI_API bool          BeginPopup(const char* str_id, ImGuiWindowFlags flags = 0);                         // return true if the popup is open, and you can start outputting to it.
     614    IMGUI_API bool          BeginPopupModal(const char* name, bool* p_open = NULL, ImGuiWindowFlags flags = 0); // return true if the modal is open, and you can start outputting to it.
     615    IMGUI_API void          EndPopup();                                                                         // only call EndPopup() if BeginPopupXXX() returns true!
     616    // Popups: open/close functions
     617    //  - OpenPopup(): set popup state to open. ImGuiPopupFlags are available for opening options.
     618    //  - If not modal: they can be closed by clicking anywhere outside them, or by pressing ESCAPE.
     619    //  - CloseCurrentPopup(): use inside the BeginPopup()/EndPopup() scope to close manually.
     620    //  - CloseCurrentPopup() is called by default by Selectable()/MenuItem() when activated (FIXME: need some options).
     621    //  - Use ImGuiPopupFlags_NoOpenOverExistingPopup to avoid opening a popup if there's already one at the same level. This is equivalent to e.g. testing for !IsAnyPopupOpen() prior to OpenPopup().
     622    IMGUI_API void          OpenPopup(const char* str_id, ImGuiPopupFlags popup_flags = 0);                     // call to mark popup as open (don't call every frame!).
     623    IMGUI_API void          OpenPopupOnItemClick(const char* str_id = NULL, ImGuiPopupFlags popup_flags = 1);   // helper to open popup when clicked on last item. return true when just opened. (note: actually triggers on the mouse _released_ event to be consistent with popup behaviors)
     624    IMGUI_API void          CloseCurrentPopup();                                                                // manually close the popup we have begin-ed into.
     625    // Popups: open+begin combined functions helpers
     626    //  - Helpers to do OpenPopup+BeginPopup where the Open action is triggered by e.g. hovering an item and right-clicking.
     627    //  - They are convenient to easily create context menus, hence the name.
     628    //  - IMPORTANT: Notice that BeginPopupContextXXX takes ImGuiPopupFlags just like OpenPopup() and unlike BeginPopup(). For full consistency, we may add ImGuiWindowFlags to the BeginPopupContextXXX functions in the future.
     629    //  - IMPORTANT: we exceptionally default their flags to 1 (== ImGuiPopupFlags_MouseButtonRight) for backward compatibility with older API taking 'int mouse_button = 1' parameter, so if you add other flags remember to re-add the ImGuiPopupFlags_MouseButtonRight.
     630    IMGUI_API bool          BeginPopupContextItem(const char* str_id = NULL, ImGuiPopupFlags popup_flags = 1);  // open+begin popup when clicked on last item. if you can pass a NULL str_id only if the previous item had an id. If you want to use that on a non-interactive item such as Text() you need to pass in an explicit ID here. read comments in .cpp!
     631    IMGUI_API bool          BeginPopupContextWindow(const char* str_id = NULL, ImGuiPopupFlags popup_flags = 1);// open+begin popup when clicked on current window.
     632    IMGUI_API bool          BeginPopupContextVoid(const char* str_id = NULL, ImGuiPopupFlags popup_flags = 1);  // open+begin popup when clicked in void (where there are no windows).
     633    // Popups: test function
     634    //  - IsPopupOpen(): return true if the popup is open at the current BeginPopup() level of the popup stack.
     635    //  - IsPopupOpen() with ImGuiPopupFlags_AnyPopupId: return true if any popup is open at the current BeginPopup() level of the popup stack.
     636    //  - IsPopupOpen() with ImGuiPopupFlags_AnyPopupId + ImGuiPopupFlags_AnyPopupLevel: return true if any popup is open.
     637    IMGUI_API bool          IsPopupOpen(const char* str_id, ImGuiPopupFlags flags = 0);                         // return true if the popup is open.
     638
     639    // Columns
     640    // - You can also use SameLine(pos_x) to mimic simplified columns.
     641    // - The columns API is work-in-progress and rather lacking (columns are arguably the worst part of dear imgui at the moment!)
     642    // - There is a maximum of 64 columns.
     643    // - Currently working on new 'Tables' api which will replace columns around Q2 2020 (see GitHub #2957).
     644    IMGUI_API void          Columns(int count = 1, const char* id = NULL, bool border = true);
     645    IMGUI_API void          NextColumn();                                                       // next column, defaults to current row or next row if the current row is finished
     646    IMGUI_API int           GetColumnIndex();                                                   // get current column index
     647    IMGUI_API float         GetColumnWidth(int column_index = -1);                              // get column width (in pixels). pass -1 to use current column
     648    IMGUI_API void          SetColumnWidth(int column_index, float width);                      // set column width (in pixels). pass -1 to use current column
     649    IMGUI_API float         GetColumnOffset(int column_index = -1);                             // get position of column line (in pixels, from the left side of the contents region). pass -1 to use current column, otherwise 0..GetColumnsCount() inclusive. column 0 is typically 0.0f
     650    IMGUI_API void          SetColumnOffset(int column_index, float offset_x);                  // set position of column line (in pixels, from the left side of the contents region). pass -1 to use current column
     651    IMGUI_API int           GetColumnsCount();
     652
     653    // Tab Bars, Tabs
     654    IMGUI_API bool          BeginTabBar(const char* str_id, ImGuiTabBarFlags flags = 0);        // create and append into a TabBar
     655    IMGUI_API void          EndTabBar();                                                        // only call EndTabBar() if BeginTabBar() returns true!
     656    IMGUI_API bool          BeginTabItem(const char* label, bool* p_open = NULL, ImGuiTabItemFlags flags = 0); // create a Tab. Returns true if the Tab is selected.
     657    IMGUI_API void          EndTabItem();                                                       // only call EndTabItem() if BeginTabItem() returns true!
     658    IMGUI_API bool          TabItemButton(const char* label, ImGuiTabItemFlags flags = 0);      // create a Tab behaving like a button. return true when clicked. cannot be selected in the tab bar.
     659    IMGUI_API void          SetTabItemClosed(const char* tab_or_docked_window_label);           // notify TabBar or Docking system of a closed tab/window ahead (useful to reduce visual flicker on reorderable tab bars). For tab-bar: call after BeginTabBar() and before Tab submissions. Otherwise call with a window name.
     660
     661    // Logging/Capture
     662    // - All text output from the interface can be captured into tty/file/clipboard. By default, tree nodes are automatically opened during logging.
     663    IMGUI_API void          LogToTTY(int auto_open_depth = -1);                                 // start logging to tty (stdout)
     664    IMGUI_API void          LogToFile(int auto_open_depth = -1, const char* filename = NULL);   // start logging to file
     665    IMGUI_API void          LogToClipboard(int auto_open_depth = -1);                           // start logging to OS clipboard
     666    IMGUI_API void          LogFinish();                                                        // stop logging (close file, etc.)
     667    IMGUI_API void          LogButtons();                                                       // helper to display buttons for logging to tty/file/clipboard
     668    IMGUI_API void          LogText(const char* fmt, ...) IM_FMTARGS(1);                        // pass text data straight to log (without being displayed)
     669
     670    // Drag and Drop
     671    // - [BETA API] API may evolve!
     672    // - If you stop calling BeginDragDropSource() the payload is preserved however it won't have a preview tooltip (we currently display a fallback "..." tooltip as replacement)
     673    IMGUI_API bool          BeginDragDropSource(ImGuiDragDropFlags flags = 0);                                      // call when the current item is active. If this return true, you can call SetDragDropPayload() + EndDragDropSource()
     674    IMGUI_API bool          SetDragDropPayload(const char* type, const void* data, size_t sz, ImGuiCond cond = 0);  // type is a user defined string of maximum 32 characters. Strings starting with '_' are reserved for dear imgui internal types. Data is copied and held by imgui.
     675    IMGUI_API void          EndDragDropSource();                                                                    // only call EndDragDropSource() if BeginDragDropSource() returns true!
     676    IMGUI_API bool                  BeginDragDropTarget();                                                          // call after submitting an item that may receive a payload. If this returns true, you can call AcceptDragDropPayload() + EndDragDropTarget()
     677    IMGUI_API const ImGuiPayload*   AcceptDragDropPayload(const char* type, ImGuiDragDropFlags flags = 0);          // accept contents of a given type. If ImGuiDragDropFlags_AcceptBeforeDelivery is set you can peek into the payload before the mouse button is released.
     678    IMGUI_API void                  EndDragDropTarget();                                                            // only call EndDragDropTarget() if BeginDragDropTarget() returns true!
     679    IMGUI_API const ImGuiPayload*   GetDragDropPayload();                                                           // peek directly into the current payload from anywhere. may return NULL. use ImGuiPayload::IsDataType() to test for the payload type.
     680
     681    // Clipping
     682    IMGUI_API void          PushClipRect(const ImVec2& clip_rect_min, const ImVec2& clip_rect_max, bool intersect_with_current_clip_rect);
     683    IMGUI_API void          PopClipRect();
     684
     685    // Focus, Activation
     686    // - Prefer using "SetItemDefaultFocus()" over "if (IsWindowAppearing()) SetScrollHereY()" when applicable to signify "this is the default item"
     687    IMGUI_API void          SetItemDefaultFocus();                                              // make last item the default focused item of a window.
     688    IMGUI_API void          SetKeyboardFocusHere(int offset = 0);                               // focus keyboard on the next widget. Use positive 'offset' to access sub components of a multiple component widget. Use -1 to access previous widget.
     689
     690    // Item/Widgets Utilities
     691    // - Most of the functions are referring to the last/previous item we submitted.
     692    // - See Demo Window under "Widgets->Querying Status" for an interactive visualization of most of those functions.
     693    IMGUI_API bool          IsItemHovered(ImGuiHoveredFlags flags = 0);                         // is the last item hovered? (and usable, aka not blocked by a popup, etc.). See ImGuiHoveredFlags for more options.
     694    IMGUI_API bool          IsItemActive();                                                     // is the last item active? (e.g. button being held, text field being edited. This will continuously return true while holding mouse button on an item. Items that don't interact will always return false)
     695    IMGUI_API bool          IsItemFocused();                                                    // is the last item focused for keyboard/gamepad navigation?
     696    IMGUI_API bool          IsItemClicked(ImGuiMouseButton mouse_button = 0);                   // is the last item clicked? (e.g. button/node just clicked on) == IsMouseClicked(mouse_button) && IsItemHovered()
     697    IMGUI_API bool          IsItemVisible();                                                    // is the last item visible? (items may be out of sight because of clipping/scrolling)
     698    IMGUI_API bool          IsItemEdited();                                                     // did the last item modify its underlying value this frame? or was pressed? This is generally the same as the "bool" return value of many widgets.
     699    IMGUI_API bool          IsItemActivated();                                                  // was the last item just made active (item was previously inactive).
     700    IMGUI_API bool          IsItemDeactivated();                                                // was the last item just made inactive (item was previously active). Useful for Undo/Redo patterns with widgets that requires continuous editing.
     701    IMGUI_API bool          IsItemDeactivatedAfterEdit();                                       // was the last item just made inactive and made a value change when it was active? (e.g. Slider/Drag moved). Useful for Undo/Redo patterns with widgets that requires continuous editing. Note that you may get false positives (some widgets such as Combo()/ListBox()/Selectable() will return true even when clicking an already selected item).
     702    IMGUI_API bool          IsItemToggledOpen();                                                // was the last item open state toggled? set by TreeNode().
     703    IMGUI_API bool          IsAnyItemHovered();                                                 // is any item hovered?
     704    IMGUI_API bool          IsAnyItemActive();                                                  // is any item active?
     705    IMGUI_API bool          IsAnyItemFocused();                                                 // is any item focused?
     706    IMGUI_API ImVec2        GetItemRectMin();                                                   // get upper-left bounding rectangle of the last item (screen space)
     707    IMGUI_API ImVec2        GetItemRectMax();                                                   // get lower-right bounding rectangle of the last item (screen space)
     708    IMGUI_API ImVec2        GetItemRectSize();                                                  // get size of last item
     709    IMGUI_API void          SetItemAllowOverlap();                                              // allow last item to be overlapped by a subsequent item. sometimes useful with invisible buttons, selectables, etc. to catch unused area.
     710
     711    // Miscellaneous Utilities
     712    IMGUI_API bool          IsRectVisible(const ImVec2& size);                                  // test if rectangle (of given size, starting from cursor position) is visible / not clipped.
     713    IMGUI_API bool          IsRectVisible(const ImVec2& rect_min, const ImVec2& rect_max);      // test if rectangle (in screen space) is visible / not clipped. to perform coarse clipping on user's side.
     714    IMGUI_API double        GetTime();                                                          // get global imgui time. incremented by io.DeltaTime every frame.
     715    IMGUI_API int           GetFrameCount();                                                    // get global imgui frame count. incremented by 1 every frame.
     716    IMGUI_API ImDrawList*   GetBackgroundDrawList();                                            // this draw list will be the first rendering one. Useful to quickly draw shapes/text behind dear imgui contents.
     717    IMGUI_API ImDrawList*   GetForegroundDrawList();                                            // this draw list will be the last rendered one. Useful to quickly draw shapes/text over dear imgui contents.
     718    IMGUI_API ImDrawListSharedData* GetDrawListSharedData();                                    // you may use this when creating your own ImDrawList instances.
     719    IMGUI_API const char*   GetStyleColorName(ImGuiCol idx);                                    // get a string corresponding to the enum value (for display, saving, etc.).
     720    IMGUI_API void          SetStateStorage(ImGuiStorage* storage);                             // replace current window storage with our own (if you want to manipulate it yourself, typically clear subsection of it)
     721    IMGUI_API ImGuiStorage* GetStateStorage();
     722    IMGUI_API void          CalcListClipping(int items_count, float items_height, int* out_items_display_start, int* out_items_display_end);    // calculate coarse clipping for large list of evenly sized items. Prefer using the ImGuiListClipper higher-level helper if you can.
     723    IMGUI_API bool          BeginChildFrame(ImGuiID id, const ImVec2& size, ImGuiWindowFlags flags = 0); // helper to create a child window / scrolling region that looks like a normal widget frame
     724    IMGUI_API void          EndChildFrame();                                                    // always call EndChildFrame() regardless of BeginChildFrame() return values (which indicates a collapsed/clipped window)
     725
     726    // Text Utilities
     727    IMGUI_API ImVec2        CalcTextSize(const char* text, const char* text_end = NULL, bool hide_text_after_double_hash = false, float wrap_width = -1.0f);
     728
     729    // Color Utilities
     730    IMGUI_API ImVec4        ColorConvertU32ToFloat4(ImU32 in);
     731    IMGUI_API ImU32         ColorConvertFloat4ToU32(const ImVec4& in);
     732    IMGUI_API void          ColorConvertRGBtoHSV(float r, float g, float b, float& out_h, float& out_s, float& out_v);
     733    IMGUI_API void          ColorConvertHSVtoRGB(float h, float s, float v, float& out_r, float& out_g, float& out_b);
     734
     735    // Inputs Utilities: Keyboard
     736    // - For 'int user_key_index' you can use your own indices/enums according to how your back-end/engine stored them in io.KeysDown[].
     737    // - We don't know the meaning of those value. You can use GetKeyIndex() to map a ImGuiKey_ value into the user index.
     738    IMGUI_API int           GetKeyIndex(ImGuiKey imgui_key);                                    // map ImGuiKey_* values into user's key index. == io.KeyMap[key]
     739    IMGUI_API bool          IsKeyDown(int user_key_index);                                      // is key being held. == io.KeysDown[user_key_index].
     740    IMGUI_API bool          IsKeyPressed(int user_key_index, bool repeat = true);               // was key pressed (went from !Down to Down)? if repeat=true, uses io.KeyRepeatDelay / KeyRepeatRate
     741    IMGUI_API bool          IsKeyReleased(int user_key_index);                                  // was key released (went from Down to !Down)?
     742    IMGUI_API int           GetKeyPressedAmount(int key_index, float repeat_delay, float rate); // uses provided repeat rate/delay. return a count, most often 0 or 1 but might be >1 if RepeatRate is small enough that DeltaTime > RepeatRate
     743    IMGUI_API void          CaptureKeyboardFromApp(bool want_capture_keyboard_value = true);    // attention: misleading name! manually override io.WantCaptureKeyboard flag next frame (said flag is entirely left for your application to handle). e.g. force capture keyboard when your widget is being hovered. This is equivalent to setting "io.WantCaptureKeyboard = want_capture_keyboard_value"; after the next NewFrame() call.
     744
     745    // Inputs Utilities: Mouse
     746    // - To refer to a mouse button, you may use named enums in your code e.g. ImGuiMouseButton_Left, ImGuiMouseButton_Right.
     747    // - You can also use regular integer: it is forever guaranteed that 0=Left, 1=Right, 2=Middle.
     748    // - Dragging operations are only reported after mouse has moved a certain distance away from the initial clicking position (see 'lock_threshold' and 'io.MouseDraggingThreshold')
     749    IMGUI_API bool          IsMouseDown(ImGuiMouseButton button);                               // is mouse button held?
     750    IMGUI_API bool          IsMouseClicked(ImGuiMouseButton button, bool repeat = false);       // did mouse button clicked? (went from !Down to Down)
     751    IMGUI_API bool          IsMouseReleased(ImGuiMouseButton button);                           // did mouse button released? (went from Down to !Down)
     752    IMGUI_API bool          IsMouseDoubleClicked(ImGuiMouseButton button);                      // did mouse button double-clicked? (note that a double-click will also report IsMouseClicked() == true)
     753    IMGUI_API bool          IsMouseHoveringRect(const ImVec2& r_min, const ImVec2& r_max, bool clip = true);// is mouse hovering given bounding rect (in screen space). clipped by current clipping settings, but disregarding of other consideration of focus/window ordering/popup-block.
     754    IMGUI_API bool          IsMousePosValid(const ImVec2* mouse_pos = NULL);                    // by convention we use (-FLT_MAX,-FLT_MAX) to denote that there is no mouse available
     755    IMGUI_API bool          IsAnyMouseDown();                                                   // is any mouse button held?
     756    IMGUI_API ImVec2        GetMousePos();                                                      // shortcut to ImGui::GetIO().MousePos provided by user, to be consistent with other calls
     757    IMGUI_API ImVec2        GetMousePosOnOpeningCurrentPopup();                                 // retrieve mouse position at the time of opening popup we have BeginPopup() into (helper to avoid user backing that value themselves)
     758    IMGUI_API bool          IsMouseDragging(ImGuiMouseButton button, float lock_threshold = -1.0f);         // is mouse dragging? (if lock_threshold < -1.0f, uses io.MouseDraggingThreshold)
     759    IMGUI_API ImVec2        GetMouseDragDelta(ImGuiMouseButton button = 0, float lock_threshold = -1.0f);   // return the delta from the initial clicking position while the mouse button is pressed or was just released. This is locked and return 0.0f until the mouse moves past a distance threshold at least once (if lock_threshold < -1.0f, uses io.MouseDraggingThreshold)
     760    IMGUI_API void          ResetMouseDragDelta(ImGuiMouseButton button = 0);                   //
     761    IMGUI_API ImGuiMouseCursor GetMouseCursor();                                                // get desired cursor type, reset in ImGui::NewFrame(), this is updated during the frame. valid before Render(). If you use software rendering by setting io.MouseDrawCursor ImGui will render those for you
     762    IMGUI_API void          SetMouseCursor(ImGuiMouseCursor cursor_type);                       // set desired cursor type
     763    IMGUI_API void          CaptureMouseFromApp(bool want_capture_mouse_value = true);          // attention: misleading name! manually override io.WantCaptureMouse flag next frame (said flag is entirely left for your application to handle). This is equivalent to setting "io.WantCaptureMouse = want_capture_mouse_value;" after the next NewFrame() call.
     764
     765    // Clipboard Utilities
     766    // - Also see the LogToClipboard() function to capture GUI into clipboard, or easily output text data to the clipboard.
     767    IMGUI_API const char*   GetClipboardText();
     768    IMGUI_API void          SetClipboardText(const char* text);
     769
     770    // Settings/.Ini Utilities
     771    // - The disk functions are automatically called if io.IniFilename != NULL (default is "imgui.ini").
     772    // - Set io.IniFilename to NULL to load/save manually. Read io.WantSaveIniSettings description about handling .ini saving manually.
     773    IMGUI_API void          LoadIniSettingsFromDisk(const char* ini_filename);                  // call after CreateContext() and before the first call to NewFrame(). NewFrame() automatically calls LoadIniSettingsFromDisk(io.IniFilename).
     774    IMGUI_API void          LoadIniSettingsFromMemory(const char* ini_data, size_t ini_size=0); // call after CreateContext() and before the first call to NewFrame() to provide .ini data from your own data source.
     775    IMGUI_API void          SaveIniSettingsToDisk(const char* ini_filename);                    // this is automatically called (if io.IniFilename is not empty) a few seconds after any modification that should be reflected in the .ini file (and also by DestroyContext).
     776    IMGUI_API const char*   SaveIniSettingsToMemory(size_t* out_ini_size = NULL);               // return a zero-terminated string with the .ini data which you can save by your own mean. call when io.WantSaveIniSettings is set, then save data by your own mean and clear io.WantSaveIniSettings.
     777
     778    // Debug Utilities
     779    IMGUI_API bool          DebugCheckVersionAndDataLayout(const char* version_str, size_t sz_io, size_t sz_style, size_t sz_vec2, size_t sz_vec4, size_t sz_drawvert, size_t sz_drawidx); // This is called by IMGUI_CHECKVERSION() macro.
     780
     781    // Memory Allocators
     782    // - All those functions are not reliant on the current context.
     783    // - If you reload the contents of imgui.cpp at runtime, you may need to call SetCurrentContext() + SetAllocatorFunctions() again because we use global storage for those.
     784    IMGUI_API void          SetAllocatorFunctions(void* (*alloc_func)(size_t sz, void* user_data), void (*free_func)(void* ptr, void* user_data), void* user_data = NULL);
     785    IMGUI_API void*         MemAlloc(size_t size);
     786    IMGUI_API void          MemFree(void* ptr);
    553787
    554788} // namespace ImGui
    555789
    556   // Flags for ImGui::Begin()
     790//-----------------------------------------------------------------------------
     791// Flags & Enumerations
     792//-----------------------------------------------------------------------------
     793
     794// Flags for ImGui::Begin()
    557795enum ImGuiWindowFlags_
    558796{
    559    ImGuiWindowFlags_NoTitleBar = 1 << 0,   // Disable title-bar
    560    ImGuiWindowFlags_NoResize = 1 << 1,   // Disable user resizing with the lower-right grip
    561    ImGuiWindowFlags_NoMove = 1 << 2,   // Disable user moving the window
    562    ImGuiWindowFlags_NoScrollbar = 1 << 3,   // Disable scrollbars (window can still scroll with mouse or programatically)
    563    ImGuiWindowFlags_NoScrollWithMouse = 1 << 4,   // Disable user vertically scrolling with mouse wheel. On child window, mouse wheel will be forwarded to the parent unless NoScrollbar is also set.
    564    ImGuiWindowFlags_NoCollapse = 1 << 5,   // Disable user collapsing window by double-clicking on it
    565    ImGuiWindowFlags_AlwaysAutoResize = 1 << 6,   // Resize every window to its content every frame
    566    //ImGuiWindowFlags_ShowBorders          = 1 << 7,   // Show borders around windows and items (OBSOLETE! Use e.g. style.FrameBorderSize=1.0f to enable borders).
    567    ImGuiWindowFlags_NoSavedSettings = 1 << 8,   // Never load/save settings in .ini file
    568    ImGuiWindowFlags_NoInputs = 1 << 9,   // Disable catching mouse or keyboard inputs, hovering test with pass through.
    569    ImGuiWindowFlags_MenuBar = 1 << 10,  // Has a menu-bar
    570    ImGuiWindowFlags_HorizontalScrollbar = 1 << 11,  // Allow horizontal scrollbar to appear (off by default). You may use SetNextWindowContentSize(ImVec2(width,0.0f)); prior to calling Begin() to specify width. Read code in imgui_demo in the "Horizontal Scrolling" section.
    571    ImGuiWindowFlags_NoFocusOnAppearing = 1 << 12,  // Disable taking focus when transitioning from hidden to visible state
    572    ImGuiWindowFlags_NoBringToFrontOnFocus = 1 << 13,  // Disable bringing window to front when taking focus (e.g. clicking on it or programatically giving it focus)
    573    ImGuiWindowFlags_AlwaysVerticalScrollbar = 1 << 14,  // Always show vertical scrollbar (even if ContentSize.y < Size.y)
    574    ImGuiWindowFlags_AlwaysHorizontalScrollbar = 1 << 15,  // Always show horizontal scrollbar (even if ContentSize.x < Size.x)
    575    ImGuiWindowFlags_AlwaysUseWindowPadding = 1 << 16,  // Ensure child windows without border uses style.WindowPadding (ignored by default for non-bordered child windows, because more convenient)
    576    ImGuiWindowFlags_ResizeFromAnySide = 1 << 17,  // [BETA] Enable resize from any corners and borders. Your back-end needs to honor the different values of io.MouseCursor set by imgui.
    577    ImGuiWindowFlags_NoNavInputs = 1 << 18,  // No gamepad/keyboard navigation within the window
    578    ImGuiWindowFlags_NoNavFocus = 1 << 19,  // No focusing toward this window with gamepad/keyboard navigation (e.g. skipped by CTRL+TAB)
    579    ImGuiWindowFlags_NoNav = ImGuiWindowFlags_NoNavInputs | ImGuiWindowFlags_NoNavFocus,
    580 
    581    // [Internal]
    582    ImGuiWindowFlags_NavFlattened = 1 << 23,  // [BETA] Allow gamepad/keyboard navigation to cross over parent border to this child (only use on child that have no scrolling!)
    583    ImGuiWindowFlags_ChildWindow = 1 << 24,  // Don't use! For internal use by BeginChild()
    584    ImGuiWindowFlags_Tooltip = 1 << 25,  // Don't use! For internal use by BeginTooltip()
    585    ImGuiWindowFlags_Popup = 1 << 26,  // Don't use! For internal use by BeginPopup()
    586    ImGuiWindowFlags_Modal = 1 << 27,  // Don't use! For internal use by BeginPopupModal()
    587    ImGuiWindowFlags_ChildMenu = 1 << 28   // Don't use! For internal use by BeginMenu()
     797    ImGuiWindowFlags_None                   = 0,
     798    ImGuiWindowFlags_NoTitleBar             = 1 << 0,   // Disable title-bar
     799    ImGuiWindowFlags_NoResize               = 1 << 1,   // Disable user resizing with the lower-right grip
     800    ImGuiWindowFlags_NoMove                 = 1 << 2,   // Disable user moving the window
     801    ImGuiWindowFlags_NoScrollbar            = 1 << 3,   // Disable scrollbars (window can still scroll with mouse or programmatically)
     802    ImGuiWindowFlags_NoScrollWithMouse      = 1 << 4,   // Disable user vertically scrolling with mouse wheel. On child window, mouse wheel will be forwarded to the parent unless NoScrollbar is also set.
     803    ImGuiWindowFlags_NoCollapse             = 1 << 5,   // Disable user collapsing window by double-clicking on it
     804    ImGuiWindowFlags_AlwaysAutoResize       = 1 << 6,   // Resize every window to its content every frame
     805    ImGuiWindowFlags_NoBackground           = 1 << 7,   // Disable drawing background color (WindowBg, etc.) and outside border. Similar as using SetNextWindowBgAlpha(0.0f).
     806    ImGuiWindowFlags_NoSavedSettings        = 1 << 8,   // Never load/save settings in .ini file
     807    ImGuiWindowFlags_NoMouseInputs          = 1 << 9,   // Disable catching mouse, hovering test with pass through.
     808    ImGuiWindowFlags_MenuBar                = 1 << 10,  // Has a menu-bar
     809    ImGuiWindowFlags_HorizontalScrollbar    = 1 << 11,  // Allow horizontal scrollbar to appear (off by default). You may use SetNextWindowContentSize(ImVec2(width,0.0f)); prior to calling Begin() to specify width. Read code in imgui_demo in the "Horizontal Scrolling" section.
     810    ImGuiWindowFlags_NoFocusOnAppearing     = 1 << 12,  // Disable taking focus when transitioning from hidden to visible state
     811    ImGuiWindowFlags_NoBringToFrontOnFocus  = 1 << 13,  // Disable bringing window to front when taking focus (e.g. clicking on it or programmatically giving it focus)
     812    ImGuiWindowFlags_AlwaysVerticalScrollbar= 1 << 14,  // Always show vertical scrollbar (even if ContentSize.y < Size.y)
     813    ImGuiWindowFlags_AlwaysHorizontalScrollbar=1<< 15,  // Always show horizontal scrollbar (even if ContentSize.x < Size.x)
     814    ImGuiWindowFlags_AlwaysUseWindowPadding = 1 << 16,  // Ensure child windows without border uses style.WindowPadding (ignored by default for non-bordered child windows, because more convenient)
     815    ImGuiWindowFlags_NoNavInputs            = 1 << 18,  // No gamepad/keyboard navigation within the window
     816    ImGuiWindowFlags_NoNavFocus             = 1 << 19,  // No focusing toward this window with gamepad/keyboard navigation (e.g. skipped by CTRL+TAB)
     817    ImGuiWindowFlags_UnsavedDocument        = 1 << 20,  // Append '*' to title without affecting the ID, as a convenience to avoid using the ### operator. When used in a tab/docking context, tab is selected on closure and closure is deferred by one frame to allow code to cancel the closure (with a confirmation popup, etc.) without flicker.
     818    ImGuiWindowFlags_NoNav                  = ImGuiWindowFlags_NoNavInputs | ImGuiWindowFlags_NoNavFocus,
     819    ImGuiWindowFlags_NoDecoration           = ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoScrollbar | ImGuiWindowFlags_NoCollapse,
     820    ImGuiWindowFlags_NoInputs               = ImGuiWindowFlags_NoMouseInputs | ImGuiWindowFlags_NoNavInputs | ImGuiWindowFlags_NoNavFocus,
     821
     822    // [Internal]
     823    ImGuiWindowFlags_NavFlattened           = 1 << 23,  // [BETA] Allow gamepad/keyboard navigation to cross over parent border to this child (only use on child that have no scrolling!)
     824    ImGuiWindowFlags_ChildWindow            = 1 << 24,  // Don't use! For internal use by BeginChild()
     825    ImGuiWindowFlags_Tooltip                = 1 << 25,  // Don't use! For internal use by BeginTooltip()
     826    ImGuiWindowFlags_Popup                  = 1 << 26,  // Don't use! For internal use by BeginPopup()
     827    ImGuiWindowFlags_Modal                  = 1 << 27,  // Don't use! For internal use by BeginPopupModal()
     828    ImGuiWindowFlags_ChildMenu              = 1 << 28   // Don't use! For internal use by BeginMenu()
     829
     830    // [Obsolete]
     831    //ImGuiWindowFlags_ShowBorders          = 1 << 7,   // --> Set style.FrameBorderSize=1.0f or style.WindowBorderSize=1.0f to enable borders around items or windows.
     832    //ImGuiWindowFlags_ResizeFromAnySide    = 1 << 17,  // --> Set io.ConfigWindowsResizeFromEdges=true and make sure mouse cursors are supported by back-end (io.BackendFlags & ImGuiBackendFlags_HasMouseCursors)
    588833};
    589834
     
    591836enum ImGuiInputTextFlags_
    592837{
    593    ImGuiInputTextFlags_CharsDecimal = 1 << 0,   // Allow 0123456789.+-*/
    594    ImGuiInputTextFlags_CharsHexadecimal = 1 << 1,   // Allow 0123456789ABCDEFabcdef
    595    ImGuiInputTextFlags_CharsUppercase = 1 << 2,   // Turn a..z into A..Z
    596    ImGuiInputTextFlags_CharsNoBlank = 1 << 3,   // Filter out spaces, tabs
    597    ImGuiInputTextFlags_AutoSelectAll = 1 << 4,   // Select entire text when first taking mouse focus
    598    ImGuiInputTextFlags_EnterReturnsTrue = 1 << 5,   // Return 'true' when Enter is pressed (as opposed to when the value was modified)
    599    ImGuiInputTextFlags_CallbackCompletion = 1 << 6,   // Call user function on pressing TAB (for completion handling)
    600    ImGuiInputTextFlags_CallbackHistory = 1 << 7,   // Call user function on pressing Up/Down arrows (for history handling)
    601    ImGuiInputTextFlags_CallbackAlways = 1 << 8,   // Call user function every time. User code may query cursor position, modify text buffer.
    602    ImGuiInputTextFlags_CallbackCharFilter = 1 << 9,   // Call user function to filter character. Modify data->EventChar to replace/filter input, or return 1 to discard character.
    603    ImGuiInputTextFlags_AllowTabInput = 1 << 10,  // Pressing TAB input a '\t' character into the text field
    604    ImGuiInputTextFlags_CtrlEnterForNewLine = 1 << 11,  // In multi-line mode, unfocus with Enter, add new line with Ctrl+Enter (default is opposite: unfocus with Ctrl+Enter, add line with Enter).
    605    ImGuiInputTextFlags_NoHorizontalScroll = 1 << 12,  // Disable following the cursor horizontally
    606    ImGuiInputTextFlags_AlwaysInsertMode = 1 << 13,  // Insert mode
    607    ImGuiInputTextFlags_ReadOnly = 1 << 14,  // Read-only mode
    608    ImGuiInputTextFlags_Password = 1 << 15,  // Password mode, display all characters as '*'
    609    ImGuiInputTextFlags_NoUndoRedo = 1 << 16,  // Disable undo/redo. Note that input text owns the text data while active, if you want to provide your own undo/redo stack you need e.g. to call ClearActiveID().
    610    ImGuiInputTextFlags_CharsScientific = 1 << 17,  // Allow 0123456789.+-*/eE (Scientific notation input)
    611                                                    // [Internal]
    612                                                    ImGuiInputTextFlags_Multiline = 1 << 20   // For internal use by InputTextMultiline()
     838    ImGuiInputTextFlags_None                = 0,
     839    ImGuiInputTextFlags_CharsDecimal        = 1 << 0,   // Allow 0123456789.+-*/
     840    ImGuiInputTextFlags_CharsHexadecimal    = 1 << 1,   // Allow 0123456789ABCDEFabcdef
     841    ImGuiInputTextFlags_CharsUppercase      = 1 << 2,   // Turn a..z into A..Z
     842    ImGuiInputTextFlags_CharsNoBlank        = 1 << 3,   // Filter out spaces, tabs
     843    ImGuiInputTextFlags_AutoSelectAll       = 1 << 4,   // Select entire text when first taking mouse focus
     844    ImGuiInputTextFlags_EnterReturnsTrue    = 1 << 5,   // Return 'true' when Enter is pressed (as opposed to every time the value was modified). Consider looking at the IsItemDeactivatedAfterEdit() function.
     845    ImGuiInputTextFlags_CallbackCompletion  = 1 << 6,   // Callback on pressing TAB (for completion handling)
     846    ImGuiInputTextFlags_CallbackHistory     = 1 << 7,   // Callback on pressing Up/Down arrows (for history handling)
     847    ImGuiInputTextFlags_CallbackAlways      = 1 << 8,   // Callback on each iteration. User code may query cursor position, modify text buffer.
     848    ImGuiInputTextFlags_CallbackCharFilter  = 1 << 9,   // Callback on character inputs to replace or discard them. Modify 'EventChar' to replace or discard, or return 1 in callback to discard.
     849    ImGuiInputTextFlags_AllowTabInput       = 1 << 10,  // Pressing TAB input a '\t' character into the text field
     850    ImGuiInputTextFlags_CtrlEnterForNewLine = 1 << 11,  // In multi-line mode, unfocus with Enter, add new line with Ctrl+Enter (default is opposite: unfocus with Ctrl+Enter, add line with Enter).
     851    ImGuiInputTextFlags_NoHorizontalScroll  = 1 << 12,  // Disable following the cursor horizontally
     852    ImGuiInputTextFlags_AlwaysInsertMode    = 1 << 13,  // Insert mode
     853    ImGuiInputTextFlags_ReadOnly            = 1 << 14,  // Read-only mode
     854    ImGuiInputTextFlags_Password            = 1 << 15,  // Password mode, display all characters as '*'
     855    ImGuiInputTextFlags_NoUndoRedo          = 1 << 16,  // Disable undo/redo. Note that input text owns the text data while active, if you want to provide your own undo/redo stack you need e.g. to call ClearActiveID().
     856    ImGuiInputTextFlags_CharsScientific     = 1 << 17,  // Allow 0123456789.+-*/eE (Scientific notation input)
     857    ImGuiInputTextFlags_CallbackResize      = 1 << 18,  // Callback on buffer capacity changes request (beyond 'buf_size' parameter value), allowing the string to grow. Notify when the string wants to be resized (for string types which hold a cache of their Size). You will be provided a new BufSize in the callback and NEED to honor it. (see misc/cpp/imgui_stdlib.h for an example of using this)
     858    ImGuiInputTextFlags_CallbackEdit        = 1 << 19,  // Callback on any edit (note that InputText() already returns true on edit, the callback is useful mainly to manipulate the underlying buffer while focus is active)
     859    // [Internal]
     860    ImGuiInputTextFlags_Multiline           = 1 << 20,  // For internal use by InputTextMultiline()
     861    ImGuiInputTextFlags_NoMarkEdited        = 1 << 21   // For internal use by functions using InputText() before reformatting data
    613862};
    614863
     
    616865enum ImGuiTreeNodeFlags_
    617866{
    618    ImGuiTreeNodeFlags_Selected = 1 << 0,   // Draw as selected
    619    ImGuiTreeNodeFlags_Framed = 1 << 1,   // Full colored frame (e.g. for CollapsingHeader)
    620    ImGuiTreeNodeFlags_AllowItemOverlap = 1 << 2,   // Hit testing to allow subsequent widgets to overlap this one
    621    ImGuiTreeNodeFlags_NoTreePushOnOpen = 1 << 3,   // Don't do a TreePush() when open (e.g. for CollapsingHeader) = no extra indent nor pushing on ID stack
    622    ImGuiTreeNodeFlags_NoAutoOpenOnLog = 1 << 4,   // Don't automatically and temporarily open node when Logging is active (by default logging will automatically open tree nodes)
    623    ImGuiTreeNodeFlags_DefaultOpen = 1 << 5,   // Default node to be open
    624    ImGuiTreeNodeFlags_OpenOnDoubleClick = 1 << 6,   // Need double-click to open node
    625    ImGuiTreeNodeFlags_OpenOnArrow = 1 << 7,   // Only open when clicking on the arrow part. If ImGuiTreeNodeFlags_OpenOnDoubleClick is also set, single-click arrow or double-click all box to open.
    626    ImGuiTreeNodeFlags_Leaf = 1 << 8,   // No collapsing, no arrow (use as a convenience for leaf nodes).
    627    ImGuiTreeNodeFlags_Bullet = 1 << 9,   // Display a bullet instead of arrow
    628    ImGuiTreeNodeFlags_FramePadding = 1 << 10,  // Use FramePadding (even for an unframed text node) to vertically align text baseline to regular widget height. Equivalent to calling AlignTextToFramePadding().
    629                                                //ImGuITreeNodeFlags_SpanAllAvailWidth  = 1 << 11,  // FIXME: TODO: Extend hit box horizontally even if not framed
    630                                                //ImGuiTreeNodeFlags_NoScrollOnOpen     = 1 << 12,  // FIXME: TODO: Disable automatic scroll on TreePop() if node got just open and contents is not visible
    631                                                ImGuiTreeNodeFlags_NavLeftJumpsBackHere = 1 << 13,  // (WIP) Nav: left direction may move to this TreeNode() from any of its child (items submitted between TreeNode and TreePop)
    632                                                ImGuiTreeNodeFlags_CollapsingHeader = ImGuiTreeNodeFlags_Framed | ImGuiTreeNodeFlags_NoAutoOpenOnLog
    633 
    634                                                // Obsolete names (will be removed)
    635 #ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS
    636    , ImGuiTreeNodeFlags_AllowOverlapMode = ImGuiTreeNodeFlags_AllowItemOverlap
    637 #endif
     867    ImGuiTreeNodeFlags_None                 = 0,
     868    ImGuiTreeNodeFlags_Selected             = 1 << 0,   // Draw as selected
     869    ImGuiTreeNodeFlags_Framed               = 1 << 1,   // Full colored frame (e.g. for CollapsingHeader)
     870    ImGuiTreeNodeFlags_AllowItemOverlap     = 1 << 2,   // Hit testing to allow subsequent widgets to overlap this one
     871    ImGuiTreeNodeFlags_NoTreePushOnOpen     = 1 << 3,   // Don't do a TreePush() when open (e.g. for CollapsingHeader) = no extra indent nor pushing on ID stack
     872    ImGuiTreeNodeFlags_NoAutoOpenOnLog      = 1 << 4,   // Don't automatically and temporarily open node when Logging is active (by default logging will automatically open tree nodes)
     873    ImGuiTreeNodeFlags_DefaultOpen          = 1 << 5,   // Default node to be open
     874    ImGuiTreeNodeFlags_OpenOnDoubleClick    = 1 << 6,   // Need double-click to open node
     875    ImGuiTreeNodeFlags_OpenOnArrow          = 1 << 7,   // Only open when clicking on the arrow part. If ImGuiTreeNodeFlags_OpenOnDoubleClick is also set, single-click arrow or double-click all box to open.
     876    ImGuiTreeNodeFlags_Leaf                 = 1 << 8,   // No collapsing, no arrow (use as a convenience for leaf nodes).
     877    ImGuiTreeNodeFlags_Bullet               = 1 << 9,   // Display a bullet instead of arrow
     878    ImGuiTreeNodeFlags_FramePadding         = 1 << 10,  // Use FramePadding (even for an unframed text node) to vertically align text baseline to regular widget height. Equivalent to calling AlignTextToFramePadding().
     879    ImGuiTreeNodeFlags_SpanAvailWidth       = 1 << 11,  // Extend hit box to the right-most edge, even if not framed. This is not the default in order to allow adding other items on the same line. In the future we may refactor the hit system to be front-to-back, allowing natural overlaps and then this can become the default.
     880    ImGuiTreeNodeFlags_SpanFullWidth        = 1 << 12,  // Extend hit box to the left-most and right-most edges (bypass the indented area).
     881    ImGuiTreeNodeFlags_NavLeftJumpsBackHere = 1 << 13,  // (WIP) Nav: left direction may move to this TreeNode() from any of its child (items submitted between TreeNode and TreePop)
     882    //ImGuiTreeNodeFlags_NoScrollOnOpen     = 1 << 14,  // FIXME: TODO: Disable automatic scroll on TreePop() if node got just open and contents is not visible
     883    ImGuiTreeNodeFlags_CollapsingHeader     = ImGuiTreeNodeFlags_Framed | ImGuiTreeNodeFlags_NoTreePushOnOpen | ImGuiTreeNodeFlags_NoAutoOpenOnLog
     884};
     885
     886// Flags for OpenPopup*(), BeginPopupContext*(), IsPopupOpen() functions.
     887// - To be backward compatible with older API which took an 'int mouse_button = 1' argument, we need to treat
     888//   small flags values as a mouse button index, so we encode the mouse button in the first few bits of the flags.
     889//   It is therefore guaranteed to be legal to pass a mouse button index in ImGuiPopupFlags.
     890// - For the same reason, we exceptionally default the ImGuiPopupFlags argument of BeginPopupContextXXX functions to 1 instead of 0.
     891//   IMPORTANT: because the default parameter is 1 (==ImGuiPopupFlags_MouseButtonRight), if you rely on the default parameter
     892//   and want to another another flag, you need to pass in the ImGuiPopupFlags_MouseButtonRight flag.
     893// - Multiple buttons currently cannot be combined/or-ed in those functions (we could allow it later).
     894enum ImGuiPopupFlags_
     895{
     896    ImGuiPopupFlags_None                    = 0,
     897    ImGuiPopupFlags_MouseButtonLeft         = 0,        // For BeginPopupContext*(): open on Left Mouse release. Guaranteed to always be == 0 (same as ImGuiMouseButton_Left)
     898    ImGuiPopupFlags_MouseButtonRight        = 1,        // For BeginPopupContext*(): open on Right Mouse release. Guaranteed to always be == 1 (same as ImGuiMouseButton_Right)
     899    ImGuiPopupFlags_MouseButtonMiddle       = 2,        // For BeginPopupContext*(): open on Middle Mouse release. Guaranteed to always be == 2 (same as ImGuiMouseButton_Middle)
     900    ImGuiPopupFlags_MouseButtonMask_        = 0x1F,
     901    ImGuiPopupFlags_MouseButtonDefault_     = 1,
     902    ImGuiPopupFlags_NoOpenOverExistingPopup = 1 << 5,   // For OpenPopup*(), BeginPopupContext*(): don't open if there's already a popup at the same level of the popup stack
     903    ImGuiPopupFlags_NoOpenOverItems         = 1 << 6,   // For BeginPopupContextWindow(): don't return true when hovering items, only when hovering empty space
     904    ImGuiPopupFlags_AnyPopupId              = 1 << 7,   // For IsPopupOpen(): ignore the ImGuiID parameter and test for any popup.
     905    ImGuiPopupFlags_AnyPopupLevel           = 1 << 8,   // For IsPopupOpen(): search/test at any level of the popup stack (default test in the current level)
     906    ImGuiPopupFlags_AnyPopup                = ImGuiPopupFlags_AnyPopupId | ImGuiPopupFlags_AnyPopupLevel
    638907};
    639908
     
    641910enum ImGuiSelectableFlags_
    642911{
    643    ImGuiSelectableFlags_DontClosePopups = 1 << 0,   // Clicking this don't close parent popup window
    644    ImGuiSelectableFlags_SpanAllColumns = 1 << 1,   // Selectable frame can span all columns (text will still fit in current column)
    645    ImGuiSelectableFlags_AllowDoubleClick = 1 << 2    // Generate press events on double clicks too
     912    ImGuiSelectableFlags_None               = 0,
     913    ImGuiSelectableFlags_DontClosePopups    = 1 << 0,   // Clicking this don't close parent popup window
     914    ImGuiSelectableFlags_SpanAllColumns     = 1 << 1,   // Selectable frame can span all columns (text will still fit in current column)
     915    ImGuiSelectableFlags_AllowDoubleClick   = 1 << 2,   // Generate press events on double clicks too
     916    ImGuiSelectableFlags_Disabled           = 1 << 3,   // Cannot be selected, display grayed out text
     917    ImGuiSelectableFlags_AllowItemOverlap   = 1 << 4    // (WIP) Hit testing to allow subsequent widgets to overlap this one
    646918};
    647919
     
    649921enum ImGuiComboFlags_
    650922{
    651    ImGuiComboFlags_PopupAlignLeft = 1 << 0,   // Align the popup toward the left by default
    652    ImGuiComboFlags_HeightSmall = 1 << 1,   // Max ~4 items visible. Tip: If you want your combo popup to be a specific size you can use SetNextWindowSizeConstraints() prior to calling BeginCombo()
    653    ImGuiComboFlags_HeightRegular = 1 << 2,   // Max ~8 items visible (default)
    654    ImGuiComboFlags_HeightLarge = 1 << 3,   // Max ~20 items visible
    655    ImGuiComboFlags_HeightLargest = 1 << 4,   // As many fitting items as possible
    656    ImGuiComboFlags_NoArrowButton = 1 << 5,   // Display on the preview box without the square arrow button
    657    ImGuiComboFlags_NoPreview = 1 << 6,   // Display only a square arrow button
    658    ImGuiComboFlags_HeightMask_ = ImGuiComboFlags_HeightSmall | ImGuiComboFlags_HeightRegular | ImGuiComboFlags_HeightLarge | ImGuiComboFlags_HeightLargest
     923    ImGuiComboFlags_None                    = 0,
     924    ImGuiComboFlags_PopupAlignLeft          = 1 << 0,   // Align the popup toward the left by default
     925    ImGuiComboFlags_HeightSmall             = 1 << 1,   // Max ~4 items visible. Tip: If you want your combo popup to be a specific size you can use SetNextWindowSizeConstraints() prior to calling BeginCombo()
     926    ImGuiComboFlags_HeightRegular           = 1 << 2,   // Max ~8 items visible (default)
     927    ImGuiComboFlags_HeightLarge             = 1 << 3,   // Max ~20 items visible
     928    ImGuiComboFlags_HeightLargest           = 1 << 4,   // As many fitting items as possible
     929    ImGuiComboFlags_NoArrowButton           = 1 << 5,   // Display on the preview box without the square arrow button
     930    ImGuiComboFlags_NoPreview               = 1 << 6,   // Display only a square arrow button
     931    ImGuiComboFlags_HeightMask_             = ImGuiComboFlags_HeightSmall | ImGuiComboFlags_HeightRegular | ImGuiComboFlags_HeightLarge | ImGuiComboFlags_HeightLargest
     932};
     933
     934// Flags for ImGui::BeginTabBar()
     935enum ImGuiTabBarFlags_
     936{
     937    ImGuiTabBarFlags_None                           = 0,
     938    ImGuiTabBarFlags_Reorderable                    = 1 << 0,   // Allow manually dragging tabs to re-order them + New tabs are appended at the end of list
     939    ImGuiTabBarFlags_AutoSelectNewTabs              = 1 << 1,   // Automatically select new tabs when they appear
     940    ImGuiTabBarFlags_TabListPopupButton             = 1 << 2,   // Disable buttons to open the tab list popup
     941    ImGuiTabBarFlags_NoCloseWithMiddleMouseButton   = 1 << 3,   // Disable behavior of closing tabs (that are submitted with p_open != NULL) with middle mouse button. You can still repro this behavior on user's side with if (IsItemHovered() && IsMouseClicked(2)) *p_open = false.
     942    ImGuiTabBarFlags_NoTabListScrollingButtons      = 1 << 4,   // Disable scrolling buttons (apply when fitting policy is ImGuiTabBarFlags_FittingPolicyScroll)
     943    ImGuiTabBarFlags_NoTooltip                      = 1 << 5,   // Disable tooltips when hovering a tab
     944    ImGuiTabBarFlags_FittingPolicyResizeDown        = 1 << 6,   // Resize tabs when they don't fit
     945    ImGuiTabBarFlags_FittingPolicyScroll            = 1 << 7,   // Add scroll buttons when tabs don't fit
     946    ImGuiTabBarFlags_FittingPolicyMask_             = ImGuiTabBarFlags_FittingPolicyResizeDown | ImGuiTabBarFlags_FittingPolicyScroll,
     947    ImGuiTabBarFlags_FittingPolicyDefault_          = ImGuiTabBarFlags_FittingPolicyResizeDown
     948};
     949
     950// Flags for ImGui::BeginTabItem()
     951enum ImGuiTabItemFlags_
     952{
     953    ImGuiTabItemFlags_None                          = 0,
     954    ImGuiTabItemFlags_UnsavedDocument               = 1 << 0,   // Append '*' to title without affecting the ID, as a convenience to avoid using the ### operator. Also: tab is selected on closure and closure is deferred by one frame to allow code to undo it without flicker.
     955    ImGuiTabItemFlags_SetSelected                   = 1 << 1,   // Trigger flag to programmatically make the tab selected when calling BeginTabItem()
     956    ImGuiTabItemFlags_NoCloseWithMiddleMouseButton  = 1 << 2,   // Disable behavior of closing tabs (that are submitted with p_open != NULL) with middle mouse button. You can still repro this behavior on user's side with if (IsItemHovered() && IsMouseClicked(2)) *p_open = false.
     957    ImGuiTabItemFlags_NoPushId                      = 1 << 3,   // Don't call PushID(tab->ID)/PopID() on BeginTabItem()/EndTabItem()
     958    ImGuiTabItemFlags_NoTooltip                     = 1 << 4,   // Disable tooltip for the given tab
     959    ImGuiTabItemFlags_NoReorder                     = 1 << 5,   // Disable reordering this tab or having another tab cross over this tab
     960    ImGuiTabItemFlags_Leading                       = 1 << 6,   // Enforce the tab position to the left of the tab bar (after the tab list popup button)
     961    ImGuiTabItemFlags_Trailing                      = 1 << 7    // Enforce the tab position to the right of the tab bar (before the scrolling buttons)
    659962};
    660963
     
    662965enum ImGuiFocusedFlags_
    663966{
    664    ImGuiFocusedFlags_ChildWindows = 1 << 0,   // IsWindowFocused(): Return true if any children of the window is focused
    665    ImGuiFocusedFlags_RootWindow = 1 << 1,   // IsWindowFocused(): Test from root window (top most parent of the current hierarchy)
    666    ImGuiFocusedFlags_AnyWindow = 1 << 2,   // IsWindowFocused(): Return true if any window is focused
    667    ImGuiFocusedFlags_RootAndChildWindows = ImGuiFocusedFlags_RootWindow | ImGuiFocusedFlags_ChildWindows
     967    ImGuiFocusedFlags_None                          = 0,
     968    ImGuiFocusedFlags_ChildWindows                  = 1 << 0,   // IsWindowFocused(): Return true if any children of the window is focused
     969    ImGuiFocusedFlags_RootWindow                    = 1 << 1,   // IsWindowFocused(): Test from root window (top most parent of the current hierarchy)
     970    ImGuiFocusedFlags_AnyWindow                     = 1 << 2,   // IsWindowFocused(): Return true if any window is focused. Important: If you are trying to tell how to dispatch your low-level inputs, do NOT use this. Use 'io.WantCaptureMouse' instead! Please read the FAQ!
     971    ImGuiFocusedFlags_RootAndChildWindows           = ImGuiFocusedFlags_RootWindow | ImGuiFocusedFlags_ChildWindows
    668972};
    669973
    670974// Flags for ImGui::IsItemHovered(), ImGui::IsWindowHovered()
    671 // Note: If you are trying to check whether your mouse should be dispatched to imgui or to your app, you should use the 'io.WantCaptureMouse' boolean for that. Please read the FAQ!
     975// Note: if you are trying to check whether your mouse should be dispatched to Dear ImGui or to your app, you should use 'io.WantCaptureMouse' instead! Please read the FAQ!
     976// Note: windows with the ImGuiWindowFlags_NoInputs flag are ignored by IsWindowHovered() calls.
    672977enum ImGuiHoveredFlags_
    673978{
    674    ImGuiHoveredFlags_Default = 0,        // Return true if directly over the item/window, not obstructed by another window, not obstructed by an active popup or modal blocking inputs under them.
    675    ImGuiHoveredFlags_ChildWindows = 1 << 0,   // IsWindowHovered() only: Return true if any children of the window is hovered
    676    ImGuiHoveredFlags_RootWindow = 1 << 1,   // IsWindowHovered() only: Test from root window (top most parent of the current hierarchy)
    677    ImGuiHoveredFlags_AnyWindow = 1 << 2,   // IsWindowHovered() only: Return true if any window is hovered
    678    ImGuiHoveredFlags_AllowWhenBlockedByPopup = 1 << 3,   // Return true even if a popup window is normally blocking access to this item/window
    679                                                          //ImGuiHoveredFlags_AllowWhenBlockedByModal     = 1 << 4,   // Return true even if a modal popup window is normally blocking access to this item/window. FIXME-TODO: Unavailable yet.
    680                                                          ImGuiHoveredFlags_AllowWhenBlockedByActiveItem = 1 << 5,   // Return true even if an active item is blocking access to this item/window. Useful for Drag and Drop patterns.
    681                                                          ImGuiHoveredFlags_AllowWhenOverlapped = 1 << 6,   // Return true even if the position is overlapped by another window
    682                                                          ImGuiHoveredFlags_RectOnly = ImGuiHoveredFlags_AllowWhenBlockedByPopup | ImGuiHoveredFlags_AllowWhenBlockedByActiveItem | ImGuiHoveredFlags_AllowWhenOverlapped,
    683                                                          ImGuiHoveredFlags_RootAndChildWindows = ImGuiHoveredFlags_RootWindow | ImGuiHoveredFlags_ChildWindows
     979    ImGuiHoveredFlags_None                          = 0,        // Return true if directly over the item/window, not obstructed by another window, not obstructed by an active popup or modal blocking inputs under them.
     980    ImGuiHoveredFlags_ChildWindows                  = 1 << 0,   // IsWindowHovered() only: Return true if any children of the window is hovered
     981    ImGuiHoveredFlags_RootWindow                    = 1 << 1,   // IsWindowHovered() only: Test from root window (top most parent of the current hierarchy)
     982    ImGuiHoveredFlags_AnyWindow                     = 1 << 2,   // IsWindowHovered() only: Return true if any window is hovered
     983    ImGuiHoveredFlags_AllowWhenBlockedByPopup       = 1 << 3,   // Return true even if a popup window is normally blocking access to this item/window
     984    //ImGuiHoveredFlags_AllowWhenBlockedByModal     = 1 << 4,   // Return true even if a modal popup window is normally blocking access to this item/window. FIXME-TODO: Unavailable yet.
     985    ImGuiHoveredFlags_AllowWhenBlockedByActiveItem  = 1 << 5,   // Return true even if an active item is blocking access to this item/window. Useful for Drag and Drop patterns.
     986    ImGuiHoveredFlags_AllowWhenOverlapped           = 1 << 6,   // Return true even if the position is obstructed or overlapped by another window
     987    ImGuiHoveredFlags_AllowWhenDisabled             = 1 << 7,   // Return true even if the item is disabled
     988    ImGuiHoveredFlags_RectOnly                      = ImGuiHoveredFlags_AllowWhenBlockedByPopup | ImGuiHoveredFlags_AllowWhenBlockedByActiveItem | ImGuiHoveredFlags_AllowWhenOverlapped,
     989    ImGuiHoveredFlags_RootAndChildWindows           = ImGuiHoveredFlags_RootWindow | ImGuiHoveredFlags_ChildWindows
    684990};
    685991
     
    687993enum ImGuiDragDropFlags_
    688994{
    689    // BeginDragDropSource() flags
    690    ImGuiDragDropFlags_SourceNoPreviewTooltip = 1 << 0,   // By default, a successful call to BeginDragDropSource opens a tooltip so you can display a preview or description of the source contents. This flag disable this behavior.
    691    ImGuiDragDropFlags_SourceNoDisableHover = 1 << 1,   // By default, when dragging we clear data so that IsItemHovered() will return true, to avoid subsequent user code submitting tooltips. This flag disable this behavior so you can still call IsItemHovered() on the source item.
    692    ImGuiDragDropFlags_SourceNoHoldToOpenOthers = 1 << 2,   // Disable the behavior that allows to open tree nodes and collapsing header by holding over them while dragging a source item.
    693    ImGuiDragDropFlags_SourceAllowNullID = 1 << 3,   // Allow items such as Text(), Image() that have no unique identifier to be used as drag source, by manufacturing a temporary identifier based on their window-relative position. This is extremely unusual within the dear imgui ecosystem and so we made it explicit.
    694    ImGuiDragDropFlags_SourceExtern = 1 << 4,   // External source (from outside of imgui), won't attempt to read current item/window info. Will always return true. Only one Extern source can be active simultaneously.
    695                                                // AcceptDragDropPayload() flags
    696                                                ImGuiDragDropFlags_AcceptBeforeDelivery = 1 << 10,  // AcceptDragDropPayload() will returns true even before the mouse button is released. You can then call IsDelivery() to test if the payload needs to be delivered.
    697                                                ImGuiDragDropFlags_AcceptNoDrawDefaultRect = 1 << 11,  // Do not draw the default highlight rectangle when hovering over target.
    698                                                ImGuiDragDropFlags_AcceptPeekOnly = ImGuiDragDropFlags_AcceptBeforeDelivery | ImGuiDragDropFlags_AcceptNoDrawDefaultRect  // For peeking ahead and inspecting the payload before delivery.
     995    ImGuiDragDropFlags_None                         = 0,
     996    // BeginDragDropSource() flags
     997    ImGuiDragDropFlags_SourceNoPreviewTooltip       = 1 << 0,   // By default, a successful call to BeginDragDropSource opens a tooltip so you can display a preview or description of the source contents. This flag disable this behavior.
     998    ImGuiDragDropFlags_SourceNoDisableHover         = 1 << 1,   // By default, when dragging we clear data so that IsItemHovered() will return false, to avoid subsequent user code submitting tooltips. This flag disable this behavior so you can still call IsItemHovered() on the source item.
     999    ImGuiDragDropFlags_SourceNoHoldToOpenOthers     = 1 << 2,   // Disable the behavior that allows to open tree nodes and collapsing header by holding over them while dragging a source item.
     1000    ImGuiDragDropFlags_SourceAllowNullID            = 1 << 3,   // Allow items such as Text(), Image() that have no unique identifier to be used as drag source, by manufacturing a temporary identifier based on their window-relative position. This is extremely unusual within the dear imgui ecosystem and so we made it explicit.
     1001    ImGuiDragDropFlags_SourceExtern                 = 1 << 4,   // External source (from outside of dear imgui), won't attempt to read current item/window info. Will always return true. Only one Extern source can be active simultaneously.
     1002    ImGuiDragDropFlags_SourceAutoExpirePayload      = 1 << 5,   // Automatically expire the payload if the source cease to be submitted (otherwise payloads are persisting while being dragged)
     1003    // AcceptDragDropPayload() flags
     1004    ImGuiDragDropFlags_AcceptBeforeDelivery         = 1 << 10,  // AcceptDragDropPayload() will returns true even before the mouse button is released. You can then call IsDelivery() to test if the payload needs to be delivered.
     1005    ImGuiDragDropFlags_AcceptNoDrawDefaultRect      = 1 << 11,  // Do not draw the default highlight rectangle when hovering over target.
     1006    ImGuiDragDropFlags_AcceptNoPreviewTooltip       = 1 << 12,  // Request hiding the BeginDragDropSource tooltip from the BeginDragDropTarget site.
     1007    ImGuiDragDropFlags_AcceptPeekOnly               = ImGuiDragDropFlags_AcceptBeforeDelivery | ImGuiDragDropFlags_AcceptNoDrawDefaultRect  // For peeking ahead and inspecting the payload before delivery.
    6991008};
    7001009
    7011010// Standard Drag and Drop payload types. You can define you own payload types using short strings. Types starting with '_' are defined by Dear ImGui.
    702 #define IMGUI_PAYLOAD_TYPE_COLOR_3F     "_COL3F"    // float[3]: Standard type for colors, without alpha. User code may use this type. 
     1011#define IMGUI_PAYLOAD_TYPE_COLOR_3F     "_COL3F"    // float[3]: Standard type for colors, without alpha. User code may use this type.
    7031012#define IMGUI_PAYLOAD_TYPE_COLOR_4F     "_COL4F"    // float[4]: Standard type for colors. User code may use this type.
     1013
     1014// A primary data type
     1015enum ImGuiDataType_
     1016{
     1017    ImGuiDataType_S8,       // signed char / char (with sensible compilers)
     1018    ImGuiDataType_U8,       // unsigned char
     1019    ImGuiDataType_S16,      // short
     1020    ImGuiDataType_U16,      // unsigned short
     1021    ImGuiDataType_S32,      // int
     1022    ImGuiDataType_U32,      // unsigned int
     1023    ImGuiDataType_S64,      // long long / __int64
     1024    ImGuiDataType_U64,      // unsigned long long / unsigned __int64
     1025    ImGuiDataType_Float,    // float
     1026    ImGuiDataType_Double,   // double
     1027    ImGuiDataType_COUNT
     1028};
    7041029
    7051030// A cardinal direction
    7061031enum ImGuiDir_
    7071032{
    708    ImGuiDir_None = -1,
    709    ImGuiDir_Left = 0,
    710    ImGuiDir_Right = 1,
    711    ImGuiDir_Up = 2,
    712    ImGuiDir_Down = 3,
    713    ImGuiDir_COUNT
     1033    ImGuiDir_None    = -1,
     1034    ImGuiDir_Left    = 0,
     1035    ImGuiDir_Right  = 1,
     1036    ImGuiDir_Up      = 2,
     1037    ImGuiDir_Down    = 3,
     1038    ImGuiDir_COUNT
    7141039};
    7151040
     
    7171042enum ImGuiKey_
    7181043{
    719    ImGuiKey_Tab,
    720    ImGuiKey_LeftArrow,
    721    ImGuiKey_RightArrow,
    722    ImGuiKey_UpArrow,
    723    ImGuiKey_DownArrow,
    724    ImGuiKey_PageUp,
    725    ImGuiKey_PageDown,
    726    ImGuiKey_Home,
    727    ImGuiKey_End,
    728    ImGuiKey_Insert,
    729    ImGuiKey_Delete,
    730    ImGuiKey_Backspace,
    731    ImGuiKey_Space,
    732    ImGuiKey_Enter,
    733    ImGuiKey_Escape,
    734    ImGuiKey_A,         // for text edit CTRL+A: select all
    735    ImGuiKey_C,         // for text edit CTRL+C: copy
    736    ImGuiKey_V,         // for text edit CTRL+V: paste
    737    ImGuiKey_X,         // for text edit CTRL+X: cut
    738    ImGuiKey_Y,         // for text edit CTRL+Y: redo
    739    ImGuiKey_Z,         // for text edit CTRL+Z: undo
    740    ImGuiKey_COUNT
    741 };
    742 
    743 // [BETA] Gamepad/Keyboard directional navigation
     1044    ImGuiKey_Tab,
     1045    ImGuiKey_LeftArrow,
     1046    ImGuiKey_RightArrow,
     1047    ImGuiKey_UpArrow,
     1048    ImGuiKey_DownArrow,
     1049    ImGuiKey_PageUp,
     1050    ImGuiKey_PageDown,
     1051    ImGuiKey_Home,
     1052    ImGuiKey_End,
     1053    ImGuiKey_Insert,
     1054    ImGuiKey_Delete,
     1055    ImGuiKey_Backspace,
     1056    ImGuiKey_Space,
     1057    ImGuiKey_Enter,
     1058    ImGuiKey_Escape,
     1059    ImGuiKey_KeyPadEnter,
     1060    ImGuiKey_A,                 // for text edit CTRL+A: select all
     1061    ImGuiKey_C,                 // for text edit CTRL+C: copy
     1062    ImGuiKey_V,                 // for text edit CTRL+V: paste
     1063    ImGuiKey_X,                 // for text edit CTRL+X: cut
     1064    ImGuiKey_Y,                 // for text edit CTRL+Y: redo
     1065    ImGuiKey_Z,                 // for text edit CTRL+Z: undo
     1066    ImGuiKey_COUNT
     1067};
     1068
     1069// To test io.KeyMods (which is a combination of individual fields io.KeyCtrl, io.KeyShift, io.KeyAlt set by user/back-end)
     1070enum ImGuiKeyModFlags_
     1071{
     1072    ImGuiKeyModFlags_None       = 0,
     1073    ImGuiKeyModFlags_Ctrl       = 1 << 0,
     1074    ImGuiKeyModFlags_Shift      = 1 << 1,
     1075    ImGuiKeyModFlags_Alt        = 1 << 2,
     1076    ImGuiKeyModFlags_Super      = 1 << 3
     1077};
     1078
     1079// Gamepad/Keyboard navigation
    7441080// Keyboard: Set io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard to enable. NewFrame() will automatically fill io.NavInputs[] based on your io.KeysDown[] + io.KeyMap[] arrays.
    7451081// Gamepad:  Set io.ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad to enable. Back-end: set ImGuiBackendFlags_HasGamepad and fill the io.NavInputs[] fields before calling NewFrame(). Note that io.NavInputs[] is cleared by EndFrame().
    746 // Read instructions in imgui.cpp for more details. Download PNG/PSD at goo.gl/9LgVZW.
     1082// Read instructions in imgui.cpp for more details. Download PNG/PSD at http://goo.gl/9LgVZW.
    7471083enum ImGuiNavInput_
    7481084{
    749    // Gamepad Mapping
    750    ImGuiNavInput_Activate,      // activate / open / toggle / tweak value       // e.g. Cross  (PS4), A (Xbox), A (Switch), Space (Keyboard)
    751    ImGuiNavInput_Cancel,        // cancel / close / exit                        // e.g. Circle (PS4), B (Xbox), B (Switch), Escape (Keyboard)
    752    ImGuiNavInput_Input,         // text input / on-screen keyboard              // e.g. Triang.(PS4), Y (Xbox), X (Switch), Return (Keyboard)
    753    ImGuiNavInput_Menu,          // tap: toggle menu / hold: focus, move, resize // e.g. Square (PS4), X (Xbox), Y (Switch), Alt (Keyboard)
    754    ImGuiNavInput_DpadLeft,      // move / tweak / resize window (w/ PadMenu)    // e.g. D-pad Left/Right/Up/Down (Gamepads), Arrow keys (Keyboard)
    755    ImGuiNavInput_DpadRight,     //
    756    ImGuiNavInput_DpadUp,        //
    757    ImGuiNavInput_DpadDown,      //
    758    ImGuiNavInput_LStickLeft,    // scroll / move window (w/ PadMenu)            // e.g. Left Analog Stick Left/Right/Up/Down
    759    ImGuiNavInput_LStickRight,   //
    760    ImGuiNavInput_LStickUp,      //
    761    ImGuiNavInput_LStickDown,    //
    762    ImGuiNavInput_FocusPrev,     // next window (w/ PadMenu)                     // e.g. L1 or L2 (PS4), LB or LT (Xbox), L or ZL (Switch)
    763    ImGuiNavInput_FocusNext,     // prev window (w/ PadMenu)                     // e.g. R1 or R2 (PS4), RB or RT (Xbox), R or ZL (Switch)
    764    ImGuiNavInput_TweakSlow,     // slower tweaks                                // e.g. L1 or L2 (PS4), LB or LT (Xbox), L or ZL (Switch)
    765    ImGuiNavInput_TweakFast,     // faster tweaks                                // e.g. R1 or R2 (PS4), RB or RT (Xbox), R or ZL (Switch)
    766 
    767                                 // [Internal] Don't use directly! This is used internally to differentiate keyboard from gamepad inputs for behaviors that require to differentiate them.
    768                                 // Keyboard behavior that have no corresponding gamepad mapping (e.g. CTRL+TAB) will be directly reading from io.KeysDown[] instead of io.NavInputs[].
    769                                 ImGuiNavInput_KeyMenu_,      // toggle menu                                  // = io.KeyAlt
    770                                 ImGuiNavInput_KeyLeft_,      // move left                                    // = Arrow keys
    771                                 ImGuiNavInput_KeyRight_,     // move right
    772                                 ImGuiNavInput_KeyUp_,        // move up
    773                                 ImGuiNavInput_KeyDown_,      // move down
    774                                 ImGuiNavInput_COUNT,
    775                                 ImGuiNavInput_InternalStart_ = ImGuiNavInput_KeyMenu_
     1085    // Gamepad Mapping
     1086    ImGuiNavInput_Activate,      // activate / open / toggle / tweak value       // e.g. Cross  (PS4), A (Xbox), A (Switch), Space (Keyboard)
     1087    ImGuiNavInput_Cancel,        // cancel / close / exit                        // e.g. Circle (PS4), B (Xbox), B (Switch), Escape (Keyboard)
     1088    ImGuiNavInput_Input,         // text input / on-screen keyboard              // e.g. Triang.(PS4), Y (Xbox), X (Switch), Return (Keyboard)
     1089    ImGuiNavInput_Menu,          // tap: toggle menu / hold: focus, move, resize // e.g. Square (PS4), X (Xbox), Y (Switch), Alt (Keyboard)
     1090    ImGuiNavInput_DpadLeft,      // move / tweak / resize window (w/ PadMenu)    // e.g. D-pad Left/Right/Up/Down (Gamepads), Arrow keys (Keyboard)
     1091    ImGuiNavInput_DpadRight,     //
     1092    ImGuiNavInput_DpadUp,        //
     1093    ImGuiNavInput_DpadDown,      //
     1094    ImGuiNavInput_LStickLeft,    // scroll / move window (w/ PadMenu)            // e.g. Left Analog Stick Left/Right/Up/Down
     1095    ImGuiNavInput_LStickRight,   //
     1096    ImGuiNavInput_LStickUp,      //
     1097    ImGuiNavInput_LStickDown,    //
     1098    ImGuiNavInput_FocusPrev,     // next window (w/ PadMenu)                     // e.g. L1 or L2 (PS4), LB or LT (Xbox), L or ZL (Switch)
     1099    ImGuiNavInput_FocusNext,     // prev window (w/ PadMenu)                     // e.g. R1 or R2 (PS4), RB or RT (Xbox), R or ZL (Switch)
     1100    ImGuiNavInput_TweakSlow,     // slower tweaks                                // e.g. L1 or L2 (PS4), LB or LT (Xbox), L or ZL (Switch)
     1101    ImGuiNavInput_TweakFast,     // faster tweaks                                // e.g. R1 or R2 (PS4), RB or RT (Xbox), R or ZL (Switch)
     1102
     1103    // [Internal] Don't use directly! This is used internally to differentiate keyboard from gamepad inputs for behaviors that require to differentiate them.
     1104    // Keyboard behavior that have no corresponding gamepad mapping (e.g. CTRL+TAB) will be directly reading from io.KeysDown[] instead of io.NavInputs[].
     1105    ImGuiNavInput_KeyMenu_,      // toggle menu                                  // = io.KeyAlt
     1106    ImGuiNavInput_KeyLeft_,      // move left                                    // = Arrow keys
     1107    ImGuiNavInput_KeyRight_,     // move right
     1108    ImGuiNavInput_KeyUp_,        // move up
     1109    ImGuiNavInput_KeyDown_,      // move down
     1110    ImGuiNavInput_COUNT,
     1111    ImGuiNavInput_InternalStart_ = ImGuiNavInput_KeyMenu_
    7761112};
    7771113
     
    7791115enum ImGuiConfigFlags_
    7801116{
    781    ImGuiConfigFlags_NavEnableKeyboard = 1 << 0,   // Master keyboard navigation enable flag. NewFrame() will automatically fill io.NavInputs[] based on io.KeysDown[].
    782    ImGuiConfigFlags_NavEnableGamepad = 1 << 1,   // Master gamepad navigation enable flag. This is mostly to instruct your imgui back-end to fill io.NavInputs[]. Back-end also needs to set ImGuiBackendFlags_HasGamepad.
    783    ImGuiConfigFlags_NavEnableSetMousePos = 1 << 2,   // Instruct navigation to move the mouse cursor. May be useful on TV/console systems where moving a virtual mouse is awkward. Will update io.MousePos and set io.WantSetMousePos=true. If enabled you MUST honor io.WantSetMousePos requests in your binding, otherwise ImGui will react as if the mouse is jumping around back and forth.
    784    ImGuiConfigFlags_NavNoCaptureKeyboard = 1 << 3,   // Instruct navigation to not set the io.WantCaptureKeyboard flag with io.NavActive is set.
    785    ImGuiConfigFlags_NoMouse = 1 << 4,   // Instruct imgui to clear mouse position/buttons in NewFrame(). This allows ignoring the mouse information back-end
    786    ImGuiConfigFlags_NoMouseCursorChange = 1 << 5,   // Instruct back-end to not alter mouse cursor shape and visibility.
    787 
    788                                                     // User storage (to allow your back-end/engine to communicate to code that may be shared between multiple projects. Those flags are not used by core ImGui)
    789                                                     ImGuiConfigFlags_IsSRGB = 1 << 20,  // Application is SRGB-aware.
    790                                                     ImGuiConfigFlags_IsTouchScreen = 1 << 21   // Application is using a touch screen instead of a mouse.
     1117    ImGuiConfigFlags_None                   = 0,
     1118    ImGuiConfigFlags_NavEnableKeyboard      = 1 << 0,   // Master keyboard navigation enable flag. NewFrame() will automatically fill io.NavInputs[] based on io.KeysDown[].
     1119    ImGuiConfigFlags_NavEnableGamepad       = 1 << 1,   // Master gamepad navigation enable flag. This is mostly to instruct your imgui back-end to fill io.NavInputs[]. Back-end also needs to set ImGuiBackendFlags_HasGamepad.
     1120    ImGuiConfigFlags_NavEnableSetMousePos   = 1 << 2,   // Instruct navigation to move the mouse cursor. May be useful on TV/console systems where moving a virtual mouse is awkward. Will update io.MousePos and set io.WantSetMousePos=true. If enabled you MUST honor io.WantSetMousePos requests in your binding, otherwise ImGui will react as if the mouse is jumping around back and forth.
     1121    ImGuiConfigFlags_NavNoCaptureKeyboard   = 1 << 3,   // Instruct navigation to not set the io.WantCaptureKeyboard flag when io.NavActive is set.
     1122    ImGuiConfigFlags_NoMouse                = 1 << 4,   // Instruct imgui to clear mouse position/buttons in NewFrame(). This allows ignoring the mouse information set by the back-end.
     1123    ImGuiConfigFlags_NoMouseCursorChange    = 1 << 5,   // Instruct back-end to not alter mouse cursor shape and visibility. Use if the back-end cursor changes are interfering with yours and you don't want to use SetMouseCursor() to change mouse cursor. You may want to honor requests from imgui by reading GetMouseCursor() yourself instead.
     1124
     1125    // User storage (to allow your back-end/engine to communicate to code that may be shared between multiple projects. Those flags are not used by core Dear ImGui)
     1126    ImGuiConfigFlags_IsSRGB                 = 1 << 20,  // Application is SRGB-aware.
     1127    ImGuiConfigFlags_IsTouchScreen          = 1 << 21   // Application is using a touch screen instead of a mouse.
    7911128};
    7921129
     
    7941131enum ImGuiBackendFlags_
    7951132{
    796    ImGuiBackendFlags_HasGamepad = 1 << 0,   // Back-end supports and has a connected gamepad.
    797    ImGuiBackendFlags_HasMouseCursors = 1 << 1,   // Back-end supports reading GetMouseCursor() to change the OS cursor shape.
    798    ImGuiBackendFlags_HasSetMousePos = 1 << 2    // Back-end supports io.WantSetMousePos requests to reposition the OS mouse position (only used if ImGuiConfigFlags_NavEnableSetMousePos is set).
     1133    ImGuiBackendFlags_None                  = 0,
     1134    ImGuiBackendFlags_HasGamepad            = 1 << 0,   // Back-end Platform supports gamepad and currently has one connected.
     1135    ImGuiBackendFlags_HasMouseCursors       = 1 << 1,   // Back-end Platform supports honoring GetMouseCursor() value to change the OS cursor shape.
     1136    ImGuiBackendFlags_HasSetMousePos        = 1 << 2,   // Back-end Platform supports io.WantSetMousePos requests to reposition the OS mouse position (only used if ImGuiConfigFlags_NavEnableSetMousePos is set).
     1137    ImGuiBackendFlags_RendererHasVtxOffset  = 1 << 3    // Back-end Renderer supports ImDrawCmd::VtxOffset. This enables output of large meshes (64K+ vertices) while still using 16-bit indices.
    7991138};
    8001139
     
    8021141enum ImGuiCol_
    8031142{
    804    ImGuiCol_Text,
    805    ImGuiCol_TextDisabled,
    806    ImGuiCol_WindowBg,              // Background of normal windows
    807    ImGuiCol_ChildBg,               // Background of child windows
    808    ImGuiCol_PopupBg,               // Background of popups, menus, tooltips windows
    809    ImGuiCol_Border,
    810    ImGuiCol_BorderShadow,
    811    ImGuiCol_FrameBg,               // Background of checkbox, radio button, plot, slider, text input
    812    ImGuiCol_FrameBgHovered,
    813    ImGuiCol_FrameBgActive,
    814    ImGuiCol_TitleBg,
    815    ImGuiCol_TitleBgActive,
    816    ImGuiCol_TitleBgCollapsed,
    817    ImGuiCol_MenuBarBg,
    818    ImGuiCol_ScrollbarBg,
    819    ImGuiCol_ScrollbarGrab,
    820    ImGuiCol_ScrollbarGrabHovered,
    821    ImGuiCol_ScrollbarGrabActive,
    822    ImGuiCol_CheckMark,
    823    ImGuiCol_SliderGrab,
    824    ImGuiCol_SliderGrabActive,
    825    ImGuiCol_Button,
    826    ImGuiCol_ButtonHovered,
    827    ImGuiCol_ButtonActive,
    828    ImGuiCol_Header,
    829    ImGuiCol_HeaderHovered,
    830    ImGuiCol_HeaderActive,
    831    ImGuiCol_Separator,
    832    ImGuiCol_SeparatorHovered,
    833    ImGuiCol_SeparatorActive,
    834    ImGuiCol_ResizeGrip,
    835    ImGuiCol_ResizeGripHovered,
    836    ImGuiCol_ResizeGripActive,
    837    ImGuiCol_PlotLines,
    838    ImGuiCol_PlotLinesHovered,
    839    ImGuiCol_PlotHistogram,
    840    ImGuiCol_PlotHistogramHovered,
    841    ImGuiCol_TextSelectedBg,
    842    ImGuiCol_ModalWindowDarkening,  // Darken/colorize entire screen behind a modal window, when one is active
    843    ImGuiCol_DragDropTarget,
    844    ImGuiCol_NavHighlight,          // Gamepad/keyboard: current highlighted item
    845    ImGuiCol_NavWindowingHighlight, // Gamepad/keyboard: when holding NavMenu to focus/move/resize windows
    846    ImGuiCol_COUNT
    847 
    848    // Obsolete names (will be removed)
     1143    ImGuiCol_Text,
     1144    ImGuiCol_TextDisabled,
     1145    ImGuiCol_WindowBg,              // Background of normal windows
     1146    ImGuiCol_ChildBg,               // Background of child windows
     1147    ImGuiCol_PopupBg,               // Background of popups, menus, tooltips windows
     1148    ImGuiCol_Border,
     1149    ImGuiCol_BorderShadow,
     1150    ImGuiCol_FrameBg,               // Background of checkbox, radio button, plot, slider, text input
     1151    ImGuiCol_FrameBgHovered,
     1152    ImGuiCol_FrameBgActive,
     1153    ImGuiCol_TitleBg,
     1154    ImGuiCol_TitleBgActive,
     1155    ImGuiCol_TitleBgCollapsed,
     1156    ImGuiCol_MenuBarBg,
     1157    ImGuiCol_ScrollbarBg,
     1158    ImGuiCol_ScrollbarGrab,
     1159    ImGuiCol_ScrollbarGrabHovered,
     1160    ImGuiCol_ScrollbarGrabActive,
     1161    ImGuiCol_CheckMark,
     1162    ImGuiCol_SliderGrab,
     1163    ImGuiCol_SliderGrabActive,
     1164    ImGuiCol_Button,
     1165    ImGuiCol_ButtonHovered,
     1166    ImGuiCol_ButtonActive,
     1167    ImGuiCol_Header,                // Header* colors are used for CollapsingHeader, TreeNode, Selectable, MenuItem
     1168    ImGuiCol_HeaderHovered,
     1169    ImGuiCol_HeaderActive,
     1170    ImGuiCol_Separator,
     1171    ImGuiCol_SeparatorHovered,
     1172    ImGuiCol_SeparatorActive,
     1173    ImGuiCol_ResizeGrip,
     1174    ImGuiCol_ResizeGripHovered,
     1175    ImGuiCol_ResizeGripActive,
     1176    ImGuiCol_Tab,
     1177    ImGuiCol_TabHovered,
     1178    ImGuiCol_TabActive,
     1179    ImGuiCol_TabUnfocused,
     1180    ImGuiCol_TabUnfocusedActive,
     1181    ImGuiCol_PlotLines,
     1182    ImGuiCol_PlotLinesHovered,
     1183    ImGuiCol_PlotHistogram,
     1184    ImGuiCol_PlotHistogramHovered,
     1185    ImGuiCol_TextSelectedBg,
     1186    ImGuiCol_DragDropTarget,
     1187    ImGuiCol_NavHighlight,          // Gamepad/keyboard: current highlighted item
     1188    ImGuiCol_NavWindowingHighlight, // Highlight window when using CTRL+TAB
     1189    ImGuiCol_NavWindowingDimBg,     // Darken/colorize entire screen behind the CTRL+TAB window list, when active
     1190    ImGuiCol_ModalWindowDimBg,      // Darken/colorize entire screen behind a modal window, when one is active
     1191    ImGuiCol_COUNT
     1192
     1193    // Obsolete names (will be removed)
    8491194#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS
    850    , ImGuiCol_ChildWindowBg = ImGuiCol_ChildBg, ImGuiCol_Column = ImGuiCol_Separator, ImGuiCol_ColumnHovered = ImGuiCol_SeparatorHovered, ImGuiCol_ColumnActive = ImGuiCol_SeparatorActive
    851    //ImGuiCol_CloseButton, ImGuiCol_CloseButtonActive, ImGuiCol_CloseButtonHovered, // [unused since 1.60+] the close button now uses regular button colors.
    852    //ImGuiCol_ComboBg,                                                              // [unused since 1.53+] ComboBg has been merged with PopupBg, so a redirect isn't accurate.
     1195    , ImGuiCol_ModalWindowDarkening = ImGuiCol_ModalWindowDimBg                      // [renamed in 1.63]
     1196    //, ImGuiCol_CloseButton, ImGuiCol_CloseButtonActive, ImGuiCol_CloseButtonHovered// [unused since 1.60+] the close button now uses regular button colors.
    8531197#endif
    8541198};
    8551199
    8561200// Enumeration for PushStyleVar() / PopStyleVar() to temporarily modify the ImGuiStyle structure.
    857 // NB: the enum only refers to fields of ImGuiStyle which makes sense to be pushed/popped inside UI code. During initialization, feel free to just poke into ImGuiStyle directly.
    858 // NB: if changing this enum, you need to update the associated internal table GStyleVarInfo[] accordingly. This is where we link enum values to members offset/type.
     1201// - The enum only refers to fields of ImGuiStyle which makes sense to be pushed/popped inside UI code.
     1202//   During initialization or between frames, feel free to just poke into ImGuiStyle directly.
     1203// - Tip: Use your programming IDE navigation facilities on the names in the _second column_ below to find the actual members and their description.
     1204//   In Visual Studio IDE: CTRL+comma ("Edit.NavigateTo") can follow symbols in comments, whereas CTRL+F12 ("Edit.GoToImplementation") cannot.
     1205//   With Visual Assist installed: ALT+G ("VAssistX.GoToImplementation") can also follow symbols in comments.
     1206// - When changing this enum, you need to update the associated internal table GStyleVarInfo[] accordingly. This is where we link enum values to members offset/type.
    8591207enum ImGuiStyleVar_
    8601208{
    861    // Enum name ......................// Member in ImGuiStyle structure (see ImGuiStyle for descriptions)
    862    ImGuiStyleVar_Alpha,               // float     Alpha
    863    ImGuiStyleVar_WindowPadding,       // ImVec2    WindowPadding
    864    ImGuiStyleVar_WindowRounding,      // float     WindowRounding
    865    ImGuiStyleVar_WindowBorderSize,    // float     WindowBorderSize
    866    ImGuiStyleVar_WindowMinSize,       // ImVec2    WindowMinSize
    867    ImGuiStyleVar_WindowTitleAlign,    // ImVec2    WindowTitleAlign
    868    ImGuiStyleVar_ChildRounding,       // float     ChildRounding
    869    ImGuiStyleVar_ChildBorderSize,     // float     ChildBorderSize
    870    ImGuiStyleVar_PopupRounding,       // float     PopupRounding
    871    ImGuiStyleVar_PopupBorderSize,     // float     PopupBorderSize
    872    ImGuiStyleVar_FramePadding,        // ImVec2    FramePadding
    873    ImGuiStyleVar_FrameRounding,       // float     FrameRounding
    874    ImGuiStyleVar_FrameBorderSize,     // float     FrameBorderSize
    875    ImGuiStyleVar_ItemSpacing,         // ImVec2    ItemSpacing
    876    ImGuiStyleVar_ItemInnerSpacing,    // ImVec2    ItemInnerSpacing
    877    ImGuiStyleVar_IndentSpacing,       // float     IndentSpacing
    878    ImGuiStyleVar_ScrollbarSize,       // float     ScrollbarSize
    879    ImGuiStyleVar_ScrollbarRounding,   // float     ScrollbarRounding
    880    ImGuiStyleVar_GrabMinSize,         // float     GrabMinSize
    881    ImGuiStyleVar_GrabRounding,        // float     GrabRounding
    882    ImGuiStyleVar_ButtonTextAlign,     // ImVec2    ButtonTextAlign
    883    ImGuiStyleVar_COUNT
    884 
    885    // Obsolete names (will be removed)
     1209    // Enum name --------------------- // Member in ImGuiStyle structure (see ImGuiStyle for descriptions)
     1210    ImGuiStyleVar_Alpha,               // float     Alpha
     1211    ImGuiStyleVar_WindowPadding,       // ImVec2    WindowPadding
     1212    ImGuiStyleVar_WindowRounding,      // float     WindowRounding
     1213    ImGuiStyleVar_WindowBorderSize,    // float     WindowBorderSize
     1214    ImGuiStyleVar_WindowMinSize,       // ImVec2    WindowMinSize
     1215    ImGuiStyleVar_WindowTitleAlign,    // ImVec2    WindowTitleAlign
     1216    ImGuiStyleVar_ChildRounding,       // float     ChildRounding
     1217    ImGuiStyleVar_ChildBorderSize,     // float     ChildBorderSize
     1218    ImGuiStyleVar_PopupRounding,       // float     PopupRounding
     1219    ImGuiStyleVar_PopupBorderSize,     // float     PopupBorderSize
     1220    ImGuiStyleVar_FramePadding,        // ImVec2    FramePadding
     1221    ImGuiStyleVar_FrameRounding,       // float     FrameRounding
     1222    ImGuiStyleVar_FrameBorderSize,     // float     FrameBorderSize
     1223    ImGuiStyleVar_ItemSpacing,         // ImVec2    ItemSpacing
     1224    ImGuiStyleVar_ItemInnerSpacing,    // ImVec2    ItemInnerSpacing
     1225    ImGuiStyleVar_IndentSpacing,       // float     IndentSpacing
     1226    ImGuiStyleVar_ScrollbarSize,       // float     ScrollbarSize
     1227    ImGuiStyleVar_ScrollbarRounding,   // float     ScrollbarRounding
     1228    ImGuiStyleVar_GrabMinSize,         // float     GrabMinSize
     1229    ImGuiStyleVar_GrabRounding,        // float     GrabRounding
     1230    ImGuiStyleVar_TabRounding,         // float     TabRounding
     1231    ImGuiStyleVar_ButtonTextAlign,     // ImVec2    ButtonTextAlign
     1232    ImGuiStyleVar_SelectableTextAlign, // ImVec2    SelectableTextAlign
     1233    ImGuiStyleVar_COUNT
     1234
     1235    // Obsolete names (will be removed)
    8861236#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS
    887    , ImGuiStyleVar_Count_ = ImGuiStyleVar_COUNT, ImGuiStyleVar_ChildWindowRounding = ImGuiStyleVar_ChildRounding
    888 #endif
    889 };
    890 
    891 // Enumeration for ColorEdit3() / ColorEdit4() / ColorPicker3() / ColorPicker4() / ColorButton()
     1237    , ImGuiStyleVar_Count_ = ImGuiStyleVar_COUNT                    // [renamed in 1.60]
     1238#endif
     1239};
     1240
     1241// Flags for InvisibleButton() [extended in imgui_internal.h]
     1242enum ImGuiButtonFlags_
     1243{
     1244    ImGuiButtonFlags_None                   = 0,
     1245    ImGuiButtonFlags_MouseButtonLeft        = 1 << 0,   // React on left mouse button (default)
     1246    ImGuiButtonFlags_MouseButtonRight       = 1 << 1,   // React on right mouse button
     1247    ImGuiButtonFlags_MouseButtonMiddle      = 1 << 2,   // React on center mouse button
     1248
     1249    // [Internal]
     1250    ImGuiButtonFlags_MouseButtonMask_       = ImGuiButtonFlags_MouseButtonLeft | ImGuiButtonFlags_MouseButtonRight | ImGuiButtonFlags_MouseButtonMiddle,
     1251    ImGuiButtonFlags_MouseButtonDefault_    = ImGuiButtonFlags_MouseButtonLeft
     1252};
     1253
     1254// Flags for ColorEdit3() / ColorEdit4() / ColorPicker3() / ColorPicker4() / ColorButton()
    8921255enum ImGuiColorEditFlags_
    8931256{
    894    ImGuiColorEditFlags_NoAlpha = 1 << 1,   //              // ColorEdit, ColorPicker, ColorButton: ignore Alpha component (read 3 components from the input pointer).
    895    ImGuiColorEditFlags_NoPicker = 1 << 2,   //              // ColorEdit: disable picker when clicking on colored square.
    896    ImGuiColorEditFlags_NoOptions = 1 << 3,   //              // ColorEdit: disable toggling options menu when right-clicking on inputs/small preview.
    897    ImGuiColorEditFlags_NoSmallPreview = 1 << 4,   //              // ColorEdit, ColorPicker: disable colored square preview next to the inputs. (e.g. to show only the inputs)
    898    ImGuiColorEditFlags_NoInputs = 1 << 5,   //              // ColorEdit, ColorPicker: disable inputs sliders/text widgets (e.g. to show only the small preview colored square).
    899    ImGuiColorEditFlags_NoTooltip = 1 << 6,   //              // ColorEdit, ColorPicker, ColorButton: disable tooltip when hovering the preview.
    900    ImGuiColorEditFlags_NoLabel = 1 << 7,   //              // ColorEdit, ColorPicker: disable display of inline text label (the label is still forwarded to the tooltip and picker).
    901    ImGuiColorEditFlags_NoSidePreview = 1 << 8,   //              // ColorPicker: disable bigger color preview on right side of the picker, use small colored square preview instead.
    902 
    903                                                  // User Options (right-click on widget to change some of them). You can set application defaults using SetColorEditOptions(). The idea is that you probably don't want to override them in most of your calls, let the user choose and/or call SetColorEditOptions() during startup.
    904                                                  ImGuiColorEditFlags_AlphaBar = 1 << 9,   //              // ColorEdit, ColorPicker: show vertical alpha bar/gradient in picker.
    905                                                  ImGuiColorEditFlags_AlphaPreview = 1 << 10,  //              // ColorEdit, ColorPicker, ColorButton: display preview as a transparent color over a checkerboard, instead of opaque.
    906                                                  ImGuiColorEditFlags_AlphaPreviewHalf = 1 << 11,  //              // ColorEdit, ColorPicker, ColorButton: display half opaque / half checkerboard, instead of opaque.
    907                                                  ImGuiColorEditFlags_HDR = 1 << 12,  //              // (WIP) ColorEdit: Currently only disable 0.0f..1.0f limits in RGBA edition (note: you probably want to use ImGuiColorEditFlags_Float flag as well).
    908                                                  ImGuiColorEditFlags_RGB = 1 << 13,  // [Inputs]     // ColorEdit: choose one among RGB/HSV/HEX. ColorPicker: choose any combination using RGB/HSV/HEX.
    909                                                  ImGuiColorEditFlags_HSV = 1 << 14,  // [Inputs]     // "
    910                                                  ImGuiColorEditFlags_HEX = 1 << 15,  // [Inputs]     // "
    911                                                  ImGuiColorEditFlags_Uint8 = 1 << 16,  // [DataType]   // ColorEdit, ColorPicker, ColorButton: _display_ values formatted as 0..255.
    912                                                  ImGuiColorEditFlags_Float = 1 << 17,  // [DataType]   // ColorEdit, ColorPicker, ColorButton: _display_ values formatted as 0.0f..1.0f floats instead of 0..255 integers. No round-trip of value via integers.
    913                                                  ImGuiColorEditFlags_PickerHueBar = 1 << 18,  // [PickerMode] // ColorPicker: bar for Hue, rectangle for Sat/Value.
    914                                                  ImGuiColorEditFlags_PickerHueWheel = 1 << 19,  // [PickerMode] // ColorPicker: wheel for Hue, triangle for Sat/Value.
    915 
    916                                                                                                 // [Internal] Masks
    917                                                                                                 ImGuiColorEditFlags__InputsMask = ImGuiColorEditFlags_RGB | ImGuiColorEditFlags_HSV | ImGuiColorEditFlags_HEX,
    918                                                                                                 ImGuiColorEditFlags__DataTypeMask = ImGuiColorEditFlags_Uint8 | ImGuiColorEditFlags_Float,
    919                                                                                                 ImGuiColorEditFlags__PickerMask = ImGuiColorEditFlags_PickerHueWheel | ImGuiColorEditFlags_PickerHueBar,
    920                                                                                                 ImGuiColorEditFlags__OptionsDefault = ImGuiColorEditFlags_Uint8 | ImGuiColorEditFlags_RGB | ImGuiColorEditFlags_PickerHueBar    // Change application default using SetColorEditOptions()
     1257    ImGuiColorEditFlags_None            = 0,
     1258    ImGuiColorEditFlags_NoAlpha         = 1 << 1,   //              // ColorEdit, ColorPicker, ColorButton: ignore Alpha component (will only read 3 components from the input pointer).
     1259    ImGuiColorEditFlags_NoPicker        = 1 << 2,   //              // ColorEdit: disable picker when clicking on colored square.
     1260    ImGuiColorEditFlags_NoOptions       = 1 << 3,   //              // ColorEdit: disable toggling options menu when right-clicking on inputs/small preview.
     1261    ImGuiColorEditFlags_NoSmallPreview  = 1 << 4,   //              // ColorEdit, ColorPicker: disable colored square preview next to the inputs. (e.g. to show only the inputs)
     1262    ImGuiColorEditFlags_NoInputs        = 1 << 5,   //              // ColorEdit, ColorPicker: disable inputs sliders/text widgets (e.g. to show only the small preview colored square).
     1263    ImGuiColorEditFlags_NoTooltip       = 1 << 6,   //              // ColorEdit, ColorPicker, ColorButton: disable tooltip when hovering the preview.
     1264    ImGuiColorEditFlags_NoLabel         = 1 << 7,   //              // ColorEdit, ColorPicker: disable display of inline text label (the label is still forwarded to the tooltip and picker).
     1265    ImGuiColorEditFlags_NoSidePreview   = 1 << 8,   //              // ColorPicker: disable bigger color preview on right side of the picker, use small colored square preview instead.
     1266    ImGuiColorEditFlags_NoDragDrop      = 1 << 9,   //              // ColorEdit: disable drag and drop target. ColorButton: disable drag and drop source.
     1267    ImGuiColorEditFlags_NoBorder        = 1 << 10,  //              // ColorButton: disable border (which is enforced by default)
     1268
     1269    // User Options (right-click on widget to change some of them).
     1270    ImGuiColorEditFlags_AlphaBar        = 1 << 16,  //              // ColorEdit, ColorPicker: show vertical alpha bar/gradient in picker.
     1271    ImGuiColorEditFlags_AlphaPreview    = 1 << 17,  //              // ColorEdit, ColorPicker, ColorButton: display preview as a transparent color over a checkerboard, instead of opaque.
     1272    ImGuiColorEditFlags_AlphaPreviewHalf= 1 << 18,  //              // ColorEdit, ColorPicker, ColorButton: display half opaque / half checkerboard, instead of opaque.
     1273    ImGuiColorEditFlags_HDR             = 1 << 19,  //              // (WIP) ColorEdit: Currently only disable 0.0f..1.0f limits in RGBA edition (note: you probably want to use ImGuiColorEditFlags_Float flag as well).
     1274    ImGuiColorEditFlags_DisplayRGB      = 1 << 20,  // [Display]    // ColorEdit: override _display_ type among RGB/HSV/Hex. ColorPicker: select any combination using one or more of RGB/HSV/Hex.
     1275    ImGuiColorEditFlags_DisplayHSV      = 1 << 21,  // [Display]    // "
     1276    ImGuiColorEditFlags_DisplayHex      = 1 << 22,  // [Display]    // "
     1277    ImGuiColorEditFlags_Uint8           = 1 << 23,  // [DataType]   // ColorEdit, ColorPicker, ColorButton: _display_ values formatted as 0..255.
     1278    ImGuiColorEditFlags_Float           = 1 << 24,  // [DataType]   // ColorEdit, ColorPicker, ColorButton: _display_ values formatted as 0.0f..1.0f floats instead of 0..255 integers. No round-trip of value via integers.
     1279    ImGuiColorEditFlags_PickerHueBar    = 1 << 25,  // [Picker]     // ColorPicker: bar for Hue, rectangle for Sat/Value.
     1280    ImGuiColorEditFlags_PickerHueWheel  = 1 << 26,  // [Picker]     // ColorPicker: wheel for Hue, triangle for Sat/Value.
     1281    ImGuiColorEditFlags_InputRGB        = 1 << 27,  // [Input]      // ColorEdit, ColorPicker: input and output data in RGB format.
     1282    ImGuiColorEditFlags_InputHSV        = 1 << 28,  // [Input]      // ColorEdit, ColorPicker: input and output data in HSV format.
     1283
     1284    // Defaults Options. You can set application defaults using SetColorEditOptions(). The intent is that you probably don't want to
     1285    // override them in most of your calls. Let the user choose via the option menu and/or call SetColorEditOptions() once during startup.
     1286    ImGuiColorEditFlags__OptionsDefault = ImGuiColorEditFlags_Uint8 | ImGuiColorEditFlags_DisplayRGB | ImGuiColorEditFlags_InputRGB | ImGuiColorEditFlags_PickerHueBar,
     1287
     1288    // [Internal] Masks
     1289    ImGuiColorEditFlags__DisplayMask    = ImGuiColorEditFlags_DisplayRGB | ImGuiColorEditFlags_DisplayHSV | ImGuiColorEditFlags_DisplayHex,
     1290    ImGuiColorEditFlags__DataTypeMask   = ImGuiColorEditFlags_Uint8 | ImGuiColorEditFlags_Float,
     1291    ImGuiColorEditFlags__PickerMask     = ImGuiColorEditFlags_PickerHueWheel | ImGuiColorEditFlags_PickerHueBar,
     1292    ImGuiColorEditFlags__InputMask      = ImGuiColorEditFlags_InputRGB | ImGuiColorEditFlags_InputHSV
     1293
     1294    // Obsolete names (will be removed)
     1295#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS
     1296    , ImGuiColorEditFlags_RGB = ImGuiColorEditFlags_DisplayRGB, ImGuiColorEditFlags_HSV = ImGuiColorEditFlags_DisplayHSV, ImGuiColorEditFlags_HEX = ImGuiColorEditFlags_DisplayHex  // [renamed in 1.69]
     1297#endif
     1298};
     1299
     1300// Flags for DragFloat(), DragInt(), SliderFloat(), SliderInt() etc.
     1301// We use the same sets of flags for DragXXX() and SliderXXX() functions as the features are the same and it makes it easier to swap them.
     1302enum ImGuiSliderFlags_
     1303{
     1304    ImGuiSliderFlags_None                   = 0,
     1305    ImGuiSliderFlags_AlwaysClamp            = 1 << 4,       // Clamp value to min/max bounds when input manually with CTRL+Click. By default CTRL+Click allows going out of bounds.
     1306    ImGuiSliderFlags_Logarithmic            = 1 << 5,       // Make the widget logarithmic (linear otherwise). Consider using ImGuiSliderFlags_NoRoundToFormat with this if using a format-string with small amount of digits.
     1307    ImGuiSliderFlags_NoRoundToFormat        = 1 << 6,       // Disable rounding underlying value to match precision of the display format string (e.g. %.3f values are rounded to those 3 digits)
     1308    ImGuiSliderFlags_NoInput                = 1 << 7,       // Disable CTRL+Click or Enter key allowing to input text directly into the widget
     1309    ImGuiSliderFlags_InvalidMask_           = 0x7000000F    // [Internal] We treat using those bits as being potentially a 'float power' argument from the previous API that has got miscast to this enum, and will trigger an assert if needed.
     1310
     1311    // Obsolete names (will be removed)
     1312#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS
     1313    , ImGuiSliderFlags_ClampOnInput = ImGuiSliderFlags_AlwaysClamp // [renamed in 1.79]
     1314#endif
     1315};
     1316
     1317// Identify a mouse button.
     1318// Those values are guaranteed to be stable and we frequently use 0/1 directly. Named enums provided for convenience.
     1319enum ImGuiMouseButton_
     1320{
     1321    ImGuiMouseButton_Left = 0,
     1322    ImGuiMouseButton_Right = 1,
     1323    ImGuiMouseButton_Middle = 2,
     1324    ImGuiMouseButton_COUNT = 5
    9211325};
    9221326
     
    9251329enum ImGuiMouseCursor_
    9261330{
    927    ImGuiMouseCursor_None = -1,
    928    ImGuiMouseCursor_Arrow = 0,
    929    ImGuiMouseCursor_TextInput,         // When hovering over InputText, etc.
    930    ImGuiMouseCursor_ResizeAll,         // Unused by imgui functions
    931    ImGuiMouseCursor_ResizeNS,          // When hovering over an horizontal border
    932    ImGuiMouseCursor_ResizeEW,          // When hovering over a vertical border or a column
    933    ImGuiMouseCursor_ResizeNESW,        // When hovering over the bottom-left corner of a window
    934    ImGuiMouseCursor_ResizeNWSE,        // When hovering over the bottom-right corner of a window
    935    ImGuiMouseCursor_COUNT
    936 
    937    // Obsolete names (will be removed)
     1331    ImGuiMouseCursor_None = -1,
     1332    ImGuiMouseCursor_Arrow = 0,
     1333    ImGuiMouseCursor_TextInput,         // When hovering over InputText, etc.
     1334    ImGuiMouseCursor_ResizeAll,         // (Unused by Dear ImGui functions)
     1335    ImGuiMouseCursor_ResizeNS,          // When hovering over an horizontal border
     1336    ImGuiMouseCursor_ResizeEW,          // When hovering over a vertical border or a column
     1337    ImGuiMouseCursor_ResizeNESW,        // When hovering over the bottom-left corner of a window
     1338    ImGuiMouseCursor_ResizeNWSE,        // When hovering over the bottom-right corner of a window
     1339    ImGuiMouseCursor_Hand,              // (Unused by Dear ImGui functions. Use for e.g. hyperlinks)
     1340    ImGuiMouseCursor_NotAllowed,        // When hovering something with disallowed interaction. Usually a crossed circle.
     1341    ImGuiMouseCursor_COUNT
     1342
     1343    // Obsolete names (will be removed)
    9381344#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS
    939    , ImGuiMouseCursor_Count_ = ImGuiMouseCursor_COUNT
    940 #endif
    941 };
    942 
    943 // Condition for ImGui::SetWindow***(), SetNextWindow***(), SetNextTreeNode***() functions
    944 // Important: Treat as a regular enum! Do NOT combine multiple values using binary operators! All the functions above treat 0 as a shortcut to ImGuiCond_Always.
     1345    , ImGuiMouseCursor_Count_ = ImGuiMouseCursor_COUNT      // [renamed in 1.60]
     1346#endif
     1347};
     1348
     1349// Enumeration for ImGui::SetWindow***(), SetNextWindow***(), SetNextItem***() functions
     1350// Represent a condition.
     1351// Important: Treat as a regular enum! Do NOT combine multiple values using binary operators! All the functions above treat 0 as a shortcut to ImGuiCond_Always.
    9451352enum ImGuiCond_
    9461353{
    947    ImGuiCond_Always = 1 << 0,   // Set the variable
    948    ImGuiCond_Once = 1 << 1,   // Set the variable once per runtime session (only the first call with succeed)
    949    ImGuiCond_FirstUseEver = 1 << 2,   // Set the variable if the object/window has no persistently saved data (no entry in .ini file)
    950    ImGuiCond_Appearing = 1 << 3    // Set the variable if the object/window is appearing after being hidden/inactive (or the first time)
    951 
    952                                    // Obsolete names (will be removed)
     1354    ImGuiCond_None          = 0,        // No condition (always set the variable), same as _Always
     1355    ImGuiCond_Always        = 1 << 0,   // No condition (always set the variable)
     1356    ImGuiCond_Once          = 1 << 1,   // Set the variable once per runtime session (only the first call will succeed)
     1357    ImGuiCond_FirstUseEver  = 1 << 2,   // Set the variable if the object/window has no persistently saved data (no entry in .ini file)
     1358    ImGuiCond_Appearing     = 1 << 3    // Set the variable if the object/window is appearing after being hidden/inactive (or the first time)
     1359};
     1360
     1361//-----------------------------------------------------------------------------
     1362// Helpers: Memory allocations macros
     1363// IM_MALLOC(), IM_FREE(), IM_NEW(), IM_PLACEMENT_NEW(), IM_DELETE()
     1364// We call C++ constructor on own allocated memory via the placement "new(ptr) Type()" syntax.
     1365// Defining a custom placement new() with a custom parameter allows us to bypass including <new> which on some platforms complains when user has disabled exceptions.
     1366//-----------------------------------------------------------------------------
     1367
     1368struct ImNewWrapper {};
     1369inline void* operator new(size_t, ImNewWrapper, void* ptr) { return ptr; }
     1370inline void  operator delete(void*, ImNewWrapper, void*)   {} // This is only required so we can use the symmetrical new()
     1371#define IM_ALLOC(_SIZE)                     ImGui::MemAlloc(_SIZE)
     1372#define IM_FREE(_PTR)                       ImGui::MemFree(_PTR)
     1373#define IM_PLACEMENT_NEW(_PTR)              new(ImNewWrapper(), _PTR)
     1374#define IM_NEW(_TYPE)                       new(ImNewWrapper(), ImGui::MemAlloc(sizeof(_TYPE))) _TYPE
     1375template<typename T> void IM_DELETE(T* p)   { if (p) { p->~T(); ImGui::MemFree(p); } }
     1376
     1377//-----------------------------------------------------------------------------
     1378// Helper: ImVector<>
     1379// Lightweight std::vector<>-like class to avoid dragging dependencies (also, some implementations of STL with debug enabled are absurdly slow, we bypass it so our code runs fast in debug).
     1380//-----------------------------------------------------------------------------
     1381// - You generally do NOT need to care or use this ever. But we need to make it available in imgui.h because some of our public structures are relying on it.
     1382// - We use std-like naming convention here, which is a little unusual for this codebase.
     1383// - Important: clear() frees memory, resize(0) keep the allocated buffer. We use resize(0) a lot to intentionally recycle allocated buffers across frames and amortize our costs.
     1384// - Important: our implementation does NOT call C++ constructors/destructors, we treat everything as raw data! This is intentional but be extra mindful of that,
     1385//   Do NOT use this class as a std::vector replacement in your own code! Many of the structures used by dear imgui can be safely initialized by a zero-memset.
     1386//-----------------------------------------------------------------------------
     1387
     1388template<typename T>
     1389struct ImVector
     1390{
     1391    int                 Size;
     1392    int                 Capacity;
     1393    T*                  Data;
     1394
     1395    // Provide standard typedefs but we don't use them ourselves.
     1396    typedef T                   value_type;
     1397    typedef value_type*         iterator;
     1398    typedef const value_type*   const_iterator;
     1399
     1400    // Constructors, destructor
     1401    inline ImVector()                                       { Size = Capacity = 0; Data = NULL; }
     1402    inline ImVector(const ImVector<T>& src)                 { Size = Capacity = 0; Data = NULL; operator=(src); }
     1403    inline ImVector<T>& operator=(const ImVector<T>& src)   { clear(); resize(src.Size); memcpy(Data, src.Data, (size_t)Size * sizeof(T)); return *this; }
     1404    inline ~ImVector()                                      { if (Data) IM_FREE(Data); }
     1405
     1406    inline bool         empty() const                       { return Size == 0; }
     1407    inline int          size() const                        { return Size; }
     1408    inline int          size_in_bytes() const               { return Size * (int)sizeof(T); }
     1409    inline int          max_size() const                    { return 0x7FFFFFFF / (int)sizeof(T); }
     1410    inline int          capacity() const                    { return Capacity; }
     1411    inline T&           operator[](int i)                   { IM_ASSERT(i >= 0 && i < Size); return Data[i]; }
     1412    inline const T&     operator[](int i) const             { IM_ASSERT(i >= 0 && i < Size); return Data[i]; }
     1413
     1414    inline void         clear()                             { if (Data) { Size = Capacity = 0; IM_FREE(Data); Data = NULL; } }
     1415    inline T*           begin()                             { return Data; }
     1416    inline const T*     begin() const                       { return Data; }
     1417    inline T*           end()                               { return Data + Size; }
     1418    inline const T*     end() const                         { return Data + Size; }
     1419    inline T&           front()                             { IM_ASSERT(Size > 0); return Data[0]; }
     1420    inline const T&     front() const                       { IM_ASSERT(Size > 0); return Data[0]; }
     1421    inline T&           back()                              { IM_ASSERT(Size > 0); return Data[Size - 1]; }
     1422    inline const T&     back() const                        { IM_ASSERT(Size > 0); return Data[Size - 1]; }
     1423    inline void         swap(ImVector<T>& rhs)              { int rhs_size = rhs.Size; rhs.Size = Size; Size = rhs_size; int rhs_cap = rhs.Capacity; rhs.Capacity = Capacity; Capacity = rhs_cap; T* rhs_data = rhs.Data; rhs.Data = Data; Data = rhs_data; }
     1424
     1425    inline int          _grow_capacity(int sz) const        { int new_capacity = Capacity ? (Capacity + Capacity / 2) : 8; return new_capacity > sz ? new_capacity : sz; }
     1426    inline void         resize(int new_size)                { if (new_size > Capacity) reserve(_grow_capacity(new_size)); Size = new_size; }
     1427    inline void         resize(int new_size, const T& v)    { if (new_size > Capacity) reserve(_grow_capacity(new_size)); if (new_size > Size) for (int n = Size; n < new_size; n++) memcpy(&Data[n], &v, sizeof(v)); Size = new_size; }
     1428    inline void         shrink(int new_size)                { IM_ASSERT(new_size <= Size); Size = new_size; } // Resize a vector to a smaller size, guaranteed not to cause a reallocation
     1429    inline void         reserve(int new_capacity)           { if (new_capacity <= Capacity) return; T* new_data = (T*)IM_ALLOC((size_t)new_capacity * sizeof(T)); if (Data) { memcpy(new_data, Data, (size_t)Size * sizeof(T)); IM_FREE(Data); } Data = new_data; Capacity = new_capacity; }
     1430
     1431    // NB: It is illegal to call push_back/push_front/insert with a reference pointing inside the ImVector data itself! e.g. v.push_back(v[10]) is forbidden.
     1432    inline void         push_back(const T& v)               { if (Size == Capacity) reserve(_grow_capacity(Size + 1)); memcpy(&Data[Size], &v, sizeof(v)); Size++; }
     1433    inline void         pop_back()                          { IM_ASSERT(Size > 0); Size--; }
     1434    inline void         push_front(const T& v)              { if (Size == 0) push_back(v); else insert(Data, v); }
     1435    inline T*           erase(const T* it)                  { IM_ASSERT(it >= Data && it < Data + Size); const ptrdiff_t off = it - Data; memmove(Data + off, Data + off + 1, ((size_t)Size - (size_t)off - 1) * sizeof(T)); Size--; return Data + off; }
     1436    inline T*           erase(const T* it, const T* it_last){ IM_ASSERT(it >= Data && it < Data + Size && it_last > it && it_last <= Data + Size); const ptrdiff_t count = it_last - it; const ptrdiff_t off = it - Data; memmove(Data + off, Data + off + count, ((size_t)Size - (size_t)off - count) * sizeof(T)); Size -= (int)count; return Data + off; }
     1437    inline T*           erase_unsorted(const T* it)         { IM_ASSERT(it >= Data && it < Data + Size);  const ptrdiff_t off = it - Data; if (it < Data + Size - 1) memcpy(Data + off, Data + Size - 1, sizeof(T)); Size--; return Data + off; }
     1438    inline T*           insert(const T* it, const T& v)     { IM_ASSERT(it >= Data && it <= Data + Size); const ptrdiff_t off = it - Data; if (Size == Capacity) reserve(_grow_capacity(Size + 1)); if (off < (int)Size) memmove(Data + off + 1, Data + off, ((size_t)Size - (size_t)off) * sizeof(T)); memcpy(&Data[off], &v, sizeof(v)); Size++; return Data + off; }
     1439    inline bool         contains(const T& v) const          { const T* data = Data;  const T* data_end = Data + Size; while (data < data_end) if (*data++ == v) return true; return false; }
     1440    inline T*           find(const T& v)                    { T* data = Data;  const T* data_end = Data + Size; while (data < data_end) if (*data == v) break; else ++data; return data; }
     1441    inline const T*     find(const T& v) const              { const T* data = Data;  const T* data_end = Data + Size; while (data < data_end) if (*data == v) break; else ++data; return data; }
     1442    inline bool         find_erase(const T& v)              { const T* it = find(v); if (it < Data + Size) { erase(it); return true; } return false; }
     1443    inline bool         find_erase_unsorted(const T& v)     { const T* it = find(v); if (it < Data + Size) { erase_unsorted(it); return true; } return false; }
     1444    inline int          index_from_ptr(const T* it) const   { IM_ASSERT(it >= Data && it < Data + Size); const ptrdiff_t off = it - Data; return (int)off; }
     1445};
     1446
     1447//-----------------------------------------------------------------------------
     1448// ImGuiStyle
     1449// You may modify the ImGui::GetStyle() main instance during initialization and before NewFrame().
     1450// During the frame, use ImGui::PushStyleVar(ImGuiStyleVar_XXXX)/PopStyleVar() to alter the main style values,
     1451// and ImGui::PushStyleColor(ImGuiCol_XXX)/PopStyleColor() for colors.
     1452//-----------------------------------------------------------------------------
     1453
     1454struct ImGuiStyle
     1455{
     1456    float       Alpha;                      // Global alpha applies to everything in Dear ImGui.
     1457    ImVec2      WindowPadding;              // Padding within a window.
     1458    float       WindowRounding;             // Radius of window corners rounding. Set to 0.0f to have rectangular windows. Large values tend to lead to variety of artifacts and are not recommended.
     1459    float       WindowBorderSize;           // Thickness of border around windows. Generally set to 0.0f or 1.0f. (Other values are not well tested and more CPU/GPU costly).
     1460    ImVec2      WindowMinSize;              // Minimum window size. This is a global setting. If you want to constraint individual windows, use SetNextWindowSizeConstraints().
     1461    ImVec2      WindowTitleAlign;           // Alignment for title bar text. Defaults to (0.0f,0.5f) for left-aligned,vertically centered.
     1462    ImGuiDir    WindowMenuButtonPosition;   // Side of the collapsing/docking button in the title bar (None/Left/Right). Defaults to ImGuiDir_Left.
     1463    float       ChildRounding;              // Radius of child window corners rounding. Set to 0.0f to have rectangular windows.
     1464    float       ChildBorderSize;            // Thickness of border around child windows. Generally set to 0.0f or 1.0f. (Other values are not well tested and more CPU/GPU costly).
     1465    float       PopupRounding;              // Radius of popup window corners rounding. (Note that tooltip windows use WindowRounding)
     1466    float       PopupBorderSize;            // Thickness of border around popup/tooltip windows. Generally set to 0.0f or 1.0f. (Other values are not well tested and more CPU/GPU costly).
     1467    ImVec2      FramePadding;               // Padding within a framed rectangle (used by most widgets).
     1468    float       FrameRounding;              // Radius of frame corners rounding. Set to 0.0f to have rectangular frame (used by most widgets).
     1469    float       FrameBorderSize;            // Thickness of border around frames. Generally set to 0.0f or 1.0f. (Other values are not well tested and more CPU/GPU costly).
     1470    ImVec2      ItemSpacing;                // Horizontal and vertical spacing between widgets/lines.
     1471    ImVec2      ItemInnerSpacing;           // Horizontal and vertical spacing between within elements of a composed widget (e.g. a slider and its label).
     1472    ImVec2      TouchExtraPadding;          // Expand reactive bounding box for touch-based system where touch position is not accurate enough. Unfortunately we don't sort widgets so priority on overlap will always be given to the first widget. So don't grow this too much!
     1473    float       IndentSpacing;              // Horizontal indentation when e.g. entering a tree node. Generally == (FontSize + FramePadding.x*2).
     1474    float       ColumnsMinSpacing;          // Minimum horizontal spacing between two columns. Preferably > (FramePadding.x + 1).
     1475    float       ScrollbarSize;              // Width of the vertical scrollbar, Height of the horizontal scrollbar.
     1476    float       ScrollbarRounding;          // Radius of grab corners for scrollbar.
     1477    float       GrabMinSize;                // Minimum width/height of a grab box for slider/scrollbar.
     1478    float       GrabRounding;               // Radius of grabs corners rounding. Set to 0.0f to have rectangular slider grabs.
     1479    float       LogSliderDeadzone;          // The size in pixels of the dead-zone around zero on logarithmic sliders that cross zero.
     1480    float       TabRounding;                // Radius of upper corners of a tab. Set to 0.0f to have rectangular tabs.
     1481    float       TabBorderSize;              // Thickness of border around tabs.
     1482    float       TabMinWidthForCloseButton;  // Minimum width for close button to appears on an unselected tab when hovered. Set to 0.0f to always show when hovering, set to FLT_MAX to never show close button unless selected.
     1483    ImGuiDir    ColorButtonPosition;        // Side of the color button in the ColorEdit4 widget (left/right). Defaults to ImGuiDir_Right.
     1484    ImVec2      ButtonTextAlign;            // Alignment of button text when button is larger than text. Defaults to (0.5f, 0.5f) (centered).
     1485    ImVec2      SelectableTextAlign;        // Alignment of selectable text. Defaults to (0.0f, 0.0f) (top-left aligned). It's generally important to keep this left-aligned if you want to lay multiple items on a same line.
     1486    ImVec2      DisplayWindowPadding;       // Window position are clamped to be visible within the display area or monitors by at least this amount. Only applies to regular windows.
     1487    ImVec2      DisplaySafeAreaPadding;     // If you cannot see the edges of your screen (e.g. on a TV) increase the safe area padding. Apply to popups/tooltips as well regular windows. NB: Prefer configuring your TV sets correctly!
     1488    float       MouseCursorScale;           // Scale software rendered mouse cursor (when io.MouseDrawCursor is enabled). May be removed later.
     1489    bool        AntiAliasedLines;           // Enable anti-aliased lines/borders. Disable if you are really tight on CPU/GPU. Latched at the beginning of the frame (copied to ImDrawList).
     1490    bool        AntiAliasedLinesUseTex;     // Enable anti-aliased lines/borders using textures where possible. Require back-end to render with bilinear filtering. Latched at the beginning of the frame (copied to ImDrawList).
     1491    bool        AntiAliasedFill;            // Enable anti-aliased edges around filled shapes (rounded rectangles, circles, etc.). Disable if you are really tight on CPU/GPU. Latched at the beginning of the frame (copied to ImDrawList).
     1492    float       CurveTessellationTol;       // Tessellation tolerance when using PathBezierCurveTo() without a specific number of segments. Decrease for highly tessellated curves (higher quality, more polygons), increase to reduce quality.
     1493    float       CircleSegmentMaxError;      // Maximum error (in pixels) allowed when using AddCircle()/AddCircleFilled() or drawing rounded corner rectangles with no explicit segment count specified. Decrease for higher quality but more geometry.
     1494    ImVec4      Colors[ImGuiCol_COUNT];
     1495
     1496    IMGUI_API ImGuiStyle();
     1497    IMGUI_API void ScaleAllSizes(float scale_factor);
     1498};
     1499
     1500//-----------------------------------------------------------------------------
     1501// ImGuiIO
     1502// Communicate most settings and inputs/outputs to Dear ImGui using this structure.
     1503// Access via ImGui::GetIO(). Read 'Programmer guide' section in .cpp file for general usage.
     1504//-----------------------------------------------------------------------------
     1505
     1506struct ImGuiIO
     1507{
     1508    //------------------------------------------------------------------
     1509    // Configuration (fill once)                // Default value
     1510    //------------------------------------------------------------------
     1511
     1512    ImGuiConfigFlags   ConfigFlags;             // = 0              // See ImGuiConfigFlags_ enum. Set by user/application. Gamepad/keyboard navigation options, etc.
     1513    ImGuiBackendFlags  BackendFlags;            // = 0              // See ImGuiBackendFlags_ enum. Set by back-end (imgui_impl_xxx files or custom back-end) to communicate features supported by the back-end.
     1514    ImVec2      DisplaySize;                    // <unset>          // Main display size, in pixels.
     1515    float       DeltaTime;                      // = 1.0f/60.0f     // Time elapsed since last frame, in seconds.
     1516    float       IniSavingRate;                  // = 5.0f           // Minimum time between saving positions/sizes to .ini file, in seconds.
     1517    const char* IniFilename;                    // = "imgui.ini"    // Path to .ini file. Set NULL to disable automatic .ini loading/saving, if e.g. you want to manually load/save from memory.
     1518    const char* LogFilename;                    // = "imgui_log.txt"// Path to .log file (default parameter to ImGui::LogToFile when no file is specified).
     1519    float       MouseDoubleClickTime;           // = 0.30f          // Time for a double-click, in seconds.
     1520    float       MouseDoubleClickMaxDist;        // = 6.0f           // Distance threshold to stay in to validate a double-click, in pixels.
     1521    float       MouseDragThreshold;             // = 6.0f           // Distance threshold before considering we are dragging.
     1522    int         KeyMap[ImGuiKey_COUNT];         // <unset>          // Map of indices into the KeysDown[512] entries array which represent your "native" keyboard state.
     1523    float       KeyRepeatDelay;                 // = 0.250f         // When holding a key/button, time before it starts repeating, in seconds (for buttons in Repeat mode, etc.).
     1524    float       KeyRepeatRate;                  // = 0.050f         // When holding a key/button, rate at which it repeats, in seconds.
     1525    void*       UserData;                       // = NULL           // Store your own data for retrieval by callbacks.
     1526
     1527    ImFontAtlas*Fonts;                          // <auto>           // Font atlas: load, rasterize and pack one or more fonts into a single texture.
     1528    float       FontGlobalScale;                // = 1.0f           // Global scale all fonts
     1529    bool        FontAllowUserScaling;           // = false          // Allow user scaling text of individual window with CTRL+Wheel.
     1530    ImFont*     FontDefault;                    // = NULL           // Font to use on NewFrame(). Use NULL to uses Fonts->Fonts[0].
     1531    ImVec2      DisplayFramebufferScale;        // = (1, 1)         // For retina display or other situations where window coordinates are different from framebuffer coordinates. This generally ends up in ImDrawData::FramebufferScale.
     1532
     1533    // Miscellaneous options
     1534    bool        MouseDrawCursor;                // = false          // Request ImGui to draw a mouse cursor for you (if you are on a platform without a mouse cursor). Cannot be easily renamed to 'io.ConfigXXX' because this is frequently used by back-end implementations.
     1535    bool        ConfigMacOSXBehaviors;          // = defined(__APPLE__) // OS X style: Text editing cursor movement using Alt instead of Ctrl, Shortcuts using Cmd/Super instead of Ctrl, Line/Text Start and End using Cmd+Arrows instead of Home/End, Double click selects by word instead of selecting whole text, Multi-selection in lists uses Cmd/Super instead of Ctrl (was called io.OptMacOSXBehaviors prior to 1.63)
     1536    bool        ConfigInputTextCursorBlink;     // = true           // Set to false to disable blinking cursor, for users who consider it distracting. (was called: io.OptCursorBlink prior to 1.63)
     1537    bool        ConfigWindowsResizeFromEdges;   // = true           // Enable resizing of windows from their edges and from the lower-left corner. This requires (io.BackendFlags & ImGuiBackendFlags_HasMouseCursors) because it needs mouse cursor feedback. (This used to be a per-window ImGuiWindowFlags_ResizeFromAnySide flag)
     1538    bool        ConfigWindowsMoveFromTitleBarOnly; // = false       // [BETA] Set to true to only allow moving windows when clicked+dragged from the title bar. Windows without a title bar are not affected.
     1539    float       ConfigWindowsMemoryCompactTimer;// = 60.0f          // [BETA] Compact window memory usage when unused. Set to -1.0f to disable.
     1540
     1541    //------------------------------------------------------------------
     1542    // Platform Functions
     1543    // (the imgui_impl_xxxx back-end files are setting those up for you)
     1544    //------------------------------------------------------------------
     1545
     1546    // Optional: Platform/Renderer back-end name (informational only! will be displayed in About Window) + User data for back-end/wrappers to store their own stuff.
     1547    const char* BackendPlatformName;            // = NULL
     1548    const char* BackendRendererName;            // = NULL
     1549    void*       BackendPlatformUserData;        // = NULL           // User data for platform back-end
     1550    void*       BackendRendererUserData;        // = NULL           // User data for renderer back-end
     1551    void*       BackendLanguageUserData;        // = NULL           // User data for non C++ programming language back-end
     1552
     1553    // Optional: Access OS clipboard
     1554    // (default to use native Win32 clipboard on Windows, otherwise uses a private clipboard. Override to access OS clipboard on other architectures)
     1555    const char* (*GetClipboardTextFn)(void* user_data);
     1556    void        (*SetClipboardTextFn)(void* user_data, const char* text);
     1557    void*       ClipboardUserData;
     1558
     1559    // Optional: Notify OS Input Method Editor of the screen position of your cursor for text input position (e.g. when using Japanese/Chinese IME on Windows)
     1560    // (default to use native imm32 api on Windows)
     1561    void        (*ImeSetInputScreenPosFn)(int x, int y);
     1562    void*       ImeWindowHandle;                // = NULL           // (Windows) Set this to your HWND to get automatic IME cursor positioning.
     1563
    9531564#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS
    954    , ImGuiSetCond_Always = ImGuiCond_Always, ImGuiSetCond_Once = ImGuiCond_Once, ImGuiSetCond_FirstUseEver = ImGuiCond_FirstUseEver, ImGuiSetCond_Appearing = ImGuiCond_Appearing
    955 #endif
    956 };
    957 
    958 // You may modify the ImGui::GetStyle() main instance during initialization and before NewFrame().
    959 // During the frame, use ImGui::PushStyleVar(ImGuiStyleVar_XXXX)/PopStyleVar() to alter the main style values, and ImGui::PushStyleColor(ImGuiCol_XXX)/PopStyleColor() for colors.
    960 struct ImGuiStyle
    961 {
    962    float       Alpha;                      // Global alpha applies to everything in ImGui.
    963    ImVec2      WindowPadding;              // Padding within a window.
    964    float       WindowRounding;             // Radius of window corners rounding. Set to 0.0f to have rectangular windows.
    965    float       WindowBorderSize;           // Thickness of border around windows. Generally set to 0.0f or 1.0f. (Other values are not well tested and more CPU/GPU costly).
    966    ImVec2      WindowMinSize;              // Minimum window size. This is a global setting. If you want to constraint individual windows, use SetNextWindowSizeConstraints().
    967    ImVec2      WindowTitleAlign;           // Alignment for title bar text. Defaults to (0.0f,0.5f) for left-aligned,vertically centered.
    968    float       ChildRounding;              // Radius of child window corners rounding. Set to 0.0f to have rectangular windows.
    969    float       ChildBorderSize;            // Thickness of border around child windows. Generally set to 0.0f or 1.0f. (Other values are not well tested and more CPU/GPU costly).
    970    float       PopupRounding;              // Radius of popup window corners rounding. (Note that tooltip windows use WindowRounding)
    971    float       PopupBorderSize;            // Thickness of border around popup/tooltip windows. Generally set to 0.0f or 1.0f. (Other values are not well tested and more CPU/GPU costly).
    972    ImVec2      FramePadding;               // Padding within a framed rectangle (used by most widgets).
    973    float       FrameRounding;              // Radius of frame corners rounding. Set to 0.0f to have rectangular frame (used by most widgets).
    974    float       FrameBorderSize;            // Thickness of border around frames. Generally set to 0.0f or 1.0f. (Other values are not well tested and more CPU/GPU costly).
    975    ImVec2      ItemSpacing;                // Horizontal and vertical spacing between widgets/lines.
    976    ImVec2      ItemInnerSpacing;           // Horizontal and vertical spacing between within elements of a composed widget (e.g. a slider and its label).
    977    ImVec2      TouchExtraPadding;          // Expand reactive bounding box for touch-based system where touch position is not accurate enough. Unfortunately we don't sort widgets so priority on overlap will always be given to the first widget. So don't grow this too much!
    978    float       IndentSpacing;              // Horizontal indentation when e.g. entering a tree node. Generally == (FontSize + FramePadding.x*2).
    979    float       ColumnsMinSpacing;          // Minimum horizontal spacing between two columns.
    980    float       ScrollbarSize;              // Width of the vertical scrollbar, Height of the horizontal scrollbar.
    981    float       ScrollbarRounding;          // Radius of grab corners for scrollbar.
    982    float       GrabMinSize;                // Minimum width/height of a grab box for slider/scrollbar.
    983    float       GrabRounding;               // Radius of grabs corners rounding. Set to 0.0f to have rectangular slider grabs.
    984    ImVec2      ButtonTextAlign;            // Alignment of button text when button is larger than text. Defaults to (0.5f,0.5f) for horizontally+vertically centered.
    985    ImVec2      DisplayWindowPadding;       // Window positions are clamped to be visible within the display area by at least this amount. Only covers regular windows.
    986    ImVec2      DisplaySafeAreaPadding;     // If you cannot see the edges of your screen (e.g. on a TV) increase the safe area padding. Apply to popups/tooltips as well regular windows. NB: Prefer configuring your TV sets correctly!
    987    float       MouseCursorScale;           // Scale software rendered mouse cursor (when io.MouseDrawCursor is enabled). May be removed later.
    988    bool        AntiAliasedLines;           // Enable anti-aliasing on lines/borders. Disable if you are really tight on CPU/GPU.
    989    bool        AntiAliasedFill;            // Enable anti-aliasing on filled shapes (rounded rectangles, circles, etc.)
    990    float       CurveTessellationTol;       // Tessellation tolerance when using PathBezierCurveTo() without a specific number of segments. Decrease for highly tessellated curves (higher quality, more polygons), increase to reduce quality.
    991    ImVec4      Colors[ImGuiCol_COUNT];
    992 
    993    IMGUI_API ImGuiStyle();
    994    IMGUI_API void ScaleAllSizes(float scale_factor);
    995 };
    996 
    997 // This is where your app communicate with ImGui. Access via ImGui::GetIO().
    998 // Read 'Programmer guide' section in .cpp file for general usage.
    999 struct ImGuiIO
    1000 {
    1001    //------------------------------------------------------------------
    1002    // Settings (fill once)                 // Default value:
    1003    //------------------------------------------------------------------
    1004 
    1005    ImGuiConfigFlags   ConfigFlags;         // = 0                  // See ImGuiConfigFlags_ enum. Set by user/application. Gamepad/keyboard navigation options, etc.
    1006    ImGuiBackendFlags  BackendFlags;        // = 0                  // Set ImGuiBackendFlags_ enum. Set by imgui_impl_xxx files or custom back-end.
    1007    ImVec2        DisplaySize;              // <unset>              // Display size, in pixels. For clamping windows positions.
    1008    float         DeltaTime;                // = 1.0f/60.0f         // Time elapsed since last frame, in seconds.
    1009    float         IniSavingRate;            // = 5.0f               // Maximum time between saving positions/sizes to .ini file, in seconds.
    1010    const char*   IniFilename;              // = "imgui.ini"        // Path to .ini file. NULL to disable .ini saving.
    1011    const char*   LogFilename;              // = "imgui_log.txt"    // Path to .log file (default parameter to ImGui::LogToFile when no file is specified).
    1012    float         MouseDoubleClickTime;     // = 0.30f              // Time for a double-click, in seconds.
    1013    float         MouseDoubleClickMaxDist;  // = 6.0f               // Distance threshold to stay in to validate a double-click, in pixels.
    1014    float         MouseDragThreshold;       // = 6.0f               // Distance threshold before considering we are dragging.
    1015    int           KeyMap[ImGuiKey_COUNT];   // <unset>              // Map of indices into the KeysDown[512] entries array which represent your "native" keyboard state.
    1016    float         KeyRepeatDelay;           // = 0.250f             // When holding a key/button, time before it starts repeating, in seconds (for buttons in Repeat mode, etc.).
    1017    float         KeyRepeatRate;            // = 0.050f             // When holding a key/button, rate at which it repeats, in seconds.
    1018    void*         UserData;                 // = NULL               // Store your own data for retrieval by callbacks.
    1019 
    1020    ImFontAtlas*  Fonts;                    // <auto>               // Load and assemble one or more fonts into a single tightly packed texture. Output to Fonts array.
    1021    float         FontGlobalScale;          // = 1.0f               // Global scale all fonts
    1022    bool          FontAllowUserScaling;     // = false              // Allow user scaling text of individual window with CTRL+Wheel.
    1023    ImFont*       FontDefault;              // = NULL               // Font to use on NewFrame(). Use NULL to uses Fonts->Fonts[0].
    1024    ImVec2        DisplayFramebufferScale;  // = (1.0f,1.0f)        // For retina display or other situations where window coordinates are different from framebuffer coordinates. User storage only, presently not used by ImGui.
    1025    ImVec2        DisplayVisibleMin;        // <unset> (0.0f,0.0f)  // If you use DisplaySize as a virtual space larger than your screen, set DisplayVisibleMin/Max to the visible area.
    1026    ImVec2        DisplayVisibleMax;        // <unset> (0.0f,0.0f)  // If the values are the same, we defaults to Min=(0.0f) and Max=DisplaySize
    1027 
    1028                                            // Advanced/subtle behaviors
    1029    bool          OptMacOSXBehaviors;       // = defined(__APPLE__) // OS X style: Text editing cursor movement using Alt instead of Ctrl, Shortcuts using Cmd/Super instead of Ctrl, Line/Text Start and End using Cmd+Arrows instead of Home/End, Double click selects by word instead of selecting whole text, Multi-selection in lists uses Cmd/Super instead of Ctrl
    1030    bool          OptCursorBlink;           // = true               // Enable blinking cursor, for users who consider it annoying.
    1031 
    1032                                            //------------------------------------------------------------------
    1033                                            // Settings (User Functions)
    1034                                            //------------------------------------------------------------------
    1035 
    1036                                            // Optional: access OS clipboard
    1037                                            // (default to use native Win32 clipboard on Windows, otherwise uses a private clipboard. Override to access OS clipboard on other architectures)
    1038    const char* (*GetClipboardTextFn)(void* user_data);
    1039    void(*SetClipboardTextFn)(void* user_data, const char* text);
    1040    void*       ClipboardUserData;
    1041 
    1042    // Optional: notify OS Input Method Editor of the screen position of your cursor for text input position (e.g. when using Japanese/Chinese IME in Windows)
    1043    // (default to use native imm32 api on Windows)
    1044    void(*ImeSetInputScreenPosFn)(int x, int y);
    1045    void*       ImeWindowHandle;            // (Windows) Set this to your HWND to get automatic IME cursor positioning.
    1046 
    1047 #ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS
    1048                                            // [OBSOLETE] Rendering function, will be automatically called in Render(). Please call your rendering function yourself now! You can obtain the ImDrawData* by calling ImGui::GetDrawData() after Render().
    1049                                            // See example applications if you are unsure of how to implement this.
    1050    void(*RenderDrawListsFn)(ImDrawData* data);
    1051 #endif
    1052 
    1053    //------------------------------------------------------------------
    1054    // Input - Fill before calling NewFrame()
    1055    //------------------------------------------------------------------
    1056 
    1057    ImVec2      MousePos;                       // Mouse position, in pixels. Set to ImVec2(-FLT_MAX,-FLT_MAX) if mouse is unavailable (on another screen, etc.)
    1058    bool        MouseDown[5];                   // Mouse buttons: left, right, middle + extras. ImGui itself mostly only uses left button (BeginPopupContext** are using right button). Others buttons allows us to track if the mouse is being used by your application + available to user as a convenience via IsMouse** API.
    1059    float       MouseWheel;                     // Mouse wheel Vertical: 1 unit scrolls about 5 lines text.
    1060    float       MouseWheelH;                    // Mouse wheel Horizontal. Most users don't have a mouse with an horizontal wheel, may not be filled by all back-ends.
    1061    bool        MouseDrawCursor;                // Request ImGui to draw a mouse cursor for you (if you are on a platform without a mouse cursor).
    1062    bool        KeyCtrl;                        // Keyboard modifier pressed: Control
    1063    bool        KeyShift;                       // Keyboard modifier pressed: Shift
    1064    bool        KeyAlt;                         // Keyboard modifier pressed: Alt
    1065    bool        KeySuper;                       // Keyboard modifier pressed: Cmd/Super/Windows
    1066    bool        KeysDown[512];                  // Keyboard keys that are pressed (ideally left in the "native" order your engine has access to keyboard keys, so you can use your own defines/enums for keys).
    1067    ImWchar     InputCharacters[16 + 1];          // List of characters input (translated by user from keypress+keyboard state). Fill using AddInputCharacter() helper.
    1068    float       NavInputs[ImGuiNavInput_COUNT]; // Gamepad inputs (keyboard keys will be auto-mapped and be written here by ImGui::NewFrame, all values will be cleared back to zero in ImGui::EndFrame)
    1069 
    1070                                                // Functions
    1071    IMGUI_API void AddInputCharacter(ImWchar c);                        // Add new character into InputCharacters[]
    1072    IMGUI_API void AddInputCharactersUTF8(const char* utf8_chars);      // Add new characters into InputCharacters[] from an UTF-8 string
    1073    inline void    ClearInputCharacters() { InputCharacters[0] = 0; }   // Clear the text input buffer manually
    1074 
    1075                                                                        //------------------------------------------------------------------
    1076                                                                        // Output - Retrieve after calling NewFrame()
    1077                                                                        //------------------------------------------------------------------
    1078 
    1079    bool        WantCaptureMouse;           // When io.WantCaptureMouse is true, imgui will use the mouse inputs, do not dispatch them to your main game/application (in both cases, always pass on mouse inputs to imgui). (e.g. unclicked mouse is hovering over an imgui window, widget is active, mouse was clicked over an imgui window, etc.).
    1080    bool        WantCaptureKeyboard;        // When io.WantCaptureKeyboard is true, imgui will use the keyboard inputs, do not dispatch them to your main game/application (in both cases, always pass keyboard inputs to imgui). (e.g. InputText active, or an imgui window is focused and navigation is enabled, etc.).
    1081    bool        WantTextInput;              // Mobile/console: when io.WantTextInput is true, you may display an on-screen keyboard. This is set by ImGui when it wants textual keyboard input to happen (e.g. when a InputText widget is active).
    1082    bool        WantSetMousePos;            // MousePos has been altered, back-end should reposition mouse on next frame. Set only when ImGuiConfigFlags_NavEnableSetMousePos flag is enabled.
    1083    bool        NavActive;                  // Directional navigation is currently allowed (will handle ImGuiKey_NavXXX events) = a window is focused and it doesn't use the ImGuiWindowFlags_NoNavInputs flag.
    1084    bool        NavVisible;                 // Directional navigation is visible and allowed (will handle ImGuiKey_NavXXX events).
    1085    float       Framerate;                  // Application framerate estimation, in frame per second. Solely for convenience. Rolling average estimation based on IO.DeltaTime over 120 frames
    1086    int         MetricsRenderVertices;      // Vertices output during last call to Render()
    1087    int         MetricsRenderIndices;       // Indices output during last call to Render() = number of triangles * 3
    1088    int         MetricsActiveWindows;       // Number of visible root windows (exclude child windows)
    1089    ImVec2      MouseDelta;                 // Mouse delta. Note that this is zero if either current or previous position are invalid (-FLT_MAX,-FLT_MAX), so a disappearing/reappearing mouse won't have a huge delta.
    1090 
    1091                                            //------------------------------------------------------------------
    1092                                            // [Internal] ImGui will maintain those fields. Forward compatibility not guaranteed!
    1093                                            //------------------------------------------------------------------
    1094 
    1095    ImVec2      MousePosPrev;               // Previous mouse position temporary storage (nb: not for public use, set to MousePos in NewFrame())
    1096    ImVec2      MouseClickedPos[5];         // Position at time of clicking
    1097    float       MouseClickedTime[5];        // Time of last click (used to figure out double-click)
    1098    bool        MouseClicked[5];            // Mouse button went from !Down to Down
    1099    bool        MouseDoubleClicked[5];      // Has mouse button been double-clicked?
    1100    bool        MouseReleased[5];           // Mouse button went from Down to !Down
    1101    bool        MouseDownOwned[5];          // Track if button was clicked inside a window. We don't request mouse capture from the application if click started outside ImGui bounds.
    1102    float       MouseDownDuration[5];       // Duration the mouse button has been down (0.0f == just clicked)
    1103    float       MouseDownDurationPrev[5];   // Previous time the mouse button has been down
    1104    ImVec2      MouseDragMaxDistanceAbs[5]; // Maximum distance, absolute, on each axis, of how much mouse has traveled from the clicking point
    1105    float       MouseDragMaxDistanceSqr[5]; // Squared maximum distance of how much mouse has traveled from the clicking point
    1106    float       KeysDownDuration[512];      // Duration the keyboard key has been down (0.0f == just pressed)
    1107    float       KeysDownDurationPrev[512];  // Previous duration the key has been down
    1108    float       NavInputsDownDuration[ImGuiNavInput_COUNT];
    1109    float       NavInputsDownDurationPrev[ImGuiNavInput_COUNT];
    1110 
    1111    IMGUI_API   ImGuiIO();
     1565    // [OBSOLETE since 1.60+] Rendering function, will be automatically called in Render(). Please call your rendering function yourself now!
     1566    // You can obtain the ImDrawData* by calling ImGui::GetDrawData() after Render(). See example applications if you are unsure of how to implement this.
     1567    void        (*RenderDrawListsFn)(ImDrawData* data);
     1568#else
     1569    // This is only here to keep ImGuiIO the same size/layout, so that IMGUI_DISABLE_OBSOLETE_FUNCTIONS can exceptionally be used outside of imconfig.h.
     1570    void*       RenderDrawListsFnUnused;
     1571#endif
     1572
     1573    //------------------------------------------------------------------
     1574    // Input - Fill before calling NewFrame()
     1575    //------------------------------------------------------------------
     1576
     1577    ImVec2      MousePos;                       // Mouse position, in pixels. Set to ImVec2(-FLT_MAX, -FLT_MAX) if mouse is unavailable (on another screen, etc.)
     1578    bool        MouseDown[5];                   // Mouse buttons: 0=left, 1=right, 2=middle + extras (ImGuiMouseButton_COUNT == 5). Dear ImGui mostly uses left and right buttons. Others buttons allows us to track if the mouse is being used by your application + available to user as a convenience via IsMouse** API.
     1579    float       MouseWheel;                     // Mouse wheel Vertical: 1 unit scrolls about 5 lines text.
     1580    float       MouseWheelH;                    // Mouse wheel Horizontal. Most users don't have a mouse with an horizontal wheel, may not be filled by all back-ends.
     1581    bool        KeyCtrl;                        // Keyboard modifier pressed: Control
     1582    bool        KeyShift;                       // Keyboard modifier pressed: Shift
     1583    bool        KeyAlt;                         // Keyboard modifier pressed: Alt
     1584    bool        KeySuper;                       // Keyboard modifier pressed: Cmd/Super/Windows
     1585    bool        KeysDown[512];                  // Keyboard keys that are pressed (ideally left in the "native" order your engine has access to keyboard keys, so you can use your own defines/enums for keys).
     1586    float       NavInputs[ImGuiNavInput_COUNT]; // Gamepad inputs. Cleared back to zero by EndFrame(). Keyboard keys will be auto-mapped and be written here by NewFrame().
     1587
     1588    // Functions
     1589    IMGUI_API void  AddInputCharacter(unsigned int c);          // Queue new character input
     1590    IMGUI_API void  AddInputCharacterUTF16(ImWchar16 c);        // Queue new character input from an UTF-16 character, it can be a surrogate
     1591    IMGUI_API void  AddInputCharactersUTF8(const char* str);    // Queue new characters input from an UTF-8 string
     1592    IMGUI_API void  ClearInputCharacters();                     // Clear the text input buffer manually
     1593
     1594    //------------------------------------------------------------------
     1595    // Output - Updated by NewFrame() or EndFrame()/Render()
     1596    // (when reading from the io.WantCaptureMouse, io.WantCaptureKeyboard flags to dispatch your inputs, it is
     1597    //  generally easier and more correct to use their state BEFORE calling NewFrame(). See FAQ for details!)
     1598    //------------------------------------------------------------------
     1599
     1600    bool        WantCaptureMouse;               // Set when Dear ImGui will use mouse inputs, in this case do not dispatch them to your main game/application (either way, always pass on mouse inputs to imgui). (e.g. unclicked mouse is hovering over an imgui window, widget is active, mouse was clicked over an imgui window, etc.).
     1601    bool        WantCaptureKeyboard;            // Set when Dear ImGui will use keyboard inputs, in this case do not dispatch them to your main game/application (either way, always pass keyboard inputs to imgui). (e.g. InputText active, or an imgui window is focused and navigation is enabled, etc.).
     1602    bool        WantTextInput;                  // Mobile/console: when set, you may display an on-screen keyboard. This is set by Dear ImGui when it wants textual keyboard input to happen (e.g. when a InputText widget is active).
     1603    bool        WantSetMousePos;                // MousePos has been altered, back-end should reposition mouse on next frame. Rarely used! Set only when ImGuiConfigFlags_NavEnableSetMousePos flag is enabled.
     1604    bool        WantSaveIniSettings;            // When manual .ini load/save is active (io.IniFilename == NULL), this will be set to notify your application that you can call SaveIniSettingsToMemory() and save yourself. Important: clear io.WantSaveIniSettings yourself after saving!
     1605    bool        NavActive;                      // Keyboard/Gamepad navigation is currently allowed (will handle ImGuiKey_NavXXX events) = a window is focused and it doesn't use the ImGuiWindowFlags_NoNavInputs flag.
     1606    bool        NavVisible;                     // Keyboard/Gamepad navigation is visible and allowed (will handle ImGuiKey_NavXXX events).
     1607    float       Framerate;                      // Application framerate estimate, in frame per second. Solely for convenience. Rolling average estimation based on io.DeltaTime over 120 frames.
     1608    int         MetricsRenderVertices;          // Vertices output during last call to Render()
     1609    int         MetricsRenderIndices;           // Indices output during last call to Render() = number of triangles * 3
     1610    int         MetricsRenderWindows;           // Number of visible windows
     1611    int         MetricsActiveWindows;           // Number of active windows
     1612    int         MetricsActiveAllocations;       // Number of active allocations, updated by MemAlloc/MemFree based on current context. May be off if you have multiple imgui contexts.
     1613    ImVec2      MouseDelta;                     // Mouse delta. Note that this is zero if either current or previous position are invalid (-FLT_MAX,-FLT_MAX), so a disappearing/reappearing mouse won't have a huge delta.
     1614
     1615    //------------------------------------------------------------------
     1616    // [Internal] Dear ImGui will maintain those fields. Forward compatibility not guaranteed!
     1617    //------------------------------------------------------------------
     1618
     1619    ImGuiKeyModFlags KeyMods;                   // Key mods flags (same as io.KeyCtrl/KeyShift/KeyAlt/KeySuper but merged into flags), updated by NewFrame()
     1620    ImVec2      MousePosPrev;                   // Previous mouse position (note that MouseDelta is not necessary == MousePos-MousePosPrev, in case either position is invalid)
     1621    ImVec2      MouseClickedPos[5];             // Position at time of clicking
     1622    double      MouseClickedTime[5];            // Time of last click (used to figure out double-click)
     1623    bool        MouseClicked[5];                // Mouse button went from !Down to Down
     1624    bool        MouseDoubleClicked[5];          // Has mouse button been double-clicked?
     1625    bool        MouseReleased[5];               // Mouse button went from Down to !Down
     1626    bool        MouseDownOwned[5];              // Track if button was clicked inside a dear imgui window. We don't request mouse capture from the application if click started outside ImGui bounds.
     1627    bool        MouseDownWasDoubleClick[5];     // Track if button down was a double-click
     1628    float       MouseDownDuration[5];           // Duration the mouse button has been down (0.0f == just clicked)
     1629    float       MouseDownDurationPrev[5];       // Previous time the mouse button has been down
     1630    ImVec2      MouseDragMaxDistanceAbs[5];     // Maximum distance, absolute, on each axis, of how much mouse has traveled from the clicking point
     1631    float       MouseDragMaxDistanceSqr[5];     // Squared maximum distance of how much mouse has traveled from the clicking point
     1632    float       KeysDownDuration[512];          // Duration the keyboard key has been down (0.0f == just pressed)
     1633    float       KeysDownDurationPrev[512];      // Previous duration the key has been down
     1634    float       NavInputsDownDuration[ImGuiNavInput_COUNT];
     1635    float       NavInputsDownDurationPrev[ImGuiNavInput_COUNT];
     1636    float       PenPressure;                    // Touch/Pen pressure (0.0f to 1.0f, should be >0.0f only when MouseDown[0] == true). Helper storage currently unused by Dear ImGui.
     1637    ImWchar16   InputQueueSurrogate;            // For AddInputCharacterUTF16
     1638    ImVector<ImWchar> InputQueueCharacters;     // Queue of _characters_ input (obtained by platform back-end). Fill using AddInputCharacter() helper.
     1639
     1640    IMGUI_API   ImGuiIO();
     1641};
     1642
     1643//-----------------------------------------------------------------------------
     1644// Misc data structures
     1645//-----------------------------------------------------------------------------
     1646
     1647// Shared state of InputText(), passed as an argument to your callback when a ImGuiInputTextFlags_Callback* flag is used.
     1648// The callback function should return 0 by default.
     1649// Callbacks (follow a flag name and see comments in ImGuiInputTextFlags_ declarations for more details)
     1650// - ImGuiInputTextFlags_CallbackEdit:        Callback on buffer edit (note that InputText() already returns true on edit, the callback is useful mainly to manipulate the underlying buffer while focus is active)
     1651// - ImGuiInputTextFlags_CallbackAlways:      Callback on each iteration
     1652// - ImGuiInputTextFlags_CallbackCompletion:  Callback on pressing TAB
     1653// - ImGuiInputTextFlags_CallbackHistory:     Callback on pressing Up/Down arrows
     1654// - ImGuiInputTextFlags_CallbackCharFilter:  Callback on character inputs to replace or discard them. Modify 'EventChar' to replace or discard, or return 1 in callback to discard.
     1655// - ImGuiInputTextFlags_CallbackResize:      Callback on buffer capacity changes request (beyond 'buf_size' parameter value), allowing the string to grow.
     1656struct ImGuiInputTextCallbackData
     1657{
     1658    ImGuiInputTextFlags EventFlag;      // One ImGuiInputTextFlags_Callback*    // Read-only
     1659    ImGuiInputTextFlags Flags;          // What user passed to InputText()      // Read-only
     1660    void*               UserData;       // What user passed to InputText()      // Read-only
     1661
     1662    // Arguments for the different callback events
     1663    // - To modify the text buffer in a callback, prefer using the InsertChars() / DeleteChars() function. InsertChars() will take care of calling the resize callback if necessary.
     1664    // - If you know your edits are not going to resize the underlying buffer allocation, you may modify the contents of 'Buf[]' directly. You need to update 'BufTextLen' accordingly (0 <= BufTextLen < BufSize) and set 'BufDirty'' to true so InputText can update its internal state.
     1665    ImWchar             EventChar;      // Character input                      // Read-write   // [CharFilter] Replace character with another one, or set to zero to drop. return 1 is equivalent to setting EventChar=0;
     1666    ImGuiKey            EventKey;       // Key pressed (Up/Down/TAB)            // Read-only    // [Completion,History]
     1667    char*               Buf;            // Text buffer                          // Read-write   // [Resize] Can replace pointer / [Completion,History,Always] Only write to pointed data, don't replace the actual pointer!
     1668    int                 BufTextLen;     // Text length (in bytes)               // Read-write   // [Resize,Completion,History,Always] Exclude zero-terminator storage. In C land: == strlen(some_text), in C++ land: string.length()
     1669    int                 BufSize;        // Buffer size (in bytes) = capacity+1  // Read-only    // [Resize,Completion,History,Always] Include zero-terminator storage. In C land == ARRAYSIZE(my_char_array), in C++ land: string.capacity()+1
     1670    bool                BufDirty;       // Set if you modify Buf/BufTextLen!    // Write        // [Completion,History,Always]
     1671    int                 CursorPos;      //                                      // Read-write   // [Completion,History,Always]
     1672    int                 SelectionStart; //                                      // Read-write   // [Completion,History,Always] == to SelectionEnd when no selection)
     1673    int                 SelectionEnd;   //                                      // Read-write   // [Completion,History,Always]
     1674
     1675    // Helper functions for text manipulation.
     1676    // Use those function to benefit from the CallbackResize behaviors. Calling those function reset the selection.
     1677    IMGUI_API ImGuiInputTextCallbackData();
     1678    IMGUI_API void      DeleteChars(int pos, int bytes_count);
     1679    IMGUI_API void      InsertChars(int pos, const char* text, const char* text_end = NULL);
     1680    void                SelectAll()             { SelectionStart = 0; SelectionEnd = BufTextLen; }
     1681    void                ClearSelection()        { SelectionStart = SelectionEnd = BufTextLen; }
     1682    bool                HasSelection() const    { return SelectionStart != SelectionEnd; }
     1683};
     1684
     1685// Resizing callback data to apply custom constraint. As enabled by SetNextWindowSizeConstraints(). Callback is called during the next Begin().
     1686// NB: For basic min/max size constraint on each axis you don't need to use the callback! The SetNextWindowSizeConstraints() parameters are enough.
     1687struct ImGuiSizeCallbackData
     1688{
     1689    void*   UserData;       // Read-only.   What user passed to SetNextWindowSizeConstraints()
     1690    ImVec2  Pos;            // Read-only.   Window position, for reference.
     1691    ImVec2  CurrentSize;    // Read-only.   Current window size.
     1692    ImVec2  DesiredSize;    // Read-write.  Desired size, based on user's mouse position. Write to this field to restrain resizing.
     1693};
     1694
     1695// Data payload for Drag and Drop operations: AcceptDragDropPayload(), GetDragDropPayload()
     1696struct ImGuiPayload
     1697{
     1698    // Members
     1699    void*           Data;               // Data (copied and owned by dear imgui)
     1700    int             DataSize;           // Data size
     1701
     1702    // [Internal]
     1703    ImGuiID         SourceId;           // Source item id
     1704    ImGuiID         SourceParentId;     // Source parent id (if available)
     1705    int             DataFrameCount;     // Data timestamp
     1706    char            DataType[32 + 1];   // Data type tag (short user-supplied string, 32 characters max)
     1707    bool            Preview;            // Set when AcceptDragDropPayload() was called and mouse has been hovering the target item (nb: handle overlapping drag targets)
     1708    bool            Delivery;           // Set when AcceptDragDropPayload() was called and mouse button is released over the target item.
     1709
     1710    ImGuiPayload()  { Clear(); }
     1711    void Clear()    { SourceId = SourceParentId = 0; Data = NULL; DataSize = 0; memset(DataType, 0, sizeof(DataType)); DataFrameCount = -1; Preview = Delivery = false; }
     1712    bool IsDataType(const char* type) const { return DataFrameCount != -1 && strcmp(type, DataType) == 0; }
     1713    bool IsPreview() const                  { return Preview; }
     1714    bool IsDelivery() const                 { return Delivery; }
    11121715};
    11131716
    11141717//-----------------------------------------------------------------------------
    11151718// Obsolete functions (Will be removed! Read 'API BREAKING CHANGES' section in imgui.cpp for details)
     1719// Please keep your copy of dear imgui up to date! Occasionally set '#define IMGUI_DISABLE_OBSOLETE_FUNCTIONS' in imconfig.h to stay ahead.
    11161720//-----------------------------------------------------------------------------
    11171721
     
    11191723namespace ImGui
    11201724{
    1121    // OBSOLETED in 1.61 (from Apr 2018)
    1122    bool                InputFloat(const char* label, float* v, float step, float step_fast, int decimal_precision, ImGuiInputTextFlags extra_flags = 0); // Use the 'const char* format' version instead of 'decimal_precision'!
    1123    bool                InputFloat2(const char* label, float v[2], int decimal_precision, ImGuiInputTextFlags extra_flags = 0);
    1124    bool                InputFloat3(const char* label, float v[3], int decimal_precision, ImGuiInputTextFlags extra_flags = 0);
    1125    bool                InputFloat4(const char* label, float v[4], int decimal_precision, ImGuiInputTextFlags extra_flags = 0);
    1126    // OBSOLETED in 1.60 (from Dec 2017)
    1127    static inline bool  IsAnyWindowFocused() { return IsWindowFocused(ImGuiFocusedFlags_AnyWindow); }
    1128    static inline bool  IsAnyWindowHovered() { return IsWindowHovered(ImGuiHoveredFlags_AnyWindow); }
    1129    static inline ImVec2 CalcItemRectClosestPoint(const ImVec2& pos, bool on_edge = false, float outward = 0.f) { (void)on_edge; (void)outward; IM_ASSERT(0); return pos; }
    1130    // OBSOLETED in 1.53 (between Oct 2017 and Dec 2017)
    1131    static inline void  ShowTestWindow() { return ShowDemoWindow(); }
    1132    static inline bool  IsRootWindowFocused() { return IsWindowFocused(ImGuiFocusedFlags_RootWindow); }
    1133    static inline bool  IsRootWindowOrAnyChildFocused() { return IsWindowFocused(ImGuiFocusedFlags_RootAndChildWindows); }
    1134    static inline void  SetNextWindowContentWidth(float w) { SetNextWindowContentSize(ImVec2(w, 0.0f)); }
    1135    static inline float GetItemsLineHeightWithSpacing() { return GetFrameHeightWithSpacing(); }
    1136    // OBSOLETED in 1.52 (between Aug 2017 and Oct 2017)
    1137    bool                Begin(const char* name, bool* p_open, const ImVec2& size_on_first_use, float bg_alpha_override = -1.0f, ImGuiWindowFlags flags = 0); // Use SetNextWindowSize(size, ImGuiCond_FirstUseEver) + SetNextWindowBgAlpha() instead.
    1138    static inline bool  IsRootWindowOrAnyChildHovered() { return IsWindowHovered(ImGuiHoveredFlags_RootAndChildWindows); }
    1139    static inline void  AlignFirstTextHeightToWidgets() { AlignTextToFramePadding(); }
    1140    static inline void  SetNextWindowPosCenter(ImGuiCond c = 0) { ImGuiIO& io = GetIO(); SetNextWindowPos(ImVec2(io.DisplaySize.x * 0.5f, io.DisplaySize.y * 0.5f), c, ImVec2(0.5f, 0.5f)); }
    1141    // OBSOLETED in 1.51 (between Jun 2017 and Aug 2017)
    1142    static inline bool  IsItemHoveredRect() { return IsItemHovered(ImGuiHoveredFlags_RectOnly); }
    1143    static inline bool  IsPosHoveringAnyWindow(const ImVec2&) { IM_ASSERT(0); return false; } // This was misleading and partly broken. You probably want to use the ImGui::GetIO().WantCaptureMouse flag instead.
    1144    static inline bool  IsMouseHoveringAnyWindow() { return IsWindowHovered(ImGuiHoveredFlags_AnyWindow); }
    1145    static inline bool  IsMouseHoveringWindow() { return IsWindowHovered(ImGuiHoveredFlags_AllowWhenBlockedByPopup | ImGuiHoveredFlags_AllowWhenBlockedByActiveItem); }
    1146    // OBSOLETED IN 1.49 (between Apr 2016 and May 2016)
    1147    static inline bool  CollapsingHeader(const char* label, const char* str_id, bool framed = true, bool default_open = false) { (void)str_id; (void)framed; ImGuiTreeNodeFlags default_open_flags = 1 << 5; return CollapsingHeader(label, (default_open ? default_open_flags : 0)); }
     1725    // OBSOLETED in 1.79 (from August 2020)
     1726    static inline void  OpenPopupContextItem(const char* str_id = NULL, ImGuiMouseButton mb = 1) { OpenPopupOnItemClick(str_id, mb); } // Bool return value removed. Use IsWindowAppearing() in BeginPopup() instead. Renamed in 1.77, renamed back in 1.79. Sorry!
     1727    // OBSOLETED in 1.78 (from June 2020)
     1728    // Old drag/sliders functions that took a 'float power = 1.0' argument instead of flags.
     1729    // For shared code, you can version check at compile-time with `#if IMGUI_VERSION_NUM >= 17704`.
     1730    IMGUI_API bool      DragScalar(const char* label, ImGuiDataType data_type, void* p_data, float v_speed, const void* p_min, const void* p_max, const char* format, float power);
     1731    IMGUI_API bool      DragScalarN(const char* label, ImGuiDataType data_type, void* p_data, int components, float v_speed, const void* p_min, const void* p_max, const char* format, float power);
     1732    static inline bool  DragFloat(const char* label, float* v, float v_speed, float v_min, float v_max, const char* format, float power)    { return DragScalar(label, ImGuiDataType_Float, v, v_speed, &v_min, &v_max, format, power); }
     1733    static inline bool  DragFloat2(const char* label, float v[2], float v_speed, float v_min, float v_max, const char* format, float power) { return DragScalarN(label, ImGuiDataType_Float, v, 2, v_speed, &v_min, &v_max, format, power); }
     1734    static inline bool  DragFloat3(const char* label, float v[3], float v_speed, float v_min, float v_max, const char* format, float power) { return DragScalarN(label, ImGuiDataType_Float, v, 3, v_speed, &v_min, &v_max, format, power); }
     1735    static inline bool  DragFloat4(const char* label, float v[4], float v_speed, float v_min, float v_max, const char* format, float power) { return DragScalarN(label, ImGuiDataType_Float, v, 4, v_speed, &v_min, &v_max, format, power); }
     1736    IMGUI_API bool      SliderScalar(const char* label, ImGuiDataType data_type, void* p_data, const void* p_min, const void* p_max, const char* format, float power);
     1737    IMGUI_API bool      SliderScalarN(const char* label, ImGuiDataType data_type, void* p_data, int components, const void* p_min, const void* p_max, const char* format, float power);
     1738    static inline bool  SliderFloat(const char* label, float* v, float v_min, float v_max, const char* format, float power)                 { return SliderScalar(label, ImGuiDataType_Float, v, &v_min, &v_max, format, power); }
     1739    static inline bool  SliderFloat2(const char* label, float v[2], float v_min, float v_max, const char* format, float power)              { return SliderScalarN(label, ImGuiDataType_Float, v, 2, &v_min, &v_max, format, power); }
     1740    static inline bool  SliderFloat3(const char* label, float v[3], float v_min, float v_max, const char* format, float power)              { return SliderScalarN(label, ImGuiDataType_Float, v, 3, &v_min, &v_max, format, power); }
     1741    static inline bool  SliderFloat4(const char* label, float v[4], float v_min, float v_max, const char* format, float power)              { return SliderScalarN(label, ImGuiDataType_Float, v, 4, &v_min, &v_max, format, power); }
     1742    // OBSOLETED in 1.77 (from June 2020)
     1743    static inline bool  BeginPopupContextWindow(const char* str_id, ImGuiMouseButton mb, bool over_items) { return BeginPopupContextWindow(str_id, mb | (over_items ? 0 : ImGuiPopupFlags_NoOpenOverItems)); }
     1744    // OBSOLETED in 1.72 (from April 2019)
     1745    static inline void  TreeAdvanceToLabelPos()               { SetCursorPosX(GetCursorPosX() + GetTreeNodeToLabelSpacing()); }
     1746    // OBSOLETED in 1.71 (from June 2019)
     1747    static inline void  SetNextTreeNodeOpen(bool open, ImGuiCond cond = 0) { SetNextItemOpen(open, cond); }
     1748    // OBSOLETED in 1.70 (from May 2019)
     1749    static inline float GetContentRegionAvailWidth()          { return GetContentRegionAvail().x; }
     1750    // OBSOLETED in 1.69 (from Mar 2019)
     1751    static inline ImDrawList* GetOverlayDrawList()            { return GetForegroundDrawList(); }
     1752    // OBSOLETED in 1.66 (from Sep 2018)
     1753    static inline void  SetScrollHere(float center_ratio=0.5f){ SetScrollHereY(center_ratio); }
     1754    // OBSOLETED in 1.63 (between Aug 2018 and Sept 2018)
     1755    static inline bool  IsItemDeactivatedAfterChange()        { return IsItemDeactivatedAfterEdit(); }
     1756    // OBSOLETED in 1.61 (between Apr 2018 and Aug 2018)
     1757    IMGUI_API bool      InputFloat(const char* label, float* v, float step, float step_fast, int decimal_precision, ImGuiInputTextFlags flags = 0); // Use the 'const char* format' version instead of 'decimal_precision'!
     1758    IMGUI_API bool      InputFloat2(const char* label, float v[2], int decimal_precision, ImGuiInputTextFlags flags = 0);
     1759    IMGUI_API bool      InputFloat3(const char* label, float v[3], int decimal_precision, ImGuiInputTextFlags flags = 0);
     1760    IMGUI_API bool      InputFloat4(const char* label, float v[4], int decimal_precision, ImGuiInputTextFlags flags = 0);
     1761    // OBSOLETED in 1.60 (between Dec 2017 and Apr 2018)
     1762    static inline bool  IsAnyWindowFocused()                  { return IsWindowFocused(ImGuiFocusedFlags_AnyWindow); }
     1763    static inline bool  IsAnyWindowHovered()                  { return IsWindowHovered(ImGuiHoveredFlags_AnyWindow); }
    11481764}
     1765typedef ImGuiInputTextCallback      ImGuiTextEditCallback;    // OBSOLETED in 1.63 (from Aug 2018): made the names consistent
     1766typedef ImGuiInputTextCallbackData  ImGuiTextEditCallbackData;
    11491767#endif
    11501768
     
    11531771//-----------------------------------------------------------------------------
    11541772
    1155 // Helper: Lightweight std::vector<> like class to avoid dragging dependencies (also: Windows implementation of STL with debug enabled is absurdly slow, so let's bypass it so our code runs fast in debug).
    1156 // *Important* Our implementation does NOT call C++ constructors/destructors. This is intentional, we do not require it but you have to be mindful of that. Do not use this class as a straight std::vector replacement in your code!
    1157 template<typename T>
    1158 class ImVector
    1159 {
    1160 public:
    1161    int                         Size;
    1162    int                         Capacity;
    1163    T*                          Data;
    1164 
    1165    typedef T                   value_type;
    1166    typedef value_type*         iterator;
    1167    typedef const value_type*   const_iterator;
    1168 
    1169    inline ImVector() { Size = Capacity = 0; Data = NULL; }
    1170    inline ~ImVector() { if (Data) ImGui::MemFree(Data); }
    1171    inline ImVector(const ImVector<T>& src) { Size = Capacity = 0; Data = NULL; operator=(src); }
    1172    inline ImVector& operator=(const ImVector<T>& src) { clear(); resize(src.Size); memcpy(Data, src.Data, (size_t)Size * sizeof(value_type)); return *this; }
    1173 
    1174    inline bool                 empty() const { return Size == 0; }
    1175    inline int                  size() const { return Size; }
    1176    inline int                  capacity() const { return Capacity; }
    1177    inline value_type&          operator[](int i) { IM_ASSERT(i < Size); return Data[i]; }
    1178    inline const value_type&    operator[](int i) const { IM_ASSERT(i < Size); return Data[i]; }
    1179 
    1180    inline void                 clear() { if (Data) { Size = Capacity = 0; ImGui::MemFree(Data); Data = NULL; } }
    1181    inline iterator             begin() { return Data; }
    1182    inline const_iterator       begin() const { return Data; }
    1183    inline iterator             end() { return Data + Size; }
    1184    inline const_iterator       end() const { return Data + Size; }
    1185    inline value_type&          front() { IM_ASSERT(Size > 0); return Data[0]; }
    1186    inline const value_type&    front() const { IM_ASSERT(Size > 0); return Data[0]; }
    1187    inline value_type&          back() { IM_ASSERT(Size > 0); return Data[Size - 1]; }
    1188    inline const value_type&    back() const { IM_ASSERT(Size > 0); return Data[Size - 1]; }
    1189    inline void                 swap(ImVector<value_type>& rhs) { int rhs_size = rhs.Size; rhs.Size = Size; Size = rhs_size; int rhs_cap = rhs.Capacity; rhs.Capacity = Capacity; Capacity = rhs_cap; value_type* rhs_data = rhs.Data; rhs.Data = Data; Data = rhs_data; }
    1190 
    1191    inline int          _grow_capacity(int sz) const { int new_capacity = Capacity ? (Capacity + Capacity / 2) : 8; return new_capacity > sz ? new_capacity : sz; }
    1192    inline void         resize(int new_size) { if (new_size > Capacity) reserve(_grow_capacity(new_size)); Size = new_size; }
    1193    inline void         resize(int new_size, const value_type& v) { if (new_size > Capacity) reserve(_grow_capacity(new_size)); if (new_size > Size) for (int n = Size; n < new_size; n++) memcpy(&Data[n], &v, sizeof(v)); Size = new_size; }
    1194    inline void         reserve(int new_capacity)
    1195    {
    1196       if (new_capacity <= Capacity)
    1197          return;
    1198       value_type* new_data = (value_type*)ImGui::MemAlloc((size_t)new_capacity * sizeof(value_type));
    1199       if (Data)
    1200          memcpy(new_data, Data, (size_t)Size * sizeof(value_type));
    1201       ImGui::MemFree(Data);
    1202       Data = new_data;
    1203       Capacity = new_capacity;
    1204    }
    1205 
    1206    // NB: &v cannot be pointing inside the ImVector Data itself! e.g. v.push_back(v[10]) is forbidden.
    1207    inline void         push_back(const value_type& v) { if (Size == Capacity) reserve(_grow_capacity(Size + 1)); memcpy(&Data[Size], &v, sizeof(v)); Size++; }
    1208    inline void         pop_back() { IM_ASSERT(Size > 0); Size--; }
    1209    inline void         push_front(const value_type& v) { if (Size == 0) push_back(v); else insert(Data, v); }
    1210    inline iterator     erase(const_iterator it) { IM_ASSERT(it >= Data && it < Data + Size); const ptrdiff_t off = it - Data; memmove(Data + off, Data + off + 1, ((size_t)Size - (size_t)off - 1) * sizeof(value_type)); Size--; return Data + off; }
    1211    inline iterator     insert(const_iterator it, const value_type& v) { IM_ASSERT(it >= Data && it <= Data + Size); const ptrdiff_t off = it - Data; if (Size == Capacity) reserve(_grow_capacity(Size + 1)); if (off < (int)Size) memmove(Data + off + 1, Data + off, ((size_t)Size - (size_t)off) * sizeof(value_type)); memcpy(&Data[off], &v, sizeof(v)); Size++; return Data + off; }
    1212    inline bool         contains(const value_type& v) const { const T* data = Data;  const T* data_end = Data + Size; while (data < data_end) if (*data++ == v) return true; return false; }
    1213 };
    1214 
    1215 // Helper: IM_NEW(), IM_PLACEMENT_NEW(), IM_DELETE() macros to call MemAlloc + Placement New, Placement Delete + MemFree
    1216 // We call C++ constructor on own allocated memory via the placement "new(ptr) Type()" syntax.
    1217 // Defining a custom placement new() with a dummy parameter allows us to bypass including <new> which on some platforms complains when user has disabled exceptions.
    1218 struct ImNewDummy {};
    1219 inline void* operator new(size_t, ImNewDummy, void* ptr) { return ptr; }
    1220 inline void  operator delete(void*, ImNewDummy, void*) {} // This is only required so we can use the symetrical new()
    1221 #define IM_PLACEMENT_NEW(_PTR)              new(ImNewDummy(), _PTR)
    1222 #define IM_NEW(_TYPE)                       new(ImNewDummy(), ImGui::MemAlloc(sizeof(_TYPE))) _TYPE
    1223 template<typename T> void IM_DELETE(T* p) { if (p) { p->~T(); ImGui::MemFree(p); } }
     1773// Helper: Unicode defines
     1774#define IM_UNICODE_CODEPOINT_INVALID 0xFFFD     // Invalid Unicode code point (standard value).
     1775#ifdef IMGUI_USE_WCHAR32
     1776#define IM_UNICODE_CODEPOINT_MAX     0x10FFFF   // Maximum Unicode code point supported by this build.
     1777#else
     1778#define IM_UNICODE_CODEPOINT_MAX     0xFFFF     // Maximum Unicode code point supported by this build.
     1779#endif
    12241780
    12251781// Helper: Execute a block of code at maximum once a frame. Convenient if you want to quickly create an UI within deep-nested code that runs multiple times every frame.
     
    12271783struct ImGuiOnceUponAFrame
    12281784{
    1229    ImGuiOnceUponAFrame() { RefFrame = -1; }
    1230    mutable int RefFrame;
    1231    operator bool() const { int current_frame = ImGui::GetFrameCount(); if (RefFrame == current_frame) return false; RefFrame = current_frame; return true; }
    1232 };
    1233 
    1234 // Helper: Macro for ImGuiOnceUponAFrame. Attention: The macro expands into 2 statement so make sure you don't use it within e.g. an if() statement without curly braces.
    1235 #ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS    // Will obsolete
    1236 #define IMGUI_ONCE_UPON_A_FRAME     static ImGuiOnceUponAFrame imgui_oaf; if (imgui_oaf)
    1237 #endif
     1785    ImGuiOnceUponAFrame() { RefFrame = -1; }
     1786    mutable int RefFrame;
     1787    operator bool() const { int current_frame = ImGui::GetFrameCount(); if (RefFrame == current_frame) return false; RefFrame = current_frame; return true; }
     1788};
    12381789
    12391790// Helper: Parse and apply text filters. In format "aaaaa[,bbbb][,ccccc]"
    12401791struct ImGuiTextFilter
    12411792{
    1242    struct TextRange
    1243    {
    1244       const char* b;
    1245       const char* e;
    1246 
    1247       TextRange() { b = e = NULL; }
    1248       TextRange(const char* _b, const char* _e) { b = _b; e = _e; }
    1249       const char* begin() const { return b; }
    1250       const char* end() const { return e; }
    1251       bool empty() const { return b == e; }
    1252       char front() const { return *b; }
    1253       static bool is_blank(char c) { return c == ' ' || c == '\t'; }
    1254       void trim_blanks() { while (b < e && is_blank(*b)) b++; while (e > b && is_blank(*(e - 1))) e--; }
    1255       IMGUI_API void split(char separator, ImVector<TextRange>& out);
    1256    };
    1257 
    1258    char                InputBuf[256];
    1259    ImVector<TextRange> Filters;
    1260    int                 CountGrep;
    1261 
    1262    IMGUI_API           ImGuiTextFilter(const char* default_filter = "");
    1263    IMGUI_API bool      Draw(const char* label = "Filter (inc,-exc)", float width = 0.0f);    // Helper calling InputText+Build
    1264    IMGUI_API bool      PassFilter(const char* text, const char* text_end = NULL) const;
    1265    IMGUI_API void      Build();
    1266    void                Clear() { InputBuf[0] = 0; Build(); }
    1267    bool                IsActive() const { return !Filters.empty(); }
    1268 };
    1269 
    1270 // Helper: Text buffer for logging/accumulating text
     1793    IMGUI_API           ImGuiTextFilter(const char* default_filter = "");
     1794    IMGUI_API bool      Draw(const char* label = "Filter (inc,-exc)", float width = 0.0f);  // Helper calling InputText+Build
     1795    IMGUI_API bool      PassFilter(const char* text, const char* text_end = NULL) const;
     1796    IMGUI_API void      Build();
     1797    void                Clear()          { InputBuf[0] = 0; Build(); }
     1798    bool                IsActive() const { return !Filters.empty(); }
     1799
     1800    // [Internal]
     1801    struct ImGuiTextRange
     1802    {
     1803        const char*     b;
     1804        const char*     e;
     1805
     1806        ImGuiTextRange()                                { b = e = NULL; }
     1807        ImGuiTextRange(const char* _b, const char* _e)  { b = _b; e = _e; }
     1808        bool            empty() const                   { return b == e; }
     1809        IMGUI_API void  split(char separator, ImVector<ImGuiTextRange>* out) const;
     1810    };
     1811    char                    InputBuf[256];
     1812    ImVector<ImGuiTextRange>Filters;
     1813    int                     CountGrep;
     1814};
     1815
     1816// Helper: Growable text buffer for logging/accumulating text
     1817// (this could be called 'ImGuiTextBuilder' / 'ImGuiStringBuilder')
    12711818struct ImGuiTextBuffer
    12721819{
    1273    ImVector<char>      Buf;
    1274 
    1275    ImGuiTextBuffer() { Buf.push_back(0); }
    1276    inline char         operator[](int i) { return Buf.Data[i]; }
    1277    const char*         begin() const { return &Buf.front(); }
    1278    const char*         end() const { return &Buf.back(); }      // Buf is zero-terminated, so end() will point on the zero-terminator
    1279    int                 size() const { return Buf.Size - 1; }
    1280    bool                empty() { return Buf.Size <= 1; }
    1281    void                clear() { Buf.clear(); Buf.push_back(0); }
    1282    void                reserve(int capacity) { Buf.reserve(capacity); }
    1283    const char*         c_str() const { return Buf.Data; }
    1284    IMGUI_API void      appendf(const char* fmt, ...) IM_FMTARGS(2);
    1285    IMGUI_API void      appendfv(const char* fmt, va_list args) IM_FMTLIST(2);
    1286 };
    1287 
    1288 // Helper: Simple Key->value storage
     1820    ImVector<char>      Buf;
     1821    IMGUI_API static char EmptyString[1];
     1822
     1823    ImGuiTextBuffer()   { }
     1824    inline char         operator[](int i) const { IM_ASSERT(Buf.Data != NULL); return Buf.Data[i]; }
     1825    const char*         begin() const           { return Buf.Data ? &Buf.front() : EmptyString; }
     1826    const char*         end() const             { return Buf.Data ? &Buf.back() : EmptyString; }   // Buf is zero-terminated, so end() will point on the zero-terminator
     1827    int                 size() const            { return Buf.Size ? Buf.Size - 1 : 0; }
     1828    bool                empty() const           { return Buf.Size <= 1; }
     1829    void                clear()                 { Buf.clear(); }
     1830    void                reserve(int capacity)   { Buf.reserve(capacity); }
     1831    const char*         c_str() const           { return Buf.Data ? Buf.Data : EmptyString; }
     1832    IMGUI_API void      append(const char* str, const char* str_end = NULL);
     1833    IMGUI_API void      appendf(const char* fmt, ...) IM_FMTARGS(2);
     1834    IMGUI_API void      appendfv(const char* fmt, va_list args) IM_FMTLIST(2);
     1835};
     1836
     1837// Helper: Key->Value storage
    12891838// Typically you don't have to worry about this since a storage is held within each Window.
    12901839// We use it to e.g. store collapse state for a tree (Int 0/1)
     
    12961845struct ImGuiStorage
    12971846{
    1298    struct Pair
    1299    {
    1300       ImGuiID key;
    1301       union { int val_i; float val_f; void* val_p; };
    1302       Pair(ImGuiID _key, int _val_i) { key = _key; val_i = _val_i; }
    1303       Pair(ImGuiID _key, float _val_f) { key = _key; val_f = _val_f; }
    1304       Pair(ImGuiID _key, void* _val_p) { key = _key; val_p = _val_p; }
    1305    };
    1306    ImVector<Pair>      Data;
    1307 
    1308    // - Get***() functions find pair, never add/allocate. Pairs are sorted so a query is O(log N)
    1309    // - Set***() functions find pair, insertion on demand if missing.
    1310    // - Sorted insertion is costly, paid once. A typical frame shouldn't need to insert any new pair.
    1311    void                Clear() { Data.clear(); }
    1312    IMGUI_API int       GetInt(ImGuiID key, int default_val = 0) const;
    1313    IMGUI_API void      SetInt(ImGuiID key, int val);
    1314    IMGUI_API bool      GetBool(ImGuiID key, bool default_val = false) const;
    1315    IMGUI_API void      SetBool(ImGuiID key, bool val);
    1316    IMGUI_API float     GetFloat(ImGuiID key, float default_val = 0.0f) const;
    1317    IMGUI_API void      SetFloat(ImGuiID key, float val);
    1318    IMGUI_API void*     GetVoidPtr(ImGuiID key) const; // default_val is NULL
    1319    IMGUI_API void      SetVoidPtr(ImGuiID key, void* val);
    1320 
    1321    // - Get***Ref() functions finds pair, insert on demand if missing, return pointer. Useful if you intend to do Get+Set.
    1322    // - References are only valid until a new value is added to the storage. Calling a Set***() function or a Get***Ref() function invalidates the pointer.
    1323    // - A typical use case where this is convenient for quick hacking (e.g. add storage during a live Edit&Continue session if you can't modify existing struct)
    1324    //      float* pvar = ImGui::GetFloatRef(key); ImGui::SliderFloat("var", pvar, 0, 100.0f); some_var += *pvar;
    1325    IMGUI_API int*      GetIntRef(ImGuiID key, int default_val = 0);
    1326    IMGUI_API bool*     GetBoolRef(ImGuiID key, bool default_val = false);
    1327    IMGUI_API float*    GetFloatRef(ImGuiID key, float default_val = 0.0f);
    1328    IMGUI_API void**    GetVoidPtrRef(ImGuiID key, void* default_val = NULL);
    1329 
    1330    // Use on your own storage if you know only integer are being stored (open/close all tree nodes)
    1331    IMGUI_API void      SetAllInt(int val);
    1332 
    1333    // For quicker full rebuild of a storage (instead of an incremental one), you may add all your contents and then sort once.
    1334    IMGUI_API void      BuildSortByKey();
    1335 };
    1336 
    1337 // Shared state of InputText(), passed to callback when a ImGuiInputTextFlags_Callback* flag is used and the corresponding callback is triggered.
    1338 struct ImGuiTextEditCallbackData
    1339 {
    1340    ImGuiInputTextFlags EventFlag;      // One of ImGuiInputTextFlags_Callback* // Read-only
    1341    ImGuiInputTextFlags Flags;          // What user passed to InputText()      // Read-only
    1342    void*               UserData;       // What user passed to InputText()      // Read-only
    1343    bool                ReadOnly;       // Read-only mode                       // Read-only
    1344 
    1345                                        // CharFilter event:
    1346    ImWchar             EventChar;      // Character input                      // Read-write (replace character or set to zero)
    1347 
    1348                                        // Completion,History,Always events:
    1349                                        // If you modify the buffer contents make sure you update 'BufTextLen' and set 'BufDirty' to true.
    1350    ImGuiKey            EventKey;       // Key pressed (Up/Down/TAB)            // Read-only
    1351    char*               Buf;            // Current text buffer                  // Read-write (pointed data only, can't replace the actual pointer)
    1352    int                 BufTextLen;     // Current text length in bytes         // Read-write
    1353    int                 BufSize;        // Maximum text length in bytes         // Read-only
    1354    bool                BufDirty;       // Set if you modify Buf/BufTextLen!!   // Write
    1355    int                 CursorPos;      //                                      // Read-write
    1356    int                 SelectionStart; //                                      // Read-write (== to SelectionEnd when no selection)
    1357    int                 SelectionEnd;   //                                      // Read-write
    1358 
    1359                                        // NB: Helper functions for text manipulation. Calling those function loses selection.
    1360    IMGUI_API void    DeleteChars(int pos, int bytes_count);
    1361    IMGUI_API void    InsertChars(int pos, const char* text, const char* text_end = NULL);
    1362    bool              HasSelection() const { return SelectionStart != SelectionEnd; }
    1363 };
    1364 
    1365 // Resizing callback data to apply custom constraint. As enabled by SetNextWindowSizeConstraints(). Callback is called during the next Begin().
    1366 // NB: For basic min/max size constraint on each axis you don't need to use the callback! The SetNextWindowSizeConstraints() parameters are enough.
    1367 struct ImGuiSizeCallbackData
    1368 {
    1369    void*   UserData;       // Read-only.   What user passed to SetNextWindowSizeConstraints()
    1370    ImVec2  Pos;            // Read-only.   Window position, for reference.
    1371    ImVec2  CurrentSize;    // Read-only.   Current window size.
    1372    ImVec2  DesiredSize;    // Read-write.  Desired size, based on user's mouse position. Write to this field to restrain resizing.
    1373 };
    1374 
    1375 // Data payload for Drag and Drop operations
    1376 struct ImGuiPayload
    1377 {
    1378    // Members
    1379    void*           Data;               // Data (copied and owned by dear imgui)
    1380    int             DataSize;           // Data size
    1381 
    1382                                        // [Internal]
    1383    ImGuiID         SourceId;           // Source item id
    1384    ImGuiID         SourceParentId;     // Source parent id (if available)
    1385    int             DataFrameCount;     // Data timestamp
    1386    char            DataType[32 + 1];     // Data type tag (short user-supplied string, 32 characters max)
    1387    bool            Preview;            // Set when AcceptDragDropPayload() was called and mouse has been hovering the target item (nb: handle overlapping drag targets)
    1388    bool            Delivery;           // Set when AcceptDragDropPayload() was called and mouse button is released over the target item.
    1389 
    1390    ImGuiPayload() { Clear(); }
    1391    void Clear() { SourceId = SourceParentId = 0; Data = NULL; DataSize = 0; memset(DataType, 0, sizeof(DataType)); DataFrameCount = -1; Preview = Delivery = false; }
    1392    bool IsDataType(const char* type) const { return DataFrameCount != -1 && strcmp(type, DataType) == 0; }
    1393    bool IsPreview() const { return Preview; }
    1394    bool IsDelivery() const { return Delivery; }
    1395 };
    1396 
    1397 // Helpers macros to generate 32-bits encoded colors
     1847    // [Internal]
     1848    struct ImGuiStoragePair
     1849    {
     1850        ImGuiID key;
     1851        union { int val_i; float val_f; void* val_p; };
     1852        ImGuiStoragePair(ImGuiID _key, int _val_i)      { key = _key; val_i = _val_i; }
     1853        ImGuiStoragePair(ImGuiID _key, float _val_f)    { key = _key; val_f = _val_f; }
     1854        ImGuiStoragePair(ImGuiID _key, void* _val_p)    { key = _key; val_p = _val_p; }
     1855    };
     1856
     1857    ImVector<ImGuiStoragePair>      Data;
     1858
     1859    // - Get***() functions find pair, never add/allocate. Pairs are sorted so a query is O(log N)
     1860    // - Set***() functions find pair, insertion on demand if missing.
     1861    // - Sorted insertion is costly, paid once. A typical frame shouldn't need to insert any new pair.
     1862    void                Clear() { Data.clear(); }
     1863    IMGUI_API int       GetInt(ImGuiID key, int default_val = 0) const;
     1864    IMGUI_API void      SetInt(ImGuiID key, int val);
     1865    IMGUI_API bool      GetBool(ImGuiID key, bool default_val = false) const;
     1866    IMGUI_API void      SetBool(ImGuiID key, bool val);
     1867    IMGUI_API float     GetFloat(ImGuiID key, float default_val = 0.0f) const;
     1868    IMGUI_API void      SetFloat(ImGuiID key, float val);
     1869    IMGUI_API void*     GetVoidPtr(ImGuiID key) const; // default_val is NULL
     1870    IMGUI_API void      SetVoidPtr(ImGuiID key, void* val);
     1871
     1872    // - Get***Ref() functions finds pair, insert on demand if missing, return pointer. Useful if you intend to do Get+Set.
     1873    // - References are only valid until a new value is added to the storage. Calling a Set***() function or a Get***Ref() function invalidates the pointer.
     1874    // - A typical use case where this is convenient for quick hacking (e.g. add storage during a live Edit&Continue session if you can't modify existing struct)
     1875    //      float* pvar = ImGui::GetFloatRef(key); ImGui::SliderFloat("var", pvar, 0, 100.0f); some_var += *pvar;
     1876    IMGUI_API int*      GetIntRef(ImGuiID key, int default_val = 0);
     1877    IMGUI_API bool*     GetBoolRef(ImGuiID key, bool default_val = false);
     1878    IMGUI_API float*    GetFloatRef(ImGuiID key, float default_val = 0.0f);
     1879    IMGUI_API void**    GetVoidPtrRef(ImGuiID key, void* default_val = NULL);
     1880
     1881    // Use on your own storage if you know only integer are being stored (open/close all tree nodes)
     1882    IMGUI_API void      SetAllInt(int val);
     1883
     1884    // For quicker full rebuild of a storage (instead of an incremental one), you may add all your contents and then sort once.
     1885    IMGUI_API void      BuildSortByKey();
     1886};
     1887
     1888// Helper: Manually clip large list of items.
     1889// If you are submitting lots of evenly spaced items and you have a random access to the list, you can perform coarse
     1890// clipping based on visibility to save yourself from processing those items at all.
     1891// The clipper calculates the range of visible items and advance the cursor to compensate for the non-visible items we have skipped.
     1892// (Dear ImGui already clip items based on their bounds but it needs to measure text size to do so, whereas manual coarse clipping before submission makes this cost and your own data fetching/submission cost almost null)
     1893// Usage:
     1894//   ImGuiListClipper clipper;
     1895//   clipper.Begin(1000);         // We have 1000 elements, evenly spaced.
     1896//   while (clipper.Step())
     1897//       for (int i = clipper.DisplayStart; i < clipper.DisplayEnd; i++)
     1898//           ImGui::Text("line number %d", i);
     1899// Generally what happens is:
     1900// - Clipper lets you process the first element (DisplayStart = 0, DisplayEnd = 1) regardless of it being visible or not.
     1901// - User code submit one element.
     1902// - Clipper can measure the height of the first element
     1903// - Clipper calculate the actual range of elements to display based on the current clipping rectangle, position the cursor before the first visible element.
     1904// - User code submit visible elements.
     1905struct ImGuiListClipper
     1906{
     1907    int     DisplayStart;
     1908    int     DisplayEnd;
     1909
     1910    // [Internal]
     1911    int     ItemsCount;
     1912    int     StepNo;
     1913    float   ItemsHeight;
     1914    float   StartPosY;
     1915
     1916    IMGUI_API ImGuiListClipper();
     1917    IMGUI_API ~ImGuiListClipper();
     1918
     1919    // items_count: Use INT_MAX if you don't know how many items you have (in which case the cursor won't be advanced in the final step)
     1920    // items_height: Use -1.0f to be calculated automatically on first step. Otherwise pass in the distance between your items, typically GetTextLineHeightWithSpacing() or GetFrameHeightWithSpacing().
     1921    IMGUI_API void Begin(int items_count, float items_height = -1.0f);  // Automatically called by constructor if you passed 'items_count' or by Step() in Step 1.
     1922    IMGUI_API void End();                                               // Automatically called on the last call of Step() that returns false.
     1923    IMGUI_API bool Step();                                              // Call until it returns false. The DisplayStart/DisplayEnd fields will be set and you can process/draw those items.
     1924
     1925#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS
     1926    inline ImGuiListClipper(int items_count, float items_height = -1.0f) { memset(this, 0, sizeof(*this)); ItemsCount = -1; Begin(items_count, items_height); } // [removed in 1.79]
     1927#endif
     1928};
     1929
     1930// Helpers macros to generate 32-bit encoded colors
    13981931#ifdef IMGUI_USE_BGRA_PACKED_COLOR
    13991932#define IM_COL32_R_SHIFT    16
     
    14141947#define IM_COL32_BLACK_TRANS IM_COL32(0,0,0,0)          // Transparent black = 0x00000000
    14151948
    1416 // Helper: ImColor() implicity converts colors to either ImU32 (packed 4x1 byte) or ImVec4 (4x1 float)
     1949// Helper: ImColor() implicitly converts colors to either ImU32 (packed 4x1 byte) or ImVec4 (4x1 float)
    14171950// Prefer using IM_COL32() macros if you want a guaranteed compile-time ImU32 for usage with ImDrawList API.
    14181951// **Avoid storing ImColor! Store either u32 of ImVec4. This is not a full-featured color class. MAY OBSOLETE.
     
    14201953struct ImColor
    14211954{
    1422    ImVec4              Value;
    1423 
    1424    ImColor() { Value.x = Value.y = Value.z = Value.w = 0.0f; }
    1425    ImColor(int r, int g, int b, int a = 255) { float sc = 1.0f / 255.0f; Value.x = (float)r * sc; Value.y = (float)g * sc; Value.z = (float)b * sc; Value.w = (float)a * sc; }
    1426    ImColor(ImU32 rgba) { float sc = 1.0f / 255.0f; Value.x = (float)((rgba >> IM_COL32_R_SHIFT) & 0xFF) * sc; Value.y = (float)((rgba >> IM_COL32_G_SHIFT) & 0xFF) * sc; Value.z = (float)((rgba >> IM_COL32_B_SHIFT) & 0xFF) * sc; Value.w = (float)((rgba >> IM_COL32_A_SHIFT) & 0xFF) * sc; }
    1427    ImColor(float r, float g, float b, float a = 1.0f) { Value.x = r; Value.y = g; Value.z = b; Value.w = a; }
    1428    ImColor(const ImVec4& col) { Value = col; }
    1429    inline operator ImU32() const { return ImGui::ColorConvertFloat4ToU32(Value); }
    1430    inline operator ImVec4() const { return Value; }
    1431 
    1432    // FIXME-OBSOLETE: May need to obsolete/cleanup those helpers.
    1433    inline void    SetHSV(float h, float s, float v, float a = 1.0f) { ImGui::ColorConvertHSVtoRGB(h, s, v, Value.x, Value.y, Value.z); Value.w = a; }
    1434    static ImColor HSV(float h, float s, float v, float a = 1.0f) { float r, g, b; ImGui::ColorConvertHSVtoRGB(h, s, v, r, g, b); return ImColor(r, g, b, a); }
    1435 };
    1436 
    1437 // Helper: Manually clip large list of items.
    1438 // If you are submitting lots of evenly spaced items and you have a random access to the list, you can perform coarse clipping based on visibility to save yourself from processing those items at all.
    1439 // The clipper calculates the range of visible items and advance the cursor to compensate for the non-visible items we have skipped.
    1440 // ImGui already clip items based on their bounds but it needs to measure text size to do so. Coarse clipping before submission makes this cost and your own data fetching/submission cost null.
    1441 // Usage:
    1442 //     ImGuiListClipper clipper(1000);  // we have 1000 elements, evenly spaced.
    1443 //     while (clipper.Step())
    1444 //         for (int i = clipper.DisplayStart; i < clipper.DisplayEnd; i++)
    1445 //             ImGui::Text("line number %d", i);
    1446 // - Step 0: the clipper let you process the first element, regardless of it being visible or not, so we can measure the element height (step skipped if we passed a known height as second arg to constructor).
    1447 // - Step 1: the clipper infer height from first element, calculate the actual range of elements to display, and position the cursor before the first element.
    1448 // - (Step 2: dummy step only required if an explicit items_height was passed to constructor or Begin() and user call Step(). Does nothing and switch to Step 3.)
    1449 // - Step 3: the clipper validate that we have reached the expected Y position (corresponding to element DisplayEnd), advance the cursor to the end of the list and then returns 'false' to end the loop.
    1450 struct ImGuiListClipper
    1451 {
    1452    float   StartPosY;
    1453    float   ItemsHeight;
    1454    int     ItemsCount, StepNo, DisplayStart, DisplayEnd;
    1455 
    1456    // items_count:  Use -1 to ignore (you can call Begin later). Use INT_MAX if you don't know how many items you have (in which case the cursor won't be advanced in the final step).
    1457    // items_height: Use -1.0f to be calculated automatically on first step. Otherwise pass in the distance between your items, typically GetTextLineHeightWithSpacing() or GetFrameHeightWithSpacing().
    1458    // If you don't specify an items_height, you NEED to call Step(). If you specify items_height you may call the old Begin()/End() api directly, but prefer calling Step().
    1459    ImGuiListClipper(int items_count = -1, float items_height = -1.0f) { Begin(items_count, items_height); } // NB: Begin() initialize every fields (as we allow user to call Begin/End multiple times on a same instance if they want).
    1460    ~ImGuiListClipper() { IM_ASSERT(ItemsCount == -1); }      // Assert if user forgot to call End() or Step() until false.
    1461 
    1462    IMGUI_API bool Step();                                              // Call until it returns false. The DisplayStart/DisplayEnd fields will be set and you can process/draw those items.
    1463    IMGUI_API void Begin(int items_count, float items_height = -1.0f);  // Automatically called by constructor if you passed 'items_count' or by Step() in Step 1.
    1464    IMGUI_API void End();                                               // Automatically called on the last call of Step() that returns false.
    1465 };
    1466 
    1467 //-----------------------------------------------------------------------------
    1468 // Draw List
     1955    ImVec4              Value;
     1956
     1957    ImColor()                                                       { Value.x = Value.y = Value.z = Value.w = 0.0f; }
     1958    ImColor(int r, int g, int b, int a = 255)                       { float sc = 1.0f / 255.0f; Value.x = (float)r * sc; Value.y = (float)g * sc; Value.z = (float)b * sc; Value.w = (float)a * sc; }
     1959    ImColor(ImU32 rgba)                                             { float sc = 1.0f / 255.0f; Value.x = (float)((rgba >> IM_COL32_R_SHIFT) & 0xFF) * sc; Value.y = (float)((rgba >> IM_COL32_G_SHIFT) & 0xFF) * sc; Value.z = (float)((rgba >> IM_COL32_B_SHIFT) & 0xFF) * sc; Value.w = (float)((rgba >> IM_COL32_A_SHIFT) & 0xFF) * sc; }
     1960    ImColor(float r, float g, float b, float a = 1.0f)              { Value.x = r; Value.y = g; Value.z = b; Value.w = a; }
     1961    ImColor(const ImVec4& col)                                      { Value = col; }
     1962    inline operator ImU32() const                                   { return ImGui::ColorConvertFloat4ToU32(Value); }
     1963    inline operator ImVec4() const                                  { return Value; }
     1964
     1965    // FIXME-OBSOLETE: May need to obsolete/cleanup those helpers.
     1966    inline void    SetHSV(float h, float s, float v, float a = 1.0f){ ImGui::ColorConvertHSVtoRGB(h, s, v, Value.x, Value.y, Value.z); Value.w = a; }
     1967    static ImColor HSV(float h, float s, float v, float a = 1.0f)   { float r, g, b; ImGui::ColorConvertHSVtoRGB(h, s, v, r, g, b); return ImColor(r, g, b, a); }
     1968};
     1969
     1970//-----------------------------------------------------------------------------
     1971// Draw List API (ImDrawCmd, ImDrawIdx, ImDrawVert, ImDrawChannel, ImDrawListSplitter, ImDrawListFlags, ImDrawList, ImDrawData)
    14691972// Hold a series of drawing commands. The user provides a renderer for ImDrawData which essentially contains an array of ImDrawList.
    14701973//-----------------------------------------------------------------------------
    14711974
    1472 // Draw callbacks for advanced uses.
    1473 // NB- You most likely do NOT need to use draw callbacks just to create your own widget or customized UI rendering (you can poke into the draw list for that)
    1474 // Draw callback may be useful for example, A) Change your GPU render state, B) render a complex 3D scene inside a UI element (without an intermediate texture/render target), etc.
    1475 // The expected behavior from your rendering function is 'if (cmd.UserCallback != NULL) cmd.UserCallback(parent_list, cmd); else RenderTriangles()'
    1476 typedef void(*ImDrawCallback)(const ImDrawList* parent_list, const ImDrawCmd* cmd);
     1975// The maximum line width to bake anti-aliased textures for. Build atlas with ImFontAtlasFlags_NoBakedLines to disable baking.
     1976#ifndef IM_DRAWLIST_TEX_LINES_WIDTH_MAX
     1977#define IM_DRAWLIST_TEX_LINES_WIDTH_MAX     (63)
     1978#endif
     1979
     1980// ImDrawCallback: Draw callbacks for advanced uses [configurable type: override in imconfig.h]
     1981// NB: You most likely do NOT need to use draw callbacks just to create your own widget or customized UI rendering,
     1982// you can poke into the draw list for that! Draw callback may be useful for example to:
     1983//  A) Change your GPU render state,
     1984//  B) render a complex 3D scene inside a UI element without an intermediate texture/render target, etc.
     1985// The expected behavior from your rendering function is 'if (cmd.UserCallback != NULL) { cmd.UserCallback(parent_list, cmd); } else { RenderTriangles() }'
     1986// If you want to override the signature of ImDrawCallback, you can simply use e.g. '#define ImDrawCallback MyDrawCallback' (in imconfig.h) + update rendering back-end accordingly.
     1987#ifndef ImDrawCallback
     1988typedef void (*ImDrawCallback)(const ImDrawList* parent_list, const ImDrawCmd* cmd);
     1989#endif
     1990
     1991// Special Draw callback value to request renderer back-end to reset the graphics/render state.
     1992// The renderer back-end needs to handle this special value, otherwise it will crash trying to call a function at this address.
     1993// This is useful for example if you submitted callbacks which you know have altered the render state and you want it to be restored.
     1994// It is not done by default because they are many perfectly useful way of altering render state for imgui contents (e.g. changing shader/blending settings before an Image call).
     1995#define ImDrawCallback_ResetRenderState     (ImDrawCallback)(-1)
    14771996
    14781997// Typically, 1 command = 1 GPU draw call (unless command is a callback)
     1998// - VtxOffset/IdxOffset: When 'io.BackendFlags & ImGuiBackendFlags_RendererHasVtxOffset' is enabled,
     1999//   those fields allow us to render meshes larger than 64K vertices while keeping 16-bit indices.
     2000//   Pre-1.71 back-ends will typically ignore the VtxOffset/IdxOffset fields.
     2001// - The ClipRect/TextureId/VtxOffset fields must be contiguous as we memcmp() them together (this is asserted for).
    14792002struct ImDrawCmd
    14802003{
    1481    unsigned int    ElemCount;              // Number of indices (multiple of 3) to be rendered as triangles. Vertices are stored in the callee ImDrawList's vtx_buffer[] array, indices in idx_buffer[].
    1482    ImVec4          ClipRect;               // Clipping rectangle (x1, y1, x2, y2)
    1483    ImTextureID     TextureId;              // User-provided texture ID. Set by user in ImfontAtlas::SetTexID() for fonts or passed to Image*() functions. Ignore if never using images or multiple fonts atlas.
    1484    ImDrawCallback  UserCallback;           // If != NULL, call the function instead of rendering the vertices. clip_rect and texture_id will be set normally.
    1485    void*           UserCallbackData;       // The draw callback code can access this.
    1486 
    1487    ImDrawCmd() { ElemCount = 0; ClipRect.x = ClipRect.y = ClipRect.z = ClipRect.w = 0.0f; TextureId = NULL; UserCallback = NULL; UserCallbackData = NULL; }
    1488 };
    1489 
    1490 // Vertex index (override with '#define ImDrawIdx unsigned int' inside in imconfig.h)
     2004    ImVec4          ClipRect;           // 4*4  // Clipping rectangle (x1, y1, x2, y2). Subtract ImDrawData->DisplayPos to get clipping rectangle in "viewport" coordinates
     2005    ImTextureID     TextureId;          // 4-8  // User-provided texture ID. Set by user in ImfontAtlas::SetTexID() for fonts or passed to Image*() functions. Ignore if never using images or multiple fonts atlas.
     2006    unsigned int    VtxOffset;          // 4    // Start offset in vertex buffer. ImGuiBackendFlags_RendererHasVtxOffset: always 0, otherwise may be >0 to support meshes larger than 64K vertices with 16-bit indices.
     2007    unsigned int    IdxOffset;          // 4    // Start offset in index buffer. Always equal to sum of ElemCount drawn so far.
     2008    unsigned int    ElemCount;          // 4    // Number of indices (multiple of 3) to be rendered as triangles. Vertices are stored in the callee ImDrawList's vtx_buffer[] array, indices in idx_buffer[].
     2009    ImDrawCallback  UserCallback;       // 4-8  // If != NULL, call the function instead of rendering the vertices. clip_rect and texture_id will be set normally.
     2010    void*           UserCallbackData;   // 4-8  // The draw callback code can access this.
     2011
     2012    ImDrawCmd() { memset(this, 0, sizeof(*this)); } // Also ensure our padding fields are zeroed
     2013};
     2014
     2015// Vertex index, default to 16-bit
     2016// To allow large meshes with 16-bit indices: set 'io.BackendFlags |= ImGuiBackendFlags_RendererHasVtxOffset' and handle ImDrawCmd::VtxOffset in the renderer back-end (recommended).
     2017// To use 32-bit indices: override with '#define ImDrawIdx unsigned int' in imconfig.h.
    14912018#ifndef ImDrawIdx
    14922019typedef unsigned short ImDrawIdx;
     
    14972024struct ImDrawVert
    14982025{
    1499    ImVec2  pos;
    1500    ImVec2  uv;
    1501    ImU32   col;
     2026    ImVec2  pos;
     2027    ImVec2  uv;
     2028    ImU32   col;
    15022029};
    15032030#else
    15042031// You can override the vertex format layout by defining IMGUI_OVERRIDE_DRAWVERT_STRUCT_LAYOUT in imconfig.h
    15052032// The code expect ImVec2 pos (8 bytes), ImVec2 uv (8 bytes), ImU32 col (4 bytes), but you can re-order them or add other fields as needed to simplify integration in your engine.
    1506 // The type has to be described within the macro (you can either declare the struct or use a typedef)
    1507 // NOTE: IMGUI DOESN'T CLEAR THE STRUCTURE AND DOESN'T CALL A CONSTRUCTOR SO ANY CUSTOM FIELD WILL BE UNINITIALIZED. IF YOU ADD EXTRA FIELDS (SUCH AS A 'Z' COORDINATES) YOU WILL NEED TO CLEAR THEM DURING RENDER OR TO IGNORE THEM. 
     2033// The type has to be described within the macro (you can either declare the struct or use a typedef). This is because ImVec2/ImU32 are likely not declared a the time you'd want to set your type up.
     2034// NOTE: IMGUI DOESN'T CLEAR THE STRUCTURE AND DOESN'T CALL A CONSTRUCTOR SO ANY CUSTOM FIELD WILL BE UNINITIALIZED. IF YOU ADD EXTRA FIELDS (SUCH AS A 'Z' COORDINATES) YOU WILL NEED TO CLEAR THEM DURING RENDER OR TO IGNORE THEM.
    15082035IMGUI_OVERRIDE_DRAWVERT_STRUCT_LAYOUT;
    15092036#endif
    15102037
    1511 // Draw channels are used by the Columns API to "split" the render list into different channels while building, so items of each column can be batched together.
    1512 // You can also use them to simulate drawing layers and submit primitives in a different order than how they will be rendered.
     2038// For use by ImDrawListSplitter.
    15132039struct ImDrawChannel
    15142040{
    1515    ImVector<ImDrawCmd>     CmdBuffer;
    1516    ImVector<ImDrawIdx>     IdxBuffer;
     2041    ImVector<ImDrawCmd>         _CmdBuffer;
     2042    ImVector<ImDrawIdx>         _IdxBuffer;
     2043};
     2044
     2045// Split/Merge functions are used to split the draw list into different layers which can be drawn into out of order.
     2046// This is used by the Columns api, so items of each column can be batched together in a same draw call.
     2047struct ImDrawListSplitter
     2048{
     2049    int                         _Current;    // Current channel number (0)
     2050    int                         _Count;      // Number of active channels (1+)
     2051    ImVector<ImDrawChannel>     _Channels;   // Draw channels (not resized down so _Count might be < Channels.Size)
     2052
     2053    inline ImDrawListSplitter()  { Clear(); }
     2054    inline ~ImDrawListSplitter() { ClearFreeMemory(); }
     2055    inline void                 Clear() { _Current = 0; _Count = 1; } // Do not clear Channels[] so our allocations are reused next frame
     2056    IMGUI_API void              ClearFreeMemory();
     2057    IMGUI_API void              Split(ImDrawList* draw_list, int count);
     2058    IMGUI_API void              Merge(ImDrawList* draw_list);
     2059    IMGUI_API void              SetCurrentChannel(ImDrawList* draw_list, int channel_idx);
    15172060};
    15182061
    15192062enum ImDrawCornerFlags_
    15202063{
    1521    ImDrawCornerFlags_TopLeft = 1 << 0, // 0x1
    1522    ImDrawCornerFlags_TopRight = 1 << 1, // 0x2
    1523    ImDrawCornerFlags_BotLeft = 1 << 2, // 0x4
    1524    ImDrawCornerFlags_BotRight = 1 << 3, // 0x8
    1525    ImDrawCornerFlags_Top = ImDrawCornerFlags_TopLeft | ImDrawCornerFlags_TopRight,   // 0x3
    1526    ImDrawCornerFlags_Bot = ImDrawCornerFlags_BotLeft | ImDrawCornerFlags_BotRight,   // 0xC
    1527    ImDrawCornerFlags_Left = ImDrawCornerFlags_TopLeft | ImDrawCornerFlags_BotLeft,    // 0x5
    1528    ImDrawCornerFlags_Right = ImDrawCornerFlags_TopRight | ImDrawCornerFlags_BotRight,  // 0xA
    1529    ImDrawCornerFlags_All = 0xF     // In your function calls you may use ~0 (= all bits sets) instead of ImDrawCornerFlags_All, as a convenience
    1530 };
    1531 
     2064    ImDrawCornerFlags_None      = 0,
     2065    ImDrawCornerFlags_TopLeft   = 1 << 0, // 0x1
     2066    ImDrawCornerFlags_TopRight  = 1 << 1, // 0x2
     2067    ImDrawCornerFlags_BotLeft   = 1 << 2, // 0x4
     2068    ImDrawCornerFlags_BotRight  = 1 << 3, // 0x8
     2069    ImDrawCornerFlags_Top       = ImDrawCornerFlags_TopLeft | ImDrawCornerFlags_TopRight,   // 0x3
     2070    ImDrawCornerFlags_Bot       = ImDrawCornerFlags_BotLeft | ImDrawCornerFlags_BotRight,   // 0xC
     2071    ImDrawCornerFlags_Left      = ImDrawCornerFlags_TopLeft | ImDrawCornerFlags_BotLeft,    // 0x5
     2072    ImDrawCornerFlags_Right     = ImDrawCornerFlags_TopRight | ImDrawCornerFlags_BotRight,  // 0xA
     2073    ImDrawCornerFlags_All       = 0xF     // In your function calls you may use ~0 (= all bits sets) instead of ImDrawCornerFlags_All, as a convenience
     2074};
     2075
     2076// Flags for ImDrawList. Those are set automatically by ImGui:: functions from ImGuiIO settings, and generally not manipulated directly.
     2077// It is however possible to temporarily alter flags between calls to ImDrawList:: functions.
    15322078enum ImDrawListFlags_
    15332079{
    1534    ImDrawListFlags_AntiAliasedLines = 1 << 0,
    1535    ImDrawListFlags_AntiAliasedFill = 1 << 1
     2080    ImDrawListFlags_None                    = 0,
     2081    ImDrawListFlags_AntiAliasedLines        = 1 << 0,  // Enable anti-aliased lines/borders (*2 the number of triangles for 1.0f wide line or lines thin enough to be drawn using textures, otherwise *3 the number of triangles)
     2082    ImDrawListFlags_AntiAliasedLinesUseTex  = 1 << 1,  // Enable anti-aliased lines/borders using textures when possible. Require back-end to render with bilinear filtering.
     2083    ImDrawListFlags_AntiAliasedFill         = 1 << 2,  // Enable anti-aliased edge around filled shapes (rounded rectangles, circles).
     2084    ImDrawListFlags_AllowVtxOffset          = 1 << 3   // Can emit 'VtxOffset > 0' to allow large meshes. Set when 'ImGuiBackendFlags_RendererHasVtxOffset' is enabled.
    15362085};
    15372086
    15382087// Draw command list
    1539 // This is the low-level list of polygons that ImGui functions are filling. At the end of the frame, all command lists are passed to your ImGuiIO::RenderDrawListFn function for rendering.
    1540 // Each ImGui window contains its own ImDrawList. You can use ImGui::GetWindowDrawList() to access the current window draw list and draw custom primitives.
     2088// This is the low-level list of polygons that ImGui:: functions are filling. At the end of the frame,
     2089// all command lists are passed to your ImGuiIO::RenderDrawListFn function for rendering.
     2090// Each dear imgui window contains its own ImDrawList. You can use ImGui::GetWindowDrawList() to
     2091// access the current window draw list and draw custom primitives.
    15412092// You can interleave normal ImGui:: calls and adding primitives to the current draw list.
    1542 // All positions are generally in pixel coordinates (top-left at (0,0), bottom-right at io.DisplaySize), however you are totally free to apply whatever transformation matrix to want to the data (if you apply such transformation you'll want to apply it to ClipRect as well)
     2093// All positions are generally in pixel coordinates (top-left at (0,0), bottom-right at io.DisplaySize), but you are totally free to apply whatever transformation matrix to want to the data (if you apply such transformation you'll want to apply it to ClipRect as well)
    15432094// Important: Primitives are always added to the list and not culled (culling is done at higher-level by ImGui:: functions), if you use this API a lot consider coarse culling your drawn objects.
    15442095struct ImDrawList
    15452096{
    1546    // This is what you have to render
    1547    ImVector<ImDrawCmd>     CmdBuffer;          // Draw commands. Typically 1 command = 1 GPU draw call, unless the command is a callback.
    1548    ImVector<ImDrawIdx>     IdxBuffer;          // Index buffer. Each command consume ImDrawCmd::ElemCount of those
    1549    ImVector<ImDrawVert>    VtxBuffer;          // Vertex buffer.
    1550    ImDrawListFlags         Flags;              // Flags, you may poke into these to adjust anti-aliasing settings per-primitive.
    1551 
    1552                                                // [Internal, used while building lists]
    1553    const ImDrawListSharedData* _Data;          // Pointer to shared draw data (you can use ImGui::GetDrawListSharedData() to get the one from current ImGui context)
    1554    const char*             _OwnerName;         // Pointer to owner window's name for debugging
    1555    unsigned int            _VtxCurrentIdx;     // [Internal] == VtxBuffer.Size
    1556    ImDrawVert*             _VtxWritePtr;       // [Internal] point within VtxBuffer.Data after each add command (to avoid using the ImVector<> operators too much)
    1557    ImDrawIdx*              _IdxWritePtr;       // [Internal] point within IdxBuffer.Data after each add command (to avoid using the ImVector<> operators too much)
    1558    ImVector<ImVec4>        _ClipRectStack;     // [Internal]
    1559    ImVector<ImTextureID>   _TextureIdStack;    // [Internal]
    1560    ImVector<ImVec2>        _Path;              // [Internal] current path building
    1561    int                     _ChannelsCurrent;   // [Internal] current channel number (0)
    1562    int                     _ChannelsCount;     // [Internal] number of active channels (1+)
    1563    ImVector<ImDrawChannel> _Channels;          // [Internal] draw channels for columns API (not resized down so _ChannelsCount may be smaller than _Channels.Size)
    1564 
    1565                                                // If you want to create ImDrawList instances, pass them ImGui::GetDrawListSharedData() or create and use your own ImDrawListSharedData (so you can use ImDrawList without ImGui)
    1566    ImDrawList(const ImDrawListSharedData* shared_data) { _Data = shared_data; _OwnerName = NULL; Clear(); }
    1567    ~ImDrawList() { ClearFreeMemory(); }
    1568    IMGUI_API void  PushClipRect(ImVec2 clip_rect_min, ImVec2 clip_rect_max, bool intersect_with_current_clip_rect = false);  // Render-level scissoring. This is passed down to your render function but not used for CPU-side coarse clipping. Prefer using higher-level ImGui::PushClipRect() to affect logic (hit-testing and widget culling)
    1569    IMGUI_API void  PushClipRectFullScreen();
    1570    IMGUI_API void  PopClipRect();
    1571    IMGUI_API void  PushTextureID(ImTextureID texture_id);
    1572    IMGUI_API void  PopTextureID();
    1573    inline ImVec2   GetClipRectMin() const { const ImVec4& cr = _ClipRectStack.back(); return ImVec2(cr.x, cr.y); }
    1574    inline ImVec2   GetClipRectMax() const { const ImVec4& cr = _ClipRectStack.back(); return ImVec2(cr.z, cr.w); }
    1575 
    1576    // Primitives
    1577    IMGUI_API void  AddLine(const ImVec2& a, const ImVec2& b, ImU32 col, float thickness = 1.0f);
    1578    IMGUI_API void  AddRect(const ImVec2& a, const ImVec2& b, ImU32 col, float rounding = 0.0f, int rounding_corners_flags = ImDrawCornerFlags_All, float thickness = 1.0f);   // a: upper-left, b: lower-right, rounding_corners_flags: 4-bits corresponding to which corner to round
    1579    IMGUI_API void  AddRectFilled(const ImVec2& a, const ImVec2& b, ImU32 col, float rounding = 0.0f, int rounding_corners_flags = ImDrawCornerFlags_All);                     // a: upper-left, b: lower-right
    1580    IMGUI_API void  AddRectFilledMultiColor(const ImVec2& a, const ImVec2& b, ImU32 col_upr_left, ImU32 col_upr_right, ImU32 col_bot_right, ImU32 col_bot_left);
    1581    IMGUI_API void  AddQuad(const ImVec2& a, const ImVec2& b, const ImVec2& c, const ImVec2& d, ImU32 col, float thickness = 1.0f);
    1582    IMGUI_API void  AddQuadFilled(const ImVec2& a, const ImVec2& b, const ImVec2& c, const ImVec2& d, ImU32 col);
    1583    IMGUI_API void  AddTriangle(const ImVec2& a, const ImVec2& b, const ImVec2& c, ImU32 col, float thickness = 1.0f);
    1584    IMGUI_API void  AddTriangleFilled(const ImVec2& a, const ImVec2& b, const ImVec2& c, ImU32 col);
    1585    IMGUI_API void  AddCircle(const ImVec2& centre, float radius, ImU32 col, int num_segments = 12, float thickness = 1.0f);
    1586    IMGUI_API void  AddCircleFilled(const ImVec2& centre, float radius, ImU32 col, int num_segments = 12);
    1587    IMGUI_API void  AddText(const ImVec2& pos, ImU32 col, const char* text_begin, const char* text_end = NULL);
    1588    IMGUI_API void  AddText(const ImFont* font, float font_size, const ImVec2& pos, ImU32 col, const char* text_begin, const char* text_end = NULL, float wrap_width = 0.0f, const ImVec4* cpu_fine_clip_rect = NULL);
    1589    IMGUI_API void  AddImage(ImTextureID user_texture_id, const ImVec2& a, const ImVec2& b, const ImVec2& uv_a = ImVec2(0, 0), const ImVec2& uv_b = ImVec2(1, 1), ImU32 col = 0xFFFFFFFF);
    1590    IMGUI_API void  AddImageQuad(ImTextureID user_texture_id, const ImVec2& a, const ImVec2& b, const ImVec2& c, const ImVec2& d, const ImVec2& uv_a = ImVec2(0, 0), const ImVec2& uv_b = ImVec2(1, 0), const ImVec2& uv_c = ImVec2(1, 1), const ImVec2& uv_d = ImVec2(0, 1), ImU32 col = 0xFFFFFFFF);
    1591    IMGUI_API void  AddImageRounded(ImTextureID user_texture_id, const ImVec2& a, const ImVec2& b, const ImVec2& uv_a, const ImVec2& uv_b, ImU32 col, float rounding, int rounding_corners = ImDrawCornerFlags_All);
    1592    IMGUI_API void  AddPolyline(const ImVec2* points, const int num_points, ImU32 col, bool closed, float thickness);
    1593    IMGUI_API void  AddConvexPolyFilled(const ImVec2* points, const int num_points, ImU32 col);
    1594    IMGUI_API void  AddBezierCurve(const ImVec2& pos0, const ImVec2& cp0, const ImVec2& cp1, const ImVec2& pos1, ImU32 col, float thickness, int num_segments = 0);
    1595 
    1596    // Stateful path API, add points then finish with PathFill() or PathStroke()
    1597    inline    void  PathClear() { _Path.resize(0); }
    1598    inline    void  PathLineTo(const ImVec2& pos) { _Path.push_back(pos); }
    1599    inline    void  PathLineToMergeDuplicate(const ImVec2& pos) { if (_Path.Size == 0 || memcmp(&_Path[_Path.Size - 1], &pos, 8) != 0) _Path.push_back(pos); }
    1600    inline    void  PathFillConvex(ImU32 col) { AddConvexPolyFilled(_Path.Data, _Path.Size, col); PathClear(); }
    1601    inline    void  PathStroke(ImU32 col, bool closed, float thickness = 1.0f) { AddPolyline(_Path.Data, _Path.Size, col, closed, thickness); PathClear(); }
    1602    IMGUI_API void  PathArcTo(const ImVec2& centre, float radius, float a_min, float a_max, int num_segments = 10);
    1603    IMGUI_API void  PathArcToFast(const ImVec2& centre, float radius, int a_min_of_12, int a_max_of_12);                                // Use precomputed angles for a 12 steps circle
    1604    IMGUI_API void  PathBezierCurveTo(const ImVec2& p1, const ImVec2& p2, const ImVec2& p3, int num_segments = 0);
    1605    IMGUI_API void  PathRect(const ImVec2& rect_min, const ImVec2& rect_max, float rounding = 0.0f, int rounding_corners_flags = ImDrawCornerFlags_All);
    1606 
    1607    // Channels
    1608    // - Use to simulate layers. By switching channels to can render out-of-order (e.g. submit foreground primitives before background primitives)
    1609    // - Use to minimize draw calls (e.g. if going back-and-forth between multiple non-overlapping clipping rectangles, prefer to append into separate channels then merge at the end)
    1610    IMGUI_API void  ChannelsSplit(int channels_count);
    1611    IMGUI_API void  ChannelsMerge();
    1612    IMGUI_API void  ChannelsSetCurrent(int channel_index);
    1613 
    1614    // Advanced
    1615    IMGUI_API void  AddCallback(ImDrawCallback callback, void* callback_data);  // Your rendering function must check for 'UserCallback' in ImDrawCmd and call the function instead of rendering triangles.
    1616    IMGUI_API void  AddDrawCmd();                                               // This is useful if you need to forcefully create a new draw call (to allow for dependent rendering / blending). Otherwise primitives are merged into the same draw-call as much as possible
    1617    IMGUI_API ImDrawList* CloneOutput() const;                                  // Create a clone of the CmdBuffer/IdxBuffer/VtxBuffer.
    1618 
    1619                                                                                // Internal helpers
    1620                                                                                // NB: all primitives needs to be reserved via PrimReserve() beforehand!
    1621    IMGUI_API void  Clear();
    1622    IMGUI_API void  ClearFreeMemory();
    1623    IMGUI_API void  PrimReserve(int idx_count, int vtx_count);
    1624    IMGUI_API void  PrimRect(const ImVec2& a, const ImVec2& b, ImU32 col);      // Axis aligned rectangle (composed of two triangles)
    1625    IMGUI_API void  PrimRectUV(const ImVec2& a, const ImVec2& b, const ImVec2& uv_a, const ImVec2& uv_b, ImU32 col);
    1626    IMGUI_API void  PrimQuadUV(const ImVec2& a, const ImVec2& b, const ImVec2& c, const ImVec2& d, const ImVec2& uv_a, const ImVec2& uv_b, const ImVec2& uv_c, const ImVec2& uv_d, ImU32 col);
    1627    inline    void  PrimWriteVtx(const ImVec2& pos, const ImVec2& uv, ImU32 col) { _VtxWritePtr->pos = pos; _VtxWritePtr->uv = uv; _VtxWritePtr->col = col; _VtxWritePtr++; _VtxCurrentIdx++; }
    1628    inline    void  PrimWriteIdx(ImDrawIdx idx) { *_IdxWritePtr = idx; _IdxWritePtr++; }
    1629    inline    void  PrimVtx(const ImVec2& pos, const ImVec2& uv, ImU32 col) { PrimWriteIdx((ImDrawIdx)_VtxCurrentIdx); PrimWriteVtx(pos, uv, col); }
    1630    IMGUI_API void  UpdateClipRect();
    1631    IMGUI_API void  UpdateTextureID();
    1632 };
    1633 
    1634 // All draw data to render an ImGui frame
    1635 // (NB: the style and the naming convention here is a little inconsistent but we preserve them for backward compatibility purpose)
     2097    // This is what you have to render
     2098    ImVector<ImDrawCmd>     CmdBuffer;          // Draw commands. Typically 1 command = 1 GPU draw call, unless the command is a callback.
     2099    ImVector<ImDrawIdx>     IdxBuffer;          // Index buffer. Each command consume ImDrawCmd::ElemCount of those
     2100    ImVector<ImDrawVert>    VtxBuffer;          // Vertex buffer.
     2101    ImDrawListFlags         Flags;              // Flags, you may poke into these to adjust anti-aliasing settings per-primitive.
     2102
     2103    // [Internal, used while building lists]
     2104    const ImDrawListSharedData* _Data;          // Pointer to shared draw data (you can use ImGui::GetDrawListSharedData() to get the one from current ImGui context)
     2105    const char*             _OwnerName;         // Pointer to owner window's name for debugging
     2106    unsigned int            _VtxCurrentIdx;     // [Internal] Generally == VtxBuffer.Size unless we are past 64K vertices, in which case this gets reset to 0.
     2107    ImDrawVert*             _VtxWritePtr;       // [Internal] point within VtxBuffer.Data after each add command (to avoid using the ImVector<> operators too much)
     2108    ImDrawIdx*              _IdxWritePtr;       // [Internal] point within IdxBuffer.Data after each add command (to avoid using the ImVector<> operators too much)
     2109    ImVector<ImVec4>        _ClipRectStack;     // [Internal]
     2110    ImVector<ImTextureID>   _TextureIdStack;    // [Internal]
     2111    ImVector<ImVec2>        _Path;              // [Internal] current path building
     2112    ImDrawCmd               _CmdHeader;         // [Internal] Template of active commands. Fields should match those of CmdBuffer.back().
     2113    ImDrawListSplitter      _Splitter;          // [Internal] for channels api (note: prefer using your own persistent instance of ImDrawListSplitter!)
     2114
     2115    // If you want to create ImDrawList instances, pass them ImGui::GetDrawListSharedData() or create and use your own ImDrawListSharedData (so you can use ImDrawList without ImGui)
     2116    ImDrawList(const ImDrawListSharedData* shared_data) { _Data = shared_data; Flags = ImDrawListFlags_None; _VtxCurrentIdx = 0; _VtxWritePtr = NULL; _IdxWritePtr = NULL; _OwnerName = NULL; }
     2117
     2118    ~ImDrawList() { _ClearFreeMemory(); }
     2119    IMGUI_API void  PushClipRect(ImVec2 clip_rect_min, ImVec2 clip_rect_max, bool intersect_with_current_clip_rect = false);  // Render-level scissoring. This is passed down to your render function but not used for CPU-side coarse clipping. Prefer using higher-level ImGui::PushClipRect() to affect logic (hit-testing and widget culling)
     2120    IMGUI_API void  PushClipRectFullScreen();
     2121    IMGUI_API void  PopClipRect();
     2122    IMGUI_API void  PushTextureID(ImTextureID texture_id);
     2123    IMGUI_API void  PopTextureID();
     2124    inline ImVec2   GetClipRectMin() const { const ImVec4& cr = _ClipRectStack.back(); return ImVec2(cr.x, cr.y); }
     2125    inline ImVec2   GetClipRectMax() const { const ImVec4& cr = _ClipRectStack.back(); return ImVec2(cr.z, cr.w); }
     2126
     2127    // Primitives
     2128    // - For rectangular primitives, "p_min" and "p_max" represent the upper-left and lower-right corners.
     2129    // - For circle primitives, use "num_segments == 0" to automatically calculate tessellation (preferred).
     2130    //   In older versions (until Dear ImGui 1.77) the AddCircle functions defaulted to num_segments == 12.
     2131    //   In future versions we will use textures to provide cheaper and higher-quality circles.
     2132    //   Use AddNgon() and AddNgonFilled() functions if you need to guaranteed a specific number of sides.
     2133    IMGUI_API void  AddLine(const ImVec2& p1, const ImVec2& p2, ImU32 col, float thickness = 1.0f);
     2134    IMGUI_API void  AddRect(const ImVec2& p_min, const ImVec2& p_max, ImU32 col, float rounding = 0.0f, ImDrawCornerFlags rounding_corners = ImDrawCornerFlags_All, float thickness = 1.0f);   // a: upper-left, b: lower-right (== upper-left + size), rounding_corners_flags: 4 bits corresponding to which corner to round
     2135    IMGUI_API void  AddRectFilled(const ImVec2& p_min, const ImVec2& p_max, ImU32 col, float rounding = 0.0f, ImDrawCornerFlags rounding_corners = ImDrawCornerFlags_All);                     // a: upper-left, b: lower-right (== upper-left + size)
     2136    IMGUI_API void  AddRectFilledMultiColor(const ImVec2& p_min, const ImVec2& p_max, ImU32 col_upr_left, ImU32 col_upr_right, ImU32 col_bot_right, ImU32 col_bot_left);
     2137    IMGUI_API void  AddQuad(const ImVec2& p1, const ImVec2& p2, const ImVec2& p3, const ImVec2& p4, ImU32 col, float thickness = 1.0f);
     2138    IMGUI_API void  AddQuadFilled(const ImVec2& p1, const ImVec2& p2, const ImVec2& p3, const ImVec2& p4, ImU32 col);
     2139    IMGUI_API void  AddTriangle(const ImVec2& p1, const ImVec2& p2, const ImVec2& p3, ImU32 col, float thickness = 1.0f);
     2140    IMGUI_API void  AddTriangleFilled(const ImVec2& p1, const ImVec2& p2, const ImVec2& p3, ImU32 col);
     2141    IMGUI_API void  AddCircle(const ImVec2& center, float radius, ImU32 col, int num_segments = 0, float thickness = 1.0f);
     2142    IMGUI_API void  AddCircleFilled(const ImVec2& center, float radius, ImU32 col, int num_segments = 0);
     2143    IMGUI_API void  AddNgon(const ImVec2& center, float radius, ImU32 col, int num_segments, float thickness = 1.0f);
     2144    IMGUI_API void  AddNgonFilled(const ImVec2& center, float radius, ImU32 col, int num_segments);
     2145    IMGUI_API void  AddText(const ImVec2& pos, ImU32 col, const char* text_begin, const char* text_end = NULL);
     2146    IMGUI_API void  AddText(const ImFont* font, float font_size, const ImVec2& pos, ImU32 col, const char* text_begin, const char* text_end = NULL, float wrap_width = 0.0f, const ImVec4* cpu_fine_clip_rect = NULL);
     2147    IMGUI_API void  AddPolyline(const ImVec2* points, int num_points, ImU32 col, bool closed, float thickness);
     2148    IMGUI_API void  AddConvexPolyFilled(const ImVec2* points, int num_points, ImU32 col); // Note: Anti-aliased filling requires points to be in clockwise order.
     2149    IMGUI_API void  AddBezierCurve(const ImVec2& p1, const ImVec2& p2, const ImVec2& p3, const ImVec2& p4, ImU32 col, float thickness, int num_segments = 0);
     2150
     2151    // Image primitives
     2152    // - Read FAQ to understand what ImTextureID is.
     2153    // - "p_min" and "p_max" represent the upper-left and lower-right corners of the rectangle.
     2154    // - "uv_min" and "uv_max" represent the normalized texture coordinates to use for those corners. Using (0,0)->(1,1) texture coordinates will generally display the entire texture.
     2155    IMGUI_API void  AddImage(ImTextureID user_texture_id, const ImVec2& p_min, const ImVec2& p_max, const ImVec2& uv_min = ImVec2(0, 0), const ImVec2& uv_max = ImVec2(1, 1), ImU32 col = IM_COL32_WHITE);
     2156    IMGUI_API void  AddImageQuad(ImTextureID user_texture_id, const ImVec2& p1, const ImVec2& p2, const ImVec2& p3, const ImVec2& p4, const ImVec2& uv1 = ImVec2(0, 0), const ImVec2& uv2 = ImVec2(1, 0), const ImVec2& uv3 = ImVec2(1, 1), const ImVec2& uv4 = ImVec2(0, 1), ImU32 col = IM_COL32_WHITE);
     2157    IMGUI_API void  AddImageRounded(ImTextureID user_texture_id, const ImVec2& p_min, const ImVec2& p_max, const ImVec2& uv_min, const ImVec2& uv_max, ImU32 col, float rounding, ImDrawCornerFlags rounding_corners = ImDrawCornerFlags_All);
     2158
     2159    // Stateful path API, add points then finish with PathFillConvex() or PathStroke()
     2160    inline    void  PathClear()                                                 { _Path.Size = 0; }
     2161    inline    void  PathLineTo(const ImVec2& pos)                               { _Path.push_back(pos); }
     2162    inline    void  PathLineToMergeDuplicate(const ImVec2& pos)                 { if (_Path.Size == 0 || memcmp(&_Path.Data[_Path.Size - 1], &pos, 8) != 0) _Path.push_back(pos); }
     2163    inline    void  PathFillConvex(ImU32 col)                                   { AddConvexPolyFilled(_Path.Data, _Path.Size, col); _Path.Size = 0; }  // Note: Anti-aliased filling requires points to be in clockwise order.
     2164    inline    void  PathStroke(ImU32 col, bool closed, float thickness = 1.0f)  { AddPolyline(_Path.Data, _Path.Size, col, closed, thickness); _Path.Size = 0; }
     2165    IMGUI_API void  PathArcTo(const ImVec2& center, float radius, float a_min, float a_max, int num_segments = 10);
     2166    IMGUI_API void  PathArcToFast(const ImVec2& center, float radius, int a_min_of_12, int a_max_of_12);                                            // Use precomputed angles for a 12 steps circle
     2167    IMGUI_API void  PathBezierCurveTo(const ImVec2& p2, const ImVec2& p3, const ImVec2& p4, int num_segments = 0);
     2168    IMGUI_API void  PathRect(const ImVec2& rect_min, const ImVec2& rect_max, float rounding = 0.0f, ImDrawCornerFlags rounding_corners = ImDrawCornerFlags_All);
     2169
     2170    // Advanced
     2171    IMGUI_API void  AddCallback(ImDrawCallback callback, void* callback_data);  // Your rendering function must check for 'UserCallback' in ImDrawCmd and call the function instead of rendering triangles.
     2172    IMGUI_API void  AddDrawCmd();                                               // This is useful if you need to forcefully create a new draw call (to allow for dependent rendering / blending). Otherwise primitives are merged into the same draw-call as much as possible
     2173    IMGUI_API ImDrawList* CloneOutput() const;                                  // Create a clone of the CmdBuffer/IdxBuffer/VtxBuffer.
     2174
     2175    // Advanced: Channels
     2176    // - Use to split render into layers. By switching channels to can render out-of-order (e.g. submit FG primitives before BG primitives)
     2177    // - Use to minimize draw calls (e.g. if going back-and-forth between multiple clipping rectangles, prefer to append into separate channels then merge at the end)
     2178    // - FIXME-OBSOLETE: This API shouldn't have been in ImDrawList in the first place!
     2179    //   Prefer using your own persistent instance of ImDrawListSplitter as you can stack them.
     2180    //   Using the ImDrawList::ChannelsXXXX you cannot stack a split over another.
     2181    inline void     ChannelsSplit(int count)    { _Splitter.Split(this, count); }
     2182    inline void     ChannelsMerge()             { _Splitter.Merge(this); }
     2183    inline void     ChannelsSetCurrent(int n)   { _Splitter.SetCurrentChannel(this, n); }
     2184
     2185    // Advanced: Primitives allocations
     2186    // - We render triangles (three vertices)
     2187    // - All primitives needs to be reserved via PrimReserve() beforehand.
     2188    IMGUI_API void  PrimReserve(int idx_count, int vtx_count);
     2189    IMGUI_API void  PrimUnreserve(int idx_count, int vtx_count);
     2190    IMGUI_API void  PrimRect(const ImVec2& a, const ImVec2& b, ImU32 col);      // Axis aligned rectangle (composed of two triangles)
     2191    IMGUI_API void  PrimRectUV(const ImVec2& a, const ImVec2& b, const ImVec2& uv_a, const ImVec2& uv_b, ImU32 col);
     2192    IMGUI_API void  PrimQuadUV(const ImVec2& a, const ImVec2& b, const ImVec2& c, const ImVec2& d, const ImVec2& uv_a, const ImVec2& uv_b, const ImVec2& uv_c, const ImVec2& uv_d, ImU32 col);
     2193    inline    void  PrimWriteVtx(const ImVec2& pos, const ImVec2& uv, ImU32 col)    { _VtxWritePtr->pos = pos; _VtxWritePtr->uv = uv; _VtxWritePtr->col = col; _VtxWritePtr++; _VtxCurrentIdx++; }
     2194    inline    void  PrimWriteIdx(ImDrawIdx idx)                                     { *_IdxWritePtr = idx; _IdxWritePtr++; }
     2195    inline    void  PrimVtx(const ImVec2& pos, const ImVec2& uv, ImU32 col)         { PrimWriteIdx((ImDrawIdx)_VtxCurrentIdx); PrimWriteVtx(pos, uv, col); } // Write vertex with unique index
     2196
     2197    // [Internal helpers]
     2198    IMGUI_API void  _ResetForNewFrame();
     2199    IMGUI_API void  _ClearFreeMemory();
     2200    IMGUI_API void  _PopUnusedDrawCmd();
     2201    IMGUI_API void  _OnChangedClipRect();
     2202    IMGUI_API void  _OnChangedTextureID();
     2203    IMGUI_API void  _OnChangedVtxOffset();
     2204};
     2205
     2206// All draw data to render a Dear ImGui frame
     2207// (NB: the style and the naming convention here is a little inconsistent, we currently preserve them for backward compatibility purpose,
     2208// as this is one of the oldest structure exposed by the library! Basically, ImDrawList == CmdList)
    16362209struct ImDrawData
    16372210{
    1638    bool            Valid;                  // Only valid after Render() is called and before the next NewFrame() is called.
    1639    ImDrawList**    CmdLists;               // Array of ImDrawList* to render. The ImDrawList are owned by ImGuiContext and only pointed to from here.
    1640    int             CmdListsCount;          // Number of ImDrawList* to render
    1641    int             TotalIdxCount;          // For convenience, sum of all ImDrawList's IdxBuffer.Size
    1642    int             TotalVtxCount;          // For convenience, sum of all ImDrawList's VtxBuffer.Size
    1643 
    1644                                            // Functions
    1645    ImDrawData() { Valid = false; Clear(); }
    1646    ~ImDrawData() { Clear(); }
    1647    void Clear() { Valid = false; CmdLists = NULL; CmdListsCount = TotalVtxCount = TotalIdxCount = 0; } // The ImDrawList are owned by ImGuiContext!
    1648    IMGUI_API void  DeIndexAllBuffers();                // Helper to convert all buffers from indexed to non-indexed, in case you cannot render indexed. Note: this is slow and most likely a waste of resources. Always prefer indexed rendering!
    1649    IMGUI_API void  ScaleClipRects(const ImVec2& sc);   // Helper to scale the ClipRect field of each ImDrawCmd. Use if your final output buffer is at a different scale than ImGui expects, or if there is a difference between your window resolution and framebuffer resolution.
    1650 };
     2211    bool            Valid;                  // Only valid after Render() is called and before the next NewFrame() is called.
     2212    ImDrawList**    CmdLists;               // Array of ImDrawList* to render. The ImDrawList are owned by ImGuiContext and only pointed to from here.
     2213    int             CmdListsCount;          // Number of ImDrawList* to render
     2214    int             TotalIdxCount;          // For convenience, sum of all ImDrawList's IdxBuffer.Size
     2215    int             TotalVtxCount;          // For convenience, sum of all ImDrawList's VtxBuffer.Size
     2216    ImVec2          DisplayPos;             // Upper-left position of the viewport to render (== upper-left of the orthogonal projection matrix to use)
     2217    ImVec2          DisplaySize;            // Size of the viewport to render (== io.DisplaySize for the main viewport) (DisplayPos + DisplaySize == lower-right of the orthogonal projection matrix to use)
     2218    ImVec2          FramebufferScale;       // Amount of pixels for each unit of DisplaySize. Based on io.DisplayFramebufferScale. Generally (1,1) on normal display, (2,2) on OSX with Retina display.
     2219
     2220    // Functions
     2221    ImDrawData()    { Valid = false; Clear(); }
     2222    ~ImDrawData()   { Clear(); }
     2223    void Clear()    { Valid = false; CmdLists = NULL; CmdListsCount = TotalVtxCount = TotalIdxCount = 0; DisplayPos = DisplaySize = FramebufferScale = ImVec2(0.f, 0.f); } // The ImDrawList are owned by ImGuiContext!
     2224    IMGUI_API void  DeIndexAllBuffers();                    // Helper to convert all buffers from indexed to non-indexed, in case you cannot render indexed. Note: this is slow and most likely a waste of resources. Always prefer indexed rendering!
     2225    IMGUI_API void  ScaleClipRects(const ImVec2& fb_scale); // Helper to scale the ClipRect field of each ImDrawCmd. Use if your final output buffer is at a different scale than Dear ImGui expects, or if there is a difference between your window resolution and framebuffer resolution.
     2226};
     2227
     2228//-----------------------------------------------------------------------------
     2229// Font API (ImFontConfig, ImFontGlyph, ImFontAtlasFlags, ImFontAtlas, ImFontGlyphRangesBuilder, ImFont)
     2230//-----------------------------------------------------------------------------
    16512231
    16522232struct ImFontConfig
    16532233{
    1654    void*           FontData;               //          // TTF/OTF data
    1655    int             FontDataSize;           //          // TTF/OTF data size
    1656    bool            FontDataOwnedByAtlas;   // true     // TTF/OTF data ownership taken by the container ImFontAtlas (will delete memory itself).
    1657    int             FontNo;                 // 0        // Index of font within TTF/OTF file
    1658    float           SizePixels;             //          // Size in pixels for rasterizer.
    1659    int             OversampleH;            // 3        // Rasterize at higher quality for sub-pixel positioning. We don't use sub-pixel positions on the Y axis.
    1660    int             OversampleV;            // 1        // Rasterize at higher quality for sub-pixel positioning. We don't use sub-pixel positions on the Y axis.
    1661    bool            PixelSnapH;             // false    // Align every glyph to pixel boundary. Useful e.g. if you are merging a non-pixel aligned font with the default font. If enabled, you can set OversampleH/V to 1.
    1662    ImVec2          GlyphExtraSpacing;      // 0, 0     // Extra spacing (in pixels) between glyphs. Only X axis is supported for now.
    1663    ImVec2          GlyphOffset;            // 0, 0     // Offset all glyphs from this font input.
    1664    const ImWchar*  GlyphRanges;            // NULL     // Pointer to a user-provided list of Unicode range (2 value per range, values are inclusive, zero-terminated list). THE ARRAY DATA NEEDS TO PERSIST AS LONG AS THE FONT IS ALIVE.
    1665    bool            MergeMode;              // false    // Merge into previous ImFont, so you can combine multiple inputs font into one ImFont (e.g. ASCII font + icons + Japanese glyphs). You may want to use GlyphOffset.y when merge font of different heights.
    1666    unsigned int    RasterizerFlags;        // 0x00     // Settings for custom font rasterizer (e.g. ImGuiFreeType). Leave as zero if you aren't using one.
    1667    float           RasterizerMultiply;     // 1.0f     // Brighten (>1.0f) or darken (<1.0f) font output. Brightening small fonts may be a good workaround to make them more readable.
    1668 
    1669                                            // [Internal]
    1670    char            Name[40];               // Name (strictly to ease debugging)
    1671    ImFont*         DstFont;
    1672 
    1673    IMGUI_API ImFontConfig();
    1674 };
    1675 
     2234    void*           FontData;               //          // TTF/OTF data
     2235    int             FontDataSize;           //          // TTF/OTF data size
     2236    bool            FontDataOwnedByAtlas;   // true     // TTF/OTF data ownership taken by the container ImFontAtlas (will delete memory itself).
     2237    int             FontNo;                 // 0        // Index of font within TTF/OTF file
     2238    float           SizePixels;             //          // Size in pixels for rasterizer (more or less maps to the resulting font height).
     2239    int             OversampleH;            // 3        // Rasterize at higher quality for sub-pixel positioning. Read https://github.com/nothings/stb/blob/master/tests/oversample/README.md for details.
     2240    int             OversampleV;            // 1        // Rasterize at higher quality for sub-pixel positioning. We don't use sub-pixel positions on the Y axis.
     2241    bool            PixelSnapH;             // false    // Align every glyph to pixel boundary. Useful e.g. if you are merging a non-pixel aligned font with the default font. If enabled, you can set OversampleH/V to 1.
     2242    ImVec2          GlyphExtraSpacing;      // 0, 0     // Extra spacing (in pixels) between glyphs. Only X axis is supported for now.
     2243    ImVec2          GlyphOffset;            // 0, 0     // Offset all glyphs from this font input.
     2244    const ImWchar*  GlyphRanges;            // NULL     // Pointer to a user-provided list of Unicode range (2 value per range, values are inclusive, zero-terminated list). THE ARRAY DATA NEEDS TO PERSIST AS LONG AS THE FONT IS ALIVE.
     2245    float           GlyphMinAdvanceX;       // 0        // Minimum AdvanceX for glyphs, set Min to align font icons, set both Min/Max to enforce mono-space font
     2246    float           GlyphMaxAdvanceX;       // FLT_MAX  // Maximum AdvanceX for glyphs
     2247    bool            MergeMode;              // false    // Merge into previous ImFont, so you can combine multiple inputs font into one ImFont (e.g. ASCII font + icons + Japanese glyphs). You may want to use GlyphOffset.y when merge font of different heights.
     2248    unsigned int    RasterizerFlags;        // 0x00     // Settings for custom font rasterizer (e.g. ImGuiFreeType). Leave as zero if you aren't using one.
     2249    float           RasterizerMultiply;     // 1.0f     // Brighten (>1.0f) or darken (<1.0f) font output. Brightening small fonts may be a good workaround to make them more readable.
     2250    ImWchar         EllipsisChar;           // -1       // Explicitly specify unicode codepoint of ellipsis character. When fonts are being merged first specified ellipsis will be used.
     2251
     2252    // [Internal]
     2253    char            Name[40];               // Name (strictly to ease debugging)
     2254    ImFont*         DstFont;
     2255
     2256    IMGUI_API ImFontConfig();
     2257};
     2258
     2259// Hold rendering data for one glyph.
     2260// (Note: some language parsers may fail to convert the 31+1 bitfield members, in this case maybe drop store a single u32 or we can rework this)
    16762261struct ImFontGlyph
    16772262{
    1678    ImWchar         Codepoint;          // 0x0000..0xFFFF
    1679    float           AdvanceX;           // Distance to next character (= data from font + ImFontConfig::GlyphExtraSpacing.x baked in)
    1680    float           X0, Y0, X1, Y1;     // Glyph corners
    1681    float           U0, V0, U1, V1;     // Texture coordinates
    1682 };
    1683 
     2263    unsigned int    Codepoint : 31;     // 0x0000..0xFFFF
     2264    unsigned int    Visible : 1;        // Flag to allow early out when rendering
     2265    float           AdvanceX;           // Distance to next character (= data from font + ImFontConfig::GlyphExtraSpacing.x baked in)
     2266    float           X0, Y0, X1, Y1;     // Glyph corners
     2267    float           U0, V0, U1, V1;     // Texture coordinates
     2268};
     2269
     2270// Helper to build glyph ranges from text/string data. Feed your application strings/characters to it then call BuildRanges().
     2271// This is essentially a tightly packed of vector of 64k booleans = 8KB storage.
     2272struct ImFontGlyphRangesBuilder
     2273{
     2274    ImVector<ImU32> UsedChars;            // Store 1-bit per Unicode code point (0=unused, 1=used)
     2275
     2276    ImFontGlyphRangesBuilder()              { Clear(); }
     2277    inline void     Clear()                 { int size_in_bytes = (IM_UNICODE_CODEPOINT_MAX + 1) / 8; UsedChars.resize(size_in_bytes / (int)sizeof(ImU32)); memset(UsedChars.Data, 0, (size_t)size_in_bytes); }
     2278    inline bool     GetBit(size_t n) const  { int off = (int)(n >> 5); ImU32 mask = 1u << (n & 31); return (UsedChars[off] & mask) != 0; }  // Get bit n in the array
     2279    inline void     SetBit(size_t n)        { int off = (int)(n >> 5); ImU32 mask = 1u << (n & 31); UsedChars[off] |= mask; }               // Set bit n in the array
     2280    inline void     AddChar(ImWchar c)      { SetBit(c); }                      // Add character
     2281    IMGUI_API void  AddText(const char* text, const char* text_end = NULL);     // Add string (each character of the UTF-8 string are added)
     2282    IMGUI_API void  AddRanges(const ImWchar* ranges);                           // Add ranges, e.g. builder.AddRanges(ImFontAtlas::GetGlyphRangesDefault()) to force add all of ASCII/Latin+Ext
     2283    IMGUI_API void  BuildRanges(ImVector<ImWchar>* out_ranges);                 // Output new ranges
     2284};
     2285
     2286// See ImFontAtlas::AddCustomRectXXX functions.
     2287struct ImFontAtlasCustomRect
     2288{
     2289    unsigned short  Width, Height;  // Input    // Desired rectangle dimension
     2290    unsigned short  X, Y;           // Output   // Packed position in Atlas
     2291    unsigned int    GlyphID;        // Input    // For custom font glyphs only (ID < 0x110000)
     2292    float           GlyphAdvanceX;  // Input    // For custom font glyphs only: glyph xadvance
     2293    ImVec2          GlyphOffset;    // Input    // For custom font glyphs only: glyph display offset
     2294    ImFont*         Font;           // Input    // For custom font glyphs only: target font
     2295    ImFontAtlasCustomRect()         { Width = Height = 0; X = Y = 0xFFFF; GlyphID = 0; GlyphAdvanceX = 0.0f; GlyphOffset = ImVec2(0, 0); Font = NULL; }
     2296    bool IsPacked() const           { return X != 0xFFFF; }
     2297};
     2298
     2299// Flags for ImFontAtlas build
    16842300enum ImFontAtlasFlags_
    16852301{
    1686    ImFontAtlasFlags_NoPowerOfTwoHeight = 1 << 0,   // Don't round the height to next power of two
    1687    ImFontAtlasFlags_NoMouseCursors = 1 << 1    // Don't build software mouse cursors into the atlas
    1688 };
    1689 
    1690 // Load and rasterize multiple TTF/OTF fonts into a same texture.
    1691 // Sharing a texture for multiple fonts allows us to reduce the number of draw calls during rendering.
    1692 // We also add custom graphic data into the texture that serves for ImGui.
    1693 //  1. (Optional) Call AddFont*** functions. If you don't call any, the default font will be loaded for you.
    1694 //  2. Call GetTexDataAsAlpha8() or GetTexDataAsRGBA32() to build and retrieve pixels data.
    1695 //  3. Upload the pixels data into a texture within your graphics system.
    1696 //  4. Call SetTexID(my_tex_id); and pass the pointer/identifier to your texture. This value will be passed back to you during rendering to identify the texture.
    1697 // IMPORTANT: If you pass a 'glyph_ranges' array to AddFont*** functions, you need to make sure that your array persist up until the ImFont is build (when calling GetTexData*** or Build()). We only copy the pointer, not the data.
     2302    ImFontAtlasFlags_None               = 0,
     2303    ImFontAtlasFlags_NoPowerOfTwoHeight = 1 << 0,   // Don't round the height to next power of two
     2304    ImFontAtlasFlags_NoMouseCursors     = 1 << 1,   // Don't build software mouse cursors into the atlas (save a little texture memory)
     2305    ImFontAtlasFlags_NoBakedLines       = 1 << 2    // Don't build thick line textures into the atlas (save a little texture memory). The AntiAliasedLinesUseTex features uses them, otherwise they will be rendered using polygons (more expensive for CPU/GPU).
     2306};
     2307
     2308// Load and rasterize multiple TTF/OTF fonts into a same texture. The font atlas will build a single texture holding:
     2309//  - One or more fonts.
     2310//  - Custom graphics data needed to render the shapes needed by Dear ImGui.
     2311//  - Mouse cursor shapes for software cursor rendering (unless setting 'Flags |= ImFontAtlasFlags_NoMouseCursors' in the font atlas).
     2312// It is the user-code responsibility to setup/build the atlas, then upload the pixel data into a texture accessible by your graphics api.
     2313//  - Optionally, call any of the AddFont*** functions. If you don't call any, the default font embedded in the code will be loaded for you.
     2314//  - Call GetTexDataAsAlpha8() or GetTexDataAsRGBA32() to build and retrieve pixels data.
     2315//  - Upload the pixels data into a texture within your graphics system (see imgui_impl_xxxx.cpp examples)
     2316//  - Call SetTexID(my_tex_id); and pass the pointer/identifier to your texture in a format natural to your graphics API.
     2317//    This value will be passed back to you during rendering to identify the texture. Read FAQ entry about ImTextureID for more details.
     2318// Common pitfalls:
     2319// - If you pass a 'glyph_ranges' array to AddFont*** functions, you need to make sure that your array persist up until the
     2320//   atlas is build (when calling GetTexData*** or Build()). We only copy the pointer, not the data.
     2321// - Important: By default, AddFontFromMemoryTTF() takes ownership of the data. Even though we are not writing to it, we will free the pointer on destruction.
     2322//   You can set font_cfg->FontDataOwnedByAtlas=false to keep ownership of your data and it won't be freed,
     2323// - Even though many functions are suffixed with "TTF", OTF data is supported just as well.
     2324// - This is an old API and it is currently awkward for those and and various other reasons! We will address them in the future!
    16982325struct ImFontAtlas
    16992326{
    1700    IMGUI_API ImFontAtlas();
    1701    IMGUI_API ~ImFontAtlas();
    1702    IMGUI_API ImFont*           AddFont(const ImFontConfig* font_cfg);
    1703    IMGUI_API ImFont*           AddFontDefault(const ImFontConfig* font_cfg = NULL);
    1704    IMGUI_API ImFont*           AddFontFromFileTTF(const char* filename, float size_pixels, const ImFontConfig* font_cfg = NULL, const ImWchar* glyph_ranges = NULL);
    1705    IMGUI_API ImFont*           AddFontFromMemoryTTF(void* font_data, int font_size, float size_pixels, const ImFontConfig* font_cfg = NULL, const ImWchar* glyph_ranges = NULL); // Note: Transfer ownership of 'ttf_data' to ImFontAtlas! Will be deleted after Build(). Set font_cfg->FontDataOwnedByAtlas to false to keep ownership.
    1706    IMGUI_API ImFont*           AddFontFromMemoryCompressedTTF(const void* compressed_font_data, int compressed_font_size, float size_pixels, const ImFontConfig* font_cfg = NULL, const ImWchar* glyph_ranges = NULL); // 'compressed_font_data' still owned by caller. Compress with binary_to_compressed_c.cpp.
    1707    IMGUI_API ImFont*           AddFontFromMemoryCompressedBase85TTF(const char* compressed_font_data_base85, float size_pixels, const ImFontConfig* font_cfg = NULL, const ImWchar* glyph_ranges = NULL);              // 'compressed_font_data_base85' still owned by caller. Compress with binary_to_compressed_c.cpp with -base85 parameter.
    1708    IMGUI_API void              ClearInputData();           // Clear input data (all ImFontConfig structures including sizes, TTF data, glyph ranges, etc.) = all the data used to build the texture and fonts.
    1709    IMGUI_API void              ClearTexData();             // Clear output texture data (CPU side). Saves RAM once the texture has been copied to graphics memory.
    1710    IMGUI_API void              ClearFonts();               // Clear output font data (glyphs storage, UV coordinates).
    1711    IMGUI_API void              Clear();                    // Clear all input and output.
    1712 
    1713                                                            // Build atlas, retrieve pixel data.
    1714                                                            // User is in charge of copying the pixels into graphics memory (e.g. create a texture with your engine). Then store your texture handle with SetTexID().
    1715                                                            // RGBA32 format is provided for convenience and compatibility, but note that unless you use CustomRect to draw color data, the RGB pixels emitted from Fonts will all be white (~75% of waste).
    1716                                                            // Pitch = Width * BytesPerPixels
    1717    IMGUI_API bool              Build();                    // Build pixels data. This is called automatically for you by the GetTexData*** functions.
    1718    IMGUI_API void              GetTexDataAsAlpha8(unsigned char** out_pixels, int* out_width, int* out_height, int* out_bytes_per_pixel = NULL);  // 1 byte per-pixel
    1719    IMGUI_API void              GetTexDataAsRGBA32(unsigned char** out_pixels, int* out_width, int* out_height, int* out_bytes_per_pixel = NULL);  // 4 bytes-per-pixel
    1720    void                        SetTexID(ImTextureID id) { TexID = id; }
    1721 
    1722    //-------------------------------------------
    1723    // Glyph Ranges
    1724    //-------------------------------------------
    1725 
    1726    // Helpers to retrieve list of common Unicode ranges (2 value per range, values are inclusive, zero-terminated list)
    1727    // NB: Make sure that your string are UTF-8 and NOT in your local code page. In C++11, you can create UTF-8 string literal using the u8"Hello world" syntax. See FAQ for details.
    1728    IMGUI_API const ImWchar*    GetGlyphRangesDefault();    // Basic Latin, Extended Latin
    1729    IMGUI_API const ImWchar*    GetGlyphRangesKorean();     // Default + Korean characters
    1730    IMGUI_API const ImWchar*    GetGlyphRangesJapanese();   // Default + Hiragana, Katakana, Half-Width, Selection of 1946 Ideographs
    1731    IMGUI_API const ImWchar*    GetGlyphRangesChinese();    // Default + Japanese + full set of about 21000 CJK Unified Ideographs
    1732    IMGUI_API const ImWchar*    GetGlyphRangesCyrillic();   // Default + about 400 Cyrillic characters
    1733    IMGUI_API const ImWchar*    GetGlyphRangesThai();       // Default + Thai characters
    1734 
    1735                                                            // Helpers to build glyph ranges from text data. Feed your application strings/characters to it then call BuildRanges().
    1736    struct GlyphRangesBuilder
    1737    {
    1738       ImVector<unsigned char> UsedChars;  // Store 1-bit per Unicode code point (0=unused, 1=used)
    1739       GlyphRangesBuilder() { UsedChars.resize(0x10000 / 8); memset(UsedChars.Data, 0, 0x10000 / 8); }
    1740       bool           GetBit(int n) { return (UsedChars[n >> 3] & (1 << (n & 7))) != 0; }
    1741       void           SetBit(int n) { UsedChars[n >> 3] |= 1 << (n & 7); }  // Set bit 'c' in the array
    1742       void           AddChar(ImWchar c) { SetBit(c); }                          // Add character
    1743       IMGUI_API void AddText(const char* text, const char* text_end = NULL);      // Add string (each character of the UTF-8 string are added)
    1744       IMGUI_API void AddRanges(const ImWchar* ranges);                            // Add ranges, e.g. builder.AddRanges(ImFontAtlas::GetGlyphRangesDefault) to force add all of ASCII/Latin+Ext
    1745       IMGUI_API void BuildRanges(ImVector<ImWchar>* out_ranges);                  // Output new ranges
    1746    };
    1747 
    1748    //-------------------------------------------
    1749    // Custom Rectangles/Glyphs API
    1750    //-------------------------------------------
    1751 
    1752    // You can request arbitrary rectangles to be packed into the atlas, for your own purposes. After calling Build(), you can query the rectangle position and render your pixels.
    1753    // You can also request your rectangles to be mapped as font glyph (given a font + Unicode point), so you can render e.g. custom colorful icons and use them as regular glyphs.
    1754    struct CustomRect
    1755    {
    1756       unsigned int    ID;             // Input    // User ID. Use <0x10000 to map into a font glyph, >=0x10000 for other/internal/custom texture data.
    1757       unsigned short  Width, Height;  // Input    // Desired rectangle dimension
    1758       unsigned short  X, Y;           // Output   // Packed position in Atlas
    1759       float           GlyphAdvanceX;  // Input    // For custom font glyphs only (ID<0x10000): glyph xadvance
    1760       ImVec2          GlyphOffset;    // Input    // For custom font glyphs only (ID<0x10000): glyph display offset
    1761       ImFont*         Font;           // Input    // For custom font glyphs only (ID<0x10000): target font
    1762       CustomRect() { ID = 0xFFFFFFFF; Width = Height = 0; X = Y = 0xFFFF; GlyphAdvanceX = 0.0f; GlyphOffset = ImVec2(0, 0); Font = NULL; }
    1763       bool IsPacked() const { return X != 0xFFFF; }
    1764    };
    1765 
    1766    IMGUI_API int       AddCustomRectRegular(unsigned int id, int width, int height);                                                                   // Id needs to be >= 0x10000. Id >= 0x80000000 are reserved for ImGui and ImDrawList
    1767    IMGUI_API int       AddCustomRectFontGlyph(ImFont* font, ImWchar id, int width, int height, float advance_x, const ImVec2& offset = ImVec2(0, 0));   // Id needs to be < 0x10000 to register a rectangle to map into a specific font.
    1768    const CustomRect*   GetCustomRectByIndex(int index) const { if (index < 0) return NULL; return &CustomRects[index]; }
    1769 
    1770    // [Internal]
    1771    IMGUI_API void      CalcCustomRectUV(const CustomRect* rect, ImVec2* out_uv_min, ImVec2* out_uv_max);
    1772    IMGUI_API bool      GetMouseCursorTexData(ImGuiMouseCursor cursor, ImVec2* out_offset, ImVec2* out_size, ImVec2 out_uv_border[2], ImVec2 out_uv_fill[2]);
    1773 
    1774    //-------------------------------------------
    1775    // Members
    1776    //-------------------------------------------
    1777 
    1778    ImFontAtlasFlags            Flags;              // Build flags (see ImFontAtlasFlags_)
    1779    ImTextureID                 TexID;              // User data to refer to the texture once it has been uploaded to user's graphic systems. It is passed back to you during rendering via the ImDrawCmd structure.
    1780    int                         TexDesiredWidth;    // Texture width desired by user before Build(). Must be a power-of-two. If have many glyphs your graphics API have texture size restrictions you may want to increase texture width to decrease height.
    1781    int                         TexGlyphPadding;    // Padding between glyphs within texture in pixels. Defaults to 1.
    1782 
    1783                                                    // [Internal]
    1784                                                    // NB: Access texture data via GetTexData*() calls! Which will setup a default font for you.
    1785    unsigned char*              TexPixelsAlpha8;    // 1 component per pixel, each component is unsigned 8-bit. Total size = TexWidth * TexHeight
    1786    unsigned int*               TexPixelsRGBA32;    // 4 component per pixel, each component is unsigned 8-bit. Total size = TexWidth * TexHeight * 4
    1787    int                         TexWidth;           // Texture width calculated during Build().
    1788    int                         TexHeight;          // Texture height calculated during Build().
    1789    ImVec2                      TexUvScale;         // = (1.0f/TexWidth, 1.0f/TexHeight)
    1790    ImVec2                      TexUvWhitePixel;    // Texture coordinates to a white pixel
    1791    ImVector<ImFont*>           Fonts;              // Hold all the fonts returned by AddFont*. Fonts[0] is the default font upon calling ImGui::NewFrame(), use ImGui::PushFont()/PopFont() to change the current font.
    1792    ImVector<CustomRect>        CustomRects;        // Rectangles for packing custom texture data into the atlas.
    1793    ImVector<ImFontConfig>      ConfigData;         // Internal data
    1794    int                         CustomRectIds[1];   // Identifiers of custom texture rectangle used by ImFontAtlas/ImDrawList
     2327    IMGUI_API ImFontAtlas();
     2328    IMGUI_API ~ImFontAtlas();
     2329    IMGUI_API ImFont*           AddFont(const ImFontConfig* font_cfg);
     2330    IMGUI_API ImFont*           AddFontDefault(const ImFontConfig* font_cfg = NULL);
     2331    IMGUI_API ImFont*           AddFontFromFileTTF(const char* filename, float size_pixels, const ImFontConfig* font_cfg = NULL, const ImWchar* glyph_ranges = NULL);
     2332    IMGUI_API ImFont*           AddFontFromMemoryTTF(void* font_data, int font_size, float size_pixels, const ImFontConfig* font_cfg = NULL, const ImWchar* glyph_ranges = NULL); // Note: Transfer ownership of 'ttf_data' to ImFontAtlas! Will be deleted after destruction of the atlas. Set font_cfg->FontDataOwnedByAtlas=false to keep ownership of your data and it won't be freed.
     2333    IMGUI_API ImFont*           AddFontFromMemoryCompressedTTF(const void* compressed_font_data, int compressed_font_size, float size_pixels, const ImFontConfig* font_cfg = NULL, const ImWchar* glyph_ranges = NULL); // 'compressed_font_data' still owned by caller. Compress with binary_to_compressed_c.cpp.
     2334    IMGUI_API ImFont*           AddFontFromMemoryCompressedBase85TTF(const char* compressed_font_data_base85, float size_pixels, const ImFontConfig* font_cfg = NULL, const ImWchar* glyph_ranges = NULL);              // 'compressed_font_data_base85' still owned by caller. Compress with binary_to_compressed_c.cpp with -base85 parameter.
     2335    IMGUI_API void              ClearInputData();           // Clear input data (all ImFontConfig structures including sizes, TTF data, glyph ranges, etc.) = all the data used to build the texture and fonts.
     2336    IMGUI_API void              ClearTexData();             // Clear output texture data (CPU side). Saves RAM once the texture has been copied to graphics memory.
     2337    IMGUI_API void              ClearFonts();               // Clear output font data (glyphs storage, UV coordinates).
     2338    IMGUI_API void              Clear();                    // Clear all input and output.
     2339
     2340    // Build atlas, retrieve pixel data.
     2341    // User is in charge of copying the pixels into graphics memory (e.g. create a texture with your engine). Then store your texture handle with SetTexID().
     2342    // The pitch is always = Width * BytesPerPixels (1 or 4)
     2343    // Building in RGBA32 format is provided for convenience and compatibility, but note that unless you manually manipulate or copy color data into
     2344    // the texture (e.g. when using the AddCustomRect*** api), then the RGB pixels emitted will always be white (~75% of memory/bandwidth waste.
     2345    IMGUI_API bool              Build();                    // Build pixels data. This is called automatically for you by the GetTexData*** functions.
     2346    IMGUI_API void              GetTexDataAsAlpha8(unsigned char** out_pixels, int* out_width, int* out_height, int* out_bytes_per_pixel = NULL);  // 1 byte per-pixel
     2347    IMGUI_API void              GetTexDataAsRGBA32(unsigned char** out_pixels, int* out_width, int* out_height, int* out_bytes_per_pixel = NULL);  // 4 bytes-per-pixel
     2348    bool                        IsBuilt() const             { return Fonts.Size > 0 && (TexPixelsAlpha8 != NULL || TexPixelsRGBA32 != NULL); }
     2349    void                        SetTexID(ImTextureID id)    { TexID = id; }
     2350
     2351    //-------------------------------------------
     2352    // Glyph Ranges
     2353    //-------------------------------------------
     2354
     2355    // Helpers to retrieve list of common Unicode ranges (2 value per range, values are inclusive, zero-terminated list)
     2356    // NB: Make sure that your string are UTF-8 and NOT in your local code page. In C++11, you can create UTF-8 string literal using the u8"Hello world" syntax. See FAQ for details.
     2357    // NB: Consider using ImFontGlyphRangesBuilder to build glyph ranges from textual data.
     2358    IMGUI_API const ImWchar*    GetGlyphRangesDefault();                // Basic Latin, Extended Latin
     2359    IMGUI_API const ImWchar*    GetGlyphRangesKorean();                 // Default + Korean characters
     2360    IMGUI_API const ImWchar*    GetGlyphRangesJapanese();               // Default + Hiragana, Katakana, Half-Width, Selection of 1946 Ideographs
     2361    IMGUI_API const ImWchar*    GetGlyphRangesChineseFull();            // Default + Half-Width + Japanese Hiragana/Katakana + full set of about 21000 CJK Unified Ideographs
     2362    IMGUI_API const ImWchar*    GetGlyphRangesChineseSimplifiedCommon();// Default + Half-Width + Japanese Hiragana/Katakana + set of 2500 CJK Unified Ideographs for common simplified Chinese
     2363    IMGUI_API const ImWchar*    GetGlyphRangesCyrillic();               // Default + about 400 Cyrillic characters
     2364    IMGUI_API const ImWchar*    GetGlyphRangesThai();                   // Default + Thai characters
     2365    IMGUI_API const ImWchar*    GetGlyphRangesVietnamese();             // Default + Vietnamese characters
     2366
     2367    //-------------------------------------------
     2368    // [BETA] Custom Rectangles/Glyphs API
     2369    //-------------------------------------------
     2370
     2371    // You can request arbitrary rectangles to be packed into the atlas, for your own purposes.
     2372    // After calling Build(), you can query the rectangle position and render your pixels.
     2373    // You can also request your rectangles to be mapped as font glyph (given a font + Unicode point),
     2374    // so you can render e.g. custom colorful icons and use them as regular glyphs.
     2375    // Read docs/FONTS.md for more details about using colorful icons.
     2376    // Note: this API may be redesigned later in order to support multi-monitor varying DPI settings.
     2377    IMGUI_API int               AddCustomRectRegular(int width, int height);
     2378    IMGUI_API int               AddCustomRectFontGlyph(ImFont* font, ImWchar id, int width, int height, float advance_x, const ImVec2& offset = ImVec2(0, 0));
     2379    ImFontAtlasCustomRect*      GetCustomRectByIndex(int index) { IM_ASSERT(index >= 0); return &CustomRects[index]; }
     2380
     2381    // [Internal]
     2382    IMGUI_API void              CalcCustomRectUV(const ImFontAtlasCustomRect* rect, ImVec2* out_uv_min, ImVec2* out_uv_max) const;
     2383    IMGUI_API bool              GetMouseCursorTexData(ImGuiMouseCursor cursor, ImVec2* out_offset, ImVec2* out_size, ImVec2 out_uv_border[2], ImVec2 out_uv_fill[2]);
     2384
     2385    //-------------------------------------------
     2386    // Members
     2387    //-------------------------------------------
     2388
     2389    bool                        Locked;             // Marked as Locked by ImGui::NewFrame() so attempt to modify the atlas will assert.
     2390    ImFontAtlasFlags            Flags;              // Build flags (see ImFontAtlasFlags_)
     2391    ImTextureID                 TexID;              // User data to refer to the texture once it has been uploaded to user's graphic systems. It is passed back to you during rendering via the ImDrawCmd structure.
     2392    int                         TexDesiredWidth;    // Texture width desired by user before Build(). Must be a power-of-two. If have many glyphs your graphics API have texture size restrictions you may want to increase texture width to decrease height.
     2393    int                         TexGlyphPadding;    // Padding between glyphs within texture in pixels. Defaults to 1. If your rendering method doesn't rely on bilinear filtering you may set this to 0.
     2394
     2395    // [Internal]
     2396    // NB: Access texture data via GetTexData*() calls! Which will setup a default font for you.
     2397    unsigned char*              TexPixelsAlpha8;    // 1 component per pixel, each component is unsigned 8-bit. Total size = TexWidth * TexHeight
     2398    unsigned int*               TexPixelsRGBA32;    // 4 component per pixel, each component is unsigned 8-bit. Total size = TexWidth * TexHeight * 4
     2399    int                         TexWidth;           // Texture width calculated during Build().
     2400    int                         TexHeight;          // Texture height calculated during Build().
     2401    ImVec2                      TexUvScale;         // = (1.0f/TexWidth, 1.0f/TexHeight)
     2402    ImVec2                      TexUvWhitePixel;    // Texture coordinates to a white pixel
     2403    ImVector<ImFont*>           Fonts;              // Hold all the fonts returned by AddFont*. Fonts[0] is the default font upon calling ImGui::NewFrame(), use ImGui::PushFont()/PopFont() to change the current font.
     2404    ImVector<ImFontAtlasCustomRect> CustomRects;    // Rectangles for packing custom texture data into the atlas.
     2405    ImVector<ImFontConfig>      ConfigData;         // Configuration data
     2406    ImVec4                      TexUvLines[IM_DRAWLIST_TEX_LINES_WIDTH_MAX + 1];  // UVs for baked anti-aliased lines
     2407
     2408    // [Internal] Packing data
     2409    int                         PackIdMouseCursors; // Custom texture rectangle ID for white pixel and mouse cursors
     2410    int                         PackIdLines;        // Custom texture rectangle ID for baked anti-aliased lines
     2411
     2412#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS
     2413    typedef ImFontAtlasCustomRect    CustomRect;         // OBSOLETED in 1.72+
     2414    typedef ImFontGlyphRangesBuilder GlyphRangesBuilder; // OBSOLETED in 1.67+
     2415#endif
    17952416};
    17962417
     
    17992420struct ImFont
    18002421{
    1801    // Members: Hot ~62/78 bytes
    1802    float                       FontSize;           // <user set>   // Height of characters, set during loading (don't change after loading)
    1803    float                       Scale;              // = 1.f        // Base font scale, multiplied by the per-window font scale which you can adjust with SetFontScale()
    1804    ImVec2                      DisplayOffset;      // = (0.f,0.f)  // Offset font rendering by xx pixels
    1805    ImVector<ImFontGlyph>       Glyphs;             //              // All glyphs.
    1806    ImVector<float>             IndexAdvanceX;      //              // Sparse. Glyphs->AdvanceX in a directly indexable way (more cache-friendly, for CalcTextSize functions which are often bottleneck in large UI).
    1807    ImVector<unsigned short>    IndexLookup;        //              // Sparse. Index glyphs by Unicode code-point.
    1808    const ImFontGlyph*          FallbackGlyph;      // == FindGlyph(FontFallbackChar)
    1809    float                       FallbackAdvanceX;   // == FallbackGlyph->AdvanceX
    1810    ImWchar                     FallbackChar;       // = '?'        // Replacement glyph if one isn't found. Only set via SetFallbackChar()
    1811 
    1812                                                    // Members: Cold ~18/26 bytes
    1813    short                       ConfigDataCount;    // ~ 1          // Number of ImFontConfig involved in creating this font. Bigger than 1 when merging multiple font sources into one ImFont.
    1814    ImFontConfig*               ConfigData;         //              // Pointer within ContainerAtlas->ConfigData
    1815    ImFontAtlas*                ContainerAtlas;     //              // What we has been loaded into
    1816    float                       Ascent, Descent;    //              // Ascent: distance from top to bottom of e.g. 'A' [0..FontSize]
    1817    bool                        DirtyLookupTables;
    1818    int                         MetricsTotalSurface;//              // Total surface in pixels to get an idea of the font rasterization/texture cost (not exact, we approximate the cost of padding between glyphs)
    1819 
    1820                                                    // Methods
    1821    IMGUI_API ImFont();
    1822    IMGUI_API ~ImFont();
    1823    IMGUI_API void              ClearOutputData();
    1824    IMGUI_API void              BuildLookupTable();
    1825    IMGUI_API const ImFontGlyph*FindGlyph(ImWchar c) const;
    1826    IMGUI_API const ImFontGlyph*FindGlyphNoFallback(ImWchar c) const;
    1827    IMGUI_API void              SetFallbackChar(ImWchar c);
    1828    float                       GetCharAdvance(ImWchar c) const { return ((int)c < IndexAdvanceX.Size) ? IndexAdvanceX[(int)c] : FallbackAdvanceX; }
    1829    bool                        IsLoaded() const { return ContainerAtlas != NULL; }
    1830    const char*                 GetDebugName() const { return ConfigData ? ConfigData->Name : "<unknown>"; }
    1831 
    1832    // 'max_width' stops rendering after a certain width (could be turned into a 2d size). FLT_MAX to disable.
    1833    // 'wrap_width' enable automatic word-wrapping across multiple lines to fit into given width. 0.0f to disable.
    1834    IMGUI_API ImVec2            CalcTextSizeA(float size, float max_width, float wrap_width, const char* text_begin, const char* text_end = NULL, const char** remaining = NULL) const; // utf8
    1835    IMGUI_API const char*       CalcWordWrapPositionA(float scale, const char* text, const char* text_end, float wrap_width) const;
    1836    IMGUI_API void              RenderChar(ImDrawList* draw_list, float size, ImVec2 pos, ImU32 col, unsigned short c) const;
    1837    IMGUI_API void              RenderText(ImDrawList* draw_list, float size, ImVec2 pos, ImU32 col, const ImVec4& clip_rect, const char* text_begin, const char* text_end, float wrap_width = 0.0f, bool cpu_fine_clip = false) const;
    1838 
    1839    // [Internal]
    1840    IMGUI_API void              GrowIndex(int new_size);
    1841    IMGUI_API void              AddGlyph(ImWchar c, float x0, float y0, float x1, float y1, float u0, float v0, float u1, float v1, float advance_x);
    1842    IMGUI_API void              AddRemapChar(ImWchar dst, ImWchar src, bool overwrite_dst = true); // Makes 'dst' character/glyph points to 'src' character/glyph. Currently needs to be called AFTER fonts have been built.
    1843 
    1844 #ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS
    1845    typedef ImFontGlyph Glyph; // OBSOLETE 1.52+
    1846 #endif
     2422    // Members: Hot ~20/24 bytes (for CalcTextSize)
     2423    ImVector<float>             IndexAdvanceX;      // 12-16 // out //            // Sparse. Glyphs->AdvanceX in a directly indexable way (cache-friendly for CalcTextSize functions which only this this info, and are often bottleneck in large UI).
     2424    float                       FallbackAdvanceX;   // 4     // out // = FallbackGlyph->AdvanceX
     2425    float                       FontSize;           // 4     // in  //            // Height of characters/line, set during loading (don't change after loading)
     2426
     2427    // Members: Hot ~28/40 bytes (for CalcTextSize + render loop)
     2428    ImVector<ImWchar>           IndexLookup;        // 12-16 // out //            // Sparse. Index glyphs by Unicode code-point.
     2429    ImVector<ImFontGlyph>       Glyphs;             // 12-16 // out //            // All glyphs.
     2430    const ImFontGlyph*          FallbackGlyph;      // 4-8   // out // = FindGlyph(FontFallbackChar)
     2431
     2432    // Members: Cold ~32/40 bytes
     2433    ImFontAtlas*                ContainerAtlas;     // 4-8   // out //            // What we has been loaded into
     2434    const ImFontConfig*         ConfigData;         // 4-8   // in  //            // Pointer within ContainerAtlas->ConfigData
     2435    short                       ConfigDataCount;    // 2     // in  // ~ 1        // Number of ImFontConfig involved in creating this font. Bigger than 1 when merging multiple font sources into one ImFont.
     2436    ImWchar                     FallbackChar;       // 2     // in  // = '?'      // Replacement character if a glyph isn't found. Only set via SetFallbackChar()
     2437    ImWchar                     EllipsisChar;       // 2     // out // = -1       // Character used for ellipsis rendering.
     2438    bool                        DirtyLookupTables;  // 1     // out //
     2439    float                       Scale;              // 4     // in  // = 1.f      // Base font scale, multiplied by the per-window font scale which you can adjust with SetWindowFontScale()
     2440    float                       Ascent, Descent;    // 4+4   // out //            // Ascent: distance from top to bottom of e.g. 'A' [0..FontSize]
     2441    int                         MetricsTotalSurface;// 4     // out //            // Total surface in pixels to get an idea of the font rasterization/texture cost (not exact, we approximate the cost of padding between glyphs)
     2442    ImU8                        Used4kPagesMap[(IM_UNICODE_CODEPOINT_MAX+1)/4096/8]; // 2 bytes if ImWchar=ImWchar16, 34 bytes if ImWchar==ImWchar32. Store 1-bit for each block of 4K codepoints that has one active glyph. This is mainly used to facilitate iterations across all used codepoints.
     2443
     2444    // Methods
     2445    IMGUI_API ImFont();
     2446    IMGUI_API ~ImFont();
     2447    IMGUI_API const ImFontGlyph*FindGlyph(ImWchar c) const;
     2448    IMGUI_API const ImFontGlyph*FindGlyphNoFallback(ImWchar c) const;
     2449    float                       GetCharAdvance(ImWchar c) const     { return ((int)c < IndexAdvanceX.Size) ? IndexAdvanceX[(int)c] : FallbackAdvanceX; }
     2450    bool                        IsLoaded() const                    { return ContainerAtlas != NULL; }
     2451    const char*                 GetDebugName() const                { return ConfigData ? ConfigData->Name : "<unknown>"; }
     2452
     2453    // 'max_width' stops rendering after a certain width (could be turned into a 2d size). FLT_MAX to disable.
     2454    // 'wrap_width' enable automatic word-wrapping across multiple lines to fit into given width. 0.0f to disable.
     2455    IMGUI_API ImVec2            CalcTextSizeA(float size, float max_width, float wrap_width, const char* text_begin, const char* text_end = NULL, const char** remaining = NULL) const; // utf8
     2456    IMGUI_API const char*       CalcWordWrapPositionA(float scale, const char* text, const char* text_end, float wrap_width) const;
     2457    IMGUI_API void              RenderChar(ImDrawList* draw_list, float size, ImVec2 pos, ImU32 col, ImWchar c) const;
     2458    IMGUI_API void              RenderText(ImDrawList* draw_list, float size, ImVec2 pos, ImU32 col, const ImVec4& clip_rect, const char* text_begin, const char* text_end, float wrap_width = 0.0f, bool cpu_fine_clip = false) const;
     2459
     2460    // [Internal] Don't use!
     2461    IMGUI_API void              BuildLookupTable();
     2462    IMGUI_API void              ClearOutputData();
     2463    IMGUI_API void              GrowIndex(int new_size);
     2464    IMGUI_API void              AddGlyph(const ImFontConfig* src_cfg, ImWchar c, float x0, float y0, float x1, float y1, float u0, float v0, float u1, float v1, float advance_x);
     2465    IMGUI_API void              AddRemapChar(ImWchar dst, ImWchar src, bool overwrite_dst = true); // Makes 'dst' character/glyph points to 'src' character/glyph. Currently needs to be called AFTER fonts have been built.
     2466    IMGUI_API void              SetGlyphVisible(ImWchar c, bool visible);
     2467    IMGUI_API void              SetFallbackChar(ImWchar c);
     2468    IMGUI_API bool              IsGlyphRangeUnused(unsigned int c_begin, unsigned int c_last);
    18472469};
    18482470
    18492471#if defined(__clang__)
    18502472#pragma clang diagnostic pop
     2473#elif defined(__GNUC__)
     2474#pragma GCC diagnostic pop
    18512475#endif
    18522476
     
    18552479#include "imgui_user.h"
    18562480#endif
     2481
     2482#endif // #ifndef IMGUI_DISABLE
Note: See TracChangeset for help on using the changeset viewer.