mirror of
				https://github.com/Drezil/imgui.git
				synced 2025-11-03 22:51:06 +01:00 
			
		
		
		
	Internals: rework RenderMouseCursor() signature so we can use it in docking branch more naturally. (Merged from master+ rework for docking)
# Conflicts: # imgui.cpp # imgui_draw.cpp
This commit is contained in:
		
							
								
								
									
										43
									
								
								imgui.cpp
									
									
									
									
									
								
							
							
						
						
									
										43
									
								
								imgui.cpp
									
									
									
									
									
								
							@@ -3249,6 +3249,34 @@ void ImGui::RenderNavHighlight(const ImRect& bb, ImGuiID id, ImGuiNavHighlightFl
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void ImGui::RenderMouseCursor(ImVec2 base_pos, float base_scale, ImGuiMouseCursor mouse_cursor, ImU32 col_fill, ImU32 col_border, ImU32 col_shadow)
 | 
			
		||||
{
 | 
			
		||||
    ImGuiContext& g = *GImGui;
 | 
			
		||||
    IM_ASSERT(mouse_cursor > ImGuiMouseCursor_None && mouse_cursor < ImGuiMouseCursor_COUNT);
 | 
			
		||||
    ImFontAtlas* font_atlas = g.DrawListSharedData.Font->ContainerAtlas;
 | 
			
		||||
    for (int n = 0; n < g.Viewports.Size; n++)
 | 
			
		||||
    {
 | 
			
		||||
        // We scale cursor with current viewport/monitor, however Windows 10 for its own hardware cursor seems to be using a different scale factor.
 | 
			
		||||
        ImVec2 offset, size, uv[4];
 | 
			
		||||
        if (!font_atlas->GetMouseCursorTexData(mouse_cursor, &offset, &size, &uv[0], &uv[2]))
 | 
			
		||||
            continue;
 | 
			
		||||
        ImGuiViewportP* viewport = g.Viewports[n];
 | 
			
		||||
        const ImVec2 pos = base_pos - offset;
 | 
			
		||||
        const float scale = base_scale * viewport->DpiScale;
 | 
			
		||||
        if (!viewport->GetMainRect().Overlaps(ImRect(pos, pos + ImVec2(size.x + 2, size.y + 2) * scale)))
 | 
			
		||||
            continue;
 | 
			
		||||
        ImDrawList* draw_list = GetForegroundDrawList(viewport);
 | 
			
		||||
        ImTextureID tex_id = font_atlas->TexID;
 | 
			
		||||
        draw_list->PushTextureID(tex_id);
 | 
			
		||||
        draw_list->AddImage(tex_id, pos + ImVec2(1, 0) * scale, pos + (ImVec2(1, 0) + size) * scale, uv[2], uv[3], col_shadow);
 | 
			
		||||
        draw_list->AddImage(tex_id, pos + ImVec2(2, 0) * scale, pos + (ImVec2(2, 0) + size) * scale, uv[2], uv[3], col_shadow);
 | 
			
		||||
        draw_list->AddImage(tex_id, pos,                        pos + size * scale,                  uv[2], uv[3], col_border);
 | 
			
		||||
        draw_list->AddImage(tex_id, pos,                        pos + size * scale,                  uv[0], uv[1], col_fill);
 | 
			
		||||
        draw_list->PopTextureID();
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
//-----------------------------------------------------------------------------
 | 
			
		||||
// [SECTION] MAIN CODE (most of the code! lots of stuff, needs tidying up!)
 | 
			
		||||
//-----------------------------------------------------------------------------
 | 
			
		||||
@@ -5129,9 +5157,9 @@ void ImGui::Render()
 | 
			
		||||
    if (first_render_of_frame)
 | 
			
		||||
        RenderDimmedBackgrounds();
 | 
			
		||||
 | 
			
		||||
    ImVec2 mouse_cursor_offset, mouse_cursor_size, mouse_cursor_uv[4];
 | 
			
		||||
    if (g.IO.MouseDrawCursor && g.MouseCursor != ImGuiMouseCursor_None)
 | 
			
		||||
        g.IO.Fonts->GetMouseCursorTexData(g.MouseCursor, &mouse_cursor_offset, &mouse_cursor_size, &mouse_cursor_uv[0], &mouse_cursor_uv[2]);
 | 
			
		||||
    // Draw software mouse cursor if requested by io.MouseDrawCursor flag
 | 
			
		||||
    if (g.IO.MouseDrawCursor && first_render_of_frame && g.MouseCursor != ImGuiMouseCursor_None)
 | 
			
		||||
        RenderMouseCursor(g.IO.MousePos, g.Style.MouseCursorScale, g.MouseCursor, IM_COL32_WHITE, IM_COL32_BLACK, IM_COL32(0, 0, 0, 48));
 | 
			
		||||
 | 
			
		||||
    // Setup ImDrawData structures for end-user
 | 
			
		||||
    g.IO.MetricsRenderVertices = g.IO.MetricsRenderIndices = 0;
 | 
			
		||||
@@ -5140,15 +5168,6 @@ void ImGui::Render()
 | 
			
		||||
        ImGuiViewportP* viewport = g.Viewports[n];
 | 
			
		||||
        viewport->DrawDataBuilder.FlattenIntoSingleLayer();
 | 
			
		||||
 | 
			
		||||
        // Draw software mouse cursor if requested by io.MouseDrawCursor flag
 | 
			
		||||
        // (note we scale cursor by current viewport/monitor, however Windows 10 for its own hardware cursor seems to be using a different scale factor)
 | 
			
		||||
        if (mouse_cursor_size.x > 0.0f && mouse_cursor_size.y > 0.0f && first_render_of_frame)
 | 
			
		||||
        {
 | 
			
		||||
            float scale = g.Style.MouseCursorScale * viewport->DpiScale;
 | 
			
		||||
            if (viewport->GetMainRect().Overlaps(ImRect(g.IO.MousePos, g.IO.MousePos + ImVec2(mouse_cursor_size.x + 2, mouse_cursor_size.y + 2) * scale)))
 | 
			
		||||
                RenderMouseCursor(GetForegroundDrawList(viewport), g.IO.MousePos, scale, g.MouseCursor, IM_COL32_WHITE, IM_COL32_BLACK, IM_COL32(0, 0, 0, 48));
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // Add foreground ImDrawList (for each active viewport)
 | 
			
		||||
        if (viewport->DrawLists[1] != NULL)
 | 
			
		||||
            AddDrawListToDrawData(&viewport->DrawDataBuilder.Layers[0], GetForegroundDrawList(viewport));
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										2
									
								
								imgui.h
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								imgui.h
									
									
									
									
									
								
							@@ -65,7 +65,7 @@ Index of this file:
 | 
			
		||||
// 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)
 | 
			
		||||
#define IMGUI_VERSION               "1.87"
 | 
			
		||||
#define IMGUI_VERSION_NUM           18700
 | 
			
		||||
#define IMGUI_VERSION_NUM           18701
 | 
			
		||||
#define IMGUI_CHECKVERSION()        ImGui::DebugCheckVersionAndDataLayout(IMGUI_VERSION, sizeof(ImGuiIO), sizeof(ImGuiStyle), sizeof(ImVec2), sizeof(ImVec4), sizeof(ImDrawVert), sizeof(ImDrawIdx))
 | 
			
		||||
#define IMGUI_HAS_TABLE
 | 
			
		||||
#define IMGUI_HAS_VIEWPORT          // Viewport WIP branch
 | 
			
		||||
 
 | 
			
		||||
@@ -3744,7 +3744,6 @@ void ImFont::RenderText(ImDrawList* draw_list, float size, ImVec2 pos, ImU32 col
 | 
			
		||||
// - RenderArrow()
 | 
			
		||||
// - RenderBullet()
 | 
			
		||||
// - RenderCheckMark()
 | 
			
		||||
// - RenderMouseCursor()
 | 
			
		||||
// - RenderArrowDockMenu()
 | 
			
		||||
// - RenderArrowPointingAt()
 | 
			
		||||
// - RenderRectFilledRangeH()
 | 
			
		||||
@@ -3806,27 +3805,6 @@ void ImGui::RenderCheckMark(ImDrawList* draw_list, ImVec2 pos, ImU32 col, float
 | 
			
		||||
    draw_list->PathStroke(col, 0, thickness);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void ImGui::RenderMouseCursor(ImDrawList* draw_list, ImVec2 pos, float scale, ImGuiMouseCursor mouse_cursor, ImU32 col_fill, ImU32 col_border, ImU32 col_shadow)
 | 
			
		||||
{
 | 
			
		||||
    if (mouse_cursor == ImGuiMouseCursor_None)
 | 
			
		||||
        return;
 | 
			
		||||
    IM_ASSERT(mouse_cursor > ImGuiMouseCursor_None && mouse_cursor < ImGuiMouseCursor_COUNT);
 | 
			
		||||
 | 
			
		||||
    ImFontAtlas* font_atlas = draw_list->_Data->Font->ContainerAtlas;
 | 
			
		||||
    ImVec2 offset, size, uv[4];
 | 
			
		||||
    if (font_atlas->GetMouseCursorTexData(mouse_cursor, &offset, &size, &uv[0], &uv[2]))
 | 
			
		||||
    {
 | 
			
		||||
        pos -= offset;
 | 
			
		||||
        ImTextureID tex_id = font_atlas->TexID;
 | 
			
		||||
        draw_list->PushTextureID(tex_id);
 | 
			
		||||
        draw_list->AddImage(tex_id, pos + ImVec2(1, 0) * scale, pos + (ImVec2(1, 0) + size) * scale,    uv[2], uv[3], col_shadow);
 | 
			
		||||
        draw_list->AddImage(tex_id, pos + ImVec2(2, 0) * scale, pos + (ImVec2(2, 0) + size) * scale,    uv[2], uv[3], col_shadow);
 | 
			
		||||
        draw_list->AddImage(tex_id, pos,                        pos + size * scale,                     uv[2], uv[3], col_border);
 | 
			
		||||
        draw_list->AddImage(tex_id, pos,                        pos + size * scale,                     uv[0], uv[1], col_fill);
 | 
			
		||||
        draw_list->PopTextureID();
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Render an arrow. 'pos' is position of the arrow tip. half_sz.x is length from base to tip. half_sz.y is length on each side.
 | 
			
		||||
void ImGui::RenderArrowPointingAt(ImDrawList* draw_list, ImVec2 pos, ImVec2 half_sz, ImGuiDir direction, ImU32 col)
 | 
			
		||||
{
 | 
			
		||||
 
 | 
			
		||||
@@ -3051,12 +3051,12 @@ namespace ImGui
 | 
			
		||||
    IMGUI_API void          RenderColorRectWithAlphaCheckerboard(ImDrawList* draw_list, ImVec2 p_min, ImVec2 p_max, ImU32 fill_col, float grid_step, ImVec2 grid_off, float rounding = 0.0f, ImDrawFlags flags = 0);
 | 
			
		||||
    IMGUI_API void          RenderNavHighlight(const ImRect& bb, ImGuiID id, ImGuiNavHighlightFlags flags = ImGuiNavHighlightFlags_TypeDefault); // Navigation highlight
 | 
			
		||||
    IMGUI_API const char*   FindRenderedTextEnd(const char* text, const char* text_end = NULL); // Find the optional ## from which we stop displaying text.
 | 
			
		||||
    IMGUI_API void          RenderMouseCursor(ImVec2 pos, float scale, ImGuiMouseCursor mouse_cursor, ImU32 col_fill, ImU32 col_border, ImU32 col_shadow);
 | 
			
		||||
 | 
			
		||||
    // Render helpers (those functions don't access any ImGui state!)
 | 
			
		||||
    IMGUI_API void          RenderArrow(ImDrawList* draw_list, ImVec2 pos, ImU32 col, ImGuiDir dir, float scale = 1.0f);
 | 
			
		||||
    IMGUI_API void          RenderBullet(ImDrawList* draw_list, ImVec2 pos, ImU32 col);
 | 
			
		||||
    IMGUI_API void          RenderCheckMark(ImDrawList* draw_list, ImVec2 pos, ImU32 col, float sz);
 | 
			
		||||
    IMGUI_API void          RenderMouseCursor(ImDrawList* draw_list, ImVec2 pos, float scale, ImGuiMouseCursor mouse_cursor, ImU32 col_fill, ImU32 col_border, ImU32 col_shadow);
 | 
			
		||||
    IMGUI_API void          RenderArrowPointingAt(ImDrawList* draw_list, ImVec2 pos, ImVec2 half_sz, ImGuiDir direction, ImU32 col);
 | 
			
		||||
    IMGUI_API void          RenderArrowDockMenu(ImDrawList* draw_list, ImVec2 p_min, float sz, ImU32 col);
 | 
			
		||||
    IMGUI_API void          RenderRectFilledRangeH(ImDrawList* draw_list, const ImRect& rect, ImU32 col, float x_start_norm, float x_end_norm, float rounding);
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user