|
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