13 #include "shader_manager.h"
21 static Mesh *skymesh; /* it will be used by many renderers => no destroy */
22 static ShaderProgram *skyprog;
35 vbuf = fbuf = svbuf = 0;
45 bool Renderer::create()
48 // if(!(nprog = sdr_man->create_shader_program("debug.v.glsl", "debug.f.glsl"))) {
49 // fprintf(stderr, "Failed to load debug shaders.\n");
52 vbuf = gfx_create_uniform_buffer();
53 if(!vbuf->create(sizeof vu)) {
54 fprintf(stderr, "Failed to create uniform buffer.\n");
58 fbuf = gfx_create_uniform_buffer();
59 if(!fbuf->create(sizeof fu)) {
60 fprintf(stderr, "Failed to create uniform buffer.\n");
64 svbuf = gfx_create_uniform_buffer();
65 if(!svbuf->create(sizeof svu)) {
66 fprintf(stderr, "Failed to create uniform buffer.\n");
70 if(!(sprog = sdr_man->create_shader_program("default.v.glsl", "default.f.glsl"))) {
95 for(size_t i=0; i<scene->objects.size(); i++) {
96 draw_object(scene->objects[i]);
100 void Renderer::draw_object(Object *object)
102 Material *m = object->material;
104 /* setting uniforms for material */
106 fu.diffuse = Vec4(m->diffuse.x, m->diffuse.y, m->diffuse.z, 1.0);
107 fu.specular = Vec4(m->specular.x, m->specular.y, m->specular.z, 1.0);
108 fu.shininess = m->shininess;
109 fu.fog_density = fog_density;
112 fbuf->bind(SHADING_UNIFORMS);
119 /* setting uniforms for matrices */
121 vu.mview = object->transform * camera->get_view_matrix();
122 vu.mmviewproj = object->transform * camera->get_view_matrix() * mprojection;
123 vu.mmod = object->transform.upper3x3();
126 vbuf->bind(MATRIX_UNIFORMS);
128 object->mesh->draw();
133 vu.mmviewproj = mmviewproj;
135 vbuf->bind(MATRIX_UNIFORMS);
138 object->mesh->draw_normals(1.0);
143 void Renderer::set_sky_tex(Texture *stex)
146 skymesh = gfx_create_mesh();
147 gen_geosphere(skymesh, 1, 0);
150 if(!(skyprog = sdr_man->create_shader_program("sky.v.glsl", "sky.f.glsl")))
156 void Renderer::set_diffuse_sky_tex(Texture *dstex)
161 void Renderer::draw_skybox()
163 if(!skymesh || !skytex)
167 gfx_cull_face(GFX_CULL_NONE);
172 svu.mviewproj = camera->get_view_matrix().upper3x3() * mprojection;
174 svbuf->bind(SKY_MATRIX_UNIFORMS);
178 gfx_cull_face(GFX_CULL_BACK);