mirror of
				https://github.com/Drezil/imgui.git
				synced 2025-10-30 20:51:06 +01:00 
			
		
		
		
	Texture-based thick lines: Minor tweaks and rename toward merging in master. Changes to allow changing AA_SIZE (disable texture path).
This commit is contained in:
		| @@ -35,6 +35,15 @@ HOW TO UPDATE? | |||||||
|  VERSION 1.78 WIP (In Progress) |  VERSION 1.78 WIP (In Progress) | ||||||
| ----------------------------------------------------------------------- | ----------------------------------------------------------------------- | ||||||
|  |  | ||||||
|  | Other Changes: | ||||||
|  |  | ||||||
|  | - ImDrawList: Thick anti-aliased strokes (> 1.0f) with integer thickness now use a texture-based  | ||||||
|  |   path, reducing the amount of vertices/indices and CPU/GPU usage. (#3245) [@Shironekoben] | ||||||
|  |   - This change will facilitate the wider use of thick borders in future style changes.  | ||||||
|  |   - Requires an extra bit of texture space (~64x64 by default), relies on GPU bilinear filtering. | ||||||
|  |   - Clear io.AntiAliasedLinesUseTex = false; to disable rendering using this method. | ||||||
|  |   - Clear ImFontAtlasFlags_NoBakedLines in ImFontAtlas::Flags to disable baking data in texture. | ||||||
|  |  | ||||||
|  |  | ||||||
| ----------------------------------------------------------------------- | ----------------------------------------------------------------------- | ||||||
|  VERSION 1.77 (Released 2020-06-29) |  VERSION 1.77 (Released 2020-06-29) | ||||||
|   | |||||||
| @@ -935,7 +935,7 @@ ImGuiStyle::ImGuiStyle() | |||||||
|     DisplaySafeAreaPadding  = ImVec2(3,3);      // If you cannot see the edge of your screen (e.g. on a TV) increase the safe area padding. Covers popups/tooltips as well regular windows. |     DisplaySafeAreaPadding  = ImVec2(3,3);      // If you cannot see the edge of your screen (e.g. on a TV) increase the safe area padding. Covers popups/tooltips as well regular windows. | ||||||
|     MouseCursorScale        = 1.0f;             // Scale software rendered mouse cursor (when io.MouseDrawCursor is enabled). May be removed later. |     MouseCursorScale        = 1.0f;             // Scale software rendered mouse cursor (when io.MouseDrawCursor is enabled). May be removed later. | ||||||
|     AntiAliasedLines        = true;             // Enable anti-aliased lines/borders. Disable if you are really tight on CPU/GPU. |     AntiAliasedLines        = true;             // Enable anti-aliased lines/borders. Disable if you are really tight on CPU/GPU. | ||||||
|     AntiAliasedLinesUseTex  = true;             // Enable anti-aliased lines/borders using textures where possible. Requires back-end to render with bilinear filtering. |     AntiAliasedLinesUseTex  = true;             // Enable anti-aliased lines/borders using textures where possible. Require back-end to render with bilinear filtering. | ||||||
|     AntiAliasedFill         = true;             // Enable anti-aliased filled shapes (rounded rectangles, circles, etc.). |     AntiAliasedFill         = true;             // Enable anti-aliased filled shapes (rounded rectangles, circles, etc.). | ||||||
|     CurveTessellationTol    = 1.25f;            // Tessellation tolerance when using PathBezierCurveTo() without a specific number of segments. Decrease for highly tessellated curves (higher quality, more polygons), increase to reduce quality. |     CurveTessellationTol    = 1.25f;            // Tessellation tolerance when using PathBezierCurveTo() without a specific number of segments. Decrease for highly tessellated curves (higher quality, more polygons), increase to reduce quality. | ||||||
|     CircleSegmentMaxError   = 1.60f;            // Maximum error (in pixels) allowed when using AddCircle()/AddCircleFilled() or drawing rounded corner rectangles with no explicit segment count specified. Decrease for higher quality but more geometry. |     CircleSegmentMaxError   = 1.60f;            // Maximum error (in pixels) allowed when using AddCircle()/AddCircleFilled() or drawing rounded corner rectangles with no explicit segment count specified. Decrease for higher quality but more geometry. | ||||||
| @@ -3689,7 +3689,7 @@ void ImGui::NewFrame() | |||||||
|     g.DrawListSharedData.InitialFlags = ImDrawListFlags_None; |     g.DrawListSharedData.InitialFlags = ImDrawListFlags_None; | ||||||
|     if (g.Style.AntiAliasedLines) |     if (g.Style.AntiAliasedLines) | ||||||
|         g.DrawListSharedData.InitialFlags |= ImDrawListFlags_AntiAliasedLines; |         g.DrawListSharedData.InitialFlags |= ImDrawListFlags_AntiAliasedLines; | ||||||
|     if (g.Style.AntiAliasedLinesUseTex && !(g.Font->ContainerAtlas->Flags & ImFontAtlasFlags_NoAntiAliasedLines)) |     if (g.Style.AntiAliasedLinesUseTex && !(g.Font->ContainerAtlas->Flags & ImFontAtlasFlags_NoBakedLines)) | ||||||
|         g.DrawListSharedData.InitialFlags |= ImDrawListFlags_AntiAliasedLinesUseTex; |         g.DrawListSharedData.InitialFlags |= ImDrawListFlags_AntiAliasedLinesUseTex; | ||||||
|     if (g.Style.AntiAliasedFill) |     if (g.Style.AntiAliasedFill) | ||||||
|         g.DrawListSharedData.InitialFlags |= ImDrawListFlags_AntiAliasedFill; |         g.DrawListSharedData.InitialFlags |= ImDrawListFlags_AntiAliasedFill; | ||||||
| @@ -6161,7 +6161,7 @@ void ImGui::SetCurrentFont(ImFont* font) | |||||||
|  |  | ||||||
|     ImFontAtlas* atlas = g.Font->ContainerAtlas; |     ImFontAtlas* atlas = g.Font->ContainerAtlas; | ||||||
|     g.DrawListSharedData.TexUvWhitePixel = atlas->TexUvWhitePixel; |     g.DrawListSharedData.TexUvWhitePixel = atlas->TexUvWhitePixel; | ||||||
|     g.DrawListSharedData.TexUvAALines = atlas->TexUvAALines; |     g.DrawListSharedData.TexUvLines = atlas->TexUvLines; | ||||||
|     g.DrawListSharedData.Font = g.Font; |     g.DrawListSharedData.Font = g.Font; | ||||||
|     g.DrawListSharedData.FontSize = g.FontSize; |     g.DrawListSharedData.FontSize = g.FontSize; | ||||||
| } | } | ||||||
|   | |||||||
							
								
								
									
										28
									
								
								imgui.h
									
									
									
									
									
								
							
							
						
						
									
										28
									
								
								imgui.h
									
									
									
									
									
								
							| @@ -60,7 +60,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.78 WIP" | #define IMGUI_VERSION               "1.78 WIP" | ||||||
| #define IMGUI_VERSION_NUM           17702 | #define IMGUI_VERSION_NUM           17703 | ||||||
| #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) | ||||||
| @@ -1438,9 +1438,9 @@ struct ImGuiStyle | |||||||
|     ImVec2      DisplayWindowPadding;       // Window position are clamped to be visible within the display area by at least this amount. Only applies to regular windows. |     ImVec2      DisplayWindowPadding;       // Window position are clamped to be visible within the display area by at least this amount. Only applies to regular windows. | ||||||
|     ImVec2      DisplaySafeAreaPadding;     // If you cannot see the edges of your screen (e.g. on a TV) increase the safe area padding. Apply to popups/tooltips as well regular windows. NB: Prefer configuring your TV sets correctly! |     ImVec2      DisplaySafeAreaPadding;     // If you cannot see the edges of your screen (e.g. on a TV) increase the safe area padding. Apply to popups/tooltips as well regular windows. NB: Prefer configuring your TV sets correctly! | ||||||
|     float       MouseCursorScale;           // Scale software rendered mouse cursor (when io.MouseDrawCursor is enabled). May be removed later. |     float       MouseCursorScale;           // Scale software rendered mouse cursor (when io.MouseDrawCursor is enabled). May be removed later. | ||||||
|     bool        AntiAliasedLines;           // Enable anti-aliased lines/borders. Disable if you are really tight on CPU/GPU. |     bool        AntiAliasedLines;           // Enable anti-aliased lines/borders. Disable if you are really tight on CPU/GPU. Latched at the beginning of the frame (copied to ImDrawList). | ||||||
|     bool        AntiAliasedLinesUseTex;     // Enable anti-aliased lines/borders using textures where possible. Requires back-end to render with bilinear filtering. |     bool        AntiAliasedLinesUseTex;     // Enable anti-aliased lines/borders using textures where possible. Require back-end to render with bilinear filtering. Latched at the beginning of the frame (copied to ImDrawList). | ||||||
|     bool        AntiAliasedFill;            // Enable anti-aliased edges around filled shapes (rounded rectangles, circles, etc.). Disable if you are really tight on CPU/GPU. |     bool        AntiAliasedFill;            // Enable anti-aliased edges around filled shapes (rounded rectangles, circles, etc.). Disable if you are really tight on CPU/GPU. Latched at the beginning of the frame (copied to ImDrawList). | ||||||
|     float       CurveTessellationTol;       // Tessellation tolerance when using PathBezierCurveTo() without a specific number of segments. Decrease for highly tessellated curves (higher quality, more polygons), increase to reduce quality. |     float       CurveTessellationTol;       // Tessellation tolerance when using PathBezierCurveTo() without a specific number of segments. Decrease for highly tessellated curves (higher quality, more polygons), increase to reduce quality. | ||||||
|     float       CircleSegmentMaxError;      // Maximum error (in pixels) allowed when using AddCircle()/AddCircleFilled() or drawing rounded corner rectangles with no explicit segment count specified. Decrease for higher quality but more geometry. |     float       CircleSegmentMaxError;      // Maximum error (in pixels) allowed when using AddCircle()/AddCircleFilled() or drawing rounded corner rectangles with no explicit segment count specified. Decrease for higher quality but more geometry. | ||||||
|     ImVec4      Colors[ImGuiCol_COUNT]; |     ImVec4      Colors[ImGuiCol_COUNT]; | ||||||
| @@ -1897,9 +1897,9 @@ struct ImColor | |||||||
| // Hold a series of drawing commands. The user provides a renderer for ImDrawData which essentially contains an array of ImDrawList. | // Hold a series of drawing commands. The user provides a renderer for ImDrawData which essentially contains an array of ImDrawList. | ||||||
| //----------------------------------------------------------------------------- | //----------------------------------------------------------------------------- | ||||||
|  |  | ||||||
| // The maximum line width to bake anti-aliased textures for. Build atlas with ImFontAtlasFlags_NoAALines to disable baking. | // The maximum line width to bake anti-aliased textures for. Build atlas with ImFontAtlasFlags_NoBakedLines to disable baking. | ||||||
| #ifndef IM_DRAWLIST_TEX_AA_LINES_WIDTH_MAX | #ifndef IM_DRAWLIST_TEX_LINES_WIDTH_MAX | ||||||
| #define IM_DRAWLIST_TEX_AA_LINES_WIDTH_MAX      (63) | #define IM_DRAWLIST_TEX_LINES_WIDTH_MAX     (63) | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| // ImDrawCallback: Draw callbacks for advanced uses [configurable type: override in imconfig.h] | // ImDrawCallback: Draw callbacks for advanced uses [configurable type: override in imconfig.h] | ||||||
| @@ -1998,14 +1998,14 @@ enum ImDrawCornerFlags_ | |||||||
|     ImDrawCornerFlags_All       = 0xF     // In your function calls you may use ~0 (= all bits sets) instead of ImDrawCornerFlags_All, as a convenience |     ImDrawCornerFlags_All       = 0xF     // In your function calls you may use ~0 (= all bits sets) instead of ImDrawCornerFlags_All, as a convenience | ||||||
| }; | }; | ||||||
|  |  | ||||||
| #define IMGUI_HAS_TEXLINES      1 | // Flags for ImDrawList. Those are set automatically by ImGui:: functions from ImGuiIO settings, and generally not manipulated directly. | ||||||
|  | // It is however possible to temporarily alter flags between calls to ImDrawList:: functions. | ||||||
| enum ImDrawListFlags_ | enum ImDrawListFlags_ | ||||||
| { | { | ||||||
|     ImDrawListFlags_None                    = 0, |     ImDrawListFlags_None                    = 0, | ||||||
|     ImDrawListFlags_AntiAliasedLines        = 1 << 0,  // Enable anti-aliased lines/borders (*2 the number of triangles for 1.0f wide line or lines thin enough to be drawn using textures, otherwise *3 the number of triangles) |     ImDrawListFlags_AntiAliasedLines        = 1 << 0,  // Enable anti-aliased lines/borders (*2 the number of triangles for 1.0f wide line or lines thin enough to be drawn using textures, otherwise *3 the number of triangles) | ||||||
|     ImDrawListFlags_AntiAliasedFill         = 1 << 1,  // Enable anti-aliased edge around filled shapes (rounded rectangles, circles). |     ImDrawListFlags_AntiAliasedLinesUseTex  = 1 << 1,  // Enable anti-aliased lines/borders using textures when possible. Require back-end to render with bilinear filtering. | ||||||
|     ImDrawListFlags_AntiAliasedLinesUseTex  = 1 << 2,  // Should anti-aliased lines be drawn using textures where possible? |     ImDrawListFlags_AntiAliasedFill         = 1 << 2,  // Enable anti-aliased edge around filled shapes (rounded rectangles, circles). | ||||||
|     ImDrawListFlags_AllowVtxOffset          = 1 << 3   // Can emit 'VtxOffset > 0' to allow large meshes. Set when 'ImGuiBackendFlags_RendererHasVtxOffset' is enabled. |     ImDrawListFlags_AllowVtxOffset          = 1 << 3   // Can emit 'VtxOffset > 0' to allow large meshes. Set when 'ImGuiBackendFlags_RendererHasVtxOffset' is enabled. | ||||||
| }; | }; | ||||||
|  |  | ||||||
| @@ -2226,7 +2226,7 @@ enum ImFontAtlasFlags_ | |||||||
|     ImFontAtlasFlags_None               = 0, |     ImFontAtlasFlags_None               = 0, | ||||||
|     ImFontAtlasFlags_NoPowerOfTwoHeight = 1 << 0,   // Don't round the height to next power of two |     ImFontAtlasFlags_NoPowerOfTwoHeight = 1 << 0,   // Don't round the height to next power of two | ||||||
|     ImFontAtlasFlags_NoMouseCursors     = 1 << 1,   // Don't build software mouse cursors into the atlas (save a little texture memory) |     ImFontAtlasFlags_NoMouseCursors     = 1 << 1,   // Don't build software mouse cursors into the atlas (save a little texture memory) | ||||||
|     ImFontAtlasFlags_NoAntiAliasedLines = 1 << 2    // Don't build anti-aliased line textures into the atlas (save a little texture memory). They will be rendered using polygons (a little bit more expensive) |     ImFontAtlasFlags_NoBakedLines       = 1 << 2    // Don't build thick line textures into the atlas (save a little texture memory). The AntiAliasedLinesUseTex features uses them, otherwise they will be rendered using polygons (more expensive for CPU/GPU). | ||||||
| }; | }; | ||||||
|  |  | ||||||
| // Load and rasterize multiple TTF/OTF fonts into a same texture. The font atlas will build a single texture holding: | // Load and rasterize multiple TTF/OTF fonts into a same texture. The font atlas will build a single texture holding: | ||||||
| @@ -2327,11 +2327,11 @@ struct ImFontAtlas | |||||||
|     ImVector<ImFont*>           Fonts;              // Hold all the fonts returned by AddFont*. Fonts[0] is the default font upon calling ImGui::NewFrame(), use ImGui::PushFont()/PopFont() to change the current font. |     ImVector<ImFont*>           Fonts;              // Hold all the fonts returned by AddFont*. Fonts[0] is the default font upon calling ImGui::NewFrame(), use ImGui::PushFont()/PopFont() to change the current font. | ||||||
|     ImVector<ImFontAtlasCustomRect> CustomRects;    // Rectangles for packing custom texture data into the atlas. |     ImVector<ImFontAtlasCustomRect> CustomRects;    // Rectangles for packing custom texture data into the atlas. | ||||||
|     ImVector<ImFontConfig>      ConfigData;         // Configuration data |     ImVector<ImFontConfig>      ConfigData;         // Configuration data | ||||||
|     ImVec4                      TexUvAALines[IM_DRAWLIST_TEX_AA_LINES_WIDTH_MAX + 1];   // UVs for anti-aliased line textures |     ImVec4                      TexUvLines[IM_DRAWLIST_TEX_LINES_WIDTH_MAX + 1];  // UVs for baked anti-aliased lines | ||||||
|  |  | ||||||
|     // [Internal] Packing data |     // [Internal] Packing data | ||||||
|     int                         PackIdMouseCursors; // Custom texture rectangle ID for white pixel and mouse cursors |     int                         PackIdMouseCursors; // Custom texture rectangle ID for white pixel and mouse cursors | ||||||
|     int                         PackIdAALines;      // Custom texture rectangle ID for anti-aliased lines |     int                         PackIdLines;        // Custom texture rectangle ID for baked anti-aliased lines | ||||||
|  |  | ||||||
| #ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS | #ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS | ||||||
|     typedef ImFontAtlasCustomRect    CustomRect;         // OBSOLETED in 1.72+ |     typedef ImFontAtlasCustomRect    CustomRect;         // OBSOLETED in 1.72+ | ||||||
|   | |||||||
| @@ -3832,7 +3832,7 @@ void ImGui::ShowStyleEditor(ImGuiStyle* ref) | |||||||
|             ImGui::Checkbox("Anti-aliased lines", &style.AntiAliasedLines); |             ImGui::Checkbox("Anti-aliased lines", &style.AntiAliasedLines); | ||||||
|             ImGui::SameLine(); HelpMarker("When disabling anti-aliasing lines, you'll probably want to disable borders in your style as well."); |             ImGui::SameLine(); HelpMarker("When disabling anti-aliasing lines, you'll probably want to disable borders in your style as well."); | ||||||
|             ImGui::Checkbox("Anti-aliased lines use texture", &style.AntiAliasedLinesUseTex); |             ImGui::Checkbox("Anti-aliased lines use texture", &style.AntiAliasedLinesUseTex); | ||||||
|             ImGui::SameLine(); HelpMarker("Faster lines using texture data. Requires texture to use bilinear sampling (not nearest)."); |             ImGui::SameLine(); HelpMarker("Faster lines using texture data. Require back-end to render with bilinear filtering (not point/nearest filtering)."); | ||||||
|             ImGui::Checkbox("Anti-aliased fill", &style.AntiAliasedFill); |             ImGui::Checkbox("Anti-aliased fill", &style.AntiAliasedFill); | ||||||
|             ImGui::PushItemWidth(100); |             ImGui::PushItemWidth(100); | ||||||
|             ImGui::DragFloat("Curve Tessellation Tolerance", &style.CurveTessellationTol, 0.02f, 0.10f, 10.0f, "%.2f"); |             ImGui::DragFloat("Curve Tessellation Tolerance", &style.CurveTessellationTol, 0.02f, 0.10f, 10.0f, "%.2f"); | ||||||
|   | |||||||
| @@ -358,7 +358,7 @@ ImDrawListSharedData::ImDrawListSharedData() | |||||||
|         ArcFastVtx[i] = ImVec2(ImCos(a), ImSin(a)); |         ArcFastVtx[i] = ImVec2(ImCos(a), ImSin(a)); | ||||||
|     } |     } | ||||||
|     memset(CircleSegmentCounts, 0, sizeof(CircleSegmentCounts)); // This will be set by SetCircleSegmentMaxError() |     memset(CircleSegmentCounts, 0, sizeof(CircleSegmentCounts)); // This will be set by SetCircleSegmentMaxError() | ||||||
|     TexUvAALines = NULL; |     TexUvLines = NULL; | ||||||
| } | } | ||||||
|  |  | ||||||
| void ImDrawListSharedData::SetCircleSegmentMaxError(float max_error) | void ImDrawListSharedData::SetCircleSegmentMaxError(float max_error) | ||||||
| @@ -681,11 +681,13 @@ void ImDrawList::AddPolyline(const ImVec2* points, const int points_count, ImU32 | |||||||
|         const int integer_thickness = (int)thickness; |         const int integer_thickness = (int)thickness; | ||||||
|         const float fractional_thickness = thickness - integer_thickness; |         const float fractional_thickness = thickness - integer_thickness; | ||||||
|  |  | ||||||
|         // Do we want to draw this line using a texture? (for now, only draw integer-width lines using textures to avoid issues with the way scaling occurs) |         // Do we want to draw this line using a texture? | ||||||
|         const bool use_texture = (Flags & ImDrawListFlags_AntiAliasedLinesUseTex) && (integer_thickness < IM_DRAWLIST_TEX_AA_LINES_WIDTH_MAX) && (fractional_thickness >= -0.00001f) && (fractional_thickness <= 0.00001f); |         // - For now, only draw integer-width lines using textures to avoid issues with the way scaling occurs, could be improved. | ||||||
|  |         // - If AA_SIZE is not 1.0f we cannot use the texture path. | ||||||
|  |         const bool use_texture = (Flags & ImDrawListFlags_AntiAliasedLinesUseTex) && (integer_thickness < IM_DRAWLIST_TEX_LINES_WIDTH_MAX) && (fractional_thickness <= 0.00001f); | ||||||
|  |  | ||||||
|         // We should never hit this, because NewFrame() doesn't set ImDrawListFlags_AntiAliasedLinesUseTexData unless ImFontAtlasFlags_NoAALines is off |         // We should never hit this, because NewFrame() doesn't set ImDrawListFlags_AntiAliasedLinesUseTex unless ImFontAtlasFlags_NoBakedLines is off | ||||||
|         IM_ASSERT_PARANOID((!use_texture) || (!(_Data->Font->ContainerAtlas->Flags & ImFontAtlasFlags_NoAALines))); |         IM_ASSERT_PARANOID(!use_texture || !(_Data->Font->ContainerAtlas->Flags & ImFontAtlasFlags_NoBakedLines)); | ||||||
|  |  | ||||||
|         const int idx_count = use_texture ? (count * 6) : (thick_line ? count * 18 : count * 12); |         const int idx_count = use_texture ? (count * 6) : (thick_line ? count * 18 : count * 12); | ||||||
|         const int vtx_count = use_texture ? (points_count * 2) : (thick_line ? points_count * 4 : points_count * 3); |         const int vtx_count = use_texture ? (points_count * 2) : (thick_line ? points_count * 4 : points_count * 3); | ||||||
| @@ -693,7 +695,7 @@ void ImDrawList::AddPolyline(const ImVec2* points, const int points_count, ImU32 | |||||||
|  |  | ||||||
|         // Temporary buffer |         // Temporary buffer | ||||||
|         // The first <points_count> items are normals at each line point, then after that there are either 2 or 4 temp points for each line point |         // The first <points_count> items are normals at each line point, then after that there are either 2 or 4 temp points for each line point | ||||||
|         ImVec2* temp_normals = (ImVec2*)alloca(points_count * ((thick_line && !use_texture) ? 5 : 3) * sizeof(ImVec2)); //-V630 |         ImVec2* temp_normals = (ImVec2*)alloca(points_count * ((use_texture || !thick_line) ? 3 : 5) * sizeof(ImVec2)); //-V630 | ||||||
|         ImVec2* temp_points = temp_normals + points_count; |         ImVec2* temp_points = temp_normals + points_count; | ||||||
|  |  | ||||||
|         // Calculate normals (tangents) for each line segment |         // Calculate normals (tangents) for each line segment | ||||||
| @@ -717,7 +719,7 @@ void ImDrawList::AddPolyline(const ImVec2* points, const int points_count, ImU32 | |||||||
|  |  | ||||||
|             // The width of the geometry we need to draw - this is essentially <thickness> pixels for the line itself, plus one pixel for AA |             // The width of the geometry we need to draw - this is essentially <thickness> pixels for the line itself, plus one pixel for AA | ||||||
|             // We don't use AA_SIZE here because the +1 is tied to the generated texture and so alternate values won't work without changes to that code |             // We don't use AA_SIZE here because the +1 is tied to the generated texture and so alternate values won't work without changes to that code | ||||||
|             const float half_draw_size = use_texture ? ((thickness * 0.5f) + 1) : 1.0f; |             const float half_draw_size = use_texture ? ((thickness * 0.5f) + 1) : AA_SIZE; | ||||||
|  |  | ||||||
|             // If line is not closed, the first and last points need to be generated differently as there are no normals to blend |             // If line is not closed, the first and last points need to be generated differently as there are no normals to blend | ||||||
|             if (!closed) |             if (!closed) | ||||||
| @@ -775,10 +777,10 @@ void ImDrawList::AddPolyline(const ImVec2* points, const int points_count, ImU32 | |||||||
|             if (use_texture) |             if (use_texture) | ||||||
|             { |             { | ||||||
|                 // If we're using textures we only need to emit the left/right edge vertices |                 // If we're using textures we only need to emit the left/right edge vertices | ||||||
|                 ImVec4 tex_uvs = _Data->TexUvAALines[integer_thickness]; |                 ImVec4 tex_uvs = _Data->TexUvLines[integer_thickness]; | ||||||
|                 if (fractional_thickness != 0.0f) |                 if (fractional_thickness != 0.0f) | ||||||
|                 { |                 { | ||||||
|                     const ImVec4 tex_uvs_1 = _Data->TexUvAALines[integer_thickness + 1]; |                     const ImVec4 tex_uvs_1 = _Data->TexUvLines[integer_thickness + 1]; | ||||||
|                     tex_uvs.x = tex_uvs.x + (tex_uvs_1.x - tex_uvs.x) * fractional_thickness; // inlined ImLerp() |                     tex_uvs.x = tex_uvs.x + (tex_uvs_1.x - tex_uvs.x) * fractional_thickness; // inlined ImLerp() | ||||||
|                     tex_uvs.y = tex_uvs.y + (tex_uvs_1.y - tex_uvs.y) * fractional_thickness; |                     tex_uvs.y = tex_uvs.y + (tex_uvs_1.y - tex_uvs.y) * fractional_thickness; | ||||||
|                     tex_uvs.z = tex_uvs.z + (tex_uvs_1.z - tex_uvs.z) * fractional_thickness; |                     tex_uvs.z = tex_uvs.z + (tex_uvs_1.z - tex_uvs.z) * fractional_thickness; | ||||||
| @@ -1719,7 +1721,7 @@ ImFontAtlas::ImFontAtlas() | |||||||
|     TexWidth = TexHeight = 0; |     TexWidth = TexHeight = 0; | ||||||
|     TexUvScale = ImVec2(0.0f, 0.0f); |     TexUvScale = ImVec2(0.0f, 0.0f); | ||||||
|     TexUvWhitePixel = ImVec2(0.0f, 0.0f); |     TexUvWhitePixel = ImVec2(0.0f, 0.0f); | ||||||
|     PackIdMouseCursors = PackIdAALines = -1; |     PackIdMouseCursors = PackIdLines = -1; | ||||||
| } | } | ||||||
|  |  | ||||||
| ImFontAtlas::~ImFontAtlas() | ImFontAtlas::~ImFontAtlas() | ||||||
| @@ -1747,7 +1749,7 @@ void    ImFontAtlas::ClearInputData() | |||||||
|         } |         } | ||||||
|     ConfigData.clear(); |     ConfigData.clear(); | ||||||
|     CustomRects.clear(); |     CustomRects.clear(); | ||||||
|     PackIdMouseCursors = PackIdAALines = -1; |     PackIdMouseCursors = PackIdLines = -1; | ||||||
| } | } | ||||||
|  |  | ||||||
| void    ImFontAtlas::ClearTexData() | void    ImFontAtlas::ClearTexData() | ||||||
| @@ -2387,27 +2389,15 @@ static void ImFontAtlasBuildRenderDefaultTexData(ImFontAtlas* atlas) | |||||||
|     atlas->TexUvWhitePixel = ImVec2((r->X + 0.5f) * atlas->TexUvScale.x, (r->Y + 0.5f) * atlas->TexUvScale.y); |     atlas->TexUvWhitePixel = ImVec2((r->X + 0.5f) * atlas->TexUvScale.x, (r->Y + 0.5f) * atlas->TexUvScale.y); | ||||||
| } | } | ||||||
|  |  | ||||||
| static void ImFontAtlasBuildRegisterAALineCustomRects(ImFontAtlas* atlas) | static void ImFontAtlasBuildRenderLinesTexData(ImFontAtlas* atlas) | ||||||
| { | { | ||||||
|     if (atlas->Flags & ImFontAtlasFlags_NoAntiAliasedLines) |     if (atlas->Flags & ImFontAtlasFlags_NoBakedLines) | ||||||
|         return; |         return; | ||||||
|  |  | ||||||
|     // The +2 here is to give space for the end caps, whilst height +1 is to accommodate the fact we have a zero-width row |  | ||||||
|     atlas->PackIdAALines = atlas->AddCustomRectRegular(IM_DRAWLIST_TEX_AA_LINES_WIDTH_MAX + 2, IM_DRAWLIST_TEX_AA_LINES_WIDTH_MAX + 1); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| static void ImFontAtlasBuildRenderAALinesTexData(ImFontAtlas* atlas) |  | ||||||
| { |  | ||||||
|     IM_ASSERT(atlas->TexPixelsAlpha8 != NULL); |  | ||||||
|     if (atlas->Flags & ImFontAtlasFlags_NoAntiAliasedLines) |  | ||||||
|         return; |  | ||||||
|  |  | ||||||
|     ImFontAtlasCustomRect* r = atlas->GetCustomRectByIndex(atlas->PackIdAALines); |  | ||||||
|     IM_ASSERT(r->IsPacked()); |  | ||||||
|  |  | ||||||
|     // This generates a triangular shape in the texture, with the various line widths stacked on top of each other to allow interpolation between them |     // This generates a triangular shape in the texture, with the various line widths stacked on top of each other to allow interpolation between them | ||||||
|     const int w = atlas->TexWidth; |     ImFontAtlasCustomRect* r = atlas->GetCustomRectByIndex(atlas->PackIdLines); | ||||||
|     for (unsigned int n = 0; n < IM_DRAWLIST_TEX_AA_LINES_WIDTH_MAX + 1; n++) // +1 because of the zero-width row |     IM_ASSERT(r->IsPacked()); | ||||||
|  |     for (unsigned int n = 0; n < IM_DRAWLIST_TEX_LINES_WIDTH_MAX + 1; n++) // +1 because of the zero-width row | ||||||
|     { |     { | ||||||
|         // Each line consists of at least two empty pixels at the ends, with a line of solid pixels in the middle |         // Each line consists of at least two empty pixels at the ends, with a line of solid pixels in the middle | ||||||
|         unsigned int y = n; |         unsigned int y = n; | ||||||
| @@ -2415,30 +2405,18 @@ static void ImFontAtlasBuildRenderAALinesTexData(ImFontAtlas* atlas) | |||||||
|         unsigned int pad_left = (r->Width - line_width) / 2; |         unsigned int pad_left = (r->Width - line_width) / 2; | ||||||
|         unsigned int pad_right = r->Width - (pad_left + line_width); |         unsigned int pad_right = r->Width - (pad_left + line_width); | ||||||
|  |  | ||||||
|         // Make sure we're inside the texture bounds before we start writing pixels |  | ||||||
|         IM_ASSERT_PARANOID(pad_left + line_width + pad_right == r.Width); |  | ||||||
|         IM_ASSERT_PARANOID(y < r.Height); |  | ||||||
|  |  | ||||||
|         // Write each slice |         // Write each slice | ||||||
|         unsigned char* write_ptr = &atlas->TexPixelsAlpha8[r->X + ((r->Y + y) * w)]; |         IM_ASSERT(pad_left + line_width + pad_right == r->Width && y < r->Height); // Make sure we're inside the texture bounds before we start writing pixels | ||||||
|         for (unsigned int x = 0; x < pad_left; x++) |         unsigned char* write_ptr = &atlas->TexPixelsAlpha8[r->X + ((r->Y + y) * atlas->TexWidth)]; | ||||||
|             *(write_ptr++) = 0; |         memset(write_ptr, 0x00, pad_left); | ||||||
|         for (unsigned int x = 0; x < line_width; x++) |         memset(write_ptr + pad_left, 0xFF, line_width); | ||||||
|             *(write_ptr++) = 0xFF; |         memset(write_ptr + pad_left + line_width, 0x00, pad_right); | ||||||
|         for (unsigned int x = 0; x < pad_right; x++) |  | ||||||
|             *(write_ptr++) = 0; |  | ||||||
|  |  | ||||||
|         // Calculate UVs for this line |         // Calculate UVs for this line | ||||||
|         ImFontAtlasCustomRect line_rect = *r; |         ImVec2 uv0 = ImVec2((float)(r->X + pad_left - 1), (float)(r->Y + y)) * atlas->TexUvScale; | ||||||
|         line_rect.X += (unsigned short)(pad_left - 1); |         ImVec2 uv1 = ImVec2((float)(r->X + pad_left + line_width + 1), (float)(r->Y + y + 1)) * atlas->TexUvScale; | ||||||
|         line_rect.Y += (unsigned short)y; |  | ||||||
|         line_rect.Width = (unsigned short)(line_width + 2); |  | ||||||
|         line_rect.Height = 1; |  | ||||||
|  |  | ||||||
|         ImVec2 uv0, uv1; |  | ||||||
|         atlas->CalcCustomRectUV(&line_rect, &uv0, &uv1); |  | ||||||
|         float half_v = (uv0.y + uv1.y) * 0.5f; // Calculate a constant V in the middle of the row to avoid sampling artifacts |         float half_v = (uv0.y + uv1.y) * 0.5f; // Calculate a constant V in the middle of the row to avoid sampling artifacts | ||||||
|         atlas->TexUvAALines[n] = ImVec4(uv0.x, half_v, uv1.x, half_v); |         atlas->TexUvLines[n] = ImVec4(uv0.x, half_v, uv1.x, half_v); | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -2454,15 +2432,22 @@ void ImFontAtlasBuildInit(ImFontAtlas* atlas) | |||||||
|             atlas->PackIdMouseCursors = atlas->AddCustomRectRegular(2, 2); |             atlas->PackIdMouseCursors = atlas->AddCustomRectRegular(2, 2); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     ImFontAtlasBuildRegisterAALineCustomRects(atlas); |     // Register texture region for thick lines | ||||||
|  |     // The +2 here is to give space for the end caps, whilst height +1 is to accommodate the fact we have a zero-width row | ||||||
|  |     if (atlas->PackIdLines < 0) | ||||||
|  |     { | ||||||
|  |         if (!(atlas->Flags & ImFontAtlasFlags_NoBakedLines)) | ||||||
|  |             atlas->PackIdLines = atlas->AddCustomRectRegular(IM_DRAWLIST_TEX_LINES_WIDTH_MAX + 2, IM_DRAWLIST_TEX_LINES_WIDTH_MAX + 1); | ||||||
|  |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| // This is called/shared by both the stb_truetype and the FreeType builder. | // This is called/shared by both the stb_truetype and the FreeType builder. | ||||||
| void ImFontAtlasBuildFinish(ImFontAtlas* atlas) | void ImFontAtlasBuildFinish(ImFontAtlas* atlas) | ||||||
| { | { | ||||||
|     // Render into our custom data blocks |     // Render into our custom data blocks | ||||||
|  |     IM_ASSERT(atlas->TexPixelsAlpha8 != NULL); | ||||||
|     ImFontAtlasBuildRenderDefaultTexData(atlas); |     ImFontAtlasBuildRenderDefaultTexData(atlas); | ||||||
|     ImFontAtlasBuildRenderAALinesTexData(atlas); |     ImFontAtlasBuildRenderLinesTexData(atlas); | ||||||
|  |  | ||||||
|     // Register custom rectangle glyphs |     // Register custom rectangle glyphs | ||||||
|     for (int i = 0; i < atlas->CustomRects.Size; i++) |     for (int i = 0; i < atlas->CustomRects.Size; i++) | ||||||
|   | |||||||
| @@ -544,8 +544,7 @@ struct IMGUI_API ImDrawListSharedData | |||||||
|     // [Internal] Lookup tables |     // [Internal] Lookup tables | ||||||
|     ImVec2          ArcFastVtx[12 * IM_DRAWLIST_ARCFAST_TESSELLATION_MULTIPLIER];  // FIXME: Bake rounded corners fill/borders in atlas |     ImVec2          ArcFastVtx[12 * IM_DRAWLIST_ARCFAST_TESSELLATION_MULTIPLIER];  // FIXME: Bake rounded corners fill/borders in atlas | ||||||
|     ImU8            CircleSegmentCounts[64];    // Precomputed segment count for given radius (array index + 1) before we calculate it dynamically (to avoid calculation overhead) |     ImU8            CircleSegmentCounts[64];    // Precomputed segment count for given radius (array index + 1) before we calculate it dynamically (to avoid calculation overhead) | ||||||
|  |     const ImVec4*   TexUvLines;                 // UV of anti-aliased lines in the atlas | ||||||
|     const ImVec4*   TexUvAALines;               // UV of anti-aliased lines in the atlas |  | ||||||
|  |  | ||||||
|     ImDrawListSharedData(); |     ImDrawListSharedData(); | ||||||
|     void SetCircleSegmentMaxError(float max_error); |     void SetCircleSegmentMaxError(float max_error); | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user