+
+void Renderer::draw_mirror(FlatMirror *mir) const
+{
+ push_render_target(rtmirror);
+ glClearColor(1, 0, 0, 1);
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+ glClearColor(1, 1, 1, 1);
+
+ glMatrixMode(GL_MODELVIEW);
+ glPushMatrix();
+
+ // TODO update mirror plane for movable mirrors?
+
+ Mat4 mirmat;
+ mirmat.mirror(mir->wplane.normal, dot(mir->wplane.normal, mir->wplane.pt));
+ glMultMatrixf(mirmat[0]);
+
+ glFrontFace(GL_CW);
+ draw();
+ glFrontFace(GL_CCW);
+
+ glPopMatrix();
+ pop_render_target();
+
+ if(dbg_key_pending & 1) {
+ dump_gl_texture(rtmirror->texture()->get_id(), "mirror.ppm");
+ dbg_key_pending &= ~1;
+ }
+
+ int nobj = mir->objects.size();
+ for(int i=0; i<nobj; i++) {
+ Object *obj = (Object*)mir->objects[i];
+
+ Texture *prev_refl_tex = obj->mtl.stdtex[MTL_TEX_REFLECT];
+ obj->mtl.stdtex[MTL_TEX_REFLECT] = rtmirror->texture();
+
+ draw_object(mir->objects[i]);
+
+ obj->mtl.stdtex[MTL_TEX_REFLECT] = prev_refl_tex;
+ }
+}