+bool Renderer::create()
+{
+ //debug
+ // if(!(nprog = sdr_man->create_shader_program("debug.v.glsl", "debug.f.glsl"))) {
+ // fprintf(stderr, "Failed to load debug shaders.\n");
+ // }
+
+ if(!(sprog = sdr_man->create_shader_program("default.v.glsl", "default.f.glsl"))) {
+ return false;
+ }
+
+ /* getting material uniform locations: diffuse, specular, specular exponent (strength) */
+
+ diff_loc = sprog->get_uniform_location("diffuse");
+ spec_loc = sprog->get_uniform_location("specular");
+ shin_loc = sprog->get_uniform_location("shininess");
+ fog_loc = sprog->get_uniform_location("fog_density");
+
+ /* uniform locations for matrices */
+
+ mmviewproj_loc = sprog->get_uniform_location("mmviewproj");
+ mview_loc = sprog->get_uniform_location("mview");
+ mmod_loc = sprog->get_uniform_location("mmod");
+
+ /* skybox, irradiance map uniforms */
+
+ stex_loc = sprog->get_uniform_location("stex");
+ dstex_loc = sprog->get_uniform_location("dstex");
+
+ if(stex_loc != -1)
+ sprog->set_uniformi(stex_loc, 0);
+
+ if(dstex_loc != -1)
+ sprog->set_uniformi(dstex_loc, 1);
+
+ return true;
+}
+
+void Renderer::draw() const
+{
+ if(!camera || !scene)
+ return;
+
+ if(skytex) {
+ draw_skybox();
+
+ if(dskytex) {
+ dskytex->bind(1);
+ }
+ }
+
+ if(!sprog->link())
+ return;
+
+ sprog->use();
+
+ for(size_t i=0; i<scene->objects.size(); i++) {
+ draw_object(scene->objects[i]);
+ }
+}
+
+void Renderer::draw_object(Object *object) const