void CreateGeometry::visit(ColladaGeometry* geometry) { if(!geometry->getName().empty()) name = geometry->getName(); else name = geometry->getId(); ColladaMesh* mesh = geometry->getMesh(); mesh->accept(this); save_mesh(); }
bool PeriodicExploration::run_tetgen(Float max_tet_vol) { const size_t dim = m_vertices.cols(); const size_t num_vertices = m_vertices.rows(); TetgenWrapper tetgen(m_vertices, m_faces); std::stringstream flags; if (max_tet_vol == 0.0) { max_tet_vol = pow(m_default_thickness * pow(0.5, m_refine_order), dim); } flags << "pqYQa" << max_tet_vol; try { tetgen.run(flags.str()); } catch (TetgenException& e) { save_mesh("tetgen_debug.msh"); std::cerr << "Tetgen failed! Flags: " << flags.str() << std::endl; std::cerr << e.what() << std::endl; std::cerr << "Data saved in tetgen_debug.msh" << std::endl; return false; } // Important note: // // The following code is based on rather shaky the observation that tetgen // will only append to the existing list of vertices. Therefore, the face // arrays are still valid given the "Y" flag is used. MatrixFr vertices = tetgen.get_vertices(); assert(vertices.rows() > 0); assert((vertices.block(0, 0, num_vertices, dim).array()==m_vertices.array()).all()); m_vertices = vertices; m_voxels = tetgen.get_voxels(); const size_t num_vol_vertices = m_vertices.rows(); for (auto& velocity : m_shape_velocities) { velocity.conservativeResize(num_vol_vertices, dim); velocity.block(num_vertices, 0, num_vol_vertices-num_vertices, dim).setZero(); } update_mesh(); return true; }