mirror of
https://github.com/facebookresearch/pytorch3d.git
synced 2025-08-02 03:42:50 +08:00
add min_triangle_area argument to IsInsideTriangle
Summary: 1. changed IsInsideTriangle in geometry_utils to take in min_triangle_area parameter instead of hardcoded value 2. updated point_mesh_cpu.cpp and point_mesh_cuda.[h/cu] to adapt to changes in geometry_utils function signatures 3. updated point_mesh_distance.py and test_point_mesh_distance.py to modify _C. calls Reviewed By: bottler Differential Revision: D34459764 fbshipit-source-id: 0549e78713c6d68f03d85fb597a13dd88e09b686
This commit is contained in:
parent
4d043fc9ac
commit
471b126818
@ -57,29 +57,33 @@ void IncrementPoint(at::TensorAccessor<T, 1>&& t, const vec3<T>& point) {
|
|||||||
template <typename T>
|
template <typename T>
|
||||||
T HullDistance(
|
T HullDistance(
|
||||||
const std::array<vec3<T>, 1>& a,
|
const std::array<vec3<T>, 1>& a,
|
||||||
const std::array<vec3<T>, 2>& b) {
|
const std::array<vec3<T>, 2>& b,
|
||||||
|
const double /*min_triangle_area*/) {
|
||||||
using std::get;
|
using std::get;
|
||||||
return PointLine3DistanceForward(get<0>(a), get<0>(b), get<1>(b));
|
return PointLine3DistanceForward(get<0>(a), get<0>(b), get<1>(b));
|
||||||
}
|
}
|
||||||
template <typename T>
|
template <typename T>
|
||||||
T HullDistance(
|
T HullDistance(
|
||||||
const std::array<vec3<T>, 1>& a,
|
const std::array<vec3<T>, 1>& a,
|
||||||
const std::array<vec3<T>, 3>& b) {
|
const std::array<vec3<T>, 3>& b,
|
||||||
|
const double min_triangle_area) {
|
||||||
using std::get;
|
using std::get;
|
||||||
return PointTriangle3DistanceForward(
|
return PointTriangle3DistanceForward(
|
||||||
get<0>(a), get<0>(b), get<1>(b), get<2>(b));
|
get<0>(a), get<0>(b), get<1>(b), get<2>(b), min_triangle_area);
|
||||||
}
|
}
|
||||||
template <typename T>
|
template <typename T>
|
||||||
T HullDistance(
|
T HullDistance(
|
||||||
const std::array<vec3<T>, 2>& a,
|
const std::array<vec3<T>, 2>& a,
|
||||||
const std::array<vec3<T>, 1>& b) {
|
const std::array<vec3<T>, 1>& b,
|
||||||
return HullDistance(b, a);
|
const double /*min_triangle_area*/) {
|
||||||
|
return HullDistance(b, a, 1);
|
||||||
}
|
}
|
||||||
template <typename T>
|
template <typename T>
|
||||||
T HullDistance(
|
T HullDistance(
|
||||||
const std::array<vec3<T>, 3>& a,
|
const std::array<vec3<T>, 3>& a,
|
||||||
const std::array<vec3<T>, 1>& b) {
|
const std::array<vec3<T>, 1>& b,
|
||||||
return HullDistance(b, a);
|
const double min_triangle_area) {
|
||||||
|
return HullDistance(b, a, min_triangle_area);
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
@ -88,7 +92,8 @@ void HullHullDistanceBackward(
|
|||||||
const std::array<vec3<T>, 2>& b,
|
const std::array<vec3<T>, 2>& b,
|
||||||
T grad_dist,
|
T grad_dist,
|
||||||
at::TensorAccessor<T, 1>&& grad_a,
|
at::TensorAccessor<T, 1>&& grad_a,
|
||||||
at::TensorAccessor<T, 2>&& grad_b) {
|
at::TensorAccessor<T, 2>&& grad_b,
|
||||||
|
const double /*min_triangle_area*/) {
|
||||||
using std::get;
|
using std::get;
|
||||||
auto res =
|
auto res =
|
||||||
PointLine3DistanceBackward(get<0>(a), get<0>(b), get<1>(b), grad_dist);
|
PointLine3DistanceBackward(get<0>(a), get<0>(b), get<1>(b), grad_dist);
|
||||||
@ -102,10 +107,11 @@ void HullHullDistanceBackward(
|
|||||||
const std::array<vec3<T>, 3>& b,
|
const std::array<vec3<T>, 3>& b,
|
||||||
T grad_dist,
|
T grad_dist,
|
||||||
at::TensorAccessor<T, 1>&& grad_a,
|
at::TensorAccessor<T, 1>&& grad_a,
|
||||||
at::TensorAccessor<T, 2>&& grad_b) {
|
at::TensorAccessor<T, 2>&& grad_b,
|
||||||
|
const double min_triangle_area) {
|
||||||
using std::get;
|
using std::get;
|
||||||
auto res = PointTriangle3DistanceBackward(
|
auto res = PointTriangle3DistanceBackward(
|
||||||
get<0>(a), get<0>(b), get<1>(b), get<2>(b), grad_dist);
|
get<0>(a), get<0>(b), get<1>(b), get<2>(b), grad_dist, min_triangle_area);
|
||||||
IncrementPoint(std::move(grad_a), get<0>(res));
|
IncrementPoint(std::move(grad_a), get<0>(res));
|
||||||
IncrementPoint(grad_b[0], get<1>(res));
|
IncrementPoint(grad_b[0], get<1>(res));
|
||||||
IncrementPoint(grad_b[1], get<2>(res));
|
IncrementPoint(grad_b[1], get<2>(res));
|
||||||
@ -117,9 +123,10 @@ void HullHullDistanceBackward(
|
|||||||
const std::array<vec3<T>, 1>& b,
|
const std::array<vec3<T>, 1>& b,
|
||||||
T grad_dist,
|
T grad_dist,
|
||||||
at::TensorAccessor<T, 2>&& grad_a,
|
at::TensorAccessor<T, 2>&& grad_a,
|
||||||
at::TensorAccessor<T, 1>&& grad_b) {
|
at::TensorAccessor<T, 1>&& grad_b,
|
||||||
|
const double min_triangle_area) {
|
||||||
return HullHullDistanceBackward(
|
return HullHullDistanceBackward(
|
||||||
b, a, grad_dist, std::move(grad_b), std::move(grad_a));
|
b, a, grad_dist, std::move(grad_b), std::move(grad_a), min_triangle_area);
|
||||||
}
|
}
|
||||||
template <typename T>
|
template <typename T>
|
||||||
void HullHullDistanceBackward(
|
void HullHullDistanceBackward(
|
||||||
@ -127,9 +134,10 @@ void HullHullDistanceBackward(
|
|||||||
const std::array<vec3<T>, 1>& b,
|
const std::array<vec3<T>, 1>& b,
|
||||||
T grad_dist,
|
T grad_dist,
|
||||||
at::TensorAccessor<T, 2>&& grad_a,
|
at::TensorAccessor<T, 2>&& grad_a,
|
||||||
at::TensorAccessor<T, 1>&& grad_b) {
|
at::TensorAccessor<T, 1>&& grad_b,
|
||||||
|
const double /*min_triangle_area*/) {
|
||||||
return HullHullDistanceBackward(
|
return HullHullDistanceBackward(
|
||||||
b, a, grad_dist, std::move(grad_b), std::move(grad_a));
|
b, a, grad_dist, std::move(grad_b), std::move(grad_a), 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
template <int H>
|
template <int H>
|
||||||
@ -150,7 +158,8 @@ std::tuple<at::Tensor, at::Tensor> HullHullDistanceForwardCpu(
|
|||||||
const at::Tensor& as,
|
const at::Tensor& as,
|
||||||
const at::Tensor& as_first_idx,
|
const at::Tensor& as_first_idx,
|
||||||
const at::Tensor& bs,
|
const at::Tensor& bs,
|
||||||
const at::Tensor& bs_first_idx) {
|
const at::Tensor& bs_first_idx,
|
||||||
|
const double min_triangle_area) {
|
||||||
const int64_t A_N = as.size(0);
|
const int64_t A_N = as.size(0);
|
||||||
const int64_t B_N = bs.size(0);
|
const int64_t B_N = bs.size(0);
|
||||||
const int64_t BATCHES = as_first_idx.size(0);
|
const int64_t BATCHES = as_first_idx.size(0);
|
||||||
@ -190,7 +199,8 @@ std::tuple<at::Tensor, at::Tensor> HullHullDistanceForwardCpu(
|
|||||||
size_t min_idx = 0;
|
size_t min_idx = 0;
|
||||||
auto a = ExtractHull<H1>(as_a[a_n]);
|
auto a = ExtractHull<H1>(as_a[a_n]);
|
||||||
for (int64_t b_n = b_batch_start; b_n < b_batch_end; ++b_n) {
|
for (int64_t b_n = b_batch_start; b_n < b_batch_end; ++b_n) {
|
||||||
float dist = HullDistance(a, ExtractHull<H2>(bs_a[b_n]));
|
float dist =
|
||||||
|
HullDistance(a, ExtractHull<H2>(bs_a[b_n]), min_triangle_area);
|
||||||
if (dist <= min_dist) {
|
if (dist <= min_dist) {
|
||||||
min_dist = dist;
|
min_dist = dist;
|
||||||
min_idx = b_n;
|
min_idx = b_n;
|
||||||
@ -208,7 +218,8 @@ std::tuple<at::Tensor, at::Tensor> HullHullDistanceBackwardCpu(
|
|||||||
const at::Tensor& as,
|
const at::Tensor& as,
|
||||||
const at::Tensor& bs,
|
const at::Tensor& bs,
|
||||||
const at::Tensor& idx_bs,
|
const at::Tensor& idx_bs,
|
||||||
const at::Tensor& grad_dists) {
|
const at::Tensor& grad_dists,
|
||||||
|
const double min_triangle_area) {
|
||||||
const int64_t A_N = as.size(0);
|
const int64_t A_N = as.size(0);
|
||||||
|
|
||||||
TORCH_CHECK(idx_bs.size(0) == A_N);
|
TORCH_CHECK(idx_bs.size(0) == A_N);
|
||||||
@ -230,7 +241,12 @@ std::tuple<at::Tensor, at::Tensor> HullHullDistanceBackwardCpu(
|
|||||||
auto a = ExtractHull<H1>(as_a[a_n]);
|
auto a = ExtractHull<H1>(as_a[a_n]);
|
||||||
auto b = ExtractHull<H2>(bs_a[idx_bs_a[a_n]]);
|
auto b = ExtractHull<H2>(bs_a[idx_bs_a[a_n]]);
|
||||||
HullHullDistanceBackward(
|
HullHullDistanceBackward(
|
||||||
a, b, grad_dists_a[a_n], grad_as_a[a_n], grad_bs_a[idx_bs_a[a_n]]);
|
a,
|
||||||
|
b,
|
||||||
|
grad_dists_a[a_n],
|
||||||
|
grad_as_a[a_n],
|
||||||
|
grad_bs_a[idx_bs_a[a_n]],
|
||||||
|
min_triangle_area);
|
||||||
}
|
}
|
||||||
return std::make_tuple(grad_as, grad_bs);
|
return std::make_tuple(grad_as, grad_bs);
|
||||||
}
|
}
|
||||||
@ -238,7 +254,8 @@ std::tuple<at::Tensor, at::Tensor> HullHullDistanceBackwardCpu(
|
|||||||
template <int H>
|
template <int H>
|
||||||
torch::Tensor PointHullArrayDistanceForwardCpu(
|
torch::Tensor PointHullArrayDistanceForwardCpu(
|
||||||
const torch::Tensor& points,
|
const torch::Tensor& points,
|
||||||
const torch::Tensor& bs) {
|
const torch::Tensor& bs,
|
||||||
|
const double min_triangle_area) {
|
||||||
const int64_t P = points.size(0);
|
const int64_t P = points.size(0);
|
||||||
const int64_t B_N = bs.size(0);
|
const int64_t B_N = bs.size(0);
|
||||||
|
|
||||||
@ -254,7 +271,7 @@ torch::Tensor PointHullArrayDistanceForwardCpu(
|
|||||||
auto dest = dists_a[p];
|
auto dest = dists_a[p];
|
||||||
for (int64_t b_n = 0; b_n < B_N; ++b_n) {
|
for (int64_t b_n = 0; b_n < B_N; ++b_n) {
|
||||||
auto b = ExtractHull<H>(bs_a[b_n]);
|
auto b = ExtractHull<H>(bs_a[b_n]);
|
||||||
dest[b_n] = HullDistance(point, b);
|
dest[b_n] = HullDistance(point, b, min_triangle_area);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return dists;
|
return dists;
|
||||||
@ -264,7 +281,8 @@ template <int H>
|
|||||||
std::tuple<at::Tensor, at::Tensor> PointHullArrayDistanceBackwardCpu(
|
std::tuple<at::Tensor, at::Tensor> PointHullArrayDistanceBackwardCpu(
|
||||||
const at::Tensor& points,
|
const at::Tensor& points,
|
||||||
const at::Tensor& bs,
|
const at::Tensor& bs,
|
||||||
const at::Tensor& grad_dists) {
|
const at::Tensor& grad_dists,
|
||||||
|
const double min_triangle_area) {
|
||||||
const int64_t P = points.size(0);
|
const int64_t P = points.size(0);
|
||||||
const int64_t B_N = bs.size(0);
|
const int64_t B_N = bs.size(0);
|
||||||
|
|
||||||
@ -287,7 +305,12 @@ std::tuple<at::Tensor, at::Tensor> PointHullArrayDistanceBackwardCpu(
|
|||||||
for (int64_t b_n = 0; b_n < B_N; ++b_n) {
|
for (int64_t b_n = 0; b_n < B_N; ++b_n) {
|
||||||
auto b = ExtractHull<H>(bs_a[b_n]);
|
auto b = ExtractHull<H>(bs_a[b_n]);
|
||||||
HullHullDistanceBackward(
|
HullHullDistanceBackward(
|
||||||
point, b, grad_dist[b_n], std::move(grad_point), grad_bs_a[b_n]);
|
point,
|
||||||
|
b,
|
||||||
|
grad_dist[b_n],
|
||||||
|
std::move(grad_point),
|
||||||
|
grad_bs_a[b_n],
|
||||||
|
min_triangle_area);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return std::make_tuple(grad_points, grad_bs);
|
return std::make_tuple(grad_points, grad_bs);
|
||||||
@ -299,63 +322,70 @@ std::tuple<torch::Tensor, torch::Tensor> PointFaceDistanceForwardCpu(
|
|||||||
const torch::Tensor& points,
|
const torch::Tensor& points,
|
||||||
const torch::Tensor& points_first_idx,
|
const torch::Tensor& points_first_idx,
|
||||||
const torch::Tensor& tris,
|
const torch::Tensor& tris,
|
||||||
const torch::Tensor& tris_first_idx) {
|
const torch::Tensor& tris_first_idx,
|
||||||
|
const double min_triangle_area) {
|
||||||
return HullHullDistanceForwardCpu<1, 3>(
|
return HullHullDistanceForwardCpu<1, 3>(
|
||||||
points, points_first_idx, tris, tris_first_idx);
|
points, points_first_idx, tris, tris_first_idx, min_triangle_area);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::tuple<torch::Tensor, torch::Tensor> PointFaceDistanceBackwardCpu(
|
std::tuple<torch::Tensor, torch::Tensor> PointFaceDistanceBackwardCpu(
|
||||||
const torch::Tensor& points,
|
const torch::Tensor& points,
|
||||||
const torch::Tensor& tris,
|
const torch::Tensor& tris,
|
||||||
const torch::Tensor& idx_points,
|
const torch::Tensor& idx_points,
|
||||||
const torch::Tensor& grad_dists) {
|
const torch::Tensor& grad_dists,
|
||||||
|
const double min_triangle_area) {
|
||||||
return HullHullDistanceBackwardCpu<1, 3>(
|
return HullHullDistanceBackwardCpu<1, 3>(
|
||||||
points, tris, idx_points, grad_dists);
|
points, tris, idx_points, grad_dists, min_triangle_area);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::tuple<torch::Tensor, torch::Tensor> FacePointDistanceForwardCpu(
|
std::tuple<torch::Tensor, torch::Tensor> FacePointDistanceForwardCpu(
|
||||||
const torch::Tensor& points,
|
const torch::Tensor& points,
|
||||||
const torch::Tensor& points_first_idx,
|
const torch::Tensor& points_first_idx,
|
||||||
const torch::Tensor& tris,
|
const torch::Tensor& tris,
|
||||||
const torch::Tensor& tris_first_idx) {
|
const torch::Tensor& tris_first_idx,
|
||||||
|
const double min_triangle_area) {
|
||||||
return HullHullDistanceForwardCpu<3, 1>(
|
return HullHullDistanceForwardCpu<3, 1>(
|
||||||
tris, tris_first_idx, points, points_first_idx);
|
tris, tris_first_idx, points, points_first_idx, min_triangle_area);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::tuple<torch::Tensor, torch::Tensor> FacePointDistanceBackwardCpu(
|
std::tuple<torch::Tensor, torch::Tensor> FacePointDistanceBackwardCpu(
|
||||||
const torch::Tensor& points,
|
const torch::Tensor& points,
|
||||||
const torch::Tensor& tris,
|
const torch::Tensor& tris,
|
||||||
const torch::Tensor& idx_tris,
|
const torch::Tensor& idx_tris,
|
||||||
const torch::Tensor& grad_dists) {
|
const torch::Tensor& grad_dists,
|
||||||
auto res =
|
const double min_triangle_area) {
|
||||||
HullHullDistanceBackwardCpu<3, 1>(tris, points, idx_tris, grad_dists);
|
auto res = HullHullDistanceBackwardCpu<3, 1>(
|
||||||
|
tris, points, idx_tris, grad_dists, min_triangle_area);
|
||||||
return std::make_tuple(std::get<1>(res), std::get<0>(res));
|
return std::make_tuple(std::get<1>(res), std::get<0>(res));
|
||||||
}
|
}
|
||||||
|
|
||||||
torch::Tensor PointEdgeArrayDistanceForwardCpu(
|
torch::Tensor PointEdgeArrayDistanceForwardCpu(
|
||||||
const torch::Tensor& points,
|
const torch::Tensor& points,
|
||||||
const torch::Tensor& segms) {
|
const torch::Tensor& segms) {
|
||||||
return PointHullArrayDistanceForwardCpu<2>(points, segms);
|
return PointHullArrayDistanceForwardCpu<2>(points, segms, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::tuple<at::Tensor, at::Tensor> PointFaceArrayDistanceBackwardCpu(
|
std::tuple<at::Tensor, at::Tensor> PointFaceArrayDistanceBackwardCpu(
|
||||||
const at::Tensor& points,
|
const at::Tensor& points,
|
||||||
const at::Tensor& tris,
|
const at::Tensor& tris,
|
||||||
const at::Tensor& grad_dists) {
|
const at::Tensor& grad_dists,
|
||||||
return PointHullArrayDistanceBackwardCpu<3>(points, tris, grad_dists);
|
const double min_triangle_area) {
|
||||||
|
return PointHullArrayDistanceBackwardCpu<3>(
|
||||||
|
points, tris, grad_dists, min_triangle_area);
|
||||||
}
|
}
|
||||||
|
|
||||||
torch::Tensor PointFaceArrayDistanceForwardCpu(
|
torch::Tensor PointFaceArrayDistanceForwardCpu(
|
||||||
const torch::Tensor& points,
|
const torch::Tensor& points,
|
||||||
const torch::Tensor& tris) {
|
const torch::Tensor& tris,
|
||||||
return PointHullArrayDistanceForwardCpu<3>(points, tris);
|
const double min_triangle_area) {
|
||||||
|
return PointHullArrayDistanceForwardCpu<3>(points, tris, min_triangle_area);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::tuple<at::Tensor, at::Tensor> PointEdgeArrayDistanceBackwardCpu(
|
std::tuple<at::Tensor, at::Tensor> PointEdgeArrayDistanceBackwardCpu(
|
||||||
const at::Tensor& points,
|
const at::Tensor& points,
|
||||||
const at::Tensor& segms,
|
const at::Tensor& segms,
|
||||||
const at::Tensor& grad_dists) {
|
const at::Tensor& grad_dists) {
|
||||||
return PointHullArrayDistanceBackwardCpu<2>(points, segms, grad_dists);
|
return PointHullArrayDistanceBackwardCpu<2>(points, segms, grad_dists, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::tuple<torch::Tensor, torch::Tensor> PointEdgeDistanceForwardCpu(
|
std::tuple<torch::Tensor, torch::Tensor> PointEdgeDistanceForwardCpu(
|
||||||
@ -365,7 +395,7 @@ std::tuple<torch::Tensor, torch::Tensor> PointEdgeDistanceForwardCpu(
|
|||||||
const torch::Tensor& segms_first_idx,
|
const torch::Tensor& segms_first_idx,
|
||||||
const int64_t /*max_points*/) {
|
const int64_t /*max_points*/) {
|
||||||
return HullHullDistanceForwardCpu<1, 2>(
|
return HullHullDistanceForwardCpu<1, 2>(
|
||||||
points, points_first_idx, segms, segms_first_idx);
|
points, points_first_idx, segms, segms_first_idx, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::tuple<torch::Tensor, torch::Tensor> PointEdgeDistanceBackwardCpu(
|
std::tuple<torch::Tensor, torch::Tensor> PointEdgeDistanceBackwardCpu(
|
||||||
@ -374,7 +404,7 @@ std::tuple<torch::Tensor, torch::Tensor> PointEdgeDistanceBackwardCpu(
|
|||||||
const torch::Tensor& idx_points,
|
const torch::Tensor& idx_points,
|
||||||
const torch::Tensor& grad_dists) {
|
const torch::Tensor& grad_dists) {
|
||||||
return HullHullDistanceBackwardCpu<1, 2>(
|
return HullHullDistanceBackwardCpu<1, 2>(
|
||||||
points, segms, idx_points, grad_dists);
|
points, segms, idx_points, grad_dists, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::tuple<torch::Tensor, torch::Tensor> EdgePointDistanceForwardCpu(
|
std::tuple<torch::Tensor, torch::Tensor> EdgePointDistanceForwardCpu(
|
||||||
@ -384,7 +414,7 @@ std::tuple<torch::Tensor, torch::Tensor> EdgePointDistanceForwardCpu(
|
|||||||
const torch::Tensor& segms_first_idx,
|
const torch::Tensor& segms_first_idx,
|
||||||
const int64_t /*max_segms*/) {
|
const int64_t /*max_segms*/) {
|
||||||
return HullHullDistanceForwardCpu<2, 1>(
|
return HullHullDistanceForwardCpu<2, 1>(
|
||||||
segms, segms_first_idx, points, points_first_idx);
|
segms, segms_first_idx, points, points_first_idx, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::tuple<torch::Tensor, torch::Tensor> EdgePointDistanceBackwardCpu(
|
std::tuple<torch::Tensor, torch::Tensor> EdgePointDistanceBackwardCpu(
|
||||||
@ -392,7 +422,7 @@ std::tuple<torch::Tensor, torch::Tensor> EdgePointDistanceBackwardCpu(
|
|||||||
const torch::Tensor& segms,
|
const torch::Tensor& segms,
|
||||||
const torch::Tensor& idx_segms,
|
const torch::Tensor& idx_segms,
|
||||||
const torch::Tensor& grad_dists) {
|
const torch::Tensor& grad_dists) {
|
||||||
auto res =
|
auto res = HullHullDistanceBackwardCpu<2, 1>(
|
||||||
HullHullDistanceBackwardCpu<2, 1>(segms, points, idx_segms, grad_dists);
|
segms, points, idx_segms, grad_dists, 1);
|
||||||
return std::make_tuple(std::get<1>(res), std::get<0>(res));
|
return std::make_tuple(std::get<1>(res), std::get<0>(res));
|
||||||
}
|
}
|
||||||
|
@ -32,7 +32,8 @@ __global__ void DistanceForwardKernel(
|
|||||||
const int64_t* __restrict__ targets_first_idx, // (B,)
|
const int64_t* __restrict__ targets_first_idx, // (B,)
|
||||||
const size_t batch_size, // B
|
const size_t batch_size, // B
|
||||||
float* __restrict__ dist_objects, // (O,)
|
float* __restrict__ dist_objects, // (O,)
|
||||||
int64_t* __restrict__ idx_objects) { // (O,)
|
int64_t* __restrict__ idx_objects, // (O,)
|
||||||
|
const double min_triangle_area) {
|
||||||
// This kernel is used interchangeably to compute bi-directional distances
|
// This kernel is used interchangeably to compute bi-directional distances
|
||||||
// between points and triangles/lines. The direction of the distance computed,
|
// between points and triangles/lines. The direction of the distance computed,
|
||||||
// i.e. point to triangle/line or triangle/line to point, depends on the order
|
// i.e. point to triangle/line or triangle/line to point, depends on the order
|
||||||
@ -93,7 +94,8 @@ __global__ void DistanceForwardKernel(
|
|||||||
points_f3[point_idx],
|
points_f3[point_idx],
|
||||||
face_f3[face_idx],
|
face_f3[face_idx],
|
||||||
face_f3[face_idx + 1],
|
face_f3[face_idx + 1],
|
||||||
face_f3[face_idx + 2]);
|
face_f3[face_idx + 2],
|
||||||
|
min_triangle_area);
|
||||||
} else {
|
} else {
|
||||||
dist = PointLine3DistanceForward(
|
dist = PointLine3DistanceForward(
|
||||||
points_f3[point_idx], face_f3[face_idx], face_f3[face_idx + 1]);
|
points_f3[point_idx], face_f3[face_idx], face_f3[face_idx + 1]);
|
||||||
@ -138,7 +140,8 @@ std::tuple<at::Tensor, at::Tensor> DistanceForwardCuda(
|
|||||||
const at::Tensor& targets,
|
const at::Tensor& targets,
|
||||||
const size_t targets_dim,
|
const size_t targets_dim,
|
||||||
const at::Tensor& targets_first_idx,
|
const at::Tensor& targets_first_idx,
|
||||||
const int64_t max_objects) {
|
const int64_t max_objects,
|
||||||
|
const double min_triangle_area) {
|
||||||
// Check inputs are on the same device
|
// Check inputs are on the same device
|
||||||
at::TensorArg objects_t{objects, "objects", 1},
|
at::TensorArg objects_t{objects, "objects", 1},
|
||||||
objects_first_idx_t{objects_first_idx, "objects_first_idx", 2},
|
objects_first_idx_t{objects_first_idx, "objects_first_idx", 2},
|
||||||
@ -202,7 +205,8 @@ std::tuple<at::Tensor, at::Tensor> DistanceForwardCuda(
|
|||||||
targets_first_idx.contiguous().data_ptr<int64_t>(),
|
targets_first_idx.contiguous().data_ptr<int64_t>(),
|
||||||
batch_size,
|
batch_size,
|
||||||
dists.data_ptr<float>(),
|
dists.data_ptr<float>(),
|
||||||
idxs.data_ptr<int64_t>());
|
idxs.data_ptr<int64_t>(),
|
||||||
|
min_triangle_area);
|
||||||
|
|
||||||
AT_CUDA_CHECK(cudaGetLastError());
|
AT_CUDA_CHECK(cudaGetLastError());
|
||||||
return std::make_tuple(dists, idxs);
|
return std::make_tuple(dists, idxs);
|
||||||
@ -217,7 +221,8 @@ __global__ void DistanceBackwardKernel(
|
|||||||
const int64_t* __restrict__ idx_objects, // (O,)
|
const int64_t* __restrict__ idx_objects, // (O,)
|
||||||
const float* __restrict__ grad_dists, // (O,)
|
const float* __restrict__ grad_dists, // (O,)
|
||||||
float* __restrict__ grad_points, // ((O or T) * 3)
|
float* __restrict__ grad_points, // ((O or T) * 3)
|
||||||
float* __restrict__ grad_face) { // ((O or T) * max(oD, tD) * 3)
|
float* __restrict__ grad_face, // ((O or T) * max(oD, tD) * 3)
|
||||||
|
const double min_triangle_area) {
|
||||||
// This kernel is used interchangeably to compute bi-directional backward
|
// This kernel is used interchangeably to compute bi-directional backward
|
||||||
// distances between points and triangles/lines. The direction of the distance
|
// distances between points and triangles/lines. The direction of the distance
|
||||||
// computed, i.e. point to triangle/line or triangle/line to point, depends on
|
// computed, i.e. point to triangle/line or triangle/line to point, depends on
|
||||||
@ -247,7 +252,8 @@ __global__ void DistanceBackwardKernel(
|
|||||||
face_f3[face_index],
|
face_f3[face_index],
|
||||||
face_f3[face_index + 1],
|
face_f3[face_index + 1],
|
||||||
face_f3[face_index + 2],
|
face_f3[face_index + 2],
|
||||||
grad_dists[o]);
|
grad_dists[o],
|
||||||
|
min_triangle_area);
|
||||||
grad_point = thrust::get<0>(grads);
|
grad_point = thrust::get<0>(grads);
|
||||||
grad_v0 = thrust::get<1>(grads);
|
grad_v0 = thrust::get<1>(grads);
|
||||||
grad_v1 = thrust::get<2>(grads);
|
grad_v1 = thrust::get<2>(grads);
|
||||||
@ -289,7 +295,8 @@ std::tuple<at::Tensor, at::Tensor> DistanceBackwardCuda(
|
|||||||
const at::Tensor& targets,
|
const at::Tensor& targets,
|
||||||
const size_t targets_dim,
|
const size_t targets_dim,
|
||||||
const at::Tensor& idx_objects,
|
const at::Tensor& idx_objects,
|
||||||
const at::Tensor& grad_dists) {
|
const at::Tensor& grad_dists,
|
||||||
|
const double min_triangle_area) {
|
||||||
// Check inputs are on the same device
|
// Check inputs are on the same device
|
||||||
at::TensorArg objects_t{objects, "objects", 1},
|
at::TensorArg objects_t{objects, "objects", 1},
|
||||||
targets_t{targets, "targets", 2},
|
targets_t{targets, "targets", 2},
|
||||||
@ -355,7 +362,8 @@ std::tuple<at::Tensor, at::Tensor> DistanceBackwardCuda(
|
|||||||
idx_objects.contiguous().data_ptr<int64_t>(),
|
idx_objects.contiguous().data_ptr<int64_t>(),
|
||||||
grad_dists.contiguous().data_ptr<float>(),
|
grad_dists.contiguous().data_ptr<float>(),
|
||||||
grad_points.data_ptr<float>(),
|
grad_points.data_ptr<float>(),
|
||||||
grad_tris.data_ptr<float>());
|
grad_tris.data_ptr<float>(),
|
||||||
|
min_triangle_area);
|
||||||
|
|
||||||
AT_CUDA_CHECK(cudaGetLastError());
|
AT_CUDA_CHECK(cudaGetLastError());
|
||||||
return std::make_tuple(grad_points, grad_tris);
|
return std::make_tuple(grad_points, grad_tris);
|
||||||
@ -370,17 +378,27 @@ std::tuple<at::Tensor, at::Tensor> PointFaceDistanceForwardCuda(
|
|||||||
const at::Tensor& points_first_idx,
|
const at::Tensor& points_first_idx,
|
||||||
const at::Tensor& tris,
|
const at::Tensor& tris,
|
||||||
const at::Tensor& tris_first_idx,
|
const at::Tensor& tris_first_idx,
|
||||||
const int64_t max_points) {
|
const int64_t max_points,
|
||||||
|
const double min_triangle_area) {
|
||||||
return DistanceForwardCuda(
|
return DistanceForwardCuda(
|
||||||
points, 1, points_first_idx, tris, 3, tris_first_idx, max_points);
|
points,
|
||||||
|
1,
|
||||||
|
points_first_idx,
|
||||||
|
tris,
|
||||||
|
3,
|
||||||
|
tris_first_idx,
|
||||||
|
max_points,
|
||||||
|
min_triangle_area);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::tuple<at::Tensor, at::Tensor> PointFaceDistanceBackwardCuda(
|
std::tuple<at::Tensor, at::Tensor> PointFaceDistanceBackwardCuda(
|
||||||
const at::Tensor& points,
|
const at::Tensor& points,
|
||||||
const at::Tensor& tris,
|
const at::Tensor& tris,
|
||||||
const at::Tensor& idx_points,
|
const at::Tensor& idx_points,
|
||||||
const at::Tensor& grad_dists) {
|
const at::Tensor& grad_dists,
|
||||||
return DistanceBackwardCuda(points, 1, tris, 3, idx_points, grad_dists);
|
const double min_triangle_area) {
|
||||||
|
return DistanceBackwardCuda(
|
||||||
|
points, 1, tris, 3, idx_points, grad_dists, min_triangle_area);
|
||||||
}
|
}
|
||||||
|
|
||||||
// ****************************************************************************
|
// ****************************************************************************
|
||||||
@ -392,17 +410,27 @@ std::tuple<at::Tensor, at::Tensor> FacePointDistanceForwardCuda(
|
|||||||
const at::Tensor& points_first_idx,
|
const at::Tensor& points_first_idx,
|
||||||
const at::Tensor& tris,
|
const at::Tensor& tris,
|
||||||
const at::Tensor& tris_first_idx,
|
const at::Tensor& tris_first_idx,
|
||||||
const int64_t max_tris) {
|
const int64_t max_tris,
|
||||||
|
const double min_triangle_area) {
|
||||||
return DistanceForwardCuda(
|
return DistanceForwardCuda(
|
||||||
tris, 3, tris_first_idx, points, 1, points_first_idx, max_tris);
|
tris,
|
||||||
|
3,
|
||||||
|
tris_first_idx,
|
||||||
|
points,
|
||||||
|
1,
|
||||||
|
points_first_idx,
|
||||||
|
max_tris,
|
||||||
|
min_triangle_area);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::tuple<at::Tensor, at::Tensor> FacePointDistanceBackwardCuda(
|
std::tuple<at::Tensor, at::Tensor> FacePointDistanceBackwardCuda(
|
||||||
const at::Tensor& points,
|
const at::Tensor& points,
|
||||||
const at::Tensor& tris,
|
const at::Tensor& tris,
|
||||||
const at::Tensor& idx_tris,
|
const at::Tensor& idx_tris,
|
||||||
const at::Tensor& grad_dists) {
|
const at::Tensor& grad_dists,
|
||||||
return DistanceBackwardCuda(tris, 3, points, 1, idx_tris, grad_dists);
|
const double min_triangle_area) {
|
||||||
|
return DistanceBackwardCuda(
|
||||||
|
tris, 3, points, 1, idx_tris, grad_dists, min_triangle_area);
|
||||||
}
|
}
|
||||||
|
|
||||||
// ****************************************************************************
|
// ****************************************************************************
|
||||||
@ -416,7 +444,14 @@ std::tuple<at::Tensor, at::Tensor> PointEdgeDistanceForwardCuda(
|
|||||||
const at::Tensor& segms_first_idx,
|
const at::Tensor& segms_first_idx,
|
||||||
const int64_t max_points) {
|
const int64_t max_points) {
|
||||||
return DistanceForwardCuda(
|
return DistanceForwardCuda(
|
||||||
points, 1, points_first_idx, segms, 2, segms_first_idx, max_points);
|
points,
|
||||||
|
1,
|
||||||
|
points_first_idx,
|
||||||
|
segms,
|
||||||
|
2,
|
||||||
|
segms_first_idx,
|
||||||
|
max_points,
|
||||||
|
1); // todo: unused parameter handling for min_triangle_area
|
||||||
}
|
}
|
||||||
|
|
||||||
std::tuple<at::Tensor, at::Tensor> PointEdgeDistanceBackwardCuda(
|
std::tuple<at::Tensor, at::Tensor> PointEdgeDistanceBackwardCuda(
|
||||||
@ -424,7 +459,7 @@ std::tuple<at::Tensor, at::Tensor> PointEdgeDistanceBackwardCuda(
|
|||||||
const at::Tensor& segms,
|
const at::Tensor& segms,
|
||||||
const at::Tensor& idx_points,
|
const at::Tensor& idx_points,
|
||||||
const at::Tensor& grad_dists) {
|
const at::Tensor& grad_dists) {
|
||||||
return DistanceBackwardCuda(points, 1, segms, 2, idx_points, grad_dists);
|
return DistanceBackwardCuda(points, 1, segms, 2, idx_points, grad_dists, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
// ****************************************************************************
|
// ****************************************************************************
|
||||||
@ -438,7 +473,7 @@ std::tuple<at::Tensor, at::Tensor> EdgePointDistanceForwardCuda(
|
|||||||
const at::Tensor& segms_first_idx,
|
const at::Tensor& segms_first_idx,
|
||||||
const int64_t max_segms) {
|
const int64_t max_segms) {
|
||||||
return DistanceForwardCuda(
|
return DistanceForwardCuda(
|
||||||
segms, 2, segms_first_idx, points, 1, points_first_idx, max_segms);
|
segms, 2, segms_first_idx, points, 1, points_first_idx, max_segms, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::tuple<at::Tensor, at::Tensor> EdgePointDistanceBackwardCuda(
|
std::tuple<at::Tensor, at::Tensor> EdgePointDistanceBackwardCuda(
|
||||||
@ -446,7 +481,7 @@ std::tuple<at::Tensor, at::Tensor> EdgePointDistanceBackwardCuda(
|
|||||||
const at::Tensor& segms,
|
const at::Tensor& segms,
|
||||||
const at::Tensor& idx_segms,
|
const at::Tensor& idx_segms,
|
||||||
const at::Tensor& grad_dists) {
|
const at::Tensor& grad_dists) {
|
||||||
return DistanceBackwardCuda(segms, 2, points, 1, idx_segms, grad_dists);
|
return DistanceBackwardCuda(segms, 2, points, 1, idx_segms, grad_dists, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
// ****************************************************************************
|
// ****************************************************************************
|
||||||
@ -459,7 +494,8 @@ __global__ void PointFaceArrayForwardKernel(
|
|||||||
const float* __restrict__ tris, // (T, 3, 3)
|
const float* __restrict__ tris, // (T, 3, 3)
|
||||||
float* __restrict__ dists, // (P, T)
|
float* __restrict__ dists, // (P, T)
|
||||||
const size_t P,
|
const size_t P,
|
||||||
const size_t T) {
|
const size_t T,
|
||||||
|
const double min_triangle_area) {
|
||||||
const float3* points_f3 = (float3*)points;
|
const float3* points_f3 = (float3*)points;
|
||||||
const float3* tris_f3 = (float3*)tris;
|
const float3* tris_f3 = (float3*)tris;
|
||||||
|
|
||||||
@ -475,14 +511,16 @@ __global__ void PointFaceArrayForwardKernel(
|
|||||||
const float3 v2 = tris_f3[t * 3 + 2];
|
const float3 v2 = tris_f3[t * 3 + 2];
|
||||||
|
|
||||||
const float3 point = points_f3[p];
|
const float3 point = points_f3[p];
|
||||||
float dist = PointTriangle3DistanceForward(point, v0, v1, v2);
|
float dist =
|
||||||
|
PointTriangle3DistanceForward(point, v0, v1, v2, min_triangle_area);
|
||||||
dists[p * T + t] = dist;
|
dists[p * T + t] = dist;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
at::Tensor PointFaceArrayDistanceForwardCuda(
|
at::Tensor PointFaceArrayDistanceForwardCuda(
|
||||||
const at::Tensor& points,
|
const at::Tensor& points,
|
||||||
const at::Tensor& tris) {
|
const at::Tensor& tris,
|
||||||
|
const double min_triangle_area) {
|
||||||
// Check inputs are on the same device
|
// Check inputs are on the same device
|
||||||
at::TensorArg points_t{points, "points", 1}, tris_t{tris, "tris", 2};
|
at::TensorArg points_t{points, "points", 1}, tris_t{tris, "tris", 2};
|
||||||
at::CheckedFrom c = "PointFaceArrayDistanceForwardCuda";
|
at::CheckedFrom c = "PointFaceArrayDistanceForwardCuda";
|
||||||
@ -516,7 +554,8 @@ at::Tensor PointFaceArrayDistanceForwardCuda(
|
|||||||
tris.contiguous().data_ptr<float>(),
|
tris.contiguous().data_ptr<float>(),
|
||||||
dists.data_ptr<float>(),
|
dists.data_ptr<float>(),
|
||||||
P,
|
P,
|
||||||
T);
|
T,
|
||||||
|
min_triangle_area);
|
||||||
|
|
||||||
AT_CUDA_CHECK(cudaGetLastError());
|
AT_CUDA_CHECK(cudaGetLastError());
|
||||||
return dists;
|
return dists;
|
||||||
@ -529,7 +568,8 @@ __global__ void PointFaceArrayBackwardKernel(
|
|||||||
float* __restrict__ grad_points, // (P, 3)
|
float* __restrict__ grad_points, // (P, 3)
|
||||||
float* __restrict__ grad_tris, // (T, 3, 3)
|
float* __restrict__ grad_tris, // (T, 3, 3)
|
||||||
const size_t P,
|
const size_t P,
|
||||||
const size_t T) {
|
const size_t T,
|
||||||
|
const double min_triangle_area) {
|
||||||
const float3* points_f3 = (float3*)points;
|
const float3* points_f3 = (float3*)points;
|
||||||
const float3* tris_f3 = (float3*)tris;
|
const float3* tris_f3 = (float3*)tris;
|
||||||
|
|
||||||
@ -547,8 +587,8 @@ __global__ void PointFaceArrayBackwardKernel(
|
|||||||
const float3 point = points_f3[p];
|
const float3 point = points_f3[p];
|
||||||
|
|
||||||
const float grad_dist = grad_dists[p * T + t];
|
const float grad_dist = grad_dists[p * T + t];
|
||||||
const auto grad =
|
const auto grad = PointTriangle3DistanceBackward(
|
||||||
PointTriangle3DistanceBackward(point, v0, v1, v2, grad_dist);
|
point, v0, v1, v2, grad_dist, min_triangle_area);
|
||||||
|
|
||||||
const float3 grad_point = thrust::get<0>(grad);
|
const float3 grad_point = thrust::get<0>(grad);
|
||||||
const float3 grad_v0 = thrust::get<1>(grad);
|
const float3 grad_v0 = thrust::get<1>(grad);
|
||||||
@ -576,7 +616,8 @@ __global__ void PointFaceArrayBackwardKernel(
|
|||||||
std::tuple<at::Tensor, at::Tensor> PointFaceArrayDistanceBackwardCuda(
|
std::tuple<at::Tensor, at::Tensor> PointFaceArrayDistanceBackwardCuda(
|
||||||
const at::Tensor& points,
|
const at::Tensor& points,
|
||||||
const at::Tensor& tris,
|
const at::Tensor& tris,
|
||||||
const at::Tensor& grad_dists) {
|
const at::Tensor& grad_dists,
|
||||||
|
const double min_triangle_area) {
|
||||||
// Check inputs are on the same device
|
// Check inputs are on the same device
|
||||||
at::TensorArg points_t{points, "points", 1}, tris_t{tris, "tris", 2},
|
at::TensorArg points_t{points, "points", 1}, tris_t{tris, "tris", 2},
|
||||||
grad_dists_t{grad_dists, "grad_dists", 3};
|
grad_dists_t{grad_dists, "grad_dists", 3};
|
||||||
@ -615,7 +656,8 @@ std::tuple<at::Tensor, at::Tensor> PointFaceArrayDistanceBackwardCuda(
|
|||||||
grad_points.data_ptr<float>(),
|
grad_points.data_ptr<float>(),
|
||||||
grad_tris.data_ptr<float>(),
|
grad_tris.data_ptr<float>(),
|
||||||
P,
|
P,
|
||||||
T);
|
T,
|
||||||
|
min_triangle_area);
|
||||||
|
|
||||||
AT_CUDA_CHECK(cudaGetLastError());
|
AT_CUDA_CHECK(cudaGetLastError());
|
||||||
return std::make_tuple(grad_points, grad_tris);
|
return std::make_tuple(grad_points, grad_tris);
|
||||||
|
@ -31,6 +31,8 @@
|
|||||||
// max_points: Scalar equal to max(P_i) for i in [0, N - 1] containing
|
// max_points: Scalar equal to max(P_i) for i in [0, N - 1] containing
|
||||||
// the maximum number of points in the batch and is used to set
|
// the maximum number of points in the batch and is used to set
|
||||||
// the block dimensions in the CUDA implementation.
|
// the block dimensions in the CUDA implementation.
|
||||||
|
// min_triangle_area: triangles less than this size are considered
|
||||||
|
// points/lines.
|
||||||
//
|
//
|
||||||
// Returns:
|
// Returns:
|
||||||
// dists: FloatTensor of shape (P,), where dists[p] is the minimum
|
// dists: FloatTensor of shape (P,), where dists[p] is the minimum
|
||||||
@ -51,21 +53,24 @@ std::tuple<torch::Tensor, torch::Tensor> PointFaceDistanceForwardCuda(
|
|||||||
const torch::Tensor& points_first_idx,
|
const torch::Tensor& points_first_idx,
|
||||||
const torch::Tensor& tris,
|
const torch::Tensor& tris,
|
||||||
const torch::Tensor& tris_first_idx,
|
const torch::Tensor& tris_first_idx,
|
||||||
const int64_t max_points);
|
const int64_t max_points,
|
||||||
|
const double min_triangle_area);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
std::tuple<torch::Tensor, torch::Tensor> PointFaceDistanceForwardCpu(
|
std::tuple<torch::Tensor, torch::Tensor> PointFaceDistanceForwardCpu(
|
||||||
const torch::Tensor& points,
|
const torch::Tensor& points,
|
||||||
const torch::Tensor& points_first_idx,
|
const torch::Tensor& points_first_idx,
|
||||||
const torch::Tensor& tris,
|
const torch::Tensor& tris,
|
||||||
const torch::Tensor& tris_first_idx);
|
const torch::Tensor& tris_first_idx,
|
||||||
|
const double min_triangle_area);
|
||||||
|
|
||||||
std::tuple<torch::Tensor, torch::Tensor> PointFaceDistanceForward(
|
std::tuple<torch::Tensor, torch::Tensor> PointFaceDistanceForward(
|
||||||
const torch::Tensor& points,
|
const torch::Tensor& points,
|
||||||
const torch::Tensor& points_first_idx,
|
const torch::Tensor& points_first_idx,
|
||||||
const torch::Tensor& tris,
|
const torch::Tensor& tris,
|
||||||
const torch::Tensor& tris_first_idx,
|
const torch::Tensor& tris_first_idx,
|
||||||
const int64_t max_points) {
|
const int64_t max_points,
|
||||||
|
const double min_triangle_area) {
|
||||||
if (points.is_cuda()) {
|
if (points.is_cuda()) {
|
||||||
#ifdef WITH_CUDA
|
#ifdef WITH_CUDA
|
||||||
CHECK_CUDA(points);
|
CHECK_CUDA(points);
|
||||||
@ -73,13 +78,18 @@ std::tuple<torch::Tensor, torch::Tensor> PointFaceDistanceForward(
|
|||||||
CHECK_CUDA(tris);
|
CHECK_CUDA(tris);
|
||||||
CHECK_CUDA(tris_first_idx);
|
CHECK_CUDA(tris_first_idx);
|
||||||
return PointFaceDistanceForwardCuda(
|
return PointFaceDistanceForwardCuda(
|
||||||
points, points_first_idx, tris, tris_first_idx, max_points);
|
points,
|
||||||
|
points_first_idx,
|
||||||
|
tris,
|
||||||
|
tris_first_idx,
|
||||||
|
max_points,
|
||||||
|
min_triangle_area);
|
||||||
#else
|
#else
|
||||||
AT_ERROR("Not compiled with GPU support.");
|
AT_ERROR("Not compiled with GPU support.");
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
return PointFaceDistanceForwardCpu(
|
return PointFaceDistanceForwardCpu(
|
||||||
points, points_first_idx, tris, tris_first_idx);
|
points, points_first_idx, tris, tris_first_idx, min_triangle_area);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Backward pass for PointFaceDistance.
|
// Backward pass for PointFaceDistance.
|
||||||
@ -91,6 +101,8 @@ std::tuple<torch::Tensor, torch::Tensor> PointFaceDistanceForward(
|
|||||||
// of the closest face in the example in the batch.
|
// of the closest face in the example in the batch.
|
||||||
// This is computed by the forward pass
|
// This is computed by the forward pass
|
||||||
// grad_dists: FloatTensor of shape (P,)
|
// grad_dists: FloatTensor of shape (P,)
|
||||||
|
// min_triangle_area: triangles less than this size are considered
|
||||||
|
// points/lines.
|
||||||
//
|
//
|
||||||
// Returns:
|
// Returns:
|
||||||
// grad_points: FloatTensor of shape (P, 3)
|
// grad_points: FloatTensor of shape (P, 3)
|
||||||
@ -103,31 +115,36 @@ std::tuple<torch::Tensor, torch::Tensor> PointFaceDistanceBackwardCuda(
|
|||||||
const torch::Tensor& points,
|
const torch::Tensor& points,
|
||||||
const torch::Tensor& tris,
|
const torch::Tensor& tris,
|
||||||
const torch::Tensor& idx_points,
|
const torch::Tensor& idx_points,
|
||||||
const torch::Tensor& grad_dists);
|
const torch::Tensor& grad_dists,
|
||||||
|
const double min_triangle_area);
|
||||||
#endif
|
#endif
|
||||||
std::tuple<torch::Tensor, torch::Tensor> PointFaceDistanceBackwardCpu(
|
std::tuple<torch::Tensor, torch::Tensor> PointFaceDistanceBackwardCpu(
|
||||||
const torch::Tensor& points,
|
const torch::Tensor& points,
|
||||||
const torch::Tensor& tris,
|
const torch::Tensor& tris,
|
||||||
const torch::Tensor& idx_points,
|
const torch::Tensor& idx_points,
|
||||||
const torch::Tensor& grad_dists);
|
const torch::Tensor& grad_dists,
|
||||||
|
const double min_triangle_area);
|
||||||
|
|
||||||
std::tuple<torch::Tensor, torch::Tensor> PointFaceDistanceBackward(
|
std::tuple<torch::Tensor, torch::Tensor> PointFaceDistanceBackward(
|
||||||
const torch::Tensor& points,
|
const torch::Tensor& points,
|
||||||
const torch::Tensor& tris,
|
const torch::Tensor& tris,
|
||||||
const torch::Tensor& idx_points,
|
const torch::Tensor& idx_points,
|
||||||
const torch::Tensor& grad_dists) {
|
const torch::Tensor& grad_dists,
|
||||||
|
const double min_triangle_area) {
|
||||||
if (points.is_cuda()) {
|
if (points.is_cuda()) {
|
||||||
#ifdef WITH_CUDA
|
#ifdef WITH_CUDA
|
||||||
CHECK_CUDA(points);
|
CHECK_CUDA(points);
|
||||||
CHECK_CUDA(tris);
|
CHECK_CUDA(tris);
|
||||||
CHECK_CUDA(idx_points);
|
CHECK_CUDA(idx_points);
|
||||||
CHECK_CUDA(grad_dists);
|
CHECK_CUDA(grad_dists);
|
||||||
return PointFaceDistanceBackwardCuda(points, tris, idx_points, grad_dists);
|
return PointFaceDistanceBackwardCuda(
|
||||||
|
points, tris, idx_points, grad_dists, min_triangle_area);
|
||||||
#else
|
#else
|
||||||
AT_ERROR("Not compiled with GPU support.");
|
AT_ERROR("Not compiled with GPU support.");
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
return PointFaceDistanceBackwardCpu(points, tris, idx_points, grad_dists);
|
return PointFaceDistanceBackwardCpu(
|
||||||
|
points, tris, idx_points, grad_dists, min_triangle_area);
|
||||||
}
|
}
|
||||||
|
|
||||||
// ****************************************************************************
|
// ****************************************************************************
|
||||||
@ -148,6 +165,8 @@ std::tuple<torch::Tensor, torch::Tensor> PointFaceDistanceBackward(
|
|||||||
// max_tris: Scalar equal to max(T_i) for i in [0, N - 1] containing
|
// max_tris: Scalar equal to max(T_i) for i in [0, N - 1] containing
|
||||||
// the maximum number of faces in the batch and is used to set
|
// the maximum number of faces in the batch and is used to set
|
||||||
// the block dimensions in the CUDA implementation.
|
// the block dimensions in the CUDA implementation.
|
||||||
|
// min_triangle_area: triangles less than this size are considered
|
||||||
|
// points/lines.
|
||||||
//
|
//
|
||||||
// Returns:
|
// Returns:
|
||||||
// dists: FloatTensor of shape (T,), where dists[t] is the minimum squared
|
// dists: FloatTensor of shape (T,), where dists[t] is the minimum squared
|
||||||
@ -167,21 +186,24 @@ std::tuple<torch::Tensor, torch::Tensor> FacePointDistanceForwardCuda(
|
|||||||
const torch::Tensor& points_first_idx,
|
const torch::Tensor& points_first_idx,
|
||||||
const torch::Tensor& tris,
|
const torch::Tensor& tris,
|
||||||
const torch::Tensor& tris_first_idx,
|
const torch::Tensor& tris_first_idx,
|
||||||
const int64_t max_tris);
|
const int64_t max_tris,
|
||||||
|
const double min_triangle_area);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
std::tuple<torch::Tensor, torch::Tensor> FacePointDistanceForwardCpu(
|
std::tuple<torch::Tensor, torch::Tensor> FacePointDistanceForwardCpu(
|
||||||
const torch::Tensor& points,
|
const torch::Tensor& points,
|
||||||
const torch::Tensor& points_first_idx,
|
const torch::Tensor& points_first_idx,
|
||||||
const torch::Tensor& tris,
|
const torch::Tensor& tris,
|
||||||
const torch::Tensor& tris_first_idx);
|
const torch::Tensor& tris_first_idx,
|
||||||
|
const double min_triangle_area);
|
||||||
|
|
||||||
std::tuple<torch::Tensor, torch::Tensor> FacePointDistanceForward(
|
std::tuple<torch::Tensor, torch::Tensor> FacePointDistanceForward(
|
||||||
const torch::Tensor& points,
|
const torch::Tensor& points,
|
||||||
const torch::Tensor& points_first_idx,
|
const torch::Tensor& points_first_idx,
|
||||||
const torch::Tensor& tris,
|
const torch::Tensor& tris,
|
||||||
const torch::Tensor& tris_first_idx,
|
const torch::Tensor& tris_first_idx,
|
||||||
const int64_t max_tris) {
|
const int64_t max_tris,
|
||||||
|
const double min_triangle_area) {
|
||||||
if (points.is_cuda()) {
|
if (points.is_cuda()) {
|
||||||
#ifdef WITH_CUDA
|
#ifdef WITH_CUDA
|
||||||
CHECK_CUDA(points);
|
CHECK_CUDA(points);
|
||||||
@ -189,13 +211,18 @@ std::tuple<torch::Tensor, torch::Tensor> FacePointDistanceForward(
|
|||||||
CHECK_CUDA(tris);
|
CHECK_CUDA(tris);
|
||||||
CHECK_CUDA(tris_first_idx);
|
CHECK_CUDA(tris_first_idx);
|
||||||
return FacePointDistanceForwardCuda(
|
return FacePointDistanceForwardCuda(
|
||||||
points, points_first_idx, tris, tris_first_idx, max_tris);
|
points,
|
||||||
|
points_first_idx,
|
||||||
|
tris,
|
||||||
|
tris_first_idx,
|
||||||
|
max_tris,
|
||||||
|
min_triangle_area);
|
||||||
#else
|
#else
|
||||||
AT_ERROR("Not compiled with GPU support.");
|
AT_ERROR("Not compiled with GPU support.");
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
return FacePointDistanceForwardCpu(
|
return FacePointDistanceForwardCpu(
|
||||||
points, points_first_idx, tris, tris_first_idx);
|
points, points_first_idx, tris, tris_first_idx, min_triangle_area);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Backward pass for FacePointDistance.
|
// Backward pass for FacePointDistance.
|
||||||
@ -207,6 +234,8 @@ std::tuple<torch::Tensor, torch::Tensor> FacePointDistanceForward(
|
|||||||
// of the closest point in the example in the batch.
|
// of the closest point in the example in the batch.
|
||||||
// This is computed by the forward pass
|
// This is computed by the forward pass
|
||||||
// grad_dists: FloatTensor of shape (T,)
|
// grad_dists: FloatTensor of shape (T,)
|
||||||
|
// min_triangle_area: triangles less than this size are considered
|
||||||
|
// points/lines.
|
||||||
//
|
//
|
||||||
// Returns:
|
// Returns:
|
||||||
// grad_points: FloatTensor of shape (P, 3)
|
// grad_points: FloatTensor of shape (P, 3)
|
||||||
@ -219,32 +248,37 @@ std::tuple<torch::Tensor, torch::Tensor> FacePointDistanceBackwardCuda(
|
|||||||
const torch::Tensor& points,
|
const torch::Tensor& points,
|
||||||
const torch::Tensor& tris,
|
const torch::Tensor& tris,
|
||||||
const torch::Tensor& idx_tris,
|
const torch::Tensor& idx_tris,
|
||||||
const torch::Tensor& grad_dists);
|
const torch::Tensor& grad_dists,
|
||||||
|
const double min_triangle_area);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
std::tuple<torch::Tensor, torch::Tensor> FacePointDistanceBackwardCpu(
|
std::tuple<torch::Tensor, torch::Tensor> FacePointDistanceBackwardCpu(
|
||||||
const torch::Tensor& points,
|
const torch::Tensor& points,
|
||||||
const torch::Tensor& tris,
|
const torch::Tensor& tris,
|
||||||
const torch::Tensor& idx_tris,
|
const torch::Tensor& idx_tris,
|
||||||
const torch::Tensor& grad_dists);
|
const torch::Tensor& grad_dists,
|
||||||
|
const double min_triangle_area);
|
||||||
|
|
||||||
std::tuple<torch::Tensor, torch::Tensor> FacePointDistanceBackward(
|
std::tuple<torch::Tensor, torch::Tensor> FacePointDistanceBackward(
|
||||||
const torch::Tensor& points,
|
const torch::Tensor& points,
|
||||||
const torch::Tensor& tris,
|
const torch::Tensor& tris,
|
||||||
const torch::Tensor& idx_tris,
|
const torch::Tensor& idx_tris,
|
||||||
const torch::Tensor& grad_dists) {
|
const torch::Tensor& grad_dists,
|
||||||
|
const double min_triangle_area) {
|
||||||
if (points.is_cuda()) {
|
if (points.is_cuda()) {
|
||||||
#ifdef WITH_CUDA
|
#ifdef WITH_CUDA
|
||||||
CHECK_CUDA(points);
|
CHECK_CUDA(points);
|
||||||
CHECK_CUDA(tris);
|
CHECK_CUDA(tris);
|
||||||
CHECK_CUDA(idx_tris);
|
CHECK_CUDA(idx_tris);
|
||||||
CHECK_CUDA(grad_dists);
|
CHECK_CUDA(grad_dists);
|
||||||
return FacePointDistanceBackwardCuda(points, tris, idx_tris, grad_dists);
|
return FacePointDistanceBackwardCuda(
|
||||||
|
points, tris, idx_tris, grad_dists, min_triangle_area);
|
||||||
#else
|
#else
|
||||||
AT_ERROR("Not compiled with GPU support.");
|
AT_ERROR("Not compiled with GPU support.");
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
return FacePointDistanceBackwardCpu(points, tris, idx_tris, grad_dists);
|
return FacePointDistanceBackwardCpu(
|
||||||
|
points, tris, idx_tris, grad_dists, min_triangle_area);
|
||||||
}
|
}
|
||||||
|
|
||||||
// ****************************************************************************
|
// ****************************************************************************
|
||||||
@ -494,6 +528,8 @@ std::tuple<torch::Tensor, torch::Tensor> EdgePointDistanceBackward(
|
|||||||
// points: FloatTensor of shape (P, 3)
|
// points: FloatTensor of shape (P, 3)
|
||||||
// tris: FloatTensor of shape (T, 3, 3) of the triangular faces. The t-th
|
// tris: FloatTensor of shape (T, 3, 3) of the triangular faces. The t-th
|
||||||
// triangular face is spanned by (tris[t, 0], tris[t, 1], tris[t, 2])
|
// triangular face is spanned by (tris[t, 0], tris[t, 1], tris[t, 2])
|
||||||
|
// min_triangle_area: triangles less than this size are considered
|
||||||
|
// points/lines.
|
||||||
//
|
//
|
||||||
// Returns:
|
// Returns:
|
||||||
// dists: FloatTensor of shape (P, T), where dists[p, t] is the squared
|
// dists: FloatTensor of shape (P, T), where dists[p, t] is the squared
|
||||||
@ -509,26 +545,29 @@ std::tuple<torch::Tensor, torch::Tensor> EdgePointDistanceBackward(
|
|||||||
|
|
||||||
torch::Tensor PointFaceArrayDistanceForwardCuda(
|
torch::Tensor PointFaceArrayDistanceForwardCuda(
|
||||||
const torch::Tensor& points,
|
const torch::Tensor& points,
|
||||||
const torch::Tensor& tris);
|
const torch::Tensor& tris,
|
||||||
|
const double min_triangle_area);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
torch::Tensor PointFaceArrayDistanceForwardCpu(
|
torch::Tensor PointFaceArrayDistanceForwardCpu(
|
||||||
const torch::Tensor& points,
|
const torch::Tensor& points,
|
||||||
const torch::Tensor& tris);
|
const torch::Tensor& tris,
|
||||||
|
const double min_triangle_area);
|
||||||
|
|
||||||
torch::Tensor PointFaceArrayDistanceForward(
|
torch::Tensor PointFaceArrayDistanceForward(
|
||||||
const torch::Tensor& points,
|
const torch::Tensor& points,
|
||||||
const torch::Tensor& tris) {
|
const torch::Tensor& tris,
|
||||||
|
const double min_triangle_area) {
|
||||||
if (points.is_cuda()) {
|
if (points.is_cuda()) {
|
||||||
#ifdef WITH_CUDA
|
#ifdef WITH_CUDA
|
||||||
CHECK_CUDA(points);
|
CHECK_CUDA(points);
|
||||||
CHECK_CUDA(tris);
|
CHECK_CUDA(tris);
|
||||||
return PointFaceArrayDistanceForwardCuda(points, tris);
|
return PointFaceArrayDistanceForwardCuda(points, tris, min_triangle_area);
|
||||||
#else
|
#else
|
||||||
AT_ERROR("Not compiled with GPU support.");
|
AT_ERROR("Not compiled with GPU support.");
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
return PointFaceArrayDistanceForwardCpu(points, tris);
|
return PointFaceArrayDistanceForwardCpu(points, tris, min_triangle_area);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Backward pass for PointFaceArrayDistance.
|
// Backward pass for PointFaceArrayDistance.
|
||||||
@ -537,6 +576,8 @@ torch::Tensor PointFaceArrayDistanceForward(
|
|||||||
// points: FloatTensor of shape (P, 3)
|
// points: FloatTensor of shape (P, 3)
|
||||||
// tris: FloatTensor of shape (T, 3, 3)
|
// tris: FloatTensor of shape (T, 3, 3)
|
||||||
// grad_dists: FloatTensor of shape (P, T)
|
// grad_dists: FloatTensor of shape (P, T)
|
||||||
|
// min_triangle_area: triangles less than this size are considered
|
||||||
|
// points/lines.
|
||||||
//
|
//
|
||||||
// Returns:
|
// Returns:
|
||||||
// grad_points: FloatTensor of shape (P, 3)
|
// grad_points: FloatTensor of shape (P, 3)
|
||||||
@ -547,28 +588,33 @@ torch::Tensor PointFaceArrayDistanceForward(
|
|||||||
std::tuple<torch::Tensor, torch::Tensor> PointFaceArrayDistanceBackwardCuda(
|
std::tuple<torch::Tensor, torch::Tensor> PointFaceArrayDistanceBackwardCuda(
|
||||||
const torch::Tensor& points,
|
const torch::Tensor& points,
|
||||||
const torch::Tensor& tris,
|
const torch::Tensor& tris,
|
||||||
const torch::Tensor& grad_dists);
|
const torch::Tensor& grad_dists,
|
||||||
|
const double min_triangle_area);
|
||||||
#endif
|
#endif
|
||||||
std::tuple<torch::Tensor, torch::Tensor> PointFaceArrayDistanceBackwardCpu(
|
std::tuple<torch::Tensor, torch::Tensor> PointFaceArrayDistanceBackwardCpu(
|
||||||
const torch::Tensor& points,
|
const torch::Tensor& points,
|
||||||
const torch::Tensor& tris,
|
const torch::Tensor& tris,
|
||||||
const torch::Tensor& grad_dists);
|
const torch::Tensor& grad_dists,
|
||||||
|
const double min_triangle_area);
|
||||||
|
|
||||||
std::tuple<torch::Tensor, torch::Tensor> PointFaceArrayDistanceBackward(
|
std::tuple<torch::Tensor, torch::Tensor> PointFaceArrayDistanceBackward(
|
||||||
const torch::Tensor& points,
|
const torch::Tensor& points,
|
||||||
const torch::Tensor& tris,
|
const torch::Tensor& tris,
|
||||||
const torch::Tensor& grad_dists) {
|
const torch::Tensor& grad_dists,
|
||||||
|
const double min_triangle_area) {
|
||||||
if (points.is_cuda()) {
|
if (points.is_cuda()) {
|
||||||
#ifdef WITH_CUDA
|
#ifdef WITH_CUDA
|
||||||
CHECK_CUDA(points);
|
CHECK_CUDA(points);
|
||||||
CHECK_CUDA(tris);
|
CHECK_CUDA(tris);
|
||||||
CHECK_CUDA(grad_dists);
|
CHECK_CUDA(grad_dists);
|
||||||
return PointFaceArrayDistanceBackwardCuda(points, tris, grad_dists);
|
return PointFaceArrayDistanceBackwardCuda(
|
||||||
|
points, tris, grad_dists, min_triangle_area);
|
||||||
#else
|
#else
|
||||||
AT_ERROR("Not compiled with GPU support.");
|
AT_ERROR("Not compiled with GPU support.");
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
return PointFaceArrayDistanceBackwardCpu(points, tris, grad_dists);
|
return PointFaceArrayDistanceBackwardCpu(
|
||||||
|
points, tris, grad_dists, min_triangle_area);
|
||||||
}
|
}
|
||||||
|
|
||||||
// ****************************************************************************
|
// ****************************************************************************
|
||||||
|
@ -540,6 +540,8 @@ __device__ inline float3 BarycentricCoords3Forward(
|
|||||||
// Args:
|
// Args:
|
||||||
// p: vec3 coordinates of a point
|
// p: vec3 coordinates of a point
|
||||||
// v0, v1, v2: vec3 coordinates of the triangle vertices
|
// v0, v1, v2: vec3 coordinates of the triangle vertices
|
||||||
|
// min_triangle_area: triangles less than this size are considered
|
||||||
|
// points/lines, IsInsideTriangle returns False
|
||||||
//
|
//
|
||||||
// Returns:
|
// Returns:
|
||||||
// inside: bool indicating wether p is inside triangle
|
// inside: bool indicating wether p is inside triangle
|
||||||
@ -548,9 +550,10 @@ __device__ inline bool IsInsideTriangle(
|
|||||||
const float3& p,
|
const float3& p,
|
||||||
const float3& v0,
|
const float3& v0,
|
||||||
const float3& v1,
|
const float3& v1,
|
||||||
const float3& v2) {
|
const float3& v2,
|
||||||
|
const double min_triangle_area) {
|
||||||
bool inside;
|
bool inside;
|
||||||
if (AreaOfTriangle(v0, v1, v2) < 5e-3) {
|
if (AreaOfTriangle(v0, v1, v2) < min_triangle_area) {
|
||||||
inside = 0;
|
inside = 0;
|
||||||
} else {
|
} else {
|
||||||
float3 bary = BarycentricCoords3Forward(p, v0, v1, v2);
|
float3 bary = BarycentricCoords3Forward(p, v0, v1, v2);
|
||||||
@ -660,6 +663,8 @@ PointLine3DistanceBackward(
|
|||||||
// Args:
|
// Args:
|
||||||
// p: vec3 coordinates of a point
|
// p: vec3 coordinates of a point
|
||||||
// v0, v1, v2: vec3 coordinates of the triangle vertices
|
// v0, v1, v2: vec3 coordinates of the triangle vertices
|
||||||
|
// min_triangle_area: triangles less than this size are considered
|
||||||
|
// points/lines, IsInsideTriangle returns False
|
||||||
//
|
//
|
||||||
// Returns:
|
// Returns:
|
||||||
// dist: Float of the squared distance
|
// dist: Float of the squared distance
|
||||||
@ -669,7 +674,8 @@ __device__ inline float PointTriangle3DistanceForward(
|
|||||||
const float3& p,
|
const float3& p,
|
||||||
const float3& v0,
|
const float3& v0,
|
||||||
const float3& v1,
|
const float3& v1,
|
||||||
const float3& v2) {
|
const float3& v2,
|
||||||
|
const double min_triangle_area) {
|
||||||
float3 normal = cross(v2 - v0, v1 - v0);
|
float3 normal = cross(v2 - v0, v1 - v0);
|
||||||
const float norm_normal = norm(normal);
|
const float norm_normal = norm(normal);
|
||||||
normal = normalize(normal);
|
normal = normalize(normal);
|
||||||
@ -679,7 +685,7 @@ __device__ inline float PointTriangle3DistanceForward(
|
|||||||
const float t = dot(v0 - p, normal);
|
const float t = dot(v0 - p, normal);
|
||||||
const float3 p0 = p + t * normal;
|
const float3 p0 = p + t * normal;
|
||||||
|
|
||||||
bool is_inside = IsInsideTriangle(p0, v0, v1, v2);
|
bool is_inside = IsInsideTriangle(p0, v0, v1, v2, min_triangle_area);
|
||||||
float dist = 0.0f;
|
float dist = 0.0f;
|
||||||
|
|
||||||
if ((is_inside) && (norm_normal > kEpsilon)) {
|
if ((is_inside) && (norm_normal > kEpsilon)) {
|
||||||
@ -705,6 +711,8 @@ __device__ inline float PointTriangle3DistanceForward(
|
|||||||
// p: xyz coordinates of a point
|
// p: xyz coordinates of a point
|
||||||
// v0, v1, v2: xyz coordinates of the triangle vertices
|
// v0, v1, v2: xyz coordinates of the triangle vertices
|
||||||
// grad_dist: Float of the gradient wrt dist
|
// grad_dist: Float of the gradient wrt dist
|
||||||
|
// min_triangle_area: triangles less than this size are considered
|
||||||
|
// points/lines, IsInsideTriangle returns False
|
||||||
//
|
//
|
||||||
// Returns:
|
// Returns:
|
||||||
// tuple of gradients for the point and triangle:
|
// tuple of gradients for the point and triangle:
|
||||||
@ -717,7 +725,8 @@ PointTriangle3DistanceBackward(
|
|||||||
const float3& v0,
|
const float3& v0,
|
||||||
const float3& v1,
|
const float3& v1,
|
||||||
const float3& v2,
|
const float3& v2,
|
||||||
const float& grad_dist) {
|
const float& grad_dist,
|
||||||
|
const double min_triangle_area) {
|
||||||
const float3 v2v0 = v2 - v0;
|
const float3 v2v0 = v2 - v0;
|
||||||
const float3 v1v0 = v1 - v0;
|
const float3 v1v0 = v1 - v0;
|
||||||
const float3 v0p = v0 - p;
|
const float3 v0p = v0 - p;
|
||||||
@ -731,7 +740,7 @@ PointTriangle3DistanceBackward(
|
|||||||
const float3 p0 = p + t * normal;
|
const float3 p0 = p + t * normal;
|
||||||
const float3 diff = t * normal;
|
const float3 diff = t * normal;
|
||||||
|
|
||||||
bool is_inside = IsInsideTriangle(p0, v0, v1, v2);
|
bool is_inside = IsInsideTriangle(p0, v0, v1, v2, min_triangle_area);
|
||||||
|
|
||||||
float3 grad_p = make_float3(0.0f, 0.0f, 0.0f);
|
float3 grad_p = make_float3(0.0f, 0.0f, 0.0f);
|
||||||
float3 grad_v0 = make_float3(0.0f, 0.0f, 0.0f);
|
float3 grad_v0 = make_float3(0.0f, 0.0f, 0.0f);
|
||||||
|
@ -640,6 +640,8 @@ vec3<T> BarycentricCoords3Forward(
|
|||||||
// Args:
|
// Args:
|
||||||
// p: vec3 coordinates of a point
|
// p: vec3 coordinates of a point
|
||||||
// v0, v1, v2: vec3 coordinates of the triangle vertices
|
// v0, v1, v2: vec3 coordinates of the triangle vertices
|
||||||
|
// min_triangle_area: triangles less than this size are considered
|
||||||
|
// points/lines, IsInsideTriangle returns False
|
||||||
//
|
//
|
||||||
// Returns:
|
// Returns:
|
||||||
// inside: bool indicating wether p is inside triangle
|
// inside: bool indicating wether p is inside triangle
|
||||||
@ -649,9 +651,10 @@ static bool IsInsideTriangle(
|
|||||||
const vec3<T>& p,
|
const vec3<T>& p,
|
||||||
const vec3<T>& v0,
|
const vec3<T>& v0,
|
||||||
const vec3<T>& v1,
|
const vec3<T>& v1,
|
||||||
const vec3<T>& v2) {
|
const vec3<T>& v2,
|
||||||
|
const double min_triangle_area) {
|
||||||
bool inside;
|
bool inside;
|
||||||
if (AreaOfTriangle(v0, v1, v2) < 5e-3) {
|
if (AreaOfTriangle(v0, v1, v2) < min_triangle_area) {
|
||||||
inside = 0;
|
inside = 0;
|
||||||
} else {
|
} else {
|
||||||
vec3<T> bary = BarycentricCoords3Forward(p, v0, v1, v2);
|
vec3<T> bary = BarycentricCoords3Forward(p, v0, v1, v2);
|
||||||
@ -668,7 +671,8 @@ T PointTriangle3DistanceForward(
|
|||||||
const vec3<T>& p,
|
const vec3<T>& p,
|
||||||
const vec3<T>& v0,
|
const vec3<T>& v0,
|
||||||
const vec3<T>& v1,
|
const vec3<T>& v1,
|
||||||
const vec3<T>& v2) {
|
const vec3<T>& v2,
|
||||||
|
const double min_triangle_area) {
|
||||||
vec3<T> normal = cross(v2 - v0, v1 - v0);
|
vec3<T> normal = cross(v2 - v0, v1 - v0);
|
||||||
const T norm_normal = norm(normal);
|
const T norm_normal = norm(normal);
|
||||||
normal = normal / (norm_normal + vEpsilon);
|
normal = normal / (norm_normal + vEpsilon);
|
||||||
@ -678,7 +682,7 @@ T PointTriangle3DistanceForward(
|
|||||||
const T t = dot(v0 - p, normal);
|
const T t = dot(v0 - p, normal);
|
||||||
const vec3<T> p0 = p + t * normal;
|
const vec3<T> p0 = p + t * normal;
|
||||||
|
|
||||||
bool is_inside = IsInsideTriangle(p0, v0, v1, v2);
|
bool is_inside = IsInsideTriangle(p0, v0, v1, v2, min_triangle_area);
|
||||||
T dist = 0.0f;
|
T dist = 0.0f;
|
||||||
|
|
||||||
if ((is_inside) && (norm_normal > kEpsilon)) {
|
if ((is_inside) && (norm_normal > kEpsilon)) {
|
||||||
@ -737,6 +741,8 @@ vec3<T> normalize_backward(const vec3<T>& a, const vec3<T>& grad_normz) {
|
|||||||
// p: xyz coordinates of a point
|
// p: xyz coordinates of a point
|
||||||
// v0, v1, v2: xyz coordinates of the triangle vertices
|
// v0, v1, v2: xyz coordinates of the triangle vertices
|
||||||
// grad_dist: Float of the gradient wrt dist
|
// grad_dist: Float of the gradient wrt dist
|
||||||
|
// min_triangle_area: triangles less than this size are considered
|
||||||
|
// points/lines, IsInsideTriangle returns False
|
||||||
//
|
//
|
||||||
// Returns:
|
// Returns:
|
||||||
// tuple of gradients for the point and triangle:
|
// tuple of gradients for the point and triangle:
|
||||||
@ -750,7 +756,8 @@ PointTriangle3DistanceBackward(
|
|||||||
const vec3<T>& v0,
|
const vec3<T>& v0,
|
||||||
const vec3<T>& v1,
|
const vec3<T>& v1,
|
||||||
const vec3<T>& v2,
|
const vec3<T>& v2,
|
||||||
const T& grad_dist) {
|
const T& grad_dist,
|
||||||
|
const double min_triangle_area) {
|
||||||
const vec3<T> v2v0 = v2 - v0;
|
const vec3<T> v2v0 = v2 - v0;
|
||||||
const vec3<T> v1v0 = v1 - v0;
|
const vec3<T> v1v0 = v1 - v0;
|
||||||
const vec3<T> v0p = v0 - p;
|
const vec3<T> v0p = v0 - p;
|
||||||
@ -764,7 +771,7 @@ PointTriangle3DistanceBackward(
|
|||||||
const vec3<T> p0 = p + t * normal;
|
const vec3<T> p0 = p + t * normal;
|
||||||
const vec3<T> diff = t * normal;
|
const vec3<T> diff = t * normal;
|
||||||
|
|
||||||
bool is_inside = IsInsideTriangle(p0, v0, v1, v2);
|
bool is_inside = IsInsideTriangle(p0, v0, v1, v2, min_triangle_area);
|
||||||
|
|
||||||
vec3<T> grad_p(0.0f, 0.0f, 0.0f);
|
vec3<T> grad_p(0.0f, 0.0f, 0.0f);
|
||||||
vec3<T> grad_v0(0.0f, 0.0f, 0.0f);
|
vec3<T> grad_v0(0.0f, 0.0f, 0.0f);
|
||||||
|
@ -19,6 +19,8 @@ The exact mathematical formulations and implementations of these
|
|||||||
distances can be found in `csrc/utils/geometry_utils.cuh`.
|
distances can be found in `csrc/utils/geometry_utils.cuh`.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
_DEFAULT_MIN_TRIANGLE_AREA: float = 5e-3
|
||||||
|
|
||||||
|
|
||||||
# PointFaceDistance
|
# PointFaceDistance
|
||||||
class _PointFaceDistance(Function):
|
class _PointFaceDistance(Function):
|
||||||
@ -27,7 +29,15 @@ class _PointFaceDistance(Function):
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def forward(ctx, points, points_first_idx, tris, tris_first_idx, max_points):
|
def forward(
|
||||||
|
ctx,
|
||||||
|
points,
|
||||||
|
points_first_idx,
|
||||||
|
tris,
|
||||||
|
tris_first_idx,
|
||||||
|
max_points,
|
||||||
|
min_triangle_area=_DEFAULT_MIN_TRIANGLE_AREA,
|
||||||
|
):
|
||||||
"""
|
"""
|
||||||
Args:
|
Args:
|
||||||
ctx: Context object used to calculate gradients.
|
ctx: Context object used to calculate gradients.
|
||||||
@ -39,6 +49,8 @@ class _PointFaceDistance(Function):
|
|||||||
tris_first_idx: LongTensor of shape `(N,)` indicating the first face
|
tris_first_idx: LongTensor of shape `(N,)` indicating the first face
|
||||||
index in each example in the batch
|
index in each example in the batch
|
||||||
max_points: Scalar equal to maximum number of points in the batch
|
max_points: Scalar equal to maximum number of points in the batch
|
||||||
|
min_triangle_area: (float, defaulted) Triangles of area less than this
|
||||||
|
will be treated as points/lines.
|
||||||
Returns:
|
Returns:
|
||||||
dists: FloatTensor of shape `(P,)`, where `dists[p]` is the squared
|
dists: FloatTensor of shape `(P,)`, where `dists[p]` is the squared
|
||||||
euclidean distance of `p`-th point to the closest triangular face
|
euclidean distance of `p`-th point to the closest triangular face
|
||||||
@ -53,9 +65,15 @@ class _PointFaceDistance(Function):
|
|||||||
|
|
||||||
"""
|
"""
|
||||||
dists, idxs = _C.point_face_dist_forward(
|
dists, idxs = _C.point_face_dist_forward(
|
||||||
points, points_first_idx, tris, tris_first_idx, max_points
|
points,
|
||||||
|
points_first_idx,
|
||||||
|
tris,
|
||||||
|
tris_first_idx,
|
||||||
|
max_points,
|
||||||
|
min_triangle_area,
|
||||||
)
|
)
|
||||||
ctx.save_for_backward(points, tris, idxs)
|
ctx.save_for_backward(points, tris, idxs)
|
||||||
|
ctx.min_triangle_area = min_triangle_area
|
||||||
return dists
|
return dists
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
@ -63,10 +81,11 @@ class _PointFaceDistance(Function):
|
|||||||
def backward(ctx, grad_dists):
|
def backward(ctx, grad_dists):
|
||||||
grad_dists = grad_dists.contiguous()
|
grad_dists = grad_dists.contiguous()
|
||||||
points, tris, idxs = ctx.saved_tensors
|
points, tris, idxs = ctx.saved_tensors
|
||||||
|
min_triangle_area = ctx.min_triangle_area
|
||||||
grad_points, grad_tris = _C.point_face_dist_backward(
|
grad_points, grad_tris = _C.point_face_dist_backward(
|
||||||
points, tris, idxs, grad_dists
|
points, tris, idxs, grad_dists, min_triangle_area
|
||||||
)
|
)
|
||||||
return grad_points, None, grad_tris, None, None
|
return grad_points, None, grad_tris, None, None, None
|
||||||
|
|
||||||
|
|
||||||
# pyre-fixme[16]: `_PointFaceDistance` has no attribute `apply`.
|
# pyre-fixme[16]: `_PointFaceDistance` has no attribute `apply`.
|
||||||
@ -80,7 +99,15 @@ class _FacePointDistance(Function):
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def forward(ctx, points, points_first_idx, tris, tris_first_idx, max_tris):
|
def forward(
|
||||||
|
ctx,
|
||||||
|
points,
|
||||||
|
points_first_idx,
|
||||||
|
tris,
|
||||||
|
tris_first_idx,
|
||||||
|
max_tris,
|
||||||
|
min_triangle_area=_DEFAULT_MIN_TRIANGLE_AREA,
|
||||||
|
):
|
||||||
"""
|
"""
|
||||||
Args:
|
Args:
|
||||||
ctx: Context object used to calculate gradients.
|
ctx: Context object used to calculate gradients.
|
||||||
@ -92,6 +119,8 @@ class _FacePointDistance(Function):
|
|||||||
tris_first_idx: LongTensor of shape `(N,)` indicating the first face
|
tris_first_idx: LongTensor of shape `(N,)` indicating the first face
|
||||||
index in each example in the batch
|
index in each example in the batch
|
||||||
max_tris: Scalar equal to maximum number of faces in the batch
|
max_tris: Scalar equal to maximum number of faces in the batch
|
||||||
|
min_triangle_area: (float, defaulted) Triangles of area less than this
|
||||||
|
will be treated as points/lines.
|
||||||
Returns:
|
Returns:
|
||||||
dists: FloatTensor of shape `(T,)`, where `dists[t]` is the squared
|
dists: FloatTensor of shape `(T,)`, where `dists[t]` is the squared
|
||||||
euclidean distance of `t`-th triangular face to the closest point in the
|
euclidean distance of `t`-th triangular face to the closest point in the
|
||||||
@ -104,9 +133,10 @@ class _FacePointDistance(Function):
|
|||||||
face `(v0, v1, v2)`.
|
face `(v0, v1, v2)`.
|
||||||
"""
|
"""
|
||||||
dists, idxs = _C.face_point_dist_forward(
|
dists, idxs = _C.face_point_dist_forward(
|
||||||
points, points_first_idx, tris, tris_first_idx, max_tris
|
points, points_first_idx, tris, tris_first_idx, max_tris, min_triangle_area
|
||||||
)
|
)
|
||||||
ctx.save_for_backward(points, tris, idxs)
|
ctx.save_for_backward(points, tris, idxs)
|
||||||
|
ctx.min_triangle_area = min_triangle_area
|
||||||
return dists
|
return dists
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
@ -114,10 +144,11 @@ class _FacePointDistance(Function):
|
|||||||
def backward(ctx, grad_dists):
|
def backward(ctx, grad_dists):
|
||||||
grad_dists = grad_dists.contiguous()
|
grad_dists = grad_dists.contiguous()
|
||||||
points, tris, idxs = ctx.saved_tensors
|
points, tris, idxs = ctx.saved_tensors
|
||||||
|
min_triangle_area = ctx.min_triangle_area
|
||||||
grad_points, grad_tris = _C.face_point_dist_backward(
|
grad_points, grad_tris = _C.face_point_dist_backward(
|
||||||
points, tris, idxs, grad_dists
|
points, tris, idxs, grad_dists, min_triangle_area
|
||||||
)
|
)
|
||||||
return grad_points, None, grad_tris, None, None
|
return grad_points, None, grad_tris, None, None, None
|
||||||
|
|
||||||
|
|
||||||
# pyre-fixme[16]: `_FacePointDistance` has no attribute `apply`.
|
# pyre-fixme[16]: `_FacePointDistance` has no attribute `apply`.
|
||||||
@ -293,7 +324,11 @@ def point_mesh_edge_distance(meshes: Meshes, pcls: Pointclouds):
|
|||||||
return point_dist + edge_dist
|
return point_dist + edge_dist
|
||||||
|
|
||||||
|
|
||||||
def point_mesh_face_distance(meshes: Meshes, pcls: Pointclouds):
|
def point_mesh_face_distance(
|
||||||
|
meshes: Meshes,
|
||||||
|
pcls: Pointclouds,
|
||||||
|
min_triangle_area: float = _DEFAULT_MIN_TRIANGLE_AREA,
|
||||||
|
):
|
||||||
"""
|
"""
|
||||||
Computes the distance between a pointcloud and a mesh within a batch.
|
Computes the distance between a pointcloud and a mesh within a batch.
|
||||||
Given a pair `(mesh, pcl)` in the batch, we define the distance to be the
|
Given a pair `(mesh, pcl)` in the batch, we define the distance to be the
|
||||||
@ -310,6 +345,8 @@ def point_mesh_face_distance(meshes: Meshes, pcls: Pointclouds):
|
|||||||
Args:
|
Args:
|
||||||
meshes: A Meshes data structure containing N meshes
|
meshes: A Meshes data structure containing N meshes
|
||||||
pcls: A Pointclouds data structure containing N pointclouds
|
pcls: A Pointclouds data structure containing N pointclouds
|
||||||
|
min_triangle_area: (float, defaulted) Triangles of area less than this
|
||||||
|
will be treated as points/lines.
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
loss: The `point_face(mesh, pcl) + face_point(mesh, pcl)` distance
|
loss: The `point_face(mesh, pcl) + face_point(mesh, pcl)` distance
|
||||||
@ -334,7 +371,7 @@ def point_mesh_face_distance(meshes: Meshes, pcls: Pointclouds):
|
|||||||
|
|
||||||
# point to face distance: shape (P,)
|
# point to face distance: shape (P,)
|
||||||
point_to_face = point_face_distance(
|
point_to_face = point_face_distance(
|
||||||
points, points_first_idx, tris, tris_first_idx, max_points
|
points, points_first_idx, tris, tris_first_idx, max_points, min_triangle_area
|
||||||
)
|
)
|
||||||
|
|
||||||
# weight each example by the inverse of number of points in the example
|
# weight each example by the inverse of number of points in the example
|
||||||
@ -347,7 +384,7 @@ def point_mesh_face_distance(meshes: Meshes, pcls: Pointclouds):
|
|||||||
|
|
||||||
# face to point distance: shape (T,)
|
# face to point distance: shape (T,)
|
||||||
face_to_point = face_point_distance(
|
face_to_point = face_point_distance(
|
||||||
points, points_first_idx, tris, tris_first_idx, max_tris
|
points, points_first_idx, tris, tris_first_idx, max_tris, min_triangle_area
|
||||||
)
|
)
|
||||||
|
|
||||||
# weight each example by the inverse of number of faces in the example
|
# weight each example by the inverse of number of faces in the example
|
||||||
|
@ -23,6 +23,10 @@ class TestPointMeshDistance(TestCaseMixin, unittest.TestCase):
|
|||||||
def eps():
|
def eps():
|
||||||
return 1e-8
|
return 1e-8
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def min_triangle_area():
|
||||||
|
return 5e-3
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def init_meshes_clouds(
|
def init_meshes_clouds(
|
||||||
batch_size: int = 10,
|
batch_size: int = 10,
|
||||||
@ -563,8 +567,12 @@ class TestPointMeshDistance(TestCaseMixin, unittest.TestCase):
|
|||||||
grad_tris_naive = tris.grad.cpu()
|
grad_tris_naive = tris.grad.cpu()
|
||||||
|
|
||||||
# Cuda Forward Implementation
|
# Cuda Forward Implementation
|
||||||
dists_cuda = _C.point_face_array_dist_forward(points, tris)
|
dists_cuda = _C.point_face_array_dist_forward(
|
||||||
dists_cpu = _C.point_face_array_dist_forward(points_cpu, tris_cpu)
|
points, tris, TestPointMeshDistance.min_triangle_area()
|
||||||
|
)
|
||||||
|
dists_cpu = _C.point_face_array_dist_forward(
|
||||||
|
points_cpu, tris_cpu, TestPointMeshDistance.min_triangle_area()
|
||||||
|
)
|
||||||
|
|
||||||
# Compare
|
# Compare
|
||||||
self.assertClose(dists_naive.cpu(), dists_cuda.cpu())
|
self.assertClose(dists_naive.cpu(), dists_cuda.cpu())
|
||||||
@ -572,10 +580,13 @@ class TestPointMeshDistance(TestCaseMixin, unittest.TestCase):
|
|||||||
|
|
||||||
# CUDA Backward Implementation
|
# CUDA Backward Implementation
|
||||||
grad_points_cuda, grad_tris_cuda = _C.point_face_array_dist_backward(
|
grad_points_cuda, grad_tris_cuda = _C.point_face_array_dist_backward(
|
||||||
points, tris, grad_dists
|
points, tris, grad_dists, TestPointMeshDistance.min_triangle_area()
|
||||||
)
|
)
|
||||||
grad_points_cpu, grad_tris_cpu = _C.point_face_array_dist_backward(
|
grad_points_cpu, grad_tris_cpu = _C.point_face_array_dist_backward(
|
||||||
points_cpu, tris_cpu, grad_dists.cpu()
|
points_cpu,
|
||||||
|
tris_cpu,
|
||||||
|
grad_dists.cpu(),
|
||||||
|
TestPointMeshDistance.min_triangle_area(),
|
||||||
)
|
)
|
||||||
|
|
||||||
# Compare
|
# Compare
|
||||||
@ -615,12 +626,21 @@ class TestPointMeshDistance(TestCaseMixin, unittest.TestCase):
|
|||||||
|
|
||||||
# Cuda Implementation: forward
|
# Cuda Implementation: forward
|
||||||
dists_cuda, idx_cuda = _C.point_face_dist_forward(
|
dists_cuda, idx_cuda = _C.point_face_dist_forward(
|
||||||
points_packed, points_first_idx, faces_packed, faces_first_idx, max_p
|
points_packed,
|
||||||
|
points_first_idx,
|
||||||
|
faces_packed,
|
||||||
|
faces_first_idx,
|
||||||
|
max_p,
|
||||||
|
TestPointMeshDistance.min_triangle_area(),
|
||||||
)
|
)
|
||||||
|
|
||||||
# Cuda Implementation: backward
|
# Cuda Implementation: backward
|
||||||
grad_points_cuda, grad_faces_cuda = _C.point_face_dist_backward(
|
grad_points_cuda, grad_faces_cuda = _C.point_face_dist_backward(
|
||||||
points_packed, faces_packed, idx_cuda, grad_dists
|
points_packed,
|
||||||
|
faces_packed,
|
||||||
|
idx_cuda,
|
||||||
|
grad_dists,
|
||||||
|
TestPointMeshDistance.min_triangle_area(),
|
||||||
)
|
)
|
||||||
|
|
||||||
# Cpu Implementation: forward
|
# Cpu Implementation: forward
|
||||||
@ -630,12 +650,17 @@ class TestPointMeshDistance(TestCaseMixin, unittest.TestCase):
|
|||||||
faces_packed.cpu(),
|
faces_packed.cpu(),
|
||||||
faces_first_idx.cpu(),
|
faces_first_idx.cpu(),
|
||||||
max_p,
|
max_p,
|
||||||
|
TestPointMeshDistance.min_triangle_area(),
|
||||||
)
|
)
|
||||||
|
|
||||||
# Cpu Implementation: backward
|
# Cpu Implementation: backward
|
||||||
# Note that using idx_cpu doesn't pass - there seems to be a problem with tied results.
|
# Note that using idx_cpu doesn't pass - there seems to be a problem with tied results.
|
||||||
grad_points_cpu, grad_faces_cpu = _C.point_face_dist_backward(
|
grad_points_cpu, grad_faces_cpu = _C.point_face_dist_backward(
|
||||||
points_packed.cpu(), faces_packed.cpu(), idx_cuda.cpu(), grad_dists.cpu()
|
points_packed.cpu(),
|
||||||
|
faces_packed.cpu(),
|
||||||
|
idx_cuda.cpu(),
|
||||||
|
grad_dists.cpu(),
|
||||||
|
TestPointMeshDistance.min_triangle_area(),
|
||||||
)
|
)
|
||||||
|
|
||||||
# Naive Implementation: forward
|
# Naive Implementation: forward
|
||||||
@ -716,12 +741,21 @@ class TestPointMeshDistance(TestCaseMixin, unittest.TestCase):
|
|||||||
|
|
||||||
# Cuda Implementation: forward
|
# Cuda Implementation: forward
|
||||||
dists_cuda, idx_cuda = _C.face_point_dist_forward(
|
dists_cuda, idx_cuda = _C.face_point_dist_forward(
|
||||||
points_packed, points_first_idx, faces_packed, faces_first_idx, max_f
|
points_packed,
|
||||||
|
points_first_idx,
|
||||||
|
faces_packed,
|
||||||
|
faces_first_idx,
|
||||||
|
max_f,
|
||||||
|
TestPointMeshDistance.min_triangle_area(),
|
||||||
)
|
)
|
||||||
|
|
||||||
# Cuda Implementation: backward
|
# Cuda Implementation: backward
|
||||||
grad_points_cuda, grad_faces_cuda = _C.face_point_dist_backward(
|
grad_points_cuda, grad_faces_cuda = _C.face_point_dist_backward(
|
||||||
points_packed, faces_packed, idx_cuda, grad_dists
|
points_packed,
|
||||||
|
faces_packed,
|
||||||
|
idx_cuda,
|
||||||
|
grad_dists,
|
||||||
|
TestPointMeshDistance.min_triangle_area(),
|
||||||
)
|
)
|
||||||
|
|
||||||
# Cpu Implementation: forward
|
# Cpu Implementation: forward
|
||||||
@ -731,11 +765,16 @@ class TestPointMeshDistance(TestCaseMixin, unittest.TestCase):
|
|||||||
faces_packed.cpu(),
|
faces_packed.cpu(),
|
||||||
faces_first_idx.cpu(),
|
faces_first_idx.cpu(),
|
||||||
max_f,
|
max_f,
|
||||||
|
TestPointMeshDistance.min_triangle_area(),
|
||||||
)
|
)
|
||||||
|
|
||||||
# Cpu Implementation: backward
|
# Cpu Implementation: backward
|
||||||
grad_points_cpu, grad_faces_cpu = _C.face_point_dist_backward(
|
grad_points_cpu, grad_faces_cpu = _C.face_point_dist_backward(
|
||||||
points_packed.cpu(), faces_packed.cpu(), idx_cpu, grad_dists.cpu()
|
points_packed.cpu(),
|
||||||
|
faces_packed.cpu(),
|
||||||
|
idx_cpu,
|
||||||
|
grad_dists.cpu(),
|
||||||
|
TestPointMeshDistance.min_triangle_area(),
|
||||||
)
|
)
|
||||||
|
|
||||||
# Naive Implementation: forward
|
# Naive Implementation: forward
|
||||||
|
Loading…
x
Reference in New Issue
Block a user