cgv
Loading...
Searching...
No Matches
clod_point_renderer.cxx
1#include <algorithm>
2#include <random>
3#include <unordered_map>
4#include <sstream>
5#include <cgv/math/constants.h>
6#include "clod_point_renderer.h"
7
8//**
9namespace {
10 //constants
11 constexpr int clod_reduce_group_size = 256;
12}
13namespace cgv {
14 namespace render {
15
16 namespace {
17 // stores parameters generated for the draw shaders, for an explaination search OpenGL Indirect rendering
18 // (https://www.khronos.org/opengl/wiki/Vertex_Rendering#Indirect_rendering)
20 {
21 GLuint count = 0; // element count
22 GLuint primCount = 1;
23 GLuint first = 0;
24 GLuint baseInstance = 0;
25 };
26 } // namespace
27
28 clod_point_renderer& ref_clod_point_renderer(context& ctx, int ref_count_change)
29 {
30 static int ref_count = 0;
31 static clod_point_renderer r;
32 r.manage_singelton(ctx, "clod_point_renderer", ref_count, ref_count_change);
33 return r;
34 }
35
37 CLOD = 1.f;
38 spacing = 1.f;
39 scale = 1.f;
40 min_millimeters = 1.f;
41 pointSize = 1.f;
42 draw_circles = false;
43 }
44
46 void clod_point_renderer::reduce_buffer_init(context& ctx, bool reset_parameters)
47 {
48 // bind output buffers for the reduce shader
49
50 glBindBufferBase(GL_SHADER_STORAGE_BUFFER, drawp_pos, active_draw_parameter_buffer);
51 glBindBufferBase(GL_SHADER_STORAGE_BUFFER, render_pos, active_render_buffer);
52 glBindBufferBase(GL_SHADER_STORAGE_BUFFER, index_pos, active_index_buffer);
53 if (reset_parameters)
54 reset_draw_parameters(ctx, active_draw_parameter_buffer);
55 reduce_prog.set_uniform(ctx, uniforms.frustum_extent, frustum_extend);
56 reduce_prog.set_uniform(ctx, uniforms.target_buffer_size, active_buffer_manager_ptr->size());
57 reduce_prog.enable(ctx);
58 }
59
60 void clod_point_renderer::reduce_buffer(context& ctx, const GLuint buffer, const GLuint point_id_buffer, size_t start, size_t count)
61 {
62 // allows the use of the points' indices as id in point_id_buffer else the content of a provided point id buffer is used
63 //bool use_index_as_id = true;
64 // bind the buffer
65 glBindBufferBase(GL_SHADER_STORAGE_BUFFER, input_pos, buffer);
66 if (point_id_buffer != -1) {
67 glBindBufferBase(GL_SHADER_STORAGE_BUFFER, input_id_pos, point_id_buffer);
68 reduce_prog.set_uniform(ctx, "use_index_as_id", false);
69 }
70
71 reduce_prog.set_uniform(ctx, uniforms.batch_offset, (int)start);
72 reduce_prog.set_uniform(ctx, uniforms.batch_size, (int)count);
73
74 glDispatchCompute(static_cast<GLuint>(count / clod_reduce_group_size) + 1, 1, 1); // with NVIDIA GPUs this will spam notifications about buffer usage if gl debug messages are enabled
75 }
76
79 {
80 glMemoryBarrier(GL_ALL_BARRIER_BITS);
81 reduce_prog.disable(ctx);
82 }
83
84 void clod_point_renderer::reduce_points(context& ctx, size_t start, size_t count)
85 {
86 {
87 // bind output buffers for the reduce shader
88 glBindBufferBase(GL_SHADER_STORAGE_BUFFER, drawp_pos, active_draw_parameter_buffer);
89 glBindBufferBase(GL_SHADER_STORAGE_BUFFER, render_pos, active_render_buffer);
90 glBindBufferBase(GL_SHADER_STORAGE_BUFFER, index_pos, active_index_buffer);
91
92 reset_draw_parameters(ctx, active_draw_parameter_buffer);
93
94 glBindBufferBase(GL_SHADER_STORAGE_BUFFER, input_pos, input_buffer);
95
96 //configure shader to compute everything after one frame
97 reduce_prog.set_uniform(ctx, uniforms.batch_offset, (int)start);
98 reduce_prog.set_uniform(ctx, uniforms.batch_size, (int)count);
99 reduce_prog.set_uniform(ctx, uniforms.frustum_extent, frustum_extend);
100 reduce_prog.set_uniform(ctx, uniforms.target_buffer_size, active_buffer_manager_ptr->size());
101 reduce_prog.enable(ctx);
102
103 // run computation
104 glDispatchCompute((input_buffer_num_points / clod_reduce_group_size) + 1, 1, 1); // with NVIDIA GPUs in debug mode this will spam notifications about buffer usage
105
106 // synchronize
107 glMemoryBarrier(GL_ALL_BARRIER_BITS);
108
109 reduce_prog.disable(ctx);
110 }
111 }
112
113 void clod_point_renderer::reduce_chunks(context& ctx, const uint32_t* chunk_starts, const uint32_t* chunk_point_counts, const uint32_t* reduction_sources, uint32_t num_reduction_sources)
114 {
115 // bind output buffers for the reduce shader
116 glBindBufferBase(GL_SHADER_STORAGE_BUFFER, drawp_pos, active_draw_parameter_buffer);
117 glBindBufferBase(GL_SHADER_STORAGE_BUFFER, render_pos, active_render_buffer);
118 glBindBufferBase(GL_SHADER_STORAGE_BUFFER, index_pos, active_index_buffer);
119
120 reset_draw_parameters(ctx, active_draw_parameter_buffer);
121
122 reduce_prog.set_uniform(ctx, uniforms.frustum_extent, frustum_extend);
123 reduce_prog.set_uniform(ctx, uniforms.target_buffer_size, active_buffer_manager_ptr->size());
124 reduce_prog.enable(ctx);
125
126 for (uint32_t i = 0; i < num_reduction_sources; ++i) {
127 auto chunk_id = reduction_sources[i];
128 reduce_prog.set_uniform(ctx, uniforms.batch_offset, (int)chunk_starts[chunk_id]);
129 reduce_prog.set_uniform(ctx, uniforms.batch_size, (int)chunk_point_counts[chunk_id]);
130 glDispatchCompute((chunk_point_counts[chunk_id] / clod_reduce_group_size) + 1, 1, 1);
131 }
132
133 // synchronize
134 glMemoryBarrier(GL_ALL_BARRIER_BITS);
135 reduce_prog.disable(ctx);
136 }
137
139 {
140 // draw composed buffer
141 draw_prog_ptr->enable(ctx);
142
143 glBindVertexArray(active_vertex_array);
144 glBindBuffer(GL_DRAW_INDIRECT_BUFFER, active_draw_parameter_buffer);
145 glDrawArraysIndirect(GL_POINTS, 0);
146
147 //map buffer into host address space for debugging
148
149 //DrawParameters* device_draw_parameters = static_cast<DrawParameters*>(glMapNamedBufferRange(draw_parameter_buffer, 0, sizeof(DrawParameters), GL_MAP_READ_BIT));
150 //glUnmapNamedBuffer(draw_parameter_buffer);
151
152 draw_prog_ptr->disable(ctx);
153 }
154
155 const render_style* clod_point_renderer::get_style_ptr() const
156 {
157 if (rs)
158 return rs;
159 if (default_render_style)
160 return default_render_style;
161 default_render_style = create_render_style();
162 return default_render_style;
163 }
164
165 clod_point_renderer::clod_point_renderer()
166 {
167 pivot_point_in_view_space = vec4(0.0, 0.0, 0.0, 1.0);
168 }
169
170 render_style* clod_point_renderer::create_render_style() const
171 {
172 return new clod_point_render_style();
173 }
174
175 bool clod_point_renderer::init(context& ctx)
176 {
177 if (!reduce_prog.is_created()) {
178 reduce_prog.create(ctx);
179 add_shader(ctx, reduce_prog, "point_clod_filter_points.glcs", cgv::render::ST_COMPUTE);
180 reduce_prog.link(ctx);
181
182 uniforms.batch_offset = reduce_prog.get_uniform_location(ctx, "batch_offset");
183 uniforms.batch_size = reduce_prog.get_uniform_location(ctx, "batch_size");
184 uniforms.CLOD = reduce_prog.get_uniform_location(ctx, "CLOD");
185 uniforms.frustum_extent = reduce_prog.get_uniform_location(ctx, "frustum_extent");
186 uniforms.pivot = reduce_prog.get_uniform_location(ctx, "pivot");
187 uniforms.protection_zone_points = reduce_prog.get_uniform_location(ctx, "protection_zone_points");
188 uniforms.scale = reduce_prog.get_uniform_location(ctx, "scale");
189 uniforms.screenSize = reduce_prog.get_uniform_location(ctx, "screenSize");
190 uniforms.spacing = reduce_prog.get_uniform_location(ctx, "spacing");
191 uniforms.target_buffer_size = reduce_prog.get_uniform_location(ctx, "target_buffer_size");
192 }
193 //create shader program
194 if (!draw_prog.is_created()) {
195 draw_prog.build_program(ctx, "point_clod.glpr", true);
196 }
197
198 glGenBuffers(1, &input_buffer);
199
200 buffer_manager.init(ctx);
201 buffer_manager.resize(1000000);
202 enable_buffer_manager(buffer_manager);
203
204 draw_prog_ptr = &draw_prog;
205
206 return draw_prog.is_linked() && reduce_prog.is_linked();
207 }
208
209 bool clod_point_renderer::enable(context& ctx, const mat4& reduction_model_view_matrix)
210 {
211 const clod_point_render_style& prs = get_style<clod_point_render_style>();
212
213 if (!draw_prog_ptr->is_linked()) {
214 return false;
215 }
216
217 /*
218 if (buffers_outofdate) {
219 resize_buffers(ctx);
220 buffers_outofdate = false;
221 }
222 */
223
224 //const clod_point_render_style& srs = get_style<clod_point_render_style>();
225 vec2 screenSize(static_cast<float>(ctx.get_width()), static_cast<float>(ctx.get_height()));
226
227 draw_prog_ptr->set_uniform(ctx, "CLOD" , prs.CLOD);
228 draw_prog_ptr->set_uniform(ctx, "scale", prs.scale);
229 draw_prog_ptr->set_uniform(ctx, "spacing", prs.spacing);
230 draw_prog_ptr->set_uniform(ctx, "pointSize", prs.pointSize);
231 draw_prog_ptr->set_uniform(ctx, "minMilimeters", prs.min_millimeters);
232 draw_prog_ptr->set_uniform(ctx, "screenSize", screenSize);
233 draw_prog_ptr->set_uniform(ctx, "pivot", pivot_point_in_view_space);
234 draw_prog_ptr->set_uniform(ctx, "draw_circles", prs.draw_circles);
235
236
237 //view.glsl uniforms are set on draw_prog.enable(ctx) and reduce_prog.enable(ctx)
238 mat4 modelview_matrix = ctx.get_modelview_matrix();
239 mat4 projection_matrix = ctx.get_projection_matrix();
240 mat4 reduction_mvp_matrix = projection_matrix * reduction_model_view_matrix;
241 mat4 mvp_matrix = projection_matrix * modelview_matrix;
242 draw_prog_ptr->set_uniform(ctx, "modelview", modelview_matrix);
243 draw_prog_ptr->set_uniform(ctx, "projection", projection_matrix);
244 //add precomputed model view projection matrix
245 draw_prog_ptr->set_uniform(ctx, "model_view_projection", mvp_matrix);
246 //
247 reduce_prog.set_uniform(ctx, "model_view_projection", reduction_mvp_matrix);
248 reduce_prog.set_uniform(ctx, "model_view", reduction_model_view_matrix);
249
250 // compute shader
251 reduce_prog.set_uniform(ctx, uniforms.CLOD, prs.CLOD);
252 reduce_prog.set_uniform(ctx, uniforms.scale, prs.scale);
253 reduce_prog.set_uniform(ctx, uniforms.spacing, prs.spacing);
254 reduce_prog.set_uniform(ctx, uniforms.pivot, pivot_point_in_view_space);
255 reduce_prog.set_uniform(ctx, uniforms.screenSize, screenSize);
256
257 reduce_prog.set_uniform(ctx, "use_clod", prs.use_clod);
258
259 //extract frustum
260 dmat4 transform = ctx.get_projection_matrix();
261 vec4 p4 = transform.row(3);
262
263 vec4 hpa = p4 - transform.row(1);
264 vec4 hpb = p4 + transform.row(1);
265
266 vec3 pa = vec3(hpa.x(), hpa.y(), hpa.z());
267 vec3 pb = vec3(hpb.x(), hpb.y(), hpb.z());
268
269 double y_view_angle = PI - acos(dot(pa, pb) / (pa.length() * pb.length()));
270 float pixel_extent_per_depth = (float)(2.0 * tan(0.5 * y_view_angle) / ctx.get_height());
271
272 //general point renderer uniforms
273 draw_prog_ptr->set_uniform(ctx, "use_color_index", false);
274 draw_prog_ptr->set_uniform(ctx, "pixel_extent_per_depth", pixel_extent_per_depth);
275
276 return true;
277 }
278
280 {
281 mat4 reduce_model_view = ctx.get_modelview_matrix();
282 return enable(ctx, reduce_model_view);
283 }
284
285 bool clod_point_renderer::disable(context& ctx)
286 {
287 draw_prog_ptr = &draw_prog;
288
289 // draw related stuff
290 glBindBuffer(GL_DRAW_INDIRECT_BUFFER, 0);
291 glBindVertexArray(0);
292 // reduce related stuff
293 glBindBuffer(GL_SHADER_STORAGE_BUFFER, 0);
294 return false;
295 }
296
297 void clod_point_renderer::clear(cgv::render::context& ctx)
298 {
299 reduce_prog.destruct(ctx);
300 draw_prog.destruct(ctx);
301 clear_buffers(ctx);
302 }
303
304 void clod_point_renderer::disable_buffer_manager()
305 {
306 enable_buffer_manager(buffer_manager); //enable the internal buffer manager to disable any external
307 }
308
309 void clod_point_renderer::draw(context& ctx, size_t start, size_t count)
310 {
311 reduce_points(ctx, start, count);
312 draw_points(ctx);
313 }
314
315 bool clod_point_renderer::render(context& ctx, size_t start, size_t count)
316 {
317 if (enable(ctx)) {
318 draw(ctx, start, count);
319 return true;
320 }
321 return disable(ctx);
322 }
323
324 void clod_point_renderer::set_points(cgv::render::context& ctx, const Point* pnts, const size_t num_points) {
325 assert(input_buffer != 0);
326 glBindBuffer(GL_SHADER_STORAGE_BUFFER, input_buffer);
327 glBufferData(GL_SHADER_STORAGE_BUFFER, num_points * sizeof(Point), pnts, GL_STATIC_READ);
328 glBindBuffer(GL_SHADER_STORAGE_BUFFER, 0);
329 input_buffer_size = num_points * sizeof(Point);
330 input_buffer_num_points = static_cast<GLuint>(num_points);
331 buffers_outofdate = true;
332 }
333
334 void clod_point_renderer::set_points(cgv::render::context& ctx, const vec3* positions, const rgb8* colors, const uint8_t* lods, const size_t num_points, const unsigned stride)
335 {
336 std::vector<Point> input_buffer_data(num_points);
337 const uint8_t* pos_end = (uint8_t*)positions + (stride * num_points);
338
339 auto input_it = input_buffer_data.begin();
340
341 for (int i = 0; i < num_points; ++i) {
342 input_it->position() = *positions;
343 input_it->color() = *colors;
344 input_it->level() = *lods;
345 ++input_it;
346
347 if (stride) {
348 positions = (vec3*)((uint8_t*)positions + stride);
349 colors = (rgb8*)((uint8_t*)colors + stride);
350 lods += stride;
351 }
352 else {
353 ++positions;
354 ++colors;
355 ++lods;
356 }
357
358 }
359 set_points(ctx, input_buffer_data.data(),input_buffer_data.size());
360 }
361
362 bool clod_point_renderer::enable_buffer_manager(clod_point_buffer_manager& manager)
363 {
364 active_buffer_manager_ptr = &manager;
365 active_render_buffer = manager.get_reduced_points();
366 active_draw_parameter_buffer = manager.get_draw_parameters();
367 active_index_buffer = manager.get_index_buffer();
368 active_vertex_array = manager.get_vertex_array();
369
370 return true;
371 }
372
373 void clod_point_renderer::set_max_drawn_points(cgv::render::context& ctx, const unsigned max_points)
374 {
375 if (active_buffer_manager_ptr->size() != max_points) {
376 active_buffer_manager_ptr->resize(max_points);
377 }
378 }
379
380 void clod_point_renderer::set_frustum_extend(const float& fe)
381 {
382 frustum_extend = fe;
383 }
384
385 void clod_point_renderer::set_pivot_point(const vec4& pivot)
386 {
387 pivot_point_in_view_space = pivot;
388 }
389
390 void clod_point_renderer::set_render_style(const render_style& rs)
391 {
392 this->rs = &rs;
393 }
394
395 void clod_point_renderer::manage_singelton(context& ctx, const std::string& renderer_name, int& ref_count, int ref_count_change)
396 {
397 switch (ref_count_change) {
398 case 1:
399 if (ref_count == 0) {
400 if (!init(ctx))
401 ctx.error(std::string("unable to initialize ") + renderer_name + " singelton");
402 }
403 ++ref_count;
404 break;
405 case 0:
406 break;
407 case -1:
408 if (ref_count == 0)
409 ctx.error(std::string("attempt to decrease reference count of ") + renderer_name + " singelton below 0");
410 else {
411 if (--ref_count == 0)
412 clear(ctx);
413 }
414 break;
415 default:
416 ctx.error(std::string("invalid change reference count outside {-1,0,1} for ") + renderer_name + " singelton");
417 }
418 }
419
421 {
422 draw_prog_ptr = &one_shot_prog;
423 }
424
425
426 void clod_point_renderer::add_shader(context& ctx, shader_program& prog, const std::string& sf,const cgv::render::ShaderType st)
427 {
428#ifndef NDEBUG
429 std::cout << "add shader " << sf << '\n';
430#endif // #ifdef NDEBUG
431 prog.attach_file(ctx, sf, st);
432#ifndef NDEBUG
433 if (prog.last_error.size() > 0) {
434 std::cerr << prog.last_error << '\n';
435 prog.last_error = "";
436 }
437#endif // #ifdef NDEBUG
438
439 }
440
442 {
443 DrawParameters* device_draw_parameters = static_cast<DrawParameters*>(glMapNamedBufferRange(active_draw_parameter_buffer, 0, sizeof(DrawParameters), GL_MAP_READ_BIT));
444 unsigned ret = device_draw_parameters->count;
445 glUnmapNamedBuffer(active_draw_parameter_buffer);
446 return ret;
447 }
448
449 void clod_point_renderer::clear_buffers(context& ctx)
450 {
451 glDeleteBuffers(1, &input_buffer);
452 buffer_manager.clear(ctx);
453 input_buffer = 0;
454 }
455
456 void clod_point_renderer::reset_draw_parameters(context& ctx, GLuint draw_parameter_buffer)
457 {
458 // reset draw parameters, using SubData here is better for performance
459 DrawParameters dp = DrawParameters();
460 glNamedBufferSubData(draw_parameter_buffer, 0, sizeof(DrawParameters), &dp);
461 }
462
463 bool clod_point_render_style_reflect::self_reflect(cgv::reflect::reflection_handler& rh)
464 {
465 return
466 // rh.reflect_base(*static_cast<cgv::render::clod_point_render_style*>(this)) &&
467 rh.reflect_member("CLOD_factor", CLOD) &&
468 rh.reflect_member("spacing", spacing) &&
469 rh.reflect_member("scale", scale) &&
470 rh.reflect_member("min_millimeters", min_millimeters) &&
471 rh.reflect_member("point_size", pointSize) &&
472 rh.reflect_member("use_clod", use_clod);
473
474 }
475
477 {
479 }
480
481 GLuint clod_point_buffer_manager::get_vertex_array()
482 {
483 return vertex_array;
484 }
485
486 void clod_point_buffer_manager::init(context& ctx)
487 {
488 glCreateBuffers(1, &points);
489 glCreateBuffers(1, &indices);
490 glCreateBuffers(1, &draw_parameters);
491 glGenVertexArrays(1, &vertex_array);
492 //define vertex array
493 {
494 glBindVertexArray(vertex_array);
495 // position
496 glBindBuffer(GL_ARRAY_BUFFER, points);
497 glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, sizeof(clod_point_renderer::Point), (void*)0);
498 glEnableVertexAttribArray(0);
499 // color
500 glVertexAttribPointer(1, 4, GL_UNSIGNED_BYTE, GL_TRUE, sizeof(clod_point_renderer::Point),
501 (void*)(sizeof(vec3)));
502 glEnableVertexAttribArray(1);
503 // index
504 glBindBuffer(GL_ARRAY_BUFFER, indices);
505 glVertexAttribIPointer(2, 1, GL_UNSIGNED_INT, 0, (void*)0);
506 glEnableVertexAttribArray(2);
507 glBindBuffer(GL_ARRAY_BUFFER, 0);
508 glBindVertexArray(0);
509 }
510 //init fixed size buffer
511 glBindBuffer(GL_SHADER_STORAGE_BUFFER, draw_parameters);
512 glBufferData(GL_SHADER_STORAGE_BUFFER, sizeof(DrawParameters), nullptr, GL_STREAM_DRAW);
513 glBindBuffer(GL_SHADER_STORAGE_BUFFER, 0);
514 }
515
516 void clod_point_buffer_manager::clear(context& ctx) {
517 glDeleteBuffers(1, &points);
518 glDeleteBuffers(1, &indices);
519 glDeleteBuffers(1, &draw_parameters);
520 glDeleteVertexArrays(1, &vertex_array);
521 }
522
523 void clod_point_buffer_manager::resize(GLuint num_points) {
524 if (max_num_points == num_points)
525 return;
526 glBindBuffer(GL_SHADER_STORAGE_BUFFER, get_reduced_points());
527 glBufferData(GL_SHADER_STORAGE_BUFFER, num_points * sizeof(clod_point_renderer::Point), nullptr, GL_DYNAMIC_DRAW);
528
529 glBindBuffer(GL_SHADER_STORAGE_BUFFER, get_index_buffer());
530 glBufferData(GL_SHADER_STORAGE_BUFFER, num_points * sizeof(GLuint), nullptr, GL_DYNAMIC_DRAW);
531 glBindBuffer(GL_SHADER_STORAGE_BUFFER, 0);
532
533 max_num_points = num_points;
534 }
535
537 {
538 return indices;
539 }
540
542 {
543 return draw_parameters;
544 }
545
547 {
548 return points;
549 }
550
552 {
553 DrawParameters* device_draw_parameters = static_cast<DrawParameters*>(
554 glMapNamedBufferRange(draw_parameters, 0, sizeof(DrawParameters), GL_MAP_READ_BIT));
555 GLuint ret = device_draw_parameters->count;
556 glUnmapNamedBuffer(draw_parameters);
557 return ret;
558 }
559
561 {
562 return max_num_points;
563 }
564
565 } // namespace render
566 }
567
568
569#include <cgv/gui/provider.h>
570
571namespace cgv {
572 namespace gui {
573
576 bool create(provider* p, const std::string& label,
577 void* value_ptr, const std::string& value_type,
578 const std::string& gui_type, const std::string& options, bool*) {
580 return false;
582 cgv::base::base* b = dynamic_cast<cgv::base::base*>(p);
583 p->add_member_control(b, "CLOD factor", rs_ptr->CLOD, "value_slider", "min=0.1;max=10;ticks=true");
584 p->add_member_control(b, "scale", rs_ptr->scale, "value_slider", "min=0.1;max=10;ticks=true");
585 p->add_member_control(b, "point spacing", rs_ptr->spacing, "value_slider", "min=0.1;max=10;ticks=true");
586 p->add_member_control(b, "point size", rs_ptr->pointSize, "value_slider", "min=0.1;max=10;ticks=true");
587 p->add_member_control(b, "min millimeters", rs_ptr->min_millimeters, "value_slider", "min=0.1;max=10;ticks=true");
588 p->add_member_control(b, "draw circles", rs_ptr->draw_circles, "check");
589 p->add_member_control(b, "use clod", rs_ptr->use_clod, "check");
590
591 return true;
592 }
593 };
594
595 cgv::gui::gui_creator_registration<clod_point_render_style_gui_creator> cprsgc("clod_point_render_style_gui_creator");
596 }
597}
base class for all classes that can be registered with support for dynamic properties (see also secti...
Definition base.h:75
helper template for registration of gui creators
Definition gui_creator.h:32
derive from this class to provide a gui to the current viewer
Definition provider.h:64
data::ref_ptr< control< T > > add_member_control(cgv::base::base *base_ptr, const std::string &label, T &value, const std::string &gui_type="", const std::string &options="", const std::string &align="\n")
add control with callback to cgv::base::on_set method on cgv::gui::control::value_change
Definition provider.h:137
the self reflection handler is passed to the virtual self_reflect() method of cgv::base::base.
bool reflect_member(const std::string &member_name, T &member_ref, bool hard_cast=false)
call this to reflect a member by member name and reference to the member.
GLuint get_reduced_points()
get the opengl id used to access the internal draw buffer
GLuint get_index_buffer()
get the opengl id used to access the index buffer
GLuint size()
max number of points stored in the managed buffers without resizing
GLuint num_reduced_points()
maps draw_parameters to memory and reads size
GLuint get_draw_parameters()
get the opengl id used to access the internal draw parameters
void set_prog(shader_program &one_shot_prog)
set a custom shader program that is used for one enable disable cycle
void reduce_buffer(context &ctx, const GLuint buffer, const GLuint point_id_buffer, size_t start, size_t count)
reduces a provided opengl buffer
void draw_points(context &ctx)
render reduced points, you need to call reduce_points first to fill the render_buffer
bool enable(context &ctx)
sets most uniforms
void set_points(cgv::render::context &ctx, const Point *pnts, const size_t num_points)
this method can be used if the data format of pnts matches with the internal format given by the Poin...
void reduce_points(context &ctx, size_t start, size_t count)
run point reduction step on the input data, you need to call enable first
void reduce_chunks(context &ctx, const uint32_t *chunk_starts, const uint32_t *chunk_point_counts, const uint32_t *reduction_sources, uint32_t num_reduction_sources)
do a point reduction over preselected segments of the input buffer
unsigned int num_reduced_points()
gives the number of points written to the reduction buffer
void draw(context &ctx, size_t start=0, size_t count=0)
reduces and renders the input by calling reduce_points and draw_points
void reduce_buffer_finish(context &ctx)
synchronizes and disables the shader prog.
void reduce_buffer_init(context &ctx, bool reset_parameters=true)
initializes reduce,
base class for all drawables, which is independent of the used rendering API.
Definition context.h:621
virtual dmat4 get_modelview_matrix() const =0
return homogeneous 4x4 viewing matrix, which transforms from world to eye space
virtual bool is_created() const
return whether component has been created
Definition context.cxx:2046
std::string last_error
a string that contains the last error
Definition context.h:309
a shader program combines several shader code fragments to a complete definition of the shading pipel...
bool enable(context &ctx)
enable the shader program
bool disable(context &ctx)
disable shader program and restore fixed functionality
bool set_uniform(const context &ctx, const std::string &name, const T &value, bool generate_error=false)
Set the value of a uniform by name, where the type can be any of int, unsigned, float,...
void destruct(const context &ctx)
destruct shader program
bool create(const context &ctx)
create the shader program
bool is_linked() const
return whether program is linked
bool link(const context &ctx, bool show_error=false)
link shaders to an executable program
bool attach_file(const context &ctx, const std::string &file_name, ShaderType st=ST_DETECT, const shader_define_map &defines=shader_define_map())
read shader code from file, compile and attach to program
int get_uniform_location(const context &ctx, const std::string &name) const
query location index of an uniform
bool build_program(const context &ctx, const std::string &file_name, bool show_error=false, const shader_define_map &defines=shader_define_map())
successively calls create, attach_program and link.
ShaderType
different shader types
Definition context.h:485
the cgv namespace
Definition print.h:11
cgv::math::fvec< float, 4 > vec4
declare type of 4d single precision floating point vectors (used for homogeneous coordinates)
Definition fvec.h:671
cgv::math::fmat< double, 4, 4 > dmat4
declare type of 4x4 matrices
Definition fmat.h:369
cgv::math::fvec< float, 2 > vec2
declare type of 2d single precision floating point vectors
Definition fvec.h:667
cgv::math::fvec< float, 3 > vec3
declare type of 3d single precision floating point vectors
Definition fvec.h:669
cgv::math::fmat< float, 4, 4 > mat4
declare type of 4x4 matrices
Definition fmat.h:360
bool create(provider *p, const std::string &label, void *value_ptr, const std::string &value_type, const std::string &gui_type, const std::string &options, bool *)
attempt to create a gui and return whether this was successful
interface for gui creators
Definition gui_creator.h:14
this reflection traits implementation is used for external self_reflect implementations of instances ...
render style for sphere rendere
clod_point_render_style()
construct with default values
float spacing
:= root spacing, match this to your inputs point spacing in the octrees root level,...
base class for all render styles
Definition renderer.h:16
traits class with a static function get_name() of type const char* that returns the type name of the ...
Definition type_name.h:54