mirror of
				https://github.com/Drezil/imgui.git
				synced 2025-10-31 05:01:05 +01:00 
			
		
		
		
	Merge remote-tracking branch 'origin' into 2015-05-menus
Conflicts: imgui.h
This commit is contained in:
		
							
								
								
									
										134
									
								
								imgui.h
									
									
									
									
									
								
							
							
						
						
									
										134
									
								
								imgui.h
									
									
									
									
									
								
							| @@ -73,75 +73,8 @@ struct ImVec4 | ||||
| #endif | ||||
| }; | ||||
|  | ||||
| namespace ImGui | ||||
| { | ||||
|     // Proxy functions to access the MemAllocFn/MemFreeFn pointers in ImGui::GetIO(). The only reason they exist here is to allow ImVector<> to compile inline. | ||||
|     IMGUI_API void*       MemAlloc(size_t sz); | ||||
|     IMGUI_API void        MemFree(void* ptr); | ||||
| } | ||||
|  | ||||
| // 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).  | ||||
| // Use '#define ImVector std::vector' if you want to use the STL type or your own type. | ||||
| // Our implementation does NOT call c++ constructors because we don't use them in ImGui. Don't use this class as a straight std::vector replacement in your code! | ||||
| #ifndef ImVector | ||||
| template<typename T> | ||||
| class ImVector | ||||
| { | ||||
| protected: | ||||
|     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) ImGui::MemFree(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; ImGui::MemFree(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()                         { IM_ASSERT(Size > 0); return Data[0]; } | ||||
|     inline const value_type&    front() const                   { IM_ASSERT(Size > 0); return Data[0]; } | ||||
|     inline value_type&          back()                          { IM_ASSERT(Size > 0); return Data[Size-1]; } | ||||
|     inline const value_type&    back() const                    { IM_ASSERT(Size > 0); return Data[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 size_t               _grow_capacity(size_t new_size) { size_t new_capacity = Capacity ? (Capacity + Capacity/2) : 8; return new_capacity > new_size ? new_capacity : new_size; } | ||||
|  | ||||
|     inline void                 resize(size_t new_size)         { if (new_size > Capacity) reserve(_grow_capacity(new_size)); Size = new_size; } | ||||
|     inline void                 reserve(size_t new_capacity)     | ||||
|     {  | ||||
|         if (new_capacity <= Capacity) return; | ||||
|         T* new_data = (value_type*)ImGui::MemAlloc(new_capacity * sizeof(value_type)); | ||||
|         memcpy(new_data, Data, Size * sizeof(value_type)); | ||||
|         ImGui::MemFree(Data); | ||||
|         Data = new_data; | ||||
|         Capacity = new_capacity;  | ||||
|     } | ||||
|  | ||||
|     inline void                 push_back(const value_type& v)  { if (Size == Capacity) reserve(_grow_capacity(Size+1)); 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 ptrdiff_t off = it - begin(); memmove(Data + off, Data + off + 1, (Size - (size_t)off - 1) * sizeof(value_type)); Size--; return Data + off; } | ||||
|     inline iterator             insert(const_iterator it, const value_type& v)  { IM_ASSERT(it >= begin() && it <= end()); const ptrdiff_t off = it - begin(); if (Size == Capacity) reserve(Capacity ? Capacity * 2 : 4); if (off < (int)Size) memmove(Data + off + 1, Data + off, (Size - (size_t)off) * sizeof(value_type)); Data[off] = v; Size++; return Data + off; } | ||||
| }; | ||||
| #endif // #ifndef ImVector | ||||
|  | ||||
| // Helpers at bottom of the file: | ||||
| // - class ImVector<>                   // Lightweight std::vector like class. Use '#define ImVector std::vector' if you want to use the STL type or your own type. | ||||
| // - IMGUI_ONCE_UPON_A_FRAME            // Execute a block of code once per frame only (convenient for creating UI within deep-nested code that runs multiple times) | ||||
| // - struct ImGuiTextFilter             // Parse and apply text filters. In format "aaaaa[,bbbb][,ccccc]" | ||||
| // - struct ImGuiTextBuffer             // Text buffer for logging/accumulating text | ||||
| @@ -432,6 +365,10 @@ namespace ImGui | ||||
|     IMGUI_API void          ColorConvertRGBtoHSV(float r, float g, float b, float& out_h, float& out_s, float& out_v); | ||||
|     IMGUI_API void          ColorConvertHSVtoRGB(float h, float s, float v, float& out_r, float& out_g, float& out_b); | ||||
|  | ||||
|     // Proxy functions to access the MemAllocFn/MemFreeFn pointers in ImGui::GetIO() | ||||
|     IMGUI_API void*         MemAlloc(size_t sz); | ||||
|     IMGUI_API void          MemFree(void* ptr); | ||||
|  | ||||
|     // Internal state access - if you want to share ImGui state between modules (e.g. DLL) or allocate it yourself | ||||
|     IMGUI_API const char*   GetVersion(); | ||||
|     IMGUI_API void*         GetInternalState(); | ||||
| @@ -741,6 +678,67 @@ struct ImGuiIO | ||||
| // Helpers | ||||
| //----------------------------------------------------------------------------- | ||||
|  | ||||
| // 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).  | ||||
| // Use '#define ImVector std::vector' if you want to use the STL type or your own type. | ||||
| // Our implementation does NOT call c++ constructors because we don't use them in ImGui. Don't use this class as a straight std::vector replacement in your code! | ||||
| #ifndef ImVector | ||||
| template<typename T> | ||||
| class ImVector | ||||
| { | ||||
| protected: | ||||
|     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) ImGui::MemFree(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; ImGui::MemFree(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()                         { IM_ASSERT(Size > 0); return Data[0]; } | ||||
|     inline const value_type&    front() const                   { IM_ASSERT(Size > 0); return Data[0]; } | ||||
|     inline value_type&          back()                          { IM_ASSERT(Size > 0); return Data[Size-1]; } | ||||
|     inline const value_type&    back() const                    { IM_ASSERT(Size > 0); return Data[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 size_t               _grow_capacity(size_t new_size) { size_t new_capacity = Capacity ? (Capacity + Capacity/2) : 8; return new_capacity > new_size ? new_capacity : new_size; } | ||||
|  | ||||
|     inline void                 resize(size_t new_size)         { if (new_size > Capacity) reserve(_grow_capacity(new_size)); Size = new_size; } | ||||
|     inline void                 reserve(size_t new_capacity)     | ||||
|     {  | ||||
|         if (new_capacity <= Capacity) return; | ||||
|         T* new_data = (value_type*)ImGui::MemAlloc(new_capacity * sizeof(value_type)); | ||||
|         memcpy(new_data, Data, Size * sizeof(value_type)); | ||||
|         ImGui::MemFree(Data); | ||||
|         Data = new_data; | ||||
|         Capacity = new_capacity;  | ||||
|     } | ||||
|  | ||||
|     inline void                 push_back(const value_type& v)  { if (Size == Capacity) reserve(_grow_capacity(Size+1)); 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 ptrdiff_t off = it - begin(); memmove(Data + off, Data + off + 1, (Size - (size_t)off - 1) * sizeof(value_type)); Size--; return Data + off; } | ||||
|     inline iterator             insert(const_iterator it, const value_type& v)  { IM_ASSERT(it >= begin() && it <= end()); const ptrdiff_t off = it - begin(); if (Size == Capacity) reserve(Capacity ? Capacity * 2 : 4); if (off < (int)Size) memmove(Data + off + 1, Data + off, (Size - (size_t)off) * sizeof(value_type)); Data[off] = v; Size++; return Data + off; } | ||||
| }; | ||||
| #endif // #ifndef ImVector | ||||
|  | ||||
| // Helper: execute a block of code once a frame only | ||||
| // Convenient if you want to quickly create an UI within deep-nested code that runs multiple times every frame. | ||||
| // Usage: | ||||
|   | ||||
		Reference in New Issue
	
	Block a user