cgv
rectangle_renderer.h
1 #pragma once
2 
3 #include "surface_renderer.h"
4 
5 #include "gl/lib_begin.h"
6 
7 namespace cgv {
8  namespace render {
9  class CGV_API rectangle_renderer;
10 
12 
15  extern CGV_API rectangle_renderer& ref_rectangle_renderer(context& ctx, int ref_count_change = 0);
16 
17  struct CGV_API rectangle_render_style : public surface_render_style
18  {
19  int border_mode;
20  rgba border_color;
21  float pixel_blend;
22  float percentual_border_width;
23  float border_width_in_pixel;
24  float default_depth_offset;
25  int texture_mode;
26  // influence on opengl state
27  bool blend_rectangles;
28  protected:
29  friend class rectangle_renderer;
30  mutable GLboolean is_blend;
31  mutable GLint blend_src, blend_dst;
32  public:
33  rectangle_render_style();
34  };
35 
37  class CGV_API rectangle_renderer : public surface_renderer
38  {
39  protected:
50  float y_view_angle;
52  render_style* create_render_style() const;
53  public:
57  void set_y_view_angle(float y_view_angle);
59  void enable_attribute_array_manager(const context& ctx, attribute_array_manager& aam);
61  void disable_attribute_array_manager(const context& ctx, attribute_array_manager& aam);
63  bool init(context& ctx);
65  void set_position_is_center(bool _position_is_center);
67  template <typename T>
68  void set_extent(const context& ctx, const cgv::math::fvec<T, 2U>& extent) { has_extents = true; ref_prog().set_attribute(ctx, ref_prog().get_attribute_location(ctx, "extent"), extent); }
70  template <typename T>
71  void set_extent_array(const context& ctx, const std::vector<cgv::math::fvec<T, 2U>>& extents) { has_extents = true; set_attribute_array(ctx, ref_prog().get_attribute_location(ctx, "extent"), extents); }
73  template <typename T>
74  void set_extent_array(const context& ctx, const cgv::math::fvec<T, 2U>* extents, size_t nr_elements, unsigned stride_in_bytes = 0) { has_extents = true; set_attribute_array(ctx, ref_prog().get_attribute_location(ctx, "extent"), extents, nr_elements, stride_in_bytes); }
76  template <typename T>
78  has_positions = true;
79  has_extents = true;
80  set_position_is_center(false);
81  ref_prog().set_attribute(ctx, ref_prog().get_position_index(), box.get_min_pnt());
82  ref_prog().set_attribute(ctx, ref_prog().get_attribute_location(ctx, "extent"), box.get_max_pnt());
83  }
85  template <typename T>
86  void set_rectangle_array(const context& ctx, const std::vector<cgv::media::axis_aligned_box<T, 2> >& boxes) {
87  set_composed_attribute_array(ctx, ref_prog().get_attribute_location(ctx, "position"),
88  &boxes.front(), boxes.size(), boxes[0].get_min_pnt());
89  ref_composed_attribute_array(ctx, ref_prog().get_attribute_location(ctx, "extent"),
90  ref_prog().get_attribute_location(ctx, "position"), &boxes.front(), boxes.size(), boxes[0].get_max_pnt());
91  has_positions = true;
92  has_extents = true;
93  set_position_is_center(false);
94  }
96  template <typename T>
97  void set_rectangle_array(const context& ctx, const cgv::media::axis_aligned_box<T, 2>* boxes, size_t count) {
98  set_composed_attribute_array(ctx, ref_prog().get_attribute_location(ctx, "position"),
99  boxes, count, boxes[0].get_min_pnt());
100  ref_composed_attribute_array(ctx, ref_prog().get_attribute_location(ctx, "extent"),
101  ref_prog().get_attribute_location(ctx, "position"), boxes, count, boxes[0].get_max_pnt());
102  has_positions = true;
103  has_extents = true;
104  set_position_is_center(false);
105  }
107  void set_textured_rectangle(const context& ctx, const textured_rectangle& tcr);
109  void set_textured_rectangle_array(const context& ctx, const std::vector<textured_rectangle>& tc_rects) {
110  set_composed_attribute_array(ctx, ref_prog().get_attribute_location(ctx, "position"),
111  &tc_rects.front(), tc_rects.size(), tc_rects[0].rectangle.get_min_pnt());
112  ref_composed_attribute_array(ctx, ref_prog().get_attribute_location(ctx, "extent"),
113  ref_prog().get_attribute_location(ctx, "position"), &tc_rects.front(), tc_rects.size(), tc_rects[0].rectangle.get_max_pnt());
114  ref_composed_attribute_array(ctx, ref_prog().get_attribute_location(ctx, "texcoord"),
115  ref_prog().get_attribute_location(ctx, "position"), &tc_rects.front(), tc_rects.size(), tc_rects[0].texcoords);
116  has_positions = true;
117  has_extents = true;
118  has_texcoords = true;
119  set_position_is_center(false);
120  }
122  void set_textured_rectangle_array(const context& ctx, const textured_rectangle* tc_rects, size_t count) {
123  set_composed_attribute_array(ctx, ref_prog().get_attribute_location(ctx, "position"),
124  tc_rects, count, tc_rects[0].rectangle.get_min_pnt());
125  ref_composed_attribute_array(ctx, ref_prog().get_attribute_location(ctx, "extent"),
126  ref_prog().get_attribute_location(ctx, "position"), tc_rects, count, tc_rects[0].rectangle.get_max_pnt());
127  ref_composed_attribute_array(ctx, ref_prog().get_attribute_location(ctx, "texcoord"),
128  ref_prog().get_attribute_location(ctx, "position"), tc_rects, count, tc_rects[0].texcoords);
129  has_positions = true;
130  has_extents = true;
131  has_texcoords = true;
132  set_position_is_center(false);
133  }
135  template <typename T>
136  void set_depth_offset(const context& ctx, const T& depth_offset) { has_depth_offsets = true; ref_prog().set_attribute(ctx, ref_prog().get_attribute_location(ctx, "depth_offset"), depth_offset); }
138  template <typename T = float>
139  void set_depth_offset_array(const context& ctx, const std::vector<T>& depth_offsets) { has_depth_offsets = true; set_attribute_array(ctx, ref_prog().get_attribute_location(ctx, "depth_offset"), depth_offsets); }
141  template <typename T>
142  void set_translation_array(const context& ctx, const std::vector<T>& translations) { has_translations = true; set_attribute_array(ctx, ref_prog().get_attribute_location(ctx, "translation"), translations); }
144  template <typename T>
145  void set_translation_array(const context& ctx, const T* translations, size_t nr_elements, unsigned stride) { has_translations = true; set_attribute_array(ctx, ref_prog().get_attribute_location(ctx, "translation"), translations, nr_elements, stride); }
147  template <typename T>
148  void set_rotation_array(const context& ctx, const std::vector<T>& rotations) { has_rotations = true; set_attribute_array(ctx, ref_prog().get_attribute_location(ctx, "rotation"), rotations); }
150  template <typename T>
151  void set_rotation_array(const context& ctx, const T* rotations, size_t nr_elements, unsigned stride = 0) { has_rotations = true; set_attribute_array(ctx, ref_prog().get_attribute_location(ctx, "rotation"), rotations, nr_elements, stride); }
153  bool validate_attributes(const context& ctx) const;
155  bool enable(context& ctx);
157  bool disable(context& ctx);
159  void draw(context& ctx, size_t start, size_t count,
160  bool use_strips = false, bool use_adjacency = false, uint32_t strip_restart_index = -1);
161  };
162  struct CGV_API rectangle_render_style_reflect : public rectangle_render_style
163  {
164  bool self_reflect(cgv::reflect::reflection_handler& rh);
165  };
166  extern CGV_API cgv::reflect::extern_reflection_traits<rectangle_render_style, rectangle_render_style_reflect> get_reflection_traits(const rectangle_render_style&);
167  }
168 }
169 
170 #include <cgv/config/lib_end.h>
cgv::render::render_style
base class for all render styles
Definition: renderer.h:16
cgv::render::rectangle_renderer::set_extent
void set_extent(const context &ctx, const cgv::math::fvec< T, 2U > &extent)
specify a single extent for all boxes
Definition: rectangle_renderer.h:68
cgv::render::rectangle_renderer::set_depth_offset_array
void set_depth_offset_array(const context &ctx, const std::vector< T > &depth_offsets)
set per rectangle depth offsets
Definition: rectangle_renderer.h:139
cgv::render::rectangle_renderer
renderer that supports plane rendering
Definition: rectangle_renderer.h:38
cgv::render::rectangle_renderer::set_rotation_array
void set_rotation_array(const context &ctx, const T *rotations, size_t nr_elements, unsigned stride=0)
template method to set the rotation from a vector of quaternions of type T, which should have 4 compo...
Definition: rectangle_renderer.h:151
cgv::math::fvec
Definition: fvec.h:18
cgv::render::rectangle_renderer::set_extent_array
void set_extent_array(const context &ctx, const cgv::math::fvec< T, 2U > *extents, size_t nr_elements, unsigned stride_in_bytes=0)
extent array specifies plane side lengths from origin to edge
Definition: rectangle_renderer.h:74
cgv::render::rectangle_renderer::has_depth_offsets
bool has_depth_offsets
whether depth offset array has been specified
Definition: rectangle_renderer.h:49
cgv::render::rectangle_renderer::set_depth_offset
void set_depth_offset(const context &ctx, const T &depth_offset)
specify a single depth_offset for all lines
Definition: rectangle_renderer.h:136
cgv::render::rectangle_renderer::set_translation_array
void set_translation_array(const context &ctx, const T *translations, size_t nr_elements, unsigned stride)
template method to set the translations from a vector of vectors of type T, which should have 3 compo...
Definition: rectangle_renderer.h:145
cgv::render::rectangle_renderer::position_is_center
bool position_is_center
whether position is rectangle center, if not it is lower left corner
Definition: rectangle_renderer.h:47
cgv::render::textured_rectangle
simple helper class to store rectangles with texture coordinates
Definition: render_types.h:92
cgv::render::attribute_array_manager
attribute array manager used to upload arrays to gpu
Definition: renderer.h:21
cgv::render::rectangle_renderer::has_translations
bool has_translations
whether translation array has been specified
Definition: rectangle_renderer.h:43
cgv::media::axis_aligned_box< T, 2 >
cgv::reflect::reflection_handler
Definition: reflection_handler.h:63
cgv::render::rectangle_renderer::set_rotation_array
void set_rotation_array(const context &ctx, const std::vector< T > &rotations)
template method to set the rotation from a vector of quaternions of type T, which should have 4 compo...
Definition: rectangle_renderer.h:148
cgv::media::axis_aligned_box::get_max_pnt
const fpnt_type & get_max_pnt() const
return a const reference to corner 7
Definition: axis_aligned_box.h:62
cgv::media::axis_aligned_box::get_min_pnt
const fpnt_type & get_min_pnt() const
return a const reference to corner 0
Definition: axis_aligned_box.h:60
cgv::render::surface_renderer
base classes for renderers that support surface rendering
Definition: surface_renderer.h:43
cgv::render::rectangle_renderer::set_textured_rectangle_array
void set_textured_rectangle_array(const context &ctx, const std::vector< textured_rectangle > &tc_rects)
specify rectangle array directly. This sets position_is_center to false as well as position and exten...
Definition: rectangle_renderer.h:109
cgv::render::rectangle_renderer::set_rectangle
void set_rectangle(const context &ctx, const cgv::media::axis_aligned_box< T, 2 > &box)
specify a single rectangle without array. This sets position_is_center to false as well as position a...
Definition: rectangle_renderer.h:77
cgv::reflect::extern_reflection_traits
this reflection traits implementation is used for external self_reflect implementations of instances ...
Definition: reflect_extern.h:28
cgv::render::rectangle_renderer::set_translation_array
void set_translation_array(const context &ctx, const std::vector< T > &translations)
template method to set the translations from a vector of vectors of type T, which should have 3 compo...
Definition: rectangle_renderer.h:142
cgv::render::ref_rectangle_renderer
rectangle_renderer & ref_rectangle_renderer(context &ctx, int ref_count_change)
reference to a singleton plane renderer that can be shared among drawables
Definition: rectangle_renderer.cxx:7
cgv::render::rectangle_renderer::set_rectangle_array
void set_rectangle_array(const context &ctx, const std::vector< cgv::media::axis_aligned_box< T, 2 > > &boxes)
specify rectangle array directly. This sets position_is_center to false as well as position and exten...
Definition: rectangle_renderer.h:86
cgv::render::rectangle_renderer::has_extents
bool has_extents
whether extent array has been specified
Definition: rectangle_renderer.h:41
cgv
the cgv namespace
Definition: vr_calib.cxx:9
cgv::render::context
Definition: context.h:525
cgv::render::rectangle_renderer::set_rectangle_array
void set_rectangle_array(const context &ctx, const cgv::media::axis_aligned_box< T, 2 > *boxes, size_t count)
specify ractangle array directly. This sets position_is_center to false as well as position and exten...
Definition: rectangle_renderer.h:97
cgv::render::rectangle_renderer::has_rotations
bool has_rotations
whether rotation array has been specified
Definition: rectangle_renderer.h:45
cgv::render::rectangle_renderer::set_textured_rectangle_array
void set_textured_rectangle_array(const context &ctx, const textured_rectangle *tc_rects, size_t count)
specify ractangle array directly. This sets position_is_center to false as well as position and exten...
Definition: rectangle_renderer.h:122
cgv::render::rectangle_renderer::set_extent_array
void set_extent_array(const context &ctx, const std::vector< cgv::math::fvec< T, 2U >> &extents)
extent array specifies plane side lengths from origin to edge
Definition: rectangle_renderer.h:71