|  | 
| 6 | 6 | namespace py = pybind11; | 
| 7 | 7 | using namespace ipc; | 
| 8 | 8 | 
 | 
|  | 9 | +template <typename collision_type, typename parent_type> | 
|  | 10 | +void define_SmoothCollisionTemplate(py::module_& m, std::string name) | 
|  | 11 | +{ | 
|  | 12 | +    py::class_<collision_type, parent_type>(m, name.c_str()) | 
|  | 13 | +    .def("name", &collision_type::name, "Get the type name of collision") | 
|  | 14 | +    .def("num_vertices", &collision_type::num_vertices, "Get the number of vertices"); | 
|  | 15 | +} | 
|  | 16 | + | 
|  | 17 | +template <int dim> | 
|  | 18 | +void define_SmoothCollisions(py::module_& m, std::string name) | 
|  | 19 | +{ | 
|  | 20 | +    py::class_<SmoothCollisions<dim>>(m, name.c_str()) | 
|  | 21 | +        .def(py::init()) | 
|  | 22 | +        .def_readwrite("use_high_order_quadrature", &SmoothCollisions<dim>::use_high_order_quadrature) | 
|  | 23 | +        .def( | 
|  | 24 | +            "build", | 
|  | 25 | +            py::overload_cast< | 
|  | 26 | +                const CollisionMesh&, const Eigen::MatrixXd&, const ParameterType, const bool, const BroadPhaseMethod>(&SmoothCollisions<dim>::build), | 
|  | 27 | +            R"ipc_Qu8mg5v7( | 
|  | 28 | +            Initialize the set of collisions used to compute the barrier potential. | 
|  | 29 | +
 | 
|  | 30 | +            Parameters: | 
|  | 31 | +                mesh: The collision mesh. | 
|  | 32 | +                vertices: Vertices of the collision mesh. | 
|  | 33 | +                param: ParameterType. | 
|  | 34 | +                use_adaptive_dhat: If the adaptive dhat should be used. | 
|  | 35 | +                broad_phase: Broad phase method. | 
|  | 36 | +            )ipc_Qu8mg5v7", | 
|  | 37 | +            py::arg("mesh"), py::arg("vertices"), py::arg("param"), | 
|  | 38 | +            py::arg("use_adaptive_dhat") = false, py::arg("broad_phase") = DEFAULT_BROAD_PHASE_METHOD) | 
|  | 39 | +        .def( | 
|  | 40 | +            "compute_minimum_distance", &SmoothCollisions<dim>::compute_minimum_distance, | 
|  | 41 | +            R"ipc_Qu8mg5v7( | 
|  | 42 | +            Computes the minimum distance between any non-adjacent elements. | 
|  | 43 | +
 | 
|  | 44 | +            Parameters: | 
|  | 45 | +                mesh: The collision mesh. | 
|  | 46 | +                vertices: Vertices of the collision mesh. | 
|  | 47 | +
 | 
|  | 48 | +            Returns: | 
|  | 49 | +                The minimum distance between any non-adjacent elements. | 
|  | 50 | +            )ipc_Qu8mg5v7", | 
|  | 51 | +            py::arg("mesh"), py::arg("vertices")) | 
|  | 52 | +        .def("__len__", &SmoothCollisions<dim>::size, "Get the number of collisions.") | 
|  | 53 | +        .def("empty", &SmoothCollisions<dim>::empty, "Get if the collision set is empty.") | 
|  | 54 | +        .def("clear", &SmoothCollisions<dim>::clear, "Clear the collision set.") | 
|  | 55 | +        .def( | 
|  | 56 | +            "__getitem__", | 
|  | 57 | +            [](SmoothCollisions<dim>& self, size_t i) -> typename SmoothCollisions<dim>::value_type& { return self[i]; }, | 
|  | 58 | +            py::return_value_policy::reference, | 
|  | 59 | +            R"ipc_Qu8mg5v7( | 
|  | 60 | +            Get a reference to collision at index i. | 
|  | 61 | +
 | 
|  | 62 | +            Parameters: | 
|  | 63 | +                i: The index of the collision. | 
|  | 64 | +
 | 
|  | 65 | +            Returns: | 
|  | 66 | +                A reference to the collision. | 
|  | 67 | +            )ipc_Qu8mg5v7", | 
|  | 68 | +            py::arg("i")) | 
|  | 69 | +        .def( | 
|  | 70 | +            "to_string", &SmoothCollisions<dim>::to_string, py::arg("mesh"), | 
|  | 71 | +            py::arg("vertices"), py::arg("param")) | 
|  | 72 | +        .def("n_candidates", &SmoothCollisions<dim>::n_candidates, "Get the number of candidates."); | 
|  | 73 | +} | 
|  | 74 | + | 
| 9 | 75 | void define_collisions(py::module_& m) | 
| 10 | 76 | { | 
| 11 | 77 |     py::class_<Collisions>(m, "Collisions") | 
| @@ -157,82 +223,39 @@ void define_collisions(py::module_& m) | 
| 157 | 223 |         .def_readwrite("fv_collisions", &Collisions::fv_collisions) | 
| 158 | 224 |         .def_readwrite("pv_collisions", &Collisions::pv_collisions); | 
| 159 | 225 | 
 | 
| 160 |  | - | 
| 161 |  | -    py::class_<SmoothCollisions<2>>(m, "SmoothCollisions2") | 
| 162 |  | -        .def(py::init()) | 
|  | 226 | +    py::class_<SmoothCollision<6>>(m, "SmoothCollision2") | 
|  | 227 | +        .def("n_dofs", &SmoothCollision<6>::n_dofs, "Get the degree of freedom") | 
| 163 | 228 |         .def( | 
| 164 |  | -            "build", | 
| 165 |  | -            py::overload_cast< | 
| 166 |  | -                const CollisionMesh&, const Eigen::MatrixXd&, const ParameterType, const bool, const BroadPhaseMethod>(&SmoothCollisions<2>::build), | 
|  | 229 | +            "__call__", | 
|  | 230 | +            &SmoothCollision<6>::operator(), | 
| 167 | 231 |             R"ipc_Qu8mg5v7( | 
| 168 |  | -            Initialize the set of collisions used to compute the barrier potential. | 
| 169 |  | -
 | 
|  | 232 | +            Compute the potential. | 
|  | 233 | +     | 
| 170 | 234 |             Parameters: | 
| 171 |  | -                mesh: The collision mesh. | 
| 172 |  | -                vertices: Vertices of the collision mesh. | 
| 173 |  | -                param: ParameterType. | 
| 174 |  | -                use_adaptive_dhat: If the adaptive dhat should be used. | 
| 175 |  | -                broad_phase: Broad phase method. | 
|  | 235 | +                positions: The vertex positions. | 
|  | 236 | +                params: The parameters. | 
|  | 237 | +     | 
|  | 238 | +            Returns: | 
|  | 239 | +                The potential (not scaled by the barrier stiffness) of this collision pair. | 
| 176 | 240 |             )ipc_Qu8mg5v7", | 
| 177 |  | -            py::arg("mesh"), py::arg("vertices"), py::arg("param"), | 
| 178 |  | -            py::arg("use_adaptive_dhat") = false, py::arg("broad_phase") = DEFAULT_BROAD_PHASE_METHOD) | 
|  | 241 | +            py::arg("positions"), py::arg("params")) | 
| 179 | 242 |         .def( | 
| 180 |  | -            "compute_minimum_distance", &SmoothCollisions<2>::compute_minimum_distance, | 
|  | 243 | +            "__getitem__", | 
|  | 244 | +            [](SmoothCollision<6>& self, size_t i) -> long { return self[i]; }, | 
| 181 | 245 |             R"ipc_Qu8mg5v7( | 
| 182 |  | -            Computes the minimum distance between any non-adjacent elements. | 
|  | 246 | +            Get primitive id. | 
| 183 | 247 | 
 | 
| 184 | 248 |             Parameters: | 
| 185 |  | -                mesh: The collision mesh. | 
| 186 |  | -                vertices: Vertices of the collision mesh. | 
|  | 249 | +                i: 0 or 1. | 
| 187 | 250 | 
 | 
| 188 | 251 |             Returns: | 
| 189 |  | -                The minimum distance between any non-adjacent elements. | 
| 190 |  | -            )ipc_Qu8mg5v7", | 
| 191 |  | -            py::arg("mesh"), py::arg("vertices")) | 
| 192 |  | -        .def("__len__", &SmoothCollisions<2>::size, "Get the number of collisions.") | 
| 193 |  | -        .def("empty", &SmoothCollisions<2>::empty, "Get if the collision set is empty.") | 
| 194 |  | -        .def("clear", &SmoothCollisions<2>::clear, "Clear the collision set.") | 
| 195 |  | -        .def( | 
| 196 |  | -            "to_string", &SmoothCollisions<2>::to_string, py::arg("mesh"), | 
| 197 |  | -            py::arg("vertices"), py::arg("param")) | 
| 198 |  | -        .def("n_candidates", &SmoothCollisions<2>::n_candidates, "Get the number of candidates."); | 
| 199 |  | - | 
| 200 |  | -    py::class_<SmoothCollisions<3>>(m, "SmoothCollisions3") | 
| 201 |  | -        .def(py::init()) | 
| 202 |  | -        .def( | 
| 203 |  | -            "build", | 
| 204 |  | -            py::overload_cast< | 
| 205 |  | -                const CollisionMesh&, const Eigen::MatrixXd&, const ParameterType, const bool, const BroadPhaseMethod>(&SmoothCollisions<3>::build), | 
| 206 |  | -            R"ipc_Qu8mg5v7( | 
| 207 |  | -            Initialize the set of collisions used to compute the barrier potential. | 
| 208 |  | -
 | 
| 209 |  | -            Parameters: | 
| 210 |  | -                mesh: The collision mesh. | 
| 211 |  | -                vertices: Vertices of the collision mesh. | 
| 212 |  | -                param: ParameterType. | 
| 213 |  | -                use_adaptive_dhat: If the adaptive dhat should be used. | 
| 214 |  | -                broad_phase: Broad phase method. | 
|  | 252 | +                The index of the primitive. | 
| 215 | 253 |             )ipc_Qu8mg5v7", | 
| 216 |  | -            py::arg("mesh"), py::arg("vertices"), py::arg("param"), | 
| 217 |  | -            py::arg("use_adaptive_dhat") = false, py::arg("broad_phase") = DEFAULT_BROAD_PHASE_METHOD) | 
| 218 |  | -        .def( | 
| 219 |  | -            "compute_minimum_distance", &SmoothCollisions<3>::compute_minimum_distance, | 
| 220 |  | -            R"ipc_Qu8mg5v7( | 
| 221 |  | -            Computes the minimum distance between any non-adjacent elements. | 
|  | 254 | +            py::arg("i")); | 
| 222 | 255 | 
 | 
| 223 |  | -            Parameters: | 
| 224 |  | -                mesh: The collision mesh. | 
| 225 |  | -                vertices: Vertices of the collision mesh. | 
|  | 256 | +    define_SmoothCollisionTemplate<SmoothCollisionTemplate<max_vert_2d, Edge2, Point2>, SmoothCollision<6>>(m, "Edge2Point2Collision"); | 
|  | 257 | +    define_SmoothCollisionTemplate<SmoothCollisionTemplate<max_vert_2d, Point2, Point2>, SmoothCollision<6>>(m, "Point2Point2Collision"); | 
| 226 | 258 | 
 | 
| 227 |  | -            Returns: | 
| 228 |  | -                The minimum distance between any non-adjacent elements. | 
| 229 |  | -            )ipc_Qu8mg5v7", | 
| 230 |  | -            py::arg("mesh"), py::arg("vertices")) | 
| 231 |  | -        .def("__len__", &SmoothCollisions<3>::size, "Get the number of collisions.") | 
| 232 |  | -        .def("empty", &SmoothCollisions<3>::empty, "Get if the collision set is empty.") | 
| 233 |  | -        .def("clear", &SmoothCollisions<3>::clear, "Clear the collision set.") | 
| 234 |  | -        .def( | 
| 235 |  | -            "to_string", &SmoothCollisions<3>::to_string, py::arg("mesh"), | 
| 236 |  | -            py::arg("vertices"), py::arg("param")) | 
| 237 |  | -        .def("n_candidates", &SmoothCollisions<3>::n_candidates, "Get the number of candidates."); | 
|  | 259 | +    define_SmoothCollisions<2>(m, "SmoothCollisions2"); | 
|  | 260 | +    define_SmoothCollisions<3>(m, "SmoothCollisions3"); | 
| 238 | 261 | } | 
0 commit comments