mirror of https://github.com/ocornut/imgui
ImDrawList: Internals: Add ability to scale anti-alias fringe. This enable users to keep geometry sharp while scaling vertex buffer content.
This commit is contained in:
parent
9bcf77eb81
commit
94a432275b
1
imgui.h
1
imgui.h
|
@ -2333,6 +2333,7 @@ struct ImDrawList
|
||||||
ImVector<ImVec2> _Path; // [Internal] current path building
|
ImVector<ImVec2> _Path; // [Internal] current path building
|
||||||
ImDrawCmdHeader _CmdHeader; // [Internal] template of active commands. Fields should match those of CmdBuffer.back().
|
ImDrawCmdHeader _CmdHeader; // [Internal] template of active commands. Fields should match those of CmdBuffer.back().
|
||||||
ImDrawListSplitter _Splitter; // [Internal] for channels api (note: prefer using your own persistent instance of ImDrawListSplitter!)
|
ImDrawListSplitter _Splitter; // [Internal] for channels api (note: prefer using your own persistent instance of ImDrawListSplitter!)
|
||||||
|
float _FringeScale; // [Internal] anti-alias fringe is scaled by this value, this helps to keep things sharp while zooming at vertex buffer content
|
||||||
|
|
||||||
// If you want to create ImDrawList instances, pass them ImGui::GetDrawListSharedData() or create and use your own ImDrawListSharedData (so you can use ImDrawList without ImGui)
|
// If you want to create ImDrawList instances, pass them ImGui::GetDrawListSharedData() or create and use your own ImDrawListSharedData (so you can use ImDrawList without ImGui)
|
||||||
ImDrawList(const ImDrawListSharedData* shared_data) { memset(this, 0, sizeof(*this)); _Data = shared_data; }
|
ImDrawList(const ImDrawListSharedData* shared_data) { memset(this, 0, sizeof(*this)); _Data = shared_data; }
|
||||||
|
|
|
@ -405,6 +405,7 @@ void ImDrawList::_ResetForNewFrame()
|
||||||
_Path.resize(0);
|
_Path.resize(0);
|
||||||
_Splitter.Clear();
|
_Splitter.Clear();
|
||||||
CmdBuffer.push_back(ImDrawCmd());
|
CmdBuffer.push_back(ImDrawCmd());
|
||||||
|
_FringeScale = 1.0f;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ImDrawList::_ClearFreeMemory()
|
void ImDrawList::_ClearFreeMemory()
|
||||||
|
@ -680,12 +681,12 @@ void ImDrawList::AddPolyline(const ImVec2* points, const int points_count, ImU32
|
||||||
|
|
||||||
const ImVec2 opaque_uv = _Data->TexUvWhitePixel;
|
const ImVec2 opaque_uv = _Data->TexUvWhitePixel;
|
||||||
const int count = closed ? points_count : points_count - 1; // The number of line segments we need to draw
|
const int count = closed ? points_count : points_count - 1; // The number of line segments we need to draw
|
||||||
const bool thick_line = (thickness > 1.0f);
|
const bool thick_line = (thickness > _FringeScale);
|
||||||
|
|
||||||
if (Flags & ImDrawListFlags_AntiAliasedLines)
|
if (Flags & ImDrawListFlags_AntiAliasedLines)
|
||||||
{
|
{
|
||||||
// Anti-aliased stroke
|
// Anti-aliased stroke
|
||||||
const float AA_SIZE = 1.0f;
|
const float AA_SIZE = _FringeScale;
|
||||||
const ImU32 col_trans = col & ~IM_COL32_A_MASK;
|
const ImU32 col_trans = col & ~IM_COL32_A_MASK;
|
||||||
|
|
||||||
// Thicknesses <1.0 should behave like thickness 1.0
|
// Thicknesses <1.0 should behave like thickness 1.0
|
||||||
|
@ -696,7 +697,7 @@ void ImDrawList::AddPolyline(const ImVec2* points, const int points_count, ImU32
|
||||||
// Do we want to draw this line using a texture?
|
// 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, could be improved.
|
// - 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.
|
// - 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);
|
const bool use_texture = (Flags & ImDrawListFlags_AntiAliasedLinesUseTex) && (integer_thickness < IM_DRAWLIST_TEX_LINES_WIDTH_MAX) && (fractional_thickness <= 0.00001f) && (AA_SIZE == 1.0f);
|
||||||
|
|
||||||
// We should never hit this, because NewFrame() doesn't set ImDrawListFlags_AntiAliasedLinesUseTex unless ImFontAtlasFlags_NoBakedLines 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_NoBakedLines));
|
IM_ASSERT_PARANOID(!use_texture || !(_Data->Font->ContainerAtlas->Flags & ImFontAtlasFlags_NoBakedLines));
|
||||||
|
@ -938,7 +939,7 @@ void ImDrawList::AddConvexPolyFilled(const ImVec2* points, const int points_coun
|
||||||
if (Flags & ImDrawListFlags_AntiAliasedFill)
|
if (Flags & ImDrawListFlags_AntiAliasedFill)
|
||||||
{
|
{
|
||||||
// Anti-aliased Fill
|
// Anti-aliased Fill
|
||||||
const float AA_SIZE = 1.0f;
|
const float AA_SIZE = _FringeScale;
|
||||||
const ImU32 col_trans = col & ~IM_COL32_A_MASK;
|
const ImU32 col_trans = col & ~IM_COL32_A_MASK;
|
||||||
const int idx_count = (points_count - 2)*3 + points_count * 6;
|
const int idx_count = (points_count - 2)*3 + points_count * 6;
|
||||||
const int vtx_count = (points_count * 2);
|
const int vtx_count = (points_count * 2);
|
||||||
|
|
Loading…
Reference in New Issue