void visit(OctreeNode* node, double regularity, Bface_list& flist, ARRAY<Wvec>& blist) { if (node->get_leaf()) { if (node->get_disp()) { // subdivision ARRAY<QuadtreeNode*> fs; Bface_list temp; for (int i = 0; i < node->intersects().num(); i++) { Bface* f = node->intersects()[i]; temp += f; fs += new QuadtreeNode(f->v1()->loc(), f->v2()->loc(), f->v3()->loc()); fs.last()->build_quadtree(node, regularity); fs.last()->set_terms(); } // assign weights assign_weights(fs, regularity, node->center()); // pick a triangle int t = pick(fs); // moved below; want to ensure flist and blist stay in sync: // flist += temp[t]; //set node face Bface_list ftemp; ftemp += temp[t]; node->set_face(ftemp); // pick a point int p = pick(fs[t]->terms()); if (p != -1) { Wvec bc; temp[t]->project_barycentric(fs[t]->terms()[p]->urand_pick(), bc); blist += bc; flist += temp[t]; // moved from above node->set_point(bc); } for (int i = 0; i < fs.num(); i++) delete fs[i]; fs.clear(); } } else { for (int i = 0; i < 8; i++) visit(node->get_children()[i], regularity, flist, blist); } }