@ -3612,13 +3612,7 @@ enum ImGuiPlotType
ImGuiPlotType_Histogram ,
} ;
static float PlotGetValue ( const float * values , size_t stride , int idx )
{
const float v = * ( float * ) ( ( unsigned char * ) values + ( size_t ) idx * stride ) ;
return v ;
}
static void Plot ( ImGuiPlotType plot_type , const char * label , const float * values , int values_count , int values_offset , const char * overlay_text , float scale_min , float scale_max , ImVec2 graph_size , size_t stride )
static void Plot ( ImGuiPlotType plot_type , const char * label , float ( * values_getter ) ( void * data , int idx ) , void * data , int values_count , int values_offset , const char * overlay_text , float scale_min , float scale_max , ImVec2 graph_size )
{
ImGuiState & g = GImGui ;
ImGuiWindow * window = GetCurrentWindow ( ) ;
@ -3648,7 +3642,7 @@ static void Plot(ImGuiPlotType plot_type, const char* label, const float* values
float v_max = - FLT_MAX ;
for ( int i = 0 ; i < values_count ; i + + )
{
const float v = PlotGetValue ( values , stride , i ) ;
const float v = values_getter ( data , i ) ;
v_min = ImMin ( v_min , v ) ;
v_max = ImMax ( v_max , v ) ;
}
@ -3672,8 +3666,8 @@ static void Plot(ImGuiPlotType plot_type, const char* label, const float* values
const int v_idx = ( int ) ( t * ( values_count + ( ( plot_type = = ImGuiPlotType_Lines ) ? - 1 : 0 ) ) ) ;
IM_ASSERT ( v_idx > = 0 & & v_idx < values_count ) ;
const float v0 = PlotGetValue ( values , stride , ( v_idx + values_offset ) % values_count ) ;
const float v1 = PlotGetValue ( values , stride , ( v_idx + 1 + values_offset ) % values_count ) ;
const float v0 = values_getter ( data , ( v_idx + values_offset ) % values_count ) ;
const float v1 = values_getter ( data , ( v_idx + 1 + values_offset ) % values_count ) ;
if ( plot_type = = ImGuiPlotType_Lines )
ImGui : : SetTooltip ( " %d: %8.4g \n %d: %8.4g " , v_idx , v0 , v_idx + 1 , v1 ) ;
else if ( plot_type = = ImGuiPlotType_Histogram )
@ -3683,7 +3677,7 @@ static void Plot(ImGuiPlotType plot_type, const char* label, const float* values
const float t_step = 1.0f / ( float ) res_w ;
float v0 = PlotGetValue ( values , stride , ( 0 + values_offset ) % values_count ) ;
float v0 = values_getter ( data , ( 0 + values_offset ) % values_count ) ;
float t0 = 0.0f ;
ImVec2 p0 = ImVec2 ( t0 , 1.0f - ImSaturate ( ( v0 - scale_min ) / ( scale_max - scale_min ) ) ) ;
@ -3695,7 +3689,7 @@ static void Plot(ImGuiPlotType plot_type, const char* label, const float* values
const float t1 = t0 + t_step ;
const int v_idx = ( int ) ( t0 * values_count ) ;
IM_ASSERT ( v_idx > = 0 & & v_idx < values_count ) ;
const float v1 = PlotGetValue ( values , stride , ( v_idx + values_offset + 1 ) % values_count ) ;
const float v1 = values_getter ( data , ( v_idx + values_offset + 1 ) % values_count ) ;
const ImVec2 p1 = ImVec2 ( t1 , 1.0f - ImSaturate ( ( v1 - scale_min ) / ( scale_max - scale_min ) ) ) ;
// NB- Draw calls are merged together by the DrawList system.
@ -3715,16 +3709,42 @@ static void Plot(ImGuiPlotType plot_type, const char* label, const float* values
RenderText ( ImVec2 ( frame_bb . Max . x + style . ItemInnerSpacing . x , graph_bb . Min . y ) , label ) ;
}
struct ImGuiPlotData
{
const float * Values ;
size_t Stride ;
ImGuiPlotData ( const float * values , size_t stride ) { Values = values ; Stride = stride ; }
} ;
float Plot_ArrayGetter ( void * data , int idx )
{
ImGuiPlotData * plot_data = ( ImGuiPlotData * ) data ;
const float v = * ( float * ) ( ( unsigned char * ) plot_data - > Values + ( size_t ) idx * plot_data - > Stride ) ;
return v ;
}
void PlotLines ( const char * label , const float * values , int values_count , int values_offset , const char * overlay_text , float scale_min , float scale_max , ImVec2 graph_size , size_t stride )
{
ImGui : : Plot ( ImGuiPlotType_Lines , label , values , values_count , values_offset , overlay_text , scale_min , scale_max , graph_size , stride ) ;
ImGuiPlotData data ( values , stride ) ;
ImGui : : Plot ( ImGuiPlotType_Lines , label , & Plot_ArrayGetter , ( void * ) & data , values_count , values_offset , overlay_text , scale_min , scale_max , graph_size ) ;
}
void PlotLines ( const char * label , float ( * values_getter ) ( void * data , int idx ) , void * data , int values_count , int values_offset , const char * overlay_text , float scale_min , float scale_max , ImVec2 graph_size )
{
ImGui : : Plot ( ImGuiPlotType_Lines , label , values_getter , data , values_count , values_offset , overlay_text , scale_min , scale_max , graph_size ) ;
}
void PlotHistogram ( const char * label , const float * values , int values_count , int values_offset , const char * overlay_text , float scale_min , float scale_max , ImVec2 graph_size , size_t stride )
{
ImGui : : Plot ( ImGuiPlotType_Histogram , label , values , values_count , values_offset , overlay_text , scale_min , scale_max , graph_size , stride ) ;
ImGuiPlotData data ( values , stride ) ;
ImGui : : Plot ( ImGuiPlotType_Histogram , label , & Plot_ArrayGetter , ( void * ) & data , values_count , values_offset , overlay_text , scale_min , scale_max , graph_size ) ;
}
void PlotHistogram ( const char * label , float ( * values_getter ) ( void * data , int idx ) , void * data , int values_count , int values_offset , const char * overlay_text , float scale_min , float scale_max , ImVec2 graph_size )
{
ImGui : : Plot ( ImGuiPlotType_Histogram , label , values_getter , data , values_count , values_offset , overlay_text , scale_min , scale_max , graph_size ) ;
}
bool Checkbox ( const char * label , bool * v )
{
ImGuiState & g = GImGui ;