mirror of
				https://github.com/Drezil/imgui.git
				synced 2025-10-31 05:01:05 +01:00 
			
		
		
		
	ImDrawList: Added ImDrawCmd::VtxOffset value to support large meshes (64k+ vertices) using 16-bits indices. To enable the feature, the renderer back-end needs to set 'io.BackendFlags |= ImGuiBackendFlags_HasVtxOffset' and honor the ImDrawCmd::VtxOffset field. Otherwise the value will always be zero. This has the advantage of preserving smaller index buffers and allowing to execute on hardware that do not support 32-bits indices.
ImDrawList: Added ImDrawCmd::IdxOffset value, equivalent to summing element count for each draw command. This is provided for convenience and consistency with VtxOffset. (#2591)
This commit is contained in:
		| @@ -56,6 +56,13 @@ Other Changes: | |||||||
| - Style: Added style.WindowMenuButtonPosition (left/right, defaults to ImGuiDir_Left) to move the | - Style: Added style.WindowMenuButtonPosition (left/right, defaults to ImGuiDir_Left) to move the | ||||||
|   collapsing/docking button to the other side of the title bar. |   collapsing/docking button to the other side of the title bar. | ||||||
| - Style: Made window close button cross slightly smaller. | - Style: Made window close button cross slightly smaller. | ||||||
|  | - ImDrawList: Added ImDrawCmd::VtxOffset value to support large meshes (64k+ vertices) using 16-bits indices. | ||||||
|  |   To enable the feature, the renderer back-end needs to set 'io.BackendFlags |= ImGuiBackendFlags_HasVtxOffset' | ||||||
|  |   and honor the ImDrawCmd::VtxOffset field. Otherwise the value will always be zero. | ||||||
|  |   This has the advantage of preserving smaller index buffers and allowing to execute on hardware that do not | ||||||
|  |   support 32-bits indices. Most examples back-ends have been modified to support the VtxOffset field. | ||||||
|  | - ImDrawList: Added ImDrawCmd::IdxOffset value, equivalent to summing element count for each draw command. | ||||||
|  |   This is provided for convenience and consistency with VtxOffset. | ||||||
| - ImFontAtlas: FreeType: Added RasterizerFlags::Monochrome flag to disable font anti-aliasing. (#2545) | - ImFontAtlas: FreeType: Added RasterizerFlags::Monochrome flag to disable font anti-aliasing. (#2545) | ||||||
|   Combine with RasterizerFlags::MonoHinting for best results. |   Combine with RasterizerFlags::MonoHinting for best results. | ||||||
| - ImFontGlyphRangesBuilder: Fixed unnecessarily over-sized buffer, which incidentally was also not | - ImFontGlyphRangesBuilder: Fixed unnecessarily over-sized buffer, which incidentally was also not | ||||||
|   | |||||||
| @@ -62,7 +62,10 @@ | |||||||
|         operator MyVec4() const { return MyVec4(x,y,z,w); } |         operator MyVec4() const { return MyVec4(x,y,z,w); } | ||||||
| */ | */ | ||||||
|  |  | ||||||
| //---- Use 32-bit vertex indices (default is 16-bit) to allow meshes with more than 64K vertices. Render function needs to support it. | //---- Using 32-bits vertex indices (default is 16-bits) is one way to allow large meshes with more than 64K vertices.  | ||||||
|  | // Your renderer back-end will need to support it (most example renderer back-ends support both 16/32-bits indices). | ||||||
|  | // Another way to allow large meshes while keeping 16-bits indices is to handle ImDrawCmd::VtxOffset in your renderer.  | ||||||
|  | // Read about ImGuiBackendFlags_HasVtxOffset for details. | ||||||
| //#define ImDrawIdx unsigned int | //#define ImDrawIdx unsigned int | ||||||
|  |  | ||||||
| //---- Tip: You can add extra functions within the ImGui:: namespace, here or in your own headers files. | //---- Tip: You can add extra functions within the ImGui:: namespace, here or in your own headers files. | ||||||
|   | |||||||
							
								
								
									
										40
									
								
								imgui.cpp
									
									
									
									
									
								
							
							
						
						
									
										40
									
								
								imgui.cpp
									
									
									
									
									
								
							| @@ -3502,7 +3502,13 @@ void ImGui::NewFrame() | |||||||
|     IM_ASSERT(g.Font->IsLoaded()); |     IM_ASSERT(g.Font->IsLoaded()); | ||||||
|     g.DrawListSharedData.ClipRectFullscreen = ImVec4(0.0f, 0.0f, g.IO.DisplaySize.x, g.IO.DisplaySize.y); |     g.DrawListSharedData.ClipRectFullscreen = ImVec4(0.0f, 0.0f, g.IO.DisplaySize.x, g.IO.DisplaySize.y); | ||||||
|     g.DrawListSharedData.CurveTessellationTol = g.Style.CurveTessellationTol; |     g.DrawListSharedData.CurveTessellationTol = g.Style.CurveTessellationTol; | ||||||
|     g.DrawListSharedData.InitialFlags = (g.Style.AntiAliasedLines ? ImDrawListFlags_AntiAliasedLines : 0) | (g.Style.AntiAliasedFill ? ImDrawListFlags_AntiAliasedFill : 0); |     g.DrawListSharedData.InitialFlags = ImDrawListFlags_None; | ||||||
|  |     if (g.Style.AntiAliasedLines) | ||||||
|  |         g.DrawListSharedData.InitialFlags |= ImDrawListFlags_AntiAliasedLines; | ||||||
|  |     if (g.Style.AntiAliasedFill) | ||||||
|  |         g.DrawListSharedData.InitialFlags |= ImDrawListFlags_AntiAliasedFill; | ||||||
|  |     if (g.IO.BackendFlags & ImGuiBackendFlags_HasVtxOffset) | ||||||
|  |         g.DrawListSharedData.InitialFlags |= ImDrawListFlags_AllowVtxOffset; | ||||||
|  |  | ||||||
|     g.BackgroundDrawList.Clear(); |     g.BackgroundDrawList.Clear(); | ||||||
|     g.BackgroundDrawList.PushTextureID(g.IO.Fonts->TexID); |     g.BackgroundDrawList.PushTextureID(g.IO.Fonts->TexID); | ||||||
| @@ -3774,19 +3780,28 @@ static void AddDrawListToDrawData(ImVector<ImDrawList*>* out_list, ImDrawList* d | |||||||
|             return; |             return; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     // Draw list sanity check. Detect mismatch between PrimReserve() calls and incrementing _VtxCurrentIdx, _VtxWritePtr etc. May trigger for you if you are using PrimXXX functions incorrectly. |     // Draw list sanity check. Detect mismatch between PrimReserve() calls and incrementing _VtxCurrentIdx, _VtxWritePtr etc.  | ||||||
|  |     // May trigger for you if you are using PrimXXX functions incorrectly. | ||||||
|     IM_ASSERT(draw_list->VtxBuffer.Size == 0 || draw_list->_VtxWritePtr == draw_list->VtxBuffer.Data + draw_list->VtxBuffer.Size); |     IM_ASSERT(draw_list->VtxBuffer.Size == 0 || draw_list->_VtxWritePtr == draw_list->VtxBuffer.Data + draw_list->VtxBuffer.Size); | ||||||
|     IM_ASSERT(draw_list->IdxBuffer.Size == 0 || draw_list->_IdxWritePtr == draw_list->IdxBuffer.Data + draw_list->IdxBuffer.Size); |     IM_ASSERT(draw_list->IdxBuffer.Size == 0 || draw_list->_IdxWritePtr == draw_list->IdxBuffer.Data + draw_list->IdxBuffer.Size); | ||||||
|  |     if (!(draw_list->Flags & ImDrawListFlags_AllowVtxOffset)) | ||||||
|         IM_ASSERT((int)draw_list->_VtxCurrentIdx == draw_list->VtxBuffer.Size); |         IM_ASSERT((int)draw_list->_VtxCurrentIdx == draw_list->VtxBuffer.Size); | ||||||
|  |  | ||||||
|     // Check that draw_list doesn't use more vertices than indexable (default ImDrawIdx = unsigned short = 2 bytes = 64K vertices per ImDrawList = per window) |     // Check that draw_list doesn't use more vertices than indexable (default ImDrawIdx = unsigned short = 2 bytes = 64K vertices per ImDrawList = per window) | ||||||
|     // If this assert triggers because you are drawing lots of stuff manually: |     // If this assert triggers because you are drawing lots of stuff manually: | ||||||
|     // A) Make sure you are coarse clipping, because ImDrawList let all your vertices pass. You can use the Metrics window to inspect draw list contents. |     // - First, make sure you are coarse clipping yourself and not trying to draw many things outside visible bounds.  | ||||||
|     // B) If you need/want meshes with more than 64K vertices, uncomment the '#define ImDrawIdx unsigned int' line in imconfig.h to set the index size to 4 bytes. |     //   Be mindful that the ImDrawList API doesn't filter vertices. Use the Metrics window to inspect draw list contents. | ||||||
|     //    You'll need to handle the 4-bytes indices to your renderer. For example, the OpenGL example code detect index size at compile-time by doing: |     // - If you want large meshes with more than 64K vertices, you can either: | ||||||
|  |     //   (A) Handle the ImDrawCmd::VtxOffset value in your renderer back-end, and set 'io.BackendFlags |= ImGuiBackendFlags_HasVtxOffset'. | ||||||
|  |     //       Most example back-ends already support this from 1.71. Pre-1.71 back-ends won't. | ||||||
|  |     //       Some graphics API such as GL ES 1/2 don't have a way to offset the starting vertex so it is not supported for them. | ||||||
|  |     //   (B) Or handle 32-bits indices in your renderer back-end, and uncomment '#define ImDrawIdx unsigned int' line in imconfig.h. | ||||||
|  |     //       Most example back-ends already support this. For example, the OpenGL example code detect index size at compile-time: | ||||||
|     //         glDrawElements(GL_TRIANGLES, (GLsizei)pcmd->ElemCount, sizeof(ImDrawIdx) == 2 ? GL_UNSIGNED_SHORT : GL_UNSIGNED_INT, idx_buffer_offset); |     //         glDrawElements(GL_TRIANGLES, (GLsizei)pcmd->ElemCount, sizeof(ImDrawIdx) == 2 ? GL_UNSIGNED_SHORT : GL_UNSIGNED_INT, idx_buffer_offset); | ||||||
|     //    Your own engine or render API may use different parameters or function calls to specify index sizes. 2 and 4 bytes indices are generally supported by most API. |     //       Your own engine or render API may use different parameters or function calls to specify index sizes.  | ||||||
|     // C) If for some reason you cannot use 4 bytes indices or don't want to, a workaround is to call BeginChild()/EndChild() before reaching the 64K limit to split your draw commands in multiple draw lists. |     //       2 and 4 bytes indices are generally supported by most graphics API. | ||||||
|  |     // - If for some reason neither of those solutions works for you, a workaround is to call BeginChild()/EndChild() before reaching  | ||||||
|  |     //   the 64K limit to split your draw commands in multiple draw lists. | ||||||
|     if (sizeof(ImDrawIdx) == 2) |     if (sizeof(ImDrawIdx) == 2) | ||||||
|         IM_ASSERT(draw_list->_VtxCurrentIdx < (1 << 16) && "Too many vertices in ImDrawList using 16-bit indices. Read comment above"); |         IM_ASSERT(draw_list->_VtxCurrentIdx < (1 << 16) && "Too many vertices in ImDrawList using 16-bit indices. Read comment above"); | ||||||
|  |  | ||||||
| @@ -9790,9 +9805,10 @@ void ImGui::ShowMetricsWindow(bool* p_open) | |||||||
|                     continue; |                     continue; | ||||||
|                 } |                 } | ||||||
|                 ImDrawIdx* idx_buffer = (draw_list->IdxBuffer.Size > 0) ? draw_list->IdxBuffer.Data : NULL; |                 ImDrawIdx* idx_buffer = (draw_list->IdxBuffer.Size > 0) ? draw_list->IdxBuffer.Data : NULL; | ||||||
|                 bool pcmd_node_open = ImGui::TreeNode((void*)(pcmd - draw_list->CmdBuffer.begin()),  |                 char buf[300]; | ||||||
|                     "Draw %4d %s vtx, tex 0x%p, clip_rect (%4.0f,%4.0f)-(%4.0f,%4.0f)",  |                 ImFormatString(buf, IM_ARRAYSIZE(buf), "Draw %4d triangles, tex 0x%p, clip_rect (%4.0f,%4.0f)-(%4.0f,%4.0f)", | ||||||
|                     pcmd->ElemCount, draw_list->IdxBuffer.Size > 0 ? "indexed" : "non-indexed", (void*)(intptr_t)pcmd->TextureId, pcmd->ClipRect.x, pcmd->ClipRect.y, pcmd->ClipRect.z, pcmd->ClipRect.w); |                     pcmd->ElemCount/3, (void*)(intptr_t)pcmd->TextureId, pcmd->ClipRect.x, pcmd->ClipRect.y, pcmd->ClipRect.z, pcmd->ClipRect.w); | ||||||
|  |                 bool pcmd_node_open = ImGui::TreeNode((void*)(pcmd - draw_list->CmdBuffer.begin()), "%s", buf); | ||||||
|                 if (show_drawcmd_clip_rects && fg_draw_list && ImGui::IsItemHovered()) |                 if (show_drawcmd_clip_rects && fg_draw_list && ImGui::IsItemHovered()) | ||||||
|                 { |                 { | ||||||
|                     ImRect clip_rect = pcmd->ClipRect; |                     ImRect clip_rect = pcmd->ClipRect; | ||||||
| @@ -9806,11 +9822,11 @@ void ImGui::ShowMetricsWindow(bool* p_open) | |||||||
|                     continue; |                     continue; | ||||||
|  |  | ||||||
|                 // Display individual triangles/vertices. Hover on to get the corresponding triangle highlighted. |                 // Display individual triangles/vertices. Hover on to get the corresponding triangle highlighted. | ||||||
|  |                 ImGui::Text("ElemCount: %d, ElemCount/3: %d, VtxOffset: +%d, IdxOffset: +%d", pcmd->ElemCount, pcmd->ElemCount/3, pcmd->VtxOffset, pcmd->IdxOffset); | ||||||
|                 ImGuiListClipper clipper(pcmd->ElemCount/3); // Manually coarse clip our print out of individual vertices to save CPU, only items that may be visible. |                 ImGuiListClipper clipper(pcmd->ElemCount/3); // Manually coarse clip our print out of individual vertices to save CPU, only items that may be visible. | ||||||
|                 while (clipper.Step()) |                 while (clipper.Step()) | ||||||
|                     for (int prim = clipper.DisplayStart, idx_i = elem_offset + clipper.DisplayStart*3; prim < clipper.DisplayEnd; prim++) |                     for (int prim = clipper.DisplayStart, idx_i = elem_offset + clipper.DisplayStart*3; prim < clipper.DisplayEnd; prim++) | ||||||
|                     { |                     { | ||||||
|                         char buf[300]; |  | ||||||
|                         char *buf_p = buf, *buf_end = buf + IM_ARRAYSIZE(buf); |                         char *buf_p = buf, *buf_end = buf + IM_ARRAYSIZE(buf); | ||||||
|                         ImVec2 triangles_pos[3]; |                         ImVec2 triangles_pos[3]; | ||||||
|                         for (int n = 0; n < 3; n++, idx_i++) |                         for (int n = 0; n < 3; n++, idx_i++) | ||||||
| @@ -9819,7 +9835,7 @@ void ImGui::ShowMetricsWindow(bool* p_open) | |||||||
|                             ImDrawVert& v = draw_list->VtxBuffer[vtx_i]; |                             ImDrawVert& v = draw_list->VtxBuffer[vtx_i]; | ||||||
|                             triangles_pos[n] = v.pos; |                             triangles_pos[n] = v.pos; | ||||||
|                             buf_p += ImFormatString(buf_p, buf_end - buf_p, "%s %04d: pos (%8.2f,%8.2f), uv (%.6f,%.6f), col %08X\n", |                             buf_p += ImFormatString(buf_p, buf_end - buf_p, "%s %04d: pos (%8.2f,%8.2f), uv (%.6f,%.6f), col %08X\n", | ||||||
|                                 (n == 0) ? "idx" : "   ", idx_i, v.pos.x, v.pos.y, v.uv.x, v.uv.y, v.col); |                                 (n == 0) ? "elem" : "    ", idx_i, v.pos.x, v.pos.y, v.uv.x, v.uv.y, v.col); | ||||||
|                         } |                         } | ||||||
|                         ImGui::Selectable(buf, false); |                         ImGui::Selectable(buf, false); | ||||||
|                         if (fg_draw_list && ImGui::IsItemHovered()) |                         if (fg_draw_list && ImGui::IsItemHovered()) | ||||||
|   | |||||||
							
								
								
									
										27
									
								
								imgui.h
									
									
									
									
									
								
							
							
						
						
									
										27
									
								
								imgui.h
									
									
									
									
									
								
							| @@ -47,7 +47,7 @@ Index of this file: | |||||||
| // Version | // Version | ||||||
| // (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) | // (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) | ||||||
| #define IMGUI_VERSION               "1.71 WIP" | #define IMGUI_VERSION               "1.71 WIP" | ||||||
| #define IMGUI_VERSION_NUM           17002 | #define IMGUI_VERSION_NUM           17003 | ||||||
| #define IMGUI_CHECKVERSION()        ImGui::DebugCheckVersionAndDataLayout(IMGUI_VERSION, sizeof(ImGuiIO), sizeof(ImGuiStyle), sizeof(ImVec2), sizeof(ImVec4), sizeof(ImDrawVert), sizeof(ImDrawIdx)) | #define IMGUI_CHECKVERSION()        ImGui::DebugCheckVersionAndDataLayout(IMGUI_VERSION, sizeof(ImGuiIO), sizeof(ImGuiStyle), sizeof(ImVec2), sizeof(ImVec4), sizeof(ImDrawVert), sizeof(ImDrawIdx)) | ||||||
|  |  | ||||||
| // Define attributes of all API symbols declarations (e.g. for DLL under Windows) | // Define attributes of all API symbols declarations (e.g. for DLL under Windows) | ||||||
| @@ -1003,9 +1003,10 @@ enum ImGuiConfigFlags_ | |||||||
| enum ImGuiBackendFlags_ | enum ImGuiBackendFlags_ | ||||||
| { | { | ||||||
|     ImGuiBackendFlags_None                  = 0, |     ImGuiBackendFlags_None                  = 0, | ||||||
|     ImGuiBackendFlags_HasGamepad            = 1 << 0,   // Back-end supports gamepad and currently has one connected. |     ImGuiBackendFlags_HasGamepad            = 1 << 0,   // Platform Back-end supports gamepad and currently has one connected. | ||||||
|     ImGuiBackendFlags_HasMouseCursors       = 1 << 1,   // Back-end supports honoring GetMouseCursor() value to change the OS cursor shape. |     ImGuiBackendFlags_HasMouseCursors       = 1 << 1,   // Platform Back-end supports honoring GetMouseCursor() value to change the OS cursor shape. | ||||||
|     ImGuiBackendFlags_HasSetMousePos        = 1 << 2    // Back-end supports io.WantSetMousePos requests to reposition the OS mouse position (only used if ImGuiConfigFlags_NavEnableSetMousePos is set). |     ImGuiBackendFlags_HasSetMousePos        = 1 << 2,   // Platform Back-end supports io.WantSetMousePos requests to reposition the OS mouse position (only used if ImGuiConfigFlags_NavEnableSetMousePos is set). | ||||||
|  |     ImGuiBackendFlags_HasVtxOffset          = 1 << 3    // Renderer Back-end supports ImDrawCmd::VtxOffset. This enables output of large meshes (64K+ vertices) while still using 16-bits indices. | ||||||
| }; | }; | ||||||
|  |  | ||||||
| // Enumeration for PushStyleColor() / PopStyleColor() | // Enumeration for PushStyleColor() / PopStyleColor() | ||||||
| @@ -1771,25 +1772,31 @@ struct ImColor | |||||||
| // The expected behavior from your rendering function is 'if (cmd.UserCallback != NULL) { cmd.UserCallback(parent_list, cmd); } else { RenderTriangles() }' | // The expected behavior from your rendering function is 'if (cmd.UserCallback != NULL) { cmd.UserCallback(parent_list, cmd); } else { RenderTriangles() }' | ||||||
| typedef void (*ImDrawCallback)(const ImDrawList* parent_list, const ImDrawCmd* cmd); | typedef void (*ImDrawCallback)(const ImDrawList* parent_list, const ImDrawCmd* cmd); | ||||||
|  |  | ||||||
| // Special Draw Callback value to request renderer back-end to reset the graphics/render state. | // Special Draw callback value to request renderer back-end to reset the graphics/render state. | ||||||
| // The renderer back-end needs to handle this special value, otherwise it will crash trying to call a function at this address. | // The renderer back-end needs to handle this special value, otherwise it will crash trying to call a function at this address. | ||||||
| // This is useful for example if you submitted callbacks which you know have altered the render state and you want it to be restored. | // This is useful for example if you submitted callbacks which you know have altered the render state and you want it to be restored. | ||||||
| // 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). | // 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). | ||||||
| #define ImDrawCallback_ResetRenderState     (ImDrawCallback)(-1) | #define ImDrawCallback_ResetRenderState     (ImDrawCallback)(-1) | ||||||
|  |  | ||||||
| // Typically, 1 command = 1 GPU draw call (unless command is a callback) | // Typically, 1 command = 1 GPU draw call (unless command is a callback) | ||||||
|  | // Pre 1.71 back-ends will typically ignore the VtxOffset/IdxOffset fields. When (io.BackendFlags & ImGuiBackendFlags_HasVtxOffset)  | ||||||
|  | // is enabled, those fields allow us to render meshes larger than 64K vertices while keeping 16-bits indices. | ||||||
| struct ImDrawCmd | struct ImDrawCmd | ||||||
| { | { | ||||||
|     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[]. |     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[]. | ||||||
|     ImVec4          ClipRect;               // Clipping rectangle (x1, y1, x2, y2). Subtract ImDrawData->DisplayPos to get clipping rectangle in "viewport" coordinates |     ImVec4          ClipRect;               // Clipping rectangle (x1, y1, x2, y2). Subtract ImDrawData->DisplayPos to get clipping rectangle in "viewport" coordinates | ||||||
|     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. |     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. | ||||||
|  |     unsigned int    VtxOffset;              // Start offset in vertex buffer. Pre-1.71 or without ImGuiBackendFlags_HasVtxOffset: always 0. With ImGuiBackendFlags_HasVtxOffset: may be >0 to support meshes larger than 64K vertices with 16-bits indices. | ||||||
|  |     unsigned int    IdxOffset;              // Start offset in index buffer. Always equal to sum of ElemCount drawn so far. | ||||||
|     ImDrawCallback  UserCallback;           // If != NULL, call the function instead of rendering the vertices. clip_rect and texture_id will be set normally. |     ImDrawCallback  UserCallback;           // If != NULL, call the function instead of rendering the vertices. clip_rect and texture_id will be set normally. | ||||||
|     void*           UserCallbackData;       // The draw callback code can access this. |     void*           UserCallbackData;       // The draw callback code can access this. | ||||||
|  |  | ||||||
|     ImDrawCmd() { ElemCount = 0; ClipRect.x = ClipRect.y = ClipRect.z = ClipRect.w = 0.0f; TextureId = (ImTextureID)NULL; UserCallback = NULL; UserCallbackData = NULL; } |     ImDrawCmd() { ElemCount = 0; ClipRect.x = ClipRect.y = ClipRect.z = ClipRect.w = 0.0f; TextureId = (ImTextureID)NULL; VtxOffset = IdxOffset = 0;  UserCallback = NULL; UserCallbackData = NULL; } | ||||||
| }; | }; | ||||||
|  |  | ||||||
| // Vertex index (override with '#define ImDrawIdx unsigned int' in imconfig.h) | // Vertex index  | ||||||
|  | // (to allow large meshes with 16-bits indices: set 'io.BackendFlags |= ImGuiBackendFlags_HasVtxOffset' and handle ImDrawCmd::VtxOffset in the renderer back-end) | ||||||
|  | // (to use 32-bits indices: override with '#define ImDrawIdx unsigned int' in imconfig.h) | ||||||
| #ifndef ImDrawIdx | #ifndef ImDrawIdx | ||||||
| typedef unsigned short ImDrawIdx; | typedef unsigned short ImDrawIdx; | ||||||
| #endif | #endif | ||||||
| @@ -1835,7 +1842,8 @@ enum ImDrawListFlags_ | |||||||
| { | { | ||||||
|     ImDrawListFlags_None             = 0, |     ImDrawListFlags_None             = 0, | ||||||
|     ImDrawListFlags_AntiAliasedLines = 1 << 0,  // Lines are anti-aliased (*2 the number of triangles for 1.0f wide line, otherwise *3 the number of triangles) |     ImDrawListFlags_AntiAliasedLines = 1 << 0,  // Lines are anti-aliased (*2 the number of triangles for 1.0f wide line, otherwise *3 the number of triangles) | ||||||
|     ImDrawListFlags_AntiAliasedFill  = 1 << 1   // Filled shapes have anti-aliased edges (*2 the number of vertices) |     ImDrawListFlags_AntiAliasedFill  = 1 << 1,  // Filled shapes have anti-aliased edges (*2 the number of vertices) | ||||||
|  |     ImDrawListFlags_AllowVtxOffset   = 1 << 2   // Can emit 'VtxOffset > 0' to allow large meshes. Set when 'io.BackendFlags & ImGuiBackendFlags_HasVtxOffset' is enabled. | ||||||
| }; | }; | ||||||
|  |  | ||||||
| // Draw command list | // Draw command list | ||||||
| @@ -1855,7 +1863,8 @@ struct ImDrawList | |||||||
|     // [Internal, used while building lists] |     // [Internal, used while building lists] | ||||||
|     const ImDrawListSharedData* _Data;          // Pointer to shared draw data (you can use ImGui::GetDrawListSharedData() to get the one from current ImGui context) |     const ImDrawListSharedData* _Data;          // Pointer to shared draw data (you can use ImGui::GetDrawListSharedData() to get the one from current ImGui context) | ||||||
|     const char*             _OwnerName;         // Pointer to owner window's name for debugging |     const char*             _OwnerName;         // Pointer to owner window's name for debugging | ||||||
|     unsigned int            _VtxCurrentIdx;     // [Internal] == VtxBuffer.Size |     unsigned int            _VtxCurrentOffset;  // [Internal] Always 0 unless 'Flags & ImDrawListFlags_AllowVtxOffset'. | ||||||
|  |     unsigned int            _VtxCurrentIdx;     // [Internal] Generally == VtxBuffer.Size unless we are past 64K vertices, in which case this gets reset to 0. | ||||||
|     ImDrawVert*             _VtxWritePtr;       // [Internal] point within VtxBuffer.Data after each add command (to avoid using the ImVector<> operators too much) |     ImDrawVert*             _VtxWritePtr;       // [Internal] point within VtxBuffer.Data after each add command (to avoid using the ImVector<> operators too much) | ||||||
|     ImDrawIdx*              _IdxWritePtr;       // [Internal] point within IdxBuffer.Data after each add command (to avoid using the ImVector<> operators too much) |     ImDrawIdx*              _IdxWritePtr;       // [Internal] point within IdxBuffer.Data after each add command (to avoid using the ImVector<> operators too much) | ||||||
|     ImVector<ImVec4>        _ClipRectStack;     // [Internal] |     ImVector<ImVec4>        _ClipRectStack;     // [Internal] | ||||||
|   | |||||||
| @@ -350,6 +350,7 @@ void ImGui::ShowDemoWindow(bool* p_open) | |||||||
|             ImGui::CheckboxFlags("io.BackendFlags: HasGamepad", (unsigned int *)&backend_flags, ImGuiBackendFlags_HasGamepad); |             ImGui::CheckboxFlags("io.BackendFlags: HasGamepad", (unsigned int *)&backend_flags, ImGuiBackendFlags_HasGamepad); | ||||||
|             ImGui::CheckboxFlags("io.BackendFlags: HasMouseCursors", (unsigned int *)&backend_flags, ImGuiBackendFlags_HasMouseCursors); |             ImGui::CheckboxFlags("io.BackendFlags: HasMouseCursors", (unsigned int *)&backend_flags, ImGuiBackendFlags_HasMouseCursors); | ||||||
|             ImGui::CheckboxFlags("io.BackendFlags: HasSetMousePos", (unsigned int *)&backend_flags, ImGuiBackendFlags_HasSetMousePos); |             ImGui::CheckboxFlags("io.BackendFlags: HasSetMousePos", (unsigned int *)&backend_flags, ImGuiBackendFlags_HasSetMousePos); | ||||||
|  |             ImGui::CheckboxFlags("io.BackendFlags: HasVtxOffset", (unsigned int *)&backend_flags, ImGuiBackendFlags_HasVtxOffset); | ||||||
|             ImGui::TreePop(); |             ImGui::TreePop(); | ||||||
|             ImGui::Separator(); |             ImGui::Separator(); | ||||||
|         } |         } | ||||||
| @@ -2862,6 +2863,7 @@ void ImGui::ShowAboutWindow(bool* p_open) | |||||||
|         if (io.BackendFlags & ImGuiBackendFlags_HasGamepad)             ImGui::Text(" HasGamepad"); |         if (io.BackendFlags & ImGuiBackendFlags_HasGamepad)             ImGui::Text(" HasGamepad"); | ||||||
|         if (io.BackendFlags & ImGuiBackendFlags_HasMouseCursors)        ImGui::Text(" HasMouseCursors"); |         if (io.BackendFlags & ImGuiBackendFlags_HasMouseCursors)        ImGui::Text(" HasMouseCursors"); | ||||||
|         if (io.BackendFlags & ImGuiBackendFlags_HasSetMousePos)         ImGui::Text(" HasSetMousePos"); |         if (io.BackendFlags & ImGuiBackendFlags_HasSetMousePos)         ImGui::Text(" HasSetMousePos"); | ||||||
|  |         if (io.BackendFlags & ImGuiBackendFlags_HasVtxOffset)           ImGui::Text(" HasVtxOffset"); | ||||||
|         ImGui::Separator(); |         ImGui::Separator(); | ||||||
|         ImGui::Text("io.Fonts: %d fonts, Flags: 0x%08X, TexSize: %d,%d", io.Fonts->Fonts.Size, io.Fonts->Flags, io.Fonts->TexWidth, io.Fonts->TexHeight); |         ImGui::Text("io.Fonts: %d fonts, Flags: 0x%08X, TexSize: %d,%d", io.Fonts->Fonts.Size, io.Fonts->Flags, io.Fonts->TexWidth, io.Fonts->TexHeight); | ||||||
|         ImGui::Text("io.DisplaySize: %.2f,%.2f", io.DisplaySize.x, io.DisplaySize.y); |         ImGui::Text("io.DisplaySize: %.2f,%.2f", io.DisplaySize.x, io.DisplaySize.y); | ||||||
|   | |||||||
| @@ -364,6 +364,7 @@ void ImDrawList::Clear() | |||||||
|     IdxBuffer.resize(0); |     IdxBuffer.resize(0); | ||||||
|     VtxBuffer.resize(0); |     VtxBuffer.resize(0); | ||||||
|     Flags = _Data->InitialFlags; |     Flags = _Data->InitialFlags; | ||||||
|  |     _VtxCurrentOffset = 0; | ||||||
|     _VtxCurrentIdx = 0; |     _VtxCurrentIdx = 0; | ||||||
|     _VtxWritePtr = NULL; |     _VtxWritePtr = NULL; | ||||||
|     _IdxWritePtr = NULL; |     _IdxWritePtr = NULL; | ||||||
| @@ -416,6 +417,8 @@ void ImDrawList::AddDrawCmd() | |||||||
|     ImDrawCmd draw_cmd; |     ImDrawCmd draw_cmd; | ||||||
|     draw_cmd.ClipRect = GetCurrentClipRect(); |     draw_cmd.ClipRect = GetCurrentClipRect(); | ||||||
|     draw_cmd.TextureId = GetCurrentTextureId(); |     draw_cmd.TextureId = GetCurrentTextureId(); | ||||||
|  |     draw_cmd.VtxOffset = _VtxCurrentOffset; | ||||||
|  |     draw_cmd.IdxOffset = IdxBuffer.Size; | ||||||
|  |  | ||||||
|     IM_ASSERT(draw_cmd.ClipRect.x <= draw_cmd.ClipRect.z && draw_cmd.ClipRect.y <= draw_cmd.ClipRect.w); |     IM_ASSERT(draw_cmd.ClipRect.x <= draw_cmd.ClipRect.z && draw_cmd.ClipRect.y <= draw_cmd.ClipRect.w); | ||||||
|     CmdBuffer.push_back(draw_cmd); |     CmdBuffer.push_back(draw_cmd); | ||||||
| @@ -604,6 +607,14 @@ void ImDrawList::ChannelsSetCurrent(int idx) | |||||||
| // NB: this can be called with negative count for removing primitives (as long as the result does not underflow) | // NB: this can be called with negative count for removing primitives (as long as the result does not underflow) | ||||||
| void ImDrawList::PrimReserve(int idx_count, int vtx_count) | void ImDrawList::PrimReserve(int idx_count, int vtx_count) | ||||||
| { | { | ||||||
|  |     // Large mesh support (when enabled) | ||||||
|  |     if (sizeof(ImDrawIdx) == 2 && (_VtxCurrentIdx + vtx_count >= (1 << 16)) && (Flags & ImDrawListFlags_AllowVtxOffset)) | ||||||
|  |     { | ||||||
|  |         _VtxCurrentOffset = VtxBuffer.Size; | ||||||
|  |         _VtxCurrentIdx = 0; | ||||||
|  |         AddDrawCmd(); | ||||||
|  |     } | ||||||
|  |  | ||||||
|     ImDrawCmd& draw_cmd = CmdBuffer.Data[CmdBuffer.Size-1]; |     ImDrawCmd& draw_cmd = CmdBuffer.Data[CmdBuffer.Size-1]; | ||||||
|     draw_cmd.ElemCount += idx_count; |     draw_cmd.ElemCount += idx_count; | ||||||
|  |  | ||||||
| @@ -2950,7 +2961,7 @@ void ImFont::RenderText(ImDrawList* draw_list, float size, ImVec2 pos, ImU32 col | |||||||
|     draw_list->CmdBuffer[draw_list->CmdBuffer.Size-1].ElemCount -= (idx_expected_size - draw_list->IdxBuffer.Size); |     draw_list->CmdBuffer[draw_list->CmdBuffer.Size-1].ElemCount -= (idx_expected_size - draw_list->IdxBuffer.Size); | ||||||
|     draw_list->_VtxWritePtr = vtx_write; |     draw_list->_VtxWritePtr = vtx_write; | ||||||
|     draw_list->_IdxWritePtr = idx_write; |     draw_list->_IdxWritePtr = idx_write; | ||||||
|     draw_list->_VtxCurrentIdx = (unsigned int)draw_list->VtxBuffer.Size; |     draw_list->_VtxCurrentIdx = vtx_current_idx; | ||||||
| } | } | ||||||
|  |  | ||||||
| //----------------------------------------------------------------------------- | //----------------------------------------------------------------------------- | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user