/* 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); } }
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); }