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) {
21 options.defines = defines;
22 bool success = prog.build_program(ctx, prog_name, options, true);
23 prog.allow_context_to_set_color(false);
24 return success;
25 }
26
27public:
29 generic_renderer(const std::string& prog_name) : prog_name(prog_name) {}
30
31 void destruct(const context& ctx) {
32 prog.destruct(ctx);
33 }
34
35 bool init(context& ctx) {
36 return build_shader_program(ctx, defines);
37 }
38
39 bool set_shader_defines(const context& ctx, const shader_define_map& defines) {
40 if(prog.is_created())
41 prog.destruct(ctx);
42 return build_shader_program(ctx, defines);
43 }
44
45 shader_program& ref_prog() {
46 assert(prog.is_created() && "generic_renderer::ref_prog shader program is not created; call init before first use");
47 return prog;
48 }
49
50 shader_program& enable_prog(context& ctx) {
51 assert(prog.is_created() && "generic_renderer::enable_prog shader program is not created; call init before first use");
52 prog.enable(ctx);
53 return prog;
54 }
55
56 bool enable(context& ctx, generic_render_data& geometry) {
57 bool res = geometry.enable(ctx, prog);
58
59 if(res)
60 res &= prog.is_enabled() ? true : prog.enable(ctx);
61
62 has_indices = geometry.has_indices();
63 return res;
64 }
65
66 bool disable(context& ctx, generic_render_data& geometry) {
67 bool res = geometry.disable(ctx);
68 res &= prog.disable(ctx);
69 has_indices = false;
70 return res;
71 }
72
73 void draw(context& ctx, PrimitiveType type, generic_render_data& geometry, size_t start = 0, size_t count = 0) {
74 size_t draw_count = geometry.render_count();
75 start = std::min(start, draw_count);
76 draw_count = std::min(start + (count ? count : draw_count), draw_count) - start;
77
78 GLenum pt = gl::map_to_gl(type);
79 if(has_indices)
80 glDrawElements(pt, (GLsizei)draw_count, GL_UNSIGNED_INT, (void*)(start * sizeof(unsigned)));
81 else
82 glDrawArrays(pt, (GLint)start, (GLsizei)draw_count);
83 }
84
85
86 bool render(context& ctx, PrimitiveType type, generic_render_data& geometry, size_t start = 0, size_t count = 0) {
87 if(!enable(ctx, geometry))
88 return false;
89 draw(ctx, type, geometry, start, count);
90 return disable(ctx, geometry);
91 }
92};
93
94}
95}
96
97#include <cgv/config/lib_end.h>
base class for all drawables, which is independent of the used rendering API.
Definition context.h:626
virtual bool is_created() const
return whether component has been created
Definition context.cxx:2050
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 build_program(const context &ctx, const std::string &file_name, bool show_error=false)
successively calls create, attach_program and link.
bool is_enabled() const
check whether program is currently enabled
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:233
the cgv namespace
Definition print.h:11
holds options applied before and during shader compilation, such as preprocessor defines and code sni...
Definition shader_code.h:87
shader_define_map defines
map of pre-processor define names to values
Definition shader_code.h:89