mirror of
				https://github.com/Drezil/imgui.git
				synced 2025-11-04 07:01:04 +01:00 
			
		
		
		
	Demo: added more draw primitives in the Custom Rendering example (#457)
This commit is contained in:
		
							
								
								
									
										129
									
								
								imgui_demo.cpp
									
									
									
									
									
								
							
							
						
						
									
										129
									
								
								imgui_demo.cpp
									
									
									
									
									
								
							@@ -1763,7 +1763,7 @@ static void ShowExampleAppManipulatingWindowTitle(bool* opened)
 | 
			
		||||
 | 
			
		||||
static void ShowExampleAppCustomRendering(bool* opened)
 | 
			
		||||
{
 | 
			
		||||
    ImGui::SetNextWindowSize(ImVec2(300,350), ImGuiSetCond_FirstUseEver);
 | 
			
		||||
    ImGui::SetNextWindowSize(ImVec2(350,560), ImGuiSetCond_FirstUseEver);
 | 
			
		||||
    if (!ImGui::Begin("Example: Custom rendering", opened))
 | 
			
		||||
    {
 | 
			
		||||
        ImGui::End();
 | 
			
		||||
@@ -1773,59 +1773,88 @@ static void ShowExampleAppCustomRendering(bool* opened)
 | 
			
		||||
    // Tip: If you do a lot of custom rendering, you probably want to use your own geometrical types and benefit of overloaded operators, etc.
 | 
			
		||||
    // Define IM_VEC2_CLASS_EXTRA in imconfig.h to create implicit conversions between your types and ImVec2/ImVec4.
 | 
			
		||||
    // ImGui defines overloaded operators but they are internal to imgui.cpp and not exposed outside (to avoid messing with your types)
 | 
			
		||||
    // In this example we aren't using the operators.
 | 
			
		||||
 | 
			
		||||
    static ImVector<ImVec2> points;
 | 
			
		||||
    static bool adding_line = false;
 | 
			
		||||
    if (ImGui::Button("Clear")) points.clear();
 | 
			
		||||
    if (points.Size >= 2) { ImGui::SameLine(); if (ImGui::Button("Undo")) { points.pop_back(); points.pop_back(); } }
 | 
			
		||||
    ImGui::Text("Left-click and drag to add lines");
 | 
			
		||||
    ImGui::Text("Right-click to undo");
 | 
			
		||||
 | 
			
		||||
    // In this example we are not using the maths operators!
 | 
			
		||||
    ImDrawList* draw_list = ImGui::GetWindowDrawList();
 | 
			
		||||
 | 
			
		||||
    // Here we are using InvisibleButton() as a convenience to 1) advance the cursor and 2) allows us to use IsItemHovered()
 | 
			
		||||
    // However you can draw directly and poll mouse/keyboard by yourself. You can manipulate the cursor using GetCursorPos() and SetCursorPos().
 | 
			
		||||
    // If you only use the ImDrawList API, you can notify the owner window of its extends by using SetCursorPos(max).
 | 
			
		||||
    ImVec2 canvas_pos = ImGui::GetCursorScreenPos();            // ImDrawList API uses screen coordinates!
 | 
			
		||||
    ImVec2 canvas_size = ImGui::GetContentRegionAvail();        // Resize canvas to what's available
 | 
			
		||||
    if (canvas_size.x < 50.0f) canvas_size.x = 50.0f;
 | 
			
		||||
    if (canvas_size.y < 50.0f) canvas_size.y = 50.0f;
 | 
			
		||||
    draw_list->AddRectFilledMultiColor(canvas_pos, ImVec2(canvas_pos.x + canvas_size.x, canvas_pos.y + canvas_size.y), ImColor(0,0,0), ImColor(255,0,0), ImColor(255,255,0), ImColor(0,255,0));
 | 
			
		||||
    draw_list->AddRect(canvas_pos, ImVec2(canvas_pos.x + canvas_size.x, canvas_pos.y + canvas_size.y), ImColor(255,255,255));
 | 
			
		||||
 | 
			
		||||
    draw_list->AddBezierCurve(ImVec2(canvas_pos.x+20,canvas_pos.y+20), ImVec2(canvas_pos.x+100,canvas_pos.y+20), ImVec2(canvas_pos.x+canvas_size.x-100,canvas_pos.y+canvas_size.y-20), ImVec2(canvas_pos.x+canvas_size.x-20,canvas_pos.y+canvas_size.y-20), ImColor(255,200,0), 5.0f);
 | 
			
		||||
 | 
			
		||||
    bool adding_preview = false;
 | 
			
		||||
    ImGui::InvisibleButton("canvas", canvas_size);
 | 
			
		||||
    if (ImGui::IsItemHovered())
 | 
			
		||||
    // Primitives
 | 
			
		||||
    ImGui::Text("Primitives");
 | 
			
		||||
    static float sz = 36.0f;
 | 
			
		||||
    static ImVec4 col = ImVec4(1.0f,1.0f,0.4f,1.0f);
 | 
			
		||||
    ImGui::DragFloat("Size", &sz, 0.2f, 1.0f, 72.0f, "%.0f"); 
 | 
			
		||||
    ImGui::ColorEdit3("Color", &col.x);
 | 
			
		||||
    {
 | 
			
		||||
        ImVec2 mouse_pos_in_canvas = ImVec2(ImGui::GetIO().MousePos.x - canvas_pos.x, ImGui::GetIO().MousePos.y - canvas_pos.y);
 | 
			
		||||
        if (!adding_line && ImGui::IsMouseClicked(0))
 | 
			
		||||
        {
 | 
			
		||||
            points.push_back(mouse_pos_in_canvas);
 | 
			
		||||
            adding_line = true;
 | 
			
		||||
        }
 | 
			
		||||
        if (adding_line)
 | 
			
		||||
        {
 | 
			
		||||
            adding_preview = true;
 | 
			
		||||
            points.push_back(mouse_pos_in_canvas);
 | 
			
		||||
            if (!ImGui::GetIO().MouseDown[0])
 | 
			
		||||
                adding_line = adding_preview = false;
 | 
			
		||||
        }
 | 
			
		||||
        if (ImGui::IsMouseClicked(1) && !points.empty())
 | 
			
		||||
        {
 | 
			
		||||
            adding_line = adding_preview = false;
 | 
			
		||||
            points.pop_back();
 | 
			
		||||
            points.pop_back();
 | 
			
		||||
        }
 | 
			
		||||
        const ImVec2 p = ImGui::GetCursorScreenPos();
 | 
			
		||||
        const ImU32 col32 = ImColor(col);
 | 
			
		||||
        float x = p.x + 4.0f, y = p.y + 4.0f, spacing = 8.0f;
 | 
			
		||||
        draw_list->AddCircle(ImVec2(x+sz*0.5f, y+sz*0.5f), sz*0.5f, col32, 32); x += sz+spacing;
 | 
			
		||||
        draw_list->AddRect(ImVec2(x, y), ImVec2(x+sz, y+sz), col32); x += sz+spacing;
 | 
			
		||||
        draw_list->AddRect(ImVec2(x, y), ImVec2(x+sz, y+sz), col32, 10.0f); x += sz+spacing;
 | 
			
		||||
        draw_list->AddLine(ImVec2(x, y), ImVec2(x+sz, y   ), col32); x += sz+spacing;
 | 
			
		||||
        draw_list->AddLine(ImVec2(x, y), ImVec2(x+sz, y+sz), col32); x += sz+spacing;
 | 
			
		||||
        draw_list->AddLine(ImVec2(x, y), ImVec2(x,    y+sz), col32); x += spacing;
 | 
			
		||||
        draw_list->AddBezierCurve(ImVec2(x, y), ImVec2(x+sz*1.3f,y+sz*0.3f), ImVec2(x+sz-sz*1.3f,y+sz-sz*0.3f), ImVec2(x+sz, y+sz), col32, 1.0f);
 | 
			
		||||
        x = p.x + 4;
 | 
			
		||||
        y += sz+spacing;
 | 
			
		||||
        draw_list->AddCircleFilled(ImVec2(x+sz*0.5f, y+sz*0.5f), sz*0.5f, col32, 32); x += sz+spacing;
 | 
			
		||||
        draw_list->AddRectFilled(ImVec2(x, y), ImVec2(x+sz, y+sz), col32); x += sz+spacing;
 | 
			
		||||
        draw_list->AddRectFilled(ImVec2(x, y), ImVec2(x+sz, y+sz), col32, 10.0f); x += sz+spacing;
 | 
			
		||||
        draw_list->AddLine(ImVec2(x, y), ImVec2(x+sz, y   ), col32, 4.0f); x += sz+spacing;
 | 
			
		||||
        draw_list->AddLine(ImVec2(x, y), ImVec2(x+sz, y+sz), col32, 4.0f); x += sz+spacing;
 | 
			
		||||
        draw_list->AddLine(ImVec2(x, y), ImVec2(x,    y+sz), col32, 4.0f); x += spacing;
 | 
			
		||||
        draw_list->AddBezierCurve(ImVec2(x, y), ImVec2(x+sz*1.3f,y+sz*0.3f), ImVec2(x+sz-sz*1.3f,y+sz-sz*0.3f), ImVec2(x+sz, y+sz), col32, 4.0f); x += sz+spacing;
 | 
			
		||||
        draw_list->AddRectFilledMultiColor(ImVec2(x, y), ImVec2(x+sz, y+sz), ImColor(0,0,0), ImColor(255,0,0), ImColor(255,255,0), ImColor(0,255,0));
 | 
			
		||||
        ImGui::Dummy(ImVec2((sz+spacing)*8, (sz+spacing)*2));
 | 
			
		||||
    }
 | 
			
		||||
    ImGui::Separator();
 | 
			
		||||
    {
 | 
			
		||||
        static ImVector<ImVec2> points;
 | 
			
		||||
        static bool adding_line = false;
 | 
			
		||||
        ImGui::Text("Canvas example");
 | 
			
		||||
        if (ImGui::Button("Clear")) points.clear();
 | 
			
		||||
        if (points.Size >= 2) { ImGui::SameLine(); if (ImGui::Button("Undo")) { points.pop_back(); points.pop_back(); } }
 | 
			
		||||
        ImGui::Text("Left-click and drag to add lines,\nRight-click to undo");
 | 
			
		||||
 | 
			
		||||
        // Here we are using InvisibleButton() as a convenience to 1) advance the cursor and 2) allows us to use IsItemHovered()
 | 
			
		||||
        // However you can draw directly and poll mouse/keyboard by yourself. You can manipulate the cursor using GetCursorPos() and SetCursorPos().
 | 
			
		||||
        // If you only use the ImDrawList API, you can notify the owner window of its extends by using SetCursorPos(max).
 | 
			
		||||
        ImVec2 canvas_pos = ImGui::GetCursorScreenPos();            // ImDrawList API uses screen coordinates!
 | 
			
		||||
        ImVec2 canvas_size = ImGui::GetContentRegionAvail();        // Resize canvas to what's available
 | 
			
		||||
        if (canvas_size.x < 50.0f) canvas_size.x = 50.0f;
 | 
			
		||||
        if (canvas_size.y < 50.0f) canvas_size.y = 50.0f;
 | 
			
		||||
        draw_list->AddRectFilledMultiColor(canvas_pos, ImVec2(canvas_pos.x + canvas_size.x, canvas_pos.y + canvas_size.y), ImColor(50,50,50), ImColor(50,50,60), ImColor(60,60,70), ImColor(50,50,60));
 | 
			
		||||
        draw_list->AddRect(canvas_pos, ImVec2(canvas_pos.x + canvas_size.x, canvas_pos.y + canvas_size.y), ImColor(255,255,255));
 | 
			
		||||
 | 
			
		||||
        bool adding_preview = false;
 | 
			
		||||
        ImGui::InvisibleButton("canvas", canvas_size);
 | 
			
		||||
        if (ImGui::IsItemHovered())
 | 
			
		||||
        {
 | 
			
		||||
            ImVec2 mouse_pos_in_canvas = ImVec2(ImGui::GetIO().MousePos.x - canvas_pos.x, ImGui::GetIO().MousePos.y - canvas_pos.y);
 | 
			
		||||
            if (!adding_line && ImGui::IsMouseClicked(0))
 | 
			
		||||
            {
 | 
			
		||||
                points.push_back(mouse_pos_in_canvas);
 | 
			
		||||
                adding_line = true;
 | 
			
		||||
            }
 | 
			
		||||
            if (adding_line)
 | 
			
		||||
            {
 | 
			
		||||
                adding_preview = true;
 | 
			
		||||
                points.push_back(mouse_pos_in_canvas);
 | 
			
		||||
                if (!ImGui::GetIO().MouseDown[0])
 | 
			
		||||
                    adding_line = adding_preview = false;
 | 
			
		||||
            }
 | 
			
		||||
            if (ImGui::IsMouseClicked(1) && !points.empty())
 | 
			
		||||
            {
 | 
			
		||||
                adding_line = adding_preview = false;
 | 
			
		||||
                points.pop_back();
 | 
			
		||||
                points.pop_back();
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        draw_list->PushClipRect(ImVec4(canvas_pos.x, canvas_pos.y, canvas_pos.x+canvas_size.x, canvas_pos.y+canvas_size.y));      // clip lines within the canvas (if we resize it, etc.)
 | 
			
		||||
        for (int i = 0; i < points.Size - 1; i += 2)
 | 
			
		||||
            draw_list->AddLine(ImVec2(canvas_pos.x + points[i].x, canvas_pos.y + points[i].y), ImVec2(canvas_pos.x + points[i+1].x, canvas_pos.y + points[i+1].y), 0xFF00FFFF, 2.0f);
 | 
			
		||||
        draw_list->PopClipRect();
 | 
			
		||||
        if (adding_preview)
 | 
			
		||||
            points.pop_back();
 | 
			
		||||
    }
 | 
			
		||||
    draw_list->PushClipRect(ImVec4(canvas_pos.x, canvas_pos.y, canvas_pos.x+canvas_size.x, canvas_pos.y+canvas_size.y));      // clip lines within the canvas (if we resize it, etc.)
 | 
			
		||||
    for (int i = 0; i < points.Size - 1; i += 2)
 | 
			
		||||
        draw_list->AddLine(ImVec2(canvas_pos.x + points[i].x, canvas_pos.y + points[i].y), ImVec2(canvas_pos.x + points[i+1].x, canvas_pos.y + points[i+1].y), 0xFF00FFFF, 2.0f);
 | 
			
		||||
    draw_list->PopClipRect();
 | 
			
		||||
    if (adding_preview)
 | 
			
		||||
        points.pop_back();
 | 
			
		||||
    ImGui::End();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user