cgv
mesh_render_info.h
1 #pragma once
2 
3 #include "render_info.h"
4 #include <cgv/media/mesh/simple_mesh.h>
5 
6 #include "lib_begin.h"
7 
8 namespace cgv {
9  namespace render {
15 class CGV_API mesh_render_info : public render_info
16 {
17 public:
20 protected:
22  std::vector<std::string> primitive_names;
24  std::vector<vec3i> material_primitive_start;
32  size_t nr_vertices;
38  size_t element_size;
40  draw_call wire_draw_call;
48  cgv::media::ColorType ct;
50  void construct_vbos_base(cgv::render::context& c, const cgv::media::mesh::simple_mesh_base& mesh,
51  std::vector<idx_type>& vertex_indices, std::vector<vec3i>& unique_triples,
52  std::vector<idx_type>& triangle_element_buffer, std::vector<idx_type>& edge_element_buffer);
54  void finish_construct_vbos_base(cgv::render::context& ctx,
55  const std::vector<idx_type>& triangle_element_buffer,
56  const std::vector<idx_type>& edge_element_buffer);
58  void construct_draw_calls(cgv::render::context& ctx);
59 public:
63  bool is_constructed() const { return get_vbos().size() > 0; }
65  bool is_bound() const { return get_aas().size() > 0; }
67  template <typename T>
69  {
70  // construct render buffers
71  std::vector<idx_type> vertex_indices;
72  std::vector<vec3i> unique_triples;
73  std::vector<idx_type> triangle_element_buffer;
74  std::vector<idx_type> edge_element_buffer;
75  construct_vbos_base(ctx, mesh, vertex_indices, unique_triples, triangle_element_buffer, edge_element_buffer);
76  std::vector<T> attrib_buffer;
77  color_increment = mesh.extract_vertex_attribute_buffer(vertex_indices, unique_triples, include_tex_coords, include_normals, attrib_buffer, &include_colors);
78  ref_vbos().push_back(new cgv::render::vertex_buffer(cgv::render::VBT_VERTICES));
79  ref_vbos().back()->create(ctx, attrib_buffer);
80  element_size = sizeof(T);
81  position_descr = cgv::render::element_descriptor_traits<typename cgv::media::mesh::simple_mesh<T>::vec3>::get_type_descriptor(mesh.position(0));
82  tex_coords_descr = cgv::render::element_descriptor_traits<typename cgv::media::mesh::simple_mesh<T>::vec2>::get_type_descriptor(typename cgv::media::mesh::simple_mesh<T>::vec2());
83  finish_construct_vbos_base(ctx, triangle_element_buffer, edge_element_buffer);
84  construct_draw_calls(ctx);
85  }
87  size_t get_nr_primitives() const { return primitive_names.size(); }
89  const std::string& get_primitive_name(size_t i) const { return primitive_names[i]; }
91  size_t get_nr_fragments() const { return material_primitive_start.size(); }
93  size_t get_material_index(size_t i) const { return material_primitive_start[i](0); }
95  size_t get_primitive_index(size_t i) const { return material_primitive_start[i](1); }
96 
98  void draw_primitive(cgv::render::context& ctx, size_t primitive_index, bool skip_opaque = false, bool skip_blended = false, bool use_materials = true);
100  bool bind(context& ctx, shader_program& prog, bool force_success, int aa_index = -1);
102  bool bind_wireframe(context& ctx, shader_program& prog, bool force_success);
104  void draw_wireframe(cgv::render::context& ctx);
106  void destruct(cgv::render::context& ctx);
107 };
108  }
109 }
110 
111 #include <cgv/config/lib_end.h>
cgv::media::mesh::simple_mesh::extract_vertex_attribute_buffer
unsigned extract_vertex_attribute_buffer(const std::vector< idx_type > &vertex_indices, const std::vector< vec3i > &unique_triples, bool include_tex_coords, bool include_normals, std::vector< T > &attrib_buffer, bool *include_colors_ptr=0) const
extract vertex attribute array, return size of color in bytes
Definition: simple_mesh.cxx:481
cgv::render::mesh_render_info::material_primitive_start
std::vector< vec3i > material_primitive_start
index triple storing the material index, the primitive index and the offset (element index) in the tr...
Definition: mesh_render_info.h:24
cgv::render::type_descriptor
compact type description of data that can be sent to the context; convertible to int
Definition: context.h:36
cgv::render::mesh_render_info::nr_triangle_elements
size_t nr_triangle_elements
number of triangles in the triangulation
Definition: mesh_render_info.h:36
cgv::render::mesh_render_info::nr_vertices
size_t nr_vertices
number of vertices
Definition: mesh_render_info.h:32
cgv::render::mesh_render_info::include_normals
bool include_normals
store whether normals are in vbo
Definition: mesh_render_info.h:28
cgv::render::mesh_render_info::element_size
size_t element_size
size of single coordinate
Definition: mesh_render_info.h:38
cgv::render::mesh_render_info::get_nr_primitives
size_t get_nr_primitives() const
return number of mesh primitives
Definition: mesh_render_info.h:87
cgv::math::fvec
Definition: fvec.h:18
cgv::render::vertex_buffer
Definition: vertex_buffer.h:13
cgv::render::mesh_render_info::get_nr_fragments
size_t get_nr_fragments() const
return number of mesh fragments that are of distinct primitive and material
Definition: mesh_render_info.h:91
cgv::render::mesh_render_info::tex_coords_descr
cgv::render::type_descriptor tex_coords_descr
type description of tex coordinate attribute
Definition: mesh_render_info.h:44
cgv::media::mesh::simple_mesh_base
Definition: simple_mesh.h:22
cgv::render::mesh_render_info::nr_edge_elements
size_t nr_edge_elements
number of edges in the wireframe representation
Definition: mesh_render_info.h:34
cgv::render::shader_program
Definition: shader_program.h:25
cgv::render::render_info
Definition: render_info.h:76
cgv::render::mesh_render_info::color_increment
size_t color_increment
color type size in bytes
Definition: mesh_render_info.h:46
cgv::render::mesh_render_info::position_descr
cgv::render::type_descriptor position_descr
type description of position attribute
Definition: mesh_render_info.h:42
cgv::render::mesh_render_info::wire_draw_call
draw_call wire_draw_call
draw call for wireframe rendering
Definition: mesh_render_info.h:40
cgv::render::mesh_render_info::include_tex_coords
bool include_tex_coords
store whether tex coords are in vbo
Definition: mesh_render_info.h:26
cgv::render::mesh_render_info::get_primitive_name
const std::string & get_primitive_name(size_t i) const
return name of i-th mesh primitive
Definition: mesh_render_info.h:89
cgv::render::mesh_render_info::is_constructed
bool is_constructed() const
check whether vbos are constructed
Definition: mesh_render_info.h:63
cgv::render::mesh_render_info::get_material_index
size_t get_material_index(size_t i) const
return material index of i-th fragment
Definition: mesh_render_info.h:93
cgv::media::mesh::simple_mesh
the simple_mesh class is templated over the coordinate type that defaults to float
Definition: simple_mesh.h:116
cgv::render::mesh_render_info::vec3i
cgv::math::fvec< idx_type, 3 > vec3i
index triple type
Definition: mesh_render_info.h:19
cgv::render::mesh_render_info::construct
void construct(cgv::render::context &ctx, cgv::media::mesh::simple_mesh< T > &mesh)
construct mesh render info from a given simple mesh and store attributes in vertex buffer objects
Definition: mesh_render_info.h:68
cgv::render::mesh_render_info
Definition: mesh_render_info.h:16
cgv::render::mesh_render_info::get_primitive_index
size_t get_primitive_index(size_t i) const
return group index of i-th fragment
Definition: mesh_render_info.h:95
cgv::render::mesh_render_info::primitive_names
std::vector< std::string > primitive_names
store list of primitive names
Definition: mesh_render_info.h:22
cgv
the cgv namespace
Definition: vr_calib.cxx:9
cgv::render::context
Definition: context.h:525
cgv::render::mesh_render_info::is_bound
bool is_bound() const
check whether attribute array binding is bound
Definition: mesh_render_info.h:65
cgv::render::mesh_render_info::ct
cgv::media::ColorType ct
color type
Definition: mesh_render_info.h:48
cgv::render::mesh_render_info::include_colors
bool include_colors
store whether colors are in vbo
Definition: mesh_render_info.h:30