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"))) {
50 // tf(stderr, "Failed to load debug shaders.\n");
53 vbuf = gfx_create_uniform_buffer();
54 if(!vbuf->create(sizeof vu)) {
55 fprintf(stderr, "Failed to create uniform buffer.\n");
59 fbuf = gfx_create_uniform_buffer();
60 if(!fbuf->create(sizeof fu)) {
61 fprintf(stderr, "Failed to create uniform buffer.\n");
65 svbuf = gfx_create_uniform_buffer();
66 if(!svbuf->create(sizeof svu)) {
67 fprintf(stderr, "Failed to create uniform buffer.\n");
71 if(!(sprog = sdr_man->create_shader_program("default.v.glsl", "default.f.glsl"))) {
96 for(size_t i=0; i<scene->objects.size(); i++) {
97 draw_object(scene->objects[i]);
101 void Renderer::draw_object(Object *object)
103 Material *m = object->material;
105 /* setting uniforms for material */
107 fu.diffuse = Vec4(m->diffuse.x, m->diffuse.y, m->diffuse.z, 1.0);
108 fu.specular = Vec4(m->specular.x, m->specular.y, m->specular.z, 1.0);
109 fu.shininess = m->shininess;
110 fu.fog_density = fog_density;
113 fbuf->bind(SHADING_UNIFORMS);
120 /* setting uniforms for matrices */
122 vu.mview = object->transform * camera->get_view_matrix();
123 vu.mmviewproj = object->transform * camera->get_view_matrix() * mprojection;
124 vu.mmod = object->transform.upper3x3();
127 vbuf->bind(MATRIX_UNIFORMS);
129 object->mesh->draw();
134 vu.mmviewproj = mmviewproj;
136 vbuf->bind(MATRIX_UNIFORMS);
139 object->mesh->draw_normals(1.0);
144 void Renderer::set_sky_tex(Texture *stex)
147 skymesh = gfx_create_mesh();
148 gen_geosphere(skymesh, 1, 0);
151 if(!(skyprog = sdr_man->create_shader_program("sky.v.glsl", "sky.f.glsl")))
157 void Renderer::set_diffuse_sky_tex(Texture *dstex)
162 void Renderer::draw_skybox()
164 if(!skymesh || !skytex)
168 gfx_cull_face(GFX_CULL_NONE);
173 svu.mviewproj = camera->get_view_matrix().upper3x3() * mprojection;
175 svbuf->bind(SKY_MATRIX_UNIFORMS);
179 gfx_cull_face(GFX_CULL_BACK);