cgv
Loading...
Searching...
No Matches
plot_base.h
1#pragma once
2
3#include <cgv/base/base.h>
4#include <vector>
5#include <cgv/media/axis_aligned_box.h>
6#include <cgv/render/drawable.h>
7#include <cgv/render/attribute_array_binding.h>
8#include <cgv/render/vertex_buffer.h>
9#include <cgv/render/shader_program.h>
10#include <libs/cgv_gl/rectangle_renderer.h>
11#include <cgv/media/color.h>
12#include <cgv/media/color_scale.h>
13#include <cgv/media/font/font.h>
14#include <cgv/render/view.h>
15#include <cgv/gui/provider.h>
16#include "axis_config.h"
17
18#include "lib_begin.h"
19
20namespace cgv {
21 namespace plot {
22
26enum VisualVariable
27{
28 VV_COLOR,
29 VV_OPACITY,
30 VV_SIZE
31};
32
72
74enum ChartType
75{
76 CT_POINT,
77 CT_LINE_CHART,
78 CT_BAR_CHART
79};
80
82{
83 rgb color;
84 int color_idx;
85 mapped_rgb(const rgb& c = rgb(1,1,1)) : color(c), color_idx(-1) {}
86};
87
89{
90 float opacity;
91 int opacity_idx;
92 mapped_opacity(float o = 1.0f) : opacity(o), opacity_idx(-1) {}
93};
94
96{
97 float size;
98 int size_idx;
99 mapped_size(float s = 1.0f) : size(s), size_idx(-1) {}
100};
101
103{
104 rgba color;
105 int color_idx;
106 int opacity_idx;
107 mapped_rgba(const rgba& c = rgba(1, 1, 1, 1)) : color(c), color_idx(-1), opacity_idx(-1) {}
108};
109
110extern CGV_API void add_mapped_size_control(cgv::gui::provider& p, cgv::base::base* bp, const std::string& name, mapped_size& ms, std::string options = "");
111extern CGV_API void add_mapped_rgb_control(cgv::gui::provider& p, cgv::base::base* bp, const std::string& name, mapped_rgb& ms);
112extern CGV_API void add_mapped_rgba_control(cgv::gui::provider& p, cgv::base::base* bp, const std::string& name, mapped_rgba& ms);
113extern CGV_API void add_mapped_opacity_control(cgv::gui::provider& p, cgv::base::base* bp, const std::string& name, mapped_opacity& ms);
114
115enum SubPlotInfluence
116{
117 SPI_NONE = 0,
118 SPI_POINT = 1,
119 SPI_POINT_HALO = 2,
120 SPI_LINE = 4,
121 SPI_LINE_HALO = 8,
122 SPI_STICK = 16,
123 SPI_BAR = 32,
124 SPI_BAR_OUTLINE = 64,
125 SPI_ALL = 127
126};
127
129struct CGV_API plot_base_config
130{
132 std::string name;
133
138
141
143 SubPlotInfluence sub_plot_influence;
150
155
162
173
184
190 float bar_base_window;
199
201 plot_base_config(const std::string& _name, unsigned dim);
203 virtual void configure_chart(ChartType chart_type);
205 virtual void set_colors(const rgb& base_color);
206 virtual void set_color_indices(int idx);
208 virtual void set_opacities(float _opa);
209 virtual void set_opacity_indices(int idx);
211 virtual void set_sizes(float _size);
212 virtual void set_size_indices(int idx);
214 virtual ~plot_base_config();
215};
216
218enum AttributeSource
219{
220 AS_NONE,
221 AS_SAMPLE_CONTAINER,
222 AS_POINTER,
223 AS_VBO
224};
225
227struct CGV_API attribute_source
228{
229 AttributeSource source;
230 union {
231 int sub_plot_index; // index of other subplot or -1 for current subplot
232 const float* pointer; // pointer to external data
233 const cgv::render::vertex_buffer* vbo_ptr; // pointer to vbo
234 };
235 size_t offset; // offset into vbo or coordinate axis into sample container
236 size_t count;
237 size_t stride; // stride in all representations
241 attribute_source(int sub_plot_index, size_t ai, size_t _count, size_t _stride);
243 attribute_source(const float* _pointer, size_t _count, size_t _stride);
245 attribute_source(const cgv::render::vertex_buffer* _vbo_ptr, size_t _offset, size_t _count, size_t _stride);
248};
249
252{
253 bool samples_out_of_date;
254 bool sources_out_of_date;
255 size_t count;
258 std::vector<attribute_source> attribute_sources;
260};
262enum LegendComponent
263{
264 LC_HIDDEN = 0,
265 LC_PRIMARY_COLOR = 1,
266 LC_SECONDARY_COLOR = 2,
267 LC_PRIMARY_OPACITY = 4,
268 LC_SECONDARY_OPACITY = 8,
269 LC_PRIMARY_SIZE = 16,
270 LC_SECONDARY_SIZE = 32,
271 LC_ANY = 63
272};
273
275{
276 virtual size_t size(unsigned i) const = 0;
277 virtual float operator() (unsigned i, unsigned k, unsigned o) const = 0;
278};
279
281class CGV_API plot_base : public cgv::render::drawable, virtual public cgv::signal::tacker
282{
285private:
287 cgv::render::shader_program legend_prog;
288protected:
289 cgv::render::view* view_ptr;
292 {
293 vecn position;
294 std::string label;
296 float scale;
297 label_info(const vecn& _position, const std::string& _label, cgv::render::TextAlignment _align)
298 : position(_position), label(_label), align(_align), scale(1.0f) {}
299 };
302 {
304 int ai, aj;
306 bool primary;
308 unsigned first_vertex;
310 unsigned vertex_count;
312 unsigned first_label;
314 unsigned label_count;
316 tick_batch_info(int _ai, int _aj, bool _primary, unsigned _first_vertex = 0, unsigned _first_label = 0);
317 };
319 std::vector<label_info> tick_labels, legend_tick_labels;
321 std::vector<tick_batch_info> tick_batches, legend_tick_batches;
324
328 static std::vector<const char*> font_names;
330 static std::string font_name_enum_def;
331public:
333 void ensure_font_names();
334protected:
336
340 unsigned dim;
348 std::vector<plot_base_config*> configs;
350
358 vec3 world_space_from_plot_space(const vecn& pnt_plot) const;
360 vec3 transform_to_world(const vecn& pnt_attr) const;
362public:
366 LegendComponent legend_components;
376
381 static const unsigned MAX_NR_COLOR_MAPPINGS = 2;
383 int color_mapping[MAX_NR_COLOR_MAPPINGS];
385 cgv::media::ColorScale color_scale_index[MAX_NR_COLOR_MAPPINGS];
387 float color_scale_gamma[MAX_NR_COLOR_MAPPINGS];
389 float window_zero_position[MAX_NR_COLOR_MAPPINGS];
390
392 static const unsigned MAX_NR_OPACITY_MAPPINGS = 2;
394 int opacity_mapping[MAX_NR_OPACITY_MAPPINGS];
396 float opacity_gamma[MAX_NR_OPACITY_MAPPINGS];
398 bool opacity_is_bipolar[MAX_NR_OPACITY_MAPPINGS];
400 float opacity_window_zero_position[MAX_NR_OPACITY_MAPPINGS];
402 float opacity_min[MAX_NR_OPACITY_MAPPINGS];
404 float opacity_max[MAX_NR_OPACITY_MAPPINGS];
405
407 static const unsigned MAX_NR_SIZE_MAPPINGS = 2;
409 int size_mapping[MAX_NR_SIZE_MAPPINGS];
411 float size_gamma[MAX_NR_SIZE_MAPPINGS];
413 float size_min[MAX_NR_SIZE_MAPPINGS], size_max[MAX_NR_SIZE_MAPPINGS];
415protected:
429 std::vector<attribute_source_array> attribute_source_arrays;
431 void on_legend_axis_change(cgv::gui::provider& p, cgv::gui::control<int>& ctrl);
433 void on_font_selection();
435 void on_font_face_selection();
439 void prepare_extents();
441 void set_plot_uniforms(cgv::render::context& ctx, cgv::render::shader_program& prog);
443 void set_mapping_uniforms(cgv::render::context& ctx, cgv::render::shader_program& prog);
444private:
446 size_t enable_attributes(cgv::render::context& ctx, int i, const sample_access& sa);
447protected:
450 cgv::render::attribute_array_manager aam_legend, aam_legend_ticks, aam_title;
452 void draw_rectangles(cgv::render::context& ctx, cgv::render::attribute_array_manager& aam,
453 std::vector<box2>& R, std::vector<rgb>& C, std::vector<float>& D, size_t offset = 0);
455 void draw_tick_labels(cgv::render::context& ctx, cgv::render::attribute_array_manager& aam_ticks,
456 std::vector<label_info>& tick_labels, std::vector<tick_batch_info>& tick_batches, float depth);
458 size_t enable_attributes(cgv::render::context& ctx, int i, const std::vector<std::vector<vec2>>& samples);
460 size_t enable_attributes(cgv::render::context& ctx, int i, const std::vector<std::vector<vec3>>& samples);
462 void disable_attributes(cgv::render::context& ctx, int i);
464 void update_samples_out_of_date_flag();
466 virtual bool compute_sample_coordinate_interval(int i, int ai, float& samples_min, float& samples_max) = 0;
468 void draw_sub_plot_samples(int count, const plot_base_config& spc, bool strip = false);
470 void draw_title(cgv::render::context& ctx, vec2 pos, float depth, int si = -1);
472 void draw_legend(cgv::render::context& ctx, int layer_idx = 0, bool is_first = true, bool* multi_axis_modes = 0);
474 bool extract_tick_rectangles_and_tick_labels(
475 std::vector<box2>& R, std::vector<rgb>& C, std::vector<float>& D,
476 std::vector<label_info>& tick_labels, int ai, int ci, int ti, float he,
477 float z_plot, float plot_scale = 1.0f, vec2 plot_offset = vec2(0.0f,0.0f), float d = 0.0f, bool multi_axis = true);
479 void extract_legend_tick_rectangles_and_tick_labels(
480 std::vector<box2>& R, std::vector<rgb>& C, std::vector<float>& D,
481 std::vector<label_info>& tick_labels, std::vector<tick_batch_info>& tick_batches, float d,
482 bool clear_cache = false, bool is_first = true, bool* multi_axis_modes = 0);
483
484public:
486 plot_base(unsigned dim, unsigned nr_attributes = 0);
488 unsigned get_dim() const { return dim; }
490 void set_view_ptr(cgv::render::view* _view_ptr);
494 void set_label_font(float font_size, cgv::media::font::FontFaceAttributes ffa = cgv::media::font::FFA_REGULAR, const std::string& font_name = "");
496 const domain_config* get_domain_config_ptr() const;
498 domain_config* get_domain_config_ptr();
500 void set_domain_config_ptr(domain_config* _new_ptr);
502
506 const box2 get_domain() const;
508 const box3 get_domain3() const;
510 void set_domain(const box2& dom);
512 void set_domain3(const box3& dom);
514 void set_extent(const vecn& new_extent);
516 vecn get_extent() const;
518
520 void set_extent_scaling(float x_scale, float y_scale, float z_scale = 0);
522 void set_width(float new_width, bool constrained = true);
524 void set_height(float new_height, bool constrained = true);
526 void set_orientation(const quat& _orientation);
528 void place_origin(const vec3& new_origin_location);
530 void place_center(const vec3& new_center_location);
532 void place_corner(unsigned corner_index, const vec3& new_corner_location);
534 vec3 get_origin() const;
536 const quat& get_orientation() const;
538 const vec3& get_center() const;
540 vec3 get_corner(unsigned i) const;
542 const vec3 get_axis_direction(unsigned ai) const;
544
548 bool determine_axis_extent_from_subplot(unsigned ai, unsigned i, float& sample_min, float& sample_max);
550 void adjust_domain_axis_to_data(unsigned ai, bool adjust_min = true, bool adjust_max = true, bool only_visible = true);
552 void adjust_domain_to_data(bool only_visible = true);
554 void include_axis_to_domain(unsigned ai);
556 void adjust_tick_marks(unsigned max_nr_secondary_ticks = 20, bool adjust_to_attribute_ranges = true);
558 void adjust_extent_to_domain_aspect_ratio(int preserve_ai = 0);
560
564 unsigned get_nr_sub_plots() const;
566 virtual unsigned add_sub_plot(const std::string& name) = 0;
568 virtual void delete_sub_plot(unsigned i) = 0;
570 plot_base_config& ref_sub_plot_config(unsigned i);
572 void set_samples_out_of_date(unsigned i);
574 void set_sub_plot_colors(unsigned i, const rgb& base_color);
576 void set_sub_plot_attribute(unsigned i, unsigned ai, int subplot_index, size_t aj);
578 void set_sub_plot_attribute(unsigned i, unsigned ai, const float* _pointer, size_t count, size_t stride);
580 void set_sub_plot_attribute(unsigned i, unsigned ai, const cgv::render::vertex_buffer* _vbo_ptr, size_t _offset, size_t _count, size_t _stride);
582
584 bool init(cgv::render::context& ctx);
586 void clear(cgv::render::context& ctx);
587
590protected:
591 void update_ref_opacity(unsigned i, cgv::gui::provider& p);
592 void update_ref_opacity_index(unsigned i, cgv::gui::provider& p);
593 void update_ref_size(unsigned i, cgv::gui::provider& p);
594 void update_ref_size_index(unsigned i, cgv::gui::provider& p);
595 void update_ref_color(unsigned i, cgv::gui::provider& p);
596 void update_ref_color_index(unsigned i, cgv::gui::provider& p);
597
598public:
600 virtual void create_plot_gui(cgv::base::base* bp, cgv::gui::provider& p);
602 virtual void create_base_config_gui(cgv::base::base* bp, cgv::gui::provider& p, unsigned i);
604 virtual void create_point_config_gui(cgv::base::base* bp, cgv::gui::provider& p, plot_base_config& pbc);
606 virtual void create_line_config_gui(cgv::base::base* bp, cgv::gui::provider& p, plot_base_config& pbc);
608 virtual void create_stick_config_gui(cgv::base::base* bp, cgv::gui::provider& p, plot_base_config& pbc);
610 virtual void create_bar_config_gui(cgv::base::base* bp, cgv::gui::provider& p, plot_base_config& pbc);
612 virtual void create_config_gui(cgv::base::base* bp, cgv::gui::provider& p, unsigned i);
614 virtual void create_gui(cgv::base::base* bp, cgv::gui::provider& p);
616};
617
618 }
619}
620
621#include <cgv/config/lib_end.h>
base class for all classes that can be registered with support for dynamic properties (see also secti...
Definition base.h:75
derive from this class to provide a gui to the current viewer
Definition provider.h:64
base class for plot2d and plot3d, which can have several sub plots each
Definition plot_base.h:282
unsigned get_dim() const
return nr dimensions of plot
Definition plot_base.h:488
virtual unsigned add_sub_plot(const std::string &name)=0
add sub plot and return sub plot index
cgv::render::rectangle_render_style rrs
render style of rectangles
Definition plot_base.h:449
static std::string font_name_enum_def
concatenate font names to enum definition for dropdown control
Definition plot_base.h:330
static std::vector< const char * > font_names
store a vector with all fonts on the system
Definition plot_base.h:328
rgba legend_color
color and opacity of legend
Definition plot_base.h:374
LegendComponent legend_components
whether to show legend
Definition plot_base.h:366
std::vector< attribute_source_array > attribute_source_arrays
attribute sources
Definition plot_base.h:429
cgv::render::vertex_buffer vbo_legend
vbo for legend drawing
Definition plot_base.h:425
float layer_depth
depth offset of a single layer
Definition plot_base.h:323
vec2 legend_extent
width of legend
Definition plot_base.h:370
quat orientation
orientiation quaternion mapping from domain to world coordinates
Definition plot_base.h:354
unsigned dim
dimension of plot
Definition plot_base.h:340
domain_config dom_cfg
domain configuration
Definition plot_base.h:344
vec3 center_location
center location of domain in world coordinates
Definition plot_base.h:356
std::vector< plot_base_config * > configs
store one configuration per sub plot
Definition plot_base.h:348
ivec4 out_of_range_mode
handling of values that are out of range
Definition plot_base.h:379
std::vector< label_info > tick_labels
all tick labels
Definition plot_base.h:319
cgv::render::attribute_array_binding aab_legend
manage attributes for legend drawing
Definition plot_base.h:427
domain_config * dom_cfg_ptr
pointer to currently used domain config
Definition plot_base.h:346
virtual void delete_sub_plot(unsigned i)=0
delete the i-th sub plot
unsigned nr_attributes
number of additional attributes
Definition plot_base.h:342
cgv::media::font::font_face_ptr title_font_face
store pointer to title font face
Definition plot_base.h:423
int legend_axis
coordinate direction along which to draw legend
Definition plot_base.h:372
vec3 legend_location
center location of legend in domain coordinates
Definition plot_base.h:368
cgv::media::font::font_ptr title_font
store pointer to title font
Definition plot_base.h:421
std::vector< tick_batch_info > tick_batches
twice number of axis pairs with index of first tick label and number of tick labels for primary and s...
Definition plot_base.h:321
cgv::media::font::font_ptr label_font
store pointer to label font
Definition plot_base.h:417
cgv::media::font::font_face_ptr label_font_face
store pointer to label font face
Definition plot_base.h:419
vec3 extent
extents used for drawing current
Definition plot_base.h:437
the attribute_array_binding allows to define vertex attributes (i.e.
attribute array manager used to upload arrays to gpu
base class for all drawables, which is independent of the used rendering API.
Definition context.h:621
base class for all drawables, which is independent of the used rendering API.
Definition drawable.h:15
a shader program combines several shader code fragments to a complete definition of the shading pipel...
a vertex buffer is an unstructured memory block on the GPU.
defines a symmetric view with the following quantities:
Definition view.h:22
FontFaceAttributes
declaration of supported attributes of font faces
Definition font.h:21
TextAlignment
different text alignments
Definition context.h:273
the cgv namespace
Definition print.h:11
cgv::media::color< float, cgv::media::RGB, cgv::media::OPACITY > rgba
declare rgba color type with 32 bit components
Definition color.h:855
cgv::media::color< float, cgv::media::RGB > rgb
declare rgb color type with 32 bit components
Definition color.h:853
struct that manages attribute sources and corresponding gpu objects per subplot
Definition plot_base.h:252
store source of a single plot attribute (one coordinate axis or one float attribute)
Definition plot_base.h:228
rgba title_color
color of the title
Definition plot_base.h:50
bool show_domain
whether to show the coordinate axes including tickmarks and labels
Definition plot_base.h:36
unsigned title_font_index
store index of selected title font
Definition plot_base.h:64
float title_font_size
store selected title font size
Definition plot_base.h:66
float reference_size
store size of virtual pixel based measurement
Definition plot_base.h:52
unsigned label_font_index
store index of selected label font
Definition plot_base.h:58
bool fill
whether to fill the domain
Definition plot_base.h:38
std::string title
plot title
Definition plot_base.h:40
vecn title_pos
position of title
Definition plot_base.h:46
cgv::media::font::FontFaceAttributes label_ffa
store selected label font face attributes
Definition plot_base.h:62
std::vector< axis_config > axis_configs
store a vector of axis configurations (2/3 for plot2/3d plus several attribute axes)
Definition plot_base.h:56
cgv::media::font::FontFaceAttributes title_ffa
store selected title font face attributes
Definition plot_base.h:68
rgb color
color of the domain fill
Definition plot_base.h:48
float label_font_size
store selected label font size
Definition plot_base.h:60
float blend_width_in_pixel
store blend width in screen pixels used for antialiasing
Definition plot_base.h:54
bool show_title
whether to show the plot title
Definition plot_base.h:42
bool show_sub_plot_names
whether to show the sub plot names
Definition plot_base.h:44
render information stored per label
Definition plot_base.h:292
unsigned first_vertex
index of first tick vertex in batch
Definition plot_base.h:308
int ai
indices of coordinate axis used for definition of 2d points
Definition plot_base.h:304
plot independent configuration parameters of one sub plot in a 2d or 3d plot
Definition plot_base.h:130
mapped_size line_halo_width
width of line halo in pixel
Definition plot_base.h:170
int bar_coordinate_index
extended bar information
Definition plot_base.h:188
mapped_size line_width
line width
Definition plot_base.h:166
mapped_size bar_percentual_width
percentual width of bar computed assuming a uniform y-sampling distance
Definition plot_base.h:194
std::string name
name of sub plot
Definition plot_base.h:132
float stick_base_window
base window position of stick
Definition plot_base.h:179
bool show_lines
whether to connect data points with lines
Definition plot_base.h:164
mapped_rgba stick_color
color of the stick line
Definition plot_base.h:183
bool show_bars
whether to show bars
Definition plot_base.h:186
mapped_size bar_outline_width
line width of bar outlines
Definition plot_base.h:192
mapped_opacity ref_opacity
reference opacity, when changed, all opcities are adapted with set_opacity()
Definition plot_base.h:147
bool show_points
whether to show data points
Definition plot_base.h:152
mapped_size stick_width
line width of stick
Definition plot_base.h:181
mapped_rgba bar_color
bar fill color
Definition plot_base.h:196
SubPlotInfluence sub_plot_influence
store bit field to define which sub plots are influenced by reference values
Definition plot_base.h:143
mapped_rgba line_halo_color
color of line halo
Definition plot_base.h:172
mapped_rgba point_color
point color
Definition plot_base.h:157
mapped_size ref_size
reference size, when changed, all sizes are adapted with set_size()
Definition plot_base.h:149
size_t begin_sample
offset into samples defaults to 0, if larger than end_sample vector is split into two parts
Definition plot_base.h:135
int stick_coordinate_index
extended stick information
Definition plot_base.h:177
bool show_plot
whether to show sub plot
Definition plot_base.h:140
bool show_sticks
whether to show straight lines to the bottom of the plot, which are called sticks
Definition plot_base.h:175
mapped_rgba line_color
line color
Definition plot_base.h:168
mapped_rgb ref_color
reference color, when changed, all colors are adapted with set_colors()
Definition plot_base.h:145
mapped_size point_halo_width
width of point halo in pixel
Definition plot_base.h:159
mapped_rgba bar_outline_color
bar outline color
Definition plot_base.h:198
mapped_size point_size
point size in pixels
Definition plot_base.h:154
mapped_rgba point_halo_color
color of point halo
Definition plot_base.h:161
size_t end_sample
defaults to -1 and effectively is always the end of the sample vector
Definition plot_base.h:137
configuration of rectangle renderer