WireNetwork::Ptr MixedMeshTiler::tile() { const size_t num_cells = get_num_cells(); auto transforms = get_tiling_operators(); auto vars_array = extract_attributes(m_mesh); VectorI pattern_id = m_mesh->get_attribute("pattern_id").cast<int>(); assert(pattern_id.size() == num_cells); m_tiled_vertices.clear(); m_tiled_edges.clear(); m_tiled_thicknesses.clear(); m_tiled_offsets.clear(); size_t v_count = 0; auto transform_itr = transforms.begin(); for (size_t i=0; i<num_cells; i++) { set_active_wire_network(pattern_id[i]); scale_to_unit_box(); append_vertices(*transform_itr); append_edges(v_count); append_thicknesses(vars_array[i]); append_offsets(vars_array[i], *transform_itr); v_count += m_unit_wire_network->get_num_vertices(); transform_itr++; } MatrixFr vertices = vstack(m_tiled_vertices); MatrixIr edges = vstack(m_tiled_edges); MatrixFr thicknesses = vstack(m_tiled_thicknesses); MatrixFr offsets = vstack(m_tiled_offsets); assert(edges.minCoeff() >= 0); assert(edges.maxCoeff() < vertices.rows()); WireNetwork::Ptr tiled_network = WireNetwork::create_raw(vertices, edges); tiled_network->add_attribute("thickness", m_target_type == ParameterCommon::VERTEX); tiled_network->set_attribute("thickness", thicknesses); tiled_network->add_attribute("vertex_offset", true); tiled_network->set_attribute("vertex_offset", offsets); clean_up(*tiled_network); return tiled_network; }