5 static RenderTarget *rtmirror;
21 if(!rtmirror && !once) {
23 rtmirror = new RenderTarget;
24 if(!rtmirror->create(vp_width, vp_height, GL_SRGB)) {
25 error_log("failed to create mirror render target (%dx%d)\n", vp_width, vp_height);
32 void Renderer::destroy()
36 void Renderer::set_scene(MetaScene *mscn)
41 MetaScene *Renderer::get_scene() const
46 // render mirror reflections if ...
48 mscn->mirrors && /* scene contains mirrors */ \
49 (ropt & RENDER_MIRRORS) && /* mirror rendering is enabled */ \
50 rtmirror /* mirror render target succesfully created */
52 void Renderer::draw() const
56 if(DO_MIRRORS && current_render_target() != rtmirror) {
57 // check if the render target needs resizing
58 if(rtmirror->get_width() != vp_width || rtmirror->get_height() != vp_height) {
59 if(!rtmirror->resize(vp_width, vp_height)) {
60 error_log("failed to resize mirror render target (%dx%d)\n", vp_width, vp_height);
65 FlatMirror *mir = mscn->mirrors;
73 int num = (int)mscn->scenes.size();
74 for(int i=0; i<num; i++) {
75 Scene *scn = mscn->scenes[i];
77 int nobj = (int)scn->objects.size();
78 for(int j=0; j<nobj; j++) {
79 // don't draw mirrors, we already did that earlier (if mirror rendering enabled)
80 if((ropt & RENDER_MIRRORS) && scn->objects[j]->mtl.flat_mirror) {
83 draw_object(scn->objects[j]);
88 void Renderer::draw_object(Object *obj) const
91 SceneNode *n = obj->node;
105 void Renderer::draw_mirror(FlatMirror *mir) const
107 push_render_target(rtmirror);
108 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
110 glMatrixMode(GL_MODELVIEW);
113 float pdist = dot(mir->plane.normal, mir->plane.pt);
114 Vec4 peq = Vec4(mir->plane.normal.x, mir->plane.normal.y, mir->plane.normal.z, pdist);
117 peq = mir->node->get_matrix() * peq;
121 mirmat.mirror(peq.x, peq.y, peq.z, peq.w);
122 glMultMatrixf(mirmat[0]);
131 dump_gl_texture(rtmirror->texture()->get_id(), "mirror.ppm");
133 int nobj = mir->objects.size();
134 for(int i=0; i<nobj; i++) {
135 draw_object(mir->objects[i]);