cgv
Loading...
Searching...
No Matches
generic_renderer.h
1#pragma once
2
3#include <cgv/render/shader_program.h>
4#include <cgv/render/context.h>
5
6#include "generic_render_data.h"
7
8namespace cgv {
9namespace render{
10
12protected:
13 std::string prog_name = "";
14 shader_program prog;
15 shader_define_map defines;
16
17 bool has_indices = false;
18
19 bool build_shader_program(const context& ctx, const shader_define_map& defines) {
20 bool success = prog.build_program(ctx, prog_name, true, defines);
21 prog.allow_context_to_set_color(false);
22 return success;
23 }
24
25public:
27 generic_renderer(const std::string& prog_name) : prog_name(prog_name) {}
28
29 void destruct(const context& ctx) {
30 prog.destruct(ctx);
31 }
32
33 bool init(context& ctx) {
34 return build_shader_program(ctx, defines);
35 }
36
37 bool set_shader_defines(const context& ctx, const shader_define_map& defines) {
38 if(prog.is_created())
39 prog.destruct(ctx);
40 return build_shader_program(ctx, defines);
41 }
42
43 shader_program& ref_prog() {
44 assert(prog.is_created() && "generic_renderer::ref_prog shader program is not created; call init before first use");
45 return prog;
46 }
47
48 shader_program& enable_prog(context& ctx) {
49 assert(prog.is_created() && "generic_renderer::enable_prog shader program is not created; call init before first use");
50 prog.enable(ctx);
51 return prog;
52 }
53
54 bool enable(context& ctx, generic_render_data& geometry) {
55 bool res = geometry.enable(ctx, prog);
56
57 if(res)
58 res &= prog.is_enabled() ? true : prog.enable(ctx);
59
60 has_indices = geometry.has_indices();
61 return res;
62 }
63
64 bool disable(context& ctx, generic_render_data& geometry) {
65 bool res = geometry.disable(ctx);
66 res &= prog.disable(ctx);
67 has_indices = false;
68 return res;
69 }
70
71 void draw(context& ctx, PrimitiveType type, generic_render_data& geometry, size_t start = 0, size_t count = 0) {
72 size_t draw_count = geometry.render_count();
73 start = std::min(start, draw_count);
74 draw_count = std::min(start + (count ? count : draw_count), draw_count) - start;
75
76 GLenum pt = gl::map_to_gl(type);
77 if(has_indices)
78 glDrawElements(pt, (GLsizei)draw_count, GL_UNSIGNED_INT, (void*)(start * sizeof(unsigned)));
79 else
80 glDrawArrays(pt, (GLint)start, (GLsizei)draw_count);
81 }
82
83
84 bool render(context& ctx, PrimitiveType type, generic_render_data& geometry, size_t start = 0, size_t count = 0) {
85 if(!enable(ctx, geometry))
86 return false;
87 draw(ctx, type, geometry, start, count);
88 return disable(ctx, geometry);
89 }
90};
91
92}
93}
94
95#include <cgv/config/lib_end.h>
base class for all drawables, which is independent of the used rendering API.
Definition context.h:621
virtual bool is_created() const
return whether component has been created
Definition context.cxx:2046
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
void destruct(const context &ctx)
destruct shader program
bool is_enabled() const
check whether program is currently enabled
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.
std::map< std::string, std::string > shader_define_map
typedef for shader define map data structure
Definition shader_code.h:52
PrimitiveType
different primitive types
Definition context.h:225
the cgv namespace
Definition print.h:11