コード例 #1
0
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();
}