Esempio n. 1
0
        /* virtual */ void
        sphere::do_changed(field::base& f)
        {
          TRACE("hugh::scene::object::geometry::do_changed");
      
          if (&f == &subdivision) {        
            attribute_list_.clear();
            index_list_    .clear();

            octahedron const oct;
        
            for (auto const& a : oct.attributes.get()) { // why doesn't '*oct.attributes' work here?
              add_point(a.position, attribute_list_);
            }

            unsigned running_idx(unsigned((*oct.attributes).size()));
      
            for (unsigned i(0); i < (*oct.indices).size(); i += 3) {
              subdivide_triangle((*oct.indices)[i+0], (*oct.indices)[i+1], (*oct.indices)[i+2],
                                 *subdivision, attribute_list_, index_list_, running_idx);
            }
      
            compute_bounds();
            compute_tangents();
          }

          else {
            base::do_changed(f);
          }
        }
Esempio n. 2
0
static struct mesh *mesh_subdivide_icosphere(struct mesh *m, int subdivisions)
{
	struct mesh *m2;
	int i, ntris = m->ntriangles;

	if (subdivisions == 0)
		return m;

	/* Allocate space for the new, bigger mesh */
	m2 = allocate_mesh_for_copy(m->ntriangles * 4, m->nvertices + m->ntriangles * 3, 0, 0);
	if (!m2)
		return NULL;
	copy_mesh_contents(m2, m);
	mesh_free(m);

	for (i = 0; i < ntris; i++)
		subdivide_triangle(m2, i);
	normalize_sphere(m2);
	mesh_set_spherical_vertex_normals(m2);
	return mesh_subdivide_icosphere(m2, subdivisions - 1);
}