+ bool vis = true;
+ SceneNode *n = obj->node;
+ while(n) {
+ if(!n->visible) {
+ vis = false;
+ break;
+ }
+ n = n->get_parent();
+ }
+
+ if(vis) {
+ obj->draw();
+ }
+}
+
+void Renderer::draw_mirror(FlatMirror *mir) const
+{
+ push_render_target(rtmirror);
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ glMatrixMode(GL_MODELVIEW);
+ glPushMatrix();
+
+ float pdist = dot(mir->plane.normal, mir->plane.pt);
+ Vec4 peq = Vec4(mir->plane.normal.x, mir->plane.normal.y, mir->plane.normal.z, pdist);
+
+ if(mir->node) {
+ peq = mir->node->get_matrix() * peq;
+ }
+
+ Mat4 mirmat;
+ mirmat.mirror(peq.x, peq.y, peq.z, peq.w);
+ glMultMatrixf(mirmat[0]);
+
+ glFrontFace(GL_CW);
+ draw();
+ glFrontFace(GL_CCW);
+
+ glPopMatrix();
+ pop_render_target();
+
+ dump_gl_texture(rtmirror->texture()->get_id(), "mirror.ppm");
+
+ int nobj = mir->objects.size();
+ for(int i=0; i<nobj; i++) {
+ draw_object(mir->objects[i]);
+ }