+ view_matrix = Mat4::identity;
+ view_matrix.pre_translate(0, 0, -cam_dist);
+ view_matrix.pre_rotate(deg_to_rad(cam_phi), 1, 0, 0);
+ view_matrix.pre_rotate(deg_to_rad(cam_theta), 0, 1, 0);
+
+ glMatrixMode(GL_MODELVIEW);
+ glLoadMatrixf(view_matrix[0]);
+
+ static const Vec3 lpos[] = { Vec3(-50, 75, 100), Vec3(100, 0, 30), Vec3(-10, -10, 60) };
+ set_light(0, lpos[0], Vec3(1.0, 0.8, 0.7) * 0.8);
+ set_light(1, lpos[1], Vec3(0.6, 0.7, 1.0) * 0.6);
+ set_light(2, lpos[2], Vec3(0.8, 1.0, 0.8) * 0.3);
+
+ update(dt);
+
+ // shadowmap pass
+ begin_shadow_pass(lpos[0], Vec3(0, 0, 0), 0.2, 100, 150);
+ draw_scene();
+ end_shadow_pass();
+
+ // regular pass
+ const Mat4 &shadow_matrix = get_shadow_matrix();
+ Mat4 env_matrix = transpose(view_matrix.upper3x3());
+ set_uniform_matrix4(sdr_shadow_notex, "envmap_matrix", env_matrix[0]);
+
+ glActiveTexture(GL_TEXTURE1);
+ glBindTexture(GL_TEXTURE_2D, get_shadow_tex());
+ glMatrixMode(GL_TEXTURE);
+ glLoadMatrixf(shadow_matrix[0]);
+
+ glActiveTexture(GL_TEXTURE2);
+ glBindTexture(GL_TEXTURE_CUBE_MAP, envmap->get_id());
+
+ glActiveTexture(GL_TEXTURE0);