// 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;
};
