void Scene::draw_plane(const Plane* plane) { Vec3f c; float rad; get_bsphere(c, rad); rad *= 100.0f; Vec3f shade(0.5f); Vec3f vert = plane->get_origin(); Vec3f v0 = vert - rad*plane->get_tangent() - rad*plane->get_binormal(); Vec3f v1 = vert + rad*plane->get_tangent() - rad*plane->get_binormal(); Vec3f v2 = vert - rad*plane->get_tangent() + rad*plane->get_binormal(); Vec3f v3 = vert + rad*plane->get_tangent() + rad*plane->get_binormal(); Vec3f norm = plane->get_normal(); Vec3f ray_vec = vert - cam->get_position(); float dist = length(ray_vec); Ray r(cam->get_position(), ray_vec/dist); r.hit_object = plane->get_mesh(); r.hit_face_id = 0; const ObjMaterial* mat = r.get_hit_material(); unsigned int model = mat->illum; if(model < shaders.size() && shaders[model]) { r.hit_pos = vert; r.hit_normal = norm; r.has_hit = true; r.dist = dist; plane->get_uv(vert, r.u, r.v); shade = shaders[model]->shade(r); } const Texture* tex = do_textures && mat->has_texture ? textures[mat->tex_name] : 0; if(tex) { tex->enable(); tex->bind(); glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); } glBegin(GL_TRIANGLE_STRIP); glColor3fv(shade.get()); glNormal3fv(norm.get()); Vec2f uv; plane->get_uv(v0, uv[0], uv[1]); glTexCoord2fv(uv.get()); glVertex3fv(v0.get()); plane->get_uv(v1, uv[0], uv[1]); glTexCoord2fv(uv.get()); glVertex3fv(v1.get()); plane->get_uv(v2, uv[0], uv[1]); glTexCoord2fv(uv.get()); glVertex3fv(v2.get()); plane->get_uv(v3, uv[0], uv[1]); glTexCoord2fv(uv.get()); glVertex3fv(v3.get()); glEnd(); if(tex) tex->disable(); }