@ -1763,7 +1763,7 @@ static void ShowExampleAppManipulatingWindowTitle(bool* opened)
static void ShowExampleAppCustomRendering ( bool * opened )
{
ImGui : : SetNextWindowSize ( ImVec2 ( 3 00, 35 0) , ImGuiSetCond_FirstUseEver ) ;
ImGui : : SetNextWindowSize ( ImVec2 ( 3 50, 56 0) , 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 )
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, \n Right-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 ( ) )
{
adding_preview = true ;
points . push_back ( mouse_pos_in_canvas ) ;
if ( ! ImGui : : GetIO ( ) . MouseDown [ 0 ] )
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 ( ) ;
}
}
if ( ImGui : : IsMouseClicked ( 1 ) & & ! points . empty ( ) )
{
adding_line = adding_preview = false ;
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 ( ) ;
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 ( ) ;
}