| // ImGui library |
| // See .cpp file for commentary. |
| // See ImGui::ShowTestWindow() for sample code. |
| // Read 'Programmer guide' in .cpp for notes on how to setup ImGui in your codebase. |
| // Get latest version at https://github.com/ocornut/imgui |
| |
| #pragma once |
| |
| struct ImDrawList; |
| struct ImBitmapFont; |
| struct ImGuiAabb; |
| struct ImGuiIO; |
| struct ImGuiStorage; |
| struct ImGuiStyle; |
| struct ImGuiWindow; |
| |
| #include "imconfig.h" |
| #include <float.h> // FLT_MAX |
| #include <stdarg.h> // va_list |
| #include <stdlib.h> // NULL |
| |
| #ifndef IM_ASSERT |
| #include <assert.h> |
| #define IM_ASSERT(_EXPR) assert(_EXPR) |
| #endif |
| |
| typedef unsigned int ImU32; |
| typedef ImU32 ImGuiID; |
| typedef int ImGuiCol; // enum ImGuiCol_ |
| typedef int ImGuiKey; // enum ImGuiKey_ |
| typedef int ImGuiColorEditMode; // enum ImGuiColorEditMode_ |
| typedef int ImGuiWindowFlags; // enum ImGuiWindowFlags_ |
| typedef int ImGuiInputTextFlags; // enum ImGuiInputTextFlags_ |
| typedef ImBitmapFont* ImFont; |
| |
| struct ImVec2 |
| { |
| float x, y; |
| ImVec2() {} |
| ImVec2(float _x, float _y) { x = _x; y = _y; } |
| |
| #ifdef IM_VEC2_CLASS_EXTRA |
| IM_VEC2_CLASS_EXTRA |
| #endif |
| }; |
| |
| struct ImVec4 |
| { |
| float x, y, z, w; |
| ImVec4() {} |
| ImVec4(float _x, float _y, float _z, float _w) { x = _x; y = _y; z = _z; w = _w; } |
| |
| #ifdef IM_VEC4_CLASS_EXTRA |
| IM_VEC4_CLASS_EXTRA |
| #endif |
| }; |
| |
| // 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). |
| // this implementation does NOT call c++ constructors! we don't need them! also only provide the minimum functionalities we need. |
| #ifndef ImVector |
| template<typename T> |
| class ImVector |
| { |
| private: |
| size_t _size; |
| size_t _capacity; |
| T* _data; |
| |
| public: |
| typedef T value_type; |
| typedef value_type* iterator; |
| typedef const value_type* const_iterator; |
| |
| ImVector() { _size = _capacity = 0; _data = NULL; } |
| ~ImVector() { if (_data) free(_data); } |
| |
| inline bool empty() const { return _size == 0; } |
| inline size_t size() const { return _size; } |
| inline size_t capacity() const { return _capacity; } |
| |
| inline value_type& at(size_t i) { IM_ASSERT(i < _size); return _data[i]; } |
| inline const value_type& at(size_t i) const { IM_ASSERT(i < _size); return _data[i]; } |
| inline value_type& operator[](size_t i) { IM_ASSERT(i < _size); return _data[i]; } |
| inline const value_type& operator[](size_t i) const { IM_ASSERT(i < _size); return _data[i]; } |
| |
| inline void clear() { if (_data) { _size = _capacity = 0; free(_data); _data = NULL; } } |
| inline iterator begin() { return _data; } |
| inline const iterator begin() const { return _data; } |
| inline iterator end() { return _data + _size; } |
| inline const iterator end() const { return _data + _size; } |
| inline value_type& front() { return at(0); } |
| inline const value_type& front() const { return at(0); } |
| inline value_type& back() { IM_ASSERT(_size > 0); return at(_size-1); } |
| inline const value_type& back() const { IM_ASSERT(_size > 0); return at(_size-1); } |
| inline void swap(ImVector<T>& rhs) { const size_t rhs_size = rhs._size; rhs._size = _size; _size = rhs_size; const size_t rhs_cap = rhs._capacity; rhs._capacity = _capacity; _capacity = rhs_cap; value_type* rhs_data = rhs._data; rhs._data = _data; _data = rhs_data; } |
| |
| inline void reserve(size_t new_capacity) { _data = (value_type*)realloc(_data, new_capacity * sizeof(value_type)); _capacity = new_capacity; } |
| inline void resize(size_t new_size) { if (new_size > _capacity) reserve(new_size); _size = new_size; } |
| |
| inline void push_back(const value_type& v) { if (_size == _capacity) reserve(_capacity ? _capacity * 2 : 4); _data[_size++] = v; } |
| inline void pop_back() { IM_ASSERT(_size > 0); _size--; } |
| |
| inline iterator erase(const_iterator it) { IM_ASSERT(it >= begin() && it < end()); const int off = it - begin(); memmove(_data + off, _data + off + 1, (_size - off - 1) * sizeof(value_type)); _size--; return _data + off; } |
| inline void insert(const_iterator it, const value_type& v) { IM_ASSERT(it >= begin() && it <= end()); const int off = it - begin(); if (_size == _capacity) reserve(_capacity ? _capacity * 2 : 4); if (off < (int)_size) memmove(_data + off + 1, _data + off, (_size - off) * sizeof(value_type)); _data[off] = v; _size++; } |
| }; |
| #endif // #ifndef ImVector |
| |
| // Helpers at bottom of the file: |
| // - if (IMGUI_ONCE_UPON_A_FRAME) // Execute a block of code once per frame only |
| // - struct ImGuiTextFilter // Parse and apply text filter. In format "aaaaa[,bbbb][,ccccc]" |
| // - struct ImGuiTextBuffer // Text buffer for logging/accumulating text |
| // - struct ImGuiStorage // Custom key value storage (if you need to alter open/close states manually) |
| // - struct ImDrawList // Draw command list |
| // - struct ImBitmapFont // Bitmap font loader |
| |
| // ImGui End-user API |
| // In a namespace so that user can add extra functions (e.g. Value() helpers for your vector or common types) |
| namespace ImGui |
| { |
| // Main |
| ImGuiIO& GetIO(); |
| ImGuiStyle& GetStyle(); |
| void NewFrame(); |
| void Render(); |
| void Shutdown(); |
| void ShowUserGuide(); |
| void ShowStyleEditor(ImGuiStyle* ref = NULL); |
| void ShowTestWindow(bool* open = NULL); |
| |
| // Window |
| bool Begin(const char* name = "Debug", bool* open = NULL, ImVec2 size = ImVec2(0,0), float fill_alpha = -1.0f, ImGuiWindowFlags flags = 0); |
| void End(); |
| void BeginChild(const char* str_id, ImVec2 size = ImVec2(0,0), bool border = false, ImGuiWindowFlags extra_flags = 0); |
| void EndChild(); |
| bool GetWindowIsFocused(); |
| float GetWindowWidth(); |
| ImVec2 GetWindowPos(); // you should rarely need/care about the window position, but it can be useful if you want to use your own drawing |
| void SetWindowPos(ImVec2 pos); // unchecked |
| ImVec2 GetWindowSize(); |
| ImVec2 GetWindowContentRegionMin(); |
| ImVec2 GetWindowContentRegionMax(); |
| ImDrawList* GetWindowDrawList(); |
| void SetFontScale(float scale); |
| void SetScrollPosHere(); |
| void SetTreeStateStorage(ImGuiStorage* tree); |
| ImGuiStorage* GetTreeStateStorage(); |
| void PushItemWidth(float item_width); |
| void PopItemWidth(); |
| float GetItemWidth(); |
| void PushAllowKeyboardFocus(bool v); |
| void PopAllowKeyboardFocus(); |
| void PushStyleColor(ImGuiCol idx, ImVec4 col); |
| void PopStyleColor(); |
| |
| // Layout |
| void Separator(); // horizontal line |
| void SameLine(int column_x = 0, int spacing_w = -1); // call between widgets to layout them horizontally |
| void Spacing(); |
| void Columns(int count = 1, const char* id = NULL, bool border=true); // setup number of columns |
| void NextColumn(); // next column |
| float GetColumnOffset(int column_index = -1); |
| void SetColumnOffset(int column_index, float offset); |
| float GetColumnWidth(int column_index = -1); |
| ImVec2 GetCursorPos(); // cursor position relative to window position |
| void SetCursorPos(ImVec2 p); |
| void AlignFirstTextHeightToWidgets(); // call once if the first item on the line is a Text() item and you want to vertically lower it to match higher widgets. |
| float GetTextLineSpacing(); |
| float GetTextLineHeight(); |
| |
| // ID scopes |
| void PushID(const char* str_id); |
| void PushID(const void* ptr_id); |
| void PushID(const int int_id); |
| void PopID(); |
| |
| // Widgets |
| void Text(const char* fmt, ...); |
| void TextV(const char* fmt, va_list args); |
| void TextUnformatted(const char* text, const char* text_end = NULL); // doesn't require null terminated string if 'text_end' is specified. no copy done to any bounded stack buffer, better for long chunks of text. |
| void LabelText(const char* label, const char* fmt, ...); |
| void BulletText(const char* fmt, ...); |
| bool Button(const char* label, ImVec2 size = ImVec2(0,0), bool repeat_when_held = false); |
| bool SmallButton(const char* label); |
| bool CollapsingHeader(const char* label, const char* str_id = NULL, const bool display_frame = true, const bool default_open = false); |
| bool SliderFloat(const char* label, float* v, float v_min, float v_max, const char* display_format = "%.3f", float power = 1.0f); |
| bool SliderFloat3(const char* label, float v[3], float v_min, float v_max, const char* display_format = "%.3f", float power = 1.0f); |
| bool SliderAngle(const char* label, float* v, float v_degrees_min = -360.0f, float v_degrees_max = +360.0f); // *v in radians |
| bool SliderInt(const char* label, int* v, int v_min, int v_max, const char* display_format = "%.0f"); |
| 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)); |
| 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)); |
| void Checkbox(const char* label, bool* v); |
| void CheckboxFlags(const char* label, unsigned int* flags, unsigned int flags_value); |
| bool RadioButton(const char* label, bool active); |
| bool RadioButton(const char* label, int* v, int v_button); |
| bool InputFloat(const char* label, float* v, float step = 0.0f, float step_fast = 0.0f, int decimal_precision = -1); |
| bool InputFloat3(const char* label, float v[3], int decimal_precision = -1); |
| bool InputInt(const char* label, int* v, int step = 1, int step_fast = 100); |
| bool InputText(const char* label, char* buf, size_t buf_size, ImGuiInputTextFlags flags = 0); |
| bool Combo(const char* label, int* current_item, const char** items, int items_count, int popup_height_items = 7); |
| bool Combo(const char* label, int* current_item, const char* items_separated_by_zeros, int popup_height_items = 7); // Separate items with \0, end item-list with \0\0 |
| 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_height_items = 7); |
| bool ColorButton(const ImVec4& col, bool small_height = false, bool outline_border = true); |
| bool ColorEdit3(const char* label, float col[3]); |
| bool ColorEdit4(const char* label, float col[4], bool show_alpha = true); |
| void ColorEditMode(ImGuiColorEditMode mode); |
| bool TreeNode(const char* str_label_id); // if returning 'true' the user is responsible for calling TreePop |
| bool TreeNode(const char* str_id, const char* fmt, ...); // " |
| bool TreeNode(const void* ptr_id, const char* fmt, ...); // " |
| void TreePush(const char* str_id = NULL); // already called by TreeNode(), but you can call Push/Pop yourself for layout purpose |
| void TreePush(const void* ptr_id = NULL); // " |
| void TreePop(); |
| void OpenNextNode(bool open); // force open/close the next TreeNode or CollapsingHeader |
| |
| // Value helper output "name: value" |
| // Freely declare your own in the ImGui namespace. |
| void Value(const char* prefix, bool b); |
| void Value(const char* prefix, int v); |
| void Value(const char* prefix, unsigned int v); |
| void Value(const char* prefix, float v, const char* float_format = NULL); |
| void Color(const char* prefix, const ImVec4& v); |
| void Color(const char* prefix, unsigned int v); |
| |
| // Logging |
| void LogButtons(); |
| void LogToTTY(int max_depth = -1); |
| void LogToFile(int max_depth = -1, const char* filename = NULL); |
| void LogToClipboard(int max_depth = -1); |
| |
| // Utilities |
| void SetTooltip(const char* fmt, ...); // set tooltip under mouse-cursor, typically use with ImGui::IsHovered(). (currently no contention handling, last call win) |
| void SetNewWindowDefaultPos(ImVec2 pos); // set position of window that do |
| bool IsHovered(); // was the last item active area hovered by mouse? |
| bool IsClipped(ImVec2 item_size); // to perform coarse clipping on user's side (as an optimisation) |
| bool IsKeyPressed(int key_index, bool repeat = true); // key_index into the keys_down[512] array, imgui doesn't know the semantic of each entry |
| bool IsMouseClicked(int button, bool repeat = false); |
| bool IsMouseDoubleClicked(int button); |
| bool IsMouseHoveringBox(const ImVec2& box_min, const ImVec2& box_max); |
| ImVec2 GetMousePos(); |
| float GetTime(); |
| int GetFrameCount(); |
| const char* GetStyleColorName(ImGuiCol idx); |
| void GetDefaultFontData(const void** fnt_data, unsigned int* fnt_size, const void** png_data, unsigned int* png_size); |
| |
| }; // namespace ImGui |
| |
| // Flags for ImGui::Begin() |
| enum ImGuiWindowFlags_ |
| { |
| // Default: 0 |
| ImGuiWindowFlags_ShowBorders = 1 << 0, |
| ImGuiWindowFlags_NoTitleBar = 1 << 1, |
| ImGuiWindowFlags_NoResize = 1 << 2, |
| ImGuiWindowFlags_NoMove = 1 << 3, |
| ImGuiWindowFlags_NoScrollbar = 1 << 4, |
| ImGuiWindowFlags_ChildWindow = 1 << 5, // For internal use by BeginChild() |
| ImGuiWindowFlags_ChildWindowAutoFitX = 1 << 6, // For internal use by BeginChild() |
| ImGuiWindowFlags_ChildWindowAutoFitY = 1 << 7, // For internal use by BeginChild() |
| ImGuiWindowFlags_ComboBox = 1 << 8, // For internal use by ComboBox() |
| ImGuiWindowFlags_Tooltip = 1 << 9, // For internal use by Render() when using Tooltip |
| }; |
| |
| // Flags for ImGui::InputText() |
| enum ImGuiInputTextFlags_ |
| { |
| // Default: 0 |
| ImGuiInputTextFlags_CharsDecimal = 1 << 0, |
| ImGuiInputTextFlags_CharsHexadecimal = 1 << 1, |
| ImGuiInputTextFlags_AutoSelectAll = 1 << 2, |
| ImGuiInputTextFlags_AlignCenter = 1 << 3, |
| }; |
| |
| // User fill ImGuiIO.KeyMap[] array with indices into the ImGuiIO.KeysDown[512] array |
| enum ImGuiKey_ |
| { |
| ImGuiKey_Tab, |
| ImGuiKey_LeftArrow, |
| ImGuiKey_RightArrow, |
| ImGuiKey_UpArrow, |
| ImGuiKey_DownArrow, |
| ImGuiKey_Home, |
| ImGuiKey_End, |
| ImGuiKey_Delete, |
| ImGuiKey_Backspace, |
| ImGuiKey_Enter, |
| ImGuiKey_Escape, |
| ImGuiKey_A, // for CTRL+A: select all |
| ImGuiKey_C, // for CTRL+C: copy |
| ImGuiKey_V, // for CTRL+V: paste |
| ImGuiKey_X, // for CTRL+X: cut |
| ImGuiKey_Y, // for CTRL+Y: redo |
| ImGuiKey_Z, // for CTRL+Z: undo |
| ImGuiKey_COUNT, |
| }; |
| |
| enum ImGuiCol_ |
| { |
| ImGuiCol_Text, |
| ImGuiCol_WindowBg, |
| ImGuiCol_Border, |
| ImGuiCol_BorderShadow, |
| ImGuiCol_FrameBg, // Background of checkbox, radio button, plot, slider, text input |
| ImGuiCol_TitleBg, |
| ImGuiCol_TitleBgCollapsed, |
| ImGuiCol_ScrollbarBg, |
| ImGuiCol_ScrollbarGrab, |
| ImGuiCol_ScrollbarGrabHovered, |
| ImGuiCol_ScrollbarGrabActive, |
| ImGuiCol_ComboBg, |
| ImGuiCol_CheckHovered, |
| ImGuiCol_CheckActive, |
| ImGuiCol_SliderGrab, |
| ImGuiCol_SliderGrabActive, |
| ImGuiCol_Button, |
| ImGuiCol_ButtonHovered, |
| ImGuiCol_ButtonActive, |
| ImGuiCol_Header, |
| ImGuiCol_HeaderHovered, |
| ImGuiCol_HeaderActive, |
| ImGuiCol_Column, |
| ImGuiCol_ColumnHovered, |
| ImGuiCol_ColumnActive, |
| ImGuiCol_ResizeGrip, |
| ImGuiCol_ResizeGripHovered, |
| ImGuiCol_ResizeGripActive, |
| ImGuiCol_CloseButton, |
| ImGuiCol_CloseButtonHovered, |
| ImGuiCol_CloseButtonActive, |
| ImGuiCol_PlotLines, |
| ImGuiCol_PlotLinesHovered, |
| ImGuiCol_PlotHistogram, |
| ImGuiCol_PlotHistogramHovered, |
| ImGuiCol_TextSelectedBg, |
| ImGuiCol_TooltipBg, |
| ImGuiCol_COUNT, |
| }; |
| |
| enum ImGuiColorEditMode_ |
| { |
| ImGuiColorEditMode_UserSelect = -1, |
| ImGuiColorEditMode_RGB = 0, |
| ImGuiColorEditMode_HSV = 1, |
| ImGuiColorEditMode_HEX = 2, |
| }; |
| |
| // See constructor for comments of individual fields. |
| struct ImGuiStyle |
| { |
| ImVec2 WindowPadding; |
| ImVec2 WindowMinSize; |
| ImVec2 FramePadding; |
| ImVec2 ItemSpacing; |
| ImVec2 ItemInnerSpacing; |
| ImVec2 TouchExtraPadding; |
| ImVec2 AutoFitPadding; |
| float WindowFillAlphaDefault; |
| float WindowRounding; |
| float TreeNodeSpacing; |
| float ColumnsMinSpacing; |
| float ScrollBarWidth; |
| ImVec4 Colors[ImGuiCol_COUNT]; |
| |
| ImGuiStyle(); |
| }; |
| |
| // This is where your app communicate with ImGui. Call ImGui::GetIO() to access. |
| // Read 'Programmer guide' section in .cpp file for general usage. |
| struct ImGuiIO |
| { |
| // Settings (fill once) // Default value: |
| ImVec2 DisplaySize; // <unset> // Display size, in pixels. For clamping windows positions. |
| float DeltaTime; // = 1.0f/60.0f // Time elapsed since last frame, in seconds. |
| float IniSavingRate; // = 5.0f // Maximum time between saving .ini file, in seconds. Set to a negative value to disable .ini saving. |
| const char* IniFilename; // = "imgui.ini" // Absolute path to .ini file. |
| const char* LogFilename; // = "imgui_log.txt" // Absolute path to .log file. |
| float MouseDoubleClickTime; // = 0.30f // Time for a double-click, in seconds. |
| float MouseDoubleClickMaxDist; // = 6.0f // Distance threshold to stay in to validate a double-click, in pixels. |
| int KeyMap[ImGuiKey_COUNT]; // <unset> // Map of indices into the KeysDown[512] entries array |
| ImFont Font; // <auto> // Gets passed to text functions. Typedef ImFont to the type you want (ImBitmapFont* or your own font). |
| float FontHeight; // <auto> // Default font height, must be the vertical distance between two lines of text, aka == CalcTextSize(" ").y |
| bool FontAllowScaling; // = false // Set to allow scaling text with CTRL+Wheel. |
| float PixelCenterOffset; // = 0.5f // Set to 0.0f for DirectX <= 9, 0.5f for Direct3D >= 10 and OpenGL. |
| |
| // Settings - Functions (fill once) |
| void (*RenderDrawListsFn)(ImDrawList** const draw_lists, int count); // Required |
| const char* (*GetClipboardTextFn)(); // Required for clipboard support |
| void (*SetClipboardTextFn)(const char* text, const char* text_end); // Required for clipboard support (nb- the string is *NOT* zero-terminated at 'text_end') |
| |
| // Input - Fill before calling NewFrame() |
| ImVec2 MousePos; // Mouse position, in pixels (set to -1,-1 if no mouse / on another screen, etc.) |
| bool MouseDown[2]; // Mouse buttons |
| int MouseWheel; // Mouse wheel: -1,0,+1 |
| bool KeyCtrl; // Keyboard modifier pressed: Control |
| bool KeyShift; // Keyboard modifier pressed: Shift |
| bool KeysDown[512]; // Keyboard keys that are pressed (in whatever order user naturally has access to keyboard data) |
| char InputCharacters[16]; // List of characters input (translated by user from keypress+keyboard state). Fill using AddInputCharacter() helper. |
| |
| // Output - Retrieve after calling NewFrame(), you can use them to discard inputs or hide them from the rest of your application |
| bool WantCaptureMouse; // ImGui is using your mouse input (= window is being hovered or widget is active). |
| bool WantCaptureKeyboard; // imGui is using your keyboard input (= widget is active). |
| |
| // Function |
| void AddInputCharacter(char c); // Helper to add a new character into InputCharacters[] |
| |
| // [Internal] ImGui will maintain those fields for you |
| ImVec2 MousePosPrev; |
| ImVec2 MouseDelta; |
| bool MouseClicked[2]; |
| ImVec2 MouseClickedPos[2]; |
| float MouseClickedTime[2]; |
| bool MouseDoubleClicked[2]; |
| float MouseDownTime[2]; |
| float KeysDownTime[512]; |
| |
| ImGuiIO(); |
| }; |
| |
| //----------------------------------------------------------------------------- |
| // Helpers |
| //----------------------------------------------------------------------------- |
| |
| // Helper: execute a block of code once a frame only |
| // Usage: if (IMGUI_ONCE_UPON_A_FRAME) {/*do something once a frame*/) |
| #define IMGUI_ONCE_UPON_A_FRAME static ImGuiOncePerFrame im = ImGuiOncePerFrame() |
| struct ImGuiOncePerFrame |
| { |
| ImGuiOncePerFrame() : LastFrame(-1) {} |
| operator bool() const { return TryIsNewFrame(); } |
| private: |
| mutable int LastFrame; |
| bool TryIsNewFrame() const { const int current_frame = ImGui::GetFrameCount(); if (LastFrame == current_frame) return false; LastFrame = current_frame; return true; } |
| }; |
| |
| // Helper: Parse and apply text filter. In format "aaaaa[,bbbb][,ccccc]" |
| struct ImGuiTextFilter |
| { |
| struct TextRange |
| { |
| const char* b; |
| const char* e; |
| |
| TextRange() { b = e = NULL; } |
| TextRange(const char* _b, const char* _e) { b = _b; e = _e; } |
| const char* begin() const { return b; } |
| const char* end() const { return e; } |
| bool empty() const { return b == e; } |
| char front() const { return *b; } |
| static bool isblank(char c) { return c == ' ' && c == '\t'; } |
| void trim_blanks() { while (b < e && isblank(*b)) b++; while (e > b && isblank(*(e-1))) e--; } |
| void split(char separator, ImVector<TextRange>& out); |
| }; |
| |
| char InputBuf[256]; |
| ImVector<TextRange> Filters; |
| int CountGrep; |
| |
| ImGuiTextFilter(); |
| void Clear() { InputBuf[0] = 0; Build(); } |
| void Draw(const char* label = "Filter (inc,-exc)", float width = -1.0f); // Helper calling InputText+Build |
| bool PassFilter(const char* val) const; |
| bool IsActive() const { return !Filters.empty(); } |
| void Build(); |
| }; |
| |
| // Helper: Text buffer for logging/accumulating text |
| struct ImGuiTextBuffer |
| { |
| ImVector<char> Buf; |
| |
| ImGuiTextBuffer() { Buf.push_back(0); } |
| const char* begin() const { return Buf.begin(); } |
| const char* end() const { return Buf.end()-1; } |
| size_t size() const { return Buf.size()-1; } |
| bool empty() { return Buf.empty(); } |
| void clear() { Buf.clear(); Buf.push_back(0); } |
| void append(const char* fmt, ...); |
| }; |
| |
| // Helper: Key->value storage |
| // - Store collapse state for a tree |
| // - Store color edit options, etc. |
| // Typically you don't have to worry about this since a storage is held within each Window. |
| // Declare your own storage if you want to manipulate the open/close state of a particular sub-tree in your interface. |
| struct ImGuiStorage |
| { |
| struct Pair { ImU32 key; int val; }; |
| ImVector<Pair> Data; |
| |
| void Clear(); |
| int GetInt(ImU32 key, int default_val = 0); |
| void SetInt(ImU32 key, int val); |
| void SetAllInt(int val); |
| |
| int* Find(ImU32 key); |
| void Insert(ImU32 key, int val); |
| }; |
| |
| //----------------------------------------------------------------------------- |
| // Draw List |
| // Hold a series of drawing commands. The user provide a renderer for ImDrawList |
| //----------------------------------------------------------------------------- |
| |
| struct ImDrawCmd |
| { |
| unsigned int vtx_count; |
| ImVec4 clip_rect; |
| }; |
| |
| #ifndef IMDRAW_TEX_UV_FOR_WHITE |
| #define IMDRAW_TEX_UV_FOR_WHITE ImVec2(0,0) |
| #endif |
| |
| // sizeof() == 20 |
| struct ImDrawVert |
| { |
| ImVec2 pos; |
| ImVec2 uv; |
| ImU32 col; |
| }; |
| |
| // Draw command list |
| // User is responsible for providing a renderer for this in ImGuiIO::RenderDrawListFn |
| struct ImDrawList |
| { |
| ImVector<ImDrawCmd> commands; |
| ImVector<ImDrawVert> vtx_buffer; // each command consume ImDrawCmd::vtx_count of those |
| ImVector<ImVec4> clip_rect_stack; // [internal] clip rect stack while building the command-list (so text command can perform clipping early on) |
| ImDrawVert* vtx_write; // [internal] point within vtx_buffer after each add command (to avoid using the ImVector<> operators too much) |
| |
| ImDrawList() { Clear(); } |
| |
| void Clear(); |
| void PushClipRect(const ImVec4& clip_rect); |
| void PopClipRect(); |
| void ReserveVertices(unsigned int vtx_count); |
| void AddVtx(const ImVec2& pos, ImU32 col); |
| void AddVtxLine(const ImVec2& a, const ImVec2& b, ImU32 col); |
| |
| // Primitives |
| void AddLine(const ImVec2& a, const ImVec2& b, ImU32 col); |
| void AddRect(const ImVec2& a, const ImVec2& b, ImU32 col, float rounding = 0.0f, int rounding_corners=0x0F); |
| void AddRectFilled(const ImVec2& a, const ImVec2& b, ImU32 col, float rounding = 0.0f, int rounding_corners=0x0F); |
| void AddTriangleFilled(const ImVec2& a, const ImVec2& b, const ImVec2& c, ImU32 col); |
| void AddCircle(const ImVec2& centre, float radius, ImU32 col, int num_segments = 12); |
| void AddCircleFilled(const ImVec2& centre, float radius, ImU32 col, int num_segments = 12); |
| void AddArc(const ImVec2& center, float rad, ImU32 col, int a_min, int a_max, bool tris=false, const ImVec2& third_point_offset = ImVec2(0,0)); |
| void AddText(ImFont font, float font_size, const ImVec2& pos, ImU32 col, const char* text_begin, const char* text_end); |
| }; |
| |
| // Optional bitmap font data loader & renderer into vertices |
| // #define ImFont to ImBitmapFont to use |
| // Using the .fnt format exported by BMFont |
| // - tool: http://www.angelcode.com/products/bmfont |
| // - file-format: http://www.angelcode.com/products/bmfont/doc/file_format.html |
| // Assume valid file data (won't handle invalid/malicious data) |
| // Handle a subset of parameters. |
| // - kerning pair are not supported (because ImGui code does per-character CalcTextSize calls, need to turn it into something more stateful to allow kerning) |
| struct ImBitmapFont |
| { |
| #pragma pack(push, 1) |
| struct FntInfo |
| { |
| signed short FontSize; |
| unsigned char BitField; // bit 0: smooth, bit 1: unicode, bit 2: italic, bit 3: bold, bit 4: fixedHeight, bits 5-7: reserved |
| unsigned char CharSet; |
| unsigned short StretchH; |
| unsigned char AA; |
| unsigned char PaddingUp, PaddingRight, PaddingDown, PaddingLeft; |
| unsigned char SpacingHoriz, SpacingVert; |
| unsigned char Outline; |
| //char FontName[]; |
| }; |
| |
| struct FntCommon |
| { |
| unsigned short LineHeight; |
| unsigned short Base; |
| unsigned short ScaleW, ScaleH; |
| unsigned short Pages; |
| unsigned char BitField; |
| unsigned char Channels[4]; |
| }; |
| |
| struct FntGlyph |
| { |
| unsigned int Id; |
| unsigned short X, Y; |
| unsigned short Width, Height; |
| signed short XOffset, YOffset; |
| signed short XAdvance; |
| unsigned char Page; |
| unsigned char Channel; |
| }; |
| |
| struct FntKerning |
| { |
| unsigned int IdFirst; |
| unsigned int IdSecond; |
| signed short Amount; |
| }; |
| #pragma pack(pop) |
| |
| unsigned char* Data; // Raw data, content of .fnt file |
| int DataSize; // |
| bool DataOwned; // |
| const FntInfo* Info; // (point into raw data) |
| const FntCommon* Common; // (point into raw data) |
| const FntGlyph* Glyphs; // (point into raw data) |
| size_t GlyphsCount; // |
| const FntKerning* Kerning; // (point into raw data) |
| size_t KerningCount; // |
| int TabCount; // FIXME: mishandled (add fixed amount instead of aligning to column) |
| ImVector<const char*> Filenames; // (point into raw data) |
| ImVector<int> IndexLookup; // (built) |
| |
| ImBitmapFont(); |
| ~ImBitmapFont() { Clear(); } |
| |
| bool LoadFromMemory(const void* data, int data_size); |
| bool LoadFromFile(const char* filename); |
| void Clear(); |
| void BuildLookupTable(); |
| const FntGlyph * FindGlyph(unsigned short c) const; |
| float GetFontSize() const { return (float)Info->FontSize; } |
| |
| ImVec2 CalcTextSize(float size, float max_width, const char* text_begin, const char* text_end, const char** remaining = NULL) const; |
| void RenderText(float size, ImVec2 pos, ImU32 col, const ImVec4& clip_rect, const char* text_begin, const char* text_end, ImDrawVert*& out_vertices) const; |
| }; |