mirror of
				https://github.com/Drezil/imgui.git
				synced 2025-10-30 12:41:06 +01:00 
			
		
		
		
	Added overcomplicated RenderRectFilledRangeH() to fix rounded progress bar, which will also help for range widgets and perhaps sliders grabs over rounded areas. (#1296, #76)
This commit is contained in:
		| @@ -2329,6 +2329,77 @@ void ImFont::RenderText(ImDrawList* draw_list, float size, ImVec2 pos, ImU32 col | ||||
|     draw_list->_VtxCurrentIdx = (unsigned int)draw_list->VtxBuffer.Size; | ||||
| } | ||||
|  | ||||
| //----------------------------------------------------------------------------- | ||||
| // Internals Drawing Helpers | ||||
| //----------------------------------------------------------------------------- | ||||
|  | ||||
| static inline float ImAcos01(float x) | ||||
| { | ||||
|     if (x <= 0.0f) return IM_PI * 0.5f; | ||||
|     if (x >= 1.0f) return 0.0f; | ||||
|     return (-0.69813170079773212f * x * x - 0.87266462599716477f) * x + 1.5707963267948966f; // Cheap approximation, enough for what we do. | ||||
| } | ||||
|  | ||||
| // FIXME: Cleanup and move code to ImDrawList. | ||||
| void ImGui::RenderRectFilledRangeH(ImDrawList* draw_list, const ImRect& rect, ImU32 col, float x_start_norm, float x_end_norm, float rounding) | ||||
| { | ||||
|     if (x_end_norm == x_start_norm) | ||||
|         return; | ||||
|     if (x_start_norm > x_end_norm) | ||||
|         ImSwap(x_start_norm, x_end_norm); | ||||
|  | ||||
|     ImVec2 p0 = ImVec2(ImLerp(rect.Min.x, rect.Max.x, x_start_norm), rect.Min.y); | ||||
|     ImVec2 p1 = ImVec2(ImLerp(rect.Min.x, rect.Max.x, x_end_norm), rect.Max.y); | ||||
|     if (rounding == 0.0f) | ||||
|     { | ||||
|         draw_list->AddRectFilled(p0, p1, col, 0.0f); | ||||
|         return; | ||||
|     } | ||||
|  | ||||
|     rounding = ImClamp(ImMin((rect.Max.x - rect.Min.x) * 0.5f, (rect.Max.y - rect.Min.y) * 0.5f) - 1.0f, 0.0f, rounding); | ||||
|     const float inv_rounding = 1.0f / rounding; | ||||
|     const float arc0_b = ImAcos01(1.0f - (p0.x - rect.Min.x) * inv_rounding); | ||||
|     const float arc0_e = ImAcos01(1.0f - (p1.x - rect.Min.x) * inv_rounding); | ||||
|     const float x0 = ImMax(p0.x, rect.Min.x + rounding); | ||||
|     if (arc0_b == arc0_e) | ||||
|     { | ||||
|         draw_list->PathLineTo(ImVec2(x0, p1.y)); | ||||
|         draw_list->PathLineTo(ImVec2(x0, p0.y)); | ||||
|     } | ||||
|     else if (arc0_b == 0.0f && arc0_e == IM_PI*0.5f) | ||||
|     { | ||||
|         draw_list->PathArcToFast(ImVec2(x0, p1.y - rounding), rounding, 3, 6); // BL | ||||
|         draw_list->PathArcToFast(ImVec2(x0, p0.y + rounding), rounding, 6, 9); // TR | ||||
|     } | ||||
|     else | ||||
|     { | ||||
|         draw_list->PathArcTo(ImVec2(x0, p1.y - rounding), rounding, IM_PI - arc0_e, IM_PI - arc0_b, 3); // BL | ||||
|         draw_list->PathArcTo(ImVec2(x0, p0.y + rounding), rounding, IM_PI + arc0_b, IM_PI + arc0_e, 3); // TR | ||||
|     } | ||||
|     if (p1.x > rect.Min.x + rounding) | ||||
|     { | ||||
|         const float arc1_b = ImAcos01(1.0f - (rect.Max.x - p1.x) * inv_rounding); | ||||
|         const float arc1_e = ImAcos01(1.0f - (rect.Max.x - p0.x) * inv_rounding); | ||||
|         const float x1 = ImMin(p1.x, rect.Max.x - rounding); | ||||
|         if (arc1_b == arc1_e) | ||||
|         { | ||||
|             draw_list->PathLineTo(ImVec2(x1, p0.y)); | ||||
|             draw_list->PathLineTo(ImVec2(x1, p1.y)); | ||||
|         } | ||||
|         else if (arc1_b == 0.0f && arc1_e == IM_PI*0.5f) | ||||
|         { | ||||
|             draw_list->PathArcToFast(ImVec2(x1, p0.y + rounding), rounding, 9, 12); // TR | ||||
|             draw_list->PathArcToFast(ImVec2(x1, p1.y - rounding), rounding, 0, 3);  // BR | ||||
|         } | ||||
|         else | ||||
|         { | ||||
|             draw_list->PathArcTo(ImVec2(x1, p0.y + rounding), rounding, -arc1_e, -arc1_b, 3); // TR | ||||
|             draw_list->PathArcTo(ImVec2(x1, p1.y - rounding), rounding, +arc1_b, +arc1_e, 3); // BR | ||||
|         } | ||||
|     } | ||||
|     draw_list->PathFillConvex(col); | ||||
| } | ||||
|  | ||||
| //----------------------------------------------------------------------------- | ||||
| // DEFAULT FONT DATA | ||||
| //----------------------------------------------------------------------------- | ||||
|   | ||||
| @@ -779,6 +779,7 @@ namespace ImGui | ||||
|     IMGUI_API void          RenderCollapseTriangle(ImVec2 pos, bool is_open, float scale = 1.0f); | ||||
|     IMGUI_API void          RenderBullet(ImVec2 pos); | ||||
|     IMGUI_API void          RenderCheckMark(ImVec2 pos, ImU32 col); | ||||
|     IMGUI_API void          RenderRectFilledRangeH(ImDrawList* draw_list, const ImRect& rect, ImU32 col, float x_start_norm, float x_end_norm, float rounding); | ||||
|     IMGUI_API const char*   FindRenderedTextEnd(const char* text, const char* text_end = NULL); // Find the optional ## from which we stop displaying text. | ||||
|  | ||||
|     IMGUI_API bool          ButtonBehavior(const ImRect& bb, ImGuiID id, bool* out_hovered, bool* out_held, ImGuiButtonFlags flags = 0); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user