X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?p=laserbrain_demo;a=blobdiff_plain;f=src%2Frenderer.cc;h=a4f2edbccfaecef9655e9206542ed275b71f6b3f;hp=43a96db101dda147b94ce6bd30a976d2c1be7eee;hb=2829b50d6b3d9e97fc9399f5b6929f7d64021366;hpb=844f36f03073c5db86a8acd2cf7cd1a89e1a16b9 diff --git a/src/renderer.cc b/src/renderer.cc index 43a96db..a4f2edb 100644 --- a/src/renderer.cc +++ b/src/renderer.cc @@ -1,18 +1,33 @@ #include "renderer.h" #include "rtarg.h" #include "app.h" +#include "sdr.h" + +enum { + USE_TEXMAP = 1, + USE_MIRROR = 2, +}; +static const char *use_flag_str[] = { + "#define USE_TEXMAP\n", + "#define USE_MIRROR\n" +}; +#define NUM_USE_FLAGS ((int)(sizeof use_flag_str / sizeof *use_flag_str)) + static RenderTarget *rtmirror; +static int cur_vport[4]; Renderer::Renderer() { mscn = 0; ropt = RENDER_ALL; + shaders = 0; } Renderer::~Renderer() { destroy(); + delete [] shaders; } bool Renderer::init() @@ -26,6 +41,26 @@ bool Renderer::init() } } + int numsdr = 1 << NUM_USE_FLAGS; + shaders = new unsigned int[numsdr]; + + for(int i=0; iget_width() != vp_width || rtmirror->get_height() != vp_height) { + info_log("resizing mirror render target to %dx%d\n", vp_width, vp_height); if(!rtmirror->resize(vp_width, vp_height)) { error_log("failed to resize mirror render target (%dx%d)\n", vp_width, vp_height); goto abort_mirrors; } } + glGetIntegerv(GL_VIEWPORT, cur_vport); + FlatMirror *mir = mscn->mirrors; while(mir) { draw_mirror(mir); @@ -98,6 +136,24 @@ void Renderer::draw_object(Object *obj) const } if(vis) { + unsigned int use_mask = 0; + if(obj->mtl.stdtex[MTL_TEX_DIFFUSE]) { + use_mask |= USE_TEXMAP; + } + if(obj->mtl.stdtex[MTL_TEX_REFLECT] && obj->mtl.flat_mirror) { + use_mask |= USE_MIRROR; + } + + unsigned int sdr = shaders[use_mask]; + if(use_mask & USE_MIRROR) { + float sx = 1.0f / rtmirror->texture()->get_width(); + float sy = 1.0f / rtmirror->texture()->get_height(); + set_uniform_float2(sdr, "mirtex_offs", -cur_vport[0], -cur_vport[1]); + set_uniform_float2(sdr, "mirtex_scale", sx, sy); + set_uniform_float(sdr, "reflectivity", obj->mtl.reflect); + } + bind_program(sdr); + obj->draw(); } } @@ -110,15 +166,10 @@ void Renderer::draw_mirror(FlatMirror *mir) const 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; - } + // TODO update mirror plane for movable mirrors? Mat4 mirmat; - mirmat.mirror(peq.x, peq.y, peq.z, peq.w); + mirmat.mirror(mir->wplane.normal, -dot(mir->wplane.normal, mir->wplane.pt)); glMultMatrixf(mirmat[0]); glFrontFace(GL_CW); @@ -128,10 +179,20 @@ void Renderer::draw_mirror(FlatMirror *mir) const glPopMatrix(); pop_render_target(); - dump_gl_texture(rtmirror->texture()->get_id(), "mirror.ppm"); + 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; iobjects[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; } }