diff --git a/profiler/src/main.cpp b/profiler/src/main.cpp index e53f8f13..2ee0ad73 100644 --- a/profiler/src/main.cpp +++ b/profiler/src/main.cpp @@ -1472,9 +1472,11 @@ Would you like to enable achievements? } } } - ImGui::PushFont( g_fonts.normal, FontBig ); - tracy::TextColoredUnformatted( color, ICON_FA_STAR ); - ImGui::PopFont(); + auto draw = ImGui::GetWindowDrawList(); + draw->PushClipRectFullScreen(); + tracy::DrawGlyphTransformed( draw, g_fonts.normal, FontBig, ICON_FA_STAR, cursorScreen, ImVec2( 0.5f, 0.55f ), 0.f, 1.f, color ); + draw->PopClipRect(); + ImGui::Dummy( starSize ); if( aItem ) { diff --git a/profiler/src/profiler/TracyImGui.cpp b/profiler/src/profiler/TracyImGui.cpp index da3efdac..dc028a00 100644 --- a/profiler/src/profiler/TracyImGui.cpp +++ b/profiler/src/profiler/TracyImGui.cpp @@ -30,6 +30,30 @@ void DrawZigZag( ImDrawList* draw, const ImVec2& wpos, double start, double end, draw->AddImage( zigzagTex, wpos + ImVec2( start, -h ), wpos + ImVec2( end, h ), ImVec2( 0, 0 ), ImVec2( v, 1 ), color ); } +void DrawGlyphTransformed( ImDrawList* draw, ImFont* font, float size, const char* icon, const ImVec2& origin, const ImVec2& pivot, float angle, float scale, uint32_t color ) +{ + unsigned int codepoint = 0; + ImTextCharFromUtf8( &codepoint, icon, nullptr ); + + ImFontBaked* baked = font->GetFontBaked( size ); + const ImFontGlyph* glyph = baked->FindGlyph( ( ImWchar )codepoint ); + + const float cx = glyph->X0 + ( glyph->X1 - glyph->X0 ) * pivot.x; + const float cy = glyph->Y0 + ( glyph->Y1 - glyph->Y0 ) * pivot.y; + const float c = cosf( angle ) * scale; + const float s = sinf( angle ) * scale; + const auto pt = [origin, cx, cy, c, s]( float x, float y ) { + const float dx = x - cx; + const float dy = y - cy; + return origin + ImVec2( cx + dx * c - dy * s, cy + dx * s + dy * c ); + }; + + draw->AddImageQuad( font->OwnerAtlas->TexRef, + pt( glyph->X0, glyph->Y0 ), pt( glyph->X1, glyph->Y0 ), pt( glyph->X1, glyph->Y1 ), pt( glyph->X0, glyph->Y1 ), + ImVec2( glyph->U0, glyph->V0 ), ImVec2( glyph->U1, glyph->V0 ), ImVec2( glyph->U1, glyph->V1 ), ImVec2( glyph->U0, glyph->V1 ), + color ); +} + void DrawStripedRect( ImDrawList* draw, const ImVec2& wpos, double x0, double y0, double x1, double y1, double sw, uint32_t color, bool fix_stripes_in_screen_space, bool inverted ) { assert( x1 >= x0 ); diff --git a/profiler/src/profiler/TracyImGui.hpp b/profiler/src/profiler/TracyImGui.hpp index 0d41cf32..83eb820f 100644 --- a/profiler/src/profiler/TracyImGui.hpp +++ b/profiler/src/profiler/TracyImGui.hpp @@ -36,6 +36,7 @@ void DrawHistogramMinMaxLabel( ImDrawList* draw, int64_t tmin, int64_t tmax, ImV void PrintSource( const std::vector& lines ); bool PrintTextWrapped( const char* text, const char* end, bool strikethrough, bool underline ); bool DragHeightSplitter( const char* id, float& height, float minHeight, float maxHeight, float thickness ); +void DrawGlyphTransformed( ImDrawList* draw, ImFont* font, float size, const char* icon, const ImVec2& origin, const ImVec2& pivot, float angle, float scale, uint32_t color ); static constexpr const uint32_t SyntaxColors[] = {