Skip to content

Commit 6676080

Browse files
authored
Refactor collision candidate classes to remove ContinuousCollisionCandidate inheritance (#156)
1 parent 44ad8a7 commit 6676080

25 files changed

+133
-158
lines changed

docs/source/cpp-api/candidates.rst

-7
Original file line numberDiff line numberDiff line change
@@ -14,13 +14,6 @@ Collision Stencil
1414
:allow-dot-graphs:
1515

1616

17-
Continuous Collision Candidate
18-
------------------------------
19-
20-
.. doxygenclass:: ipc::ContinuousCollisionCandidate
21-
:allow-dot-graphs:
22-
23-
2417
Vertex-Vertex Candidate
2518
-----------------------
2619

docs/source/python-api/candidates.rst

-7
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,6 @@ Collision Stencil
1616

1717
.. .. autoclass:: ipctk.CollisionStencil
1818
19-
Continuous Collision Candidate
20-
------------------------------
21-
22-
.. autoclass:: ipctk.ContinuousCollisionCandidate
23-
24-
.. autoclasstoc::
25-
2619
Vertex-Vertex Candidate
2720
-----------------------
2821

python/src/bindings.cpp

-1
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,6 @@ PYBIND11_MODULE(ipctk, m)
3737
// candidates
3838
define_candidates(m);
3939
define_collision_stencil(m);
40-
define_continuous_collision_candidate(m);
4140
define_edge_edge_candidate(m);
4241
define_edge_face_candidate(m);
4342
define_edge_vertex_candidate(m);

python/src/candidates/CMakeLists.txt

-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
set(SOURCES
22
collision_stencil.cpp
3-
continuous_collision_candidate.cpp
43
edge_edge.cpp
54
edge_face.cpp
65
edge_vertex.cpp

python/src/candidates/bindings.hpp

-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
// candidates
66
void define_candidates(py::module_& m);
77
void define_collision_stencil(py::module_& m);
8-
void define_continuous_collision_candidate(py::module_& m);
98
void define_edge_edge_candidate(py::module_& m);
109
void define_edge_face_candidate(py::module_& m);
1110
void define_edge_vertex_candidate(py::module_& m);

python/src/candidates/candidates.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ void define_candidates(py::module_& m)
5353
.def("clear", &Candidates::clear)
5454
.def(
5555
"__getitem__",
56-
[](Candidates& self, size_t i) -> ContinuousCollisionCandidate& {
56+
[](Candidates& self, size_t i) -> CollisionStencil& {
5757
return self[i];
5858
},
5959
py::return_value_policy::reference)

python/src/candidates/collision_stencil.cpp

+44-1
Original file line numberDiff line numberDiff line change
@@ -172,5 +172,48 @@ void define_collision_stencil(py::module_& m)
172172
Returns:
173173
Distance Hessian of the stencil w.r.t. the stencil's vertex positions.
174174
)ipc_Qu8mg5v7",
175-
py::arg("positions"));
175+
py::arg("positions"))
176+
.def(
177+
"ccd",
178+
[](const CollisionStencil& self, const VectorMax12d& vertices_t0,
179+
const VectorMax12d& vertices_t1, const double min_distance,
180+
const double tmax, const NarrowPhaseCCD& narrow_phase_ccd) {
181+
double toi;
182+
bool r = self.ccd(
183+
vertices_t0, vertices_t1, toi, min_distance, tmax,
184+
narrow_phase_ccd);
185+
return std::make_tuple(r, toi);
186+
},
187+
R"ipc_Qu8mg5v7(
188+
Perform narrow-phase CCD on the candidate.
189+
190+
Parameters:
191+
vertices_t0: Stencil vertices at the start of the time step.
192+
vertices_t1: Stencil vertices at the end of the time step.
193+
min_distance: Minimum separation distance between primitives.
194+
tmax: Maximum time (normalized) to look for collisions. Should be in [0, 1].
195+
narrow_phase_ccd: The narrow phase CCD algorithm to use.
196+
197+
Returns:
198+
Tuple of:
199+
If the candidate had a collision over the time interval.
200+
Computed time of impact (normalized).
201+
)ipc_Qu8mg5v7",
202+
py::arg("vertices_t0"), py::arg("vertices_t1"),
203+
py::arg("min_distance") = 0.0, py::arg("tmax") = 1.0,
204+
py::arg("narrow_phase_ccd") = DEFAULT_NARROW_PHASE_CCD)
205+
.def(
206+
"print_ccd_query",
207+
[](const CollisionStencil& self, const VectorMax12d& vertices_t0,
208+
const VectorMax12d& vertices_t1) -> void {
209+
self.write_ccd_query(std::cout, vertices_t0, vertices_t1);
210+
},
211+
R"ipc_Qu8mg5v7(
212+
Print the CCD query to cout.
213+
214+
Parameters:
215+
vertices_t0: Stencil vertices at the start of the time step.
216+
vertices_t1: Stencil vertices at the end of the time step.
217+
)ipc_Qu8mg5v7",
218+
py::arg("vertices_t0"), py::arg("vertices_t1"));
176219
}

python/src/candidates/continuous_collision_candidate.cpp

-56
This file was deleted.

python/src/candidates/edge_edge.cpp

+1-3
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,7 @@ using namespace ipc;
77

88
void define_edge_edge_candidate(py::module_& m)
99
{
10-
py::class_<
11-
EdgeEdgeCandidate, CollisionStencil, ContinuousCollisionCandidate>(
12-
m, "EdgeEdgeCandidate")
10+
py::class_<EdgeEdgeCandidate, CollisionStencil>(m, "EdgeEdgeCandidate")
1311
.def(py::init<long, long>(), py::arg("edge0_id"), py::arg("edge1_id"))
1412
.def(
1513
py::init([](std::tuple<long, long> edge_ids) {

python/src/candidates/edge_vertex.cpp

+1-3
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,7 @@ using namespace ipc;
77

88
void define_edge_vertex_candidate(py::module_& m)
99
{
10-
py::class_<
11-
EdgeVertexCandidate, CollisionStencil, ContinuousCollisionCandidate>(
12-
m, "EdgeVertexCandidate")
10+
py::class_<EdgeVertexCandidate, CollisionStencil>(m, "EdgeVertexCandidate")
1311
.def(py::init<long, long>(), py::arg("edge_id"), py::arg("vertex_id"))
1412
.def(
1513
py::init([](std::tuple<long, long> edge_and_vertex_id) {

python/src/candidates/face_vertex.cpp

+1-3
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,7 @@ using namespace ipc;
77

88
void define_face_vertex_candidate(py::module_& m)
99
{
10-
py::class_<
11-
FaceVertexCandidate, CollisionStencil, ContinuousCollisionCandidate>(
12-
m, "FaceVertexCandidate")
10+
py::class_<FaceVertexCandidate, CollisionStencil>(m, "FaceVertexCandidate")
1311
.def(py::init<long, long>(), py::arg("face_id"), py::arg("vertex_id"))
1412
.def(
1513
py::init([](std::tuple<long, long> face_and_vertex_id) {

python/src/candidates/vertex_vertex.cpp

+1-2
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,7 @@ using namespace ipc;
77

88
void define_vertex_vertex_candidate(py::module_& m)
99
{
10-
py::class_<
11-
VertexVertexCandidate, CollisionStencil, ContinuousCollisionCandidate>(
10+
py::class_<VertexVertexCandidate, CollisionStencil>(
1211
m, "VertexVertexCandidate")
1312
.def(
1413
py::init<long, long>(), py::arg("vertex0_id"),

src/ipc/candidates/CMakeLists.txt

+1-2
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,8 @@
11
set(SOURCES
22
candidates.cpp
33
candidates.hpp
4+
collision_stencil.cpp
45
collision_stencil.hpp
5-
continuous_collision_candidate.cpp
6-
continuous_collision_candidate.hpp
76
edge_edge.cpp
87
edge_edge.hpp
98
edge_face.cpp

src/ipc/candidates/candidates.cpp

+4-4
Original file line numberDiff line numberDiff line change
@@ -195,7 +195,7 @@ bool Candidates::is_step_collision_free(
195195

196196
// Narrow phase
197197
for (size_t i = 0; i < size(); i++) {
198-
const ContinuousCollisionCandidate& candidate = (*this)[i];
198+
const CollisionStencil& candidate = (*this)[i];
199199

200200
double toi;
201201
bool is_collision = candidate.ccd(
@@ -240,7 +240,7 @@ double Candidates::compute_collision_free_stepsize(
240240
tmax = earliest_toi;
241241
}
242242

243-
const ContinuousCollisionCandidate& candidate = (*this)[i];
243+
const CollisionStencil& candidate = (*this)[i];
244244

245245
double toi = std::numeric_limits<double>::infinity(); // output
246246
const bool are_colliding = candidate.ccd(
@@ -344,7 +344,7 @@ void Candidates::clear()
344344
fv_candidates.clear();
345345
}
346346

347-
ContinuousCollisionCandidate& Candidates::operator[](size_t i)
347+
CollisionStencil& Candidates::operator[](size_t i)
348348
{
349349
if (i < vv_candidates.size()) {
350350
return vv_candidates[i];
@@ -364,7 +364,7 @@ ContinuousCollisionCandidate& Candidates::operator[](size_t i)
364364
throw std::out_of_range("Candidate index is out of range!");
365365
}
366366

367-
const ContinuousCollisionCandidate& Candidates::operator[](size_t i) const
367+
const CollisionStencil& Candidates::operator[](size_t i) const
368368
{
369369
if (i < vv_candidates.size()) {
370370
return vv_candidates[i];

src/ipc/candidates/candidates.hpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -49,8 +49,8 @@ class Candidates {
4949

5050
void clear();
5151

52-
ContinuousCollisionCandidate& operator[](size_t i);
53-
const ContinuousCollisionCandidate& operator[](size_t i) const;
52+
CollisionStencil& operator[](size_t i);
53+
const CollisionStencil& operator[](size_t i) const;
5454

5555
/// @brief Determine if the step is collision free from the set of candidates.
5656
/// @note Assumes the trajectory is linear.

src/ipc/candidates/continuous_collision_candidate.cpp src/ipc/candidates/collision_stencil.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1-
#include "continuous_collision_candidate.hpp"
1+
#include "collision_stencil.hpp"
22

33
namespace ipc {
44

5-
std::ostream& ContinuousCollisionCandidate::write_ccd_query(
5+
std::ostream& CollisionStencil::write_ccd_query(
66
std::ostream& out,
77
const VectorMax12d& vertices_t0,
88
const VectorMax12d& vertices_t1) const

src/ipc/candidates/collision_stencil.hpp

+29
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
#pragma once
22

3+
#include <ipc/ccd/default_narrow_phase_ccd.hpp>
34
#include <ipc/utils/eigen_ext.hpp>
45

56
#include <array>
67
#include <limits>
8+
#include <ostream>
79

810
namespace ipc {
911

@@ -161,6 +163,33 @@ class CollisionStencil {
161163
/// @return Coefficients of the stencil.
162164
virtual VectorMax4d
163165
compute_coefficients(const VectorMax12d& positions) const = 0;
166+
167+
/// @brief Perform narrow-phase CCD on the candidate.
168+
/// @param[in] vertices_t0 Stencil vertices at the start of the time step.
169+
/// @param[in] vertices_t1 Stencil vertices at the end of the time step.
170+
/// @param[out] toi Computed time of impact (normalized).
171+
/// @param[in] min_distance Minimum separation distance between primitives.
172+
/// @param[in] tmax Maximum time (normalized) to look for collisions.
173+
/// @param[in] narrow_phase_ccd The narrow phase CCD algorithm to use.
174+
/// @return If the candidate had a collision over the time interval.
175+
virtual bool
176+
ccd(const VectorMax12d& vertices_t0,
177+
const VectorMax12d& vertices_t1,
178+
double& toi,
179+
const double min_distance = 0.0,
180+
const double tmax = 1.0,
181+
const NarrowPhaseCCD& narrow_phase_ccd =
182+
DEFAULT_NARROW_PHASE_CCD) const = 0;
183+
184+
/// @brief Write the CCD query to a stream.
185+
/// @param out Stream to write to.
186+
/// @param vertices_t0 Stencil vertices at the start of the time step.
187+
/// @param vertices_t1 Stencil vertices at the end of the time step.
188+
/// @return The stream.
189+
std::ostream& write_ccd_query(
190+
std::ostream& out,
191+
const VectorMax12d& vertices_t0,
192+
const VectorMax12d& vertices_t1) const;
164193
};
165194

166195
} // namespace ipc

src/ipc/candidates/continuous_collision_candidate.hpp

-44
This file was deleted.

src/ipc/candidates/edge_edge.hpp

+2-3
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
#pragma once
22

3-
#include <ipc/candidates/continuous_collision_candidate.hpp>
3+
#include <ipc/candidates/collision_stencil.hpp>
44
#include <ipc/distance/distance_type.hpp>
55

66
#include <Eigen/Core>
@@ -9,7 +9,7 @@
99

1010
namespace ipc {
1111

12-
class EdgeEdgeCandidate : public ContinuousCollisionCandidate {
12+
class EdgeEdgeCandidate : virtual public CollisionStencil {
1313
public:
1414
EdgeEdgeCandidate(long edge0_id, long edge1_id);
1515

@@ -43,7 +43,6 @@ class EdgeEdgeCandidate : public ContinuousCollisionCandidate {
4343
compute_coefficients(const VectorMax12d& positions) const override;
4444

4545
// ------------------------------------------------------------------------
46-
// ContinuousCollisionCandidate
4746

4847
bool
4948
ccd(const VectorMax12d& vertices_t0,

0 commit comments

Comments
 (0)