inline ARRAY<double> get_offset_scales(CBvert_list& skels, CSimplexFilter& filter) { ARRAY<double> ret(skels.num()); for (int i=0; i<skels.num(); i++) ret += offset_scale(skels[i], filter); return ret; }
inline Wpt_list centroids(CBvert_list& verts) { Wpt_list ret(verts.num()); for (int i=0; i<verts.num(); i++) { ret += verts[i]->qr_centroid(); } return ret; }
inline PIXEL_list get_pixels(CBvert_list& verts, ProxySurface* p) { PIXEL_list ret(verts.num()); for (int i=0; i<verts.num(); i++) { ret += PixelsData::get_pix(verts[i], p); } return ret; }
Bvert_list Skin::sticky_verts(CBvert_list& verts) const { Bvert_list ret(verts.num()); for (int i=0; i<verts.num(); i++) { SkinMeme* m = SkinMeme::upcast(find_meme(verts[i])); if (m && m->is_sticky()) { ret += m->vert(); } } return ret; }
VertMemeList Bbase::find_boss_vmemes(CBvert_list& verts) { // Convenience: lookup boss memes for a whole list of vertices VertMemeList ret(verts.num()); for (int i=0; i<verts.num(); i++) { VertMeme* vm = find_boss_vmeme(verts[i]); if (vm) ret += vm; } return ret; }
Wpt_list Skin::track_points(CBvert_list& verts) const { Wpt_list ret(verts.num()); for (int i=0; i<verts.num(); i++) { SkinMeme* m = SkinMeme::upcast(find_meme(verts[i])); if (m && m->is_tracking()) { ret += m->track_pt(); } else { ret += verts[i]->loc(); } } return ret; }
inline bool join(CBvert_list& o, CBvert_list& c, MULTI_CMDptr& cmd, Cstr_ptr& msg) { // Used in Skin::join_to_skel() to join seams of a mesh together. JOIN_SEAM_CMDptr join = new JOIN_SEAM_CMD(o, c); if (join->doit()) { err_adv(debug, " joined %s (%d verts to %d verts)", **msg, o.num(), c.num()); cmd->add(join); return true; } else { err_adv(debug, " error: can't join %s", **msg); return false; } }
// Do a whole list of vertices at a shot: static bool gen_twins(CBvert_list& verts, double h, CSimplexFilter& filter) { bool ret = true; for (int i=0; i<verts.num(); i++) ret = gen_twins(verts[i], h, filter) && ret; return ret; }
inline void update_verts(CBvert_list& verts) { // helper for LMESH::update_subdivision(CBface_list& faces) for (int i=0; i<verts.num(); i++) ((Lvert*)verts[i])->update_subdivision(); }
int Skin::set_offsets(CBvert_list& verts, double h) const { int ret = 0; for (int i=0; i<verts.num(); i++) { ret += ::set_offset(SkinMeme::upcast(find_meme(verts[i])), h); } return ret; }
int Skin::set_sticky(CBvert_list& verts, bool sticky) const { int ret = 0; for (int i=0; i<verts.num(); i++) { ret += ::set_sticky(SkinMeme::upcast(find_meme(verts[i])), sticky); } return ret; }
void Skin::set_stay_outside(CBvert_list& verts, bool b) const { for (int i=0; i<verts.num(); i++) { SkinMeme* m = SkinMeme::upcast(find_meme(verts[i])); if (m) { m->set_stay_outside(b); } } }
bool Skin::gen_verts(CBvert_list& skel_verts) { // replicate skel verts to create new skin verts. // ignores verts that have already been done. bool ret = true; for (int i=0; i<skel_verts.num(); i++) if (!gen_vert(skel_verts[i])) ret = false; return ret; }
void Skin::restrict(CBvert_list& verts, SimplexFilter* f) const { assert(f); for (int i=0; i<verts.num(); i++) { SkinMeme* m = SkinMeme::upcast(find_meme(verts[i])); if (m) { //assert(m->track_simplex() == 0 || f->accept(m->track_simplex())); m->set_track_filter(f); } } }
inline void clear_face_flags(CBvert_list& verts) { // Helper method used below in get_parents(); // clear flags of faces adjacent to the given vertices, // including faces that are not stricly adjacent, but // that are part of a quad that contains the vertex. Bface_list star; for (int i=0; i<verts.num(); i++) { verts[i]->get_q_faces(star); star.clear_flags(); } }
inline Bface_list get_q_faces(CBvert_list& verts) { // Helper method used below in get_parents(); // return all faces adjacent to the given vertices, // including faces that are not stricly adjacent, but // that are part of a quad that contains the vertex. Bface_list ret, star; for (int i=0; i<verts.num(); i++) { verts[i]->get_q_faces(star); try_append(ret, star); } return ret; }
inline void get_parents(CBvert_list& verts, Bvert_list& vp, Bedge_list& ep) { // Helper method used below in get_parents(); // from the given list of vertices, return the parent // simplices in two lists: one of Lverts, one of Ledges. if (verts.empty()) return; assert(LMESH::isa(verts.mesh())); for (int i=0; i<verts.num(); i++) add_p((Lvert*)verts[i], vp, ep); }
Bvert_list LMESH::get_subdiv_inputs(CBvert_list& verts) { static bool debug = Config::get_var_bool("DEBUG_LMESH_SUBDIV_INPUTS",false); // Given a set of vertices from the same LMESH, return // the vertices of the parent LMESH that affect the // subdivision locations of the given vertices. // Require verts share common LMESH // XXX - could relax this, provided we test each Bvert // to ensure it is really an Lvert. if (!isa(verts.mesh())) return Bvert_list(); // Get direct parent vertices and edges Bvert_list vp; // vertex parents Bedge_list ep; // edge parents get_parents(verts, vp, ep); err_adv(debug, "%d verts: parents: %d verts, %d edges", verts.num(), vp.num(), ep.num()); // Clear flags of all adjacent faces clear_face_flags(vp); ep.clear_flag02(); // Put all adjacent faces into a list Bface_list faces = get_q_faces(vp); err_adv(debug, "parent faces from verts: %d", faces.num()); try_append(faces, ep.get_primary_faces()); err_adv(debug, "parent faces from edges too: %d", faces.num()); // Pull out the vertices: return faces.get_verts(); }
void UVdata::split(CBvert_list& verts) { for (int i=0; i<verts.num(); i++) UVdata::split(verts[i]); }
void Skin::freeze(CBvert_list& verts) const { for (int i=0; i<verts.num(); i++) ::freeze(SkinMeme::upcast(find_meme(verts[i]))); }
void Skin::track_deeper(CBvert_list& verts, int R) const { for (int i=0; i<verts.num(); i++) ::track_deeper(SkinMeme::upcast(find_meme(verts[i])), R); }