2018-05-17 14:01:02 +00:00
# pragma once
# include "plot_base.h"
# include <cgv/render/shader_program.h>
# include "lib_begin.h"
namespace cgv {
namespace plot {
/** extend common plot configuration with parameters specific to 1d plot */
struct CGV_API plot1d_config : public plot_base_config
{
bool show_lines ;
float line_width ;
Clr line_color ;
plot1d_config ( ) ;
} ;
/** The \c plot1d class draws 1d plots with potentially several sub plots of different plot configuration */
class CGV_API plot1d : public plot_base
{
cgv : : render : : shader_program prog ;
cgv : : render : : shader_program stick_prog ;
cgv : : render : : shader_program bar_prog , bar_outline_prog ;
protected :
std : : vector < std : : vector < P2D > > samples ;
B2D domain ;
axis_config axes [ 2 ] ;
V2D extent ;
V3D axis_directions [ 2 ] ;
P3D center_location ;
P3D transform_to_world ( const P2D & domain_point ) const ;
axis_config & ref_axis_config ( unsigned ai ) ;
void set_uniforms ( cgv : : render : : context & ctx , cgv : : render : : shader_program & prog , unsigned i ) ;
public :
/// construct empty plot with default domain [0..1,0..1]
plot1d ( ) ;
/// return number of axis
unsigned get_nr_axes ( ) const ;
/// adjust the domain with respect to \c ai th axis to the data
void adjust_domain_axis_to_data ( unsigned ai , bool adjust_min = true , bool adjust_max = true ) ;
/// adjust the domain with respect to \c ai th axis to the data in the currently visible plots
void adjust_domain_axis_to_visible_data ( unsigned ai , bool adjust_min = true , bool adjust_max = true ) ;
/// adjust selected axes of domain to data
void adjust_domain_to_data ( bool adjust_x_axis = true , bool adjust_y_axis = true ) ;
/// adjust selected axes of domain to data in the currently visible plots
void adjust_domain_to_visible_data ( bool adjust_x_axis = true , bool adjust_y_axis = true ) ;
/// extend domain such that given axis is included
void include_axis_to_domain ( unsigned ai ) ;
/// adjust tick marks
void adjust_tick_marks_to_domain ( unsigned max_nr_primary_ticks = 20 ) ;
/// return domain shown in plot
const B2D & get_domain ( ) { return domain ; }
/// reference domain shown in plot
B2D & ref_domain ( ) { return domain ; }
/// set the plot extend in 2D coordinates
void set_extent ( const V2D & new_extent ) ;
/// query the plot extend in 2D coordinates
const V2D & get_extent ( ) const ;
/// set the plot width to given value and if constrained == true the height, such that the aspect ration is the same as the aspect ratio of the domain
void set_width ( Crd new_width , bool constrained = true ) ;
/// set the plot height to given value and if constrained == true the width, such that the aspect ration is the same as the aspect ratio of the domain
void set_height ( Crd new_height , bool constrained = true ) ;
/// set the direction of x or y axis
void set_axis_direction ( unsigned ai , const V3D & new_axis_direction ) ;
/// place the origin of the plot in 3D to the given location
void place_origin ( const P3D & new_origin_location ) ;
/// place the plot extent center in 3D to the given location (this might can change the current origin location)
void place_center ( const P3D & new_center_location ) ;
/// place a corner (0 .. lower left, 1 .. lower right, 2 .. upper left, 3 .. upper right) to a given 3D location ((this might can change the current origin / center location)
void place_corner ( unsigned corner_index , const P3D & new_corner_location ) ;
/// return the current origin in 3D coordinates
P3D get_origin ( ) const ;
/// return the current plot center in 3D coordinates
const P3D & get_center ( ) const ;
/// return the i-th plot corner in 3D coordinates
P3D get_corner ( unsigned i ) const ;
/// set the direction of x or y axis
const V3D & get_axis_direction ( unsigned ai ) const ;
/**@name management of sub plots*/
//@{
/// add sub plot and return sub plot index
unsigned add_sub_plot ( const std : : string & name ) ;
/// delete the i-th sub plot
void delete_sub_plot ( unsigned i ) ;
/// return a reference to the plot1d configuration of the i-th plot
plot1d_config & ref_sub_plot1d_config ( unsigned i = 0 ) ;
/// set the colors for all plot features of the i-th sub plot as variation of the given color
void set_sub_plot_colors ( unsigned i , const Clr & base_color ) ;
/// return the samples of the i-th sub plot
std : : vector < P2D > & ref_sub_plot_samples ( unsigned i = 0 ) ;
//@}
/// create the gui for the plot independent of the sub plots
void create_plot_gui ( cgv : : base : : base * bp , cgv : : gui : : provider & p ) ;
/// create the gui for a configuration, overload to specialize for extended configs
void create_config_gui ( cgv : : base : : base * bp , cgv : : gui : : provider & p , unsigned i ) ;
bool init ( cgv : : render : : context & ctx ) ;
void draw ( cgv : : render : : context & ctx ) ;
void clear ( cgv : : render : : context & ctx ) ;
} ;
}
}
2018-05-17 13:50:03 +00:00
# include <cgv/config/lib_end.h>