OGLplus  (0.59.0) a C++ wrapper for rendering APIs

resources.hpp
1 
9 #ifndef OGLPLUS_EXAMPLE_RESOURCES_HPP // NOLINT(llvm-header-guard)
10 #define OGLPLUS_EXAMPLE_RESOURCES_HPP
11 
12 #include <oglplus/gl.hpp>
13 #include <oglplus/gl_api.hpp>
14 
18 
19 //
20 #include <eagine/flat_map.hpp>
21 
22 namespace eagine::oglp {
23 
24 template <typename ApiTraits>
25 class basic_shape {
26 public:
27  basic_shape(
28  basic_gl_api<ApiTraits>& glapi,
29  memory::buffer& scratch_space,
30  const std::shared_ptr<shapes::generator>& base_gen,
31  std::initializer_list<shapes::vertex_attrib_variant> attribs,
32  shapes::drawing_variant draw_var) noexcept
33  : _gl_api{glapi}
34  , _buffers{attribs.size() + 1} {
35  shape_generator gen(_gl_api, base_gen);
36 
37  _gl_api.gen_vertex_arrays() >> _vao;
38  _gl_api.bind_vertex_array(_vao);
39 
40  _gl_api.gen_buffers(_buffers);
41 
42  gen.index_setup(glapi, _buffers[0], draw_var, scratch_space);
43 
44  _attrib_map.reserve(attribs.size());
45  for(auto i : integer_range(attribs.size())) {
46  const auto attrib_var = *(attribs.begin() + i);
47  _attrib_map[attrib_var] = i + 1;
48  gen.attrib_setup(
49  _gl_api,
50  _vao,
51  _buffers[i + 1],
52  vertex_attrib_location{limit_cast<gl_types::int_type>(i)},
53  attrib_var,
54  scratch_space);
55  }
56 
57  _ops.resize(std_size(gen.operation_count(draw_var)));
58  gen.instructions(_gl_api, draw_var, cover(_ops));
59  }
60 
61  basic_shape(basic_shape&&) noexcept = default;
62  basic_shape(const basic_shape&) = delete;
63  auto operator=(basic_shape&&) = delete;
64  auto operator=(const basic_shape&) = delete;
65 
66  ~basic_shape() noexcept {}
67 
68  auto attrib_location(shapes::vertex_attrib_variant attrib_var) const noexcept
70  if(auto pos = _attrib_map.find(attrib_var); pos != _attrib_map.end()) {
72  limit_cast<gl_types::int_type>(pos->second)};
73  }
74  return {};
75  }
76 
77 private:
78  basic_gl_api<ApiTraits>& _gl_api;
79  flat_map<shapes::vertex_attrib_variant, std::size_t> _attrib_map;
80  std::vector<oglp::shape_draw_operation> _ops;
81  vertex_array_name _vao;
82  gl_object_name_vector<buffer_tag> _buffers;
83 };
84 
85 template <typename ApiTraits>
86 class basic_baked_program {
87 public:
88  basic_baked_program(basic_gl_api<ApiTraits>& glapi) noexcept
89  : _gl_api{glapi} {}
90 
91 private:
92  basic_gl_api<ApiTraits>& _gl_api;
93 };
94 
95 } // namespace eagine::oglp
96 
97 namespace eagine::application {
98 //------------------------------------------------------------------------------
99 // program
100 //------------------------------------------------------------------------------
101 class surface_program {
102 public:
103  void init(execution_context&, video_context&);
104  void clean_up(video_context&);
105  void prepare_frame(video_context&, orbiting_camera& camera, float t);
106 
107  void bind_position_location(video_context&, oglp::vertex_attrib_location);
108  void bind_normal_location(video_context&, oglp::vertex_attrib_location);
109 
110 private:
112  oglp::uniform_location _model_loc;
113  oglp::uniform_location _view_loc;
114  oglp::uniform_location _projection_loc;
115 };
116 //------------------------------------------------------------------------------
117 class halo_program {
118 public:
119  void init(execution_context&, video_context&);
120  void clean_up(video_context&);
121  void prepare_frame(video_context&, orbiting_camera& camera, float t);
122 
123  void bind_position_location(video_context&, oglp::vertex_attrib_location);
124  void bind_normal_location(video_context&, oglp::vertex_attrib_location);
125 
126 private:
128  oglp::uniform_location _model_loc;
129  oglp::uniform_location _view_loc;
130  oglp::uniform_location _projection_loc;
131  oglp::uniform_location _camera_pos_loc;
132 };
133 //------------------------------------------------------------------------------
134 // geometry
135 //------------------------------------------------------------------------------
136 class shape_geometry {
137 public:
138  shape_geometry(std::shared_ptr<shapes::generator> gen)
139  : _gen{std::move(gen)} {}
140 
141  void init(execution_context&, video_context&);
142  void clean_up(video_context&);
143  void draw(execution_context&, video_context&);
144 
145  static auto position_loc() noexcept {
147  }
148 
149  static auto normal_loc() noexcept {
151  }
152 
153 private:
154  std::shared_ptr<shapes::generator> _gen;
156 
157  oglp::owned_buffer_name _positions;
158  oglp::owned_buffer_name _normals;
159  oglp::owned_buffer_name _indices;
160 
161  std::vector<oglp::shape_draw_operation> _ops;
162 };
163 //------------------------------------------------------------------------------
164 } // namespace eagine::application
165 
166 #endif
Application harness / wrapper code is placed in this namespace.
Definition: eagine.hpp:72
prog_var_location< EAGINE_ID_V(Uniform)> uniform_location
Alias for shader program uniform location wrapper.
Definition: prog_var_loc.hpp:115
gl_object_name< vertex_array_tag > vertex_array_name
Alias for GL vertex array object handle.
Definition: object_name.hpp:163
static constexpr auto cover(T *addr, S size) noexcept -> span_if_mutable< T >
Creates a span starting at the specified pointer and specified length.
Definition: span.hpp:465
static constexpr auto std_size(T v) noexcept
Converts argument to std size type.
Definition: types.hpp:52
gl_owned_object_name< vertex_array_tag > owned_vertex_array_name
Alias for owned GL vertex array object handle.
Definition: object_name.hpp:224
prog_var_location< EAGINE_ID_V(VertexAttr)> vertex_attrib_location
Alias for program vertex attribute location wrapper.
Definition: prog_var_loc.hpp:104
span_size_t drawing_variant
Alias for shape drawing variant index type.
Definition: gen_base.hpp:31
integer_range(B, E) -> integer_range< std::common_type_t< B, E >>
Deduction guide for integer_range.
gl_owned_object_name< program_tag > owned_program_name
Alias for owned GL program object handle.
Definition: object_name.hpp:188

Copyright © 2015-2021 Matúš Chochlík.
<chochlik -at -gmail.com>
Documentation generated on Tue Apr 13 2021 by Doxygen (version 1.8.17).