./
Coverage:
low: ≥ 0%
medium: ≥ 75.0%
high: ≥ 90.0%
Lines:
0 / 98
0.0%
Branches:
0 / 126
0.0%
Functions:
0 / 10
0.0%

libs/render/src/eu/render/linebatch.cc
Line Branch Exec Source
1 #include "eu/render/linebatch.h"
2
3 #include "eu/assert/assert.h"
4
5 #include "eu/render/opengl_utils.h"
6 #include "eu/render/camera.h"
7
8 #include "eu/render/dependency_glad.h"
9
10 constexpr auto vertices_per_line = 2;
11
12 namespace eu::render
13 {
14 ✗ LineDrawer::LineDrawer()
15 // todo(Gustav): expand shader with stipple pattern https://stackoverflow.com/questions/52928678/dashed-line-in-opengl3/54543267#54543267
16 // todo(Gustav): move `description` and `layout` to a separate setup
17
0/4
✗ Branch 10 → 11 not taken.
✗ Branch 10 → 12 not taken.
✗ Branch 122 → 123 not taken.
✗ Branch 122 → 124 not taken.
✗ : description({{.type = core::VertexType::position3, .name = "a_world_position"}, {.type = core::VertexType::color3, .name = "a_color"}})
18
0/10
✗ Branch 19 → 20 not taken.
✗ Branch 19 → 141 not taken.
✗ Branch 20 → 21 not taken.
✗ Branch 20 → 139 not taken.
✗ Branch 21 → 22 not taken.
✗ Branch 21 → 137 not taken.
✗ Branch 26 → 27 not taken.
✗ Branch 26 → 28 not taken.
✗ Branch 145 → 146 not taken.
✗ Branch 145 → 147 not taken.
✗ , layout(compile_shader_layout(core::compile_attribute_layouts({description}), description, std::nullopt, std::nullopt))
19
0/2
✗ Branch 38 → 39 not taken.
✗ Branch 38 → 160 not taken.
✗ , shader(
20
0/2
✗ Branch 37 → 38 not taken.
✗ Branch 37 → 162 not taken.
✗ USE_DEBUG_LABEL_MANY("debug line")
21
0/2
✗ Branch 34 → 35 not taken.
✗ Branch 34 → 168 not taken.
✗ R"glsl(
22 #version 430 core
23 in vec3 a_world_position;
24 in vec3 a_color;
25
26 uniform mat4 u_clip_from_view;
27 uniform mat4 u_view_from_world;
28
29 out vec4 v_color;
30 out vec4 v_vert_pos;
31 flat out vec4 v_start_pos;
32
33 void main()
34 {
35 v_color = vec4(a_color, 1.0);
36 vec4 pos = u_clip_from_view * u_view_from_world * vec4(a_world_position.xyz, 1.0);
37 gl_Position = pos;
38 v_vert_pos = pos;
39 v_start_pos = v_vert_pos;
40 }
41 )glsl",
42
0/2
✗ Branch 31 → 32 not taken.
✗ Branch 31 → 174 not taken.
✗ R"glsl(
43 #version 430 core
44
45 in vec4 v_color;
46 flat in vec4 v_start_pos;
47 in vec4 v_vert_pos;
48
49 uniform float u_dash_size;
50 uniform float u_gap_size;
51 uniform vec2 u_resolution;
52
53 out vec4 color;
54
55 vec2 pixel(vec4 pos)
56 {
57 return ((pos.xy / pos.w) + 1)/2.0 * u_resolution;
58 }
59
60 void main()
61 {
62 if(u_resolution.x > 0.0)
63 {
64 float seg_len = u_dash_size + u_gap_size;
65
66 float dash_seg = u_dash_size/seg_len;
67
68 float cur = length(pixel(v_vert_pos) - pixel(v_start_pos));
69 float cur_seg = fract(cur / seg_len);
70 if(cur_seg > dash_seg)
71 {
72 discard;
73 }
74 color = v_color;
75 }
76 else
77 {
78 color = v_color;
79 }
80 }
81 )glsl",
82 ✗ layout
83 )
84
0/4
✗ Branch 47 → 48 not taken.
✗ Branch 47 → 180 not taken.
✗ Branch 48 → 49 not taken.
✗ Branch 48 → 178 not taken.
✗ , clip_from_view_uni(shader.get_uniform("u_clip_from_view"))
85
0/4
✗ Branch 53 → 54 not taken.
✗ Branch 53 → 186 not taken.
✗ Branch 54 → 55 not taken.
✗ Branch 54 → 184 not taken.
✗ , view_from_world_uni(shader.get_uniform("u_view_from_world"))
86
0/4
✗ Branch 59 → 60 not taken.
✗ Branch 59 → 192 not taken.
✗ Branch 60 → 61 not taken.
✗ Branch 60 → 190 not taken.
✗ , resolution_uni(shader.get_uniform("u_resolution"))
87
0/4
✗ Branch 65 → 66 not taken.
✗ Branch 65 → 198 not taken.
✗ Branch 66 → 67 not taken.
✗ Branch 66 → 196 not taken.
✗ , dash_size_uni(shader.get_uniform("u_dash_size"))
88
0/4
✗ Branch 71 → 72 not taken.
✗ Branch 71 → 204 not taken.
✗ Branch 72 → 73 not taken.
✗ Branch 72 → 202 not taken.
✗ , gap_size_uni(shader.get_uniform("u_gap_size"))
89 ✗ , va(create_vertex_array())
90
0/2
✗ Branch 77 → 78 not taken.
✗ Branch 77 → 219 not taken.
✗ , vb(create_buffer())
91
0/4
✗ Branch 76 → 77 not taken.
✗ Branch 76 → 219 not taken.
✗ Branch 78 → 79 not taken.
✗ Branch 78 → 219 not taken.
✗ , ib(create_buffer())
92 {
93
0/2
✗ Branch 79 → 80 not taken.
✗ Branch 79 → 218 not taken.
✗ shader.use();
94
95
0/2
✗ Branch 80 → 81 not taken.
✗ Branch 80 → 218 not taken.
✗ glBindVertexArray(va);
96
0/2
✗ Branch 82 → 83 not taken.
✗ Branch 82 → 218 not taken.
✗ SET_DEBUG_LABEL_NAMED(va, DebugLabelFor::vertex_array, "VERT line batch"sv);
97
98 ✗ constexpr auto attributes_per_vertex = 2;
99 ✗ constexpr auto float_per_attribute = 3;
100
101 ✗ constexpr auto floats_per_vertex = float_per_attribute * attributes_per_vertex;
102 ✗ constexpr auto vertex_size = floats_per_vertex * sizeof(float);
103 ✗ constexpr auto max_vertices = vertices_per_line * max_lines;
104 ✗ constexpr auto max_indices = vertices_per_line * max_lines;
105
106
0/2
✗ Branch 83 → 84 not taken.
✗ Branch 83 → 218 not taken.
✗ glBindBuffer(GL_ARRAY_BUFFER, vb);
107
0/2
✗ Branch 85 → 86 not taken.
✗ Branch 85 → 218 not taken.
✗ SET_DEBUG_LABEL_NAMED(vb, DebugLabelFor::buffer, "ARR BUF line batch"sv);
108
0/2
✗ Branch 86 → 87 not taken.
✗ Branch 86 → 218 not taken.
✗ glBufferData(GL_ARRAY_BUFFER, vertex_size * max_vertices, nullptr, GL_DYNAMIC_DRAW);
109
110 ✗ auto relative_offset = [](unsigned int i)
111 {
112 ✗ return reinterpret_cast<void*>(i * sizeof(float));
113 };
114
115 ✗ unsigned int offset = 0;
116
117
0/2
✗ Branch 87 → 88 not taken.
✗ Branch 87 → 218 not taken.
✗ glEnableVertexAttribArray(0);
118
0/2
✗ Branch 89 → 90 not taken.
✗ Branch 89 → 218 not taken.
✗ glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, vertex_size, relative_offset(offset));
119 ✗ offset += 3;
120
121
0/2
✗ Branch 90 → 91 not taken.
✗ Branch 90 → 218 not taken.
✗ glEnableVertexAttribArray(1);
122
0/2
✗ Branch 92 → 93 not taken.
✗ Branch 92 → 218 not taken.
✗ glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, vertex_size, relative_offset(offset));
123 ✗ offset += 3;
124
0/8
✗ Branch 93 → 94 not taken.
✗ Branch 93 → 100 not taken.
✗ Branch 94 → 95 not taken.
✗ Branch 94 → 218 not taken.
✗ Branch 95 → 96 not taken.
✗ Branch 95 → 100 not taken.
✗ Branch 97 → 98 not taken.
✗ Branch 97 → 208 not taken.
✗ ASSERT(offset == floats_per_vertex);
125
126 ✗ std::vector<u32> indices;
127
0/2
✗ Branch 100 → 101 not taken.
✗ Branch 100 → 216 not taken.
✗ indices.reserve(max_indices);
128
129
0/2
✗ Branch 105 → 102 not taken.
✗ Branch 105 → 106 not taken.
✗ for (auto quad_index = 0; quad_index < max_lines; quad_index += 1)
130 {
131 ✗ const auto base = quad_index * vertices_per_line;
132
0/2
✗ Branch 102 → 103 not taken.
✗ Branch 102 → 211 not taken.
✗ indices.emplace_back(base + 0);
133
0/2
✗ Branch 103 → 104 not taken.
✗ Branch 103 → 212 not taken.
✗ indices.emplace_back(base + 1);
134 }
135
136
0/8
✗ Branch 107 → 108 not taken.
✗ Branch 107 → 114 not taken.
✗ Branch 108 → 109 not taken.
✗ Branch 108 → 216 not taken.
✗ Branch 109 → 110 not taken.
✗ Branch 109 → 114 not taken.
✗ Branch 111 → 112 not taken.
✗ Branch 111 → 213 not taken.
✗ ASSERT(max_indices == indices.size());
137
138
0/2
✗ Branch 114 → 115 not taken.
✗ Branch 114 → 216 not taken.
✗ glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ib);
139
0/2
✗ Branch 116 → 117 not taken.
✗ Branch 116 → 216 not taken.
✗ SET_DEBUG_LABEL_NAMED(ib, DebugLabelFor::buffer, "IND BUF line batch"sv);
140
0/2
✗ Branch 118 → 119 not taken.
✗ Branch 118 → 216 not taken.
✗ glBufferData(GL_ELEMENT_ARRAY_BUFFER, max_indices * sizeof(u32), indices.data(), GL_STATIC_DRAW);
141
0/16
✗ Branch 6 → 7 not taken.
✗ Branch 6 → 125 not taken.
✗ Branch 7 → 8 not taken.
✗ Branch 7 → 125 not taken.
✗ Branch 8 → 9 not taken.
✗ Branch 8 → 121 not taken.
✗ Branch 16 → 17 not taken.
✗ Branch 16 → 148 not taken.
✗ Branch 128 → 129 not taken.
✗ Branch 128 → 132 not taken.
✗ Branch 130 → 131 not taken.
✗ Branch 130 → 132 not taken.
✗ Branch 148 → 149 not taken.
✗ Branch 148 → 152 not taken.
✗ Branch 150 → 151 not taken.
✗ Branch 150 → 152 not taken.
✗ }
142
143 ✗ LineDrawer::~LineDrawer()
144 {
145 ✗ glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
146 ✗ destroy_buffer(ib);
147
148 ✗ glBindBuffer(GL_ARRAY_BUFFER, 0);
149 ✗ destroy_buffer(vb);
150
151 ✗ glBindVertexArray(0);
152 ✗ destroy_vertex_array(va);
153 ✗ }
154
155 ✗ void LineDrawer::set_line_to_dash(const v2& resolution, float dash_size, float gap_size)
156 {
157 ✗ submit();
158 ✗ shader.set_vec2(resolution_uni, resolution);
159 ✗ shader.set_float(dash_size_uni, dash_size);
160 ✗ shader.set_float(gap_size_uni, gap_size);
161 ✗ }
162
163 ✗ void LineDrawer::set_line_to_solid()
164 {
165 ✗ submit();
166
0/2
✗ Branch 4 → 5 not taken.
✗ Branch 4 → 6 not taken.
✗ shader.set_vec2(resolution_uni, {-1.0f, -1.0f});
167 ✗ }
168
169 ✗ bool LineDrawer::is_loaded() const
170 {
171 ✗ return shader.is_loaded();
172 }
173
174 ✗ void LineDrawer::line(const v3& world_from, const v3& world_to, const Lin_rgb& color)
175 {
176
0/2
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 4 not taken.
✗ if (lines == max_lines)
177 {
178
0/2
✗ Branch 3 → 4 not taken.
✗ Branch 3 → 7 not taken.
✗ submit();
179 }
180
181 ✗ lines += 1;
182
183 ✗ const auto add_vertex = [this,color](const v3& world_position)
184 {
185 ✗ data.push_back(world_position.x);
186 ✗ data.push_back(world_position.y);
187 ✗ data.push_back(world_position.z);
188
189 ✗ data.push_back(color.r);
190 ✗ data.push_back(color.g);
191 ✗ data.push_back(color.b);
192 ✗ };
193
194
0/2
✗ Branch 4 → 5 not taken.
✗ Branch 4 → 7 not taken.
✗ add_vertex(world_from);
195
0/2
✗ Branch 5 → 6 not taken.
✗ Branch 5 → 7 not taken.
✗ add_vertex(world_to);
196 ✗ }
197
198 ✗ void LineDrawer::set_camera(const CompiledCamera& compiled_camera)
199 {
200 ✗ shader.set_mat(clip_from_view_uni, compiled_camera.clip_from_view);
201 ✗ shader.set_mat(view_from_world_uni, compiled_camera.view_from_world);
202 ✗ }
203
204 ✗ void LineDrawer::submit()
205 {
206
0/2
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 4 not taken.
✗ if (lines == 0)
207 {
208 ✗ return;
209 }
210
211 // note: this assumes set_camera has been called
212
213 ✗ glBindVertexArray(va);
214
215 ✗ glBindBuffer(GL_ARRAY_BUFFER, vb);
216 ✗ glBufferSubData(
217 ✗ GL_ARRAY_BUFFER, 0, static_cast<GLsizeiptr>(sizeof(float) * data.size()), static_cast<const void*>(data.data())
218 );
219 ✗ glDrawElements(GL_LINES, vertices_per_line * lines, GL_UNSIGNED_INT, nullptr);
220
221 ✗ data.resize(0);
222 ✗ lines = 0;
223 }
224
225 } // namespace eu::render
226