13 #include "shader_manager.h"
21 static Mesh *skymesh; /* it will be used by many renderers => no destroy */
22 static ShaderProgram *skyprog;
47 bool Renderer::create()
50 // if(!(nprog = sdr_man->create_shader_program("debug.v.glsl", "debug.f.glsl"))) {
52 // tf(stderr, "Failed to load debug shaders.\n");
55 default_vs_ub = gfx_create_uniform_buffer();
56 if(!default_vs_ub->create(sizeof default_vs_uniforms)) {
57 fprintf(stderr, "Failed to create uniform buffer.\n");
61 default_fs_ub = gfx_create_uniform_buffer();
62 if(!default_fs_ub->create(sizeof default_fs_uniforms)) {
63 fprintf(stderr, "Failed to create uniform buffer.\n");
67 sky_vs_ub = gfx_create_uniform_buffer();
68 if(!sky_vs_ub->create(sizeof sky_vs_uniforms)) {
69 fprintf(stderr, "Failed to create uniform buffer.\n");
73 if(!(sprog = sdr_man->create_shader_program("default.v.glsl", "default.f.glsl"))) {
98 for(size_t i=0; i<scene->objects.size(); i++) {
99 draw_object(scene->objects[i]);
103 void Renderer::draw_object(Object *object)
105 Material *m = object->material;
107 /* setting uniforms for material */
109 default_fs_uniforms.diffuse = Vec4(m->diffuse.x, m->diffuse.y, m->diffuse.z, 1.0);
110 default_fs_uniforms.specular = Vec4(m->specular.x, m->specular.y, m->specular.z, 1.0);
111 default_fs_uniforms.shininess = m->shininess;
112 default_fs_uniforms.fog_density = fog_density;
114 default_fs_ub->update(&default_fs_uniforms);
115 default_fs_ub->bind(SHADING_UNIFORMS);
122 /* setting uniforms for matrices */
124 default_vs_uniforms.mview = object->transform * camera->get_view_matrix();
125 default_vs_uniforms.mmviewproj = object->transform * camera->get_view_matrix() * mprojection;
126 default_vs_uniforms.mmod = object->transform.upper3x3();
128 default_vs_ub->update(&default_vs_uniforms);
129 default_vs_ub->bind(MATRIX_UNIFORMS);
131 object->mesh->draw();
136 vu.mmviewproj = mmviewproj;
137 default_vs_ub->update(&vu);
138 default_vs_ub->bind(MATRIX_UNIFORMS);
141 object->mesh->draw_normals(1.0);
146 void Renderer::set_sky_tex(Texture *stex)
149 skymesh = gfx_create_mesh();
150 gen_geosphere(skymesh, 1, 0);
153 if(!(skyprog = sdr_man->create_shader_program("sky.v.glsl", "sky.f.glsl")))
159 void Renderer::set_diffuse_sky_tex(Texture *dstex)
164 void Renderer::draw_skybox()
166 if(!skymesh || !skytex)
170 gfx_cull_face(GFX_CULL_NONE);
175 sky_vs_uniforms.mviewproj = camera->get_view_matrix().upper3x3() * mprojection;
176 sky_vs_ub->update(&sky_vs_uniforms);
177 sky_vs_ub->bind(SKY_MATRIX_UNIFORMS);
181 gfx_cull_face(GFX_CULL_BACK);